From 58949a7fe8a72811ee8ac848ec550675bd806c66 Mon Sep 17 00:00:00 2001 From: richard Date: Sat, 31 Jan 2009 20:48:56 +0100 Subject: [PATCH] Fixed incorrect weapon name used in group restictions. Improved logging system (bit flags instead of on/off). CVAR zr_debug changed to zr_log. Added flag configuration to zombie admin menu. Fixed index out of bounds error in anticamp module. --- changelog.txt | 5 ++ src/zombiereloaded.sp | 14 ++--- src/zr/anticamp.inc | 22 ++++--- src/zr/commands.inc | 20 ++++++- src/zr/cvars.inc | 16 +++++- src/zr/damagecontrol.inc | 6 +- src/zr/teleport.inc | 35 +++++++---- src/zr/translation.inc | 30 +++++++++- src/zr/weaponrestrict.inc | 4 +- src/zr/zombiereloaded.inc | 25 +++----- src/zr/zradmin.inc | 118 ++++++++++++++++++++++++++++++++++++++ 11 files changed, 246 insertions(+), 49 deletions(-) diff --git a/changelog.txt b/changelog.txt index b020e30..c8621e1 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,8 @@ +2009.01.31 - 2.5.1.25 + * Fixed incorrect weapon name used in group weapon restrictions (bullpup => aug). + * Improved logging system. CVAR zr_debug renamed to zr_log. Using bit flags instead of on/off CVAR. Added flag configurations to zombie admin menu. + * Fixed index out of bounds error in anticamp module. + 2009.01.18 - 2.5.1.24 * Created a anticamp feature that give players damage at a specified interval in custom defined volumes. Only affects humans. * Re-formatted changes.txt. diff --git a/src/zombiereloaded.sp b/src/zombiereloaded.sp index 6a2d0e0..8e3f127 100644 --- a/src/zombiereloaded.sp +++ b/src/zombiereloaded.sp @@ -15,7 +15,7 @@ #undef REQUIRE_PLUGIN #include -#define VERSION "2.5.1.24" +#define VERSION "2.5.1.25" #include "zr/zombiereloaded" #include "zr/global" @@ -151,6 +151,7 @@ public OnConfigsExecuted() if (FileExists(path)) { ServerCommand("exec %s", mapconfig); + LogMessage("Executed map config file: %s", mapconfig); } } @@ -184,18 +185,17 @@ public OnClientDisconnect(client) PlayerLeft(client); ZTeleResetClient(client); - - new debug_val = GetConVarInt(gCvars[CVAR_DEBUG]); - new String:debug_msg[64]; + + decl String:debug_msg[64]; for (new x = 0; x < MAXTIMERS; x++) { if (tHandles[client][x] != INVALID_HANDLE) { - if (debug_val > 1) + if (LogHasFlag(LOG_DEBUG_MAX_DETAIL)) { - Format(debug_msg, sizeof(debug_msg), "OnClientDisconnect - Killing timer %i with handle %x.", x, tHandles[client][x]); - ZR_DebugPrintToConsole(0, debug_msg); + Format(debug_msg, sizeof(debug_msg), "Killing timer %i with handle %x.", x, tHandles[client][x]); + ZR_LogMessageFormatted(client, "OnClientDisconnect", "Killing timers", debug_msg, true); } KillTimer(tHandles[client][x]); tHandles[client][x] = INVALID_HANDLE; diff --git a/src/zr/anticamp.inc b/src/zr/anticamp.inc index d0f074b..48dc653 100644 --- a/src/zr/anticamp.inc +++ b/src/zr/anticamp.inc @@ -25,7 +25,7 @@ enum volume new volumes[MAX_VOLUMES][volume]; new volume_count; -new Float:player_loc[MAXPLAYERS][3]; +new Float:player_loc[MAXPLAYERS + 1][3]; new Handle:hUpdateTimer; @@ -251,6 +251,7 @@ public Action:Command_AnticampRemoveVolume(client, argc) { new vol_index; decl String:arg_buffer[32]; + //decl String:client_name[192]; new Handle:vol_timer; if (argc < 1) @@ -272,6 +273,12 @@ public Action:Command_AnticampRemoveVolume(client, argc) } volumes[vol_index][volume_in_use] = false; ReplyToCommand(client, "Removed volume %d.", vol_index); + + if (LogHasFlag(LOG_CORE_EVENTS)) + { + //GetClientName(client, client_name, sizeof(client_name)); + ZR_LogMessageFormatted(client, "Anticamp", "Remove volume", "Admin %L removed volume %d.", true, client, vol_index); + } } else { @@ -353,8 +360,8 @@ HurtPlayersInVolume(volume_index) GetClientName(client, client_name, sizeof(client_name)); SetGlobalTransTarget(client); Format(buffer, sizeof(buffer), "%T", "Unfair camper slayed", LANG_SERVER, client_name, volume_index); - - LogAction(client, client, buffer); + + if (LogHasFlag(LOG_CORE_EVENTS)) ZR_LogMessageFormatted(client, "Anticamp", "Kill player", "%s", true, buffer); if (anticamp_echo) { FormatTextString(buffer, sizeof(buffer)); @@ -371,17 +378,18 @@ bool:IsPlayerInVolume(client, volume_index) new Float:player_loc_x = player_loc[client][0]; new Float:player_loc_y = player_loc[client][1]; new Float:player_loc_z = player_loc[client][2]; - new debug_flags = GetConVarInt(gCvars[CVAR_DEBUG]); + new log; + log = LogHasFlag(LOG_DEBUG_MAX_DETAIL); if ((player_loc_x >= volumes[volume_index][x_min]) && (player_loc_x <= volumes[volume_index][x_max])) { - if (debug_flags & 4) PrintToChatAll("[ZR] Debug, Anticamp -- IsPlayerInVolume: Client %d matches X values.", client); + if (log) ZR_LogMessageFormatted(client, "Anticamp", "IsPlayerInVolume", "Client %d matches X values.", true, client); if ((player_loc_y >= volumes[volume_index][y_min]) && (player_loc_y <= volumes[volume_index][y_max])) { - if (debug_flags & 4) PrintToChatAll("[ZR] Debug, Anticamp -- IsPlayerInVolume: Client %d matches Y values.", client); + if (log) ZR_LogMessageFormatted(client, "Anticamp", "IsPlayerInVolume", "Client %d matches Y values.", true, client); if ((player_loc_z >= volumes[volume_index][z_min]) && (player_loc_z <= volumes[volume_index][z_max])) { - if (debug_flags & 4) PrintToChatAll("[ZR] Debug, Anticamp -- IsPlayerInVolume: Client %d matches Z values.", client); + if (log) ZR_LogMessageFormatted(client, "Anticamp", "IsPlayerInVolume", "Client %d matches X values.", true, client); return true; } } diff --git a/src/zr/commands.inc b/src/zr/commands.inc index fed8a56..18197c6 100644 --- a/src/zr/commands.inc +++ b/src/zr/commands.inc @@ -29,6 +29,8 @@ CreateCommands() RegAdminCmd("zr_anticamp_create_volume", Command_AnticampCreateVolume, ADMFLAG_GENERIC, "Creates a rectangular hurt volume between two points. Usage: ht_create_volume "); RegAdminCmd("zr_anticamp_remove_volume", Command_AnticampRemoveVolume, ADMFLAG_GENERIC, "Removes a volume. Use zr_anticamp_list to list volumes. Usage: zr_anticamp_remove_volume "); RegAdminCmd("zr_anticamp_list", Command_AnticampList, ADMFLAG_GENERIC, "List current volumes."); + + RegConsoleCmd("zr_log_flags", Command_LogFlags, "List available logging flags."); } public Action:Command_Infect(client, argc) @@ -89,7 +91,7 @@ public Action:Command_Respawn(client, argc) team = GetClientTeam(targets[x]); if (team == CS_TEAM_T || team == CS_TEAM_CT) { - if (GetConVarBool(gCvars[CVAR_DEBUG])) ZR_DebugPrintToConsole(targets[x], "ZSpawn: Spawned player"); + if (LogHasFlag(LOG_GAME_EVENTS)) ZR_LogMessageFormatted(targets[x], "Commands", "Command_Respawn", "ZSpawn spawned player %d.", true, targets[x]); RespawnPlayer(targets[x]); } } @@ -275,3 +277,19 @@ public Action:Command_TeleMenu(client, argc) } return Plugin_Handled; } + +public Action:Command_LogFlags(client, argc) +{ + decl String:message[2048]; + + StrCat(message, sizeof(message), "LOG_FLAG_CORE_EVENTS (1) - Log core events like executing files, restricting weapons, etc.\n"); + StrCat(message, sizeof(message), "LOG_FLAG_GAME_EVENTS (2) - Log infections.\n"); + StrCat(message, sizeof(message), "LOG_FLAG_PLAYER_COMMANDS (4) - Log zspawn, teleports, class change, etc.\n"); + StrCat(message, sizeof(message), "LOG_FLAG_DEBUG (8) - Enable debug messages (if they exist).\n"); + StrCat(message, sizeof(message), "LOG_FLAG_DEBUG (16) - Detailed debug messages. May cause spam.\n"); + StrCat(message, sizeof(message), "LOG_FLAG_DEBUG_MAX_DETAIL (32) - Low level detailed debug messages. Causes spam! Only enable right before and after testing.\n"); + StrCat(message, sizeof(message), "LOG_FLAG_LOG_TO_ADMINS (64) - Display log messages to admin chat.\n"); + StrCat(message, sizeof(message), "LOG_FLAG_LOG_TO_CLIENT (128) - Display log messages to the client that executed the event/command.\n"); + + ReplyToCommand(client, message); +} \ No newline at end of file diff --git a/src/zr/cvars.inc b/src/zr/cvars.inc index d273574..5663cb7 100644 --- a/src/zr/cvars.inc +++ b/src/zr/cvars.inc @@ -9,7 +9,7 @@ enum ZRSettings { Handle:CVAR_ENABLE, - Handle:CVAR_DEBUG, + Handle:CVAR_LOG, Handle:CVAR_ALLOW_PLAYER_TEAM, Handle:CVAR_AMBIENCE, Handle:CVAR_AMBIENCE_FILE, @@ -92,7 +92,7 @@ new gCvars[ZRSettings]; CreateCvars() { gCvars[CVAR_ENABLE] = CreateConVar("zr_enable", "1", "Enable zombie gameplay (0: Disable)"); - gCvars[CVAR_DEBUG] = CreateConVar("zr_debug", "0", "Debug switch, for developers. Usually enables logging of messages and events to a console. (0: Disable)"); + gCvars[CVAR_LOG] = CreateConVar("zr_log", "65", "Logging flags. Log messages to sourcemod logs, server console or client console. Use zr_log_flags to see a list of flags. (0: Disable)"); gCvars[CVAR_ALLOW_PLAYER_TEAM] = CreateConVar("zr_allow_player_team", "0", "This will allow the player_team event to be fired on first team join, enable when using mani model menu (0: Disable)"); gCvars[CVAR_AMBIENCE] = CreateConVar("zr_ambience", "1", "Enable creepy ambience to be played throughout the game (0: Disable)"); gCvars[CVAR_AMBIENCE_FILE] = CreateConVar("zr_ambience_file", "ambient/zr/zr_ambience.mp3", "Path to ambient sound file that will be played throughout the game, when zr_ambience is 1"); @@ -221,3 +221,15 @@ public LimitTeamsHook(Handle:convar, const String:oldValue[], const String:newVa { SetConVarInt(FindConVar("mp_limitteams"), 0); } + +LogHasFlag(flag) +{ + if (GetConVarInt(gCvars[CVAR_LOG]) & flag) + { + return 1; + } + else + { + return 0; + } +} diff --git a/src/zr/damagecontrol.inc b/src/zr/damagecontrol.inc index 7543855..fd359d2 100644 --- a/src/zr/damagecontrol.inc +++ b/src/zr/damagecontrol.inc @@ -181,9 +181,13 @@ public Action:Attempt_Suicide(client, argc) decl String:clientname[64]; decl String:buffer[192]; + GetClientName(client, clientname, sizeof(clientname)); + if (LogHasFlag(LOG_CORE_EVENTS)) + { + ZR_LogMessageFormatted(client, "Damage control", "Suicide", "Player \"%s\" attempted suicide.", true, clientname); + } if (GetConVarBool(gCvars[CVAR_SUICIDE_ECHO])) { - GetClientName(client, clientname, sizeof(clientname)); Format(buffer, sizeof(buffer), "Player '%s' attempted suicide.", clientname); ZR_PrintToAdminChat(buffer); } diff --git a/src/zr/teleport.inc b/src/zr/teleport.inc index 652e94c..afbc4b7 100644 --- a/src/zr/teleport.inc +++ b/src/zr/teleport.inc @@ -132,10 +132,14 @@ public Action:Event_TeleportCooldown(Handle:Timer, any:client) public Action:Command_Teleport(client, argc) { - new String:arg1[MAX_TARGET_LENGTH]; - new String:target_name[MAX_TARGET_LENGTH]; + decl String:arg1[MAX_TARGET_LENGTH]; + decl String:target_name_list[192]; + decl String:target_name[192]; + decl String:client_name[192]; new bool:tn_is_ml; + GetClientName(client, client_name, sizeof(client_name)); + if (argc >= 1) { GetCmdArg(1, arg1, sizeof(arg1)); @@ -148,8 +152,8 @@ public Action:Command_Teleport(client, argc) target_list, MAXPLAYERS, COMMAND_FILTER_ALIVE, - target_name, - sizeof(target_name), + target_name_list, + sizeof(target_name_list), tn_is_ml)) <= 0) { ReplyToTargetError(client, target_count); @@ -162,7 +166,8 @@ public Action:Command_Teleport(client, argc) { AbortTeleport(target_list[i]); TeleportClient(target_list[i], true, true); - LogAction(client, target_list[i], "\"%L\" teleported \"%L\" to spawn", client, target_list[i]); + GetClientName(target_list[i], target_name, sizeof(target_name)); + if (LogHasFlag(LOG_GAME_EVENTS)) ZR_LogMessageFormatted(client, "Teleport", "Manual teleport", "Admin \"%s\" teleported \"%s\" to spawn.", true, client_name, target_name); } } } @@ -172,14 +177,13 @@ public Action:Command_Teleport(client, argc) { AbortTeleport(client); TeleportClient(client, true, true); - GetClientName(client, target_name, sizeof(target_name)); - LogAction(client, client, "[ZR] Player %s teleported %s to spawn.", target_name, target_name); + if (LogHasFlag(LOG_GAME_EVENTS)) ZR_LogMessageFormatted(client, "Teleport", "Manual teleport", "Admin \"%s\" self-teleported to spawn.", true, client_name); } } if (tn_is_ml) { - ShowActivity2(client, "[ZR] ", "%t teleported to spawn.", target_name); + ShowActivity2(client, "[ZR] ", "%t teleported to spawn.", target_name_list); } else { @@ -210,6 +214,7 @@ public Action:Command_TeleSaveLocation(client, argc) bufferLocSaved[client] = true; GetClientName(target_client, target_name, sizeof(target_name)); ReplyToCommand(client, "Saved location to %s (x:%f, y:%f, z:%f).", target_name, bufferLoc[client][0], bufferLoc[client][1], bufferLoc[client][2]); + } else { @@ -221,7 +226,8 @@ public Action:Command_TeleSaveLocation(client, argc) public Action:Command_TeleportToLocation(client, argc) { - new String:target_name[MAX_TARGET_LENGTH]; + decl String:client_name[192]; + decl String:target_name[192]; new target_client; new Float:empty_vector[3] = {0.0, 0.0, 0.0}; @@ -237,6 +243,10 @@ public Action:Command_TeleportToLocation(client, argc) { target_client = client; } + + GetClientName(client, client_name, sizeof(client_name)); + GetClientName(target_client, target_name, sizeof(target_name)); + if (target_client > 0 && target_client <= MAXPLAYERS) { if (IsPlayerAlive(target_client)) @@ -245,15 +255,16 @@ public Action:Command_TeleportToLocation(client, argc) TeleportEntity(target_client, bufferLoc[client], NULL_VECTOR, empty_vector); ZR_PrintToChat(client, "!ztele successful"); if (target_client != client) ZR_PrintToChat(target_client, "!ztele successful"); + if (LogHasFlag(LOG_GAME_EVENTS)) ZR_LogMessageFormatted(client, "Teleport", "Custom teleport", "Admin \"%s\" teleported \"%s\".", true, client_name, target_name); } else { - ReplyToCommand(client, "Player %s is dead. Only alive players can be teleported.", target_name); + ReplyToCommand(client, "Player \"%s\" is dead. Only alive players can be teleported.", target_name); } } else { - ReplyToCommand(client, "Unable to target %s", target_name); + ReplyToCommand(client, "Unable to target \"%s\"", target_name); } } else @@ -293,7 +304,7 @@ public Action:Command_TeleportAbort(client, argc) for (new i = 0; i < target_count; i++) { AbortTeleport(target_list[i]); - LogAction(client, target_list[i], "\"%L\" aborted teleport on \"%L\".", client, target_list[i]); + LogAction(client, target_list[i], "%L aborted teleport on %L.", client, target_list[i]); } } else diff --git a/src/zr/translation.inc b/src/zr/translation.inc index 1738bd8..ecbe5dd 100644 --- a/src/zr/translation.inc +++ b/src/zr/translation.inc @@ -105,6 +105,34 @@ stock ZR_LogMessage(any:...) LogMessage(phrase); } +stock ZR_LogMessageFormatted(client, const String:function[], const String:block[], const String:message[], bool:full = false, any:...) +{ + decl String:buffer[2048]; + decl String:text[2048]; + + if (full) + { + VFormat(buffer, sizeof(buffer), message, 6); + Format(text, sizeof(text), "Log -- Module: %s, Function/Block: %s -- %s", function, block, buffer); + } + else + { + VFormat(buffer, sizeof(buffer), message, 6); + Format(text, sizeof(text), "Log -- %s", message); + } + + if (LogHasFlag(LOG_TO_ADMINS)) + { + ZR_PrintToAdminChat(text); + } + if (LogHasFlag(LOG_TO_CLIENT) && IsClientConnected(client) && IsClientInGame(client)) + { + PrintToConsole(client, "[ZR] %s", text); + } + + LogMessage(text); +} + stock ZR_ReplyToCommand(client, any:...) { decl String:phrase[192]; @@ -119,7 +147,7 @@ stock ZR_ReplyToCommand(client, any:...) stock ZR_PrintToAdminChat(String:message[]) { - decl String:buffer[192]; + decl String:buffer[256]; Format(buffer, sizeof(buffer), "[ZR] %s", message); for (new client = 1; client < maxclients; client++) { diff --git a/src/zr/weaponrestrict.inc b/src/zr/weaponrestrict.inc index 669f9b0..f406464 100644 --- a/src/zr/weaponrestrict.inc +++ b/src/zr/weaponrestrict.inc @@ -118,7 +118,7 @@ RestrictWeaponGroup(const String:group[]) PushArrayString(restrictedWeapons, "ak47"); PushArrayString(restrictedWeapons, "m4a1"); PushArrayString(restrictedWeapons, "sg552"); - PushArrayString(restrictedWeapons, "bullpup"); + PushArrayString(restrictedWeapons, "aug"); } else if (StrEqual(group, "snipers", false)) { @@ -185,7 +185,7 @@ UnRestrictWeaponGroup(const String:group[]) UnRestrictWeapon("ak47"); UnRestrictWeapon("m4a1"); UnRestrictWeapon("sg552"); - UnRestrictWeapon("bullpup"); + UnRestrictWeapon("aug"); } else if (StrEqual(group, "snipers", false)) { diff --git a/src/zr/zombiereloaded.inc b/src/zr/zombiereloaded.inc index 8f5686f..322989f 100644 --- a/src/zr/zombiereloaded.inc +++ b/src/zr/zombiereloaded.inc @@ -31,11 +31,18 @@ enum ZTeam #define Game_Commencing 16 // Game Commencing! #define DXLEVEL_MIN 90 - #define DEFAULT_FOV 90 -new bool:market; +#define LOG_CORE_EVENTS 1 +#define LOG_GAME_EVENTS 2 +#define LOG_PLAYER_COMMANDS 4 +#define LOG_DEBUG 8 +#define LOG_DEBUG_DETAIL 16 +#define LOG_DEBUG_MAX_DETAIL 32 +#define LOG_TO_ADMINS 64 +#define LOG_TO_CLIENT 128 +new bool:market; new dxLevel[MAXPLAYERS+1]; new bool:zombieSpawned; @@ -212,17 +219,3 @@ bool:IsClientPlayer(client) return false; } } - -ZR_DebugPrintToConsole(client, String:message[]) -{ - if (client) - { /* Client console */ - if (IsClientInGame(client)) PrintToConsole(client, message); - LogMessage("Debug log (client %i) -- %s", client, message); - } - else - { /* Server console */ - PrintToServer(message); - LogMessage("Debug log (client %i) -- %s", client, message); - } -} \ No newline at end of file diff --git a/src/zr/zradmin.inc b/src/zr/zradmin.inc index ee89c45..3f7235d 100644 --- a/src/zr/zradmin.inc +++ b/src/zr/zradmin.inc @@ -23,6 +23,7 @@ ZRAdminMenu(client) decl String:ztele[] = "Teleporter commands"; decl String:zrestrict[] = "Restrict a weapon"; decl String:zunrestrict[] = "Unrestrict a weapon"; + decl String:zlogflags[] = "Logging flags"; AddMenuItem(zr_admin_menu, "zknockbackm", zknockbackm); AddMenuItem(zr_admin_menu, "zknockback", zknockback); @@ -32,6 +33,7 @@ ZRAdminMenu(client) AddMenuItem(zr_admin_menu, "ztele", ztele); AddMenuItem(zr_admin_menu, "zrestrict", zrestrict, ITEMDRAW_DISABLED); AddMenuItem(zr_admin_menu, "zunrestrict", zunrestrict, ITEMDRAW_DISABLED); + AddMenuItem(zr_admin_menu, "zlogflags", zlogflags); DisplayMenu(zr_admin_menu, client, MENU_TIME_FOREVER); } @@ -74,6 +76,10 @@ public ZRAdminMenuHandle(Handle:zr_admin_menu, MenuAction:action, client, slot) { // unrestrict } + case 8: + { + ZRLogFlagsMenu(client); + } } } if (action == MenuAction_End) @@ -424,6 +430,103 @@ public ZRTeleHandle(Handle:zr_tele_menu , MenuAction:action, client, slot) } } +ZRLogFlagsMenu(client) +{ + new Handle:zr_log_flags_menu = CreateMenu(ZRLogFlagsMenuHandle); + + decl String:z_log_core[64]; + decl String:z_log_game[64]; + decl String:z_log_player[64]; + decl String:z_log_debug[64]; + decl String:z_log_debug_detail[64]; + decl String:z_log_debug_max[64]; + decl String:z_log_admins[64]; + decl String:z_log_client[64]; + + Format(z_log_core, sizeof(z_log_core), "Log core events (%d)", LogHasFlag(LOG_CORE_EVENTS)); + Format(z_log_game, sizeof(z_log_game), "Log game events (%d)", LogHasFlag(LOG_GAME_EVENTS)); + Format(z_log_player, sizeof(z_log_player), "Log player commands (%d)", LogHasFlag(LOG_PLAYER_COMMANDS)); + Format(z_log_debug, sizeof(z_log_debug), "Log debug messages (%d)", LogHasFlag(LOG_DEBUG)); + Format(z_log_debug_detail, sizeof(z_log_debug_detail), "Log detailed debug messages (%d)", LogHasFlag(LOG_DEBUG_DETAIL)); + Format(z_log_debug_max, sizeof(z_log_debug_max), "Log low level debug messages (%d)", LogHasFlag(LOG_DEBUG_MAX_DETAIL)); + Format(z_log_admins, sizeof(z_log_admins), "Also log to admin chat (%d)", LogHasFlag(LOG_TO_ADMINS)); + Format(z_log_client, sizeof(z_log_client), "Also log to client console (%d)", LogHasFlag(LOG_TO_CLIENT)); + + SetMenuTitle(zr_log_flags_menu, "Toggle logging flags"); + AddMenuItem(zr_log_flags_menu, z_log_core, z_log_core); + AddMenuItem(zr_log_flags_menu, z_log_game, z_log_game); + AddMenuItem(zr_log_flags_menu, z_log_player, z_log_player); + AddMenuItem(zr_log_flags_menu, z_log_debug, z_log_debug); + AddMenuItem(zr_log_flags_menu, z_log_debug_detail, z_log_debug_detail); + AddMenuItem(zr_log_flags_menu, z_log_debug_max, z_log_debug_max); + AddMenuItem(zr_log_flags_menu, z_log_admins, z_log_admins); + AddMenuItem(zr_log_flags_menu, z_log_client, z_log_client); + + SetMenuExitBackButton(zr_log_flags_menu, true); + DisplayMenu(zr_log_flags_menu, client, MENU_TIME_FOREVER); +} + +public ZRLogFlagsMenuHandle(Handle:zr_log_flags_menu , MenuAction:action, client, slot) +{ + if (action == MenuAction_Select) + { + switch(slot) + { + case 0: + { + ToggleLogFlag(LOG_CORE_EVENTS); + ZRLogFlagsMenu(client); + } + case 1: + { + ToggleLogFlag(LOG_GAME_EVENTS); + ZRLogFlagsMenu(client); + } + case 2: + { + ToggleLogFlag(LOG_PLAYER_COMMANDS); + ZRLogFlagsMenu(client); + } + case 3: + { + ToggleLogFlag(LOG_DEBUG); + ZRLogFlagsMenu(client); + } + case 4: + { + ToggleLogFlag(LOG_DEBUG_DETAIL); + ZRLogFlagsMenu(client); + } + case 5: + { + ToggleLogFlag(LOG_DEBUG_MAX_DETAIL); + ZRLogFlagsMenu(client); + } + case 6: + { + ToggleLogFlag(LOG_TO_ADMINS); + ZRLogFlagsMenu(client); + } + case 7: + { + ToggleLogFlag(LOG_TO_CLIENT); + ZRLogFlagsMenu(client); + } + } + } + if (action == MenuAction_Cancel) + { + if (slot == MenuCancel_ExitBack) + { + ZRAdminMenu(client); + } + } + if (action == MenuAction_End) + { + CloseHandle(zr_log_flags_menu ); + } +} + AddToKnockbackMultiplier(Float:value) { new Float:current_val = GetConVarFloat(gCvars[CVAR_ZOMBIE_KNOCKBACK]); @@ -434,3 +537,18 @@ AddToClassKnockback(classindex, Float:value) { arrayClasses[classindex][data_knockback] = arrayClasses[classindex][data_knockback] + value; } + +ToggleLogFlag(flag) +{ + new log_flags; + log_flags = GetConVarInt(gCvars[CVAR_LOG]); + if (log_flags & flag) + { + log_flags = log_flags - flag; + } + else + { + log_flags = log_flags + flag; + } + SetConVarInt(gCvars[CVAR_LOG], log_flags); +} \ No newline at end of file