Skip to content

Commit 3f90b6f

Browse files
committed
Add JailModule and jail/free commands
1 parent 7048819 commit 3f90b6f

2 files changed

Lines changed: 115 additions & 0 deletions

File tree

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
using BF2WebAdmin.Common;
2+
using BF2WebAdmin.Server.Abstractions;
3+
using BF2WebAdmin.Server.Extensions;
4+
5+
namespace BF2WebAdmin.Server.Commands.BF2;
6+
7+
[Command("jail <Name>", Auth.Admin)]
8+
public class JailPlayerCommand : BaseCommand
9+
{
10+
public string Name { get; set; }
11+
}
12+
13+
[Command("free <Name>", Auth.Admin)]
14+
public class FreePlayerCommand : BaseCommand
15+
{
16+
public string Name { get; set; }
17+
}
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
using System.Collections.Concurrent;
2+
using BF2WebAdmin.Common.Entities.Game;
3+
using BF2WebAdmin.Server.Abstractions;
4+
using BF2WebAdmin.Server.Commands.BF2;
5+
using BF2WebAdmin.Server.Extensions;
6+
7+
namespace BF2WebAdmin.Server.Modules.BF2;
8+
9+
public class JailModule : BaseModule,
10+
IHandleCommandAsync<JailPlayerCommand>,
11+
IHandleCommandAsync<FreePlayerCommand>,
12+
IHandleEventAsync<PlayerLeftEvent>,
13+
IHandleEventAsync<PlayerSpawnEvent>
14+
{
15+
// TODO: datetime when they were jailed, only keep for 1 hour
16+
private readonly ConcurrentDictionary<string, DateTime> _jailedPlayers = new();
17+
// private readonly Position _jailPosition = new(777.500, 164.000, -5.000); // dalian carrier south
18+
// private readonly Position _jailPosition = new(776.600, 164.000, 181.200); // dalian carrier north
19+
private readonly Position _jailPosition = new(784.300, 174.000, 65.400); // dalian carrier center
20+
21+
public JailModule(IGameServer server, ILogger<JailModule> logger, CancellationTokenSource cts) : base(server, logger, cts)
22+
{
23+
}
24+
25+
public async ValueTask HandleAsync(JailPlayerCommand command)
26+
{
27+
var player = GameServer.GetPlayerByName(command.Name);
28+
if (player == null)
29+
return;
30+
31+
var jailExists = _jailedPlayers.Any();
32+
_jailedPlayers.AddOrUpdate(player.Hash, id => DateTime.UtcNow, (id, p) => DateTime.UtcNow);
33+
GameServer.GameWriter.SendText($"Player {player.Name} has been jailed");
34+
35+
if (jailExists)
36+
return;
37+
38+
RunBackgroundTask("Player jail teleport", async () =>
39+
{
40+
while (!ModuleCancellationToken.IsCancellationRequested && _jailedPlayers.Any())
41+
{
42+
var heightMod = 0;
43+
44+
foreach (var (prisonerHash, jailedTime) in _jailedPlayers)
45+
{
46+
// Player has served their time
47+
var isTimeOver = (DateTime.UtcNow - jailedTime).TotalHours > 1;
48+
if (isTimeOver)
49+
{
50+
_jailedPlayers.TryRemove(prisonerHash, out _);
51+
GameServer.GameWriter.SendText("Player has been freed after 1 hour");
52+
continue;
53+
}
54+
55+
// Player disconnected - don't remove in case they rejoin
56+
var prisoner = GameServer.GetPlayerByHash(prisonerHash);
57+
if (prisoner == null)
58+
{
59+
continue;
60+
}
61+
62+
// No escape
63+
var distance = _jailPosition.Distance(prisoner.Position);
64+
if (distance > 100)
65+
{
66+
GameServer.GameWriter.SendTeleport(prisoner, new Position(_jailPosition.X, _jailPosition.Height + heightMod, _jailPosition.Y));
67+
heightMod += 10;
68+
}
69+
}
70+
71+
await Task.Delay(2_000);
72+
}
73+
});
74+
}
75+
76+
public async ValueTask HandleAsync(FreePlayerCommand command)
77+
{
78+
var player = GameServer.GetPlayerByName(command.Name);
79+
if (player == null)
80+
return;
81+
82+
_jailedPlayers.TryRemove(player.Hash, out _);
83+
GameServer.GameWriter.SendText($"Player {player.Name} has been freed");
84+
}
85+
86+
public async ValueTask HandleAsync(PlayerLeftEvent e)
87+
{
88+
_jailedPlayers.TryRemove(e.Player.Hash, out _);
89+
}
90+
91+
public async ValueTask HandleAsync(PlayerSpawnEvent e)
92+
{
93+
if (!_jailedPlayers.ContainsKey(e.Player.Hash))
94+
return;
95+
96+
GameServer.GameWriter.SendTeleport(e.Player, _jailPosition);
97+
}
98+
}

0 commit comments

Comments
 (0)