Delete FoodComponent, migrate prototypes to EdibleComponent (#41070)
* yml * yml fixes * cs * document regression * comment * organs fix * diona consistency * push --------- Co-authored-by: iaada <iaada@users.noreply.github.com> Co-authored-by: Princess Cheeseballs <66055347+Pronana@users.noreply.github.com>
This commit is contained in:
@@ -34,8 +34,8 @@ public sealed class CrayonSystem : SharedCrayonSystem
|
||||
SubscribeLocalEvent<CrayonComponent, MapInitEvent>(OnMapInit);
|
||||
SubscribeLocalEvent<CrayonComponent, CrayonSelectMessage>(OnCrayonBoundUI);
|
||||
SubscribeLocalEvent<CrayonComponent, CrayonColorMessage>(OnCrayonBoundUIColor);
|
||||
SubscribeLocalEvent<CrayonComponent, UseInHandEvent>(OnCrayonUse, before: new[] { typeof(FoodSystem) });
|
||||
SubscribeLocalEvent<CrayonComponent, AfterInteractEvent>(OnCrayonAfterInteract, after: new[] { typeof(FoodSystem) });
|
||||
SubscribeLocalEvent<CrayonComponent, UseInHandEvent>(OnCrayonUse);
|
||||
SubscribeLocalEvent<CrayonComponent, AfterInteractEvent>(OnCrayonAfterInteract, after: [typeof(IngestionSystem)]);
|
||||
SubscribeLocalEvent<CrayonComponent, DroppedEvent>(OnCrayonDropped);
|
||||
}
|
||||
|
||||
@@ -47,6 +47,7 @@ public sealed class CrayonSystem : SharedCrayonSystem
|
||||
Dirty(ent);
|
||||
}
|
||||
|
||||
// Runs after IngestionSystem so it doesn't bulldoze force-feeding
|
||||
private void OnCrayonAfterInteract(EntityUid uid, CrayonComponent component, AfterInteractEvent args)
|
||||
{
|
||||
if (args.Handled || !args.CanReach)
|
||||
|
||||
@@ -6,7 +6,5 @@ namespace Content.Server.Nutrition.Components;
|
||||
/// This component prevents NPC mobs like mice from wanting to eat something that is edible but is not exactly food.
|
||||
/// Including but not limited to: uranium, death pills, insulation
|
||||
/// </summary>
|
||||
[RegisterComponent, Access(typeof(FoodSystem))]
|
||||
public sealed partial class BadFoodComponent : Component
|
||||
{
|
||||
}
|
||||
[RegisterComponent]
|
||||
public sealed partial class BadFoodComponent : Component;
|
||||
|
||||
@@ -6,7 +6,5 @@ namespace Content.Server.Nutrition.Components;
|
||||
/// This component allows NPC mobs to eat food with BadFoodComponent.
|
||||
/// See MobMouseAdmeme for usage.
|
||||
/// </summary>
|
||||
[RegisterComponent, Access(typeof(FoodSystem))]
|
||||
public sealed partial class IgnoreBadFoodComponent : Component
|
||||
{
|
||||
}
|
||||
[RegisterComponent]
|
||||
public sealed partial class IgnoreBadFoodComponent : Component;
|
||||
|
||||
@@ -33,8 +33,6 @@ namespace Content.Server.Nutrition.EntitySystems
|
||||
{
|
||||
base.Initialize();
|
||||
|
||||
// activate BEFORE entity is deleted and trash is spawned
|
||||
SubscribeLocalEvent<CreamPieComponent, ConsumeDoAfterEvent>(OnConsume, before: [typeof(FoodSystem)]);
|
||||
SubscribeLocalEvent<CreamPieComponent, SliceFoodEvent>(OnSlice);
|
||||
|
||||
SubscribeLocalEvent<CreamPiedComponent, RejuvenateEvent>(OnRejuvenate);
|
||||
@@ -59,10 +57,10 @@ namespace Content.Server.Nutrition.EntitySystems
|
||||
QueueDel(entity);
|
||||
}
|
||||
|
||||
private void OnConsume(Entity<CreamPieComponent> entity, ref ConsumeDoAfterEvent args)
|
||||
{
|
||||
ActivatePayload(entity);
|
||||
}
|
||||
// TODO
|
||||
// A regression occured here. Previously creampies would activate their hidden payload if you tried to eat them.
|
||||
// However, the refactor to IngestionSystem caused the event to not be reached,
|
||||
// because eating is blocked if an item is inside the food.
|
||||
|
||||
private void OnSlice(Entity<CreamPieComponent> entity, ref SliceFoodEvent args)
|
||||
{
|
||||
|
||||
@@ -8,7 +8,7 @@ using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom;
|
||||
|
||||
namespace Content.Shared.Body.Components
|
||||
{
|
||||
[RegisterComponent, NetworkedComponent, Access(typeof(StomachSystem), typeof(FoodSystem))]
|
||||
[RegisterComponent, NetworkedComponent, Access(typeof(StomachSystem))]
|
||||
public sealed partial class StomachComponent : Component
|
||||
{
|
||||
/// <summary>
|
||||
|
||||
@@ -1,69 +0,0 @@
|
||||
using Content.Shared.Body.Components;
|
||||
using Content.Shared.FixedPoint;
|
||||
using Content.Shared.Nutrition.EntitySystems;
|
||||
using Robust.Shared.Audio;
|
||||
using Robust.Shared.Prototypes;
|
||||
|
||||
namespace Content.Shared.Nutrition.Components;
|
||||
[Obsolete("Migration to Content.Shared.Nutrition.Components.EdibleComponent is required")]
|
||||
[RegisterComponent, Access(typeof(FoodSystem), typeof(FoodSequenceSystem))]
|
||||
public sealed partial class FoodComponent : Component
|
||||
{
|
||||
[DataField]
|
||||
public string Solution = "food";
|
||||
|
||||
[DataField]
|
||||
public SoundSpecifier UseSound = new SoundCollectionSpecifier("eating");
|
||||
|
||||
[DataField]
|
||||
public List<EntProtoId> Trash = new();
|
||||
|
||||
[DataField]
|
||||
public FixedPoint2? TransferAmount = FixedPoint2.New(5);
|
||||
|
||||
/// <summary>
|
||||
/// Acceptable utensil to use
|
||||
/// </summary>
|
||||
[DataField]
|
||||
public UtensilType Utensil = UtensilType.Fork; //There are more "solid" than "liquid" food
|
||||
|
||||
/// <summary>
|
||||
/// Is utensil required to eat this food
|
||||
/// </summary>
|
||||
[DataField]
|
||||
public bool UtensilRequired;
|
||||
|
||||
/// <summary>
|
||||
/// If this is set to true, food can only be eaten if you have a stomach with a
|
||||
/// <see cref="StomachComponent.SpecialDigestible"/> that includes this entity in its whitelist,
|
||||
/// rather than just being digestible by anything that can eat food.
|
||||
/// Whitelist the food component to allow eating of normal food.
|
||||
/// </summary>
|
||||
[DataField]
|
||||
public bool RequiresSpecialDigestion;
|
||||
|
||||
/// <summary>
|
||||
/// The localization identifier for the eat message. Needs a "food" entity argument passed to it.
|
||||
/// </summary>
|
||||
[DataField]
|
||||
public LocId EatMessage = "edible-nom";
|
||||
|
||||
/// <summary>
|
||||
/// How long it takes to eat the food personally.
|
||||
/// </summary>
|
||||
[DataField]
|
||||
public float Delay = 1;
|
||||
|
||||
/// <summary>
|
||||
/// This is how many seconds it takes to force feed someone this food.
|
||||
/// Should probably be smaller for small items like pills.
|
||||
/// </summary>
|
||||
[DataField]
|
||||
public float ForceFeedDelay = 3;
|
||||
|
||||
/// <summary>
|
||||
/// For mobs that are food, requires killing them before eating.
|
||||
/// </summary>
|
||||
[DataField, ViewVariables(VVAccess.ReadWrite)]
|
||||
public bool RequireDead = true;
|
||||
}
|
||||
@@ -1,253 +0,0 @@
|
||||
using Content.Shared.Administration.Logs;
|
||||
using Content.Shared.Chemistry.EntitySystems;
|
||||
using Content.Shared.Database;
|
||||
using Content.Shared.Forensics;
|
||||
using Content.Shared.Hands.EntitySystems;
|
||||
using Content.Shared.IdentityManagement;
|
||||
using Content.Shared.Interaction;
|
||||
using Content.Shared.Interaction.Events;
|
||||
using Content.Shared.Inventory;
|
||||
using Content.Shared.Mobs.Systems;
|
||||
using Content.Shared.Nutrition.Components;
|
||||
using Content.Shared.Popups;
|
||||
using Content.Shared.Verbs;
|
||||
using Robust.Shared.Audio;
|
||||
using Robust.Shared.Audio.Systems;
|
||||
|
||||
namespace Content.Shared.Nutrition.EntitySystems;
|
||||
|
||||
/// <summary>
|
||||
/// Handles feeding attempts both on yourself and on the target.
|
||||
/// </summary>
|
||||
[Obsolete("Migration to Content.Shared.Nutrition.EntitySystems.IngestionSystem is required")]
|
||||
public sealed class FoodSystem : EntitySystem
|
||||
{
|
||||
[Dependency] private readonly FlavorProfileSystem _flavorProfile = default!;
|
||||
[Dependency] private readonly IngestionSystem _ingestion = default!;
|
||||
[Dependency] private readonly ISharedAdminLogManager _adminLogger = default!;
|
||||
[Dependency] private readonly MobStateSystem _mobState = default!;
|
||||
[Dependency] private readonly SharedPopupSystem _popup = default!;
|
||||
[Dependency] private readonly SharedAudioSystem _audio = default!;
|
||||
[Dependency] private readonly SharedHandsSystem _hands = default!;
|
||||
[Dependency] private readonly SharedSolutionContainerSystem _solutionContainer = default!;
|
||||
[Dependency] private readonly SharedTransformSystem _transform = default!;
|
||||
|
||||
public const float MaxFeedDistance = 1.0f;
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
base.Initialize();
|
||||
|
||||
SubscribeLocalEvent<FoodComponent, UseInHandEvent>(OnUseFoodInHand, after: new[] { typeof(OpenableSystem), typeof(InventorySystem) });
|
||||
SubscribeLocalEvent<FoodComponent, AfterInteractEvent>(OnFeedFood);
|
||||
|
||||
SubscribeLocalEvent<FoodComponent, GetVerbsEvent<AlternativeVerb>>(AddEatVerb);
|
||||
|
||||
SubscribeLocalEvent<FoodComponent, BeforeIngestedEvent>(OnBeforeFoodEaten);
|
||||
SubscribeLocalEvent<FoodComponent, IngestedEvent>(OnFoodEaten);
|
||||
SubscribeLocalEvent<FoodComponent, FullyEatenEvent>(OnFoodFullyEaten);
|
||||
|
||||
SubscribeLocalEvent<FoodComponent, GetUtensilsEvent>(OnGetUtensils);
|
||||
|
||||
SubscribeLocalEvent<FoodComponent, IsDigestibleEvent>(OnIsFoodDigestible);
|
||||
|
||||
SubscribeLocalEvent<FoodComponent, EdibleEvent>(OnFood);
|
||||
|
||||
SubscribeLocalEvent<FoodComponent, GetEdibleTypeEvent>(OnGetEdibleType);
|
||||
|
||||
SubscribeLocalEvent<FoodComponent, BeforeFullySlicedEvent>(OnBeforeFullySliced);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Eat or drink an item
|
||||
/// </summary>
|
||||
private void OnUseFoodInHand(Entity<FoodComponent> entity, ref UseInHandEvent ev)
|
||||
{
|
||||
if (ev.Handled)
|
||||
return;
|
||||
|
||||
ev.Handled = _ingestion.TryIngest(ev.User, ev.User, entity);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Feed someone else
|
||||
/// </summary>
|
||||
private void OnFeedFood(Entity<FoodComponent> entity, ref AfterInteractEvent args)
|
||||
{
|
||||
if (args.Handled || args.Target == null || !args.CanReach)
|
||||
return;
|
||||
|
||||
args.Handled = _ingestion.TryIngest(args.User, args.Target.Value, entity);
|
||||
}
|
||||
|
||||
private void AddEatVerb(Entity<FoodComponent> entity, ref GetVerbsEvent<AlternativeVerb> args)
|
||||
{
|
||||
var user = args.User;
|
||||
|
||||
if (entity.Owner == user || !args.CanInteract || !args.CanAccess)
|
||||
return;
|
||||
|
||||
if (!_ingestion.TryGetIngestionVerb(user, entity, IngestionSystem.Food, out var verb))
|
||||
return;
|
||||
|
||||
args.Verbs.Add(verb);
|
||||
}
|
||||
|
||||
private void OnBeforeFoodEaten(Entity<FoodComponent> food, ref BeforeIngestedEvent args)
|
||||
{
|
||||
if (args.Cancelled || args.Solution is not { } solution)
|
||||
return;
|
||||
|
||||
// Set it to transfer amount if it exists, otherwise eat the whole volume if possible.
|
||||
args.Transfer = food.Comp.TransferAmount ?? solution.Volume;
|
||||
}
|
||||
|
||||
private void OnFoodEaten(Entity<FoodComponent> entity, ref IngestedEvent args)
|
||||
{
|
||||
if (args.Handled)
|
||||
return;
|
||||
|
||||
args.Handled = true;
|
||||
|
||||
_audio.PlayPredicted(entity.Comp.UseSound, args.Target, args.User, AudioParams.Default.WithVolume(-1f).WithVariation(0.20f));
|
||||
|
||||
var flavors = _flavorProfile.GetLocalizedFlavorsMessage(entity.Owner, args.Target, args.Split);
|
||||
|
||||
if (args.ForceFed)
|
||||
{
|
||||
var targetName = Identity.Entity(args.Target, EntityManager);
|
||||
var userName = Identity.Entity(args.User, EntityManager);
|
||||
_popup.PopupEntity(Loc.GetString("edible-force-feed-success", ("user", userName), ("verb", _ingestion.GetProtoVerb(IngestionSystem.Food)), ("flavors", flavors)), entity, entity);
|
||||
|
||||
_popup.PopupClient(Loc.GetString("edible-force-feed-success-user", ("target", targetName), ("verb", _ingestion.GetProtoVerb(IngestionSystem.Food))), args.User, args.User);
|
||||
|
||||
// log successful forced feeding
|
||||
_adminLogger.Add(LogType.ForceFeed, LogImpact.Medium, $"{ToPrettyString(entity):user} forced {ToPrettyString(args.User):target} to eat {ToPrettyString(entity):food}");
|
||||
}
|
||||
else
|
||||
{
|
||||
_popup.PopupClient(Loc.GetString(entity.Comp.EatMessage, ("food", entity.Owner), ("flavors", flavors)), args.User, args.User);
|
||||
|
||||
// log successful voluntary eating
|
||||
_adminLogger.Add(LogType.Ingestion, LogImpact.Low, $"{ToPrettyString(args.User):target} ate {ToPrettyString(entity):food}");
|
||||
}
|
||||
|
||||
// BREAK OUR UTENSILS
|
||||
if (_ingestion.TryGetUtensils(args.User, entity, out var utensils))
|
||||
{
|
||||
foreach (var utensil in utensils)
|
||||
{
|
||||
_ingestion.TryBreak(utensil, args.User);
|
||||
}
|
||||
}
|
||||
|
||||
if (_ingestion.GetUsesRemaining(entity, entity.Comp.Solution, args.Split.Volume) > 0)
|
||||
{
|
||||
// Leave some of the consumer's DNA on the consumed item...
|
||||
var ev = new TransferDnaEvent
|
||||
{
|
||||
Donor = args.Target,
|
||||
Recipient = entity,
|
||||
CanDnaBeCleaned = false,
|
||||
};
|
||||
RaiseLocalEvent(args.Target, ref ev);
|
||||
|
||||
args.Repeat = !args.ForceFed;
|
||||
return;
|
||||
}
|
||||
|
||||
// Food is always destroyed...
|
||||
args.Destroy = true;
|
||||
}
|
||||
|
||||
private void OnFoodFullyEaten(Entity<FoodComponent> food, ref FullyEatenEvent args)
|
||||
{
|
||||
if (food.Comp.Trash.Count == 0)
|
||||
return;
|
||||
|
||||
var position = _transform.GetMapCoordinates(food);
|
||||
var trashes = food.Comp.Trash;
|
||||
var tryPickup = _hands.IsHolding(args.User, food, out _);
|
||||
|
||||
foreach (var trash in trashes)
|
||||
{
|
||||
var spawnedTrash = EntityManager.PredictedSpawn(trash, position);
|
||||
|
||||
// If the user is holding the item
|
||||
if (tryPickup)
|
||||
{
|
||||
// Put the trash in the user's hand
|
||||
_hands.TryPickupAnyHand(args.User, spawnedTrash);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void OnFood(Entity<FoodComponent> food, ref EdibleEvent args)
|
||||
{
|
||||
if (args.Cancelled)
|
||||
return;
|
||||
|
||||
if (args.Cancelled || args.Solution != null)
|
||||
return;
|
||||
|
||||
if (food.Comp.UtensilRequired && !_ingestion.HasRequiredUtensils(args.User, food.Comp.Utensil))
|
||||
{
|
||||
args.Cancelled = true;
|
||||
return;
|
||||
}
|
||||
|
||||
// Check this last
|
||||
_solutionContainer.TryGetSolution(food.Owner, food.Comp.Solution, out args.Solution);
|
||||
args.Time += TimeSpan.FromSeconds(food.Comp.Delay);
|
||||
}
|
||||
|
||||
private void OnGetUtensils(Entity<FoodComponent> entity, ref GetUtensilsEvent args)
|
||||
{
|
||||
if (entity.Comp.Utensil == UtensilType.None)
|
||||
return;
|
||||
|
||||
if (entity.Comp.UtensilRequired)
|
||||
args.AddRequiredTypes(entity.Comp.Utensil);
|
||||
else
|
||||
args.Types |= entity.Comp.Utensil;
|
||||
}
|
||||
|
||||
// TODO: When DrinkComponent and FoodComponent are properly obseleted, make the IsDigestionBools in IngestionSystem private again.
|
||||
private void OnIsFoodDigestible(Entity<FoodComponent> ent, ref IsDigestibleEvent args)
|
||||
{
|
||||
if (ent.Comp.RequireDead && _mobState.IsAlive(ent))
|
||||
return;
|
||||
|
||||
args.AddDigestible(ent.Comp.RequiresSpecialDigestion);
|
||||
}
|
||||
|
||||
private void OnGetEdibleType(Entity<FoodComponent> ent, ref GetEdibleTypeEvent args)
|
||||
{
|
||||
if (args.Type != null)
|
||||
return;
|
||||
|
||||
args.SetPrototype(IngestionSystem.Food);
|
||||
}
|
||||
|
||||
private void OnBeforeFullySliced(Entity<FoodComponent> food, ref BeforeFullySlicedEvent args)
|
||||
{
|
||||
if (food.Comp.Trash.Count == 0)
|
||||
return;
|
||||
|
||||
var position = _transform.GetMapCoordinates(food);
|
||||
var trashes = food.Comp.Trash;
|
||||
var tryPickup = _hands.IsHolding(args.User, food, out _);
|
||||
|
||||
foreach (var trash in trashes)
|
||||
{
|
||||
var spawnedTrash = EntityManager.PredictedSpawn(trash, position);
|
||||
|
||||
// If the user is holding the item
|
||||
if (tryPickup)
|
||||
{
|
||||
// Put the trash in the user's hand
|
||||
_hands.TryPickupAnyHand(args.User, spawnedTrash);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -4,7 +4,7 @@
|
||||
abstract: true
|
||||
components:
|
||||
- type: Organ
|
||||
- type: Food
|
||||
- type: Edible
|
||||
- type: Sprite
|
||||
sprite: Mobs/Species/Human/organs.rsi
|
||||
- type: StaticPrice
|
||||
@@ -102,6 +102,11 @@
|
||||
solutions:
|
||||
stomach:
|
||||
maxVol: 30
|
||||
food:
|
||||
maxVol: 5
|
||||
reagents:
|
||||
- ReagentId: UncookedAnimalProteins
|
||||
Quantity: 5
|
||||
- type: Item
|
||||
size: Small
|
||||
heldPrefix: stomach
|
||||
|
||||
@@ -14,3 +14,8 @@
|
||||
solutions:
|
||||
stomach:
|
||||
maxVol: 80
|
||||
food:
|
||||
maxVol: 5
|
||||
reagents:
|
||||
- ReagentId: UncookedAnimalProteins
|
||||
Quantity: 5
|
||||
|
||||
@@ -24,6 +24,11 @@
|
||||
solutions:
|
||||
stomach:
|
||||
maxVol: 30.0
|
||||
food:
|
||||
maxVol: 5
|
||||
reagents:
|
||||
- ReagentId: GreyMatter
|
||||
Quantity: 5
|
||||
|
||||
- type: entity
|
||||
id: OrganSlimesLungs
|
||||
@@ -55,3 +60,8 @@
|
||||
Lung:
|
||||
maxVol: 100.0
|
||||
canReact: false
|
||||
food:
|
||||
maxVol: 5
|
||||
reagents:
|
||||
- ReagentId: Slime
|
||||
Quantity: 5
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
- type: Sprite
|
||||
sprite: Mobs/Species/Arachnid/organs.rsi
|
||||
- type: Organ
|
||||
- type: Food
|
||||
- type: Edible
|
||||
- type: Extractable
|
||||
grindableSolutionName: organ
|
||||
- type: SolutionContainerManager
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
- type: Sprite
|
||||
sprite: Mobs/Species/Diona/organs.rsi
|
||||
- type: Organ
|
||||
- type: Food
|
||||
- type: Edible
|
||||
- type: Extractable
|
||||
grindableSolutionName: organ
|
||||
- type: SolutionContainerManager
|
||||
@@ -19,7 +19,7 @@
|
||||
food:
|
||||
maxVol: 5
|
||||
reagents:
|
||||
- ReagentId: UncookedAnimalProteins
|
||||
- ReagentId: Cellulose
|
||||
Quantity: 5
|
||||
- type: FlavorProfile
|
||||
flavors:
|
||||
@@ -78,7 +78,7 @@
|
||||
food:
|
||||
maxVol: 5
|
||||
reagents:
|
||||
- ReagentId: UncookedAnimalProteins
|
||||
- ReagentId: Cellulose
|
||||
Quantity: 5
|
||||
- type: Stomach
|
||||
- type: Metabolizer
|
||||
@@ -127,6 +127,11 @@
|
||||
Lung:
|
||||
maxVol: 100
|
||||
canReact: False
|
||||
food:
|
||||
maxVol: 5
|
||||
reagents:
|
||||
- ReagentId: Cellulose
|
||||
Quantity: 5
|
||||
|
||||
# Organs that turn into nymphs on removal
|
||||
- type: entity
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
- type: Sprite
|
||||
sprite: Mobs/Species/Human/organs.rsi
|
||||
- type: Organ
|
||||
- type: Food
|
||||
- type: Edible
|
||||
- type: Extractable
|
||||
grindableSolutionName: organ
|
||||
- type: SolutionContainerManager
|
||||
|
||||
@@ -110,7 +110,7 @@
|
||||
- type: Clothing
|
||||
sprite: Clothing/Eyes/Hud/friedonion.rsi
|
||||
- type: ShowHungerIcons
|
||||
- type: Food
|
||||
- type: Edible
|
||||
- type: SolutionContainerManager
|
||||
solutions:
|
||||
food:
|
||||
|
||||
@@ -390,7 +390,7 @@
|
||||
- type: Bloodstream
|
||||
bloodReagent: InsectBlood
|
||||
bloodMaxVolume: 20
|
||||
- type: Food
|
||||
- type: Edible
|
||||
- type: FlavorProfile
|
||||
flavors:
|
||||
- horrible
|
||||
@@ -1791,7 +1791,7 @@
|
||||
Base: dead-0
|
||||
Dead:
|
||||
Base: splat-0
|
||||
- type: Food
|
||||
- type: Edible
|
||||
- type: FlavorProfile
|
||||
flavors:
|
||||
- meaty
|
||||
@@ -3455,7 +3455,7 @@
|
||||
Base: dead-0
|
||||
Dead:
|
||||
Base: splat-0
|
||||
- type: Food
|
||||
- type: Edible
|
||||
- type: FlavorProfile
|
||||
flavors:
|
||||
- meaty
|
||||
|
||||
@@ -138,7 +138,7 @@
|
||||
state: hand
|
||||
|
||||
- type: InventorySlots
|
||||
- type: Food
|
||||
- type: Edible # Why? I'm not sure but I also am afraid of the answer.
|
||||
- type: Hunger
|
||||
baseDecayRate: 0.05 # They get a lil' hungy
|
||||
- type: BodyEmotes # Grants them clapping and so on.
|
||||
|
||||
@@ -454,7 +454,7 @@
|
||||
Base: dead
|
||||
Dead:
|
||||
Base: dead
|
||||
- type: Food
|
||||
- type: Edible
|
||||
- type: Thirst
|
||||
startingThirst: 25 # spawn with Okay thirst state
|
||||
thresholds:
|
||||
|
||||
@@ -48,7 +48,7 @@
|
||||
- type: FlavorProfile
|
||||
flavors:
|
||||
- sweet
|
||||
- type: Food
|
||||
- type: Edible
|
||||
- type: SolutionContainerManager
|
||||
solutions:
|
||||
food:
|
||||
@@ -1147,7 +1147,7 @@
|
||||
Quantity: 80
|
||||
- ReagentId: Sugar
|
||||
Quantity: 30
|
||||
- type: Food
|
||||
- type: Edible
|
||||
transferAmount: 12
|
||||
- type: Item
|
||||
size: Normal
|
||||
@@ -1174,7 +1174,7 @@
|
||||
Quantity: 10
|
||||
- ReagentId: Sugar
|
||||
Quantity: 5
|
||||
- type: Food
|
||||
- type: Edible
|
||||
transferAmount: 3
|
||||
- type: PointLight
|
||||
color: "#FFFF00"
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
id: FoodDonkpocketBase
|
||||
abstract: true
|
||||
components:
|
||||
- type: Food
|
||||
- type: Edible
|
||||
- type: Sprite
|
||||
sprite: Objects/Consumable/Food/Baked/donkpocket.rsi
|
||||
- type: SolutionContainerManager
|
||||
@@ -409,7 +409,7 @@
|
||||
Quantity: 5
|
||||
- type: Sprite
|
||||
state: moth
|
||||
- type: Food
|
||||
- type: Edible
|
||||
requiresSpecialDigestion: true
|
||||
- type: Tag
|
||||
tags:
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
name: cotton bun
|
||||
description: A cotton hamburger bun. Soft, round and convenient to hold.
|
||||
components:
|
||||
- type: Food
|
||||
- type: Edible
|
||||
requiresSpecialDigestion: true
|
||||
- type: Sprite
|
||||
sprite: Objects/Consumable/Food/cottonburger.rsi
|
||||
@@ -43,7 +43,7 @@
|
||||
components:
|
||||
- type: Item
|
||||
size: Normal #patch until there is an adequate resizing system in place
|
||||
- type: Food
|
||||
- type: Edible
|
||||
requiresSpecialDigestion: true
|
||||
- type: Sprite
|
||||
drawdepth: Mobs
|
||||
@@ -84,7 +84,7 @@
|
||||
name: cotton top bun
|
||||
description: The perfect finish for your fibrous burger tower.
|
||||
components:
|
||||
- type: Food
|
||||
- type: Edible
|
||||
requiresSpecialDigestion: true
|
||||
- type: Sprite
|
||||
sprite: Objects/Consumable/Food/cottonburger.rsi
|
||||
|
||||
@@ -69,7 +69,7 @@
|
||||
id: Eggshells
|
||||
description: You're walkin' on 'em bud.
|
||||
components:
|
||||
- type: Food
|
||||
- type: Edible
|
||||
- type: Sprite
|
||||
sprite: Objects/Consumable/Food/egg.rsi
|
||||
state: eggshells
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
- type: Sprite
|
||||
sprite: error.rsi
|
||||
state: error
|
||||
- type: Food
|
||||
- type: Edible
|
||||
- type: SolutionContainerManager
|
||||
solutions:
|
||||
food:
|
||||
|
||||
@@ -243,8 +243,7 @@
|
||||
- type: MeleeWeapon
|
||||
soundHit:
|
||||
path: /Audio/Items/Toys/ian.ogg
|
||||
- type: Food
|
||||
requiresSpecialDigestion: true
|
||||
- type: Edible
|
||||
useSound:
|
||||
path: /Audio/Items/Toys/ian.ogg
|
||||
- type: FoodSequenceElement
|
||||
@@ -1009,7 +1008,7 @@
|
||||
- type: FlavorProfile
|
||||
flavors:
|
||||
- plastic
|
||||
- type: Food
|
||||
- type: Edible
|
||||
- type: SolutionContainerManager
|
||||
solutions:
|
||||
food:
|
||||
|
||||
@@ -80,7 +80,6 @@
|
||||
types:
|
||||
Heat: 0.5
|
||||
- type: AtmosExposed
|
||||
- type: Edible
|
||||
- type: Kudzu
|
||||
growthTickChance: 0.3
|
||||
spreadChance: 0.4
|
||||
@@ -90,7 +89,7 @@
|
||||
ignoreWhitelist:
|
||||
components:
|
||||
- IgnoreKudzu
|
||||
- type: Food
|
||||
- type: Edible
|
||||
requiresSpecialDigestion: true
|
||||
delay: 0.5
|
||||
- type: FlavorProfile
|
||||
@@ -244,15 +243,14 @@
|
||||
types:
|
||||
Heat: 3
|
||||
- type: AtmosExposed
|
||||
- type: Edible
|
||||
- type: Edible # delightfully devilish !
|
||||
delay: 0.5
|
||||
- type: SpeedModifierContacts
|
||||
walkSpeedModifier: 0.3
|
||||
sprintSpeedModifier: 0.3
|
||||
ignoreWhitelist:
|
||||
tags:
|
||||
- Flesh
|
||||
- type: Food # delightfully devilish !
|
||||
delay: 0.5
|
||||
- type: SolutionContainerManager
|
||||
solutions:
|
||||
food:
|
||||
|
||||
@@ -38,8 +38,7 @@
|
||||
max: 1
|
||||
- !type:DoActsBehavior
|
||||
acts: [ "Destruction" ]
|
||||
- type: Food
|
||||
solution: food
|
||||
- type: Edible
|
||||
delay: 7
|
||||
forceFeedDelay: 7
|
||||
- type: FlavorProfile
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
sprite: Objects/Specific/Hydroponics/cannabis.rsi
|
||||
- type: Produce
|
||||
seedId: cannabis
|
||||
- type: Food
|
||||
- type: Edible # Precursor to the one true edible
|
||||
- type: SolutionContainerManager
|
||||
solutions:
|
||||
food:
|
||||
|
||||
@@ -63,7 +63,7 @@
|
||||
- type: FlavorProfile
|
||||
flavors:
|
||||
- clean
|
||||
- type: Food
|
||||
- type: Edible
|
||||
solution: soap
|
||||
- type: BadFood
|
||||
- type: CleansForensics
|
||||
|
||||
@@ -57,7 +57,7 @@
|
||||
Quantity: 9
|
||||
- ReagentId: Fat
|
||||
Quantity: 9
|
||||
- type: Food
|
||||
- type: Edible
|
||||
solution: cube
|
||||
- type: FlavorProfile
|
||||
flavors:
|
||||
|
||||
@@ -630,7 +630,7 @@
|
||||
- cheap
|
||||
- type: ComponentToggler
|
||||
components:
|
||||
- type: Food
|
||||
- type: Edible # This shouldn't be component toggler, but doesn't work when it's not
|
||||
- type: PointLight
|
||||
enabled: false
|
||||
netsync: false
|
||||
|
||||
@@ -127,7 +127,7 @@
|
||||
- type: FlavorProfile
|
||||
flavors:
|
||||
- sweet
|
||||
- type: Food
|
||||
- type: Edible
|
||||
delay: 2
|
||||
- type: SolutionContainerManager
|
||||
solutions:
|
||||
|
||||
Reference in New Issue
Block a user