diff --git a/cstrike/addons/sourcemod/configs/zr/hitgroups.txt b/cstrike/addons/sourcemod/configs/zr/hitgroups.txt index 6b71d48..7d09f7b 100644 --- a/cstrike/addons/sourcemod/configs/zr/hitgroups.txt +++ b/cstrike/addons/sourcemod/configs/zr/hitgroups.txt @@ -5,7 +5,8 @@ // "hitgroup index" // Index of the hitgroup (listed below) // { // "name" "name of hitgroup" // Redundant as of now, used for readability. -// "knockback" "1.0" (default) // The knockback multiplier for the hitgroup +// "knockback" "1.0" (default) // The knockback multiplier for the hitgroup. +// "damage" "yes" (default // Toggle damage on and off for this hitgroup. // } // // Notes: @@ -18,53 +19,62 @@ { "name" "Generic" "knockback" "1.0" + "damage" "yes" } "1" { "name" "Head" "knockback" "2.0" + "damage" "no" } "2" { "name" "Chest" "knockback" "1.3" + "damage" "yes" } "3" { "name" "Stomach" "knockback" "1.2" + "damage" "yes" } "4" { "name" "Left Arm" "knockback" "1.0" + "damage" "no" } "5" { "name" "Right Arm" "knockback" "1.0" + "damage" "yes" } "6" { "name" "Left Leg" "knockback" "0.9" + "damage" "no" } "7" { "name" "Right Leg" "knockback" "0.9" + "damage" "yes" } "10" { "name" "Gear" "knockback" "1.0" + "damage" "yes" } } diff --git a/src/zombiereloaded.sp b/src/zombiereloaded.sp index 94300fb..6355b23 100644 --- a/src/zombiereloaded.sp +++ b/src/zombiereloaded.sp @@ -44,6 +44,9 @@ // Weapons (core) #include "zr/weapons/weapons" +// Hitgroups (core) +#include "zr/hitgroups" + // Round End (core) #include "zr/roundend" @@ -53,9 +56,6 @@ // Damage (core) #include "zr/damage" -// Hitgroups (core) -#include "zr/hitgroups" - // Account (module) #include "zr/account" @@ -173,10 +173,8 @@ public OnMapStart() // Forward event to modules. ClassLoad(); - WeaponsLoad(); RoundEndOnMapStart(); InfectOnMapStart(); - HitgroupsLoad(); SEffectsOnMapStart(); AntiStickOnMapStart(); Anticamp_Startup(); @@ -211,6 +209,9 @@ public OnConfigsExecuted() FindMapSky(); // Forward event to modules. + WeaponsLoad(); + HitgroupsLoad(); + InfectLoad(); SEffectsLoad(); } diff --git a/src/zr/cvars.inc b/src/zr/cvars.inc index 6bcebe4..30cbe88 100644 --- a/src/zr/cvars.inc +++ b/src/zr/cvars.inc @@ -17,18 +17,25 @@ enum CvarsList Handle:CVAR_ENABLE, Handle:CVAR_LOG, Handle:CVAR_LOGFLAGS, - Handle:CVAR_ROUNDEND_OVERLAY, - Handle:CVAR_ROUNDEND_OVERLAY_ZOMBIE, - Handle:CVAR_ROUNDEND_OVERLAY_HUMAN, Handle:CVAR_CLASSES_SPAWN, Handle:CVAR_CLASSES_RANDOM, Handle:CVAR_CLASSES_DEFAULT_ZOMBIE, Handle:CVAR_CLASSES_DEFAULT_HUMAN, Handle:CVAR_CLASSES_DEFAULT_ADMIN, Handle:CVAR_CLASSES_FILE, + Handle:CVAR_WEAPONS, + Handle:CVAR_WEAPONS_RESTRICT, + Handle:CVAR_WEAPONS_ZMARKET_BUYZONE, + Handle:CVAR_HITGROUPS, + Handle:CVAR_DAMAGE_HITGROUPS, + Handle:CVAR_DAMAGE_BLOCK_FF, + Handle:CVAR_DAMAGE_BLOCK_BLAST, Handle:CVAR_DAMAGE_SUICIDE_ZOMBIE, Handle:CVAR_DAMAGE_SUICIDE_HUMAN, Handle:CVAR_DAMAGE_SUICIDE_CMDS, + Handle:CVAR_ROUNDEND_OVERLAY, + Handle:CVAR_ROUNDEND_OVERLAY_ZOMBIE, + Handle:CVAR_ROUNDEND_OVERLAY_HUMAN, Handle:CVAR_INFECT_SPAWNTIME_MIN, Handle:CVAR_INFECT_SPAWNTIME_MAX, Handle:CVAR_INFECT_CONSECUTIVE_BLOCK, @@ -43,10 +50,6 @@ enum CvarsList Handle:CVAR_INFECT_SHAKE_AMP, Handle:CVAR_INFECT_SHAKE_FREQUENCY, Handle:CVAR_INFECT_SHAKE_DURATION, - Handle:CVAR_WEAPONS, - Handle:CVAR_WEAPONS_RESTRICT, - Handle:CVAR_WEAPONS_ZMARKET_BUYZONE, - Handle:CVAR_HITGROUPS, Handle:CVAR_ACCOUNT_CASHFILL, Handle:CVAR_ACCOUNT_CASHFILL_VALUE, Handle:CVAR_SOUNDEFFECTS_MOAN, @@ -132,17 +135,6 @@ CvarsInit() // (None) - // =========================== - // Round End (core) - // =========================== - - g_hCvarsList[CVAR_ROUNDEND_OVERLAY] = CreateConVar("zr_roundend_overlay", "1", ""); - // Old Desc: Shows an overlay to all clients when a team wins. (0: Disable) - g_hCvarsList[CVAR_ROUNDEND_OVERLAY_HUMAN] = CreateConVar("zr_roundend_overlays_human", ""); - // Old Desc: overlays/zr/humans_win", "Path to \"humans win\" overlay - g_hCvarsList[CVAR_ROUNDEND_OVERLAY_ZOMBIE] = CreateConVar("zr_roundend_overlays_zombie", "overlays/zr/zombies_win", ""); - // Old Desc: Path to \"zombies win\" overlay - // =========================== // Offsets (core) // =========================== @@ -172,39 +164,6 @@ CvarsInit() g_hCvarsList[CVAR_CLASSES_FILE] = CreateConVar("zr_classes_file", "configs/zr/playerclasses.txt", ""); // Old Desc: Class data file to read from, in Valves key/values format. The path is relative to the \"sourcemod\" folder. - // =========================== - // Damage (core) - // =========================== - - g_hCvarsList[CVAR_DAMAGE_SUICIDE_ZOMBIE] = CreateConVar("zr_damage_suicide_zombie", "1", ""); - // Old Desc: Intercept human suicide attempts. - g_hCvarsList[CVAR_DAMAGE_SUICIDE_HUMAN] = CreateConVar("zr_damage_suicide_human", "1", ""); - // Old Desc: Intercept zombie suicide attempts. - g_hCvarsList[CVAR_DAMAGE_SUICIDE_CMDS] = CreateConVar("zr_damage_suicide_cmds", "kill, spectate, jointeam", ""); - // Old Desc: List of suicide commands to intercept. (Delimited by \", \" - - // =========================== - // Infect (core) - // =========================== - - g_hCvarsList[CVAR_INFECT_MZOMBIE_RATIO] = CreateConVar("zr_infect_motherzombie_ratio", "5", ""); - g_hCvarsList[CVAR_INFECT_MZOMBIE_RESPAWN] = CreateConVar("zr_infect_motherzombie_respawn", "0", ""); - g_hCvarsList[CVAR_INFECT_SPAWNTIME_MIN] = CreateConVar("zr_infect_spawntime_min", "30.0", ""); - g_hCvarsList[CVAR_INFECT_SPAWNTIME_MAX] = CreateConVar("zr_infect_spawntime_max", "50.0", ""); - g_hCvarsList[CVAR_INFECT_CONSECUTIVE_BLOCK] = CreateConVar("zr_infect_consecutive_block", "1", ""); - - // Effects - - g_hCvarsList[CVAR_INFECT_FIREBALL] = CreateConVar("zr_infect_fireball", "1", ""); - g_hCvarsList[CVAR_INFECT_SMOKE] = CreateConVar("zr_infect_smoke", "1", ""); - g_hCvarsList[CVAR_INFECT_SPARKS] = CreateConVar("zr_infect_sparks", "1", ""); - g_hCvarsList[CVAR_INFECT_SOUND] = CreateConVar("zr_infect_sound", "npc/fast_zombie/fz_scream1.wav", ""); - g_hCvarsList[CVAR_INFECT_ESPLASH] = CreateConVar("zr_infect_esplash", "1", ""); - g_hCvarsList[CVAR_INFECT_SHAKE] = CreateConVar("zr_infect_shake", "1", ""); - g_hCvarsList[CVAR_INFECT_SHAKE_AMP] = CreateConVar("zr_infect_shake_amp", "15.0", ""); - g_hCvarsList[CVAR_INFECT_SHAKE_FREQUENCY] = CreateConVar("zr_infect_shake_frequency", "1.0", ""); - g_hCvarsList[CVAR_INFECT_SHAKE_DURATION] = CreateConVar("zr_infect_shake_duration", "5.0", ""); - // =========================== // Weapons (core) // =========================== @@ -232,6 +191,62 @@ CvarsInit() g_hCvarsList[CVAR_HITGROUPS] = CreateConVar("zr_hitgroups", "1", ""); // Note make config file cvar. + // =========================== + // Round End (core) + // =========================== + + g_hCvarsList[CVAR_ROUNDEND_OVERLAY] = CreateConVar("zr_roundend_overlay", "1", ""); + // Old Desc: Shows an overlay to all clients when a team wins. (0: Disable) + g_hCvarsList[CVAR_ROUNDEND_OVERLAY_HUMAN] = CreateConVar("zr_roundend_overlays_human", ""); + // Old Desc: overlays/zr/humans_win", "Path to \"humans win\" overlay + g_hCvarsList[CVAR_ROUNDEND_OVERLAY_ZOMBIE] = CreateConVar("zr_roundend_overlays_zombie", "overlays/zr/zombies_win", ""); + // Old Desc: Path to \"zombies win\" overlay + + // =========================== + // Infect (core) + // =========================== + + g_hCvarsList[CVAR_INFECT_MZOMBIE_RATIO] = CreateConVar("zr_infect_motherzombie_ratio", "5", ""); + g_hCvarsList[CVAR_INFECT_MZOMBIE_RESPAWN] = CreateConVar("zr_infect_motherzombie_respawn", "0", ""); + g_hCvarsList[CVAR_INFECT_SPAWNTIME_MIN] = CreateConVar("zr_infect_spawntime_min", "30.0", ""); + g_hCvarsList[CVAR_INFECT_SPAWNTIME_MAX] = CreateConVar("zr_infect_spawntime_max", "50.0", ""); + g_hCvarsList[CVAR_INFECT_CONSECUTIVE_BLOCK] = CreateConVar("zr_infect_consecutive_block", "1", ""); + + // Effects + + g_hCvarsList[CVAR_INFECT_FIREBALL] = CreateConVar("zr_infect_fireball", "1", ""); + g_hCvarsList[CVAR_INFECT_SMOKE] = CreateConVar("zr_infect_smoke", "1", ""); + g_hCvarsList[CVAR_INFECT_SPARKS] = CreateConVar("zr_infect_sparks", "1", ""); + g_hCvarsList[CVAR_INFECT_SOUND] = CreateConVar("zr_infect_sound", "npc/fast_zombie/fz_scream1.wav", ""); + g_hCvarsList[CVAR_INFECT_ESPLASH] = CreateConVar("zr_infect_esplash", "1", ""); + g_hCvarsList[CVAR_INFECT_SHAKE] = CreateConVar("zr_infect_shake", "1", ""); + g_hCvarsList[CVAR_INFECT_SHAKE_AMP] = CreateConVar("zr_infect_shake_amp", "15.0", ""); + g_hCvarsList[CVAR_INFECT_SHAKE_FREQUENCY] = CreateConVar("zr_infect_shake_frequency", "1.0", ""); + g_hCvarsList[CVAR_INFECT_SHAKE_DURATION] = CreateConVar("zr_infect_shake_duration", "5.0", ""); + + // =========================== + // Damage (core) + // =========================== + + // Hitgroup Damage + + g_hCvarsList[CVAR_DAMAGE_HITGROUPS] = CreateConVar("zr_damage_hitgroups", "1", ""); + + // Block Damage Types + + g_hCvarsList[CVAR_DAMAGE_BLOCK_FF] = CreateConVar("zr_damage_block_ff", "1", ""); + // note overrides mp_friendlyfire + g_hCvarsList[CVAR_DAMAGE_BLOCK_BLAST] = CreateConVar("zr_damage_block_blast", "1", ""); + + // Suicide Intercept + + g_hCvarsList[CVAR_DAMAGE_SUICIDE_ZOMBIE] = CreateConVar("zr_damage_suicide_zombie", "1", ""); + // Old Desc: Intercept human suicide attempts. + g_hCvarsList[CVAR_DAMAGE_SUICIDE_HUMAN] = CreateConVar("zr_damage_suicide_human", "1", ""); + // Old Desc: Intercept zombie suicide attempts. + g_hCvarsList[CVAR_DAMAGE_SUICIDE_CMDS] = CreateConVar("zr_damage_suicide_cmds", "kill, spectate, jointeam", ""); + // Old Desc: List of suicide commands to intercept. (Delimited by \", \" + // =========================== // Account (module) // =========================== diff --git a/src/zr/damage.inc b/src/zr/damage.inc index 5f693ee..1015dbe 100644 --- a/src/zr/damage.inc +++ b/src/zr/damage.inc @@ -120,10 +120,36 @@ public DamageTraceAttack(client, inflictor, attacker, damage, hitbox, hitgroup) // If the flags are the same on both clients, then stop. if (clientzombie == attackerzombie) { + // If friendly fire is blocked, then allow damage. + new bool:damageblockff = GetConVarBool(g_hCvarsList[CVAR_DAMAGE_BLOCK_FF]); + if (!damageblockff) + { + return Hacks_Continue; + } + + // Stop bullet from hurting client. return 0; } - // Players are on differen't teams. + // Here we know that attacker and client are different teams. + + // If damage hitgroups cvar is disabled, then allow damage. + new bool:damagehitgroups = GetConVarBool(g_hCvarsList[CVAR_DAMAGE_HITGROUPS]); + if (!damagehitgroups) + { + // Allow damage. + return Hacks_Continue; + } + + // If damage is disabled for this hitgroup, then stop. + new bool:candamage = HitgroupsCanDamageHitgroup(hitgroup); + if (!candamage) + { + // Stop bullet from hurting client. + return 0; + } + + // Allow damage. return Hacks_Continue; } @@ -160,45 +186,8 @@ public DamageOnTakeDamage(client, inflictor, attacker, damage, damagetype, ammot return Hacks_Continue; } - // Client was damaged by falling. - if (damagetype & DMG_FALL) - { - // If client isn't a zombie, then allow damage. - if (!IsPlayerZombie(client)) - { - return Hacks_Continue; - } - - // If class has "nofalldamage" disabled, then allow damage. - new bool:blockfalldamage = ClassGetNoFallDamage(client); - if (!blockfalldamage) - { - return Hacks_Continue; - } - - // Stop damage. - return 0; - } - // Client was damaged by explosion. - else if (damagetype & DMG_BLAST) - { - // If attacker isn't valid, then allow damage. - if (!ZRIsValidClient(attacker)) - { - return Hacks_Continue; - } - - // If client is a zombie, then allow damage. - if (IsPlayerZombie(client)) - { - return Hacks_Continue; - } - - // Stop damage. - return 0; - } // Client was shot or knifed. - else if (damagetype & DMG_BULLET) + if (damagetype & DMG_BULLET) { // If attacker isn't valid, then allow damage. if (!ZRIsValidClient(attacker)) @@ -231,6 +220,50 @@ public DamageOnTakeDamage(client, inflictor, attacker, damage, damagetype, ammot // Allow damage. return Hacks_Continue; } + // Client was damaged by explosion. + else if (damagetype & DMG_BLAST) + { + // If blast damage is blocked, then stop. + new bool:damageblockblast = GetConVarBool(g_hCvarsList[CVAR_DAMAGE_BLOCK_BLAST]); + if (!damageblockblast) + { + return Hacks_Continue; + } + + // If attacker isn't valid, then allow damage. + if (!ZRIsValidClient(attacker)) + { + return Hacks_Continue; + } + + // If client is a zombie, then allow damage. + if (IsPlayerZombie(client)) + { + return Hacks_Continue; + } + + // Stop damage. + return 0; + } + // Client was damaged by falling. + else if (damagetype & DMG_FALL) + { + // If client isn't a zombie, then allow damage. + if (!IsPlayerZombie(client)) + { + return Hacks_Continue; + } + + // If class has "nofalldamage" disabled, then allow damage. + new bool:blockfalldamage = ClassGetNoFallDamage(client); + if (!blockfalldamage) + { + return Hacks_Continue; + } + + // Stop damage. + return 0; + } // Allow damage. return Hacks_Continue; diff --git a/src/zr/hitgroups.inc b/src/zr/hitgroups.inc index 267430c..7db94b4 100644 --- a/src/zr/hitgroups.inc +++ b/src/zr/hitgroups.inc @@ -99,7 +99,8 @@ HitgroupsValidateConfig() * Retrieve hitgroup knockback value. * * @param hitgroup The hitgroup index. - */ + * @return The knockback multiplier of the hitgroup. + */ Float:HitgroupsGetHitgroupKnockback(hitgroup) { // Reset keyvalue's traversal stack. @@ -121,4 +122,39 @@ Float:HitgroupsGetHitgroupKnockback(hitgroup) } return 1.0; +} + +/** + * Retrieve hitgroup damage value. + * + * @param hitgroup The hitgroup index. + * @return True if hitgroup can be damaged, false if not. + */ +bool:HitgroupsCanDamageHitgroup(hitgroup) +{ + // Reset keyvalue's traversal stack. + KvRewind(kvHitgroups); + if (KvGotoFirstSubKey(kvHitgroups)) + { + decl String:sHitgroup[4]; + decl String:damage[8]; + + do + { + KvGetSectionName(kvHitgroups, sHitgroup, sizeof(sHitgroup)); + + // If this is the right hitgroup, then return knockback for it. + if (hitgroup == StringToInt(sHitgroup)) + { + // Get config setting string. + KvGetString(kvHitgroups, "damage", damage, sizeof(damage), "yes"); + + // Return hitgroup's damage setting. + return ZRConfigSettingToBool(damage); + } + } while (KvGotoNextKey(kvHitgroups)); + } + + // If hitgroup is missing, then default to "yes." + return true; } \ No newline at end of file diff --git a/src/zr/infect.inc b/src/zr/infect.inc index 8eb57e8..038fd2e 100644 --- a/src/zr/infect.inc +++ b/src/zr/infect.inc @@ -60,7 +60,13 @@ InfectOnMapStart() { // Reset timer handle. tInfect = INVALID_HANDLE; - +} + +/** + * Loads downloadable content data for infect module. + */ +InfectLoad() +{ // Get infection sound. decl String:sound[PLATFORM_MAX_PATH]; GetConVarString(g_hCvarsList[CVAR_INFECT_SOUND], sound, sizeof(sound)); @@ -517,10 +523,7 @@ InfectPlayer(client, attacker = -1, bool:motherinfect = false) // Apply effects. InfectEffects(client); - // Add a death to the zombie's score. - AddPlayerDeath(client, 1); - - // Fire death event and set weapon info if the attacker is specified. + // If attacker is valid, then continue. if (ZRIsValidClient(attacker)) { // Create and send custom player_death event. @@ -536,6 +539,9 @@ InfectPlayer(client, attacker = -1, bool:motherinfect = false) // Give client's infector a point. AddPlayerScore(attacker, 1); + // Add a death to the zombie's score. + AddPlayerDeath(client, 1); + // Apply infect HP gain. new healthgain = ClassGetHealthInfectGain(attacker); new health = GetClientHealth(attacker); diff --git a/src/zr/soundeffects/ambientsounds.inc b/src/zr/soundeffects/ambientsounds.inc index 3a46d04..664271b 100644 --- a/src/zr/soundeffects/ambientsounds.inc +++ b/src/zr/soundeffects/ambientsounds.inc @@ -101,7 +101,7 @@ bool:AmbientSoundsValidateConfig() /** * Map is starting. - */ + */ AmbientSoundsOnMapStart() { // Reset timer handle.