From 676ca21b5f2d47752f6c2c5642257393ad5e4aee Mon Sep 17 00:00:00 2001 From: mirrorcult Date: Fri, 18 Feb 2022 15:57:42 -0700 Subject: [PATCH] Add knife butchering and blood gibbing (#6770) --- Content.Client/Entry/IgnoredComponents.cs | 1 + .../Body/Components/BodyComponent.cs | 5 + .../Body/Systems/BloodstreamSystem.cs | 24 ++++ .../Botany/Components/PlantHolderComponent.cs | 4 +- .../Botany/Systems/BotanySystem.Seed.cs | 3 +- Content.Server/Botany/Systems/LogSystem.cs | 5 +- .../Kitchen/Components/SharpComponent.cs | 14 +++ .../EntitySystems/KitchenSpikeSystem.cs | 9 +- .../Kitchen/EntitySystems/SharpSystem.cs | 105 ++++++++++++++++++ .../Components/SharedKitchenSpikeComponent.cs | 2 +- .../Components/SharedButcherableComponent.cs | 19 +++- .../components/butcherable-component.ftl | 1 + .../Prototypes/Entities/Effects/puddle.yml | 1 + .../Prototypes/Entities/Mobs/NPCs/animals.yml | 37 +++--- .../Prototypes/Entities/Mobs/NPCs/carp.yml | 2 +- .../Prototypes/Entities/Mobs/NPCs/pets.yml | 6 +- .../Prototypes/Entities/Mobs/NPCs/xeno.yml | 3 +- .../Entities/Mobs/Species/human.yml | 3 +- .../Entities/Mobs/Species/slime.yml | 3 +- .../Prototypes/Entities/Mobs/Species/vox.yml | 3 +- .../Objects/Specific/Hydroponics/tools.yml | 6 +- .../Objects/Specific/Medical/surgery.yml | 1 + .../Objects/Weapons/Melee/e_sword.yml | 1 + .../Objects/Weapons/Melee/fireaxe.yml | 1 + .../Entities/Objects/Weapons/Melee/knife.yml | 1 + .../Entities/Objects/Weapons/Melee/spear.yml | 1 + .../Entities/Objects/Weapons/Melee/sword.yml | 4 + Resources/Prototypes/tags.yml | 3 - 28 files changed, 223 insertions(+), 45 deletions(-) create mode 100644 Content.Server/Kitchen/Components/SharpComponent.cs create mode 100644 Content.Server/Kitchen/EntitySystems/SharpSystem.cs create mode 100644 Resources/Locale/en-US/kitchen/components/butcherable-component.ftl diff --git a/Content.Client/Entry/IgnoredComponents.cs b/Content.Client/Entry/IgnoredComponents.cs index 02e6a6c9b7..6ce07e6058 100644 --- a/Content.Client/Entry/IgnoredComponents.cs +++ b/Content.Client/Entry/IgnoredComponents.cs @@ -71,6 +71,7 @@ namespace Content.Client.Entry "Stomach", "SpeedLoader", "Hitscan", + "Sharp", "StunOnCollide", "ExaminableDamage", "RandomPottedPlant", diff --git a/Content.Server/Body/Components/BodyComponent.cs b/Content.Server/Body/Components/BodyComponent.cs index 9486df05aa..f41a11cabc 100644 --- a/Content.Server/Body/Components/BodyComponent.cs +++ b/Content.Server/Body/Components/BodyComponent.cs @@ -102,7 +102,12 @@ namespace Content.Server.Body.Components } } + _entMan.EventBus.RaiseLocalEvent(Owner, new BeingGibbedEvent(), false); _entMan.QueueDeleteEntity(Owner); } } + + public sealed class BeingGibbedEvent : EntityEventArgs + { + } } diff --git a/Content.Server/Body/Systems/BloodstreamSystem.cs b/Content.Server/Body/Systems/BloodstreamSystem.cs index 4fa653c352..540fd3156d 100644 --- a/Content.Server/Body/Systems/BloodstreamSystem.cs +++ b/Content.Server/Body/Systems/BloodstreamSystem.cs @@ -34,6 +34,7 @@ public sealed class BloodstreamSystem : EntitySystem SubscribeLocalEvent(OnComponentInit); SubscribeLocalEvent(OnDamageChanged); SubscribeLocalEvent(OnExamined); + SubscribeLocalEvent(OnBeingGibbed); } public override void Update(float frameTime) @@ -132,6 +133,11 @@ public sealed class BloodstreamSystem : EntitySystem } } + private void OnBeingGibbed(EntityUid uid, BloodstreamComponent component, BeingGibbedEvent args) + { + SpillAllSolutions(uid, component); + } + /// /// Attempt to transfer provided solution to internal solution. /// @@ -193,4 +199,22 @@ public sealed class BloodstreamSystem : EntitySystem return true; } + + /// + /// BLOOD FOR THE BLOOD GOD + /// + public void SpillAllSolutions(EntityUid uid, BloodstreamComponent? component = null) + { + if (!Resolve(uid, ref component)) + return; + + var max = component.BloodSolution.MaxVolume + component.BloodTemporarySolution.MaxVolume + + component.ChemicalSolution.MaxVolume; + var tempSol = new Solution() { MaxVolume = max }; + + tempSol.AddSolution(component.BloodSolution); + tempSol.AddSolution(component.BloodTemporarySolution); + tempSol.AddSolution(component.ChemicalSolution); + _spillableSystem.SpillAt(uid, tempSol, "PuddleBlood", true); + } } diff --git a/Content.Server/Botany/Components/PlantHolderComponent.cs b/Content.Server/Botany/Components/PlantHolderComponent.cs index bcd0805f82..82535e3d53 100644 --- a/Content.Server/Botany/Components/PlantHolderComponent.cs +++ b/Content.Server/Botany/Components/PlantHolderComponent.cs @@ -7,6 +7,7 @@ using Content.Server.Chemistry.EntitySystems; using Content.Server.Chemistry.Components; using Content.Server.Fluids.Components; using Content.Server.Hands.Components; +using Content.Server.Kitchen.Components; using Content.Server.Plants; using Content.Server.Popups; using Content.Shared.ActionBlocker; @@ -802,9 +803,10 @@ namespace Content.Server.Botany.Components return true; } - if (tagSystem.HasTag(usingItem, "BotanySharp")) + if (_entMan.HasComponent(usingItem)) { return DoHarvest(user); + } if (_entMan.TryGetComponent(usingItem, out var produce)) diff --git a/Content.Server/Botany/Systems/BotanySystem.Seed.cs b/Content.Server/Botany/Systems/BotanySystem.Seed.cs index 7322cba2d0..b4564c1c0a 100644 --- a/Content.Server/Botany/Systems/BotanySystem.Seed.cs +++ b/Content.Server/Botany/Systems/BotanySystem.Seed.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Linq; using Content.Server.Botany.Components; +using Content.Server.Kitchen.Components; using Content.Shared.Examine; using Content.Shared.Random.Helpers; using Content.Shared.Tag; @@ -136,7 +137,7 @@ public sealed partial class BotanySystem public bool CanHarvest(SeedPrototype proto, EntityUid? held = null) { - return !proto.Ligneous || proto.Ligneous && held != null && _tags.HasTag(held.Value, "BotanySharp"); + return !proto.Ligneous || proto.Ligneous && held != null && HasComp(held); } #endregion diff --git a/Content.Server/Botany/Systems/LogSystem.cs b/Content.Server/Botany/Systems/LogSystem.cs index 2b6ab4ad44..8c30f9a42f 100644 --- a/Content.Server/Botany/Systems/LogSystem.cs +++ b/Content.Server/Botany/Systems/LogSystem.cs @@ -1,4 +1,5 @@ using Content.Server.Botany.Components; +using Content.Server.Kitchen.Components; using Content.Shared.ActionBlocker; using Content.Shared.Interaction; using Content.Shared.Random.Helpers; @@ -9,8 +10,6 @@ namespace Content.Server.Botany.Systems; public sealed class LogSystem : EntitySystem { - [Dependency] private readonly TagSystem _tags = default!; - public override void Initialize() { base.Initialize(); @@ -20,7 +19,7 @@ public sealed class LogSystem : EntitySystem private void OnInteractUsing(EntityUid uid, LogComponent component, InteractUsingEvent args) { - if (_tags.HasTag(args.Used, "BotanySharp")) + if (HasComp(args.Used)) { for (var i = 0; i < component.SpawnCount; i++) { diff --git a/Content.Server/Kitchen/Components/SharpComponent.cs b/Content.Server/Kitchen/Components/SharpComponent.cs new file mode 100644 index 0000000000..e79e2d2ee0 --- /dev/null +++ b/Content.Server/Kitchen/Components/SharpComponent.cs @@ -0,0 +1,14 @@ +namespace Content.Server.Kitchen.Components; + +/// +/// Applies to items that are capable of butchering entities, or +/// are otherwise sharp for some purpose. +/// +[RegisterComponent] +public sealed class SharpComponent : Component +{ + public HashSet Butchering = new(); + + [DataField("butcherDelayModifier")] + public float ButcherDelayModifier = 1.0f; +} diff --git a/Content.Server/Kitchen/EntitySystems/KitchenSpikeSystem.cs b/Content.Server/Kitchen/EntitySystems/KitchenSpikeSystem.cs index d408dc460a..31f6286b44 100644 --- a/Content.Server/Kitchen/EntitySystems/KitchenSpikeSystem.cs +++ b/Content.Server/Kitchen/EntitySystems/KitchenSpikeSystem.cs @@ -92,7 +92,7 @@ namespace Content.Server.Kitchen.EntitySystems if (!Resolve(uid, ref component) || !Resolve(victimUid, ref butcherable)) return; - component.MeatPrototype = butcherable.MeatPrototype; + component.MeatPrototype = butcherable.SpawnedPrototype; component.MeatParts = butcherable.Pieces; // This feels not okay, but entity is getting deleted on "Spike", for now... @@ -164,7 +164,7 @@ namespace Content.Server.Kitchen.EntitySystems return false; } - if (!Resolve(victimUid, ref butcherable, false) || butcherable.MeatPrototype == null) + if (!Resolve(victimUid, ref butcherable, false) || butcherable.SpawnedPrototype == null) { _popupSystem.PopupEntity(Loc.GetString("comp-kitchen-spike-deny-butcher", ("victim", victimUid), ("this", uid)), victimUid, Filter.Entities(userUid)); return false; @@ -180,6 +180,9 @@ namespace Content.Server.Kitchen.EntitySystems !Resolve(victimUid, ref butcherable) || butcherable.BeingButchered) return false; + if (butcherable.Type != ButcheringType.Spike) + return false; + // THE WHAT? (again) // Prevent dead from being spiked TODO: Maybe remove when rounds can be played and DOT is implemented if (Resolve(victimUid, ref mobState, false) && @@ -201,7 +204,7 @@ namespace Content.Server.Kitchen.EntitySystems butcherable.BeingButchered = true; component.InUse = true; - var doAfterArgs = new DoAfterEventArgs(userUid, component.SpikeDelay, default, uid) + var doAfterArgs = new DoAfterEventArgs(userUid, component.SpikeDelay + butcherable.ButcherDelay, default, uid) { BreakOnTargetMove = true, BreakOnUserMove = true, diff --git a/Content.Server/Kitchen/EntitySystems/SharpSystem.cs b/Content.Server/Kitchen/EntitySystems/SharpSystem.cs new file mode 100644 index 0000000000..75fff61dde --- /dev/null +++ b/Content.Server/Kitchen/EntitySystems/SharpSystem.cs @@ -0,0 +1,105 @@ +using Content.Server.DoAfter; +using Content.Server.Kitchen.Components; +using Content.Server.Popups; +using Content.Shared.Body.Components; +using Content.Shared.Interaction; +using Content.Shared.MobState.Components; +using Content.Shared.Nutrition.Components; +using Content.Shared.Popups; +using Robust.Shared.Player; + +namespace Content.Server.Kitchen.EntitySystems; + +public sealed class SharpSystem : EntitySystem +{ + [Dependency] private readonly DoAfterSystem _doAfterSystem = default!; + [Dependency] private readonly SharedPopupSystem _popupSystem = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnAfterInteract); + SubscribeLocalEvent(OnDoafterComplete); + SubscribeLocalEvent(OnDoafterCancelled); + } + + private void OnAfterInteract(EntityUid uid, SharpComponent component, AfterInteractEvent args) + { + if (args.Target is null || !TryComp(args.Target, out var butcher)) + return; + + if (butcher.Type != ButcheringType.Knife) + return; + + if (TryComp(args.Target, out var mobState) && !mobState.IsDead()) + return; + + if (!component.Butchering.Add(args.Target.Value)) + return; + + var doAfter = + new DoAfterEventArgs(args.User, component.ButcherDelayModifier * butcher.ButcherDelay, default, args.Target) + { + BreakOnTargetMove = true, + BreakOnUserMove = true, + BreakOnDamage = true, + BreakOnStun = true, + NeedHand = true, + BroadcastFinishedEvent = new SharpButcherDoafterComplete { User = args.User, Entity = args.Target.Value, Sharp = uid }, + BroadcastCancelledEvent = new SharpButcherDoafterCancelled { Entity = args.Target.Value, Sharp = uid } + }; + + _doAfterSystem.DoAfter(doAfter); + } + + private void OnDoafterComplete(SharpButcherDoafterComplete ev) + { + if (!TryComp(ev.Entity, out var butcher)) + return; + + if (!TryComp(ev.Sharp, out var sharp)) + return; + + sharp.Butchering.Remove(ev.Entity); + + EntityUid popupEnt = default; + for (int i = 0; i < butcher.Pieces; i++) + { + popupEnt = Spawn(butcher.SpawnedPrototype, Transform(ev.Entity).Coordinates); + } + + _popupSystem.PopupEntity(Loc.GetString("butcherable-knife-butchered-success", ("target", ev.Entity), ("knife", ev.Sharp)), + popupEnt, Filter.Entities(ev.User)); + + if (TryComp(ev.Entity, out var body)) + { + body.Gib(); + } + else + { + QueueDel(ev.Entity); + } + } + + private void OnDoafterCancelled(SharpButcherDoafterCancelled ev) + { + if (!TryComp(ev.Sharp, out var sharp)) + return; + + sharp.Butchering.Remove(ev.Entity); + } +} + +public sealed class SharpButcherDoafterComplete : EntityEventArgs +{ + public EntityUid Entity; + public EntityUid Sharp; + public EntityUid User; +} + +public sealed class SharpButcherDoafterCancelled : EntityEventArgs +{ + public EntityUid Entity; + public EntityUid Sharp; +} diff --git a/Content.Shared/Kitchen/Components/SharedKitchenSpikeComponent.cs b/Content.Shared/Kitchen/Components/SharedKitchenSpikeComponent.cs index 949b5d6683..a0af75b342 100644 --- a/Content.Shared/Kitchen/Components/SharedKitchenSpikeComponent.cs +++ b/Content.Shared/Kitchen/Components/SharedKitchenSpikeComponent.cs @@ -14,7 +14,7 @@ namespace Content.Shared.Kitchen.Components { [ViewVariables] [DataField("delay")] - public float SpikeDelay = 12.0f; + public float SpikeDelay = 7.0f; [ViewVariables(VVAccess.ReadWrite)] [DataField("sound")] diff --git a/Content.Shared/Nutrition/Components/SharedButcherableComponent.cs b/Content.Shared/Nutrition/Components/SharedButcherableComponent.cs index aeb8706613..a50b3e8aea 100644 --- a/Content.Shared/Nutrition/Components/SharedButcherableComponent.cs +++ b/Content.Shared/Nutrition/Components/SharedButcherableComponent.cs @@ -15,13 +15,19 @@ namespace Content.Shared.Nutrition.Components { //TODO: List for sub-products like animal-hides, organs and etc? [ViewVariables] - [DataField("meat", customTypeSerializer:typeof(PrototypeIdSerializer))] - public string MeatPrototype = "FoodMeat"; + [DataField("spawned", customTypeSerializer:typeof(PrototypeIdSerializer))] + public string SpawnedPrototype = "FoodMeat"; [ViewVariables] [DataField("pieces")] public int Pieces = 5; + [DataField("butcherDelay")] + public float ButcherDelay = 8.0f; + + [DataField("butcheringType")] + public ButcheringType Type = ButcheringType.Knife; + /// /// Prevents butchering same entity on two and more spikes simultaneously and multiple doAfters on the same Spike /// @@ -32,7 +38,14 @@ namespace Content.Shared.Nutrition.Components // CanDropOn behaviors as well (IDragDropOn) bool IDraggable.CanDrop(CanDropEvent args) { - return true; + return Type != ButcheringType.Knife; } } + + public enum ButcheringType + { + Knife, // e.g. goliaths + Spike, // e.g. monkeys + Gibber // e.g. humans. TODO + } } diff --git a/Resources/Locale/en-US/kitchen/components/butcherable-component.ftl b/Resources/Locale/en-US/kitchen/components/butcherable-component.ftl new file mode 100644 index 0000000000..1a5578d209 --- /dev/null +++ b/Resources/Locale/en-US/kitchen/components/butcherable-component.ftl @@ -0,0 +1 @@ +butcherable-knife-butchered-success = You butcher { THE($target) } with { THE($knife) }. diff --git a/Resources/Prototypes/Entities/Effects/puddle.yml b/Resources/Prototypes/Entities/Effects/puddle.yml index 9c9e625518..d003ec391a 100644 --- a/Resources/Prototypes/Entities/Effects/puddle.yml +++ b/Resources/Prototypes/Entities/Effects/puddle.yml @@ -100,6 +100,7 @@ netsync: false - type: Puddle slipThreshold: 20 + overflowVolume: 50 - type: Evaporation evaporateTime: 400 # very slow - type: Appearance diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml index dc0971a707..e988e72696 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml @@ -37,7 +37,7 @@ crit: dead dead: dead - type: Butcherable - meat: FoodMeat + spawned: FoodMeat pieces: 1 - type: InteractionPopup successChance: 0.2 @@ -132,7 +132,7 @@ crit: dead-0 dead: dead-0 - type: Butcherable - meat: FoodMeatChicken + spawned: FoodMeatChicken pieces: 1 - type: InteractionPopup successChance: 0.8 @@ -160,7 +160,7 @@ crit: dead-0 dead: dead-0 - type: Butcherable - meat: FoodMeatDuck + spawned: FoodMeatDuck pieces: 1 - type: InteractionPopup successChance: 0.9 @@ -188,7 +188,7 @@ crit: dead-1 dead: dead-1 - type: Butcherable - meat: FoodMeatDuck + spawned: FoodMeatDuck pieces: 1 - type: InteractionPopup successChance: 0.9 @@ -216,7 +216,7 @@ crit: dead-2 dead: dead-2 - type: Butcherable - meat: FoodMeatDuck + spawned: FoodMeatDuck pieces: 1 - type: InteractionPopup successChance: 0.9 @@ -321,7 +321,7 @@ quantity: 25 updateRate: 30 - type: Butcherable - meat: FoodMeat + spawned: FoodMeat pieces: 5 - type: Grammar attributes: @@ -365,7 +365,7 @@ dead: dead - type: AsteroidRockVisualizer - type: Butcherable - meat: FoodMeatCrab + spawned: FoodMeatCrab pieces: 2 - type: InteractionPopup successChance: 0.5 @@ -403,7 +403,7 @@ quantity: 25 updateRate: 20 - type: Butcherable - meat: FoodMeat + spawned: FoodMeat pieces: 4 - type: Grammar attributes: @@ -433,7 +433,7 @@ crit: dead dead: dead - type: Butcherable - meat: FoodMeatChicken + spawned: FoodMeatChicken pieces: 2 - type: InteractionPopup # TODO: Make it so there's a separate chance to make certain animals outright hostile towards you. successChance: 0.1 # Yeah, good luck with that. @@ -473,7 +473,7 @@ crit: dead dead: dead - type: Butcherable - meat: FoodMeat + spawned: FoodMeat pieces: 4 - type: entity @@ -581,7 +581,8 @@ sprite: Mobs/Effects/onfire.rsi normalState: Monkey_burning - type: Butcherable - meat: FoodMeat + butcheringType: Spike + spawned: FoodMeat pieces: 3 - type: MonkeyAccent @@ -645,7 +646,7 @@ - ReagentId: Nutriment Quantity: 5 - type: Butcherable - meat: FoodMeat + spawned: FoodMeat pieces: 1 - type: ReplacementAccent accent: mouse @@ -730,7 +731,7 @@ crit: dead dead: dead - type: Butcherable - meat: FoodMeat + spawned: FoodMeat pieces: 1 - type: InteractionPopup successChance: 0.3 @@ -773,7 +774,7 @@ crit: dead dead: dead - type: Butcherable - meat: FoodMeat + spawned: FoodMeat pieces: 1 - type: InteractionPopup successChance: 0.6 @@ -817,7 +818,7 @@ crit: dead dead: dead - type: Butcherable - meat: FoodMeat + spawned: FoodMeat pieces: 1 - type: InteractionPopup successChance: 0.6 @@ -857,7 +858,7 @@ crit: penguin_dead dead: penguin_dead - type: Butcherable - meat: FoodMeatPenguin + spawned: FoodMeatPenguin pieces: 3 - type: InteractionPopup successChance: 0.5 @@ -900,7 +901,7 @@ # dead: dead # crit: dead - type: Butcherable - meat: FoodMeat + spawned: FoodMeat pieces: 1 - type: InteractionPopup successChance: 0.6 @@ -942,7 +943,7 @@ crit: tarantula_dead dead: tarantula_dead - type: Butcherable - meat: FoodMeatSpider + spawned: FoodMeatSpider pieces: 2 - type: InteractionPopup successChance: 0.5 diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/carp.yml b/Resources/Prototypes/Entities/Mobs/NPCs/carp.yml index 7039f3956f..b48db3691c 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/carp.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/carp.yml @@ -43,7 +43,7 @@ crit: crit dead: dead - type: Butcherable - meat: FoodMeat # TODO: CrapMeat or FishMeat + spawned: FoodMeat # TODO: CrapMeat or FishMeat # - 2022-02-17 LMAO crap meat pieces: 2 - type: entity diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/pets.yml b/Resources/Prototypes/Entities/Mobs/NPCs/pets.yml index a03912a5d1..e53aa51d0c 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/pets.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/pets.yml @@ -34,7 +34,7 @@ crit: corgi_dead dead: corgi_dead - type: Butcherable - meat: FoodMeat + spawned: FoodMeat pieces: 3 - type: ReplacementAccent accent: dog @@ -211,7 +211,7 @@ crit: cat_dead dead: cat_dead - type: Butcherable - meat: FoodMeat + spawned: FoodMeat pieces: 2 - type: ReplacementAccent accent: cat @@ -333,7 +333,7 @@ crit: sloth_dead dead: sloth_dead - type: Butcherable - meat: FoodMeat + spawned: FoodMeat pieces: 3 - type: InteractionPopup successChance: 0.9 diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/xeno.yml b/Resources/Prototypes/Entities/Mobs/NPCs/xeno.yml index 0d70798f6f..9ad16c2e04 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/xeno.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/xeno.yml @@ -76,5 +76,6 @@ dead: dead - type: Puller - type: Butcherable - meat: FoodMeatXeno + spawned: FoodMeatXeno + butcheringType: Spike pieces: 5 diff --git a/Resources/Prototypes/Entities/Mobs/Species/human.yml b/Resources/Prototypes/Entities/Mobs/Species/human.yml index f436310a86..cb697a11fe 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/human.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/human.yml @@ -283,7 +283,8 @@ type: StrippableBoundUserInterface - type: Puller - type: Butcherable - meat: FoodMeat + butcheringType: Spike # TODO human. + spawned: FoodMeat - type: Recyclable safe: false - type: Speech diff --git a/Resources/Prototypes/Entities/Mobs/Species/slime.yml b/Resources/Prototypes/Entities/Mobs/Species/slime.yml index 175de37085..fa27bbf81f 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/slime.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/slime.yml @@ -135,7 +135,8 @@ messages: [ "slime-hurt-by-water-popup" ] probability: 0.25 - type: Butcherable - meat: FoodMeatSlime + butcheringType: Spike + spawned: FoodMeatSlime - type: entity save: false diff --git a/Resources/Prototypes/Entities/Mobs/Species/vox.yml b/Resources/Prototypes/Entities/Mobs/Species/vox.yml index 33c35a6bd8..a0afe576fc 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/vox.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/vox.yml @@ -110,4 +110,5 @@ - type: Inventory speciesId: vox - type: Butcherable - meat: FoodMeatChicken + butcheringType: Spike + spawned: FoodMeatChicken diff --git a/Resources/Prototypes/Entities/Objects/Specific/Hydroponics/tools.yml b/Resources/Prototypes/Entities/Objects/Specific/Hydroponics/tools.yml index 37c7158de6..2105cea2f7 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Hydroponics/tools.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Hydroponics/tools.yml @@ -45,9 +45,7 @@ id: HydroponicsToolScythe description: A sharp and curved blade on a long fibremetal handle, this tool makes it easy to reap what you sow. components: - - type: Tag - tags: - - BotanySharp + - type: Sharp - type: Sprite sprite: Objects/Tools/Hydroponics/scythe.rsi state: icon @@ -72,7 +70,7 @@ - type: Tag tags: - BotanyHatchet - - BotanySharp + - type: Sharp - type: Sprite sprite: Objects/Tools/Hydroponics/hatchet.rsi state: icon diff --git a/Resources/Prototypes/Entities/Objects/Specific/Medical/surgery.yml b/Resources/Prototypes/Entities/Objects/Specific/Medical/surgery.yml index e7344c2632..a18c1429f2 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Medical/surgery.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Medical/surgery.yml @@ -141,6 +141,7 @@ parent: BaseToolSurgery description: For cutting wood and other objects to pieces. Or sawing bones, in case of emergency. components: + - type: Sharp - type: Utensil types: - Knife diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/e_sword.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/e_sword.yml index b053cbef34..144de1e6d6 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/e_sword.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/e_sword.yml @@ -10,6 +10,7 @@ Slash: 12.5 Heat: 12.5 Blunt: -7 + - type: Sharp - type: Sprite sprite: Objects/Weapons/Melee/e_sword.rsi layers: diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/fireaxe.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/fireaxe.yml index ac7bf1f8fc..7232321727 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/fireaxe.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/fireaxe.yml @@ -7,6 +7,7 @@ - type: Tag tags: - FireAxe + - type: Sharp - type: Sprite sprite: Objects/Weapons/Melee/fireaxe.rsi state: icon diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/knife.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/knife.yml index 7e2296b5e5..476ece58d7 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/knife.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/knife.yml @@ -6,6 +6,7 @@ - type: Tag tags: - Knife + - type: Sharp - type: Utensil types: - Knife diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/spear.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/spear.yml index 1a7e0401e7..22b48afaa2 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/spear.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/spear.yml @@ -7,6 +7,7 @@ - type: Tag tags: - Spear + - type: Sharp - type: Sprite sprite: Objects/Weapons/Melee/spear.rsi state: spear diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/sword.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/sword.yml index 81f99c4fae..ef734865a3 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/sword.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/sword.yml @@ -4,6 +4,7 @@ id: CaptainSabre description: A ceremonial weapon belonging to the captain of the station. components: + - type: Sharp - type: Sprite sprite: Objects/Weapons/Melee/captain_sabre.rsi state: icon @@ -24,6 +25,7 @@ id: Katana description: Ancient craftwork made with not so ancient plasteel. components: + - type: Sharp - type: Tag tags: - Katana @@ -44,6 +46,7 @@ id: Machete description: A large, vicious looking blade. components: + - type: Sharp - type: Tag tags: - Machete @@ -64,6 +67,7 @@ id: Claymore description: An ancient war blade. components: + - type: Sharp - type: Sprite sprite: Objects/Weapons/Melee/claymore.rsi state: icon diff --git a/Resources/Prototypes/tags.yml b/Resources/Prototypes/tags.yml index 910c6da7f0..fdf7aaa21c 100644 --- a/Resources/Prototypes/tags.yml +++ b/Resources/Prototypes/tags.yml @@ -24,9 +24,6 @@ - type: Tag id: BotanyHoe -- type: Tag - id: BotanySharp - - type: Tag id: BotanyShovel