Cleanup in volfeatures.
Moved tool functions into a new file. Decreased max volumes to 32.
This commit is contained in:
parent
0d484132f9
commit
8c2494f052
@ -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.
|
||||
*/
|
||||
|
313
src/zr/volfeatures/voltools.inc
Normal file
313
src/zr/volfeatures/voltools.inc
Normal file
@ -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 <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* ============================================================================
|
||||
*/
|
||||
|
||||
/**
|
||||
* 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;
|
||||
}
|
Loading…
Reference in New Issue
Block a user