Disposable turret explodes when empty (#18175)
* turret go boom * fix ammo * universal function name * Also explodes when destroyed * comment added * Triggerwhenemptycomponent added * comment adjusted * Updated uplink description * Moved to own event file * file namespace * rerun tests --------- Co-authored-by: Slava0135 <super.novalskiy_0135@inbox.ru>
This commit is contained in:
@@ -2,7 +2,6 @@ using System.Numerics;
|
|||||||
using Content.Client.Items;
|
using Content.Client.Items;
|
||||||
using Content.Client.Weapons.Ranged.Components;
|
using Content.Client.Weapons.Ranged.Components;
|
||||||
using Content.Shared.Camera;
|
using Content.Shared.Camera;
|
||||||
using Content.Shared.Input;
|
|
||||||
using Content.Shared.Spawners.Components;
|
using Content.Shared.Spawners.Components;
|
||||||
using Content.Shared.Weapons.Ranged;
|
using Content.Shared.Weapons.Ranged;
|
||||||
using Content.Shared.Weapons.Ranged.Components;
|
using Content.Shared.Weapons.Ranged.Components;
|
||||||
|
|||||||
@@ -0,0 +1,9 @@
|
|||||||
|
namespace Content.Server.Explosion.Components;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Triggers a gun when attempting to shoot while it's empty
|
||||||
|
/// </summary>
|
||||||
|
[RegisterComponent]
|
||||||
|
public sealed class TriggerWhenEmptyComponent : Component
|
||||||
|
{
|
||||||
|
}
|
||||||
@@ -22,7 +22,7 @@ using Robust.Shared.Physics.Events;
|
|||||||
using Robust.Shared.Physics.Systems;
|
using Robust.Shared.Physics.Systems;
|
||||||
using Content.Shared.Mobs;
|
using Content.Shared.Mobs;
|
||||||
using Content.Shared.Mobs.Components;
|
using Content.Shared.Mobs.Components;
|
||||||
using Robust.Shared.Player;
|
using Content.Shared.Weapons.Ranged.Events;
|
||||||
|
|
||||||
namespace Content.Server.Explosion.EntitySystems
|
namespace Content.Server.Explosion.EntitySystems
|
||||||
{
|
{
|
||||||
@@ -77,6 +77,7 @@ namespace Content.Server.Explosion.EntitySystems
|
|||||||
SubscribeLocalEvent<TriggerImplantActionComponent, ActivateImplantEvent>(OnImplantTrigger);
|
SubscribeLocalEvent<TriggerImplantActionComponent, ActivateImplantEvent>(OnImplantTrigger);
|
||||||
SubscribeLocalEvent<TriggerOnStepTriggerComponent, StepTriggeredEvent>(OnStepTriggered);
|
SubscribeLocalEvent<TriggerOnStepTriggerComponent, StepTriggeredEvent>(OnStepTriggered);
|
||||||
SubscribeLocalEvent<TriggerOnSlipComponent, SlipEvent>(OnSlipTriggered);
|
SubscribeLocalEvent<TriggerOnSlipComponent, SlipEvent>(OnSlipTriggered);
|
||||||
|
SubscribeLocalEvent<TriggerWhenEmptyComponent, OnEmptyGunShotEvent>(OnEmptyTriggered);
|
||||||
|
|
||||||
SubscribeLocalEvent<SpawnOnTriggerComponent, TriggerEvent>(OnSpawnTrigger);
|
SubscribeLocalEvent<SpawnOnTriggerComponent, TriggerEvent>(OnSpawnTrigger);
|
||||||
SubscribeLocalEvent<DeleteOnTriggerComponent, TriggerEvent>(HandleDeleteTrigger);
|
SubscribeLocalEvent<DeleteOnTriggerComponent, TriggerEvent>(HandleDeleteTrigger);
|
||||||
@@ -186,6 +187,11 @@ namespace Content.Server.Explosion.EntitySystems
|
|||||||
Trigger(uid, args.Slipped);
|
Trigger(uid, args.Slipped);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void OnEmptyTriggered(EntityUid uid, TriggerWhenEmptyComponent component, ref OnEmptyGunShotEvent args)
|
||||||
|
{
|
||||||
|
Trigger(uid, args.EmptyGun);
|
||||||
|
}
|
||||||
|
|
||||||
public bool Trigger(EntityUid trigger, EntityUid? user = null)
|
public bool Trigger(EntityUid trigger, EntityUid? user = null)
|
||||||
{
|
{
|
||||||
var triggerEvent = new TriggerEvent(trigger, user);
|
var triggerEvent = new TriggerEvent(trigger, user);
|
||||||
|
|||||||
@@ -0,0 +1,7 @@
|
|||||||
|
namespace Content.Shared.Weapons.Ranged.Events;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Raised directed on the gun when trying to fire it while it's out of ammo
|
||||||
|
/// </summary>
|
||||||
|
[ByRefEvent]
|
||||||
|
public record struct OnEmptyGunShotEvent(EntityUid EmptyGun);
|
||||||
@@ -130,9 +130,8 @@ public abstract partial class SharedGunSystem
|
|||||||
|
|
||||||
private void OnBallisticVerb(EntityUid uid, BallisticAmmoProviderComponent component, GetVerbsEvent<Verb> args)
|
private void OnBallisticVerb(EntityUid uid, BallisticAmmoProviderComponent component, GetVerbsEvent<Verb> args)
|
||||||
{
|
{
|
||||||
if (!args.CanAccess || !args.CanInteract || args.Hands == null)
|
if (!args.CanAccess || !args.CanInteract || args.Hands == null || !component.Cycleable)
|
||||||
return;
|
return;
|
||||||
if (component.Cycleable == true)
|
|
||||||
args.Verbs.Add(new Verb()
|
args.Verbs.Add(new Verb()
|
||||||
{
|
{
|
||||||
Text = Loc.GetString("gun-ballistic-cycle"),
|
Text = Loc.GetString("gun-ballistic-cycle"),
|
||||||
@@ -151,6 +150,9 @@ public abstract partial class SharedGunSystem
|
|||||||
|
|
||||||
private void ManualCycle(EntityUid uid, BallisticAmmoProviderComponent component, MapCoordinates coordinates, EntityUid? user = null, GunComponent? gunComp = null)
|
private void ManualCycle(EntityUid uid, BallisticAmmoProviderComponent component, MapCoordinates coordinates, EntityUid? user = null, GunComponent? gunComp = null)
|
||||||
{
|
{
|
||||||
|
if (!component.Cycleable)
|
||||||
|
return;
|
||||||
|
|
||||||
// Reset shotting for cycling
|
// Reset shotting for cycling
|
||||||
if (Resolve(uid, ref gunComp, false) &&
|
if (Resolve(uid, ref gunComp, false) &&
|
||||||
gunComp is { FireRate: > 0f } &&
|
gunComp is { FireRate: > 0f } &&
|
||||||
|
|||||||
@@ -7,7 +7,6 @@ using Content.Shared.Damage;
|
|||||||
using Content.Shared.Examine;
|
using Content.Shared.Examine;
|
||||||
using Content.Shared.Gravity;
|
using Content.Shared.Gravity;
|
||||||
using Content.Shared.Hands.Components;
|
using Content.Shared.Hands.Components;
|
||||||
using Content.Shared.Interaction.Events;
|
|
||||||
using Content.Shared.Popups;
|
using Content.Shared.Popups;
|
||||||
using Content.Shared.Projectiles;
|
using Content.Shared.Projectiles;
|
||||||
using Content.Shared.Tag;
|
using Content.Shared.Tag;
|
||||||
@@ -304,6 +303,10 @@ public abstract partial class SharedGunSystem : EntitySystem
|
|||||||
|
|
||||||
if (ev.Ammo.Count <= 0)
|
if (ev.Ammo.Count <= 0)
|
||||||
{
|
{
|
||||||
|
// triggers effects on the gun if it's empty
|
||||||
|
var emptyGunShotEvent = new OnEmptyGunShotEvent();
|
||||||
|
RaiseLocalEvent(gunUid, ref emptyGunShotEvent);
|
||||||
|
|
||||||
// Play empty gun sounds if relevant
|
// Play empty gun sounds if relevant
|
||||||
// If they're firing an existing clip then don't play anything.
|
// If they're firing an existing clip then don't play anything.
|
||||||
if (shots > 0)
|
if (shots > 0)
|
||||||
|
|||||||
@@ -212,7 +212,7 @@ uplink-proximity-mine-name = Proximity Mine
|
|||||||
uplink-proximity-mine-desc = A mine disguised as a wet floor sign.
|
uplink-proximity-mine-desc = A mine disguised as a wet floor sign.
|
||||||
|
|
||||||
uplink-disposable-turret-name = Disposable Ballistic Turret
|
uplink-disposable-turret-name = Disposable Ballistic Turret
|
||||||
uplink-disposable-turret-desc = Looks and functions like a normal electrical toolbox. Upon hitting the toolbox it will transform into a ballistic turret, theoretically shooting at anyone except members of the syndicate.
|
uplink-disposable-turret-desc = Looks and functions like a normal electrical toolbox. Upon hitting the toolbox it will transform into a ballistic turret, theoretically shooting at anyone except members of the syndicate. Can be turned back into a toolbox using a screwdriver and repaired using a wrench.
|
||||||
|
|
||||||
# Armor
|
# Armor
|
||||||
uplink-chameleon-name = Chameleon Kit
|
uplink-chameleon-name = Chameleon Kit
|
||||||
|
|||||||
@@ -143,14 +143,7 @@
|
|||||||
behaviors:
|
behaviors:
|
||||||
- !type:DoActsBehavior
|
- !type:DoActsBehavior
|
||||||
acts: [ "Destruction" ]
|
acts: [ "Destruction" ]
|
||||||
- !type:PlaySoundBehavior
|
- !type:TriggerBehavior
|
||||||
sound:
|
|
||||||
path: /Audio/Effects/metalbreak.ogg
|
|
||||||
- !type:SpawnEntitiesBehavior
|
|
||||||
spawn:
|
|
||||||
WeaponTurretSyndicateBroken:
|
|
||||||
min: 1
|
|
||||||
max: 1
|
|
||||||
- type: Gun
|
- type: Gun
|
||||||
fireRate: 2
|
fireRate: 2
|
||||||
selectedMode: FullAuto
|
selectedMode: FullAuto
|
||||||
@@ -168,6 +161,14 @@
|
|||||||
- type: Repairable
|
- type: Repairable
|
||||||
qualityNeeded: "Anchoring"
|
qualityNeeded: "Anchoring"
|
||||||
doAfterDelay: 3
|
doAfterDelay: 3
|
||||||
|
- type: TriggerWhenEmpty
|
||||||
|
- type: ExplodeOnTrigger
|
||||||
|
- type: Explosive
|
||||||
|
explosionType: Default
|
||||||
|
maxIntensity: 10
|
||||||
|
intensitySlope: 1.5
|
||||||
|
totalIntensity: 30
|
||||||
|
canCreateVacuum: false
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
parent: BaseWeaponTurret
|
parent: BaseWeaponTurret
|
||||||
|
|||||||
Reference in New Issue
Block a user