diff --git a/src/zr/ambience.inc b/src/zr/ambience.inc index bd59d0e..2056350 100644 --- a/src/zr/ambience.inc +++ b/src/zr/ambience.inc @@ -6,6 +6,8 @@ * ==================== */ +// TODO: Move skybox and lightning functions into this file. + new bool:AmbienceLoaded = false; new String:AmbienceSound[64]; new Float:AmbienceVolume; diff --git a/src/zr/playerclasses/apply.inc b/src/zr/playerclasses/apply.inc index 6a56004..5043268 100644 --- a/src/zr/playerclasses/apply.inc +++ b/src/zr/playerclasses/apply.inc @@ -32,6 +32,11 @@ bool:ClassApplyAttributes(client, bool:improved = false) ClassApplyModel(client, classindex); ClassApplyAlpha(client, classindex); ClassApplyOverlay(client, classindex); + ClassApplyNightVision(client, classindex); + ClassApplyFOV(client, classindex); + ClassApplyHealth(client, classindex, improved); + ClassApplyHealthRegen(client, classindex); + ClassApplySpeed(client, classindex); } /** @@ -145,3 +150,179 @@ bool:ClassApplyOverlay(client, classindex, cachetype = ZR_CLASS_CACHE_PLAYER) ClassOverlayInitialize(client, overlay); return true; } + +/** + * Gives night vision to a player. + * + * @param client The client index. + * @param classindex The class to read from. + * @param cachetype Optional. Specifies what class cache to read from. + * Options: + * ZR_CLASS_CACHE_ORIGINAL - Unchanced class data. + * ZR_CLASS_CACHE_MODIFIED - Changed/newest class data. + * ZR_CLASS_CACHE_PLAYER (default) - Player cache. + * @return True on success, false otherwise. + */ +bool:ClassApplyNightVision(client, classindex, cachetype = ZR_CLASS_CACHE_PLAYER) +{ + new bool:nvgs; + + // Get the night vision setting from the specified cache. + if (cachetype == ZR_CLASS_CACHE_PLAYER) + { + nvgs = ClassGetNvgs(client, cachetype); + } + else + { + nvgs = ClassGetNvgs(classindex, cachetype); + } + + NightVision(client, nvgs); + + // Turn on night vision if applied. + if (nvgs) + { + NightVisionOn(client, nvgs); + } + return true; +} + +/** + * Sets the field of view setting on a player. + * + * @param client The client index. + * @param classindex The class to read from. + * @param cachetype Optional. Specifies what class cache to read from. + * Options: + * ZR_CLASS_CACHE_ORIGINAL - Unchanced class data. + * ZR_CLASS_CACHE_MODIFIED - Changed/newest class data. + * ZR_CLASS_CACHE_PLAYER (default) - Player cache. + * @return True on success, false otherwise. + */ +bool:ClassApplyFOV(client, classindex, cachetype = ZR_CLASS_CACHE_PLAYER) +{ + new fov; + + // Get the field of view setting from the specified cache. + if (cachetype == ZR_CLASS_CACHE_PLAYER) + { + fov = ClassGetFOV(client, cachetype); + } + else + { + fov = ClassGetFOV(classindex, cachetype); + } + + SetPlayerFOV(client, fov); + return true; +} + +/** + * Gives health points on a player. + * + * @param client The client index. + * @param classindex The class to read from. + * @param boost Double health boost. Default: false + * @param cachetype Optional. Specifies what class cache to read from. + * Options: + * ZR_CLASS_CACHE_ORIGINAL - Unchanced class data. + * ZR_CLASS_CACHE_MODIFIED - Changed/newest class data. + * ZR_CLASS_CACHE_PLAYER (default) - Player cache. + * @return True on success, false otherwise. + */ +bool:ClassApplyHealth(client, classindex, bool:boost = false, cachetype = ZR_CLASS_CACHE_PLAYER) +{ + new health; + + // Get the health points from the specified cache. + if (cachetype == ZR_CLASS_CACHE_PLAYER) + { + health = ClassGetHealth(client, cachetype); + } + else + { + health = ClassGetHealth(classindex, cachetype); + } + + if (boost) + { + health *= 2; + } + + SetEntityHealth(client, health); + return true; +} + +/** + * Applies health regeneration on a player if enabled. + * + * @param client The client index. + * @param classindex The class to read from. + * @param boost Double health boost. Default: false + * @param cachetype Optional. Specifies what class cache to read from. + * Options: + * ZR_CLASS_CACHE_ORIGINAL - Unchanced class data. + * ZR_CLASS_CACHE_MODIFIED - Changed/newest class data. + * ZR_CLASS_CACHE_PLAYER (default) - Player cache. + * @return True if applied, false otherwise. + */ +bool:ClassApplyHealthRegen(client, classindex, cachetype = ZR_CLASS_CACHE_PLAYER) +{ + new Float:interval; + new amount; + new max; + + // Get the health regeneration info from the specified cache. + if (cachetype == ZR_CLASS_CACHE_PLAYER) + { + interval = ClassGetHealthRegenInterval(client, cachetype); + amount = ClassGetHealthRegenAmount(client, cachetype); + max = ClassGetHealth(client, cachetype); + } + else + { + interval = ClassGetHealthRegenInterval(classindex, cachetype); + amount = ClassGetHealthRegenAmount(classindex, cachetype); + max = ClassGetHealth(classindex, cachetype); + } + + if (interval > 0) + { + ClassHealthRegenInitialize(client, interval, amount, max); + return true; + } + else + { + return false; + } +} + +/** + * Sets the players speed. + * + * @param client The client index. + * @param classindex The class to read from. + * @param cachetype Optional. Specifies what class cache to read from. + * Options: + * ZR_CLASS_CACHE_ORIGINAL - Unchanced class data. + * ZR_CLASS_CACHE_MODIFIED - Changed/newest class data. + * ZR_CLASS_CACHE_PLAYER (default) - Player cache. + * @return True on success, false otherwise. + */ +bool:ClassApplySpeed(client, classindex, cachetype = ZR_CLASS_CACHE_PLAYER) +{ + new speed; + + // Get the health points from the specified cache. + if (cachetype == ZR_CLASS_CACHE_PLAYER) + { + speed = ClassGetSpeed(client, cachetype); + } + else + { + speed = ClassGetSpeed(classindex, cachetype); + } + + SetPlayerSpeed(client, speed); + return true; +} diff --git a/src/zr/playerclasses/attributes.inc b/src/zr/playerclasses/attributes.inc index a6400e5..4927837 100644 --- a/src/zr/playerclasses/attributes.inc +++ b/src/zr/playerclasses/attributes.inc @@ -384,7 +384,7 @@ ClassGetOverlayPath(index, String:buffer[], maxlen, cachetype = ZR_CLASS_CACHE_P * is used, index will be used as a client index. * @return The night vision setting from the specified class. False on error. */ -bool:ClassGetNVGs(index, cachetype = ZR_CLASS_CACHE_PLAYER) +bool:ClassGetNvgs(index, cachetype = ZR_CLASS_CACHE_PLAYER) { switch (cachetype) { diff --git a/src/zr/playerclasses/healthregen.inc b/src/zr/playerclasses/healthregen.inc new file mode 100644 index 0000000..84ccee6 --- /dev/null +++ b/src/zr/playerclasses/healthregen.inc @@ -0,0 +1,66 @@ +/* + * ============================================================================ + * + * Zombie:Reloaded + * + * File: healthregen.inc + * Description: Functions for managing health regeneration on a client. + * Author: Richard Helgeby + * + * ============================================================================ + */ + +new ClientHealthRegenAmount[MAXPLAYERS + 1]; +new ClientHealthRegenMax[MAXPLAYERS + 1]; +new Handle:tHealthRegen[MAXPLAYERS + 1] = {INVALID_HANDLE, ...}; + +ClassHealthRegenInitialize(client, Float:interval, amount, max) +{ + ClientHealthRegenAmount[client] = amount; + ClientHealthRegenMax[client] = max; + ClassHealthRegenStart(client, interval); +} + +ClassHealthRegenStart(client, Float:interval) +{ + // Kill the timer if it exist. + if (tHealthRegen[client] != INVALID_HANDLE) + { + KillTimer(tHealthRegen[client]); + tHealthRegen[client] = INVALID_HANDLE; + } + + tHealthRegen[client] = CreateTimer(interval, ClassHealthRegenTimer, client, TIMER_REPEAT); +} + +ClassHealthRegenStop(client) +{ + // Kill the timer if it exist. + if (tHealthRegen[client] != INVALID_HANDLE) + { + KillTimer(tHealthRegen[client]); + tHealthRegen[client] = INVALID_HANDLE; + } +} + +public Action:ClassHealthRegenTimer(Handle:timer, any:client) +{ + // Kill the timer if the player is dead. + if (!IsPlayerAlive(client)) + { + tHealthRegen[client] = INVALID_HANDLE; + return Plugin_Stop; + } + + new health = GetClientHealth(client); + health += ClientHealthRegenAmount[client]; + + // Check if the health points is below the limit. + if (health < ClientHealthRegenMax[client]) + { + // Increase health. + SetEntityHealth(client, health); + } + + return Plugin_Continue; +} \ No newline at end of file diff --git a/src/zr/playerclasses/playerclasses.inc b/src/zr/playerclasses/playerclasses.inc index 02af8a6..7b0b148 100644 --- a/src/zr/playerclasses/playerclasses.inc +++ b/src/zr/playerclasses/playerclasses.inc @@ -208,6 +208,7 @@ new ClassActive[MAXPLAYERS + 1][ZR_CLASS_TEAMCOUNT - 1]; #include "zr/playerclasses/attributes" #include "zr/playerclasses/apply" #include "zr/playerclasses/clientoverlays" +#include "zr/playerclasses/healthregen" /** * Loads class attributes from playerclasses.txt into the ClassData array. If