Files
wwdpublic/Content.Shared/Chasm/ChasmSystem.cs
SimpleStation14 2bf744ddf6 Mirror: Landmine stepoff (#358)
## Mirror of PR #22962: [Landmine
stepoff](https://github.com/space-wizards/space-station-14/pull/22962)
from <img src="https://avatars.githubusercontent.com/u/10567778?v=4"
alt="space-wizards" width="22"/>
[space-wizards](https://github.com/space-wizards)/[space-station-14](https://github.com/space-wizards/space-station-14)

###### `54dd273f660d6d8d523d0771bb8d8437373b082e`

PR opened by <img
src="https://avatars.githubusercontent.com/u/59531932?v=4"
width="16"/><a href="https://github.com/YuriyKiss"> YuriyKiss</a> at
2023-12-25 12:38:55 UTC

---

PR changed 13 files with 95 additions and 47 deletions.

The PR had the following labels:
- Status: Awaiting Changes


---

<details open="true"><summary><h1>Original Body</h1></summary>

> ## About the PR
> Landmine will explode when player steps off it. Landmine will make a
sound effect when player steps on it
> Close #21658 (Issue has some other suggestions, turn them into
separate issues if relevant)
> 
> Requires https://github.com/space-wizards/RobustToolbox/pull/4883
> 
> ## Why / Balance
> IRL some landmines will only trigger after you release the pressure
put on them.
> 
> ## Technical details
> There are two landmine modes now, one will make landmine trigger
immediately after player steps on them another one will only trigger
after player steps off the landmine (this is the default now).
> 
> ## Media
> Landmine stepoff in action:
> 
>
https://github.com/space-wizards/space-station-14/assets/59531932/6e884619-7217-4301-bd78-6e843e0d78f1
> 
> - [X] I have added screenshots/videos to this PR showcasing its
changes ingame, **or** this PR does not require an ingame showcase
> 
> ## Breaking changes
> 
> 
> **Changelog**
> - tweak: landmines will trigger after you step off them
> - add: landmine trigger sound
> 


</details>

Signed-off-by: VMSolidus <evilexecutive@gmail.com>
Co-authored-by: SimpleStation14 <Unknown>
Co-authored-by: VMSolidus <evilexecutive@gmail.com>
2024-06-17 11:12:29 +01:00

80 lines
2.5 KiB
C#

using Content.Shared.ActionBlocker;
using Content.Shared.Buckle.Components;
using Content.Shared.Movement.Events;
using Content.Shared.StepTrigger.Systems;
using Robust.Shared.Audio;
using Robust.Shared.Audio.Systems;
using Robust.Shared.Network;
using Robust.Shared.Physics.Components;
using Robust.Shared.Timing;
namespace Content.Shared.Chasm;
/// <summary>
/// Handles making entities fall into chasms when stepped on.
/// </summary>
public sealed class ChasmSystem : EntitySystem
{
[Dependency] private readonly IGameTiming _timing = default!;
[Dependency] private readonly ActionBlockerSystem _blocker = default!;
[Dependency] private readonly INetManager _net = default!;
[Dependency] private readonly SharedAudioSystem _audio = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<ChasmComponent, StepTriggeredOffEvent>(OnStepTriggered);
SubscribeLocalEvent<ChasmComponent, StepTriggerAttemptEvent>(OnStepTriggerAttempt);
SubscribeLocalEvent<ChasmFallingComponent, UpdateCanMoveEvent>(OnUpdateCanMove);
}
public override void Update(float frameTime)
{
base.Update(frameTime);
// don't predict queuedels on client
if (_net.IsClient)
return;
var query = EntityQueryEnumerator<ChasmFallingComponent>();
while (query.MoveNext(out var uid, out var chasm))
{
if (_timing.CurTime < chasm.NextDeletionTime)
continue;
QueueDel(uid);
}
}
private void OnStepTriggered(EntityUid uid, ChasmComponent component, ref StepTriggeredOffEvent args)
{
// already doomed
if (HasComp<ChasmFallingComponent>(args.Tripper))
return;
StartFalling(uid, component, args.Tripper);
}
public void StartFalling(EntityUid chasm, ChasmComponent component, EntityUid tripper, bool playSound = true)
{
var falling = AddComp<ChasmFallingComponent>(tripper);
falling.NextDeletionTime = _timing.CurTime + falling.DeletionTime;
_blocker.UpdateCanMove(tripper);
if (playSound)
_audio.PlayPredicted(component.FallingSound, chasm, tripper);
}
private void OnStepTriggerAttempt(EntityUid uid, ChasmComponent component, ref StepTriggerAttemptEvent args)
{
args.Continue = true;
}
private void OnUpdateCanMove(EntityUid uid, ChasmFallingComponent component, UpdateCanMoveEvent args)
{
args.Cancel();
}
}