From e051b7bdaa2db03ffafbc443d7ec46a372ea7c47 Mon Sep 17 00:00:00 2001 From: Greyscale Date: Thu, 14 May 2009 02:28:26 +0200 Subject: [PATCH 1/4] Created overlay module to unify class overlays and round end overlays, removed unused class overlay functions, fixed invalid hookid error, allow client to toggle class overlay if allowed in cvar and made toggle cmds configurable, cleaned up translations file. --- .../translations/zombiereloaded.phrases.txt | 127 ++++---- src/zombiereloaded.sp | 18 +- src/zr/antistick.inc | 10 +- src/zr/commands.inc | 146 ++------- src/zr/cvars.inc | 48 +-- src/zr/damage.inc | 41 ++- src/zr/event.inc | 5 +- src/zr/infect.inc | 8 +- src/zr/log.inc | 4 +- src/zr/overlays.inc | 284 ++++++++++++++++++ src/zr/playerclasses/apply.inc | 15 - src/zr/playerclasses/classevents.inc | 33 +- src/zr/playerclasses/classmenus.inc | 21 +- src/zr/playerclasses/clientoverlays.inc | 181 ++++++----- src/zr/playerclasses/playerclasses.inc | 2 + src/zr/roundend.inc | 136 ++------- src/zr/translation.inc | 4 +- src/zr/weapons/restrict.inc | 111 ++++++- src/zr/weapons/weapons.inc | 6 + src/zr/zhp.inc | 2 +- src/zr/zombie.inc | 39 --- src/zr/zombiereloaded.inc | 10 - 22 files changed, 743 insertions(+), 508 deletions(-) create mode 100644 src/zr/overlays.inc diff --git a/cstrike/addons/sourcemod/translations/zombiereloaded.phrases.txt b/cstrike/addons/sourcemod/translations/zombiereloaded.phrases.txt index cd50212..48803bf 100644 --- a/cstrike/addons/sourcemod/translations/zombiereloaded.phrases.txt +++ b/cstrike/addons/sourcemod/translations/zombiereloaded.phrases.txt @@ -4,34 +4,15 @@ // General // =========================== - "Round objective" + "General round objective" { "en" "The game is @greenHumans vs. Zombies@default, the goal for zombies is to infect all humans by knifing them." "ru" "Битва @greenЛюдей против Зомби@default, цель для зомби - инфицировать всех людей." } - "You are a zombie" + "General zmenu reminder" { - "en" "You have been infected! Now go pass it on to as many people as you can." - "ru" "Вы были инфицированы! Теперь вы охотитесь за людьми." - } - - "Zombie replacement" - { - "en" "The last zombie has left the game, and has passed the infection on to you." - "ru" "Последний зомби покинул игру и передал свою инфекцию вам." - } - - "Auto-assign" - { - "#format" "{1:s}" - "en" "You have randomly been assigned to the @green\"{1}\" @defaultclass." - "ru" "Вам был случайным образом установлен класс \"{1}\"." - } - - "!zmenu reminder" - { - "en" "Type !zmenu in chat to view all ZR commands." + "en" "For help on Zombie:Reloaded commands, type !zmenu in chat." "ru" "Напишите !zmenu в чате для просмотра всех команд." } @@ -94,38 +75,90 @@ // General - "!zclass admin mode enabled" + "Classes admin mode enabled" { "en" "Admin mode is enabled!" } + "Classes random assignment" + { + "#format" "{1:s}" + "en" "You have randomly been assigned to the @green\"{1}\" @defaultclass." + "ru" "Вам был случайным образом установлен класс \"{1}\"." + } + + // Center Text/HUD + + "Classes overlay toggle" + { + "#format" "{1:s}" + "en" "Class overlay toggle commands: {1}" + } + // Menu - "!zclass title" + "Classes menu title" { "en" "Class Selection:" } - "!zclass zombie" + "Classes menu zombie" { "en" "Select Zombie Class" } - "!zclass human" + "Classes menu human" { "en" "Select Human Class" } - "!zclass admin" + "Classes menu admin" { "en" "Select Admin Class" } - "!zclass admin mode toggle" + "Classes menu admin mode toggle" { "en" "Toggle Admin Mode" } + // =========================== + // (core) Overlays + // =========================== + + "Overlays not supported" + { + "#format" "{1:d},{2:d}" + "en" "Blocking Overlay - DX{1} Detected (DX{2} Required)" + "ru" "Оверлей Отключен - Обнаружен DX{1} (Необходим DX{2})" + } + + // =========================== + // (core) Infect + // =========================== + + // General + + "Infect infected" + { + "en" "You have been infected! Go pass it on to as many other players as you can." + } + + "Infect disconnect" + { + "en" "The last zombie has left the game, and has passed the infection on to you." + "ru" "Последний зомби покинул игру и передал свою инфекцию вам." + } + + // =========================== + // (core) Damage + // =========================== + + "Damage suicide intercept" + { + "en" "Suicide attempt intercepted." + } + // =========================== // Menu (core) // =========================== @@ -168,15 +201,6 @@ "en" "ZMarket ({1}) - Need a weapon? Buy them here." } - // =========================== - // (core) Damage - // =========================== - - "Damage suicide intercept" - { - "en" "Suicide attempt intercepted." - } - // =========================== // (core) Weapons // =========================== @@ -460,13 +484,6 @@ "en" "Player {1} has been slayed for camping in a restricted area. (ID: {2})" } - "DX90 not supported" - { - "#format" "{1:d},{2:d}" - "en" "Blocking Overlay - DX{1} Detected (DX{2} Required)" - "ru" "Оверлей Отключен - Обнаружен DX{1} (Необходим DX{2})" - } - // =========================== // ZAdmin Menu // =========================== @@ -617,26 +634,4 @@ { "en" "Toggle Logging Flags:" } - - // =========================== - // Server Messages - // =========================== - - "ZR" - { - "en" "ZR" - "ru" "ZR" - } - - "Plugin loading" - { - "en" "-----------| Zombie:Reloaded Loading |----------" - "ru" "-----------| Zombie:Reloaded Загружается |----------" - } - - "Plugin loaded" - { - "en" "-----------| Zombie:Reloaded Loaded |----------" - "ru" "-----------| Zombie:Reloaded Загружен |----------" - } } \ No newline at end of file diff --git a/src/zombiereloaded.sp b/src/zombiereloaded.sp index d0becc7..e630811 100644 --- a/src/zombiereloaded.sp +++ b/src/zombiereloaded.sp @@ -31,6 +31,7 @@ #include "zr/sayhooks" #include "zr/tools" #include "zr/models" +#include "zr/overlays" #include "zr/playerclasses/playerclasses" #include "zr/weapons/weapons" #include "zr/hitgroups" @@ -98,9 +99,6 @@ public OnPluginStart() LoadTranslations("common.phrases.txt"); LoadTranslations("zombiereloaded.phrases.txt"); - // Start loading ZR init functions. - ZR_PrintToServer("Plugin loading"); - // Log LogInit(); @@ -110,16 +108,12 @@ public OnPluginStart() // Tools ToolsInit(); - // TODO: Be modulized/recoded. - CreateCommands(); - HookCommands(); + // Commands + CommandsInit(); // Weapons WeaponsInit(); - // Damage - DamageInit(); - // Say Hooks SayHooksInit(); @@ -131,9 +125,6 @@ public OnPluginStart() // Create public cvar for tracking. CreateConVar("gs_zombiereloaded_version", VERSION, "[ZR] Current version of this plugin", FCVAR_PLUGIN|FCVAR_SPONLY|FCVAR_UNLOGGED|FCVAR_DONTRECORD|FCVAR_REPLICATED|FCVAR_NOTIFY); - - // Finish loading ZR init functions. - ZR_PrintToServer("Plugin loaded"); } /** @@ -171,6 +162,7 @@ public OnMapStart() { // Forward event to modules. SerialOnMapStart(); + OverlaysOnMapStart(); RoundEndOnMapStart(); InfectOnMapStart(); SEffectsOnMapStart(); @@ -216,8 +208,8 @@ public OnClientPutInServer(client) { // Forward event to modules. ClassClientInit(client); + OverlaysClientInit(client); WeaponsClientInit(client); - RoundEndClientInit(client); InfectClientInit(client); DamageClientInit(client); SEffectsClientInit(client); diff --git a/src/zr/antistick.inc b/src/zr/antistick.inc index b624c84..5904395 100644 --- a/src/zr/antistick.inc +++ b/src/zr/antistick.inc @@ -31,12 +31,12 @@ /** * Handle to keep track of AntiStickTimer. -*/ + */ new Handle:tAntiStick = INVALID_HANDLE; /** * Map is starting. -*/ + */ AntiStickOnMapStart() { // Reset timer handle. @@ -71,7 +71,7 @@ AntiStickOnRoundStart() * @param client The client index. * @return The client index of the other stuck player, -1 when * player is not stuck. -*/ + */ AntiStickIsStuck(client) { new Float:clientloc[3]; @@ -116,7 +116,7 @@ AntiStickIsStuck(client) /** * Timer callback, automatically unsticks players that are stuck together. -*/ + */ public Action:AntiStickTimer(Handle:timer) { // x = client index @@ -155,7 +155,7 @@ public Action:AntiStickTimer(Handle:timer) * * @param timer The timer handle. * @param client The client index. -*/ + */ public Action:AntiStickSolidify(Handle:timer, any:client) { // Validate player is in-game, alive, and is being unstuck. diff --git a/src/zr/commands.inc b/src/zr/commands.inc index a98183e..688da55 100644 --- a/src/zr/commands.inc +++ b/src/zr/commands.inc @@ -1,19 +1,33 @@ -/** - * ==================== +/* + * ============================================================================ + * * Zombie:Reloaded - * File: commands.inc - * Author: Greyscale - * ==================== + * + * File: commands.inc + * Type: Core + * Description: Console command creation and hooking. + * + * ============================================================================ */ - -CreateCommands() + +/** + * Commands are created/hooked. + */ +CommandsInit() +{ + // Forward event to modules. (create commands) + WeaponsOnCommandsCreate(); + + // Forward event to modules. (hook commands) + ClassOnCommandsHook(); + DamageOnCommandsHook(); +} + +/*CreateCommands() { RegAdminCmd("zr_infect", Command_Infect, ADMFLAG_GENERIC, "Infects the specified player"); RegAdminCmd("zr_spawn", Command_Respawn, ADMFLAG_GENERIC, "Respawns the specified player following auto-respawning rules"); - // Weapon restrict commands - RegAdminCmd("zr_restrict", Command_Restrict, ADMFLAG_GENERIC, "Restrict a specified weapon"); - RegAdminCmd("zr_unrestrict", Command_Unrestrict, ADMFLAG_GENERIC, "Unrestrict a specified weapon"); //RegAdminCmd("zr_set_class_knockback", Command_SetClassKnockback, ADMFLAG_GENERIC, "Sets the knockback to the specified class. Usage: zr_set_class_knockback "); //RegAdminCmd("zr_get_class_knockback", Command_GetClassKnockback, ADMFLAG_GENERIC, "Gets the knockback to the specified class. Usage: zr_get_class_knockback "); @@ -29,9 +43,10 @@ CreateCommands() RegConsoleCmd("zr_class_dump", Command_ClassDump, "Dumps class data at a specified index in the specified cache. Usage: zr_class_dump "); RegAdminCmd("zr_class_modify", Command_ClassModify, ADMFLAG_GENERIC, "Modify class data on one or more classes. Usage: zr_class_modify [is_multiplier]"); -} + +}*/ -public Action:Command_Infect(client, argc) +/*public Action:Command_Infect(client, argc) { new bool:enabled = GetConVarBool(g_hCvarsList[CVAR_ENABLE]); if (argc < 1 || !enabled) @@ -129,110 +144,9 @@ public Action:Command_Respawn(client, argc) } return Plugin_Handled; -} +}*/ -/** - * Command callback (zr_restrict) - * Restricts a weapon or group - * - * @param client The client index. - * @param argc Argument count. -*/ -public Action:Command_Restrict(client, argc) -{ - // Disabled. - // If plugin is disabled then stop - /**new bool:enabled = GetConVarBool(g_hCvarsList[CVAR_ENABLE]); - if (argc < 1 || !enabled) - { - return Plugin_Handled; - }*/ - - // If weapons module is disabled, then stop. - new bool:weapons = GetConVarBool(g_hCvarsList[CVAR_WEAPONS]); - if (!weapons) - { - // Tell client command is disabled. - ZR_ReplyToCommand(client, "Feature is disabled"); - return Plugin_Handled; - } - - // If restrict module is disabled, then stop. - new bool:restrict = GetConVarBool(g_hCvarsList[CVAR_WEAPONS_RESTRICT]); - if (!restrict) - { - // Tell client command is disabled. - ZR_ReplyToCommand(client, "Feature is disabled"); - return Plugin_Handled; - } - - // arg1 = weapon being restricted - decl String:arg1[32]; - GetCmdArg(1, arg1, sizeof(arg1)); - - // Strip "weapon_" from entity name - ReplaceString(arg1, sizeof(arg1), "weapon_", ""); - - decl String:display[WEAPONS_MAX_LENGTH]; - - new WpnRestrictQuery:output = RestrictRestrict(arg1, display); - RestrictPrintRestrictOutput(client, output, display, true); - - return Plugin_Handled; -} - -/** - * Command callback (zr_unrestrict) - * Unrestricts a weapon or group - * - * @param client The client index. - * @param argc Argument count. -*/ -public Action:Command_Unrestrict(client, argc) -{ - // Disabled. - // If plugin is disabled then stop - /**new bool:enabled = GetConVarBool(g_hCvarsList[CVAR_ENABLE]); - if (argc < 1 || !enabled) - { - return Plugin_Handled; - }*/ - - // If weapons module is disabled, then stop. - new bool:weapons = GetConVarBool(g_hCvarsList[CVAR_WEAPONS]); - if (!weapons) - { - // Tell client command is disabled. - ZR_ReplyToCommand(client, "Feature is disabled"); - return Plugin_Handled; - } - - // If restrict module is disabled, then stop. - new bool:restrict = GetConVarBool(g_hCvarsList[CVAR_WEAPONS_RESTRICT]); - if (!restrict) - { - // Tell client command is disabled. - ZR_ReplyToCommand(client, "Feature is disabled"); - return Plugin_Handled; - } - - // arg1 = weapon being restricted - decl String:arg1[32]; - GetCmdArg(1, arg1, sizeof(arg1)); - - // Strip "weapon_" from entity name - ReplaceString(arg1, sizeof(arg1), "weapon_", ""); - - decl String:display[WEAPONS_MAX_LENGTH]; - - new WpnRestrictQuery:output = RestrictUnrestrict(arg1, display); - RestrictPrintUnrestrictOutput(client, output, display, true); - - return Plugin_Handled; -} - - -public Action:Command_AdminMenu(client, argc) +/*public Action:Command_AdminMenu(client, argc) { if (ZRIsClientValid(client)) { @@ -308,4 +222,4 @@ public Action:Command_LogFlags(client, argc) ReplyToCommand(client, message); return Plugin_Handled; -} +}*/ diff --git a/src/zr/cvars.inc b/src/zr/cvars.inc index 3247062..3d190aa 100644 --- a/src/zr/cvars.inc +++ b/src/zr/cvars.inc @@ -36,6 +36,9 @@ enum CvarsList Handle:CVAR_CLASSES_DEFAULT_ZOMBIE, Handle:CVAR_CLASSES_DEFAULT_HUMAN, Handle:CVAR_CLASSES_DEFAULT_ADMIN, + Handle:CVAR_CLASSES_OVERLAY_TOGGLE, + Handle:CVAR_CLASSES_OVERLAY_TOGGLECMDS, + Handle:CVAR_CLASSES_OVERLAY_DEFAULT, Handle:CVAR_WEAPONS, Handle:CVAR_WEAPONS_RESTRICT, Handle:CVAR_WEAPONS_ZMARKET_BUYZONE, @@ -49,6 +52,7 @@ enum CvarsList Handle:CVAR_SAYHOOKS_QUIET, Handle:CVAR_SAYHOOKS_QUIET_FILTER, Handle:CVAR_SAYHOOKS_QUIET_FLAGS, + Handle:CVAR_OVERLAYS_UPDATE_TIME, Handle:CVAR_ROUNDEND_OVERLAY, Handle:CVAR_ROUNDEND_OVERLAY_ZOMBIE, Handle:CVAR_ROUNDEND_OVERLAY_HUMAN, @@ -117,8 +121,6 @@ enum CvarsList Handle:CVAR_ZHP_DEFAULT, // To be modulized/recoded. - Handle:CVAR_OVERLAY_REDISPLAY, - Handle:CVAR_ZVISION_ALLOW_DISABLE, Handle:CVAR_MENU_AUTOCLOSE, Handle:CVAR_ANTICAMP, Handle:CVAR_ANTICAMP_UPDATE_INTERVAL, @@ -224,6 +226,8 @@ CvarsCreate() // Classes (core) // =========================== + // General + g_hCvarsList[CVAR_CLASSES_SPAWN] = CreateConVar("zr_classes_spawn", "0", ""); // Old Desc: Classmenu is re-displayed every spawn (0: Disable) g_hCvarsList[CVAR_CLASSES_RANDOM] = CreateConVar("zr_classes_random", "0", ""); @@ -235,6 +239,14 @@ CvarsCreate() g_hCvarsList[CVAR_CLASSES_DEFAULT_ADMIN] = CreateConVar("zr_classes_default_admin", "random", ""); // Old Desc: Default admin-only class selected for admins when they connect. Use \"random\" to select a random class, or blank to use class config defaults. + // Overlays + + g_hCvarsList[CVAR_CLASSES_OVERLAY_TOGGLE] = CreateConVar("zr_classes_overlay_toggle", "1", ""); + // Desc: Allow clients to toggle class overlay, zr_classes_overlay_default will be applied on connect. + g_hCvarsList[CVAR_CLASSES_OVERLAY_TOGGLECMDS] = CreateConVar("zr_classes_overlay_togglecmds", "nightvision", ""); + g_hCvarsList[CVAR_CLASSES_OVERLAY_DEFAULT] = CreateConVar("zr_classes_overlay_default", "0", ""); + // Desc: Default toggle value of class overlay. [Ignored when zr_classes_overlay_toggle is disabled.] + // =========================== // Weapons (core) // =========================== @@ -262,17 +274,6 @@ CvarsCreate() g_hCvarsList[CVAR_HITGROUPS] = CreateConVar("zr_hitgroups", "1", ""); // Note make config file cvar. - // =========================== - // Round End (core) - // =========================== - - g_hCvarsList[CVAR_ROUNDEND_OVERLAY] = CreateConVar("zr_roundend_overlay", "1", ""); - // Old Desc: Shows an overlay to all clients when a team wins. (0: Disable) - g_hCvarsList[CVAR_ROUNDEND_OVERLAY_HUMAN] = CreateConVar("zr_roundend_overlays_human", "overlays/zr/humans_win"); - // Old Desc: overlays/zr/humans_win", "Path to \"humans win\" overlay - g_hCvarsList[CVAR_ROUNDEND_OVERLAY_ZOMBIE] = CreateConVar("zr_roundend_overlays_zombie", "overlays/zr/zombies_win", ""); - // Old Desc: Path to \"zombies win\" overlay - // =========================== // Infect (core) // =========================== @@ -337,6 +338,23 @@ CvarsCreate() // 32 Quiet "!zhp" say hook. // 64 Quiet "!zmarket" say hook. + // =========================== + // Overlays (core) + // =========================== + + g_hCvarsList[CVAR_OVERLAYS_UPDATE_TIME] = CreateConVar("zr_overlays_update_time", "1.0", ""); + + // =========================== + // Round End (core) + // =========================== + + g_hCvarsList[CVAR_ROUNDEND_OVERLAY] = CreateConVar("zr_roundend_overlay", "1", ""); + // Old Desc: Shows an overlay to all clients when a team wins. (0: Disable) + g_hCvarsList[CVAR_ROUNDEND_OVERLAY_HUMAN] = CreateConVar("zr_roundend_overlays_human", "overlays/zr/humans_win"); + // Old Desc: overlays/zr/humans_win", "Path to \"humans win\" overlay + g_hCvarsList[CVAR_ROUNDEND_OVERLAY_ZOMBIE] = CreateConVar("zr_roundend_overlays_zombie", "overlays/zr/zombies_win", ""); + // Old Desc: Path to \"zombies win\" overlay + // =========================== // Account (module) // =========================== @@ -480,10 +498,6 @@ CvarsCreate() // Old Desc: The default value of zombie health display to new clients (1: On, 0: Off) - // TO BE MODULIZED/RECODED. - g_hCvarsList[CVAR_OVERLAY_REDISPLAY] = CreateConVar("zr_overlay_redisplay", "3", ""); - // Old Desc: Frequency, in seconds, to display overlay on the client's screen (Never go below 0.1, 0.2 seems safe) - g_hCvarsList[CVAR_ZVISION_ALLOW_DISABLE] = CreateConVar("zr_zvision_allow_disable", "1", ""); // Old Desc: Allow users to disable ZVision with their nightvision key (0: Disable) g_hCvarsList[CVAR_MENU_AUTOCLOSE] = CreateConVar("zr_menu_autoclose", "0", ""); // Old Desc: Automatically close menus on selection. If disabled the menu will remain open. diff --git a/src/zr/damage.inc b/src/zr/damage.inc index bfb83b3..79b716e 100644 --- a/src/zr/damage.inc +++ b/src/zr/damage.inc @@ -24,23 +24,22 @@ */ /** - * List of damage-related hooks. + * Array to store TraceAttack HookIDs. */ -enum DamageHooks -{ - Hook_TraceAttack, /** TraceAttack HookID */ - Hook_OnTakeDamage, /** OnTakeDamage HookID */ -} - -new g_iDamageHookID[MAXPLAYERS + 1][DamageHooks]; +new g_iDamageTraceAttackHookID[MAXPLAYERS + 1] = {-1, ...}; /** - * Damage module init function. + * Array to store OnTakeDamage HookIDs. */ -DamageInit() +new g_iDamageOnTakeDamageHookID[MAXPLAYERS + 1] = {-1, ...}; + +/** + * Hook commands related to damage here. + */ +DamageOnCommandsHook() { // Create command callbacks (intercepts) for listed suicide commands. - decl String:suicidecmds[64]; + decl String:suicidecmds[DAMAGE_SUICIDE_MAX_CMDS * DAMAGE_SUICIDE_MAX_LENGTH]; GetConVarString(g_hCvarsList[CVAR_DAMAGE_SUICIDE_CMDS], suicidecmds, sizeof(suicidecmds)); // Create array to store cmds @@ -66,8 +65,8 @@ DamageInit() DamageClientInit(client) { // Hook damage callbacks. - g_iDamageHookID[client][Hook_TraceAttack] = ZRTools_HookTraceAttack(client, DamageTraceAttack); - g_iDamageHookID[client][Hook_OnTakeDamage] = ZRTools_HookOnTakeDamage(client, DamageOnTakeDamage); + g_iDamageTraceAttackHookID[client] = ZRTools_HookTraceAttack(client, DamageTraceAttack); + g_iDamageOnTakeDamageHookID[client] = ZRTools_HookOnTakeDamage(client, DamageOnTakeDamage); } /** @@ -77,9 +76,19 @@ DamageClientInit(client) */ DamageOnClientDisconnect(client) { - // Unhook damage callbacks. - ZRTools_UnhookTraceAttack(g_iDamageHookID[client][Hook_TraceAttack]); - ZRTools_UnhookOnTakeDamage(g_iDamageHookID[client][Hook_OnTakeDamage]); + // Unhook damage callbacks, and reset variables. + + if (g_iDamageTraceAttackHookID[client] != -1) + { + ZRTools_UnhookTraceAttack(g_iDamageTraceAttackHookID[client]); + g_iDamageTraceAttackHookID[client] = -1; + } + + if (g_iDamageOnTakeDamageHookID[client] != -1) + { + ZRTools_UnhookOnTakeDamage(g_iDamageOnTakeDamageHookID[client]); + g_iDamageOnTakeDamageHookID[client] = -1; + } } /** diff --git a/src/zr/event.inc b/src/zr/event.inc index fba8390..ca8d4ec 100644 --- a/src/zr/event.inc +++ b/src/zr/event.inc @@ -66,9 +66,10 @@ EventHook(bool:unhook = false) */ public Action:EventRoundStart(Handle:event, const String:name[], bool:dontBroadcast) { - ZR_PrintToChat(0, "Round objective"); + ZR_PrintToChat(0, "General round objective"); // Forward event to sub-modules. + OverlaysOnRoundStart(); RoundEndOnRoundStart(); InfectOnRoundStart(); SEffectsOnRoundStart(); @@ -182,7 +183,7 @@ public Action:EventPlayerSpawn(Handle:event, const String:name[], bool:dontBroad ZTeleOnClientSpawn(index); ZHPOnClientSpawn(index); - ZR_PrintToChat(index, "!zmenu reminder"); + ZR_PrintToChat(index, "General zmenu reminder"); } /** diff --git a/src/zr/infect.inc b/src/zr/infect.inc index 9af6ae5..a45d0d8 100644 --- a/src/zr/infect.inc +++ b/src/zr/infect.inc @@ -180,7 +180,7 @@ InfectOnClientDisconnect(client) InfectClient(randclient); // Tell client they have been randomly been chosen to replace disconnecting zombie. - ZR_PrintToChat(randclient, "Zombie replacement"); + ZR_PrintToChat(randclient, "Infect disconnect"); // Destroy handle. CloseHandle(arrayEligibleClients); @@ -565,6 +565,12 @@ InfectClient(client, attacker = -1, bool:motherinfect = false) // TODO: A solution to stop confusing bots? Respawn and teleport? CS_SwitchTeam(client, CS_TEAM_T); + // Format infection message. + SetGlobalTransTarget(client); + + // Print message to client. + ZR_PrintToChat(client, "Infect infected"); + // Forward event to modules. ClassOnClientInfected(client, motherinfect); RoundEndOnClientInfected(); diff --git a/src/zr/log.inc b/src/zr/log.inc index 6544ae9..193a068 100644 --- a/src/zr/log.inc +++ b/src/zr/log.inc @@ -156,7 +156,7 @@ LogMessageFormatted(client, const String:module[], const String:block[], const S SetGlobalTransTarget(client); // Print to client. - PrintToConsole(client, "%t %s", "ZR", logtext); + PrintToConsole(client, "[ZR] %s", logtext); } } @@ -183,7 +183,7 @@ LogToAdmins(String:message[]) SetGlobalTransTarget(x); // Format message to admin, then print. - Format(buffer, sizeof(buffer), "%t %s", "ZR", message); + Format(buffer, sizeof(buffer), "[ZR] %s", message); PrintToChat(x, buffer); } } diff --git a/src/zr/overlays.inc b/src/zr/overlays.inc new file mode 100644 index 0000000..9df5186 --- /dev/null +++ b/src/zr/overlays.inc @@ -0,0 +1,284 @@ +/* + * ============================================================================ + * + * Zombie:Reloaded + * + * File: overlays.inc + * Type: Core + * Description: Overlay system, separating different types into "overlay channels." + * + * ============================================================================ + */ + +/** + * Minimum dx level required to see overlays. + */ +#define OVERLAYS_DXL_MIN 90 + +/** + * Maximum amount of overlay channels. + */ +#define OVERLAYS_CHANNEL_MAX 2 + +/** + * All possible overlay channels, in order of priority. + */ +enum OverlaysChannel +{ + OVERLAYS_CHANNEL_NONE = -1, /** Client has no overlay */ + OVERLAYS_CHANNEL_ROUNDEND = 0, /** Round win overlay */ + OVERLAYS_CHANNEL_CLASSES = 1, /** Class overlay */ +} + +/** + * Global variable to store a convar query cookie + */ +new QueryCookie:mat_dxlevel; + +/** + * The DirectX level of a client. + */ +new g_iOverlaysDXL[MAXPLAYERS + 1]; + +/** + * Array to track overlay channel state on each client. + */ +new bool:g_bOverlayChannel[MAXPLAYERS + 1][OverlaysChannel]; + +/** + * Array to store overlay path for each channel. + */ +new String:g_strOverlayPath[MAXPLAYERS + 1][OverlaysChannel][PLATFORM_MAX_PATH]; + +/** + * Create variable to store global timer handle. + */ +new Handle:tOverlays = INVALID_HANDLE; + +/** + * Map is starting. + */ +OverlaysOnMapStart() +{ + // Reset timer handle. + tOverlays = INVALID_HANDLE; +} + +/** + * Client is joining the server. + * + * @param client The client index. + */ +OverlaysClientInit(client) +{ + // x = channel index. + for (new x = 0; x < OVERLAYS_CHANNEL_MAX; x++) + { + // Disable all channels, and reset. + OverlaysClientSetChannelState(client, OverlaysChannel:x, false, false, false, true); + } + + // Get client's DX level. + OverlaysGetClientDXLevel(client); +} + +/** + * Finds DX level of a client. + * + * @param client The client index. + */ +OverlaysGetClientDXLevel(client) +{ + // If client is fake (or bot), then stop. + if (IsFakeClient(client)) + { + return; + } + + // Query mat_dxlevel on client. + mat_dxlevel = QueryClientConVar(client, "mat_dxlevel", OverlaysQueryClientDXLevel); +} + +/** + * Query callback function. + * + * @param cookie Unique cookie of the query. + * @param client The client index. + * @param result The result of the query (see console.inc enum ConVarQueryResult) + * @param cvarName Name of the cvar. + * @param cvarValue Value of the cvar. + */ +public OverlaysQueryClientDXLevel(QueryCookie:cookie, client, ConVarQueryResult:result, const String:cvarName[], const String:cvarValue[]) +{ + // If query cookie does not match cookie given by mat_dxlevel query, then stop, this isn't our query. + if (cookie != mat_dxlevel) + { + return; + } + + // Reset dxLevel. + g_iOverlaysDXL[client] = 0; + + // If result is any other than ConVarQuery_Okay, then stop. + if (result != ConVarQuery_Okay) + { + return; + } + + // Copy cvar value to dxLevel array. + g_iOverlaysDXL[client] = StringToInt(cvarValue); +} + +/** + * The round is starting. + */ +OverlaysOnRoundStart() +{ + // If timer is running, kill it. + if (tOverlays != INVALID_HANDLE) + { + KillTimer(tOverlays); + } + + // If antistick is disabled, then stop. + new Float:overlaysupdate = GetConVarFloat(g_hCvarsList[CVAR_OVERLAYS_UPDATE_TIME]); + if (overlaysupdate <= 0.0) + { + return; + } + + // Start repeating timer. + tOverlays = CreateTimer(overlaysupdate, OverlaysTimer, _, TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE); +} + +/** + * Update overlay on a client. (Displays highest priority overlays first, if enabled.) + * + * @param client The client index. + * @param channel (Optional) The channel overlay to update. + */ +OverlaysClientUpdateOverlay(client, OverlaysChannel:channel = OVERLAYS_CHANNEL_NONE) +{ + // Find highest priority, enabled, overlay channel of client. + if (channel == OVERLAYS_CHANNEL_NONE) + { + channel = OverlaysClientFindChannel(client); + } + // Stop here if client has no overlay channel enabled. + if (channel == OVERLAYS_CHANNEL_NONE) + { + // Clear any existing overlay from screen. + ClientCommand(client, "r_screenoverlay \"\""); + return; + } + + // If dxLevel is 0, then query on client failed, so try again, then stop. + if (!g_iOverlaysDXL[client]) + { + // Query dxlevel cvar, again. + OverlaysGetClientDXLevel(client); + return; + } + + // If client doesn't meet DXLevel requirement, then tell client, then stop. + if (g_iOverlaysDXL[client] < OVERLAYS_DXL_MIN) + { + ZR_PrintCenterText(client, "Overlays not supported", g_iOverlaysDXL[client], OVERLAYS_DXL_MIN); + return; + } + + // Display overlay to client. + ClientCommand(client, "r_screenoverlay %s", g_strOverlayPath[client][channel]); +} + +OverlaysChannel:OverlaysClientFindChannel(client) +{ + // x = channel index. + for (new x = 0; x < OVERLAYS_CHANNEL_MAX; x++) + { + // Convert to OverlaysChannel datatype. + new OverlaysChannel:channel = OverlaysChannel:x; + + if (OverlaysClientGetChannelState(client, channel)) + { + // Return channel. + return channel; + } + } + + return OVERLAYS_CHANNEL_NONE; +} + +/** + * Toggle or set new value to a channel state of a client. + * + * @param client The client index. + * @param channel The channel to change state of. + * @param toggle Set to true to toggle state, false to use value param. + * @param value (Optional) New value of the state, only used if toggle is false. + */ +bool:OverlaysClientSetChannelState(client, OverlaysChannel:channel, bool:update = false, bool:toggle = true, bool:value = false, bool:reset = false) +{ + // Toggle or set new state to channel of a client. + g_bOverlayChannel[client][channel] = toggle ? !g_bOverlayChannel[client][channel] : value; + + if (update) + { + // Update client overlay. + OverlaysClientUpdateOverlay(client); + } + + if (reset) + { + OverlaysClientSetChannelPath(client, channel, ""); + } + + // Return new value. + return g_bOverlayChannel[client][channel]; +} + +/** + * Get current value of a channel state of a client. + * + * @param client The client index. + * @param channel The channel to get state of. + */ +bool:OverlaysClientGetChannelState(client, OverlaysChannel:channel) +{ + // Return current value. + return g_bOverlayChannel[client][channel]; +} + +/** + * Set overlay path for a channel. + * + * @param client The client index. + * @param channel The channel to set path on. + * @param path Path to overlay. + */ +OverlaysClientSetChannelPath(client, OverlaysChannel:channel, const String:path[]) +{ + // Copy path to the overlay channel's path string. + strcopy(g_strOverlayPath[client][channel], PLATFORM_MAX_PATH, path); +} + +/** + * Timer callback, updates overlay on each client. + * + * @param timer The timer handle. + */ +public Action:OverlaysTimer(Handle:timer) +{ + // x = client index + for (new x = 1; x <= MaxClients; x++) + { + // If client isn't in game, then stop. + if (!IsClientInGame(x)) + { + continue; + } + + // Update client's overlay. + OverlaysClientUpdateOverlay(x); + } +} \ No newline at end of file diff --git a/src/zr/playerclasses/apply.inc b/src/zr/playerclasses/apply.inc index 3672cea..10386a7 100644 --- a/src/zr/playerclasses/apply.inc +++ b/src/zr/playerclasses/apply.inc @@ -136,21 +136,6 @@ bool:ClassApplyAlpha(client, classindex, cachetype = ZR_CLASS_CACHE_PLAYER) */ bool:ClassApplyOverlay(client, classindex, cachetype = ZR_CLASS_CACHE_PLAYER) { - // If dxLevel is 0, then query on client failed, so try again, then stop. - if (!dxLevel[client]) - { - // Query dxlevel cvar. - RoundEndGetClientDXLevel(client); - return false; - } - - // If client doesn't meet minimum requirement, then print unsupported text. - if (dxLevel[client] < GENERAL_DXLEVEL_MIN) - { - ZR_PrintCenterText(client, "DX90 not supported", dxLevel[client], GENERAL_DXLEVEL_MIN); - return false; - } - decl String:overlaypath[PLATFORM_MAX_PATH]; // Get the overlay path from the specified cache. diff --git a/src/zr/playerclasses/classevents.inc b/src/zr/playerclasses/classevents.inc index 944b21d..bc586a8 100644 --- a/src/zr/playerclasses/classevents.inc +++ b/src/zr/playerclasses/classevents.inc @@ -29,6 +29,18 @@ ClassClientInit(client) // Set default class indexes on the player. ClassClientSetDefaultIndexes(client); } + + // Forward event to sub-modules + ClassOverlayClientInit(client); +} + +/** + * Hook commands related to classes here. + */ +ClassOnCommandsHook() +{ + // Forward event to sub-modules. + ClassOverlayOnCommandsHook(); } /** @@ -44,9 +56,13 @@ ClassOnClientDisconnect(client) { // Disable class attributes with timers. ClassHealthRegenStop(client); - ClassOverlayStop(client); } +/** + * Client is spawning into the game. + * + * @param client The client index. + */ ClassOnClientSpawn(client) { // Check if the player is alive. @@ -78,12 +94,12 @@ ClassOnClientSpawn(client) // Mark zombie class as selected. ClassSelected[client][ZR_CLASS_TEAM_ZOMBIES] = randomzombie; ClassGetName(randomzombie, classname, sizeof(classname), ZR_CLASS_TEAM_ZOMBIES); - ZR_PrintToChat(client, "Auto-assign", classname); + ZR_PrintToChat(client, "Classes random assignment", classname); // Mark human class as selected. ClassSelected[client][ZR_CLASS_TEAM_HUMANS] = randomhuman; ClassGetName(randomhuman, classname, sizeof(classname), ZR_CLASS_TEAM_HUMANS); - ZR_PrintToChat(client, "Auto-assign", classname); + ZR_PrintToChat(client, "Classes random assignment", classname); // Update player cache with the human class data, and apply it. ClassReloadPlayerCache(client, randomhuman); @@ -111,13 +127,18 @@ ClassOnClientSpawn(client) ClassReloadPlayerCache(client, ClassGetActiveIndex(client)); ClassApplyAttributes(client); } + + // Forward event to sub-modules. + ClassOverlayOnClientSpawn(client); } ClassOnClientDeath(client) { // Disable class attributes with timers. ClassHealthRegenStop(client); - ClassOverlayStop(client); + + // Disable overlay. + OverlaysClientSetChannelState(client, OVERLAYS_CHANNEL_CLASSES, true, false, false, true); // Set client's FOV back to normal. ToolsSetClientDefaultFOV(client, 90); @@ -129,11 +150,13 @@ ClassOnClientInfected(client, bool:motherzombie = false) // Disable class attributes with timers. ClassHealthRegenStop(client); - ClassOverlayStop(client); // Update the players cache with zombie attributes. ClassReloadPlayerCache(client, classindex); // Apply the new attributes. ClassApplyAttributes(client, motherzombie); + + // Forward event to sub-modules. + ClassOverlayOnClientInfected(client); } diff --git a/src/zr/playerclasses/classmenus.inc b/src/zr/playerclasses/classmenus.inc index e3bf138..4691cea 100644 --- a/src/zr/playerclasses/classmenus.inc +++ b/src/zr/playerclasses/classmenus.inc @@ -27,7 +27,7 @@ ClassMenuMain(client) new Handle:menu = CreateMenu(ClassMenuMainHandle); SetGlobalTransTarget(client); - SetMenuTitle(menu, "%t\n", "!zclass title"); + SetMenuTitle(menu, "%t\n", "Classes menu title"); decl String:zombieclass[128]; decl String:humanclass[128]; @@ -55,18 +55,18 @@ ClassMenuMain(client) if (ClassPlayerInAdminMode[client]) { // Notify the player. - Format(inadminmnode, sizeof(inadminmnode), "%t\n", "!zclass admin mode enabled"); + Format(inadminmnode, sizeof(inadminmnode), "%t\n", "Classes admin mode enabled"); AddMenuItem(menu, "", inadminmnode, ITEMDRAW_RAWLINE); } // List zombie class options. ClassGetName(ClassSelected[client][ZR_CLASS_TEAM_ZOMBIES], zombieclass, sizeof(zombieclass), ZR_CLASS_CACHE_MODIFIED); - Format(zombieselect, sizeof(zombieselect), "%t\n %s", "!zclass zombie", zombieclass); + Format(zombieselect, sizeof(zombieselect), "%t\n %s", "Classes menu zombie", zombieclass); AddMenuItem(menu, "", zombieselect, zombie_itemdraw); // List human class options. ClassGetName(ClassSelected[client][ZR_CLASS_TEAM_HUMANS], humanclass, sizeof(humanclass), ZR_CLASS_CACHE_MODIFIED); - Format(humanselect, sizeof(humanselect), "%t\n %s", "!zclass human", humanclass); + Format(humanselect, sizeof(humanselect), "%t\n %s", "Classes menu human", humanclass); AddMenuItem(menu, "", humanselect, human_itemdraw); // Only display admin class options for admins, and if admin classes exist. @@ -74,7 +74,7 @@ ClassMenuMain(client) { // List admin class options. ClassGetName(ClassSelected[client][ZR_CLASS_TEAM_ADMINS], adminclass, sizeof(adminclass), ZR_CLASS_CACHE_MODIFIED); - Format(adminselect, sizeof(adminselect), "%t\n %s", "!zclass admin", adminclass); + Format(adminselect, sizeof(adminselect), "%t\n %s", "Classes menu admin", adminclass); AddMenuItem(menu, "", adminselect, admin_itemdraw); // Set admin mode status string. @@ -91,7 +91,7 @@ ClassMenuMain(client) AddMenuItem(menu, "", " ", ITEMDRAW_RAWLINE); // Show admin mode toggle option. - Format(toggleadminmode, sizeof(toggleadminmode), "%t\n %s", "!zclass admin mode toggle", adminmode); + Format(toggleadminmode, sizeof(toggleadminmode), "%t\n %s", "Classes menu admin mode toggle", adminmode); AddMenuItem(menu, "", toggleadminmode, admin_itemdraw); } @@ -174,15 +174,15 @@ ClassMenuSelect(client, teamid) { case ZR_CLASS_TEAM_ZOMBIES: { - Format(title, sizeof(title), "%t\n", "!zclass zombie"); + Format(title, sizeof(title), "%t\n", "Classes menu zombie"); } case ZR_CLASS_TEAM_HUMANS: { - Format(title, sizeof(title), "%t\n", "!zclass human"); + Format(title, sizeof(title), "%t\n", "Classes menu human"); } case ZR_CLASS_TEAM_ADMINS: { - Format(title, sizeof(title), "%t\n", "!zclass admin"); + Format(title, sizeof(title), "%t\n", "Classes menu admin"); } } SetMenuTitle(menu, title); @@ -213,7 +213,8 @@ ClassMenuSelect(client, teamid) { // No classes found. Display message. The main class menu should // prevent this from happening, but we print a message just in case. - Format(menuitem, sizeof(menuitem), "%t\n", "!zclass not found"); + // THIS TRANSLATION PHRASES IS NOT IN FILE. + Format(menuitem, sizeof(menuitem), "%t\n", "Classes menu not found"); AddMenuItem(menu, classname, menuitem, ITEMDRAW_RAWLINE); } diff --git a/src/zr/playerclasses/clientoverlays.inc b/src/zr/playerclasses/clientoverlays.inc index 95dbcfe..64a30c5 100644 --- a/src/zr/playerclasses/clientoverlays.inc +++ b/src/zr/playerclasses/clientoverlays.inc @@ -11,46 +11,100 @@ */ /** - * Timer handles for redisplaying overlays on clients. + * @section Suicide intercept defines. */ -new Handle:tOverlay[MAXPLAYERS + 1]; +#define CLASSOVERLAY_TOGGLE_MAX_CMDS 5 +#define CLASSOVERLAY_TOGGLE_MAX_LENGTH 16 +/** + * @endsection + */ + +/** + * Array to store default class overlay enable flag. + */ +new bool:h_bClassOverlay[MAXPLAYERS + 1]; /** - * Specifies if a client have a overlay. + * Client is joining the server. + * + * @param client The client index. */ -new bool:bClientHasOverlay[MAXPLAYERS + 1]; - -/** - * Tells whether the overlay is on or not. - */ -new bool:bClientOverlayOn[MAXPLAYERS + 1]; - -/** - * Path to the currently active overlay. - */ -new String:ActiveOverlay[MAXPLAYERS + 1][PLATFORM_MAX_PATH]; - - -/** - * Returns if the have a overlay path specified. - * - * @param client The client index. - * @return True if a overlay path is specified, false otherwise. - */ -bool:ClassClientHasOverlay(client) +ClassOverlayClientInit(client) { - return bClientHasOverlay[client]; + // Get overlay toggle cvar values. + new bool:overlaytoggle = GetConVarBool(g_hCvarsList[CVAR_CLASSES_OVERLAY_TOGGLE]); + new bool:overlaydefault = GetConVarBool(g_hCvarsList[CVAR_CLASSES_OVERLAY_DEFAULT]); + + // Apply default value if toggle is enabled, default to true if toggle is disabled. + h_bClassOverlay[client] = overlaytoggle ? overlaydefault : true; } /** - * Returns if the overlay is currently on or not. - * - * @param client The client index. - * @return True if on, false otherwise. + * Hook commands related to overlay here. */ -bool:ClassOverlayIsOn(client) +ClassOverlayOnCommandsHook() { - return bClientOverlayOn[client]; + // Create command callbacks (intercepts) for listed suicide commands. + decl String:togglecmds[CLASSOVERLAY_TOGGLE_MAX_CMDS * CLASSOVERLAY_TOGGLE_MAX_LENGTH]; + GetConVarString(g_hCvarsList[CVAR_CLASSES_OVERLAY_TOGGLECMDS], togglecmds, sizeof(togglecmds)); + + // Create array to store cmds + new String:arrayCmds[CLASSOVERLAY_TOGGLE_MAX_CMDS][CLASSOVERLAY_TOGGLE_MAX_LENGTH]; + + // Explode string into array indexes. + new cmdcount = ExplodeString(togglecmds, ", ", arrayCmds, CLASSOVERLAY_TOGGLE_MAX_CMDS, CLASSOVERLAY_TOGGLE_MAX_LENGTH); + + // x = array index. + // arrayCmds[x] = suicide command. + for (new x = 0; x <= cmdcount - 1; x++) + { + // Prepare intercept for this command. + RegConsoleCmd(arrayCmds[x], ClassOverlayEnableCommand); + } +} + +/** + * Client is spawning into the game. + * + * @param client The client index. + */ +ClassOverlayOnClientSpawn(client) +{ + // If overlay toggle is enabled and class has an overlay, then send center text. + new bool:overlaytoggle = GetConVarBool(g_hCvarsList[CVAR_CLASSES_OVERLAY_TOGGLE]); + + decl String:overlaypath[PLATFORM_MAX_PATH]; + ClassGetOverlayPath(client, overlaypath, sizeof(overlaypath)); + + if (overlaytoggle && overlaypath[0]) + { + decl String:togglecmds[CLASSOVERLAY_TOGGLE_MAX_CMDS * CLASSOVERLAY_TOGGLE_MAX_LENGTH]; + GetConVarString(g_hCvarsList[CVAR_CLASSES_OVERLAY_TOGGLECMDS], togglecmds, sizeof(togglecmds)); + + ZR_HudHint(client, "Classes overlay toggle", togglecmds); + } +} + +/** + * Client has been infected. + * + * @param client The client index. + */ +ClassOverlayOnClientInfected(client) +{ + // If overlay toggle is enabled and class has an overlay, then send center text. + new bool:overlaytoggle = GetConVarBool(g_hCvarsList[CVAR_CLASSES_OVERLAY_TOGGLE]); + + decl String:overlaypath[PLATFORM_MAX_PATH]; + ClassGetOverlayPath(client, overlaypath, sizeof(overlaypath)); + + if (overlaytoggle && overlaypath[0]) + { + decl String:togglecmds[CLASSOVERLAY_TOGGLE_MAX_CMDS * CLASSOVERLAY_TOGGLE_MAX_LENGTH]; + GetConVarString(g_hCvarsList[CVAR_CLASSES_OVERLAY_TOGGLECMDS], togglecmds, sizeof(togglecmds)); + + ZR_PrintCenterText(client, "Classes overlay toggle", togglecmds); + } } ClassOverlayInitialize(client, const String:overlay[]) @@ -60,57 +114,34 @@ ClassOverlayInitialize(client, const String:overlay[]) return; } - if (strlen(overlay) == 0) + // If overlay path is empty, then disable channel, then stop. + if (!overlay[0]) { - bClientHasOverlay[client] = false; - } - else - { - bClientHasOverlay[client] = true; - strcopy(ActiveOverlay[client], PLATFORM_MAX_PATH, overlay); - - ClassOverlayStart(client); + OverlaysClientSetChannelState(client, OVERLAYS_CHANNEL_CLASSES, true, false, false, true); + return; } + + // Display class overlays. + OverlaysClientSetChannelPath(client, OVERLAYS_CHANNEL_CLASSES, overlay); + OverlaysClientSetChannelState(client, OVERLAYS_CHANNEL_CLASSES, true, false, h_bClassOverlay[client]); } -ClassOverlayStart(client) +/** + * Command callback (See zr_classes_overlay_togglecmds) + * Toggles nightvision of a client. + * + * @param client The client index. + * @param argc Argument count. + */ +public Action:ClassOverlayEnableCommand(client, argc) { - // Kill timer if it exist. - if (tOverlay[client] != INVALID_HANDLE) + // If overlay toggle is disabled, then stop. + new bool:overlaytoggle = GetConVarBool(g_hCvarsList[CVAR_CLASSES_OVERLAY_TOGGLE]); + if (!overlaytoggle) { - KillTimer(tOverlay[client]); - tOverlay[client] = INVALID_HANDLE; + return; } - ClientCommand(client, "r_screenoverlay \"%s\"", ActiveOverlay[client]); - bClientOverlayOn[client] = true; - - new Float:redisplay = GetConVarFloat(g_hCvarsList[CVAR_OVERLAY_REDISPLAY]); - tOverlay[client] = CreateTimer(redisplay, ClassOverlayTimer, client, TIMER_REPEAT); -} - -ClassOverlayStop(client) -{ - // Kill timer if it exist. - if (tOverlay[client] != INVALID_HANDLE) - { - KillTimer(tOverlay[client]); - tOverlay[client] = INVALID_HANDLE; - } - - // Disable client overlay. - ClientCommand(client, "r_screenoverlay \"\""); - bClientOverlayOn[client] = false; -} - -public Action:ClassOverlayTimer(Handle:timer, any:client) -{ - if (!IsClientInGame(client) || !InfectIsClientInfected(client)) - { - tOverlay[client] = INVALID_HANDLE; - return Plugin_Stop; - } - - ClientCommand(client, "r_screenoverlay \"%s\"", ActiveOverlay[client]); - return Plugin_Continue; + // Toggle current overlay channel, and retrieve new value. + h_bClassOverlay[client] = OverlaysClientSetChannelState(client, OVERLAYS_CHANNEL_CLASSES, true, true); } diff --git a/src/zr/playerclasses/playerclasses.inc b/src/zr/playerclasses/playerclasses.inc index 0b714ce..182f008 100644 --- a/src/zr/playerclasses/playerclasses.inc +++ b/src/zr/playerclasses/playerclasses.inc @@ -476,6 +476,8 @@ ClassLoad() } } + + /** * Updates the class data cache. Original values are retrieved from ClassData. * diff --git a/src/zr/roundend.inc b/src/zr/roundend.inc index 0f512a4..bb828e7 100644 --- a/src/zr/roundend.inc +++ b/src/zr/roundend.inc @@ -13,22 +13,22 @@ /** * @section All round end reasons. */ -#define ROUNDEND_TARGET_BOMBED 1 // Target Successfully Bombed! +#define ROUNDEND_TARGET_BOMBED 1 // Target Successfully Bombed! #define ROUNDEND_VIP_ESCAPED 2 // The VIP has escaped! -#define ROUNDEND_VIP_ASSASSINATED 3 // VIP has been assassinated! -#define ROUNDEND_TERRORISTS_ESCAPED 4 // The terrorists have escaped! -#define ROUNDEND_CTS_PREVENTESCAPE 5 // The CT's have prevented most of the terrorists from escaping! +#define ROUNDEND_VIP_ASSASSINATED 3 // VIP has been assassinated! +#define ROUNDEND_TERRORISTS_ESCAPED 4 // The terrorists have escaped! +#define ROUNDEND_CTS_PREVENTESCAPE 5 // The CT's have prevented most of the terrorists from escaping! #define ROUNDEND_ESCAPING_TERRORISTS_NEUTRALIZED 6 // Escaping terrorists have all been neutralized! -#define ROUNDEND_BOMB_DEFUSED 7 // The bomb has been defused! +#define ROUNDEND_BOMB_DEFUSED 7 // The bomb has been defused! #define ROUNDEND_CTS_WIN 8 // Counter-Terrorists Win! -#define ROUNDEND_TERRORISTS_WIN 9 // Terrorists Win! -#define ROUNDEND_ROUND_DRAW 10 // Round Draw! -#define ROUNDEND_ALL_HOSTAGES_RESCUED 11 // All Hostages have been rescued! -#define ROUNDEND_TARGET_SAVED 12 // Target has been saved! -#define ROUNDEND_HOSTAGES_NOT_RESCUED 13 // Hostages have not been rescued! -#define ROUNDEND_TERRORISTS_NOT_ESCAPED 14 // Terrorists have not escaped! -#define ROUNDEND_VIP_NOT_ESCAPED 15 // VIP has not escaped! -#define ROUNDEND_GAME_COMMENCING 16 // Game Commencing! +#define ROUNDEND_TERRORISTS_WIN 9 // Terrorists Win! +#define ROUNDEND_ROUND_DRAW 10 // Round Draw! +#define ROUNDEND_ALL_HOSTAGES_RESCUED 11 // All Hostages have been rescued! +#define ROUNDEND_TARGET_SAVED 12 // Target has been saved! +#define ROUNDEND_HOSTAGES_NOT_RESCUED 13 // Hostages have not been rescued! +#define ROUNDEND_TERRORISTS_NOT_ESCAPED 14 // Terrorists have not escaped! +#define ROUNDEND_VIP_NOT_ESCAPED 15 // VIP has not escaped! +#define ROUNDEND_GAME_COMMENCING 16 // Game Commencing! /** * @endsection */ @@ -54,11 +54,6 @@ enum RoundEndOutcome */ new Handle:tRoundEnd = INVALID_HANDLE; -/** - * Global variable to store a convar query cookie - */ -new QueryCookie:mat_dxlevel; - /** * Map is starting. */ @@ -68,17 +63,6 @@ RoundEndOnMapStart() tRoundEnd = INVALID_HANDLE; } -/** - * Client is joining the server. - * - * @param client The client index. - */ -RoundEndClientInit(client) -{ - // Get client's DX level. - RoundEndGetClientDXLevel(client); -} - /** * Client has been killed. */ @@ -167,53 +151,6 @@ RoundEndOnRoundEnd(reason) RoundEndBalanceTeams(); } -/** - * Finds DX level of a client. - * - * @param client The client index. - */ -RoundEndGetClientDXLevel(client) -{ - // If client is fake (or bot), then stop. - if (IsFakeClient(client)) - { - return; - } - - // Query mat_dxlevel on client. - mat_dxlevel = QueryClientConVar(client, "mat_dxlevel", RoundEndQueryClientDXLevel); -} - -/** - * Query callback function. - * - * @param cookie Unique cookie of the query. - * @param client The client index. - * @param result The result of the query (see console.inc enum ConVarQueryResult) - * @param cvarName Name of the cvar. - * @param cvarValue Value of the cvar. - */ -public RoundEndQueryClientDXLevel(QueryCookie:cookie, client, ConVarQueryResult:result, const String:cvarName[], const String:cvarValue[]) -{ - // If query cookie does not match cookie given by mat_dxlevel query, then stop, this isn't our query. - if (cookie != mat_dxlevel) - { - return; - } - - // Reset dxLevel. - dxLevel[client] = 0; - - // If result is any other than ConVarQuery_Okay, then stop. - if (result != ConVarQuery_Okay) - { - return; - } - - // Copy cvar value to dxLevel array. - dxLevel[client] = StringToInt(cvarValue); -} - /** * Convert a round_end reason, to a round winner, or draw. * @@ -397,34 +334,6 @@ RoundEndBalanceTeams() CloseHandle(arrayEligibleClients); } -/** - * Displays overlay to client, or prints unsupported message on client's screen. - * - * @param client The client index. - * @param overlay The overlay path. - */ -RoundEndDisplayClientOverlay(client, const String:overlay[]) -{ - // If dxLevel is 0, then query on client failed, so try again, then stop. - if (!dxLevel[client]) - { - // Query dxlevel cvar. - RoundEndGetClientDXLevel(client); - return; - } - - // If dxLevel is above or equal to minimum requirement, then display overlay. - if (dxLevel[client] >= GENERAL_DXLEVEL_MIN) - { - ClientCommand(client, "r_screenoverlay \"%s\"", overlay); - } - // If client doesn't meet minimum requirement, then print unsupported text. - else - { - ZR_PrintCenterText(client, "DX90 not supported", dxLevel[client], GENERAL_DXLEVEL_MIN); - } -} - /** * Displays overlays to clients, depending on the outcome. * @@ -470,7 +379,14 @@ RoundEndOverlayStart(Float:time, RoundEndOutcome:outcome) continue; } - RoundEndDisplayClientOverlay(x, overlaypath); + // If client is fake (or bot), then stop. + if (IsFakeClient(x)) + { + continue; + } + + OverlaysClientSetChannelPath(x, OVERLAYS_CHANNEL_ROUNDEND, overlaypath); + OverlaysClientSetChannelState(x, OVERLAYS_CHANNEL_ROUNDEND, true, false, true); } CreateTimer(time, RoundEndOverlayTimer, _, TIMER_FLAG_NO_MAPCHANGE); @@ -487,8 +403,14 @@ RoundEndOverlayStop() continue; } - // Removes overlay from client's screen. - ClientCommand(x, "r_screenoverlay \"\""); + // If client is fake (or bot), then stop. + if (IsFakeClient(x)) + { + continue; + } + + // Disable roundend overlay channel. + OverlaysClientSetChannelState(x, OVERLAYS_CHANNEL_ROUNDEND, true, false, false, true); } } diff --git a/src/zr/translation.inc b/src/zr/translation.inc index a457e90..6d4531b 100644 --- a/src/zr/translation.inc +++ b/src/zr/translation.inc @@ -12,7 +12,7 @@ FormatTextString(String:text[], maxlen) { - Format(text, maxlen, "@green[%t] @default%s", "ZR", text); + Format(text, maxlen, "@green[ZR] @default%s", text); ReplaceString(text, maxlen, "@default","\x01"); ReplaceString(text, maxlen, "@lgreen","\x03"); @@ -92,7 +92,7 @@ stock ZR_PrintToServer(any:...) decl String:buffer[192]; VFormat(phrase, sizeof(phrase), "%t", 1); - Format(buffer, sizeof(buffer), "[%t] %s", "ZR", phrase); + Format(buffer, sizeof(buffer), "[ZR] %s", phrase); PrintToServer(buffer); } diff --git a/src/zr/weapons/restrict.inc b/src/zr/weapons/restrict.inc index 96949d9..6fe7deb 100644 --- a/src/zr/weapons/restrict.inc +++ b/src/zr/weapons/restrict.inc @@ -24,7 +24,7 @@ new Handle:gRestrictedWeapons = INVALID_HANDLE; /** * Array that stores the "HookID" to be later unhooked on player disconnect. */ -new gCanUseHookID[MAXPLAYERS + 1]; +new g_iCanUseHookID[MAXPLAYERS + 1] = {-1, ...}; /** * Query results returned when (un)restricting a weapon. @@ -52,6 +52,16 @@ RestrictInit() RegConsoleCmd("rebuy", RestrictBuyCommand); } +/** + * Hook commands related to restrict here. + */ +RestrictOnCommandsCreate() +{ + // Create admin commands. + RegAdminCmd("zr_restrict", RestrictRestrictCommand, ADMFLAG_GENERIC, "zr_restrict - Restrict a weapon."); + RegAdminCmd("zr_unrestrict", RestrictUnrestrictCommand, ADMFLAG_GENERIC, "zr_unrestrict - Unrestrict a weapon."); +} + /** * Clears weapon restrict data. */ @@ -209,7 +219,7 @@ RestrictWeaponUnrestrictAll() RestrictClientInit(client) { // Hook "Weapon_CanUse" on client. - gCanUseHookID[client] = ZRTools_HookWeapon_CanUse(client, RestrictCanUse); + g_iCanUseHookID[client] = ZRTools_HookWeapon_CanUse(client, RestrictCanUse); } /** @@ -219,8 +229,13 @@ RestrictClientInit(client) */ RestrictOnClientDisconnect(client) { - // Unhook "Weapon_CanUse" on client. - ZRTools_UnhookWeapon_CanUse(gCanUseHookID[client]); + // Unhook "Weapon_CanUse" callback, and reset variable. + + if (g_iCanUseHookID[client] != -1) + { + ZRTools_UnhookWeapon_CanUse(g_iCanUseHookID[client]); + g_iCanUseHookID[client] = -1; + } } /** @@ -231,8 +246,8 @@ RestrictOnClientDisconnect(client) RestrictOnClientSpawn(client) { // Re-hook "canuse" on client. - ZRTools_UnhookWeapon_CanUse(gCanUseHookID[client]); - gCanUseHookID[client] = ZRTools_HookWeapon_CanUse(client, RestrictCanUse); + ZRTools_UnhookWeapon_CanUse(g_iCanUseHookID[client]); + g_iCanUseHookID[client] = ZRTools_HookWeapon_CanUse(client, RestrictCanUse); } /** @@ -902,4 +917,88 @@ public ZRTools_Action:RestrictCanUse(client, weapon) // Allow pickup. return ZRTools_Continue; +} + +/** + * Command callback (zr_restrict) + * Restricts a weapon or group + * + * @param client The client index. + * @param argc Argument count. + */ +public Action:RestrictRestrictCommand(client, argc) +{ + // If weapons module is disabled, then stop. + new bool:weapons = GetConVarBool(g_hCvarsList[CVAR_WEAPONS]); + if (!weapons) + { + // Tell client command is disabled. + ZR_ReplyToCommand(client, "Feature is disabled"); + return Plugin_Handled; + } + + // If restrict module is disabled, then stop. + new bool:restrict = GetConVarBool(g_hCvarsList[CVAR_WEAPONS_RESTRICT]); + if (!restrict) + { + // Tell client command is disabled. + ZR_ReplyToCommand(client, "Feature is disabled"); + return Plugin_Handled; + } + + // arg1 = weapon being restricted + decl String:arg1[32]; + GetCmdArg(1, arg1, sizeof(arg1)); + + // Strip "weapon_" from entity name + ReplaceString(arg1, sizeof(arg1), "weapon_", ""); + + decl String:display[WEAPONS_MAX_LENGTH]; + + new WpnRestrictQuery:output = RestrictRestrict(arg1, display); + RestrictPrintRestrictOutput(client, output, display, true); + + return Plugin_Handled; +} + +/** + * Command callback (zr_unrestrict) + * Unrestricts a weapon or group + * + * @param client The client index. + * @param argc Argument count. + */ +public Action:RestrictUnrestrictCommand(client, argc) +{ + // If weapons module is disabled, then stop. + new bool:weapons = GetConVarBool(g_hCvarsList[CVAR_WEAPONS]); + if (!weapons) + { + // Tell client command is disabled. + ZR_ReplyToCommand(client, "Feature is disabled"); + return Plugin_Handled; + } + + // If restrict module is disabled, then stop. + new bool:restrict = GetConVarBool(g_hCvarsList[CVAR_WEAPONS_RESTRICT]); + if (!restrict) + { + // Tell client command is disabled. + ZR_ReplyToCommand(client, "Feature is disabled"); + return Plugin_Handled; + } + + // arg1 = weapon being restricted + decl String:arg1[32]; + GetCmdArg(1, arg1, sizeof(arg1)); + + // Strip "weapon_" from entity name + ReplaceString(arg1, sizeof(arg1), "weapon_", ""); + + decl String:display[WEAPONS_MAX_LENGTH]; + + new WpnRestrictQuery:output = RestrictUnrestrict(arg1, display); + RestrictPrintUnrestrictOutput(client, output, display, true); + + return Plugin_Handled; } \ No newline at end of file diff --git a/src/zr/weapons/weapons.inc b/src/zr/weapons/weapons.inc index d0cdd6e..3aad2c6 100644 --- a/src/zr/weapons/weapons.inc +++ b/src/zr/weapons/weapons.inc @@ -129,6 +129,12 @@ WeaponsValidateConfig() } } +WeaponsOnCommandsCreate() +{ + // Forward event to sub-modules. + RestrictOnCommandsCreate(); +} + /** * Client is joining the server. * diff --git a/src/zr/zhp.inc b/src/zr/zhp.inc index 46001ab..ebffd8c 100644 --- a/src/zr/zhp.inc +++ b/src/zr/zhp.inc @@ -72,7 +72,7 @@ ZHPOnClientDeath(client) } /** - * Player has been infected. + * Client has been infected. * * @param client The client index. */ diff --git a/src/zr/zombie.inc b/src/zr/zombie.inc index d6ad7de..dba9d8b 100644 --- a/src/zr/zombie.inc +++ b/src/zr/zombie.inc @@ -1,42 +1,3 @@ -/** - * ==================== - * Zombie:Reloaded - * File: zombie.inc - * Author: Greyscale - * ==================== - */ - -HookCommands() -{ - RegConsoleCmd("nightvision", Command_NightVision); -} - -public Action:Command_NightVision(client, argc) -{ - new bool:allow_disable = GetConVarBool(g_hCvarsList[CVAR_ZVISION_ALLOW_DISABLE]); - if (!allow_disable) - { - return; - } - - bClientOverlayOn[client] = !bClientOverlayOn[client]; - - decl String:overlay[PLATFORM_MAX_PATH]; - ClassGetOverlayPath(client, overlay, sizeof(overlay)); - - if (strlen(overlay) > 0) - { - if (bClientOverlayOn[client]) - { - ClassOverlayInitialize(client, overlay); - } - else - { - ClassOverlayStop(client); - } - } -} - RemoveObjectives() { decl String:classname[64]; diff --git a/src/zr/zombiereloaded.inc b/src/zr/zombiereloaded.inc index f4dca48..18aacb0 100644 --- a/src/zr/zombiereloaded.inc +++ b/src/zr/zombiereloaded.inc @@ -10,11 +10,6 @@ * ============================================================================ */ -/** - * Minimum dx level required to see overlays. - */ -#define GENERAL_DXLEVEL_MIN 90 - /** * @section Conversion factors. */ @@ -24,11 +19,6 @@ * @endsection */ -/** - * The DirectX level of a client. - */ -new dxLevel[MAXPLAYERS + 1]; - /** * Global variable set to true when the first zombie(s) is/are spawned. */ From 055e89d64accfa565fcaff6fd4e8d36b8b4c5734 Mon Sep 17 00:00:00 2001 From: Greyscale Date: Thu, 14 May 2009 09:32:01 +0200 Subject: [PATCH 2/4] Began adding cvar descriptions, recoded logging module, fixed zmenu display bug, removed include line for anticamp until recoded. --- .../translations/zombiereloaded.phrases.txt | 13 + src/zombiereloaded.sp | 35 +- src/zr/anticamp.inc | 2 +- src/zr/config.inc | 14 +- src/zr/cvars.inc | 76 ++-- src/zr/damage.inc | 17 +- src/zr/event.inc | 5 +- src/zr/hitgroups.inc | 15 +- src/zr/infect.inc | 4 +- src/zr/log.inc | 232 +++------- src/zr/models.inc | 46 +- src/zr/overlays.inc | 2 +- src/zr/playerclasses/classcommands.inc | 14 +- src/zr/playerclasses/classevents.inc | 4 +- src/zr/playerclasses/clientoverlays.inc | 4 +- src/zr/playerclasses/filtertools.inc | 14 +- src/zr/playerclasses/playerclasses.inc | 42 +- src/zr/soundeffects/ambientsounds.inc | 19 +- src/zr/spawnprotect.inc | 8 +- src/zr/tools.inc | 28 +- src/zr/translation.inc | 426 +++++++++++++----- src/zr/weapons/markethandler.inc | 21 +- src/zr/weapons/restrict.inc | 91 ++-- src/zr/weapons/weapons.inc | 13 +- src/zr/zadmin.inc | 186 +------- src/zr/zhp.inc | 8 +- src/zr/zombiereloaded.inc | 30 +- src/zr/zspawn.inc | 10 +- src/zr/ztele.inc | 20 +- 29 files changed, 588 insertions(+), 811 deletions(-) diff --git a/cstrike/addons/sourcemod/translations/zombiereloaded.phrases.txt b/cstrike/addons/sourcemod/translations/zombiereloaded.phrases.txt index 48803bf..8f49323 100644 --- a/cstrike/addons/sourcemod/translations/zombiereloaded.phrases.txt +++ b/cstrike/addons/sourcemod/translations/zombiereloaded.phrases.txt @@ -22,6 +22,13 @@ // General + "Literal text" + { + "#format" "{1:s}" + "en" "{1}" + } + // Set string to "{1}" for all languages. + "Feature is disabled" { "en" "This feature is currently disabled by the server host." @@ -173,31 +180,37 @@ "Menu main zadmin" { + "#format" "{1:s}" "en" "ZAdmin ({1}) - Open admin menu." } "Menu main zclass" { + "#format" "{1:s}" "en" "ZClass ({1}) - Configure your class settings." } "Menu main zspawn" { + "#format" "{1:s}" "en" "ZSpawn ({1}) - Join late? Use this to spawn." } "Menu main ztele" { + "#format" "{1:s}" "en" "ZTele ({1}) - Teleport back to your spawn location." } "Menu main zhp" { + "#format" "{1:s}" "en" "ZHP ({1}) - Toggle real HP display when infected." } "Menu main zmarket" { + "#format" "{1:s}" "en" "ZMarket ({1}) - Need a weapon? Buy them here." } diff --git a/src/zombiereloaded.sp b/src/zombiereloaded.sp index e630811..fb16fd5 100644 --- a/src/zombiereloaded.sp +++ b/src/zombiereloaded.sp @@ -23,11 +23,11 @@ // Core includes. #include "zr/zombiereloaded" -#include "zr/log" +#include "zr/translation" #include "zr/cvars" +#include "zr/log" #include "zr/config" #include "zr/serial" -#include "zr/translation" #include "zr/sayhooks" #include "zr/tools" #include "zr/models" @@ -57,7 +57,7 @@ #include "zr/ztele" #include "zr/zhp" #include "zr/jumpboost" -#include "zr/anticamp" +//#include "zr/anticamp" // Almost replaced! :) #include "zr/zombie" @@ -95,36 +95,15 @@ public bool:AskPluginLoad(Handle:myself, bool:late, String:error[], err_max) */ public OnPluginStart() { - // Load translations phrases used by plugin. - LoadTranslations("common.phrases.txt"); - LoadTranslations("zombiereloaded.phrases.txt"); - - // Log - LogInit(); - - // Cvars + // Forward event to modules. + TranslationInit(); CvarsInit(); - - // Tools ToolsInit(); - - // Commands CommandsInit(); - - // Weapons WeaponsInit(); - - // Say Hooks SayHooksInit(); - - // Event EventInit(); - - // Set market variable to true if market is installed. - g_bMarket = LibraryExists("market"); - - // Create public cvar for tracking. - CreateConVar("gs_zombiereloaded_version", VERSION, "[ZR] Current version of this plugin", FCVAR_PLUGIN|FCVAR_SPONLY|FCVAR_UNLOGGED|FCVAR_DONTRECORD|FCVAR_REPLICATED|FCVAR_NOTIFY); + MarketInit(); } /** @@ -168,7 +147,6 @@ public OnMapStart() SEffectsOnMapStart(); AntiStickOnMapStart(); ZSpawnOnMapStart(); - Anticamp_Startup(); } /** @@ -177,7 +155,6 @@ public OnMapStart() public OnMapEnd() { // Forward event to modules. - Anticamp_Disable(); } /** diff --git a/src/zr/anticamp.inc b/src/zr/anticamp.inc index 0c02fa5..a126164 100644 --- a/src/zr/anticamp.inc +++ b/src/zr/anticamp.inc @@ -352,7 +352,7 @@ HurtPlayersInVolume(volume_index) { if (IsPlayerInVolume(x, volume_index)) { - ZR_PrintToChat(x, "Unfair camping"); + TranslationPrintToChat(x, "Unfair camping"); client_health = GetClientHealth(x) - volumes[volume_index][volume_damage]; if (client_health > 0) { diff --git a/src/zr/config.inc b/src/zr/config.inc index bdc7c4b..e89ab0a 100644 --- a/src/zr/config.inc +++ b/src/zr/config.inc @@ -89,10 +89,7 @@ ConfigLoad() ServerCommand("exec %s", mapconfig); // Log action. - if (LogCheckFlag(LOG_CORE_EVENTS)) - { - LogMessageFormatted(-1, "", "", "Executed map config file: %s.", LOG_FORMAT_TYPE_SIMPLE, mapconfig); - } + LogPrintToLog(LOG_FORMAT_TYPE_NORMAL, "Config", "Map Configs", "Executed map config file: %s", path); } /** @@ -106,7 +103,6 @@ ConfigOnModulesLoaded() decl String:mapname[256]; decl String:mapconfig[PLATFORM_MAX_PATH]; decl String:path[PLATFORM_MAX_PATH]; - new bool:cfgexists; // Get map name and format into config path. GetCurrentMap(mapname, sizeof(mapname)); @@ -120,7 +116,7 @@ ConfigOnModulesLoaded() // boolean first works. // Check if the file exist. - cfgexists = FileExists(path); + new bool:cfgexists = FileExists(path); if (!cfgexists) { // File doesn't exist, then stop. @@ -131,10 +127,7 @@ ConfigOnModulesLoaded() ServerCommand("exec %s", mapconfig); // Log action. - if (LogCheckFlag(LOG_CORE_EVENTS)) - { - LogMessageFormatted(-1, "", "", "Executed post map config file: %s.", LOG_FORMAT_TYPE_SIMPLE, mapconfig); - } + LogPrintToLog(LOG_FORMAT_TYPE_NORMAL, "Config", "Map Configs", "Executed post map config file: %s", path); } /** @@ -155,7 +148,6 @@ bool:ConfigGetFilePath(CvarsList:cvar, String:path[]) return FileExists(path); } - /** * Creates, deletes, sets, or gets any key/setting of any ZR config keyvalue file in memory. * Only use when interacting with a command or manipulating single keys/values, diff --git a/src/zr/cvars.inc b/src/zr/cvars.inc index 3d190aa..ff8a184 100644 --- a/src/zr/cvars.inc +++ b/src/zr/cvars.inc @@ -25,6 +25,15 @@ enum CvarsList { Handle:CVAR_ENABLE, + Handle:CVAR_LOG, + Handle:CVAR_LOG_LOAD, + Handle:CVAR_LOG_CORE, + Handle:CVAR_LOG_FILTER_MODULES, + Handle:CVAR_LOG_FILTER_DESCRIPTION, + Handle:CVAR_LOG_FILTER_DEBUG, + Handle:CVAR_LOG_PRINT_ADMINS, + Handle:CVAR_LOG_PRINT_CHAT, + Handle:CVAR_LOG_PRINT_CONSOLE, Handle:CVAR_CONFIG_PATH_MODELS, Handle:CVAR_CONFIG_PATH_DOWNLOADS, Handle:CVAR_CONFIG_PATH_PLAYERCLASSES, @@ -157,6 +166,11 @@ CvarsInit() // Hook cvars. CvarsHook(); + // Create public cvar for tracking. + decl String:description[64]; + Format(description, sizeof(description), "%s Current version of this plugin", TRANSLATION_PHRASE_PREFIX); + CreateConVar("gs_zombiereloaded_version", VERSION, description, FCVAR_PLUGIN|FCVAR_SPONLY|FCVAR_UNLOGGED|FCVAR_DONTRECORD|FCVAR_REPLICATED|FCVAR_NOTIFY); + // Forward event to modules. VEffectsOnCvarInit(); } @@ -191,7 +205,13 @@ CvarsCreate() // Log (core) // =========================== - // Cvars created in log.inc, because of compilation problems when creating them here. + g_hCvarsList[CVAR_LOG] = CreateConVar("zr_log", "1", "Logs key actions performed by the plugin, including errors and debug."); + g_hCvarsList[CVAR_LOG_FILTER_MODULES] = CreateConVar("zr_log_filter_modules", "", "If any log module name is withinin this string, log will be suppressed."); + g_hCvarsList[CVAR_LOG_FILTER_DESCRIPTION] = CreateConVar("zr_log_filter_description", "", "If any log description is within this string, log will be suppressed."); + g_hCvarsList[CVAR_LOG_FILTER_DEBUG] = CreateConVar("zr_log_filter_debug", "1", "Supresses debug messages."); + g_hCvarsList[CVAR_LOG_PRINT_ADMINS] = CreateConVar("zr_log_print_admins", "0", "Print all logs to currently connected admins."); + g_hCvarsList[CVAR_LOG_PRINT_CHAT] = CreateConVar("zr_log_print_chat", "1", "Print log to admin's chat area."); + g_hCvarsList[CVAR_LOG_PRINT_CONSOLE] = CreateConVar("zr_log_print_console", "1", "Print log to admin's console."); // =========================== // Translations (core) @@ -203,12 +223,12 @@ CvarsCreate() // Config (core) // =========================== - g_hCvarsList[CVAR_CONFIG_PATH_MODELS] = CreateConVar("zr_config_path_models", "configs/zr/models.txt", ""); - g_hCvarsList[CVAR_CONFIG_PATH_DOWNLOADS] = CreateConVar("zr_config_path_downloads", "configs/zr/downloads.txt"); - g_hCvarsList[CVAR_CONFIG_PATH_PLAYERCLASSES] = CreateConVar("zr_config_path_playerclasses", "configs/zr/playerclasses.txt"); - g_hCvarsList[CVAR_CONFIG_PATH_WEAPONS] = CreateConVar("zr_config_path_weapons", "configs/zr/weapons/weapons.txt"); - g_hCvarsList[CVAR_CONFIG_PATH_WEAPONGROUPS] = CreateConVar("zr_config_path_weapongroups", "configs/zr/weapons/weapongroups.txt"); - g_hCvarsList[CVAR_CONFIG_PATH_HITGROUPS] = CreateConVar("zr_config_path_hitgroups", "configs/zr/hitgroups.txt"); + g_hCvarsList[CVAR_CONFIG_PATH_MODELS] = CreateConVar("zr_config_path_models", "configs/zr/models.txt", "Path to models config file. [Relative to root sourcemod directory]"); + g_hCvarsList[CVAR_CONFIG_PATH_DOWNLOADS] = CreateConVar("zr_config_path_downloads", "configs/zr/downloads.txt", "Path to downloads file. [Relative to root sourcemod directory]"); + g_hCvarsList[CVAR_CONFIG_PATH_PLAYERCLASSES] = CreateConVar("zr_config_path_playerclasses", "configs/zr/playerclasses.txt", "Path to playerclasses config file. [Relative to root sourcemod directory]"); + g_hCvarsList[CVAR_CONFIG_PATH_WEAPONS] = CreateConVar("zr_config_path_weapons", "configs/zr/weapons/weapons.txt", "Path to weapons config file. [Relative to root sourcemod directory]"); + g_hCvarsList[CVAR_CONFIG_PATH_WEAPONGROUPS] = CreateConVar("zr_config_path_weapongroups", "configs/zr/weapons/weapongroups.txt", "Path to weapongroups config file. [Relative to root sourcemod directory]"); + g_hCvarsList[CVAR_CONFIG_PATH_HITGROUPS] = CreateConVar("zr_config_path_hitgroups", "configs/zr/hitgroups.txt", "Path to hitgroups config file. [Relative to root sourcemod directory]"); // =========================== // Tools (core) @@ -228,24 +248,17 @@ CvarsCreate() // General - g_hCvarsList[CVAR_CLASSES_SPAWN] = CreateConVar("zr_classes_spawn", "0", ""); - // Old Desc: Classmenu is re-displayed every spawn (0: Disable) - g_hCvarsList[CVAR_CLASSES_RANDOM] = CreateConVar("zr_classes_random", "0", ""); - // Old Desc: A random class is assigned to each player every round. Overrides zr_classes_spawn and default classes. (0: Disable) - g_hCvarsList[CVAR_CLASSES_DEFAULT_ZOMBIE] = CreateConVar("zr_classes_default_zombie", "random", ""); - // Old Desc: Default zombie class selected for all players when they connect. Use \"random\" to select a random class, or blank to use class config defaults. - g_hCvarsList[CVAR_CLASSES_DEFAULT_HUMAN] = CreateConVar("zr_classes_default_human", "random", ""); - // Old Desc: - g_hCvarsList[CVAR_CLASSES_DEFAULT_ADMIN] = CreateConVar("zr_classes_default_admin", "random", ""); - // Old Desc: Default admin-only class selected for admins when they connect. Use \"random\" to select a random class, or blank to use class config defaults. + g_hCvarsList[CVAR_CLASSES_SPAWN] = CreateConVar("zr_classes_spawn", "0", "Re-display class selection menu every spawn."); + g_hCvarsList[CVAR_CLASSES_RANDOM] = CreateConVar("zr_classes_random", "0", "Player is assigned a random class every spawn [Override: zr_classes_spawn & zr_classes_default_*]"); + g_hCvarsList[CVAR_CLASSES_DEFAULT_ZOMBIE] = CreateConVar("zr_classes_default_zombie", "random", "Zombie class assigned to players on connect ['random' = Random class | '""' = Class config default]"); + g_hCvarsList[CVAR_CLASSES_DEFAULT_HUMAN] = CreateConVar("zr_classes_default_human", "random", "Human class assigned to players on connect ['random' = Random class | '""' = Class config default]");"); + g_hCvarsList[CVAR_CLASSES_DEFAULT_ADMIN] = CreateConVar("zr_classes_default_admin", "random", "Admin class assigned to admins on connect ['random' = Random class | '""' = Class config default]");"); // Overlays - g_hCvarsList[CVAR_CLASSES_OVERLAY_TOGGLE] = CreateConVar("zr_classes_overlay_toggle", "1", ""); - // Desc: Allow clients to toggle class overlay, zr_classes_overlay_default will be applied on connect. - g_hCvarsList[CVAR_CLASSES_OVERLAY_TOGGLECMDS] = CreateConVar("zr_classes_overlay_togglecmds", "nightvision", ""); - g_hCvarsList[CVAR_CLASSES_OVERLAY_DEFAULT] = CreateConVar("zr_classes_overlay_default", "0", ""); - // Desc: Default toggle value of class overlay. [Ignored when zr_classes_overlay_toggle is disabled.] + g_hCvarsList[CVAR_CLASSES_OVERLAY_TOGGLE] = CreateConVar("zr_classes_overlay_toggle", "1", "Allow players to toggle class overlay."); + g_hCvarsList[CVAR_CLASSES_OVERLAY_TOGGLECMDS] = CreateConVar("zr_classes_overlay_togglecmds", "nightvision", "List of commands to hook that players can use to toggle class overlay. [Reliance: zr_classes_overlay_toggle | Delimited by \", \"]"); + g_hCvarsList[CVAR_CLASSES_OVERLAY_DEFAULT] = CreateConVar("zr_classes_overlay_default", "0", "Default class overlay toggle state [Reliance: zr_classes_overlay_toggle]"); // =========================== // Weapons (core) @@ -537,10 +550,6 @@ CvarsHook(bool:unhook = false) HookConVarChange(g_hAutoTeamBalance, CvarsHookLocked); HookConVarChange(g_hLimitTeams, CvarsHookLocked); HookConVarChange(g_hRestartGame, CvarsHookRestartGame); - - // Anticamp shtuff. (needs to be moved to anticamp if these hooks are necessary) - HookConVarChange(g_hCvarsList[CVAR_ANTICAMP], AnticampHook); - HookConVarChange(g_hCvarsList[CVAR_ANTICAMP_UPDATE_INTERVAL], UpdateIntervalHook); } /** @@ -566,10 +575,7 @@ public CvarsHookLocked(Handle:cvar, const String:oldvalue[], const String:newval SetConVarInt(g_hAutoTeamBalance, CVARS_AUTOTEAMBALANCE_LOCKED); // If log flag check fails, then don't log. - if (LogCheckFlag(LOG_CORE_EVENTS, LOG_MODULE_CORE)) - { - LogMessageFormatted(-1, "Cvars", "Cvar Locked", "Cvar \"mp_autoteambalance\" was reverted back to \"CVARS_AUTOTEAMBALANCE_LOCKED\".", LOG_FORMAT_TYPE_FULL); - } + LogPrintToLog(_, "Cvars", "Cvar Locked", "Cvar \"mp_autoteambalance\" was reverted back to \"CVARS_AUTOTEAMBALANCE_LOCKED\"."); } // If cvar is mp_limitteams, then continue. else if (cvar == g_hLimitTeams) @@ -584,10 +590,7 @@ public CvarsHookLocked(Handle:cvar, const String:oldvalue[], const String:newval SetConVarInt(g_hLimitTeams, CVARS_LIMITTEAMS_LOCKED); // If log flag check fails, then don't log. - if (LogCheckFlag(LOG_CORE_EVENTS, LOG_MODULE_CORE)) - { - LogMessageFormatted(-1, "Cvars", "Cvar Locked", "Cvar \"mp_limitteams\" was reverted back to \"CVARS_LIMITTEAMS_LOCKED\".", LOG_FORMAT_TYPE_FULL); - } + LogPrintToLog(_, "Cvars", "Cvar Locked", "Cvar \"mp_limitteams\" was reverted back to \"CVARS_LIMITTEAMS_LOCKED\"."); } } @@ -615,8 +618,5 @@ public CvarsHookRestartGame(Handle:cvar, const String:oldvalue[], const String:n RoundEndTerminateRound(delay); // If log flag check fails, then don't log. - if (LogCheckFlag(LOG_CORE_EVENTS, LOG_MODULE_CORE)) - { - LogMessageFormatted(-1, "Cvars", "Restart Game", "\"mp_restartgame\" was caught and blocked, commencing round.", LOG_FORMAT_TYPE_FULL); - } + LogPrintToLog(_, "Cvars", "Restart Game", "\"mp_restartgame\" was caught and blocked, commencing round."); } diff --git a/src/zr/damage.inc b/src/zr/damage.inc index 79b716e..3ffdff7 100644 --- a/src/zr/damage.inc +++ b/src/zr/damage.inc @@ -275,14 +275,6 @@ public ZRTools_Action:DamageOnTakeDamage(client, inflictor, attacker, Float:dama */ public Action:DamageSuicideIntercept(client, argc) { - // Disabled. - /** - new bool:enabled = GetConVarBool(g_hCvarsList[CVAR_ENABLE]); - if (!enabled) - { - return Plugin_Continue; - }*/ - // If zombie hasn't spawned, then stop. if (!g_bZombieSpawned) { @@ -318,13 +310,10 @@ public Action:DamageSuicideIntercept(client, argc) } // Tell client their command has been intercepted. - ZR_ReplyToCommand(client, "Damage suicide intercept"); + TranslationReplyToCommand(client, "Damage suicide intercept"); - // Log attempt. - if (LogCheckFlag(LOG_GAME_EVENTS, LOG_MODULE_DAMAGE)) - { - LogMessageFormatted(client, "Damage", "Suicide Intercept", "Player %N attempted suicide.", LOG_FORMAT_TYPE_FULL, client); - } + // Log suicide interception + LogPrintToLog(LOG_FORMAT_TYPE_NORMAL, "Damage", "Suicide Intercept", "\"%L\" attempted suicide.", client); // Block command. return Plugin_Handled; diff --git a/src/zr/event.inc b/src/zr/event.inc index ca8d4ec..c34ee50 100644 --- a/src/zr/event.inc +++ b/src/zr/event.inc @@ -66,7 +66,8 @@ EventHook(bool:unhook = false) */ public Action:EventRoundStart(Handle:event, const String:name[], bool:dontBroadcast) { - ZR_PrintToChat(0, "General round objective"); + // Print round objective to all clients. + TranslationPrintToChatAll(true, false, "General round objective"); // Forward event to sub-modules. OverlaysOnRoundStart(); @@ -183,7 +184,7 @@ public Action:EventPlayerSpawn(Handle:event, const String:name[], bool:dontBroad ZTeleOnClientSpawn(index); ZHPOnClientSpawn(index); - ZR_PrintToChat(index, "General zmenu reminder"); + TranslationPrintToChat(index, "General zmenu reminder"); } /** diff --git a/src/zr/hitgroups.inc b/src/zr/hitgroups.inc index f9e43a7..8fe4ef3 100644 --- a/src/zr/hitgroups.inc +++ b/src/zr/hitgroups.inc @@ -69,11 +69,7 @@ HitgroupsLoad() if (!exists) { // Log failure. - if (LogCheckFlag(LOG_CORE_EVENTS, LOG_MODULE_HITGROUPS)) - { - LogMessageFormatted(-1, "Hitgroups", "Config Validation", "Missing hitgroups config file: %s", LOG_FORMAT_TYPE_ERROR, pathhitgroups); - } - + LogPrintToLog(LOG_FORMAT_TYPE_ERROR, "Hitgroups", "Config Validation", "Missing hitgroups config file: %s", pathhitgroups); return; } @@ -89,16 +85,11 @@ HitgroupsLoad() */ HitgroupsValidateConfig() { - // If log flag check fails, then don't log. - if (!LogCheckFlag(LOG_CORE_EVENTS, LOG_MODULE_HITGROUPS)) - { - return; - } - KvRewind(kvHitgroups); if (!KvGotoFirstSubKey(kvHitgroups)) { - LogMessageFormatted(-1, "Hitgroups", "Config Validation", "No hitgroups listed in hitgroups.txt, disabling hitgroup-based modules.", LOG_FORMAT_TYPE_FULL); + // Log that no data was loaded from hitgroup file. + LogPrintToLog(LOG_FORMAT_TYPE_NORMAL, "Hitgroups", "Config Validation", "No hitgroups listed in hitgroups.txt, disabling hitgroup-based modules."); } } diff --git a/src/zr/infect.inc b/src/zr/infect.inc index a45d0d8..f62002e 100644 --- a/src/zr/infect.inc +++ b/src/zr/infect.inc @@ -180,7 +180,7 @@ InfectOnClientDisconnect(client) InfectClient(randclient); // Tell client they have been randomly been chosen to replace disconnecting zombie. - ZR_PrintToChat(randclient, "Infect disconnect"); + TranslationPrintToChat(randclient, "Infect disconnect"); // Destroy handle. CloseHandle(arrayEligibleClients); @@ -569,7 +569,7 @@ InfectClient(client, attacker = -1, bool:motherinfect = false) SetGlobalTransTarget(client); // Print message to client. - ZR_PrintToChat(client, "Infect infected"); + TranslationPrintToChat(client, "Infect infected"); // Forward event to modules. ClassOnClientInfected(client, motherinfect); diff --git a/src/zr/log.inc b/src/zr/log.inc index 193a068..9864c0f 100644 --- a/src/zr/log.inc +++ b/src/zr/log.inc @@ -22,225 +22,101 @@ /** * @section Log format types */ -#define LOG_FORMAT_TYPE_SIMPLE 0 /** Simple log message. */ -#define LOG_FORMAT_TYPE_FULL 1 /** Full log message, printed in normal log. */ -#define LOG_FORMAT_TYPE_ERROR 2 /** Full log message, printed in error log. */ -#define LOG_FORMAT_TYPE_FATALERROR 3 /** Full log message, stops the plugin and printed in error logs. */ +#define LOG_FORMAT_TYPE_NORMAL 1 /** Printed in normal log. */ +#define LOG_FORMAT_TYPE_DEBUG 2 /** Printed in normal log, flagged as debug. */ +#define LOG_FORMAT_TYPE_ERROR 3 /** Printed in error log. */ +#define LOG_FORMAT_TYPE_FATALERROR 4 /** Stops the plugin + LOG_FORMAT_TYPE_ERROR */ /** * @endsection */ /** - * @section Logging flags. - */ -#define LOG_CORE_EVENTS 1 /** Config validation, other core events. */ -#define LOG_GAME_EVENTS 2 /** Admin commands, suicide prevention, anticamp kills. */ -#define LOG_PLAYER_COMMANDS 4 /** Commands executed by non-admins: zspawn, teleport, class change. */ -#define LOG_DEBUG 8 /** Debug messages. */ -#define LOG_DEBUG_DETAIL 16 /** Debug messages with more detail. May cause spam. */ -#define LOG_DEBUG_MAX_DETAIL 32 /** Low level debug messages. Causes spam! Only enable for a limited period right before and after testing. */ -#define LOG_TO_ADMINS 64 /** Copy kinds of log events to admin chat. */ -#define LOG_TO_CLIENT 128 /** Copy all log events related to a player, to the players console. */ -#define LOG_IGNORE_CONSOLE 256 /** Don't log messages from the console (client 0). */ -#define LOG_MODULES_ENABLED 512 /** Enable module based log control. Module logs overrides previous flags, including debug flags. */ -#define LOG_MODULE_CORE 1024 /** The core of the plugin (startup, loading configs, etc.). Not really a module. */ -#define LOG_MODULE_COMMANDS 2048 /** commands.inc */ -#define LOG_MODULE_CLASSES 4096 /** Class system - playerclasses/ *.inc */ -#define LOG_MODULE_ZOMBIE 8192 /** zombie.inc */ -#define LOG_MODULE_SAYTRIGGERS 16384 /** sayhooks.inc */ -#define LOG_MODULE_AMBIENTSOUNDS 32768 /** ambientsounds.inc */ -#define LOG_MODULE_OVERLAYS 65536 /** overlays.inc */ -#define LOG_MODULE_TELEPORT 131072 /** teleport.inc */ -#define LOG_MODULE_WEAPONS 262144 /** Weapons module - weapons/ *.inc */ -#define LOG_MODULE_HITGROUPS 524288 /** hitgroups.inc */ -#define LOG_MODULE_ANTICAMP 1048576 /** anticamp.inc */ -#define LOG_MODULE_DAMAGE 2097152 /** damage.inc */ -#define LOG_MODULE_OFFSETS 4194304 /** offsets.inc */ -/* - * @endsection - */ - -/** - * @section Global handles for modules cvars. - */ -new Handle:g_hLog = INVALID_HANDLE; -new Handle:g_hLogFlags = INVALID_HANDLE; -/** - * @endsection - */ - -/** - * Log module init function. - */ -LogInit() -{ - // Create modules cvars. - g_hLog = CreateConVar("zr_log", "1", ""); - g_hLogFlags = CreateConVar("zr_logflags", "331", ""); - // Old Desc: Logging flags. Log messages to sourcemod logs, server console or client console. Use zr_log_flags to see a list of flags. (0: Disable) -} - -/** - * Logs a formatted message with module and block info depending, on the type. + * Print a formatted message to logs or error logs. * - * @param client Specifies the client who triggered the event/command. Use - * -1 for core events like validation, etc. - * @param module what module the log event belongs to. - * @param block What function or code block the log is triggered from. - * @param message Log message. Formatted string. - * @param type Optional. What logging type or style to use. Options: - * LOG_FORMAT_TYPE_SIMPLE - Simple, no module or block info. - * LOG_FORMAT_TYPE_FULL - Full, with module and block info, printed in normal log. - * LOG_FORMAT_TYPE_ERROR - Full, printed in error log. - * LOG_FORMAT_TYPE_FATALERROR - Full, stops the plugin. - * @param any... Formatting parameters. + * @param type (Optional) Logging type. (See LOG_FORMAT_TYPE_* defines) + * @param module Module the log belongs to. + * @param description Short descriptive phrase to group together similar logs. + * @param text Text to print to log. + * @param ... Formatting parameters. */ -LogMessageFormatted(client, const String:module[], const String:block[], const String:message[], type = LOG_FORMAT_TYPE_FULL, any:...) +LogPrintToLog(type = LOG_FORMAT_TYPE_NORMAL, const String:module[], const String:description[], const String:text[], any:...) { // If logging is disabled, then stop. - new bool:log = GetConVarBool(g_hLog); + new bool:log = GetConVarBool(g_hCvarsList[CVAR_LOG]); if (!log) { return; } - decl String:logtext[LOG_MAX_LENGTH_FILE]; + // If module is filtered, then stop. + decl String:filtermodules[256]; + GetConVarString(g_hCvarsList[CVAR_LOG_FILTER_MODULES], filtermodules, sizeof(filtermodules)); - // If client is invalid (console), and console log events are ignored, then stop. - if (client == 0 && LogCheckFlag(LOG_IGNORE_CONSOLE)) + if (StrContains(filtermodules, module, false) > -1) { return; } - // Format log text. - VFormat(logtext, sizeof(logtext), message, 6); + // If description is filtered, then stop. + decl String:filterdescription[256]; + GetConVarString(g_hCvarsList[CVAR_LOG_FILTER_DESCRIPTION], filterdescription, sizeof(filterdescription)); + + if (StrContains(filterdescription, description, false) > -1) + { + return; + } + + // If debug is disabled, then stop. + new bool:filterdebug = GetConVarBool(g_hCvarsList[CVAR_LOG_FILTER_DEBUG]); + if (filterdebug && type == LOG_FORMAT_TYPE_DEBUG) + { + return; + } + + // Format extra parameters into the log buffer. + decl String:logbuffer[LOG_MAX_LENGTH_FILE]; + VFormat(logbuffer, sizeof(logbuffer), text, 5); + + // Format + Format(logbuffer, sizeof(logbuffer), "[%s]|[%s]: %s", module, description, logbuffer); // Format other parameters onto the log text. switch (type) { - // Log type is simple. - case LOG_FORMAT_TYPE_SIMPLE: + // Log type is normal. + case LOG_FORMAT_TYPE_NORMAL: { - LogMessage(logtext); - } - // Log type is full. - case LOG_FORMAT_TYPE_FULL: - { - Format(logtext, sizeof(logtext), "\"%s\" : \"%s\" -- %s", module, block, logtext); - LogMessage(logtext); + LogMessage(logbuffer); } // Log type is error. case LOG_FORMAT_TYPE_ERROR: { - Format(logtext, sizeof(logtext), "\"%s\" : \"%s\" -- %s", module, block, logtext); - LogError(logtext); + LogError(logbuffer); } + // Log type is fatal error. case LOG_FORMAT_TYPE_FATALERROR: { - Format(logtext, sizeof(logtext), "\"%s\" : \"%s\" -- %s", module, block, logtext); - SetFailState(logtext); + SetFailState(logbuffer); } } - // If log to admin flag is enabled, then print to admins. - if (LogCheckFlag(LOG_TO_ADMINS)) + // If print to admin cvar is enabled, then print to all connect admins. + new bool:printadmins = GetConVarBool(g_hCvarsList[CVAR_LOG_PRINT_ADMINS]); + if (printadmins) { // Print text to admins. - LogToAdmins(logtext); - } - - // If client is a valid client (but not console), and we log to client's then continue. - if (ZRIsClientValid(client) && LogCheckFlag(LOG_TO_CLIENT)) - { - // Set client as translation target. - SetGlobalTransTarget(client); + // Note: The phrase "Literal text" is a blank phrase to pass any string we want into it. - // Print to client. - PrintToConsole(client, "[ZR] %s", logtext); - } -} - -LogToAdmins(String:message[]) -{ - decl String:buffer[LOG_MAX_LENGTH_CHAT]; - - // x = client index. - for (new x = 1; x < MaxClients; x++) - { - // If client isn't in-game, then stop. - if (!IsClientInGame(x)) + new bool:printchat = GetConVarBool(g_hCvarsList[CVAR_LOG_PRINT_CHAT]); + if (printchat) { - continue; + TranslationPrintToChatAll(false, true, "Literal text", logbuffer); } - // If client isn't an admin, then stop. - if (!ZRIsClientAdmin(x)) + new bool:printconsole = GetConVarBool(g_hCvarsList[CVAR_LOG_PRINT_CONSOLE]); + if (printconsole) { - continue; + TranslationPrintToConsoleAll(false, true, "Literal text", logbuffer); } - - // Set client as translation target. - SetGlobalTransTarget(x); - - // Format message to admin, then print. - Format(buffer, sizeof(buffer), "[ZR] %s", message); - PrintToChat(x, buffer); } } - -/** - * Checks if the zr_logflags cvar has a certain flag. - * - * @param flag The flag. - */ -bool:LogHasFlag(flag) -{ - // Get log flags. - new logflags = GetConVarInt(g_hLogFlags); - - // Return true if flag is found, false if not. - return bool:(logflags & flag); -} - -/** - * Check if a log message should be written depending on log flags. If module - * overrides are enabled only logs with it's module flag set will be logged. - * - * @param logtype Log type flag. - * @param modulefilter Specifies what module the log event belongs to. - * @return True if the event should be logged, false otherwise. - */ -bool:LogCheckFlag(logtype, modulefilter = 0) -{ - if (modulefilter && (logtype & LOG_MODULES_ENABLED)) - { - return bool:(logtype & modulefilter); - } - - return LogHasFlag(logtype); -} - -/** - * Toggles a log flag. - * - * @param flag The flag to toggle. - */ -LogToggleFlag(flag) -{ - // Get current flags - new logflags = GetConVarInt(g_hLogFlags); - - // If cvar contains flag, then remove it. - if (logflags & flag) - { - logflags = logflags - flag; - } - // If cvar doesn't have the flag, then add it. - else - { - logflags = logflags + flag; - } - - // Set new value to logflags cvar. - SetConVarInt(g_hLogFlags, logflags); -} diff --git a/src/zr/models.inc b/src/zr/models.inc index 2de1e33..fc235ee 100644 --- a/src/zr/models.inc +++ b/src/zr/models.inc @@ -40,9 +40,6 @@ ModelsLoad() */ ModelsPrepModels() { - // Initialize log boolean. - new bool:enablelog = LogCheckFlag(LOG_CORE_EVENTS, LOG_MODULE_CORE); - // Get models file path. decl String:pathmodels[PLATFORM_MAX_PATH]; new bool:exists = ConfigGetFilePath(CVAR_CONFIG_PATH_MODELS, pathmodels); @@ -51,7 +48,7 @@ ModelsPrepModels() if (!exists) { // Log failure and stop plugin. - LogMessageFormatted(-1, "Models", "Config Validation", "Fatal error: Missing models file: \"%s\"", LOG_FORMAT_TYPE_FATALERROR, pathmodels); + LogPrintToLog(LOG_FORMAT_TYPE_FATALERROR, "Models", "Config Validation", "Fatal Error: Missing models file: \"%s\"", pathmodels); } // If model array exists, then destroy it. @@ -65,7 +62,7 @@ ModelsPrepModels() // If array couldn't be created, then fail. if (arrayModelsList == INVALID_HANDLE) { - LogMessageFormatted(-1, "Models", "Config Validation", "Fatal error: Error parsing \"%s\"", LOG_FORMAT_TYPE_FATALERROR, pathmodels); + LogPrintToLog(LOG_FORMAT_TYPE_FATALERROR, "Models", "Config Validation", "Fatal Error: Error parsing \"%s\"", pathmodels); } new modelcount; @@ -155,26 +152,17 @@ ModelsPrepModels() x--; // Log missing model files. - if (enablelog) - { - LogMessageFormatted(-1, "Models", "Config Validation", "Missing model files on server (%s)", LOG_FORMAT_TYPE_ERROR, modelbase); - } + LogPrintToLog(LOG_FORMAT_TYPE_ERROR, "Models", "Config Validation", "Missing model files on server (%s)", modelbase); } } // Log model validation info. - if (enablelog) - { - LogMessageFormatted(-1, "Models", "Config Validation", "Total: %d | Successful: %d | Unsuccessful: %d", LOG_FORMAT_TYPE_FULL, modelcount, modelvalidcount, modelcount - modelvalidcount); - } + LogPrintToLog(LOG_FORMAT_TYPE_NORMAL, "Models", "Config Validation", "Total: %d | Successful: %d | Unsuccessful: %d", modelcount, modelvalidcount, modelcount - modelvalidcount); // If none of the model paths are valid, then log and fail. if (!modelvalidcount) { - if (enablelog) - { - LogMessageFormatted(-1, "Models", "Config Validation", "No usable model paths in %s", LOG_FORMAT_TYPE_FATALERROR, pathmodels); - } + LogPrintToLog(LOG_FORMAT_TYPE_FATALERROR, "Models", "Config Validation", "Fatal Error: No usable model paths in %s", pathmodels); } } @@ -183,9 +171,6 @@ ModelsPrepModels() */ ModelsPrepDownloads() { - // Initialize log boolean. - new bool:enablelog = LogCheckFlag(LOG_CORE_EVENTS, LOG_MODULE_CORE); - // Get downloads file path. decl String:pathdownloads[PLATFORM_MAX_PATH]; new bool:exists = ConfigGetFilePath(CVAR_CONFIG_PATH_DOWNLOADS, pathdownloads); @@ -194,10 +179,7 @@ ModelsPrepDownloads() if (!exists) { // Log error, then stop. - if (enablelog) - { - LogMessageFormatted(-1, "Downloads", "Config Validation", "Missing downloads file: \"%s\"", LOG_FORMAT_TYPE_ERROR, pathdownloads); - } + LogPrintToLog(LOG_FORMAT_TYPE_ERROR, "Downloads", "Config Validation", "Missing downloads file: \"%s\"", pathdownloads); return; } @@ -207,10 +189,7 @@ ModelsPrepDownloads() // If array couldn't be created, then fail. if (arrayModelsList == INVALID_HANDLE) { - if (enablelog) - { - LogMessageFormatted(-1, "Downloads", "Config Validation", "Error parsing \"%s\"", LOG_FORMAT_TYPE_ERROR, pathdownloads); - } + LogPrintToLog(LOG_FORMAT_TYPE_ERROR, "Downloads", "Config Validation", "Error parsing \"%s\"", pathdownloads); } new downloadcount; @@ -238,11 +217,7 @@ ModelsPrepDownloads() // Backtrack one index, because we deleted it out from under the loop. x--; - if (enablelog) - { - LogMessageFormatted(-1, "Downloads", "Config Validation", "Missing file \"%s\"", LOG_FORMAT_TYPE_ERROR, downloadpath); - } - + LogPrintToLog(LOG_FORMAT_TYPE_ERROR, "Downloads", "Config Validation", "Missing file \"%s\"", downloadpath); continue; } @@ -254,8 +229,5 @@ ModelsPrepDownloads() } // Log model validation info. - if (enablelog) - { - LogMessageFormatted(-1, "Downloads", "Config Validation", "Total: %d | Successful: %d | Unsuccessful: %d", LOG_FORMAT_TYPE_FULL, downloadcount, downloadvalidcount, downloadcount - downloadvalidcount); - } + LogPrintToLog(LOG_FORMAT_TYPE_NORMAL, "Downloads", "Config Validation", "Total: %d | Successful: %d | Unsuccessful: %d", downloadcount, downloadvalidcount, downloadcount - downloadvalidcount); } diff --git a/src/zr/overlays.inc b/src/zr/overlays.inc index 9df5186..477eb18 100644 --- a/src/zr/overlays.inc +++ b/src/zr/overlays.inc @@ -183,7 +183,7 @@ OverlaysClientUpdateOverlay(client, OverlaysChannel:channel = OVERLAYS_CHANNEL_N // If client doesn't meet DXLevel requirement, then tell client, then stop. if (g_iOverlaysDXL[client] < OVERLAYS_DXL_MIN) { - ZR_PrintCenterText(client, "Overlays not supported", g_iOverlaysDXL[client], OVERLAYS_DXL_MIN); + TranslationPrintCenterText(client, "Overlays not supported", g_iOverlaysDXL[client], OVERLAYS_DXL_MIN); return; } diff --git a/src/zr/playerclasses/classcommands.inc b/src/zr/playerclasses/classcommands.inc index 9048aef..11f66ec 100644 --- a/src/zr/playerclasses/classcommands.inc +++ b/src/zr/playerclasses/classcommands.inc @@ -92,10 +92,20 @@ public Action:Command_ClassDump(client, argc) // Dump the specified cache. ReplyToCommand(client, "DUMPING CACHE: \"%s\" (%d classes total)\n========================================\n", type, ClassCount); ClassDumpData(index, cachetype, buffer, sizeof(buffer)); - ZR_ReplyToCommandLong(client, buffer); + + // Print all data to client. + decl String:partbuffer[1024]; + new pos; + new cellswritten = 1; // Initialize for the loop. + + while (cellswritten) + { + cellswritten = strcopy(partbuffer, sizeof(partbuffer), buffer[pos]); + ReplyToCommand(client, partbuffer); + pos += cellswritten; + } return Plugin_Handled; - } /** diff --git a/src/zr/playerclasses/classevents.inc b/src/zr/playerclasses/classevents.inc index bc586a8..a8be2d7 100644 --- a/src/zr/playerclasses/classevents.inc +++ b/src/zr/playerclasses/classevents.inc @@ -94,12 +94,12 @@ ClassOnClientSpawn(client) // Mark zombie class as selected. ClassSelected[client][ZR_CLASS_TEAM_ZOMBIES] = randomzombie; ClassGetName(randomzombie, classname, sizeof(classname), ZR_CLASS_TEAM_ZOMBIES); - ZR_PrintToChat(client, "Classes random assignment", classname); + TranslationPrintToChat(client, "Classes random assignment", classname); // Mark human class as selected. ClassSelected[client][ZR_CLASS_TEAM_HUMANS] = randomhuman; ClassGetName(randomhuman, classname, sizeof(classname), ZR_CLASS_TEAM_HUMANS); - ZR_PrintToChat(client, "Classes random assignment", classname); + TranslationPrintToChat(client, "Classes random assignment", classname); // Update player cache with the human class data, and apply it. ClassReloadPlayerCache(client, randomhuman); diff --git a/src/zr/playerclasses/clientoverlays.inc b/src/zr/playerclasses/clientoverlays.inc index 64a30c5..9b24616 100644 --- a/src/zr/playerclasses/clientoverlays.inc +++ b/src/zr/playerclasses/clientoverlays.inc @@ -81,7 +81,7 @@ ClassOverlayOnClientSpawn(client) decl String:togglecmds[CLASSOVERLAY_TOGGLE_MAX_CMDS * CLASSOVERLAY_TOGGLE_MAX_LENGTH]; GetConVarString(g_hCvarsList[CVAR_CLASSES_OVERLAY_TOGGLECMDS], togglecmds, sizeof(togglecmds)); - ZR_HudHint(client, "Classes overlay toggle", togglecmds); + TranslationPrintHUDText(client, "Classes overlay toggle", togglecmds); } } @@ -103,7 +103,7 @@ ClassOverlayOnClientInfected(client) decl String:togglecmds[CLASSOVERLAY_TOGGLE_MAX_CMDS * CLASSOVERLAY_TOGGLE_MAX_LENGTH]; GetConVarString(g_hCvarsList[CVAR_CLASSES_OVERLAY_TOGGLECMDS], togglecmds, sizeof(togglecmds)); - ZR_PrintCenterText(client, "Classes overlay toggle", togglecmds); + TranslationPrintCenterText(client, "Classes overlay toggle", togglecmds); } } diff --git a/src/zr/playerclasses/filtertools.inc b/src/zr/playerclasses/filtertools.inc index d389ee7..70380df 100644 --- a/src/zr/playerclasses/filtertools.inc +++ b/src/zr/playerclasses/filtertools.inc @@ -674,9 +674,6 @@ ClassGetDefaultSpawnClass(teamid, cachetype = ZR_CLASS_CACHE_MODIFIED) decl String:classname[64]; new classindex; - // Initialize log boolean. - new bool:enablelog = LogCheckFlag(LOG_CORE_EVENTS, LOG_MODULE_CLASSES); - // Get the default class name from the correct CVAR depending on teamid. switch (teamid) { @@ -740,20 +737,13 @@ ClassGetDefaultSpawnClass(teamid, cachetype = ZR_CLASS_CACHE_MODIFIED) // in the specified team, and log a warning. classindex = ClassGetFirstClass(teamid, _, cachetype); - if (enablelog) - { - LogMessageFormatted(-1, "Classes", "DefaultSpawnClass", "Warning: Failed to set \"%s\" as default spawn class for team %d. The class doesn't exist or the team IDs doesn't match. Falling back to the first class in the team.", _, classname, teamid); - } + LogPrintToLog(LOG_FORMAT_TYPE_NORMAL, "Classes", "Default Spawn Class", "Warning: Failed to set \"%s\" as default spawn class for team %d. The class doesn't exist or the team IDs doesn't match. Falling back to the first class in the team.", classname, teamid); // Validate the new index. if (ClassValidateIndex(classindex)) { // Log a warning. - if (enablelog) - { - LogMessageFormatted(-1, "Classes", "DefaultSpawnClass", "Warning: The default class name \"%s\" does not exist or matches the team ID.", _, classname); - } - + LogPrintToLog(LOG_FORMAT_TYPE_NORMAL, "Classes", "Default Spawn Class", "Warning: The default class name \"%s\" does not exist or matches the team ID.", classname); return classindex; } else diff --git a/src/zr/playerclasses/playerclasses.inc b/src/zr/playerclasses/playerclasses.inc index 182f008..052ee8a 100644 --- a/src/zr/playerclasses/playerclasses.inc +++ b/src/zr/playerclasses/playerclasses.inc @@ -322,9 +322,6 @@ new ClassPlayerNextAdminClass[MAXPLAYERS + 1]; */ ClassLoad() { - // Initialize log boolean. - new bool:enablelog = LogCheckFlag(LOG_CORE_EVENTS, LOG_MODULE_CLASSES); - // Make sure kvClassData is ready to use. if (kvClassData != INVALID_HANDLE) { @@ -339,16 +336,12 @@ ClassLoad() // If file doesn't exist, then log and stop. if (!exists) { - LogMessageFormatted(-1, "Classes", "Load", "Fatal error: Missing playerclasses config file \"%s\"", LOG_FORMAT_TYPE_FATALERROR, pathclasses); - + LogPrintToLog(LOG_FORMAT_TYPE_FATALERROR, "Classes", "Config Validation", "Fatal Error: Missing playerclasses config file \"%s\"", pathclasses); return; } // Log what class file that is loaded. - if (enablelog) - { - LogMessageFormatted(-1, "Classes", "Load", "Loading classes from file \"%s\".", LOG_FORMAT_TYPE_SIMPLE, pathclasses); - } + LogPrintToLog(LOG_FORMAT_TYPE_NORMAL, "Classes", "Config Validation", "Loading classes from file \"%s\".", pathclasses); // Put file data into memory. FileToKeyValues(kvClassData, pathclasses); @@ -357,7 +350,7 @@ ClassLoad() KvRewind(kvClassData); if (!KvGotoFirstSubKey(kvClassData)) { - LogMessageFormatted(-1, "Classes", "Load", "Fatal error: Can't find any classes in \"%s\"", LOG_FORMAT_TYPE_FATALERROR, pathclasses); + LogPrintToLog(LOG_FORMAT_TYPE_FATALERROR, "Classes", "Config Validation", "Fatal Error: Can't find any classes in \"%s\"", pathclasses); } decl String:name[64]; @@ -375,10 +368,7 @@ ClassLoad() if (ClassCount > ZR_CLASS_MAX) { // Maximum classes reached. Write a warning and exit the loop. - if (enablelog) - { - LogMessageFormatted(-1, "Classes", "Load", "Warning: Maximum classes reached (%d). Skipping other classes.", _, ZR_CLASS_MAX + 1); - } + LogPrintToLog(LOG_FORMAT_TYPE_NORMAL, "Classes", "Config Validation", "Warning: Maximum classes reached (%d). Skipping other classes.", ZR_CLASS_MAX + 1); break; } @@ -439,10 +429,7 @@ ClassLoad() // There's one or more invalid class attributes. Disable the class // and log an error message. ClassData[ClassCount][class_enabled] = false; - if (enablelog) - { - LogMessageFormatted(-1, "Classes", "Config Validation", "Warning: Invalid class at index %d, disabled class. Class error flags: %d.", LOG_FORMAT_TYPE_ERROR, ClassCount, ClassErrorFlags); - } + LogPrintToLog(LOG_FORMAT_TYPE_ERROR, "Classes", "Config Validation", "Warning: Invalid class at index %d, disabled class. Class error flags: %d.", ClassCount, ClassErrorFlags); failedcount++; } @@ -454,13 +441,13 @@ ClassLoad() // Validate team requirements. if (!ClassValidateTeamRequirements()) { - LogMessageFormatted(-1, "Classes", "Config Validation", "Fatal error: The class configuration doesn't match the team requirements.", LOG_FORMAT_TYPE_FATALERROR); + LogPrintToLog(LOG_FORMAT_TYPE_FATALERROR, "Classes", "Config Validation", "Fatal Error: The class configuration doesn't match the team requirements."); } // Validate team default requirements. if (!ClassValidateTeamDefaults()) { - LogMessageFormatted(-1, "Classes", "Config Validation", "Fatal error: Couldn't find a default class for one or more teams. At least one class per team must be marked as default.", LOG_FORMAT_TYPE_FATALERROR); + LogPrintToLog(LOG_FORMAT_TYPE_FATALERROR, "Classes", "Config Validation", "Fatal Error: Couldn't find a default class for one or more teams. At least one class per team must be marked as default."); } // Cache class data. @@ -470,10 +457,7 @@ ClassLoad() ClassValidated = true; // Log summary. - if (enablelog) - { - LogMessageFormatted(-1, "Classes", "Config Validation", "Total: %d | Successful: %d | Unsuccessful: %d", _, ClassCount, ClassCount - failedcount, failedcount); - } + LogPrintToLog(LOG_FORMAT_TYPE_NORMAL, "Classes", "Config Validation", "Total: %d | Successful: %d | Unsuccessful: %d", ClassCount, ClassCount - failedcount, failedcount); } @@ -657,10 +641,7 @@ ClassClientSetDefaultIndexes(client = -1) { // Invalid class index. Fall back to default class in class config and // log a warning. - if (LogCheckFlag(LOG_CORE_EVENTS, LOG_MODULE_CLASSES)) - { - LogMessageFormatted(-1, "Classes", "SetDefaultIndexes", "Warning: Failed to get default zombie class, falling back to default class in class config. Check spelling in \"zr_classes_default_zombie\".", LOG_FORMAT_TYPE_ERROR); - } + LogPrintToLog(LOG_FORMAT_TYPE_ERROR, "Classes", "Set Default Indexes", "Warning: Failed to get default zombie class, falling back to default class in class config. Check spelling in \"zr_classes_default_zombie\"."); // Use default class. zombieindex = ClassGetDefaultClass(ZR_CLASS_TEAM_ZOMBIES); @@ -671,10 +652,7 @@ ClassClientSetDefaultIndexes(client = -1) { // Invalid class index. Fall back to default class in class config and // log a warning. - if (LogCheckFlag(LOG_CORE_EVENTS, LOG_MODULE_CLASSES)) - { - LogMessageFormatted(-1, "Classes", "SetDefaultIndexes", "Warning: Failed to get default human class, falling back to default class in class config. Check spelling in \"zr_classes_default_human\".", LOG_FORMAT_TYPE_ERROR); - } + LogPrintToLog(LOG_FORMAT_TYPE_ERROR, "Classes", "Set Default Indexes", "Warning: Failed to get default human class, falling back to default class in class config. Check spelling in \"zr_classes_default_human\"."); // Use default class. humanindex = ClassGetDefaultClass(ZR_CLASS_TEAM_HUMANS); diff --git a/src/zr/soundeffects/ambientsounds.inc b/src/zr/soundeffects/ambientsounds.inc index 2c201a1..538049e 100644 --- a/src/zr/soundeffects/ambientsounds.inc +++ b/src/zr/soundeffects/ambientsounds.inc @@ -57,9 +57,6 @@ bool:AmbientSoundsValidateConfig() return false; } - // Initialize log boolean. - new bool:enablelog = LogCheckFlag(LOG_CORE_EVENTS, LOG_MODULE_AMBIENTSOUNDS); - // Get ambient sound file. decl String:sound[SOUND_MAX_PATH]; GetConVarString(g_hCvarsList[CVAR_AMBIENTSOUNDS_FILE], sound, sizeof(sound)); @@ -69,11 +66,7 @@ bool:AmbientSoundsValidateConfig() if (!FileExists(sound, true)) { // Log invalid sound file error. - if (enablelog) - { - LogMessageFormatted(-1, "Ambient Sounds", "Config Validation", "Invalid sound file specified in zr_ambientsounds_file.", LOG_FORMAT_TYPE_ERROR); - } - + LogPrintToLog(LOG_FORMAT_TYPE_ERROR, "Ambient Sounds", "Config Validation", "Invalid sound file specified in \"zr_ambientsounds_file\"."); return false; } @@ -82,10 +75,7 @@ bool:AmbientSoundsValidateConfig() if (ambientvolume <= 0.0) { // Log invalid ambient sound volume error. - if (enablelog) - { - LogMessageFormatted(-1, "Ambient Sounds", "Config Validation", "Ambient sound is either muted or invalid.", LOG_FORMAT_TYPE_ERROR); - } + LogPrintToLog(LOG_FORMAT_TYPE_ERROR, "Ambient Sounds", "Config Validation", "Ambient sound is either muted or invalid."); return false; } @@ -95,10 +85,7 @@ bool:AmbientSoundsValidateConfig() if (ambientlength <= 0.0) { // Log invalid ambient sound length error. - if (enablelog) - { - LogMessageFormatted(-1, "Ambient Sounds", "Config Validation", "Specified ambient sound length is invalid.", LOG_FORMAT_TYPE_ERROR); - } + LogPrintToLog(LOG_FORMAT_TYPE_ERROR, "Ambient Sounds", "Config Validation", "Specified ambient sound length is invalid."); return false; } diff --git a/src/zr/spawnprotect.inc b/src/zr/spawnprotect.inc index 7a03605..b18f62f 100644 --- a/src/zr/spawnprotect.inc +++ b/src/zr/spawnprotect.inc @@ -91,10 +91,10 @@ SpawnProtectOnClientSpawn(client) pSpawnProtectTime[client] = protect_time; // Tell client they are being protected. - ZR_PrintToChat(client, "Spawn protection begin", protect_time); + TranslationPrintToChat(client, "Spawn protection begin", protect_time); // Send time left in a hud message. - ZR_HudHint(client, "Spawn Protect", pSpawnProtectTime[client]); + TranslationPrintHUDText(client, "Spawn Protect", pSpawnProtectTime[client]); // Start repeating timer. tSpawnProtect[client] = CreateTimer(1.0, SpawnProtectTimer, client, TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); @@ -142,7 +142,7 @@ public Action:SpawnProtectTimer(Handle:timer, any:client) pSpawnProtectTime[client]--; // Print time left to client. - ZR_HudHint(client, "Spawn Protect", pSpawnProtectTime[client]); + TranslationPrintHUDText(client, "Spawn Protect", pSpawnProtectTime[client]); // Time has expired. if (pSpawnProtectTime[client] <= 0) @@ -151,7 +151,7 @@ public Action:SpawnProtectTimer(Handle:timer, any:client) bInfectImmune[client][INFECT_TYPE_NORMAL] = false; // Tell client spawn protection is over. - ZR_HudHint(client, "Spawn protection end"); + TranslationPrintHUDText(client, "Spawn protection end"); // Fix attributes. ToolsSetClientAlpha(client, ClassGetAlphaInitial(client)); diff --git a/src/zr/tools.inc b/src/zr/tools.inc index 703b083..ca62df1 100644 --- a/src/zr/tools.inc +++ b/src/zr/tools.inc @@ -62,70 +62,70 @@ ToolsFindOffsets() g_iToolsVelocity = FindSendPropInfo("CBasePlayer", "m_vecVelocity[0]"); if (g_iToolsVelocity == -1) { - LogMessageFormatted(-1, "Tools", "Offsets", "Offset \"CBasePlayer::m_vecVelocity[0]\" was not found.", LOG_FORMAT_TYPE_FATALERROR); + LogPrintToLog(LOG_FORMAT_TYPE_FATALERROR, "Tools", "Offsets", "Offset \"CBasePlayer::m_vecVelocity[0]\" was not found."); } // If offset "m_vecBaseVelocity" can't be found, then stop the plugin. g_iToolsBaseVelocity = FindSendPropInfo("CBasePlayer", "m_vecBaseVelocity"); if (g_iToolsBaseVelocity == -1) { - LogMessageFormatted(-1, "Tools", "Offsets", "Offset \"CBasePlayer::m_vecBaseVelocity\" was not found.", LOG_FORMAT_TYPE_FATALERROR); + LogPrintToLog(LOG_FORMAT_TYPE_FATALERROR, "Tools", "Offsets", "Offset \"CBasePlayer::m_vecBaseVelocity\" was not found."); } // If offset "m_flLaggedMovementValue" can't be found, then stop the plugin. g_iToolsLMV = FindSendPropInfo("CCSPlayer", "m_flLaggedMovementValue"); if (g_iToolsLMV == -1) { - LogMessageFormatted(-1, "Tools", "Offsets", "Offset \"CCSPlayer::m_flLaggedMovementValue\" was not found.", LOG_FORMAT_TYPE_FATALERROR); + LogPrintToLog(LOG_FORMAT_TYPE_FATALERROR, "Tools", "Offsets", "Offset \"CCSPlayer::m_flLaggedMovementValue\" was not found."); } // If offset "m_bHasNightVision" can't be found, then stop the plugin. g_iToolsHasNightVision = FindSendPropInfo("CCSPlayer", "m_bHasNightVision"); if (g_iToolsHasNightVision == -1) { - LogMessageFormatted(-1, "Tools", "Offsets", "Offset \"CCSPlayer::m_bHasNightVision\" was not found.", LOG_FORMAT_TYPE_FATALERROR); + LogPrintToLog(LOG_FORMAT_TYPE_FATALERROR, "Tools", "Offsets", "Offset \"CCSPlayer::m_bHasNightVision\" was not found."); } // If offset "m_bNightVisionOn" can't be found, then stop the plugin. g_iToolsNightVisionOn = FindSendPropInfo("CCSPlayer", "m_bNightVisionOn"); if (g_iToolsNightVisionOn == -1) { - LogMessageFormatted(-1, "Tools", "Offsets", "Offset \"CCSPlayer::m_bNightVisionOn\" was not found.", LOG_FORMAT_TYPE_FATALERROR); + LogPrintToLog(LOG_FORMAT_TYPE_FATALERROR, "Tools", "Offsets", "Offset \"CCSPlayer::m_bNightVisionOn\" was not found."); } // If offset "m_CollisionGroup" can't be found, then stop the plugin. g_iToolsCollisionGroup = FindSendPropInfo("CBaseEntity", "m_CollisionGroup"); if (g_iToolsCollisionGroup == -1) { - LogMessageFormatted(-1, "Tools", "Offsets", "Offset \"CBaseEntity::m_CollisionGroup\" was not found.", LOG_FORMAT_TYPE_FATALERROR); + LogPrintToLog(LOG_FORMAT_TYPE_FATALERROR, "Tools", "Offsets", "Offset \"CBaseEntity::m_CollisionGroup\" was not found."); } // If offset "m_iAccount" can't be found, then stop the plugin. g_iToolsAccount = FindSendPropInfo("CCSPlayer", "m_iAccount"); if (g_iToolsAccount == -1) { - LogMessageFormatted(-1, "Tools", "Offsets", "Offset \"CCSPlayer::m_iAccount\" was not found.", LOG_FORMAT_TYPE_FATALERROR); + LogPrintToLog(LOG_FORMAT_TYPE_FATALERROR, "Tools", "Offsets", "Offset \"CCSPlayer::m_iAccount\" was not found."); } // If offset "m_iDefaultFOV" can't be found, then stop the plugin. g_iToolsDefaultFOV = FindSendPropInfo("CBasePlayer", "m_iDefaultFOV"); if (g_iToolsDefaultFOV == -1) { - LogMessageFormatted(-1, "Tools", "Offsets", "Offset \"CBasePlayer::m_iDefaultFOV\" was not found.", LOG_FORMAT_TYPE_FATALERROR); + LogPrintToLog(LOG_FORMAT_TYPE_FATALERROR, "Tools", "Offsets", "Offset \"CBasePlayer::m_iDefaultFOV\" was not found."); } // If offset "m_bInBuyZone" can't be found, then stop the plugin. g_iToolsInBuyZone = FindSendPropInfo("CCSPlayer", "m_bInBuyZone"); if (g_iToolsInBuyZone == -1) { - LogMessageFormatted(-1, "Tools", "Offsets", "Offset \"CCSPlayer::m_bInBuyZone\" was not found.", LOG_FORMAT_TYPE_FATALERROR); + LogPrintToLog(LOG_FORMAT_TYPE_FATALERROR, "Tools", "Offsets", "Offset \"CCSPlayer::m_bInBuyZone\" was not found."); } // If offset "m_hActiveWeapon" can't be found, then stop the plugin. g_iToolsActiveWeapon = FindSendPropInfo("CBasePlayer", "m_hActiveWeapon"); if (g_iToolsActiveWeapon == -1) { - LogMessageFormatted(-1, "Tools", "Offsets", "Offset \"CBasePlayer::m_hActiveWeapon\" was not found.", LOG_FORMAT_TYPE_FATALERROR); + LogPrintToLog(LOG_FORMAT_TYPE_FATALERROR, "Tools", "Offsets", "Offset \"CBasePlayer::m_hActiveWeapon\" was not found."); } } @@ -140,7 +140,7 @@ ToolsSetupGameData() // If gamedata file can't be loaded, then stop the plugin. if (g_hToolsGameConfig == INVALID_HANDLE) { - LogMessageFormatted(-1, "Tools", "GameData", "Can't load game config file (plugin.zombiereloaded.txt) from the gamedata directory.", LOG_FORMAT_TYPE_FATALERROR); + LogPrintToLog(LOG_FORMAT_TYPE_FATALERROR, "Tools", "GameData", "Can't load game config file (plugin.zombiereloaded.txt) from the gamedata directory."); } // Prep the SDKCall for "EyeAngles." @@ -152,7 +152,7 @@ ToolsSetupGameData() // If offset "EyeAngles" can't be found, then stop the plugin. if(g_hToolsEyeAngles == INVALID_HANDLE) { - LogMessageFormatted(-1, "Tools", "GameData", "Offset \"EyeAngles\" was not found.", LOG_FORMAT_TYPE_FATALERROR); + LogPrintToLog(LOG_FORMAT_TYPE_FATALERROR, "Tools", "GameData", "Offset \"EyeAngles\" was not found."); } // Prep the SDKCall for "TerminateRound." @@ -165,7 +165,7 @@ ToolsSetupGameData() // If offset "TerminateRound" can't be found, then stop the plugin. if(g_hToolsTerminateRound == INVALID_HANDLE) { - LogMessageFormatted(-1, "Tools", "GameData", "Signature \"CGameRules::TerminateRound\" was not found.", LOG_FORMAT_TYPE_FATALERROR); + LogPrintToLog(LOG_FORMAT_TYPE_FATALERROR, "Tools", "GameData", "Signature \"CGameRules::TerminateRound\" was not found."); } // Prep the SDKCall for "CSWeaponDrop." @@ -179,6 +179,6 @@ ToolsSetupGameData() // If offset "CSWeaponDrop" can't be found, then stop the plugin. if(g_hToolsCSWeaponDrop == INVALID_HANDLE) { - LogMessageFormatted(-1, "Tools", "GameData", "Signature \"CBasePlaye::CSWeaponDrop\" was not found.", LOG_FORMAT_TYPE_FATALERROR); + LogPrintToLog(LOG_FORMAT_TYPE_FATALERROR, "Tools", "GameData", "Signature \"CBasePlaye::CSWeaponDrop\" was not found."); } } diff --git a/src/zr/translation.inc b/src/zr/translation.inc index 6d4531b..9e15093 100644 --- a/src/zr/translation.inc +++ b/src/zr/translation.inc @@ -10,138 +10,326 @@ * ============================================================================ */ -FormatTextString(String:text[], maxlen) -{ - Format(text, maxlen, "@green[ZR] @default%s", text); - - ReplaceString(text, maxlen, "@default","\x01"); - ReplaceString(text, maxlen, "@lgreen","\x03"); - ReplaceString(text, maxlen, "@green","\x04"); -} +/** + * @section Max length of different message formats. + */ +#define TRANSLATION_MAX_LENGTH_CHAT 192 +#define TRANSLATION_MAX_LENGTH_CONSOLE 1024 +/** + * @endsection + */ -stock ZR_PrintToChat(client, any:...) -{ - decl String:phrase[192]; - - if (ZRIsClientValid(client)) - { - SetGlobalTransTarget(client); - - VFormat(phrase, sizeof(phrase), "%t", 2); - FormatTextString(phrase, sizeof(phrase)); - - PrintToChat(client, phrase); - } - else - { - SetGlobalTransTarget(client); - - VFormat(phrase, sizeof(phrase), "%t", 2); - FormatTextString(phrase, sizeof(phrase)); - - PrintToServer(phrase); - - for (new x = 1; x <= MaxClients; x++) - { - if (IsClientInGame(x)) - { - SetGlobalTransTarget(x); - - VFormat(phrase, sizeof(phrase), "%t", 2); - FormatTextString(phrase, sizeof(phrase)); - - PrintToChat(x, phrase); - } - } - } -} +/** + * Prefix on all messages printed from the plugin. + */ +#define TRANSLATION_PHRASE_PREFIX "[ZR]" -stock ZR_PrintCenterText(client, any:...) -{ - SetGlobalTransTarget(client); - - decl String:phrase[192]; - - VFormat(phrase, sizeof(phrase), "%t", 2); - - PrintCenterText(client, phrase); -} +/** + * @section Text color chars. + */ +#define TRANSLATION_TEXT_COLOR_DEFAULT "\x01" +#define TRANSLATION_TEXT_COLOR_LGREEN "\x03" +#define TRANSLATION_TEXT_COLOR_GREEN "\x04" +/** + * @endsection + */ -stock ZR_HudHint(client, any:...) -{ - SetGlobalTransTarget(client); - - decl String:phrase[192]; - - VFormat(phrase, sizeof(phrase), "%t", 2); - - new Handle:hHintText = StartMessageOne("HintText", client); - if (hHintText != INVALID_HANDLE) - { - BfWriteByte(hHintText, -1); - BfWriteString(hHintText, phrase); - EndMessage(); - } -} +/** + * HUD text usermsg + */ +#define TRANSLATION_USERMSG_HINTTEXT "HintText" -stock ZR_PrintToServer(any:...) +/** + * Load translations file here. + */ +TranslationInit() { - SetGlobalTransTarget(LANG_SERVER); - - decl String:phrase[192]; - decl String:buffer[192]; - - VFormat(phrase, sizeof(phrase), "%t", 1); - Format(buffer, sizeof(buffer), "[ZR] %s", phrase); - - PrintToServer(buffer); -} - -stock ZR_LogMessage(any:...) -{ - SetGlobalTransTarget(LANG_SERVER); - - decl String:phrase[192]; - - VFormat(phrase, sizeof(phrase), "%t", 1); - - LogMessage(phrase); -} - -stock ZR_TranslateMessage(String:buffer[], maxlen, any:...) -{ - SetGlobalTransTarget(LANG_SERVER); - VFormat(buffer, maxlen, "%t", 3); -} - -stock ZR_ReplyToCommand(client, any:...) -{ - decl String:phrase[192]; - - SetGlobalTransTarget(client); - - VFormat(phrase, sizeof(phrase), "%t", 2); - FormatTextString(phrase, sizeof(phrase)); - - ReplyToCommand(client, phrase); + // Load translations phrases used by plugin. + LoadTranslations("common.phrases.txt"); + LoadTranslations("zombiereloaded.phrases.txt"); } /** - * Adds support for printing long strings. + * Translate a phrase in zombiereloaded.phrases.txt + * + * @param client The client index + * @param translation The translated text. + * @param maxlen Maximum length of the translated string. + * @param ... Translation formatting parameters. + */ +stock TranslationTranslatePhrase(client, String:translation[], maxlen, any:...) +{ + // Set translation target to given target. + SetGlobalTransTarget(client); + + // Dump translation into return string. + VFormat(translation, maxlen, "%t", 3); +} + +/** + * Format the string to the plugin's style. + * + * @param text Text to format. + * @param maxlen Maximum length of the formatted text. + */ +stock TranslationPluginFormatString(String:text[], maxlen, bool:color = true) +{ + if (color) + { + // Format prefix onto the string. + Format(text, maxlen, "@green%s @default%s", TRANSLATION_PHRASE_PREFIX, text); + + // Replace color tokens with CS:S color chars. + ReplaceString(text, maxlen, "@default", TRANSLATION_TEXT_COLOR_DEFAULT); + ReplaceString(text, maxlen, "@lgreen", TRANSLATION_TEXT_COLOR_LGREEN); + ReplaceString(text, maxlen, "@green", TRANSLATION_TEXT_COLOR_GREEN); + + return; + } + + // Format prefix onto the string. + Format(text, maxlen, "%s %s", TRANSLATION_PHRASE_PREFIX, text); +} + +/** + * Print chat text to client. (with style) * * @param client The client index. - * @param text The text to print. + * @param ... Translation formatting parameters. */ -stock ZR_ReplyToCommandLong(client, const String:text[]) +stock TranslationPrintToChat(client, any:...) { - decl String:partbuffer[1024]; - new pos; - new cellswritten = 1; // Initialize for the loop. + // Set translation target + SetGlobalTransTarget(client); + + // Translate phrase. + decl String:translation[TRANSLATION_MAX_LENGTH_CHAT]; + VFormat(translation, sizeof(translation), "%t", 2); + + // Format string to create plugin style. + TranslationPluginFormatString(translation, sizeof(translation)); + + // Print translated phrase to client. + PrintToChat(client, translation); +} - while (cellswritten) +/** + * Format the string to the plugin's style. + * + * @param server True to also print text to server console, false just to clients. + * @param ... Translation formatting parameters. + */ +stock TranslationPrintToChatAll(bool:server, bool:admin, any:...) +{ + decl String:translation[TRANSLATION_MAX_LENGTH_CHAT]; + + if (server) { - cellswritten = strcopy(partbuffer, sizeof(partbuffer), text[pos]); - ReplyToCommand(client, partbuffer); - pos += cellswritten; + // Set translation target + SetGlobalTransTarget(LANG_SERVER); + + // Translate phrase. + VFormat(translation, sizeof(translation), "%t", 3); + + // Format string to create plugin style. + TranslationPluginFormatString(translation, sizeof(translation), false); + + // Print phrase to server. + PrintToServer(translation); + } + + // x = client index. + for (new x = 1; x <= MaxClients; x++) + { + // If client isn't in-game, then stop. + if (!IsClientInGame(x)) + { + continue; + } + + // If client isn't an admin, and we're only printing to admins, then stop. + if (admin && !ZRIsClientAdmin(x)) + { + continue; + } + + // Set translation target + SetGlobalTransTarget(LANG_SERVER); + + // Translate phrase. + VFormat(translation, sizeof(translation), "%t", 3); + + // Format string to create plugin style. + TranslationPluginFormatString(translation, sizeof(translation)); + + // Print translated phrase to client. + PrintToChat(x, translation); } } + +/** + * Print console text to client. (with style) + * + * @param client The client index. + * @param ... Translation formatting parameters. + */ +stock TranslationPrintToConsole(client, any:...) +{ + // Set translation target + SetGlobalTransTarget(client); + + // Translate phrase. + decl String:translation[TRANSLATION_MAX_LENGTH_CHAT]; + VFormat(translation, sizeof(translation), "%t", 2); + + // Format string to create plugin style. + TranslationPluginFormatString(translation, sizeof(translation), false); + + // Print translated phrase to client. + PrintToConsole(client, translation); +} + +/** + * Format the string to the plugin's style. + * + * @param server True to also print text to server console, false just to clients. + * @param ... Translation formatting parameters. + */ +stock TranslationPrintToConsoleAll(bool:server, bool:admin, any:...) +{ + decl String:translation[TRANSLATION_MAX_LENGTH_CHAT]; + + if (server) + { + // Set translation target + SetGlobalTransTarget(LANG_SERVER); + + // Translate phrase. + VFormat(translation, sizeof(translation), "%t", 3); + + // Format string to create plugin style. + TranslationPluginFormatString(translation, sizeof(translation), false); + + // Print phrase to server. + PrintToServer(translation); + } + + // x = client index. + for (new x = 1; x <= MaxClients; x++) + { + // If client isn't in-game, then stop. + if (!IsClientInGame(x)) + { + continue; + } + + // If client isn't an admin, and we're only printing to admins, then stop. + if (admin && !ZRIsClientAdmin(x)) + { + continue; + } + + // Set translation target + SetGlobalTransTarget(LANG_SERVER); + + // Translate phrase. + VFormat(translation, sizeof(translation), "%t", 3); + + // Format string to create plugin style. + TranslationPluginFormatString(translation, sizeof(translation), false); + + // Print translated phrase to client. + PrintToConsole(x, translation); + } +} + +/** + * Print center text to client. (with style) + * + * @param client The client index. + * @param ... Translation formatting parameters. + */ +stock TranslationPrintCenterText(client, any:...) +{ + // Set translation target + SetGlobalTransTarget(client); + + // Translate phrase. + decl String:translation[TRANSLATION_MAX_LENGTH_CHAT]; + VFormat(translation, sizeof(translation), "%t", 2); + + // Print translated phrase to client. + PrintCenterText(client, translation); +} + +/** + * Print HUD text to client. (with style) + * + * @param client The client index. + * @param ... Translation formatting parameters. + */ +stock TranslationPrintHUDText(client, any:...) +{ + // Set translation target + SetGlobalTransTarget(client); + + // Translate phrase. + decl String:translation[TRANSLATION_MAX_LENGTH_CHAT]; + VFormat(translation, sizeof(translation), "%t", 2); + + // Print translated phrase to client. + + // If hint text usermsg is invalid, then stop. + new Handle:hHintText = StartMessageOne(TRANSLATION_USERMSG_HINTTEXT, client); + if (hHintText == INVALID_HANDLE) + { + return; + } + + BfWriteByte(hHintText, -1); + BfWriteString(hHintText, translation); + EndMessage(); +} + +/** + * Print text to server. (with style) + * + * @param ... Translation formatting parameters. + */ +stock TranslationPrintToServer(any:...) +{ + // Set translation target + SetGlobalTransTarget(LANG_SERVER); + + // Translate phrase. + decl String:translation[TRANSLATION_MAX_LENGTH_CHAT]; + VFormat(translation, sizeof(translation), "%t", 1); + + // Format string to create plugin style. + TranslationPluginFormatString(translation, sizeof(translation), false); + + // Print translated phrase to client. + PrintToServer(translation); +} + +/** + * Print chat text to client. (with style) + * + * @param client The client index. + * @param ... Translation formatting parameters. + */ +stock TranslationReplyToCommand(client, any:...) +{ + // Set translation target + SetGlobalTransTarget(client); + + // Translate phrase. + decl String:translation[TRANSLATION_MAX_LENGTH_CHAT]; + VFormat(translation, sizeof(translation), "%t", 2); + + // Format string to create plugin style. + TranslationPluginFormatString(translation, sizeof(translation)); + + // Print translated phrase to client. + ReplyToCommand(client, translation); +} \ No newline at end of file diff --git a/src/zr/weapons/markethandler.inc b/src/zr/weapons/markethandler.inc index 63afc04..e32e4d1 100644 --- a/src/zr/weapons/markethandler.inc +++ b/src/zr/weapons/markethandler.inc @@ -15,6 +15,15 @@ */ new bool:g_bMarket; +/** + * Set global market flag variable + */ +MarketInit() +{ + // Set market variable to true if market is installed. + g_bMarket = LibraryExists("market"); +} + /** * Sends market menu to client. * @@ -26,7 +35,7 @@ bool:ZMarketMenu(client) if (!g_bMarket) { // Tell client market is disabled. - ZR_PrintToChat(client, "Feature is disabled"); + TranslationPrintToChat(client, "Feature is disabled"); return false; } @@ -34,7 +43,7 @@ bool:ZMarketMenu(client) if (!IsPlayerAlive(client)) { // Tell player they must be alive. - ZR_PrintToChat(client, "Must be alive"); + TranslationPrintToChat(client, "Must be alive"); return false; } @@ -43,7 +52,7 @@ bool:ZMarketMenu(client) if (!ZMarketIsClientInBuyZone(client) && buyzone) { // Tell client they must be in a buyzone. - ZR_PrintCenterText(client, "Market out of buyzone"); + TranslationPrintCenterText(client, "Market out of buyzone"); return false; } @@ -93,7 +102,7 @@ public bool:Market_OnWeaponSelected(client, String:weaponid[]) // If player is a zombie, then stop. if (InfectIsClientInfected(client)) { - ZR_PrintToChat(client, "Zombie cant use weapon"); + TranslationPrintToChat(client, "Zombie cant use weapon"); return false; } @@ -120,7 +129,7 @@ public bool:Market_OnWeaponSelected(client, String:weaponid[]) // If the weapon is restricted, then stop. if (RestrictIsWeaponRestricted(weapon)) { - ZR_PrintToChat(client, "Weapon is restricted", weapon); + TranslationPrintToChat(client, "Weapon is restricted", weapon); return false; } @@ -129,7 +138,7 @@ public bool:Market_OnWeaponSelected(client, String:weaponid[]) new bool:buyzone = GetConVarBool(g_hCvarsList[CVAR_WEAPONS_ZMARKET_BUYZONE]); if (!ZMarketIsClientInBuyZone(client) && buyzone) { - ZR_PrintCenterText(client, "Market out of buyzone"); + TranslationPrintCenterText(client, "Market out of buyzone"); return false; } diff --git a/src/zr/weapons/restrict.inc b/src/zr/weapons/restrict.inc index 6fe7deb..79369f3 100644 --- a/src/zr/weapons/restrict.inc +++ b/src/zr/weapons/restrict.inc @@ -105,10 +105,7 @@ RestrictOnMapStart() if (!exists) { // Log failure. - if (LogCheckFlag(LOG_CORE_EVENTS, LOG_MODULE_WEAPONS)) - { - LogMessageFormatted(-1, "Weapons", "Config Validation", "Missing weapon groups config file: %s", LOG_FORMAT_TYPE_ERROR, pathweapongroups); - } + LogPrintToLog(LOG_FORMAT_TYPE_ERROR, "Weapon Restrict", "Config Validation", "Missing weapon groups config file: %s", pathweapongroups); return; } @@ -159,12 +156,6 @@ RestrictDefaultRestrictions() */ RestrictValidateWeaponGroups() { - // If log flag check fails, then don't log. - if (!LogCheckFlag(LOG_CORE_EVENTS, LOG_MODULE_WEAPONS)) - { - return; - } - // Reset keygroup's traversal stack. KvRewind(kvWeaponGroups); @@ -188,7 +179,7 @@ RestrictValidateWeaponGroups() // If weapon is invalid, then log it. if (!WeaponsIsValidWeapon(groupweapon)) { - LogMessageFormatted(-1, "Weapon Restrict", "Config Validation", "Invalid weapon \"%s\" in group \"%s\" configured in weapongroups.txt.", LOG_FORMAT_TYPE_ERROR, groupweapon, weapongroup); + LogPrintToLog(LOG_FORMAT_TYPE_ERROR, "Weapon Restrict", "Config Validation", "Invalid weapon \"%s\" in group \"%s\" configured in weapongroups.txt.", groupweapon, weapongroup); } } while (KvGotoNextKey(kvWeaponGroups)); @@ -197,7 +188,7 @@ RestrictValidateWeaponGroups() // If it couldn't traverse to the weapons, then log no weapons within group. else { - LogMessageFormatted(-1, "Weapon Restrict", "Config Validation", "No weapons listed in weapon group \"%s\" in weapongroups.txt.", LOG_FORMAT_TYPE_ERROR, weapongroup); + LogPrintToLog(LOG_FORMAT_TYPE_ERROR, "Weapon Restrict", "Config Validation", "No weapons listed in weapon group \"%s\" in weapongroups.txt.", weapongroup); } } while (KvGotoNextKey(kvWeaponGroups)); } @@ -259,19 +250,10 @@ RestrictOnClientSpawn(client) */ public Action:RestrictBuyCommand(client, argc) { - // If plugin is disabled then stop. - /*new bool:enabled = GetConVarBool(g_hCvarsList[CVAR_ENABLE]); - if (!enabled) - { - // Allow command. - return Plugin_Continue; - }*/ - // Disabled - // If player is a zombie, then block command. if (InfectIsClientInfected(client)) { - ZR_PrintToChat(client, "Zombie cant use weapon"); + TranslationPrintToChat(client, "Zombie cant use weapon"); // Block command return Plugin_Handled; @@ -285,7 +267,7 @@ public Action:RestrictBuyCommand(client, argc) // Check if the weapon is restricted, if so then block command. if (RestrictIsWeaponRestricted(weapon)) { - ZR_PrintToChat(client, "Weapon is restricted", weapon); + TranslationPrintToChat(client, "Weapon is restricted", weapon); // Block command. return Plugin_Handled; @@ -480,12 +462,8 @@ RestrictPrintRestrictOutput(client, WpnRestrictQuery:output, const String:weapon // Weapon was successfully restricted. case Successful_Weapon: { - ZR_PrintToChat(0, "Restrict weapon", weapon); - - if (LogCheckFlag(LOG_GAME_EVENTS, LOG_MODULE_WEAPONS)) - { - LogMessageFormatted(client, "Weapon Restrict", "Restrict", "\"%L\" restricted weapon: \"%s\".", LOG_FORMAT_TYPE_FULL, client, weapon); - } + TranslationPrintToChatAll(true, false, "Restrict weapon", weapon); + LogPrintToLog(LOG_FORMAT_TYPE_NORMAL, "Weapon Restrict", "Restrict", "\"%L\" restricted weapon: \"%s\".", client, weapon); } // Weapon group was successfully restricted. case Successful_Group: @@ -493,23 +471,19 @@ RestrictPrintRestrictOutput(client, WpnRestrictQuery:output, const String:weapon decl String:weaponlist[128]; RestrictGetGroupWeapons(weapon, weaponlist, sizeof(weaponlist), ", "); - ZR_PrintToChat(0, "Restrict custom weapon group", weapon, weaponlist); - - if (LogCheckFlag(LOG_GAME_EVENTS, LOG_MODULE_WEAPONS)) - { - LogMessageFormatted(client, "Weapon Restrict", "Restrict", "\"%L\" restricted weapon group: \"%s\".", LOG_FORMAT_TYPE_FULL, client, weapon); - } + TranslationPrintToChatAll(true, false, "Restrict custom weapon group", weapon, weaponlist); + LogPrintToLog(LOG_FORMAT_TYPE_NORMAL, "Weapon Restrict", "Restrict", "\"%L\" restricted weapon group: \"%s\".", client, weapon); } // Weapon was already restricted. case Failed_Weapon: { if (reply) { - ZR_ReplyToCommand(client, "Restrict weapon failed", weapon); + TranslationReplyToCommand(client, "Restrict weapon failed", weapon); } else { - ZR_PrintToChat(client, "Restrict weapon failed", weapon); + TranslationPrintToChat(client, "Restrict weapon failed", weapon); } } // Weapon group was already restricted. @@ -520,11 +494,11 @@ RestrictPrintRestrictOutput(client, WpnRestrictQuery:output, const String:weapon if (reply) { - ZR_ReplyToCommand(client, "Restrict custom weapon group failed", weapon, weaponlist); + TranslationReplyToCommand(client, "Restrict custom weapon group failed", weapon, weaponlist); } else { - ZR_PrintToChat(client, "Restrict custom weapon group failed", weapon, weaponlist); + TranslationPrintToChat(client, "Restrict custom weapon group failed", weapon, weaponlist); } } // Weapon name was invalid. @@ -532,11 +506,11 @@ RestrictPrintRestrictOutput(client, WpnRestrictQuery:output, const String:weapon { if (reply) { - ZR_ReplyToCommand(client, "Weapon invalid", weapon); + TranslationReplyToCommand(client, "Weapon invalid", weapon); } else { - ZR_PrintToChat(client, "Weapon invalid", weapon); + TranslationPrintToChat(client, "Weapon invalid", weapon); } } } @@ -556,12 +530,9 @@ RestrictPrintUnrestrictOutput(client, WpnRestrictQuery:output, const String:weap // Weapon was successfully unrestricted. case Successful_Weapon: { - ZR_PrintToChat(0, "Unrestrict weapon", weapon); + TranslationPrintToChatAll(true, false, "Unrestrict weapon", weapon); + LogPrintToLog(LOG_FORMAT_TYPE_NORMAL, "Weapon Restrict", "Unrestrict", "\"%L\" unrestricted weapon: \"%s\".", client, weapon); - if (LogCheckFlag(LOG_GAME_EVENTS, LOG_MODULE_WEAPONS)) - { - LogMessageFormatted(client, "Weapon Restrict", "Unrestrict", "\"%L\" unrestricted weapon: \"%s\".", LOG_FORMAT_TYPE_FULL, client, weapon); - } } // Weapon group was successfully unrestricted. case Successful_Group: @@ -569,23 +540,19 @@ RestrictPrintUnrestrictOutput(client, WpnRestrictQuery:output, const String:weap decl String:weaponlist[128]; RestrictGetGroupWeapons(weapon, weaponlist, sizeof(weaponlist), ", "); - ZR_PrintToChat(0, "Unrestrict custom weapon group", weapon, weaponlist); - - if (LogCheckFlag(LOG_GAME_EVENTS, LOG_MODULE_WEAPONS)) - { - LogMessageFormatted(client, "Weapon Restrict", "Unrestrict", "\"%L\" unrestricted weapon group: \"%s\".", LOG_FORMAT_TYPE_FULL, client, weapon); - } + TranslationPrintToChatAll(true, false, "Unrestrict custom weapon group", weapon, weaponlist); + LogPrintToLog(LOG_FORMAT_TYPE_NORMAL, "Weapon Restrict", "Unrestrict", "\"%L\" unrestricted weapon group: \"%s\".", client, weapon); } // Weapon wasn't restricted. case Failed_Weapon: { if (reply) { - ZR_ReplyToCommand(client, "Unrestrict weapon failed", weapon); + TranslationReplyToCommand(client, "Unrestrict weapon failed", weapon); } else { - ZR_PrintToChat(client, "Unrestrict weapon failed", weapon); + TranslationPrintToChat(client, "Unrestrict weapon failed", weapon); } } // Weapon group wasn't restricted. @@ -596,11 +563,11 @@ RestrictPrintUnrestrictOutput(client, WpnRestrictQuery:output, const String:weap if (reply) { - ZR_ReplyToCommand(client, "Unrestrict custom weapon group failed", weapon, weaponlist); + TranslationReplyToCommand(client, "Unrestrict custom weapon group failed", weapon, weaponlist); } else { - ZR_PrintToChat(client, "Unrestrict custom weapon group failed", weapon, weaponlist); + TranslationPrintToChat(client, "Unrestrict custom weapon group failed", weapon, weaponlist); } } // Weapon name was invalid. @@ -608,11 +575,11 @@ RestrictPrintUnrestrictOutput(client, WpnRestrictQuery:output, const String:weap { if (reply) { - ZR_ReplyToCommand(client, "Weapon invalid", weapon); + TranslationReplyToCommand(client, "Weapon invalid", weapon); } else { - ZR_PrintToChat(client, "Weapon invalid", weapon); + TranslationPrintToChat(client, "Weapon invalid", weapon); } } } @@ -933,7 +900,7 @@ public Action:RestrictRestrictCommand(client, argc) if (!weapons) { // Tell client command is disabled. - ZR_ReplyToCommand(client, "Feature is disabled"); + TranslationReplyToCommand(client, "Feature is disabled"); return Plugin_Handled; } @@ -942,7 +909,7 @@ public Action:RestrictRestrictCommand(client, argc) if (!restrict) { // Tell client command is disabled. - ZR_ReplyToCommand(client, "Feature is disabled"); + TranslationReplyToCommand(client, "Feature is disabled"); return Plugin_Handled; } @@ -975,7 +942,7 @@ public Action:RestrictUnrestrictCommand(client, argc) if (!weapons) { // Tell client command is disabled. - ZR_ReplyToCommand(client, "Feature is disabled"); + TranslationReplyToCommand(client, "Feature is disabled"); return Plugin_Handled; } @@ -984,7 +951,7 @@ public Action:RestrictUnrestrictCommand(client, argc) if (!restrict) { // Tell client command is disabled. - ZR_ReplyToCommand(client, "Feature is disabled"); + TranslationReplyToCommand(client, "Feature is disabled"); return Plugin_Handled; } diff --git a/src/zr/weapons/weapons.inc b/src/zr/weapons/weapons.inc index 3aad2c6..f23aa0f 100644 --- a/src/zr/weapons/weapons.inc +++ b/src/zr/weapons/weapons.inc @@ -93,10 +93,7 @@ WeaponsLoad() if (!exists) { // Log failure. - if (LogCheckFlag(LOG_CORE_EVENTS, LOG_MODULE_WEAPONS)) - { - LogMessageFormatted(-1, "Weapons", "Config Validation", "Missing weapons config file: %s", LOG_FORMAT_TYPE_ERROR, pathweapons); - } + LogPrintToLog(LOG_FORMAT_TYPE_ERROR, "Weapons", "Config Validation", "Missing weapons config file: %s", pathweapons); return; } @@ -116,16 +113,10 @@ WeaponsLoad() */ WeaponsValidateConfig() { - // If log flag check fails, then don't log. - if (!LogCheckFlag(LOG_CORE_EVENTS, LOG_MODULE_WEAPONS)) - { - return; - } - KvRewind(kvWeapons); if (!KvGotoFirstSubKey(kvWeapons)) { - LogMessageFormatted(-1, "Weapons", "Config Validation", "No weapons listed in weapons.txt.", LOG_FORMAT_TYPE_ERROR); + LogPrintToLog(LOG_FORMAT_TYPE_ERROR, "Weapons", "Config Validation", "No weapons listed in weapons.txt."); } } diff --git a/src/zr/zadmin.inc b/src/zr/zadmin.inc index 7db926c..287c551 100644 --- a/src/zr/zadmin.inc +++ b/src/zr/zadmin.inc @@ -17,7 +17,7 @@ bool:ZRAdminMenu(client) { if (!ZRIsClientAdmin(client)) { - ZR_PrintToChat(client, "Must be admin"); + TranslationPrintToChat(client, "Must be admin"); return false; } @@ -504,76 +504,14 @@ ZRLogFlagsMenu(client) SetMenuTitle(menu_log_flags, "%t\n ", "!zadmin log flags title"); - new client_flags = GetUserFlagBits(client); - new item_state = (client_flags & ADMFLAG_ROOT) ? ITEMDRAW_DEFAULT : ITEMDRAW_DISABLED; + //new client_flags = GetUserFlagBits(client); + //new item_state = (client_flags & ADMFLAG_ROOT) ? ITEMDRAW_DEFAULT : ITEMDRAW_DISABLED; - 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]; - decl String:z_log_ignore_console[64]; - decl String:z_log_modules_enabled[64]; - decl String:z_log_module_zombie[64]; - decl String:z_log_module_ambientsounds[64]; - decl String:z_log_module_overlays[64]; - decl String:z_log_module_saytriggers[64]; - decl String:z_log_module_teleport[64]; - decl String:z_log_module_classes[64]; - decl String:z_log_module_weapons[64]; - decl String:z_log_module_hitgroups[64]; - decl String:z_log_module_commands[64]; - decl String:z_log_module_anticamp[64]; - decl String:z_log_module_damage[64]; - decl String:z_log_module_offsets[64]; - - Format(z_log_core, sizeof(z_log_core), "Log core events (%d)", LogCheckFlag(LOG_CORE_EVENTS)); - Format(z_log_game, sizeof(z_log_game), "Log game events (%d)", LogCheckFlag(LOG_GAME_EVENTS)); - Format(z_log_player, sizeof(z_log_player), "Log player commands (%d)", LogCheckFlag(LOG_PLAYER_COMMANDS)); - Format(z_log_debug, sizeof(z_log_debug), "Log debug messages (%d)", LogCheckFlag(LOG_DEBUG)); - Format(z_log_debug_detail, sizeof(z_log_debug_detail), "Log detailed debug messages (%d)", LogCheckFlag(LOG_DEBUG_DETAIL)); - Format(z_log_debug_max, sizeof(z_log_debug_max), "Log low level debug messages (%d)", LogCheckFlag(LOG_DEBUG_MAX_DETAIL)); - Format(z_log_admins, sizeof(z_log_admins), "Also log to admin chat (%d)", LogCheckFlag(LOG_TO_ADMINS)); - Format(z_log_client, sizeof(z_log_client), "Also log to client console (%d)", LogCheckFlag(LOG_TO_CLIENT)); - Format(z_log_ignore_console, sizeof(z_log_ignore_console), "Don't log messages from the console (%d)", LogCheckFlag(LOG_IGNORE_CONSOLE)); - Format(z_log_modules_enabled, sizeof(z_log_modules_enabled), "Module based log control (%d)", LogCheckFlag(LOG_MODULES_ENABLED)); - Format(z_log_module_zombie, sizeof(z_log_module_zombie), "Zombie (%d)", LogCheckFlag(LOG_MODULE_ZOMBIE)); - Format(z_log_module_ambientsounds, sizeof(z_log_module_ambientsounds), "Ambient Sounds (%d)", LogCheckFlag(LOG_MODULE_AMBIENTSOUNDS)); - Format(z_log_module_overlays, sizeof(z_log_module_overlays), "Overlays (%d)", LogCheckFlag(LOG_MODULE_OVERLAYS)); - Format(z_log_module_saytriggers, sizeof(z_log_module_saytriggers), "Chat commands (%d)", LogCheckFlag(LOG_MODULE_SAYTRIGGERS)); - Format(z_log_module_teleport, sizeof(z_log_module_teleport), "Teleporter (%d)", LogCheckFlag(LOG_MODULE_TELEPORT)); - Format(z_log_module_classes, sizeof(z_log_module_classes), "Classes (%d)", LogCheckFlag(LOG_MODULE_CLASSES)); - Format(z_log_module_weapons, sizeof(z_log_module_weapons), "Weapons (%d)", LogCheckFlag(LOG_MODULE_WEAPONS)); - Format(z_log_module_hitgroups, sizeof(z_log_module_hitgroups), "Hitgroups (%d)", LogCheckFlag(LOG_MODULE_HITGROUPS)); - Format(z_log_module_commands, sizeof(z_log_module_commands), "Admin commands (%d)", LogCheckFlag(LOG_MODULE_COMMANDS)); - Format(z_log_module_anticamp, sizeof(z_log_module_anticamp), "Anticamp (%d)", LogCheckFlag(LOG_MODULE_ANTICAMP)); - Format(z_log_module_damage, sizeof(z_log_module_damage), "Damage (Suicide Intercept) (%d)", LogCheckFlag(LOG_MODULE_DAMAGE)); - Format(z_log_module_offsets, sizeof(z_log_module_offsets), "Offsets (properties) (%d)", LogCheckFlag(LOG_MODULE_OFFSETS)); + //decl String:z_log_core[64]; - AddMenuItem(menu_log_flags, z_log_core, z_log_core, item_state); - AddMenuItem(menu_log_flags, z_log_game, z_log_game, item_state); - AddMenuItem(menu_log_flags, z_log_player, z_log_player, item_state); - AddMenuItem(menu_log_flags, z_log_debug, z_log_debug, item_state); - AddMenuItem(menu_log_flags, z_log_debug_detail, z_log_debug_detail, item_state); - AddMenuItem(menu_log_flags, z_log_debug_max, z_log_debug_max, item_state); - AddMenuItem(menu_log_flags, z_log_admins, z_log_admins); - AddMenuItem(menu_log_flags, z_log_client, z_log_client); - AddMenuItem(menu_log_flags, z_log_ignore_console, z_log_ignore_console, item_state); - AddMenuItem(menu_log_flags, z_log_modules_enabled, z_log_modules_enabled, item_state); - AddMenuItem(menu_log_flags, z_log_module_zombie, z_log_module_zombie, item_state); - AddMenuItem(menu_log_flags, z_log_module_ambientsounds, z_log_module_ambientsounds, item_state); - AddMenuItem(menu_log_flags, z_log_module_overlays, z_log_module_overlays, item_state); - AddMenuItem(menu_log_flags, z_log_module_saytriggers, z_log_module_saytriggers, item_state); - AddMenuItem(menu_log_flags, z_log_module_teleport, z_log_module_teleport, item_state); - AddMenuItem(menu_log_flags, z_log_module_classes, z_log_module_classes, item_state); - AddMenuItem(menu_log_flags, z_log_module_weapons, z_log_module_weapons, item_state); - AddMenuItem(menu_log_flags, z_log_module_commands, z_log_module_commands, item_state); - AddMenuItem(menu_log_flags, z_log_module_anticamp, z_log_module_anticamp, item_state); - AddMenuItem(menu_log_flags, z_log_module_damage, z_log_module_damage, item_state); - AddMenuItem(menu_log_flags, z_log_module_offsets, z_log_module_offsets, item_state); + //Format(z_log_core, sizeof(z_log_core), "Log core events (%d)", LogCheckFlag(LOG_CORE_EVENTS)); + + //AddMenuItem(menu_log_flags, z_log_core, z_log_core, item_state); SetMenuExitBackButton(menu_log_flags, true); DisplayMenu(menu_log_flags, client, MENU_TIME_FOREVER); @@ -585,116 +523,6 @@ public ZRLogFlagsMenuHandle(Handle:menu_log_flags, MenuAction:action, client, sl { switch(slot) { - case 0: - { - LogToggleFlag(LOG_CORE_EVENTS); - ZRLogFlagsMenu(client); - } - case 1: - { - LogToggleFlag(LOG_GAME_EVENTS); - ZRLogFlagsMenu(client); - } - case 2: - { - LogToggleFlag(LOG_PLAYER_COMMANDS); - ZRLogFlagsMenu(client); - } - case 3: - { - LogToggleFlag(LOG_DEBUG); - ZRLogFlagsMenu(client); - } - case 4: - { - LogToggleFlag(LOG_DEBUG_DETAIL); - ZRLogFlagsMenu(client); - } - case 5: - { - LogToggleFlag(LOG_DEBUG_MAX_DETAIL); - ZRLogFlagsMenu(client); - } - case 6: - { - LogToggleFlag(LOG_TO_ADMINS); - ZRLogFlagsMenu(client); - } - case 7: - { - LogToggleFlag(LOG_TO_CLIENT); - ZRLogFlagsMenu(client); - } - case 8: - { - LogToggleFlag(LOG_IGNORE_CONSOLE); - ZRLogFlagsMenu(client); - } - case 9: - { - LogToggleFlag(LOG_MODULES_ENABLED); - ZRLogFlagsMenu(client); - } - case 10: - { - LogToggleFlag(LOG_MODULE_ZOMBIE); - ZRLogFlagsMenu(client); - } - case 11: - { - LogToggleFlag(LOG_MODULE_AMBIENTSOUNDS); - ZRLogFlagsMenu(client); - } - case 12: - { - LogToggleFlag(LOG_MODULE_OVERLAYS); - ZRLogFlagsMenu(client); - } - case 13: - { - LogToggleFlag(LOG_MODULE_SAYTRIGGERS); - ZRLogFlagsMenu(client); - } - case 14: - { - LogToggleFlag(LOG_MODULE_TELEPORT); - ZRLogFlagsMenu(client); - } - case 15: - { - LogToggleFlag(LOG_MODULE_CLASSES); - ZRLogFlagsMenu(client); - } - case 16: - { - LogToggleFlag(LOG_MODULE_WEAPONS); - ZRLogFlagsMenu(client); - } - case 17: - { - LogToggleFlag(LOG_MODULE_HITGROUPS); - ZRLogFlagsMenu(client); - } - case 18: - { - LogToggleFlag(LOG_MODULE_COMMANDS); - ZRLogFlagsMenu(client); - } - case 19: - { - LogToggleFlag(LOG_MODULE_ANTICAMP); - ZRLogFlagsMenu(client); - } - case 20: - { - LogToggleFlag(LOG_MODULE_DAMAGE); - ZRLogFlagsMenu(client); - } - case 21: - { - LogToggleFlag(LOG_MODULE_OFFSETS); - ZRLogFlagsMenu(client); - } } } if (action == MenuAction_Cancel) diff --git a/src/zr/zhp.inc b/src/zr/zhp.inc index ebffd8c..52a9cd2 100644 --- a/src/zr/zhp.inc +++ b/src/zr/zhp.inc @@ -132,7 +132,7 @@ bool:ZHPToggle(client) if (!zhp) { // Tell client feature is disabled. - ZR_PrintToChat(client, "Feature is disabled"); + TranslationPrintToChat(client, "Feature is disabled"); // Stop. return false; @@ -141,12 +141,12 @@ bool:ZHPToggle(client) // If ZHP is enabled, then tell client it's being disabled. if (pZHP[client]) { - ZR_PrintToChat(client, "ZHP disable"); + TranslationPrintToChat(client, "ZHP disable"); } // If ZHP is disabled, then tell client it's being enabled. else { - ZR_PrintToChat(client, "ZHP enable"); + TranslationPrintToChat(client, "ZHP enable"); // Update HP display. ZHPUpdateHUD(client); @@ -186,7 +186,7 @@ ZHPUpdateHUD(client) } // Display HP - ZR_HudHint(client, "Display HP", health); + TranslationPrintHUDText(client, "Display HP", health); } /** diff --git a/src/zr/zombiereloaded.inc b/src/zr/zombiereloaded.inc index 18aacb0..87b48e1 100644 --- a/src/zr/zombiereloaded.inc +++ b/src/zr/zombiereloaded.inc @@ -10,6 +10,11 @@ * ============================================================================ */ +/** + * Index of server console. + */ +#define ZR_CONSOLE_INDEX 0 + /** * @section Conversion factors. */ @@ -43,7 +48,7 @@ Float:ZRConvertUnitsFloat(Float:number, Float:conversion) * on it when finished! * @param immunity True to ignore clients immune from mother infect, false to count them. */ -ZRCreateEligibleClientList(&Handle:arrayEligibleClients, bool:team = false, bool:alive = false, bool:human = false) +stock ZRCreateEligibleClientList(&Handle:arrayEligibleClients, bool:team = false, bool:alive = false, bool:human = false) { // Create array. arrayEligibleClients = CreateArray(); @@ -90,7 +95,7 @@ ZRCreateEligibleClientList(&Handle:arrayEligibleClients, bool:team = false, bool * @param console True to include console (index 0), false if not. * @return True if client is valid, false otherwise. */ -bool:ZRIsClientValid(client, bool:console = false) +stock bool:ZRIsClientValid(client, bool:console = false) { // If index is greater than max number of clients, then return false. if (client > MaxClients) @@ -102,6 +107,19 @@ bool:ZRIsClientValid(client, bool:console = false) return console ? (client >= 0) : (client > 0); } +/** + * Check if a given index is console. + * + * @param client The client index. + * @param console True to include console (index 0), false if not. + * @return True if client is valid, false otherwise. + */ +stock bool:ZRIsConsole(index) +{ + // Return true if index is = to console's index. + return (index == ZR_CONSOLE_INDEX); +} + /** * Count clients on each team. * @@ -110,7 +128,7 @@ bool:ZRIsClientValid(client, bool:console = false) * @param alive If true it will only count live players, false will count alive and dead. * @return True if successful (zombie has spawned), false otherwise. */ -bool:ZRCountValidClients(&zombiecount = 0, &humancount = 0, bool:alive = true, bool:ignorezombiespawned = false) +stock bool:ZRCountValidClients(&zombiecount = 0, &humancount = 0, bool:alive = true, bool:ignorezombiespawned = false) { // If zombie hasn't spawned and were not only counting humans, then stop. if (!g_bZombieSpawned && !ignorezombiespawned) @@ -161,7 +179,7 @@ bool:ZRCountValidClients(&zombiecount = 0, &humancount = 0, bool:alive = true, b * @param team Team to check if player is on, -1 to check both. * @return True if client is on a team, false otherwise. */ -bool:ZRIsClientOnTeam(client, team = -1) +stock bool:ZRIsClientOnTeam(client, team = -1) { // If index is invalid, then stop. if (!ZRIsClientValid(client)) @@ -185,7 +203,7 @@ bool:ZRIsClientOnTeam(client, team = -1) * * @param team (Optional) Team to check if there are clients on. */ -bool:ZRTeamHasClients(team = -1) +stock bool:ZRTeamHasClients(team = -1) { // If team is if (team == -1) @@ -204,7 +222,7 @@ bool:ZRTeamHasClients(team = -1) * @param client The client index. * @return True if generic admin, false otherwise. */ -bool:ZRIsClientAdmin(client) +stock bool:ZRIsClientAdmin(client) { // If index is invalid, then stop. if (!ZRIsClientValid(client)) diff --git a/src/zr/zspawn.inc b/src/zr/zspawn.inc index 63fcf19..3360e59 100644 --- a/src/zr/zspawn.inc +++ b/src/zr/zspawn.inc @@ -132,7 +132,7 @@ bool:ZSpawnClient(client) new bool:zspawn = GetConVarBool(g_hCvarsList[CVAR_ZSPAWN]); if (!zspawn) { - ZR_PrintToChat(client, "Feature is disabled"); + TranslationPrintToChat(client, "Feature is disabled"); return false; } @@ -140,7 +140,7 @@ bool:ZSpawnClient(client) if (!ZRIsClientOnTeam(client)) { // Tell client the command may only be used when on a team. - ZR_PrintToChat(client, "Must be on team"); + TranslationPrintToChat(client, "Must be on team"); return false; } @@ -148,7 +148,7 @@ bool:ZSpawnClient(client) if (IsPlayerAlive(client)) { // Tell client the command may only be used when dead. - ZR_PrintToChat(client, "Must be dead"); + TranslationPrintToChat(client, "Must be dead"); return false; } @@ -156,7 +156,7 @@ bool:ZSpawnClient(client) if (SerialClientExists(client)) { // Tell client the command may only be used when joining late. - ZR_PrintToChat(client, "ZSpawn double spawn"); + TranslationPrintToChat(client, "ZSpawn double spawn"); return false; } @@ -170,7 +170,7 @@ bool:ZSpawnClient(client) new Float:zspawntime = GetConVarFloat(g_hCvarsList[CVAR_ZSPAWN_TIMELIMIT_TIME]); // Tell client the timelimit for this command has expired. - ZR_PrintToChat(client, "ZSpawn timelimit", RoundToNearest(zspawntime)); + TranslationPrintToChat(client, "ZSpawn timelimit", RoundToNearest(zspawntime)); return false; } } diff --git a/src/zr/ztele.inc b/src/zr/ztele.inc index d6a8979..d0a8c6f 100644 --- a/src/zr/ztele.inc +++ b/src/zr/ztele.inc @@ -124,7 +124,7 @@ bool:ZTeleClient(client) if (infected && !ztelezombie) { // Tell client they must be human to use this feature. - ZR_PrintToChat(client, "Must be human"); + TranslationPrintToChat(client, "Must be human"); return false; } @@ -134,7 +134,7 @@ bool:ZTeleClient(client) if (!infected && !ztelehuman) { // Tell client that feature is restricted at this time. - ZR_PrintToChat(client, "ZTele restricted human"); + TranslationPrintToChat(client, "ZTele restricted human"); return false; } @@ -143,14 +143,14 @@ bool:ZTeleClient(client) if (g_iZTeleCount[client] >= ztelemax) { // Tell client that they have already reached their limit. - ZR_PrintToChat(client, "ZTele max", ztelemax); + TranslationPrintToChat(client, "ZTele max", ztelemax); return false; } // If teleport is already in progress, then stop. if (tZTele[client] != INVALID_HANDLE) { - ZR_PrintToChat(client, "ZTele in progress"); + TranslationPrintToChat(client, "ZTele in progress"); return false; } @@ -168,7 +168,7 @@ bool:ZTeleClient(client) if (g_iZTeleTimeLeft[client] > 0) { // Tell client how much time is left until teleport. - ZR_PrintCenterText(client, "ZTele countdown", g_iZTeleTimeLeft[client]); + TranslationPrintCenterText(client, "ZTele countdown", g_iZTeleTimeLeft[client]); // Start repeating timer. tZTele[client] = CreateTimer(1.0, ZTeleTimer, client, TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); @@ -182,7 +182,7 @@ bool:ZTeleClient(client) TeleportEntity(client, g_vecZTeleSpawn[client], NULL_VECTOR, NULL_VECTOR); // Tell client they've been teleported. - ZR_PrintCenterText(client, "ZTele countdown end", g_iZTeleCount[client], ztelemax); + TranslationPrintCenterText(client, "ZTele countdown end", g_iZTeleCount[client], ztelemax); // Increment teleport count. g_iZTeleCount[client]++; @@ -225,8 +225,8 @@ public Action:ZTeleTimer(Handle:timer, any:client) tZTele[client] = INVALID_HANDLE; // Tell client teleport has been cancelled. - ZR_PrintCenterText(client, "ZTele autocancel centertext"); - ZR_PrintToChat(client, "ZTele autocancel text", RoundToNearest(autocanceldistance)); + TranslationPrintCenterText(client, "ZTele autocancel centertext"); + TranslationPrintToChat(client, "ZTele autocancel text", RoundToNearest(autocanceldistance)); // Stop timer. return Plugin_Stop; @@ -237,7 +237,7 @@ public Action:ZTeleTimer(Handle:timer, any:client) g_iZTeleTimeLeft[client]--; // Tell client how much time is left until teleport. - ZR_PrintCenterText(client, "ZTele countdown", g_iZTeleTimeLeft[client]); + TranslationPrintCenterText(client, "ZTele countdown", g_iZTeleTimeLeft[client]); // Time has expired. if (g_iZTeleTimeLeft[client] <= 0) @@ -252,7 +252,7 @@ public Action:ZTeleTimer(Handle:timer, any:client) new ztelemax = InfectIsClientInfected(client) ? GetConVarInt(g_hCvarsList[CVAR_ZTELE_MAX_ZOMBIE]) : GetConVarInt(g_hCvarsList[CVAR_ZTELE_MAX_HUMAN]); // Tell client spawn protection is over. - ZR_PrintCenterText(client, "ZTele countdown end", g_iZTeleCount[client], ztelemax); + TranslationPrintCenterText(client, "ZTele countdown end", g_iZTeleCount[client], ztelemax); // Clear timer handle. tZTele[client] = INVALID_HANDLE; From 6d09157719934864c1c5afcb49c6cf63bd2f1aa6 Mon Sep 17 00:00:00 2001 From: Greyscale Date: Fri, 15 May 2009 07:25:07 +0200 Subject: [PATCH 3/4] Did all cvar descriptions, made spawn protect detect when client needs to be protected more accurately, bunnyhop protect put into a cvar. --- .../zombiereloaded/zombiereloaded.base.cfg | 50 ++ .../zombiereloaded/zombiereloaded.cfg | 436 ------------------ src/zombiereloaded.sp | 2 +- src/zr/cvars.inc | 272 +++++------ src/zr/event.inc | 17 + src/zr/jumpboost.inc | 14 +- src/zr/playerclasses/classmenus.inc | 2 +- src/zr/respawn.inc | 12 - src/zr/spawnprotect.inc | 69 +-- src/zr/visualeffects.inc | 18 +- 10 files changed, 234 insertions(+), 658 deletions(-) create mode 100644 cstrike/cfg/sourcemod/zombiereloaded/zombiereloaded.base.cfg delete mode 100644 cstrike/cfg/sourcemod/zombiereloaded/zombiereloaded.cfg diff --git a/cstrike/cfg/sourcemod/zombiereloaded/zombiereloaded.base.cfg b/cstrike/cfg/sourcemod/zombiereloaded/zombiereloaded.base.cfg new file mode 100644 index 0000000..8680c29 --- /dev/null +++ b/cstrike/cfg/sourcemod/zombiereloaded/zombiereloaded.base.cfg @@ -0,0 +1,50 @@ +// /* +// * ============================================================================ +// * +// * Zombie:Reloaded +// * +// * File: zombiereloaded.cfg +// * Type: Core +// * Description: Plugin cvar configuration. +// * +// * ============================================================================ +// */ +// +// +// Notes +// --------------------------------------------------------------------------- +// All notes are generalities, exceptions will be noted in appropriate place. +// --------------------------------------------------------------------------- +// * All units of time are read in seconds. +// * ... +// --------------------------------------------------------------------------- +// Format: +// +// Default: "" +// "" +// --------------------------------------------------------------------------- +// Description: +// " [ = '' | ...]" +// OR +// " [: | ...]" +// +// Specifications: +// These are specific values that the cvar can be set to. Used to illustrate +// the scale of a cvar, min/max values, etc. +// +// Meaning: +// The description of what the specification does. +// +// Flag: +// Includes any of the following: +// * "Dependency" - Means this cvar relies on another cvar to be enabled. +// E.G. Has no effect until its dependencies are enabled. +// * "Delimiter" - Separate each item by this given character. +// * "Override" - Means this cvar overrides another if enabled. +// * "Recommended" - Means another cvar is recommended to be enabled if this +// one is. +// ... +// +// Value: +// The value of the flag. Usually a referenced cvar. +// --------------------------------------------------------------------------- \ No newline at end of file diff --git a/cstrike/cfg/sourcemod/zombiereloaded/zombiereloaded.cfg b/cstrike/cfg/sourcemod/zombiereloaded/zombiereloaded.cfg deleted file mode 100644 index abb73ff..0000000 --- a/cstrike/cfg/sourcemod/zombiereloaded/zombiereloaded.cfg +++ /dev/null @@ -1,436 +0,0 @@ -// ============================================================================ -// -// Zombie:Reloaded -// Main configuration -// -// Check section 3.0 in the manual for detailed info. -// -// ============================================================================ - -// ------------------------------------ -// -// Standard Counter-Strike Settings -// -// ------------------------------------ - -// The length of the round, in minutes. If there are any humans left after this -// time is up, humans win. -// - -// Default: "5" -mp_roundtime "5" - -// Allows players to move items with their "use" key. Disabled by default -// because players sometimes get stuck. -// - -// Default: "0" -sv_turbophysics "0" - -// Multiplier for how easy props are moved. -// - -// Default: "3" -phys_pushscale 3 - -// Ammo settings -ammo_50AE_max 500 // deagle -ammo_762mm_max 300 // scout, ak47, g3sg1, aug -ammo_556mm_box_max 300 // m249 -ammo_556mm_max 300 // galil, sg552, famas, m4a1, sg550 -ammo_338mag_max 100 // awp -ammo_9mm_max 500 // mp5navy, tmp, glock, elite -ammo_buckshot_max 128 // m3, xm1014 -ammo_45acp_max 500 // ump45, mac10, usp -ammo_357sig_max 500 // P228 -ammo_57mm_max 500 // p90, fiveseven - - -// ------------------------------------ -// -// Weapon Restrictions (Deprecated) -// -// ------------------------------------ - - -// ------------------------------------ -// -// General -// -// ------------------------------------ - -// Enable zombie gameplay -// - -// Default: "1" -zr_enable "1" - -// Logging flags. See manual for details. -// - -// Default: "323" -zr_log "323" - -// This will allow the player_team event to be fired on first team join. Enable -// if using mani admin model menu. -// - -// Default: "0" -zr_allow_player_team "0" - -// Give players cash on spawn. -// - -// Default: "1" -zr_cashfill "1" - -// How much money players will have when they spawn, if cash fill is turned on. -// - -// Default: "16000" -zr_cashamount "16000" - -// Block suicide attempts on humans. -// - -// Default: "1" -zr_suicide_human "1" - -// Block suicide attempts on zombies. -// - -// Default: "1" -zr_suicide_zombie "1" - -// Log suicide attempts to admin chat. (Deprecated. Use the log system.) -// - -// Default: "0" -zr_suicide_echo "0" - -// Respawn zombies as zombies if they were killed by world damage, like doors, -// elevators and lasers. -// - -// Default: "1" -zr_suicide_world_damage "1" - -// Spawn protection time on players that join late. -// - -// Default: "15" -zr_protect "15" - - -// ------------------------------------ -// -// Zombie Gameplay -// -// ------------------------------------ - -// Maximum time, in seconds, a player is picked to be zombie after the round -// starts. -// - -// Default: "50" -zr_spawn_max "50" - -// Minimum time, in seconds, a player is picked to be zombie after the round -// starts. -// - -// Default: "30" -zr_spawn_min "30" - -// Mother zombie ratio. For every "n" number of humans, there will be one -// zombie. (0: Always only 1 mother zombie) -// - -// Default: "8" -zr_mother_zombie_ratio "8" - -// The first zombie(s) will be teleported back to spawn on first infection. -// - -// Default: "0" -zr_mother_zombie_respawn "0" - -// Allow player to be randomly chosen twice in a row to be a mother zombie. -// - -// Default: "0" -zr_consecutive_infect "0" - - -// ------------------------------------ -// -// Zombie Info (deprecated) -// -// ------------------------------------ - -// The default health of a zombie -zr_zombie_health "5000" - -// How fast zombies travel (300: Default speed, 600: Double speed) -zr_zombie_speed "350" - -// How far the zombie jumps, (0: Regular jump distance) -zr_zombie_jump_distance "0.1" - -// How high a zombie jumps (0: Regular jump height) -zr_zombie_jump_height "10.0" - -// How far zombies are pushed back when shot. If classes are enabled: This one is a multiplier for class knockback values. (1: Default) -zr_zombie_knockback "1" - -// Zombies will be equipped with nightvision. Also used to override class nvgs if non-negative. (-1: No override/Nvgs on, 0: No nvgs, 1: Nvgs on) -zr_zombie_nvgs "-1" - -// The field of vision of zombies (90: Default vision) -zr_zombie_fov "110" - -// Zombies will regenerate health -zr_zombie_regen "0" - -// How much health is regenerated when zr_zombie_regen is 1 -zr_zombie_regen_health "1" - -// How often, in seconds, a zombie regenerates health when zr_zombie_regen is 1 -zr_zombie_regen_interval "5" - -// Turns grenades into napalm grenades that light zombies on fire (0: Disable) -zr_zombie_napalm "1" - -// How long the zombie burns when zr_napalm is 1 -zr_zombie_napalm_time "20" - -// Zombies wont be hurt from falling (0: Disable) -zr_zombie_nofalldamage "0" - -// How many additional kills are rewarded to the killer of the zombie -zr_zombie_kill_bonus "2" - -// How much health a zombie gains when infecting a human (0: Disable) -zr_zombie_infect_health "100" - -// Overlay to be shown on all zombies' screen on infection (Leave empty to disable) -zr_zombie_zvision "overlays/zr/zvision" - - -// ------------------------------------ -// -// Infection Effects -// -// ------------------------------------ - -// An energy splash is emitted when player is infected. -// - -// Default: "1" -zr_infect_esplash "1" - -// A fireball is created when a player is infected. -// - -// Default: "1" -zr_infect_fireball "1" - -// Sound played from from player on infection. Leave blank to disable. -// - -// Default: "npc/fast_zombie/fz_scream1.wav" -zr_infect_sound "npc/fast_zombie/fz_scream1.wav" - -// A puff of smoke is created when a player is infected. -// - -// Default: "1" -zr_infect_smoke "1" - -// Sparks are emitted when a player is infected. -// - -// Default: "1" -zr_infect_sparks "1" - -//Player's screen is shaken on infection. -// - -// Default: "1" -zr_infect_shake "1" - -// Amplitude of the shake, when shake is enabled. -// - -// Default: "15.0" -zr_infect_shake_amp "15.0" - -// Frequency of the shake, when shake is enabled. -// - -// Default: "1.0" -zr_infect_shake_frequency "1.0" - -// Duration of the shake, when shake is enabled. -// - -// Default: "5.0" -zr_infect_shake_duration "5.0" - - -// ------------------------------------ -// -// Classes -// -// ------------------------------------ - -// Enable zombie classes. (Deprecated) -zr_classes "1" - -// A random class is assigned to each player every round (0: Disable) -// - -// Default: "0" -zr_classes_random "0" - -// Classmenu is re-displayed every spawn (0: Disable) -// - -// Default: "0" -zr_classes_spawn "0" - -// The default class for zombies. (Deprecated) -zr_classes_default "classic" - - -// ------------------------------------ -// -// Ambience -// -// ------------------------------------ - -// Enable creepy ambience to be played throughout the game (0: Disable) -// - -// Default: "1" -zr_ambience "1" - -// Path to ambient sound file that will be played throughout the game, when -// ambience is enabled. -// - -// Default: "ambient/zr/zr_ambience.mp3" -zr_ambience_file "ambient/zr/zr_ambience.mp3" - -// The length, in seconds, of the ambience sound file. -// - -// Default: "60.0" -zr_ambience_length "60.0" - -// Volume of ambience sound when ambience is enabled. (0.0: Unhearable, -// 1.0: Max volume) -// - -// Default: "0.8" -zr_ambience_volume "0.8" - -// Make maps dark. (0: Disable) -// - -// Default: "0" -zr_dark "0" - -// The darkness of the map, a being the darkest, z being extremely bright. -// - -// Default: "n" -zr_dark_level "n" - -// The sky the map will have when darkness is enabled. -// - -// Default: "sky_borealis01" -zr_dark_sky "sky_borealis01" - -// How often a zombie emits a sound, in seconds. (0: Disable) -// - -// Default: "50" -zr_emitsounds "50" - - -// ------------------------------------ -// -// Overlays -// -// ------------------------------------ - -// Will show overlays that tell who the winner of the round was (0: Disable) -// - -// Default: "1" -zr_overlays "1" - -// Overlay for humans win event. -// - -// Default: "overlays/zr/humans_win" -zr_overlays_human "overlays/zr/humans_win" - -// Overlay for zombies win event. -// - -// Default: "overlays/zr/zombies_win" -zr_overlays_zombie "overlays/zr/zombies_win" - -// Frequency, in seconds, to re-display overlay on the client's screen. -// - -// Default: "3" -zr_overlay_redisplay "3" - -// Allow players to disable overlays with their nightvision key (0: Disable) -// - -// Default: "1" -zr_zvision_allow_disable "1" - - -// ------------------------------------ -// -// Respawn -// -// ------------------------------------ - -// Respawn players when they die. -// - -// Default: "1" -zr_respawn "1" - -// How long to wait after death to respawn, in seconds. -// - -// Default: "1" -zr_respawn_delay "1" - -// Which team to respawn player as. (Choices: zombie, human) -// - -// Default: "human" -zr_respawn_team "human" - - -// ------------------------------------ -// -// Commands -// -// ------------------------------------ - -// Must be in buyzone to access !zmarket, if Market is installed. -// - -// Default: "1" -zr_zmarket_buyzone "1" - -// Allow players to spawn if they just joined the game. (0: Disable) -// - -// Default: "1" -zr_zspawn "1" - -// Startup delay for the deleporter. (0: Disable) -// - -// Default: "20" -zr_tele_startup_delay "20" - -// Cooldown delay before a teleport can be done again. (0: Disable) -// - -// Default: "15" -zr_tele_cooldown "15" - -// Teleport delays for humans. (0: Disable) -// - -// Default: "10" -zr_tele_human_delay "10" - -// Teleport delays for zombies. (0: Disable) -// - -// Default: "0" -zr_tele_zombie_delay "0" - -// Teleport limits for humans per round. (0: Not allowed to teleport, -// -1: Unlimited) -// - -// Default: "3" -zr_tele_human_limit "3" - -// Teleport limits for zombies per round. (0: Not allowed to teleport, -// -1: Unlimited) -// - -// Default: "8" -zr_tele_zombie_limit "8" - -// Allows clients to disable zombie health display. -// - -// Default: "1" -zr_zhp "1" - -// The default value of zombie health display to new clients. -// - -// Default: "1" -zr_zhp_default "1" diff --git a/src/zombiereloaded.sp b/src/zombiereloaded.sp index fb16fd5..51f28ca 100644 --- a/src/zombiereloaded.sp +++ b/src/zombiereloaded.sp @@ -53,10 +53,10 @@ #include "zr/spawnprotect" #include "zr/respawn" #include "zr/napalm" +#include "zr/jumpboost" #include "zr/zspawn" #include "zr/ztele" #include "zr/zhp" -#include "zr/jumpboost" //#include "zr/anticamp" // Almost replaced! :) diff --git a/src/zr/cvars.inc b/src/zr/cvars.inc index ff8a184..3ba234c 100644 --- a/src/zr/cvars.inc +++ b/src/zr/cvars.inc @@ -45,6 +45,7 @@ enum CvarsList Handle:CVAR_CLASSES_DEFAULT_ZOMBIE, Handle:CVAR_CLASSES_DEFAULT_HUMAN, Handle:CVAR_CLASSES_DEFAULT_ADMIN, + Handle:CVAR_CLASSES_MENU_AUTOCLOSE, Handle:CVAR_CLASSES_OVERLAY_TOGGLE, Handle:CVAR_CLASSES_OVERLAY_TOGGLECMDS, Handle:CVAR_CLASSES_OVERLAY_DEFAULT, @@ -112,6 +113,7 @@ enum CvarsList Handle:CVAR_RESPAWN_DELAY, Handle:CVAR_RESPAWN_TEAM_ZOMBIE, Handle:CVAR_RESPAWN_TEAM_ZOMBIE_WORLD, + Handle:CVAR_JUMPBOOST_BUNNYHOP_PROTECT, Handle:CVAR_ZSPAWN, Handle:CVAR_ZSPAWN_TEAM_OVERRIDE, Handle:CVAR_ZSPAWN_TEAM_ZOMBIE, @@ -128,11 +130,6 @@ enum CvarsList Handle:CVAR_ZTELE_AUTOCANCEL_DISTANCE, Handle:CVAR_ZHP, Handle:CVAR_ZHP_DEFAULT, - - // To be modulized/recoded. - Handle:CVAR_MENU_AUTOCLOSE, - Handle:CVAR_ANTICAMP, - Handle:CVAR_ANTICAMP_UPDATE_INTERVAL, } /** @@ -180,21 +177,6 @@ CvarsInit() */ CvarsCreate() { - // Cvar naming guidelines: - // 1. Prefix: "zr_" - // 2. Module name next. "zr_modulename_" - // 3. (If applys) Submodule name next. "zr_modulename_submodulename_" Ex "zr_weapons_restrict_" - // 4. Name last part to be defaulted to "1" (if boolean cvar) Ex "zr_damage_suicide_zombie", - // because it will be defaulted to "1". "zr_damage_suicide_zombie_disable" = bad. Because we want - // to try to default everything to "1" and let hosts disable what they don't want. - // - // Cvar description guidelines - // Assume cvar is enabled. - // Ex. "zr_roundend_overlay" "1" "Display round win overlays to all clients." - // Explain (additional) options in brackets. - // Ex. "zr_classes_default_zombie" "" "Default zombie class. ['""' = Class config defaults. 'random' = Give client random class on connect.]" - // Any thing else? - // =========================== // General (Core) // =========================== @@ -206,12 +188,12 @@ CvarsCreate() // =========================== g_hCvarsList[CVAR_LOG] = CreateConVar("zr_log", "1", "Logs key actions performed by the plugin, including errors and debug."); - g_hCvarsList[CVAR_LOG_FILTER_MODULES] = CreateConVar("zr_log_filter_modules", "", "If any log module name is withinin this string, log will be suppressed."); - g_hCvarsList[CVAR_LOG_FILTER_DESCRIPTION] = CreateConVar("zr_log_filter_description", "", "If any log description is within this string, log will be suppressed."); - g_hCvarsList[CVAR_LOG_FILTER_DEBUG] = CreateConVar("zr_log_filter_debug", "1", "Supresses debug messages."); - g_hCvarsList[CVAR_LOG_PRINT_ADMINS] = CreateConVar("zr_log_print_admins", "0", "Print all logs to currently connected admins."); - g_hCvarsList[CVAR_LOG_PRINT_CHAT] = CreateConVar("zr_log_print_chat", "1", "Print log to admin's chat area."); - g_hCvarsList[CVAR_LOG_PRINT_CONSOLE] = CreateConVar("zr_log_print_console", "1", "Print log to admin's console."); + g_hCvarsList[CVAR_LOG_FILTER_MODULES] = CreateConVar("zr_log_filter_modules", "", "If any log module name is within this string, log will be suppressed. [Dependency: zr_log]"); + g_hCvarsList[CVAR_LOG_FILTER_DESCRIPTION] = CreateConVar("zr_log_filter_description", "", "If any log description is within this string, log will be suppressed. [Dependency: zr_log]"); + g_hCvarsList[CVAR_LOG_FILTER_DEBUG] = CreateConVar("zr_log_filter_debug", "1", "Supresses debug messages. [Dependency: zr_log]"); + g_hCvarsList[CVAR_LOG_PRINT_ADMINS] = CreateConVar("zr_log_print_admins", "0", "Print all logs to currently connected admins. [Dependency: zr_log]"); + g_hCvarsList[CVAR_LOG_PRINT_CHAT] = CreateConVar("zr_log_print_chat", "1", "Print log to admin's chat area. [Dependency: zr_log & zr_log_print_admins]"); + g_hCvarsList[CVAR_LOG_PRINT_CONSOLE] = CreateConVar("zr_log_print_console", "1", "Print log to admin's console. [Dependency: zr_log & zr_log_print_admins]"); // =========================== // Translations (core) @@ -223,12 +205,12 @@ CvarsCreate() // Config (core) // =========================== - g_hCvarsList[CVAR_CONFIG_PATH_MODELS] = CreateConVar("zr_config_path_models", "configs/zr/models.txt", "Path to models config file. [Relative to root sourcemod directory]"); - g_hCvarsList[CVAR_CONFIG_PATH_DOWNLOADS] = CreateConVar("zr_config_path_downloads", "configs/zr/downloads.txt", "Path to downloads file. [Relative to root sourcemod directory]"); - g_hCvarsList[CVAR_CONFIG_PATH_PLAYERCLASSES] = CreateConVar("zr_config_path_playerclasses", "configs/zr/playerclasses.txt", "Path to playerclasses config file. [Relative to root sourcemod directory]"); - g_hCvarsList[CVAR_CONFIG_PATH_WEAPONS] = CreateConVar("zr_config_path_weapons", "configs/zr/weapons/weapons.txt", "Path to weapons config file. [Relative to root sourcemod directory]"); - g_hCvarsList[CVAR_CONFIG_PATH_WEAPONGROUPS] = CreateConVar("zr_config_path_weapongroups", "configs/zr/weapons/weapongroups.txt", "Path to weapongroups config file. [Relative to root sourcemod directory]"); - g_hCvarsList[CVAR_CONFIG_PATH_HITGROUPS] = CreateConVar("zr_config_path_hitgroups", "configs/zr/hitgroups.txt", "Path to hitgroups config file. [Relative to root sourcemod directory]"); + g_hCvarsList[CVAR_CONFIG_PATH_MODELS] = CreateConVar("zr_config_path_models", "configs/zr/models.txt", "Path, relative to root sourcemod directory, to models config file."); + g_hCvarsList[CVAR_CONFIG_PATH_DOWNLOADS] = CreateConVar("zr_config_path_downloads", "configs/zr/downloads.txt", "Path, relative to root sourcemod directory, to downloads file."); + g_hCvarsList[CVAR_CONFIG_PATH_PLAYERCLASSES] = CreateConVar("zr_config_path_playerclasses", "configs/zr/playerclasses.txt", "Path, relative to root sourcemod directory, to playerclasses config file."); + g_hCvarsList[CVAR_CONFIG_PATH_WEAPONS] = CreateConVar("zr_config_path_weapons", "configs/zr/weapons/weapons.txt", "Path, relative to root sourcemod directory, to weapons config file."); + g_hCvarsList[CVAR_CONFIG_PATH_WEAPONGROUPS] = CreateConVar("zr_config_path_weapongroups", "configs/zr/weapons/weapongroups.txt", "Path, relative to root sourcemod directory, to weapongroups config file."); + g_hCvarsList[CVAR_CONFIG_PATH_HITGROUPS] = CreateConVar("zr_config_path_hitgroups", "configs/zr/hitgroups.txt", "Path, relative to root sourcemod directory, to hitgroups config file."); // =========================== // Tools (core) @@ -248,17 +230,21 @@ CvarsCreate() // General - g_hCvarsList[CVAR_CLASSES_SPAWN] = CreateConVar("zr_classes_spawn", "0", "Re-display class selection menu every spawn."); - g_hCvarsList[CVAR_CLASSES_RANDOM] = CreateConVar("zr_classes_random", "0", "Player is assigned a random class every spawn [Override: zr_classes_spawn & zr_classes_default_*]"); - g_hCvarsList[CVAR_CLASSES_DEFAULT_ZOMBIE] = CreateConVar("zr_classes_default_zombie", "random", "Zombie class assigned to players on connect ['random' = Random class | '""' = Class config default]"); - g_hCvarsList[CVAR_CLASSES_DEFAULT_HUMAN] = CreateConVar("zr_classes_default_human", "random", "Human class assigned to players on connect ['random' = Random class | '""' = Class config default]");"); - g_hCvarsList[CVAR_CLASSES_DEFAULT_ADMIN] = CreateConVar("zr_classes_default_admin", "random", "Admin class assigned to admins on connect ['random' = Random class | '""' = Class config default]");"); + g_hCvarsList[CVAR_CLASSES_SPAWN] = CreateConVar("zr_classes_spawn", "0", "Re-display class selection menu every spawn."); + g_hCvarsList[CVAR_CLASSES_RANDOM] = CreateConVar("zr_classes_random", "0", "Player is assigned a random class every spawn. [Override: zr_classes_spawn & zr_classes_default_*]"); + g_hCvarsList[CVAR_CLASSES_DEFAULT_ZOMBIE] = CreateConVar("zr_classes_default_zombie", "random", "Zombie class assigned to players on connect. ['random' = Random class | '\"\"' = Class config default]"); + g_hCvarsList[CVAR_CLASSES_DEFAULT_HUMAN] = CreateConVar("zr_classes_default_human", "random", "Human class assigned to players on connect. ['random' = Random class | '\"\"' = Class config default]"); + g_hCvarsList[CVAR_CLASSES_DEFAULT_ADMIN] = CreateConVar("zr_classes_default_admin", "random", "Admin class assigned to admins on connect. ['random' = Random class | '\"\"' = Class config default]"); + + // Menu + + g_hCvarsList[CVAR_CLASSES_MENU_AUTOCLOSE] = CreateConVar("zr_classes_menu_autoclose", "0", "Automatically close class selection menu."); // Overlays g_hCvarsList[CVAR_CLASSES_OVERLAY_TOGGLE] = CreateConVar("zr_classes_overlay_toggle", "1", "Allow players to toggle class overlay."); - g_hCvarsList[CVAR_CLASSES_OVERLAY_TOGGLECMDS] = CreateConVar("zr_classes_overlay_togglecmds", "nightvision", "List of commands to hook that players can use to toggle class overlay. [Reliance: zr_classes_overlay_toggle | Delimited by \", \"]"); - g_hCvarsList[CVAR_CLASSES_OVERLAY_DEFAULT] = CreateConVar("zr_classes_overlay_default", "0", "Default class overlay toggle state [Reliance: zr_classes_overlay_toggle]"); + g_hCvarsList[CVAR_CLASSES_OVERLAY_TOGGLECMDS] = CreateConVar("zr_classes_overlay_togglecmds", "nightvision", "List of commands to hook that players can use to toggle class overlay. [Dependency: zr_classes_overlay_toggle | Delimiter: \", \"]"); + g_hCvarsList[CVAR_CLASSES_OVERLAY_DEFAULT] = CreateConVar("zr_classes_overlay_default", "0", "Default class overlay toggle state set on connecting player. [Dependency: zr_classes_overlay_toggle]"); // =========================== // Weapons (core) @@ -266,49 +252,44 @@ CvarsCreate() // General - g_hCvarsList[CVAR_WEAPONS] = CreateConVar("zr_weapons", "1", ""); - // Note make config file cvar. - // Note this disables restrict submodule. + g_hCvarsList[CVAR_WEAPONS] = CreateConVar("zr_weapons", "1", "Enable weapons module, disabling this will disable any weapons-related features. (weapon restrictions, weapon knockback multipliers, etc)"); // Restrict - g_hCvarsList[CVAR_WEAPONS_RESTRICT] = CreateConVar("zr_weapons_restrict", "1", ""); - // Note make config file cvar. + g_hCvarsList[CVAR_WEAPONS_RESTRICT] = CreateConVar("zr_weapons_restrict", "1", "Enable weapon restriction module, disabling this will disable weapon restriction commands."); // Market Handler - g_hCvarsList[CVAR_WEAPONS_ZMARKET_BUYZONE] = CreateConVar("zr_weapons_zmarket_buyzone", "1", ""); - // Old Desc: Must be in buyzone to access !zmarket, if Market is installed (0: Can be used anywhere) + g_hCvarsList[CVAR_WEAPONS_ZMARKET_BUYZONE] = CreateConVar("zr_weapons_zmarket_buyzone", "1", "Requires player to be inside a buyzone to use ZMarket."); // =========================== // Hitgroups (core) // =========================== - g_hCvarsList[CVAR_HITGROUPS] = CreateConVar("zr_hitgroups", "1", ""); - // Note make config file cvar. + g_hCvarsList[CVAR_HITGROUPS] = CreateConVar("zr_hitgroups", "1", "Enable hitgroups module, disabling this will disable hitgroup-related features. (hitgroup knockback multipliers, hitgroup damage control)"); // =========================== // Infect (core) // =========================== - g_hCvarsList[CVAR_INFECT_MZOMBIE_RATIO] = CreateConVar("zr_infect_mzombie_ratio", "5", ""); - g_hCvarsList[CVAR_INFECT_MZOMBIE_RESPAWN] = CreateConVar("zr_infect_mzombie_respawn", "0", ""); - g_hCvarsList[CVAR_INFECT_SPAWNTIME_MIN] = CreateConVar("zr_infect_spawntime_min", "30.0", ""); - g_hCvarsList[CVAR_INFECT_SPAWNTIME_MAX] = CreateConVar("zr_infect_spawntime_max", "50.0", ""); - g_hCvarsList[CVAR_INFECT_CONSECUTIVE_BLOCK] = CreateConVar("zr_infect_consecutive_block", "1", ""); - g_hCvarsList[CVAR_INFECT_WEAPONS_DROP] = CreateConVar("zr_infect_weapons_drop", "1", ""); + g_hCvarsList[CVAR_INFECT_MZOMBIE_RATIO] = CreateConVar("zr_infect_mzombie_ratio", "5", "Number of mother zombies to infect (when infect timer is up) in proportion to number of humans on the server."); + g_hCvarsList[CVAR_INFECT_MZOMBIE_RESPAWN] = CreateConVar("zr_infect_mzombie_respawn", "0", "Teleport mother zombies back to spawn on infect."); + g_hCvarsList[CVAR_INFECT_SPAWNTIME_MIN] = CreateConVar("zr_infect_spawntime_min", "30.0", "Minimum time from the start of the round until picking the mother zombie(s)."); + g_hCvarsList[CVAR_INFECT_SPAWNTIME_MAX] = CreateConVar("zr_infect_spawntime_max", "50.0", "Maximum time from the start of the round until picking the mother zombie(s)."); + g_hCvarsList[CVAR_INFECT_CONSECUTIVE_BLOCK] = CreateConVar("zr_infect_consecutive_block", "1", "Prevent a player from being chosen as mother zombie two rounds in a row."); + g_hCvarsList[CVAR_INFECT_WEAPONS_DROP] = CreateConVar("zr_infect_weapons_drop", "1", "Force player to drop all weapons on infect, disabling this will strip weapons instead."); // Effects - g_hCvarsList[CVAR_INFECT_FIREBALL] = CreateConVar("zr_infect_fireball", "1", ""); - g_hCvarsList[CVAR_INFECT_SMOKE] = CreateConVar("zr_infect_smoke", "1", ""); - g_hCvarsList[CVAR_INFECT_SPARKS] = CreateConVar("zr_infect_sparks", "1", ""); - g_hCvarsList[CVAR_INFECT_SOUND] = CreateConVar("zr_infect_sound", "npc/fast_zombie/fz_scream1.wav", ""); - g_hCvarsList[CVAR_INFECT_ESPLASH] = CreateConVar("zr_infect_esplash", "1", ""); - g_hCvarsList[CVAR_INFECT_SHAKE] = CreateConVar("zr_infect_shake", "1", ""); - g_hCvarsList[CVAR_INFECT_SHAKE_AMP] = CreateConVar("zr_infect_shake_amp", "15.0", ""); - g_hCvarsList[CVAR_INFECT_SHAKE_FREQUENCY] = CreateConVar("zr_infect_shake_frequency", "1.0", ""); - g_hCvarsList[CVAR_INFECT_SHAKE_DURATION] = CreateConVar("zr_infect_shake_duration", "5.0", ""); + g_hCvarsList[CVAR_INFECT_FIREBALL] = CreateConVar("zr_infect_fireball", "1", "Spawn a fireball effect around player on infection."); + g_hCvarsList[CVAR_INFECT_SMOKE] = CreateConVar("zr_infect_smoke", "1", "Spawn a smoke cloud effect around player on infection."); + g_hCvarsList[CVAR_INFECT_SPARKS] = CreateConVar("zr_infect_sparks", "1", "Emit sparks from player on infection."); + g_hCvarsList[CVAR_INFECT_SOUND] = CreateConVar("zr_infect_sound", "npc/fast_zombie/fz_scream1.wav", "Sound, relative to \"sounds\" folder, to play from player on infection. ['\"\"' = No sound]"); + g_hCvarsList[CVAR_INFECT_ESPLASH] = CreateConVar("zr_infect_esplash", "1", "Emit an energy splash from player on infection."); + g_hCvarsList[CVAR_INFECT_SHAKE] = CreateConVar("zr_infect_shake", "1", "Shake player's view on infect."); + g_hCvarsList[CVAR_INFECT_SHAKE_AMP] = CreateConVar("zr_infect_shake_amp", "15.0", "Amplitude of shaking effect. [Dependency: zr_infect_shake]"); + g_hCvarsList[CVAR_INFECT_SHAKE_FREQUENCY] = CreateConVar("zr_infect_shake_frequency", "1.0", "Frequency of shaking effect. [Dependency: zr_infect_shake]"); + g_hCvarsList[CVAR_INFECT_SHAKE_DURATION] = CreateConVar("zr_infect_shake_duration", "5.0", "Duration of shaking effect. [Dependency: zr_infect_shake]"); // =========================== // Damage (core) @@ -316,66 +297,48 @@ CvarsCreate() // Hitgroup Damage - g_hCvarsList[CVAR_DAMAGE_HITGROUPS] = CreateConVar("zr_damage_hitgroups", "1", ""); + g_hCvarsList[CVAR_DAMAGE_HITGROUPS] = CreateConVar("zr_damage_hitgroups", "1", "Read hitgroup damage control from hitgroup config file, disabling this allows all zombie hitgroups to be shot."); // Block Damage Types - g_hCvarsList[CVAR_DAMAGE_BLOCK_FF] = CreateConVar("zr_damage_block_ff", "1", ""); - // note overrides mp_friendlyfire - g_hCvarsList[CVAR_DAMAGE_BLOCK_BLAST] = CreateConVar("zr_damage_block_blast", "1", ""); + g_hCvarsList[CVAR_DAMAGE_BLOCK_FF] = CreateConVar("zr_damage_block_ff", "1", "Block friendly fire."); + g_hCvarsList[CVAR_DAMAGE_BLOCK_BLAST] = CreateConVar("zr_damage_block_blast", "1", "Block blast damage inflicted on self or teammates."); // Suicide Intercept - g_hCvarsList[CVAR_DAMAGE_SUICIDE_ZOMBIE] = CreateConVar("zr_damage_suicide_zombie", "1", ""); - // Old Desc: Intercept human suicide attempts. - g_hCvarsList[CVAR_DAMAGE_SUICIDE_HUMAN] = CreateConVar("zr_damage_suicide_human", "1", ""); - // Old Desc: Intercept zombie suicide attempts. - g_hCvarsList[CVAR_DAMAGE_SUICIDE_CMDS] = CreateConVar("zr_damage_suicide_cmds", "kill, spectate, jointeam", ""); - // Old Desc: List of suicide commands to intercept. (Delimited by \", \" + g_hCvarsList[CVAR_DAMAGE_SUICIDE_ZOMBIE] = CreateConVar("zr_damage_suicide_zombie", "1", "Intercept suicide commands attempted by zombies."); + g_hCvarsList[CVAR_DAMAGE_SUICIDE_HUMAN] = CreateConVar("zr_damage_suicide_human", "1", "Intercept suicide commands attempted by humans."); + g_hCvarsList[CVAR_DAMAGE_SUICIDE_CMDS] = CreateConVar("zr_damage_suicide_cmds", "kill, spectate, jointeam", "List of client commands to intercept as suicide attempts. [Delimiter: \", \"]"); // =========================== // Say Hooks (core) // =========================== - g_hCvarsList[CVAR_SAYHOOKS_QUIET] = CreateConVar("zr_sayhooks_quiet", "1", ""); - g_hCvarsList[CVAR_SAYHOOKS_QUIET_FILTER] = CreateConVar("zr_sayhooks_quiet_filter", "1", ""); - // when enabled it filters out failed sayhooks - g_hCvarsList[CVAR_SAYHOOKS_QUIET_FLAGS] = CreateConVar("zr_sayhooks_quiet_flags", "58", ""); + g_hCvarsList[CVAR_SAYHOOKS_QUIET] = CreateConVar("zr_sayhooks_quiet", "1", "Stop certain in-game commands from appearing in chat. [See zr_sayhooks_quiet_filter & zr_sayhooks_quiet_flags]"); + g_hCvarsList[CVAR_SAYHOOKS_QUIET_FILTER] = CreateConVar("zr_sayhooks_quiet_filter", "1", "Stops any failed in-game command from showing in chat. Ex: Typing !zspawn while alive. [Dependency: zr_sayhooks_quiet]"); + g_hCvarsList[CVAR_SAYHOOKS_QUIET_FLAGS] = CreateConVar("zr_sayhooks_quiet_flags", "58", "Flag separate in-game commands to always hide from chat. [Dependency: zr_sayhooks_quiet]\n In-Game Command Flags:\n * Add numbers of desired flags together to produce final flag value.\n --------------------------------------------------------------------\n 1: !zmenu\n 2: !zadmin\n 4: !zclass\n 8: !zspawn\n 16: !ztele\n 32: !zhp\n 64: !zmarket"); // Flags (default: 2 + 8 + 16 + 32) - // 0 Allow all. - // 1 Quiet "!zmenu" say hook. - // 2 Quiet "!zadmin" say hook. - // 4 Quiet "!zclass" say hook. - // 8 Quiet "!zspawn" say hook. - // 16 Quiet "!ztele" say hook. - // 32 Quiet "!zhp" say hook. - // 64 Quiet "!zmarket" say hook. // =========================== // Overlays (core) // =========================== - g_hCvarsList[CVAR_OVERLAYS_UPDATE_TIME] = CreateConVar("zr_overlays_update_time", "1.0", ""); + g_hCvarsList[CVAR_OVERLAYS_UPDATE_TIME] = CreateConVar("zr_overlays_update_time", "1.0", "How often to update overlays on players. [0.0 = Disabled]"); // =========================== // Round End (core) // =========================== - g_hCvarsList[CVAR_ROUNDEND_OVERLAY] = CreateConVar("zr_roundend_overlay", "1", ""); - // Old Desc: Shows an overlay to all clients when a team wins. (0: Disable) - g_hCvarsList[CVAR_ROUNDEND_OVERLAY_HUMAN] = CreateConVar("zr_roundend_overlays_human", "overlays/zr/humans_win"); - // Old Desc: overlays/zr/humans_win", "Path to \"humans win\" overlay - g_hCvarsList[CVAR_ROUNDEND_OVERLAY_ZOMBIE] = CreateConVar("zr_roundend_overlays_zombie", "overlays/zr/zombies_win", ""); - // Old Desc: Path to \"zombies win\" overlay + g_hCvarsList[CVAR_ROUNDEND_OVERLAY] = CreateConVar("zr_roundend_overlay", "1", "Show specified overlay to players depending on winner when the round ends."); + g_hCvarsList[CVAR_ROUNDEND_OVERLAY_HUMAN] = CreateConVar("zr_roundend_overlays_human", "overlays/zr/humans_win", "Overlay, relative to \"materials\" folder, to display when humans win the round. [Dependency: zr_roundend_overlay]"); + g_hCvarsList[CVAR_ROUNDEND_OVERLAY_ZOMBIE] = CreateConVar("zr_roundend_overlays_zombie", "overlays/zr/zombies_win", "Overlay, relative to \"materials\" folder, to display when zombies win the round. [Dependency: zr_roundend_overlay]"); // =========================== // Account (module) // =========================== - g_hCvarsList[CVAR_ACCOUNT_CASHFILL] = CreateConVar("zr_account_cashfill", "1", ""); - // Old Desc: Enable the mod to set the players cash to zr_cashamount (0: Disabled) - g_hCvarsList[CVAR_ACCOUNT_CASHFILL_VALUE] = CreateConVar("zr_account_cashfill_value", "12000", ""); - // Old Desc: How much money players will have when they spawn when zr_cashfill is 1 + g_hCvarsList[CVAR_ACCOUNT_CASHFILL] = CreateConVar("zr_account_cashfill", "1", "Reset player's cash each spawn."); + g_hCvarsList[CVAR_ACCOUNT_CASHFILL_VALUE] = CreateConVar("zr_account_cashfill_value", "12000", "Amount of cash to set player's account to. [Dependency: zr_account_cashfill]"); // =========================== // Visual Effects (module) @@ -383,30 +346,28 @@ CvarsCreate() // Lightstyle - g_hCvarsList[CVAR_VEFFECTS_LIGHTSTYLE] = CreateConVar("zr_veffects_lightstyle", "1", ""); - g_hCvarsList[CVAR_VEFFECTS_LIGHTSTYLE_VALUE] = CreateConVar("zr_veffects_lightstyle_value", "b", ""); + g_hCvarsList[CVAR_VEFFECTS_LIGHTSTYLE] = CreateConVar("zr_veffects_lightstyle", "1", "Change lightstyle (brightness) of the map."); + g_hCvarsList[CVAR_VEFFECTS_LIGHTSTYLE_VALUE] = CreateConVar("zr_veffects_lightstyle_value", "b", "Lightstyle value. ['a' = Darkest | 'z' = Brightest | Dependency: zr_veffects_lightstyle]"); // Sky - g_hCvarsList[CVAR_VEFFECTS_SKY] = CreateConVar("zr_veffects_sky", "1", ""); - g_hCvarsList[CVAR_VEFFECTS_SKY_PATH] = CreateConVar("zr_veffects_sky_path", "sky_borealis01up.vmt", ""); + g_hCvarsList[CVAR_VEFFECTS_SKY] = CreateConVar("zr_veffects_sky", "1", "Change map skybox."); + g_hCvarsList[CVAR_VEFFECTS_SKY_PATH] = CreateConVar("zr_veffects_sky_path", "sky_borealis01up.vmt", "Skybox file, relative to \"materials/skybox\" folder, to change map skybox to. [Dependency: zr_veffects_sky]"); // Sun - g_hCvarsList[CVAR_VEFFECTS_SUN_DISABLE] = CreateConVar("zr_veffects_sun_disable", "1", ""); + g_hCvarsList[CVAR_VEFFECTS_SUN_DISABLE] = CreateConVar("zr_veffects_sun_disable", "1", "Disable sun rendering on map."); // Fog - g_hCvarsList[CVAR_VEFFECTS_FOG] = CreateConVar("zr_veffects_fog", "0", ""); - // NOTE DISABLE. SOURCEMOD DOESNT SUPPORT THIS YET. - g_hCvarsList[CVAR_VEFFECTS_FOG_OVERRIDE] = CreateConVar("zr_veffects_fog_override", "0", ""); - // NOTE DISABLE. SOURCEMOD DOESNT SUPPORT THIS YET. - g_hCvarsList[CVAR_VEFFECTS_FOG_PCOLOR] = CreateConVar("zr_veffects_fog_pcolor", "255 255 255", ""); - g_hCvarsList[CVAR_VEFFECTS_FOG_SCOLOR] = CreateConVar("zr_veffects_fog_scolor", "255 255 255", ""); - g_hCvarsList[CVAR_VEFFECTS_FOG_DENSITY] = CreateConVar("zr_veffects_fog_density", "0.8", ""); - g_hCvarsList[CVAR_VEFFECTS_FOG_STARTDIST] = CreateConVar("zr_veffects_fog_startdist", "0", ""); - g_hCvarsList[CVAR_VEFFECTS_FOG_ENDDIST] = CreateConVar("zr_veffects_fog_enddist", "400", ""); - g_hCvarsList[CVAR_VEFFECTS_FOG_FARZ] = CreateConVar("zr_veffects_fog_farz", "2000", ""); + g_hCvarsList[CVAR_VEFFECTS_FOG] = CreateConVar("zr_veffects_fog", "0", "(UNSUPPORTED) Enable fog rendering on the map."); + g_hCvarsList[CVAR_VEFFECTS_FOG_OVERRIDE] = CreateConVar("zr_veffects_fog_override", "0", "(UNSUPPORTED) If fog exists already on the map, then replace with new modified fog. [Dependency: zr_veffects_fog]"); + g_hCvarsList[CVAR_VEFFECTS_FOG_PCOLOR] = CreateConVar("zr_veffects_fog_pcolor", "255 255 255", "(UNSUPPORTED) Primary color of the fog. [Dependency: zr_veffects_fog]"); + g_hCvarsList[CVAR_VEFFECTS_FOG_SCOLOR] = CreateConVar("zr_veffects_fog_scolor", "255 255 255", "(UNSUPPORTED) Secondary color of the fog. [Dependency: zr_veffects_fog]"); + g_hCvarsList[CVAR_VEFFECTS_FOG_DENSITY] = CreateConVar("zr_veffects_fog_density", "0.8", "(UNSUPPORTED) Density (thickness) of the fog. [Dependency: zr_veffects_fog]"); + g_hCvarsList[CVAR_VEFFECTS_FOG_STARTDIST] = CreateConVar("zr_veffects_fog_startdist", "0", "(UNSUPPORTED) Distance from player to start rendering foremost fog. [Dependency: zr_veffects_fog]"); + g_hCvarsList[CVAR_VEFFECTS_FOG_ENDDIST] = CreateConVar("zr_veffects_fog_enddist", "400", "(UNSUPPORTED) Distance from player to stop rendering fog. [Dependency: zr_veffects_fog]"); + g_hCvarsList[CVAR_VEFFECTS_FOG_FARZ] = CreateConVar("zr_veffects_fog_farz", "2000", "(UNSUPPORTED) Vertical clipping plane."); // =========================== // Sound Effects (module) @@ -414,32 +375,23 @@ CvarsCreate() // Zombie Sounds - g_hCvarsList[CVAR_SEFFECTS_MOAN] = CreateConVar("zr_seffects_moan", "30", ""); - // Old Desc: How often, in seconds, a zombie moans (0: Disable) - g_hCvarsList[CVAR_SEFFECTS_GROAN] = CreateConVar("zr_seffects_groan", "5", ""); - // Old Desc: Chance factor a zombie will groan when shot (Lower: More often, 0: Disable) - g_hCvarsList[CVAR_SEFFECTS_DEATH] = CreateConVar("zr_seffects_death", "1", ""); - // Old Desc: Zombie will emit a death sound when killed (0: Disable) + g_hCvarsList[CVAR_SEFFECTS_MOAN] = CreateConVar("zr_seffects_moan", "30.0", "Time between emission of a moan sound from a zombie."); + g_hCvarsList[CVAR_SEFFECTS_GROAN] = CreateConVar("zr_seffects_groan", "5", "The probability that a groan sound will be emitted from a zombie when shot. ['100' = 1% chance | '50' = 2% chance | '1' = 100% chance]"); + g_hCvarsList[CVAR_SEFFECTS_DEATH] = CreateConVar("zr_seffects_death", "1", "Emit a death sound when a zombie dies."); // Ambient Sounds - g_hCvarsList[CVAR_AMBIENTSOUNDS] = CreateConVar("zr_ambientsounds", "1", ""); - // Old Desc: Enable creepy ambience to be played throughout the game (0: Disable) - g_hCvarsList[CVAR_AMBIENTSOUNDS_FILE] = CreateConVar("zr_ambientsounds_file", "ambient/zr/zr_ambience.mp3", ""); - // Old Desc: Path to ambient sound file that will be played throughout the game, when zr_ambience is 1 - g_hCvarsList[CVAR_AMBIENTSOUNDS_LENGTH] = CreateConVar("zr_ambientsounds_length", "60.0", ""); - // Old Desc: The length, in seconds, of the ambient sound file - g_hCvarsList[CVAR_AMBIENTSOUNDS_VOLUME] = CreateConVar("zr_ambientsounds_volume", "1.0", ""); - // Old Desc: Volume of ambient sounds when zr_ambience is 1 (0.0: Unhearable, 1.0: Max volume) + g_hCvarsList[CVAR_AMBIENTSOUNDS] = CreateConVar("zr_ambientsounds", "1", "Play an ambient sound to all players during gameplay."); + g_hCvarsList[CVAR_AMBIENTSOUNDS_FILE] = CreateConVar("zr_ambientsounds_file", "ambient/zr/zr_ambience.mp3", "Sound file, relative to \"sounds\" folder, to play as ambience. [Dependency: zr_ambientsounds]"); + g_hCvarsList[CVAR_AMBIENTSOUNDS_LENGTH] = CreateConVar("zr_ambientsounds_length", "60.0", "Length of the ambient sound. [Dependency: zr_ambientsounds]"); + g_hCvarsList[CVAR_AMBIENTSOUNDS_VOLUME] = CreateConVar("zr_ambientsounds_volume", "0.8", "Volume of the ambient sound. [1.0 = Max volume | 0.0001 = Not audible | Dependency: zr_ambientsounds]"); // =========================== // Antistick (module) // =========================== - g_hCvarsList[CVAR_ANTISTICK] = CreateConVar("zr_antistick", "1", ""); - // Old Desc: Enable the anti-stick module, which will automatically unstick players stuck within each other. (0:Disable) - g_hCvarsList[CVAR_ANTISTICK_INTERVAL] = CreateConVar("zr_antistick_interval", "0.5", ""); - // Old Desc: How often, in seconds, the anti-stick module checks each player for being stuck. (1.0: Default) + g_hCvarsList[CVAR_ANTISTICK] = CreateConVar("zr_antistick", "1", "Automatically unstick players when stuck within each others' collision hull."); + g_hCvarsList[CVAR_ANTISTICK_INTERVAL] = CreateConVar("zr_antistick_interval", "0.5", "Time between each check for stuck players. [Dependency: zr_antistick]"); // =========================== // Knockback (module) @@ -460,14 +412,10 @@ CvarsCreate() // Respawn (module) // =========================== - g_hCvarsList[CVAR_RESPAWN] = CreateConVar("zr_respawn", "0", ""); - // Old Desc: When player is killed, player will respawn - g_hCvarsList[CVAR_RESPAWN_DELAY] = CreateConVar("zr_respawn_delay", "1", ""); - // Old Desc: How long to wait after death to respawn, in seconds - g_hCvarsList[CVAR_RESPAWN_TEAM_ZOMBIE] = CreateConVar("zr_respawn_team_zombie", "1", ""); - // Old Desc: Respawn player as zombie (0: Respawn as human) - g_hCvarsList[CVAR_RESPAWN_TEAM_ZOMBIE_WORLD] = CreateConVar("zr_respawn_team_zombie_world", "1", ""); - // Old Desc: Respawn zombies as zombies if they were killed by the world, like elevators, doors and lasers. (0: Disable) + g_hCvarsList[CVAR_RESPAWN] = CreateConVar("zr_respawn", "0", "Respawn players after death. [Recommended: (Enable) zr_zspawn*]"); + g_hCvarsList[CVAR_RESPAWN_DELAY] = CreateConVar("zr_respawn_delay", "1", "Time after death to delay player respawn. [Dependency: zr_respawn]"); + g_hCvarsList[CVAR_RESPAWN_TEAM_ZOMBIE] = CreateConVar("zr_respawn_team_zombie", "1", "Respawn player as a zombie. [Dependency: zr_respawn]"); + g_hCvarsList[CVAR_RESPAWN_TEAM_ZOMBIE_WORLD] = CreateConVar("zr_respawn_team_zombie_world", "1", "Respawn player as a zombie if player was killed by the world. [Override: zr_respawn_team_zombie]"); // =========================== // Napalm (module) @@ -475,49 +423,43 @@ CvarsCreate() // (None) + // =========================== + // Jump Boost (module) + // =========================== + + g_hCvarsList[CVAR_JUMPBOOST_BUNNYHOP_PROTECT] = CreateConVar("zr_jumpboost_bunnyhop_protect", "1", "Prevent players from using forward jump boost multipliers to bunny hop."); + // =========================== // ZSpawn (module) // =========================== - g_hCvarsList[CVAR_ZSPAWN] = CreateConVar("zr_zspawn", "1", ""); - // Old Desc: Allow players to spawn if they just joined the game (0: Disable) + g_hCvarsList[CVAR_ZSPAWN] = CreateConVar("zr_zspawn", "1", "Allow players to spawn into the game late."); - g_hCvarsList[CVAR_ZSPAWN_TEAM_OVERRIDE] = CreateConVar("zr_zspawn_team_override", "1", ""); - g_hCvarsList[CVAR_ZSPAWN_TEAM_ZOMBIE] = CreateConVar("zr_zspawn_team_zombie", "0", ""); + g_hCvarsList[CVAR_ZSPAWN_TEAM_OVERRIDE] = CreateConVar("zr_zspawn_team_override", "1", "Override spawn team when spawning by means of ZSpawn."); + g_hCvarsList[CVAR_ZSPAWN_TEAM_ZOMBIE] = CreateConVar("zr_zspawn_team_zombie", "0", "Spawn player on zombie team when spawning by means of ZSpawn. [Dependency: zr_zspawn_team_override | Override: zr_respawn_zombie]"); - g_hCvarsList[CVAR_ZSPAWN_TIMELIMIT] = CreateConVar("zr_zspawn_timelimit", "1", ""); - g_hCvarsList[CVAR_ZSPAWN_TIMELIMIT_TIME] = CreateConVar("zr_zspawn_timelimit_time", "120", ""); + g_hCvarsList[CVAR_ZSPAWN_TIMELIMIT] = CreateConVar("zr_zspawn_timelimit", "1", "Put a time limit on the use of ZSpawn."); + g_hCvarsList[CVAR_ZSPAWN_TIMELIMIT_TIME] = CreateConVar("zr_zspawn_timelimit_time", "120.0", "Time from the start of the round to allow ZSpawn. [Dependency: zr_zspawn_timelimit]"); // =========================== // ZTele (module) // =========================== - g_hCvarsList[CVAR_ZTELE_ZOMBIE] = CreateConVar("zr_ztele_zombie", "1", ""); - g_hCvarsList[CVAR_ZTELE_HUMAN_BEFORE] = CreateConVar("zr_ztele_human_before", "1", ""); - g_hCvarsList[CVAR_ZTELE_HUMAN_AFTER] = CreateConVar("zr_ztele_human_after", "0", ""); - g_hCvarsList[CVAR_ZTELE_DELAY_ZOMBIE] = CreateConVar("zr_ztele_delay_zombie", "3", ""); - g_hCvarsList[CVAR_ZTELE_DELAY_HUMAN] = CreateConVar("zr_ztele_delay_human", "3", ""); - g_hCvarsList[CVAR_ZTELE_MAX_ZOMBIE] = CreateConVar("zr_ztele_max_zombie", "3", ""); - g_hCvarsList[CVAR_ZTELE_MAX_HUMAN] = CreateConVar("zr_ztele_max_human", "1", ""); - g_hCvarsList[CVAR_ZTELE_AUTOCANCEL] = CreateConVar("zr_ztele_autocancel", "1", ""); - g_hCvarsList[CVAR_ZTELE_AUTOCANCEL_DISTANCE] = CreateConVar("zr_ztele_autocancel_distance", "20", ""); + g_hCvarsList[CVAR_ZTELE_ZOMBIE] = CreateConVar("zr_ztele_zombie", "1", "Allow zombies to use ZTele."); + g_hCvarsList[CVAR_ZTELE_HUMAN_BEFORE] = CreateConVar("zr_ztele_human_before", "1", "Allow humans to use ZTele before the mother zombie has spawned."); + g_hCvarsList[CVAR_ZTELE_HUMAN_AFTER] = CreateConVar("zr_ztele_human_after", "0", "Allow humans to use ZTele after the mother zombie has spawned."); + g_hCvarsList[CVAR_ZTELE_DELAY_ZOMBIE] = CreateConVar("zr_ztele_delay_zombie", "3.0", "Time between using ZTele command and teleportation for zombies. [Dependency: zr_ztele_zombie]"); + g_hCvarsList[CVAR_ZTELE_DELAY_HUMAN] = CreateConVar("zr_ztele_delay_human", "3.0", "Time between using ZTele command and teleportation for humans. [Dependency: zr_ztele_human_(before)/(after)]"); + g_hCvarsList[CVAR_ZTELE_MAX_ZOMBIE] = CreateConVar("zr_ztele_max_zombie", "3", "Max number of times a zombie is allowed to use ZTele per round. [Dependency: zr_ztele_zombie]"); + g_hCvarsList[CVAR_ZTELE_MAX_HUMAN] = CreateConVar("zr_ztele_max_human", "1", "Max number of times a human is allowed to use ZTele per round. [Dependency: zr_ztele_human_(before)/(after)]"); + g_hCvarsList[CVAR_ZTELE_AUTOCANCEL] = CreateConVar("zr_ztele_autocancel", "1", "Automatically cancel ZTele if player moves out of a set boundary. [Dependency: zr_ztele_(zombie)/(human)[_(before)/(after)]]"); + g_hCvarsList[CVAR_ZTELE_AUTOCANCEL_DISTANCE] = CreateConVar("zr_ztele_autocancel_distance", "20", "Maximum distance, in feet, player is allowed to travel before teleport is cancelled. [Dependency: zr_ztele_autocancel]"); // =========================== // ZHP (module) // =========================== - g_hCvarsList[CVAR_ZHP] = CreateConVar("zr_zhp", "1", ""); - // Old Desc: Allows clients to enable/disable zombie health display (1: On, 0: Off) - g_hCvarsList[CVAR_ZHP_DEFAULT] = CreateConVar("zr_zhp_default", "1", ""); - // Old Desc: The default value of zombie health display to new clients (1: On, 0: Off) - - - // Old Desc: Allow users to disable ZVision with their nightvision key (0: Disable) - g_hCvarsList[CVAR_MENU_AUTOCLOSE] = CreateConVar("zr_menu_autoclose", "0", ""); - // Old Desc: Automatically close menus on selection. If disabled the menu will remain open. - g_hCvarsList[CVAR_ANTICAMP] = CreateConVar("zr_anticamp", "1", ""); - // Old Desc: Enables or disables hurt volumes for preventing unfair camping. (0: Disable) - g_hCvarsList[CVAR_ANTICAMP_UPDATE_INTERVAL] = CreateConVar("zr_anticamp_update_interval", "1", ""); - // Old Desc: How often to update player locations (in seconds). + g_hCvarsList[CVAR_ZHP] = CreateConVar("zr_zhp", "1", "Allow player to toggle real HP display as a zombie."); + g_hCvarsList[CVAR_ZHP_DEFAULT] = CreateConVar("zr_zhp_default", "1", "Default ZHP toggle state set on connecting player. [Dependency: zr_zhp]"); // Auto-generate config file if it doesn't exist, then execute. AutoExecConfig(true, "zombiereloaded", "sourcemod/zombiereloaded"); diff --git a/src/zr/event.inc b/src/zr/event.inc index c34ee50..751b4ff 100644 --- a/src/zr/event.inc +++ b/src/zr/event.inc @@ -185,6 +185,23 @@ public Action:EventPlayerSpawn(Handle:event, const String:name[], bool:dontBroad ZHPOnClientSpawn(index); TranslationPrintToChat(index, "General zmenu reminder"); + + // Fire post player_spawn event. + CreateTimer(0.0, EventPlayerSpawnPost, index); +} + +/** + * Event callback (player_spawn) + * Client is spawning into the game. *Post + * + * @param event The event handle. + * @param name Name of the event. + * @dontBroadcast If true, event is broadcasted to all clients, false if not. + */ +public Action:EventPlayerSpawnPost(Handle:timer, any:index) +{ + // Forward event to modules. + SpawnProtectOnClientSpawnPost(index); } /** diff --git a/src/zr/jumpboost.inc b/src/zr/jumpboost.inc index c958add..809d6c2 100644 --- a/src/zr/jumpboost.inc +++ b/src/zr/jumpboost.inc @@ -30,12 +30,16 @@ JumpBoostOnClientJump(client) new Float:vecVelocity[3]; ToolsClientVelocity(client, vecVelocity, false); - // Protect against bunnyhopping. - new Float:magnitude = SquareRoot(Pow(vecVelocity[0], 2.0) + Pow(vecVelocity[1], 2.0)); - if (magnitude >= JUMPBOOST_FORWARD_VEL_MAX) + // Protect against bunnyhopping, if cvar is enabled. + new bool:bunnyhopprotect = GetConVarBool(g_hCvarsList[CVAR_JUMPBOOST_BUNNYHOP_PROTECT]); + if (bunnyhopprotect) { - // Set distance multiplier to 0. - distance = 0.0; + new Float:magnitude = SquareRoot(Pow(vecVelocity[0], 2.0) + Pow(vecVelocity[1], 2.0)); + if (magnitude >= JUMPBOOST_FORWARD_VEL_MAX) + { + // Set distance multiplier to 0. + distance = 0.0; + } } // Apply forward jump boost. diff --git a/src/zr/playerclasses/classmenus.inc b/src/zr/playerclasses/classmenus.inc index 4691cea..809296c 100644 --- a/src/zr/playerclasses/classmenus.inc +++ b/src/zr/playerclasses/classmenus.inc @@ -230,7 +230,7 @@ public ClassMenuSelectHandle(Handle:menu, MenuAction:action, client, slot) decl String:classname[64]; new classindex; new teamid; - new bool:autoclose = GetConVarBool(g_hCvarsList[CVAR_MENU_AUTOCLOSE]); + new bool:autoclose = GetConVarBool(g_hCvarsList[CVAR_CLASSES_MENU_AUTOCLOSE]); switch (action) { diff --git a/src/zr/respawn.inc b/src/zr/respawn.inc index e022f26..375399e 100644 --- a/src/zr/respawn.inc +++ b/src/zr/respawn.inc @@ -115,18 +115,6 @@ RespawnOnRoundEnd() } } -/** - * Returns if a player is to be respawned as a zombie, because they were killed by world. - * - * @param client The client index. - * @return True if they were killed by world, false if not or cvar is disabled. - */ -RespawnKilledByWorld(client) -{ - // Return true if both the cvar is enabled and the player was killed by world. - return (GetConVarBool(g_hCvarsList[CVAR_RESPAWN_TEAM_ZOMBIE_WORLD]) && bKilledByWorld[client]); -} - /** * Spawns a player into the round. * diff --git a/src/zr/spawnprotect.inc b/src/zr/spawnprotect.inc index b18f62f..8a7bd14 100644 --- a/src/zr/spawnprotect.inc +++ b/src/zr/spawnprotect.inc @@ -35,7 +35,7 @@ SpawnProtectClientInit(client) * Client is spawning into the game. * * @param client The client index. - */ + */ SpawnProtectOnClientSpawn(client) { // Disable spawn protection on client. @@ -49,10 +49,17 @@ SpawnProtectOnClientSpawn(client) // Reset timer handle. tSpawnProtect[client] = INVALID_HANDLE; - +} + +/** + * Client is spawning into the game. *Post + * + * @param client The client index. + */ +SpawnProtectOnClientSpawnPost(client) +{ // If client isn't on a team, then stop. - new team = GetClientTeam(client); - if (team != CS_TEAM_T && team != CS_TEAM_CT) + if (!ZRIsClientOnTeam(client)) { return; } @@ -70,35 +77,35 @@ SpawnProtectOnClientSpawn(client) return; } - // If player respawns as human, and either cvar zr_suicide_world_damage or the client - // wasn't killed by world is false, then continue on to protect client. - new bool:respawn_zombie = GetConVarBool(g_hCvarsList[CVAR_RESPAWN_TEAM_ZOMBIE]); - if (!respawn_zombie && !RespawnKilledByWorld(client)) + // If client is a zombie, then stop. + if (InfectIsClientInfected(client)) { - // Set spawn protect flag on client. - bInfectImmune[client][INFECT_TYPE_NORMAL] = true; - - // Get spawn protect attribute cvars. - new Float:speed = GetConVarFloat(g_hCvarsList[CVAR_SPAWNPROTECT_SPEED]); - new alpha = GetConVarInt(g_hCvarsList[CVAR_SPAWNPROTECT_ALPHA]); - - // Set spawn protect attributes. - ToolsSetClientLMV(client, speed); - ToolsSetClientAlpha(client, alpha); - - // Set time left to zr_protect_time's value. - new protect_time = GetConVarInt(g_hCvarsList[CVAR_SPAWNPROTECT_TIME]); - pSpawnProtectTime[client] = protect_time; - - // Tell client they are being protected. - TranslationPrintToChat(client, "Spawn protection begin", protect_time); - - // Send time left in a hud message. - TranslationPrintHUDText(client, "Spawn Protect", pSpawnProtectTime[client]); - - // Start repeating timer. - tSpawnProtect[client] = CreateTimer(1.0, SpawnProtectTimer, client, TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); + return; } + + // Set spawn protect flag on client. + bInfectImmune[client][INFECT_TYPE_NORMAL] = true; + + // Get spawn protect attribute cvars. + new Float:speed = GetConVarFloat(g_hCvarsList[CVAR_SPAWNPROTECT_SPEED]); + new alpha = GetConVarInt(g_hCvarsList[CVAR_SPAWNPROTECT_ALPHA]); + + // Set spawn protect attributes. + ToolsSetClientLMV(client, speed); + ToolsSetClientAlpha(client, alpha); + + // Set time left to zr_protect_time's value. + new protect_time = GetConVarInt(g_hCvarsList[CVAR_SPAWNPROTECT_TIME]); + pSpawnProtectTime[client] = protect_time; + + // Tell client they are being protected. + TranslationPrintToChat(client, "Spawn protection begin", protect_time); + + // Send time left in a hud message. + TranslationPrintHUDText(client, "Spawn Protect", pSpawnProtectTime[client]); + + // Start repeating timer. + tSpawnProtect[client] = CreateTimer(1.0, SpawnProtectTimer, client, TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); } /** diff --git a/src/zr/visualeffects.inc b/src/zr/visualeffects.inc index 26852bc..4b56744 100644 --- a/src/zr/visualeffects.inc +++ b/src/zr/visualeffects.inc @@ -282,6 +282,17 @@ VEffectsApplySunDisable(bool:disable = false) VEffectsApplyFog(bool:override = false) { + // If fog is disabled, then stop. + new bool:fog = GetConVarBool(g_hCvarsList[CVAR_VEFFECTS_FOG]); + + // DUE TO SOURCEMOD NOT SUPPORT FOG, DISABLE. + fog = false; + + if (!fog) + { + return; + } + // Find current fog index new fogindex = FindEntityByClassname(-1, "env_fog_controller"); @@ -296,13 +307,6 @@ VEffectsApplyFog(bool:override = false) } } - // If fog is disabled, then stop. - new bool:fog = GetConVarBool(g_hCvarsList[CVAR_VEFFECTS_FOG]); - if (!fog) - { - return; - } - // If there is no fog on the map, create new fog. if (fogindex == -1) { From 363be1159198fb5f9e7ac32af93b715c6217459e Mon Sep 17 00:00:00 2001 From: Greyscale Date: Fri, 15 May 2009 08:14:14 +0200 Subject: [PATCH 4/4] Added actual functionality for the zr_infect_mzombie_respawn cvar. --- src/zr/infect.inc | 10 ++++++++++ src/zr/ztele.inc | 17 ++++++++++++++--- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/src/zr/infect.inc b/src/zr/infect.inc index f62002e..d57406d 100644 --- a/src/zr/infect.inc +++ b/src/zr/infect.inc @@ -565,6 +565,16 @@ InfectClient(client, attacker = -1, bool:motherinfect = false) // TODO: A solution to stop confusing bots? Respawn and teleport? CS_SwitchTeam(client, CS_TEAM_T); + // If respawn is enabled, then teleport mother zombie back to spawnpoint. + if (motherinfect) + { + new bool:zombierespawn = GetConVarBool(g_hCvarsList[CVAR_INFECT_MZOMBIE_RESPAWN]); + if(zombierespawn) + { + ZTeleTeleportClient(client); + } + } + // Format infection message. SetGlobalTransTarget(client); diff --git a/src/zr/ztele.inc b/src/zr/ztele.inc index d0a8c6f..c9c860f 100644 --- a/src/zr/ztele.inc +++ b/src/zr/ztele.inc @@ -170,7 +170,7 @@ bool:ZTeleClient(client) // Tell client how much time is left until teleport. TranslationPrintCenterText(client, "ZTele countdown", g_iZTeleTimeLeft[client]); - // Start repeating timer. + // Start timer. tZTele[client] = CreateTimer(1.0, ZTeleTimer, client, TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); } else @@ -178,8 +178,8 @@ bool:ZTeleClient(client) // Reset timer handle. tZTele[client] = INVALID_HANDLE; - // Teleport client. - TeleportEntity(client, g_vecZTeleSpawn[client], NULL_VECTOR, NULL_VECTOR); + // Teleport client to spawn. + ZTeleTeleportClient(client); // Tell client they've been teleported. TranslationPrintCenterText(client, "ZTele countdown end", g_iZTeleCount[client], ztelemax); @@ -191,6 +191,17 @@ bool:ZTeleClient(client) return true; } +/** + * Teleport client to their spawn location. + * + * @param client The client index. + */ +ZTeleTeleportClient(client) +{ + // Teleport client. + TeleportEntity(client, g_vecZTeleSpawn[client], NULL_VECTOR, NULL_VECTOR); +} + /** * Timer callback, counts down teleport to the client. *