using System.Numerics;
-using Robust.Client.GameObjects;
+using Content.Client.Message;
using Robust.Client.Graphics;
using Robust.Client.UserInterface.Controls;
-using Robust.Client.UserInterface.CustomControls;
using Content.Client.Stylesheets;
using Content.Client.UserInterface.Controls;
using Content.Shared.IdentityManagement;
using Content.Shared.Item;
using Content.Shared.Stacks;
using Content.Shared.Storage;
+using Content.Shared.Storage.EntitySystems;
using Robust.Client.UserInterface;
-using Robust.Shared.Containers;
using static Robust.Client.UserInterface.Controls.BoxContainer;
using Direction = Robust.Shared.Maths.Direction;
{
private readonly IEntityManager _entityManager;
- private readonly Label _information;
+ private readonly SharedStorageSystem _storage;
+
+ private readonly RichTextLabel _information;
public readonly ContainerButton StorageContainerButton;
public readonly ListContainer EntityList;
private readonly StyleBoxFlat _hoveredBox = new() { BackgroundColor = Color.Black.WithAlpha(0.35f) };
public StorageWindow(IEntityManager entityManager)
{
_entityManager = entityManager;
+ _storage = _entityManager.System<SharedStorageSystem>();
SetSize = new Vector2(240, 320);
Title = Loc.GetString("comp-storage-window-title");
RectClipContent = true;
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
};
+ _information.SetMessage(Loc.GetString("comp-storage-window-weight",
+ ("percent", 0),
+ ("size", SharedItemSystem.GetItemSizeLocale(ItemSize.Normal))));
vBox.AddChild(_information);
EntityList.PopulateList(list);
- // Sets information about entire storage container current capacity
- if (component.StorageCapacityMax != 0)
+ SetStorageInformation((entity, component));
+ }
+
+ 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),
- ("usedVolume", component.StorageUsed), ("maxVolume", component.StorageCapacityMax));
+ _information.SetMarkup(Loc.GetString("comp-storage-window-weight",
+ ("weight", _storage.GetCumulativeItemSizes(uid, uid.Comp)),
+ ("maxWeight", uid.Comp.MaxTotalWeight),
+ ("size", SharedItemSystem.GetItemSizeLocale(_storage.GetMaxItemSize((uid, uid.Comp))))));
}
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))))));
}
}
|| !_entityManager.EntityExists(entity))
return;
- _entityManager.TryGetComponent(entity, out ItemComponent? item);
_entityManager.TryGetComponent(entity, out StackComponent? stack);
+ _entityManager.TryGetComponent(entity, out ItemComponent? item);
var count = stack?.Count ?? 1;
- var size = item?.Size;
var spriteView = new SpriteView
{
HorizontalExpand = true,
ClipText = true,
Text = _entityManager.GetComponent<MetaDataComponent>(Identity.Entity(entity, _entityManager)).EntityName +
- (count > 1 ? $" x {count}" : string.Empty),
+ (count > 1 ? $" x {count}" : string.Empty)
},
new Label
{
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")
}
}
});
- type: Clothing
slots: [innerclothing]
- type: Item
- size: 5
+ size: Tiny
- type: entity
name: IDCardDummy
slots:
- idcard
- type: Item
- size: 5
+ size: Tiny
- type: IdCard
- type: entity
id: FlashlightDummy
components:
- type: Item
- size: 5
+ size: Tiny
- type: entity
name: ToolboxDummy
id: ToolboxDummy
components:
- type: Item
- size: 9999
+ size: Huge
";
[Test]
public async Task Test()
+++ /dev/null
-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();
- }
-}
using System.Linq;
using Content.Server.Storage.Components;
using Content.Shared.Item;
+using Content.Shared.Prototypes;
using Content.Shared.Storage;
using Content.Shared.Storage.Components;
+using Content.Shared.Storage.EntitySystems;
using Robust.Shared.GameObjects;
using Robust.Shared.Prototypes;
-using Robust.UnitTesting;
namespace Content.IntegrationTests.Tests
{
{
if (!proto.TryGetComponent<StorageComponent>("Storage", out var storage) ||
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();
{
foreach (var proto in PoolManager.GetPrototypesWithComponent<StorageFillComponent>(server))
{
- int capacity;
- var isEntStorage = false;
+ if (proto.HasComponent<EntityStorageComponent>(compFact))
+ 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;
- isEntStorage = true;
+ Assert.That(GetFillSize(fill, true, protoMan), Is.LessThanOrEqualTo(storage.MaxSlots),
+ $"{proto.ID} storage fill has too many items.");
}
else
{
- Assert.Fail($"Entity {proto.ID} has storage-fill without a storage component!");
- continue;
+ Assert.That(size, Is.LessThanOrEqualTo(storage.MaxTotalWeight), $"{proto.ID} storage fill is too large.");
}
- var fill = (StorageFillComponent) proto.Components[id].Component;
- var size = GetFillSize(fill, isEntStorage);
- Assert.That(size, Is.LessThanOrEqualTo(capacity), $"{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");
+ }
}
});
- int GetEntrySize(EntitySpawnEntry entry, bool isEntStorage)
- {
- if (entry.PrototypeId == null)
- return 0;
+ await pair.CleanReturnAsync();
+
+ }
- if (!protoMan.TryIndex<EntityPrototype>(entry.PrototypeId, out var proto))
+ [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))
{
- Assert.Fail($"Unknown prototype: {entry.PrototypeId}");
- return 0;
- }
+ if (proto.HasComponent<StorageComponent>(compFact))
+ continue;
- if (isEntStorage)
- return entry.Amount;
+ if (!proto.TryGetComponent<EntityStorageComponent>("EntityStorage", out var entStorage))
+ {
+ Assert.Fail($"Entity {proto.ID} has storage-fill without a storage component!");
+ continue;
+ }
- if (proto.TryGetComponent<ItemComponent>("Item", out var item))
- return item.Size * entry.Amount;
+ var fill = (StorageFillComponent) proto.Components[id].Component;
+ var size = GetFillSize(fill, true, protoMan);
+ Assert.That(size, Is.LessThanOrEqualTo(entStorage.Capacity),
+ $"{proto.ID} storage fill is too large.");
+ }
+ });
+ await pair.CleanReturnAsync();
+ }
- Assert.Fail($"Prototype is missing item comp: {entry.PrototypeId}");
+ private int GetEntrySize(EntitySpawnEntry entry, bool getCount, IPrototypeManager protoMan)
+ {
+ if (entry.PrototypeId == null)
return 0;
- }
- int GetFillSize(StorageFillComponent fill, bool isEntStorage)
+ if (!protoMan.TryIndex<EntityPrototype>(entry.PrototypeId, out var proto))
{
- var totalSize = 0;
- var groups = new Dictionary<string, int>();
- foreach (var entry in fill.Contents)
- {
- var size = GetEntrySize(entry, isEntStorage);
+ Assert.Fail($"Unknown prototype: {entry.PrototypeId}");
+ return 0;
+ }
- if (entry.GroupId == null)
- totalSize += size;
- else
- groups[entry.GroupId] = Math.Max(size, groups.GetValueOrDefault(entry.GroupId));
- }
+ if (getCount)
+ return entry.Amount;
- return totalSize + groups.Values.Sum();
+ 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 size = GetEntrySize(entry, getCount, protoMan);
+
+ if (entry.GroupId == null)
+ totalSize += size;
+ else
+ groups[entry.GroupId] = Math.Max(size, groups.GetValueOrDefault(entry.GroupId));
}
- await pair.CleanReturnAsync();
+ return totalSize + groups.Values.Sum();
}
}
}
var user = message.Session.AttachedEntity;
var maybeContainer = _itemSlotsSystem.GetItemOrNull(chemMaster, SharedChemMaster.OutputSlotName);
if (maybeContainer is not { Valid: true } container
- || !TryComp(container, out StorageComponent? storage)
- || storage.Container is null)
+ || !TryComp(container, out StorageComponent? storage))
{
return; // output can't fit pills
}
// Ensure the number is valid.
- if (message.Number == 0 || message.Number > storage.StorageCapacityMax - storage.StorageUsed)
+ if (message.Number == 0 || !_storageSystem.HasSpace((container, storage)))
return;
// Ensure the amount is valid.
if (!TryComp(container, out StorageComponent? storage))
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);
var quantity = solution?.Volume ?? FixedPoint2.Zero;
return (Name(pill), quantity);
})).ToList();
- if (pills == null)
- return null;
-
- return new ContainerInfo(name, storage.StorageUsed, storage.StorageCapacityMax)
+ return new ContainerInfo(name, _storageSystem.GetCumulativeItemSizes(container.Value, storage), storage.MaxTotalWeight)
{
Entities = pills
};
+using System.Linq;
using Content.Server.Body.Components;
using Content.Server.Body.Systems;
using Content.Server.Inventory;
return (false, false);
// 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);
return (false, true);
/// Max item size that can be fitted into secret stash.
/// </summary>
[DataField("maxItemSize")]
- public int MaxItemSize = (int) ReferenceSizes.Pocket;
+ public ItemSize MaxItemSize = ItemSize.Small;
/// <summary>
/// IC secret stash name. For example "the toilet cistern".
using Content.Shared.Rounding;
using Content.Shared.Storage;
using Content.Shared.Storage.Components;
-using Robust.Server.GameObjects;
using Robust.Shared.Containers;
namespace Content.Server.Storage.EntitySystems;
public override void Initialize()
{
base.Initialize();
- SubscribeLocalEvent<StorageFillVisualizerComponent, ComponentInit>(OnInit);
+ SubscribeLocalEvent<StorageFillVisualizerComponent, ComponentStartup>(OnStartup);
SubscribeLocalEvent<StorageFillVisualizerComponent, EntInsertedIntoContainerMessage>(OnInserted);
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);
}
if (component.MaxFillLevels < 1)
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);
}
}
if (entityStorageComp != null && EntityStorage.Insert(ent, uid, entityStorageComp))
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;
- 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);
}
}
using Content.Server.Administration;
using Content.Server.Cargo.Systems;
using Content.Server.EUI;
+using Content.Server.Item;
using Content.Shared.Administration;
+using Content.Shared.Item;
using Content.Shared.Materials;
using Content.Shared.Research.Prototypes;
using Content.Shared.UserInterface;
public string Command => "showvalues";
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)
{
if (shell.Player is not { } pSession)
case "melee":
message = GetMelee();
break;
+ case "itemsize":
+ message = GetItem();
+ break;
default:
shell.WriteError(Loc.GetString("stat-values-invalid", ("arg", args[0])));
return;
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()
{
var values = new List<string[]>();
{
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(uid, out ItemComponent? item))
{
- _item.SetSize(uid, 9999, item);
+ _item.SetSize(uid, ItemSize.Huge, item);
}
if (comp.IsSharp)
if (slotDefinition.DependsOn != null && !TryGetSlotEntity(target, slotDefinition.DependsOn, out _, inventory))
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
|| clothing != null && !clothing.Slots.HasFlag(slotDefinition.SlotFlags) && !fittingInPocket)
{
[Access(typeof(SharedItemSystem))]
public sealed partial class ItemComponent : Component
{
- [ViewVariables(VVAccess.ReadWrite)]
- [DataField("size")]
- [Access(typeof(SharedItemSystem), Other = AccessPermissions.ReadExecute)]
- public int Size = 5;
+ [DataField, ViewVariables(VVAccess.ReadWrite)]
+ [Access(typeof(SharedItemSystem))]
+ public ItemSize Size = ItemSize.Small;
[Access(typeof(SharedItemSystem))]
- [DataField("inhandVisuals")]
+ [DataField]
public Dictionary<HandLocation, List<PrototypeLayerData>> InhandVisuals = new();
[Access(typeof(SharedItemSystem))]
[ViewVariables(VVAccess.ReadWrite)]
- [DataField("heldPrefix")]
+ [DataField]
public string? HeldPrefix;
/// <summary>
[Serializable, NetSerializable]
public sealed class ItemComponentState : ComponentState
{
- public int Size { get; }
+ public ItemSize Size { get; }
public string? HeldPrefix { get; }
- public ItemComponentState(int size, string? heldPrefix)
+ public ItemComponentState(ItemSize size, string? heldPrefix)
{
Size = size;
HeldPrefix = heldPrefix;
}
/// <summary>
-/// Reference sizes for common containers and items.
+/// Abstracted sizes for items.
+/// Used to determine what can fit into inventories.
/// </summary>
-public enum ReferenceSizes
+public enum ItemSize
{
- Wallet = 4,
- Pocket = 12,
- Box = 24,
- Belt = 30,
- Toolbox = 60,
- Backpack = 100,
- NoStoring = 9999
+ /// <summary>
+ /// Items that can be held completely in one's hand.
+ /// </summary>
+ Tiny = 1,
+
+ /// <summary>
+ /// 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
}
+using Content.Shared.Item;
using Robust.Shared.Audio;
using Robust.Shared.GameStates;
[ViewVariables(VVAccess.ReadWrite)]
[DataField("offSize")]
- public int OffSize = 1;
+ public ItemSize OffSize = ItemSize.Small;
[ViewVariables(VVAccess.ReadWrite)]
[DataField("onSize")]
- public int OnSize = 9999;
+ public ItemSize OnSize = ItemSize.Huge;
}
[ByRefEvent]
-using Content.Shared.CombatMode;
using Content.Shared.Hands.EntitySystems;
using Content.Shared.Interaction;
using Content.Shared.Stacks;
using Content.Shared.Verbs;
using Content.Shared.Examine;
+using JetBrains.Annotations;
using Robust.Shared.Containers;
using Robust.Shared.GameStates;
-using Robust.Shared.Prototypes;
using Robust.Shared.Utility;
namespace Content.Shared.Item;
public abstract class SharedItemSystem : EntitySystem
{
- [Dependency] private readonly IPrototypeManager _prototype = default!;
[Dependency] private readonly SharedHandsSystem _handsSystem = default!;
- [Dependency] private readonly SharedCombatModeSystem _combatMode = default!;
[Dependency] protected readonly SharedContainerSystem Container = default!;
public override void Initialize()
#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))
return;
component.Size = size;
- Dirty(component);
+ Dirty(uid, component);
}
public void SetHeldPrefix(EntityUid uid, string? heldPrefix, ItemComponent? component = null)
return;
component.HeldPrefix = heldPrefix;
- Dirty(component);
+ Dirty(uid, component);
VisualsChanged(uid);
}
item.InhandVisuals = otherItem.InhandVisuals;
item.HeldPrefix = otherItem.HeldPrefix;
- Dirty(item);
+ Dirty(uid, item);
VisualsChanged(uid);
}
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 OnExamine(EntityUid uid, ItemComponent component, ExaminedEvent args)
{
args.PushMarkup(Loc.GetString("item-component-on-examine-size",
- ("size", component.Size)));
+ ("size", GetItemSizeLocale(component.Size))));
}
/// <summary>
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;
+ }
}
using Content.Server.Storage.Components;
-using Content.Shared.Hands;
using Content.Shared.Inventory;
-using Content.Shared.Stacks;
using Robust.Shared.Map;
using Robust.Shared.Physics.Components;
-using Robust.Shared.Player;
using Robust.Shared.Timing;
namespace Content.Shared.Storage.EntitySystems;
comp.NextScan += ScanDelay;
// No space
- if (storage.StorageUsed >= storage.StorageCapacityMax)
+ if (!_storage.HasSpace((uid, storage)))
continue;
if (!_inventory.TryGetContainingSlot(uid, out var slotDef))
+using System.Diagnostics.CodeAnalysis;
using System.Linq;
using Content.Shared.ActionBlocker;
using Content.Shared.CombatMode;
using Content.Shared.Containers.ItemSlots;
using Content.Shared.Destructible;
using Content.Shared.DoAfter;
-using Content.Shared.Hands;
+using Content.Shared.FixedPoint;
using Content.Shared.Hands.Components;
using Content.Shared.Hands.EntitySystems;
using Content.Shared.Implants.Components;
private EntityQuery<StackComponent> _stackQuery;
private EntityQuery<TransformComponent> _xformQuery;
+ public const ItemSize DefaultStorageMaxItemSize = ItemSize.Normal;
+
/// <inheritdoc />
public override void Initialize()
{
{
// TODO: I had this.
// We can get states being applied before the container is ready.
+ // ReSharper disable once ConditionIsAlwaysTrueOrFalseAccordingToNullableAPIContract
if (component.Container == default)
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;
_transform
);
- if (PlayerInsertEntityInWorld(uid, args.User, target, storageComp))
+ if (PlayerInsertEntityInWorld((uid, storageComp), args.User, target))
{
RaiseNetworkEvent(new AnimateInsertingEntitiesEvent(GetNetEntity(uid),
new List<NetEntity> { GetNetEntity(target) },
var angle = targetXform.LocalRotation;
- if (PlayerInsertEntityInWorld(uid, args.Args.User, entity, component))
+ if (PlayerInsertEntityInWorld((uid, component), args.Args.User, entity))
{
successfullyInserted.Add(entity);
successfullyInsertedPositions.Add(position);
/// </summary>
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;
var entity = GetEntity(args.InteractedItemUID);
public void RecalculateStorageUsed(EntityUid uid, StorageComponent storageComp)
{
- storageComp.StorageUsed = 0;
-
- foreach (var entity in storageComp.Container.ContainedEntities)
+ if (storageComp.MaxSlots == null)
{
- if (!_itemQuery.TryGetComponent(entity, out var itemComp))
- continue;
-
- var size = itemComp.Size;
- storageComp.StorageUsed += size;
+ _appearance.SetData(uid, StorageVisuals.StorageUsed, GetCumulativeItemSizes(uid, storageComp));
+ _appearance.SetData(uid, StorageVisuals.Capacity, storageComp.MaxTotalWeight);
+ }
+ else
+ {
+ _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>
/// Verifies if an entity can be stored and if it fits
/// </summary>
/// <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="storageComp"></param>
+ /// <param name="item"></param>
/// <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;
return false;
}
- if (TryComp(insertEnt, out TransformComponent? transformComp) && transformComp.Anchored)
+ if (Transform(insertEnt).Anchored)
{
reason = "comp-storage-anchored-failure";
return false;
return false;
}
- if (TryComp(insertEnt, out StorageComponent? storage) &&
- storage.StorageCapacityMax >= storageComp.StorageCapacityMax)
+ if (item.Size > GetMaxItemSize((uid, storageComp)))
{
- reason = "comp-storage-insufficient-capacity";
+ reason = "comp-storage-too-big";
+ return false;
+ }
+
+ if (TryComp<StorageComponent>(insertEnt, out var insertStorage)
+ && GetMaxItemSize((insertEnt, insertStorage)) >= GetMaxItemSize((uid, storageComp)))
+ {
+ reason = "comp-storage-too-big";
return false;
}
- if (TryComp(insertEnt, out ItemComponent? itemComp) &&
- itemComp.Size > storageComp.StorageCapacityMax - storageComp.StorageUsed)
+ 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";
return false;
/// 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, 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;
+ 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;
/*
if (insertStack.Count > 0)
{
// Try to insert it as a new stack.
- if (TryComp(insertEnt, out ItemComponent? itemComp) &&
- itemComp.Size > storageComp.StorageCapacityMax - storageComp.StorageUsed ||
+ if (!CanInsert(uid, insertEnt, out _, storageComp) ||
!storageComp.Container.Insert(insertEnt))
{
// If we also didn't do any stack fills above then just end
/// <summary>
/// Inserts an entity into storage from the player's active hand
/// </summary>
+ /// <param name="uid"></param>
/// <param name="player">The player to insert an entity from</param>
+ /// <param name="storageComp"></param>
/// <returns>true if inserted, false otherwise</returns>
public bool PlayerInsertHeldEntity(EntityUid uid, EntityUid player, StorageComponent? storageComp = null)
{
return false;
}
- return PlayerInsertEntityInWorld(uid, player, toInsert.Value, storageComp);
+ return PlayerInsertEntityInWorld((uid, storageComp), player, toInsert.Value);
}
/// <summary>
/// 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>
+ /// <param name="uid"></param>
/// <param name="player">The player to insert an entity with</param>
+ /// <param name="toInsert"></param>
/// <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;
- 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);
return false;
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>
/// Plays a clientside pickup animation for the specified uid.
/// </summary>
+using Content.Shared.Item;
+using Content.Shared.Storage.EntitySystems;
using Content.Shared.Whitelist;
using Robust.Shared.Audio;
using Robust.Shared.Containers;
[ViewVariables]
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.
[DataField("quickInsert")]
public bool QuickInsert; // Can insert storables by "attacking" them with the storage entity
[DataField("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>
/// Sound played whenever an entity is inserted into storage.
/// </summary>
stat-lathe-id = ID
stat-lathe-cost = Cost
stat-lathe-sell = Sell price
+
+# Item Sizes
+stat-item-values = Item sizes
+stat-item-id = ID
+stat-item-price = Size
comp-storage-no-item-size = N/A
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-anchored-failure = Can't insert an anchored item.
comp-storage-cant-drop = You can't let go of { THE($entity) }!
comp-storage-window-title = Storage Item
-comp-storage-window-volume = Items: { $itemCount }, Stored: { $usedVolume }/{ $maxVolume }
-comp-storage-window-volume-unlimited = Items: { $itemCount }
+comp-storage-window-weight = { $weight }/{ $maxWeight }, Max Size: {$size}
+comp-storage-window-slots = Slots: { $itemCount }/{ $maxCount }, Max Size: {$size}
pick-up-verb-get-data-text-inventory = Put in hand
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
pos: -0.5,0.5
parent: 325
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
entities:
- uid: 40
ents:
- 245
type: ContainerContainer
-- proto: Crowbar
- entities:
- - uid: 313
- components:
- - flags: InContainer
- type: MetaData
- - parent: 177
- type: Transform
- - canCollide: False
- type: Physics
- proto: CyberPen
entities:
- uid: 77
pos: -2.5,-3.5
parent: 325
type: Transform
-- proto: Multitool
- entities:
- - uid: 314
- components:
- - flags: InContainer
- type: MetaData
- - parent: 177
- type: Transform
- - canCollide: False
- type: Physics
- proto: NitrogenTankFilled
entities:
- uid: 105
type: Transform
- canCollide: False
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
entities:
- uid: 244
- pos: 1.5699697,-0.44908836
parent: 325
type: Transform
- - containers:
- storagebase: !type:Container
- showEnts: False
- occludes: True
- ents:
- - 310
- - 311
- - 312
- - 313
- - 314
- - 315
- - 316
- - 317
- - 318
- type: ContainerContainer
- canCollide: False
type: Physics
- proto: ToyFigurineNukie
- pos: -2.5,2.5
parent: 325
type: Transform
-- proto: Welder
- entities:
- - uid: 312
- components:
- - flags: InContainer
- type: MetaData
- - parent: 177
- type: Transform
- - canCollide: False
- type: Physics
- proto: WindoorSecure
entities:
- uid: 166
ents:
- 346
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
entities:
- uid: 167
type: Transform
- count: 15
type: Stack
- - size: 15
- type: Item
- proto: SheetPlasma
entities:
- uid: 12944
type: Transform
- count: 20
type: Stack
- - size: 20
- type: Item
- proto: Shovel
entities:
- uid: 12955
type: Transform
- count: 15
type: Stack
- - size: 30
- type: Item
- proto: StoolBar
entities:
- uid: 921
- id: trayScanner
- id: RCD
- id: RCDAmmo
- - id: RCDAmmo
- - id: RCDAmmo
+ amount: 2
- id: CableMVStack
- id: CableHVStack
- id: CableApcStack
name: surgical duffel bag
description: "A large duffel bag for holding extra medical supplies - this one seems to be designed for holding surgical tools."
components:
- - type: StorageFill
- contents:
- - id: Hemostat
- - id: Saw
- - id: Drill
- - id: Cautery
- - id: Retractor
- - id: Scalpel
+ - type: StorageFill
+ contents:
+ - id: Hemostat
+ - id: Saw
+ - id: Drill
+ - id: Cautery
+ - id: Retractor
+ - id: Scalpel
- type: entity
id: ClothingBackpackDuffelCBURNFilled
parent: ClothingBackpackDuffelCBURN
suffix: Filled
components:
- - type: StorageFill
- contents:
- - id: BoxSurvivalEngineering
- - id: WeaponShotgunDoubleBarreled
- - id: BoxShotgunIncendiary
- amount: 2
- - id: GrenadeFlashBang
- amount: 2
- - id: PillAmbuzolPlus
- - id: PillAmbuzol
- amount: 4
+ - type: StorageFill
+ contents:
+ - id: BoxSurvivalEngineering
+ - id: WeaponShotgunDoubleBarreled
+ - id: BoxShotgunIncendiary
+ amount: 2
+ - id: GrenadeFlashBang
+ amount: 2
+ - id: PillAmbuzolPlus
+ - id: PillAmbuzol
+ amount: 4
- type: entity
parent: ClothingBackpackDuffelSyndicateMedicalBundle
name: syndicate surgical duffel bag
description: A large duffel bag containing a full suite of surgical tools.
components:
- - type: StorageFill
- contents:
- - id: Hemostat
- - id: SawAdvanced
- - id: Drill
- - id: Cautery
- - id: Retractor
- - id: ScalpelAdvanced
+ - type: StorageFill
+ contents:
+ - id: Hemostat
+ - id: SawAdvanced
+ - id: Drill
+ - id: Cautery
+ - id: Retractor
+ - id: ScalpelAdvanced
- type: entity
parent: ClothingBackpackDuffelSyndicateBundle
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.
components:
- - type: StorageFill
- contents:
- - id: WeaponShotgunBulldog
- - id: MagazineShotgun
- - id: MagazineShotgun
- - id: MagazineShotgunBeanbag
+ - type: StorageFill
+ contents:
+ - id: WeaponShotgunBulldog
+ - id: MagazineShotgun
+ - id: MagazineShotgun
+ - id: MagazineShotgunBeanbag
# - id: ThermalImagingGoggles
- type: entity
name: C-20r bundle
description: "Old faithful: The classic C-20r Submachine Gun, bundled with three magazines." #, and a Suppressor.
components:
- - type: StorageFill
- contents:
- - id: WeaponSubMachineGunC20r
- - id: MagazinePistolSubMachineGun
- amount: 2
+ - type: StorageFill
+ contents:
+ - id: WeaponSubMachineGunC20r
+ - id: MagazinePistolSubMachineGun
+ amount: 2
# - id: SMGSuppressor
- type: entity
name: Python bundle
description: "Go loud and proud with a fully loaded Magnum Python, bundled with two speed loaders."
components:
- - type: StorageFill
- contents:
- - id: WeaponRevolverPythonAP
- - id: SpeedLoaderMagnumAP
- amount: 2
+ - type: StorageFill
+ contents:
+ - id: WeaponRevolverPythonAP
+ - id: SpeedLoaderMagnumAP
+ amount: 2
- type: entity
parent: ClothingBackpackDuffelSyndicateBundle
name: L6 Saw bundle
description: "More dakka: The iconic L6 lightmachinegun, bundled with 2 box magazines."
components:
- - type: StorageFill
- contents:
- - id: WeaponLightMachineGunL6
- - id: MagazineLightRifleBox
+ - type: StorageFill
+ contents:
+ - id: WeaponLightMachineGunL6
+ - id: MagazineLightRifleBox
- type: entity
parent: ClothingBackpackDuffelSyndicateBundle
name: China-Lake bundle
description: "An old China-Lake grenade launcher bundled with 11 rounds of various destruction capability."
components:
- - type: StorageFill
- contents:
- - id: WeaponLauncherChinaLake
- - id: GrenadeBlast
- amount: 4
- - id: GrenadeFrag
- amount: 4
+ - type: StorageFill
+ contents:
+ - id: WeaponLauncherChinaLake
+ - id: GrenadeBlast
+ amount: 4
+ - id: GrenadeFrag
+ amount: 4
- type: entity
parent: ClothingBackpackDuffelSyndicateBundle
name: M-90gl bundle
description: "A versatile battle rifle with an attached grenade launcher, bundled with 3 magazines and 6 grenades of various capabilities."
components:
- - type: StorageFill
- contents:
- - id: WeaponRifleM90GrenadeLauncher
- - id: MagazineRifle
- amount: 2
- - id: GrenadeBlast
- amount: 2
- - id: GrenadeFlash
- amount: 2
- - id: GrenadeFrag
- amount: 2
+ - type: StorageFill
+ contents:
+ - id: WeaponRifleM90GrenadeLauncher
+ - id: MagazineRifle
+ amount: 2
+ - id: GrenadeBlast
+ amount: 2
+ - id: GrenadeFlash
+ amount: 2
+ - id: GrenadeFrag
+ amount: 2
- type: entity
parent: ClothingBackpackDuffelSyndicateAmmo
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."
components:
- - type: StorageFill
- contents:
- - id: MagazinePistolSubMachineGun
- amount: 4
- - id: MagazineShotgun
- amount: 4
- - id: MagazineLightRifleBox
- amount: 2
+ - type: StorageFill
+ contents:
+ - id: MagazinePistolSubMachineGun
+ amount: 4
+ - id: MagazineShotgun
+ amount: 4
+ - id: MagazineLightRifleBox
+ amount: 2
- type: entity
parent: ClothingBackpackDuffel
description: "Contains a full CentCom Official uniform set, headset and clipboard included. Encryption keys and ID access are not included."
suffix: DO NOT MAP
components:
- - type: Tag
- tags: [] # ignore "WhitelistChameleon" tag
- - type: StorageFill
- contents:
- - id: ClothingHeadHatCentcom
- - id: ClothingEyesGlassesSunglasses
- - id: ClothingUniformJumpsuitCentcomOfficial
- - id: ClothingShoesBootsJack
- - id: ClothingHandsGlovesColorBlack
- - id: ClothingHeadsetAltCentComFake
- - id: ClothingOuterArmorBasic
- - id: Paper
- - id: Pen
- - id: CentcomPDAFake
+ - type: Tag
+ tags: [] # ignore "WhitelistChameleon" tag
+ - type: StorageFill
+ contents:
+ - id: ClothingHeadHatCentcom
+ - id: ClothingEyesGlassesSunglasses
+ - id: ClothingUniformJumpsuitCentcomOfficial
+ - id: ClothingShoesBootsJack
+ - id: ClothingHandsGlovesColorBlack
+ - id: ClothingHeadsetAltCentComFake
+ - id: ClothingOuterArmorBasic
+ - id: Paper
+ - id: Pen
+ - id: CentcomPDAFake
- type: entity
parent: ClothingBackpackDuffelClown
id: ClothingBackpackDuffelSyndicateCostumeClown
suffix: syndicate
components:
- - type: Tag
- tags: [] # ignore "WhitelistChameleon" tag
- - type: StorageFill
- contents:
- - id: ClothingUniformJumpsuitClown
- - id: ClothingShoesClown
- - id: ClothingMaskClown
- - id: BikeHorn
- - id: ClownPDA
- - id: ClothingHeadsetService
+ - type: Tag
+ tags: [] # ignore "WhitelistChameleon" tag
+ - type: StorageFill
+ contents:
+ - id: ClothingUniformJumpsuitClown
+ - id: ClothingShoesClown
+ - id: ClothingMaskClown
+ - id: BikeHorn
+ - id: ClownPDA
+ - id: ClothingHeadsetService
- type: entity
parent: ClothingBackpackDuffelSyndicateBundle
name: carp suit duffel bag
description: Contains a carp suit and some friends to play with.
components:
- - type: StorageFill
- contents:
- - id: ClothingOuterSuitCarp
- - id: PlushieCarp
- amount: 6
+ - type: StorageFill
+ contents:
+ - id: ClothingOuterSuitCarp
+ - id: PlushieCarp
+ amount: 6
- type: entity
parent: ClothingBackpackDuffelSyndicateBundle
name: syndicate pyjama duffel bag
description: Contains 3 pairs of syndicate pyjamas and 3 plushies for the ultimate sleepover.
components:
- - type: StorageFill
- contents:
- - id: ClothingUniformJumpsuitPyjamaSyndicateRed
- - id: ClothingUniformJumpsuitPyjamaSyndicateBlack
- - id: ClothingUniformJumpsuitPyjamaSyndicatePink
- - id: ClothingHeadPyjamaSyndicateRed
- - id: ClothingHeadPyjamaSyndicateBlack
- - id: ClothingHeadPyjamaSyndicatePink
- - id: ClothingShoesSlippers
- amount: 3
- - id: BedsheetSyndie
- amount: 3
- - id: PlushieCarp
- - id: PlushieNuke
- - id: PlushieLizard
- - id: PlushieSharkBlue
+ - type: Storage
+ maxTotalWeight: 44
+ - type: StorageFill
+ contents:
+ - id: ClothingUniformJumpsuitPyjamaSyndicateRed
+ - id: ClothingUniformJumpsuitPyjamaSyndicateBlack
+ - id: ClothingUniformJumpsuitPyjamaSyndicatePink
+ - id: ClothingHeadPyjamaSyndicateRed
+ - id: ClothingHeadPyjamaSyndicateBlack
+ - id: ClothingHeadPyjamaSyndicatePink
+ - id: ClothingShoesSlippers
+ amount: 3
+ - id: BedsheetSyndie
+ amount: 3
+ - id: PlushieCarp
+ - id: PlushieNuke
+ - id: PlushieLizard
+ - id: PlushieSharkBlue
- type: entity
parent: ClothingBackpackDuffelSyndicateBundle
name: syndicate EVA bundle
description: "Contains the Syndicate approved EVA suit."
components:
- - type: StorageFill
- contents:
- - id: ClothingHeadHelmetSyndicate
- - id: ClothingOuterHardsuitSyndicate
- - id: ClothingMaskGasSyndicate
- - id: DoubleEmergencyOxygenTankFilled
+ - type: StorageFill
+ contents:
+ - id: ClothingHeadHelmetSyndicate
+ - id: ClothingOuterHardsuitSyndicate
+ - id: ClothingMaskGasSyndicate
+ - id: DoubleEmergencyOxygenTankFilled
- type: entity
parent: ClothingBackpackDuffelSyndicateBundle
name: syndicate hardsuit bundle
description: "Contains the Syndicate's signature blood red hardsuit."
components:
- - type: StorageFill
- contents:
- - id: ClothingOuterHardsuitSyndie
- - id: ClothingMaskGasSyndicate
- - id: ClothingHandsGlovesCombat
+ - type: Storage
+ maxItemSize: Huge
+ whitelist: #to snub 'dem metagamers
+ components:
+ - Clothing
+ - type: StorageFill
+ contents:
+ - id: ClothingOuterHardsuitSyndie
+ - id: ClothingMaskGasSyndicate
+ - id: ClothingHandsGlovesCombat
- type: entity
parent: ClothingBackpackDuffelSyndicateBundle
name: syndicate zombie bundle
description: "An all-in-one kit for unleashing the undead upon a station."
components:
- - type: StorageFill
- contents:
- - id: SyringeRomerol
- - id: WeaponRevolverPython
- - id: MagazineBoxMagnumIncendiary
- - id: PillAmbuzolPlus
- - id: PillAmbuzol
- amount: 3
+ - type: StorageFill
+ contents:
+ - id: SyringeRomerol
+ - id: WeaponRevolverPython
+ - id: MagazineBoxMagnumIncendiary
+ - id: PillAmbuzolPlus
+ - id: PillAmbuzol
+ amount: 3
- type: entity
parent: ClothingBackpackDuffelSyndicateBundle
id: ClothingBackpackDuffelSyndicateOperative
name: operative duffelbag
components:
- - type: StorageFill
- contents:
- - id: BoxSurvivalSyndicate
- - id: WeaponPistolViper
- - id: PinpointerNuclear
- - id: MicroBombImplanter
+ - type: StorageFill
+ contents:
+ - id: BoxSurvivalSyndicate
+ - id: WeaponPistolViper
+ - id: PinpointerNuclear
+ - id: MicroBombImplanter
- type: entity
name: operative medic duffelbag
description: A large duffel bag for holding extra medical supplies.
components:
- - type: StorageFill
- contents:
- - id: BoxSurvivalSyndicate
- - id: SawAdvanced
- - id: Cautery
- - id: CombatKnife
- - id: WeaponPistolViper
- - id: PinpointerNuclear
- - id: HandheldHealthAnalyzer
- - id: CombatMedipen
- - id: MicroBombImplanter
- - id: SyndiHypo
+ - type: StorageFill
+ contents:
+ - id: BoxSurvivalSyndicate
+ - id: SawAdvanced
+ - id: Cautery
+ - id: CombatKnife
+ - id: WeaponPistolViper
+ - id: PinpointerNuclear
+ - id: HandheldHealthAnalyzer
+ - id: CombatMedipen
+ - id: MicroBombImplanter
- type: entity
parent: ClothingBackpackDuffelSyndicateMedicalBundle
name: medical bundle
description: "All you need to get your comrades back in the fight."
components:
- - type: StorageFill
- contents:
- - id: MedkitCombatFilled
- - id: Defibrillator
- - id: CombatMedipen
- amount: 3
- - id: ClothingHandsGlovesLatex
- - id: SyringeTranexamicAcid
- - id: SyringeHyronalin
+ - type: StorageFill
+ contents:
+ - id: MedkitCombatFilled
+ - id: Defibrillator
+ - id: CombatMedipen
+ amount: 3
+ - id: ClothingHandsGlovesLatex
+ - id: SyringeTranexamicAcid
+ - id: SyringeHyronalin
containers:
ballistic-ammo: !type:Container
- type: Item
- size: 30
+ size: Normal
- type: Sprite
sprite: Objects/Storage/boxes.rsi
- state: box
- state: light
- type: Storage
- capacity: 60
+ maxTotalWeight: 24
whitelist:
components:
- LightBulb
- state: box
- state: lighttube
- type: Storage
- capacity: 60
+ maxTotalWeight: 24
whitelist:
components:
- LightBulb
- state: box
- state: lightmixed
- type: Storage
- capacity: 60
+ maxTotalWeight: 24
whitelist:
components:
- LightBulb
layers:
- state: box
- state: pda
- - type: Storage
- capacity: 60
- whitelist:
- components:
- - Pda
- type: entity
name: ID card box
layers:
- state: box
- state: pda
- - type: Storage
- capacity: 60
- whitelist:
- components:
- - IdCard
- type: entity
name: headset box
layers:
- state: box
- state: headset
- - type: Storage
- capacity: 60
- whitelist:
- components:
- - Headset
- type: entity
name: meson box
id: BoxHugHealing
description: A special box for sensitive people.
components:
- - type: Storage
- capacity: 30
- type: Sprite
layers:
- state: box_hug
id: BoxPerformer
description: Happy Hatsune Miku Day!
components:
+ - type: Storage
+ maxItemSize: Normal
+ whitelist:
+ components:
+ - Clothing
+ - Food
- type: StorageFill
contents:
- id: ClothingShoesBootsPerformer
- id: TrashBag
amount: 6
- type: Storage
- capacity: 800
+ maxTotalWeight: 24
+ maxItemSize: Normal
whitelist:
tags:
- TrashBag
- state: box
- state: encryptokey
- type: Storage
- capacity: 30
whitelist:
components:
- EncryptionKey
description: Two syndicate encryption keys for the price of one. Miniaturized for ease of use.
components:
- type: Item
- size: 15
+ size: Normal
- type: StorageFill
contents:
- id: EncryptionKeySyndie
amount: 2
- type: Storage
- capacity: 15
- type: entity
name: deathrattle implant box
description: Six deathrattle implants and handheld GPS devices for the whole squad.
components:
- type: Item
- size: 60
+ size: Normal
- type: StorageFill
contents:
- id: DeathRattleImplanter
- id: HandheldGPSBasic
amount: 6
- type: Storage
- capacity: 60
+ maxTotalWeight: 24
- type: Sprite
layers:
- state: box
description: This box filled with colorful darts.
components:
- type: Item
- size: 40
+ size: Normal
- type: StorageFill
contents:
- id: Dart
- amount: 5
+ amount: 3
- id: DartBlue
- amount: 5
+ amount: 3
- id: DartPurple
- amount: 5
+ amount: 3
- id: DartYellow
- amount: 5
+ amount: 3
- type: Storage
- capacity: 40
+ maxTotalWeight: 24
- type: Sprite
layers:
- state: box
- - state: darts
\ No newline at end of file
+ - state: darts
parent: BoxCardboard
id: BoxMouthSwab
components:
+ - type: Storage
+ maxTotalWeight: 20
- type: StorageFill
contents:
- id: DiseaseSwab
- amount: 30
+ amount: 10
- type: Sprite
layers:
- state: box
id: BoxZiptie
description: A box full of zipties.
components:
+ - type: Storage
+ maxTotalWeight: 20
+ whitelist:
+ components:
+ - Handcuff
- type: StorageFill
contents:
- id: Zipties
id: BoxForensicPad
description: A box of forensic pads.
components:
+ - type: Storage
+ maxTotalWeight: 20
- type: StorageFill
contents:
- id: ForensicPad
- id: TargetDarts
amount: 1
- id: BoxDarts
- amount: 1
+ amount: 2
- id: BoxDarts
amount: 1
prob: 0.05
-
+
- type: StorageFill
contents:
- id: Brutepack
- amount: 1
- id: Ointment
- amount: 1
- id: Bloodpack
- amount: 1
- id: Gauze
- id: EmergencyMedipen #You never know what people are going to latejoin into
- amount: 6
+ amount: 3
- type: entity
id: ClothingBeltPlantFilled
name: grenadier chest rig
suffix: Filled
components:
+ - type: Item
+ size: Large
+ - type: Storage
+ maxSlots: 8
- type: StorageFill
contents:
- id: ExGrenade
parent: BriefcaseSyndie
suffix: SniperBundle
components:
+ - type: Item
+ size: Huge
+ - type: Storage
+ maxItemSize: Large
- type: StorageFill
contents:
- id: WeaponSniperHristov
- id: Ointment
amount: 2
- id: Gauze
- - id: PillTricordrazine
- amount: 5
+ - id: PillCanisterTricordrazine
# see https://github.com/tgstation/blob/master/code/game/objects/items/storage/firstaid.dm for example contents
- type: entity
- id: Ointment
amount: 2
- id: SyringeSigynate
- - id: PillKelotane
- amount: 5
- - id: PillDermaline
- amount: 5
+ - id: PillCanisterKelotane
+ - id: PillCanisterDermaline
- type: entity
id: MedkitBruteFilled
- id: Gauze
- id: Bloodpack
- id: SyringeTranexamicAcid
- - id: PillIron
- amount: 5
- - id: PillBicaridine
- amount: 5
+ - id: PillCanisterIron
+ - id: PillCanisterBicaridine
- type: entity
id: MedkitToxinFilled
- id: SyringeIpecac
- id: SyringeEthylredoxrazine
- id: AntiPoisonMedipen
- - id: PillDylovene
- amount: 5
- - id: PillCharcoal
- amount: 3
+ - id: PillCanisterDylovene
+ - id: PillCanisterCharcoal
- type: entity
id: MedkitOxygenFilled
- id: EmergencyOxygenTankFilled
- id: EmergencyMedipen
- id: SyringeInaprovaline
- - id: PillDexalin
- amount: 7
+ - id: PillCanisterDexalin
- type: entity
id: MedkitRadiationFilled
amount: 1
- id: EmergencyMedipen
amount: 1
- - id: PillHyronalin
- amount: 5
+ - id: PillCanisterHyronalin
- type: entity
id: MedkitAdvancedFilled
- id: MedicatedSuture
- id: RegenerativeMesh
- id: SyringeEphedrine
- - id: SyringeSaline
- id: BruteAutoInjector
- id: BurnAutoInjector
- id: EmergencyMedipen
- - id: Bloodpack
- type: entity
id: StimkitFilled
suffix: Filled
parent: ToolboxSyndicate
components:
+ - type: Storage
+ maxSlots: 8
- type: StorageFill
contents:
- - id: ClothingBeltUtilityEngineering
+ - id: Crowbar
+ - id: Wrench
+ - id: Screwdriver
+ - id: Wirecutter
+ - id: Welder
+ - id: Multitool
- id: ClothingHandsGlovesCombat
- id: ClothingMaskGasSyndicate
sprite: Clothing/Back/Backpacks/backpack.rsi
state: icon
- type: Item
- size: 9999
+ size: Large
- type: Clothing
quickEquip: false
slots:
- back
- type: Storage
- capacity: 100
+ maxItemSize: Large
+ maxTotalWeight: 28
- type: ContainerContainer
containers:
storagebase: !type:Container
- type: Sprite
sprite: Clothing/Back/Backpacks/ertleader.rsi
- type: Storage
- capacity: 250
+ maxTotalWeight: 44
- type: entity
parent: ClothingBackpackERTLeader
shader: unshaded
- type: Clothing
equippedPrefix: holding
+ - type: Item
+ size: Ginormous
- type: Storage
- capacity: 9999
+ maxItemSize: Large
+ maxTotalWeight: 56 #14 normal-sized items.
- type: entity
parent: ClothingBackpackClown
name: duffel bag
description: A large duffel bag for holding extra things.
components:
- - type: Sprite
- sprite: Clothing/Back/Duffels/duffel.rsi
- - type: Storage
- capacity: 120
- - type: ClothingSpeedModifier
- walkModifier: 1
- sprintModifier: 0.9
+ - type: Sprite
+ sprite: Clothing/Back/Duffels/duffel.rsi
+ - type: Storage
+ maxItemSize: Large
+ maxTotalWeight: 40
+ - type: ClothingSpeedModifier
+ walkModifier: 1
+ sprintModifier: 0.9
- type: entity
parent: ClothingBackpackDuffel
name: engineering duffel bag
description: A large duffel bag for holding extra tools and supplies.
components:
- - type: Sprite
- sprite: Clothing/Back/Duffels/engineering.rsi
+ - type: Sprite
+ sprite: Clothing/Back/Duffels/engineering.rsi
- type: entity
parent: ClothingBackpackDuffel
name: atmospherics duffel bag
description: A large duffel bag made of fire resistant fibers. Smells like plasma.
components:
- - type: Sprite
- sprite: Clothing/Back/Duffels/atmospherics.rsi
+ - type: Sprite
+ sprite: Clothing/Back/Duffels/atmospherics.rsi
- type: entity
parent: ClothingBackpackDuffel
name: medical duffel bag
description: A large duffel bag for holding extra medical supplies.
components:
- - type: Sprite
- sprite: Clothing/Back/Duffels/medical.rsi
+ - type: Sprite
+ sprite: Clothing/Back/Duffels/medical.rsi
- type: entity
parent: ClothingBackpackDuffel
name: captain's duffel bag
description: A large duffel bag for holding extra captainly goods.
components:
- - type: Sprite
- sprite: Clothing/Back/Duffels/captain.rsi
+ - type: Sprite
+ sprite: Clothing/Back/Duffels/captain.rsi
- type: entity
parent: ClothingBackpackDuffel
name: clown duffel bag
description: A large duffel bag for holding extra honk goods.
components:
- - type: Sprite
- sprite: Clothing/Back/Duffels/clown.rsi
- - type: Storage
- storageOpenSound:
- collection: BikeHorn
+ - type: Sprite
+ sprite: Clothing/Back/Duffels/clown.rsi
+ - type: Storage
+ storageOpenSound:
+ collection: BikeHorn
- type: entity
parent: ClothingBackpackDuffel
name: security duffel bag
description: A large duffel bag for holding extra security related goods.
components:
- - type: Sprite
- sprite: Clothing/Back/Duffels/security.rsi
+ - type: Sprite
+ sprite: Clothing/Back/Duffels/security.rsi
- type: entity
parent: ClothingBackpackDuffel
name: brigmedic duffel bag
description: A large duffel bag for holding extra medical related goods.
components:
- - type: Sprite
- sprite: Clothing/Back/Duffels/brigmedic.rsi
+ - type: Sprite
+ sprite: Clothing/Back/Duffels/brigmedic.rsi
- type: entity
parent: ClothingBackpackDuffel
name: chemistry duffel bag
description: A large duffel bag for holding extra beakers and test tubes.
components:
- - type: Sprite
- sprite: Clothing/Back/Duffels/chemistry.rsi
+ - type: Sprite
+ sprite: Clothing/Back/Duffels/chemistry.rsi
- type: entity
parent: ClothingBackpackDuffel
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.
components:
- - type: Sprite
- sprite: Clothing/Back/Duffels/virology.rsi
+ - type: Sprite
+ sprite: Clothing/Back/Duffels/virology.rsi
- type: entity
parent: ClothingBackpackDuffel
name: genetics duffel bag
description: A large duffel bag for holding extra genetic mutations.
components:
- - type: Sprite
- sprite: Clothing/Back/Duffels/genetics.rsi
+ - type: Sprite
+ sprite: Clothing/Back/Duffels/genetics.rsi
- type: entity
parent: ClothingBackpackDuffel
name: mime duffel bag
description: A large duffel bag for holding... mime... stuff.
components:
- - type: Sprite
- sprite: Clothing/Back/Duffels/mime.rsi
- storageOpenSound:
- collection: null
- storageInsertSound:
- collection: null
+ - type: Sprite
+ sprite: Clothing/Back/Duffels/mime.rsi
+ storageOpenSound:
+ collection: null
+ storageInsertSound:
+ collection: null
- type: entity
parent: ClothingBackpackDuffel
name: science duffel bag
description: A large duffel bag for holding extra science related goods.
components:
- - type: Sprite
- sprite: Clothing/Back/Duffels/science.rsi
+ - type: Sprite
+ sprite: Clothing/Back/Duffels/science.rsi
- type: entity
parent: ClothingBackpackDuffel
name: syndicate duffel bag
description: A large duffel bag for holding various traitor goods.
components:
- - type: Sprite
- sprite: Clothing/Back/Duffels/syndicate.rsi
- - type: Storage
- capacity: 131
+ - type: Sprite
+ sprite: Clothing/Back/Duffels/syndicate.rsi
- type: entity
parent: ClothingBackpackDuffelSyndicate
id: ClothingBackpackDuffelSyndicateBundle
abstract: true
components:
- - type: Tag
- tags: [] # ignore "WhitelistChameleon" tag
+ - type: Tag
+ tags: [] # ignore "WhitelistChameleon" tag
- type: entity
parent: ClothingBackpackDuffelSyndicate
id: ClothingBackpackDuffelSyndicateAmmo
name: syndicate duffel bag
components:
- - type: Sprite
- sprite: Clothing/Back/Duffels/syndicate.rsi
- state: icon-ammo
- - type: Item
- heldPrefix: ammo
- - type: Clothing
- equippedPrefix: ammo
+ - type: Sprite
+ sprite: Clothing/Back/Duffels/syndicate.rsi
+ state: icon-ammo
+ - type: Item
+ heldPrefix: ammo
+ - type: Clothing
+ equippedPrefix: ammo
- type: entity
parent: ClothingBackpackDuffelSyndicateAmmo
id: ClothingBackpackDuffelSyndicateMedical
name: syndicate duffel bag
components:
- - type: Sprite
- sprite: Clothing/Back/Duffels/syndicate.rsi
- state: icon-med
- - type: Item
- heldPrefix: med
- - type: Clothing
- equippedPrefix: med
+ - type: Sprite
+ sprite: Clothing/Back/Duffels/syndicate.rsi
+ state: icon-med
+ - type: Item
+ heldPrefix: med
+ - type: Clothing
+ equippedPrefix: med
- type: entity
parent: ClothingBackpackDuffelSyndicateMedical
name: duffelbag of holding
description: A duffelbag that opens into a localized pocket of bluespace.
components:
- - type: Sprite
- sprite: Clothing/Back/Duffels/holding.rsi
- state: icon
- layers:
- - state: icon
- - state: icon-unlit
- shader: unshaded
- - type: Storage
- capacity: 9999
- - type: ClothingSpeedModifier
- sprintModifier: 1 # makes its stats identical to other variants of bag of holding
+ - type: Sprite
+ sprite: Clothing/Back/Duffels/holding.rsi
+ state: icon
+ layers:
+ - state: icon
+ - state: icon-unlit
+ shader: unshaded
+ - type: Item
+ size: Ginormous
+ - type: Storage
+ 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
parent: ClothingBackpackDuffel
name: CBURN duffel bag
description: A duffel bag containing a variety of biological containment equipment.
components:
- - type: Storage
- capacity: 150
- - type: ClothingSpeedModifier
- walkModifier: 1
- sprintModifier: 1
+ - type: Storage
+ maxItemSize: Large
+ maxTotalWeight: 40
+ - type: ClothingSpeedModifier
+ walkModifier: 1
+ sprintModifier: 1
- state: icon
- state: icon-unlit
shader: unshaded
+ - type: Item
+ size: Ginormous
- type: Storage
- capacity: 9999
+ maxItemSize: Large
+ maxTotalWeight: 56 #14 normal-sized items.
sprite: Clothing/Back/Backpacks/waterbackpack.rsi
state: icon
- type: Item
- size: 200
+ size: Huge
- type: Clothing
slots: BACK
sprite: Clothing/Back/Backpacks/waterbackpack.rsi
- type: Sprite
state: icon
- type: Item
- size: 50
+ size: Normal
- type: Clothing
slots: [belt]
quickEquip: false
id: ClothingBeltStorageBase
components:
- type: Storage
- capacity: 40
+ maxSlots: 7
+ maxItemSize: Normal
+ - type: Item
+ size: Huge
- type: ContainerContainer
containers:
storagebase: !type:Container
- type: Clothing
sprite: Clothing/Belt/utility.rsi
- type: Storage
- capacity: 45
+ maxItemSize: Normal
# TODO: Fill this out more.
whitelist:
tags:
- type: Clothing
sprite: Clothing/Belt/ce.rsi
- type: Storage
- capacity: 105
# TODO: Fill this out more.
whitelist:
tags:
- type: Clothing
sprite: Clothing/Belt/medical.rsi
- type: Storage
- capacity: 60
whitelist:
tags:
- Wrench
- type: Clothing
sprite: Clothing/Belt/sheath.rsi
- type: Storage
- capacity: 15
+ maxSlots: 1
whitelist:
tags:
- CaptainSabre
- type: Clothing
sprite: Clothing/Belt/bandolier.rsi
- type: Item
- size: 60
+ size: Large
- type: Storage
- capacity: 60
whitelist:
tags:
- ShellShotgun
- type: Clothing
sprite: Clothing/Belt/holster.rsi
- type: Storage
- capacity: 20
+ maxSlots: 3
- type: entity
parent: ClothingBeltStorageBase
- type: Clothing
sprite: Clothing/Belt/syndieholster.rsi
- type: Item
- size: 60
+ size: Large
- type: Storage
- capacity: 60
whitelist:
components:
- Gun
- type: Clothing
sprite: Clothing/Belt/militarywebbingmed.rsi
- type: Item
- size: 70
- - type: Storage
- capacity: 70
+ size: Large
- type: entity
parent: ClothingBeltBase
- type: Clothing
sprite: Clothing/Belt/wand.rsi
- type: Storage
- capacity: 120
+ maxSlots: 8
whitelist:
tags:
- WizardWand
visible: false
- type: Clothing
- type: Storage
- capacity: 150
+ maxSlots: 15
+ maxItemSize: Small
whitelist:
tags:
- Arrow
- type: Clothing
sprite: Clothing/Belt/waistbag_leather.rsi
- 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.
#- type: entity
# parent: ClothingBeltStorageWaistbag
# layers:
# - state: "equipped-BELT"
# color: "#bf1313"
-# - state: "equipped-trinkets"
\ No newline at end of file
+# - state: "equipped-trinkets"
keySlots: 4
- type: Sprite
state: icon
+ - type: Item
+ size: Small
- type: Clothing
slots:
- ears
state: icon
- type: Clothing
slots: [eyes]
+ - type: Item
+ size: Small
slots: [gloves]
- type: Food
requiresSpecialDigestion: true
+ - type: Item
+ size: Small
- type: SolutionContainerManager
solutions:
food:
- HEAD
- type: Sprite
state: icon
+ - type: Item
+ size: Small
- type: Food
requiresSpecialDigestion: true
- type: SolutionContainerManager
equippedPrefix: off
- type: Item
heldPrefix: off
+ size: Normal
- type: ToggleableLightVisuals
- type: PointLight
enabled: false
name: base space helmet
components:
- type: Item
- size: 10
+ size: Normal
- type: PressureProtection
highPressureMultiplier: 0.6
lowPressureMultiplier: 1000
- type: GroupExamine
- type: Tag
tags:
- - HidesHair
\ No newline at end of file
+ - HidesHair
- type: Clothing
sprite: Clothing/Head/Hats/chefhat.rsi
- type: Storage
- capacity: 5
+ maxSlots: 1
- type: UserInterface
interfaces:
- key: enum.StorageUiKey.Key
offset: "0, 0.12"
sprite: Clothing/Head/Hats/magician.rsi
- type: Item
- size: 10
+ size: Small
sprite: Clothing/Head/Hats/magician.rsi
- type: Storage
- capacity: 10
+ maxSlots: 1
- type: UserInterface
interfaces:
- key: enum.StorageUiKey.Key
components:
- type: Sprite
state: icon
+ - type: Item
+ size: Small
- type: Clothing
slots: [mask]
id: ClothingNeckBase
components:
- type: Item
- size: 10
+ size: Small
- type: Clothing
quickEquip: true
slots:
description: be nothing do crime
components:
- type: Item
- size: 1
+ size: Tiny
- type: entity
parent: ClothingNeckPinBase
id: ClothingOuterBaseLarge
components:
- type: Item
- size: 80
+ size: Large
- type: Clothing
slots:
- outerClothing
parent: ClothingOuterBase
id: ClothingOuterStorageBase
components:
- - type: Item
- size: 10
- type: Storage
- capacity: 10
+ maxTotalWeight: 6
- type: ContainerContainer
containers:
storagebase: !type:Container
walkModifier: 0.4
sprintModifier: 0.6
- type: Item
- size: 121
+ size: Huge
- type: Armor
modifiers:
coefficients:
walkModifier: 0.8
sprintModifier: 0.8
- type: Item
- size: 80
+ size: Large
- type: entity
parent: ClothingOuterBase
id: ClothingOuterBaseMedium
components:
- type: Item
- size: 30
+ size: Large
- type: Clothing
slots:
- outerClothing
walkModifier: 0.75
sprintModifier: 0.75
- type: Item
- size: 50
+ size: Normal
- type: Tag
tags:
- WhitelistChameleon
- type: Sprite
sprite: Clothing/OuterClothing/Suits/iansuit.rsi
- type: Item
- size: 30
+ size: Normal
- type: Clothing
sprite: Clothing/OuterClothing/Suits/iansuit.rsi
- type: ToggleableClothing
- type: Sprite
sprite: Clothing/OuterClothing/Suits/carpsuit.rsi
- type: Item
- size: 30
+ size: Normal
- type: Clothing
sprite: Clothing/OuterClothing/Suits/carpsuit.rsi
- type: ToggleableClothing
- type: TemperatureProtection\r
coefficient: 0.1\r
- type: Item\r
- size: 10\r
+ size: Small\r
- type: Armor\r
modifiers:\r
coefficients:\r
- FEET
- type: Sprite
state: icon
+ - type: Item
+ size: Normal
- type: Food
requiresSpecialDigestion: true
- type: SolutionContainerManager
id: ClothingShoesStorageBase
components:
- type: Storage
- capacity: 10
+ maxSlots: 1
+ maxItemSize: Normal
- type: ContainerContainer
containers:
storagebase: !type:Container
- state: equipped-FEET
offset: "0, -0.02"
- type: Item
- size: 10
+ size: Small
sprite: Clothing/Shoes/Specific/large_clown.rsi
- type: ClothingSpeedModifier
walkModifier: 0.85
parent: BaseItem
id: Clothing
components:
+ - type: Item
+ size: Normal
- type: Sprite
- type: Tag
tags:
types:
Blunt: 20000
- type: Item
- size: 1
+ size: Tiny
sprite: Objects/Weapons/Melee/debug.rsi
- type: entity
- map: ["enum.DamageStateVisualLayers.Base"]
state: mouse-0
- type: Item
- size: 5
+ size: Tiny
- type: Clothing
quickEquip: false
sprite: Mobs/Animals/mouse.rsi
groups:
Brute: 5
- type: Item
- size: 80
+ size: Normal
- type: OnUseTimerTrigger
delay: 10
beepSound:
- map: ["enum.DamageStateVisualLayers.Base"]
state: hamster-0
- type: Item
- size: 5
+ size: Tiny
- type: Physics
- type: Fixtures
fixtures:
graph: SupplyBot
node: bot
- type: Storage
- capacity: 250
+ maxItemSize: Large
+ maxTotalWeight: 40
- type: UserInterface
interfaces:
- key: enum.StorageUiKey.Key
map: ["6pack6"]
visible: false
- type: Item
- size: 6
+ size: Normal
- type: Storage
- capacity: 30
+ maxSlots: 6
whitelist:
tags:
- Cola
abstract: true
components:
- type: Item
- size: 1
+ size: Tiny
- type: FlavorProfile
flavors:
- bread
- ReagentId: Vitamin
Quantity: 5
- type: Item
- size: 25
+ size: Normal
- type: entity
parent: FoodCakeBase
- ReagentId: Vitamin
Quantity: 1
- type: Item
- size: 5
+ size: Tiny
# Custom Cake Example
- type: Food
transferAmount: 12
- type: Item
- size: 40
+ size: Normal
- type: PointLight
color: "#FFFF00"
radius: 2
- ReagentId: Nutriment
Quantity: 3
- type: Item
- size: 1
+ size: Tiny
- type: Tag
tags:
- DonkPocket
Quantity: 3
- type: Item
sprite: Objects/Consumable/Food/Baked/donut.rsi
- size: 1
+ size: Tiny
# Tastes like donut.
# The sprinkles are now an overlay, so you can put them on any donut! If we really
- ReagentId: Nutriment
Quantity: 5
- type: Item
- size: 1
+ size: Tiny
# Muffins/Buns
- type: SliceableFood
count: 8
- type: Item
- size: 8
+ size: Normal
- type: Tag
tags:
- Pizza
- ReagentId: Vitamin
Quantity: 0.8
- type: Item
- size: 1
+ size: Tiny
- type: Tag
tags:
- Pizza
map: ["pink-box6"]
visible: false
- type: Storage
- capacity: 6
+ maxSlots: 6
whitelist:
tags:
- Donut
- type: Item
sprite: Objects/Consumable/Food/Baked/donut.rsi
- size: 6
+ size: Small
heldPrefix: box
- type: StorageFill
contents:
map: ["box12"]
visible: false
- type: Storage
- capacity: 12
+ maxSlots: 12
whitelist:
tags:
- Egg
- type: Item
sprite: Objects/Consumable/Food/egg.rsi
- size: 12
+ size: Small
- type: StorageFill
contents:
- id: FoodEgg
map: ["enum.StorageVisualLayers.Door"]
# TODO make these entitystorage again + placeablesurface after entity storage ECS gets merged.
- type: Storage
- capacity: 8
+ maxSlots: 1
+ maxItemSize: Normal
whitelist:
tags:
- Pizza
map: ["box6"]
visible: false
- type: Storage
- capacity: 6
+ maxSlots: 6
- type: Item
sprite: Objects/Consumable/Food/Baked/nuggets.rsi
- size: 6
+ size: Small
heldPrefix: box
- type: StorageFill
contents:
sprite: Objects/Consumable/Food/Baked/donkpocket.rsi
state: box
- type: Storage
+ maxTotalWeight: 12
whitelist:
tags:
- DonkPocket
- capacity: 6
- type: Item
sprite: Objects/Consumable/Food/Baked/donkpocket.rsi
- size: 6
+ size: Small
- type: StorageFill
contents:
- id: FoodDonkpocket
- type: Item
sprite: Objects/Storage/Happyhonk/clown.rsi
heldPrefix: box
- - type: Storage
- capacity: 30
- type: Tag
tags:
- Trash
suffix: Toy Unsafe, Snacks
name: syndicate snack box
components:
- - type: Item
- size: 64
- type: Storage
- capacity: 64 # need more room for goodies
+ maxSlots: 9
- type: StorageFill
contents:
# toy
- type: Item
sprite: Objects/Consumable/Food/snacks.rsi
heldPrefix: packet
- size: 3
+ size: Tiny
- type: DamageOnLand
damage:
types:
- type: Item
sprite: Objects/Consumable/Food/snacks.rsi
heldPrefix: packet
- size: 3
+ size: Tiny
- type: PhysicalComposition
materialComposition:
Steel: 100
sprite: Objects/Consumable/Food/egg.rsi
- type: Item
sprite: Objects/Consumable/Food/egg.rsi
- size: 1
+ size: Tiny
- type: SolutionContainerManager
solutions:
food:
sprite: Objects/Consumable/Food/egg.rsi
state: eggshells
- type: Item
- size: 1
+ size: Tiny
- type: SolutionContainerManager
solutions:
food:
- ReagentId: Fat
Quantity: 5
- type: Item
- size: 5
+ size: Tiny
- type: Fixtures
fixtures:
fix1:
graph: BearSteak
node: start
defaultTarget: filet migrawr
-
+
- type: entity
name: raw penguin meat
- type: Sprite
sprite: Objects/Specific/Hydroponics/nettle.rsi
- type: Item
- size: 10
+ size: Small
sprite: Objects/Specific/Hydroponics/nettle.rsi
- type: MeleeWeapon
damage:
- type: Sprite
sprite: Objects/Specific/Hydroponics/death_nettle.rsi
- type: Item
- size: 10
+ size: Small
sprite: Objects/Specific/Hydroponics/death_nettle.rsi
- type: MeleeWeapon
damage:
- type: Produce
seedId: deathNettle
- type: MeleeChemicalInjector
- transferAmount: 6
+ transferAmount: 6
solution: food
pierceArmor: true # We do a little trolling
- type: Extractable
- type: Tag
tags:
- Fruit
-
+
- type: entity
name: mimana
parent: FoodProduceBase
state: peel
- type: Item
sprite: Objects/Specific/Hydroponics/mimana.rsi
- heldPrefix: peel
+ heldPrefix: peel
- type: Slippery
slipSound:
path: /Audio/Effects/slip.ogg
sprite: Objects/Specific/Hydroponics/corn.rsi
state: cob
- type: Item
- size: 1
+ size: Tiny
- type: Tag
tags:
- Trash
- type: Tag
tags:
- Galaxythistle
- - Fruit # Probably?
+ - Fruit # Probably?
- type: entity
name: fly amanita
description: Round green object that you can slice and eat.
components:
- type: Item
- size: 10
+ size: Small
- type: FlavorProfile
flavors:
- watermelon
description: Juicy green and red slice.
components:
- type: Item
- size: 2
+ size: Tiny
- type: FlavorProfile
flavors:
- watermelon
description: A large, orange... berry. Seriously.
components:
- type: Item
- size: 10
+ size: Small
- type: FlavorProfile
flavors:
- pumpkin
- id: PumpkinSeeds
- type: Tag
tags:
- - Fruit
\ No newline at end of file
+ - Fruit
- ReagentId: Nutriment
Quantity: 8
- type: Item
- size: 5
+ size: Small
# Kebabs
- type: Item
sprite: Objects/Consumable/Food/snacks.rsi
heldPrefix: packet
- size: 3
+ size: Tiny
# Snacks
# "Snacks" means food in a packet. Down the line this stuff can have multiple
state: chocolatebar
- type: Item
heldPrefix: chocolatebar
- size: 3
+ size: Tiny
- type: Tag
tags:
- FoodSnack
- type: Item
sprite: Objects/Consumable/Food/snacks.rsi
heldPrefix: packet
- size: 1
+ size: Tiny
- type: Food
trash: FoodCookieFortune
description: A carefully synthesized brick designed to contain the highest ratio of nutriment to volume. Tastes like shit.
components:
- type: Item
- size: 10
+ size: Small
- type: Tag
tags:
- FoodSnack
flavors:
- nutribrick
- type: Item
- size: 10
+ size: Small
- type: Sprite
state: nutribrick-open
- type: Food
- state: closed\r
- state: open\r
map: ["openLayer"]\r
- - type: Storage\r
- capacity: 36\r
- type: Item\r
sprite: Objects/Consumable/Smokeables/Cigarettes/Cartons/green.rsi\r
- size: 36\r
+ size: Normal\r
- type: StorageFill\r
contents:\r
- id: CigPackGreen\r
slots: [ mask ]\r
equippedPrefix: unlit\r
- type: Item\r
- size: 1\r
+ size: Tiny\r
- type: Construction\r
graph: smokeableCigarette\r
node: cigarette\r
slots: [ mask ]\r
equippedPrefix: unlit\r
- type: Item\r
- size: 1\r
+ size: Tiny\r
- type: Construction\r
graph: smokeableCigarette\r
node: cigarette\r
slots: [ mask ]
equippedPrefix: unlit
- type: Item
- size: 1
+ size: Tiny
- type: Construction
graph: smokeableJoint
node: joint
slots: [ mask ]
equippedPrefix: unlit
- type: Item
- size: 1
+ size: Tiny
- type: Construction
graph: smokeableBlunt
node: blunt
Steel: 50\r
- type: SpaceGarbage\r
- type: Storage\r
- capacity: 5\r
+ maxSlots: 5\r
- type: Item\r
- size: 5\r
+ size: Small\r
- type: StorageFill\r
contents:\r
- id: Cigarette\r
Steel: 50\r
- type: SpaceGarbage\r
- type: Storage\r
- capacity: 10\r
+ maxSlots: 10\r
+ maxTotalWeight: 20\r
- type: Item\r
- size: 10\r
+ size: Small\r
- type: StorageFill\r
contents:\r
- id: CigaretteRandom\r
tags:
- RollingPaper
- CigFilter
- capacity: 20
+ maxSlots: 20
- type: StorageFill
contents:
- id: PaperRolling
tags:
- RollingPaper
- CigFilter
- capacity: 32
- type: StorageFill
contents:
- id: PaperRolling
state: cigpaper
- type: Item
sprite: Objects/Consumable/Smokeables/Cigarettes/paper.rsi
- size: 5
+ size: Tiny
- type: Tag
tags:
- RollingPaper
components:
- type: Stack
count: 1
- - type: Item
- size: 1
- type: entity
id: CigaretteFilter
state: cigfilter
- type: Item
sprite: Objects/Consumable/Smokeables/Cigarettes/paper.rsi
- size: 10
+ size: Tiny
- type: Tag
tags:
- CigFilter
components:
- type: Stack
count: 1
- - type: Item
- size: 2
map: ["cigar8"]
visible: false
- type: Storage
- capacity: 8
+ maxSlots: 8
- type: Item
sprite: Objects/Consumable/Smokeables/Cigars/case.rsi
- size: 8
+ size: Small
- type: StorageFill
contents:
- id: Cigar
slots: [ mask ]
equippedPrefix: unlit
- type: Item
- size: 1
+ size: Tiny
- type: entity
id: CigarSpent
slots: [ mask ]
equippedPrefix: unlit
- type: Item
- size: 1
+ size: Tiny
- type: entity
id: CigarGoldSpent
slots: [ mask ]
equippedPrefix: unlit
- type: Item
- size: 3
+ size: Tiny
sprite: Objects/Consumable/Smokeables/Pipes/pipe.rsi
- type: Appearance
- type: BurnStateVisuals
sprite: Objects/Specific/Hydroponics/pumpkin.rsi
state: carved
- type: Item
- size: 10
+ size: Normal
- type: Construction
graph: PumpkinAddLight
node: start
suffix: Large
components:
- type: Sprite
- scale: 1.5, 1.5
\ No newline at end of file
+ scale: 1.5, 1.5
layers:
- state: icon
- type: Item
- size: 1001
+ size: Huge
- type: StaticPrice
price: 0
suffix: Empty
components:
- type: Item
- size: 30
- - type: Storage
- capacity: 30
+ size: Normal
- type: entity
id: PresentRandomUnsafe
sprite: Objects/Devices/timer.rsi
state: timer
- type: Item
- size: 5
+ size: Small
- type: PayloadTrigger
components:
- type: OnUseTimerTrigger
components:
- type: Sprite
sprite: Objects/Misc/module.rsi
- state: abductor_mod
+ state: abductor_mod
- type: Item
- size: 10
+ size: Small
- type: Tag
tags:
- - WeaponPistolCHIMPUpgradeKit
\ No newline at end of file
+ - WeaponPistolCHIMPUpgradeKit
sprite: Objects/Devices/forensic_scanner.rsi
state: forensicnew
- type: Item
- size: 5
+ size: Small
- type: Clothing
sprite: Objects/Devices/forensic_scanner.rsi
quickEquip: false
components:
- IdCard
- type: Item
- size: 10
+ size: Small
- type: ContainerContainer
containers:
PDA-id: !type:ContainerSlot {}
- key: enum.InstrumentUiKey.Key
type: InstrumentBoundUserInterface
- type: Item
- size: 24
+ size: Normal
- type: StaticPrice
price: 200
sprite: Objects/Fun/Instruments/trumpet.rsi
state: icon
- type: Item
- size: 24
+ size: Normal
sprite: Objects/Fun/Instruments/trumpet.rsi
- type: Tag
tags:
sprite: Objects/Fun/Instruments/trombone.rsi
state: icon
- type: Item
- size: 48
+ size: Normal
sprite: Objects/Fun/Instruments/trombone.rsi
- type: Tag
tags:
sprite: Objects/Fun/Instruments/frenchhorn.rsi
state: icon
- type: Item
- size: 48
+ size: Normal
sprite: Objects/Fun/Instruments/frenchhorn.rsi
- type: Tag
tags:
sprite: Objects/Fun/Instruments/euphonium.rsi
state: icon
- type: Item
- size: 48
+ size: Normal
sprite: Objects/Fun/Instruments/euphonium.rsi
- type: Tag
tags:
- type: Instrument
program: 121
- type: Item
- size: 10
+ size: Small
- type: entity
parent: BaseHandheldInstrument
- type: Instrument
program: 122
- type: Item
- size: 10
+ size: Small
- type: entity
parent: BaseHandheldInstrument
- type: Instrument
program: 123
- type: Item
- size: 5
+ size: Tiny
- type: entity
parent: BaseHandheldInstrument
- type: Instrument
program: 124
- type: Item
- size: 10
+ size: Small
- type: Prayable
sentMessage: prayer-popup-notify-centcom-sent
notifiactionPrefix: prayer-chat-notify-centcom
- type: Instrument
program: 125
- type: Item
- size: 10
+ size: Small
- type: entity
parent: BaseHandheldInstrument
- type: Instrument
program: 126
- type: Item
- size: 5
+ size: Tiny
- type: entity
parent: BaseHandheldInstrument
sprite: Objects/Fun/Instruments/gunpet.rsi
state: icon
- type: Item
- size: 15
+ size: Normal
sprite: Objects/Fun/Instruments/gunpet.rsi
- type: Tag
tags:
- BrassInstrument #Go figure.
- type: Item
sprite: Objects/Fun/Instruments/bike_horn.rsi
- size: 10
+ size: Small
- type: Clothing
sprite: Objects/Fun/Instruments/bike_horn.rsi
slots: [Belt]
sprite: Objects/Fun/Instruments/glockenspiel.rsi
state: icon
- type: Item
- size: 24
+ size: Normal
sprite: Objects/Fun/Instruments/glockenspiel.rsi
- type: Tag
tags:
sprite: Objects/Fun/Instruments/microphone.rsi
state: icon
- type: Item
- size: 10
+ size: Small
sprite: Objects/Fun/Instruments/microphone.rsi
- type: entity
sprite: Objects/Fun/Instruments/h_synthesizer.rsi
state: icon
- type: Item
- size: 24
+ size: Normal
sprite: Objects/Fun/Instruments/h_synthesizer.rsi
- type: Tag
tags:
sprite: Objects/Fun/Instruments/h_synthesizer.rsi
state: icon
- type: Item
- size: 24
- sprite: Objects/Fun/Instruments/h_synthesizer.rsi
\ No newline at end of file
+ size: Normal
+ sprite: Objects/Fun/Instruments/h_synthesizer.rsi
sprite: Objects/Fun/Instruments/eguitar.rsi
state: icon
- type: Item
- size: 24
+ size: Normal
sprite: Objects/Fun/Instruments/eguitar.rsi
- type: Clothing
quickEquip: false
sprite: Objects/Fun/Instruments/bassguitar.rsi
state: icon
- type: Item
- size: 24
+ size: Normal
sprite: Objects/Fun/Instruments/bassguitar.rsi
- type: Clothing
quickEquip: false
sprite: Objects/Fun/Instruments/rockguitar.rsi
state: icon
- type: Item
- size: 24
+ size: Normal
sprite: Objects/Fun/Instruments/rockguitar.rsi
- type: Clothing
quickEquip: false
- StringInstrument
- type: Item
sprite: Objects/Fun/Instruments/guitar.rsi
- size: 24
+ size: Normal
- type: Clothing
quickEquip: false
slots:
sprite: Objects/Fun/Instruments/banjo.rsi
state: icon
- type: Item
- size: 24
+ size: Normal
sprite: Objects/Fun/Instruments/banjo.rsi
- type: Tag
tags:
sprite: Objects/Fun/Instruments/violin.rsi
state: icon
- type: Item
- size: 24
+ size: Normal
sprite: Objects/Fun/Instruments/violin.rsi
- type: Tag
tags:
sprite: Objects/Fun/Instruments/viola.rsi
state: icon
- type: Item
- size: 24
+ size: Normal
sprite: Objects/Fun/Instruments/viola.rsi
- type: Tag
tags:
sprite: Objects/Fun/Instruments/cello.rsi
state: icon
- type: Item
- size: 48
+ size: Normal
sprite: Objects/Fun/Instruments/cello.rsi
- type: Tag
tags:
sprite: Objects/Fun/Instruments/saxophone.rsi
state: icon
- type: Item
- size: 24
+ size: Normal
sprite: Objects/Fun/Instruments/saxophone.rsi
- type: Tag
tags:
sprite: Objects/Fun/Instruments/accordion.rsi
state: icon
- type: Item
- size: 24
+ size: Normal
sprite: Objects/Fun/Instruments/accordion.rsi
- type: Tag
tags:
sprite: Objects/Fun/Instruments/harmonica.rsi
state: icon
- type: Item
- size: 10
+ size: Small
sprite: Objects/Fun/Instruments/harmonica.rsi
- type: Tag
tags:
sprite: Objects/Fun/Instruments/clarinet.rsi
state: icon
- type: Item
- size: 20
+ size: Normal
sprite: Objects/Fun/Instruments/clarinet.rsi
- type: Tag
tags:
sprite: Objects/Fun/Instruments/flute.rsi
state: icon
- type: Item
- size: 20
+ size: Normal
sprite: Objects/Fun/Instruments/flute.rsi
- type: Tag
tags:
sprite: Objects/Fun/Instruments/recorder.rsi
state: icon
- type: Item
- size: 24
+ size: Normal
sprite: Objects/Fun/Instruments/recorder.rsi
- type: Tag
tags:
sprite: Objects/Fun/Instruments/panflute.rsi
state: icon
- type: Item
- size: 15
+ size: Normal
sprite: Objects/Fun/Instruments/panflute.rsi
- type: Tag
tags:
sprite: Objects/Fun/Instruments/ocarina.rsi
state: icon
- type: Item
- size: 15
+ size: Normal
sprite: Objects/Fun/Instruments/ocarina.rsi
- type: Tag
tags:
sprite: Objects/Fun/Instruments/bagpipes.rsi
state: icon
- type: Item
- size: 48
+ size: Normal
sprite: Objects/Fun/Instruments/bagpipes.rsi
- type: Tag
tags:
- - WoodwindInstrument
\ No newline at end of file
+ - WoodwindInstrument
state: icon
- type: Item
sprite: Objects/Fun/bikehorn.rsi
- size: 5
+ size: Tiny
- type: Clothing
sprite: Objects/Fun/bikehorn.rsi
slots: [Belt]
state: icon
- type: Item
sprite: Objects/Fun/cluwnehorn.rsi
- size: 5
+ size: Tiny
- type: Clothing
sprite: Objects/Fun/cluwnehorn.rsi
slots: [Belt]
state: icon
- type: Item
sprite: Objects/Fun/goldbikehorn.rsi
- size: 5
+ size: Tiny
- type: Clothing
sprite: Objects/Fun/goldbikehorn.rsi
slots: [Belt]
state: icon
- type: Item
sprite: Objects/Fun/bananiumhorn.rsi
- size: 5
+ size: Tiny
- type: Clothing
sprite: Objects/Fun/bananiumhorn.rsi
slots: [Belt]
sprite: Objects/Fun/crayons.rsi
- type: Item
sprite: Objects/Fun/crayons.rsi
- size: 1
+ size: Tiny
- type: Tag
tags:
- Write
sprite: Objects/Fun/crayons.rsi
state: box
- type: Storage
- capacity: 7
+ maxSlots: 7
+ maxTotalWeight: 7
- type: Item
sprite: Objects/Fun/crayons.rsi
- size: 7
+ size: Small
heldPrefix: box
- type: StorageFill
contents:
types:
Piercing: 4
- type: Item
- size: 2
+ size: Tiny
sprite: Objects/Fun/Darts/dart_red.rsi
- type: ItemCooldown
- type: SolutionContainerManager
- type: SolutionContainerVisuals
maxFillLevels: 1
fillBaseName: dart
-
+
- type: entity
parent: Dart
id: DartBlue
sprite: Objects/Fun/Darts/dart_blue.rsi
- type: Item
sprite: Objects/Fun/Darts/dart_blue.rsi
-
+
- type: entity
parent: Dart
id: DartPurple
sprite: Objects/Fun/Darts/dart_purple.rsi
- type: Item
sprite: Objects/Fun/Darts/dart_purple.rsi
-
+
- type: entity
parent: Dart
id: DartYellow
tags:
- Dice
- type: Item
- size: 2
+ size: Tiny
- type: entity
parent: BaseDice
sprite: Objects/Fun/dice.rsi
state: dicebag
- type: Item
+ size: Small
- type: Storage
- capacity: 18
+ maxTotalWeight: 8
whitelist:
tags:
- - Dice
+ - Dice
- type: entity
parent: DiceBag
sprite: Objects/Fun/dice.rsi
state: magicdicebag
- type: Storage
- capacity: 30
+ maxTotalWeight: 20
- type: DoAfter
- type: VentriloquistPuppet
- type: Item
- size: 30
+ size: Normal
- type: Muted
- type: TypingIndicator
proto: robot
components:
- type: Sprite
- type: Item
- size: 24
+ size: Normal
- type: entity
parent: FoamWeaponBase
sprite: Objects/Fun/toys.rsi
state: foamcrossbow
- type: Item
- size: 24
+ size: Normal
sprite: Objects/Fun/toys.rsi
heldPrefix: foamcrossbow
- type: Gun
types:
Blunt: 0
- type: Item
- size: 20
+ size: Small
sprite: Objects/Fun/toys.rsi
heldPrefix: foamblade
- type: ItemCooldown
sound:
path: /Audio/Effects/Footsteps/bounce.ogg
- type: Item
- size: 24
+ size: Normal
sprite: Objects/Fun/toys.rsi
heldPrefix: bask
- type: TileFrictionModifier
sprite: Objects/Fun/toys.rsi
state: football
- type: Item
- size: 12
+ size: Small
sprite: Objects/Fun/toys.rsi
heldPrefix: footb
sound:
path: /Audio/Effects/Footsteps/bounce.ogg
- type: Item
- size: 24
+ size: Normal
sprite: Objects/Fun/toys.rsi
heldPrefix: beachb
- type: TileFrictionModifier
sprite: Objects/Fun/toys.rsi
state: synb
- type: Item
- size: 24
+ size: Small
sprite: Objects/Fun/toys.rsi
heldPrefix: synb
- type: Damageable
sprite: Objects/Fun/toys.rsi
state: corgib
- type: Item
- size: 24
+ size: Normal
sprite: Objects/Fun/toys.rsi
heldPrefix: corgib
- type: Damageable
intensity: 2000
falloffPower: 2.6
- type: Item
- size: 12
+ size: Small
sprite: Objects/Fun/toys.rsi
heldPrefix: singularitytoy
radius: 2
color: "#00CCFF"
- type: Item
- size: 24
+ size: Normal
sprite: Objects/Fun/toys.rsi
heldPrefix: orb
- type: TileFrictionModifier
shader: unshaded
map: [ "blade" ]
- type: Item
- size: 5
+ size: Small
sprite: Objects/Weapons/Melee/e_sword.rsi
- type: UseDelay
delay: 1.0
types:
Blunt: 0
- type: Item
- size: 15
+ size: Normal
sprite: Objects/Weapons/Melee/cutlass.rsi
- type: entity
- type: StaminaDamageOnHit
damage: 8
- type: Item
- size: 5
+ size: Small
sprite: Objects/Fun/rubber_hammer.rsi
- type: Appearance
- type: DisarmMalus
sprite: Objects/Materials/Sheets/glass.rsi
- type: Item
sprite: Objects/Materials/Sheets/glass.rsi
- size: 30
+ size: Normal
- type: StaticPrice
price: 0
- type: Tag
- type: Stack
stackType: Glass
count: 10
- - type: Item
- size: 10
- type: entity
parent: SheetGlass
- type: Stack
stackType: Glass
count: 1
- - type: Item
- size: 1
- type: entity
parent: SheetGlass
id: SheetGlassLingering0
suffix: Lingering, 0
components:
- - type: Item
- size: 0
- type: Stack
lingering: true
count: 0
- type: Stack
stackType: ReinforcedGlass
count: 1
- - type: Item
- size: 1
- type: entity
parent: SheetGlassBase
map: ["base"]
- type: Item
heldPrefix: pglass
- size: 30
- type: Construction
graph: Glass
node: SheetPGlass
- type: Stack
stackType: PlasmaGlass
count: 1
- - type: Item
- size: 1
- type: entity
parent: SheetPGlass
- type: Stack
stackType: ReinforcedPlasmaGlass
count: 1
- - type: Item
- size: 1
- type: entity
parent: SheetGlassBase
- type: Stack
stackType: UraniumGlass
count: 1
- - type: Item
- size: 1
- type: entity
parent: SheetUGlass
- type: Stack
stackType: ReinforcedUraniumGlass
count: 1
- - type: Item
- size: 1
sprite: Objects/Materials/Sheets/metal.rsi
- type: Item
sprite: Objects/Materials/Sheets/metal.rsi
- size: 30
+ size: Normal
- type: StaticPrice
price: 0
- type: Tag
name: steel
suffix: 10
components:
- - type: Item
- size: 10
- type: Sprite
state: steel
- type: Stack
name: steel
suffix: Single
components:
- - type: Item
- size: 1
- type: Sprite
state: steel
- type: Stack
id: SheetSteelLingering0
suffix: Lingering, 0
components:
- - type: Item
- size: 0
- type: Stack
lingering: true
count: 0
- type: Stack
stackType: Plasteel
count: 10
- - type: Item
- size: 10
- type: entity
parent: SheetPlasteel
- type: Stack
stackType: Plasteel
count: 1
- - type: Item
- size: 1
sprite: Objects/Materials/Sheets/other.rsi
- type: Item
sprite: Objects/Materials/Sheets/other.rsi
- size: 30
+ size: Normal
- type: Tag
tags:
- Sheet
state: paper
- type: Stack
count: 1
- - type: Item
- size: 1
- type: entity
parent: SheetOtherBase
state: plasma
- type: Stack
count: 1
- - type: Item
- size: 1
- type: entity
parent: SheetOtherBase
map: ["base"]
- type: Item
heldPrefix: plastic
- size: 30
- type: Appearance
- type: entity
components:
- type: Sprite
state: plastic
- - type: Item
- size: 10
- type: Stack
count: 10
components:
- type: Sprite
state: plastic
- - type: Item
- size: 1
- type: Stack
count: 1
components:
- type: Stack
count: 1
- - type: Item
- size: 1
- type: entity
parent: SheetOtherBase
state: meat
- type: Stack
count: 1
- - type: Item
- size: 1
sprite: Objects/Materials/ingots.rsi
- type: Item
sprite: Objects/Materials/ingots.rsi
- size: 30
+ size: Normal
- type: StaticPrice
price: 0
- type: Tag
state: gold
- type: Stack
count: 1
- - type: Item
- size: 1
- type: entity
parent: IngotBase
components:
- type: Sprite
state: silver
- - type: Stack
- count: 1
- - type: Item
- size: 1
sprite: Objects/Materials/materials.rsi
- type: Item
sprite: Objects/Materials/materials.rsi
- size: 30
+ size: Normal
- type: Tag
tags:
- DroneUsable
- state: cardboard_3
map: ["base"]
- type: Appearance
- - type: Item
- size: 30
- type: entity
parent: MaterialCardboard
state: cardboard
- type: Stack
count: 10
- - type: Item
- size: 10
- type: entity
parent: MaterialCardboard
state: cardboard
- type: Stack
count: 1
- - type: Item
- size: 1
- type: entity
parent: MaterialBase
- state: cloth_3
map: ["base"]
- type: Appearance
- - type: Item
- size: 30
- type: Food
requiresSpecialDigestion: true
- type: SolutionContainerManager
state: cloth
- type: Stack
count: 10
- - type: Item
- size: 10
- type: entity
parent: MaterialCloth
state: cloth
- type: Stack
count: 1
- - type: Item
- size: 1
- type: entity
parent: MaterialBase
state: durathread
- type: Stack
count: 1
- - type: Item
- size: 1
- type: entity
parent: MaterialBase
components:
- type: Stack
count: 10
- - type: Item
- size: 10
- type: entity
parent: MaterialWoodPlank
components:
- type: Stack
count: 1
- - type: Item
- size: 1
- type: entity
parent: MaterialBase
- type: GuideHelp
guides:
- Cloning
- - type: Item
- size: 100
- type: entity
parent: MaterialBiomass
components:
- type: Stack
count: 1
- - type: Item
- size: 1
# Following not used currently
- type: entity
state: diamond
- type: Item
heldPrefix: diamond
- size: 60
- type: entity
parent: MaterialDiamond
components:
- type: Stack
count: 1
- - type: Item
- size: 2
- type: entity
parent: MaterialBase
- state: cotton_3
map: ["base"]
- type: Appearance
- - type: Item
- size: 30
- type: Food
requiresSpecialDigestion: true
- type: SolutionContainerManager
state: cotton
- type: Stack
count: 1
- - type: Item
- size: 1
- type: entity
parent: MaterialBase
- ReagentId: Honk
Quantity: 5
- type: Appearance
- - type: Item
- size: 20
- type: entity
parent: MaterialBananium
state: bananium
- type: Stack
count: 1
- - type: Item
- size: 2
- type: entity
parent: MaterialBase
- type: Stack
count: 50
stackType: WebSilk
- - type: Item
- size: 50
- type: Food
requiresSpecialDigestion: true
- type: FlavorProfile
components:
- type: Stack
count: 25
- - type: Item
- size: 25
- type: entity
parent: MaterialWebSilk
components:
- type: Stack
count: 1
- - type: Item
- size: 1
- type: entity
parent: MaterialBase
- state: cotton_3
map: ["base"]
- type: Appearance
- - type: Item
- size: 30
- type: Food
- type: BadFood
- type: SolutionContainerManager
components:
- type: Stack
count: 1
- - type: Item
- size: 1
sprite: Objects/Materials/ore.rsi
- type: Item
sprite: Objects/Materials/ore.rsi
- size: 60
+ size: Normal
- type: Tag
tags:
- Ore
components:
- type: Stack
count: 1
- - type: Item
- size: 2
- type: entity
parent: OreBase
components:
- type: Stack
count: 1
- - type: Item
- size: 2
- type: entity
parent: OreBase
components:
- type: Stack
count: 1
- - type: Item
- size: 2
- type: entity
parent: OreBase
components:
- type: Stack
count: 1
- - type: Item
- size: 2
- type: entity
parent: OreBase
components:
- type: Stack
count: 1
- - type: Item
- size: 2
- type: entity
parent: OreBase
components:
- type: Stack
count: 1
- - type: Item
- size: 2
-
- type: entity
parent: OreBase
components:
- type: Stack
count: 1
- - type: Item
- size: 2
- state: rods_5
map: ["base"]
- type: Item
- size: 30
+ size: Normal
# heldPrefix: rods
- type: Construction
graph: MetalRod
state: rods
- type: Stack
count: 10
- - type: Item
- size: 10
- type: entity
parent: PartRodMetal
state: rods
- type: Stack
count: 1
- - type: Item
- size: 1
- type: entity
parent: PartRodMetal
id: PartRodMetalLingering0
suffix: Lingering, 0
components:
- - type: Item
- size: 0
- type: Stack
lingering: true
count: 0
Slash: 3.5
- type: Item
sprite: Objects/Materials/Shards/shard.rsi
- size: 4
+ size: Tiny
- type: CollisionWake
enabled: false
- type: Fixtures
sprite: Objects/Misc/bedsheets.rsi
noRot: true
- type: Item
- size: 10
+ size: Small
- type: Clothing
quickEquip: true
slots:
sprite: Objects/Storage/boxes.rsi
- type: Item
sprite: Objects/Storage/boxes.rsi
- size: 30
+ size: Normal
- type: Storage
- capacity: 30
+ maxTotalWeight: 12
- type: ContainerContainer
containers:
storagebase: !type:Container
description: Useful for carrying items in your hands.
components:
- type: Item
- size: 60
+ size: Large
- type: Storage
- capacity: 60
+ maxSlots: 4
+ maxTotalWeight: 16
- type: Tag
tags:
- Briefcase
sprite: Objects/Storage/Briefcases/briefcase_brown.rsi
- type: entity
- parent: BaseStorageItem
+ parent: BriefcaseBase
abstract: true
id: BriefcaseSyndieBase
suffix: Syndicate, Empty
description: Useful for carrying items in your hands.
components:
- type: Item
- size: 80
+ size: Large
- type: Storage
- capacity: 80
+ maxSlots: 6
+ maxTotalWeight: 24
- type: Tag
tags:
- Briefcase
Structural: 2
animation: WeaponArcPunch
- type: Item
- size: 5
+ size: Small
- type: PointLight
radius: 1.5
energy: 3
map: [ "enabled" ]
- type: Item
sprite: Objects/Misc/fire_extinguisher.rsi
- size: 10
+ size: Small
- type: SolutionContainerManager
solutions:
spray:
sprite: Objects/Misc/Lights/lights.rsi
- type: Item
sprite: Objects/Misc/Lights/lights.rsi
- size: 20
+ size: Normal
heldPrefix: off
- type: PointLight
enabled: false
description: A pole with powerful mounted lights on it.
components:
- type: Item
- size: 50
+ size: Normal
- type: Sprite
layers:
- state: floodlight
parent: BaseItem
components:
- type: Item
- size: 3
+ size: Small
- type: Handcuff
cuffedRSI: Objects/Misc/handcuffs.rsi
bodyIconState: body-overlay
id: Cablecuffs
parent: Handcuffs
components:
- - type: Item
- size: 5
- type: Handcuff
breakoutTime: 15
cuffedRSI: Objects/Misc/cablecuffs.rsi
parent: Handcuffs
components:
- type: Item
- size: 2
+ size: Tiny
- type: Handcuff
breakoutTime: 20 # halfway between improvised cablecuffs and metal ones
cuffedRSI: Objects/Misc/cablecuffs.rsi # cablecuffs will look fine
abstract: true
components:
- type: Item
- size: 2
+ size: Tiny
- type: Tag
tags:
- Trash
description: Used to restrain those who may cause harm to themselves or others.
components:
- type: Item
- size: 20
+ size: Normal
- type: Handcuff
cuffedRSI: Clothing/OuterClothing/Misc/straight_jacket.rsi
breakoutTime: 100
- idcard
sprite: Objects/Misc/id_cards.rsi
- type: Item
+ size: Small
heldPrefix: default
- type: Access
- type: IdCard
components:
- type: Item
sprite: Objects/Specific/Medical/syndi_implanter.rsi
- size: 3
+ size: Tiny
- type: Sprite
sprite: Objects/Specific/Medical/syndi_implanter.rsi
state: implanter1
#TODO: Assimilate these into the same RSI.
- type: entity
parent: BaseItem
- id: ModularReceiver
- name: modular receiver
+ id: ModularReceiver
+ name: modular receiver
description: A vital part used in the creation of firearms. #Could use a better description, but I'm not a gun nut so I can't really do that.
components:
# - type: Item
-# size: 15
+# size: Normal
- type: Sprite
sprite: Objects/Misc/modular_receiver.rsi
state: icon
description: A robust wooden stock, used in the creation of firearms. #Same as above
components:
# - type: Item
-# size: 25
+# size: Normal
- type: Sprite
sprite: Objects/Misc/rifle_stock.rsi
state: icon
- type: Sprite
sprite: Objects/Misc/stock_parts.rsi
- type: Item
- size: 1
+ size: Tiny
- type: GuideHelp
guides:
- MachineUpgrading
state: icon
- type: Item
sprite: Objects/Storage/medalcase.rsi
- size: 80
+ size: Normal
- type: Storage
- capacity: 80
+ maxSlots: 8
+ maxTotalWeight: 16
- type: StorageFill
contents:
- id: ClothingNeckGoldmedal
whitelist:
tags:
- MonkeyCube
- capacity: 30
- type: StorageFill
contents:
- id: MonkeyCubeWrapped
whitelist:
tags:
- MonkeyCube
- capacity: 30
- type: StorageFill
contents:
- id: SyndicateSpongeWrapped
- key: enum.PaperUiKey.Key
type: PaperBoundUserInterface
- type: Item
- size: 1
+ size: Tiny
- type: Tag
tags:
- Document
- type: Item
sprite: Objects/Misc/bureaucracy.rsi
heldPrefix: pen
- size: 2
+ size: Tiny
- type: PhysicalComposition
materialComposition:
Steel: 25
- type: Item
sprite: Objects/Misc/bureaucracy.rsi
heldPrefix: overpriced_pen
- size: 2
+ size: Tiny
- type: entity
name: captain's fountain pen
# black: "#3f3f3f"
- type: Item
sprite: Objects/Misc/bureaucracy.rsi
- size: 5
+ size: Small
- type: Storage
- capacity: 10
+ maxSlots: 10
+ maxItemSize: Small
+ maxTotalWeight: 20
whitelist:
tags:
- Document
insertOnInteract: false
- type: Item
sprite: Objects/Misc/clipboard.rsi
- size: 10
+ size: Small
- type: Clothing
slots: [belt]
quickEquip: false
sprite: Objects/Misc/clipboard.rsi
- type: Storage
- capacity: 20
+ maxSlots: 15
+ maxTotalWeight: 30
whitelist:
tags:
- Document
insertOnInteract: true
- type: Item
sprite: Objects/Misc/qm_clipboard.rsi
- size: 30
+ size: Normal
- type: Clothing
slots: [belt]
quickEquip: false
sprite: Objects/Misc/qm_clipboard.rsi
- type: Storage
- capacity: 90
+ maxSlots: 20
quickInsert: true
whitelist:
tags:
sprite: Objects/Misc/bureaucracy.rsi
state: stamp-mime
- type: Item
- size: 3
+ size: Tiny
- type: entity
name: alternate rubber stamp
sprite: Objects/Misc/potatoai_chip.rsi
state: icon
- type: Item
- size: 3
+ size: Tiny
- type: Tag
tags:
- SmallAIChip
- type: Construction
graph: PotatoAIChip
- node: potatoaichip
\ No newline at end of file
+ node: potatoaichip
components:
- Hands # no use giving a mouse a storage implant, but a monkey is another story...
- type: Item
- size: 9999
+ size: Huge
- type: Storage
- capacity: 20 #10-20 should be more than enough for this
+ maxSlots: 4
+ maxItemSize: Small
- type: ContainerContainer
containers:
storagebase: !type:Container
sprite: Objects/Tiles/tile.rsi
- type: Item
sprite: Objects/Tiles/tile.rsi
+ size: Normal
- type: DamageOtherOnHit
damage:
types:
description: A hermetically sealed jar containing antimatter for use in an antimatter reactor.
components:
- type: Item
- size: 5
+ size: Normal
sprite: Objects/Power/AME/ame_jar.rsi
- type: Sprite
sprite: Objects/Power/AME/ame_jar.rsi
description: A flatpack used for constructing an antimatter engine reactor. Use a multitool to unpack it.
components:
- type: Item
- size: 5
+ size: Small
sprite: Objects/Power/AME/ame_part.rsi
- type: Sprite
sprite: Objects/Power/AME/ame_part.rsi
description: Drains immense amounts of electricity from the grid.
components:
- type: Item
- size: 150
+ size: Large
- type: NodeContainer
examinable: true
nodes:
name: solar assembly part
components:
- type: Item
- size: 10
+ size: Small
- type: Sprite
sprite: Objects/Power/solar_parts.rsi
state: solar_assembly_parts
state: riot-icon
- type: Item
sprite: Objects/Weapons/Melee/shields.rsi
- size: 100
+ size: Huge
heldPrefix: riot
- type: Blocking
passiveBlockModifier:
path: /Audio/Weapons/ebladeon.ogg
deActivateSound:
path: /Audio/Weapons/ebladeoff.ogg
- offSize: 5
+ offSize: Small
- type: Sprite
sprite: Objects/Weapons/Melee/e_shield.rsi
layers:
shader: unshaded
map: [ "shield" ]
- type: Item
- size: 5
+ size: Small
sprite: Objects/Weapons/Melee/e_shield.rsi
heldPrefix: eshield
- type: UseDelay
state: eshield-icon
- type: Item
sprite: Objects/Weapons/Melee/e_shield.rsi
- size: 5
+ size: Small
heldPrefix: eshield
- type: entity
path: /Audio/Weapons/telescopicoff.ogg
params:
volume: -5
- offSize: 10
+ offSize: Small
- type: Sprite
sprite: Objects/Weapons/Melee/teleriot_shield.rsi
layers:
visible: false
map: [ "shield" ]
- type: Item
- size: 10
+ size: Small
sprite: Objects/Weapons/Melee/teleriot_shield.rsi
heldPrefix: teleriot
- type: UseDelay
sprite: Objects/Specific/Chapel/bible.rsi
state: icon
- type: Item
- size: 15
+ size: Normal
sprite: Objects/Specific/Chapel/bible.rsi
- type: Clothing
slots:
- Belt
- type: Storage
- capacity: 10
+ maxSlots: 1
- type: UserInterface
interfaces:
- key: enum.StorageUiKey.Key
sprite: Objects/Specific/Chapel/necronomicon.rsi
state: icon
- type: Item
- size: 15
+ size: Normal
sprite: Objects/Specific/Chapel/necronomicon.rsi
- type: Clothing
slots:
slots:
- belt
- type: Item
- size: 46
+ size: Normal
- type: Storage
- capacity: 45
+ maxSlots: 40
quickInsert: true
areaInsert: true
whitelist:
description: A forensic pad for collecting fingerprints or fibers.
components:
- type: Item
- size: 3
+ size: Tiny
- type: ForensicPad
- type: Sprite
sprite: Objects/Misc/bureaucracy.rsi
tags:
- Smokable
- type: Item
- size: 1
+ size: Tiny
- type: entity
name: tobacco leaves
tags:
- Smokable
- type: Item
- size: 1
+ size: Tiny
sprite: Objects/Specific/Hydroponics/seeds.rsi
state: seed
- type: Item
- size: 2
+ size: Tiny
- type: StaticPrice
price: 20
seedId: watermelon
- type: Sprite
sprite: Objects/Specific/Hydroponics/watermelon.rsi
-
+
- type: entity
parent: SeedBase
name: packet of grape seeds
seedId: bungo
- type: Sprite
sprite: Objects/Specific/Hydroponics/bungo.rsi
-
+
- type: entity
parent: SeedBase
name: packet of pumpkin seeds
types:
Slash: 10
- type: Item
- size: 20
+ size: Normal
- type: Clothing
sprite: Objects/Tools/Hydroponics/scythe.rsi
slots:
- type: Sprite
sprite: Objects/Specific/Hydroponics/Equipment/plant_bag.rsi
state: icon
- - type: Item
- type: Clothing
quickEquip: false
slots:
- belt
- type: Storage
- capacity: 200
+ maxSlots: 40
+ maxItemSize: Small
quickInsert: true
areaInsert: true
whitelist:
types:
Blunt: 5
- type: Item
- size: 15
+ size: Normal
sprite: Objects/Specific/Janitorial/mop.rsi
- type: Absorbent
- type: SolutionContainerManager
types:
Blunt: 5
- type: Item
- size: 15
+ size: Normal
sprite: Objects/Specific/Janitorial/advmop.rsi
- type: Absorbent
pickupAmount: 100
sprite: Objects/Specific/Janitorial/wet_floor_sign.rsi
- type: Item
sprite: Objects/Specific/Janitorial/wet_floor_sign.rsi
- size: 15
+ size: Normal
- type: Armor
modifiers:
coefficients:
types:
Blunt: 0
- type: Item
- size: 10
+ size: Small
sprite: Objects/Specific/Janitorial/rag.rsi
- type: Absorbent
pickupAmount: 15
- state: icon-0
map: ["enum.StorageFillLayers.Fill"]
- type: Storage
- capacity: 125
+ maxTotalWeight: 48
+ maxItemSize: Small
quickInsert: true
areaInsert: true
storageOpenSound:
slots: [belt]
sprite: Objects/Specific/Janitorial/trashbag.rsi
- type: Item
- size: 125
+ size: Normal
- type: entity
name: trash bag
parent: TrashBagBlue
components:
- type: Storage
- capacity: 125000
+ maxSlots: 100
+ maxItemSize: Huge
+ maxTotalWeight: 200
quickInsert: true
areaInsert: true
areaInsertRadius: 1000
- key: enum.StorageUiKey.Key
type: StorageBoundUserInterface
- type: Storage
- capacity: 30
- type: TileFrictionModifier
- modifier: 0.4 # makes it slide
-
+ modifier: 0.4 # makes it slide
+
# Add this if freezing/heating container/objects thermodynamics becomes a thing
#- type: PowerCellSlot
# cell_slot:
# name: power-cell-slot-component-slot-name-default
# startingItem: PowerCellMedium
-
+
- type: entity
name: Hot Food Cart
id: FoodCartHot
- type: Sprite
netSync: false
noRot: true
- sprite: Objects/Specific/Kitchen/food_carts.rsi
+ sprite: Objects/Specific/Kitchen/food_carts.rsi
layers:
- state: stand-food
- type: Storage
- blacklist:
+ blacklist:
tags:
- Coldsauce
- Hotsauce
whitelist:
tags:
- Hotsauce
- priority: 5
+ priority: 5
bbqsauce_slot:
name: BBQ Sauce
insertSound: /Audio/Items/bottle_clunk.ogg
whitelist:
tags:
- BBQsauce
- priority: 4
+ priority: 4
ketchup_slot:
name: Ketchup
insertSound: /Audio/Items/bottle_clunk.ogg
whitelist:
tags:
- Ketchup
- priority: 3
+ priority: 3
- type: ItemMapper
mapLayers:
cart_hotsauce:
- type: Sprite
netSync: false
noRot: true
- sprite: Objects/Specific/Kitchen/food_carts.rsi
+ sprite: Objects/Specific/Kitchen/food_carts.rsi
layers:
- state: stand-ice
- type: ContainerContainer
slots:
- belt
- type: Item
- size: 151
+ size: Huge
- type: Storage
- capacity: 150
+ maxSlots: 15
quickInsert: true
areaInsert: true
whitelist:
abstract: true
components:
- type: Item
- size: 50
+ size: Huge
- type: entity
parent: BaseRipleyPart
abstract: true
components:
- type: Item
- size: 50
+ size: Huge
- type: entity
parent: BaseHonkerPart
abstract: true
components:
- type: Item
- size: 50
+ size: Large
- type: entity
parent: BaseHamtrPart
abstract: true
components:
- type: Item
- size: 10
+ size: Small
- type: entity
parent: BaseVimPartItem
sprite: Objects/Specific/Mech/mecha_equipment.rsi
- type: Item
sprite: Objects/Specific/Mech/mecha_equipment.rsi
- size: 50
+ size: Huge
- type: MechEquipment
- type: GuideHelp
guides:
True: { visible: true }
False: { visible: false }
- type: Item
- size: 50
+ size: Normal
- type: ItemCooldown
- type: Speech
speechVerb: Robotic
description: Used for taking and transfering samples. Sterile until open. Single use only.
components:
- type: Item
- size: 1
+ size: Tiny
- type: Sprite
sprite: Objects/Specific/Medical/mouth_swab.rsi
state: icon
description: Prevents people who DON'T already have a disease from catching it.
components:
- type: Item
- size: 3
+ size: Tiny
- type: Sprite
sprite: Objects/Specific/Medical/medipen.rsi
state: salpen
- type: Sprite
sprite: Objects/Specific/Medical/medical.rsi
- type: Item
- size: 10
+ size: Small
sprite: Objects/Specific/Medical/medical.rsi
heldPrefix: ointment
# Inherited
- type: Stack
stackType: Ointment
count: 1
- - type: Item
- size: 1
- type: entity
id: Ointment10Lingering
- type: Stack
stackType: RegenerativeMesh
count: 1
- - type: Item
- size: 1
- type: entity
name: bruise pack
- type: Stack
stackType: Brutepack
count: 1
- - type: Item
- size: 1
- type: entity
id: Brutepack10Lingering
- type: Stack
stackType: MedicatedSuture
count: 1
- - type: Item
- size: 1
- type: entity
name: blood pack
components:
- type: Stack
count: 1
- - type: Item
- size: 1
- type: entity
id: Gauze10Lingering
- ReagentId: Dexalin
Quantity: 10
+- type: entity
+ parent: PillCanister
+ id: PillCanisterDexalin
+ suffix: Dexalin, 7
+ components:
+ - type: StorageFill
+ contents:
+ - id: PillDexalin
+ amount: 7
+
- type: entity
name: dylovene pill (10u)
parent: Pill
- ReagentId: Dylovene
Quantity: 10
+- type: entity
+ parent: PillCanister
+ id: PillCanisterDylovene
+ suffix: Dylovene, 5
+ components:
+ - type: StorageFill
+ contents:
+ - id: PillDylovene
+ amount: 5
+
- type: entity
name: hyronalin pill (10u)
parent: Pill
- ReagentId: Hyronalin
Quantity: 10
+- type: entity
+ parent: PillCanister
+ id: PillCanisterHyronalin
+ suffix: Hyronalin, 5
+ components:
+ - type: StorageFill
+ contents:
+ - id: PillHyronalin
+ amount: 5
+
- type: entity
name: iron pill (10u)
parent: Pill
- ReagentId: Iron
Quantity: 10
+- type: entity
+ parent: PillCanister
+ id: PillCanisterIron
+ suffix: Iron, 5
+ components:
+ - type: StorageFill
+ contents:
+ - id: PillIron
+ amount: 5
+
- type: entity
name: kelotane pill (10u)
parent: Pill
- ReagentId: Kelotane
Quantity: 10
+- type: entity
+ parent: PillCanister
+ id: PillCanisterKelotane
+ suffix: Kelotane, 5
+ components:
+ - type: StorageFill
+ contents:
+ - id: PillKelotane
+ amount: 5
+
- type: entity
name: dermaline pill (10u)
parent: Pill
- ReagentId: Dermaline
Quantity: 10
+- type: entity
+ parent: PillCanister
+ id: PillCanisterDermaline
+ suffix: Dermaline, 5
+ components:
+ - type: StorageFill
+ contents:
+ - id: PillDermaline
+ amount: 5
+
- type: entity
name: space drugs
parent: Pill
- ReagentId: Tricordrazine
Quantity: 10
+- type: entity
+ parent: PillCanister
+ id: PillCanisterTricordrazine
+ suffix: Tricordrazine, 5
+ components:
+ - type: StorageFill
+ contents:
+ - id: PillTricordrazine
+ amount: 5
+
- type: entity
name: bicaridine pill (10u)
parent: Pill
- ReagentId: Bicaridine
Quantity: 10
+- type: entity
+ parent: PillCanister
+ id: PillCanisterBicaridine
+ suffix: Bicaridine, 5
+ components:
+ - type: StorageFill
+ contents:
+ - id: PillBicaridine
+ amount: 5
+
- type: entity
name: charcoal pill (10u)
parent: Pill
- ReagentId: Charcoal
Quantity: 10
+- type: entity
+ parent: PillCanister
+ id: PillCanisterCharcoal
+ suffix: Charcoal, 3
+ components:
+ - type: StorageFill
+ contents:
+ - id: PillCharcoal
+ amount: 3
+
- type: entity
name: romerol pill
parent: Pill
map: ["enum.SolutionContainerLayers.Fill"]
- type: Item
sprite: Objects/Specific/Medical/medipen.rsi
- size: 3
+ size: Tiny
- type: SolutionContainerManager
solutions:
pen:
map: ["enum.SolutionContainerLayers.Fill"]
- type: Item
sprite: Objects/Specific/Medical/medipen.rsi
- size: 10
+ size: Small
- type: SolutionContainerManager
solutions:
pen:
map: ["enum.SolutionContainerLayers.Fill"]
- type: Item
sprite: Objects/Specific/Medical/medipen.rsi
- size: 5
+ size: Tiny
- type: SolutionContainerManager
solutions:
pen:
map: ["enum.SolutionContainerLayers.Fill"]
- type: Item
sprite: Objects/Specific/Medical/medipen.rsi
- size: 5
+ size: Tiny
- type: SolutionContainerManager
solutions:
pen:
sprite: Objects/Specific/Medical/firstaidkits.rsi
state: firstaid
- type: Storage
- capacity: 60
+ maxTotalWeight: 14
- type: Item
- size: 60
+ size: Normal
sprite: Objects/Specific/Medical/firstaidkits.rsi
heldPrefix: firstaid
- type: Tag
state: blackkit
- type: Item
heldPrefix: blackkit
- size: 50
- - type: Storage
- capacity: 50
+ size: Normal
description: A plastic bag designed for the storage and transportation of cadavers.
components:
- type: Item
- size: 6
+ size: Small
- type: Sprite
drawdepth: SmallObjects # I guess body bags need appear above a coroner's table?
sprite: Objects/Specific/Medical/Morgue/bodybags.rsi
state: icon
- type: Item
sprite: Objects/Specific/Research/rped.rsi
- size: 50
+ size: Normal
- type: GuideHelp
guides:
- MachineUpgrading
- type: PartExchanger
- type: Storage
- capacity: 150
+ maxSlots: 30
quickInsert: true
areaInsert: true
whitelist:
slots:
- belt
- type: Item
- size: 176
+ size: Huge
- type: Storage
- capacity: 175
+ maxSlots: 5
+ maxItemSize: Normal
quickInsert: true
areaInsert: true
whitelist:
soundSwing:
path: /Audio/Weapons/punchmiss.ogg
- type: Item
- size: 50
+ size: Normal
- type: Damageable
damageContainer: Inorganic
damageModifierSet: Metallic
type: IntercomBoundUserInterface
- type: Appearance
- type: Item
- size: 40
+ size: Normal
sprite: Objects/Specific/Xenoarchaeology/item_artifacts.rsi
heldPrefix: ano01
- type: Actions
map: [ "enum.SolutionContainerLayers.Fill" ]
visible: false
- type: Item
- size: 20
+ size: Normal
sprite: Objects/Specific/Chemistry/jug.rsi
- type: RefillableSolution
solution: beaker
- key: enum.TransferAmountUiKey.Key
type: TransferAmountBoundUserInterface
- type: Item
- size: 3
+ size: Tiny
sprite: Objects/Specific/Chemistry/beaker.rsi
- type: Spillable
solution: drink
map: ["enum.SolutionContainerLayers.Fill"]
visible: false
- type: Item
- size: 10
+ size: Small
sprite: Objects/Specific/Chemistry/beaker_large.rsi
- type: SolutionContainerManager
solutions:
sprite: Objects/Specific/Chemistry/syringe.rsi
state: "syringe_base0"
- type: Item
- size: 3
+ size: Tiny
sprite: Objects/Specific/Chemistry/syringe.rsi
heldPrefix: 0
- type: SolutionContainerManager
sprite: Objects/Specific/Chemistry/pills.rsi
state: pill
- type: Item
- size: 1
+ size: Tiny
sprite: Objects/Specific/Chemistry/pills.rsi
- type: Pill
- type: Food
name: pill canister
id: PillCanister
parent: BaseStorageItem
- description: Holds up to 9 pills.
+ description: Holds up to 10 pills.
components:
- type: Sprite
sprite: Objects/Specific/Chemistry/pills_canister.rsi
state: pill_canister
- type: Item
sprite: Objects/Specific/Chemistry/pills_canister.rsi
+ size: Small
- type: Tag
tags:
- PillCanister
- type: Storage
- capacity: 9
+ maxTotalWeight: 10
quickInsert: true
areaInsert: true
areaInsertRadius: 1
storageInsertSound: /Audio/Effects/pill_insert.ogg
storageRemoveSound: /Audio/Effects/pill_remove.ogg
- whitelist:
- components:
- - Pill
- type: Dumpable
state: telecrystal
- type: Item
sprite: Objects/Specific/Syndicate/telecrystal.rsi
- size: 20
+ size: Tiny
- type: Stack
count: 20
stackType: Telecrystal
components:
- type: Stack
count: 1
- - type: Item
- size: 1
- type: entity
parent: Telecrystal
components:
- type: Stack
count: 5
- - type: Item
- size: 5
- type: entity
parent: Telecrystal
components:
- type: Stack
count: 10
- - type: Item
- size: 10
# Uplinks
- type: entity
sprite: Objects/Tools/access_configurator.rsi
state: icon
- type: Item
- size: 5
+ size: Small
- type: Clothing
sprite: Objects/Tools/access_configurator.rsi
quickEquip: false
- type: UserInterface
interfaces:
- key: enum.AccessOverriderUiKey.Key
- type: AccessOverriderBoundUserInterface
- - type: ActivatableUI
+ type: AccessOverriderBoundUserInterface
+ - type: ActivatableUI
key: enum.AccessOverriderUiKey.Key
- requireHands: true
- closeOnHandDeselect: false
- singleUser: true
+ requireHands: true
+ closeOnHandDeselect: false
+ singleUser: true
- type: ItemSlots
- type: ContainerContainer
containers:
state: fill-1
visible: false
- type: Item
- size: 100
+ size: Normal
- type: Clothing
sprite: Objects/Tools/bucket.rsi
slots:
sprite: Objects/Tools/cable-coils.rsi
- type: Item
sprite: Objects/Tools/cable-coils.rsi
- size: 30
+ size: Normal
- type: CablePlacer
- type: Clickable
- type: StaticPrice
state: coilhv-10
- type: Stack
count: 10
- - type: Item
- size: 10
- type: entity
parent: CableHVStack10
state: coilhv-10
- type: Stack
count: 1
- - type: Item
- size: 1
- type: entity
parent: CableStack
state: coilmv-10
- type: Stack
count: 10
- - type: Item
- size: 10
- type: entity
parent: CableMVStack10
state: coilmv-10
- type: Stack
count: 1
- - type: Item
- size: 1
- type: entity
parent: CableStack
state: coillv-10
- type: Stack
count: 10
- - type: Item
- size: 10
- type: entity
parent: CableApcStack10
state: coillv-10
- type: Stack
count: 1
- - type: Item
- size: 1
- type: Sprite
sprite: Objects/Tools/Cowtools/cowelder.rsi
- type: Item
- size: 10
+ size: Small
sprite: Objects/Tools/Cowtools/cowelder.rsi
- type: Tool
speed: 0.05
mask:
- Impassable
- type: Item
- size: 30
+ size: Normal
- type: Foldable
folded: true
- type: Clickable
components:
- type: Fulton
- type: Item
- size: 20
+ size: Normal
- type: Stack
stackType: Fulton
count: 10
suffix: One
components:
- type: Item
- size: 2
+ size: Small
- type: Stack
count: 1
sprite: Objects/Tanks/generic.rsi
state: icon
- type: Item
- size: 15
+ size: Normal
sprite: Objects/Tanks/generic.rsi
- type: Clothing
sprite: Objects/Tanks/generic.rsi
- type: Sprite
sprite: Objects/Tanks/emergency.rsi
- type: Item
- size: 10
+ size: Small
sprite: Objects/Tanks/emergency.rsi
- type: GasTank
outputPressure: 21.3
state: item_wall
- type: Item
sprite: Objects/Misc/inflatable_wall.rsi
- size: 10
+ size: Small
- type: SpawnAfterInteract
prototype: InflatableWall
doAfter: 1
state: item_door
- type: Item
sprite: Objects/Misc/inflatable_door.rsi
- size: 4
+ size: Small
- type: SpawnAfterInteract
prototype: InflatableDoor
doAfter: 1
components:
- type: Sprite
state: item_wall
- - type: Item
- size: 5
- type: Stack
count: 5
components:
- type: Sprite
state: item_wall
- - type: Item
- size: 1
- type: Stack
count: 1
components:
- type: Sprite
state: item_door
- - type: Item
- size: 1
- type: Stack
count: 1
sprite: Objects/Tools/jaws_of_life.rsi
state: jaws_pry
- type: Item
- size: 50
+ size: Normal
- type: Clothing
sprite: Objects/Tools/jaws_of_life.rsi
quickEquip: false
sprite: Objects/Tools/jaws_of_life.rsi
state: syn_jaws_pry
- type: Item
- size: 35
+ size: Normal
- type: Tool
qualities:
- Prying
state: icon
- type: Item
sprite: Objects/Tanks/Jetpacks/blue.rsi
- size: 100
+ size: Large
- type: UserInterface
interfaces:
- key: enum.SharedGasTankUiKey.Key
- Back
- type: Item
sprite: Objects/Tanks/Jetpacks/captain.rsi
- size: 30
+ size: Normal
- type: Tag
tags:
- HighRiskItem
visible: false
- state: basic_icon_top
- type: Item
- size: 1
+ size: Tiny
sprite: Objects/Tools/lighters.rsi
heldPrefix: off
- type: ItemCooldown
abstract: true
components:
- type: Storage
- capacity: 10
+ maxSlots: 7
+ maxTotalWeight: 14
- type: Item
- size: 10
+ size: Small
- type: entity
name: match stick
- type: Item
sprite: Objects/Tools/matches.rsi
heldPrefix: unlit
- size: 1
+ size: Tiny
- type: Matchstick
duration: 10
igniteSound:
- type: Item
sprite: Objects/Tools/matches.rsi
heldPrefix: matchbox
- size: 5
+ size: Small
- type: Storage
- capacity: 5
+ maxSlots: 5
+ maxTotalWeight: 5
- type: StorageFill
contents:
- id: Matchstick
sound:
path: /Audio/Items/toolbox_drop.ogg
- type: Storage
- capacity: 60
+ maxSlots: 7
+ maxItemSize: Normal
+ maxTotalWeight: 14
- type: Item
- size: 9999
+ size: Huge
- type: ItemCooldown
- type: MeleeWeapon
damage:
- type: Item
sprite: Objects/Tools/Toolboxes/toolbox_syn.rsi
- type: Storage
- capacity: 170 # this seems silly high
+ maxItemSize: Large
+ maxTotalWeight: 28
- type: MeleeWeapon
damage:
types:
state: icon
- type: Item
sprite: Objects/Tools/crowbar.rsi
- size: 10
+ size: Small
- type: ItemCooldown
- type: MeleeWeapon
wideAnimationRotation: -135
- state: green-unlit
shader: unshaded
- type: Item
- size: 5
+ size: Small
- type: Clothing
sprite: Objects/Tools/multitool.rsi
quickEquip: false
map: ["enum.NetworkConfiguratorLayers.ModeLight"]
shader: unshaded
- type: Item
- size: 5
+ size: Small
- type: Clothing
sprite: Objects/Tools/network_configurator.rsi
quickEquip: false
state: drill_screw
- type: Item
sprite: Objects/Tools/drill.rsi
- size: 10
+ size: Small
- type: Tool
qualities:
- Screwing
sprite: Objects/Tools/rcd.rsi
state: icon
- type: Item
- size: 20
+ size: Normal
- type: Clothing
sprite: Objects/Tools/rcd.rsi
quickEquip: false
state: omnitool-screwing
- type: Item
sprite: Objects/Tools/omnitool.rsi
- size: 20
+ size: Normal
- type: Tag
tags:
- Multitool
types:
Blunt: 14
- type: Item
- size: 90
+ size: Normal
sprite: Objects/Tools/shovel.rsi
- type: PhysicalComposition
materialComposition:
state: icon
- type: Item
sprite: Objects/Tools/rolling_pin.rsi
- size: 10
+ size: Small
- type: Clothing
sprite: Objects/Tools/rolling_pin.rsi
quickEquip: false
shader: unshaded
visible: false
- type: Item
- size: 10
+ size: Small
sprite: Objects/Tools/welder.rsi
- type: ToggleableLightVisuals
spriteLayer: flame
- type: Sprite
sprite: Objects/Tools/welder_mini.rsi
- type: Item
- size: 5
+ size: Tiny
sprite: Objects/Tools/welder_mini.rsi
- type: RefillableSolution
solution: Welder
description: Interesting design.
components:
- type: Item
- size: 2
+ size: Tiny
- type: Tag
tags:
- VehicleKey
map: ["base"]
- type: Item
sprite: Objects/Weapons/Bombs/hot_potato.rsi
- size: 5
+ size: Small
- type: AmbientSound
enabled: false
range: 8
map: ["base"]
- type: Item
sprite: Objects/Weapons/Bombs/c4.rsi
- size: 10
+ size: Small
- type: OnUseTimerTrigger
delay: 10
delayOptions: [10, 30, 60, 120, 300]
state: icon
- type: Item
sprite: Objects/Weapons/Bombs/spidercharge.rsi
- size: 10
+ size: Small
- type: SpiderCharge
- type: OnUseTimerTrigger
delay: 10
proto: CartridgeAntiMateriel
capacity: 10
- type: Item
- size: 5
+ size: Small
- type: ContainerContainer
containers:
ballistic-ammo: !type:Container
proto: CartridgeCaselessRifle
capacity: 60
- type: Item
- size: 5
+ size: Small
- type: ContainerContainer
containers:
ballistic-ammo: !type:Container
proto: CartridgeLightRifle
capacity: 50
- type: Item
- size: 5
+ size: Small
- type: ContainerContainer
containers:
ballistic-ammo: !type:Container
proto: CartridgeMagnum
capacity: 60
- type: Item
- size: 5
+ size: Small
- type: ContainerContainer
containers:
ballistic-ammo: !type:Container
proto: CartridgePistol
capacity: 60
- type: Item
- size: 5
+ size: Small
- type: ContainerContainer
containers:
ballistic-ammo: !type:Container
proto: CartridgeRifle
capacity: 60
- type: Item
- size: 5
+ size: Small
- type: ContainerContainer
containers:
ballistic-ammo: !type:Container
tags:
- Cartridge
- type: Item
- size: 1
+ size: Tiny
- type: SpaceGarbage
- type: EmitSoundOnLand
sound:
proto: CartridgeCaselessRifle
capacity: 30
- type: Item
- size: 5
+ size: Small
- type: ContainerContainer
containers:
ballistic-ammo: !type:Container
proto: CartridgeCaselessRifle
capacity: 10
- type: Item
- size: 3
+ size: Tiny
- type: Sprite
sprite: Objects/Weapons/Guns/Ammunition/Magazine/CaselessRifle/caseless_rifle_mag_short.rsi
layers:
proto: CartridgeCaselessRifle
capacity: 10
- type: Item
- size: 5
+ size: Small
- type: Sprite
sprite: Objects/Weapons/Guns/Ammunition/Magazine/CaselessRifle/caseless_pistol_mag.rsi
layers:
tags:
- MagazineHeavyRifle
- type: Item
- size: 10
+ size: Small
- type: BallisticAmmoProvider
mayTransfer: true
capacity: 100
proto: CartridgeLightRifle
capacity: 30
- type: Item
- size: 5
+ size: Small
- type: ContainerContainer
containers:
ballistic-ammo: !type:Container
- CartridgeMagnum
capacity: 25
- type: Item
- size: 10
+ size: Small
- type: ContainerContainer
containers:
ballistic-ammo: !type:Container
- CartridgePistol
capacity: 10
- type: Item
- size: 5
+ size: Small
- type: ContainerContainer
containers:
ballistic-ammo: !type:Container
- CartridgePistol
capacity: 16
- type: Item
- size: 5
+ size: Small
- type: ContainerContainer
containers:
ballistic-ammo: !type:Container
- CartridgePistol
capacity: 35
- type: Item
- size: 10
+ size: Small
- type: ContainerContainer
containers:
ballistic-ammo: !type:Container
tags:
- MagazineRifle
- type: Item
- size: 5
+ size: Small
- type: BallisticAmmoProvider
mayTransfer: true
whitelist:
soundRack:
path: /Audio/Weapons/Guns/Cock/smg_cock.ogg
- type: Item
- size: 5
+ size: Small
- type: ContainerContainer
containers:
ballistic-ammo: !type:Container
tags:
- CartridgeRocket
- type: Item
- size: 5
+ size: Small
- type: CartridgeAmmo
proto: BulletRocket
deleteOnSpawn: true
tags:
- CartridgeRocket
- type: Item
- size: 5
+ size: Small
- type: CartridgeAmmo
proto: BulletWeakRocket
deleteOnSpawn: true
tags:
- Grenade
- type: Item
- size: 5
+ size: Small
- type: Sprite
- type: entity
sprite: Objects/Weapons/Guns/Basic/kinetic_accelerator.rsi
- type: Item
sprite: Objects/Weapons/Guns/Basic/kinetic_accelerator.rsi
- size: 30
+ size: Normal
- type: GunWieldBonus
minAngle: -43
maxAngle: -43
sprite: Objects/Weapons/Guns/Basic/staves.rsi
- type: Item
heldPrefix: staff
- size: 60
+ size: Normal
- type: Gun
fireRate: 1
selectedMode: SemiAuto
sprite: Objects/Weapons/Guns/Basic/wands.rsi
- type: Item
heldPrefix: wand
- size: 30
+ size: Normal
- type: Gun
fireRate: 0.5
selectedMode: SemiAuto
state: icon
- type: Item
sprite: Objects/Weapons/Guns/Basic/spraynozzle.rsi
- size: 30
+ size: Normal
- type: Gun
cameraRecoilScalar: 0 #no recoil
fireRate: 4
slots: BELT
- type: Item
sprite: Objects/Weapons/Guns/Pistols/water_pistol.rsi
- size: 10
+ size: Small
- type: Gun
clumsyProof: true
cameraRecoilScalar: 0 #no recoil
map: [ "enum.DamageStateVisualLayers.Base" ]
- type: Item
sprite: Objects/Weapons/Guns/Pistols/soaker.rsi
- size: 35
+ size: Normal
- type: RandomSprite
getAllGroups: true
available:
map: [ "enum.DamageStateVisualLayers.Base" ]
- type: Item
sprite: Objects/Weapons/Guns/Pistols/soaker.rsi
- size: 35
+ size: Normal
- type: RandomSprite
getAllGroups: true
available:
components:
- type: Sprite
- type: Item
- size: 50
+ size: Large
- type: Clothing
sprite: Objects/Weapons/Guns/Battery/laser_retro.rsi
quickEquip: false
abstract: true
components:
- type: Item
- size: 10
+ size: Small
- type: Tag
tags:
- Sidearm
description: An experimental high-energy laser pistol with a self-charging nuclear battery.
components:
- type: Item
- size: 30 # Intentionally larger than other pistols
+ size: Normal # Intentionally larger than other pistols
- type: Sprite
sprite: Objects/Weapons/Guns/Battery/advancedlasergun.rsi
layers:
- type: Sprite
sprite: Objects/Weapons/Guns/Bow/bow.rsi
- type: Item
- size: 60
+ size: Normal
- type: Clothing
quickEquip: false
slots:
components:
- type: Sprite
- type: Item
+ size: Huge
- type: Gun
fireRate: 20
selectedMode: FullAuto
map: ["enum.GunVisualLayers.Base"]
- type: Item
sprite: Objects/Weapons/Guns/HMGs/minigun.rsi
- size: 90
- type: Gun
fireRate: 15
soundGunshot:
components:
- type: Sprite
- type: Item
- size: 60
+ size: Large
- type: Clothing
sprite: Objects/Weapons/Guns/LMGs/l6.rsi
quickEquip: false
slots:
- Back
- type: Item
- size: 60
+ size: Large
- type: StaticPrice
price: 500
- type: ContainerContainer
- state: mag-0
map: ["enum.GunVisualLayers.Mag"]
- type: Item
- size: 10
+ size: Small
- type: Tag
tags:
- Sidearm
abstract: true
components:
- type: Item
- size: 10
+ size: Small
- type: Sprite
sprite: Objects/Weapons/Guns/Projectiles/arrows.rsi
- type: Fixtures
- type: Sprite
state: icon
- type: Item
- size: 10
+ size: Small
- type: Tag
tags:
- Sidearm
params:
volume: 2.25
-- type: entity
+- type: entity
name: Python
parent: WeaponRevolverPython
id: WeaponRevolverPythonAP # For the uplink.
- type: RevolverAmmoProvider
capacity: 5
chambers: [ True, True, True, True, True ]
- ammoSlots: [ null, null, null, null, null ]
\ No newline at end of file
+ ammoSlots: [ null, null, null, null, null ]
components:
- type: Sprite
- type: Item
- size: 50
+ size: Large
- type: Clothing
sprite: Objects/Weapons/Guns/Rifles/ak.rsi
quickEquip: false
components:
- type: Sprite
- type: Item
- size: 30
+ size: Normal
- type: Clothing
sprite: Objects/Weapons/Guns/SMGs/atreides.rsi
quickEquip: false
map: [ "enum.GunVisualLayers.Base" ]
- type: Item
# If you update this also update the bulldog's size.
- size: 30
+ size: Large
- type: Clothing
sprite: Objects/Weapons/Guns/Shotguns/db_shotgun.rsi
quickEquip: false
map: ["enum.GunVisualLayers.Base"]
- state: mag-0
map: ["enum.GunVisualLayers.Mag"]
- - type: Item
- size: 30
- type: Clothing
sprite: Objects/Weapons/Guns/Shotguns/bulldog.rsi
quickEquip: false
- type: Clothing
sprite: Objects/Weapons/Guns/Shotguns/enforcer.rsi
- type: BallisticAmmoProvider
-
+
- type: entity
name: Enforcer
parent: BaseWeaponShotgun
sprite: Objects/Weapons/Guns/Shotguns/enforcer.rsi
- type: BallisticAmmoProvider
proto: ShellShotgunBeanbag
-
+
- type: entity
name: Kammerer
parent: BaseWeaponShotgun
sprite: Objects/Weapons/Guns/Shotguns/pump.rsi
- type: Clothing
sprite: Objects/Weapons/Guns/Shotguns/pump.rsi
+ - type: Item
+ size: Normal
- type: BallisticAmmoProvider
capacity: 4
- type: Clothing
sprite: Objects/Weapons/Guns/Shotguns/sawn.rsi
- type: Item
- size: 10
+ size: Small
- type: Gun
fireRate: 4
- type: BallisticAmmoProvider
sprite: Objects/Weapons/Guns/Shotguns/hm_pistol.rsi
- type: Clothing
sprite: Objects/Weapons/Guns/Shotguns/hm_pistol.rsi
- - type: Item
- size: 10
- type: Gun
fireRate: 4
- type: BallisticAmmoProvider
sprite: Objects/Weapons/Guns/Shotguns/improvised_shotgun.rsi
- type: Clothing
sprite: Objects/Weapons/Guns/Shotguns/improvised_shotgun.rsi
- - type: Item
- size: 75
- type: Gun
fireRate: 4 #No reason to stifle the firerate since you have to manually reload every time anyways.
- type: BallisticAmmoProvider
- state: base
map: ["enum.GunVisualLayers.Base"]
- type: Item
- size: 50
+ size: Large
- type: Clothing
sprite: Objects/Weapons/Guns/Snipers/bolt_gun_wood.rsi
quickEquip: false
- state: icon
map: ["enum.GunVisualLayers.Base"]
- type: Item
- size: 10
+ size: Small
sprite: Objects/Weapons/Guns/Shotguns/flaregun.rsi
- type: Gun
fireRate: 8
map: [ "tank" ]
visible: false
- type: Item
- size: 50
+ size: Large
- type: Clothing
quickEquip: false
slots:
container: storagebase
- type: PneumaticCannon
- type: Storage
- capacity: 30
+ maxSlots: 8
+ maxItemSize: Normal
+ maxTotalWeight: 32
blacklist:
tags:
- CannonRestrict
layers:
- state: piecannon
- type: Storage
+ maxSlots: 8
+ maxItemSize: Normal
+ maxTotalWeight: 32
whitelist:
components:
- CreamPie
- capacity: 40
- type: Gun
fireRate: 1
selectedMode: SemiAuto
- type: ContainerAmmoProvider
container: storagebase
- type: Item
- size: 50
+ size: Normal
- type: Clothing
sprite: Objects/Weapons/Guns/Cannons/pie_cannon.rsi
quickEquip: false
suffix: Admeme
components:
- type: Item
- size: 9999
+ size: Huge
- type: Storage
- capacity: 9999
+ maxSlots: 100
+ maxItemSize: Huge
+ maxTotalWeight: 1600
+ whitelist:
+ tags: [] #dodging a test fail like the IRS
- type: PneumaticCannon
gasUsage: 0
throwItems: false
Slash: 25\r
Piercing: 15\r
- type: Item\r
- size: 15\r
+ size: Normal\r
sprite: Objects/Weapons/Melee/armblade.rsi\r
- type: Tool\r
qualities:\r
types:
Blunt: 8
- type: Item
- size: 80
+ size: Normal
- type: Tool
qualities:
- Rolling
Blunt: 5
Structural: 20
- type: Item
- size: 50
+ size: Normal
sprite: Objects/Weapons/Melee/chainsaw.rsi
- type: DisarmMalus
- type: RefillableSolution
types:
Slash: 12
- type: Item
- size: 20
+ size: Normal
- type: Clothing
sprite: Objects/Weapons/Melee/cult_dagger.rsi
slots:
types:
Slash: 33
- type: Item
- size: 20
+ size: Normal
- type: Clothing
sprite: Objects/Weapons/Melee/cult_blade.rsi
slots:
Slash: 12
Structural: 30
- type: Item
- size: 150
+ size: Huge
- type: Clothing
sprite: Objects/Weapons/Melee/cult_halberd.rsi
quickEquip: false
types:
Blunt: 4.5
- type: Item
- size: 5
+ size: Small
sprite: Objects/Weapons/Melee/e_sword.rsi
- type: UseDelay
delay: 1.0
types:
Blunt: 1
- type: Item
- size: 2
+ size: Tiny
sprite: Objects/Weapons/Melee/e_dagger.rsi
- type: UseDelay
delay: 1.0
shader: unshaded
map: [ "blade" ]
- type: Item
- size: 5
+ size: Small
sprite: Objects/Weapons/Melee/e_cutlass.rsi
- type: entity
shader: unshaded
map: [ "blade" ]
- type: Item
- size: 10
+ size: Small
sprite: Objects/Weapons/Melee/e_sword_double.rsi
- type: Reflect
enabled: true
Slash: 10.5
Structural: 60
- type: Item
- size: 150
+ size: Huge
- type: Clothing
sprite: Objects/Weapons/Melee/fireaxe.rsi
quickEquip: false
types:
Blunt: 3 #You'd be better off punching people
- type: Item
- size: 12
+ size: Small
sprite: Objects/Weapons/Melee/gohei.rsi
- Knife
- type: Sprite
sprite: Objects/Weapons/Melee/kitchen_knife.rsi
- size: 2
state: icon
- type: Item
- size: 10
+ size: Small
sprite: Objects/Weapons/Melee/kitchen_knife.rsi
- type: GuideHelp
guides:
- Knife
- type: Sprite
sprite: Objects/Weapons/Melee/cleaver.rsi
- size: 4
state: butch
- type: MeleeWeapon
wideAnimationRotation: -135
types:
Slash: 10
- type: Item
- size: 10
+ size: Small
sprite: Objects/Weapons/Melee/cleaver.rsi
- type: GuideHelp
guides:
- Knife
- type: Sprite
sprite: Objects/Weapons/Melee/combat_knife.rsi
- size: 2
+ size: Tiny
state: icon
- type: MeleeWeapon
wideAnimationRotation: -135
types:
Slash: 10
- type: Item
- size: 10
+ size: Small
sprite: Objects/Weapons/Melee/combat_knife.rsi
- type: DisarmMalus
malus: 0.225
components:
- type: Sprite
sprite: Objects/Weapons/Melee/survival_knife.rsi
- size: 2
+ size: Tiny
state: icon
- type: Item
- size: 10
+ size: Small
sprite: Objects/Weapons/Melee/survival_knife.rsi
- type: entity
components:
- type: Sprite
sprite: Objects/Weapons/Melee/kukri_knife.rsi
- size: 2
+ size: Tiny
state: icon
- type: MeleeWeapon
attackRate: 1.0
types:
Slash: 15
- type: Item
- size: 10
+ size: Small
sprite: Objects/Weapons/Melee/kukri_knife.rsi
- type: entity
node: icon
- type: Sprite
sprite: Objects/Weapons/Melee/shiv.rsi
- size: 2
+ size: Tiny
state: icon
- type: MeleeWeapon
attackRate: 1.5
types:
Slash: 5.5
- type: Item
- size: 4 #as much as a regular glass shard
+ size: Tiny #as much as a regular glass shard
sprite: Objects/Weapons/Melee/shiv.rsi
- type: DisarmMalus
malus: 0.225
- type: Construction
graph: ReinforcedShiv
node: icon
- size: 2
+ size: Tiny
state: icon
- type: MeleeWeapon
attackRate: 1.5
Slash: 2.5
- type: GunRequiresWield
- type: Item
- size: 150
+ size: Huge
- type: DisarmMalus
- type: Tool
qualities:
types:
Slash: 6.5
- type: Item
- size: 10
+ size: Small
- type: Tag
tags:
- Knife
wideAnimationRotation: -135
attackRate: 1.25
- type: Item
- size: 150
+ size: Huge
types:
Piercing: 1
- type: Item
- size: 1
+ size: Tiny
- type: BalloonPopper
types:
Structural: 10
- type: Item
- size: 80
+ size: Normal
sprite: Objects/Weapons/Melee/pickaxe.rsi
- type: UseDelay
delay: 1
types:
Piercing: 15
- type: Item
- size: 95
+ size: Huge
- type: Clothing
quickEquip: false
slots:
- type: ItemCooldown
- type: Item
heldPrefix: off
- size: 100
+ size: Large
- type: Clothing
sprite: Objects/Weapons/Melee/stunprod.rsi
quickEquip: false
reflectProb: .5
spread: 90
- type: Item
- size: 15
+ size: Normal
sprite: Objects/Weapons/Melee/captain_sabre.rsi
- type: Tag
tags:
soundHit:
path: /Audio/Weapons/bladeslice.ogg
- type: Item
- size: 15
+ size: Normal
sprite: Objects/Weapons/Melee/katana.rsi
- type: DisarmMalus
types:
Slash: 30
- type: Item
- size: 15
+ size: Normal
sprite: Objects/Weapons/Melee/energykatana.rsi
- type: EnergyKatana
- type: DashAbility
soundHit:
path: /Audio/Weapons/bladeslice.ogg
- type: Item
- size: 15
+ size: Normal
sprite: Objects/Weapons/Melee/machete.rsi
- type: DisarmMalus
soundHit:
path: /Audio/Weapons/bladeslice.ogg
- type: Item
- size: 20
+ size: Normal
- type: Clothing
sprite: Objects/Weapons/Melee/claymore.rsi
slots:
soundHit:
path: /Audio/Weapons/bladeslice.ogg
- type: Item
- size: 15
+ size: Normal
sprite: Objects/Weapons/Melee/cutlass.rsi
- type: DisarmMalus
sprite: Objects/Tools/Toolboxes/toolbox_red.rsi
state: icon
- type: Item
- size: 150
+ size: Huge
sprite: Objects/Tools/Toolboxes/toolbox_red.rsi
- type: MeleeWeapon
wideAnimationRotation: -135
sprite: Objects/Weapons/Melee/white_cane.rsi
state: icon
- type: Item
- size: 15
+ size: Normal
sprite: Objects/Weapons/Melee/white_cane.rsi
- type: MeleeWeapon
wideAnimationRotation: 45
description: Linked together with some spare cuffs and metal.
components:
- type: Item
- size: 20
+ size: Normal
- type: Sprite
sprite: Objects/Weapons/Throwable/bola.rsi
state: icon
- state: icon
map: ["enum.TriggerVisualLayers.Base"]
- type: Item
- size: 5
+ size: Small
- type: Clothing
quickEquip: false
slots:
- state: empty
map: [ "enum.ConstructionVisuals.Layer" ]
- type: Item
- size: 8
+ size: Small
- type: PayloadCase
- type: Construction
graph: ModularGrenadeGraph
- type: ItemCooldown
- type: Item
heldPrefix: off
- size: 20
+ size: Normal
- type: Clothing
sprite: Objects/Weapons/Melee/stunbaton.rsi
quickEquip: false
Blunt: 20
bluntStaminaDamageFactor: 1.5
- type: Item
- size: 20
+ size: Normal
- type: Clothing
sprite: Objects\Weapons\Melee\truncheon.rsi
quickEquip: false
Blunt: 0 # melee weapon to allow flashing individual targets
angle: 10
- type: Item
- size: 5
+ size: Small
sprite: Objects/Weapons/Melee/flash.rsi
- type: ItemCooldown
- type: StaticPrice
abstract: true
components:
- type: Item
- size: 5
+ size: Small
- type: Clickable
- type: InteractionOutline
- type: MovedByPressure
- type: Pullable
- type: Occluder
- type: Storage
- capacity: 200
+ maxSlots: 32
+ maxItemSize: Normal
whitelist:
tags:
- Document
map: ["foldedLayer"]
visible: false
- type: Item
- size: 50
+ size: Large
- type: Appearance
- type: MeleeWeapon
damage:
- type: Rotatable
- type: Sprite
state: steel-bench
-
+
- !type:DoActsBehavior
acts: [ "Destruction" ]
- type: Storage
- capacity: 50
+ maxSlots: 6
+ maxItemSize: Normal
- type: ContainerContainer
containers:
storagebase: !type:Container
- id: ClothingUniformJumpskirtColorPink
prob: 0.05
- id: ClothingUniformJumpsuitLoungewear
- prob: 0.05
+ prob: 0.05
orGroup: dressermainloot
- id: Pen # It`s pen.
prob: 0.03
prob: 0.03
orGroup: dressermainloot
- id: ClothingUniformJumpsuitColorRed
- prob: 0.03
+ prob: 0.03
orGroup: dressermainloot
- id: ClothingUniformJumpskirtColorRed
prob: 0.03
prob: 0.03
orGroup: dresserthirdloot
- id: ClothingUnderSocksCoder
- prob: 0.03
+ prob: 0.03
orGroup: dressermainloot
- id: ClothingUnderSocksBee
prob: 0.03
orGroup: dresserthirdloot
- id: PlushieLizard
prob: 0.03
- orGroup: dresserthirdloot
+ orGroup: dresserthirdloot
- id: ClothingOuterSuitShrineMaiden
prob: 0.03
orGroup: dressersecondloot
- id: BrokenBottle
prob: 0.001
orGroup: dressersecondloot
- - id: FoodMeatRotten
+ - id: FoodMeatRotten
prob: 0.001
orGroup: dressersecondloot
- id: ClothingOuterSkub
- type: Transform
noRot: true
- type: Item
- size: 25
+ size: Normal
- type: Sprite
sprite: Structures/Furniture/rollerbeds.rsi
noRot: true
mode: SnapgridCenter
components:
- type: Item
- size: 10
+ size: Normal
- type: Transform
anchored: true
- type: Damageable
description: Air sensor assembly. An assembly of air sensors?
components:
- type: Item
- size: 10
+ size: Small
- type: Anchorable
- type: Construction
graph: AirSensor
description: A cabinet for all your filing needs.
components:
- type: Storage
- capacity: 80
+ maxSlots: 12
+ maxItemSize: Normal
whitelist:
tags:
- Document
description: A small drawer for all your filing needs, Now with wheels!
components:
- type: Storage
- capacity: 50
+ maxSlots: 8
+ maxItemSize: Normal
whitelist:
tags:
- Document
True: { visible: false }
False: { visible: true }
- type: Storage
- capacity: 525
+ maxSlots: 60
+ maxItemSize: Normal
storageOpenSound: /Audio/Effects/closetopen.ogg
storageCloseSound: /Audio/Effects/closetclose.ogg
whitelist:
storagebase: !type:Container
ents: [ ]
- type: Storage
- capacity: 50
+ maxSlots: 5
+ maxItemSize: Huge
+ maxTotalWeight: 40
- type: artifactEffect
id: EffectPhasing