From 8c2494f0528554e503f875ff0c12fa14b98ebf50 Mon Sep 17 00:00:00 2001 From: richard Date: Thu, 8 Oct 2009 00:49:31 +0200 Subject: [PATCH] Cleanup in volfeatures. Moved tool functions into a new file. Decreased max volumes to 32. --- src/zr/volfeatures/volfeatures.inc | 292 +-------------------------- src/zr/volfeatures/voltools.inc | 313 +++++++++++++++++++++++++++++ 2 files changed, 316 insertions(+), 289 deletions(-) create mode 100644 src/zr/volfeatures/voltools.inc diff --git a/src/zr/volfeatures/volfeatures.inc b/src/zr/volfeatures/volfeatures.inc index e3deba8..0d3acc9 100644 --- a/src/zr/volfeatures/volfeatures.inc +++ b/src/zr/volfeatures/volfeatures.inc @@ -5,7 +5,7 @@ * * File: volfeatures.inc * Type: Module - * Description: Provides functions for managing volumetric features. + * Description: Volumetric feature manager. * * Copyright (C) 2009 Greyscale, Richard Helgeby * @@ -28,7 +28,7 @@ /** * Total volumes that can be created in a map. */ -#define ZR_VOLUMES_MAX 64 +#define ZR_VOLUMES_MAX 32 /** * Represent a rectangular volume. @@ -152,6 +152,7 @@ new Handle:hVolTriggerTimer; */ new Float:VolTriggerInterval; +#include "zr/volfeatures/voltools" #include "zr/volfeatures/volevents" #include "zr/volfeatures/volgenericattributes" #include "zr/volfeatures/volcommands" @@ -528,293 +529,6 @@ VolUpdatePlayerChanges() } } -/** - * Returns wether a point is within a certain location. - * - * @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:IsPointInLocation(Float:point[3], Float:min[3], Float:max[3]) -{ - // 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])) - { - // Check if within y boundaries. - if ((posY >= min[1]) && (posY <= max[1])) - { - // Check if within x boundaries. - if ((posZ >= min[2]) && (posZ <= max[2])) - { - // The point is within the location boundaries. - return true; - } - } - } - - // The point is outside the location boundaries. - return false; -} - -/** - * Returns wether a volume is marked as in use. - * - * Note: Does not validate index. - * - * @param volumeIndex The volume index. - * @return True if in use, false otherwise. - */ -bool:VolInUse(volumeIndex) -{ - 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]; -} - -/** - * Validates a volume index. - * - * @param volumeIndex The volume index. - * @return True if valid, false otherwise. - */ -bool:VolIsValidIndex(volumeIndex) -{ - if (volumeIndex >= 0 && volumeIndex < ZR_VOLUMES_MAX) - { - return true; - } - else - { - return false; - } -} - -/** - * Gets the first free volume index. - * - * @return The first free volume index if successful, or -1 if there are - * no free volumes. - */ -VolGetFreeVolume() -{ - // Loop through all volumes. - for (new volumeIndex = 0; volumeIndex < ZR_VOLUMES_MAX; volumeIndex++) - { - // Check if it's free. - if (!VolInUse(volumeIndex)) - { - return volumeIndex; - } - } - - // No free volumes found. - 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_ClassEdit: - { - return VolClassEditGetFreeIndex(); - } - } - - // 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; -} - -/** - * 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. - * - * @param client The client index. - * @param buffer Destination buffer. - * @param maxlen Size of destination buffer. - * @return Number of volumes the client is within. - */ -VolGetPlayerStates(client, bool:buffer[], maxlen) -{ - new volumeBuffer[VolumeAttributes]; - new volCount; - - new Float:volMinBuffer[3]; - new Float:volMaxBuffer[3]; - - // Loop through all available volumes. - for (new volumeIndex = 0; volumeIndex < ZR_VOLUMES_MAX && volumeIndex < maxlen; volumeIndex++) - { - if (VolInUse(volumeIndex)) - { - // Chache volume to avoid re-indexing. - volumeBuffer = Volumes[volumeIndex]; - - // Get min positions. - volMinBuffer[0] = volumeBuffer[Vol_xMin]; - volMinBuffer[1] = volumeBuffer[Vol_yMin]; - volMinBuffer[2] = volumeBuffer[Vol_zMin]; - - // Get max positions. - volMaxBuffer[0] = volumeBuffer[Vol_xMax]; - volMaxBuffer[1] = volumeBuffer[Vol_yMax]; - volMaxBuffer[2] = volumeBuffer[Vol_zMax]; - - // Check the cached player location. - if (IsPointInLocation(VolPlayerLoc[client], volMinBuffer, volMaxBuffer)) - { - // Mark player as in volume. - buffer[volumeIndex] = true; - volCount++; - } - else - { - // Do explicit reset. - buffer[volumeIndex] = false; - } - } - } - - 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, "classedit", false)) - { - return VolFeature_ClassEdit; - } - - // 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_ClassEdit: - { - return shortName ? strcopy(buffer, maxlen, "classedit") : strcopy(buffer, maxlen, "Class Editor"); - } - } - - return 0; -} - /** * Callback for update timer. This is the main timer in volumetric features. */ diff --git a/src/zr/volfeatures/voltools.inc b/src/zr/volfeatures/voltools.inc new file mode 100644 index 0000000..685bf82 --- /dev/null +++ b/src/zr/volfeatures/voltools.inc @@ -0,0 +1,313 @@ +/* + * ============================================================================ + * + * Zombie:Reloaded + * + * File: voltools.inc + * Type: Module + * Description: Provides functions for managing volumes. + * + * 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 . + * + * ============================================================================ + */ + +/** + * Returns wether a point is within a certain location. + * + * @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:IsPointInLocation(Float:point[3], Float:min[3], Float:max[3]) +{ + // 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])) + { + // Check if within y boundaries. + if ((posY >= min[1]) && (posY <= max[1])) + { + // Check if within x boundaries. + if ((posZ >= min[2]) && (posZ <= max[2])) + { + // The point is within the location boundaries. + return true; + } + } + } + + // The point is outside the location boundaries. + return false; +} + +/** + * Returns wether a volume is marked as in use. + * + * Note: Does not validate index. + * + * @param volumeIndex The volume index. + * @return True if in use, false otherwise. + */ +bool:VolInUse(volumeIndex) +{ + 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]; +} + +/** + * Validates a volume index. + * + * @param volumeIndex The volume index. + * @return True if valid, false otherwise. + */ +bool:VolIsValidIndex(volumeIndex) +{ + if (volumeIndex >= 0 && volumeIndex < ZR_VOLUMES_MAX) + { + return true; + } + else + { + return false; + } +} + +/** + * Gets the first free volume index. + * + * @return The first free volume index if successful, or -1 if there are + * no free volumes. + */ +VolGetFreeVolume() +{ + // Loop through all volumes. + for (new volumeIndex = 0; volumeIndex < ZR_VOLUMES_MAX; volumeIndex++) + { + // Check if it's free. + if (!VolInUse(volumeIndex)) + { + return volumeIndex; + } + } + + // No free volumes found. + 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_ClassEdit: + { + return VolClassEditGetFreeIndex(); + } + } + + // 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; +} + +/** + * 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. + * + * @param client The client index. + * @param buffer Destination buffer. + * @param maxlen Size of destination buffer. + * @return Number of volumes the client is within. + */ +VolGetPlayerStates(client, bool:buffer[], maxlen) +{ + new volumeBuffer[VolumeAttributes]; + new volCount; + + new Float:volMinBuffer[3]; + new Float:volMaxBuffer[3]; + + // Loop through all available volumes. + for (new volumeIndex = 0; volumeIndex < ZR_VOLUMES_MAX && volumeIndex < maxlen; volumeIndex++) + { + if (VolInUse(volumeIndex)) + { + // Chache volume to avoid re-indexing. + volumeBuffer = Volumes[volumeIndex]; + + // Get min positions. + volMinBuffer[0] = volumeBuffer[Vol_xMin]; + volMinBuffer[1] = volumeBuffer[Vol_yMin]; + volMinBuffer[2] = volumeBuffer[Vol_zMin]; + + // Get max positions. + volMaxBuffer[0] = volumeBuffer[Vol_xMax]; + volMaxBuffer[1] = volumeBuffer[Vol_yMax]; + volMaxBuffer[2] = volumeBuffer[Vol_zMax]; + + // Check the cached player location. + if (IsPointInLocation(VolPlayerLoc[client], volMinBuffer, volMaxBuffer)) + { + // Mark player as in volume. + buffer[volumeIndex] = true; + volCount++; + } + else + { + // Do explicit reset. + buffer[volumeIndex] = false; + } + } + } + + 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, "classedit", false)) + { + return VolFeature_ClassEdit; + } + + // 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_ClassEdit: + { + return shortName ? strcopy(buffer, maxlen, "classedit") : strcopy(buffer, maxlen, "Class Editor"); + } + } + + return 0; +}