Jumpsuit butchering and gauze crafting (#6787)
Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com>
This commit is contained in:
@@ -6,6 +6,7 @@ using Content.Shared.Interaction;
|
||||
using Content.Shared.MobState.Components;
|
||||
using Content.Shared.Nutrition.Components;
|
||||
using Content.Shared.Popups;
|
||||
using Content.Shared.Verbs;
|
||||
using Robust.Shared.Player;
|
||||
|
||||
namespace Content.Server.Kitchen.EntitySystems;
|
||||
@@ -22,35 +23,45 @@ public sealed class SharpSystem : EntitySystem
|
||||
SubscribeLocalEvent<SharpComponent, AfterInteractEvent>(OnAfterInteract);
|
||||
SubscribeLocalEvent<SharpButcherDoafterComplete>(OnDoafterComplete);
|
||||
SubscribeLocalEvent<SharpButcherDoafterCancelled>(OnDoafterCancelled);
|
||||
|
||||
SubscribeLocalEvent<SharedButcherableComponent, GetVerbsEvent<InteractionVerb>>(OnGetInteractionVerbs);
|
||||
}
|
||||
|
||||
private void OnAfterInteract(EntityUid uid, SharpComponent component, AfterInteractEvent args)
|
||||
{
|
||||
if (!args.CanReach)
|
||||
if (args.Target is null || !args.CanReach)
|
||||
return;
|
||||
|
||||
if (args.Target is null || !TryComp<SharedButcherableComponent>(args.Target, out var butcher))
|
||||
|
||||
TryStartButcherDoafter(uid, args.Target.Value, args.User);
|
||||
}
|
||||
|
||||
private void TryStartButcherDoafter(EntityUid knife, EntityUid target, EntityUid user)
|
||||
{
|
||||
if (!TryComp<SharedButcherableComponent>(target, out var butcher))
|
||||
return;
|
||||
|
||||
if (!TryComp<SharpComponent>(knife, out var sharp))
|
||||
return;
|
||||
|
||||
if (butcher.Type != ButcheringType.Knife)
|
||||
return;
|
||||
|
||||
if (TryComp<MobStateComponent>(args.Target, out var mobState) && !mobState.IsDead())
|
||||
if (TryComp<MobStateComponent>(target, out var mobState) && !mobState.IsDead())
|
||||
return;
|
||||
|
||||
if (!component.Butchering.Add(args.Target.Value))
|
||||
if (!sharp.Butchering.Add(target))
|
||||
return;
|
||||
|
||||
var doAfter =
|
||||
new DoAfterEventArgs(args.User, component.ButcherDelayModifier * butcher.ButcherDelay, default, args.Target)
|
||||
new DoAfterEventArgs(user, sharp.ButcherDelayModifier * butcher.ButcherDelay, default, 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 }
|
||||
BroadcastFinishedEvent = new SharpButcherDoafterComplete { User = user, Entity = target, Sharp = knife },
|
||||
BroadcastCancelledEvent = new SharpButcherDoafterCancelled { Entity = target, Sharp = knife }
|
||||
};
|
||||
|
||||
_doAfterSystem.DoAfter(doAfter);
|
||||
@@ -92,6 +103,42 @@ public sealed class SharpSystem : EntitySystem
|
||||
|
||||
sharp.Butchering.Remove(ev.Entity);
|
||||
}
|
||||
|
||||
private void OnGetInteractionVerbs(EntityUid uid, SharedButcherableComponent component, GetVerbsEvent<InteractionVerb> args)
|
||||
{
|
||||
if (component.Type != ButcheringType.Knife)
|
||||
return;
|
||||
|
||||
bool disabled = false;
|
||||
string? message = null;
|
||||
|
||||
if (TryComp<MobStateComponent>(uid, out var state) && !state.IsDead())
|
||||
{
|
||||
disabled = true;
|
||||
message = Loc.GetString("butcherable-mob-isnt-dead");
|
||||
}
|
||||
|
||||
if (args.Using is null || !TryComp<SharpComponent>(args.Using, out var sharp))
|
||||
{
|
||||
disabled = true;
|
||||
message = Loc.GetString("butcherable-need-knife");
|
||||
}
|
||||
|
||||
InteractionVerb verb = new()
|
||||
{
|
||||
Act = () =>
|
||||
{
|
||||
if (!disabled)
|
||||
TryStartButcherDoafter(args.Using!.Value, args.Target, args.User);
|
||||
},
|
||||
Message = message,
|
||||
Disabled = disabled,
|
||||
IconTexture = "/Textures/Interface/VerbIcons/cutlery.svg.192dpi.png",
|
||||
Text = Loc.GetString("butcherable-verb-name"),
|
||||
};
|
||||
|
||||
args.Verbs.Add(verb);
|
||||
}
|
||||
}
|
||||
|
||||
public sealed class SharpButcherDoafterComplete : EntityEventArgs
|
||||
|
||||
Reference in New Issue
Block a user