From d666fbf7ce5eeead6d0c3a283f6d2928c3f6fd16 Mon Sep 17 00:00:00 2001 From: richard Date: Thu, 16 Jul 2009 10:05:40 +0200 Subject: [PATCH 1/3] More work on volfeatures. See details. Finished base event handler for volfeatures. Finished zr_voladd, zr_vol_remove, zr_vol_list and zr_vol_dumpstates console commands. Removed unused function call in class module. Fixed minior bugs in parameter parser (paramtools.inc). Made a debug tools module with console commands for directly testing certain functions. --- .../translations/zombiereloaded.phrases.txt | 12 +- src/zombiereloaded.sp | 2 + src/zr/commands.inc | 2 + src/zr/cvars.inc | 4 +- src/zr/debugtools.inc | 105 +++ src/zr/paramtools.inc | 54 +- src/zr/playerclasses/filtertools.inc | 2 +- src/zr/translation.inc | 1 + src/zr/volfeatures/volanticamp.inc | 817 +++++++++++++++++- src/zr/volfeatures/volcommands.inc | 555 +++++++++++- src/zr/volfeatures/volevents.inc | 41 +- src/zr/volfeatures/volfeatures.inc | 330 +++++-- src/zr/volfeatures/volgenericattributes.inc | 112 ++- 13 files changed, 1861 insertions(+), 176 deletions(-) create mode 100644 src/zr/debugtools.inc diff --git a/cstrike/addons/sourcemod/translations/zombiereloaded.phrases.txt b/cstrike/addons/sourcemod/translations/zombiereloaded.phrases.txt index 79871d0..a94bc35 100644 --- a/cstrike/addons/sourcemod/translations/zombiereloaded.phrases.txt +++ b/cstrike/addons/sourcemod/translations/zombiereloaded.phrases.txt @@ -932,17 +932,19 @@ "ru" "Здоровье: {1}" } + // =========================== + // Volumetric features (module) + // =========================== - - "Unfair camping" + "Vol Anticamp Message" { - "en" "An admin has marked this area as unfair, please move along, or die." + "en" "This area is restricted, please move along." } - "Unfair camper slayed" + "Vol Slay" { "#format" "{1:s},{2:d}" - "en" "Player {1} has been slayed for camping in a restricted area. (ID: {2})" + "en" "Player \"{1}\" has been slayed for camping in a restricted area (ID: {2})." } // =========================== diff --git a/src/zombiereloaded.sp b/src/zombiereloaded.sp index 5e923d9..aa8f4f0 100644 --- a/src/zombiereloaded.sp +++ b/src/zombiereloaded.sp @@ -80,6 +80,7 @@ #include "zr/zcookies" #include "zr/jumpboost" #include "zr/volfeatures/volfeatures" +#include "zr/debugtools" /** * Record plugin info. @@ -137,6 +138,7 @@ public OnMapStart() SEffectsOnMapStart(); AntiStickOnMapStart(); ZSpawnOnMapStart(); + } /** diff --git a/src/zr/commands.inc b/src/zr/commands.inc index 6f343e8..4dcb552 100644 --- a/src/zr/commands.inc +++ b/src/zr/commands.inc @@ -45,6 +45,8 @@ CommandsInit() ZHPOnCommandsCreate(); VolOnCommandsCreate(); + DebugOnCommandsCreate(); + // Forward event to modules. (hook commands) ClassOnCommandsHook(); DamageOnCommandsHook(); diff --git a/src/zr/cvars.inc b/src/zr/cvars.inc index 99b14de..4efcc38 100644 --- a/src/zr/cvars.inc +++ b/src/zr/cvars.inc @@ -423,8 +423,8 @@ CvarsCreate() // Volumetric Features (module) // =========================== g_hCvarsList[CVAR_VOL] = CreateConVar("zr_vol", "1", "Enables volumetric features."); - g_hCvarsList[CVAR_VOL_UPDATE_INTERVAL] = CreateConVar("zr_vol_update_interval", "1.0", "How often to update player positions and trigger events, in seconds."); - g_hCvarsList[CVAR_VOL_TRIGGER_INTERVAL] = CreateConVar("zr_vol_trigger_interval", "1.0", "How often to check for delayed events, in seconds. Use lower values for more precise delays."); + g_hCvarsList[CVAR_VOL_UPDATE_INTERVAL] = CreateConVar("zr_vol_update_interval", "0.5", "How often to update player positions and trigger events, in seconds."); + g_hCvarsList[CVAR_VOL_TRIGGER_INTERVAL] = CreateConVar("zr_vol_trigger_interval", "0.5", "How often to check for delayed events, in seconds. Use lower values for more precise delays."); // =========================== diff --git a/src/zr/debugtools.inc b/src/zr/debugtools.inc new file mode 100644 index 0000000..e8082ae --- /dev/null +++ b/src/zr/debugtools.inc @@ -0,0 +1,105 @@ +/* + * ============================================================================ + * + * Zombie:Reloaded + * + * File: debugtools.inc + * Type: Core + * Description: Place to put custom functions and test stuff. + * + * Copyright (C) 2009 Greyscale, Richard Helgeby + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * ============================================================================ + */ + +DebugOnCommandsCreate() +{ + // Custom test commands: + RegConsoleCmd("zr_getparametercount", Command_GetParameterCount, "Test GetParameterCount function in paramtools.inc. Usage: zr_getparametercount "); + RegConsoleCmd("zr_getparametervalue", Command_GetParameterValue, "Test GetParameterValue function in paramtools.inc. Usage: zr_getparametervalue "); +} + +public Action:Command_GetParameterCount(client, argc) +{ + if (argc < 1) + { + ReplyToCommand(client, "No parameter string passed. Usage: zr_getparametercount "); + return Plugin_Handled; + } + + decl String:argbuffer[256]; + decl String:paramstring[256]; + + paramstring[0] = 0; + + // Join the last parameters in a string. + for (new arg = 1; arg <= argc; arg++) + { + GetCmdArg(arg, argbuffer, sizeof(argbuffer)); + StrCat(paramstring, sizeof(paramstring), argbuffer); + + // Add space, except on the last parameter. + if (arg < argc) + { + StrCat(paramstring, sizeof(paramstring), " "); + } + } + + ReplyToCommand(client, "Parameter string: \"%s\"", paramstring); + new paramcount = GetParameterCount(paramstring); + ReplyToCommand(client, "Parameter count: %d", paramcount); + + return Plugin_Handled; +} + +public Action:Command_GetParameterValue(client, argc) +{ + if (argc < 2) + { + ReplyToCommand(client, "Missing parameters. Usage: zr_getparametervalue "); + return Plugin_Handled; + } + + decl String:paramname[256]; + decl String:paramstring[256]; + + decl String:valuebuffer[64]; + decl String:argbuffer[256]; + + paramstring[0] = 0; + valuebuffer[0] = 0; + + GetCmdArg(1, paramname, sizeof(paramname)); + + // Join the last parameters in a string. + for (new arg = 2; arg <= argc; arg++) + { + GetCmdArg(arg, argbuffer, sizeof(argbuffer)); + StrCat(paramstring, sizeof(paramstring), argbuffer); + + // Add space, except on the last parameter. + if (arg < argc) + { + StrCat(paramstring, sizeof(paramstring), " "); + } + } + + new retval = GetParameterValue(valuebuffer, sizeof(valuebuffer), paramstring, paramname); + + ReplyToCommand(client, "Return value: %d\nParameter string: \"%s\"\nParameter value: \"%s\"", retval, paramstring, valuebuffer); + + return Plugin_Handled; +} \ No newline at end of file diff --git a/src/zr/paramtools.inc b/src/zr/paramtools.inc index cb61b20..701ab7a 100644 --- a/src/zr/paramtools.inc +++ b/src/zr/paramtools.inc @@ -8,6 +8,8 @@ * Description: Provides functions for parsing strings with parameters in * key=value format. * + * Note: Does not support spaces or quoted strings. + * * Copyright (C) 2009 Greyscale, Richard Helgeby * * This program is free software: you can redistribute it and/or modify @@ -34,6 +36,8 @@ stock GetParameterCount(const String:rawString[]) { new lenRawString = strlen(rawString); new paramCount; + new searchPos; + new splitPos; // Check if the raw string is empty. if (lenRawString == 0) @@ -42,20 +46,26 @@ stock GetParameterCount(const String:rawString[]) } // Count number of "=". - for (new searchPos = 0; searchPos < lenRawString; searchPos++) + for (splitPos = 0; splitPos < lenRawString; splitPos++) { - // Set searchPos and check if "=" was found. - searchPos = StrContains(rawString[searchPos], "="); - if (searchPos) + // Find next "=". + searchPos = StrContains(rawString[splitPos], "=", false); + + // Note: searchPos is an offset from rawString[splitPos]. If searchPos + // is 0, then the real position is splitPos. + + // Check if "=" was found. + if (searchPos >= 0) { + // Parameter found. paramCount++; - // Increment one position so we dont find the same "=" again. - searchPos++; + // Update split position. + splitPos += searchPos; } else { - // Exit loop. + // No need to continue. "=" not found. break; } } @@ -86,9 +96,11 @@ stock GetParameterValue(String:buffer[], maxlen, const String:rawString[], const new valuePos; new valueLen; new nextPos; + new splitPos; // Get the position of parameter. paramPos = StrContains(rawString, parameter, false); + splitPos = paramPos; // Check if found. if (paramPos >= 0) @@ -96,8 +108,8 @@ stock GetParameterValue(String:buffer[], maxlen, const String:rawString[], const // Get parameter length. paramLen = strlen(parameter); - // Get the position of the next parameter. - nextPos = StrContains(rawString[paramPos + 1], " "); + // Get the position of the next parameter by finding the next space. + nextPos = StrContains(rawString[splitPos], " "); // Check if the next parameter was found. if (nextPos >= 0) @@ -105,8 +117,9 @@ stock GetParameterValue(String:buffer[], maxlen, const String:rawString[], const // Calculate value starting position. valuePos = paramPos + paramLen + 1; - // Calculate value length. - valueLen = nextPos - valuePos; + // Calculate value length. Note: Adding 1 for space to the null + // terminator. + valueLen = nextPos + splitPos - valuePos + 1; // Check if value length is longer than buffer size. if (valueLen > maxlen) @@ -145,6 +158,7 @@ stock GetParameterName(String:buffer[], maxlen, const String:rawString[], parame new paramPos; new valuePos; new nextValuePos; + new splitPos; // Check if the raw string is empty. if (strlen(rawString) == 0) @@ -157,22 +171,26 @@ stock GetParameterName(String:buffer[], maxlen, const String:rawString[], parame // Get the value starting position for the previous index. for (new index = 0; index < parameterIndex - 1; index++) { - valuePos = StrContains(rawString[valuePos], "="); + valuePos = StrContains(rawString[splitPos], "="); + splitPos += valuePos; } - // Find the next space from valuePos where the specified parameter + // Find the next space from splitPos where the specified parameter // starts. - paramPos = StrContains(rawString[valuePos], " ") + 1; + paramPos = StrContains(rawString[splitPos], " ") + splitPos + 1; - // Find the next value position from paramPos to get the end position + // Update split position. + splitPos += paramPos; + + // Find the next value position from splitPos to get the end position // of the parameter name. - nextValuePos = StrContains(rawString[paramPos], "="); + nextValuePos = StrContains(rawString[splitPos], "=") + splitPos; // Check if a value is specified. if (nextValuePos > 0) { // Return the parameter name between paramPos and nextValuePos. - return strcopy(buffer, nextValuePos - paramPos, rawString[paramPos]); + return strcopy(buffer, nextValuePos - paramPos + 1, rawString[paramPos]); // + 1 to include null terminator. } else { @@ -189,7 +207,7 @@ stock GetParameterName(String:buffer[], maxlen, const String:rawString[], parame if (valuePos > 0) { // Return the parameter name. - return strcopy(buffer, valuePos, rawString); + return strcopy(buffer, valuePos + 1, rawString); // + 1 to include null terminator. } else { diff --git a/src/zr/playerclasses/filtertools.inc b/src/zr/playerclasses/filtertools.inc index aa86c85..d63ca73 100644 --- a/src/zr/playerclasses/filtertools.inc +++ b/src/zr/playerclasses/filtertools.inc @@ -384,7 +384,7 @@ stock ClassGetIndex(const String:name[], cachetype = ZR_CLASS_CACHE_MODIFIED) */ stock ClassGetActiveIndex(client) { - new teamid = GetClientTeam(client); + new teamid; if (!ZRIsClientOnTeam(client)) { diff --git a/src/zr/translation.inc b/src/zr/translation.inc index f2ae06e..1b8ccfa 100644 --- a/src/zr/translation.inc +++ b/src/zr/translation.inc @@ -61,6 +61,7 @@ TranslationInit() { // Load translations phrases used by plugin. LoadTranslations("common.phrases.txt"); + LoadTranslations("core.phrases.txt"); LoadTranslations("zombiereloaded.phrases.txt"); } diff --git a/src/zr/volfeatures/volanticamp.inc b/src/zr/volfeatures/volanticamp.inc index bc314c1..d99fe98 100644 --- a/src/zr/volfeatures/volanticamp.inc +++ b/src/zr/volfeatures/volanticamp.inc @@ -25,31 +25,16 @@ * ============================================================================ */ -/** - * Data structure for a anti-camp volume. - */ -enum VolTypeAnticamp -{ - Float:anticamp_interval, /** How often to trigger an action. */ - Handle:anticamp_timer, /** Action timer handle. */ - - VolAnticampAction:anticamp_action, /** What to do with players in anti-camp volumes */ - Float:anticamp_amount, /** Amount depending on action type. Usually time in seconds or damage amount. */ - - VolAnticampeWarningType:anticamp_warning, /** How to warn the player. */ - String:anticamp_message[256] /** Override warning message. Max 256 characters. */ -} - /** * Actions to do with players in anti-camp volumes. */ enum VolAnticampAction { - anticamp_no_action, /** Do nothing but give a warning. */ - anticamp_damage, /** Give damage to player. */ - anticamp_slay, /** Slay player. */ - anticamp_drug, /** Drug player. */ - anticamp_fire /** Ignite player. */ + Anticamp_NoAction, /** Do nothing but give a warning. */ + Anticamp_Damage, /** Give damage to player. */ + Anticamp_Slay, /** Slay player. */ + Anticamp_Drug, /** Drug player. */ + Anticamp_Ignite /** Ignite player. */ } /** @@ -57,13 +42,797 @@ enum VolAnticampAction */ enum VolAnticampeWarningType { - anticamp_no_warning, /** No warning messages. */ - anticamp_chat, /** Print warning in chat area. */ - anticamp_center, /** Print centered warning message. */ - anticamp_menu /** Print a menu-like warning message with close option. */ + Anticamp_NoWarning, /** No warning messages. */ + Anticamp_Chat, /** Print warning in chat area. */ + Anticamp_Center, /** Print centered warning message. */ + Anticamp_Menu /** Print a menu-like warning message with close option. */ +} + +/** + * Data structure for a anti-camp volume. + */ +enum VolTypeAnticamp +{ + bool:Anticamp_InUse, /** Specifies if the data index is used or not. */ + Float:Anticamp_Interval, /** How often to trigger an action. */ + Handle:Anticamp_Timer, /** Action timer handle. */ + + VolAnticampAction:Anticamp_Action, /** What to do with players in anti-camp volumes */ + Float:Anticamp_Amount, /** Amount depending on action type. Usually time in seconds or damage amount. */ + + VolAnticampeWarningType:Anticamp_Warning, /** How to warn the player. */ + String:Anticamp_Message[256] /** Override warning message. Max 256 characters. */ } /** * Anti-camp data. */ new AnticampData[ZR_VOLUMES_MAX][VolTypeAnticamp]; + +/** + * Event callback. Enables a anticamp volume. + * + * @param volumeIndex The volume index. + */ +VolAnticampEnable(volumeIndex) +{ + new Float:interval; + + // Validate index. + if (!VolIsValidIndex(volumeIndex)) + { + return; + } + + // Get data index. + new dataindex = Volumes[volumeIndex][Vol_DataIndex]; + + // Validate data index. + if (!VolAnticampValidateIndex(dataindex)) + { + return; + } + + // Check if in use. + if (AnticampData[dataindex][Anticamp_InUse]) + { + // Start timer if not running. + if (AnticampData[dataindex][Anticamp_Timer] == INVALID_HANDLE) + { + // Get interval. + interval = AnticampData[dataindex][Anticamp_Interval]; + + // Validate interval. + if (interval > 0.0) + { + AnticampData[dataindex][Anticamp_Timer] = CreateTimer(interval, Event_VolAnticampTrigger, _, TIMER_REPEAT); + } + } + + LogEvent(_, LogType_Normal, LOG_DEBUG, LogModule_Volfeatures, "Vol state", "Enabled anticamp volume %d.", volumeIndex); + } +} + +/** + * Starts all existing anticamp timers. + */ +stock VolAnticampEnableAll() +{ + new Float:interval; + + // Loop through all volumes. + for (new dataindex = 0; dataindex < ZR_VOLUMES_MAX; dataindex++) + { + // Check if in use. + if (AnticampData[dataindex][Anticamp_InUse]) + { + // Start timer if not running. + if (AnticampData[dataindex][Anticamp_Timer] == INVALID_HANDLE) + { + // Get interval. + interval = AnticampData[dataindex][Anticamp_Interval]; + + // Validate interval. + if (interval > 0.0) + { + AnticampData[dataindex][Anticamp_Timer] = CreateTimer(interval, Event_VolAnticampTrigger, _, TIMER_REPEAT); + } + } + } + } +} + +/** + * Event callback. Stops existing anticamp timer on a volume. + */ +VolAnticampDisable(volumeIndex) +{ + new Handle:timerbuffer; + + // Validate index. + if (!VolIsValidIndex(volumeIndex)) + { + return; + } + + // Get data index. + new dataindex = Volumes[volumeIndex][Vol_DataIndex]; + + // Validate data index. + if (!VolAnticampValidateIndex(dataindex)) + { + return; + } + + // Check if in use. + if (AnticampData[dataindex][Anticamp_InUse]) + { + // Stop timer. + timerbuffer = AnticampData[dataindex][Anticamp_Timer]; + if (timerbuffer != INVALID_HANDLE) + { + KillTimer(timerbuffer); + AnticampData[dataindex][Anticamp_Timer] = INVALID_HANDLE; + } + + LogEvent(_, LogType_Normal, LOG_DEBUG, LogModule_Volfeatures, "Vol state", "Disabled anticamp volume %d.", volumeIndex); + } + +} + +/** + * Stops all existing anticamp timers. + */ +stock VolAnticampDisableAll() +{ + new Handle:timerbuffer; + + // Loop through all volumes. + for (new dataindex = 0; dataindex < ZR_VOLUMES_MAX; dataindex++) + { + // Check if in use. + if (AnticampData[dataindex][Anticamp_InUse]) + { + // Stop timer. + timerbuffer = AnticampData[dataindex][Anticamp_Timer]; + if (timerbuffer != INVALID_HANDLE) + { + KillTimer(timerbuffer); + AnticampData[dataindex][Anticamp_Timer] = INVALID_HANDLE; + } + } + } +} + +/** + * Disables feature and resets data to defaults at the specified index. + * + * @param dataIndex Local data index. + */ +VolAnticampReset(dataIndex) +{ + AnticampData[dataIndex][Anticamp_InUse] = false; + + AnticampData[dataIndex][Anticamp_Interval] = 1.0; + if (AnticampData[dataIndex][Anticamp_Timer] != INVALID_HANDLE) + { + KillTimer(AnticampData[dataIndex][Anticamp_Timer]); + AnticampData[dataIndex][Anticamp_Timer] = INVALID_HANDLE; + } + + AnticampData[dataIndex][Anticamp_Action] = Anticamp_Damage; + AnticampData[dataIndex][Anticamp_Amount] = 5.0; + + AnticampData[dataIndex][Anticamp_Warning] = Anticamp_Chat; + Format(String:AnticampData[dataIndex][Anticamp_Message], 256, ""); +} + +/** + * Initialization event for anticamp feature. + */ +VolAnticampInit() +{ + // Set default attributes. + for (new dataindex = 0; dataindex < ZR_VOLUMES_MAX; dataindex++) + { + VolAnticampReset(dataindex); + } +} + +/** + * Timer callback for anticamp volumes. Applies actions on players in volumes. + */ +public Action:Event_VolAnticampTrigger(Handle:timer) +{ + // Loop through all players. + for (new client = 1; client <= MaxClients; client++) + { + // Loop through all volumes. + for (new volumeindex = 0; volumeindex < ZR_VOLUMES_MAX; volumeindex++) + { + // Check if the volume is enabled and in use. + if (VolIsEnabled(volumeindex) && VolInUse(volumeindex)) + { + // Check if player is in a anticamp volume. + if (VolPlayerInVolume[client][volumeindex] && Volumes[volumeindex][Vol_Type] == VolFeature_Anticamp) + { + // Apply action. + VolAnticampApplyAction(client, Volumes[volumeindex][Vol_DataIndex], volumeindex); + } + } + } + } +} + +/** + * Applies action on a client for the specified volume. + * + * @param client The client index. + * @param dataIndex Local data index. + * @param volumeIndex The volume index. + */ +VolAnticampApplyAction(client, dataIndex, volumeIndex) +{ + new Float:amount = AnticampData[dataIndex][Anticamp_Amount]; + + // Send warning message. + VolAnticampWarnPlayer(client, dataIndex); + + switch (AnticampData[dataIndex][Anticamp_Action]) + { + case Anticamp_NoAction: + { + // Do nothing. + } + case Anticamp_Damage: + { + // Give damage to player. Kill if zero HP. + new damage = RoundToNearest(amount); + new health = GetClientHealth(client) - damage; + decl String:name[64]; + decl String:buffer[256]; + + if (health > 0) + { + SetEntityHealth(client, health); + } + else + { + // Health is zero or below. Kill player. + ForcePlayerSuicide(client); + + // Log event. + GetClientName(client, name, sizeof(name)); + SetGlobalTransTarget(client); + Format(buffer, sizeof(buffer), "%t", "Vol Slay", name, volumeIndex); + + /*if (LogFlagCheck(LOG_GAME_EVENTS, LOG_MODULE_ANTICAMP)) ZR_LogMessageFormatted(client, "anticamp", "kill", "%s", true, buffer); + if (anticamp_echo) + { + FormatTextString(buffer, sizeof(buffer)); + ZR_PrintToAdminChat(buffer); + }*/ + } + } + case Anticamp_Slay: + { + + } + case Anticamp_Drug: + { + + } + case Anticamp_Ignite: + { + + } + } +} + +/** + * Gives a warning to the specified player for the specified volume. + * + * @param client The client index. + * @param dataIndex Local data index. + */ +VolAnticampWarnPlayer(client, dataIndex) +{ + decl String:buffer[256]; + new bool:custommessage = (strlen(AnticampData[dataIndex][Anticamp_Message]) > 0) ? true : false; + + // Set language. + SetGlobalTransTarget(client); + + // Format message. + if (custommessage) + { + // Use custom message. + strcopy(buffer, sizeof(buffer), AnticampData[dataIndex][Anticamp_Message]); + } + else + { + // Use message in translations file. + Format(buffer, sizeof(buffer), "%t", "Vol Anticamp Message"); + } + + switch (AnticampData[dataIndex][Anticamp_Warning]) + { + case Anticamp_NoWarning: + { + // Do nothing. + } + case Anticamp_Chat: + { + // Apply ZR formatting and print chat message. + TranslationPluginFormatString(buffer, sizeof(buffer)); + PrintToChat(client, buffer); + } + case Anticamp_Center: + { + // Print centered message. + PrintCenterText(client, buffer); + } + case Anticamp_Menu: + { + // Display the message in a menu panel. + new Handle:panel = CreatePanel(); + + SetPanelTitle(panel, "Zombie:Reloaded"); + DrawPanelItem(panel, "", ITEMDRAW_SPACER); + DrawPanelItem(panel, buffer); + DrawPanelItem(panel, "", ITEMDRAW_SPACER); + + SetPanelCurrentKey(panel, 10); + + Format(buffer, sizeof(buffer), "%t", "Exit"); + DrawPanelItem(panel, buffer, ITEMDRAW_CONTROL); + + SendPanelToClient(panel, client, Handler_AnitcampDummy, 10); + CloseHandle(panel); + } + } +} + +/** + * Dummy handler for panel messages. + */ +public Handler_AnitcampDummy(Handle:menu, MenuAction:action, param1, param2) +{ + // Do nothing. +} + +/** + * Gets the first free anticamp data index. + * + * @return The first free anticamp data index if successful, or -1 if + * there are no free volumes. + */ +VolAnticampGetFreeIndex() +{ + // Loop through all indexes. + for (new dataindex = 0; dataindex < ZR_VOLUMES_MAX; dataindex++) + { + // Check if it's free. + if (!AnticampData[dataindex][Anticamp_InUse]) + { + return dataindex; + } + } + + // No free index found. + return -1; +} + +/** + * Validates local data index. + * + * @param dataIndex Index to validate. + * @return True if valid, false otherwise. + */ +bool:VolAnticampValidateIndex(dataIndex) +{ + if (dataIndex >= 0 && dataIndex < ZR_VOLUMES_MAX) + { + return true; + } + else + { + return false; + } +} + +/** + * Dumps data to be used by zr_vol_list command. + * + * @param dataIndex Index in anticamp data array. + * @param buffer Destination string buffer. + * @param maxlen Size of destination buffer. + * @return Number of cells written. + */ +VolAnticampDumpData(dataIndex, String:buffer[], maxlen) +{ + decl String:linebuffer[128]; + decl String:valuebuffer[256]; + new anticampcache[VolTypeAnticamp]; + new cellswritten; + + // Validate index. + if (!VolAnticampValidateIndex(dataIndex)) + { + return 0; + } + + // Initialize and clear buffer. + buffer[0] = 0; + + // Cache data. + anticampcache = AnticampData[dataIndex]; + + Format(linebuffer, sizeof(linebuffer), "Interval: %.2f\n", anticampcache[Anticamp_Interval]); + cellswritten += StrCat(buffer, maxlen, linebuffer); + + VolAnticampActionToString(anticampcache[Anticamp_Action], valuebuffer, sizeof(valuebuffer)); + Format(linebuffer, sizeof(linebuffer), "Action: %s\n", valuebuffer); + cellswritten += StrCat(buffer, maxlen, linebuffer); + + Format(linebuffer, sizeof(linebuffer), "Action amount: %.2f\n", anticampcache[Anticamp_Amount]); + cellswritten += StrCat(buffer, maxlen, linebuffer); + + VolAnticampWarningToString(anticampcache[Anticamp_Warning], valuebuffer, sizeof(valuebuffer)); + Format(linebuffer, sizeof(linebuffer), "Warning type: %s\n", valuebuffer); + cellswritten += StrCat(buffer, maxlen, linebuffer); + + strcopy(valuebuffer, sizeof(valuebuffer), anticampcache[Anticamp_Message]); + Format(linebuffer, sizeof(linebuffer), "Warning message: \"%s\"\n", valuebuffer); + cellswritten += StrCat(buffer, maxlen, linebuffer); + + return cellswritten; +} + + +/************************************** + * * + * CONVERTING FUNCTIONS * + * * + **************************************/ + +/** + * Converts a action type to a string. + * + * @param actionType Action type to convert. + * @param buffer Destination string buffer. + * @param maxlen Size of destination buffer. + * @param shortName Optional. Write short name or human readable name. + * Default is human readable (false). + * @return Number of cells written. + */ +VolAnticampActionToString(VolAnticampAction:actionType, String:buffer[], maxlen, bool:shortName = false) +{ + switch (actionType) + { + case Anticamp_NoAction: + { + return shortName ? strcopy(buffer, maxlen, "none") : strcopy(buffer, maxlen, "No action"); + } + case Anticamp_Damage: + { + return shortName ? strcopy(buffer, maxlen, "damage") : strcopy(buffer, maxlen, "Damage player"); + } + case Anticamp_Drug: + { + return shortName ? strcopy(buffer, maxlen, "drug") : strcopy(buffer, maxlen, "Drug player "); + } + case Anticamp_Ignite: + { + return shortName ? strcopy(buffer, maxlen, "ignite") : strcopy(buffer, maxlen, "Ignite player"); + } + } + + return 0; +} + +/** + * Converts a action string type to a action type. + * + * @param action Action string type to convert. + * @return Action type or Anticamp_NoAction if failed. + */ +stock VolAnticampAction:VolAnticampStringToAction(const String:action[]) +{ + // Check if empty. + if (strlen(action) == 0) + { + return Anticamp_NoAction; + } + + if (StrEqual(action, "none", false)) + { + return Anticamp_NoWarning; + } + else if (StrEqual(action, "damage", false)) + { + return Anticamp_Damage; + } + else if (StrEqual(action, "drug", false)) + { + return Anticamp_Drug; + } + else if (StrEqual(action, "ignite", false)) + { + return Anticamp_Ignite; + } + + // No match. + return Anticamp_NoAction; +} + +/** + * Converts a warning type to a string. + * + * @param warningType Warning type to convert. + * @param buffer Destination string buffer. + * @param maxlen Size of destination buffer. + * @param shortName Optional. Write short name or human readable name. + * Default is human readable (false). + * @return Number of cells written. + */ +VolAnticampWarningToString(VolAnticampeWarningType:warningType, String:buffer[], maxlen, bool:shortName = false) +{ + switch (warningType) + { + case Anticamp_NoWarning: + { + return shortName ? strcopy(buffer, maxlen, "none") : strcopy(buffer, maxlen, "No warning"); + } + case Anticamp_Chat: + { + return shortName ? strcopy(buffer, maxlen, "chat") : strcopy(buffer, maxlen, "Chat area"); + } + case Anticamp_Center: + { + return shortName ? strcopy(buffer, maxlen, "center") : strcopy(buffer, maxlen, "Centered message"); + } + case Anticamp_Menu: + { + return shortName ? strcopy(buffer, maxlen, "meny") : strcopy(buffer, maxlen, "Message in menu panel"); + } + } + + return 0; +} + +/** + * Converts a warning string type to a warning type. + * + * @param warning Warning string type to convert. + * @return Warning type, or Anticamp_NoWarning if failed. + */ +stock VolAnticampeWarningType:VolAnticampStringToWarning(const String:warning[]) +{ + // Check if empty. + if (strlen(warning) == 0) + { + return Anticamp_NoWarning; + } + + if (StrEqual(warning, "none", false)) + { + return Anticamp_NoWarning; + } + else if (StrEqual(warning, "chat", false)) + { + return Anticamp_Chat; + } + else if (StrEqual(warning, "center", false)) + { + return Anticamp_Center; + } + else if (StrEqual(warning, "menu", false)) + { + return Anticamp_Menu; + } + + // No match. + return Anticamp_NoWarning; +} + + +/************************************** + * * + * ATTRIBUTE FUNCTIONS * + * * + **************************************/ + +/** + * Sets anticamp spesific attributes on a anticamp volume. + * + * @param dataIndex Local data index. + * @param attribName Attribute to modify. + * @param attribVlue Attribute value to set. + * @return True if successfully set, false otherwise. + */ +bool:VolAnticampSetAttribute(dataIndex, const String:attribName[], const String:attribValue[]) +{ + // Validate data index. + if (!VolAnticampValidateIndex(dataIndex)) + { + return false; + } + + // Check attribute names. + if (StrEqual(attribName, "interval", false)) + { + if (VolAnticampSetIntervalString(dataIndex, attribValue)) + { + return true; + } + } + else if (StrEqual(attribName, "action", false)) + { + if (VolAnticampSetActionString(dataIndex, attribValue)) + { + return true; + } + } + else if (StrEqual(attribName, "amount", false)) + { + if (VolAnticampSetAmountString(dataIndex, attribValue)) + { + return true; + } + } + else if (StrEqual(attribName, "warning", false)) + { + if (VolAnticampSetWarningString(dataIndex, attribValue)) + { + return true; + } + } + else if (StrEqual(attribName, "message", false)) + { + // Unsupported because of technical limits in command parser. Spaces + // and quoted strings aren't supported yet. + } + + return false; +} + +/** + * Parses a interval string value and applies it to the specified volume. + * + * @param dataIndex Local data index. + * @param interval Interval to set. A floating point number formatted as a + * string. + * @return True if successfully set, false otherwise. + */ +bool:VolAnticampSetIntervalString(dataIndex, const String:interval[]) +{ + new Float:anticampinterval; + + // Check if string value is empty. + if (strlen(interval) == 0) + { + return false; + } + + // Convert value. + anticampinterval = StringToFloat(interval); + + // Apply value. + AnticampData[dataIndex][Anticamp_Interval] = anticampinterval; + return true; +} + +/** + * Parses a action type string value and applies it to the specified volume. + * + * @param dataIndex Local data index. + * @param action Action type to set. + * @return True if successfully set, false otherwise. + */ +bool:VolAnticampSetActionString(dataIndex, const String:action[]) +{ + // Check if string value is empty. + if (strlen(action) == 0) + { + return false; + } + + // Check effect string values and apply them to the volume. + if (StrEqual(action, "none", false)) + { + AnticampData[dataIndex][Anticamp_Action] = Anticamp_NoAction; + return true; + } + else if (StrEqual(action, "damage", false)) + { + AnticampData[dataIndex][Anticamp_Action] = Anticamp_Damage; + return true; + } + else if (StrEqual(action, "slay", false)) + { + AnticampData[dataIndex][Anticamp_Action] = Anticamp_Slay; + return true; + } + else if (StrEqual(action, "drug", false)) + { + AnticampData[dataIndex][Anticamp_Action] = Anticamp_Drug; + return true; + } + else if (StrEqual(action, "ignite", false)) + { + AnticampData[dataIndex][Anticamp_Action] = Anticamp_Ignite; + return true; + } + + // The string value didn't match any valid action types. + return false; +} + +/** + * Parses a action amount string value and applies it to the specified volume. + * + * @param dataIndex Local data index. + * @param amount Amount to set. A floating point number formatted as a + * string. + * @return True if successfully set, false otherwise. + */ +bool:VolAnticampSetAmountString(dataIndex, const String:amount[]) +{ + new Float:actionamount; + + // Check if string value is empty. + if (strlen(amount) == 0) + { + return false; + } + + // Convert value. + actionamount = StringToFloat(amount); + + // Apply value. + AnticampData[dataIndex][Anticamp_Amount] = actionamount; + return true; +} + +/** + * Parses a warning type string value and applies it to the specified volume. + * + * @param dataIndex Local data index. + * @param warning warning type to set. + * @return True if successfully set, false otherwise. + */ +bool:VolAnticampSetWarningString(dataIndex, const String:warning[]) +{ + + // Check if string value is empty. + if (strlen(warning) == 0) + { + return false; + } + + // Check effect string values and apply them to the volume. + if (StrEqual(warning, "none", false)) + { + AnticampData[dataIndex][Anticamp_Warning] = Anticamp_NoWarning; + return true; + } + else if (StrEqual(warning, "chat", false)) + { + AnticampData[dataIndex][Anticamp_Warning] = Anticamp_Chat; + return true; + } + else if (StrEqual(warning, "center", false)) + { + AnticampData[dataIndex][Anticamp_Warning] = Anticamp_Center; + return true; + } + else if (StrEqual(warning, "menu", false)) + { + AnticampData[dataIndex][Anticamp_Warning] = Anticamp_Menu; + return true; + } + + // The string value didn't match any valid action types. + return false; +} diff --git a/src/zr/volfeatures/volcommands.inc b/src/zr/volfeatures/volcommands.inc index de40f3d..4488ba8 100644 --- a/src/zr/volfeatures/volcommands.inc +++ b/src/zr/volfeatures/volcommands.inc @@ -49,9 +49,433 @@ Example: zr_vol_add 0 0 0 100 200 300 anticamp team=humans delay=5 effect=wireframe effect_color=255,0,0 */ + +/** + * Creates commands for managing volumes. + */ +VolOnCommandsCreate() +{ + RegAdminCmd("zr_vol_add", VolAddVolumeCommand, ADMFLAG_CONFIG, "Creates a rectangular volume in the map. Usage: zr_vol_add [params]"); + RegAdminCmd("zr_vol_remove", VolRemoveVolumeCommand, ADMFLAG_CONFIG, "Removes an existing volume in the map. Usage: zr_vol_remove "); + RegConsoleCmd("zr_vol_list", VolListCommand, "Lists existing volumes in the map, or dumps detail data to the specified volume. Usage: zr_vol_list [volume index]"); + RegConsoleCmd("zr_vol_dumpstates", VolDumpStatesCommand, "Dumps volume states for the specified player. Usage: zr_vol_dumpstates "); +} + +/** + * Command callback for creating a new volume. + */ public Action:VolAddVolumeCommand(client, argc) { + decl String:buffer[640]; + buffer[0] = 0; + if (argc < 7) + { + // Write syntax info. + StrCat(buffer, sizeof(buffer), "Creates a rectangular volume in the map. Usage: zr_vol_add [params]\n\n"); + StrCat(buffer, sizeof(buffer), "Parameters:\n"); + StrCat(buffer, sizeof(buffer), "x1, y1, z1 Coordinates to first corner (any corner)\n"); + StrCat(buffer, sizeof(buffer), "x2, y2, z2 Coordinates to oposite corner (diagonally to oposite height)\n"); + StrCat(buffer, sizeof(buffer), "type Volumetric feature type:\n"); + StrCat(buffer, sizeof(buffer), " anticamp\n"); + StrCat(buffer, sizeof(buffer), "params Parameter string with additional volume data. Generic parameters:\n"); + StrCat(buffer, sizeof(buffer), " teamfilter=all|humans|zombies\n"); + StrCat(buffer, sizeof(buffer), " delay=0\n"); + StrCat(buffer, sizeof(buffer), " effect=none|wireframe|smoke\n"); + StrCat(buffer, sizeof(buffer), " effect_color=0,0,0\n"); + StrCat(buffer, sizeof(buffer), " enabled=1"); + + ReplyToCommand(client, buffer); + return Plugin_Handled; + } + + new Float:x1; + new Float:y1; + new Float:z1; + new Float:x2; + new Float:y2; + new Float:z2; + new Float:min[3]; + new Float:max[3]; + new VolumeFeatureTypes:voltype; + new Float:floatbuffer; + new volindex; + new dataindex; + new paramcount; + + decl String:params[256]; + decl String:argbuffer[256]; + + params[0] = 0; + + // Get a free volume index. + volindex = VolGetFreeVolume(); + + // Validate index. + if (!VolIsValidIndex(volindex)) + { + ReplyToCommand(client, "Cannot add volume. Maximum number of volumes reached."); + return Plugin_Handled; + } + + // Get positions. + GetCmdArg(1, argbuffer, sizeof(argbuffer)); + x1 = StringToFloat(argbuffer); + + GetCmdArg(2, argbuffer, sizeof(argbuffer)); + y1 = StringToFloat(argbuffer); + + GetCmdArg(3, argbuffer, sizeof(argbuffer)); + z1 = StringToFloat(argbuffer); + + GetCmdArg(4, argbuffer, sizeof(argbuffer)); + x2 = StringToFloat(argbuffer); + + GetCmdArg(5, argbuffer, sizeof(argbuffer)); + y2 = StringToFloat(argbuffer); + + GetCmdArg(6, argbuffer, sizeof(argbuffer)); + z2 = StringToFloat(argbuffer); + + // Check if both locations are equal. + if (FloatCompare(x1, x2) == 0) + { + if (FloatCompare(y1, y2) == 0) + { + if (FloatCompare(z1, z2) == 0) + { + ReplyToCommand(client, "Cannot add volume. Both locations are equal."); + return Plugin_Handled; + } + } + } + + // Sort out max and min values so 1-values are smaller. + if (FloatCompare(x1, x2) == 1) + { + // x1 is bigger than x2. Swap values. + floatbuffer = x1; + x1 = x2; + x2 = floatbuffer; + } + if (FloatCompare(y1, y2) == 1) + { + // y1 is bigger than y2. Swap values. + floatbuffer = y1; + y1 = y2; + y2 = floatbuffer; + } + if (FloatCompare(z1, z2) == 1) + { + // z1 is bigger than z2. Swap values. + floatbuffer = z1; + z1 = z2; + z2 = floatbuffer; + } + + // Copy coordinates to location vectors. + min[0] = x1; + min[1] = y1; + min[2] = z1; + max[0] = x2; + max[1] = y2; + max[2] = z2; + + // Get volume type. + GetCmdArg(7, argbuffer, sizeof(argbuffer)); + voltype = VolGetTypeFromString(argbuffer); + + // Validate volume type. + if (voltype == VolFeature_Invalid) + { + ReplyToCommand(client, "Cannot add volume. Invalid volume type: %s", argbuffer); + return Plugin_Handled; + } + + // Get free data index for the specified type. + dataindex = VolGetFreeDataIndex(voltype); + + // Validate data index. + if (dataindex < 0) + { + ReplyToCommand(client, "Cannot add volume. Out of free data indexes for type \"%s\"", argbuffer); + return Plugin_Handled; + } + + // Add volume. + volindex = VolAdd(volindex, min, max, voltype, dataindex); + + // Get additional parameters if they exist. + if (argc >= 8) + { + // Join the last parameters in a string. + for (new arg = 8; arg <= argc; arg++) + { + GetCmdArg(arg, argbuffer, sizeof(argbuffer)); + StrCat(params, sizeof(params), argbuffer); + + // Add space, except on the last parameter. + if (arg < argc) + { + StrCat(params, sizeof(params), " "); + } + } + + // Set attributes. + paramcount = VolSetAttributes(volindex, params); + LogEvent(_, LogType_Normal, LOG_DEBUG, LogModule_Volfeatures, "Add volume", "Parsing parameter string. Param count = \"%d\". String = \"%s\"", paramcount, params); + } + else + { + // No attributes set. + paramcount = 0; + } + + if (paramcount < 1) + { + Format(buffer, sizeof(buffer), "No additional attributes set."); + } + else + { + Format(buffer, sizeof(buffer), "Additional attributes set: %d", paramcount); + } + + ReplyToCommand(client, "Added volume at index %d. %s", volindex, buffer); + return Plugin_Handled; +} + +/** + * Command callback for removing a volume. + */ +public Action:VolRemoveVolumeCommand(client, argc) +{ + decl String:arg[16]; + new volindex; + + if (argc < 1) + { + // Write syntax info. + ReplyToCommand(client, "Removes an existing volume in the map. Usage: zr_vol_remove "); + return Plugin_Handled; + } + + // Get volume index. + GetCmdArg(1, arg, sizeof(arg)); + volindex = StringToInt(arg); + + // Validate index. + if (!VolIsValidIndex(volindex)) + { + ReplyToCommand(client, "Invalid volume index."); + return Plugin_Handled; + } + + // Check if volume exist. + if (!Volumes[volindex][Vol_InUse]) + { + ReplyToCommand(client, "Volume %d doesn't exist.", volindex); + return Plugin_Handled; + } + + // Remove volume. + VolRemove(volindex); + + ReplyToCommand(client, "Successfully disabled and removed volume %d.", volindex); + return Plugin_Handled; +} + +/** + * Command callback for listing volumes or dumping data. + */ +public Action:VolListCommand(client, argc) +{ + decl String:buffer[1022]; // Two chars reserved for newline and null terminator. + decl String:linebuffer[128]; + decl String:valuebuffer[32]; + decl String:arg[16]; + + buffer[0] = 0; + linebuffer[0] = 0; + + new volindex; + new volcount; + new volcache[VolumeAttributes]; + + if (argc < 1) + { + // No volume specified. Display syntax and list volumes. + StrCat(buffer, sizeof(buffer), "Lists existing volumes in the map, or dumps detail data to the specified volume. Usage: zr_vol_list [volume index]\n\n"); + StrCat(buffer, sizeof(buffer), "ID: Type: Min loc: Max loc:\n"); + StrCat(buffer, sizeof(buffer), "--------------------------------------------------------------------------------"); + ReplyToCommand(client, buffer); + + // Loop through all indexes. + for (volindex = 0; volindex < ZR_VOLUMES_MAX; volindex++) + { + // Check if in use. + if (Volumes[volindex][Vol_InUse]) + { + // Cache volume data. + volcache = Volumes[volindex]; + + // Add to list. + VolTypeToString(volcache[Vol_Type], valuebuffer, sizeof(valuebuffer), true); + Format(linebuffer, sizeof(linebuffer), "%-4d %-15s %-8.2f %-8.2f %-8.2f %-8.2f %-8.2f %-8.2f", + volindex, + valuebuffer, + volcache[Vol_xMin], + volcache[Vol_yMin], + volcache[Vol_zMin], + volcache[Vol_xMax], + volcache[Vol_yMax], + volcache[Vol_zMax]); + + ReplyToCommand(client, linebuffer); + volcount++; + } + } + + Format(linebuffer, sizeof(linebuffer), "\nTotal volumes: %d", volcount); + ReplyToCommand(client, linebuffer); + return Plugin_Handled; + } + else + { + // Dump data for the specified volume. + + // Get volume index. + GetCmdArg(1, arg, sizeof(arg)); + volindex = StringToInt(arg); + + // Validate index. + if (!VolIsValidIndex(volindex)) + { + ReplyToCommand(client, "The specified volume index is invalid: %d", volindex); + return Plugin_Handled; + } + + // Check if unused. + if (!VolInUse(volindex)) + { + ReplyToCommand(client, "The specified volume doesn't exist: %d.", volindex); + return Plugin_Handled; + } + + // Cache volume data. + volcache = Volumes[volindex]; + + // Dump generic volume data. + Format(linebuffer, sizeof(linebuffer), "Volume data at index %d:\n", volindex); + StrCat(buffer, sizeof(buffer), linebuffer); + StrCat(buffer, sizeof(buffer), "--------------------------------------------------------------------------------"); + ReplyToCommand(client, buffer); + + // Clear buffer. + buffer[0] = 0; + + Format(linebuffer, sizeof(linebuffer), "ID: %d\n", volindex); + StrCat(buffer, sizeof(buffer), linebuffer); + + Format(linebuffer, sizeof(linebuffer), "Enabled: %d\n", volcache[Vol_Enabled]); + StrCat(buffer, sizeof(buffer), linebuffer); + + VolTypeToString(volcache[Vol_Type], valuebuffer, sizeof(valuebuffer)); + Format(linebuffer, sizeof(linebuffer), "Type: %s\n", valuebuffer); + StrCat(buffer, sizeof(buffer), linebuffer); + + Format(linebuffer, sizeof(linebuffer), "Min loc: %-8.2f %-8.2f %-8.2f\n", volcache[Vol_xMin], volcache[Vol_yMin], volcache[Vol_zMin]); + StrCat(buffer, sizeof(buffer), linebuffer); + + Format(linebuffer, sizeof(linebuffer), "Max loc: %-8.2f %-8.2f %-8.2f\n", volcache[Vol_xMax], volcache[Vol_yMax], volcache[Vol_zMax]); + StrCat(buffer, sizeof(buffer), linebuffer); + + VolEffectToString(volcache[Vol_Effect], valuebuffer, sizeof(valuebuffer)); + Format(linebuffer, sizeof(linebuffer), "Effect: %s\n", valuebuffer); + StrCat(buffer, sizeof(buffer), linebuffer); + + Format(linebuffer, sizeof(linebuffer), "Effect color: %d, %d, %d\n", volcache[Vol_EffectColor][0], volcache[Vol_EffectColor][1], volcache[Vol_EffectColor][2]); + StrCat(buffer, sizeof(buffer), linebuffer); + + VolTeamToString(volcache[Vol_TeamFilter], valuebuffer, sizeof(valuebuffer)); + Format(linebuffer, sizeof(linebuffer), "Team filter: %s\n", valuebuffer); + StrCat(buffer, sizeof(buffer), linebuffer); + + Format(linebuffer, sizeof(linebuffer), "Trigger delay: %.2f", volcache[Vol_TriggerDelay]); + StrCat(buffer, sizeof(buffer), linebuffer); + + // Print generic attributes. + ReplyToCommand(client, buffer); + + // Clear buffer. + buffer[0] = 0; + + // Get type spesific attributes. + switch (volcache[Vol_Type]) + { + case VolFeature_Anticamp: + { + VolAnticampDumpData(volcache[Vol_DataIndex], buffer, sizeof(buffer)); + } + case VolFeature_Knockback: + { + + } + } + + // Print type spesific attributes if any. + if (strlen(buffer) > 0) + { + ReplyToCommand(client, buffer); + } + + return Plugin_Handled; + } +} + +public Action:VolDumpStatesCommand(client, argc) +{ + decl String:target[64]; + new targetclient; + + if (argc < 1) + { + ReplyToCommand(client, "Dumps volume states for the specified player. Usage: zr_vol_dumpstates "); + return Plugin_Handled; + } + + // Get target. + GetCmdArg(1, target, sizeof(target)); + targetclient = FindTarget(client, target); + + // Validate target. + if (targetclient <= 0) + { + // Note: FindTarget automatically print error messages. + return Plugin_Handled; + } + + // Print header. + ReplyToCommand(client, "Volume ID: Player in volume:\n----------------------------------------"); + + // Get player states. + new bool:statebuffer[ZR_VOLUMES_MAX]; + VolGetPlayerStates(targetclient, statebuffer, sizeof(statebuffer)); + + // Set language. + SetGlobalTransTarget(client); + + // Loop through each volume. + for (new volumeindex = 0; volumeindex < ZR_VOLUMES_MAX; volumeindex++) + { + // Check if volume is in use. + if (VolInUse(volumeindex)) + { + // Dump state. + ReplyToCommand(client, "%-11d %t", volumeindex, statebuffer[volumeindex] ? "Yes" : "No"); + } + } + + return Plugin_Handled; } /** @@ -59,6 +483,7 @@ public Action:VolAddVolumeCommand(client, argc) * * Note: Extra volume attributes must be set using VolSetAttributes. * + * @param index Optional. Add volume at the specified index. * @param locMin Minimum x, y and z values. * @param locMax Maximum x, y and z values. * @param volumeType Specifies the volumetric feature type. @@ -66,39 +491,43 @@ public Action:VolAddVolumeCommand(client, argc) * * @return The new volume index, or -1 if failed. */ -VolAdd(Float:locMin[3], Float:locMax[3], VolumeFeatureTypes:volumeType, dataIndex) +VolAdd(volumeIndex = -1, Float:locMin[3], Float:locMax[3], VolumeFeatureTypes:volumeType, dataIndex) { - new volumeIndex; - - // Get a free volume index. - volumeIndex = VolGetFreeVolume(); + if (volumeIndex < 0) + { + // Get a free volume index. + volumeIndex = VolGetFreeVolume(); + } // Validate index. - if (volumeIndex >= 0) + if (VolIsValidIndex(volumeIndex)) { // Mark volume as enabled and in use. - Volumes[volumeIndex][vol_enabled] = true; - Volumes[volumeIndex][vol_in_use] = true; + Volumes[volumeIndex][Vol_Enabled] = true; + Volumes[volumeIndex][Vol_InUse] = true; // Set location data. - Volumes[volumeIndex][vol_x_min] = locMin[0]; - Volumes[volumeIndex][vol_y_min] = locMin[1]; - Volumes[volumeIndex][vol_z_min] = locMin[2]; + Volumes[volumeIndex][Vol_xMin] = locMin[0]; + Volumes[volumeIndex][Vol_yMin] = locMin[1]; + Volumes[volumeIndex][Vol_zMin] = locMin[2]; - Volumes[volumeIndex][vol_x_max] = locMax[0]; - Volumes[volumeIndex][vol_y_max] = locMax[1]; - Volumes[volumeIndex][vol_z_max] = locMax[2]; + Volumes[volumeIndex][Vol_xMax] = locMax[0]; + Volumes[volumeIndex][Vol_yMax] = locMax[1]; + Volumes[volumeIndex][Vol_zMax] = locMax[2]; // Set type. - Volumes[volumeIndex][vol_type] = volumeType; - Volumes[volumeIndex][vol_data_index] = dataIndex; + Volumes[volumeIndex][Vol_Type] = volumeType; + Volumes[volumeIndex][Vol_DataIndex] = dataIndex; + + // Update number of volumes. + VolumeCount++; // Return the new index. return volumeIndex; } else { - // No free volumes. + // No free volumes or invalid index. return -1; } } @@ -112,14 +541,22 @@ VolAdd(Float:locMin[3], Float:locMax[3], VolumeFeatureTypes:volumeType, dataInde bool:VolRemove(volumeIndex) { // Validate index. - if (volumeIndex >= 0) + if (VolIsValidIndex(volumeIndex)) { - // Trigger event. - VolOnVolumeDisabled(volumeIndex); + // Trigger event to clean up data and stop timers. + VolOnDisabled(volumeIndex); - // Mark volume as disabled and unused. - Volumes[volumeIndex][vol_enabled] = false; - Volumes[volumeIndex][vol_in_use] = false; + // Clear feature data. + switch (Volumes[volumeIndex][Vol_Type]) + { + case VolFeature_Anticamp: + { + VolAnticampReset(Volumes[volumeIndex][Vol_DataIndex]); + } + } + + // Clear volume data. + VolClear(volumeIndex); return true; } @@ -130,6 +567,31 @@ bool:VolRemove(volumeIndex) } } +/** + * Clears volume data at the specified index. + * + * @param volumeIndex The volume index. + */ +VolClear(volumeIndex) +{ + Volumes[volumeIndex][Vol_Enabled] = false; + Volumes[volumeIndex][Vol_InUse] = false; + + Volumes[volumeIndex][Vol_xMin] = 0.0; + Volumes[volumeIndex][Vol_yMin] = 0.0; + Volumes[volumeIndex][Vol_zMin] = 0.0; + + Volumes[volumeIndex][Vol_xMax] = 0.0; + Volumes[volumeIndex][Vol_yMax] = 0.0; + Volumes[volumeIndex][Vol_zMax] = 0.0; + + Volumes[volumeIndex][Vol_Type] = VolFeature_Invalid; + Volumes[volumeIndex][Vol_DataIndex] = -1; + + Volumes[volumeIndex][Vol_TeamFilter] = VolTeam_All; + Volumes[volumeIndex][Vol_TriggerDelay] = 0.0; +} + /** * Sets extra attributes on a volume. * @@ -142,6 +604,8 @@ VolSetAttributes(volumeIndex, const String:attributes[]) { new attribCount; new successfulCount; + new VolumeFeatureTypes:voltype; + new dataindex; decl String:attribName[64]; decl String:attribValue[256]; @@ -160,8 +624,14 @@ VolSetAttributes(volumeIndex, const String:attributes[]) return -1; } + // Get volumetric feature type. + voltype = Volumes[volumeIndex][Vol_Type]; + + // Get feature data index. + dataindex = Volumes[volumeIndex][Vol_DataIndex]; + // Loop through all attributes. - for (new attrib = 0; attrib > attribCount; attrib++) + for (new attrib = 0; attrib < attribCount; attrib++) { // Get attribute name. GetParameterName(attribName, sizeof(attribName), attributes, attrib); @@ -169,8 +639,10 @@ VolSetAttributes(volumeIndex, const String:attributes[]) // Get attribute value. GetParameterValue(attribValue, sizeof(attribValue), attributes, attribName); - // Check names and set volume attributes. - if (strcmp(attribName, "team", false)) + LogEvent(_, LogType_Normal, LOG_DEBUG, LogModule_Volfeatures, "Set attribute", "Got parameter: \"%s\" = \"%s\"", attribName, attribValue); + + // Check generic attributes. + if (StrEqual(attribName, "teamfilter", false)) { // Parse team string value. if (VolSetTeamString(volumeIndex, attribValue)) @@ -178,7 +650,7 @@ VolSetAttributes(volumeIndex, const String:attributes[]) successfulCount++; } } - else if (strcmp(attribName, "delay", false)) + else if (StrEqual(attribName, "delay", false)) { // Parse delay string value. if (VolSetDelayString(volumeIndex, attribValue)) @@ -186,7 +658,7 @@ VolSetAttributes(volumeIndex, const String:attributes[]) successfulCount++; } } - else if (strcmp(attribName, "effect", false)) + else if (StrEqual(attribName, "effect", false)) { // Parse effect string value. if (VolSetEffectString(volumeIndex, attribValue)) @@ -194,7 +666,7 @@ VolSetAttributes(volumeIndex, const String:attributes[]) successfulCount++; } } - else if (strcmp(attribName, "effect_color", false)) + else if (StrEqual(attribName, "effect_color", false)) { // Parse effect color string value. if (VolSetEffectColorString(volumeIndex, attribValue)) @@ -202,7 +674,7 @@ VolSetAttributes(volumeIndex, const String:attributes[]) successfulCount++; } } - else if (strcmp(attribName, "enabled", false)) + else if (StrEqual(attribName, "enabled", false)) { // Parse enabled string value. if (VolSetEnabledString(volumeIndex, attribValue)) @@ -210,16 +682,23 @@ VolSetAttributes(volumeIndex, const String:attributes[]) successfulCount++; } } + + // Pass attribute onto the volumetric feature attribute handler. + else + { + switch (voltype) + { + case VolFeature_Anticamp: + { + if (VolAnticampSetAttribute(dataindex, attribName, attribValue)) + { + successfulCount++; + } + } + } + } } // Return number of successfully attributes set. return successfulCount; } - -/** - * Creates commands for managing volumes. - */ -VolOnCommandsCreate() -{ - RegAdminCmd("zr_vol_add", VolAddVolumeCommand, ADMFLAG_GENERIC, "Adds a new volume. Usage: zr_vol_add [params]"); -} diff --git a/src/zr/volfeatures/volevents.inc b/src/zr/volfeatures/volevents.inc index 3531c3d..33f1398 100644 --- a/src/zr/volfeatures/volevents.inc +++ b/src/zr/volfeatures/volevents.inc @@ -39,9 +39,11 @@ VolOnPlayerEnter(client, volumeIndex) // Volumetric features disabled. return; } - + + LogEvent(_, LogType_Normal, LOG_DEBUG, LogModule_Volfeatures, "Event", "Player %N entered volume %d.", client, volumeIndex); + // Forward event to features. - // VolAnticampStart(client, volume); + } /** @@ -59,8 +61,10 @@ VolOnPlayerLeave(client, volumeIndex) return; } + LogEvent(_, LogType_Normal, LOG_DEBUG, LogModule_Volfeatures, "Event", "Player %N left volume %d.", client, volumeIndex); + // Forward event to features. - // VolAnticampStop(client, volume); + } /** @@ -106,6 +110,9 @@ VolOnRoundStart() // Start main timer. VolStartUpdateTimer(); + + // Start volumes. + VolEnableVolumes(); } /** @@ -116,26 +123,42 @@ VolOnRoundEnd() // Stop main timer. VolStopUpdateTimer(); - // Forward stop event to features. - // VolAnticampStop(); + // Stop volumes. + VolDisableVolumes(); } /** * Called when a volume is disabled. * @param volumeIndex The volume index. */ -VolOnVolumeDisabled(volumeIndex) +VolOnDisabled(volumeIndex) { - // Forward stop event to features. + new VolumeFeatureTypes:voltype = Volumes[volumeIndex][Vol_Type]; + // Forward stop event to features. + switch (voltype) + { + case VolFeature_Anticamp: + { + VolAnticampDisable(volumeIndex); + } + } } /** * Called when a volume is enabled. * @param volumeIndex The volume index. */ -VolOnVolumeEnabled(volumeIndex) +VolOnEnabled(volumeIndex) { - // Forward start event to features. + new VolumeFeatureTypes:voltype = Volumes[volumeIndex][Vol_Type]; + // Forward stop event to features. + switch (voltype) + { + case VolFeature_Anticamp: + { + VolAnticampEnable(volumeIndex); + } + } } diff --git a/src/zr/volfeatures/volfeatures.inc b/src/zr/volfeatures/volfeatures.inc index f0192d7..1f67dfd 100644 --- a/src/zr/volfeatures/volfeatures.inc +++ b/src/zr/volfeatures/volfeatures.inc @@ -36,30 +36,30 @@ enum VolumeAttributes { /* General */ - bool:vol_enabled, /** Volume state. */ - bool:vol_in_use, /** Marks if the volume is used. */ + bool:Vol_Enabled, /** Volume state. */ + bool:Vol_InUse, /** Marks if the volume is used. */ /* Location */ - Float:vol_x_min, /** Minimum x position. */ - Float:vol_x_max, /** Maximum x position. */ + Float:Vol_xMin, /** Minimum x position. */ + Float:Vol_xMax, /** Maximum x position. */ - Float:vol_y_min, /** Minimum y position. */ - Float:vol_y_max, /** Maximum y position. */ + Float:Vol_yMin, /** Minimum y position. */ + Float:Vol_yMax, /** Maximum y position. */ - Float:vol_z_min, /** Minimum z position. */ - Float:vol_z_max, /** Maximum z position. */ + Float:Vol_zMin, /** Minimum z position. */ + Float:Vol_zMax, /** Maximum z position. */ /* Style */ - VolumeEffects:vol_effect, /** Visual effect to apply on the volume. */ - vol_effect_color[3], /** Render color of the effect. RGB colors. */ + VolumeEffects:Vol_Effect, /** Visual effect to apply on the volume. */ + Vol_EffectColor[3], /** Render color of the effect. RGB colors. */ /* Data */ - VolumeFeatureTypes:vol_type, /** The volumetric feature type. */ - vol_data_index, /** Index in remote feature array. */ + VolumeFeatureTypes:Vol_Type, /** The volumetric feature type. */ + Vol_DataIndex, /** Index in remote feature array. */ /* Behaviour */ - VolumeTeamFilters:vol_team_filter, /** Team filtering. Trigger by certain teams, or all. */ - Float:vol_trigger_delay /** Trigger delay. How many seconds players have to stay to trigger volume events. */ + VolumeTeamFilters:Vol_TeamFilter, /** Team filtering. Trigger by certain teams, or all. */ + Float:Vol_TriggerDelay /** Trigger delay. How many seconds players have to stay to trigger volume events. */ } /** @@ -67,7 +67,8 @@ enum VolumeAttributes */ enum VolumeFeatureTypes { - VolFeature_Anticamp = 0, + VolFeature_Invalid = 0, + VolFeature_Anticamp, VolFeature_Knockback } @@ -106,6 +107,11 @@ new VolumeCount; */ new Float:VolPlayerLoc[MAXPLAYERS + 1][3]; +/** + * Cache that specifies if a player is in a volume or not. + */ +new bool:VolPlayerInVolume[MAXPLAYERS + 1][ZR_VOLUMES_MAX]; + /** * Specifies whether the volumetric features module is enabled or not. Synced * with zr_vol CVAR. @@ -121,7 +127,7 @@ new Float:VolPlayerCountDown[MAXPLAYERS + 1][ZR_VOLUMES_MAX]; * The handle for a timer that updates player locations. This is the main timer * and any feature events can't be updated faster than this interval. * - * Note: Some features may have its own timer. + * Note: Some features may have its own timer for actions on players. */ new Handle:hVolUpdateTimer; @@ -138,6 +144,8 @@ new Float:VolTriggerInterval; #include "zr/volfeatures/volevents" #include "zr/volfeatures/volgenericattributes" #include "zr/volfeatures/volcommands" + +// Sub features. #include "zr/volfeatures/volanticamp" @@ -148,6 +156,9 @@ VolLoad() { // Cache CVAR value. VolEnabled = GetConVarBool(g_hCvarsList[CVAR_VOL]); + + // Initialize sub features. + VolAnticampInit(); } /** @@ -157,8 +168,51 @@ VolDisable() { VolEnabled = false; VolStopUpdateTimer(); + VolDisableVolumes(); - // TODO: Send disable/stop event to volumes with their own timers. + LogEvent(_, LogType_Normal, LOG_DEBUG, LogModule_Volfeatures, "Disabled", "Volfeatures disabled."); +} + +/** + * Function alias for starting volumetric features. + */ +VolEnable() +{ + VolEnabled = true; + VolStartUpdateTimer(); + VolEnableVolumes(); + + LogEvent(_, LogType_Normal, LOG_DEBUG, LogModule_Volfeatures, "Enabled", "Volfeatures enabled."); +} + +/** + * Disables all enabled volumes. + */ +VolDisableVolumes() +{ + // Trigger disable event on all enabled volumes in use. + for (new volindex = 0; volindex < ZR_VOLUMES_MAX; volindex++) + { + if (Volumes[volindex][Vol_InUse] && Volumes[volindex][Vol_Enabled]) + { + VolOnDisabled(volindex); + } + } +} + +/** + * Enables all disabled volumes. + */ +VolEnableVolumes() +{ + // Trigger enable event on all volumes in use. + for (new volindex = 0; volindex < ZR_VOLUMES_MAX; volindex++) + { + if (Volumes[volindex][Vol_InUse] && !Volumes[volindex][Vol_Enabled]) + { + VolOnEnabled(volindex); + } + } } /** @@ -195,7 +249,8 @@ bool:VolStartUpdateTimer() } else { - // Volumetric features disabled. + // Volumetric features disabled. + LogEvent(false, LogType_Error, LOG_CORE_EVENTS, LogModule_Volfeatures, "Config Validation", "Warning: Console variable \"zr_vol_update_interval\" is set to zero or negative. Must be positive."); return false; } } @@ -236,7 +291,7 @@ bool:VolStartTriggerTimer() if (VolTriggerInterval > 0.0) { // Start the timer. - hVolTriggerTimer = CreateTimer(VolTriggerInterval, Event_VolUpdateTimer, _, TIMER_REPEAT); + hVolTriggerTimer = CreateTimer(VolTriggerInterval, Event_VolTriggerTimer, _, TIMER_REPEAT); // Trigger timer started. return true; @@ -244,6 +299,7 @@ bool:VolStartTriggerTimer() else { // Trigger timer not running. Either disabled or invalid interval. + LogEvent(false, LogType_Error, LOG_CORE_EVENTS, LogModule_Volfeatures, "Config Validation", "Warning: Console variable \"zr_vol_trigger_interval\" is set to zero or negative. Must be positive."); return false; } } @@ -302,7 +358,7 @@ VolResetCountDown(client = -1) */ VolUpdatePlayerLocation(client = -1) { - if (client <= 0) + if (client > 0) { // Assume the client is valid and save location in array. GetClientAbsOrigin(client, VolPlayerLoc[client]); @@ -343,10 +399,11 @@ VolUpdatePlayerChanges() // Check if client is in game and alive. if (!IsClientConnected(client) || !IsClientInGame(client) || !IsPlayerAlive(client)) { - return; + // Skip client. + continue; } - // Get the current volume states. + // Get the current volume states based on player location cache. VolGetPlayerStates(client, volumeStates, sizeof(volumeStates)); // Update player location cache. @@ -356,23 +413,37 @@ VolUpdatePlayerChanges() VolGetPlayerStates(client, volumeNewStates, sizeof(volumeNewStates)); // Loop through each volume and compare states. - for (new volumeIndex = 0; volumeIndex < VolumeCount; volumeIndex++) + for (new volumeIndex = 0; volumeIndex < ZR_VOLUMES_MAX; volumeIndex++) { + // Check if the volume is disabled and unused. + if (!VolInUse(volumeIndex) || !VolIsEnabled(volumeIndex)) + { + // Skip volume. + continue; + } + + // Check team filtering on the volume. + if (!VolTeamFilterMatch(client, volumeIndex)) + { + // Team filter mismatch. + continue; + } + newState = volumeNewStates[volumeIndex]; oldState = volumeStates[volumeIndex]; - // Compare new states with old states. + // Check for no change. if (newState == oldState) { // No change. Skip to next volume. - break; + continue; } // Check if client entered the volume. - else if (!newState && oldState) + if (newState && !oldState) { // Get trigger delay value. - trigger_delay = Volumes[volumeIndex][vol_trigger_delay]; + trigger_delay = Volumes[volumeIndex][Vol_TriggerDelay]; // Check if the volume has a trigger delay. if (trigger_delay > 0.0) @@ -382,17 +453,23 @@ VolUpdatePlayerChanges() } else { + // Update cache. + VolPlayerInVolume[client][volumeIndex] = true; + // No trigger delay, trigger event instantly. VolOnPlayerEnter(client, volumeIndex); } } // Check if client left the volume. - else if (newState && !oldState) + else if (!newState && oldState) { // Make sure count down value is reset. VolPlayerCountDown[client][volumeIndex] = -1.0; + // Update cache. + VolPlayerInVolume[client][volumeIndex] = false; + // Trigger event. VolOnPlayerLeave(client, volumeIndex); } @@ -401,20 +478,20 @@ VolUpdatePlayerChanges() } /** - * Returns wether a position is within a certain location. + * Returns wether a point is within a certain location. * - * @param loc The position to check. + * @param point The point to check. * @param min Minimum x, y and z values of the location. * @param max Maximum x, y and z values of the location. * @return True if the position is within min and max values. False * otherwise. */ -bool:IsPositionInLocation(Float:pos[3], Float:min[3], Float:max[3]) +bool:IsPointInLocation(Float:point[3], Float:min[3], Float:max[3]) { - // Cache location to avoid re-indexing arrays. - new Float:posX = pos[0]; - new Float:posY = pos[1]; - new Float:posZ = pos[2]; + // Cache to avoid re-indexing arrays. + new Float:posX = point[0]; + new Float:posY = point[1]; + new Float:posZ = point[2]; // Check if within x boundaries. if ((posX >= min[0]) && (posX <= max[0])) @@ -425,13 +502,13 @@ bool:IsPositionInLocation(Float:pos[3], Float:min[3], Float:max[3]) // Check if within x boundaries. if ((posZ >= min[2]) && (posZ <= max[2])) { - // The player is within the location boundaries. + // The point is within the location boundaries. return true; } } } - // The player is outside the location boundaries. + // The point is outside the location boundaries. return false; } @@ -443,9 +520,22 @@ bool:IsPositionInLocation(Float:pos[3], Float:min[3], Float:max[3]) * @param volumeIndex The volume index. * @return True if in use, false otherwise. */ -bool:VolIsInUse(volumeIndex) +bool:VolInUse(volumeIndex) { - return Volumes[volumeIndex][vol_in_use]; + return Volumes[volumeIndex][Vol_InUse]; +} + +/** + * Returns wether a volume is enabled or not. + * + * Note: Does not validate index. + * + * @param volumeIndex The volume index. + * @return True if enabled, false otherwise. + */ +bool:VolIsEnabled(volumeIndex) +{ + return Volumes[volumeIndex][Vol_Enabled]; } /** @@ -478,7 +568,7 @@ VolGetFreeVolume() for (new volumeIndex = 0; volumeIndex < ZR_VOLUMES_MAX; volumeIndex++) { // Check if it's free. - if (!VolIsInUse(volumeIndex)) + if (!VolInUse(volumeIndex)) { return volumeIndex; } @@ -488,6 +578,69 @@ VolGetFreeVolume() return -1; } +/** + * Gets a free index in the data array for the specified volume type. + * + * @param volumeType Volumetric feature type. + * @return Data index, or -1 on error. + */ +VolGetFreeDataIndex(VolumeFeatureTypes:volumeType) +{ + switch (volumeType) + { + case VolFeature_Anticamp: + { + return VolAnticampGetFreeIndex(); + } + case VolFeature_Knockback: + { + // TOTO: Finish incomplete feature. + return -1; + } + } + + // No match. + return -1; +} + +/** + * Checks if the specified client match the team filtering for the specified + * volume. + * + * @param client The client index. + * @param volumeIndex The volume to check team filtering on. + * @return True if client pass the team filtering, false otherwise. + */ +bool:VolTeamFilterMatch(client, volumeIndex) +{ + new VolumeTeamFilters:filter; + + // Chache filter value. + filter = Volumes[volumeIndex][Vol_TeamFilter]; + + switch (filter) + { + case VolTeam_All: + { + // All maches everyone. + return true; + } + case VolTeam_Humans: + { + // Check if client is a human. + return InfectIsClientHuman(client); + } + case VolTeam_Zombies: + { + // Check if client is a zombie. + return InfectIsClientInfected(client); + } + } + + // Invalid filter value. + return false; +} + /** * Gets wether a client is within volumes or not. Result is stored in a boolean * array. @@ -506,25 +659,25 @@ VolGetPlayerStates(client, bool:buffer[], maxlen) new Float:volMaxBuffer[3]; // Loop through all available volumes. - for (new volumeIndex = 0; volumeIndex < VolumeCount && volumeIndex < maxlen; volumeIndex++) + for (new volumeIndex = 0; volumeIndex < ZR_VOLUMES_MAX && volumeIndex < maxlen; volumeIndex++) { - if (VolIsInUse(volumeIndex)) + if (VolInUse(volumeIndex)) { // Chache volume to avoid re-indexing. volumeBuffer = Volumes[volumeIndex]; // Get min positions. - volMinBuffer[0] = volumeBuffer[vol_x_min]; - volMinBuffer[1] = volumeBuffer[vol_y_min]; - volMinBuffer[2] = volumeBuffer[vol_z_min]; + volMinBuffer[0] = volumeBuffer[Vol_xMin]; + volMinBuffer[1] = volumeBuffer[Vol_yMin]; + volMinBuffer[2] = volumeBuffer[Vol_zMin]; // Get max positions. - volMaxBuffer[0] = volumeBuffer[vol_x_min]; - volMaxBuffer[1] = volumeBuffer[vol_y_min]; - volMaxBuffer[2] = volumeBuffer[vol_z_min]; + volMaxBuffer[0] = volumeBuffer[Vol_xMax]; + volMaxBuffer[1] = volumeBuffer[Vol_yMax]; + volMaxBuffer[2] = volumeBuffer[Vol_zMax]; // Check the cached player location. - if (IsPositionInLocation(VolPlayerLoc[client], volMinBuffer, volMaxBuffer)) + if (IsPointInLocation(VolPlayerLoc[client], volMinBuffer, volMaxBuffer)) { // Mark player as in volume. buffer[volumeIndex] = true; @@ -541,6 +694,65 @@ VolGetPlayerStates(client, bool:buffer[], maxlen) return volCount; } +/** + * Converts a string into a volumetric feature type. + * + * @param volType String to convert. Name of type. + * @return Volumetric feature type or VolFeature_Invalid on error. + */ +VolumeFeatureTypes:VolGetTypeFromString(const String:volType[]) +{ + // Check if empty. + if (strlen(volType) == 0) + { + return VolFeature_Invalid; + } + + // Match types. + if (StrEqual(volType, "anticamp", false)) + { + return VolFeature_Anticamp; + } + else if (StrEqual(volType, "knockback", false)) + { + return VolFeature_Knockback; + } + + // No match. + return VolFeature_Invalid; +} + +/** + * Converts a volume type to a string. + * + * @param volType Volume type to convert. + * @param buffer Destination string buffer. + * @param maxlen Size of destination buffer. + * @param shortName Optional. Write short name or human readable name. + * Default is human readable (false). + * @return Number of cells written. + */ +VolTypeToString(VolumeFeatureTypes:volType, String:buffer[], maxlen, bool:shortName = false) +{ + switch (volType) + { + case VolFeature_Invalid: + { + return shortName ? strcopy(buffer, maxlen, "") : strcopy(buffer, maxlen, "(none)"); + } + case VolFeature_Anticamp: + { + return shortName ? strcopy(buffer, maxlen, "anticamp") : strcopy(buffer, maxlen, "Anti camp"); + } + case VolFeature_Knockback: + { + return shortName ? strcopy(buffer, maxlen, "knockback") : strcopy(buffer, maxlen, "Knock back modifier"); + } + } + + return 0; +} + /** * Callback for update timer. This is the main timer in volumetric features. */ @@ -562,6 +774,13 @@ public Action:Event_VolTriggerTimer(Handle:timer) // Loop through all volumes. for (new volumeIndex = 0; volumeIndex < ZR_VOLUMES_MAX; volumeIndex++) { + // Check if volume is in use and enabled. + if (!VolInUse(volumeIndex) || !VolIsEnabled(volumeIndex)) + { + // Not in use or enabled, skip volume. + continue; + } + // Get count down value. countDown = VolPlayerCountDown[client][volumeIndex]; @@ -571,15 +790,21 @@ public Action:Event_VolTriggerTimer(Handle:timer) // Substract by trigger interval. countDown -= VolTriggerInterval; - // Check if zero or below. + // Check if time is up. if (countDown <= 0.0) { + // Update cache. + VolPlayerInVolume[client][volumeIndex] = true; + // Trigger volume enter event. VolOnPlayerEnter(client, volumeIndex); // Reset count down value. VolPlayerCountDown[client][volumeIndex] = -1.0; } + + // Update count down value and continue. + VolPlayerCountDown[client][volumeIndex] = countDown; } } } @@ -595,10 +820,7 @@ public VolEnabledChanged(Handle:cvar, const String:oldvalue[], const String:newv if (isEnabled) { // Volumetric features is enabled. - VolEnabled = true; - - // Start timers. - VolStartUpdateTimer(); + VolEnable(); } else { diff --git a/src/zr/volfeatures/volgenericattributes.inc b/src/zr/volfeatures/volgenericattributes.inc index 461665a..3632b1d 100644 --- a/src/zr/volfeatures/volgenericattributes.inc +++ b/src/zr/volfeatures/volgenericattributes.inc @@ -44,21 +44,21 @@ stock bool:VolSetTeamString(volumeIndex, const String:team[]) } // Convert value. - if (strcmp(team, "all", false)) + if (StrEqual(team, "all", false)) { teamfilter = VolTeam_All; } - else if (strcmp(team, "humans", false)) + else if (StrEqual(team, "humans", false)) { teamfilter = VolTeam_Humans; } - else if (strcmp(team, "zombies", false)) + else if (StrEqual(team, "zombies", false)) { teamfilter = VolTeam_Zombies; } // Apply value. - Volumes[volumeIndex][vol_team_filter] = teamfilter; + Volumes[volumeIndex][Vol_TeamFilter] = teamfilter; return true; } @@ -71,7 +71,38 @@ stock bool:VolSetTeamString(volumeIndex, const String:team[]) */ stock VolSetTeam(volumeIndex, VolumeTeamFilters:team[]) { - Volumes[volumeIndex][vol_team_filter] = team; + Volumes[volumeIndex][Vol_TeamFilter] = team; +} + +/** + * Converts a team name type to a string. + * + * @param team Team type to convert. + * @param buffer Destination string buffer. + * @param maxlen Size of destination buffer. + * @param shortName Optional. Write short name or human readable name. + * Default is human readable (false). + * @return Number of cells written. + */ +stock VolTeamToString(VolumeTeamFilters:team, String:buffer[], maxlen, bool:shortName = false) +{ + switch (team) + { + case VolTeam_All: + { + return shortName ? strcopy(buffer, maxlen, "all") : strcopy(buffer, maxlen, "All"); + } + case VolTeam_Humans: + { + return shortName ? strcopy(buffer, maxlen, "humans") : strcopy(buffer, maxlen, "Humans"); + } + case VolTeam_Zombies: + { + return shortName ? strcopy(buffer, maxlen, "zombies") : strcopy(buffer, maxlen, "Zombies"); + } + } + + return 0; } /** @@ -96,7 +127,7 @@ stock bool:VolSetDelayString(volumeIndex, const String:delay[]) triggerdelay = StringToFloat(delay); // Apply value. - Volumes[volumeIndex][vol_trigger_delay] = triggerdelay; + Volumes[volumeIndex][Vol_TriggerDelay] = triggerdelay; return true; } @@ -108,7 +139,7 @@ stock bool:VolSetDelayString(volumeIndex, const String:delay[]) */ stock VolSetDelay(volumeIndex, Float:delay) { - Volumes[volumeIndex][vol_trigger_delay] = delay; + Volumes[volumeIndex][Vol_TriggerDelay] = delay; } /** @@ -128,19 +159,19 @@ stock bool:VolSetEffectString(volumeIndex, const String:effect[]) } // Check effect string values and apply them to the volume. - if (strcmp(effect, "none", false)) + if (StrEqual(effect, "none", false)) { - Volumes[volumeIndex][vol_effect] = VolEffect_None; + Volumes[volumeIndex][Vol_Effect] = VolEffect_None; return true; } - else if (strcmp(effect, "wireframe", false)) + else if (StrEqual(effect, "wireframe", false)) { - Volumes[volumeIndex][vol_effect] = VolEffect_Wireframe; + Volumes[volumeIndex][Vol_Effect] = VolEffect_Wireframe; return true; } - else if (strcmp(effect, "smoke", false)) + else if (StrEqual(effect, "smoke", false)) { - Volumes[volumeIndex][vol_effect] = VolEffect_Smoke; + Volumes[volumeIndex][Vol_Effect] = VolEffect_Smoke; return true; } @@ -156,7 +187,38 @@ stock bool:VolSetEffectString(volumeIndex, const String:effect[]) */ stock VolSetEffect(volumeIndex, VolumeEffects:effect) { - Volumes[volumeIndex][vol_effect] = effect; + Volumes[volumeIndex][Vol_Effect] = effect; +} + +/** + * Converts a volume effect type to a string. + * + * @param effect Effect type to convert. + * @param buffer Destination string buffer. + * @param maxlen Size of destination buffer. + * @param shortName Optional. Write short name or human readable name. + * Default is human readable (false). + * @return Number of cells written. + */ +stock VolEffectToString(VolumeEffects:effect, String:buffer[], maxlen, bool:shortName = false) +{ + switch (effect) + { + case VolEffect_None: + { + return shortName ? strcopy(buffer, maxlen, "none") : strcopy(buffer, maxlen, "No effect"); + } + case VolEffect_Wireframe: + { + return shortName ? strcopy(buffer, maxlen, "wireframe") : strcopy(buffer, maxlen, "Wire frame"); + } + case VolEffect_Smoke: + { + return shortName ? strcopy(buffer, maxlen, "smoke") : strcopy(buffer, maxlen, "Smoke"); + } + } + + return 0; } /** @@ -187,9 +249,9 @@ stock bool:VolSetEffectColorString(volumeIndex, const String:effect_color[]) blue = StringToInt(colors[2]); // Apply values. - Volumes[volumeIndex][vol_effect_color][0] = red; - Volumes[volumeIndex][vol_effect_color][1] = green; - Volumes[volumeIndex][vol_effect_color][2] = blue; + Volumes[volumeIndex][Vol_EffectColor][0] = red; + Volumes[volumeIndex][Vol_EffectColor][1] = green; + Volumes[volumeIndex][Vol_EffectColor][2] = blue; return true; } @@ -227,31 +289,31 @@ stock bool:VolSetEnabledString(volumeIndex, const String:enabled[]) new bool:val = bool:StringToInt(enabled); // Check yes or no values first. - if (strcmp(enabled, "yes", false) == 0) + if (StrEqual(enabled, "yes", false)) { val = true; } - else if (strcmp(enabled, "no", false) == 0) + else if (StrEqual(enabled, "no", false)) { val = false; } // Check if the new value is different from the current. - if (Volumes[volumeIndex][vol_enabled] != val) + if (Volumes[volumeIndex][Vol_Enabled] != val) { // Forward event. if (val) { - VolOnVolumeEnabled(volumeIndex); + VolOnEnabled(volumeIndex); } else { - VolOnVolumeDisabled(volumeIndex); + VolOnDisabled(volumeIndex); } } // Apply converted value. - Volumes[volumeIndex][vol_enabled] = val; + Volumes[volumeIndex][Vol_Enabled] = val; return true; } @@ -264,7 +326,7 @@ stock bool:VolSetEnabledString(volumeIndex, const String:enabled[]) stock VolSetEnabled(volumeIndex, bool:enabled) { // Check if the new value is different from the current. - if (Volumes[volumeIndex][vol_enabled] != enabled) + if (Volumes[volumeIndex][Vol_Enabled] != enabled) { // Forward event. if (enabled) @@ -277,5 +339,5 @@ stock VolSetEnabled(volumeIndex, bool:enabled) } } - Volumes[volumeIndex][vol_enabled] = enabled; + Volumes[volumeIndex][Vol_Enabled] = enabled; } From 8127a29235ca9e711c21205732af79f015176ecf Mon Sep 17 00:00:00 2001 From: richard Date: Thu, 16 Jul 2009 10:16:58 +0200 Subject: [PATCH 2/3] Updated compiler and SourceMod include files to version 1.2.1. --- bin/spcomp | Bin 357128 -> 357192 bytes src/include/clients.inc | 4 ++++ src/include/console.inc | 10 +++++----- src/include/menus.inc | 16 +++++++++++----- src/include/tf2.inc | 8 ++++++++ src/include/version.inc | 4 ++-- 6 files changed, 30 insertions(+), 12 deletions(-) diff --git a/bin/spcomp b/bin/spcomp index f52b14d7d05d01d9571658f88676f128181ab02a..904911d0c46b7319a5fa4e235b49dd00eb3fdbfe 100755 GIT binary patch delta 101192 zcmeBpCVJwT=mZ5O4v~pUNwzwFSQtQEbIXT$u85kO-aB{FpGcaiM za&oXUGBD_XXeI^*0}##3z+eKRSr`~BKr|}@gAIsgV_qInn?B0w}R149gm=3}U5NB}YT85mMPv;YG`28b49V8{W{LJSNA zAX=D#p#(&WFfderXi)}+8W1hUz|a7q#Tgh{K(qt{LkEbKWMJq4(NYWy6F{^K1H%*$ zEz7_#14PR)Fw6nb^7RZ13qTA728JadT9JWa1&CH+U|0j9l^GZ|fM^v4hAkjkm4RUg zh*o1@*aM=~85j)g zqU-e;7#@Ha1`G^OK(rwP!wV2?#K7
n_Od;rlV3=CgDv?&9_4-jp}!0-n|n=>#l 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

#=R4jUZnR@FuI%B59bo!`R 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

`ml@|^^AZ?|>-QJ+ZJuIM>n=V+WL;zI69%oSj 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 Date: Fri, 17 Jul 2009 00:20:09 +0200 Subject: [PATCH 3/3] Fixed typo in docs. --- docs/zr_3.0_release_notes.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/zr_3.0_release_notes.txt b/docs/zr_3.0_release_notes.txt index 97771e5..acd7ab8 100644 --- a/docs/zr_3.0_release_notes.txt +++ b/docs/zr_3.0_release_notes.txt @@ -80,7 +80,7 @@ warning is logged in the SourceMod error logs. The validation prevents unexpected or invalid behaviour in the plugin. Dealing with errors or warnings in error logs helps a lot troubleshooting eventual -eventual issues in the plugin caused by incorrect configurations. +issues in the plugin caused by incorrect configurations. It's also possible to specify the path of configuration files. This can be used in combination with map configs, so it's possible to have different