get that crap outta here (completely rewrites inventorysystem) (#5807)

* some work

* equip: done
unequip: todo

* unequipping done & refactored events

* workin

* movin

* reee namespaces

* stun

* mobstate

* fixes

* some work on events

* removes serverside itemcomp & misc fixes

* work

* smol merge fix

* ports template to prototype & finishes ui

* moves relay & adds containerenumerator

* actions & cuffs

* my god what is actioncode

* more fixes

* im loosing my grasp on reality

* more fixes

* more work

* explosions

* yes

* more work

* more fixes

* merge master & misc fixed because i forgot to commit before merging master

* more fixes

* fixes

* moar

* more work

* moar fixes

* suffixmap

* more work on client

* motivation low

* no. no containers

* mirroring client to server

* fixes

* move serverinvcomp

* serverinventorycomponent is dead

* gaming

* only strippable & ai left...

* only ai and richtext left

* fixes ai

* fixes

* fixes sprite layers

* more fixes

* resolves optional

* yes

* stable™️

* fixes

* moar fixes

* moar

* fix some tests

* lmao

* no comment

* good to merge™️

* fixes build but for real

* adresses some reviews

* adresses some more reviews

* nullables, yo

* fixes lobbyscreen

* timid refactor to differentiate actor & target

* adresses more reviews

* more

* my god what a mess

* removed the rest of duplicates

* removed duplicate slotflags and renamed shoes to feet

* removes another unused one

* yes

* fixes lobby & makes tryunequip return unequipped item

* fixes

* some funny renames

* fixes

* misc improvements to attemptevents

* fixes

* merge fixes

Co-authored-by: Paul Ritter <ritter.paul1@gmail.com>
This commit is contained in:
Paul Ritter
2021-12-30 22:56:10 +01:00
committed by GitHub
parent 7a5adb47a1
commit 512d6a38c3
199 changed files with 2493 additions and 3300 deletions

View File

@@ -1,94 +1,67 @@
using Content.Server.Hands.Components;
using Content.Server.Inventory.Components;
using Content.Server.Items;
using Content.Shared.Clothing;
using Content.Shared.Interaction;
using Content.Shared.Inventory;
using Content.Shared.Item;
using Content.Shared.Popups;
using Content.Shared.Sound;
using Robust.Shared.GameObjects;
using Robust.Shared.GameStates;
using Robust.Shared.IoC;
using Robust.Shared.Prototypes;
using Robust.Shared.Serialization.Manager.Attributes;
using Robust.Shared.ViewVariables;
using static Content.Shared.Inventory.EquipmentSlotDefines;
namespace Content.Server.Clothing.Components
{
[RegisterComponent]
[ComponentReference(typeof(SharedItemComponent))]
[ComponentReference(typeof(ItemComponent))]
[NetworkedComponent()]
public class ItemComponent : SharedItemComponent{}
[RegisterComponent]
[NetworkedComponent]
[ComponentReference(typeof(SharedItemComponent))]
public class ClothingComponent : ItemComponent, IUse
{
[Dependency] private readonly IEntityManager _entities = default!;
[Dependency] private readonly IPrototypeManager _prototype = default!;
public override string Name => "Clothing";
[ViewVariables]
[DataField("Slots")]
public SlotFlags SlotFlags = SlotFlags.PREVENTEQUIP; //Different from None, NONE allows equips if no slot flags are required
[DataField("QuickEquip")]
private bool _quickEquipEnabled = true;
[DataField("HeatResistance")]
private int _heatResistance = 323;
[DataField("EquipSound")]
public SoundSpecifier? EquipSound { get; set; } = default!;
[ViewVariables(VVAccess.ReadWrite)]
public int HeatResistance => _heatResistance;
[DataField("ClothingPrefix")]
private string? _clothingEquippedPrefix;
[ViewVariables(VVAccess.ReadWrite)]
public string? ClothingEquippedPrefix
{
get => _clothingEquippedPrefix;
set
{
Dirty();
_clothingEquippedPrefix = value;
}
}
public override ComponentState GetComponentState()
{
return new ClothingComponentState(ClothingEquippedPrefix, EquippedPrefix);
}
bool IUse.UseEntity(UseEntityEventArgs eventArgs)
{
if (!_quickEquipEnabled) return false;
var invSystem = EntitySystem.Get<InventorySystem>();
if (!_entities.TryGetComponent(eventArgs.User, out InventoryComponent? inv)
|| !_entities.TryGetComponent(eventArgs.User, out HandsComponent? hands)) return false;
|| !_entities.TryGetComponent(eventArgs.User, out HandsComponent? hands) || !_prototype.TryIndex<InventoryTemplatePrototype>(inv.TemplateId, out var prototype)) return false;
foreach (var (slot, flag) in SlotMasks)
foreach (var slotDef in prototype.Slots)
{
// We check if the clothing can be equipped in this slot.
if ((SlotFlags & flag) == 0) continue;
if(!invSystem.CanEquip(eventArgs.User, Owner, slotDef.Name, out _, slotDef, inv))
continue;
if (inv.TryGetSlotItem(slot, out ItemComponent? item))
if (invSystem.TryGetSlotEntity(eventArgs.User, slotDef.Name, out var slotEntity, inv))
{
if (!inv.CanUnequip(slot)) continue;
hands.Drop(Owner);
inv.Unequip(slot);
hands.PutInHand(item);
if(!invSystem.TryUnequip(eventArgs.User, slotDef.Name, true, inventory: inv))
continue;
if (!TryEquip(inv, slot, eventArgs.User))
{
hands.Drop(item.Owner);
inv.Equip(slot, item);
hands.PutInHand(_entities.GetComponent<ItemComponent>(Owner));
}
if (!invSystem.TryEquip(eventArgs.User, Owner, slotDef.Name, true, inventory: inv))
continue;
hands.PutInHandOrDrop(slotEntity.Value);
}
else
{
hands.Drop(Owner);
if (!TryEquip(inv, slot, eventArgs.User))
hands.PutInHand(_entities.GetComponent<ItemComponent>(Owner));
if (!invSystem.TryEquip(eventArgs.User, Owner, slotDef.Name, true, inventory: inv))
continue;
}
return true;
@@ -96,18 +69,5 @@ namespace Content.Server.Clothing.Components
return false;
}
public bool TryEquip(InventoryComponent inv, Slots slot, EntityUid user)
{
if (!inv.Equip(slot, this, true, out var reason))
{
if (reason != null)
Owner.PopupMessage(user, reason);
return false;
}
return true;
}
}
}

View File

@@ -1,7 +1,5 @@
using Content.Server.Alert;
using Content.Server.Atmos.Components;
using Content.Server.Inventory.Components;
using Content.Server.Items;
using Content.Shared.Actions;
using Content.Shared.Actions.Behaviors.Item;
using Content.Shared.Actions.Components;
@@ -9,6 +7,7 @@ using Content.Shared.Alert;
using Content.Shared.Clothing;
using Content.Shared.Interaction;
using Content.Shared.Inventory;
using Content.Shared.Item;
using JetBrains.Annotations;
using Robust.Server.GameObjects;
using Robust.Shared.Containers;
@@ -16,15 +15,14 @@ using Robust.Shared.GameObjects;
using Robust.Shared.IoC;
using Robust.Shared.Serialization.Manager.Attributes;
using Robust.Shared.ViewVariables;
using static Content.Shared.Inventory.EquipmentSlotDefines;
namespace Content.Server.Clothing.Components
{
[RegisterComponent]
[ComponentReference(typeof(IActivate))]
public sealed class MagbootsComponent : SharedMagbootsComponent, IUnequipped, IEquipped, IUse, IActivate
public sealed class MagbootsComponent : SharedMagbootsComponent, IUse, IActivate
{
[ComponentDependency] private ItemComponent? _item = null;
[ComponentDependency] private SharedItemComponent? _item = null;
[ComponentDependency] private ItemActionsComponent? _itemActions = null;
[ComponentDependency] private SpriteComponent? _sprite = null;
@@ -40,7 +38,12 @@ namespace Content.Server.Clothing.Components
{
_on = value;
UpdateContainer();
if (Owner.TryGetContainer(out var container) && EntitySystem.Get<InventorySystem>()
.TryGetSlotEntity(container.Owner, "shoes", out var entityUid) && entityUid == Owner)
{
EntitySystem.Get<MagbootsSystem>().UpdateMagbootEffects(container.Owner, Owner, true, this);
}
_itemActions?.Toggle(ItemActionType.ToggleMagboots, On);
if (_item != null)
_item.EquippedPrefix = On ? "on" : null;
@@ -55,54 +58,6 @@ namespace Content.Server.Clothing.Components
On = !On;
}
void IUnequipped.Unequipped(UnequippedEventArgs eventArgs)
{
if (On && eventArgs.Slot == Slots.SHOES)
{
if (_entMan.TryGetComponent(eventArgs.User, out MovedByPressureComponent? movedByPressure))
{
movedByPressure.Enabled = true;
}
if (_entMan.TryGetComponent(eventArgs.User, out ServerAlertsComponent? alerts))
{
alerts.ClearAlert(AlertType.Magboots);
}
}
}
void IEquipped.Equipped(EquippedEventArgs eventArgs)
{
UpdateContainer();
}
private void UpdateContainer()
{
if (!Owner.TryGetContainer(out var container))
return;
if (_entMan.TryGetComponent(container.Owner, out InventoryComponent? inventoryComponent)
&& inventoryComponent.GetSlotItem(Slots.SHOES)?.Owner == Owner)
{
if (_entMan.TryGetComponent(container.Owner, out MovedByPressureComponent? movedByPressure))
{
movedByPressure.Enabled = false;
}
if (_entMan.TryGetComponent(container.Owner, out ServerAlertsComponent? alerts))
{
if (On)
{
alerts.ShowAlert(AlertType.Magboots);
}
else
{
alerts.ClearAlert(AlertType.Magboots);
}
}
}
}
bool IUse.UseEntity(UseEntityEventArgs eventArgs)
{
Toggle(eventArgs.User);

View File

@@ -1,4 +1,8 @@
using Content.Server.Alert;
using Content.Server.Atmos.Components;
using Content.Server.Clothing.Components;
using Content.Shared.Alert;
using Content.Shared.Inventory.Events;
using Content.Shared.Movement.EntitySystems;
using Content.Shared.Slippery;
using Content.Shared.Verbs;
@@ -16,6 +20,48 @@ namespace Content.Server.Clothing
SubscribeLocalEvent<MagbootsComponent, GetActivationVerbsEvent>(AddToggleVerb);
SubscribeLocalEvent<MagbootsComponent, SlipAttemptEvent>(OnSlipAttempt);
SubscribeLocalEvent<MagbootsComponent, RefreshMovementSpeedModifiersEvent>(OnRefreshMovespeed);
SubscribeLocalEvent<MagbootsComponent, GotEquippedEvent>(OnGotEquipped);
SubscribeLocalEvent<MagbootsComponent, GotUnequippedEvent>(OnGotUnequipped);
}
public void UpdateMagbootEffects(EntityUid parent, EntityUid uid, bool state, MagbootsComponent? component)
{
if (!Resolve(uid, ref component))
return;
state = state && component.On;
if (TryComp(parent, out MovedByPressureComponent? movedByPressure))
{
movedByPressure.Enabled = state;
}
if (TryComp(parent, out ServerAlertsComponent? alerts))
{
if (state)
{
alerts.ShowAlert(AlertType.Magboots);
}
else
{
alerts.ClearAlert(AlertType.Magboots);
}
}
}
private void OnGotUnequipped(EntityUid uid, MagbootsComponent component, GotUnequippedEvent args)
{
if (args.Slot == "shoes")
{
UpdateMagbootEffects(args.Equipee, uid, true, component);
}
}
private void OnGotEquipped(EntityUid uid, MagbootsComponent component, GotEquippedEvent args)
{
if (args.Slot == "shoes")
{
UpdateMagbootEffects(args.Equipee, uid, false, component);
}
}
private void OnRefreshMovespeed(EntityUid uid, MagbootsComponent component, RefreshMovementSpeedModifiersEvent args)