Salvage / Borg Tweaks (#2145)

<!--
This is a semi-strict format, you can add/remove sections as needed but
the order/format should be kept the same
Remove these comments before submitting
-->

# Description

<!--
Explain this PR in as much detail as applicable

Some example prompts to consider:
How might this affect the game? The codebase?
What might be some alternatives to this?
How/Who does this benefit/hurt [the game/codebase]?
-->

Originally started because I wanted to add some stuff to salvage, but
ended up with me porting over whitelisted borg hands, the PKA module,
and some other stuff.

---

# Changelog

<!--
You can add an author after the `🆑` to change the name that appears
in the changelog (ex: `🆑 Death`)
Leaving it blank will default to your GitHub display name
This includes all available types for the changelog
-->

🆑
- add: Engi borgs can now carry electronics, and medical borgs can carry
organs
- add: Salvage borgs now get a PKA module
- tweak: All mining drills have had their damage turned to piercing and
have received a moderate damage buff
- tweak: Exosuit drills now swing at the same speed as normal drills
(why were they worse???)
- tweak: The RPD and RCD modules for borg have been merged into one
- tweak: Salvage can now purchase drills from their vendor
- tweak: Salvage borgs mining module no longer contains a shovel

---------

Co-authored-by: Your Name <EctoplasmIsGood@users.noreply.github.com>
Co-authored-by: Whatstone <whatston3@gmail.com>
Co-authored-by: RatherUncreative <RatherUncreativeName@proton.me>
Co-authored-by: Aidenkrz <aiden@djkraz.com>
(cherry picked from commit ed8850e551bd9c0d533d69cad262a8743442a62a)
This commit is contained in:
EctoplasmIsGood
2025-04-03 02:30:33 -05:00
committed by Spatison
parent 1ae1e9f913
commit 9a65bedfc4
61 changed files with 666 additions and 280 deletions

View File

@@ -13,6 +13,7 @@ using Robust.Client.UserInterface.Controllers;
using Robust.Shared.Input;
using Robust.Shared.Timing;
using Robust.Shared.Utility;
using Content.Shared._NF.Interaction.Components;
namespace Content.Client.UserInterface.Systems.Hands;
@@ -133,6 +134,13 @@ public sealed class HandsUIController : UIController, IOnStateEntered<GameplaySt
handButton.SetEntity(virt.BlockingEntity);
handButton.Blocked = true;
}
// Frontier - borg hand placeholder
else if (_entities.TryGetComponent(hand.HeldEntity, out HandPlaceholderVisualsComponent? placeholder))
{
handButton.SetEntity(placeholder.Dummy);
handButton.Blocked = true;
}
// End Frontier - borg hand placeholder
else
{
handButton.SetEntity(hand.HeldEntity);
@@ -184,6 +192,13 @@ public sealed class HandsUIController : UIController, IOnStateEntered<GameplaySt
hand.SetEntity(virt.BlockingEntity);
hand.Blocked = true;
}
// Frontier: borg hand placeholders
else if (_entities.TryGetComponent(entity, out HandPlaceholderVisualsComponent? placeholder))
{
hand.SetEntity(placeholder.Dummy);
hand.Blocked = true;
}
// End Frontier: borg hand placeholders
else
{
hand.SetEntity(entity);

View File

@@ -0,0 +1,13 @@
using Robust.Client.UserInterface;
using Robust.Client.UserInterface.XAML;
namespace Content.Client._NF.Hands.UI
{
public sealed class HandPlaceholderStatus : Control
{
public HandPlaceholderStatus()
{
RobustXamlLoader.Load(this);
}
}
}

View File

@@ -0,0 +1,3 @@
<Control xmlns="https://spacestation14.io">
<Label StyleClasses="ItemStatus" Text="{Loc 'hand-placeholder-name'}" />
</Control>

View File

@@ -0,0 +1,10 @@
namespace Content.Shared._NF.Interaction.Components;
[RegisterComponent]
// Client-side component of the HandPlaceholder. Creates and tracks a client-side entity for hand blocking visuals
public sealed partial class HandPlaceholderVisualsComponent : Component
{
[DataField]
public EntityUid Dummy;
}

View File

@@ -0,0 +1,47 @@
using Content.Client._NF.Hands.UI;
using Content.Client.Items;
using Content.Client.Items.Systems;
using Content.Shared._NF.Interaction.Components;
using JetBrains.Annotations;
using Robust.Client.GameObjects;
namespace Content.Client._NF.Interaction.Systems;
/// <summary>
/// Handles interactions with items that spawn HandPlaceholder items.
/// </summary>
[UsedImplicitly]
public sealed partial class HandPlaceholderVisualsSystem : EntitySystem
{
[Dependency] ContainerSystem _container = default!;
[Dependency] ItemSystem _item = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<HandPlaceholderComponent, AfterAutoHandleStateEvent>(OnAfterAutoHandleState);
SubscribeLocalEvent<HandPlaceholderVisualsComponent, ComponentRemove>(PlaceholderRemove);
Subs.ItemStatus<HandPlaceholderVisualsComponent>(_ => new HandPlaceholderStatus());
}
private void OnAfterAutoHandleState(Entity<HandPlaceholderComponent> ent, ref AfterAutoHandleStateEvent args)
{
if (!TryComp(ent, out HandPlaceholderVisualsComponent? placeholder))
return;
if (placeholder.Dummy != EntityUid.Invalid)
QueueDel(placeholder.Dummy);
placeholder.Dummy = Spawn(ent.Comp.Prototype);
if (_container.IsEntityInContainer(ent))
_item.VisualsChanged(ent);
}
private void PlaceholderRemove(Entity<HandPlaceholderVisualsComponent> ent, ref ComponentRemove args)
{
if (ent.Comp.Dummy != EntityUid.Invalid)
QueueDel(ent.Comp.Dummy);
}
}

View File

@@ -104,7 +104,7 @@ public sealed class MaterialArbitrageTest
continue;
var stackProto = protoManager.Index<StackPrototype>(materialStep.MaterialPrototypeId);
var spawnProto = protoManager.Index<EntityPrototype>(stackProto.Spawn);
var spawnProto = protoManager.Index(stackProto.Spawn);
if (!spawnProto.Components.ContainsKey(materialName) ||
!spawnProto.Components.TryGetValue(compositionName, out var compositionReg))

View File

@@ -28,7 +28,8 @@ public sealed class PrototypeSaveTest
{
// The only prototypes that should get ignored are those that REQUIRE setup to get a sprite. At that point it is
// the responsibility of the spawner to ensure that a valid sprite is set.
"VirtualItem"
"VirtualItem",
"HandPlaceholder" // Frontier
};
[Test]

View File

@@ -59,23 +59,27 @@ public sealed class MachineFrameSystem : EntitySystem
return;
}
// Machine parts cannot currently satisfy stack/component/tag restrictions. Similarly stacks cannot satisfy
// component/tag restrictions. However, there is no reason this cannot be supported in the future. If this
// changes, then RegenerateProgress() also needs to be updated.
//
// If this changes in the future, then RegenerateProgress() also needs to be updated.
// Note that one entity is ALLOWED to satisfy more than one kind of component or tag requirements. This is
// necessary in order to avoid weird entity-ordering shenanigans in RegenerateProgress().
var stack = CompOrNull<StackComponent>(args.Used);
var machinePart = CompOrNull<MachinePartComponent>(args.Used);
if (stack != null && machinePart != null)
{
if (TryInsertPartStack(uid, args.Used, component, machinePart, stack))
args.Handled = true;
return;
}
// Handle parts
if (TryComp<MachinePartComponent>(args.Used, out var machinePart))
if (machinePart != null)
{
if (TryInsertPart(uid, args.Used, component, machinePart))
args.Handled = true;
return;
}
// Handle stacks
if (TryComp<StackComponent>(args.Used, out var stack))
if (stack != null)
{
if (TryInsertStack(uid, args.Used, component, stack))
args.Handled = true;
@@ -191,6 +195,44 @@ public sealed class MachineFrameSystem : EntitySystem
return true;
}
/// <returns>Whether or not the function had any effect. Does not indicate success.</returns>
private bool TryInsertPartStack(EntityUid uid, EntityUid used, MachineFrameComponent component, MachinePartComponent machinePart, StackComponent stack)
{
if (!component.Requirements.ContainsKey(machinePart.PartType))
return false;
var progress = component.Progress[machinePart.PartType];
var requirement = component.Requirements[machinePart.PartType];
var needed = requirement - progress;
if (needed <= 0)
return false;
var count = stack.Count;
if (count < needed)
{
if (!_container.Insert(used, component.PartContainer))
return true;
component.Progress[machinePart.PartType] += count;
return true;
}
var splitStack = _stack.Split(used, needed, Transform(uid).Coordinates, stack);
if (splitStack == null)
return false;
if (!_container.Insert(splitStack.Value, component.PartContainer))
return true;
component.Progress[machinePart.PartType] += needed;
if (IsComplete(component))
_popupSystem.PopupEntity(Loc.GetString("machine-frame-component-on-complete"), uid);
return true;
}
/// <returns>Whether or not the function had any effect. Does not indicate success.</returns>
private bool TryInsertStack(EntityUid uid, EntityUid used, MachineFrameComponent component, StackComponent stack)
{
@@ -328,8 +370,6 @@ public sealed class MachineFrameSystem : EntitySystem
{
if (TryComp<MachinePartComponent>(part, out var machinePart))
{
DebugTools.Assert(!HasComp<StackComponent>(part));
// Check this is part of the requirements...
if (!component.Requirements.ContainsKey(machinePart.PartType))
continue;
@@ -338,7 +378,6 @@ public sealed class MachineFrameSystem : EntitySystem
component.Progress[machinePart.PartType] = 1;
else
component.Progress[machinePart.PartType]++;
continue;
}

View File

@@ -5,6 +5,7 @@ using Content.Shared.Silicons.Borgs.Components;
using Content.Shared.Whitelist;
using Content.Server.Silicons.Borgs.Components;
using Robust.Shared.Containers;
using Content.Shared._NF.Interaction.Components; // Frontier
namespace Content.Server.Silicons.Borgs;
@@ -230,6 +231,63 @@ public sealed partial class BorgSystem
component.ProvidedItems.Add(handId, item);
}
// Frontier: droppable cyborg items
foreach (var itemProto in component.DroppableItems)
{
EntityUid item;
if (!component.ItemsCreated)
{
item = Spawn(itemProto.ID, xform.Coordinates);
var placeComp = EnsureComp<HandPlaceholderRemoveableComponent>(item);
placeComp.Whitelist = itemProto.Whitelist;
placeComp.Prototype = itemProto.ID;
Dirty(item, placeComp);
}
else
{
item = component.ProvidedContainer.ContainedEntities
.FirstOrDefault(ent => _whitelistSystem.IsWhitelistPassOrNull(itemProto.Whitelist, ent) || TryComp<HandPlaceholderComponent>(ent, out var placeholder));
if (!item.IsValid())
{
Log.Debug($"no items found: {component.ProvidedContainer.ContainedEntities.Count}");
continue;
}
// Just in case, make sure the borg can't drop the placeholder.
if (!HasComp<HandPlaceholderComponent>(item))
{
var placeComp = EnsureComp<HandPlaceholderRemoveableComponent>(item);
placeComp.Whitelist = itemProto.Whitelist;
placeComp.Prototype = itemProto.ID;
Dirty(item, placeComp);
}
}
if (!item.IsValid())
{
Log.Debug("no valid item");
continue;
}
var handId = $"{uid}-item{component.HandCounter}";
component.HandCounter++;
_hands.AddHand(chassis, handId, HandLocation.Middle, hands);
_hands.DoPickup(chassis, hands.Hands[handId], item, hands);
if (hands.Hands[handId].HeldEntity != item)
{
// If we didn't pick up our expected item, delete the hand. No free hands!
_hands.RemoveHand(chassis, handId);
}
else if (HasComp<HandPlaceholderComponent>(item))
{
// Placeholders can't be put down, must be changed after picked up (otherwise it'll fail to pick up)
EnsureComp<UnremoveableComponent>(item);
}
component.DroppableProvidedItems.Add(handId, (item, itemProto));
}
// End Frontier: droppable cyborg items
component.ItemsCreated = true;
}
@@ -249,6 +307,14 @@ public sealed partial class BorgSystem
_hands.RemoveHand(chassis, hand, hands);
}
component.ProvidedItems.Clear();
// Frontier: droppable items
foreach (var (hand, item) in component.DroppableProvidedItems)
{
QueueDel(item.Item1);
_hands.RemoveHand(chassis, hand, hands);
}
component.DroppableProvidedItems.Clear();
// End Frontier: droppable items
return;
}
@@ -262,6 +328,20 @@ public sealed partial class BorgSystem
_hands.RemoveHand(chassis, handId, hands);
}
component.ProvidedItems.Clear();
// Frontier: remove all items from borg hands directly, not from the provided items set
foreach (var (handId, _) in component.DroppableProvidedItems)
{
_hands.TryGetHand(chassis, handId, out var hand, hands);
if (hand?.HeldEntity != null)
{
RemComp<UnremoveableComponent>(hand.HeldEntity.Value);
_container.Insert(hand.HeldEntity.Value, component.ProvidedContainer);
}
_hands.RemoveHand(chassis, handId, hands);
}
component.DroppableProvidedItems.Clear();
// End Frontier
}
/// <summary>
@@ -288,13 +368,16 @@ public sealed partial class BorgSystem
if (TryComp<ItemBorgModuleComponent>(module, out var itemModuleComp))
{
var droppableComparer = new DroppableBorgItemComparer(); // Frontier: cached comparer
foreach (var containedModuleUid in component.ModuleContainer.ContainedEntities)
{
if (!TryComp<ItemBorgModuleComponent>(containedModuleUid, out var containedItemModuleComp))
continue;
if (containedItemModuleComp.Items.Count == itemModuleComp.Items.Count &&
containedItemModuleComp.Items.All(itemModuleComp.Items.Contains))
containedItemModuleComp.DroppableItems.Count == itemModuleComp.DroppableItems.Count && // Frontier
containedItemModuleComp.Items.All(itemModuleComp.Items.Contains) &&
containedItemModuleComp.DroppableItems.All(x => itemModuleComp.DroppableItems.Contains(x, droppableComparer))) // Frontier
{
if (user != null)
Popup.PopupEntity(Loc.GetString("borg-module-duplicate"), uid, user.Value);
@@ -306,6 +389,30 @@ public sealed partial class BorgSystem
return true;
}
// Frontier: droppable borg item comparator
private sealed class DroppableBorgItemComparer : IEqualityComparer<DroppableBorgItem>
{
public bool Equals(DroppableBorgItem? x, DroppableBorgItem? y)
{
// Same object (or both null)
if (ReferenceEquals(x, y))
return true;
// One-side null
if (x == null || y == null)
return false;
// Otherwise, use EntProtoId of item
return x.ID == y.ID;
}
public int GetHashCode(DroppableBorgItem obj)
{
if (obj is null)
return 0;
return obj.ID.GetHashCode();
}
}
// End Frontier
/// <summary>
/// Check if a module can be removed from a borg.
/// </summary>

View File

@@ -51,7 +51,7 @@ namespace Content.Server.Stack
// Get a prototype ID to spawn the new entity. Null is also valid, although it should rarely be picked...
var prototype = _prototypeManager.TryIndex<StackPrototype>(stack.StackTypeId, out var stackType)
? stackType.Spawn
? stackType.Spawn.ToString()
: Prototype(uid)?.ID;
// Set the output parameter in the event instance to the newly split stack.

View File

@@ -0,0 +1,7 @@
namespace Content.Server._Goobstation.Whitelist.Components;
/// <summary>
/// Whitelist component for electronics to avoid tag redefinition and collisions
/// </summary>
[RegisterComponent]
public sealed partial class ElectronicsComponent : Component;

View File

@@ -0,0 +1,7 @@
namespace Content.Server._Goobstation.Whitelist.Components;
/// <summary>
/// Whitelist component for stock parts to avoid tag redefinition and collisions
/// </summary>
[RegisterComponent]
public sealed partial class StockPartComponent : Component;

View File

@@ -102,8 +102,7 @@ namespace Content.Shared.Construction
foreach (var (stackId, amount) in comp.MaterialIdRequirements)
{
var stackProto = _prototype.Index<StackPrototype>(stackId);
if (_prototype.TryIndex(stackProto.Spawn, out var defaultProto) &&
if (_prototype.TryIndex(stackProto.Spawn, out var defaultProto) &&
defaultProto.TryGetComponent<PhysicalCompositionComponent>(out var physComp))
{
foreach (var (mat, matAmount) in physComp.MaterialComposition)

View File

@@ -29,7 +29,7 @@ namespace Content.Shared.Materials
/// include which stack we should spawn by default.
/// </summary>
[DataField]
public ProtoId<EntityPrototype>? StackEntity;
public EntProtoId? StackEntity;
[DataField]
public string Name = string.Empty;

View File

@@ -1,4 +1,5 @@
using Robust.Shared.Containers;
using Content.Shared.Whitelist;
using Robust.Shared.Containers;
using Robust.Shared.GameStates;
using Robust.Shared.Prototypes;
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.List;
@@ -14,15 +15,27 @@ public sealed partial class ItemBorgModuleComponent : Component
/// <summary>
/// The items that are provided.
/// </summary>
[DataField("items", customTypeSerializer: typeof(PrototypeIdListSerializer<EntityPrototype>), required: true)]
[DataField("items", customTypeSerializer: typeof(PrototypeIdListSerializer<EntityPrototype>))] // Frontier: removed
public List<string> Items = new();
/// <summary>
/// Frontier: The droppable items that are provided.
/// </summary>
[DataField]
public List<DroppableBorgItem> DroppableItems = new();
/// <summary>
/// The entities from <see cref="Items"/> that were spawned.
/// </summary>
[DataField("providedItems")]
public SortedDictionary<string, EntityUid> ProvidedItems = new();
/// <summary>
/// The entities from <see cref="Items"/> that were spawned.
/// </summary>
[DataField("droppableProvidedItems")]
public SortedDictionary<string, (EntityUid, DroppableBorgItem)> DroppableProvidedItems = new();
/// <summary>
/// A counter that ensures a unique
/// </summary>
@@ -49,3 +62,13 @@ public sealed partial class ItemBorgModuleComponent : Component
public string ProvidedContainerId = "provided_container";
}
// Frontier: droppable borg item data definitions
[DataDefinition]
public sealed partial class DroppableBorgItem
{
[IdDataField]
public EntProtoId ID;
[DataField]
public EntityWhitelist Whitelist;
}

View File

@@ -4,7 +4,7 @@ using Robust.Shared.Utility;
namespace Content.Shared.Stacks;
[Prototype("stack")]
[Prototype]
public sealed partial class StackPrototype : IPrototype
{
[ViewVariables]
@@ -15,33 +15,26 @@ public sealed partial class StackPrototype : IPrototype
/// Human-readable name for this stack type e.g. "Steel"
/// </summary>
/// <remarks>This is a localization string ID.</remarks>
[DataField("name")]
[DataField]
public string Name { get; private set; } = string.Empty;
/// <summary>
/// An icon that will be used to represent this stack type.
/// </summary>
[DataField("icon")]
[DataField]
public SpriteSpecifier? Icon { get; private set; }
/// <summary>
/// The entity id that will be spawned by default from this stack.
/// </summary>
[DataField("spawn", required: true, customTypeSerializer:typeof(PrototypeIdSerializer<EntityPrototype>))]
public string Spawn { get; private set; } = string.Empty;
[DataField(required: true)]
public EntProtoId Spawn { get; private set; } = string.Empty;
/// <summary>
/// The maximum amount of things that can be in a stack.
/// Can be overriden on <see cref="StackComponent"/>
/// if null, simply has unlimited max count.
/// </summary>
[DataField("maxCount")]
[DataField]
public int? MaxCount { get; private set; }
/// <summary>
/// The size of an individual unit of this stack.
/// </summary>
[DataField("itemSize")]
public int? ItemSize;
}

View File

@@ -0,0 +1,22 @@
using Content.Shared.Whitelist;
using Robust.Shared.GameStates;
using Robust.Shared.Prototypes;
namespace Content.Shared._NF.Interaction.Components;
[RegisterComponent]
[NetworkedComponent]
[AutoGenerateComponentState(true)]
// When an entity with this is removed from a hand, it is replaced with a placeholder entity that blocks the hand's use until re-equipped with the same prototype.
public sealed partial class HandPlaceholderComponent : Component
{
/// <summary>
/// A whitelist to match entities that this should accept.
/// </summary>
[ViewVariables, AutoNetworkedField]
public EntityWhitelist? Whitelist;
[ViewVariables, AutoNetworkedField]
public EntProtoId? Prototype;
}

View File

@@ -0,0 +1,17 @@
using Content.Shared.Whitelist;
using Robust.Shared.GameStates;
using Robust.Shared.Prototypes;
namespace Content.Shared._NF.Interaction.Components;
[RegisterComponent]
[NetworkedComponent]
// When an entity with this is removed from a hand, it is replaced with a placeholder entity that blocks the hand's use until re-equipped with the same prototype.
public sealed partial class HandPlaceholderRemoveableComponent : Component
{
[DataField]
public EntityWhitelist? Whitelist;
[DataField]
public EntProtoId? Prototype;
}

View File

@@ -0,0 +1,118 @@
using Content.Shared._NF.Interaction.Components;
using Content.Shared.Hands;
using Content.Shared.Hands.EntitySystems;
using Content.Shared.Interaction;
using Content.Shared.Interaction.Events;
using Content.Shared.Item;
using Content.Shared.Whitelist;
using JetBrains.Annotations;
using Robust.Shared.Containers;
using Robust.Shared.Network;
using Robust.Shared.Prototypes;
namespace Content.Shared._NF.Interaction.Systems;
/// <summary>
/// Handles interactions with items that spawn HandPlaceholder items.
/// </summary>
[UsedImplicitly]
public sealed partial class HandPlaceholderSystem : EntitySystem
{
[Dependency] private readonly INetManager _net = default!;
[Dependency] private readonly SharedHandsSystem _hands = default!;
[Dependency] private readonly SharedContainerSystem _container = default!;
[Dependency] private readonly SharedItemSystem _item = default!;
[Dependency] private readonly EntityWhitelistSystem _whitelist = default!;
[Dependency] private readonly MetaDataSystem _metadata = default!;
[Dependency] private readonly IPrototypeManager _proto = default!;
public override void Initialize()
{
SubscribeLocalEvent<HandPlaceholderRemoveableComponent, GotUnequippedHandEvent>(OnUnequipHand);
SubscribeLocalEvent<HandPlaceholderRemoveableComponent, DroppedEvent>(OnDropped);
SubscribeLocalEvent<HandPlaceholderComponent, AfterInteractEvent>(AfterInteract);
SubscribeLocalEvent<HandPlaceholderComponent, BeforeRangedInteractEvent>(BeforeRangedInteract);
}
private void OnUnequipHand(Entity<HandPlaceholderRemoveableComponent> ent, ref GotUnequippedHandEvent args)
{
if (args.Handled)
return; // If this is happening in practice, this is a bug.
SpawnAndPickUpPlaceholder(ent, args.User);
RemCompDeferred<HandPlaceholderRemoveableComponent>(ent);
args.Handled = true;
}
private void OnDropped(Entity<HandPlaceholderRemoveableComponent> ent, ref DroppedEvent args)
{
if (args.Handled)
return; // If this is happening in practice, this is a bug.
SpawnAndPickUpPlaceholder(ent, args.User);
RemCompDeferred<HandPlaceholderRemoveableComponent>(ent);
args.Handled = true;
}
private void SpawnAndPickUpPlaceholder(Entity<HandPlaceholderRemoveableComponent> ent, EntityUid user)
{
if (_net.IsServer)
{
var placeholder = Spawn("HandPlaceholder");
if (TryComp<HandPlaceholderComponent>(placeholder, out var placeComp))
{
placeComp.Whitelist = ent.Comp.Whitelist;
placeComp.Prototype = ent.Comp.Prototype;
Dirty(placeholder, placeComp);
}
if (_proto.TryIndex(ent.Comp.Prototype, out var itemProto))
_metadata.SetEntityName(placeholder, itemProto.Name);
if (!_hands.TryPickup(user, placeholder)) // Can we get the hand this came from?
QueueDel(placeholder);
}
}
private void BeforeRangedInteract(Entity<HandPlaceholderComponent> ent, ref BeforeRangedInteractEvent args)
{
if (args.Target == null || args.Handled)
return;
args.Handled = true;
TryToPickUpTarget(ent, args.Target.Value, args.User);
}
private void AfterInteract(Entity<HandPlaceholderComponent> ent, ref AfterInteractEvent args)
{
if (args.Target == null || args.Handled)
return;
args.Handled = true;
TryToPickUpTarget(ent, args.Target.Value, args.User);
}
private void TryToPickUpTarget(Entity<HandPlaceholderComponent> ent, EntityUid target, EntityUid user)
{
if (_whitelist.IsWhitelistFail(ent.Comp.Whitelist, target))
return;
// Can't get the hand we're holding this with? Something's wrong, abort. No empty hands.
if (!_hands.IsHolding(user, ent, out var hand))
return;
// Cache the whitelist/prototype, entity might be deleted.
var whitelist = ent.Comp.Whitelist;
var prototype = ent.Comp.Prototype;
if (_net.IsServer)
Del(ent);
_hands.DoPickup(user, hand, target); // Force pickup - empty hands are not okay
var placeComp = EnsureComp<HandPlaceholderRemoveableComponent>(target);
placeComp.Whitelist = whitelist;
placeComp.Prototype = prototype;
Dirty(target, placeComp);
}
}

View File

@@ -0,0 +1 @@
hand-placeholder-name = Module slot for

View File

@@ -54043,7 +54043,6 @@ entities:
- BorgModuleAdvancedTool
- BorgModuleGPS
- BorgModuleRCD
- BorgModuleRPD
- BorgModuleArtifact
- BorgModuleAnomaly
- BorgModuleGardening

View File

@@ -401,3 +401,5 @@ AirlockHydroponics: AirlockHydroponicsLocked
Biogenerator: null
FloraGreyStalagmite: null
FelinidCube: TajaranCube

View File

@@ -26,6 +26,7 @@
- type: Tag
tags:
- Meat
- Organ
- type: entity

View File

@@ -4,4 +4,4 @@
icon: {sprite: Objects/Misc/bureaucracy.rsi, state: paper}
spawn: SheetPrinter1
maxCount: 1
itemSize: 1

View File

@@ -59,6 +59,8 @@
cost: 750
- id: WeaponCrusher
cost: 750
- id: MiningDrill
cost: 750
- id: WeaponCrusherGlaive
cost: 2400
- id: WeaponProtoKineticAccelerator

View File

@@ -16,4 +16,5 @@
materialComposition:
Glass: 200
chemicalComposition:
Silicon: 20
Silicon: 2
- type: Electronics # Goobstation

View File

@@ -9,18 +9,13 @@
sprite: Objects/Misc/stock_parts.rsi
- type: Item
size: Tiny
- type: EmitSoundOnPickup
sound: /Audio/SimpleStation14/Items/Handling/component_pickup.ogg
- type: EmitSoundOnDrop
sound: /Audio/SimpleStation14/Items/Handling/component_drop.ogg
- type: EmitSoundOnLand
sound: /Audio/SimpleStation14/Items/Handling/component_drop.ogg
# Rating 1
- type: GuideHelp
guides:
- MachineUpgrading
# Rating 1
- type: Stack
count: 1
- type: PhysicalComposition #Goobstation - Recycle update
materialComposition:
Steel: 12
Plastic: 12
- type: StockPart # Goobstation
- type: entity
id: CapacitorStockPart
@@ -40,6 +35,8 @@
- type: Tag
tags:
- CapacitorStockPart
- type: Stack
stackType: Capacitor
- type: entity
id: MicroManipulatorStockPart
@@ -53,6 +50,8 @@
- type: MachinePart
part: Manipulator
rating: 1
- type: Stack
stackType: MicroManipulator
- type: ReverseEngineering # Nyano
recipes:
- MicroManipulatorStockPart
@@ -69,6 +68,8 @@
- type: MachinePart
part: MatterBin
rating: 1
- type: Stack
stackType: MatterBin
- type: ReverseEngineering # Nyano
recipes:
- MatterBinStockPart

View File

@@ -219,7 +219,7 @@
- type: ItemBorgModule
items:
- MiningDrill
- Shovel
# - Shovel # Goobstation
- OreBag
- Crowbar
- RadioHandheld
@@ -310,6 +310,18 @@
- SheetGlassLingering0
- PartRodMetalLingering0
- FloorTileItemSteelLingering0
# Frontier: droppable borg items
droppableItems:
- id: APCElectronics
whitelist:
components:
- Electronics
- MachineBoard
- id: CapacitorStockPart
whitelist:
components:
- StockPart
# End Frontier: droppable borg items
- type: BorgModuleIcon
icon: { sprite: Interface/Actions/actions_borg.rsi, state: construction-module }
@@ -325,23 +337,9 @@
- type: ItemBorgModule
items:
- RCDRecharging
- type: BorgModuleIcon
icon: { sprite: Interface/Actions/actions_borg.rsi, state: rcd-module }
- type: entity
id: BorgModuleRPD
parent: [ BaseBorgModuleEngineering, BaseProviderBorgModule ]
name: RPD cyborg module
components:
- type: Sprite
layers:
- state: engineering
- state: icon-rpd
- type: ItemBorgModule
items:
- RPDRecharging
- type: BorgModuleIcon
icon: { sprite: Interface/Actions/actions_borg.rsi, state: rpd-module }
icon: { sprite: Interface/Actions/actions_borg.rsi, state: rcd-module }
# janitorial modules (this gets its own unique things because janis are epic)
- type: entity
@@ -461,10 +459,17 @@
- type: ItemBorgModule
items:
- HandheldHealthAnalyzerUnpowered
- Beaker
- Beaker
- BorgDropper
# - Beaker # Frontier
# - Beaker # Frontier
# - BorgDropper # Frontier
- BorgHypo
# Frontier: droppable borg items
droppableItems:
- id: Beaker
whitelist:
components:
- FitsInDispenser
# End Frontier: droppable borg items
- type: BorgModuleIcon
icon: { sprite: Interface/Actions/actions_borg.rsi, state: adv-diagnosis-module }
@@ -520,8 +525,15 @@
- BooksBag
- HandLabeler
- Lighter
- DrinkShaker
- BorgDropper
# Frontier: droppable borg items
# - DrinkShaker
# - BorgDropper
droppableItems:
- id: DrinkShaker
whitelist:
components:
- FitsInDispenser
# End Frontier: droppable borg items
- type: BorgModuleIcon
icon: { sprite: Interface/Actions/actions_borg.rsi, state: service-module }
@@ -557,6 +569,13 @@
- HydroponicsToolSpade
- HydroponicsToolClippers
- Bucket
# Frontier: droppable borg items
droppableItems:
- id: AppleSeeds
whitelist:
components:
- Seed
# End Frontier: droppable borg items
- type: BorgModuleIcon
icon: { sprite: Interface/Actions/actions_borg.rsi, state: gardening-module }
@@ -678,3 +697,64 @@
- SelfDestructSeq
- type: BorgModuleIcon
icon: { sprite: Interface/Actions/actions_borg.rsi, state: syndicate-martyr-module }
# Shitmed Modules
- type: entity
id: BorgModuleSurgery
parent: [ BaseBorgModuleMedical, BaseProviderBorgModule ]
name: surgery cyborg module
components:
- type: Sprite
layers:
- state: medical
- state: icon-surgery
- type: ItemBorgModule
items:
- Scalpel
- Drill
- Hemostat
- Retractor
- Cautery
- SawElectric
- BoneGel
# Frontier: droppable borg items
droppableItems:
- id: OrganHumanHeart
whitelist:
components:
- BodyPart
- Organ
tags:
- Organ
# End Frontier: droppable borg items
- type: BorgModuleIcon
icon: { sprite: Interface/Actions/actions_borg.rsi, state: surgery-module }
- type: entity
id: BorgModuleAdvancedSurgery
parent: [ BaseBorgModuleMedical, BaseProviderBorgModule ]
name: advanced surgery cyborg module
components:
- type: Sprite
layers:
- state: medical
- state: icon-advanced-surgery
- type: ItemBorgModule
items:
- EnergyScalpel
- EnergyCautery
- AdvancedRetractor
- BoneGel
# Frontier: droppable borg items
droppableItems:
- id: OrganHumanHeart
whitelist:
components:
- BodyPart
- Organ
tags:
- Organ
# End Frontier: droppable borg items
- type: BorgModuleIcon
icon: { sprite: Interface/Actions/actions_borg.rsi, state: adv-surgery-module }

View File

@@ -7,7 +7,6 @@
state: extraction_pack
spawn: Fulton1
maxCount: 10
itemSize: 2
# Entities
- type: entity

View File

@@ -73,17 +73,15 @@
range: 1.5
heavyStaminaCost: 0.7
damage:
groups:
Brute: 3
types:
Structural: 15
Piercing: 6
- type: DamageOtherOnHit
staminaCost: 9
damage:
groups:
Brute: 9
types:
Structural: 15
Structural: 25
Piercing: 9
- type: ThrowingAngle
angle: 270
@@ -105,16 +103,14 @@
path: "/Audio/Items/drill_hit.ogg"
heavyStaminaCost: 0.55 # More efficient so less stamina needed to use
damage:
groups:
Brute: 6
types:
Structural: 30
Piercing: 12
Structural: 50
- type: DamageOtherOnHit
damage:
groups:
Brute: 18
types:
Structural: 30
Structural: 40
Piercing: 18
- type: entity
abstract: true

View File

@@ -729,7 +729,6 @@
- BorgModuleAdvancedTool
- BorgModuleGPS
- BorgModuleRCD
- BorgModuleRPD
- BorgModuleJetpack
- BorgModulePka
- BorgModuleArtifact

View File

@@ -317,11 +317,6 @@
id: BorgModuleRCD
result: BorgModuleRCD
- type: latheRecipe
parent: BaseGoldBorgModuleRecipe
id: BorgModuleRPD
result: BorgModuleRPD
# Janitor Modules
- type: latheRecipe

View File

@@ -171,7 +171,6 @@
- JawsOfLife
- BorgModuleAdvancedTool
- BorgModuleRCD
- BorgModuleRPD
- type: technology
id: MassExcavation

View File

@@ -4,7 +4,6 @@
icon: { sprite: /Textures/Objects/Materials/Sheets/glass.rsi, state: glass }
spawn: SheetGlass1
maxCount: 30
itemSize: 1
- type: stack
id: ReinforcedGlass
@@ -12,7 +11,6 @@
icon: { sprite: /Textures/Objects/Materials/Sheets/glass.rsi, state: rglass }
spawn: SheetRGlass1
maxCount: 30
itemSize: 1
- type: stack
id: PlasmaGlass
@@ -20,7 +18,6 @@
icon: { sprite: /Textures/Objects/Materials/Sheets/glass.rsi, state: pglass }
spawn: SheetPGlass1
maxCount: 30
itemSize: 1
- type: stack
id: ReinforcedPlasmaGlass
@@ -28,7 +25,6 @@
icon: { sprite: /Textures/Objects/Materials/Sheets/glass.rsi, state: rpglass }
spawn: SheetRPGlass1
maxCount: 30
itemSize: 1
- type: stack
id: UraniumGlass
@@ -36,7 +32,6 @@
icon: { sprite: /Textures/Objects/Materials/Sheets/glass.rsi, state: uglass }
spawn: SheetUGlass1
maxCount: 30
itemSize: 1
- type: stack
id: ReinforcedUraniumGlass
@@ -44,7 +39,6 @@
icon: { sprite: /Textures/Objects/Materials/Sheets/glass.rsi, state: ruglass }
spawn: SheetRUGlass1
maxCount: 30
itemSize: 1
- type: stack
id: ClockworkGlass
@@ -52,4 +46,3 @@
icon: { sprite: /Textures/Objects/Materials/Sheets/glass.rsi, state: cglass }
spawn: SheetClockworkGlass1
maxCount: 30
itemSize: 1

View File

@@ -4,7 +4,6 @@
icon: { sprite: /Textures/Objects/Materials/Sheets/metal.rsi, state: steel }
spawn: SheetSteel1
maxCount: 30
itemSize: 1
- type: stack
id: Plasteel
@@ -12,7 +11,6 @@
icon: { sprite: /Textures/Objects/Materials/Sheets/metal.rsi, state: plasteel }
spawn: SheetPlasteel1
maxCount: 30
itemSize: 1
- type: stack
id: Brass
@@ -20,4 +18,3 @@
icon: { sprite: /Textures/Objects/Materials/Sheets/metal.rsi, state: brass }
spawn: SheetBrass1
maxCount: 30
itemSize: 1

View File

@@ -4,7 +4,6 @@
icon: { sprite: /Textures/Objects/Materials/Sheets/other.rsi, state: paper }
spawn: SheetPaper1
maxCount: 30
itemSize: 1
- type: stack
id: Plasma
@@ -12,7 +11,6 @@
icon: { sprite: /Textures/Objects/Materials/Sheets/other.rsi, state: plasma }
spawn: SheetPlasma1
maxCount: 30
itemSize: 1
- type: stack
id: Plastic
@@ -20,7 +18,6 @@
icon: { sprite: /Textures/Objects/Materials/Sheets/other.rsi, state: plastic }
spawn: SheetPlastic1
maxCount: 30
itemSize: 1
- type: stack
id: Uranium
@@ -28,4 +25,3 @@
icon: { sprite: /Textures/Objects/Materials/Sheets/other.rsi, state: uranium }
spawn: SheetUranium1
maxCount: 30
itemSize: 1

View File

@@ -3,7 +3,6 @@
name: telecrystal
icon: Objects/Specific/Syndicate/telecrystal.rsi
spawn: Telecrystal1
itemSize: 1
- type: stack
id: Bluespace
@@ -11,12 +10,9 @@
icon: { sprite: Objects/Materials/materials.rsi, state: bluespace }
spawn: MaterialBluespace1
maxCount: 5
itemSize: 1
- type: stack
id: Normality
name: normality
icon: { sprite: Objects/Materials/materials.rsi, state: normality }
spawn: MaterialNormality1
maxCount: 5
itemSize: 1

View File

@@ -4,7 +4,6 @@
icon: { sprite: "/Textures/Objects/Materials/ingots.rsi", state: gold }
spawn: IngotGold1
maxCount: 30
itemSize: 1
- type: stack
id: Silver
@@ -12,7 +11,6 @@
icon: { sprite: "/Textures/Objects/Materials/ingots.rsi", state: silver }
spawn: IngotSilver1
maxCount: 30
itemSize: 1
- type: stack
id: Tungsten
@@ -20,4 +18,3 @@
icon: { sprite: "/Textures/Objects/Materials/ingots.rsi", state: tungsten_1 }
spawn: IngotTungsten1
maxCount: 30
itemSize: 1

View File

@@ -4,7 +4,6 @@
icon: { sprite: /Textures/Objects/Misc/monkeycube.rsi, state: cube }
spawn: MaterialBiomass1
maxCount: 100
itemSize: 1
- type: stack
id: WoodPlank
@@ -12,7 +11,6 @@
icon: { sprite: /Textures/Objects/Materials/materials.rsi, state: wood }
spawn: MaterialWoodPlank1
maxCount: 30
itemSize: 1
- type: stack
id: Cardboard
@@ -20,7 +18,6 @@
icon: { sprite: /Textures/Objects/Materials/materials.rsi, state: cardboard }
spawn: MaterialCardboard1
maxCount: 30
itemSize: 1
- type: stack
id: Cloth
@@ -28,7 +25,6 @@
icon: { sprite: /Textures/Objects/Materials/materials.rsi, state: cloth }
spawn: MaterialCloth1
maxCount: 30
itemSize: 1
- type: stack
id: Durathread
@@ -36,7 +32,6 @@
icon: { sprite: /Textures/Objects/Materials/materials.rsi, state: durathread }
spawn: MaterialDurathread1
maxCount: 30
itemSize: 1
- type: stack
id: Diamond
@@ -44,7 +39,6 @@
icon: { sprite: /Textures/Objects/Materials/materials.rsi, state: diamond }
spawn: MaterialDiamond1
maxCount: 30
itemSize: 2
- type: stack
id: Cotton
@@ -52,7 +46,6 @@
icon: { sprite: /Textures/Objects/Materials/materials.rsi, state: cotton }
spawn: MaterialCotton1
maxCount: 30
itemSize: 1
- type: stack
id: Pyrotton
@@ -60,7 +53,6 @@
icon: { sprite: /Textures/Objects/Materials/materials.rsi, state: pyrotton }
spawn: MaterialPyrotton1
maxCount: 30
itemSize: 1
- type: stack
id: Bananium
@@ -68,7 +60,6 @@
icon: { sprite: /Textures/Objects/Materials/materials.rsi, state: bananium }
spawn: MaterialBananium1
maxCount: 10
itemSize: 2
- type: stack
id: MeatSheets
@@ -76,7 +67,6 @@
icon: { sprite: /Textures/Objects/Materials/Sheets/meaterial.rsi, state: meat }
spawn: MaterialSheetMeat1
maxCount: 30
itemSize: 1
- type: stack
id: WebSilk
@@ -84,7 +74,6 @@
icon: { sprite: /Textures/Objects/Materials/silk.rsi, state: icon }
spawn: MaterialWebSilk1
maxCount: 50
itemSize: 1
- type: stack
id: Bones
@@ -105,4 +94,4 @@
name: goliath hide
icon: { sprite: /Textures/Objects/Materials/hide.rsi, state: goliath_hide }
spawn: MaterialGoliathHide1
maxCount: 30
maxCount: 30

View File

@@ -18,7 +18,6 @@
icon: { sprite: /Textures/Objects/Materials/ore.rsi, state: iron }
spawn: SteelOre1
maxCount: 30
itemSize: 2
- type: stack
id: PlasmaOre
@@ -26,7 +25,6 @@
icon: { sprite: /Textures/Objects/Materials/ore.rsi, state: plasma }
spawn: PlasmaOre1
maxCount: 30
itemSize: 2
- type: stack
id: SilverOre
@@ -34,7 +32,6 @@
icon: { sprite: /Textures/Objects/Materials/ore.rsi, state: silver }
spawn: SilverOre1
maxCount: 30
itemSize: 2
- type: stack
id: SpaceQuartz
@@ -42,7 +39,6 @@
icon: { sprite: /Textures/Objects/Materials/ore.rsi, state: spacequartz }
spawn: SpaceQuartz1
maxCount: 30
itemSize: 2
- type: stack
id: UraniumOre
@@ -50,7 +46,6 @@
icon: { sprite: /Textures/Objects/Materials/ore.rsi, state: uranium }
spawn: UraniumOre1
maxCount: 30
itemSize: 2
- type: stack
id: BananiumOre
@@ -58,7 +53,6 @@
icon: { sprite: /Textures/Objects/Materials/ore.rsi, state: bananium }
spawn: BananiumOre1
maxCount: 30
itemSize: 2
- type: stack
id: Coal
@@ -66,7 +60,6 @@
icon: { sprite: /Textures/Objects/Materials/ore.rsi, state: coal }
spawn: Coal1
maxCount: 30
itemSize: 2
- type: stack
id: SaltOre
@@ -74,7 +67,6 @@
icon: { sprite: /Textures/Objects/Materials/ore.rsi, state: salt }
spawn: Salt1
maxCount: 30
itemSize: 2
- type: stack
id: BluespaceOre
@@ -82,7 +74,6 @@
icon: { sprite: Objects/Materials/ore.rsi, state: bluespace }
spawn: BluespaceOre1
maxCount: 30
itemSize: 2
- type: stack
id: NormalityOre
@@ -90,7 +81,6 @@
icon: { sprite: Objects/Materials/ore.rsi, state: normality }
spawn: NormalityOre1
maxCount: 30
itemSize: 2
- type: stack
id: TungstenOre
@@ -98,4 +88,3 @@
icon: { sprite: Objects/Materials/ore.rsi, state: tungsten }
spawn: TungstenOre1
maxCount: 30
itemSize: 2

View File

@@ -4,4 +4,3 @@
icon: { sprite: /Textures/Objects/Materials/parts.rsi, state: rods }
spawn: PartRodMetal1
maxCount: 30
itemSize: 1

View File

@@ -5,7 +5,6 @@
name: pancake
spawn: FoodBakedPancake
maxCount: 3
itemSize: 1
# Food Containers
@@ -15,7 +14,6 @@
icon: { sprite: Objects/Consumable/Food/Baked/pizza.rsi, state: box }
spawn: FoodBoxPizza
maxCount: 30
itemSize: 10
# Smokeables
@@ -25,7 +23,6 @@
icon: { sprite: /Textures/Objects/Consumable/Smokeables/Cigarettes/paper.rsi, state: cigpaper }
spawn: PaperRolling
maxCount: 5
itemSize: 1
- type: stack
id: CigaretteFilter
@@ -33,7 +30,6 @@
icon: { sprite: /Textures/Objects/Consumable/Smokeables/Cigarettes/paper.rsi, state: cigfilter }
spawn: CigaretteFilter
maxCount: 5
itemSize: 2
- type: stack
id: GroundTobacco
@@ -41,7 +37,6 @@
icon: { sprite: /Textures/Objects/Misc/reagent_fillings.rsi, state: powderpile }
spawn: GroundTobacco
maxCount: 5
itemSize: 1
- type: stack
id: GroundCannabis
@@ -49,7 +44,6 @@
icon: { sprite: /Textures/Objects/Misc/reagent_fillings.rsi, state: powderpile }
spawn: GroundCannabis
maxCount:
itemSize: 1
- type: stack
id: GroundCannabisRainbow
@@ -57,7 +51,6 @@
icon: { sprite: /Textures/Objects/Specific/Hydroponics/rainbow_cannabis.rsi, state: powderpile_rainbow }
spawn: GroundCannabisRainbow
maxCount:
itemSize: 1
- type: stack
id: LeavesTobaccoDried
@@ -65,7 +58,6 @@
icon: { sprite: /Textures/Objects/Specific/Hydroponics/tobacco.rsi, state: dried }
spawn: LeavesTobaccoDried
maxCount: 5
itemSize: 5
- type: stack
id: LeavesCannabisDried
@@ -73,12 +65,9 @@
icon: { sprite: /Textures/Objects/Specific/Hydroponics/tobacco.rsi, state: dried }
spawn: LeavesCannabisDried
maxCount: 5
itemSize: 5
- type: stack
id: LeavesCannabisRainbowDried
name: dried rainbow cannabis leaves
icon: { sprite: /Textures/Objects/Specific/Hydroponics/rainbow_cannabis.rsi, state: dried }
spawn: LeavesCannabisRainbowDried
maxCount: 5
itemSize: 5

View File

@@ -4,11 +4,9 @@
name: inflatable wall
spawn: InflatableWallStack1
maxCount: 10
itemSize: 1
- type: stack
id: InflatableDoor
name: inflatable door
spawn: InflatableDoorStack1
maxCount: 4
itemSize: 1

View File

@@ -3,203 +3,174 @@
name: steel tile
spawn: FloorTileItemSteel
maxCount: 30
itemSize: 5
- type: stack
id: FloorTileMetalDiamond
name: steel tile
spawn: FloorTileItemMetalDiamond
maxCount: 30
itemSize: 5
- type: stack
id: FloorTileWood
name: wood floor
spawn: FloorTileItemWood
maxCount: 30
itemSize: 5
- type: stack
id: FloorTileWhite
name: white tile
spawn: FloorTileItemWhite
maxCount: 30
itemSize: 5
- type: stack
id: FloorTileDark
name: dark tile
spawn: FloorTileItemDark
maxCount: 30
itemSize: 5
- type: stack
id: FloorTileTechmaint
name: techmaint floor
spawn: FloorTileItemTechmaint
maxCount: 30
itemSize: 5
- type: stack
id: FloorTileFreezer
name: freezer tile
spawn: FloorTileItemFreezer
maxCount: 30
itemSize: 5
- type: stack
id: FloorTileShowroom
name: showroom tile
spawn: FloorTileItemShowroom
maxCount: 30
itemSize: 5
- type: stack
id: FloorTileGCircuit
name: green-circuit floor
spawn: FloorTileItemGCircuit
maxCount: 30
itemSize: 5
- type: stack
id: FloorTileGold
name: gold floor
spawn: FloorTileItemGold
maxCount: 30
itemSize: 5
- type: stack
id: FloorTileReinforced
name: reinforced tile
spawn: FloorTileItemReinforced
maxCount: 30
itemSize: 5
- type: stack
id: FloorTileMono
name: mono tile
spawn: FloorTileItemMono
maxCount: 30
itemSize: 5
- type: stack
id: FloorTileBrassFilled
name: filled brass plate
spawn: FloorTileItemBrassFilled
maxCount: 30
itemSize: 5
- type: stack
id: FloorTileBrassReebe
name: smooth brass plate
spawn: FloorTileItemBrassReebe
maxCount: 30
itemSize: 5
- type: stack
id: FloorTileLino
name: linoleum floor
spawn: FloorTileItemLino
maxCount: 30
itemSize: 5
- type: stack
id: FloorTileHydro
name: hydro tile
spawn: FloorTileItemHydro
maxCount: 30
itemSize: 5
- type: stack
id: FloorTileLime
name: lime tile
spawn: FloorTileItemLime
maxCount: 30
itemSize: 5
- type: stack
id: FloorTileDirty
name: dirty tile
spawn: FloorTileItemDirty
maxCount: 30
itemSize: 5
- type: stack
id: FloorTileStackShuttleWhite
name: white shuttle tile
spawn: FloorTileItemShuttleWhite
maxCount: 30
itemSize: 5
- type: stack
id: FloorTileStackShuttleBlue
name: blue shuttle tile
spawn: FloorTileItemShuttleBlue
maxCount: 30
itemSize: 5
- type: stack
id: FloorTileStackShuttleOrange
name: orange shuttle tile
spawn: FloorTileItemShuttleOrange
maxCount: 30
itemSize: 5
- type: stack
id: FloorTileStackShuttlePurple
name: purple shuttle tile
spawn: FloorTileItemShuttlePurple
maxCount: 30
itemSize: 5
- type: stack
id: FloorTileStackShuttleRed
name: red shuttle tile
spawn: FloorTileItemShuttleRed
maxCount: 30
itemSize: 5
- type: stack
id: FloorTileStackShuttleGrey
name: grey shuttle tile
spawn: FloorTileItemShuttleGrey
maxCount: 30
itemSize: 5
- type: stack
id: FloorTileStackShuttleBlack
name: black shuttle tile
spawn: FloorTileItemShuttleBlack
maxCount: 30
itemSize: 5
- type: stack
id: FloorTileStackEighties
name: eighties floor tile
spawn: FloorTileItemEighties
maxCount: 30
itemSize: 5
- type: stack
id: FloorTileStackArcadeBlue
name: blue arcade tile
spawn: FloorTileItemArcadeBlue
maxCount: 30
itemSize: 5
- type: stack
id: FloorTileStackArcadeBlue2
name: blue arcade tile
spawn: FloorTileItemArcadeBlue2
maxCount: 30
itemSize: 5
- type: stack
id: FloorTileStackArcadeRed
name: red arcade tile
spawn: FloorTileItemArcadeRed
maxCount: 30
itemSize: 5
- type: stack
id: FloorCarpetRed
@@ -207,7 +178,6 @@
icon: { sprite: Objects/Tiles/tile.rsi, state: carpet-red }
spawn: FloorCarpetItemRed
maxCount: 30
itemSize: 5
- type: stack
id: FloorCarpetBlack
@@ -215,7 +185,6 @@
icon: { sprite: Objects/Tiles/tile.rsi, state: carpet-black }
spawn: FloorCarpetItemBlack
maxCount: 30
itemSize: 5
- type: stack
id: FloorCarpetBlue
@@ -223,7 +192,6 @@
icon: { sprite: Objects/Tiles/tile.rsi, state: carpet-blue }
spawn: FloorCarpetItemBlue
maxCount: 30
itemSize: 5
- type: stack
id: FloorCarpetGreen
@@ -231,7 +199,6 @@
icon: { sprite: Objects/Tiles/tile.rsi, state: carpet-green }
spawn: FloorCarpetItemGreen
maxCount: 30
itemSize: 5
- type: stack
id: FloorCarpetOrange
@@ -239,7 +206,6 @@
icon: { sprite: Objects/Tiles/tile.rsi, state: carpet-orange }
spawn: FloorCarpetItemOrange
maxCount: 30
itemSize: 5
- type: stack
id: FloorCarpetSkyBlue
@@ -247,7 +213,6 @@
icon: { sprite: Objects/Tiles/tile.rsi, state: carpet-skyblue }
spawn: FloorCarpetItemSkyBlue
maxCount: 30
itemSize: 5
- type: stack
id: FloorCarpetPurple
@@ -255,7 +220,6 @@
icon: { sprite: Objects/Tiles/tile.rsi, state: carpet-purple }
spawn: FloorCarpetItemPurple
maxCount: 30
itemSize: 5
- type: stack
id: FloorCarpetPink
@@ -263,7 +227,6 @@
icon: { sprite: Objects/Tiles/tile.rsi, state: carpet-pink }
spawn: FloorCarpetItemPink
maxCount: 30
itemSize: 5
- type: stack
id: FloorCarpetCyan
@@ -271,7 +234,6 @@
icon: { sprite: Objects/Tiles/tile.rsi, state: carpet-cyan }
spawn: FloorCarpetItemCyan
maxCount: 30
itemSize: 5
- type: stack
id: FloorCarpetWhite
@@ -279,210 +241,180 @@
icon: { sprite: Objects/Tiles/tile.rsi, state: carpet-white }
spawn: FloorCarpetItemWhite
maxCount: 30
itemSize: 5
- type: stack
id: FloorTileStackCarpetClown
name: clown carpet tile
spawn: FloorTileItemCarpetClown
maxCount: 30
itemSize: 5
- type: stack
id: FloorTileStackCarpetOffice
name: office carpet tile
spawn: FloorTileItemCarpetOffice
maxCount: 30
itemSize: 5
- type: stack
id: FloorTileStackBoxing
name: boxing ring tile
spawn: FloorTileItemBoxing
maxCount: 30
itemSize: 5
- type: stack
id: FloorTileStackGym
name: gym floor tile
spawn: FloorTileItemGym
maxCount: 30
itemSize: 5
- type: stack
id: FloorTileElevatorShaft
name: elevator shaft tile
spawn: FloorTileItemElevatorShaft
maxCount: 30
itemSize: 5
- type: stack
id: FloorTileRockVault
name: rock vault tile
spawn: FloorTileItemRockVault
maxCount: 30
itemSize: 5
- type: stack
id: FloorTileBlue
name: blue floor tile
spawn: FloorTileItemBlue
maxCount: 30
itemSize: 5
- type: stack
id: FloorTileMining
name: mining floor tile
spawn: FloorTileItemMining
maxCount: 30
itemSize: 5
- type: stack
id: FloorTileMiningDark
name: dark mining floor tile
spawn: FloorTileItemMiningDark
maxCount: 30
itemSize: 5
- type: stack
id: FloorTileMiningLight
name: light mining floor tile
spawn: FloorTileItemMiningLight
maxCount: 30
itemSize: 5
- type: stack
id: FloorTileBar
name: item bar floor tile
spawn: FloorTileItemBar
maxCount: 30
itemSize: 5
- type: stack
id: FloorTileClown
name: clown floor tile
spawn: FloorTileItemClown
maxCount: 30
itemSize: 5
- type: stack
id: FloorTileMime
name: mime floor tile
spawn: FloorTileItemMime
maxCount: 30
itemSize: 5
- type: stack
id: FloorTileKitchen
name: kitchen floor tile
spawn: FloorTileItemKitchen
maxCount: 30
itemSize: 5
- type: stack
id: FloorTileLaundry
name: laundry floor tile
spawn: FloorTileItemLaundry
maxCount: 30
itemSize: 5
- type: stack
id: FloorTileConcrete
name: concrete tile
spawn: FloorTileItemGrayConcrete
maxCount: 30
itemSize: 5
- type: stack
id: FloorTileGrayConcrete
name: gray concrete tile
spawn: FloorTileItemLaundry
maxCount: 30
itemSize: 5
- type: stack
id: FloorTileOldConcrete
name: old concrete tile
spawn: FloorTileItemOldConcrete
maxCount: 30
itemSize: 5
- type: stack
id: FloorTileSilver
name: silver floor tile
spawn: FloorTileItemSilver
maxCount: 30
itemSize: 5
- type: stack
id: FloorTileBCircuit
name: bcircuit floor tile
spawn: FloorTileItemBCircuit
maxCount: 30
itemSize: 5
- type: stack
id: FloorTileRCircuit
name: red-circuit floor
spawn: FloorTileItemRCircuit
maxCount: 30
itemSize: 5
- type: stack
id: FloorTileGrass
name: grass floor tile
spawn: FloorTileItemGrass
maxCount: 30
itemSize: 5
- type: stack
id: FloorTileGrassJungle
name: grass jungle floor tile
spawn: FloorTileItemGrassJungle
maxCount: 30
itemSize: 5
- type: stack
id: FloorTileSnow
name: snow floor tile
spawn: FloorTileItemSnow
maxCount: 30
itemSize: 5
- type: stack
id: FloorTileWoodPattern
name: wood pattern floor
spawn: FloorTileItemWoodPattern
maxCount: 30
itemSize: 5
- type: stack
id: FloorTileFlesh
name: flesh floor
spawn: FloorTileItemFlesh
maxCount: 30
itemSize: 5
- type: stack
id: FloorTileSteelMaint
name: steel maint floor
spawn: FloorTileItemSteelMaint
maxCount: 30
itemSize: 5
- type: stack
id: FloorTileGratingMaint
name: grating maint floor
spawn: FloorTileItemGratingMaint
maxCount: 30
itemSize: 5
- type: stack
id: FloorTileWeb
name: web tile
spawn: FloorTileItemWeb
maxCount: 30
itemSize: 5
# Faux science tiles
- type: stack
@@ -490,35 +422,30 @@
name: astro-grass floor
spawn: FloorTileItemAstroGrass
maxCount: 30
itemSize: 5
- type: stack
id: FloorTileMowedAstroGrass
name: mowed astro-grass floor
spawn: FloorTileItemMowedAstroGrass
maxCount: 30
itemSize: 5
- type: stack
id: FloorTileJungleAstroGrass
name: jungle astro-grass floor
spawn: FloorTileItemJungleAstroGrass
maxCount: 30
itemSize: 5
- type: stack
id: FloorTileAstroIce
name: astro-ice floor
spawn: FloorTileItemAstroIce
maxCount: 30
itemSize: 5
- type: stack
id: FloorTileAstroSnow
name: astro-snow floor
spawn: FloorTileItemAstroSnow
maxCount: 30
itemSize: 5
- type: stack
id: FloorTileWoodLarge

View File

@@ -4,7 +4,6 @@
icon: { sprite: "/Textures/Objects/Specific/Medical/medical.rsi", state: ointment }
spawn: Ointment
maxCount: 10
itemSize: 1
- type: stack
id: AloeCream
@@ -12,7 +11,6 @@
icon: { sprite: "/Textures/Objects/Specific/Hydroponics/aloe.rsi", state: cream }
spawn: AloeCream
maxCount: 15 #Changed to 15 due to shitmed changes
itemSize: 1
- type: stack
id: Gauze
@@ -20,7 +18,6 @@
icon: { sprite: "/Textures/Objects/Specific/Medical/medical.rsi", state: gauze }
spawn: Gauze
maxCount: 15 #Changed to 15 due to shitmed changes
itemSize: 1
- type: stack
id: Brutepack
@@ -28,7 +25,6 @@
icon: { sprite: "/Textures/Objects/Specific/Medical/medical.rsi", state: gauze }
spawn: Brutepack
maxCount: 15 #Changed to 15 due to shitmed changes
itemSize: 1
- type: stack
id: Bloodpack
@@ -36,7 +32,6 @@
icon: { sprite: "/Textures/Objects/Specific/Medical/medical.rsi", state: bloodpack }
spawn: Bloodpack
maxCount: 15 #Changed to 15 due to shitmed changes
itemSize: 1
- type: stack
id: MedicatedSuture
@@ -44,7 +39,6 @@
icon: {sprite: "/Textures/Objects/Specific/Medical/medical.rsi", state: medicated-suture }
spawn: MedicatedSuture
maxCount: 15 #Changed to 15 due to shitmed changes
itemSize: 1
- type: stack
id: RegenerativeMesh
@@ -52,6 +46,5 @@
icon: {sprite: "/Textures/Objects/Specific/Medical/medical.rsi", state: regenerative-mesh}
spawn: RegenerativeMesh
maxCount: 15 #Changed to 15 due to shitmed changes
itemSize: 1

View File

@@ -4,7 +4,6 @@
icon: { sprite: "/Textures/Objects/Tools/cable-coils.rsi", state: coil-30 }
spawn: CableApcStack1
maxCount: 30
itemSize: 1
- type: stack
id: CableMV
@@ -12,7 +11,6 @@
icon: { sprite: "/Textures/Objects/Tools/cable-coils.rsi", state: coilmv-30 }
spawn: CableMVStack1
maxCount: 30
itemSize: 1
- type: stack
id: CableHV
@@ -20,4 +18,3 @@
icon: { sprite: "/Textures/Objects/Tools/cable-coils.rsi", state: coilhv-30 }
spawn: CableHVStack1
maxCount: 30
itemSize: 1

View File

@@ -4,4 +4,3 @@
icon: { sprite: Objects/Fun/prizeticket.rsi, state: ticket }
spawn: PrizeTicket1
maxCount: 100
itemSize: 1

View File

@@ -3,4 +3,21 @@
name: artifact fragment
spawn: ArtifactFragment1
maxCount: 30
itemSize: 5
- type: stack
id: Capacitor
name: capacitor
spawn: CapacitorStockPart
maxCount: 10
- type: stack
id: MicroManipulator
name: micro manipulator
spawn: MicroManipulatorStockPart
maxCount: 10
- type: stack
id: MatterBin
name: matter bin
spawn: MatterBinStockPart
maxCount: 10

View File

@@ -12,18 +12,18 @@
- Pickaxe
- IndustrialMech
- type: MeleeWeapon
canWideSwing: false
canWideSwing: true
autoAttack: true
angle: 0
wideAnimationRotation: -90
soundHit:
path: "/Audio/Items/drill_hit.ogg"
attackRate: 3.5
attackRate: 0.25 # Should be better then a normal drill not worse
damage:
groups:
Brute: 9
Brute: 12 # Giant fucking mech drill
types:
Structural: 40 # ~10 seconds for solid wall / ~21 secods for reinforced wall
Structural: 50 # Giant fucking mech drill
- type: entity
id: WeaponMechMeleeDrillDiamond
@@ -39,15 +39,15 @@
- Pickaxe
- IndustrialMech
- type: MeleeWeapon
canWideSwing: false
canWideSwing: true
autoAttack: true
angle: 0
wideAnimationRotation: -90
soundHit:
path: "/Audio/Items/drill_hit.ogg"
attackRate: 4
attackRate: 0.25 # Should be better then a normal drill not worse
damage:
groups:
Brute: 18
Brute: 24
types:
Structural: 60 # ~3 seconds for solid wall / 9 seconds for reinforced wall
Structural: 100 # Giant fucking mech drill

View File

@@ -0,0 +1,18 @@
- type: entity
id: BorgModulePKA
parent: [ BaseBorgModuleCargo, BaseProviderBorgModule ]
name: proto kinetic accelerator cyborg module
components:
- type: Sprite
sprite: _Goobstation/Objects/Specific/Robotics/borgmodule.rsi
layers:
- state: cargo
- state: icon-pka
- type: ItemBorgModule
droppableItems:
- id: WeaponProtoKineticAccelerator
whitelist:
components:
- PressureDamageChange
- type: BorgModuleIcon
icon: { sprite: Objects/Weapons/Guns/Basic/kinetic_accelerator.rsi, state: icon }

View File

@@ -0,0 +1,10 @@
- type: entity
id: HandPlaceholder
name: unknown tool
categories: [ HideSpawnMenu ]
components:
- type: Item
size: Ginormous # no storage insertion visuals
- type: Unremoveable
- type: HandPlaceholder
- type: HandPlaceholderVisuals

View File

@@ -11,7 +11,6 @@
icon: { sprite: "/Textures/_Nuclear14/Objects/Misc/materials.rsi", state: lead }
spawn: N14AluminiumOre1
maxCount: 10
itemSize: 1
- type: stack
id: N14LeadOre
@@ -19,7 +18,6 @@
icon: { sprite: "/Textures/_Nuclear14/Objects/Misc/materials.rsi", state: lead }
spawn: N14LeadOre1
maxCount: 10
itemSize: 1
- type: stack
id: CopperOre
@@ -27,7 +25,6 @@
icon: { sprite: "/Textures/_Nuclear14/Objects/Misc/materials.rsi", state: copper }
spawn: CopperOre1
maxCount: 30
itemSize: 1
- type: stack
id: SulfurOre
@@ -35,7 +32,6 @@
icon: { sprite: "/Textures/_Nuclear14/Objects/Misc/materials.rsi", state: sulfur }
spawn: SulfurOre1
maxCount: 10
itemSize: 1
# Metals
- type: stack
@@ -44,7 +40,6 @@
icon: { sprite: "/Textures/_Nuclear14/Objects/Misc/materials.rsi", state: ingot_lead }
spawn: N14IngotLead1
maxCount: 30
itemSize: 1
- type: stack
id: Aluminium
@@ -52,7 +47,6 @@
icon: { sprite: "/Textures/_Nuclear14/Objects/Misc/materials.rsi", state: ingot_aluminum }
spawn: N14IngotAluminium1
maxCount: 30
itemSize: 1
- type: stack
id: Copper
@@ -60,4 +54,3 @@
icon: { sprite: "/Textures/_Nuclear14/Objects/Misc/materials.rsi", state: ingot_copper }
spawn: IngotCopper1
maxCount: 30
itemSize: 1

View File

@@ -1,34 +0,0 @@
- type: entity
id: BorgModuleSurgery
parent: [ BaseBorgModuleMedical, BaseProviderBorgModule ]
name: surgery cyborg module
components:
- type: Sprite
layers:
- state: medical
- state: icon-surgery
- type: ItemBorgModule
items:
- Scalpel
- Drill
- Hemostat
- Retractor
- Cautery
- SawElectric
- BoneGel
- type: entity
id: BorgModuleAdvancedSurgery
parent: [ BaseBorgModuleMedical, BaseProviderBorgModule ]
name: advanced surgery cyborg module
components:
- type: Sprite
layers:
- state: medical
- state: icon-advanced-surgery
- type: ItemBorgModule
items:
- EnergyScalpel
- EnergyCautery
- AdvancedRetractor
- BoneGel

View File

@@ -87,6 +87,7 @@
- BorgModuleGrapplingGun
- BorgModuleMining
- BorgModuleAppraisal
- BorgModulePKA # Lavaland
radioChannels:
- Supply

View File

@@ -1049,6 +1049,9 @@
- type: Tag
id: Ore
- type: Tag
id: Organ
- type: Tag
id: Packet

Binary file not shown.

After

Width:  |  Height:  |  Size: 509 B

View File

@@ -112,6 +112,12 @@
{
"name": "rpd-module"
},
{
"name":"surgery-module"
},
{
"name":"adv-surgery-module"
},
{
"name": "pka-module"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 475 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 565 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 299 B

View File

@@ -0,0 +1,17 @@
{
"version": 1,
"license": "CC0-1.0",
"copyright": "Lollypop by SolsticeOfTheWinter (Lollypop Guy), PKA by Mocho",
"size": {
"x": 32,
"y": 32
},
"states": [
{
"name": "cargo"
},
{
"name": "icon-pka"
}
]
}