55using CounterStrikeSharp . API . Modules . Memory . DynamicFunctions ;
66using System . Text . Json . Serialization ;
77using System . Drawing ;
8+ using CounterStrikeSharp . API . Modules . Timers ;
89
910namespace Game_Manager ;
1011
11-
1212public class GameBMangerConfig : BasePluginConfig
1313{
1414 [ JsonPropertyName ( "DisableRadio" ) ] public bool DisableRadio { get ; set ; } = false ;
@@ -28,24 +28,46 @@ public class GameBMangerConfig : BasePluginConfig
2828 [ JsonPropertyName ( "IgnoreTeamMateAttackMessages" ) ] public bool IgnoreTeamMateAttackMessages { get ; set ; } = false ;
2929 [ JsonPropertyName ( "IgnorePlayerSavedYouByPlayerMessages" ) ] public bool IgnorePlayerSavedYouByPlayerMessages { get ; set ; } = false ;
3030 [ JsonPropertyName ( "IgnoreDefaultDisconnectMessages" ) ] public bool IgnoreDefaultDisconnectMessages { get ; set ; } = false ;
31+ [ JsonPropertyName ( "RestartServerLastPlayerDisconnect" ) ] public bool RestartServerLastPlayerDisconnect { get ; set ; } = false ;
32+ [ JsonPropertyName ( "RestartMethod" ) ] public int RestartMethod { get ; set ; } = 1 ;
33+ [ JsonPropertyName ( "RestartXTimerInMins" ) ] public int RestartXTimerInMins { get ; set ; } = 5 ;
34+ [ JsonPropertyName ( "RestartWhenXPlayersInServerORLess" ) ] public int RestartWhenXPlayersInServerORLess { get ; set ; } = 0 ;
35+
3136}
3237
38+
39+
3340public class GameBManger : BasePlugin , IPluginConfig < GameBMangerConfig >
3441{
3542 public override string ModuleName => "Game Manager" ;
36- public override string ModuleVersion => "1.0.2 " ;
43+ public override string ModuleVersion => "1.0.3 " ;
3744 public override string ModuleAuthor => "Gold KingZ" ;
38- public override string ModuleDescription => "Block/Hide , Messages , Ping , Radio , Team , Connect , Disconnect , Sounds" ;
45+ public override string ModuleDescription => "Block/Hide , Messages , Ping , Radio , Team , Connect , Disconnect , Sounds , Restart On Last Player Disconnect " ;
3946 public GameBMangerConfig Config { get ; set ; } = new GameBMangerConfig ( ) ;
40-
4147 public void OnConfigParsed ( GameBMangerConfig config )
4248 {
49+ Config = config ;
50+
4351 if ( Config . IgnoreRewardMoneyMessages < 0 || Config . IgnoreRewardMoneyMessages > 2 )
4452 {
4553 config . IgnoreRewardMoneyMessages = 0 ;
54+ Console . WriteLine ( "IgnoreRewardMoneyMessages: is invalid, setting to default value (0) Please Choose 0 or 1 or 2." ) ;
55+ }
56+ if ( Config . RestartXTimerInMins < 0 )
57+ {
58+ config . RestartXTimerInMins = 5 ;
59+ Console . WriteLine ( "RestartXTimerInMins: is invalid, setting to default value (5) Please Choose 0 OR Above." ) ;
60+ }
61+ if ( Config . RestartWhenXPlayersInServerORLess < 0 )
62+ {
63+ config . RestartWhenXPlayersInServerORLess = 0 ;
64+ Console . WriteLine ( "RestartWhenXPlayersInServerORLess: is invalid, setting to default value (0) Please Choose 0 OR Above." ) ;
65+ }
66+ if ( Config . RestartMethod < 0 || Config . RestartMethod > 2 )
67+ {
68+ config . RestartMethod = 1 ;
69+ Console . WriteLine ( "RestartMethod: is invalid, setting to default value (1) Please Choose 0 or 1 or 2." ) ;
4670 }
47-
48- Config = config ;
4971 }
5072
5173 /*
@@ -59,6 +81,8 @@ public void HookConVarChange(ConVar convar, bool oldValue, bool newValue)
5981 }
6082 }
6183 */
84+ private CounterStrikeSharp . API . Modules . Timers . Timer ? _restartTimer ;
85+ private CounterStrikeSharp . API . Modules . Timers . Timer ? _restartTimer2 ;
6286 private string [ ] RadioArray = new string [ ] {
6387 "coverme" ,
6488 "takepoint" ,
@@ -208,6 +232,13 @@ public override void Load(bool hotReload)
208232
209233 return HookResult . Continue ;
210234 } , HookMode . Pre ) ;
235+ RegisterListener < Listeners . OnMapStart > ( mapName =>
236+ {
237+ _restartTimer ? . Kill ( ) ;
238+ _restartTimer = null ;
239+ _restartTimer2 ? . Kill ( ) ;
240+ _restartTimer2 = null ;
241+ } ) ;
211242 RegisterEventHandler < EventRoundEnd > ( ( @event , info ) =>
212243 {
213244 if ( ! Config . DisableWinOrLoseSound || @event == null ) return HookResult . Continue ;
@@ -272,12 +303,94 @@ public override void Load(bool hotReload)
272303 return HookResult . Continue ;
273304
274305 } ) ;
306+ RegisterListener < Listeners . OnClientConnected > ( playerSlot =>
307+ {
308+ if ( ! Config . RestartServerLastPlayerDisconnect || Config . RestartMethod == 0 ) return ;
309+ var players = Utilities . GetPlayers ( ) . Where ( x => x . Connected == PlayerConnectedState . PlayerConnected && ! x . IsBot ) ;
310+ var playersCount = players . Count ( ) ;
311+
312+ if ( playersCount <= Config . RestartWhenXPlayersInServerORLess )
313+ {
314+ _restartTimer ? . Kill ( ) ;
315+ _restartTimer = null ;
316+ _restartTimer2 ? . Kill ( ) ;
317+ _restartTimer2 = null ;
318+
319+ _restartTimer = AddTimer ( 0.1f , RestartTimer_Callback , TimerFlags . REPEAT | TimerFlags . STOP_ON_MAPCHANGE ) ;
320+ } else if ( playersCount >= Config . RestartWhenXPlayersInServerORLess )
321+ {
322+ _restartTimer ? . Kill ( ) ;
323+ _restartTimer = null ;
324+
325+ _restartTimer2 ? . Kill ( ) ;
326+ _restartTimer2 = null ;
327+ }
328+
329+ } ) ;
330+ RegisterListener < Listeners . OnClientDisconnectPost > ( playerSlot =>
331+ {
332+ if ( ! Config . RestartServerLastPlayerDisconnect || Config . RestartMethod == 0 ) return ;
333+
334+ var players = Utilities . GetPlayers ( ) . Where ( x => x . Connected == PlayerConnectedState . PlayerConnected && ! x . IsBot ) ;
335+ var playersCount = players . Count ( ) ;
336+
337+ if ( playersCount <= Config . RestartWhenXPlayersInServerORLess )
338+ {
339+ _restartTimer ? . Kill ( ) ;
340+ _restartTimer = null ;
341+ _restartTimer2 ? . Kill ( ) ;
342+ _restartTimer2 = null ;
343+
344+ _restartTimer = AddTimer ( 0.1f , RestartTimer_Callback , TimerFlags . REPEAT | TimerFlags . STOP_ON_MAPCHANGE ) ;
345+ } else if ( playersCount >= Config . RestartWhenXPlayersInServerORLess )
346+ {
347+ _restartTimer ? . Kill ( ) ;
348+ _restartTimer = null ;
349+
350+ _restartTimer2 ? . Kill ( ) ;
351+ _restartTimer2 = null ;
352+ }
353+ } ) ;
275354 for ( int i = 0 ; i < RadioArray . Length ; i ++ )
276355 {
277356 AddCommandListener ( RadioArray [ i ] , CommandListener_RadioCommands ) ;
278357 }
279358 }
280-
359+ private void RestartTimer_Callback ( )
360+ {
361+ var players = Utilities . GetPlayers ( ) . Where ( x => x . Connected == PlayerConnectedState . PlayerConnected && ! x . IsBot ) ;
362+ var playersCount = players . Count ( ) ;
363+
364+ //Server.PrintToConsole($"playersCount{playersCount} Config.RestartWhenXPlayersInServerORLess{Config.RestartWhenXPlayersInServerORLess}");
365+ if ( playersCount <= Config . RestartWhenXPlayersInServerORLess )
366+ {
367+ _restartTimer2 = AddTimer ( Config . RestartXTimerInMins * 60 , RestartTimer_Callback2 , TimerFlags . STOP_ON_MAPCHANGE ) ;
368+ }
369+ }
370+ private void RestartTimer_Callback2 ( )
371+ {
372+ var players = Utilities . GetPlayers ( ) . Where ( x => x . Connected == PlayerConnectedState . PlayerConnected && ! x . IsBot ) ;
373+ var playersCount = players . Count ( ) ;
374+
375+ if ( playersCount <= Config . RestartWhenXPlayersInServerORLess )
376+ {
377+ if ( Config . RestartMethod == 1 )
378+ {
379+ Server . ExecuteCommand ( "sv_cheats 1; restart" ) ;
380+ } else if ( Config . RestartMethod == 2 )
381+ {
382+ Server . ExecuteCommand ( "sv_cheats 1; crash" ) ;
383+ }
384+
385+ } else if ( playersCount >= Config . RestartWhenXPlayersInServerORLess )
386+ {
387+ _restartTimer ? . Kill ( ) ;
388+ _restartTimer = null ;
389+
390+ _restartTimer2 ? . Kill ( ) ;
391+ _restartTimer2 = null ;
392+ }
393+ }
281394 private HookResult CommandListener_Ping ( CCSPlayerController ? player , CommandInfo info )
282395 {
283396 if ( ! Config . DisablePing || player == null || ! player . IsValid ) return HookResult . Continue ;
0 commit comments