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:
āda
2025-10-24 13:32:14 -05:00
committed by GitHub
parent 9008f776ec
commit 48e2b2d263
30 changed files with 76 additions and 382 deletions

View File

@@ -34,8 +34,8 @@ public sealed class CrayonSystem : SharedCrayonSystem
SubscribeLocalEvent<CrayonComponent, MapInitEvent>(OnMapInit); SubscribeLocalEvent<CrayonComponent, MapInitEvent>(OnMapInit);
SubscribeLocalEvent<CrayonComponent, CrayonSelectMessage>(OnCrayonBoundUI); SubscribeLocalEvent<CrayonComponent, CrayonSelectMessage>(OnCrayonBoundUI);
SubscribeLocalEvent<CrayonComponent, CrayonColorMessage>(OnCrayonBoundUIColor); SubscribeLocalEvent<CrayonComponent, CrayonColorMessage>(OnCrayonBoundUIColor);
SubscribeLocalEvent<CrayonComponent, UseInHandEvent>(OnCrayonUse, before: new[] { typeof(FoodSystem) }); SubscribeLocalEvent<CrayonComponent, UseInHandEvent>(OnCrayonUse);
SubscribeLocalEvent<CrayonComponent, AfterInteractEvent>(OnCrayonAfterInteract, after: new[] { typeof(FoodSystem) }); SubscribeLocalEvent<CrayonComponent, AfterInteractEvent>(OnCrayonAfterInteract, after: [typeof(IngestionSystem)]);
SubscribeLocalEvent<CrayonComponent, DroppedEvent>(OnCrayonDropped); SubscribeLocalEvent<CrayonComponent, DroppedEvent>(OnCrayonDropped);
} }
@@ -47,6 +47,7 @@ public sealed class CrayonSystem : SharedCrayonSystem
Dirty(ent); Dirty(ent);
} }
// Runs after IngestionSystem so it doesn't bulldoze force-feeding
private void OnCrayonAfterInteract(EntityUid uid, CrayonComponent component, AfterInteractEvent args) private void OnCrayonAfterInteract(EntityUid uid, CrayonComponent component, AfterInteractEvent args)
{ {
if (args.Handled || !args.CanReach) if (args.Handled || !args.CanReach)

View File

@@ -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. /// 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 /// Including but not limited to: uranium, death pills, insulation
/// </summary> /// </summary>
[RegisterComponent, Access(typeof(FoodSystem))] [RegisterComponent]
public sealed partial class BadFoodComponent : Component public sealed partial class BadFoodComponent : Component;
{
}

View File

@@ -6,7 +6,5 @@ namespace Content.Server.Nutrition.Components;
/// This component allows NPC mobs to eat food with BadFoodComponent. /// This component allows NPC mobs to eat food with BadFoodComponent.
/// See MobMouseAdmeme for usage. /// See MobMouseAdmeme for usage.
/// </summary> /// </summary>
[RegisterComponent, Access(typeof(FoodSystem))] [RegisterComponent]
public sealed partial class IgnoreBadFoodComponent : Component public sealed partial class IgnoreBadFoodComponent : Component;
{
}

View File

@@ -33,8 +33,6 @@ namespace Content.Server.Nutrition.EntitySystems
{ {
base.Initialize(); base.Initialize();
// activate BEFORE entity is deleted and trash is spawned
SubscribeLocalEvent<CreamPieComponent, ConsumeDoAfterEvent>(OnConsume, before: [typeof(FoodSystem)]);
SubscribeLocalEvent<CreamPieComponent, SliceFoodEvent>(OnSlice); SubscribeLocalEvent<CreamPieComponent, SliceFoodEvent>(OnSlice);
SubscribeLocalEvent<CreamPiedComponent, RejuvenateEvent>(OnRejuvenate); SubscribeLocalEvent<CreamPiedComponent, RejuvenateEvent>(OnRejuvenate);
@@ -59,10 +57,10 @@ namespace Content.Server.Nutrition.EntitySystems
QueueDel(entity); QueueDel(entity);
} }
private void OnConsume(Entity<CreamPieComponent> entity, ref ConsumeDoAfterEvent args) // TODO
{ // A regression occured here. Previously creampies would activate their hidden payload if you tried to eat them.
ActivatePayload(entity); // 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) private void OnSlice(Entity<CreamPieComponent> entity, ref SliceFoodEvent args)
{ {

View File

@@ -8,7 +8,7 @@ using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom;
namespace Content.Shared.Body.Components namespace Content.Shared.Body.Components
{ {
[RegisterComponent, NetworkedComponent, Access(typeof(StomachSystem), typeof(FoodSystem))] [RegisterComponent, NetworkedComponent, Access(typeof(StomachSystem))]
public sealed partial class StomachComponent : Component public sealed partial class StomachComponent : Component
{ {
/// <summary> /// <summary>

View File

@@ -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;
}

View File

@@ -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);
}
}
}
}

View File

@@ -4,7 +4,7 @@
abstract: true abstract: true
components: components:
- type: Organ - type: Organ
- type: Food - type: Edible
- type: Sprite - type: Sprite
sprite: Mobs/Species/Human/organs.rsi sprite: Mobs/Species/Human/organs.rsi
- type: StaticPrice - type: StaticPrice
@@ -102,6 +102,11 @@
solutions: solutions:
stomach: stomach:
maxVol: 30 maxVol: 30
food:
maxVol: 5
reagents:
- ReagentId: UncookedAnimalProteins
Quantity: 5
- type: Item - type: Item
size: Small size: Small
heldPrefix: stomach heldPrefix: stomach

View File

@@ -14,3 +14,8 @@
solutions: solutions:
stomach: stomach:
maxVol: 80 maxVol: 80
food:
maxVol: 5
reagents:
- ReagentId: UncookedAnimalProteins
Quantity: 5

View File

@@ -24,6 +24,11 @@
solutions: solutions:
stomach: stomach:
maxVol: 30.0 maxVol: 30.0
food:
maxVol: 5
reagents:
- ReagentId: GreyMatter
Quantity: 5
- type: entity - type: entity
id: OrganSlimesLungs id: OrganSlimesLungs
@@ -55,3 +60,8 @@
Lung: Lung:
maxVol: 100.0 maxVol: 100.0
canReact: false canReact: false
food:
maxVol: 5
reagents:
- ReagentId: Slime
Quantity: 5

View File

@@ -6,7 +6,7 @@
- type: Sprite - type: Sprite
sprite: Mobs/Species/Arachnid/organs.rsi sprite: Mobs/Species/Arachnid/organs.rsi
- type: Organ - type: Organ
- type: Food - type: Edible
- type: Extractable - type: Extractable
grindableSolutionName: organ grindableSolutionName: organ
- type: SolutionContainerManager - type: SolutionContainerManager

View File

@@ -6,7 +6,7 @@
- type: Sprite - type: Sprite
sprite: Mobs/Species/Diona/organs.rsi sprite: Mobs/Species/Diona/organs.rsi
- type: Organ - type: Organ
- type: Food - type: Edible
- type: Extractable - type: Extractable
grindableSolutionName: organ grindableSolutionName: organ
- type: SolutionContainerManager - type: SolutionContainerManager
@@ -19,7 +19,7 @@
food: food:
maxVol: 5 maxVol: 5
reagents: reagents:
- ReagentId: UncookedAnimalProteins - ReagentId: Cellulose
Quantity: 5 Quantity: 5
- type: FlavorProfile - type: FlavorProfile
flavors: flavors:
@@ -78,7 +78,7 @@
food: food:
maxVol: 5 maxVol: 5
reagents: reagents:
- ReagentId: UncookedAnimalProteins - ReagentId: Cellulose
Quantity: 5 Quantity: 5
- type: Stomach - type: Stomach
- type: Metabolizer - type: Metabolizer
@@ -127,6 +127,11 @@
Lung: Lung:
maxVol: 100 maxVol: 100
canReact: False canReact: False
food:
maxVol: 5
reagents:
- ReagentId: Cellulose
Quantity: 5
# Organs that turn into nymphs on removal # Organs that turn into nymphs on removal
- type: entity - type: entity

View File

@@ -6,7 +6,7 @@
- type: Sprite - type: Sprite
sprite: Mobs/Species/Human/organs.rsi sprite: Mobs/Species/Human/organs.rsi
- type: Organ - type: Organ
- type: Food - type: Edible
- type: Extractable - type: Extractable
grindableSolutionName: organ grindableSolutionName: organ
- type: SolutionContainerManager - type: SolutionContainerManager

View File

@@ -110,7 +110,7 @@
- type: Clothing - type: Clothing
sprite: Clothing/Eyes/Hud/friedonion.rsi sprite: Clothing/Eyes/Hud/friedonion.rsi
- type: ShowHungerIcons - type: ShowHungerIcons
- type: Food - type: Edible
- type: SolutionContainerManager - type: SolutionContainerManager
solutions: solutions:
food: food:

View File

@@ -390,7 +390,7 @@
- type: Bloodstream - type: Bloodstream
bloodReagent: InsectBlood bloodReagent: InsectBlood
bloodMaxVolume: 20 bloodMaxVolume: 20
- type: Food - type: Edible
- type: FlavorProfile - type: FlavorProfile
flavors: flavors:
- horrible - horrible
@@ -1791,7 +1791,7 @@
Base: dead-0 Base: dead-0
Dead: Dead:
Base: splat-0 Base: splat-0
- type: Food - type: Edible
- type: FlavorProfile - type: FlavorProfile
flavors: flavors:
- meaty - meaty
@@ -3455,7 +3455,7 @@
Base: dead-0 Base: dead-0
Dead: Dead:
Base: splat-0 Base: splat-0
- type: Food - type: Edible
- type: FlavorProfile - type: FlavorProfile
flavors: flavors:
- meaty - meaty

View File

@@ -138,7 +138,7 @@
state: hand state: hand
- type: InventorySlots - type: InventorySlots
- type: Food - type: Edible # Why? I'm not sure but I also am afraid of the answer.
- type: Hunger - type: Hunger
baseDecayRate: 0.05 # They get a lil' hungy baseDecayRate: 0.05 # They get a lil' hungy
- type: BodyEmotes # Grants them clapping and so on. - type: BodyEmotes # Grants them clapping and so on.

View File

@@ -454,7 +454,7 @@
Base: dead Base: dead
Dead: Dead:
Base: dead Base: dead
- type: Food - type: Edible
- type: Thirst - type: Thirst
startingThirst: 25 # spawn with Okay thirst state startingThirst: 25 # spawn with Okay thirst state
thresholds: thresholds:

View File

@@ -48,7 +48,7 @@
- type: FlavorProfile - type: FlavorProfile
flavors: flavors:
- sweet - sweet
- type: Food - type: Edible
- type: SolutionContainerManager - type: SolutionContainerManager
solutions: solutions:
food: food:
@@ -1147,7 +1147,7 @@
Quantity: 80 Quantity: 80
- ReagentId: Sugar - ReagentId: Sugar
Quantity: 30 Quantity: 30
- type: Food - type: Edible
transferAmount: 12 transferAmount: 12
- type: Item - type: Item
size: Normal size: Normal
@@ -1174,7 +1174,7 @@
Quantity: 10 Quantity: 10
- ReagentId: Sugar - ReagentId: Sugar
Quantity: 5 Quantity: 5
- type: Food - type: Edible
transferAmount: 3 transferAmount: 3
- type: PointLight - type: PointLight
color: "#FFFF00" color: "#FFFF00"

View File

@@ -5,7 +5,7 @@
id: FoodDonkpocketBase id: FoodDonkpocketBase
abstract: true abstract: true
components: components:
- type: Food - type: Edible
- type: Sprite - type: Sprite
sprite: Objects/Consumable/Food/Baked/donkpocket.rsi sprite: Objects/Consumable/Food/Baked/donkpocket.rsi
- type: SolutionContainerManager - type: SolutionContainerManager
@@ -409,7 +409,7 @@
Quantity: 5 Quantity: 5
- type: Sprite - type: Sprite
state: moth state: moth
- type: Food - type: Edible
requiresSpecialDigestion: true requiresSpecialDigestion: true
- type: Tag - type: Tag
tags: tags:

View File

@@ -6,7 +6,7 @@
name: cotton bun name: cotton bun
description: A cotton hamburger bun. Soft, round and convenient to hold. description: A cotton hamburger bun. Soft, round and convenient to hold.
components: components:
- type: Food - type: Edible
requiresSpecialDigestion: true requiresSpecialDigestion: true
- type: Sprite - type: Sprite
sprite: Objects/Consumable/Food/cottonburger.rsi sprite: Objects/Consumable/Food/cottonburger.rsi
@@ -43,7 +43,7 @@
components: components:
- type: Item - type: Item
size: Normal #patch until there is an adequate resizing system in place size: Normal #patch until there is an adequate resizing system in place
- type: Food - type: Edible
requiresSpecialDigestion: true requiresSpecialDigestion: true
- type: Sprite - type: Sprite
drawdepth: Mobs drawdepth: Mobs
@@ -84,7 +84,7 @@
name: cotton top bun name: cotton top bun
description: The perfect finish for your fibrous burger tower. description: The perfect finish for your fibrous burger tower.
components: components:
- type: Food - type: Edible
requiresSpecialDigestion: true requiresSpecialDigestion: true
- type: Sprite - type: Sprite
sprite: Objects/Consumable/Food/cottonburger.rsi sprite: Objects/Consumable/Food/cottonburger.rsi

View File

@@ -69,7 +69,7 @@
id: Eggshells id: Eggshells
description: You're walkin' on 'em bud. description: You're walkin' on 'em bud.
components: components:
- type: Food - type: Edible
- type: Sprite - type: Sprite
sprite: Objects/Consumable/Food/egg.rsi sprite: Objects/Consumable/Food/egg.rsi
state: eggshells state: eggshells

View File

@@ -7,7 +7,7 @@
- type: Sprite - type: Sprite
sprite: error.rsi sprite: error.rsi
state: error state: error
- type: Food - type: Edible
- type: SolutionContainerManager - type: SolutionContainerManager
solutions: solutions:
food: food:

View File

@@ -243,8 +243,7 @@
- type: MeleeWeapon - type: MeleeWeapon
soundHit: soundHit:
path: /Audio/Items/Toys/ian.ogg path: /Audio/Items/Toys/ian.ogg
- type: Food - type: Edible
requiresSpecialDigestion: true
useSound: useSound:
path: /Audio/Items/Toys/ian.ogg path: /Audio/Items/Toys/ian.ogg
- type: FoodSequenceElement - type: FoodSequenceElement
@@ -1009,7 +1008,7 @@
- type: FlavorProfile - type: FlavorProfile
flavors: flavors:
- plastic - plastic
- type: Food - type: Edible
- type: SolutionContainerManager - type: SolutionContainerManager
solutions: solutions:
food: food:

View File

@@ -80,7 +80,6 @@
types: types:
Heat: 0.5 Heat: 0.5
- type: AtmosExposed - type: AtmosExposed
- type: Edible
- type: Kudzu - type: Kudzu
growthTickChance: 0.3 growthTickChance: 0.3
spreadChance: 0.4 spreadChance: 0.4
@@ -90,7 +89,7 @@
ignoreWhitelist: ignoreWhitelist:
components: components:
- IgnoreKudzu - IgnoreKudzu
- type: Food - type: Edible
requiresSpecialDigestion: true requiresSpecialDigestion: true
delay: 0.5 delay: 0.5
- type: FlavorProfile - type: FlavorProfile
@@ -244,15 +243,14 @@
types: types:
Heat: 3 Heat: 3
- type: AtmosExposed - type: AtmosExposed
- type: Edible - type: Edible # delightfully devilish !
delay: 0.5
- type: SpeedModifierContacts - type: SpeedModifierContacts
walkSpeedModifier: 0.3 walkSpeedModifier: 0.3
sprintSpeedModifier: 0.3 sprintSpeedModifier: 0.3
ignoreWhitelist: ignoreWhitelist:
tags: tags:
- Flesh - Flesh
- type: Food # delightfully devilish !
delay: 0.5
- type: SolutionContainerManager - type: SolutionContainerManager
solutions: solutions:
food: food:

View File

@@ -38,8 +38,7 @@
max: 1 max: 1
- !type:DoActsBehavior - !type:DoActsBehavior
acts: [ "Destruction" ] acts: [ "Destruction" ]
- type: Food - type: Edible
solution: food
delay: 7 delay: 7
forceFeedDelay: 7 forceFeedDelay: 7
- type: FlavorProfile - type: FlavorProfile

View File

@@ -10,7 +10,7 @@
sprite: Objects/Specific/Hydroponics/cannabis.rsi sprite: Objects/Specific/Hydroponics/cannabis.rsi
- type: Produce - type: Produce
seedId: cannabis seedId: cannabis
- type: Food - type: Edible # Precursor to the one true edible
- type: SolutionContainerManager - type: SolutionContainerManager
solutions: solutions:
food: food:

View File

@@ -63,7 +63,7 @@
- type: FlavorProfile - type: FlavorProfile
flavors: flavors:
- clean - clean
- type: Food - type: Edible
solution: soap solution: soap
- type: BadFood - type: BadFood
- type: CleansForensics - type: CleansForensics

View File

@@ -57,7 +57,7 @@
Quantity: 9 Quantity: 9
- ReagentId: Fat - ReagentId: Fat
Quantity: 9 Quantity: 9
- type: Food - type: Edible
solution: cube solution: cube
- type: FlavorProfile - type: FlavorProfile
flavors: flavors:

View File

@@ -630,7 +630,7 @@
- cheap - cheap
- type: ComponentToggler - type: ComponentToggler
components: components:
- type: Food - type: Edible # This shouldn't be component toggler, but doesn't work when it's not
- type: PointLight - type: PointLight
enabled: false enabled: false
netsync: false netsync: false

View File

@@ -127,7 +127,7 @@
- type: FlavorProfile - type: FlavorProfile
flavors: flavors:
- sweet - sweet
- type: Food - type: Edible
delay: 2 delay: 2
- type: SolutionContainerManager - type: SolutionContainerManager
solutions: solutions: