Add knife butchering and blood gibbing (#6770)
This commit is contained in:
@@ -71,6 +71,7 @@ namespace Content.Client.Entry
|
|||||||
"Stomach",
|
"Stomach",
|
||||||
"SpeedLoader",
|
"SpeedLoader",
|
||||||
"Hitscan",
|
"Hitscan",
|
||||||
|
"Sharp",
|
||||||
"StunOnCollide",
|
"StunOnCollide",
|
||||||
"ExaminableDamage",
|
"ExaminableDamage",
|
||||||
"RandomPottedPlant",
|
"RandomPottedPlant",
|
||||||
|
|||||||
@@ -102,7 +102,12 @@ namespace Content.Server.Body.Components
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_entMan.EventBus.RaiseLocalEvent(Owner, new BeingGibbedEvent(), false);
|
||||||
_entMan.QueueDeleteEntity(Owner);
|
_entMan.QueueDeleteEntity(Owner);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public sealed class BeingGibbedEvent : EntityEventArgs
|
||||||
|
{
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ public sealed class BloodstreamSystem : EntitySystem
|
|||||||
SubscribeLocalEvent<BloodstreamComponent, ComponentInit>(OnComponentInit);
|
SubscribeLocalEvent<BloodstreamComponent, ComponentInit>(OnComponentInit);
|
||||||
SubscribeLocalEvent<BloodstreamComponent, DamageChangedEvent>(OnDamageChanged);
|
SubscribeLocalEvent<BloodstreamComponent, DamageChangedEvent>(OnDamageChanged);
|
||||||
SubscribeLocalEvent<BloodstreamComponent, ExaminedEvent>(OnExamined);
|
SubscribeLocalEvent<BloodstreamComponent, ExaminedEvent>(OnExamined);
|
||||||
|
SubscribeLocalEvent<BloodstreamComponent, BeingGibbedEvent>(OnBeingGibbed);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void Update(float frameTime)
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Attempt to transfer provided solution to internal solution.
|
/// Attempt to transfer provided solution to internal solution.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -193,4 +199,22 @@ public sealed class BloodstreamSystem : EntitySystem
|
|||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// BLOOD FOR THE BLOOD GOD
|
||||||
|
/// </summary>
|
||||||
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ using Content.Server.Chemistry.EntitySystems;
|
|||||||
using Content.Server.Chemistry.Components;
|
using Content.Server.Chemistry.Components;
|
||||||
using Content.Server.Fluids.Components;
|
using Content.Server.Fluids.Components;
|
||||||
using Content.Server.Hands.Components;
|
using Content.Server.Hands.Components;
|
||||||
|
using Content.Server.Kitchen.Components;
|
||||||
using Content.Server.Plants;
|
using Content.Server.Plants;
|
||||||
using Content.Server.Popups;
|
using Content.Server.Popups;
|
||||||
using Content.Shared.ActionBlocker;
|
using Content.Shared.ActionBlocker;
|
||||||
@@ -802,9 +803,10 @@ namespace Content.Server.Botany.Components
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tagSystem.HasTag(usingItem, "BotanySharp"))
|
if (_entMan.HasComponent<SharpComponent>(usingItem))
|
||||||
{
|
{
|
||||||
return DoHarvest(user);
|
return DoHarvest(user);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_entMan.TryGetComponent<ProduceComponent?>(usingItem, out var produce))
|
if (_entMan.TryGetComponent<ProduceComponent?>(usingItem, out var produce))
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using Content.Server.Botany.Components;
|
using Content.Server.Botany.Components;
|
||||||
|
using Content.Server.Kitchen.Components;
|
||||||
using Content.Shared.Examine;
|
using Content.Shared.Examine;
|
||||||
using Content.Shared.Random.Helpers;
|
using Content.Shared.Random.Helpers;
|
||||||
using Content.Shared.Tag;
|
using Content.Shared.Tag;
|
||||||
@@ -136,7 +137,7 @@ public sealed partial class BotanySystem
|
|||||||
|
|
||||||
public bool CanHarvest(SeedPrototype proto, EntityUid? held = null)
|
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<SharpComponent>(held);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
using Content.Server.Botany.Components;
|
using Content.Server.Botany.Components;
|
||||||
|
using Content.Server.Kitchen.Components;
|
||||||
using Content.Shared.ActionBlocker;
|
using Content.Shared.ActionBlocker;
|
||||||
using Content.Shared.Interaction;
|
using Content.Shared.Interaction;
|
||||||
using Content.Shared.Random.Helpers;
|
using Content.Shared.Random.Helpers;
|
||||||
@@ -9,8 +10,6 @@ namespace Content.Server.Botany.Systems;
|
|||||||
|
|
||||||
public sealed class LogSystem : EntitySystem
|
public sealed class LogSystem : EntitySystem
|
||||||
{
|
{
|
||||||
[Dependency] private readonly TagSystem _tags = default!;
|
|
||||||
|
|
||||||
public override void Initialize()
|
public override void Initialize()
|
||||||
{
|
{
|
||||||
base.Initialize();
|
base.Initialize();
|
||||||
@@ -20,7 +19,7 @@ public sealed class LogSystem : EntitySystem
|
|||||||
|
|
||||||
private void OnInteractUsing(EntityUid uid, LogComponent component, InteractUsingEvent args)
|
private void OnInteractUsing(EntityUid uid, LogComponent component, InteractUsingEvent args)
|
||||||
{
|
{
|
||||||
if (_tags.HasTag(args.Used, "BotanySharp"))
|
if (HasComp<SharpComponent>(args.Used))
|
||||||
{
|
{
|
||||||
for (var i = 0; i < component.SpawnCount; i++)
|
for (var i = 0; i < component.SpawnCount; i++)
|
||||||
{
|
{
|
||||||
|
|||||||
14
Content.Server/Kitchen/Components/SharpComponent.cs
Normal file
14
Content.Server/Kitchen/Components/SharpComponent.cs
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
namespace Content.Server.Kitchen.Components;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Applies to items that are capable of butchering entities, or
|
||||||
|
/// are otherwise sharp for some purpose.
|
||||||
|
/// </summary>
|
||||||
|
[RegisterComponent]
|
||||||
|
public sealed class SharpComponent : Component
|
||||||
|
{
|
||||||
|
public HashSet<EntityUid> Butchering = new();
|
||||||
|
|
||||||
|
[DataField("butcherDelayModifier")]
|
||||||
|
public float ButcherDelayModifier = 1.0f;
|
||||||
|
}
|
||||||
@@ -92,7 +92,7 @@ namespace Content.Server.Kitchen.EntitySystems
|
|||||||
if (!Resolve(uid, ref component) || !Resolve(victimUid, ref butcherable))
|
if (!Resolve(uid, ref component) || !Resolve(victimUid, ref butcherable))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
component.MeatPrototype = butcherable.MeatPrototype;
|
component.MeatPrototype = butcherable.SpawnedPrototype;
|
||||||
component.MeatParts = butcherable.Pieces;
|
component.MeatParts = butcherable.Pieces;
|
||||||
|
|
||||||
// This feels not okay, but entity is getting deleted on "Spike", for now...
|
// This feels not okay, but entity is getting deleted on "Spike", for now...
|
||||||
@@ -164,7 +164,7 @@ namespace Content.Server.Kitchen.EntitySystems
|
|||||||
return false;
|
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));
|
_popupSystem.PopupEntity(Loc.GetString("comp-kitchen-spike-deny-butcher", ("victim", victimUid), ("this", uid)), victimUid, Filter.Entities(userUid));
|
||||||
return false;
|
return false;
|
||||||
@@ -180,6 +180,9 @@ namespace Content.Server.Kitchen.EntitySystems
|
|||||||
!Resolve(victimUid, ref butcherable) || butcherable.BeingButchered)
|
!Resolve(victimUid, ref butcherable) || butcherable.BeingButchered)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
if (butcherable.Type != ButcheringType.Spike)
|
||||||
|
return false;
|
||||||
|
|
||||||
// THE WHAT? (again)
|
// THE WHAT? (again)
|
||||||
// Prevent dead from being spiked TODO: Maybe remove when rounds can be played and DOT is implemented
|
// Prevent dead from being spiked TODO: Maybe remove when rounds can be played and DOT is implemented
|
||||||
if (Resolve(victimUid, ref mobState, false) &&
|
if (Resolve(victimUid, ref mobState, false) &&
|
||||||
@@ -201,7 +204,7 @@ namespace Content.Server.Kitchen.EntitySystems
|
|||||||
butcherable.BeingButchered = true;
|
butcherable.BeingButchered = true;
|
||||||
component.InUse = 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,
|
BreakOnTargetMove = true,
|
||||||
BreakOnUserMove = true,
|
BreakOnUserMove = true,
|
||||||
|
|||||||
105
Content.Server/Kitchen/EntitySystems/SharpSystem.cs
Normal file
105
Content.Server/Kitchen/EntitySystems/SharpSystem.cs
Normal file
@@ -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<SharpComponent, AfterInteractEvent>(OnAfterInteract);
|
||||||
|
SubscribeLocalEvent<SharpButcherDoafterComplete>(OnDoafterComplete);
|
||||||
|
SubscribeLocalEvent<SharpButcherDoafterCancelled>(OnDoafterCancelled);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnAfterInteract(EntityUid uid, SharpComponent component, AfterInteractEvent args)
|
||||||
|
{
|
||||||
|
if (args.Target is null || !TryComp<SharedButcherableComponent>(args.Target, out var butcher))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (butcher.Type != ButcheringType.Knife)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (TryComp<MobStateComponent>(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<SharedButcherableComponent>(ev.Entity, out var butcher))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!TryComp<SharpComponent>(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<SharedBodyComponent>(ev.Entity, out var body))
|
||||||
|
{
|
||||||
|
body.Gib();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
QueueDel(ev.Entity);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnDoafterCancelled(SharpButcherDoafterCancelled ev)
|
||||||
|
{
|
||||||
|
if (!TryComp<SharpComponent>(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;
|
||||||
|
}
|
||||||
@@ -14,7 +14,7 @@ namespace Content.Shared.Kitchen.Components
|
|||||||
{
|
{
|
||||||
[ViewVariables]
|
[ViewVariables]
|
||||||
[DataField("delay")]
|
[DataField("delay")]
|
||||||
public float SpikeDelay = 12.0f;
|
public float SpikeDelay = 7.0f;
|
||||||
|
|
||||||
[ViewVariables(VVAccess.ReadWrite)]
|
[ViewVariables(VVAccess.ReadWrite)]
|
||||||
[DataField("sound")]
|
[DataField("sound")]
|
||||||
|
|||||||
@@ -15,13 +15,19 @@ namespace Content.Shared.Nutrition.Components
|
|||||||
{
|
{
|
||||||
//TODO: List for sub-products like animal-hides, organs and etc?
|
//TODO: List for sub-products like animal-hides, organs and etc?
|
||||||
[ViewVariables]
|
[ViewVariables]
|
||||||
[DataField("meat", customTypeSerializer:typeof(PrototypeIdSerializer<EntityPrototype>))]
|
[DataField("spawned", customTypeSerializer:typeof(PrototypeIdSerializer<EntityPrototype>))]
|
||||||
public string MeatPrototype = "FoodMeat";
|
public string SpawnedPrototype = "FoodMeat";
|
||||||
|
|
||||||
[ViewVariables]
|
[ViewVariables]
|
||||||
[DataField("pieces")]
|
[DataField("pieces")]
|
||||||
public int Pieces = 5;
|
public int Pieces = 5;
|
||||||
|
|
||||||
|
[DataField("butcherDelay")]
|
||||||
|
public float ButcherDelay = 8.0f;
|
||||||
|
|
||||||
|
[DataField("butcheringType")]
|
||||||
|
public ButcheringType Type = ButcheringType.Knife;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Prevents butchering same entity on two and more spikes simultaneously and multiple doAfters on the same Spike
|
/// Prevents butchering same entity on two and more spikes simultaneously and multiple doAfters on the same Spike
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -32,7 +38,14 @@ namespace Content.Shared.Nutrition.Components
|
|||||||
// CanDropOn behaviors as well (IDragDropOn)
|
// CanDropOn behaviors as well (IDragDropOn)
|
||||||
bool IDraggable.CanDrop(CanDropEvent args)
|
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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
butcherable-knife-butchered-success = You butcher { THE($target) } with { THE($knife) }.
|
||||||
@@ -100,6 +100,7 @@
|
|||||||
netsync: false
|
netsync: false
|
||||||
- type: Puddle
|
- type: Puddle
|
||||||
slipThreshold: 20
|
slipThreshold: 20
|
||||||
|
overflowVolume: 50
|
||||||
- type: Evaporation
|
- type: Evaporation
|
||||||
evaporateTime: 400 # very slow
|
evaporateTime: 400 # very slow
|
||||||
- type: Appearance
|
- type: Appearance
|
||||||
|
|||||||
@@ -37,7 +37,7 @@
|
|||||||
crit: dead
|
crit: dead
|
||||||
dead: dead
|
dead: dead
|
||||||
- type: Butcherable
|
- type: Butcherable
|
||||||
meat: FoodMeat
|
spawned: FoodMeat
|
||||||
pieces: 1
|
pieces: 1
|
||||||
- type: InteractionPopup
|
- type: InteractionPopup
|
||||||
successChance: 0.2
|
successChance: 0.2
|
||||||
@@ -132,7 +132,7 @@
|
|||||||
crit: dead-0
|
crit: dead-0
|
||||||
dead: dead-0
|
dead: dead-0
|
||||||
- type: Butcherable
|
- type: Butcherable
|
||||||
meat: FoodMeatChicken
|
spawned: FoodMeatChicken
|
||||||
pieces: 1
|
pieces: 1
|
||||||
- type: InteractionPopup
|
- type: InteractionPopup
|
||||||
successChance: 0.8
|
successChance: 0.8
|
||||||
@@ -160,7 +160,7 @@
|
|||||||
crit: dead-0
|
crit: dead-0
|
||||||
dead: dead-0
|
dead: dead-0
|
||||||
- type: Butcherable
|
- type: Butcherable
|
||||||
meat: FoodMeatDuck
|
spawned: FoodMeatDuck
|
||||||
pieces: 1
|
pieces: 1
|
||||||
- type: InteractionPopup
|
- type: InteractionPopup
|
||||||
successChance: 0.9
|
successChance: 0.9
|
||||||
@@ -188,7 +188,7 @@
|
|||||||
crit: dead-1
|
crit: dead-1
|
||||||
dead: dead-1
|
dead: dead-1
|
||||||
- type: Butcherable
|
- type: Butcherable
|
||||||
meat: FoodMeatDuck
|
spawned: FoodMeatDuck
|
||||||
pieces: 1
|
pieces: 1
|
||||||
- type: InteractionPopup
|
- type: InteractionPopup
|
||||||
successChance: 0.9
|
successChance: 0.9
|
||||||
@@ -216,7 +216,7 @@
|
|||||||
crit: dead-2
|
crit: dead-2
|
||||||
dead: dead-2
|
dead: dead-2
|
||||||
- type: Butcherable
|
- type: Butcherable
|
||||||
meat: FoodMeatDuck
|
spawned: FoodMeatDuck
|
||||||
pieces: 1
|
pieces: 1
|
||||||
- type: InteractionPopup
|
- type: InteractionPopup
|
||||||
successChance: 0.9
|
successChance: 0.9
|
||||||
@@ -321,7 +321,7 @@
|
|||||||
quantity: 25
|
quantity: 25
|
||||||
updateRate: 30
|
updateRate: 30
|
||||||
- type: Butcherable
|
- type: Butcherable
|
||||||
meat: FoodMeat
|
spawned: FoodMeat
|
||||||
pieces: 5
|
pieces: 5
|
||||||
- type: Grammar
|
- type: Grammar
|
||||||
attributes:
|
attributes:
|
||||||
@@ -365,7 +365,7 @@
|
|||||||
dead: dead
|
dead: dead
|
||||||
- type: AsteroidRockVisualizer
|
- type: AsteroidRockVisualizer
|
||||||
- type: Butcherable
|
- type: Butcherable
|
||||||
meat: FoodMeatCrab
|
spawned: FoodMeatCrab
|
||||||
pieces: 2
|
pieces: 2
|
||||||
- type: InteractionPopup
|
- type: InteractionPopup
|
||||||
successChance: 0.5
|
successChance: 0.5
|
||||||
@@ -403,7 +403,7 @@
|
|||||||
quantity: 25
|
quantity: 25
|
||||||
updateRate: 20
|
updateRate: 20
|
||||||
- type: Butcherable
|
- type: Butcherable
|
||||||
meat: FoodMeat
|
spawned: FoodMeat
|
||||||
pieces: 4
|
pieces: 4
|
||||||
- type: Grammar
|
- type: Grammar
|
||||||
attributes:
|
attributes:
|
||||||
@@ -433,7 +433,7 @@
|
|||||||
crit: dead
|
crit: dead
|
||||||
dead: dead
|
dead: dead
|
||||||
- type: Butcherable
|
- type: Butcherable
|
||||||
meat: FoodMeatChicken
|
spawned: FoodMeatChicken
|
||||||
pieces: 2
|
pieces: 2
|
||||||
- type: InteractionPopup # TODO: Make it so there's a separate chance to make certain animals outright hostile towards you.
|
- 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.
|
successChance: 0.1 # Yeah, good luck with that.
|
||||||
@@ -473,7 +473,7 @@
|
|||||||
crit: dead
|
crit: dead
|
||||||
dead: dead
|
dead: dead
|
||||||
- type: Butcherable
|
- type: Butcherable
|
||||||
meat: FoodMeat
|
spawned: FoodMeat
|
||||||
pieces: 4
|
pieces: 4
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
@@ -581,7 +581,8 @@
|
|||||||
sprite: Mobs/Effects/onfire.rsi
|
sprite: Mobs/Effects/onfire.rsi
|
||||||
normalState: Monkey_burning
|
normalState: Monkey_burning
|
||||||
- type: Butcherable
|
- type: Butcherable
|
||||||
meat: FoodMeat
|
butcheringType: Spike
|
||||||
|
spawned: FoodMeat
|
||||||
pieces: 3
|
pieces: 3
|
||||||
- type: MonkeyAccent
|
- type: MonkeyAccent
|
||||||
|
|
||||||
@@ -645,7 +646,7 @@
|
|||||||
- ReagentId: Nutriment
|
- ReagentId: Nutriment
|
||||||
Quantity: 5
|
Quantity: 5
|
||||||
- type: Butcherable
|
- type: Butcherable
|
||||||
meat: FoodMeat
|
spawned: FoodMeat
|
||||||
pieces: 1
|
pieces: 1
|
||||||
- type: ReplacementAccent
|
- type: ReplacementAccent
|
||||||
accent: mouse
|
accent: mouse
|
||||||
@@ -730,7 +731,7 @@
|
|||||||
crit: dead
|
crit: dead
|
||||||
dead: dead
|
dead: dead
|
||||||
- type: Butcherable
|
- type: Butcherable
|
||||||
meat: FoodMeat
|
spawned: FoodMeat
|
||||||
pieces: 1
|
pieces: 1
|
||||||
- type: InteractionPopup
|
- type: InteractionPopup
|
||||||
successChance: 0.3
|
successChance: 0.3
|
||||||
@@ -773,7 +774,7 @@
|
|||||||
crit: dead
|
crit: dead
|
||||||
dead: dead
|
dead: dead
|
||||||
- type: Butcherable
|
- type: Butcherable
|
||||||
meat: FoodMeat
|
spawned: FoodMeat
|
||||||
pieces: 1
|
pieces: 1
|
||||||
- type: InteractionPopup
|
- type: InteractionPopup
|
||||||
successChance: 0.6
|
successChance: 0.6
|
||||||
@@ -817,7 +818,7 @@
|
|||||||
crit: dead
|
crit: dead
|
||||||
dead: dead
|
dead: dead
|
||||||
- type: Butcherable
|
- type: Butcherable
|
||||||
meat: FoodMeat
|
spawned: FoodMeat
|
||||||
pieces: 1
|
pieces: 1
|
||||||
- type: InteractionPopup
|
- type: InteractionPopup
|
||||||
successChance: 0.6
|
successChance: 0.6
|
||||||
@@ -857,7 +858,7 @@
|
|||||||
crit: penguin_dead
|
crit: penguin_dead
|
||||||
dead: penguin_dead
|
dead: penguin_dead
|
||||||
- type: Butcherable
|
- type: Butcherable
|
||||||
meat: FoodMeatPenguin
|
spawned: FoodMeatPenguin
|
||||||
pieces: 3
|
pieces: 3
|
||||||
- type: InteractionPopup
|
- type: InteractionPopup
|
||||||
successChance: 0.5
|
successChance: 0.5
|
||||||
@@ -900,7 +901,7 @@
|
|||||||
# dead: dead
|
# dead: dead
|
||||||
# crit: dead
|
# crit: dead
|
||||||
- type: Butcherable
|
- type: Butcherable
|
||||||
meat: FoodMeat
|
spawned: FoodMeat
|
||||||
pieces: 1
|
pieces: 1
|
||||||
- type: InteractionPopup
|
- type: InteractionPopup
|
||||||
successChance: 0.6
|
successChance: 0.6
|
||||||
@@ -942,7 +943,7 @@
|
|||||||
crit: tarantula_dead
|
crit: tarantula_dead
|
||||||
dead: tarantula_dead
|
dead: tarantula_dead
|
||||||
- type: Butcherable
|
- type: Butcherable
|
||||||
meat: FoodMeatSpider
|
spawned: FoodMeatSpider
|
||||||
pieces: 2
|
pieces: 2
|
||||||
- type: InteractionPopup
|
- type: InteractionPopup
|
||||||
successChance: 0.5
|
successChance: 0.5
|
||||||
|
|||||||
@@ -43,7 +43,7 @@
|
|||||||
crit: crit
|
crit: crit
|
||||||
dead: dead
|
dead: dead
|
||||||
- type: Butcherable
|
- type: Butcherable
|
||||||
meat: FoodMeat # TODO: CrapMeat or FishMeat
|
spawned: FoodMeat # TODO: CrapMeat or FishMeat # - 2022-02-17 LMAO crap meat
|
||||||
pieces: 2
|
pieces: 2
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
|
|||||||
@@ -34,7 +34,7 @@
|
|||||||
crit: corgi_dead
|
crit: corgi_dead
|
||||||
dead: corgi_dead
|
dead: corgi_dead
|
||||||
- type: Butcherable
|
- type: Butcherable
|
||||||
meat: FoodMeat
|
spawned: FoodMeat
|
||||||
pieces: 3
|
pieces: 3
|
||||||
- type: ReplacementAccent
|
- type: ReplacementAccent
|
||||||
accent: dog
|
accent: dog
|
||||||
@@ -211,7 +211,7 @@
|
|||||||
crit: cat_dead
|
crit: cat_dead
|
||||||
dead: cat_dead
|
dead: cat_dead
|
||||||
- type: Butcherable
|
- type: Butcherable
|
||||||
meat: FoodMeat
|
spawned: FoodMeat
|
||||||
pieces: 2
|
pieces: 2
|
||||||
- type: ReplacementAccent
|
- type: ReplacementAccent
|
||||||
accent: cat
|
accent: cat
|
||||||
@@ -333,7 +333,7 @@
|
|||||||
crit: sloth_dead
|
crit: sloth_dead
|
||||||
dead: sloth_dead
|
dead: sloth_dead
|
||||||
- type: Butcherable
|
- type: Butcherable
|
||||||
meat: FoodMeat
|
spawned: FoodMeat
|
||||||
pieces: 3
|
pieces: 3
|
||||||
- type: InteractionPopup
|
- type: InteractionPopup
|
||||||
successChance: 0.9
|
successChance: 0.9
|
||||||
|
|||||||
@@ -76,5 +76,6 @@
|
|||||||
dead: dead
|
dead: dead
|
||||||
- type: Puller
|
- type: Puller
|
||||||
- type: Butcherable
|
- type: Butcherable
|
||||||
meat: FoodMeatXeno
|
spawned: FoodMeatXeno
|
||||||
|
butcheringType: Spike
|
||||||
pieces: 5
|
pieces: 5
|
||||||
|
|||||||
@@ -283,7 +283,8 @@
|
|||||||
type: StrippableBoundUserInterface
|
type: StrippableBoundUserInterface
|
||||||
- type: Puller
|
- type: Puller
|
||||||
- type: Butcherable
|
- type: Butcherable
|
||||||
meat: FoodMeat
|
butcheringType: Spike # TODO human.
|
||||||
|
spawned: FoodMeat
|
||||||
- type: Recyclable
|
- type: Recyclable
|
||||||
safe: false
|
safe: false
|
||||||
- type: Speech
|
- type: Speech
|
||||||
|
|||||||
@@ -135,7 +135,8 @@
|
|||||||
messages: [ "slime-hurt-by-water-popup" ]
|
messages: [ "slime-hurt-by-water-popup" ]
|
||||||
probability: 0.25
|
probability: 0.25
|
||||||
- type: Butcherable
|
- type: Butcherable
|
||||||
meat: FoodMeatSlime
|
butcheringType: Spike
|
||||||
|
spawned: FoodMeatSlime
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
save: false
|
save: false
|
||||||
|
|||||||
@@ -110,4 +110,5 @@
|
|||||||
- type: Inventory
|
- type: Inventory
|
||||||
speciesId: vox
|
speciesId: vox
|
||||||
- type: Butcherable
|
- type: Butcherable
|
||||||
meat: FoodMeatChicken
|
butcheringType: Spike
|
||||||
|
spawned: FoodMeatChicken
|
||||||
|
|||||||
@@ -45,9 +45,7 @@
|
|||||||
id: HydroponicsToolScythe
|
id: HydroponicsToolScythe
|
||||||
description: A sharp and curved blade on a long fibremetal handle, this tool makes it easy to reap what you sow.
|
description: A sharp and curved blade on a long fibremetal handle, this tool makes it easy to reap what you sow.
|
||||||
components:
|
components:
|
||||||
- type: Tag
|
- type: Sharp
|
||||||
tags:
|
|
||||||
- BotanySharp
|
|
||||||
- type: Sprite
|
- type: Sprite
|
||||||
sprite: Objects/Tools/Hydroponics/scythe.rsi
|
sprite: Objects/Tools/Hydroponics/scythe.rsi
|
||||||
state: icon
|
state: icon
|
||||||
@@ -72,7 +70,7 @@
|
|||||||
- type: Tag
|
- type: Tag
|
||||||
tags:
|
tags:
|
||||||
- BotanyHatchet
|
- BotanyHatchet
|
||||||
- BotanySharp
|
- type: Sharp
|
||||||
- type: Sprite
|
- type: Sprite
|
||||||
sprite: Objects/Tools/Hydroponics/hatchet.rsi
|
sprite: Objects/Tools/Hydroponics/hatchet.rsi
|
||||||
state: icon
|
state: icon
|
||||||
|
|||||||
@@ -141,6 +141,7 @@
|
|||||||
parent: BaseToolSurgery
|
parent: BaseToolSurgery
|
||||||
description: For cutting wood and other objects to pieces. Or sawing bones, in case of emergency.
|
description: For cutting wood and other objects to pieces. Or sawing bones, in case of emergency.
|
||||||
components:
|
components:
|
||||||
|
- type: Sharp
|
||||||
- type: Utensil
|
- type: Utensil
|
||||||
types:
|
types:
|
||||||
- Knife
|
- Knife
|
||||||
|
|||||||
@@ -10,6 +10,7 @@
|
|||||||
Slash: 12.5
|
Slash: 12.5
|
||||||
Heat: 12.5
|
Heat: 12.5
|
||||||
Blunt: -7
|
Blunt: -7
|
||||||
|
- type: Sharp
|
||||||
- type: Sprite
|
- type: Sprite
|
||||||
sprite: Objects/Weapons/Melee/e_sword.rsi
|
sprite: Objects/Weapons/Melee/e_sword.rsi
|
||||||
layers:
|
layers:
|
||||||
|
|||||||
@@ -7,6 +7,7 @@
|
|||||||
- type: Tag
|
- type: Tag
|
||||||
tags:
|
tags:
|
||||||
- FireAxe
|
- FireAxe
|
||||||
|
- type: Sharp
|
||||||
- type: Sprite
|
- type: Sprite
|
||||||
sprite: Objects/Weapons/Melee/fireaxe.rsi
|
sprite: Objects/Weapons/Melee/fireaxe.rsi
|
||||||
state: icon
|
state: icon
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
- type: Tag
|
- type: Tag
|
||||||
tags:
|
tags:
|
||||||
- Knife
|
- Knife
|
||||||
|
- type: Sharp
|
||||||
- type: Utensil
|
- type: Utensil
|
||||||
types:
|
types:
|
||||||
- Knife
|
- Knife
|
||||||
|
|||||||
@@ -7,6 +7,7 @@
|
|||||||
- type: Tag
|
- type: Tag
|
||||||
tags:
|
tags:
|
||||||
- Spear
|
- Spear
|
||||||
|
- type: Sharp
|
||||||
- type: Sprite
|
- type: Sprite
|
||||||
sprite: Objects/Weapons/Melee/spear.rsi
|
sprite: Objects/Weapons/Melee/spear.rsi
|
||||||
state: spear
|
state: spear
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
id: CaptainSabre
|
id: CaptainSabre
|
||||||
description: A ceremonial weapon belonging to the captain of the station.
|
description: A ceremonial weapon belonging to the captain of the station.
|
||||||
components:
|
components:
|
||||||
|
- type: Sharp
|
||||||
- type: Sprite
|
- type: Sprite
|
||||||
sprite: Objects/Weapons/Melee/captain_sabre.rsi
|
sprite: Objects/Weapons/Melee/captain_sabre.rsi
|
||||||
state: icon
|
state: icon
|
||||||
@@ -24,6 +25,7 @@
|
|||||||
id: Katana
|
id: Katana
|
||||||
description: Ancient craftwork made with not so ancient plasteel.
|
description: Ancient craftwork made with not so ancient plasteel.
|
||||||
components:
|
components:
|
||||||
|
- type: Sharp
|
||||||
- type: Tag
|
- type: Tag
|
||||||
tags:
|
tags:
|
||||||
- Katana
|
- Katana
|
||||||
@@ -44,6 +46,7 @@
|
|||||||
id: Machete
|
id: Machete
|
||||||
description: A large, vicious looking blade.
|
description: A large, vicious looking blade.
|
||||||
components:
|
components:
|
||||||
|
- type: Sharp
|
||||||
- type: Tag
|
- type: Tag
|
||||||
tags:
|
tags:
|
||||||
- Machete
|
- Machete
|
||||||
@@ -64,6 +67,7 @@
|
|||||||
id: Claymore
|
id: Claymore
|
||||||
description: An ancient war blade.
|
description: An ancient war blade.
|
||||||
components:
|
components:
|
||||||
|
- type: Sharp
|
||||||
- type: Sprite
|
- type: Sprite
|
||||||
sprite: Objects/Weapons/Melee/claymore.rsi
|
sprite: Objects/Weapons/Melee/claymore.rsi
|
||||||
state: icon
|
state: icon
|
||||||
|
|||||||
@@ -24,9 +24,6 @@
|
|||||||
- type: Tag
|
- type: Tag
|
||||||
id: BotanyHoe
|
id: BotanyHoe
|
||||||
|
|
||||||
- type: Tag
|
|
||||||
id: BotanySharp
|
|
||||||
|
|
||||||
- type: Tag
|
- type: Tag
|
||||||
id: BotanyShovel
|
id: BotanyShovel
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user