Equipment & inhands. (#110)

* Equipment WiP

* Equipment's starting to work.

* Equipment works properly 100% now.

* Inhands work.

Also more clothes.
This commit is contained in:
Pieter-Jan Briers
2018-09-19 18:54:04 +02:00
committed by GitHub
parent c612806ef1
commit 74541e23a4
97 changed files with 1094 additions and 273 deletions

View File

@@ -68,7 +68,9 @@
</ItemGroup>
<ItemGroup>
<Compile Include="EntryPoint.cs" />
<Compile Include="GameObjects\Components\Clothing\ClothingComponent.cs" />
<Compile Include="GameObjects\Components\Inventory\ClientInventoryComponent.cs" />
<Compile Include="GameObjects\Components\Items\ItemComponent.cs" />
<Compile Include="GameObjects\Components\Power\ApcBoundUserInterface.cs" />
<Compile Include="GameObjects\Components\Storage\ClientStorageComponent.cs" />
<Compile Include="Input\ContentContexts.cs" />

View File

@@ -1,4 +1,5 @@
using Content.Client.GameObjects;
using Content.Client.GameObjects.Components.Clothing;
using Content.Client.GameObjects.Components.Construction;
using Content.Client.GameObjects.Components.Power;
using Content.Client.GameObjects.Components.SmoothWalling;
@@ -24,7 +25,6 @@ namespace Content.Client
var factory = IoCManager.Resolve<IComponentFactory>();
var prototypes = IoCManager.Resolve<IPrototypeManager>();
factory.RegisterIgnore("Item");
factory.RegisterIgnore("Interactable");
factory.RegisterIgnore("Damageable");
factory.RegisterIgnore("Destructible");
@@ -48,7 +48,6 @@ namespace Content.Client
factory.RegisterIgnore("MeleeWeapon");
factory.RegisterIgnore("Storeable");
factory.RegisterIgnore("Clothing");
factory.RegisterIgnore("Material");
factory.RegisterIgnore("Stack");
@@ -61,6 +60,9 @@ namespace Content.Client
factory.Register<ConstructorComponent>();
factory.Register<ConstructionGhostComponent>();
factory.Register<IconSmoothComponent>();
factory.Register<ClothingComponent>();
factory.Register<ItemComponent>();
factory.RegisterReference<ClothingComponent, ItemComponent>();
factory.RegisterIgnore("Construction");
factory.RegisterIgnore("Apc");

View File

@@ -0,0 +1,27 @@
using Content.Shared.GameObjects.Components.Inventory;
using SS14.Client.Graphics;
namespace Content.Client.GameObjects.Components.Clothing
{
public class ClothingComponent : ItemComponent
{
public override string Name => "Clothing";
public (RSI rsi, RSI.StateId stateId)? GetEquippedStateInfo(EquipmentSlotDefines.SlotFlags slot)
{
if (RsiPath == null)
{
return null;
}
var rsi = GetRSI();
var stateId = EquippedPrefix != null ? $"{EquippedPrefix}-equipped-{slot}" : $"equipped-{slot}";
if (rsi.TryGetState(stateId, out _))
{
return (rsi, stateId);
}
return null;
}
}
}

View File

@@ -6,46 +6,118 @@ using SS14.Client.Interfaces.Input;
using SS14.Client.UserInterface;
using SS14.Client.UserInterface.Controls;
using SS14.Client.UserInterface.CustomControls;
using SS14.Shared.ContentPack;
using SS14.Shared.GameObjects;
using SS14.Shared.Input;
using SS14.Shared.Interfaces.GameObjects;
using SS14.Shared.Interfaces.Network;
using SS14.Shared.IoC;
using SS14.Shared.Log;
using SS14.Shared.Maths;
using SS14.Shared.Serialization;
using SS14.Shared.Utility;
using System;
using System.Collections.Generic;
using System.Linq;
using Content.Client.GameObjects.Components.Clothing;
using SS14.Shared.Interfaces.Reflection;
using static Content.Shared.GameObjects.Components.Inventory.EquipmentSlotDefines;
using static Content.Shared.GameObjects.SharedInventoryComponent.ClientInventoryMessage;
using static Content.Shared.GameObjects.SharedInventoryComponent.ServerInventoryMessage;
namespace Content.Client.GameObjects
{
public class ClientInventoryComponent : SharedInventoryComponent
{
private InventoryWindow Window;
private string TemplateName = "HumanInventory"; //stored for serialization purposes
private Dictionary<Slots, IEntity> _slots = new Dictionary<Slots, IEntity>();
private InventoryWindow _window;
private string _templateName = "HumanInventory"; //stored for serialization purposes
private InputCmdHandler _openMenuCmdHandler;
private Inventory _inventory;
private ISpriteComponent _sprite;
public override void OnRemove()
{
base.OnRemove();
Window.Dispose();
_window.Dispose();
}
public override void OnAdd()
{
base.OnAdd();
_openMenuCmdHandler = InputCmdHandler.FromDelegate(session => { _window.AddToScreen(); _window.Open(); });
}
public override void Initialize()
{
base.Initialize();
var reflectionManager = IoCManager.Resolve<IReflectionManager>();
var type = reflectionManager.LooseGetType(_templateName);
DebugTools.Assert(type != null);
_inventory = (Inventory)Activator.CreateInstance(type);
_window = new InventoryWindow(this);
_window.CreateInventory(_inventory);
if (Owner.TryGetComponent(out _sprite))
{
foreach (var mask in _inventory.SlotMasks.OrderBy(s => _inventory.SlotDrawingOrder(s)))
{
if (mask == Slots.NONE)
{
continue;
}
_sprite.LayerMapReserveBlank(mask);
}
}
// Component state already came in but we couldn't set anything visually because, well, we didn't initialize yet.
foreach (var (slot, entity) in _slots)
{
_setSlot(slot, entity);
}
}
public override void ExposeData(ObjectSerializer serializer)
{
base.ExposeData(serializer);
Window = new InventoryWindow(this);
_openMenuCmdHandler = InputCmdHandler.FromDelegate(session => { Window.AddToScreen(); Window.Open(); });
serializer.DataField(ref TemplateName, "Template", "HumanInventory");
Window.CreateInventory(TemplateName);
serializer.DataField(ref _templateName, "Template", "HumanInventory");
}
public override void HandleComponentState(ComponentState state)
{
base.HandleComponentState(state);
var cast = (InventoryComponentState) state;
var doneSlots = new HashSet<Slots>();
var entityManager = IoCManager.Resolve<IEntityManager>();
foreach (var (slot, entityUid) in cast.Entities)
{
if (_slots.ContainsKey(slot))
{
_slots.Remove(slot);
_clearSlot(slot);
}
var entity = entityManager.GetEntity(entityUid);
_slots[slot] = entity;
_setSlot(slot, entity);
doneSlots.Add(slot);
}
foreach (var slot in _slots.Keys.ToList())
{
if (!doneSlots.Contains(slot))
{
_clearSlot(slot);
_slots.Remove(slot);
}
}
}
public override void HandleMessage(ComponentMessage message, INetChannel netChannel = null, IComponent component = null)
@@ -53,18 +125,6 @@ namespace Content.Client.GameObjects
var inputMgr = IoCManager.Resolve<IInputManager>();
switch (message)
{
//Updates what we are storing in UI slots
case ServerInventoryMessage msg:
if (msg.Updatetype == ServerInventoryUpdate.Addition)
{
Window.AddToSlot(msg);
}
else if (msg.Updatetype == ServerInventoryUpdate.Removal)
{
Window.RemoveFromSlot(msg);
}
break;
case PlayerAttachedMsg _:
inputMgr.SetInputCommand(ContentKeyFunctions.OpenCharacterMenu, _openMenuCmdHandler);
break;
@@ -75,6 +135,34 @@ namespace Content.Client.GameObjects
}
}
private void _setSlot(Slots slot, IEntity entity)
{
if (_sprite != null && entity.TryGetComponent(out ClothingComponent clothing))
{
var flag = SlotMasks[slot];
var data = clothing.GetEquippedStateInfo(flag);
if (data == null)
{
_sprite.LayerSetVisible(slot, false);
}
else
{
var (rsi, state) = data.Value;
_sprite.LayerSetVisible(slot, true);
_sprite.LayerSetRSI(slot, rsi);
_sprite.LayerSetState(slot, state);
}
}
_window?.AddToSlot(slot, entity);
}
private void _clearSlot(Slots slot)
{
_window?.RemoveFromSlot(slot);
_sprite?.LayerSetVisible(slot, false);
}
public void SendUnequipMessage(Slots slot)
{
var unequipmessage = new ClientInventoryMessage(slot, ClientInventoryUpdate.Unequip);
@@ -111,12 +199,8 @@ namespace Content.Client.GameObjects
/// <summary>
/// Creates a grid container filled with slot buttons loaded from an inventory template
/// </summary>
/// <param name="TemplateName"></param>
public void CreateInventory(string TemplateName)
public void CreateInventory(Inventory inventory)
{
Type type = AppDomain.CurrentDomain.GetAssemblyByName("Content.Shared").GetType("Content.Shared.GameObjects." + TemplateName);
Inventory inventory = (Inventory)Activator.CreateInstance(type);
elements_x = inventory.Columns;
GridContainer = (GridContainer)Contents.GetChild("PanelContainer").GetChild("CenterContainer").GetChild("GridContainer");
@@ -151,14 +235,11 @@ namespace Content.Client.GameObjects
/// <summary>
/// Adds the item we have equipped to the slot texture and prepares the slot button for removal
/// </summary>
/// <param name="message"></param>
public void AddToSlot(ServerInventoryMessage message)
public void AddToSlot(Slots slot, IEntity entity)
{
InventoryButton button = InventorySlots[message.Inventoryslot];
var entity = IoCManager.Resolve<IEntityManager>().GetEntity(message.EntityUid);
var button = InventorySlots[slot];
button.EntityUid = message.EntityUid;
var container = button.GetChild("CenterContainer");
button.EntityUid = entity.Uid;
button.GetChild<Button>("Button").OnPressed += RemoveFromInventory;
button.GetChild<Button>("Button").OnPressed -= AddToInventory;
@@ -187,10 +268,9 @@ namespace Content.Client.GameObjects
/// <summary>
/// Remove element from the UI and update its button to blank texture and prepare for insertion again
/// </summary>
/// <param name="message"></param>
public void RemoveFromSlot(ServerInventoryMessage message)
public void RemoveFromSlot(Slots slot)
{
InventoryButton button = InventorySlots[message.Inventoryslot];
var button = InventorySlots[slot];
button.GetChild<SpriteView>("SpriteView").Sprite = null;
button.EntityUid = EntityUid.Invalid;
button.GetChild<Button>("Button").OnPressed -= RemoveFromInventory;

View File

@@ -6,19 +6,60 @@ using SS14.Shared.GameObjects;
using SS14.Shared.Interfaces.GameObjects;
using SS14.Shared.IoC;
using System.Collections.Generic;
using System.Linq;
using SS14.Client.GameObjects;
using SS14.Client.Interfaces.GameObjects.Components;
using SS14.Shared.Interfaces.Network;
using SS14.Shared.Serialization;
using SS14.Shared.Utility;
using SS14.Shared.ViewVariables;
namespace Content.Client.GameObjects
{
public class HandsComponent : SharedHandsComponent, IHandsComponent
{
private readonly Dictionary<string, IEntity> hands = new Dictionary<string, IEntity>();
[ViewVariables]
public string ActiveIndex { get; private set; }
private HandsGui _gui;
private IUserInterfaceManager _userInterfaceManager;
[ViewVariables] private readonly Dictionary<string, IEntity> _hands = new Dictionary<string, IEntity>();
[ViewVariables] public string ActiveIndex { get; private set; }
[ViewVariables] private ISpriteComponent _sprite;
public override void OnAdd()
{
base.OnAdd();
_userInterfaceManager = IoCManager.Resolve<IUserInterfaceManager>();
}
public override void OnRemove()
{
base.OnRemove();
_gui?.Dispose();
}
public override void Initialize()
{
base.Initialize();
_userInterfaceManager = IoCManager.Resolve<IUserInterfaceManager>();
if (Owner.TryGetComponent(out _sprite))
{
foreach (var slot in _hands.Keys)
{
_sprite.LayerMapReserveBlank($"hand-{slot}");
_setHand(slot, _hands[slot]);
}
}
}
public IEntity GetEntity(string index)
{
if (hands.TryGetValue(index, out var entity))
if (_hands.TryGetValue(index, out var entity))
{
return entity;
}
@@ -29,30 +70,103 @@ namespace Content.Client.GameObjects
public override void HandleComponentState(ComponentState state)
{
var cast = (HandsComponentState) state;
hands.Clear();
foreach (var hand in cast.Hands)
foreach (var (slot, uid) in cast.Hands)
{
IEntity entity = null;
try
{
entity = Owner.EntityManager.GetEntity(hand.Value);
entity = Owner.EntityManager.GetEntity(uid);
}
catch
{
// Nothing.
}
hands[hand.Key] = entity;
_hands[slot] = entity;
_setHand(slot, entity);
}
foreach (var slot in _hands.Keys.ToList())
{
if (!cast.Hands.ContainsKey(slot))
{
_hands[slot] = null;
_setHand(slot, null);
}
}
ActiveIndex = cast.ActiveIndex;
// Tell UI to update.
var uiMgr = IoCManager.Resolve<IUserInterfaceManager>();
if (!uiMgr.StateRoot.TryGetChild<HandsGui>("HandsGui", out var control))
{
control = new HandsGui();
uiMgr.StateRoot.AddChild(control);
_gui?.UpdateHandIcons();
}
private void _setHand(string hand, IEntity entity)
{
if (_sprite == null)
{
return;
}
if (entity == null)
{
_sprite.LayerSetVisible($"hand-{hand}", false);
return;
}
var item = entity.GetComponent<ItemComponent>();
var maybeInhands = item.GetInHandStateInfo(hand);
if (!maybeInhands.HasValue)
{
_sprite.LayerSetVisible($"hand-{hand}", false);
}
else
{
var (rsi, state) = maybeInhands.Value;
_sprite.LayerSetVisible($"hand-{hand}", true);
_sprite.LayerSetState($"hand-{hand}", state, rsi);
}
}
public override void ExposeData(ObjectSerializer serializer)
{
base.ExposeData(serializer);
if (!serializer.Reading)
{
return;
}
foreach (var slot in serializer.ReadDataFieldCached("hands", new List<string>()))
{
_hands.Add(slot, null);
}
}
public override void HandleMessage(ComponentMessage message, INetChannel netChannel = null,
IComponent component = null)
{
base.HandleMessage(message, netChannel, component);
switch (message)
{
case PlayerAttachedMsg _:
if (_gui == null)
{
_gui = new HandsGui();
}
else
{
_gui.Parent?.RemoveChild(_gui);
}
_userInterfaceManager.StateRoot.AddChild(_gui);
_gui.UpdateHandIcons();
break;
case PlayerDetachedMsg _:
_gui.Parent?.RemoveChild(_gui);
break;
}
control.UpdateHandIcons();
}
public void SendChangeHand(string index)

View File

@@ -0,0 +1,60 @@
using Content.Shared.GameObjects.Components.Inventory;
using SS14.Client.Graphics;
using SS14.Client.Interfaces.ResourceManagement;
using SS14.Client.ResourceManagement;
using SS14.Shared.GameObjects;
using SS14.Shared.GameObjects.Components.Renderable;
using SS14.Shared.IoC;
using SS14.Shared.Serialization;
using SS14.Shared.Utility;
using SS14.Shared.ViewVariables;
namespace Content.Client.GameObjects
{
public class ItemComponent : Component
{
public override string Name => "Item";
[ViewVariables] protected ResourcePath RsiPath;
private string _equippedPrefix;
[ViewVariables(VVAccess.ReadWrite)]
public string EquippedPrefix
{
get => _equippedPrefix;
set => _equippedPrefix = value;
}
public (RSI rsi, RSI.StateId stateId)? GetInHandStateInfo(string hand)
{
if (RsiPath == null)
{
return null;
}
var rsi = GetRSI();
var stateId = EquippedPrefix != null ? $"{EquippedPrefix}-inhand-{hand}" : $"inhand-{hand}";
if (rsi.TryGetState(stateId, out _))
{
return (rsi, stateId);
}
return null;
}
public override void ExposeData(ObjectSerializer serializer)
{
base.ExposeData(serializer);
serializer.DataFieldCached(ref RsiPath, "sprite", null);
serializer.DataFieldCached(ref _equippedPrefix, "prefix", null);
}
protected RSI GetRSI()
{
var resourceCache = IoCManager.Resolve<IResourceCache>();
return resourceCache.GetResource<RSIResource>(SharedSpriteComponent.TextureRoot / RsiPath).RSI;
}
}
}

View File

@@ -119,6 +119,10 @@ namespace Content.Client.UserInterface
public void UpdateHandIcons()
{
if (Parent == null)
{
return;
}
UpdateDraw();
if (!TryGetHands(out IHandsComponent hands))

View File

@@ -33,6 +33,7 @@ using Content.Server.GameObjects.EntitySystems;
using Content.Server.Mobs;
using Content.Server.Players;
using Content.Server.GameObjects.Components.Interactable;
using Content.Shared.GameObjects.Components.Inventory;
namespace Content.Server
{
@@ -233,7 +234,15 @@ namespace Content.Server
IEntity SpawnPlayerMob()
{
return entityManager.ForceSpawnEntityAt(PlayerPrototypeName, SpawnPoint);
var entity = entityManager.ForceSpawnEntityAt(PlayerPrototypeName, SpawnPoint);
var shoes = entityManager.SpawnEntity("ShoesItem");
var uniform = entityManager.SpawnEntity("UniformAssistant");
if (entity.TryGetComponent(out InventoryComponent inventory))
{
inventory.Equip(EquipmentSlotDefines.Slots.INNERCLOTHING, uniform.GetComponent<ClothingComponent>());
inventory.Equip(EquipmentSlotDefines.Slots.SHOES, shoes.GetComponent<ClothingComponent>());
}
return entity;
}
}
}

View File

@@ -1,5 +1,4 @@
using SS14.Server.GameObjects;
using SS14.Server.GameObjects.Components.Container;
using SS14.Server.GameObjects.Components.Container;
using System;
using System.Collections.Generic;
using Content.Shared.GameObjects;
@@ -8,19 +7,22 @@ using SS14.Shared.GameObjects;
using SS14.Shared.Interfaces.GameObjects;
using SS14.Shared.Interfaces.Network;
using static Content.Shared.GameObjects.SharedInventoryComponent.ClientInventoryMessage;
using static Content.Shared.GameObjects.SharedInventoryComponent.ServerInventoryMessage;
using SS14.Shared.IoC;
using SS14.Server.Interfaces.Player;
using SS14.Shared.ContentPack;
using System.Linq;
using SS14.Shared.Serialization;
using SS14.Shared.Interfaces.GameObjects.Components;
using SS14.Shared.Utility;
using SS14.Shared.ViewVariables;
namespace Content.Server.GameObjects
{
public class InventoryComponent : SharedInventoryComponent
{
[ViewVariables]
private Dictionary<Slots, ContainerSlot> SlotContainers = new Dictionary<Slots, ContainerSlot>();
string TemplateName = "HumanInventory"; //stored for serialization purposes
public override void ExposeData(ObjectSerializer serializer)
@@ -36,13 +38,14 @@ namespace Content.Server.GameObjects
private void CreateInventory(string TemplateName)
{
Type type = AppDomain.CurrentDomain.GetAssemblyByName("Content.Shared").GetType("Content.Shared.GameObjects." + TemplateName);
Type type = AppDomain.CurrentDomain.GetAssemblyByName("Content.Shared")
.GetType("Content.Shared.GameObjects." + TemplateName);
Inventory inventory = (Inventory) Activator.CreateInstance(type);
foreach (Slots slotnames in inventory.SlotMasks)
{
if (slotnames != Slots.NONE)
{
var newslot = AddSlot(slotnames);
AddSlot(slotnames);
}
}
}
@@ -54,6 +57,7 @@ namespace Content.Server.GameObjects
{
RemoveSlot(slot);
}
base.OnRemove();
}
@@ -90,11 +94,13 @@ namespace Content.Server.GameObjects
{
if (clothing == null)
{
throw new ArgumentNullException(nameof(clothing), "Clothing must be passed here. To remove some clothing from a slot, use Unequip()");
throw new ArgumentNullException(nameof(clothing),
"Clothing must be passed here. To remove some clothing from a slot, use Unequip()");
}
if (clothing.SlotFlags == SlotFlags.PREVENTEQUIP //Flag to prevent equipping at all
|| (clothing.SlotFlags & SlotMasks[slot]) == 0) //Does the clothing flag have any of our requested slot flags
|| (clothing.SlotFlags & SlotMasks[slot]) == 0
) //Does the clothing flag have any of our requested slot flags
{
return false;
}
@@ -107,15 +113,7 @@ namespace Content.Server.GameObjects
clothing.EquippedToSlot(inventorySlot);
var UIupdatemessage = new ServerInventoryMessage()
{
Inventoryslot = slot,
EntityUid = clothing.Owner.Uid,
Updatetype = ServerInventoryUpdate.Addition
};
SendNetworkMessage(UIupdatemessage);
Dirty();
return true;
}
@@ -149,19 +147,12 @@ namespace Content.Server.GameObjects
return false;
}
var UIupdatemessage = new ServerInventoryMessage()
{
Inventoryslot = slot,
EntityUid = item.Owner.Uid,
Updatetype = ServerInventoryUpdate.Removal
};
SendNetworkMessage(UIupdatemessage);
item.RemovedFromSlot();
// TODO: The item should be dropped to the container our owner is in, if any.
var itemTransform = item.Owner.GetComponent<ITransformComponent>();
itemTransform.LocalPosition = Owner.GetComponent<ITransformComponent>().LocalPosition;
Dirty();
return true;
}
@@ -192,6 +183,7 @@ namespace Content.Server.GameObjects
throw new InvalidOperationException($"Slot '{slot}' already exists.");
}
Dirty();
return SlotContainers[slot] = ContainerManagerComponent.Create<ContainerSlot>(GetSlotString(slot), Owner);
}
@@ -212,10 +204,12 @@ namespace Content.Server.GameObjects
if (GetSlotItem(slot) != null && !Unequip(slot))
{
// TODO: Handle this potential failiure better.
throw new InvalidOperationException("Unable to remove slot as the contained clothing could not be dropped");
throw new InvalidOperationException(
"Unable to remove slot as the contained clothing could not be dropped");
}
SlotContainers.Remove(slot);
Dirty();
}
/// <summary>
@@ -259,7 +253,8 @@ namespace Content.Server.GameObjects
}
}
public override void HandleMessage(ComponentMessage message, INetChannel netChannel = null, IComponent component = null)
public override void HandleMessage(ComponentMessage message, INetChannel netChannel = null,
IComponent component = null)
{
base.HandleMessage(message, netChannel, component);
@@ -275,5 +270,18 @@ namespace Content.Server.GameObjects
break;
}
}
public override ComponentState GetComponentState()
{
var list = new List<KeyValuePair<Slots, EntityUid>>();
foreach (var (slot, container) in SlotContainers)
{
if (container.ContainedEntity != null)
{
list.Add(new KeyValuePair<Slots, EntityUid>(slot, container.ContainedEntity.Uid));
}
}
return new InventoryComponentState(list);
}
}
}

View File

@@ -3,11 +3,13 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using SS14.Shared.Serialization;
namespace Content.Shared.GameObjects.Components.Inventory
{
public static class EquipmentSlotDefines
{
[Serializable, NetSerializable]
public enum Slots
{
NONE,
@@ -30,6 +32,7 @@ namespace Content.Shared.GameObjects.Components.Inventory
EXOSUITSLOT2
}
[Serializable, NetSerializable]
[Flags]
public enum SlotFlags
{

View File

@@ -5,21 +5,50 @@ namespace Content.Shared.GameObjects
{
public abstract class Inventory
{
abstract public int Columns { get; }
public abstract int Columns { get; }
abstract public List<Slots> SlotMasks { get; }
public abstract IReadOnlyList<Slots> SlotMasks { get; }
/// <summary>
/// Gets the drawing order of a slot.
/// </summary>
/// <returns>
/// An int that can be used for sorting relative to other drawing orders.
/// The value returned does not mean anything else.
/// </returns>
public abstract int SlotDrawingOrder(Slots slot);
}
public class HumanInventory : Inventory
{
public override int Columns => 3;
public override List<Slots> SlotMasks => new List<Slots>()
private static Dictionary<Slots, int> _slotDrawingOrder = new Dictionary<Slots, int>
{
{Slots.HEAD, 10},
{Slots.MASK, 9},
{Slots.EARS, 8},
{Slots.BACKPACK, 7},
{Slots.EYES, 6},
{Slots.OUTERCLOTHING, 5},
{Slots.BELT, 4},
{Slots.GLOVES, 3},
{Slots.SHOES, 2},
{Slots.IDCARD, 1},
{Slots.INNERCLOTHING, 0}
};
public override IReadOnlyList<Slots> SlotMasks { get; } = new List<Slots>()
{
Slots.EYES, Slots.HEAD, Slots.EARS,
Slots.OUTERCLOTHING, Slots.MASK, Slots.INNERCLOTHING,
Slots.BACKPACK, Slots.BELT, Slots.GLOVES,
Slots.NONE, Slots.SHOES, Slots.IDCARD
};
public override int SlotDrawingOrder(Slots slot)
{
return _slotDrawingOrder.TryGetValue(slot, out var val) ? val : 0;
}
}
}

View File

@@ -1,6 +1,7 @@
using SS14.Shared.GameObjects;
using SS14.Shared.Serialization;
using System;
using System.Collections.Generic;
using static Content.Shared.GameObjects.Components.Inventory.EquipmentSlotDefines;
namespace Content.Shared.GameObjects
@@ -8,26 +9,17 @@ namespace Content.Shared.GameObjects
public abstract class SharedInventoryComponent : Component
{
public sealed override string Name => "Inventory";
public override uint? NetID => ContentNetIDs.STORAGE;
public sealed override uint? NetID => ContentNetIDs.STORAGE;
public sealed override Type StateType => typeof(InventoryComponentState);
[Serializable, NetSerializable]
public class ServerInventoryMessage : ComponentMessage
protected class InventoryComponentState : ComponentState
{
public Slots Inventoryslot;
public EntityUid EntityUid;
public ServerInventoryUpdate Updatetype;
public List<KeyValuePair<Slots, EntityUid>> Entities { get; }
public ServerInventoryMessage()
public InventoryComponentState(List<KeyValuePair<Slots, EntityUid>> entities) : base(ContentNetIDs.STORAGE)
{
Directed = true;
}
public enum ServerInventoryUpdate
{
Removal = 0,
Addition = 1
Entities = entities;
}
}

View File

@@ -2,170 +2,13 @@
name: "Clothing"
id: Clothing
parent: BaseItem
abstract: true
components:
- type: Clothing
Size: 5
- type: entity
parent: Clothing
id: ShoesItem
name: Shoes
description: Don't take them off at your office Christmas party
components:
- type: Sprite
texture: Objects/shoes.png
- type: Icon
texture: Objects/shoes.png
- type: Clothing
Slots:
- shoes
- type: entity
parent: Clothing
id: JanitorUniform
name: Janitor Jumpsuit
description: The jumpsuit for the poor sop with a mop
components:
- type: Sprite
texture: Objects/janitorsuit.png
- type: Icon
texture: Objects/janitorsuit.png
- type: Clothing
Slots:
- innerclothing
- type: entity
parent: Clothing
id: SecurityVestClothing
name: Security Vest
description: Bulletproof vest, more or less
components:
- type: Sprite
texture: Clothing/armorvest.png
- type: Icon
texture: Clothing/armorvest.png
- type: Clothing
Slots:
- outerclothing
- type: entity
parent: Clothing
id: UtilityBeltClothing
name: Utility Belt
description: Belt for holding all your usual tools
components:
- type: Sprite
texture: Clothing/belt_utility.png
- type: Icon
texture: Clothing/belt_utility.png
Size: 30
- type: Clothing
Slots:
- belt
- type: Storage
Capacity: 30
- type: entity
parent: Clothing
id: BackpackClothing
name: Backpack
description: A convenient storage pack
components:
- type: Sprite
texture: Clothing/backpack.png
- type: Icon
texture: Clothing/backpack.png
Size: 9999
- type: Clothing
Slots:
- back
- type: Storage
Capacity: 100
- type: entity
parent: Clothing
id: MesonGlasses
name: Optical Meson Scanners
description: The pinnacle of modern science, wallhacks in real life
components:
- type: Sprite
texture: Clothing/glasses_meson.png
- type: Icon
texture: Clothing/glasses_meson.png
- type: Clothing
Slots:
- eyes
- type: entity
parent: Clothing
id: YellowGloves
name: Insulated Gloves
description: Electrical gloves that keep you from frying
components:
- type: Sprite
texture: Clothing/gloves_yellow.png
- type: Icon
texture: Clothing/gloves_yellow.png
- type: Clothing
Slots:
- gloves
- type: entity
parent: Clothing
id: HelmetSecurity
name: Security Helmet
description: "A slick logo covers the ear: \"Concussions are better than holes!\""
components:
- type: Sprite
texture: Clothing/helmet_sec.png
- type: Icon
texture: Clothing/helmet_sec.png
- type: Clothing
Slots:
- head
- type: entity
parent: Clothing
id: GasMaskClothing
name: Gas Mask
description: Regulations require these to be stocked after the fourth coolant leak
components:
- type: Sprite
texture: Clothing/gasmask.png
- type: Icon
texture: Clothing/gasmask.png
- type: Clothing
Slots:
- mask
- type: entity
parent: Clothing
id: IDCardStandard
name: Identification Card
description: A card necessary to access various areas aboard the station
components:
- type: Sprite
texture: Clothing/idcard_standard.png
- type: Icon
texture: Clothing/idcard_standard.png
- type: Clothing
Slots:
- idcard
- type: entity
parent: Clothing
id: RadioHeadsetEars
name: Headset Radio
description: The radio to keep up to date in real time with fun onboard station activities
components:
- type: Sprite
texture: Clothing/ears_headset.png
- type: Icon
texture: Clothing/ears_headset.png
- type: Clothing
Slots:
- ears

View File

@@ -0,0 +1,13 @@
- type: entity
parent: Clothing
id: IDCardStandard
name: Identification Card
description: A card necessary to access various areas aboard the station
components:
- type: Sprite
texture: Clothing/idcard_standard.png
- type: Icon
texture: Clothing/idcard_standard.png
- type: Clothing
Slots:
- idcard

View File

@@ -0,0 +1,19 @@
- type: entity
parent: Clothing
id: BackpackClothing
name: Backpack
description: A convenient storage pack
components:
- type: Sprite
sprite: Clothing/backpack.rsi
state: backpack
- type: Icon
sprite: Clothing/backpack.rsi
state: backpack
- type: Clothing
Size: 9999
Slots:
- back
sprite: Clothing/backpack.rsi
- type: Storage
Capacity: 100

View File

@@ -0,0 +1,26 @@
- type: entity
parent: Clothing
id: BeltBase
abstract: true
components:
- type: Clothing
Slots: [belt]
- type: entity
parent: BeltBase
id: UtilityBeltClothing
name: Utility Belt
description: Belt for holding all your usual tools
components:
- type: Sprite
sprite: Clothing/belt_utility.rsi
state: utilitybelt
- type: Icon
sprite: Clothing/belt_utility.rsi
state: utilitybelt
- type: Clothing
Size: 30
sprite: Clothing/belt_utility.rsi
- type: Storage
Capacity: 30

View File

@@ -0,0 +1,16 @@
- type: entity
parent: Clothing
id: RadioHeadsetEars
name: Headset Radio
description: The radio to keep up to date in real time with fun onboard station activities
components:
- type: Sprite
sprite: Clothing/headset.rsi
state: headset
- type: Icon
sprite: Clothing/headset.rsi
state: headset
- type: Clothing
Slots:
- ears
sprite: Clothing/headset.rsi

View File

@@ -0,0 +1,39 @@
- type: entity
parent: Clothing
id: GlassesBase
abstract: true
components:
- type: Clothing
Slots: [eyes]
- type: entity
parent: GlassesBase
id: MesonGlasses
name: Optical Meson Scanners
description: The pinnacle of modern science, wallhacks in real life
components:
- type: Sprite
sprite: Clothing/meson_scanners.rsi
state: meson
- type: Icon
sprite: Clothing/meson_scanners.rsi
state: meson
- type: Clothing
sprite: Clothing/meson_scanners.rsi
- type: entity
parent: GlassesBase
id: SunGlasses
name: Sun Glasses
description: Useful both for security and cargonia
components:
- type: Sprite
sprite: Clothing/sunglasses.rsi
state: sunglasses
- type: Icon
sprite: Clothing/sunglasses.rsi
state: sunglasses
- type: Clothing
sprite: Clothing/sunglasses.rsi

View File

@@ -0,0 +1,39 @@
- type: entity
parent: Clothing
id: GlovesBase
abstract: true
components:
- type: Clothing
Slots: [gloves]
- type: entity
parent: GlovesBase
id: YellowGloves
name: Insulated Gloves
description: Electrical gloves that keep you from frying
components:
- type: Sprite
sprite: Clothing/gloves_yellow.rsi
state: yellow
- type: Icon
sprite: Clothing/gloves_yellow.rsi
state: yellow
- type: Clothing
sprite: Clothing/gloves_yellow.rsi
- type: entity
parent: GlovesBase
id: BlackGloves
name: Insulated Gloves
description: Regular gloves that do not keep you from frying
components:
- type: Sprite
sprite: Clothing/gloves_black.rsi
state: black
- type: Icon
sprite: Clothing/gloves_black.rsi
state: black
- type: Clothing
sprite: Clothing/gloves_black.rsi

View File

@@ -0,0 +1,16 @@
- type: entity
parent: Clothing
id: HelmetSecurity
name: Security Helmet
description: "A slick logo covers the ear: \"Concussions are better than holes!\""
components:
- type: Sprite
sprite: Clothing/helmet_sec.rsi
state: helmet
- type: Icon
sprite: Clothing/helmet_sec.rsi
state: helmet
- type: Clothing
Slots:
- head
sprite: Clothing/helmet_sec.rsi

View File

@@ -0,0 +1,35 @@
- type: entity
parent: Clothing
id: MasksBase
abstract: true
components:
- type: Clothing
Slots: [mask]
- type: entity
parent: MasksBase
id: GasMaskClothing
name: Gas Mask
description: Regulations require these to be stocked after the fourth coolant leak
components:
- type: Sprite
texture: Clothing/gasmask.png
- type: Icon
texture: Clothing/gasmask.png
- type: entity
parent: MasksBase
id: BreathMaskClothing
name: Breath Mask
description: Might as well keep this on 24/7
components:
- type: Sprite
sprite: Clothing/mask_breath.rsi
state: breath
- type: Icon
sprite: Clothing/mask_breath.rsi
state: breath
- type: Clothing
sprite: Clothing/mask_breath.rsi

View File

@@ -0,0 +1,43 @@
- type: entity
parent: Clothing
id: ShoesBase
abstract: true
components:
- type: Clothing
Slots: [shoes]
- type: entity
parent: ShoesBase
id: ShoesItem
name: Black Shoes
description: Don't take them off at your office Christmas party
components:
- type: Sprite
sprite: Clothing/shoes_black.rsi
state: black
- type: Icon
sprite: Clothing/shoes_black.rsi
state: black
- type: Clothing
sprite: Clothing/shoes_black.rsi
- type: entity
parent: ShoesBase
id: WhiteShoes
name: White Shoes
description: Don't take them off at your office Christmas party
components:
- type: Sprite
sprite: Clothing/shoes_white.rsi
state: white
- type: Icon
sprite: Clothing/shoes_white.rsi
state: white
- type: Clothing
sprite: Clothing/shoes_white.rsi

View File

@@ -0,0 +1,43 @@
- type: entity
parent: Clothing
id: SuitBase
abstract: true
components:
- type: Clothing
Slots: [outerclothing]
- type: entity
parent: SuitBase
id: SecurityVestClothing
name: Security Vest
description: Bulletproof vest, more or less
components:
- type: Sprite
sprite: Clothing/armor.rsi
state: armor
- type: Icon
sprite: Clothing/armor.rsi
state: armor
- type: Clothing
sprite: Clothing/armor.rsi
- type: entity
parent: SuitBase
id: HazardVestClothing
name: Hazard Vest
description: Prevents accidents
components:
- type: Sprite
sprite: Clothing/vest_hazard.rsi
state: hazard
- type: Icon
sprite: Clothing/vest_hazard.rsi
state: hazard
- type: Clothing
sprite: Clothing/vest_hazard.rsi

View File

@@ -0,0 +1,76 @@
- type: entity
parent: Clothing
id: UniformBase
abstract: true
components:
- type: Clothing
Slots: [innerclothing]
- type: entity
parent: UniformBase
id: JanitorUniform
name: Janitor Jumpsuit
description: The jumpsuit for the poor sop with a mop
components:
- type: Sprite
sprite: Clothing/uniform_janitor.rsi
state: janitor
- type: Icon
sprite: Clothing/uniform_janitor.rsi
state: janitor
- type: Clothing
sprite: Clothing/uniform_janitor.rsi
- type: entity
parent: UniformBase
id: UniformGrey
name: Grey Jumpsuit
description: Greytide. Worldwide.
components:
- type: Sprite
sprite: Clothing/uniform_grey.rsi
state: grey
- type: Icon
sprite: Clothing/uniform_grey.rsi
state: grey
- type: Clothing
sprite: Clothing/uniform_grey.rsi
- type: entity
parent: UniformBase
id: UniformEngineering
name: Engineering Jumpsuit
components:
- type: Sprite
sprite: Clothing/uniform_engineering.rsi
state: engine
- type: Icon
sprite: Clothing/uniform_engineering.rsi
state: engine
- type: Clothing
sprite: Clothing/uniform_engineering.rsi
- type: entity
parent: UniformBase
id: UniformAssistant
name: Assistant Jumpsuit
components:
- type: Sprite
sprite: Clothing/uniform_assistant.rsi
state: assistant
- type: Icon
sprite: Clothing/uniform_assistant.rsi
state: assistant
- type: Clothing
sprite: Clothing/uniform_assistant.rsi

View File

@@ -12,13 +12,29 @@
- type: Constructor
- type: Clickable
- type: Sprite
sprite: Mob/greyshirt.rsi
state: greyshirt
netsync: false
drawdepth: Mobs
layers:
- sprite: Mob/human.rsi
state: male
- map: ["enum.Slots.INNERCLOTHING"]
- map: ["enum.Slots.IDCARD"]
- map: ["enum.Slots.SHOES"]
- map: ["enum.Slots.GLOVES"]
- map: ["enum.Slots.BELT"]
- map: ["enum.Slots.OUTERCLOTHING"]
- map: ["enum.Slots.EYES"]
- map: ["enum.Slots.BACKPACK"]
- map: ["enum.Slots.EARS"]
- map: ["enum.Slots.MASK"]
- map: ["enum.Slots.HEAD"]
- map: ["hand-left"]
- map: ["hand-right"]
- type: Icon
sprite: Mob/greyshirt.rsi
state: greyshirt
sprite: Mob/human.rsi
state: male
- type: BoundingBox
aabb: "-0.5,-0.25,-0.05,0.25"

View File

@@ -42,7 +42,7 @@ action_mode = 0
enabled_focus_mode = 2
shortcut = null
group = null
text = "Slut"
text = "Slot"
flat = true
clip_text = true
align = 1

Binary file not shown.

After

Width:  |  Height:  |  Size: 441 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 660 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 526 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 508 B

View File

@@ -0,0 +1 @@
{"version": 1, "size": {"x": 32, "y": 32}, "license": "CC-BY-SA-3.0", "copyright": "Taken from https://github.com/discordia-space/CEV-Eris at commit 9a3a3a180344460263e8df7ea2565128e07b86b5", "states": [{"name": "armor", "directions": 1, "delays": [[1.0]]}, {"name": "equipped-OUTERCLOTHING", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}, {"name": "inhand-left", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}, {"name": "inhand-right", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}]}

Binary file not shown.

After

Width:  |  Height:  |  Size: 378 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 638 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 465 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 455 B

View File

@@ -0,0 +1 @@
{"version": 1, "size": {"x": 32, "y": 32}, "license": "CC-BY-SA-3.0", "copyright": "Taken from https://github.com/discordia-space/CEV-Eris at commit 9a3a3a180344460263e8df7ea2565128e07b86b5", "states": [{"name": "backpack", "directions": 1, "delays": [[1.0]]}, {"name": "equipped-BACKPACK", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}, {"name": "inhand-left", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}, {"name": "inhand-right", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}]}

Binary file not shown.

After

Width:  |  Height:  |  Size: 294 B

View File

@@ -0,0 +1 @@
{"version": 1, "size": {"x": 32, "y": 32}, "license": "CC-BY-SA-3.0", "copyright": "Taken from https://github.com/discordia-space/CEV-Eris at commit 9a3a3a180344460263e8df7ea2565128e07b86b5", "states": [{"name": "equipped-BELT", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}, {"name": "utilitybelt", "directions": 1, "delays": [[1.0]]}]}

Binary file not shown.

After

Width:  |  Height:  |  Size: 463 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 456 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 261 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 205 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 214 B

View File

@@ -0,0 +1 @@
{"version": 1, "size": {"x": 32, "y": 32}, "license": "CC-BY-SA-3.0", "copyright": "Taken from https://github.com/discordia-space/CEV-Eris at commit 9a3a3a180344460263e8df7ea2565128e07b86b5", "states": [{"name": "black", "directions": 1, "delays": [[1.0]]}, {"name": "equipped-HAND", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}, {"name": "inhand-left", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}, {"name": "inhand-right", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}]}

Binary file not shown.

After

Width:  |  Height:  |  Size: 280 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 221 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 232 B

View File

@@ -0,0 +1 @@
{"version": 1, "size": {"x": 32, "y": 32}, "license": "CC-BY-SA-3.0", "copyright": "Taken from https://github.com/discordia-space/CEV-Eris at commit 9a3a3a180344460263e8df7ea2565128e07b86b5", "states": [{"name": "equipped-HAND", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}, {"name": "inhand-left", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}, {"name": "inhand-right", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}, {"name": "yellow", "directions": 1, "delays": [[1.0]]}]}

Binary file not shown.

After

Width:  |  Height:  |  Size: 351 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 165 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 298 B

View File

@@ -0,0 +1 @@
{"version": 1, "size": {"x": 32, "y": 32}, "license": "CC-BY-SA-3.0", "copyright": "Taken from https://github.com/discordia-space/CEV-Eris at commit 9a3a3a180344460263e8df7ea2565128e07b86b5", "states": [{"name": "equipped-EARS", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}, {"name": "headset", "directions": 1, "delays": [[1.0]]}]}

Binary file not shown.

After

Width:  |  Height:  |  Size: 644 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 378 B

View File

@@ -0,0 +1 @@
{"version": 1, "size": {"x": 32, "y": 32}, "license": "CC-BY-SA-3.0", "copyright": "Taken from https://github.com/discordia-space/CEV-Eris at commit 9a3a3a180344460263e8df7ea2565128e07b86b5", "states": [{"name": "equipped-HELMET", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}, {"name": "helmet", "directions": 1, "delays": [[1.0]]}]}

Binary file not shown.

After

Width:  |  Height:  |  Size: 307 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 378 B

View File

@@ -0,0 +1 @@
{"version": 1, "size": {"x": 32, "y": 32}, "license": "CC-BY-SA-3.0", "copyright": "Taken from https://github.com/discordia-space/CEV-Eris at commit 9a3a3a180344460263e8df7ea2565128e07b86b5", "states": [{"name": "breath", "directions": 1, "delays": [[1.0]]}, {"name": "equipped-MASK", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}]}

Binary file not shown.

After

Width:  |  Height:  |  Size: 286 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 329 B

View File

@@ -0,0 +1 @@
{"version": 1, "size": {"x": 32, "y": 32}, "license": "CC-BY-SA-3.0", "copyright": "Taken from https://github.com/discordia-space/CEV-Eris at commit 9a3a3a180344460263e8df7ea2565128e07b86b5", "states": [{"name": "equipped-EYES", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}, {"name": "meson", "directions": 1, "delays": [[1.0]]}]}

Binary file not shown.

After

Width:  |  Height:  |  Size: 324 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 374 B

View File

@@ -0,0 +1 @@
{"version": 1, "size": {"x": 32, "y": 32}, "license": "CC-BY-SA-3.0", "copyright": "Taken from https://github.com/discordia-space/CEV-Eris at commit 9a3a3a180344460263e8df7ea2565128e07b86b5", "states": [{"name": "black", "directions": 1, "delays": [[1.0]]}, {"name": "equipped-FEET", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}]}

Binary file not shown.

After

Width:  |  Height:  |  Size: 424 B

View File

@@ -0,0 +1 @@
{"version": 1, "size": {"x": 32, "y": 32}, "license": "CC-BY-SA-3.0", "copyright": "Taken from https://github.com/discordia-space/CEV-Eris at commit 9a3a3a180344460263e8df7ea2565128e07b86b5", "states": [{"name": "equipped-FEET", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}, {"name": "white", "directions": 1, "delays": [[1.0]]}]}

Binary file not shown.

After

Width:  |  Height:  |  Size: 259 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 187 B

View File

@@ -0,0 +1 @@
{"version": 1, "size": {"x": 32, "y": 32}, "license": "CC-BY-SA-3.0", "copyright": "Taken from https://github.com/discordia-space/CEV-Eris at commit 9a3a3a180344460263e8df7ea2565128e07b86b5", "states": [{"name": "equipped-EYES", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}, {"name": "sunglasses", "directions": 1, "delays": [[1.0]]}]}

Binary file not shown.

After

Width:  |  Height:  |  Size: 226 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 226 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 426 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@@ -0,0 +1 @@
{"version": 1, "size": {"x": 32, "y": 32}, "license": "CC-BY-SA-3.0", "copyright": "Taken from https://github.com/discordia-space/CEV-Eris at commit 9a3a3a180344460263e8df7ea2565128e07b86b5", "states": [{"name": "assistant", "directions": 1, "delays": [[1.0]]}, {"name": "equipped-INNERCLOTHING", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}]}

Binary file not shown.

After

Width:  |  Height:  |  Size: 446 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 509 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 532 B

View File

@@ -0,0 +1,74 @@
{
"version": 1,
"size": {
"x": 32,
"y": 32
},
"license": "CC-BY-SA-3.0",
"copyright": "Taken from https://github.com/discordia-space/CEV-Eris at commit 9a3a3a180344460263e8df7ea2565128e07b86b5",
"states": [
{
"name": "engine",
"directions": 1,
"delays": [
[
1.0
]
]
},
{
"name": "equipped-INNERCLOTHING",
"directions": 4,
"delays": [
[
1.0
],
[
1.0
],
[
1.0
],
[
1.0
]
]
},
{
"name": "inhand-left",
"directions": 4,
"delays": [
[
1.0
],
[
1.0
],
[
1.0
],
[
1.0
]
]
},
{
"name": "inhand-right",
"directions": 4,
"delays": [
[
1.0
],
[
1.0
],
[
1.0
],
[
1.0
]
]
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 993 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 394 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 487 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 507 B

View File

@@ -0,0 +1,74 @@
{
"version": 1,
"size": {
"x": 32,
"y": 32
},
"license": "CC-BY-SA-3.0",
"copyright": "Taken from https://github.com/discordia-space/CEV-Eris at commit 9a3a3a180344460263e8df7ea2565128e07b86b5",
"states": [
{
"name": "equipped-INNERCLOTHING",
"directions": 4,
"delays": [
[
1.0
],
[
1.0
],
[
1.0
],
[
1.0
]
]
},
{
"name": "grey",
"directions": 1,
"delays": [
[
1.0
]
]
},
{
"name": "inhand-left",
"directions": 4,
"delays": [
[
1.0
],
[
1.0
],
[
1.0
],
[
1.0
]
]
},
{
"name": "inhand-right",
"directions": 4,
"delays": [
[
1.0
],
[
1.0
],
[
1.0
],
[
1.0
]
]
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 513 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 561 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 456 B

View File

@@ -0,0 +1,74 @@
{
"version": 1,
"size": {
"x": 32,
"y": 32
},
"license": "CC-BY-SA-3.0",
"copyright": "Taken from https://github.com/discordia-space/CEV-Eris at commit 9a3a3a180344460263e8df7ea2565128e07b86b5",
"states": [
{
"name": "equipped-INNERCLOTHING",
"directions": 4,
"delays": [
[
1.0
],
[
1.0
],
[
1.0
],
[
1.0
]
]
},
{
"name": "inhand-left",
"directions": 4,
"delays": [
[
1.0
],
[
1.0
],
[
1.0
],
[
1.0
]
]
},
{
"name": "inhand-right",
"directions": 4,
"delays": [
[
1.0
],
[
1.0
],
[
1.0
],
[
1.0
]
]
},
{
"name": "janitor",
"directions": 1,
"delays": [
[
1.0
]
]
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 757 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 448 B

View File

@@ -0,0 +1 @@
{"version": 1, "size": {"x": 32, "y": 32}, "license": "CC-BY-SA-3.0", "copyright": "Taken from https://github.com/discordia-space/CEV-Eris at commit 9a3a3a180344460263e8df7ea2565128e07b86b5", "states": [{"name": "equipped-OUTERCLOTHING", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}, {"name": "hazard", "directions": 1, "delays": [[1.0]]}]}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@@ -0,0 +1,29 @@
{
"version": 1,
"size": {
"x": 32,
"y": 32
},
"license": "CC-BY-SA-3.0",
"copyright": "Taken from https://github.com/discordia-space/CEV-Eris at commit 9a3a3a180344460263e8df7ea2565128e07b86b5",
"states": [
{
"name": "male",
"directions": 4,
"delays": [
[
1.0
],
[
1.0
],
[
1.0
],
[
1.0
]
]
}
]
}

View File

@@ -0,0 +1,2 @@
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=RSI/@EntryIndexedValue">RSI</s:String></wpf:ResourceDictionary>

2
engine

Submodule engine updated: 7f74ae7b61...99ab6fce9c