* Initial * Cleanup a bunch of things * some changes dunno * RequireAnchored * a * stuff * more work * Lots of progress * delete pipe visualizer * a * b * pipenet and pipenode cleanup * Fixes * Adds GasValve * Adds GasMiner * Fix stuff, maybe? * More fixes * Ignored components on the client * Adds thermomachine behavior, change a bunch of stuff * Remove Anchored * some work, but it's shitcode * significantly more ECS * ECS AtmosDevices * Cleanup * fix appearance * when the pipe direction is sus * Gas tanks and canisters * pipe anchoring and stuff * coding is my passion * Unsafe pipes take longer to unanchor * turns out we're no longer using eris canisters * Gas canister inserted tank appearance, improvements * Work on a bunch of appearances * Scrubber appearance * Reorganize AtmosphereSystem.Piping into a bunch of different systems * Appearance for vent/scrubber/pump turns off when leaving atmosphere * ThermoMachine appearance * Cleanup gas tanks * Remove passive gate unused imports * remove old canister UI functionality * PipeNode environment air, make everything use AssumeAir instead of merging manually * a * Reorganize atmos to follow new structure * ????? * Canister UI, restructure client * Restructure shared * Fix build tho * listen, at least the canister UI works entirely... * fix build : ) * Atmos device prototypes have names and descriptions * gas canister ui slider doesn't jitter * trinary prototypes * sprite for miners * ignore components * fix YAML * Fix port system doing useless thing * Fix build * fix thinking moment * fix build again because * canister direction * pipenode is a word * GasTank Air will throw on invalid states * fix build.... * Unhardcode volume pump thresholds * Volume pump and filter take time into account * Rename Join/Leave atmosphere events to AtmosDeviceEnabled/Disabled Event * Gas tank node volume is set by initial mixtuer * I love node container
108 lines
3.5 KiB
C#
108 lines
3.5 KiB
C#
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.Item;
|
|
using Content.Shared.NetIDs;
|
|
using Content.Shared.Notification.Managers;
|
|
using Robust.Shared.GameObjects;
|
|
using Robust.Shared.Players;
|
|
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))]
|
|
public class ClothingComponent : ItemComponent, IUse
|
|
{
|
|
public override string Name => "Clothing";
|
|
public override uint? NetID => ContentNetIDs.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;
|
|
|
|
[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(ICommonSession player)
|
|
{
|
|
return new ClothingComponentState(ClothingEquippedPrefix, EquippedPrefix);
|
|
}
|
|
|
|
bool IUse.UseEntity(UseEntityEventArgs eventArgs)
|
|
{
|
|
if (!_quickEquipEnabled) return false;
|
|
if (!eventArgs.User.TryGetComponent(out InventoryComponent? inv)
|
|
|| !eventArgs.User.TryGetComponent(out HandsComponent? hands)) return false;
|
|
|
|
foreach (var (slot, flag) in SlotMasks)
|
|
{
|
|
// We check if the clothing can be equipped in this slot.
|
|
if ((SlotFlags & flag) == 0) continue;
|
|
|
|
if (inv.TryGetSlotItem(slot, out ItemComponent? item))
|
|
{
|
|
if (!inv.CanUnequip(slot)) continue;
|
|
hands.Drop(Owner);
|
|
inv.Unequip(slot);
|
|
hands.PutInHand(item);
|
|
|
|
if (!TryEquip(inv, slot, eventArgs.User))
|
|
{
|
|
hands.Drop(item.Owner);
|
|
inv.Equip(slot, item);
|
|
hands.PutInHand(Owner.GetComponent<ItemComponent>());
|
|
}
|
|
}
|
|
else
|
|
{
|
|
hands.Drop(Owner);
|
|
if (!TryEquip(inv, slot, eventArgs.User))
|
|
hands.PutInHand(Owner.GetComponent<ItemComponent>());
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
private bool TryEquip(InventoryComponent inv, Slots slot, IEntity user)
|
|
{
|
|
if (!inv.Equip(slot, this, true, out var reason))
|
|
{
|
|
if (reason != null)
|
|
Owner.PopupMessage(user, reason);
|
|
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
}
|
|
}
|