1414 G L O B A L V A R S
1515*****************************************************************/
1616
17- #define PLUGIN_VERSION " 1.1 "
17+ #define PLUGIN_VERSION " 1.2 "
1818#define CONSOLE 0
1919
2020ConVar
@@ -24,16 +24,15 @@ ConVar
2424 g_cvarCFGName ,
2525
2626 l4d_ready_cfg_name ,
27+ survivor_limit ,
28+
2729 z_versus_hunter_limit ,
2830 z_versus_boomer_limit ,
2931 z_versus_smoker_limit ,
3032 z_versus_jockey_limit ,
3133 z_versus_charger_limit ,
3234 z_versus_spitter_limit ;
3335
34- char
35- g_sConfigName [16 ];
36-
3736Handle
3837 g_hVote ;
3938
@@ -84,6 +83,7 @@ enum struct GameMode
8483{
8584 Mode mode ;
8685 bool ishunter ;
86+ char name [32 ];
8787}
8888
8989GameMode
@@ -127,7 +127,7 @@ public void OnPluginStart()
127127
128128 g_cvarDebug = CreateConVar (" sm_scavenge_gamemode_debug" , " 0" , " Enable debug" , FCVAR_NOTIFY , true , 0.0 , true , 1.0 );
129129 g_cvarEnable = CreateConVar (" sm_scavenge_gamemode_enable" , " 1" , " Enable Scavenge Rounds" , FCVAR_NOTIFY , true , 0.0 , true , 1.0 );
130- g_cvarPrintCvar = CreateConVar (" sm_scavenge_gamemode_printcvar" , " 1 " , " Print cvar changes" , FCVAR_NOTIFY , true , 0.0 , true , 1.0 );
130+ g_cvarPrintCvar = CreateConVar (" sm_scavenge_gamemode_printcvar" , " 0 " , " Print cvar changes" , FCVAR_NOTIFY , true , 0.0 , true , 1.0 );
131131 g_cvarCFGName = CreateConVar (" sm_scavenge_gamemode_forcename" , " 1" , " Force the convar l4d_ready_cfg_name according to the game mode." , FCVAR_NOTIFY , true , 0.0 , true , 1.0 );
132132
133133 z_versus_hunter_limit = FindConVar (" z_versus_hunter_limit" );
@@ -136,6 +136,7 @@ public void OnPluginStart()
136136 z_versus_jockey_limit = FindConVar (" z_versus_jockey_limit" );
137137 z_versus_charger_limit = FindConVar (" z_versus_charger_limit" );
138138 z_versus_spitter_limit = FindConVar (" z_versus_spitter_limit" );
139+ survivor_limit = FindConVar (" survivor_limit" );
139140
140141 z_versus_hunter_limit .AddChangeHook (OnVersusLimitChange );
141142 z_versus_boomer_limit .AddChangeHook (OnVersusLimitChange );
@@ -155,7 +156,7 @@ public void OnVersusLimitChange(ConVar Convar, const char[] sOldValue, const cha
155156
156157 char sCvarName [32 ];
157158 Convar .GetName (sCvarName , sizeof (sCvarName ));
158- CPrintToChatAll (" [ScavOgl] Server CVar '%s ' changed from '%s ' to '%s '" , sCvarName , sOldValue , sNewValue );
159+ PrintDebug (" [ScavOgl] Server CVar '%s ' changed from '%s ' to '%s '" , sCvarName , sOldValue , sNewValue );
159160}
160161
161162public Action ModeRequest (int iClient , int iArgs )
@@ -172,44 +173,6 @@ public Action ModeRequest(int iClient, int iArgs)
172173 return Plugin_Handled ;
173174 }
174175
175- if (iArgs > 0 )
176- {
177- if (! CheckCommandAccess (iClient , " sm_kick" , ADMFLAG_KICK ))
178- {
179- CReplyToCommand (iClient , " %t %t " , " Tag" , " NoAccess" );
180- return Plugin_Handled ;
181- }
182-
183- char sGamemode [32 ];
184- GetCmdArg (1 , sGamemode , sizeof (sGamemode ));
185- CurrentConfigName ();
186-
187- GameMode
188- gmArg ,
189- gmCurrent ;
190-
191- bool bArgGameMode = GetGamemode (sGamemode , gmArg );
192- bool bCurrentGameMode = GetGamemode (g_sConfigName , gmCurrent );
193-
194- if (! bCurrentGameMode )
195- {
196- CReplyToCommand (iClient , " %t %t " , " Tag" , " ModeNoSupported" );
197- return Plugin_Handled ;
198- }
199-
200- char sCorrectMode [16 ];
201- Format (sCorrectMode , sizeof (sCorrectMode ), " %s " , gmCurrent .ishunter ? sScavMode [gmCurrent .mode ] : sHunterMode [gmCurrent .mode ]);
202-
203- if (! bArgGameMode || ! StrEqual (sGamemode , sCorrectMode ))
204- {
205- CReplyToCommand (iClient , " %t %t sm_scavmode %s " , " Tag" , " Usage" , sCorrectMode );
206- return Plugin_Handled ;
207- }
208-
209- ChangeGameMode (gmArg .mode , gmArg .ishunter );
210- return Plugin_Handled ;
211- }
212-
213176 ModeMenu (iClient );
214177 return Plugin_Handled ;
215178}
@@ -231,16 +194,18 @@ public Action InfectedLimit(int iArgs)
231194 char sGamemode [32 ];
232195 GetCmdArg (1 , sGamemode , sizeof (sGamemode ));
233196
234- GameMode gmArg ;
235- bool bArgGameMode = GetGamemode (sGamemode , gmArg );
197+ GameMode
198+ gmTarget ;
199+
200+ GetGamemode (gmTarget , sGamemode );
236201
237- if (! bArgGameMode )
202+ if (gmTarget . mode == mode_none )
238203 {
239204 CReplyToCommand (CONSOLE , " %t %t z_scavogl_infected_limit <scav1v1|scav2v2|scav3v3|scavogl>" , " Tag" , " Usage" );
240205 return Plugin_Handled ;
241206 }
242207
243- ChangeGameMode (gmArg .mode , gmArg .ishunter , false );
208+ ChangeGameMode (gmTarget .mode , gmTarget .ishunter , false );
244209 return Plugin_Handled ;
245210}
246211
@@ -305,27 +270,22 @@ void PrintDebug(const char[] sMessage, any...)
305270 */
306271void ModeMenu (int iClient )
307272{
308- CurrentConfigName ();
309-
310- GameMode gm ;
311- if (! GetGamemode (g_sConfigName , gm ))
273+ GameMode
274+ gmCurrent ,
275+ gmTarget ;
276+
277+ CurrentGameMode (gmCurrent );
278+ GetTergetMode (gmCurrent , gmTarget );
279+
280+ if (gmCurrent .mode == mode_none )
312281 {
313282 CReplyToCommand (iClient , " %t %t " , " Tag" , " ModeNoSupported" );
314283 return ;
315284 }
316285
317- if (gm .mode == mode_none )
318- {
319- CReplyToCommand (iClient , " %t %t " , " Tag" , " Error_InvalidMode" );
320- return ;
321- }
322-
323- char sGamemode [32 ];
324- Format (sGamemode , sizeof (sGamemode ), " %s " , gm .ishunter ? sScavMode [gm .mode ] : sHunterMode [gm .mode ]);
325-
326286 Menu hMenu = new Menu (MenuHandler , MENU_ACTIONS_ALL );
327287 hMenu .SetTitle (" %t " , " MenuTitle" );
328- hMenu .AddItem (sGamemode , sGamemode );
288+ hMenu .AddItem (gmTarget . name , gmTarget . name );
329289
330290 hMenu .Display (iClient , 20 );
331291}
@@ -341,7 +301,7 @@ public int MenuHandler(Menu menu, MenuAction action, int iParam, int iParam2)
341301 menu .GetItem (iParam2 , sInfo , sizeof (sInfo ));
342302 GameMode gm ;
343303
344- GetGamemode (sInfo , gm );
304+ GetGamemode (gm , sInfo );
345305
346306 if (gm .mode == mode_none )
347307 {
@@ -396,7 +356,7 @@ bool CreateVote(int iClient, GameMode gm)
396356 }
397357
398358 char sBuffer [64 ];
399- Format (sBuffer , sizeof (sBuffer ), " %t " , " Question" , gm .ishunter ? sHunterName [ gm . mode ] : sScavName [ gm . mode ] );
359+ Format (sBuffer , sizeof (sBuffer ), " %t " , " Question" , gm .name );
400360 g_gmVote = gm ;
401361
402362 g_hVote = CreateBuiltinVote (VoteActionHandler , BuiltinVoteType_Custom_YesNo , BuiltinVoteAction_Cancel | BuiltinVoteAction_VoteEnd | BuiltinVoteAction_End );
@@ -405,7 +365,7 @@ bool CreateVote(int iClient, GameMode gm)
405365 SetBuiltinVoteResultCallback (g_hVote , MatchVoteResultHandler );
406366 DisplayBuiltinVote (g_hVote , iPlayers , iNumPlayers , 20 );
407367
408- PrintDebug (" Vote created successfully for game mode %s by client %d " , gm .ishunter ? sHunterName [ gm . mode ] : sScavName [ gm . mode ] , iClient );
368+ PrintDebug (" Vote created successfully for game mode %s by client %N " , gm .name , iClient );
409369 return true ;
410370}
411371
@@ -441,7 +401,7 @@ public void MatchVoteResultHandler(Handle vote, int num_votes, int num_clients,
441401 {
442402 if (item_info [i ][BUILTINVOTEINFO_ITEM_VOTES ] > (num_votes / 2 ))
443403 {
444- PrintDebug (" Vote passed, game mode changed to %s " , g_gmVote .ishunter ? sHunterName [ g_gmVote . mode ] : sScavName [ g_gmVote . mode ] );
404+ PrintDebug (" Vote passed, game mode changed to %s " , g_gmVote .name );
445405 DisplayBuiltinVotePass2 (vote , " VotePassed" );
446406
447407 ChangeGameMode (g_gmVote .mode , g_gmVote .ishunter );
@@ -457,31 +417,34 @@ public void MatchVoteResultHandler(Handle vote, int num_votes, int num_clients,
457417 PrintDebug (" Vote failed" );
458418}
459419
420+
460421/* *
461- * Determines the game mode based on the provided gamemode string.
422+ * Retrieves the game mode based on the provided game mode string.
462423 *
463- * @param sGamemode The gamemode string to check.
464- * @param gm The GameMode struct to store the result.
465- * @return True if the gamemode was found, false otherwise.
424+ * @param sGamemode The string representing the game mode to be retrieved.
425+ * @return A GameMode structure containing the game mode and whether it is a hunter mode.
466426 */
467- bool GetGamemode (const char [] sGamemode , GameMode gm )
427+ void GetGamemode (GameMode gm , const char [] sGamemode )
468428{
469- bool bFound = false ;
470429 gm .mode = mode_none ;
471430 for (Mode i = mode_none ; i <= mode_4v4 ; i ++ )
472431 {
473- bool
474- bScav = StrEqual (sScavMode [i ], sGamemode ),
475- bHunt = StrEqual (sHunterMode [i ], sGamemode );
476432
477- if (bScav || bHunt )
433+ if (StrEqual ( sScavMode [ i ], sGamemode ) || StrEqual ( sScavName [ i ], sGamemode ) )
478434 {
479- gm .ishunter = bHunt ;
435+ gm .ishunter = false ;
480436 gm .mode = i ;
481- bFound = true ;
437+ strcopy (gm .name , sizeof (gm .name ), sGamemode );
438+ break ;
439+ }
440+ else if (StrEqual (sHunterMode [i ], sGamemode ) || StrEqual (sHunterName [i ], sGamemode ))
441+ {
442+ gm .ishunter = true ;
443+ gm .mode = i ;
444+ strcopy (gm .name , sizeof (gm .name ), sGamemode );
445+ break ;
482446 }
483447 }
484- return bFound ;
485448}
486449
487450/* *
@@ -496,17 +459,17 @@ bool GetGamemode(const char[] sGamemode, GameMode gm)
496459void ChangeCFGName (GameMode gm )
497460{
498461 char
499- sCurrentConfigName [32 ];
500-
501- l4d_ready_cfg_name .GetString (sCurrentConfigName , sizeof (sCurrentConfigName ));
462+ sConfigName [32 ];
463+
464+ l4d_ready_cfg_name .GetString (sConfigName , sizeof (sConfigName ));
502465
503466 if (gm .ishunter )
504- ReplaceString (sCurrentConfigName , sizeof (sCurrentConfigName ), sScavName [gm .mode ], sHunterName [gm .mode ], false );
467+ ReplaceString (sConfigName , sizeof (sConfigName ), sScavName [gm .mode ], sHunterName [gm .mode ], false );
505468 else
506- ReplaceString (sCurrentConfigName , sizeof (sCurrentConfigName ), sHunterName [gm .mode ], sScavName [gm .mode ], false );
469+ ReplaceString (sConfigName , sizeof (sConfigName ), sHunterName [gm .mode ], sScavName [gm .mode ], false );
507470
508- PrintDebug (" New CFG Name: %s " , sCurrentConfigName );
509- l4d_ready_cfg_name .SetString (sCurrentConfigName );
471+ PrintDebug (" New CFG Name: %s " , sConfigName );
472+ l4d_ready_cfg_name .SetString (sConfigName );
510473}
511474
512475/* *
@@ -537,7 +500,7 @@ void ChangeGameMode(Mode mode, bool bIshunter, bool bAnnounce = true)
537500 ChangeCFGName (gm );
538501
539502 if (bAnnounce )
540- CPrintToChatAll (" %t %t " , " Tag" , LANG_SERVER , " ChangeMode" , gm .ishunter ? sHunterName [gm .mode ] : sScavName [gm .mode ]);
503+ CPrintToChatAll (" %t %t " , " Tag" , " ChangeMode" , gm .ishunter ? sHunterName [gm .mode ] : sScavName [gm .mode ]);
541504
542505 switch (gm .mode )
543506 {
@@ -635,18 +598,53 @@ void ChangeGameMode(Mode mode, bool bIshunter, bool bAnnounce = true)
635598 }
636599}
637600
601+
638602/* *
639- * Retrieves the current configuration name.
640- * If the global variable `g_sConfigName` is empty, it calls `LGO_GetConfigName` to get the configuration name
641- * and copies it to `g_sConfigName`.
603+ * Sets the current game mode based on the configuration name.
604+ *
605+ * @param gm The GameMode object to be updated.
606+ *
607+ * The function retrieves the configuration name and checks if it contains
608+ * specific substrings to determine the game mode and whether it is a hunter mode.
609+ * It updates the GameMode object with the appropriate values.
642610 */
643- void CurrentConfigName ( )
611+ void CurrentGameMode ( GameMode gm )
644612{
645- if (StrEqual (g_sConfigName , " " ))
646- {
647- char sConfigName [16 ];
648- LGO_GetConfigName (sConfigName , sizeof (sConfigName ));
613+ char
614+ sConfigName [32 ];
615+
616+ gm .mode = view_as <Mode >(survivor_limit .IntValue );
617+
618+ l4d_ready_cfg_name .GetString (sConfigName , sizeof (sConfigName ));
649619
650- strcopy (g_sConfigName , sizeof (g_sConfigName ), sConfigName );
620+ if (StrContains (sConfigName , sScavName [gm .mode ], false ) != - 1 )
621+ {
622+ gm .ishunter = false ;
623+ strcopy (gm .name , sizeof (gm .name ), sScavName [gm .mode ]);
624+ }
625+ else if (StrContains (sConfigName , sHunterName [gm .mode ], false ) != - 1 )
626+ {
627+ gm .ishunter = true ;
628+ strcopy (gm .name , sizeof (gm .name ), sHunterName [gm .mode ]);
651629 }
630+ else
631+ {
632+ gm .ishunter = false ;
633+ gm .mode = mode_none ;
634+ strcopy (gm .name , sizeof (gm .name ), sScavName [mode_none ]);
635+ }
636+ }
637+
638+ /* *
639+ * Copies the current game mode to the target game mode and toggles the hunter status.
640+ *
641+ * @param gmCurrent The current game mode.
642+ * @param gmTarget The target game mode to be modified.
643+ */
644+ void GetTergetMode (GameMode gmCurrent , GameMode gmTarget )
645+ {
646+ gmTarget .mode = gmCurrent .mode ;
647+ gmTarget .ishunter = ! gmCurrent .ishunter ;
648+
649+ strcopy (gmTarget .name , sizeof (gmTarget .name ), gmTarget .ishunter ? sHunterName [gmTarget .mode ] : sScavName [gmTarget .mode ]);
652650}
0 commit comments