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, 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)
|
||||||
|
|||||||
@@ -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;
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -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;
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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
|
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
|
||||||
|
|||||||
@@ -14,3 +14,8 @@
|
|||||||
solutions:
|
solutions:
|
||||||
stomach:
|
stomach:
|
||||||
maxVol: 80
|
maxVol: 80
|
||||||
|
food:
|
||||||
|
maxVol: 5
|
||||||
|
reagents:
|
||||||
|
- ReagentId: UncookedAnimalProteins
|
||||||
|
Quantity: 5
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
Reference in New Issue
Block a user