diff --git a/Content.Server/Power/Components/ChargerComponent.cs b/Content.Server/Power/Components/ChargerComponent.cs index af4498f01b..e45ded071c 100644 --- a/Content.Server/Power/Components/ChargerComponent.cs +++ b/Content.Server/Power/Components/ChargerComponent.cs @@ -1,5 +1,10 @@ using Content.Shared.Power; using Content.Shared.Whitelist; +using Content.Shared.Power; +using Content.Shared.Whitelist; +using Robust.Shared.GameObjects; +using Robust.Shared.Serialization.Manager.Attributes; +using Robust.Shared.ViewVariables; namespace Content.Server.Power.Components { @@ -26,5 +31,12 @@ namespace Content.Server.Power.Components /// [DataField("whitelist")] public EntityWhitelist? Whitelist; + + /// + /// Indicates whether the charger is portable and thus subject to EMP effects + /// and bypasses checks for transform, anchored, and ApcPowerReceiverComponent. + /// + [DataField] + public bool Portable = false; } } diff --git a/Content.Server/Power/EntitySystems/ChargerSystem.cs b/Content.Server/Power/EntitySystems/ChargerSystem.cs index db16dfa008..1ff13a24f2 100644 --- a/Content.Server/Power/EntitySystems/ChargerSystem.cs +++ b/Content.Server/Power/EntitySystems/ChargerSystem.cs @@ -1,8 +1,10 @@ using Content.Server.Power.Components; +using Content.Server.Emp; using Content.Server.PowerCell; using Content.Shared.Examine; using Content.Shared.Power; using Content.Shared.PowerCell.Components; +using Content.Shared.Emp; using JetBrains.Annotations; using Robust.Shared.Containers; using System.Diagnostics.CodeAnalysis; @@ -28,6 +30,8 @@ internal sealed class ChargerSystem : EntitySystem SubscribeLocalEvent(OnInsertAttempt); SubscribeLocalEvent(OnEntityStorageInsertAttempt); SubscribeLocalEvent(OnChargerExamine); + + SubscribeLocalEvent(OnEmpPulse); } private void OnStartup(EntityUid uid, ChargerComponent component, ComponentStartup args) @@ -158,18 +162,27 @@ internal sealed class ChargerSystem : EntitySystem } } + private void OnEmpPulse(EntityUid uid, ChargerComponent component, ref EmpPulseEvent args) + { + args.Affected = true; + args.Disabled = true; + } + private CellChargerStatus GetStatus(EntityUid uid, ChargerComponent component) { - if (!TryComp(uid, out TransformComponent? transformComponent)) - return CellChargerStatus.Off; - - if (!transformComponent.Anchored) - return CellChargerStatus.Off; + if (!component.Portable) + { + if (!TryComp(uid, out TransformComponent? transformComponent) || !transformComponent.Anchored) + return CellChargerStatus.Off; + } if (!TryComp(uid, out ApcPowerReceiverComponent? apcPowerReceiverComponent)) return CellChargerStatus.Off; - if (!apcPowerReceiverComponent.Powered) + if (!component.Portable && !apcPowerReceiverComponent.Powered) + return CellChargerStatus.Off; + + if (HasComp(uid)) return CellChargerStatus.Off; if (!_container.TryGetContainer(uid, component.SlotId, out var container)) @@ -186,7 +199,7 @@ internal sealed class ChargerSystem : EntitySystem return CellChargerStatus.Charging; } - + private void TransferPower(EntityUid uid, EntityUid targetEntity, ChargerComponent component, float frameTime) { if (!TryComp(uid, out ApcPowerReceiverComponent? receiverComponent)) diff --git a/Resources/Prototypes/Entities/Objects/Power/portable_recharger.yml b/Resources/Prototypes/Entities/Objects/Power/portable_recharger.yml new file mode 100644 index 0000000000..35dfa0881f --- /dev/null +++ b/Resources/Prototypes/Entities/Objects/Power/portable_recharger.yml @@ -0,0 +1,35 @@ +- type: entity + parent: Clothing + id: PortableRecharger + name: portable recharger + description: High-tech recharger adapted for portability + components: + - type: Item + size: Huge + - type: Sprite + sprite: Objects/Power/portable_recharger.rsi + state: charging + - type: Clothing + equippedPrefix: charging + quickEquip: false + slots: + - back + - type: Charger + slotId: charger_slot + portable: true + - type: PowerChargerVisuals + - type: ApcPowerReceiver + needsPower: false + powerLoad: 0 + - type: StaticPrice + price: 500 + - type: Tag + tags: [] # ignore "WhitelistChameleon" tag + - type: ItemSlots + slots: + charger_slot: + ejectOnInteract: true + whitelist: + components: + - HitscanBatteryAmmoProvider + - ProjectileBatteryAmmoProvider \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml index b237fc88ed..2a080a85db 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml @@ -737,6 +737,14 @@ - WeaponLaserCannon - WeaponLaserCarbine - WeaponXrayCannon + - PowerCageSmall + - PowerCageMedium + - PowerCageHigh + - ShuttleGunSvalinnMachineGunCircuitboard + - ShuttleGunPerforatorCircuitboard + - ShuttleGunFriendshipCircuitboard + - ShuttleGunDusterCircuitboard + - PortableRecharger - type: MaterialStorage whitelist: tags: diff --git a/Resources/Prototypes/Recipes/Lathes/security.yml b/Resources/Prototypes/Recipes/Lathes/security.yml index bad38fc99f..2ab8e18372 100644 --- a/Resources/Prototypes/Recipes/Lathes/security.yml +++ b/Resources/Prototypes/Recipes/Lathes/security.yml @@ -690,3 +690,14 @@ Steel: 150 Plastic: 100 Glass: 20 + +- type: latheRecipe + id: PortableRecharger + result: PortableRecharger + completetime: 15 + materials: + Steel: 2000 + Uranium: 2000 + Plastic: 1000 + Plasma: 500 + Glass: 500 \ No newline at end of file diff --git a/Resources/Prototypes/Research/arsenal.yml b/Resources/Prototypes/Research/arsenal.yml index 2daa3fdcc0..6c0e94e9e5 100644 --- a/Resources/Prototypes/Research/arsenal.yml +++ b/Resources/Prototypes/Research/arsenal.yml @@ -175,6 +175,7 @@ cost: 15000 recipeUnlocks: - WeaponAdvancedLaser + - PortableRecharger - type: technology id: ExperimentalBatteryAmmo diff --git a/Resources/Textures/Objects/Power/portable_recharger.rsi/charging-equipped-BACKPACK.png b/Resources/Textures/Objects/Power/portable_recharger.rsi/charging-equipped-BACKPACK.png new file mode 100644 index 0000000000..500ad05704 Binary files /dev/null and b/Resources/Textures/Objects/Power/portable_recharger.rsi/charging-equipped-BACKPACK.png differ diff --git a/Resources/Textures/Objects/Power/portable_recharger.rsi/charging-unlit.png b/Resources/Textures/Objects/Power/portable_recharger.rsi/charging-unlit.png new file mode 100644 index 0000000000..6c902b7d7e Binary files /dev/null and b/Resources/Textures/Objects/Power/portable_recharger.rsi/charging-unlit.png differ diff --git a/Resources/Textures/Objects/Power/portable_recharger.rsi/charging.png b/Resources/Textures/Objects/Power/portable_recharger.rsi/charging.png new file mode 100644 index 0000000000..6105bb4ad3 Binary files /dev/null and b/Resources/Textures/Objects/Power/portable_recharger.rsi/charging.png differ diff --git a/Resources/Textures/Objects/Power/portable_recharger.rsi/inhand-left.png b/Resources/Textures/Objects/Power/portable_recharger.rsi/inhand-left.png new file mode 100644 index 0000000000..e3bc6d8299 Binary files /dev/null and b/Resources/Textures/Objects/Power/portable_recharger.rsi/inhand-left.png differ diff --git a/Resources/Textures/Objects/Power/portable_recharger.rsi/inhand-right.png b/Resources/Textures/Objects/Power/portable_recharger.rsi/inhand-right.png new file mode 100644 index 0000000000..8c65192231 Binary files /dev/null and b/Resources/Textures/Objects/Power/portable_recharger.rsi/inhand-right.png differ diff --git a/Resources/Textures/Objects/Power/portable_recharger.rsi/meta.json b/Resources/Textures/Objects/Power/portable_recharger.rsi/meta.json new file mode 100644 index 0000000000..794f491bdb --- /dev/null +++ b/Resources/Textures/Objects/Power/portable_recharger.rsi/meta.json @@ -0,0 +1,92 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Sprited by Lomovar", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "charging", + "delays": [ + [ + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3 + ] + ] + }, + { + "name": "charging-equipped-BACKPACK", + "directions": 4, + "delays": [ + [ + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3 + ], + [ + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3 + ], + [ + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3 + ], + [ + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3 + ] + ] + }, + { + "name": "charging-unlit", + "delays": [ + [ + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3 + ] + ] + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} +