Merged heads.
This commit is contained in:
		| @@ -1104,6 +1104,12 @@ | ||||
| 	"Vol Slay" | ||||
| 	{ | ||||
| 		"#format"	"{1:s},{2:d}" | ||||
| 		"en"		"Player \"{1}\" has been slayed for camping in a restricted area (ID: {2})." | ||||
| 		"en"		"Slayed player \"{1}\" for camping in a restricted area (ID: {2})." | ||||
| 	} | ||||
| 	 | ||||
| 	"Vol Ignite" | ||||
| 	{ | ||||
| 		"#format"	"{1:s},{2:d}" | ||||
| 		"en"		"Ignited player \"{1}\" for camping in a restricted area (ID: {2})." | ||||
| 	} | ||||
| } | ||||
| @@ -282,6 +282,7 @@ public Action:EventPlayerDeath(Handle:event, const String:name[], bool:dontBroad | ||||
|     ZSpawnOnClientDeath(index); | ||||
|     ZTeleOnClientDeath(index); | ||||
|     ZHPOnClientDeath(index); | ||||
|     VolOnPlayerDeath(index); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   | ||||
| @@ -77,6 +77,7 @@ new AnticampData[ZR_VOLUMES_MAX][VolTypeAnticamp]; | ||||
| VolAnticampEnable(volumeIndex) | ||||
| { | ||||
|     new Float:interval; | ||||
|     new Handle:timer; | ||||
|      | ||||
|     // Validate index. | ||||
|     if (!VolIsValidIndex(volumeIndex)) | ||||
| @@ -96,20 +97,27 @@ VolAnticampEnable(volumeIndex) | ||||
|     // Check if in use. | ||||
|     if (AnticampData[dataindex][Anticamp_InUse]) | ||||
|     { | ||||
|         // Start timer if not running. | ||||
|         if (AnticampData[dataindex][Anticamp_Timer] == INVALID_HANDLE) | ||||
|         // Kill timer if it exist. | ||||
|         timer = AnticampData[dataindex][Anticamp_Timer]; | ||||
|         if (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); | ||||
|             } | ||||
|             KillTimer(timer); | ||||
|             AnticampData[dataindex][Anticamp_Timer] = INVALID_HANDLE; | ||||
|         } | ||||
|          | ||||
|         LogEvent(_, LogType_Normal, LOG_DEBUG, LogModule_Volfeatures, "Vol state", "Enabled anticamp volume %d.", volumeIndex); | ||||
|         // Get interval. | ||||
|         interval = AnticampData[dataindex][Anticamp_Interval]; | ||||
|          | ||||
|         // Validate interval. | ||||
|         if (interval > 0.0) | ||||
|         { | ||||
|             AnticampData[dataindex][Anticamp_Timer] = CreateTimer(interval, Event_VolAnticampTrigger, volumeIndex, TIMER_REPEAT); | ||||
|             LogEvent(_, LogType_Normal, LOG_DEBUG, LogModule_Volfeatures, "Vol state", "Enabled anticamp volume %d.", volumeIndex); | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             LogEvent(_, LogType_Error, LOG_CORE_EVENTS, LogModule_Volfeatures, "Config Validation", "Warning: Invalid interval %.2f in anticamp volume %d.", interval, volumeIndex); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| @@ -119,24 +127,44 @@ VolAnticampEnable(volumeIndex) | ||||
| stock VolAnticampEnableAll() | ||||
| { | ||||
|     new Float:interval; | ||||
|     new dataindex; | ||||
|      | ||||
|     // Loop through all volumes. | ||||
|     for (new dataindex = 0; dataindex < ZR_VOLUMES_MAX; dataindex++) | ||||
|     for (new volumeindex = 0; volumeindex < ZR_VOLUMES_MAX; volumeindex++) | ||||
|     { | ||||
|         // Check if in use. | ||||
|         if (AnticampData[dataindex][Anticamp_InUse]) | ||||
|         // Check if unused. | ||||
|         if (!VolInUse(volumeindex)) | ||||
|         { | ||||
|             // Start timer if not running. | ||||
|             if (AnticampData[dataindex][Anticamp_Timer] == INVALID_HANDLE) | ||||
|             { | ||||
|                 // Get interval. | ||||
|                 interval = AnticampData[dataindex][Anticamp_Interval]; | ||||
|             // Volume not in use, skip it. | ||||
|             continue; | ||||
|         } | ||||
|          | ||||
|                 // Validate interval. | ||||
|                 if (interval > 0.0) | ||||
|                 { | ||||
|                     AnticampData[dataindex][Anticamp_Timer] = CreateTimer(interval, Event_VolAnticampTrigger, _, TIMER_REPEAT); | ||||
|                 } | ||||
|         // Check if it's a anticamp volume. | ||||
|         if (VolIsType(volumeindex, VolFeature_Anticamp)) | ||||
|         { | ||||
|             // Get data index. | ||||
|             dataindex = Volumes[volumeindex][Vol_DataIndex]; | ||||
|              | ||||
|             // Kill timer if it exist. | ||||
|             timer = AnticampData[dataindex][Anticamp_Timer]; | ||||
|             if (timer != INVALID_HANDLE) | ||||
|             { | ||||
|                 KillTimer(timer); | ||||
|                 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, volumeindex, TIMER_REPEAT); | ||||
|                 LogEvent(_, LogType_Normal, LOG_DEBUG, LogModule_Volfeatures, "Vol state", "Enabled anticamp volume %d.", volumeIndex); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 LogEvent(_, LogType_Error, LOG_CORE_EVENTS, LogModule_Volfeatures, "Config Validation", "Warning: Invalid interval %.2f in anticamp volume %d.", interval, volumeIndex); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| @@ -242,23 +270,37 @@ VolAnticampInit() | ||||
| /** | ||||
|  * Timer callback for anticamp volumes. Applies actions on players in volumes. | ||||
|  */ | ||||
| public Action:Event_VolAnticampTrigger(Handle:timer) | ||||
| public Action:Event_VolAnticampTrigger(Handle:timer, any:volumeIndex) | ||||
| { | ||||
|     // Loop through all players. | ||||
|     for (new client = 1; client <= MaxClients; client++) | ||||
|     { | ||||
|         // Loop through all volumes. | ||||
|         for (new volumeindex = 0; volumeindex < ZR_VOLUMES_MAX; volumeindex++) | ||||
|         // Validate client's connection state. | ||||
|         if (!IsClientConnected(client) || !IsClientInGame(client) || !IsPlayerAlive(client)) | ||||
|         { | ||||
|             // Check if the volume is enabled and in use. | ||||
|             if (VolIsEnabled(volumeindex) && VolInUse(volumeindex)) | ||||
|             continue; | ||||
|         } | ||||
|          | ||||
|         // Check if the volume is unused. | ||||
|         if (!VolInUse(volumeIndex)) | ||||
|         { | ||||
|             continue; | ||||
|         } | ||||
|          | ||||
|         // Check if the volume is disabled. | ||||
|         if (!VolIsEnabled(volumeIndex)) | ||||
|         { | ||||
|             continue; | ||||
|         } | ||||
|          | ||||
|         // Check if it's a anticamp volume. | ||||
|         if (VolIsType(volumeIndex, VolFeature_Anticamp)) | ||||
|         { | ||||
|             // Check if player is in the volume. | ||||
|             if (VolPlayerInVolume[client][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); | ||||
|                 } | ||||
|                 // Apply action. | ||||
|                 VolAnticampApplyAction(client, Volumes[volumeIndex][Vol_DataIndex], volumeIndex); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| @@ -275,6 +317,13 @@ VolAnticampApplyAction(client, dataIndex, volumeIndex) | ||||
| { | ||||
|     new Float:amount = AnticampData[dataIndex][Anticamp_Amount]; | ||||
|      | ||||
|     // Set client language. | ||||
|     SetGlobalTransTarget(client); | ||||
|      | ||||
|     // Get player name. | ||||
|     decl String:name[64]; | ||||
|     GetClientName(client, name, sizeof(name)); | ||||
|      | ||||
|     // Send warning message. | ||||
|     VolAnticampWarnPlayer(client, dataIndex); | ||||
|      | ||||
| @@ -286,11 +335,9 @@ VolAnticampApplyAction(client, dataIndex, volumeIndex) | ||||
|         } | ||||
|         case Anticamp_Damage: | ||||
|         { | ||||
|             // Give damage to player. Kill if zero HP. | ||||
|             // Give damage to player. Kill if zero HP or below. | ||||
|             new damage = RoundToNearest(amount); | ||||
|             new health = GetClientHealth(client) - damage; | ||||
|             decl String:name[64]; | ||||
|             decl String:buffer[256]; | ||||
|              | ||||
|             if (health > 0) | ||||
|             { | ||||
| @@ -302,29 +349,32 @@ VolAnticampApplyAction(client, dataIndex, volumeIndex) | ||||
|                 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); | ||||
|                 }*/ | ||||
|                 LogEvent(false, LogType_Normal, LOG_GAME_EVENTS, LogModule_Volfeatures, "Anti-camp", "%t", "Vol Slay", name, volumeIndex); | ||||
|             } | ||||
|         } | ||||
|         case Anticamp_Slay: | ||||
|         { | ||||
|             // Instantly kill the player. | ||||
|             ForcePlayerSuicide(client); | ||||
|              | ||||
|             // Log event. | ||||
|             LogEvent(false, LogType_Normal, LOG_GAME_EVENTS, LogModule_Volfeatures, "Anti-camp", "%t", "Vol Slay", name, volumeIndex); | ||||
|         } | ||||
|         case Anticamp_Drug: | ||||
|         { | ||||
|              | ||||
|             // TODO: Trigger sm_drug on client some how. | ||||
|         } | ||||
|         case Anticamp_Ignite: | ||||
|         { | ||||
|             // Validate amount. | ||||
|             if (amount > 0.0) | ||||
|             { | ||||
|                 // Ignite player for "amount" seconds. | ||||
|                 IgniteEntity(client, amount); | ||||
|                  | ||||
|                 // Log event. | ||||
|                 LogEvent(false, LogType_Normal, LOG_GAME_EVENTS, LogModule_Volfeatures, "Anti-camp", "%t", "Vol Ignite", name, volumeIndex); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -351,7 +401,7 @@ VolAnticampWarnPlayer(client, dataIndex) | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|         // Use message in translations file. | ||||
|         // Use default anticamp message in translations file. | ||||
|         Format(buffer, sizeof(buffer), "%t", "Vol Anticamp Message"); | ||||
|     } | ||||
|      | ||||
| @@ -415,6 +465,10 @@ VolAnticampGetFreeIndex() | ||||
|         // Check if it's free. | ||||
|         if (!AnticampData[dataindex][Anticamp_InUse]) | ||||
|         { | ||||
|             // Mark as in use. | ||||
|             AnticampData[dataindex][Anticamp_InUse] = true; | ||||
|              | ||||
|             // Return the new index. | ||||
|             return dataindex; | ||||
|         } | ||||
|     } | ||||
|   | ||||
| @@ -223,7 +223,6 @@ public Action:VolAddVolumeCommand(client, argc) | ||||
|          | ||||
|         // 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 | ||||
|     { | ||||
| @@ -240,6 +239,9 @@ public Action:VolAddVolumeCommand(client, argc) | ||||
|         Format(buffer, sizeof(buffer), "Additional attributes set: %d", paramcount); | ||||
|     } | ||||
|      | ||||
|     // Send enable event to volume. | ||||
|     VolOnEnabled(volindex); | ||||
|      | ||||
|     ReplyToCommand(client, "Added volume at index %d. %s", volindex, buffer); | ||||
|     return Plugin_Handled; | ||||
| } | ||||
|   | ||||
| @@ -85,6 +85,38 @@ VolOnPlayerSpawn(client) | ||||
|     VolUpdatePlayerLocation(client); | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Called when a player died. | ||||
|  * | ||||
|  * @param client    The client index. | ||||
|  */ | ||||
| VolOnPlayerDeath(client) | ||||
| { | ||||
|     // Send player left volume event to all volumes the player was in. | ||||
|     for (new volindex = 0; volindex < ZR_VOLUMES_MAX; volindex++) | ||||
|     { | ||||
|         // Check if volume is unused. | ||||
|         if (!Volumes[volindex][Vol_InUse]) | ||||
|         { | ||||
|             continue; | ||||
|         } | ||||
|          | ||||
|         // Check if volume is disabled. | ||||
|         if (!Volumes[volindex][Vol_Enabled]) | ||||
|         { | ||||
|             continue; | ||||
|         } | ||||
|          | ||||
|         // Check if player is inside the volume. | ||||
|         if (VolPlayerInVolume[client][volindex]) | ||||
|         { | ||||
|             // Mark as not in the volume and trigger event. | ||||
|             VolPlayerInVolume[client][volindex] = false; | ||||
|             VolOnPlayerLeave(client, volindex); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Called when a player disconnects. | ||||
|  * | ||||
| @@ -94,6 +126,9 @@ VolOnPlayerDisconnect(client) | ||||
| { | ||||
|     // Disable trigger delay counters. | ||||
|     VolResetCountDown(client); | ||||
|      | ||||
|     // Trigger death event to clean up. | ||||
|     VolOnPlayerDeath(client); | ||||
| } | ||||
|  | ||||
| /** | ||||
| @@ -133,6 +168,13 @@ VolOnRoundEnd() | ||||
|  */ | ||||
| VolOnDisabled(volumeIndex) | ||||
| { | ||||
|     // Check if volumetric features is enabled. | ||||
|     if (!VolEnabled) | ||||
|     { | ||||
|         // Volumetric features disabled. | ||||
|         return; | ||||
|     } | ||||
|      | ||||
|     new VolumeFeatureTypes:voltype = Volumes[volumeIndex][Vol_Type]; | ||||
|      | ||||
|     // Forward stop event to features. | ||||
| @@ -151,6 +193,13 @@ VolOnDisabled(volumeIndex) | ||||
|  */ | ||||
| VolOnEnabled(volumeIndex) | ||||
| { | ||||
|     // Check if volumetric features is enabled. | ||||
|     if (!VolEnabled) | ||||
|     { | ||||
|         // Volumetric features disabled. | ||||
|         return; | ||||
|     } | ||||
|      | ||||
|     new VolumeFeatureTypes:voltype = Volumes[volumeIndex][Vol_Type]; | ||||
|      | ||||
|     // Forward stop event to features. | ||||
|   | ||||
| @@ -195,6 +195,28 @@ VolDisableVolumes() | ||||
|     { | ||||
|         if (Volumes[volindex][Vol_InUse] && Volumes[volindex][Vol_Enabled]) | ||||
|         { | ||||
|             // Mark as disabled. | ||||
|             Volumes[volindex][Vol_Enabled] = false; | ||||
|              | ||||
|             // Trigger player left volume event if inside a volume. | ||||
|             for (new client = 1; client <= MaxClients; client++) | ||||
|             { | ||||
|                 // Validate client's connection state. | ||||
|                 if (!IsClientConnected(client) || !IsClientInGame(client)) | ||||
|                 { | ||||
|                     continue; | ||||
|                 } | ||||
|                  | ||||
|                 // Check if player is inside the volume. | ||||
|                 if (VolPlayerInVolume[client][volindex]) | ||||
|                 { | ||||
|                     // Mark as not in the volume and trigger event. | ||||
|                     VolPlayerInVolume[client][volindex] = false; | ||||
|                     VolOnPlayerLeave(client, volindex); | ||||
|                 } | ||||
|             } | ||||
|              | ||||
|             // Trigger disabled event. | ||||
|             VolOnDisabled(volindex); | ||||
|         } | ||||
|     } | ||||
| @@ -210,6 +232,7 @@ VolEnableVolumes() | ||||
|     { | ||||
|         if (Volumes[volindex][Vol_InUse] && !Volumes[volindex][Vol_Enabled]) | ||||
|         { | ||||
|             Volumes[volindex][Vol_Enabled] = true; | ||||
|             VolOnEnabled(volindex); | ||||
|         } | ||||
|     } | ||||
| @@ -367,10 +390,10 @@ VolUpdatePlayerLocation(client = -1) | ||||
|     { | ||||
|         for (client = 1; client <= MaxClients; client++) | ||||
|         { | ||||
|             // Check if client is in game and alive. | ||||
|             // Validate client's connection state. | ||||
|             if (!IsClientConnected(client) || !IsClientInGame(client) || !IsPlayerAlive(client)) | ||||
|             { | ||||
|                 return; | ||||
|                 continue; | ||||
|             } | ||||
|              | ||||
|             // Save location in array. | ||||
| @@ -396,7 +419,7 @@ VolUpdatePlayerChanges() | ||||
|     // Loop through all players. | ||||
|     for (new client = 1; client <= MaxClients; client++) | ||||
|     { | ||||
|         // Check if client is in game and alive. | ||||
|         // Validate client's connection state. | ||||
|         if (!IsClientConnected(client) || !IsClientInGame(client) || !IsPlayerAlive(client)) | ||||
|         { | ||||
|             // Skip client. | ||||
| @@ -467,11 +490,17 @@ VolUpdatePlayerChanges() | ||||
|                 // Make sure count down value is reset. | ||||
|                 VolPlayerCountDown[client][volumeIndex] = -1.0; | ||||
|                  | ||||
|                 // Update cache. | ||||
|                 VolPlayerInVolume[client][volumeIndex] = false; | ||||
|                 // Only trigger left volume event if player already is in the | ||||
|                 // volume, so volumes with trigger delay won't get a left event | ||||
|                 // before the enter event. | ||||
|                 if (VolPlayerInVolume[client][volumeIndex]) | ||||
|                 { | ||||
|                     // Update cache. | ||||
|                     VolPlayerInVolume[client][volumeIndex] = false; | ||||
|                      | ||||
|                 // Trigger event. | ||||
|                 VolOnPlayerLeave(client, volumeIndex); | ||||
|                     // Trigger event. | ||||
|                     VolOnPlayerLeave(client, volumeIndex); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| @@ -641,6 +670,18 @@ bool:VolTeamFilterMatch(client, volumeIndex) | ||||
|     return false; | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Checs if a volume is a certain type. | ||||
|  * | ||||
|  * @param volumeIndex   Volume to check. | ||||
|  * @param volType       Type to match. | ||||
|  * @return              True if the types match, false otherwise. | ||||
|  */ | ||||
| bool:VolIsType(volumeIndex, VolumeFeatureTypes:volType) | ||||
| { | ||||
|     return Volumes[volumeIndex][Vol_Type] == volType; | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Gets wether a client is within volumes or not. Result is stored in a boolean | ||||
|  * array. | ||||
|   | ||||
		Reference in New Issue
	
	Block a user