Skip to content

Commit 903945b

Browse files
authored
Merge pull request #44 from B3none/player-join-improvements
Player join improvements and breaker manager stability improvements
2 parents e48a46e + 573cf04 commit 903945b

File tree

3 files changed

+92
-93
lines changed

3 files changed

+92
-93
lines changed

Modules/Managers/BreakerManager.cs

Lines changed: 4 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -71,33 +71,17 @@ public void Handle()
7171
{
7272
case "func_breakable":
7373
case "func_breakable_surf":
74+
case "prop_dynamic":
75+
case "prop.breakable.01":
76+
case "prop.breakable.02":
7477
var breakableEntity = new PointerTo<CBreakable>(pEntity.Handle).Value;
7578

7679
if (breakableEntity.IsValid)
7780
{
7881
breakableEntity.AcceptInput(action);
7982
}
8083
break;
81-
82-
case "prop.breakable.01":
83-
case "prop.breakable.02":
84-
var breakableProp = new PointerTo<CBreakableProp>(pEntity.Handle).Value;
85-
86-
if (breakableProp.IsValid)
87-
{
88-
breakableProp.AcceptInput(action);
89-
}
90-
break;
91-
92-
case "prop_dynamic":
93-
var dynamicProp = new PointerTo<CDynamicProp>(pEntity.Handle).Value;
94-
95-
if (dynamicProp.IsValid)
96-
{
97-
dynamicProp.AcceptInput(action);
98-
}
99-
break;
100-
84+
10185
case "func_button":
10286
var button = new PointerTo<CBaseButton>(pEntity.Handle).Value;
10387

Modules/Managers/QueueManager.cs

Lines changed: 69 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -30,39 +30,40 @@ public int GetTargetNumTerrorists()
3030
// Ensure at least one terrorist if the calculated number is zero
3131
return numTerrorists > 0 ? numTerrorists : 1;
3232
}
33-
33+
3434
public int GetTargetNumCounterTerrorists()
3535
{
3636
return ActivePlayers.Count - GetTargetNumTerrorists();
3737
}
3838

39-
public void PlayerJoinedTeam(CCSPlayerController player, CsTeam fromTeam, CsTeam toTeam)
39+
public HookResult PlayerJoinedTeam(CCSPlayerController player, CsTeam fromTeam, CsTeam toTeam)
4040
{
4141
Console.WriteLine($"{RetakesPlugin.LogPrefix}[{player.PlayerName}] PlayerTriedToJoinTeam called.");
42-
42+
4343
if (
44-
fromTeam == CsTeam.None && toTeam == CsTeam.Spectator
44+
fromTeam == CsTeam.None && toTeam == CsTeam.Spectator
4545
|| fromTeam == CsTeam.Spectator && toTeam == CsTeam.None
4646
|| fromTeam == toTeam && toTeam == CsTeam.None
4747
)
4848
{
4949
// This is called when a player first joins.
50-
Console.WriteLine($"{RetakesPlugin.LogPrefix}[{player.PlayerName}] {fromTeam.ToString()} -> {toTeam.ToString()}.");
51-
return;
50+
Console.WriteLine(
51+
$"{RetakesPlugin.LogPrefix}[{player.PlayerName}] {fromTeam.ToString()} -> {toTeam.ToString()}.");
52+
return HookResult.Continue;
5253
}
53-
54+
5455
Console.WriteLine($"{RetakesPlugin.LogPrefix}[{player.PlayerName}] Checking ActivePlayers.");
5556
if (ActivePlayers.Contains(player))
5657
{
5758
Console.WriteLine($"{RetakesPlugin.LogPrefix}[{player.PlayerName}] Player is an active player.");
58-
59+
5960
if (toTeam == CsTeam.Spectator)
6061
{
6162
Console.WriteLine($"{RetakesPlugin.LogPrefix}[{player.PlayerName}] Switching to spectator.");
6263
RemovePlayerFromQueues(player);
63-
return;
64+
return HookResult.Continue;
6465
}
65-
66+
6667
if (
6768
_roundTerrorists.Count > 0
6869
&& _roundCounterTerrorists.Count > 0
@@ -80,13 +81,13 @@ public void PlayerJoinedTeam(CCSPlayerController player, CsTeam fromTeam, CsTeam
8081
{
8182
player.CommitSuicide(false, true);
8283
}
83-
84+
8485
player.ChangeTeam(CsTeam.Spectator);
85-
return;
86+
return HookResult.Handled;
8687
}
87-
88-
Console.WriteLine($"{RetakesPlugin.LogPrefix}[{player.PlayerName}] Do nothing.");
89-
return;
88+
89+
Console.WriteLine($"{RetakesPlugin.LogPrefix}[{player.PlayerName}] The player tried joining the team they're already on, or, there were not enough players so we don't care. Do nothing.");
90+
return HookResult.Handled;
9091
}
9192

9293
Console.WriteLine($"{RetakesPlugin.LogPrefix}[{player.PlayerName}] Checking QueuePlayers.");
@@ -96,63 +97,58 @@ public void PlayerJoinedTeam(CCSPlayerController player, CsTeam fromTeam, CsTeam
9697
{
9798
Console.WriteLine($"{RetakesPlugin.LogPrefix}[{player.PlayerName}] Not found, adding to ActivePlayers (because in warmup).");
9899
ActivePlayers.Add(player);
99-
return;
100+
return HookResult.Continue;
100101
}
101-
102+
102103
Console.WriteLine($"{RetakesPlugin.LogPrefix}[{player.PlayerName}] Not found, adding to QueuePlayers.");
103104
player.PrintToChat($"{RetakesPlugin.MessagePrefix}{_translator["queue.joined"]}");
104105
QueuePlayers.Add(player);
106+
return HookResult.Handled;
105107
}
106108
else
107109
{
108-
Console.WriteLine($"{RetakesPlugin.LogPrefix}[{player.PlayerName}] Found in QueuePlayers, do nothing.");
110+
Console.WriteLine($"{RetakesPlugin.LogPrefix}[{player.PlayerName}] Already in Queue, do nothing.");
109111
}
110112

111-
if (toTeam != CsTeam.Spectator)
112-
{
113-
Console.WriteLine($"{RetakesPlugin.LogPrefix}[{player.PlayerName}] Changing to spectator.");
114-
if (player.PawnIsAlive)
115-
{
116-
player.CommitSuicide(false, true);
117-
}
118-
119-
player.ChangeTeam(CsTeam.Spectator);
120-
return;
121-
}
122-
123113
Helpers.CheckRoundDone();
114+
return HookResult.Handled;
124115
}
125116

126117
private void RemoveDisconnectedPlayers()
127118
{
128-
var disconnectedActivePlayers = ActivePlayers.Where(player => !Helpers.IsValidPlayer(player) || !Helpers.IsPlayerConnected(player)).ToList();
119+
var disconnectedActivePlayers = ActivePlayers
120+
.Where(player => !Helpers.IsValidPlayer(player) || !Helpers.IsPlayerConnected(player)).ToList();
129121

130122
if (disconnectedActivePlayers.Count > 0)
131123
{
132-
Console.WriteLine($"{RetakesPlugin.LogPrefix}Removing {disconnectedActivePlayers.Count} disconnected players from ActivePlayers.");
124+
Console.WriteLine(
125+
$"{RetakesPlugin.LogPrefix}Removing {disconnectedActivePlayers.Count} disconnected players from ActivePlayers.");
133126
ActivePlayers.RemoveWhere(player => disconnectedActivePlayers.Contains(player));
134127
}
135-
136-
var disconnectedQueuePlayers = QueuePlayers.Where(player => !Helpers.IsValidPlayer(player) || !Helpers.IsPlayerConnected(player)).ToList();
137-
128+
129+
var disconnectedQueuePlayers = QueuePlayers
130+
.Where(player => !Helpers.IsValidPlayer(player) || !Helpers.IsPlayerConnected(player)).ToList();
131+
138132
if (disconnectedQueuePlayers.Count > 0)
139133
{
140-
Console.WriteLine($"{RetakesPlugin.LogPrefix}Removing {disconnectedQueuePlayers.Count} disconnected players from QueuePlayers.");
134+
Console.WriteLine(
135+
$"{RetakesPlugin.LogPrefix}Removing {disconnectedQueuePlayers.Count} disconnected players from QueuePlayers.");
141136
QueuePlayers.RemoveWhere(player => disconnectedQueuePlayers.Contains(player));
142137
}
143138
}
144139

145140
private void HandleQueuePriority()
146141
{
147-
var vipsInQueue = QueuePlayers.Where(player => AdminManager.PlayerHasPermissions(player, "@css/vip")).ToList().Count;
142+
var vipsInQueue = QueuePlayers.Where(player => AdminManager.PlayerHasPermissions(player, "@css/vip")).ToList()
143+
.Count;
148144

149145
if (vipsInQueue > 0)
150146
{
151147
Helpers.Shuffle(
152-
ActivePlayers
153-
.Where(player => !AdminManager.PlayerHasPermissions(player, "@css/vip"))
154-
.ToList()
155-
)
148+
ActivePlayers
149+
.Where(player => !AdminManager.PlayerHasPermissions(player, "@css/vip"))
150+
.ToList()
151+
)
156152
.ForEach(player =>
157153
{
158154
if (vipsInQueue <= 0)
@@ -166,12 +162,12 @@ private void HandleQueuePriority()
166162
});
167163
}
168164
}
169-
165+
170166
public void Update()
171167
{
172168
RemoveDisconnectedPlayers();
173169
HandleQueuePriority();
174-
170+
175171
var playersToAdd = _maxRetakesPlayers - ActivePlayers.Count;
176172

177173
if (playersToAdd > 0 && QueuePlayers.Count > 0)
@@ -183,9 +179,9 @@ public void Update()
183179
.OrderBy(player => AdminManager.PlayerHasPermissions(player, "@css/vip"))
184180
.Take(playersToAdd)
185181
.ToList();
186-
182+
187183
QueuePlayers.RemoveWhere(playersToAddList.Contains);
188-
184+
189185
// loop players to add, and set their team to CT
190186
foreach (var player in playersToAddList)
191187
{
@@ -194,9 +190,9 @@ public void Update()
194190
{
195191
continue;
196192
}
197-
193+
198194
ActivePlayers.Add(player);
199-
195+
200196
if (player.Team != CsTeam.CounterTerrorist)
201197
{
202198
player.SwitchTeam(CsTeam.CounterTerrorist);
@@ -207,7 +203,7 @@ public void Update()
207203
if (ActivePlayers.Count == _maxRetakesPlayers && QueuePlayers.Count > 0)
208204
{
209205
var waitingMessage = _translator["queue.waiting", ActivePlayers.Count];
210-
206+
211207
foreach (var player in QueuePlayers)
212208
{
213209
player.PrintToChat($"{RetakesPlugin.MessagePrefix}{waitingMessage}");
@@ -221,61 +217,71 @@ public void RemovePlayerFromQueues(CCSPlayerController player)
221217
QueuePlayers.Remove(player);
222218
_roundTerrorists.Remove(player);
223219
_roundCounterTerrorists.Remove(player);
224-
220+
225221
Helpers.CheckRoundDone();
226222
}
227-
223+
228224
public void DebugQueues(bool isBefore)
229225
{
230226
if (!ActivePlayers.Any())
231227
{
232-
Console.WriteLine($"{RetakesPlugin.LogPrefix}ActivePlayers ({(isBefore ? "BEFORE" : "AFTER")}): No active players.");
228+
Console.WriteLine(
229+
$"{RetakesPlugin.LogPrefix}ActivePlayers ({(isBefore ? "BEFORE" : "AFTER")}): No active players.");
233230
}
234231
else
235232
{
236-
Console.WriteLine($"{RetakesPlugin.LogPrefix}ActivePlayers ({(isBefore ? "BEFORE" : "AFTER")}): {string.Join(", ", ActivePlayers.Where(Helpers.IsValidPlayer).Select(player => player.PlayerName))}");
233+
Console.WriteLine(
234+
$"{RetakesPlugin.LogPrefix}ActivePlayers ({(isBefore ? "BEFORE" : "AFTER")}): {string.Join(", ", ActivePlayers.Where(Helpers.IsValidPlayer).Select(player => player.PlayerName))}");
237235
}
238236

239237
if (!QueuePlayers.Any())
240238
{
241-
Console.WriteLine($"{RetakesPlugin.LogPrefix}QueuePlayers ({(isBefore ? "BEFORE" : "AFTER")}): No players in the queue.");
239+
Console.WriteLine(
240+
$"{RetakesPlugin.LogPrefix}QueuePlayers ({(isBefore ? "BEFORE" : "AFTER")}): No players in the queue.");
242241
}
243242
else
244243
{
245-
Console.WriteLine($"{RetakesPlugin.LogPrefix}QueuePlayers ({(isBefore ? "BEFORE" : "AFTER")}): {string.Join(", ", QueuePlayers.Where(Helpers.IsValidPlayer).Select(player => player.PlayerName))}");
244+
Console.WriteLine(
245+
$"{RetakesPlugin.LogPrefix}QueuePlayers ({(isBefore ? "BEFORE" : "AFTER")}): {string.Join(", ", QueuePlayers.Where(Helpers.IsValidPlayer).Select(player => player.PlayerName))}");
246246
}
247247

248248
if (!_roundTerrorists.Any())
249249
{
250-
Console.WriteLine($"{RetakesPlugin.LogPrefix}_roundTerrorists ({(isBefore ? "BEFORE" : "AFTER")}): No players in the queue.");
250+
Console.WriteLine(
251+
$"{RetakesPlugin.LogPrefix}_roundTerrorists ({(isBefore ? "BEFORE" : "AFTER")}): No players in the queue.");
251252
}
252253
else
253254
{
254-
Console.WriteLine($"{RetakesPlugin.LogPrefix}_roundTerrorists ({(isBefore ? "BEFORE" : "AFTER")}): {string.Join(", ", _roundTerrorists.Where(Helpers.IsValidPlayer).Select(player => player.PlayerName))}");
255+
Console.WriteLine(
256+
$"{RetakesPlugin.LogPrefix}_roundTerrorists ({(isBefore ? "BEFORE" : "AFTER")}): {string.Join(", ", _roundTerrorists.Where(Helpers.IsValidPlayer).Select(player => player.PlayerName))}");
255257
}
256258

257259
if (!_roundCounterTerrorists.Any())
258260
{
259-
Console.WriteLine($"{RetakesPlugin.LogPrefix}_roundCounterTerrorists ({(isBefore ? "BEFORE" : "AFTER")}): No players in the queue.");
261+
Console.WriteLine(
262+
$"{RetakesPlugin.LogPrefix}_roundCounterTerrorists ({(isBefore ? "BEFORE" : "AFTER")}): No players in the queue.");
260263
}
261264
else
262265
{
263-
Console.WriteLine($"{RetakesPlugin.LogPrefix}_roundCounterTerrorists ({(isBefore ? "BEFORE" : "AFTER")}): {string.Join(", ", _roundCounterTerrorists.Where(Helpers.IsValidPlayer).Select(player => player.PlayerName))}");
266+
Console.WriteLine(
267+
$"{RetakesPlugin.LogPrefix}_roundCounterTerrorists ({(isBefore ? "BEFORE" : "AFTER")}): {string.Join(", ", _roundCounterTerrorists.Where(Helpers.IsValidPlayer).Select(player => player.PlayerName))}");
264268
}
265269
}
266270

267271
private List<CCSPlayerController> _roundTerrorists = new();
268272
private List<CCSPlayerController> _roundCounterTerrorists = new();
269-
273+
270274
public void ClearRoundTeams()
271275
{
272276
_roundTerrorists.Clear();
273277
_roundCounterTerrorists.Clear();
274278
}
275-
279+
276280
public void SetRoundTeams()
277281
{
278-
_roundTerrorists = Utilities.GetPlayers().Where(player => Helpers.IsValidPlayer(player) && player.Team == CsTeam.Terrorist).ToList();
279-
_roundCounterTerrorists = Utilities.GetPlayers().Where(player => Helpers.IsValidPlayer(player) && player.Team == CsTeam.CounterTerrorist).ToList();
282+
_roundTerrorists = Utilities.GetPlayers()
283+
.Where(player => Helpers.IsValidPlayer(player) && player.Team == CsTeam.Terrorist).ToList();
284+
_roundCounterTerrorists = Utilities.GetPlayers()
285+
.Where(player => Helpers.IsValidPlayer(player) && player.Team == CsTeam.CounterTerrorist).ToList();
280286
}
281-
}
287+
}

RetakesPlugin.cs

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,8 @@ public override void Load(bool hotReload)
6363
Console.WriteLine($"{LogPrefix}Plugin loaded!");
6464

6565
RegisterListener<Listeners.OnMapStart>(OnMapStart);
66+
67+
AddCommandListener("jointeam", OnCommandJoinTeam);
6668

6769
if (hotReload)
6870
{
@@ -629,28 +631,35 @@ public HookResult OnRoundEnd(EventRoundEnd @event, GameEventInfo info)
629631
[GameEventHandler(HookMode.Pre)]
630632
public HookResult OnPlayerTeam(EventPlayerTeam @event, GameEventInfo info)
631633
{
632-
Console.WriteLine($"{LogPrefix}OnPlayerTeam event fired.");
633-
634634
// Ensure all team join events are silent.
635635
@event.Silent = true;
636636

637+
return HookResult.Continue;
638+
}
639+
640+
private HookResult OnCommandJoinTeam(CCSPlayerController? player, CommandInfo commandInfo)
641+
{
637642
if (_gameManager == null)
638643
{
639644
Console.WriteLine($"{LogPrefix}Game manager not loaded.");
640645
return HookResult.Continue;
641646
}
642647

643-
var player = @event.Userid;
644-
645-
if (!Helpers.IsValidPlayer(player))
648+
if (
649+
!Helpers.IsValidPlayer(player)
650+
|| commandInfo.ArgCount < 2
651+
|| !Enum.TryParse<CsTeam>(commandInfo.GetArg(1), out var toTeam)
652+
)
646653
{
647-
return HookResult.Continue;
654+
return HookResult.Handled;
648655
}
656+
657+
var fromTeam = player!.Team;
649658

650-
Console.WriteLine($"{LogPrefix}[{player.PlayerName}] {(CsTeam)@event.Oldteam} -> {(CsTeam)@event.Team}");
659+
Console.WriteLine($"{LogPrefix}[{player.PlayerName}] {fromTeam} -> {toTeam}");
651660

652661
_gameManager.QueueManager.DebugQueues(true);
653-
_gameManager.QueueManager.PlayerJoinedTeam(player, (CsTeam)@event.Oldteam, (CsTeam)@event.Team);
662+
var response = _gameManager.QueueManager.PlayerJoinedTeam(player, fromTeam, toTeam);
654663
_gameManager.QueueManager.DebugQueues(false);
655664

656665
Console.WriteLine($"{LogPrefix}[{player.PlayerName}] checking to ensure we have active players");
@@ -667,8 +676,8 @@ public HookResult OnPlayerTeam(EventPlayerTeam @event, GameEventInfo info)
667676

668677
Helpers.RestartGame();
669678
}
670-
671-
return HookResult.Continue;
679+
680+
return response;
672681
}
673682

674683
[GameEventHandler(HookMode.Pre)]

0 commit comments

Comments
 (0)