Add face bandanas (#24597)
* add face bandanas * oops * make face bandanas butcherable, also one bite * oops * Add mouth IdentityBlocker to bandanas * refactor to use foldablecomponent * remove some leftover bits * remove HamsterWearable until face sprite updated * oops * review changes * remove a few unneeded bits
This commit is contained in:
@@ -64,7 +64,7 @@ public sealed partial class ToggleMaskEvent : InstantActionEvent { }
|
||||
/// Event raised on the mask entity when it is toggled.
|
||||
/// </summary>
|
||||
[ByRefEvent]
|
||||
public readonly record struct ItemMaskToggledEvent(EntityUid Wearer, bool IsToggled, bool IsEquip);
|
||||
public readonly record struct ItemMaskToggledEvent(EntityUid Wearer, string? equippedPrefix, bool IsToggled, bool IsEquip);
|
||||
|
||||
/// <summary>
|
||||
/// Event raised on the entity wearing the mask when it is toggled.
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
using Content.Shared.Inventory;
|
||||
using Robust.Shared.GameStates;
|
||||
|
||||
namespace Content.Shared.Clothing.Components;
|
||||
|
||||
[RegisterComponent, NetworkedComponent]
|
||||
public sealed partial class FoldableClothingComponent : Component
|
||||
{
|
||||
/// <summary>
|
||||
/// Which slots does this fit into when folded?
|
||||
/// </summary>
|
||||
[DataField]
|
||||
public SlotFlags? FoldedSlots;
|
||||
|
||||
/// <summary>
|
||||
/// Which slots does this fit into when unfolded?
|
||||
/// </summary>
|
||||
[DataField]
|
||||
public SlotFlags? UnfoldedSlots;
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
using Content.Shared.Clothing.EntitySystems;
|
||||
using Content.Shared.Clothing.EntitySystems;
|
||||
using Robust.Shared.GameStates;
|
||||
using Robust.Shared.Prototypes;
|
||||
|
||||
@@ -19,4 +19,7 @@ public sealed partial class MaskComponent : Component
|
||||
|
||||
[DataField, AutoNetworkedField]
|
||||
public bool IsToggled;
|
||||
|
||||
[DataField, AutoNetworkedField]
|
||||
public string EquippedPrefix = "toggled";
|
||||
}
|
||||
|
||||
@@ -113,7 +113,8 @@ public abstract class ClothingSystem : EntitySystem
|
||||
private void OnMaskToggled(Entity<ClothingComponent> ent, ref ItemMaskToggledEvent args)
|
||||
{
|
||||
//TODO: sprites for 'pulled down' state. defaults to invisible due to no sprite with this prefix
|
||||
SetEquippedPrefix(ent, args.IsToggled ? "toggled" : null, ent);
|
||||
if(args.equippedPrefix != null)
|
||||
SetEquippedPrefix(ent, args.IsToggled ? args.equippedPrefix : null, ent);
|
||||
}
|
||||
|
||||
private void OnEquipDoAfter(Entity<ClothingComponent> ent, ref ClothingEquipDoAfterEvent args)
|
||||
|
||||
@@ -0,0 +1,42 @@
|
||||
using Content.Shared.Clothing.Components;
|
||||
using Content.Shared.Foldable;
|
||||
using Content.Shared.Inventory;
|
||||
|
||||
namespace Content.Shared.Clothing.EntitySystems;
|
||||
|
||||
public sealed class FoldableClothingSystem : EntitySystem
|
||||
{
|
||||
[Dependency] private readonly ClothingSystem _clothingSystem = default!;
|
||||
[Dependency] private readonly InventorySystem _inventorySystem = default!;
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
base.Initialize();
|
||||
|
||||
SubscribeLocalEvent<FoldableClothingComponent, FoldAttemptEvent>(OnFoldAttempt);
|
||||
SubscribeLocalEvent<FoldableClothingComponent, FoldedEvent>(OnFolded);
|
||||
}
|
||||
|
||||
private void OnFoldAttempt(Entity<FoldableClothingComponent> ent, ref FoldAttemptEvent args)
|
||||
{
|
||||
if (args.Cancelled)
|
||||
return;
|
||||
|
||||
// allow folding while equipped if allowed slots are the same:
|
||||
// e.g. flip a hat backwards while on your head
|
||||
if (_inventorySystem.TryGetContainingSlot(ent.Owner, out var slot) &&
|
||||
!ent.Comp.FoldedSlots.Equals(ent.Comp.UnfoldedSlots))
|
||||
args.Cancelled = true;
|
||||
}
|
||||
|
||||
private void OnFolded(Entity<FoldableClothingComponent> ent, ref FoldedEvent args)
|
||||
{
|
||||
if (TryComp<ClothingComponent>(ent.Owner, out var clothingComp))
|
||||
{
|
||||
if (args.IsFolded && ent.Comp.FoldedSlots.HasValue)
|
||||
_clothingSystem.SetSlots(ent.Owner, ent.Comp.FoldedSlots.Value, clothingComp);
|
||||
else if (!args.IsFolded && ent.Comp.UnfoldedSlots.HasValue)
|
||||
_clothingSystem.SetSlots(ent.Owner, ent.Comp.UnfoldedSlots.Value, clothingComp);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,7 +1,9 @@
|
||||
using Content.Shared.Actions;
|
||||
using Content.Shared.Clothing.Components;
|
||||
using Content.Shared.Foldable;
|
||||
using Content.Shared.Inventory;
|
||||
using Content.Shared.Inventory.Events;
|
||||
using Content.Shared.Item;
|
||||
using Content.Shared.Popups;
|
||||
using Robust.Shared.Timing;
|
||||
|
||||
@@ -21,11 +23,12 @@ public sealed class MaskSystem : EntitySystem
|
||||
SubscribeLocalEvent<MaskComponent, ToggleMaskEvent>(OnToggleMask);
|
||||
SubscribeLocalEvent<MaskComponent, GetItemActionsEvent>(OnGetActions);
|
||||
SubscribeLocalEvent<MaskComponent, GotUnequippedEvent>(OnGotUnequipped);
|
||||
SubscribeLocalEvent<MaskComponent, FoldedEvent>(OnFolded);
|
||||
}
|
||||
|
||||
private void OnGetActions(EntityUid uid, MaskComponent component, GetItemActionsEvent args)
|
||||
{
|
||||
if (!args.InHands)
|
||||
if (_inventorySystem.InSlotWithFlags(uid, SlotFlags.MASK))
|
||||
args.AddAction(ref component.ToggleActionEntity, component.ToggleAction);
|
||||
}
|
||||
|
||||
@@ -46,7 +49,7 @@ public sealed class MaskSystem : EntitySystem
|
||||
else
|
||||
_popupSystem.PopupEntity(Loc.GetString("action-mask-pull-up-popup-message", ("mask", uid)), args.Performer, args.Performer);
|
||||
|
||||
ToggleMaskComponents(uid, mask, args.Performer);
|
||||
ToggleMaskComponents(uid, mask, args.Performer, mask.EquippedPrefix);
|
||||
}
|
||||
|
||||
// set to untoggled when unequipped, so it isn't left in a 'pulled down' state
|
||||
@@ -59,15 +62,22 @@ public sealed class MaskSystem : EntitySystem
|
||||
Dirty(uid, mask);
|
||||
_actionSystem.SetToggled(mask.ToggleActionEntity, mask.IsToggled);
|
||||
|
||||
ToggleMaskComponents(uid, mask, args.Equipee, true);
|
||||
ToggleMaskComponents(uid, mask, args.Equipee, mask.EquippedPrefix, true);
|
||||
}
|
||||
|
||||
private void ToggleMaskComponents(EntityUid uid, MaskComponent mask, EntityUid wearer, bool isEquip = false)
|
||||
private void ToggleMaskComponents(EntityUid uid, MaskComponent mask, EntityUid wearer, string? equippedPrefix = null, bool isEquip = false)
|
||||
{
|
||||
var maskEv = new ItemMaskToggledEvent(wearer, mask.IsToggled, isEquip);
|
||||
var maskEv = new ItemMaskToggledEvent(wearer, equippedPrefix, mask.IsToggled, isEquip);
|
||||
RaiseLocalEvent(uid, ref maskEv);
|
||||
|
||||
var wearerEv = new WearerMaskToggledEvent(mask.IsToggled);
|
||||
RaiseLocalEvent(wearer, ref wearerEv);
|
||||
}
|
||||
|
||||
private void OnFolded(Entity<MaskComponent> ent, ref FoldedEvent args)
|
||||
{
|
||||
ent.Comp.IsToggled = args.IsFolded;
|
||||
|
||||
ToggleMaskComponents(ent.Owner, ent.Comp, ent.Owner);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user