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
+ }
+ ]
+}
+