Storage Standardization [Take 2] (#21270)

This commit is contained in:
Nemanja
2023-10-30 23:55:55 -04:00
committed by GitHub
parent 2c5ea97d9a
commit 0c329ed661
240 changed files with 1365 additions and 1275 deletions

View File

@@ -1,16 +1,15 @@
using System.Numerics; using System.Numerics;
using Robust.Client.GameObjects; using Content.Client.Message;
using Robust.Client.Graphics; using Robust.Client.Graphics;
using Robust.Client.UserInterface.Controls; using Robust.Client.UserInterface.Controls;
using Robust.Client.UserInterface.CustomControls;
using Content.Client.Stylesheets; using Content.Client.Stylesheets;
using Content.Client.UserInterface.Controls; using Content.Client.UserInterface.Controls;
using Content.Shared.IdentityManagement; using Content.Shared.IdentityManagement;
using Content.Shared.Item; using Content.Shared.Item;
using Content.Shared.Stacks; using Content.Shared.Stacks;
using Content.Shared.Storage; using Content.Shared.Storage;
using Content.Shared.Storage.EntitySystems;
using Robust.Client.UserInterface; using Robust.Client.UserInterface;
using Robust.Shared.Containers;
using static Robust.Client.UserInterface.Controls.BoxContainer; using static Robust.Client.UserInterface.Controls.BoxContainer;
using Direction = Robust.Shared.Maths.Direction; using Direction = Robust.Shared.Maths.Direction;
@@ -23,7 +22,9 @@ namespace Content.Client.Storage.UI
{ {
private readonly IEntityManager _entityManager; private readonly IEntityManager _entityManager;
private readonly Label _information; private readonly SharedStorageSystem _storage;
private readonly RichTextLabel _information;
public readonly ContainerButton StorageContainerButton; public readonly ContainerButton StorageContainerButton;
public readonly ListContainer EntityList; public readonly ListContainer EntityList;
private readonly StyleBoxFlat _hoveredBox = new() { BackgroundColor = Color.Black.WithAlpha(0.35f) }; private readonly StyleBoxFlat _hoveredBox = new() { BackgroundColor = Color.Black.WithAlpha(0.35f) };
@@ -32,6 +33,7 @@ namespace Content.Client.Storage.UI
public StorageWindow(IEntityManager entityManager) public StorageWindow(IEntityManager entityManager)
{ {
_entityManager = entityManager; _entityManager = entityManager;
_storage = _entityManager.System<SharedStorageSystem>();
SetSize = new Vector2(240, 320); SetSize = new Vector2(240, 320);
Title = Loc.GetString("comp-storage-window-title"); Title = Loc.GetString("comp-storage-window-title");
RectClipContent = true; RectClipContent = true;
@@ -60,11 +62,13 @@ namespace Content.Client.Storage.UI
StorageContainerButton.AddChild(vBox); StorageContainerButton.AddChild(vBox);
_information = new Label _information = new RichTextLabel
{ {
Text = Loc.GetString("comp-storage-window-volume", ("itemCount", 0), ("usedVolume", 0), ("maxVolume", 0)),
VerticalAlignment = VAlignment.Center VerticalAlignment = VAlignment.Center
}; };
_information.SetMessage(Loc.GetString("comp-storage-window-weight",
("percent", 0),
("size", SharedItemSystem.GetItemSizeLocale(ItemSize.Normal))));
vBox.AddChild(_information); vBox.AddChild(_information);
@@ -101,15 +105,25 @@ namespace Content.Client.Storage.UI
EntityList.PopulateList(list); EntityList.PopulateList(list);
// Sets information about entire storage container current capacity SetStorageInformation((entity, component));
if (component.StorageCapacityMax != 0) }
private void SetStorageInformation(Entity<StorageComponent> uid)
{
//todo: text is the straight agenda. What about anything else?
if (uid.Comp.MaxSlots == null)
{ {
_information.Text = Loc.GetString("comp-storage-window-volume", ("itemCount", storedCount), _information.SetMarkup(Loc.GetString("comp-storage-window-weight",
("usedVolume", component.StorageUsed), ("maxVolume", component.StorageCapacityMax)); ("weight", _storage.GetCumulativeItemSizes(uid, uid.Comp)),
("maxWeight", uid.Comp.MaxTotalWeight),
("size", SharedItemSystem.GetItemSizeLocale(_storage.GetMaxItemSize((uid, uid.Comp))))));
} }
else else
{ {
_information.Text = Loc.GetString("comp-storage-window-volume-unlimited", ("itemCount", storedCount)); _information.SetMarkup(Loc.GetString("comp-storage-window-slots",
("itemCount", uid.Comp.Container.ContainedEntities.Count),
("maxCount", uid.Comp.MaxSlots),
("size", SharedItemSystem.GetItemSizeLocale(_storage.GetMaxItemSize((uid, uid.Comp))))));
} }
} }
@@ -122,10 +136,9 @@ namespace Content.Client.Storage.UI
|| !_entityManager.EntityExists(entity)) || !_entityManager.EntityExists(entity))
return; return;
_entityManager.TryGetComponent(entity, out ItemComponent? item);
_entityManager.TryGetComponent(entity, out StackComponent? stack); _entityManager.TryGetComponent(entity, out StackComponent? stack);
_entityManager.TryGetComponent(entity, out ItemComponent? item);
var count = stack?.Count ?? 1; var count = stack?.Count ?? 1;
var size = item?.Size;
var spriteView = new SpriteView var spriteView = new SpriteView
{ {
@@ -147,12 +160,14 @@ namespace Content.Client.Storage.UI
HorizontalExpand = true, HorizontalExpand = true,
ClipText = true, ClipText = true,
Text = _entityManager.GetComponent<MetaDataComponent>(Identity.Entity(entity, _entityManager)).EntityName + Text = _entityManager.GetComponent<MetaDataComponent>(Identity.Entity(entity, _entityManager)).EntityName +
(count > 1 ? $" x {count}" : string.Empty), (count > 1 ? $" x {count}" : string.Empty)
}, },
new Label new Label
{ {
Align = Label.AlignMode.Right, Align = Label.AlignMode.Right,
Text = size.ToString() ?? Loc.GetString("comp-storage-no-item-size"), Text = item?.Size != null
? $"{SharedItemSystem.GetItemSizeWeight(item.Size)}"
: Loc.GetString("comp-storage-no-item-size")
} }
} }
}); });

View File

@@ -26,7 +26,7 @@ namespace Content.IntegrationTests.Tests
- type: Clothing - type: Clothing
slots: [innerclothing] slots: [innerclothing]
- type: Item - type: Item
size: 5 size: Tiny
- type: entity - type: entity
name: IDCardDummy name: IDCardDummy
@@ -36,7 +36,7 @@ namespace Content.IntegrationTests.Tests
slots: slots:
- idcard - idcard
- type: Item - type: Item
size: 5 size: Tiny
- type: IdCard - type: IdCard
- type: entity - type: entity
@@ -44,14 +44,14 @@ namespace Content.IntegrationTests.Tests
id: FlashlightDummy id: FlashlightDummy
components: components:
- type: Item - type: Item
size: 5 size: Tiny
- type: entity - type: entity
name: ToolboxDummy name: ToolboxDummy
id: ToolboxDummy id: ToolboxDummy
components: components:
- type: Item - type: Item
size: 9999 size: Huge
"; ";
[Test] [Test]
public async Task Test() public async Task Test()

View File

@@ -1,39 +0,0 @@
using Content.Shared.Item;
using Content.Shared.Stacks;
using Robust.Shared.GameObjects;
using Robust.Shared.Prototypes;
namespace Content.IntegrationTests.Tests;
[TestFixture]
public sealed class StackTest
{
[Test]
public async Task StackCorrectItemSize()
{
await using var pair = await PoolManager.GetServerClient();
var server = pair.Server;
var protoManager = server.ResolveDependency<IPrototypeManager>();
var compFact = server.ResolveDependency<IComponentFactory>();
Assert.Multiple(() =>
{
foreach (var entity in PoolManager.GetPrototypesWithComponent<StackComponent>(server))
{
if (!entity.TryGetComponent<StackComponent>(out var stackComponent, compFact) ||
!entity.TryGetComponent<ItemComponent>(out var itemComponent, compFact))
continue;
if (!protoManager.TryIndex<StackPrototype>(stackComponent.StackTypeId, out var stackProto) ||
stackProto.ItemSize == null)
continue;
var expectedSize = stackProto.ItemSize * stackComponent.Count;
Assert.That(itemComponent.Size, Is.EqualTo(expectedSize), $"Prototype id: {entity.ID} has an item size of {itemComponent.Size} but expected size of {expectedSize}.");
}
});
await pair.CleanReturnAsync();
}
}

View File

@@ -3,11 +3,12 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using Content.Server.Storage.Components; using Content.Server.Storage.Components;
using Content.Shared.Item; using Content.Shared.Item;
using Content.Shared.Prototypes;
using Content.Shared.Storage; using Content.Shared.Storage;
using Content.Shared.Storage.Components; using Content.Shared.Storage.Components;
using Content.Shared.Storage.EntitySystems;
using Robust.Shared.GameObjects; using Robust.Shared.GameObjects;
using Robust.Shared.Prototypes; using Robust.Shared.Prototypes;
using Robust.UnitTesting;
namespace Content.IntegrationTests.Tests namespace Content.IntegrationTests.Tests
{ {
@@ -32,9 +33,11 @@ namespace Content.IntegrationTests.Tests
{ {
if (!proto.TryGetComponent<StorageComponent>("Storage", out var storage) || if (!proto.TryGetComponent<StorageComponent>("Storage", out var storage) ||
storage.Whitelist != null || storage.Whitelist != null ||
!proto.TryGetComponent<ItemComponent>("Item", out var item)) continue; storage.MaxItemSize == null ||
!proto.TryGetComponent<ItemComponent>("Item", out var item))
continue;
Assert.That(storage.StorageCapacityMax, Is.LessThanOrEqualTo(item.Size), $"Found storage arbitrage on {proto.ID}"); Assert.That(storage.MaxItemSize.Value, Is.LessThanOrEqualTo(item.Size), $"Found storage arbitrage on {proto.ID}");
} }
}); });
await pair.CleanReturnAsync(); await pair.CleanReturnAsync();
@@ -82,69 +85,122 @@ namespace Content.IntegrationTests.Tests
{ {
foreach (var proto in PoolManager.GetPrototypesWithComponent<StorageFillComponent>(server)) foreach (var proto in PoolManager.GetPrototypesWithComponent<StorageFillComponent>(server))
{ {
int capacity; if (proto.HasComponent<EntityStorageComponent>(compFact))
var isEntStorage = false; continue;
if (proto.TryGetComponent<StorageComponent>("Storage", out var storage)) if (!proto.TryGetComponent<StorageComponent>("Storage", out var storage))
{ {
capacity = storage.StorageCapacityMax; Assert.Fail($"Entity {proto.ID} has storage-fill without a storage component!");
continue;
} }
else if (proto.TryGetComponent<EntityStorageComponent>("EntityStorage", out var entStorage))
proto.TryGetComponent<ItemComponent>("Item", out var item);
var fill = (StorageFillComponent) proto.Components[id].Component;
var size = GetFillSize(fill, false, protoMan);
var maxSize = storage.MaxItemSize ??
(item?.Size == null
? SharedStorageSystem.DefaultStorageMaxItemSize
: (ItemSize) Math.Max(0, (int) item.Size - 1));
if (storage.MaxSlots != null)
{ {
capacity = entStorage.Capacity; Assert.That(GetFillSize(fill, true, protoMan), Is.LessThanOrEqualTo(storage.MaxSlots),
isEntStorage = true; $"{proto.ID} storage fill has too many items.");
} }
else else
{
Assert.That(size, Is.LessThanOrEqualTo(storage.MaxTotalWeight), $"{proto.ID} storage fill is too large.");
}
foreach (var entry in fill.Contents)
{
if (entry.PrototypeId == null)
continue;
if (!protoMan.TryIndex<EntityPrototype>(entry.PrototypeId, out var fillItem))
continue;
if (!fillItem.TryGetComponent<ItemComponent>("Item", out var entryItem))
continue;
Assert.That(entryItem.Size, Is.LessThanOrEqualTo(maxSize),
$"Entity {proto.ID} has storage-fill item, {entry.PrototypeId}, that is too large");
}
}
});
await pair.CleanReturnAsync();
}
[Test]
public async Task TestSufficientSpaceForEntityStorageFill()
{
await using var pair = await PoolManager.GetServerClient();
var server = pair.Server;
var protoMan = server.ResolveDependency<IPrototypeManager>();
var compFact = server.ResolveDependency<IComponentFactory>();
var id = compFact.GetComponentName(typeof(StorageFillComponent));
Assert.Multiple(() =>
{
foreach (var proto in PoolManager.GetPrototypesWithComponent<StorageFillComponent>(server))
{
if (proto.HasComponent<StorageComponent>(compFact))
continue;
if (!proto.TryGetComponent<EntityStorageComponent>("EntityStorage", out var entStorage))
{ {
Assert.Fail($"Entity {proto.ID} has storage-fill without a storage component!"); Assert.Fail($"Entity {proto.ID} has storage-fill without a storage component!");
continue; continue;
} }
var fill = (StorageFillComponent) proto.Components[id].Component; var fill = (StorageFillComponent) proto.Components[id].Component;
var size = GetFillSize(fill, isEntStorage); var size = GetFillSize(fill, true, protoMan);
Assert.That(size, Is.LessThanOrEqualTo(capacity), $"{proto.ID} storage fill is too large."); Assert.That(size, Is.LessThanOrEqualTo(entStorage.Capacity),
$"{proto.ID} storage fill is too large.");
} }
}); });
await pair.CleanReturnAsync();
}
int GetEntrySize(EntitySpawnEntry entry, bool isEntStorage) private int GetEntrySize(EntitySpawnEntry entry, bool getCount, IPrototypeManager protoMan)
{
if (entry.PrototypeId == null)
return 0;
if (!protoMan.TryIndex<EntityPrototype>(entry.PrototypeId, out var proto))
{ {
if (entry.PrototypeId == null) Assert.Fail($"Unknown prototype: {entry.PrototypeId}");
return 0;
if (!protoMan.TryIndex<EntityPrototype>(entry.PrototypeId, out var proto))
{
Assert.Fail($"Unknown prototype: {entry.PrototypeId}");
return 0;
}
if (isEntStorage)
return entry.Amount;
if (proto.TryGetComponent<ItemComponent>("Item", out var item))
return item.Size * entry.Amount;
Assert.Fail($"Prototype is missing item comp: {entry.PrototypeId}");
return 0; return 0;
} }
int GetFillSize(StorageFillComponent fill, bool isEntStorage) if (getCount)
return entry.Amount;
if (proto.TryGetComponent<ItemComponent>("Item", out var item))
return SharedItemSystem.GetItemSizeWeight(item.Size) * entry.Amount;
Assert.Fail($"Prototype is missing item comp: {entry.PrototypeId}");
return 0;
}
private int GetFillSize(StorageFillComponent fill, bool getCount, IPrototypeManager protoMan)
{
var totalSize = 0;
var groups = new Dictionary<string, int>();
foreach (var entry in fill.Contents)
{ {
var totalSize = 0; var size = GetEntrySize(entry, getCount, protoMan);
var groups = new Dictionary<string, int>();
foreach (var entry in fill.Contents)
{
var size = GetEntrySize(entry, isEntStorage);
if (entry.GroupId == null) if (entry.GroupId == null)
totalSize += size; totalSize += size;
else else
groups[entry.GroupId] = Math.Max(size, groups.GetValueOrDefault(entry.GroupId)); groups[entry.GroupId] = Math.Max(size, groups.GetValueOrDefault(entry.GroupId));
}
return totalSize + groups.Values.Sum();
} }
await pair.CleanReturnAsync(); return totalSize + groups.Values.Sum();
} }
} }
} }

View File

@@ -180,14 +180,13 @@ namespace Content.Server.Chemistry.EntitySystems
var user = message.Session.AttachedEntity; var user = message.Session.AttachedEntity;
var maybeContainer = _itemSlotsSystem.GetItemOrNull(chemMaster, SharedChemMaster.OutputSlotName); var maybeContainer = _itemSlotsSystem.GetItemOrNull(chemMaster, SharedChemMaster.OutputSlotName);
if (maybeContainer is not { Valid: true } container if (maybeContainer is not { Valid: true } container
|| !TryComp(container, out StorageComponent? storage) || !TryComp(container, out StorageComponent? storage))
|| storage.Container is null)
{ {
return; // output can't fit pills return; // output can't fit pills
} }
// Ensure the number is valid. // Ensure the number is valid.
if (message.Number == 0 || message.Number > storage.StorageCapacityMax - storage.StorageUsed) if (message.Number == 0 || !_storageSystem.HasSpace((container, storage)))
return; return;
// Ensure the amount is valid. // Ensure the amount is valid.
@@ -348,17 +347,14 @@ namespace Content.Server.Chemistry.EntitySystems
if (!TryComp(container, out StorageComponent? storage)) if (!TryComp(container, out StorageComponent? storage))
return null; return null;
var pills = storage.Container?.ContainedEntities.Select((Func<EntityUid, (string, FixedPoint2 quantity)>) (pill => var pills = storage.Container.ContainedEntities.Select((Func<EntityUid, (string, FixedPoint2 quantity)>) (pill =>
{ {
_solutionContainerSystem.TryGetSolution(pill, SharedChemMaster.PillSolutionName, out var solution); _solutionContainerSystem.TryGetSolution(pill, SharedChemMaster.PillSolutionName, out var solution);
var quantity = solution?.Volume ?? FixedPoint2.Zero; var quantity = solution?.Volume ?? FixedPoint2.Zero;
return (Name(pill), quantity); return (Name(pill), quantity);
})).ToList(); })).ToList();
if (pills == null) return new ContainerInfo(name, _storageSystem.GetCumulativeItemSizes(container.Value, storage), storage.MaxTotalWeight)
return null;
return new ContainerInfo(name, storage.StorageUsed, storage.StorageCapacityMax)
{ {
Entities = pills Entities = pills
}; };

View File

@@ -1,3 +1,4 @@
using System.Linq;
using Content.Server.Body.Components; using Content.Server.Body.Components;
using Content.Server.Body.Systems; using Content.Server.Body.Systems;
using Content.Server.Inventory; using Content.Server.Inventory;
@@ -122,7 +123,7 @@ public sealed class FoodSystem : EntitySystem
return (false, false); return (false, false);
// Check for used storage on the food item // Check for used storage on the food item
if (TryComp<StorageComponent>(food, out var storageState) && storageState.StorageUsed != 0) if (TryComp<StorageComponent>(food, out var storageState) && storageState.Container.ContainedEntities.Any())
{ {
_popup.PopupEntity(Loc.GetString("food-has-used-storage", ("food", food)), user, user); _popup.PopupEntity(Loc.GetString("food-has-used-storage", ("food", food)), user, user);
return (false, true); return (false, true);

View File

@@ -19,7 +19,7 @@ namespace Content.Server.Storage.Components
/// Max item size that can be fitted into secret stash. /// Max item size that can be fitted into secret stash.
/// </summary> /// </summary>
[DataField("maxItemSize")] [DataField("maxItemSize")]
public int MaxItemSize = (int) ReferenceSizes.Pocket; public ItemSize MaxItemSize = ItemSize.Small;
/// <summary> /// <summary>
/// IC secret stash name. For example "the toilet cistern". /// IC secret stash name. For example "the toilet cistern".

View File

@@ -1,7 +1,6 @@
using Content.Shared.Rounding; using Content.Shared.Rounding;
using Content.Shared.Storage; using Content.Shared.Storage;
using Content.Shared.Storage.Components; using Content.Shared.Storage.Components;
using Robust.Server.GameObjects;
using Robust.Shared.Containers; using Robust.Shared.Containers;
namespace Content.Server.Storage.EntitySystems; namespace Content.Server.Storage.EntitySystems;
@@ -13,12 +12,12 @@ public sealed class StorageFillVisualizerSystem : EntitySystem
public override void Initialize() public override void Initialize()
{ {
base.Initialize(); base.Initialize();
SubscribeLocalEvent<StorageFillVisualizerComponent, ComponentInit>(OnInit); SubscribeLocalEvent<StorageFillVisualizerComponent, ComponentStartup>(OnStartup);
SubscribeLocalEvent<StorageFillVisualizerComponent, EntInsertedIntoContainerMessage>(OnInserted); SubscribeLocalEvent<StorageFillVisualizerComponent, EntInsertedIntoContainerMessage>(OnInserted);
SubscribeLocalEvent<StorageFillVisualizerComponent, EntRemovedFromContainerMessage>(OnRemoved); SubscribeLocalEvent<StorageFillVisualizerComponent, EntRemovedFromContainerMessage>(OnRemoved);
} }
private void OnInit(EntityUid uid, StorageFillVisualizerComponent component, ComponentInit args) private void OnStartup(EntityUid uid, StorageFillVisualizerComponent component, ComponentStartup args)
{ {
UpdateAppearance(uid, component: component); UpdateAppearance(uid, component: component);
} }
@@ -42,7 +41,13 @@ public sealed class StorageFillVisualizerSystem : EntitySystem
if (component.MaxFillLevels < 1) if (component.MaxFillLevels < 1)
return; return;
var level = ContentHelpers.RoundToEqualLevels(storage.StorageUsed, storage.StorageCapacityMax, component.MaxFillLevels); if (!_appearance.TryGetData<int>(uid, StorageVisuals.StorageUsed, out var used, appearance))
return;
if (!_appearance.TryGetData<int>(uid, StorageVisuals.Capacity, out var capacity, appearance))
return;
var level = ContentHelpers.RoundToEqualLevels(used, capacity, component.MaxFillLevels);
_appearance.SetData(uid, StorageFillVisuals.FillLevel, level, appearance); _appearance.SetData(uid, StorageFillVisuals.FillLevel, level, appearance);
} }
} }

View File

@@ -38,10 +38,11 @@ public sealed partial class StorageSystem
if (entityStorageComp != null && EntityStorage.Insert(ent, uid, entityStorageComp)) if (entityStorageComp != null && EntityStorage.Insert(ent, uid, entityStorageComp))
continue; continue;
if (storageComp != null && Insert(uid, ent, out _, storageComp: storageComp, playSound: false)) var reason = string.Empty;
if (storageComp != null && Insert(uid, ent, out _, out reason, storageComp: storageComp, playSound: false))
continue; continue;
Log.Error($"Tried to StorageFill {item} inside {ToPrettyString(uid)} but can't."); Log.Error($"Tried to StorageFill {item} inside {ToPrettyString(uid)} but can't. Reason: {Loc.GetString(reason ?? "no reason.")}");
EntityManager.DeleteEntity(ent); EntityManager.DeleteEntity(ent);
} }
} }

View File

@@ -3,7 +3,9 @@ using System.Linq;
using Content.Server.Administration; using Content.Server.Administration;
using Content.Server.Cargo.Systems; using Content.Server.Cargo.Systems;
using Content.Server.EUI; using Content.Server.EUI;
using Content.Server.Item;
using Content.Shared.Administration; using Content.Shared.Administration;
using Content.Shared.Item;
using Content.Shared.Materials; using Content.Shared.Materials;
using Content.Shared.Research.Prototypes; using Content.Shared.Research.Prototypes;
using Content.Shared.UserInterface; using Content.Shared.UserInterface;
@@ -23,7 +25,7 @@ public sealed class StatValuesCommand : IConsoleCommand
public string Command => "showvalues"; public string Command => "showvalues";
public string Description => Loc.GetString("stat-values-desc"); public string Description => Loc.GetString("stat-values-desc");
public string Help => $"{Command} <cargosell / lathesell / melee>"; public string Help => $"{Command} <cargosell / lathesell / melee / itemsize>";
public void Execute(IConsoleShell shell, string argStr, string[] args) public void Execute(IConsoleShell shell, string argStr, string[] args)
{ {
if (shell.Player is not { } pSession) if (shell.Player is not { } pSession)
@@ -51,6 +53,9 @@ public sealed class StatValuesCommand : IConsoleCommand
case "melee": case "melee":
message = GetMelee(); message = GetMelee();
break; break;
case "itemsize":
message = GetItem();
break;
default: default:
shell.WriteError(Loc.GetString("stat-values-invalid", ("arg", args[0]))); shell.WriteError(Loc.GetString("stat-values-invalid", ("arg", args[0])));
return; return;
@@ -119,6 +124,49 @@ public sealed class StatValuesCommand : IConsoleCommand
return state; return state;
} }
private StatValuesEuiMessage GetItem()
{
var values = new List<string[]>();
var metaQuery = _entManager.GetEntityQuery<MetaDataComponent>();
var itemQuery = _entManager.GetEntityQuery<ItemComponent>();
var items = new HashSet<string>(1024);
var ents = _entManager.GetEntities().ToArray();
foreach (var entity in ents)
{
if (!metaQuery.TryGetComponent(entity, out var meta))
continue;
var id = meta.EntityPrototype?.ID;
// We'll add it even if we don't have it so we don't have to raise the event again because this is probably faster.
if (id == null || !items.Add(id))
continue;
if (!itemQuery.TryGetComponent(entity, out var itemComp))
continue;
values.Add(new[]
{
id,
$"{SharedItemSystem.GetItemSizeLocale(itemComp.Size)}",
});
}
var state = new StatValuesEuiMessage
{
Title = Loc.GetString("stat-item-values"),
Headers = new List<string>
{
Loc.GetString("stat-item-id"),
Loc.GetString("stat-item-price"),
},
Values = values,
};
return state;
}
private StatValuesEuiMessage GetMelee() private StatValuesEuiMessage GetMelee()
{ {
var values = new List<string[]>(); var values = new List<string[]>();

View File

@@ -98,7 +98,7 @@ public sealed class EnergySwordSystem : EntitySystem
{ {
if (TryComp(uid, out ItemComponent? item)) if (TryComp(uid, out ItemComponent? item))
{ {
_item.SetSize(uid, 5, item); _item.SetSize(uid, ItemSize.Small, item);
} }
if (TryComp<DisarmMalusComponent>(uid, out var malus)) if (TryComp<DisarmMalusComponent>(uid, out var malus))
@@ -125,7 +125,7 @@ public sealed class EnergySwordSystem : EntitySystem
{ {
if (TryComp(uid, out ItemComponent? item)) if (TryComp(uid, out ItemComponent? item))
{ {
_item.SetSize(uid, 9999, item); _item.SetSize(uid, ItemSize.Huge, item);
} }
if (comp.IsSharp) if (comp.IsSharp)

View File

@@ -264,7 +264,7 @@ public abstract partial class InventorySystem
if (slotDefinition.DependsOn != null && !TryGetSlotEntity(target, slotDefinition.DependsOn, out _, inventory)) if (slotDefinition.DependsOn != null && !TryGetSlotEntity(target, slotDefinition.DependsOn, out _, inventory))
return false; return false;
var fittingInPocket = slotDefinition.SlotFlags.HasFlag(SlotFlags.POCKET) && item is { Size: <= (int) ReferenceSizes.Pocket }; var fittingInPocket = slotDefinition.SlotFlags.HasFlag(SlotFlags.POCKET) && item is { Size: <= ItemSize.Small };
if (clothing == null && !fittingInPocket if (clothing == null && !fittingInPocket
|| clothing != null && !clothing.Slots.HasFlag(slotDefinition.SlotFlags) && !fittingInPocket) || clothing != null && !clothing.Slots.HasFlag(slotDefinition.SlotFlags) && !fittingInPocket)
{ {

View File

@@ -13,18 +13,17 @@ namespace Content.Shared.Item;
[Access(typeof(SharedItemSystem))] [Access(typeof(SharedItemSystem))]
public sealed partial class ItemComponent : Component public sealed partial class ItemComponent : Component
{ {
[ViewVariables(VVAccess.ReadWrite)] [DataField, ViewVariables(VVAccess.ReadWrite)]
[DataField("size")] [Access(typeof(SharedItemSystem))]
[Access(typeof(SharedItemSystem), Other = AccessPermissions.ReadExecute)] public ItemSize Size = ItemSize.Small;
public int Size = 5;
[Access(typeof(SharedItemSystem))] [Access(typeof(SharedItemSystem))]
[DataField("inhandVisuals")] [DataField]
public Dictionary<HandLocation, List<PrototypeLayerData>> InhandVisuals = new(); public Dictionary<HandLocation, List<PrototypeLayerData>> InhandVisuals = new();
[Access(typeof(SharedItemSystem))] [Access(typeof(SharedItemSystem))]
[ViewVariables(VVAccess.ReadWrite)] [ViewVariables(VVAccess.ReadWrite)]
[DataField("heldPrefix")] [DataField]
public string? HeldPrefix; public string? HeldPrefix;
/// <summary> /// <summary>
@@ -39,10 +38,10 @@ public sealed partial class ItemComponent : Component
[Serializable, NetSerializable] [Serializable, NetSerializable]
public sealed class ItemComponentState : ComponentState public sealed class ItemComponentState : ComponentState
{ {
public int Size { get; } public ItemSize Size { get; }
public string? HeldPrefix { get; } public string? HeldPrefix { get; }
public ItemComponentState(int size, string? heldPrefix) public ItemComponentState(ItemSize size, string? heldPrefix)
{ {
Size = size; Size = size;
HeldPrefix = heldPrefix; HeldPrefix = heldPrefix;
@@ -67,15 +66,38 @@ public sealed class VisualsChangedEvent : EntityEventArgs
} }
/// <summary> /// <summary>
/// Reference sizes for common containers and items. /// Abstracted sizes for items.
/// Used to determine what can fit into inventories.
/// </summary> /// </summary>
public enum ReferenceSizes public enum ItemSize
{ {
Wallet = 4, /// <summary>
Pocket = 12, /// Items that can be held completely in one's hand.
Box = 24, /// </summary>
Belt = 30, Tiny = 1,
Toolbox = 60,
Backpack = 100, /// <summary>
NoStoring = 9999 /// Items that can fit inside of a standard pocket.
/// </summary>
Small = 2,
/// <summary>
/// Items that can fit inside of a standard bag.
/// </summary>
Normal = 4,
/// <summary>
/// Items that are too large to fit inside of standard bags, but can worn in exterior slots or placed in custom containers.
/// </summary>
Large = 16,
/// <summary>
/// Items that are too large to place inside of any kind of container.
/// </summary>
Huge = 24,
/// <summary>
/// Picture furry gf
/// </summary>
Ginormous = 48
} }

View File

@@ -1,3 +1,4 @@
using Content.Shared.Item;
using Robust.Shared.Audio; using Robust.Shared.Audio;
using Robust.Shared.GameStates; using Robust.Shared.GameStates;
@@ -20,11 +21,11 @@ public sealed partial class ItemToggleComponent : Component
[ViewVariables(VVAccess.ReadWrite)] [ViewVariables(VVAccess.ReadWrite)]
[DataField("offSize")] [DataField("offSize")]
public int OffSize = 1; public ItemSize OffSize = ItemSize.Small;
[ViewVariables(VVAccess.ReadWrite)] [ViewVariables(VVAccess.ReadWrite)]
[DataField("onSize")] [DataField("onSize")]
public int OnSize = 9999; public ItemSize OnSize = ItemSize.Huge;
} }
[ByRefEvent] [ByRefEvent]

View File

@@ -1,21 +1,18 @@
using Content.Shared.CombatMode;
using Content.Shared.Hands.EntitySystems; using Content.Shared.Hands.EntitySystems;
using Content.Shared.Interaction; using Content.Shared.Interaction;
using Content.Shared.Stacks; using Content.Shared.Stacks;
using Content.Shared.Verbs; using Content.Shared.Verbs;
using Content.Shared.Examine; using Content.Shared.Examine;
using JetBrains.Annotations;
using Robust.Shared.Containers; using Robust.Shared.Containers;
using Robust.Shared.GameStates; using Robust.Shared.GameStates;
using Robust.Shared.Prototypes;
using Robust.Shared.Utility; using Robust.Shared.Utility;
namespace Content.Shared.Item; namespace Content.Shared.Item;
public abstract class SharedItemSystem : EntitySystem public abstract class SharedItemSystem : EntitySystem
{ {
[Dependency] private readonly IPrototypeManager _prototype = default!;
[Dependency] private readonly SharedHandsSystem _handsSystem = default!; [Dependency] private readonly SharedHandsSystem _handsSystem = default!;
[Dependency] private readonly SharedCombatModeSystem _combatMode = default!;
[Dependency] protected readonly SharedContainerSystem Container = default!; [Dependency] protected readonly SharedContainerSystem Container = default!;
public override void Initialize() public override void Initialize()
@@ -33,13 +30,13 @@ public abstract class SharedItemSystem : EntitySystem
#region Public API #region Public API
public void SetSize(EntityUid uid, int size, ItemComponent? component = null) public void SetSize(EntityUid uid, ItemSize size, ItemComponent? component = null)
{ {
if (!Resolve(uid, ref component, false)) if (!Resolve(uid, ref component, false))
return; return;
component.Size = size; component.Size = size;
Dirty(component); Dirty(uid, component);
} }
public void SetHeldPrefix(EntityUid uid, string? heldPrefix, ItemComponent? component = null) public void SetHeldPrefix(EntityUid uid, string? heldPrefix, ItemComponent? component = null)
@@ -51,7 +48,7 @@ public abstract class SharedItemSystem : EntitySystem
return; return;
component.HeldPrefix = heldPrefix; component.HeldPrefix = heldPrefix;
Dirty(component); Dirty(uid, component);
VisualsChanged(uid); VisualsChanged(uid);
} }
@@ -67,7 +64,7 @@ public abstract class SharedItemSystem : EntitySystem
item.InhandVisuals = otherItem.InhandVisuals; item.InhandVisuals = otherItem.InhandVisuals;
item.HeldPrefix = otherItem.HeldPrefix; item.HeldPrefix = otherItem.HeldPrefix;
Dirty(item); Dirty(uid, item);
VisualsChanged(uid); VisualsChanged(uid);
} }
@@ -83,14 +80,7 @@ public abstract class SharedItemSystem : EntitySystem
protected virtual void OnStackCountChanged(EntityUid uid, ItemComponent component, StackCountChangedEvent args) protected virtual void OnStackCountChanged(EntityUid uid, ItemComponent component, StackCountChangedEvent args)
{ {
if (!TryComp<StackComponent>(uid, out var stack))
return;
if (!_prototype.TryIndex<StackPrototype>(stack.StackTypeId, out var stackProto) ||
stackProto.ItemSize is not { } size)
return;
SetSize(uid, args.NewCount * size, component);
} }
private void OnHandleState(EntityUid uid, ItemComponent component, ref ComponentHandleState args) private void OnHandleState(EntityUid uid, ItemComponent component, ref ComponentHandleState args)
@@ -135,7 +125,7 @@ public abstract class SharedItemSystem : EntitySystem
private void OnExamine(EntityUid uid, ItemComponent component, ExaminedEvent args) private void OnExamine(EntityUid uid, ItemComponent component, ExaminedEvent args)
{ {
args.PushMarkup(Loc.GetString("item-component-on-examine-size", args.PushMarkup(Loc.GetString("item-component-on-examine-size",
("size", component.Size))); ("size", GetItemSizeLocale(component.Size))));
} }
/// <summary> /// <summary>
@@ -148,4 +138,16 @@ public abstract class SharedItemSystem : EntitySystem
public virtual void VisualsChanged(EntityUid owner) public virtual void VisualsChanged(EntityUid owner)
{ {
} }
[PublicAPI]
public static string GetItemSizeLocale(ItemSize size)
{
return Robust.Shared.Localization.Loc.GetString($"item-component-size-{size.ToString()}");
}
[PublicAPI]
public static int GetItemSizeWeight(ItemSize size)
{
return (int) size;
}
} }

View File

@@ -1,10 +1,7 @@
using Content.Server.Storage.Components; using Content.Server.Storage.Components;
using Content.Shared.Hands;
using Content.Shared.Inventory; using Content.Shared.Inventory;
using Content.Shared.Stacks;
using Robust.Shared.Map; using Robust.Shared.Map;
using Robust.Shared.Physics.Components; using Robust.Shared.Physics.Components;
using Robust.Shared.Player;
using Robust.Shared.Timing; using Robust.Shared.Timing;
namespace Content.Shared.Storage.EntitySystems; namespace Content.Shared.Storage.EntitySystems;
@@ -56,7 +53,7 @@ public sealed class MagnetPickupSystem : EntitySystem
comp.NextScan += ScanDelay; comp.NextScan += ScanDelay;
// No space // No space
if (storage.StorageUsed >= storage.StorageCapacityMax) if (!_storage.HasSpace((uid, storage)))
continue; continue;
if (!_inventory.TryGetContainingSlot(uid, out var slotDef)) if (!_inventory.TryGetContainingSlot(uid, out var slotDef))

View File

@@ -1,10 +1,11 @@
using System.Diagnostics.CodeAnalysis;
using System.Linq; using System.Linq;
using Content.Shared.ActionBlocker; using Content.Shared.ActionBlocker;
using Content.Shared.CombatMode; using Content.Shared.CombatMode;
using Content.Shared.Containers.ItemSlots; using Content.Shared.Containers.ItemSlots;
using Content.Shared.Destructible; using Content.Shared.Destructible;
using Content.Shared.DoAfter; using Content.Shared.DoAfter;
using Content.Shared.Hands; using Content.Shared.FixedPoint;
using Content.Shared.Hands.Components; using Content.Shared.Hands.Components;
using Content.Shared.Hands.EntitySystems; using Content.Shared.Hands.EntitySystems;
using Content.Shared.Implants.Components; using Content.Shared.Implants.Components;
@@ -46,6 +47,8 @@ public abstract class SharedStorageSystem : EntitySystem
private EntityQuery<StackComponent> _stackQuery; private EntityQuery<StackComponent> _stackQuery;
private EntityQuery<TransformComponent> _xformQuery; private EntityQuery<TransformComponent> _xformQuery;
public const ItemSize DefaultStorageMaxItemSize = ItemSize.Normal;
/// <inheritdoc /> /// <inheritdoc />
public override void Initialize() public override void Initialize()
{ {
@@ -89,6 +92,7 @@ public abstract class SharedStorageSystem : EntitySystem
{ {
// TODO: I had this. // TODO: I had this.
// We can get states being applied before the container is ready. // We can get states being applied before the container is ready.
// ReSharper disable once ConditionIsAlwaysTrueOrFalseAccordingToNullableAPIContract
if (component.Container == default) if (component.Container == default)
return; return;
@@ -229,7 +233,7 @@ public abstract class SharedStorageSystem : EntitySystem
return; return;
} }
if (TryComp<TransformComponent>(uid, out var transformOwner) && TryComp<TransformComponent>(target, out var transformEnt)) if (_xformQuery.TryGetComponent(uid, out var transformOwner) && TryComp<TransformComponent>(target, out var transformEnt))
{ {
var parent = transformOwner.ParentUid; var parent = transformOwner.ParentUid;
@@ -239,7 +243,7 @@ public abstract class SharedStorageSystem : EntitySystem
_transform _transform
); );
if (PlayerInsertEntityInWorld(uid, args.User, target, storageComp)) if (PlayerInsertEntityInWorld((uid, storageComp), args.User, target))
{ {
RaiseNetworkEvent(new AnimateInsertingEntitiesEvent(GetNetEntity(uid), RaiseNetworkEvent(new AnimateInsertingEntitiesEvent(GetNetEntity(uid),
new List<NetEntity> { GetNetEntity(target) }, new List<NetEntity> { GetNetEntity(target) },
@@ -285,7 +289,7 @@ public abstract class SharedStorageSystem : EntitySystem
var angle = targetXform.LocalRotation; var angle = targetXform.LocalRotation;
if (PlayerInsertEntityInWorld(uid, args.Args.User, entity, component)) if (PlayerInsertEntityInWorld((uid, component), args.Args.User, entity))
{ {
successfullyInserted.Add(entity); successfullyInserted.Add(entity);
successfullyInsertedPositions.Add(position); successfullyInsertedPositions.Add(position);
@@ -322,7 +326,7 @@ public abstract class SharedStorageSystem : EntitySystem
/// </summary> /// </summary>
private void OnInteractWithItem(EntityUid uid, StorageComponent storageComp, StorageInteractWithItemEvent args) private void OnInteractWithItem(EntityUid uid, StorageComponent storageComp, StorageInteractWithItemEvent args)
{ {
if (args.Session.AttachedEntity is not EntityUid player) if (args.Session.AttachedEntity is not { } player)
return; return;
var entity = GetEntity(args.InteractedItemUID); var entity = GetEntity(args.InteractedItemUID);
@@ -396,27 +400,16 @@ public abstract class SharedStorageSystem : EntitySystem
public void RecalculateStorageUsed(EntityUid uid, StorageComponent storageComp) public void RecalculateStorageUsed(EntityUid uid, StorageComponent storageComp)
{ {
storageComp.StorageUsed = 0; if (storageComp.MaxSlots == null)
foreach (var entity in storageComp.Container.ContainedEntities)
{ {
if (!_itemQuery.TryGetComponent(entity, out var itemComp)) _appearance.SetData(uid, StorageVisuals.StorageUsed, GetCumulativeItemSizes(uid, storageComp));
continue; _appearance.SetData(uid, StorageVisuals.Capacity, storageComp.MaxTotalWeight);
}
var size = itemComp.Size; else
storageComp.StorageUsed += size; {
_appearance.SetData(uid, StorageVisuals.StorageUsed, storageComp.Container.ContainedEntities.Count);
_appearance.SetData(uid, StorageVisuals.Capacity, storageComp.MaxSlots.Value);
} }
_appearance.SetData(uid, StorageVisuals.StorageUsed, storageComp.StorageUsed);
_appearance.SetData(uid, StorageVisuals.Capacity, storageComp.StorageCapacityMax);
}
public int GetAvailableSpace(EntityUid uid, StorageComponent? component = null)
{
if (!Resolve(uid, ref component))
return 0;
return component.StorageCapacityMax - component.StorageUsed;
} }
/// <summary> /// <summary>
@@ -449,17 +442,20 @@ public abstract class SharedStorageSystem : EntitySystem
/// Verifies if an entity can be stored and if it fits /// Verifies if an entity can be stored and if it fits
/// </summary> /// </summary>
/// <param name="uid">The entity to check</param> /// <param name="uid">The entity to check</param>
/// <param name="insertEnt"></param>
/// <param name="reason">If returning false, the reason displayed to the player</param> /// <param name="reason">If returning false, the reason displayed to the player</param>
/// <param name="storageComp"></param>
/// <param name="item"></param>
/// <returns>true if it can be inserted, false otherwise</returns> /// <returns>true if it can be inserted, false otherwise</returns>
public bool CanInsert(EntityUid uid, EntityUid insertEnt, out string? reason, StorageComponent? storageComp = null) public bool CanInsert(EntityUid uid, EntityUid insertEnt, out string? reason, StorageComponent? storageComp = null, ItemComponent? item = null)
{ {
if (!Resolve(uid, ref storageComp)) if (!Resolve(uid, ref storageComp) || !Resolve(insertEnt, ref item))
{ {
reason = null; reason = null;
return false; return false;
} }
if (TryComp(insertEnt, out TransformComponent? transformComp) && transformComp.Anchored) if (Transform(insertEnt).Anchored)
{ {
reason = "comp-storage-anchored-failure"; reason = "comp-storage-anchored-failure";
return false; return false;
@@ -477,15 +473,28 @@ public abstract class SharedStorageSystem : EntitySystem
return false; return false;
} }
if (TryComp(insertEnt, out StorageComponent? storage) && if (item.Size > GetMaxItemSize((uid, storageComp)))
storage.StorageCapacityMax >= storageComp.StorageCapacityMax)
{ {
reason = "comp-storage-insufficient-capacity"; reason = "comp-storage-too-big";
return false; return false;
} }
if (TryComp(insertEnt, out ItemComponent? itemComp) && if (TryComp<StorageComponent>(insertEnt, out var insertStorage)
itemComp.Size > storageComp.StorageCapacityMax - storageComp.StorageUsed) && GetMaxItemSize((insertEnt, insertStorage)) >= GetMaxItemSize((uid, storageComp)))
{
reason = "comp-storage-too-big";
return false;
}
if (storageComp.MaxSlots != null)
{
if (storageComp.Container.ContainedEntities.Count >= storageComp.MaxSlots)
{
reason = "comp-storage-insufficient-capacity";
return false;
}
}
else if (SharedItemSystem.GetItemSizeWeight(item.Size) + GetCumulativeItemSizes(uid, storageComp) > storageComp.MaxTotalWeight)
{ {
reason = "comp-storage-insufficient-capacity"; reason = "comp-storage-insufficient-capacity";
return false; return false;
@@ -499,11 +508,34 @@ public abstract class SharedStorageSystem : EntitySystem
/// Inserts into the storage container /// Inserts into the storage container
/// </summary> /// </summary>
/// <returns>true if the entity was inserted, false otherwise</returns> /// <returns>true if the entity was inserted, false otherwise</returns>
public bool Insert(EntityUid uid, EntityUid insertEnt, out EntityUid? stackedEntity, EntityUid? user = null, StorageComponent? storageComp = null, bool playSound = true) public bool Insert(
EntityUid uid,
EntityUid insertEnt,
out EntityUid? stackedEntity,
EntityUid? user = null,
StorageComponent? storageComp = null,
bool playSound = true)
{
return Insert(uid, insertEnt, out stackedEntity, out _, user: user, storageComp: storageComp, playSound: playSound);
}
/// <summary>
/// Inserts into the storage container
/// </summary>
/// <returns>true if the entity was inserted, false otherwise</returns>
public bool Insert(
EntityUid uid,
EntityUid insertEnt,
out EntityUid? stackedEntity,
out string? reason,
EntityUid? user = null,
StorageComponent? storageComp = null,
bool playSound = true)
{ {
stackedEntity = null; stackedEntity = null;
reason = null;
if (!Resolve(uid, ref storageComp) || !CanInsert(uid, insertEnt, out _, storageComp)) if (!Resolve(uid, ref storageComp) || !CanInsert(uid, insertEnt, out reason, storageComp))
return false; return false;
/* /*
@@ -542,8 +574,7 @@ public abstract class SharedStorageSystem : EntitySystem
if (insertStack.Count > 0) if (insertStack.Count > 0)
{ {
// Try to insert it as a new stack. // Try to insert it as a new stack.
if (TryComp(insertEnt, out ItemComponent? itemComp) && if (!CanInsert(uid, insertEnt, out _, storageComp) ||
itemComp.Size > storageComp.StorageCapacityMax - storageComp.StorageUsed ||
!storageComp.Container.Insert(insertEnt)) !storageComp.Container.Insert(insertEnt))
{ {
// If we also didn't do any stack fills above then just end // If we also didn't do any stack fills above then just end
@@ -568,7 +599,9 @@ public abstract class SharedStorageSystem : EntitySystem
/// <summary> /// <summary>
/// Inserts an entity into storage from the player's active hand /// Inserts an entity into storage from the player's active hand
/// </summary> /// </summary>
/// <param name="uid"></param>
/// <param name="player">The player to insert an entity from</param> /// <param name="player">The player to insert an entity from</param>
/// <param name="storageComp"></param>
/// <returns>true if inserted, false otherwise</returns> /// <returns>true if inserted, false otherwise</returns>
public bool PlayerInsertHeldEntity(EntityUid uid, EntityUid player, StorageComponent? storageComp = null) public bool PlayerInsertHeldEntity(EntityUid uid, EntityUid player, StorageComponent? storageComp = null)
{ {
@@ -589,21 +622,23 @@ public abstract class SharedStorageSystem : EntitySystem
return false; return false;
} }
return PlayerInsertEntityInWorld(uid, player, toInsert.Value, storageComp); return PlayerInsertEntityInWorld((uid, storageComp), player, toInsert.Value);
} }
/// <summary> /// <summary>
/// Inserts an Entity (<paramref name="toInsert"/>) in the world into storage, informing <paramref name="player"/> if it fails. /// Inserts an Entity (<paramref name="toInsert"/>) in the world into storage, informing <paramref name="player"/> if it fails.
/// <paramref name="toInsert"/> is *NOT* held, see <see cref="PlayerInsertHeldEntity(Robust.Shared.GameObjects.EntityUid)"/>. /// <paramref name="toInsert"/> is *NOT* held, see <see cref="PlayerInsertHeldEntity(EntityUid,EntityUid,StorageComponent)"/>.
/// </summary> /// </summary>
/// <param name="uid"></param>
/// <param name="player">The player to insert an entity with</param> /// <param name="player">The player to insert an entity with</param>
/// <param name="toInsert"></param>
/// <returns>true if inserted, false otherwise</returns> /// <returns>true if inserted, false otherwise</returns>
public bool PlayerInsertEntityInWorld(EntityUid uid, EntityUid player, EntityUid toInsert, StorageComponent? storageComp = null) public bool PlayerInsertEntityInWorld(Entity<StorageComponent?> uid, EntityUid player, EntityUid toInsert)
{ {
if (!Resolve(uid, ref storageComp) || !_sharedInteractionSystem.InRangeUnobstructed(player, uid)) if (!Resolve(uid, ref uid.Comp) || !_sharedInteractionSystem.InRangeUnobstructed(player, uid))
return false; return false;
if (!Insert(uid, toInsert, out _, user: player, storageComp)) if (!Insert(uid, toInsert, out _, user: player, uid.Comp))
{ {
_popupSystem.PopupClient(Loc.GetString("comp-storage-cant-insert"), uid, player); _popupSystem.PopupClient(Loc.GetString("comp-storage-cant-insert"), uid, player);
return false; return false;
@@ -611,6 +646,71 @@ public abstract class SharedStorageSystem : EntitySystem
return true; return true;
} }
/// <summary>
/// Returns true if there is enough space to theoretically fit another item.
/// </summary>
public bool HasSpace(Entity<StorageComponent?> uid)
{
if (!Resolve(uid, ref uid.Comp))
return false;
//todo maybe this shouldn't be authoritative over weight? idk.
if (uid.Comp.MaxSlots != null)
{
return uid.Comp.Container.ContainedEntities.Count < uid.Comp.MaxSlots;
}
return GetCumulativeItemSizes(uid, uid.Comp) < uid.Comp.MaxTotalWeight;
}
/// <summary>
/// Returns the sum of all the ItemSizes of the items inside of a storage.
/// </summary>
public int GetCumulativeItemSizes(EntityUid uid, StorageComponent? component = null)
{
if (!Resolve(uid, ref component))
return 0;
var sum = 0;
foreach (var item in component.Container.ContainedEntities)
{
if (!_itemQuery.TryGetComponent(item, out var itemComp))
continue;
sum += SharedItemSystem.GetItemSizeWeight(itemComp.Size);
}
return sum;
}
public ItemSize GetMaxItemSize(Entity<StorageComponent?> uid)
{
if (!Resolve(uid, ref uid.Comp))
return DefaultStorageMaxItemSize;
// If we specify a max item size, use that
if (uid.Comp.MaxItemSize != null)
return uid.Comp.MaxItemSize.Value;
if (!_itemQuery.TryGetComponent(uid, out var item))
return DefaultStorageMaxItemSize;
// if there is no max item size specified, the value used
// is one below the item size of the storage entity, clamped at ItemSize.Tiny
return (ItemSize) Math.Max((int) item.Size - 1, 1);
}
public FixedPoint2 GetStorageFillPercentage(Entity<StorageComponent?> uid)
{
if (!Resolve(uid, ref uid.Comp))
return 0;
var slotPercent = FixedPoint2.New(uid.Comp.Container.ContainedEntities.Count) / uid.Comp.MaxSlots ?? FixedPoint2.Zero;
var weightPercent = FixedPoint2.New(GetCumulativeItemSizes(uid)) / uid.Comp.MaxTotalWeight;
return FixedPoint2.Max(slotPercent, weightPercent);
}
/// <summary> /// <summary>
/// Plays a clientside pickup animation for the specified uid. /// Plays a clientside pickup animation for the specified uid.
/// </summary> /// </summary>

View File

@@ -1,3 +1,5 @@
using Content.Shared.Item;
using Content.Shared.Storage.EntitySystems;
using Content.Shared.Whitelist; using Content.Shared.Whitelist;
using Robust.Shared.Audio; using Robust.Shared.Audio;
using Robust.Shared.Containers; using Robust.Shared.Containers;
@@ -20,6 +22,26 @@ namespace Content.Shared.Storage
[ViewVariables] [ViewVariables]
public Container Container = default!; public Container Container = default!;
/// <summary>
/// A limit for the cumulative ItemSize weights that can be inserted in this storage.
/// If MaxSlots is not null, then this is ignored.
/// </summary>
[DataField, ViewVariables(VVAccess.ReadWrite), AutoNetworkedField]
public int MaxTotalWeight;
/// <summary>
/// The maximum size item that can be inserted into this storage,
/// </summary>
[DataField, ViewVariables(VVAccess.ReadWrite), AutoNetworkedField]
[Access(typeof(SharedStorageSystem))]
public ItemSize? MaxItemSize;
/// <summary>
/// The max number of entities that can be inserted into this storage.
/// </summary>
[DataField, ViewVariables(VVAccess.ReadWrite), AutoNetworkedField]
public int? MaxSlots;
// TODO: Make area insert its own component. // TODO: Make area insert its own component.
[DataField("quickInsert")] [DataField("quickInsert")]
public bool QuickInsert; // Can insert storables by "attacking" them with the storage entity public bool QuickInsert; // Can insert storables by "attacking" them with the storage entity
@@ -45,18 +67,6 @@ namespace Content.Shared.Storage
[DataField("blacklist")] [DataField("blacklist")]
public EntityWhitelist? Blacklist; public EntityWhitelist? Blacklist;
/// <summary>
/// How much storage is currently being used by contained entities.
/// </summary>
[ViewVariables, DataField("storageUsed"), AutoNetworkedField]
public int StorageUsed;
/// <summary>
/// Maximum capacity for storage.
/// </summary>
[DataField("capacity"), AutoNetworkedField]
public int StorageCapacityMax = 10000;
/// <summary> /// <summary>
/// Sound played whenever an entity is inserted into storage. /// Sound played whenever an entity is inserted into storage.
/// </summary> /// </summary>

View File

@@ -13,3 +13,8 @@ stat-lathe-values = Lathe sell prices
stat-lathe-id = ID stat-lathe-id = ID
stat-lathe-cost = Cost stat-lathe-cost = Cost
stat-lathe-sell = Sell price stat-lathe-sell = Sell price
# Item Sizes
stat-item-values = Item sizes
stat-item-id = ID
stat-item-price = Size

View File

@@ -1,9 +1,10 @@
comp-storage-no-item-size = N/A comp-storage-no-item-size = N/A
comp-storage-cant-insert = Can't insert. comp-storage-cant-insert = Can't insert.
comp-storage-insufficient-capacity = Insufficient capacity. comp-storage-too-big = Too big!
comp-storage-insufficient-capacity = No room!
comp-storage-invalid-container = This doesn't go in there! comp-storage-invalid-container = This doesn't go in there!
comp-storage-anchored-failure = Can't insert an anchored item. comp-storage-anchored-failure = Can't insert an anchored item.
comp-storage-cant-drop = You can't let go of { THE($entity) }! comp-storage-cant-drop = You can't let go of { THE($entity) }!
comp-storage-window-title = Storage Item comp-storage-window-title = Storage Item
comp-storage-window-volume = Items: { $itemCount }, Stored: { $usedVolume }/{ $maxVolume } comp-storage-window-weight = { $weight }/{ $maxWeight }, Max Size: {$size}
comp-storage-window-volume-unlimited = Items: { $itemCount } comp-storage-window-slots = Slots: { $itemCount }/{ $maxCount }, Max Size: {$size}

View File

@@ -7,3 +7,10 @@ pick-up-verb-get-data-text = Pick Up
pick-up-verb-get-data-text-inventory = Put in hand pick-up-verb-get-data-text-inventory = Put in hand
item-component-on-examine-size = Size: {$size} item-component-on-examine-size = Size: {$size}
item-component-size-Tiny = tiny
item-component-size-Small = small
item-component-size-Normal = normal
item-component-size-Large = large
item-component-size-Huge = huge
item-component-size-Ginormous = ginormous

View File

@@ -874,36 +874,6 @@ entities:
pos: -0.5,0.5 pos: -0.5,0.5
parent: 325 parent: 325
type: Transform type: Transform
- proto: ClothingBeltSyndieHolster
entities:
- uid: 317
components:
- flags: InContainer
type: MetaData
- parent: 177
type: Transform
- canCollide: False
type: Physics
- proto: ClothingHandsGlovesCombat
entities:
- uid: 316
components:
- flags: InContainer
type: MetaData
- parent: 177
type: Transform
- canCollide: False
type: Physics
- proto: ClothingMaskGasSyndicate
entities:
- uid: 318
components:
- flags: InContainer
type: MetaData
- parent: 177
type: Transform
- canCollide: False
type: Physics
- proto: ComputerIFFSyndicate - proto: ComputerIFFSyndicate
entities: entities:
- uid: 40 - uid: 40
@@ -926,16 +896,6 @@ entities:
ents: ents:
- 245 - 245
type: ContainerContainer type: ContainerContainer
- proto: Crowbar
entities:
- uid: 313
components:
- flags: InContainer
type: MetaData
- parent: 177
type: Transform
- canCollide: False
type: Physics
- proto: CyberPen - proto: CyberPen
entities: entities:
- uid: 77 - uid: 77
@@ -1672,16 +1632,6 @@ entities:
pos: -2.5,-3.5 pos: -2.5,-3.5
parent: 325 parent: 325
type: Transform type: Transform
- proto: Multitool
entities:
- uid: 314
components:
- flags: InContainer
type: MetaData
- parent: 177
type: Transform
- canCollide: False
type: Physics
- proto: NitrogenTankFilled - proto: NitrogenTankFilled
entities: entities:
- uid: 105 - uid: 105
@@ -1880,20 +1830,6 @@ entities:
type: Transform type: Transform
- canCollide: False - canCollide: False
type: Physics type: Physics
- proto: Screwdriver
entities:
- uid: 310
components:
- flags: InContainer
type: MetaData
- parent: 177
type: Transform
- selected:
enum.DamageStateVisualLayers.Base:
screwdriver: '#1861D5FF'
type: RandomSprite
- canCollide: False
type: Physics
- proto: SheetGlass1 - proto: SheetGlass1
entities: entities:
- uid: 244 - uid: 244
@@ -2382,21 +2318,6 @@ entities:
- pos: 1.5699697,-0.44908836 - pos: 1.5699697,-0.44908836
parent: 325 parent: 325
type: Transform type: Transform
- containers:
storagebase: !type:Container
showEnts: False
occludes: True
ents:
- 310
- 311
- 312
- 313
- 314
- 315
- 316
- 317
- 318
type: ContainerContainer
- canCollide: False - canCollide: False
type: Physics type: Physics
- proto: ToyFigurineNukie - proto: ToyFigurineNukie
@@ -2656,16 +2577,6 @@ entities:
- pos: -2.5,2.5 - pos: -2.5,2.5
parent: 325 parent: 325
type: Transform type: Transform
- proto: Welder
entities:
- uid: 312
components:
- flags: InContainer
type: MetaData
- parent: 177
type: Transform
- canCollide: False
type: Physics
- proto: WindoorSecure - proto: WindoorSecure
entities: entities:
- uid: 166 - uid: 166
@@ -2687,30 +2598,6 @@ entities:
ents: ents:
- 346 - 346
type: ContainerContainer type: ContainerContainer
- proto: Wirecutter
entities:
- uid: 315
components:
- flags: InContainer
type: MetaData
- parent: 177
type: Transform
- selected:
enum.DamageStateVisualLayers.Base:
cutters: '#D58C18FF'
type: RandomSprite
- canCollide: False
type: Physics
- proto: Wrench
entities:
- uid: 311
components:
- flags: InContainer
type: MetaData
- parent: 177
type: Transform
- canCollide: False
type: Physics
- proto: YellowOxygenTankFilled - proto: YellowOxygenTankFilled
entities: entities:
- uid: 167 - uid: 167

View File

@@ -102471,8 +102471,6 @@ entities:
type: Transform type: Transform
- count: 15 - count: 15
type: Stack type: Stack
- size: 15
type: Item
- proto: SheetPlasma - proto: SheetPlasma
entities: entities:
- uid: 12944 - uid: 12944
@@ -102564,8 +102562,6 @@ entities:
type: Transform type: Transform
- count: 20 - count: 20
type: Stack type: Stack
- size: 20
type: Item
- proto: Shovel - proto: Shovel
entities: entities:
- uid: 12955 - uid: 12955

View File

@@ -78331,8 +78331,6 @@ entities:
type: Transform type: Transform
- count: 15 - count: 15
type: Stack type: Stack
- size: 30
type: Item
- proto: StoolBar - proto: StoolBar
entities: entities:
- uid: 921 - uid: 921

View File

@@ -285,8 +285,7 @@
- id: trayScanner - id: trayScanner
- id: RCD - id: RCD
- id: RCDAmmo - id: RCDAmmo
- id: RCDAmmo amount: 2
- id: RCDAmmo
- id: CableMVStack - id: CableMVStack
- id: CableHVStack - id: CableHVStack
- id: CableApcStack - id: CableApcStack

View File

@@ -4,31 +4,31 @@
name: surgical duffel bag name: surgical duffel bag
description: "A large duffel bag for holding extra medical supplies - this one seems to be designed for holding surgical tools." description: "A large duffel bag for holding extra medical supplies - this one seems to be designed for holding surgical tools."
components: components:
- type: StorageFill - type: StorageFill
contents: contents:
- id: Hemostat - id: Hemostat
- id: Saw - id: Saw
- id: Drill - id: Drill
- id: Cautery - id: Cautery
- id: Retractor - id: Retractor
- id: Scalpel - id: Scalpel
- type: entity - type: entity
id: ClothingBackpackDuffelCBURNFilled id: ClothingBackpackDuffelCBURNFilled
parent: ClothingBackpackDuffelCBURN parent: ClothingBackpackDuffelCBURN
suffix: Filled suffix: Filled
components: components:
- type: StorageFill - type: StorageFill
contents: contents:
- id: BoxSurvivalEngineering - id: BoxSurvivalEngineering
- id: WeaponShotgunDoubleBarreled - id: WeaponShotgunDoubleBarreled
- id: BoxShotgunIncendiary - id: BoxShotgunIncendiary
amount: 2 amount: 2
- id: GrenadeFlashBang - id: GrenadeFlashBang
amount: 2 amount: 2
- id: PillAmbuzolPlus - id: PillAmbuzolPlus
- id: PillAmbuzol - id: PillAmbuzol
amount: 4 amount: 4
- type: entity - type: entity
parent: ClothingBackpackDuffelSyndicateMedicalBundle parent: ClothingBackpackDuffelSyndicateMedicalBundle
@@ -36,14 +36,14 @@
name: syndicate surgical duffel bag name: syndicate surgical duffel bag
description: A large duffel bag containing a full suite of surgical tools. description: A large duffel bag containing a full suite of surgical tools.
components: components:
- type: StorageFill - type: StorageFill
contents: contents:
- id: Hemostat - id: Hemostat
- id: SawAdvanced - id: SawAdvanced
- id: Drill - id: Drill
- id: Cautery - id: Cautery
- id: Retractor - id: Retractor
- id: ScalpelAdvanced - id: ScalpelAdvanced
- type: entity - type: entity
parent: ClothingBackpackDuffelSyndicateBundle parent: ClothingBackpackDuffelSyndicateBundle
@@ -51,12 +51,12 @@
name: Bulldog bundle name: Bulldog bundle
description: "Lean and mean: Contains the popular Bulldog Shotgun, a 12g beanbag drum and 3 12g buckshot drums." #, and a pair of Thermal Imaging Goggles. description: "Lean and mean: Contains the popular Bulldog Shotgun, a 12g beanbag drum and 3 12g buckshot drums." #, and a pair of Thermal Imaging Goggles.
components: components:
- type: StorageFill - type: StorageFill
contents: contents:
- id: WeaponShotgunBulldog - id: WeaponShotgunBulldog
- id: MagazineShotgun - id: MagazineShotgun
- id: MagazineShotgun - id: MagazineShotgun
- id: MagazineShotgunBeanbag - id: MagazineShotgunBeanbag
# - id: ThermalImagingGoggles # - id: ThermalImagingGoggles
- type: entity - type: entity
@@ -65,11 +65,11 @@
name: C-20r bundle name: C-20r bundle
description: "Old faithful: The classic C-20r Submachine Gun, bundled with three magazines." #, and a Suppressor. description: "Old faithful: The classic C-20r Submachine Gun, bundled with three magazines." #, and a Suppressor.
components: components:
- type: StorageFill - type: StorageFill
contents: contents:
- id: WeaponSubMachineGunC20r - id: WeaponSubMachineGunC20r
- id: MagazinePistolSubMachineGun - id: MagazinePistolSubMachineGun
amount: 2 amount: 2
# - id: SMGSuppressor # - id: SMGSuppressor
- type: entity - type: entity
@@ -78,11 +78,11 @@
name: Python bundle name: Python bundle
description: "Go loud and proud with a fully loaded Magnum Python, bundled with two speed loaders." description: "Go loud and proud with a fully loaded Magnum Python, bundled with two speed loaders."
components: components:
- type: StorageFill - type: StorageFill
contents: contents:
- id: WeaponRevolverPythonAP - id: WeaponRevolverPythonAP
- id: SpeedLoaderMagnumAP - id: SpeedLoaderMagnumAP
amount: 2 amount: 2
- type: entity - type: entity
parent: ClothingBackpackDuffelSyndicateBundle parent: ClothingBackpackDuffelSyndicateBundle
@@ -90,10 +90,10 @@
name: L6 Saw bundle name: L6 Saw bundle
description: "More dakka: The iconic L6 lightmachinegun, bundled with 2 box magazines." description: "More dakka: The iconic L6 lightmachinegun, bundled with 2 box magazines."
components: components:
- type: StorageFill - type: StorageFill
contents: contents:
- id: WeaponLightMachineGunL6 - id: WeaponLightMachineGunL6
- id: MagazineLightRifleBox - id: MagazineLightRifleBox
- type: entity - type: entity
parent: ClothingBackpackDuffelSyndicateBundle parent: ClothingBackpackDuffelSyndicateBundle
@@ -101,13 +101,13 @@
name: China-Lake bundle name: China-Lake bundle
description: "An old China-Lake grenade launcher bundled with 11 rounds of various destruction capability." description: "An old China-Lake grenade launcher bundled with 11 rounds of various destruction capability."
components: components:
- type: StorageFill - type: StorageFill
contents: contents:
- id: WeaponLauncherChinaLake - id: WeaponLauncherChinaLake
- id: GrenadeBlast - id: GrenadeBlast
amount: 4 amount: 4
- id: GrenadeFrag - id: GrenadeFrag
amount: 4 amount: 4
- type: entity - type: entity
parent: ClothingBackpackDuffelSyndicateBundle parent: ClothingBackpackDuffelSyndicateBundle
@@ -115,17 +115,17 @@
name: M-90gl bundle name: M-90gl bundle
description: "A versatile battle rifle with an attached grenade launcher, bundled with 3 magazines and 6 grenades of various capabilities." description: "A versatile battle rifle with an attached grenade launcher, bundled with 3 magazines and 6 grenades of various capabilities."
components: components:
- type: StorageFill - type: StorageFill
contents: contents:
- id: WeaponRifleM90GrenadeLauncher - id: WeaponRifleM90GrenadeLauncher
- id: MagazineRifle - id: MagazineRifle
amount: 2 amount: 2
- id: GrenadeBlast - id: GrenadeBlast
amount: 2 amount: 2
- id: GrenadeFlash - id: GrenadeFlash
amount: 2 amount: 2
- id: GrenadeFrag - id: GrenadeFrag
amount: 2 amount: 2
- type: entity - type: entity
parent: ClothingBackpackDuffelSyndicateAmmo parent: ClothingBackpackDuffelSyndicateAmmo
@@ -133,14 +133,14 @@
name: ammo bundle name: ammo bundle
description: "Reloading! Contains 4 magazines for the C-20r, 4 drums for the Bulldog, and 2 ammo boxes for the L6 SAW." description: "Reloading! Contains 4 magazines for the C-20r, 4 drums for the Bulldog, and 2 ammo boxes for the L6 SAW."
components: components:
- type: StorageFill - type: StorageFill
contents: contents:
- id: MagazinePistolSubMachineGun - id: MagazinePistolSubMachineGun
amount: 4 amount: 4
- id: MagazineShotgun - id: MagazineShotgun
amount: 4 amount: 4
- id: MagazineLightRifleBox - id: MagazineLightRifleBox
amount: 2 amount: 2
- type: entity - type: entity
parent: ClothingBackpackDuffel parent: ClothingBackpackDuffel
@@ -149,36 +149,36 @@
description: "Contains a full CentCom Official uniform set, headset and clipboard included. Encryption keys and ID access are not included." description: "Contains a full CentCom Official uniform set, headset and clipboard included. Encryption keys and ID access are not included."
suffix: DO NOT MAP suffix: DO NOT MAP
components: components:
- type: Tag - type: Tag
tags: [] # ignore "WhitelistChameleon" tag tags: [] # ignore "WhitelistChameleon" tag
- type: StorageFill - type: StorageFill
contents: contents:
- id: ClothingHeadHatCentcom - id: ClothingHeadHatCentcom
- id: ClothingEyesGlassesSunglasses - id: ClothingEyesGlassesSunglasses
- id: ClothingUniformJumpsuitCentcomOfficial - id: ClothingUniformJumpsuitCentcomOfficial
- id: ClothingShoesBootsJack - id: ClothingShoesBootsJack
- id: ClothingHandsGlovesColorBlack - id: ClothingHandsGlovesColorBlack
- id: ClothingHeadsetAltCentComFake - id: ClothingHeadsetAltCentComFake
- id: ClothingOuterArmorBasic - id: ClothingOuterArmorBasic
- id: Paper - id: Paper
- id: Pen - id: Pen
- id: CentcomPDAFake - id: CentcomPDAFake
- type: entity - type: entity
parent: ClothingBackpackDuffelClown parent: ClothingBackpackDuffelClown
id: ClothingBackpackDuffelSyndicateCostumeClown id: ClothingBackpackDuffelSyndicateCostumeClown
suffix: syndicate suffix: syndicate
components: components:
- type: Tag - type: Tag
tags: [] # ignore "WhitelistChameleon" tag tags: [] # ignore "WhitelistChameleon" tag
- type: StorageFill - type: StorageFill
contents: contents:
- id: ClothingUniformJumpsuitClown - id: ClothingUniformJumpsuitClown
- id: ClothingShoesClown - id: ClothingShoesClown
- id: ClothingMaskClown - id: ClothingMaskClown
- id: BikeHorn - id: BikeHorn
- id: ClownPDA - id: ClownPDA
- id: ClothingHeadsetService - id: ClothingHeadsetService
- type: entity - type: entity
parent: ClothingBackpackDuffelSyndicateBundle parent: ClothingBackpackDuffelSyndicateBundle
@@ -186,11 +186,11 @@
name: carp suit duffel bag name: carp suit duffel bag
description: Contains a carp suit and some friends to play with. description: Contains a carp suit and some friends to play with.
components: components:
- type: StorageFill - type: StorageFill
contents: contents:
- id: ClothingOuterSuitCarp - id: ClothingOuterSuitCarp
- id: PlushieCarp - id: PlushieCarp
amount: 6 amount: 6
- type: entity - type: entity
parent: ClothingBackpackDuffelSyndicateBundle parent: ClothingBackpackDuffelSyndicateBundle
@@ -198,22 +198,24 @@
name: syndicate pyjama duffel bag name: syndicate pyjama duffel bag
description: Contains 3 pairs of syndicate pyjamas and 3 plushies for the ultimate sleepover. description: Contains 3 pairs of syndicate pyjamas and 3 plushies for the ultimate sleepover.
components: components:
- type: StorageFill - type: Storage
contents: maxTotalWeight: 44
- id: ClothingUniformJumpsuitPyjamaSyndicateRed - type: StorageFill
- id: ClothingUniformJumpsuitPyjamaSyndicateBlack contents:
- id: ClothingUniformJumpsuitPyjamaSyndicatePink - id: ClothingUniformJumpsuitPyjamaSyndicateRed
- id: ClothingHeadPyjamaSyndicateRed - id: ClothingUniformJumpsuitPyjamaSyndicateBlack
- id: ClothingHeadPyjamaSyndicateBlack - id: ClothingUniformJumpsuitPyjamaSyndicatePink
- id: ClothingHeadPyjamaSyndicatePink - id: ClothingHeadPyjamaSyndicateRed
- id: ClothingShoesSlippers - id: ClothingHeadPyjamaSyndicateBlack
amount: 3 - id: ClothingHeadPyjamaSyndicatePink
- id: BedsheetSyndie - id: ClothingShoesSlippers
amount: 3 amount: 3
- id: PlushieCarp - id: BedsheetSyndie
- id: PlushieNuke amount: 3
- id: PlushieLizard - id: PlushieCarp
- id: PlushieSharkBlue - id: PlushieNuke
- id: PlushieLizard
- id: PlushieSharkBlue
- type: entity - type: entity
parent: ClothingBackpackDuffelSyndicateBundle parent: ClothingBackpackDuffelSyndicateBundle
@@ -249,12 +251,12 @@
name: syndicate EVA bundle name: syndicate EVA bundle
description: "Contains the Syndicate approved EVA suit." description: "Contains the Syndicate approved EVA suit."
components: components:
- type: StorageFill - type: StorageFill
contents: contents:
- id: ClothingHeadHelmetSyndicate - id: ClothingHeadHelmetSyndicate
- id: ClothingOuterHardsuitSyndicate - id: ClothingOuterHardsuitSyndicate
- id: ClothingMaskGasSyndicate - id: ClothingMaskGasSyndicate
- id: DoubleEmergencyOxygenTankFilled - id: DoubleEmergencyOxygenTankFilled
- type: entity - type: entity
parent: ClothingBackpackDuffelSyndicateBundle parent: ClothingBackpackDuffelSyndicateBundle
@@ -262,11 +264,16 @@
name: syndicate hardsuit bundle name: syndicate hardsuit bundle
description: "Contains the Syndicate's signature blood red hardsuit." description: "Contains the Syndicate's signature blood red hardsuit."
components: components:
- type: StorageFill - type: Storage
contents: maxItemSize: Huge
- id: ClothingOuterHardsuitSyndie whitelist: #to snub 'dem metagamers
- id: ClothingMaskGasSyndicate components:
- id: ClothingHandsGlovesCombat - Clothing
- type: StorageFill
contents:
- id: ClothingOuterHardsuitSyndie
- id: ClothingMaskGasSyndicate
- id: ClothingHandsGlovesCombat
- type: entity - type: entity
parent: ClothingBackpackDuffelSyndicateBundle parent: ClothingBackpackDuffelSyndicateBundle
@@ -274,26 +281,26 @@
name: syndicate zombie bundle name: syndicate zombie bundle
description: "An all-in-one kit for unleashing the undead upon a station." description: "An all-in-one kit for unleashing the undead upon a station."
components: components:
- type: StorageFill - type: StorageFill
contents: contents:
- id: SyringeRomerol - id: SyringeRomerol
- id: WeaponRevolverPython - id: WeaponRevolverPython
- id: MagazineBoxMagnumIncendiary - id: MagazineBoxMagnumIncendiary
- id: PillAmbuzolPlus - id: PillAmbuzolPlus
- id: PillAmbuzol - id: PillAmbuzol
amount: 3 amount: 3
- type: entity - type: entity
parent: ClothingBackpackDuffelSyndicateBundle parent: ClothingBackpackDuffelSyndicateBundle
id: ClothingBackpackDuffelSyndicateOperative id: ClothingBackpackDuffelSyndicateOperative
name: operative duffelbag name: operative duffelbag
components: components:
- type: StorageFill - type: StorageFill
contents: contents:
- id: BoxSurvivalSyndicate - id: BoxSurvivalSyndicate
- id: WeaponPistolViper - id: WeaponPistolViper
- id: PinpointerNuclear - id: PinpointerNuclear
- id: MicroBombImplanter - id: MicroBombImplanter
- type: entity - type: entity
@@ -302,18 +309,17 @@
name: operative medic duffelbag name: operative medic duffelbag
description: A large duffel bag for holding extra medical supplies. description: A large duffel bag for holding extra medical supplies.
components: components:
- type: StorageFill - type: StorageFill
contents: contents:
- id: BoxSurvivalSyndicate - id: BoxSurvivalSyndicate
- id: SawAdvanced - id: SawAdvanced
- id: Cautery - id: Cautery
- id: CombatKnife - id: CombatKnife
- id: WeaponPistolViper - id: WeaponPistolViper
- id: PinpointerNuclear - id: PinpointerNuclear
- id: HandheldHealthAnalyzer - id: HandheldHealthAnalyzer
- id: CombatMedipen - id: CombatMedipen
- id: MicroBombImplanter - id: MicroBombImplanter
- id: SyndiHypo
- type: entity - type: entity
parent: ClothingBackpackDuffelSyndicateMedicalBundle parent: ClothingBackpackDuffelSyndicateMedicalBundle
@@ -321,12 +327,12 @@
name: medical bundle name: medical bundle
description: "All you need to get your comrades back in the fight." description: "All you need to get your comrades back in the fight."
components: components:
- type: StorageFill - type: StorageFill
contents: contents:
- id: MedkitCombatFilled - id: MedkitCombatFilled
- id: Defibrillator - id: Defibrillator
- id: CombatMedipen - id: CombatMedipen
amount: 3 amount: 3
- id: ClothingHandsGlovesLatex - id: ClothingHandsGlovesLatex
- id: SyringeTranexamicAcid - id: SyringeTranexamicAcid
- id: SyringeHyronalin - id: SyringeHyronalin

View File

@@ -278,7 +278,7 @@
containers: containers:
ballistic-ammo: !type:Container ballistic-ammo: !type:Container
- type: Item - type: Item
size: 30 size: Normal
- type: Sprite - type: Sprite
sprite: Objects/Storage/boxes.rsi sprite: Objects/Storage/boxes.rsi

View File

@@ -37,7 +37,7 @@
- state: box - state: box
- state: light - state: light
- type: Storage - type: Storage
capacity: 60 maxTotalWeight: 24
whitelist: whitelist:
components: components:
- LightBulb - LightBulb
@@ -60,7 +60,7 @@
- state: box - state: box
- state: lighttube - state: lighttube
- type: Storage - type: Storage
capacity: 60 maxTotalWeight: 24
whitelist: whitelist:
components: components:
- LightBulb - LightBulb
@@ -85,7 +85,7 @@
- state: box - state: box
- state: lightmixed - state: lightmixed
- type: Storage - type: Storage
capacity: 60 maxTotalWeight: 24
whitelist: whitelist:
components: components:
- LightBulb - LightBulb
@@ -107,11 +107,6 @@
layers: layers:
- state: box - state: box
- state: pda - state: pda
- type: Storage
capacity: 60
whitelist:
components:
- Pda
- type: entity - type: entity
name: ID card box name: ID card box
@@ -127,11 +122,6 @@
layers: layers:
- state: box - state: box
- state: pda - state: pda
- type: Storage
capacity: 60
whitelist:
components:
- IdCard
- type: entity - type: entity
name: headset box name: headset box
@@ -147,11 +137,6 @@
layers: layers:
- state: box - state: box
- state: headset - state: headset
- type: Storage
capacity: 60
whitelist:
components:
- Headset
- type: entity - type: entity
name: meson box name: meson box
@@ -191,8 +176,6 @@
id: BoxHugHealing id: BoxHugHealing
description: A special box for sensitive people. description: A special box for sensitive people.
components: components:
- type: Storage
capacity: 30
- type: Sprite - type: Sprite
layers: layers:
- state: box_hug - state: box_hug
@@ -234,6 +217,12 @@
id: BoxPerformer id: BoxPerformer
description: Happy Hatsune Miku Day! description: Happy Hatsune Miku Day!
components: components:
- type: Storage
maxItemSize: Normal
whitelist:
components:
- Clothing
- Food
- type: StorageFill - type: StorageFill
contents: contents:
- id: ClothingShoesBootsPerformer - id: ClothingShoesBootsPerformer
@@ -267,7 +256,8 @@
- id: TrashBag - id: TrashBag
amount: 6 amount: 6
- type: Storage - type: Storage
capacity: 800 maxTotalWeight: 24
maxItemSize: Normal
whitelist: whitelist:
tags: tags:
- TrashBag - TrashBag
@@ -294,7 +284,6 @@
- state: box - state: box
- state: encryptokey - state: encryptokey
- type: Storage - type: Storage
capacity: 30
whitelist: whitelist:
components: components:
- EncryptionKey - EncryptionKey
@@ -386,13 +375,12 @@
description: Two syndicate encryption keys for the price of one. Miniaturized for ease of use. description: Two syndicate encryption keys for the price of one. Miniaturized for ease of use.
components: components:
- type: Item - type: Item
size: 15 size: Normal
- type: StorageFill - type: StorageFill
contents: contents:
- id: EncryptionKeySyndie - id: EncryptionKeySyndie
amount: 2 amount: 2
- type: Storage - type: Storage
capacity: 15
- type: entity - type: entity
name: deathrattle implant box name: deathrattle implant box
@@ -401,7 +389,7 @@
description: Six deathrattle implants and handheld GPS devices for the whole squad. description: Six deathrattle implants and handheld GPS devices for the whole squad.
components: components:
- type: Item - type: Item
size: 60 size: Normal
- type: StorageFill - type: StorageFill
contents: contents:
- id: DeathRattleImplanter - id: DeathRattleImplanter
@@ -409,7 +397,7 @@
- id: HandheldGPSBasic - id: HandheldGPSBasic
amount: 6 amount: 6
- type: Storage - type: Storage
capacity: 60 maxTotalWeight: 24
- type: Sprite - type: Sprite
layers: layers:
- state: box - state: box
@@ -434,19 +422,19 @@
description: This box filled with colorful darts. description: This box filled with colorful darts.
components: components:
- type: Item - type: Item
size: 40 size: Normal
- type: StorageFill - type: StorageFill
contents: contents:
- id: Dart - id: Dart
amount: 5 amount: 3
- id: DartBlue - id: DartBlue
amount: 5 amount: 3
- id: DartPurple - id: DartPurple
amount: 5 amount: 3
- id: DartYellow - id: DartYellow
amount: 5 amount: 3
- type: Storage - type: Storage
capacity: 40 maxTotalWeight: 24
- type: Sprite - type: Sprite
layers: layers:
- state: box - state: box

View File

@@ -93,10 +93,12 @@
parent: BoxCardboard parent: BoxCardboard
id: BoxMouthSwab id: BoxMouthSwab
components: components:
- type: Storage
maxTotalWeight: 20
- type: StorageFill - type: StorageFill
contents: contents:
- id: DiseaseSwab - id: DiseaseSwab
amount: 30 amount: 10
- type: Sprite - type: Sprite
layers: layers:
- state: box - state: box

View File

@@ -49,6 +49,11 @@
id: BoxZiptie id: BoxZiptie
description: A box full of zipties. description: A box full of zipties.
components: components:
- type: Storage
maxTotalWeight: 20
whitelist:
components:
- Handcuff
- type: StorageFill - type: StorageFill
contents: contents:
- id: Zipties - id: Zipties
@@ -64,6 +69,8 @@
id: BoxForensicPad id: BoxForensicPad
description: A box of forensic pads. description: A box of forensic pads.
components: components:
- type: Storage
maxTotalWeight: 20
- type: StorageFill - type: StorageFill
contents: contents:
- id: ForensicPad - id: ForensicPad

View File

@@ -302,7 +302,7 @@
- id: TargetDarts - id: TargetDarts
amount: 1 amount: 1
- id: BoxDarts - id: BoxDarts
amount: 1 amount: 2
- id: BoxDarts - id: BoxDarts
amount: 1 amount: 1
prob: 0.05 prob: 0.05

View File

@@ -91,14 +91,11 @@
- type: StorageFill - type: StorageFill
contents: contents:
- id: Brutepack - id: Brutepack
amount: 1
- id: Ointment - id: Ointment
amount: 1
- id: Bloodpack - id: Bloodpack
amount: 1
- id: Gauze - id: Gauze
- id: EmergencyMedipen #You never know what people are going to latejoin into - id: EmergencyMedipen #You never know what people are going to latejoin into
amount: 6 amount: 3
- type: entity - type: entity
id: ClothingBeltPlantFilled id: ClothingBeltPlantFilled
@@ -126,6 +123,10 @@
name: grenadier chest rig name: grenadier chest rig
suffix: Filled suffix: Filled
components: components:
- type: Item
size: Large
- type: Storage
maxSlots: 8
- type: StorageFill - type: StorageFill
contents: contents:
- id: ExGrenade - id: ExGrenade

View File

@@ -15,6 +15,10 @@
parent: BriefcaseSyndie parent: BriefcaseSyndie
suffix: SniperBundle suffix: SniperBundle
components: components:
- type: Item
size: Huge
- type: Storage
maxItemSize: Large
- type: StorageFill - type: StorageFill
contents: contents:
- id: WeaponSniperHristov - id: WeaponSniperHristov

View File

@@ -12,8 +12,7 @@
- id: Ointment - id: Ointment
amount: 2 amount: 2
- id: Gauze - id: Gauze
- id: PillTricordrazine - id: PillCanisterTricordrazine
amount: 5
# see https://github.com/tgstation/blob/master/code/game/objects/items/storage/firstaid.dm for example contents # see https://github.com/tgstation/blob/master/code/game/objects/items/storage/firstaid.dm for example contents
- type: entity - type: entity
@@ -28,10 +27,8 @@
- id: Ointment - id: Ointment
amount: 2 amount: 2
- id: SyringeSigynate - id: SyringeSigynate
- id: PillKelotane - id: PillCanisterKelotane
amount: 5 - id: PillCanisterDermaline
- id: PillDermaline
amount: 5
- type: entity - type: entity
id: MedkitBruteFilled id: MedkitBruteFilled
@@ -45,10 +42,8 @@
- id: Gauze - id: Gauze
- id: Bloodpack - id: Bloodpack
- id: SyringeTranexamicAcid - id: SyringeTranexamicAcid
- id: PillIron - id: PillCanisterIron
amount: 5 - id: PillCanisterBicaridine
- id: PillBicaridine
amount: 5
- type: entity - type: entity
id: MedkitToxinFilled id: MedkitToxinFilled
@@ -60,10 +55,8 @@
- id: SyringeIpecac - id: SyringeIpecac
- id: SyringeEthylredoxrazine - id: SyringeEthylredoxrazine
- id: AntiPoisonMedipen - id: AntiPoisonMedipen
- id: PillDylovene - id: PillCanisterDylovene
amount: 5 - id: PillCanisterCharcoal
- id: PillCharcoal
amount: 3
- type: entity - type: entity
id: MedkitOxygenFilled id: MedkitOxygenFilled
@@ -76,8 +69,7 @@
- id: EmergencyOxygenTankFilled - id: EmergencyOxygenTankFilled
- id: EmergencyMedipen - id: EmergencyMedipen
- id: SyringeInaprovaline - id: SyringeInaprovaline
- id: PillDexalin - id: PillCanisterDexalin
amount: 7
- type: entity - type: entity
id: MedkitRadiationFilled id: MedkitRadiationFilled
@@ -92,8 +84,7 @@
amount: 1 amount: 1
- id: EmergencyMedipen - id: EmergencyMedipen
amount: 1 amount: 1
- id: PillHyronalin - id: PillCanisterHyronalin
amount: 5
- type: entity - type: entity
id: MedkitAdvancedFilled id: MedkitAdvancedFilled
@@ -120,11 +111,9 @@
- id: MedicatedSuture - id: MedicatedSuture
- id: RegenerativeMesh - id: RegenerativeMesh
- id: SyringeEphedrine - id: SyringeEphedrine
- id: SyringeSaline
- id: BruteAutoInjector - id: BruteAutoInjector
- id: BurnAutoInjector - id: BurnAutoInjector
- id: EmergencyMedipen - id: EmergencyMedipen
- id: Bloodpack
- type: entity - type: entity
id: StimkitFilled id: StimkitFilled

View File

@@ -86,9 +86,16 @@
suffix: Filled suffix: Filled
parent: ToolboxSyndicate parent: ToolboxSyndicate
components: components:
- type: Storage
maxSlots: 8
- type: StorageFill - type: StorageFill
contents: contents:
- id: ClothingBeltUtilityEngineering - id: Crowbar
- id: Wrench
- id: Screwdriver
- id: Wirecutter
- id: Welder
- id: Multitool
- id: ClothingHandsGlovesCombat - id: ClothingHandsGlovesCombat
- id: ClothingMaskGasSyndicate - id: ClothingMaskGasSyndicate

View File

@@ -8,13 +8,14 @@
sprite: Clothing/Back/Backpacks/backpack.rsi sprite: Clothing/Back/Backpacks/backpack.rsi
state: icon state: icon
- type: Item - type: Item
size: 9999 size: Large
- type: Clothing - type: Clothing
quickEquip: false quickEquip: false
slots: slots:
- back - back
- type: Storage - type: Storage
capacity: 100 maxItemSize: Large
maxTotalWeight: 28
- type: ContainerContainer - type: ContainerContainer
containers: containers:
storagebase: !type:Container storagebase: !type:Container
@@ -196,7 +197,7 @@
- type: Sprite - type: Sprite
sprite: Clothing/Back/Backpacks/ertleader.rsi sprite: Clothing/Back/Backpacks/ertleader.rsi
- type: Storage - type: Storage
capacity: 250 maxTotalWeight: 44
- type: entity - type: entity
parent: ClothingBackpackERTLeader parent: ClothingBackpackERTLeader
@@ -259,8 +260,11 @@
shader: unshaded shader: unshaded
- type: Clothing - type: Clothing
equippedPrefix: holding equippedPrefix: holding
- type: Item
size: Ginormous
- type: Storage - type: Storage
capacity: 9999 maxItemSize: Large
maxTotalWeight: 56 #14 normal-sized items.
- type: entity - type: entity
parent: ClothingBackpackClown parent: ClothingBackpackClown

View File

@@ -4,13 +4,14 @@
name: duffel bag name: duffel bag
description: A large duffel bag for holding extra things. description: A large duffel bag for holding extra things.
components: components:
- type: Sprite - type: Sprite
sprite: Clothing/Back/Duffels/duffel.rsi sprite: Clothing/Back/Duffels/duffel.rsi
- type: Storage - type: Storage
capacity: 120 maxItemSize: Large
- type: ClothingSpeedModifier maxTotalWeight: 40
walkModifier: 1 - type: ClothingSpeedModifier
sprintModifier: 0.9 walkModifier: 1
sprintModifier: 0.9
- type: entity - type: entity
parent: ClothingBackpackDuffel parent: ClothingBackpackDuffel
@@ -18,8 +19,8 @@
name: engineering duffel bag name: engineering duffel bag
description: A large duffel bag for holding extra tools and supplies. description: A large duffel bag for holding extra tools and supplies.
components: components:
- type: Sprite - type: Sprite
sprite: Clothing/Back/Duffels/engineering.rsi sprite: Clothing/Back/Duffels/engineering.rsi
- type: entity - type: entity
parent: ClothingBackpackDuffel parent: ClothingBackpackDuffel
@@ -27,8 +28,8 @@
name: atmospherics duffel bag name: atmospherics duffel bag
description: A large duffel bag made of fire resistant fibers. Smells like plasma. description: A large duffel bag made of fire resistant fibers. Smells like plasma.
components: components:
- type: Sprite - type: Sprite
sprite: Clothing/Back/Duffels/atmospherics.rsi sprite: Clothing/Back/Duffels/atmospherics.rsi
- type: entity - type: entity
parent: ClothingBackpackDuffel parent: ClothingBackpackDuffel
@@ -36,8 +37,8 @@
name: medical duffel bag name: medical duffel bag
description: A large duffel bag for holding extra medical supplies. description: A large duffel bag for holding extra medical supplies.
components: components:
- type: Sprite - type: Sprite
sprite: Clothing/Back/Duffels/medical.rsi sprite: Clothing/Back/Duffels/medical.rsi
- type: entity - type: entity
parent: ClothingBackpackDuffel parent: ClothingBackpackDuffel
@@ -45,8 +46,8 @@
name: captain's duffel bag name: captain's duffel bag
description: A large duffel bag for holding extra captainly goods. description: A large duffel bag for holding extra captainly goods.
components: components:
- type: Sprite - type: Sprite
sprite: Clothing/Back/Duffels/captain.rsi sprite: Clothing/Back/Duffels/captain.rsi
- type: entity - type: entity
parent: ClothingBackpackDuffel parent: ClothingBackpackDuffel
@@ -54,11 +55,11 @@
name: clown duffel bag name: clown duffel bag
description: A large duffel bag for holding extra honk goods. description: A large duffel bag for holding extra honk goods.
components: components:
- type: Sprite - type: Sprite
sprite: Clothing/Back/Duffels/clown.rsi sprite: Clothing/Back/Duffels/clown.rsi
- type: Storage - type: Storage
storageOpenSound: storageOpenSound:
collection: BikeHorn collection: BikeHorn
- type: entity - type: entity
parent: ClothingBackpackDuffel parent: ClothingBackpackDuffel
@@ -66,8 +67,8 @@
name: security duffel bag name: security duffel bag
description: A large duffel bag for holding extra security related goods. description: A large duffel bag for holding extra security related goods.
components: components:
- type: Sprite - type: Sprite
sprite: Clothing/Back/Duffels/security.rsi sprite: Clothing/Back/Duffels/security.rsi
- type: entity - type: entity
parent: ClothingBackpackDuffel parent: ClothingBackpackDuffel
@@ -75,8 +76,8 @@
name: brigmedic duffel bag name: brigmedic duffel bag
description: A large duffel bag for holding extra medical related goods. description: A large duffel bag for holding extra medical related goods.
components: components:
- type: Sprite - type: Sprite
sprite: Clothing/Back/Duffels/brigmedic.rsi sprite: Clothing/Back/Duffels/brigmedic.rsi
- type: entity - type: entity
parent: ClothingBackpackDuffel parent: ClothingBackpackDuffel
@@ -84,8 +85,8 @@
name: chemistry duffel bag name: chemistry duffel bag
description: A large duffel bag for holding extra beakers and test tubes. description: A large duffel bag for holding extra beakers and test tubes.
components: components:
- type: Sprite - type: Sprite
sprite: Clothing/Back/Duffels/chemistry.rsi sprite: Clothing/Back/Duffels/chemistry.rsi
- type: entity - type: entity
parent: ClothingBackpackDuffel parent: ClothingBackpackDuffel
@@ -93,8 +94,8 @@
name: virology duffel bag name: virology duffel bag
description: A large duffel bag made of hypo-allergenic fibers. It's designed to help prevent the spread of disease. Smells like monkey. description: A large duffel bag made of hypo-allergenic fibers. It's designed to help prevent the spread of disease. Smells like monkey.
components: components:
- type: Sprite - type: Sprite
sprite: Clothing/Back/Duffels/virology.rsi sprite: Clothing/Back/Duffels/virology.rsi
- type: entity - type: entity
parent: ClothingBackpackDuffel parent: ClothingBackpackDuffel
@@ -102,8 +103,8 @@
name: genetics duffel bag name: genetics duffel bag
description: A large duffel bag for holding extra genetic mutations. description: A large duffel bag for holding extra genetic mutations.
components: components:
- type: Sprite - type: Sprite
sprite: Clothing/Back/Duffels/genetics.rsi sprite: Clothing/Back/Duffels/genetics.rsi
- type: entity - type: entity
parent: ClothingBackpackDuffel parent: ClothingBackpackDuffel
@@ -111,12 +112,12 @@
name: mime duffel bag name: mime duffel bag
description: A large duffel bag for holding... mime... stuff. description: A large duffel bag for holding... mime... stuff.
components: components:
- type: Sprite - type: Sprite
sprite: Clothing/Back/Duffels/mime.rsi sprite: Clothing/Back/Duffels/mime.rsi
storageOpenSound: storageOpenSound:
collection: null collection: null
storageInsertSound: storageInsertSound:
collection: null collection: null
- type: entity - type: entity
parent: ClothingBackpackDuffel parent: ClothingBackpackDuffel
@@ -124,8 +125,8 @@
name: science duffel bag name: science duffel bag
description: A large duffel bag for holding extra science related goods. description: A large duffel bag for holding extra science related goods.
components: components:
- type: Sprite - type: Sprite
sprite: Clothing/Back/Duffels/science.rsi sprite: Clothing/Back/Duffels/science.rsi
- type: entity - type: entity
parent: ClothingBackpackDuffel parent: ClothingBackpackDuffel
@@ -160,31 +161,29 @@
name: syndicate duffel bag name: syndicate duffel bag
description: A large duffel bag for holding various traitor goods. description: A large duffel bag for holding various traitor goods.
components: components:
- type: Sprite - type: Sprite
sprite: Clothing/Back/Duffels/syndicate.rsi sprite: Clothing/Back/Duffels/syndicate.rsi
- type: Storage
capacity: 131
- type: entity - type: entity
parent: ClothingBackpackDuffelSyndicate parent: ClothingBackpackDuffelSyndicate
id: ClothingBackpackDuffelSyndicateBundle id: ClothingBackpackDuffelSyndicateBundle
abstract: true abstract: true
components: components:
- type: Tag - type: Tag
tags: [] # ignore "WhitelistChameleon" tag tags: [] # ignore "WhitelistChameleon" tag
- type: entity - type: entity
parent: ClothingBackpackDuffelSyndicate parent: ClothingBackpackDuffelSyndicate
id: ClothingBackpackDuffelSyndicateAmmo id: ClothingBackpackDuffelSyndicateAmmo
name: syndicate duffel bag name: syndicate duffel bag
components: components:
- type: Sprite - type: Sprite
sprite: Clothing/Back/Duffels/syndicate.rsi sprite: Clothing/Back/Duffels/syndicate.rsi
state: icon-ammo state: icon-ammo
- type: Item - type: Item
heldPrefix: ammo heldPrefix: ammo
- type: Clothing - type: Clothing
equippedPrefix: ammo equippedPrefix: ammo
- type: entity - type: entity
parent: ClothingBackpackDuffelSyndicateAmmo parent: ClothingBackpackDuffelSyndicateAmmo
@@ -199,13 +198,13 @@
id: ClothingBackpackDuffelSyndicateMedical id: ClothingBackpackDuffelSyndicateMedical
name: syndicate duffel bag name: syndicate duffel bag
components: components:
- type: Sprite - type: Sprite
sprite: Clothing/Back/Duffels/syndicate.rsi sprite: Clothing/Back/Duffels/syndicate.rsi
state: icon-med state: icon-med
- type: Item - type: Item
heldPrefix: med heldPrefix: med
- type: Clothing - type: Clothing
equippedPrefix: med equippedPrefix: med
- type: entity - type: entity
parent: ClothingBackpackDuffelSyndicateMedical parent: ClothingBackpackDuffelSyndicateMedical
@@ -221,17 +220,20 @@
name: duffelbag of holding name: duffelbag of holding
description: A duffelbag that opens into a localized pocket of bluespace. description: A duffelbag that opens into a localized pocket of bluespace.
components: components:
- type: Sprite - type: Sprite
sprite: Clothing/Back/Duffels/holding.rsi sprite: Clothing/Back/Duffels/holding.rsi
state: icon state: icon
layers: layers:
- state: icon - state: icon
- state: icon-unlit - state: icon-unlit
shader: unshaded shader: unshaded
- type: Storage - type: Item
capacity: 9999 size: Ginormous
- type: ClothingSpeedModifier - type: Storage
sprintModifier: 1 # makes its stats identical to other variants of bag of holding maxItemSize: Large
maxTotalWeight: 56 #14 normal-sized items.
- type: ClothingSpeedModifier
sprintModifier: 1 # makes its stats identical to other variants of bag of holding
- type: entity - type: entity
parent: ClothingBackpackDuffel parent: ClothingBackpackDuffel
@@ -239,8 +241,9 @@
name: CBURN duffel bag name: CBURN duffel bag
description: A duffel bag containing a variety of biological containment equipment. description: A duffel bag containing a variety of biological containment equipment.
components: components:
- type: Storage - type: Storage
capacity: 150 maxItemSize: Large
- type: ClothingSpeedModifier maxTotalWeight: 40
walkModifier: 1 - type: ClothingSpeedModifier
sprintModifier: 1 walkModifier: 1
sprintModifier: 1

View File

@@ -167,5 +167,8 @@
- state: icon - state: icon
- state: icon-unlit - state: icon-unlit
shader: unshaded shader: unshaded
- type: Item
size: Ginormous
- type: Storage - type: Storage
capacity: 9999 maxItemSize: Large
maxTotalWeight: 56 #14 normal-sized items.

View File

@@ -33,7 +33,7 @@
sprite: Clothing/Back/Backpacks/waterbackpack.rsi sprite: Clothing/Back/Backpacks/waterbackpack.rsi
state: icon state: icon
- type: Item - type: Item
size: 200 size: Huge
- type: Clothing - type: Clothing
slots: BACK slots: BACK
sprite: Clothing/Back/Backpacks/waterbackpack.rsi sprite: Clothing/Back/Backpacks/waterbackpack.rsi

View File

@@ -6,7 +6,7 @@
- type: Sprite - type: Sprite
state: icon state: icon
- type: Item - type: Item
size: 50 size: Normal
- type: Clothing - type: Clothing
slots: [belt] slots: [belt]
quickEquip: false quickEquip: false
@@ -22,7 +22,10 @@
id: ClothingBeltStorageBase id: ClothingBeltStorageBase
components: components:
- type: Storage - type: Storage
capacity: 40 maxSlots: 7
maxItemSize: Normal
- type: Item
size: Huge
- type: ContainerContainer - type: ContainerContainer
containers: containers:
storagebase: !type:Container storagebase: !type:Container

View File

@@ -11,7 +11,7 @@
- type: Clothing - type: Clothing
sprite: Clothing/Belt/utility.rsi sprite: Clothing/Belt/utility.rsi
- type: Storage - type: Storage
capacity: 45 maxItemSize: Normal
# TODO: Fill this out more. # TODO: Fill this out more.
whitelist: whitelist:
tags: tags:
@@ -83,7 +83,6 @@
- type: Clothing - type: Clothing
sprite: Clothing/Belt/ce.rsi sprite: Clothing/Belt/ce.rsi
- type: Storage - type: Storage
capacity: 105
# TODO: Fill this out more. # TODO: Fill this out more.
whitelist: whitelist:
tags: tags:
@@ -238,7 +237,6 @@
- type: Clothing - type: Clothing
sprite: Clothing/Belt/medical.rsi sprite: Clothing/Belt/medical.rsi
- type: Storage - type: Storage
capacity: 60
whitelist: whitelist:
tags: tags:
- Wrench - Wrench
@@ -393,7 +391,7 @@
- type: Clothing - type: Clothing
sprite: Clothing/Belt/sheath.rsi sprite: Clothing/Belt/sheath.rsi
- type: Storage - type: Storage
capacity: 15 maxSlots: 1
whitelist: whitelist:
tags: tags:
- CaptainSabre - CaptainSabre
@@ -418,9 +416,8 @@
- type: Clothing - type: Clothing
sprite: Clothing/Belt/bandolier.rsi sprite: Clothing/Belt/bandolier.rsi
- type: Item - type: Item
size: 60 size: Large
- type: Storage - type: Storage
capacity: 60
whitelist: whitelist:
tags: tags:
- ShellShotgun - ShellShotgun
@@ -451,7 +448,7 @@
- type: Clothing - type: Clothing
sprite: Clothing/Belt/holster.rsi sprite: Clothing/Belt/holster.rsi
- type: Storage - type: Storage
capacity: 20 maxSlots: 3
- type: entity - type: entity
parent: ClothingBeltStorageBase parent: ClothingBeltStorageBase
@@ -464,9 +461,8 @@
- type: Clothing - type: Clothing
sprite: Clothing/Belt/syndieholster.rsi sprite: Clothing/Belt/syndieholster.rsi
- type: Item - type: Item
size: 60 size: Large
- type: Storage - type: Storage
capacity: 60
whitelist: whitelist:
components: components:
- Gun - Gun
@@ -528,9 +524,7 @@
- type: Clothing - type: Clothing
sprite: Clothing/Belt/militarywebbingmed.rsi sprite: Clothing/Belt/militarywebbingmed.rsi
- type: Item - type: Item
size: 70 size: Large
- type: Storage
capacity: 70
- type: entity - type: entity
parent: ClothingBeltBase parent: ClothingBeltBase
@@ -559,7 +553,7 @@
- type: Clothing - type: Clothing
sprite: Clothing/Belt/wand.rsi sprite: Clothing/Belt/wand.rsi
- type: Storage - type: Storage
capacity: 120 maxSlots: 8
whitelist: whitelist:
tags: tags:
- WizardWand - WizardWand

View File

@@ -12,7 +12,8 @@
visible: false visible: false
- type: Clothing - type: Clothing
- type: Storage - type: Storage
capacity: 150 maxSlots: 15
maxItemSize: Small
whitelist: whitelist:
tags: tags:
- Arrow - Arrow

View File

@@ -9,7 +9,7 @@
- type: Clothing - type: Clothing
sprite: Clothing/Belt/waistbag_leather.rsi sprite: Clothing/Belt/waistbag_leather.rsi
- type: Storage - type: Storage
capacity: 20 maxItemSize: Small
#Colorization on worn items doesn't work. If this ever gets fixed, you can duplicate this entry and change the color on the sprite to add color variants. #Colorization on worn items doesn't work. If this ever gets fixed, you can duplicate this entry and change the color on the sprite to add color variants.
#- type: entity #- type: entity

View File

@@ -17,6 +17,8 @@
keySlots: 4 keySlots: 4
- type: Sprite - type: Sprite
state: icon state: icon
- type: Item
size: Small
- type: Clothing - type: Clothing
slots: slots:
- ears - ears

View File

@@ -7,3 +7,5 @@
state: icon state: icon
- type: Clothing - type: Clothing
slots: [eyes] slots: [eyes]
- type: Item
size: Small

View File

@@ -9,6 +9,8 @@
slots: [gloves] slots: [gloves]
- type: Food - type: Food
requiresSpecialDigestion: true requiresSpecialDigestion: true
- type: Item
size: Small
- type: SolutionContainerManager - type: SolutionContainerManager
solutions: solutions:
food: food:

View File

@@ -8,6 +8,8 @@
- HEAD - HEAD
- type: Sprite - type: Sprite
state: icon state: icon
- type: Item
size: Small
- type: Food - type: Food
requiresSpecialDigestion: true requiresSpecialDigestion: true
- type: SolutionContainerManager - type: SolutionContainerManager
@@ -69,6 +71,7 @@
equippedPrefix: off equippedPrefix: off
- type: Item - type: Item
heldPrefix: off heldPrefix: off
size: Normal
- type: ToggleableLightVisuals - type: ToggleableLightVisuals
- type: PointLight - type: PointLight
enabled: false enabled: false
@@ -117,7 +120,7 @@
name: base space helmet name: base space helmet
components: components:
- type: Item - type: Item
size: 10 size: Normal
- type: PressureProtection - type: PressureProtection
highPressureMultiplier: 0.6 highPressureMultiplier: 0.6
lowPressureMultiplier: 1000 lowPressureMultiplier: 1000

View File

@@ -197,7 +197,7 @@
- type: Clothing - type: Clothing
sprite: Clothing/Head/Hats/chefhat.rsi sprite: Clothing/Head/Hats/chefhat.rsi
- type: Storage - type: Storage
capacity: 5 maxSlots: 1
- type: UserInterface - type: UserInterface
interfaces: interfaces:
- key: enum.StorageUiKey.Key - key: enum.StorageUiKey.Key
@@ -751,10 +751,10 @@
offset: "0, 0.12" offset: "0, 0.12"
sprite: Clothing/Head/Hats/magician.rsi sprite: Clothing/Head/Hats/magician.rsi
- type: Item - type: Item
size: 10 size: Small
sprite: Clothing/Head/Hats/magician.rsi sprite: Clothing/Head/Hats/magician.rsi
- type: Storage - type: Storage
capacity: 10 maxSlots: 1
- type: UserInterface - type: UserInterface
interfaces: interfaces:
- key: enum.StorageUiKey.Key - key: enum.StorageUiKey.Key

View File

@@ -5,6 +5,8 @@
components: components:
- type: Sprite - type: Sprite
state: icon state: icon
- type: Item
size: Small
- type: Clothing - type: Clothing
slots: [mask] slots: [mask]

View File

@@ -4,7 +4,7 @@
id: ClothingNeckBase id: ClothingNeckBase
components: components:
- type: Item - type: Item
size: 10 size: Small
- type: Clothing - type: Clothing
quickEquip: true quickEquip: true
slots: slots:

View File

@@ -6,7 +6,7 @@
description: be nothing do crime description: be nothing do crime
components: components:
- type: Item - type: Item
size: 1 size: Tiny
- type: entity - type: entity
parent: ClothingNeckPinBase parent: ClothingNeckPinBase

View File

@@ -15,7 +15,7 @@
id: ClothingOuterBaseLarge id: ClothingOuterBaseLarge
components: components:
- type: Item - type: Item
size: 80 size: Large
- type: Clothing - type: Clothing
slots: slots:
- outerClothing - outerClothing
@@ -28,10 +28,8 @@
parent: ClothingOuterBase parent: ClothingOuterBase
id: ClothingOuterStorageBase id: ClothingOuterStorageBase
components: components:
- type: Item
size: 10
- type: Storage - type: Storage
capacity: 10 maxTotalWeight: 6
- type: ContainerContainer - type: ContainerContainer
containers: containers:
storagebase: !type:Container storagebase: !type:Container
@@ -72,7 +70,7 @@
walkModifier: 0.4 walkModifier: 0.4
sprintModifier: 0.6 sprintModifier: 0.6
- type: Item - type: Item
size: 121 size: Huge
- type: Armor - type: Armor
modifiers: modifiers:
coefficients: coefficients:
@@ -107,7 +105,7 @@
walkModifier: 0.8 walkModifier: 0.8
sprintModifier: 0.8 sprintModifier: 0.8
- type: Item - type: Item
size: 80 size: Large
- type: entity - type: entity
parent: ClothingOuterBase parent: ClothingOuterBase
@@ -130,7 +128,7 @@
id: ClothingOuterBaseMedium id: ClothingOuterBaseMedium
components: components:
- type: Item - type: Item
size: 30 size: Large
- type: Clothing - type: Clothing
slots: slots:
- outerClothing - outerClothing

View File

@@ -350,7 +350,7 @@
walkModifier: 0.75 walkModifier: 0.75
sprintModifier: 0.75 sprintModifier: 0.75
- type: Item - type: Item
size: 50 size: Normal
- type: Tag - type: Tag
tags: tags:
- WhitelistChameleon - WhitelistChameleon

View File

@@ -176,7 +176,7 @@
- type: Sprite - type: Sprite
sprite: Clothing/OuterClothing/Suits/iansuit.rsi sprite: Clothing/OuterClothing/Suits/iansuit.rsi
- type: Item - type: Item
size: 30 size: Normal
- type: Clothing - type: Clothing
sprite: Clothing/OuterClothing/Suits/iansuit.rsi sprite: Clothing/OuterClothing/Suits/iansuit.rsi
- type: ToggleableClothing - type: ToggleableClothing
@@ -197,7 +197,7 @@
- type: Sprite - type: Sprite
sprite: Clothing/OuterClothing/Suits/carpsuit.rsi sprite: Clothing/OuterClothing/Suits/carpsuit.rsi
- type: Item - type: Item
size: 30 size: Normal
- type: Clothing - type: Clothing
sprite: Clothing/OuterClothing/Suits/carpsuit.rsi sprite: Clothing/OuterClothing/Suits/carpsuit.rsi
- type: ToggleableClothing - type: ToggleableClothing

View File

@@ -11,7 +11,7 @@
- type: TemperatureProtection - type: TemperatureProtection
coefficient: 0.1 coefficient: 0.1
- type: Item - type: Item
size: 10 size: Small
- type: Armor - type: Armor
modifiers: modifiers:
coefficients: coefficients:

View File

@@ -8,6 +8,8 @@
- FEET - FEET
- type: Sprite - type: Sprite
state: icon state: icon
- type: Item
size: Normal
- type: Food - type: Food
requiresSpecialDigestion: true requiresSpecialDigestion: true
- type: SolutionContainerManager - type: SolutionContainerManager
@@ -39,7 +41,8 @@
id: ClothingShoesStorageBase id: ClothingShoesStorageBase
components: components:
- type: Storage - type: Storage
capacity: 10 maxSlots: 1
maxItemSize: Normal
- type: ContainerContainer - type: ContainerContainer
containers: containers:
storagebase: !type:Container storagebase: !type:Container

View File

@@ -181,7 +181,7 @@
- state: equipped-FEET - state: equipped-FEET
offset: "0, -0.02" offset: "0, -0.02"
- type: Item - type: Item
size: 10 size: Small
sprite: Clothing/Shoes/Specific/large_clown.rsi sprite: Clothing/Shoes/Specific/large_clown.rsi
- type: ClothingSpeedModifier - type: ClothingSpeedModifier
walkModifier: 0.85 walkModifier: 0.85

View File

@@ -3,6 +3,8 @@
parent: BaseItem parent: BaseItem
id: Clothing id: Clothing
components: components:
- type: Item
size: Normal
- type: Sprite - type: Sprite
- type: Tag - type: Tag
tags: tags:

View File

@@ -101,7 +101,7 @@
types: types:
Blunt: 20000 Blunt: 20000
- type: Item - type: Item
size: 1 size: Tiny
sprite: Objects/Weapons/Melee/debug.rsi sprite: Objects/Weapons/Melee/debug.rsi
- type: entity - type: entity

View File

@@ -959,7 +959,7 @@
- map: ["enum.DamageStateVisualLayers.Base"] - map: ["enum.DamageStateVisualLayers.Base"]
state: mouse-0 state: mouse-0
- type: Item - type: Item
size: 5 size: Tiny
- type: Clothing - type: Clothing
quickEquip: false quickEquip: false
sprite: Mobs/Animals/mouse.rsi sprite: Mobs/Animals/mouse.rsi
@@ -1425,7 +1425,7 @@
groups: groups:
Brute: 5 Brute: 5
- type: Item - type: Item
size: 80 size: Normal
- type: OnUseTimerTrigger - type: OnUseTimerTrigger
delay: 10 delay: 10
beepSound: beepSound:
@@ -2330,7 +2330,7 @@
- map: ["enum.DamageStateVisualLayers.Base"] - map: ["enum.DamageStateVisualLayers.Base"]
state: hamster-0 state: hamster-0
- type: Item - type: Item
size: 5 size: Tiny
- type: Physics - type: Physics
- type: Fixtures - type: Fixtures
fixtures: fixtures:

View File

@@ -172,7 +172,8 @@
graph: SupplyBot graph: SupplyBot
node: bot node: bot
- type: Storage - type: Storage
capacity: 250 maxItemSize: Large
maxTotalWeight: 40
- type: UserInterface - type: UserInterface
interfaces: interfaces:
- key: enum.StorageUiKey.Key - key: enum.StorageUiKey.Key

View File

@@ -370,9 +370,9 @@
map: ["6pack6"] map: ["6pack6"]
visible: false visible: false
- type: Item - type: Item
size: 6 size: Normal
- type: Storage - type: Storage
capacity: 30 maxSlots: 6
whitelist: whitelist:
tags: tags:
- Cola - Cola

View File

@@ -28,7 +28,7 @@
abstract: true abstract: true
components: components:
- type: Item - type: Item
size: 1 size: Tiny
- type: FlavorProfile - type: FlavorProfile
flavors: flavors:
- bread - bread

View File

@@ -21,7 +21,7 @@
- ReagentId: Vitamin - ReagentId: Vitamin
Quantity: 5 Quantity: 5
- type: Item - type: Item
size: 25 size: Normal
- type: entity - type: entity
parent: FoodCakeBase parent: FoodCakeBase
@@ -43,7 +43,7 @@
- ReagentId: Vitamin - ReagentId: Vitamin
Quantity: 1 Quantity: 1
- type: Item - type: Item
size: 5 size: Tiny
# Custom Cake Example # Custom Cake Example
@@ -574,7 +574,7 @@
- type: Food - type: Food
transferAmount: 12 transferAmount: 12
- type: Item - type: Item
size: 40 size: Normal
- type: PointLight - type: PointLight
color: "#FFFF00" color: "#FFFF00"
radius: 2 radius: 2

View File

@@ -16,7 +16,7 @@
- ReagentId: Nutriment - ReagentId: Nutriment
Quantity: 3 Quantity: 3
- type: Item - type: Item
size: 1 size: Tiny
- type: Tag - type: Tag
tags: tags:
- DonkPocket - DonkPocket

View File

@@ -21,7 +21,7 @@
Quantity: 3 Quantity: 3
- type: Item - type: Item
sprite: Objects/Consumable/Food/Baked/donut.rsi sprite: Objects/Consumable/Food/Baked/donut.rsi
size: 1 size: Tiny
# Tastes like donut. # Tastes like donut.
# The sprinkles are now an overlay, so you can put them on any donut! If we really # The sprinkles are now an overlay, so you can put them on any donut! If we really

View File

@@ -16,7 +16,7 @@
- ReagentId: Nutriment - ReagentId: Nutriment
Quantity: 5 Quantity: 5
- type: Item - type: Item
size: 1 size: Tiny
# Muffins/Buns # Muffins/Buns

View File

@@ -24,7 +24,7 @@
- type: SliceableFood - type: SliceableFood
count: 8 count: 8
- type: Item - type: Item
size: 8 size: Normal
- type: Tag - type: Tag
tags: tags:
- Pizza - Pizza
@@ -53,7 +53,7 @@
- ReagentId: Vitamin - ReagentId: Vitamin
Quantity: 0.8 Quantity: 0.8
- type: Item - type: Item
size: 1 size: Tiny
- type: Tag - type: Tag
tags: tags:
- Pizza - Pizza

View File

@@ -38,13 +38,13 @@
map: ["pink-box6"] map: ["pink-box6"]
visible: false visible: false
- type: Storage - type: Storage
capacity: 6 maxSlots: 6
whitelist: whitelist:
tags: tags:
- Donut - Donut
- type: Item - type: Item
sprite: Objects/Consumable/Food/Baked/donut.rsi sprite: Objects/Consumable/Food/Baked/donut.rsi
size: 6 size: Small
heldPrefix: box heldPrefix: box
- type: StorageFill - type: StorageFill
contents: contents:
@@ -118,13 +118,13 @@
map: ["box12"] map: ["box12"]
visible: false visible: false
- type: Storage - type: Storage
capacity: 12 maxSlots: 12
whitelist: whitelist:
tags: tags:
- Egg - Egg
- type: Item - type: Item
sprite: Objects/Consumable/Food/egg.rsi sprite: Objects/Consumable/Food/egg.rsi
size: 12 size: Small
- type: StorageFill - type: StorageFill
contents: contents:
- id: FoodEgg - id: FoodEgg
@@ -206,7 +206,8 @@
map: ["enum.StorageVisualLayers.Door"] map: ["enum.StorageVisualLayers.Door"]
# TODO make these entitystorage again + placeablesurface after entity storage ECS gets merged. # TODO make these entitystorage again + placeablesurface after entity storage ECS gets merged.
- type: Storage - type: Storage
capacity: 8 maxSlots: 1
maxItemSize: Normal
whitelist: whitelist:
tags: tags:
- Pizza - Pizza
@@ -296,10 +297,10 @@
map: ["box6"] map: ["box6"]
visible: false visible: false
- type: Storage - type: Storage
capacity: 6 maxSlots: 6
- type: Item - type: Item
sprite: Objects/Consumable/Food/Baked/nuggets.rsi sprite: Objects/Consumable/Food/Baked/nuggets.rsi
size: 6 size: Small
heldPrefix: box heldPrefix: box
- type: StorageFill - type: StorageFill
contents: contents:
@@ -330,13 +331,13 @@
sprite: Objects/Consumable/Food/Baked/donkpocket.rsi sprite: Objects/Consumable/Food/Baked/donkpocket.rsi
state: box state: box
- type: Storage - type: Storage
maxTotalWeight: 12
whitelist: whitelist:
tags: tags:
- DonkPocket - DonkPocket
capacity: 6
- type: Item - type: Item
sprite: Objects/Consumable/Food/Baked/donkpocket.rsi sprite: Objects/Consumable/Food/Baked/donkpocket.rsi
size: 6 size: Small
- type: StorageFill - type: StorageFill
contents: contents:
- id: FoodDonkpocket - id: FoodDonkpocket
@@ -458,8 +459,6 @@
- type: Item - type: Item
sprite: Objects/Storage/Happyhonk/clown.rsi sprite: Objects/Storage/Happyhonk/clown.rsi
heldPrefix: box heldPrefix: box
- type: Storage
capacity: 30
- type: Tag - type: Tag
tags: tags:
- Trash - Trash
@@ -583,10 +582,8 @@
suffix: Toy Unsafe, Snacks suffix: Toy Unsafe, Snacks
name: syndicate snack box name: syndicate snack box
components: components:
- type: Item
size: 64
- type: Storage - type: Storage
capacity: 64 # need more room for goodies maxSlots: 9
- type: StorageFill - type: StorageFill
contents: contents:
# toy # toy

View File

@@ -37,7 +37,7 @@
- type: Item - type: Item
sprite: Objects/Consumable/Food/snacks.rsi sprite: Objects/Consumable/Food/snacks.rsi
heldPrefix: packet heldPrefix: packet
size: 3 size: Tiny
- type: DamageOnLand - type: DamageOnLand
damage: damage:
types: types:
@@ -63,7 +63,7 @@
- type: Item - type: Item
sprite: Objects/Consumable/Food/snacks.rsi sprite: Objects/Consumable/Food/snacks.rsi
heldPrefix: packet heldPrefix: packet
size: 3 size: Tiny
- type: PhysicalComposition - type: PhysicalComposition
materialComposition: materialComposition:
Steel: 100 Steel: 100

View File

@@ -16,7 +16,7 @@
sprite: Objects/Consumable/Food/egg.rsi sprite: Objects/Consumable/Food/egg.rsi
- type: Item - type: Item
sprite: Objects/Consumable/Food/egg.rsi sprite: Objects/Consumable/Food/egg.rsi
size: 1 size: Tiny
- type: SolutionContainerManager - type: SolutionContainerManager
solutions: solutions:
food: food:
@@ -69,7 +69,7 @@
sprite: Objects/Consumable/Food/egg.rsi sprite: Objects/Consumable/Food/egg.rsi
state: eggshells state: eggshells
- type: Item - type: Item
size: 1 size: Tiny
- type: SolutionContainerManager - type: SolutionContainerManager
solutions: solutions:
food: food:

View File

@@ -24,7 +24,7 @@
- ReagentId: Fat - ReagentId: Fat
Quantity: 5 Quantity: 5
- type: Item - type: Item
size: 5 size: Tiny
- type: Fixtures - type: Fixtures
fixtures: fixtures:
fix1: fix1:

View File

@@ -136,7 +136,7 @@
- type: Sprite - type: Sprite
sprite: Objects/Specific/Hydroponics/nettle.rsi sprite: Objects/Specific/Hydroponics/nettle.rsi
- type: Item - type: Item
size: 10 size: Small
sprite: Objects/Specific/Hydroponics/nettle.rsi sprite: Objects/Specific/Hydroponics/nettle.rsi
- type: MeleeWeapon - type: MeleeWeapon
damage: damage:
@@ -166,7 +166,7 @@
- type: Sprite - type: Sprite
sprite: Objects/Specific/Hydroponics/death_nettle.rsi sprite: Objects/Specific/Hydroponics/death_nettle.rsi
- type: Item - type: Item
size: 10 size: Small
sprite: Objects/Specific/Hydroponics/death_nettle.rsi sprite: Objects/Specific/Hydroponics/death_nettle.rsi
- type: MeleeWeapon - type: MeleeWeapon
damage: damage:
@@ -836,7 +836,7 @@
sprite: Objects/Specific/Hydroponics/corn.rsi sprite: Objects/Specific/Hydroponics/corn.rsi
state: cob state: cob
- type: Item - type: Item
size: 1 size: Tiny
- type: Tag - type: Tag
tags: tags:
- Trash - Trash
@@ -1365,7 +1365,7 @@
description: Round green object that you can slice and eat. description: Round green object that you can slice and eat.
components: components:
- type: Item - type: Item
size: 10 size: Small
- type: FlavorProfile - type: FlavorProfile
flavors: flavors:
- watermelon - watermelon
@@ -1427,7 +1427,7 @@
description: Juicy green and red slice. description: Juicy green and red slice.
components: components:
- type: Item - type: Item
size: 2 size: Tiny
- type: FlavorProfile - type: FlavorProfile
flavors: flavors:
- watermelon - watermelon
@@ -1573,7 +1573,7 @@
description: A large, orange... berry. Seriously. description: A large, orange... berry. Seriously.
components: components:
- type: Item - type: Item
size: 10 size: Small
- type: FlavorProfile - type: FlavorProfile
flavors: flavors:
- pumpkin - pumpkin

View File

@@ -17,7 +17,7 @@
- ReagentId: Nutriment - ReagentId: Nutriment
Quantity: 8 Quantity: 8
- type: Item - type: Item
size: 5 size: Small
# Kebabs # Kebabs

View File

@@ -21,7 +21,7 @@
- type: Item - type: Item
sprite: Objects/Consumable/Food/snacks.rsi sprite: Objects/Consumable/Food/snacks.rsi
heldPrefix: packet heldPrefix: packet
size: 3 size: Tiny
# Snacks # Snacks
# "Snacks" means food in a packet. Down the line this stuff can have multiple # "Snacks" means food in a packet. Down the line this stuff can have multiple
@@ -101,7 +101,7 @@
state: chocolatebar state: chocolatebar
- type: Item - type: Item
heldPrefix: chocolatebar heldPrefix: chocolatebar
size: 3 size: Tiny
- type: Tag - type: Tag
tags: tags:
- FoodSnack - FoodSnack
@@ -346,7 +346,7 @@
- type: Item - type: Item
sprite: Objects/Consumable/Food/snacks.rsi sprite: Objects/Consumable/Food/snacks.rsi
heldPrefix: packet heldPrefix: packet
size: 1 size: Tiny
- type: Food - type: Food
trash: FoodCookieFortune trash: FoodCookieFortune
@@ -357,7 +357,7 @@
description: A carefully synthesized brick designed to contain the highest ratio of nutriment to volume. Tastes like shit. description: A carefully synthesized brick designed to contain the highest ratio of nutriment to volume. Tastes like shit.
components: components:
- type: Item - type: Item
size: 10 size: Small
- type: Tag - type: Tag
tags: tags:
- FoodSnack - FoodSnack
@@ -381,7 +381,7 @@
flavors: flavors:
- nutribrick - nutribrick
- type: Item - type: Item
size: 10 size: Small
- type: Sprite - type: Sprite
state: nutribrick-open state: nutribrick-open
- type: Food - type: Food

View File

@@ -10,11 +10,9 @@
- state: closed - state: closed
- state: open - state: open
map: ["openLayer"] map: ["openLayer"]
- type: Storage
capacity: 36
- type: Item - type: Item
sprite: Objects/Consumable/Smokeables/Cigarettes/Cartons/green.rsi sprite: Objects/Consumable/Smokeables/Cigarettes/Cartons/green.rsi
size: 36 size: Normal
- type: StorageFill - type: StorageFill
contents: contents:
- id: CigPackGreen - id: CigPackGreen

View File

@@ -17,7 +17,7 @@
slots: [ mask ] slots: [ mask ]
equippedPrefix: unlit equippedPrefix: unlit
- type: Item - type: Item
size: 1 size: Tiny
- type: Construction - type: Construction
graph: smokeableCigarette graph: smokeableCigarette
node: cigarette node: cigarette
@@ -41,7 +41,7 @@
slots: [ mask ] slots: [ mask ]
equippedPrefix: unlit equippedPrefix: unlit
- type: Item - type: Item
size: 1 size: Tiny
- type: Construction - type: Construction
graph: smokeableCigarette graph: smokeableCigarette
node: cigarette node: cigarette

View File

@@ -17,7 +17,7 @@
slots: [ mask ] slots: [ mask ]
equippedPrefix: unlit equippedPrefix: unlit
- type: Item - type: Item
size: 1 size: Tiny
- type: Construction - type: Construction
graph: smokeableJoint graph: smokeableJoint
node: joint node: joint
@@ -48,7 +48,7 @@
slots: [ mask ] slots: [ mask ]
equippedPrefix: unlit equippedPrefix: unlit
- type: Item - type: Item
size: 1 size: Tiny
- type: Construction - type: Construction
graph: smokeableBlunt graph: smokeableBlunt
node: blunt node: blunt

View File

@@ -43,9 +43,9 @@
Steel: 50 Steel: 50
- type: SpaceGarbage - type: SpaceGarbage
- type: Storage - type: Storage
capacity: 5 maxSlots: 5
- type: Item - type: Item
size: 5 size: Small
- type: StorageFill - type: StorageFill
contents: contents:
- id: Cigarette - id: Cigarette
@@ -108,9 +108,10 @@
Steel: 50 Steel: 50
- type: SpaceGarbage - type: SpaceGarbage
- type: Storage - type: Storage
capacity: 10 maxSlots: 10
maxTotalWeight: 20
- type: Item - type: Item
size: 10 size: Small
- type: StorageFill - type: StorageFill
contents: contents:
- id: CigaretteRandom - id: CigaretteRandom

View File

@@ -9,7 +9,7 @@
tags: tags:
- RollingPaper - RollingPaper
- CigFilter - CigFilter
capacity: 20 maxSlots: 20
- type: StorageFill - type: StorageFill
contents: contents:
- id: PaperRolling - id: PaperRolling
@@ -31,7 +31,6 @@
tags: tags:
- RollingPaper - RollingPaper
- CigFilter - CigFilter
capacity: 32
- type: StorageFill - type: StorageFill
contents: contents:
- id: PaperRolling - id: PaperRolling
@@ -54,7 +53,7 @@
state: cigpaper state: cigpaper
- type: Item - type: Item
sprite: Objects/Consumable/Smokeables/Cigarettes/paper.rsi sprite: Objects/Consumable/Smokeables/Cigarettes/paper.rsi
size: 5 size: Tiny
- type: Tag - type: Tag
tags: tags:
- RollingPaper - RollingPaper
@@ -68,8 +67,6 @@
components: components:
- type: Stack - type: Stack
count: 1 count: 1
- type: Item
size: 1
- type: entity - type: entity
id: CigaretteFilter id: CigaretteFilter
@@ -86,7 +83,7 @@
state: cigfilter state: cigfilter
- type: Item - type: Item
sprite: Objects/Consumable/Smokeables/Cigarettes/paper.rsi sprite: Objects/Consumable/Smokeables/Cigarettes/paper.rsi
size: 10 size: Tiny
- type: Tag - type: Tag
tags: tags:
- CigFilter - CigFilter
@@ -99,5 +96,3 @@
components: components:
- type: Stack - type: Stack
count: 1 count: 1
- type: Item
size: 2

View File

@@ -35,10 +35,10 @@
map: ["cigar8"] map: ["cigar8"]
visible: false visible: false
- type: Storage - type: Storage
capacity: 8 maxSlots: 8
- type: Item - type: Item
sprite: Objects/Consumable/Smokeables/Cigars/case.rsi sprite: Objects/Consumable/Smokeables/Cigars/case.rsi
size: 8 size: Small
- type: StorageFill - type: StorageFill
contents: contents:
- id: Cigar - id: Cigar

View File

@@ -19,7 +19,7 @@
slots: [ mask ] slots: [ mask ]
equippedPrefix: unlit equippedPrefix: unlit
- type: Item - type: Item
size: 1 size: Tiny
- type: entity - type: entity
id: CigarSpent id: CigarSpent
@@ -49,7 +49,7 @@
slots: [ mask ] slots: [ mask ]
equippedPrefix: unlit equippedPrefix: unlit
- type: Item - type: Item
size: 1 size: Tiny
- type: entity - type: entity
id: CigarGoldSpent id: CigarGoldSpent

View File

@@ -12,7 +12,7 @@
slots: [ mask ] slots: [ mask ]
equippedPrefix: unlit equippedPrefix: unlit
- type: Item - type: Item
size: 3 size: Tiny
sprite: Objects/Consumable/Smokeables/Pipes/pipe.rsi sprite: Objects/Consumable/Smokeables/Pipes/pipe.rsi
- type: Appearance - type: Appearance
- type: BurnStateVisuals - type: BurnStateVisuals

View File

@@ -8,7 +8,7 @@
sprite: Objects/Specific/Hydroponics/pumpkin.rsi sprite: Objects/Specific/Hydroponics/pumpkin.rsi
state: carved state: carved
- type: Item - type: Item
size: 10 size: Normal
- type: Construction - type: Construction
graph: PumpkinAddLight graph: PumpkinAddLight
node: start node: start

View File

@@ -9,6 +9,6 @@
layers: layers:
- state: icon - state: icon
- type: Item - type: Item
size: 1001 size: Huge
- type: StaticPrice - type: StaticPrice
price: 0 price: 0

View File

@@ -15,9 +15,7 @@
suffix: Empty suffix: Empty
components: components:
- type: Item - type: Item
size: 30 size: Normal
- type: Storage
capacity: 30
- type: entity - type: entity
id: PresentRandomUnsafe id: PresentRandomUnsafe

View File

@@ -17,7 +17,7 @@
sprite: Objects/Devices/timer.rsi sprite: Objects/Devices/timer.rsi
state: timer state: timer
- type: Item - type: Item
size: 5 size: Small
- type: PayloadTrigger - type: PayloadTrigger
components: components:
- type: OnUseTimerTrigger - type: OnUseTimerTrigger

View File

@@ -8,7 +8,7 @@
sprite: Objects/Misc/module.rsi sprite: Objects/Misc/module.rsi
state: abductor_mod state: abductor_mod
- type: Item - type: Item
size: 10 size: Small
- type: Tag - type: Tag
tags: tags:
- WeaponPistolCHIMPUpgradeKit - WeaponPistolCHIMPUpgradeKit

View File

@@ -8,7 +8,7 @@
sprite: Objects/Devices/forensic_scanner.rsi sprite: Objects/Devices/forensic_scanner.rsi
state: forensicnew state: forensicnew
- type: Item - type: Item
size: 5 size: Small
- type: Clothing - type: Clothing
sprite: Objects/Devices/forensic_scanner.rsi sprite: Objects/Devices/forensic_scanner.rsi
quickEquip: false quickEquip: false

View File

@@ -37,7 +37,7 @@
components: components:
- IdCard - IdCard
- type: Item - type: Item
size: 10 size: Small
- type: ContainerContainer - type: ContainerContainer
containers: containers:
PDA-id: !type:ContainerSlot {} PDA-id: !type:ContainerSlot {}

View File

@@ -16,7 +16,7 @@
- key: enum.InstrumentUiKey.Key - key: enum.InstrumentUiKey.Key
type: InstrumentBoundUserInterface type: InstrumentBoundUserInterface
- type: Item - type: Item
size: 24 size: Normal
- type: StaticPrice - type: StaticPrice
price: 200 price: 200

View File

@@ -14,7 +14,7 @@
sprite: Objects/Fun/Instruments/trumpet.rsi sprite: Objects/Fun/Instruments/trumpet.rsi
state: icon state: icon
- type: Item - type: Item
size: 24 size: Normal
sprite: Objects/Fun/Instruments/trumpet.rsi sprite: Objects/Fun/Instruments/trumpet.rsi
- type: Tag - type: Tag
tags: tags:
@@ -32,7 +32,7 @@
sprite: Objects/Fun/Instruments/trombone.rsi sprite: Objects/Fun/Instruments/trombone.rsi
state: icon state: icon
- type: Item - type: Item
size: 48 size: Normal
sprite: Objects/Fun/Instruments/trombone.rsi sprite: Objects/Fun/Instruments/trombone.rsi
- type: Tag - type: Tag
tags: tags:
@@ -50,7 +50,7 @@
sprite: Objects/Fun/Instruments/frenchhorn.rsi sprite: Objects/Fun/Instruments/frenchhorn.rsi
state: icon state: icon
- type: Item - type: Item
size: 48 size: Normal
sprite: Objects/Fun/Instruments/frenchhorn.rsi sprite: Objects/Fun/Instruments/frenchhorn.rsi
- type: Tag - type: Tag
tags: tags:
@@ -69,7 +69,7 @@
sprite: Objects/Fun/Instruments/euphonium.rsi sprite: Objects/Fun/Instruments/euphonium.rsi
state: icon state: icon
- type: Item - type: Item
size: 48 size: Normal
sprite: Objects/Fun/Instruments/euphonium.rsi sprite: Objects/Fun/Instruments/euphonium.rsi
- type: Tag - type: Tag
tags: tags:

View File

@@ -10,7 +10,7 @@
- type: Instrument - type: Instrument
program: 121 program: 121
- type: Item - type: Item
size: 10 size: Small
- type: entity - type: entity
parent: BaseHandheldInstrument parent: BaseHandheldInstrument
@@ -24,7 +24,7 @@
- type: Instrument - type: Instrument
program: 122 program: 122
- type: Item - type: Item
size: 10 size: Small
- type: entity - type: entity
parent: BaseHandheldInstrument parent: BaseHandheldInstrument
@@ -38,7 +38,7 @@
- type: Instrument - type: Instrument
program: 123 program: 123
- type: Item - type: Item
size: 5 size: Tiny
- type: entity - type: entity
parent: BaseHandheldInstrument parent: BaseHandheldInstrument
@@ -55,7 +55,7 @@
- type: Instrument - type: Instrument
program: 124 program: 124
- type: Item - type: Item
size: 10 size: Small
- type: Prayable - type: Prayable
sentMessage: prayer-popup-notify-centcom-sent sentMessage: prayer-popup-notify-centcom-sent
notifiactionPrefix: prayer-chat-notify-centcom notifiactionPrefix: prayer-chat-notify-centcom
@@ -74,7 +74,7 @@
- type: Instrument - type: Instrument
program: 125 program: 125
- type: Item - type: Item
size: 10 size: Small
- type: entity - type: entity
parent: BaseHandheldInstrument parent: BaseHandheldInstrument
@@ -88,7 +88,7 @@
- type: Instrument - type: Instrument
program: 126 program: 126
- type: Item - type: Item
size: 5 size: Tiny
- type: entity - type: entity
parent: BaseHandheldInstrument parent: BaseHandheldInstrument
@@ -102,7 +102,7 @@
sprite: Objects/Fun/Instruments/gunpet.rsi sprite: Objects/Fun/Instruments/gunpet.rsi
state: icon state: icon
- type: Item - type: Item
size: 15 size: Normal
sprite: Objects/Fun/Instruments/gunpet.rsi sprite: Objects/Fun/Instruments/gunpet.rsi
- type: Tag - type: Tag
tags: tags:
@@ -125,7 +125,7 @@
- BrassInstrument #Go figure. - BrassInstrument #Go figure.
- type: Item - type: Item
sprite: Objects/Fun/Instruments/bike_horn.rsi sprite: Objects/Fun/Instruments/bike_horn.rsi
size: 10 size: Small
- type: Clothing - type: Clothing
sprite: Objects/Fun/Instruments/bike_horn.rsi sprite: Objects/Fun/Instruments/bike_horn.rsi
slots: [Belt] slots: [Belt]

View File

@@ -9,7 +9,7 @@
sprite: Objects/Fun/Instruments/glockenspiel.rsi sprite: Objects/Fun/Instruments/glockenspiel.rsi
state: icon state: icon
- type: Item - type: Item
size: 24 size: Normal
sprite: Objects/Fun/Instruments/glockenspiel.rsi sprite: Objects/Fun/Instruments/glockenspiel.rsi
- type: Tag - type: Tag
tags: tags:
@@ -58,7 +58,7 @@
sprite: Objects/Fun/Instruments/microphone.rsi sprite: Objects/Fun/Instruments/microphone.rsi
state: icon state: icon
- type: Item - type: Item
size: 10 size: Small
sprite: Objects/Fun/Instruments/microphone.rsi sprite: Objects/Fun/Instruments/microphone.rsi
- type: entity - type: entity
@@ -76,7 +76,7 @@
sprite: Objects/Fun/Instruments/h_synthesizer.rsi sprite: Objects/Fun/Instruments/h_synthesizer.rsi
state: icon state: icon
- type: Item - type: Item
size: 24 size: Normal
sprite: Objects/Fun/Instruments/h_synthesizer.rsi sprite: Objects/Fun/Instruments/h_synthesizer.rsi
- type: Tag - type: Tag
tags: tags:
@@ -135,5 +135,5 @@
sprite: Objects/Fun/Instruments/h_synthesizer.rsi sprite: Objects/Fun/Instruments/h_synthesizer.rsi
state: icon state: icon
- type: Item - type: Item
size: 24 size: Normal
sprite: Objects/Fun/Instruments/h_synthesizer.rsi sprite: Objects/Fun/Instruments/h_synthesizer.rsi

View File

@@ -15,7 +15,7 @@
sprite: Objects/Fun/Instruments/eguitar.rsi sprite: Objects/Fun/Instruments/eguitar.rsi
state: icon state: icon
- type: Item - type: Item
size: 24 size: Normal
sprite: Objects/Fun/Instruments/eguitar.rsi sprite: Objects/Fun/Instruments/eguitar.rsi
- type: Clothing - type: Clothing
quickEquip: false quickEquip: false
@@ -44,7 +44,7 @@
sprite: Objects/Fun/Instruments/bassguitar.rsi sprite: Objects/Fun/Instruments/bassguitar.rsi
state: icon state: icon
- type: Item - type: Item
size: 24 size: Normal
sprite: Objects/Fun/Instruments/bassguitar.rsi sprite: Objects/Fun/Instruments/bassguitar.rsi
- type: Clothing - type: Clothing
quickEquip: false quickEquip: false
@@ -72,7 +72,7 @@
sprite: Objects/Fun/Instruments/rockguitar.rsi sprite: Objects/Fun/Instruments/rockguitar.rsi
state: icon state: icon
- type: Item - type: Item
size: 24 size: Normal
sprite: Objects/Fun/Instruments/rockguitar.rsi sprite: Objects/Fun/Instruments/rockguitar.rsi
- type: Clothing - type: Clothing
quickEquip: false quickEquip: false
@@ -115,7 +115,7 @@
- StringInstrument - StringInstrument
- type: Item - type: Item
sprite: Objects/Fun/Instruments/guitar.rsi sprite: Objects/Fun/Instruments/guitar.rsi
size: 24 size: Normal
- type: Clothing - type: Clothing
quickEquip: false quickEquip: false
slots: slots:
@@ -178,7 +178,7 @@
sprite: Objects/Fun/Instruments/banjo.rsi sprite: Objects/Fun/Instruments/banjo.rsi
state: icon state: icon
- type: Item - type: Item
size: 24 size: Normal
sprite: Objects/Fun/Instruments/banjo.rsi sprite: Objects/Fun/Instruments/banjo.rsi
- type: Tag - type: Tag
tags: tags:
@@ -200,7 +200,7 @@
sprite: Objects/Fun/Instruments/violin.rsi sprite: Objects/Fun/Instruments/violin.rsi
state: icon state: icon
- type: Item - type: Item
size: 24 size: Normal
sprite: Objects/Fun/Instruments/violin.rsi sprite: Objects/Fun/Instruments/violin.rsi
- type: Tag - type: Tag
tags: tags:
@@ -218,7 +218,7 @@
sprite: Objects/Fun/Instruments/viola.rsi sprite: Objects/Fun/Instruments/viola.rsi
state: icon state: icon
- type: Item - type: Item
size: 24 size: Normal
sprite: Objects/Fun/Instruments/viola.rsi sprite: Objects/Fun/Instruments/viola.rsi
- type: Tag - type: Tag
tags: tags:
@@ -236,7 +236,7 @@
sprite: Objects/Fun/Instruments/cello.rsi sprite: Objects/Fun/Instruments/cello.rsi
state: icon state: icon
- type: Item - type: Item
size: 48 size: Normal
sprite: Objects/Fun/Instruments/cello.rsi sprite: Objects/Fun/Instruments/cello.rsi
- type: Tag - type: Tag
tags: tags:

View File

@@ -16,7 +16,7 @@
sprite: Objects/Fun/Instruments/saxophone.rsi sprite: Objects/Fun/Instruments/saxophone.rsi
state: icon state: icon
- type: Item - type: Item
size: 24 size: Normal
sprite: Objects/Fun/Instruments/saxophone.rsi sprite: Objects/Fun/Instruments/saxophone.rsi
- type: Tag - type: Tag
tags: tags:
@@ -45,7 +45,7 @@
sprite: Objects/Fun/Instruments/accordion.rsi sprite: Objects/Fun/Instruments/accordion.rsi
state: icon state: icon
- type: Item - type: Item
size: 24 size: Normal
sprite: Objects/Fun/Instruments/accordion.rsi sprite: Objects/Fun/Instruments/accordion.rsi
- type: Tag - type: Tag
tags: tags:
@@ -62,7 +62,7 @@
sprite: Objects/Fun/Instruments/harmonica.rsi sprite: Objects/Fun/Instruments/harmonica.rsi
state: icon state: icon
- type: Item - type: Item
size: 10 size: Small
sprite: Objects/Fun/Instruments/harmonica.rsi sprite: Objects/Fun/Instruments/harmonica.rsi
- type: Tag - type: Tag
tags: tags:
@@ -80,7 +80,7 @@
sprite: Objects/Fun/Instruments/clarinet.rsi sprite: Objects/Fun/Instruments/clarinet.rsi
state: icon state: icon
- type: Item - type: Item
size: 20 size: Normal
sprite: Objects/Fun/Instruments/clarinet.rsi sprite: Objects/Fun/Instruments/clarinet.rsi
- type: Tag - type: Tag
tags: tags:
@@ -98,7 +98,7 @@
sprite: Objects/Fun/Instruments/flute.rsi sprite: Objects/Fun/Instruments/flute.rsi
state: icon state: icon
- type: Item - type: Item
size: 20 size: Normal
sprite: Objects/Fun/Instruments/flute.rsi sprite: Objects/Fun/Instruments/flute.rsi
- type: Tag - type: Tag
tags: tags:
@@ -116,7 +116,7 @@
sprite: Objects/Fun/Instruments/recorder.rsi sprite: Objects/Fun/Instruments/recorder.rsi
state: icon state: icon
- type: Item - type: Item
size: 24 size: Normal
sprite: Objects/Fun/Instruments/recorder.rsi sprite: Objects/Fun/Instruments/recorder.rsi
- type: Tag - type: Tag
tags: tags:
@@ -134,7 +134,7 @@
sprite: Objects/Fun/Instruments/panflute.rsi sprite: Objects/Fun/Instruments/panflute.rsi
state: icon state: icon
- type: Item - type: Item
size: 15 size: Normal
sprite: Objects/Fun/Instruments/panflute.rsi sprite: Objects/Fun/Instruments/panflute.rsi
- type: Tag - type: Tag
tags: tags:
@@ -153,7 +153,7 @@
sprite: Objects/Fun/Instruments/ocarina.rsi sprite: Objects/Fun/Instruments/ocarina.rsi
state: icon state: icon
- type: Item - type: Item
size: 15 size: Normal
sprite: Objects/Fun/Instruments/ocarina.rsi sprite: Objects/Fun/Instruments/ocarina.rsi
- type: Tag - type: Tag
tags: tags:
@@ -171,7 +171,7 @@
sprite: Objects/Fun/Instruments/bagpipes.rsi sprite: Objects/Fun/Instruments/bagpipes.rsi
state: icon state: icon
- type: Item - type: Item
size: 48 size: Normal
sprite: Objects/Fun/Instruments/bagpipes.rsi sprite: Objects/Fun/Instruments/bagpipes.rsi
- type: Tag - type: Tag
tags: tags:

View File

@@ -9,7 +9,7 @@
state: icon state: icon
- type: Item - type: Item
sprite: Objects/Fun/bikehorn.rsi sprite: Objects/Fun/bikehorn.rsi
size: 5 size: Tiny
- type: Clothing - type: Clothing
sprite: Objects/Fun/bikehorn.rsi sprite: Objects/Fun/bikehorn.rsi
slots: [Belt] slots: [Belt]
@@ -58,7 +58,7 @@
state: icon state: icon
- type: Item - type: Item
sprite: Objects/Fun/cluwnehorn.rsi sprite: Objects/Fun/cluwnehorn.rsi
size: 5 size: Tiny
- type: Clothing - type: Clothing
sprite: Objects/Fun/cluwnehorn.rsi sprite: Objects/Fun/cluwnehorn.rsi
slots: [Belt] slots: [Belt]
@@ -100,7 +100,7 @@
state: icon state: icon
- type: Item - type: Item
sprite: Objects/Fun/goldbikehorn.rsi sprite: Objects/Fun/goldbikehorn.rsi
size: 5 size: Tiny
- type: Clothing - type: Clothing
sprite: Objects/Fun/goldbikehorn.rsi sprite: Objects/Fun/goldbikehorn.rsi
slots: [Belt] slots: [Belt]
@@ -119,7 +119,7 @@
state: icon state: icon
- type: Item - type: Item
sprite: Objects/Fun/bananiumhorn.rsi sprite: Objects/Fun/bananiumhorn.rsi
size: 5 size: Tiny
- type: Clothing - type: Clothing
sprite: Objects/Fun/bananiumhorn.rsi sprite: Objects/Fun/bananiumhorn.rsi
slots: [Belt] slots: [Belt]

View File

@@ -9,7 +9,7 @@
sprite: Objects/Fun/crayons.rsi sprite: Objects/Fun/crayons.rsi
- type: Item - type: Item
sprite: Objects/Fun/crayons.rsi sprite: Objects/Fun/crayons.rsi
size: 1 size: Tiny
- type: Tag - type: Tag
tags: tags:
- Write - Write
@@ -235,10 +235,11 @@
sprite: Objects/Fun/crayons.rsi sprite: Objects/Fun/crayons.rsi
state: box state: box
- type: Storage - type: Storage
capacity: 7 maxSlots: 7
maxTotalWeight: 7
- type: Item - type: Item
sprite: Objects/Fun/crayons.rsi sprite: Objects/Fun/crayons.rsi
size: 7 size: Small
heldPrefix: box heldPrefix: box
- type: StorageFill - type: StorageFill
contents: contents:

View File

@@ -40,7 +40,7 @@
types: types:
Piercing: 4 Piercing: 4
- type: Item - type: Item
size: 2 size: Tiny
sprite: Objects/Fun/Darts/dart_red.rsi sprite: Objects/Fun/Darts/dart_red.rsi
- type: ItemCooldown - type: ItemCooldown
- type: SolutionContainerManager - type: SolutionContainerManager

View File

@@ -13,7 +13,7 @@
tags: tags:
- Dice - Dice
- type: Item - type: Item
size: 2 size: Tiny
- type: entity - type: entity
parent: BaseDice parent: BaseDice

Some files were not shown because too many files have changed in this diff Show More