Finished base management for volumetric features. Code compiles, but this feature is not tested so far!
Made CVARs for volumetric features module. Made trigger delay attribute for volumes, per player. Count down for n seconds after when a player enter. When leaving a volume trigger delay is aborted. Made parameter parsing functions; paramtools.inc. Made functions for setting and parsing generic volume attributes. Updated header in files to volumetric features and paramtools.inc. Removed unused knockback functions in zadmin.inc. Made certain class functions into stock functions.
This commit is contained in:
@ -1,11 +1,26 @@
|
||||
/*
|
||||
* ============================================================================
|
||||
*
|
||||
* Zombie:Reloaded
|
||||
* Zombie:Reloaded
|
||||
*
|
||||
* File: volfeatures.inc
|
||||
* Type: Module
|
||||
* Description: Provides functions for managing volumetric features.
|
||||
* File: volfeatures.inc
|
||||
* Type: Module
|
||||
* Description: Provides functions for managing volumetric features.
|
||||
*
|
||||
* 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/>.
|
||||
*
|
||||
* ============================================================================
|
||||
*/
|
||||
@ -21,23 +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_in_use, /** Marks if the volume is used. */
|
||||
|
||||
/* Location */
|
||||
Float:vol_x_min, /** Minimum x position. */
|
||||
Float:vol_x_max, /** Maximum x position. */
|
||||
Float:vol_x_min, /** Minimum x position. */
|
||||
Float:vol_x_max, /** Maximum x position. */
|
||||
|
||||
Float:vol_y_min, /** Minimum y position. */
|
||||
Float:vol_y_max, /** Maximum y position. */
|
||||
Float:vol_y_min, /** Minimum y position. */
|
||||
Float:vol_y_max, /** Maximum y position. */
|
||||
|
||||
Float:vol_z_min, /** Minimum z position. */
|
||||
Float:vol_z_max, /** Maximum z position. */
|
||||
Float:vol_z_min, /** Minimum z position. */
|
||||
Float:vol_z_max, /** 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. */
|
||||
|
||||
/* Data */
|
||||
VolumeEffects:vol_effect, /** Visual effect to apply on the volume. */
|
||||
VolumeFeatureTypes:vol_type, /** The volumetric feature type. */
|
||||
vol_data_index /** Index in remote feature array. */
|
||||
VolumeFeatureTypes:vol_type, /** The volumetric feature type. */
|
||||
vol_data_index, /** 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. */
|
||||
}
|
||||
|
||||
/**
|
||||
@ -49,6 +71,9 @@ enum VolumeFeatureTypes
|
||||
VolFeature_Knockback
|
||||
}
|
||||
|
||||
/**
|
||||
* Effects that can be applied on a volume. (Currently no effects.)
|
||||
*/
|
||||
enum VolumeEffects
|
||||
{
|
||||
VolEffect_None = 0,
|
||||
@ -56,6 +81,16 @@ enum VolumeEffects
|
||||
VolEffect_Smoke
|
||||
}
|
||||
|
||||
/**
|
||||
* Available team filter settings.
|
||||
*/
|
||||
enum VolumeTeamFilters
|
||||
{
|
||||
VolTeam_All = 0,
|
||||
VolTeam_Humans,
|
||||
VolTeam_Zombies
|
||||
}
|
||||
|
||||
/**
|
||||
* Volumes.
|
||||
*/
|
||||
@ -72,56 +107,95 @@ new VolumeCount;
|
||||
new Float:VolPlayerLoc[MAXPLAYERS + 1][3];
|
||||
|
||||
/**
|
||||
* Specifies whether the volumetric features module is enabled or not. To be
|
||||
* synced with zr_volfeatures_enabled CVAR.
|
||||
* Specifies whether the volumetric features module is enabled or not. Synced
|
||||
* with zr_vol CVAR.
|
||||
*/
|
||||
new bool:VolEnabled;
|
||||
|
||||
/**
|
||||
* Timer handle for timer that updates player locations. This is the main timer
|
||||
* Counter for trigger delay.
|
||||
*/
|
||||
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.
|
||||
*/
|
||||
new Handle:hVolUpdateTimer;
|
||||
|
||||
/**
|
||||
* The handle for a timer that do count down on trigger delays.
|
||||
*/
|
||||
new Handle:hVolTriggerTimer;
|
||||
|
||||
/**
|
||||
* Cached interval value for trigger timer.
|
||||
*/
|
||||
new Float:VolTriggerInterval;
|
||||
|
||||
#include "zr/volfeatures/volevents"
|
||||
#include "zr/volfeatures/volgenericattributes"
|
||||
#include "zr/volfeatures/volcommands"
|
||||
#include "zr/volfeatures/volanticamp"
|
||||
|
||||
|
||||
/**
|
||||
* Initialize volumetric features.
|
||||
*/
|
||||
VolLoad()
|
||||
{
|
||||
// Cache CVAR value.
|
||||
VolEnabled = GetConVarBool(g_hCvarsList[CVAR_VOL]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Function alias for fully stopping volumetric features.
|
||||
*/
|
||||
VolDisable()
|
||||
{
|
||||
VolEnabled = false;
|
||||
VolStopUpdateTimer();
|
||||
|
||||
// TODO: Send disable/stop event to volumes with their own timers.
|
||||
}
|
||||
|
||||
/**
|
||||
* Starts the update timer.
|
||||
*
|
||||
* @return True if timer is started, false otherwise.
|
||||
*/
|
||||
bool:VolStartUpdateTimer()
|
||||
{
|
||||
// TODO: Read from CVAR (zr_volfeatures_enabled).
|
||||
VolEnabled = true;
|
||||
|
||||
// Check if volumetric features is enabled.
|
||||
if (!VolEnabled)
|
||||
{
|
||||
// Volumetric features disabled.
|
||||
return false;
|
||||
}
|
||||
|
||||
// TODO: Read from CVAR (zr_volfeatures_interval).
|
||||
new Float:interval = 1.0;
|
||||
// Stop timer if it exist.
|
||||
VolStopUpdateTimer();
|
||||
|
||||
// Get update interval.
|
||||
new Float:interval = GetConVarFloat(g_hCvarsList[CVAR_VOL_UPDATE_INTERVAL]);
|
||||
|
||||
// Validate interval.
|
||||
if (interval > 0.0)
|
||||
{
|
||||
// Stop timer if it exist.
|
||||
VolStopUpdateTimer();
|
||||
|
||||
// Create a new timer.
|
||||
hVolUpdateTimer = CreateTimer(interval, Event_VolUpdateTimer, _, TIMER_REPEAT);
|
||||
|
||||
// Also start the trigger delay timer.
|
||||
VolStartTriggerTimer();
|
||||
|
||||
// Volumetric features started.
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Volumetric features disabled. Do explicit stop.
|
||||
VolStopUpdateTimer();
|
||||
|
||||
// Volumetric features disabled.
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@ -137,6 +211,84 @@ VolStopUpdateTimer()
|
||||
KillTimer(hVolUpdateTimer);
|
||||
hVolUpdateTimer = INVALID_HANDLE;
|
||||
}
|
||||
|
||||
// Also stop trigger delay timer.
|
||||
VolStopTriggerTimer();
|
||||
|
||||
// Reset all trigger delay counters.
|
||||
VolResetCountDown();
|
||||
}
|
||||
|
||||
/**
|
||||
* Starts the update timer if it exists.
|
||||
*
|
||||
* @return True if timer is started, false otherwise.
|
||||
*/
|
||||
bool:VolStartTriggerTimer()
|
||||
{
|
||||
// Make sure existing timer is killed.
|
||||
VolStopTriggerTimer();
|
||||
|
||||
// Get trigger interval and cache it.
|
||||
VolTriggerInterval = GetConVarFloat(g_hCvarsList[CVAR_VOL_TRIGGER_INTERVAL]);
|
||||
|
||||
// Validate interval.
|
||||
if (VolTriggerInterval > 0.0)
|
||||
{
|
||||
// Start the timer.
|
||||
hVolTriggerTimer = CreateTimer(VolTriggerInterval, Event_VolUpdateTimer, _, TIMER_REPEAT);
|
||||
|
||||
// Trigger timer started.
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Trigger timer not running. Either disabled or invalid interval.
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Kills the trigger delay timer if it exists.
|
||||
*/
|
||||
VolStopTriggerTimer()
|
||||
{
|
||||
// Kill the timer if it's running.
|
||||
if (hVolTriggerTimer != INVALID_HANDLE)
|
||||
{
|
||||
KillTimer(hVolTriggerTimer);
|
||||
hVolTriggerTimer = INVALID_HANDLE;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Resets volume trigger delay counters on one or more players.
|
||||
*
|
||||
* @param client Optional. Specifies a single player to reset. Default is
|
||||
* -1, all players.
|
||||
*/
|
||||
VolResetCountDown(client = -1)
|
||||
{
|
||||
// Check if a client is specified.
|
||||
if (client > -1)
|
||||
{
|
||||
// Reset volume counters.
|
||||
for (new volumeIndex = 0; volumeIndex < ZR_VOLUMES_MAX; volumeIndex++)
|
||||
{
|
||||
VolPlayerCountDown[client][volumeIndex] = -1.0;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Reset all volume counters.
|
||||
for (new clientIndex = 0; clientIndex <= MAXPLAYERS + 1; clientIndex++)
|
||||
{
|
||||
for (new volumeIndex = 0; volumeIndex < ZR_VOLUMES_MAX; volumeIndex++)
|
||||
{
|
||||
VolPlayerCountDown[clientIndex][volumeIndex] = -1.0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@ -157,7 +309,7 @@ VolUpdatePlayerLocation(client = -1)
|
||||
}
|
||||
else
|
||||
{
|
||||
for (new client = 1; client <= MaxClients; client++)
|
||||
for (client = 1; client <= MaxClients; client++)
|
||||
{
|
||||
// Check if client is in game and alive.
|
||||
if (!IsClientConnected(client) || !IsClientInGame(client) || !IsPlayerAlive(client))
|
||||
@ -183,6 +335,9 @@ VolUpdatePlayerChanges()
|
||||
new bool:newState;
|
||||
new bool:oldState;
|
||||
|
||||
new Float:trigger_delay;
|
||||
|
||||
// Loop through all players.
|
||||
for (new client = 1; client <= MaxClients; client++)
|
||||
{
|
||||
// Check if client is in game and alive.
|
||||
@ -212,14 +367,33 @@ VolUpdatePlayerChanges()
|
||||
// No change. Skip to next volume.
|
||||
break;
|
||||
}
|
||||
|
||||
// Check if client entered the volume.
|
||||
else if (!newState && oldState)
|
||||
{
|
||||
// Client entered volume. Trigger event.
|
||||
VolOnPlayerEnter(client, volumeIndex);
|
||||
// Get trigger delay value.
|
||||
trigger_delay = Volumes[volumeIndex][vol_trigger_delay];
|
||||
|
||||
// Check if the volume has a trigger delay.
|
||||
if (trigger_delay > 0.0)
|
||||
{
|
||||
// Set count down value.
|
||||
VolPlayerCountDown[client][volumeIndex] = trigger_delay;
|
||||
}
|
||||
else
|
||||
{
|
||||
// No trigger delay, trigger event instantly.
|
||||
VolOnPlayerEnter(client, volumeIndex);
|
||||
}
|
||||
}
|
||||
|
||||
// Check if client left the volume.
|
||||
else if (newState && !oldState)
|
||||
{
|
||||
// Client left the volume. Trigger event.
|
||||
// Make sure count down value is reset.
|
||||
VolPlayerCountDown[client][volumeIndex] = -1.0;
|
||||
|
||||
// Trigger event.
|
||||
VolOnPlayerLeave(client, volumeIndex);
|
||||
}
|
||||
}
|
||||
@ -264,6 +438,8 @@ bool:IsPositionInLocation(Float:pos[3], Float:min[3], Float:max[3])
|
||||
/**
|
||||
* 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.
|
||||
*/
|
||||
@ -272,6 +448,24 @@ bool:VolIsInUse(volumeIndex)
|
||||
return Volumes[volumeIndex][vol_in_use];
|
||||
}
|
||||
|
||||
/**
|
||||
* 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.
|
||||
*
|
||||
@ -354,3 +548,61 @@ public Action:Event_VolUpdateTimer(Handle:timer)
|
||||
{
|
||||
VolUpdatePlayerChanges();
|
||||
}
|
||||
|
||||
/**
|
||||
* Callback for trigger delay timer.
|
||||
*/
|
||||
public Action:Event_VolTriggerTimer(Handle:timer)
|
||||
{
|
||||
new Float:countDown;
|
||||
|
||||
// Loop through all players.
|
||||
for (new client = 1; client <= MaxClients; client++)
|
||||
{
|
||||
// Loop through all volumes.
|
||||
for (new volumeIndex = 0; volumeIndex < ZR_VOLUMES_MAX; volumeIndex++)
|
||||
{
|
||||
// Get count down value.
|
||||
countDown = VolPlayerCountDown[client][volumeIndex];
|
||||
|
||||
// Check if volume trigger delay is enabled.
|
||||
if (countDown > 0.0)
|
||||
{
|
||||
// Substract by trigger interval.
|
||||
countDown -= VolTriggerInterval;
|
||||
|
||||
// Check if zero or below.
|
||||
if (countDown <= 0.0)
|
||||
{
|
||||
// Trigger volume enter event.
|
||||
VolOnPlayerEnter(client, volumeIndex);
|
||||
|
||||
// Reset count down value.
|
||||
VolPlayerCountDown[client][volumeIndex] = -1.0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Called when zr_vol CVAR is changed.
|
||||
*/
|
||||
public VolEnabledChanged(Handle:cvar, const String:oldvalue[], const String:newvalue[])
|
||||
{
|
||||
new bool:isEnabled = bool:StringToInt(newvalue);
|
||||
|
||||
if (isEnabled)
|
||||
{
|
||||
// Volumetric features is enabled.
|
||||
VolEnabled = true;
|
||||
|
||||
// Start timers.
|
||||
VolStartUpdateTimer();
|
||||
}
|
||||
else
|
||||
{
|
||||
// Volumetric features is disabled.
|
||||
VolDisable();
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user