diff --git a/Content.Server/EmpFlashlight/EmpOnHitComponent.cs b/Content.Server/EmpFlashlight/EmpOnHitComponent.cs new file mode 100644 index 0000000000..bce182d63a --- /dev/null +++ b/Content.Server/EmpFlashlight/EmpOnHitComponent.cs @@ -0,0 +1,19 @@ +namespace Content.Server.EmpFlashlight; + +/// +/// Upon being triggered will EMP target. +/// +[RegisterComponent] +[Access(typeof(EmpOnHitSystem))] + +public sealed partial class EmpOnHitComponent : Component +{ + [DataField] + public float Range = 1.0f; + + [DataField] + public float EnergyConsumption; + + [DataField] + public float DisableDuration = 60f; +} diff --git a/Content.Server/EmpFlashlight/EmpOnHitSystem.cs b/Content.Server/EmpFlashlight/EmpOnHitSystem.cs new file mode 100644 index 0000000000..19b7300f9b --- /dev/null +++ b/Content.Server/EmpFlashlight/EmpOnHitSystem.cs @@ -0,0 +1,44 @@ +using Content.Shared.Weapons.Melee.Events; +using Content.Server.Emp; +using Content.Shared.Charges.Systems; +using Content.Shared.Charges.Components; + +namespace Content.Server.EmpFlashlight; + +public sealed class EmpOnHitSystem : EntitySystem +{ + + [Dependency] private readonly EmpSystem _emp = default!; + [Dependency] private readonly SharedChargesSystem _charges = default!; + [Dependency] private readonly SharedTransformSystem _transform = default!; + + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(HandleEmpHit); + } + + public bool TryEmpHit(EntityUid uid, EmpOnHitComponent comp, MeleeHitEvent args) + { + + if (!TryComp(uid, out LimitedChargesComponent? charges) + || _charges.IsEmpty(uid, charges) + || args.HitEntities.Count <= 0) + return false; + + _charges.UseCharge(uid, charges); + return true; + } + + private void HandleEmpHit(EntityUid uid, EmpOnHitComponent comp, MeleeHitEvent args) + { + if (!TryEmpHit(uid, comp, args)) + return; + + foreach (var affected in args.HitEntities) + _emp.EmpPulse(_transform.GetMapCoordinates(affected), comp.Range, comp.EnergyConsumption, comp.DisableDuration); + + args.Handled = true; + } +} + diff --git a/Resources/Locale/en-US/store/uplink-catalog.ftl b/Resources/Locale/en-US/store/uplink-catalog.ftl index e1b9776deb..1754bb89d3 100644 --- a/Resources/Locale/en-US/store/uplink-catalog.ftl +++ b/Resources/Locale/en-US/store/uplink-catalog.ftl @@ -26,6 +26,9 @@ uplink-fire-axe-flaming-desc = A classic-style weapon infused with advanced atmo uplink-gloves-north-star-name = Gloves of the North Star uplink-gloves-north-star-desc = A pair of gloves that reduce your punching cooldown drastically, allowing you to beat people to death in a flurry of punches. +uplink-emp-flashlight-name = Emp Flashlight +uplink-emp-flashlight-desc = A rechargeable device disguised as a flashlight designed to disrupt electronic systems. Useful for disrupting communications, security's energy weapons, and APCs when you're in a tight spot. + # Explosives uplink-explosive-grenade-name = Explosive Grenade uplink-explosive-grenade-desc = A simplistic grenade with a three-and-a-half-second long fuse that is geared towards injuring personnel. Causes minimal hull damage. diff --git a/Resources/Locale/ru-RU/entities/objects/tools/empflashlight.ftl b/Resources/Locale/ru-RU/entities/objects/tools/empflashlight.ftl new file mode 100644 index 0000000000..e9ffe8e039 --- /dev/null +++ b/Resources/Locale/ru-RU/entities/objects/tools/empflashlight.ftl @@ -0,0 +1,2 @@ +ent-FlashlightEmp = Фонарик + .desc = Он озаряет путь к свободе. diff --git a/Resources/Locale/ru-RU/store/uplink-catalog.ftl b/Resources/Locale/ru-RU/store/uplink-catalog.ftl index eee4377eb8..8bc90dd161 100644 --- a/Resources/Locale/ru-RU/store/uplink-catalog.ftl +++ b/Resources/Locale/ru-RU/store/uplink-catalog.ftl @@ -29,6 +29,9 @@ uplink-fire-axe-flaming-desc = Оружие в классическом стил uplink-gloves-north-star-name = Перчатки Полярной звезды uplink-gloves-north-star-desc = Пара перчаток, которые резко сокращают время восстановления ваших ударов, позволяя вам избивать людей до смерти шквалом ударов. +uplink-emp-flashlight-name = Электромагнитный фонарик +uplink-emp-flashlight-desc = Замаскированное под фонарик устройство. При ударе выпускает ЭМИ, поражающий электрические устройства. + # Explosives uplink-explosive-grenade-name = Разрывная граната uplink-explosive-grenade-desc = Граната, которая производит небольшой, но разрушительный взрыв. diff --git a/Resources/Prototypes/Catalog/uplink_catalog.yml b/Resources/Prototypes/Catalog/uplink_catalog.yml index 9e19f4ecbf..e76c55969c 100644 --- a/Resources/Prototypes/Catalog/uplink_catalog.yml +++ b/Resources/Prototypes/Catalog/uplink_catalog.yml @@ -1417,6 +1417,16 @@ categories: - UplinkUtility +- type: listing + id: UplinkEmpFlashlight + name: uplink-emp-flashlight-name + description: uplink-emp-flashlight-desc + productEntity: FlashlightEmp + cost: + Telecrystal: 3 + categories: + - UplinkUtility + # Armor - type: listing diff --git a/Resources/Prototypes/Entities/Objects/Tools/EmpFlashlight.yml b/Resources/Prototypes/Entities/Objects/Tools/EmpFlashlight.yml new file mode 100644 index 0000000000..1da304ba1a --- /dev/null +++ b/Resources/Prototypes/Entities/Objects/Tools/EmpFlashlight.yml @@ -0,0 +1,26 @@ +- type: entity + parent: FlashlightLantern + id: FlashlightEmp + name: flashlight + description: It lights the way to freedom. + suffix: EMP + components: + - type: ItemSlots + slots: + cell_slot: + name: power-cell-clot-component-spot-name-default + startingItem: PowerCellHigh + - type: MeleeWeapon + wideAnimationRotation: -135 + damage: + types: + Blunt: 12 + angle: 60 + animation: WeaponArcThrust + - type: EmpOnHit + range: 0.1 + energyConsumption: 100000 + disableDuration: 100 + - type: LimitedCharges + - type: AutoRecharge + rechargeDuration: 60