From c7ef30eea49abce235ef9ff50587aed7cd3c4d5a Mon Sep 17 00:00:00 2001 From: Psykotikism Date: Wed, 1 Jan 2025 15:42:32 -0800 Subject: [PATCH] Added changes for v9.3 Details can be found in changelog. --- CHANGELOG.md | 635 +- INFORMATION.md | 27552 ++++++++-------- README.md | 113 +- README_RU.md | 117 +- .../backup_config/format1/mutant_tanks.cfg | 4048 ++- .../backup_config/format2/mutant_tanks.cfg | 4048 ++- .../backup_config/format3/mutant_tanks.cfg | 4052 ++- .../backup_config/format4/mutant_tanks.cfg | 3772 ++- .../backup_config/format5/mutant_tanks.cfg | 3374 +- .../data/mutant_tanks/mutant_tanks.cfg | 4046 ++- addons/sourcemod/gamedata/mutant_tanks.txt | 23 +- addons/sourcemod/mutant_tanks_updater.txt | 397 +- .../plugins/mutant_tanks/mt_abilities.smx | Bin 756246 -> 642067 bytes .../plugins/mutant_tanks/mt_abilities2.smx | Bin 703976 -> 612786 bytes .../plugins/mutant_tanks/mutant_tanks.smx | Bin 392741 -> 497180 bytes .../sourcemod/scripting/include/mt_clone.inc | 4 +- .../scripting/include/mutant_tanks.inc | 210 +- .../mutant_tanks/abilities/mt_absorb.sp | 48 +- .../mutant_tanks/abilities/mt_acid.sp | 18 +- .../mutant_tanks/abilities/mt_aimless.sp | 30 +- .../mutant_tanks/abilities/mt_ammo.sp | 18 +- .../mutant_tanks/abilities/mt_blind.sp | 1460 - .../mutant_tanks/abilities/mt_bomb.sp | 18 +- .../mutant_tanks/abilities/mt_bury.sp | 30 +- .../mutant_tanks/abilities/mt_car.sp | 118 +- .../mutant_tanks/abilities/mt_choke.sp | 36 +- .../mutant_tanks/abilities/mt_clone.sp | 33 +- .../mutant_tanks/abilities/mt_cloud.sp | 130 +- .../mutant_tanks/abilities/mt_drop.sp | 625 +- .../mutant_tanks/abilities/mt_drug.sp | 29 +- .../mutant_tanks/abilities/mt_drunk.sp | 24 +- .../mutant_tanks/abilities/mt_electric.sp | 38 +- .../mutant_tanks/abilities/mt_enforce.sp | 26 +- .../mutant_tanks/abilities/mt_fast.sp | 54 +- .../mutant_tanks/abilities/mt_fire.sp | 18 +- .../mutant_tanks/abilities/mt_fling.sp | 22 +- .../mutant_tanks/abilities/mt_fly.sp | 42 +- .../mutant_tanks/abilities/mt_fragile.sp | 52 +- .../mutant_tanks/abilities/mt_ghost.sp | 55 +- .../mutant_tanks/abilities/mt_god.sp | 48 +- .../mutant_tanks/abilities/mt_gravity.sp | 63 +- .../mutant_tanks/abilities/mt_gunner.sp | 67 +- .../mutant_tanks/abilities/mt_heal.sp | 71 +- .../mutant_tanks/abilities/mt_hit.sp | 500 - .../mutant_tanks/abilities/mt_hurt.sp | 86 +- .../mutant_tanks/abilities/mt_hypno.sp | 85 +- .../mutant_tanks/abilities/mt_ice.sp | 30 +- .../mutant_tanks/abilities/mt_idle.sp | 18 +- .../mutant_tanks/abilities/mt_invert.sp | 26 +- .../mutant_tanks/abilities/mt_item.sp | 1077 - .../mutant_tanks/abilities/mt_jump.sp | 55 +- .../mutant_tanks/abilities/mt_kamikaze.sp | 1146 - .../mutant_tanks/abilities/mt_leech.sp | 1277 - .../{abilities => abilities2}/mt_lag.sp | 2576 +- .../{abilities => abilities2}/mt_laser.sp | 2320 +- .../{abilities => abilities2}/mt_lightning.sp | 2284 +- .../mutant_tanks/abilities2/mt_medic.sp | 170 +- .../mutant_tanks/abilities2/mt_meteor.sp | 46 +- .../mutant_tanks/abilities2/mt_minion.sp | 217 +- .../mutant_tanks/abilities2/mt_necro.sp | 1080 - .../mutant_tanks/abilities2/mt_nullify.sp | 26 +- .../mutant_tanks/abilities2/mt_omni.sp | 74 +- .../mutant_tanks/abilities2/mt_panic.sp | 228 +- .../mutant_tanks/abilities2/mt_pimp.sp | 1286 - .../mutant_tanks/abilities2/mt_puke.sp | 49 +- .../mutant_tanks/abilities2/mt_pyro.sp | 48 +- .../mutant_tanks/abilities2/mt_quiet.sp | 26 +- .../mutant_tanks/abilities2/mt_recall.sp | 32 +- .../mutant_tanks/abilities2/mt_recoil.sp | 26 +- .../mutant_tanks/abilities2/mt_regen.sp | 374 +- .../mutant_tanks/abilities2/mt_respawn.sp | 547 +- .../mutant_tanks/abilities2/mt_restart.sp | 30 +- .../mutant_tanks/abilities2/mt_rock.sp | 272 +- .../mutant_tanks/abilities2/mt_rocket.sp | 1488 - .../mutant_tanks/abilities2/mt_shake.sp | 1367 - .../mutant_tanks/abilities2/mt_shield.sp | 127 +- .../mutant_tanks/abilities2/mt_shove.sp | 18 +- .../mutant_tanks/abilities2/mt_slow.sp | 18 +- .../mutant_tanks/abilities2/mt_smash.sp | 531 +- .../mutant_tanks/abilities2/mt_smite.sp | 1363 - .../mutant_tanks/abilities2/mt_spam.sp | 1119 - .../mutant_tanks/abilities2/mt_splash.sp | 1075 - .../mutant_tanks/abilities2/mt_splatter.sp | 1327 - .../mutant_tanks/abilities2/mt_throw.sp | 106 +- .../mutant_tanks/abilities2/mt_track.sp | 24 +- .../mutant_tanks/abilities2/mt_ultimate.sp | 22 +- .../mutant_tanks/abilities2/mt_undead.sp | 10 +- .../mutant_tanks/abilities2/mt_vampire.sp | 563 - .../mutant_tanks/abilities2/mt_vision.sp | 813 +- .../mutant_tanks/abilities2/mt_warp.sp | 85 +- .../mutant_tanks/abilities2/mt_whirl.sp | 18 +- .../mutant_tanks/abilities2/mt_witch.sp | 16 +- .../mutant_tanks/abilities2/mt_xiphos.sp | 598 - .../mutant_tanks/abilities2/mt_yell.sp | 59 +- .../mutant_tanks/abilities2/mt_zombie.sp | 1186 - .../scripting/mutant_tanks/mt_abilities.sp | 541 +- .../scripting/mutant_tanks/mt_abilities2.sp | 921 +- .../scripting/mutant_tanks/mutant_tanks.sp | 25002 +++++++++----- .../translations/chi/mutant_tanks.phrases.txt | 844 +- .../chi/mutant_tanks_names.phrases.txt | 3088 +- .../translations/hu/mutant_tanks.phrases.txt | 844 +- .../hu/mutant_tanks_names.phrases.txt | 3006 +- .../translations/mutant_tanks.phrases.txt | 1021 +- .../mutant_tanks_names.phrases.txt | 3006 +- .../translations/ru/mutant_tanks.phrases.txt | 840 +- .../ru/mutant_tanks_names.phrases.txt | 3472 +- cfg/sourcemod/mutant_tanks.cfg | 11 + 107 files changed, 74553 insertions(+), 51551 deletions(-) delete mode 100644 addons/sourcemod/scripting/mutant_tanks/abilities/mt_blind.sp delete mode 100644 addons/sourcemod/scripting/mutant_tanks/abilities/mt_hit.sp delete mode 100644 addons/sourcemod/scripting/mutant_tanks/abilities/mt_item.sp delete mode 100644 addons/sourcemod/scripting/mutant_tanks/abilities/mt_kamikaze.sp delete mode 100644 addons/sourcemod/scripting/mutant_tanks/abilities/mt_leech.sp rename addons/sourcemod/scripting/mutant_tanks/{abilities => abilities2}/mt_lag.sp (96%) rename addons/sourcemod/scripting/mutant_tanks/{abilities => abilities2}/mt_laser.sp (95%) rename addons/sourcemod/scripting/mutant_tanks/{abilities => abilities2}/mt_lightning.sp (95%) delete mode 100644 addons/sourcemod/scripting/mutant_tanks/abilities2/mt_necro.sp delete mode 100644 addons/sourcemod/scripting/mutant_tanks/abilities2/mt_pimp.sp delete mode 100644 addons/sourcemod/scripting/mutant_tanks/abilities2/mt_rocket.sp delete mode 100644 addons/sourcemod/scripting/mutant_tanks/abilities2/mt_shake.sp delete mode 100644 addons/sourcemod/scripting/mutant_tanks/abilities2/mt_smite.sp delete mode 100644 addons/sourcemod/scripting/mutant_tanks/abilities2/mt_spam.sp delete mode 100644 addons/sourcemod/scripting/mutant_tanks/abilities2/mt_splash.sp delete mode 100644 addons/sourcemod/scripting/mutant_tanks/abilities2/mt_splatter.sp delete mode 100644 addons/sourcemod/scripting/mutant_tanks/abilities2/mt_vampire.sp delete mode 100644 addons/sourcemod/scripting/mutant_tanks/abilities2/mt_xiphos.sp delete mode 100644 addons/sourcemod/scripting/mutant_tanks/abilities2/mt_zombie.sp diff --git a/CHANGELOG.md b/CHANGELOG.md index 5c7dca6b69..be8774a612 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,45 +1,456 @@ # Changelog +## Version 9.3 (January 1, 2025) + +### Bug Fixes + +#### Core Plugin +- Fixed the `Tank Rush` feature enforcing several convars' default values while disabled. (Thanks to `xcd222` for reporting!) +- Fixed Mutant Infected's healthbars sometimes displaying the wrong name. + +#### Abilities +- Medic: Fixed the ability affecting the Mutant Infected who triggers it. + +### Changes + +#### General +- Dead survivors can now respawn into random combinations of Mutant types. + - The mutation continues to evolve and aims to devour everyone... +- Common infected can now combine their bio mass to turn into random Mutant types. + - The mutation continues to evolve and use people as resources... +- Witches can now turn other infected into random Mutant Types. + - The mutation continues to evolve and use any means to multiply... + +#### Core Plugin +- Improved the mutant spawner to respect the `* Chance` setting for each mutant type. (Thanks to `maclarens` for suggesting!) +- Added a `Punishment` system for punishing rushers/slackers. (Thanks to `Silvers` for the code!) +- Added a `Passives` system for adding buffs/debuffs to survivors and weapons. + +#### ConVars +- Added the `mt_graphicslevel` convar. + +#### Config Files +- Added the following default Mutant Tank types: + - `Sipow Tank` + - `Evil Tank` + - `Officer Tank` + - `Mafia Tank` + - `Frankenstein Tank` + - `Prototype Tank` + - `Zeus Tank` + - `Trajectory Tank` + - `Barrage Tank` + - `Collector Tank` + - `Timewalker Tank` + - `Speed Demon Tank` + - `Ramattra Tank` + - `Sigma Tank` + - `Zarya Tank` + - `Slacker Tank` + - `Rusher Tank` + +#### Game Data +- Added a signature for the `CGrenadeLauncher::LaunchGrenade` function. (L4D2) + +#### Settings +- Added the following settings under the `Plugin Settings->General` section: + - `Graphics Level` + - `Tank Chance` + - `Tank Note` + - `Special Chance` + - `Special Note` +- Added the following settings under the `Plugin Settings->Punishment` section: + - `Punish Enabled` + - `Punish Bots` + - `Finale Check` + - `Punisher Types` + - `Punisher Lifetime` + - `Warning Distance` + - `Punish Distance` + - `Warning Limit` + - `Warning Interval` + - `Survivor Types` + - `Survivors Required` + - `Incaps Required` + - `Zed Time` +- Added the following settings under the `Plugin Settings->Survivors` section: + - `Carrier Enabled` + - `Carrier Bots` + - `Carrier Body` + - `Carrier Chance` + - `Carrier Cleanse` + - `Carrier Damage Multiplier` + - `Carrier Delay` + - `Carrier Filter` + - `Carrier Health Multiplier` + - `Carrier Infection` + - `Carrier Mix` + - `Carrier Mode` + - `Carrier Teleport` + - `Carrier Type` + - `Carrier Voice` + - `Carrier Voice Chance` + - `Carrier Voice Interval` + - `Carrier Attack Voicelines` + - `Carrier Bait Voicelines` + - `Weapon Character` + - `Weapon Index` + - `Weapon Name` + - `Stack Passives` + - `Passive Enabled` + - `Passive Bots` + - `Passive Notify` + - `Action Duration Passive` + - `Adrenaline Time Passive` + - `Ammo Boost Passive` + - `Ammo Refill Passive` + - `Ammo Regen Passive` + - `Attack Boost Passive` + - `Blaze Health Passive` + - `Blood Donor Passive` + - `Bunny Hop Passive` + - `Burst Doors Passive` + - `Clean Kills Passive` + - `Cluster Bombs Passive` + - `Damage Boost Passive` + - `Damage Resistance Passive` + - `Dopamine Radius Passive` + - `Eternal Flames Passive` + - `Fast Recovery Passive` + - `Fire Rate Passive` + - `Friendly Fire Passive` + - `Ghost Bullets Passive` + - `Grenade Launcher Passive` (Thanks to `epzminion` for the code!) + - `Heal Percent Passive` + - `Healthcare Radius Passive` + - `Health Regen Passive` + - `Heartbeat Passive` + - `Hollowpoint Ammo Passive` + - `Infinite Ammo Passive` + - `Item Passive` + - `Jump Height Passive` + - `Ladder Actions Passive` + - `Lady Killer Passive` + - `Laser Sight Passive` + - `Life Leech Passive` + - `Lucky Bullet Passive` + - `Medical Cuts Passive` + - `Melee Range Passive` + - `Midair Dashes Passive` + - `Motivation Radius Passive` + - `Overdose Radius Passive` + - `Overhealth Passive` + - `Pipebomb Duration Passive` + - `Punch Resistance Passive` + - `Rapid Pistol Passive` + - `Recoil Dampener Passive` + - `Refill Percent Passive` + - `Regen Bursts Passive` + - `Reload Rate Passive` + - `Respawn Loadout Passive` + - `Revive Health Passive` + - `Riot Gear Passive` + - `Safety Bubble Passive` + - `Shockwave Radius Passive` + - `Shove Damage Passive` + - `Shove Penalty Passive` + - `Shove Rate Passive` + - `Sledgehammer Rounds Passive` + - `Special Ammo Passive` + - `Speed Boost Passive` + - `Sticky Grenades Passive` + - `Supplier Passive` + - `Swing Rate Passive` + - `Syringe Darts Passive` + - `Thorns Passive` +- Divided the `Attack Boost Reward` setting into several settings: + - `Attack Boost Reward` + - `Fire Rate Reward` + - `Reload Rate Reward` + - `Swing Rate Reward` +- Changed the following settings to now take in values to determine the chance of activating their corresponding rewards: + - `Hollowpoint Ammo Reward` + - `Sledgehammer Rounds Reward` +- Changed the `Lady Killer Reward` setting to now take in a value to determine the percentage of reserved ammo taken for its corresponding reward. +- Renamed the `Inextinguishable Fire Reward` setting to `Eternal Flames Reward`. +- Added the following settings under the `Plugin Settings->Rewards`, `Tank #->Rewards`, and `STEAM_ID->Rewards` sections: + - `Adrenaline Time Reward` + - `Ammo Refill Reward` + - `Blood Donor Reward` + - `Dopamine Radius Reward` + - `Fast Recovery Reward` + - `Grenade Launcher Reward` (Thanks to `epzminion` for the code!) + - `Healthcare Radius Reward` + - `Heartbeat Reward` + - `Lucky Bullet Reward` + - `Motivation Radius Reward` + - `Overdose Radius Reward` + - `Overhealth Reward` + - `Riot Gear Reward` + - `Safety Bubble Reward` + - `Shockwave Radius Reward` + - `Supplier Reward` +- Added the `Classes` section under the `Plugin Settings` section which allows to group mutant types into classes. +- Added the `Bunny Hop` setting under the `Plugin Settings->Enhancements`, `Tank #->Enhancements`, and `STEAM_ID->Enhancements` sections. (Requested by `xcd222`.) +- Added the following settings under the `Plugin Settings->Size` section (Thanks to `panxiaohai` for the code!): + - `Infected Chance` + - `Infected Damage` + - `Infected Health` + - `Infected Scale` + - `Jockey Chance` + - `Jockey Damage` + - `Jockey Health` + - `Jockey Scale` + - `Witch Chance` + - `Witch Damage` + - `Witch Health` + - `Witch Scale` +- Added the following settings under the `Tank #->Particles`, and `STEAM_ID->Particles` sections: + - `Body Chance` + - `Rock Chance` +- Added the following settings under the `Plugin Settings->Health`, `Tank #->Health`, and `STEAM_ID->Health` sections: + - `Armor Characters` + - `Armor Percentage` + - `Armor Resistance` + - `Shield Characters` + - `Shield Percentage` + - `Shield Rate` + - `Passive Delay` + - `Passive Health` + - `Passive Interval` +- Added the `Tank Class` setting under the `Tank #->General` section. +- Added the following settings for Mutant Special Infected: + - `Boomer Class` + - `Charger Class` + - `Hunter Class` + - `Jockey Class` + - `Smoker Class` + - `Spitter Class` +- Added the following settings for Mutant Mob Infected: + - `Mob Variants` + - `Common Bio Chance` + - `Common Chance` + - `Common Check` + - `Common Damage Points` + - `Common Death Points` + - `Common Filter` + - `Common Goal` + - `Common Name` + - `Common Variant` + - `Witch Chance` + - `Witch Filter` + - `Witch Mode` + - `Witch Mutate Chance` + - `Witch Name` + - `Witch Range` + - `Witch Types` + - `Skin Color` + - `Display Health` + - `Display Health Type` + - `Health Characters` + - `Body Effects` + - `Body Chance` + - `Glow Color` + - `Glow Enabled` + - `Glow Flashing` + - `Glow Range` + - `Glow Type` + +#### Translations +- Updated English translations. +- Updated Simplified Chinese translations. (Thanks to `yuzumi`!) +- Updated Hungarian translations. (Thanks to `KasperH`/`Ladis`!) +- Updated Russian translations. (Thanks to `Blueberry`/`Kleiner`!) + +#### Natives & Forwards +- Added the `MT_OnToggleSurvivorPassive` forward. +- Added the `MT_GetGraphicsLevel` native. +- Added the `MT_DoesSurvivorHavePassiveType` native. +- The `MT_SpawnTank` native now has a third parameter. + +#### Abilities +- Combined the following abilities: + - `Cloud`<->`Splash` (Use `Cloud Remove` to toggle `Cloud`.) + - `Drop`<->`Item` (Use `Ability Enabled` to choose between `Drop` and `Item`.) + - `Hurt`<->`Pimp` (Use `Hurt Mode` to choose between `Hurt` and `Pimp`.) + - `Medic`<->`Hit` (Use `Medic Hit Group` to toggle `Hit`.) + - `Panic`<->`Zombie` (Use `Ability Enabled` to choose between `Panic` and `Zombie`.) + - `Regen`<->`Leech`<->`Vampire`<->`Xiphos` (Use `Ability Enabled` to toggle `Regen/Leech`; use `Regen Mode` to choose between `Vampire` and `Xiphos`.) + - `Respawn`<->`Necro` (Use `Ability Enabled` to choose between `Necro` and `Respawn`.) + - `Rock`<->`Spam` (Use `Rock Mode` to choose between `Rock` and `Spam`.) + - `Smash`<->`Kamikaze`<->`Rocket`<->`Smite` (Use `Smash Mode` to choose between `Rocket`, `Smash` and `Smite`; use `Smash Remove` to toggle `Kamikaze`.) + - `Vision`<->`Blind`<->`Shake`<->`Splatter` (Use `Vision Mode` to choose between `Blind`, `Shake`, `Splatter` and `Vision`.) +- Added a 3rd option for the `Human Mode` setting for several abilities. +- Car: + - Added the `Immunity Flags` setting. + - Added the `Car Damage` setting. (Requested by `xcd222`.) +- Cloud: + - Added the `Cloud Interval` setting. + - Added the `Cloud Range` setting. + - Added the `Cloud Remove` setting. +- Drop: + - Added more options for the `Ability Enabled` setting. + - Added the `Drop Item Mode` setting. + - Added the `Drop Loadout` setting. + - Added the `Drop Pinata` setting. + - Added the `Drop Pinata Body` setting. + - Added the `Drop Pinata Chance` setting. + - Added the `Drop Weapon Boost` setting. + - Added the `Drop Weapon Resistance` setting. + - Added the `Immunity Flags` setting. +- Hurt: Added the `Hurt Mode` setting. +- Medic: + - Added the `Immunity Flags` setting. + - Added the `Medic Hit Group` setting. + - Added the `Medic Damage Multiplier` setting. +- Minion: + - Renamed the `Minion Types` setting to `Minion Filter`. + - Added the `Minion Type` setting. +- Panic: + - Added more options for the `Ability Enabled` setting. + - Added the `Panic Amount` setting. + - Added the `Panic Mode` setting. + - Added the `Panic Type` setting. +- Regen: + - Removed the `Regen Leech` setting. + - Removed the `Regen Leech Range` setting. + - Added the `Ability Effect` setting. + - Added the `Regen Health Multiplier` setting. + - Added the `Regen Max Health` setting. + - Added the `Regen Mode` setting. + - Added the `Regen Range` setting. +- Rock: Added the `Rock Mode` setting. +- Respawn: + - Added more options for the `Ability Enabled` setting. + - Added the `Human Cooldown` setting. + - Added the `Human Duration` setting. + - Added the `Human Mode` setting. + - Added the `Ability Sight` setting. + - Added the `Respawn Cooldown` setting. + - Added the `Respawn Duration` setting. + - Added the `Respawn Filter` setting. + - Added the `Respawn Range` setting. +- Smash: + - Renamed the `Smash Mode` setting to `Smash Type`. + - Added the `Smash Countdown` setting. + - Added the `Smash Delay` setting. + - Added the `Smash Mode` setting. + - Added the `Smash Remove` setting. +- Throw: + - Added the `Throw Car Damage` setting. (Requested by `xcd222`.) + - Updated the options for the `Throw Infected Options` setting. +- Vision: + - Added the `Vision Death` setting. + - Added the `Vision Death Chance` setting. + - Added the `Vision Death Range` setting. + - Added the `Vision Intensity` setting. + - Added the `Vision Interval` setting. + - Added the `Vision Mode` setting. + - Added the `Vision Stagger` setting. + - Added the `Vision Type` setting. + +### Files + +#### General +- The pre-compiled plugins included in the package are: + - Compiled without any of the optional dependencies. + - Compiled with the `SourceMod 1.12.0.7066` compiler. +- The plugins can still be compiled with `SourceMod 1.12.0.6985` or higher. +- Added backwards compatibility for `SourceMod 1.11` builds. (Requested by `bedildewo`.) +- Each folder for the abilities now has `8` less files (from `39` to `31`). +- Removed the following ability source files from the `addons/sourcemod/scripting/mutant_tanks` folder: + - `abilities/mt_blind.sp` + - `abilities/mt_hit.sp` + - `abilities/mt_item.sp` + - `abilities/mt_kamikaze.sp` + - `abilities/mt_lag.sp` + - `abilities/mt_laser.sp` + - `abilities/mt_leech.sp` + - `abilities/mt_lightning.sp` + - `abilities2/mt_necro.sp` + - `abilities2/mt_pimp.sp` + - `abilities2/mt_rocket.sp` + - `abilities2/mt_shake.sp` + - `abilities2/mt_smite.sp` + - `abilities2/mt_spam.sp` + - `abilities2/mt_splash.sp` + - `abilities2/mt_splatter.sp` + - `abilities2/mt_vampire.sp` + - `abilities2/mt_xiphos.sp` + - `abilities2/mt_zombie.sp` +- Added the following ability source files to the `addons/sourcemod/scripting/mutant_tanks` folder: + - `abilities2/mt_lag.sp` + - `abilities2/mt_laser.sp` + - `abilities2/mt_lightning.sp` + +#### Updates +- Updated config files. +- Updated gamedata file. +- Updated include file. +- Updated translation files. +- Updated updater file. + ## Version 9.2 (September 10, 2024) +
+ Click to expand! ### Bug Fixes +
+ Core Plugin #### Core Plugin - Fixed the looping heartbeat sound effect after reviving a survivor multiple times. +
+
+ Abilities #### Abilities - Fixed the `* Pin`, `* Pin Chance`, and `* Pin Cooldown` settings not working for the following abilities: - - Acid - - Bomb - - Fire - - Gravity - - Medic - - Warp + - `Acid` + - `Bomb` + - `Fire` + - `Gravity` + - `Medic` + - `Warp` - Bury: Fixed the looping heartbeat sound effect after reviving a survivor multiple times. (Thanks to `Dudus1st` for reporting!) - Throw: Fixed thrown special infected not having any velocity. (Thanks to `Mi.Cura` for testing and reporting!) +
### Changes +
+ Game Data #### Game Data - L4D1: Updated some offsets for the `1.0.4.3` update. - L4D2: Updated some signatures and offsets for the `2.2.3.5` update. +
+
+ Abilities #### Abilities - Gravity: Added the `Gravity Mode` setting. +
### Files +
+ General #### General - The pre-compiled plugins included in the package are: - Compiled without any of the optional dependencies. - Compiled with the `SourceMod 1.12.0.7066` compiler. - The plugins can still be compiled with `SourceMod 1.12.0.6985` or higher. +
+
+ Updates #### Updates - Updated config files. - Updated gamedata file. - Updated include file. - Updated updater file. +
+
## Version 9.1 (March 20, 2024)
@@ -532,7 +943,7 @@ - Added the `Recall` ability. (Thanks to `Lux` and `Silvers` for helping with some of the code!) - Absorb: Added the `Absorb Convert Percentage` setting. (Thanks to `Angelace113` for suggesting and testing!) - Aimless: Added the `Aimless Gunshots` setting. (Thanks to `Angelace113` for suggesting and testing!) -- Ammo +- Ammo: - Added the `Ammo Type` setting to add more flexibility. - Increased the maximum limit of the `Ammo Count` setting from `25` to `100`. - Reworked the `Ammo Count` setting to take away a specified amount of ammunition from survivors instead of setting survivors' ammunition to a specified amount. @@ -543,13 +954,13 @@ - Ghost: Added the `Ghost Fade Phase` setting. - Gravity: Added the `Gravity Flags` setting. - Hit: Added sound effect. -- Hypno +- Hypno: - Added the `Hypno Color` setting. - Added the `Hypno View` setting. - Ice: Survivor victims can no longer move or attack while frozen. - Kamikaze: Added the `Kamikaze Mode` setting. (Thanks to `Angelace113` for suggesting and testing!) - Leech: Added visual effect. -- Medic +- Medic: - Added the `Human Rock Cooldown` setting. (Thanks to `Angelace113` for suggesting and testing!) - Added the `Medic Rock Break` setting. (Thanks to `Angelace113` for suggesting and testing!) - Added the `Medic Rock Chance` setting. (Thanks to `Angelace113` for suggesting and testing!) @@ -565,7 +976,7 @@ - Smash: Added the `Smash Mode` setting. (Thanks to `Angelace113` for suggesting and testing!) - Smite: Added the `Smite Mode` setting. (Thanks to `Angelace113` for suggesting and testing!) - Splash: Added visual effect. -- Undead +- Undead: - The Tank now gets extinguished and has the vomit effect removed when its health resets. - Added sound effect.
@@ -707,7 +1118,7 @@ Abilities #### Abilities -- Gunner +- Gunner: - Fixed one of the messages not showing up when the ability activates. (Thanks to `thewintersoldier97` for reporting!) - Fixed the ability targeting the Tank itself. - Quiet: Fixed the sound hook blocking other sound hooks. @@ -754,7 +1165,7 @@ Abilities #### Abilities -- Gravity +- Gravity: - Added the `Gravity Radius` setting. - Added the `Gravity Rock Break` setting. (Thanks to `JustMadMan` for the idea!) - Added the `Gravity Rock Chance` setting. (Thanks to `JustMadMan` for the idea!) @@ -809,7 +1220,7 @@ - Ice: Fixed affected survivors remaining immobile after dying and respawning. - Laser: Fixed the incorrect minimum value of the `Laser Range` setting. - Slow: Fixed affected survivors remaining slow after dying and respawning. -- Splatter +- Splatter: - Fixed the incorrect minimum value of the `Splatter Range` setting. - Fixed splatter effects not stopping after the ability ends and causing lag. (Thanks to `zaviier` for reporting!) - Yell: Fixed the incorrect minimum value of the `Yell Range` setting. @@ -909,18 +1320,18 @@ #### Abilities - Changed the minimum value of the `* Damage` setting for several abilities from `1`/`1.0` to `0`/`0.0`. -- Blind +- Blind: - Added a flashbang option. (Thanks to `Silvers` for the code!) - Added the `Blind Mode` setting. - Added the `Blind Stagger` setting. - The ability can now affect bots. -- Medic +- Medic: - Added the `Medic Buff Damage` setting. - Added the `Medic Buff Resistance` setting. - Added the `Medic Buff Speed` setting. - Added the `Medic Symbiosis` setting. - Quiet: The ability now silences footsteps. (Requested by `ddd123`.) -- Splatter +- Splatter: - Changed how splatters are displayed. (Thanks to `Lux` and `Silvers` for the code!) - Removed the `Human Duration` setting. - Removed the `Human Mode` setting. @@ -933,7 +1344,7 @@ - Added the `Splatter Range Cooldown` setting. - Changed the default value of the `Splatter Duration` setting from `0` to `5`. - Changed the default value of the `Splatter Interval` setting from `5.0` to `1.0`. -- Yell +- Yell: - Added the `Yell Mode` setting. - Re-added the deafen feature. (Requested by `ddd123`.) - Changed the default value of the `Requires Humans` setting from `1` to `0`. @@ -986,68 +1397,68 @@ #### Abilities - Changed the minimum value of the `Human Duration` setting for several abilities from `1` to `0`. -- Absorb +- Absorb: - Added the `Human Duration` setting. - Changed the minimum value of the `Absorb Duration` setting from `1` to `0`. -- Car +- Car: - Added the `Human Duration` setting. - Changed the minimum value of the `Car Duration` setting from `1` to `0`. - Cloud: Added the `Cloud Duration` setting. -- Fast +- Fast: - Added the `Human Duration` setting. - Changed the minimum value of the `Fast Duration` setting from `1` to `0`. -- Fly +- Fly: - Added the `Human Duration` setting. - Changed the minimum value of the `Fly Duration` setting from `1` to `0`. -- Fragile +- Fragile: - Added the `Human Duration` setting. - Changed the minimum value of the `Fragile Duration` setting from `1` to `0`. -- Ghost +- Ghost: - Added the `Ghost Duration` setting. - The `Ghost Duration` setting can be substituted by the `Combo Duration` setting when combined with other abilities. - The `Ghost Fade Delay` setting can no longer be substituted by the `Combo Duration` setting when combined with other abilities. - The `Ghost Fade Rate` setting can no longer be substituted by the `Combo Interval` setting when combined with other abilities. -- God +- God: - Added the `Human Duration` setting. - Changed the minimum value of the `God Duration` setting from `1` to `0`. -- Gravity +- Gravity: - Added the `Human Duration` setting. - Changed the minimum value of the `Gravity Duration` setting from `1` to `0`. - Heal: Added the `Heal Duration` setting. -- Jump +- Jump: - Added the `Human Duration` setting. - Changed the minimum value of the `Jump Duration` setting from `1` to `0`. -- Laser +- Laser: - Added the `Human Duration` setting. - Changed the minimum value of the `Laser Duration` setting from `1` to `0`. -- Lightning +- Lightning: - Added the `Human Duration` setting. - Changed the minimum value of the `Lightning Duration` setting from `1` to `0`. - Medic: Added the `Medic Duration` setting. -- Meteor +- Meteor: - Added the `Human Duration` setting. - Changed the minimum value of the `Meteor Duration` setting from `1` to `0`. - Necro: Added the `Necro Duration` setting. -- Omni +- Omni: - Added the `Human Duration` setting. - Changed the minimum value of the `Omni Duration` setting from `1` to `0`. - Panic: Added the `Panic Duration` setting. -- Pyro +- Pyro: - Added the `Human Duration` setting. - Changed the minimum value of the `Pyro Duration` setting from `1` to `0`. - Quiet: Added the `Quiet Filter` setting. - Regen: Added the `Regen Duration` setting. -- Rock +- Rock: - Added the `Human Duration` setting. - Changed the minimum value of the `Rock Duration` setting from `1` to `0`. - Shield: Added the `Shield Duration` setting. -- Spam +- Spam: - Added the `Human Duration` setting. - Changed the minimum value of the `Spam Duration` setting from `1` to `0`. - Splash: Added the `Splash Duration` setting. - Splatter: Added the `Splatter Duration` setting. - Warp: Added the `Warp Duration` setting. -- Yell +- Yell: - Added the `Human Duration` setting. - Changed the minimum value of the `Yell Duration` setting from `1` to `0`. - Added the `Yell Damage` setting. @@ -1237,18 +1648,18 @@ - `* Cooldown` - `* Range Cooldown` - `* Rock Cooldown` -- Acid +- Acid: - Added the `Human Rock Cooldown` setting. (Requested by `Shao`.) - Added the `Acid Rock Cooldown` setting. (Requested by `Shao`.) -- Bomb +- Bomb: - Added the `Human Rock Cooldown` setting. (Requested by `Shao`.) - Added the `Bomb Rock Cooldown` setting. (Requested by `Shao`.) - Fast: Changed the default value of the `Open Areas Only` setting from `0.0` to `150.0`. -- Fire +- Fire: - Added the `Human Rock Cooldown` setting. (Requested by `Shao`.) - Added the `Fire Rock Cooldown` setting. (Requested by `Shao`.) - Track: Changed the default value of the `Open Areas Only` setting from `0.0` to `500.0`. -- Warp +- Warp: - Added the `Human Rock Cooldown` setting. (Requested by `Shao`.) - Added the `Warp Rock Cooldown` setting. (Requested by `Shao`.) - Removed non-working code. @@ -1541,6 +1952,12 @@ #### Commands - Added the `sm_mtank` alias for the `sm_mutanttank` command. +
+ ConVars + +#### ConVars +- Added the `mt_autoupdate` convar. +
Game Data @@ -1612,13 +2029,13 @@ #### Abilities - Bury: The ability now automatically teleports targeted survivors and blocks fall damage until they land to avoid being stuck under the map when the ability's effect ends. -- Fly +- Fly: - Incapacitated or ledge-hanging survivors are no longer affected. - Changed the default value of the `Open Areas Only` setting from `150.0` to `500.0`. -- Vampire +- Vampire: - Added the `Vampire Health` setting. (Requested by `moschinovac`.) - Added the `Vampire Health Multiplier` setting. (Requested by `moschinovac`.) -- Warp +- Warp: - Added the `Warp Rock Break` setting. - Added the `Warp Rock Chance` setting.
@@ -2078,7 +2495,7 @@ #### Abilities - Medic: The `Medic Field Color` setting can now accept color presets from the new `Colors` section. -- Shield +- Shield: - The `Shield Color` setting can now accept color presets from the new `Colors` section. - The `Shield Color` setting can now accept the `rainbow` keyword to cycle through each color. (Thanks to `Pelipoika` for the code and `DonProof` for the idea!) @@ -2221,7 +2638,7 @@ Abilities #### Abilities -- Item +- Item: - Added the `Item Pinata` setting. - Added the `Item Pinata Body` setting. - Added the `Item Pinata Chance` setting. @@ -2315,17 +2732,17 @@ #### Abilities - Absorb: Fixed all types of fire damage not being detected. -- Bury +- Bury: - Fixed survivors not being revived when receiving the godmode reward. - Fixed survivors not being healed when receiving the health or refill reward. (Thanks to `3aljiyavslgazana` for testing and reporting!) -- Choke +- Choke: - Fixed choked survivors not always lifting off the ground while being choked. (Thanks to `3aljiyavslgazana` and `Mi.Cura` for testing and reporting!) - Fixed choked survivors being stuck under the floor when the ability ends. - Clone: Fixed clone deaths raising the wave count. (Thanks to `3aljiyavslgazana` for testing and reporting!) - Drop: Fixed weapons not attaching properly. - Fragile: Fixed all types of fire damage not being detected. (Thanks to `3aljiyavslgazana` for testing and reporting!) - God: Fixed Tanks not extinguishing from fires while the ability is activated. (Thanks to `3aljiyavslgazana` for testing and reporting!) -- Heal +- Heal: - Fixed players with the godmode reward being affected. - Fixed total health being miscalculated. - Fixed Tanks gaining health while in the dying animation. @@ -2334,16 +2751,16 @@ - Hypno: Fixed all types of fire damage not being detected. - Kamikaze: Fixed players with the godmode reward being affected. (Thanks to `3aljiyavslgazana` for testing and reporting!) - Laser: Fixed the ability always targeting the first player that joined the server. -- Leech +- Leech: - Fixed total health being miscalculated. - Fixed Tanks gaining health while in the dying animation. -- Medic +- Medic: - Fixed total health being miscalculated. - Fixed Tanks gaining health while in the dying animation. - Fixed the `Medic Health` and `Medic Max Health` settings not being read entirely. (Thanks to `TheStarRocker` for testing and reporting!) - Pyro: Fixed all types of fire damage not being detected. - Recoil: Fixed the ability affecting all weapons instead of just guns. -- Regen +- Regen: - Fixed total health being miscalculated. - Fixed Tanks gaining health while in the dying animation. - Respawn: Fixed Tanks not respawning when dying as a different type. (Thanks to `3aljiyavslgazana` for testing and reporting!) @@ -2352,16 +2769,16 @@ - Shield: Fixed all types of fire damage not being detected. - Smash: Fixed players with the godmode reward being affected. (Thanks to `3aljiyavslgazana` for testing and reporting!) - Smite: Fixed players with the godmode reward being affected. (Thanks to `3aljiyavslgazana` for testing and reporting!) -- Ultimate +- Ultimate: - Fixed total health being miscalculated. - Fixed Tanks gaining health while in the dying animation. -- Undead +- Undead: - Fixed total health being miscalculated. - Fixed Tanks gaining health while in the dying animation. -- Vampire +- Vampire: - Fixed total health being miscalculated. - Fixed Tanks gaining health while in the dying animation. -- Xiphos +- Xiphos: - Fixed total health being miscalculated. - Fixed Tanks gaining health while in the dying animation. - Fixed all types of fire damage not being detected. @@ -2460,7 +2877,7 @@ - `Attack boost reward` (Requested by `3aljiyavslgazana`.) [Requires `WeaponHandling API`.] - `Infinite ammo reward` (Thanks to `epzminion` for helping!) - The `Stasis Mode` setting now works in all game mode types. (Requested by `yuzumi`.) -- Added the `Game Type` setting under the `Tank #->General` sections. +- Added the `Game Type` setting under the `Tank #->General` section. - Added the following settings under the `Plugin Settings->Rewards`, `Tank #->Rewards`, and `STEAM_ID->Rewards` sections: - `Reward Bots` (Thanks to `Mi.Cura` for the idea!) - `Reward Effect` (Requested by `3aljiyavslgazana`.) [Thanks to `Silvers` for the code!] @@ -2606,7 +3023,7 @@ Abilities #### Abilities -- Absorb +- Absorb: - The pushback effect no longer triggers for melee attacks unless the Tank takes at least one damage. (Requested by `3aljiyavslgazana`.) - The pushback effect has less magnitude and radius when triggered by recipients of the godmode reward. (Requested by `3aljiyavslgazana`.) - Added the `Absorb Hittable Divisor` setting. @@ -2614,70 +3031,70 @@ - Acid: The ability is now exclusive to L4D2. - Aimless: Survivors with the godmode reward are no longer affected. (Requested by `3aljiyavslgazana`.) - Ammo: Survivors with no ammunition are no longer affected. -- Bury +- Bury: - Survivors with the godmode reward are no longer affected. (Requested by `3aljiyavslgazana`.) - Buried survivors can no longer attack, shove, or use/grab items. (Requested by `3aljiyavslgazana`.) -- Choke +- Choke: - Incapacitated or ledge-hanging survivors are no longer affected. (Requested by `3aljiyavslgazana`.) - Survivors with the godmode reward are no longer affected. (Requested by `3aljiyavslgazana`.) - The ability automatically ends when the targeted survivor becomes incapacitated. (Requested by `3aljiyavslgazana`.) - Choked survivors can no longer attack, shove, or use/grab items. (Requested by `3aljiyavslgazana`.) - Blocked survivors from taking non-fatal fall damage after the ability ends. - Removed the `Choke Height` setting. -- Clone +- Clone: - Clones no longer reward survivors after dying. (Thanks to `3aljiyavslgazana` for the idea!) - Clones no longer trigger announcements when spawning and dying. (Thanks to `3aljiyavslgazana` for the idea!) - Clones are removed when their Tank owner changes its Mutant Tank type if the `Clone Remove` setting is enabled. (Thanks to `3aljiyavslgazana` for suggesting!) -- Fling +- Fling: - Survivors with the godmode reward are no longer affected. (Requested by `3aljiyavslgazana`.) - The ability is now exclusive to L4D2. -- Fragile +- Fragile: - Added the `Fragile Hittable Multiplier` setting. - Tank now have a `15%` chance of being knocked back when shoved by recipients of the attack boost reward. (Thanks to `3aljiyavslgazana` for suggesting!) -- God +- God: - The pushback effect has less magnitude and radius when triggered by recipients of the godmode reward. (Requested by `3aljiyavslgazana`.) - Tanks with this ability activated are no longer affected by bile bombs unless the thrower has the damage boost reward. (Requested by `3aljiyavslgazana`.) - Gravity: Survivors with the speed boost reward are no longer affected by the hit and range attacks. (Requested by `3aljiyavslgazana`.) - Hit: Survivors with the damage boost reward are no longer affected. (Requested by `3aljiyavslgazana`.) -- Hypno +- Hypno: - The pushback effect has less magnitude and radius when triggered by recipients of the godmode reward. (Requested by `3aljiyavslgazana`.) - Added the `Hypno Hittable Divisor` setting. - Any damage below `1` dealt to Tanks with this ability activated will automatically round up to `1`. -- Idle +- Idle: - Ledge-hanging survivors are no longer affected. (Requested by `3aljiyavslgazana`.) - Survivors with the godmode reward are no longer affected. (Requested by `3aljiyavslgazana`.) - Removed idle fix code. (Use [`Lux's` "Survivor_AFK_Fix" plugin](https://forums.alliedmods.net/showthread.php?t=326742) instead.) - Minion: Minions are removed when their Tank owner changes its Mutant Tank type if the `Minion Remove` setting is enabled. (Thanks to `3aljiyavslgazana` for suggesting!) - Nullify: The pushback effect has less magnitude and radius when triggered by recipients of the godmode reward. (Requested by `3aljiyavslgazana`.) - Pimp: Survivors with the godmode reward are no longer affected. (Requested by `3aljiyavslgazana`.) -- Puke +- Puke: - Survivors with the godmode reward are no longer affected. (Requested by `3aljiyavslgazana`.) - Added a Boomer puke fountain-like visual effect for the range and upon-death abilities. (Requested by `3aljiyavslgazana`.) [Thanks to `Marttt` for the code!] -- Respawn +- Respawn: - Replaced the detour for the `CTerrorPlayer::Event_Killed` function with the new `MT_OnPlayerEventKilled` forward. - Tanks that respawn no longer give out rewards until their final deaths. (Thanks to `3aljiyavslgazana` for suggesting!) - Restart: Respawned survivors no longer have their stats reset. (Thanks to `Dragokas` for the code and gamedata info!) -- Shield +- Shield: - The damage boost reward now allows the recipient to bypass all types of shields that Tanks may have throughout its duration. (Requested by `3aljiyavslgazana`.) - Shields that can be damaged by melee weapons will no longer create pushback effects when hit by melee weapons. (Requested by `3aljiyavslgazana`.) - The pushback effect has less magnitude and radius when triggered by recipients of the godmode reward. (Requested by `3aljiyavslgazana`.) - Tanks are immune to bile bombs while the shield is active. (Requested by `3aljiyavslgazana`.) - Shove: Survivors with the godmode reward are no longer affected. (Requested by `3aljiyavslgazana`.) - Slow: Survivors with the speed boost reward are no longer affected. (Requested by `3aljiyavslgazana`.) -- Throw +- Throw: - Thrown special infected are removed when their Tank owner changes its Mutant Tank type if the `Throw Infected Remove` setting is enabled. (Thanks to `3aljiyavslgazana` for suggesting!) - Thrown Witches are removed when their Tank owner changes its Mutant Tank type if the `Throw Witch Remove` setting is enabled. (Thanks to `3aljiyavslgazana` for suggesting!) - Ultimate: The pushback effect has less magnitude and radius when triggered by recipients of the godmode reward. (Requested by `3aljiyavslgazana`.) -- Vision +- Vision: - Ledge-hanging survivors are no longer affected. (Requested by `3aljiyavslgazana`.) - Survivors with the godmode reward are no longer affected. (Requested by `3aljiyavslgazana`.) - Warp: Incapacitated or ledge-hanging survivors are no longer affected by the hit and range attacks. (Requested by `3aljiyavslgazana`.) -- Whirl +- Whirl: - Ledge-hanging survivors are no longer affected. (Requested by `3aljiyavslgazana`.) - Survivors with the godmode reward are no longer affected. (Requested by `3aljiyavslgazana`.) - Witch: Witches are removed when their Tank owner changes its Mutant Tank type if the `Witch Remove` setting is enabled. (Thanks to `3aljiyavslgazana` for suggesting!) - Xiphos: Any damage below `1` dealt to Tanks with this ability activated will automatically round up to `1`. -- Yell +- Yell: - Survivors with the godmode reward are no longer affected. (Requested by `3aljiyavslgazana`.) - The ability no longer blocks player sounds when active. @@ -2943,16 +3360,16 @@ - Fixed some settings of multiple abilities having the wrong limits. - Fixed abilities activating when the Tank is dying, which caused the Tank to be stuck in a looped dying animation. - Absorb: Fixed the ability bypassing damage immunity settings. (Thanks to `3aljiyavslgazana` for testing and reporting!) -- Blind +- Blind: - Fixed the ability being enabled by default. (Thanks to `Mi.Cura` and `Tank Rush` for reporting!) - Fixed the sound effect not playing in L4D1 due to the file not existing. - Bomb: Fixed the sound effect not playing in L4D1 due to the file not existing. -- Bury +- Bury: - Fixed players being left under the map. (Thanks to `Mi.Cura` for testing and reporting!) - Fixed players keeping their original velocity after being teleported. - Car: Fixed cars giving players accelerated velocity when standing on them. - Choke: Fixed survivors being launched too high up into the air regardless of the `Choke Height` setting's value. -- Clone +- Clone: - Fixed clones spawning uncontrollably. (Thanks to `3aljiyavslgazana` for testing and reporting!) - Fixed clones being detected by the `Finale Amount` and `Finale Waves` settings. - Fixed clones not being replaced when they have a different Mutant Tank type from the Tank. (Thanks to `3aljiyavslgazana` for testing and reporting!) @@ -2961,20 +3378,20 @@ - Fixed the ability not being optional. - Drug: Fixed the ability not requiring human survivors to be present by default. - Drunk: Fixed the ability requiring human survivors to be present by default. -- Drop +- Drop: - Fixed the `Drop Weapon Name` setting not reading weapon names properly. (Thanks to `Tank Rush` and `moekai` for testing and reporting!) - Fixed weapons attached to Tanks not disappearing on mission loss or round restart. -- Electric +- Electric: - Fixed the ability not working sometimes. (Thanks to `Tank Rush` and `Mi.Cura` for testing and reporting!) - Enforce: Fixed errors related to enforced weapon slots having invalid weapons. - Fire: Fixed the sound effect not playing in L4D1 due to the file not existing. - Fragile: Fixed the ability bypassing damage immunity settings. (Thanks to `3aljiyavslgazana` for testing and reporting!) -- Ghost +- Ghost: - Fixed the range ability checking for the wrong ammo count. - Fixed special infected remaining transparent after the Tank dies. - Fixed client index errors. (Thanks to `Mi.Cura` for reporting!) - Gravity: Fixed the range ability checking for the wrong ammo count. -- Heal +- Heal: - Fixed the glow outline not going away when Tanks die. - Fixed glow outlines not applying/resetting properly. - Fixed the range ability checking for the wrong ammo count. @@ -2982,37 +3399,37 @@ - Hypno: Fixed survivors taking too much damage when the Tank is incapacitated while survivors are still hypnotized. - Jump: Fixed the range ability checking for the wrong ammo count. - Meteor: Fixed the `Meteor Damage` setting not working properly. (Thanks to `3aljiyavslgazana` for testing and reporting!) -- Minion +- Minion: - Fixed minions being replaced even when the `Minion Replace` setting is set to `0`. - Fixed minion count not supporting kicked minions. - Omni: Fixed type changes not being tracked properly. (Thanks to `Mi.Cura` for testing and reporting!) - Panic: Fixed panic events not being called on L4D1. - Respawn: Fixed the Tank not respawning consistently. (Thanks to `epzminion` for the method!) -- Rock +- Rock: - Fixed the rocks colliding with each other and producing lag. - Fixed the `Rock Damage` setting not working properly. (Thanks to `3aljiyavslgazana` for testing and reporting!) - Shake: Fixed one of the messages using the wrong format specifier. (Thanks to `Mi.Cura` for reporting!) -- Shield +- Shield: - Fixed shields not disappearing on mission loss or round restart. - Fixed propane tanks and gas cans not having velocity when thrown. -- Spam +- Spam: - Fixed the rocks colliding with each other and producing lag. - Fixed the `Spam Damage` setting not working properly. - Splatter: Fixed the `Splatter Type` setting using the wrong value limit. (Thanks to `3aljiyavslgazana` for testing and reporting!) -- Throw +- Throw: - Fixed cars giving players accelerated velocity when standing on them. - Fixed cars not having velocity when thrown. (Thanks to `3aljiyavslgazana` for testing and reporting!) -- Track +- Track: - Fixed the glow outline not going away when rocks break. - Fixed glow outlines not applying/resetting properly. -- Warp +- Warp: - Fixed the range ability checking for the wrong ammo count. - Fixed players keeping their original velocity after teleporting. -- Witch +- Witch: - Fixed messages being spammed. - Fixed witches not dealing any damage to survivors. (Thanks to `3aljiyavslgazana` for testing and reporting!) - Vampire: Fixed admin immunity not being checked properly. -- Xiphos +- Xiphos: - Fixed survivors receiving full health per hit. - Fixed survivors receiving health while Tank is in dying animation. - Yell: Fixed messages providing the wrong information. (Thanks to `Mi.Cura` for reporting!) @@ -3244,27 +3661,27 @@ - Added the `Lightning` ability which is exclusive to L4D2. - None of the abilities' plugins need to check if the `Clone` ability is installed anymore. - Added the `Combo Ability` setting for each ability. -- Absorb +- Absorb: - Added the `Immunity Flags` setting. - Changed the minimum value of the divisor settings from `0.1` to `1.0`. - Divisor settings will not take effect unless their values are greater than `1.0`. - Blind: Added a sound effect for L4D1. - Bomb: Added a sound effect for L4D1. -- Bury +- Bury: - Added the `Bury Buffer` setting. (Requested by `Mi.Cura`.) - Incapacitated or ledge-hanging survivors are no longer affected. - The ability no longer requires `Left 4 DHooks`. -- Car +- Car: - Added the `Car Interval` setting. - Added the `Car Lifetime` setting. - Choke: Changed the default value of the `Choke Height` setting from `300.0` to `200.0`. -- Clone +- Clone: - The `Clone Type` setting now takes in a type range. Example: `1-10` (Requested by `Neptunia`.) - Added the `Clone Remove` setting. - Added the `Clone Lifetime` setting. (Requested by `3aljiyavslgazana`.) - AI clones are now killed instead of kicked when the plugin is unloaded. - The `Clone Health` setting will now always determine clones' health. (Requested by `3aljiyavslgazana`.) -- Drop +- Drop: - Dropped weapons now have normal size. (Requested by `3aljiyavslgazana`.) - Weapons attached to Tanks are now affected by the `Ghost` ability's fade feature. (Requested by `3aljiyavslgazana`.) - Fire: Added a sound effect for L4D1. @@ -3272,50 +3689,50 @@ - Fragile - Added the `Immunity Flags` setting. - Multiplier settings will not take effect unless their values are greater than `1.0`. -- Ghost +- Ghost: - Rocks thrown by Tanks are now affected by the fade feature. (Requested by `3aljiyavslgazana`.) - Incapacitated or ledge-hanging survivors are no longer affected. - Special infected affected by the fade feature are now reverted back to normal upon death. (Requested by `3aljiyavslgazana`.) - God: Added the `Immunity Flags` setting. -- Heal +- Heal: - Changed the default value of the `Heal Buffer` setting from `25.0` to `100.0`. - The ability now contributes to the Tank's overall health. -- Hypno +- Hypno: - Updated method for hurting teammates to bypass plugins that block friendly-fire. - Incapacitated or ledge-hanging survivors are no longer affected. - Changed the minimum value of the divisor settings from `0.1` to `1.0`. - Divisor settings will not take effect unless their values are greater than `1.0`. - Ice: Ledge-hanging survivors are no longer affected. (Requested by `3aljiyavslgazana`.) -- Idle +- Idle: - Applied a new idle fix method. (Thanks to `Lux` for the code!) - The ability now requires `DHooks`. - Kamikaze: Added the `Kamikaze Body` setting. - Leech: The ability now contributes to the Tank's overall health. -- Medic +- Medic: - Added the `Medic Field` and `Medic Field Color` settings. (Thanks to `Marttt` and `Silvers` for the code!) - The `Ability Enabled` setting now only has two options instead of four. - Modified all of the messages. - The ability now contributes to the Tank's overall health. -- Meteor +- Meteor: - Added the `Meteor Interval` setting. - Added the `Meteor Lifetime` setting. - Added extra checks for tracking meteorites. -- Minion +- Minion: - Added the `Minion Remove` setting. - Added the `Minion Lifetime` setting. - AI minions are now killed instead of kicked when the plugin is unloaded. - Nullify: Added a sound effect. - Pyro: Added the `Pyro Reignite` setting. - Regen: The ability now contributes to the Tank's overall health. -- Respawn +- Respawn: - The `Respawn Type` setting now takes in a type range. Example: `1-10` (Requested by `Neptunia`.) - The ability now requires `DHooks`. - Restart: The ability no longer requires `Left 4 DHooks`. -- Rock +- Rock: - Added the `Immunity Flags` setting. - Added the `Rock Interval` setting. - Rocket: Added the `Rocket Body` setting. -- Shield +- Shield: - Added the `Shield Glow` setting. - The `Shield Type` setting now allows combinations of options. - Added the `Shield Throw Chance` setting. @@ -3324,10 +3741,10 @@ - Shove: Incapacitated or ledge-hanging survivors are no longer affected. - Smash: Added the `Smash Body` setting. - Smite: Added the `Smite Body` setting. -- Spam +- Spam: - Added the `Immunity Flags` setting. - Added the `Spam Interval` setting. -- Throw +- Throw: - Added the `Immunity Flags` setting. - Added the `Throw Car Lifetime` setting. - Added the `Throw Infected Amount` setting. @@ -3339,24 +3756,24 @@ - Added the `Throw Witch Remove` setting. - Thrown Witches now use default speed when set on fire. (Requested by `3aljiyavslgazana`.) - Track: Added the `Track Glow` setting. -- Ultimate +- Ultimate: - The ability now contributes to the Tank's overall health. - Added a sound effect. - Added the `Ultimate Chance` setting. - Undead: The ability now contributes to the Tank's overall health. - Vampire: The ability now contributes to the Tank's overall health. -- Witch +- Witch: - Added the `Witch Remove` setting. - Added the `Witch Lifetime` setting. -- Xiphos +- Xiphos: - The ability now contributes to the Tank's overall health. - The `Ability Message` setting now has an extra option. - Survivors now only get a portion of their damage against the Tank as health. - Incapacitated or ledge-hanging survivors are no longer affected. -- Yell +- Yell: - The ability now runs repeatedly while activated when `Human Mode` is set to `1`. - The ability no longer requires `Left 4 DHooks`. -- Zombie +- Zombie: - Added the `Zombie Mode` setting. - Added the `Zombie Type` setting. @@ -3917,7 +4334,7 @@ Click to expand! 1. Converted all plugins to use enum structs! -2. The `Tank Note` setting can now be overridden for specific players. A phrase must be created in the translation file for each specified player. The name of the phrase must be the player's SteamID32 or Steam3ID. See the bottom of the translation file for an example. +2. The `Tank Note` setting can now be overridden for specific players. A phrase must be created in the translation file for each specified player. The name of the phrase must be the player's `SteamID32` or `Steam3ID`. See the bottom of the translation file for an example. 3. Added support for versus games in coop modes. (Requested by `Neptunia`.) 4. Added more `Display Health` options. (Requested by `foxhound27`.) 5. The `Finale Types` setting now takes in type ranges. Example: `1-10,11-20,21-30` (Requested by `Neptunia`.) diff --git a/INFORMATION.md b/INFORMATION.md index ed87c3d250..47f65a056e 100644 --- a/INFORMATION.md +++ b/INFORMATION.md @@ -6,8 +6,8 @@ Click to expand! - Visit the [`Wiki`](https://github.com/Psykotikism/Mutant_Tanks/wiki) for more information, including examples and/or tutorials. -- Maximum Tank health: `1,000,000` (Increase/decrease the value in the `mutant_tanks.inc` file on lines `100-101` and recompile all the plugins, but expect game-breaking bugs with higher values.) [Default: `65,535`] -- Maximum types: `500` (Increase/decrease the value in the `mutant_tanks.inc` file on line `99` and recompile all the plugins, but expect server lag with higher values.) +- Maximum Tank health: `1,000,000` (Increase/decrease the value in the `mutant_tanks.inc` file on lines `103-104` and recompile all the plugins, but expect game-breaking bugs with higher values.) [Default: `65,535`] +- Maximum types: `500` (Increase/decrease the value in the `mutant_tanks.inc` file on line `102` and recompile all the plugins, but expect server lag with higher values.) - Most of these settings can be overridden for each player via their Steam IDs. - Most of these settings can be overridden for the other special infected (except the Witch). - Almost every setting can be set to `-1/-1.0` to allow settings with the same name to override it. @@ -22,10 +22,14 @@ - [Plugin Settings](#plugin-settings) - General - Announcements + - Classes - Colors + - Punishment - Rewards + - Survivors - Competitive - Difficulty + - Size - Health - Protection - Enhancements @@ -64,14 +68,13 @@
- Abilities Set #1 (A-L) + Abilities Set #1 (A-J) -- [Abilities Set #1 (A-L)](#abilities-set-1-a-l) +- [Abilities Set #1 (A-J)](#abilities-set-1-a-j) - [Absorb](#absorb-ability) - [Acid](#acid-ability) - [Aimless](#aimless-ability) - [Ammo](#ammo-ability) - - [Blind](#blind-ability) - [Bomb](#bomb-ability) - [Bury](#bury-ability) - [Car](#car-ability) @@ -93,33 +96,27 @@ - [Gravity](#gravity-ability) - [Gunner](#gunner-ability) - [Heal](#heal-ability) - - [Hit](#hit-ability) - [Hurt](#hurt-ability) - [Hypno](#hypno-ability) - [Ice](#ice-ability) - [Idle](#idle-ability) - [Invert](#invert-ability) - - [Item](#item-ability) - [Jump](#jump-ability) - - [Kamikaze](#kamikaze-ability) - - [Lag](#lag-ability) - - [Laser](#laser-ability) - - [Leech](#leech-ability) - - [Lightning](#lightning-ability)
- Abilities Set #2 (M-Z) + Abilities Set #2 (L-Z) -- [Abilities Set #2 (M-Z)](#abilities-set-2-m-z) +- [Abilities Set #2 (L-Z)](#abilities-set-2-l-z) + - [Lag](#lag-ability) + - [Laser](#laser-ability) + - [Lightning](#lightning-ability) - [Medic](#medic-ability) - [Meteor](#meteor-ability) - [Minion](#minion-ability) - - [Necro](#necro-ability) - [Nullify](#nullify-ability) - [Omni](#omni-ability) - [Panic](#panic-ability) - - [Pimp](#pimp-ability) - [Puke](#puke-ability) - [Pyro](#pyro-ability) - [Quiet](#quiet-ability) @@ -129,28 +126,19 @@ - [Respawn](#respawn-ability) - [Restart](#restart-ability) - [Rock](#rock-ability) - - [Rocket](#rocket-ability) - - [Shake](#shake-ability) - [Shield](#shield-ability) - [Shove](#shove-ability) - [Slow](#slow-ability) - [Smash](#smash-ability) - - [Smite](#smite-ability) - - [Spam](#spam-ability) - - [Splash](#splash-ability) - - [Splatter](#splatter-ability) - [Throw](#throw-ability) - [Track](#track-ability) - [Ultimate](#ultimate-ability) - [Undead](#undead-ability) - - [Vampire](#vampire-ability) - [Vision](#vision-ability) - [Warp](#warp-ability) - [Whirl](#whirl-ability) - [Witch](#witch-ability) - - [Xiphos](#xiphos-ability) - [Yell](#yell-ability) - - [Zombie](#zombie-ability)
@@ -198,6 +186,16 @@ // 1/"enabled"/"true"/"on"/"yes": ON "Auto Update" "0" + // Sets the graphics level of the plugin to help with server performance. + // Note: This setting has a convar equivalent (mt_graphicslevel). + // Note: Do not change this setting if you are unsure of how it works. + // -- + // 0: OFF (Nothing) + // 1: Low (Colors only) + // 2: Medium (Colors, props, and glow only) + // 3: High (Colors, props, glow, and particle effects) + "Graphics Level" "3" + // Attempt to fix hit registration issues. // Note: Disable this setting if you are experiencing hit registration issues while this is enabled. // Note: This setting replicates Xutax_Kamay's "Hit Registration Fix Plugin (bullet displacement by 1 tick)" plugin. Disable this setting if you already use that plugin. @@ -307,14 +305,14 @@ // 16: Custom messages "Log Messages" "0" - // All Mutant Tanks are only effective toward human survivors. + // All Mutant Tanks are only effective toward human-controlled survivors. // Note: This setting can be overridden for each Mutant Tank under the "General" section of their settings. // -- // Minimum: 0 // Maximum: 32 // -- // 0: OFF - // 1-32: ON, the number of human survivors required to be present for all Mutant Tanks to be effective. + // 1-32: ON, the number of human-controlled survivors required to be present for all Mutant Tanks to be effective. "Requires Humans" "0" // Enable all Mutant Tanks. @@ -326,6 +324,35 @@ // 1/"enabled"/"true"/"on"/"yes": ON "Tank Enabled" "-1" + // Every Mutant Tank has this many chances out of 100.0% to spawn. + // Note: Clones, respawned Mutant Tanks, randomized Tanks, and Mutant Tanks spawned through the Mutant Tanks menu are not affected. + // Note: If each enabled Mutant Tank has less than 100% chance of spawning, then every enabled Mutant Tank that has a 1% or higher chance of spawning will have an equal chance to spawn. + // Note: Do not change this setting if you are unsure of how it works. + // Note: This setting can be overridden for each Mutant Tank under the "General" section of their settings. + // -- + // Minimum: 0.0 (No chance) + // Maximum: 100.0 (Highest chance) + // -- + // Keywords: + // "never" - 0% chance + // "sometimes"/"unlikely"/"seldom" - 33.3% chance + // "maybe" - 50% chance + // "often"/"likely"/"frequently" - 66.6% chance + // "always" - 100% chance + "Tank Chance" "100.0" + + // Display a note for every Mutant Tank when they spawn. + // Note: This note can also be displayed for clones if the "Clone Mode" setting is set to "1", so the chat could be spammed if multiple clones spawn. + // Note: A note must be manually created in the translation file (mutant_tanks_names.phrases.txt). + // Note: Tank notes support chat color tags in the translation file. + // Note: This setting can be overridden for each Mutant Tank under the "General" section of their settings. + // Note: This setting can be overridden for specific players. + // -- + // -1/"ignore"/"exclude"/"filter"/"remove": Let the setting with the same name from each player-controlled Mutant Tank's "General" section decide. + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Tank Note" "0" + // The model used by all Mutant Tanks. // Note: This setting can be used for standard Tanks. // Note: This setting can be overridden for each Mutant Tank under the "General" section of their settings. @@ -400,7 +427,7 @@ // Maximum: 32 "Spawn Limit" "0" - // The range of types to check for. + // The range of mutant types to check for. // -- // Separate values with "-". // -- @@ -447,6 +474,35 @@ // 32: Enable Chargers. (Only available in Left 4 Dead 2.) "Special Types" "-1" + // Every Mutant Special Infected has this many chances out of 100.0% to spawn. + // Note: Clones, respawned Mutant Special Infected, randomized Special Infected, and Mutant Special Infected spawned through the Mutant Special Infected menu are not affected. + // Note: If each enabled Mutant Special Infected has less than 100% chance of spawning, then every enabled Mutant Special Infected that has a 1% or higher chance of spawning will have an equal chance to spawn. + // Note: Do not change this setting if you are unsure of how it works. + // Note: This setting can be overridden for each Mutant Special Infected under the "General" section of their settings. + // -- + // Minimum: 0.0 (No chance) + // Maximum: 100.0 (Highest chance) + // -- + // Keywords: + // "never" - 0% chance + // "sometimes"/"unlikely"/"seldom" - 33.3% chance + // "maybe" - 50% chance + // "often"/"likely"/"frequently" - 66.6% chance + // "always" - 100% chance + "Special Chance" "100.0" + + // Display a note for every Mutant Special Infected when they spawn. + // Note: This note can also be displayed for clones if the "Clone Mode" setting is set to "1", so the chat could be spammed if multiple clones spawn. + // Note: A note must be manually created in the translation file (mutant_tanks_names.phrases.txt). + // Note: Special Infected notes support chat color tags in the translation file. + // Note: This setting can be overridden for each Mutant Special Infected under the "General" section of their settings. + // Note: This setting can be overridden for specific players. + // -- + // -1/"ignore"/"exclude"/"filter"/"remove": Let the setting with the same name from each player-controlled Mutant Special Infected's "General" section decide. + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Special Note" "0" + // The model used by all Mutant Special Infected. // Note: This setting only works for the Smoker, Boomer, and Hunter. // Note: This setting can be used for standard Special Infected. @@ -467,6 +523,8 @@ "Finales Only" "0" "Requires Humans" "0" "Special Types" "-1" + "Special Chance" "100.0" + "Special Note" "0" "Special Model" "0" "Burn Duration" "0.0" "Burnt Skin" "-1.0" @@ -474,6 +532,212 @@ "Spawn Enabled" "-1" "Type Range" "1-500" } + "Mob" // Syntax: "Mob"/"Infected"/"inf" + { + // Enable all Mutant Mob Infected types. + // Note: This setting determines full availability. Even if other spawn settings are enabled while this is disabled, all Mutant Mob Infected types will stay disabled. + // Note: This setting can be overridden for each Mutant Mob Infected under the "General" section of their settings. + // -- + // Add up numbers together for different results. + // -- + // Minimum: -1 + // Maximum: 3 + // -- + // -1/"ignore"/"exclude"/"filter"/"remove": Let the setting with the same name from each Mutant Special Infected's "General" section decide. + // 0/"disabled"/"false"/"off"/"no": OFF + // 1: Enable Witches - Mutant Witches can convert nearby infected into the same mutant type as her when startled and/or killed. + // 2: Enable Common Infected - Mutant Common Infected can combine their bio mass to produce Mutant Special Infected. + "Mob Variants" "-1" + + // The chance for Mutant Common Infected to spawn each mutant type. + // Note: This setting can be overridden for each Mutant Common Infected under the "General" section of their settings. + // -- + // Minimum: 0.0 (No chance) + // Maximum: 100.0 (Highest chance) + // -- + // Keywords: + // "never" - 0% chance + // "sometimes"/"unlikely"/"seldom" - 33.3% chance + // "maybe" - 50% chance + // "often"/"likely"/"frequently" - 66.6% chance + // "always" - 100% chance + "Common Bio Chance" "50.0" + + // Every Mutant Common Infected has this many chances out of 100.0% to spawn. + // Note: This setting can be overridden for each Mutant Common Infected under the "General" section of their settings. + // -- + // Minimum: 0.0 (No chance) + // Maximum: 100.0 (Highest chance) + // -- + // Keywords: + // "never" - 0% chance + // "sometimes"/"unlikely"/"seldom" - 33.3% chance + // "maybe" - 50% chance + // "often"/"likely"/"frequently" - 66.6% chance + // "always" - 100% chance + "Common Chance" "100.0" + + // Check the bio mass meter for Mutant Common Infected every time this many seconds passes. + // -- + // Minimum: 0.0 (OFF) + // Maximum: 99999.0 + "Common Check" "300.0" + + // The number of points added to the bio mass meter for each damage of the same amount dealt to common infected directly by survivors. + // Note: The amount of damage a common infected takes directly from survivors throughout its lifespan must be equal to or greater than the value of this setting for the points to be added. + // Note: This setting can be overridden for each Mutant Common Infected under the "General" section of their settings. + // -- + // 0: OFF + // 1-1000000: Points added to bio mass meter. + "Common Damage Points" "50.0" + + // The number of points added to the bio mass meter for each common infected death. + // Note: This setting can be overridden for each Mutant Common Infected under the "General" section of their settings. + // -- + // 0: OFF + // 1-1000000: Points added to bio mass meter. + "Common Death Points" "100.0" + + // The types of Mutant Special Infected that the bio mass meter can spawn. + // -- + // Add up numbers together for different results. + // -- + // Minimum: 0 + // Maximum: 127 + // -- + // 0 OR 127: Pick randomly between the 7 options. + // 1: Tank + // 2: Smoker + // 4: Boomer + // 8: Hunter + // 16: Spitter (Switches to Boomer in Left 4 Dead 1.) + // 32: Jockey (Switches to Hunter in Left 4 Dead 1.) + // 64: Charger (Switches to Smoker in Left 4 Dead 1.) + "Common Filter" "0" + + // The number of points needed in the bio mass meter to spawn every mutant type. + // Note: This setting can be overridden for each Mutant Common Infected under the "General" section of their settings. + // -- + // 0: OFF + // 1-1000000: Points added to bio mass meter. + "Common Goal" "5000.0" + + // The variants of every common infected to mutate. + // Note: This setting can be overridden for each Mutant Common Infected under the "General" section of their settings. + // -- + // Add up numbers together for different results. + // -- + // Minimum: 0 + // Maximum: 255 + // -- + // 0 OR 255: All variants of common infected. + // 1: Common Infected + // 2: CEDA Workers (Dead Center) + // 4: Jimmy Gibbs Jr's (Dead Center) + // 8: Fallen Survivors (The Passing) + // 16: Clowns (Dark Carnival) + // 32: Mudmen (Swamp Fever) + // 64: Roadcrew Workers (Hard Rain) + // 128: Riot Cops (The Parish) + "Common Variant" "0" + + // Every Mutant Witch has this many chances out of 100.0% to spawn. + // Note: This setting can be overridden for each Mutant Witch under the "General" section of their settings. + // -- + // Minimum: 0.0 (No chance) + // Maximum: 100.0 (Highest chance) + // -- + // Keywords: + // "never" - 0% chance + // "sometimes"/"unlikely"/"seldom" - 33.3% chance + // "maybe" - 50% chance + // "often"/"likely"/"frequently" - 66.6% chance + // "always" - 100% chance + "Witch Chance" "100.0" + + // The types of host bodies that Mutant Witches can mutate. + // Note: This setting can be overridden for each Mutant Witch under the "General" section of their settings. + // -- + // Add up numbers together for different results. + // -- + // Minimum: 0 + // Maximum: 511 + // -- + // 0 OR 511: All types of host bodies. + // 1: Common Infected + // 2: Smoker + // 4: Boomer + // 8: Hunter + // 16: Spitter (Switches to Boomer in Left 4 Dead 1.) + // 32: Jockey (Switches to Hunter in Left 4 Dead 1.) + // 64: Charger (Switches to Smoker in Left 4 Dead 1.) + // 128: Tank + // 256: Survivors + "Witch Filter" "0" + + // Witches spawned by abilities will be treated as real Mutant Witches. + // Note: This setting can be overridden for each Mutant Witch under the "General" section of their settings. + // -- + // 0/"disabled"/"false"/"off"/"no": OFF, witches cannot mutate others like real Mutant Witches. + // 1/"enabled"/"true"/"on"/"yes": ON, witches can mutate others like real Mutant Witches. + "Witch Mode" "0" + + // The chance for Mutant Witches to mutate other infected into every mutant type. + // Note: This setting can be overridden for each Mutant Witch under the "General" section of their settings. + // -- + // Minimum: 0.0 (No chance) + // Maximum: 100.0 (Highest chance) + // -- + // Keywords: + // "never" - 0% chance + // "sometimes"/"unlikely"/"seldom" - 33.3% chance + // "maybe" - 50% chance + // "often"/"likely"/"frequently" - 66.6% chance + // "always" - 100% chance + "Witch Mutate Chance" "100.0" + + // The range of every Mutant Witch's mutation radius. + // Note: This setting can be overridden for each Mutant Witch under the "General" section of their settings. + // -- + // Minimum: 1.0 (Closest) + // Maximum: 99999.0 (Farthest) + // -- + // Keywords: + // "closest" - 1.0 range + // "farthest" - 99999.0 range + "Witch Range" "500.0" + + // The types of when to trigger every Mutant Witch's mutation radius. + // Note: This setting can be overridden for each Mutant Witch under the "General" section of their settings. + // -- + // Add up numbers together for different results. + // -- + // Minimum: 0 + // Maximum: 7 + // -- + // 0 OR 7: All modes of triggers. + // 1: When every Mutant Witch is startled. + // 2: When every Mutant Witch is killed. + // 4: When every Mutant Witch is crowned. + "Witch Types" "0" + + // Example + "Mob Variants" "-1" + "Common Bio Chance" "50.0" + "Common Chance" "100.0" + "Common Check" "300.0" + "Common Damage Points" "50.0" + "Common Death Points" "100.0" + "Common Filter" "0" + "Common Goal" "5000.0" + "Common Variant" "0" + "Witch Chance" "100.0" + "Witch Filter" "0" + "Witch Mode" "0" + "Witch Mutate Chance" "100.0" + "Witch Range" "500.0" + "Witch Types" "0" + } } "Announcements" { @@ -647,6 +911,47 @@ "Vocalize Death" "1" } } + "Classes" + { + // Classes can be created with unique nicknames that can be used in each mutant type's "* Class" setting. + // -- + // "Boomer Class" + // "Charger Class" + // "Hunter Class" + // "Jockey Class" + // "Smoker Class" + // "Spitter Class" + // "Tank Class" + // -- + // Each time the config file is read, the classes in this section will be stored with their associated limits. + // A nickname must be unique and cannot be used more than once. + // Any duplicates will overwrite previous entries. + // -- + // Example: + + // Mutant types that provide support for the infected team via healing or boosting stats. + "Supports" "2" + + // Mutant types that provide constant damage for the infected team to take down survivors. + "Damage" "2" + + // Mutant types that provide cover for the infected team by soaking up damage. + "Sponges" "1" + + "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" + { + // Note: Override any of the settings in the "Classes" section for each special infected here. + + // Mutant Boomer types that provide support for the infected team via healing or boosting stats. + "Boomer Supports" "2" + + // Mutant Boomer types that provide constant damage for the infected team to take down survivors. + "Boomer Damage" "2" + + // Mutant Boomer types that provide cover for the infected team by soaking up damage. + "Boomer Sponges" "1" + } + } "Colors" { // Color presets can be created with unique nicknames that can be used in several color settings. @@ -685,88 +990,272 @@ // All shields provided by the Shield ability will be blue and 80% transparent. "all_shields" "0,0,255,50" // See "Shield Color" below. } - "Rewards" + "Punishment" { - // Reward survivors for fighting Mutant Tanks. - // Note: Some rewards may require Lux's "WeaponHandling_API" plugin. - // Link: https://forums.alliedmods.net/showthread.php?t=319947 - // Note: Some rewards may require patches from the "mutant_tanks_patches.cfg" config file to work. - // Note: This setting can be used for standard Tanks. - // Note: This setting can be overridden for each Mutant Tank under the "Rewards" section of their settings. + // Punish human-controlled survivors who rush or fall behind. // -- // Separate values with commas (","). // -- - // Add up numbers together for different results. + // Minimum value for each: -1 + // Maximum value for each: 500 + // -- + // -1: OFF + // 0: Random + // 1-500: ON, the mutant type to punish rushers/slackers. + // -- + // 1st number = Enable punishment for slackers. + // 2nd number = Enable punishment for rushers. + "Punish Enabled" "0,0" + + // Punish survivor bots who rush or fall behind. + // -- + // Separate values with commas (","). // -- // Minimum value for each: -1 - // Maximum value for each: 2147483647 + // Maximum value for each: 500 // -- // -1: OFF // 0: Random - // 1: Health reward (temporary) - // - Refill to a certain percentage of health. - // - Automatically kill any current special infected attacker. - // - Heal back to 100% health with first aid kits. - // - Receive 100% temporary health after being revived. - // - Slowly regenerate back to full health. - // - Leech health off of any infected per melee hit. - // - Turn damage into health from self-made fires. - // - Turn damage into health from self-made explosions. - // - Heal teammates with bullets. - // - Heal teammates with melee hits. - // 2: Speed boost reward (temporary) - // - Run faster - // - Jump higher (Disables the death fall camera for recipients.) - // - Receive the adrenaline effect for the duration of the reward. (Only available in Left 4 Dead 2.) - // - Bunny hop consistently - // - Burst open doors - // - Throw sticky grenades that slow down special infected and mitigate their abilities. - // 4: Damage boost reward (temporary) - // - Laser sight - // - Inextinguishable fire - // - Extended pipebomb duration - // - Prevent dealing and receiving friendly-fire. - // - Extra damage - // - Bypass Tank immunities - // - Damage resistance - // - Automatically kill Witches. - // - Ghost bullets - // - Hollowpoint ammo - // - Extended melee range - // - Recoil dampener - // - Sledgehammer rounds - // - Protected by thorns (deal damage towards attacker per hit taken) - // 8: Attack boost reward (temporary) - // - Prevent slowing down when attacked by infected. - // - Prevent infected attacks from offsetting aim. - // - Prevent interruption when performing actions. - // - Prevent switching to secondary slot when equipping a secondary pistol. - // - Prevent switching to throwables and health supplies given by teammates. - // - Perform actions on ladders. - // - Bypass shove penalty. - // - Shoving damages Tanks. - // - Faster shove interval - // - Faster fire rate (guns) - // - Faster reload rate (guns) - // - Faster swing rate (melee) - // - Faster throw time (throwables) - // - Faster revive time - // - Faster healing time (first aid kit) - // - Faster defib time (defibrillator) - // - Faster deploy time (ammo upgrade packs) - // - Faster pour time (gas cans) - // - Faster delivery time (cola bottles) - // - Faster recovery time - // - Rapid-fire pistols - // 16: Ammo reward (temporary) - // - Refill clip to max size - // - Refill magazine to max size - // - Extra clip and magazine size - // - Receive one of the special ammo types (incendiary or explosive). (Only available in Left 4 Dead 2.) - // - Slowly regenerate back to full capacity. - // - Throw multiple pipe bombs at once (cluster bombs). - // 32: Item reward - // - Receive up to five items. + // 1-500: ON, the mutant type to punish rushers/slackers. + // -- + // 1st number = Enable punishment for slackers. + // 2nd number = Enable punishment for rushers. + "Punish Bots" "0,0" + + // The punishment system only works on certain maps. + // -- + // 0: OFF, Enable on all maps. + // 1: ON, Enable only on non-finale maps. + // 2: ON, Enable only on finale maps. + "Finale Check" "0" + + // The types of punishers that can spawn. + // -- + // Separate values with commas (","). + // -- + // Add up numbers together for different results. + // -- + // Minimum: 0 + // Maximum: 127 + // -- + // 0 OR 127: Pick randomly between the 7 options. + // 1: Tank + // 2: Smoker + // 4: Boomer + // 8: Hunter + // 16: Spitter (Only available in Left 4 Dead 2.) + // 32: Jockey (Only available in Left 4 Dead 2.) + // 64: Charger (Only available in Left 4 Dead 2.) + // -- + // 1st number = Types of punishers that can spawn for slackers. + // 2nd number = Types of punishers that can spawn for rushers. + "Punisher Types" "1,1" + + // Punishers die after this many seconds. + // -- + // Separate values with commas (","). + // -- + // Minimum: 0.0 (Until death) + // Maximum: 99999.0 (Longest) + // -- + // Keywords: + // "never"/"disabled"/"false"/"off"/"no" - 0 seconds + // "milli"/"millisecond" - 0.1 seconds + // "second" - 1 second + // "minute" - 1 minute + // "forever"/"death" - 99999 seconds + // -- + // 1st number = Punishers die after this many seconds for slackers. + // 2nd number = Punishers die after this many seconds for rushers. + "Punisher Lifetime" "5.0,5.0" + + // The minimum distance between a rusher/slacker and the team to be warned. + // -- + // Separate values with commas (","). + // -- + // Minimum: 1.0 (Closest) + // Maximum: 99999.0 (Farthest) + // -- + // Keywords: + // "closest" - 1.0 range + // "farthest" - 99999.0 range + // -- + // 1st number = The minimum distance between a slacker and the team to be warned. + // 2nd number = The minimum distance between a rusher and the team to be warned. + "Warning Distance" "500.0,1000.0" + + // The minimum distance between a rusher/slacker and the team to be punished. + // -- + // Separate values with commas (","). + // -- + // Minimum: 1.0 (Closest) + // Maximum: 99999.0 (Farthest) + // -- + // Keywords: + // "closest" - 1.0 range + // "farthest" - 99999.0 range + // -- + // 1st number = The minimum distance between a slacker and the team to be punished. + // 2nd number = The minimum distance between a rusher and the team to be punished. + "Punish Distance" "1000.0,2000.0" + + // The number of warnings to give to rushers/slackers before punishing them. + // -- + // Separate values with commas (","). + // -- + // Minimum: 0 (OFF) + // Maximum: 99999 (Highest) + // -- + // 1st number = The number of warnings to give to slackers before punishing them. + // 2nd number = The number of warnings to give to rushers before punishing them. + "Warning Limit" "3,3" + + // Rushers/slackers are warned every time this many seconds passes. + // -- + // Separate values with commas (","). + // -- + // Minimum: 1 + // Maximum: 99999 + // -- + // Keywords: + // "second" - 1 second + // "minute" - 1 minute + // "forever" - 99999 seconds + // -- + // 1st number = Slackers are warned every time this many seconds passes. + // 2nd number = Rushers are warned every time this many seconds passes. + "Warning Interval" "5,5" + + // The types of survivors tracked by the punishment system. + // -- + // Add up numbers together for different results. + // -- + // Minimum: 0 + // Maximum: 63 + // -- + // 0 OR 63: Track all types. + // 1: Alive/Healthy + // 2: Incapacitated/Hanging + // 4: Doing actions + // 8: Idle/AFK + // 16: Pinned/Caught + // 32: Injured/Black and white + "Survivor Types" "1" + + // The number of alive survivors needed to enable the punishment system. + // -- + // Minimum: 0 + // Maximum: 32 + // -- + // 0: OFF + // 1-32: ON, the number of alive survivors needed to enable the punishment system. + "Survivors Required" "3" + + // The number of incapacitated survivors needed for the punishment system to ignore them. + // -- + // Minimum: 0 + // Maximum: 32 + // -- + // 0: OFF + // 1-32: ON, the number of incapacitated survivors needed for the punishment system to ignore them. + "Incaps Required" "2" + + // Slow down time for this many seconds when punishing a rusher/slacker. + // -- + // Separate values with commas (","). + // -- + // Minimum: 0.1 (Shortest) + // Maximum: 99999.0 (Longest) + // -- + // 1st number = Slow down time for this many seconds when punishing a slacker. + // 2nd number = Slow down time for this many seconds when punishing a rusher. + "Zed Time" "1.0,1.0" + } + "Rewards" + { + // Reward survivors for fighting Mutant Tanks. + // Note: Some rewards may require Lux's "WeaponHandling_API" plugin. + // Link: https://forums.alliedmods.net/showthread.php?t=319947 + // Note: Some rewards may require patches from the "mutant_tanks_patches.cfg" config file to work. + // Note: This setting can be used for standard Tanks. + // Note: This setting can be overridden for each Mutant Tank under the "Rewards" section of their settings. + // -- + // Separate values with commas (","). + // -- + // Add up numbers together for different results. + // -- + // Minimum value for each: -1 + // Maximum value for each: 2147483647 + // -- + // -1: OFF + // 0: Random + // 1: Health reward (temporary) + // - Refill to a certain percentage of health. + // - Automatically kill any current special infected attacker. + // - Heal back to 100% health with first aid kits. + // - Receive 100% temporary health after being revived. + // - Slowly regenerate back to full health. + // - Leech health off of any infected per melee hit. + // - Turn damage into health from self-made fires. + // - Turn damage into health from self-made explosions. + // - Heal teammates with bullets. + // - Heal teammates with melee hits. + // - Donate health to teammates. + // 2: Speed boost reward (temporary) + // - Run faster + // - Chain multiple jumps + // - Jump higher (Disables the death fall camera for recipients.) + // - Receive the adrenaline effect. (Only available in Left 4 Dead 2.) + // - Bunny hop consistently + // - Burst open doors + // - Throw sticky grenades that slow down special infected and mitigate their abilities. + // 4: Damage boost reward (temporary) + // - Laser sight + // - Eternal flames + // - Extended pipebomb duration + // - Prevent dealing and receiving friendly-fire. + // - Extra damage + // - Bypass Tank immunities + // - Damage resistance + // - Automatically kill Witches. + // - Ghost bullets + // - Hollowpoint ammo + // - Extended melee range + // - Recoil dampener + // - Sledgehammer rounds + // - Protected by thorns (deal damage towards attacker per hit taken) + // 8: Attack boost reward (temporary) + // - Prevent slowing down when attacked by infected. + // - Prevent infected attacks from offsetting aim. + // - Prevent interruption when performing actions. + // - Prevent switching to secondary slot when equipping a secondary pistol. + // - Prevent switching to throwables and health supplies given by teammates. + // - Perform actions on ladders. + // - Bypass shove penalty. + // - Shoving damages Tanks. + // - Faster shove interval + // - Faster fire rate (guns) + // - Faster reload rate (guns) + // - Faster swing rate (melee) + // - Faster throw time (throwables) + // - Faster revive time + // - Faster healing time (first aid kit) + // - Faster defib time (defibrillator) + // - Faster deploy time (ammo upgrade packs) + // - Faster pour time (gas cans) + // - Faster delivery time (cola bottles) + // - Faster recovery time + // - Rapid-fire pistols + // 16: Ammo reward (temporary) + // - Refill clip to max size + // - Refill magazine to max size + // - Extra clip and magazine size + // - Receive one of the special ammo types (incendiary or explosive). (Only available in Left 4 Dead 2.) + // - Slowly regenerate back to full capacity. + // - Throw multiple pipe bombs at once (cluster bombs). + // - Shoot grenades + // 32: Item reward + // - Receive up to five items. // 64: God mode reward (temporary) // - Automatically prevent attacks from and kill all special infected attackers. // - Immune to all types of damage. @@ -827,16 +1316,18 @@ // - Turn damage into health from self-made explosions. // - Heal teammates with bullets. // - Heal teammates with melee hits. + // - Donate health to teammates. // 2: Speed boost reward (temporary) // - Run faster + // - Chain multiple jumps // - Jump higher (Disables the death fall camera for recipients.) - // - Receive the adrenaline effect for the duration of the reward. (Only available in Left 4 Dead 2.) + // - Receive the adrenaline effect. (Only available in Left 4 Dead 2.) // - Bunny hop consistently // - Burst open doors // - Throw sticky grenades that slow down special infected and mitigate their abilities. // 4: Damage boost reward (temporary) // - Laser sight - // - Inextinguishable fire + // - Eternal flames // - Extended pipebomb duration // - Prevent dealing and receiving friendly-fire. // - Extra damage @@ -878,6 +1369,7 @@ // - Receive one of the special ammo types (incendiary or explosive). (Only available in Left 4 Dead 2.) // - Slowly regenerate back to full capacity. // - Throw multiple pipe bombs at once (cluster bombs). + // - Shoot grenades // 32: Item reward // - Receive up to five items. // 64: God mode reward (temporary) @@ -1111,6 +1603,24 @@ // 4th number = Duration for assistant killers. "Action Duration Reward" "2.0,2.0,2.0,2.0" + // The adrenaline time to reward to survivors. + // Note: This setting can be used for standard Tanks. + // Note: This setting can be overridden for each Mutant Tank under the "Rewards" section of their settings. + // -- + // Separate durations with commas (","). + // -- + // Durations limit: 4 + // Character limit for each duration: 9 + // -- + // Minimum value for each duration: 0.0 (OFF) + // Maximum value for each duration: 99999.0 (Fastest) + // -- + // 1st number = Duration for killers. + // 2nd number = Duration for assistants. + // 3rd number = Duration for teammates. + // 4th number = Duration for assistant killers. + "Adrenaline Time Reward" "30.0,30.0,30.0,30.0" + // Give ammo boost as a reward to survivors. // Note: This setting can be used for standard Tanks. // Note: This setting can be overridden for each Mutant Tank under the "Rewards" section of their settings. @@ -1129,6 +1639,24 @@ // 4th number = Give ammo boost to assistant killers. "Ammo Boost Reward" "1,1,1,1" + // Give ammo refill as a reward to survivors. + // Note: This setting can be used for standard Tanks. + // Note: This setting can be overridden for each Mutant Tank under the "Rewards" section of their settings. + // -- + // Separate values with commas (","). + // -- + // Values limit: 4 + // Character limit for each value: 1 + // -- + // Minimum value for each: 0 (OFF) + // Maximum value for each: 1 (ON) + // -- + // 1st number = Give ammo refill to killers. + // 2nd number = Give ammo refill to assistants. + // 3rd number = Give ammo refill to teammates. + // 4th number = Give ammo refill to assistant killers. + "Ammo Refill Reward" "1,1,1,1" + // The amount of ammo to regenerate per second as a reward to survivors. // Note: This setting can be used for standard Tanks. // Note: This setting can be overridden for each Mutant Tank under the "Rewards" section of their settings. @@ -1172,10 +1700,10 @@ // Separate values with commas (","). // -- // Values limit: 4 - // Character limit for each value: 1 + // Character limit for each value: 7 // -- // Minimum value for each: 0 (OFF) - // Maximum value for each: 1 (ON) + // Maximum value for each: 1000000 (Highest) // -- // 1st number = Allow healing from self-made fires to killers. // 2nd number = Allow healing from self-made fires to assistants. @@ -1183,6 +1711,28 @@ // 4th number = Allow healing from self-made fires to assistant killers. "Blaze Health Reward" "1,1,1,1" + // Take this much health from the recipient whenever the recipient heals a teammate with any of the following rewards: + // - Blaze Health Reward + // - Medical Cuts Reward + // - Regen Bursts Reward + // - Syringe Darts Reward + // Note: This setting can be used for standard Tanks. + // Note: This setting can be overridden for each Mutant Tank under the "Rewards" section of their settings. + // -- + // Separate values with commas (","). + // -- + // Values limit: 4 + // Character limit for each value: 7 + // -- + // Minimum value for each: 0 (OFF) + // Maximum value for each: 1000000 (Highest) + // -- + // 1st number = Take this much health from killers. + // 2nd number = Take this much health from assistants. + // 3rd number = Take this much health from teammates. + // 4th number = Take this much health from assistant killers. + "Blood Donor Reward" "0,0,0,0" + // Allow bunnyhopping as a reward to survivors. // Note: This setting can be used for standard Tanks. // Note: This setting can be overridden for each Mutant Tank under the "Rewards" section of their settings. @@ -1291,14 +1841,50 @@ // 4th number = Resistance for assistant killers. "Damage Resistance Reward" "0.5,0.5,0.5,0.5" + // When a survivor consumes adrenaline, any other survivors within this radius also receives the effects of adrenaline for a short duration. + // Note: This setting can be used for standard Tanks. + // Note: This setting can be overridden for each Mutant Tank under the "Rewards" section of their settings. + // -- + // Separate radii with commas (","). + // -- + // Radii limit: 4 + // Character limit for each radius: 6 + // -- + // Minimum radius for each: 0.0 (OFF) + // Maximum radius for each: 100.0 (Farthest) + // -- + // 1st number = Radius for killers. + // 2nd number = Radius for assistants. + // 3rd number = Radius for teammates. + // 4th number = Radius for assistant killers. + "Dopamine Radius Reward" "150.0,150.0,150.0,150.0" + + // Give inextinguishable fire as a reward to survivors. + // Note: This setting can be used for standard Tanks. + // Note: This setting can be overridden for each Mutant Tank under the "Rewards" section of their settings. + // -- + // Separate values with commas (","). + // -- + // Values limit: 4 + // Character limit for each value: 1 + // -- + // Minimum value for each: 0 (OFF) + // Maximum value for each: 1 (ON) + // -- + // 1st number = Give inextinguishable fire to killers. + // 2nd number = Give inextinguishable fire to assistants. + // 3rd number = Give inextinguishable fire to teammates. + // 4th number = Give inextinguishable fire to assistant killers. + "Eternal Flames Reward" "1,1,1,1" + // The voiceline that plays when survivors are falling. // Note: This setting can be used for standard Tanks. // Note: This setting can be overridden for each Mutant Tank under the "Rewards" section of their settings. // -- - // Separate voicelines sets with commas (","). + // Separate voicelines with commas (","). // -- - // Item sets limit: 4 - // Character limit for each set: 64 + // Voiceline limit: 4 + // Character limit for each voiceline: 64 // -- // 1st set = Fall voiceline for killers. // 2nd set = Fall voiceline for assistants. @@ -1306,7 +1892,7 @@ // 4th set = Fall voiceline for assistant killers. "Fall Voiceline Reward" "PlayerLaugh,PlayerLaugh,PlayerLaugh,PlayerLaugh" - // Give friendly-fire immunity as a reward to survivors. + // Give fast recovery as a reward to survivors. // Note: This setting can be used for standard Tanks. // Note: This setting can be overridden for each Mutant Tank under the "Rewards" section of their settings. // -- @@ -1318,11 +1904,47 @@ // Minimum value for each: 0 (OFF) // Maximum value for each: 1 (ON) // -- - // 1st number = Give immunity to killers. - // 2nd number = Give immunity to assistants. - // 3rd number = Give immunity to teammates. - // 4th number = Give immunity to assistant killers. - "Friendly Fire Reward" "1,1,1,1" + // 1st number = Give fast recovery to killers. + // 2nd number = Give fast recovery to assistants. + // 3rd number = Give fast recovery to teammates. + // 4th number = Give fast recovery to assistant killers. + "Fast Recovery Reward" "1,1,1,1" + + // The fire rate to reward to survivors. + // Note: This setting can be used for standard Tanks. + // Note: This setting can be overridden for each Mutant Tank under the "Rewards" section of their settings. + // -- + // Separate rates with commas (","). + // -- + // Rates limit: 4 + // Character limit for each rate: 9 + // -- + // Minimum value for each rate: 0.0 (OFF) + // Maximum value for each rate: 99999.0 (Fastest) + // -- + // 1st number = Rate for killers. + // 2nd number = Rate for assistants. + // 3rd number = Rate for teammates. + // 4th number = Rate for assistant killers. + "Fire Rate Reward" "1.25,1.25,1.25,1.25" + + // Give friendly-fire immunity as a reward to survivors. + // Note: This setting can be used for standard Tanks. + // Note: This setting can be overridden for each Mutant Tank under the "Rewards" section of their settings. + // -- + // Separate values with commas (","). + // -- + // Values limit: 4 + // Character limit for each value: 1 + // -- + // Minimum value for each: 0 (OFF) + // Maximum value for each: 1 (ON) + // -- + // 1st number = Give immunity to killers. + // 2nd number = Give immunity to assistants. + // 3rd number = Give immunity to teammates. + // 4th number = Give immunity to assistant killers. + "Friendly Fire Reward" "1,1,1,1" // Give ghost bullets as a reward to survivors. // Note: This setting can be used for standard Tanks. @@ -1342,6 +1964,25 @@ // 4th number = Give ghost bullets to assistant killers. "Ghost Bullets Reward" "1,1,1,1" + // Give up this percentage of reserved ammo to launch a grenade on any gun as a reward to survivors. + // Note: Press your Use (default: E) and Zoom (default: mouse wheel) keys to launch a grenade. + // Note: This setting can be used for standard Tanks. + // Note: This setting can be overridden for each Mutant Tank under the "Rewards" section of their settings. + // -- + // Separate percentages with commas (","). + // -- + // Percentages limit: 4 + // Character limit for each percentage: 1 + // -- + // Minimum percentage for each: 0.0 (OFF) + // Maximum percentage for each: 100.0 (Highest) + // -- + // 1st number = Percentage of reserved ammo for killers. + // 2nd number = Percentage of reserved ammo for assistants. + // 3rd number = Percentage of reserved ammo for teammates. + // 4th number = Percentage of reserved ammo for assistant killers. + "Grenade Launcher Reward" "10.0,10.0,10.0,10.0" + // The healing percentage from first aid kits to reward to survivors. // Note: This setting can be used for standard Tanks. // Note: This setting can be overridden for each Mutant Tank under the "Rewards" section of their settings. @@ -1360,6 +2001,24 @@ // 4th number = Heal percentage for assistant killers. "Heal Percent Reward" "100.0,100.0,100.0,100.0" + // When a survivor heals with a medkit, any other survivors within this radius also receives a small portion of health. + // Note: This setting can be used for standard Tanks. + // Note: This setting can be overridden for each Mutant Tank under the "Rewards" section of their settings. + // -- + // Separate radii with commas (","). + // -- + // Radii limit: 4 + // Character limit for each radius: 6 + // -- + // Minimum radius for each: 0.0 (OFF) + // Maximum radius for each: 100.0 (Farthest) + // -- + // 1st number = Radius for killers. + // 2nd number = Radius for assistants. + // 3rd number = Radius for teammates. + // 4th number = Radius for assistant killers. + "Healthcare Radius Reward" "150.0,150.0,150.0,150.0" + // The amount of health to regenerate per second as a reward to survivors. // Note: This setting can be used for standard Tanks. // Note: This setting can be overridden for each Mutant Tank under the "Rewards" section of their settings. @@ -1378,41 +2037,41 @@ // 4th number = Amount for assistant killers. "Health Regen Reward" "1,1,1,1" - // Give hollowpoint ammo as a reward to survivors. + // This is the cooldown for a small healing wave that triggers whenever a survivor hurts any infected target. Any teammate within the small radius will receive 5 HP. // Note: This setting can be used for standard Tanks. // Note: This setting can be overridden for each Mutant Tank under the "Rewards" section of their settings. // -- - // Separate values with commas (","). + // Separate cooldowns with commas (","). // -- - // Values limit: 4 - // Character limit for each value: 1 + // Cooldowns limit: 4 + // Character limit for each cooldown: 9 // -- - // Minimum value for each: 0 (OFF) - // Maximum value for each: 1 (ON) + // Minimum value for each cooldown: 0.0 (OFF) + // Maximum value for each cooldown: 99999.0 (Longest) // -- - // 1st number = Give hollowpoint ammo to killers. - // 2nd number = Give hollowpoint ammo to assistants. - // 3rd number = Give hollowpoint ammo to teammates. - // 4th number = Give hollowpoint ammo to assistant killers. - "Hollowpoint Ammo Reward" "1,1,1,1" + // 1st number = Cooldown for killers. + // 2nd number = Cooldown for assistants. + // 3rd number = Cooldown for teammates. + // 4th number = Cooldown for assistant killers. + "Heartbeat Reward" "3.0,3.0,3.0,3.0" - // Give inextinguishable fire as a reward to survivors. + // The chance to shoot hollowpoint ammo as a reward to survivors. // Note: This setting can be used for standard Tanks. // Note: This setting can be overridden for each Mutant Tank under the "Rewards" section of their settings. // -- - // Separate values with commas (","). + // Separate chances with commas (","). // -- - // Values limit: 4 - // Character limit for each value: 1 + // Chances limit: 4 + // Character limit for each chance: 6 // -- - // Minimum value for each: 0 (OFF) - // Maximum value for each: 1 (ON) + // Minimum value for each chance: 0.0 (No chance) + // Maximum value for each chance: 100.0 (Highest chance) // -- - // 1st number = Give inextinguishable fire to killers. - // 2nd number = Give inextinguishable fire to assistants. - // 3rd number = Give inextinguishable fire to teammates. - // 4th number = Give inextinguishable fire to assistant killers. - "Inextinguishable Fire Reward" "1,1,1,1" + // 1st number = Chance to shoot hollowpoint ammo for killers. + // 2nd number = Chance to shoot hollowpoint ammo for assistants. + // 3rd number = Chance to shoot hollowpoint ammo for teammates. + // 4th number = Chance to shoot hollowpoint ammo for assistant killers. + "Hollowpoint Ammo Reward" "100.0,100.0,100.0,100.0" // Give infinite ammo as a reward to survivors. // Note: This setting can be used for standard Tanks. @@ -1491,23 +2150,24 @@ // 4th number = Allow actions for assistant killers. "Ladder Actions Reward" "1,1,1,1" - // Allow a number of Witches to be instantly killed as a reward to survivors. + // Give up this percentage of reserved ammo to instantly kill a Witch as a reward to survivors. + // Note: Press your Use (default: E) and Zoom (default: mouse wheel) keys to launch a lady killer grenade. // Note: This setting can be used for standard Tanks. // Note: This setting can be overridden for each Mutant Tank under the "Rewards" section of their settings. // -- - // Separate values with commas (","). + // Separate percentages with commas (","). // -- - // Values limit: 4 - // Character limit for each value: 1 + // Percentages limit: 4 + // Character limit for each percentage: 1 // -- - // Minimum value for each: 0 (OFF) - // Maximum value for each: 99999 (Highest) + // Minimum percentage for each: 0.0 (OFF) + // Maximum percentage for each: 100.0 (Highest) // -- - // 1st number = Number of bullets to give to killers. - // 2nd number = Number of bullets to give to assistants. - // 3rd number = Number of bullets to give to teammates. - // 4th number = Number of bullets to give to assistant killers. - "Lady Killer Reward" "1,1,1,1" + // 1st number = Percentage of reserved ammo for killers. + // 2nd number = Percentage of reserved ammo for assistants. + // 3rd number = Percentage of reserved ammo for teammates. + // 4th number = Percentage of reserved ammo for assistant killers. + "Lady Killer Reward" "25.0,25.0,25.0,25.0" // Give laser sight as a reward to survivors. // Note: This setting can be used for standard Tanks. @@ -1545,6 +2205,24 @@ // 4th number = Amount for assistant killers. "Life Leech Reward" "1,1,1,1" + // The chance to not lose a bullet from every gunshot as a reward to survivors. + // Note: This setting can be used for standard Tanks. + // Note: This setting can be overridden for each Mutant Tank under the "Rewards" section of their settings. + // -- + // Separate chances with commas (","). + // -- + // Chances limit: 4 + // Character limit for each chance: 6 + // -- + // Minimum value for each chance: 0.0 (No chance) + // Maximum value for each chance: 100.0 (Highest chance) + // -- + // 1st number = Chance to not lose a bullet from every gunshot for killers. + // 2nd number = Chance to not lose a bullet from every gunshot for assistants. + // 3rd number = Chance to not lose a bullet from every gunshot for teammates. + // 4th number = Chance to not lose a bullet from every gunshot for assistant killers. + "Lucky Bullet Reward" "25.0,25.0,25.0,25.0" + // Allow healing teammates with melee hits as a reward to survivors. // Note: This setting can be used for standard Tanks. // Note: This setting can be overridden for each Mutant Tank under the "Rewards" section of their settings. @@ -1552,16 +2230,16 @@ // Separate values with commas (","). // -- // Values limit: 4 - // Character limit for each value: 1 + // Character limit for each value: 7 // -- // Minimum value for each: 0 (OFF) - // Maximum value for each: 1 (ON) + // Maximum value for each: 1000000 (Highest) // -- // 1st number = Allow healing teammates with melee hits to killers. // 2nd number = Allow healing teammates with melee hits to assistants. // 3rd number = Allow healing teammates with melee hits to teammates. // 4th number = Allow healing teammates with melee hits to assistant killers. - "Medical Incisions Reward" "1,1,1,1" + "Medical Cuts Reward" "1,1,1,1" // The melee range to reward to survivors. // Note: This setting can be used for standard Tanks. @@ -1599,6 +2277,60 @@ // 4th number = Number of dashes (jumps) to give to assistant killers. "Midair Dashes Reward" "2,2,2,2" + // When a survivor revives another survivor, any other disabled survivors within this radius also gets revived. + // Note: This setting can be used for standard Tanks. + // Note: This setting can be overridden for each Mutant Tank under the "Rewards" section of their settings. + // -- + // Separate radii with commas (","). + // -- + // Radii limit: 4 + // Character limit for each radius: 6 + // -- + // Minimum radius for each: 0.0 (OFF) + // Maximum radius for each: 100.0 (Farthest) + // -- + // 1st number = Radius for killers. + // 2nd number = Radius for assistants. + // 3rd number = Radius for teammates. + // 4th number = Radius for assistant killers. + "Motivation Radius Reward" "150.0,150.0,150.0,150.0" + + // When a survivor consumes pain pills, any other survivors within this radius also receives a small portion of temporary health. + // Note: This setting can be used for standard Tanks. + // Note: This setting can be overridden for each Mutant Tank under the "Rewards" section of their settings. + // -- + // Separate radii with commas (","). + // -- + // Radii limit: 4 + // Character limit for each radius: 6 + // -- + // Minimum radius for each: 0.0 (OFF) + // Maximum radius for each: 100.0 (Farthest) + // -- + // 1st number = Radius for killers. + // 2nd number = Radius for assistants. + // 3rd number = Radius for teammates. + // 4th number = Radius for assistant killers. + "Overdose Radius Reward" "150.0,150.0,150.0,150.0" + + // The overhealth to reward to survivors. + // Note: This setting can be used for standard Tanks. + // Note: This setting can be overridden for each Mutant Tank under the "Rewards" section of their settings. + // -- + // Separate values with commas (","). + // -- + // Values limit: 4 + // Character limit for each value: 7 + // -- + // Minimum value for each: 0 (OFF) + // Maximum value for each: 1000000 (Highest) + // -- + // 1st number = Health for killers. + // 2nd number = Health for assistants. + // 3rd number = Health for teammates. + // 4th number = Health for assistant killers. + "Overhealth Reward" "200,200,200,200" + // The pipebomb duration to reward to survivors. // Note: This setting can be used for standard Tanks. // Note: This setting can be overridden for each Mutant Tank under the "Rewards" section of their settings. @@ -1671,7 +2403,7 @@ // 4th number = Give recoil dampener to assistant killers. "Recoil Dampener Reward" "1,1,1,1" - // The refill percentage from the "Health" and "Refill" rewards. + // The percentage of health to refill with the "Health" and "Refill" rewards. // Note: This setting can be used for standard Tanks. // Note: This setting can be overridden for each Mutant Tank under the "Rewards" section of their settings. // -- @@ -1696,10 +2428,10 @@ // Separate values with commas (","). // -- // Values limit: 4 - // Character limit for each value: 1 + // Character limit for each value: 7 // -- // Minimum value for each: 0 (OFF) - // Maximum value for each: 1 (ON) + // Maximum value for each: 1000000 (Highest) // -- // 1st number = Allow healing from self-made explosions to killers. // 2nd number = Allow healing from self-made explosions to assistants. @@ -1707,6 +2439,24 @@ // 4th number = Allow healing from self-made explosions to assistant killers. "Regen Bursts Reward" "1,1,1,1" + // The reload rate to reward to survivors. + // Note: This setting can be used for standard Tanks. + // Note: This setting can be overridden for each Mutant Tank under the "Rewards" section of their settings. + // -- + // Separate rates with commas (","). + // -- + // Rates limit: 4 + // Character limit for each rate: 9 + // -- + // Minimum value for each rate: 0.0 (OFF) + // Maximum value for each rate: 99999.0 (Fastest) + // -- + // 1st number = Rate for killers. + // 2nd number = Rate for assistants. + // 3rd number = Rate for teammates. + // 4th number = Rate for assistant killers. + "Reload Rate Reward" "1.25,1.25,1.25,1.25" + // Restore the previous loadouts of survivors after respawning them. // Note: This setting can be used for standard Tanks. // Note: This setting can be overridden for each Mutant Tank under the "Rewards" section of their settings. @@ -1743,6 +2493,60 @@ // 4th number = Health for assistant killers. "Revive Health Reward" "100,100,100,100" + // Give riot gear (high resistance to direct hits and knockbacks) as a reward to survivors. + // Note: This setting can be used for standard Tanks. + // Note: This setting can be overridden for each Mutant Tank under the "Rewards" section of their settings. + // -- + // Separate values with commas (","). + // -- + // Values limit: 4 + // Character limit for each value: 1 + // -- + // Minimum value for each: 0 (OFF) + // Maximum value for each: 1 (ON) + // -- + // 1st number = Give riot gear to killers. + // 2nd number = Give riot gear to assistants. + // 3rd number = Give riot gear to teammates. + // 4th number = Give riot gear to assistant killers. + "Riot Gear Reward" "1,1,1,1" + + // Give safety bubble (immunity to special attacks, mutant abilities, and the punishment system) as a reward to survivors. + // Note: This setting can be used for standard Tanks. + // Note: This setting can be overridden for each Mutant Tank under the "Rewards" section of their settings. + // -- + // Separate values with commas (","). + // -- + // Values limit: 4 + // Character limit for each value: 1 + // -- + // Minimum value for each: 0 (OFF) + // Maximum value for each: 1 (ON) + // -- + // 1st number = Give safety bubble to killers. + // 2nd number = Give safety bubble to assistants. + // 3rd number = Give safety bubble to teammates. + // 4th number = Give safety bubble to assistant killers. + "Safety Bubble Reward" "1,1,1,1" + + // When a dead survivor is revived with a defibrillator, any other dead survivors within this radius also gets revived with temporary health. + // Note: This setting can be used for standard Tanks. + // Note: This setting can be overridden for each Mutant Tank under the "Rewards" section of their settings. + // -- + // Separate radii with commas (","). + // -- + // Radii limit: 4 + // Character limit for each radius: 6 + // -- + // Minimum radius for each: 0.0 (OFF) + // Maximum radius for each: 100.0 (Farthest) + // -- + // 1st number = Radius for killers. + // 2nd number = Radius for assistants. + // 3rd number = Radius for teammates. + // 4th number = Radius for assistant killers. + "Shockwave Radius Reward" "150.0,150.0,150.0,150.0" + // The shove damage multiplier against Chargers, Witches, and Tanks to reward to survivors. // Note: The max health of the target will be multiplied by this setting's value. // Note: This setting can be used for standard Tanks. @@ -1803,23 +2607,23 @@ // Example: 0.7 (default "z_gun_swing_interval" value) * 0.7 (shove rate reward) = 0.49 rate "Shove Rate Reward" "0.7,0.7,0.7,0.7" - // Give sledgehammer rounds as a reward to survivors. + // The chance to shoot sledgehammer rounds as a reward to survivors. // Note: This setting can be used for standard Tanks. // Note: This setting can be overridden for each Mutant Tank under the "Rewards" section of their settings. // -- - // Separate values with commas (","). + // Separate chances with commas (","). // -- - // Values limit: 4 - // Character limit for each value: 1 + // Chances limit: 4 + // Character limit for each chance: 6 // -- - // Minimum value for each: 0 (OFF) - // Maximum value for each: 1 (ON) + // Minimum value for each chance: 0.0 (No chance) + // Maximum value for each chance: 100.0 (Highest chance) // -- - // 1st number = Give sledgehammer rounds to killers. - // 2nd number = Give sledgehammer rounds to assistants. - // 3rd number = Give sledgehammer rounds to teammates. - // 4th number = Give sledgehammer rounds to assistant killers. - "Sledgehammer Rounds Reward" "1,1,1,1" + // 1st number = Chance to shoot sledgehammer rounds for killers. + // 2nd number = Chance to shoot sledgehammer rounds for assistants. + // 3rd number = Chance to shoot sledgehammer rounds for teammates. + // 4th number = Chance to shoot sledgehammer rounds for assistant killers. + "Sledgehammer Rounds Reward" "100.0,100.0,100.0,100.0" // Give special ammo as a reward to survivors. // Note: Only available in Left 4 Dead 2. @@ -1837,7 +2641,7 @@ // 0: OFF // 1: Incendiary ammo // 2: Explosive ammo - // 4: Random + // 3: Random // -- // 1st number = Give special ammo to killers. // 2nd number = Give special ammo to assistants. @@ -1902,10 +2706,10 @@ // 4: Damage boost reward // 8: Attack boost reward // 16: Ammo reward - // 32: Item reward (Currently unused) + // 32: Item reward (Currently cannot be stacked.) // 64: God mode reward - // 128: Health and ammo refill reward (Currently unused) - // 256: Respawn reward (Currently unused) + // 128: Health and ammo refill reward (Currently cannot be stacked.) + // 256: Respawn reward (Currently cannot be stacked.) // 512: Infinite ammo reward // 1023: All above rewards // 1024-2147483647: Reserved for third-party plugins @@ -1934,6 +2738,42 @@ // 4th number = Give sticky grenades to assistant killers. "Sticky Grenades Reward" "1,1,1,1" + // This is the cooldown for a small ammo resupply wave that triggers whenever a survivor hurts any infected target. Any teammate within the small radius will receive 5% of their current primary gun's max ammo. + // Note: This setting can be used for standard Tanks. + // Note: This setting can be overridden for each Mutant Tank under the "Rewards" section of their settings. + // -- + // Separate cooldowns with commas (","). + // -- + // Cooldowns limit: 4 + // Character limit for each cooldown: 9 + // -- + // Minimum value for each cooldown: 0.0 (OFF) + // Maximum value for each cooldown: 99999.0 (Longest) + // -- + // 1st number = Cooldown for killers. + // 2nd number = Cooldown for assistants. + // 3rd number = Cooldown for teammates. + // 4th number = Cooldown for assistant killers. + "Supplier Reward" "3.0,3.0,3.0,3.0" + + // The melee swing rate to reward to survivors. + // Note: This setting can be used for standard Tanks. + // Note: This setting can be overridden for each Mutant Tank under the "Rewards" section of their settings. + // -- + // Separate rates with commas (","). + // -- + // Rates limit: 4 + // Character limit for each rate: 9 + // -- + // Minimum value for each rate: 0.0 (OFF) + // Maximum value for each rate: 99999.0 (Fastest) + // -- + // 1st number = Rate for killers. + // 2nd number = Rate for assistants. + // 3rd number = Rate for teammates. + // 4th number = Rate for assistant killers. + "Swing Rate Reward" "1.25,1.25,1.25,1.25" + // Allow healing teammates with bullets as a reward to survivors. // Note: This setting can be used for standard Tanks. // Note: This setting can be overridden for each Mutant Tank under the "Rewards" section of their settings. @@ -1941,10 +2781,10 @@ // Separate values with commas (","). // -- // Values limit: 4 - // Character limit for each value: 1 + // Character limit for each value: 7 // -- // Minimum value for each: 0 (OFF) - // Maximum value for each: 1 (ON) + // Maximum value for each: 1000000 (Highest) // -- // 1st number = Allow healing teammates with bullets to killers. // 2nd number = Allow healing teammates with bullets to assistants. @@ -2102,10 +2942,10 @@ // Note: This setting can be used for standard Tanks. // Note: This setting can be overridden for each Mutant Tank under the "Rewards" section of their settings. // -- - // Separate voicelines sets with commas (","). + // Separate voicelines with commas (","). // -- - // Item sets limit: 4 - // Character limit for each set: 64 + // Voiceline limit: 4 + // Character limit for each voiceline: 64 // -- // 1st set = Looping voiceline for killers. // 2nd set = Looping voiceline for assistants. @@ -2195,50 +3035,69 @@ "Share Rewards" "0,0,0,0" "Teammate Limit" "0" "Action Duration Reward" "2.0,2.0,2.0,2.0" + "Adrenaline Time Reward" "30.0,30.0,30.0,30.0" "Ammo Boost Reward" "1,1,1,1" + "Ammo Refill Reward" "1,1,1,1" "Ammo Regen Reward" "1,1,1,1" "Attack Boost Reward" "1.25,1.25,1.25,1.25" "Blaze Health Reward" "1,1,1,1" + "Blood Donor Reward" "0,0,0,0" "Bunny Hop Reward" "1,1,1,1" "Burst Doors Reward" "1,1,1,1" "Clean Kills Reward" "1,1,1,1" "Cluster Bombs Reward" "3,3,3,3" "Damage Boost Reward" "1.25,1.25,1.25,1.25" "Damage Resistance Reward" "0.5,0.5,0.5,0.5" + "Dopamine Radius Reward" "150.0,150.0,150.0,150.0" + "Eternal Flames Reward" "1,1,1,1" "Fall Voiceline Reward" "PlayerLaugh,PlayerLaugh,PlayerLaugh,PlayerLaugh" + "Fast Recovery Reward" "1,1,1,1" + "Fire Rate Reward" "1.25,1.25,1.25,1.25" "Friendly Fire Reward" "1,1,1,1" "Ghost Bullets Reward" "1,1,1,1" + "Grenade Launcher Reward" "10.0,10.0,10.0,10.0" "Heal Percent Reward" "100.0,100.0,100.0,100.0" + "Healthcare Radius Reward" "150.0,150.0,150.0,150.0" "Health Regen Reward" "1,1,1,1" - "Hollowpoint Ammo Reward" "1,1,1,1" - "Inextinguishable Fire Reward" "1,1,1,1" + "Heartbeat Reward" "3.0,3.0,3.0,3.0" + "Hollowpoint Ammo Reward" "100.0,100.0,100.0,100.0" "Infinite Ammo Reward" "31,31,31,31" "Item Reward" "first_aid_kit,first_aid_kit,first_aid_kit,first_aid_kit" "Jump Height Reward" "75.0,75.0,75.0,75.0" "Ladder Actions Reward" "1,1,1,1" - "Lady Killer Reward" "1,1,1,1" + "Lady Killer Reward" "25.0,25.0,25.0,25.0" "Laser Sight Reward" "1,1,1,1" "Life Leech Reward" "1,1,1,1" - "Medical Incisions Reward" "1,1,1,1" + "Lucky Bullet Reward" "25.0,25.0,25.0,25.0" + "Medical Cuts Reward" "1,1,1,1" "Melee Range Reward" "100,100,100,100" "Midair Dashes Reward" "2,2,2,2" + "Motivation Radius Reward" "150.0,150.0,150.0,150.0" + "Overdose Radius Reward" "150.0,150.0,150.0,150.0" + "Overhealth Reward" "200,200,200,200" "Pipebomb Duration Reward" "10.0,10.0,10.0,10.0" "Punch Resistance Reward" "0.25,0.25,0.25,0.25" "Rapid Pistol Reward" "0.130,0.130,0.130,0.130" "Recoil Dampener Reward" "1,1,1,1" "Refill Percent Reward" "100.0,100.0,100.0,100.0" "Regen Bursts Reward" "1,1,1,1" + "Reload Rate Reward" "1.25,1.25,1.25,1.25" "Respawn Loadout Reward" "1,1,1,1" "Revive Health Reward" "100,100,100,100" + "Riot Gear Reward" "1,1,1,1" + "Safety Bubble Reward" "1,1,1,1" + "Shockwave Radius Reward" "150.0,150.0,150.0,150.0" "Shove Damage Reward" "0.025,0.025,0.025,0.025" "Shove Penalty Reward" "1,1,1,1" "Shove Rate Reward" "0.7,0.7,0.7,0.7" - "Sledgehammer Rounds Reward" "1,1,1,1" + "Sledgehammer Rounds Reward" "100.0,100.0,100.0,100.0" "Special Ammo Reward" "1,1,1,1" "Speed Boost Reward" "1.25,1.25,1.25,1.25" "Stack Limits" "0,0,0,0,0,0,0,0" "Stack Rewards" "0,0,0,0" "Sticky Grenades Reward" "1,1,1,1" + "Supplier Reward" "3.0,3.0,3.0,3.0" + "Swing Rate Reward" "1.25,1.25,1.25,1.25" "Syringe Darts Reward" "1,1,1,1" "Thorns Reward" "1,1,1,1" "Useful Rewards" "15,15,15,15" @@ -2252,54 +3111,55 @@ "Voice Pitch Visual" "100,100,100,100" } } - "Competitive" + "Survivors" { - // (Co-Op modes only) Mutant Tanks should attack immediately after spawning. - // Note: Do not change this setting if you are unsure of how it works. - // Note: This setting can be used for standard Tanks. - // Note: This setting can be overridden for each Mutant Tank under the "Competitive" section of their settings. + // Human-controlled survivors can respawn as Mutant Survivors when they die. // -- - // 0/"disabled"/"false"/"off"/"no": OFF, let the game determine Mutant Tanks' initial behavior. - // 1/"enabled"/"true"/"on"/"yes": ON, force Mutant Tanks to attack immediately. - "Auto Aggravate" "1" + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Carrier Enabled" "0" - // Survivors will be credited when damaging Mutant Tanks with fire. - // Note: Do not change this setting if you are unsure of how it works. - // Note: This setting can be used for standard Tanks. + // Survivor bots can respawn as Mutant Survivors when they die. // -- // 0/"disabled"/"false"/"off"/"no": OFF // 1/"enabled"/"true"/"on"/"yes": ON - "Credit Igniters" "1" + "Carrier Bots" "0" - // (Co-Op modes only) Mutant Tanks in ghost mode will be forcefully spawned after this many seconds passes. - // Note: Do not change this setting if you are unsure of how it works. - // Note: This setting can be used for standard Tanks. + // The bodies of dead survivors will appear wherever Mutant Survivors die. // -- - // Minimum: 0.0 (OFF) - // Maximum: 99999.0 - "Force Spawn" "0.0" + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Carrier Body" "0" - // (Co-Op modes only) Mutant Tanks should prioritize throwing rocks. - // Note: Tanks only prioritize throwing rocks on Advanced and Expert modes by default. - // Note: Do not change this setting if you are unsure of how it works. - // Note: This setting can be used for standard Tanks. - // Note: This setting can be overridden for each Mutant Tank under the "Competitive" section of their settings. + // The chance for dead survivors to respawn as Mutant Survivors. // -- - // 0/"disabled"/"false"/"off"/"no": OFF, let the game determine Mutant Tanks' attack. - // 1/"enabled"/"true"/"on"/"yes": ON, force Mutant Tanks to prioritize throwing rocks. - "Prioritize Throws" "0" - - // The stasis mode of Mutant Tanks when spawning. - // Note: Do not change this setting if you are unsure of how it works. - // Note: This setting can be used for standard Tanks. + // Minimum: 0.0 (No chance) + // Maximum: 100.0 (Highest chance) // -- - // 0/"disabled"/"false"/"off"/"no": OFF, let the game determine Mutant Tanks' stasis mode. - // 1/"enabled"/"true"/"on"/"yes": ON, skip stasis mode and spawn Mutant Tanks right away. - "Stasis Mode" "0" - - // (Survival modes only) The delay in seconds before allowing Mutant Tanks to spawn. - // Note: The survival timer starts when the first panic event is triggered, which is the same method used by this setting to delay Mutant Tanks from spawning. - // Note: Do not change this setting if you are unsure of how it works. + // Keywords: + // "never" - 0% chance + // "sometimes"/"unlikely"/"seldom" - 33.3% chance + // "maybe" - 50% chance + // "often"/"likely"/"frequently" - 66.6% chance + // "always" - 100% chance + "Carrier Chance" "0.0" + + // Survivors can cleanse themselves with medkits to avoid respawning as Mutant Survivors when they die. + // -- + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Carrier Cleanse" "0" + + // The damage multiplier for Mutant Survivors. + // Note: Damage = Damage x Damage multiplier + // Example: Damage = 30.0 x 1.5 = 45.0 + // Note: Use the value "1.0" to disable this setting. (Damage x 1.0 = Damage) + // -- + // Minimum: 1.0 + // Maximum: 99999.0 + "Carrier Damage Multiplier" "0.0" + + // The delay in seconds before a dead survivor respawns into a Mutant Survivor. // -- // Minimum: 0.1 // Maximum: 99999.0 @@ -2309,4051 +3169,1110 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Survival Delay" "0.1" - } - "Difficulty" - { - // The damage scales to use for multiplying damage caused by Mutant Tanks. + "Carrier Delay" "0.0" + + // The filter for what Mutant Survivors can respawn as. // -- - // Separate scales with commas (","). + // Add up numbers together for different results. // -- - // Scale limit: 4 - // Character limit for each damage scale: 9 + // Minimum: 0 + // Maximum: 127 // -- - // Minimum: 0.0 (OFF) + // 0 OR 127: Pick randomly between the 7 options. + // 1: Tank + // 2: Smoker + // 4: Boomer + // 8: Hunter + // 16: Spitter (Switches to Boomer in Left 4 Dead 1.) + // 32: Jockey (Switches to Hunter in Left 4 Dead 1.) + // 64: Charger (Switches to Smoker in Left 4 Dead 1.) + "Carrier Filter" "0" + + // The health multiplier for Mutant Survivors. + // Note: Health = Health x Health multiplier + // Example: Health = 1000.0 x 5.0 = 5000.0 + // Note: Use the value "1.0" to disable this setting. (Health x 1.0 = Health) + // -- + // Minimum: 1.0 // Maximum: 99999.0 + "Carrier Health Multiplier" "0.0" + + // The type of infection that can infect Mutant Survivors. // -- - // 1st number = Damage scale for Easy difficulty. - // 2nd number = Damage scale for Normal difficulty. - // 3rd number = Damage scale for Advanced difficulty. - // 4th number = Damage scale for Expert difficulty. - "Difficulty Damage" "0.0,0.0,0.0,0.0" + // Add up numbers together for different results. + // -- + // Minimum: 0 + // Maximum: 511 + // -- + // 0 OR 511: All types of infection. + // 1: Common Infected + // 2: Smoker + // 4: Boomer + // 8: Hunter + // 16: Spitter (Switches to Boomer in Left 4 Dead 1.) + // 32: Jockey (Switches to Hunter in Left 4 Dead 1.) + // 64: Charger (Switches to Smoker in Left 4 Dead 1.) + // 128: Witch + // 256: Tank + "Carrier Infection" "0" - // Scale all custom damage caused by Mutant Tanks based on the current difficulty. + // Mutant Survivors can mix several mutant types. // -- // 0/"disabled"/"false"/"off"/"no": OFF // 1/"enabled"/"true"/"on"/"yes": ON - "Scale Damage" "0" - } - "Health" - { - // Base health given to all Mutant Tanks. - // Note: Tank's health limit on any difficulty is 1,000,000. - // Note: Disable this setting if it conflicts with other plugins. - // Note: Depending on the value of the "Multiply Health" setting, the Mutant Tank's health will be multiplied based on player count. - // Note: This setting can be used for standard Tanks. - // Note: This setting can be overridden for each Mutant Tank under the "Health" section of their settings. - // -- - // Minimum: 0 (OFF) - // Maximum: 1000000 - "Base Health" "0" + "Carrier Mix" "0" - // Display Mutant Tanks' names and health. - // Note: This setting can be used for standard Tanks. - // Note: This setting can be overridden for each Mutant Tank under the "Health" section of their settings. + // The mode of how the mutant type and infected type of every Mutant Survivor are determined. + // Note: The "Carrier Mix" setting can override the mutant types determined by this setting. // -- // Minimum: 0 - // Maximum: 11 + // Maximum: 6 // -- - // 0: OFF - // 1: ON, show name only. - // 2: ON, show health only. - // 3: ON, show health percentage only. - // 4: ON, show healthbar only. - // 5: ON, show name and health only. - // 6: ON, show name and health percentage only. - // 7: ON, show name and healthbar only. - // 8: ON, show health and healthbar only. - // 9: ON, show health percentage and healthbar only. - // 10: ON, show name, health, and healthbar. - // 11: ON, show name, health percentage, and healthbar. - "Display Health" "11" + // 0: The Mutant Survivor turns into a random special infected with a random mutant type. + // 1: The Mutant Survivor turns into the special infected set by the "Carrier Filter" setting and the mutant type set by the "Carrier Type" setting. + // 2: The Mutant Survivor turns into the first special infected that hurt the survivor and inherits its mutant type. + // 3: The Mutant Survivor turns into the last special infected that hurt the survivor and inherits its mutant type. + // 4: The Mutant Survivor turns into the special infected that hurt the survivor the least and inherits its mutant type. + // 5: The Mutant Survivor turns into the special infected that hurt the survivor the most and inherits its mutant type. + // 6: The Mutant Survivor turns into the special infected that killed the survivor and inherits its mutant type. + "Carrier Mode" "0" - // Display type of Mutant Tanks' names and health. - // Note: This setting can be used for standard Tanks. - // Note: This setting can be overridden for each Mutant Tank under the "Health" section of their settings. + // Teleport Mutant Survivors when they spawn to the same spot where they died. // -- - // 0: OFF - // 1: ON, show in hint text. - // 2: ON, show in center text. - "Display Health Type" "1" + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Carrier Teleport" "0" - // Extra health given to the Mutant Tank. - // Note: Tank's health limit on any difficulty is 1,000,000. - // Note: Disable this setting if it conflicts with other plugins. - // Note: Depending on the value of the "Multiply Health" setting, the Mutant Tank's health will be multiplied based on player count. - // Note: This setting can be used for standard Tanks. - // Note: This setting can be overridden for each Mutant Tank under the "Health" section of their settings. + // The type of Mutant Survivors for dead survivors to respawn as. // -- - // Minimum: -1000000 - // Maximum: 1000000 + // Separate values with "-". // -- - // Positive numbers: Current health + Extra health - // Negative numbers: Current health - Extra health - "Extra Health" "0" - - // The characters used to represent the health bar of Mutant Tanks. - // Note: This setting only takes effect when the "Display Health" setting is enabled. - // Note: This setting can be used for standard Tanks. - // Note: This setting can be overridden for each Mutant Tank under the "Health" section of their settings. + // Value limit: 2 + // Character limit for each value: 4 // -- - // Separate characters with commas (","). + // Minimum number for each value: 0 (OFF) + // Maximum number for each value: 500 // -- - // Character limit: 2 - // Character limit for each character: 1 + // 1st number = Minimum value + // 2nd number = Maximum value // -- - // 1st character = Health indicator - // 2nd character = Damage indicator - "Health Characters" "|,-" - - // The health of Mutant Tanks is multiplied by this value. - // Note: Health = Health x Health percentage multiplier - // Example: Health = 4000 x 2.5 = 10000 - // Note: Use the value "1.0" to disable this setting. (Health x 1.0 = Health) - // Note: This setting can be used for standard Tanks. - // Note: This setting can be overridden for each Mutant Tank under the "Health" section of their settings. + // Example: "0-0" (Do not choose from any Mutant Tank types.) + // Example: "1-25" (Choose a Mutant Tank type between 1 through 25.) + // Example: "50-0" (Automatically change to "0-0" because "50" is higher than "0".) + // Example: "1-1000" (Automatically change to "1-500" because "500" is the maximum number of Mutant Tank types allowed.) + // Example: "0" (Automatically change to "0-500" because the maximum range is not specified.) + // Example: "1000" (Automatically change to "500-500" because the maximum range is not specified and the minimum range exceeds the "500" limit.) // -- - // Minimum: 1.0 - // Maximum: 99999.0 - "Health Percentage Multiplier" "1.0" + // 0: OFF, use the randomization feature. + // 1-500: ON, the type of the Mutant Survivor. + "Carrier Type" "0-0" - // The mode of the "Minimum Humans" setting. - // Note: This setting can be used for standard Tanks. - // Note: This setting can be overridden for each Mutant Tank under the "Health" section of their settings. + // Enable random voicelines to play for Mutant Survivors. // -- - // 0: Use as a requirement and as a multiplier for multiplying the Tank's health. - // 1: Use as a requirement for multiplying the Tank's health. - "Human Multiplier Mode" "0" + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Carrier Voice" "0" - // The number of human survivors required for the "Multiply Health" setting to take effect. - // Note: This setting can be used for standard Tanks. - // Note: This setting can be overridden for each Mutant Tank under the "Health" section of their settings. + // The chance for Mutant Survivors to play random voicelines. // -- - // Minimum: 1 - // Maximum: 32 + // Minimum: 0.0 (No chance) + // Maximum: 100.0 (Highest chance) // -- - // 1: OFF, no health multiplication. (Health * 1) - // 2-32: ON, the number of human survivors required to multiply Tank health. (Health * X) - "Minimum Humans" "2" + // Keywords: + // "never" - 0% chance + // "sometimes"/"unlikely"/"seldom" - 33.3% chance + // "maybe" - 50% chance + // "often"/"likely"/"frequently" - 66.6% chance + // "always" - 100% chance + "Carrier Voice Chance" "0.0" - // Multiply Mutant Tanks' health. - // Note: Health multiplication only occurs when the requirement for the "Minimum Humans" setting is met. - // Note: This setting can be used for standard Tanks. - // Note: This setting can be overridden for each Mutant Tank under the "Health" section of their settings. + // Every Mutant Survivor can play a random voiceline every time this many seconds passes. // -- - // 0: No changes to health. - // 1: Multiply original health only. - // 2: Multiply extra health only. - // 3: Multiply both. - "Multiply Health" "0" - - "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" - { - // Note: Override any of the settings in the "Health" section for each special infected here. - - // Base health given to all Mutant Boomers. - // Note: Boomer's health limit on any difficulty is 1,000,000. - // Note: Disable this setting if it conflicts with other plugins. - // Note: Depending on the value of the "Multiply Health" setting, the Mutant Boomer's health will be multiplied based on player count. - // Note: This setting can be used for standard Boomers. - // Note: This setting can be overridden for each Mutant Boomer under the "Health" section of their settings. - // -- - // Minimum: 0 (OFF) - // Maximum: 1000000 - "Boomer Base Health" "0" - - // Extra health given to the Mutant Boomer. - // Note: Boomer's health limit on any difficulty is 1,000,000. - // Note: Disable this setting if it conflicts with other plugins. - // Note: Depending on the value of the "Multiply Health" setting, the Mutant Boomer's health will be multiplied based on player count. - // Note: This setting can be used for standard Boomers. - // Note: This setting can be overridden for each Mutant Boomer under the "Health" section of their settings. - // -- - // Minimum: -1000000 - // Maximum: 1000000 - // -- - // Positive numbers: Current health + Extra health - // Negative numbers: Current health - Extra health - "Boomer Extra Health" "0" - - // Base health given to all Mutant Chargers. - // Note: Charger's health limit on any difficulty is 1,000,000. - // Note: Disable this setting if it conflicts with other plugins. - // Note: Depending on the value of the "Multiply Health" setting, the Mutant Charger's health will be multiplied based on player count. - // Note: This setting can be used for standard Chargers. - // Note: This setting can be overridden for each Mutant Charger under the "Health" section of their settings. - // -- - // Minimum: 0 (OFF) - // Maximum: 1000000 - "Charger Base Health" "0" + // OFF: 0.0 + // Minimum: 0.1 + // Maximum: 99999.0 + // -- + // Keywords: + // "milli"/"millisecond" - 0.1 seconds + // "second" - 1 second + // "minute" - 1 minute + // "forever" - 99999 seconds + "Carrier Voice Interval" "0.0" - // Extra health given to the Mutant Charger. - // Note: Charger's health limit on any difficulty is 1,000,000. - // Note: Disable this setting if it conflicts with other plugins. - // Note: Depending on the value of the "Multiply Health" setting, the Mutant Charger's health will be multiplied based on player count. - // Note: This setting can be used for standard Chargers. - // Note: This setting can be overridden for each Mutant Charger under the "Health" section of their settings. - // -- - // Minimum: -1000000 - // Maximum: 1000000 - // -- - // Positive numbers: Current health + Extra health - // Negative numbers: Current health - Extra health - "Charger Extra Health" "0" + // The voicelines that randomly play for Mutant Survivors while they are attacking someone. + // -- + // Separate voicelines with commas (","). + // -- + // Voiceline limit: 20 + // Character limit for each voiceline: 64 + // -- + // Example: "namvet/laughter04.wav,namvet/laughter11.wav" + // Example: "gambler/battlecry04.wav,gambler/deathscream05.wav" + "Carrier Attack Voicelines" "" - // Base health given to all Mutant Hunters. - // Note: Hunter's health limit on any difficulty is 1,000,000. - // Note: Disable this setting if it conflicts with other plugins. - // Note: Depending on the value of the "Multiply Health" setting, the Mutant Hunter's health will be multiplied based on player count. - // Note: This setting can be used for standard Hunters. - // Note: This setting can be overridden for each Mutant Hunter under the "Health" section of their settings. - // -- - // Minimum: 0 (OFF) - // Maximum: 1000000 - "Hunter Base Health" "0" + // The voicelines that randomly play for Mutant Survivors while they are lurking around. + // -- + // Separate voicelines with commas (","). + // -- + // Voiceline limit: 20 + // Character limit for each voiceline: 64 + // -- + // Example: "teengirl/callforrescue02.wav,teengirl/callforrescue06.wav" + // Example: "mechanic/callforrescue01.wav,mechanic/callforrescue03.wav" + "Carrier Bait Voicelines" "" - // Extra health given to the Mutant Hunter. - // Note: Hunter's health limit on any difficulty is 1,000,000. - // Note: Disable this setting if it conflicts with other plugins. - // Note: Depending on the value of the "Multiply Health" setting, the Mutant Hunter's health will be multiplied based on player count. - // Note: This setting can be used for standard Hunters. - // Note: This setting can be overridden for each Mutant Hunter under the "Health" section of their settings. - // -- - // Minimum: -1000000 - // Maximum: 1000000 - // -- - // Positive numbers: Current health + Extra health - // Negative numbers: Current health - Extra health - "Hunter Extra Health" "0" - - // Base health given to all Mutant Jockeys. - // Note: Jockey's health limit on any difficulty is 1,000,000. - // Note: Disable this setting if it conflicts with other plugins. - // Note: Depending on the value of the "Multiply Health" setting, the Mutant Jockey's health will be multiplied based on player count. - // Note: This setting can be used for standard Jockeys. - // Note: This setting can be overridden for each Mutant Jockey under the "Health" section of their settings. - // -- - // Minimum: 0 (OFF) - // Maximum: 1000000 - "Jockey Base Health" "0" - - // Extra health given to the Mutant Jockey. - // Note: Jockey's health limit on any difficulty is 1,000,000. - // Note: Disable this setting if it conflicts with other plugins. - // Note: Depending on the value of the "Multiply Health" setting, the Mutant Jockey's health will be multiplied based on player count. - // Note: This setting can be used for standard Jockeys. - // Note: This setting can be overridden for each Mutant Jockey under the "Health" section of their settings. - // -- - // Minimum: -1000000 - // Maximum: 1000000 - // -- - // Positive numbers: Current health + Extra health - // Negative numbers: Current health - Extra health - "Jockey Extra Health" "0" - - // Base health given to all Mutant Smokers. - // Note: Smoker's health limit on any difficulty is 1,000,000. - // Note: Disable this setting if it conflicts with other plugins. - // Note: Depending on the value of the "Multiply Health" setting, the Mutant Smoker's health will be multiplied based on player count. - // Note: This setting can be used for standard Smokers. - // Note: This setting can be overridden for each Mutant Smoker under the "Health" section of their settings. - // -- - // Minimum: 0 (OFF) - // Maximum: 1000000 - "Smoker Base Health" "0" - - // Extra health given to the Mutant Smoker. - // Note: Smoker's health limit on any difficulty is 1,000,000. - // Note: Disable this setting if it conflicts with other plugins. - // Note: Depending on the value of the "Multiply Health" setting, the Mutant Smoker's health will be multiplied based on player count. - // Note: This setting can be used for standard Smokers. - // Note: This setting can be overridden for each Mutant Smoker under the "Health" section of their settings. - // -- - // Minimum: -1000000 - // Maximum: 1000000 - // -- - // Positive numbers: Current health + Extra health - // Negative numbers: Current health - Extra health - "Smoker Extra Health" "0" - - // Base health given to all Mutant Spitters. - // Note: Spitter's health limit on any difficulty is 1,000,000. - // Note: Disable this setting if it conflicts with other plugins. - // Note: Depending on the value of the "Multiply Health" setting, the Mutant Spitter's health will be multiplied based on player count. - // Note: This setting can be used for standard Spitters. - // Note: This setting can be overridden for each Mutant Spitter under the "Health" section of their settings. - // -- - // Minimum: 0 (OFF) - // Maximum: 1000000 - "Spitter Base Health" "0" - - // Extra health given to the Mutant Spitter. - // Note: Spitter's health limit on any difficulty is 1,000,000. - // Note: Disable this setting if it conflicts with other plugins. - // Note: Depending on the value of the "Multiply Health" setting, the Mutant Spitter's health will be multiplied based on player count. - // Note: This setting can be used for standard Spitters. - // Note: This setting can be overridden for each Mutant Spitter under the "Health" section of their settings. - // -- - // Minimum: -1000000 - // Maximum: 1000000 - // -- - // Positive numbers: Current health + Extra health - // Negative numbers: Current health - Extra health - "Spitter Extra Health" "0" - - // Example - "Boomer Base Health" "0" - "Charger Base Health" "0" - "Hunter Base Health" "0" - "Jockey Base Health" "0" - "Smoker Base Health" "0" - "Spitter Base Health" "0" - "Display Health" "11" - "Boomer Extra Health" "0" - "Charger Extra Health" "0" - "Hunter Extra Health" "0" - "Jockey Extra Health" "0" - "Smoker Extra Health" "0" - "Spitter Extra Health" "0" - "Display Health Type" "0" - "Health Characters" "|,-" - "Health Percentage Multiplier" "1.0" - "Human Multiplier Mode" "0" - "Minimum Humans" "2" - "Multiply Health" "0" - } - } - "Protection" - { - // The Mutant Tank will have spawn protection for a limited time. - // Note: Do not change this setting if you are unsure of how it works. - // Note: This setting can be used for standard Tanks. - // Note: This setting can be overridden for each Mutant Tank under the "Protection" section of their settings. - // -- - // 0: OFF - // 1: Spawn with a temporary shield. - // 2: Spawn with temporary armor. - // 3: Both - "Spawn Protection" "0" - - // The duration of the Mutant Tank's armor for spawn protection. - // Note: This setting can be used for standard Tanks. - // Note: This setting can be overridden for each Mutant Tank under the "Protection" section of their settings. - // -- - // Minimum: 0.1 - // Maximum: 99999.0 - // -- - // Keywords: - // "milli"/"millisecond" - 0.1 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Armor Duration" "3.0" - - // The Mutant Tank's armor blocks this percentage of incoming damage. - // Note: This setting can be used for standard Tanks. - // Note: This setting can be overridden for each Mutant Tank under the "Protection" section of their settings. - // -- - // Minimum: 0.0 (God mode) - // Maximum: 1.0 (None) - "Armor Resistance" "0.75" - - // The duration of the Mutant Tank's shield for spawn protection. - // Note: This setting can be used for standard Tanks. - // Note: This setting can be overridden for each Mutant Tank under the "Protection" section of their settings. - // -- - // Minimum: 0.1 - // Maximum: 99999.0 - // -- - // Keywords: - // "milli"/"millisecond" - 0.1 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Shield Duration" "1.0" - - // The Mutant Tank's shield blocks this percentage of incoming damage. - // Note: This setting can be used for standard Tanks. - // Note: This setting can be overridden for each Mutant Tank under the "Protection" section of their settings. - // -- - // Minimum: 0.0 (God mode) - // Maximum: 1.0 (None) - "Shield Resistance" "0.0" - - "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" - { - // Note: Override any of the settings in the "Protection" section for each special infected here. - - // Example - "Spawn Protection" "0" - "Armor Duration" "3.0" - "Armor Resistance" "0.75" - "Shield Duration" "1.0" - "Shield Resistance" "0.0" - } - } - "Enhancements" - { - // Every Mutant Tank can only attack every time this many seconds passes. - // Note: This setting can be used for standard Tanks. - // Note: This setting can be overridden for each Mutant Tank under the "Enhancements" section of their settings. - // -- - // OFF: 0.0 - // Minimum: 0.1 - // Maximum: 99999.0 - // -- - // Keywords: - // "milli"/"millisecond" - 0.1 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Attack Interval" "0.0" - - // Every Mutant Tank's claw attacks do this much damage. - // Note: This setting can be used for standard Tanks. - // Note: This setting can be overridden for each Mutant Tank under the "Enhancements" section of their settings. - // -- - // OFF: -1.0 - // Minimum: 0.0 - // Maximum: 99999.0 - // -- - // Keywords: - // "nodmg"/"friendly"/"harmless" - 0.0 damage - // "weakest" - 1.0 damage - // "strongest" - 99999.0 damage - "Claw Damage" "-1.0" - - // Every Mutant Tank's footsteps cause screen shakes for nearby survivors. - // Note: Both games already do this by default. - // Note: This setting can be used for standard Tanks. - // Note: This setting can be overridden for each Mutant Tank under the "Enhancements" section of their settings. - // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Footstep Shake" "0" - - // Every Mutant Tank's ground pounds hit all survivors within range. - // Note: Both games already do this by default in Survival modes. - // Note: This setting can be used for standard Tanks. - // Note: This setting can be overridden for each Mutant Tank under the "Enhancements" section of their settings. - // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Ground Pound" "0" - - // Every Mutant Tank's hittables do this much damage. - // Note: This setting can be used for standard Tanks. - // Note: This setting can be overridden for each Mutant Tank under the "Enhancements" section of their settings. - // -- - // OFF: -1.0 - // Minimum: 0.0 - // Maximum: 99999.0 - // -- - // Keywords: - // "nodmg"/"friendly"/"harmless" - 0.0 damage - // "weakest" - 1.0 damage - // "strongest" - 99999.0 damage - "Hittable Damage" "-1.0" - - // The damage received by incapacitated survivors from the Mutant Tank is multiplied by this value. - // Note: Damage = Damage x Incap damage multiplier - // Example: Damage = 30.0 x 1.5 = 45.0 - // Note: Use the value "1.0" to disable this setting. (Damage x 1.0 = Damage) - // Note: This setting can be used for standard Tanks. - // Note: This setting can be overridden for each Mutant Tank under the "Enhancements" section of their settings. - // -- - // Minimum: 1.0 - // Maximum: 99999.0 - "Incap Damage Multiplier" "1.0" - - // Every Mutant Tank becomes intangible while alive. - // Note: This setting can be used for standard Tanks. - // Note: This setting can be overridden for each Mutant Tank under the "Enhancements" section of their settings. - // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Intangible Body" "0" - - // The mode of how melee hits affect every Mutant Tank. - // Note: If set to "1" then the formula is Damage = Max health x Melee hit value - // Example: Damage = 5000.0 x 0.05 = 250.0 - // Note: If set to "2" then the formula is Damage = Melee hit value - // Example: Damage = 500.0 - // Note: This setting can be used for standard Tanks. - // Note: This setting can be overridden for each Mutant Tank under the "Enhancements" section of their settings. - // -- - // 0: OFF - // 1: ON, melee hits deal damage based on a percentage of the Mutant Tank's max health. - // 2: ON, melee hits deal damage based on a certain amount. - "Melee Hit Mode" "0" - - // The value of melee hits against every Mutant Tank. - // Note: The value of the "Melee Hit Mode" setting determines how the value of this setting is applied. - // Note: If "Melee Hit Mode" is set to "1" use values between "0.0" and "1.0". - // Example: 0.05 - // Note: If "Melee Hit Mode" is set to "2" use values between "0.0" and "99999.0". - // Example: 500.0 - // Note: This setting can be used for standard Tanks. - // Note: This setting can be overridden for each Mutant Tank under the "Enhancements" section of their settings. - // -- - // Minimum: 0.0 (OFF) - // Maximum: 99999.0 (Strongest) - "Melee Hit Value" "0.0" - - // Every Mutant Tank's punches have this much force. - // Note: This setting can be used for standard Tanks. - // Note: This setting can be overridden for each Mutant Tank under the "Enhancements" section of their settings. - // -- - // OFF: -1.0 - // Minimum: 0.0 - // Maximum: 99999.0 - // -- - // Keywords: - // "nodmg"/"friendly"/"harmless" - 0.0 force - // "weakest" - 1.0 force - // "strongest" - 99999.0 force - "Punch Force" "-1.0" - - // Every Mutant Tank has this many chances out of 100.0% to punch and throw a rock simultaneously. - // Note: This setting can be used for standard Tanks. - // Note: This setting can be overridden for each Mutant Tank under the "Enhancements" section of their settings. - // -- - // Minimum: 0.0 (No chance) - // Maximum: 100.0 (Highest chance) - // -- - // Keywords: - // "never" - 0% chance - // "sometimes"/"unlikely"/"seldom" - 33.3% chance - // "maybe" - 50% chance - // "often"/"likely"/"frequently" - 66.6% chance - // "always" - 100% chance - "Punch Throw" "0.0" - - // Every Mutant Tank's rock throws do this much damage. - // Note: This setting can be used for standard Tanks. - // Note: This setting can be overridden for each Mutant Tank under the "Enhancements" section of their settings. - // -- - // OFF: -1.0 - // Minimum: 0.0 - // Maximum: 99999.0 - // -- - // Keywords: - // "nodmg"/"friendly"/"harmless" - 0.0 damage - // "weakest" - 1.0 damage - // "strongest" - 99999.0 damage - "Rock Damage" "-1.0" - - // Every Mutant Tank's rock throws play a sound loop. - // Note: Both games already do this by default. - // Note: This setting can be used for standard Tanks. - // Note: This setting can be overridden for each Mutant Tank under the "Enhancements" section of their settings. - // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Rock Sound" "0" - - // Set every Mutant Tank's run speed. - // Note: Default run speed is 1.0. - // Note: This setting can be used for standard Tanks. - // Note: This setting can be overridden for each Mutant Tank under the "Enhancements" section of their settings. - // -- - // OFF: 0.0 - // Minimum: 0.1 - // Maximum: 99.0 - "Run Speed" "0.0" - - // Skip every Mutant Tank's dying animation. - // Note: This setting can be used for standard Tanks. - // Note: This setting can be overridden for each Mutant Tank under the "Enhancements" section of their settings. - // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Skip Incap" "0" - - // Skip every Mutant Tank's taunting animation after incapacitating survivors and when climbing. - // Note: This setting can be used for standard Tanks. - // Note: This setting can be overridden for each Mutant Tank under the "Enhancements" section of their settings. - // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Skip Taunt" "0" - - // Every Mutant Tank's punches hit all survivors within range. - // Note: Both games already do this by default in Versus and Survival modes. - // Note: This setting can be used for standard Tanks. - // Note: This setting can be overridden for each Mutant Tank under the "Enhancements" section of their settings. - // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Sweep Fist" "0" - - // Every Mutant Tank's rock throws have this much force. - // Note: Low values like "500.0" and high values like "5000.0" will cause rocks to miss by a huge margin. This is a game limitation, not a plugin issue. - // Note: The value "1000.0" has been tested to be a stable value for the Tank's rock throw force. - // Note: This setting can be used for standard Tanks. - // Note: This setting can be overridden for each Mutant Tank under the "Enhancements" section of their settings. - // -- - // OFF: -1.0 - // Minimum: 0.0 - // Maximum: 99999.0 - // -- - // Keywords: - // "nodmg"/"friendly"/"harmless" - 0.0 force - // "weakest" - 1.0 force - // "strongest" - 99999.0 force - "Throw Force" "-1.0" - - // Every Mutant Tank throws a rock every time this many seconds passes. - // Note: This setting can be used for standard Tanks. - // Note: This setting can be overridden for each Mutant Tank under the "Enhancements" section of their settings. - // -- - // OFF: 0.0 - // Minimum: 0.1 - // Maximum: 99999.0 - // -- - // Keywords: - // "milli"/"millisecond" - 0.1 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Throw Interval" "0.0" - - // Every Mutant Tank throws a rock when using its rock throw ability. - // Note: This just throws a second rock for every Tank. - // Note: This can disrupt the default ability or free the survivor victim of every Charger/Hunter/Jockey/Smoker. - // Note: Do not change this setting if you want to preserve the default abilities of every Charger/Hunter/Jockey/Smoker. - // Note: This setting can be used for standard Tanks. - // Note: This setting can be overridden for each Mutant Tank under the "Enhancements" section of their settings. - // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Throw Rock" "0" - - "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" - { - // Note: Override any of the settings in the "Enhancements" section for each special infected here. - - // Every Mutant Special Infected's pins (Smoker grab, Hunter pounce, Jockey ride, Charger impact) do this much damage. - // Note: This setting can be used for standard Special Infected. - // Note: This setting can be overridden for each Mutant Special Infected under the "Enhancements" section of their settings. - // -- - // OFF: -1.0 - // Minimum: 0.0 - // Maximum: 99999.0 - // -- - // Keywords: - // "nodmg"/"friendly"/"harmless" - 0.0 damage - // "weakest" - 1.0 damage - // "strongest" - 99999.0 damage - "Pin Damage" "-1.0" - - // Every Mutant Special Infected uses their special ability every time this many seconds passes. - // Note: This setting can be used for standard Special Infected. - // Note: This setting can be overridden for each Mutant Special Infected under the "Enhancements" section of their settings. - // -- - // OFF: 0.0 - // Minimum: 0.1 - // Maximum: 99999.0 - // -- - // Keywords: - // "milli"/"millisecond" - 0.1 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Special Interval" "0.0" - - // Example - "Attack Interval" "0.0" - "Claw Damage" "-1.0" - "Incap Damage Multiplier" "1.0" - "Intangible Body" "0" - "Melee Hit Mode" "0" - "Melee Hit Value" "0.0" - "Pin Damage" "-1.0" - "Run Speed" "0.0" - "Special Interval" "0.0" - "Throw Rock" "0" - } - } - "Immunities" - { - // Give Mutant Tanks bullet immunity. - // Note: This setting can be used for standard Tanks. - // Note: This setting can be overridden for each Mutant Tank under the "Immunities" section of their settings. - // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Bullet Immunity" "0" - - // Give Mutant Tanks explosive immunity. - // Note: This setting can be used for standard Tanks. - // Note: This setting can be overridden for each Mutant Tank under the "Immunities" section of their settings. - // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Explosive Immunity" "0" - - // Give Mutant Tanks fire immunity. - // Note: This setting can be used for standard Tanks. - // Note: This setting can be overridden for each Mutant Tank under the "Immunities" section of their settings. - // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Fire Immunity" "0" - - // Give Mutant Tanks hittable immunity. - // Note: This setting can be used for standard Tanks. - // Note: This setting can be overridden for each Mutant Tank under the "Immunities" section of their settings. - // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Hittable Immunity" "0" - - // Give Mutant Tanks melee immunity. - // Note: This setting can be used for standard Tanks. - // Note: This setting can be overridden for each Mutant Tank under the "Immunities" section of their settings. - // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Melee Immunity" "0" - - // Give Mutant Tanks vomit immunity. - // Note: This setting can be used for standard Tanks. - // Note: This setting can be overridden for each Mutant Tank under the "Immunities" section of their settings. - // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Vomit Immunity" "0" - - "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" - { - // Note: Override any of the settings in the "Immunities" section for each special infected here. - - // Example - "Bullet Immunity" "0" - "Explosive Immunity" "0" - "Fire Immunity" "0" - "Hittable Immunity" "0" - "Melee Immunity" "0" - "Vomit Immunity" "0" - } - } - "Administration" - { - // Admins with one or more of these access flags have access to all Mutant Tank types. - // Note: This setting can be overridden for each Mutant Tank under the "Administration" section of their settings. - // -- - // Empty: No access flags have access. - // Not empty: These access flags have access. - "Access Flags" "" - - // Admins with one or more of these immunity flags are immune to all Mutant Tanks' attacks. - // Note: This setting can be overridden for each Mutant Tank under the "Administration" section of their settings. - // -- - // Empty: No immunity flags are immune. - // Not empty: These immunity flags are immune. - "Immunity Flags" "" - } - "Human Support" - { - // Human-controlled Mutant Tanks must wait this long before changing their current Mutant Tank type. - // Note: Cooldowns are only valid for the current round that they are activated on. - // Note: Players with the "mt_adminversus" override will be immune to this cooldown. - // -- - // Minimum: 0 (OFF) - // Maximum: 99999 (Longest) - // -- - // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Human Cooldown" "600" - - // Human-controlled Mutant Tanks are exempted from cooldowns when using the "sm_mutanttank"/"sm_mtank" command to switch their current Mutant Tank type. - // Note: Do not change this setting if you are unsure of how it works. - // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Master Control" "0" - - // The mode of how human-controlled Tanks spawn. - // Note: Do not change this setting if you are unsure of how it works. - // -- - // 0: Spawn as a default Tank with access to the "sm_mutanttank"/"sm_mtank" command. - // 1: Spawn as a Mutant Tank with access to the "sm_mutanttank"/"sm_mtank" command. - // 2: Spawn as a Mutant Tank without access to the "sm_mutanttank"/"sm_mtank" command. - // 3: Same as 0, but the "sm_mutanttank"/"sm_mtank" command is available at anytime. - // 4: Same as 1, but the "sm_mutanttank"/"sm_mtank" command is available at anytime. - "Spawn Mode" "2" - } - "Waves" - { - // Limit Tank spawns according to Mutant Tanks' limits. - // Note: Set this setting to "0" for maps like Tank Challenge or Tanks Playground. - // Note: Do not change this setting if you are unsure of how it works. - // -- - // 0/"disabled"/"false"/"off"/"no": OFF, let the game, map, or other plugins determine the limit. - // 1/"enabled"/"true"/"on"/"yes": ON, let Mutant Tanks limit Tank spawns. - "Limit Extras" "1" - - // The delay in seconds before spawning an extra Tank. - // Note: Do not change this setting if you are unsure of how it works. - // -- - // Minimum: 0.1 - // Maximum: 99999.0 - // -- - // Keywords: - // "milli"/"millisecond" - 0.1 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Extras Delay" "0.1" - - // Spawn this many Tanks on non-finale maps periodically. - // Note: Leave this off if you have a Multi-Tanks plugin installed that handles the limit. - // -- - // Minimum: 0 - // Maximum: 32 - // -- - // 0: OFF, no limit (only one Tank will spawn). - // 1-32: ON, the number of Tanks that will spawn. - "Regular Amount" "0" - - // The delay in seconds before the regular wave spawner starts. - // Note: The delay starts after a survivor leaves the saferoom. - // -- - // Minimum: 0.1 - // Maximum: 99999.0 - // -- - // Keywords: - // "milli"/"millisecond" - 0.1 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Regular Delay" "10.0" - - // Spawn Tanks on non-finale maps every time this many seconds passes. - // Note: This will not work unless the "Regular Mode" setting is set to "1". - // Note: The timer for this interval will stop when there is at least one Tank alive on the map. - // Note: The timer for this interval will restart once every Tank on the map is dead. - // -- - // Minimum: 0.1 - // Maximum: 99999.0 - // -- - // Keywords: - // "milli"/"millisecond" - 0.1 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Regular Interval" "300.0" - - // How many waves of Tanks can spawn before the regular wave spawner stops. - // Note: All Tanks from a previous wave must die before more waves of Tanks can spawn. - // Note: This will not work unless the "Regular Mode" setting is set to "1". - // Note: Do not change this setting if you are unsure of how it works. - // -- - // 0: OFF - // 1-99999: Only allow this number of waves. - "Regular Limit" "99999" - - // The mode of the regular wave spawner. - // Note: This setting does not need the "Regular Wave" setting to be enabled. - // Note: Do not change this setting if you are unsure of how it works. - // -- - // 0: Wait for a Tank to spawn before spawning extra Tanks and use the global "Type Range" setting. (Recommended) - // 1: Use "Regular Wave" to spawn Tanks and use the "Regular Type" setting. - "Regular Mode" "0" - - // The type of Mutant Tank that will spawn. - // Note: This will not work unless the "Regular Mode" setting is set to "1". - // -- - // Separate values with "-". - // -- - // Value limit: 2 - // Character limit for each value: 4 - // -- - // Minimum number for each value: -1 (OFF) - // Maximum number for each value: 500 - // -- - // 1st number = Minimum value - // 2nd number = Maximum value - // -- - // Example: "0-0" (Do not choose from any Mutant Tank types.) - // Example: "1-25" (Choose a Mutant Tank type between 1 through 25.) - // Example: "50-0" (Automatically change to "0-0" because "50" is higher than "0".) - // Example: "1-1000" (Automatically change to "1-500" because "500" is the maximum number of Mutant Tank types allowed.) - // Example: "0" (Automatically change to "0-500" because the maximum range is not specified.) - // Example: "1000" (Automatically change to "500-500" because the maximum range is not specified and the minimum range exceeds the "500" limit.) - // -- - // 0: OFF, use standard Tanks. - // 1-500: ON, the type that will spawn. - "Regular Type" "1-500" - - // Spawn Tanks on non-finale maps periodically. - // Note: The timer starts after "Regular Delay" is up. - // Note: Leave this off if you want a generic spawn rate for Tanks or if you have a Multi-Tanks plugin installed. - // Note: This will not work unless the "Regular Mode" setting is set to "1". - // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Regular Wave" "0" - - // Allow this many Tanks on finale maps to spawn regardless of the current wave. - // Note: This is checked instead of "Finale Waves" if set to anything greater than 0. - // -- - // Minimum: 0 - // Maximum: 32 - // -- - // 0: OFF, no limit (no Tanks will be kicked by this setting). - // 1-32: ON, the number of Tanks that are allowed to spawn (unless the limit for "Finale Waves" is lower). - "Finale Amount" "0" - - // The mode of the finale wave spawner. - // Note: Do not change this setting if you are unsure of how it works. - // -- - // 0: Use the global "Type Range" setting. (Recommended) - // 1: Use the "Finale Types" setting. - "Finale Mode" "0" - - // The types of Mutant Tanks that can spawn in each wave. - // Note: If the chosen type is not available, a random type will be chosen in its place. - // -- - // Separate types per wave with commas (","). - // Separate values with "-". - // -- - // Wave limit: 11 - // Character limit for each wave: 10 - // -- - // Minimum value for each wave: -1 (OFF) - // Maximum value for each wave: 500 - // -- - // 1st number = Minimum value - // 2nd number = Maximum value - // -- - // Example: "0-0" (Do not choose from any Mutant Tank types.) - // Example: "1-25" (Choose a Mutant Tank type between 1 through 25.) - // Example: "50-0" (Automatically change to "0-0" because "50" is higher than "0".) - // Example: "1-1000" (Automatically change to "1-500" because "500" is the maximum number of Mutant Tank types allowed.) - // Example: "0" (Automatically change to "0-500" because the maximum range is not specified.) - // Example: "1000" (Automatically change to "500-500" because the maximum range is not specified and the minimum range exceeds the "500" limit.) - // -- - // 0: OFF, use standard Tanks. - // 1-500: ON, the type that will spawn. - "Finale Types" "1-500,1-500,1-500,1-500,1-500,1-500,1-500,1-500,1-500,1-500,1-500" - - // Number of Tanks to spawn for each finale wave. - // Note: This setting does not seem to work on the official Left 4 Dead 1 campaigns' finale maps in Left 4 Dead 2. They have their own finale scripts which limit the number of Tanks to 1 for each wave. - // Note: Use Silvers' "VScript File Replacer" plugin to raise the Tank limits on Left 4 Dead 1 campaign finale maps so this setting can work. - // Link: https://forums.alliedmods.net/showthread.php?t=318024 - // -- - // Separate waves with commas (","). - // -- - // Wave limit: 11 - // Character limit for each wave: 3 - // -- - // Minimum value for each wave: 1 - // Maximum value for each wave: 32 - // -- - // 1st number = 0th wave (Before finale event starts.) - // 2nd number = 1st wave - // 3rd number = 2nd wave - // 4th number = 3rd wave - // 5th number = 4th wave - // 6th number = 5th wave - // 7th number = 6th wave - // 8th number = 7th wave - // 9th number = 8th wave - // 10th number = 9th wave - // 11th number = 10th wave - // -- - // 0: OFF, no limit. - // 1-32: ON, the number of Tanks that will spawn. - "Finale Waves" "0,0,0,0,0,0,0,0,0,0,0" - } - "Rush" - { - // Enable Tank Rush mode. - // -- - // Add up numbers together for different results. - // -- - // Minimum: 0 - // Maximum: 127 - // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1: Tank Rush - Tanks only - // 2: Gas Chamber - Smokers only - // 4: Vomit Vault - Boomers only - // 8: Hunting Ground - Hunters only - // 16: Acid Rain - Spitters only (Only available in Left 4 Dead 2.) - // 32: Mental Asylum - Jockeys only (Only available in Left 4 Dead 2.) - // 64: Meat Grinder - Chargers only (Only available in Left 4 Dead 2.) - "Rush Types" "0" - - // The number of common infected that can be alive at any given time. - // -- - // Minimum: 0 (OFF) - // Maximum: 100 - "Common Limit" "0" - - // The delay in seconds before Tanks start spawning in co-op modes. - // Note: The delay starts after a survivor leaves the saferoom. - // -- - // Minimum: 0.1 - // Maximum: 99999.0 - // -- - // Keywords: - // "milli"/"millisecond" - 0.1 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Coop Delay" "60.0" - - // The time in seconds for resting periods during finales. - // -- - // Minimum: 0.1 - // Maximum: 99999.0 - // -- - // Keywords: - // "milli"/"millisecond" - 0.1 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Finale Cooldown" "30.0" - - // Enable hardcore mode. - // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Hardcore Mode" "0" - - // The survivors get healed after killing a Tank. - // -- - // 0: OFF - // 1: ON, heal all alive survivors. - // 2: ON, heal only the lowest health survivor. - "Health Kills" "2" - - // The time in seconds that Tanks have to kill survivors. - // -- - // Minimum: 0.1 - // Maximum: 99999.0 - // -- - // Keywords: - // "milli"/"millisecond" - 0.1 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Kill Countdown" "240.0" - - // The number of Tanks that can be alive at any given time. - // Note: Clones, respawned Mutant Tanks, randomized Tanks, and Mutant Tanks spawned through the Mutant Tanks menu are not affected. - // -- - // Minimum: 0 (OFF) - // Maximum: 32 - "Rush Limit" "10" - - // Spawn Tanks every time this many seconds passes. - // -- - // Minimum: 0.1 - // Maximum: 99999.0 - // -- - // Keywords: - // "milli"/"millisecond" - 0.1 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Spawn Interval" "6.0" - - // The number of times each survivor can be incapacitated before they become black and white. - // -- - // 0: OFF, use game default. - // 1-10: ON, the number of times each survivor can be incapacitated. - "Survivor Incaps" "4" - } - "ConVars" - { - // All convars (except the ones provided by Mutant Tanks) can be modified in this section. - // Each time the config file is read, the convars in this section will be modified with their associated values. - // This is a very powerful feature so use it as you would with your server.cfg/listenserver.cfg file. - // Here are some examples: - - // This will fail because the convar is provided by Mutant Tanks. - "mt_pluginenabled" "0" - - // It takes a total of 2 1/2 minutes for Tanks to burn to death. - "tank_burn_duration" "150" - - // Special infected's burnt skins can go up to 100% (completely toasted) instead of only 85% (game default). - "z_burn_max" "1.0" - - // This will work but will just be overridden by the "Base Health" and "Extra Health" settings. - "z_tank_health" "4000" - } - "Game Modes" - { - // Enable Mutant Tanks in these game mode types. - // Note: This setting has a convar equivalent (mt_gamemodetypes), which is only checked if this setting is set to "0". - // Note: This setting cannot be changed in custom config files. - // -- - // Add up numbers together for different results. - // -- - // Minimum: 0 - // Maximum: 15 - // -- - // 0 OR 15: All game mode types. - // 1: Co-Op modes only. - // 2: Versus modes only. - // 4: Survival modes only. - // 8: Scavenge modes only. (Only available in Left 4 Dead 2.) - "Game Mode Types" "0" - - // Enable Mutant Tanks in these game modes. - // Note: This setting has a convar equivalent (mt_enabledgamemodes), which is only checked if this setting is left empty. - // Note: This setting cannot be changed in custom config files. - // -- - // Separate game modes with commas (","). - // -- - // Character limit: 512 (including commas) - // -- - // Empty: All - // Not empty: Enabled only in these game modes. - "Enabled Game Modes" "" - - // Disable Mutant Tanks in these game modes. - // Note: This setting has a convar equivalent (mt_disabledgamemodes), which is only checked if this setting is left empty. - // Note: This setting cannot be changed in custom config files. - // -- - // Separate game modes with commas (","). - // -- - // Character limit: 512 (including commas) - // -- - // Empty: None - // Not empty: Disabled only in these game modes. - "Disabled Game Modes" "" - } - "Custom" - { - // Enable Mutant Tanks custom configuration. - // Note: This setting cannot be changed in custom config files. - // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Enable Custom Configs" "0" - - // The type of custom config that Mutant Tanks creates. - // Note: This setting cannot be changed in custom config files. - // -- - // Add up numbers together for different results. - // -- - // Minimum: 0 - // Maximum: 255 - // -- - // 0: OFF - // 1: Difficulties - // 2: Maps - // 4: Game modes - // 8: Days - // 16: Player count - // 32: Survivor count (Humans only) - // 64: Infected count (Humans only) - // 128: Finale stages - "Create Config Types" "0" - - // The delay in seconds for executing a custom config when its filestamp has changed. - // Note: Do not change this setting if you are unsure of how it works. - // Note: This setting cannot be changed in custom config files. - // -- - // Minimum: 0.1 - // Maximum: 99999.0 - // -- - // Keywords: - // "milli"/"millisecond" - 0.1 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Execute Config Delay" "5.0" - - // The type of custom config that Mutant Tanks executes. - // Note: Custom config files that do not exist will not be executed. - // Note: This setting cannot be changed in custom config files. - // -- - // Add up numbers together for different results. - // -- - // Minimum: 0 - // Maximum: 255 - // -- - // 0: OFF - // 1: Difficulties - // 2: Maps - // 4: Game modes - // 8: Days - // 16: Player count - // 32: Survivor count (Humans only) - // 64: Infected count (Humans only) - // 128: Finale stages - "Execute Config Types" "0" - } - } -} -``` -
- -### Tank Settings -
- Click to expand! - -``` -"Mutant Tanks" -{ - "Tank #1" - { - "General" - { - // Name of the Mutant Tank. - // Note: This name is only used for renaming the Mutant Tank in the server and checking which translation phrase to use. - // Note: For displaying this name in chat messages and other forms of text, use the translation file. - // Note: This setting can be overridden for specific players. - // -- - // Character limit: 32 - // -- - // Empty: "Tank" - // Not Empty: Tank's custom name - "Tank Name" "Tank #1" - - // Restrict the Mutant Tank to this game. - // Note: Do not change this setting if you are unsure of how it works. - // -- - // 0: OFF - // 1: Left 4 Dead 1 only. - // 2: Left 4 Dead 2 only. - "Game Type" "0" - - // Enable the Mutant Tank. - // Note: This setting determines full availability. Even if other spawn settings are enabled while this is disabled, the Mutant Tank will stay disabled. - // Note: This setting overrides the same setting under the "Plugin Settings/General" section. - // -- - // -1/"ignore"/"exclude"/"filter"/"remove": Let the setting with the same name from the "Plugin Settings/General" section decide. - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Tank Enabled" "-1" - - // The Mutant Tank has this many chances out of 100.0% to spawn. - // Note: Clones, respawned Mutant Tanks, randomized Tanks, and Mutant Tanks spawned through the Mutant Tanks menu are not affected. - // Note: If each enabled Mutant Tank has less than 100% chance of spawning, then every enabled Mutant Tank that has a 1% or higher chance of spawning will have an equal chance to spawn. - // Note: Do not change this setting if you are unsure of how it works. - // -- - // Minimum: 0.0 (No chance) - // Maximum: 100.0 (Highest chance) - // -- - // Keywords: - // "never" - 0% chance - // "sometimes"/"unlikely"/"seldom" - 33.3% chance - // "maybe" - 50% chance - // "often"/"likely"/"frequently" - 66.6% chance - // "always" - 100% chance - "Tank Chance" "100.0" - - // Display a note for the Mutant Tank when it spawns. - // Note: This note can also be displayed for clones if the "Clone Mode" setting is set to "1", so the chat could be spammed if multiple clones spawn. - // Note: A note must be manually created in the translation file (mutant_tanks_names.phrases.txt). - // Note: Tank notes support chat color tags in the translation file. - // Note: This setting can be overridden for specific players. - // -- - // -1/"ignore"/"exclude"/"filter"/"remove": Let the setting with the same name from each player-controlled Mutant Tank's "General" section decide. - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Tank Note" "0" - - // The Mutant Tank can spawn. - // Note: The Mutant Tank will still appear on the Mutant Tanks menu and other Mutant Tanks can still transform into the Mutant Tank. - // Note: Do not change this setting if you are unsure of how it works. - // Note: This setting overrides the same setting under the "Plugin Settings/General" section. - // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Spawn Enabled" "1" - - // The Mutant Tank can be spawned through the "sm_tank"/"sm_mt_tank" command. - // Note: Do not change this setting if you are unsure of how it works. - // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Menu Enabled" "1" - - // The plugin will automatically disable the Mutant Tank if none of its abilities are installed. - // Note: The abilities cache is only updated when configs are loaded/refreshed. - // Note: This setting does not disable the Mutant Tank if it does not have any abilities. - // Note: Do not change this setting if you are unsure of how it works. - // Note: This setting overrides the same setting under the "Plugin Settings/General" section. - // Note: This setting can be overridden for specific players. - // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Check Abilities" "0" - - // The Mutant Tank reverts back to default a Tank upon death. - // Note: This setting overrides the same setting under the "Plugin Settings/General" section. - // Note: This feature is simply for cosmetic purposes. - // You do not need to worry about this setting. - // Note: This setting can be overridden for specific players. - // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Death Revert" "0" - - // These are the RGBA values of the Mutant Tank's skin color. - // Note: Any value less than "0" will output a random color. - // Note: This setting can be overridden for specific players. - // -- - // 1st number = Red - // 2nd number = Green - // 3rd number = Blue - // 4th number = Alpha - // -- - // Keywords: - // "rainbow" - cycle through colors constantly. - "Skin Color" "255,255,255,255" - //"Skin Color" "all_tank_skins" // Alternative (See "Colors" section) - - // The Mutant Tank is only effective toward human survivors. - // Note: This setting overrides the same setting under the "Plugin Settings/General" section. - // -- - // Minimum: 0 - // Maximum: 32 - // -- - // 0: OFF - // 1-32: ON, the number of human survivors required to be present for this Mutant Tank to be effective. - "Requires Humans" "0" - - // The model used by the Mutant Tank. - // Note: This setting overrides the same setting under the "Plugin Settings/General" section. - // Note: This setting can be overridden for specific players. - // -- - // Add up numbers together for different results. - // -- - // Minimum: 0 - // Maximum: 7 - // -- - // 0: OFF (Let the game decide.) - // 1: Default model - // 2: The Sacrifice model - // 4: L4D1 model (Only available in Left 4 Dead 2.) - "Tank Model" "0" - - // The duration in seconds of the Mutant Tank's afterburn. - // Note: This setting overrides the same setting under the "Plugin Settings/General" section. - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0.0 (OFF) - // Maximum: 99999.0 - "Burn Duration" "0.0" - - // The burnt percentage of the Mutant Tank when it spawns. - // Note: This setting overrides the same setting under the "Plugin Settings/General" section. - // Note: This setting can be overridden for specific players. - // -- - // L4D1: The default maximum value is "1.0" for each type of special infected. - // L4D2: The default maximum value is different for each type of special infected. - // Smoker - 0.30 - // Boomer - 0.12 - // Hunter - 0.35 - // Spitter - 0.15 - // Jockey - 0.40 - // Charger - 0.40 - // Tank - 1.0 - // -- - // -1.0: OFF - // 0.0: Random - // 0.01-1.0: Burn percentage - "Burnt Skin" "-1.0" - - "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" - { - // Note: Override any of the settings in the "General" section for each special infected here. - - // Enable Mutant Special Infected types. - // Note: This setting determines full availability. Even if other spawn settings are enabled while this is disabled, the Mutant Special Infected type will stay disabled. - // Note: This setting overrides the same setting under the "Plugin Settings/General" section. - // -- - // Add up numbers together for different results. - // -- - // Minimum: -1 - // Maximum: 63 - // -- - // -1/"ignore"/"exclude"/"filter"/"remove": Let the setting with the same name from the "Plugin Settings/General" section decide. - // 0/"disabled"/"false"/"off"/"no": OFF - // 1: Enable Smokers. - // 2: Enable Boomers. - // 4: Enable Hunters. - // 8: Enable Spitters. (Only available in Left 4 Dead 2.) - // 16: Enable Jockeys. (Only available in Left 4 Dead 2.) - // 32: Enable Chargers. (Only available in Left 4 Dead 2.) - "Special Types" "-1" - - // Name of the Mutant Boomer. - // Note: This name is only used for renaming the Mutant Boomer in the server and checking which translation phrase to use. - // Note: For displaying this name in chat messages and other forms of text, use the translation file. - // Note: This setting can be overridden for specific players. - // -- - // Character limit: 32 - // -- - // Empty: "Boomer" - // Not Empty: Boomer's custom name - "Boomer Name" "Boomer #1" - - // Name of the Mutant Charger. - // Note: This name is only used for renaming the Mutant Charger in the server and checking which translation phrase to use. - // Note: For displaying this name in chat messages and other forms of text, use the translation file. - // Note: This setting can be overridden for specific players. - // -- - // Character limit: 32 - // -- - // Empty: "Charger" - // Not Empty: Charger's custom name - "Charger Name" "Charger #1" - - // Name of the Mutant Hunter. - // Note: This name is only used for renaming the Mutant Hunter in the server and checking which translation phrase to use. - // Note: For displaying this name in chat messages and other forms of text, use the translation file. - // Note: This setting can be overridden for specific players. - // -- - // Character limit: 32 - // -- - // Empty: "Hunter" - // Not Empty: Hunter's custom name - "Hunter Name" "Hunter #1" - - // Name of the Mutant Jockey. - // Note: This name is only used for renaming the Mutant Jockey in the server and checking which translation phrase to use. - // Note: For displaying this name in chat messages and other forms of text, use the translation file. - // Note: This setting can be overridden for specific players. - // -- - // Character limit: 32 - // -- - // Empty: "Jockey" - // Not Empty: Jockey's custom name - "Jockey Name" "Jockey #1" - - // Name of the Mutant Smoker. - // Note: This name is only used for renaming the Mutant Smoker in the server and checking which translation phrase to use. - // Note: For displaying this name in chat messages and other forms of text, use the translation file. - // Note: This setting can be overridden for specific players. - // -- - // Character limit: 32 - // -- - // Empty: "Smoker" - // Not Empty: Smoker's custom name - "Smoker Name" "Smoker #1" - - // Name of the Mutant Spitter. - // Note: This name is only used for renaming the Mutant Spitter in the server and checking which translation phrase to use. - // Note: For displaying this name in chat messages and other forms of text, use the translation file. - // Note: This setting can be overridden for specific players. - // -- - // Character limit: 32 - // -- - // Empty: "Spitter" - // Not Empty: Spitter's custom name - "Spitter Name" "Spitter #1" - - // The Mutant Special Infected has this many chances out of 100.0% to spawn. - // Note: Clones, respawned Mutant Special Infected, randomized Special Infected, and Mutant Special Infected spawned through the Mutant Special Infected menu are not affected. - // Note: If each enabled Mutant Special Infected has less than 100% chance of spawning, then every enabled Mutant Special Infected that has a 1% or higher chance of spawning will have an equal chance to spawn. - // Note: Do not change this setting if you are unsure of how it works. - // -- - // Minimum: 0.0 (No chance) - // Maximum: 100.0 (Highest chance) - // -- - // Keywords: - // "never" - 0% chance - // "sometimes"/"unlikely"/"seldom" - 33.3% chance - // "maybe" - 50% chance - // "often"/"likely"/"frequently" - 66.6% chance - // "always" - 100% chance - "Special Chance" "100.0" - - // Display a note for the Mutant Special Infected when it spawns. - // Note: This note can also be displayed for clones if the "Clone Mode" setting is set to "1", so the chat could be spammed if multiple clones spawn. - // Note: A note must be manually created in the translation file (mutant_tanks_names.phrases.txt). - // Note: Special Infected notes support chat color tags in the translation file. - // Note: This setting can be overridden for specific players. - // -- - // -1/"ignore"/"exclude"/"filter"/"remove": Let the setting with the same name from each player-controlled Mutant Special Infected's "General" section decide. - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Special Note" "0" - - // The model used by the Mutant Special Infected. - // Note: This setting only works for the Smoker, Boomer, and Hunter. - // Note: This setting overrides the same setting under the "Plugin Settings/General" section. - // Note: This setting can be overridden for specific players. - // -- - // Add up numbers together for different results. - // -- - // Minimum: 0 - // Maximum: 3 - // -- - // 0: OFF (Let the game decide.) - // 1: Default model - // 2: L4D1 model (Only available in Left 4 Dead 2.) - "Special Model" "0" - - // Example - "Game Type" "0" - "Special Types" "-1" - "Boomer Name" "Boomer #1" - "Charger Name" "Charger #1" - "Hunter Name" "Hunter #1" - "Jockey Name" "Jockey #1" - "Smoker Name" "Smoker #1" - "Spitter Name" "Spitter #1" - "Special Chance" "100.0" - "Special Note" "0" - "Spawn Enabled" "1" - "Menu Enabled" "1" - "Death Revert" "0" - "Skin Color" "255,255,255,255" - "Special Model" "0" - "Requires Humans" "0" - "Burn Duration" "0.0" - "Burnt Skin" "-1.0" - } - } - "Announcements" - { - // Announce the Mutant Tank's arrival. - // Note: This setting overrides the same setting under the "Plugin Settings/Announcements" section. - // Note: This setting can be overridden for specific players. - // -- - // Add up numbers together for different results. - // -- - // Minimum: -1 - // Maximum: 31 - // -- - // 0: OFF - // 1: Announce when the Mutant Tank spawns. - // 2: Announce when the Mutant Tank evolves. (Only works when "Spawn Type" is set to "1".) - // 4: Announce when the Mutant Tank randomizes. (Only works when "Spawn Type" is set to "2".) - // 8: Announce when the Mutant Tank transforms. (Only works when "Spawn Type" is set to "3".) - // 16: Announce when the Mutant Tank untransforms. (Only works when "Spawn Type" is set to "3".) - "Announce Arrival" "0" - - // Announce the Mutant Tank's death. - // Note: This setting overrides the same setting under the "Plugin Settings/Announcements" section. - // Note: This setting can be overridden for specific players. - // -- - // 0: OFF - // 1: ON, announce deaths only. - // 2: ON, announce deaths with killers. - "Announce Death" "0" - - // Announce the Mutant Tank's kill. - // Note: This setting overrides the same setting under the "Plugin Settings/Announcements" section. - // Note: This setting can be overridden for specific players. - // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Announce Kill" "0" - - // The message shown to players when the Mutant Tank arrives. - // Note: This setting only works for the first option of the "Announce Arrival" setting. - // Note: This setting overrides the same setting under the "Plugin Settings/Announcements" section. - // Note: This setting can be overridden for specific players. - // -- - // Add up numbers together for different results. - // -- - // Minimum: 0 - // Maximum: 1023 - // -- - // 0 OR 1023: Pick randomly between the 10 messages. - // 1: Message #1 - // 2: Message #2 - // 4: Message #3 - // 8: Message #4 - // 16: Message #5 - // 32: Message #6 - // 64: Message #7 - // 128: Message #8 - // 256: Message #9 - // 512: Message #10 - "Arrival Message" "0" - - // A sound is played to players when the Mutant Tank arrives. - // Note: This setting overrides the same setting under the "Plugin Settings/Announcements" section. - // Note: This setting can be overridden for specific players. - // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Arrival Sound" "1" - - // The details shown when announcing the Mutant Tank's death. - // Note: This setting overrides the same setting under the "Plugin Settings/Announcements" section. - // Note: This setting can be overridden for specific players. - // -- - // 0: Damage done to the Mutant Tank's health. - // 1: Percentage of damage done to the Mutant Tank's health. - // 2: Damage and percentage of damage done to the Mutant Tank's health. - // 3: Damage done to the Mutant Tank's health as a team. - // 4: Percentage of damage done to the Mutant Tank's health as a team. - // 5: Damage and percentage of damage done to the Mutant Tank's health as a team. - "Death Details" "5" - - // The message shown to players when the Mutant Tank dies. - // Note: This setting overrides the same setting under the "Plugin Settings/Announcements" section. - // Note: This setting can be overridden for specific players. - // -- - // Add up numbers together for different results. - // -- - // Minimum: 0 - // Maximum: 1023 - // -- - // 0 OR 1023: Pick randomly between the 10 messages. - // 1: Message #1 - // 2: Message #2 - // 4: Message #3 - // 8: Message #4 - // 16: Message #5 - // 32: Message #6 - // 64: Message #7 - // 128: Message #8 - // 256: Message #9 - // 512: Message #10 - "Death Message" "0" - - // A sound is played to players when the Mutant Tank dies. - // Note: This setting overrides the same setting under the "Plugin Settings/Announcements" section. - // Note: This setting can be overridden for specific players. - // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Death Sound" "1" - - // The message shown to players when the Mutant Tank kills a survivor. - // Note: This setting overrides the same setting under the "Plugin Settings/Announcements" section. - // Note: This setting can be overridden for specific players. - // -- - // Add up numbers together for different results. - // -- - // Minimum: 0 - // Maximum: 1023 - // -- - // 0 OR 1023: Pick randomly between the 10 messages. - // 1: Message #1 - // 2: Message #2 - // 4: Message #3 - // 8: Message #4 - // 16: Message #5 - // 32: Message #6 - // 64: Message #7 - // 128: Message #8 - // 256: Message #9 - // 512: Message #10 - "Kill Message" "0" - - // All alive survivors vocalize when the Mutant Tank arrives. - // Note: This setting overrides the same setting under the "Plugin Settings/Announcements" section. - // Note: This setting can be overridden for specific players. - // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Vocalize Arrival" "1" - - // All alive survivors vocalize when the Mutant Tank dies. - // Note: This setting overrides the same setting under the "Plugin Settings/Announcements" section. - // Note: This setting can be overridden for specific players. - // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Vocalize Death" "1" - - "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" - { - // Note: Override any of the settings in the "Announcements" section for each special infected here. - - // Example - "Announce Arrival" "0" - "Announce Death" "0" - "Announce Kill" "0" - "Arrival Message" "0" - "Arrival Sound" "1" - "Death Details" "5" - "Death Message" "0" - "Death Sound" "1" - "Kill Message" "0" - "Vocalize Arrival" "1" - "Vocalize Death" "1" - } - } - "Rewards" - { - // Reward survivors for fighting the Mutant Tank. - // Note: Some rewards may require Lux's "WeaponHandling_API" plugin. - // Link: https://forums.alliedmods.net/showthread.php?t=319947 - // Note: Some rewards may require patches from the "mutant_tanks_patches.cfg" config file to work. - // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. - // Note: This setting can be overridden for specific players. - // -- - // Separate values with commas (","). - // -- - // Add up numbers together for different results. - // -- - // Minimum value for each: -1 - // Maximum value for each: 2147483647 - // -- - // -1: OFF - // 0: Random - // 1: Health reward (temporary) - // - Refill to 100% health. - // - Automatically kill any current special infected attacker. - // - Heal back to 100% health with first aid kits. - // - Receive 100% temporary health after being revived. - // - Slowly regenerate back to full health. - // - Leech health off of any infected per melee hit. - // - Turn damage into health from self-made fires. - // - Turn damage into health from self-made explosions. - // - Heal teammates with bullets. - // - Heal teammates with melee hits. - // 2: Speed boost reward (temporary) - // - Run faster - // - Jump higher (Disables the death fall camera for recipients.) - // - Receive the adrenaline effect for the duration of the reward. (Only available in Left 4 Dead 2.) - // - Bunny hop consistently - // - Burst open doors - // - Throw sticky grenades that slow down special infected and mitigate their abilities. - // 4: Damage boost reward (temporary) - // - Laser sight - // - Inextinguishable fire - // - Extended pipebomb duration - // - Prevent dealing and receiving friendly-fire. - // - Extra damage - // - Bypass Tank immunities - // - Damage resistance - // - Automatically kill Witches. - // - Ghost bullets - // - Hollowpoint ammo - // - Extended melee range - // - Recoil dampener - // - Sledgehammer rounds - // - Protected by thorns (deal damage towards attacker per hit taken) - // 8: Attack boost reward (temporary) - // - Prevent slowing down when attacked by infected. - // - Prevent infected attacks from offsetting aim. - // - Prevent interruption when performing actions. - // - Prevent switching to secondary slot when equipping a secondary pistol. - // - Prevent switching to throwables and health supplies given by teammates. - // - Perform actions on ladders. - // - Bypass shove penalty. - // - Shoving damages Tanks. - // - Faster shove interval - // - Faster fire rate (guns) - // - Faster reload rate (guns) - // - Faster swing rate (melee) - // - Faster throw time (throwables) - // - Faster revive time - // - Faster healing time (first aid kit) - // - Faster defib time (defibrillator) - // - Faster deploy time (ammo upgrade packs) - // - Faster pour time (gas cans) - // - Faster delivery time (cola bottles) - // - Faster recovery time - // - Rapid-fire pistols - // 16: Ammo reward (temporary) - // - Refill clip to max size - // - Refill magazine to max size - // - Extra clip and magazine size - // - Receive one of the special ammo types (incendiary or explosive). (Only available in Left 4 Dead 2.) - // - Slowly regenerate back to full capacity. - // - Throw multiple pipe bombs at once (cluster bombs). - // 32: Item reward - // - Receive up to five items. - // 64: God mode reward (temporary) - // - Automatically prevent attacks from and kill all special infected attackers. - // - Immune to all types of damage. - // - Cannot be nudged by teammates. - // - Cannot be flung away by Chargers. - // - Cannot be pushed around. - // - Cannot be vomited on by Boomers. - // - Reduced pushback from Tank punches - // - Reduced pushback from hitting Tanks with melee immunity. - // - Get clean kills (blocks Smoker clouds, Boomer explosions, and Spitter acid puddles) - // 128: Health and ammo refill reward - // - Refill to 100% health. - // - Automatically kill any current special infected attacker. - // - Refill clip to max size - // - Refill magazine to max size - // 256: Respawn reward - // - Respawn and teleport to a teammate. - // - Restore previous loadout - // 512: Infinite ammo reward (temporary) - // - Infinite ammo for primary weapons - // - Infinite ammo for secondary weapons - // - Infinite ammo for throwables - // - Infinite ammo for medkits/defibs/ammo packs - // - Infinite ammo for pills/adrenaline - // 1023: All above rewards - // 1024-2147483647: Reserved for third-party plugins - // -- - // 1st number = Enable rewards for killers. - // 2nd number = Enable rewards for assistants. - // 3rd number = Enable rewards for teammates. - // 4th number = Enable rewards for assistant killers. - "Reward Enabled" "-1,-1,-1,-1" - - // Reward survivor bots for fighting the Mutant Tank. - // Note: Some rewards may require Lux's "WeaponHandling_API" plugin. - // Link: https://forums.alliedmods.net/showthread.php?t=319947 - // Note: Some rewards may require patches from the "mutant_tanks_patches.cfg" config file to work. - // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. - // Note: This setting can be overridden for specific players. - // -- - // Separate values with commas (","). - // -- - // Add up numbers together for different results. - // -- - // Minimum value for each: -1 - // Maximum value for each: 2147483647 - // -- - // -1: OFF - // 0: Random - // 1: Health reward (temporary) - // - Refill to 100% health. - // - Automatically kill any current special infected attacker. - // - Heal back to 100% health with first aid kits. - // - Receive 100% temporary health after being revived. - // - Slowly regenerate back to full health. - // - Leech health off of any infected per melee hit. - // - Turn damage into health from self-made fires. - // - Turn damage into health from self-made explosions. - // - Heal teammates with bullets. - // - Heal teammates with melee hits. - // 2: Speed boost reward (temporary) - // - Run faster - // - Jump higher (Disables the death fall camera for recipients.) - // - Receive the adrenaline effect for the duration of the reward. (Only available in Left 4 Dead 2.) - // - Bunny hop consistently - // - Burst open doors - // - Throw sticky grenades that slow down special infected and mitigate their abilities. - // 4: Damage boost reward (temporary) - // - Laser sight - // - Inextinguishable fire - // - Extended pipebomb duration - // - Prevent dealing and receiving friendly-fire. - // - Extra damage - // - Bypass Tank immunities - // - Damage resistance - // - Automatically kill Witches. - // - Ghost bullets - // - Hollowpoint ammo - // - Extended melee range - // - Recoil dampener - // - Sledgehammer rounds - // - Protected by thorns (deal damage towards attacker per hit taken) - // 8: Attack boost reward (temporary) - // - Prevent slowing down when attacked by infected. - // - Prevent infected attacks from offsetting aim. - // - Prevent interruption when performing actions. - // - Prevent switching to secondary slot when equipping a secondary pistol. - // - Prevent switching to throwables and health supplies given by teammates. - // - Perform actions on ladders. - // - Bypass shove penalty. - // - Shoving damages Tanks. - // - Faster shove interval - // - Faster fire rate (guns) - // - Faster reload rate (guns) - // - Faster swing rate (melee) - // - Faster throw time (throwables) - // - Faster revive time - // - Faster healing time (first aid kit) - // - Faster defib time (defibrillator) - // - Faster deploy time (ammo upgrade packs) - // - Faster pour time (gas cans) - // - Faster delivery time (cola bottles) - // - Faster recovery time - // - Rapid-fire pistols - // 16: Ammo reward (temporary) - // - Refill clip to max size - // - Refill magazine to max size - // - Extra clip and magazine size - // - Receive one of the special ammo types (incendiary or explosive). (Only available in Left 4 Dead 2.) - // - Slowly regenerate back to full capacity. - // - Throw multiple pipe bombs at once (cluster bombs). - // 32: Item reward - // - Receive up to five items. - // 64: God mode reward (temporary) - // - Automatically prevent attacks from and kill all special infected attackers. - // - Immune to all types of damage. - // - Cannot be nudged by teammates. - // - Cannot be flung away by Chargers. - // - Cannot be pushed around. - // - Cannot be vomited on by Boomers. - // - Reduced pushback from Tank punches - // - Reduced pushback from hitting Tanks with melee immunity. - // - Get clean kills (blocks Smoker clouds, Boomer explosions, and Spitter acid puddles) - // 128: Health and ammo refill reward - // - Refill to 100% health. - // - Automatically kill any current special infected attacker. - // - Refill clip to max size - // - Refill magazine to max size - // 256: Respawn reward - // - Respawn and teleport to a teammate. - // - Restore previous loadout - // 512: Infinite ammo reward (temporary) - // - Infinite ammo for primary weapons - // - Infinite ammo for secondary weapons - // - Infinite ammo for throwables - // - Infinite ammo for medkits/defibs/ammo packs - // - Infinite ammo for pills/adrenaline - // 1023: All above rewards - // 1024-2147483647: Reserved for third-party plugins - // -- - // 1st number = Enable rewards for killers. - // 2nd number = Enable rewards for assistants. - // 3rd number = Enable rewards for teammates. - // 4th number = Enable rewards for assistant killers. - "Reward Bots" "-1,-1,-1,-1" - - // The chance to reward survivors for killing the Mutant Tank. - // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. - // Note: This setting can be overridden for specific players. - // -- - // Separate chances with commas (","). - // -- - // Chances limit: 4 - // Character limit for each chance: 6 - // -- - // Minimum value for each chance: 0.0 (No chance) - // Maximum value for each chance: 100.0 (Highest chance) - // -- - // 1st number = Chance to reward killers. - // 2nd number = Chance to reward assistants. - // 3rd number = Chance to reward teammates. - // 4th number = Chance to reward assistant killers. - "Reward Chance" "0.0,0.0,0.0,0.0" - - // The duration of temporary rewards. - // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. - // Note: This setting can be overridden for specific players. - // -- - // Separate durations with commas (","). - // -- - // Durations limit: 4 - // Character limit for each duration: 9 - // -- - // Minimum value for each duration: 0.1 (Shortest) - // Maximum value for each duration: 99999.0 (Longest) - // -- - // 1st number = Duration for killer rewards. - // 2nd number = Duration for assistant rewards. - // 3rd number = Duration for teammate rewards. - // 4th number = Duration for assistant killers. - "Reward Duration" "0.0,0.0,0.0,0.0" - - // The effects displayed when rewarding survivors. - // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. - // Note: This setting can be overridden for specific players. - // -- - // Separate values with commas (","). - // -- - // Add up numbers together for different results. - // -- - // Minimum value for each: 0 - // Maximum value for each: 15 - // -- - // 0: OFF - // 1: Trophy - // 2: Fireworks particles - // 4: Sound effect - // 8: Thirdperson view (Recommended: ThirdPersonShoulder_Detect) [Link: https://forums.alliedmods.net/showthread.php?t=298649] - // -- - // 1st number = Effect for killers. - // 2nd number = Effect for assistants. - // 3rd number = Effect for teammates. - // 4th number = Effect for assistant killers. - "Reward Effect" "0,0,0,0" - - // Notify survivors when they receive a reward from the Mutant Tank. - // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. - // Note: This setting can be overridden for specific players. - // -- - // Separate values with commas (","). - // -- - // Values limit: 4 - // Character limit for each value: 1 - // -- - // Add up numbers together for different results. - // -- - // Minimum value for each: 0 - // Maximum value for each: 3 - // -- - // 0: OFF - // 1: When survivors solo the Mutant Tank or do not do enough damage to the Mutant Tank. - // 2: When survivors receive a reward. - // -- - // 1st number = Notify killers. - // 2nd number = Notify assistants. - // 3rd number = Notify teammates. - // 4th number = Notify assistant killers. - "Reward Notify" "0,0,0,0" - - // The minimum amount of damage in percentage required to receive a reward. - // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. - // Note: This setting can be overridden for specific players. - // -- - // Separate percentages with commas (","). - // -- - // Percentages limit: 4 - // Character limit for each percentage: 6 - // -- - // Minimum value for each percentage: 0.1 (Least) - // Maximum value for each percentage: 100.0 (All) - // -- - // 1st number = Percentage of damage required for killer rewards. - // 2nd number = Percentage of damage required for assistant rewards. - // 3rd number = Percentage of damage required for teammate rewards. - // 4th number = Percentage of damage required for assistant killers. - "Reward Percentage" "0.0,0.0,0.0,0.0" - - // The visual effects displayed for rewards. - // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. - // Note: This setting can be overridden for specific players. - // -- - // Separate values with commas (","). - // -- - // Add up numbers together for different results. - // -- - // Minimum value for each: 0 - // Maximum value for each: 127 - // -- - // 0: OFF - // 1: Screen color - // 2: Particle effect - // 4: Looping voiceline - // 8: Voice pitch - // 16: Light color - // 32: Body color - // 64: Glow outline (Only available in Left 4 Dead 2.) - // -- - // 1st number = Visual effect for killers. - // 2nd number = Visual effect for assistants. - // 3rd number = Visual effect for teammates. - // 4th number = Visual effect for assistant killers. - "Reward Visual" "0,0,0,0" - - // Enable the "sm_mt_prefs" command and notify players about it. - // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. - // Note: This setting can be overridden for specific players. - // -- - // Separate values with commas (","). - // -- - // Values limit: 4 - // Character limit for each value: 1 - // -- - // Minimum value for each: 0 (OFF) - // Maximum value for each: 1 (ON) - // -- - // 1st number = Notify and enable command for killers. - // 2nd number = Notify and enable command for assistants. - // 3rd number = Notify and enable command for teammates. - // 4th number = Notify and enable command for assistant killers. - "Prefs Notify" "0,0,0,0" - - // Allow players to share their rewards with teammates when they have reached the stack limits. - // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. - // Note: This setting can be overridden for specific players. - // -- - // Separate values with commas (","). - // -- - // Values limit: 4 - // Character limit for each value: 1 - // -- - // Minimum value for each: 0 - // Maximum value for each: 3 - // -- - // 0: OFF, let players keep their rewards. - // 1: ON, allow players to share their rewards with only human-controlled teammates. - // 2: ON, allow players to share their rewards with only bot teammates. - // 3: ON, allow players to share their rewards with all teammates. - // -- - // 1st number = Allow killers to share. - // 2nd number = Allow assistants to share. - // 3rd number = Allow teammates to share. - // 4th number = Allow assistant killers to share. - "Share Rewards" "0,0,0,0" - - // The total number of teammates to reward for assisting against the Mutant Tank. - // Note: This setting excludes killers and most assists. - // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0 - // Maximum: 32 - // -- - // 0: OFF, no limit (reward as many applicable recipients as possible). - // 1-32: ON, the total number of assistants to reward. - "Teammate Limit" "0" - - // The action duration to reward to survivors. - // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. - // Note: This setting can be overridden for specific players. - // -- - // Separate durations with commas (","). - // -- - // Durations limit: 4 - // Character limit for each duration: 9 - // -- - // Minimum value for each duration: 0.0 (OFF) - // Maximum value for each duration: 99999.0 (Slowest) - // -- - // 1st number = Duration for killers. - // 2nd number = Duration for assistants. - // 3rd number = Duration for teammates. - // 4th number = Duration for assistant killers. - "Action Duration Reward" "0.0,0.0,0.0,0.0" - - // Give ammo boost as a reward to survivors. - // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. - // Note: This setting can be overridden for specific players. - // -- - // Separate values with commas (","). - // -- - // Values limit: 4 - // Character limit for each value: 1 - // -- - // Minimum value for each: 0 (OFF) - // Maximum value for each: 1 (ON) - // -- - // 1st number = Give ammo boost to killers. - // 2nd number = Give ammo boost to assistants. - // 3rd number = Give ammo boost to teammates. - // 4th number = Give ammo boost to assistant killers. - "Ammo Boost Reward" "0,0,0,0" - - // The amount of ammo to regenerate per second as a reward to survivors. - // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. - // Note: This setting can be overridden for specific players. - // -- - // Separate amounts with commas (","). - // -- - // Amounts limit: 4 - // Character limit for each amount: 6 - // -- - // Minimum value for each amount: 0 (OFF) - // Maximum value for each amount: 99999 (Highest) - // -- - // 1st number = Amount for killers. - // 2nd number = Amount for assistants. - // 3rd number = Amount for teammates. - // 4th number = Amount for assistant killers. - "Ammo Regen Reward" "0,0,0,0" - - // The attack boost to reward to survivors. - // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. - // Note: This setting can be overridden for specific players. - // -- - // Separate boosts with commas (","). - // -- - // Boosts limit: 4 - // Character limit for each boost: 9 - // -- - // Minimum value for each boost: 0.0 (OFF) - // Maximum value for each boost: 99999.0 (Fastest) - // -- - // 1st number = Boost for killers. - // 2nd number = Boost for assistants. - // 3rd number = Boost for teammates. - // 4th number = Boost for assistant killers. - "Attack Boost Reward" "0.0,0.0,0.0,0.0" - - // Allow healing from self-made fires as a reward to survivors. - // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. - // Note: This setting can be overridden for specific players. - // -- - // Separate values with commas (","). - // -- - // Values limit: 4 - // Character limit for each value: 1 - // -- - // Minimum value for each: 0 (OFF) - // Maximum value for each: 1 (ON) - // -- - // 1st number = Allow healing from self-made fires to killers. - // 2nd number = Allow healing from self-made fires to assistants. - // 3rd number = Allow healing from self-made fires to teammates. - // 4th number = Allow healing from self-made fires to assistant killers. - "Blaze Health Reward" "0,0,0,0" - - // Allow bunnyhopping as a reward to survivors. - // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. - // Note: This setting can be overridden for specific players. - // -- - // Separate values with commas (","). - // -- - // Values limit: 4 - // Character limit for each value: 1 - // -- - // Minimum value for each: 0 (OFF) - // Maximum value for each: 1 (ON) - // -- - // 1st number = Allow bunnyhopping to killers. - // 2nd number = Allow bunnyhopping to assistants. - // 3rd number = Allow bunnyhopping to teammates. - // 4th number = Allow bunnyhopping to assistant killers. - "Bunny Hop Reward" "0,0,0,0" - - // Allow survivors to burst open doors when running. - // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. - // Note: This setting can be overridden for specific players. - // -- - // Separate values with commas (","). - // -- - // Values limit: 4 - // Character limit for each value: 1 - // -- - // Minimum value for each: 0 (OFF) - // Maximum value for each: 1 (ON) - // -- - // 1st number = Burst open doors for killers. - // 2nd number = Burst open doors for assistants. - // 3rd number = Burst open doors for teammates. - // 4th number = Burst open doors for assistant killers. - "Burst Doors Reward" "1,1,1,1" - - // Give clean kills (no Smoker clouds, Boomer explosions, and Spitter acide puddles) as a reward to survivors. - // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. - // Note: This setting can be overridden for specific players. - // -- - // Separate values with commas (","). - // -- - // Values limit: 4 - // Character limit for each value: 1 - // -- - // Minimum value for each: 0 (OFF) - // Maximum value for each: 1 (ON) - // -- - // 1st number = Give clean kills to killers. - // 2nd number = Give clean kills to assistants. - // 3rd number = Give clean kills to teammates. - // 4th number = Give clean kills to assistant killers. - "Clean Kills Reward" "0,0,0,0" - - // Allow survivors to throw cluster bombs (multiple pipe bombs) as a reward. - // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. - // Note: This setting can be overridden for specific players. - // -- - // Separate values with commas (","). - // -- - // Values limit: 4 - // Character limit for each value: 6 - // -- - // Minimum value for each: 0 (OFF) - // Maximum value for each: 5 (Highest) - // -- - // 1st number = Number of clustered pipe bombs to give to killers. - // 2nd number = Number of clustered pipe bombs to give to assistants. - // 3rd number = Number of clustered pipe bombs to give to teammates. - // 4th number = Number of clustered pipe bombs to give to assistant killers. - "Cluster Bombs Reward" "0,0,0,0" - - // The damage boost to reward to survivors. - // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. - // Note: This setting can be overridden for specific players. - // -- - // Separate boosts with commas (","). - // -- - // Boosts limit: 4 - // Character limit for each boost: 9 - // -- - // Minimum value for each boost: 0.0 (OFF) - // Maximum value for each boost: 99999.0 (Strongest) - // -- - // 1st number = Boost for killers. - // 2nd number = Boost for assistants. - // 3rd number = Boost for teammates. - // 4th number = Boost for assistant killers. - "Damage Boost Reward" "0.0,0.0,0.0,0.0" - - // The damage resistance to reward to survivors. - // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. - // Note: This setting can be overridden for specific players. - // -- - // Separate resistances with commas (","). - // -- - // Resistances limit: 4 - // Character limit for each resistance: 9 - // -- - // Minimum value for each resistance: 0.0 (OFF) - // Maximum value for each resistance: 1.0 (None) - // -- - // 1st number = Resistance for killers. - // 2nd number = Resistance for assistants. - // 3rd number = Resistance for teammates. - // 4th number = Resistance for assistant killers. - "Damage Resistance Reward" "0.0,0.0,0.0,0.0" - - // The voiceline that plays when survivors are falling. - // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. - // Note: This setting can be overridden for specific players. - // -- - // Separate voicelines sets with commas (","). - // -- - // Item sets limit: 4 - // Character limit for each set: 64 - // -- - // 1st set = Fall voiceline for killers. - // 2nd set = Fall voiceline for assistants. - // 3rd set = Fall voiceline for teammates. - // 4th set = Fall voiceline for assistant killers. - "Fall Voiceline Reward" "" - - // Give friendly-fire immunity as a reward to survivors. - // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. - // Note: This setting can be overridden for specific players. - // -- - // Separate values with commas (","). - // -- - // Values limit: 4 - // Character limit for each value: 1 - // -- - // Minimum value for each: 0 (OFF) - // Maximum value for each: 1 (ON) - // -- - // 1st number = Give immunity to killers. - // 2nd number = Give immunity to assistants. - // 3rd number = Give immunity to teammates. - // 4th number = Give immunity to assistant killers. - "Friendly Fire Reward" "0,0,0,0" - - // Give ghost bullets as a reward to survivors. - // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. - // Note: This setting can be overridden for specific players. - // -- - // Separate values with commas (","). - // -- - // Values limit: 4 - // Character limit for each value: 1 - // -- - // Minimum value for each: 0 (OFF) - // Maximum value for each: 1 (ON) - // -- - // 1st number = Give ghost bullets to killers. - // 2nd number = Give ghost bullets to assistants. - // 3rd number = Give ghost bullets to teammates. - // 4th number = Give ghost bullets to assistant killers. - "Ghost Bullets Reward" "0,0,0,0" - - // The healing percentage from first aid kits to reward to survivors. - // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. - // Note: This setting can be overridden for specific players. - // -- - // Separate percentages with commas (","). - // -- - // Percentages limit: 4 - // Character limit for each percentage: 6 - // -- - // Minimum percentage for each: 0.0 (OFF) - // Maximum percentage for each: 100.0 (Highest) - // -- - // 1st number = Heal percentage for killers. - // 2nd number = Heal percentage for assistants. - // 3rd number = Heal percentage for teammates. - // 4th number = Heal percentage for assistant killers. - "Heal Percent Reward" "0.0,0.0,0.0,0.0" - - // The amount of health to regenerate per second as a reward to survivors. - // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. - // Note: This setting can be overridden for specific players. - // -- - // Separate amounts with commas (","). - // -- - // Amounts limit: 4 - // Character limit for each amount: 7 - // -- - // Minimum value for each amount: 0 (OFF) - // Maximum value for each amount: 1000000 (Highest) - // -- - // 1st number = Amount for killers. - // 2nd number = Amount for assistants. - // 3rd number = Amount for teammates. - // 4th number = Amount for assistant killers. - "Health Regen Reward" "0,0,0,0" - - // Give hollowpoint ammo as a reward to survivors. - // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. - // Note: This setting can be overridden for specific players. - // -- - // Separate values with commas (","). - // -- - // Values limit: 4 - // Character limit for each value: 1 - // -- - // Minimum value for each: 0 (OFF) - // Maximum value for each: 1 (ON) - // -- - // 1st number = Give hollowpoint ammo to killers. - // 2nd number = Give hollowpoint ammo to assistants. - // 3rd number = Give hollowpoint ammo to teammates. - // 4th number = Give hollowpoint ammo to assistant killers. - "Hollowpoint Ammo Reward" "0,0,0,0" - - // Give inextinguishable fire as a reward to survivors. - // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. - // Note: This setting can be overridden for specific players. - // -- - // Separate values with commas (","). - // -- - // Values limit: 4 - // Character limit for each value: 1 - // -- - // Minimum value for each: 0 (OFF) - // Maximum value for each: 1 (ON) - // -- - // 1st number = Give inextinguishable fire to killers. - // 2nd number = Give inextinguishable fire to assistants. - // 3rd number = Give inextinguishable fire to teammates. - // 4th number = Give inextinguishable fire to assistant killers. - "Inextinguishable Fire Reward" "0,0,0,0" - - // Give infinite ammo as a reward to survivors. - // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. - // Note: This setting can be overridden for specific players. - // -- - // Separate values with commas (","). - // -- - // Add up numbers together for different results. - // -- - // Minimum value for each: 0 - // Maximum value for each: 31 - // -- - // 0: OFF - // 1: Infinite ammo for primary weapons - // 2: Infinite ammo for secondary weapons - // 4: Infinite ammo for throwables - // 8: Infinite ammo for medkits/defibs/ammo packs - // 16: Infinite ammo for pills/adrenaline - // -- - // 1st number = Give infinite ammo to killers. - // 2nd number = Give infinite ammo to assistants. - // 3rd number = Give infinite ammo to teammates. - // 4th number = Give infinite ammo to assistant killers. - "Infinite Ammo Reward" "0,0,0,0" - - // The item(s) to reward to survivors. - // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. - // Note: This setting can be overridden for specific players. - // -- - // Separate item sets with commas (","). - // Separate items with semi-colons (";"). - // -- - // Item sets limit: 4 - // Character limit for each set: 320 - // -- - // 1st set = Item set to reward killers. - // 2nd set = Item set to reward assistants. - // 3rd set = Item set to reward teammates. - // 4th set = Item set to reward assistant killers. - "Item Reward" "" - - // The jump height to reward to survivors. - // Note: Any value above "150.0" may cause instant death from fall damage. - // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. - // Note: This setting can be overridden for specific players. - // -- - // Separate heights with commas (","). - // -- - // Heights limit: 4 - // Character limit for each height: 9 - // -- - // Minimum value for each height: 0.0 (OFF) - // Maximum value for each height: 99999.0 (Highest) - // -- - // 1st number = Height for killers. - // 2nd number = Height for assistants. - // 3rd number = Height for teammates. - // 4th number = Height for assistant killers. - "Jump Height Reward" "0.0,0.0,0.0,0.0" - - // Allow survivors to perform actions while on ladders. - // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. - // Note: This setting can be overridden for specific players. - // -- - // Separate values with commas (","). - // -- - // Values limit: 4 - // Character limit for each value: 1 - // -- - // Minimum value for each: 0 (OFF) - // Maximum value for each: 1 (ON) - // -- - // 1st number = Allow actions for killers. - // 2nd number = Allow actions for assistants. - // 3rd number = Allow actions for teammates. - // 4th number = Allow actions for assistant killers. - "Ladder Actions Reward" "0,0,0,0" - - // Allow a number of Witches to be instantly killed as a reward to survivors. - // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. - // Note: This setting can be overridden for specific players. - // -- - // Separate values with commas (","). - // -- - // Values limit: 4 - // Character limit for each value: 1 - // -- - // Minimum value for each: 0 (OFF) - // Maximum value for each: 99999 (Highest) - // -- - // 1st number = Number of bullets to give to killers. - // 2nd number = Number of bullets to give to assistants. - // 3rd number = Number of bullets to give to teammates. - // 4th number = Number of bullets to give to assistant killers. - "Lady Killer Reward" "0,0,0,0" - - // Give laser sight as a reward to survivors. - // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. - // Note: This setting can be overridden for specific players. - // -- - // Separate values with commas (","). - // -- - // Values limit: 4 - // Character limit for each value: 1 - // -- - // Minimum value for each: 0 (OFF) - // Maximum value for each: 1 (ON) - // -- - // 1st number = Give laser sight to killers. - // 2nd number = Give laser sight to assistants. - // 3rd number = Give laser sight to teammates. - // 4th number = Give laser sight to assistant killers. - "Laser Sight Reward" "0,0,0,0" - - // The amount of health to leech per hit as a reward to survivors. - // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. - // Note: This setting can be overridden for specific players. - // -- - // Separate amounts with commas (","). - // -- - // Amounts limit: 4 - // Character limit for each amount: 7 - // -- - // Minimum value for each amount: 0 (OFF) - // Maximum value for each amount: 1000000 (Highest) - // -- - // 1st number = Amount for killers. - // 2nd number = Amount for assistants. - // 3rd number = Amount for teammates. - // 4th number = Amount for assistant killers. - "Life Leech Reward" "0,0,0,0" - - // Allow healing teammates with melee hits as a reward to survivors. - // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. - // Note: This setting can be overridden for specific players. - // -- - // Separate values with commas (","). - // -- - // Values limit: 4 - // Character limit for each value: 1 - // -- - // Minimum value for each: 0 (OFF) - // Maximum value for each: 1 (ON) - // -- - // 1st number = Allow healing teammates with melee hits to killers. - // 2nd number = Allow healing teammates with melee hits to assistants. - // 3rd number = Allow healing teammates with melee hits to teammates. - // 4th number = Allow healing teammates with melee hits to assistant killers. - "Medical Incisions Reward" "0,0,0,0" - - // The melee range to reward to survivors. - // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. - // Note: This setting can be overridden for specific players. - // -- - // Separate ranges with commas (","). - // -- - // Ranges limit: 4 - // Character limit for each range: 6 - // -- - // Minimum value for each range: 0 (OFF) - // Maximum value for each range: 99999 (Highest) - // -- - // 1st number = Range for killers. - // 2nd number = Range for assistants. - // 3rd number = Range for teammates. - // 4th number = Range for assistant killers. - "Melee Range Reward" "0,0,0,0" - - // Allow survivors to perform a number of midair dashes (extra jumps) as a reward. - // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. - // Note: This setting can be overridden for specific players. - // -- - // Separate values with commas (","). - // -- - // Values limit: 4 - // Character limit for each value: 6 - // -- - // Minimum value for each: 0 (OFF) - // Maximum value for each: 99999 (Highest) - // -- - // 1st number = Number of dashes (jumps) to give to killers. - // 2nd number = Number of dashes (jumps) to give to assistants. - // 3rd number = Number of dashes (jumps) to give to teammates. - // 4th number = Number of dashes (jumps) to give to assistant killers. - "Midair Dashes Reward" "0,0,0,0" - - // The pipebomb duration to reward to survivors. - // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. - // Note: This setting can be overridden for specific players. - // -- - // Separate durations with commas (","). - // -- - // Durations limit: 4 - // Character limit for each duration: 9 - // -- - // Minimum value for each duration: 0.0 (OFF) - // Maximum value for each duration: 99999.0 (Longest) - // -- - // 1st number = Duration for killers. - // 2nd number = Duration for assistants. - // 3rd number = Duration for teammates. - // 4th number = Duration for assistant killers. - "Pipebomb Duration Reward" "0.0,0.0,0.0,0.0" - - // The punch resistance to reward to survivors. - // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. - // Note: This setting can be overridden for specific players. - // -- - // Separate resistances with commas (","). - // -- - // Resistances limit: 4 - // Character limit for each resistance: 6 - // -- - // Minimum value for each resistance: 0.0 (OFF) - // Maximum value for each resistance: 1.0 (None) - // -- - // 1st number = Resistance for killers. - // 2nd number = Resistance for assistants. - // 3rd number = Resistance for teammates. - // 4th number = Resistance for assistant killers. - "Punch Resistance Reward" "0.0,0.0,0.0,0.0" - - // The rapid pistol fire rate to reward to survivors. - // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. - // Note: This setting can be overridden for specific players. - // -- - // Separate resistances with commas (","). - // -- - // Resistances limit: 4 - // Character limit for each fire rate: 6 - // -- - // Minimum value for each resistance: 0.0 (OFF) - // Maximum value for each resistance: 1.0 (None) - // -- - // 1st number = Rapid pistol fire rate for killers. - // 2nd number = Rapid pistol fire rate for assistants. - // 3rd number = Rapid pistol fire rate for teammates. - // 4th number = Rapid pistol fire rate for assistant killers. - "Rapid Pistol Reward" "0.0,0.0,0.0,0.0" - - // Give recoil dampener as a reward to survivors. - // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. - // Note: This setting can be overridden for specific players. - // -- - // Separate values with commas (","). - // -- - // Values limit: 4 - // Character limit for each value: 1 - // -- - // Minimum value for each: 0 (OFF) - // Maximum value for each: 1 (ON) - // -- - // 1st number = Give recoil dampener to killers. - // 2nd number = Give recoil dampener to assistants. - // 3rd number = Give recoil dampener to teammates. - // 4th number = Give recoil dampener to assistant killers. - "Recoil Dampener Reward" "0,0,0,0" - - // The refill percentage from the "Health" and "Refill" rewards. - // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. - // Note: This setting can be overridden for specific players. - // -- - // Separate percentages with commas (","). - // -- - // Percentages limit: 4 - // Character limit for each percentage: 6 - // -- - // Minimum percentage for each: 0.0 (OFF) - // Maximum percentage for each: 100.0 (Highest) - // -- - // 1st number = Heal percentage for killers. - // 2nd number = Heal percentage for assistants. - // 3rd number = Heal percentage for teammates. - // 4th number = Heal percentage for assistant killers. - "Refill Percent Reward" "0.0,0.0,0.0,0.0" - - // Allow healing from self-made explosions as a reward to survivors. - // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. - // Note: This setting can be overridden for specific players. - // -- - // Separate values with commas (","). - // -- - // Values limit: 4 - // Character limit for each value: 1 - // -- - // Minimum value for each: 0 (OFF) - // Maximum value for each: 1 (ON) - // -- - // 1st number = Allow healing from self-made explosions to killers. - // 2nd number = Allow healing from self-made explosions to assistants. - // 3rd number = Allow healing from self-made explosions to teammates. - // 4th number = Allow healing from self-made explosions to assistant killers. - "Regen Bursts Reward" "0,0,0,0" - - // Restore the previous loadouts of survivors after respawning them. - // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. - // Note: This setting can be overridden for specific players. - // -- - // Separate values with commas (","). - // -- - // Values limit: 4 - // Character limit for each value: 1 - // -- - // Minimum value for each: 0 (OFF) - // Maximum value for each: 1 (ON) - // -- - // 1st number = Restore loadouts for killers. - // 2nd number = Restore loadouts for assistants. - // 3rd number = Restore loadouts for teammates. - // 4th number = Restore loadouts for assistant killers. - "Respawn Loadout Reward" "0,0,0,0" - - // The revive health to reward to survivors. - // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. - // Note: This setting can be overridden for specific players. - // -- - // Separate values with commas (","). - // -- - // Values limit: 4 - // Character limit for each value: 7 - // -- - // Minimum value for each: 0 (OFF) - // Maximum value for each: 1000000 (Highest) - // -- - // 1st number = Health for killers. - // 2nd number = Health for assistants. - // 3rd number = Health for teammates. - // 4th number = Health for assistant killers. - "Revive Health Reward" "0,0,0,0" - - // The shove damage multiplier against Chargers, Witches, and Tanks to reward to survivors. - // Note: The max health of the target will be multiplied by this setting's value. - // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. - // Note: This setting can be overridden for specific players. - // -- - // Separate multipliers with commas (","). - // -- - // Multipliers limit: 4 - // Character limit for each multiplier: 9 - // -- - // Minimum value for each multiplier: 0.0 (OFF) - // Maximum value for each multiplier: 99999.0 (Strongest) - // -- - // 1st number = Multiplier for killers. - // 2nd number = Multiplier for assistants. - // 3rd number = Multiplier for teammates. - // 4th number = Multiplier for assistant killers. - // -- - // Example: 600 (default Charger health) * 0.025 (shove damage reward) = 15 damage per shove - "Shove Damage Reward" "0.0,0.0,0.0,0.0" - - // Remove shove penalty as a reward to survivors. - // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. - // Note: This setting can be overridden for specific players. - // -- - // Separate values with commas (","). - // -- - // Values limit: 4 - // Character limit for each value: 1 - // -- - // Minimum value for each: 0 (OFF) - // Maximum value for each: 1 (ON) - // -- - // 1st number = Remove shove penalty for killers. - // 2nd number = Remove shove penalty for assistants. - // 3rd number = Remove shove penalty for teammates. - // 4th number = Remove shove penalty for assistant killers. - "Shove Penalty Reward" "0,0,0,0" - - // The shove rate to reward to survivors. - // Note: The value of "z_gun_swing_interval" will be multiplied by this setting's value. - // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. - // Note: This setting can be overridden for specific players. - // -- - // Separate rates with commas (","). - // -- - // Rates limit: 4 - // Character limit for each rate: 9 - // -- - // Minimum value for each rate: 0.0 (OFF) - // Maximum value for each rate: 99999.0 (Slowest) - // -- - // 1st number = Rate for killers. - // 2nd number = Rate for assistants. - // 3rd number = Rate for teammates. - // 4th number = Rate for assistant killers. - // -- - // Example: 0.7 (default "z_gun_swing_interval" value) * 0.7 (shove rate reward) = 0.49 rate - "Shove Rate Reward" "0.0,0.0,0.0,0.0" - - // Give sledgehammer rounds as a reward to survivors. - // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. - // Note: This setting can be overridden for specific players. - // -- - // Separate values with commas (","). - // -- - // Values limit: 4 - // Character limit for each value: 1 - // -- - // Minimum value for each: 0 (OFF) - // Maximum value for each: 1 (ON) - // -- - // 1st number = Give sledgehammer rounds to killers. - // 2nd number = Give sledgehammer rounds to assistants. - // 3rd number = Give sledgehammer rounds to teammates. - // 4th number = Give sledgehammer rounds to assistant killers. - "Sledgehammer Rounds Reward" "0,0,0,0" - - // Give special ammo as a reward to survivors. - // Note: Only available in Left 4 Dead 2. - // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. - // Note: This setting can be overridden for specific players. - // -- - // Separate values with commas (","). - // -- - // Values limit: 4 - // Character limit for each value: 1 - // -- - // Minimum value for each: 0 - // Maximum value for each: 3 - // -- - // 0: OFF - // 1: Incendiary ammo - // 2: Explosive ammo - // 4: Random - // -- - // 1st number = Give special ammo to killers. - // 2nd number = Give special ammo to assistants. - // 3rd number = Give special ammo to teammates. - // 4th number = Give special ammo to assistant killers. - "Special Ammo Reward" "0,0,0,0" - - // The speed boost to reward to survivors. - // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. - // Note: This setting can be overridden for specific players. - // -- - // Separate boosts with commas (","). - // -- - // Boosts limit: 4 - // Character limit for each boost: 9 - // -- - // Minimum value for each boost: 0.0 (OFF) - // Maximum value for each boost: 99999.0 (Fastest) - // -- - // 1st number = Boost for killers. - // 2nd number = Boost for assistants. - // 3rd number = Boost for teammates. - // 4th number = Boost for assistant killers. - "Speed Boost Reward" "0.0,0.0,0.0,0.0" - - // How many times each reward can be stacked for each recipient. - // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. - // Note: This setting can be overridden for specific players. - // -- - // Separate limits with commas (","). - // -- - // Limits limit: 7 - // Character limit for each limit: 6 - // -- - // Minimum value for each limit: 0 (No limit) - // Maximum value for each limit: 99999 (Highest limit) - // -- - // 1st number = Health reward stack limit. - // 2nd number = Speed boost reward stack limit. - // 3rd number = Damage boost reward stack limit. - // 4th number = Attack boost reward stack limit. - // 5th number = Ammo reward stack limit. - // 6th number = God mode reward stack limit. - // 7th number = Refill stack limit. - // 8th number = Infinite ammo reward stack limit. - "Stack Limits" "0,0,0,0,0,0,0,0" - - // Allow rewards from the Mutant Tank to be stacked. - // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. - // Note: This setting can be overridden for specific players. - // -- - // Separate values with commas (","). - // -- - // Add up numbers together for different results. - // -- - // Minimum value for each: 0 - // Maximum value for each: 2147483647 - // -- - // 0: OFF - // 1: Health reward - // 2: Speed boost reward - // 4: Damage boost reward - // 8: Attack boost reward - // 16: Ammo reward - // 32: Item reward (Currently unused) - // 64: God mode reward - // 128: Health and ammo refill reward (Currently unused) - // 256: Respawn reward (Currently unused) - // 512: Infinite ammo reward - // 1023: All above rewards - // 1024-2147483647: Reserved for third-party plugins - // -- - // 1st number = Stack rewards for killers. - // 2nd number = Stack rewards for assistants. - // 3rd number = Stack rewards for teammates. - // 4th number = Stack rewards for assistant killers. - "Stack Rewards" "0,0,0,0" - - // Give sticky grenades as a reward to survivors. - // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. - // Note: This setting can be overridden for specific players. - // -- - // Separate values with commas (","). - // -- - // Values limit: 4 - // Character limit for each value: 1 - // -- - // Minimum value for each: 0 (OFF) - // Maximum value for each: 1 (ON) - // -- - // 1st number = Give sticky grenades to killers. - // 2nd number = Give sticky grenades to assistants. - // 3rd number = Give sticky grenades to teammates. - // 4th number = Give sticky grenades to assistant killers. - "Sticky Grenades Reward" "0,0,0,0" - - // Allow healing teammates with bullets as a reward to survivors. - // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. - // Note: This setting can be overridden for specific players. - // -- - // Separate values with commas (","). - // -- - // Values limit: 4 - // Character limit for each value: 1 - // -- - // Minimum value for each: 0 (OFF) - // Maximum value for each: 1 (ON) - // -- - // 1st number = Allow healing teammates with bullets to killers. - // 2nd number = Allow healing teammates with bullets to assistants. - // 3rd number = Allow healing teammates with bullets to teammates. - // 4th number = Allow healing teammates with bullets to assistant killers. - "Syringe Darts Reward" "0,0,0,0" - - // Give thorns as a reward to survivors. - // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. - // Note: This setting can be overridden for specific players. - // -- - // Separate values with commas (","). - // -- - // Values limit: 4 - // Character limit for each value: 1 - // -- - // Minimum value for each: 0 (OFF) - // Maximum value for each: 1 (ON) - // -- - // 1st number = Give thorns to killers. - // 2nd number = Give thorns to assistants. - // 3rd number = Give thorns to teammates. - // 4th number = Give thorns to assistant killers. - "Thorns Reward" "0,0,0,0" - - // Include useful reward types depending on the status of the recipient. - // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. - // Note: This setting can be overridden for specific players. - // -- - // Separate values with commas (","). - // -- - // Add up numbers together for different results. - // -- - // Minimum value for each: 0 - // Maximum value for each: 15 - // -- - // 0: OFF - // 1: If the recipient is black and white and low on ammunition, they will receive Health and ammo refill as a reward. - // 2: If the recipient is black and white, they will receive Health as a reward. - // 4: If the recipient is low on ammunition, they will receive Ammo as a reward. - // 8: If the recipient is dead, they will receive Respawn as a reward. - // -- - // 1st number = Enable useful rewards for killers. - // 2nd number = Enable useful rewards for assistants. - // 3rd number = Enable useful rewards for teammates. - // 4th number = Enable useful rewards for assistant killers. - "Useful Rewards" "0,0,0,0" - - // These are the RGBA values of the recipients' body color visual. - // Note: Any value less than "0" will output a random color. - // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. - // Note: This setting can be overridden for specific players. - // -- - // Separate RGBA sets with commas (","). - // Separate RGBA values with semi-colons (";"). - // -- - // RGBA sets limit: 4 - // Character limit for each set: 16 - // Character limit for each value: 4 - // -- - // Minimum value for each: -1 (Random) - // Maximum value for each: 255 (Brightest) - // -- - // 1st number = Red - // 2nd number = Green - // 3rd number = Blue - // 4th number = Alpha - // -- - // Keywords: - // "rainbow" - cycle through colors constantly. - // -- - // 1st set = RGBA set for killers. - // 2nd set = RGBA set for assistants. - // 3rd set = RGBA set for teammates. - // 4th set = RGBA set for assistant killers. - "Body Color Visual" "" - - // These are the RGB values of the recipients' glow outline color visual. - // Note: Only available in Left 4 Dead 2. - // Note: Any value less than "0" will output a random color. - // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. - // Note: This setting can be overridden for specific players. - // -- - // Separate RGB sets with commas (","). - // Separate RGB values with semi-colons (";"). - // -- - // RGB sets limit: 4 - // Character limit for each set: 12 - // Character limit for each value: 4 - // -- - // Minimum value for each: -1 (Random) - // Maximum value for each: 255 (Brightest) - // -- - // 1st number = Red - // 2nd number = Green - // 3rd number = Blue - // -- - // Keywords: - // "rainbow" - cycle through colors constantly. - // -- - // 1st set = RGB set for killers. - // 2nd set = RGB set for assistants. - // 3rd set = RGB set for teammates. - // 4th set = RGB set for assistant killers. - "Glow Color Visual" "" - - // These are the RGBA values of the recipients' light color visual. - // Note: Any value less than "0" will output a random color. - // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. - // Note: This setting can be overridden for specific players. - // -- - // Separate RGBA sets with commas (","). - // Separate RGBA values with semi-colons (";"). - // -- - // RGBA sets limit: 4 - // Character limit for each set: 16 - // Character limit for each value: 4 - // -- - // Minimum value for each: -1 (Random) - // Maximum value for each: 255 (Brightest) - // -- - // 1st number = Red - // 2nd number = Green - // 3rd number = Blue - // 4th number = Alpha - // -- - // Keywords: - // "rainbow" - cycle through colors constantly. - // -- - // 1st set = RGBA set for killers. - // 2nd set = RGBA set for assistants. - // 3rd set = RGBA set for teammates. - // 4th set = RGBA set for assistant killers. - "Light Color Visual" "" - - // The interval of the looping voiceline visual. - // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. - // Note: This setting can be overridden for specific players. - // -- - // Separate intervals with commas (","). - // -- - // Intervals limit: 4 - // Character limit for each interval: 9 - // -- - // Minimum value for each interval: 0.1 (Shortest) - // Maximum value for each interval: 99999.0 (Longest) - // -- - // 1st number = Interval for killers' looping voiceline. - // 2nd number = Interval for assistants' looping voiceline. - // 3rd number = Interval for teammates' looping voiceline. - // 4th number = Interval for assistant killers' looping voiceline. - "Looping Voiceline Interval" "" - - // The voiceline that plays on loop throughout a survivor's reward duration. - // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. - // Note: This setting can be overridden for specific players. - // -- - // Separate voicelines sets with commas (","). - // -- - // Item sets limit: 4 - // Character limit for each set: 64 - // -- - // 1st set = Looping voiceline for killers. - // 2nd set = Looping voiceline for assistants. - // 3rd set = Looping voiceline for teammates. - // 4th set = Looping voiceline for assistant killers. - "Looping Voiceline Visual" "" - - // The particles for the recipients' particle effect visual. - // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. - // Note: This setting can be overridden for specific players. - // -- - // Add up numbers together for different results. - // -- - // Minimum: 0 - // Maximum: 15 - // -- - // 0: OFF - // 1: Blood Explosion - // 2: Electric Jolt - // 4: Fire Trail - // 8: Acid Trail (Only available in Left 4 Dead 2.) - // -- - // 1st number = Particle effect for killers. - // 2nd number = Particle effect for assistants. - // 3rd number = Particle effect for teammates. - // 4th number = Particle effect for assistant killers. - "Particle Effect Visual" "0,0,0,0" - - // These are the RGBA values of the recipients' screen color visual. - // Note: Any value less than "0" will output a random color. - // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. - // Note: This setting can be overridden for specific players. - // -- - // Separate RGBA sets with commas (","). - // Separate RGBA values with semi-colons (";"). - // -- - // RGBA sets limit: 4 - // Character limit for each set: 16 - // Character limit for each value: 4 - // -- - // Minimum value for each: -1 (Random) - // Maximum value for each: 255 (Brightest) - // -- - // 1st number = Red - // 2nd number = Green - // 3rd number = Blue - // 4th number = Alpha - // -- - // Keywords: - // "rainbow" - cycle through colors constantly. - // -- - // 1st set = RGBA set for killers. - // 2nd set = RGBA set for assistants. - // 3rd set = RGBA set for teammates. - // 4th set = RGBA set for assistant killers. - "Screen Color Visual" "" - - // The pitch of the recipients' voice throughout their reward duration. - // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. - // Note: This setting can be overridden for specific players. - // -- - // Separate values with commas (","). - // -- - // Values limit: 4 - // Character limit for each value: 3 - // -- - // Minimum value for each: 0 (OFF) - // Maximum value for each: 255 (Highest) - // -- - // 1st number = Voice pitch for killers. - // 2nd number = Voice pitch for assistants. - // 3rd number = Voice pitch for teammates. - // 4th number = Voice pitch for assistant killers. - "Voice Pitch Visual" "0,0,0,0" - - "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" - { - "Reward Enabled" "-1,-1,-1,-1" - "Reward Bots" "-1,-1,-1,-1" - "Reward Chance" "0.0,0.0,0.0,0.0" - "Reward Duration" "0.0,0.0,0.0,0.0" - "Reward Effect" "0,0,0,0" - "Reward Notify" "0,0,0,0" - "Reward Percentage" "0.0,0.0,0.0,0.0" - "Reward Visual" "0,0,0,0" // Default is "63" on Left 4 Dead 1. - "Prefs Notify" "0,0,0,0" - "Share Rewards" "0,0,0,0" - "Teammate Limit" "0" - "Action Duration Reward" "0.0,0.0,0.0,0.0" - "Ammo Boost Reward" "0,0,0,0" - "Ammo Regen Reward" "0,0,0,0" - "Attack Boost Reward" "0.0,0.0,0.0,0.0" - "Blaze Health Reward" "0,0,0,0" - "Bunny Hop Reward" "0,0,0,0" - "Burst Doors Reward" "0,0,0,0" - "Clean Kills Reward" "0,0,0,0" - "Cluster Bombs Reward" "0,0,0,0" - "Damage Boost Reward" "0.0,0.0,0.0,0.0" - "Damage Resistance Reward" "0.0,0.0,0.0,0.0" - "Fall Voiceline Reward" "" - "Friendly Fire Reward" "0,0,0,0" - "Ghost Bullets Reward" "0,0,0,0" - "Heal Percent Reward" "0.0,0.0,0.0,0.0" - "Health Regen Reward" "0,0,0,0" - "Hollowpoint Ammo Reward" "0,0,0,0" - "Inextinguishable Fire Reward" "0,0,0,0" - "Infinite Ammo Reward" "0,0,0,0" - "Item Reward" "" - "Jump Height Reward" "0.0,0.0,0.0,0.0" - "Ladder Actions Reward" "0,0,0,0" - "Lady Killer Reward" "0,0,0,0" - "Laser Sight Reward" "0,0,0,0" - "Life Leech Reward" "0,0,0,0" - "Medical Incisions Reward" "0,0,0,0" - "Melee Range Reward" "0,0,0,0" - "Midair Dashes Reward" "0,0,0,0" - "Pipebomb Duration Reward" "0.0,0.0,0.0,0.0" - "Punch Resistance Reward" "0.0,0.0,0.0,0.0" - "Rapid Pistol Reward" "0.0,0.0,0.0,0.0" - "Recoil Dampener Reward" "0,0,0,0" - "Refill Percent Reward" "0.0,0.0,0.0,0.0" - "Regen Bursts Reward" "0,0,0,0" - "Respawn Loadout Reward" "0,0,0,0" - "Revive Health Reward" "0,0,0,0" - "Shove Damage Reward" "0.0,0.0,0.0,0.0" - "Shove Penalty Reward" "0,0,0,0" - "Shove Rate Reward" "0.0,0.0,0.0,0.0" - "Sledgehammer Rounds Reward" "0,0,0,0" - "Special Ammo Reward" "0,0,0,0" - "Speed Boost Reward" "0.0,0.0,0.0,0.0" - "Stack Limits" "0,0,0,0,0,0,0,0" - "Stack Rewards" "0,0,0,0" - "Sticky Grenades Reward" "0,0,0,0" - "Syringe Darts Reward" "0,0,0,0" - "Thorns Reward" "0,0,0,0" - "Useful Rewards" "0,0,0,0" - "Body Color Visual" "" - "Glow Color Visual" "" - "Light Color Visual" "" - "Looping Voiceline Interval" "0.0,0.0,0.0,0.0" - "Looping Voiceline Visual" "" - "Particle Effect Visual" "0,0,0,0" - "Screen Color Visual" "" - "Voice Pitch Visual" "0,0,0,0" - } - } - "Competitive" - { - // (Co-Op modes only) The Mutant Tank should attack immediately after spawning. - // Note: Do not change this setting if you are unsure of how it works. - // Note: This setting overrides the same setting under the "Plugin Settings/Competitive" section. - // -- - // 0/"disabled"/"false"/"off"/"no": OFF, let the game determine the Mutant Tank's initial behavior. - // 1/"enabled"/"true"/"on"/"yes": ON, force the Mutant Tank to attack immediately. - "Auto Aggravate" "0" - - // (Co-Op modes only) The Mutant Tank should prioritize throwing rocks. - // Note: Tanks only prioritize throwing rocks on Advanced and Expert modes by default. - // Note: Do not change this setting if you are unsure of how it works. - // Note: This setting overrides the same setting under the "Plugin Settings/Competitive" section. - // -- - // 0/"disabled"/"false"/"off"/"no": OFF, let the game determine Mutant Tanks' attack. - // 1/"enabled"/"true"/"on"/"yes": ON, force Mutant Tanks to prioritize throwing rocks. - "Prioritize Throws" "0" - } - "Glow" - { - // The Mutant Tank will have a glow outline. - // Note: Only available in Left 4 Dead 2. - // Note: This setting can be overridden for specific players. - // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Glow Enabled" "0" - - // These are the RGB values of the Mutant Tank's glow outline color. - // Note: Only available in Left 4 Dead 2. - // Note: Any value less than "0" will output a random color. - // Note: This setting can be overridden for specific players. - // -- - // 1st number = Red - // 2nd number = Green - // 3rd number = Blue - // -- - // Keywords: - // "rainbow" - cycle through colors constantly. - "Glow Color" "255,255,255" - //"Glow Color" "all_tank_glows" // Alternative (See "Colors" section) - - // The Mutant Tank's glow outline will flash. - // Note: Only available in Left 4 Dead 2. - // Note: This setting can be overridden for specific players. - // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Glow Flashing" "0" - - // The minimum range that a client can be away from the Mutant Tank until the glow outline starts to appear. - // Note: Only available in Left 4 Dead 2. - // Note: This setting can be overridden for specific players. - // -- - // Separate values with "-". - // -- - // Value limit: 2 - // Character limit for each value: 6 - // -- - // Minimum number for each value: 0 (Unlimited) - // Maximum number for each value: 99999 - // -- - // 1st number = Minimum value - // 2nd number = Maximum value - "Glow Range" "0-99999" - - // The Mutant Tank's glow outline visibility type. - // Note: Only available in Left 4 Dead 2. - // Note: This setting can be overridden for specific players. - // -- - // 0: Glow outline visible only on sight. - // 1: Glow outline visible through the walls. - "Glow Type" "0" - - "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" - { - // Note: Override any of the settings in the "Glow" section for each special infected here. - - // Example - "Glow Enabled" "0" - "Glow Color" "255,255,255" - "Glow Flashing" "0" - "Glow Range" "0-99999" - "Glow Type" "0" - } - } - "Administration" - { - // Admins with one or more of these access flags have access to the Mutant Tank type. - // Note: This setting overrides the same setting under the "Plugin Settings/Administration" section. - // Note: This setting can be overridden for specific players. - // -- - // Empty: No access flags have access. - // Not empty: These access flags have access. - "Access Flags" "" - - // Admins with one or more of these immunity flags are immune to all of the Mutant Tank's attacks. - // Note: This setting overrides the same setting under the "Plugin Settings/Administration" section. - // Note: This setting can be overridden for specific players. - // -- - // Empty: No immunity flags are immune. - // Not empty: These immunity flags are immune. - "Immunity Flags" "" - } - "Human Support" - { - // Allow players to play as the Mutant Tank. - // -- - // 0: OFF - // 1: ON, inform players about activating their abilities manually. - // 2: ON, do not inform players about activating their abilities manually. - "Human Support" "0" - - "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" - { - // Note: Override any of the settings in the "Human Support" section for each special infected here. - - // Example - "Human Support" "0" - } - } - "Spawn" - { - // The number of Mutant Tanks with this type that can be alive at any given time. - // Note: Clones, respawned Mutant Tanks, randomized Tanks, and Mutant Tanks spawned through the Mutant Tanks menu are not affected. - // Note: Do not change this setting if you are unsure of how it works. - // -- - // Minimum: 0 (OFF) - // Maximum: 32 - "Type Limit" "0" - - // The Mutant Tank can only spawn in close areas. - // Note: Do not change this setting if you are unsure of how it works. - // -- - // Minimum: 0.0 (OFF) - // Maximum: 99999.0 (Farthest) - // -- - // Keywords: - // "disabled"/"false"/"off"/"no" - 0.0 range - // "farthest" - 99999.0 range - "Close Areas Only" "0.0" - - // The Mutant Tank will only spawn on finale maps. - // Note: Clones, respawned Mutant Tanks, randomized Tanks, and Mutant Tanks spawned through the Mutant Tanks menu are not affected. - // Note: Do not change this setting if you are unsure of how it works. - // -- - // 0: OFF, the Mutant Tank can appear on any map. - // 1: ON, the Mutant Tank can only appear on finale maps. - // 2: ON, the Mutant Tank can only appear on non-finale maps. - // 3: ON, the Mutant Tank can only appear on finale maps before the rescue vehicle is called. - // 4: ON, the Mutant Tank can only appear on finale maps after the rescue vehicle is called. - "Finale Tank" "0" - - // The Mutant Tank can only spawn in open areas. - // Note: Do not change this setting if you are unsure of how it works. - // -- - // Minimum: 0.0 (OFF) - // Maximum: 99999.0 (Farthest) - // -- - // Keywords: - // "disabled"/"false"/"off"/"no" - 0.0 range - // "farthest" - 99999.0 range - "Open Areas Only" "0.0" - - // The mode of the Mutant Tank's spawn status. - // Note: This setting can be overridden for specific players. - // -- - // 0: Spawn as normal Mutant Tanks. - // 1: Spawn as Mutant Tank bosses. - // 2: Spawn as Mutant Tanks that switch randomly between each type. - // 3: Spawn as Mutant Tanks that temporarily transforms into a different type and reverts back after awhile. - // 4: Spawn as normal Mutant Tanks that can combine abilities. - "Spawn Type" "0" - - "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" - { - // Note: Override any of the settings in the "Spawn" section for each special infected here. - - // The Mutant Special Infected will only spawn on finale maps. - // Note: Clones, respawned Mutant Special Infected, randomized Special Infected, and Mutant Special Infected spawned through the Mutant Special Infected menus are not affected. - // Note: Do not change this setting if you are unsure of how it works. - // -- - // 0: OFF, the Mutant Special Infected can appear on any map. - // 1: ON, the Mutant Special Infected can only appear on finale maps. - // 2: ON, the Mutant Special Infected can only appear on non-finale maps. - // 3: ON, the Mutant Special Infected can only appear on finale maps before the rescue vehicle is called. - // 4: ON, the Mutant Special Infected can only appear on finale maps after the rescue vehicle is called. - "Finale Special" "0" - - // Example - "Type Limit" "0" - "Close Areas Only" "0.0" - "Finale Special" "0" - "Open Areas Only" "0.0" - "Spawn Type" "0" - } - } - "Boss" - { - // The base Mutant Tank type of the boss. - // Note: This setting only takes effect when the "Spawn Type" setting is set to "1". - // Note: This setting is only required for the boss' evolution stages, not its base form. - // Note: The value of this setting is used to track the boss across its evolution stages. - // -- - // 0: OFF - // 1-500: ON, the base Mutant Tank type of the boss. - "Boss Base Type" "0" - - // The effects for the boss. - // Note: This setting can be overridden for specific players. + // Give passives to survivors as buffs/debuffs. + // Note: Some passives may require Lux's "WeaponHandling_API" plugin. + // Link: https://forums.alliedmods.net/showthread.php?t=319947 + // Note: Some passives may require patches from the "mutant_tanks_patches.cfg" config file to work. // -- // Add up numbers together for different results. // -- - // Minimum: 0 - // Maximum: 15 + // Minimum: -1 + // Maximum: 2147483647 // -- - // 0: OFF - // 1: Survivor reactions - // 2: Explosion - // 4: Impact wave - // 8: Slow-motion (Only available in Left 4 Dead 2.) - "Boss Effects" "0" + // -1: OFF + // 0: Random + // 1: Health passive + // - Refill to a certain percentage of health. + // - Automatically kill any current special infected attacker. + // - Heal back to 100% health with first aid kits. + // - Receive 100% temporary health after being revived. + // - Slowly regenerate back to full health. + // - Leech health off of any infected per melee hit. + // - Turn damage into health from self-made fires. + // - Turn damage into health from self-made explosions. + // - Heal teammates with bullets. + // - Heal teammates with melee hits. + // - Donate health to teammates. + // 2: Speed boost passive + // - Run faster + // - Chain multiple jumps + // - Jump higher (Disables the death fall camera for recipients.) + // - Receive the adrenaline effect. (Only available in Left 4 Dead 2.) + // - Bunny hop consistently + // - Burst open doors + // - Throw sticky grenades that slow down special infected and mitigate their abilities. + // 4: Damage boost passive + // - Laser sight + // - Eternal flames + // - Extended pipebomb duration + // - Prevent dealing and receiving friendly-fire. + // - Extra damage + // - Bypass Tank immunities + // - Damage resistance + // - Automatically kill Witches. + // - Ghost bullets + // - Hollowpoint ammo + // - Extended melee range + // - Recoil dampener + // - Sledgehammer rounds + // - Protected by thorns (deal damage towards attacker per hit taken) + // 8: Attack boost passive + // - Prevent slowing down when attacked by infected. + // - Prevent infected attacks from offsetting aim. + // - Prevent interruption when performing actions. + // - Prevent switching to secondary slot when equipping a secondary pistol. + // - Prevent switching to throwables and health supplies given by teammates. + // - Perform actions on ladders. + // - Bypass shove penalty. + // - Shoving damages Tanks. + // - Faster shove interval + // - Faster fire rate (guns) + // - Faster reload rate (guns) + // - Faster swing rate (melee) + // - Faster throw time (throwables) + // - Faster revive time + // - Faster healing time (first aid kit) + // - Faster defib time (defibrillator) + // - Faster deploy time (ammo upgrade packs) + // - Faster pour time (gas cans) + // - Faster delivery time (cola bottles) + // - Faster recovery time + // - Rapid-fire pistols + // 16: Ammo passive + // - Refill clip to max size + // - Refill magazine to max size + // - Extra clip and magazine size + // - Receive one of the special ammo types (incendiary or explosive). (Only available in Left 4 Dead 2.) + // - Slowly regenerate back to full capacity. + // - Throw multiple pipe bombs at once (cluster bombs). + // 32: Item passive + // - Receive up to five items. + // 64: God mode passive + // - Automatically prevent attacks from and kill all special infected attackers. + // - Immune to all types of damage. + // - Cannot be nudged by teammates. + // - Cannot be flung away by Chargers. + // - Cannot be pushed around. + // - Cannot be vomited on by Boomers. + // - Reduced pushback from Tank punches + // - Reduced pushback from hitting Tanks with melee immunity. + // - Get clean kills (blocks Smoker clouds, Boomer explosions, and Spitter acid puddles) + // 128: Health and ammo refill passive + // - Refill to a certain percentage of health. + // - Automatically kill any current special infected attacker. + // - Refill clip to max size + // - Refill magazine to max size + // 256: Respawn passive + // - Respawn and teleport to a teammate. + // - Restore previous loadout + // 512: Infinite ammo passive + // - Infinite ammo for primary weapons + // - Infinite ammo for secondary weapons + // - Infinite ammo for throwables + // - Infinite ammo for medkits/defibs/ammo packs + // - Infinite ammo for pills/adrenaline + // 1023: All above passives + // 1024-2147483647: Reserved for third-party plugins + "Passive Enabled" "-1" - // The health of bosses needed for each stage. - // Note: This setting only takes effect when the "Spawn Type" setting is set to "1". - // Note: The values will be added to the boss's new health on every new stage. - // Note: The values will determine when the boss evolves to the next stage. - // Note: This setting can be overridden for specific players. - // Example: When Stage 2 boss with 8000 base HP has 2500 HP or less, it will evolve into Stage 3 boss with 10500 HP (8000 + 2500 HP). - // -- - // Separate abilities with commas (","). + // Gives passives to survivor bots as buffs/debuffs. + // Note: Some passives may require Lux's "WeaponHandling_API" plugin. + // Link: https://forums.alliedmods.net/showthread.php?t=319947 + // Note: Some passives may require patches from the "mutant_tanks_patches.cfg" config file to work. // -- - // Character limit: 44 (including commas) - // Health stages limit: 4 - // Character limit for each health stage: 11 + // Add up numbers together for different results. // -- - // Minimum value for each health stage: 1 - // Maximum value for each health stage: 1000000 + // Minimum: -1 + // Maximum: 2147483647 // -- - // 1st number = Amount of health of the boss to make it evolve/Amount of health given to Stage 2 boss. (The "Boss Stages" setting must be set to "1" or higher.) - // 2nd number = Amount of health of the boss to make it evolve/Amount of health given to Stage 3 boss. (The "Boss Stages" setting must be set to "2" or higher.) - // 3rd number = Amount of health of the boss to make it evolve/Amount of health given to Stage 4 boss. (The "Boss Stages" setting must be set to "3" or higher.) - // 4th number = Amount of health of the boss to make it evolve/Amount of health given to Stage 5 boss. (The "Boss Stages" setting must be set to "4" or higher.) - "Boss Health Stages" "5000,2500,1666,1250" + // -1: OFF + // 0: Random + // 1: Health passive + // - Refill to a certain percentage of health. + // - Automatically kill any current special infected attacker. + // - Heal back to 100% health with first aid kits. + // - Receive 100% temporary health after being revived. + // - Slowly regenerate back to full health. + // - Leech health off of any infected per melee hit. + // - Turn damage into health from self-made fires. + // - Turn damage into health from self-made explosions. + // - Heal teammates with bullets. + // - Heal teammates with melee hits. + // - Donate health to teammates. + // 2: Speed boost passive + // - Run faster + // - Chain multiple jumps + // - Jump higher (Disables the death fall camera for recipients.) + // - Receive the adrenaline effect. (Only available in Left 4 Dead 2.) + // - Bunny hop consistently + // - Burst open doors + // - Throw sticky grenades that slow down special infected and mitigate their abilities. + // 4: Damage boost passive + // - Laser sight + // - Eternal flames + // - Extended pipebomb duration + // - Prevent dealing and receiving friendly-fire. + // - Extra damage + // - Bypass Tank immunities + // - Damage resistance + // - Automatically kill Witches. + // - Ghost bullets + // - Hollowpoint ammo + // - Extended melee range + // - Recoil dampener + // - Sledgehammer rounds + // - Protected by thorns (deal damage towards attacker per hit taken) + // 8: Attack boost passive + // - Prevent slowing down when attacked by infected. + // - Prevent infected attacks from offsetting aim. + // - Prevent interruption when performing actions. + // - Prevent switching to secondary slot when equipping a secondary pistol. + // - Prevent switching to throwables and health supplies given by teammates. + // - Perform actions on ladders. + // - Bypass shove penalty. + // - Shoving damages Tanks. + // - Faster shove interval + // - Faster fire rate (guns) + // - Faster reload rate (guns) + // - Faster swing rate (melee) + // - Faster throw time (throwables) + // - Faster revive time + // - Faster healing time (first aid kit) + // - Faster defib time (defibrillator) + // - Faster deploy time (ammo upgrade packs) + // - Faster pour time (gas cans) + // - Faster delivery time (cola bottles) + // - Faster recovery time + // - Rapid-fire pistols + // 16: Ammo passive + // - Refill clip to max size + // - Refill magazine to max size + // - Extra clip and magazine size + // - Receive one of the special ammo types (incendiary or explosive). (Only available in Left 4 Dead 2.) + // - Slowly regenerate back to full capacity. + // - Throw multiple pipe bombs at once (cluster bombs). + // 32: Item passive + // - Receive up to five items. + // 64: God mode passive + // - Automatically prevent attacks from and kill all special infected attackers. + // - Immune to all types of damage. + // - Cannot be nudged by teammates. + // - Cannot be flung away by Chargers. + // - Cannot be pushed around. + // - Cannot be vomited on by Boomers. + // - Reduced pushback from Tank punches + // - Reduced pushback from hitting Tanks with melee immunity. + // - Get clean kills (blocks Smoker clouds, Boomer explosions, and Spitter acid puddles) + // 128: Health and ammo refill passive + // - Refill to a certain percentage of health. + // - Automatically kill any current special infected attacker. + // - Refill clip to max size + // - Refill magazine to max size + // 256: Respawn passive + // - Respawn and teleport to a teammate. + // - Restore previous loadout + // 512: Infinite ammo passive + // - Infinite ammo for primary weapons + // - Infinite ammo for secondary weapons + // - Infinite ammo for throwables + // - Infinite ammo for medkits/defibs/ammo packs + // - Infinite ammo for pills/adrenaline + // 1023: All above passives + // 1024-2147483647: Reserved for third-party plugins + "Passive Bots" "-1" - // The number of Mutant Tanks with this boss type that can be alive at any given time. - // Note: This setting only takes effect when the "Spawn Type" setting is set to "1". - // Note: This setting is only required for the boss' base form, not its evolution stages. - // Note: The value of this setting is used to limit the boss across its evolution stages. - // Note: Clones, respawned Mutant Tanks, randomized Tanks, and Mutant Tanks spawned through the Mutant Tanks menu are not affected. - // Note: Do not change this setting if you are unsure of how it works. + // Notify survivors when they receive a passive. // -- - // Minimum: 0 (OFF) - // Maximum: 32 - "Boss Limit" "0" + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Passive Notify" "0" - // The number of stages for the Mutant Tank boss. - // Note: This setting only takes effect when the "Spawn Type" setting is set to "1". - // Note: This setting can be overridden for specific players. + // The action duration passive given to survivors. // -- - // Minimum: 1 - // Maximum: 4 - "Boss Stages" "4" + // Minimum: 0.0 (OFF) + // Maximum: 99999.0 (Slowest) + "Action Duration Passive" "0.0" - // The Mutant Tank types that the boss will evolve into. - // Note: This setting only takes effect when the "Spawn Type" setting is set to "1". - // Note: Make sure that the Mutant Tank types that the boss will evolve into are enabled. - // Note: This setting can be overridden for specific players. - // Example: When Stage 1 boss evolves into Stage 2, it will evolve into Tank #2. - // -- - // Separate abilities with commas (","). - // -- - // Character limit: 20 - // Stage types limit: 4 - // Character limit for each stage type: 5 - // -- - // Minimum: 1 - // Maximum: 500 + // The adrenaline time passive given to survivors. // -- - // 1st number = 2nd stage type - // 2nd number = 3rd stage type - // 3rd number = 4th stage type - // 4th number = 5th stage type - "Boss Types" "2,3,4,5" - - "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" - { - // Note: Override any of the settings in the "Boss" section for each special infected here. + // Minimum: 0.0 (OFF) + // Maximum: 99999.0 (Fastest) + "Adrenaline Time Passive" "0.0" - // Example - "Boss Base Type" "0" - "Boss Effects" "0" - "Boss Health Stages" "5000,2500,1666,1250" - "Boss Limit" "0" - "Boss Stages" "4" - "Boss Types" "2,3,4,5" - } - } - "Combo" - { - // The chance to trigger each ability in the combination. - // Note: This setting only takes effect when the "Spawn Type" setting is set to "4". - // Note: This setting can be overridden for specific players. - // -- - // Separate chances with commas (","). - // -- - // Chances limit: 10 - // Character limit for each chance: 6 - // -- - // Minimum value for each chance: 0.0 (No chance) - // Maximum value for each chance: 100.0 (Highest chance) + // Give ammo boost as a passive to survivors. // -- - // 1st number = Chance to trigger the first ability. - // 2nd number = Chance to trigger the second ability. - // 3rd number = Chance to trigger the third ability. - // 4th number = Chance to trigger the fourth ability. - // 5th number = Chance to trigger the fifth ability. - // 6th number = Chance to trigger the sixth ability. - // 7th number = Chance to trigger the seventh ability. - // 8th number = Chance to trigger the eighth ability. - // 9th number = Chance to trigger the ninth ability. - // 10th number = Chance to trigger the tenth ability. - "Combo Chance" "0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0" + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Ammo Boost Passive" "0" - // The cooldown of each ability in the combination. - // Note: This setting only takes effect when the "Spawn Type" setting is set to "4". - // Note: This setting can be overridden for specific players. - // -- - // Separate cooldowns with commas (","). - // -- - // Cooldowns limit: 10 - // Character limit for each cooldown: 6 - // -- - // Minimum value for each cooldown: 0 (OFF) - // Maximum value for each cooldown: 99999 (Longest) + // Give ammo refill as a passive to survivors. // -- - // 1st number = Cooldown of the first ability. - // 2nd number = Cooldown of the second ability. - // 3rd number = Cooldown of the third ability. - // 4th number = Cooldown of the fourth ability. - // 5th number = Cooldown of the fifth ability. - // 6th number = Cooldown of the sixth ability. - // 7th number = Cooldown of the seventh ability. - // 8th number = Cooldown of the eighth ability. - // 9th number = Cooldown of the ninth ability. - // 10th number = Cooldown of the tenth ability. - "Combo Cooldown" "0,0,0,0,0,0,0,0,0,0" + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Ammo Refill Passive" "0" - // The damage of each ability in the combination. - // Note: This setting only takes effect when the "Spawn Type" setting is set to "4". - // Note: This setting can be overridden for specific players. - // -- - // Separate damages with commas (","). - // -- - // Damages limit: 10 - // Character limit for each damage: 9 - // -- - // Minimum value for each damage: 0.0 (OFF) - // Maximum value for each chance: 99999.0 (Strongest) + // The amount of ammo to regenerate per second as a passive to survivors. // -- - // 1st number = Damage of the first ability. - // 2nd number = Damage of the second ability. - // 3rd number = Damage of the third ability. - // 4th number = Damage of the fourth ability. - // 5th number = Damage of the fifth ability. - // 6th number = Damage of the sixth ability. - // 7th number = Damage of the seventh ability. - // 8th number = Damage of the eighth ability. - // 9th number = Damage of the ninth ability. - // 10th number = Damage of the tenth ability. - "Combo Damage" "0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0" + // Minimum: 0 (OFF) + // Maximum: 99999 (Highest) + "Ammo Regen Passive" "0" - // The chance to trigger each ability in the combination when the Mutant Tank dies. - // Note: This setting only takes effect when the "Spawn Type" setting is set to "4". - // Note: This setting can be overridden for specific players. - // -- - // Separate chances with commas (","). - // -- - // Chances limit: 10 - // Character limit for each chance: 6 + // The attack boost passive given to survivors. // -- - // Minimum value for each chance: 0.0 (No chance) - // Maximum value for each chance: 100.0 (Highest chance) + // Minimum: 0.0 (OFF) + // Maximum: 99999.0 (Fastest) + "Attack Boost Passive" "0.0" + + // Allow healing from self-made fires as a passive to survivors. // -- - // 1st number = Chance of the first ability. - // 2nd number = Chance of the second ability. - // 3rd number = Chance of the third ability. - // 4th number = Chance of the fourth ability. - // 5th number = Chance of the fifth ability. - // 6th number = Chance of the sixth ability. - // 7th number = Chance of the seventh ability. - // 8th number = Chance of the eighth ability. - // 9th number = Chance of the ninth ability. - // 10th number = Chance of the tenth ability. - "Combo Death Chance" "0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0" + // Minimum: 0 (OFF) + // Maximum: 1000000 (Highest) + "Blaze Health Passive" "0" - // The range needed to trigger each ability in the combination when the Mutant Tank dies. - // Note: This setting only takes effect when the "Spawn Type" setting is set to "4". - // Note: This setting can be overridden for specific players. + // Take this much health from the survivor whenever the survivor heals a teammate with any of the following passives: + // - Blaze Health Passive + // - Medical Cuts Passive + // - Regen Bursts Passive + // - Syringe Darts Passive // -- - // Separate ranges with commas (","). + // Minimum: 0 (OFF) + // Maximum: 1000000 (Highest) + "Blood Donor Passive" "0" + + // Allow bunnyhopping as a passive to survivors. // -- - // Ranges limit: 10 - // Character limit for each range: 9 + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Bunny Hop Passive" "0" + + // Allow survivors to burst open doors when running. // -- - // Minimum value for each range: 0.0 (OFF) - // Maximum value for each range: 99999.0 (Farthest) + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Burst Doors Passive" "0" + + // Give clean kills (no Smoker clouds, Boomer explosions, and Spitter acide puddles) as a passive to survivors. // -- - // 1st number = Range of the first ability. - // 2nd number = Range of the second ability. - // 3rd number = Range of the third ability. - // 4th number = Range of the fourth ability. - // 5th number = Range of the fifth ability. - // 6th number = Range of the sixth ability. - // 7th number = Range of the seventh ability. - // 8th number = Range of the eighth ability. - // 9th number = Range of the ninth ability. - // 10th number = Range of the tenth ability. - "Combo Death Range" "0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0" + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Clean Kills Passive" "0" - // The delay of each ability in the combination. - // Note: This setting only takes effect when the "Spawn Type" setting is set to "4". - // Note: This setting can be overridden for specific players. + // Allow survivors to throw cluster bombs (multiple pipe bombs) as a passive. // -- - // Separate delays with commas (","). + // Minimum: 0 (OFF) + // Maximum: 5 (Highest) + "Cluster Bombs Passive" "0" + + // The damage boost passive given to survivors. // -- - // Delays limit: 10 - // Character limit for each delay: 9 + // Minimum: 0.0 (OFF) + // Maximum: 99999.0 (Strongest) + "Damage Boost Passive" "0.0" + + // The damage resistance passive given to survivors. // -- - // Minimum value for each delay: 0.0 (OFF) - // Maximum value for each delay: 99999.0 (Longest) + // Minimum: 0.0 (OFF) + // Maximum: 99999.0 (Weakest) + "Damage Resistance Passive" "0.0" + + // When a survivor consumes adrenaline, any other survivors within this radius also receives the effects of adrenaline for a short duration. // -- - // 1st number = Delay of the first ability. - // 2nd number = Delay of the second ability. - // 3rd number = Delay of the third ability. - // 4th number = Delay of the fourth ability. - // 5th number = Delay of the fifth ability. - // 6th number = Delay of the sixth ability. - // 7th number = Delay of the seventh ability. - // 8th number = Delay of the eighth ability. - // 9th number = Delay of the ninth ability. - // 10th number = Delay of the tenth ability. - "Combo Delay" "0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0" + // Minimum: 0.0 (OFF) + // Maximum: 99999.0 (Farthest) + "Dopamine Radius Passive" "0.0" - // The duration of each ability in the combination. - // Note: This setting only takes effect when the "Spawn Type" setting is set to "4". - // Note: This setting can be overridden for specific players. + // Give inextinguishable fire as a passive to survivors. // -- - // Separate durations with commas (","). + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Eternal Flames Passive" "0" + + // Give fast recovery as a passive to survivors. // -- - // Durations limit: 10 - // Character limit for each duration: 9 + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Fast Recovery Passive" "0" + + // The fire rate passive given to survivors. // -- - // Minimum value for each duration: 0.0 (OFF) - // Maximum value for each duration: 99999.0 (Longest) + // Minimum: 0.0 (OFF) + // Maximum: 99999.0 (Fastest) + "Fire Rate Passive" "0.0" + + // Give friendly-fire immunity as a passive to survivors. // -- - // 1st number = Duration of the first ability. - // 2nd number = Duration of the second ability. - // 3rd number = Duration of the third ability. - // 4th number = Duration of the fourth ability. - // 5th number = Duration of the fifth ability. - // 6th number = Duration of the sixth ability. - // 7th number = Duration of the seventh ability. - // 8th number = Duration of the eighth ability. - // 9th number = Duration of the ninth ability. - // 10th number = Duration of the tenth ability. - "Combo Duration" "0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0" + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Friendly Fire Passive" "0" - // The interval of each ability in the combination. - // Note: This setting only takes effect when the "Spawn Type" setting is set to "4". - // Note: This setting can be overridden for specific players. + // Give ghost bullets as a passive to survivors. // -- - // Separate intervals with commas (","). + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Ghost Bullets Passive" "0" + + // Give up this percentage of reserved ammo to launch a grenade on any gun as a passive to survivors. + // Note: Press your Use (default: E) and Zoom (default: mouse wheel) keys to launch a grenade. // -- - // Intervals limit: 10 - // Character limit for each interval: 9 + // Minimum: 0.0 (OFF) + // Maximum: 100.0 (Highest) + "Grenade Launcher Passive" "0.0" + + // The healing percentage from first aid kits passive given to survivors. // -- - // Minimum value for each interval: 0.0 (OFF) - // Maximum value for each interval: 99999.0 (Longest) + // Minimum: 0.0 (OFF) + // Maximum: 100.0 (Highest) + "Heal Percent Passive" "0.0" + + // When a survivor heals with a medkit, any other survivors within this radius also receives a small portion of health. // -- - // 1st number = Interval of the first ability. - // 2nd number = Interval of the second ability. - // 3rd number = Interval of the third ability. - // 4th number = Interval of the fourth ability. - // 5th number = Interval of the fifth ability. - // 6th number = Interval of the sixth ability. - // 7th number = Interval of the seventh ability. - // 8th number = Interval of the eighth ability. - // 9th number = Interval of the ninth ability. - // 10th number = Interval of the tenth ability. - "Combo Interval" "0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0" + // Minimum: 0.0 (OFF) + // Maximum: 99999.0 (Farthest) + "Healthcare Radius Passive" "0.0" - // The radius of each ability in the combination. - // Note: This setting only takes effect when the "Spawn Type" setting is set to "4". - // Note: This setting can be overridden for specific players. + // The amount of health to regenerate per second as a passive to survivors. // -- - // Separate radiuses with commas (","). - // Separate values with semi-colons (";"). + // Minimum: 0 (OFF) + // Maximum: 1000000 (Highest) + "Health Regen Passive" "0" + + // This is the cooldown for a small healing wave that triggers whenever a survivor hurts any infected target. Any teammate within the small radius will receive 5 HP. // -- - // Radiuses limit: 10 - // Character limit for each radius: 14 + // Minimum: 0.0 (OFF) + // Maximum: 99999.0 (Longest) + "Heartbeat Passive" "0.0" + + // The chance to shoot hollowpoint ammo as a passive to survivors. // -- - // Minimum value for each radius: -200.0 - // Maximum value for each radius: 200.0 + // Minimum: 0.0 (No chance) + // Maximum: 100.0 (Highest chance) + "Hollowpoint Ammo Passive" "0.0" + + // Give infinite ammo as a passive to survivors. // -- - // 1st number = Minimum value - // 2nd number = Maximum value + // Add up numbers together for different results. // -- - // 1st set = Radius of the first ability. - // 2nd set = Radius of the second ability. - // 3rd set = Radius of the third ability. - // 4th set = Radius of the fourth ability. - // 5th set = Radius of the fifth ability. - // 6th set = Radius of the sixth ability. - // 7th set = Radius of the seventh ability. - // 8th set = Radius of the eighth ability. - // 9th set = Radius of the ninth ability. - // 10th set = Radius of the tenth ability. - "Combo Radius" "0.0;0.0,0.0;0.0,0.0;0.0,0.0;0.0,0.0;0.0,0.0;0.0,0.0;0.0,0.0;0.0,0.0;0.0,0.0;0.0" + // Minimum: 0 + // Maximum: 31 + // -- + // 0: OFF + // 1: Infinite ammo for primary weapons + // 2: Infinite ammo for secondary weapons + // 4: Infinite ammo for throwables + // 8: Infinite ammo for medkits/defibs/ammo packs + // 16: Infinite ammo for pills/adrenaline + "Infinite Ammo Passive" "0" - // The range of each ability in the combination. - // Note: This setting only takes effect when the "Spawn Type" setting is set to "4". - // Note: This setting can be overridden for specific players. + // The item(s) passive given to survivors. // -- - // Separate ranges with commas (","). + // Character limit: 320 + "Item Passive" "" + + // The jump height passive given to survivors. + // Note: Any value above "150.0" may cause instant death from fall damage. // -- - // Ranges limit: 10 - // Character limit for each range: 9 + // Minimum: 0.0 (OFF) + // Maximum: 99999.0 (Highest) + "Jump Height Passive" "0.0" + + // Allow survivors to perform actions while on ladders. // -- - // Minimum value for each range: 0.0 (OFF) - // Maximum value for each range: 99999.0 (Farthest) + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Ladder Actions Passive" "0" + + // Give up this percentage of reserved ammo to instantly kill a Witch as a passive to survivors. + // Note: Press your Use (default: E) and Zoom (default: mouse wheel) keys to launch a lady killer grenade. // -- - // 1st number = Range of the first ability. - // 2nd number = Range of the second ability. - // 3rd number = Range of the third ability. - // 4th number = Range of the fourth ability. - // 5th number = Range of the fifth ability. - // 6th number = Range of the sixth ability. - // 7th number = Range of the seventh ability. - // 8th number = Range of the eighth ability. - // 9th number = Range of the ninth ability. - // 10th number = Range of the tenth ability. - "Combo Range" "0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0" + // Minimum: 0.0 (OFF) + // Maximum: 100.0 (Highest) + "Lady Killer Passive" "0.0" - // The chance to trigger each ability in the combination when the Mutant Tank is within range of its target. - // Note: This setting only takes effect when the "Spawn Type" setting is set to "4". - // Note: This setting can be overridden for specific players. + // Give laser sight as a passive to survivors. // -- - // Separate chances with commas (","). + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Laser Sight Passive" "0" + + // The amount of health to leech per hit as a passive to survivors. // -- - // Chances limit: 10 - // Character limit for each chance: 6 + // Minimum: 0 (OFF) + // Maximum: 1000000 (Highest) + "Life Leech Passive" "0" + + // The chance to not lose a bullet from every gunshot as a passive to survivors. // -- - // Minimum value for each chance: 0.0 (No chance) - // Maximum value for each chance: 100.0 (Highest chance) + // Minimum: 0.0 (No chance) + // Maximum: 100.0 (Highest chance) + "Lucky Bullet Passive" "0.0" + + // Allow healing teammates with melee hits as a passive to survivors. // -- - // 1st number = Chance of the first ability. - // 2nd number = Chance of the second ability. - // 3rd number = Chance of the third ability. - // 4th number = Chance of the fourth ability. - // 5th number = Chance of the fifth ability. - // 6th number = Chance of the sixth ability. - // 7th number = Chance of the seventh ability. - // 8th number = Chance of the eighth ability. - // 9th number = Chance of the ninth ability. - // 10th number = Chance of the tenth ability. - "Combo Range Chance" "0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0" + // Minimum: 0 (OFF) + // Maximum: 1000000 (Highest) + "Medical Cuts Passive" "0" - // The cooldown of each ability in the combination when the Mutant Tank is within range of its target. - // Note: This setting only takes effect when the "Spawn Type" setting is set to "4". - // Note: This setting can be overridden for specific players. + // The melee range passive given to survivors. // -- - // Separate cooldowns with commas (","). + // Minimum: 0 (OFF) + // Maximum: 99999 (Highest) + "Melee Range Passive" "0" + + // Allow survivors to perform a number of midair dashes (extra jumps) as a passive. // -- - // Cooldowns limit: 10 - // Character limit for each cooldown: 6 + // Minimum: 0 (OFF) + // Maximum: 99999 (Highest) + "Midair Dashes Passive" "0" + + // When a survivor revives another survivor, any other disabled survivors within this radius also gets revived. // -- - // Minimum value for each cooldown: 0 (OFF) - // Maximum value for each cooldown: 99999 (Longest) + // Minimum: 0.0 (OFF) + // Maximum: 99999.0 (Farthest) + "Motivation Radius Passive" "0.0" + + // When a survivor consumes pain pills, any other survivors within this radius also receives a small portion of temporary health. // -- - // 1st number = Cooldown of the first ability. - // 2nd number = Cooldown of the second ability. - // 3rd number = Cooldown of the third ability. - // 4th number = Cooldown of the fourth ability. - // 5th number = Cooldown of the fifth ability. - // 6th number = Cooldown of the sixth ability. - // 7th number = Cooldown of the seventh ability. - // 8th number = Cooldown of the eighth ability. - // 9th number = Cooldown of the ninth ability. - // 10th number = Cooldown of the tenth ability. - "Combo Range Cooldown" "0,0,0,0,0,0,0,0,0,0" + // Minimum: 0.0 (OFF) + // Maximum: 99999.0 (Farthest) + "Overdose Radius Passive" "0.0" - // The chance to trigger each ability in the combination when the Mutant Tank throws/breaks a rock. - // Note: This setting only takes effect when the "Spawn Type" setting is set to "4". - // Note: This setting can be overridden for specific players. + // The overhealth passive given to survivors. // -- - // Separate chances with commas (","). + // Minimum: 0 (OFF) + // Maximum: 1000000 (Highest) + "Overhealth Passive" "0" + + // The pipebomb duration passive given to survivors. // -- - // Chances limit: 10 - // Character limit for each chance: 6 + // Minimum: 0.0 (OFF) + // Maximum: 99999.0 (Longest) + "Pipebomb Duration Passive" "0.0" + + // The punch resistance passive given to survivors. + // -- + // Minimum: 0.0 (OFF) + // Maximum: 99999.0 (Weakest) + "Punch Resistance Passive" "0.0" + + // The rapid pistol fire rate passive given to survivors. // -- - // Minimum value for each chance: 0.0 (No chance) - // Maximum value for each chance: 100.0 (Highest chance) + // Minimum: 0.0 (OFF) + // Maximum: 1.0 (None) + "Rapid Pistol Passive" "0.0" + + // Give recoil dampener as a passive to survivors. // -- - // 1st number = Chance of the first ability. - // 2nd number = Chance of the second ability. - // 3rd number = Chance of the third ability. - // 4th number = Chance of the fourth ability. - // 5th number = Chance of the fifth ability. - // 6th number = Chance of the sixth ability. - // 7th number = Chance of the seventh ability. - // 8th number = Chance of the eighth ability. - // 9th number = Chance of the ninth ability. - // 10th number = Chance of the tenth ability. - "Combo Rock Chance" "0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0" + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Recoil Dampener Passive" "0" - // The cooldown of each ability in the combination when the Mutant Tank throws/breaks a rock. - // Note: This setting only takes effect when the "Spawn Type" setting is set to "4". - // Note: This setting can be overridden for specific players. + // The percentage of health to refill with the "Health" and "Refill" passives. // -- - // Separate cooldowns with commas (","). + // Minimum: 0.0 (OFF) + // Maximum: 100.0 (Highest) + "Refill Percent Passive" "0.0" + + // Allow healing from self-made explosions as a passive to survivors. // -- - // Cooldowns limit: 10 - // Character limit for each cooldown: 6 + // Minimum: 0 (OFF) + // Maximum: 1000000 (Highest) + "Regen Bursts Passive" "0" + + // The reload rate passive given to survivors. // -- - // Minimum value for each cooldown: 0 (OFF) - // Maximum value for each cooldown: 99999 (Longest) + // Minimum: 0.0 (OFF) + // Maximum: 99999.0 (Fastest) + "Reload Rate Passive" "0.0" + + // Restore the previous loadouts of survivors after respawning them. // -- - // 1st number = Cooldown of the first ability. - // 2nd number = Cooldown of the second ability. - // 3rd number = Cooldown of the third ability. - // 4th number = Cooldown of the fourth ability. - // 5th number = Cooldown of the fifth ability. - // 6th number = Cooldown of the sixth ability. - // 7th number = Cooldown of the seventh ability. - // 8th number = Cooldown of the eighth ability. - // 9th number = Cooldown of the ninth ability. - // 10th number = Cooldown of the tenth ability. - "Combo Rock Cooldown" "0,0,0,0,0,0,0,0,0,0" + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Respawn Loadout Passive" "0" - // The set of abilities to combine. - // Note: This setting only takes effect when the "Spawn Type" setting is set to "4". - // Note: Make sure that the abilities that the Mutant Tank will combine are set up properly. - // Note: This setting can be overridden for specific players. + // The revive health passive given to survivors. // -- - // Separate abilities with commas (","). + // Minimum: 0 (OFF) + // Maximum: 1000000 (Highest) + "Revive Health Passive" "0" + + // Give riot gear (high resistance to direct hits and knockbacks) as a passive to survivors. // -- - // Character limit: 320 (including commas) - // Abilities limit: 10 - // Character limit for each ability: 32 + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Riot Gear Passive" "0" + + // Give safety bubble (immunity to special attacks, mutant abilities, and the punishment system) as a passive to survivors. // -- - // Example: "fast,slow" - // Example: "Ghost Ability,WarpAbility" - // Example: "fire,Pyro_Ability,Fast Ability" - "Combo Set" "" + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Safety Bubble Passive" "0" - // The speed of each ability in the combination. - // Note: This setting only takes effect when the "Spawn Type" setting is set to "4". - // Note: This setting can be overridden for specific players. + // When a dead survivor is revived with a defibrillator, any other dead survivors within this radius also gets revived with temporary health. // -- - // Separate speeds with commas (","). + // Minimum: 0.0 (OFF) + // Maximum: 99999.0 (Farthest) + "Shockwave Radius Passive" "0.0" + + // The shove damage multiplier against Chargers, Witches, and Tanks passive given to survivors. + // Note: The max health of the target will be multiplied by this setting's value. // -- - // Speeds limit: 10 - // Character limit for each speed: 9 + // Minimum: 0.0 (OFF) + // Maximum: 99999.0 (Strongest) // -- - // Minimum value for each speed: 0.0 (OFF) - // Maximum value for each speed: 99999.0 (Fastest) + // Example: 600 (default Charger health) * 0.025 (shove damage passive) = 15 damage per shove + "Shove Damage Passive" "0.0" + + // Remove shove penalty as a passive to survivors. // -- - // 1st number = Speed of the first ability. - // 2nd number = Speed of the second ability. - // 3rd number = Speed of the third ability. - // 4th number = Speed of the fourth ability. - // 5th number = Speed of the fifth ability. - // 6th number = Speed of the sixth ability. - // 7th number = Speed of the seventh ability. - // 8th number = Speed of the eighth ability. - // 9th number = Speed of the ninth ability. - // 10th number = Speed of the tenth ability. - "Combo Speed" "0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0" + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Shove Penalty Passive" "0" - // The chance for each type of abilities to be combined. - // Note: This setting only takes effect when the "Spawn Type" setting is set to "4". - // Note: This setting can be overridden for specific players. + // The shove rate passive given to survivors. + // Note: The value of "z_gun_swing_interval" will be multiplied by this setting's value. // -- - // Separate chances with commas (","). + // Minimum: 0.0 (OFF) + // Maximum: 99999.0 (Slowest) // -- - // Chances limit: 6 - // Character limit for each chance: 6 + // Example: 0.7 (default "z_gun_swing_interval" value) * 0.7 (shove rate passive) = 0.49 rate + "Shove Rate Passive" "0.0" + + // The chance to shoot sledgehammer rounds as a passive to survivors. // -- - // Minimum value for each chance: 0.0 (No chance) - // Maximum value for each chance: 100.0 (Highest chance) + // Minimum: 0.0 (No chance) + // Maximum: 100.0 (Highest chance) + "Sledgehammer Rounds Passive" "0.0" + + // Give special ammo as a passive to survivors. + // Note: Only available in Left 4 Dead 2. // -- - // 1st number = Chance to combine main/range abilities. - // 2nd number = Chance to combine hit abilities. - // 3rd number = Chance to combine rock throw abilities. - // 4th number = Chance to combine rock break abilities. - // 5th number = Chance to combine post-spawn abilities. - // 6th number = Chance to combine upon-death abilities. - "Combo Type Chance" "0.0,0.0,0.0,0.0,0.0,0.0" + // Minimum: 0 + // Maximum: 3 + // -- + // 0: OFF + // 1: Incendiary ammo + // 2: Explosive ammo + // 3: Random + "Special Ammo Passive" "0" - "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" - { - // Note: Override any of the settings in the "Combo" section for each special infected here. + // The speed boost passive given to survivors. + // -- + // Minimum: 0.0 (OFF) + // Maximum: 99999.0 (Fastest) + "Speed Boost Passive" "0.0" - // Example - "Combo Chance" "0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0" - "Combo Cooldown" "0,0,0,0,0,0,0,0,0,0" - "Combo Damage" "0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0" - "Combo Death Chance" "0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0" - "Combo Death Range" "0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0" - "Combo Delay" "0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0" - "Combo Duration" "0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0" - "Combo Interval" "0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0" - "Combo Radius" "0.0;0.0,0.0;0.0,0.0;0.0,0.0;0.0,0.0;0.0,0.0;0.0,0.0;0.0,0.0;0.0,0.0;0.0,0.0;0.0" - "Combo Range" "0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0" - "Combo Range Chance" "0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0" - "Combo Range Cooldown" "0,0,0,0,0,0,0,0,0,0" - "Combo Rock Chance" "0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0" - "Combo Rock Cooldown" "0,0,0,0,0,0,0,0,0,0" - "Combo Set" "" - "Combo Speed" "0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0" - "Combo Type Chance" "0.0,0.0,0.0,0.0,0.0,0.0" - } - } - "Random" - { - // The Mutant Tank can be used by other Mutant Tanks who spawn with the Randomization mode feature. - // Note: Do not change this setting if you are unsure of how it works. - // Note: This setting can be overridden for specific players. + // Give sticky grenades as a passive to survivors. // -- - // -1/"ignore"/"exclude"/"filter"/"remove": Let the setting with the same name from each player-controlled Mutant Tank's "Random" section decide. // 0/"disabled"/"false"/"off"/"no": OFF // 1/"enabled"/"true"/"on"/"yes": ON - "Random Tank" "1" + "Sticky Grenades Passive" "0" - // How long until the Mutant Tank stops randomizing into different types. - // Note: This setting only takes effect when the "Spawn Type" setting is set to "2". - // Note: This setting can be overridden for specific players. + // This is the cooldown for a small ammo resupply wave that triggers whenever a survivor hurts any infected target. Any teammate within the small radius will receive 5% of their current primary gun's max ammo. // -- - // Minimum: 0.1 - // Maximum: 99999.0 + // Minimum: 0.0 (OFF) + // Maximum: 99999.0 (Longest) + "Supplier Passive" "0.0" + + // The melee swing rate passive given to survivors. // -- - // Keywords: - // "milli"/"millisecond" - 0.1 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Random Duration" "99999.0" + // Minimum: 0.0 (OFF) + // Maximum: 99999.0 (Fastest) + "Swing Rate Passive" "0.0" - // The Mutant Tank switches to a random type every time this many seconds passes. - // Note: This setting only takes effect when the "Spawn Type" setting is set to "2". - // Note: This setting can be overridden for specific players. + // Allow healing teammates with bullets as a passive to survivors. // -- - // Minimum: 0.1 - // Maximum: 99999.0 + // Minimum: 0 (OFF) + // Maximum: 1000000 (Highest) + "Syringe Darts Passive" "0" + + // Give thorns as a passive to survivors. // -- - // Keywords: - // "milli"/"millisecond" - 0.1 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Random Interval" "5.0" + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Thorns Passive" "0" - "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" + "Nick" // Syntax: "Nick"/"Rochelle"/"Ellis"/"Coach"/"Bill"/"Zoey"/"Francis"/"Louis" - Multiple survivors can be grouped in the same section. { - // Note: Override any of the settings in the "Random" section for each special infected here. + "Carrier Enabled" "0" + "Carrier Bots" "0" + "Carrier Body" "0" + "Carrier Chance" "0.0" + "Carrier Cleanse" "0" + "Carrier Damage Multiplier" "0.0" + "Carrier Delay" "0.0" + "Carrier Filter" "0" + "Carrier Health Multiplier" "0.0" + "Carrier Mix" "0" + "Carrier Mode" "0" + "Carrier Teleport" "0" + "Carrier Type" "0" + "Carrier Voice" "0" + "Carrier Voice Chance" "0.0" + "Carrier Voice Interval" "0.0" + "Carrier Voicelines" "" + "Passive Enabled" "-1" + "Passive Bots" "-1" + "Passive Notify" "0" + "Action Duration Passive" "0.0" + "Adrenaline Time Passive" "0.0" + "Ammo Boost Passive" "0" + "Ammo Refill Passive" "0" + "Ammo Regen Passive" "0" + "Attack Boost Passive" "0.0" + "Blaze Health Passive" "0" + "Blood Donor Passive" "0" + "Bunny Hop Passive" "0" + "Burst Doors Passive" "0" + "Clean Kills Passive" "0" + "Cluster Bombs Passive" "0" + "Damage Boost Passive" "0.0" + "Damage Resistance Passive" "0.0" + "Dopamine Radius Passive" "0.0" + "Eternal Flames Passive" "0" + "Fast Recovery Passive" "0" + "Fire Rate Passive" "0.0" + "Friendly Fire Passive" "0" + "Ghost Bullets Passive" "0" + "Grenade Launcher Passive" "0.0" + "Heal Percent Passive" "0.0" + "Healthcare Radius Passive" "0.0" + "Health Regen Passive" "0" + "Heartbeat Passive" "0.0" + "Hollowpoint Ammo Passive" "0.0" + "Infinite Ammo Passive" "0" + "Item Passive" "" + "Jump Height Passive" "0.0" + "Ladder Actions Passive" "0" + "Lady Killer Passive" "0.0" + "Laser Sight Passive" "0" + "Life Leech Passive" "0" + "Lucky Bullet Passive" "0.0" + "Medical Cuts Passive" "0" + "Melee Range Passive" "0" + "Midair Dashes Passive" "0" + "Motivation Radius Passive" "0.0" + "Overdose Radius Passive" "0.0" + "Overhealth Passive" "0" + "Pipebomb Duration Passive" "0.0" + "Punch Resistance Passive" "0.0" + "Rapid Pistol Passive" "0.0" + "Recoil Dampener Passive" "0" + "Refill Percent Passive" "0.0" + "Regen Bursts Passive" "0" + "Reload Rate Passive" "0.0" + "Respawn Loadout Passive" "0" + "Revive Health Passive" "0" + "Riot Gear Passive" "0" + "Safety Bubble Passive" "0" + "Shockwave Radius Passive" "0.0" + "Shove Damage Passive" "0.0" + "Shove Penalty Passive" "0" + "Shove Rate Passive" "0.0" + "Sledgehammer Rounds Passive" "0.0" + "Special Ammo Passive" "0" + "Speed Boost Passive" "0.0" + "Sticky Grenades Passive" "0" + "Supplier Passive" "0.0" + "Swing Rate Passive" "0.0" + "Syringe Darts Passive" "0" + "Thorns Passive" "0" + } + "weapon_rifle" // Syntax: Any weapon class name. Each weapon must be in its own section. + { + // The survivor character affected by the weapon's passives. + // -- + // Minimum: 0 + // Maximum: 7 + // -- + // 0: Nick (Represents Bill in Left 4 Dead 1.) + // 1: Rochelle (Represents Zoey in Left 4 Dead 1.) + // 2: Coach (Represents Francis in Left 4 Dead 1.) + // 3: Ellis (Represents Louis in Left 4 Dead 1.) + // 4: Bill + // 5: Zoey + // 6: Francis + // 7: Louis + "Weapon Character" "-1" + + // The weapon ID assigned to this weapon. + // Note: This setting is only used for internally tracking each melee weapon since they all share the "weapon_melee" class name. + // Note: This setting is only used for internally tracking each weapon to allow stacking passives from multiple sections. + // -- + // Minimum: 0 (OFF) + // Maximum: 400 (Highest) + "Weapon Index" "0" - // The Mutant Special Infected can be used by other Mutant Special Infected who spawn with the Randomization mode feature. - // Note: Do not change this setting if you are unsure of how it works. - // Note: This setting can be overridden for specific players. + // The melee script name assigned to this weapon. + // Note: This setting is only used for internally tracking each melee weapon since they all share the "weapon_melee" class name. + // Note: This setting is only used for internally tracking each weapon to allow stacking passives from multiple sections. // -- - // -1/"ignore"/"exclude"/"filter"/"remove": Let the setting with the same name from each player-controlled Mutant Special Infected's "Random" section decide. - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Random Special" "1" + // Character limit: 32 + "Weapon Name" "" - // Example - "Random Special" "1" - "Random Duration" "99999.0" - "Random Interval" "5.0" + // Allow weapon passives to stack with survivor passives. + // -- + // Add up numbers together for different results. + // -- + // Minimum value for each: 0 + // Maximum value for each: 2147483647 + // -- + // 0: OFF + // 1: Health passive + // 2: Speed boost passive + // 4: Damage boost passive + // 8: Attack boost passive + // 16: Ammo passive + // 32: Item passive (Currently cannot be stacked.) + // 64: God mode passive + // 128: Health and ammo refill passive (Currently cannot be stacked.) + // 256: Respawn passive (Currently cannot be stacked.) + // 512: Infinite ammo passive + // 1023: All above passives + // 1024-2147483647: Reserved for third-party plugins + "Stack Passives" "-1" + + "Passive Enabled" "-1" + "Passive Bots" "-1" + "Passive Notify" "0" + "Action Duration Passive" "0.0" + "Adrenaline Time Passive" "0.0" + "Ammo Boost Passive" "0" + "Ammo Refill Passive" "0" + "Ammo Regen Passive" "0" + "Attack Boost Passive" "0.0" + "Blaze Health Passive" "0" + "Blood Donor Passive" "0" + "Bunny Hop Passive" "0" + "Burst Doors Passive" "0" + "Clean Kills Passive" "0" + "Cluster Bombs Passive" "0" + "Damage Boost Passive" "0.0" + "Damage Resistance Passive" "0.0" + "Dopamine Radius Passive" "0.0" + "Eternal Flames Passive" "0" + "Fast Recovery Passive" "0" + "Fire Rate Passive" "0.0" + "Friendly Fire Passive" "0" + "Ghost Bullets Passive" "0" + "Grenade Launcher Passive" "0.0" + "Heal Percent Passive" "0.0" + "Healthcare Radius Passive" "0.0" + "Health Regen Passive" "0" + "Heartbeat Passive" "0.0" + "Hollowpoint Ammo Passive" "0.0" + "Infinite Ammo Passive" "0" + "Item Passive" "" + "Jump Height Passive" "0.0" + "Ladder Actions Passive" "0" + "Lady Killer Passive" "0.0" + "Laser Sight Passive" "0" + "Life Leech Passive" "0" + "Lucky Bullet Passive" "0.0" + "Medical Cuts Passive" "0" + "Melee Range Passive" "0" + "Midair Dashes Passive" "0" + "Motivation Radius Passive" "0.0" + "Overdose Radius Passive" "0.0" + "Overhealth Passive" "0" + "Pipebomb Duration Passive" "0.0" + "Punch Resistance Passive" "0.0" + "Rapid Pistol Passive" "0.0" + "Recoil Dampener Passive" "0" + "Refill Percent Passive" "0.0" + "Regen Bursts Passive" "0" + "Reload Rate Passive" "0.0" + "Respawn Loadout Passive" "0" + "Revive Health Passive" "0" + "Riot Gear Passive" "0" + "Safety Bubble Passive" "0" + "Shockwave Radius Passive" "0.0" + "Shove Damage Passive" "0.0" + "Shove Penalty Passive" "0" + "Shove Rate Passive" "0.0" + "Sledgehammer Rounds Passive" "0.0" + "Special Ammo Passive" "0" + "Speed Boost Passive" "0.0" + "Sticky Grenades Passive" "0" + "Supplier Passive" "0.0" + "Swing Rate Passive" "0.0" + "Syringe Darts Passive" "0" + "Thorns Passive" "0" + } + "weapon_melee" // Syntax: "weapon_melee" is used for all melee weapons. Each melee weapon must have its own "weapon_melee" section. + { + "Weapon Character" "-1" + "Weapon Index" "0" + "Weapon Name" "" + "Stack Passives" "-1" + "Passive Enabled" "-1" + "Passive Bots" "-1" + "Passive Notify" "0" + "Action Duration Passive" "0.0" + "Adrenaline Time Passive" "0.0" + "Ammo Boost Passive" "0" + "Ammo Refill Passive" "0" + "Ammo Regen Passive" "0" + "Attack Boost Passive" "0.0" + "Blaze Health Passive" "0" + "Blood Donor Passive" "0" + "Bunny Hop Passive" "0" + "Burst Doors Passive" "0" + "Clean Kills Passive" "0" + "Cluster Bombs Passive" "0" + "Damage Boost Passive" "0.0" + "Damage Resistance Passive" "0.0" + "Dopamine Radius Passive" "0.0" + "Eternal Flames Passive" "0" + "Fast Recovery Passive" "0" + "Fire Rate Passive" "0.0" + "Friendly Fire Passive" "0" + "Ghost Bullets Passive" "0" + "Grenade Launcher Passive" "0.0" + "Heal Percent Passive" "0.0" + "Healthcare Radius Passive" "0.0" + "Health Regen Passive" "0" + "Heartbeat Passive" "0.0" + "Hollowpoint Ammo Passive" "0.0" + "Infinite Ammo Passive" "0" + "Item Passive" "" + "Jump Height Passive" "0.0" + "Ladder Actions Passive" "0" + "Lady Killer Passive" "0.0" + "Laser Sight Passive" "0" + "Life Leech Passive" "0" + "Lucky Bullet Passive" "0.0" + "Medical Cuts Passive" "0" + "Melee Range Passive" "0" + "Midair Dashes Passive" "0" + "Motivation Radius Passive" "0.0" + "Overdose Radius Passive" "0.0" + "Overhealth Passive" "0" + "Pipebomb Duration Passive" "0.0" + "Punch Resistance Passive" "0.0" + "Rapid Pistol Passive" "0.0" + "Recoil Dampener Passive" "0" + "Refill Percent Passive" "0.0" + "Regen Bursts Passive" "0" + "Reload Rate Passive" "0.0" + "Respawn Loadout Passive" "0" + "Revive Health Passive" "0" + "Riot Gear Passive" "0" + "Safety Bubble Passive" "0" + "Shockwave Radius Passive" "0.0" + "Shove Damage Passive" "0.0" + "Shove Penalty Passive" "0" + "Shove Rate Passive" "0.0" + "Sledgehammer Rounds Passive" "0.0" + "Special Ammo Passive" "0" + "Speed Boost Passive" "0.0" + "Sticky Grenades Passive" "0" + "Supplier Passive" "0.0" + "Swing Rate Passive" "0.0" + "Syringe Darts Passive" "0" + "Thorns Passive" "0" } } - "Transform" + "Competitive" { - // The Mutant Tank is able to transform again after this many seconds passes. - // Note: This setting only takes effect when the "Spawn Type" setting is set to "3". - // Note: This setting can be overridden for specific players. + // (Co-Op modes only) Mutant Tanks should attack immediately after spawning. + // Note: Do not change this setting if you are unsure of how it works. + // Note: This setting can be used for standard Tanks. + // Note: This setting can be overridden for each Mutant Tank under the "Competitive" section of their settings. // -- - // Minimum: 0.1 + // 0/"disabled"/"false"/"off"/"no": OFF, let the game determine Mutant Tanks' initial behavior. + // 1/"enabled"/"true"/"on"/"yes": ON, force Mutant Tanks to attack immediately. + "Auto Aggravate" "1" + + // Survivors will be credited when damaging Mutant Tanks with fire. + // Note: Do not change this setting if you are unsure of how it works. + // Note: This setting can be used for standard Tanks. + // -- + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Credit Igniters" "1" + + // (Co-Op modes only) Mutant Tanks in ghost mode will be forcefully spawned after this many seconds passes. + // Note: Do not change this setting if you are unsure of how it works. + // Note: This setting can be used for standard Tanks. + // -- + // Minimum: 0.0 (OFF) // Maximum: 99999.0 + "Force Spawn" "0.0" + + // (Co-Op modes only) Mutant Tanks should prioritize throwing rocks. + // Note: Tanks only prioritize throwing rocks on Advanced and Expert modes by default. + // Note: Do not change this setting if you are unsure of how it works. + // Note: This setting can be used for standard Tanks. + // Note: This setting can be overridden for each Mutant Tank under the "Competitive" section of their settings. // -- - // Keywords: - // "milli"/"millisecond" - 0.1 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Transform Delay" "10.0" + // 0/"disabled"/"false"/"off"/"no": OFF, let the game determine Mutant Tanks' attack. + // 1/"enabled"/"true"/"on"/"yes": ON, force Mutant Tanks to prioritize throwing rocks. + "Prioritize Throws" "0" + + // The stasis mode of Mutant Tanks when spawning. + // Note: Do not change this setting if you are unsure of how it works. + // Note: This setting can be used for standard Tanks. + // -- + // 0/"disabled"/"false"/"off"/"no": OFF, let the game determine Mutant Tanks' stasis mode. + // 1/"enabled"/"true"/"on"/"yes": ON, skip stasis mode and spawn Mutant Tanks right away. + "Stasis Mode" "0" - // The Mutant Tank's transformations last this long. - // Note: This setting only takes effect when the "Spawn Type" setting is set to "3". - // Note: This setting can be overridden for specific players. + // (Survival modes only) The delay in seconds before allowing Mutant Tanks to spawn. + // Note: The survival timer starts when the first panic event is triggered, which is the same method used by this setting to delay Mutant Tanks from spawning. + // Note: Do not change this setting if you are unsure of how it works. // -- // Minimum: 0.1 // Maximum: 99999.0 @@ -6363,264 +4282,281 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Transform Duration" "10.0" - - // The types that the Mutant Tank can transform into. - // Note: This setting only takes effect when the "Spawn Type" setting is set to "3". - // Note: This setting can be overridden for specific players. + "Survival Delay" "0.1" + } + "Difficulty" + { + // The damage scales to use for multiplying damage caused by Mutant Tanks. // -- - // Separate game modes with commas (","). + // Separate scales with commas (","). // -- - // Character limit: 50 (including commas) - // Types limit: 10 - // Character limit for each type: 5 + // Scale limit: 4 + // Character limit for each damage scale: 9 // -- - // Example: "1,35,26,4" - // Example: "4,9,49,94,449,499" - // Example: "97,98,99,100,101,102,103,104,105,106" + // Minimum: 0.0 (OFF) + // Maximum: 99999.0 // -- - // Minimum: 1 - // Maximum: 500 - "Transform Types" "1,2,3,4,5,6,7,8,9,10" - - "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" - { - // Note: Override any of the settings in the "Transform" section for each special infected here. + // 1st number = Damage scale for Easy difficulty. + // 2nd number = Damage scale for Normal difficulty. + // 3rd number = Damage scale for Advanced difficulty. + // 4th number = Damage scale for Expert difficulty. + "Difficulty Damage" "0.0,0.0,0.0,0.0" - // Example - "Transform Delay" "10.0" - "Transform Duration" "10.0" - "Transform Types" "1,2,3,4,5,6,7,8,9,10" - } + // Scale all custom damage caused by Mutant Tanks based on the current difficulty. + // -- + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Scale Damage" "0" } - "Props" + "Size" // Note: Only available in Left 4 Dead 2. { - // Props that the Mutant Tank can spawn with. - // Note: This setting can be overridden for specific players. + // The chance to scale common infected size. + // Note: Only available in Left 4 Dead 2. // -- - // Add up numbers together for different results. + // Minimum: 0.0 (No chance) + // Maximum: 100.0 (Highest chance) // -- - // Minimum: 0 - // Maximum: 511 + // Keywords: + // "never" - 0% chance + // "sometimes"/"unlikely"/"seldom" - 33.3% chance + // "maybe" - 50% chance + // "often"/"likely"/"frequently" - 66.6% chance + // "always" - 100% chance + "Infected Chance" "0.0" + + // Scale common infected damage based on size. + // Note: Only available in Left 4 Dead 2. // -- - // 0: OFF - // 1: Attach a blur effect only. - // 2: Attach lights only. - // 4: Attach oxygen tanks only. - // 8: Attach flames to oxygen tanks. - // 16: Attach rocks only. - // 32: Attach tires only. - // 64: Attach a propane tank only. - // 128: Attach a flashlight only. - // 256: Attach a crown only. - "Props Attached" "510" // Default is "462" on Left 4 Dead 1. + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Infected Damage" "1" - // Each prop has this many chances out of 100.0% to appear when the Mutant Tank appears. - // Note: This setting can be overridden for specific players. + // Scale common infected health based on size. + // Note: Only available in Left 4 Dead 2. // -- - // Separate chances with commas (","). + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Infected Health" "1" + + // The scale of common infected's size. + // Note: Only available in Left 4 Dead 2. // -- - // Chances limit: 9 - // Character limit for each chance: 6 + // Separate values with "-". // -- - // Minimum value for each chance: 0.0 (No chance) - // Maximum value for each chance: 100.0 (Highest chance) + // Value limit: 2 + // Character limit for each value: 4 // -- - // 1st number = Chance for a blur effect to appear. - // 2nd number = Chance for lights to appear. - // 3rd number = Chance for oxygen tanks to appear. - // 4th number = Chance for oxygen tank flames to appear. - // 5th number = Chance for rocks to appear. - // 6th number = Chance for tires to appear. - // 7th number = Chance for a propane tank to appear. - // 8th number = Chance for a flashlight to appear. - // 9th number = Chance for a crown to appear. - "Props Chance" "33.3,33.3,33.3,33.3,33.3,33.3,33.3,33.3,33.3" - - // These are the RGBA values of the Mutant Tank's light prop's color. - // Note: The lights will be found on the Tank's mouth and back of hands. - // Note: Any value less than "0" will output a random color. - // Note: This setting can be overridden for specific players. + // Minimum number for each value: 0.0 (OFF) + // Maximum number for each value: 10.0 (Largest) // -- - // 1st number = Red - // 2nd number = Green - // 3rd number = Blue - // 4th number = Alpha - "Light Color" "255,255,255,255" + // 1st number = Minimum value + // 2nd number = Maximum value + "Infected Scale" "0.1-10.0" - // These are the RGBA values of the Mutant Tank's oxygen tank prop's color. - // Note: The oxygen tanks will be found on both outer sides of the Tank's legs. - // Note: Any value less than "0" will output a random color. - // Note: This setting can be overridden for specific players. + // The chance to scale Jockey size. + // Note: Only available in Left 4 Dead 2. // -- - // 1st number = Red - // 2nd number = Green - // 3rd number = Blue - // 4th number = Alpha + // Minimum: 0.0 (No chance) + // Maximum: 100.0 (Highest chance) // -- // Keywords: - // "rainbow" - cycle through colors constantly. - "Oxygen Tank Color" "255,255,255,255" + // "never" - 0% chance + // "sometimes"/"unlikely"/"seldom" - 33.3% chance + // "maybe" - 50% chance + // "often"/"likely"/"frequently" - 66.6% chance + // "always" - 100% chance + "Jockey Chance" "0.0" - // These are the RGBA values of the Mutant Tank's oxygen tank prop's flame's color. - // Note: The flames will be found under the oxygen tanks. - // Note: Any value less than "0" will output a random color. - // Note: This setting can be overridden for specific players. + // Scale Jockey damage based on size. + // Note: Only available in Left 4 Dead 2. // -- - // 1st number = Red - // 2nd number = Green - // 3rd number = Blue - // 4th number = Alpha + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Jockey Damage" "1" + + // Scale Jockey health based on size. + // Note: Only available in Left 4 Dead 2. // -- - // Keywords: - // "rainbow" - cycle through colors constantly. - "Flame Color" "255,255,255,255" + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Jockey Health" "1" - // These are the RGBA values of the Mutant Tank's rock prop's color. - // Note: The rocks will be found all over both of the Tank's arms in random angles. - // Note: Any value less than "0" will output a random color. - // Note: This setting can be overridden for specific players. + // The scale of Jockey's size. + // Note: Only available in Left 4 Dead 2. // -- - // 1st number = Red - // 2nd number = Green - // 3rd number = Blue - // 4th number = Alpha + // Separate values with "-". // -- - // Keywords: - // "rainbow" - cycle through colors constantly. - "Rock Color" "255,255,255,255" - //"Rock Color" "all_tank_rocks" // Alternative (See "Colors" section) - - // This is the model of the Mutant Tank's rocks, which includes the rocks attached to it and the ones that it throws/spawns. - // Note: This setting can be overridden for specific players. + // Value limit: 2 + // Character limit for each value: 4 // -- - // 0: OFF, use default model. - // 1: ON, use tree chunk model. - // 2: ON, switch between both. - "Rock Model" "2" + // Minimum number for each value: 0.0 (OFF) + // Maximum number for each value: 10.0 (Largest) + // -- + // 1st number = Minimum value + // 2nd number = Maximum value + "Jockey Scale" "0.1-10.0" - // These are the RGBA values of the Mutant Tank's tire prop's color. - // Note: The tires will be found on both outer sides of the Tank's legs. - // Note: Any value less than "0" will output a random color. - // Note: This setting can be overridden for specific players. + // The chance to scale Witch size. + // Note: Only available in Left 4 Dead 2. // -- - // 1st number = Red - // 2nd number = Green - // 3rd number = Blue - // 4th number = Alpha + // Minimum: 0.0 (No chance) + // Maximum: 100.0 (Highest chance) // -- // Keywords: - // "rainbow" - cycle through colors constantly. - "Tire Color" "255,255,255,255" + // "never" - 0% chance + // "sometimes"/"unlikely"/"seldom" - 33.3% chance + // "maybe" - 50% chance + // "often"/"likely"/"frequently" - 66.6% chance + // "always" - 100% chance + "Witch Chance" "0.0" - // These are the RGBA values of the Mutant Tank's propane tank prop's color. - // Note: The propane tank will be found on the Tank's head acting like a helmet. - // Note: Any value less than "0" will output a random color. - // Note: This setting can be overridden for specific players. + // Scale Witch damage based on size. + // Note: Only available in Left 4 Dead 2. // -- - // 1st number = Red - // 2nd number = Green - // 3rd number = Blue - // 4th number = Alpha + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Witch Damage" "1" + + // Scale Witch health based on size. + // Note: Only available in Left 4 Dead 2. // -- - // Keywords: - // "rainbow" - cycle through colors constantly. - "Propane Tank Color" "255,255,255,255" + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Witch Health" "1" - // These are the RGBA values of the Mutant Tank's flashlight's color. - // Note: The flashlight will be found above the Tank shining down wherever the Tank is standing. - // Note: Any value less than "0" will output a random color. - // Note: This setting can be overridden for specific players. + // The scale of Witch's size. + // Note: Only available in Left 4 Dead 2. // -- - // 1st number = Red - // 2nd number = Green - // 3rd number = Blue - // 4th number = Alpha + // Separate values with "-". + // -- + // Value limit: 2 + // Character limit for each value: 4 + // -- + // Minimum number for each value: 0.0 (OFF) + // Maximum number for each value: 10.0 (Largest) + // -- + // 1st number = Minimum value + // 2nd number = Maximum value + "Witch Scale" "0.1-10.0" + } + "Health" + { + // Base health given to all Mutant Tanks. + // Note: Tank's health limit on any difficulty is 1,000,000. + // Note: Disable this setting if it conflicts with other plugins. + // Note: Depending on the value of the "Multiply Health" setting, the Mutant Tank's health will be multiplied based on player count. + // Note: This setting can be used for standard Tanks. + // Note: This setting can be overridden for each Mutant Tank under the "Health" section of their settings. + // -- + // Minimum: 0 (OFF) + // Maximum: 1000000 + "Base Health" "0" + + // The characters used to represent the armored health bar of Mutant Tanks. + // Note: This setting only takes effect when the "Display Health" setting is enabled. + // Note: This setting can be used for standard Tanks. + // Note: This setting can be overridden for each Mutant Tank under the "Health" section of their settings. + // -- + // Separate characters with commas (","). // -- - // Keywords: - // "rainbow" - cycle through colors constantly. - "Flashlight Color" "255,255,255,255" + // Character limit: 2 + // Character limit for each character: 1 + // -- + // 1st character = Armor indicator + // 2nd character = Damage indicator + "Armor Characters" "],=" - // These are the RGBA values of the Mutant Tank's crown prop's color. - // Note: The crown will be found above the Tank. - // Note: Any value less than "0" will output a random color. - // Note: This setting can be overridden for specific players. + // This percentage of every Mutant Tank's health is considered as armored health. + // Note: This setting can be used for standard Tanks. + // Note: This setting can be overridden for each Mutant Tank under the "Health" section of their settings. // -- - // 1st number = Red - // 2nd number = Green - // 3rd number = Blue - // 4th number = Alpha - "Crown Color" "255,255,255,255" + // Minimum: 0.0 (OFF) + // Maximum: 1.0 (Full) + "Armor Percentage" "0.0" - "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" - { - // Note: Override any of the settings in the "Props" section for each special infected here. + // Every Mutant Tank's armor blocks this percentage of incoming damage. + // Note: This setting can be used for standard Tanks. + // Note: This setting can be overridden for each Mutant Tank under the "Health" section of their settings. + // -- + // Minimum: 0.0 (God mode) + // Maximum: 1.0 (None) + "Armor Resistance" "0.75" - // Example - "Rock Color" "255,255,255,255" - "Rock Model" "2" - } - } - "Particles" - { - // The particle effects for the Mutant Tank's body. - // Note: This setting can be overridden for specific players. + // The characters used to represent the shield health bar of Mutant Tanks. + // Note: This setting only takes effect when the "Display Health" setting is enabled. + // Note: This setting can be used for standard Tanks. + // Note: This setting can be overridden for each Mutant Tank under the "Health" section of their settings. // -- - // Add up numbers together for different results. + // Separate characters with commas (","). // -- - // Minimum: 0 - // Maximum: 127 + // Character limit: 2 + // Character limit for each character: 1 // -- - // 0: OFF - // 1: Blood Explosion - // 2: Electric Jolt - // 4: Fire Trail - // 8: Ice Steam - // 16: Meteor Smoke - // 32: Smoker Cloud - // 64: Acid Trail (Only available in Left 4 Dead 2.) - "Body Effects" "0" + // 1st character = Shield indicator + // 2nd character = Damage indicator + "Shield Characters" ">,-" - // The particle effects for the Mutant Tank's rock. - // Note: This setting can be overridden for specific players. - // -- - // Add up numbers together for different results. + // This percentage of every Mutant Tank's health is considered as shield health. + // Note: This setting can be used for standard Tanks. + // Note: This setting can be overridden for each Mutant Tank under the "Health" section of their settings. // -- - // Minimum: 0 - // Maximum: 15 + // Minimum: 0.0 (OFF) + // Maximum: 1.0 (Full) + "Shield Percentage" "0.0" + + // Every Mutant Tank's shield regenerates this fast compared to regular or armored health. + // Note: This setting only takes effect when the "Passive Health" setting is enabled. + // Note: This setting can be used for standard Tanks. + // Note: This setting can be overridden for each Mutant Tank under the "Health" section of their settings. // -- - // 0: OFF - // 1: Blood Explosion - // 2: Electric Jolt - // 4: Fire Trail - // 8: Acid Trail (Only available in Left 4 Dead 2.) - "Rock Effects" "0" + // Minimum: 0.0 (OFF) + // Maximum: 1.0 (None) + "Shield Rate" "0.5" - "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" - { - // Note: Override any of the settings in the "Particles" section for each special infected here. + // Every Mutant Tank starts regenerating health passively after this many seconds passes since last taking any damage. + // Note: This setting can be used for standard Tanks. + // Note: This setting can be overridden for each Mutant Tank under the "Health" section of their settings. + // -- + // Minimum: 0.1 + // Maximum: 99999.0 + // -- + // Keywords: + // "milli"/"millisecond" - 0.1 seconds + // "second" - 1 second + // "minute" - 1 minute + // "forever" - 99999 seconds + "Passive Delay" "5.0" - // Example - "Body Effects" "0" - "Rock Effects" "0" - } - } - "Health" - { - // Base health given to all Mutant Tanks. + // The amount of health every Mutant Tank can regenerate passively every X seconds. // Note: Tank's health limit on any difficulty is 1,000,000. // Note: Disable this setting if it conflicts with other plugins. - // Note: Depending on the value of the "Multiply Health" setting, the Mutant Tank's health will be multiplied based on player count. - // Note: This setting overrides the same setting under the "Plugin Settings/Health" section. - // Note: This setting can be overridden for specific players. + // Note: This setting can be used for standard Tanks. + // Note: This setting can be overridden for each Mutant Tank under the "Health" section of their settings. // -- - // Minimum: 0 (OFF) + // Minimum: -1000000 // Maximum: 1000000 - "Base Health" "0" + // -- + // Positive numbers: Current health + Passive health + // Negative numbers: Current health - Passive health + "Passive Health" "0" - // Display the Mutant Tank's name and health. - // Note: This setting overrides the same setting under the "Plugin Settings/Health" section. - // Note: This setting can be overridden for specific players. + // Every Mutant Tank can regenerate health passively every time this many seconds passes. + // Note: This setting can be used for standard Tanks. + // Note: This setting can be overridden for each Mutant Tank under the "Health" section of their settings. + // -- + // Minimum: 0.1 + // Maximum: 99999.0 + // -- + // Keywords: + // "milli"/"millisecond" - 0.1 seconds + // "second" - 1 second + // "minute" - 1 minute + // "forever" - 99999 seconds + "Passive Interval" "1.0" + + // Display Mutant Tanks' names and health. + // Note: This setting can be used for standard Tanks. + // Note: This setting can be overridden for each Mutant Tank under the "Health" section of their settings. // -- // Minimum: 0 // Maximum: 11 @@ -6637,23 +4573,23 @@ // 9: ON, show health percentage and healthbar only. // 10: ON, show name, health, and healthbar. // 11: ON, show name, health percentage, and healthbar. - "Display Health" "0" + "Display Health" "11" - // Display type of the Mutant Tank's names and health. - // Note: This setting overrides the same setting under the "Plugin Settings/Health" section. - // Note: This setting can be overridden for specific players. + // Display type of Mutant Tanks' names and health. + // Note: This setting can be used for standard Tanks. + // Note: This setting can be overridden for each Mutant Tank under the "Health" section of their settings. // -- // 0: OFF // 1: ON, show in hint text. // 2: ON, show in center text. - "Display Health Type" "0" + "Display Health Type" "1" // Extra health given to the Mutant Tank. // Note: Tank's health limit on any difficulty is 1,000,000. // Note: Disable this setting if it conflicts with other plugins. // Note: Depending on the value of the "Multiply Health" setting, the Mutant Tank's health will be multiplied based on player count. - // Note: This setting overrides the same setting under the "Plugin Settings/Health" section. - // Note: This setting can be overridden for specific players. + // Note: This setting can be used for standard Tanks. + // Note: This setting can be overridden for each Mutant Tank under the "Health" section of their settings. // -- // Minimum: -1000000 // Maximum: 1000000 @@ -6662,10 +4598,10 @@ // Negative numbers: Current health - Extra health "Extra Health" "0" - // The characters used to represent the health bar of the Mutant Tank. + // The characters used to represent the health bar of Mutant Tanks. // Note: This setting only takes effect when the "Display Health" setting is enabled. - // Note: This setting overrides the same setting under the "Plugin Settings/Health" section. - // Note: This setting can be overridden for specific players. + // Note: This setting can be used for standard Tanks. + // Note: This setting can be overridden for each Mutant Tank under the "Health" section of their settings. // -- // Separate characters with commas (","). // -- @@ -6674,42 +4610,42 @@ // -- // 1st character = Health indicator // 2nd character = Damage indicator - "Health Characters" "" + "Health Characters" "|,-" - // The health of the Mutant Tank is multiplied by this value. + // The health of Mutant Tanks is multiplied by this value. // Note: Health = Health x Health percentage multiplier // Example: Health = 4000 x 2.5 = 10000 // Note: Use the value "1.0" to disable this setting. (Health x 1.0 = Health) - // Note: This setting overrides the same setting under the "Plugin Settings/Health" section. - // Note: This setting can be overridden for specific players. + // Note: This setting can be used for standard Tanks. + // Note: This setting can be overridden for each Mutant Tank under the "Health" section of their settings. // -- // Minimum: 1.0 // Maximum: 99999.0 - "Health Percentage Multiplier" "0.0" + "Health Percentage Multiplier" "1.0" // The mode of the "Minimum Humans" setting. - // Note: This setting overrides the same setting under the "Plugin Settings/Health" section. - // Note: This setting can be overridden for specific players. + // Note: This setting can be used for standard Tanks. + // Note: This setting can be overridden for each Mutant Tank under the "Health" section of their settings. // -- // 0: Use as a requirement and as a multiplier for multiplying the Tank's health. // 1: Use as a requirement for multiplying the Tank's health. "Human Multiplier Mode" "0" - // The number of human survivors required for the "Multiply Health" setting to take effect. - // Note: This setting overrides the same setting under the "Plugin Settings/Health" section. - // Note: This setting can be overridden for specific players. + // The number of human-controlled survivors required for the "Multiply Health" setting to take effect. + // Note: This setting can be used for standard Tanks. + // Note: This setting can be overridden for each Mutant Tank under the "Health" section of their settings. // -- // Minimum: 1 // Maximum: 32 // -- // 1: OFF, no health multiplication. (Health * 1) - // 2-32: ON, the number of human survivors required to multiply Tank health. (Health * X) - "Minimum Humans" "0" + // 2-32: ON, the number of human-controlled survivors required to multiply Tank health. (Health * X) + "Minimum Humans" "2" - // Multiply the Mutant Tank's health. + // Multiply Mutant Tanks' health. // Note: Health multiplication only occurs when the requirement for the "Minimum Humans" setting is met. - // Note: This setting overrides the same setting under the "Plugin Settings/Health" section. - // Note: This setting can be overridden for specific players. + // Note: This setting can be used for standard Tanks. + // Note: This setting can be overridden for each Mutant Tank under the "Health" section of their settings. // -- // 0: No changes to health. // 1: Multiply original health only. @@ -6725,8 +4661,8 @@ // Note: Boomer's health limit on any difficulty is 1,000,000. // Note: Disable this setting if it conflicts with other plugins. // Note: Depending on the value of the "Multiply Health" setting, the Mutant Boomer's health will be multiplied based on player count. - // Note: This setting overrides the same setting under the "Plugin Settings/Health" section. - // Note: This setting can be overridden for specific players. + // Note: This setting can be used for standard Boomers. + // Note: This setting can be overridden for each Mutant Boomer under the "Health" section of their settings. // -- // Minimum: 0 (OFF) // Maximum: 1000000 @@ -6736,8 +4672,8 @@ // Note: Boomer's health limit on any difficulty is 1,000,000. // Note: Disable this setting if it conflicts with other plugins. // Note: Depending on the value of the "Multiply Health" setting, the Mutant Boomer's health will be multiplied based on player count. - // Note: This setting overrides the same setting under the "Plugin Settings/Health" section. - // Note: This setting can be overridden for specific players. + // Note: This setting can be used for standard Boomers. + // Note: This setting can be overridden for each Mutant Boomer under the "Health" section of their settings. // -- // Minimum: -1000000 // Maximum: 1000000 @@ -6750,8 +4686,8 @@ // Note: Charger's health limit on any difficulty is 1,000,000. // Note: Disable this setting if it conflicts with other plugins. // Note: Depending on the value of the "Multiply Health" setting, the Mutant Charger's health will be multiplied based on player count. - // Note: This setting overrides the same setting under the "Plugin Settings/Health" section. - // Note: This setting can be overridden for specific players. + // Note: This setting can be used for standard Chargers. + // Note: This setting can be overridden for each Mutant Charger under the "Health" section of their settings. // -- // Minimum: 0 (OFF) // Maximum: 1000000 @@ -6761,8 +4697,8 @@ // Note: Charger's health limit on any difficulty is 1,000,000. // Note: Disable this setting if it conflicts with other plugins. // Note: Depending on the value of the "Multiply Health" setting, the Mutant Charger's health will be multiplied based on player count. - // Note: This setting overrides the same setting under the "Plugin Settings/Health" section. - // Note: This setting can be overridden for specific players. + // Note: This setting can be used for standard Chargers. + // Note: This setting can be overridden for each Mutant Charger under the "Health" section of their settings. // -- // Minimum: -1000000 // Maximum: 1000000 @@ -6775,8 +4711,8 @@ // Note: Hunter's health limit on any difficulty is 1,000,000. // Note: Disable this setting if it conflicts with other plugins. // Note: Depending on the value of the "Multiply Health" setting, the Mutant Hunter's health will be multiplied based on player count. - // Note: This setting overrides the same setting under the "Plugin Settings/Health" section. - // Note: This setting can be overridden for specific players. + // Note: This setting can be used for standard Hunters. + // Note: This setting can be overridden for each Mutant Hunter under the "Health" section of their settings. // -- // Minimum: 0 (OFF) // Maximum: 1000000 @@ -6786,8 +4722,8 @@ // Note: Hunter's health limit on any difficulty is 1,000,000. // Note: Disable this setting if it conflicts with other plugins. // Note: Depending on the value of the "Multiply Health" setting, the Mutant Hunter's health will be multiplied based on player count. - // Note: This setting overrides the same setting under the "Plugin Settings/Health" section. - // Note: This setting can be overridden for specific players. + // Note: This setting can be used for standard Hunters. + // Note: This setting can be overridden for each Mutant Hunter under the "Health" section of their settings. // -- // Minimum: -1000000 // Maximum: 1000000 @@ -6800,8 +4736,8 @@ // Note: Jockey's health limit on any difficulty is 1,000,000. // Note: Disable this setting if it conflicts with other plugins. // Note: Depending on the value of the "Multiply Health" setting, the Mutant Jockey's health will be multiplied based on player count. - // Note: This setting overrides the same setting under the "Plugin Settings/Health" section. - // Note: This setting can be overridden for specific players. + // Note: This setting can be used for standard Jockeys. + // Note: This setting can be overridden for each Mutant Jockey under the "Health" section of their settings. // -- // Minimum: 0 (OFF) // Maximum: 1000000 @@ -6811,8 +4747,8 @@ // Note: Jockey's health limit on any difficulty is 1,000,000. // Note: Disable this setting if it conflicts with other plugins. // Note: Depending on the value of the "Multiply Health" setting, the Mutant Jockey's health will be multiplied based on player count. - // Note: This setting overrides the same setting under the "Plugin Settings/Health" section. - // Note: This setting can be overridden for specific players. + // Note: This setting can be used for standard Jockeys. + // Note: This setting can be overridden for each Mutant Jockey under the "Health" section of their settings. // -- // Minimum: -1000000 // Maximum: 1000000 @@ -6825,8 +4761,8 @@ // Note: Smoker's health limit on any difficulty is 1,000,000. // Note: Disable this setting if it conflicts with other plugins. // Note: Depending on the value of the "Multiply Health" setting, the Mutant Smoker's health will be multiplied based on player count. - // Note: This setting overrides the same setting under the "Plugin Settings/Health" section. - // Note: This setting can be overridden for specific players. + // Note: This setting can be used for standard Smokers. + // Note: This setting can be overridden for each Mutant Smoker under the "Health" section of their settings. // -- // Minimum: 0 (OFF) // Maximum: 1000000 @@ -6836,8 +4772,8 @@ // Note: Smoker's health limit on any difficulty is 1,000,000. // Note: Disable this setting if it conflicts with other plugins. // Note: Depending on the value of the "Multiply Health" setting, the Mutant Smoker's health will be multiplied based on player count. - // Note: This setting overrides the same setting under the "Plugin Settings/Health" section. - // Note: This setting can be overridden for specific players. + // Note: This setting can be used for standard Smokers. + // Note: This setting can be overridden for each Mutant Smoker under the "Health" section of their settings. // -- // Minimum: -1000000 // Maximum: 1000000 @@ -6850,8 +4786,8 @@ // Note: Spitter's health limit on any difficulty is 1,000,000. // Note: Disable this setting if it conflicts with other plugins. // Note: Depending on the value of the "Multiply Health" setting, the Mutant Spitter's health will be multiplied based on player count. - // Note: This setting overrides the same setting under the "Plugin Settings/Health" section. - // Note: This setting can be overridden for specific players. + // Note: This setting can be used for standard Spitters. + // Note: This setting can be overridden for each Mutant Spitter under the "Health" section of their settings. // -- // Minimum: 0 (OFF) // Maximum: 1000000 @@ -6861,8 +4797,8 @@ // Note: Spitter's health limit on any difficulty is 1,000,000. // Note: Disable this setting if it conflicts with other plugins. // Note: Depending on the value of the "Multiply Health" setting, the Mutant Spitter's health will be multiplied based on player count. - // Note: This setting overrides the same setting under the "Plugin Settings/Health" section. - // Note: This setting can be overridden for specific players. + // Note: This setting can be used for standard Spitters. + // Note: This setting can be overridden for each Mutant Spitter under the "Health" section of their settings. // -- // Minimum: -1000000 // Maximum: 1000000 @@ -6878,27 +4814,42 @@ "Jockey Base Health" "0" "Smoker Base Health" "0" "Spitter Base Health" "0" - "Display Health" "0" + "Armor Characters" "],=" + "Armor Percentage" "0.0" + "Armor Resistance" "0.75" + "Shield Characters" ">,-" + "Shield Percentage" "0.0" + "Shield Rate" "0.5" + "Passive Delay" "5.0" + "Passive Health" "0" + "Passive Interval" "1.0" + "Display Health" "11" + "Display Health Type" "0" "Boomer Extra Health" "0" "Charger Extra Health" "0" "Hunter Extra Health" "0" "Jockey Extra Health" "0" "Smoker Extra Health" "0" "Spitter Extra Health" "0" - "Display Health Type" "0" - "Health Characters" "" - "Health Percentage Multiplier" "0.0" + "Health Characters" "|,-" + "Health Percentage Multiplier" "1.0" "Human Multiplier Mode" "0" - "Minimum Humans" "0" + "Minimum Humans" "2" "Multiply Health" "0" } + "Mob" // Syntax: "Mob"/"Infected"/"inf" + { + "Display Health" "11" + "Display Health Type" "0" + "Health Characters" "|,-" + } } "Protection" { // The Mutant Tank will have spawn protection for a limited time. // Note: Do not change this setting if you are unsure of how it works. - // Note: This setting overrides the same setting under the "Plugin Settings/Protection" section. - // Note: This setting can be overridden for specific players. + // Note: This setting can be used for standard Tanks. + // Note: This setting can be overridden for each Mutant Tank under the "Protection" section of their settings. // -- // 0: OFF // 1: Spawn with a temporary shield. @@ -6907,8 +4858,8 @@ "Spawn Protection" "0" // The duration of the Mutant Tank's armor for spawn protection. - // Note: This setting overrides the same setting under the "Plugin Settings/Protection" section. - // Note: This setting can be overridden for specific players. + // Note: This setting can be used for standard Tanks. + // Note: This setting can be overridden for each Mutant Tank under the "Protection" section of their settings. // -- // Minimum: 0.1 // Maximum: 99999.0 @@ -6921,16 +4872,16 @@ "Armor Duration" "3.0" // The Mutant Tank's armor blocks this percentage of incoming damage. - // Note: This setting overrides the same setting under the "Plugin Settings/Protection" section. - // Note: This setting can be overridden for specific players. + // Note: This setting can be used for standard Tanks. + // Note: This setting can be overridden for each Mutant Tank under the "Protection" section of their settings. // -- // Minimum: 0.0 (God mode) // Maximum: 1.0 (None) "Armor Resistance" "0.75" // The duration of the Mutant Tank's shield for spawn protection. - // Note: This setting overrides the same setting under the "Plugin Settings/Protection" section. - // Note: This setting can be overridden for specific players. + // Note: This setting can be used for standard Tanks. + // Note: This setting can be overridden for each Mutant Tank under the "Protection" section of their settings. // -- // Minimum: 0.1 // Maximum: 99999.0 @@ -6942,9 +4893,9 @@ // "forever" - 99999 seconds "Shield Duration" "1.0" - // The Mutant Tank's shield blocks this percentage of incoming damage. - // Note: This setting overrides the same setting under the "Plugin Settings/Protection" section. - // Note: This setting can be overridden for specific players. + // The Mutant Tank's shield blocks this percentage of incoming damage. + // Note: This setting can be used for standard Tanks. + // Note: This setting can be overridden for each Mutant Tank under the "Protection" section of their settings. // -- // Minimum: 0.0 (God mode) // Maximum: 1.0 (None) @@ -6964,9 +4915,9 @@ } "Enhancements" { - // The Mutant Tank can only attack every time this many seconds passes. - // Note: This setting overrides the same setting under the "Plugin Settings/Enhancements" section. - // Note: This setting can be overridden for specific players. + // Every Mutant Tank can only attack every time this many seconds passes. + // Note: This setting can be used for standard Tanks. + // Note: This setting can be overridden for each Mutant Tank under the "Enhancements" section of their settings. // -- // OFF: 0.0 // Minimum: 0.1 @@ -6979,9 +4930,17 @@ // "forever" - 99999 seconds "Attack Interval" "0.0" - // The Mutant Tank's claw attacks do this much damage. - // Note: This setting overrides the same setting under the "Plugin Settings/Enhancements" section. - // Note: This setting can be overridden for specific players. + // Every Mutant Tank will automatically bunny hop when jumping. + // Note: This setting can be used for standard Tanks. + // Note: This setting can be overridden for each Mutant Tank under the "Enhancements" section of their settings. + // -- + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Bunny Hop" "0" + + // Every Mutant Tank's claw attacks do this much damage. + // Note: This setting can be used for standard Tanks. + // Note: This setting can be overridden for each Mutant Tank under the "Enhancements" section of their settings. // -- // OFF: -1.0 // Minimum: 0.0 @@ -6993,27 +4952,27 @@ // "strongest" - 99999.0 damage "Claw Damage" "-1.0" - // The Mutant Tank's footsteps cause screen shakes for nearby survivors. + // Every Mutant Tank's footsteps cause screen shakes for nearby survivors. // Note: Both games already do this by default. - // Note: This setting overrides the same setting under the "Plugin Settings/Enhancements" section. - // Note: This setting can be overridden for specific players. + // Note: This setting can be used for standard Tanks. + // Note: This setting can be overridden for each Mutant Tank under the "Enhancements" section of their settings. // -- // 0/"disabled"/"false"/"off"/"no": OFF // 1/"enabled"/"true"/"on"/"yes": ON "Footstep Shake" "0" - // The Mutant Tank's ground pounds hit all survivors within range. + // Every Mutant Tank's ground pounds hit all survivors within range. // Note: Both games already do this by default in Survival modes. - // Note: This setting overrides the same setting under the "Plugin Settings/Enhancements" section. - // Note: This setting can be overridden for specific players. + // Note: This setting can be used for standard Tanks. + // Note: This setting can be overridden for each Mutant Tank under the "Enhancements" section of their settings. // -- // 0/"disabled"/"false"/"off"/"no": OFF // 1/"enabled"/"true"/"on"/"yes": ON "Ground Pound" "0" - // The Mutant Tank's hittables do this much damage. - // Note: This setting overrides the same setting under the "Plugin Settings/Enhancements" section. - // Note: This setting can be overridden for specific players. + // Every Mutant Tank's hittables do this much damage. + // Note: This setting can be used for standard Tanks. + // Note: This setting can be overridden for each Mutant Tank under the "Enhancements" section of their settings. // -- // OFF: -1.0 // Minimum: 0.0 @@ -7029,50 +4988,50 @@ // Note: Damage = Damage x Incap damage multiplier // Example: Damage = 30.0 x 1.5 = 45.0 // Note: Use the value "1.0" to disable this setting. (Damage x 1.0 = Damage) - // Note: This setting overrides the same setting under the "Plugin Settings/Enhancements" section. - // Note: This setting can be overridden for specific players. + // Note: This setting can be used for standard Tanks. + // Note: This setting can be overridden for each Mutant Tank under the "Enhancements" section of their settings. // -- // Minimum: 1.0 // Maximum: 99999.0 - "Incap Damage Multiplier" "0.0" + "Incap Damage Multiplier" "1.0" - // The Mutant Tank becomes intangible while alive. - // Note: This setting overrides the same setting under the "Plugin Settings/Enhancements" section. - // Note: This setting can be overridden for specific players. + // Every Mutant Tank becomes intangible while alive. + // Note: This setting can be used for standard Tanks. + // Note: This setting can be overridden for each Mutant Tank under the "Enhancements" section of their settings. // -- // 0/"disabled"/"false"/"off"/"no": OFF // 1/"enabled"/"true"/"on"/"yes": ON "Intangible Body" "0" - // The mode of how melee hits affect the Mutant Tank. + // The mode of how melee hits affect every Mutant Tank. // Note: If set to "1" then the formula is Damage = Max health x Melee hit value // Example: Damage = 5000.0 x 0.05 = 250.0 // Note: If set to "2" then the formula is Damage = Melee hit value // Example: Damage = 500.0 - // Note: This setting overrides the same setting under the "Plugin Settings/Enhancements" section. - // Note: This setting can be overridden for specific players. + // Note: This setting can be used for standard Tanks. + // Note: This setting can be overridden for each Mutant Tank under the "Enhancements" section of their settings. // -- // 0: OFF // 1: ON, melee hits deal damage based on a percentage of the Mutant Tank's max health. // 2: ON, melee hits deal damage based on a certain amount. "Melee Hit Mode" "0" - // The value of melee hits against the Mutant Tank. + // The value of melee hits against every Mutant Tank. // Note: The value of the "Melee Hit Mode" setting determines how the value of this setting is applied. // Note: If "Melee Hit Mode" is set to "1" use values between "0.0" and "1.0". // Example: 0.05 // Note: If "Melee Hit Mode" is set to "2" use values between "0.0" and "99999.0". // Example: 500.0 - // Note: This setting overrides the same setting under the "Plugin Settings/Enhancements" section. - // Note: This setting can be overridden for specific players. + // Note: This setting can be used for standard Tanks. + // Note: This setting can be overridden for each Mutant Tank under the "Enhancements" section of their settings. // -- // Minimum: 0.0 (OFF) // Maximum: 99999.0 (Strongest) "Melee Hit Value" "0.0" - // The Mutant Tank's punches have this much force. - // Note: This setting overrides the same setting under the "Plugin Settings/Enhancements" section. - // Note: This setting can be overridden for specific players. + // Every Mutant Tank's punches have this much force. + // Note: This setting can be used for standard Tanks. + // Note: This setting can be overridden for each Mutant Tank under the "Enhancements" section of their settings. // -- // OFF: -1.0 // Minimum: 0.0 @@ -7084,9 +5043,9 @@ // "strongest" - 99999.0 force "Punch Force" "-1.0" - // The Mutant Tank has this many chances out of 100.0% to punch and throw a rock simultaneously. - // Note: This setting overrides the same setting under the "Plugin Settings/Enhancements" section. - // Note: This setting can be overridden for specific players. + // Every Mutant Tank has this many chances out of 100.0% to punch and throw a rock simultaneously. + // Note: This setting can be used for standard Tanks. + // Note: This setting can be overridden for each Mutant Tank under the "Enhancements" section of their settings. // -- // Minimum: 0.0 (No chance) // Maximum: 100.0 (Highest chance) @@ -7099,9 +5058,9 @@ // "always" - 100% chance "Punch Throw" "0.0" - // The Mutant Tank's rock throws do this much damage. - // Note: This setting overrides the same setting under the "Plugin Settings/Enhancements" section. - // Note: This setting can be overridden for specific players. + // Every Mutant Tank's rock throws do this much damage. + // Note: This setting can be used for standard Tanks. + // Note: This setting can be overridden for each Mutant Tank under the "Enhancements" section of their settings. // -- // OFF: -1.0 // Minimum: 0.0 @@ -7113,55 +5072,55 @@ // "strongest" - 99999.0 damage "Rock Damage" "-1.0" - // The Mutant Tank's rock throws play a sound loop. + // Every Mutant Tank's rock throws play a sound loop. // Note: Both games already do this by default. - // Note: This setting overrides the same setting under the "Plugin Settings/Enhancements" section. - // Note: This setting can be overridden for specific players. + // Note: This setting can be used for standard Tanks. + // Note: This setting can be overridden for each Mutant Tank under the "Enhancements" section of their settings. // -- // 0/"disabled"/"false"/"off"/"no": OFF // 1/"enabled"/"true"/"on"/"yes": ON "Rock Sound" "0" - // Set the Mutant Tank's run speed. + // Set every Mutant Tank's run speed. // Note: Default run speed is 1.0. - // Note: This setting overrides the same setting under the "Plugin Settings/Enhancements" section. - // Note: This setting can be overridden for specific players. + // Note: This setting can be used for standard Tanks. + // Note: This setting can be overridden for each Mutant Tank under the "Enhancements" section of their settings. // -- // OFF: 0.0 // Minimum: 0.1 // Maximum: 99.0 "Run Speed" "0.0" - // Skip the Mutant Tank's dying animation. - // Note: This setting overrides the same setting under the "Plugin Settings/Enhancements" section. - // Note: This setting can be overridden for specific players. + // Skip every Mutant Tank's dying animation. + // Note: This setting can be used for standard Tanks. + // Note: This setting can be overridden for each Mutant Tank under the "Enhancements" section of their settings. // -- // 0/"disabled"/"false"/"off"/"no": OFF // 1/"enabled"/"true"/"on"/"yes": ON "Skip Incap" "0" - // Skip the Mutant Tank's taunting animation after incapacitating survivors and when climbing. - // Note: This setting overrides the same setting under the "Plugin Settings/Enhancements" section. - // Note: This setting can be overridden for specific players. + // Skip every Mutant Tank's taunting animation after incapacitating survivors and when climbing. + // Note: This setting can be used for standard Tanks. + // Note: This setting can be overridden for each Mutant Tank under the "Enhancements" section of their settings. // -- // 0/"disabled"/"false"/"off"/"no": OFF // 1/"enabled"/"true"/"on"/"yes": ON "Skip Taunt" "0" - // The Mutant Tank's punches hit all survivors within range. + // Every Mutant Tank's punches hit all survivors within range. // Note: Both games already do this by default in Versus and Survival modes. - // Note: This setting overrides the same setting under the "Plugin Settings/Enhancements" section. - // Note: This setting can be overridden for specific players. + // Note: This setting can be used for standard Tanks. + // Note: This setting can be overridden for each Mutant Tank under the "Enhancements" section of their settings. // -- // 0/"disabled"/"false"/"off"/"no": OFF // 1/"enabled"/"true"/"on"/"yes": ON "Sweep Fist" "0" - // The Mutant Tank's rock throws have this much force. + // Every Mutant Tank's rock throws have this much force. // Note: Low values like "500.0" and high values like "5000.0" will cause rocks to miss by a huge margin. This is a game limitation, not a plugin issue. // Note: The value "1000.0" has been tested to be a stable value for the Tank's rock throw force. - // Note: This setting overrides the same setting under the "Plugin Settings/Enhancements" section. - // Note: This setting can be overridden for specific players. + // Note: This setting can be used for standard Tanks. + // Note: This setting can be overridden for each Mutant Tank under the "Enhancements" section of their settings. // -- // OFF: -1.0 // Minimum: 0.0 @@ -7173,9 +5132,9 @@ // "strongest" - 99999.0 force "Throw Force" "-1.0" - // The Mutant Tank throws a rock every time this many seconds passes. - // Note: This setting overrides the same setting under the "Plugin Settings/Enhancements" section. - // Note: This setting can be overridden for specific players. + // Every Mutant Tank throws a rock every time this many seconds passes. + // Note: This setting can be used for standard Tanks. + // Note: This setting can be overridden for each Mutant Tank under the "Enhancements" section of their settings. // -- // OFF: 0.0 // Minimum: 0.1 @@ -7188,12 +5147,12 @@ // "forever" - 99999 seconds "Throw Interval" "0.0" - // The Mutant Tank throws a rock when using its rock throw ability. - // Note: This just throws a second rock for the Tank. - // Note: This can disrupt the default ability or free the survivor victim of the Charger/Hunter/Jockey/Smoker. - // Note: Do not change this setting if you want to preserve the default abilities of the Charger/Hunter/Jockey/Smoker. - // Note: This setting overrides the same setting under the "Plugin Settings/Enhancements" section. - // Note: This setting can be overridden for specific players. + // Every Mutant Tank throws a rock when using its rock throw ability. + // Note: This just throws a second rock for every Tank. + // Note: This can disrupt the default ability or free the survivor victim of every Charger/Hunter/Jockey/Smoker. + // Note: Do not change this setting if you want to preserve the default abilities of every Charger/Hunter/Jockey/Smoker. + // Note: This setting can be used for standard Tanks. + // Note: This setting can be overridden for each Mutant Tank under the "Enhancements" section of their settings. // -- // 0/"disabled"/"false"/"off"/"no": OFF // 1/"enabled"/"true"/"on"/"yes": ON @@ -7203,9 +5162,9 @@ { // Note: Override any of the settings in the "Enhancements" section for each special infected here. - // The Mutant Special Infected's pins (Smoker grab, Hunter pounce, Jockey ride, Charger impact) do this much damage. - // Note: This setting overrides the same setting under the "Plugin Settings/Enhancements" section. - // Note: This setting can be overridden for specific players. + // Every Mutant Special Infected's pins (Smoker grab, Hunter pounce, Jockey ride, Charger impact) do this much damage. + // Note: This setting can be used for standard Special Infected. + // Note: This setting can be overridden for each Mutant Special Infected under the "Enhancements" section of their settings. // -- // OFF: -1.0 // Minimum: 0.0 @@ -7217,9 +5176,9 @@ // "strongest" - 99999.0 damage "Pin Damage" "-1.0" - // The Mutant Special Infected uses its special ability every time this many seconds passes. - // Note: This setting overrides the same setting under the "Plugin Settings/Enhancements" section. - // Note: This setting can be overridden for specific players. + // Every Mutant Special Infected uses their special ability every time this many seconds passes. + // Note: This setting can be used for standard Special Infected. + // Note: This setting can be overridden for each Mutant Special Infected under the "Enhancements" section of their settings. // -- // OFF: 0.0 // Minimum: 0.1 @@ -7234,8 +5193,9 @@ // Example "Attack Interval" "0.0" + "Bunny Hop" "0" "Claw Damage" "-1.0" - "Incap Damage Multiplier" "0.0" + "Incap Damage Multiplier" "1.0" "Intangible Body" "0" "Melee Hit Mode" "0" "Melee Hit Value" "0.0" @@ -7247,49 +5207,49 @@ } "Immunities" { - // Give the Mutant Tank bullet immunity. - // Note: This setting overrides the same setting under the "Plugin Settings/Immunities" section. - // Note: This setting can be overridden for specific players. + // Give Mutant Tanks bullet immunity. + // Note: This setting can be used for standard Tanks. + // Note: This setting can be overridden for each Mutant Tank under the "Immunities" section of their settings. // -- // 0/"disabled"/"false"/"off"/"no": OFF // 1/"enabled"/"true"/"on"/"yes": ON "Bullet Immunity" "0" - // Give the Mutant Tank explosive immunity. - // Note: This setting overrides the same setting under the "Plugin Settings/Immunities" section. - // Note: This setting can be overridden for specific players. + // Give Mutant Tanks explosive immunity. + // Note: This setting can be used for standard Tanks. + // Note: This setting can be overridden for each Mutant Tank under the "Immunities" section of their settings. // -- // 0/"disabled"/"false"/"off"/"no": OFF // 1/"enabled"/"true"/"on"/"yes": ON "Explosive Immunity" "0" - // Give the Mutant Tank fire immunity. - // Note: This setting overrides the same setting under the "Plugin Settings/Immunities" section. - // Note: This setting can be overridden for specific players. + // Give Mutant Tanks fire immunity. + // Note: This setting can be used for standard Tanks. + // Note: This setting can be overridden for each Mutant Tank under the "Immunities" section of their settings. // -- // 0/"disabled"/"false"/"off"/"no": OFF // 1/"enabled"/"true"/"on"/"yes": ON "Fire Immunity" "0" - // Give the Mutant Tank hittable immunity. - // Note: This setting overrides the same setting under the "Plugin Settings/Immunities" section. - // Note: This setting can be overridden for specific players. + // Give Mutant Tanks hittable immunity. + // Note: This setting can be used for standard Tanks. + // Note: This setting can be overridden for each Mutant Tank under the "Immunities" section of their settings. // -- // 0/"disabled"/"false"/"off"/"no": OFF // 1/"enabled"/"true"/"on"/"yes": ON "Hittable Immunity" "0" - // Give the Mutant Tank melee immunity. - // Note: This setting overrides the same setting under the "Plugin Settings/Immunities" section. - // Note: This setting can be overridden for specific players. + // Give Mutant Tanks melee immunity. + // Note: This setting can be used for standard Tanks. + // Note: This setting can be overridden for each Mutant Tank under the "Immunities" section of their settings. // -- // 0/"disabled"/"false"/"off"/"no": OFF // 1/"enabled"/"true"/"on"/"yes": ON "Melee Immunity" "0" - // Give the Mutant Tank vomit immunity. - // Note: This setting overrides the same setting under the "Plugin Settings/Immunities" section. - // Note: This setting can be overridden for specific players. + // Give Mutant Tanks vomit immunity. + // Note: This setting can be used for standard Tanks. + // Note: This setting can be overridden for each Mutant Tank under the "Immunities" section of their settings. // -- // 0/"disabled"/"false"/"off"/"no": OFF // 1/"enabled"/"true"/"on"/"yes": ON @@ -7308,83 +5268,27 @@ "Vomit Immunity" "0" } } - } -} -``` -
- -#### Abilities Set #1 (A-L) - -##### Absorb Ability -
- Click to expand! - -``` -"Mutant Tanks" -{ - "Tank #1" - { - // The Mutant Tank absorbs most of the damage it receives. - // Requires "mt_abilities.smx" to be compiled with "mt_absorb.sp" to work. - "Absorb Ability" + "Administration" { - // Admins with one or more of these access flags have access to this ability. - // Note: This setting can be overridden for specific players. - // -- - // Empty: No access flags have access. - // Not empty: These access flags have access. - "Access Flags" "" - - // Admins with one or more of these immunity flags are immune to this ability's effects. - // Note: If the Mutant Tank has one or more of these immunity flags or has the same immunity flags as the survivor victim, the immunity is cancelled. - // Note: This setting can be overridden for specific players. - // -- - // Empty: No immunity flags are immune. - // Not empty: These immunity flags are immune. - "Immunity Flags" "" - - // The ability can only activate in close areas. - // Note: Do not change this setting if you are unsure of how it works. - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0.0 (OFF) - // Maximum: 99999.0 (Farthest) - // -- - // Keywords: - // "disabled"/"false"/"off"/"no" - 0.0 range - // "farthest" - 99999.0 range - "Close Areas Only" "0.0" - - // Use this ability in conjunction with other abilities. - // Note: Only use this when "Spawn Type" is set to "4" for the Mutant Tank. - // Note: This setting does not affect human-controlled Mutant Tanks unless the "Human Ability" setting is set to "2". - // Note: This setting can be overridden for specific players. - // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Combo Ability" "0" - - // Allow human-controlled Mutant Tanks to use this ability. - // Note: This setting can be overridden for specific players. - // -- - // 0: OFF - // 1: ON, players can use buttons to activate abilities. - // 2: ON, abilities will activate automatically. - "Human Ability" "0" - - // Determines how many times human-controlled Mutant Tanks can use their abilities in one life. - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0 - // Maximum: 99999 + // Admins with one or more of these access flags have access to all Mutant Tank types. + // Note: This setting can be overridden for each Mutant Tank under the "Administration" section of their settings. // -- - // Keywords: - // "none"/"off" - 0 ammo - // "infinite" - 99999 ammo - "Human Ammo" "5" + // Empty: No access flags have access. + // Not empty: These access flags have access. + "Access Flags" "" - // Human-controlled Mutant Tanks must wait this long before using their abilities again. - // Note: This setting can be overridden for specific players. + // Admins with one or more of these immunity flags are immune to all Mutant Tanks' attacks. + // Note: This setting can be overridden for each Mutant Tank under the "Administration" section of their settings. + // -- + // Empty: No immunity flags are immune. + // Not empty: These immunity flags are immune. + "Immunity Flags" "" + } + "Human Support" + { + // Human-controlled Mutant Tanks must wait this long before changing their current Mutant Tank type. + // Note: Cooldowns are only valid for the current round that they are activated on. + // Note: Players with the "mt_adminversus" override will be immune to this cooldown. // -- // Minimum: 0 (OFF) // Maximum: 99999 (Longest) @@ -7394,470 +5298,491 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Human Cooldown" "0" + "Human Cooldown" "600" - // The Mutant Tank's ability effects last this long. - // Note: This setting does not affect human-controlled Mutant Tanks unless the "Human Mode" setting is set to "0". - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0 - // Maximum: 99999 + // Human-controlled Mutant Tanks are exempted from cooldowns when using the "sm_mutanttank"/"sm_mtank" command to switch their current Mutant Tank type. + // Note: Do not change this setting if you are unsure of how it works. // -- - // Keywords: - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Human Duration" "5" + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Master Control" "0" - // The mode of how human-controlled Mutant Tanks activate their abilities. - // Note: This setting can be overridden for specific players. + // The mode of how human-controlled Tanks spawn. + // Note: Do not change this setting if you are unsure of how it works. // -- - // 0: Press buttons to activate corresponding abilities. Cooldown starts after ability is activated. - // 1: Hold down buttons to keep corresponding abilities activated. Cooldown starts after the player lets go of the buttons. - "Human Mode" "1" + // 0: Spawn as a default Tank with access to the "sm_mutanttank"/"sm_mtank" command. + // 1: Spawn as a Mutant Tank with access to the "sm_mutanttank"/"sm_mtank" command. + // 2: Spawn as a Mutant Tank without access to the "sm_mutanttank"/"sm_mtank" command. + // 3: Same as 0, but the "sm_mutanttank"/"sm_mtank" command is available at anytime. + // 4: Same as 1, but the "sm_mutanttank"/"sm_mtank" command is available at anytime. + "Spawn Mode" "2" + } + "Waves" + { + // Limit Tank spawns according to Mutant Tanks' limits. + // Note: Set this setting to "0" for maps like Tank Challenge or Tanks Playground. + // Note: Do not change this setting if you are unsure of how it works. + // -- + // 0/"disabled"/"false"/"off"/"no": OFF, let the game, map, or other plugins determine the limit. + // 1/"enabled"/"true"/"on"/"yes": ON, let Mutant Tanks limit Tank spawns. + "Limit Extras" "1" - // The ability can only activate in open areas. + // The delay in seconds before spawning an extra Tank. // Note: Do not change this setting if you are unsure of how it works. - // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.0 (OFF) - // Maximum: 99999.0 (Farthest) + // Minimum: 0.1 + // Maximum: 99999.0 // -- // Keywords: - // "disabled"/"false"/"off"/"no" - 0.0 range - // "farthest" - 99999.0 range - "Open Areas Only" "0.0" + // "milli"/"millisecond" - 0.1 seconds + // "second" - 1 second + // "minute" - 1 minute + // "forever" - 99999 seconds + "Extras Delay" "0.1" - // The ability is only effective toward human survivors. - // Note: This setting can be overridden for specific players. + // Spawn this many Tanks on non-finale maps periodically. + // Note: Leave this off if you have a Multi-Tanks plugin installed that handles the limit. // -- // Minimum: 0 // Maximum: 32 // -- - // 0: OFF - // 1-32: ON, the number of human survivors required to be present for this ability to be effective. - "Requires Humans" "1" - - // Enable this ability. - // Note: This setting can be overridden for specific players. - // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Ability Enabled" "0" - - // Display a message whenever the ability activates/deactivates. - // Note: This setting can be overridden for specific players. - // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Ability Message" "0" + // 0: OFF, no limit (only one Tank will spawn). + // 1-32: ON, the number of Tanks that will spawn. + "Regular Amount" "0" - // The bullet damage received by the Mutant Tank is divided by this value. - // Note: Damage = Bullet damage/Absorb bullet divisor - // Example: Damage = 30.0/20.0 (1.5) - // Note: Use the value "1.0" to disable this setting. (Bullet damage/1.0 = Bullet damage) - // Note: This setting can be overridden for specific players. + // The delay in seconds before the regular wave spawner starts. + // Note: The delay starts after a survivor leaves the saferoom. // -- - // Minimum: 1.0 + // Minimum: 0.1 // Maximum: 99999.0 - "Absorb Bullet Divisor" "20.0" - - // The Mutant Tank has this many chances out of 100.0% to trigger the ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0.0 (No chance) - // Maximum: 100.0 (Highest chance) - // -- - // Keywords: - // "never" - 0% chance - // "sometimes"/"unlikely"/"seldom" - 33.3% chance - // "maybe" - 50% chance - // "often"/"likely"/"frequently" - 66.6% chance - // "always" - 100% chance - "Absorb Chance" "33.3" - - // This percentage of the Mutant Tank's absorbed damage is converted into armored health. - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0.0 (OFF) - // Maximum: 1.0 (Full) - "Absorb Convert Percentage" "0.0" - - // The cooldown for the Mutant Tank's ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0 (OFF) - // Maximum: 99999 (Longest) // -- // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds + // "milli"/"millisecond" - 0.1 seconds // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Absorb Cooldown" "0" + "Regular Delay" "10.0" - // The Mutant Tank's ability effects last this long. - // Note: This is ignored when the "Combo Ability" setting is set to "1". - // Note: This setting can be overridden for specific players. + // Spawn Tanks on non-finale maps every time this many seconds passes. + // Note: This will not work unless the "Regular Mode" setting is set to "1". + // Note: The timer for this interval will stop when there is at least one Tank alive on the map. + // Note: The timer for this interval will restart once every Tank on the map is dead. // -- - // Minimum: 0 - // Maximum: 99999 + // Minimum: 0.1 + // Maximum: 99999.0 // -- // Keywords: + // "milli"/"millisecond" - 0.1 seconds // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Absorb Duration" "5" + "Regular Interval" "300.0" - // The explosive damage received by the Mutant Tank is divided by this value. - // Note: Damage = Explosive damage/Absorb explosive divisor - // Example: Damage = 30.0/20.0 (1.5) - // Note: Use the value "1.0" to disable this setting. (Explosive damage/1.0 = Explosive damage) - // Note: This setting can be overridden for specific players. + // How many waves of Tanks can spawn before the regular wave spawner stops. + // Note: All Tanks from a previous wave must die before more waves of Tanks can spawn. + // Note: This will not work unless the "Regular Mode" setting is set to "1". + // Note: Do not change this setting if you are unsure of how it works. // -- - // Minimum: 1.0 - // Maximum: 99999.0 - "Absorb Explosive Divisor" "20.0" + // 0: OFF + // 1-99999: Only allow this number of waves. + "Regular Limit" "99999" - // The fire damage received by the Mutant Tank is divided by this value. - // Note: Damage = Fire damage/Absorb fire divisor - // Example: Damage = 300.0/200.0 (1.5) - // Note: Use the value "1.0" to disable this setting. (Fire damage/1.0 = Fire damage) - // Note: This setting can be overridden for specific players. + // The mode of the regular wave spawner. + // Note: This setting does not need the "Regular Wave" setting to be enabled. + // Note: Do not change this setting if you are unsure of how it works. // -- - // Minimum: 1.0 - // Maximum: 99999.0 - "Absorb Fire Divisor" "200.0" + // 0: Wait for a Tank to spawn before spawning extra Tanks and use the global "Type Range" setting. (Recommended) + // 1: Use "Regular Wave" to spawn Tanks and use the "Regular Type" setting. + "Regular Mode" "0" - // The hittable damage received by the Mutant Tank is divided by this value. - // Note: Damage = Hittable damage/Absorb hittable divisor - // Example: Damage = 30.0/20.0 (1.5) - // Note: Use the value "1.0" to disable this setting. (Hittable damage/1.0 = Hittable damage) - // Note: This setting can be overridden for specific players. + // The type of Mutant Tank that will spawn. + // Note: This will not work unless the "Regular Mode" setting is set to "1". // -- - // Minimum: 1.0 - // Maximum: 99999.0 - "Absorb Hittable Divisor" "20.0" - - // The melee damage received by the Mutant Tank is divided by this value. - // Note: Damage = Melee damage/Absorb melee divisor - // Example: Damage = 300.0/200.0 (1.5) - // Note: Use the value "1.0" to disable this setting. (Melee damage/1.0 = Melee damage) - // Note: This setting can be overridden for specific players. + // Separate values with "-". // -- - // Minimum: 1.0 - // Maximum: 99999.0 - "Absorb Melee Divisor" "200.0" - - "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" - { - // Note: Override any of the settings in the "Absorb Ability" section for each special infected here. - - // Example - "Access Flags" "" - "Immunity Flags" "" - "Close Areas Only" "0.0" - "Combo Ability" "0" - "Human Ability" "0" - "Human Ammo" "5" - "Human Cooldown" "0" - "Human Duration" "5" - "Human Mode" "1" - "Open Areas Only" "0.0" - "Requires Humans" "1" - "Ability Enabled" "0" - "Ability Message" "0" - "Absorb Bullet Divisor" "20.0" - "Absorb Chance" "33.3" - "Absorb Convert Percentage" "0.0" - "Absorb Cooldown" "0" - "Absorb Duration" "5" - "Absorb Explosive Divisor" "20.0" - "Absorb Fire Divisor" "200.0" - "Absorb Hittable Divisor" "20.0" - "Absorb Melee Divisor" "200.0" - } - } - } -} -``` -
- -##### Acid Ability -
- Click to expand! + // Value limit: 2 + // Character limit for each value: 4 + // -- + // Minimum number for each value: -1 (OFF) + // Maximum number for each value: 500 + // -- + // 1st number = Minimum value + // 2nd number = Maximum value + // -- + // Example: "0-0" (Do not choose from any Mutant Tank types.) + // Example: "1-25" (Choose a Mutant Tank type between 1 through 25.) + // Example: "50-0" (Automatically change to "0-0" because "50" is higher than "0".) + // Example: "1-1000" (Automatically change to "1-500" because "500" is the maximum number of Mutant Tank types allowed.) + // Example: "0" (Automatically change to "0-500" because the maximum range is not specified.) + // Example: "1000" (Automatically change to "500-500" because the maximum range is not specified and the minimum range exceeds the "500" limit.) + // -- + // 0: OFF, use standard Tanks. + // 1-500: ON, the type that will spawn. + "Regular Type" "1-500" -``` -"Mutant Tanks" -{ - "Tank #1" - { - // The Mutant Tank creates acid puddles. - // "Ability Enabled" - When a survivor is within range of the Mutant Tank, an acid puddle is created underneath the survivor. - // - "Acid Range" - // - "Acid Range Chance" - // - "Acid Range Cooldown" - // "Acid Death" - When the Mutant Tank dies or spawns, an acid puddle is created underneath the Mutant Tank. - // - "Acid Death Chance" - // - "Acid Death Range" - // "Acid Hit" - When a survivor is hit by the Mutant Tank's claw or rock, or a survivor hits the Mutant Tank with a melee weapon, an acid puddle is created underneath the survivor. - // - "Acid Chance" - // - "Acid Cooldown" - // - "Acid Hit Mode" - // "Acid Rock Break" - When the Mutant Tank's rock breaks, it creates an acid puddle. - // - "Acid Rock Chance" - // - "Acid Rock Cooldown" - // Requires "mt_abilities.smx" to be compiled with "mt_acid.sp" to work. - // Note: Only available in Left 4 Dead 2. - "Acid Ability" - { - // Admins with one or more of these access flags have access to this ability. - // Note: This setting can be overridden for specific players. + // Spawn Tanks on non-finale maps periodically. + // Note: The timer starts after "Regular Delay" is up. + // Note: Leave this off if you want a generic spawn rate for Tanks or if you have a Multi-Tanks plugin installed. + // Note: This will not work unless the "Regular Mode" setting is set to "1". // -- - // Empty: No access flags have access. - // Not empty: These access flags have access. - "Access Flags" "" + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Regular Wave" "0" - // Admins with one or more of these immunity flags are immune to this ability's effects. - // Note: If the Mutant Tank has one or more of these immunity flags or has the same immunity flags as the survivor victim, the immunity is cancelled. - // Note: This setting can be overridden for specific players. + // Allow this many Tanks on finale maps to spawn regardless of the current wave. + // Note: This is checked instead of "Finale Waves" if set to anything greater than 0. // -- - // Empty: No immunity flags are immune. - // Not empty: These immunity flags are immune. - "Immunity Flags" "" + // Minimum: 0 + // Maximum: 32 + // -- + // 0: OFF, no limit (no Tanks will be kicked by this setting). + // 1-32: ON, the number of Tanks that are allowed to spawn (unless the limit for "Finale Waves" is lower). + "Finale Amount" "0" - // The ability can only activate in close areas. + // The mode of the finale wave spawner. // Note: Do not change this setting if you are unsure of how it works. - // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.0 (OFF) - // Maximum: 99999.0 (Farthest) + // 0: Use the global "Type Range" setting. (Recommended) + // 1: Use the "Finale Types" setting. + "Finale Mode" "0" + + // The types of Mutant Tanks that can spawn in each wave. + // Note: If the chosen type is not available, a random type will be chosen in its place. // -- - // Keywords: - // "disabled"/"false"/"off"/"no" - 0.0 range - // "farthest" - 99999.0 range - "Close Areas Only" "0.0" + // Separate types per wave with commas (","). + // Separate values with "-". + // -- + // Wave limit: 11 + // Character limit for each wave: 10 + // -- + // Minimum value for each wave: -1 (OFF) + // Maximum value for each wave: 500 + // -- + // 1st number = Minimum value + // 2nd number = Maximum value + // -- + // Example: "0-0" (Do not choose from any Mutant Tank types.) + // Example: "1-25" (Choose a Mutant Tank type between 1 through 25.) + // Example: "50-0" (Automatically change to "0-0" because "50" is higher than "0".) + // Example: "1-1000" (Automatically change to "1-500" because "500" is the maximum number of Mutant Tank types allowed.) + // Example: "0" (Automatically change to "0-500" because the maximum range is not specified.) + // Example: "1000" (Automatically change to "500-500" because the maximum range is not specified and the minimum range exceeds the "500" limit.) + // -- + // 0: OFF, use standard Tanks. + // 1-500: ON, the type that will spawn. + "Finale Types" "1-500,1-500,1-500,1-500,1-500,1-500,1-500,1-500,1-500,1-500,1-500" - // Use this ability in conjunction with other abilities. - // Note: Only use this when "Spawn Type" is set to "4" for the Mutant Tank. - // Note: This setting does not affect human-controlled Mutant Tanks unless the "Human Ability" setting is set to "2". - // Note: This setting can be overridden for specific players. + // Number of Tanks to spawn for each finale wave. + // Note: This setting does not seem to work on the official Left 4 Dead 1 campaigns' finale maps in Left 4 Dead 2. They have their own finale scripts which limit the number of Tanks to 1 for each wave. + // Note: Use Silvers' "VScript File Replacer" plugin to raise the Tank limits on Left 4 Dead 1 campaign finale maps so this setting can work. + // Link: https://forums.alliedmods.net/showthread.php?t=318024 + // -- + // Separate waves with commas (","). + // -- + // Wave limit: 11 + // Character limit for each wave: 3 + // -- + // Minimum value for each wave: 1 + // Maximum value for each wave: 32 + // -- + // 1st number = 0th wave (Before finale event starts.) + // 2nd number = 1st wave + // 3rd number = 2nd wave + // 4th number = 3rd wave + // 5th number = 4th wave + // 6th number = 5th wave + // 7th number = 6th wave + // 8th number = 7th wave + // 9th number = 8th wave + // 10th number = 9th wave + // 11th number = 10th wave + // -- + // 0: OFF, no limit. + // 1-32: ON, the number of Tanks that will spawn. + "Finale Waves" "0,0,0,0,0,0,0,0,0,0,0" + } + "Rush" + { + // Enable Tank Rush mode. + // -- + // Add up numbers together for different results. + // -- + // Minimum: 0 + // Maximum: 127 // -- // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Combo Ability" "0" + // 1: Tank Rush - Tanks only + // 2: Gas Chamber - Smokers only + // 4: Vomit Vault - Boomers only + // 8: Hunting Ground - Hunters only + // 16: Acid Rain - Spitters only (Only available in Left 4 Dead 2.) + // 32: Mental Asylum - Jockeys only (Only available in Left 4 Dead 2.) + // 64: Meat Grinder - Chargers only (Only available in Left 4 Dead 2.) + "Rush Types" "0" - // Allow human-controlled Mutant Tanks to use this ability. - // Note: This setting can be overridden for specific players. + // The number of common infected that can be alive at any given time. // -- - // 0: OFF - // 1: ON, players can use buttons to activate abilities. - // 2: ON, abilities will activate automatically. - "Human Ability" "0" + // Minimum: 0 (OFF) + // Maximum: 100 + "Common Limit" "0" - // Determines how many times human-controlled Mutant Tanks can use their abilities in one life. - // Note: This setting can be overridden for specific players. + // The delay in seconds before Tanks start spawning in co-op modes. + // Note: The delay starts after a survivor leaves the saferoom. // -- - // Minimum: 0 - // Maximum: 99999 + // Minimum: 0.1 + // Maximum: 99999.0 // -- // Keywords: - // "none"/"off" - 0 ammo - // "infinite" - 99999 ammo - "Human Ammo" "5" + // "milli"/"millisecond" - 0.1 seconds + // "second" - 1 second + // "minute" - 1 minute + // "forever" - 99999 seconds + "Coop Delay" "60.0" - // Human-controlled Mutant Tanks must wait this long before using their hit ability again. - // Note: This setting can be overridden for specific players. + // The time in seconds for resting periods during finales. // -- - // Minimum: 0 (OFF) - // Maximum: 99999 (Longest) + // Minimum: 0.1 + // Maximum: 99999.0 // -- // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds + // "milli"/"millisecond" - 0.1 seconds // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Human Cooldown" "0" + "Finale Cooldown" "30.0" - // Human-controlled Mutant Tanks must wait this long before using their range ability again. - // Note: This setting can be overridden for specific players. + // Enable hardcore mode. // -- - // Minimum: 0 (OFF) - // Maximum: 99999 (Longest) + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Hardcore Mode" "0" + + // The survivors get healed after killing a Tank. + // -- + // 0: OFF + // 1: ON, heal all alive survivors. + // 2: ON, heal only the lowest health survivor. + "Health Kills" "2" + + // The time in seconds that Tanks have to kill survivors. + // -- + // Minimum: 0.1 + // Maximum: 99999.0 // -- // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds + // "milli"/"millisecond" - 0.1 seconds // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Human Range Cooldown" "0" + "Kill Countdown" "240.0" - // Human-controlled Mutant Tanks must wait this long before using their rock ability again. - // Note: This setting can be overridden for specific players. + // The number of Tanks that can be alive at any given time. + // Note: Clones, respawned Mutant Tanks, randomized Tanks, and Mutant Tanks spawned through the Mutant Tanks menu are not affected. // -- // Minimum: 0 (OFF) - // Maximum: 99999 (Longest) + // Maximum: 32 + "Rush Limit" "10" + + // Spawn Tanks every time this many seconds passes. + // -- + // Minimum: 0.1 + // Maximum: 99999.0 // -- // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds + // "milli"/"millisecond" - 0.1 seconds // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Human Rock Cooldown" "0" + "Spawn Interval" "6.0" - // The ability can only activate in open areas. - // Note: Do not change this setting if you are unsure of how it works. - // Note: This setting can be overridden for specific players. + // The number of times each survivor can be incapacitated before they become black and white. + // -- + // 0: OFF, use game default. + // 1-10: ON, the number of times each survivor can be incapacitated. + "Survivor Incaps" "4" + } + "ConVars" + { + // All convars (except the ones provided by Mutant Tanks) can be modified in this section. + // Each time the config file is read, the convars in this section will be modified with their associated values. + // This is a very powerful feature so use it as you would with your server.cfg/listenserver.cfg file. + // Here are some examples: + + // This will fail because the convar is provided by Mutant Tanks. + "mt_pluginenabled" "0" + + // It takes a total of 2 1/2 minutes for Tanks to burn to death. + "tank_burn_duration" "150" + + // Special infected's burnt skins can go up to 100% (completely toasted) instead of only 85% (game default). + "z_burn_max" "1.0" + + // This will work but will just be overridden by the "Base Health" and "Extra Health" settings. + "z_tank_health" "4000" + } + "Game Modes" + { + // Enable Mutant Tanks in these game mode types. + // Note: This setting has a convar equivalent (mt_gamemodetypes), which is only checked if this setting is set to "0". + // Note: This setting cannot be changed in custom config files. + // -- + // Add up numbers together for different results. // -- - // Minimum: 0.0 (OFF) - // Maximum: 99999.0 (Farthest) + // Minimum: 0 + // Maximum: 15 // -- - // Keywords: - // "disabled"/"false"/"off"/"no" - 0.0 range - // "farthest" - 99999.0 range - "Open Areas Only" "0.0" + // 0 OR 15: All game mode types. + // 1: Co-Op modes only. + // 2: Versus modes only. + // 4: Survival modes only. + // 8: Scavenge modes only. (Only available in Left 4 Dead 2.) + "Game Mode Types" "0" - // The ability is only effective toward human survivors. - // Note: This setting can be overridden for specific players. + // Enable Mutant Tanks in these game modes. + // Note: This setting has a convar equivalent (mt_enabledgamemodes), which is only checked if this setting is left empty. + // Note: This setting cannot be changed in custom config files. // -- - // Minimum: 0 - // Maximum: 32 + // Separate game modes with commas (","). // -- - // 0: OFF - // 1-32: ON, the number of human survivors required to be present for this ability to be effective. - "Requires Humans" "0" + // Character limit: 512 (including commas) + // -- + // Empty: All + // Not empty: Enabled only in these game modes. + "Enabled Game Modes" "" - // Enable this ability. - // Note: This setting does not affect the "Acid Hit" setting. - // Note: This setting can be overridden for specific players. + // Disable Mutant Tanks in these game modes. + // Note: This setting has a convar equivalent (mt_disabledgamemodes), which is only checked if this setting is left empty. + // Note: This setting cannot be changed in custom config files. + // -- + // Separate game modes with commas (","). + // -- + // Character limit: 512 (including commas) + // -- + // Empty: None + // Not empty: Disabled only in these game modes. + "Disabled Game Modes" "" + } + "Custom" + { + // Enable Mutant Tanks custom configuration. + // Note: This setting cannot be changed in custom config files. // -- // 0/"disabled"/"false"/"off"/"no": OFF // 1/"enabled"/"true"/"on"/"yes": ON - "Ability Enabled" "0" + "Enable Custom Configs" "0" - // Show a screen fade effect when the Mutant Tank uses its abilities. - // Note: The colors will randomly change between the colors set in the "Skin Color" and "Glow Color" settings. - // Note: This setting can be overridden for specific players. + // The types of custom config that Mutant Tanks creates. + // Note: This setting cannot be changed in custom config files. // -- // Add up numbers together for different results. // -- // Minimum: 0 - // Maximum: 7 + // Maximum: 255 // -- // 0: OFF - // 1: Show effect when the Mutant Tank uses its claw/rock attack. - // 2: Show effect when the Mutant Tank is hit by a melee weapon. - // 4: Show effect when the Mutant Tank uses its range ability. + // 1: Difficulties + // 2: Maps + // 4: Game modes + // 8: Days + // 16: Player count + // 32: Survivor count (Humans only) + // 64: Infected count (Humans only) + // 128: Finale stages + "Create Config Types" "0" + + // The delay in seconds for executing a custom config when its filestamp has changed. + // Note: This setting cannot be changed in custom config files. + // Note: Do not change this setting if you are unsure of how it works. + // -- + // Minimum: 0.1 + // Maximum: 99999.0 // -- // Keywords: - // "none"/"off" - 0 - // "attack" - 1 - // "hurt" - 2 - // "attack,hurt" - 3 - // "range" - 4 - // "attack,range" - 5 - // "hurt,range" - 6 - // "attack,hurt,range" - 7 - "Ability Effect" "0" + // "milli"/"millisecond" - 0.1 seconds + // "second" - 1 second + // "minute" - 1 minute + // "forever" - 99999 seconds + "Execute Config Delay" "5.0" - // Display a message whenever the abilities activate/deactivate. - // Note: This setting can be overridden for specific players. + // The types of custom config that Mutant Tanks executes. + // Note: Custom config files that do not exist will not be executed. + // Note: This setting cannot be changed in custom config files. // -- // Add up numbers together for different results. // -- // Minimum: 0 - // Maximum: 7 + // Maximum: 255 // -- // 0: OFF - // 1: Display message only when "Acid Hit" is enabled. - // 2: Display message only when "Ability Enabled" is enabled. - // 4: Display message only when "Acid Rock Break" is enabled. - // -- - // Keywords: - // "none"/"off" - 0 - // "hit" - 1 - // "ability" - 2 - // "hit,ability" - 3 - // "rock" - 4 - // "hit,rock" - 5 - // "ability,rock" - 6 - // "hit,ability,rock"/"all" - 7 - "Ability Message" "0" + // 1: Difficulties + // 2: Maps + // 4: Game modes + // 8: Days + // 16: Player count + // 32: Survivor count (Humans only) + // 64: Infected count (Humans only) + // 128: Finale stages + "Execute Config Types" "0" + } + } +} +``` +
- // Check line-of-sight when the Mutant Tank uses its abilities. - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0 - // Maximum: 5 - // -- - // 0: OFF - // 1: Check if there is a solid object between the Mutant Tank and survivors. - // 2: Option 1 + Check if the Mutant Tank is looking toward the survivors. - // 3: Option 1 + Check if the Mutant Tank is looking away from the survivors. - // 4: Option 1 + Check if the survivors are looking toward the Mutant Tank. - // 5: Option 1 + Check if the survivors are looking away from the Mutant Tank. - "Ability Sight" "0" +### Tank Settings +
+ Click to expand! - // The Mutant Tank has this many chances out of 100.0% to trigger the hit ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". +``` +"Mutant Tanks" +{ + "Tank #1" + { + "General" + { + // Name of the Mutant Tank. + // Note: This name is only used for renaming the Mutant Tank in the server and checking which translation phrase to use. + // Note: For displaying this name in chat messages and other forms of text, use the translation file. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.0 (No chance) - // Maximum: 100.0 (Highest chance) + // Character limit: 32 // -- - // Keywords: - // "never" - 0% chance - // "sometimes"/"unlikely"/"seldom" - 33.3% chance - // "maybe" - 50% chance - // "often"/"likely"/"frequently" - 66.6% chance - // "always" - 100% chance - "Acid Chance" "33.3" + // Empty: "Tank" + // Not Empty: Tank's custom name + "Tank Name" "Tank #1" - // The cooldown for the Mutant Tank's hit ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". - // Note: This setting can be overridden for specific players. + // The Mutant Tank's class. + // Note: Clones, respawned Mutant Tanks, randomized Tanks, and Mutant Tanks spawned through the Mutant Tanks menu are not affected. + // Note: Do not change this setting if you are unsure of how it works. // -- - // Minimum: 0 (OFF) - // Maximum: 99999 (Longest) + // Character limit: 64 // -- - // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Acid Cooldown" "0" + // Empty: No custom class + // Not Empty: Tank's custom class + "Tank Class" "" - // The Mutant Tank's acid puddles do this much damage. - // Note: This is ignored when the "Combo Ability" setting is set to "1". - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0.0 (OFF) - // Maximum: 99999.0 + // Restrict the Mutant Tank to this game. + // Note: Do not change this setting if you are unsure of how it works. // -- - // Keywords: - // "weakest" - 1.0 damage - // "strongest" - 99999.0 damage - "Acid Damage" "3.0" + // 0: OFF + // 1: Left 4 Dead 1 only. + // 2: Left 4 Dead 2 only. + "Game Type" "0" - // Enable the Mutant Tank's upon-death range ability. - // Note: This setting does not need the "Ability Enabled" setting to be set to "1". - // Note: This setting can be overridden for specific players. - // -- - // Add up numbers together for different results. - // -- - // Minimum: 0 - // Maximum: 3 + // Enable the Mutant Tank. + // Note: This setting determines full availability. Even if other spawn settings are enabled while this is disabled, the Mutant Tank will stay disabled. + // Note: This setting overrides the same setting under the "Plugin Settings/General" section. // -- - // 0: OFF - // 1: Trigger the range ability when the Mutant Tank dies. - // 2: Trigger the range ability when the Mutant Tank spawns. - "Acid Death" "1" + // -1/"ignore"/"exclude"/"filter"/"remove": Let the setting with the same name from the "Plugin Settings/General" section decide. + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Tank Enabled" "-1" - // The Mutant Tank has this many chances out of 100.0% to trigger the upon-death ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". - // Note: This setting can be overridden for specific players. + // The Mutant Tank has this many chances out of 100.0% to spawn. + // Note: Clones, respawned Mutant Tanks, randomized Tanks, and Mutant Tanks spawned through the Mutant Tanks menu are not affected. + // Note: If each enabled Mutant Tank has less than 100% chance of spawning, then every enabled Mutant Tank that has a 1% or higher chance of spawning will have an equal chance to spawn. + // Note: Do not change this setting if you are unsure of how it works. + // Note: This setting overrides the same setting under the "Plugin Settings/General" section. // -- // Minimum: 0.0 (No chance) // Maximum: 100.0 (Highest chance) @@ -7868,3536 +5793,4183 @@ // "maybe" - 50% chance // "often"/"likely"/"frequently" - 66.6% chance // "always" - 100% chance - "Acid Death Chance" "33.3" + "Tank Chance" "0.0" - // The distance between a survivor and the Mutant Tank needed to trigger the upon-death ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Display a note for the Mutant Tank when it spawns. + // Note: This note can also be displayed for clones if the "Clone Mode" setting is set to "1", so the chat could be spammed if multiple clones spawn. + // Note: A note must be manually created in the translation file (mutant_tanks_names.phrases.txt). + // Note: Tank notes support chat color tags in the translation file. + // Note: This setting overrides the same setting under the "Plugin Settings/General" section. // Note: This setting can be overridden for specific players. // -- - // Minimum: 1.0 (Closest) - // Maximum: 99999.0 (Farthest) + // -1/"ignore"/"exclude"/"filter"/"remove": Let the setting with the same name from each player-controlled Mutant Tank's "General" section decide. + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Tank Note" "0" + + // The Mutant Tank can spawn. + // Note: The Mutant Tank will still appear on the Mutant Tanks menu and other Mutant Tanks can still transform into the Mutant Tank. + // Note: Do not change this setting if you are unsure of how it works. + // Note: This setting overrides the same setting under the "Plugin Settings/General" section. // -- - // Keywords: - // "closest" - 1.0 range - // "farthest" - 99999.0 range - "Acid Death Range" "200.0" + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Spawn Enabled" "1" - // Enable the Mutant Tank's claw/rock attack. - // Note: This setting does not need the "Ability Enabled" setting to be set to "1". + // The Mutant Tank can be spawned through the "sm_tank"/"sm_mt_tank" command. + // Note: Do not change this setting if you are unsure of how it works. + // -- + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Menu Enabled" "1" + + // The plugin will automatically disable the Mutant Tank if none of its abilities are installed. + // Note: The abilities cache is only updated when configs are loaded/refreshed. + // Note: This setting does not disable the Mutant Tank if it does not have any abilities. + // Note: Do not change this setting if you are unsure of how it works. + // Note: This setting overrides the same setting under the "Plugin Settings/General" section. // Note: This setting can be overridden for specific players. // -- // 0/"disabled"/"false"/"off"/"no": OFF // 1/"enabled"/"true"/"on"/"yes": ON - "Acid Hit" "0" + "Check Abilities" "0" - // The mode of the Mutant Tank's claw/rock attack. + // The Mutant Tank reverts back to default a Tank upon death. + // Note: This setting overrides the same setting under the "Plugin Settings/General" section. + // Note: This feature is simply for cosmetic purposes. + // You do not need to worry about this setting. // Note: This setting can be overridden for specific players. // -- - // 0: Both - // 1: Ability activates when the Mutant Tank hits a survivor. - // 2: Ability activates when the Mutant Tank is hit by a survivor. - // -- - // Keywords: - // "both"/"all" - 0 - // "tank"/"attack" - 1 - // "survivor"/"hurt" - 2 - "Acid Hit Mode" "0" + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Death Revert" "0" - // The distance between a survivor and the Mutant Tank needed to trigger the ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // These are the RGBA values of the Mutant Tank's skin color. + // Note: Any value less than "0" will output a random color. // Note: This setting can be overridden for specific players. // -- - // Minimum: 1.0 (Closest) - // Maximum: 99999.0 (Farthest) + // 1st number = Red + // 2nd number = Green + // 3rd number = Blue + // 4th number = Alpha // -- // Keywords: - // "closest" - 1.0 range - // "farthest" - 99999.0 range - "Acid Range" "150.0" + // "rainbow" - cycle through colors constantly. + "Skin Color" "255,255,255,255" + //"Skin Color" "all_tank_skins" // Alternative (See "Colors" section) - // The Mutant Tank has this many chances out of 100.0% to trigger the range ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". - // Note: This setting can be overridden for specific players. + // The Mutant Tank is only effective toward human-controlled survivors. + // Note: This setting overrides the same setting under the "Plugin Settings/General" section. // -- - // Minimum: 0.0 (No chance) - // Maximum: 100.0 (Highest chance) + // Minimum: 0 + // Maximum: 32 // -- - // Keywords: - // "never" - 0% chance - // "sometimes"/"unlikely"/"seldom" - 33.3% chance - // "maybe" - 50% chance - // "often"/"likely"/"frequently" - 66.6% chance - // "always" - 100% chance - "Acid Range Chance" "15.0" + // 0: OFF + // 1-32: ON, the number of human-controlled survivors required to be present for this Mutant Tank to be effective. + "Requires Humans" "0" - // The cooldown for the Mutant Tank's range ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // The model used by the Mutant Tank. + // Note: This setting overrides the same setting under the "Plugin Settings/General" section. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 (OFF) - // Maximum: 99999 (Longest) + // Add up numbers together for different results. // -- - // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Acid Range Cooldown" "0" - - // The Mutant Tank's rock creates an acid puddle when it breaks. - // Note: Only available in Left 4 Dead 2. - // Note: This does not need "Ability Enabled" or "Acid Hit" to be set to "1". - // Note: This setting can be overridden for specific players. + // Minimum: 0 + // Maximum: 7 // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Acid Rock Break" "0" + // 0: OFF (Let the game decide.) + // 1: Default model + // 2: The Sacrifice model + // 4: L4D1 model (Only available in Left 4 Dead 2.) + "Tank Model" "0" - // The Mutant Tank's rock has this many chances out of 100.0% to trigger the rock break ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // The duration in seconds of the Mutant Tank's afterburn. + // Note: This setting overrides the same setting under the "Plugin Settings/General" section. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.0 (No chance) - // Maximum: 100.0 (Highest chance) - // -- - // Keywords: - // "never" - 0% chance - // "sometimes"/"unlikely"/"seldom" - 33.3% chance - // "maybe" - 50% chance - // "often"/"likely"/"frequently" - 66.6% chance - // "always" - 100% chance - "Acid Rock Chance" "33.3" + // Minimum: 0.0 (OFF) + // Maximum: 99999.0 + "Burn Duration" "0.0" - // The cooldown for the Mutant Tank's rock ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // The burnt percentage of the Mutant Tank when it spawns. + // Note: This setting overrides the same setting under the "Plugin Settings/General" section. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 (OFF) - // Maximum: 99999 (Longest) + // L4D1: The default maximum value is "1.0" for each type of special infected. + // L4D2: The default maximum value is different for each type of special infected. + // Smoker - 0.30 + // Boomer - 0.12 + // Hunter - 0.35 + // Spitter - 0.15 + // Jockey - 0.40 + // Charger - 0.40 + // Tank - 1.0 // -- - // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Acid Rock Cooldown" "0" + // -1.0: OFF + // 0.0: Random + // 0.01-1.0: Burn percentage + "Burnt Skin" "-1.0" + + "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" + { + // Note: Override any of the settings in the "General" section for each special infected here. + + // Enable Mutant Special Infected types. + // Note: This setting determines full availability. Even if other spawn settings are enabled while this is disabled, the Mutant Special Infected type will stay disabled. + // Note: This setting overrides the same setting under the "Plugin Settings/General" section. + // -- + // Add up numbers together for different results. + // -- + // Minimum: -1 + // Maximum: 63 + // -- + // -1/"ignore"/"exclude"/"filter"/"remove": Let the setting with the same name from the "Plugin Settings/General" section decide. + // 0/"disabled"/"false"/"off"/"no": OFF + // 1: Enable Smokers. + // 2: Enable Boomers. + // 4: Enable Hunters. + // 8: Enable Spitters. (Only available in Left 4 Dead 2.) + // 16: Enable Jockeys. (Only available in Left 4 Dead 2.) + // 32: Enable Chargers. (Only available in Left 4 Dead 2.) + "Special Types" "-1" + + // The Mutant Boomer's class. + // Note: Clones, respawned Mutant Boomers, randomized Boomers, and Mutant Boomers spawned through the Mutant Boomers menu are not affected. + // Note: Do not change this setting if you are unsure of how it works. + // -- + // Character limit: 64 + // -- + // Empty: No custom class + // Not Empty: Boomer's custom class + "Boomer Class" "" + + // Name of the Mutant Boomer. + // Note: This name is only used for renaming the Mutant Boomer in the server and checking which translation phrase to use. + // Note: For displaying this name in chat messages and other forms of text, use the translation file. + // Note: This setting can be overridden for specific players. + // -- + // Character limit: 32 + // -- + // Empty: "Boomer" + // Not Empty: Boomer's custom name + "Boomer Name" "Boomer #1" + + // The Mutant Charger's class. + // Note: Clones, respawned Mutant Chargers, randomized Chargers, and Mutant Chargers spawned through the Mutant Chargers menu are not affected. + // Note: Do not change this setting if you are unsure of how it works. + // -- + // Character limit: 64 + // -- + // Empty: No custom class + // Not Empty: Charger's custom class + "Charger Class" "" + + // Name of the Mutant Charger. + // Note: This name is only used for renaming the Mutant Charger in the server and checking which translation phrase to use. + // Note: For displaying this name in chat messages and other forms of text, use the translation file. + // Note: This setting can be overridden for specific players. + // -- + // Character limit: 32 + // -- + // Empty: "Charger" + // Not Empty: Charger's custom name + "Charger Name" "Charger #1" + + // The Mutant Hunter's class. + // Note: Clones, respawned Mutant Hunters, randomized Hunters, and Mutant Hunters spawned through the Mutant Hunters menu are not affected. + // Note: Do not change this setting if you are unsure of how it works. + // -- + // Character limit: 64 + // -- + // Empty: No custom class + // Not Empty: Hunter's custom class + "Hunter Class" "" + + // Name of the Mutant Hunter. + // Note: This name is only used for renaming the Mutant Hunter in the server and checking which translation phrase to use. + // Note: For displaying this name in chat messages and other forms of text, use the translation file. + // Note: This setting can be overridden for specific players. + // -- + // Character limit: 32 + // -- + // Empty: "Hunter" + // Not Empty: Hunter's custom name + "Hunter Name" "Hunter #1" + + // The Mutant Jockey's class. + // Note: Clones, respawned Mutant Jockeys, randomized Jockeys, and Mutant Jockeys spawned through the Mutant Jockeys menu are not affected. + // Note: Do not change this setting if you are unsure of how it works. + // -- + // Character limit: 64 + // -- + // Empty: No custom class + // Not Empty: Jockey's custom class + "Jockey Class" "" + + // Name of the Mutant Jockey. + // Note: This name is only used for renaming the Mutant Jockey in the server and checking which translation phrase to use. + // Note: For displaying this name in chat messages and other forms of text, use the translation file. + // Note: This setting can be overridden for specific players. + // -- + // Character limit: 32 + // -- + // Empty: "Jockey" + // Not Empty: Jockey's custom name + "Jockey Name" "Jockey #1" + + // The Mutant Smoker's class. + // Note: Clones, respawned Mutant Smokers, randomized Smokers, and Mutant Smokers spawned through the Mutant Smokers menu are not affected. + // Note: Do not change this setting if you are unsure of how it works. + // -- + // Character limit: 64 + // -- + // Empty: No custom class + // Not Empty: Smoker's custom class + "Smoker Class" "" + + // Name of the Mutant Smoker. + // Note: This name is only used for renaming the Mutant Smoker in the server and checking which translation phrase to use. + // Note: For displaying this name in chat messages and other forms of text, use the translation file. + // Note: This setting can be overridden for specific players. + // -- + // Character limit: 32 + // -- + // Empty: "Smoker" + // Not Empty: Smoker's custom name + "Smoker Name" "Smoker #1" + + // The Mutant Spitter's class. + // Note: Clones, respawned Mutant Spitters, randomized Spitters, and Mutant Spitters spawned through the Mutant Spitters menu are not affected. + // Note: Do not change this setting if you are unsure of how it works. + // -- + // Character limit: 64 + // -- + // Empty: No custom class + // Not Empty: Spitter's custom class + "Spitter Class" "" + + // Name of the Mutant Spitter. + // Note: This name is only used for renaming the Mutant Spitter in the server and checking which translation phrase to use. + // Note: For displaying this name in chat messages and other forms of text, use the translation file. + // Note: This setting can be overridden for specific players. + // -- + // Character limit: 32 + // -- + // Empty: "Spitter" + // Not Empty: Spitter's custom name + "Spitter Name" "Spitter #1" + + // The Mutant Special Infected has this many chances out of 100.0% to spawn. + // Note: Clones, respawned Mutant Special Infected, randomized Special Infected, and Mutant Special Infected spawned through the Mutant Special Infected menu are not affected. + // Note: If each enabled Mutant Special Infected has less than 100% chance of spawning, then every enabled Mutant Special Infected that has a 1% or higher chance of spawning will have an equal chance to spawn. + // Note: Do not change this setting if you are unsure of how it works. + // Note: This setting overrides the same setting under the "Plugin Settings/General" section. + // -- + // Minimum: 0.0 (No chance) + // Maximum: 100.0 (Highest chance) + // -- + // Keywords: + // "never" - 0% chance + // "sometimes"/"unlikely"/"seldom" - 33.3% chance + // "maybe" - 50% chance + // "often"/"likely"/"frequently" - 66.6% chance + // "always" - 100% chance + "Special Chance" "0.0" + + // Display a note for the Mutant Special Infected when it spawns. + // Note: This note can also be displayed for clones if the "Clone Mode" setting is set to "1", so the chat could be spammed if multiple clones spawn. + // Note: A note must be manually created in the translation file (mutant_tanks_names.phrases.txt). + // Note: Special Infected notes support chat color tags in the translation file. + // Note: This setting overrides the same setting under the "Plugin Settings/General" section. + // Note: This setting can be overridden for specific players. + // -- + // -1/"ignore"/"exclude"/"filter"/"remove": Let the setting with the same name from each player-controlled Mutant Special Infected's "General" section decide. + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Special Note" "0" - "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" - { - // Note: Override any of the settings in the "Acid Ability" section for each special infected here. + // The model used by the Mutant Special Infected. + // Note: This setting only works for the Smoker, Boomer, and Hunter. + // Note: This setting overrides the same setting under the "Plugin Settings/General" section. + // Note: This setting can be overridden for specific players. + // -- + // Add up numbers together for different results. + // -- + // Minimum: 0 + // Maximum: 3 + // -- + // 0: OFF (Let the game decide.) + // 1: Default model + // 2: L4D1 model (Only available in Left 4 Dead 2.) + "Special Model" "0" // Example - "Access Flags" "" - "Immunity Flags" "" - "Close Areas Only" "0.0" - "Combo Ability" "0" - "Human Ability" "0" - "Human Ammo" "5" - "Human Cooldown" "0" - "Human Pin Cooldown" "0" - "Human Range Cooldown" "0" - "Open Areas Only" "0.0" + "Game Type" "0" + "Special Types" "-1" + "Boomer Class" "" + "Boomer Name" "Boomer #1" + "Charger Class" "" + "Charger Name" "Charger #1" + "Hunter Class" "" + "Hunter Name" "Hunter #1" + "Jockey Class" "" + "Jockey Name" "Jockey #1" + "Smoker Class" "" + "Smoker Name" "Smoker #1" + "Spitter Class" "" + "Spitter Name" "Spitter #1" + "Special Chance" "0.0" + "Special Note" "0" + "Spawn Enabled" "1" + "Menu Enabled" "1" + "Death Revert" "0" + "Skin Color" "255,255,255,255" + "Special Model" "0" "Requires Humans" "0" - "Ability Enabled" "0" - "Ability Effect" "0" - "Ability Message" "0" - "Ability Sight" "0" - "Acid Chance" "33.3" - "Acid Cooldown" "0" - "Acid Damage" "3.0" - "Acid Death" "1" - "Acid Death Chance" "33.3" - "Acid Death Range" "200.0" - "Acid Hit" "0" - "Acid Hit Mode" "0" - "Acid Pin" "0" - "Acid Pin Chance" "33.3" - "Acid Pin Cooldown" "0" - "Acid Range" "150.0" - "Acid Range Chance" "15.0" - "Acid Range Cooldown" "0" + "Burn Duration" "0.0" + "Burnt Skin" "-1.0" } - } - } -} -``` -
+ "Mob" // Syntax: "Mob"/"Infected"/"inf" + { + // Enable Mutant Mob Infected types. + // Note: This setting determines full availability. Even if other spawn settings are enabled while this is disabled, the Mutant Special Infected type will stay disabled. + // Note: This setting overrides the same setting under the "Plugin Settings/General" section. + // -- + // Add up numbers together for different results. + // -- + // Minimum: -1 + // Maximum: 3 + // -- + // -1/"ignore"/"exclude"/"filter"/"remove": Let the setting with the same name from each Mutant Special Infected's "General" section decide. + // 0/"disabled"/"false"/"off"/"no": OFF + // 1: Enable Witches - Mutant Witches can convert nearby infected into the same mutant type as her when startled and/or killed. + // 2: Enable Common Infected - Mutant Common Infected can combine their bio mass to produce Mutant Special Infected. + "Mob Variants" "-1" -##### Aimless Ability -
- Click to expand! + // The chance for Mutant Common Infected to spawn this mutant type. + // Note: This setting overrides the same setting under the "Plugin Settings/General" section. + // -- + // Minimum: 0.0 (No chance) + // Maximum: 100.0 (Highest chance) + // -- + // Keywords: + // "never" - 0% chance + // "sometimes"/"unlikely"/"seldom" - 33.3% chance + // "maybe" - 50% chance + // "often"/"likely"/"frequently" - 66.6% chance + // "always" - 100% chance + "Common Bio Chance" "0.0" -``` -"Mutant Tanks" -{ - "Tank #1" - { - // The Mutant Tank prevents survivors from aiming. - // "Ability Enabled" - When a survivor is within range of the Mutant Tank, the survivor cannot aim. - // - "Aimless Range" - // - "Aimless Range Chance" - // - "Aimless Range Cooldown" - // "Aimless Hit" - When a survivor is hit by the Mutant Tank's claw or rock, or a survivor hits the Mutant Tank with a melee weapon, the survivor cannot aim. - // - "Aimless Chance" - // - "Aimless Cooldown" - // - "Aimless Hit Mode" - // Requires "mt_abilities.smx" to be compiled with "mt_aimless.sp" to work. - "Aimless Ability" - { - // Admins with one or more of these access flags have access to this ability. - // Note: This setting can be overridden for specific players. - // -- - // Empty: No access flags have access. - // Not empty: These access flags have access. - "Access Flags" "" + // The Mutant Common Infected has this many chances out of 100.0% to spawn. + // Note: This setting overrides the same setting under the "Plugin Settings/General" section. + // -- + // Minimum: 0.0 (No chance) + // Maximum: 100.0 (Highest chance) + // -- + // Keywords: + // "never" - 0% chance + // "sometimes"/"unlikely"/"seldom" - 33.3% chance + // "maybe" - 50% chance + // "often"/"likely"/"frequently" - 66.6% chance + // "always" - 100% chance + "Common Chance" "0.0" - // Admins with one or more of these immunity flags are immune to this ability's effects. - // Note: If the Mutant Tank has one or more of these immunity flags or has the same immunity flags as the survivor victim, the immunity is cancelled. - // Note: This setting can be overridden for specific players. - // -- - // Empty: No immunity flags are immune. - // Not empty: These immunity flags are immune. - "Immunity Flags" "" + // The number of points added to the bio mass meter for each damage of the same amount dealt to the common infected directly by survivors. + // Note: The amount of damage a common infected takes directly from survivors throughout its lifespan must be equal to or greater than the value of this setting for the points to be added. + // Note: This setting overrides the same setting under the "Plugin Settings/General" section. + // -- + // 0: OFF + // 1-1000000: Points added to bio mass meter. + "Common Damage Points" "0.0" - // The ability can only activate in close areas. - // Note: Do not change this setting if you are unsure of how it works. - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0.0 (OFF) - // Maximum: 99999.0 (Farthest) - // -- - // Keywords: - // "disabled"/"false"/"off"/"no" - 0.0 range - // "farthest" - 99999.0 range - "Close Areas Only" "0.0" + // The number of points added to the bio mass meter for the common infected's death. + // Note: This setting overrides the same setting under the "Plugin Settings/General" section. + // -- + // 0: OFF + // 1-1000000: Points added to bio mass meter. + "Common Death Points" "0.0" - // Use this ability in conjunction with other abilities. - // Note: Only use this when "Spawn Type" is set to "4" for the Mutant Tank. - // Note: This setting does not affect human-controlled Mutant Tanks unless the "Human Ability" setting is set to "2". - // Note: This setting can be overridden for specific players. - // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Combo Ability" "0" + // The number of points needed in the bio mass meter to spawn this mutant type. + // Note: This setting overrides the same setting under the "Plugin Settings/General" section. + // -- + // 0: OFF + // 1-1000000: Points added to bio mass meter. + "Common Goal" "0.0" - // Allow human-controlled Mutant Tanks to use this ability. - // Note: This setting can be overridden for specific players. - // -- - // 0: OFF - // 1: ON, players can use buttons to activate abilities. - // 2: ON, abilities will activate automatically. - "Human Ability" "0" + // Name of the Mutant Common Infected. + // Note: This name is only used for checking which translation phrase to use. + // Note: For displaying this name in chat messages and other forms of text, use the translation file. + // -- + // Character limit: 32 + // -- + // Empty: "Common" + // Not Empty: Common's custom name + "Common Name" "Common #1" - // Determines how many times human-controlled Mutant Tanks can use their abilities in one life. - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0 - // Maximum: 99999 - // -- - // Keywords: - // "none"/"off" - 0 ammo - // "infinite" - 99999 ammo - "Human Ammo" "5" + // The variants of the common infected to mutate. + // Note: This setting overrides the same setting under the "Plugin Settings/General" section. + // -- + // Add up numbers together for different results. + // -- + // Minimum: 0 + // Maximum: 255 + // -- + // 0 OR 255: All variants of common infected. + // 1: Common Infected + // 2: CEDA Worker (Dead Center) + // 4: Jimmy Gibbs Jr. (Dead Center) + // 8: Fallen Survivor (The Passing) + // 16: Clown (Dark Carnival) + // 32: Mudman (Swamp Fever) + // 64: Roadcrew Worker (Hard Rain) + // 128: Riot Cop (The Parish) + "Common Variant" "0" + + // The Mutant Witch has this many chances out of 100.0% to spawn. + // Note: This setting overrides the same setting under the "Plugin Settings/General" section. + // -- + // Minimum: 0.0 (No chance) + // Maximum: 100.0 (Highest chance) + // -- + // Keywords: + // "never" - 0% chance + // "sometimes"/"unlikely"/"seldom" - 33.3% chance + // "maybe" - 50% chance + // "often"/"likely"/"frequently" - 66.6% chance + // "always" - 100% chance + "Witch Chance" "0.0" - // Human-controlled Mutant Tanks must wait this long before using their abilities again. - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0 (OFF) - // Maximum: 99999 (Longest) - // -- - // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Human Cooldown" "0" + // The types of host bodies that the Mutant Witch can mutate. + // Note: This setting overrides the same setting under the "Plugin Settings/General" section. + // -- + // Add up numbers together for different results. + // -- + // Minimum: 0 + // Maximum: 511 + // -- + // 0 OR 511: All types of host bodies. + // 1: Common Infected + // 2: Smoker + // 4: Boomer + // 8: Hunter + // 16: Spitter (Switches to Boomer in Left 4 Dead 1.) + // 32: Jockey (Switches to Hunter in Left 4 Dead 1.) + // 64: Charger (Switches to Smoker in Left 4 Dead 1.) + // 128: Tank + // 256: Survivors + "Witch Filter" "0" + + // Witches spawned by abilities will be treated as real Mutant Witches. + // Note: This setting overrides the same setting under the "Plugin Settings/General" section. + // -- + // 0/"disabled"/"false"/"off"/"no": OFF, witches cannot mutate others like real Mutant Witches. + // 1/"enabled"/"true"/"on"/"yes": ON, witches can mutate others like real Mutant Witches. + "Witch Mode" "0" - // Human-controlled Mutant Tanks must wait this long before using their range ability again. - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0 (OFF) - // Maximum: 99999 (Longest) - // -- - // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Human Range Cooldown" "0" + // The chance for the Mutant Witch to mutate other infected into this mutant type. + // Note: This setting overrides the same setting under the "Plugin Settings/General" section. + // -- + // Minimum: 0.0 (No chance) + // Maximum: 100.0 (Highest chance) + // -- + // Keywords: + // "never" - 0% chance + // "sometimes"/"unlikely"/"seldom" - 33.3% chance + // "maybe" - 50% chance + // "often"/"likely"/"frequently" - 66.6% chance + // "always" - 100% chance + "Witch Mutate Chance" "0.0" + + // Name of the Mutant Witch. + // Note: This name is only used for checking which translation phrase to use. + // Note: For displaying this name in chat messages and other forms of text, use the translation file. + // -- + // Character limit: 32 + // -- + // Empty: "Witch" + // Not Empty: Witch's custom name + "Witch Name" "Witch #1" + + // The range of the Mutant Witch's mutation radius. + // Note: This setting overrides the same setting under the "Plugin Settings/General" section. + // -- + // Minimum: 1.0 (Closest) + // Maximum: 99999.0 (Farthest) + // -- + // Keywords: + // "closest" - 1.0 range + // "farthest" - 99999.0 range + "Witch Range" "0.0" - // The ability can only activate in open areas. - // Note: Do not change this setting if you are unsure of how it works. + // The types of when to trigger the Mutant Witch's mutation radius. + // Note: This setting overrides the same setting under the "Plugin Settings/General" section. + // -- + // Add up numbers together for different results. + // -- + // Minimum: 0 + // Maximum: 7 + // -- + // 0 OR 7: All modes of triggers. + // 1: When the Mutant Witch is startled. + // 2: When the Mutant Witch is killed. + // 4: When the Mutant Witch is crowned. + "Witch Types" "0" + + // Example + "Mob Variants" "-1" + "Common Bio Chance" "0.0" + "Common Chance" "0.0" + "Common Damage Points" "0.0" + "Common Death Points" "0.0" + "Common Goal" "0.0" + "Common Name" "Common #1" + "Common Variant" "0" + "Witch Chance" "0.0" + "Witch Filter" "0" + "Witch Mode" "0" + "Witch Mutate Chance" "0.0" + "Witch Name" "Witch #1" + "Witch Range" "0.0" + "Witch Types" "0" + "Skin Color" "255,255,255,255" + } + } + "Announcements" + { + // Announce the Mutant Tank's arrival. + // Note: This setting overrides the same setting under the "Plugin Settings/Announcements" section. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.0 (OFF) - // Maximum: 99999.0 (Farthest) + // Add up numbers together for different results. // -- - // Keywords: - // "disabled"/"false"/"off"/"no" - 0.0 range - // "farthest" - 99999.0 range - "Open Areas Only" "0.0" + // Minimum: -1 + // Maximum: 31 + // -- + // 0: OFF + // 1: Announce when the Mutant Tank spawns. + // 2: Announce when the Mutant Tank evolves. (Only works when "Spawn Type" is set to "1".) + // 4: Announce when the Mutant Tank randomizes. (Only works when "Spawn Type" is set to "2".) + // 8: Announce when the Mutant Tank transforms. (Only works when "Spawn Type" is set to "3".) + // 16: Announce when the Mutant Tank untransforms. (Only works when "Spawn Type" is set to "3".) + "Announce Arrival" "0" - // The ability is only effective toward human survivors. + // Announce the Mutant Tank's death. + // Note: This setting overrides the same setting under the "Plugin Settings/Announcements" section. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 - // Maximum: 32 - // -- // 0: OFF - // 1-32: ON, the number of human survivors required to be present for this ability to be effective. - "Requires Humans" "1" + // 1: ON, announce deaths only. + // 2: ON, announce deaths with killers. + "Announce Death" "0" - // Enable this ability. - // Note: This setting does not affect the "Aimless Hit" setting. + // Announce the Mutant Tank's kill. + // Note: This setting overrides the same setting under the "Plugin Settings/Announcements" section. // Note: This setting can be overridden for specific players. // -- // 0/"disabled"/"false"/"off"/"no": OFF // 1/"enabled"/"true"/"on"/"yes": ON - "Ability Enabled" "0" - - // Show a screen fade effect when the Mutant Tank uses its abilities. - // Note: The colors will randomly change between the colors set in the "Skin Color" and "Glow Color" settings. - // Note: This setting can be overridden for specific players. - // -- - // Add up numbers together for different results. - // -- - // Minimum: 0 - // Maximum: 7 - // -- - // 0: OFF - // 1: Show effect when the Mutant Tank uses its claw/rock attack. - // 2: Show effect when the Mutant Tank is hit by a melee weapon. - // 4: Show effect when the Mutant Tank uses its range ability. - // -- - // Keywords: - // "none"/"off" - 0 - // "attack" - 1 - // "hurt" - 2 - // "attack,hurt" - 3 - // "range" - 4 - // "attack,range" - 5 - // "hurt,range" - 6 - // "attack,hurt,range" - 7 - "Ability Effect" "0" + "Announce Kill" "0" - // Display a message whenever the ability activates/deactivates. + // The message shown to players when the Mutant Tank arrives. + // Note: This setting only works for the first option of the "Announce Arrival" setting. + // Note: This setting overrides the same setting under the "Plugin Settings/Announcements" section. // Note: This setting can be overridden for specific players. // -- // Add up numbers together for different results. // -- // Minimum: 0 - // Maximum: 3 - // -- - // 0: OFF - // 1: Display message only when "Aimless Hit" is enabled. - // 2: Display message only when "Ability Enabled" is enabled. - // -- - // Keywords: - // "none"/"off" - 0 - // "hit" - 1 - // "ability" - 2 - // "both"/"all"/"hit,ability" - 3 - "Ability Message" "0" - - // Check line-of-sight when the Mutant Tank uses its abilities. - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0 - // Maximum: 5 + // Maximum: 1023 // -- - // 0: OFF - // 1: Check if there is a solid object between the Mutant Tank and survivors. - // 2: Option 1 + Check if the Mutant Tank is looking toward the survivors. - // 3: Option 1 + Check if the Mutant Tank is looking away from the survivors. - // 4: Option 1 + Check if the survivors are looking toward the Mutant Tank. - // 5: Option 1 + Check if the survivors are looking away from the Mutant Tank. - "Ability Sight" "0" + // 0 OR 1023: Pick randomly between the 10 messages. + // 1: Message #1 + // 2: Message #2 + // 4: Message #3 + // 8: Message #4 + // 16: Message #5 + // 32: Message #6 + // 64: Message #7 + // 128: Message #8 + // 256: Message #9 + // 512: Message #10 + "Arrival Message" "0" - // The Mutant Tank has this many chances out of 100.0% to trigger the ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // A sound is played to players when the Mutant Tank arrives. + // Note: This setting overrides the same setting under the "Plugin Settings/Announcements" section. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.0 (No chance) - // Maximum: 100.0 (Highest chance) - // -- - // Keywords: - // "never" - 0% chance - // "sometimes"/"unlikely"/"seldom" - 33.3% chance - // "maybe" - 50% chance - // "often"/"likely"/"frequently" - 66.6% chance - // "always" - 100% chance - "Aimless Chance" "33.3" + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Arrival Sound" "1" - // The cooldown for the Mutant Tank's hit ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // The details shown when announcing the Mutant Tank's death. + // Note: This setting overrides the same setting under the "Plugin Settings/Announcements" section. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 (OFF) - // Maximum: 99999 (Longest) - // -- - // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Aimless Cooldown" "0" + // 0: Damage done to the Mutant Tank's health. + // 1: Percentage of damage done to the Mutant Tank's health. + // 2: Damage and percentage of damage done to the Mutant Tank's health. + // 3: Damage done to the Mutant Tank's health as a team. + // 4: Percentage of damage done to the Mutant Tank's health as a team. + // 5: Damage and percentage of damage done to the Mutant Tank's health as a team. + "Death Details" "5" - // The Mutant Tank's ability effects last this long. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // The message shown to players when the Mutant Tank dies. + // Note: This setting overrides the same setting under the "Plugin Settings/Announcements" section. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.1 - // Maximum: 99999.0 + // Add up numbers together for different results. // -- - // Keywords: - // "milli"/"millisecond" - 0.1 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Aimless Duration" "5.0" - - // The Mutant Tank's ability causes survivors to fire their guns uncontrollably. - // Note: This setting can be overridden for specific players. + // Minimum: 0 + // Maximum: 1023 // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Aimless Gunshots" "0" + // 0 OR 1023: Pick randomly between the 10 messages. + // 1: Message #1 + // 2: Message #2 + // 4: Message #3 + // 8: Message #4 + // 16: Message #5 + // 32: Message #6 + // 64: Message #7 + // 128: Message #8 + // 256: Message #9 + // 512: Message #10 + "Death Message" "0" - // Enable the Mutant Tank's claw/rock attack. - // Note: This setting does not need the "Ability Enabled" setting to be set to "1". + // A sound is played to players when the Mutant Tank dies. + // Note: This setting overrides the same setting under the "Plugin Settings/Announcements" section. // Note: This setting can be overridden for specific players. // -- // 0/"disabled"/"false"/"off"/"no": OFF // 1/"enabled"/"true"/"on"/"yes": ON - "Aimless Hit" "0" + "Death Sound" "1" - // The mode of the Mutant Tank's claw/rock attack. + // The message shown to players when the Mutant Tank kills a survivor. + // Note: This setting overrides the same setting under the "Plugin Settings/Announcements" section. // Note: This setting can be overridden for specific players. // -- - // 0: Both - // 1: Ability activates when the Mutant Tank hits a survivor. - // 2: Ability activates when the Mutant Tank is hit by a survivor. - // -- - // Keywords: - // "both"/"all" - 0 - // "tank"/"attack" - 1 - // "survivor"/"hurt" - 2 - "Aimless Hit Mode" "0" - - // The distance between a survivor and the Mutant Tank needed to trigger the ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". - // Note: This setting can be overridden for specific players. + // Add up numbers together for different results. // -- - // Minimum: 1.0 (Closest) - // Maximum: 99999.0 (Farthest) + // Minimum: 0 + // Maximum: 1023 // -- - // Keywords: - // "closest" - 1.0 range - // "farthest" - 99999.0 range - "Aimless Range" "150.0" + // 0 OR 1023: Pick randomly between the 10 messages. + // 1: Message #1 + // 2: Message #2 + // 4: Message #3 + // 8: Message #4 + // 16: Message #5 + // 32: Message #6 + // 64: Message #7 + // 128: Message #8 + // 256: Message #9 + // 512: Message #10 + "Kill Message" "0" - // The Mutant Tank has this many chances out of 100.0% to trigger the range ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // All alive survivors vocalize when the Mutant Tank arrives. + // Note: This setting overrides the same setting under the "Plugin Settings/Announcements" section. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.0 (No chance) - // Maximum: 100.0 (Highest chance) - // -- - // Keywords: - // "never" - 0% chance - // "sometimes"/"unlikely"/"seldom" - 33.3% chance - // "maybe" - 50% chance - // "often"/"likely"/"frequently" - 66.6% chance - // "always" - 100% chance - "Aimless Range Chance" "15.0" + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Vocalize Arrival" "1" - // The cooldown for the Mutant Tank's range ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0 (OFF) - // Maximum: 99999 (Longest) + // All alive survivors vocalize when the Mutant Tank dies. + // Note: This setting overrides the same setting under the "Plugin Settings/Announcements" section. + // Note: This setting can be overridden for specific players. // -- - // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Aimless Range Cooldown" "0" + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Vocalize Death" "1" "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" { - // Note: Override any of the settings in the "Aimless Ability" section for each special infected here. + // Note: Override any of the settings in the "Announcements" section for each special infected here. // Example - "Access Flags" "" - "Immunity Flags" "" - "Close Areas Only" "0.0" - "Combo Ability" "0" - "Human Ability" "0" - "Human Ammo" "5" - "Human Cooldown" "0" - "Human Range Cooldown" "0" - "Open Areas Only" "0.0" - "Requires Humans" "1" - "Ability Enabled" "0" - "Ability Effect" "0" - "Ability Message" "0" - "Ability Sight" "0" - "Aimless Chance" "33.3" - "Aimless Cooldown" "0" - "Aimless Duration" "5.0" - "Aimless Gunshots" "0" - "Aimless Hit" "0" - "Aimless Hit Mode" "0" - "Aimless Range" "150.0" - "Aimless Range Chance" "15.0" - "Aimless Range Cooldown" "0" + "Announce Arrival" "0" + "Announce Death" "0" + "Announce Kill" "0" + "Arrival Message" "0" + "Arrival Sound" "1" + "Death Details" "5" + "Death Message" "0" + "Death Sound" "1" + "Kill Message" "0" + "Vocalize Arrival" "1" + "Vocalize Death" "1" } } - } -} -``` -
- -##### Ammo Ability -
- Click to expand! - -``` -"Mutant Tanks" -{ - "Tank #1" - { - // The Mutant Tank takes away survivors' ammunition. - // "Ability Enabled" - When a survivor is within range of the Mutant Tank, their ammunition is taken away. - // - "Ammo Range" - // - "Ammo Range Chance" - // - "Ammo Range Cooldown" - // "Ammo Hit" - When a survivor is hit by the Mutant Tank's claw or rock, or a survivor hits the Mutant Tank with a melee weapon, their ammunition is taken away. - // - "Ammo Chance" - // - "Ammo Cooldown" - // - "Ammo Hit Mode" - // Requires "mt_abilities.smx" to be compiled with "mt_ammo.sp" to work. - "Ammo Ability" + "Rewards" { - // Admins with one or more of these access flags have access to this ability. + // Reward survivors for fighting the Mutant Tank. + // Note: Some rewards may require Lux's "WeaponHandling_API" plugin. + // Link: https://forums.alliedmods.net/showthread.php?t=319947 + // Note: Some rewards may require patches from the "mutant_tanks_patches.cfg" config file to work. + // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. + // Note: This setting can be overridden for specific players. + // -- + // Separate values with commas (","). + // -- + // Add up numbers together for different results. + // -- + // Minimum value for each: -1 + // Maximum value for each: 2147483647 + // -- + // -1: OFF + // 0: Random + // 1: Health reward (temporary) + // - Refill to 100% health. + // - Automatically kill any current special infected attacker. + // - Heal back to 100% health with first aid kits. + // - Receive 100% temporary health after being revived. + // - Slowly regenerate back to full health. + // - Leech health off of any infected per melee hit. + // - Turn damage into health from self-made fires. + // - Turn damage into health from self-made explosions. + // - Heal teammates with bullets. + // - Heal teammates with melee hits. + // - Donate health to teammates. + // 2: Speed boost reward (temporary) + // - Run faster + // - Chain multiple jumps + // - Jump higher (Disables the death fall camera for recipients.) + // - Receive the adrenaline effect. (Only available in Left 4 Dead 2.) + // - Bunny hop consistently + // - Burst open doors + // - Throw sticky grenades that slow down special infected and mitigate their abilities. + // 4: Damage boost reward (temporary) + // - Laser sight + // - Eternal flames + // - Extended pipebomb duration + // - Prevent dealing and receiving friendly-fire. + // - Extra damage + // - Bypass Tank immunities + // - Damage resistance + // - Automatically kill Witches. + // - Ghost bullets + // - Hollowpoint ammo + // - Extended melee range + // - Recoil dampener + // - Sledgehammer rounds + // - Protected by thorns (deal damage towards attacker per hit taken) + // 8: Attack boost reward (temporary) + // - Prevent slowing down when attacked by infected. + // - Prevent infected attacks from offsetting aim. + // - Prevent interruption when performing actions. + // - Prevent switching to secondary slot when equipping a secondary pistol. + // - Prevent switching to throwables and health supplies given by teammates. + // - Perform actions on ladders. + // - Bypass shove penalty. + // - Shoving damages Tanks. + // - Faster shove interval + // - Faster fire rate (guns) + // - Faster reload rate (guns) + // - Faster swing rate (melee) + // - Faster throw time (throwables) + // - Faster revive time + // - Faster healing time (first aid kit) + // - Faster defib time (defibrillator) + // - Faster deploy time (ammo upgrade packs) + // - Faster pour time (gas cans) + // - Faster delivery time (cola bottles) + // - Faster recovery time + // - Rapid-fire pistols + // 16: Ammo reward (temporary) + // - Refill clip to max size + // - Refill magazine to max size + // - Extra clip and magazine size + // - Receive one of the special ammo types (incendiary or explosive). (Only available in Left 4 Dead 2.) + // - Slowly regenerate back to full capacity. + // - Throw multiple pipe bombs at once (cluster bombs). + // - Shoot grenades + // 32: Item reward + // - Receive up to five items. + // 64: God mode reward (temporary) + // - Automatically prevent attacks from and kill all special infected attackers. + // - Immune to all types of damage. + // - Cannot be nudged by teammates. + // - Cannot be flung away by Chargers. + // - Cannot be pushed around. + // - Cannot be vomited on by Boomers. + // - Reduced pushback from Tank punches + // - Reduced pushback from hitting Tanks with melee immunity. + // - Get clean kills (blocks Smoker clouds, Boomer explosions, and Spitter acid puddles) + // 128: Health and ammo refill reward + // - Refill to 100% health. + // - Automatically kill any current special infected attacker. + // - Refill clip to max size + // - Refill magazine to max size + // 256: Respawn reward + // - Respawn and teleport to a teammate. + // - Restore previous loadout + // 512: Infinite ammo reward (temporary) + // - Infinite ammo for primary weapons + // - Infinite ammo for secondary weapons + // - Infinite ammo for throwables + // - Infinite ammo for medkits/defibs/ammo packs + // - Infinite ammo for pills/adrenaline + // 1023: All above rewards + // 1024-2147483647: Reserved for third-party plugins + // -- + // 1st number = Enable rewards for killers. + // 2nd number = Enable rewards for assistants. + // 3rd number = Enable rewards for teammates. + // 4th number = Enable rewards for assistant killers. + "Reward Enabled" "-1,-1,-1,-1" + + // Reward survivor bots for fighting the Mutant Tank. + // Note: Some rewards may require Lux's "WeaponHandling_API" plugin. + // Link: https://forums.alliedmods.net/showthread.php?t=319947 + // Note: Some rewards may require patches from the "mutant_tanks_patches.cfg" config file to work. + // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. // Note: This setting can be overridden for specific players. // -- - // Empty: No access flags have access. - // Not empty: These access flags have access. - "Access Flags" "" + // Separate values with commas (","). + // -- + // Add up numbers together for different results. + // -- + // Minimum value for each: -1 + // Maximum value for each: 2147483647 + // -- + // -1: OFF + // 0: Random + // 1: Health reward (temporary) + // - Refill to 100% health. + // - Automatically kill any current special infected attacker. + // - Heal back to 100% health with first aid kits. + // - Receive 100% temporary health after being revived. + // - Slowly regenerate back to full health. + // - Leech health off of any infected per melee hit. + // - Turn damage into health from self-made fires. + // - Turn damage into health from self-made explosions. + // - Heal teammates with bullets. + // - Heal teammates with melee hits. + // - Donate health to teammates. + // 2: Speed boost reward (temporary) + // - Run faster + // - Chain multiple jumps + // - Jump higher (Disables the death fall camera for recipients.) + // - Receive the adrenaline effect. (Only available in Left 4 Dead 2.) + // - Bunny hop consistently + // - Burst open doors + // - Throw sticky grenades that slow down special infected and mitigate their abilities. + // 4: Damage boost reward (temporary) + // - Laser sight + // - Eternal flames + // - Extended pipebomb duration + // - Prevent dealing and receiving friendly-fire. + // - Extra damage + // - Bypass Tank immunities + // - Damage resistance + // - Automatically kill Witches. + // - Ghost bullets + // - Hollowpoint ammo + // - Extended melee range + // - Recoil dampener + // - Sledgehammer rounds + // - Protected by thorns (deal damage towards attacker per hit taken) + // 8: Attack boost reward (temporary) + // - Prevent slowing down when attacked by infected. + // - Prevent infected attacks from offsetting aim. + // - Prevent interruption when performing actions. + // - Prevent switching to secondary slot when equipping a secondary pistol. + // - Prevent switching to throwables and health supplies given by teammates. + // - Perform actions on ladders. + // - Bypass shove penalty. + // - Shoving damages Tanks. + // - Faster shove interval + // - Faster fire rate (guns) + // - Faster reload rate (guns) + // - Faster swing rate (melee) + // - Faster throw time (throwables) + // - Faster revive time + // - Faster healing time (first aid kit) + // - Faster defib time (defibrillator) + // - Faster deploy time (ammo upgrade packs) + // - Faster pour time (gas cans) + // - Faster delivery time (cola bottles) + // - Faster recovery time + // - Rapid-fire pistols + // 16: Ammo reward (temporary) + // - Refill clip to max size + // - Refill magazine to max size + // - Extra clip and magazine size + // - Receive one of the special ammo types (incendiary or explosive). (Only available in Left 4 Dead 2.) + // - Slowly regenerate back to full capacity. + // - Throw multiple pipe bombs at once (cluster bombs). + // - Shoot grenades + // 32: Item reward + // - Receive up to five items. + // 64: God mode reward (temporary) + // - Automatically prevent attacks from and kill all special infected attackers. + // - Immune to all types of damage. + // - Cannot be nudged by teammates. + // - Cannot be flung away by Chargers. + // - Cannot be pushed around. + // - Cannot be vomited on by Boomers. + // - Reduced pushback from Tank punches + // - Reduced pushback from hitting Tanks with melee immunity. + // - Get clean kills (blocks Smoker clouds, Boomer explosions, and Spitter acid puddles) + // 128: Health and ammo refill reward + // - Refill to 100% health. + // - Automatically kill any current special infected attacker. + // - Refill clip to max size + // - Refill magazine to max size + // 256: Respawn reward + // - Respawn and teleport to a teammate. + // - Restore previous loadout + // 512: Infinite ammo reward (temporary) + // - Infinite ammo for primary weapons + // - Infinite ammo for secondary weapons + // - Infinite ammo for throwables + // - Infinite ammo for medkits/defibs/ammo packs + // - Infinite ammo for pills/adrenaline + // 1023: All above rewards + // 1024-2147483647: Reserved for third-party plugins + // -- + // 1st number = Enable rewards for killers. + // 2nd number = Enable rewards for assistants. + // 3rd number = Enable rewards for teammates. + // 4th number = Enable rewards for assistant killers. + "Reward Bots" "-1,-1,-1,-1" - // Admins with one or more of these immunity flags are immune to this ability's effects. - // Note: If the Mutant Tank has one or more of these immunity flags or has the same immunity flags as the survivor victim, the immunity is cancelled. + // The chance to reward survivors for killing the Mutant Tank. + // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. // Note: This setting can be overridden for specific players. // -- - // Empty: No immunity flags are immune. - // Not empty: These immunity flags are immune. - "Immunity Flags" "" - - // The ability can only activate in close areas. - // Note: Do not change this setting if you are unsure of how it works. - // Note: This setting can be overridden for specific players. + // Separate chances with commas (","). // -- - // Minimum: 0.0 (OFF) - // Maximum: 99999.0 (Farthest) + // Chances limit: 4 + // Character limit for each chance: 6 // -- - // Keywords: - // "disabled"/"false"/"off"/"no" - 0.0 range - // "farthest" - 99999.0 range - "Close Areas Only" "0.0" + // Minimum value for each chance: 0.0 (No chance) + // Maximum value for each chance: 100.0 (Highest chance) + // -- + // 1st number = Chance to reward killers. + // 2nd number = Chance to reward assistants. + // 3rd number = Chance to reward teammates. + // 4th number = Chance to reward assistant killers. + "Reward Chance" "0.0,0.0,0.0,0.0" - // Use this ability in conjunction with other abilities. - // Note: Only use this when "Spawn Type" is set to "4" for the Mutant Tank. - // Note: This setting does not affect human-controlled Mutant Tanks unless the "Human Ability" setting is set to "2". + // The duration of temporary rewards. + // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. // Note: This setting can be overridden for specific players. // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Combo Ability" "0" + // Separate durations with commas (","). + // -- + // Durations limit: 4 + // Character limit for each duration: 9 + // -- + // Minimum value for each duration: 0.1 (Shortest) + // Maximum value for each duration: 99999.0 (Longest) + // -- + // 1st number = Duration for killer rewards. + // 2nd number = Duration for assistant rewards. + // 3rd number = Duration for teammate rewards. + // 4th number = Duration for assistant killers. + "Reward Duration" "0.0,0.0,0.0,0.0" - // Allow human-controlled Mutant Tanks to use this ability. + // The effects displayed when rewarding survivors. + // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. // Note: This setting can be overridden for specific players. // -- + // Separate values with commas (","). + // -- + // Add up numbers together for different results. + // -- + // Minimum value for each: 0 + // Maximum value for each: 15 + // -- // 0: OFF - // 1: ON, players can use buttons to activate abilities. - // 2: ON, abilities will activate automatically. - "Human Ability" "0" + // 1: Trophy + // 2: Fireworks particles + // 4: Sound effect + // 8: Thirdperson view (Recommended: ThirdPersonShoulder_Detect) [Link: https://forums.alliedmods.net/showthread.php?t=298649] + // -- + // 1st number = Effect for killers. + // 2nd number = Effect for assistants. + // 3rd number = Effect for teammates. + // 4th number = Effect for assistant killers. + "Reward Effect" "0,0,0,0" - // Determines how many times human-controlled Mutant Tanks can use their abilities in one life. + // Notify survivors when they receive a reward from the Mutant Tank. + // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 - // Maximum: 99999 + // Separate values with commas (","). // -- - // Keywords: - // "none"/"off" - 0 ammo - // "infinite" - 99999 ammo - "Human Ammo" "5" - - // Human-controlled Mutant Tanks must wait this long before using their abilities again. - // Note: This setting can be overridden for specific players. + // Values limit: 4 + // Character limit for each value: 1 // -- - // Minimum: 0 (OFF) - // Maximum: 99999 (Longest) + // Add up numbers together for different results. // -- - // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Human Cooldown" "0" - - // Human-controlled Mutant Tanks must wait this long before using their range ability again. - // Note: This setting can be overridden for specific players. + // Minimum value for each: 0 + // Maximum value for each: 3 // -- - // Minimum: 0 (OFF) - // Maximum: 99999 (Longest) + // 0: OFF + // 1: When survivors solo the Mutant Tank or do not do enough damage to the Mutant Tank. + // 2: When survivors receive a reward. // -- - // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Human Range Cooldown" "0" + // 1st number = Notify killers. + // 2nd number = Notify assistants. + // 3rd number = Notify teammates. + // 4th number = Notify assistant killers. + "Reward Notify" "0,0,0,0" - // The ability can only activate in open areas. - // Note: Do not change this setting if you are unsure of how it works. + // The minimum amount of damage in percentage required to receive a reward. + // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.0 (OFF) - // Maximum: 99999.0 (Farthest) + // Separate percentages with commas (","). // -- - // Keywords: - // "disabled"/"false"/"off"/"no" - 0.0 range - // "farthest" - 99999.0 range - "Open Areas Only" "0.0" + // Percentages limit: 4 + // Character limit for each percentage: 6 + // -- + // Minimum value for each percentage: 0.1 (Least) + // Maximum value for each percentage: 100.0 (All) + // -- + // 1st number = Percentage of damage required for killer rewards. + // 2nd number = Percentage of damage required for assistant rewards. + // 3rd number = Percentage of damage required for teammate rewards. + // 4th number = Percentage of damage required for assistant killers. + "Reward Percentage" "0.0,0.0,0.0,0.0" - // The ability is only effective toward human survivors. + // The visual effects displayed for rewards. + // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 - // Maximum: 32 + // Separate values with commas (","). + // -- + // Add up numbers together for different results. + // -- + // Minimum value for each: 0 + // Maximum value for each: 127 // -- // 0: OFF - // 1-32: ON, the number of human survivors required to be present for this ability to be effective. - "Requires Humans" "1" - - // Enable this ability. - // Note: This setting does not affect the "Ammo Hit" setting. - // Note: This setting can be overridden for specific players. + // 1: Screen color + // 2: Particle effect + // 4: Looping voiceline + // 8: Voice pitch + // 16: Light color + // 32: Body color + // 64: Glow outline (Only available in Left 4 Dead 2.) // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Ability Enabled" "0" + // 1st number = Visual effect for killers. + // 2nd number = Visual effect for assistants. + // 3rd number = Visual effect for teammates. + // 4th number = Visual effect for assistant killers. + "Reward Visual" "0,0,0,0" - // Show a screen fade effect when the Mutant Tank uses its abilities. - // Note: The colors will randomly change between the colors set in the "Skin Color" and "Glow Color" settings. + // Enable the "sm_mt_prefs" command and notify players about it. + // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. // Note: This setting can be overridden for specific players. // -- - // Add up numbers together for different results. + // Separate values with commas (","). // -- - // Minimum: 0 - // Maximum: 7 + // Values limit: 4 + // Character limit for each value: 1 // -- - // 0: OFF - // 1: Show effect when the Mutant Tank uses its claw/rock attack. - // 2: Show effect when the Mutant Tank is hit by a melee weapon. - // 4: Show effect when the Mutant Tank uses its range ability. + // Minimum value for each: 0 (OFF) + // Maximum value for each: 1 (ON) // -- - // Keywords: - // "none"/"off" - 0 - // "attack" - 1 - // "hurt" - 2 - // "attack,hurt" - 3 - // "range" - 4 - // "attack,range" - 5 - // "hurt,range" - 6 - // "attack,hurt,range" - 7 - "Ability Effect" "0" + // 1st number = Notify and enable command for killers. + // 2nd number = Notify and enable command for assistants. + // 3rd number = Notify and enable command for teammates. + // 4th number = Notify and enable command for assistant killers. + "Prefs Notify" "0,0,0,0" - // Display a message whenever the ability activates/deactivates. + // Allow players to share their rewards with teammates when they have reached the stack limits. + // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. // Note: This setting can be overridden for specific players. // -- - // Add up numbers together for different results. + // Separate values with commas (","). // -- - // Minimum: 0 - // Maximum: 3 + // Values limit: 4 + // Character limit for each value: 1 // -- - // 0: OFF - // 1: Display message only when "Ammo Hit" is enabled. - // 2: Display message only when "Ability Enabled" is enabled. + // Minimum value for each: 0 + // Maximum value for each: 3 + // -- + // 0: OFF, let players keep their rewards. + // 1: ON, allow players to share their rewards with only human-controlled teammates. + // 2: ON, allow players to share their rewards with only bot teammates. + // 3: ON, allow players to share their rewards with all teammates. // -- - // Keywords: - // "none"/"off" - 0 - // "hit" - 1 - // "ability" - 2 - // "both"/"all"/"hit,ability" - 3 - "Ability Message" "0" + // 1st number = Allow killers to share. + // 2nd number = Allow assistants to share. + // 3rd number = Allow teammates to share. + // 4th number = Allow assistant killers to share. + "Share Rewards" "0,0,0,0" - // Check line-of-sight when the Mutant Tank uses its abilities. + // The total number of teammates to reward for assisting against the Mutant Tank. + // Note: This setting excludes killers and most assists. + // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. // Note: This setting can be overridden for specific players. // -- // Minimum: 0 - // Maximum: 5 + // Maximum: 32 // -- - // 0: OFF - // 1: Check if there is a solid object between the Mutant Tank and survivors. - // 2: Option 1 + Check if the Mutant Tank is looking toward the survivors. - // 3: Option 1 + Check if the Mutant Tank is looking away from the survivors. - // 4: Option 1 + Check if the survivors are looking toward the Mutant Tank. - // 5: Option 1 + Check if the survivors are looking away from the Mutant Tank. - "Ability Sight" "0" + // 0: OFF, no limit (reward as many applicable recipients as possible). + // 1-32: ON, the total number of assistants to reward. + "Teammate Limit" "0" - // The Mutant Tank has this many chances out of 100.0% to trigger the ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // The action duration to reward to survivors. + // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.0 (No chance) - // Maximum: 100.0 (Highest chance) + // Separate durations with commas (","). // -- - // Keywords: - // "never" - 0% chance - // "sometimes"/"unlikely"/"seldom" - 33.3% chance - // "maybe" - 50% chance - // "often"/"likely"/"frequently" - 66.6% chance - // "always" - 100% chance - "Ammo Chance" "33.3" - - // The cooldown for the Mutant Tank's hit ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". - // Note: This setting can be overridden for specific players. + // Durations limit: 4 + // Character limit for each duration: 9 // -- - // Minimum: 0 (OFF) - // Maximum: 99999 (Longest) + // Minimum value for each duration: 0.0 (OFF) + // Maximum value for each duration: 99999.0 (Slowest) // -- - // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Ammo Cooldown" "0" + // 1st number = Duration for killers. + // 2nd number = Duration for assistants. + // 3rd number = Duration for teammates. + // 4th number = Duration for assistant killers. + "Action Duration Reward" "0.0,0.0,0.0,0.0" - // The Mutant Tank takes this amount of ammunition from survivors. + // The adrenaline time to reward to survivors. + // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 - // Maximum: 100 - "Ammo Count" "0" - - // Enable the Mutant Tank's claw/rock attack. - // Note: This setting does not need the "Ability Enabled" setting to be set to "1". - // Note: This setting can be overridden for specific players. + // Separate durations with commas (","). // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Ammo Hit" "0" - - // The mode of the Mutant Tank's claw/rock attack. - // Note: This setting can be overridden for specific players. + // Durations limit: 4 + // Character limit for each duration: 9 // -- - // 0: Both - // 1: Ability activates when the Mutant Tank hits a survivor. - // 2: Ability activates when the Mutant Tank is hit by a survivor. + // Minimum value for each duration: 0.0 (OFF) + // Maximum value for each duration: 99999.0 (Fastest) // -- - // Keywords: - // "both"/"all" - 0 - // "tank"/"attack" - 1 - // "survivor"/"hurt" - 2 - "Ammo Hit Mode" "0" + // 1st number = Duration for killers. + // 2nd number = Duration for assistants. + // 3rd number = Duration for teammates. + // 4th number = Duration for assistant killers. + "Adrenaline Time Reward" "0.0,0.0,0.0,0.0" - // The distance between a survivor and the Mutant Tank needed to trigger the ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Give ammo boost as a reward to survivors. + // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. // Note: This setting can be overridden for specific players. // -- - // Minimum: 1.0 (Closest) - // Maximum: 99999.0 (Farthest) + // Separate values with commas (","). // -- - // Keywords: - // "closest" - 1.0 range - // "farthest" - 99999.0 range - "Ammo Range" "150.0" + // Values limit: 4 + // Character limit for each value: 1 + // -- + // Minimum value for each: 0 (OFF) + // Maximum value for each: 1 (ON) + // -- + // 1st number = Give ammo boost to killers. + // 2nd number = Give ammo boost to assistants. + // 3rd number = Give ammo boost to teammates. + // 4th number = Give ammo boost to assistant killers. + "Ammo Boost Reward" "0,0,0,0" - // The Mutant Tank has this many chances out of 100.0% to trigger the range ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Give ammo refill as a reward to survivors. + // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.0 (No chance) - // Maximum: 100.0 (Highest chance) + // Separate values with commas (","). // -- - // Keywords: - // "never" - 0% chance - // "sometimes"/"unlikely"/"seldom" - 33.3% chance - // "maybe" - 50% chance - // "often"/"likely"/"frequently" - 66.6% chance - // "always" - 100% chance - "Ammo Range Chance" "15.0" + // Values limit: 4 + // Character limit for each value: 1 + // -- + // Minimum value for each: 0 (OFF) + // Maximum value for each: 1 (ON) + // -- + // 1st number = Give ammo refill to killers. + // 2nd number = Give ammo refill to assistants. + // 3rd number = Give ammo refill to teammates. + // 4th number = Give ammo refill to assistant killers. + "Ammo Refill Reward" "0,0,0,0" - // The cooldown for the Mutant Tank's range ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // The amount of ammo to regenerate per second as a reward to survivors. + // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 (OFF) - // Maximum: 99999 (Longest) + // Separate amounts with commas (","). // -- - // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Ammo Range Cooldown" "0" + // Amounts limit: 4 + // Character limit for each amount: 6 + // -- + // Minimum value for each amount: 0 (OFF) + // Maximum value for each amount: 99999 (Highest) + // -- + // 1st number = Amount for killers. + // 2nd number = Amount for assistants. + // 3rd number = Amount for teammates. + // 4th number = Amount for assistant killers. + "Ammo Regen Reward" "0,0,0,0" - // The Mutant Tank takes this type of ammunition from survivors. + // The attack boost to reward to survivors. + // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. // Note: This setting can be overridden for specific players. // -- - // Add up numbers together for different results. + // Separate boosts with commas (","). // -- - // Minimum: 0 - // Maximum: 3 + // Boosts limit: 4 + // Character limit for each boost: 9 // -- - // 0 OR 3: All types of ammunition. - // 1: Magazine (Clip) - // 2: Reserved (Ammo) - "Ammo Type" "3" - - "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" - { - // Note: Override any of the settings in the "Ammo Ability" section for each special infected here. - - // Example - "Access Flags" "" - "Immunity Flags" "" - "Close Areas Only" "0.0" - "Combo Ability" "0" - "Human Ability" "0" - "Human Ammo" "5" - "Human Cooldown" "0" - "Human Range Cooldown" "0" - "Open Areas Only" "0.0" - "Requires Humans" "1" - "Ability Enabled" "0" - "Ability Effect" "0" - "Ability Message" "0" - "Ability Sight" "0" - "Ammo Chance" "33.3" - "Ammo Cooldown" "0" - "Ammo Count" "0" - "Ammo Hit" "0" - "Ammo Hit Mode" "0" - "Ammo Range" "150.0" - "Ammo Range Chance" "15.0" - "Ammo Range Cooldown" "0" - "Ammo Type" "3" - } - } - } -} -``` -
- -##### Blind Ability -
- Click to expand! + // Minimum value for each boost: 0.0 (OFF) + // Maximum value for each boost: 99999.0 (Fastest) + // -- + // 1st number = Boost for killers. + // 2nd number = Boost for assistants. + // 3rd number = Boost for teammates. + // 4th number = Boost for assistant killers. + "Attack Boost Reward" "0.0,0.0,0.0,0.0" -``` -"Mutant Tanks" -{ - "Tank #1" - { - // The Mutant Tank blinds survivors. - // "Ability Enabled" - When a survivor is within range of the Mutant Tank, the survivor is blinded. - // - "Blind Range" - // - "Blind Range Chance" - // - "Blind Range Cooldown" - // "Blind Hit" - When a survivor is hit by the Mutant Tank's claw or rock, or a survivor hits the Mutant Tank with a melee weapon, the survivor is blinded. - // - "Blind Chance" - // - "Blind Cooldown" - // - "Blind Hit Mode" - // Requires "mt_abilities.smx" to be compiled with "mt_blind.sp" to work. - "Blind Ability" - { - // Admins with one or more of these access flags have access to this ability. + // Allow healing from self-made fires as a reward to survivors. + // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. // Note: This setting can be overridden for specific players. // -- - // Empty: No access flags have access. - // Not empty: These access flags have access. - "Access Flags" "" + // Separate values with commas (","). + // -- + // Values limit: 4 + // Character limit for each value: 7 + // -- + // Minimum value for each: 0 (OFF) + // Maximum value for each: 1000000 (Highest) + // -- + // 1st number = Allow healing from self-made fires to killers. + // 2nd number = Allow healing from self-made fires to assistants. + // 3rd number = Allow healing from self-made fires to teammates. + // 4th number = Allow healing from self-made fires to assistant killers. + "Blaze Health Reward" "0,0,0,0" - // Admins with one or more of these immunity flags are immune to this ability's effects. - // Note: If the Mutant Tank has one or more of these immunity flags or has the same immunity flags as the survivor victim, the immunity is cancelled. + // Take this much health from the recipient whenever the recipient heals a teammate with any of the following rewards: + // - Blaze Health Reward + // - Medical Cuts Reward + // - Regen Bursts Reward + // - Syringe Darts Reward + // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. // Note: This setting can be overridden for specific players. // -- - // Empty: No immunity flags are immune. - // Not empty: These immunity flags are immune. - "Immunity Flags" "" + // Separate values with commas (","). + // -- + // Values limit: 4 + // Character limit for each value: 7 + // -- + // Minimum value for each: 0 (OFF) + // Maximum value for each: 1000000 (Highest) + // -- + // 1st number = Take this much health from killers. + // 2nd number = Take this much health from assistants. + // 3rd number = Take this much health from teammates. + // 4th number = Take this much health from assistant killers. + "Blood Donor Reward" "0,0,0,0" - // The ability can only activate in close areas. - // Note: Do not change this setting if you are unsure of how it works. + // Allow bunnyhopping as a reward to survivors. + // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.0 (OFF) - // Maximum: 99999.0 (Farthest) + // Separate values with commas (","). // -- - // Keywords: - // "disabled"/"false"/"off"/"no" - 0.0 range - // "farthest" - 99999.0 range - "Close Areas Only" "0.0" + // Values limit: 4 + // Character limit for each value: 1 + // -- + // Minimum value for each: 0 (OFF) + // Maximum value for each: 1 (ON) + // -- + // 1st number = Allow bunnyhopping to killers. + // 2nd number = Allow bunnyhopping to assistants. + // 3rd number = Allow bunnyhopping to teammates. + // 4th number = Allow bunnyhopping to assistant killers. + "Bunny Hop Reward" "0,0,0,0" - // Use this ability in conjunction with other abilities. - // Note: Only use this when "Spawn Type" is set to "4" for the Mutant Tank. - // Note: This setting does not affect human-controlled Mutant Tanks unless the "Human Ability" setting is set to "2". + // Allow survivors to burst open doors when running. + // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. // Note: This setting can be overridden for specific players. // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Combo Ability" "0" + // Separate values with commas (","). + // -- + // Values limit: 4 + // Character limit for each value: 1 + // -- + // Minimum value for each: 0 (OFF) + // Maximum value for each: 1 (ON) + // -- + // 1st number = Burst open doors for killers. + // 2nd number = Burst open doors for assistants. + // 3rd number = Burst open doors for teammates. + // 4th number = Burst open doors for assistant killers. + "Burst Doors Reward" "1,1,1,1" - // Allow human-controlled Mutant Tanks to use this ability. + // Give clean kills (no Smoker clouds, Boomer explosions, and Spitter acide puddles) as a reward to survivors. + // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. // Note: This setting can be overridden for specific players. // -- - // 0: OFF - // 1: ON, players can use buttons to activate abilities. - // 2: ON, abilities will activate automatically. - "Human Ability" "0" + // Separate values with commas (","). + // -- + // Values limit: 4 + // Character limit for each value: 1 + // -- + // Minimum value for each: 0 (OFF) + // Maximum value for each: 1 (ON) + // -- + // 1st number = Give clean kills to killers. + // 2nd number = Give clean kills to assistants. + // 3rd number = Give clean kills to teammates. + // 4th number = Give clean kills to assistant killers. + "Clean Kills Reward" "0,0,0,0" - // Determines how many times human-controlled Mutant Tanks can use their abilities in one life. + // Allow survivors to throw cluster bombs (multiple pipe bombs) as a reward. + // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 - // Maximum: 99999 + // Separate values with commas (","). // -- - // Keywords: - // "none"/"off" - 0 ammo - // "infinite" - 99999 ammo - "Human Ammo" "5" + // Values limit: 4 + // Character limit for each value: 6 + // -- + // Minimum value for each: 0 (OFF) + // Maximum value for each: 5 (Highest) + // -- + // 1st number = Number of clustered pipe bombs to give to killers. + // 2nd number = Number of clustered pipe bombs to give to assistants. + // 3rd number = Number of clustered pipe bombs to give to teammates. + // 4th number = Number of clustered pipe bombs to give to assistant killers. + "Cluster Bombs Reward" "0,0,0,0" - // Human-controlled Mutant Tanks must wait this long before using their abilities again. + // The damage boost to reward to survivors. + // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 (OFF) - // Maximum: 99999 (Longest) + // Separate boosts with commas (","). // -- - // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Human Cooldown" "0" + // Boosts limit: 4 + // Character limit for each boost: 9 + // -- + // Minimum value for each boost: 0.0 (OFF) + // Maximum value for each boost: 99999.0 (Strongest) + // -- + // 1st number = Boost for killers. + // 2nd number = Boost for assistants. + // 3rd number = Boost for teammates. + // 4th number = Boost for assistant killers. + "Damage Boost Reward" "0.0,0.0,0.0,0.0" - // Human-controlled Mutant Tanks must wait this long before using their range ability again. + // The damage resistance to reward to survivors. + // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 (OFF) - // Maximum: 99999 (Longest) + // Separate resistances with commas (","). // -- - // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Human Range Cooldown" "0" + // Resistances limit: 4 + // Character limit for each resistance: 9 + // -- + // Minimum value for each resistance: 0.0 (OFF) + // Maximum value for each resistance: 1.0 (None) + // -- + // 1st number = Resistance for killers. + // 2nd number = Resistance for assistants. + // 3rd number = Resistance for teammates. + // 4th number = Resistance for assistant killers. + "Damage Resistance Reward" "0.0,0.0,0.0,0.0" - // The ability can only activate in open areas. - // Note: Do not change this setting if you are unsure of how it works. + // When a survivor consumes adrenaline, any other survivors within this radius also receives the effects of adrenaline for a short duration. + // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.0 (OFF) - // Maximum: 99999.0 (Farthest) + // Separate radii with commas (","). // -- - // Keywords: - // "disabled"/"false"/"off"/"no" - 0.0 range - // "farthest" - 99999.0 range - "Open Areas Only" "0.0" + // Radii limit: 4 + // Character limit for each radius: 6 + // -- + // Minimum radius for each: 0.0 (OFF) + // Maximum radius for each: 100.0 (Farthest) + // -- + // 1st number = Radius for killers. + // 2nd number = Radius for assistants. + // 3rd number = Radius for teammates. + // 4th number = Radius for assistant killers. + "Dopamine Radius Reward" "0.0,0.0,0.0,0.0" - // The ability is only effective toward human survivors. + // Give inextinguishable fire as a reward to survivors. + // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 - // Maximum: 32 + // Separate values with commas (","). // -- - // 0: OFF - // 1-32: ON, the number of human survivors required to be present for this ability to be effective. - "Requires Humans" "1" + // Values limit: 4 + // Character limit for each value: 1 + // -- + // Minimum value for each: 0 (OFF) + // Maximum value for each: 1 (ON) + // -- + // 1st number = Give inextinguishable fire to killers. + // 2nd number = Give inextinguishable fire to assistants. + // 3rd number = Give inextinguishable fire to teammates. + // 4th number = Give inextinguishable fire to assistant killers. + "Eternal Flames Reward" "0,0,0,0" - // Enable this ability. - // Note: This setting does not affect the "Blind Hit" setting. + // The voiceline that plays when survivors are falling. + // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. // Note: This setting can be overridden for specific players. // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Ability Enabled" "0" + // Separate voicelines with commas (","). + // -- + // Voiceline limit: 4 + // Character limit for each voiceline: 64 + // -- + // 1st set = Fall voiceline for killers. + // 2nd set = Fall voiceline for assistants. + // 3rd set = Fall voiceline for teammates. + // 4th set = Fall voiceline for assistant killers. + "Fall Voiceline Reward" "" - // Show a screen fade effect when the Mutant Tank uses its abilities. - // Note: The colors will randomly change between the colors set in the "Skin Color" and "Glow Color" settings. + // Give fast recovery as a reward to survivors. + // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. // Note: This setting can be overridden for specific players. // -- - // Add up numbers together for different results. + // Separate values with commas (","). // -- - // Minimum: 0 - // Maximum: 7 + // Values limit: 4 + // Character limit for each value: 1 // -- - // 0: OFF - // 1: Show effect when the Mutant Tank uses its claw/rock attack. - // 2: Show effect when the Mutant Tank is hit by a melee weapon. - // 4: Show effect when the Mutant Tank uses its range ability. + // Minimum value for each: 0 (OFF) + // Maximum value for each: 1 (ON) // -- - // Keywords: - // "none"/"off" - 0 - // "attack" - 1 - // "hurt" - 2 - // "attack,hurt" - 3 - // "range" - 4 - // "attack,range" - 5 - // "hurt,range" - 6 - // "attack,hurt,range" - 7 - "Ability Effect" "0" + // 1st number = Give fast recovery to killers. + // 2nd number = Give fast recovery to assistants. + // 3rd number = Give fast recovery to teammates. + // 4th number = Give fast recovery to assistant killers. + "Fast Recovery Reward" "0,0,0,0" - // Display a message whenever the ability activates/deactivates. + // The fire rate to reward to survivors. + // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. // Note: This setting can be overridden for specific players. // -- - // Add up numbers together for different results. + // Separate rates with commas (","). // -- - // Minimum: 0 - // Maximum: 3 + // Rates limit: 4 + // Character limit for each rate: 9 // -- - // 0: OFF - // 1: Display message only when "Blind Hit" is enabled. - // 2: Display message only when "Ability Enabled" is enabled. + // Minimum value for each rate: 0.0 (OFF) + // Maximum value for each rate: 99999.0 (Fastest) // -- - // Keywords: - // "none"/"off" - 0 - // "hit" - 1 - // "ability" - 2 - // "both"/"all"/"hit,ability" - 3 - "Ability Message" "0" + // 1st number = Rate for killers. + // 2nd number = Rate for assistants. + // 3rd number = Rate for teammates. + // 4th number = Rate for assistant killers. + "Fire Rate Reward" "0.0,0.0,0.0,0.0" - // Check line-of-sight when the Mutant Tank uses its abilities. + // Give friendly-fire immunity as a reward to survivors. + // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 - // Maximum: 5 + // Separate values with commas (","). // -- - // 0: OFF - // 1: Check if there is a solid object between the Mutant Tank and survivors. - // 2: Option 1 + Check if the Mutant Tank is looking toward the survivors. - // 3: Option 1 + Check if the Mutant Tank is looking away from the survivors. - // 4: Option 1 + Check if the survivors are looking toward the Mutant Tank. - // 5: Option 1 + Check if the survivors are looking away from the Mutant Tank. - "Ability Sight" "0" - - // The Mutant Tank has this many chances out of 100.0% to trigger the ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". - // Note: This setting can be overridden for specific players. + // Values limit: 4 + // Character limit for each value: 1 // -- - // Minimum: 0.0 (No chance) - // Maximum: 100.0 (Highest chance) + // Minimum value for each: 0 (OFF) + // Maximum value for each: 1 (ON) // -- - // Keywords: - // "never" - 0% chance - // "sometimes"/"unlikely"/"seldom" - 33.3% chance - // "maybe" - 50% chance - // "often"/"likely"/"frequently" - 66.6% chance - // "always" - 100% chance - "Blind Chance" "33.3" - - // The cooldown for the Mutant Tank's hit ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // 1st number = Give immunity to killers. + // 2nd number = Give immunity to assistants. + // 3rd number = Give immunity to teammates. + // 4th number = Give immunity to assistant killers. + "Friendly Fire Reward" "0,0,0,0" + + // Give ghost bullets as a reward to survivors. + // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 (OFF) - // Maximum: 99999 (Longest) + // Separate values with commas (","). // -- - // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Blind Cooldown" "0" - - // The Mutant Tank's ability effects last this long. - // Note: This is ignored when the "Combo Ability" setting is set to "1". - // Note: This setting can be overridden for specific players. + // Values limit: 4 + // Character limit for each value: 1 // -- - // Minimum: 0.1 - // Maximum: 99999.0 + // Minimum value for each: 0 (OFF) + // Maximum value for each: 1 (ON) // -- - // Keywords: - // "milli"/"millisecond" - 0.1 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Blind Duration" "5.0" + // 1st number = Give ghost bullets to killers. + // 2nd number = Give ghost bullets to assistants. + // 3rd number = Give ghost bullets to teammates. + // 4th number = Give ghost bullets to assistant killers. + "Ghost Bullets Reward" "0,0,0,0" - // Enable the Mutant Tank's claw/rock attack. - // Note: This setting does not need the "Ability Enabled" setting to be set to "1". + // Give up this percentage of reserved ammo to launch a grenade on any gun as a reward to survivors. + // Note: Press your Use (default: E) and Zoom (default: mouse wheel) keys to launch a grenade. + // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. // Note: This setting can be overridden for specific players. // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Blind Hit" "0" - - // The mode of the Mutant Tank's claw/rock attack. - // Note: This setting can be overridden for specific players. + // Separate percentages with commas (","). // -- - // 0: Both - // 1: Ability activates when the Mutant Tank hits a survivor. - // 2: Ability activates when the Mutant Tank is hit by a survivor. + // Percentages limit: 4 + // Character limit for each percentage: 1 // -- - // Keywords: - // "both"/"all" - 0 - // "tank"/"attack" - 1 - // "survivor"/"hurt" - 2 - "Blind Hit Mode" "0" - - // The intensity of the Mutant Tank's blind effect. - // Note: This setting can be overridden for specific players. + // Minimum percentage for each: 0.0 (OFF) + // Maximum percentage for each: 100.0 (Highest) // -- - // Minimum: 0 (No effect) - // Maximum: 255 (Fully blind) - "Blind Intensity" "255" + // 1st number = Percentage of reserved ammo for killers. + // 2nd number = Percentage of reserved ammo for assistants. + // 3rd number = Percentage of reserved ammo for teammates. + // 4th number = Percentage of reserved ammo for assistant killers. + "Grenade Launcher Reward" "0.0,0.0,0.0,0.0" - // The mode of the Mutant Tank's blind ability. + // The healing percentage from first aid kits to reward to survivors. + // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. // Note: This setting can be overridden for specific players. // -- - // 0: Survivors get a black screen - // 1: Survivors suffer from a flashbang. - "Blind Mode" "0" - - // The distance between a survivor and the Mutant Tank needed to trigger the ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". - // Note: This setting can be overridden for specific players. + // Separate percentages with commas (","). // -- - // Minimum: 1.0 (Closest) - // Maximum: 99999.0 (Farthest) + // Percentages limit: 4 + // Character limit for each percentage: 6 // -- - // Keywords: - // "closest" - 1.0 range - // "farthest" - 99999.0 range - "Blind Range" "150.0" + // Minimum percentage for each: 0.0 (OFF) + // Maximum percentage for each: 100.0 (Highest) + // -- + // 1st number = Heal percentage for killers. + // 2nd number = Heal percentage for assistants. + // 3rd number = Heal percentage for teammates. + // 4th number = Heal percentage for assistant killers. + "Heal Percent Reward" "0.0,0.0,0.0,0.0" - // The Mutant Tank has this many chances out of 100.0% to trigger the range ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // When a survivor heals with a medkit, any other survivors within this radius also receives a small portion of health. + // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.0 (No chance) - // Maximum: 100.0 (Highest chance) + // Separate radii with commas (","). // -- - // Keywords: - // "never" - 0% chance - // "sometimes"/"unlikely"/"seldom" - 33.3% chance - // "maybe" - 50% chance - // "often"/"likely"/"frequently" - 66.6% chance - // "always" - 100% chance - "Blind Range Chance" "15.0" - - // The cooldown for the Mutant Tank's range ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". - // Note: This setting can be overridden for specific players. + // Radii limit: 4 + // Character limit for each radius: 6 // -- - // Minimum: 0 (OFF) - // Maximum: 99999 (Longest) + // Minimum radius for each: 0.0 (OFF) + // Maximum radius for each: 100.0 (Farthest) // -- - // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Blind Range Cooldown" "0" + // 1st number = Radius for killers. + // 2nd number = Radius for assistants. + // 3rd number = Radius for teammates. + // 4th number = Radius for assistant killers. + "Healthcare Radius Reward" "0.0,0.0,0.0,0.0" - // The Mutant Tank is staggered along with survivors when a flashbang is triggered. - // Note: This is ignored when the "Combo Ability" setting is set to "1". - // Note: This setting only applies if the "Blind Mode" setting is set to "1". + // The amount of health to regenerate per second as a reward to survivors. + // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. // Note: This setting can be overridden for specific players. // -- - // 0: OFF - // 1: Stagger survivors only. - // 2: Stagger the Mutant Tank only. - // 3: Stagger both. - "Blind Stagger" "3" - - "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" - { - // Note: Override any of the settings in the "Blind Ability" section for each special infected here. - - // Example - "Access Flags" "" - "Immunity Flags" "" - "Close Areas Only" "0.0" - "Combo Ability" "0" - "Human Ability" "0" - "Human Ammo" "5" - "Human Cooldown" "0" - "Human Range Cooldown" "0" - "Open Areas Only" "0.0" - "Requires Humans" "1" - "Ability Enabled" "0" - "Ability Effect" "0" - "Ability Message" "0" - "Ability Sight" "0" - "Blind Chance" "33.3" - "Blind Cooldown" "0" - "Blind Duration" "5.0" - "Blind Hit" "0" - "Blind Hit Mode" "0" - "Blind Intensity" "255" - "Blind Mode" "0" - "Blind Range" "150.0" - "Blind Range Chance" "15.0" - "Blind Range Cooldown" "0" - "Blind Stagger" "3" - } - } - } -} -``` -
- -##### Bomb Ability -
- Click to expand! - -``` -"Mutant Tanks" -{ - "Tank #1" - { - // The Mutant Tank creates explosions. - // "Ability Enabled" - When a survivor is within range of the Mutant Tank, an explosion is created around the survivor. - // - "Bomb Range" - // - "Bomb Range Chance" - // - "Bomb Range Cooldown" - // "Bomb Death" - When the Mutant Tank dies or spawns, an explosion is created underneath the Mutant Tank. - // - "Bomb Death Chance" - // - "Bomb Death Range" - // "Bomb Hit" - When a survivor is hit by the Mutant Tank's claw or rock, or a survivor hits the Mutant Tank with a melee weapon, an explosion is created around the survivor. - // - "Bomb Chance" - // - "Bomb Cooldown" - // - "Bomb Hit Mode" - // "Bomb Rock Break" - When the Mutant Tank's rock breaks, it creates an explosion. - // - "Bomb Rock Chance" - // - "Bomb Rock Cooldown" - // Requires "mt_abilities.smx" to be compiled with "mt_bomb.sp" to work. - "Bomb Ability" - { - // Admins with one or more of these access flags have access to this ability. - // Note: This setting can be overridden for specific players. + // Separate amounts with commas (","). // -- - // Empty: No access flags have access. - // Not empty: These access flags have access. - "Access Flags" "" - - // Admins with one or more of these immunity flags are immune to this ability's effects. - // Note: If the Mutant Tank has one or more of these immunity flags or has the same immunity flags as the survivor victim, the immunity is cancelled. - // Note: This setting can be overridden for specific players. + // Amounts limit: 4 + // Character limit for each amount: 7 // -- - // Empty: No immunity flags are immune. - // Not empty: These immunity flags are immune. - "Immunity Flags" "" + // Minimum value for each amount: 0 (OFF) + // Maximum value for each amount: 1000000 (Highest) + // -- + // 1st number = Amount for killers. + // 2nd number = Amount for assistants. + // 3rd number = Amount for teammates. + // 4th number = Amount for assistant killers. + "Health Regen Reward" "0,0,0,0" - // The ability can only activate in close areas. - // Note: Do not change this setting if you are unsure of how it works. + // This is the cooldown for a small healing wave that triggers whenever a survivor hurts any infected target. Any teammate within the small radius will receive 5 HP. + // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.0 (OFF) - // Maximum: 99999.0 (Farthest) + // Separate cooldowns with commas (","). // -- - // Keywords: - // "disabled"/"false"/"off"/"no" - 0.0 range - // "farthest" - 99999.0 range - "Close Areas Only" "0.0" - - // Use this ability in conjunction with other abilities. - // Note: Only use this when "Spawn Type" is set to "4" for the Mutant Tank. - // Note: This setting does not affect human-controlled Mutant Tanks unless the "Human Ability" setting is set to "2". - // Note: This setting can be overridden for specific players. + // Cooldowns limit: 4 + // Character limit for each cooldown: 9 // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Combo Ability" "0" - - // Allow human-controlled Mutant Tanks to use this ability. - // Note: This setting can be overridden for specific players. + // Minimum value for each cooldown: 0.0 (OFF) + // Maximum value for each cooldown: 99999.0 (Longest) // -- - // 0: OFF - // 1: ON, players can use buttons to activate abilities. - // 2: ON, abilities will activate automatically. - "Human Ability" "0" + // 1st number = Cooldown for killers. + // 2nd number = Cooldown for assistants. + // 3rd number = Cooldown for teammates. + // 4th number = Cooldown for assistant killers. + "Heartbeat Reward" "0.0,0.0,0.0,0.0" - // Determines how many times human-controlled Mutant Tanks can use their abilities in one life. + // The chance to shoot hollowpoint ammo as a reward to survivors. + // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 - // Maximum: 99999 + // Separate chances with commas (","). // -- - // Keywords: - // "none"/"off" - 0 ammo - // "infinite" - 99999 ammo - "Human Ammo" "5" - - // Human-controlled Mutant Tanks must wait this long before using their hit ability again. - // Note: This setting can be overridden for specific players. + // Chances limit: 4 + // Character limit for each chance: 6 // -- - // Minimum: 0 (OFF) - // Maximum: 99999 (Longest) + // Minimum value for each chance: 0.0 (No chance) + // Maximum value for each chance: 100.0 (Highest chance) // -- - // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Human Cooldown" "0" + // 1st number = Chance to shoot hollowpoint ammo for killers. + // 2nd number = Chance to shoot hollowpoint ammo for assistants. + // 3rd number = Chance to shoot hollowpoint ammo for teammates. + // 4th number = Chance to shoot hollowpoint ammo for assistant killers. + "Hollowpoint Ammo Reward" "0.0,0.0,0.0,0.0" - // Human-controlled Mutant Tanks must wait this long before using their range ability again. + // Give infinite ammo as a reward to survivors. + // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 (OFF) - // Maximum: 99999 (Longest) + // Separate values with commas (","). // -- - // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Human Range Cooldown" "0" + // Add up numbers together for different results. + // -- + // Minimum value for each: 0 + // Maximum value for each: 31 + // -- + // 0: OFF + // 1: Infinite ammo for primary weapons + // 2: Infinite ammo for secondary weapons + // 4: Infinite ammo for throwables + // 8: Infinite ammo for medkits/defibs/ammo packs + // 16: Infinite ammo for pills/adrenaline + // -- + // 1st number = Give infinite ammo to killers. + // 2nd number = Give infinite ammo to assistants. + // 3rd number = Give infinite ammo to teammates. + // 4th number = Give infinite ammo to assistant killers. + "Infinite Ammo Reward" "0,0,0,0" - // Human-controlled Mutant Tanks must wait this long before using their rock ability again. + // The item(s) to reward to survivors. + // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 (OFF) - // Maximum: 99999 (Longest) + // Separate item sets with commas (","). + // Separate items with semi-colons (";"). // -- - // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Human Rock Cooldown" "0" + // Item sets limit: 4 + // Character limit for each set: 320 + // -- + // 1st set = Item set to reward killers. + // 2nd set = Item set to reward assistants. + // 3rd set = Item set to reward teammates. + // 4th set = Item set to reward assistant killers. + "Item Reward" "" - // The ability can only activate in open areas. - // Note: Do not change this setting if you are unsure of how it works. + // The jump height to reward to survivors. + // Note: Any value above "150.0" may cause instant death from fall damage. + // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.0 (OFF) - // Maximum: 99999.0 (Farthest) + // Separate heights with commas (","). // -- - // Keywords: - // "disabled"/"false"/"off"/"no" - 0.0 range - // "farthest" - 99999.0 range - "Open Areas Only" "0.0" - - // The ability is only effective toward human survivors. - // Note: This setting can be overridden for specific players. + // Heights limit: 4 + // Character limit for each height: 9 // -- - // Minimum: 0 - // Maximum: 32 + // Minimum value for each height: 0.0 (OFF) + // Maximum value for each height: 99999.0 (Highest) // -- - // 0: OFF - // 1-32: ON, the number of human survivors required to be present for this ability to be effective. - "Requires Humans" "0" + // 1st number = Height for killers. + // 2nd number = Height for assistants. + // 3rd number = Height for teammates. + // 4th number = Height for assistant killers. + "Jump Height Reward" "0.0,0.0,0.0,0.0" - // Enable this ability. - // Note: This setting does not affect the "Bomb Hit" setting. + // Allow survivors to perform actions while on ladders. + // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. // Note: This setting can be overridden for specific players. // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Ability Enabled" "0" + // Separate values with commas (","). + // -- + // Values limit: 4 + // Character limit for each value: 1 + // -- + // Minimum value for each: 0 (OFF) + // Maximum value for each: 1 (ON) + // -- + // 1st number = Allow actions for killers. + // 2nd number = Allow actions for assistants. + // 3rd number = Allow actions for teammates. + // 4th number = Allow actions for assistant killers. + "Ladder Actions Reward" "0,0,0,0" - // Show a screen fade effect when the Mutant Tank uses its abilities. - // Note: The colors will randomly change between the colors set in the "Skin Color" and "Glow Color" settings. + // Give up this percentage of reserved ammo to instantly kill a Witch as a reward to survivors. + // Note: Press your Use (default: E) and Zoom (default: mouse wheel) keys to launch a lady killer grenade. + // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. // Note: This setting can be overridden for specific players. // -- - // Add up numbers together for different results. + // Separate percentages with commas (","). // -- - // Minimum: 0 - // Maximum: 7 + // Percentages limit: 4 + // Character limit for each percentage: 1 // -- - // 0: OFF - // 1: Show effect when the Mutant Tank uses its claw/rock attack. - // 2: Show effect when the Mutant Tank is hit by a melee weapon. - // 4: Show effect when the Mutant Tank uses its range ability. + // Minimum percentage for each: 0.0 (OFF) + // Maximum percentage for each: 100.0 (Highest) // -- - // Keywords: - // "none"/"off" - 0 - // "attack" - 1 - // "hurt" - 2 - // "attack,hurt" - 3 - // "range" - 4 - // "attack,range" - 5 - // "hurt,range" - 6 - // "attack,hurt,range" - 7 - "Ability Effect" "0" + // 1st number = Percentage of reserved ammo for killers. + // 2nd number = Percentage of reserved ammo for assistants. + // 3rd number = Percentage of reserved ammo for teammates. + // 4th number = Percentage of reserved ammo for assistant killers. + "Lady Killer Reward" "0.0,0.0,0.0,0.0" - // Display a message whenever the abilities activate/deactivate. + // Give laser sight as a reward to survivors. + // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. // Note: This setting can be overridden for specific players. // -- - // Add up numbers together for different results. + // Separate values with commas (","). // -- - // Minimum: 0 - // Maximum: 7 + // Values limit: 4 + // Character limit for each value: 1 // -- - // 0: OFF - // 1: Display message only when "Bomb Hit" is enabled. - // 2: Display message only when "Ability Enabled" is enabled. - // 4: Display message only when "Bomb Rock Break" is enabled. + // Minimum value for each: 0 (OFF) + // Maximum value for each: 1 (ON) // -- - // Keywords: - // "none"/"off" - 0 - // "hit" - 1 - // "ability" - 2 - // "hit,ability" - 3 - // "rock" - 4 - // "hit,rock" - 5 - // "ability,rock" - 6 - // "hit,ability,rock"/"all" - 7 - "Ability Message" "0" + // 1st number = Give laser sight to killers. + // 2nd number = Give laser sight to assistants. + // 3rd number = Give laser sight to teammates. + // 4th number = Give laser sight to assistant killers. + "Laser Sight Reward" "0,0,0,0" - // Check line-of-sight when the Mutant Tank uses its abilities. + // The amount of health to leech per hit as a reward to survivors. + // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 - // Maximum: 5 + // Separate amounts with commas (","). // -- - // 0: OFF - // 1: Check if there is a solid object between the Mutant Tank and survivors. - // 2: Option 1 + Check if the Mutant Tank is looking toward the survivors. - // 3: Option 1 + Check if the Mutant Tank is looking away from the survivors. - // 4: Option 1 + Check if the survivors are looking toward the Mutant Tank. - // 5: Option 1 + Check if the survivors are looking away from the Mutant Tank. - "Ability Sight" "0" - - // The Mutant Tank has this many chances out of 100.0% to trigger the ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". - // Note: This setting can be overridden for specific players. + // Amounts limit: 4 + // Character limit for each amount: 7 // -- - // Minimum: 0.0 (No chance) - // Maximum: 100.0 (Highest chance) + // Minimum value for each amount: 0 (OFF) + // Maximum value for each amount: 1000000 (Highest) // -- - // Keywords: - // "never" - 0% chance - // "sometimes"/"unlikely"/"seldom" - 33.3% chance - // "maybe" - 50% chance - // "often"/"likely"/"frequently" - 66.6% chance - // "always" - 100% chance - "Bomb Chance" "33.3" + // 1st number = Amount for killers. + // 2nd number = Amount for assistants. + // 3rd number = Amount for teammates. + // 4th number = Amount for assistant killers. + "Life Leech Reward" "0,0,0,0" - // The cooldown for the Mutant Tank's hit ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // The chance to not lose a bullet from every gunshot as a reward to survivors. + // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 (OFF) - // Maximum: 99999 (Longest) + // Separate chances with commas (","). // -- - // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Bomb Cooldown" "0" - - // The Mutant Tank's bomb explosions do this much damage. - // Note: This is ignored when the "Combo Ability" setting is set to "1". - // Note: This setting can be overridden for specific players. + // Chances limit: 4 + // Character limit for each chance: 6 // -- - // Minimum: 0.0 (OFF) - // Maximum: 99999.0 + // Minimum value for each chance: 0.0 (No chance) + // Maximum value for each chance: 100.0 (Highest chance) // -- - // Keywords: - // "weakest" - 1.0 damage - // "strongest" - 99999.0 damage - "Bomb Damage" "3.0" + // 1st number = Chance to not lose a bullet from every gunshot for killers. + // 2nd number = Chance to not lose a bullet from every gunshot for assistants. + // 3rd number = Chance to not lose a bullet from every gunshot for teammates. + // 4th number = Chance to not lose a bullet from every gunshot for assistant killers. + "Lucky Bullet Reward" "0.0,0.0,0.0,0.0" - // Enable the Mutant Tank's upon-death range ability. - // Note: This setting does not need the "Ability Enabled" setting to be set to "1". + // Allow healing teammates with melee hits as a reward to survivors. + // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. // Note: This setting can be overridden for specific players. // -- - // Add up numbers together for different results. + // Separate values with commas (","). // -- - // Minimum: 0 - // Maximum: 3 + // Values limit: 4 + // Character limit for each value: 7 // -- - // 0: OFF - // 1: Trigger the range ability when the Mutant Tank dies. - // 2: Trigger the range ability when the Mutant Tank spawns. - "Bomb Death" "1" + // Minimum value for each: 0 (OFF) + // Maximum value for each: 1000000 (Highest) + // -- + // 1st number = Allow healing teammates with melee hits to killers. + // 2nd number = Allow healing teammates with melee hits to assistants. + // 3rd number = Allow healing teammates with melee hits to teammates. + // 4th number = Allow healing teammates with melee hits to assistant killers. + "Medical Cuts Reward" "0,0,0,0" - // The Mutant Tank has this many chances out of 100.0% to trigger the upon-death ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // The melee range to reward to survivors. + // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.0 (No chance) - // Maximum: 100.0 (Highest chance) + // Separate ranges with commas (","). // -- - // Keywords: - // "never" - 0% chance - // "sometimes"/"unlikely"/"seldom" - 33.3% chance - // "maybe" - 50% chance - // "often"/"likely"/"frequently" - 66.6% chance - // "always" - 100% chance - "Bomb Death Chance" "33.3" - - // The distance between a survivor and the Mutant Tank needed to trigger the upon-death ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". - // Note: This setting can be overridden for specific players. + // Ranges limit: 4 + // Character limit for each range: 6 // -- - // Minimum: 1.0 (Closest) - // Maximum: 99999.0 (Farthest) + // Minimum value for each range: 0 (OFF) + // Maximum value for each range: 99999 (Highest) // -- - // Keywords: - // "closest" - 1.0 range - // "farthest" - 99999.0 range - "Bomb Death Range" "200.0" + // 1st number = Range for killers. + // 2nd number = Range for assistants. + // 3rd number = Range for teammates. + // 4th number = Range for assistant killers. + "Melee Range Reward" "0,0,0,0" - // Enable the Mutant Tank's claw/rock attack. - // Note: This setting does not need the "Ability Enabled" setting to be set to "1". + // Allow survivors to perform a number of midair dashes (extra jumps) as a reward. + // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. // Note: This setting can be overridden for specific players. // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Bomb Hit" "0" + // Separate values with commas (","). + // -- + // Values limit: 4 + // Character limit for each value: 6 + // -- + // Minimum value for each: 0 (OFF) + // Maximum value for each: 99999 (Highest) + // -- + // 1st number = Number of dashes (jumps) to give to killers. + // 2nd number = Number of dashes (jumps) to give to assistants. + // 3rd number = Number of dashes (jumps) to give to teammates. + // 4th number = Number of dashes (jumps) to give to assistant killers. + "Midair Dashes Reward" "0,0,0,0" - // The mode of the Mutant Tank's claw/rock attack. + // When a survivor revives another survivor, any other disabled survivors within this radius also gets revived. + // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. // Note: This setting can be overridden for specific players. // -- - // 0: Both - // 1: Ability activates when the Mutant Tank hits a survivor. - // 2: Ability activates when the Mutant Tank is hit by a survivor. + // Separate radii with commas (","). // -- - // Keywords: - // "both"/"all" - 0 - // "tank"/"attack" - 1 - // "survivor"/"hurt" - 2 - "Bomb Hit Mode" "0" - - // The distance between a survivor and the Mutant Tank needed to trigger the ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". - // Note: This setting can be overridden for specific players. + // Radii limit: 4 + // Character limit for each radius: 6 // -- - // Minimum: 1.0 (Closest) - // Maximum: 99999.0 (Farthest) + // Minimum radius for each: 0.0 (OFF) + // Maximum radius for each: 100.0 (Farthest) // -- - // Keywords: - // "closest" - 1.0 range - // "farthest" - 99999.0 range - "Bomb Range" "150.0" + // 1st number = Radius for killers. + // 2nd number = Radius for assistants. + // 3rd number = Radius for teammates. + // 4th number = Radius for assistant killers. + "Motivation Radius Reward" "0.0,0.0,0.0,0.0" - // The Mutant Tank has this many chances out of 100.0% to trigger the range ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // When a survivor consumes pain pills, any other survivors within this radius also receives a small portion of temporary health. + // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.0 (No chance) - // Maximum: 100.0 (Highest chance) + // Separate radii with commas (","). // -- - // Keywords: - // "never" - 0% chance - // "sometimes"/"unlikely"/"seldom" - 33.3% chance - // "maybe" - 50% chance - // "often"/"likely"/"frequently" - 66.6% chance - // "always" - 100% chance - "Bomb Range Chance" "15.0" - - // The cooldown for the Mutant Tank's range ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". - // Note: This setting can be overridden for specific players. + // Radii limit: 4 + // Character limit for each radius: 6 // -- - // Minimum: 0 (OFF) - // Maximum: 99999 (Longest) + // Minimum radius for each: 0.0 (OFF) + // Maximum radius for each: 100.0 (Farthest) // -- - // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Bomb Range Cooldown" "0" + // 1st number = Radius for killers. + // 2nd number = Radius for assistants. + // 3rd number = Radius for teammates. + // 4th number = Radius for assistant killers. + "Overdose Radius Reward" "0.0,0.0,0.0,0.0" - // The Mutant Tank's rock creates an explosion when it breaks. - // Note: This does not need "Ability Enabled" or "Bomb Hit" to be set to "1". + // The overhealth to reward to survivors. + // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. // Note: This setting can be overridden for specific players. // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Bomb Rock Break" "0" + // Separate values with commas (","). + // -- + // Values limit: 4 + // Character limit for each value: 7 + // -- + // Minimum value for each: 0 (OFF) + // Maximum value for each: 1000000 (Highest) + // -- + // 1st number = Health for killers. + // 2nd number = Health for assistants. + // 3rd number = Health for teammates. + // 4th number = Health for assistant killers. + "Overhealth Reward" "0,0,0,0" - // The Mutant Tank's rock has this many chances out of 100.0% to trigger the rock break ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // The pipebomb duration to reward to survivors. + // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.0 (No chance) - // Maximum: 100.0 (Highest chance) + // Separate durations with commas (","). // -- - // Keywords: - // "never" - 0% chance - // "sometimes"/"unlikely"/"seldom" - 33.3% chance - // "maybe" - 50% chance - // "often"/"likely"/"frequently" - 66.6% chance - // "always" - 100% chance - "Bomb Rock Chance" "33.3" + // Durations limit: 4 + // Character limit for each duration: 9 + // -- + // Minimum value for each duration: 0.0 (OFF) + // Maximum value for each duration: 99999.0 (Longest) + // -- + // 1st number = Duration for killers. + // 2nd number = Duration for assistants. + // 3rd number = Duration for teammates. + // 4th number = Duration for assistant killers. + "Pipebomb Duration Reward" "0.0,0.0,0.0,0.0" - // The cooldown for the Mutant Tank's rock ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // The punch resistance to reward to survivors. + // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 (OFF) - // Maximum: 99999 (Longest) + // Separate resistances with commas (","). // -- - // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Bomb Rock Cooldown" "0" - - "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" - { - // Note: Override any of the settings in the "Bomb Ability" section for each special infected here. - - // Example - "Access Flags" "" - "Immunity Flags" "" - "Close Areas Only" "0.0" - "Combo Ability" "0" - "Human Ability" "0" - "Human Ammo" "5" - "Human Cooldown" "0" - "Human Pin Cooldown" "0" - "Human Range Cooldown" "0" - "Open Areas Only" "0.0" - "Requires Humans" "0" - "Ability Enabled" "0" - "Ability Effect" "0" - "Ability Message" "0" - "Ability Sight" "0" - "Bomb Chance" "33.3" - "Bomb Cooldown" "0" - "Bomb Damage" "3.0" - "Bomb Death" "1" - "Bomb Death Chance" "33.3" - "Bomb Death Range" "200.0" - "Bomb Hit" "0" - "Bomb Hit Mode" "0" - "Bomb Pin" "0" - "Bomb Pin Chance" "33.3" - "Bomb Pin Cooldown" "0" - "Bomb Range" "150.0" - "Bomb Range Chance" "15.0" - "Bomb Range Cooldown" "0" - } - } - } -} -``` -
- -##### Bury Ability -
- Click to expand! + // Resistances limit: 4 + // Character limit for each resistance: 6 + // -- + // Minimum value for each resistance: 0.0 (OFF) + // Maximum value for each resistance: 1.0 (None) + // -- + // 1st number = Resistance for killers. + // 2nd number = Resistance for assistants. + // 3rd number = Resistance for teammates. + // 4th number = Resistance for assistant killers. + "Punch Resistance Reward" "0.0,0.0,0.0,0.0" -``` -"Mutant Tanks" -{ - "Tank #1" - { - // The Mutant Tank buries survivors. - // "Ability Enabled" - When a survivor is within range of the Mutant Tank, the survivor is buried. - // - "Bury Range" - // - "Bury Range Chance" - // - "Bury Range Cooldown" - // "Bury Hit" - When a survivor is hit by the Mutant Tank's claw or rock, or a survivor hits the Mutant Tank with a melee weapon, the survivor is buried. - // - "Bury Chance" - // - "Bury Cooldown" - // - "Bury Hit Mode" - // Requires "mt_abilities.smx" to be compiled with "mt_bury.sp" to work. - "Bury Ability" - { - // Admins with one or more of these access flags have access to this ability. + // The rapid pistol fire rate to reward to survivors. + // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. // Note: This setting can be overridden for specific players. // -- - // Empty: No access flags have access. - // Not empty: These access flags have access. - "Access Flags" "" + // Separate resistances with commas (","). + // -- + // Resistances limit: 4 + // Character limit for each fire rate: 6 + // -- + // Minimum value for each resistance: 0.0 (OFF) + // Maximum value for each resistance: 1.0 (None) + // -- + // 1st number = Rapid pistol fire rate for killers. + // 2nd number = Rapid pistol fire rate for assistants. + // 3rd number = Rapid pistol fire rate for teammates. + // 4th number = Rapid pistol fire rate for assistant killers. + "Rapid Pistol Reward" "0.0,0.0,0.0,0.0" - // Admins with one or more of these immunity flags are immune to this ability's effects. - // Note: If the Mutant Tank has one or more of these immunity flags or has the same immunity flags as the survivor victim, the immunity is cancelled. + // Give recoil dampener as a reward to survivors. + // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. // Note: This setting can be overridden for specific players. // -- - // Empty: No immunity flags are immune. - // Not empty: These immunity flags are immune. - "Immunity Flags" "" + // Separate values with commas (","). + // -- + // Values limit: 4 + // Character limit for each value: 1 + // -- + // Minimum value for each: 0 (OFF) + // Maximum value for each: 1 (ON) + // -- + // 1st number = Give recoil dampener to killers. + // 2nd number = Give recoil dampener to assistants. + // 3rd number = Give recoil dampener to teammates. + // 4th number = Give recoil dampener to assistant killers. + "Recoil Dampener Reward" "0,0,0,0" - // The ability can only activate in close areas. - // Note: Do not change this setting if you are unsure of how it works. + // The percentage of health to refill with the "Health" and "Refill" rewards. + // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.0 (OFF) - // Maximum: 99999.0 (Farthest) + // Separate percentages with commas (","). // -- - // Keywords: - // "disabled"/"false"/"off"/"no" - 0.0 range - // "farthest" - 99999.0 range - "Close Areas Only" "0.0" + // Percentages limit: 4 + // Character limit for each percentage: 6 + // -- + // Minimum percentage for each: 0.0 (OFF) + // Maximum percentage for each: 100.0 (Highest) + // -- + // 1st number = Heal percentage for killers. + // 2nd number = Heal percentage for assistants. + // 3rd number = Heal percentage for teammates. + // 4th number = Heal percentage for assistant killers. + "Refill Percent Reward" "0.0,0.0,0.0,0.0" - // Use this ability in conjunction with other abilities. - // Note: Only use this when "Spawn Type" is set to "4" for the Mutant Tank. - // Note: This setting does not affect human-controlled Mutant Tanks unless the "Human Ability" setting is set to "2". + // Allow healing from self-made explosions as a reward to survivors. + // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. // Note: This setting can be overridden for specific players. // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Combo Ability" "0" + // Separate values with commas (","). + // -- + // Values limit: 4 + // Character limit for each value: 7 + // -- + // Minimum value for each: 0 (OFF) + // Maximum value for each: 1000000 (Highest) + // -- + // 1st number = Allow healing from self-made explosions to killers. + // 2nd number = Allow healing from self-made explosions to assistants. + // 3rd number = Allow healing from self-made explosions to teammates. + // 4th number = Allow healing from self-made explosions to assistant killers. + "Regen Bursts Reward" "0,0,0,0" - // Allow human-controlled Mutant Tanks to use this ability. + // The reload rate to reward to survivors. + // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. // Note: This setting can be overridden for specific players. // -- - // 0: OFF - // 1: ON, players can use buttons to activate abilities. - // 2: ON, abilities will activate automatically. - "Human Ability" "0" - - // Determines how many times human-controlled Mutant Tanks can use their abilities in one life. - // Note: This setting can be overridden for specific players. + // Separate rates with commas (","). // -- - // Minimum: 0 - // Maximum: 99999 + // Rates limit: 4 + // Character limit for each rate: 9 // -- - // Keywords: - // "none"/"off" - 0 ammo - // "infinite" - 99999 ammo - "Human Ammo" "5" + // Minimum value for each rate: 0.0 (OFF) + // Maximum value for each rate: 99999.0 (Fastest) + // -- + // 1st number = Rate for killers. + // 2nd number = Rate for assistants. + // 3rd number = Rate for teammates. + // 4th number = Rate for assistant killers. + "Reload Rate Reward" "0.0,0.0,0.0,0.0" - // Human-controlled Mutant Tanks must wait this long before using their abilities again. + // Restore the previous loadouts of survivors after respawning them. + // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 (OFF) - // Maximum: 99999 (Longest) + // Separate values with commas (","). // -- - // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Human Cooldown" "0" - - // Human-controlled Mutant Tanks must wait this long before using their range ability again. - // Note: This setting can be overridden for specific players. + // Values limit: 4 + // Character limit for each value: 1 // -- - // Minimum: 0 (OFF) - // Maximum: 99999 (Longest) + // Minimum value for each: 0 (OFF) + // Maximum value for each: 1 (ON) // -- - // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Human Range Cooldown" "0" + // 1st number = Restore loadouts for killers. + // 2nd number = Restore loadouts for assistants. + // 3rd number = Restore loadouts for teammates. + // 4th number = Restore loadouts for assistant killers. + "Respawn Loadout Reward" "0,0,0,0" - // The ability can only activate in open areas. - // Note: Do not change this setting if you are unsure of how it works. + // The revive health to reward to survivors. + // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.0 (OFF) - // Maximum: 99999.0 (Farthest) + // Separate values with commas (","). // -- - // Keywords: - // "disabled"/"false"/"off"/"no" - 0.0 range - // "farthest" - 99999.0 range - "Open Areas Only" "0.0" - - // The ability is only effective toward human survivors. - // Note: This setting can be overridden for specific players. + // Values limit: 4 + // Character limit for each value: 7 // -- - // Minimum: 0 - // Maximum: 32 + // Minimum value for each: 0 (OFF) + // Maximum value for each: 1000000 (Highest) // -- - // 0: OFF - // 1-32: ON, the number of human survivors required to be present for this ability to be effective. - "Requires Humans" "0" + // 1st number = Health for killers. + // 2nd number = Health for assistants. + // 3rd number = Health for teammates. + // 4th number = Health for assistant killers. + "Revive Health Reward" "0,0,0,0" - // Enable this ability. - // Note: This setting does not affect the "Bury Hit" setting. + // Give riot gear (high resistance to direct hits and knockbacks) as a reward to survivors. + // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. // Note: This setting can be overridden for specific players. // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Ability Enabled" "0" + // Separate values with commas (","). + // -- + // Values limit: 4 + // Character limit for each value: 1 + // -- + // Minimum value for each: 0 (OFF) + // Maximum value for each: 1 (ON) + // -- + // 1st number = Give riot gear to killers. + // 2nd number = Give riot gear to assistants. + // 3rd number = Give riot gear to teammates. + // 4th number = Give riot gear to assistant killers. + "Riot Gear Reward" "0,0,0,0" - // Show a screen fade effect when the Mutant Tank uses its abilities. - // Note: The colors will randomly change between the colors set in the "Skin Color" and "Glow Color" settings. + // Give safety bubble (immunity to special attacks, mutant abilities, and the punishment system) as a reward to survivors. + // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. // Note: This setting can be overridden for specific players. // -- - // Add up numbers together for different results. + // Separate values with commas (","). // -- - // Minimum: 0 - // Maximum: 7 + // Values limit: 4 + // Character limit for each value: 1 // -- - // 0: OFF - // 1: Show effect when the Mutant Tank uses its claw/rock attack. - // 2: Show effect when the Mutant Tank is hit by a melee weapon. - // 4: Show effect when the Mutant Tank uses its range ability. + // Minimum value for each: 0 (OFF) + // Maximum value for each: 1 (ON) // -- - // Keywords: - // "none"/"off" - 0 - // "attack" - 1 - // "hurt" - 2 - // "attack,hurt" - 3 - // "range" - 4 - // "attack,range" - 5 - // "hurt,range" - 6 - // "attack,hurt,range" - 7 - "Ability Effect" "0" + // 1st number = Give safety bubble to killers. + // 2nd number = Give safety bubble to assistants. + // 3rd number = Give safety bubble to teammates. + // 4th number = Give safety bubble to assistant killers. + "Safety Bubble Reward" "0,0,0,0" - // Display a message whenever the ability activates/deactivates. + // When a dead survivor is revived with a defibrillator, any other dead survivors within this radius also gets revived with temporary health. + // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. // Note: This setting can be overridden for specific players. // -- - // Add up numbers together for different results. + // Separate radii with commas (","). // -- - // Minimum: 0 - // Maximum: 3 + // Radii limit: 4 + // Character limit for each radius: 6 // -- - // 0: OFF - // 1: Display message only when "Bury Hit" is enabled. - // 2: Display message only when "Ability Enabled" is enabled. + // Minimum radius for each: 0.0 (OFF) + // Maximum radius for each: 100.0 (Farthest) // -- - // Keywords: - // "none"/"off" - 0 - // "hit" - 1 - // "ability" - 2 - // "both"/"all"/"hit,ability" - 3 - "Ability Message" "0" + // 1st number = Radius for killers. + // 2nd number = Radius for assistants. + // 3rd number = Radius for teammates. + // 4th number = Radius for assistant killers. + "Shockwave Radius Reward" "0.0,0.0,0.0,0.0" - // Check line-of-sight when the Mutant Tank uses its abilities. + // The shove damage multiplier against Chargers, Witches, and Tanks to reward to survivors. + // Note: The max health of the target will be multiplied by this setting's value. + // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 - // Maximum: 5 + // Separate multipliers with commas (","). // -- - // 0: OFF - // 1: Check if there is a solid object between the Mutant Tank and survivors. - // 2: Option 1 + Check if the Mutant Tank is looking toward the survivors. - // 3: Option 1 + Check if the Mutant Tank is looking away from the survivors. - // 4: Option 1 + Check if the survivors are looking toward the Mutant Tank. - // 5: Option 1 + Check if the survivors are looking away from the Mutant Tank. - "Ability Sight" "0" + // Multipliers limit: 4 + // Character limit for each multiplier: 9 + // -- + // Minimum value for each multiplier: 0.0 (OFF) + // Maximum value for each multiplier: 99999.0 (Strongest) + // -- + // 1st number = Multiplier for killers. + // 2nd number = Multiplier for assistants. + // 3rd number = Multiplier for teammates. + // 4th number = Multiplier for assistant killers. + // -- + // Example: 600 (default Charger health) * 0.025 (shove damage reward) = 15 damage per shove + "Shove Damage Reward" "0.0,0.0,0.0,0.0" - // The amount of temporary health given to survivors recovering from the Mutant Tank's bury ability. + // Remove shove penalty as a reward to survivors. + // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.0 (OFF) - // Maximum: 1000000.0 - "Bury Buffer" "100.0" + // Separate values with commas (","). + // -- + // Values limit: 4 + // Character limit for each value: 1 + // -- + // Minimum value for each: 0 (OFF) + // Maximum value for each: 1 (ON) + // -- + // 1st number = Remove shove penalty for killers. + // 2nd number = Remove shove penalty for assistants. + // 3rd number = Remove shove penalty for teammates. + // 4th number = Remove shove penalty for assistant killers. + "Shove Penalty Reward" "0,0,0,0" - // The Mutant Tank has this many chances out of 100.0% to trigger the ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // The shove rate to reward to survivors. + // Note: The value of "z_gun_swing_interval" will be multiplied by this setting's value. + // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.0 (No chance) - // Maximum: 100.0 (Highest chance) + // Separate rates with commas (","). // -- - // Keywords: - // "never" - 0% chance - // "sometimes"/"unlikely"/"seldom" - 33.3% chance - // "maybe" - 50% chance - // "often"/"likely"/"frequently" - 66.6% chance - // "always" - 100% chance - "Bury Chance" "33.3" + // Rates limit: 4 + // Character limit for each rate: 9 + // -- + // Minimum value for each rate: 0.0 (OFF) + // Maximum value for each rate: 99999.0 (Slowest) + // -- + // 1st number = Rate for killers. + // 2nd number = Rate for assistants. + // 3rd number = Rate for teammates. + // 4th number = Rate for assistant killers. + // -- + // Example: 0.7 (default "z_gun_swing_interval" value) * 0.7 (shove rate reward) = 0.49 rate + "Shove Rate Reward" "0.0,0.0,0.0,0.0" - // The cooldown for the Mutant Tank's hit ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // The chance to shoot sledgehammer rounds as a reward to survivors. + // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 (OFF) - // Maximum: 99999 (Longest) + // Separate chances with commas (","). // -- - // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Bury Cooldown" "0" + // Chances limit: 4 + // Character limit for each chance: 6 + // -- + // Minimum value for each chance: 0.0 (No chance) + // Maximum value for each chance: 100.0 (Highest chance) + // -- + // 1st number = Chance to shoot sledgehammer rounds for killers. + // 2nd number = Chance to shoot sledgehammer rounds for assistants. + // 3rd number = Chance to shoot sledgehammer rounds for teammates. + // 4th number = Chance to shoot sledgehammer rounds for assistant killers. + "Sledgehammer Rounds Reward" "0.0,0.0,0.0,0.0" - // The Mutant Tank's ability effects last this long. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Give special ammo as a reward to survivors. + // Note: Only available in Left 4 Dead 2. + // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.1 - // Maximum: 99999.0 + // Separate values with commas (","). // -- - // Keywords: - // "milli"/"millisecond" - 0.1 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Bury Duration" "5.0" + // Values limit: 4 + // Character limit for each value: 1 + // -- + // Minimum value for each: 0 + // Maximum value for each: 3 + // -- + // 0: OFF + // 1: Incendiary ammo + // 2: Explosive ammo + // 3: Random + // -- + // 1st number = Give special ammo to killers. + // 2nd number = Give special ammo to assistants. + // 3rd number = Give special ammo to teammates. + // 4th number = Give special ammo to assistant killers. + "Special Ammo Reward" "0,0,0,0" - // The Mutant Tank buries survivors this deep into the ground. + // The speed boost to reward to survivors. + // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.1 - // Maximum: 99999.0 + // Separate boosts with commas (","). // -- - // Keywords: - // "shortest" - 0.1 height - // "tallest" - 99999.0 height - "Bury Height" "50.0" - - // Enable the Mutant Tank's claw/rock attack. - // Note: This setting does not need the "Ability Enabled" setting to be set to "1". - // Note: This setting can be overridden for specific players. + // Boosts limit: 4 + // Character limit for each boost: 9 // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Bury Hit" "0" + // Minimum value for each boost: 0.0 (OFF) + // Maximum value for each boost: 99999.0 (Fastest) + // -- + // 1st number = Boost for killers. + // 2nd number = Boost for assistants. + // 3rd number = Boost for teammates. + // 4th number = Boost for assistant killers. + "Speed Boost Reward" "0.0,0.0,0.0,0.0" - // The mode of the Mutant Tank's claw/rock attack. + // How many times each reward can be stacked for each recipient. + // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. // Note: This setting can be overridden for specific players. // -- - // 0: Both - // 1: Ability activates when the Mutant Tank hits a survivor. - // 2: Ability activates when the Mutant Tank is hit by a survivor. + // Separate limits with commas (","). // -- - // Keywords: - // "both"/"all" - 0 - // "tank"/"attack" - 1 - // "survivor"/"hurt" - 2 - "Bury Hit Mode" "0" - - // The distance between a survivor and the Mutant Tank needed to trigger the ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". - // Note: This setting can be overridden for specific players. + // Limits limit: 7 + // Character limit for each limit: 6 // -- - // Minimum: 1.0 (Closest) - // Maximum: 99999.0 (Farthest) + // Minimum value for each limit: 0 (No limit) + // Maximum value for each limit: 99999 (Highest limit) // -- - // Keywords: - // "closest" - 1.0 range - // "farthest" - 99999.0 range - "Bury Range" "150.0" + // 1st number = Health reward stack limit. + // 2nd number = Speed boost reward stack limit. + // 3rd number = Damage boost reward stack limit. + // 4th number = Attack boost reward stack limit. + // 5th number = Ammo reward stack limit. + // 6th number = God mode reward stack limit. + // 7th number = Refill stack limit. + // 8th number = Infinite ammo reward stack limit. + "Stack Limits" "0,0,0,0,0,0,0,0" - // The Mutant Tank has this many chances out of 100.0% to trigger the range ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Allow rewards from the Mutant Tank to be stacked. + // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.0 (No chance) - // Maximum: 100.0 (Highest chance) + // Separate values with commas (","). // -- - // Keywords: - // "never" - 0% chance - // "sometimes"/"unlikely"/"seldom" - 33.3% chance - // "maybe" - 50% chance - // "often"/"likely"/"frequently" - 66.6% chance - // "always" - 100% chance - "Bury Range Chance" "15.0" - - // The cooldown for the Mutant Tank's range ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". - // Note: This setting can be overridden for specific players. + // Add up numbers together for different results. // -- - // Minimum: 0 (OFF) - // Maximum: 99999 (Longest) + // Minimum value for each: 0 + // Maximum value for each: 2147483647 // -- - // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Bury Range Cooldown" "0" - - "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" - { - // Note: Override any of the settings in the "Bury Ability" section for each special infected here. - - // Example - "Access Flags" "" - "Immunity Flags" "" - "Close Areas Only" "0.0" - "Combo Ability" "0" - "Human Ability" "0" - "Human Ammo" "5" - "Human Cooldown" "0" - "Human Range Cooldown" "0" - "Open Areas Only" "0.0" - "Requires Humans" "0" - "Ability Enabled" "0" - "Ability Effect" "0" - "Ability Message" "0" - "Ability Sight" "0" - "Bury Buffer" "100.0" - "Bury Chance" "33.3" - "Bury Cooldown" "0" - "Bury Duration" "5.0" - "Bury Height" "50.0" - "Bury Hit" "0" - "Bury Hit Mode" "0" - "Bury Range" "150.0" - "Bury Range Chance" "15.0" - "Bury Range Cooldown" "0" - } - } - } -} -``` -
- -##### Car Ability -
- Click to expand! - -``` -"Mutant Tanks" -{ - "Tank #1" - { - // The Mutant Tank creates car showers. - // Requires "mt_abilities.smx" to be compiled with "mt_car.sp" to work. - "Car Ability" - { - // Admins with one or more of these access flags have access to this ability. - // Note: This setting can be overridden for specific players. + // 0: OFF + // 1: Health reward + // 2: Speed boost reward + // 4: Damage boost reward + // 8: Attack boost reward + // 16: Ammo reward + // 32: Item reward (Currently cannot be stacked.) + // 64: God mode reward + // 128: Health and ammo refill reward (Currently cannot be stacked.) + // 256: Respawn reward (Currently cannot be stacked.) + // 512: Infinite ammo reward + // 1023: All above rewards + // 1024-2147483647: Reserved for third-party plugins // -- - // Empty: No access flags have access. - // Not empty: These access flags have access. - "Access Flags" "" + // 1st number = Stack rewards for killers. + // 2nd number = Stack rewards for assistants. + // 3rd number = Stack rewards for teammates. + // 4th number = Stack rewards for assistant killers. + "Stack Rewards" "0,0,0,0" - // The ability can only activate in close areas. - // Note: Do not change this setting if you are unsure of how it works. + // Give sticky grenades as a reward to survivors. + // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.0 (OFF) - // Maximum: 99999.0 (Farthest) + // Separate values with commas (","). // -- - // Keywords: - // "disabled"/"false"/"off"/"no" - 0.0 range - // "farthest" - 99999.0 range - "Close Areas Only" "0.0" - - // Use this ability in conjunction with other abilities. - // Note: Only use this when "Spawn Type" is set to "4" for the Mutant Tank. - // Note: This setting does not affect human-controlled Mutant Tanks unless the "Human Ability" setting is set to "2". - // Note: This setting can be overridden for specific players. + // Values limit: 4 + // Character limit for each value: 1 // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Combo Ability" "0" - - // Allow human-controlled Mutant Tanks to use this ability. - // Note: This setting can be overridden for specific players. + // Minimum value for each: 0 (OFF) + // Maximum value for each: 1 (ON) // -- - // 0: OFF - // 1: ON, players can use buttons to activate abilities. - // 2: ON, abilities will activate automatically. - "Human Ability" "0" + // 1st number = Give sticky grenades to killers. + // 2nd number = Give sticky grenades to assistants. + // 3rd number = Give sticky grenades to teammates. + // 4th number = Give sticky grenades to assistant killers. + "Sticky Grenades Reward" "0,0,0,0" - // Determines how many times human-controlled Mutant Tanks can use their abilities in one life. + // This is the cooldown for a small ammo resupply wave that triggers whenever a survivor hurts any infected target. Any teammate within the small radius will receive 5% of their current primary gun's max ammo. + // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 - // Maximum: 99999 + // Separate cooldowns with commas (","). // -- - // Keywords: - // "none"/"off" - 0 ammo - // "infinite" - 99999 ammo - "Human Ammo" "5" - - // Human-controlled Mutant Tanks must wait this long before using their abilities again. - // Note: This setting can be overridden for specific players. + // Cooldowns limit: 4 + // Character limit for each cooldown: 9 // -- - // Minimum: 0 (OFF) - // Maximum: 99999 (Longest) + // Minimum value for each cooldown: 0.0 (OFF) + // Maximum value for each cooldown: 99999.0 (Longest) // -- - // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Human Cooldown" "0" + // 1st number = Cooldown for killers. + // 2nd number = Cooldown for assistants. + // 3rd number = Cooldown for teammates. + // 4th number = Cooldown for assistant killers. + "Supplier Reward" "0.0,0.0,0.0,0.0" - // The Mutant Tank's ability effects last this long. - // Note: This setting does not affect human-controlled Mutant Tanks unless the "Human Mode" setting is set to "0". + // The melee swing rate to reward to survivors. + // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 - // Maximum: 99999 + // Separate rates with commas (","). // -- - // Keywords: - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Human Duration" "5" - - // The mode of how human-controlled Mutant Tanks activate their abilities. - // Note: This setting can be overridden for specific players. + // Rates limit: 4 + // Character limit for each rate: 9 // -- - // 0: Press buttons to activate corresponding abilities. Cooldown starts after ability's duration ends. - // 1: Hold down buttons to keep corresponding abilities activated. Cooldown starts after the player lets go of the buttons. - "Human Mode" "1" + // Minimum value for each rate: 0.0 (OFF) + // Maximum value for each rate: 99999.0 (Fastest) + // -- + // 1st number = Rate for killers. + // 2nd number = Rate for assistants. + // 3rd number = Rate for teammates. + // 4th number = Rate for assistant killers. + "Swing Rate Reward" "0.0,0.0,0.0,0.0" - // The ability can only activate in open areas. - // Note: Do not change this setting if you are unsure of how it works. + // Allow healing teammates with bullets as a reward to survivors. + // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.0 (OFF) - // Maximum: 99999.0 (Farthest) + // Separate values with commas (","). + // -- + // Values limit: 4 + // Character limit for each value: 7 + // -- + // Minimum value for each: 0 (OFF) + // Maximum value for each: 1000000 (Highest) // -- - // Keywords: - // "disabled"/"false"/"off"/"no" - 0.0 range - // "farthest" - 99999.0 range - "Open Areas Only" "0.0" + // 1st number = Allow healing teammates with bullets to killers. + // 2nd number = Allow healing teammates with bullets to assistants. + // 3rd number = Allow healing teammates with bullets to teammates. + // 4th number = Allow healing teammates with bullets to assistant killers. + "Syringe Darts Reward" "0,0,0,0" - // The ability is only effective toward human survivors. + // Give thorns as a reward to survivors. + // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 - // Maximum: 32 + // Separate values with commas (","). // -- - // 0: OFF - // 1-32: ON, the number of human survivors required to be present for this ability to be effective. - "Requires Humans" "1" - - // Enable this ability. - // Note: This setting can be overridden for specific players. + // Values limit: 4 + // Character limit for each value: 1 // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Ability Enabled" "0" - - // Display a message whenever the ability activates/deactivates. - // Note: This setting can be overridden for specific players. + // Minimum value for each: 0 (OFF) + // Maximum value for each: 1 (ON) // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Ability Message" "0" + // 1st number = Give thorns to killers. + // 2nd number = Give thorns to assistants. + // 3rd number = Give thorns to teammates. + // 4th number = Give thorns to assistant killers. + "Thorns Reward" "0,0,0,0" - // The Mutant Tank has this many chances out of 100.0% to trigger the ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Include useful reward types depending on the status of the recipient. + // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.0 (No chance) - // Maximum: 100.0 (Highest chance) + // Separate values with commas (","). // -- - // Keywords: - // "never" - 0% chance - // "sometimes"/"unlikely"/"seldom" - 33.3% chance - // "maybe" - 50% chance - // "often"/"likely"/"frequently" - 66.6% chance - // "always" - 100% chance - "Car Chance" "33.3" - - // The cooldown for the Mutant Tank's ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". - // Note: This setting can be overridden for specific players. + // Add up numbers together for different results. // -- - // Minimum: 0 (OFF) - // Maximum: 99999 (Longest) + // Minimum value for each: 0 + // Maximum value for each: 15 // -- - // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Car Cooldown" "0" + // 0: OFF + // 1: If the recipient is black and white and low on ammunition, they will receive Health and ammo refill as a reward. + // 2: If the recipient is black and white, they will receive Health as a reward. + // 4: If the recipient is low on ammunition, they will receive Ammo as a reward. + // 8: If the recipient is dead, they will receive Respawn as a reward. + // -- + // 1st number = Enable useful rewards for killers. + // 2nd number = Enable useful rewards for assistants. + // 3rd number = Enable useful rewards for teammates. + // 4th number = Enable useful rewards for assistant killers. + "Useful Rewards" "0,0,0,0" - // The Mutant Tank's ability effects last this long. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // These are the RGBA values of the recipients' body color visual. + // Note: Any value less than "0" will output a random color. + // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 - // Maximum: 99999 + // Separate RGBA sets with commas (","). + // Separate RGBA values with semi-colons (";"). // -- - // Keywords: - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Car Duration" "5" - - // The Mutant Tank's car shower drops a car every time this many seconds passes. - // Note: This is ignored when the "Combo Ability" setting is set to "1". - // Note: This setting can be overridden for specific players. + // RGBA sets limit: 4 + // Character limit for each set: 16 + // Character limit for each value: 4 // -- - // Minimum: 0.1 - // Maximum: 1.0 - "Car Interval" "0.6" - - // Cars dropped by the Mutant Tank's car shower will disappear after this many seconds. - // Note: The timer starts when the car spawns, so take into account the time it takes to fall to the ground. - // Note: This setting can be overridden for specific players. + // Minimum value for each: -1 (Random) + // Maximum value for each: 255 (Brightest) // -- - // Minimum: 0.1 - // Maximum: 99999.0 + // 1st number = Red + // 2nd number = Green + // 3rd number = Blue + // 4th number = Alpha // -- // Keywords: - // "milli"/"millisecond" - 0.1 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Car Lifetime" "30.0" + // "rainbow" - cycle through colors constantly. + // -- + // 1st set = RGBA set for killers. + // 2nd set = RGBA set for assistants. + // 3rd set = RGBA set for teammates. + // 4th set = RGBA set for assistant killers. + "Body Color Visual" "" - // The Mutant Tank create car showers with these cars. + // These are the RGB values of the recipients' glow outline color visual. + // Note: Only available in Left 4 Dead 2. + // Note: Any value less than "0" will output a random color. + // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. // Note: This setting can be overridden for specific players. // -- - // Add up numbers together for different results. + // Separate RGB sets with commas (","). + // Separate RGB values with semi-colons (";"). // -- - // Minimum: 0 - // Maximum: 7 + // RGB sets limit: 4 + // Character limit for each set: 12 + // Character limit for each value: 4 // -- - // 0 OR 7: Pick randomly between the 3 cars. - // 1: Small car with a big hatchback. - // 2: Car that looks like a Chevrolet Impala SS. - // 4: Car that looks like a Sixth Generation Chevrolet Impala. - "Car Options" "0" - - // Set the Mutant Tank as the owner of its cars. - // Note: This setting is only used for compatibility with Marttt's "Replace Cars Into Car Alarms" plugin. Disable this setting if you do not use that plugin. - // Link: https://forums.alliedmods.net/showthread.php?t=329806 - // Note: This setting can be overridden for specific players. + // Minimum value for each: -1 (Random) + // Maximum value for each: 255 (Brightest) // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Car Owner" "1" - - // The radius of the Mutant Tank's car shower. - // Note: This is ignored when the "Combo Ability" setting is set to "1". - // Note: This setting can be overridden for specific players. + // 1st number = Red + // 2nd number = Green + // 3rd number = Blue // -- - // 1st number = Minimum radius - // Minimum: -200.0 - // Maximum: 0.0 + // Keywords: + // "rainbow" - cycle through colors constantly. // -- - // 2nd number = Maximum radius - // Minimum: 0.0 - // Maximum: 200.0 - "Car Radius" "-180.0,180.0" - - "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" - { - // Note: Override any of the settings in the "Car Ability" section for each special infected here. - - // Example - "Access Flags" "" - "Close Areas Only" "0.0" - "Combo Ability" "0" - "Human Ability" "0" - "Human Ammo" "5" - "Human Cooldown" "0" - "Human Duration" "5" - "Human Mode" "1" - "Open Areas Only" "0.0" - "Requires Humans" "1" - "Ability Enabled" "0" - "Ability Message" "0" - "Car Chance" "33.3" - "Car Cooldown" "0" - "Car Duration" "5" - "Car Interval" "0.6" - "Car Lifetime" "30.0" - "Car Options" "0" - "Car Owner" "1" - "Car Radius" "-180.0,180.0" - } - } - } -} -``` -
- -##### Choke Ability -
- Click to expand! + // 1st set = RGB set for killers. + // 2nd set = RGB set for assistants. + // 3rd set = RGB set for teammates. + // 4th set = RGB set for assistant killers. + "Glow Color Visual" "" -``` -"Mutant Tanks" -{ - "Tank #1" - { - // The Mutant Tank chokes survivors in midair. - // "Ability Enabled" - When a survivor is within range of the Mutant Tank, the survivor is choked in the air. - // - "Choke Range" - // - "Choke Range Chance" - // - "Choke Range Cooldown" - // "Choke Hit" - When a survivor is hit by the Mutant Tank's claw or rock, or a survivor hits the Mutant Tank with a melee weapon, the survivor is choked in the air. - // - "Choke Chance" - // - "Choke Cooldown" - // - "Choke Hit Mode" - // Requires "mt_abilities.smx" to be compiled with "mt_choke.sp" to work. - "Choke Ability" - { - // Admins with one or more of these access flags have access to this ability. + // These are the RGBA values of the recipients' light color visual. + // Note: Any value less than "0" will output a random color. + // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. // Note: This setting can be overridden for specific players. // -- - // Empty: No access flags have access. - // Not empty: These access flags have access. - "Access Flags" "" - - // Admins with one or more of these immunity flags are immune to this ability's effects. - // Note: If the Mutant Tank has one or more of these immunity flags or has the same immunity flags as the survivor victim, the immunity is cancelled. - // Note: This setting can be overridden for specific players. + // Separate RGBA sets with commas (","). + // Separate RGBA values with semi-colons (";"). // -- - // Empty: No immunity flags are immune. - // Not empty: These immunity flags are immune. - "Immunity Flags" "" - - // The ability can only activate in close areas. - // Note: Do not change this setting if you are unsure of how it works. - // Note: This setting can be overridden for specific players. + // RGBA sets limit: 4 + // Character limit for each set: 16 + // Character limit for each value: 4 // -- - // Minimum: 0.0 (OFF) - // Maximum: 99999.0 (Farthest) + // Minimum value for each: -1 (Random) + // Maximum value for each: 255 (Brightest) + // -- + // 1st number = Red + // 2nd number = Green + // 3rd number = Blue + // 4th number = Alpha // -- // Keywords: - // "disabled"/"false"/"off"/"no" - 0.0 range - // "farthest" - 99999.0 range - "Close Areas Only" "0.0" + // "rainbow" - cycle through colors constantly. + // -- + // 1st set = RGBA set for killers. + // 2nd set = RGBA set for assistants. + // 3rd set = RGBA set for teammates. + // 4th set = RGBA set for assistant killers. + "Light Color Visual" "" - // Use this ability in conjunction with other abilities. - // Note: Only use this when "Spawn Type" is set to "4" for the Mutant Tank. - // Note: This setting does not affect human-controlled Mutant Tanks unless the "Human Ability" setting is set to "2". + // The interval of the looping voiceline visual. + // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. // Note: This setting can be overridden for specific players. // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Combo Ability" "0" + // Separate intervals with commas (","). + // -- + // Intervals limit: 4 + // Character limit for each interval: 9 + // -- + // Minimum value for each interval: 0.1 (Shortest) + // Maximum value for each interval: 99999.0 (Longest) + // -- + // 1st number = Interval for killers' looping voiceline. + // 2nd number = Interval for assistants' looping voiceline. + // 3rd number = Interval for teammates' looping voiceline. + // 4th number = Interval for assistant killers' looping voiceline. + "Looping Voiceline Interval" "" - // Allow human-controlled Mutant Tanks to use this ability. + // The voiceline that plays on loop throughout a survivor's reward duration. + // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. // Note: This setting can be overridden for specific players. // -- - // 0: OFF - // 1: ON, players can use buttons to activate abilities. - // 2: ON, abilities will activate automatically. - "Human Ability" "0" + // Separate voicelines with commas (","). + // -- + // Voiceline limit: 4 + // Character limit for each voiceline: 64 + // -- + // 1st set = Looping voiceline for killers. + // 2nd set = Looping voiceline for assistants. + // 3rd set = Looping voiceline for teammates. + // 4th set = Looping voiceline for assistant killers. + "Looping Voiceline Visual" "" - // Determines how many times human-controlled Mutant Tanks can use their abilities in one life. + // The particles for the recipients' particle effect visual. + // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. // Note: This setting can be overridden for specific players. // -- + // Add up numbers together for different results. + // -- // Minimum: 0 - // Maximum: 99999 + // Maximum: 15 // -- - // Keywords: - // "none"/"off" - 0 ammo - // "infinite" - 99999 ammo - "Human Ammo" "5" + // 0: OFF + // 1: Blood Explosion + // 2: Electric Jolt + // 4: Fire Trail + // 8: Acid Trail (Only available in Left 4 Dead 2.) + // -- + // 1st number = Particle effect for killers. + // 2nd number = Particle effect for assistants. + // 3rd number = Particle effect for teammates. + // 4th number = Particle effect for assistant killers. + "Particle Effect Visual" "0,0,0,0" - // Human-controlled Mutant Tanks must wait this long before using their abilities again. + // These are the RGBA values of the recipients' screen color visual. + // Note: Any value less than "0" will output a random color. + // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 (OFF) - // Maximum: 99999 (Longest) + // Separate RGBA sets with commas (","). + // Separate RGBA values with semi-colons (";"). // -- - // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Human Cooldown" "0" - - // Human-controlled Mutant Tanks must wait this long before using their range ability again. - // Note: This setting can be overridden for specific players. + // RGBA sets limit: 4 + // Character limit for each set: 16 + // Character limit for each value: 4 // -- - // Minimum: 0 (OFF) - // Maximum: 99999 (Longest) + // Minimum value for each: -1 (Random) + // Maximum value for each: 255 (Brightest) + // -- + // 1st number = Red + // 2nd number = Green + // 3rd number = Blue + // 4th number = Alpha // -- // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Human Range Cooldown" "0" + // "rainbow" - cycle through colors constantly. + // -- + // 1st set = RGBA set for killers. + // 2nd set = RGBA set for assistants. + // 3rd set = RGBA set for teammates. + // 4th set = RGBA set for assistant killers. + "Screen Color Visual" "" - // The ability can only activate in open areas. - // Note: Do not change this setting if you are unsure of how it works. + // The pitch of the recipients' voice throughout their reward duration. + // Note: This setting overrides the same setting under the "Plugin Settings/Rewards" section. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.0 (OFF) - // Maximum: 99999.0 (Farthest) + // Separate values with commas (","). // -- - // Keywords: - // "disabled"/"false"/"off"/"no" - 0.0 range - // "farthest" - 99999.0 range - "Open Areas Only" "0.0" - - // The ability is only effective toward human survivors. - // Note: This setting can be overridden for specific players. + // Values limit: 4 + // Character limit for each value: 3 // -- - // Minimum: 0 - // Maximum: 32 + // Minimum value for each: 0 (OFF) + // Maximum value for each: 255 (Highest) // -- - // 0: OFF - // 1-32: ON, the number of human survivors required to be present for this ability to be effective. - "Requires Humans" "0" + // 1st number = Voice pitch for killers. + // 2nd number = Voice pitch for assistants. + // 3rd number = Voice pitch for teammates. + // 4th number = Voice pitch for assistant killers. + "Voice Pitch Visual" "0,0,0,0" - // Enable this ability. - // Note: This setting does not affect the "Choke Hit" setting. + "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" + { + "Reward Enabled" "-1,-1,-1,-1" + "Reward Bots" "-1,-1,-1,-1" + "Reward Chance" "0.0,0.0,0.0,0.0" + "Reward Duration" "0.0,0.0,0.0,0.0" + "Reward Effect" "0,0,0,0" + "Reward Notify" "0,0,0,0" + "Reward Percentage" "0.0,0.0,0.0,0.0" + "Reward Visual" "0,0,0,0" // Default is "63" on Left 4 Dead 1. + "Prefs Notify" "0,0,0,0" + "Share Rewards" "0,0,0,0" + "Teammate Limit" "0" + "Action Duration Reward" "0.0,0.0,0.0,0.0" + "Adrenaline Time Reward" "0.0,0.0,0.0,0.0" + "Ammo Boost Reward" "0,0,0,0" + "Ammo Refill Reward" "0,0,0,0" + "Ammo Regen Reward" "0,0,0,0" + "Attack Boost Reward" "0.0,0.0,0.0,0.0" + "Blaze Health Reward" "0,0,0,0" + "Blood Donor Reward" "0,0,0,0" + "Bunny Hop Reward" "0,0,0,0" + "Burst Doors Reward" "0,0,0,0" + "Clean Kills Reward" "0,0,0,0" + "Cluster Bombs Reward" "0,0,0,0" + "Damage Boost Reward" "0.0,0.0,0.0,0.0" + "Damage Resistance Reward" "0.0,0.0,0.0,0.0" + "Dopamine Radius Reward" "0.0,0.0,0.0,0.0" + "Eternal Flames Reward" "0,0,0,0" + "Fall Voiceline Reward" "" + "Fast Recovery Reward" "0,0,0,0" + "Fire Rate Reward" "0.0,0.0,0.0,0.0" + "Friendly Fire Reward" "0,0,0,0" + "Ghost Bullets Reward" "0,0,0,0" + "Grenade Launcher Reward" "0.0,0.0,0.0,0.0" + "Heal Percent Reward" "0.0,0.0,0.0,0.0" + "Healthcare Radius Reward" "0.0,0.0,0.0,0.0" + "Health Regen Reward" "0,0,0,0" + "Heartbeat Reward" "0.0,0.0,0.0,0.0" + "Hollowpoint Ammo Reward" "0.0,0.0,0.0,0.0" + "Infinite Ammo Reward" "0,0,0,0" + "Item Reward" "" + "Jump Height Reward" "0.0,0.0,0.0,0.0" + "Ladder Actions Reward" "0,0,0,0" + "Lady Killer Reward" "0.0,0.0,0.0,0.0" + "Laser Sight Reward" "0,0,0,0" + "Life Leech Reward" "0,0,0,0" + "Lucky Bullet Reward" "0.0,0.0,0.0,0.0" + "Medical Cuts Reward" "0,0,0,0" + "Melee Range Reward" "0,0,0,0" + "Midair Dashes Reward" "0,0,0,0" + "Motivation Radius Reward" "0.0,0.0,0.0,0.0" + "Overdose Radius Reward" "0.0,0.0,0.0,0.0" + "Overhealth Reward" "0,0,0,0" + "Pipebomb Duration Reward" "0.0,0.0,0.0,0.0" + "Punch Resistance Reward" "0.0,0.0,0.0,0.0" + "Rapid Pistol Reward" "0.0,0.0,0.0,0.0" + "Recoil Dampener Reward" "0,0,0,0" + "Refill Percent Reward" "0.0,0.0,0.0,0.0" + "Regen Bursts Reward" "0,0,0,0" + "Reload Rate Reward" "0.0,0.0,0.0,0.0" + "Respawn Loadout Reward" "0,0,0,0" + "Revive Health Reward" "0,0,0,0" + "Riot Gear Reward" "0,0,0,0" + "Safety Bubble Reward" "0,0,0,0" + "Shockwave Radius Reward" "0.0,0.0,0.0,0.0" + "Shove Damage Reward" "0.0,0.0,0.0,0.0" + "Shove Penalty Reward" "0,0,0,0" + "Shove Rate Reward" "0.0,0.0,0.0,0.0" + "Sledgehammer Rounds Reward" "0.0,0.0,0.0,0.0" + "Special Ammo Reward" "0,0,0,0" + "Speed Boost Reward" "0.0,0.0,0.0,0.0" + "Stack Limits" "0,0,0,0,0,0,0,0" + "Stack Rewards" "0,0,0,0" + "Sticky Grenades Reward" "0,0,0,0" + "Supplier Reward" "0.0,0.0,0.0,0.0" + "Swing Rate Reward" "0.0,0.0,0.0,0.0" + "Syringe Darts Reward" "0,0,0,0" + "Thorns Reward" "0,0,0,0" + "Useful Rewards" "0,0,0,0" + "Body Color Visual" "" + "Glow Color Visual" "" + "Light Color Visual" "" + "Looping Voiceline Interval" "0.0,0.0,0.0,0.0" + "Looping Voiceline Visual" "" + "Particle Effect Visual" "0,0,0,0" + "Screen Color Visual" "" + "Voice Pitch Visual" "0,0,0,0" + } + } + "Competitive" + { + // (Co-Op modes only) The Mutant Tank should attack immediately after spawning. + // Note: Do not change this setting if you are unsure of how it works. + // Note: This setting overrides the same setting under the "Plugin Settings/Competitive" section. + // -- + // 0/"disabled"/"false"/"off"/"no": OFF, let the game determine the Mutant Tank's initial behavior. + // 1/"enabled"/"true"/"on"/"yes": ON, force the Mutant Tank to attack immediately. + "Auto Aggravate" "0" + + // (Co-Op modes only) The Mutant Tank should prioritize throwing rocks. + // Note: Tanks only prioritize throwing rocks on Advanced and Expert modes by default. + // Note: Do not change this setting if you are unsure of how it works. + // Note: This setting overrides the same setting under the "Plugin Settings/Competitive" section. + // -- + // 0/"disabled"/"false"/"off"/"no": OFF, let the game determine Mutant Tanks' attack. + // 1/"enabled"/"true"/"on"/"yes": ON, force Mutant Tanks to prioritize throwing rocks. + "Prioritize Throws" "0" + } + "Glow" + { + // The Mutant Tank will have a glow outline. + // Note: Only available in Left 4 Dead 2. // Note: This setting can be overridden for specific players. // -- // 0/"disabled"/"false"/"off"/"no": OFF // 1/"enabled"/"true"/"on"/"yes": ON - "Ability Enabled" "0" + "Glow Enabled" "0" - // Show a screen fade effect when the Mutant Tank uses its abilities. - // Note: The colors will randomly change between the colors set in the "Skin Color" and "Glow Color" settings. + // These are the RGB values of the Mutant Tank's glow outline color. + // Note: Only available in Left 4 Dead 2. + // Note: Any value less than "0" will output a random color. // Note: This setting can be overridden for specific players. // -- - // Add up numbers together for different results. - // -- - // Minimum: 0 - // Maximum: 7 - // -- - // 0: OFF - // 1: Show effect when the Mutant Tank uses its claw/rock attack. - // 2: Show effect when the Mutant Tank is hit by a melee weapon. - // 4: Show effect when the Mutant Tank uses its range ability. + // 1st number = Red + // 2nd number = Green + // 3rd number = Blue // -- // Keywords: - // "none"/"off" - 0 - // "attack" - 1 - // "hurt" - 2 - // "attack,hurt" - 3 - // "range" - 4 - // "attack,range" - 5 - // "hurt,range" - 6 - // "attack,hurt,range" - 7 - "Ability Effect" "0" + // "rainbow" - cycle through colors constantly. + "Glow Color" "255,255,255" + //"Glow Color" "all_tank_glows" // Alternative (See "Colors" section) - // Display a message whenever the ability activates/deactivates. + // The Mutant Tank's glow outline will flash. + // Note: Only available in Left 4 Dead 2. // Note: This setting can be overridden for specific players. // -- - // Add up numbers together for different results. + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Glow Flashing" "0" + + // The Mutant Tank's glow outline will only appear for survivors who are within this range. + // Note: Only available in Left 4 Dead 2. + // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 - // Maximum: 3 + // Separate values with "-". // -- - // 0: OFF - // 1: Display message only when "Choke Hit" is enabled. - // 2: Display message only when "Ability Enabled" is enabled. + // Value limit: 2 + // Character limit for each value: 6 // -- - // Keywords: - // "none"/"off" - 0 - // "hit" - 1 - // "ability" - 2 - // "both"/"all"/"hit,ability" - 3 - "Ability Message" "0" + // Minimum number for each value: 0 (Unlimited) + // Maximum number for each value: 99999 + // -- + // 1st number = Minimum value + // 2nd number = Maximum value + "Glow Range" "0-99999" - // Check line-of-sight when the Mutant Tank uses its abilities. + // The Mutant Tank's glow outline visibility type. + // Note: Only available in Left 4 Dead 2. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 - // Maximum: 5 - // -- - // 0: OFF - // 1: Check if there is a solid object between the Mutant Tank and survivors. - // 2: Option 1 + Check if the Mutant Tank is looking toward the survivors. - // 3: Option 1 + Check if the Mutant Tank is looking away from the survivors. - // 4: Option 1 + Check if the survivors are looking toward the Mutant Tank. - // 5: Option 1 + Check if the survivors are looking away from the Mutant Tank. - "Ability Sight" "0" + // 0: Glow outline visible only on sight. + // 1: Glow outline visible through the walls. + "Glow Type" "0" - // Block the fall damage of the Mutant Tank's ability. + "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" + { + // Note: Override any of the settings in the "Glow" section for each special infected here. + + // Example + "Glow Enabled" "0" + "Glow Color" "255,255,255" + "Glow Flashing" "0" + "Glow Range" "0-99999" + "Glow Type" "0" + } + "Mob" // Syntax: "Mob"/"Infected"/"inf" + { + // Note: Override any of the settings in the "Glow" section for each mob infected here. + + // Example + "Glow Enabled" "0" + "Glow Color" "255,255,255" + "Glow Flashing" "0" + "Glow Range" "0-99999" + "Glow Type" "0" + } + } + "Administration" + { + // Admins with one or more of these access flags have access to the Mutant Tank type. + // Note: This setting overrides the same setting under the "Plugin Settings/Administration" section. // Note: This setting can be overridden for specific players. // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Choke Block" "1" + // Empty: No access flags have access. + // Not empty: These access flags have access. + "Access Flags" "" - // The Mutant Tank has this many chances out of 100.0% to trigger the ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Admins with one or more of these immunity flags are immune to all of the Mutant Tank's attacks. + // Note: This setting overrides the same setting under the "Plugin Settings/Administration" section. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.0 (No chance) - // Maximum: 100.0 (Highest chance) + // Empty: No immunity flags are immune. + // Not empty: These immunity flags are immune. + "Immunity Flags" "" + } + "Human Support" + { + // Allow players to play as the Mutant Tank. // -- - // Keywords: - // "never" - 0% chance - // "sometimes"/"unlikely"/"seldom" - 33.3% chance - // "maybe" - 50% chance - // "often"/"likely"/"frequently" - 66.6% chance - // "always" - 100% chance - "Choke Chance" "33.3" + // 0: OFF + // 1: ON, inform players about activating their abilities manually. + // 2: ON, do not inform players about activating their abilities manually. + "Human Support" "0" - // The cooldown for the Mutant Tank's hit ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". - // Note: This setting can be overridden for specific players. + "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" + { + // Note: Override any of the settings in the "Human Support" section for each special infected here. + + // Example + "Human Support" "0" + } + } + "Spawn" + { + // The number of Mutant Tanks with this type that can be alive at any given time. + // Note: Clones, respawned Mutant Tanks, randomized Tanks, and Mutant Tanks spawned through the Mutant Tanks menu are not affected. + // Note: Do not change this setting if you are unsure of how it works. // -- // Minimum: 0 (OFF) - // Maximum: 99999 (Longest) - // -- - // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Choke Cooldown" "0" + // Maximum: 32 + "Type Limit" "0" - // The Mutant Tank's chokes do this much damage. - // Note: This is ignored when the "Combo Ability" setting is set to "1". - // Note: This setting can be overridden for specific players. + // The Mutant Tank can only spawn in close areas. + // Note: Do not change this setting if you are unsure of how it works. // -- // Minimum: 0.0 (OFF) - // Maximum: 99999.0 + // Maximum: 99999.0 (Farthest) // -- // Keywords: - // "weakest" - 1.0 damage - // "strongest" - 99999.0 damage - "Choke Damage" "5.0" + // "disabled"/"false"/"off"/"no" - 0.0 range + // "farthest" - 99999.0 range + "Close Areas Only" "0.0" - // The Mutant Tank chokes survivors in the air after this many seconds passes upon triggering the ability. - // Note: This setting can be overridden for specific players. + // The Mutant Tank will only spawn on finale maps. + // Note: Clones, respawned Mutant Tanks, randomized Tanks, and Mutant Tanks spawned through the Mutant Tanks menu are not affected. + // Note: Do not change this setting if you are unsure of how it works. // -- - // Minimum: 0.1 - // Maximum: 99999.0 + // 0: OFF, the Mutant Tank can appear on any map. + // 1: ON, the Mutant Tank can only appear on finale maps. + // 2: ON, the Mutant Tank can only appear on non-finale maps. + // 3: ON, the Mutant Tank can only appear on finale maps before the rescue vehicle is called. + // 4: ON, the Mutant Tank can only appear on finale maps after the rescue vehicle is called. + "Finale Tank" "0" + + // The Mutant Tank can only spawn in open areas. + // Note: Do not change this setting if you are unsure of how it works. + // -- + // Minimum: 0.0 (OFF) + // Maximum: 99999.0 (Farthest) // -- // Keywords: - // "milli"/"millisecond" - 0.1 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Choke Delay" "1.0" + // "disabled"/"false"/"off"/"no" - 0.0 range + // "farthest" - 99999.0 range + "Open Areas Only" "0.0" - // The Mutant Tank's ability effects last this long. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // The mode of the Mutant Tank's spawn status. // Note: This setting can be overridden for specific players. // -- - // Minimum: 1 - // Maximum: 99999 + // 0: Spawn as normal Mutant Tanks. + // 1: Spawn as Mutant Tank bosses. + // 2: Spawn as Mutant Tanks that switch randomly between each type. + // 3: Spawn as Mutant Tanks that temporarily transforms into a different type and reverts back after awhile. + // 4: Spawn as normal Mutant Tanks that can combine abilities. + "Spawn Type" "0" + + "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" + { + // Note: Override any of the settings in the "Spawn" section for each special infected here. + + // The Mutant Special Infected will only spawn on finale maps. + // Note: Clones, respawned Mutant Special Infected, randomized Special Infected, and Mutant Special Infected spawned through the Mutant Special Infected menus are not affected. + // Note: Do not change this setting if you are unsure of how it works. + // -- + // 0: OFF, the Mutant Special Infected can appear on any map. + // 1: ON, the Mutant Special Infected can only appear on finale maps. + // 2: ON, the Mutant Special Infected can only appear on non-finale maps. + // 3: ON, the Mutant Special Infected can only appear on finale maps before the rescue vehicle is called. + // 4: ON, the Mutant Special Infected can only appear on finale maps after the rescue vehicle is called. + "Finale Special" "0" + + // Example + "Type Limit" "0" + "Close Areas Only" "0.0" + "Finale Special" "0" + "Open Areas Only" "0.0" + "Spawn Type" "0" + } + } + "Boss" + { + // The base Mutant Tank type of the boss. + // Note: This setting only takes effect when the "Spawn Type" setting is set to "1". + // Note: This setting is only required for the boss' evolution stages, not its base form. + // Note: The value of this setting is used to track the boss across its evolution stages. // -- - // Keywords: - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Choke Duration" "5" + // 0: OFF + // 1-500: ON, the base Mutant Tank type of the boss. + "Boss Base Type" "0" - // Enable the Mutant Tank's claw/rock attack. - // Note: This setting does not need the "Ability Enabled" setting to be set to "1". + // The effects for the boss. // Note: This setting can be overridden for specific players. // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Choke Hit" "0" + // Add up numbers together for different results. + // -- + // Minimum: 0 + // Maximum: 15 + // -- + // 0: OFF + // 1: Survivor reactions + // 2: Explosion + // 4: Impact wave + // 8: Slow-motion (Only available in Left 4 Dead 2.) + "Boss Effects" "0" - // The mode of the Mutant Tank's claw/rock attack. + // The health of bosses needed for each stage. + // Note: This setting only takes effect when the "Spawn Type" setting is set to "1". + // Note: The values will be added to the boss's new health on every new stage. + // Note: The values will determine when the boss evolves to the next stage. // Note: This setting can be overridden for specific players. + // Example: When Stage 2 boss with 8000 base HP has 2500 HP or less, it will evolve into Stage 3 boss with 10500 HP (8000 + 2500 HP). // -- - // 0: Both - // 1: Ability activates when the Mutant Tank hits a survivor. - // 2: Ability activates when the Mutant Tank is hit by a survivor. + // Separate abilities with commas (","). + // -- + // Character limit: 44 (including commas) + // Health stages limit: 4 + // Character limit for each health stage: 11 + // -- + // Minimum value for each health stage: 1 + // Maximum value for each health stage: 1000000 + // -- + // 1st number = Amount of health of the boss to make it evolve/Amount of health given to Stage 2 boss. (The "Boss Stages" setting must be set to "1" or higher.) + // 2nd number = Amount of health of the boss to make it evolve/Amount of health given to Stage 3 boss. (The "Boss Stages" setting must be set to "2" or higher.) + // 3rd number = Amount of health of the boss to make it evolve/Amount of health given to Stage 4 boss. (The "Boss Stages" setting must be set to "3" or higher.) + // 4th number = Amount of health of the boss to make it evolve/Amount of health given to Stage 5 boss. (The "Boss Stages" setting must be set to "4" or higher.) + "Boss Health Stages" "5000,2500,1666,1250" + + // The number of Mutant Tanks with this boss type that can be alive at any given time. + // Note: This setting only takes effect when the "Spawn Type" setting is set to "1". + // Note: This setting is only required for the boss' base form, not its evolution stages. + // Note: The value of this setting is used to limit the boss across its evolution stages. + // Note: Clones, respawned Mutant Tanks, randomized Tanks, and Mutant Tanks spawned through the Mutant Tanks menu are not affected. + // Note: Do not change this setting if you are unsure of how it works. // -- - // Keywords: - // "both"/"all" - 0 - // "tank"/"attack" - 1 - // "survivor"/"hurt" - 2 - "Choke Hit Mode" "0" + // Minimum: 0 (OFF) + // Maximum: 32 + "Boss Limit" "0" - // The distance between a survivor and the Mutant Tank needed to trigger the ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // The number of stages for the Mutant Tank boss. + // Note: This setting only takes effect when the "Spawn Type" setting is set to "1". // Note: This setting can be overridden for specific players. // -- - // Minimum: 1.0 (Closest) - // Maximum: 99999.0 (Farthest) - // -- - // Keywords: - // "closest" - 1.0 range - // "farthest" - 99999.0 range - "Choke Range" "150.0" + // Minimum: 1 + // Maximum: 4 + "Boss Stages" "4" - // The Mutant Tank has this many chances out of 100.0% to trigger the range ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // The Mutant Tank types that the boss will evolve into. + // Note: This setting only takes effect when the "Spawn Type" setting is set to "1". + // Note: Make sure that the Mutant Tank types that the boss will evolve into are enabled. // Note: This setting can be overridden for specific players. + // Example: When Stage 1 boss evolves into Stage 2, it will evolve into Tank #2. // -- - // Minimum: 0.0 (No chance) - // Maximum: 100.0 (Highest chance) + // Separate abilities with commas (","). // -- - // Keywords: - // "never" - 0% chance - // "sometimes"/"unlikely"/"seldom" - 33.3% chance - // "maybe" - 50% chance - // "often"/"likely"/"frequently" - 66.6% chance - // "always" - 100% chance - "Choke Range Chance" "15.0" - - // The cooldown for the Mutant Tank's range ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". - // Note: This setting can be overridden for specific players. + // Character limit: 20 + // Stage types limit: 4 + // Character limit for each stage type: 5 // -- - // Minimum: 0 (OFF) - // Maximum: 99999 (Longest) + // Minimum: 1 + // Maximum: 500 // -- - // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Choke Range Cooldown" "0" + // 1st number = 2nd stage type + // 2nd number = 3rd stage type + // 3rd number = 4th stage type + // 4th number = 5th stage type + "Boss Types" "2,3,4,5" "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" { - // Note: Override any of the settings in the "Choke Ability" section for each special infected here. + // Note: Override any of the settings in the "Boss" section for each special infected here. // Example - "Access Flags" "" - "Immunity Flags" "" - "Close Areas Only" "0.0" - "Combo Ability" "0" - "Human Ability" "0" - "Human Ammo" "5" - "Human Cooldown" "0" - "Human Range Cooldown" "0" - "Open Areas Only" "0.0" - "Requires Humans" "0" - "Ability Enabled" "0" - "Ability Effect" "0" - "Ability Message" "0" - "Ability Sight" "0" - "Choke Block" "1" - "Choke Chance" "33.3" - "Choke Cooldown" "0" - "Choke Damage" "5.0" - "Choke Delay" "1.0" - "Choke Duration" "5" - "Choke Hit" "0" - "Choke Hit Mode" "0" - "Choke Range" "150.0" - "Choke Range Chance" "15.0" - "Choke Range Cooldown" "0" + "Boss Base Type" "0" + "Boss Effects" "0" + "Boss Health Stages" "5000,2500,1666,1250" + "Boss Limit" "0" + "Boss Stages" "4" + "Boss Types" "2,3,4,5" } } - } -} -``` -
- -##### Clone Ability -
- Click to expand! - -``` -"Mutant Tanks" -{ - "Tank #1" - { - // The Mutant Tank creates clones of itself. - // Requires "mt_abilities.smx" to be compiled with "mt_clone.sp" to work. - "Clone Ability" + "Combo" { - // Admins with one or more of these access flags have access to this ability. + // The chance to trigger each ability in the combination. + // Note: This setting only takes effect when the "Spawn Type" setting is set to "4". // Note: This setting can be overridden for specific players. // -- - // Empty: No access flags have access. - // Not empty: These access flags have access. - "Access Flags" "" - - // The ability can only activate in close areas. - // Note: Do not change this setting if you are unsure of how it works. - // Note: This setting can be overridden for specific players. + // Separate chances with commas (","). // -- - // Minimum: 0.0 (OFF) - // Maximum: 99999.0 (Farthest) + // Chances limit: 10 + // Character limit for each chance: 6 // -- - // Keywords: - // "disabled"/"false"/"off"/"no" - 0.0 range - // "farthest" - 99999.0 range - "Close Areas Only" "0.0" - - // Use this ability in conjunction with other abilities. - // Note: Only use this when "Spawn Type" is set to "4" for the Mutant Tank. - // Note: This setting does not affect human-controlled Mutant Tanks unless the "Human Ability" setting is set to "2". - // Note: This setting can be overridden for specific players. + // Minimum value for each chance: 0.0 (No chance) + // Maximum value for each chance: 100.0 (Highest chance) // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Combo Ability" "0" + // 1st number = Chance to trigger the first ability. + // 2nd number = Chance to trigger the second ability. + // 3rd number = Chance to trigger the third ability. + // 4th number = Chance to trigger the fourth ability. + // 5th number = Chance to trigger the fifth ability. + // 6th number = Chance to trigger the sixth ability. + // 7th number = Chance to trigger the seventh ability. + // 8th number = Chance to trigger the eighth ability. + // 9th number = Chance to trigger the ninth ability. + // 10th number = Chance to trigger the tenth ability. + "Combo Chance" "0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0" - // Allow human-controlled Mutant Tanks to use this ability. + // The cooldown of each ability in the combination. + // Note: This setting only takes effect when the "Spawn Type" setting is set to "4". // Note: This setting can be overridden for specific players. // -- - // 0: OFF - // 1: ON, players can use buttons to activate abilities. - // 2: ON, abilities will activate automatically. - "Human Ability" "0" - - // Determines how many times human-controlled Mutant Tanks can use their abilities in one life. - // Note: This setting can be overridden for specific players. + // Separate cooldowns with commas (","). // -- - // Minimum: 0 - // Maximum: 99999 + // Cooldowns limit: 10 + // Character limit for each cooldown: 6 // -- - // Keywords: - // "none"/"off" - 0 ammo - // "infinite" - 99999 ammo - "Human Ammo" "5" + // Minimum value for each cooldown: 0 (OFF) + // Maximum value for each cooldown: 99999 (Longest) + // -- + // 1st number = Cooldown of the first ability. + // 2nd number = Cooldown of the second ability. + // 3rd number = Cooldown of the third ability. + // 4th number = Cooldown of the fourth ability. + // 5th number = Cooldown of the fifth ability. + // 6th number = Cooldown of the sixth ability. + // 7th number = Cooldown of the seventh ability. + // 8th number = Cooldown of the eighth ability. + // 9th number = Cooldown of the ninth ability. + // 10th number = Cooldown of the tenth ability. + "Combo Cooldown" "0,0,0,0,0,0,0,0,0,0" - // Human-controlled Mutant Tanks must wait this long before using their abilities again. + // The damage of each ability in the combination. + // Note: This setting only takes effect when the "Spawn Type" setting is set to "4". // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 (OFF) - // Maximum: 99999 (Longest) + // Separate damages with commas (","). // -- - // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Human Cooldown" "0" - - // The ability can only activate in open areas. - // Note: Do not change this setting if you are unsure of how it works. - // Note: This setting can be overridden for specific players. + // Damages limit: 10 + // Character limit for each damage: 9 // -- - // Minimum: 0.0 (OFF) - // Maximum: 99999.0 (Farthest) + // Minimum value for each damage: 0.0 (OFF) + // Maximum value for each chance: 99999.0 (Strongest) // -- - // Keywords: - // "disabled"/"false"/"off"/"no" - 0.0 range - // "farthest" - 99999.0 range - "Open Areas Only" "0.0" + // 1st number = Damage of the first ability. + // 2nd number = Damage of the second ability. + // 3rd number = Damage of the third ability. + // 4th number = Damage of the fourth ability. + // 5th number = Damage of the fifth ability. + // 6th number = Damage of the sixth ability. + // 7th number = Damage of the seventh ability. + // 8th number = Damage of the eighth ability. + // 9th number = Damage of the ninth ability. + // 10th number = Damage of the tenth ability. + "Combo Damage" "0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0" - // The ability is only effective toward human survivors. + // The chance to trigger each ability in the combination when the Mutant Tank dies. + // Note: This setting only takes effect when the "Spawn Type" setting is set to "4". // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 - // Maximum: 32 + // Separate chances with commas (","). // -- - // 0: OFF - // 1-32: ON, the number of human survivors required to be present for this ability to be effective. - "Requires Humans" "0" + // Chances limit: 10 + // Character limit for each chance: 6 + // -- + // Minimum value for each chance: 0.0 (No chance) + // Maximum value for each chance: 100.0 (Highest chance) + // -- + // 1st number = Chance of the first ability. + // 2nd number = Chance of the second ability. + // 3rd number = Chance of the third ability. + // 4th number = Chance of the fourth ability. + // 5th number = Chance of the fifth ability. + // 6th number = Chance of the sixth ability. + // 7th number = Chance of the seventh ability. + // 8th number = Chance of the eighth ability. + // 9th number = Chance of the ninth ability. + // 10th number = Chance of the tenth ability. + "Combo Death Chance" "0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0" - // Enable this ability. + // The range needed to trigger each ability in the combination when the Mutant Tank dies. + // Note: This setting only takes effect when the "Spawn Type" setting is set to "4". // Note: This setting can be overridden for specific players. // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Ability Enabled" "0" - - // Display a message whenever the ability activates/deactivates. - // Note: This setting can be overridden for specific players. + // Separate ranges with commas (","). // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Ability Message" "0" - - // The amount of clones the Mutant Tank can create. - // Note: This setting can be overridden for specific players. + // Ranges limit: 10 + // Character limit for each range: 9 // -- - // Minimum: 1 - // Maximum: 15 - "Clone Amount" "2" + // Minimum value for each range: 0.0 (OFF) + // Maximum value for each range: 99999.0 (Farthest) + // -- + // 1st number = Range of the first ability. + // 2nd number = Range of the second ability. + // 3rd number = Range of the third ability. + // 4th number = Range of the fourth ability. + // 5th number = Range of the fifth ability. + // 6th number = Range of the sixth ability. + // 7th number = Range of the seventh ability. + // 8th number = Range of the eighth ability. + // 9th number = Range of the ninth ability. + // 10th number = Range of the tenth ability. + "Combo Death Range" "0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0" - // The Mutant Tank has this many chances out of 100.0% to trigger the ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // The delay of each ability in the combination. + // Note: This setting only takes effect when the "Spawn Type" setting is set to "4". // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.0 (No chance) - // Maximum: 100.0 (Highest chance) + // Separate delays with commas (","). // -- - // Keywords: - // "never" - 0% chance - // "sometimes"/"unlikely"/"seldom" - 33.3% chance - // "maybe" - 50% chance - // "often"/"likely"/"frequently" - 66.6% chance - // "always" - 100% chance - "Clone Chance" "33.3" - - // The cooldown for the Mutant Tank's ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". - // Note: This setting can be overridden for specific players. + // Delays limit: 10 + // Character limit for each delay: 9 // -- - // Minimum: 0 (OFF) - // Maximum: 99999 (Longest) + // Minimum value for each delay: 0.0 (OFF) + // Maximum value for each delay: 99999.0 (Longest) // -- - // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Clone Cooldown" "0" + // 1st number = Delay of the first ability. + // 2nd number = Delay of the second ability. + // 3rd number = Delay of the third ability. + // 4th number = Delay of the fourth ability. + // 5th number = Delay of the fifth ability. + // 6th number = Delay of the sixth ability. + // 7th number = Delay of the seventh ability. + // 8th number = Delay of the eighth ability. + // 9th number = Delay of the ninth ability. + // 10th number = Delay of the tenth ability. + "Combo Delay" "0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0" - // The Mutant Tank's clone's health. + // The duration of each ability in the combination. + // Note: This setting only takes effect when the "Spawn Type" setting is set to "4". // Note: This setting can be overridden for specific players. // -- - // Minimum: 1 - // Maximum: 1000000 - "Clone Health" "1000" - - // Clones created by the Mutant Tank die after this many seconds. - // Note: This setting can be overridden for specific players. + // Separate durations with commas (","). // -- - // Minimum: 0.0 (Until death) - // Maximum: 99999.0 (Longest) + // Durations limit: 10 + // Character limit for each duration: 9 // -- - // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds - // "milli"/"millisecond" - 0.1 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever"/"death" - 99999 seconds - "Clone Lifetime" "0.0" - - // The Mutant Tank's clone will be treated as a real Mutant Tank. - // Note: Clones cannot clone themselves regardless of the value for this setting for obvious safety reasons. - // Note: This setting can be overridden for specific players. + // Minimum value for each duration: 0.0 (OFF) + // Maximum value for each duration: 99999.0 (Longest) // -- - // 0/"disabled"/"false"/"off"/"no": OFF, the clone cannot use abilities like real Mutant Tanks. - // 1/"enabled"/"true"/"on"/"yes": ON, the clone can use abilities like real Mutant Tanks. - "Clone Mode" "0" + // 1st number = Duration of the first ability. + // 2nd number = Duration of the second ability. + // 3rd number = Duration of the third ability. + // 4th number = Duration of the fourth ability. + // 5th number = Duration of the fifth ability. + // 6th number = Duration of the sixth ability. + // 7th number = Duration of the seventh ability. + // 8th number = Duration of the eighth ability. + // 9th number = Duration of the ninth ability. + // 10th number = Duration of the tenth ability. + "Combo Duration" "0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0" - // Remove all clones created by the Mutant Tank when it dies or changes its Mutant Tank type. + // The interval of each ability in the combination. + // Note: This setting only takes effect when the "Spawn Type" setting is set to "4". // Note: This setting can be overridden for specific players. // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Clone Remove" "1" - - // The Mutant Tank's clones are replaced with new ones when they die. - // Note: This setting can be overridden for specific players. + // Separate intervals with commas (","). // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Clone Replace" "1" - - // The Mutant Tank swaps places with one of its clones every time this many seconds passes. - // Note: This setting can be overridden for specific players. + // Intervals limit: 10 + // Character limit for each interval: 9 // -- - // Minimum: 0.1 - // Maximum: 99999.0 + // Minimum value for each interval: 0.0 (OFF) + // Maximum value for each interval: 99999.0 (Longest) // -- - // Keywords: - // "milli"/"millisecond" - 0.1 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Clone Swap" "5.0" + // 1st number = Interval of the first ability. + // 2nd number = Interval of the second ability. + // 3rd number = Interval of the third ability. + // 4th number = Interval of the fourth ability. + // 5th number = Interval of the fifth ability. + // 6th number = Interval of the sixth ability. + // 7th number = Interval of the seventh ability. + // 8th number = Interval of the eighth ability. + // 9th number = Interval of the ninth ability. + // 10th number = Interval of the tenth ability. + "Combo Interval" "0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0" - // The type of the Mutant Tank's clone. - // Note: Chosen types that also have the Clone ability will be replaced with the Mutant Tank's own type to prevent bugs. + // The radius of each ability in the combination. + // Note: This setting only takes effect when the "Spawn Type" setting is set to "4". // Note: This setting can be overridden for specific players. // -- - // Separate values with "-". + // Separate radiuses with commas (","). + // Separate values with semi-colons (";"). // -- - // Value limit: 2 - // Character limit for each value: 4 + // Radiuses limit: 10 + // Character limit for each radius: 14 // -- - // Minimum number for each value: 0 (OFF) - // Maximum number for each value: 500 + // Minimum value for each radius: -200.0 + // Maximum value for each radius: 200.0 // -- // 1st number = Minimum value // 2nd number = Maximum value // -- - // Example: "0-0" (Do not choose from any Mutant Tank types.) - // Example: "1-25" (Choose a Mutant Tank type between 1 through 25.) - // Example: "50-0" (Automatically change to "0-0" because "50" is higher than "0".) - // Example: "1-1000" (Automatically change to "1-500" because "500" is the maximum number of Mutant Tank types allowed.) - // Example: "0" (Automatically change to "0-500" because the maximum range is not specified.) - // Example: "1000" (Automatically change to "500-500" because the maximum range is not specified and the minimum range exceeds the "500" limit.) - // -- - // 0: OFF, use the randomization feature. - // 1-500: ON, the type of the clone. - "Clone Type" "0-0" - - "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" - { - // Note: Override any of the settings in the "Clone Ability" section for each special infected here. - - // Example - "Access Flags" "" - "Close Areas Only" "0.0" - "Combo Ability" "0" - "Human Ability" "0" - "Human Ammo" "5" - "Human Cooldown" "0" - "Open Areas Only" "0.0" - "Requires Humans" "0" - "Ability Enabled" "0" - "Ability Message" "0" - "Clone Amount" "2" - "Clone Chance" "33.3" - "Clone Cooldown" "0" - "Clone Health" "1000" - "Clone Lifetime" "0.0" - "Clone Mode" "0" - "Clone Remove" "1" - "Clone Replace" "1" - "Clone Swap" "5.0" - "Clone Type" "0-0" - } - } - } -} -``` -
- -##### Cloud Ability -
- Click to expand! - -``` -"Mutant Tanks" -{ - "Tank #1" - { - // The Mutant Tank constantly emits clouds of smoke that damage survivors caught in them. - // Requires "mt_abilities.smx" to be compiled with "mt_cloud.sp" to work. - "Cloud Ability" - { - // Admins with one or more of these access flags have access to this ability. - // Note: This setting can be overridden for specific players. - // -- - // Empty: No access flags have access. - // Not empty: These access flags have access. - "Access Flags" "" - - // Admins with one or more of these immunity flags are immune to this ability's effects. - // Note: If the Mutant Tank has one or more of these immunity flags or has the same immunity flags as the survivor victim, the immunity is cancelled. - // Note: This setting can be overridden for specific players. - // -- - // Empty: No immunity flags are immune. - // Not empty: These immunity flags are immune. - "Immunity Flags" "" + // 1st set = Radius of the first ability. + // 2nd set = Radius of the second ability. + // 3rd set = Radius of the third ability. + // 4th set = Radius of the fourth ability. + // 5th set = Radius of the fifth ability. + // 6th set = Radius of the sixth ability. + // 7th set = Radius of the seventh ability. + // 8th set = Radius of the eighth ability. + // 9th set = Radius of the ninth ability. + // 10th set = Radius of the tenth ability. + "Combo Radius" "0.0;0.0,0.0;0.0,0.0;0.0,0.0;0.0,0.0;0.0,0.0;0.0,0.0;0.0,0.0;0.0,0.0;0.0,0.0;0.0" - // The ability can only activate in close areas. - // Note: Do not change this setting if you are unsure of how it works. + // The range of each ability in the combination. + // Note: This setting only takes effect when the "Spawn Type" setting is set to "4". // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.0 (OFF) - // Maximum: 99999.0 (Farthest) + // Separate ranges with commas (","). // -- - // Keywords: - // "disabled"/"false"/"off"/"no" - 0.0 range - // "farthest" - 99999.0 range - "Close Areas Only" "0.0" - - // Use this ability in conjunction with other abilities. - // Note: Only use this when "Spawn Type" is set to "4" for the Mutant Tank. - // Note: This setting does not affect human-controlled Mutant Tanks unless the "Human Ability" setting is set to "2". - // Note: This setting can be overridden for specific players. + // Ranges limit: 10 + // Character limit for each range: 9 // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Combo Ability" "0" - - // Allow human-controlled Mutant Tanks to use this ability. - // Note: This setting can be overridden for specific players. + // Minimum value for each range: 0.0 (OFF) + // Maximum value for each range: 99999.0 (Farthest) // -- - // 0: OFF - // 1: ON, players can use buttons to activate abilities. - // 2: ON, abilities will activate automatically. - "Human Ability" "0" + // 1st number = Range of the first ability. + // 2nd number = Range of the second ability. + // 3rd number = Range of the third ability. + // 4th number = Range of the fourth ability. + // 5th number = Range of the fifth ability. + // 6th number = Range of the sixth ability. + // 7th number = Range of the seventh ability. + // 8th number = Range of the eighth ability. + // 9th number = Range of the ninth ability. + // 10th number = Range of the tenth ability. + "Combo Range" "0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0" - // Determines how many times human-controlled Mutant Tanks can use their abilities in one life. + // The chance to trigger each ability in the combination when the Mutant Tank is within range of its target. + // Note: This setting only takes effect when the "Spawn Type" setting is set to "4". // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 - // Maximum: 99999 + // Separate chances with commas (","). // -- - // Keywords: - // "none"/"off" - 0 ammo - // "infinite" - 99999 ammo - "Human Ammo" "5" - - // Human-controlled Mutant Tanks must wait this long before using their abilities again. - // Note: This setting can be overridden for specific players. + // Chances limit: 10 + // Character limit for each chance: 6 // -- - // Minimum: 0 (OFF) - // Maximum: 99999 (Longest) + // Minimum value for each chance: 0.0 (No chance) + // Maximum value for each chance: 100.0 (Highest chance) // -- - // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Human Cooldown" "0" + // 1st number = Chance of the first ability. + // 2nd number = Chance of the second ability. + // 3rd number = Chance of the third ability. + // 4th number = Chance of the fourth ability. + // 5th number = Chance of the fifth ability. + // 6th number = Chance of the sixth ability. + // 7th number = Chance of the seventh ability. + // 8th number = Chance of the eighth ability. + // 9th number = Chance of the ninth ability. + // 10th number = Chance of the tenth ability. + "Combo Range Chance" "0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0" - // The Mutant Tank's ability effects last this long. - // Note: This setting does not affect human-controlled Mutant Tanks unless the "Human Mode" setting is set to "0". + // The cooldown of each ability in the combination when the Mutant Tank is within range of its target. + // Note: This setting only takes effect when the "Spawn Type" setting is set to "4". // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 - // Maximum: 99999 + // Separate cooldowns with commas (","). // -- - // Keywords: - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Human Duration" "5" + // Cooldowns limit: 10 + // Character limit for each cooldown: 6 + // -- + // Minimum value for each cooldown: 0 (OFF) + // Maximum value for each cooldown: 99999 (Longest) + // -- + // 1st number = Cooldown of the first ability. + // 2nd number = Cooldown of the second ability. + // 3rd number = Cooldown of the third ability. + // 4th number = Cooldown of the fourth ability. + // 5th number = Cooldown of the fifth ability. + // 6th number = Cooldown of the sixth ability. + // 7th number = Cooldown of the seventh ability. + // 8th number = Cooldown of the eighth ability. + // 9th number = Cooldown of the ninth ability. + // 10th number = Cooldown of the tenth ability. + "Combo Range Cooldown" "0,0,0,0,0,0,0,0,0,0" - // The mode of how human-controlled Mutant Tanks activate their abilities. + // The chance to trigger each ability in the combination when the Mutant Tank throws/breaks a rock. + // Note: This setting only takes effect when the "Spawn Type" setting is set to "4". // Note: This setting can be overridden for specific players. // -- - // 0: Press buttons to activate corresponding abilities. Cooldown starts after ability is activated. - // 1: Hold down buttons to keep corresponding abilities activated. Cooldown starts after the player lets go of the buttons. - "Human Mode" "1" + // Separate chances with commas (","). + // -- + // Chances limit: 10 + // Character limit for each chance: 6 + // -- + // Minimum value for each chance: 0.0 (No chance) + // Maximum value for each chance: 100.0 (Highest chance) + // -- + // 1st number = Chance of the first ability. + // 2nd number = Chance of the second ability. + // 3rd number = Chance of the third ability. + // 4th number = Chance of the fourth ability. + // 5th number = Chance of the fifth ability. + // 6th number = Chance of the sixth ability. + // 7th number = Chance of the seventh ability. + // 8th number = Chance of the eighth ability. + // 9th number = Chance of the ninth ability. + // 10th number = Chance of the tenth ability. + "Combo Rock Chance" "0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0" - // The ability can only activate in open areas. - // Note: Do not change this setting if you are unsure of how it works. + // The cooldown of each ability in the combination when the Mutant Tank throws/breaks a rock. + // Note: This setting only takes effect when the "Spawn Type" setting is set to "4". // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.0 (OFF) - // Maximum: 99999.0 (Farthest) + // Separate cooldowns with commas (","). // -- - // Keywords: - // "disabled"/"false"/"off"/"no" - 0.0 range - // "farthest" - 99999.0 range - "Open Areas Only" "0.0" + // Cooldowns limit: 10 + // Character limit for each cooldown: 6 + // -- + // Minimum value for each cooldown: 0 (OFF) + // Maximum value for each cooldown: 99999 (Longest) + // -- + // 1st number = Cooldown of the first ability. + // 2nd number = Cooldown of the second ability. + // 3rd number = Cooldown of the third ability. + // 4th number = Cooldown of the fourth ability. + // 5th number = Cooldown of the fifth ability. + // 6th number = Cooldown of the sixth ability. + // 7th number = Cooldown of the seventh ability. + // 8th number = Cooldown of the eighth ability. + // 9th number = Cooldown of the ninth ability. + // 10th number = Cooldown of the tenth ability. + "Combo Rock Cooldown" "0,0,0,0,0,0,0,0,0,0" - // The ability is only effective toward human survivors. + // The set of abilities to combine. + // Note: This setting only takes effect when the "Spawn Type" setting is set to "4". + // Note: Make sure that the abilities that the Mutant Tank will combine are set up properly. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 - // Maximum: 32 + // Separate abilities with commas (","). // -- - // 0: OFF - // 1-32: ON, the number of human survivors required to be present for this ability to be effective. - "Requires Humans" "0" + // Character limit: 320 (including commas) + // Abilities limit: 10 + // Character limit for each ability: 32 + // -- + // Example: "fast,slow" + // Example: "Ghost Ability,WarpAbility" + // Example: "fire,Pyro_Ability,Fast Ability" + "Combo Set" "" - // Enable this ability. + // The speed of each ability in the combination. + // Note: This setting only takes effect when the "Spawn Type" setting is set to "4". // Note: This setting can be overridden for specific players. // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Ability Enabled" "0" + // Separate speeds with commas (","). + // -- + // Speeds limit: 10 + // Character limit for each speed: 9 + // -- + // Minimum value for each speed: 0.0 (OFF) + // Maximum value for each speed: 99999.0 (Fastest) + // -- + // 1st number = Speed of the first ability. + // 2nd number = Speed of the second ability. + // 3rd number = Speed of the third ability. + // 4th number = Speed of the fourth ability. + // 5th number = Speed of the fifth ability. + // 6th number = Speed of the sixth ability. + // 7th number = Speed of the seventh ability. + // 8th number = Speed of the eighth ability. + // 9th number = Speed of the ninth ability. + // 10th number = Speed of the tenth ability. + "Combo Speed" "0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0" - // Display a message whenever the ability activates/deactivates. + // The chance for each type of abilities to be combined. + // Note: This setting only takes effect when the "Spawn Type" setting is set to "4". // Note: This setting can be overridden for specific players. // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Ability Message" "0" + // Separate chances with commas (","). + // -- + // Chances limit: 6 + // Character limit for each chance: 6 + // -- + // Minimum value for each chance: 0.0 (No chance) + // Maximum value for each chance: 100.0 (Highest chance) + // -- + // 1st number = Chance to combine main/range abilities. + // 2nd number = Chance to combine hit abilities. + // 3rd number = Chance to combine rock throw abilities. + // 4th number = Chance to combine rock break abilities. + // 5th number = Chance to combine post-spawn abilities. + // 6th number = Chance to combine upon-death abilities. + "Combo Type Chance" "0.0,0.0,0.0,0.0,0.0,0.0" - // Check line-of-sight when the Mutant Tank uses its abilities. + "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" + { + // Note: Override any of the settings in the "Combo" section for each special infected here. + + // Example + "Combo Chance" "0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0" + "Combo Cooldown" "0,0,0,0,0,0,0,0,0,0" + "Combo Damage" "0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0" + "Combo Death Chance" "0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0" + "Combo Death Range" "0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0" + "Combo Delay" "0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0" + "Combo Duration" "0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0" + "Combo Interval" "0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0" + "Combo Radius" "0.0;0.0,0.0;0.0,0.0;0.0,0.0;0.0,0.0;0.0,0.0;0.0,0.0;0.0,0.0;0.0,0.0;0.0,0.0;0.0" + "Combo Range" "0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0" + "Combo Range Chance" "0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0" + "Combo Range Cooldown" "0,0,0,0,0,0,0,0,0,0" + "Combo Rock Chance" "0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0" + "Combo Rock Cooldown" "0,0,0,0,0,0,0,0,0,0" + "Combo Set" "" + "Combo Speed" "0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0" + "Combo Type Chance" "0.0,0.0,0.0,0.0,0.0,0.0" + } + } + "Random" + { + // The Mutant Tank can be used by other Mutant Tanks who spawn with the Randomization mode feature. + // Note: Do not change this setting if you are unsure of how it works. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 - // Maximum: 5 - // -- - // 0: OFF - // 1: Check if there is a solid object between the Mutant Tank and survivors. - // 2: Option 1 + Check if the Mutant Tank is looking toward the survivors. - // 3: Option 1 + Check if the Mutant Tank is looking away from the survivors. - // 4: Option 1 + Check if the survivors are looking toward the Mutant Tank. - // 5: Option 1 + Check if the survivors are looking away from the Mutant Tank. - "Ability Sight" "0" + // -1/"ignore"/"exclude"/"filter"/"remove": Let the setting with the same name from each player-controlled Mutant Tank's "Random" section decide. + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Random Tank" "1" - // The Mutant Tank has this many chances out of 100.0% to trigger the ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // How long until the Mutant Tank stops randomizing into different types. + // Note: This setting only takes effect when the "Spawn Type" setting is set to "2". // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.0 (No chance) - // Maximum: 100.0 (Highest chance) + // Minimum: 0.1 + // Maximum: 99999.0 // -- // Keywords: - // "never" - 0% chance - // "sometimes"/"unlikely"/"seldom" - 33.3% chance - // "maybe" - 50% chance - // "often"/"likely"/"frequently" - 66.6% chance - // "always" - 100% chance - "Cloud Chance" "33.3" + // "milli"/"millisecond" - 0.1 seconds + // "second" - 1 second + // "minute" - 1 minute + // "forever" - 99999 seconds + "Random Duration" "99999.0" - // The cooldown for the Mutant Tank's ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // The Mutant Tank switches to a random type every time this many seconds passes. + // Note: This setting only takes effect when the "Spawn Type" setting is set to "2". // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 (OFF) - // Maximum: 99999 (Longest) + // Minimum: 0.1 + // Maximum: 99999.0 // -- // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds + // "milli"/"millisecond" - 0.1 seconds // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Cloud Cooldown" "0" + "Random Interval" "5.0" - // The Mutant Tank's clouds do this much damage. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" + { + // Note: Override any of the settings in the "Random" section for each special infected here. + + // The Mutant Special Infected can be used by other Mutant Special Infected who spawn with the Randomization mode feature. + // Note: Do not change this setting if you are unsure of how it works. + // Note: This setting can be overridden for specific players. + // -- + // -1/"ignore"/"exclude"/"filter"/"remove": Let the setting with the same name from each player-controlled Mutant Special Infected's "Random" section decide. + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Random Special" "1" + + // Example + "Random Special" "1" + "Random Duration" "99999.0" + "Random Interval" "5.0" + } + } + "Transform" + { + // The Mutant Tank is able to transform again after this many seconds passes. + // Note: This setting only takes effect when the "Spawn Type" setting is set to "3". // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.0 (OFF) + // Minimum: 0.1 // Maximum: 99999.0 // -- // Keywords: - // "weakest" - 1.0 damage - // "strongest" - 99999.0 damage - "Cloud Damage" "5.0" + // "milli"/"millisecond" - 0.1 seconds + // "second" - 1 second + // "minute" - 1 minute + // "forever" - 99999 seconds + "Transform Delay" "10.0" - // The Mutant Tank's ability effects last this long. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // The Mutant Tank's transformations last this long. + // Note: This setting only takes effect when the "Spawn Type" setting is set to "3". // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 - // Maximum: 99999 + // Minimum: 0.1 + // Maximum: 99999.0 // -- // Keywords: + // "milli"/"millisecond" - 0.1 seconds // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Cloud Duration" "0" + "Transform Duration" "10.0" + + // The types that the Mutant Tank can transform into. + // Note: This setting only takes effect when the "Spawn Type" setting is set to "3". + // Note: This setting can be overridden for specific players. + // -- + // Separate game modes with commas (","). + // -- + // Character limit: 50 (including commas) + // Types limit: 10 + // Character limit for each type: 5 + // -- + // Example: "1,35,26,4" + // Example: "4,9,49,94,449,499" + // Example: "97,98,99,100,101,102,103,104,105,106" + // -- + // Minimum: 1 + // Maximum: 500 + "Transform Types" "1,2,3,4,5,6,7,8,9,10" "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" { - // Note: Override any of the settings in the "Cloud Ability" section for each special infected here. + // Note: Override any of the settings in the "Transform" section for each special infected here. // Example - "Access Flags" "" - "Immunity Flags" "" - "Close Areas Only" "0.0" - "Combo Ability" "0" - "Human Ability" "0" - "Human Ammo" "5" - "Human Cooldown" "0" - "Human Duration" "5" - "Human Mode" "1" - "Open Areas Only" "0.0" - "Requires Humans" "0" - "Ability Enabled" "0" - "Ability Message" "0" - "Ability Sight" "0" - "Cloud Chance" "33.3" - "Cloud Cooldown" "0" - "Cloud Damage" "5.0" - "Cloud Duration" "0" + "Transform Delay" "10.0" + "Transform Duration" "10.0" + "Transform Types" "1,2,3,4,5,6,7,8,9,10" } } - } -} -``` -
- -##### Drop Ability -
- Click to expand! - -``` -"Mutant Tanks" -{ - "Tank #1" - { - // The Mutant Tank drops weapons upon death. - // Requires "mt_abilities.smx" to be compiled with "mt_drop.sp" to work. - "Drop Ability" + "Props" { - // Admins with one or more of these access flags have access to this ability. + // Props that the Mutant Tank can spawn with. // Note: This setting can be overridden for specific players. // -- - // Empty: No access flags have access. - // Not empty: These access flags have access. - "Access Flags" "" + // Add up numbers together for different results. + // -- + // Minimum: 0 + // Maximum: 511 + // -- + // 0: OFF + // 1: Attach a blur effect only. + // 2: Attach lights only. + // 4: Attach oxygen tanks only. + // 8: Attach flames to oxygen tanks. + // 16: Attach rocks only. + // 32: Attach tires only. + // 64: Attach a propane tank only. + // 128: Attach a flashlight only. + // 256: Attach a crown only. + "Props Attached" "510" // Default is "462" on Left 4 Dead 1. - // The ability can only activate in close areas. - // Note: Do not change this setting if you are unsure of how it works. + // Each prop has this many chances out of 100.0% to appear when the Mutant Tank appears. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.0 (OFF) - // Maximum: 99999.0 (Farthest) + // Separate chances with commas (","). // -- - // Keywords: - // "disabled"/"false"/"off"/"no" - 0.0 range - // "farthest" - 99999.0 range - "Close Areas Only" "0.0" + // Chances limit: 9 + // Character limit for each chance: 6 + // -- + // Minimum value for each chance: 0.0 (No chance) + // Maximum value for each chance: 100.0 (Highest chance) + // -- + // 1st number = Chance for a blur effect to appear. + // 2nd number = Chance for lights to appear. + // 3rd number = Chance for oxygen tanks to appear. + // 4th number = Chance for oxygen tank flames to appear. + // 5th number = Chance for rocks to appear. + // 6th number = Chance for tires to appear. + // 7th number = Chance for a propane tank to appear. + // 8th number = Chance for a flashlight to appear. + // 9th number = Chance for a crown to appear. + "Props Chance" "33.3,33.3,33.3,33.3,33.3,33.3,33.3,33.3,33.3" - // Use this ability in conjunction with other abilities. - // Note: Only use this when "Spawn Type" is set to "4" for the Mutant Tank. - // Note: This setting does not affect human-controlled Mutant Tanks unless the "Human Ability" setting is set to "2". + // These are the RGBA values of the Mutant Tank's light prop's color. + // Note: The lights will be found on the Tank's mouth and back of hands. + // Note: Any value less than "0" will output a random color. // Note: This setting can be overridden for specific players. // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Combo Ability" "0" + // 1st number = Red + // 2nd number = Green + // 3rd number = Blue + // 4th number = Alpha + "Light Color" "255,255,255,255" - // Allow human-controlled Mutant Tanks to use this ability. + // These are the RGBA values of the Mutant Tank's oxygen tank prop's color. + // Note: The oxygen tanks will be found on both outer sides of the Tank's legs. + // Note: Any value less than "0" will output a random color. // Note: This setting can be overridden for specific players. // -- - // 0: OFF - // 1: ON, players can use buttons to activate abilities. - // 2: ON, abilities will activate automatically. - "Human Ability" "0" + // 1st number = Red + // 2nd number = Green + // 3rd number = Blue + // 4th number = Alpha + // -- + // Keywords: + // "rainbow" - cycle through colors constantly. + "Oxygen Tank Color" "255,255,255,255" - // The ability can only activate in open areas. - // Note: Do not change this setting if you are unsure of how it works. + // These are the RGBA values of the Mutant Tank's oxygen tank prop's flame's color. + // Note: The flames will be found under the oxygen tanks. + // Note: Any value less than "0" will output a random color. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.0 (OFF) - // Maximum: 99999.0 (Farthest) + // 1st number = Red + // 2nd number = Green + // 3rd number = Blue + // 4th number = Alpha // -- // Keywords: - // "disabled"/"false"/"off"/"no" - 0.0 range - // "farthest" - 99999.0 range - "Open Areas Only" "0.0" + // "rainbow" - cycle through colors constantly. + "Flame Color" "255,255,255,255" - // The ability is only effective toward human survivors. + // These are the RGBA values of the Mutant Tank's rock prop's color. + // Note: The rocks will be found all over both of the Tank's arms in random angles. + // Note: Any value less than "0" will output a random color. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 - // Maximum: 32 + // 1st number = Red + // 2nd number = Green + // 3rd number = Blue + // 4th number = Alpha // -- - // 0: OFF - // 1-32: ON, the number of human survivors required to be present for this ability to be effective. - "Requires Humans" "0" + // Keywords: + // "rainbow" - cycle through colors constantly. + "Rock Color" "255,255,255,255" + //"Rock Color" "all_tank_rocks" // Alternative (See "Colors" section) - // Enable this ability. + // This is the model of the Mutant Tank's rocks, which includes the rocks attached to it and the ones that it throws/spawns. // Note: This setting can be overridden for specific players. // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Ability Enabled" "0" + // 0: OFF, use default model. + // 1: ON, use tree chunk model. + // 2: ON, switch between both. + "Rock Model" "2" - // Display a message whenever the ability activates/deactivates. + // These are the RGBA values of the Mutant Tank's tire prop's color. + // Note: The tires will be found on both outer sides of the Tank's legs. + // Note: Any value less than "0" will output a random color. // Note: This setting can be overridden for specific players. // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Ability Message" "0" + // 1st number = Red + // 2nd number = Green + // 3rd number = Blue + // 4th number = Alpha + // -- + // Keywords: + // "rainbow" - cycle through colors constantly. + "Tire Color" "255,255,255,255" - // The Mutant Tank has this many chances out of 100.0% to trigger the ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // These are the RGBA values of the Mutant Tank's propane tank prop's color. + // Note: The propane tank will be found on the Tank's head acting like a helmet. + // Note: Any value less than "0" will output a random color. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.0 (No chance) - // Maximum: 100.0 (Highest chance) + // 1st number = Red + // 2nd number = Green + // 3rd number = Blue + // 4th number = Alpha // -- // Keywords: - // "never" - 0% chance - // "sometimes"/"unlikely"/"seldom" - 33.3% chance - // "maybe" - 50% chance - // "often"/"likely"/"frequently" - 66.6% chance - // "always" - 100% chance - "Drop Chance" "33.3" + // "rainbow" - cycle through colors constantly. + "Propane Tank Color" "255,255,255,255" - // The Mutant Tank has this many chances out of 100.0% to drop guns with a full clip. + // These are the RGBA values of the Mutant Tank's flashlight's color. + // Note: The flashlight will be found above the Tank shining down wherever the Tank is standing. + // Note: Any value less than "0" will output a random color. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.0 (No chance) - // Maximum: 100.0 (Highest chance) + // 1st number = Red + // 2nd number = Green + // 3rd number = Blue + // 4th number = Alpha // -- // Keywords: - // "never" - 0% chance - // "sometimes"/"unlikely"/"seldom" - 33.3% chance - // "maybe" - 50% chance - // "often"/"likely"/"frequently" - 66.6% chance - // "always" - 100% chance - "Drop Clip Chance" "33.3" + // "rainbow" - cycle through colors constantly. + "Flashlight Color" "255,255,255,255" - // The Mutant Tank drops this many weapons upon death. + // These are the RGBA values of the Mutant Tank's crown prop's color. + // Note: The crown will be found above the Tank. + // Note: Any value less than "0" will output a random color. // Note: This setting can be overridden for specific players. // -- - // Minimum: 1 - // Maximum: 32 - "Drop Count" "1" + // 1st number = Red + // 2nd number = Green + // 3rd number = Blue + // 4th number = Alpha + "Crown Color" "255,255,255,255" - // The position of the Mutant Tank's weapon. + "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" + { + // Note: Override any of the settings in the "Props" section for each special infected here. + + // Example + "Rock Color" "255,255,255,255" + "Rock Model" "2" + } + } + "Particles" + { + // The particle effects for the Mutant Tank's body. // Note: This setting can be overridden for specific players. // -- // Add up numbers together for different results. // -- // Minimum: 0 - // Maximum: 3 + // Maximum: 127 // -- - // 0 OR 3: Pick randomly between left and right hands. - // 1: Right hand. - // 2: Left hand. - "Drop Hand Position" "0" + // 0: OFF + // 1: Blood Explosion + // 2: Electric Jolt + // 4: Fire Trail + // 8: Ice Steam + // 16: Meteor Smoke + // 32: Smoker Cloud + // 64: Acid Trail (Only available in Left 4 Dead 2.) + "Body Effects" "0" - // The mode of the Mutant Tank's drop ability. + // Each particle effect has this many chances out of 100.0% to appear on the Mutant Tank's body. // Note: This setting can be overridden for specific players. // -- - // 0: Both - // 1: Guns only. - // 2: Melee weapons only. (Only available in Left 4 Dead 2.) - "Drop Mode" "0" + // Separate chances with commas (","). + // -- + // Chances limit: 7 + // Character limit for each chance: 6 + // -- + // Minimum value for each chance: 0.0 (No chance) + // Maximum value for each chance: 100.0 (Highest chance) + // -- + // 1st number = Chance for blood explosion to appear. + // 2nd number = Chance for electric jolt to appear. + // 3rd number = Chance for fire trail to appear. + // 4th number = Chance for ice steam to appear. + // 5th number = Chance for meteor smoke to appear. + // 6th number = Chance for smoker cloud to appear. + // 7th number = Chance for acid trail to appear. + "Body Chance" "100.0,100.0,100.0,100.0,100.0,100.0,100.0" - // The console name of the Mutant Tank's weapon. - // Note: Leave this empty if you want a random weapon to be chosen. + // The particle effects for the Mutant Tank's rocks. // Note: This setting can be overridden for specific players. // -- - // Weapon limit: 1 - // Character limit: 40 + // Add up numbers together for different results. // -- - // Example: "weapon_rifle_m60" - // Example: "fireaxe" - // Example: "autoshotgun" - "Drop Weapon Name" "" + // Minimum: 0 + // Maximum: 15 + // -- + // 0: OFF + // 1: Blood Explosion + // 2: Electric Jolt + // 4: Fire Trail + // 8: Acid Trail (Only available in Left 4 Dead 2.) + "Rock Effects" "0" - // The Mutant Tank's weapon size is multiplied by this value. - // Note: Default weapon size (1.5) x Drop weapon scale + // Each particle effect has this many chances out of 100.0% to appear on the Mutant Tank's rocks. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.1 - // Maximum: 2.0 - "Drop Weapon Scale" "1.0" + // Separate chances with commas (","). + // -- + // Chances limit: 4 + // Character limit for each chance: 6 + // -- + // Minimum value for each chance: 0.0 (No chance) + // Maximum value for each chance: 100.0 (Highest chance) + // -- + // 1st number = Chance for blood explosion to appear. + // 2nd number = Chance for electric jolt to appear. + // 3rd number = Chance for fire trail to appear. + // 4th number = Chance for acid trail to appear. + "Rock Chance" "100.0,100.0,100.0,100.0" "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" { - // Note: Override any of the settings in the "Drop Ability" section for each special infected here. + // Note: Override any of the settings in the "Particles" section for each special infected here. // Example - "Access Flags" "" - "Close Areas Only" "0.0" - "Combo Ability" "0" - "Human Ability" "0" - "Open Areas Only" "0.0" - "Requires Humans" "0" - "Ability Enabled" "0" - "Ability Message" "0" - "Drop Chance" "33.3" - "Drop Clip Chance" "33.3" - "Drop Count" "1" - "Drop Mode" "0" - "Drop Weapon Name" "" + "Body Effects" "0" + "Body Chance" "100.0,100.0,100.0,100.0,100.0,100.0,100.0" + "Rock Effects" "0" + "Rock Chance" "100.0,100.0,100.0,100.0" } - } - } -} -``` -
- -##### Drug Ability -
- Click to expand! + "Mob" // Syntax: "Mob"/"Infected"/"inf" + { + // Note: Override any of the settings in the "Particles" section for each mob infected here. -``` -"Mutant Tanks" -{ - "Tank #1" - { - // The Mutant Tank drugs survivors. - // "Ability Enabled" - When a survivor is within range of the Mutant Tank, the survivor is drugged. - // - "Drug Range" - // - "Drug Range Chance" - // - "Drug Range Cooldown" - // "Drug Hit" - When a survivor is hit by the Mutant Tank's claw or rock, or a survivor hits the Mutant Tank with a melee weapon, the survivor is drugged. - // - "Drug Chance" - // - "Drug Cooldown" - // - "Drug Hit Mode" - // Requires "mt_abilities.smx" to be compiled with "mt_drug.sp" to work. - "Drug Ability" + // Example + "Body Effects" "0" + "Body Chance" "100.0,100.0,100.0,100.0,100.0,100.0,100.0" + } + } + "Health" { - // Admins with one or more of these access flags have access to this ability. + // Base health given to all Mutant Tanks. + // Note: Tank's health limit on any difficulty is 1,000,000. + // Note: Disable this setting if it conflicts with other plugins. + // Note: Depending on the value of the "Multiply Health" setting, the Mutant Tank's health will be multiplied based on player count. + // Note: This setting overrides the same setting under the "Plugin Settings/Health" section. // Note: This setting can be overridden for specific players. // -- - // Empty: No access flags have access. - // Not empty: These access flags have access. - "Access Flags" "" + // Minimum: 0 (OFF) + // Maximum: 1000000 + "Base Health" "0" - // Admins with one or more of these immunity flags are immune to this ability's effects. - // Note: If the Mutant Tank has one or more of these immunity flags or has the same immunity flags as the survivor victim, the immunity is cancelled. + // The characters used to represent the armored health bar of the Mutant Tank. + // Note: This setting only takes effect when the "Display Health" setting is enabled. + // Note: This setting overrides the same setting under the "Plugin Settings/Health" section. // Note: This setting can be overridden for specific players. // -- - // Empty: No immunity flags are immune. - // Not empty: These immunity flags are immune. - "Immunity Flags" "" + // Separate characters with commas (","). + // -- + // Character limit: 2 + // Character limit for each character: 1 + // -- + // 1st character = Armor indicator + // 2nd character = Damage indicator + "Armor Characters" "" - // The ability can only activate in close areas. - // Note: Do not change this setting if you are unsure of how it works. + // This percentage of the Mutant Tank's health is considered as armored health. + // Note: This setting overrides the same setting under the "Plugin Settings/Health" section. // Note: This setting can be overridden for specific players. // -- // Minimum: 0.0 (OFF) - // Maximum: 99999.0 (Farthest) - // -- - // Keywords: - // "disabled"/"false"/"off"/"no" - 0.0 range - // "farthest" - 99999.0 range - "Close Areas Only" "0.0" + // Maximum: 1.0 (Full) + "Armor Percentage" "0.0" - // Use this ability in conjunction with other abilities. - // Note: Only use this when "Spawn Type" is set to "4" for the Mutant Tank. - // Note: This setting does not affect human-controlled Mutant Tanks unless the "Human Ability" setting is set to "2". + // The Mutant Tank's armor blocks this percentage of incoming damage. + // Note: This setting overrides the same setting under the "Plugin Settings/Health" section. // Note: This setting can be overridden for specific players. // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Combo Ability" "0" + // Minimum: 0.0 (God mode) + // Maximum: 1.0 (None) + "Armor Resistance" "0.0" - // Allow human-controlled Mutant Tanks to use this ability. + // The characters used to represent the shield health bar of Mutant Tanks. + // Note: This setting only takes effect when the "Display Health" setting is enabled. + // Note: This setting overrides the same setting under the "Plugin Settings/Health" section. // Note: This setting can be overridden for specific players. // -- - // 0: OFF - // 1: ON, players can use buttons to activate abilities. - // 2: ON, abilities will activate automatically. - "Human Ability" "0" + // Separate characters with commas (","). + // -- + // Character limit: 2 + // Character limit for each character: 1 + // -- + // 1st character = Shield indicator + // 2nd character = Damage indicator + "Shield Characters" ">,-" - // Determines how many times human-controlled Mutant Tanks can use their abilities in one life. + // This percentage of every Mutant Tank's health is considered as shield health. + // Note: This setting overrides the same setting under the "Plugin Settings/Health" section. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 - // Maximum: 99999 + // Minimum: 0.0 (OFF) + // Maximum: 1.0 (Full) + "Shield Percentage" "0.0" + + // Every Mutant Tank's shield regenerates this fast compared to regular or armored health. + // Note: This setting only takes effect when the "Passive Health" setting is enabled. + // Note: This setting overrides the same setting under the "Plugin Settings/Health" section. + // Note: This setting can be overridden for specific players. // -- - // Keywords: - // "none"/"off" - 0 ammo - // "infinite" - 99999 ammo - "Human Ammo" "5" + // Minimum: 0.0 (OFF) + // Maximum: 1.0 (None) + "Shield Rate" "0.5" - // Human-controlled Mutant Tanks must wait this long before using their abilities again. + // The Mutant Tank starts regenerating health passively after this many seconds passes since last taking any damage. + // Note: This setting overrides the same setting under the "Plugin Settings/Health" section. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 (OFF) - // Maximum: 99999 (Longest) + // Minimum: 0.1 + // Maximum: 99999.0 // -- // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds + // "milli"/"millisecond" - 0.1 seconds // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Human Cooldown" "0" + "Passive Delay" "0.0" - // Human-controlled Mutant Tanks must wait this long before using their range ability again. + // The amount of health the Mutant Tank can regenerate passively every X seconds. + // Note: Tank's health limit on any difficulty is 1,000,000. + // Note: Disable this setting if it conflicts with other plugins. + // Note: This setting overrides the same setting under the "Plugin Settings/Health" section. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 (OFF) - // Maximum: 99999 (Longest) + // Minimum: -1000000 + // Maximum: 1000000 // -- - // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Human Range Cooldown" "0" + // Positive numbers: Current health + Passive health + // Negative numbers: Current health - Passive health + "Passive Health" "0" - // The ability can only activate in open areas. - // Note: Do not change this setting if you are unsure of how it works. + // The Mutant Tank can regenerate health passively every time this many seconds passes. + // Note: This setting overrides the same setting under the "Plugin Settings/Health" section. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.0 (OFF) - // Maximum: 99999.0 (Farthest) + // Minimum: 0.1 + // Maximum: 99999.0 // -- // Keywords: - // "disabled"/"false"/"off"/"no" - 0.0 range - // "farthest" - 99999.0 range - "Open Areas Only" "0.0" + // "milli"/"millisecond" - 0.1 seconds + // "second" - 1 second + // "minute" - 1 minute + // "forever" - 99999 seconds + "Passive Interval" "0.0" - // The ability is only effective toward human survivors. + // Display the Mutant Tank's name and health. + // Note: This setting overrides the same setting under the "Plugin Settings/Health" section. // Note: This setting can be overridden for specific players. // -- // Minimum: 0 - // Maximum: 32 + // Maximum: 11 // -- // 0: OFF - // 1-32: ON, the number of human survivors required to be present for this ability to be effective. - "Requires Humans" "1" + // 1: ON, show name only. + // 2: ON, show health only. + // 3: ON, show health percentage only. + // 4: ON, show healthbar only. + // 5: ON, show name and health only. + // 6: ON, show name and health percentage only. + // 7: ON, show name and healthbar only. + // 8: ON, show health and healthbar only. + // 9: ON, show health percentage and healthbar only. + // 10: ON, show name, health, and healthbar. + // 11: ON, show name, health percentage, and healthbar. + "Display Health" "0" - // Enable this ability. - // Note: This setting does not affect the "Drug Hit" setting. + // Display type of the Mutant Tank's names and health. + // Note: This setting overrides the same setting under the "Plugin Settings/Health" section. // Note: This setting can be overridden for specific players. // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Ability Enabled" "0" + // 0: OFF + // 1: ON, show in hint text. + // 2: ON, show in center text. + "Display Health Type" "0" - // Show a screen fade effect when the Mutant Tank uses its abilities. - // Note: The colors will randomly change between the colors set in the "Skin Color" and "Glow Color" settings. + // Extra health given to the Mutant Tank. + // Note: Tank's health limit on any difficulty is 1,000,000. + // Note: Disable this setting if it conflicts with other plugins. + // Note: Depending on the value of the "Multiply Health" setting, the Mutant Tank's health will be multiplied based on player count. + // Note: This setting overrides the same setting under the "Plugin Settings/Health" section. // Note: This setting can be overridden for specific players. // -- - // Add up numbers together for different results. + // Minimum: -1000000 + // Maximum: 1000000 // -- - // Minimum: 0 - // Maximum: 7 + // Positive numbers: Current health + Extra health + // Negative numbers: Current health - Extra health + "Extra Health" "0" + + // The characters used to represent the health bar of the Mutant Tank. + // Note: This setting only takes effect when the "Display Health" setting is enabled. + // Note: This setting overrides the same setting under the "Plugin Settings/Health" section. + // Note: This setting can be overridden for specific players. // -- - // 0: OFF - // 1: Show effect when the Mutant Tank uses its claw/rock attack. - // 2: Show effect when the Mutant Tank is hit by a melee weapon. - // 4: Show effect when the Mutant Tank uses its range ability. + // Separate characters with commas (","). // -- - // Keywords: - // "none"/"off" - 0 - // "attack" - 1 - // "hurt" - 2 - // "attack,hurt" - 3 - // "range" - 4 - // "attack,range" - 5 - // "hurt,range" - 6 - // "attack,hurt,range" - 7 - "Ability Effect" "0" + // Character limit: 2 + // Character limit for each character: 1 + // -- + // 1st character = Health indicator + // 2nd character = Damage indicator + "Health Characters" "" - // Display a message whenever the ability activates/deactivates. + // The health of the Mutant Tank is multiplied by this value. + // Note: Health = Health x Health percentage multiplier + // Example: Health = 4000 x 2.5 = 10000 + // Note: Use the value "1.0" to disable this setting. (Health x 1.0 = Health) + // Note: This setting overrides the same setting under the "Plugin Settings/Health" section. // Note: This setting can be overridden for specific players. // -- - // Add up numbers together for different results. + // Minimum: 1.0 + // Maximum: 99999.0 + "Health Percentage Multiplier" "0.0" + + // The mode of the "Minimum Humans" setting. + // Note: This setting overrides the same setting under the "Plugin Settings/Health" section. + // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 - // Maximum: 3 + // 0: Use as a requirement and as a multiplier for multiplying the Tank's health. + // 1: Use as a requirement for multiplying the Tank's health. + "Human Multiplier Mode" "0" + + // The number of human-controlled survivors required for the "Multiply Health" setting to take effect. + // Note: This setting overrides the same setting under the "Plugin Settings/Health" section. + // Note: This setting can be overridden for specific players. // -- - // 0: OFF - // 1: Display message only when "Drug Hit" is enabled. - // 2: Display message only when "Ability Enabled" is enabled. + // Minimum: 1 + // Maximum: 32 // -- - // Keywords: - // "none"/"off" - 0 - // "hit" - 1 - // "ability" - 2 - // "both"/"all"/"hit,ability" - 3 - "Ability Message" "0" + // 1: OFF, no health multiplication. (Health * 1) + // 2-32: ON, the number of human-controlled survivors required to multiply Tank health. (Health * X) + "Minimum Humans" "0" - // Check line-of-sight when the Mutant Tank uses its abilities. + // Multiply the Mutant Tank's health. + // Note: Health multiplication only occurs when the requirement for the "Minimum Humans" setting is met. + // Note: This setting overrides the same setting under the "Plugin Settings/Health" section. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 - // Maximum: 5 - // -- - // 0: OFF - // 1: Check if there is a solid object between the Mutant Tank and survivors. - // 2: Option 1 + Check if the Mutant Tank is looking toward the survivors. - // 3: Option 1 + Check if the Mutant Tank is looking away from the survivors. - // 4: Option 1 + Check if the survivors are looking toward the Mutant Tank. - // 5: Option 1 + Check if the survivors are looking away from the Mutant Tank. - "Ability Sight" "0" + // 0: No changes to health. + // 1: Multiply original health only. + // 2: Multiply extra health only. + // 3: Multiply both. + "Multiply Health" "0" + + "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" + { + // Note: Override any of the settings in the "Health" section for each special infected here. + + // Base health given to all Mutant Boomers. + // Note: Boomer's health limit on any difficulty is 1,000,000. + // Note: Disable this setting if it conflicts with other plugins. + // Note: Depending on the value of the "Multiply Health" setting, the Mutant Boomer's health will be multiplied based on player count. + // Note: This setting overrides the same setting under the "Plugin Settings/Health" section. + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0 (OFF) + // Maximum: 1000000 + "Boomer Base Health" "0" + + // Extra health given to the Mutant Boomer. + // Note: Boomer's health limit on any difficulty is 1,000,000. + // Note: Disable this setting if it conflicts with other plugins. + // Note: Depending on the value of the "Multiply Health" setting, the Mutant Boomer's health will be multiplied based on player count. + // Note: This setting overrides the same setting under the "Plugin Settings/Health" section. + // Note: This setting can be overridden for specific players. + // -- + // Minimum: -1000000 + // Maximum: 1000000 + // -- + // Positive numbers: Current health + Extra health + // Negative numbers: Current health - Extra health + "Boomer Extra Health" "0" + + // Base health given to all Mutant Chargers. + // Note: Charger's health limit on any difficulty is 1,000,000. + // Note: Disable this setting if it conflicts with other plugins. + // Note: Depending on the value of the "Multiply Health" setting, the Mutant Charger's health will be multiplied based on player count. + // Note: This setting overrides the same setting under the "Plugin Settings/Health" section. + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0 (OFF) + // Maximum: 1000000 + "Charger Base Health" "0" + + // Extra health given to the Mutant Charger. + // Note: Charger's health limit on any difficulty is 1,000,000. + // Note: Disable this setting if it conflicts with other plugins. + // Note: Depending on the value of the "Multiply Health" setting, the Mutant Charger's health will be multiplied based on player count. + // Note: This setting overrides the same setting under the "Plugin Settings/Health" section. + // Note: This setting can be overridden for specific players. + // -- + // Minimum: -1000000 + // Maximum: 1000000 + // -- + // Positive numbers: Current health + Extra health + // Negative numbers: Current health - Extra health + "Charger Extra Health" "0" + + // Base health given to all Mutant Hunters. + // Note: Hunter's health limit on any difficulty is 1,000,000. + // Note: Disable this setting if it conflicts with other plugins. + // Note: Depending on the value of the "Multiply Health" setting, the Mutant Hunter's health will be multiplied based on player count. + // Note: This setting overrides the same setting under the "Plugin Settings/Health" section. + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0 (OFF) + // Maximum: 1000000 + "Hunter Base Health" "0" + + // Extra health given to the Mutant Hunter. + // Note: Hunter's health limit on any difficulty is 1,000,000. + // Note: Disable this setting if it conflicts with other plugins. + // Note: Depending on the value of the "Multiply Health" setting, the Mutant Hunter's health will be multiplied based on player count. + // Note: This setting overrides the same setting under the "Plugin Settings/Health" section. + // Note: This setting can be overridden for specific players. + // -- + // Minimum: -1000000 + // Maximum: 1000000 + // -- + // Positive numbers: Current health + Extra health + // Negative numbers: Current health - Extra health + "Hunter Extra Health" "0" + + // Base health given to all Mutant Jockeys. + // Note: Jockey's health limit on any difficulty is 1,000,000. + // Note: Disable this setting if it conflicts with other plugins. + // Note: Depending on the value of the "Multiply Health" setting, the Mutant Jockey's health will be multiplied based on player count. + // Note: This setting overrides the same setting under the "Plugin Settings/Health" section. + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0 (OFF) + // Maximum: 1000000 + "Jockey Base Health" "0" + + // Extra health given to the Mutant Jockey. + // Note: Jockey's health limit on any difficulty is 1,000,000. + // Note: Disable this setting if it conflicts with other plugins. + // Note: Depending on the value of the "Multiply Health" setting, the Mutant Jockey's health will be multiplied based on player count. + // Note: This setting overrides the same setting under the "Plugin Settings/Health" section. + // Note: This setting can be overridden for specific players. + // -- + // Minimum: -1000000 + // Maximum: 1000000 + // -- + // Positive numbers: Current health + Extra health + // Negative numbers: Current health - Extra health + "Jockey Extra Health" "0" - // The Mutant Tank has this many chances out of 100.0% to trigger the ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0.0 (No chance) - // Maximum: 100.0 (Highest chance) - // -- - // Keywords: - // "never" - 0% chance - // "sometimes"/"unlikely"/"seldom" - 33.3% chance - // "maybe" - 50% chance - // "often"/"likely"/"frequently" - 66.6% chance - // "always" - 100% chance - "Drug Chance" "33.3" + // Base health given to all Mutant Smokers. + // Note: Smoker's health limit on any difficulty is 1,000,000. + // Note: Disable this setting if it conflicts with other plugins. + // Note: Depending on the value of the "Multiply Health" setting, the Mutant Smoker's health will be multiplied based on player count. + // Note: This setting overrides the same setting under the "Plugin Settings/Health" section. + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0 (OFF) + // Maximum: 1000000 + "Smoker Base Health" "0" - // The cooldown for the Mutant Tank's hit ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0 (OFF) - // Maximum: 99999 (Longest) - // -- - // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Drug Cooldown" "0" + // Extra health given to the Mutant Smoker. + // Note: Smoker's health limit on any difficulty is 1,000,000. + // Note: Disable this setting if it conflicts with other plugins. + // Note: Depending on the value of the "Multiply Health" setting, the Mutant Smoker's health will be multiplied based on player count. + // Note: This setting overrides the same setting under the "Plugin Settings/Health" section. + // Note: This setting can be overridden for specific players. + // -- + // Minimum: -1000000 + // Maximum: 1000000 + // -- + // Positive numbers: Current health + Extra health + // Negative numbers: Current health - Extra health + "Smoker Extra Health" "0" - // The Mutant Tank's ability effects last this long. - // Note: This is ignored when the "Combo Ability" setting is set to "1". - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 1 - // Maximum: 99999 - // -- - // Keywords: - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Drug Duration" "5" + // Base health given to all Mutant Spitters. + // Note: Spitter's health limit on any difficulty is 1,000,000. + // Note: Disable this setting if it conflicts with other plugins. + // Note: Depending on the value of the "Multiply Health" setting, the Mutant Spitter's health will be multiplied based on player count. + // Note: This setting overrides the same setting under the "Plugin Settings/Health" section. + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0 (OFF) + // Maximum: 1000000 + "Spitter Base Health" "0" - // Enable the Mutant Tank's claw/rock attack. - // Note: This setting does not need the "Ability Enabled" setting to be set to "1". - // Note: This setting can be overridden for specific players. - // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Drug Hit" "0" + // Extra health given to the Mutant Spitter. + // Note: Spitter's health limit on any difficulty is 1,000,000. + // Note: Disable this setting if it conflicts with other plugins. + // Note: Depending on the value of the "Multiply Health" setting, the Mutant Spitter's health will be multiplied based on player count. + // Note: This setting overrides the same setting under the "Plugin Settings/Health" section. + // Note: This setting can be overridden for specific players. + // -- + // Minimum: -1000000 + // Maximum: 1000000 + // -- + // Positive numbers: Current health + Extra health + // Negative numbers: Current health - Extra health + "Spitter Extra Health" "0" - // The mode of the Mutant Tank's claw/rock attack. + // Example + "Boomer Base Health" "0" + "Charger Base Health" "0" + "Hunter Base Health" "0" + "Jockey Base Health" "0" + "Smoker Base Health" "0" + "Spitter Base Health" "0" + "Armor Characters" "" + "Armor Percentage" "0.0" + "Armor Resistance" "0.0" + "Shield Characters" "" + "Shield Percentage" "0.0" + "Shield Rate" "0.0" + "Passive Delay" "0.0" + "Passive Health" "0" + "Passive Interval" "0.0" + "Display Health" "0" + "Display Health Type" "0" + "Boomer Extra Health" "0" + "Charger Extra Health" "0" + "Hunter Extra Health" "0" + "Jockey Extra Health" "0" + "Smoker Extra Health" "0" + "Spitter Extra Health" "0" + "Health Characters" "" + "Health Percentage Multiplier" "0.0" + "Human Multiplier Mode" "0" + "Minimum Humans" "0" + "Multiply Health" "0" + } + "Mob" // Syntax: "Mob"/"Infected"/"inf" + { + "Display Health" "0" + "Display Health Type" "0" + "Health Characters" "" + } + } + "Protection" + { + // The Mutant Tank will have spawn protection for a limited time. + // Note: Do not change this setting if you are unsure of how it works. + // Note: This setting overrides the same setting under the "Plugin Settings/Protection" section. // Note: This setting can be overridden for specific players. // -- - // 0: Both - // 1: Ability activates when the Mutant Tank hits a survivor. - // 2: Ability activates when the Mutant Tank is hit by a survivor. - // -- - // Keywords: - // "both"/"all" - 0 - // "tank"/"attack" - 1 - // "survivor"/"hurt" - 2 - "Drug Hit Mode" "0" + // 0: OFF + // 1: Spawn with a temporary shield. + // 2: Spawn with temporary armor. + // 3: Both + "Spawn Protection" "0" - // The Mutant Tank drugs survivors every time this many seconds passes. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // The duration of the Mutant Tank's armor for spawn protection. + // Note: This setting overrides the same setting under the "Plugin Settings/Protection" section. // Note: This setting can be overridden for specific players. // -- // Minimum: 0.1 @@ -11408,433 +9980,403 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Drug Interval" "1.0" - - // The distance between a survivor and the Mutant Tank needed to trigger the ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 1.0 (Closest) - // Maximum: 99999.0 (Farthest) - // -- - // Keywords: - // "closest" - 1.0 range - // "farthest" - 99999.0 range - "Drug Range" "150.0" + "Armor Duration" "0.0" - // The Mutant Tank has this many chances out of 100.0% to trigger the range ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // The Mutant Tank's armor blocks this percentage of incoming damage. + // Note: This setting overrides the same setting under the "Plugin Settings/Protection" section. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.0 (No chance) - // Maximum: 100.0 (Highest chance) - // -- - // Keywords: - // "never" - 0% chance - // "sometimes"/"unlikely"/"seldom" - 33.3% chance - // "maybe" - 50% chance - // "often"/"likely"/"frequently" - 66.6% chance - // "always" - 100% chance - "Drug Range Chance" "15.0" + // Minimum: 0.0 (God mode) + // Maximum: 1.0 (None) + "Armor Resistance" "0.0" - // The cooldown for the Mutant Tank's range ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // The duration of the Mutant Tank's shield for spawn protection. + // Note: This setting overrides the same setting under the "Plugin Settings/Protection" section. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 (OFF) - // Maximum: 99999 (Longest) + // Minimum: 0.1 + // Maximum: 99999.0 // -- // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Drug Range Cooldown" "0" - - "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" - { - // Note: Override any of the settings in the "Drug Ability" section for each special infected here. - - // Example - "Access Flags" "" - "Immunity Flags" "" - "Close Areas Only" "0.0" - "Combo Ability" "0" - "Human Ability" "0" - "Human Ammo" "5" - "Human Cooldown" "0" - "Human Range Cooldown" "0" - "Open Areas Only" "0.0" - "Requires Humans" "1" - "Ability Enabled" "0" - "Ability Effect" "0" - "Ability Message" "0" - "Ability Sight" "0" - "Drug Chance" "33.3" - "Drug Cooldown" "0" - "Drug Duration" "5" - "Drug Hit" "0" - "Drug Hit Mode" "0" - "Drug Interval" "1.0" - "Drug Range" "150.0" - "Drug Range Chance" "15.0" - "Drug Range Cooldown" "0" - } - } - } -} -``` -
- -##### Drunk Ability -
- Click to expand! - -``` -"Mutant Tanks" -{ - "Tank #1" - { - // The Mutant Tank makes survivors drunk. - // "Ability Enabled" - When a survivor is within range of the Mutant Tank, the survivor gets drunk. - // - "Drunk Range" - // - "Drunk Range Chance" - // - "Drunk Range Cooldown" - // "Drunk Hit" - When a survivor is hit by the Mutant Tank's claw or rock, or a survivor hits the Mutant Tank with a melee weapon, the survivor gets drunk. - // - "Drunk Chance" - // - "Drunk Cooldown" - // - "Drunk Hit Mode" - // Requires "mt_abilities.smx" to be compiled with "mt_drunk.sp" to work. - "Drunk Ability" - { - // Admins with one or more of these access flags have access to this ability. - // Note: This setting can be overridden for specific players. - // -- - // Empty: No access flags have access. - // Not empty: These access flags have access. - "Access Flags" "" + // "milli"/"millisecond" - 0.1 seconds + // "second" - 1 second + // "minute" - 1 minute + // "forever" - 99999 seconds + "Shield Duration" "0.0" - // Admins with one or more of these immunity flags are immune to this ability's effects. - // Note: If the Mutant Tank has one or more of these immunity flags or has the same immunity flags as the survivor victim, the immunity is cancelled. + // The Mutant Tank's shield blocks this percentage of incoming damage. + // Note: This setting overrides the same setting under the "Plugin Settings/Protection" section. // Note: This setting can be overridden for specific players. // -- - // Empty: No immunity flags are immune. - // Not empty: These immunity flags are immune. - "Immunity Flags" "" + // Minimum: 0.0 (God mode) + // Maximum: 1.0 (None) + "Shield Resistance" "0.0" - // The ability can only activate in close areas. - // Note: Do not change this setting if you are unsure of how it works. + "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" + { + // Note: Override any of the settings in the "Protection" section for each special infected here. + + // Example + "Spawn Protection" "0" + "Armor Duration" "0.0" + "Armor Resistance" "0.0" + "Shield Duration" "0.0" + "Shield Resistance" "0.0" + } + } + "Enhancements" + { + // The Mutant Tank can only attack every time this many seconds passes. + // Note: This setting overrides the same setting under the "Plugin Settings/Enhancements" section. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.0 (OFF) - // Maximum: 99999.0 (Farthest) + // OFF: 0.0 + // Minimum: 0.1 + // Maximum: 99999.0 // -- // Keywords: - // "disabled"/"false"/"off"/"no" - 0.0 range - // "farthest" - 99999.0 range - "Close Areas Only" "0.0" + // "milli"/"millisecond" - 0.1 seconds + // "second" - 1 second + // "minute" - 1 minute + // "forever" - 99999 seconds + "Attack Interval" "0.0" - // Use this ability in conjunction with other abilities. - // Note: Only use this when "Spawn Type" is set to "4" for the Mutant Tank. - // Note: This setting does not affect human-controlled Mutant Tanks unless the "Human Ability" setting is set to "2". + // The Mutant Tank will automatically bunny hop when jumping. + // Note: This setting overrides the same setting under the "Plugin Settings/Enhancements" section. // Note: This setting can be overridden for specific players. // -- // 0/"disabled"/"false"/"off"/"no": OFF // 1/"enabled"/"true"/"on"/"yes": ON - "Combo Ability" "0" - - // Allow human-controlled Mutant Tanks to use this ability. - // Note: This setting can be overridden for specific players. - // -- - // 0: OFF - // 1: ON, players can use buttons to activate abilities. - // 2: ON, abilities will activate automatically. - "Human Ability" "0" + "Bunny Hop" "0" - // Determines how many times human-controlled Mutant Tanks can use their abilities in one life. + // The Mutant Tank's claw attacks do this much damage. + // Note: This setting overrides the same setting under the "Plugin Settings/Enhancements" section. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 - // Maximum: 99999 + // OFF: -1.0 + // Minimum: 0.0 + // Maximum: 99999.0 // -- // Keywords: - // "none"/"off" - 0 ammo - // "infinite" - 99999 ammo - "Human Ammo" "5" + // "nodmg"/"friendly"/"harmless" - 0.0 damage + // "weakest" - 1.0 damage + // "strongest" - 99999.0 damage + "Claw Damage" "-1.0" - // Human-controlled Mutant Tanks must wait this long before using their abilities again. + // The Mutant Tank's footsteps cause screen shakes for nearby survivors. + // Note: Both games already do this by default. + // Note: This setting overrides the same setting under the "Plugin Settings/Enhancements" section. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 (OFF) - // Maximum: 99999 (Longest) - // -- - // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Human Cooldown" "0" + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Footstep Shake" "0" - // Human-controlled Mutant Tanks must wait this long before using their range ability again. + // The Mutant Tank's ground pounds hit all survivors within range. + // Note: Both games already do this by default in Survival modes. + // Note: This setting overrides the same setting under the "Plugin Settings/Enhancements" section. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 (OFF) - // Maximum: 99999 (Longest) - // -- - // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Human Range Cooldown" "0" + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Ground Pound" "0" - // The ability can only activate in open areas. - // Note: Do not change this setting if you are unsure of how it works. + // The Mutant Tank's hittables do this much damage. + // Note: This setting overrides the same setting under the "Plugin Settings/Enhancements" section. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.0 (OFF) - // Maximum: 99999.0 (Farthest) + // OFF: -1.0 + // Minimum: 0.0 + // Maximum: 99999.0 // -- // Keywords: - // "disabled"/"false"/"off"/"no" - 0.0 range - // "farthest" - 99999.0 range - "Open Areas Only" "0.0" + // "nodmg"/"friendly"/"harmless" - 0.0 damage + // "weakest" - 1.0 damage + // "strongest" - 99999.0 damage + "Hittable Damage" "-1.0" - // The ability is only effective toward human survivors. + // The damage received by incapacitated survivors from the Mutant Tank is multiplied by this value. + // Note: Damage = Damage x Incap damage multiplier + // Example: Damage = 30.0 x 1.5 = 45.0 + // Note: Use the value "1.0" to disable this setting. (Damage x 1.0 = Damage) + // Note: This setting overrides the same setting under the "Plugin Settings/Enhancements" section. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 - // Maximum: 32 - // -- - // 0: OFF - // 1-32: ON, the number of human survivors required to be present for this ability to be effective. - "Requires Humans" "0" + // Minimum: 1.0 + // Maximum: 99999.0 + "Incap Damage Multiplier" "0.0" - // Enable this ability. - // Note: This setting does not affect the "Drunk Hit" setting. + // The Mutant Tank becomes intangible while alive. + // Note: This setting overrides the same setting under the "Plugin Settings/Enhancements" section. // Note: This setting can be overridden for specific players. // -- // 0/"disabled"/"false"/"off"/"no": OFF // 1/"enabled"/"true"/"on"/"yes": ON - "Ability Enabled" "0" + "Intangible Body" "0" - // Show a screen fade effect when the Mutant Tank uses its abilities. - // Note: The colors will randomly change between the colors set in the "Skin Color" and "Glow Color" settings. + // The mode of how melee hits affect the Mutant Tank. + // Note: If set to "1" then the formula is Damage = Max health x Melee hit value + // Example: Damage = 5000.0 x 0.05 = 250.0 + // Note: If set to "2" then the formula is Damage = Melee hit value + // Example: Damage = 500.0 + // Note: This setting overrides the same setting under the "Plugin Settings/Enhancements" section. // Note: This setting can be overridden for specific players. // -- - // Add up numbers together for different results. + // 0: OFF + // 1: ON, melee hits deal damage based on a percentage of the Mutant Tank's max health. + // 2: ON, melee hits deal damage based on a certain amount. + "Melee Hit Mode" "0" + + // The value of melee hits against the Mutant Tank. + // Note: The value of the "Melee Hit Mode" setting determines how the value of this setting is applied. + // Note: If "Melee Hit Mode" is set to "1" use values between "0.0" and "1.0". + // Example: 0.05 + // Note: If "Melee Hit Mode" is set to "2" use values between "0.0" and "99999.0". + // Example: 500.0 + // Note: This setting overrides the same setting under the "Plugin Settings/Enhancements" section. + // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 - // Maximum: 7 + // Minimum: 0.0 (OFF) + // Maximum: 99999.0 (Strongest) + "Melee Hit Value" "0.0" + + // The Mutant Tank's punches have this much force. + // Note: This setting overrides the same setting under the "Plugin Settings/Enhancements" section. + // Note: This setting can be overridden for specific players. // -- - // 0: OFF - // 1: Show effect when the Mutant Tank uses its claw/rock attack. - // 2: Show effect when the Mutant Tank is hit by a melee weapon. - // 4: Show effect when the Mutant Tank uses its range ability. + // OFF: -1.0 + // Minimum: 0.0 + // Maximum: 99999.0 // -- // Keywords: - // "none"/"off" - 0 - // "attack" - 1 - // "hurt" - 2 - // "attack,hurt" - 3 - // "range" - 4 - // "attack,range" - 5 - // "hurt,range" - 6 - // "attack,hurt,range" - 7 - "Ability Effect" "0" + // "nodmg"/"friendly"/"harmless" - 0.0 force + // "weakest" - 1.0 force + // "strongest" - 99999.0 force + "Punch Force" "-1.0" - // Display a message whenever the ability activates/deactivates. + // The Mutant Tank has this many chances out of 100.0% to punch and throw a rock simultaneously. + // Note: This setting overrides the same setting under the "Plugin Settings/Enhancements" section. // Note: This setting can be overridden for specific players. // -- - // Add up numbers together for different results. + // Minimum: 0.0 (No chance) + // Maximum: 100.0 (Highest chance) // -- - // Minimum: 0 - // Maximum: 3 + // Keywords: + // "never" - 0% chance + // "sometimes"/"unlikely"/"seldom" - 33.3% chance + // "maybe" - 50% chance + // "often"/"likely"/"frequently" - 66.6% chance + // "always" - 100% chance + "Punch Throw" "0.0" + + // The Mutant Tank's rock throws do this much damage. + // Note: This setting overrides the same setting under the "Plugin Settings/Enhancements" section. + // Note: This setting can be overridden for specific players. // -- - // 0: OFF - // 1: Display message only when "Drunk Hit" is enabled. - // 2: Display message only when "Ability Enabled" is enabled. + // OFF: -1.0 + // Minimum: 0.0 + // Maximum: 99999.0 // -- // Keywords: - // "none"/"off" - 0 - // "hit" - 1 - // "ability" - 2 - // "both"/"all"/"hit,ability" - 3 - "Ability Message" "0" + // "nodmg"/"friendly"/"harmless" - 0.0 damage + // "weakest" - 1.0 damage + // "strongest" - 99999.0 damage + "Rock Damage" "-1.0" - // Check line-of-sight when the Mutant Tank uses its abilities. + // The Mutant Tank's rock throws play a sound loop. + // Note: Both games already do this by default. + // Note: This setting overrides the same setting under the "Plugin Settings/Enhancements" section. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 - // Maximum: 5 + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Rock Sound" "0" + + // Set the Mutant Tank's run speed. + // Note: Default run speed is 1.0. + // Note: This setting overrides the same setting under the "Plugin Settings/Enhancements" section. + // Note: This setting can be overridden for specific players. // -- - // 0: OFF - // 1: Check if there is a solid object between the Mutant Tank and survivors. - // 2: Option 1 + Check if the Mutant Tank is looking toward the survivors. - // 3: Option 1 + Check if the Mutant Tank is looking away from the survivors. - // 4: Option 1 + Check if the survivors are looking toward the Mutant Tank. - // 5: Option 1 + Check if the survivors are looking away from the Mutant Tank. - "Ability Sight" "0" + // OFF: 0.0 + // Minimum: 0.1 + // Maximum: 99.0 + "Run Speed" "0.0" - // The Mutant Tank has this many chances out of 100.0% to trigger the ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Skip the Mutant Tank's dying animation. + // Note: This setting overrides the same setting under the "Plugin Settings/Enhancements" section. + // Note: This setting can be overridden for specific players. + // -- + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Skip Incap" "0" + + // Skip the Mutant Tank's taunting animation after incapacitating survivors and when climbing. + // Note: This setting overrides the same setting under the "Plugin Settings/Enhancements" section. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.0 (No chance) - // Maximum: 100.0 (Highest chance) + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Skip Taunt" "0" + + // The Mutant Tank's punches hit all survivors within range. + // Note: Both games already do this by default in Versus and Survival modes. + // Note: This setting overrides the same setting under the "Plugin Settings/Enhancements" section. + // Note: This setting can be overridden for specific players. // -- - // Keywords: - // "never" - 0% chance - // "sometimes"/"unlikely"/"seldom" - 33.3% chance - // "maybe" - 50% chance - // "often"/"likely"/"frequently" - 66.6% chance - // "always" - 100% chance - "Drunk Chance" "33.3" + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Sweep Fist" "0" - // The cooldown for the Mutant Tank's hit ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // The Mutant Tank's rock throws have this much force. + // Note: Low values like "500.0" and high values like "5000.0" will cause rocks to miss by a huge margin. This is a game limitation, not a plugin issue. + // Note: The value "1000.0" has been tested to be a stable value for the Tank's rock throw force. + // Note: This setting overrides the same setting under the "Plugin Settings/Enhancements" section. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 (OFF) - // Maximum: 99999 (Longest) + // OFF: -1.0 + // Minimum: 0.0 + // Maximum: 99999.0 // -- // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Drunk Cooldown" "0" + // "nodmg"/"friendly"/"harmless" - 0.0 force + // "weakest" - 1.0 force + // "strongest" - 99999.0 force + "Throw Force" "-1.0" - // The Mutant Tank's ability effects last this long. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // The Mutant Tank throws a rock every time this many seconds passes. + // Note: This setting overrides the same setting under the "Plugin Settings/Enhancements" section. // Note: This setting can be overridden for specific players. // -- - // Minimum: 1 - // Maximum: 99999 + // OFF: 0.0 + // Minimum: 0.1 + // Maximum: 99999.0 // -- // Keywords: + // "milli"/"millisecond" - 0.1 seconds // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Drunk Duration" "5" + "Throw Interval" "0.0" - // Enable the Mutant Tank's claw/rock attack. - // Note: This setting does not need the "Ability Enabled" setting to be set to "1". + // The Mutant Tank throws a rock when using its rock throw ability. + // Note: This just throws a second rock for the Tank. + // Note: This can disrupt the default ability or free the survivor victim of the Charger/Hunter/Jockey/Smoker. + // Note: Do not change this setting if you want to preserve the default abilities of the Charger/Hunter/Jockey/Smoker. + // Note: This setting overrides the same setting under the "Plugin Settings/Enhancements" section. // Note: This setting can be overridden for specific players. // -- // 0/"disabled"/"false"/"off"/"no": OFF // 1/"enabled"/"true"/"on"/"yes": ON - "Drunk Hit" "0" + "Throw Rock" "0" - // The mode of the Mutant Tank's claw/rock attack. + "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" + { + // Note: Override any of the settings in the "Enhancements" section for each special infected here. + + // The Mutant Special Infected's pins (Smoker grab, Hunter pounce, Jockey ride, Charger impact) do this much damage. + // Note: This setting overrides the same setting under the "Plugin Settings/Enhancements" section. + // Note: This setting can be overridden for specific players. + // -- + // OFF: -1.0 + // Minimum: 0.0 + // Maximum: 99999.0 + // -- + // Keywords: + // "nodmg"/"friendly"/"harmless" - 0.0 damage + // "weakest" - 1.0 damage + // "strongest" - 99999.0 damage + "Pin Damage" "-1.0" + + // The Mutant Special Infected uses its special ability every time this many seconds passes. + // Note: This setting overrides the same setting under the "Plugin Settings/Enhancements" section. + // Note: This setting can be overridden for specific players. + // -- + // OFF: 0.0 + // Minimum: 0.1 + // Maximum: 99999.0 + // -- + // Keywords: + // "milli"/"millisecond" - 0.1 seconds + // "second" - 1 second + // "minute" - 1 minute + // "forever" - 99999 seconds + "Special Interval" "0.0" + + // Example + "Attack Interval" "0.0" + "Bunny Hop" "0" + "Claw Damage" "-1.0" + "Incap Damage Multiplier" "0.0" + "Intangible Body" "0" + "Melee Hit Mode" "0" + "Melee Hit Value" "0.0" + "Pin Damage" "-1.0" + "Run Speed" "0.0" + "Special Interval" "0.0" + "Throw Rock" "0" + } + } + "Immunities" + { + // Give the Mutant Tank bullet immunity. + // Note: This setting overrides the same setting under the "Plugin Settings/Immunities" section. // Note: This setting can be overridden for specific players. // -- - // 0: Both - // 1: Ability activates when the Mutant Tank hits a survivor. - // 2: Ability activates when the Mutant Tank is hit by a survivor. - // -- - // Keywords: - // "both"/"all" - 0 - // "tank"/"attack" - 1 - // "survivor"/"hurt" - 2 - "Drunk Hit Mode" "0" + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Bullet Immunity" "0" - // The distance between a survivor and the Mutant Tank needed to trigger the ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Give the Mutant Tank explosive immunity. + // Note: This setting overrides the same setting under the "Plugin Settings/Immunities" section. // Note: This setting can be overridden for specific players. // -- - // Minimum: 1.0 (Closest) - // Maximum: 99999.0 (Farthest) - // -- - // Keywords: - // "closest" - 1.0 range - // "farthest" - 99999.0 range - "Drunk Range" "150.0" + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Explosive Immunity" "0" - // The Mutant Tank has this many chances out of 100.0% to trigger the range ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Give the Mutant Tank fire immunity. + // Note: This setting overrides the same setting under the "Plugin Settings/Immunities" section. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.0 (No chance) - // Maximum: 100.0 (Highest chance) - // -- - // Keywords: - // "never" - 0% chance - // "sometimes"/"unlikely"/"seldom" - 33.3% chance - // "maybe" - 50% chance - // "often"/"likely"/"frequently" - 66.6% chance - // "always" - 100% chance - "Drunk Range Chance" "15.0" + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Fire Immunity" "0" - // The cooldown for the Mutant Tank's range ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Give the Mutant Tank hittable immunity. + // Note: This setting overrides the same setting under the "Plugin Settings/Immunities" section. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 (OFF) - // Maximum: 99999 (Longest) - // -- - // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Drunk Range Cooldown" "0" + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Hittable Immunity" "0" - // The Mutant Tank causes the survivors' speed to randomly change every time this many seconds passes. + // Give the Mutant Tank melee immunity. + // Note: This setting overrides the same setting under the "Plugin Settings/Immunities" section. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.1 - // Maximum: 99999.0 - // -- - // Keywords: - // "milli"/"millisecond" - 0.1 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Drunk Speed Interval" "1.5" + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Melee Immunity" "0" - // The Mutant Tank causes the survivors to turn at a random direction every time this many seconds passes. + // Give the Mutant Tank vomit immunity. + // Note: This setting overrides the same setting under the "Plugin Settings/Immunities" section. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.1 - // Maximum: 99999.0 - // -- - // Keywords: - // "milli"/"millisecond" - 0.1 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Drunk Turn Interval" "0.5" + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Vomit Immunity" "0" "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" { - // Note: Override any of the settings in the "Drunk Ability" section for each special infected here. + // Note: Override any of the settings in the "Immunities" section for each special infected here. // Example - "Access Flags" "" - "Immunity Flags" "" - "Close Areas Only" "0.0" - "Combo Ability" "0" - "Human Ability" "0" - "Human Ammo" "5" - "Human Cooldown" "0" - "Human Range Cooldown" "0" - "Open Areas Only" "0.0" - "Requires Humans" "0" - "Ability Enabled" "0" - "Ability Effect" "0" - "Ability Message" "0" - "Ability Sight" "0" - "Drunk Chance" "33.3" - "Drunk Cooldown" "0" - "Drunk Duration" "5" - "Drunk Hit" "0" - "Drunk Hit Mode" "0" - "Drunk Range" "150.0" - "Drunk Range Chance" "15.0" - "Drunk Range Cooldown" "0" - "Drunk Speed Interval" "1.5" - "Drunk Turn Interval" "0.5" + "Bullet Immunity" "0" + "Explosive Immunity" "0" + "Fire Immunity" "0" + "Hittable Immunity" "0" + "Melee Immunity" "0" + "Vomit Immunity" "0" } } } @@ -11842,26 +10384,20 @@ ```
-##### Electric Ability +#### Abilities Set #1 (A-L) + +##### Absorb Ability
Click to expand! -``` -"Mutant Tanks" -{ - "Tank #1" - { - // The Mutant Tank electrocutes survivors. - // "Ability Enabled" - When a survivor is within range of the Mutant Tank, the survivor is electrocuted. - // - "Electric Range" - // - "Electric Range Chance" - // - "Electric Range Cooldown" - // "Electric Hit" - When a survivor is hit by the Mutant Tank's claw or rock, or a survivor hits the Mutant Tank with a melee weapon, the survivor is electrocuted. - // - "Electric Chance" - // - "Electric Cooldown" - // - "Electric Hit Mode" - // Requires "mt_abilities.smx" to be compiled with "mt_electric.sp" to work. - "Electric Ability" +``` +"Mutant Tanks" +{ + "Tank #1" + { + // The Mutant Tank absorbs most of the damage it receives. + // Requires "mt_abilities.smx" to be compiled with "mt_absorb.sp" to work. + "Absorb Ability" { // Admins with one or more of these access flags have access to this ability. // Note: This setting can be overridden for specific players. @@ -11931,18 +10467,26 @@ // "forever" - 99999 seconds "Human Cooldown" "0" - // Human-controlled Mutant Tanks must wait this long before using their range ability again. + // The Mutant Tank's ability effects last this long. + // Note: This setting does not affect human-controlled Mutant Tanks unless the "Human Mode" setting is set to "0". // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 (OFF) - // Maximum: 99999 (Longest) + // Minimum: 0 + // Maximum: 99999 // -- // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Human Range Cooldown" "0" + "Human Duration" "5" + + // The mode of how human-controlled Mutant Tanks activate their abilities. + // Note: This setting can be overridden for specific players. + // -- + // 0: Press buttons to activate corresponding abilities. Cooldown starts after ability is activated. + // 1: Hold down buttons to keep corresponding abilities activated. Cooldown starts after the player lets go of the buttons. + // 2: Press buttons to toggle corresponding abilities. Cooldown starts after ability is deactivated. + "Human Mode" "1" // The ability can only activate in open areas. // Note: Do not change this setting if you are unsure of how it works. @@ -11956,81 +10500,39 @@ // "farthest" - 99999.0 range "Open Areas Only" "0.0" - // The ability is only effective toward human survivors. + // The ability is only effective toward human-controlled survivors. // Note: This setting can be overridden for specific players. // -- // Minimum: 0 // Maximum: 32 // -- // 0: OFF - // 1-32: ON, the number of human survivors required to be present for this ability to be effective. - "Requires Humans" "0" + // 1-32: ON, the number of human-controlled survivors required to be present for this ability to be effective. + "Requires Humans" "1" // Enable this ability. - // Note: This setting does not affect the "Electric Hit" setting. // Note: This setting can be overridden for specific players. // -- // 0/"disabled"/"false"/"off"/"no": OFF // 1/"enabled"/"true"/"on"/"yes": ON "Ability Enabled" "0" - // Show a screen fade effect when the Mutant Tank uses its abilities. - // Note: The colors will randomly change between the colors set in the "Skin Color" and "Glow Color" settings. - // Note: This setting can be overridden for specific players. - // -- - // Add up numbers together for different results. - // -- - // Minimum: 0 - // Maximum: 7 - // -- - // 0: OFF - // 1: Show effect when the Mutant Tank uses its claw/rock attack. - // 2: Show effect when the Mutant Tank is hit by a melee weapon. - // 4: Show effect when the Mutant Tank uses its range ability. - // -- - // Keywords: - // "none"/"off" - 0 - // "attack" - 1 - // "hurt" - 2 - // "attack,hurt" - 3 - // "range" - 4 - // "attack,range" - 5 - // "hurt,range" - 6 - // "attack,hurt,range" - 7 - "Ability Effect" "0" - // Display a message whenever the ability activates/deactivates. // Note: This setting can be overridden for specific players. // -- - // Add up numbers together for different results. - // -- - // Minimum: 0 - // Maximum: 3 - // -- - // 0: OFF - // 1: Display message only when "Electric Hit" is enabled. - // 2: Display message only when "Ability Enabled" is enabled. - // -- - // Keywords: - // "none"/"off" - 0 - // "hit" - 1 - // "ability" - 2 - // "both"/"all"/"hit,ability" - 3 + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON "Ability Message" "0" - // Check line-of-sight when the Mutant Tank uses its abilities. + // The bullet damage received by the Mutant Tank is divided by this value. + // Note: Damage = Bullet damage/Absorb bullet divisor + // Example: Damage = 30.0/20.0 (1.5) + // Note: Use the value "1.0" to disable this setting. (Bullet damage/1.0 = Bullet damage) // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 - // Maximum: 5 - // -- - // 0: OFF - // 1: Check if there is a solid object between the Mutant Tank and survivors. - // 2: Option 1 + Check if the Mutant Tank is looking toward the survivors. - // 3: Option 1 + Check if the Mutant Tank is looking away from the survivors. - // 4: Option 1 + Check if the survivors are looking toward the Mutant Tank. - // 5: Option 1 + Check if the survivors are looking away from the Mutant Tank. - "Ability Sight" "0" + // Minimum: 1.0 + // Maximum: 99999.0 + "Absorb Bullet Divisor" "20.0" // The Mutant Tank has this many chances out of 100.0% to trigger the ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -12045,9 +10547,16 @@ // "maybe" - 50% chance // "often"/"likely"/"frequently" - 66.6% chance // "always" - 100% chance - "Electric Chance" "33.3" + "Absorb Chance" "33.3" - // The cooldown for the Mutant Tank's hit ability. + // This percentage of the Mutant Tank's absorbed damage is converted into armored health. + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0.0 (OFF) + // Maximum: 1.0 (Full) + "Absorb Convert Percentage" "0.0" + + // The cooldown for the Mutant Tank's ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- @@ -12059,120 +10568,64 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Electric Cooldown" "0" - - // The Mutant Tank's electrocutions do this much damage. - // Note: This is ignored when the "Combo Ability" setting is set to "1". - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0.0 (OFF) - // Maximum: 99999.0 - // -- - // Keywords: - // "weakest" - 1.0 damage - // "strongest" - 99999.0 damage - "Electric Damage" "5.0" + "Absorb Cooldown" "0" // The Mutant Tank's ability effects last this long. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- - // Minimum: 1 + // Minimum: 0 // Maximum: 99999 // -- // Keywords: // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Electric Duration" "5" - - // Enable the Mutant Tank's claw/rock attack. - // Note: This setting does not need the "Ability Enabled" setting to be set to "1". - // Note: This setting can be overridden for specific players. - // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Electric Hit" "0" - - // The mode of the Mutant Tank's claw/rock attack. - // Note: This setting can be overridden for specific players. - // -- - // 0: Both - // 1: Ability activates when the Mutant Tank hits a survivor. - // 2: Ability activates when the Mutant Tank is hit by a survivor. - // -- - // Keywords: - // "both"/"all" - 0 - // "tank"/"attack" - 1 - // "survivor"/"hurt" - 2 - "Electric Hit Mode" "0" + "Absorb Duration" "5" - // The Mutant Tank electrocutes survivors every time this many seconds passes. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // The explosive damage received by the Mutant Tank is divided by this value. + // Note: Damage = Explosive damage/Absorb explosive divisor + // Example: Damage = 30.0/20.0 (1.5) + // Note: Use the value "1.0" to disable this setting. (Explosive damage/1.0 = Explosive damage) // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.1 + // Minimum: 1.0 // Maximum: 99999.0 - // -- - // Keywords: - // "milli"/"millisecond" - 0.1 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Electric Interval" "1.0" - - // The distance between a survivor and the Mutant Tank needed to trigger the ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 1.0 (Closest) - // Maximum: 99999.0 (Farthest) - // -- - // Keywords: - // "closest" - 1.0 range - // "farthest" - 99999.0 range - "Electric Range" "150.0" + "Absorb Explosive Divisor" "20.0" - // The Mutant Tank has this many chances out of 100.0% to trigger the range ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // The fire damage received by the Mutant Tank is divided by this value. + // Note: Damage = Fire damage/Absorb fire divisor + // Example: Damage = 300.0/200.0 (1.5) + // Note: Use the value "1.0" to disable this setting. (Fire damage/1.0 = Fire damage) // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.0 (No chance) - // Maximum: 100.0 (Highest chance) - // -- - // Keywords: - // "never" - 0% chance - // "sometimes"/"unlikely"/"seldom" - 33.3% chance - // "maybe" - 50% chance - // "often"/"likely"/"frequently" - 66.6% chance - // "always" - 100% chance - "Electric Range Chance" "15.0" + // Minimum: 1.0 + // Maximum: 99999.0 + "Absorb Fire Divisor" "200.0" - // The cooldown for the Mutant Tank's range ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // The hittable damage received by the Mutant Tank is divided by this value. + // Note: Damage = Hittable damage/Absorb hittable divisor + // Example: Damage = 30.0/20.0 (1.5) + // Note: Use the value "1.0" to disable this setting. (Hittable damage/1.0 = Hittable damage) // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 (OFF) - // Maximum: 99999 (Longest) - // -- - // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Electric Range Cooldown" "0" + // Minimum: 1.0 + // Maximum: 99999.0 + "Absorb Hittable Divisor" "20.0" - // The Mutant Tank sets the survivors' run speed to this value when they are stunned. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // The melee damage received by the Mutant Tank is divided by this value. + // Note: Damage = Melee damage/Absorb melee divisor + // Example: Damage = 300.0/200.0 (1.5) + // Note: Use the value "1.0" to disable this setting. (Melee damage/1.0 = Melee damage) // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.1 - // Maximum: 0.99 - "Electric Stun Speed" "0.25" + // Minimum: 1.0 + // Maximum: 99999.0 + "Absorb Melee Divisor" "200.0" "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" { - // Note: Override any of the settings in the "Electric Ability" section for each special infected here. + // Note: Override any of the settings in the "Absorb Ability" section for each special infected here. // Example "Access Flags" "" @@ -12182,23 +10635,21 @@ "Human Ability" "0" "Human Ammo" "5" "Human Cooldown" "0" - "Human Range Cooldown" "0" + "Human Duration" "5" + "Human Mode" "1" "Open Areas Only" "0.0" - "Requires Humans" "0" + "Requires Humans" "1" "Ability Enabled" "0" - "Ability Effect" "0" "Ability Message" "0" - "Ability Sight" "0" - "Electric Chance" "33.3" - "Electric Cooldown" "0" - "Electric Damage" "5.0" - "Electric Duration" "5" - "Electric Hit" "0" - "Electric Hit Mode" "0" - "Electric Interval" "1.0" - "Electric Range" "150.0" - "Electric Range Chance" "15.0" - "Electric Range Cooldown" "0" + "Absorb Bullet Divisor" "20.0" + "Absorb Chance" "33.3" + "Absorb Convert Percentage" "0.0" + "Absorb Cooldown" "0" + "Absorb Duration" "5" + "Absorb Explosive Divisor" "20.0" + "Absorb Fire Divisor" "200.0" + "Absorb Hittable Divisor" "20.0" + "Absorb Melee Divisor" "200.0" } } } @@ -12206,7 +10657,7 @@ ```
-##### Enforce Ability +##### Acid Ability
Click to expand! @@ -12215,17 +10666,24 @@ { "Tank #1" { - // The Mutant Tank forces survivors to only use a certain weapon slot. - // "Ability Enabled" - When a survivor is within range of the Mutant Tank, the survivor is forced to only use a certain weapon slot. - // - "Enforce Range" - // - "Enforce Range Chance" - // - "Enforce Range Cooldown" - // "Enforce Hit" - When a survivor is hit by the Mutant Tank's claw or rock, or a survivor hits the Mutant Tank with a melee weapon, the survivor is forced to only use a certain weapon slot. - // - "Enforce Chance" - // - "Enforce Cooldown" - // - "Enforce Hit Mode" - // Requires "mt_abilities.smx" to be compiled with "mt_enforce.sp" to work. - "Enforce Ability" + // The Mutant Tank creates acid puddles. + // "Ability Enabled" - When a survivor is within range of the Mutant Tank, an acid puddle is created underneath the survivor. + // - "Acid Range" + // - "Acid Range Chance" + // - "Acid Range Cooldown" + // "Acid Death" - When the Mutant Tank dies or spawns, an acid puddle is created underneath the Mutant Tank. + // - "Acid Death Chance" + // - "Acid Death Range" + // "Acid Hit" - When a survivor is hit by the Mutant Tank's claw or rock, or a survivor hits the Mutant Tank with a melee weapon, an acid puddle is created underneath the survivor. + // - "Acid Chance" + // - "Acid Cooldown" + // - "Acid Hit Mode" + // "Acid Rock Break" - When the Mutant Tank's rock breaks, it creates an acid puddle. + // - "Acid Rock Chance" + // - "Acid Rock Cooldown" + // Requires "mt_abilities.smx" to be compiled with "mt_acid.sp" to work. + // Note: Only available in Left 4 Dead 2. + "Acid Ability" { // Admins with one or more of these access flags have access to this ability. // Note: This setting can be overridden for specific players. @@ -12282,7 +10740,7 @@ // "infinite" - 99999 ammo "Human Ammo" "5" - // Human-controlled Mutant Tanks must wait this long before using their abilities again. + // Human-controlled Mutant Tanks must wait this long before using their hit ability again. // Note: This setting can be overridden for specific players. // -- // Minimum: 0 (OFF) @@ -12308,6 +10766,19 @@ // "forever" - 99999 seconds "Human Range Cooldown" "0" + // Human-controlled Mutant Tanks must wait this long before using their rock ability again. + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0 (OFF) + // Maximum: 99999 (Longest) + // -- + // Keywords: + // "never"/"disabled"/"false"/"off"/"no" - 0 seconds + // "second" - 1 second + // "minute" - 1 minute + // "forever" - 99999 seconds + "Human Rock Cooldown" "0" + // The ability can only activate in open areas. // Note: Do not change this setting if you are unsure of how it works. // Note: This setting can be overridden for specific players. @@ -12320,18 +10791,18 @@ // "farthest" - 99999.0 range "Open Areas Only" "0.0" - // The ability is only effective toward human survivors. + // The ability is only effective toward human-controlled survivors. // Note: This setting can be overridden for specific players. // -- // Minimum: 0 // Maximum: 32 // -- // 0: OFF - // 1-32: ON, the number of human survivors required to be present for this ability to be effective. + // 1-32: ON, the number of human-controlled survivors required to be present for this ability to be effective. "Requires Humans" "0" // Enable this ability. - // Note: This setting does not affect the "Enforce Hit" setting. + // Note: This setting does not affect the "Acid Hit" setting. // Note: This setting can be overridden for specific players. // -- // 0/"disabled"/"false"/"off"/"no": OFF @@ -12363,23 +10834,28 @@ // "attack,hurt,range" - 7 "Ability Effect" "0" - // Display a message whenever the ability activates/deactivates. + // Display a message whenever the abilities activate/deactivate. // Note: This setting can be overridden for specific players. // -- // Add up numbers together for different results. // -- // Minimum: 0 - // Maximum: 3 + // Maximum: 7 // -- // 0: OFF - // 1: Display message only when "Enforce Hit" is enabled. + // 1: Display message only when "Acid Hit" is enabled. // 2: Display message only when "Ability Enabled" is enabled. + // 4: Display message only when "Acid Rock Break" is enabled. // -- // Keywords: // "none"/"off" - 0 // "hit" - 1 // "ability" - 2 - // "both"/"all"/"hit,ability" - 3 + // "hit,ability" - 3 + // "rock" - 4 + // "hit,rock" - 5 + // "ability,rock" - 6 + // "hit,ability,rock"/"all" - 7 "Ability Message" "0" // Check line-of-sight when the Mutant Tank uses its abilities. @@ -12396,7 +10872,7 @@ // 5: Option 1 + Check if the survivors are looking away from the Mutant Tank. "Ability Sight" "0" - // The Mutant Tank has this many chances out of 100.0% to trigger the ability. + // The Mutant Tank has this many chances out of 100.0% to trigger the hit ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- @@ -12409,7 +10885,7 @@ // "maybe" - 50% chance // "often"/"likely"/"frequently" - 66.6% chance // "always" - 100% chance - "Enforce Chance" "33.3" + "Acid Chance" "33.3" // The cooldown for the Mutant Tank's hit ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -12423,21 +10899,60 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Enforce Cooldown" "0" + "Acid Cooldown" "0" - // The Mutant Tank's ability effects last this long. + // The Mutant Tank's acid puddles do this much damage. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.1 + // Minimum: 0.0 (OFF) // Maximum: 99999.0 // -- // Keywords: - // "milli"/"millisecond" - 0.1 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Enforce Duration" "5.0" + // "weakest" - 1.0 damage + // "strongest" - 99999.0 damage + "Acid Damage" "3.0" + + // Enable the Mutant Tank's upon-death range ability. + // Note: This setting does not need the "Ability Enabled" setting to be set to "1". + // Note: This setting can be overridden for specific players. + // -- + // Add up numbers together for different results. + // -- + // Minimum: 0 + // Maximum: 3 + // -- + // 0: OFF + // 1: Trigger the range ability when the Mutant Tank dies. + // 2: Trigger the range ability when the Mutant Tank spawns. + "Acid Death" "1" + + // The Mutant Tank has this many chances out of 100.0% to trigger the upon-death ability. + // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0.0 (No chance) + // Maximum: 100.0 (Highest chance) + // -- + // Keywords: + // "never" - 0% chance + // "sometimes"/"unlikely"/"seldom" - 33.3% chance + // "maybe" - 50% chance + // "often"/"likely"/"frequently" - 66.6% chance + // "always" - 100% chance + "Acid Death Chance" "33.3" + + // The distance between a survivor and the Mutant Tank needed to trigger the upon-death ability. + // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 1.0 (Closest) + // Maximum: 99999.0 (Farthest) + // -- + // Keywords: + // "closest" - 1.0 range + // "farthest" - 99999.0 range + "Acid Death Range" "200.0" // Enable the Mutant Tank's claw/rock attack. // Note: This setting does not need the "Ability Enabled" setting to be set to "1". @@ -12445,7 +10960,7 @@ // -- // 0/"disabled"/"false"/"off"/"no": OFF // 1/"enabled"/"true"/"on"/"yes": ON - "Enforce Hit" "0" + "Acid Hit" "0" // The mode of the Mutant Tank's claw/rock attack. // Note: This setting can be overridden for specific players. @@ -12458,7 +10973,7 @@ // "both"/"all" - 0 // "tank"/"attack" - 1 // "survivor"/"hurt" - 2 - "Enforce Hit Mode" "0" + "Acid Hit Mode" "0" // The distance between a survivor and the Mutant Tank needed to trigger the ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -12470,7 +10985,7 @@ // Keywords: // "closest" - 1.0 range // "farthest" - 99999.0 range - "Enforce Range" "150.0" + "Acid Range" "150.0" // The Mutant Tank has this many chances out of 100.0% to trigger the range ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -12485,7 +11000,7 @@ // "maybe" - 50% chance // "often"/"likely"/"frequently" - 66.6% chance // "always" - 100% chance - "Enforce Range Chance" "15.0" + "Acid Range Chance" "15.0" // The cooldown for the Mutant Tank's range ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -12499,27 +11014,49 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Enforce Range Cooldown" "0" + "Acid Range Cooldown" "0" - // The Mutant Tank forces survivors to only use one of the following weapon slots. + // The Mutant Tank's rock creates an acid puddle when it breaks. + // Note: Only available in Left 4 Dead 2. + // Note: This does not need "Ability Enabled" or "Acid Hit" to be set to "1". // Note: This setting can be overridden for specific players. // -- - // Add up numbers together for different results. + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Acid Rock Break" "0" + + // The Mutant Tank's rock has this many chances out of 100.0% to trigger the rock break ability. + // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 - // Maximum: 31 + // Minimum: 0.0 (No chance) + // Maximum: 100.0 (Highest chance) // -- - // 0 OR 31: Pick randomly between the 5 slots. - // 1: 1st slot only. - // 2: 2nd slot only. - // 4: 3rd slot only. - // 8: 4th slot only. - // 16: 5th slot only. - "Enforce Weapon Slots" "0" + // Keywords: + // "never" - 0% chance + // "sometimes"/"unlikely"/"seldom" - 33.3% chance + // "maybe" - 50% chance + // "often"/"likely"/"frequently" - 66.6% chance + // "always" - 100% chance + "Acid Rock Chance" "33.3" + + // The cooldown for the Mutant Tank's rock ability. + // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0 (OFF) + // Maximum: 99999 (Longest) + // -- + // Keywords: + // "never"/"disabled"/"false"/"off"/"no" - 0 seconds + // "second" - 1 second + // "minute" - 1 minute + // "forever" - 99999 seconds + "Acid Rock Cooldown" "0" "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" { - // Note: Override any of the settings in the "Enforce Ability" section for each special infected here. + // Note: Override any of the settings in the "Acid Ability" section for each special infected here. // Example "Access Flags" "" @@ -12529,6 +11066,7 @@ "Human Ability" "0" "Human Ammo" "5" "Human Cooldown" "0" + "Human Pin Cooldown" "0" "Human Range Cooldown" "0" "Open Areas Only" "0.0" "Requires Humans" "0" @@ -12536,15 +11074,20 @@ "Ability Effect" "0" "Ability Message" "0" "Ability Sight" "0" - "Enforce Chance" "33.3" - "Enforce Cooldown" "0" - "Enforce Duration" "5.0" - "Enforce Hit" "0" - "Enforce Hit Mode" "0" - "Enforce Range" "150.0" - "Enforce Range Chance" "15.0" - "Enforce Range Cooldown" "0" - "Enforce Weapon Slots" "0" + "Acid Chance" "33.3" + "Acid Cooldown" "0" + "Acid Damage" "3.0" + "Acid Death" "1" + "Acid Death Chance" "33.3" + "Acid Death Range" "200.0" + "Acid Hit" "0" + "Acid Hit Mode" "0" + "Acid Pin" "0" + "Acid Pin Chance" "33.3" + "Acid Pin Cooldown" "0" + "Acid Range" "150.0" + "Acid Range Chance" "15.0" + "Acid Range Cooldown" "0" } } } @@ -12552,7 +11095,7 @@ ```
-##### Fast Ability +##### Aimless Ability
Click to expand! @@ -12561,9 +11104,17 @@ { "Tank #1" { - // The Mutant Tank runs really fast like the Flash. - // Requires "mt_abilities.smx" to be compiled with "mt_fast.sp" to work. - "Fast Ability" + // The Mutant Tank prevents survivors from aiming. + // "Ability Enabled" - When a survivor is within range of the Mutant Tank, the survivor cannot aim. + // - "Aimless Range" + // - "Aimless Range Chance" + // - "Aimless Range Cooldown" + // "Aimless Hit" - When a survivor is hit by the Mutant Tank's claw or rock, or a survivor hits the Mutant Tank with a melee weapon, the survivor cannot aim. + // - "Aimless Chance" + // - "Aimless Cooldown" + // - "Aimless Hit Mode" + // Requires "mt_abilities.smx" to be compiled with "mt_aimless.sp" to work. + "Aimless Ability" { // Admins with one or more of these access flags have access to this ability. // Note: This setting can be overridden for specific players. @@ -12633,25 +11184,18 @@ // "forever" - 99999 seconds "Human Cooldown" "0" - // The Mutant Tank's ability effects last this long. - // Note: This setting does not affect human-controlled Mutant Tanks unless the "Human Mode" setting is set to "0". + // Human-controlled Mutant Tanks must wait this long before using their range ability again. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 - // Maximum: 99999 + // Minimum: 0 (OFF) + // Maximum: 99999 (Longest) // -- // Keywords: + // "never"/"disabled"/"false"/"off"/"no" - 0 seconds // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Human Duration" "5" - - // The mode of how human-controlled Mutant Tanks activate their abilities. - // Note: This setting can be overridden for specific players. - // -- - // 0: Press buttons to activate corresponding abilities. Cooldown starts after ability is activated. - // 1: Hold down buttons to keep corresponding abilities activated. Cooldown starts after the player lets go of the buttons. - "Human Mode" "1" + "Human Range Cooldown" "0" // The ability can only activate in open areas. // Note: Do not change this setting if you are unsure of how it works. @@ -12665,28 +11209,66 @@ // "farthest" - 99999.0 range "Open Areas Only" "0.0" - // The ability is only effective toward human survivors. + // The ability is only effective toward human-controlled survivors. + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0 + // Maximum: 32 + // -- + // 0: OFF + // 1-32: ON, the number of human-controlled survivors required to be present for this ability to be effective. + "Requires Humans" "1" + + // Enable this ability. + // Note: This setting does not affect the "Aimless Hit" setting. + // Note: This setting can be overridden for specific players. + // -- + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Ability Enabled" "0" + + // Show a screen fade effect when the Mutant Tank uses its abilities. + // Note: The colors will randomly change between the colors set in the "Skin Color" and "Glow Color" settings. + // Note: This setting can be overridden for specific players. + // -- + // Add up numbers together for different results. + // -- + // Minimum: 0 + // Maximum: 7 + // -- + // 0: OFF + // 1: Show effect when the Mutant Tank uses its claw/rock attack. + // 2: Show effect when the Mutant Tank is hit by a melee weapon. + // 4: Show effect when the Mutant Tank uses its range ability. + // -- + // Keywords: + // "none"/"off" - 0 + // "attack" - 1 + // "hurt" - 2 + // "attack,hurt" - 3 + // "range" - 4 + // "attack,range" - 5 + // "hurt,range" - 6 + // "attack,hurt,range" - 7 + "Ability Effect" "0" + + // Display a message whenever the ability activates/deactivates. // Note: This setting can be overridden for specific players. // -- + // Add up numbers together for different results. + // -- // Minimum: 0 - // Maximum: 32 + // Maximum: 3 // -- // 0: OFF - // 1-32: ON, the number of human survivors required to be present for this ability to be effective. - "Requires Humans" "0" - - // Enable this ability. - // Note: This setting can be overridden for specific players. - // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Ability Enabled" "0" - - // Display a message whenever the ability activates/deactivates. - // Note: This setting can be overridden for specific players. + // 1: Display message only when "Aimless Hit" is enabled. + // 2: Display message only when "Ability Enabled" is enabled. // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON + // Keywords: + // "none"/"off" - 0 + // "hit" - 1 + // "ability" - 2 + // "both"/"all"/"hit,ability" - 3 "Ability Message" "0" // Check line-of-sight when the Mutant Tank uses its abilities. @@ -12716,9 +11298,9 @@ // "maybe" - 50% chance // "often"/"likely"/"frequently" - 66.6% chance // "always" - 100% chance - "Fast Chance" "33.3" + "Aimless Chance" "33.3" - // The cooldown for the Mutant Tank's ability. + // The cooldown for the Mutant Tank's hit ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- @@ -12730,34 +11312,52 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Fast Cooldown" "0" + "Aimless Cooldown" "0" - // The Mutant Tank dashes to damage nearby survivors after incapacitating or killing a survivor. + // The Mutant Tank's ability effects last this long. + // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.0 (OFF) + // Minimum: 0.1 // Maximum: 99999.0 // -- // Keywords: - // "weakest" - 1.0 damage - // "strongest" - 99999.0 damage - "Fast Dash" "0.0" + // "milli"/"millisecond" - 0.1 seconds + // "second" - 1 second + // "minute" - 1 minute + // "forever" - 99999 seconds + "Aimless Duration" "5.0" - // The Mutant Tank has this many chances out of 100.0% to trigger the dash ability. + // The Mutant Tank's ability causes survivors to fire their guns uncontrollably. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.0 (No chance) - // Maximum: 100.0 (Highest chance) + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Aimless Gunshots" "0" + + // Enable the Mutant Tank's claw/rock attack. + // Note: This setting does not need the "Ability Enabled" setting to be set to "1". + // Note: This setting can be overridden for specific players. + // -- + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Aimless Hit" "0" + + // The mode of the Mutant Tank's claw/rock attack. + // Note: This setting can be overridden for specific players. + // -- + // 0: Both + // 1: Ability activates when the Mutant Tank hits a survivor. + // 2: Ability activates when the Mutant Tank is hit by a survivor. // -- // Keywords: - // "never" - 0% chance - // "sometimes"/"unlikely"/"seldom" - 33.3% chance - // "maybe" - 50% chance - // "often"/"likely"/"frequently" - 66.6% chance - // "always" - 100% chance - "Fast Dash Chance" "33.3" + // "both"/"all" - 0 + // "tank"/"attack" - 1 + // "survivor"/"hurt" - 2 + "Aimless Hit Mode" "0" - // The Mutant Tank's dash ability damages survivors that are within this range. + // The distance between a survivor and the Mutant Tank needed to trigger the ability. + // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- // Minimum: 1.0 (Closest) @@ -12766,32 +11366,40 @@ // Keywords: // "closest" - 1.0 range // "farthest" - 99999.0 range - "Fast Dash Range" "150.0" + "Aimless Range" "150.0" - // The Mutant Tank's ability effects last this long. + // The Mutant Tank has this many chances out of 100.0% to trigger the range ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 - // Maximum: 99999 + // Minimum: 0.0 (No chance) + // Maximum: 100.0 (Highest chance) // -- // Keywords: - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Fast Duration" "5" + // "never" - 0% chance + // "sometimes"/"unlikely"/"seldom" - 33.3% chance + // "maybe" - 50% chance + // "often"/"likely"/"frequently" - 66.6% chance + // "always" - 100% chance + "Aimless Range Chance" "15.0" - // The Mutant Tank's special speed. + // The cooldown for the Mutant Tank's range ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.1 - // Maximum: 99.0 - "Fast Speed" "5.0" + // Minimum: 0 (OFF) + // Maximum: 99999 (Longest) + // -- + // Keywords: + // "never"/"disabled"/"false"/"off"/"no" - 0 seconds + // "second" - 1 second + // "minute" - 1 minute + // "forever" - 99999 seconds + "Aimless Range Cooldown" "0" "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" { - // Note: Override any of the settings in the "Fast Ability" section for each special infected here. + // Note: Override any of the settings in the "Aimless Ability" section for each special infected here. // Example "Access Flags" "" @@ -12801,20 +11409,22 @@ "Human Ability" "0" "Human Ammo" "5" "Human Cooldown" "0" - "Human Duration" "5" - "Human Mode" "1" + "Human Range Cooldown" "0" "Open Areas Only" "0.0" - "Requires Humans" "0" + "Requires Humans" "1" "Ability Enabled" "0" + "Ability Effect" "0" "Ability Message" "0" "Ability Sight" "0" - "Fast Chance" "33.3" - "Fast Cooldown" "0" - "Fast Dash" "0.0" - "Fast Dash Chance" "33.3" - "Fast Dash Range" "150.0" - "Fast Duration" "5" - "Fast Speed" "5.0" + "Aimless Chance" "33.3" + "Aimless Cooldown" "0" + "Aimless Duration" "5.0" + "Aimless Gunshots" "0" + "Aimless Hit" "0" + "Aimless Hit Mode" "0" + "Aimless Range" "150.0" + "Aimless Range Chance" "15.0" + "Aimless Range Cooldown" "0" } } } @@ -12822,7 +11432,7 @@ ```
-##### Fire Ability +##### Ammo Ability
Click to expand! @@ -12831,23 +11441,17 @@ { "Tank #1" { - // The Mutant Tank creates fires. - // "Ability Enabled" - When a survivor is within range of the Mutant Tank, a fire is created around the survivor. - // - "Fire Range" - // - "Fire Range Chance" - // - "Fire Range Cooldown" - // "Fire Death" - When the Mutant Tank dies or spawns, a fire is created around the Mutant Tank. - // - "Fire Death Chance" - // - "Fire Death Range" - // "Fire Hit" - When a survivor is hit by the Mutant Tank's claw or rock, or a survivor hits the Mutant Tank with a melee weapon, a fire is created around the survivor. - // - "Fire Chance" - // - "Fire Cooldown" - // - "Fire Hit Mode" - // "Fire Rock Break" - When the Mutant Tank's rock breaks, it creates a fire. - // - "Fire Rock Chance" - // - "Fire Rock Cooldown" - // Requires "mt_abilities.smx" to be compiled with "mt_fire.sp" to work. - "Fire Ability" + // The Mutant Tank takes away survivors' ammunition. + // "Ability Enabled" - When a survivor is within range of the Mutant Tank, their ammunition is taken away. + // - "Ammo Range" + // - "Ammo Range Chance" + // - "Ammo Range Cooldown" + // "Ammo Hit" - When a survivor is hit by the Mutant Tank's claw or rock, or a survivor hits the Mutant Tank with a melee weapon, their ammunition is taken away. + // - "Ammo Chance" + // - "Ammo Cooldown" + // - "Ammo Hit Mode" + // Requires "mt_abilities.smx" to be compiled with "mt_ammo.sp" to work. + "Ammo Ability" { // Admins with one or more of these access flags have access to this ability. // Note: This setting can be overridden for specific players. @@ -12904,7 +11508,7 @@ // "infinite" - 99999 ammo "Human Ammo" "5" - // Human-controlled Mutant Tanks must wait this long before using their hit ability again. + // Human-controlled Mutant Tanks must wait this long before using their abilities again. // Note: This setting can be overridden for specific players. // -- // Minimum: 0 (OFF) @@ -12930,19 +11534,6 @@ // "forever" - 99999 seconds "Human Range Cooldown" "0" - // Human-controlled Mutant Tanks must wait this long before using their rock ability again. - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0 (OFF) - // Maximum: 99999 (Longest) - // -- - // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Human Rock Cooldown" "0" - // The ability can only activate in open areas. // Note: Do not change this setting if you are unsure of how it works. // Note: This setting can be overridden for specific players. @@ -12955,18 +11546,18 @@ // "farthest" - 99999.0 range "Open Areas Only" "0.0" - // The ability is only effective toward human survivors. + // The ability is only effective toward human-controlled survivors. // Note: This setting can be overridden for specific players. // -- // Minimum: 0 // Maximum: 32 // -- // 0: OFF - // 1-32: ON, the number of human survivors required to be present for this ability to be effective. - "Requires Humans" "0" + // 1-32: ON, the number of human-controlled survivors required to be present for this ability to be effective. + "Requires Humans" "1" // Enable this ability. - // Note: This setting does not affect the "Fire Hit" setting. + // Note: This setting does not affect the "Ammo Hit" setting. // Note: This setting can be overridden for specific players. // -- // 0/"disabled"/"false"/"off"/"no": OFF @@ -12998,100 +11589,40 @@ // "attack,hurt,range" - 7 "Ability Effect" "0" - // Display a message whenever the abilities activate/deactivate. + // Display a message whenever the ability activates/deactivates. // Note: This setting can be overridden for specific players. // -- // Add up numbers together for different results. // -- // Minimum: 0 - // Maximum: 7 + // Maximum: 3 // -- // 0: OFF - // 1: Display message only when "Fire Hit" is enabled. + // 1: Display message only when "Ammo Hit" is enabled. // 2: Display message only when "Ability Enabled" is enabled. - // 4: Display message only when "Fire Rock Break" is enabled. // -- // Keywords: // "none"/"off" - 0 // "hit" - 1 // "ability" - 2 - // "hit,ability" - 3 - // "rock" - 4 - // "hit,rock" - 5 - // "ability,rock" - 6 - // "hit,ability,rock"/"all" - 7 + // "both"/"all"/"hit,ability" - 3 "Ability Message" "0" - // Check line-of-sight when the Mutant Tank uses its abilities. - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0 - // Maximum: 5 - // -- - // 0: OFF - // 1: Check if there is a solid object between the Mutant Tank and survivors. - // 2: Option 1 + Check if the Mutant Tank is looking toward the survivors. - // 3: Option 1 + Check if the Mutant Tank is looking away from the survivors. - // 4: Option 1 + Check if the survivors are looking toward the Mutant Tank. - // 5: Option 1 + Check if the survivors are looking away from the Mutant Tank. - "Ability Sight" "0" - - // The Mutant Tank has this many chances out of 100.0% to trigger the ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0.0 (No chance) - // Maximum: 100.0 (Highest chance) - // -- - // Keywords: - // "never" - 0% chance - // "sometimes"/"unlikely"/"seldom" - 33.3% chance - // "maybe" - 50% chance - // "often"/"likely"/"frequently" - 66.6% chance - // "always" - 100% chance - "Fire Chance" "33.3" - - // The cooldown for the Mutant Tank's hit ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0 (OFF) - // Maximum: 99999 (Longest) - // -- - // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Fire Cooldown" "0" - - // The Mutant Tank's fires do this much damage. - // Note: This is ignored when the "Combo Ability" setting is set to "1". - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0.0 (OFF) - // Maximum: 99999.0 - // -- - // Keywords: - // "weakest" - 1.0 damage - // "strongest" - 99999.0 damage - "Fire Damage" "3.0" - - // Enable the Mutant Tank's upon-death range ability. - // Note: This setting does not need the "Ability Enabled" setting to be set to "1". + // Check line-of-sight when the Mutant Tank uses its abilities. // Note: This setting can be overridden for specific players. // -- - // Add up numbers together for different results. - // -- // Minimum: 0 - // Maximum: 3 + // Maximum: 5 // -- // 0: OFF - // 1: Trigger the range ability when the Mutant Tank dies. - // 2: Trigger the range ability when the Mutant Tank spawns. - "Fire Death" "1" + // 1: Check if there is a solid object between the Mutant Tank and survivors. + // 2: Option 1 + Check if the Mutant Tank is looking toward the survivors. + // 3: Option 1 + Check if the Mutant Tank is looking away from the survivors. + // 4: Option 1 + Check if the survivors are looking toward the Mutant Tank. + // 5: Option 1 + Check if the survivors are looking away from the Mutant Tank. + "Ability Sight" "0" - // The Mutant Tank has this many chances out of 100.0% to trigger the upon-death ability. + // The Mutant Tank has this many chances out of 100.0% to trigger the ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- @@ -13104,19 +11635,28 @@ // "maybe" - 50% chance // "often"/"likely"/"frequently" - 66.6% chance // "always" - 100% chance - "Fire Death Chance" "33.3" + "Ammo Chance" "33.3" - // The distance between a survivor and the Mutant Tank needed to trigger the upon-death ability. + // The cooldown for the Mutant Tank's hit ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- - // Minimum: 1.0 (Closest) - // Maximum: 99999.0 (Farthest) + // Minimum: 0 (OFF) + // Maximum: 99999 (Longest) // -- // Keywords: - // "closest" - 1.0 range - // "farthest" - 99999.0 range - "Fire Death Range" "200.0" + // "never"/"disabled"/"false"/"off"/"no" - 0 seconds + // "second" - 1 second + // "minute" - 1 minute + // "forever" - 99999 seconds + "Ammo Cooldown" "0" + + // The Mutant Tank takes this amount of ammunition from survivors. + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0 + // Maximum: 100 + "Ammo Count" "0" // Enable the Mutant Tank's claw/rock attack. // Note: This setting does not need the "Ability Enabled" setting to be set to "1". @@ -13124,7 +11664,7 @@ // -- // 0/"disabled"/"false"/"off"/"no": OFF // 1/"enabled"/"true"/"on"/"yes": ON - "Fire Hit" "0" + "Ammo Hit" "0" // The mode of the Mutant Tank's claw/rock attack. // Note: This setting can be overridden for specific players. @@ -13137,7 +11677,7 @@ // "both"/"all" - 0 // "tank"/"attack" - 1 // "survivor"/"hurt" - 2 - "Fire Hit Mode" "0" + "Ammo Hit Mode" "0" // The distance between a survivor and the Mutant Tank needed to trigger the ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -13149,7 +11689,7 @@ // Keywords: // "closest" - 1.0 range // "farthest" - 99999.0 range - "Fire Range" "150.0" + "Ammo Range" "150.0" // The Mutant Tank has this many chances out of 100.0% to trigger the range ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -13164,7 +11704,7 @@ // "maybe" - 50% chance // "often"/"likely"/"frequently" - 66.6% chance // "always" - 100% chance - "Fire Range Chance" "15.0" + "Ammo Range Chance" "15.0" // The cooldown for the Mutant Tank's range ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -13178,48 +11718,24 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Fire Range Cooldown" "0" - - // The Mutant Tank's rock creates a fire when it breaks. - // Note: This does not need "Ability Enabled" or "Fire Hit" to be set to "1". - // Note: This setting can be overridden for specific players. - // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Fire Rock Break" "0" + "Ammo Range Cooldown" "0" - // The Mutant Tank's rock has this many chances out of 100.0% to trigger the rock break ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // The Mutant Tank takes this type of ammunition from survivors. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.0 (No chance) - // Maximum: 100.0 (Highest chance) - // -- - // Keywords: - // "never" - 0% chance - // "sometimes"/"unlikely"/"seldom" - 33.3% chance - // "maybe" - 50% chance - // "often"/"likely"/"frequently" - 66.6% chance - // "always" - 100% chance - "Fire Rock Chance" "33.3" - - // The cooldown for the Mutant Tank's rock ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". - // Note: This setting can be overridden for specific players. + // Add up numbers together for different results. // -- - // Minimum: 0 (OFF) - // Maximum: 99999 (Longest) + // Minimum: 0 + // Maximum: 3 // -- - // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Fire Rock Cooldown" "0" + // 0 OR 3: All types of ammunition. + // 1: Magazine (Clip) + // 2: Reserved (Ammo) + "Ammo Type" "3" "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" { - // Note: Override any of the settings in the "Fire Ability" section for each special infected here. + // Note: Override any of the settings in the "Ammo Ability" section for each special infected here. // Example "Access Flags" "" @@ -13229,28 +11745,22 @@ "Human Ability" "0" "Human Ammo" "5" "Human Cooldown" "0" - "Human Pin Cooldown" "0" "Human Range Cooldown" "0" "Open Areas Only" "0.0" - "Requires Humans" "0" + "Requires Humans" "1" "Ability Enabled" "0" "Ability Effect" "0" "Ability Message" "0" "Ability Sight" "0" - "Fire Chance" "33.3" - "Fire Cooldown" "0" - "Fire Damage" "3.0" - "Fire Death" "1" - "Fire Death Chance" "33.3" - "Fire Death Range" "200.0" - "Fire Hit" "0" - "Fire Hit Mode" "0" - "Fire Pin" "0" - "Fire Pin Chance" "33.3" - "Fire Pin Cooldown" "0" - "Fire Range" "150.0" - "Fire Range Chance" "15.0" - "Fire Range Cooldown" "0" + "Ammo Chance" "33.3" + "Ammo Cooldown" "0" + "Ammo Count" "0" + "Ammo Hit" "0" + "Ammo Hit Mode" "0" + "Ammo Range" "150.0" + "Ammo Range Chance" "15.0" + "Ammo Range Cooldown" "0" + "Ammo Type" "3" } } } @@ -13258,7 +11768,7 @@ ```
-##### Fling Ability +##### Bomb Ability
Click to expand! @@ -13267,21 +11777,23 @@ { "Tank #1" { - // The Mutant Tank flings survivors high into the air. - // "Ability Enabled" - When a survivor is within range of the Mutant Tank, the survivor is flung into the air. - // - "Fling Range" - // - "Fling Range Chance" - // - "Fling Range Cooldown" - // "Fling Death" - When the Mutant Tank dies or spawns, nearby survivors are flung into the air. - // - "Fling Death Chance" - // - "Fling Death Range" - // "Fling Hit" - When a survivor is hit by the Mutant Tank's claw or rock, or a survivor hits the Mutant Tank with a melee weapon, the survivor is flung into the air. - // - "Fling Chance" - // - "Fling Cooldown" - // - "Fling Hit Mode" - // Requires "mt_abilities.smx" to be compiled with "mt_fling.sp" to work. - // Note: Only available in Left 4 Dead 2. - "Fling Ability" + // The Mutant Tank creates explosions. + // "Ability Enabled" - When a survivor is within range of the Mutant Tank, an explosion is created around the survivor. + // - "Bomb Range" + // - "Bomb Range Chance" + // - "Bomb Range Cooldown" + // "Bomb Death" - When the Mutant Tank dies or spawns, an explosion is created underneath the Mutant Tank. + // - "Bomb Death Chance" + // - "Bomb Death Range" + // "Bomb Hit" - When a survivor is hit by the Mutant Tank's claw or rock, or a survivor hits the Mutant Tank with a melee weapon, an explosion is created around the survivor. + // - "Bomb Chance" + // - "Bomb Cooldown" + // - "Bomb Hit Mode" + // "Bomb Rock Break" - When the Mutant Tank's rock breaks, it creates an explosion. + // - "Bomb Rock Chance" + // - "Bomb Rock Cooldown" + // Requires "mt_abilities.smx" to be compiled with "mt_bomb.sp" to work. + "Bomb Ability" { // Admins with one or more of these access flags have access to this ability. // Note: This setting can be overridden for specific players. @@ -13338,7 +11850,7 @@ // "infinite" - 99999 ammo "Human Ammo" "5" - // Human-controlled Mutant Tanks must wait this long before using their abilities again. + // Human-controlled Mutant Tanks must wait this long before using their hit ability again. // Note: This setting can be overridden for specific players. // -- // Minimum: 0 (OFF) @@ -13364,6 +11876,19 @@ // "forever" - 99999 seconds "Human Range Cooldown" "0" + // Human-controlled Mutant Tanks must wait this long before using their rock ability again. + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0 (OFF) + // Maximum: 99999 (Longest) + // -- + // Keywords: + // "never"/"disabled"/"false"/"off"/"no" - 0 seconds + // "second" - 1 second + // "minute" - 1 minute + // "forever" - 99999 seconds + "Human Rock Cooldown" "0" + // The ability can only activate in open areas. // Note: Do not change this setting if you are unsure of how it works. // Note: This setting can be overridden for specific players. @@ -13376,18 +11901,18 @@ // "farthest" - 99999.0 range "Open Areas Only" "0.0" - // The ability is only effective toward human survivors. + // The ability is only effective toward human-controlled survivors. // Note: This setting can be overridden for specific players. // -- // Minimum: 0 // Maximum: 32 // -- // 0: OFF - // 1-32: ON, the number of human survivors required to be present for this ability to be effective. + // 1-32: ON, the number of human-controlled survivors required to be present for this ability to be effective. "Requires Humans" "0" // Enable this ability. - // Note: This setting does not affect the "Fling Hit" setting. + // Note: This setting does not affect the "Bomb Hit" setting. // Note: This setting can be overridden for specific players. // -- // 0/"disabled"/"false"/"off"/"no": OFF @@ -13419,23 +11944,28 @@ // "attack,hurt,range" - 7 "Ability Effect" "0" - // Display a message whenever the ability activates/deactivates. + // Display a message whenever the abilities activate/deactivate. // Note: This setting can be overridden for specific players. // -- // Add up numbers together for different results. // -- // Minimum: 0 - // Maximum: 3 + // Maximum: 7 // -- // 0: OFF - // 1: Display message only when "Fling Hit" is enabled. + // 1: Display message only when "Bomb Hit" is enabled. // 2: Display message only when "Ability Enabled" is enabled. + // 4: Display message only when "Bomb Rock Break" is enabled. // -- // Keywords: // "none"/"off" - 0 // "hit" - 1 // "ability" - 2 - // "both"/"all"/"hit,ability" - 3 + // "hit,ability" - 3 + // "rock" - 4 + // "hit,rock" - 5 + // "ability,rock" - 6 + // "hit,ability,rock"/"all" - 7 "Ability Message" "0" // Check line-of-sight when the Mutant Tank uses its abilities. @@ -13465,7 +11995,7 @@ // "maybe" - 50% chance // "often"/"likely"/"frequently" - 66.6% chance // "always" - 100% chance - "Fling Chance" "33.3" + "Bomb Chance" "33.3" // The cooldown for the Mutant Tank's hit ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -13479,7 +12009,19 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Fling Cooldown" "0" + "Bomb Cooldown" "0" + + // The Mutant Tank's bomb explosions do this much damage. + // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0.0 (OFF) + // Maximum: 99999.0 + // -- + // Keywords: + // "weakest" - 1.0 damage + // "strongest" - 99999.0 damage + "Bomb Damage" "3.0" // Enable the Mutant Tank's upon-death range ability. // Note: This setting does not need the "Ability Enabled" setting to be set to "1". @@ -13493,7 +12035,7 @@ // 0: OFF // 1: Trigger the range ability when the Mutant Tank dies. // 2: Trigger the range ability when the Mutant Tank spawns. - "Fling Death" "1" + "Bomb Death" "1" // The Mutant Tank has this many chances out of 100.0% to trigger the upon-death ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -13508,7 +12050,7 @@ // "maybe" - 50% chance // "often"/"likely"/"frequently" - 66.6% chance // "always" - 100% chance - "Fling Death Chance" "33.3" + "Bomb Death Chance" "33.3" // The distance between a survivor and the Mutant Tank needed to trigger the upon-death ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -13520,15 +12062,7 @@ // Keywords: // "closest" - 1.0 range // "farthest" - 99999.0 range - "Fling Death Range" "200.0" - - // The force of the Mutant Tank's ability. - // Note: This setting determines how powerful the force is. - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0.1 - // Maximum: 99999.0 - "Fling Force" "300.0" + "Bomb Death Range" "200.0" // Enable the Mutant Tank's claw/rock attack. // Note: This setting does not need the "Ability Enabled" setting to be set to "1". @@ -13536,7 +12070,7 @@ // -- // 0/"disabled"/"false"/"off"/"no": OFF // 1/"enabled"/"true"/"on"/"yes": ON - "Fling Hit" "0" + "Bomb Hit" "0" // The mode of the Mutant Tank's claw/rock attack. // Note: This setting can be overridden for specific players. @@ -13549,21 +12083,58 @@ // "both"/"all" - 0 // "tank"/"attack" - 1 // "survivor"/"hurt" - 2 - "Fling Hit Mode" "0" + "Bomb Hit Mode" "0" + + // The distance between a survivor and the Mutant Tank needed to trigger the ability. + // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 1.0 (Closest) + // Maximum: 99999.0 (Farthest) + // -- + // Keywords: + // "closest" - 1.0 range + // "farthest" - 99999.0 range + "Bomb Range" "150.0" + + // The Mutant Tank has this many chances out of 100.0% to trigger the range ability. + // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0.0 (No chance) + // Maximum: 100.0 (Highest chance) + // -- + // Keywords: + // "never" - 0% chance + // "sometimes"/"unlikely"/"seldom" - 33.3% chance + // "maybe" - 50% chance + // "often"/"likely"/"frequently" - 66.6% chance + // "always" - 100% chance + "Bomb Range Chance" "15.0" + + // The cooldown for the Mutant Tank's range ability. + // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0 (OFF) + // Maximum: 99999 (Longest) + // -- + // Keywords: + // "never"/"disabled"/"false"/"off"/"no" - 0 seconds + // "second" - 1 second + // "minute" - 1 minute + // "forever" - 99999 seconds + "Bomb Range Cooldown" "0" - // The distance between a survivor and the Mutant Tank needed to trigger the ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // The Mutant Tank's rock creates an explosion when it breaks. + // Note: This does not need "Ability Enabled" or "Bomb Hit" to be set to "1". // Note: This setting can be overridden for specific players. // -- - // Minimum: 1.0 (Closest) - // Maximum: 99999.0 (Farthest) - // -- - // Keywords: - // "closest" - 1.0 range - // "farthest" - 99999.0 range - "Fling Range" "150.0" + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Bomb Rock Break" "0" - // The Mutant Tank has this many chances out of 100.0% to trigger the range ability. + // The Mutant Tank's rock has this many chances out of 100.0% to trigger the rock break ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- @@ -13576,9 +12147,9 @@ // "maybe" - 50% chance // "often"/"likely"/"frequently" - 66.6% chance // "always" - 100% chance - "Fling Range Chance" "15.0" + "Bomb Rock Chance" "33.3" - // The cooldown for the Mutant Tank's range ability. + // The cooldown for the Mutant Tank's rock ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- @@ -13590,11 +12161,11 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Fling Range Cooldown" "0" + "Bomb Rock Cooldown" "0" "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" { - // Note: Override any of the settings in the "Fling Ability" section for each special infected here. + // Note: Override any of the settings in the "Bomb Ability" section for each special infected here. // Example "Access Flags" "" @@ -13604,6 +12175,7 @@ "Human Ability" "0" "Human Ammo" "5" "Human Cooldown" "0" + "Human Pin Cooldown" "0" "Human Range Cooldown" "0" "Open Areas Only" "0.0" "Requires Humans" "0" @@ -13611,17 +12183,20 @@ "Ability Effect" "0" "Ability Message" "0" "Ability Sight" "0" - "Fling Chance" "33.3" - "Fling Cooldown" "0" - "Fling Death" "1" - "Fling Death Chance" "33.3" - "Fling Death Range" "200.0" - "Fling Force" "300.0" - "Fling Hit" "0" - "Fling Hit Mode" "0" - "Fling Range" "150.0" - "Fling Range Chance" "15.0" - "Fling Range Cooldown" "0" + "Bomb Chance" "33.3" + "Bomb Cooldown" "0" + "Bomb Damage" "3.0" + "Bomb Death" "1" + "Bomb Death Chance" "33.3" + "Bomb Death Range" "200.0" + "Bomb Hit" "0" + "Bomb Hit Mode" "0" + "Bomb Pin" "0" + "Bomb Pin Chance" "33.3" + "Bomb Pin Cooldown" "0" + "Bomb Range" "150.0" + "Bomb Range Chance" "15.0" + "Bomb Range Cooldown" "0" } } } @@ -13629,7 +12204,7 @@ ```
-##### Fly Ability +##### Bury Ability
Click to expand! @@ -13638,9 +12213,17 @@ { "Tank #1" { - // The Mutant Tank can fly. - // Requires "mt_abilities.smx" to be compiled with "mt_fly.sp" to work. - "Fly Ability" + // The Mutant Tank buries survivors. + // "Ability Enabled" - When a survivor is within range of the Mutant Tank, the survivor is buried. + // - "Bury Range" + // - "Bury Range Chance" + // - "Bury Range Cooldown" + // "Bury Hit" - When a survivor is hit by the Mutant Tank's claw or rock, or a survivor hits the Mutant Tank with a melee weapon, the survivor is buried. + // - "Bury Chance" + // - "Bury Cooldown" + // - "Bury Hit Mode" + // Requires "mt_abilities.smx" to be compiled with "mt_bury.sp" to work. + "Bury Ability" { // Admins with one or more of these access flags have access to this ability. // Note: This setting can be overridden for specific players. @@ -13710,25 +12293,18 @@ // "forever" - 99999 seconds "Human Cooldown" "0" - // The Mutant Tank's ability effects last this long. - // Note: This setting does not affect human-controlled Mutant Tanks unless the "Human Mode" setting is set to "0". + // Human-controlled Mutant Tanks must wait this long before using their range ability again. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 - // Maximum: 99999 + // Minimum: 0 (OFF) + // Maximum: 99999 (Longest) // -- // Keywords: + // "never"/"disabled"/"false"/"off"/"no" - 0 seconds // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Human Duration" "30" - - // The mode of how human-controlled Mutant Tanks activate their abilities. - // Note: This setting can be overridden for specific players. - // -- - // 0: Press buttons to activate corresponding abilities. Cooldown starts after ability is activated. - // 1: Hold down buttons to keep corresponding abilities activated. Cooldown starts after the player lets go of the buttons. - "Human Mode" "1" + "Human Range Cooldown" "0" // The ability can only activate in open areas. // Note: Do not change this setting if you are unsure of how it works. @@ -13742,30 +12318,89 @@ // "farthest" - 99999.0 range "Open Areas Only" "0.0" - // The ability is only effective toward human survivors. + // The ability is only effective toward human-controlled survivors. // Note: This setting can be overridden for specific players. // -- // Minimum: 0 // Maximum: 32 // -- // 0: OFF - // 1-32: ON, the number of human survivors required to be present for this ability to be effective. + // 1-32: ON, the number of human-controlled survivors required to be present for this ability to be effective. "Requires Humans" "0" // Enable this ability. + // Note: This setting does not affect the "Bury Hit" setting. // Note: This setting can be overridden for specific players. // -- // 0/"disabled"/"false"/"off"/"no": OFF // 1/"enabled"/"true"/"on"/"yes": ON "Ability Enabled" "0" + // Show a screen fade effect when the Mutant Tank uses its abilities. + // Note: The colors will randomly change between the colors set in the "Skin Color" and "Glow Color" settings. + // Note: This setting can be overridden for specific players. + // -- + // Add up numbers together for different results. + // -- + // Minimum: 0 + // Maximum: 7 + // -- + // 0: OFF + // 1: Show effect when the Mutant Tank uses its claw/rock attack. + // 2: Show effect when the Mutant Tank is hit by a melee weapon. + // 4: Show effect when the Mutant Tank uses its range ability. + // -- + // Keywords: + // "none"/"off" - 0 + // "attack" - 1 + // "hurt" - 2 + // "attack,hurt" - 3 + // "range" - 4 + // "attack,range" - 5 + // "hurt,range" - 6 + // "attack,hurt,range" - 7 + "Ability Effect" "0" + // Display a message whenever the ability activates/deactivates. // Note: This setting can be overridden for specific players. // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON + // Add up numbers together for different results. + // -- + // Minimum: 0 + // Maximum: 3 + // -- + // 0: OFF + // 1: Display message only when "Bury Hit" is enabled. + // 2: Display message only when "Ability Enabled" is enabled. + // -- + // Keywords: + // "none"/"off" - 0 + // "hit" - 1 + // "ability" - 2 + // "both"/"all"/"hit,ability" - 3 "Ability Message" "0" + // Check line-of-sight when the Mutant Tank uses its abilities. + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0 + // Maximum: 5 + // -- + // 0: OFF + // 1: Check if there is a solid object between the Mutant Tank and survivors. + // 2: Option 1 + Check if the Mutant Tank is looking toward the survivors. + // 3: Option 1 + Check if the Mutant Tank is looking away from the survivors. + // 4: Option 1 + Check if the survivors are looking toward the Mutant Tank. + // 5: Option 1 + Check if the survivors are looking away from the Mutant Tank. + "Ability Sight" "0" + + // The amount of temporary health given to survivors recovering from the Mutant Tank's bury ability. + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0.0 (OFF) + // Maximum: 1000000.0 + "Bury Buffer" "100.0" + // The Mutant Tank has this many chances out of 100.0% to trigger the ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. @@ -13779,9 +12414,9 @@ // "maybe" - 50% chance // "often"/"likely"/"frequently" - 66.6% chance // "always" - 100% chance - "Fly Chance" "33.3" + "Bury Chance" "33.3" - // The cooldown for the Mutant Tank's ability. + // The cooldown for the Mutant Tank's hit ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- @@ -13793,48 +12428,98 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Fly Cooldown" "0" + "Bury Cooldown" "0" // The Mutant Tank's ability effects last this long. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 - // Maximum: 99999 + // Minimum: 0.1 + // Maximum: 99999.0 // -- // Keywords: + // "milli"/"millisecond" - 0.1 seconds // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Fly Duration" "30" + "Bury Duration" "5.0" - // The Mutant Tank's flight ability is this fast. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // The Mutant Tank buries survivors this deep into the ground. // Note: This setting can be overridden for specific players. // -- // Minimum: 0.1 // Maximum: 99999.0 - "Fly Speed" "500.0" + // -- + // Keywords: + // "shortest" - 0.1 height + // "tallest" - 99999.0 height + "Bury Height" "50.0" - // The type of event that triggers the Mutant Tank's flight ability. - // Note: This setting does not affect human-controlled Tanks. + // Enable the Mutant Tank's claw/rock attack. + // Note: This setting does not need the "Ability Enabled" setting to be set to "1". // Note: This setting can be overridden for specific players. // -- - // Add up numbers together for different results. + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Bury Hit" "0" + + // The mode of the Mutant Tank's claw/rock attack. + // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 - // Maximum: 15 + // 0: Both + // 1: Ability activates when the Mutant Tank hits a survivor. + // 2: Ability activates when the Mutant Tank is hit by a survivor. // -- - // 0 OR 15: All types of events. - // 1: When the Mutant Tank hurts a survivor. - // 2: When a survivor hurts a Mutant Tank. - // 4: When the Mutant Tank throws a rock. - // 8: When the Mutant Tank jumps. - "Fly Type" "0" + // Keywords: + // "both"/"all" - 0 + // "tank"/"attack" - 1 + // "survivor"/"hurt" - 2 + "Bury Hit Mode" "0" + + // The distance between a survivor and the Mutant Tank needed to trigger the ability. + // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 1.0 (Closest) + // Maximum: 99999.0 (Farthest) + // -- + // Keywords: + // "closest" - 1.0 range + // "farthest" - 99999.0 range + "Bury Range" "150.0" + + // The Mutant Tank has this many chances out of 100.0% to trigger the range ability. + // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0.0 (No chance) + // Maximum: 100.0 (Highest chance) + // -- + // Keywords: + // "never" - 0% chance + // "sometimes"/"unlikely"/"seldom" - 33.3% chance + // "maybe" - 50% chance + // "often"/"likely"/"frequently" - 66.6% chance + // "always" - 100% chance + "Bury Range Chance" "15.0" + + // The cooldown for the Mutant Tank's range ability. + // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0 (OFF) + // Maximum: 99999 (Longest) + // -- + // Keywords: + // "never"/"disabled"/"false"/"off"/"no" - 0 seconds + // "second" - 1 second + // "minute" - 1 minute + // "forever" - 99999 seconds + "Bury Range Cooldown" "0" "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" { - // Note: Override any of the settings in the "Fly Ability" section for each special infected here. + // Note: Override any of the settings in the "Bury Ability" section for each special infected here. // Example "Access Flags" "" @@ -13844,17 +12529,23 @@ "Human Ability" "0" "Human Ammo" "5" "Human Cooldown" "0" - "Human Duration" "30" - "Human Mode" "1" + "Human Range Cooldown" "0" "Open Areas Only" "0.0" "Requires Humans" "0" "Ability Enabled" "0" + "Ability Effect" "0" "Ability Message" "0" - "Fly Chance" "33.3" - "Fly Cooldown" "0" - "Fly Duration" "30" - "Fly Speed" "500.0" - "Fly Type" "0" + "Ability Sight" "0" + "Bury Buffer" "100.0" + "Bury Chance" "33.3" + "Bury Cooldown" "0" + "Bury Duration" "5.0" + "Bury Height" "50.0" + "Bury Hit" "0" + "Bury Hit Mode" "0" + "Bury Range" "150.0" + "Bury Range Chance" "15.0" + "Bury Range Cooldown" "0" } } } @@ -13862,7 +12553,7 @@ ```
-##### Fragile Ability +##### Car Ability
Click to expand! @@ -13871,9 +12562,9 @@ { "Tank #1" { - // The Mutant Tank takes more damage while dealing more damage and running faster. - // Requires "mt_abilities.smx" to be compiled with "mt_fragile.sp" to work. - "Fragile Ability" + // The Mutant Tank creates car showers. + // Requires "mt_abilities.smx" to be compiled with "mt_car.sp" to work. + "Car Ability" { // Admins with one or more of these access flags have access to this ability. // Note: This setting can be overridden for specific players. @@ -13959,8 +12650,9 @@ // The mode of how human-controlled Mutant Tanks activate their abilities. // Note: This setting can be overridden for specific players. // -- - // 0: Press buttons to activate corresponding abilities. Cooldown starts after ability is activated. + // 0: Press buttons to activate corresponding abilities. Cooldown starts after ability's duration ends. // 1: Hold down buttons to keep corresponding abilities activated. Cooldown starts after the player lets go of the buttons. + // 2: Press buttons to toggle corresponding abilities. Cooldown starts after ability is deactivated. "Human Mode" "1" // The ability can only activate in open areas. @@ -13975,15 +12667,15 @@ // "farthest" - 99999.0 range "Open Areas Only" "0.0" - // The ability is only effective toward human survivors. + // The ability is only effective toward human-controlled survivors. // Note: This setting can be overridden for specific players. // -- // Minimum: 0 // Maximum: 32 // -- // 0: OFF - // 1-32: ON, the number of human survivors required to be present for this ability to be effective. - "Requires Humans" "0" + // 1-32: ON, the number of human-controlled survivors required to be present for this ability to be effective. + "Requires Humans" "1" // Enable this ability. // Note: This setting can be overridden for specific players. @@ -13999,16 +12691,6 @@ // 1/"enabled"/"true"/"on"/"yes": ON "Ability Message" "0" - // The bullet damage received by the Mutant Tank is multiplied by this value. - // Note: Damage = Bullet damage x Fragile bullet multiplier - // Example: Damage = 30.0 x 5.0 = 150.0 - // Note: Use the value "1.0" to disable this setting. (Bullet damage x 1.0 = Bullet damage) - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 1.0 - // Maximum: 99999.0 - "Fragile Bullet Multiplier" "5.0" - // The Mutant Tank has this many chances out of 100.0% to trigger the ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. @@ -14022,7 +12704,7 @@ // "maybe" - 50% chance // "often"/"likely"/"frequently" - 66.6% chance // "always" - 100% chance - "Fragile Chance" "33.3" + "Car Chance" "33.3" // The cooldown for the Mutant Tank's ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -14036,14 +12718,19 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Fragile Cooldown" "0" + "Car Cooldown" "0" - // The Mutant Tank's damage boost value when fragile. + // Cars dropped by the Mutant Tank's car shower deal this much damage per hit. + // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.1 + // Minimum: 0.0 (OFF) // Maximum: 99999.0 - "Fragile Damage Boost" "5.0" + // -- + // Keywords: + // "weakest" - 1.0 damage + // "strongest" - 99999.0 damage + "Car Damage" "5.0" // The Mutant Tank's ability effects last this long. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -14056,69 +12743,69 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Fragile Duration" "5" + "Car Duration" "5" - // The explosive damage received by the Mutant Tank is multiplied by this value. - // Note: Damage = Explosive damage x Fragile explosive multiplier - // Example: Damage = 30.0 x 5.0 = 150.0 - // Note: Use the value "1.0" to disable this setting. (Explosive damage x 1.0 = Explosive damage) + // The Mutant Tank's car shower drops a car every time this many seconds passes. + // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- - // Minimum: 1.0 - // Maximum: 99999.0 - "Fragile Explosive Multiplier" "5.0" + // Minimum: 0.1 + // Maximum: 1.0 + "Car Interval" "0.6" - // The fire damage received by the Mutant Tank is multiplied by this value. - // Note: Damage = Fire damage x Fragile fire multiplier - // Example: Damage = 30.0 x 3.0 = 90.0 - // Note: Use the value "1.0" to disable this setting. (Fire damage x 1.0 = Fire damage) + // Cars dropped by the Mutant Tank's car shower will disappear after this many seconds. + // Note: The timer starts when the car spawns, so take into account the time it takes to fall to the ground. // Note: This setting can be overridden for specific players. // -- - // Minimum: 1.0 + // Minimum: 0.1 // Maximum: 99999.0 - "Fragile Fire Multiplier" "3.0" - - // The hittable damage received by the Mutant Tank is multiplied by this value. - // Note: Damage = Hittable damage x Fragile hittable multiplier - // Example: Damage = 100.0 x 1.5 = 150.0 - // Note: Use the value "1.0" to disable this setting. (Hittable damage x 1.0 = Hittable damage) - // Note: This setting can be overridden for specific players. // -- - // Minimum: 1.0 - // Maximum: 99999.0 - "Fragile Hittable Multiplier" "1.5" + // Keywords: + // "milli"/"millisecond" - 0.1 seconds + // "second" - 1 second + // "minute" - 1 minute + // "forever" - 99999 seconds + "Car Lifetime" "30.0" - // The melee damage received by the Mutant Tank is multiplied by this value. - // Note: Damage = Melee damage x Fragile melee multiplier - // Example: Damage = 100.0 x 1.5 = 150.0 - // Note: Use the value "1.0" to disable this setting. (Melee damage x 1.0 = Melee damage) + // The Mutant Tank create car showers with these cars. // Note: This setting can be overridden for specific players. // -- - // Minimum: 1.0 - // Maximum: 99999.0 - "Fragile Melee Multiplier" "1.5" + // Add up numbers together for different results. + // -- + // Minimum: 0 + // Maximum: 7 + // -- + // 0 OR 7: Pick randomly between the 3 cars. + // 1: Small car with a big hatchback. + // 2: Car that looks like a Chevrolet Impala SS. + // 4: Car that looks like a Sixth Generation Chevrolet Impala. + "Car Options" "0" - // The mode of the Mutant Tank's damage and speed boosts. + // Set the Mutant Tank as the owner of its cars. + // Note: This setting is only used for compatibility with Marttt's "Replace Cars Into Car Alarms" plugin. Disable this setting if you do not use that plugin. + // Link: https://forums.alliedmods.net/showthread.php?t=329806 // Note: This setting can be overridden for specific players. // -- - // 0: - // Mutant Tank's damage = Claw/rock damage + Fragile damage boost - // Mutant Tank's speed = Run speed + Fragile speed boost - // 1: - // Mutant Tank's damage = Fragile damage boost - // Mutant Tank's speed = Fragile speed boost - "Fragile Mode" "0" + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Car Owner" "1" - // The Mutant Tank's speed boost value when fragile. + // The radius of the Mutant Tank's car shower. + // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.1 - // Maximum: 3.0 - "Fragile Speed Boost" "1.0" + // 1st number = Minimum radius + // Minimum: -200.0 + // Maximum: 0.0 + // -- + // 2nd number = Maximum radius + // Minimum: 0.0 + // Maximum: 200.0 + "Car Radius" "-180.0,180.0" "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" { - // Note: Override any of the settings in the "Fragile Ability" section for each special infected here. + // Note: Override any of the settings in the "Car Ability" section for each special infected here. // Example "Access Flags" "" @@ -14128,23 +12815,21 @@ "Human Ability" "0" "Human Ammo" "5" "Human Cooldown" "0" - "Human Duration" "30" + "Human Duration" "5" "Human Mode" "1" "Open Areas Only" "0.0" - "Requires Humans" "0" + "Requires Humans" "1" "Ability Enabled" "0" "Ability Message" "0" - "Fragile Bullet Multiplier" "5.0" - "Fragile Chance" "33.3" - "Fragile Cooldown" "0" - "Fragile Damage Boost" "5.0" - "Fragile Duration" "5" - "Fragile Explosive Multiplier" "5.0" - "Fragile Fire Multiplier" "3.0" - "Fragile Hittable Multiplier" "1.5" - "Fragile Melee Multiplier" "1.5" - "Fragile Mode" "0" - "Fragile Speed Boost" "1.0" + "Car Chance" "33.3" + "Car Cooldown" "0" + "Car Damage" "5.0" + "Car Duration" "5" + "Car Interval" "0.6" + "Car Lifetime" "30.0" + "Car Options" "0" + "Car Owner" "1" + "Car Radius" "-180.0,180.0" } } } @@ -14152,7 +12837,7 @@ ```
-##### Ghost Ability +##### Choke Ability
Click to expand! @@ -14161,27 +12846,17 @@ { "Tank #1" { - // The Mutant Tank cloaks itself and nearby special infected, and disarms survivors. - // "Ability Enabled" - When the Mutant Tank spawns, it becomes invisible. - // - "Ghost Duration" - // - "Ghost Fade Alpha" - // - "Ghost Fade Delay" - // - "Ghost Fade Limit" - // - "Ghost Fade Phase" - // - "Ghost Fade Rate" - // - "Ghost Specials" - // - "Ghost Specials Chance" - // - "Ghost Specials Range" - // "Ability Enabled" - When a survivor is within range of the Mutant Tank, the survivor is disarmed. - // - "Ghost Range" - // - "Ghost Range Chance" - // - "Ghost Range Cooldown" - // "Ghost Hit" - When a survivor is hit by the Mutant Tank's claw or rock, or a survivor hits the Mutant Tank with a melee weapon, the survivor is disarmed. - // - "Ghost Chance" - // - "Ghost Cooldown" - // - "Ghost Hit Mode" - // Requires "mt_abilities.smx" to be compiled with "mt_ghost.sp" to work. - "Ghost Ability" + // The Mutant Tank chokes survivors in midair. + // "Ability Enabled" - When a survivor is within range of the Mutant Tank, the survivor is choked in the air. + // - "Choke Range" + // - "Choke Range Chance" + // - "Choke Range Cooldown" + // "Choke Hit" - When a survivor is hit by the Mutant Tank's claw or rock, or a survivor hits the Mutant Tank with a melee weapon, the survivor is choked in the air. + // - "Choke Chance" + // - "Choke Cooldown" + // - "Choke Hit Mode" + // Requires "mt_abilities.smx" to be compiled with "mt_choke.sp" to work. + "Choke Ability" { // Admins with one or more of these access flags have access to this ability. // Note: This setting can be overridden for specific players. @@ -14251,27 +12926,6 @@ // "forever" - 99999 seconds "Human Cooldown" "0" - // The Mutant Tank's ability effects last this long. - // Note: This setting does not affect human-controlled Mutant Tanks unless the "Human Mode" setting is set to "0". - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0 - // Maximum: 99999 - // -- - // Keywords: - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Human Duration" "5" - - // The mode of how human-controlled Mutant Tanks activate their abilities. - // Note: This setting does not apply to the range ability. - // Note: This setting can be overridden for specific players. - // -- - // 0: Press buttons to activate corresponding abilities. Cooldown starts after ability is activated. - // 1: Hold down buttons to keep corresponding abilities activated. Cooldown starts after the player lets go of the buttons. - "Human Mode" "1" - // Human-controlled Mutant Tanks must wait this long before using their range ability again. // Note: This setting can be overridden for specific players. // -- @@ -14297,24 +12951,22 @@ // "farthest" - 99999.0 range "Open Areas Only" "0.0" - // The ability is only effective toward human survivors. + // The ability is only effective toward human-controlled survivors. // Note: This setting can be overridden for specific players. // -- // Minimum: 0 // Maximum: 32 // -- // 0: OFF - // 1-32: ON, the number of human survivors required to be present for this ability to be effective. + // 1-32: ON, the number of human-controlled survivors required to be present for this ability to be effective. "Requires Humans" "0" // Enable this ability. - // Note: This setting does not affect the "Ghost Hit" setting. + // Note: This setting does not affect the "Choke Hit" setting. // Note: This setting can be overridden for specific players. // -- - // 0: OFF - // 1: ON, the Mutant Tank can disarm survivors. - // 2: ON, the Mutant Tank can cloak itself and nearby special infected. - // 3: ON, the Mutant Tank can do both. + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON "Ability Enabled" "0" // Show a screen fade effect when the Mutant Tank uses its abilities. @@ -14342,28 +12994,23 @@ // "attack,hurt,range" - 7 "Ability Effect" "0" - // Display a message whenever the abilities activate/deactivate. + // Display a message whenever the ability activates/deactivates. // Note: This setting can be overridden for specific players. // -- // Add up numbers together for different results. // -- // Minimum: 0 - // Maximum: 7 + // Maximum: 3 // -- // 0: OFF - // 1: Display message only when "Ghost Hit" is enabled. - // 2: Display message only when "Ability Enabled" is set to "1" or "3". - // 4: Display message only when "Ability Enabled" is set to "2" or "3". + // 1: Display message only when "Choke Hit" is enabled. + // 2: Display message only when "Ability Enabled" is enabled. // -- // Keywords: // "none"/"off" - 0 // "hit" - 1 // "ability" - 2 - // "hit,ability" - 3 - // "rock" - 4 - // "hit,rock" - 5 - // "ability,rock" - 6 - // "hit,ability,rock"/"all" - 7 + // "both"/"all"/"hit,ability" - 3 "Ability Message" "0" // Check line-of-sight when the Mutant Tank uses its abilities. @@ -14380,6 +13027,13 @@ // 5: Option 1 + Check if the survivors are looking away from the Mutant Tank. "Ability Sight" "0" + // Block the fall damage of the Mutant Tank's ability. + // Note: This setting can be overridden for specific players. + // -- + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Choke Block" "1" + // The Mutant Tank has this many chances out of 100.0% to trigger the ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. @@ -14393,9 +13047,9 @@ // "maybe" - 50% chance // "often"/"likely"/"frequently" - 66.6% chance // "always" - 100% chance - "Ghost Chance" "33.3" + "Choke Chance" "33.3" - // The cooldown for the Mutant Tank's main/hit ability. + // The cooldown for the Mutant Tank's hit ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- @@ -14407,30 +13061,35 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Ghost Cooldown" "0" + "Choke Cooldown" "0" - // The Mutant Tank's ability effects last this long. + // The Mutant Tank's chokes do this much damage. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 - // Maximum: 99999 + // Minimum: 0.0 (OFF) + // Maximum: 99999.0 + // -- + // Keywords: + // "weakest" - 1.0 damage + // "strongest" - 99999.0 damage + "Choke Damage" "5.0" + + // The Mutant Tank chokes survivors in the air after this many seconds passes upon triggering the ability. + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0.1 + // Maximum: 99999.0 // -- // Keywords: + // "milli"/"millisecond" - 0.1 seconds // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Ghost Duration" "0" - - // The amount of alpha to take from the Mutant Tank's alpha every X seconds until the limit set by the "Ghost Fade Limit" is reached. - // Note: The rate at which the Mutant Tank's alpha is reduced depends on the "Ghost Fade Rate" setting. - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0 (No effect) - // Maximum: 255 (Fully faded) - "Ghost Fade Alpha" "2" + "Choke Delay" "1.0" - // The Mutant Tank's ghost fade effect starts all over after this many seconds passes upon reaching the limit set by the "Ghost Fade Limit" setting. + // The Mutant Tank's ability effects last this long. + // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- // Minimum: 1 @@ -14440,28 +13099,7 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Ghost Fade Delay" "5" - - // The limit of the Mutant Tank's ghost fade effect. - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0 (Fully faded) - // Maximum: 255 (No effect) - "Ghost Fade Limit" "0" - - // The Mutant Tank can phase through all damage during the ghost fade effect. - // Note: This setting can be overridden for specific players. - // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Ghost Fade Phase" "0" - - // The rate of the Mutant Tank's ghost fade effect. - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0.1 (Fastest) - // Maximum: 99999.0 (Slowest) - "Ghost Fade Rate" "0.1" + "Choke Duration" "5" // Enable the Mutant Tank's claw/rock attack. // Note: This setting does not need the "Ability Enabled" setting to be set to "1". @@ -14469,7 +13107,7 @@ // -- // 0/"disabled"/"false"/"off"/"no": OFF // 1/"enabled"/"true"/"on"/"yes": ON - "Ghost Hit" "0" + "Choke Hit" "0" // The mode of the Mutant Tank's claw/rock attack. // Note: This setting can be overridden for specific players. @@ -14482,7 +13120,7 @@ // "both"/"all" - 0 // "tank"/"attack" - 1 // "survivor"/"hurt" - 2 - "Ghost Hit Mode" "0" + "Choke Hit Mode" "0" // The distance between a survivor and the Mutant Tank needed to trigger the ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -14494,7 +13132,7 @@ // Keywords: // "closest" - 1.0 range // "farthest" - 99999.0 range - "Ghost Range" "150.0" + "Choke Range" "150.0" // The Mutant Tank has this many chances out of 100.0% to trigger the range ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -14509,7 +13147,7 @@ // "maybe" - 50% chance // "often"/"likely"/"frequently" - 66.6% chance // "always" - 100% chance - "Ghost Range Chance" "15.0" + "Choke Range Chance" "15.0" // The cooldown for the Mutant Tank's range ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -14523,60 +13161,11 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Ghost Range Cooldown" "0" - - // The Mutant Tank can cloak nearby special infected. - // Note: This setting needs "Ability Enabled" to be set to "2" or higher than "3". - // Note: This setting can be overridden for specific players. - // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Ghost Specials" "1" - - // The Mutant Tank has this many chances out of 100.0% to cloak nearby special infected. - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0.0 (No chance) - // Maximum: 100.0 (Highest chance) - // -- - // Keywords: - // "never" - 0% chance - // "sometimes"/"unlikely"/"seldom" - 33.3% chance - // "maybe" - 50% chance - // "often"/"likely"/"frequently" - 66.6% chance - // "always" - 100% chance - "Ghost Specials Chance" "33.3" - - // The distance between a special infected and the Mutant Tank needed to cloak that special infected. - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 1.0 (Closest) - // Maximum: 99999.0 (Farthest) - // -- - // Keywords: - // "closest" - 1.0 range - // "farthest" - 99999.0 range - "Ghost Specials Range" "500.0" - - // The Mutant Tank disarms the following weapon slots. - // Note: This setting can be overridden for specific players. - // -- - // Add up numbers together for different results. - // -- - // Minimum: 0 - // Maximum: 31 - // -- - // 0 OR 31: All 5 slots. - // 1: 1st slot only. - // 2: 2nd slot only. - // 4: 3rd slot only. - // 8: 4th slot only. - // 16: 5th slot only. - "Ghost Weapon Slots" "0" + "Choke Range Cooldown" "0" "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" { - // Note: Override any of the settings in the "Ghost Ability" section for each special infected here. + // Note: Override any of the settings in the "Choke Ability" section for each special infected here. // Example "Access Flags" "" @@ -14586,8 +13175,6 @@ "Human Ability" "0" "Human Ammo" "5" "Human Cooldown" "0" - "Human Duration" "30" - "Human Mode" "1" "Human Range Cooldown" "0" "Open Areas Only" "0.0" "Requires Humans" "0" @@ -14595,23 +13182,17 @@ "Ability Effect" "0" "Ability Message" "0" "Ability Sight" "0" - "Ghost Chance" "33.3" - "Ghost Cooldown" "0" - "Ghost Duration" "0" - "Ghost Fade Alpha" "2" - "Ghost Fade Delay" "5" - "Ghost Fade Limit" "0" - "Ghost Fade Phase" "0" - "Ghost Fade Rate" "0.1" - "Ghost Hit" "0" - "Ghost Hit Mode" "0" - "Ghost Range" "150.0" - "Ghost Range Chance" "15.0" - "Ghost Range Cooldown" "0" - "Ghost Specials" "1" - "Ghost Specials Chance" "33.3" - "Ghost Specials Range" "500.0" - "Ghost Weapon Slots" "0" + "Choke Block" "1" + "Choke Chance" "33.3" + "Choke Cooldown" "0" + "Choke Damage" "5.0" + "Choke Delay" "1.0" + "Choke Duration" "5" + "Choke Hit" "0" + "Choke Hit Mode" "0" + "Choke Range" "150.0" + "Choke Range Chance" "15.0" + "Choke Range Cooldown" "0" } } } @@ -14619,7 +13200,7 @@ ```
-##### God Ability +##### Clone Ability
Click to expand! @@ -14628,9 +13209,9 @@ { "Tank #1" { - // The Mutant Tank gains temporary immunity to all types of damage. - // Requires "mt_abilities.smx" to be compiled with "mt_god.sp" to work. - "God Ability" + // The Mutant Tank creates clones of itself. + // Requires "mt_abilities.smx" to be compiled with "mt_clone.sp" to work. + "Clone Ability" { // Admins with one or more of these access flags have access to this ability. // Note: This setting can be overridden for specific players. @@ -14639,14 +13220,6 @@ // Not empty: These access flags have access. "Access Flags" "" - // Admins with one or more of these immunity flags are immune to this ability's effects. - // Note: If the Mutant Tank has one or more of these immunity flags or has the same immunity flags as the survivor victim, the immunity is cancelled. - // Note: This setting can be overridden for specific players. - // -- - // Empty: No immunity flags are immune. - // Not empty: These immunity flags are immune. - "Immunity Flags" "" - // The ability can only activate in close areas. // Note: Do not change this setting if you are unsure of how it works. // Note: This setting can be overridden for specific players. @@ -14700,26 +13273,6 @@ // "forever" - 99999 seconds "Human Cooldown" "0" - // The Mutant Tank's ability effects last this long. - // Note: This setting does not affect human-controlled Mutant Tanks unless the "Human Mode" setting is set to "0". - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0 - // Maximum: 99999 - // -- - // Keywords: - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Human Duration" "5" - - // The mode of how human-controlled Mutant Tanks activate their abilities. - // Note: This setting can be overridden for specific players. - // -- - // 0: Press buttons to activate corresponding abilities. Cooldown starts after ability is activated. - // 1: Hold down buttons to keep corresponding abilities activated. Cooldown starts after the player lets go of the buttons. - "Human Mode" "1" - // The ability can only activate in open areas. // Note: Do not change this setting if you are unsure of how it works. // Note: This setting can be overridden for specific players. @@ -14732,15 +13285,15 @@ // "farthest" - 99999.0 range "Open Areas Only" "0.0" - // The ability is only effective toward human survivors. + // The ability is only effective toward human-controlled survivors. // Note: This setting can be overridden for specific players. // -- // Minimum: 0 // Maximum: 32 // -- // 0: OFF - // 1-32: ON, the number of human survivors required to be present for this ability to be effective. - "Requires Humans" "1" + // 1-32: ON, the number of human-controlled survivors required to be present for this ability to be effective. + "Requires Humans" "0" // Enable this ability. // Note: This setting can be overridden for specific players. @@ -14756,6 +13309,13 @@ // 1/"enabled"/"true"/"on"/"yes": ON "Ability Message" "0" + // The amount of clones the Mutant Tank can create. + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 1 + // Maximum: 15 + "Clone Amount" "2" + // The Mutant Tank has this many chances out of 100.0% to trigger the ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. @@ -14769,7 +13329,7 @@ // "maybe" - 50% chance // "often"/"likely"/"frequently" - 66.6% chance // "always" - 100% chance - "God Chance" "33.3" + "Clone Chance" "33.3" // The cooldown for the Mutant Tank's ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -14783,42 +13343,115 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "God Cooldown" "0" + "Clone Cooldown" "0" - // The Mutant Tank's ability effects last this long. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // The Mutant Tank's clone's health. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 - // Maximum: 99999 + // Minimum: 1 + // Maximum: 1000000 + "Clone Health" "1000" + + // Clones created by the Mutant Tank die after this many seconds. + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0.0 (Until death) + // Maximum: 99999.0 (Longest) + // -- + // Keywords: + // "never"/"disabled"/"false"/"off"/"no" - 0 seconds + // "milli"/"millisecond" - 0.1 seconds + // "second" - 1 second + // "minute" - 1 minute + // "forever"/"death" - 99999 seconds + "Clone Lifetime" "0.0" + + // The Mutant Tank's clone will be treated as a real Mutant Tank. + // Note: Clones cannot clone themselves regardless of the value for this setting for obvious safety reasons. + // Note: This setting can be overridden for specific players. + // -- + // 0/"disabled"/"false"/"off"/"no": OFF, the clone cannot use abilities like real Mutant Tanks. + // 1/"enabled"/"true"/"on"/"yes": ON, the clone can use abilities like real Mutant Tanks. + "Clone Mode" "0" + + // Remove all clones created by the Mutant Tank when it dies or changes its Mutant Tank type. + // Note: This setting can be overridden for specific players. + // -- + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Clone Remove" "1" + + // The Mutant Tank's clones are replaced with new ones when they die. + // Note: This setting can be overridden for specific players. + // -- + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Clone Replace" "1" + + // The Mutant Tank swaps places with one of its clones every time this many seconds passes. + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0.1 + // Maximum: 99999.0 // -- // Keywords: + // "milli"/"millisecond" - 0.1 seconds // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "God Duration" "5" + "Clone Swap" "5.0" + + // The type of the Mutant Tank's clone. + // Note: Chosen types that also have the Clone ability will be replaced with the Mutant Tank's own type to prevent bugs. + // Note: This setting can be overridden for specific players. + // -- + // Separate values with "-". + // -- + // Value limit: 2 + // Character limit for each value: 4 + // -- + // Minimum number for each value: 0 (OFF) + // Maximum number for each value: 500 + // -- + // 1st number = Minimum value + // 2nd number = Maximum value + // -- + // Example: "0-0" (Do not choose from any Mutant Tank types.) + // Example: "1-25" (Choose a Mutant Tank type between 1 through 25.) + // Example: "50-0" (Automatically change to "0-0" because "50" is higher than "0".) + // Example: "1-1000" (Automatically change to "1-500" because "500" is the maximum number of Mutant Tank types allowed.) + // Example: "0" (Automatically change to "0-500" because the maximum range is not specified.) + // Example: "1000" (Automatically change to "500-500" because the maximum range is not specified and the minimum range exceeds the "500" limit.) + // -- + // 0: OFF, use the randomization feature. + // 1-500: ON, the type of the clone. + "Clone Type" "0-0" "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" { - // Note: Override any of the settings in the "God Ability" section for each special infected here. + // Note: Override any of the settings in the "Clone Ability" section for each special infected here. // Example "Access Flags" "" - "Immunity Flags" "" "Close Areas Only" "0.0" "Combo Ability" "0" "Human Ability" "0" "Human Ammo" "5" "Human Cooldown" "0" - "Human Duration" "5" - "Human Mode" "1" "Open Areas Only" "0.0" - "Requires Humans" "1" + "Requires Humans" "0" "Ability Enabled" "0" "Ability Message" "0" - "God Chance" "33.3" - "God Cooldown" "0" - "God Duration" "5" + "Clone Amount" "2" + "Clone Chance" "33.3" + "Clone Cooldown" "0" + "Clone Health" "1000" + "Clone Lifetime" "0.0" + "Clone Mode" "0" + "Clone Remove" "1" + "Clone Replace" "1" + "Clone Swap" "5.0" + "Clone Type" "0-0" } } } @@ -14826,7 +13459,7 @@ ```
-##### Gravity Ability +##### Cloud Ability
Click to expand! @@ -14835,27 +13468,9 @@ { "Tank #1" { - // The Mutant Tank pulls in or pushes away survivors and any other nearby infected, and changes the survivors' gravity. - // "Ability Enabled" - Any nearby infected and survivors are pulled in or pushed away. - // - "Gravity Flags" - // - "Gravity Force" - // - "Gravity Radius" - // "Ability Enabled" - When a survivor is within range of the Mutant Tank, the survivor's gravity changes. - // - "Gravity Range" - // - "Gravity Range Chance" - // - "Gravity Range Cooldown" - // "Gravity Hit" - When a survivor is hit by the Mutant Tank's claw or rock, or a survivor hits the Mutant Tank with a melee weapon, the survivor's gravity changes. - // - "Gravity Chance" - // - "Gravity Cooldown" - // - "Gravity Hit Mode" - // "Gravity Rock Break" - When the Mutant Tank's rock breaks, it creates a blackhole. - // - "Gravity Flags" - // - "Gravity Force" - // - "Gravity Radius" - // - "Gravity Rock Chance" - // - "Gravity Rock Cooldown" - // Requires "mt_abilities.smx" to be compiled with "mt_gravity.sp" to work. - "Gravity Ability" + // The Mutant Tank constantly emits clouds of smoke that damage survivors caught in them. + // Requires "mt_abilities.smx" to be compiled with "mt_cloud.sp" to work. + "Cloud Ability" { // Admins with one or more of these access flags have access to this ability. // Note: This setting can be overridden for specific players. @@ -14939,39 +13554,13 @@ "Human Duration" "5" // The mode of how human-controlled Mutant Tanks activate their abilities. - // Note: This setting does not apply to the range ability. // Note: This setting can be overridden for specific players. // -- // 0: Press buttons to activate corresponding abilities. Cooldown starts after ability is activated. // 1: Hold down buttons to keep corresponding abilities activated. Cooldown starts after the player lets go of the buttons. + // 2: Press buttons to toggle corresponding abilities. Cooldown starts after ability is deactivated. "Human Mode" "1" - // Human-controlled Mutant Tanks must wait this long before using their range ability again. - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0 (OFF) - // Maximum: 99999 (Longest) - // -- - // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Human Range Cooldown" "0" - - // Human-controlled Mutant Tanks must wait this long before using their rock ability again. - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0 (OFF) - // Maximum: 99999 (Longest) - // -- - // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Human Rock Cooldown" "0" - // The ability can only activate in open areas. // Note: Do not change this setting if you are unsure of how it works. // Note: This setting can be overridden for specific players. @@ -14979,223 +13568,50 @@ // Minimum: 0.0 (OFF) // Maximum: 99999.0 (Farthest) // -- - // Keywords: - // "disabled"/"false"/"off"/"no" - 0.0 range - // "farthest" - 99999.0 range - "Open Areas Only" "0.0" - - // The ability is only effective toward human survivors. - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0 - // Maximum: 32 - // -- - // 0: OFF - // 1-32: ON, the number of human survivors required to be present for this ability to be effective. - "Requires Humans" "0" - - // Enable this ability. - // Note: This setting does not affect the "Gravity Hit" setting. - // Note: This setting can be overridden for specific players. - // -- - // 0: OFF - // 1: ON, the Mutant Tank can change survivors' gravity value. - // 2: ON, the Mutant Tank can pull in or push away survivors. - // 3: ON, the Mutant Tank can do both. - "Ability Enabled" "0" - - // Show a screen fade effect when the Mutant Tank uses its abilities. - // Note: The colors will randomly change between the colors set in the "Skin Color" and "Glow Color" settings. - // Note: This setting can be overridden for specific players. - // -- - // Add up numbers together for different results. - // -- - // Minimum: 0 - // Maximum: 7 - // -- - // 0: OFF - // 1: Show effect when the Mutant Tank uses its claw/rock attack. - // 2: Show effect when the Mutant Tank is hit by a melee weapon. - // 4: Show effect when the Mutant Tank uses its range ability. - // -- - // Keywords: - // "none"/"off" - 0 - // "attack" - 1 - // "hurt" - 2 - // "attack,hurt" - 3 - // "range" - 4 - // "attack,range" - 5 - // "hurt,range" - 6 - // "attack,hurt,range" - 7 - "Ability Effect" "0" - - // Display a message whenever the abilities activate/deactivate. - // Note: This setting can be overridden for specific players. - // -- - // Add up numbers together for different results. - // -- - // Minimum: 0 - // Maximum: 15 - // -- - // 0: OFF - // 1: Display message only when "Gravity Hit" is enabled. - // 2: Display message only when "Ability Enabled" is set to "1" or "3". - // 4: Display message only when "Ability Enabled" is set to "2" or "3". - // 8: Display message only when "Gravity Rock Break" is enabled. - // -- - // Keywords: - // "none"/"off" - 0 - // "hit" - 1 - // "ability" - 2 - // "hit,ability" - 3 - // "rock" - 4 - // "hit,rock" - 5 - // "ability,rock" - 6 - // "hit,ability,rock" - 7 - // "break" - 8 - // "hit,break" - 9 - // "ability,break" - 10 - // "hit,ability,break" - 11 - // "rock,break" - 12 - // "hit,rock,break" - 13 - // "ability,rock,break" - 14 - // "hit,ability,rock,break"/"all" - 15 - "Ability Message" "0" - - // Check line-of-sight when the Mutant Tank uses its abilities. - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0 - // Maximum: 5 - // -- - // 0: OFF - // 1: Check if there is a solid object between the Mutant Tank and survivors. - // 2: Option 1 + Check if the Mutant Tank is looking toward the survivors. - // 3: Option 1 + Check if the Mutant Tank is looking away from the survivors. - // 4: Option 1 + Check if the survivors are looking toward the Mutant Tank. - // 5: Option 1 + Check if the survivors are looking away from the Mutant Tank. - "Ability Sight" "0" - - // The Mutant Tank has this many chances out of 100.0% to trigger the ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0.0 (No chance) - // Maximum: 100.0 (Highest chance) - // -- - // Keywords: - // "never" - 0% chance - // "sometimes"/"unlikely"/"seldom" - 33.3% chance - // "maybe" - 50% chance - // "often"/"likely"/"frequently" - 66.6% chance - // "always" - 100% chance - "Gravity Chance" "33.3" - - // The cooldown for the Mutant Tank's main/hit ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0 (OFF) - // Maximum: 99999 (Longest) - // -- - // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Gravity Cooldown" "0" - - // The Mutant Tank's ability effects last this long. - // Note: This is ignored when the "Combo Ability" setting is set to "1". - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0 - // Maximum: 99999 - // -- - // Keywords: - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Gravity Duration" "5" - - // The Mutant Tank's gravity flags. - // Note: This setting can be overridden for specific players. - // -- - // Add up numbers together for different results. - // -- - // Minimum: 0 - // Maximum: 31 - // -- - // 0 OR 31: All flags. - // 1: Require line-of-sight (LOS) flag. - // 2: Use angle pushes flag. - // 4: No distance falloff flag. - // 8: Push players. - // 16: Push physics. - "Gravity Flags" "8" - - // The Mutant Tank's gravity force. - // Note: This setting can be overridden for specific players. - // -- - // Minimum: -100.0 - // Maximum: 100.0 - // -- - // Positive numbers = Push back - // Negative numbers = Pull back - "Gravity Force" "-50.0" - - // Enable the Mutant Tank's claw/rock attack. - // Note: This setting does not need the "Ability Enabled" setting to be set to "1". - // Note: This setting can be overridden for specific players. - // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Gravity Hit" "0" - - // The mode of the Mutant Tank's claw/rock attack. - // Note: This setting can be overridden for specific players. - // -- - // 0: Both - // 1: Ability activates when the Mutant Tank hits a survivor. - // 2: Ability activates when the Mutant Tank is hit by a survivor. - // -- - // Keywords: - // "both"/"all" - 0 - // "tank"/"attack" - 1 - // "survivor"/"hurt" - 2 - "Gravity Hit Mode" "0" + // Keywords: + // "disabled"/"false"/"off"/"no" - 0.0 range + // "farthest" - 99999.0 range + "Open Areas Only" "0.0" - // The mode of the Mutant Tank's gravity ability. + // The ability is only effective toward human-controlled survivors. // Note: This setting can be overridden for specific players. // -- - // 0: The Mutant Tank changes the survivors' gravity. - // 1: The Mutant Tank turns the survivors' into temporary black holes. - "Gravity Mode" "0" + // Minimum: 0 + // Maximum: 32 + // -- + // 0: OFF + // 1-32: ON, the number of human-controlled survivors required to be present for this ability to be effective. + "Requires Humans" "0" - // The radius of the Mutant Tank's gravity. + // Enable this ability. // Note: This setting can be overridden for specific players. // -- - // Minimum: 1.0 (Closest) - // Maximum: 99999.0 (Farthest) + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Ability Enabled" "0" + + // Display a message whenever the ability activates/deactivates. + // Note: This setting can be overridden for specific players. // -- - // Keywords: - // "closest" - 1.0 range - // "farthest" - 99999.0 range - "Gravity Radius" "750.0" + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Ability Message" "0" - // The distance between a survivor and the Mutant Tank needed to trigger the ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Check line-of-sight when the Mutant Tank uses its abilities. // Note: This setting can be overridden for specific players. // -- - // Minimum: 1.0 (Closest) - // Maximum: 99999.0 (Farthest) + // Minimum: 0 + // Maximum: 5 // -- - // Keywords: - // "closest" - 1.0 range - // "farthest" - 99999.0 range - "Gravity Range" "150.0" + // 0: OFF + // 1: Check if there is a solid object between the Mutant Tank and survivors. + // 2: Option 1 + Check if the Mutant Tank is looking toward the survivors. + // 3: Option 1 + Check if the Mutant Tank is looking away from the survivors. + // 4: Option 1 + Check if the survivors are looking toward the Mutant Tank. + // 5: Option 1 + Check if the survivors are looking away from the Mutant Tank. + "Ability Sight" "0" - // The Mutant Tank has this many chances out of 100.0% to trigger the range ability. + // The Mutant Tank has this many chances out of 100.0% to trigger the ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- @@ -15208,9 +13624,9 @@ // "maybe" - 50% chance // "often"/"likely"/"frequently" - 66.6% chance // "always" - 100% chance - "Gravity Range Chance" "15.0" + "Cloud Chance" "33.3" - // The cooldown for the Mutant Tank's range ability. + // The cooldown for the Mutant Tank's ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- @@ -15222,55 +13638,69 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Gravity Range Cooldown" "0" + "Cloud Cooldown" "0" - // The Mutant Tank's rock creates a blackhole when it breaks. - // Note: This does not need "Ability Enabled" or "Gravity Hit" to be set to "1". + // The Mutant Tank's clouds do this much damage. + // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Gravity Rock Break" "0" + // Minimum: 0.0 (OFF) + // Maximum: 99999.0 + // -- + // Keywords: + // "weakest" - 1.0 damage + // "strongest" - 99999.0 damage + "Cloud Damage" "5.0" - // The Mutant Tank's rock has this many chances out of 100.0% to trigger the rock break ability. + // The Mutant Tank's ability effects last this long. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.0 (No chance) - // Maximum: 100.0 (Highest chance) + // Minimum: 0 + // Maximum: 99999 // -- // Keywords: - // "never" - 0% chance - // "sometimes"/"unlikely"/"seldom" - 33.3% chance - // "maybe" - 50% chance - // "often"/"likely"/"frequently" - 66.6% chance - // "always" - 100% chance - "Gravity Rock Chance" "33.3" + // "second" - 1 second + // "minute" - 1 minute + // "forever" - 99999 seconds + "Cloud Duration" "0" - // The cooldown for the Mutant Tank's rock ability. + // The Mutant Tank's clouds deal damage to nearby survivors every time this many seconds passes. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 (OFF) - // Maximum: 99999 (Longest) + // Minimum: 0.1 + // Maximum: 99999.0 // -- // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds + // "milli"/"millisecond" - 0.1 seconds // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Gravity Rock Cooldown" "0" + "Cloud Interval" "5.0" - // The Mutant Tank sets the survivors' gravity to this value. + // The distance between a survivor and the Mutant Tank needed to trigger the ability. + // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.1 - // Maximum: 99999.0 - "Gravity Value" "0.3" + // Minimum: 1.0 (Closest) + // Maximum: 99999.0 (Farthest) + // -- + // Keywords: + // "closest" - 1.0 range + // "farthest" - 99999.0 range + "Cloud Range" "500.0" + + // Remove all clouds created by the Mutant Tank whenever it triggers the ability. + // Note: This setting can be overridden for specific players. + // -- + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Cloud Remove" "0" "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" { - // Note: Override any of the settings in the "Gravity Ability" section for each special infected here. + // Note: Override any of the settings in the "Cloud Ability" section for each special infected here. // Example "Access Flags" "" @@ -15282,30 +13712,18 @@ "Human Cooldown" "0" "Human Duration" "5" "Human Mode" "1" - "Human Pin Cooldown" "0" - "Human Range Cooldown" "0" "Open Areas Only" "0.0" "Requires Humans" "0" "Ability Enabled" "0" - "Ability Effect" "0" "Ability Message" "0" "Ability Sight" "0" - "Gravity Chance" "33.3" - "Gravity Cooldown" "0" - "Gravity Duration" "5" - "Gravity Flags" "8" - "Gravity Force" "-50.0" - "Gravity Hit" "0" - "Gravity Hit Mode" "0" - "Gravity Mode" "0" - "Gravity Pin" "0" - "Gravity Pin Chance" "33.3" - "Gravity Pin Cooldown" "0" - "Gravity Radius" "750.0" - "Gravity Range" "150.0" - "Gravity Range Chance" "15.0" - "Gravity Range Cooldown" "0" - "Gravity Value" "0.3" + "Cloud Chance" "33.3" + "Cloud Cooldown" "0" + "Cloud Damage" "5.0" + "Cloud Duration" "0" + "Cloud Interval" "5.0" + "Cloud Range" "500.0" + "Cloud Remove" "0" } } } @@ -15313,7 +13731,7 @@ ```
-##### Gunner Ability +##### Drop Ability
Click to expand! @@ -15322,9 +13740,24 @@ { "Tank #1" { - // The Mutant Tank is armed with guns. - // Requires "mt_abilities.smx" to be compiled with "mt_gunner.sp" to work. - "Gunner Ability" + // The Mutant Tank drops weapons and gives survivors items upon death. + // "Ability Enabled" - When the Mutant Tank dies, it drops weapons. + // - "Drop Clip Chance" + // - "Drop Count" + // - "Drop Mode" + // - "Drop Hand Position" + // - "Drop Weapon Boost" + // - "Drop Weapon Name" + // - "Drop Weapon Resistance" + // - "Drop Weapon Scale" + // "Ability Enabled" - When the Mutant Tank dies, it gives survivors items. + // - "Drop Item Mode" + // - "Drop Loadout" + // "Drop Pinata" - When the Mutant Tank kills a survivor, the survivor drops items. + // - "Drop Pinata Body" + // - "Drop Pinata Chance" + // Requires "mt_abilities.smx" to be compiled with "mt_drop.sp" to work. + "Drop Ability" { // Admins with one or more of these access flags have access to this ability. // Note: This setting can be overridden for specific players. @@ -15370,37 +13803,6 @@ // 2: ON, abilities will activate automatically. "Human Ability" "0" - // Determines how many times human-controlled Mutant Tanks can use their abilities in one life. - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0 - // Maximum: 99999 - // -- - // Keywords: - // "none"/"off" - 0 ammo - // "infinite" - 99999 ammo - "Human Ammo" "5" - - // Human-controlled Mutant Tanks must wait this long before using their abilities again. - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0 (OFF) - // Maximum: 99999 (Longest) - // -- - // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Human Cooldown" "0" - - // The mode of how human-controlled Mutant Tanks activate their abilities. - // Note: This setting can be overridden for specific players. - // -- - // 0: Press buttons to activate corresponding abilities. Cooldown starts after ability's duration ends. - // 1: Hold down buttons to keep corresponding abilities activated. Cooldown starts after the player lets go of the buttons. - "Human Mode" "1" - // The ability can only activate in open areas. // Note: Do not change this setting if you are unsure of how it works. // Note: This setting can be overridden for specific players. @@ -15413,21 +13815,23 @@ // "farthest" - 99999.0 range "Open Areas Only" "0.0" - // The ability is only effective toward human survivors. + // The ability is only effective toward human-controlled survivors. // Note: This setting can be overridden for specific players. // -- // Minimum: 0 // Maximum: 32 // -- // 0: OFF - // 1-32: ON, the number of human survivors required to be present for this ability to be effective. + // 1-32: ON, the number of human-controlled survivors required to be present for this ability to be effective. "Requires Humans" "0" // Enable this ability. // Note: This setting can be overridden for specific players. // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON + // 0: OFF + // 1: ON, the Mutant Tank can drop a weapon upon death. + // 2: ON, the Mutant Tank can give items directly to survivors upon death. + // 3: ON, the Mutant Tank can do both. "Ability Enabled" "0" // Display a message whenever the ability activates/deactivates. @@ -15437,22 +13841,22 @@ // 1/"enabled"/"true"/"on"/"yes": ON "Ability Message" "0" - // The accuracy of the Mutant Tank's guns. + // The Mutant Tank has this many chances out of 100.0% to trigger the ability. + // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.1 (Highest) - // Maximum: 5.0 (Lowest) - "Gunner Accuracy" "2.0" - - // The number of bullets for the Mutant Tank's guns. - // Note: This setting can be overridden for specific players. + // Minimum: 0.0 (No chance) + // Maximum: 100.0 (Highest chance) // -- - // Minimum: 1 (Lowest) - // Maximum: 99999 (Highest) - "Gunner Bullets" "3" + // Keywords: + // "never" - 0% chance + // "sometimes"/"unlikely"/"seldom" - 33.3% chance + // "maybe" - 50% chance + // "often"/"likely"/"frequently" - 66.6% chance + // "always" - 100% chance + "Drop Chance" "33.3" - // The Mutant Tank has this many chances out of 100.0% to trigger the ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // The Mutant Tank has this many chances out of 100.0% to drop guns with a full clip. // Note: This setting can be overridden for specific players. // -- // Minimum: 0.0 (No chance) @@ -15464,148 +13868,130 @@ // "maybe" - 50% chance // "often"/"likely"/"frequently" - 66.6% chance // "always" - 100% chance - "Gunner Chance" "33.3" + "Drop Clip Chance" "33.3" - // The clip size for the Mutant Tank's guns. + // The Mutant Tank drops this many weapons upon death. // Note: This setting can be overridden for specific players. // -- - // Minimum: 1 (Smallest) - // Maximum: 99999 (Largest) - "Gunner Clip Size" "30" + // Minimum: 1 + // Maximum: 32 + "Drop Count" "1" - // The cooldown for the Mutant Tank's ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // The position of the Mutant Tank's weapon. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 (OFF) - // Maximum: 99999 (Longest) + // Add up numbers together for different results. // -- - // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Gunner Cooldown" "0" + // Minimum: 0 + // Maximum: 3 + // -- + // 0 OR 3: Pick randomly between left and right hands. + // 1: Right hand. + // 2: Left hand. + "Drop Hand Position" "0" - // The Mutant Tank's guns do this much damage. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // The mode of the Mutant Tank's item drop ability. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.0 (OFF) - // Maximum: 99999.0 + // 0: Survivors get a random item. + // 1: Survivors get all items. + // 2: Tank drops a random item. + // 3: Tank drops all items. + "Drop Item Mode" "0" + + // The Mutant Tank gives survivors this loadout. + // Note: This setting can be overridden for specific players. // -- - // Keywords: - // "weakest" - 1.0 damage - // "strongest" - 99999.0 damage - "Gunner Damage" "5.0" + // Item limit: 5 + // Character limit for each item: 64 + // -- + // Example: "rifle_m60,pistol,adrenaline,defibrillator" + // Example: "katana,pain_pills,vomitjar" + // Example: "first_aid_kit,defibrillator,knife,adrenaline" + "Drop Loadout" "rifle,pistol,first_aid_kit,pain_pills" + + // The mode of the Mutant Tank's drop ability. + // Note: This setting can be overridden for specific players. + // -- + // 0: Both + // 1: Guns only. + // 2: Melee weapons only. (Only available in Left 4 Dead 2.) + "Drop Mode" "0" - // The Mutant Tank's ability effects last this long. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // The Mutant Tank turns its dead survivor victims into pinatas that spawn certain items. + // Note: This setting does not need the "Ability Enabled" setting to be set to "2" or "3". // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.1 - // Maximum: 99999.0 + // Item limit: 5 + // Character limit for each item: 64 // -- - // Keywords: - // "milli"/"millisecond" - 0.1 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Gunner Duration" "5.0" + // Example: "pain_pills,pain_pills,pain_pills" + // Example: "katana,katana,rifle_m60" + // Example: "first_aid_kit,defibrillator,first_aid_kit,defibrillator" + "Drop Pinata" "" - // The Mutant Tank's guns have glow outlines when activated. + // Removes the death model of the survivor when killed. // Note: Only available in Left 4 Dead 2. - // Note: This setting relies on the glow settings under the "Tank #/Glow" section. - // Note: The glow outline may not appear when the "Glow Type" setting is set to "0" if the guns are not fully visible to the player. + // Note: This setting only applies if the "Drop Pinata" setting is not empty. // Note: This setting can be overridden for specific players. // -- // 0/"disabled"/"false"/"off"/"no": OFF // 1/"enabled"/"true"/"on"/"yes": ON - "Gunner Glow" "1" - - // The type of the Mutant Tank's gun. - // Note: This setting can be overridden for specific players. - // -- - // 0: Random - // 1: M1911/P220/Glock Pistol - // 2: SMG - // 3: Pump Shotgun - // 4: M16 Assault Rifle - // 5: Combat Shotgun - // 6: Hunting Rifle - // 7: Magnum Pistol (Only available in Left 4 Dead 2.) - // 8: Silenced SMG (Only available in Left 4 Dead 2.) - // 9: MP5 SMG (Only available in Left 4 Dead 2.) - // 10: Chrome Shotgun (Only available in Left 4 Dead 2.) - // 11: AK47 Assault Rifle (Only available in Left 4 Dead 2.) - // 12: SG552 Assault Rifle (Only available in Left 4 Dead 2.) - // 13: SCAR-L Desert Rifle (Only available in Left 4 Dead 2.) - // 14: SPAS Shotgun (Only available in Left 4 Dead 2.) - // 15: Military Sniper Rifle (Only available in Left 4 Dead 2.) - // 16: Steyr Scout Rifle (Only available in Left 4 Dead 2.) - // 17: AWP Sniper Rifle (Only available in Left 4 Dead 2.) - // 18: M60 Machine Rifle (Only available in Left 4 Dead 2.) - "Gunner Gun Type" "0" + "Drop Pinata Body" "1" - // The Mutant Tank fires gunshots at survivors every time this many seconds passes. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // The Mutant Tank has this many chances out of 100.0% to turn its dead survivor victims into pinatas. + // Note: This setting only applies if the "Drop Pinata" setting is not empty. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.1 - // Maximum: 99999.0 + // Minimum: 0.0 (No chance) + // Maximum: 100.0 (Highest chance) // -- // Keywords: - // "milli"/"millisecond" - 0.1 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Gunner Interval" "1.0" + // "never" - 0% chance + // "sometimes"/"unlikely"/"seldom" - 33.3% chance + // "maybe" - 50% chance + // "often"/"likely"/"frequently" - 66.6% chance + // "always" - 100% chance + "Drop Pinata Chance" "33.3" - // The Mutant Tank's guns take this many seconds to load in bullets before firing again. + // The Mutant Tank's dropped weapon damage boost value when actively held by a survivor. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.1 (Shortest) - // Maximum: 99999.0 (Longest) - "Gunner Load Time" "1.0" + // Minimum: 0.0 (OFF) + // Maximum: 99999.0 (Strongest) + "Drop Weapon Boost" "0.0" - // The distance between an enemy and the Mutant Tank needed to trigger the ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // The console name of the Mutant Tank's weapon. + // Note: Leave this empty if you want a random weapon to be chosen. // Note: This setting can be overridden for specific players. // -- - // Minimum: 1.0 (Closest) - // Maximum: 99999.0 (Farthest) + // Weapon limit: 1 + // Character limit: 40 // -- - // Keywords: - // "closest" - 1.0 range - // "farthest" - 99999.0 range - "Gunner Range" "500.0" + // Example: "weapon_rifle_m60" + // Example: "fireaxe" + // Example: "autoshotgun" + "Drop Weapon Name" "" - // The Mutant Tank's guns take this many seconds to react. + // The resistance multiplier given to the Mutant Tank's dropped weapon when actively held by a survivor. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.1 (Shortest) - // Maximum: 99999.0 (Longest) - "Gunner Reaction Time" "1.0" + // Minimum: 0.0 (OFF) + // Maximum: 1.0 (None) + "Drop Weapon Resistance" "0.0" - // The type of targets tracked by the Mutant Tank's guns. + // The Mutant Tank's weapon size is multiplied by this value. + // Note: Only available in Left 4 Dead 2. + // Note: Default weapon size (1.5) x Drop weapon scale // Note: This setting can be overridden for specific players. // -- - // Add up numbers together for different results. - // -- - // Minimum: 0 - // Maximum: 31 - // -- - // 0 OR 31: All types. - // 1: Human-controlled survivors - // 2: Survivor bots - // 4: Incapacitated survivors - // 8: Common infected - // 16: Special infected - "Gunner Target Type" "0" + // Minimum: 0.1 + // Maximum: 2.0 + "Drop Weapon Scale" "1.0" "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" { - // Note: Override any of the settings in the "Gunner Ability" section for each special infected here. + // Note: Override any of the settings in the "Drop Ability" section for each special infected here. // Example "Access Flags" "" @@ -15613,27 +13999,24 @@ "Close Areas Only" "0.0" "Combo Ability" "0" "Human Ability" "0" - "Human Ammo" "5" - "Human Cooldown" "0" - "Human Mode" "1" "Open Areas Only" "0.0" "Requires Humans" "0" "Ability Enabled" "0" "Ability Message" "0" - "Gunner Accuracy" "2.0" - "Gunner Bullets" "3" - "Gunner Chance" "33.3" - "Gunner Clip Size" "30" - "Gunner Cooldown" "0" - "Gunner Damage" "5.0" - "Gunner Duration" "5.0" - "Gunner Glow" "1" - "Gunner Gun Type" "0" - "Gunner Interval" "1.0" - "Gunner Load Time" "1.0" - "Gunner Range" "500.0" - "Gunner Reaction Time" "1.0" - "Gunner Target Type" "0" + "Drop Chance" "33.3" + "Drop Clip Chance" "33.3" + "Drop Count" "1" + "Drop Hand Position" "0" + "Drop Item Mode" "0" + "Drop Loadout" "rifle,pistol,first_aid_kit,pain_pills" + "Drop Mode" "0" + "Drop Pinata" "" + "Drop Pinata Body" "1" + "Drop Pinata Chance" "33.3" + "Drop Weapon Boost" "0.0" + "Drop Weapon Name" "" + "Drop Weapon Resistance" "0.0" + "Drop Weapon Scale" "1.0" } } } @@ -15641,7 +14024,7 @@ ```
-##### Heal Ability +##### Drug Ability
Click to expand! @@ -15650,25 +14033,17 @@ { "Tank #1" { - // The Mutant Tank gains health from other nearby infected and sets survivors to temporary health who will die when they reach 0 HP. - // "Ability Enabled" - Any nearby infected can give the Mutant Tank some health. - // - "Heal Absorb Range" - // - "Heal Duration" - // - "Heal Glow" - // - "Heal Interval" - // - "Health From Commons" - // - "Health From Specials" - // - "Health From Tanks" - // "Ability Enabled" - When a survivor is within range of the Mutant Tank, the survivor is set to temporary health and will die when they reach 0 HP. - // - "Heal Range" - // - "Heal Range Chance" - // - "Heal Range Cooldown" - // "Heal Hit" - When a survivor is hit by the Mutant Tank's claw or rock, or a survivor hits the Mutant Tank with a melee weapon, the survivor is set to temporary health and will die when they reach 0 HP. - // - "Heal Chance" - // - "Heal Cooldown" - // - "Heal Hit Mode" - // Requires "mt_abilities.smx" to be compiled with "mt_heal.sp" to work. - "Heal Ability" + // The Mutant Tank drugs survivors. + // "Ability Enabled" - When a survivor is within range of the Mutant Tank, the survivor is drugged. + // - "Drug Range" + // - "Drug Range Chance" + // - "Drug Range Cooldown" + // "Drug Hit" - When a survivor is hit by the Mutant Tank's claw or rock, or a survivor hits the Mutant Tank with a melee weapon, the survivor is drugged. + // - "Drug Chance" + // - "Drug Cooldown" + // - "Drug Hit Mode" + // Requires "mt_abilities.smx" to be compiled with "mt_drug.sp" to work. + "Drug Ability" { // Admins with one or more of these access flags have access to this ability. // Note: This setting can be overridden for specific players. @@ -15738,27 +14113,6 @@ // "forever" - 99999 seconds "Human Cooldown" "0" - // The Mutant Tank's ability effects last this long. - // Note: This setting does not affect human-controlled Mutant Tanks unless the "Human Mode" setting is set to "0". - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0 - // Maximum: 99999 - // -- - // Keywords: - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Human Duration" "5" - - // The mode of how human-controlled Mutant Tanks activate their abilities. - // Note: This setting does not apply to the range ability. - // Note: This setting can be overridden for specific players. - // -- - // 0: Press buttons to activate corresponding abilities. Cooldown starts after ability's duration ends. - // 1: Hold down buttons to keep corresponding abilities activated. Cooldown starts after the player lets go of the buttons. - "Human Mode" "1" - // Human-controlled Mutant Tanks must wait this long before using their range ability again. // Note: This setting can be overridden for specific players. // -- @@ -15784,24 +14138,22 @@ // "farthest" - 99999.0 range "Open Areas Only" "0.0" - // The ability is only effective toward human survivors. + // The ability is only effective toward human-controlled survivors. // Note: This setting can be overridden for specific players. // -- // Minimum: 0 // Maximum: 32 // -- // 0: OFF - // 1-32: ON, the number of human survivors required to be present for this ability to be effective. - "Requires Humans" "0" + // 1-32: ON, the number of human-controlled survivors required to be present for this ability to be effective. + "Requires Humans" "1" // Enable this ability. - // Note: This setting does not affect the "Heal Hit" setting. + // Note: This setting does not affect the "Drug Hit" setting. // Note: This setting can be overridden for specific players. // -- - // 0: OFF - // 1: ON, the Mutant Tank can give survivors temporary health. - // 2: ON, the Mutant Tank can absorb health from nearby infected. - // 3: ON, the Mutant Tank can do both. + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON "Ability Enabled" "0" // Show a screen fade effect when the Mutant Tank uses its abilities. @@ -15829,28 +14181,23 @@ // "attack,hurt,range" - 7 "Ability Effect" "0" - // Display a message whenever the abilities activate/deactivate. + // Display a message whenever the ability activates/deactivates. // Note: This setting can be overridden for specific players. // -- // Add up numbers together for different results. // -- // Minimum: 0 - // Maximum: 7 + // Maximum: 3 // -- // 0: OFF - // 1: Display message only when "Heal Hit" is enabled. - // 2: Display message only when "Ability Enabled" is set to "1" or "3". - // 4: Display message only when "Ability Enabled" is set to "2" or "3". + // 1: Display message only when "Drug Hit" is enabled. + // 2: Display message only when "Ability Enabled" is enabled. // -- // Keywords: // "none"/"off" - 0 // "hit" - 1 // "ability" - 2 - // "hit,ability" - 3 - // "rock" - 4 - // "hit,rock" - 5 - // "ability,rock" - 6 - // "hit,ability,rock"/"all" - 7 + // "both"/"all"/"hit,ability" - 3 "Ability Message" "0" // Check line-of-sight when the Mutant Tank uses its abilities. @@ -15867,25 +14214,6 @@ // 5: Option 1 + Check if the survivors are looking away from the Mutant Tank. "Ability Sight" "0" - // The distance between an infected and the Mutant Tank needed to trigger the ability. - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 1.0 (Closest) - // Maximum: 99999.0 (Farthest) - // -- - // Keywords: - // "closest" - 1.0 range - // "farthest" - 99999.0 range - "Heal Absorb Range" "500.0" - - // The amount of temporary health given to survivors. - // Note: This setting does not need the "Ability Enabled" setting to be set to "1". - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 1.0 - // Maximum: 1000000.0 - "Heal Buffer" "100.0" - // The Mutant Tank has this many chances out of 100.0% to trigger the ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. @@ -15899,9 +14227,9 @@ // "maybe" - 50% chance // "often"/"likely"/"frequently" - 66.6% chance // "always" - 100% chance - "Heal Chance" "33.3" + "Drug Chance" "33.3" - // The cooldown for the Mutant Tank's main/hit ability. + // The cooldown for the Mutant Tank's hit ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- @@ -15913,29 +14241,20 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Heal Cooldown" "0" + "Drug Cooldown" "0" // The Mutant Tank's ability effects last this long. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 + // Minimum: 1 // Maximum: 99999 // -- // Keywords: - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Heal Duration" "0" - - // The Mutant Tank's healing gives it a glow outline when activated. - // Note: Only available in Left 4 Dead 2. - // Note: This setting relies on the glow settings under the "Tank #/Glow" section. - // Note: This setting can be overridden for specific players. - // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Heal Glow" "1" + // "second" - 1 second + // "minute" - 1 minute + // "forever" - 99999 seconds + "Drug Duration" "5" // Enable the Mutant Tank's claw/rock attack. // Note: This setting does not need the "Ability Enabled" setting to be set to "1". @@ -15943,7 +14262,7 @@ // -- // 0/"disabled"/"false"/"off"/"no": OFF // 1/"enabled"/"true"/"on"/"yes": ON - "Heal Hit" "0" + "Drug Hit" "0" // The mode of the Mutant Tank's claw/rock attack. // Note: This setting can be overridden for specific players. @@ -15956,9 +14275,9 @@ // "both"/"all" - 0 // "tank"/"attack" - 1 // "survivor"/"hurt" - 2 - "Heal Hit Mode" "0" + "Drug Hit Mode" "0" - // The Mutant Tank receives health from nearby infected every time this many seconds passes. + // The Mutant Tank drugs survivors every time this many seconds passes. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- @@ -15970,7 +14289,7 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Heal Interval" "5.0" + "Drug Interval" "1.0" // The distance between a survivor and the Mutant Tank needed to trigger the ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -15982,7 +14301,7 @@ // Keywords: // "closest" - 1.0 range // "farthest" - 99999.0 range - "Heal Range" "150.0" + "Drug Range" "150.0" // The Mutant Tank has this many chances out of 100.0% to trigger the range ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -15997,7 +14316,7 @@ // "maybe" - 50% chance // "often"/"likely"/"frequently" - 66.6% chance // "always" - 100% chance - "Heal Range Chance" "15.0" + "Drug Range Chance" "15.0" // The cooldown for the Mutant Tank's range ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -16011,41 +14330,11 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Heal Range Cooldown" "0" - - // The Mutant Tank receives this much health from nearby common infected. - // Note: This setting can be overridden for specific players. - // -- - // Minimum: -1000000 - // Maximum: 1000000 - // -- - // Positive numbers: Current health + Health from commons - // Negative numbers: Current health - Health from commons - "Health From Commons" "50" - - // The Mutant Tank receives this much health from other nearby special infected. - // Note: This setting can be overridden for specific players. - // -- - // Minimum: -1000000 - // Maximum: 1000000 - // -- - // Positive numbers: Current health + Health from specials - // Negative numbers: Current health - Health from specials - "Health From Specials" "100" - - // The Mutant Tank receives this much health from other nearby Tanks. - // Note: This setting can be overridden for specific players. - // -- - // Minimum: -1000000 - // Maximum: 1000000 - // -- - // Positive numbers: Current health + Health from Tanks - // Negative numbers: Current health - Health from Tanks - "Health From Tanks" "500" + "Drug Range Cooldown" "0" "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" { - // Note: Override any of the settings in the "Heal Ability" section for each special infected here. + // Note: Override any of the settings in the "Drug Ability" section for each special infected here. // Example "Access Flags" "" @@ -16055,30 +14344,22 @@ "Human Ability" "0" "Human Ammo" "5" "Human Cooldown" "0" - "Human Duration" "5" - "Human Mode" "1" "Human Range Cooldown" "0" "Open Areas Only" "0.0" - "Requires Humans" "0" + "Requires Humans" "1" "Ability Enabled" "0" "Ability Effect" "0" "Ability Message" "0" "Ability Sight" "0" - "Heal Absorb Range" "500.0" - "Heal Buffer" "100.0" - "Heal Chance" "33.3" - "Heal Cooldown" "0" - "Heal Duration" "0" - "Heal Glow" "1" - "Heal Hit" "0" - "Heal Hit Mode" "0" - "Heal Interval" "5.0" - "Heal Range" "150.0" - "Heal Range Chance" "15.0" - "Heal Range Cooldown" "0" - "Health From Commons" "50" - "Health From Specials" "100" - "Health From Tanks" "500" + "Drug Chance" "33.3" + "Drug Cooldown" "0" + "Drug Duration" "5" + "Drug Hit" "0" + "Drug Hit Mode" "0" + "Drug Interval" "1.0" + "Drug Range" "150.0" + "Drug Range Chance" "15.0" + "Drug Range Cooldown" "0" } } } @@ -16086,7 +14367,7 @@ ```
-##### Hit Ability +##### Drunk Ability
Click to expand! @@ -16095,9 +14376,17 @@ { "Tank #1" { - // The Mutant Tank only takes damage in certain parts of its body. - // Requires "mt_abilities.smx" to be compiled with "mt_hit.sp" to work. - "Hit Ability" + // The Mutant Tank makes survivors drunk. + // "Ability Enabled" - When a survivor is within range of the Mutant Tank, the survivor gets drunk. + // - "Drunk Range" + // - "Drunk Range Chance" + // - "Drunk Range Cooldown" + // "Drunk Hit" - When a survivor is hit by the Mutant Tank's claw or rock, or a survivor hits the Mutant Tank with a melee weapon, the survivor gets drunk. + // - "Drunk Chance" + // - "Drunk Cooldown" + // - "Drunk Hit Mode" + // Requires "mt_abilities.smx" to be compiled with "mt_drunk.sp" to work. + "Drunk Ability" { // Admins with one or more of these access flags have access to this ability. // Note: This setting can be overridden for specific players. @@ -16106,103 +14395,327 @@ // Not empty: These access flags have access. "Access Flags" "" - // Admins with one or more of these immunity flags are immune to this ability's effects. - // Note: If the Mutant Tank has one or more of these immunity flags or has the same immunity flags as the survivor victim, the immunity is cancelled. + // Admins with one or more of these immunity flags are immune to this ability's effects. + // Note: If the Mutant Tank has one or more of these immunity flags or has the same immunity flags as the survivor victim, the immunity is cancelled. + // Note: This setting can be overridden for specific players. + // -- + // Empty: No immunity flags are immune. + // Not empty: These immunity flags are immune. + "Immunity Flags" "" + + // The ability can only activate in close areas. + // Note: Do not change this setting if you are unsure of how it works. + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0.0 (OFF) + // Maximum: 99999.0 (Farthest) + // -- + // Keywords: + // "disabled"/"false"/"off"/"no" - 0.0 range + // "farthest" - 99999.0 range + "Close Areas Only" "0.0" + + // Use this ability in conjunction with other abilities. + // Note: Only use this when "Spawn Type" is set to "4" for the Mutant Tank. + // Note: This setting does not affect human-controlled Mutant Tanks unless the "Human Ability" setting is set to "2". + // Note: This setting can be overridden for specific players. + // -- + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Combo Ability" "0" + + // Allow human-controlled Mutant Tanks to use this ability. + // Note: This setting can be overridden for specific players. + // -- + // 0: OFF + // 1: ON, players can use buttons to activate abilities. + // 2: ON, abilities will activate automatically. + "Human Ability" "0" + + // Determines how many times human-controlled Mutant Tanks can use their abilities in one life. + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0 + // Maximum: 99999 + // -- + // Keywords: + // "none"/"off" - 0 ammo + // "infinite" - 99999 ammo + "Human Ammo" "5" + + // Human-controlled Mutant Tanks must wait this long before using their abilities again. + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0 (OFF) + // Maximum: 99999 (Longest) + // -- + // Keywords: + // "never"/"disabled"/"false"/"off"/"no" - 0 seconds + // "second" - 1 second + // "minute" - 1 minute + // "forever" - 99999 seconds + "Human Cooldown" "0" + + // Human-controlled Mutant Tanks must wait this long before using their range ability again. + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0 (OFF) + // Maximum: 99999 (Longest) + // -- + // Keywords: + // "never"/"disabled"/"false"/"off"/"no" - 0 seconds + // "second" - 1 second + // "minute" - 1 minute + // "forever" - 99999 seconds + "Human Range Cooldown" "0" + + // The ability can only activate in open areas. + // Note: Do not change this setting if you are unsure of how it works. + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0.0 (OFF) + // Maximum: 99999.0 (Farthest) + // -- + // Keywords: + // "disabled"/"false"/"off"/"no" - 0.0 range + // "farthest" - 99999.0 range + "Open Areas Only" "0.0" + + // The ability is only effective toward human-controlled survivors. + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0 + // Maximum: 32 + // -- + // 0: OFF + // 1-32: ON, the number of human-controlled survivors required to be present for this ability to be effective. + "Requires Humans" "0" + + // Enable this ability. + // Note: This setting does not affect the "Drunk Hit" setting. + // Note: This setting can be overridden for specific players. + // -- + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Ability Enabled" "0" + + // Show a screen fade effect when the Mutant Tank uses its abilities. + // Note: The colors will randomly change between the colors set in the "Skin Color" and "Glow Color" settings. + // Note: This setting can be overridden for specific players. + // -- + // Add up numbers together for different results. + // -- + // Minimum: 0 + // Maximum: 7 + // -- + // 0: OFF + // 1: Show effect when the Mutant Tank uses its claw/rock attack. + // 2: Show effect when the Mutant Tank is hit by a melee weapon. + // 4: Show effect when the Mutant Tank uses its range ability. + // -- + // Keywords: + // "none"/"off" - 0 + // "attack" - 1 + // "hurt" - 2 + // "attack,hurt" - 3 + // "range" - 4 + // "attack,range" - 5 + // "hurt,range" - 6 + // "attack,hurt,range" - 7 + "Ability Effect" "0" + + // Display a message whenever the ability activates/deactivates. + // Note: This setting can be overridden for specific players. + // -- + // Add up numbers together for different results. + // -- + // Minimum: 0 + // Maximum: 3 + // -- + // 0: OFF + // 1: Display message only when "Drunk Hit" is enabled. + // 2: Display message only when "Ability Enabled" is enabled. + // -- + // Keywords: + // "none"/"off" - 0 + // "hit" - 1 + // "ability" - 2 + // "both"/"all"/"hit,ability" - 3 + "Ability Message" "0" + + // Check line-of-sight when the Mutant Tank uses its abilities. + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0 + // Maximum: 5 + // -- + // 0: OFF + // 1: Check if there is a solid object between the Mutant Tank and survivors. + // 2: Option 1 + Check if the Mutant Tank is looking toward the survivors. + // 3: Option 1 + Check if the Mutant Tank is looking away from the survivors. + // 4: Option 1 + Check if the survivors are looking toward the Mutant Tank. + // 5: Option 1 + Check if the survivors are looking away from the Mutant Tank. + "Ability Sight" "0" + + // The Mutant Tank has this many chances out of 100.0% to trigger the ability. + // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0.0 (No chance) + // Maximum: 100.0 (Highest chance) + // -- + // Keywords: + // "never" - 0% chance + // "sometimes"/"unlikely"/"seldom" - 33.3% chance + // "maybe" - 50% chance + // "often"/"likely"/"frequently" - 66.6% chance + // "always" - 100% chance + "Drunk Chance" "33.3" + + // The cooldown for the Mutant Tank's hit ability. + // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- - // Empty: No immunity flags are immune. - // Not empty: These immunity flags are immune. - "Immunity Flags" "" + // Minimum: 0 (OFF) + // Maximum: 99999 (Longest) + // -- + // Keywords: + // "never"/"disabled"/"false"/"off"/"no" - 0 seconds + // "second" - 1 second + // "minute" - 1 minute + // "forever" - 99999 seconds + "Drunk Cooldown" "0" - // The ability can only activate in close areas. - // Note: Do not change this setting if you are unsure of how it works. + // The Mutant Tank's ability effects last this long. + // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.0 (OFF) - // Maximum: 99999.0 (Farthest) + // Minimum: 1 + // Maximum: 99999 // -- // Keywords: - // "disabled"/"false"/"off"/"no" - 0.0 range - // "farthest" - 99999.0 range - "Close Areas Only" "0.0" + // "second" - 1 second + // "minute" - 1 minute + // "forever" - 99999 seconds + "Drunk Duration" "5" - // Allow human-controlled Mutant Tanks to use this ability. + // Enable the Mutant Tank's claw/rock attack. + // Note: This setting does not need the "Ability Enabled" setting to be set to "1". // Note: This setting can be overridden for specific players. // -- // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON, players can use buttons to activate abilities. - "Human Ability" "0" + // 1/"enabled"/"true"/"on"/"yes": ON + "Drunk Hit" "0" - // The ability can only activate in open areas. - // Note: Do not change this setting if you are unsure of how it works. + // The mode of the Mutant Tank's claw/rock attack. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.0 (OFF) + // 0: Both + // 1: Ability activates when the Mutant Tank hits a survivor. + // 2: Ability activates when the Mutant Tank is hit by a survivor. + // -- + // Keywords: + // "both"/"all" - 0 + // "tank"/"attack" - 1 + // "survivor"/"hurt" - 2 + "Drunk Hit Mode" "0" + + // The distance between a survivor and the Mutant Tank needed to trigger the ability. + // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 1.0 (Closest) // Maximum: 99999.0 (Farthest) // -- // Keywords: - // "disabled"/"false"/"off"/"no" - 0.0 range + // "closest" - 1.0 range // "farthest" - 99999.0 range - "Open Areas Only" "0.0" + "Drunk Range" "150.0" - // The ability is only effective toward human survivors. + // The Mutant Tank has this many chances out of 100.0% to trigger the range ability. + // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 - // Maximum: 32 + // Minimum: 0.0 (No chance) + // Maximum: 100.0 (Highest chance) // -- - // 0: OFF - // 1-32: ON, the number of human survivors required to be present for this ability to be effective. - "Requires Humans" "1" + // Keywords: + // "never" - 0% chance + // "sometimes"/"unlikely"/"seldom" - 33.3% chance + // "maybe" - 50% chance + // "often"/"likely"/"frequently" - 66.6% chance + // "always" - 100% chance + "Drunk Range Chance" "15.0" - // Enable this ability. + // The cooldown for the Mutant Tank's range ability. + // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Ability Enabled" "0" + // Minimum: 0 (OFF) + // Maximum: 99999 (Longest) + // -- + // Keywords: + // "never"/"disabled"/"false"/"off"/"no" - 0 seconds + // "second" - 1 second + // "minute" - 1 minute + // "forever" - 99999 seconds + "Drunk Range Cooldown" "0" - // The damage received by the Mutant Tank is multiplied by this value. - // Note: Damage = Damage x Hit damage multiplier - // Example: Damage = 30.0 x 1.5 = 45.0 - // Note: Use the value "1.0" to disable this setting. (Damage x 1.0 = Damage) + // The Mutant Tank causes the survivors' speed to randomly change every time this many seconds passes. // Note: This setting can be overridden for specific players. // -- - // Minimum: 1.0 + // Minimum: 0.1 // Maximum: 99999.0 - "Hit Damage Multiplier" "1.5" + // -- + // Keywords: + // "milli"/"millisecond" - 0.1 seconds + // "second" - 1 second + // "minute" - 1 minute + // "forever" - 99999 seconds + "Drunk Speed Interval" "1.5" - // The only part of the Mutant Tank that can be damaged. + // The Mutant Tank causes the survivors to turn at a random direction every time this many seconds passes. // Note: This setting can be overridden for specific players. // -- - // Add up numbers together for different results. - // -- - // Minimum: 1 - // Maximum: 127 + // Minimum: 0.1 + // Maximum: 99999.0 // -- - // 1: Headshots only. - // 2: Chest shots only. - // 4: Stomach shots only. - // 8: Left arm shots only. - // 16: Right arm shots only. - // 32: Left leg shots only. - // 64: Right leg shots only. - "Hit Group" "1" + // Keywords: + // "milli"/"millisecond" - 0.1 seconds + // "second" - 1 second + // "minute" - 1 minute + // "forever" - 99999 seconds + "Drunk Turn Interval" "0.5" "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" { - // Note: Override any of the settings in the "Hit Ability" section for each special infected here. + // Note: Override any of the settings in the "Drunk Ability" section for each special infected here. // Example "Access Flags" "" "Immunity Flags" "" "Close Areas Only" "0.0" + "Combo Ability" "0" "Human Ability" "0" + "Human Ammo" "5" + "Human Cooldown" "0" + "Human Range Cooldown" "0" "Open Areas Only" "0.0" - "Requires Humans" "1" + "Requires Humans" "0" "Ability Enabled" "0" - "Hit Damage Multiplier" "1.5" - "Hit Group" "1" + "Ability Effect" "0" + "Ability Message" "0" + "Ability Sight" "0" + "Drunk Chance" "33.3" + "Drunk Cooldown" "0" + "Drunk Duration" "5" + "Drunk Hit" "0" + "Drunk Hit Mode" "0" + "Drunk Range" "150.0" + "Drunk Range Chance" "15.0" + "Drunk Range Cooldown" "0" + "Drunk Speed Interval" "1.5" + "Drunk Turn Interval" "0.5" } } } @@ -16210,7 +14723,7 @@ ```
-##### Hurt Ability +##### Electric Ability
Click to expand! @@ -16219,17 +14732,17 @@ { "Tank #1" { - // The Mutant Tank repeatedly hurts survivors. - // "Ability Enabled" - When a survivor is within range of the Mutant Tank, the survivor gets hurt repeatedly. - // - "Hurt Range" - // - "Hurt Range Chance" - // - "Hurt Range Cooldown" - // "Hurt Hit" - When a survivor is hit by the Mutant Tank's claw or rock, or a survivor hits the Mutant Tank with a melee weapon, the survivor gets hurt repeatedly. - // - "Hurt Chance" - // - "Hurt Cooldown" - // - "Hurt Hit Mode" - // Requires "mt_abilities.smx" to be compiled with "mt_hurt.sp" to work. - "Hurt Ability" + // The Mutant Tank electrocutes survivors. + // "Ability Enabled" - When a survivor is within range of the Mutant Tank, the survivor is electrocuted. + // - "Electric Range" + // - "Electric Range Chance" + // - "Electric Range Cooldown" + // "Electric Hit" - When a survivor is hit by the Mutant Tank's claw or rock, or a survivor hits the Mutant Tank with a melee weapon, the survivor is electrocuted. + // - "Electric Chance" + // - "Electric Cooldown" + // - "Electric Hit Mode" + // Requires "mt_abilities.smx" to be compiled with "mt_electric.sp" to work. + "Electric Ability" { // Admins with one or more of these access flags have access to this ability. // Note: This setting can be overridden for specific players. @@ -16324,18 +14837,18 @@ // "farthest" - 99999.0 range "Open Areas Only" "0.0" - // The ability is only effective toward human survivors. + // The ability is only effective toward human-controlled survivors. // Note: This setting can be overridden for specific players. // -- // Minimum: 0 // Maximum: 32 // -- // 0: OFF - // 1-32: ON, the number of human survivors required to be present for this ability to be effective. + // 1-32: ON, the number of human-controlled survivors required to be present for this ability to be effective. "Requires Humans" "0" // Enable this ability. - // Note: This setting does not affect the "Hurt Hit" setting. + // Note: This setting does not affect the "Electric Hit" setting. // Note: This setting can be overridden for specific players. // -- // 0/"disabled"/"false"/"off"/"no": OFF @@ -16376,7 +14889,7 @@ // Maximum: 3 // -- // 0: OFF - // 1: Display message only when "Hurt Hit" is enabled. + // 1: Display message only when "Electric Hit" is enabled. // 2: Display message only when "Ability Enabled" is enabled. // -- // Keywords: @@ -16413,7 +14926,7 @@ // "maybe" - 50% chance // "often"/"likely"/"frequently" - 66.6% chance // "always" - 100% chance - "Hurt Chance" "33.3" + "Electric Chance" "33.3" // The cooldown for the Mutant Tank's hit ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -16427,9 +14940,9 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Hurt Cooldown" "0" + "Electric Cooldown" "0" - // The Mutant Tank's pain inflictions do this much damage. + // The Mutant Tank's electrocutions do this much damage. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- @@ -16439,7 +14952,7 @@ // Keywords: // "weakest" - 1.0 damage // "strongest" - 99999.0 damage - "Hurt Damage" "5.0" + "Electric Damage" "5.0" // The Mutant Tank's ability effects last this long. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -16452,7 +14965,7 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Hurt Duration" "5" + "Electric Duration" "5" // Enable the Mutant Tank's claw/rock attack. // Note: This setting does not need the "Ability Enabled" setting to be set to "1". @@ -16460,7 +14973,7 @@ // -- // 0/"disabled"/"false"/"off"/"no": OFF // 1/"enabled"/"true"/"on"/"yes": ON - "Hurt Hit" "0" + "Electric Hit" "0" // The mode of the Mutant Tank's claw/rock attack. // Note: This setting can be overridden for specific players. @@ -16473,9 +14986,9 @@ // "both"/"all" - 0 // "tank"/"attack" - 1 // "survivor"/"hurt" - 2 - "Hurt Hit Mode" "0" + "Electric Hit Mode" "0" - // The Mutant Tank hurts survivors every time this many seconds passes. + // The Mutant Tank electrocutes survivors every time this many seconds passes. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- @@ -16487,7 +15000,7 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Hurt Interval" "1.0" + "Electric Interval" "1.0" // The distance between a survivor and the Mutant Tank needed to trigger the ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -16499,7 +15012,7 @@ // Keywords: // "closest" - 1.0 range // "farthest" - 99999.0 range - "Hurt Range" "150.0" + "Electric Range" "150.0" // The Mutant Tank has this many chances out of 100.0% to trigger the range ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -16514,7 +15027,7 @@ // "maybe" - 50% chance // "often"/"likely"/"frequently" - 66.6% chance // "always" - 100% chance - "Hurt Range Chance" "15.0" + "Electric Range Chance" "15.0" // The cooldown for the Mutant Tank's range ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -16528,11 +15041,19 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Hurt Range Cooldown" "0" + "Electric Range Cooldown" "0" + + // The Mutant Tank sets the survivors' run speed to this value when they are stunned. + // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0.1 + // Maximum: 0.99 + "Electric Stun Speed" "0.25" "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" { - // Note: Override any of the settings in the "Hurt Ability" section for each special infected here. + // Note: Override any of the settings in the "Electric Ability" section for each special infected here. // Example "Access Flags" "" @@ -16549,16 +15070,16 @@ "Ability Effect" "0" "Ability Message" "0" "Ability Sight" "0" - "Hurt Chance" "33.3" - "Hurt Cooldown" "0" - "Hurt Damage" "5.0" - "Hurt Duration" "5" - "Hurt Hit" "0" - "Hurt Hit Mode" "0" - "Hurt Interval" "1.0" - "Hurt Range" "150.0" - "Hurt Range Chance" "15.0" - "Hurt Range Cooldown" "0" + "Electric Chance" "33.3" + "Electric Cooldown" "0" + "Electric Damage" "5.0" + "Electric Duration" "5" + "Electric Hit" "0" + "Electric Hit Mode" "0" + "Electric Interval" "1.0" + "Electric Range" "150.0" + "Electric Range Chance" "15.0" + "Electric Range Cooldown" "0" } } } @@ -16566,7 +15087,7 @@ ```
-##### Hypno Ability +##### Enforce Ability
Click to expand! @@ -16575,17 +15096,17 @@ { "Tank #1" { - // The Mutant Tank hypnotizes survivors to damage themselves or their teammates. - // "Ability Enabled" - When a survivor is within range of the Mutant Tank, the survivor is hypnotized. - // - "Hypno Range" - // - "Hypno Range Chance" - // - "Hypno Range Cooldown" - // "Hypno Hit" - When a survivor is hit by the Mutant Tank's claw or rock, or a survivor hits the Mutant Tank with a melee weapon, the survivor is hypnotized. - // - "Hypno Chance" - // - "Hypno Cooldown" - // - "Hypno Hit Mode" - // Requires "mt_abilities.smx" to be compiled with "mt_hypno.sp" to work. - "Hypno Ability" + // The Mutant Tank forces survivors to only use a certain weapon slot. + // "Ability Enabled" - When a survivor is within range of the Mutant Tank, the survivor is forced to only use a certain weapon slot. + // - "Enforce Range" + // - "Enforce Range Chance" + // - "Enforce Range Cooldown" + // "Enforce Hit" - When a survivor is hit by the Mutant Tank's claw or rock, or a survivor hits the Mutant Tank with a melee weapon, the survivor is forced to only use a certain weapon slot. + // - "Enforce Chance" + // - "Enforce Cooldown" + // - "Enforce Hit Mode" + // Requires "mt_abilities.smx" to be compiled with "mt_enforce.sp" to work. + "Enforce Ability" { // Admins with one or more of these access flags have access to this ability. // Note: This setting can be overridden for specific players. @@ -16680,18 +15201,18 @@ // "farthest" - 99999.0 range "Open Areas Only" "0.0" - // The ability is only effective toward human survivors. + // The ability is only effective toward human-controlled survivors. // Note: This setting can be overridden for specific players. // -- // Minimum: 0 // Maximum: 32 // -- // 0: OFF - // 1-32: ON, the number of human survivors required to be present for this ability to be effective. + // 1-32: ON, the number of human-controlled survivors required to be present for this ability to be effective. "Requires Humans" "0" // Enable this ability. - // Note: This setting does not affect the "Hypno Hit" setting. + // Note: This setting does not affect the "Enforce Hit" setting. // Note: This setting can be overridden for specific players. // -- // 0/"disabled"/"false"/"off"/"no": OFF @@ -16732,7 +15253,7 @@ // Maximum: 3 // -- // 0: OFF - // 1: Display message only when "Hypno Hit" is enabled. + // 1: Display message only when "Enforce Hit" is enabled. // 2: Display message only when "Ability Enabled" is enabled. // -- // Keywords: @@ -16756,16 +15277,6 @@ // 5: Option 1 + Check if the survivors are looking away from the Mutant Tank. "Ability Sight" "0" - // The bullet damage reflected towards survivors by the Mutant Tank is divided by this value. - // Note: Damage = Bullet damage/Hypno bullet divisor - // Example: Damage = 30.0/20.0 (1.5) - // Note: Use the value "1.0" to disable this setting. (Bullet damage/1.0 = Bullet damage) - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 1.0 - // Maximum: 99999.0 - "Hypno Bullet Divisor" "20.0" - // The Mutant Tank has this many chances out of 100.0% to trigger the ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. @@ -16779,20 +15290,7 @@ // "maybe" - 50% chance // "often"/"likely"/"frequently" - 66.6% chance // "always" - 100% chance - "Hypno Chance" "33.3" - - // These are the RGBA values of the Mutant Tank's shield prop's color. - // Note: Any value less than "0" will output a random color. - // Note: This setting can be overridden for specific players. - // -- - // 1st number = Red - // 2nd number = Green - // 3rd number = Blue - // 4th number = Alpha - // -- - // Keywords: - // "rainbow" - cycle through colors constantly. - "Hypno Color" "255,255,255,255" + "Enforce Chance" "33.3" // The cooldown for the Mutant Tank's hit ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -16806,7 +15304,7 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Hypno Cooldown" "0" + "Enforce Cooldown" "0" // The Mutant Tank's ability effects last this long. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -16820,27 +15318,7 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Hypno Duration" "5.0" - - // The explosive damage reflected towards survivors by the Mutant Tank is divided by this value. - // Note: Damage = Explosive damage/Hypno explosive divisor - // Example: Damage = 30.0/20.0 (1.5) - // Note: Use the value "1.0" to disable this setting. (Explosive damage/1.0 = Explosive damage) - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 1.0 - // Maximum: 99999.0 - "Hypno Explosive Divisor" "20.0" - - // The fire damage reflected towards survivors by the Mutant Tank is divided by this value. - // Note: Damage = Fire damage/Hypno fire divisor - // Example: Damage = 300.0/200.0 (1.5) - // Note: Use the value "1.0" to disable this setting. (Fire damage/1.0 = Fire damage) - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 1.0 - // Maximum: 99999.0 - "Hypno Fire Divisor" "200.0" + "Enforce Duration" "5.0" // Enable the Mutant Tank's claw/rock attack. // Note: This setting does not need the "Ability Enabled" setting to be set to "1". @@ -16848,7 +15326,7 @@ // -- // 0/"disabled"/"false"/"off"/"no": OFF // 1/"enabled"/"true"/"on"/"yes": ON - "Hypno Hit" "0" + "Enforce Hit" "0" // The mode of the Mutant Tank's claw/rock attack. // Note: This setting can be overridden for specific players. @@ -16861,34 +15339,7 @@ // "both"/"all" - 0 // "tank"/"attack" - 1 // "survivor"/"hurt" - 2 - "Hypno Hit Mode" "0" - - // The hittable damage reflected towards survivors by the Mutant Tank is divided by this value. - // Note: Damage = Hittable damage/Hypno hittable divisor - // Example: Damage = 30.0/20.0 (1.5) - // Note: Use the value "1.0" to disable this setting. (Hittable damage/1.0 = Hittable damage) - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 1.0 - // Maximum: 99999.0 - "Hypno Hittable Divisor" "20.0" - - // The melee damage reflected towards survivors by the Mutant Tank is divided by this value. - // Note: Damage = Melee damage/Hypno melee divisor - // Example: Damage = 300.0/200.0 (1.5) - // Note: Use the value "1.0" to disable this setting. (Melee damage/1.0 = Melee damage) - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 1.0 - // Maximum: 99999.0 - "Hypno Melee Divisor" "200.0" - - // The mode of the Mutant Tank's hypno ability. - // Note: This setting can be overridden for specific players. - // -- - // 0: Hypnotized survivors hurt themselves. - // 1: Hypnotized survivors can hurt their teammates. - "Hypno Mode" "0" + "Enforce Hit Mode" "0" // The distance between a survivor and the Mutant Tank needed to trigger the ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -16900,7 +15351,7 @@ // Keywords: // "closest" - 1.0 range // "farthest" - 99999.0 range - "Hypno Range" "150.0" + "Enforce Range" "150.0" // The Mutant Tank has this many chances out of 100.0% to trigger the range ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -16915,7 +15366,7 @@ // "maybe" - 50% chance // "often"/"likely"/"frequently" - 66.6% chance // "always" - 100% chance - "Hypno Range Chance" "15.0" + "Enforce Range Chance" "15.0" // The cooldown for the Mutant Tank's range ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -16929,18 +15380,27 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Hypno Range Cooldown" "0" + "Enforce Range Cooldown" "0" - // The Mutant Tank will have a shield that is only visible to hypnotized survivors. + // The Mutant Tank forces survivors to only use one of the following weapon slots. // Note: This setting can be overridden for specific players. // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Hypno View" "0" + // Add up numbers together for different results. + // -- + // Minimum: 0 + // Maximum: 31 + // -- + // 0 OR 31: Pick randomly between the 5 slots. + // 1: 1st slot only. + // 2: 2nd slot only. + // 4: 3rd slot only. + // 8: 4th slot only. + // 16: 5th slot only. + "Enforce Weapon Slots" "0" "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" { - // Note: Override any of the settings in the "Hypno Ability" section for each special infected here. + // Note: Override any of the settings in the "Enforce Ability" section for each special infected here. // Example "Access Flags" "" @@ -16957,22 +15417,15 @@ "Ability Effect" "0" "Ability Message" "0" "Ability Sight" "0" - "Hypno Bullet Divisor" "20.0" - "Hypno Chance" "33.3" - "Hypno Color" "255,255,255,255" - "Hypno Cooldown" "0" - "Hypno Duration" "5.0" - "Hypno Explosive Divisor" "20.0" - "Hypno Fire Divisor" "200.0" - "Hypno Hit" "0" - "Hypno Hit Mode" "0" - "Hypno Hittable Divisor" "20.0" - "Hypno Melee Divisor" "200.0" - "Hypno Mode" "0" - "Hypno Range" "150.0" - "Hypno Range Chance" "15.0" - "Hypno Range Cooldown" "0" - "Hypno View" "0" + "Enforce Chance" "33.3" + "Enforce Cooldown" "0" + "Enforce Duration" "5.0" + "Enforce Hit" "0" + "Enforce Hit Mode" "0" + "Enforce Range" "150.0" + "Enforce Range Chance" "15.0" + "Enforce Range Cooldown" "0" + "Enforce Weapon Slots" "0" } } } @@ -16980,7 +15433,7 @@ ```
-##### Ice Ability +##### Fast Ability
Click to expand! @@ -16989,17 +15442,9 @@ { "Tank #1" { - // The Mutant Tank freezes survivors. - // "Ability Enabled" - When a survivor is within range of the Mutant Tank, the survivor is frozen in place. - // - "Ice Range" - // - "Ice Range Chance" - // - "Ice Range Cooldown" - // "Ice Hit" - When a survivor is hit by the Mutant Tank's claw or rock, or a survivor hits the Mutant Tank with a melee weapon, the survivor is frozen in place. - // - "Ice Chance" - // - "Ice Cooldown" - // - "Ice Hit Mode" - // Requires "mt_abilities.smx" to be compiled with "mt_ice.sp" to work. - "Ice Ability" + // The Mutant Tank runs really fast like the Flash. + // Requires "mt_abilities.smx" to be compiled with "mt_fast.sp" to work. + "Fast Ability" { // Admins with one or more of these access flags have access to this ability. // Note: This setting can be overridden for specific players. @@ -17069,18 +15514,26 @@ // "forever" - 99999 seconds "Human Cooldown" "0" - // Human-controlled Mutant Tanks must wait this long before using their range ability again. + // The Mutant Tank's ability effects last this long. + // Note: This setting does not affect human-controlled Mutant Tanks unless the "Human Mode" setting is set to "0". // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 (OFF) - // Maximum: 99999 (Longest) + // Minimum: 0 + // Maximum: 99999 // -- // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Human Range Cooldown" "0" + "Human Duration" "5" + + // The mode of how human-controlled Mutant Tanks activate their abilities. + // Note: This setting can be overridden for specific players. + // -- + // 0: Press buttons to activate corresponding abilities. Cooldown starts after ability is activated. + // 1: Hold down buttons to keep corresponding abilities activated. Cooldown starts after the player lets go of the buttons. + // 2: Press buttons to toggle corresponding abilities. Cooldown starts after ability is deactivated. + "Human Mode" "1" // The ability can only activate in open areas. // Note: Do not change this setting if you are unsure of how it works. @@ -17094,66 +15547,28 @@ // "farthest" - 99999.0 range "Open Areas Only" "0.0" - // The ability is only effective toward human survivors. + // The ability is only effective toward human-controlled survivors. // Note: This setting can be overridden for specific players. // -- // Minimum: 0 // Maximum: 32 // -- // 0: OFF - // 1-32: ON, the number of human survivors required to be present for this ability to be effective. + // 1-32: ON, the number of human-controlled survivors required to be present for this ability to be effective. "Requires Humans" "0" // Enable this ability. - // Note: This setting does not affect the "Ice Hit" setting. // Note: This setting can be overridden for specific players. // -- // 0/"disabled"/"false"/"off"/"no": OFF // 1/"enabled"/"true"/"on"/"yes": ON "Ability Enabled" "0" - // Show a screen fade effect when the Mutant Tank uses its abilities. - // Note: The colors will randomly change between the colors set in the "Skin Color" and "Glow Color" settings. - // Note: This setting can be overridden for specific players. - // -- - // Add up numbers together for different results. - // -- - // Minimum: 0 - // Maximum: 7 - // -- - // 0: OFF - // 1: Show effect when the Mutant Tank uses its claw/rock attack. - // 2: Show effect when the Mutant Tank is hit by a melee weapon. - // 4: Show effect when the Mutant Tank uses its range ability. - // -- - // Keywords: - // "none"/"off" - 0 - // "attack" - 1 - // "hurt" - 2 - // "attack,hurt" - 3 - // "range" - 4 - // "attack,range" - 5 - // "hurt,range" - 6 - // "attack,hurt,range" - 7 - "Ability Effect" "0" - // Display a message whenever the ability activates/deactivates. // Note: This setting can be overridden for specific players. // -- - // Add up numbers together for different results. - // -- - // Minimum: 0 - // Maximum: 3 - // -- - // 0: OFF - // 1: Display message only when "Ice Hit" is enabled. - // 2: Display message only when "Ability Enabled" is enabled. - // -- - // Keywords: - // "none"/"off" - 0 - // "hit" - 1 - // "ability" - 2 - // "both"/"all"/"hit,ability" - 3 + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON "Ability Message" "0" // Check line-of-sight when the Mutant Tank uses its abilities. @@ -17183,9 +15598,9 @@ // "maybe" - 50% chance // "often"/"likely"/"frequently" - 66.6% chance // "always" - 100% chance - "Ice Chance" "33.3" + "Fast Chance" "33.3" - // The cooldown for the Mutant Tank's hit ability. + // The cooldown for the Mutant Tank's ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- @@ -17193,61 +15608,24 @@ // Maximum: 99999 (Longest) // -- // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Ice Cooldown" "0" - - // The Mutant Tank's ability effects last this long. - // Note: This is ignored when the "Combo Ability" setting is set to "1". - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0.1 - // Maximum: 99999.0 - // -- - // Keywords: - // "milli"/"millisecond" - 0.1 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Ice Duration" "5.0" - - // Enable the Mutant Tank's claw/rock attack. - // Note: This setting does not need the "Ability Enabled" setting to be set to "1". - // Note: This setting can be overridden for specific players. - // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Ice Hit" "0" - - // The mode of the Mutant Tank's claw/rock attack. - // Note: This setting can be overridden for specific players. - // -- - // 0: Both - // 1: Ability activates when the Mutant Tank hits a survivor. - // 2: Ability activates when the Mutant Tank is hit by a survivor. - // -- - // Keywords: - // "both"/"all" - 0 - // "tank"/"attack" - 1 - // "survivor"/"hurt" - 2 - "Ice Hit Mode" "0" + // "never"/"disabled"/"false"/"off"/"no" - 0 seconds + // "second" - 1 second + // "minute" - 1 minute + // "forever" - 99999 seconds + "Fast Cooldown" "0" - // The distance between a survivor and the Mutant Tank needed to trigger the ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // The Mutant Tank dashes to damage nearby survivors after incapacitating or killing a survivor. // Note: This setting can be overridden for specific players. // -- - // Minimum: 1.0 (Closest) - // Maximum: 99999.0 (Farthest) + // Minimum: 0.0 (OFF) + // Maximum: 99999.0 // -- // Keywords: - // "closest" - 1.0 range - // "farthest" - 99999.0 range - "Ice Range" "150.0" + // "weakest" - 1.0 damage + // "strongest" - 99999.0 damage + "Fast Dash" "0.0" - // The Mutant Tank has this many chances out of 100.0% to trigger the range ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // The Mutant Tank has this many chances out of 100.0% to trigger the dash ability. // Note: This setting can be overridden for specific players. // -- // Minimum: 0.0 (No chance) @@ -17259,25 +15637,43 @@ // "maybe" - 50% chance // "often"/"likely"/"frequently" - 66.6% chance // "always" - 100% chance - "Ice Range Chance" "15.0" + "Fast Dash Chance" "33.3" - // The cooldown for the Mutant Tank's range ability. + // The Mutant Tank's dash ability damages survivors that are within this range. + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 1.0 (Closest) + // Maximum: 99999.0 (Farthest) + // -- + // Keywords: + // "closest" - 1.0 range + // "farthest" - 99999.0 range + "Fast Dash Range" "150.0" + + // The Mutant Tank's ability effects last this long. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 (OFF) - // Maximum: 99999 (Longest) + // Minimum: 0 + // Maximum: 99999 // -- // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Ice Range Cooldown" "0" + "Fast Duration" "5" + + // The Mutant Tank's special speed. + // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0.1 + // Maximum: 99.0 + "Fast Speed" "5.0" "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" { - // Note: Override any of the settings in the "Ice Ability" section for each special infected here. + // Note: Override any of the settings in the "Fast Ability" section for each special infected here. // Example "Access Flags" "" @@ -17287,21 +15683,20 @@ "Human Ability" "0" "Human Ammo" "5" "Human Cooldown" "0" - "Human Range Cooldown" "0" + "Human Duration" "5" + "Human Mode" "1" "Open Areas Only" "0.0" "Requires Humans" "0" "Ability Enabled" "0" - "Ability Effect" "0" "Ability Message" "0" "Ability Sight" "0" - "Ice Chance" "33.3" - "Ice Cooldown" "0" - "Ice Duration" "5.0" - "Ice Hit" "0" - "Ice Hit Mode" "0" - "Ice Range" "150.0" - "Ice Range Chance" "15.0" - "Ice Range Cooldown" "0" + "Fast Chance" "33.3" + "Fast Cooldown" "0" + "Fast Dash" "0.0" + "Fast Dash Chance" "33.3" + "Fast Dash Range" "150.0" + "Fast Duration" "5" + "Fast Speed" "5.0" } } } @@ -17309,7 +15704,7 @@ ```
-##### Idle Ability +##### Fire Ability
Click to expand! @@ -17318,17 +15713,23 @@ { "Tank #1" { - // The Mutant Tank forces survivors to go idle. - // "Ability Enabled" - When a survivor is within range of the Mutant Tank, the survivor goes idle. - // - "Idle Range" - // - "Idle Range Chance" - // - "Idle Range Cooldown" - // "Idle Hit" - When a survivor is hit by the Mutant Tank's claw or rock, or a survivor hits the Mutant Tank with a melee weapon, the survivor goes idle. - // - "Idle Chance" - // - "Idle Cooldown" - // - "Idle Hit Mode" - // Requires "mt_abilities.smx" to be compiled with "mt_idle.sp" to work. - "Idle Ability" + // The Mutant Tank creates fires. + // "Ability Enabled" - When a survivor is within range of the Mutant Tank, a fire is created around the survivor. + // - "Fire Range" + // - "Fire Range Chance" + // - "Fire Range Cooldown" + // "Fire Death" - When the Mutant Tank dies or spawns, a fire is created around the Mutant Tank. + // - "Fire Death Chance" + // - "Fire Death Range" + // "Fire Hit" - When a survivor is hit by the Mutant Tank's claw or rock, or a survivor hits the Mutant Tank with a melee weapon, a fire is created around the survivor. + // - "Fire Chance" + // - "Fire Cooldown" + // - "Fire Hit Mode" + // "Fire Rock Break" - When the Mutant Tank's rock breaks, it creates a fire. + // - "Fire Rock Chance" + // - "Fire Rock Cooldown" + // Requires "mt_abilities.smx" to be compiled with "mt_fire.sp" to work. + "Fire Ability" { // Admins with one or more of these access flags have access to this ability. // Note: This setting can be overridden for specific players. @@ -17385,7 +15786,7 @@ // "infinite" - 99999 ammo "Human Ammo" "5" - // Human-controlled Mutant Tanks must wait this long before using their abilities again. + // Human-controlled Mutant Tanks must wait this long before using their hit ability again. // Note: This setting can be overridden for specific players. // -- // Minimum: 0 (OFF) @@ -17411,6 +15812,19 @@ // "forever" - 99999 seconds "Human Range Cooldown" "0" + // Human-controlled Mutant Tanks must wait this long before using their rock ability again. + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0 (OFF) + // Maximum: 99999 (Longest) + // -- + // Keywords: + // "never"/"disabled"/"false"/"off"/"no" - 0 seconds + // "second" - 1 second + // "minute" - 1 minute + // "forever" - 99999 seconds + "Human Rock Cooldown" "0" + // The ability can only activate in open areas. // Note: Do not change this setting if you are unsure of how it works. // Note: This setting can be overridden for specific players. @@ -17423,18 +15837,18 @@ // "farthest" - 99999.0 range "Open Areas Only" "0.0" - // The ability is only effective toward human survivors. + // The ability is only effective toward human-controlled survivors. // Note: This setting can be overridden for specific players. // -- // Minimum: 0 // Maximum: 32 // -- // 0: OFF - // 1-32: ON, the number of human survivors required to be present for this ability to be effective. - "Requires Humans" "1" + // 1-32: ON, the number of human-controlled survivors required to be present for this ability to be effective. + "Requires Humans" "0" // Enable this ability. - // Note: This setting does not affect the "Idle Hit" setting. + // Note: This setting does not affect the "Fire Hit" setting. // Note: This setting can be overridden for specific players. // -- // 0/"disabled"/"false"/"off"/"no": OFF @@ -17466,23 +15880,28 @@ // "attack,hurt,range" - 7 "Ability Effect" "0" - // Display a message whenever the ability activates/deactivates. + // Display a message whenever the abilities activate/deactivate. // Note: This setting can be overridden for specific players. // -- // Add up numbers together for different results. // -- // Minimum: 0 - // Maximum: 3 + // Maximum: 7 // -- // 0: OFF - // 1: Display message only when "Idle Hit" is enabled. + // 1: Display message only when "Fire Hit" is enabled. // 2: Display message only when "Ability Enabled" is enabled. + // 4: Display message only when "Fire Rock Break" is enabled. // -- // Keywords: // "none"/"off" - 0 // "hit" - 1 // "ability" - 2 - // "both"/"all"/"hit,ability" - 3 + // "hit,ability" - 3 + // "rock" - 4 + // "hit,rock" - 5 + // "ability,rock" - 6 + // "hit,ability,rock"/"all" - 7 "Ability Message" "0" // Check line-of-sight when the Mutant Tank uses its abilities. @@ -17512,7 +15931,7 @@ // "maybe" - 50% chance // "often"/"likely"/"frequently" - 66.6% chance // "always" - 100% chance - "Idle Chance" "33.3" + "Fire Chance" "33.3" // The cooldown for the Mutant Tank's hit ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -17526,7 +15945,60 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Idle Cooldown" "0" + "Fire Cooldown" "0" + + // The Mutant Tank's fires do this much damage. + // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0.0 (OFF) + // Maximum: 99999.0 + // -- + // Keywords: + // "weakest" - 1.0 damage + // "strongest" - 99999.0 damage + "Fire Damage" "3.0" + + // Enable the Mutant Tank's upon-death range ability. + // Note: This setting does not need the "Ability Enabled" setting to be set to "1". + // Note: This setting can be overridden for specific players. + // -- + // Add up numbers together for different results. + // -- + // Minimum: 0 + // Maximum: 3 + // -- + // 0: OFF + // 1: Trigger the range ability when the Mutant Tank dies. + // 2: Trigger the range ability when the Mutant Tank spawns. + "Fire Death" "1" + + // The Mutant Tank has this many chances out of 100.0% to trigger the upon-death ability. + // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0.0 (No chance) + // Maximum: 100.0 (Highest chance) + // -- + // Keywords: + // "never" - 0% chance + // "sometimes"/"unlikely"/"seldom" - 33.3% chance + // "maybe" - 50% chance + // "often"/"likely"/"frequently" - 66.6% chance + // "always" - 100% chance + "Fire Death Chance" "33.3" + + // The distance between a survivor and the Mutant Tank needed to trigger the upon-death ability. + // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 1.0 (Closest) + // Maximum: 99999.0 (Farthest) + // -- + // Keywords: + // "closest" - 1.0 range + // "farthest" - 99999.0 range + "Fire Death Range" "200.0" // Enable the Mutant Tank's claw/rock attack. // Note: This setting does not need the "Ability Enabled" setting to be set to "1". @@ -17534,7 +16006,7 @@ // -- // 0/"disabled"/"false"/"off"/"no": OFF // 1/"enabled"/"true"/"on"/"yes": ON - "Idle Hit" "0" + "Fire Hit" "0" // The mode of the Mutant Tank's claw/rock attack. // Note: This setting can be overridden for specific players. @@ -17547,7 +16019,7 @@ // "both"/"all" - 0 // "tank"/"attack" - 1 // "survivor"/"hurt" - 2 - "Idle Hit Mode" "0" + "Fire Hit Mode" "0" // The distance between a survivor and the Mutant Tank needed to trigger the ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -17559,7 +16031,7 @@ // Keywords: // "closest" - 1.0 range // "farthest" - 99999.0 range - "Idle Range" "150.0" + "Fire Range" "150.0" // The Mutant Tank has this many chances out of 100.0% to trigger the range ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -17574,7 +16046,7 @@ // "maybe" - 50% chance // "often"/"likely"/"frequently" - 66.6% chance // "always" - 100% chance - "Idle Range Chance" "15.0" + "Fire Range Chance" "15.0" // The cooldown for the Mutant Tank's range ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -17588,11 +16060,48 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Idle Range Cooldown" "0" + "Fire Range Cooldown" "0" + + // The Mutant Tank's rock creates a fire when it breaks. + // Note: This does not need "Ability Enabled" or "Fire Hit" to be set to "1". + // Note: This setting can be overridden for specific players. + // -- + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Fire Rock Break" "0" + + // The Mutant Tank's rock has this many chances out of 100.0% to trigger the rock break ability. + // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0.0 (No chance) + // Maximum: 100.0 (Highest chance) + // -- + // Keywords: + // "never" - 0% chance + // "sometimes"/"unlikely"/"seldom" - 33.3% chance + // "maybe" - 50% chance + // "often"/"likely"/"frequently" - 66.6% chance + // "always" - 100% chance + "Fire Rock Chance" "33.3" + + // The cooldown for the Mutant Tank's rock ability. + // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0 (OFF) + // Maximum: 99999 (Longest) + // -- + // Keywords: + // "never"/"disabled"/"false"/"off"/"no" - 0 seconds + // "second" - 1 second + // "minute" - 1 minute + // "forever" - 99999 seconds + "Fire Rock Cooldown" "0" "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" { - // Note: Override any of the settings in the "Idle Ability" section for each special infected here. + // Note: Override any of the settings in the "Fire Ability" section for each special infected here. // Example "Access Flags" "" @@ -17602,20 +16111,28 @@ "Human Ability" "0" "Human Ammo" "5" "Human Cooldown" "0" + "Human Pin Cooldown" "0" "Human Range Cooldown" "0" "Open Areas Only" "0.0" - "Requires Humans" "1" + "Requires Humans" "0" "Ability Enabled" "0" "Ability Effect" "0" "Ability Message" "0" "Ability Sight" "0" - "Idle Chance" "33.3" - "Idle Cooldown" "0" - "Idle Hit" "0" - "Idle Hit Mode" "0" - "Idle Range" "150.0" - "Idle Range Chance" "15.0" - "Idle Range Cooldown" "0" + "Fire Chance" "33.3" + "Fire Cooldown" "0" + "Fire Damage" "3.0" + "Fire Death" "1" + "Fire Death Chance" "33.3" + "Fire Death Range" "200.0" + "Fire Hit" "0" + "Fire Hit Mode" "0" + "Fire Pin" "0" + "Fire Pin Chance" "33.3" + "Fire Pin Cooldown" "0" + "Fire Range" "150.0" + "Fire Range Chance" "15.0" + "Fire Range Cooldown" "0" } } } @@ -17623,7 +16140,7 @@ ```
-##### Invert Ability +##### Fling Ability
Click to expand! @@ -17632,17 +16149,21 @@ { "Tank #1" { - // The Mutant Tank inverts the survivors' movement keys. - // "Ability Enabled" - When a survivor is within range of the Mutant Tank, the survivor's movement keys are inverted. - // - "Invert Range" - // - "Invert Range Chance" - // - "Invert Range Cooldown" - // "Invert Hit" - When a survivor is hit by the Mutant Tank's claw or rock, or a survivor hits the Mutant Tank with a melee weapon, the survivor's movement keys are inverted. - // - "Invert Chance" - // - "Invert Cooldown" - // - "Invert Hit Mode" - // Requires "mt_abilities.smx" to be compiled with "mt_invert.sp" to work. - "Invert Ability" + // The Mutant Tank flings survivors high into the air. + // "Ability Enabled" - When a survivor is within range of the Mutant Tank, the survivor is flung into the air. + // - "Fling Range" + // - "Fling Range Chance" + // - "Fling Range Cooldown" + // "Fling Death" - When the Mutant Tank dies or spawns, nearby survivors are flung into the air. + // - "Fling Death Chance" + // - "Fling Death Range" + // "Fling Hit" - When a survivor is hit by the Mutant Tank's claw or rock, or a survivor hits the Mutant Tank with a melee weapon, the survivor is flung into the air. + // - "Fling Chance" + // - "Fling Cooldown" + // - "Fling Hit Mode" + // Requires "mt_abilities.smx" to be compiled with "mt_fling.sp" to work. + // Note: Only available in Left 4 Dead 2. + "Fling Ability" { // Admins with one or more of these access flags have access to this ability. // Note: This setting can be overridden for specific players. @@ -17737,18 +16258,18 @@ // "farthest" - 99999.0 range "Open Areas Only" "0.0" - // The ability is only effective toward human survivors. + // The ability is only effective toward human-controlled survivors. // Note: This setting can be overridden for specific players. // -- // Minimum: 0 // Maximum: 32 // -- // 0: OFF - // 1-32: ON, the number of human survivors required to be present for this ability to be effective. + // 1-32: ON, the number of human-controlled survivors required to be present for this ability to be effective. "Requires Humans" "0" // Enable this ability. - // Note: This setting does not affect the "Invert Hit" setting. + // Note: This setting does not affect the "Fling Hit" setting. // Note: This setting can be overridden for specific players. // -- // 0/"disabled"/"false"/"off"/"no": OFF @@ -17789,7 +16310,7 @@ // Maximum: 3 // -- // 0: OFF - // 1: Display message only when "Invert Hit" is enabled. + // 1: Display message only when "Fling Hit" is enabled. // 2: Display message only when "Ability Enabled" is enabled. // -- // Keywords: @@ -17826,7 +16347,7 @@ // "maybe" - 50% chance // "often"/"likely"/"frequently" - 66.6% chance // "always" - 100% chance - "Invert Chance" "33.3" + "Fling Chance" "33.3" // The cooldown for the Mutant Tank's hit ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -17840,21 +16361,56 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Invert Cooldown" "0" + "Fling Cooldown" "0" - // The Mutant Tank's ability effects last this long. + // Enable the Mutant Tank's upon-death range ability. + // Note: This setting does not need the "Ability Enabled" setting to be set to "1". + // Note: This setting can be overridden for specific players. + // -- + // Add up numbers together for different results. + // -- + // Minimum: 0 + // Maximum: 3 + // -- + // 0: OFF + // 1: Trigger the range ability when the Mutant Tank dies. + // 2: Trigger the range ability when the Mutant Tank spawns. + "Fling Death" "1" + + // The Mutant Tank has this many chances out of 100.0% to trigger the upon-death ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.1 - // Maximum: 99999.0 + // Minimum: 0.0 (No chance) + // Maximum: 100.0 (Highest chance) // -- // Keywords: - // "milli"/"millisecond" - 0.1 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Invert Duration" "5.0" + // "never" - 0% chance + // "sometimes"/"unlikely"/"seldom" - 33.3% chance + // "maybe" - 50% chance + // "often"/"likely"/"frequently" - 66.6% chance + // "always" - 100% chance + "Fling Death Chance" "33.3" + + // The distance between a survivor and the Mutant Tank needed to trigger the upon-death ability. + // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 1.0 (Closest) + // Maximum: 99999.0 (Farthest) + // -- + // Keywords: + // "closest" - 1.0 range + // "farthest" - 99999.0 range + "Fling Death Range" "200.0" + + // The force of the Mutant Tank's ability. + // Note: This setting determines how powerful the force is. + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0.1 + // Maximum: 99999.0 + "Fling Force" "300.0" // Enable the Mutant Tank's claw/rock attack. // Note: This setting does not need the "Ability Enabled" setting to be set to "1". @@ -17862,7 +16418,7 @@ // -- // 0/"disabled"/"false"/"off"/"no": OFF // 1/"enabled"/"true"/"on"/"yes": ON - "Invert Hit" "0" + "Fling Hit" "0" // The mode of the Mutant Tank's claw/rock attack. // Note: This setting can be overridden for specific players. @@ -17875,7 +16431,7 @@ // "both"/"all" - 0 // "tank"/"attack" - 1 // "survivor"/"hurt" - 2 - "Invert Hit Mode" "0" + "Fling Hit Mode" "0" // The distance between a survivor and the Mutant Tank needed to trigger the ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -17887,7 +16443,7 @@ // Keywords: // "closest" - 1.0 range // "farthest" - 99999.0 range - "Invert Range" "150.0" + "Fling Range" "150.0" // The Mutant Tank has this many chances out of 100.0% to trigger the range ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -17902,7 +16458,7 @@ // "maybe" - 50% chance // "often"/"likely"/"frequently" - 66.6% chance // "always" - 100% chance - "Invert Range Chance" "15.0" + "Fling Range Chance" "15.0" // The cooldown for the Mutant Tank's range ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -17916,11 +16472,11 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Invert Range Cooldown" "0" + "Fling Range Cooldown" "0" "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" { - // Note: Override any of the settings in the "Invert Ability" section for each special infected here. + // Note: Override any of the settings in the "Fling Ability" section for each special infected here. // Example "Access Flags" "" @@ -17937,14 +16493,17 @@ "Ability Effect" "0" "Ability Message" "0" "Ability Sight" "0" - "Invert Chance" "33.3" - "Invert Cooldown" "0" - "Invert Duration" "5.0" - "Invert Hit" "0" - "Invert Hit Mode" "0" - "Invert Range" "150.0" - "Invert Range Chance" "15.0" - "Invert Range Cooldown" "0" + "Fling Chance" "33.3" + "Fling Cooldown" "0" + "Fling Death" "1" + "Fling Death Chance" "33.3" + "Fling Death Range" "200.0" + "Fling Force" "300.0" + "Fling Hit" "0" + "Fling Hit Mode" "0" + "Fling Range" "150.0" + "Fling Range Chance" "15.0" + "Fling Range Cooldown" "0" } } } @@ -17952,7 +16511,7 @@ ```
-##### Item Ability +##### Fly Ability
Click to expand! @@ -17961,16 +16520,9 @@ { "Tank #1" { - // The Mutant Tank gives survivors items upon death. - // "Ability Enabled" - When the Mutant Tank dies, it gives survivors items. - // - "Item Chance" - // - "Item Loadout" - // - "Item Mode" - // "Item Pinata" - When the Mutant Tank kills a survivor, the survivor drops items. - // - "Item Pinata Body" - // - "Item Pinata Chance" - // Requires "mt_abilities.smx" to be compiled with "mt_item.sp" to work. - "Item Ability" + // The Mutant Tank can fly. + // Requires "mt_abilities.smx" to be compiled with "mt_fly.sp" to work. + "Fly Ability" { // Admins with one or more of these access flags have access to this ability. // Note: This setting can be overridden for specific players. @@ -18016,6 +16568,51 @@ // 2: ON, abilities will activate automatically. "Human Ability" "0" + // Determines how many times human-controlled Mutant Tanks can use their abilities in one life. + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0 + // Maximum: 99999 + // -- + // Keywords: + // "none"/"off" - 0 ammo + // "infinite" - 99999 ammo + "Human Ammo" "5" + + // Human-controlled Mutant Tanks must wait this long before using their abilities again. + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0 (OFF) + // Maximum: 99999 (Longest) + // -- + // Keywords: + // "never"/"disabled"/"false"/"off"/"no" - 0 seconds + // "second" - 1 second + // "minute" - 1 minute + // "forever" - 99999 seconds + "Human Cooldown" "0" + + // The Mutant Tank's ability effects last this long. + // Note: This setting does not affect human-controlled Mutant Tanks unless the "Human Mode" setting is set to "0". + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0 + // Maximum: 99999 + // -- + // Keywords: + // "second" - 1 second + // "minute" - 1 minute + // "forever" - 99999 seconds + "Human Duration" "30" + + // The mode of how human-controlled Mutant Tanks activate their abilities. + // Note: This setting can be overridden for specific players. + // -- + // 0: Press buttons to activate corresponding abilities. Cooldown starts after ability is activated. + // 1: Hold down buttons to keep corresponding abilities activated. Cooldown starts after the player lets go of the buttons. + // 2: Press buttons to toggle corresponding abilities. Cooldown starts after ability is deactivated. + "Human Mode" "1" + // The ability can only activate in open areas. // Note: Do not change this setting if you are unsure of how it works. // Note: This setting can be overridden for specific players. @@ -18028,14 +16625,14 @@ // "farthest" - 99999.0 range "Open Areas Only" "0.0" - // The ability is only effective toward human survivors. + // The ability is only effective toward human-controlled survivors. // Note: This setting can be overridden for specific players. // -- // Minimum: 0 // Maximum: 32 // -- // 0: OFF - // 1-32: ON, the number of human survivors required to be present for this ability to be effective. + // 1-32: ON, the number of human-controlled survivors required to be present for this ability to be effective. "Requires Humans" "0" // Enable this ability. @@ -18065,67 +16662,62 @@ // "maybe" - 50% chance // "often"/"likely"/"frequently" - 66.6% chance // "always" - 100% chance - "Item Chance" "33.3" + "Fly Chance" "33.3" - // The Mutant Tank gives survivors this loadout. + // The cooldown for the Mutant Tank's ability. + // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- - // Item limit: 5 - // Character limit for each item: 64 - // -- - // Example: "rifle_m60,pistol,adrenaline,defibrillator" - // Example: "katana,pain_pills,vomitjar" - // Example: "first_aid_kit,defibrillator,knife,adrenaline" - "Item Loadout" "rifle,pistol,first_aid_kit,pain_pills" - - // The mode of the Mutant Tank's item ability. - // Note: This setting can be overridden for specific players. + // Minimum: 0 (OFF) + // Maximum: 99999 (Longest) // -- - // 0: Survivors get a random item. - // 1: Survivors get all items. - // 2: Tank drops a random item. - // 3: Tank drops all items. - "Item Mode" "0" + // Keywords: + // "never"/"disabled"/"false"/"off"/"no" - 0 seconds + // "second" - 1 second + // "minute" - 1 minute + // "forever" - 99999 seconds + "Fly Cooldown" "0" - // The Mutant Tank turns its dead survivor victims into pinatas that spawn certain items. - // Note: This setting does not need the "Ability Enabled" setting to be set to "1". + // The Mutant Tank's ability effects last this long. + // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- - // Item limit: 5 - // Character limit for each item: 64 + // Minimum: 0 + // Maximum: 99999 // -- - // Example: "pain_pills,pain_pills,pain_pills" - // Example: "katana,katana,rifle_m60" - // Example: "first_aid_kit,defibrillator,first_aid_kit,defibrillator" - "Item Pinata" "" + // Keywords: + // "second" - 1 second + // "minute" - 1 minute + // "forever" - 99999 seconds + "Fly Duration" "30" - // Removes the death model of the survivor when killed. - // Note: Only available in Left 4 Dead 2. - // Note: This setting only applies if the "Item Pinata" setting is not empty. + // The Mutant Tank's flight ability is this fast. + // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Item Pinata Body" "1" + // Minimum: 0.1 + // Maximum: 99999.0 + "Fly Speed" "500.0" - // The Mutant Tank has this many chances out of 100.0% to turn its dead survivor victims into pinatas. - // Note: This setting only applies if the "Item Pinata" setting is not empty. + // The type of event that triggers the Mutant Tank's flight ability. + // Note: This setting does not affect human-controlled Tanks. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.0 (No chance) - // Maximum: 100.0 (Highest chance) + // Add up numbers together for different results. // -- - // Keywords: - // "never" - 0% chance - // "sometimes"/"unlikely"/"seldom" - 33.3% chance - // "maybe" - 50% chance - // "often"/"likely"/"frequently" - 66.6% chance - // "always" - 100% chance - "Item Pinata Chance" "33.3" + // Minimum: 0 + // Maximum: 15 + // -- + // 0 OR 15: All types of events. + // 1: When the Mutant Tank hurts a survivor. + // 2: When a survivor hurts a Mutant Tank. + // 4: When the Mutant Tank throws a rock. + // 8: When the Mutant Tank jumps. + "Fly Type" "0" "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" { - // Note: Override any of the settings in the "Item Ability" section for each special infected here. + // Note: Override any of the settings in the "Fly Ability" section for each special infected here. // Example "Access Flags" "" @@ -18133,16 +16725,19 @@ "Close Areas Only" "0.0" "Combo Ability" "0" "Human Ability" "0" + "Human Ammo" "5" + "Human Cooldown" "0" + "Human Duration" "30" + "Human Mode" "1" "Open Areas Only" "0.0" "Requires Humans" "0" "Ability Enabled" "0" "Ability Message" "0" - "Item Chance" "33.3" - "Item Loadout" "rifle,pistol,first_aid_kit,pain_pills" - "Item Mode" "0" - "Item Pinata" "" - "Item Pinata Body" "1" - "Item Pinata Chance" "33.3" + "Fly Chance" "33.3" + "Fly Cooldown" "0" + "Fly Duration" "30" + "Fly Speed" "500.0" + "Fly Type" "0" } } } @@ -18150,7 +16745,7 @@ ```
-##### Jump Ability +##### Fragile Ability
Click to expand! @@ -18159,22 +16754,9 @@ { "Tank #1" { - // The Mutant Tank jumps periodically or sporadically and makes survivors jump uncontrollably. - // "Ability Enabled" - The Mutant Tank jumps periodically or sporadically. - // - "Jump Interval" - // - "Jump Mode" - // - "Jump Sporadic Chance" - // - "Jump Sporadic Height" - // "Ability Enabled" - When a survivor is within range of the Mutant Tank, the survivor jumps uncontrollably. - // - "Jump Range" - // - "Jump Range Chance" - // - "Jump Range Cooldown" - // "Jump Hit" - When a survivor is hit by the Mutant Tank's claw or rock, or a survivor hits the Mutant Tank with a melee weapon, the survivor jumps uncontrollably. - // - "Jump Chance" - // - "Jump Cooldown" - // - "Jump Hit Mode" - // Requires "mt_abilities.smx" to be compiled with "mt_jump.sp" to work. - "Jump Ability" + // The Mutant Tank takes more damage while dealing more damage and running faster. + // Requires "mt_abilities.smx" to be compiled with "mt_fragile.sp" to work. + "Fragile Ability" { // Admins with one or more of these access flags have access to this ability. // Note: This setting can be overridden for specific players. @@ -18258,26 +16840,13 @@ "Human Duration" "5" // The mode of how human-controlled Mutant Tanks activate their abilities. - // Note: This setting does not apply to the range ability. // Note: This setting can be overridden for specific players. // -- - // 0: Press buttons to activate corresponding abilities. Cooldown starts after ability's duration ends. + // 0: Press buttons to activate corresponding abilities. Cooldown starts after ability is activated. // 1: Hold down buttons to keep corresponding abilities activated. Cooldown starts after the player lets go of the buttons. + // 2: Press buttons to toggle corresponding abilities. Cooldown starts after ability is deactivated. "Human Mode" "1" - // Human-controlled Mutant Tanks must wait this long before using their range ability again. - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0 (OFF) - // Maximum: 99999 (Longest) - // -- - // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Human Range Cooldown" "0" - // The ability can only activate in open areas. // Note: Do not change this setting if you are unsure of how it works. // Note: This setting can be overridden for specific players. @@ -18290,88 +16859,39 @@ // "farthest" - 99999.0 range "Open Areas Only" "0.0" - // The ability is only effective toward human survivors. + // The ability is only effective toward human-controlled survivors. // Note: This setting can be overridden for specific players. // -- // Minimum: 0 // Maximum: 32 // -- // 0: OFF - // 1-32: ON, the number of human survivors required to be present for this ability to be effective. + // 1-32: ON, the number of human-controlled survivors required to be present for this ability to be effective. "Requires Humans" "0" // Enable this ability. - // Note: This setting does not affect the "Jump Hit" setting. // Note: This setting can be overridden for specific players. // -- - // 0: OFF - // 1: ON, the Mutant Tank can force survivors to jump uncontrollably. - // 2: ON, the Mutant Tank can jump periodically. - // 3: ON, the Mutant Tank can do both. + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON "Ability Enabled" "0" - // Show a screen fade effect when the Mutant Tank uses its abilities. - // Note: The colors will randomly change between the colors set in the "Skin Color" and "Glow Color" settings. - // Note: This setting can be overridden for specific players. - // -- - // Add up numbers together for different results. - // -- - // Minimum: 0 - // Maximum: 7 - // -- - // 0: OFF - // 1: Show effect when the Mutant Tank uses its claw/rock attack. - // 2: Show effect when the Mutant Tank is hit by a melee weapon. - // 4: Show effect when the Mutant Tank uses its range ability. - // -- - // Keywords: - // "none"/"off" - 0 - // "attack" - 1 - // "hurt" - 2 - // "attack,hurt" - 3 - // "range" - 4 - // "attack,range" - 5 - // "hurt,range" - 6 - // "attack,hurt,range" - 7 - "Ability Effect" "0" - - // Display a message whenever the abilities activate/deactivate. + // Display a message whenever the ability activates/deactivates. // Note: This setting can be overridden for specific players. // -- - // Add up numbers together for different results. - // -- - // Minimum: 0 - // Maximum: 7 - // -- - // 0: OFF - // 1: Display message only when "Jump Hit" is enabled. - // 2: Display message only when "Ability Enabled" is set to "1" or "3". - // 4: Display message only when "Ability Enabled" is set to "2" or "3". - // -- - // Keywords: - // "none"/"off" - 0 - // "hit" - 1 - // "ability" - 2 - // "hit,ability" - 3 - // "rock" - 4 - // "hit,rock" - 5 - // "ability,rock" - 6 - // "hit,ability,rock"/"all" - 7 + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON "Ability Message" "0" - // Check line-of-sight when the Mutant Tank uses its abilities. + // The bullet damage received by the Mutant Tank is multiplied by this value. + // Note: Damage = Bullet damage x Fragile bullet multiplier + // Example: Damage = 30.0 x 5.0 = 150.0 + // Note: Use the value "1.0" to disable this setting. (Bullet damage x 1.0 = Bullet damage) // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 - // Maximum: 5 - // -- - // 0: OFF - // 1: Check if there is a solid object between the Mutant Tank and survivors. - // 2: Option 1 + Check if the Mutant Tank is looking toward the survivors. - // 3: Option 1 + Check if the Mutant Tank is looking away from the survivors. - // 4: Option 1 + Check if the survivors are looking toward the Mutant Tank. - // 5: Option 1 + Check if the survivors are looking away from the Mutant Tank. - "Ability Sight" "0" + // Minimum: 1.0 + // Maximum: 99999.0 + "Fragile Bullet Multiplier" "5.0" // The Mutant Tank has this many chances out of 100.0% to trigger the ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -18386,9 +16906,9 @@ // "maybe" - 50% chance // "often"/"likely"/"frequently" - 66.6% chance // "always" - 100% chance - "Jump Chance" "33.3" + "Fragile Chance" "33.3" - // The cooldown for the Mutant Tank's main/hit ability. + // The cooldown for the Mutant Tank's ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- @@ -18400,145 +16920,89 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Jump Cooldown" "0" - - // The Mutant Tank's ability effects last this long. - // Note: This is ignored when the "Combo Ability" setting is set to "1". - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0 - // Maximum: 99999 - // -- - // Keywords: - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Jump Duration" "5" + "Fragile Cooldown" "0" - // The Mutant Tank and survivors jump this high off a surface. + // The Mutant Tank's damage boost value when fragile. // Note: This setting can be overridden for specific players. // -- // Minimum: 0.1 // Maximum: 99999.0 - // -- - // Keywords: - // "shortest" - 0.1 height - // "tallest" - 99999.0 height - "Jump Height" "300.0" - - // Enable the Mutant Tank's claw/rock attack. - // Note: This setting does not need the "Ability Enabled" setting to be set to "1". - // Note: This setting can be overridden for specific players. - // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Jump Hit" "0" - - // The mode of the Mutant Tank's claw/rock attack. - // Note: This setting can be overridden for specific players. - // -- - // 0: Both - // 1: Ability activates when the Mutant Tank hits a survivor. - // 2: Ability activates when the Mutant Tank is hit by a survivor. - // -- - // Keywords: - // "both"/"all" - 0 - // "tank"/"attack" - 1 - // "survivor"/"hurt" - 2 - "Jump Hit Mode" "0" + "Fragile Damage Boost" "5.0" - // The Mutant Tank jumps every time this many seconds passes. + // The Mutant Tank's ability effects last this long. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.1 - // Maximum: 99999.0 + // Minimum: 0 + // Maximum: 99999 // -- // Keywords: - // "milli"/"millisecond" - 0.1 seconds // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Jump Interval" "1.0" + "Fragile Duration" "5" - // The mode of the Mutant Tank's jumping ability. + // The explosive damage received by the Mutant Tank is multiplied by this value. + // Note: Damage = Explosive damage x Fragile explosive multiplier + // Example: Damage = 30.0 x 5.0 = 150.0 + // Note: Use the value "1.0" to disable this setting. (Explosive damage x 1.0 = Explosive damage) // Note: This setting can be overridden for specific players. // -- - // 0: The Mutant Tank jumps periodically. - // 1: The Mutant Tank jumps sporadically. - "Jump Mode" "0" + // Minimum: 1.0 + // Maximum: 99999.0 + "Fragile Explosive Multiplier" "5.0" - // The distance between a survivor and the Mutant Tank needed to trigger the ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // The fire damage received by the Mutant Tank is multiplied by this value. + // Note: Damage = Fire damage x Fragile fire multiplier + // Example: Damage = 30.0 x 3.0 = 90.0 + // Note: Use the value "1.0" to disable this setting. (Fire damage x 1.0 = Fire damage) // Note: This setting can be overridden for specific players. // -- - // Minimum: 1.0 (Closest) - // Maximum: 99999.0 (Farthest) - // -- - // Keywords: - // "closest" - 1.0 range - // "farthest" - 99999.0 range - "Jump Range" "150.0" + // Minimum: 1.0 + // Maximum: 99999.0 + "Fragile Fire Multiplier" "3.0" - // The Mutant Tank has this many chances out of 100.0% to trigger the range ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // The hittable damage received by the Mutant Tank is multiplied by this value. + // Note: Damage = Hittable damage x Fragile hittable multiplier + // Example: Damage = 100.0 x 1.5 = 150.0 + // Note: Use the value "1.0" to disable this setting. (Hittable damage x 1.0 = Hittable damage) // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.0 (No chance) - // Maximum: 100.0 (Highest chance) - // -- - // Keywords: - // "never" - 0% chance - // "sometimes"/"unlikely"/"seldom" - 33.3% chance - // "maybe" - 50% chance - // "often"/"likely"/"frequently" - 66.6% chance - // "always" - 100% chance - "Jump Range Chance" "15.0" + // Minimum: 1.0 + // Maximum: 99999.0 + "Fragile Hittable Multiplier" "1.5" - // The cooldown for the Mutant Tank's range ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // The melee damage received by the Mutant Tank is multiplied by this value. + // Note: Damage = Melee damage x Fragile melee multiplier + // Example: Damage = 100.0 x 1.5 = 150.0 + // Note: Use the value "1.0" to disable this setting. (Melee damage x 1.0 = Melee damage) // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 (OFF) - // Maximum: 99999 (Longest) - // -- - // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Jump Range Cooldown" "0" + // Minimum: 1.0 + // Maximum: 99999.0 + "Fragile Melee Multiplier" "1.5" - // The Mutant Tank has this many chances out of 100.0% to jump sporadically. - // Note: This setting only applies if the "Jump Mode" setting is set to "1". + // The mode of the Mutant Tank's damage and speed boosts. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.0 (No chance) - // Maximum: 100.0 (Highest chance) - // -- - // Keywords: - // "never" - 0% chance - // "sometimes"/"unlikely"/"seldom" - 33.3% chance - // "maybe" - 50% chance - // "often"/"likely"/"frequently" - 66.6% chance - // "always" - 100% chance - "Jump Sporadic Chance" "33.3" + // 0: + // Mutant Tank's damage = Claw/rock damage + Fragile damage boost + // Mutant Tank's speed = Run speed + Fragile speed boost + // 1: + // Mutant Tank's damage = Fragile damage boost + // Mutant Tank's speed = Fragile speed boost + "Fragile Mode" "0" - // The Mutant Tank jumps this high up into the air. - // Note: This setting only applies if the "Jump Mode" setting is set to "1". + // The Mutant Tank's speed boost value when fragile. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.1 - // Maximum: 99999.0 - // -- - // Keywords: - // "shortest" - 0.1 height - // "tallest" - 99999.0 height - "Jump Sporadic Height" "750.0" + // Minimum: 0.1 + // Maximum: 3.0 + "Fragile Speed Boost" "1.0" "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" { - // Note: Override any of the settings in the "Jump Ability" section for each special infected here. + // Note: Override any of the settings in the "Fragile Ability" section for each special infected here. // Example "Access Flags" "" @@ -18548,28 +17012,23 @@ "Human Ability" "0" "Human Ammo" "5" "Human Cooldown" "0" - "Human Duration" "5" + "Human Duration" "30" "Human Mode" "1" - "Human Range Cooldown" "0" "Open Areas Only" "0.0" "Requires Humans" "0" "Ability Enabled" "0" - "Ability Effect" "0" "Ability Message" "0" - "Ability Sight" "0" - "Jump Chance" "33.3" - "Jump Cooldown" "0" - "Jump Duration" "5" - "Jump Height" "300.0" - "Jump Hit" "0" - "Jump Hit Mode" "0" - "Jump Interval" "1.0" - "Jump Mode" "0" - "Jump Range" "150.0" - "Jump Range Chance" "15.0" - "Jump Range Cooldown" "0" - "Jump Sporadic Chance" "33.3" - "Jump Sporadic Height" "750.0" + "Fragile Bullet Multiplier" "5.0" + "Fragile Chance" "33.3" + "Fragile Cooldown" "0" + "Fragile Damage Boost" "5.0" + "Fragile Duration" "5" + "Fragile Explosive Multiplier" "5.0" + "Fragile Fire Multiplier" "3.0" + "Fragile Hittable Multiplier" "1.5" + "Fragile Melee Multiplier" "1.5" + "Fragile Mode" "0" + "Fragile Speed Boost" "1.0" } } } @@ -18577,7 +17036,7 @@ ```
-##### Kamikaze Ability +##### Ghost Ability
Click to expand! @@ -18586,15 +17045,27 @@ { "Tank #1" { - // The Mutant Tank kills itself along with a survivor victim. - // "Ability Enabled" - When a survivor is within range of the Mutant Tank, the survivor dies along with the Mutant Tank. - // - "Kamikaze Range" - // - "Kamikaze Range Chance" - // "Kamikaze Hit" - When a survivor is hit by the Mutant Tank's claw or rock, or a survivor hits the Mutant Tank with a melee weapon, the survivor dies along with the Mutant Tank. - // - "Kamikaze Chance" - // - "Kamikaze Hit Mode" - // Requires "mt_abilities.smx" to be compiled with "mt_kamikaze.sp" to work. - "Kamikaze Ability" + // The Mutant Tank cloaks itself and nearby special infected, and disarms survivors. + // "Ability Enabled" - When the Mutant Tank spawns, it becomes invisible. + // - "Ghost Duration" + // - "Ghost Fade Alpha" + // - "Ghost Fade Delay" + // - "Ghost Fade Limit" + // - "Ghost Fade Phase" + // - "Ghost Fade Rate" + // - "Ghost Specials" + // - "Ghost Specials Chance" + // - "Ghost Specials Range" + // "Ability Enabled" - When a survivor is within range of the Mutant Tank, the survivor is disarmed. + // - "Ghost Range" + // - "Ghost Range Chance" + // - "Ghost Range Cooldown" + // "Ghost Hit" - When a survivor is hit by the Mutant Tank's claw or rock, or a survivor hits the Mutant Tank with a melee weapon, the survivor is disarmed. + // - "Ghost Chance" + // - "Ghost Cooldown" + // - "Ghost Hit Mode" + // Requires "mt_abilities.smx" to be compiled with "mt_ghost.sp" to work. + "Ghost Ability" { // Admins with one or more of these access flags have access to this ability. // Note: This setting can be overridden for specific players. @@ -18640,6 +17111,65 @@ // 2: ON, abilities will activate automatically. "Human Ability" "0" + // Determines how many times human-controlled Mutant Tanks can use their abilities in one life. + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0 + // Maximum: 99999 + // -- + // Keywords: + // "none"/"off" - 0 ammo + // "infinite" - 99999 ammo + "Human Ammo" "5" + + // Human-controlled Mutant Tanks must wait this long before using their abilities again. + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0 (OFF) + // Maximum: 99999 (Longest) + // -- + // Keywords: + // "never"/"disabled"/"false"/"off"/"no" - 0 seconds + // "second" - 1 second + // "minute" - 1 minute + // "forever" - 99999 seconds + "Human Cooldown" "0" + + // The Mutant Tank's ability effects last this long. + // Note: This setting does not affect human-controlled Mutant Tanks unless the "Human Mode" setting is set to "0". + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0 + // Maximum: 99999 + // -- + // Keywords: + // "second" - 1 second + // "minute" - 1 minute + // "forever" - 99999 seconds + "Human Duration" "5" + + // The mode of how human-controlled Mutant Tanks activate their abilities. + // Note: This setting does not apply to the range ability. + // Note: This setting can be overridden for specific players. + // -- + // 0: Press buttons to activate corresponding abilities. Cooldown starts after ability is activated. + // 1: Hold down buttons to keep corresponding abilities activated. Cooldown starts after the player lets go of the buttons. + // 2: Press buttons to toggle corresponding abilities. Cooldown starts after ability is deactivated. + "Human Mode" "1" + + // Human-controlled Mutant Tanks must wait this long before using their range ability again. + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0 (OFF) + // Maximum: 99999 (Longest) + // -- + // Keywords: + // "never"/"disabled"/"false"/"off"/"no" - 0 seconds + // "second" - 1 second + // "minute" - 1 minute + // "forever" - 99999 seconds + "Human Range Cooldown" "0" + // The ability can only activate in open areas. // Note: Do not change this setting if you are unsure of how it works. // Note: This setting can be overridden for specific players. @@ -18652,22 +17182,24 @@ // "farthest" - 99999.0 range "Open Areas Only" "0.0" - // The ability is only effective toward human survivors. + // The ability is only effective toward human-controlled survivors. // Note: This setting can be overridden for specific players. // -- // Minimum: 0 // Maximum: 32 // -- // 0: OFF - // 1-32: ON, the number of human survivors required to be present for this ability to be effective. + // 1-32: ON, the number of human-controlled survivors required to be present for this ability to be effective. "Requires Humans" "0" // Enable this ability. - // Note: This setting does not affect the "Kamikaze Hit" setting. + // Note: This setting does not affect the "Ghost Hit" setting. // Note: This setting can be overridden for specific players. // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON + // 0: OFF + // 1: ON, the Mutant Tank can disarm survivors. + // 2: ON, the Mutant Tank can cloak itself and nearby special infected. + // 3: ON, the Mutant Tank can do both. "Ability Enabled" "0" // Show a screen fade effect when the Mutant Tank uses its abilities. @@ -18695,23 +17227,28 @@ // "attack,hurt,range" - 7 "Ability Effect" "0" - // Display a message whenever the ability activates/deactivates. + // Display a message whenever the abilities activate/deactivate. // Note: This setting can be overridden for specific players. // -- // Add up numbers together for different results. // -- // Minimum: 0 - // Maximum: 3 + // Maximum: 7 // -- // 0: OFF - // 1: Display message only when "Kamikaze Hit" is enabled. - // 2: Display message only when "Ability Enabled" is enabled. + // 1: Display message only when "Ghost Hit" is enabled. + // 2: Display message only when "Ability Enabled" is set to "1" or "3". + // 4: Display message only when "Ability Enabled" is set to "2" or "3". // -- // Keywords: // "none"/"off" - 0 // "hit" - 1 // "ability" - 2 - // "both"/"all"/"hit,ability" - 3 + // "hit,ability" - 3 + // "rock" - 4 + // "hit,rock" - 5 + // "ability,rock" - 6 + // "hit,ability,rock"/"all" - 7 "Ability Message" "0" // Check line-of-sight when the Mutant Tank uses its abilities. @@ -18728,14 +17265,6 @@ // 5: Option 1 + Check if the survivors are looking away from the Mutant Tank. "Ability Sight" "0" - // Removes the death model of the survivor when killed. - // Note: Only available in Left 4 Dead 2. - // Note: This setting can be overridden for specific players. - // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Kamikaze Body" "1" - // The Mutant Tank has this many chances out of 100.0% to trigger the ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. @@ -18749,7 +17278,75 @@ // "maybe" - 50% chance // "often"/"likely"/"frequently" - 66.6% chance // "always" - 100% chance - "Kamikaze Chance" "33.3" + "Ghost Chance" "33.3" + + // The cooldown for the Mutant Tank's main/hit ability. + // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0 (OFF) + // Maximum: 99999 (Longest) + // -- + // Keywords: + // "never"/"disabled"/"false"/"off"/"no" - 0 seconds + // "second" - 1 second + // "minute" - 1 minute + // "forever" - 99999 seconds + "Ghost Cooldown" "0" + + // The Mutant Tank's ability effects last this long. + // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0 + // Maximum: 99999 + // -- + // Keywords: + // "second" - 1 second + // "minute" - 1 minute + // "forever" - 99999 seconds + "Ghost Duration" "0" + + // The amount of alpha to take from the Mutant Tank's alpha every X seconds until the limit set by the "Ghost Fade Limit" is reached. + // Note: The rate at which the Mutant Tank's alpha is reduced depends on the "Ghost Fade Rate" setting. + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0 (No effect) + // Maximum: 255 (Fully faded) + "Ghost Fade Alpha" "2" + + // The Mutant Tank's ghost fade effect starts all over after this many seconds passes upon reaching the limit set by the "Ghost Fade Limit" setting. + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 1 + // Maximum: 99999 + // -- + // Keywords: + // "second" - 1 second + // "minute" - 1 minute + // "forever" - 99999 seconds + "Ghost Fade Delay" "5" + + // The limit of the Mutant Tank's ghost fade effect. + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0 (Fully faded) + // Maximum: 255 (No effect) + "Ghost Fade Limit" "0" + + // The Mutant Tank can phase through all damage during the ghost fade effect. + // Note: This setting can be overridden for specific players. + // -- + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Ghost Fade Phase" "0" + + // The rate of the Mutant Tank's ghost fade effect. + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0.1 (Fastest) + // Maximum: 99999.0 (Slowest) + "Ghost Fade Rate" "0.1" // Enable the Mutant Tank's claw/rock attack. // Note: This setting does not need the "Ability Enabled" setting to be set to "1". @@ -18757,7 +17354,7 @@ // -- // 0/"disabled"/"false"/"off"/"no": OFF // 1/"enabled"/"true"/"on"/"yes": ON - "Kamikaze Hit" "0" + "Ghost Hit" "0" // The mode of the Mutant Tank's claw/rock attack. // Note: This setting can be overridden for specific players. @@ -18770,30 +17367,72 @@ // "both"/"all" - 0 // "tank"/"attack" - 1 // "survivor"/"hurt" - 2 - "Kamikaze Hit Mode" "0" + "Ghost Hit Mode" "0" + + // The distance between a survivor and the Mutant Tank needed to trigger the ability. + // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 1.0 (Closest) + // Maximum: 99999.0 (Farthest) + // -- + // Keywords: + // "closest" - 1.0 range + // "farthest" - 99999.0 range + "Ghost Range" "150.0" + + // The Mutant Tank has this many chances out of 100.0% to trigger the range ability. + // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0.0 (No chance) + // Maximum: 100.0 (Highest chance) + // -- + // Keywords: + // "never" - 0% chance + // "sometimes"/"unlikely"/"seldom" - 33.3% chance + // "maybe" - 50% chance + // "often"/"likely"/"frequently" - 66.6% chance + // "always" - 100% chance + "Ghost Range Chance" "15.0" + + // The cooldown for the Mutant Tank's range ability. + // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0 (OFF) + // Maximum: 99999 (Longest) + // -- + // Keywords: + // "never"/"disabled"/"false"/"off"/"no" - 0 seconds + // "second" - 1 second + // "minute" - 1 minute + // "forever" - 99999 seconds + "Ghost Range Cooldown" "0" - // The amount of damage required to power up the Mutant Tank's kamikaze ability. + // The Mutant Tank can cloak nearby special infected. + // Note: This setting needs "Ability Enabled" to be set to "2" or higher than "3". // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.0 (OFF) - // Maximum: 99999.0 - "Kamikaze Meter" "0.0" + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Ghost Specials" "1" - // The mode of the Mutant Tank's kamikaze ability. + // The Mutant Tank has this many chances out of 100.0% to cloak nearby special infected. // Note: This setting can be overridden for specific players. // -- - // Add up numbers together for different results. - // -- - // Minimum: 0 - // Maximum: 3 + // Minimum: 0.0 (No chance) + // Maximum: 100.0 (Highest chance) // -- - // 0 OR 3: Pick randomly between killing and incapacitating. - // 1: Kill instantly. - // 2: Incapacitate only. - "Kamikaze Mode" "1" + // Keywords: + // "never" - 0% chance + // "sometimes"/"unlikely"/"seldom" - 33.3% chance + // "maybe" - 50% chance + // "often"/"likely"/"frequently" - 66.6% chance + // "always" - 100% chance + "Ghost Specials Chance" "33.3" - // The distance between a survivor and the Mutant Tank needed to trigger the ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // The distance between a special infected and the Mutant Tank needed to cloak that special infected. // Note: This setting can be overridden for specific players. // -- // Minimum: 1.0 (Closest) @@ -18802,26 +17441,27 @@ // Keywords: // "closest" - 1.0 range // "farthest" - 99999.0 range - "Kamikaze Range" "150.0" + "Ghost Specials Range" "500.0" - // The Mutant Tank has this many chances out of 100.0% to trigger the range ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // The Mutant Tank disarms the following weapon slots. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.0 (No chance) - // Maximum: 100.0 (Highest chance) + // Add up numbers together for different results. // -- - // Keywords: - // "never" - 0% chance - // "sometimes"/"unlikely"/"seldom" - 33.3% chance - // "maybe" - 50% chance - // "often"/"likely"/"frequently" - 66.6% chance - // "always" - 100% chance - "Kamikaze Range Chance" "15.0" + // Minimum: 0 + // Maximum: 31 + // -- + // 0 OR 31: All 5 slots. + // 1: 1st slot only. + // 2: 2nd slot only. + // 4: 3rd slot only. + // 8: 4th slot only. + // 16: 5th slot only. + "Ghost Weapon Slots" "0" "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" { - // Note: Override any of the settings in the "Kamikaze Ability" section for each special infected here. + // Note: Override any of the settings in the "Ghost Ability" section for each special infected here. // Example "Access Flags" "" @@ -18829,20 +17469,34 @@ "Close Areas Only" "0.0" "Combo Ability" "0" "Human Ability" "0" + "Human Ammo" "5" + "Human Cooldown" "0" + "Human Duration" "30" + "Human Mode" "1" + "Human Range Cooldown" "0" "Open Areas Only" "0.0" "Requires Humans" "0" "Ability Enabled" "0" "Ability Effect" "0" "Ability Message" "0" "Ability Sight" "0" - "Kamikaze Body" "1" - "Kamikaze Chance" "33.3" - "Kamikaze Hit" "0" - "Kamikaze Hit Mode" "0" - "Kamikaze Meter" "0.0" - "Kamikaze Mode" "1" - "Kamikaze Range" "150.0" - "Kamikaze Range Chance" "15.0" + "Ghost Chance" "33.3" + "Ghost Cooldown" "0" + "Ghost Duration" "0" + "Ghost Fade Alpha" "2" + "Ghost Fade Delay" "5" + "Ghost Fade Limit" "0" + "Ghost Fade Phase" "0" + "Ghost Fade Rate" "0.1" + "Ghost Hit" "0" + "Ghost Hit Mode" "0" + "Ghost Range" "150.0" + "Ghost Range Chance" "15.0" + "Ghost Range Cooldown" "0" + "Ghost Specials" "1" + "Ghost Specials Chance" "33.3" + "Ghost Specials Range" "500.0" + "Ghost Weapon Slots" "0" } } } @@ -18850,7 +17504,7 @@ ```
-##### Lag Ability +##### God Ability
Click to expand! @@ -18859,17 +17513,9 @@ { "Tank #1" { - // The Mutant Tank makes survivors lag. - // "Ability Enabled" - When a survivor is within range of the Mutant Tank, the survivor lags. - // - "Lag Range" - // - "Lag Range Chance" - // - "Lag Range Cooldown" - // "Lag Hit" - When a survivor is hit by the Mutant Tank's claw or rock, or a survivor hits the Mutant Tank with a melee weapon, the survivor lags. - // - "Lag Chance" - // - "Lag Cooldown" - // - "Lag Hit Mode" - // Requires "mt_abilities.smx" to be compiled with "mt_lag.sp" to work. - "Lag Ability" + // The Mutant Tank gains temporary immunity to all types of damage. + // Requires "mt_abilities.smx" to be compiled with "mt_god.sp" to work. + "God Ability" { // Admins with one or more of these access flags have access to this ability. // Note: This setting can be overridden for specific players. @@ -18939,18 +17585,26 @@ // "forever" - 99999 seconds "Human Cooldown" "0" - // Human-controlled Mutant Tanks must wait this long before using their range ability again. + // The Mutant Tank's ability effects last this long. + // Note: This setting does not affect human-controlled Mutant Tanks unless the "Human Mode" setting is set to "0". // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 (OFF) - // Maximum: 99999 (Longest) + // Minimum: 0 + // Maximum: 99999 // -- // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Human Range Cooldown" "0" + "Human Duration" "5" + + // The mode of how human-controlled Mutant Tanks activate their abilities. + // Note: This setting can be overridden for specific players. + // -- + // 0: Press buttons to activate corresponding abilities. Cooldown starts after ability is activated. + // 1: Hold down buttons to keep corresponding abilities activated. Cooldown starts after the player lets go of the buttons. + // 2: Press buttons to toggle corresponding abilities. Cooldown starts after ability is deactivated. + "Human Mode" "1" // The ability can only activate in open areas. // Note: Do not change this setting if you are unsure of how it works. @@ -18964,82 +17618,30 @@ // "farthest" - 99999.0 range "Open Areas Only" "0.0" - // The ability is only effective toward human survivors. + // The ability is only effective toward human-controlled survivors. // Note: This setting can be overridden for specific players. // -- // Minimum: 0 // Maximum: 32 // -- // 0: OFF - // 1-32: ON, the number of human survivors required to be present for this ability to be effective. + // 1-32: ON, the number of human-controlled survivors required to be present for this ability to be effective. "Requires Humans" "1" // Enable this ability. - // Note: This setting does not affect the "Lag Hit" setting. // Note: This setting can be overridden for specific players. // -- // 0/"disabled"/"false"/"off"/"no": OFF // 1/"enabled"/"true"/"on"/"yes": ON "Ability Enabled" "0" - // Show a screen fade effect when the Mutant Tank uses its abilities. - // Note: The colors will randomly change between the colors set in the "Skin Color" and "Glow Color" settings. - // Note: This setting can be overridden for specific players. - // -- - // Add up numbers together for different results. - // -- - // Minimum: 0 - // Maximum: 7 - // -- - // 0: OFF - // 1: Show effect when the Mutant Tank uses its claw/rock attack. - // 2: Show effect when the Mutant Tank is hit by a melee weapon. - // 4: Show effect when the Mutant Tank uses its range ability. - // -- - // Keywords: - // "none"/"off" - 0 - // "attack" - 1 - // "hurt" - 2 - // "attack,hurt" - 3 - // "range" - 4 - // "attack,range" - 5 - // "hurt,range" - 6 - // "attack,hurt,range" - 7 - "Ability Effect" "0" - // Display a message whenever the ability activates/deactivates. // Note: This setting can be overridden for specific players. // -- - // Add up numbers together for different results. - // -- - // Minimum: 0 - // Maximum: 3 - // -- - // 0: OFF - // 1: Display message only when "Lag Hit" is enabled. - // 2: Display message only when "Ability Enabled" is enabled. - // -- - // Keywords: - // "none"/"off" - 0 - // "hit" - 1 - // "ability" - 2 - // "both"/"all"/"hit,ability" - 3 + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON "Ability Message" "0" - // Check line-of-sight when the Mutant Tank uses its abilities. - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0 - // Maximum: 5 - // -- - // 0: OFF - // 1: Check if there is a solid object between the Mutant Tank and survivors. - // 2: Option 1 + Check if the Mutant Tank is looking toward the survivors. - // 3: Option 1 + Check if the Mutant Tank is looking away from the survivors. - // 4: Option 1 + Check if the survivors are looking toward the Mutant Tank. - // 5: Option 1 + Check if the survivors are looking away from the Mutant Tank. - "Ability Sight" "0" - // The Mutant Tank has this many chances out of 100.0% to trigger the ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. @@ -19053,9 +17655,9 @@ // "maybe" - 50% chance // "often"/"likely"/"frequently" - 66.6% chance // "always" - 100% chance - "Lag Chance" "33.3" + "God Chance" "33.3" - // The cooldown for the Mutant Tank's hit ability. + // The cooldown for the Mutant Tank's ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- @@ -19067,86 +17669,24 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Lag Cooldown" "0" + "God Cooldown" "0" // The Mutant Tank's ability effects last this long. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- - // Minimum: 1 + // Minimum: 0 // Maximum: 99999 // -- // Keywords: // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Lag Duration" "5" - - // Enable the Mutant Tank's claw/rock attack. - // Note: This setting does not need the "Ability Enabled" setting to be set to "1". - // Note: This setting can be overridden for specific players. - // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Lag Hit" "0" - - // The mode of the Mutant Tank's claw/rock attack. - // Note: This setting can be overridden for specific players. - // -- - // 0: Both - // 1: Ability activates when the Mutant Tank hits a survivor. - // 2: Ability activates when the Mutant Tank is hit by a survivor. - // -- - // Keywords: - // "both"/"all" - 0 - // "tank"/"attack" - 1 - // "survivor"/"hurt" - 2 - "Lag Hit Mode" "0" - - // The distance between a survivor and the Mutant Tank needed to trigger the ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 1.0 (Closest) - // Maximum: 99999.0 (Farthest) - // -- - // Keywords: - // "closest" - 1.0 range - // "farthest" - 99999.0 range - "Lag Range" "150.0" - - // The Mutant Tank has this many chances out of 100.0% to trigger the range ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0.0 (No chance) - // Maximum: 100.0 (Highest chance) - // -- - // Keywords: - // "never" - 0% chance - // "sometimes"/"unlikely"/"seldom" - 33.3% chance - // "maybe" - 50% chance - // "often"/"likely"/"frequently" - 66.6% chance - // "always" - 100% chance - "Lag Range Chance" "15.0" - - // The cooldown for the Mutant Tank's range ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0 (OFF) - // Maximum: 99999 (Longest) - // -- - // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Lag Range Cooldown" "0" + "God Duration" "5" "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" { - // Note: Override any of the settings in the "Lag Ability" section for each special infected here. + // Note: Override any of the settings in the "God Ability" section for each special infected here. // Example "Access Flags" "" @@ -19156,21 +17696,15 @@ "Human Ability" "0" "Human Ammo" "5" "Human Cooldown" "0" - "Human Range Cooldown" "0" + "Human Duration" "5" + "Human Mode" "1" "Open Areas Only" "0.0" "Requires Humans" "1" "Ability Enabled" "0" - "Ability Effect" "0" "Ability Message" "0" - "Ability Sight" "0" - "Lag Chance" "33.3" - "Lag Cooldown" "0" - "Lag Duration" "5" - "Lag Hit" "0" - "Lag Hit Mode" "0" - "Lag Range" "150.0" - "Lag Range Chance" "15.0" - "Lag Range Cooldown" "0" + "God Chance" "33.3" + "God Cooldown" "0" + "God Duration" "5" } } } @@ -19178,7 +17712,7 @@ ```
-##### Laser Ability +##### Gravity Ability
Click to expand! @@ -19187,9 +17721,27 @@ { "Tank #1" { - // The Mutant Tank shoots lasers. - // Requires "mt_abilities.smx" to be compiled with "mt_laser.sp" to work. - "Laser Ability" + // The Mutant Tank pulls in or pushes away survivors and any other nearby infected, and changes the survivors' gravity. + // "Ability Enabled" - Any nearby infected and survivors are pulled in or pushed away. + // - "Gravity Flags" + // - "Gravity Force" + // - "Gravity Radius" + // "Ability Enabled" - When a survivor is within range of the Mutant Tank, the survivor's gravity changes. + // - "Gravity Range" + // - "Gravity Range Chance" + // - "Gravity Range Cooldown" + // "Gravity Hit" - When a survivor is hit by the Mutant Tank's claw or rock, or a survivor hits the Mutant Tank with a melee weapon, the survivor's gravity changes. + // - "Gravity Chance" + // - "Gravity Cooldown" + // - "Gravity Hit Mode" + // "Gravity Rock Break" - When the Mutant Tank's rock breaks, it creates a blackhole. + // - "Gravity Flags" + // - "Gravity Force" + // - "Gravity Radius" + // - "Gravity Rock Chance" + // - "Gravity Rock Cooldown" + // Requires "mt_abilities.smx" to be compiled with "mt_gravity.sp" to work. + "Gravity Ability" { // Admins with one or more of these access flags have access to this ability. // Note: This setting can be overridden for specific players. @@ -19273,12 +17825,40 @@ "Human Duration" "5" // The mode of how human-controlled Mutant Tanks activate their abilities. + // Note: This setting does not apply to the range ability. // Note: This setting can be overridden for specific players. // -- - // 0: Press buttons to activate corresponding abilities. Cooldown starts after ability's duration ends. + // 0: Press buttons to activate corresponding abilities. Cooldown starts after ability is activated. // 1: Hold down buttons to keep corresponding abilities activated. Cooldown starts after the player lets go of the buttons. + // 2: Press buttons to toggle corresponding abilities. Cooldown starts after ability is deactivated. "Human Mode" "1" + // Human-controlled Mutant Tanks must wait this long before using their range ability again. + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0 (OFF) + // Maximum: 99999 (Longest) + // -- + // Keywords: + // "never"/"disabled"/"false"/"off"/"no" - 0 seconds + // "second" - 1 second + // "minute" - 1 minute + // "forever" - 99999 seconds + "Human Range Cooldown" "0" + + // Human-controlled Mutant Tanks must wait this long before using their rock ability again. + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0 (OFF) + // Maximum: 99999 (Longest) + // -- + // Keywords: + // "never"/"disabled"/"false"/"off"/"no" - 0 seconds + // "second" - 1 second + // "minute" - 1 minute + // "forever" - 99999 seconds + "Human Rock Cooldown" "0" + // The ability can only activate in open areas. // Note: Do not change this setting if you are unsure of how it works. // Note: This setting can be overridden for specific players. @@ -19291,28 +17871,82 @@ // "farthest" - 99999.0 range "Open Areas Only" "0.0" - // The ability is only effective toward human survivors. + // The ability is only effective toward human-controlled survivors. // Note: This setting can be overridden for specific players. // -- // Minimum: 0 // Maximum: 32 // -- // 0: OFF - // 1-32: ON, the number of human survivors required to be present for this ability to be effective. + // 1-32: ON, the number of human-controlled survivors required to be present for this ability to be effective. "Requires Humans" "0" // Enable this ability. + // Note: This setting does not affect the "Gravity Hit" setting. // Note: This setting can be overridden for specific players. // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON + // 0: OFF + // 1: ON, the Mutant Tank can change survivors' gravity value. + // 2: ON, the Mutant Tank can pull in or push away survivors. + // 3: ON, the Mutant Tank can do both. "Ability Enabled" "0" - // Display a message whenever the ability activates/deactivates. + // Show a screen fade effect when the Mutant Tank uses its abilities. + // Note: The colors will randomly change between the colors set in the "Skin Color" and "Glow Color" settings. // Note: This setting can be overridden for specific players. // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON + // Add up numbers together for different results. + // -- + // Minimum: 0 + // Maximum: 7 + // -- + // 0: OFF + // 1: Show effect when the Mutant Tank uses its claw/rock attack. + // 2: Show effect when the Mutant Tank is hit by a melee weapon. + // 4: Show effect when the Mutant Tank uses its range ability. + // -- + // Keywords: + // "none"/"off" - 0 + // "attack" - 1 + // "hurt" - 2 + // "attack,hurt" - 3 + // "range" - 4 + // "attack,range" - 5 + // "hurt,range" - 6 + // "attack,hurt,range" - 7 + "Ability Effect" "0" + + // Display a message whenever the abilities activate/deactivate. + // Note: This setting can be overridden for specific players. + // -- + // Add up numbers together for different results. + // -- + // Minimum: 0 + // Maximum: 15 + // -- + // 0: OFF + // 1: Display message only when "Gravity Hit" is enabled. + // 2: Display message only when "Ability Enabled" is set to "1" or "3". + // 4: Display message only when "Ability Enabled" is set to "2" or "3". + // 8: Display message only when "Gravity Rock Break" is enabled. + // -- + // Keywords: + // "none"/"off" - 0 + // "hit" - 1 + // "ability" - 2 + // "hit,ability" - 3 + // "rock" - 4 + // "hit,rock" - 5 + // "ability,rock" - 6 + // "hit,ability,rock" - 7 + // "break" - 8 + // "hit,break" - 9 + // "ability,break" - 10 + // "hit,ability,break" - 11 + // "rock,break" - 12 + // "hit,rock,break" - 13 + // "ability,rock,break" - 14 + // "hit,ability,rock,break"/"all" - 15 "Ability Message" "0" // Check line-of-sight when the Mutant Tank uses its abilities. @@ -19342,9 +17976,9 @@ // "maybe" - 50% chance // "often"/"likely"/"frequently" - 66.6% chance // "always" - 100% chance - "Laser Chance" "33.3" + "Gravity Chance" "33.3" - // The cooldown for the Mutant Tank's ability. + // The cooldown for the Mutant Tank's main/hit ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- @@ -19356,69 +17990,174 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Laser Cooldown" "0" + "Gravity Cooldown" "0" - // The Mutant Tank's lasers do this much damage. + // The Mutant Tank's ability effects last this long. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.0 (OFF) - // Maximum: 99999.0 + // Minimum: 0 + // Maximum: 99999 // -- // Keywords: - // "weakest" - 1.0 damage - // "strongest" - 99999.0 damage - "Laser Damage" "5.0" + // "second" - 1 second + // "minute" - 1 minute + // "forever" - 99999 seconds + "Gravity Duration" "5" - // The Mutant Tank's ability effects last this long. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // The Mutant Tank's gravity flags. // Note: This setting can be overridden for specific players. // -- + // Add up numbers together for different results. + // -- // Minimum: 0 - // Maximum: 99999 + // Maximum: 31 + // -- + // 0 OR 31: All flags. + // 1: Require line-of-sight (LOS) flag. + // 2: Use angle pushes flag. + // 4: No distance falloff flag. + // 8: Push players. + // 16: Push physics. + "Gravity Flags" "8" + + // The Mutant Tank's gravity force. + // Note: This setting can be overridden for specific players. + // -- + // Minimum: -100.0 + // Maximum: 100.0 + // -- + // Positive numbers = Push back + // Negative numbers = Pull back + "Gravity Force" "-50.0" + + // Enable the Mutant Tank's claw/rock attack. + // Note: This setting does not need the "Ability Enabled" setting to be set to "1". + // Note: This setting can be overridden for specific players. + // -- + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Gravity Hit" "0" + + // The mode of the Mutant Tank's claw/rock attack. + // Note: This setting can be overridden for specific players. + // -- + // 0: Both + // 1: Ability activates when the Mutant Tank hits a survivor. + // 2: Ability activates when the Mutant Tank is hit by a survivor. + // -- + // Keywords: + // "both"/"all" - 0 + // "tank"/"attack" - 1 + // "survivor"/"hurt" - 2 + "Gravity Hit Mode" "0" + + // The mode of the Mutant Tank's gravity ability. + // Note: This setting can be overridden for specific players. + // -- + // 0: The Mutant Tank changes the survivors' gravity. + // 1: The Mutant Tank turns the survivors' into temporary black holes. + "Gravity Mode" "0" + + // The radius of the Mutant Tank's gravity. + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 1.0 (Closest) + // Maximum: 99999.0 (Farthest) + // -- + // Keywords: + // "closest" - 1.0 range + // "farthest" - 99999.0 range + "Gravity Radius" "750.0" + + // The distance between a survivor and the Mutant Tank needed to trigger the ability. + // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 1.0 (Closest) + // Maximum: 99999.0 (Farthest) + // -- + // Keywords: + // "closest" - 1.0 range + // "farthest" - 99999.0 range + "Gravity Range" "150.0" + + // The Mutant Tank has this many chances out of 100.0% to trigger the range ability. + // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0.0 (No chance) + // Maximum: 100.0 (Highest chance) + // -- + // Keywords: + // "never" - 0% chance + // "sometimes"/"unlikely"/"seldom" - 33.3% chance + // "maybe" - 50% chance + // "often"/"likely"/"frequently" - 66.6% chance + // "always" - 100% chance + "Gravity Range Chance" "15.0" + + // The cooldown for the Mutant Tank's range ability. + // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0 (OFF) + // Maximum: 99999 (Longest) + // -- + // Keywords: + // "never"/"disabled"/"false"/"off"/"no" - 0 seconds + // "second" - 1 second + // "minute" - 1 minute + // "forever" - 99999 seconds + "Gravity Range Cooldown" "0" + + // The Mutant Tank's rock creates a blackhole when it breaks. + // Note: This does not need "Ability Enabled" or "Gravity Hit" to be set to "1". + // Note: This setting can be overridden for specific players. + // -- + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Gravity Rock Break" "0" + + // The Mutant Tank's rock has this many chances out of 100.0% to trigger the rock break ability. + // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0.0 (No chance) + // Maximum: 100.0 (Highest chance) // -- // Keywords: - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Laser Duration" "5" + // "never" - 0% chance + // "sometimes"/"unlikely"/"seldom" - 33.3% chance + // "maybe" - 50% chance + // "often"/"likely"/"frequently" - 66.6% chance + // "always" - 100% chance + "Gravity Rock Chance" "33.3" - // The Mutant Tank shoots lasers at survivors every time this many seconds passes. + // The cooldown for the Mutant Tank's rock ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.1 - // Maximum: 99999.0 + // Minimum: 0 (OFF) + // Maximum: 99999 (Longest) // -- // Keywords: - // "milli"/"millisecond" - 0.1 seconds + // "never"/"disabled"/"false"/"off"/"no" - 0 seconds // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Laser Interval" "1.0" - - // The mode of the Mutant Tank's laser ability. - // Note: This setting can be overridden for specific players. - // -- - // 0: The laser hits a single survivor target. - // 1: The laser hits a survivor target and their nearby teammates. - "Laser Mode" "0" + "Gravity Rock Cooldown" "0" - // The distance between a survivor and the Mutant Tank needed to trigger the ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // The Mutant Tank sets the survivors' gravity to this value. // Note: This setting can be overridden for specific players. // -- - // Minimum: 1.0 (Closest) - // Maximum: 99999.0 (Farthest) - // -- - // Keywords: - // "closest" - 1.0 range - // "farthest" - 99999.0 range - "Laser Range" "500.0" + // Minimum: 0.1 + // Maximum: 99999.0 + "Gravity Value" "0.3" "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" { - // Note: Override any of the settings in the "Laser Ability" section for each special infected here. + // Note: Override any of the settings in the "Gravity Ability" section for each special infected here. // Example "Access Flags" "" @@ -19430,18 +18169,30 @@ "Human Cooldown" "0" "Human Duration" "5" "Human Mode" "1" + "Human Pin Cooldown" "0" + "Human Range Cooldown" "0" "Open Areas Only" "0.0" "Requires Humans" "0" "Ability Enabled" "0" + "Ability Effect" "0" "Ability Message" "0" "Ability Sight" "0" - "Laser Chance" "33.3" - "Laser Cooldown" "0" - "Laser Damage" "5.0" - "Laser Duration" "5" - "Laser Interval" "1.0" - "Laser Mode" "0" - "Laser Range" "500.0" + "Gravity Chance" "33.3" + "Gravity Cooldown" "0" + "Gravity Duration" "5" + "Gravity Flags" "8" + "Gravity Force" "-50.0" + "Gravity Hit" "0" + "Gravity Hit Mode" "0" + "Gravity Mode" "0" + "Gravity Pin" "0" + "Gravity Pin Chance" "33.3" + "Gravity Pin Cooldown" "0" + "Gravity Radius" "750.0" + "Gravity Range" "150.0" + "Gravity Range Chance" "15.0" + "Gravity Range Cooldown" "0" + "Gravity Value" "0.3" } } } @@ -19449,7 +18200,7 @@ ```
-##### Leech Ability +##### Gunner Ability
Click to expand! @@ -19458,17 +18209,9 @@ { "Tank #1" { - // The Mutant Tank leeches health off of survivors. - // "Ability Enabled" - When a survivor is within range of the Mutant Tank, the Mutant Tank leeches health off of the survivor. - // - "Leech Range" - // - "Leech Range Chance" - // - "Leech Range Cooldown" - // "Leech Hit" - When a survivor is hit by the Mutant Tank's claw or rock, or a survivor hits the Mutant Tank with a melee weapon, the Mutant Tank leeches health off of the survivor. - // - "Leech Chance" - // - "Leech Cooldown" - // - "Leech Hit Mode" - // Requires "mt_abilities.smx" to be compiled with "mt_leech.sp" to work. - "Leech Ability" + // The Mutant Tank is armed with guns. + // Requires "mt_abilities.smx" to be compiled with "mt_gunner.sp" to work. + "Gunner Ability" { // Admins with one or more of these access flags have access to this ability. // Note: This setting can be overridden for specific players. @@ -19538,18 +18281,13 @@ // "forever" - 99999 seconds "Human Cooldown" "0" - // Human-controlled Mutant Tanks must wait this long before using their range ability again. + // The mode of how human-controlled Mutant Tanks activate their abilities. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 (OFF) - // Maximum: 99999 (Longest) - // -- - // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Human Range Cooldown" "0" + // 0: Press buttons to activate corresponding abilities. Cooldown starts after ability's duration ends. + // 1: Hold down buttons to keep corresponding abilities activated. Cooldown starts after the player lets go of the buttons. + // 2: Press buttons to toggle corresponding abilities. Cooldown starts after ability is deactivated. + "Human Mode" "1" // The ability can only activate in open areas. // Note: Do not change this setting if you are unsure of how it works. @@ -19563,81 +18301,43 @@ // "farthest" - 99999.0 range "Open Areas Only" "0.0" - // The ability is only effective toward human survivors. + // The ability is only effective toward human-controlled survivors. // Note: This setting can be overridden for specific players. // -- // Minimum: 0 // Maximum: 32 // -- // 0: OFF - // 1-32: ON, the number of human survivors required to be present for this ability to be effective. + // 1-32: ON, the number of human-controlled survivors required to be present for this ability to be effective. "Requires Humans" "0" // Enable this ability. - // Note: This setting does not affect the "Leech Hit" setting. // Note: This setting can be overridden for specific players. // -- // 0/"disabled"/"false"/"off"/"no": OFF // 1/"enabled"/"true"/"on"/"yes": ON "Ability Enabled" "0" - // Show a screen fade effect when the Mutant Tank uses its abilities. - // Note: The colors will randomly change between the colors set in the "Skin Color" and "Glow Color" settings. - // Note: This setting can be overridden for specific players. - // -- - // Add up numbers together for different results. - // -- - // Minimum: 0 - // Maximum: 7 - // -- - // 0: OFF - // 1: Show effect when the Mutant Tank uses its claw/rock attack. - // 2: Show effect when the Mutant Tank is hit by a melee weapon. - // 4: Show effect when the Mutant Tank uses its range ability. - // -- - // Keywords: - // "none"/"off" - 0 - // "attack" - 1 - // "hurt" - 2 - // "attack,hurt" - 3 - // "range" - 4 - // "attack,range" - 5 - // "hurt,range" - 6 - // "attack,hurt,range" - 7 - "Ability Effect" "0" - // Display a message whenever the ability activates/deactivates. // Note: This setting can be overridden for specific players. // -- - // Add up numbers together for different results. - // -- - // Minimum: 0 - // Maximum: 3 - // -- - // 0: OFF - // 1: Display message only when "Leech Hit" is enabled. - // 2: Display message only when "Ability Enabled" is enabled. - // -- - // Keywords: - // "none"/"off" - 0 - // "hit" - 1 - // "ability" - 2 - // "both"/"all"/"hit,ability" - 3 + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON "Ability Message" "0" - // Check line-of-sight when the Mutant Tank uses its abilities. + // The accuracy of the Mutant Tank's guns. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 - // Maximum: 5 + // Minimum: 0.1 (Highest) + // Maximum: 5.0 (Lowest) + "Gunner Accuracy" "2.0" + + // The number of bullets for the Mutant Tank's guns. + // Note: This setting can be overridden for specific players. // -- - // 0: OFF - // 1: Check if there is a solid object between the Mutant Tank and survivors. - // 2: Option 1 + Check if the Mutant Tank is looking toward the survivors. - // 3: Option 1 + Check if the Mutant Tank is looking away from the survivors. - // 4: Option 1 + Check if the survivors are looking toward the Mutant Tank. - // 5: Option 1 + Check if the survivors are looking away from the Mutant Tank. - "Ability Sight" "0" + // Minimum: 1 (Lowest) + // Maximum: 99999 (Highest) + "Gunner Bullets" "3" // The Mutant Tank has this many chances out of 100.0% to trigger the ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -19652,9 +18352,16 @@ // "maybe" - 50% chance // "often"/"likely"/"frequently" - 66.6% chance // "always" - 100% chance - "Leech Chance" "33.3" + "Gunner Chance" "33.3" - // The cooldown for the Mutant Tank's hit ability. + // The clip size for the Mutant Tank's guns. + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 1 (Smallest) + // Maximum: 99999 (Largest) + "Gunner Clip Size" "30" + + // The cooldown for the Mutant Tank's ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- @@ -19666,43 +18373,69 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Leech Cooldown" "0" + "Gunner Cooldown" "0" + + // The Mutant Tank's guns do this much damage. + // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0.0 (OFF) + // Maximum: 99999.0 + // -- + // Keywords: + // "weakest" - 1.0 damage + // "strongest" - 99999.0 damage + "Gunner Damage" "5.0" // The Mutant Tank's ability effects last this long. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- - // Minimum: 1 - // Maximum: 99999 + // Minimum: 0.1 + // Maximum: 99999.0 // -- // Keywords: + // "milli"/"millisecond" - 0.1 seconds // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Leech Duration" "5" + "Gunner Duration" "5.0" - // Enable the Mutant Tank's claw/rock attack. - // Note: This setting does not need the "Ability Enabled" setting to be set to "1". + // The Mutant Tank's guns have glow outlines when activated. + // Note: Only available in Left 4 Dead 2. + // Note: This setting relies on the glow settings under the "Tank #/Glow" section. + // Note: The glow outline may not appear when the "Glow Type" setting is set to "0" if the guns are not fully visible to the player. // Note: This setting can be overridden for specific players. // -- // 0/"disabled"/"false"/"off"/"no": OFF // 1/"enabled"/"true"/"on"/"yes": ON - "Leech Hit" "0" + "Gunner Glow" "1" - // The mode of the Mutant Tank's claw/rock attack. + // The type of the Mutant Tank's gun. // Note: This setting can be overridden for specific players. // -- - // 0: Both - // 1: Ability activates when the Mutant Tank hits a survivor. - // 2: Ability activates when the Mutant Tank is hit by a survivor. - // -- - // Keywords: - // "both"/"all" - 0 - // "tank"/"attack" - 1 - // "survivor"/"hurt" - 2 - "Leech Hit Mode" "0" + // 0: Random + // 1: M1911/P220/Glock Pistol + // 2: SMG + // 3: Pump Shotgun + // 4: M16 Assault Rifle + // 5: Combat Shotgun + // 6: Hunting Rifle + // 7: Magnum Pistol (Only available in Left 4 Dead 2.) + // 8: Silenced SMG (Only available in Left 4 Dead 2.) + // 9: MP5 SMG (Only available in Left 4 Dead 2.) + // 10: Chrome Shotgun (Only available in Left 4 Dead 2.) + // 11: AK47 Assault Rifle (Only available in Left 4 Dead 2.) + // 12: SG552 Assault Rifle (Only available in Left 4 Dead 2.) + // 13: SCAR-L Desert Rifle (Only available in Left 4 Dead 2.) + // 14: SPAS Shotgun (Only available in Left 4 Dead 2.) + // 15: Military Sniper Rifle (Only available in Left 4 Dead 2.) + // 16: Steyr Scout Rifle (Only available in Left 4 Dead 2.) + // 17: AWP Sniper Rifle (Only available in Left 4 Dead 2.) + // 18: M60 Machine Rifle (Only available in Left 4 Dead 2.) + "Gunner Gun Type" "0" - // The Mutant Tank leeches health off of survivors every time this many seconds passes. + // The Mutant Tank fires gunshots at survivors every time this many seconds passes. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- @@ -19714,9 +18447,16 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Leech Interval" "1.0" + "Gunner Interval" "1.0" - // The distance between a survivor and the Mutant Tank needed to trigger the ability. + // The Mutant Tank's guns take this many seconds to load in bullets before firing again. + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0.1 (Shortest) + // Maximum: 99999.0 (Longest) + "Gunner Load Time" "1.0" + + // The distance between an enemy and the Mutant Tank needed to trigger the ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- @@ -19726,40 +18466,34 @@ // Keywords: // "closest" - 1.0 range // "farthest" - 99999.0 range - "Leech Range" "150.0" + "Gunner Range" "500.0" - // The Mutant Tank has this many chances out of 100.0% to trigger the range ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // The Mutant Tank's guns take this many seconds to react. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.0 (No chance) - // Maximum: 100.0 (Highest chance) - // -- - // Keywords: - // "never" - 0% chance - // "sometimes"/"unlikely"/"seldom" - 33.3% chance - // "maybe" - 50% chance - // "often"/"likely"/"frequently" - 66.6% chance - // "always" - 100% chance - "Leech Range Chance" "15.0" + // Minimum: 0.1 (Shortest) + // Maximum: 99999.0 (Longest) + "Gunner Reaction Time" "1.0" - // The cooldown for the Mutant Tank's range ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // The type of targets tracked by the Mutant Tank's guns. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 (OFF) - // Maximum: 99999 (Longest) + // Add up numbers together for different results. // -- - // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Leech Range Cooldown" "0" + // Minimum: 0 + // Maximum: 31 + // -- + // 0 OR 31: All types. + // 1: Human-controlled survivors + // 2: Survivor bots + // 4: Incapacitated survivors + // 8: Common infected + // 16: Special infected + "Gunner Target Type" "0" "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" { - // Note: Override any of the settings in the "Leech Ability" section for each special infected here. + // Note: Override any of the settings in the "Gunner Ability" section for each special infected here. // Example "Access Flags" "" @@ -19769,22 +18503,25 @@ "Human Ability" "0" "Human Ammo" "5" "Human Cooldown" "0" - "Human Range Cooldown" "0" + "Human Mode" "1" "Open Areas Only" "0.0" "Requires Humans" "0" "Ability Enabled" "0" - "Ability Effect" "0" "Ability Message" "0" - "Ability Sight" "0" - "Leech Chance" "33.3" - "Leech Cooldown" "0" - "Leech Duration" "5" - "Leech Hit" "0" - "Leech Hit Mode" "0" - "Leech Interval" "1.0" - "Leech Range" "150.0" - "Leech Range Chance" "15.0" - "Leech Range Cooldown" "0" + "Gunner Accuracy" "2.0" + "Gunner Bullets" "3" + "Gunner Chance" "33.3" + "Gunner Clip Size" "30" + "Gunner Cooldown" "0" + "Gunner Damage" "5.0" + "Gunner Duration" "5.0" + "Gunner Glow" "1" + "Gunner Gun Type" "0" + "Gunner Interval" "1.0" + "Gunner Load Time" "1.0" + "Gunner Range" "500.0" + "Gunner Reaction Time" "1.0" + "Gunner Target Type" "0" } } } @@ -19792,7 +18529,7 @@ ```
-##### Lightning Ability +##### Heal Ability
Click to expand! @@ -19801,10 +18538,25 @@ { "Tank #1" { - // The Mutant Tank creates lightning storms. - // Requires "mt_abilities.smx" to be compiled with "mt_lightning.sp" to work. - // Note: Only available in Left 4 Dead 2. - "Lightning Ability" + // The Mutant Tank gains health from other nearby infected and sets survivors to temporary health who will die when they reach 0 HP. + // "Ability Enabled" - Any nearby infected can give the Mutant Tank some health. + // - "Heal Absorb Range" + // - "Heal Duration" + // - "Heal Glow" + // - "Heal Interval" + // - "Health From Commons" + // - "Health From Specials" + // - "Health From Tanks" + // "Ability Enabled" - When a survivor is within range of the Mutant Tank, the survivor is set to temporary health and will die when they reach 0 HP. + // - "Heal Range" + // - "Heal Range Chance" + // - "Heal Range Cooldown" + // "Heal Hit" - When a survivor is hit by the Mutant Tank's claw or rock, or a survivor hits the Mutant Tank with a melee weapon, the survivor is set to temporary health and will die when they reach 0 HP. + // - "Heal Chance" + // - "Heal Cooldown" + // - "Heal Hit Mode" + // Requires "mt_abilities.smx" to be compiled with "mt_heal.sp" to work. + "Heal Ability" { // Admins with one or more of these access flags have access to this ability. // Note: This setting can be overridden for specific players. @@ -19888,12 +18640,27 @@ "Human Duration" "5" // The mode of how human-controlled Mutant Tanks activate their abilities. + // Note: This setting does not apply to the range ability. // Note: This setting can be overridden for specific players. // -- // 0: Press buttons to activate corresponding abilities. Cooldown starts after ability's duration ends. // 1: Hold down buttons to keep corresponding abilities activated. Cooldown starts after the player lets go of the buttons. + // 2: Press buttons to toggle corresponding abilities. Cooldown starts after ability is deactivated. "Human Mode" "1" + // Human-controlled Mutant Tanks must wait this long before using their range ability again. + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0 (OFF) + // Maximum: 99999 (Longest) + // -- + // Keywords: + // "never"/"disabled"/"false"/"off"/"no" - 0 seconds + // "second" - 1 second + // "minute" - 1 minute + // "forever" - 99999 seconds + "Human Range Cooldown" "0" + // The ability can only activate in open areas. // Note: Do not change this setting if you are unsure of how it works. // Note: This setting can be overridden for specific players. @@ -19906,28 +18673,73 @@ // "farthest" - 99999.0 range "Open Areas Only" "0.0" - // The ability is only effective toward human survivors. + // The ability is only effective toward human-controlled survivors. // Note: This setting can be overridden for specific players. // -- // Minimum: 0 // Maximum: 32 // -- // 0: OFF - // 1-32: ON, the number of human survivors required to be present for this ability to be effective. + // 1-32: ON, the number of human-controlled survivors required to be present for this ability to be effective. "Requires Humans" "0" // Enable this ability. + // Note: This setting does not affect the "Heal Hit" setting. // Note: This setting can be overridden for specific players. // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON + // 0: OFF + // 1: ON, the Mutant Tank can give survivors temporary health. + // 2: ON, the Mutant Tank can absorb health from nearby infected. + // 3: ON, the Mutant Tank can do both. "Ability Enabled" "0" - // Display a message whenever the ability activates/deactivates. + // Show a screen fade effect when the Mutant Tank uses its abilities. + // Note: The colors will randomly change between the colors set in the "Skin Color" and "Glow Color" settings. // Note: This setting can be overridden for specific players. // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON + // Add up numbers together for different results. + // -- + // Minimum: 0 + // Maximum: 7 + // -- + // 0: OFF + // 1: Show effect when the Mutant Tank uses its claw/rock attack. + // 2: Show effect when the Mutant Tank is hit by a melee weapon. + // 4: Show effect when the Mutant Tank uses its range ability. + // -- + // Keywords: + // "none"/"off" - 0 + // "attack" - 1 + // "hurt" - 2 + // "attack,hurt" - 3 + // "range" - 4 + // "attack,range" - 5 + // "hurt,range" - 6 + // "attack,hurt,range" - 7 + "Ability Effect" "0" + + // Display a message whenever the abilities activate/deactivate. + // Note: This setting can be overridden for specific players. + // -- + // Add up numbers together for different results. + // -- + // Minimum: 0 + // Maximum: 7 + // -- + // 0: OFF + // 1: Display message only when "Heal Hit" is enabled. + // 2: Display message only when "Ability Enabled" is set to "1" or "3". + // 4: Display message only when "Ability Enabled" is set to "2" or "3". + // -- + // Keywords: + // "none"/"off" - 0 + // "hit" - 1 + // "ability" - 2 + // "hit,ability" - 3 + // "rock" - 4 + // "hit,rock" - 5 + // "ability,rock" - 6 + // "hit,ability,rock"/"all" - 7 "Ability Message" "0" // Check line-of-sight when the Mutant Tank uses its abilities. @@ -19944,6 +18756,25 @@ // 5: Option 1 + Check if the survivors are looking away from the Mutant Tank. "Ability Sight" "0" + // The distance between an infected and the Mutant Tank needed to trigger the ability. + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 1.0 (Closest) + // Maximum: 99999.0 (Farthest) + // -- + // Keywords: + // "closest" - 1.0 range + // "farthest" - 99999.0 range + "Heal Absorb Range" "500.0" + + // The amount of temporary health given to survivors. + // Note: This setting does not need the "Ability Enabled" setting to be set to "1". + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 1.0 + // Maximum: 1000000.0 + "Heal Buffer" "100.0" + // The Mutant Tank has this many chances out of 100.0% to trigger the ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. @@ -19957,9 +18788,9 @@ // "maybe" - 50% chance // "often"/"likely"/"frequently" - 66.6% chance // "always" - 100% chance - "Lightning Chance" "33.3" + "Heal Chance" "33.3" - // The cooldown for the Mutant Tank's ability. + // The cooldown for the Mutant Tank's main/hit ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- @@ -19971,50 +18802,139 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Lightning Cooldown" "0" + "Heal Cooldown" "0" - // The Mutant Tank's lightning storm strikes cause this much damage per hit. + // The Mutant Tank's ability effects last this long. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.0 (OFF) - // Maximum: 99999.0 + // Minimum: 0 + // Maximum: 99999 // -- // Keywords: - // "weakest" - 1.0 damage - // "strongest" - 99999.0 damage - "Lightning Damage" "5.0" + // "second" - 1 second + // "minute" - 1 minute + // "forever" - 99999 seconds + "Heal Duration" "0" - // The Mutant Tank's ability effects last this long. + // The Mutant Tank's healing gives it a glow outline when activated. + // Note: Only available in Left 4 Dead 2. + // Note: This setting relies on the glow settings under the "Tank #/Glow" section. + // Note: This setting can be overridden for specific players. + // -- + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Heal Glow" "1" + + // Enable the Mutant Tank's claw/rock attack. + // Note: This setting does not need the "Ability Enabled" setting to be set to "1". + // Note: This setting can be overridden for specific players. + // -- + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Heal Hit" "0" + + // The mode of the Mutant Tank's claw/rock attack. + // Note: This setting can be overridden for specific players. + // -- + // 0: Both + // 1: Ability activates when the Mutant Tank hits a survivor. + // 2: Ability activates when the Mutant Tank is hit by a survivor. + // -- + // Keywords: + // "both"/"all" - 0 + // "tank"/"attack" - 1 + // "survivor"/"hurt" - 2 + "Heal Hit Mode" "0" + + // The Mutant Tank receives health from nearby infected every time this many seconds passes. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 - // Maximum: 99999 + // Minimum: 0.1 + // Maximum: 99999.0 // -- // Keywords: + // "milli"/"millisecond" - 0.1 seconds // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Lightning Duration" "5" + "Heal Interval" "5.0" - // The Mutant Tank's lightning storm strikes every time this many seconds passes. + // The distance between a survivor and the Mutant Tank needed to trigger the ability. + // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 1.0 (Closest) + // Maximum: 99999.0 (Farthest) + // -- + // Keywords: + // "closest" - 1.0 range + // "farthest" - 99999.0 range + "Heal Range" "150.0" + + // The Mutant Tank has this many chances out of 100.0% to trigger the range ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.1 - // Maximum: 99999.0 + // Minimum: 0.0 (No chance) + // Maximum: 100.0 (Highest chance) + // -- + // Keywords: + // "never" - 0% chance + // "sometimes"/"unlikely"/"seldom" - 33.3% chance + // "maybe" - 50% chance + // "often"/"likely"/"frequently" - 66.6% chance + // "always" - 100% chance + "Heal Range Chance" "15.0" + + // The cooldown for the Mutant Tank's range ability. + // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0 (OFF) + // Maximum: 99999 (Longest) + // -- + // Keywords: + // "never"/"disabled"/"false"/"off"/"no" - 0 seconds + // "second" - 1 second + // "minute" - 1 minute + // "forever" - 99999 seconds + "Heal Range Cooldown" "0" + + // The Mutant Tank receives this much health from nearby common infected. + // Note: This setting can be overridden for specific players. + // -- + // Minimum: -1000000 + // Maximum: 1000000 + // -- + // Positive numbers: Current health + Health from commons + // Negative numbers: Current health - Health from commons + "Health From Commons" "50" + + // The Mutant Tank receives this much health from other nearby special infected. + // Note: This setting can be overridden for specific players. + // -- + // Minimum: -1000000 + // Maximum: 1000000 + // -- + // Positive numbers: Current health + Health from specials + // Negative numbers: Current health - Health from specials + "Health From Specials" "100" + + // The Mutant Tank receives this much health from other nearby Tanks. + // Note: This setting can be overridden for specific players. + // -- + // Minimum: -1000000 + // Maximum: 1000000 // -- - // Keywords: - // "milli"/"millisecond" - 0.1 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Lightning Interval" "1.0" + // Positive numbers: Current health + Health from Tanks + // Negative numbers: Current health - Health from Tanks + "Health From Tanks" "500" "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" { - // Note: Override any of the settings in the "Lightning Ability" section for each special infected here. + // Note: Override any of the settings in the "Heal Ability" section for each special infected here. // Example "Access Flags" "" @@ -20026,16 +18946,28 @@ "Human Cooldown" "0" "Human Duration" "5" "Human Mode" "1" + "Human Range Cooldown" "0" "Open Areas Only" "0.0" "Requires Humans" "0" "Ability Enabled" "0" + "Ability Effect" "0" "Ability Message" "0" "Ability Sight" "0" - "Lightning Chance" "33.3" - "Lightning Cooldown" "0" - "Lightning Damage" "5.0" - "Lightning Duration" "5" - "Lightning Interval" "1.0" + "Heal Absorb Range" "500.0" + "Heal Buffer" "100.0" + "Heal Chance" "33.3" + "Heal Cooldown" "0" + "Heal Duration" "0" + "Heal Glow" "1" + "Heal Hit" "0" + "Heal Hit Mode" "0" + "Heal Interval" "5.0" + "Heal Range" "150.0" + "Heal Range Chance" "15.0" + "Heal Range Cooldown" "0" + "Health From Commons" "50" + "Health From Specials" "100" + "Health From Tanks" "500" } } } @@ -20043,9 +18975,7 @@ ```
-#### Abilities Set #2 (M-Z) - -##### Medic Ability +##### Hurt Ability
Click to expand! @@ -20054,9 +18984,17 @@ { "Tank #1" { - // The Mutant Tank heals nearby special infected. - // Requires "mt_abilities2.smx" to be compiled with "mt_medic.sp" to work. - "Medic Ability" + // The Mutant Tank repeatedly hurts or pimp slaps survivors. + // "Ability Enabled" - When a survivor is within range of the Mutant Tank, the survivor gets hurt repeatedly. + // - "Hurt Range" + // - "Hurt Range Chance" + // - "Hurt Range Cooldown" + // "Hurt Hit" - When a survivor is hit by the Mutant Tank's claw or rock, or a survivor hits the Mutant Tank with a melee weapon, the survivor gets hurt repeatedly. + // - "Hurt Chance" + // - "Hurt Cooldown" + // - "Hurt Hit Mode" + // Requires "mt_abilities.smx" to be compiled with "mt_hurt.sp" to work. + "Hurt Ability" { // Admins with one or more of these access flags have access to this ability. // Note: This setting can be overridden for specific players. @@ -20065,6 +19003,14 @@ // Not empty: These access flags have access. "Access Flags" "" + // Admins with one or more of these immunity flags are immune to this ability's effects. + // Note: If the Mutant Tank has one or more of these immunity flags or has the same immunity flags as the survivor victim, the immunity is cancelled. + // Note: This setting can be overridden for specific players. + // -- + // Empty: No immunity flags are immune. + // Not empty: These immunity flags are immune. + "Immunity Flags" "" + // The ability can only activate in close areas. // Note: Do not change this setting if you are unsure of how it works. // Note: This setting can be overridden for specific players. @@ -20118,27 +19064,7 @@ // "forever" - 99999 seconds "Human Cooldown" "0" - // The Mutant Tank's ability effects last this long. - // Note: This setting does not affect human-controlled Mutant Tanks unless the "Human Mode" setting is set to "0". - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0 - // Maximum: 99999 - // -- - // Keywords: - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Human Duration" "5" - - // The mode of how human-controlled Mutant Tanks activate their abilities. - // Note: This setting can be overridden for specific players. - // -- - // 0: Press buttons to activate corresponding abilities. Cooldown starts after ability's duration ends. - // 1: Hold down buttons to keep corresponding abilities activated. Cooldown starts after the player lets go of the buttons. - "Human Mode" "1" - - // Human-controlled Mutant Tanks must wait this long before using their rock ability again. + // Human-controlled Mutant Tanks must wait this long before using their range ability again. // Note: This setting can be overridden for specific players. // -- // Minimum: 0 (OFF) @@ -20149,7 +19075,7 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Human Rock Cooldown" "0" + "Human Range Cooldown" "0" // The ability can only activate in open areas. // Note: Do not change this setting if you are unsure of how it works. @@ -20163,28 +19089,66 @@ // "farthest" - 99999.0 range "Open Areas Only" "0.0" - // The ability is only effective toward human survivors. + // The ability is only effective toward human-controlled survivors. // Note: This setting can be overridden for specific players. // -- // Minimum: 0 // Maximum: 32 // -- // 0: OFF - // 1-32: ON, the number of human survivors required to be present for this ability to be effective. + // 1-32: ON, the number of human-controlled survivors required to be present for this ability to be effective. "Requires Humans" "0" // Enable this ability. + // Note: This setting does not affect the "Hurt Hit" setting. // Note: This setting can be overridden for specific players. // -- // 0/"disabled"/"false"/"off"/"no": OFF // 1/"enabled"/"true"/"on"/"yes": ON "Ability Enabled" "0" + // Show a screen fade effect when the Mutant Tank uses its abilities. + // Note: The colors will randomly change between the colors set in the "Skin Color" and "Glow Color" settings. + // Note: This setting can be overridden for specific players. + // -- + // Add up numbers together for different results. + // -- + // Minimum: 0 + // Maximum: 7 + // -- + // 0: OFF + // 1: Show effect when the Mutant Tank uses its claw/rock attack. + // 2: Show effect when the Mutant Tank is hit by a melee weapon. + // 4: Show effect when the Mutant Tank uses its range ability. + // -- + // Keywords: + // "none"/"off" - 0 + // "attack" - 1 + // "hurt" - 2 + // "attack,hurt" - 3 + // "range" - 4 + // "attack,range" - 5 + // "hurt,range" - 6 + // "attack,hurt,range" - 7 + "Ability Effect" "0" + // Display a message whenever the ability activates/deactivates. // Note: This setting can be overridden for specific players. // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON + // Add up numbers together for different results. + // -- + // Minimum: 0 + // Maximum: 3 + // -- + // 0: OFF + // 1: Display message only when "Hurt Hit" is enabled. + // 2: Display message only when "Ability Enabled" is enabled. + // -- + // Keywords: + // "none"/"off" - 0 + // "hit" - 1 + // "ability" - 2 + // "both"/"all"/"hit,ability" - 3 "Ability Message" "0" // Check line-of-sight when the Mutant Tank uses its abilities. @@ -20201,27 +19165,6 @@ // 5: Option 1 + Check if the survivors are looking away from the Mutant Tank. "Ability Sight" "0" - // The damage buff multiplier given to nearby special infected. - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0.0 (OFF) - // Maximum: 99999.0 (Strongest) - "Medic Buff Damage" "1.25" - - // The resistance buff multiplier given to nearby special infected. - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0.0 (OFF) - // Maximum: 1.0 (None) - "Medic Buff Resistance" "0.75" - - // The speed buff multiplier given to nearby special infected. - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0.0 (OFF) - // Maximum: 10.0 (Fastest) - "Medic Buff Speed" "1.25" - // The Mutant Tank has this many chances out of 100.0% to trigger the ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. @@ -20235,9 +19178,9 @@ // "maybe" - 50% chance // "often"/"likely"/"frequently" - 66.6% chance // "always" - 100% chance - "Medic Chance" "33.3" + "Hurt Chance" "33.3" - // The cooldown for the Mutant Tank's ability. + // The cooldown for the Mutant Tank's hit ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- @@ -20249,56 +19192,55 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Medic Cooldown" "0" + "Hurt Cooldown" "0" + + // The Mutant Tank's pain inflictions do this much damage. + // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0.0 (OFF) + // Maximum: 99999.0 + // -- + // Keywords: + // "weakest" - 1.0 damage + // "strongest" - 99999.0 damage + "Hurt Damage" "5.0" // The Mutant Tank's ability effects last this long. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 + // Minimum: 1 // Maximum: 99999 // -- // Keywords: // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Medic Duration" "0" + "Hurt Duration" "5" - // The Mutant Tank creates a healing field visual effect around it when healing fellow special infected. + // Enable the Mutant Tank's claw/rock attack. + // Note: This setting does not need the "Ability Enabled" setting to be set to "1". // Note: This setting can be overridden for specific players. // -- // 0/"disabled"/"false"/"off"/"no": OFF // 1/"enabled"/"true"/"on"/"yes": ON - "Medic Field" "1" - - // These are the RGB values of the Mutant Tank's healing field's color. - // Note: Any value less than "0" will output a random color. - // Note: This setting can be overridden for specific players. - // -- - // 1st number = Red - // 2nd number = Green - // 3rd number = Blue - "Medic Field Color" "0,255,0" + "Hurt Hit" "0" - // The Mutant Tank gives special infected this much health each time. + // The mode of the Mutant Tank's claw/rock attack. // Note: This setting can be overridden for specific players. // -- - // Minimum: -1000000 - // Maximum: 1000000 - // -- - // Positive numbers: Current health + Medic health - // Negative numbers: Current health - Medic health + // 0: Both + // 1: Ability activates when the Mutant Tank hits a survivor. + // 2: Ability activates when the Mutant Tank is hit by a survivor. // -- - // 1st number = Health given to Smokers. - // 2nd number = Health given to Boomers. - // 3rd number = Health given to Hunters. - // 4th number = Health given to Spitters. - // 5th number = Health given to Jockeys. - // 6th number = Health given to Chargers. - // 7th number = Health given to Tanks. - "Medic Health" "25,25,25,25,25,25,25" + // Keywords: + // "both"/"all" - 0 + // "tank"/"attack" - 1 + // "survivor"/"hurt" - 2 + "Hurt Hit Mode" "0" - // The Mutant Tank heals nearby special infected every time this many seconds passes. + // The Mutant Tank hurts survivors every time this many seconds passes. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- @@ -20310,23 +19252,15 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Medic Interval" "5.0" + "Hurt Interval" "1.0" - // The special infected's max health. - // Note: The Mutant Tank will not heal special infected if they already have this much health. + // The mode of the Mutant Tank's hurt ability. // Note: This setting can be overridden for specific players. // -- - // Minimum: 1 - // Maximum: 1000000 - // -- - // 1st number = Smoker's maximum health. - // 2nd number = Boomer's maximum health. - // 3rd number = Hunter's maximum health. - // 4th number = Spitter's maximum health. - // 5th number = Jockey's maximum health. - // 6th number = Charger's maximum health. - // 7th number = Tank's maximum health. - "Medic Max Health" "250,50,250,100,325,600,8000" + // 0: Both types of hurt. + // 1: Hurt survivors periodically. + // 2: Pimp slap survivors several times. + "Hurt Mode" "0" // The distance between a survivor and the Mutant Tank needed to trigger the ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -20338,17 +19272,9 @@ // Keywords: // "closest" - 1.0 range // "farthest" - 99999.0 range - "Medic Range" "500.0" - - // The Mutant Tank's rock heals nearby special infected. - // Note: This does not need "Ability Enabled" to be set to "1". - // Note: This setting can be overridden for specific players. - // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Medic Rock Break" "0" + "Hurt Range" "150.0" - // The Mutant Tank's rock has this many chances out of 100.0% to trigger the rock break ability. + // The Mutant Tank has this many chances out of 100.0% to trigger the range ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- @@ -20361,9 +19287,9 @@ // "maybe" - 50% chance // "often"/"likely"/"frequently" - 66.6% chance // "always" - 100% chance - "Medic Rock Chance" "33.3" + "Hurt Range Chance" "15.0" - // The cooldown for the Mutant Tank's rock ability. + // The cooldown for the Mutant Tank's range ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- @@ -20375,50 +19301,38 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Medic Rock Cooldown" "0" - - // The Mutant Tank heals itself when healing nearby special infected. - // Note: This setting can be overridden for specific players. - // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Medic Symbiosis" "1" + "Hurt Range Cooldown" "0" "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" { - // Note: Override any of the settings in the "Medic Ability" section for each special infected here. + // Note: Override any of the settings in the "Hurt Ability" section for each special infected here. // Example "Access Flags" "" + "Immunity Flags" "" "Close Areas Only" "0.0" "Combo Ability" "0" "Human Ability" "0" "Human Ammo" "5" "Human Cooldown" "0" - "Human Duration" "5" - "Human Mode" "1" - "Human Pin Cooldown" "0" + "Human Range Cooldown" "0" "Open Areas Only" "0.0" "Requires Humans" "0" "Ability Enabled" "0" + "Ability Effect" "0" "Ability Message" "0" "Ability Sight" "0" - "Medic Buff Damage" "1.25" - "Medic Buff Resistance" "0.75" - "Medic Buff Speed" "1.25" - "Medic Chance" "33.3" - "Medic Cooldown" "0" - "Medic Duration" "0" - "Medic Field" "1" - "Medic Field Color" "0,255,0" - "Medic Health" "25,25,25,25,25,25,25" - "Medic Interval" "5.0" - "Medic Max Health" "250,50,250,100,325,600,8000" - "Medic Pin" "0" - "Medic Pin Chance" "33.3" - "Medic Pin Cooldown" "0" - "Medic Range" "500.0" - "Medic Symbiosis" "1" + "Hurt Chance" "33.3" + "Hurt Cooldown" "0" + "Hurt Damage" "5.0" + "Hurt Duration" "5" + "Hurt Hit" "0" + "Hurt Hit Mode" "0" + "Hurt Interval" "1.0" + "Hurt Mode" "0" + "Hurt Range" "150.0" + "Hurt Range Chance" "15.0" + "Hurt Range Cooldown" "0" } } } @@ -20426,7 +19340,7 @@ ```
-##### Meteor Ability +##### Hypno Ability
Click to expand! @@ -20435,9 +19349,17 @@ { "Tank #1" { - // The Mutant Tank creates meteor showers. - // Requires "mt_abilities2.smx" to be compiled with "mt_meteor.sp" to work. - "Meteor Ability" + // The Mutant Tank hypnotizes survivors to damage themselves or their teammates. + // "Ability Enabled" - When a survivor is within range of the Mutant Tank, the survivor is hypnotized. + // - "Hypno Range" + // - "Hypno Range Chance" + // - "Hypno Range Cooldown" + // "Hypno Hit" - When a survivor is hit by the Mutant Tank's claw or rock, or a survivor hits the Mutant Tank with a melee weapon, the survivor is hypnotized. + // - "Hypno Chance" + // - "Hypno Cooldown" + // - "Hypno Hit Mode" + // Requires "mt_abilities.smx" to be compiled with "mt_hypno.sp" to work. + "Hypno Ability" { // Admins with one or more of these access flags have access to this ability. // Note: This setting can be overridden for specific players. @@ -20507,25 +19429,18 @@ // "forever" - 99999 seconds "Human Cooldown" "0" - // The Mutant Tank's ability effects last this long. - // Note: This setting does not affect human-controlled Mutant Tanks unless the "Human Mode" setting is set to "0". + // Human-controlled Mutant Tanks must wait this long before using their range ability again. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 - // Maximum: 99999 + // Minimum: 0 (OFF) + // Maximum: 99999 (Longest) // -- // Keywords: + // "never"/"disabled"/"false"/"off"/"no" - 0 seconds // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Human Duration" "5" - - // The mode of how human-controlled Mutant Tanks activate their abilities. - // Note: This setting can be overridden for specific players. - // -- - // 0: Press buttons to activate corresponding abilities. Cooldown starts after ability's duration ends. - // 1: Hold down buttons to keep corresponding abilities activated. Cooldown starts after the player lets go of the buttons. - "Human Mode" "1" + "Human Range Cooldown" "0" // The ability can only activate in open areas. // Note: Do not change this setting if you are unsure of how it works. @@ -20539,31 +19454,229 @@ // "farthest" - 99999.0 range "Open Areas Only" "0.0" - // The ability is only effective toward human survivors. + // The ability is only effective toward human-controlled survivors. // Note: This setting can be overridden for specific players. // -- // Minimum: 0 // Maximum: 32 // -- // 0: OFF - // 1-32: ON, the number of human survivors required to be present for this ability to be effective. + // 1-32: ON, the number of human-controlled survivors required to be present for this ability to be effective. "Requires Humans" "0" // Enable this ability. + // Note: This setting does not affect the "Hypno Hit" setting. // Note: This setting can be overridden for specific players. // -- // 0/"disabled"/"false"/"off"/"no": OFF // 1/"enabled"/"true"/"on"/"yes": ON "Ability Enabled" "0" + // Show a screen fade effect when the Mutant Tank uses its abilities. + // Note: The colors will randomly change between the colors set in the "Skin Color" and "Glow Color" settings. + // Note: This setting can be overridden for specific players. + // -- + // Add up numbers together for different results. + // -- + // Minimum: 0 + // Maximum: 7 + // -- + // 0: OFF + // 1: Show effect when the Mutant Tank uses its claw/rock attack. + // 2: Show effect when the Mutant Tank is hit by a melee weapon. + // 4: Show effect when the Mutant Tank uses its range ability. + // -- + // Keywords: + // "none"/"off" - 0 + // "attack" - 1 + // "hurt" - 2 + // "attack,hurt" - 3 + // "range" - 4 + // "attack,range" - 5 + // "hurt,range" - 6 + // "attack,hurt,range" - 7 + "Ability Effect" "0" + // Display a message whenever the ability activates/deactivates. // Note: This setting can be overridden for specific players. // -- + // Add up numbers together for different results. + // -- + // Minimum: 0 + // Maximum: 3 + // -- + // 0: OFF + // 1: Display message only when "Hypno Hit" is enabled. + // 2: Display message only when "Ability Enabled" is enabled. + // -- + // Keywords: + // "none"/"off" - 0 + // "hit" - 1 + // "ability" - 2 + // "both"/"all"/"hit,ability" - 3 + "Ability Message" "0" + + // Check line-of-sight when the Mutant Tank uses its abilities. + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0 + // Maximum: 5 + // -- + // 0: OFF + // 1: Check if there is a solid object between the Mutant Tank and survivors. + // 2: Option 1 + Check if the Mutant Tank is looking toward the survivors. + // 3: Option 1 + Check if the Mutant Tank is looking away from the survivors. + // 4: Option 1 + Check if the survivors are looking toward the Mutant Tank. + // 5: Option 1 + Check if the survivors are looking away from the Mutant Tank. + "Ability Sight" "0" + + // The bullet damage reflected towards survivors by the Mutant Tank is divided by this value. + // Note: Damage = Bullet damage/Hypno bullet divisor + // Example: Damage = 30.0/20.0 (1.5) + // Note: Use the value "1.0" to disable this setting. (Bullet damage/1.0 = Bullet damage) + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 1.0 + // Maximum: 99999.0 + "Hypno Bullet Divisor" "20.0" + + // The Mutant Tank has this many chances out of 100.0% to trigger the ability. + // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0.0 (No chance) + // Maximum: 100.0 (Highest chance) + // -- + // Keywords: + // "never" - 0% chance + // "sometimes"/"unlikely"/"seldom" - 33.3% chance + // "maybe" - 50% chance + // "often"/"likely"/"frequently" - 66.6% chance + // "always" - 100% chance + "Hypno Chance" "33.3" + + // These are the RGBA values of the Mutant Tank's shield prop's color. + // Note: Any value less than "0" will output a random color. + // Note: This setting can be overridden for specific players. + // -- + // 1st number = Red + // 2nd number = Green + // 3rd number = Blue + // 4th number = Alpha + // -- + // Keywords: + // "rainbow" - cycle through colors constantly. + "Hypno Color" "255,255,255,255" + + // The cooldown for the Mutant Tank's hit ability. + // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0 (OFF) + // Maximum: 99999 (Longest) + // -- + // Keywords: + // "never"/"disabled"/"false"/"off"/"no" - 0 seconds + // "second" - 1 second + // "minute" - 1 minute + // "forever" - 99999 seconds + "Hypno Cooldown" "0" + + // The Mutant Tank's ability effects last this long. + // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0.1 + // Maximum: 99999.0 + // -- + // Keywords: + // "milli"/"millisecond" - 0.1 seconds + // "second" - 1 second + // "minute" - 1 minute + // "forever" - 99999 seconds + "Hypno Duration" "5.0" + + // The explosive damage reflected towards survivors by the Mutant Tank is divided by this value. + // Note: Damage = Explosive damage/Hypno explosive divisor + // Example: Damage = 30.0/20.0 (1.5) + // Note: Use the value "1.0" to disable this setting. (Explosive damage/1.0 = Explosive damage) + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 1.0 + // Maximum: 99999.0 + "Hypno Explosive Divisor" "20.0" + + // The fire damage reflected towards survivors by the Mutant Tank is divided by this value. + // Note: Damage = Fire damage/Hypno fire divisor + // Example: Damage = 300.0/200.0 (1.5) + // Note: Use the value "1.0" to disable this setting. (Fire damage/1.0 = Fire damage) + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 1.0 + // Maximum: 99999.0 + "Hypno Fire Divisor" "200.0" + + // Enable the Mutant Tank's claw/rock attack. + // Note: This setting does not need the "Ability Enabled" setting to be set to "1". + // Note: This setting can be overridden for specific players. + // -- // 0/"disabled"/"false"/"off"/"no": OFF // 1/"enabled"/"true"/"on"/"yes": ON - "Ability Message" "0" + "Hypno Hit" "0" + + // The mode of the Mutant Tank's claw/rock attack. + // Note: This setting can be overridden for specific players. + // -- + // 0: Both + // 1: Ability activates when the Mutant Tank hits a survivor. + // 2: Ability activates when the Mutant Tank is hit by a survivor. + // -- + // Keywords: + // "both"/"all" - 0 + // "tank"/"attack" - 1 + // "survivor"/"hurt" - 2 + "Hypno Hit Mode" "0" + + // The hittable damage reflected towards survivors by the Mutant Tank is divided by this value. + // Note: Damage = Hittable damage/Hypno hittable divisor + // Example: Damage = 30.0/20.0 (1.5) + // Note: Use the value "1.0" to disable this setting. (Hittable damage/1.0 = Hittable damage) + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 1.0 + // Maximum: 99999.0 + "Hypno Hittable Divisor" "20.0" + + // The melee damage reflected towards survivors by the Mutant Tank is divided by this value. + // Note: Damage = Melee damage/Hypno melee divisor + // Example: Damage = 300.0/200.0 (1.5) + // Note: Use the value "1.0" to disable this setting. (Melee damage/1.0 = Melee damage) + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 1.0 + // Maximum: 99999.0 + "Hypno Melee Divisor" "200.0" + + // The mode of the Mutant Tank's hypno ability. + // Note: This setting can be overridden for specific players. + // -- + // 0: Hypnotized survivors hurt themselves. + // 1: Hypnotized survivors can hurt their teammates. + "Hypno Mode" "0" + + // The distance between a survivor and the Mutant Tank needed to trigger the ability. + // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 1.0 (Closest) + // Maximum: 99999.0 (Farthest) + // -- + // Keywords: + // "closest" - 1.0 range + // "farthest" - 99999.0 range + "Hypno Range" "150.0" - // The Mutant Tank has this many chances out of 100.0% to trigger the ability. + // The Mutant Tank has this many chances out of 100.0% to trigger the range ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- @@ -20576,9 +19689,9 @@ // "maybe" - 50% chance // "often"/"likely"/"frequently" - 66.6% chance // "always" - 100% chance - "Meteor Chance" "33.3" + "Hypno Range Chance" "15.0" - // The cooldown for the Mutant Tank's ability. + // The cooldown for the Mutant Tank's range ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- @@ -20590,79 +19703,18 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Meteor Cooldown" "0" - - // The Mutant Tank's meteorites do this much damage. - // Note: This is ignored when the "Combo Ability" setting is set to "1". - // Note: This setting only applies if the "Meteor Mode" setting is set to "1". - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0.0 (OFF) - // Maximum: 99999.0 - // -- - // Keywords: - // "weakest" - 1.0 damage - // "strongest" - 99999.0 damage - "Meteor Damage" "5.0" - - // The Mutant Tank's ability effects last this long. - // Note: This is ignored when the "Combo Ability" setting is set to "1". - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0 - // Maximum: 99999 - // -- - // Keywords: - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Meteor Duration" "5" - - // The Mutant Tank's meteor shower drops a meteorite every time this many seconds passes. - // Note: This is ignored when the "Combo Ability" setting is set to "1". - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0.1 - // Maximum: 1.0 - "Meteor Interval" "0.6" - - // Meteorites dropped by the Mutant Tank's meteor shower will disappear after this many seconds. - // Note: The timer starts when the meteorite spawns, so take into account the time it takes to fall to the ground. - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0.1 - // Maximum: 99999.0 - // -- - // Keywords: - // "milli"/"millisecond" - 0.1 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Meteor Lifetime" "15.0" - - // The mode of the Mutant Tank's meteor shower ability. - // Note: This setting can be overridden for specific players. - // -- - // 0: The Mutant Tank's meteorites will explode and start fires. - // 1: The Mutant Tank's meteorites will explode and damage and push back nearby survivors. - "Meteor Mode" "0" + "Hypno Range Cooldown" "0" - // The radius of the Mutant Tank's meteor shower. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // The Mutant Tank will have a shield that is only visible to hypnotized survivors. // Note: This setting can be overridden for specific players. // -- - // 1st number = Minimum radius - // Minimum: -200.0 - // Maximum: 0.0 - // -- - // 2nd number = Maximum radius - // Minimum: 0.0 - // Maximum: 200.0 - "Meteor Radius" "-180.0,180.0" + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Hypno View" "0" "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" { - // Note: Override any of the settings in the "Meteor Ability" section for each special infected here. + // Note: Override any of the settings in the "Hypno Ability" section for each special infected here. // Example "Access Flags" "" @@ -20672,20 +19724,29 @@ "Human Ability" "0" "Human Ammo" "5" "Human Cooldown" "0" - "Human Duration" "5" - "Human Mode" "1" + "Human Range Cooldown" "0" "Open Areas Only" "0.0" "Requires Humans" "0" "Ability Enabled" "0" + "Ability Effect" "0" "Ability Message" "0" - "Meteor Chance" "33.3" - "Meteor Cooldown" "0" - "Meteor Damage" "5.0" - "Meteor Duration" "5" - "Meteor Interval" "0.6" - "Meteor Lifetime" "15.0" - "Meteor Mode" "0" - "Meteor Radius" "-180.0,180.0" + "Ability Sight" "0" + "Hypno Bullet Divisor" "20.0" + "Hypno Chance" "33.3" + "Hypno Color" "255,255,255,255" + "Hypno Cooldown" "0" + "Hypno Duration" "5.0" + "Hypno Explosive Divisor" "20.0" + "Hypno Fire Divisor" "200.0" + "Hypno Hit" "0" + "Hypno Hit Mode" "0" + "Hypno Hittable Divisor" "20.0" + "Hypno Melee Divisor" "200.0" + "Hypno Mode" "0" + "Hypno Range" "150.0" + "Hypno Range Chance" "15.0" + "Hypno Range Cooldown" "0" + "Hypno View" "0" } } } @@ -20693,7 +19754,7 @@ ```
-##### Minion Ability +##### Ice Ability
Click to expand! @@ -20702,9 +19763,17 @@ { "Tank #1" { - // The Mutant Tank spawns minions. - // Requires "mt_abilities2.smx" to be compiled with "mt_minion.sp" to work. - "Minion Ability" + // The Mutant Tank freezes survivors. + // "Ability Enabled" - When a survivor is within range of the Mutant Tank, the survivor is frozen in place. + // - "Ice Range" + // - "Ice Range Chance" + // - "Ice Range Cooldown" + // "Ice Hit" - When a survivor is hit by the Mutant Tank's claw or rock, or a survivor hits the Mutant Tank with a melee weapon, the survivor is frozen in place. + // - "Ice Chance" + // - "Ice Cooldown" + // - "Ice Hit Mode" + // Requires "mt_abilities.smx" to be compiled with "mt_ice.sp" to work. + "Ice Ability" { // Admins with one or more of these access flags have access to this ability. // Note: This setting can be overridden for specific players. @@ -20713,6 +19782,14 @@ // Not empty: These access flags have access. "Access Flags" "" + // Admins with one or more of these immunity flags are immune to this ability's effects. + // Note: If the Mutant Tank has one or more of these immunity flags or has the same immunity flags as the survivor victim, the immunity is cancelled. + // Note: This setting can be overridden for specific players. + // -- + // Empty: No immunity flags are immune. + // Not empty: These immunity flags are immune. + "Immunity Flags" "" + // The ability can only activate in close areas. // Note: Do not change this setting if you are unsure of how it works. // Note: This setting can be overridden for specific players. @@ -20766,6 +19843,19 @@ // "forever" - 99999 seconds "Human Cooldown" "0" + // Human-controlled Mutant Tanks must wait this long before using their range ability again. + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0 (OFF) + // Maximum: 99999 (Longest) + // -- + // Keywords: + // "never"/"disabled"/"false"/"off"/"no" - 0 seconds + // "second" - 1 second + // "minute" - 1 minute + // "forever" - 99999 seconds + "Human Range Cooldown" "0" + // The ability can only activate in open areas. // Note: Do not change this setting if you are unsure of how it works. // Note: This setting can be overridden for specific players. @@ -20778,36 +19868,81 @@ // "farthest" - 99999.0 range "Open Areas Only" "0.0" - // The ability is only effective toward human survivors. + // The ability is only effective toward human-controlled survivors. // Note: This setting can be overridden for specific players. // -- // Minimum: 0 // Maximum: 32 // -- // 0: OFF - // 1-32: ON, the number of human survivors required to be present for this ability to be effective. + // 1-32: ON, the number of human-controlled survivors required to be present for this ability to be effective. "Requires Humans" "0" // Enable this ability. + // Note: This setting does not affect the "Ice Hit" setting. // Note: This setting can be overridden for specific players. // -- // 0/"disabled"/"false"/"off"/"no": OFF // 1/"enabled"/"true"/"on"/"yes": ON "Ability Enabled" "0" + // Show a screen fade effect when the Mutant Tank uses its abilities. + // Note: The colors will randomly change between the colors set in the "Skin Color" and "Glow Color" settings. + // Note: This setting can be overridden for specific players. + // -- + // Add up numbers together for different results. + // -- + // Minimum: 0 + // Maximum: 7 + // -- + // 0: OFF + // 1: Show effect when the Mutant Tank uses its claw/rock attack. + // 2: Show effect when the Mutant Tank is hit by a melee weapon. + // 4: Show effect when the Mutant Tank uses its range ability. + // -- + // Keywords: + // "none"/"off" - 0 + // "attack" - 1 + // "hurt" - 2 + // "attack,hurt" - 3 + // "range" - 4 + // "attack,range" - 5 + // "hurt,range" - 6 + // "attack,hurt,range" - 7 + "Ability Effect" "0" + // Display a message whenever the ability activates/deactivates. // Note: This setting can be overridden for specific players. // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON + // Add up numbers together for different results. + // -- + // Minimum: 0 + // Maximum: 3 + // -- + // 0: OFF + // 1: Display message only when "Ice Hit" is enabled. + // 2: Display message only when "Ability Enabled" is enabled. + // -- + // Keywords: + // "none"/"off" - 0 + // "hit" - 1 + // "ability" - 2 + // "both"/"all"/"hit,ability" - 3 "Ability Message" "0" - // The amount of minions the Mutant Tank can spawn. + // Check line-of-sight when the Mutant Tank uses its abilities. // Note: This setting can be overridden for specific players. // -- - // Minimum: 1 - // Maximum: 15 - "Minion Amount" "5" + // Minimum: 0 + // Maximum: 5 + // -- + // 0: OFF + // 1: Check if there is a solid object between the Mutant Tank and survivors. + // 2: Option 1 + Check if the Mutant Tank is looking toward the survivors. + // 3: Option 1 + Check if the Mutant Tank is looking away from the survivors. + // 4: Option 1 + Check if the survivors are looking toward the Mutant Tank. + // 5: Option 1 + Check if the survivors are looking away from the Mutant Tank. + "Ability Sight" "0" // The Mutant Tank has this many chances out of 100.0% to trigger the ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -20822,9 +19957,9 @@ // "maybe" - 50% chance // "often"/"likely"/"frequently" - 66.6% chance // "always" - 100% chance - "Minion Chance" "33.3" + "Ice Chance" "33.3" - // The cooldown for the Mutant Tank's ability. + // The cooldown for the Mutant Tank's hit ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- @@ -20836,75 +19971,111 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Minion Cooldown" "0" + "Ice Cooldown" "0" - // Minions spawned by the Mutant Tank die after this many seconds. + // The Mutant Tank's ability effects last this long. + // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.0 (Until death) - // Maximum: 99999.0 (Longest) + // Minimum: 0.1 + // Maximum: 99999.0 // -- // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds // "milli"/"millisecond" - 0.1 seconds // "second" - 1 second // "minute" - 1 minute - // "forever"/"death" - 99999 seconds - "Minion Lifetime" "0.0" + // "forever" - 99999 seconds + "Ice Duration" "5.0" + + // Enable the Mutant Tank's claw/rock attack. + // Note: This setting does not need the "Ability Enabled" setting to be set to "1". + // Note: This setting can be overridden for specific players. + // -- + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Ice Hit" "0" + + // The mode of the Mutant Tank's claw/rock attack. + // Note: This setting can be overridden for specific players. + // -- + // 0: Both + // 1: Ability activates when the Mutant Tank hits a survivor. + // 2: Ability activates when the Mutant Tank is hit by a survivor. + // -- + // Keywords: + // "both"/"all" - 0 + // "tank"/"attack" - 1 + // "survivor"/"hurt" - 2 + "Ice Hit Mode" "0" + + // The distance between a survivor and the Mutant Tank needed to trigger the ability. + // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 1.0 (Closest) + // Maximum: 99999.0 (Farthest) + // -- + // Keywords: + // "closest" - 1.0 range + // "farthest" - 99999.0 range + "Ice Range" "150.0" - // Remove all minions spawned by the Mutant Tank when it dies or changes its Mutant Tank type. + // The Mutant Tank has this many chances out of 100.0% to trigger the range ability. + // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Minion Remove" "1" - - // The Mutant Tank's minions are replaced with new ones when they die. - // Note: This setting can be overridden for specific players. + // Minimum: 0.0 (No chance) + // Maximum: 100.0 (Highest chance) // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Minion Replace" "1" + // Keywords: + // "never" - 0% chance + // "sometimes"/"unlikely"/"seldom" - 33.3% chance + // "maybe" - 50% chance + // "often"/"likely"/"frequently" - 66.6% chance + // "always" - 100% chance + "Ice Range Chance" "15.0" - // The Mutant Tank spawns these minions. + // The cooldown for the Mutant Tank's range ability. + // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- - // Add up numbers together for different results. - // -- - // Minimum: 0 - // Maximum: 63 + // Minimum: 0 (OFF) + // Maximum: 99999 (Longest) // -- - // 0 OR 63: Pick randomly between the 6 types. - // 1: Smoker - // 2: Boomer - // 4: Hunter - // 8: Spitter (Switches to Boomer in Left 4 Dead 1.) - // 16: Jockey (Switches to Hunter in Left 4 Dead 1.) - // 32: Charger (Switches to Smoker in Left 4 Dead 1.) - "Minion Types" "63" + // Keywords: + // "never"/"disabled"/"false"/"off"/"no" - 0 seconds + // "second" - 1 second + // "minute" - 1 minute + // "forever" - 99999 seconds + "Ice Range Cooldown" "0" "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" { - // Note: Override any of the settings in the "Minion Ability" section for each special infected here. + // Note: Override any of the settings in the "Ice Ability" section for each special infected here. // Example "Access Flags" "" + "Immunity Flags" "" "Close Areas Only" "0.0" "Combo Ability" "0" "Human Ability" "0" "Human Ammo" "5" "Human Cooldown" "0" + "Human Range Cooldown" "0" "Open Areas Only" "0.0" "Requires Humans" "0" "Ability Enabled" "0" + "Ability Effect" "0" "Ability Message" "0" - "Minion Amount" "5" - "Minion Chance" "33.3" - "Minion Cooldown" "0" - "Minion Lifetime" "0.0" - "Minion Remove" "1" - "Minion Replace" "1" - "Minion Types" "63" + "Ability Sight" "0" + "Ice Chance" "33.3" + "Ice Cooldown" "0" + "Ice Duration" "5.0" + "Ice Hit" "0" + "Ice Hit Mode" "0" + "Ice Range" "150.0" + "Ice Range Chance" "15.0" + "Ice Range Cooldown" "0" } } } @@ -20912,7 +20083,7 @@ ```
-##### Necro Ability +##### Idle Ability
Click to expand! @@ -20921,9 +20092,17 @@ { "Tank #1" { - // The Mutant Tank resurrects nearby special infected that die. - // Requires "mt_abilities2.smx" to be compiled with "mt_necro.sp" to work. - "Necro Ability" + // The Mutant Tank forces survivors to go idle. + // "Ability Enabled" - When a survivor is within range of the Mutant Tank, the survivor goes idle. + // - "Idle Range" + // - "Idle Range Chance" + // - "Idle Range Cooldown" + // "Idle Hit" - When a survivor is hit by the Mutant Tank's claw or rock, or a survivor hits the Mutant Tank with a melee weapon, the survivor goes idle. + // - "Idle Chance" + // - "Idle Cooldown" + // - "Idle Hit Mode" + // Requires "mt_abilities.smx" to be compiled with "mt_idle.sp" to work. + "Idle Ability" { // Admins with one or more of these access flags have access to this ability. // Note: This setting can be overridden for specific players. @@ -20932,6 +20111,14 @@ // Not empty: These access flags have access. "Access Flags" "" + // Admins with one or more of these immunity flags are immune to this ability's effects. + // Note: If the Mutant Tank has one or more of these immunity flags or has the same immunity flags as the survivor victim, the immunity is cancelled. + // Note: This setting can be overridden for specific players. + // -- + // Empty: No immunity flags are immune. + // Not empty: These immunity flags are immune. + "Immunity Flags" "" + // The ability can only activate in close areas. // Note: Do not change this setting if you are unsure of how it works. // Note: This setting can be overridden for specific players. @@ -20985,25 +20172,18 @@ // "forever" - 99999 seconds "Human Cooldown" "0" - // The Mutant Tank's ability effects last this long. - // Note: This setting does not affect human-controlled Mutant Tanks unless the "Human Mode" setting is set to "0". + // Human-controlled Mutant Tanks must wait this long before using their range ability again. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 - // Maximum: 99999 + // Minimum: 0 (OFF) + // Maximum: 99999 (Longest) // -- // Keywords: + // "never"/"disabled"/"false"/"off"/"no" - 0 seconds // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Human Duration" "5" - - // The mode of how human-controlled Mutant Tanks activate their abilities. - // Note: This setting can be overridden for specific players. - // -- - // 0: Press buttons to activate corresponding abilities. Cooldown starts after ability's duration ends. - // 1: Hold down buttons to keep corresponding abilities activated. Cooldown starts after the player lets go of the buttons. - "Human Mode" "1" + "Human Range Cooldown" "0" // The ability can only activate in open areas. // Note: Do not change this setting if you are unsure of how it works. @@ -21017,28 +20197,66 @@ // "farthest" - 99999.0 range "Open Areas Only" "0.0" - // The ability is only effective toward human survivors. + // The ability is only effective toward human-controlled survivors. // Note: This setting can be overridden for specific players. // -- // Minimum: 0 // Maximum: 32 // -- // 0: OFF - // 1-32: ON, the number of human survivors required to be present for this ability to be effective. - "Requires Humans" "0" + // 1-32: ON, the number of human-controlled survivors required to be present for this ability to be effective. + "Requires Humans" "1" // Enable this ability. + // Note: This setting does not affect the "Idle Hit" setting. // Note: This setting can be overridden for specific players. // -- // 0/"disabled"/"false"/"off"/"no": OFF // 1/"enabled"/"true"/"on"/"yes": ON "Ability Enabled" "0" + // Show a screen fade effect when the Mutant Tank uses its abilities. + // Note: The colors will randomly change between the colors set in the "Skin Color" and "Glow Color" settings. + // Note: This setting can be overridden for specific players. + // -- + // Add up numbers together for different results. + // -- + // Minimum: 0 + // Maximum: 7 + // -- + // 0: OFF + // 1: Show effect when the Mutant Tank uses its claw/rock attack. + // 2: Show effect when the Mutant Tank is hit by a melee weapon. + // 4: Show effect when the Mutant Tank uses its range ability. + // -- + // Keywords: + // "none"/"off" - 0 + // "attack" - 1 + // "hurt" - 2 + // "attack,hurt" - 3 + // "range" - 4 + // "attack,range" - 5 + // "hurt,range" - 6 + // "attack,hurt,range" - 7 + "Ability Effect" "0" + // Display a message whenever the ability activates/deactivates. // Note: This setting can be overridden for specific players. // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON + // Add up numbers together for different results. + // -- + // Minimum: 0 + // Maximum: 3 + // -- + // 0: OFF + // 1: Display message only when "Idle Hit" is enabled. + // 2: Display message only when "Ability Enabled" is enabled. + // -- + // Keywords: + // "none"/"off" - 0 + // "hit" - 1 + // "ability" - 2 + // "both"/"all"/"hit,ability" - 3 "Ability Message" "0" // Check line-of-sight when the Mutant Tank uses its abilities. @@ -21068,9 +20286,9 @@ // "maybe" - 50% chance // "often"/"likely"/"frequently" - 66.6% chance // "always" - 100% chance - "Necro Chance" "33.3" + "Idle Chance" "33.3" - // The cooldown for the Mutant Tank's ability. + // The cooldown for the Mutant Tank's hit ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- @@ -21082,22 +20300,30 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Necro Cooldown" "0" + "Idle Cooldown" "0" - // The Mutant Tank's ability effects last this long. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Enable the Mutant Tank's claw/rock attack. + // Note: This setting does not need the "Ability Enabled" setting to be set to "1". // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 - // Maximum: 99999 + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Idle Hit" "0" + + // The mode of the Mutant Tank's claw/rock attack. + // Note: This setting can be overridden for specific players. + // -- + // 0: Both + // 1: Ability activates when the Mutant Tank hits a survivor. + // 2: Ability activates when the Mutant Tank is hit by a survivor. // -- // Keywords: - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Necro Duration" "0" + // "both"/"all" - 0 + // "tank"/"attack" - 1 + // "survivor"/"hurt" - 2 + "Idle Hit Mode" "0" - // The distance between a special infected and the Mutant Tank needed to trigger the ability. + // The distance between a survivor and the Mutant Tank needed to trigger the ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- @@ -21107,30 +20333,63 @@ // Keywords: // "closest" - 1.0 range // "farthest" - 99999.0 range - "Necro Range" "500.0" + "Idle Range" "150.0" + + // The Mutant Tank has this many chances out of 100.0% to trigger the range ability. + // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0.0 (No chance) + // Maximum: 100.0 (Highest chance) + // -- + // Keywords: + // "never" - 0% chance + // "sometimes"/"unlikely"/"seldom" - 33.3% chance + // "maybe" - 50% chance + // "often"/"likely"/"frequently" - 66.6% chance + // "always" - 100% chance + "Idle Range Chance" "15.0" + + // The cooldown for the Mutant Tank's range ability. + // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0 (OFF) + // Maximum: 99999 (Longest) + // -- + // Keywords: + // "never"/"disabled"/"false"/"off"/"no" - 0 seconds + // "second" - 1 second + // "minute" - 1 minute + // "forever" - 99999 seconds + "Idle Range Cooldown" "0" "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" { - // Note: Override any of the settings in the "Necro Ability" section for each special infected here. + // Note: Override any of the settings in the "Idle Ability" section for each special infected here. // Example "Access Flags" "" + "Immunity Flags" "" "Close Areas Only" "0.0" "Combo Ability" "0" "Human Ability" "0" "Human Ammo" "5" "Human Cooldown" "0" - "Human Duration" "5" - "Human Mode" "1" + "Human Range Cooldown" "0" "Open Areas Only" "0.0" - "Requires Humans" "0" + "Requires Humans" "1" "Ability Enabled" "0" + "Ability Effect" "0" "Ability Message" "0" "Ability Sight" "0" - "Necro Chance" "33.3" - "Necro Cooldown" "0" - "Necro Duration" "0" - "Necro Range" "500.0" + "Idle Chance" "33.3" + "Idle Cooldown" "0" + "Idle Hit" "0" + "Idle Hit Mode" "0" + "Idle Range" "150.0" + "Idle Range Chance" "15.0" + "Idle Range Cooldown" "0" } } } @@ -21138,7 +20397,7 @@ ```
-##### Nullify Ability +##### Invert Ability
Click to expand! @@ -21147,17 +20406,17 @@ { "Tank #1" { - // The Mutant Tank nullifies all of the survivors' damage. - // "Ability Enabled" - When a survivor is within range of the Mutant Tank, the survivor does not do any damage to the Mutant Tank. - // - "Nullify Range" - // - "Nullify Range Chance" - // - "Nullify Range Cooldown" - // "Nullify Hit" - When a survivor is hit by the Mutant Tank's claw or rock, or a survivor hits the Mutant Tank with a melee weapon, the survivor does not do any damage to the Mutant Tank. - // - "Nullify Chance" - // - "Nullify Cooldown" - // - "Nullify Hit Mode" - // Requires "mt_abilities2.smx" to be compiled with "mt_nullify.sp" to work. - "Nullify Ability" + // The Mutant Tank inverts the survivors' movement keys. + // "Ability Enabled" - When a survivor is within range of the Mutant Tank, the survivor's movement keys are inverted. + // - "Invert Range" + // - "Invert Range Chance" + // - "Invert Range Cooldown" + // "Invert Hit" - When a survivor is hit by the Mutant Tank's claw or rock, or a survivor hits the Mutant Tank with a melee weapon, the survivor's movement keys are inverted. + // - "Invert Chance" + // - "Invert Cooldown" + // - "Invert Hit Mode" + // Requires "mt_abilities.smx" to be compiled with "mt_invert.sp" to work. + "Invert Ability" { // Admins with one or more of these access flags have access to this ability. // Note: This setting can be overridden for specific players. @@ -21252,18 +20511,18 @@ // "farthest" - 99999.0 range "Open Areas Only" "0.0" - // The ability is only effective toward human survivors. + // The ability is only effective toward human-controlled survivors. // Note: This setting can be overridden for specific players. // -- // Minimum: 0 // Maximum: 32 // -- // 0: OFF - // 1-32: ON, the number of human survivors required to be present for this ability to be effective. - "Requires Humans" "1" + // 1-32: ON, the number of human-controlled survivors required to be present for this ability to be effective. + "Requires Humans" "0" // Enable this ability. - // Note: This setting does not affect the "Nullify Hit" setting. + // Note: This setting does not affect the "Invert Hit" setting. // Note: This setting can be overridden for specific players. // -- // 0/"disabled"/"false"/"off"/"no": OFF @@ -21304,7 +20563,7 @@ // Maximum: 3 // -- // 0: OFF - // 1: Display message only when "Nullify Hit" is enabled. + // 1: Display message only when "Invert Hit" is enabled. // 2: Display message only when "Ability Enabled" is enabled. // -- // Keywords: @@ -21341,7 +20600,7 @@ // "maybe" - 50% chance // "often"/"likely"/"frequently" - 66.6% chance // "always" - 100% chance - "Nullify Chance" "33.3" + "Invert Chance" "33.3" // The cooldown for the Mutant Tank's hit ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -21355,7 +20614,7 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Nullify Cooldown" "0" + "Invert Cooldown" "0" // The Mutant Tank's ability effects last this long. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -21369,7 +20628,7 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Nullify Duration" "5.0" + "Invert Duration" "5.0" // Enable the Mutant Tank's claw/rock attack. // Note: This setting does not need the "Ability Enabled" setting to be set to "1". @@ -21377,7 +20636,7 @@ // -- // 0/"disabled"/"false"/"off"/"no": OFF // 1/"enabled"/"true"/"on"/"yes": ON - "Nullify Hit" "0" + "Invert Hit" "0" // The mode of the Mutant Tank's claw/rock attack. // Note: This setting can be overridden for specific players. @@ -21390,7 +20649,7 @@ // "both"/"all" - 0 // "tank"/"attack" - 1 // "survivor"/"hurt" - 2 - "Nullify Hit Mode" "0" + "Invert Hit Mode" "0" // The distance between a survivor and the Mutant Tank needed to trigger the ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -21402,7 +20661,7 @@ // Keywords: // "closest" - 1.0 range // "farthest" - 99999.0 range - "Nullify Range" "150.0" + "Invert Range" "150.0" // The Mutant Tank has this many chances out of 100.0% to trigger the range ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -21417,7 +20676,7 @@ // "maybe" - 50% chance // "often"/"likely"/"frequently" - 66.6% chance // "always" - 100% chance - "Nullify Range Chance" "15.0" + "Invert Range Chance" "15.0" // The cooldown for the Mutant Tank's range ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -21431,11 +20690,11 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Nullify Range Cooldown" "0" + "Invert Range Cooldown" "0" "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" { - // Note: Override any of the settings in the "Nullify Ability" section for each special infected here. + // Note: Override any of the settings in the "Invert Ability" section for each special infected here. // Example "Access Flags" "" @@ -21447,19 +20706,19 @@ "Human Cooldown" "0" "Human Range Cooldown" "0" "Open Areas Only" "0.0" - "Requires Humans" "1" + "Requires Humans" "0" "Ability Enabled" "0" "Ability Effect" "0" "Ability Message" "0" "Ability Sight" "0" - "Nullify Chance" "33.3" - "Nullify Cooldown" "0" - "Nullify Duration" "5.0" - "Nullify Hit" "0" - "Nullify Hit Mode" "0" - "Nullify Range" "150.0" - "Nullify Range Chance" "15.0" - "Nullify Range Cooldown" "0" + "Invert Chance" "33.3" + "Invert Cooldown" "0" + "Invert Duration" "5.0" + "Invert Hit" "0" + "Invert Hit Mode" "0" + "Invert Range" "150.0" + "Invert Range Chance" "15.0" + "Invert Range Cooldown" "0" } } } @@ -21467,7 +20726,7 @@ ```
-##### Omni Ability +##### Jump Ability
Click to expand! @@ -21476,9 +20735,22 @@ { "Tank #1" { - // The Mutant Tank has omni-level access to other nearby Mutant Tanks' abilities. - // Requires "mt_abilities2.smx" to be compiled with "mt_omni.sp" to work. - "Omni Ability" + // The Mutant Tank jumps periodically or sporadically and makes survivors jump uncontrollably. + // "Ability Enabled" - The Mutant Tank jumps periodically or sporadically. + // - "Jump Interval" + // - "Jump Mode" + // - "Jump Sporadic Chance" + // - "Jump Sporadic Height" + // "Ability Enabled" - When a survivor is within range of the Mutant Tank, the survivor jumps uncontrollably. + // - "Jump Range" + // - "Jump Range Chance" + // - "Jump Range Cooldown" + // "Jump Hit" - When a survivor is hit by the Mutant Tank's claw or rock, or a survivor hits the Mutant Tank with a melee weapon, the survivor jumps uncontrollably. + // - "Jump Chance" + // - "Jump Cooldown" + // - "Jump Hit Mode" + // Requires "mt_abilities.smx" to be compiled with "mt_jump.sp" to work. + "Jump Ability" { // Admins with one or more of these access flags have access to this ability. // Note: This setting can be overridden for specific players. @@ -21487,6 +20759,14 @@ // Not empty: These access flags have access. "Access Flags" "" + // Admins with one or more of these immunity flags are immune to this ability's effects. + // Note: If the Mutant Tank has one or more of these immunity flags or has the same immunity flags as the survivor victim, the immunity is cancelled. + // Note: This setting can be overridden for specific players. + // -- + // Empty: No immunity flags are immune. + // Not empty: These immunity flags are immune. + "Immunity Flags" "" + // The ability can only activate in close areas. // Note: Do not change this setting if you are unsure of how it works. // Note: This setting can be overridden for specific players. @@ -21554,12 +20834,27 @@ "Human Duration" "5" // The mode of how human-controlled Mutant Tanks activate their abilities. + // Note: This setting does not apply to the range ability. // Note: This setting can be overridden for specific players. // -- // 0: Press buttons to activate corresponding abilities. Cooldown starts after ability's duration ends. // 1: Hold down buttons to keep corresponding abilities activated. Cooldown starts after the player lets go of the buttons. + // 2: Press buttons to toggle corresponding abilities. Cooldown starts after ability is deactivated. "Human Mode" "1" + // Human-controlled Mutant Tanks must wait this long before using their range ability again. + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0 (OFF) + // Maximum: 99999 (Longest) + // -- + // Keywords: + // "never"/"disabled"/"false"/"off"/"no" - 0 seconds + // "second" - 1 second + // "minute" - 1 minute + // "forever" - 99999 seconds + "Human Range Cooldown" "0" + // The ability can only activate in open areas. // Note: Do not change this setting if you are unsure of how it works. // Note: This setting can be overridden for specific players. @@ -21572,28 +20867,73 @@ // "farthest" - 99999.0 range "Open Areas Only" "0.0" - // The ability is only effective toward human survivors. + // The ability is only effective toward human-controlled survivors. // Note: This setting can be overridden for specific players. // -- // Minimum: 0 // Maximum: 32 // -- // 0: OFF - // 1-32: ON, the number of human survivors required to be present for this ability to be effective. - "Requires Humans" "1" + // 1-32: ON, the number of human-controlled survivors required to be present for this ability to be effective. + "Requires Humans" "0" // Enable this ability. + // Note: This setting does not affect the "Jump Hit" setting. // Note: This setting can be overridden for specific players. // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON + // 0: OFF + // 1: ON, the Mutant Tank can force survivors to jump uncontrollably. + // 2: ON, the Mutant Tank can jump periodically. + // 3: ON, the Mutant Tank can do both. "Ability Enabled" "0" - // Display a message whenever the ability activates/deactivates. + // Show a screen fade effect when the Mutant Tank uses its abilities. + // Note: The colors will randomly change between the colors set in the "Skin Color" and "Glow Color" settings. // Note: This setting can be overridden for specific players. // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON + // Add up numbers together for different results. + // -- + // Minimum: 0 + // Maximum: 7 + // -- + // 0: OFF + // 1: Show effect when the Mutant Tank uses its claw/rock attack. + // 2: Show effect when the Mutant Tank is hit by a melee weapon. + // 4: Show effect when the Mutant Tank uses its range ability. + // -- + // Keywords: + // "none"/"off" - 0 + // "attack" - 1 + // "hurt" - 2 + // "attack,hurt" - 3 + // "range" - 4 + // "attack,range" - 5 + // "hurt,range" - 6 + // "attack,hurt,range" - 7 + "Ability Effect" "0" + + // Display a message whenever the abilities activate/deactivate. + // Note: This setting can be overridden for specific players. + // -- + // Add up numbers together for different results. + // -- + // Minimum: 0 + // Maximum: 7 + // -- + // 0: OFF + // 1: Display message only when "Jump Hit" is enabled. + // 2: Display message only when "Ability Enabled" is set to "1" or "3". + // 4: Display message only when "Ability Enabled" is set to "2" or "3". + // -- + // Keywords: + // "none"/"off" - 0 + // "hit" - 1 + // "ability" - 2 + // "hit,ability" - 3 + // "rock" - 4 + // "hit,rock" - 5 + // "ability,rock" - 6 + // "hit,ability,rock"/"all" - 7 "Ability Message" "0" // Check line-of-sight when the Mutant Tank uses its abilities. @@ -21623,9 +20963,9 @@ // "maybe" - 50% chance // "often"/"likely"/"frequently" - 66.6% chance // "always" - 100% chance - "Omni Chance" "33.3" + "Jump Chance" "33.3" - // The cooldown for the Mutant Tank's ability. + // The cooldown for the Mutant Tank's main/hit ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- @@ -21637,7 +20977,7 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Omni Cooldown" "0" + "Jump Cooldown" "0" // The Mutant Tank's ability effects last this long. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -21650,16 +20990,62 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Omni Duration" "5" + "Jump Duration" "5" - // The mode of the Mutant Tank's omni ability. + // The Mutant Tank and survivors jump this high off a surface. // Note: This setting can be overridden for specific players. // -- - // 0: The Mutant Tank's type becomes the same as the nearby Mutant Tank's type. - // 1: The Mutant Tank physically transforms into the nearby Mutant Tank. - "Omni Mode" "0" + // Minimum: 0.1 + // Maximum: 99999.0 + // -- + // Keywords: + // "shortest" - 0.1 height + // "tallest" - 99999.0 height + "Jump Height" "300.0" - // The distance between another Mutant Tank and the Mutant Tank needed to trigger the ability. + // Enable the Mutant Tank's claw/rock attack. + // Note: This setting does not need the "Ability Enabled" setting to be set to "1". + // Note: This setting can be overridden for specific players. + // -- + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Jump Hit" "0" + + // The mode of the Mutant Tank's claw/rock attack. + // Note: This setting can be overridden for specific players. + // -- + // 0: Both + // 1: Ability activates when the Mutant Tank hits a survivor. + // 2: Ability activates when the Mutant Tank is hit by a survivor. + // -- + // Keywords: + // "both"/"all" - 0 + // "tank"/"attack" - 1 + // "survivor"/"hurt" - 2 + "Jump Hit Mode" "0" + + // The Mutant Tank jumps every time this many seconds passes. + // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0.1 + // Maximum: 99999.0 + // -- + // Keywords: + // "milli"/"millisecond" - 0.1 seconds + // "second" - 1 second + // "minute" - 1 minute + // "forever" - 99999 seconds + "Jump Interval" "1.0" + + // The mode of the Mutant Tank's jumping ability. + // Note: This setting can be overridden for specific players. + // -- + // 0: The Mutant Tank jumps periodically. + // 1: The Mutant Tank jumps sporadically. + "Jump Mode" "0" + + // The distance between a survivor and the Mutant Tank needed to trigger the ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- @@ -21669,14 +21055,71 @@ // Keywords: // "closest" - 1.0 range // "farthest" - 99999.0 range - "Omni Range" "500.0" + "Jump Range" "150.0" + + // The Mutant Tank has this many chances out of 100.0% to trigger the range ability. + // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0.0 (No chance) + // Maximum: 100.0 (Highest chance) + // -- + // Keywords: + // "never" - 0% chance + // "sometimes"/"unlikely"/"seldom" - 33.3% chance + // "maybe" - 50% chance + // "often"/"likely"/"frequently" - 66.6% chance + // "always" - 100% chance + "Jump Range Chance" "15.0" + + // The cooldown for the Mutant Tank's range ability. + // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0 (OFF) + // Maximum: 99999 (Longest) + // -- + // Keywords: + // "never"/"disabled"/"false"/"off"/"no" - 0 seconds + // "second" - 1 second + // "minute" - 1 minute + // "forever" - 99999 seconds + "Jump Range Cooldown" "0" + + // The Mutant Tank has this many chances out of 100.0% to jump sporadically. + // Note: This setting only applies if the "Jump Mode" setting is set to "1". + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0.0 (No chance) + // Maximum: 100.0 (Highest chance) + // -- + // Keywords: + // "never" - 0% chance + // "sometimes"/"unlikely"/"seldom" - 33.3% chance + // "maybe" - 50% chance + // "often"/"likely"/"frequently" - 66.6% chance + // "always" - 100% chance + "Jump Sporadic Chance" "33.3" + + // The Mutant Tank jumps this high up into the air. + // Note: This setting only applies if the "Jump Mode" setting is set to "1". + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0.1 + // Maximum: 99999.0 + // -- + // Keywords: + // "shortest" - 0.1 height + // "tallest" - 99999.0 height + "Jump Sporadic Height" "750.0" "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" { - // Note: Override any of the settings in the "Omni Ability" section for each special infected here. + // Note: Override any of the settings in the "Jump Ability" section for each special infected here. // Example "Access Flags" "" + "Immunity Flags" "" "Close Areas Only" "0.0" "Combo Ability" "0" "Human Ability" "0" @@ -21684,16 +21127,26 @@ "Human Cooldown" "0" "Human Duration" "5" "Human Mode" "1" + "Human Range Cooldown" "0" "Open Areas Only" "0.0" - "Requires Humans" "1" + "Requires Humans" "0" "Ability Enabled" "0" + "Ability Effect" "0" "Ability Message" "0" "Ability Sight" "0" - "Omni Chance" "33.3" - "Omni Cooldown" "0" - "Omni Duration" "5" - "Omni Mode" "0" - "Omni Range" "500.0" + "Jump Chance" "33.3" + "Jump Cooldown" "0" + "Jump Duration" "5" + "Jump Height" "300.0" + "Jump Hit" "0" + "Jump Hit Mode" "0" + "Jump Interval" "1.0" + "Jump Mode" "0" + "Jump Range" "150.0" + "Jump Range Chance" "15.0" + "Jump Range Cooldown" "0" + "Jump Sporadic Chance" "33.3" + "Jump Sporadic Height" "750.0" } } } @@ -21701,7 +21154,7 @@ ```
-##### Panic Ability +##### Lag Ability
Click to expand! @@ -21710,9 +21163,17 @@ { "Tank #1" { - // The Mutant Tank starts panic events. - // Requires "mt_abilities2.smx" to be compiled with "mt_panic.sp" to work. - "Panic Ability" + // The Mutant Tank makes survivors lag. + // "Ability Enabled" - When a survivor is within range of the Mutant Tank, the survivor lags. + // - "Lag Range" + // - "Lag Range Chance" + // - "Lag Range Cooldown" + // "Lag Hit" - When a survivor is hit by the Mutant Tank's claw or rock, or a survivor hits the Mutant Tank with a melee weapon, the survivor lags. + // - "Lag Chance" + // - "Lag Cooldown" + // - "Lag Hit Mode" + // Requires "mt_abilities.smx" to be compiled with "mt_lag.sp" to work. + "Lag Ability" { // Admins with one or more of these access flags have access to this ability. // Note: This setting can be overridden for specific players. @@ -21721,6 +21182,14 @@ // Not empty: These access flags have access. "Access Flags" "" + // Admins with one or more of these immunity flags are immune to this ability's effects. + // Note: If the Mutant Tank has one or more of these immunity flags or has the same immunity flags as the survivor victim, the immunity is cancelled. + // Note: This setting can be overridden for specific players. + // -- + // Empty: No immunity flags are immune. + // Not empty: These immunity flags are immune. + "Immunity Flags" "" + // The ability can only activate in close areas. // Note: Do not change this setting if you are unsure of how it works. // Note: This setting can be overridden for specific players. @@ -21774,25 +21243,18 @@ // "forever" - 99999 seconds "Human Cooldown" "0" - // The Mutant Tank's ability effects last this long. - // Note: This setting does not affect human-controlled Mutant Tanks unless the "Human Mode" setting is set to "0". + // Human-controlled Mutant Tanks must wait this long before using their range ability again. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 - // Maximum: 99999 + // Minimum: 0 (OFF) + // Maximum: 99999 (Longest) // -- // Keywords: + // "never"/"disabled"/"false"/"off"/"no" - 0 seconds // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Human Duration" "5" - - // The mode of how human-controlled Mutant Tanks activate their abilities. - // Note: This setting can be overridden for specific players. - // -- - // 0: Press buttons to activate corresponding abilities. Cooldown starts after ability's duration ends. - // 1: Hold down buttons to keep corresponding abilities activated. Cooldown starts after the player lets go of the buttons. - "Human Mode" "1" + "Human Range Cooldown" "0" // The ability can only activate in open areas. // Note: Do not change this setting if you are unsure of how it works. @@ -21806,30 +21268,82 @@ // "farthest" - 99999.0 range "Open Areas Only" "0.0" - // The ability is only effective toward human survivors. + // The ability is only effective toward human-controlled survivors. // Note: This setting can be overridden for specific players. // -- // Minimum: 0 // Maximum: 32 // -- // 0: OFF - // 1-32: ON, the number of human survivors required to be present for this ability to be effective. - "Requires Humans" "0" + // 1-32: ON, the number of human-controlled survivors required to be present for this ability to be effective. + "Requires Humans" "1" // Enable this ability. + // Note: This setting does not affect the "Lag Hit" setting. // Note: This setting can be overridden for specific players. // -- // 0/"disabled"/"false"/"off"/"no": OFF // 1/"enabled"/"true"/"on"/"yes": ON "Ability Enabled" "0" + // Show a screen fade effect when the Mutant Tank uses its abilities. + // Note: The colors will randomly change between the colors set in the "Skin Color" and "Glow Color" settings. + // Note: This setting can be overridden for specific players. + // -- + // Add up numbers together for different results. + // -- + // Minimum: 0 + // Maximum: 7 + // -- + // 0: OFF + // 1: Show effect when the Mutant Tank uses its claw/rock attack. + // 2: Show effect when the Mutant Tank is hit by a melee weapon. + // 4: Show effect when the Mutant Tank uses its range ability. + // -- + // Keywords: + // "none"/"off" - 0 + // "attack" - 1 + // "hurt" - 2 + // "attack,hurt" - 3 + // "range" - 4 + // "attack,range" - 5 + // "hurt,range" - 6 + // "attack,hurt,range" - 7 + "Ability Effect" "0" + // Display a message whenever the ability activates/deactivates. // Note: This setting can be overridden for specific players. // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON + // Add up numbers together for different results. + // -- + // Minimum: 0 + // Maximum: 3 + // -- + // 0: OFF + // 1: Display message only when "Lag Hit" is enabled. + // 2: Display message only when "Ability Enabled" is enabled. + // -- + // Keywords: + // "none"/"off" - 0 + // "hit" - 1 + // "ability" - 2 + // "both"/"all"/"hit,ability" - 3 "Ability Message" "0" + // Check line-of-sight when the Mutant Tank uses its abilities. + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0 + // Maximum: 5 + // -- + // 0: OFF + // 1: Check if there is a solid object between the Mutant Tank and survivors. + // 2: Option 1 + Check if the Mutant Tank is looking toward the survivors. + // 3: Option 1 + Check if the Mutant Tank is looking away from the survivors. + // 4: Option 1 + Check if the survivors are looking toward the Mutant Tank. + // 5: Option 1 + Check if the survivors are looking away from the Mutant Tank. + "Ability Sight" "0" + // The Mutant Tank has this many chances out of 100.0% to trigger the ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. @@ -21843,9 +21357,9 @@ // "maybe" - 50% chance // "often"/"likely"/"frequently" - 66.6% chance // "always" - 100% chance - "Panic Chance" "33.3" + "Lag Chance" "33.3" - // The cooldown for the Mutant Tank's ability. + // The cooldown for the Mutant Tank's hit ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- @@ -21857,56 +21371,110 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Panic Cooldown" "0" + "Lag Cooldown" "0" // The Mutant Tank's ability effects last this long. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 + // Minimum: 1 // Maximum: 99999 // -- // Keywords: // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Panic Duration" "0" + "Lag Duration" "5" - // The Mutant Tank starts a panic event every time this many seconds passes. + // Enable the Mutant Tank's claw/rock attack. + // Note: This setting does not need the "Ability Enabled" setting to be set to "1". + // Note: This setting can be overridden for specific players. + // -- + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Lag Hit" "0" + + // The mode of the Mutant Tank's claw/rock attack. + // Note: This setting can be overridden for specific players. + // -- + // 0: Both + // 1: Ability activates when the Mutant Tank hits a survivor. + // 2: Ability activates when the Mutant Tank is hit by a survivor. + // -- + // Keywords: + // "both"/"all" - 0 + // "tank"/"attack" - 1 + // "survivor"/"hurt" - 2 + "Lag Hit Mode" "0" + + // The distance between a survivor and the Mutant Tank needed to trigger the ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.1 - // Maximum: 99999.0 + // Minimum: 1.0 (Closest) + // Maximum: 99999.0 (Farthest) // -- // Keywords: - // "milli"/"millisecond" - 0.1 seconds + // "closest" - 1.0 range + // "farthest" - 99999.0 range + "Lag Range" "150.0" + + // The Mutant Tank has this many chances out of 100.0% to trigger the range ability. + // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0.0 (No chance) + // Maximum: 100.0 (Highest chance) + // -- + // Keywords: + // "never" - 0% chance + // "sometimes"/"unlikely"/"seldom" - 33.3% chance + // "maybe" - 50% chance + // "often"/"likely"/"frequently" - 66.6% chance + // "always" - 100% chance + "Lag Range Chance" "15.0" + + // The cooldown for the Mutant Tank's range ability. + // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0 (OFF) + // Maximum: 99999 (Longest) + // -- + // Keywords: + // "never"/"disabled"/"false"/"off"/"no" - 0 seconds // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Panic Interval" "5.0" + "Lag Range Cooldown" "0" "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" { - // Note: Override any of the settings in the "Panic Ability" section for each special infected here. + // Note: Override any of the settings in the "Lag Ability" section for each special infected here. // Example "Access Flags" "" + "Immunity Flags" "" "Close Areas Only" "0.0" "Combo Ability" "0" "Human Ability" "0" "Human Ammo" "5" "Human Cooldown" "0" - "Human Duration" "5" - "Human Mode" "1" + "Human Range Cooldown" "0" "Open Areas Only" "0.0" - "Requires Humans" "0" + "Requires Humans" "1" "Ability Enabled" "0" + "Ability Effect" "0" "Ability Message" "0" - "Panic Chance" "33.3" - "Panic Cooldown" "0" - "Panic Duration" "0" - "Panic Interval" "5.0" + "Ability Sight" "0" + "Lag Chance" "33.3" + "Lag Cooldown" "0" + "Lag Duration" "5" + "Lag Hit" "0" + "Lag Hit Mode" "0" + "Lag Range" "150.0" + "Lag Range Chance" "15.0" + "Lag Range Cooldown" "0" } } } @@ -21914,7 +21482,7 @@ ```
-##### Pimp Ability +##### Laser Ability
Click to expand! @@ -21923,17 +21491,9 @@ { "Tank #1" { - // The Mutant Tank pimp slaps survivors. - // "Ability Enabled" - When a survivor is within range of the Mutant Tank, the survivor is repeatedly pimp slapped. - // - "Pimp Range" - // - "Pimp Range Chance" - // - "Pimp Range Cooldown" - // "Pimp Hit" - When a survivor is hit by the Mutant Tank's claw or rock, or a survivor hits the Mutant Tank with a melee weapon, the survivor is repeatedly pimp slapped. - // - "Pimp Chance" - // - "Pimp Cooldown" - // - "Pimp Hit Mode" - // Requires "mt_abilities2.smx" to be compiled with "mt_pimp.sp" to work. - "Pimp Ability" + // The Mutant Tank shoots lasers. + // Requires "mt_abilities.smx" to be compiled with "mt_laser.sp" to work. + "Laser Ability" { // Admins with one or more of these access flags have access to this ability. // Note: This setting can be overridden for specific players. @@ -22003,18 +21563,26 @@ // "forever" - 99999 seconds "Human Cooldown" "0" - // Human-controlled Mutant Tanks must wait this long before using their range ability again. + // The Mutant Tank's ability effects last this long. + // Note: This setting does not affect human-controlled Mutant Tanks unless the "Human Mode" setting is set to "0". // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 (OFF) - // Maximum: 99999 (Longest) + // Minimum: 0 + // Maximum: 99999 // -- // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Human Range Cooldown" "0" + "Human Duration" "5" + + // The mode of how human-controlled Mutant Tanks activate their abilities. + // Note: This setting can be overridden for specific players. + // -- + // 0: Press buttons to activate corresponding abilities. Cooldown starts after ability's duration ends. + // 1: Hold down buttons to keep corresponding abilities activated. Cooldown starts after the player lets go of the buttons. + // 2: Press buttons to toggle corresponding abilities. Cooldown starts after ability is deactivated. + "Human Mode" "1" // The ability can only activate in open areas. // Note: Do not change this setting if you are unsure of how it works. @@ -22028,66 +21596,28 @@ // "farthest" - 99999.0 range "Open Areas Only" "0.0" - // The ability is only effective toward human survivors. + // The ability is only effective toward human-controlled survivors. // Note: This setting can be overridden for specific players. // -- // Minimum: 0 // Maximum: 32 // -- // 0: OFF - // 1-32: ON, the number of human survivors required to be present for this ability to be effective. + // 1-32: ON, the number of human-controlled survivors required to be present for this ability to be effective. "Requires Humans" "0" // Enable this ability. - // Note: This setting does not affect the "Pimp Hit" setting. - // Note: This setting can be overridden for specific players. - // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Ability Enabled" "0" - - // Show a screen fade effect when the Mutant Tank uses its abilities. - // Note: The colors will randomly change between the colors set in the "Skin Color" and "Glow Color" settings. // Note: This setting can be overridden for specific players. // -- - // Add up numbers together for different results. - // -- - // Minimum: 0 - // Maximum: 7 - // -- - // 0: OFF - // 1: Show effect when the Mutant Tank uses its claw/rock attack. - // 2: Show effect when the Mutant Tank is hit by a melee weapon. - // 4: Show effect when the Mutant Tank uses its range ability. - // -- - // Keywords: - // "none"/"off" - 0 - // "attack" - 1 - // "hurt" - 2 - // "attack,hurt" - 3 - // "range" - 4 - // "attack,range" - 5 - // "hurt,range" - 6 - // "attack,hurt,range" - 7 - "Ability Effect" "0" + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Ability Enabled" "0" // Display a message whenever the ability activates/deactivates. // Note: This setting can be overridden for specific players. // -- - // Add up numbers together for different results. - // -- - // Minimum: 0 - // Maximum: 3 - // -- - // 0: OFF - // 1: Display message only when "Pimp Hit" is enabled. - // 2: Display message only when "Ability Enabled" is enabled. - // -- - // Keywords: - // "none"/"off" - 0 - // "hit" - 1 - // "ability" - 2 - // "both"/"all"/"hit,ability" - 3 + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON "Ability Message" "0" // Check line-of-sight when the Mutant Tank uses its abilities. @@ -22117,9 +21647,9 @@ // "maybe" - 50% chance // "often"/"likely"/"frequently" - 66.6% chance // "always" - 100% chance - "Pimp Chance" "33.3" + "Laser Chance" "33.3" - // The cooldown for the Mutant Tank's hit ability. + // The cooldown for the Mutant Tank's ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- @@ -22131,55 +21661,34 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Pimp Cooldown" "0" + "Laser Cooldown" "0" - // The Mutant Tank's pimp slaps do this much damage. + // The Mutant Tank's lasers do this much damage. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 (OFF) - // Maximum: 99999 + // Minimum: 0.0 (OFF) + // Maximum: 99999.0 // -- // Keywords: // "weakest" - 1.0 damage // "strongest" - 99999.0 damage - "Pimp Damage" "5" + "Laser Damage" "5.0" // The Mutant Tank's ability effects last this long. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- - // Minimum: 1 + // Minimum: 0 // Maximum: 99999 // -- // Keywords: // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Pimp Duration" "5" - - // Enable the Mutant Tank's claw/rock attack. - // Note: This setting does not need the "Ability Enabled" setting to be set to "1". - // Note: This setting can be overridden for specific players. - // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Pimp Hit" "0" - - // The mode of the Mutant Tank's claw/rock attack. - // Note: This setting can be overridden for specific players. - // -- - // 0: Both - // 1: Ability activates when the Mutant Tank hits a survivor. - // 2: Ability activates when the Mutant Tank is hit by a survivor. - // -- - // Keywords: - // "both"/"all" - 0 - // "tank"/"attack" - 1 - // "survivor"/"hurt" - 2 - "Pimp Hit Mode" "0" + "Laser Duration" "5" - // The Mutant Tank pimp slaps survivors every time this many seconds passes. + // The Mutant Tank shoots lasers at survivors every time this many seconds passes. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- @@ -22191,7 +21700,14 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Pimp Interval" "1.0" + "Laser Interval" "1.0" + + // The mode of the Mutant Tank's laser ability. + // Note: This setting can be overridden for specific players. + // -- + // 0: The laser hits a single survivor target. + // 1: The laser hits a survivor target and their nearby teammates. + "Laser Mode" "0" // The distance between a survivor and the Mutant Tank needed to trigger the ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -22203,40 +21719,11 @@ // Keywords: // "closest" - 1.0 range // "farthest" - 99999.0 range - "Pimp Range" "150.0" - - // The Mutant Tank has this many chances out of 100.0% to trigger the range ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0.0 (No chance) - // Maximum: 100.0 (Highest chance) - // -- - // Keywords: - // "never" - 0% chance - // "sometimes"/"unlikely"/"seldom" - 33.3% chance - // "maybe" - 50% chance - // "often"/"likely"/"frequently" - 66.6% chance - // "always" - 100% chance - "Pimp Range Chance" "15.0" - - // The cooldown for the Mutant Tank's range ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0 (OFF) - // Maximum: 99999 (Longest) - // -- - // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Pimp Range Cooldown" "0" + "Laser Range" "500.0" "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" { - // Note: Override any of the settings in the "Pimp Ability" section for each special infected here. + // Note: Override any of the settings in the "Laser Ability" section for each special infected here. // Example "Access Flags" "" @@ -22246,23 +21733,20 @@ "Human Ability" "0" "Human Ammo" "5" "Human Cooldown" "0" - "Human Range Cooldown" "0" + "Human Duration" "5" + "Human Mode" "1" "Open Areas Only" "0.0" "Requires Humans" "0" "Ability Enabled" "0" - "Ability Effect" "0" "Ability Message" "0" "Ability Sight" "0" - "Pimp Chance" "33.3" - "Pimp Cooldown" "0" - "Pimp Damage" "5" - "Pimp Duration" "5" - "Pimp Hit" "0" - "Pimp Hit Mode" "0" - "Pimp Interval" "1.0" - "Pimp Range" "150.0" - "Pimp Range Chance" "15.0" - "Pimp Range Cooldown" "0" + "Laser Chance" "33.3" + "Laser Cooldown" "0" + "Laser Damage" "5.0" + "Laser Duration" "5" + "Laser Interval" "1.0" + "Laser Mode" "0" + "Laser Range" "500.0" } } } @@ -22270,7 +21754,7 @@ ```
-##### Puke Ability +##### Lightning Ability
Click to expand! @@ -22279,20 +21763,10 @@ { "Tank #1" { - // The Mutant Tank pukes on survivors. - // "Ability Enabled" - When a survivor is within range of the Mutant Tank, the Mutant Tank pukes on the survivor. - // - "Puke Range" - // - "Puke Range Chance" - // - "Puke Range Cooldown" - // "Puke Death" - When the Mutant Tank dies or spawns, nearby survivors are puked on. - // - "Puke Death Chance" - // - "Puke Death Range" - // "Puke Hit" - When a survivor is hit by the Mutant Tank's claw or rock, or a survivor hits the Mutant Tank with a melee weapon, the Mutant Tank pukes on the survivor. - // - "Puke Chance" - // - "Puke Cooldown" - // - "Puke Hit Mode" - // Requires "mt_abilities2.smx" to be compiled with "mt_puke.sp" to work. - "Puke Ability" + // The Mutant Tank creates lightning storms. + // Requires "mt_abilities.smx" to be compiled with "mt_lightning.sp" to work. + // Note: Only available in Left 4 Dead 2. + "Lightning Ability" { // Admins with one or more of these access flags have access to this ability. // Note: This setting can be overridden for specific players. @@ -22362,18 +21836,26 @@ // "forever" - 99999 seconds "Human Cooldown" "0" - // Human-controlled Mutant Tanks must wait this long before using their range ability again. + // The Mutant Tank's ability effects last this long. + // Note: This setting does not affect human-controlled Mutant Tanks unless the "Human Mode" setting is set to "0". // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 (OFF) - // Maximum: 99999 (Longest) + // Minimum: 0 + // Maximum: 99999 // -- // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Human Range Cooldown" "0" + "Human Duration" "5" + + // The mode of how human-controlled Mutant Tanks activate their abilities. + // Note: This setting can be overridden for specific players. + // -- + // 0: Press buttons to activate corresponding abilities. Cooldown starts after ability's duration ends. + // 1: Hold down buttons to keep corresponding abilities activated. Cooldown starts after the player lets go of the buttons. + // 2: Press buttons to toggle corresponding abilities. Cooldown starts after ability is deactivated. + "Human Mode" "1" // The ability can only activate in open areas. // Note: Do not change this setting if you are unsure of how it works. @@ -22387,66 +21869,28 @@ // "farthest" - 99999.0 range "Open Areas Only" "0.0" - // The ability is only effective toward human survivors. + // The ability is only effective toward human-controlled survivors. // Note: This setting can be overridden for specific players. // -- // Minimum: 0 // Maximum: 32 // -- // 0: OFF - // 1-32: ON, the number of human survivors required to be present for this ability to be effective. + // 1-32: ON, the number of human-controlled survivors required to be present for this ability to be effective. "Requires Humans" "0" // Enable this ability. - // Note: This setting does not affect the "Puke Hit" setting. // Note: This setting can be overridden for specific players. // -- // 0/"disabled"/"false"/"off"/"no": OFF // 1/"enabled"/"true"/"on"/"yes": ON "Ability Enabled" "0" - // Show a screen fade effect when the Mutant Tank uses its abilities. - // Note: The colors will randomly change between the colors set in the "Skin Color" and "Glow Color" settings. - // Note: This setting can be overridden for specific players. - // -- - // Add up numbers together for different results. - // -- - // Minimum: 0 - // Maximum: 7 - // -- - // 0: OFF - // 1: Show effect when the Mutant Tank uses its claw/rock attack. - // 2: Show effect when the Mutant Tank is hit by a melee weapon. - // 4: Show effect when the Mutant Tank uses its range ability. - // -- - // Keywords: - // "none"/"off" - 0 - // "attack" - 1 - // "hurt" - 2 - // "attack,hurt" - 3 - // "range" - 4 - // "attack,range" - 5 - // "hurt,range" - 6 - // "attack,hurt,range" - 7 - "Ability Effect" "0" - // Display a message whenever the ability activates/deactivates. // Note: This setting can be overridden for specific players. // -- - // Add up numbers together for different results. - // -- - // Minimum: 0 - // Maximum: 3 - // -- - // 0: OFF - // 1: Display message only when "Puke Hit" is enabled. - // 2: Display message only when "Ability Enabled" is enabled. - // -- - // Keywords: - // "none"/"off" - 0 - // "hit" - 1 - // "ability" - 2 - // "both"/"all"/"hit,ability" - 3 + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON "Ability Message" "0" // Check line-of-sight when the Mutant Tank uses its abilities. @@ -22476,9 +21920,9 @@ // "maybe" - 50% chance // "often"/"likely"/"frequently" - 66.6% chance // "always" - 100% chance - "Puke Chance" "33.3" + "Lightning Chance" "33.3" - // The cooldown for the Mutant Tank's hit ability. + // The cooldown for the Mutant Tank's ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- @@ -22490,114 +21934,50 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Puke Cooldown" "0" - - // Enable the Mutant Tank's upon-death range ability. - // Note: This setting does not need the "Ability Enabled" setting to be set to "1". - // Note: This setting can be overridden for specific players. - // -- - // Add up numbers together for different results. - // -- - // Minimum: 0 - // Maximum: 3 - // -- - // 0: OFF - // 1: Trigger the range ability when the Mutant Tank dies. - // 2: Trigger the range ability when the Mutant Tank spawns. - "Puke Death" "1" - - // The Mutant Tank has this many chances out of 100.0% to trigger the upon-death ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0.0 (No chance) - // Maximum: 100.0 (Highest chance) - // -- - // Keywords: - // "never" - 0% chance - // "sometimes"/"unlikely"/"seldom" - 33.3% chance - // "maybe" - 50% chance - // "often"/"likely"/"frequently" - 66.6% chance - // "always" - 100% chance - "Puke Death Chance" "33.3" - - // The distance between a survivor and the Mutant Tank needed to trigger the upon-death ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 1.0 (Closest) - // Maximum: 99999.0 (Farthest) - // -- - // Keywords: - // "closest" - 1.0 range - // "farthest" - 99999.0 range - "Puke Death Range" "200.0" - - // Enable the Mutant Tank's claw/rock attack. - // Note: This setting does not need the "Ability Enabled" setting to be set to "1". - // Note: This setting can be overridden for specific players. - // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Puke Hit" "0" - - // The mode of the Mutant Tank's claw/rock attack. - // Note: This setting can be overridden for specific players. - // -- - // 0: Both - // 1: Ability activates when the Mutant Tank hits a survivor. - // 2: Ability activates when the Mutant Tank is hit by a survivor. - // -- - // Keywords: - // "both"/"all" - 0 - // "tank"/"attack" - 1 - // "survivor"/"hurt" - 2 - "Puke Hit Mode" "0" + "Lightning Cooldown" "0" - // The distance between a survivor and the Mutant Tank needed to trigger the ability. + // The Mutant Tank's lightning storm strikes cause this much damage per hit. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- - // Minimum: 1.0 (Closest) - // Maximum: 99999.0 (Farthest) + // Minimum: 0.0 (OFF) + // Maximum: 99999.0 // -- - // Keywords: - // "closest" - 1.0 range - // "farthest" - 99999.0 range - "Puke Range" "150.0" + // Keywords: + // "weakest" - 1.0 damage + // "strongest" - 99999.0 damage + "Lightning Damage" "5.0" - // The Mutant Tank has this many chances out of 100.0% to trigger the range ability. + // The Mutant Tank's ability effects last this long. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.0 (No chance) - // Maximum: 100.0 (Highest chance) + // Minimum: 0 + // Maximum: 99999 // -- // Keywords: - // "never" - 0% chance - // "sometimes"/"unlikely"/"seldom" - 33.3% chance - // "maybe" - 50% chance - // "often"/"likely"/"frequently" - 66.6% chance - // "always" - 100% chance - "Puke Range Chance" "15.0" + // "second" - 1 second + // "minute" - 1 minute + // "forever" - 99999 seconds + "Lightning Duration" "5" - // The cooldown for the Mutant Tank's range ability. + // The Mutant Tank's lightning storm strikes every time this many seconds passes. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 (OFF) - // Maximum: 99999 (Longest) + // Minimum: 0.1 + // Maximum: 99999.0 // -- // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds + // "milli"/"millisecond" - 0.1 seconds // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Puke Range Cooldown" "0" + "Lightning Interval" "1.0" "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" { - // Note: Override any of the settings in the "Puke Ability" section for each special infected here. + // Note: Override any of the settings in the "Lightning Ability" section for each special infected here. // Example "Access Flags" "" @@ -22607,23 +21987,18 @@ "Human Ability" "0" "Human Ammo" "5" "Human Cooldown" "0" - "Human Range Cooldown" "0" + "Human Duration" "5" + "Human Mode" "1" "Open Areas Only" "0.0" "Requires Humans" "0" "Ability Enabled" "0" - "Ability Effect" "0" "Ability Message" "0" "Ability Sight" "0" - "Puke Chance" "33.3" - "Puke Cooldown" "0" - "Puke Death" "1" - "Puke Death Chance" "33.3" - "Puke Death Range" "200.0" - "Puke Hit" "0" - "Puke Hit Mode" "0" - "Puke Range" "150.0" - "Puke Range Chance" "15.0" - "Puke Range Cooldown" "0" + "Lightning Chance" "33.3" + "Lightning Cooldown" "0" + "Lightning Damage" "5.0" + "Lightning Duration" "5" + "Lightning Interval" "1.0" } } } @@ -22631,7 +22006,9 @@ ```
-##### Pyro Ability +#### Abilities Set #2 (M-Z) + +##### Medic Ability
Click to expand! @@ -22640,9 +22017,9 @@ { "Tank #1" { - // The Mutant Tank ignites itself and gains a speed boost when on fire. - // Requires "mt_abilities2.smx" to be compiled with "mt_pyro.sp" to work. - "Pyro Ability" + // The Mutant Tank heals nearby special infected and only takes damage in certain parts of its body. + // Requires "mt_abilities2.smx" to be compiled with "mt_medic.sp" to work. + "Medic Ability" { // Admins with one or more of these access flags have access to this ability. // Note: This setting can be overridden for specific players. @@ -22651,6 +22028,14 @@ // Not empty: These access flags have access. "Access Flags" "" + // Admins with one or more of these immunity flags are immune to this ability's effects. + // Note: If the Mutant Tank has one or more of these immunity flags or has the same immunity flags as the survivor victim, the immunity is cancelled. + // Note: This setting can be overridden for specific players. + // -- + // Empty: No immunity flags are immune. + // Not empty: These immunity flags are immune. + "Immunity Flags" "" + // The ability can only activate in close areas. // Note: Do not change this setting if you are unsure of how it works. // Note: This setting can be overridden for specific players. @@ -22722,8 +22107,22 @@ // -- // 0: Press buttons to activate corresponding abilities. Cooldown starts after ability's duration ends. // 1: Hold down buttons to keep corresponding abilities activated. Cooldown starts after the player lets go of the buttons. + // 2: Press buttons to toggle corresponding abilities. Cooldown starts after ability is deactivated. "Human Mode" "1" + // Human-controlled Mutant Tanks must wait this long before using their rock ability again. + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0 (OFF) + // Maximum: 99999 (Longest) + // -- + // Keywords: + // "never"/"disabled"/"false"/"off"/"no" - 0 seconds + // "second" - 1 second + // "minute" - 1 minute + // "forever" - 99999 seconds + "Human Rock Cooldown" "0" + // The ability can only activate in open areas. // Note: Do not change this setting if you are unsure of how it works. // Note: This setting can be overridden for specific players. @@ -22736,14 +22135,14 @@ // "farthest" - 99999.0 range "Open Areas Only" "0.0" - // The ability is only effective toward human survivors. + // The ability is only effective toward human-controlled survivors. // Note: This setting can be overridden for specific players. // -- // Minimum: 0 // Maximum: 32 // -- // 0: OFF - // 1-32: ON, the number of human survivors required to be present for this ability to be effective. + // 1-32: ON, the number of human-controlled survivors required to be present for this ability to be effective. "Requires Humans" "0" // Enable this ability. @@ -22760,6 +22159,41 @@ // 1/"enabled"/"true"/"on"/"yes": ON "Ability Message" "0" + // Check line-of-sight when the Mutant Tank uses its abilities. + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0 + // Maximum: 5 + // -- + // 0: OFF + // 1: Check if there is a solid object between the Mutant Tank and survivors. + // 2: Option 1 + Check if the Mutant Tank is looking toward the survivors. + // 3: Option 1 + Check if the Mutant Tank is looking away from the survivors. + // 4: Option 1 + Check if the survivors are looking toward the Mutant Tank. + // 5: Option 1 + Check if the survivors are looking away from the Mutant Tank. + "Ability Sight" "0" + + // The damage buff multiplier given to nearby special infected. + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0.0 (OFF) + // Maximum: 99999.0 (Strongest) + "Medic Buff Damage" "1.25" + + // The resistance buff multiplier given to nearby special infected. + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0.0 (OFF) + // Maximum: 1.0 (None) + "Medic Buff Resistance" "0.75" + + // The speed buff multiplier given to nearby special infected. + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0.0 (OFF) + // Maximum: 10.0 (Fastest) + "Medic Buff Speed" "1.25" + // The Mutant Tank has this many chances out of 100.0% to trigger the ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. @@ -22773,7 +22207,7 @@ // "maybe" - 50% chance // "often"/"likely"/"frequently" - 66.6% chance // "always" - 100% chance - "Pyro Chance" "33.3" + "Medic Chance" "33.3" // The cooldown for the Mutant Tank's ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -22787,70 +22221,177 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Pyro Cooldown" "0" + "Medic Cooldown" "0" - // The Mutant Tank's damage boost value when on fire. + // The damage received by the Mutant Tank is multiplied by this value. + // Note: Damage = Damage x Hit damage multiplier + // Example: Damage = 30.0 x 1.5 = 45.0 + // Note: Use the value "1.0" to disable this setting. (Damage x 1.0 = Damage) + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 1.0 + // Maximum: 99999.0 + "Medic Damage Multiplier" "1.5" + + // The Mutant Tank's ability effects last this long. + // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0 + // Maximum: 99999 + // -- + // Keywords: + // "second" - 1 second + // "minute" - 1 minute + // "forever" - 99999 seconds + "Medic Duration" "0" + + // The Mutant Tank creates a healing field visual effect around it when healing fellow special infected. + // Note: This setting can be overridden for specific players. + // -- + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Medic Field" "1" + + // These are the RGB values of the Mutant Tank's healing field's color. + // Note: Any value less than "0" will output a random color. + // Note: This setting can be overridden for specific players. + // -- + // 1st number = Red + // 2nd number = Green + // 3rd number = Blue + "Medic Field Color" "0,255,0" + + // The Mutant Tank gives special infected this much health each time. + // Note: This setting can be overridden for specific players. + // -- + // Minimum: -1000000 + // Maximum: 1000000 + // -- + // Positive numbers: Current health + Medic health + // Negative numbers: Current health - Medic health + // -- + // 1st number = Health given to Smokers. + // 2nd number = Health given to Boomers. + // 3rd number = Health given to Hunters. + // 4th number = Health given to Spitters. + // 5th number = Health given to Jockeys. + // 6th number = Health given to Chargers. + // 7th number = Health given to Tanks. + "Medic Health" "25,25,25,25,25,25,25" + + // The only part of the Mutant Tank that can be damaged. + // Note: This does not need "Ability Enabled" to be set to "1". + // Note: This setting can be overridden for specific players. + // -- + // Add up numbers together for different results. + // -- + // Minimum: 0 + // Maximum: 127 + // -- + // 0: OFF + // 1: Headshots only. + // 2: Chest shots only. + // 4: Stomach shots only. + // 8: Left arm shots only. + // 16: Right arm shots only. + // 32: Left leg shots only. + // 64: Right leg shots only. + "Medic Hit Group" "0" + + // The Mutant Tank heals nearby special infected every time this many seconds passes. + // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- // Minimum: 0.1 // Maximum: 99999.0 - "Pyro Damage Boost" "5.0" + // -- + // Keywords: + // "milli"/"millisecond" - 0.1 seconds + // "second" - 1 second + // "minute" - 1 minute + // "forever" - 99999 seconds + "Medic Interval" "5.0" + + // The special infected's max health. + // Note: The Mutant Tank will not heal special infected if they already have this much health. + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 1 + // Maximum: 1000000 + // -- + // 1st number = Smoker's maximum health. + // 2nd number = Boomer's maximum health. + // 3rd number = Hunter's maximum health. + // 4th number = Spitter's maximum health. + // 5th number = Jockey's maximum health. + // 6th number = Charger's maximum health. + // 7th number = Tank's maximum health. + "Medic Max Health" "250,50,250,100,325,600,8000" + + // The distance between a survivor and the Mutant Tank needed to trigger the ability. + // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 1.0 (Closest) + // Maximum: 99999.0 (Farthest) + // -- + // Keywords: + // "closest" - 1.0 range + // "farthest" - 99999.0 range + "Medic Range" "500.0" + + // The Mutant Tank's rock heals nearby special infected. + // Note: This does not need "Ability Enabled" to be set to "1". + // Note: This setting can be overridden for specific players. + // -- + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Medic Rock Break" "0" + + // The Mutant Tank's rock has this many chances out of 100.0% to trigger the rock break ability. + // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0.0 (No chance) + // Maximum: 100.0 (Highest chance) + // -- + // Keywords: + // "never" - 0% chance + // "sometimes"/"unlikely"/"seldom" - 33.3% chance + // "maybe" - 50% chance + // "often"/"likely"/"frequently" - 66.6% chance + // "always" - 100% chance + "Medic Rock Chance" "33.3" - // The Mutant Tank's ability effects last this long. + // The cooldown for the Mutant Tank's rock ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 - // Maximum: 99999 + // Minimum: 0 (OFF) + // Maximum: 99999 (Longest) // -- // Keywords: + // "never"/"disabled"/"false"/"off"/"no" - 0 seconds // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Pyro Duration" "5" - - // The fire damage received by the Mutant Tank is divided by this value. - // Note: Damage = Fire damage/Pyro fire divisor - // Example: Damage = 300.0/200.0 (1.5) - // Note: Use the value "1.0" to disable this setting. (Fire damage/1.0 = Fire damage) - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 1.0 - // Maximum: 99999.0 - "Pyro Fire Divisor" "1.0" - - // The mode of the Mutant Tank's damage and speed boosts. - // Note: This setting can be overridden for specific players. - // -- - // 0: - // Mutant Tank's damage = Claw/rock damage + Pyro damage boost - // Mutant Tank's speed = Run speed + Pyro speed boost - // 1: - // Mutant Tank's damage = Pyro damage boost - // Mutant Tank's speed = Pyro speed boost - "Pyro Mode" "0" + "Medic Rock Cooldown" "0" - // The Mutant Tank will be reignited if it is extinguished while the ability is still activated. - // Note: This setting will automatically deactivate the ability if set to "0". + // The Mutant Tank heals itself when healing nearby special infected. // Note: This setting can be overridden for specific players. // -- // 0/"disabled"/"false"/"off"/"no": OFF // 1/"enabled"/"true"/"on"/"yes": ON - "Pyro Reignite" "1" - - // The Mutant Tank's speed boost value when on fire. - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0.1 - // Maximum: 3.0 - "Pyro Speed Boost" "1.0" + "Medic Symbiosis" "1" "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" { - // Note: Override any of the settings in the "Pyro Ability" section for each special infected here. + // Note: Override any of the settings in the "Medic Ability" section for each special infected here. // Example "Access Flags" "" + "Immunity Flags" "" "Close Areas Only" "0.0" "Combo Ability" "0" "Human Ability" "0" @@ -22858,18 +22399,30 @@ "Human Cooldown" "0" "Human Duration" "5" "Human Mode" "1" + "Human Pin Cooldown" "0" "Open Areas Only" "0.0" "Requires Humans" "0" "Ability Enabled" "0" "Ability Message" "0" - "Pyro Chance" "33.3" - "Pyro Cooldown" "0" - "Pyro Damage Boost" "5.0" - "Pyro Duration" "5" - "Pyro Fire Divisor" "1.0" - "Pyro Mode" "0" - "Pyro Reignite" "1" - "Pyro Speed Boost" "1.0" + "Ability Sight" "0" + "Medic Buff Damage" "1.25" + "Medic Buff Resistance" "0.75" + "Medic Buff Speed" "1.25" + "Medic Chance" "33.3" + "Medic Cooldown" "0" + "Medic Damage Multiplier" "1.5" + "Medic Duration" "0" + "Medic Field" "1" + "Medic Field Color" "0,255,0" + "Medic Health" "25,25,25,25,25,25,25" + "Medic Hit Group" "0" + "Medic Interval" "5.0" + "Medic Max Health" "250,50,250,100,325,600,8000" + "Medic Pin" "0" + "Medic Pin Chance" "33.3" + "Medic Pin Cooldown" "0" + "Medic Range" "500.0" + "Medic Symbiosis" "1" } } } @@ -22877,7 +22430,7 @@ ```
-##### Quiet Ability +##### Meteor Ability
Click to expand! @@ -22886,17 +22439,9 @@ { "Tank #1" { - // The Mutant Tank silences itself around survivors. - // "Ability Enabled" - When a survivor is within range of the Mutant Tank, the survivor cannot hear the Mutant Tank's sounds. - // - "Quiet Range" - // - "Quiet Range Chance" - // - "Quiet Range Cooldown" - // "Quiet Hit" - When a survivor is hit by the Mutant Tank's claw or rock, or a survivor hits the Mutant Tank with a melee weapon, the survivor cannot hear the Mutant Tank's sounds. - // - "Quiet Chance" - // - "Quiet Cooldown" - // - "Quiet Hit Mode" - // Requires "mt_abilities2.smx" to be compiled with "mt_quiet.sp" to work. - "Quiet Ability" + // The Mutant Tank creates meteor showers. + // Requires "mt_abilities2.smx" to be compiled with "mt_meteor.sp" to work. + "Meteor Ability" { // Admins with one or more of these access flags have access to this ability. // Note: This setting can be overridden for specific players. @@ -22966,18 +22511,26 @@ // "forever" - 99999 seconds "Human Cooldown" "0" - // Human-controlled Mutant Tanks must wait this long before using their range ability again. + // The Mutant Tank's ability effects last this long. + // Note: This setting does not affect human-controlled Mutant Tanks unless the "Human Mode" setting is set to "0". // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 (OFF) - // Maximum: 99999 (Longest) + // Minimum: 0 + // Maximum: 99999 // -- // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Human Range Cooldown" "0" + "Human Duration" "5" + + // The mode of how human-controlled Mutant Tanks activate their abilities. + // Note: This setting can be overridden for specific players. + // -- + // 0: Press buttons to activate corresponding abilities. Cooldown starts after ability's duration ends. + // 1: Hold down buttons to keep corresponding abilities activated. Cooldown starts after the player lets go of the buttons. + // 2: Press buttons to toggle corresponding abilities. Cooldown starts after ability is deactivated. + "Human Mode" "1" // The ability can only activate in open areas. // Note: Do not change this setting if you are unsure of how it works. @@ -22991,179 +22544,31 @@ // "farthest" - 99999.0 range "Open Areas Only" "0.0" - // The ability is only effective toward human survivors. + // The ability is only effective toward human-controlled survivors. // Note: This setting can be overridden for specific players. // -- // Minimum: 0 // Maximum: 32 // -- // 0: OFF - // 1-32: ON, the number of human survivors required to be present for this ability to be effective. - "Requires Humans" "1" + // 1-32: ON, the number of human-controlled survivors required to be present for this ability to be effective. + "Requires Humans" "0" // Enable this ability. - // Note: This setting does not affect the "Quiet Hit" setting. // Note: This setting can be overridden for specific players. // -- // 0/"disabled"/"false"/"off"/"no": OFF // 1/"enabled"/"true"/"on"/"yes": ON "Ability Enabled" "0" - // Show a screen fade effect when the Mutant Tank uses its abilities. - // Note: The colors will randomly change between the colors set in the "Skin Color" and "Glow Color" settings. - // Note: This setting can be overridden for specific players. - // -- - // Add up numbers together for different results. - // -- - // Minimum: 0 - // Maximum: 7 - // -- - // 0: OFF - // 1: Show effect when the Mutant Tank uses its claw/rock attack. - // 2: Show effect when the Mutant Tank is hit by a melee weapon. - // 4: Show effect when the Mutant Tank uses its range ability. - // -- - // Keywords: - // "none"/"off" - 0 - // "attack" - 1 - // "hurt" - 2 - // "attack,hurt" - 3 - // "range" - 4 - // "attack,range" - 5 - // "hurt,range" - 6 - // "attack,hurt,range" - 7 - "Ability Effect" "0" - // Display a message whenever the ability activates/deactivates. // Note: This setting can be overridden for specific players. // -- - // Add up numbers together for different results. - // -- - // Minimum: 0 - // Maximum: 3 - // -- - // 0: OFF - // 1: Display message only when "Quiet Hit" is enabled. - // 2: Display message only when "Ability Enabled" is enabled. - // -- - // Keywords: - // "none"/"off" - 0 - // "hit" - 1 - // "ability" - 2 - // "both"/"all"/"hit,ability" - 3 - "Ability Message" "0" - - // Check line-of-sight when the Mutant Tank uses its abilities. - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0 - // Maximum: 5 - // -- - // 0: OFF - // 1: Check if there is a solid object between the Mutant Tank and survivors. - // 2: Option 1 + Check if the Mutant Tank is looking toward the survivors. - // 3: Option 1 + Check if the Mutant Tank is looking away from the survivors. - // 4: Option 1 + Check if the survivors are looking toward the Mutant Tank. - // 5: Option 1 + Check if the survivors are looking away from the Mutant Tank. - "Ability Sight" "0" - - // The Mutant Tank has this many chances out of 100.0% to trigger the ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0.0 (No chance) - // Maximum: 100.0 (Highest chance) - // -- - // Keywords: - // "never" - 0% chance - // "sometimes"/"unlikely"/"seldom" - 33.3% chance - // "maybe" - 50% chance - // "often"/"likely"/"frequently" - 66.6% chance - // "always" - 100% chance - "Quiet Chance" "33.3" - - // The cooldown for the Mutant Tank's hit ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0 (OFF) - // Maximum: 99999 (Longest) - // -- - // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Quiet Cooldown" "0" - - // The Mutant Tank's ability effects last this long. - // Note: This is ignored when the "Combo Ability" setting is set to "1". - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0.1 - // Maximum: 99999.0 - // -- - // Keywords: - // "milli"/"millisecond" - 0.1 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Quiet Duration" "5.0" - - // The filter for the Mutant Tank's quiet effect. - // Note: This setting can be overridden for specific players. - // -- - // Add up numbers together for different results. - // -- - // Minimum: 0 - // Maximum: 511 - // -- - // 0 OR 511: All filters. - // 1: Common infected - // 2: Smoker - // 4: Boomer - // 8: Hunter - // 16: Spitter (Only available in Left 4 Dead 2.) - // 32: Jockey (Only available in Left 4 Dead 2.) - // 64: Charger (Only available in Left 4 Dead 2.) - // 128: Witch - // 256: Tank - "Quiet Filter" "0" - - // Enable the Mutant Tank's claw/rock attack. - // Note: This setting does not need the "Ability Enabled" setting to be set to "1". - // Note: This setting can be overridden for specific players. - // -- // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Quiet Hit" "0" - - // The mode of the Mutant Tank's claw/rock attack. - // Note: This setting can be overridden for specific players. - // -- - // 0: Both - // 1: Ability activates when the Mutant Tank hits a survivor. - // 2: Ability activates when the Mutant Tank is hit by a survivor. - // -- - // Keywords: - // "both"/"all" - 0 - // "tank"/"attack" - 1 - // "survivor"/"hurt" - 2 - "Quiet Hit Mode" "0" - - // The distance between a survivor and the Mutant Tank needed to trigger the ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 1.0 (Closest) - // Maximum: 99999.0 (Farthest) - // -- - // Keywords: - // "closest" - 1.0 range - // "farthest" - 99999.0 range - "Quiet Range" "150.0" + // 1/"enabled"/"true"/"on"/"yes": ON + "Ability Message" "0" - // The Mutant Tank has this many chances out of 100.0% to trigger the range ability. + // The Mutant Tank has this many chances out of 100.0% to trigger the ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- @@ -23176,9 +22581,9 @@ // "maybe" - 50% chance // "often"/"likely"/"frequently" - 66.6% chance // "always" - 100% chance - "Quiet Range Chance" "15.0" + "Meteor Chance" "33.3" - // The cooldown for the Mutant Tank's range ability. + // The cooldown for the Mutant Tank's ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- @@ -23190,11 +22595,79 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Quiet Range Cooldown" "0" + "Meteor Cooldown" "0" + + // The Mutant Tank's meteorites do this much damage. + // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Note: This setting only applies if the "Meteor Mode" setting is set to "1". + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0.0 (OFF) + // Maximum: 99999.0 + // -- + // Keywords: + // "weakest" - 1.0 damage + // "strongest" - 99999.0 damage + "Meteor Damage" "5.0" + + // The Mutant Tank's ability effects last this long. + // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0 + // Maximum: 99999 + // -- + // Keywords: + // "second" - 1 second + // "minute" - 1 minute + // "forever" - 99999 seconds + "Meteor Duration" "5" + + // The Mutant Tank's meteor shower drops a meteorite every time this many seconds passes. + // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0.1 + // Maximum: 1.0 + "Meteor Interval" "0.6" + + // Meteorites dropped by the Mutant Tank's meteor shower will disappear after this many seconds. + // Note: The timer starts when the meteorite spawns, so take into account the time it takes to fall to the ground. + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0.1 + // Maximum: 99999.0 + // -- + // Keywords: + // "milli"/"millisecond" - 0.1 seconds + // "second" - 1 second + // "minute" - 1 minute + // "forever" - 99999 seconds + "Meteor Lifetime" "15.0" + + // The mode of the Mutant Tank's meteor shower ability. + // Note: This setting can be overridden for specific players. + // -- + // 0: The Mutant Tank's meteorites will explode and start fires. + // 1: The Mutant Tank's meteorites will explode and damage and push back nearby survivors. + "Meteor Mode" "0" + + // The radius of the Mutant Tank's meteor shower. + // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Note: This setting can be overridden for specific players. + // -- + // 1st number = Minimum radius + // Minimum: -200.0 + // Maximum: 0.0 + // -- + // 2nd number = Maximum radius + // Minimum: 0.0 + // Maximum: 200.0 + "Meteor Radius" "-180.0,180.0" "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" { - // Note: Override any of the settings in the "Quiet Ability" section for each special infected here. + // Note: Override any of the settings in the "Meteor Ability" section for each special infected here. // Example "Access Flags" "" @@ -23204,22 +22677,20 @@ "Human Ability" "0" "Human Ammo" "5" "Human Cooldown" "0" - "Human Range Cooldown" "0" + "Human Duration" "5" + "Human Mode" "1" "Open Areas Only" "0.0" - "Requires Humans" "1" + "Requires Humans" "0" "Ability Enabled" "0" - "Ability Effect" "0" "Ability Message" "0" - "Ability Sight" "0" - "Quiet Chance" "33.3" - "Quiet Cooldown" "0" - "Quiet Duration" "5.0" - "Quiet Filter" "0" - "Quiet Hit" "0" - "Quiet Hit Mode" "0" - "Quiet Range" "150.0" - "Quiet Range Chance" "15.0" - "Quiet Range Cooldown" "0" + "Meteor Chance" "33.3" + "Meteor Cooldown" "0" + "Meteor Damage" "5.0" + "Meteor Duration" "5" + "Meteor Interval" "0.6" + "Meteor Lifetime" "15.0" + "Meteor Mode" "0" + "Meteor Radius" "-180.0,180.0" } } } @@ -23227,7 +22698,7 @@ ```
-##### Recall Ability +##### Minion Ability
Click to expand! @@ -23236,21 +22707,9 @@ { "Tank #1" { - // The Mutant Tank time travels to annoy survivors. - // "Ability Enabled" - When the Mutant Tank is below certain health, it recalls to the past. - // - "Recall Rewind Chance" - // - "Recall Rewind Cleanse" - // - "Recall Rewind Cooldown" - // - "Recall Rewind Lifetime" - // - "Recall Rewind Mode" - // - "Recall Rewind Threshold" - // "Ability Enabled" - When the Mutant Tank spawns, it randomly blinks a certain distance in different directions. - // - "Recall Blink Chance" - // - "Recall Blink Cooldown" - // - "Recall Blink Count" - // - "Recall Blink Range" - // Requires "mt_abilities2.smx" to be compiled with "mt_recall.sp" to work. - "Recall Ability" + // The Mutant Tank spawns minions. + // Requires "mt_abilities2.smx" to be compiled with "mt_minion.sp" to work. + "Minion Ability" { // Admins with one or more of these access flags have access to this ability. // Note: This setting can be overridden for specific players. @@ -23271,6 +22730,15 @@ // "farthest" - 99999.0 range "Close Areas Only" "0.0" + // Use this ability in conjunction with other abilities. + // Note: Only use this when "Spawn Type" is set to "4" for the Mutant Tank. + // Note: This setting does not affect human-controlled Mutant Tanks unless the "Human Ability" setting is set to "2". + // Note: This setting can be overridden for specific players. + // -- + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Combo Ability" "0" + // Allow human-controlled Mutant Tanks to use this ability. // Note: This setting can be overridden for specific players. // -- @@ -23303,19 +22771,6 @@ // "forever" - 99999 seconds "Human Cooldown" "0" - // Human-controlled Mutant Tanks must wait this long before using their range ability again. - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0 (OFF) - // Maximum: 99999 (Longest) - // -- - // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Human Range Cooldown" "0" - // The ability can only activate in open areas. // Note: Do not change this setting if you are unsure of how it works. // Note: This setting can be overridden for specific players. @@ -23328,39 +22783,39 @@ // "farthest" - 99999.0 range "Open Areas Only" "0.0" - // The ability is only effective toward human survivors. + // The ability is only effective toward human-controlled survivors. // Note: This setting can be overridden for specific players. // -- // Minimum: 0 // Maximum: 32 // -- // 0: OFF - // 1-32: ON, the number of human survivors required to be present for this ability to be effective. + // 1-32: ON, the number of human-controlled survivors required to be present for this ability to be effective. "Requires Humans" "0" // Enable this ability. // Note: This setting can be overridden for specific players. // -- - // 0: OFF - // 1: ON, the Mutant Tank can recall to the past. - // 2: ON, the Mutant Tank can blink in any direction. - // 3: ON, the Mutant Tank can do both. + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON "Ability Enabled" "0" - // Display a message whenever the abilities activate/deactivate. + // Display a message whenever the ability activates/deactivates. // Note: This setting can be overridden for specific players. // -- - // Add up numbers together for different results. - // -- - // Minimum: 0 - // Maximum: 3 - // -- - // 0: OFF - // 1: Display message only when "Ability Enabled" is set to "1" or "3". - // 2: Display message only when "Ability Enabled" is set to "2" or "3". + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON "Ability Message" "0" - // The Mutant Tank has this many chances out of 100.0% to trigger the blink ability. + // The amount of minions the Mutant Tank can spawn. + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 1 + // Maximum: 15 + "Minion Amount" "5" + + // The Mutant Tank has this many chances out of 100.0% to trigger the ability. + // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- // Minimum: 0.0 (No chance) @@ -23372,9 +22827,10 @@ // "maybe" - 50% chance // "often"/"likely"/"frequently" - 66.6% chance // "always" - 100% chance - "Recall Blink Chance" "50.0" + "Minion Chance" "33.3" - // The cooldown for the Mutant Tank's blink ability. + // The cooldown for the Mutant Tank's ability. + // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- // Minimum: 0 (OFF) @@ -23385,108 +22841,102 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Recall Blink Cooldown" "0" - - // The Mutant Tank can blink this many times before a cooldown is triggered. - // Note: This setting is ignored when the "Recall Blink Cooldown" setting is set to "0". - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0 (OFF) - // Maximum: 99999 (Highest) - "Recall Blink Count" "5" - - // The distance of the Mutant Tank's blink ability. - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 1.0 (Closest) - // Maximum: 99999.0 (Farthest) - // -- - // Keywords: - // "closest" - 1.0 range - // "farthest" - 99999.0 range - "Recall Blink Range" "150.0" + "Minion Cooldown" "0" - // The Mutant Tank has this many chances out of 100.0% to trigger the rewind ability. + // The filter for the Mutant Tank's minions. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.0 (No chance) - // Maximum: 100.0 (Highest chance) + // Add up numbers together for different results. // -- - // Keywords: - // "never" - 0% chance - // "sometimes"/"unlikely"/"seldom" - 33.3% chance - // "maybe" - 50% chance - // "often"/"likely"/"frequently" - 66.6% chance - // "always" - 100% chance - "Recall Rewind Chance" "100.0" - - // The Mutant Tank will be cleansed from bile bombs and fires when using its rewind ability. - // Note: This setting can be overridden for specific players. + // Minimum: 0 + // Maximum: 63 // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Recall Rewind Cleanse" "1" + // 0 OR 63: Pick randomly between the 6 types. + // 1: Smoker + // 2: Boomer + // 4: Hunter + // 8: Spitter (Switches to Boomer in Left 4 Dead 1.) + // 16: Jockey (Switches to Hunter in Left 4 Dead 1.) + // 32: Charger (Switches to Smoker in Left 4 Dead 1.) + "Minion Filter" "0" - // The cooldown for the Mutant Tank's rewind ability. + // Minions spawned by the Mutant Tank die after this many seconds. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 (OFF) - // Maximum: 99999 (Longest) + // Minimum: 0.0 (Until death) + // Maximum: 99999.0 (Longest) // -- // Keywords: // "never"/"disabled"/"false"/"off"/"no" - 0 seconds + // "milli"/"millisecond" - 0.1 seconds // "second" - 1 second // "minute" - 1 minute - // "forever" - 99999 seconds - "Recall Rewind Cooldown" "5" + // "forever"/"death" - 99999 seconds + "Minion Lifetime" "0.0" - // This is how far in seconds that the Mutant Tank's rewind ability can go back to. + // Remove all minions spawned by the Mutant Tank when it dies or changes its Mutant Tank type. // Note: This setting can be overridden for specific players. // -- - // Minimum: 1 - // Maximum: 30 - "Recall Rewind Lifetime" "30" + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Minion Remove" "1" - // The mode of the Mutant Tank's rewind ability. + // The Mutant Tank's minions are replaced with new ones when they die. // Note: This setting can be overridden for specific players. // -- - // 0: Both - // 1: Rewind health only. - // 2: Rewind location only. - "Recall Rewind Mode" "0" + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Minion Replace" "1" - // The percentage threshold that the Mutant Tank's health needs to be under to trigger the rewind ability. + // The type of the Mutant Tank's minion. + // Note: Chosen types that also have the Clone ability will be replaced with the Mutant Tank's own type to prevent bugs. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.0 (OFF) - // Maximum: 1.0 (Full) - "Recall Rewind Threshold" "0.5" + // Separate values with "-". + // -- + // Value limit: 2 + // Character limit for each value: 4 + // -- + // Minimum number for each value: 0 (OFF) + // Maximum number for each value: 500 + // -- + // 1st number = Minimum value + // 2nd number = Maximum value + // -- + // Example: "0-0" (Do not choose from any Mutant Tank types.) + // Example: "1-25" (Choose a Mutant Tank type between 1 through 25.) + // Example: "50-0" (Automatically change to "0-0" because "50" is higher than "0".) + // Example: "1-1000" (Automatically change to "1-500" because "500" is the maximum number of Mutant Tank types allowed.) + // Example: "0" (Automatically change to "0-500" because the maximum range is not specified.) + // Example: "1000" (Automatically change to "500-500" because the maximum range is not specified and the minimum range exceeds the "500" limit.) + // -- + // 0: OFF, use the randomization feature. + // 1-500: ON, the type of the minion. + "Minion Type" "0-0" "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" { - // Note: Override any of the settings in the "Recall Ability" section for each special infected here. + // Note: Override any of the settings in the "Minion Ability" section for each special infected here. // Example "Access Flags" "" "Close Areas Only" "0.0" + "Combo Ability" "0" "Human Ability" "0" "Human Ammo" "5" "Human Cooldown" "0" - "Human Range Cooldown" "0" "Open Areas Only" "0.0" "Requires Humans" "0" "Ability Enabled" "0" "Ability Message" "0" - "Recall Blink Chance" "50.0" - "Recall Blink Cooldown" "0" - "Recall Blink Count" "5" - "Recall Blink Range" "150.0" - "Recall Rewind Chance" "100.0" - "Recall Rewind Cleanse" "1" - "Recall Rewind Cooldown" "5" - "Recall Rewind Lifetime" "30" - "Recall Rewind Mode" "0" - "Recall Rewind Threshold" "0.5" + "Minion Amount" "5" + "Minion Chance" "33.3" + "Minion Cooldown" "0" + "Minion Filter" "0" + "Minion Lifetime" "0.0" + "Minion Remove" "1" + "Minion Replace" "1" + "Minion Type" "0-0" } } } @@ -23494,7 +22944,7 @@ ```
-##### Recoil Ability +##### Nullify Ability
Click to expand! @@ -23503,17 +22953,17 @@ { "Tank #1" { - // The Mutant Tank gives survivors strong gun recoil. - // "Ability Enabled" - When a survivor is within range of the Mutant Tank, the survivor experiences strong recoil. - // - "Recoil Range" - // - "Recoil Range Chance" - // - "Recoil Range Cooldown" - // "Recoil Hit" - When a survivor is hit by the Mutant Tank's claw or rock, or a survivor hits the Mutant Tank with a melee weapon, the survivor experiences strong recoil. - // - "Recoil Chance" - // - "Recoil Cooldown" - // - "Recoil Hit Mode" - // Requires "mt_abilities2.smx" to be compiled with "mt_recoil.sp" to work. - "Recoil Ability" + // The Mutant Tank nullifies all of the survivors' damage. + // "Ability Enabled" - When a survivor is within range of the Mutant Tank, the survivor does not do any damage to the Mutant Tank. + // - "Nullify Range" + // - "Nullify Range Chance" + // - "Nullify Range Cooldown" + // "Nullify Hit" - When a survivor is hit by the Mutant Tank's claw or rock, or a survivor hits the Mutant Tank with a melee weapon, the survivor does not do any damage to the Mutant Tank. + // - "Nullify Chance" + // - "Nullify Cooldown" + // - "Nullify Hit Mode" + // Requires "mt_abilities2.smx" to be compiled with "mt_nullify.sp" to work. + "Nullify Ability" { // Admins with one or more of these access flags have access to this ability. // Note: This setting can be overridden for specific players. @@ -23608,18 +23058,18 @@ // "farthest" - 99999.0 range "Open Areas Only" "0.0" - // The ability is only effective toward human survivors. + // The ability is only effective toward human-controlled survivors. // Note: This setting can be overridden for specific players. // -- // Minimum: 0 // Maximum: 32 // -- // 0: OFF - // 1-32: ON, the number of human survivors required to be present for this ability to be effective. + // 1-32: ON, the number of human-controlled survivors required to be present for this ability to be effective. "Requires Humans" "1" // Enable this ability. - // Note: This setting does not affect the "Recoil Hit" setting. + // Note: This setting does not affect the "Nullify Hit" setting. // Note: This setting can be overridden for specific players. // -- // 0/"disabled"/"false"/"off"/"no": OFF @@ -23660,7 +23110,7 @@ // Maximum: 3 // -- // 0: OFF - // 1: Display message only when "Recoil Hit" is enabled. + // 1: Display message only when "Nullify Hit" is enabled. // 2: Display message only when "Ability Enabled" is enabled. // -- // Keywords: @@ -23697,7 +23147,7 @@ // "maybe" - 50% chance // "often"/"likely"/"frequently" - 66.6% chance // "always" - 100% chance - "Recoil Chance" "33.3" + "Nullify Chance" "33.3" // The cooldown for the Mutant Tank's hit ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -23711,7 +23161,7 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Recoil Cooldown" "0" + "Nullify Cooldown" "0" // The Mutant Tank's ability effects last this long. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -23725,7 +23175,7 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Recoil Duration" "5.0" + "Nullify Duration" "5.0" // Enable the Mutant Tank's claw/rock attack. // Note: This setting does not need the "Ability Enabled" setting to be set to "1". @@ -23733,7 +23183,7 @@ // -- // 0/"disabled"/"false"/"off"/"no": OFF // 1/"enabled"/"true"/"on"/"yes": ON - "Recoil Hit" "0" + "Nullify Hit" "0" // The mode of the Mutant Tank's claw/rock attack. // Note: This setting can be overridden for specific players. @@ -23746,7 +23196,7 @@ // "both"/"all" - 0 // "tank"/"attack" - 1 // "survivor"/"hurt" - 2 - "Recoil Hit Mode" "0" + "Nullify Hit Mode" "0" // The distance between a survivor and the Mutant Tank needed to trigger the ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -23758,7 +23208,7 @@ // Keywords: // "closest" - 1.0 range // "farthest" - 99999.0 range - "Recoil Range" "150.0" + "Nullify Range" "150.0" // The Mutant Tank has this many chances out of 100.0% to trigger the range ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -23773,7 +23223,7 @@ // "maybe" - 50% chance // "often"/"likely"/"frequently" - 66.6% chance // "always" - 100% chance - "Recoil Range Chance" "15.0" + "Nullify Range Chance" "15.0" // The cooldown for the Mutant Tank's range ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -23787,11 +23237,11 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Recoil Range Cooldown" "0" + "Nullify Range Cooldown" "0" "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" { - // Note: Override any of the settings in the "Recoil Ability" section for each special infected here. + // Note: Override any of the settings in the "Nullify Ability" section for each special infected here. // Example "Access Flags" "" @@ -23808,14 +23258,14 @@ "Ability Effect" "0" "Ability Message" "0" "Ability Sight" "0" - "Recoil Chance" "33.3" - "Recoil Cooldown" "0" - "Recoil Duration" "5.0" - "Recoil Hit" "0" - "Recoil Hit Mode" "0" - "Recoil Range" "150.0" - "Recoil Range Chance" "15.0" - "Recoil Range Cooldown" "0" + "Nullify Chance" "33.3" + "Nullify Cooldown" "0" + "Nullify Duration" "5.0" + "Nullify Hit" "0" + "Nullify Hit Mode" "0" + "Nullify Range" "150.0" + "Nullify Range Chance" "15.0" + "Nullify Range Cooldown" "0" } } } @@ -23823,7 +23273,7 @@ ```
-##### Regen Ability +##### Omni Ability
Click to expand! @@ -23832,9 +23282,9 @@ { "Tank #1" { - // The Mutant Tank regenerates health. - // Requires "mt_abilities2.smx" to be compiled with "mt_regen.sp" to work. - "Regen Ability" + // The Mutant Tank has omni-level access to other nearby Mutant Tanks' abilities. + // Requires "mt_abilities2.smx" to be compiled with "mt_omni.sp" to work. + "Omni Ability" { // Admins with one or more of these access flags have access to this ability. // Note: This setting can be overridden for specific players. @@ -23843,14 +23293,6 @@ // Not empty: These access flags have access. "Access Flags" "" - // Admins with one or more of these immunity flags are immune to this ability's effects. - // Note: If the Mutant Tank has one or more of these immunity flags or has the same immunity flags as the survivor victim, the immunity is cancelled. - // Note: This setting can be overridden for specific players. - // -- - // Empty: No immunity flags are immune. - // Not empty: These immunity flags are immune. - "Immunity Flags" "" - // The ability can only activate in close areas. // Note: Do not change this setting if you are unsure of how it works. // Note: This setting can be overridden for specific players. @@ -23922,6 +23364,7 @@ // -- // 0: Press buttons to activate corresponding abilities. Cooldown starts after ability's duration ends. // 1: Hold down buttons to keep corresponding abilities activated. Cooldown starts after the player lets go of the buttons. + // 2: Press buttons to toggle corresponding abilities. Cooldown starts after ability is deactivated. "Human Mode" "1" // The ability can only activate in open areas. @@ -23936,15 +23379,15 @@ // "farthest" - 99999.0 range "Open Areas Only" "0.0" - // The ability is only effective toward human survivors. + // The ability is only effective toward human-controlled survivors. // Note: This setting can be overridden for specific players. // -- // Minimum: 0 // Maximum: 32 // -- // 0: OFF - // 1-32: ON, the number of human survivors required to be present for this ability to be effective. - "Requires Humans" "0" + // 1-32: ON, the number of human-controlled survivors required to be present for this ability to be effective. + "Requires Humans" "1" // Enable this ability. // Note: This setting can be overridden for specific players. @@ -23987,7 +23430,7 @@ // "maybe" - 50% chance // "often"/"likely"/"frequently" - 66.6% chance // "always" - 100% chance - "Regen Chance" "33.3" + "Omni Chance" "33.3" // The cooldown for the Mutant Tank's ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -24001,7 +23444,7 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Regen Cooldown" "0" + "Omni Cooldown" "0" // The Mutant Tank's ability effects last this long. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -24014,67 +23457,33 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Regen Duration" "0" + "Omni Duration" "5" - // The Mutant Tank regenerates this much health each time. + // The mode of the Mutant Tank's omni ability. // Note: This setting can be overridden for specific players. // -- - // Minimum: -1000000 - // Maximum: 1000000 - // -- - // Positive numbers: Current health + Regen health - // Negative numbers: Current health - Regen health - "Regen Health" "1" + // 0: The Mutant Tank's type becomes the same as the nearby Mutant Tank's type. + // 1: The Mutant Tank physically transforms into the nearby Mutant Tank. + "Omni Mode" "0" - // The Mutant Tank regenerates health every time this many seconds passes. + // The distance between another Mutant Tank and the Mutant Tank needed to trigger the ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.1 - // Maximum: 99999.0 - // -- - // Keywords: - // "milli"/"millisecond" - 0.1 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Regen Interval" "1.0" - - // The Mutant Tank leeches this much health from each nearby survivor each time. - // Note: This setting can be overridden for specific players. - // -- - // Minimum: -1000000 - // Maximum: 1000000 - // -- - // Positive numbers: Current health + Regen leech - // Negative numbers: Current health - Regen leech - "Regen Leech" "0" - - // The distance between a survivor and the Mutant Tank needed to leech health. - // Note: This setting can be overridden for specific players. - // -- // Minimum: 1.0 (Closest) // Maximum: 99999.0 (Farthest) // -- // Keywords: // "closest" - 1.0 range // "farthest" - 99999.0 range - "Regen Leech Range" "500.0" - - // The Mutant Tank stops regenerating health at this value. - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 1 - // Maximum: 1000000 - "Regen Limit" "1000000" + "Omni Range" "500.0" "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" { - // Note: Override any of the settings in the "Regen Ability" section for each special infected here. + // Note: Override any of the settings in the "Omni Ability" section for each special infected here. // Example "Access Flags" "" - "Immunity Flags" "" "Close Areas Only" "0.0" "Combo Ability" "0" "Human Ability" "0" @@ -24083,18 +23492,15 @@ "Human Duration" "5" "Human Mode" "1" "Open Areas Only" "0.0" - "Requires Humans" "0" + "Requires Humans" "1" "Ability Enabled" "0" "Ability Message" "0" "Ability Sight" "0" - "Regen Chance" "33.3" - "Regen Cooldown" "0" - "Regen Duration" "0" - "Regen Health" "1" - "Regen Interval" "1.0" - "Regen Leech" "0" - "Regen Leech Range" "500.0" - "Regen Limit" "1000000" + "Omni Chance" "33.3" + "Omni Cooldown" "0" + "Omni Duration" "5" + "Omni Mode" "0" + "Omni Range" "500.0" } } } @@ -24102,7 +23508,7 @@ ```
-##### Respawn Ability +##### Panic Ability
Click to expand! @@ -24111,9 +23517,9 @@ { "Tank #1" { - // The Mutant Tank respawns upon death. - // Requires "mt_abilities2.smx" to be compiled with "mt_respawn.sp" to work. - "Respawn Ability" + // The Mutant Tank starts panic events and spawns zombies. + // Requires "mt_abilities2.smx" to be compiled with "mt_panic.sp" to work. + "Panic Ability" { // Admins with one or more of these access flags have access to this ability. // Note: This setting can be overridden for specific players. @@ -24162,6 +23568,40 @@ // "infinite" - 99999 ammo "Human Ammo" "5" + // Human-controlled Mutant Tanks must wait this long before using their abilities again. + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0 (OFF) + // Maximum: 99999 (Longest) + // -- + // Keywords: + // "never"/"disabled"/"false"/"off"/"no" - 0 seconds + // "second" - 1 second + // "minute" - 1 minute + // "forever" - 99999 seconds + "Human Cooldown" "0" + + // The Mutant Tank's ability effects last this long. + // Note: This setting does not affect human-controlled Mutant Tanks unless the "Human Mode" setting is set to "0". + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0 + // Maximum: 99999 + // -- + // Keywords: + // "second" - 1 second + // "minute" - 1 minute + // "forever" - 99999 seconds + "Human Duration" "5" + + // The mode of how human-controlled Mutant Tanks activate their abilities. + // Note: This setting can be overridden for specific players. + // -- + // 0: Press buttons to activate corresponding abilities. Cooldown starts after ability's duration ends. + // 1: Hold down buttons to keep corresponding abilities activated. Cooldown starts after the player lets go of the buttons. + // 2: Press buttons to toggle corresponding abilities. Cooldown starts after ability is deactivated. + "Human Mode" "1" + // The ability can only activate in open areas. // Note: Do not change this setting if you are unsure of how it works. // Note: This setting can be overridden for specific players. @@ -24174,21 +23614,23 @@ // "farthest" - 99999.0 range "Open Areas Only" "0.0" - // The ability is only effective toward human survivors. + // The ability is only effective toward human-controlled survivors. // Note: This setting can be overridden for specific players. // -- // Minimum: 0 // Maximum: 32 // -- // 0: OFF - // 1-32: ON, the number of human survivors required to be present for this ability to be effective. + // 1-32: ON, the number of human-controlled survivors required to be present for this ability to be effective. "Requires Humans" "0" // Enable this ability. // Note: This setting can be overridden for specific players. // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON + // 0: OFF + // 1: ON, the Mutant Tank can start panic events. + // 2: ON, the Mutant Tank can spawn zombies. + // 3: ON, the Mutant Tank can do both. "Ability Enabled" "0" // Display a message whenever the ability activates/deactivates. @@ -24198,57 +23640,99 @@ // 1/"enabled"/"true"/"on"/"yes": ON "Ability Message" "0" - // The Mutant Tank respawns up to this many times. + // The Mutant Tank spawns this many zombies at once. // Note: This setting can be overridden for specific players. // -- // Minimum: 1 - // Maximum: 99999 - "Respawn Amount" "1" + // Maximum: 100 + "Panic Amount" "10" // The Mutant Tank has this many chances out of 100.0% to trigger the ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.0 (No chance) - // Maximum: 100.0 (Highest chance) + // Minimum: 0.0 (No chance) + // Maximum: 100.0 (Highest chance) + // -- + // Keywords: + // "never" - 0% chance + // "sometimes"/"unlikely"/"seldom" - 33.3% chance + // "maybe" - 50% chance + // "often"/"likely"/"frequently" - 66.6% chance + // "always" - 100% chance + "Panic Chance" "33.3" + + // The cooldown for the Mutant Tank's ability. + // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0 (OFF) + // Maximum: 99999 (Longest) + // -- + // Keywords: + // "never"/"disabled"/"false"/"off"/"no" - 0 seconds + // "second" - 1 second + // "minute" - 1 minute + // "forever" - 99999 seconds + "Panic Cooldown" "0" + + // The Mutant Tank's ability effects last this long. + // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0 + // Maximum: 99999 // -- // Keywords: - // "never" - 0% chance - // "sometimes"/"unlikely"/"seldom" - 33.3% chance - // "maybe" - 50% chance - // "often"/"likely"/"frequently" - 66.6% chance - // "always" - 100% chance - "Respawn Chance" "33.3" + // "second" - 1 second + // "minute" - 1 minute + // "forever" - 99999 seconds + "Panic Duration" "0" - // The type that the Mutant Tank will respawn as. - // Note: Chosen types that also have the Respawn ability will be replaced with the Mutant Tank's own type to prevent bugs. + // The Mutant Tank starts a panic event every time this many seconds passes. + // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- - // Separate values with "-". + // Minimum: 0.1 + // Maximum: 99999.0 // -- - // Value limit: 2 - // Character limit for each value: 4 + // Keywords: + // "milli"/"millisecond" - 0.1 seconds + // "second" - 1 second + // "minute" - 1 minute + // "forever" - 99999 seconds + "Panic Interval" "5.0" + + // The mode of the Mutant Tank's panic mob spawn ability. + // Note: This setting can be overridden for specific players. // -- - // Minimum number for each value: 0 (OFF) - // Maximum number for each value: 500 + // 0: Both + // 1: The Mutant Tank spawns common infected. + // 2: The Mutant Tank spawns uncommon infected. + "Panic Mode" "0" + + // The type of zombies to spawn. + // Note: This setting only applies if the "Panic Mode" setting is set to "0" or "2". + // Note: This setting can be overridden for specific players. // -- - // 1st number = Minimum value - // 2nd number = Maximum value + // Add up numbers together for different results. // -- - // Example: "0-0" (Do not choose from any Mutant Tank types.) - // Example: "1-25" (Choose a Mutant Tank type between 1 through 25.) - // Example: "50-0" (Automatically change to "0-0" because "50" is higher than "0".) - // Example: "1-1000" (Automatically change to "1-500" because "500" is the maximum number of Mutant Tank types allowed.) - // Example: "0" (Automatically change to "0-500" because the maximum range is not specified.) - // Example: "1000" (Automatically change to "500-500" because the maximum range is not specified and the minimum range exceeds the "500" limit.) + // Minimum: 0 + // Maximum: 127 // -- - // 0: OFF, use the randomization feature. - // 1-500: ON, the type to respawn as. - "Respawn Type" "0-0" + // 0 OR 127: Pick randomly between the 7 options. + // 1: CEDA Worker (Dead Center) + // 2: Jimmy Gibbs Jr. (Dead Center) + // 4: Fallen Survivor (The Passing) + // 8: Clown (Dark Carnival) + // 16: Mudman (Swamp Fever) + // 32: Roadcrew Worker (Hard Rain) + // 64: Riot Cop (The Parish) + "Panic Type" "0" "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" { - // Note: Override any of the settings in the "Respawn Ability" section for each special infected here. + // Note: Override any of the settings in the "Panic Ability" section for each special infected here. // Example "Access Flags" "" @@ -24256,13 +23740,20 @@ "Combo Ability" "0" "Human Ability" "0" "Human Ammo" "5" + "Human Cooldown" "0" + "Human Duration" "5" + "Human Mode" "1" "Open Areas Only" "0.0" "Requires Humans" "0" "Ability Enabled" "0" "Ability Message" "0" - "Respawn Amount" "1" - "Respawn Chance" "33.3" - "Respawn Type" "0-0" + "Panic Amount" "10" + "Panic Chance" "33.3" + "Panic Cooldown" "0" + "Panic Duration" "0" + "Panic Interval" "5.0" + "Panic Mode" "0" + "Panic Type" "0" } } } @@ -24270,7 +23761,7 @@ ```
-##### Restart Ability +##### Puke Ability
Click to expand! @@ -24279,17 +23770,20 @@ { "Tank #1" { - // The Mutant Tank forces survivors to restart at the beginning of the map or near a teammate with a new loadout. - // "Ability Enabled" - When a survivor is within range of the Mutant Tank, the survivor respawns at the start of the map or near a teammate. - // - "Restart Range" - // - "Restart Range Chance" - // - "Restart Range Cooldown" - // "Restart Hit" - When a survivor is hit by the Mutant Tank's claw or rock, or a survivor hits the Mutant Tank with a melee weapon, the survivor respawns at the start of the map or near a teammate. - // - "Restart Chance" - // - "Restart Cooldown" - // - "Restart Hit Mode" - // Requires "mt_abilities2.smx" to be compiled with "mt_restart.sp" to work. - "Restart Ability" + // The Mutant Tank pukes on survivors. + // "Ability Enabled" - When a survivor is within range of the Mutant Tank, the Mutant Tank pukes on the survivor. + // - "Puke Range" + // - "Puke Range Chance" + // - "Puke Range Cooldown" + // "Puke Death" - When the Mutant Tank dies or spawns, nearby survivors are puked on. + // - "Puke Death Chance" + // - "Puke Death Range" + // "Puke Hit" - When a survivor is hit by the Mutant Tank's claw or rock, or a survivor hits the Mutant Tank with a melee weapon, the Mutant Tank pukes on the survivor. + // - "Puke Chance" + // - "Puke Cooldown" + // - "Puke Hit Mode" + // Requires "mt_abilities2.smx" to be compiled with "mt_puke.sp" to work. + "Puke Ability" { // Admins with one or more of these access flags have access to this ability. // Note: This setting can be overridden for specific players. @@ -24384,18 +23878,18 @@ // "farthest" - 99999.0 range "Open Areas Only" "0.0" - // The ability is only effective toward human survivors. + // The ability is only effective toward human-controlled survivors. // Note: This setting can be overridden for specific players. // -- // Minimum: 0 // Maximum: 32 // -- // 0: OFF - // 1-32: ON, the number of human survivors required to be present for this ability to be effective. + // 1-32: ON, the number of human-controlled survivors required to be present for this ability to be effective. "Requires Humans" "0" // Enable this ability. - // Note: This setting does not affect the "Restart Hit" setting. + // Note: This setting does not affect the "Puke Hit" setting. // Note: This setting can be overridden for specific players. // -- // 0/"disabled"/"false"/"off"/"no": OFF @@ -24436,7 +23930,7 @@ // Maximum: 3 // -- // 0: OFF - // 1: Display message only when "Restart Hit" is enabled. + // 1: Display message only when "Puke Hit" is enabled. // 2: Display message only when "Ability Enabled" is enabled. // -- // Keywords: @@ -24473,7 +23967,7 @@ // "maybe" - 50% chance // "often"/"likely"/"frequently" - 66.6% chance // "always" - 100% chance - "Restart Chance" "33.3" + "Puke Chance" "33.3" // The cooldown for the Mutant Tank's hit ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -24487,7 +23981,48 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Restart Cooldown" "0" + "Puke Cooldown" "0" + + // Enable the Mutant Tank's upon-death range ability. + // Note: This setting does not need the "Ability Enabled" setting to be set to "1". + // Note: This setting can be overridden for specific players. + // -- + // Add up numbers together for different results. + // -- + // Minimum: 0 + // Maximum: 3 + // -- + // 0: OFF + // 1: Trigger the range ability when the Mutant Tank dies. + // 2: Trigger the range ability when the Mutant Tank spawns. + "Puke Death" "1" + + // The Mutant Tank has this many chances out of 100.0% to trigger the upon-death ability. + // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0.0 (No chance) + // Maximum: 100.0 (Highest chance) + // -- + // Keywords: + // "never" - 0% chance + // "sometimes"/"unlikely"/"seldom" - 33.3% chance + // "maybe" - 50% chance + // "often"/"likely"/"frequently" - 66.6% chance + // "always" - 100% chance + "Puke Death Chance" "33.3" + + // The distance between a survivor and the Mutant Tank needed to trigger the upon-death ability. + // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 1.0 (Closest) + // Maximum: 99999.0 (Farthest) + // -- + // Keywords: + // "closest" - 1.0 range + // "farthest" - 99999.0 range + "Puke Death Range" "200.0" // Enable the Mutant Tank's claw/rock attack. // Note: This setting does not need the "Ability Enabled" setting to be set to "1". @@ -24495,7 +24030,7 @@ // -- // 0/"disabled"/"false"/"off"/"no": OFF // 1/"enabled"/"true"/"on"/"yes": ON - "Restart Hit" "0" + "Puke Hit" "0" // The mode of the Mutant Tank's claw/rock attack. // Note: This setting can be overridden for specific players. @@ -24508,25 +24043,7 @@ // "both"/"all" - 0 // "tank"/"attack" - 1 // "survivor"/"hurt" - 2 - "Restart Hit Mode" "0" - - // The Mutant Tank makes survivors restart with this loadout. - // Note: This setting can be overridden for specific players. - // -- - // Item limit: 5 - // Character limit for each item: 64 - // -- - // Example: "smg_silenced,pistol,adrenaline,defibrillator" - // Example: "katana,pain_pills,vomitjar" - // Example: "first_aid_kit,defibrillator,knife,adrenaline" - "Restart Loadout" "smg,pistol,pain_pills" - - // The mode of the Mutant Tank's restart ability. - // Note: This setting can be overridden for specific players. - // -- - // 0: Survivors are teleported to the spawn area. - // 1: Survivors are teleported to another teammate. - "Restart Mode" "1" + "Puke Hit Mode" "0" // The distance between a survivor and the Mutant Tank needed to trigger the ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -24538,7 +24055,7 @@ // Keywords: // "closest" - 1.0 range // "farthest" - 99999.0 range - "Restart Range" "150.0" + "Puke Range" "150.0" // The Mutant Tank has this many chances out of 100.0% to trigger the range ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -24553,7 +24070,7 @@ // "maybe" - 50% chance // "often"/"likely"/"frequently" - 66.6% chance // "always" - 100% chance - "Restart Range Chance" "15.0" + "Puke Range Chance" "15.0" // The cooldown for the Mutant Tank's range ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -24567,11 +24084,11 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Restart Range Cooldown" "0" + "Puke Range Cooldown" "0" "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" { - // Note: Override any of the settings in the "Restart Ability" section for each special infected here. + // Note: Override any of the settings in the "Puke Ability" section for each special infected here. // Example "Access Flags" "" @@ -24588,15 +24105,16 @@ "Ability Effect" "0" "Ability Message" "0" "Ability Sight" "0" - "Restart Chance" "33.3" - "Restart Cooldown" "0" - "Restart Hit" "0" - "Restart Hit Mode" "0" - "Restart Loadout" "smg,pistol,pain_pills" - "Restart Mode" "1" - "Restart Range" "150.0" - "Restart Range Chance" "15.0" - "Restart Range Cooldown" "0" + "Puke Chance" "33.3" + "Puke Cooldown" "0" + "Puke Death" "1" + "Puke Death Chance" "33.3" + "Puke Death Range" "200.0" + "Puke Hit" "0" + "Puke Hit Mode" "0" + "Puke Range" "150.0" + "Puke Range Chance" "15.0" + "Puke Range Cooldown" "0" } } } @@ -24604,7 +24122,7 @@ ```
-##### Rock Ability +##### Pyro Ability
Click to expand! @@ -24613,9 +24131,9 @@ { "Tank #1" { - // The Mutant Tank creates rock showers. - // Requires "mt_abilities2.smx" to be compiled with "mt_rock.sp" to work. - "Rock Ability" + // The Mutant Tank ignites itself and gains a speed boost when on fire. + // Requires "mt_abilities2.smx" to be compiled with "mt_pyro.sp" to work. + "Pyro Ability" { // Admins with one or more of these access flags have access to this ability. // Note: This setting can be overridden for specific players. @@ -24624,14 +24142,6 @@ // Not empty: These access flags have access. "Access Flags" "" - // Admins with one or more of these immunity flags are immune to this ability's effects. - // Note: If the Mutant Tank has one or more of these immunity flags or has the same immunity flags as the survivor victim, the immunity is cancelled. - // Note: This setting can be overridden for specific players. - // -- - // Empty: No immunity flags are immune. - // Not empty: These immunity flags are immune. - "Immunity Flags" "" - // The ability can only activate in close areas. // Note: Do not change this setting if you are unsure of how it works. // Note: This setting can be overridden for specific players. @@ -24703,6 +24213,7 @@ // -- // 0: Press buttons to activate corresponding abilities. Cooldown starts after ability's duration ends. // 1: Hold down buttons to keep corresponding abilities activated. Cooldown starts after the player lets go of the buttons. + // 2: Press buttons to toggle corresponding abilities. Cooldown starts after ability is deactivated. "Human Mode" "1" // The ability can only activate in open areas. @@ -24717,15 +24228,15 @@ // "farthest" - 99999.0 range "Open Areas Only" "0.0" - // The ability is only effective toward human survivors. + // The ability is only effective toward human-controlled survivors. // Note: This setting can be overridden for specific players. // -- // Minimum: 0 // Maximum: 32 // -- // 0: OFF - // 1-32: ON, the number of human survivors required to be present for this ability to be effective. - "Requires Humans" "1" + // 1-32: ON, the number of human-controlled survivors required to be present for this ability to be effective. + "Requires Humans" "0" // Enable this ability. // Note: This setting can be overridden for specific players. @@ -24754,7 +24265,7 @@ // "maybe" - 50% chance // "often"/"likely"/"frequently" - 66.6% chance // "always" - 100% chance - "Rock Chance" "33.3" + "Pyro Chance" "33.3" // The cooldown for the Mutant Tank's ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -24768,19 +24279,14 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Rock Cooldown" "0" + "Pyro Cooldown" "0" - // The Mutant Tank's rocks do this much damage. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // The Mutant Tank's damage boost value when on fire. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 (OFF) - // Maximum: 99999 - // -- - // Keywords: - // "weakest" - 1.0 damage - // "strongest" - 99999.0 damage - "Rock Damage" "5" + // Minimum: 0.1 + // Maximum: 99999.0 + "Pyro Damage Boost" "5.0" // The Mutant Tank's ability effects last this long. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -24793,36 +24299,50 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Rock Duration" "5" + "Pyro Duration" "5" + + // The fire damage received by the Mutant Tank is divided by this value. + // Note: Damage = Fire damage/Pyro fire divisor + // Example: Damage = 300.0/200.0 (1.5) + // Note: Use the value "1.0" to disable this setting. (Fire damage/1.0 = Fire damage) + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 1.0 + // Maximum: 99999.0 + "Pyro Fire Divisor" "1.0" + + // The mode of the Mutant Tank's damage and speed boosts. + // Note: This setting can be overridden for specific players. + // -- + // 0: + // Mutant Tank's damage = Claw/rock damage + Pyro damage boost + // Mutant Tank's speed = Run speed + Pyro speed boost + // 1: + // Mutant Tank's damage = Pyro damage boost + // Mutant Tank's speed = Pyro speed boost + "Pyro Mode" "0" - // The Mutant Tank's rock shower drops a rock every time this many seconds passes. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // The Mutant Tank will be reignited if it is extinguished while the ability is still activated. + // Note: This setting will automatically deactivate the ability if set to "0". // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.1 - // Maximum: 1.0 - "Rock Interval" "0.2" + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Pyro Reignite" "1" - // The radius of the Mutant Tank's rock shower. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // The Mutant Tank's speed boost value when on fire. // Note: This setting can be overridden for specific players. // -- - // 1st number = Minimum radius - // Minimum: -5.0 - // Maximum: 0.0 - // -- - // 2nd number = Maximum radius - // Minimum: 0.0 - // Maximum: 5.0 - "Rock Radius" "-1.25,1.25" + // Minimum: 0.1 + // Maximum: 3.0 + "Pyro Speed Boost" "1.0" "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" { - // Note: Override any of the settings in the "Rock Ability" section for each special infected here. + // Note: Override any of the settings in the "Pyro Ability" section for each special infected here. // Example "Access Flags" "" - "Immunity Flags" "" "Close Areas Only" "0.0" "Combo Ability" "0" "Human Ability" "0" @@ -24831,15 +24351,17 @@ "Human Duration" "5" "Human Mode" "1" "Open Areas Only" "0.0" - "Requires Humans" "1" + "Requires Humans" "0" "Ability Enabled" "0" "Ability Message" "0" - "Rock Chance" "33.3" - "Rock Cooldown" "0" - "Rock Damage" "5" - "Rock Duration" "5" - "Rock Interval" "0.2" - "Rock Radius" "-1.25,1.25" + "Pyro Chance" "33.3" + "Pyro Cooldown" "0" + "Pyro Damage Boost" "5.0" + "Pyro Duration" "5" + "Pyro Fire Divisor" "1.0" + "Pyro Mode" "0" + "Pyro Reignite" "1" + "Pyro Speed Boost" "1.0" } } } @@ -24847,7 +24369,7 @@ ```
-##### Rocket Ability +##### Quiet Ability
Click to expand! @@ -24856,17 +24378,17 @@ { "Tank #1" { - // The Mutant Tank sends survivors into space. - // "Ability Enabled" - When a survivor is within range of the Mutant Tank, the survivor is sent into space. - // - "Rocket Range" - // - "Rocket Range Chance" - // - "Rocket Range Cooldown" - // "Rocket Hit" - When a survivor is hit by the Mutant Tank's claw or rock, or a survivor hits the Mutant Tank with a melee weapon, the survivor is sent into space. - // - "Rocket Chance" - // - "Rocket Cooldown" - // - "Rocket Hit Mode" - // Requires "mt_abilities2.smx" to be compiled with "mt_rocket.sp" to work. - "Rocket Ability" + // The Mutant Tank silences itself around survivors. + // "Ability Enabled" - When a survivor is within range of the Mutant Tank, the survivor cannot hear the Mutant Tank's sounds. + // - "Quiet Range" + // - "Quiet Range Chance" + // - "Quiet Range Cooldown" + // "Quiet Hit" - When a survivor is hit by the Mutant Tank's claw or rock, or a survivor hits the Mutant Tank with a melee weapon, the survivor cannot hear the Mutant Tank's sounds. + // - "Quiet Chance" + // - "Quiet Cooldown" + // - "Quiet Hit Mode" + // Requires "mt_abilities2.smx" to be compiled with "mt_quiet.sp" to work. + "Quiet Ability" { // Admins with one or more of these access flags have access to this ability. // Note: This setting can be overridden for specific players. @@ -24961,18 +24483,18 @@ // "farthest" - 99999.0 range "Open Areas Only" "0.0" - // The ability is only effective toward human survivors. + // The ability is only effective toward human-controlled survivors. // Note: This setting can be overridden for specific players. // -- // Minimum: 0 // Maximum: 32 // -- // 0: OFF - // 1-32: ON, the number of human survivors required to be present for this ability to be effective. - "Requires Humans" "0" + // 1-32: ON, the number of human-controlled survivors required to be present for this ability to be effective. + "Requires Humans" "1" // Enable this ability. - // Note: This setting does not affect the "Rocket Hit" setting. + // Note: This setting does not affect the "Quiet Hit" setting. // Note: This setting can be overridden for specific players. // -- // 0/"disabled"/"false"/"off"/"no": OFF @@ -25013,7 +24535,7 @@ // Maximum: 3 // -- // 0: OFF - // 1: Display message only when "Rocket Hit" is enabled. + // 1: Display message only when "Quiet Hit" is enabled. // 2: Display message only when "Ability Enabled" is enabled. // -- // Keywords: @@ -25037,31 +24559,230 @@ // 5: Option 1 + Check if the survivors are looking away from the Mutant Tank. "Ability Sight" "0" - // Removes the death model of the survivor when killed. - // Note: Only available in Left 4 Dead 2. + // The Mutant Tank has this many chances out of 100.0% to trigger the ability. + // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0.0 (No chance) + // Maximum: 100.0 (Highest chance) + // -- + // Keywords: + // "never" - 0% chance + // "sometimes"/"unlikely"/"seldom" - 33.3% chance + // "maybe" - 50% chance + // "often"/"likely"/"frequently" - 66.6% chance + // "always" - 100% chance + "Quiet Chance" "33.3" + + // The cooldown for the Mutant Tank's hit ability. + // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0 (OFF) + // Maximum: 99999 (Longest) + // -- + // Keywords: + // "never"/"disabled"/"false"/"off"/"no" - 0 seconds + // "second" - 1 second + // "minute" - 1 minute + // "forever" - 99999 seconds + "Quiet Cooldown" "0" + + // The Mutant Tank's ability effects last this long. + // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0.1 + // Maximum: 99999.0 + // -- + // Keywords: + // "milli"/"millisecond" - 0.1 seconds + // "second" - 1 second + // "minute" - 1 minute + // "forever" - 99999 seconds + "Quiet Duration" "5.0" + + // The filter for the Mutant Tank's quiet effect. + // Note: This setting can be overridden for specific players. + // -- + // Add up numbers together for different results. + // -- + // Minimum: 0 + // Maximum: 511 + // -- + // 0 OR 511: All filters. + // 1: Common infected + // 2: Smoker + // 4: Boomer + // 8: Hunter + // 16: Spitter (Only available in Left 4 Dead 2.) + // 32: Jockey (Only available in Left 4 Dead 2.) + // 64: Charger (Only available in Left 4 Dead 2.) + // 128: Witch + // 256: Tank + "Quiet Filter" "0" + + // Enable the Mutant Tank's claw/rock attack. + // Note: This setting does not need the "Ability Enabled" setting to be set to "1". + // Note: This setting can be overridden for specific players. + // -- + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Quiet Hit" "0" + + // The mode of the Mutant Tank's claw/rock attack. + // Note: This setting can be overridden for specific players. + // -- + // 0: Both + // 1: Ability activates when the Mutant Tank hits a survivor. + // 2: Ability activates when the Mutant Tank is hit by a survivor. + // -- + // Keywords: + // "both"/"all" - 0 + // "tank"/"attack" - 1 + // "survivor"/"hurt" - 2 + "Quiet Hit Mode" "0" + + // The distance between a survivor and the Mutant Tank needed to trigger the ability. + // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 1.0 (Closest) + // Maximum: 99999.0 (Farthest) + // -- + // Keywords: + // "closest" - 1.0 range + // "farthest" - 99999.0 range + "Quiet Range" "150.0" + + // The Mutant Tank has this many chances out of 100.0% to trigger the range ability. + // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0.0 (No chance) + // Maximum: 100.0 (Highest chance) + // -- + // Keywords: + // "never" - 0% chance + // "sometimes"/"unlikely"/"seldom" - 33.3% chance + // "maybe" - 50% chance + // "often"/"likely"/"frequently" - 66.6% chance + // "always" - 100% chance + "Quiet Range Chance" "15.0" + + // The cooldown for the Mutant Tank's range ability. + // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0 (OFF) + // Maximum: 99999 (Longest) + // -- + // Keywords: + // "never"/"disabled"/"false"/"off"/"no" - 0 seconds + // "second" - 1 second + // "minute" - 1 minute + // "forever" - 99999 seconds + "Quiet Range Cooldown" "0" + + "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" + { + // Note: Override any of the settings in the "Quiet Ability" section for each special infected here. + + // Example + "Access Flags" "" + "Immunity Flags" "" + "Close Areas Only" "0.0" + "Combo Ability" "0" + "Human Ability" "0" + "Human Ammo" "5" + "Human Cooldown" "0" + "Human Range Cooldown" "0" + "Open Areas Only" "0.0" + "Requires Humans" "1" + "Ability Enabled" "0" + "Ability Effect" "0" + "Ability Message" "0" + "Ability Sight" "0" + "Quiet Chance" "33.3" + "Quiet Cooldown" "0" + "Quiet Duration" "5.0" + "Quiet Filter" "0" + "Quiet Hit" "0" + "Quiet Hit Mode" "0" + "Quiet Range" "150.0" + "Quiet Range Chance" "15.0" + "Quiet Range Cooldown" "0" + } + } + } +} +``` +
+ +##### Recall Ability +
+ Click to expand! + +``` +"Mutant Tanks" +{ + "Tank #1" + { + // The Mutant Tank time travels to annoy survivors. + // "Ability Enabled" - When the Mutant Tank is below certain health, it recalls to the past. + // - "Recall Rewind Chance" + // - "Recall Rewind Cleanse" + // - "Recall Rewind Cooldown" + // - "Recall Rewind Lifetime" + // - "Recall Rewind Mode" + // - "Recall Rewind Threshold" + // "Ability Enabled" - When the Mutant Tank spawns, it randomly blinks a certain distance in different directions. + // - "Recall Blink Chance" + // - "Recall Blink Cooldown" + // - "Recall Blink Count" + // - "Recall Blink Range" + // Requires "mt_abilities2.smx" to be compiled with "mt_recall.sp" to work. + "Recall Ability" + { + // Admins with one or more of these access flags have access to this ability. + // Note: This setting can be overridden for specific players. + // -- + // Empty: No access flags have access. + // Not empty: These access flags have access. + "Access Flags" "" + + // The ability can only activate in close areas. + // Note: Do not change this setting if you are unsure of how it works. + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0.0 (OFF) + // Maximum: 99999.0 (Farthest) + // -- + // Keywords: + // "disabled"/"false"/"off"/"no" - 0.0 range + // "farthest" - 99999.0 range + "Close Areas Only" "0.0" + + // Allow human-controlled Mutant Tanks to use this ability. // Note: This setting can be overridden for specific players. // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Rocket Body" "1" + // 0: OFF + // 1: ON, players can use buttons to activate abilities. + // 2: ON, abilities will activate automatically. + "Human Ability" "0" - // The Mutant Tank has this many chances out of 100.0% to trigger the ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Determines how many times human-controlled Mutant Tanks can use their abilities in one life. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.0 (No chance) - // Maximum: 100.0 (Highest chance) + // Minimum: 0 + // Maximum: 99999 // -- // Keywords: - // "never" - 0% chance - // "sometimes"/"unlikely"/"seldom" - 33.3% chance - // "maybe" - 50% chance - // "often"/"likely"/"frequently" - 66.6% chance - // "always" - 100% chance - "Rocket Chance" "33.3" + // "none"/"off" - 0 ammo + // "infinite" - 99999 ammo + "Human Ammo" "5" - // The cooldown for the Mutant Tank's hit ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Human-controlled Mutant Tanks must wait this long before using their abilities again. // Note: This setting can be overridden for specific players. // -- // Minimum: 0 (OFF) @@ -25072,57 +24793,53 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Rocket Cooldown" "0" + "Human Cooldown" "0" - // The countdown before activating the Mutant Tank's rocket ability. - // Note: During the countdown phase, survivors can hide indoors to avoid dying. + // Human-controlled Mutant Tanks must wait this long before using their range ability again. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.0 (OFF) - // Maximum: 99999.0 + // Minimum: 0 (OFF) + // Maximum: 99999 (Longest) // -- // Keywords: - // "milli"/"millisecond" - 0.1 seconds + // "never"/"disabled"/"false"/"off"/"no" - 0 seconds // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Rocket Countdown" "0.0" + "Human Range Cooldown" "0" - // The Mutant Tank sends survivors into space after this many seconds passes upon triggering the ability. + // The ability can only activate in open areas. + // Note: Do not change this setting if you are unsure of how it works. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.1 - // Maximum: 99999.0 + // Minimum: 0.0 (OFF) + // Maximum: 99999.0 (Farthest) // -- // Keywords: - // "milli"/"millisecond" - 0.1 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Rocket Delay" "1.0" + // "disabled"/"false"/"off"/"no" - 0.0 range + // "farthest" - 99999.0 range + "Open Areas Only" "0.0" - // Enable the Mutant Tank's claw/rock attack. - // Note: This setting does not need the "Ability Enabled" setting to be set to "1". + // The ability is only effective toward human-controlled survivors. // Note: This setting can be overridden for specific players. // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Rocket Hit" "0" + // Minimum: 0 + // Maximum: 32 + // -- + // 0: OFF + // 1-32: ON, the number of human-controlled survivors required to be present for this ability to be effective. + "Requires Humans" "0" - // The mode of the Mutant Tank's claw/rock attack. + // Enable this ability. // Note: This setting can be overridden for specific players. // -- - // 0: Both - // 1: Ability activates when the Mutant Tank hits a survivor. - // 2: Ability activates when the Mutant Tank is hit by a survivor. - // -- - // Keywords: - // "both"/"all" - 0 - // "tank"/"attack" - 1 - // "survivor"/"hurt" - 2 - "Rocket Hit Mode" "0" + // 0: OFF + // 1: ON, the Mutant Tank can recall to the past. + // 2: ON, the Mutant Tank can blink in any direction. + // 3: ON, the Mutant Tank can do both. + "Ability Enabled" "0" - // The mode of the Mutant Tank's rocket ability. + // Display a message whenever the abilities activate/deactivate. // Note: This setting can be overridden for specific players. // -- // Add up numbers together for different results. @@ -25130,13 +24847,47 @@ // Minimum: 0 // Maximum: 3 // -- - // 0 OR 3: Pick randomly between killing and incapacitating. - // 1: Kill instantly. - // 2: Incapacitate only. - "Rocket Mode" "1" + // 0: OFF + // 1: Display message only when "Ability Enabled" is set to "1" or "3". + // 2: Display message only when "Ability Enabled" is set to "2" or "3". + "Ability Message" "0" - // The distance between a survivor and the Mutant Tank needed to trigger the ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // The Mutant Tank has this many chances out of 100.0% to trigger the blink ability. + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0.0 (No chance) + // Maximum: 100.0 (Highest chance) + // -- + // Keywords: + // "never" - 0% chance + // "sometimes"/"unlikely"/"seldom" - 33.3% chance + // "maybe" - 50% chance + // "often"/"likely"/"frequently" - 66.6% chance + // "always" - 100% chance + "Recall Blink Chance" "50.0" + + // The cooldown for the Mutant Tank's blink ability. + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0 (OFF) + // Maximum: 99999 (Longest) + // -- + // Keywords: + // "never"/"disabled"/"false"/"off"/"no" - 0 seconds + // "second" - 1 second + // "minute" - 1 minute + // "forever" - 99999 seconds + "Recall Blink Cooldown" "0" + + // The Mutant Tank can blink this many times before a cooldown is triggered. + // Note: This setting is ignored when the "Recall Blink Cooldown" setting is set to "0". + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0 (OFF) + // Maximum: 99999 (Highest) + "Recall Blink Count" "5" + + // The distance of the Mutant Tank's blink ability. // Note: This setting can be overridden for specific players. // -- // Minimum: 1.0 (Closest) @@ -25145,10 +24896,9 @@ // Keywords: // "closest" - 1.0 range // "farthest" - 99999.0 range - "Rocket Range" "150.0" + "Recall Blink Range" "150.0" - // The Mutant Tank has this many chances out of 100.0% to trigger the range ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // The Mutant Tank has this many chances out of 100.0% to trigger the rewind ability. // Note: This setting can be overridden for specific players. // -- // Minimum: 0.0 (No chance) @@ -25160,10 +24910,16 @@ // "maybe" - 50% chance // "often"/"likely"/"frequently" - 66.6% chance // "always" - 100% chance - "Rocket Range Chance" "15.0" + "Recall Rewind Chance" "100.0" - // The cooldown for the Mutant Tank's range ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // The Mutant Tank will be cleansed from bile bombs and fires when using its rewind ability. + // Note: This setting can be overridden for specific players. + // -- + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Recall Rewind Cleanse" "1" + + // The cooldown for the Mutant Tank's rewind ability. // Note: This setting can be overridden for specific players. // -- // Minimum: 0 (OFF) @@ -25174,17 +24930,37 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Rocket Range Cooldown" "0" + "Recall Rewind Cooldown" "5" + + // This is how far in seconds that the Mutant Tank's rewind ability can go back to. + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 1 + // Maximum: 30 + "Recall Rewind Lifetime" "30" + + // The mode of the Mutant Tank's rewind ability. + // Note: This setting can be overridden for specific players. + // -- + // 0: Both + // 1: Rewind health only. + // 2: Rewind location only. + "Recall Rewind Mode" "0" + + // The percentage threshold that the Mutant Tank's health needs to be under to trigger the rewind ability. + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0.0 (OFF) + // Maximum: 1.0 (Full) + "Recall Rewind Threshold" "0.5" "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" { - // Note: Override any of the settings in the "Rocket Ability" section for each special infected here. + // Note: Override any of the settings in the "Recall Ability" section for each special infected here. // Example "Access Flags" "" - "Immunity Flags" "" "Close Areas Only" "0.0" - "Combo Ability" "0" "Human Ability" "0" "Human Ammo" "5" "Human Cooldown" "0" @@ -25192,20 +24968,17 @@ "Open Areas Only" "0.0" "Requires Humans" "0" "Ability Enabled" "0" - "Ability Effect" "0" "Ability Message" "0" - "Ability Sight" "0" - "Rocket Body" "1" - "Rocket Chance" "33.3" - "Rocket Cooldown" "0" - "Rocket Countdown" "0.0" - "Rocket Delay" "1.0" - "Rocket Hit" "0" - "Rocket Hit Mode" "0" - "Rocket Mode" "1" - "Rocket Range" "150.0" - "Rocket Range Chance" "15.0" - "Rocket Range Cooldown" "0" + "Recall Blink Chance" "50.0" + "Recall Blink Cooldown" "0" + "Recall Blink Count" "5" + "Recall Blink Range" "150.0" + "Recall Rewind Chance" "100.0" + "Recall Rewind Cleanse" "1" + "Recall Rewind Cooldown" "5" + "Recall Rewind Lifetime" "30" + "Recall Rewind Mode" "0" + "Recall Rewind Threshold" "0.5" } } } @@ -25213,7 +24986,7 @@ ```
-##### Shake Ability +##### Recoil Ability
Click to expand! @@ -25222,20 +24995,17 @@ { "Tank #1" { - // The Mutant Tank shakes the survivors' screens. - // "Ability Enabled" - When a survivor is within range of the Mutant Tank, the survivor's screen is shaken. - // - "Shake Range" - // - "Shake Range Chance" - // - "Shake Range Cooldown" - // "Shake Death" - When the Mutant Tank dies or spawns, nearby survivors' screens are shaken. - // - "Shake Death Chance" - // - "Shake Death Range" - // "Shake Hit" - When a survivor is hit by the Mutant Tank's claw or rock, or a survivor hits the Mutant Tank with a melee weapon, the survivor's screen is shaken. - // - "Shake Chance" - // - "Shake Cooldown" - // - "Shake Hit Mode" - // Requires "mt_abilities2.smx" to be compiled with "mt_shake.sp" to work. - "Shake Ability" + // The Mutant Tank gives survivors strong gun recoil. + // "Ability Enabled" - When a survivor is within range of the Mutant Tank, the survivor experiences strong recoil. + // - "Recoil Range" + // - "Recoil Range Chance" + // - "Recoil Range Cooldown" + // "Recoil Hit" - When a survivor is hit by the Mutant Tank's claw or rock, or a survivor hits the Mutant Tank with a melee weapon, the survivor experiences strong recoil. + // - "Recoil Chance" + // - "Recoil Cooldown" + // - "Recoil Hit Mode" + // Requires "mt_abilities2.smx" to be compiled with "mt_recoil.sp" to work. + "Recoil Ability" { // Admins with one or more of these access flags have access to this ability. // Note: This setting can be overridden for specific players. @@ -25330,18 +25100,18 @@ // "farthest" - 99999.0 range "Open Areas Only" "0.0" - // The ability is only effective toward human survivors. + // The ability is only effective toward human-controlled survivors. // Note: This setting can be overridden for specific players. // -- // Minimum: 0 // Maximum: 32 // -- // 0: OFF - // 1-32: ON, the number of human survivors required to be present for this ability to be effective. + // 1-32: ON, the number of human-controlled survivors required to be present for this ability to be effective. "Requires Humans" "1" // Enable this ability. - // Note: This setting does not affect the "Shake Hit" setting. + // Note: This setting does not affect the "Recoil Hit" setting. // Note: This setting can be overridden for specific players. // -- // 0/"disabled"/"false"/"off"/"no": OFF @@ -25382,7 +25152,7 @@ // Maximum: 3 // -- // 0: OFF - // 1: Display message only when "Shake Hit" is enabled. + // 1: Display message only when "Recoil Hit" is enabled. // 2: Display message only when "Ability Enabled" is enabled. // -- // Keywords: @@ -25419,7 +25189,7 @@ // "maybe" - 50% chance // "often"/"likely"/"frequently" - 66.6% chance // "always" - 100% chance - "Shake Chance" "33.3" + "Recoil Chance" "33.3" // The cooldown for the Mutant Tank's hit ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -25433,61 +25203,21 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Shake Cooldown" "0" - - // Enable the Mutant Tank's upon-death range ability. - // Note: This setting does not need the "Ability Enabled" setting to be set to "1". - // Note: This setting can be overridden for specific players. - // -- - // Add up numbers together for different results. - // -- - // Minimum: 0 - // Maximum: 3 - // -- - // 0: OFF - // 1: Trigger the range ability when the Mutant Tank dies. - // 2: Trigger the range ability when the Mutant Tank spawns. - "Shake Death" "1" - - // The Mutant Tank has this many chances out of 100.0% to trigger the upon-death ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0.0 (No chance) - // Maximum: 100.0 (Highest chance) - // -- - // Keywords: - // "never" - 0% chance - // "sometimes"/"unlikely"/"seldom" - 33.3% chance - // "maybe" - 50% chance - // "often"/"likely"/"frequently" - 66.6% chance - // "always" - 100% chance - "Shake Death Chance" "33.3" - - // The distance between a survivor and the Mutant Tank needed to trigger the upon-death ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 1.0 (Closest) - // Maximum: 99999.0 (Farthest) - // -- - // Keywords: - // "closest" - 1.0 range - // "farthest" - 99999.0 range - "Shake Death Range" "200.0" + "Recoil Cooldown" "0" // The Mutant Tank's ability effects last this long. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- - // Minimum: 1 - // Maximum: 99999 + // Minimum: 0.1 + // Maximum: 99999.0 // -- // Keywords: + // "milli"/"millisecond" - 0.1 seconds // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Shake Duration" "5" + "Recoil Duration" "5.0" // Enable the Mutant Tank's claw/rock attack. // Note: This setting does not need the "Ability Enabled" setting to be set to "1". @@ -25495,34 +25225,20 @@ // -- // 0/"disabled"/"false"/"off"/"no": OFF // 1/"enabled"/"true"/"on"/"yes": ON - "Shake Hit" "0" + "Recoil Hit" "0" // The mode of the Mutant Tank's claw/rock attack. // Note: This setting can be overridden for specific players. // -- - // 0: Both - // 1: Ability activates when the Mutant Tank hits a survivor. - // 2: Ability activates when the Mutant Tank is hit by a survivor. - // -- - // Keywords: - // "both"/"all" - 0 - // "tank"/"attack" - 1 - // "survivor"/"hurt" - 2 - "Shake Hit Mode" "0" - - // The Mutant Tank shakes survivors' screems every time this many seconds passes. - // Note: This is ignored when the "Combo Ability" setting is set to "1". - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0.1 - // Maximum: 99999.0 - // -- + // 0: Both + // 1: Ability activates when the Mutant Tank hits a survivor. + // 2: Ability activates when the Mutant Tank is hit by a survivor. + // -- // Keywords: - // "milli"/"millisecond" - 0.1 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Shake Interval" "1.0" + // "both"/"all" - 0 + // "tank"/"attack" - 1 + // "survivor"/"hurt" - 2 + "Recoil Hit Mode" "0" // The distance between a survivor and the Mutant Tank needed to trigger the ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -25534,7 +25250,7 @@ // Keywords: // "closest" - 1.0 range // "farthest" - 99999.0 range - "Shake Range" "150.0" + "Recoil Range" "150.0" // The Mutant Tank has this many chances out of 100.0% to trigger the range ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -25549,7 +25265,7 @@ // "maybe" - 50% chance // "often"/"likely"/"frequently" - 66.6% chance // "always" - 100% chance - "Shake Range Chance" "15.0" + "Recoil Range Chance" "15.0" // The cooldown for the Mutant Tank's range ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -25563,11 +25279,11 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Shake Range Cooldown" "0" + "Recoil Range Cooldown" "0" "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" { - // Note: Override any of the settings in the "Shake Ability" section for each special infected here. + // Note: Override any of the settings in the "Recoil Ability" section for each special infected here. // Example "Access Flags" "" @@ -25584,18 +25300,14 @@ "Ability Effect" "0" "Ability Message" "0" "Ability Sight" "0" - "Shake Chance" "33.3" - "Shake Cooldown" "0" - "Shake Death" "1" - "Shake Death Chance" "33.3" - "Shake Death Range" "200.0" - "Shake Duration" "5" - "Shake Hit" "0" - "Shake Hit Mode" "0" - "Shake Interval" "1.0" - "Shake Range" "150.0" - "Shake Range Chance" "15.0" - "Shake Range Cooldown" "0" + "Recoil Chance" "33.3" + "Recoil Cooldown" "0" + "Recoil Duration" "5.0" + "Recoil Hit" "0" + "Recoil Hit Mode" "0" + "Recoil Range" "150.0" + "Recoil Range Chance" "15.0" + "Recoil Range Cooldown" "0" } } } @@ -25603,7 +25315,7 @@ ```
-##### Shield Ability +##### Regen Ability
Click to expand! @@ -25612,9 +25324,18 @@ { "Tank #1" { - // The Mutant Tank protects itself with a shield and throws propane tanks or gas cans. - // Requires "mt_abilities2.smx" to be compiled with "mt_shield.sp" to work. - "Shield Ability" + // The Mutant Tank leeches health off of survivors, regenerates health, gains health from hurting survivors, and can steal health from survivors and vice-versa. + // "Ability Enabled" - When a survivor is within range of the Mutant Tank, the survivor experiences strong recoil. + // - "Regen Health" + // - "Regen Interval" + // - "Regen Limit" + // - "Regen Range" + // "Regen Mode" - When a survivor is hit by the Mutant Tank's claw or rock, or a survivor hits the Mutant Tank with a melee weapon, they both gain/lose health. + // - "Regen Health" + // - "Regen Health Multiplier" + // - "Regen Max Health" + // Requires "mt_abilities2.smx" to be compiled with "mt_regen.sp" to work. + "Regen Ability" { // Admins with one or more of these access flags have access to this ability. // Note: This setting can be overridden for specific players. @@ -25700,8 +25421,9 @@ // The mode of how human-controlled Mutant Tanks activate their abilities. // Note: This setting can be overridden for specific players. // -- - // 0: Press buttons to activate corresponding abilities. Cooldown starts after ability is activated. + // 0: Press buttons to activate corresponding abilities. Cooldown starts after ability's duration ends. // 1: Hold down buttons to keep corresponding abilities activated. Cooldown starts after the player lets go of the buttons. + // 2: Press buttons to toggle corresponding abilities. Cooldown starts after ability is deactivated. "Human Mode" "1" // The ability can only activate in open areas. @@ -25716,15 +25438,15 @@ // "farthest" - 99999.0 range "Open Areas Only" "0.0" - // The ability is only effective toward human survivors. + // The ability is only effective toward human-controlled survivors. // Note: This setting can be overridden for specific players. // -- // Minimum: 0 // Maximum: 32 // -- // 0: OFF - // 1-32: ON, the number of human survivors required to be present for this ability to be effective. - "Requires Humans" "1" + // 1-32: ON, the number of human-controlled survivors required to be present for this ability to be effective. + "Requires Humans" "0" // Enable this ability. // Note: This setting can be overridden for specific players. @@ -25733,6 +25455,31 @@ // 1/"enabled"/"true"/"on"/"yes": ON "Ability Enabled" "0" + // Show a screen fade effect when the Mutant Tank uses its abilities. + // Note: The colors will randomly change between the colors set in the "Skin Color" and "Glow Color" settings. + // Note: This setting can be overridden for specific players. + // -- + // Add up numbers together for different results. + // -- + // Minimum: 0 + // Maximum: 7 + // -- + // 0: OFF + // 1: Show effect when the Mutant Tank uses its claw/rock attack. + // 2: Show effect when the Mutant Tank is hit by a melee weapon. + // 4: Show effect when the Mutant Tank uses its range ability. + // -- + // Keywords: + // "none"/"off" - 0 + // "attack" - 1 + // "hurt" - 2 + // "attack,hurt" - 3 + // "range" - 4 + // "attack,range" - 5 + // "hurt,range" - 6 + // "attack,hurt,range" - 7 + "Ability Effect" "0" + // Display a message whenever the ability activates/deactivates. // Note: This setting can be overridden for specific players. // -- @@ -25740,6 +25487,20 @@ // 1/"enabled"/"true"/"on"/"yes": ON "Ability Message" "0" + // Check line-of-sight when the Mutant Tank uses its abilities. + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0 + // Maximum: 5 + // -- + // 0: OFF + // 1: Check if there is a solid object between the Mutant Tank and survivors. + // 2: Option 1 + Check if the Mutant Tank is looking toward the survivors. + // 3: Option 1 + Check if the Mutant Tank is looking away from the survivors. + // 4: Option 1 + Check if the survivors are looking toward the Mutant Tank. + // 5: Option 1 + Check if the survivors are looking away from the Mutant Tank. + "Ability Sight" "0" + // The Mutant Tank has this many chances out of 100.0% to trigger the ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. @@ -25753,33 +25514,7 @@ // "maybe" - 50% chance // "often"/"likely"/"frequently" - 66.6% chance // "always" - 100% chance - "Shield Chance" "33.3" - - // This percentage of the Mutant Tank's shielded damage is converted into damage boost. - // Note: Damage boost can be decreased when using the right damage type against the shield. - // Note: Damage boost can be increased when using the wrong damage type against the shield. - // Note: Damage boost will instantly deplete when the shield breaks. - // Note: Boost = ((Damage x Shield Convert Percentage) / 10000.0) + 1.0 - // Example: Boost = ((8000.0 x 0.8) / 10000.0) + 1 = 1.64 - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0.0 (OFF) - // Maximum: 1.0 (Full) - "Shield Convert Percentage" "0.0" - - // These are the RGBA values of the Mutant Tank's shield prop's color. - // Note: Any value less than "0" will output a random color. - // Note: This setting can be overridden for specific players. - // -- - // 1st number = Red - // 2nd number = Green - // 3rd number = Blue - // 4th number = Alpha - // -- - // Keywords: - // "rainbow" - cycle through colors constantly. - "Shield Color" "255,255,255,255" - //"Shield Color" "all_shields" // Alternative (See "Colors" section) + "Regen Chance" "33.3" // The cooldown for the Mutant Tank's ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -25793,123 +25528,96 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Shield Cooldown" "0" + "Regen Cooldown" "0" - // The Mutant Tank's shield reactivates after this many seconds passes upon destroying the shield. + // The Mutant Tank's ability effects last this long. + // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- - // Minimum: 1 + // Minimum: 0 // Maximum: 99999 // -- // Keywords: // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Shield Delay" "5" + "Regen Duration" "0" - // Display the Mutant Tank's shield's health. + // The Mutant Tank regenerates this much health each time and receives this much health each time it hits a survivor and triggers the ability. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 - // Maximum: 11 + // Minimum: -1000000 + // Maximum: 1000000 // -- - // 0: OFF - // 1: ON, show name only. - // 2: ON, show health only. - // 3: ON, show health percentage only. - // 4: ON, show healthbar only. - // 5: ON, show name and health only. - // 6: ON, show name and health percentage only. - // 7: ON, show name and healthbar only. - // 8: ON, show health and healthbar only. - // 9: ON, show health percentage and healthbar only. - // 10: ON, show name, health, and healthbar. - // 11: ON, show name, health percentage, and healthbar. - "Shield Display Health" "11" + // Positive numbers: Current health + Regen health + // Negative numbers: Current health - Regen health + "Regen Health" "1" - // Display type of the Mutant Tank's shield's health. + // The health received by the Mutant Tank is multiplied by this value. + // Note: Health = Health x Vampire health multiplier + // Example: Health = 1000.0 x 5.0 = 5000.0 + // Note: Use the value "1.0" to disable this setting. (Health x 1.0 = Health) + // Note: This setting only applies if the "Regen Mode" setting is set to "1" or "3". // Note: This setting can be overridden for specific players. // -- - // 0: OFF - // 1: ON, show in hint text. - // 2: ON, show in center text. - "Shield Display Health Type" "2" + // Minimum: 1.0 + // Maximum: 99999.0 + "Regen Health Multiplier" "1.0" - // The Mutant Tank's ability effects last this long. + // The Mutant Tank regenerates health every time this many seconds passes. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 - // Maximum: 99999 + // Minimum: 0.1 + // Maximum: 99999.0 // -- // Keywords: + // "milli"/"millisecond" - 0.1 seconds // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Shield Duration" "0" + "Regen Interval" "1.0" - // The Mutant Tank's shield has a glow outline when activated. - // Note: Only available in Left 4 Dead 2. - // Note: This setting relies on the glow settings under the "Tank #/Glow" section. - // Note: The glow outline may not appear most of the time when the "Glow Type" setting is set to "0" because the shield must be fully visible to the player in order for the glow outline to appear. Since a part of the shield is always under the ground, it is only fully visible when the Tank is climbing or is in the air. + // The Mutant Tank stops regenerating health at this value. // Note: This setting can be overridden for specific players. // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Shield Glow" "1" + // Minimum: 1 + // Maximum: 1000000 + "Regen Limit" "1000000" - // The Mutant Tank's shield starts out with this much health. + // The survivors' max health. + // Note: Survivors will not gain health if they already have this much health. + // Note: This setting only applies if the "Regen Mode" setting is set to "2" or "3". // Note: This setting can be overridden for specific players. // -- - // 0: OFF - // 1-99999: The shield has this much health. - "Shield Health" "0" + // Minimum: 0 (OFF, use the value set by the game.) + // Maximum: 1000000 + "Regen Max Health" "100" - // The characters used to represent the health bar of the Mutant Tank's shield. - // Note: This setting only takes effect when the "Shield Display Health" setting is enabled. + // The mode of the Mutant Tank's regen ability. // Note: This setting can be overridden for specific players. // -- - // Separate characters with commas (","). - // -- - // Character limit: 2 - // Character limit for each character: 1 - // -- - // 1st character = Health indicator - // 2nd character = Damage indicator - "Shield Health Characters" "],=" + // 0: OFF + // 1: ON, the Mutant Tank can gain health from damaging survivors. + // 2: ON, the Mutant Tank can gain health by damaging or lose health by being damaged by survivors. + // 3: ON, the Mutant Tank can do both. + "Regen Mode" "0" - // The Mutant Tank has this many chances out of 100.0% to throw an explosive that can destroy its shield. + // The distance between a survivor and the Mutant Tank needed to trigger the ability. + // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.0 (No chance) - // Maximum: 100.0 (Highest chance) + // Minimum: 1.0 (Closest) + // Maximum: 99999.0 (Farthest) // -- // Keywords: - // "never" - 0% chance - // "sometimes"/"unlikely"/"seldom" - 33.3% chance - // "maybe" - 50% chance - // "often"/"likely"/"frequently" - 66.6% chance - // "always" - 100% chance - "Shield Throw Chance" "100.0" - - // The type of the Mutant Tank's shield. - // Note: This setting can be overridden for specific players. - // -- - // Add up numbers together for different results. - // -- - // Minimum: 0 - // Maximum: 15 - // -- - // 0: OFF - // 1: Bullet-based (Requires bullets to break shield.) - // 2: Blast-based (Requires explosives to break shield.) - // 4: Fire-based (Requires fires to break shield.) - // 8: Melee-based (Requires melee weapons to break shield.) - "Shield Type" "2" + // "closest" - 1.0 range + // "farthest" - 99999.0 range + "Regen Range" "150.0" "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" { - // Note: Override any of the settings in the "Shield Ability" section for each special infected here. + // Note: Override any of the settings in the "Regen Ability" section for each special infected here. // Example "Access Flags" "" @@ -25922,22 +25630,21 @@ "Human Duration" "5" "Human Mode" "1" "Open Areas Only" "0.0" - "Requires Humans" "1" + "Requires Humans" "0" "Ability Enabled" "0" + "Ability Effect" "0" "Ability Message" "0" - "Shield Chance" "33.3" - "Shield Convert Percentage" "0.0" - "Shield Color" "255,255,255,255" - "Shield Cooldown" "0" - "Shield Delay" "5" - "Shield Display Health" "11" - "Shield Display Health Type" "2" - "Shield Duration" "0" - "Shield Glow" "1" - "Shield Health" "0" - "Shield Health Characters" "],=" - "Shield Throw Chance" "100.0" - "Shield Type" "2" + "Ability Sight" "0" + "Regen Chance" "33.3" + "Regen Cooldown" "0" + "Regen Duration" "0" + "Regen Health" "1" + "Regen Health Multiplier" "1.0" + "Regen Interval" "1.0" + "Regen Limit" "1000000" + "Regen Max Health" "100" + "Regen Mode" "0" + "Regen Range" "150.0" } } } @@ -25945,7 +25652,7 @@ ```
-##### Shove Ability +##### Respawn Ability
Click to expand! @@ -25953,21 +25660,10 @@ "Mutant Tanks" { "Tank #1" - { - // The Mutant Tank repeatedly shoves survivors. - // "Ability Enabled" - When a survivor is within range of the Mutant Tank, the survivor is shoved repeatedly. - // - "Shove Range" - // - "Shove Range Chance" - // - "Shove Range Cooldown" - // "Shove Death" - When the Mutant Tank dies or spawns, nearby survivors are shoved. - // - "Shove Death Chance" - // - "Shove Death Range" - // "Shove Hit" - When a survivor is hit by the Mutant Tank's claw or rock, or a survivor hits the Mutant Tank with a melee weapon, the survivor is shoved repeatedly. - // - "Shove Chance" - // - "Shove Cooldown" - // - "Shove Hit Mode" - // Requires "mt_abilities2.smx" to be compiled with "mt_shove.sp" to work. - "Shove Ability" + { + // The Mutant Tank respawns upon death and resurrects nearby special infected that die. + // Requires "mt_abilities2.smx" to be compiled with "mt_respawn.sp" to work. + "Respawn Ability" { // Admins with one or more of these access flags have access to this ability. // Note: This setting can be overridden for specific players. @@ -25976,14 +25672,6 @@ // Not empty: These access flags have access. "Access Flags" "" - // Admins with one or more of these immunity flags are immune to this ability's effects. - // Note: If the Mutant Tank has one or more of these immunity flags or has the same immunity flags as the survivor victim, the immunity is cancelled. - // Note: This setting can be overridden for specific players. - // -- - // Empty: No immunity flags are immune. - // Not empty: These immunity flags are immune. - "Immunity Flags" "" - // The ability can only activate in close areas. // Note: Do not change this setting if you are unsure of how it works. // Note: This setting can be overridden for specific players. @@ -26037,18 +25725,26 @@ // "forever" - 99999 seconds "Human Cooldown" "0" - // Human-controlled Mutant Tanks must wait this long before using their range ability again. + // The Mutant Tank's ability effects last this long. + // Note: This setting does not affect human-controlled Mutant Tanks unless the "Human Mode" setting is set to "0". // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 (OFF) - // Maximum: 99999 (Longest) + // Minimum: 0 + // Maximum: 99999 // -- // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Human Range Cooldown" "0" + "Human Duration" "5" + + // The mode of how human-controlled Mutant Tanks activate their abilities. + // Note: This setting can be overridden for specific players. + // -- + // 0: Press buttons to activate corresponding abilities. Cooldown starts after ability's duration ends. + // 1: Hold down buttons to keep corresponding abilities activated. Cooldown starts after the player lets go of the buttons. + // 2: Press buttons to toggle corresponding abilities. Cooldown starts after ability is deactivated. + "Human Mode" "1" // The ability can only activate in open areas. // Note: Do not change this setting if you are unsure of how it works. @@ -26062,66 +25758,30 @@ // "farthest" - 99999.0 range "Open Areas Only" "0.0" - // The ability is only effective toward human survivors. + // The ability is only effective toward human-controlled survivors. // Note: This setting can be overridden for specific players. // -- // Minimum: 0 // Maximum: 32 // -- // 0: OFF - // 1-32: ON, the number of human survivors required to be present for this ability to be effective. + // 1-32: ON, the number of human-controlled survivors required to be present for this ability to be effective. "Requires Humans" "0" // Enable this ability. - // Note: This setting does not affect the "Shove Hit" setting. - // Note: This setting can be overridden for specific players. - // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Ability Enabled" "0" - - // Show a screen fade effect when the Mutant Tank uses its abilities. - // Note: The colors will randomly change between the colors set in the "Skin Color" and "Glow Color" settings. // Note: This setting can be overridden for specific players. // -- - // Add up numbers together for different results. - // -- - // Minimum: 0 - // Maximum: 7 - // -- // 0: OFF - // 1: Show effect when the Mutant Tank uses its claw/rock attack. - // 2: Show effect when the Mutant Tank is hit by a melee weapon. - // 4: Show effect when the Mutant Tank uses its range ability. - // -- - // Keywords: - // "none"/"off" - 0 - // "attack" - 1 - // "hurt" - 2 - // "attack,hurt" - 3 - // "range" - 4 - // "attack,range" - 5 - // "hurt,range" - 6 - // "attack,hurt,range" - 7 - "Ability Effect" "0" + // 1: ON, the Mutant Tank can respawn other special infected. + // 2: ON, the Mutant Tank can respawn itself. + // 3: ON, the Mutant Tank can do both. + "Ability Enabled" "0" // Display a message whenever the ability activates/deactivates. // Note: This setting can be overridden for specific players. // -- - // Add up numbers together for different results. - // -- - // Minimum: 0 - // Maximum: 3 - // -- - // 0: OFF - // 1: Display message only when "Shove Hit" is enabled. - // 2: Display message only when "Ability Enabled" is enabled. - // -- - // Keywords: - // "none"/"off" - 0 - // "hit" - 1 - // "ability" - 2 - // "both"/"all"/"hit,ability" - 3 + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON "Ability Message" "0" // Check line-of-sight when the Mutant Tank uses its abilities. @@ -26138,6 +25798,13 @@ // 5: Option 1 + Check if the survivors are looking away from the Mutant Tank. "Ability Sight" "0" + // The Mutant Tank respawns up to this many times. + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 1 + // Maximum: 99999 + "Respawn Amount" "1" + // The Mutant Tank has this many chances out of 100.0% to trigger the ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. @@ -26151,9 +25818,9 @@ // "maybe" - 50% chance // "often"/"likely"/"frequently" - 66.6% chance // "always" - 100% chance - "Shove Chance" "33.3" + "Respawn Chance" "33.3" - // The cooldown for the Mutant Tank's hit ability. + // The cooldown for the Mutant Tank's ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- @@ -26165,98 +25832,39 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Shove Cooldown" "0" - - // Enable the Mutant Tank's upon-death range ability. - // Note: This setting does not need the "Ability Enabled" setting to be set to "1". - // Note: This setting can be overridden for specific players. - // -- - // Add up numbers together for different results. - // -- - // Minimum: 0 - // Maximum: 3 - // -- - // 0: OFF - // 1: Trigger the range ability when the Mutant Tank dies. - // 2: Trigger the range ability when the Mutant Tank spawns. - "Shove Death" "1" - - // The Mutant Tank has this many chances out of 100.0% to trigger the upon-death ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0.0 (No chance) - // Maximum: 100.0 (Highest chance) - // -- - // Keywords: - // "never" - 0% chance - // "sometimes"/"unlikely"/"seldom" - 33.3% chance - // "maybe" - 50% chance - // "often"/"likely"/"frequently" - 66.6% chance - // "always" - 100% chance - "Shove Death Chance" "33.3" - - // The distance between a survivor and the Mutant Tank needed to trigger the upon-death ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 1.0 (Closest) - // Maximum: 99999.0 (Farthest) - // -- - // Keywords: - // "closest" - 1.0 range - // "farthest" - 99999.0 range - "Shove Death Range" "200.0" + "Respawn Cooldown" "0" // The Mutant Tank's ability effects last this long. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- - // Minimum: 1 + // Minimum: 0 // Maximum: 99999 // -- // Keywords: // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Shove Duration" "5" - - // Enable the Mutant Tank's claw/rock attack. - // Note: This setting does not need the "Ability Enabled" setting to be set to "1". - // Note: This setting can be overridden for specific players. - // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Shove Hit" "0" + "Respawn Duration" "0" - // The mode of the Mutant Tank's claw/rock attack. + // The filter for the Mutant Tank's necromancy. // Note: This setting can be overridden for specific players. // -- - // 0: Both - // 1: Ability activates when the Mutant Tank hits a survivor. - // 2: Ability activates when the Mutant Tank is hit by a survivor. - // -- - // Keywords: - // "both"/"all" - 0 - // "tank"/"attack" - 1 - // "survivor"/"hurt" - 2 - "Shove Hit Mode" "0" - - // The Mutant Tank shoves survivors every time this many seconds passes. - // Note: This is ignored when the "Combo Ability" setting is set to "1". - // Note: This setting can be overridden for specific players. + // Add up numbers together for different results. // -- - // Minimum: 0.1 - // Maximum: 99999.0 + // Minimum: 0 + // Maximum: 63 // -- - // Keywords: - // "milli"/"millisecond" - 0.1 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Shove Interval" "1.0" + // 0 OR 63: All filters. + // 1: Smoker + // 2: Boomer + // 4: Hunter + // 8: Spitter (Only available in Left 4 Dead 2.) + // 16: Jockey (Only available in Left 4 Dead 2.) + // 32: Charger (Only available in Left 4 Dead 2.) + "Respawn Filter" "0" - // The distance between a survivor and the Mutant Tank needed to trigger the ability. + // The distance between a special infected and the Mutant Tank needed to trigger the ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- @@ -26266,68 +25874,59 @@ // Keywords: // "closest" - 1.0 range // "farthest" - 99999.0 range - "Shove Range" "150.0" + "Respawn Range" "500.0" - // The Mutant Tank has this many chances out of 100.0% to trigger the range ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // The type that the Mutant Tank will respawn as. + // Note: Chosen types that also have the Respawn ability will be replaced with the Mutant Tank's own type to prevent bugs. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.0 (No chance) - // Maximum: 100.0 (Highest chance) + // Separate values with "-". // -- - // Keywords: - // "never" - 0% chance - // "sometimes"/"unlikely"/"seldom" - 33.3% chance - // "maybe" - 50% chance - // "often"/"likely"/"frequently" - 66.6% chance - // "always" - 100% chance - "Shove Range Chance" "15.0" - - // The cooldown for the Mutant Tank's range ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". - // Note: This setting can be overridden for specific players. + // Value limit: 2 + // Character limit for each value: 4 // -- - // Minimum: 0 (OFF) - // Maximum: 99999 (Longest) + // Minimum number for each value: 0 (OFF) + // Maximum number for each value: 500 // -- - // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Shove Range Cooldown" "0" + // 1st number = Minimum value + // 2nd number = Maximum value + // -- + // Example: "0-0" (Do not choose from any Mutant Tank types.) + // Example: "1-25" (Choose a Mutant Tank type between 1 through 25.) + // Example: "50-0" (Automatically change to "0-0" because "50" is higher than "0".) + // Example: "1-1000" (Automatically change to "1-500" because "500" is the maximum number of Mutant Tank types allowed.) + // Example: "0" (Automatically change to "0-500" because the maximum range is not specified.) + // Example: "1000" (Automatically change to "500-500" because the maximum range is not specified and the minimum range exceeds the "500" limit.) + // -- + // 0: OFF, use the randomization feature. + // 1-500: ON, the type to respawn as. + "Respawn Type" "0-0" "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" { - // Note: Override any of the settings in the "Shove Ability" section for each special infected here. + // Note: Override any of the settings in the "Respawn Ability" section for each special infected here. // Example "Access Flags" "" - "Immunity Flags" "" "Close Areas Only" "0.0" "Combo Ability" "0" "Human Ability" "0" "Human Ammo" "5" "Human Cooldown" "0" - "Human Range Cooldown" "0" + "Human Duration" "5" + "Human Mode" "1" "Open Areas Only" "0.0" "Requires Humans" "0" "Ability Enabled" "0" - "Ability Effect" "0" "Ability Message" "0" "Ability Sight" "0" - "Shove Chance" "33.3" - "Shove Cooldown" "0" - "Shove Death" "1" - "Shove Death Chance" "33.3" - "Shove Death Range" "200.0" - "Shove Duration" "5" - "Shove Hit" "0" - "Shove Hit Mode" "0" - "Shove Interval" "1.0" - "Shove Range" "150.0" - "Shove Range Chance" "15.0" - "Shove Range Cooldown" "0" + "Respawn Amount" "1" + "Respawn Chance" "33.3" + "Respawn Cooldown" "0" + "Respawn Duration" "0" + "Respawn Filter" "0" + "Respawn Range" "500.0" + "Respawn Type" "0-0" } } } @@ -26335,7 +25934,7 @@ ```
-##### Slow Ability +##### Restart Ability
Click to expand! @@ -26344,17 +25943,17 @@ { "Tank #1" { - // The Mutant Tank slows survivors down. - // "Ability Enabled" - When a survivor is within range of the Mutant Tank, the survivor is slowed down. - // - "Slow Range" - // - "Slow Range Chance" - // - "Slow Range Cooldown" - // "Slow Hit" - When a survivor is hit by the Mutant Tank's claw or rock, or a survivor hits the Mutant Tank with a melee weapon, the survivor is slowed down. - // - "Slow Chance" - // - "Slow Cooldown" - // - "Slow Hit Mode" - // Requires "mt_abilities2.smx" to be compiled with "mt_slow.sp" to work. - "Slow Ability" + // The Mutant Tank forces survivors to restart at the beginning of the map or near a teammate with a new loadout. + // "Ability Enabled" - When a survivor is within range of the Mutant Tank, the survivor respawns at the start of the map or near a teammate. + // - "Restart Range" + // - "Restart Range Chance" + // - "Restart Range Cooldown" + // "Restart Hit" - When a survivor is hit by the Mutant Tank's claw or rock, or a survivor hits the Mutant Tank with a melee weapon, the survivor respawns at the start of the map or near a teammate. + // - "Restart Chance" + // - "Restart Cooldown" + // - "Restart Hit Mode" + // Requires "mt_abilities2.smx" to be compiled with "mt_restart.sp" to work. + "Restart Ability" { // Admins with one or more of these access flags have access to this ability. // Note: This setting can be overridden for specific players. @@ -26449,18 +26048,18 @@ // "farthest" - 99999.0 range "Open Areas Only" "0.0" - // The ability is only effective toward human survivors. + // The ability is only effective toward human-controlled survivors. // Note: This setting can be overridden for specific players. // -- // Minimum: 0 // Maximum: 32 // -- // 0: OFF - // 1-32: ON, the number of human survivors required to be present for this ability to be effective. + // 1-32: ON, the number of human-controlled survivors required to be present for this ability to be effective. "Requires Humans" "0" // Enable this ability. - // Note: This setting does not affect the "Slow Hit" setting. + // Note: This setting does not affect the "Restart Hit" setting. // Note: This setting can be overridden for specific players. // -- // 0/"disabled"/"false"/"off"/"no": OFF @@ -26501,7 +26100,7 @@ // Maximum: 3 // -- // 0: OFF - // 1: Display message only when "Slow Hit" is enabled. + // 1: Display message only when "Restart Hit" is enabled. // 2: Display message only when "Ability Enabled" is enabled. // -- // Keywords: @@ -26538,7 +26137,7 @@ // "maybe" - 50% chance // "often"/"likely"/"frequently" - 66.6% chance // "always" - 100% chance - "Slow Chance" "33.3" + "Restart Chance" "33.3" // The cooldown for the Mutant Tank's hit ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -26552,21 +26151,7 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Slow Cooldown" "0" - - // The Mutant Tank's ability effects last this long. - // Note: This is ignored when the "Combo Ability" setting is set to "1". - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0.1 - // Maximum: 99999.0 - // -- - // Keywords: - // "milli"/"millisecond" - 0.1 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Slow Duration" "5.0" + "Restart Cooldown" "0" // Enable the Mutant Tank's claw/rock attack. // Note: This setting does not need the "Ability Enabled" setting to be set to "1". @@ -26574,7 +26159,7 @@ // -- // 0/"disabled"/"false"/"off"/"no": OFF // 1/"enabled"/"true"/"on"/"yes": ON - "Slow Hit" "0" + "Restart Hit" "0" // The mode of the Mutant Tank's claw/rock attack. // Note: This setting can be overridden for specific players. @@ -26587,14 +26172,25 @@ // "both"/"all" - 0 // "tank"/"attack" - 1 // "survivor"/"hurt" - 2 - "Slow Hit Mode" "0" + "Restart Hit Mode" "0" - // The Mutant Tank prevents survivors from walking up inclines (ramps, stairs, etc.) while slowed down. + // The Mutant Tank makes survivors restart with this loadout. // Note: This setting can be overridden for specific players. // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Slow Incline" "1" + // Item limit: 5 + // Character limit for each item: 64 + // -- + // Example: "smg_silenced,pistol,adrenaline,defibrillator" + // Example: "katana,pain_pills,vomitjar" + // Example: "first_aid_kit,defibrillator,knife,adrenaline" + "Restart Loadout" "smg,pistol,pain_pills" + + // The mode of the Mutant Tank's restart ability. + // Note: This setting can be overridden for specific players. + // -- + // 0: Survivors are teleported to the spawn area. + // 1: Survivors are teleported to another teammate. + "Restart Mode" "1" // The distance between a survivor and the Mutant Tank needed to trigger the ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -26606,7 +26202,7 @@ // Keywords: // "closest" - 1.0 range // "farthest" - 99999.0 range - "Slow Range" "150.0" + "Restart Range" "150.0" // The Mutant Tank has this many chances out of 100.0% to trigger the range ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -26621,7 +26217,7 @@ // "maybe" - 50% chance // "often"/"likely"/"frequently" - 66.6% chance // "always" - 100% chance - "Slow Range Chance" "15.0" + "Restart Range Chance" "15.0" // The cooldown for the Mutant Tank's range ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -26635,19 +26231,11 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Slow Range Cooldown" "0" - - // The Mutant Tank sets the survivors' run speed to this value. - // Note: This is ignored when the "Combo Ability" setting is set to "1". - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0.1 - // Maximum: 0.99 - "Slow Speed" "0.25" + "Restart Range Cooldown" "0" "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" { - // Note: Override any of the settings in the "Slow Ability" section for each special infected here. + // Note: Override any of the settings in the "Restart Ability" section for each special infected here. // Example "Access Flags" "" @@ -26664,16 +26252,15 @@ "Ability Effect" "0" "Ability Message" "0" "Ability Sight" "0" - "Slow Chance" "33.3" - "Slow Cooldown" "0" - "Slow Duration" "5.0" - "Slow Hit" "0" - "Slow Hit Mode" "0" - "Slow Incline" "1" - "Slow Range" "150.0" - "Slow Range Chance" "15.0" - "Slow Range Cooldown" "0" - "Slow Speed" "0.25" + "Restart Chance" "33.3" + "Restart Cooldown" "0" + "Restart Hit" "0" + "Restart Hit Mode" "0" + "Restart Loadout" "smg,pistol,pain_pills" + "Restart Mode" "1" + "Restart Range" "150.0" + "Restart Range Chance" "15.0" + "Restart Range Cooldown" "0" } } } @@ -26681,7 +26268,7 @@ ```
-##### Smash Ability +##### Rock Ability
Click to expand! @@ -26690,17 +26277,9 @@ { "Tank #1" { - // The Mutant Tank smashes survivors to death. - // "Ability Enabled" - When a survivor is within range of the Mutant Tank, the survivor is smashed to death. - // - "Smash Range" - // - "Smash Range Chance" - // - "Smash Range Cooldown" - // "Smash Hit" - When a survivor is hit by the Mutant Tank's claw or rock, or a survivor hits the Mutant Tank with a melee weapon, the survivor is smashed to death. - // - "Smash Chance" - // - "Smash Cooldown" - // - "Smash Hit Mode" - // Requires "mt_abilities2.smx" to be compiled with "mt_smash.sp" to work. - "Smash Ability" + // The Mutant Tank creates rock showers and spams rocks at survivors. + // Requires "mt_abilities2.smx" to be compiled with "mt_rock.sp" to work. + "Rock Ability" { // Admins with one or more of these access flags have access to this ability. // Note: This setting can be overridden for specific players. @@ -26770,18 +26349,26 @@ // "forever" - 99999 seconds "Human Cooldown" "0" - // Human-controlled Mutant Tanks must wait this long before using their range ability again. + // The Mutant Tank's ability effects last this long. + // Note: This setting does not affect human-controlled Mutant Tanks unless the "Human Mode" setting is set to "0". // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 (OFF) - // Maximum: 99999 (Longest) + // Minimum: 0 + // Maximum: 99999 // -- // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Human Range Cooldown" "0" + "Human Duration" "5" + + // The mode of how human-controlled Mutant Tanks activate their abilities. + // Note: This setting can be overridden for specific players. + // -- + // 0: Press buttons to activate corresponding abilities. Cooldown starts after ability's duration ends. + // 1: Hold down buttons to keep corresponding abilities activated. Cooldown starts after the player lets go of the buttons. + // 2: Press buttons to toggle corresponding abilities. Cooldown starts after ability is deactivated. + "Human Mode" "1" // The ability can only activate in open areas. // Note: Do not change this setting if you are unsure of how it works. @@ -26795,89 +26382,29 @@ // "farthest" - 99999.0 range "Open Areas Only" "0.0" - // The ability is only effective toward human survivors. + // The ability is only effective toward human-controlled survivors. // Note: This setting can be overridden for specific players. // -- // Minimum: 0 // Maximum: 32 // -- // 0: OFF - // 1-32: ON, the number of human survivors required to be present for this ability to be effective. - "Requires Humans" "0" + // 1-32: ON, the number of human-controlled survivors required to be present for this ability to be effective. + "Requires Humans" "1" // Enable this ability. - // Note: This setting does not affect the "Smash Hit" setting. // Note: This setting can be overridden for specific players. // -- // 0/"disabled"/"false"/"off"/"no": OFF // 1/"enabled"/"true"/"on"/"yes": ON "Ability Enabled" "0" - // Show a screen fade effect when the Mutant Tank uses its abilities. - // Note: The colors will randomly change between the colors set in the "Skin Color" and "Glow Color" settings. - // Note: This setting can be overridden for specific players. - // -- - // Add up numbers together for different results. - // -- - // Minimum: 0 - // Maximum: 7 - // -- - // 0: OFF - // 1: Show effect when the Mutant Tank uses its claw/rock attack. - // 2: Show effect when the Mutant Tank is hit by a melee weapon. - // 4: Show effect when the Mutant Tank uses its range ability. - // -- - // Keywords: - // "none"/"off" - 0 - // "attack" - 1 - // "hurt" - 2 - // "attack,hurt" - 3 - // "range" - 4 - // "attack,range" - 5 - // "hurt,range" - 6 - // "attack,hurt,range" - 7 - "Ability Effect" "0" - // Display a message whenever the ability activates/deactivates. // Note: This setting can be overridden for specific players. // -- - // Add up numbers together for different results. - // -- - // Minimum: 0 - // Maximum: 3 - // -- - // 0: OFF - // 1: Display message only when "Smash Hit" is enabled. - // 2: Display message only when "Ability Enabled" is enabled. - // -- - // Keywords: - // "none"/"off" - 0 - // "hit" - 1 - // "ability" - 2 - // "both"/"all"/"hit,ability" - 3 - "Ability Message" "0" - - // Check line-of-sight when the Mutant Tank uses its abilities. - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0 - // Maximum: 5 - // -- - // 0: OFF - // 1: Check if there is a solid object between the Mutant Tank and survivors. - // 2: Option 1 + Check if the Mutant Tank is looking toward the survivors. - // 3: Option 1 + Check if the Mutant Tank is looking away from the survivors. - // 4: Option 1 + Check if the survivors are looking toward the Mutant Tank. - // 5: Option 1 + Check if the survivors are looking away from the Mutant Tank. - "Ability Sight" "0" - - // Removes the death model of the survivor when killed. - // Note: Only available in Left 4 Dead 2. - // Note: This setting can be overridden for specific players. - // -- // 0/"disabled"/"false"/"off"/"no": OFF // 1/"enabled"/"true"/"on"/"yes": ON - "Smash Body" "1" + "Ability Message" "0" // The Mutant Tank has this many chances out of 100.0% to trigger the ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -26892,9 +26419,9 @@ // "maybe" - 50% chance // "often"/"likely"/"frequently" - 66.6% chance // "always" - 100% chance - "Smash Chance" "33.3" + "Rock Chance" "33.3" - // The cooldown for the Mutant Tank's hit ability. + // The cooldown for the Mutant Tank's ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- @@ -26906,93 +26433,65 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Smash Cooldown" "0" - - // Enable the Mutant Tank's claw/rock attack. - // Note: This setting does not need the "Ability Enabled" setting to be set to "1". - // Note: This setting can be overridden for specific players. - // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Smash Hit" "0" + "Rock Cooldown" "0" - // The mode of the Mutant Tank's claw/rock attack. + // The Mutant Tank's rocks do this much damage. + // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- - // 0: Both - // 1: Ability activates when the Mutant Tank hits a survivor. - // 2: Ability activates when the Mutant Tank is hit by a survivor. + // Minimum: 0 (OFF) + // Maximum: 99999 // -- // Keywords: - // "both"/"all" - 0 - // "tank"/"attack" - 1 - // "survivor"/"hurt" - 2 - "Smash Hit Mode" "0" - - // The amount of damage required to power up the Mutant Tank's smash ability. - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0.0 (OFF) - // Maximum: 99999.0 - "Smash Meter" "0.0" + // "weakest" - 1.0 damage + // "strongest" - 99999.0 damage + "Rock Damage" "5" - // The mode of the Mutant Tank's smash ability. + // The Mutant Tank's ability effects last this long. + // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- - // Add up numbers together for different results. - // -- // Minimum: 0 - // Maximum: 3 + // Maximum: 99999 // -- - // 0 OR 3: Pick randomly between killing and incapacitating. - // 1: Kill instantly. - // 2: Incapacitate only. - "Smash Mode" "1" + // Keywords: + // "second" - 1 second + // "minute" - 1 minute + // "forever" - 99999 seconds + "Rock Duration" "5" - // The distance between a survivor and the Mutant Tank needed to trigger the ability. + // The Mutant Tank's rock shower drops a rock every time this many seconds passes. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- - // Minimum: 1.0 (Closest) - // Maximum: 99999.0 (Farthest) - // -- - // Keywords: - // "closest" - 1.0 range - // "farthest" - 99999.0 range - "Smash Range" "150.0" + // Minimum: 0.1 + // Maximum: 1.0 + "Rock Interval" "0.2" - // The Mutant Tank has this many chances out of 100.0% to trigger the range ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // The mode of the Mutant Tank's rock ability. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.0 (No chance) - // Maximum: 100.0 (Highest chance) - // -- - // Keywords: - // "never" - 0% chance - // "sometimes"/"unlikely"/"seldom" - 33.3% chance - // "maybe" - 50% chance - // "often"/"likely"/"frequently" - 66.6% chance - // "always" - 100% chance - "Smash Range Chance" "15.0" + // 0: Both types of rock spam. + // 1: Create rock showers. + // 2: Spam overhead rocks. + "Rock Mode" "0" - // The cooldown for the Mutant Tank's range ability. + // The radius of the Mutant Tank's rock shower. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 (OFF) - // Maximum: 99999 (Longest) + // 1st number = Minimum radius + // Minimum: -5.0 + // Maximum: 0.0 // -- - // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Smash Range Cooldown" "0" + // 2nd number = Maximum radius + // Minimum: 0.0 + // Maximum: 5.0 + "Rock Radius" "-1.25,1.25" "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" { - // Note: Override any of the settings in the "Smash Ability" section for each special infected here. + // Note: Override any of the settings in the "Rock Ability" section for each special infected here. // Example "Access Flags" "" @@ -27002,23 +26501,19 @@ "Human Ability" "0" "Human Ammo" "5" "Human Cooldown" "0" - "Human Range Cooldown" "0" + "Human Duration" "5" + "Human Mode" "1" "Open Areas Only" "0.0" - "Requires Humans" "0" + "Requires Humans" "1" "Ability Enabled" "0" - "Ability Effect" "0" "Ability Message" "0" - "Ability Sight" "0" - "Smash Body" "1" - "Smash Chance" "33.3" - "Smash Cooldown" "0" - "Smash Hit" "0" - "Smash Hit Mode" "0" - "Smash Meter" "0.0" - "Smash Mode" "1" - "Smash Range" "150.0" - "Smash Range Chance" "15.0" - "Smash Range Cooldown" "0" + "Rock Chance" "33.3" + "Rock Cooldown" "0" + "Rock Damage" "5" + "Rock Duration" "5" + "Rock Interval" "0.2" + "Rock Mode" "0" + "Rock Radius" "-1.25,1.25" } } } @@ -27026,7 +26521,7 @@ ```
-##### Smite Ability +##### Shield Ability
Click to expand! @@ -27035,17 +26530,9 @@ { "Tank #1" { - // The Mutant Tank smites survivors. - // "Ability Enabled" - When a survivor is within range of the Mutant Tank, the survivor is smitten. - // - "Smite Range" - // - "Smite Range Chance" - // - "Smite Range Cooldown" - // "Smite Hit" - When a survivor is hit by the Mutant Tank's claw or rock, or a survivor hits the Mutant Tank with a melee weapon, the survivor is smitten. - // - "Smite Chance" - // - "Smite Cooldown" - // - "Smite Hit Mode" - // Requires "mt_abilities2.smx" to be compiled with "mt_smite.sp" to work. - "Smite Ability" + // The Mutant Tank protects itself with a shield and throws propane tanks or gas cans. + // Requires "mt_abilities2.smx" to be compiled with "mt_shield.sp" to work. + "Shield Ability" { // Admins with one or more of these access flags have access to this ability. // Note: This setting can be overridden for specific players. @@ -27115,18 +26602,26 @@ // "forever" - 99999 seconds "Human Cooldown" "0" - // Human-controlled Mutant Tanks must wait this long before using their range ability again. + // The Mutant Tank's ability effects last this long. + // Note: This setting does not affect human-controlled Mutant Tanks unless the "Human Mode" setting is set to "0". // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 (OFF) - // Maximum: 99999 (Longest) + // Minimum: 0 + // Maximum: 99999 // -- // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Human Range Cooldown" "0" + "Human Duration" "5" + + // The mode of how human-controlled Mutant Tanks activate their abilities. + // Note: This setting can be overridden for specific players. + // -- + // 0: Press buttons to activate corresponding abilities. Cooldown starts after ability is activated. + // 1: Hold down buttons to keep corresponding abilities activated. Cooldown starts after the player lets go of the buttons. + // 2: Press buttons to toggle corresponding abilities. Cooldown starts after ability is deactivated. + "Human Mode" "1" // The ability can only activate in open areas. // Note: Do not change this setting if you are unsure of how it works. @@ -27140,89 +26635,29 @@ // "farthest" - 99999.0 range "Open Areas Only" "0.0" - // The ability is only effective toward human survivors. + // The ability is only effective toward human-controlled survivors. // Note: This setting can be overridden for specific players. // -- // Minimum: 0 // Maximum: 32 // -- // 0: OFF - // 1-32: ON, the number of human survivors required to be present for this ability to be effective. - "Requires Humans" "0" + // 1-32: ON, the number of human-controlled survivors required to be present for this ability to be effective. + "Requires Humans" "1" // Enable this ability. - // Note: This setting does not affect the "Smite Hit" setting. // Note: This setting can be overridden for specific players. // -- // 0/"disabled"/"false"/"off"/"no": OFF // 1/"enabled"/"true"/"on"/"yes": ON "Ability Enabled" "0" - // Show a screen fade effect when the Mutant Tank uses its abilities. - // Note: The colors will randomly change between the colors set in the "Skin Color" and "Glow Color" settings. - // Note: This setting can be overridden for specific players. - // -- - // Add up numbers together for different results. - // -- - // Minimum: 0 - // Maximum: 7 - // -- - // 0: OFF - // 1: Show effect when the Mutant Tank uses its claw/rock attack. - // 2: Show effect when the Mutant Tank is hit by a melee weapon. - // 4: Show effect when the Mutant Tank uses its range ability. - // -- - // Keywords: - // "none"/"off" - 0 - // "attack" - 1 - // "hurt" - 2 - // "attack,hurt" - 3 - // "range" - 4 - // "attack,range" - 5 - // "hurt,range" - 6 - // "attack,hurt,range" - 7 - "Ability Effect" "0" - // Display a message whenever the ability activates/deactivates. // Note: This setting can be overridden for specific players. // -- - // Add up numbers together for different results. - // -- - // Minimum: 0 - // Maximum: 3 - // -- - // 0: OFF - // 1: Display message only when "Smite Hit" is enabled. - // 2: Display message only when "Ability Enabled" is enabled. - // -- - // Keywords: - // "none"/"off" - 0 - // "hit" - 1 - // "ability" - 2 - // "both"/"all"/"hit,ability" - 3 - "Ability Message" "0" - - // Check line-of-sight when the Mutant Tank uses its abilities. - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0 - // Maximum: 5 - // -- - // 0: OFF - // 1: Check if there is a solid object between the Mutant Tank and survivors. - // 2: Option 1 + Check if the Mutant Tank is looking toward the survivors. - // 3: Option 1 + Check if the Mutant Tank is looking away from the survivors. - // 4: Option 1 + Check if the survivors are looking toward the Mutant Tank. - // 5: Option 1 + Check if the survivors are looking away from the Mutant Tank. - "Ability Sight" "0" - - // Removes the death model of the survivor when killed. - // Note: Only available in Left 4 Dead 2. - // Note: This setting can be overridden for specific players. - // -- // 0/"disabled"/"false"/"off"/"no": OFF // 1/"enabled"/"true"/"on"/"yes": ON - "Smite Body" "1" + "Ability Message" "0" // The Mutant Tank has this many chances out of 100.0% to trigger the ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -27237,9 +26672,35 @@ // "maybe" - 50% chance // "often"/"likely"/"frequently" - 66.6% chance // "always" - 100% chance - "Smite Chance" "33.3" + "Shield Chance" "33.3" - // The cooldown for the Mutant Tank's hit ability. + // This percentage of the Mutant Tank's shielded damage is converted into damage boost. + // Note: Damage boost can be decreased when using the right damage type against the shield. + // Note: Damage boost can be increased when using the wrong damage type against the shield. + // Note: Damage boost will instantly deplete when the shield breaks. + // Note: Boost = ((Damage x Shield Convert Percentage) / 10000.0) + 1.0 + // Example: Boost = ((8000.0 x 0.8) / 10000.0) + 1 = 1.64 + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0.0 (OFF) + // Maximum: 1.0 (Full) + "Shield Convert Percentage" "0.0" + + // These are the RGBA values of the Mutant Tank's shield prop's color. + // Note: Any value less than "0" will output a random color. + // Note: This setting can be overridden for specific players. + // -- + // 1st number = Red + // 2nd number = Green + // 3rd number = Blue + // 4th number = Alpha + // -- + // Keywords: + // "rainbow" - cycle through colors constantly. + "Shield Color" "255,255,255,255" + //"Shield Color" "all_shields" // Alternative (See "Colors" section) + + // The cooldown for the Mutant Tank's ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- @@ -27251,70 +26712,92 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Smite Cooldown" "0" + "Shield Cooldown" "0" - // The countdown before activating the Mutant Tank's smite ability. - // Note: During the countdown phase, survivors can heal themselves to avoid dying. + // The Mutant Tank's shield reactivates after this many seconds passes upon destroying the shield. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.0 (OFF) - // Maximum: 99999.0 + // Minimum: 1 + // Maximum: 99999 // -- // Keywords: - // "milli"/"millisecond" - 0.1 seconds // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Smite Countdown" "0.0" + "Shield Delay" "5" - // Enable the Mutant Tank's claw/rock attack. - // Note: This setting does not need the "Ability Enabled" setting to be set to "1". + // Display the Mutant Tank's shield's health. // Note: This setting can be overridden for specific players. // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Smite Hit" "0" + // Minimum: 0 + // Maximum: 11 + // -- + // 0: OFF + // 1: ON, show name only. + // 2: ON, show health only. + // 3: ON, show health percentage only. + // 4: ON, show healthbar only. + // 5: ON, show name and health only. + // 6: ON, show name and health percentage only. + // 7: ON, show name and healthbar only. + // 8: ON, show health and healthbar only. + // 9: ON, show health percentage and healthbar only. + // 10: ON, show name, health, and healthbar. + // 11: ON, show name, health percentage, and healthbar. + "Shield Display Health" "11" - // The mode of the Mutant Tank's claw/rock attack. + // Display type of the Mutant Tank's shield's health. // Note: This setting can be overridden for specific players. // -- - // 0: Both - // 1: Ability activates when the Mutant Tank hits a survivor. - // 2: Ability activates when the Mutant Tank is hit by a survivor. + // 0: OFF + // 1: ON, show in hint text. + // 2: ON, show in center text. + "Shield Display Health Type" "2" + + // The Mutant Tank's ability effects last this long. + // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0 + // Maximum: 99999 // -- // Keywords: - // "both"/"all" - 0 - // "tank"/"attack" - 1 - // "survivor"/"hurt" - 2 - "Smite Hit Mode" "0" + // "second" - 1 second + // "minute" - 1 minute + // "forever" - 99999 seconds + "Shield Duration" "0" - // The mode of the Mutant Tank's smite ability. + // The Mutant Tank's shield has a glow outline when activated. + // Note: Only available in Left 4 Dead 2. + // Note: This setting relies on the glow settings under the "Tank #/Glow" section. + // Note: The glow outline may not appear most of the time when the "Glow Type" setting is set to "0" because the shield must be fully visible to the player in order for the glow outline to appear. Since a part of the shield is always under the ground, it is only fully visible when the Tank is climbing or is in the air. // Note: This setting can be overridden for specific players. // -- - // Add up numbers together for different results. - // -- - // Minimum: 0 - // Maximum: 3 + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Shield Glow" "1" + + // The Mutant Tank's shield starts out with this much health. + // Note: This setting can be overridden for specific players. // -- - // 0 OR 3: Pick randomly between killing and incapacitating. - // 1: Kill instantly. - // 2: Incapacitate only. - "Smite Mode" "1" + // 0: OFF + // 1-99999: The shield has this much health. + "Shield Health" "0" - // The distance between a survivor and the Mutant Tank needed to trigger the ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // The characters used to represent the health bar of the Mutant Tank's shield. + // Note: This setting only takes effect when the "Shield Display Health" setting is enabled. // Note: This setting can be overridden for specific players. // -- - // Minimum: 1.0 (Closest) - // Maximum: 99999.0 (Farthest) + // Separate characters with commas (","). // -- - // Keywords: - // "closest" - 1.0 range - // "farthest" - 99999.0 range - "Smite Range" "150.0" + // Character limit: 2 + // Character limit for each character: 1 + // -- + // 1st character = Health indicator + // 2nd character = Damage indicator + "Shield Health Characters" "],=" - // The Mutant Tank has this many chances out of 100.0% to trigger the range ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // The Mutant Tank has this many chances out of 100.0% to throw an explosive that can destroy its shield. // Note: This setting can be overridden for specific players. // -- // Minimum: 0.0 (No chance) @@ -27326,25 +26809,26 @@ // "maybe" - 50% chance // "often"/"likely"/"frequently" - 66.6% chance // "always" - 100% chance - "Smite Range Chance" "15.0" + "Shield Throw Chance" "100.0" - // The cooldown for the Mutant Tank's range ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // The type of the Mutant Tank's shield. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 (OFF) - // Maximum: 99999 (Longest) + // Add up numbers together for different results. // -- - // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Smite Range Cooldown" "0" + // Minimum: 0 + // Maximum: 15 + // -- + // 0: OFF + // 1: Bullet-based (Requires bullets to break shield.) + // 2: Blast-based (Requires explosives to break shield.) + // 4: Fire-based (Requires fires to break shield.) + // 8: Melee-based (Requires melee weapons to break shield.) + "Shield Type" "2" "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" { - // Note: Override any of the settings in the "Smite Ability" section for each special infected here. + // Note: Override any of the settings in the "Shield Ability" section for each special infected here. // Example "Access Flags" "" @@ -27354,23 +26838,25 @@ "Human Ability" "0" "Human Ammo" "5" "Human Cooldown" "0" - "Human Range Cooldown" "0" + "Human Duration" "5" + "Human Mode" "1" "Open Areas Only" "0.0" - "Requires Humans" "0" + "Requires Humans" "1" "Ability Enabled" "0" - "Ability Effect" "0" "Ability Message" "0" - "Ability Sight" "0" - "Smite Body" "1" - "Smite Chance" "33.3" - "Smite Cooldown" "0" - "Smite Countdown" "0.0" - "Smite Hit" "0" - "Smite Hit Mode" "0" - "Smite Mode" "1" - "Smite Range" "150.0" - "Smite Range Chance" "15.0" - "Smite Range Cooldown" "0" + "Shield Chance" "33.3" + "Shield Convert Percentage" "0.0" + "Shield Color" "255,255,255,255" + "Shield Cooldown" "0" + "Shield Delay" "5" + "Shield Display Health" "11" + "Shield Display Health Type" "2" + "Shield Duration" "0" + "Shield Glow" "1" + "Shield Health" "0" + "Shield Health Characters" "],=" + "Shield Throw Chance" "100.0" + "Shield Type" "2" } } } @@ -27378,7 +26864,7 @@ ```
-##### Spam Ability +##### Shove Ability
Click to expand! @@ -27387,9 +26873,20 @@ { "Tank #1" { - // The Mutant Tank spams rocks at survivors. - // Requires "mt_abilities2.smx" to be compiled with "mt_spam.sp" to work. - "Spam Ability" + // The Mutant Tank repeatedly shoves survivors. + // "Ability Enabled" - When a survivor is within range of the Mutant Tank, the survivor is shoved repeatedly. + // - "Shove Range" + // - "Shove Range Chance" + // - "Shove Range Cooldown" + // "Shove Death" - When the Mutant Tank dies or spawns, nearby survivors are shoved. + // - "Shove Death Chance" + // - "Shove Death Range" + // "Shove Hit" - When a survivor is hit by the Mutant Tank's claw or rock, or a survivor hits the Mutant Tank with a melee weapon, the survivor is shoved repeatedly. + // - "Shove Chance" + // - "Shove Cooldown" + // - "Shove Hit Mode" + // Requires "mt_abilities2.smx" to be compiled with "mt_shove.sp" to work. + "Shove Ability" { // Admins with one or more of these access flags have access to this ability. // Note: This setting can be overridden for specific players. @@ -27459,25 +26956,18 @@ // "forever" - 99999 seconds "Human Cooldown" "0" - // The Mutant Tank's ability effects last this long. - // Note: This setting does not affect human-controlled Mutant Tanks unless the "Human Mode" setting is set to "0". + // Human-controlled Mutant Tanks must wait this long before using their range ability again. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 - // Maximum: 99999 + // Minimum: 0 (OFF) + // Maximum: 99999 (Longest) // -- // Keywords: + // "never"/"disabled"/"false"/"off"/"no" - 0 seconds // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Human Duration" "5" - - // The mode of how human-controlled Mutant Tanks activate their abilities. - // Note: This setting can be overridden for specific players. - // -- - // 0: Press buttons to activate corresponding abilities. Cooldown starts after ability's duration ends. - // 1: Hold down buttons to keep corresponding abilities activated. Cooldown starts after the player lets go of the buttons. - "Human Mode" "1" + "Human Range Cooldown" "0" // The ability can only activate in open areas. // Note: Do not change this setting if you are unsure of how it works. @@ -27491,30 +26981,82 @@ // "farthest" - 99999.0 range "Open Areas Only" "0.0" - // The ability is only effective toward human survivors. + // The ability is only effective toward human-controlled survivors. // Note: This setting can be overridden for specific players. // -- // Minimum: 0 // Maximum: 32 // -- // 0: OFF - // 1-32: ON, the number of human survivors required to be present for this ability to be effective. + // 1-32: ON, the number of human-controlled survivors required to be present for this ability to be effective. "Requires Humans" "0" // Enable this ability. + // Note: This setting does not affect the "Shove Hit" setting. // Note: This setting can be overridden for specific players. // -- // 0/"disabled"/"false"/"off"/"no": OFF // 1/"enabled"/"true"/"on"/"yes": ON "Ability Enabled" "0" + // Show a screen fade effect when the Mutant Tank uses its abilities. + // Note: The colors will randomly change between the colors set in the "Skin Color" and "Glow Color" settings. + // Note: This setting can be overridden for specific players. + // -- + // Add up numbers together for different results. + // -- + // Minimum: 0 + // Maximum: 7 + // -- + // 0: OFF + // 1: Show effect when the Mutant Tank uses its claw/rock attack. + // 2: Show effect when the Mutant Tank is hit by a melee weapon. + // 4: Show effect when the Mutant Tank uses its range ability. + // -- + // Keywords: + // "none"/"off" - 0 + // "attack" - 1 + // "hurt" - 2 + // "attack,hurt" - 3 + // "range" - 4 + // "attack,range" - 5 + // "hurt,range" - 6 + // "attack,hurt,range" - 7 + "Ability Effect" "0" + // Display a message whenever the ability activates/deactivates. // Note: This setting can be overridden for specific players. // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON + // Add up numbers together for different results. + // -- + // Minimum: 0 + // Maximum: 3 + // -- + // 0: OFF + // 1: Display message only when "Shove Hit" is enabled. + // 2: Display message only when "Ability Enabled" is enabled. + // -- + // Keywords: + // "none"/"off" - 0 + // "hit" - 1 + // "ability" - 2 + // "both"/"all"/"hit,ability" - 3 "Ability Message" "0" + // Check line-of-sight when the Mutant Tank uses its abilities. + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0 + // Maximum: 5 + // -- + // 0: OFF + // 1: Check if there is a solid object between the Mutant Tank and survivors. + // 2: Option 1 + Check if the Mutant Tank is looking toward the survivors. + // 3: Option 1 + Check if the Mutant Tank is looking away from the survivors. + // 4: Option 1 + Check if the survivors are looking toward the Mutant Tank. + // 5: Option 1 + Check if the survivors are looking away from the Mutant Tank. + "Ability Sight" "0" + // The Mutant Tank has this many chances out of 100.0% to trigger the ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. @@ -27528,9 +27070,9 @@ // "maybe" - 50% chance // "often"/"likely"/"frequently" - 66.6% chance // "always" - 100% chance - "Spam Chance" "33.3" + "Shove Chance" "33.3" - // The cooldown for the Mutant Tank's ability. + // The cooldown for the Mutant Tank's hit ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- @@ -27542,44 +27084,141 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Spam Cooldown" "0" + "Shove Cooldown" "0" - // The Mutant Tank's rocks do this much damage. + // Enable the Mutant Tank's upon-death range ability. + // Note: This setting does not need the "Ability Enabled" setting to be set to "1". + // Note: This setting can be overridden for specific players. + // -- + // Add up numbers together for different results. + // -- + // Minimum: 0 + // Maximum: 3 + // -- + // 0: OFF + // 1: Trigger the range ability when the Mutant Tank dies. + // 2: Trigger the range ability when the Mutant Tank spawns. + "Shove Death" "1" + + // The Mutant Tank has this many chances out of 100.0% to trigger the upon-death ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 (OFF) - // Maximum: 99999 + // Minimum: 0.0 (No chance) + // Maximum: 100.0 (Highest chance) // -- // Keywords: - // "weakest" - 1.0 damage - // "strongest" - 99999.0 damage - "Spam Damage" "5" + // "never" - 0% chance + // "sometimes"/"unlikely"/"seldom" - 33.3% chance + // "maybe" - 50% chance + // "often"/"likely"/"frequently" - 66.6% chance + // "always" - 100% chance + "Shove Death Chance" "33.3" + + // The distance between a survivor and the Mutant Tank needed to trigger the upon-death ability. + // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 1.0 (Closest) + // Maximum: 99999.0 (Farthest) + // -- + // Keywords: + // "closest" - 1.0 range + // "farthest" - 99999.0 range + "Shove Death Range" "200.0" // The Mutant Tank's ability effects last this long. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 + // Minimum: 1 // Maximum: 99999 // -- // Keywords: // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Spam Duration" "5" + "Shove Duration" "5" - // The Mutant Tank's rock spammer throws a rock every time this many seconds passes. + // Enable the Mutant Tank's claw/rock attack. + // Note: This setting does not need the "Ability Enabled" setting to be set to "1". + // Note: This setting can be overridden for specific players. + // -- + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Shove Hit" "0" + + // The mode of the Mutant Tank's claw/rock attack. + // Note: This setting can be overridden for specific players. + // -- + // 0: Both + // 1: Ability activates when the Mutant Tank hits a survivor. + // 2: Ability activates when the Mutant Tank is hit by a survivor. + // -- + // Keywords: + // "both"/"all" - 0 + // "tank"/"attack" - 1 + // "survivor"/"hurt" - 2 + "Shove Hit Mode" "0" + + // The Mutant Tank shoves survivors every time this many seconds passes. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- // Minimum: 0.1 - // Maximum: 1.0 - "Spam Interval" "0.5" + // Maximum: 99999.0 + // -- + // Keywords: + // "milli"/"millisecond" - 0.1 seconds + // "second" - 1 second + // "minute" - 1 minute + // "forever" - 99999 seconds + "Shove Interval" "1.0" + + // The distance between a survivor and the Mutant Tank needed to trigger the ability. + // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 1.0 (Closest) + // Maximum: 99999.0 (Farthest) + // -- + // Keywords: + // "closest" - 1.0 range + // "farthest" - 99999.0 range + "Shove Range" "150.0" + + // The Mutant Tank has this many chances out of 100.0% to trigger the range ability. + // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0.0 (No chance) + // Maximum: 100.0 (Highest chance) + // -- + // Keywords: + // "never" - 0% chance + // "sometimes"/"unlikely"/"seldom" - 33.3% chance + // "maybe" - 50% chance + // "often"/"likely"/"frequently" - 66.6% chance + // "always" - 100% chance + "Shove Range Chance" "15.0" + + // The cooldown for the Mutant Tank's range ability. + // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0 (OFF) + // Maximum: 99999 (Longest) + // -- + // Keywords: + // "never"/"disabled"/"false"/"off"/"no" - 0 seconds + // "second" - 1 second + // "minute" - 1 minute + // "forever" - 99999 seconds + "Shove Range Cooldown" "0" "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" { - // Note: Override any of the settings in the "Spam Ability" section for each special infected here. + // Note: Override any of the settings in the "Shove Ability" section for each special infected here. // Example "Access Flags" "" @@ -27589,17 +27228,25 @@ "Human Ability" "0" "Human Ammo" "5" "Human Cooldown" "0" - "Human Duration" "5" - "Human Mode" "1" + "Human Range Cooldown" "0" "Open Areas Only" "0.0" "Requires Humans" "0" "Ability Enabled" "0" + "Ability Effect" "0" "Ability Message" "0" - "Spam Chance" "33.3" - "Spam Cooldown" "0" - "Spam Damage" "5" - "Spam Duration" "5" - "Spam Interval" "0.5" + "Ability Sight" "0" + "Shove Chance" "33.3" + "Shove Cooldown" "0" + "Shove Death" "1" + "Shove Death Chance" "33.3" + "Shove Death Range" "200.0" + "Shove Duration" "5" + "Shove Hit" "0" + "Shove Hit Mode" "0" + "Shove Interval" "1.0" + "Shove Range" "150.0" + "Shove Range Chance" "15.0" + "Shove Range Cooldown" "0" } } } @@ -27607,7 +27254,7 @@ ```
-##### Splash Ability +##### Slow Ability
Click to expand! @@ -27616,9 +27263,17 @@ { "Tank #1" { - // The Mutant Tank constantly deals splash damage to nearby survivors. - // Requires "mt_abilities2.smx" to be compiled with "mt_splash.sp" to work. - "Splash Ability" + // The Mutant Tank slows survivors down. + // "Ability Enabled" - When a survivor is within range of the Mutant Tank, the survivor is slowed down. + // - "Slow Range" + // - "Slow Range Chance" + // - "Slow Range Cooldown" + // "Slow Hit" - When a survivor is hit by the Mutant Tank's claw or rock, or a survivor hits the Mutant Tank with a melee weapon, the survivor is slowed down. + // - "Slow Chance" + // - "Slow Cooldown" + // - "Slow Hit Mode" + // Requires "mt_abilities2.smx" to be compiled with "mt_slow.sp" to work. + "Slow Ability" { // Admins with one or more of these access flags have access to this ability. // Note: This setting can be overridden for specific players. @@ -27688,25 +27343,18 @@ // "forever" - 99999 seconds "Human Cooldown" "0" - // The Mutant Tank's ability effects last this long. - // Note: This setting does not affect human-controlled Mutant Tanks unless the "Human Mode" setting is set to "0". + // Human-controlled Mutant Tanks must wait this long before using their range ability again. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 - // Maximum: 99999 + // Minimum: 0 (OFF) + // Maximum: 99999 (Longest) // -- // Keywords: + // "never"/"disabled"/"false"/"off"/"no" - 0 seconds // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Human Duration" "5" - - // The mode of how human-controlled Mutant Tanks activate their abilities. - // Note: This setting can be overridden for specific players. - // -- - // 0: Press buttons to activate corresponding abilities. Cooldown starts after ability is activated. - // 1: Hold down buttons to keep corresponding abilities activated. Cooldown starts after the player lets go of the buttons. - "Human Mode" "1" + "Human Range Cooldown" "0" // The ability can only activate in open areas. // Note: Do not change this setting if you are unsure of how it works. @@ -27720,28 +27368,66 @@ // "farthest" - 99999.0 range "Open Areas Only" "0.0" - // The ability is only effective toward human survivors. + // The ability is only effective toward human-controlled survivors. // Note: This setting can be overridden for specific players. // -- // Minimum: 0 // Maximum: 32 // -- // 0: OFF - // 1-32: ON, the number of human survivors required to be present for this ability to be effective. + // 1-32: ON, the number of human-controlled survivors required to be present for this ability to be effective. "Requires Humans" "0" // Enable this ability. + // Note: This setting does not affect the "Slow Hit" setting. // Note: This setting can be overridden for specific players. // -- // 0/"disabled"/"false"/"off"/"no": OFF // 1/"enabled"/"true"/"on"/"yes": ON "Ability Enabled" "0" + // Show a screen fade effect when the Mutant Tank uses its abilities. + // Note: The colors will randomly change between the colors set in the "Skin Color" and "Glow Color" settings. + // Note: This setting can be overridden for specific players. + // -- + // Add up numbers together for different results. + // -- + // Minimum: 0 + // Maximum: 7 + // -- + // 0: OFF + // 1: Show effect when the Mutant Tank uses its claw/rock attack. + // 2: Show effect when the Mutant Tank is hit by a melee weapon. + // 4: Show effect when the Mutant Tank uses its range ability. + // -- + // Keywords: + // "none"/"off" - 0 + // "attack" - 1 + // "hurt" - 2 + // "attack,hurt" - 3 + // "range" - 4 + // "attack,range" - 5 + // "hurt,range" - 6 + // "attack,hurt,range" - 7 + "Ability Effect" "0" + // Display a message whenever the ability activates/deactivates. // Note: This setting can be overridden for specific players. // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON + // Add up numbers together for different results. + // -- + // Minimum: 0 + // Maximum: 3 + // -- + // 0: OFF + // 1: Display message only when "Slow Hit" is enabled. + // 2: Display message only when "Ability Enabled" is enabled. + // -- + // Keywords: + // "none"/"off" - 0 + // "hit" - 1 + // "ability" - 2 + // "both"/"all"/"hit,ability" - 3 "Ability Message" "0" // Check line-of-sight when the Mutant Tank uses its abilities. @@ -27771,9 +27457,9 @@ // "maybe" - 50% chance // "often"/"likely"/"frequently" - 66.6% chance // "always" - 100% chance - "Splash Chance" "33.3" + "Slow Chance" "33.3" - // The cooldown for the Mutant Tank's ability. + // The cooldown for the Mutant Tank's hit ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- @@ -27785,46 +27471,49 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Splash Cooldown" "0" - - // The Mutant Tank's splashes do this much damage. - // Note: This is ignored when the "Combo Ability" setting is set to "1". - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0.0 (OFF) - // Maximum: 99999.0 - // -- - // Keywords: - // "weakest" - 1.0 damage - // "strongest" - 99999.0 damage - "Splash Damage" "5.0" + "Slow Cooldown" "0" // The Mutant Tank's ability effects last this long. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 - // Maximum: 99999 + // Minimum: 0.1 + // Maximum: 99999.0 // -- // Keywords: + // "milli"/"millisecond" - 0.1 seconds // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Splash Duration" "0" + "Slow Duration" "5.0" - // The Mutant Tank deals splash damage to nearby survivors every time this many seconds passes. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Enable the Mutant Tank's claw/rock attack. + // Note: This setting does not need the "Ability Enabled" setting to be set to "1". // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.1 - // Maximum: 99999.0 + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Slow Hit" "0" + + // The mode of the Mutant Tank's claw/rock attack. + // Note: This setting can be overridden for specific players. + // -- + // 0: Both + // 1: Ability activates when the Mutant Tank hits a survivor. + // 2: Ability activates when the Mutant Tank is hit by a survivor. // -- // Keywords: - // "milli"/"millisecond" - 0.1 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Splash Interval" "5.0" + // "both"/"all" - 0 + // "tank"/"attack" - 1 + // "survivor"/"hurt" - 2 + "Slow Hit Mode" "0" + + // The Mutant Tank prevents survivors from walking up inclines (ramps, stairs, etc.) while slowed down. + // Note: This setting can be overridden for specific players. + // -- + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Slow Incline" "1" // The distance between a survivor and the Mutant Tank needed to trigger the ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -27836,11 +27525,48 @@ // Keywords: // "closest" - 1.0 range // "farthest" - 99999.0 range - "Splash Range" "500.0" + "Slow Range" "150.0" + + // The Mutant Tank has this many chances out of 100.0% to trigger the range ability. + // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0.0 (No chance) + // Maximum: 100.0 (Highest chance) + // -- + // Keywords: + // "never" - 0% chance + // "sometimes"/"unlikely"/"seldom" - 33.3% chance + // "maybe" - 50% chance + // "often"/"likely"/"frequently" - 66.6% chance + // "always" - 100% chance + "Slow Range Chance" "15.0" + + // The cooldown for the Mutant Tank's range ability. + // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0 (OFF) + // Maximum: 99999 (Longest) + // -- + // Keywords: + // "never"/"disabled"/"false"/"off"/"no" - 0 seconds + // "second" - 1 second + // "minute" - 1 minute + // "forever" - 99999 seconds + "Slow Range Cooldown" "0" + + // The Mutant Tank sets the survivors' run speed to this value. + // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0.1 + // Maximum: 0.99 + "Slow Speed" "0.25" "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" { - // Note: Override any of the settings in the "Splash Ability" section for each special infected here. + // Note: Override any of the settings in the "Slow Ability" section for each special infected here. // Example "Access Flags" "" @@ -27850,19 +27576,23 @@ "Human Ability" "0" "Human Ammo" "5" "Human Cooldown" "0" - "Human Duration" "5" - "Human Mode" "1" + "Human Range Cooldown" "0" "Open Areas Only" "0.0" "Requires Humans" "0" "Ability Enabled" "0" + "Ability Effect" "0" "Ability Message" "0" "Ability Sight" "0" - "Splash Chance" "33.3" - "Splash Cooldown" "0" - "Splash Damage" "5.0" - "Splash Duration" "0" - "Splash Interval" "5.0" - "Splash Range" "500.0" + "Slow Chance" "33.3" + "Slow Cooldown" "0" + "Slow Duration" "5.0" + "Slow Hit" "0" + "Slow Hit Mode" "0" + "Slow Incline" "1" + "Slow Range" "150.0" + "Slow Range Chance" "15.0" + "Slow Range Cooldown" "0" + "Slow Speed" "0.25" } } } @@ -27870,7 +27600,7 @@ ```
-##### Splatter Ability +##### Smash Ability
Click to expand! @@ -27879,18 +27609,17 @@ { "Tank #1" { - // The Mutant Tank splatters the survivors' screens. - // "Ability Enabled" - When a survivor is within range of the Mutant Tank, the survivor's screen is splattered. - // - "Splatter Range" - // - "Splatter Range Chance" - // - "Splatter Range Cooldown" - // "Splatter Hit" - When a survivor is hit by the Mutant Tank's claw or rock, or a survivor hits the Mutant Tank with a melee weapon, the survivor's screen is splattered. - // - "Splatter Chance" - // - "Splatter Cooldown" - // - "Splatter Hit Mode" - // Requires "mt_abilities2.smx" to be compiled with "mt_splatter.sp" to work. - // Note: Only available in Left 4 Dead 2. - "Splatter Ability" + // The Mutant Tank sends survivors into space, smashes survivors to death, smites survivors, and kills itself along with a survivor victim. + // "Ability Enabled" - When a survivor is within range of the Mutant Tank, the survivor is smashed to death. + // - "Smash Range" + // - "Smash Range Chance" + // - "Smash Range Cooldown" + // "Smash Hit" - When a survivor is hit by the Mutant Tank's claw or rock, or a survivor hits the Mutant Tank with a melee weapon, the survivor is smashed to death. + // - "Smash Chance" + // - "Smash Cooldown" + // - "Smash Hit Mode" + // Requires "mt_abilities2.smx" to be compiled with "mt_smash.sp" to work. + "Smash Ability" { // Admins with one or more of these access flags have access to this ability. // Note: This setting can be overridden for specific players. @@ -27985,18 +27714,18 @@ // "farthest" - 99999.0 range "Open Areas Only" "0.0" - // The ability is only effective toward human survivors. + // The ability is only effective toward human-controlled survivors. // Note: This setting can be overridden for specific players. // -- // Minimum: 0 // Maximum: 32 // -- // 0: OFF - // 1-32: ON, the number of human survivors required to be present for this ability to be effective. - "Requires Humans" "1" + // 1-32: ON, the number of human-controlled survivors required to be present for this ability to be effective. + "Requires Humans" "0" // Enable this ability. - // Note: This setting does not affect the "Splatter Hit" setting. + // Note: This setting does not affect the "Smash Hit" setting. // Note: This setting can be overridden for specific players. // -- // 0/"disabled"/"false"/"off"/"no": OFF @@ -28037,7 +27766,7 @@ // Maximum: 3 // -- // 0: OFF - // 1: Display message only when "Splatter Hit" is enabled. + // 1: Display message only when "Smash Hit" is enabled. // 2: Display message only when "Ability Enabled" is enabled. // -- // Keywords: @@ -28061,6 +27790,14 @@ // 5: Option 1 + Check if the survivors are looking away from the Mutant Tank. "Ability Sight" "0" + // Removes the death model of the survivor when killed. + // Note: Only available in Left 4 Dead 2. + // Note: This setting can be overridden for specific players. + // -- + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Smash Body" "1" + // The Mutant Tank has this many chances out of 100.0% to trigger the ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. @@ -28074,7 +27811,7 @@ // "maybe" - 50% chance // "often"/"likely"/"frequently" - 66.6% chance // "always" - 100% chance - "Splatter Chance" "33.3" + "Smash Chance" "33.3" // The cooldown for the Mutant Tank's hit ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -28088,20 +27825,36 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Splatter Cooldown" "0" + "Smash Cooldown" "0" - // The Mutant Tank's ability effects last this long. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // The countdown before activating the Mutant Tank's smash ability. + // Note: During the countdown phase, survivors can hide indoors to avoid dying. + // Note: This setting only applies if the "Smash Mode" setting includes the 2nd or 3rd option. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 - // Maximum: 99999 + // Minimum: 0.0 (OFF) + // Maximum: 99999.0 + // -- + // Keywords: + // "milli"/"millisecond" - 0.1 seconds + // "second" - 1 second + // "minute" - 1 minute + // "forever" - 99999 seconds + "Smash Countdown" "0.0" + + // The Mutant Tank sends survivors into space after this many seconds passes upon triggering the smash ability. + // Note: This setting only applies if the "Smash Mode" setting includes the 2nd option. + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0.1 + // Maximum: 99999.0 // -- // Keywords: + // "milli"/"millisecond" - 0.1 seconds // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Splatter Duration" "5" + "Smash Delay" "1.0" // Enable the Mutant Tank's claw/rock attack. // Note: This setting does not need the "Ability Enabled" setting to be set to "1". @@ -28109,7 +27862,7 @@ // -- // 0/"disabled"/"false"/"off"/"no": OFF // 1/"enabled"/"true"/"on"/"yes": ON - "Splatter Hit" "0" + "Smash Hit" "0" // The mode of the Mutant Tank's claw/rock attack. // Note: This setting can be overridden for specific players. @@ -28122,21 +27875,29 @@ // "both"/"all" - 0 // "tank"/"attack" - 1 // "survivor"/"hurt" - 2 - "Splatter Hit Mode" "0" + "Smash Hit Mode" "0" - // The Mutant Tank splatters survivors' screens every time this many seconds passes. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // The amount of damage required to power up the Mutant Tank's smash ability. + // Note: This setting only applies if the "Smash Mode" setting includes the 1st option. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.1 + // Minimum: 0.0 (OFF) // Maximum: 99999.0 + "Smash Meter" "0.0" + + // The mode of the Mutant Tank's smash ability. + // Note: This setting can be overridden for specific players. // -- - // Keywords: - // "milli"/"millisecond" - 0.1 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Splatter Interval" "1.0" + // Add up numbers together for different results. + // -- + // Minimum: 0 + // Maximum: 7 + // -- + // 0 OR 7: All types of smash. + // 1: Pound survivors to death. + // 2: Send survivors into space. + // 4: Smite survivors. + "Smash Mode" "0" // The distance between a survivor and the Mutant Tank needed to trigger the ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -28148,7 +27909,7 @@ // Keywords: // "closest" - 1.0 range // "farthest" - 99999.0 range - "Splatter Range" "150.0" + "Smash Range" "150.0" // The Mutant Tank has this many chances out of 100.0% to trigger the range ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -28163,7 +27924,7 @@ // "maybe" - 50% chance // "often"/"likely"/"frequently" - 66.6% chance // "always" - 100% chance - "Splatter Range Chance" "15.0" + "Smash Range Chance" "15.0" // The cooldown for the Mutant Tank's range ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -28177,36 +27938,31 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Splatter Range Cooldown" "0" + "Smash Range Cooldown" "0" - // The type of the Mutant Tank's splatter. + // Remove the Mutant Tank after triggering the ability. // Note: This setting can be overridden for specific players. // -- - // 0: Random - // 1: Adrenaline - // 2: Adrenaline #2 - // 3: Hurt - // 4: Hurt #2 - // 5: Blood - // 6: Blood #2 - // 7: Blood #3 - // 8: Blood #4 - // 9: Blood #5 - // 10: Blood #6 - // 11: Smoker - // 12: Smoker #2 - // 13: Mud - // 14: Mud #2 - // 15: Bashed - // 16: Bashed #2 - // 17: Bashed #3 - // 18: Burning - // 19: Lightning - "Splatter Type" "0" + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Smash Remove" "0" + + // The mode of the Mutant Tank's smash ability. + // Note: This setting can be overridden for specific players. + // -- + // Add up numbers together for different results. + // -- + // Minimum: 0 + // Maximum: 3 + // -- + // 0 OR 3: Pick randomly between killing and incapacitating. + // 1: Kill instantly. + // 2: Incapacitate only. + "Smash Type" "1" "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" { - // Note: Override any of the settings in the "Splatter Ability" section for each special infected here. + // Note: Override any of the settings in the "Smash Ability" section for each special infected here. // Example "Access Flags" "" @@ -28218,21 +27974,25 @@ "Human Cooldown" "0" "Human Range Cooldown" "0" "Open Areas Only" "0.0" - "Requires Humans" "1" + "Requires Humans" "0" "Ability Enabled" "0" "Ability Effect" "0" "Ability Message" "0" "Ability Sight" "0" - "Splatter Chance" "33.3" - "Splatter Cooldown" "0" - "Splatter Duration" "5" - "Splatter Hit" "0" - "Splatter Hit Mode" "0" - "Splatter Interval" "1.0" - "Splatter Range" "150.0" - "Splatter Range Chance" "15.0" - "Splatter Range Cooldown" "0" - "Splatter Type" "0" + "Smash Body" "1" + "Smash Chance" "33.3" + "Smash Cooldown" "0" + "Smash Countdown" "0.0" + "Smash Delay" "1.0" + "Smash Hit" "0" + "Smash Hit Mode" "0" + "Smash Meter" "0.0" + "Smash Mode" "0" + "Smash Range" "150.0" + "Smash Range Chance" "15.0" + "Smash Range Cooldown" "0" + "Smash Remove" "0" + "Smash Type" "1" } } } @@ -28333,14 +28093,14 @@ // "farthest" - 99999.0 range "Open Areas Only" "0.0" - // The ability is only effective toward human survivors. + // The ability is only effective toward human-controlled survivors. // Note: This setting can be overridden for specific players. // -- // Minimum: 0 // Maximum: 32 // -- // 0: OFF - // 1-32: ON, the number of human survivors required to be present for this ability to be effective. + // 1-32: ON, the number of human-controlled survivors required to be present for this ability to be effective. "Requires Humans" "0" // Enable this ability. @@ -28373,6 +28133,18 @@ // 8: Display message only when "Ability Enabled" includes option "8". "Ability Message" "0" + // The Mutant Tank's thrown car causes this much damage per hit. + // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0.0 (OFF) + // Maximum: 99999.0 + // -- + // Keywords: + // "weakest" - 1.0 damage + // "strongest" - 99999.0 damage + "Throw Car Damage" "5.0" + // Cars thrown by the Mutant Tank will disappear after this many seconds. // Note: The timer starts when the car spawns, so take into account the time it takes to hit something. // Note: This setting can be overridden for specific players. @@ -28469,13 +28241,13 @@ // Maximum: 127 // -- // 0 OR 127: Pick randomly between the 7 options. - // 1: Smoker - // 2: Boomer - // 4: Hunter - // 8: Spitter (Switches to Boomer in Left 4 Dead 1.) - // 16: Jockey (Switches to Hunter in Left 4 Dead 1.) - // 32: Charger (Switches to Smoker in Left 4 Dead 1.) - // 64: Tank + // 1: Tank + // 2: Smoker + // 4: Boomer + // 8: Hunter + // 16: Spitter (Switches to Boomer in Left 4 Dead 1.) + // 32: Jockey (Switches to Hunter in Left 4 Dead 1.) + // 64: Charger (Switches to Smoker in Left 4 Dead 1.) "Throw Infected Options" "0" // Remove all special infected thrown by the Mutant Tank when it dies or changes its Mutant Tank type. @@ -28504,238 +28276,30 @@ // "strongest" - 99999.0 damage "Throw Witch Damage" "5.0" - // Witches thrown by the Mutant Tank die after this many seconds. - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0.0 (Until death) - // Maximum: 99999.0 (Longest) - // -- - // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds - // "milli"/"millisecond" - 0.1 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever"/"death" - 99999 seconds - "Throw Witch Lifetime" "0.0" - - // Remove all Witches thrown by the Mutant Tank when it dies or changes its Mutant Tank type. - // Note: This setting can be overridden for specific players. - // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Throw Witch Remove" "1" - - "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" - { - // Note: Override any of the settings in the "Throw Ability" section for each special infected here. - - // Example - "Access Flags" "" - "Immunity Flags" "" - "Close Areas Only" "0.0" - "Combo Ability" "0" - "Human Ability" "0" - "Human Ammo" "5" - "Human Cooldown" "0" - "Open Areas Only" "0.0" - "Requires Humans" "0" - "Ability Enabled" "0" - "Ability Message" "0" - "Throw Car Lifetime" "10.0" - "Throw Car Options" "0" - "Throw Car Owner" "1" - "Throw Chance" "33.3" - "Throw Cooldown" "0" - "Throw Infected Amount" "2" - "Throw Infected Lifetime" "0.0" - "Throw Infected Options" "0" - "Throw Infected Remove" "1" - "Throw Witch Amount" "3" - "Throw Witch Damage" "5.0" - "Throw Witch Lifetime" "0.0" - "Throw Witch Remove" "1" - } - } - } -} -``` -
- -##### Track Ability -
- Click to expand! - -``` -"Mutant Tanks" -{ - "Tank #1" - { - // The Mutant Tank throws heat-seeking rocks that will track down the nearest survivors. - // Requires "mt_abilities2.smx" to be compiled with "mt_track.sp" to work. - "Track Ability" - { - // Admins with one or more of these access flags have access to this ability. - // Note: This setting can be overridden for specific players. - // -- - // Empty: No access flags have access. - // Not empty: These access flags have access. - "Access Flags" "" - - // Admins with one or more of these immunity flags are immune to this ability's effects. - // Note: If the Mutant Tank has one or more of these immunity flags or has the same immunity flags as the survivor victim, the immunity is cancelled. - // Note: This setting can be overridden for specific players. - // -- - // Empty: No immunity flags are immune. - // Not empty: These immunity flags are immune. - "Immunity Flags" "" - - // The ability can only activate in close areas. - // Note: Do not change this setting if you are unsure of how it works. - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0.0 (OFF) - // Maximum: 99999.0 (Farthest) - // -- - // Keywords: - // "disabled"/"false"/"off"/"no" - 0.0 range - // "farthest" - 99999.0 range - "Close Areas Only" "0.0" - - // Use this ability in conjunction with other abilities. - // Note: Only use this when "Spawn Type" is set to "4" for the Mutant Tank. - // Note: This setting does not affect human-controlled Mutant Tanks unless the "Human Ability" setting is set to "2". - // Note: This setting can be overridden for specific players. - // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Combo Ability" "0" - - // Allow human-controlled Mutant Tanks to use this ability. - // Note: This setting can be overridden for specific players. - // -- - // 0: OFF - // 1: ON, players can use buttons to activate abilities. - // 2: ON, abilities will activate automatically. - "Human Ability" "0" - - // Determines how many times human-controlled Mutant Tanks can use their abilities in one life. - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0 - // Maximum: 99999 - // -- - // Keywords: - // "none"/"off" - 0 ammo - // "infinite" - 99999 ammo - "Human Ammo" "5" - - // Human-controlled Mutant Tanks must wait this long before using their abilities again. - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0 (OFF) - // Maximum: 99999 (Longest) - // -- - // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Human Cooldown" "0" - - // The ability can only activate in open areas. - // Note: Do not change this setting if you are unsure of how it works. - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0.0 (OFF) - // Maximum: 99999.0 (Farthest) - // -- - // Keywords: - // "disabled"/"false"/"off"/"no" - 0.0 range - // "farthest" - 99999.0 range - "Open Areas Only" "0.0" - - // The ability is only effective toward human survivors. - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0 - // Maximum: 32 - // -- - // 0: OFF - // 1-32: ON, the number of human survivors required to be present for this ability to be effective. - "Requires Humans" "1" - - // Enable this ability. - // Note: This setting can be overridden for specific players. - // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Ability Enabled" "0" - - // Display a message whenever the ability activates/deactivates. - // Note: This setting can be overridden for specific players. - // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Ability Message" "0" - - // The Mutant Tank has this many chances out of 100.0% to trigger the ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0.0 (No chance) - // Maximum: 100.0 (Highest chance) - // -- - // Keywords: - // "never" - 0% chance - // "sometimes"/"unlikely"/"seldom" - 33.3% chance - // "maybe" - 50% chance - // "often"/"likely"/"frequently" - 66.6% chance - // "always" - 100% chance - "Track Chance" "33.3" - - // The cooldown for the Mutant Tank's ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0 (OFF) - // Maximum: 99999 (Longest) - // -- - // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Track Cooldown" "0" - - // The Mutant Tank's heat-seeking rocks have glow outlines when activated. - // Note: Only available in Left 4 Dead 2. - // Note: This setting relies on the glow settings under the "Tank #/Glow" section. - // Note: The glow outline may not appear when the "Glow Type" setting is set to "0" if the rock is not fully visible to the player. - // Note: This setting can be overridden for specific players. - // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Track Glow" "1" - - // The mode of the Mutant Tank's track ability. + // Witches thrown by the Mutant Tank die after this many seconds. // Note: This setting can be overridden for specific players. // -- - // 0: The Mutant Tank's rock will only start tracking when it is near a survivor. - // 1: The Mutant Tank's rock will track the nearest survivor. - "Track Mode" "1" + // Minimum: 0.0 (Until death) + // Maximum: 99999.0 (Longest) + // -- + // Keywords: + // "never"/"disabled"/"false"/"off"/"no" - 0 seconds + // "milli"/"millisecond" - 0.1 seconds + // "second" - 1 second + // "minute" - 1 minute + // "forever"/"death" - 99999 seconds + "Throw Witch Lifetime" "0.0" - // The Mutant Tank's track ability is this fast. - // Note: This is ignored when the "Combo Ability" setting is set to "1". - // Note: This setting only applies if the "Track Mode" setting is set to "1". + // Remove all Witches thrown by the Mutant Tank when it dies or changes its Mutant Tank type. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.1 - // Maximum: 99999.0 - "Track Speed" "500.0" + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Throw Witch Remove" "1" "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" { - // Note: Override any of the settings in the "Track Ability" section for each special infected here. + // Note: Override any of the settings in the "Throw Ability" section for each special infected here. // Example "Access Flags" "" @@ -28746,14 +28310,23 @@ "Human Ammo" "5" "Human Cooldown" "0" "Open Areas Only" "0.0" - "Requires Humans" "1" + "Requires Humans" "0" "Ability Enabled" "0" "Ability Message" "0" - "Track Chance" "33.3" - "Track Cooldown" "0" - "Track Glow" "1" - "Track Mode" "1" - "Track Speed" "500.0" + "Throw Car Damage" "5.0" + "Throw Car Lifetime" "10.0" + "Throw Car Options" "0" + "Throw Car Owner" "1" + "Throw Chance" "33.3" + "Throw Cooldown" "0" + "Throw Infected Amount" "2" + "Throw Infected Lifetime" "0.0" + "Throw Infected Options" "0" + "Throw Infected Remove" "1" + "Throw Witch Amount" "3" + "Throw Witch Damage" "5.0" + "Throw Witch Lifetime" "0.0" + "Throw Witch Remove" "1" } } } @@ -28761,7 +28334,7 @@ ```
-##### Ultimate Ability +##### Track Ability
Click to expand! @@ -28770,9 +28343,9 @@ { "Tank #1" { - // The Mutant Tank activates ultimate mode when low on health to gain temporary god mode and damage boost. - // Requires "mt_abilities2.smx" to be compiled with "mt_ultimate.sp" to work. - "Ultimate Ability" + // The Mutant Tank throws heat-seeking rocks that will track down the nearest survivors. + // Requires "mt_abilities2.smx" to be compiled with "mt_track.sp" to work. + "Track Ability" { // Admins with one or more of these access flags have access to this ability. // Note: This setting can be overridden for specific players. @@ -28854,15 +28427,15 @@ // "farthest" - 99999.0 range "Open Areas Only" "0.0" - // The ability is only effective toward human survivors. + // The ability is only effective toward human-controlled survivors. // Note: This setting can be overridden for specific players. // -- // Minimum: 0 // Maximum: 32 // -- // 0: OFF - // 1-32: ON, the number of human survivors required to be present for this ability to be effective. - "Requires Humans" "0" + // 1-32: ON, the number of human-controlled survivors required to be present for this ability to be effective. + "Requires Humans" "1" // Enable this ability. // Note: This setting can be overridden for specific players. @@ -28878,13 +28451,6 @@ // 1/"enabled"/"true"/"on"/"yes": ON "Ability Message" "0" - // The Mutant Tank can activate ultimate mode up to this many times. - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 1 - // Maximum: 99999 - "Ultimate Amount" "1" - // The Mutant Tank has this many chances out of 100.0% to trigger the ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. @@ -28898,7 +28464,7 @@ // "maybe" - 50% chance // "often"/"likely"/"frequently" - 66.6% chance // "always" - 100% chance - "Ultimate Chance" "33.3" + "Track Chance" "33.3" // The cooldown for the Mutant Tank's ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -28912,51 +28478,37 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Ultimate Cooldown" "0" - - // The Mutant Tank's damage boost value during ultimate mode. - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0.1 - // Maximum: 99999.0 - "Ultimate Damage Boost" "1.2" - - // The Mutant Tank must deal this much damage to survivors to activate ultimate mode. - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0.1 - // Maximum: 99999.0 - "Ultimate Damage Required" "200.0" + "Track Cooldown" "0" - // The Mutant Tank's ability effects last this long. + // The Mutant Tank's heat-seeking rocks have glow outlines when activated. + // Note: Only available in Left 4 Dead 2. + // Note: This setting relies on the glow settings under the "Tank #/Glow" section. + // Note: The glow outline may not appear when the "Glow Type" setting is set to "0" if the rock is not fully visible to the player. // Note: This setting can be overridden for specific players. // -- - // Minimum: 1 - // Maximum: 99999 - // -- - // Keywords: - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Ultimate Duration" "5" + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Track Glow" "1" - // The Mutant Tank can activate ultimate mode when its health is equal to or below this value. + // The mode of the Mutant Tank's track ability. // Note: This setting can be overridden for specific players. // -- - // Minimum: 1 - // Maximum: 1000000 - "Ultimate Health Limit" "100" + // 0: The Mutant Tank's rock will only start tracking when it is near a survivor. + // 1: The Mutant Tank's rock will track the nearest survivor. + "Track Mode" "1" - // The Mutant Tank regenerates up to this much percentage of its original health upon activating ultimate mode. + // The Mutant Tank's track ability is this fast. + // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Note: This setting only applies if the "Track Mode" setting is set to "1". // Note: This setting can be overridden for specific players. // -- // Minimum: 0.1 - // Maximum: 1.0 (Full health) - "Ultimate Health Portion" "0.5" + // Maximum: 99999.0 + "Track Speed" "500.0" "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" { - // Note: Override any of the settings in the "Ultimate Ability" section for each special infected here. + // Note: Override any of the settings in the "Track Ability" section for each special infected here. // Example "Access Flags" "" @@ -28967,17 +28519,14 @@ "Human Ammo" "5" "Human Cooldown" "0" "Open Areas Only" "0.0" - "Requires Humans" "0" + "Requires Humans" "1" "Ability Enabled" "0" "Ability Message" "0" - "Ultimate Amount" "1" - "Ultimate Chance" "33.3" - "Ultimate Cooldown" "0" - "Ultimate Damage Boost" "1.2" - "Ultimate Damage Required" "200.0" - "Ultimate Duration" "5" - "Ultimate Health Limit" "100" - "Ultimate Health Portion" "0.5" + "Track Chance" "33.3" + "Track Cooldown" "0" + "Track Glow" "1" + "Track Mode" "1" + "Track Speed" "500.0" } } } @@ -28985,7 +28534,7 @@ ```
-##### Undead Ability +##### Ultimate Ability
Click to expand! @@ -28994,9 +28543,9 @@ { "Tank #1" { - // The Mutant Tank cannot die. - // Requires "mt_abilities2.smx" to be compiled with "mt_undead.sp" to work. - "Undead Ability" + // The Mutant Tank activates ultimate mode when low on health to gain temporary god mode and damage boost. + // Requires "mt_abilities2.smx" to be compiled with "mt_ultimate.sp" to work. + "Ultimate Ability" { // Admins with one or more of these access flags have access to this ability. // Note: This setting can be overridden for specific players. @@ -29005,6 +28554,14 @@ // Not empty: These access flags have access. "Access Flags" "" + // Admins with one or more of these immunity flags are immune to this ability's effects. + // Note: If the Mutant Tank has one or more of these immunity flags or has the same immunity flags as the survivor victim, the immunity is cancelled. + // Note: This setting can be overridden for specific players. + // -- + // Empty: No immunity flags are immune. + // Not empty: These immunity flags are immune. + "Immunity Flags" "" + // The ability can only activate in close areas. // Note: Do not change this setting if you are unsure of how it works. // Note: This setting can be overridden for specific players. @@ -29070,14 +28627,14 @@ // "farthest" - 99999.0 range "Open Areas Only" "0.0" - // The ability is only effective toward human survivors. + // The ability is only effective toward human-controlled survivors. // Note: This setting can be overridden for specific players. // -- // Minimum: 0 // Maximum: 32 // -- // 0: OFF - // 1-32: ON, the number of human survivors required to be present for this ability to be effective. + // 1-32: ON, the number of human-controlled survivors required to be present for this ability to be effective. "Requires Humans" "0" // Enable this ability. @@ -29094,12 +28651,12 @@ // 1/"enabled"/"true"/"on"/"yes": ON "Ability Message" "0" - // The Mutant Tank stays alive up to this many times. + // The Mutant Tank can activate ultimate mode up to this many times. // Note: This setting can be overridden for specific players. // -- // Minimum: 1 // Maximum: 99999 - "Undead Amount" "1" + "Ultimate Amount" "1" // The Mutant Tank has this many chances out of 100.0% to trigger the ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -29114,7 +28671,7 @@ // "maybe" - 50% chance // "often"/"likely"/"frequently" - 66.6% chance // "always" - 100% chance - "Undead Chance" "33.3" + "Ultimate Chance" "33.3" // The cooldown for the Mutant Tank's ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -29128,158 +28685,51 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Undead Cooldown" "0" - - "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" - { - // Note: Override any of the settings in the "Undead Ability" section for each special infected here. - - // Example - "Access Flags" "" - "Close Areas Only" "0.0" - "Combo Ability" "0" - "Human Ability" "0" - "Human Ammo" "5" - "Human Cooldown" "0" - "Open Areas Only" "0.0" - "Requires Humans" "0" - "Ability Enabled" "0" - "Ability Message" "0" - "Undead Amount" "1" - "Undead Chance" "33.3" - "Undead Cooldown" "0" - } - } - } -} -``` -
- -##### Vampire Ability -
- Click to expand! - -``` -"Mutant Tanks" -{ - "Tank #1" - { - // The Mutant Tank gains health from hurting survivors. - // Requires "mt_abilities2.smx" to be compiled with "mt_vampire.sp" to work. - "Vampire Ability" - { - // Admins with one or more of these access flags have access to this ability. - // Note: This setting can be overridden for specific players. - // -- - // Empty: No access flags have access. - // Not empty: These access flags have access. - "Access Flags" "" - - // Admins with one or more of these immunity flags are immune to this ability's effects. - // Note: If the Mutant Tank has one or more of these immunity flags or has the same immunity flags as the survivor victim, the immunity is cancelled. - // Note: This setting can be overridden for specific players. - // -- - // Empty: No immunity flags are immune. - // Not empty: These immunity flags are immune. - "Immunity Flags" "" - - // The ability can only activate in close areas. - // Note: Do not change this setting if you are unsure of how it works. - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0.0 (OFF) - // Maximum: 99999.0 (Farthest) - // -- - // Keywords: - // "disabled"/"false"/"off"/"no" - 0.0 range - // "farthest" - 99999.0 range - "Close Areas Only" "0.0" - - // Allow human-controlled Mutant Tanks to use this ability. - // Note: This setting can be overridden for specific players. - // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON, players can use buttons to activate abilities. - "Human Ability" "0" - - // The ability can only activate in open areas. - // Note: Do not change this setting if you are unsure of how it works. - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0.0 (OFF) - // Maximum: 99999.0 (Farthest) - // -- - // Keywords: - // "disabled"/"false"/"off"/"no" - 0.0 range - // "farthest" - 99999.0 range - "Open Areas Only" "0.0" - - // The ability is only effective toward human survivors. - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0 - // Maximum: 32 - // -- - // 0: OFF - // 1-32: ON, the number of human survivors required to be present for this ability to be effective. - "Requires Humans" "0" - - // Enable this ability. - // Note: This setting can be overridden for specific players. - // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Ability Enabled" "0" + "Ultimate Cooldown" "0" - // Show a screen fade effect when the Mutant Tank uses its abilities. - // Note: The colors will randomly change between the colors set in the "Skin Color" and "Glow Color" settings. + // The Mutant Tank's damage boost value during ultimate mode. // Note: This setting can be overridden for specific players. - // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Ability Effect" "0" + // -- + // Minimum: 0.1 + // Maximum: 99999.0 + "Ultimate Damage Boost" "1.2" - // Display a message whenever the ability activates/deactivates. + // The Mutant Tank must deal this much damage to survivors to activate ultimate mode. // Note: This setting can be overridden for specific players. // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Ability Message" "0" + // Minimum: 0.1 + // Maximum: 99999.0 + "Ultimate Damage Required" "200.0" - // The Mutant Tank has this many chances out of 100.0% to trigger the ability. + // The Mutant Tank's ability effects last this long. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.0 (No chance) - // Maximum: 100.0 (Highest chance) + // Minimum: 1 + // Maximum: 99999 // -- // Keywords: - // "never" - 0% chance - // "sometimes"/"unlikely"/"seldom" - 33.3% chance - // "maybe" - 50% chance - // "often"/"likely"/"frequently" - 66.6% chance - // "always" - 100% chance - "Vampire Chance" "33.3" + // "second" - 1 second + // "minute" - 1 minute + // "forever" - 99999 seconds + "Ultimate Duration" "5" - // The Mutant Tank receives this much health each time it hits a survivor and triggers the ability. + // The Mutant Tank can activate ultimate mode when its health is equal to or below this value. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 (OFF, use the damage value of the attack.) + // Minimum: 1 // Maximum: 1000000 - "Vampire Health" "0" + "Ultimate Health Limit" "100" - // The health received by the Mutant Tank is multiplied by this value. - // Note: Health = Health x Vampire health multiplier - // Example: Health = 1000.0 x 5.0 = 5000.0 - // Note: Use the value "1.0" to disable this setting. (Health x 1.0 = Health) + // The Mutant Tank regenerates up to this much percentage of its original health upon activating ultimate mode. // Note: This setting can be overridden for specific players. // -- - // Minimum: 1.0 - // Maximum: 99999.0 - "Vampire Health Multiplier" "1.0" + // Minimum: 0.1 + // Maximum: 1.0 (Full health) + "Ultimate Health Portion" "0.5" "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" { - // Note: Override any of the settings in the "Vampire Ability" section for each special infected here. + // Note: Override any of the settings in the "Ultimate Ability" section for each special infected here. // Example "Access Flags" "" @@ -29287,14 +28737,20 @@ "Close Areas Only" "0.0" "Combo Ability" "0" "Human Ability" "0" + "Human Ammo" "5" + "Human Cooldown" "0" "Open Areas Only" "0.0" "Requires Humans" "0" "Ability Enabled" "0" - "Ability Effect" "0" "Ability Message" "0" - "Vampire Chance" "33.3" - "Vampire Health" "0" - "Vampire Health Multiplier" "1.0" + "Ultimate Amount" "1" + "Ultimate Chance" "33.3" + "Ultimate Cooldown" "0" + "Ultimate Damage Boost" "1.2" + "Ultimate Damage Required" "200.0" + "Ultimate Duration" "5" + "Ultimate Health Limit" "100" + "Ultimate Health Portion" "0.5" } } } @@ -29302,7 +28758,7 @@ ```
-##### Vision Ability +##### Undead Ability
Click to expand! @@ -29311,17 +28767,9 @@ { "Tank #1" { - // The Mutant Tank changes the survivors' field of view. - // "Ability Enabled" - When a survivor is within range of the Mutant Tank, the survivor's vision changes. - // - "Vision Range" - // - "Vision Range Chance" - // - "Vision Range Cooldown" - // "Vision Hit" - When a survivor is hit by the Mutant Tank's claw or rock, or a survivor hits the Mutant Tank with a melee weapon, the survivor's vision changes. - // - "Vision Chance" - // - "Vision Cooldown" - // - "Vision Hit Mode" - // Requires "mt_abilities2.smx" to be compiled with "mt_vision.sp" to work. - "Vision Ability" + // The Mutant Tank cannot die. + // Requires "mt_abilities2.smx" to be compiled with "mt_undead.sp" to work. + "Undead Ability" { // Admins with one or more of these access flags have access to this ability. // Note: This setting can be overridden for specific players. @@ -29330,14 +28778,6 @@ // Not empty: These access flags have access. "Access Flags" "" - // Admins with one or more of these immunity flags are immune to this ability's effects. - // Note: If the Mutant Tank has one or more of these immunity flags or has the same immunity flags as the survivor victim, the immunity is cancelled. - // Note: This setting can be overridden for specific players. - // -- - // Empty: No immunity flags are immune. - // Not empty: These immunity flags are immune. - "Immunity Flags" "" - // The ability can only activate in close areas. // Note: Do not change this setting if you are unsure of how it works. // Note: This setting can be overridden for specific players. @@ -29391,19 +28831,6 @@ // "forever" - 99999 seconds "Human Cooldown" "0" - // Human-controlled Mutant Tanks must wait this long before using their range ability again. - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0 (OFF) - // Maximum: 99999 (Longest) - // -- - // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Human Range Cooldown" "0" - // The ability can only activate in open areas. // Note: Do not change this setting if you are unsure of how it works. // Note: This setting can be overridden for specific players. @@ -29416,165 +28843,38 @@ // "farthest" - 99999.0 range "Open Areas Only" "0.0" - // The ability is only effective toward human survivors. + // The ability is only effective toward human-controlled survivors. // Note: This setting can be overridden for specific players. // -- // Minimum: 0 // Maximum: 32 // -- // 0: OFF - // 1-32: ON, the number of human survivors required to be present for this ability to be effective. - "Requires Humans" "1" + // 1-32: ON, the number of human-controlled survivors required to be present for this ability to be effective. + "Requires Humans" "0" // Enable this ability. - // Note: This setting does not affect the "Vision Hit" setting. // Note: This setting can be overridden for specific players. // -- // 0/"disabled"/"false"/"off"/"no": OFF // 1/"enabled"/"true"/"on"/"yes": ON "Ability Enabled" "0" - // Show a screen fade effect when the Mutant Tank uses its abilities. - // Note: The colors will randomly change between the colors set in the "Skin Color" and "Glow Color" settings. - // Note: This setting can be overridden for specific players. - // -- - // Add up numbers together for different results. - // -- - // Minimum: 0 - // Maximum: 7 - // -- - // 0: OFF - // 1: Show effect when the Mutant Tank uses its claw/rock attack. - // 2: Show effect when the Mutant Tank is hit by a melee weapon. - // 4: Show effect when the Mutant Tank uses its range ability. - // -- - // Keywords: - // "none"/"off" - 0 - // "attack" - 1 - // "hurt" - 2 - // "attack,hurt" - 3 - // "range" - 4 - // "attack,range" - 5 - // "hurt,range" - 6 - // "attack,hurt,range" - 7 - "Ability Effect" "0" - // Display a message whenever the ability activates/deactivates. // Note: This setting can be overridden for specific players. // -- - // Add up numbers together for different results. - // -- - // Minimum: 0 - // Maximum: 3 - // -- - // 0: OFF - // 1: Display message only when "Vision Hit" is enabled. - // 2: Display message only when "Ability Enabled" is enabled. - // -- - // Keywords: - // "none"/"off" - 0 - // "hit" - 1 - // "ability" - 2 - // "both"/"all"/"hit,ability" - 3 + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON "Ability Message" "0" - // Check line-of-sight when the Mutant Tank uses its abilities. - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0 - // Maximum: 5 - // -- - // 0: OFF - // 1: Check if there is a solid object between the Mutant Tank and survivors. - // 2: Option 1 + Check if the Mutant Tank is looking toward the survivors. - // 3: Option 1 + Check if the Mutant Tank is looking away from the survivors. - // 4: Option 1 + Check if the survivors are looking toward the Mutant Tank. - // 5: Option 1 + Check if the survivors are looking away from the Mutant Tank. - "Ability Sight" "0" - - // The Mutant Tank has this many chances out of 100.0% to trigger the ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0.0 (No chance) - // Maximum: 100.0 (Highest chance) - // -- - // Keywords: - // "never" - 0% chance - // "sometimes"/"unlikely"/"seldom" - 33.3% chance - // "maybe" - 50% chance - // "often"/"likely"/"frequently" - 66.6% chance - // "always" - 100% chance - "Vision Chance" "33.3" - - // The cooldown for the Mutant Tank's hit ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0 (OFF) - // Maximum: 99999 (Longest) - // -- - // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Vision Cooldown" "0" - - // The Mutant Tank's ability effects last this long. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // The Mutant Tank stays alive up to this many times. // Note: This setting can be overridden for specific players. // -- // Minimum: 1 // Maximum: 99999 - // -- - // Keywords: - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Vision Duration" "5" - - // The Mutant Tank sets survivors' fields of view to this value. - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 1 - // Maximum: 160 - "Vision FOV" "160" - - // Enable the Mutant Tank's claw/rock attack. - // Note: This setting does not need the "Ability Enabled" setting to be set to "1". - // Note: This setting can be overridden for specific players. - // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Vision Hit" "0" - - // The mode of the Mutant Tank's claw/rock attack. - // Note: This setting can be overridden for specific players. - // -- - // 0: Both - // 1: Ability activates when the Mutant Tank hits a survivor. - // 2: Ability activates when the Mutant Tank is hit by a survivor. - // -- - // Keywords: - // "both"/"all" - 0 - // "tank"/"attack" - 1 - // "survivor"/"hurt" - 2 - "Vision Hit Mode" "0" - - // The distance between a survivor and the Mutant Tank needed to trigger the ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 1.0 (Closest) - // Maximum: 99999.0 (Farthest) - // -- - // Keywords: - // "closest" - 1.0 range - // "farthest" - 99999.0 range - "Vision Range" "150.0" + "Undead Amount" "1" - // The Mutant Tank has this many chances out of 100.0% to trigger the range ability. + // The Mutant Tank has this many chances out of 100.0% to trigger the ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- @@ -29587,9 +28887,9 @@ // "maybe" - 50% chance // "often"/"likely"/"frequently" - 66.6% chance // "always" - 100% chance - "Vision Range Chance" "15.0" + "Undead Chance" "33.3" - // The cooldown for the Mutant Tank's range ability. + // The cooldown for the Mutant Tank's ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- @@ -29601,36 +28901,26 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Vision Range Cooldown" "0" + "Undead Cooldown" "0" "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" { - // Note: Override any of the settings in the "Vision Ability" section for each special infected here. + // Note: Override any of the settings in the "Undead Ability" section for each special infected here. // Example "Access Flags" "" - "Immunity Flags" "" - "Close Areas Only" "0.0" - "Combo Ability" "0" - "Human Ability" "0" - "Human Ammo" "5" - "Human Cooldown" "0" - "Human Range Cooldown" "0" - "Open Areas Only" "0.0" - "Requires Humans" "1" - "Ability Enabled" "0" - "Ability Effect" "0" - "Ability Message" "0" - "Ability Sight" "0" - "Vision Chance" "33.3" - "Vision Cooldown" "0" - "Vision Duration" "5" - "Vision FOV" "160" - "Vision Hit" "0" - "Vision Hit Mode" "0" - "Vision Range" "150.0" - "Vision Range Chance" "15.0" - "Vision Range Cooldown" "0" + "Close Areas Only" "0.0" + "Combo Ability" "0" + "Human Ability" "0" + "Human Ammo" "5" + "Human Cooldown" "0" + "Open Areas Only" "0.0" + "Requires Humans" "0" + "Ability Enabled" "0" + "Ability Message" "0" + "Undead Amount" "1" + "Undead Chance" "33.3" + "Undead Cooldown" "0" } } } @@ -29638,7 +28928,7 @@ ```
-##### Warp Ability +##### Vision Ability
Click to expand! @@ -29647,23 +28937,20 @@ { "Tank #1" { - // The Mutant Tank warps to survivors and warps survivors to random teammates. - // "Ability Enabled" - The Mutant Tank warps to a random survivor. - // - "Warp Interval" - // - "Warp Mode" - // "Ability Enabled" - When a survivor is within range of the Mutant Tank, the survivor is warped to a random teammate. - // - "Warp Range" - // - "Warp Range Chance" - // - "Warp Range Cooldown" - // "Warp Hit" - When a survivor is hit by the Mutant Tank's claw or rock, or a survivor hits the Mutant Tank with a melee weapon, the survivor is warped to a random teammate. - // - "Warp Chance" - // - "Warp Cooldown" - // - "Warp Hit Mode" - // "Warp Rock Break" - When the Mutant Tank's rock breaks, it switches places with the Mutant Tank. - // - "Warp Rock Chance" - // - "Warp Rock Cooldown" - // Requires "mt_abilities2.smx" to be compiled with "mt_warp.sp" to work. - "Warp Ability" + // The Mutant Tank blinds survivors, shakes the survivors' screens, splatters the survivors' screens, and changes the survivors' field of view. + // "Ability Enabled" - When a survivor is within range of the Mutant Tank, the survivor's vision changes. + // - "Vision Range" + // - "Vision Range Chance" + // - "Vision Range Cooldown" + // "Vision Death" - When the Mutant Tank dies or spawns, nearby survivors' visions change. + // - "Vision Death Chance" + // - "Vision Death Range" + // "Vision Hit" - When a survivor is hit by the Mutant Tank's claw or rock, or a survivor hits the Mutant Tank with a melee weapon, the survivor's vision changes. + // - "Vision Chance" + // - "Vision Cooldown" + // - "Vision Hit Mode" + // Requires "mt_abilities2.smx" to be compiled with "mt_vision.sp" to work. + "Vision Ability" { // Admins with one or more of these access flags have access to this ability. // Note: This setting can be overridden for specific players. @@ -29720,7 +29007,7 @@ // "infinite" - 99999 ammo "Human Ammo" "5" - // Human-controlled Mutant Tanks must wait this long before using their hit ability again. + // Human-controlled Mutant Tanks must wait this long before using their abilities again. // Note: This setting can be overridden for specific players. // -- // Minimum: 0 (OFF) @@ -29733,27 +29020,6 @@ // "forever" - 99999 seconds "Human Cooldown" "0" - // The Mutant Tank's ability effects last this long. - // Note: This setting does not affect human-controlled Mutant Tanks unless the "Human Mode" setting is set to "0". - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0 - // Maximum: 99999 - // -- - // Keywords: - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Human Duration" "5" - - // The mode of how human-controlled Mutant Tanks activate their abilities. - // Note: This setting does not apply to the range ability. - // Note: This setting can be overridden for specific players. - // -- - // 0: Press buttons to activate corresponding abilities. Cooldown starts after ability's duration ends. - // 1: Hold down buttons to keep corresponding abilities activated. Cooldown starts after the player lets go of the buttons. - "Human Mode" "1" - // Human-controlled Mutant Tanks must wait this long before using their range ability again. // Note: This setting can be overridden for specific players. // -- @@ -29767,19 +29033,6 @@ // "forever" - 99999 seconds "Human Range Cooldown" "0" - // Human-controlled Mutant Tanks must wait this long before using their rock ability again. - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0 (OFF) - // Maximum: 99999 (Longest) - // -- - // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Human Rock Cooldown" "0" - // The ability can only activate in open areas. // Note: Do not change this setting if you are unsure of how it works. // Note: This setting can be overridden for specific players. @@ -29792,24 +29045,22 @@ // "farthest" - 99999.0 range "Open Areas Only" "0.0" - // The ability is only effective toward human survivors. + // The ability is only effective toward human-controlled survivors. // Note: This setting can be overridden for specific players. // -- // Minimum: 0 // Maximum: 32 // -- // 0: OFF - // 1-32: ON, the number of human survivors required to be present for this ability to be effective. - "Requires Humans" "0" + // 1-32: ON, the number of human-controlled survivors required to be present for this ability to be effective. + "Requires Humans" "1" // Enable this ability. - // Note: This setting does not affect the "Warp Hit" setting. + // Note: This setting does not affect the "Vision Hit" setting. // Note: This setting can be overridden for specific players. // -- - // 0: OFF - // 1: ON, the Mutant Tank can warp a survivor to a random teammate. - // 2: ON, the Mutant Tank can warp itself to a survivor. - // 3: ON, the Mutant Tank can do both. + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON "Ability Enabled" "0" // Show a screen fade effect when the Mutant Tank uses its abilities. @@ -29837,37 +29088,23 @@ // "attack,hurt,range" - 7 "Ability Effect" "0" - // Display a message whenever the abilities activate/deactivate. + // Display a message whenever the ability activates/deactivates. // Note: This setting can be overridden for specific players. // -- // Add up numbers together for different results. // -- // Minimum: 0 - // Maximum: 15 + // Maximum: 3 // -- // 0: OFF - // 1: Display message only when "Warp Hit" is enabled. - // 2: Display message only when "Ability Enabled" is set to "1" or "3". - // 4: Display message only when "Ability Enabled" is set to "2" or "3". - // 8: Display message only when "Warp Rock Break" is enabled. + // 1: Display message only when "Vision Hit" is enabled. + // 2: Display message only when "Ability Enabled" is enabled. // -- // Keywords: // "none"/"off" - 0 // "hit" - 1 // "ability" - 2 - // "hit,ability" - 3 - // "rock" - 4 - // "hit,rock" - 5 - // "ability,rock" - 6 - // "hit,ability,rock" - 7 - // "break" - 8 - // "hit,break" - 9 - // "ability,break" - 10 - // "hit,ability,break" - 11 - // "rock,break" - 12 - // "hit,rock,break" - 13 - // "ability,rock,break" - 14 - // "hit,ability,rock,break"/"all" - 15 + // "both"/"all"/"hit,ability" - 3 "Ability Message" "0" // Check line-of-sight when the Mutant Tank uses its abilities. @@ -29897,9 +29134,9 @@ // "maybe" - 50% chance // "often"/"likely"/"frequently" - 66.6% chance // "always" - 100% chance - "Warp Chance" "33.3" + "Vision Chance" "33.3" - // The cooldown for the Mutant Tank's main/hit ability. + // The cooldown for the Mutant Tank's hit ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- @@ -29911,29 +29148,77 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Warp Cooldown" "0" + "Vision Cooldown" "0" + + // Enable the Mutant Tank's upon-death range ability. + // Note: This setting does not need the "Ability Enabled" setting to be set to "1". + // Note: This setting can be overridden for specific players. + // -- + // Add up numbers together for different results. + // -- + // Minimum: 0 + // Maximum: 3 + // -- + // 0: OFF + // 1: Trigger the range ability when the Mutant Tank dies. + // 2: Trigger the range ability when the Mutant Tank spawns. + "Vision Death" "1" + + // The Mutant Tank has this many chances out of 100.0% to trigger the upon-death ability. + // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0.0 (No chance) + // Maximum: 100.0 (Highest chance) + // -- + // Keywords: + // "never" - 0% chance + // "sometimes"/"unlikely"/"seldom" - 33.3% chance + // "maybe" - 50% chance + // "often"/"likely"/"frequently" - 66.6% chance + // "always" - 100% chance + "Vision Death Chance" "33.3" + + // The distance between a survivor and the Mutant Tank needed to trigger the upon-death ability. + // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 1.0 (Closest) + // Maximum: 99999.0 (Farthest) + // -- + // Keywords: + // "closest" - 1.0 range + // "farthest" - 99999.0 range + "Vision Death Range" "200.0" // The Mutant Tank's ability effects last this long. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 - // Maximum: 99999 + // Minimum: 0.1 + // Maximum: 99999.0 // -- // Keywords: + // "milli"/"millisecond" - 0.1 seconds // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Warp Duration" "0" + "Vision Duration" "5.0" + + // The Mutant Tank sets survivors' fields of view to this value. + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 1 + // Maximum: 160 + "Vision FOV" "160" // Enable the Mutant Tank's claw/rock attack. - // Note: The Tank will not teleport in narrow areas. // Note: This setting does not need the "Ability Enabled" setting to be set to "1". // Note: This setting can be overridden for specific players. // -- // 0/"disabled"/"false"/"off"/"no": OFF // 1/"enabled"/"true"/"on"/"yes": ON - "Warp Hit" "0" + "Vision Hit" "0" // The mode of the Mutant Tank's claw/rock attack. // Note: This setting can be overridden for specific players. @@ -29946,9 +29231,9 @@ // "both"/"all" - 0 // "tank"/"attack" - 1 // "survivor"/"hurt" - 2 - "Warp Hit Mode" "0" + "Vision Hit Mode" "0" - // The Mutant Tank warps to a random survivor every time this many seconds passes. + // The Mutant Tank changes survivors' visions every time this many seconds passes. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- @@ -29960,19 +29245,25 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Warp Interval" "5.0" + "Vision Interval" "1.0" - // The mode of the Mutant Tank's warp ability. + // The mode of the Mutant Tank's vision ability. // Note: This setting can be overridden for specific players. // -- - // 0: The Mutant Tank warps to a random survivor. - // 1: The Mutant Tank switches places with a random survivor. - // 2: The Mutant Tank warps to a random Tank. - // 3: The Mutant Tank switches places with a random Tank. - "Warp Mode" "0" + // Add up numbers together for different results. + // -- + // Minimum: 0 + // Maximum: 31 + // -- + // 0 OR 31: All types of vision. + // 1: Blind survivors. + // 2: Flashbang survivors. + // 4: Shake survivors' screens. + // 8: Splatter particles onto survivors' screens. + // 16: Change survivors' FOV's. + "Vision Mode" "0" // The distance between a survivor and the Mutant Tank needed to trigger the ability. - // Note: The Tank will not teleport in narrow areas. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- @@ -29982,7 +29273,7 @@ // Keywords: // "closest" - 1.0 range // "farthest" - 99999.0 range - "Warp Range" "150.0" + "Vision Range" "150.0" // The Mutant Tank has this many chances out of 100.0% to trigger the range ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -29997,7 +29288,7 @@ // "maybe" - 50% chance // "often"/"likely"/"frequently" - 66.6% chance // "always" - 100% chance - "Warp Range Chance" "15.0" + "Vision Range Chance" "15.0" // The cooldown for the Mutant Tank's range ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -30011,49 +29302,47 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Warp Range Cooldown" "0" - - // The Mutant Tank's rock switches places with the Mutant Tank when it breaks. - // Note: The Tank will not teleport in narrow areas. - // Note: This does not need "Ability Enabled" or "Warp Hit" to be set to "1". - // Note: This setting can be overridden for specific players. - // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Warp Rock Break" "0" + "Vision Range Cooldown" "0" - // The Mutant Tank's rock has this many chances out of 100.0% to trigger the rock break ability. + // The Mutant Tank is staggered along with survivors when a flashbang is triggered. // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Note: This setting only applies if the "Vision Mode" setting is set to "1". // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.0 (No chance) - // Maximum: 100.0 (Highest chance) - // -- - // Keywords: - // "never" - 0% chance - // "sometimes"/"unlikely"/"seldom" - 33.3% chance - // "maybe" - 50% chance - // "often"/"likely"/"frequently" - 66.6% chance - // "always" - 100% chance - "Warp Rock Chance" "33.3" + // 0: OFF + // 1: Stagger survivors only. + // 2: Stagger the Mutant Tank only. + // 3: Stagger both. + "Vision Stagger" "3" - // The cooldown for the Mutant Tank's rock ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // The type of the Mutant Tank's vision splatter. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 (OFF) - // Maximum: 99999 (Longest) - // -- - // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Warp Rock Cooldown" "0" + // 0: Random + // 1: Adrenaline + // 2: Adrenaline #2 + // 3: Hurt + // 4: Hurt #2 + // 5: Blood + // 6: Blood #2 + // 7: Blood #3 + // 8: Blood #4 + // 9: Blood #5 + // 10: Blood #6 + // 11: Smoker + // 12: Smoker #2 + // 13: Mud + // 14: Mud #2 + // 15: Bashed + // 16: Bashed #2 + // 17: Bashed #3 + // 18: Burning + // 19: Lightning + "Vision Type" "0" "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" { - // Note: Override any of the settings in the "Warp Ability" section for each special infected here. + // Note: Override any of the settings in the "Vision Ability" section for each special infected here. // Example "Access Flags" "" @@ -30063,29 +29352,30 @@ "Human Ability" "0" "Human Ammo" "5" "Human Cooldown" "0" - "Human Duration" "5" - "Human Mode" "1" - "Human Pin Cooldown" "0" "Human Range Cooldown" "0" "Open Areas Only" "0.0" - "Requires Humans" "0" + "Requires Humans" "1" "Ability Enabled" "0" "Ability Effect" "0" "Ability Message" "0" "Ability Sight" "0" - "Warp Chance" "33.3" - "Warp Cooldown" "0" - "Warp Duration" "0" - "Warp Hit" "0" - "Warp Hit Mode" "0" - "Warp Interval" "5.0" - "Warp Mode" "0" - "Warp Pin" "0" - "Warp Pin Chance" "33.3" - "Warp Pin Cooldown" "0" - "Warp Range" "150.0" - "Warp Range Chance" "15.0" - "Warp Range Cooldown" "0" + "Vision Chance" "33.3" + "Vision Cooldown" "0" + "Vision Death" "1" + "Vision Death Chance" "33.3" + "Vision Death Range" "200.0" + "Vision Duration" "5" + "Vision FOV" "160" + "Vision Hit" "0" + "Vision Hit Mode" "0" + "Vision Intensity" "255" + "Vision Interval" "1.0" + "Vision Mode" "0" + "Vision Range" "150.0" + "Vision Range Chance" "15.0" + "Vision Range Cooldown" "0" + "Vision Stagger" "3" + "Vision Type" "0" } } } @@ -30093,7 +29383,7 @@ ```
-##### Whirl Ability +##### Warp Ability
Click to expand! @@ -30102,17 +29392,23 @@ { "Tank #1" { - // The Mutant Tank makes survivors' screens whirl. - // "Ability Enabled" - When a survivor is within range of the Mutant Tank, the survivor's screen whirls. - // - "Whirl Range" - // - "Whirl Range Chance" - // - "Whirl Range Cooldown" - // "Whirl Hit" - When a survivor is hit by the Mutant Tank's claw or rock, or a survivor hits the Mutant Tank with a melee weapon, the survivor's screen whirls. - // - "Whirl Chance" - // - "Whirl Cooldown" - // - "Whirl Hit Mode" - // Requires "mt_abilities2.smx" to be compiled with "mt_whirl.sp" to work. - "Whirl Ability" + // The Mutant Tank warps to survivors and warps survivors to random teammates. + // "Ability Enabled" - The Mutant Tank warps to a random survivor. + // - "Warp Interval" + // - "Warp Mode" + // "Ability Enabled" - When a survivor is within range of the Mutant Tank, the survivor is warped to a random teammate. + // - "Warp Range" + // - "Warp Range Chance" + // - "Warp Range Cooldown" + // "Warp Hit" - When a survivor is hit by the Mutant Tank's claw or rock, or a survivor hits the Mutant Tank with a melee weapon, the survivor is warped to a random teammate. + // - "Warp Chance" + // - "Warp Cooldown" + // - "Warp Hit Mode" + // "Warp Rock Break" - When the Mutant Tank's rock breaks, it switches places with the Mutant Tank. + // - "Warp Rock Chance" + // - "Warp Rock Cooldown" + // Requires "mt_abilities2.smx" to be compiled with "mt_warp.sp" to work. + "Warp Ability" { // Admins with one or more of these access flags have access to this ability. // Note: This setting can be overridden for specific players. @@ -30169,7 +29465,7 @@ // "infinite" - 99999 ammo "Human Ammo" "5" - // Human-controlled Mutant Tanks must wait this long before using their abilities again. + // Human-controlled Mutant Tanks must wait this long before using their hit ability again. // Note: This setting can be overridden for specific players. // -- // Minimum: 0 (OFF) @@ -30182,6 +29478,28 @@ // "forever" - 99999 seconds "Human Cooldown" "0" + // The Mutant Tank's ability effects last this long. + // Note: This setting does not affect human-controlled Mutant Tanks unless the "Human Mode" setting is set to "0". + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0 + // Maximum: 99999 + // -- + // Keywords: + // "second" - 1 second + // "minute" - 1 minute + // "forever" - 99999 seconds + "Human Duration" "5" + + // The mode of how human-controlled Mutant Tanks activate their abilities. + // Note: This setting does not apply to the range ability. + // Note: This setting can be overridden for specific players. + // -- + // 0: Press buttons to activate corresponding abilities. Cooldown starts after ability's duration ends. + // 1: Hold down buttons to keep corresponding abilities activated. Cooldown starts after the player lets go of the buttons. + // 2: Press buttons to toggle corresponding abilities. Cooldown starts after ability is deactivated. + "Human Mode" "1" + // Human-controlled Mutant Tanks must wait this long before using their range ability again. // Note: This setting can be overridden for specific players. // -- @@ -30195,6 +29513,19 @@ // "forever" - 99999 seconds "Human Range Cooldown" "0" + // Human-controlled Mutant Tanks must wait this long before using their rock ability again. + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0 (OFF) + // Maximum: 99999 (Longest) + // -- + // Keywords: + // "never"/"disabled"/"false"/"off"/"no" - 0 seconds + // "second" - 1 second + // "minute" - 1 minute + // "forever" - 99999 seconds + "Human Rock Cooldown" "0" + // The ability can only activate in open areas. // Note: Do not change this setting if you are unsure of how it works. // Note: This setting can be overridden for specific players. @@ -30207,22 +29538,24 @@ // "farthest" - 99999.0 range "Open Areas Only" "0.0" - // The ability is only effective toward human survivors. + // The ability is only effective toward human-controlled survivors. // Note: This setting can be overridden for specific players. // -- // Minimum: 0 // Maximum: 32 // -- // 0: OFF - // 1-32: ON, the number of human survivors required to be present for this ability to be effective. - "Requires Humans" "1" + // 1-32: ON, the number of human-controlled survivors required to be present for this ability to be effective. + "Requires Humans" "0" // Enable this ability. - // Note: This setting does not affect the "Whirl Hit" setting. + // Note: This setting does not affect the "Warp Hit" setting. // Note: This setting can be overridden for specific players. // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON + // 0: OFF + // 1: ON, the Mutant Tank can warp a survivor to a random teammate. + // 2: ON, the Mutant Tank can warp itself to a survivor. + // 3: ON, the Mutant Tank can do both. "Ability Enabled" "0" // Show a screen fade effect when the Mutant Tank uses its abilities. @@ -30250,23 +29583,37 @@ // "attack,hurt,range" - 7 "Ability Effect" "0" - // Display a message whenever the ability activates/deactivates. + // Display a message whenever the abilities activate/deactivate. // Note: This setting can be overridden for specific players. // -- // Add up numbers together for different results. // -- // Minimum: 0 - // Maximum: 3 + // Maximum: 15 // -- // 0: OFF - // 1: Display message only when "Whirl Hit" is enabled. - // 2: Display message only when "Ability Enabled" is enabled. + // 1: Display message only when "Warp Hit" is enabled. + // 2: Display message only when "Ability Enabled" is set to "1" or "3". + // 4: Display message only when "Ability Enabled" is set to "2" or "3". + // 8: Display message only when "Warp Rock Break" is enabled. // -- // Keywords: // "none"/"off" - 0 // "hit" - 1 // "ability" - 2 - // "both"/"all"/"hit,ability" - 3 + // "hit,ability" - 3 + // "rock" - 4 + // "hit,rock" - 5 + // "ability,rock" - 6 + // "hit,ability,rock" - 7 + // "break" - 8 + // "hit,break" - 9 + // "ability,break" - 10 + // "hit,ability,break" - 11 + // "rock,break" - 12 + // "hit,rock,break" - 13 + // "ability,rock,break" - 14 + // "hit,ability,rock,break"/"all" - 15 "Ability Message" "0" // Check line-of-sight when the Mutant Tank uses its abilities. @@ -30283,20 +29630,6 @@ // 5: Option 1 + Check if the survivors are looking away from the Mutant Tank. "Ability Sight" "0" - // The axis of the Mutant Tank's whirl effect. - // Note: This setting can be overridden for specific players. - // -- - // Add up numbers together for different results. - // -- - // Minimum: 0 - // Maximum: 7 - // -- - // 0 OR 7: Pick randomly between the 3 axes. - // 1: X-Axis - // 2: Y-Axis - // 4: Z-Axis - "Whirl Axis" "0" - // The Mutant Tank has this many chances out of 100.0% to trigger the ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. @@ -30310,9 +29643,9 @@ // "maybe" - 50% chance // "often"/"likely"/"frequently" - 66.6% chance // "always" - 100% chance - "Whirl Chance" "33.3" + "Warp Chance" "33.3" - // The cooldown for the Mutant Tank's hit ability. + // The cooldown for the Mutant Tank's main/hit ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- @@ -30324,28 +29657,29 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Whirl Cooldown" "0" + "Warp Cooldown" "0" // The Mutant Tank's ability effects last this long. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- - // Minimum: 1 + // Minimum: 0 // Maximum: 99999 // -- // Keywords: // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Whirl Duration" "5" + "Warp Duration" "0" // Enable the Mutant Tank's claw/rock attack. + // Note: The Tank will not teleport in narrow areas. // Note: This setting does not need the "Ability Enabled" setting to be set to "1". // Note: This setting can be overridden for specific players. // -- // 0/"disabled"/"false"/"off"/"no": OFF // 1/"enabled"/"true"/"on"/"yes": ON - "Whirl Hit" "0" + "Warp Hit" "0" // The mode of the Mutant Tank's claw/rock attack. // Note: This setting can be overridden for specific players. @@ -30358,9 +29692,33 @@ // "both"/"all" - 0 // "tank"/"attack" - 1 // "survivor"/"hurt" - 2 - "Whirl Hit Mode" "0" + "Warp Hit Mode" "0" + + // The Mutant Tank warps to a random survivor every time this many seconds passes. + // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0.1 + // Maximum: 99999.0 + // -- + // Keywords: + // "milli"/"millisecond" - 0.1 seconds + // "second" - 1 second + // "minute" - 1 minute + // "forever" - 99999 seconds + "Warp Interval" "5.0" + + // The mode of the Mutant Tank's warp ability. + // Note: This setting can be overridden for specific players. + // -- + // 0: The Mutant Tank warps to a random survivor. + // 1: The Mutant Tank switches places with a random survivor. + // 2: The Mutant Tank warps to a random Tank. + // 3: The Mutant Tank switches places with a random Tank. + "Warp Mode" "0" // The distance between a survivor and the Mutant Tank needed to trigger the ability. + // Note: The Tank will not teleport in narrow areas. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- @@ -30370,7 +29728,7 @@ // Keywords: // "closest" - 1.0 range // "farthest" - 99999.0 range - "Whirl Range" "150.0" + "Warp Range" "150.0" // The Mutant Tank has this many chances out of 100.0% to trigger the range ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -30385,7 +29743,7 @@ // "maybe" - 50% chance // "often"/"likely"/"frequently" - 66.6% chance // "always" - 100% chance - "Whirl Range Chance" "15.0" + "Warp Range Chance" "15.0" // The cooldown for the Mutant Tank's range ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -30399,19 +29757,49 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Whirl Range Cooldown" "0" + "Warp Range Cooldown" "0" - // The Mutant Tank makes survivors whirl at this speed. + // The Mutant Tank's rock switches places with the Mutant Tank when it breaks. + // Note: The Tank will not teleport in narrow areas. + // Note: This does not need "Ability Enabled" or "Warp Hit" to be set to "1". + // Note: This setting can be overridden for specific players. + // -- + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Warp Rock Break" "0" + + // The Mutant Tank's rock has this many chances out of 100.0% to trigger the rock break ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- - // Minimum: 1.0 - // Maximum: 99999.0 - "Whirl Speed" "500.0" + // Minimum: 0.0 (No chance) + // Maximum: 100.0 (Highest chance) + // -- + // Keywords: + // "never" - 0% chance + // "sometimes"/"unlikely"/"seldom" - 33.3% chance + // "maybe" - 50% chance + // "often"/"likely"/"frequently" - 66.6% chance + // "always" - 100% chance + "Warp Rock Chance" "33.3" + + // The cooldown for the Mutant Tank's rock ability. + // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0 (OFF) + // Maximum: 99999 (Longest) + // -- + // Keywords: + // "never"/"disabled"/"false"/"off"/"no" - 0 seconds + // "second" - 1 second + // "minute" - 1 minute + // "forever" - 99999 seconds + "Warp Rock Cooldown" "0" "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" { - // Note: Override any of the settings in the "Whirl Ability" section for each special infected here. + // Note: Override any of the settings in the "Warp Ability" section for each special infected here. // Example "Access Flags" "" @@ -30421,23 +29809,29 @@ "Human Ability" "0" "Human Ammo" "5" "Human Cooldown" "0" + "Human Duration" "5" + "Human Mode" "1" + "Human Pin Cooldown" "0" "Human Range Cooldown" "0" "Open Areas Only" "0.0" - "Requires Humans" "1" + "Requires Humans" "0" "Ability Enabled" "0" "Ability Effect" "0" "Ability Message" "0" "Ability Sight" "0" - "Whirl Axis" "0" - "Whirl Chance" "33.3" - "Whirl Cooldown" "0" - "Whirl Duration" "5" - "Whirl Hit" "0" - "Whirl Hit Mode" "0" - "Whirl Range" "150.0" - "Whirl Range Chance" "15.0" - "Whirl Range Cooldown" "0" - "Whirl Speed" "500.0" + "Warp Chance" "33.3" + "Warp Cooldown" "0" + "Warp Duration" "0" + "Warp Hit" "0" + "Warp Hit Mode" "0" + "Warp Interval" "5.0" + "Warp Mode" "0" + "Warp Pin" "0" + "Warp Pin Chance" "33.3" + "Warp Pin Cooldown" "0" + "Warp Range" "150.0" + "Warp Range Chance" "15.0" + "Warp Range Cooldown" "0" } } } @@ -30445,7 +29839,7 @@ ```
-##### Witch Ability +##### Whirl Ability
Click to expand! @@ -30454,9 +29848,17 @@ { "Tank #1" { - // The Mutant Tank converts nearby common infected into Witch minions. - // Requires "mt_abilities2.smx" to be compiled with "mt_witch.sp" to work. - "Witch Ability" + // The Mutant Tank makes survivors' screens whirl. + // "Ability Enabled" - When a survivor is within range of the Mutant Tank, the survivor's screen whirls. + // - "Whirl Range" + // - "Whirl Range Chance" + // - "Whirl Range Cooldown" + // "Whirl Hit" - When a survivor is hit by the Mutant Tank's claw or rock, or a survivor hits the Mutant Tank with a melee weapon, the survivor's screen whirls. + // - "Whirl Chance" + // - "Whirl Cooldown" + // - "Whirl Hit Mode" + // Requires "mt_abilities2.smx" to be compiled with "mt_whirl.sp" to work. + "Whirl Ability" { // Admins with one or more of these access flags have access to this ability. // Note: This setting can be overridden for specific players. @@ -30526,6 +29928,19 @@ // "forever" - 99999 seconds "Human Cooldown" "0" + // Human-controlled Mutant Tanks must wait this long before using their range ability again. + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0 (OFF) + // Maximum: 99999 (Longest) + // -- + // Keywords: + // "never"/"disabled"/"false"/"off"/"no" - 0 seconds + // "second" - 1 second + // "minute" - 1 minute + // "forever" - 99999 seconds + "Human Range Cooldown" "0" + // The ability can only activate in open areas. // Note: Do not change this setting if you are unsure of how it works. // Note: This setting can be overridden for specific players. @@ -30538,36 +29953,95 @@ // "farthest" - 99999.0 range "Open Areas Only" "0.0" - // The ability is only effective toward human survivors. + // The ability is only effective toward human-controlled survivors. // Note: This setting can be overridden for specific players. // -- // Minimum: 0 // Maximum: 32 // -- // 0: OFF - // 1-32: ON, the number of human survivors required to be present for this ability to be effective. + // 1-32: ON, the number of human-controlled survivors required to be present for this ability to be effective. "Requires Humans" "1" // Enable this ability. + // Note: This setting does not affect the "Whirl Hit" setting. // Note: This setting can be overridden for specific players. // -- // 0/"disabled"/"false"/"off"/"no": OFF // 1/"enabled"/"true"/"on"/"yes": ON "Ability Enabled" "0" + // Show a screen fade effect when the Mutant Tank uses its abilities. + // Note: The colors will randomly change between the colors set in the "Skin Color" and "Glow Color" settings. + // Note: This setting can be overridden for specific players. + // -- + // Add up numbers together for different results. + // -- + // Minimum: 0 + // Maximum: 7 + // -- + // 0: OFF + // 1: Show effect when the Mutant Tank uses its claw/rock attack. + // 2: Show effect when the Mutant Tank is hit by a melee weapon. + // 4: Show effect when the Mutant Tank uses its range ability. + // -- + // Keywords: + // "none"/"off" - 0 + // "attack" - 1 + // "hurt" - 2 + // "attack,hurt" - 3 + // "range" - 4 + // "attack,range" - 5 + // "hurt,range" - 6 + // "attack,hurt,range" - 7 + "Ability Effect" "0" + // Display a message whenever the ability activates/deactivates. // Note: This setting can be overridden for specific players. // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON + // Add up numbers together for different results. + // -- + // Minimum: 0 + // Maximum: 3 + // -- + // 0: OFF + // 1: Display message only when "Whirl Hit" is enabled. + // 2: Display message only when "Ability Enabled" is enabled. + // -- + // Keywords: + // "none"/"off" - 0 + // "hit" - 1 + // "ability" - 2 + // "both"/"all"/"hit,ability" - 3 "Ability Message" "0" - // The Mutant Tank converts this many common infected into Witch minions at once. + // Check line-of-sight when the Mutant Tank uses its abilities. // Note: This setting can be overridden for specific players. // -- - // Minimum: 1 - // Maximum: 25 - "Witch Amount" "3" + // Minimum: 0 + // Maximum: 5 + // -- + // 0: OFF + // 1: Check if there is a solid object between the Mutant Tank and survivors. + // 2: Option 1 + Check if the Mutant Tank is looking toward the survivors. + // 3: Option 1 + Check if the Mutant Tank is looking away from the survivors. + // 4: Option 1 + Check if the survivors are looking toward the Mutant Tank. + // 5: Option 1 + Check if the survivors are looking away from the Mutant Tank. + "Ability Sight" "0" + + // The axis of the Mutant Tank's whirl effect. + // Note: This setting can be overridden for specific players. + // -- + // Add up numbers together for different results. + // -- + // Minimum: 0 + // Maximum: 7 + // -- + // 0 OR 7: Pick randomly between the 3 axes. + // 1: X-Axis + // 2: Y-Axis + // 4: Z-Axis + "Whirl Axis" "0" // The Mutant Tank has this many chances out of 100.0% to trigger the ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -30582,9 +30056,9 @@ // "maybe" - 50% chance // "often"/"likely"/"frequently" - 66.6% chance // "always" - 100% chance - "Witch Chance" "33.3" + "Whirl Chance" "33.3" - // The cooldown for the Mutant Tank's ability. + // The cooldown for the Mutant Tank's hit ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- @@ -30596,179 +30070,56 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Witch Cooldown" "0" + "Whirl Cooldown" "0" - // The Mutant Tank's Witch minion causes this much damage per hit. + // The Mutant Tank's ability effects last this long. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.0 (OFF) - // Maximum: 99999.0 - // -- - // Keywords: - // "weakest" - 1.0 damage - // "strongest" - 99999.0 damage - "Witch Damage" "5.0" - - // Witches spawned by the Mutant Tank die after this many seconds. - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0.0 (Until death) - // Maximum: 99999.0 (Longest) + // Minimum: 1 + // Maximum: 99999 // -- // Keywords: - // "never"/"disabled"/"false"/"off"/"no" - 0 seconds - // "milli"/"millisecond" - 0.1 seconds // "second" - 1 second // "minute" - 1 minute - // "forever"/"death" - 99999 seconds - "Witch Lifetime" "0.0" - - // The distance between a common infected and the Mutant Tank needed to trigger the ability. - // Note: This is ignored when the "Combo Ability" setting is set to "1". - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 1.0 (Closest) - // Maximum: 99999.0 (Farthest) - // -- - // Keywords: - // "closest" - 1.0 range - // "farthest" - 99999.0 range - "Witch Range" "500.0" + // "forever" - 99999 seconds + "Whirl Duration" "5" - // Remove all Witches spawned by the Mutant Tank when it dies or changes its Mutant Tank type. - // Note: This setting spawns a Witch on the Mutant Tank's corpse if it is set to "0". + // Enable the Mutant Tank's claw/rock attack. + // Note: This setting does not need the "Ability Enabled" setting to be set to "1". // Note: This setting can be overridden for specific players. // -- // 0/"disabled"/"false"/"off"/"no": OFF // 1/"enabled"/"true"/"on"/"yes": ON - "Witch Remove" "1" - - "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" - { - // Note: Override any of the settings in the "Witch Ability" section for each special infected here. - - // Example - "Access Flags" "" - "Immunity Flags" "" - "Close Areas Only" "0.0" - "Combo Ability" "0" - "Human Ability" "0" - "Human Ammo" "5" - "Human Cooldown" "0" - "Open Areas Only" "0.0" - "Requires Humans" "1" - "Ability Enabled" "0" - "Ability Message" "0" - "Witch Amount" "3" - "Witch Chance" "33.3" - "Witch Cooldown" "0" - "Witch Damage" "5.0" - "Witch Lifetime" "0.0" - "Witch Range" "500.0" - "Witch Remove" "1" - } - } - } -} -``` -
- -##### Xiphos Ability -
- Click to expand! - -``` -"Mutant Tanks" -{ - "Tank #1" - { - // The Mutant Tank can steal health from survivors and vice-versa. - // Note: Survivors only get a portion of the damage as health while Tanks get the full damage as health. - // Requires "mt_abilities2.smx" to be compiled with "mt_xiphos.sp" to work. - "Xiphos Ability" - { - // Admins with one or more of these access flags have access to this ability. - // Note: This setting can be overridden for specific players. - // -- - // Empty: No access flags have access. - // Not empty: These access flags have access. - "Access Flags" "" - - // Admins with one or more of these immunity flags are immune to this ability's effects. - // Note: If the Mutant Tank has one or more of these immunity flags or has the same immunity flags as the survivor victim, the immunity is cancelled. - // Note: This setting can be overridden for specific players. - // -- - // Empty: No immunity flags are immune. - // Not empty: These immunity flags are immune. - "Immunity Flags" "" + "Whirl Hit" "0" - // The ability can only activate in close areas. - // Note: Do not change this setting if you are unsure of how it works. + // The mode of the Mutant Tank's claw/rock attack. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.0 (OFF) - // Maximum: 99999.0 (Farthest) + // 0: Both + // 1: Ability activates when the Mutant Tank hits a survivor. + // 2: Ability activates when the Mutant Tank is hit by a survivor. // -- // Keywords: - // "disabled"/"false"/"off"/"no" - 0.0 range - // "farthest" - 99999.0 range - "Close Areas Only" "0.0" - - // Allow human-controlled Mutant Tanks to use this ability. - // Note: This setting can be overridden for specific players. - // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON, players can use buttons to activate abilities. - "Human Ability" "0" + // "both"/"all" - 0 + // "tank"/"attack" - 1 + // "survivor"/"hurt" - 2 + "Whirl Hit Mode" "0" - // The ability can only activate in open areas. - // Note: Do not change this setting if you are unsure of how it works. + // The distance between a survivor and the Mutant Tank needed to trigger the ability. + // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.0 (OFF) + // Minimum: 1.0 (Closest) // Maximum: 99999.0 (Farthest) // -- // Keywords: - // "disabled"/"false"/"off"/"no" - 0.0 range + // "closest" - 1.0 range // "farthest" - 99999.0 range - "Open Areas Only" "0.0" - - // The ability is only effective toward human survivors. - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0 - // Maximum: 32 - // -- - // 0: OFF - // 1-32: ON, the number of human survivors required to be present for this ability to be effective. - "Requires Humans" "0" - - // Enable this ability. - // Note: This setting can be overridden for specific players. - // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Ability Enabled" "0" - - // Show a screen fade effect when the Mutant Tank uses its abilities. - // Note: The colors will randomly change between the colors set in the "Skin Color" and "Glow Color" settings. - // Note: This setting can be overridden for specific players. - // -- - // 0/"disabled"/"false"/"off"/"no": OFF - // 1/"enabled"/"true"/"on"/"yes": ON - "Ability Effect" "0" - - // Display a message whenever the ability activates/deactivates. - // Note: This setting can be overridden for specific players. - // -- - // 0: OFF - // 1: Display message only when the Tank hurts a survivor. - // 2: Display message only when a survivor hurts the Tank. - // 3: Both - "Ability Message" "0" + "Whirl Range" "150.0" - // The Mutant Tank has this many chances out of 100.0% to trigger the ability. + // The Mutant Tank has this many chances out of 100.0% to trigger the range ability. + // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- // Minimum: 0.0 (No chance) @@ -30780,32 +30131,59 @@ // "maybe" - 50% chance // "often"/"likely"/"frequently" - 66.6% chance // "always" - 100% chance - "Xiphos Chance" "33.3" + "Whirl Range Chance" "15.0" - // The survivors' max health. - // Note: Survivors will not gain health if they already have this much health. + // The cooldown for the Mutant Tank's range ability. + // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 (OFF, use the value set by the game.) - // Maximum: 1000000 - "Xiphos Max Health" "100" + // Minimum: 0 (OFF) + // Maximum: 99999 (Longest) + // -- + // Keywords: + // "never"/"disabled"/"false"/"off"/"no" - 0 seconds + // "second" - 1 second + // "minute" - 1 minute + // "forever" - 99999 seconds + "Whirl Range Cooldown" "0" + + // The Mutant Tank makes survivors whirl at this speed. + // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 1.0 + // Maximum: 99999.0 + "Whirl Speed" "500.0" "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" { - // Note: Override any of the settings in the "Xiphos Ability" section for each special infected here. + // Note: Override any of the settings in the "Whirl Ability" section for each special infected here. // Example "Access Flags" "" "Immunity Flags" "" "Close Areas Only" "0.0" + "Combo Ability" "0" "Human Ability" "0" + "Human Ammo" "5" + "Human Cooldown" "0" + "Human Range Cooldown" "0" "Open Areas Only" "0.0" - "Requires Humans" "0" + "Requires Humans" "1" "Ability Enabled" "0" "Ability Effect" "0" "Ability Message" "0" - "Xiphos Chance" "33.3" - "Xiphos Max Health" "100" + "Ability Sight" "0" + "Whirl Axis" "0" + "Whirl Chance" "33.3" + "Whirl Cooldown" "0" + "Whirl Duration" "5" + "Whirl Hit" "0" + "Whirl Hit Mode" "0" + "Whirl Range" "150.0" + "Whirl Range Chance" "15.0" + "Whirl Range Cooldown" "0" + "Whirl Speed" "500.0" } } } @@ -30813,7 +30191,7 @@ ```
-##### Yell Ability +##### Witch Ability
Click to expand! @@ -30822,9 +30200,9 @@ { "Tank #1" { - // The Mutant Tank yells to deafen survivors. - // Requires "mt_abilities2.smx" to be compiled with "mt_yell.sp" to work. - "Yell Ability" + // The Mutant Tank converts nearby common infected into Witch minions. + // Requires "mt_abilities2.smx" to be compiled with "mt_witch.sp" to work. + "Witch Ability" { // Admins with one or more of these access flags have access to this ability. // Note: This setting can be overridden for specific players. @@ -30894,26 +30272,6 @@ // "forever" - 99999 seconds "Human Cooldown" "0" - // The Mutant Tank's ability effects last this long. - // Note: This setting does not affect human-controlled Mutant Tanks unless the "Human Mode" setting is set to "0". - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0 - // Maximum: 99999 - // -- - // Keywords: - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Human Duration" "5" - - // The mode of how human-controlled Mutant Tanks activate their abilities. - // Note: This setting can be overridden for specific players. - // -- - // 0: Press buttons to activate corresponding abilities. Cooldown starts after ability's duration ends. - // 1: Hold down buttons to keep corresponding abilities activated. Cooldown starts after the player lets go of the buttons. - "Human Mode" "1" - // The ability can only activate in open areas. // Note: Do not change this setting if you are unsure of how it works. // Note: This setting can be overridden for specific players. @@ -30926,15 +30284,15 @@ // "farthest" - 99999.0 range "Open Areas Only" "0.0" - // The ability is only effective toward human survivors. + // The ability is only effective toward human-controlled survivors. // Note: This setting can be overridden for specific players. // -- // Minimum: 0 // Maximum: 32 // -- // 0: OFF - // 1-32: ON, the number of human survivors required to be present for this ability to be effective. - "Requires Humans" "0" + // 1-32: ON, the number of human-controlled survivors required to be present for this ability to be effective. + "Requires Humans" "1" // Enable this ability. // Note: This setting can be overridden for specific players. @@ -30950,19 +30308,12 @@ // 1/"enabled"/"true"/"on"/"yes": ON "Ability Message" "0" - // Check line-of-sight when the Mutant Tank uses its abilities. + // The Mutant Tank converts this many common infected into Witch minions at once. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 - // Maximum: 5 - // -- - // 0: OFF - // 1: Check if there is a solid object between the Mutant Tank and survivors. - // 2: Option 1 + Check if the Mutant Tank is looking toward the survivors. - // 3: Option 1 + Check if the Mutant Tank is looking away from the survivors. - // 4: Option 1 + Check if the survivors are looking toward the Mutant Tank. - // 5: Option 1 + Check if the survivors are looking away from the Mutant Tank. - "Ability Sight" "0" + // Minimum: 1 + // Maximum: 25 + "Witch Amount" "3" // The Mutant Tank has this many chances out of 100.0% to trigger the ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -30977,7 +30328,7 @@ // "maybe" - 50% chance // "often"/"likely"/"frequently" - 66.6% chance // "always" - 100% chance - "Yell Chance" "33.3" + "Witch Chance" "33.3" // The cooldown for the Mutant Tank's ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -30991,9 +30342,9 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Yell Cooldown" "0" + "Witch Cooldown" "0" - // The Mutant Tank's yells do this much damage. + // The Mutant Tank's Witch minion causes this much damage per hit. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- @@ -31003,51 +30354,23 @@ // Keywords: // "weakest" - 1.0 damage // "strongest" - 99999.0 damage - "Yell Damage" "5.0" - - // The Mutant Tank's ability effects last this long. - // Note: This is ignored when the "Combo Ability" setting is set to "1". - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0 - // Maximum: 99999 - // -- - // Keywords: - // "second" - 1 second - // "minute" - 1 minute - // "forever" - 99999 seconds - "Yell Duration" "5" + "Witch Damage" "5.0" - // The Mutant Tank yells at nearby survivors every time this many seconds passes. - // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Witches spawned by the Mutant Tank die after this many seconds. // Note: This setting can be overridden for specific players. // -- - // Minimum: 0.1 - // Maximum: 99999.0 + // Minimum: 0.0 (Until death) + // Maximum: 99999.0 (Longest) // -- // Keywords: + // "never"/"disabled"/"false"/"off"/"no" - 0 seconds // "milli"/"millisecond" - 0.1 seconds // "second" - 1 second // "minute" - 1 minute - // "forever" - 99999 seconds - "Yell Interval" "5.0" - - // The mode of the Mutant Tank's yell ability. - // Note: This setting can be overridden for specific players. - // -- - // 0: Both - // 1: Deafen only. - // 2: Roar only. - "Yell Mode" "0" - - // The Mutant Tank's yell pitch. - // Note: This setting can be overridden for specific players. - // -- - // Minimum: 0 (OFF) - // Maximum: 255 (Highest) - "Yell Pitch" "100" + // "forever"/"death" - 99999 seconds + "Witch Lifetime" "0.0" - // The distance between a survivor and the Mutant Tank needed to trigger the ability. + // The distance between a common infected and the Mutant Tank needed to trigger the ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- @@ -31057,11 +30380,19 @@ // Keywords: // "closest" - 1.0 range // "farthest" - 99999.0 range - "Yell Range" "500.0" + "Witch Range" "500.0" + + // Remove all Witches spawned by the Mutant Tank when it dies or changes its Mutant Tank type. + // Note: This setting spawns a Witch on the Mutant Tank's corpse if it is set to "0". + // Note: This setting can be overridden for specific players. + // -- + // 0/"disabled"/"false"/"off"/"no": OFF + // 1/"enabled"/"true"/"on"/"yes": ON + "Witch Remove" "1" "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" { - // Note: Override any of the settings in the "Yell Ability" section for each special infected here. + // Note: Override any of the settings in the "Witch Ability" section for each special infected here. // Example "Access Flags" "" @@ -31071,21 +30402,17 @@ "Human Ability" "0" "Human Ammo" "5" "Human Cooldown" "0" - "Human Duration" "5" - "Human Mode" "1" "Open Areas Only" "0.0" - "Requires Humans" "0" + "Requires Humans" "1" "Ability Enabled" "0" "Ability Message" "0" - "Ability Sight" "0" - "Yell Chance" "33.3" - "Yell Cooldown" "0" - "Yell Damage" "5.0" - "Yell Duration" "5" - "Yell Interval" "5.0" - "Yell Mode" "0" - "Yell Pitch" "100" - "Yell Range" "500.0" + "Witch Amount" "3" + "Witch Chance" "33.3" + "Witch Cooldown" "0" + "Witch Damage" "5.0" + "Witch Lifetime" "0.0" + "Witch Range" "500.0" + "Witch Remove" "1" } } } @@ -31093,7 +30420,7 @@ ```
-##### Zombie Ability +##### Yell Ability
Click to expand! @@ -31102,9 +30429,9 @@ { "Tank #1" { - // The Mutant Tank spawns zombies. - // Requires "mt_abilities2.smx" to be compiled with "mt_zombie.sp" to work. - "Zombie Ability" + // The Mutant Tank yells to deafen survivors. + // Requires "mt_abilities2.smx" to be compiled with "mt_yell.sp" to work. + "Yell Ability" { // Admins with one or more of these access flags have access to this ability. // Note: This setting can be overridden for specific players. @@ -31113,6 +30440,14 @@ // Not empty: These access flags have access. "Access Flags" "" + // Admins with one or more of these immunity flags are immune to this ability's effects. + // Note: If the Mutant Tank has one or more of these immunity flags or has the same immunity flags as the survivor victim, the immunity is cancelled. + // Note: This setting can be overridden for specific players. + // -- + // Empty: No immunity flags are immune. + // Not empty: These immunity flags are immune. + "Immunity Flags" "" + // The ability can only activate in close areas. // Note: Do not change this setting if you are unsure of how it works. // Note: This setting can be overridden for specific players. @@ -31184,6 +30519,7 @@ // -- // 0: Press buttons to activate corresponding abilities. Cooldown starts after ability's duration ends. // 1: Hold down buttons to keep corresponding abilities activated. Cooldown starts after the player lets go of the buttons. + // 2: Press buttons to toggle corresponding abilities. Cooldown starts after ability is deactivated. "Human Mode" "1" // The ability can only activate in open areas. @@ -31198,14 +30534,14 @@ // "farthest" - 99999.0 range "Open Areas Only" "0.0" - // The ability is only effective toward human survivors. + // The ability is only effective toward human-controlled survivors. // Note: This setting can be overridden for specific players. // -- // Minimum: 0 // Maximum: 32 // -- // 0: OFF - // 1-32: ON, the number of human survivors required to be present for this ability to be effective. + // 1-32: ON, the number of human-controlled survivors required to be present for this ability to be effective. "Requires Humans" "0" // Enable this ability. @@ -31222,12 +30558,19 @@ // 1/"enabled"/"true"/"on"/"yes": ON "Ability Message" "0" - // The Mutant Tank spawns this many common infected at once. + // Check line-of-sight when the Mutant Tank uses its abilities. // Note: This setting can be overridden for specific players. // -- - // Minimum: 1 - // Maximum: 100 - "Zombie Amount" "10" + // Minimum: 0 + // Maximum: 5 + // -- + // 0: OFF + // 1: Check if there is a solid object between the Mutant Tank and survivors. + // 2: Option 1 + Check if the Mutant Tank is looking toward the survivors. + // 3: Option 1 + Check if the Mutant Tank is looking away from the survivors. + // 4: Option 1 + Check if the survivors are looking toward the Mutant Tank. + // 5: Option 1 + Check if the survivors are looking away from the Mutant Tank. + "Ability Sight" "0" // The Mutant Tank has this many chances out of 100.0% to trigger the ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -31242,7 +30585,7 @@ // "maybe" - 50% chance // "often"/"likely"/"frequently" - 66.6% chance // "always" - 100% chance - "Zombie Chance" "33.3" + "Yell Chance" "33.3" // The cooldown for the Mutant Tank's ability. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -31256,7 +30599,19 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Zombie Cooldown" "0" + "Yell Cooldown" "0" + + // The Mutant Tank's yells do this much damage. + // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Note: This setting can be overridden for specific players. + // -- + // Minimum: 0.0 (OFF) + // Maximum: 99999.0 + // -- + // Keywords: + // "weakest" - 1.0 damage + // "strongest" - 99999.0 damage + "Yell Damage" "5.0" // The Mutant Tank's ability effects last this long. // Note: This is ignored when the "Combo Ability" setting is set to "1". @@ -31269,9 +30624,9 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Zombie Duration" "0" + "Yell Duration" "5" - // The Mutant Tank spawns a zombie mob every time this many seconds passes. + // The Mutant Tank yells at nearby survivors every time this many seconds passes. // Note: This is ignored when the "Combo Ability" setting is set to "1". // Note: This setting can be overridden for specific players. // -- @@ -31283,41 +30638,42 @@ // "second" - 1 second // "minute" - 1 minute // "forever" - 99999 seconds - "Zombie Interval" "5.0" + "Yell Interval" "5.0" - // The mode of the Mutant Tank's zombie mob spawn ability. + // The mode of the Mutant Tank's yell ability. // Note: This setting can be overridden for specific players. // -- // 0: Both - // 1: The Mutant Tank spawns common infected. - // 2: The Mutant Tank spawns uncommon infected. - "Zombie Mode" "0" + // 1: Deafen only. + // 2: Roar only. + "Yell Mode" "0" - // The type of zombies to spawn. - // Note: This setting only works when the "Zombie Mode" setting is set to "0" or "2". + // The Mutant Tank's yell pitch. // Note: This setting can be overridden for specific players. // -- - // Add up numbers together for different results. + // Minimum: 0 (OFF) + // Maximum: 255 (Highest) + "Yell Pitch" "100" + + // The distance between a survivor and the Mutant Tank needed to trigger the ability. + // Note: This is ignored when the "Combo Ability" setting is set to "1". + // Note: This setting can be overridden for specific players. // -- - // Minimum: 0 - // Maximum: 127 + // Minimum: 1.0 (Closest) + // Maximum: 99999.0 (Farthest) // -- - // 0 OR 127: Pick randomly between the 7 options. - // 1: CEDA Worker (Dead Center) - // 2: Jimmy Gibbs Jr. (Dead Center) - // 4: Fallen Survivor (The Passing) - // 8: Clown (Dark Carnival) - // 16: Mudman (Swamp Fever) - // 32: Roadcrew Worker (Hard Rain) - // 64: Riot Cop (The Parish) - "Zombie Type" "0" + // Keywords: + // "closest" - 1.0 range + // "farthest" - 99999.0 range + "Yell Range" "500.0" "Special" // Syntax: "Special"/"spec"/"Infected"/"inf" { - // Note: Override any of the settings in the "Zombie Ability" section for each special infected here. + // Note: Override any of the settings in the "Yell Ability" section for each special infected here. // Example "Access Flags" "" + "Immunity Flags" "" "Close Areas Only" "0.0" "Combo Ability" "0" "Human Ability" "0" @@ -31329,13 +30685,15 @@ "Requires Humans" "0" "Ability Enabled" "0" "Ability Message" "0" - "Zombie Amount" "10" - "Zombie Chance" "33.3" - "Zombie Cooldown" "0" - "Zombie Duration" "0" - "Zombie Interval" "5.0" - "Zombie Mode" "0" - "Zombie Type" "0" + "Ability Sight" "0" + "Yell Chance" "33.3" + "Yell Cooldown" "0" + "Yell Damage" "5.0" + "Yell Duration" "5" + "Yell Interval" "5.0" + "Yell Mode" "0" + "Yell Pitch" "100" + "Yell Range" "500.0" } } } diff --git a/README.md b/README.md index b553577b91..d6ca508d23 100644 --- a/README.md +++ b/README.md @@ -11,8 +11,8 @@
Click to expand! -Mutant Tanks: a L4D/L4D2 SourceMod Plugin -Copyright (C) 2024 Alfred "Psyk0tik" Llagas +Mutant Tanks: A L4D/L4D2 SourceMod Plugin +Copyright (C) 2017-2025 Alfred "Psyk0tik" Llagas 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. @@ -61,8 +61,8 @@ Originally an extended version of Super Tanks, Mutant Tanks combines Last Boss, 6. Store up to 500 Mutant Tank types. 7. Administration system designed for access and immunity to Mutant Tanks. 8. Custom target filters for targeting survivors, special infected, and Mutant Tanks. -9. Over 1,500 optional settings to configure. -10. Over 70 unique abilities to choose from. +9. Over 3,000 optional settings to configure. +10. Over 30 unique abilities to choose from. 11. Choose which abilities to install. 12. Add custom abilities and features through the use of forwards and natives. 13. Create all kinds of combinations of abilities. @@ -71,6 +71,10 @@ Originally an extended version of Super Tanks, Mutant Tanks combines Last Boss, 16. Detects idle or bugged Tanks. 17. Toggle damage scaling based on difficulty. 18. Fully customizable reward system. +19. Fully customizable punishment system. +20. Fully customizable passive system. +21. Fully customizable spawn protection. +22. And many more!
## Commands @@ -86,6 +90,18 @@ sm_mt_list - View a list of installed abilities. sm_mt_reload - Reload the config file. sm_tank - Spawn a Mutant Tank. sm_mt_tank - Spawn a Mutant Tank. +sm_smoker - Spawn a Mutant Smoker. +sm_mt_smoker - Spawn a Mutant Smoker. +sm_boomer - Spawn a Mutant Boomer. +sm_mt_boomer - Spawn a Mutant Boomer. +sm_hunter - Spawn a Mutant Hunter. +sm_mt_hunter - Spawn a Mutant Hunter. +sm_spitter - Spawn a Mutant Spitter. +sm_mt_spitter - Spawn a Mutant Spitter. +sm_jockey - Spawn a Mutant Jockey. +sm_mt_jockey - Spawn a Mutant Jockey. +sm_charger - Spawn a Mutant Charger. +sm_mt_charger - Spawn a Mutant Charger. sm_mt_version - Find out the current version of Mutant Tanks. // Accessible by the developer only. @@ -93,19 +109,31 @@ sm_mt_dev - Used only by and for the developer. // Accessible by all players. sm_mutanttank - Choose a Mutant Tank. (This command only works if the "Spawn Mode" setting under the "Plugin Settings/Human Support" section is set to 0.) +sm_mtank - Choose a Mutant Tank. (This command only works if the "Spawn Mode" setting under the "Plugin Settings/Human Support" section is set to 0.) +sm_mutantsmoker - Choose a Mutant Smoker. (This command only works if the "Spawn Mode" setting under the "Plugin Settings/Human Support" section is set to 0.) +sm_msmoker - Choose a Mutant Smoker. (This command only works if the "Spawn Mode" setting under the "Plugin Settings/Human Support" section is set to 0.) +sm_mutantboomer - Choose a Mutant Boomer. (This command only works if the "Spawn Mode" setting under the "Plugin Settings/Human Support" section is set to 0.) +sm_mboomer - Choose a Mutant Boomer. (This command only works if the "Spawn Mode" setting under the "Plugin Settings/Human Support" section is set to 0.) +sm_mutanthunter - Choose a Mutant Hunter. (This command only works if the "Spawn Mode" setting under the "Plugin Settings/Human Support" section is set to 0.) +sm_mhunter - Choose a Mutant Hunter. (This command only works if the "Spawn Mode" setting under the "Plugin Settings/Human Support" section is set to 0.) +sm_mutantspitter - Choose a Mutant Spitter. (This command only works if the "Spawn Mode" setting under the "Plugin Settings/Human Support" section is set to 0.) +sm_mspitter - Choose a Mutant Spitter. (This command only works if the "Spawn Mode" setting under the "Plugin Settings/Human Support" section is set to 0.) +sm_mutantjockey - Choose a Mutant Jockey. (This command only works if the "Spawn Mode" setting under the "Plugin Settings/Human Support" section is set to 0.) +sm_mjockey - Choose a Mutant Jockey. (This command only works if the "Spawn Mode" setting under the "Plugin Settings/Human Support" section is set to 0.) +sm_mutantcharger - Choose a Mutant Charger. (This command only works if the "Spawn Mode" setting under the "Plugin Settings/Human Support" section is set to 0.) +sm_mcharger - Choose a Mutant Charger. (This command only works if the "Spawn Mode" setting under the "Plugin Settings/Human Support" section is set to 0.) sm_mt_info - View information about Mutant Tanks. sm_mt_prefs - Set your Mutant Tanks preferences. // Packaged -sm_mt_ability - View information about each ability (A-L). -sm_mt_ability2 - View information about each ability (M-Z). +sm_mt_ability - View information about each ability (A-J). +sm_mt_ability2 - View information about each ability (L-Z). // Standalone sm_mt_absorb - View information about the Absorb ability. sm_mt_acid - View information about the Acid ability. sm_mt_aimless - View information about the Aimless ability. sm_mt_ammo - View information about the Ammo ability. -sm_mt_blind - View information about the Blind ability. sm_mt_bomb - View information about the Bomb ability. sm_mt_bury - View information about the Bury ability. sm_mt_car - View information about the Car ability. @@ -127,27 +155,21 @@ sm_mt_god - View information about the God ability. sm_mt_gravity - View information about the Gravity ability. sm_mt_gunner - View information about the Gunner ability. sm_mt_heal - View information about the Heal ability. -sm_mt_hit - View information about the Hit ability. sm_mt_hurt - View information about the Hurt ability. sm_mt_hypno - View information about the Hypno ability. sm_mt_ice - View information about the Ice ability. sm_mt_idle - View information about the Idle ability. sm_mt_invert - View information about the Invert ability. -sm_mt_item - View information about the Item ability. sm_mt_jump - View information about the Jump ability. -sm_mt_kamikaze - View information about the Kamikaze ability. sm_mt_lag - View information about the Lag ability. sm_mt_laser - View information about the Laser ability. -sm_mt_leech - View information about the Leech ability. sm_mt_lightning - View information about the Lightning ability. sm_mt_medic - View information about the Medic ability. sm_mt_meteor - View information about the Meteor ability. sm_mt_minion - View information about the Minion ability. -sm_mt_necro - View information about the Necro ability. sm_mt_nullify - View information about the Nullify ability. sm_mt_omni - View information about the Omni ability. sm_mt_panic - View information about the Panic ability. -sm_mt_pimp - View information about the Pimp ability. sm_mt_puke - View information about the Puke ability. sm_mt_pyro - View information about the Pyro ability. sm_mt_quiet - View information about the Quiet ability. @@ -157,28 +179,19 @@ sm_mt_regen - View information about the Regen ability. sm_mt_respawn - View information about the Respawn ability. sm_mt_restart - View information about the Restart ability. sm_mt_rock - View information about the Rock ability. -sm_mt_rocket - View information about the Rocket ability. -sm_mt_shake - View information about the Shake ability. sm_mt_shield - View information about the Shield ability. sm_mt_shove - View information about the Shove ability. sm_mt_slow - View information about the Slow ability. sm_mt_smash - View information about the Smash ability. -sm_mt_smite - View information about the Smite ability. -sm_mt_spam - View information about the Spam ability. -sm_mt_splash - View information about the Splash ability. -sm_mt_splatter - View information about the Splatter ability. sm_mt_throw - View information about the Throw ability. sm_mt_track - View information about the Track ability. sm_mt_ultimate - View information about the Ultimate ability. sm_mt_undead - View information about the Undead ability. -sm_mt_vampire - View information about the Vampire ability. sm_mt_vision - View information about the Vision ability. sm_mt_warp - View information about the Warp ability. sm_mt_whirl - View information about the Whirl ability. sm_mt_witch - View information about the Witch ability. -sm_mt_xiphos - View information about the Xiphos ability. sm_mt_yell - View information about the Yell ability. -sm_mt_zombie - View information about the Zombie ability. ```
@@ -232,6 +245,17 @@ mt_enabledgamemodes "" // Maximum: "15.000000" mt_gamemodetypes "0" +// Sets the graphics level of the plugin to help with server performance. +// 0: OFF +// 1: Low +// 2: Medium +// 3: High +// - +// Default: "3" +// Minimum: "0.000000" +// Maximum: "3.000000" +mt_graphicslevel "3" + // Enable Mutant Tanks on listen servers. // 0: OFF // 1: ON @@ -1232,6 +1256,21 @@ forward void MT_OnRockThrow(int tank, int rock); **/ forward void MT_OnSettingsCached(int tank, bool apply, int type); +/** + * Called when a passive is given to or taken away from a survivor. + * Use this forward to give or take away passives. + * + * @param survivor Client index of the survivor. + * @param type 1 = Health, 2 = Damage boost, 4 = Speed boost, 8 = Ammo, 16 = Item, 32 = God mode, 64 = Health and ammo refill, 128 = Respawn, + * 255 = All eight passives, 256-2147483647 = Reserved for third-party plugins + * @param apply True if the passive is given, false otherwise. + * @param weaponOnly True if the passive is given to weapons only, false otherwise. + * @param weaponIndex Type index of the weapon. + * + * @return Plugin_Handled to prevent giving or taking passives, Plugin_Continue to allow. + **/ +forward Action MT_OnToggleSurvivorPassive(int survivor, int &type, bool apply, bool weaponOnly, int weaponIndex); + /** * Called when a Mutant Tank type has been chosen. * Use this forward to check or change the chosen type. @@ -1281,6 +1320,18 @@ native void MT_DeafenPlayer(int player); **/ native void MT_DetonateTankRock(int rock); +/** + * Returns if a certain survivor has a passive type active. + * + * @param survivor Client index of the survivor. + * @param type 1 = Health, 2 = Damage boost, 4 = Speed boost, 8 = Ammo, 16 = Item, 32 = God mode, 64 = Health and ammo refill, + * 128 = Respawn, 255 = All eight passives, 256-2147483647 = Reserved for third-party plugins + * + * @return True if the survivor has the passive type active, false otherwise. + * @error Invalid client index, client is not in-game, or type is 0 or less. + **/ +native bool MT_DoesSurvivorHavePassiveType(int survivor, int type); + /** * Returns if a certain survivor has a reward type active. * @@ -1368,6 +1419,13 @@ native int MT_GetGlowRange(int tank, bool mode); **/ native int MT_GetGlowType(int tank); +/** + * Returns the current graphics level. + * + * @return The current graphics level. + **/ +native int MT_GetGraphicsLevel(); + /** * Returns the current immunity flags set by the core plugin. * @@ -1670,10 +1728,11 @@ native void MT_ShoveBySurvivor(int player, int survivor, float direction[3]); * * @param tank Client index of the Tank. * @param type Mutant Tank type. + * @param specType Special Infected type. * * @error Invalid client index, client is not in-game, or type is 0 or less. **/ -native void MT_SpawnTank(int tank, int type); +native void MT_SpawnTank(int tank, int type, int specType = 0); /** * Staggers a player from a certain direction. @@ -2581,7 +2640,7 @@ Whatever each button activates is entirely up to your configuration settings. 4. How do I change the buttons or add extra buttons? -Edit lines `104-107` of the `mutant_tanks.inc` file and recompile each ability plugin. +Edit lines `107-110` of the `mutant_tanks.inc` file and recompile each ability plugin.
Question 5 @@ -2659,7 +2718,7 @@ That setting is a special mode setting for players, which can determine how some 10. Is there any way players can view information about this feature in-game? -Yes, use the `sm_mt_ability`/`sm_mt_ability2` commands. +Yes, use the `sm_mt_ability` command. The commands will each provide a menu that players can use to display certain information in chat. @@ -2753,7 +2812,7 @@ Set the values in `Execute Config Types`. **honorcode23** - For the [[L4D & L4D2] New Custom Commands](https://forums.alliedmods.net/showthread.php?t=133475) plugin. -**panxiaohai** - For the [[L4D & L4D2] We Can Not Survive Alone](https://forums.alliedmods.net/showthread.php?t=167389), [[L4D & L4D2] Melee Weapon Tank](https://forums.alliedmods.net/showthread.php?t=166356), [[L4D & L4D2] Tank's Power](https://forums.alliedmods.net/showthread.php?t=134537), and [[L4D & L4D2] Automatic Robot](https://forums.alliedmods.net/showthread.php?t=130177) plugins. +**panxiaohai** - For the [[L4D & L4D2] We Can Not Survive Alone](https://forums.alliedmods.net/showthread.php?t=167389), [[L4D & L4D2] Melee Weapon Tank](https://forums.alliedmods.net/showthread.php?t=166356), [[L4D & L4D2] Tank's Power](https://forums.alliedmods.net/showthread.php?t=134537), [[L4D & L4D2] Automatic Robot](https://forums.alliedmods.net/showthread.php?t=130177), and [[L4D2] Variable Size Of Infected and Witch](https://forums.alliedmods.net/showthread.php?t=165905) plugins. **strontiumdog** - For the [[ANY] Evil Admin: Mirror Damage](https://forums.alliedmods.net/showthread.php?t=79321), [[ANY] Evil Admin: Pimp Slap](https://forums.alliedmods.net/showthread.php?t=79322), [[ANY] Evil Admin: Rocket](https://forums.alliedmods.net/showthread.php?t=79617), and [Evil Admin: Vision](https://forums.alliedmods.net/showthread.php?t=79324) plugins. @@ -2843,7 +2902,7 @@ Set the values in `Execute Config Types`. **Princess LadyRain, Nekrob, fig101, BloodyBlade, user2000, MedicDTI, ben12398, AK978, ricksfishin, Voevoda, ur5efj, What, moekai, weffer, AlexAlcala, ddd123, GL_INS, Slaven555, Neki93, kot4404, KadabraZz, Krufftys Killers, thewintersoldier97, Balloons, George Rex, swofleswof, bedildewo, Dudus1st** - For reporting issues. -**Electr000999, foquaxticity, foxhound27, sxslmk, FatalOE71, zaviier, RDiver, BHaType, HarryPotter, jeremyvillanueva, DonProof, XXrevoltadoXX, XYZC, JustMadMan, DARG367, zonbarbar, Unfellowed** - For suggesting ideas. +**Electr000999, foquaxticity, foxhound27, sxslmk, FatalOE71, zaviier, RDiver, BHaType, HarryPotter, jeremyvillanueva, DonProof, XXrevoltadoXX, XYZC, JustMadMan, DARG367, zonbarbar, Unfellowed, maclarens** - For suggesting ideas. **Marttt** - For helping with many things and the pull requests. diff --git a/README_RU.md b/README_RU.md index 7dc6c5e8f3..5c59cc7bd5 100644 --- a/README_RU.md +++ b/README_RU.md @@ -1,4 +1,4 @@ -# Танки-мутанты (Mutant Tanks) +# Танки-мутанты ## PayPal [Пожертвовать для мотивации](https://paypal.me/Psyk0tikism?locale.x=ru_ru) @@ -12,7 +12,7 @@ Нажмите, чтобы расширить! Танки-мутанты: SourceMod плагин L4D/L4D2 -Все права защищены (C) 2024 Альфред "Psyk0tik" Лагас (Alfred "Psyk0tik" Llagas) +Все права защищены (C) 2017-2025 Альфред "Psyk0tik" Лагас (Alfred "Psyk0tik" Llagas) Эта программа является бесплатным программным обеспечением: вы можете распространять и/или изменять её в соответствии с условиями Стандартной общественной лицензии GNU, опубликованной Free Software Foundation, либо версии 3 Лицензии, либо (по вашему выбору) любой более поздней версии. @@ -61,8 +61,8 @@ 6. Можно создать до 500 типов Танков-мутантов. 7. Система администрирования, разработанная для доступа и иммунитету к танкам-мутантам. 8. Пользовательские целевые фильтры для выживших, особых заражённых и танков-мутантов. -9. Более 1,500 дополнительных настроек для настройки. -10. Более 70 уникальных способностей на выбор. +9. Более 3,000 дополнительных настроек для настройки. +10. Более 30 уникальных способностей на выбор. 11. Выбор способностей для установки. 12. Добавляйте собственные способности и функции с помощью forwards и natives. 13. Создавайте всевозможные комбинации способностей. @@ -71,6 +71,10 @@ 16. Обнаруживает неработающие или неисправные Танки. 17. Переключение увеличения/уменьшения урона в зависимости от сложности. 18. Полностью настраиваемая система наград. +19. Полностью настраиваемая система наказаний. +20. Полностью настраиваемая система пассивная. +21. Полностью настраиваемая защита от появления. +22. Множество других функций!
## Команды @@ -86,6 +90,18 @@ sm_mt_list - Просмотр списка установленных спосо sm_mt_reload - Перезагрузка файла конфигурации. sm_tank - Создать танка-мутанта. sm_mt_tank - Создать танка-мутанта. +sm_smoker - Создать курильщика-мутанта. +sm_mt_smoker - Создать курильщика-мутанта. +sm_boomer - Создать толстяка-мутанта. +sm_mt_boomer - Создать толстяка-мутанта. +sm_hunter - Создать охотника-мутанта. +sm_mt_hunter - Создать охотника-мутанта. +sm_spitter - Создать плевальщицы-мутанта. +sm_mt_spitter - Создать плевальщицы-мутанта. +sm_jockey - Создать жокея-мутанта. +sm_mt_jockey - Создать жокея-мутанта. +sm_charger - Создать громилы-мутанта. +sm_mt_charger - Создать громилы-мутанта. sm_mt_version - Узнать текущую версию плагина. // Доступно только разработчику. @@ -93,19 +109,31 @@ sm_mt_dev - Используется только разработчиком и // Доступны всем игрокам. sm_mutanttank - Выбрать танка-мутанта. (Эта команда работает только в том случае, если параметр "Spawn Mode" в разделе "Plugin Settings/Human Support" установлен на 0.) +sm_mtank - Выбрать танка-мутанта. (Эта команда работает только в том случае, если параметр "Spawn Mode" в разделе "Plugin Settings/Human Support" установлен на 0.) +sm_mutantsmoker - Выбрать курильщика-мутанта. (Эта команда работает только в том случае, если параметр "Spawn Mode" в разделе "Plugin Settings/Human Support" установлен на 0.) +sm_msmoker - Выбрать курильщика-мутанта. (Эта команда работает только в том случае, если параметр "Spawn Mode" в разделе "Plugin Settings/Human Support" установлен на 0.) +sm_mutantboomer - Выбрать толстяка-мутанта. (Эта команда работает только в том случае, если параметр "Spawn Mode" в разделе "Plugin Settings/Human Support" установлен на 0.) +sm_mboomer - Выбрать толстяка-мутанта. (Эта команда работает только в том случае, если параметр "Spawn Mode" в разделе "Plugin Settings/Human Support" установлен на 0.) +sm_mutanthunter - Выбрать охотника-мутанта. (Эта команда работает только в том случае, если параметр "Spawn Mode" в разделе "Plugin Settings/Human Support" установлен на 0.) +sm_mhunter - Выбрать охотника-мутанта. (Эта команда работает только в том случае, если параметр "Spawn Mode" в разделе "Plugin Settings/Human Support" установлен на 0.) +sm_mutantspitter - Выбрать плевальщицы-мутанта. (Эта команда работает только в том случае, если параметр "Spawn Mode" в разделе "Plugin Settings/Human Support" установлен на 0.) +sm_mspitter - Выбрать плевальщицы-мутанта. (Эта команда работает только в том случае, если параметр "Spawn Mode" в разделе "Plugin Settings/Human Support" установлен на 0.) +sm_mutantjockey - Выбрать жокея-мутанта. (Эта команда работает только в том случае, если параметр "Spawn Mode" в разделе "Plugin Settings/Human Support" установлен на 0.) +sm_mjockey - Выбрать жокея-мутанта. (Эта команда работает только в том случае, если параметр "Spawn Mode" в разделе "Plugin Settings/Human Support" установлен на 0.) +sm_mutantcharger - Выбрать громилы-мутанта. (Эта команда работает только в том случае, если параметр "Spawn Mode" в разделе "Plugin Settings/Human Support" установлен на 0.) +sm_mcharger - Выбрать громилы-мутанта. (Эта команда работает только в том случае, если параметр "Spawn Mode" в разделе "Plugin Settings/Human Support" установлен на 0.) sm_mt_info - Просмотр информации о танках-мутантах. sm_mt_prefs - Установить свои настройки плагина танков-мутантов. // Комбинированный -sm_mt_ability - Просмотр информации каждой способности (A-L). -sm_mt_ability2 - Просмотр информации каждой способности (M-Z). +sm_mt_ability - Просмотр информации каждой способности (A-J). +sm_mt_ability2 - Просмотр информации каждой способности (L-Z). // Отдельный sm_mt_absorb - Просмотр информации о способности поглощения. sm_mt_acid - Просмотр информации о кислотной способности. sm_mt_aimless - Просмотр информации о способности бесприцельности. sm_mt_ammo - Просмотр информации о способности боеприпасов. -sm_mt_blind - Просмотр информации о способности ослепления. sm_mt_bomb - Просмотр информации о способности бомбы. sm_mt_bury - Просмотр информации о способности закапывания. sm_mt_car - Просмотр информации о способности машины. @@ -127,27 +155,21 @@ sm_mt_god - Просмотр информации о способности бо sm_mt_gravity - Просмотр информации о способности гравитации. sm_mt_gunner - Просмотр информации о способности стрелка. sm_mt_heal - Просмотр информации о способности лечения. -sm_mt_hit - Просмотр информации о способности слабого места. sm_mt_hurt - Просмотр информации о способности боли. sm_mt_hypno - Просмотр информации о гипноспособности. sm_mt_ice - Просмотр информации о способности льда. sm_mt_idle - Просмотр информации о способности бездействия. sm_mt_invert - Просмотр информации о способности инвертирования. -sm_mt_item - Просмотр информации о способности выпадения предметов. sm_mt_jump - Просмотр информации о способности прыжка. -sm_mt_kamikaze - Просмотр информации о способности камикадзе. sm_mt_lag - Просмотр информации о способности задержки. sm_mt_laser - Просмотр информации о лазерной способности. -sm_mt_leech - Просмотр информации о способности кровопийцы. sm_mt_lightning - Просмотр информации о способности грозового шторма. sm_mt_medic - Просмотр информации о способности медика. sm_mt_meteor - Просмотр информации о способности метеоритного дождя. sm_mt_minion - Просмотр информации о способности приспешников. -sm_mt_necro - Просмотр информации о некроспособности. sm_mt_nullify - Просмотр информации о способности обнуления. sm_mt_omni - Просмотр информации о омниспособности. sm_mt_panic - Просмотр информации о способности орды. -sm_mt_pimp - Просмотр информации о способности пощёчины. sm_mt_puke - Просмотр информации о способности рвоты. sm_mt_pyro - Просмотр информации о способности поджигателя. sm_mt_quiet - Просмотр информации о способности скрытности. @@ -157,28 +179,19 @@ sm_mt_regen - Просмотр информации о способности р sm_mt_respawn - Просмотр информации о способности возрождения. sm_mt_restart - Просмотр информации о способности перезапуска. sm_mt_rock - Просмотр информации о способности камнепада. -sm_mt_rocket - Просмотр информации о ракетной способности. -sm_mt_shake - Просмотр информации о способности дрожания. sm_mt_shield - Просмотр информации о способности щит. sm_mt_shove - Просмотр информации о способности толчка. sm_mt_slow - Просмотр информации о способности замедления. sm_mt_smash - Просмотр информации о способности сокрушения. -sm_mt_smite - Просмотр информации о способности толкания. -sm_mt_spam - Просмотр информации о способности спама. -sm_mt_splash - Просмотр информации о способности урона по области. -sm_mt_splatter - Просмотр информации о способности опрыскивания. sm_mt_throw - Просмотр информации о способности метания. sm_mt_track - Просмотр информации о способности самонаведения. sm_mt_ultimate - Просмотр информации о способности «Ультимэйт». sm_mt_undead - Просмотр информации о способности нежити. -sm_mt_vampire - Просмотр информации о способности вампира. sm_mt_vision - Просмотр информации о способности видимости. sm_mt_warp - Просмотр информации о способности искривления. sm_mt_whirl - Просмотр информации о способности вихря. sm_mt_witch - Просмотр информации о способности ведьмы. -sm_mt_xiphos - Просмотр информации о способности «Ксифос». sm_mt_yell - Просмотр информации о способности крика. -sm_mt_zombie - Просмотр информации о способности зомби. ``` @@ -232,6 +245,17 @@ mt_enabledgamemodes "" // Максимум: "15.000000" mt_gamemodetypes "0" +// Устанавливает уровень графики плагина для повышения производительности сервера. +// 0: ВЫКЛЮЧЕНЫ +// 1: Низкий +// 2: Середина +// 3: Высокий +// - +// По умолчанию: "3" +// Минимум: "0.000000" +// Максимум: "3.000000" +mt_graphicslevel "3" + // Включить Танков-мутантов на локальных серверах. // 0: ВЫКЛЮЧЕНЫ // 1: ВКЛЮЧЕНЫ @@ -1195,7 +1219,7 @@ forward void MT_OnResetTimers(int mode, int tank); * @param survivor Клиентский индекс выжившего. * @param tank Клиентский индекс танка. * @param type 1 = Здоровье, 2 = Усилитель урона, 4 = Скорость, 8 = Боеприпасы, 16 = Предмет, 32 = Режим бога, 64 = Пополнение здоровья и боеприпасов, 128 = Возрождение, - * 255 = Все восемь наград, 256-2147483647 = Зарезервировано для сторонних плагинов + * 255 = Все восемь награды, 256-2147483647 = Зарезервировано для сторонних плагинов * @param priority 0 = Убийца, 1 = Помощник в убийстве, который причинил наибольший ущерб, 2 = Товарищ по команде, который помог, 3 = Убийца, который причинил наибольший ущерб * @param duration Срок действия награды. * @param apply True, если награда дана, в противном случае - false. @@ -1232,6 +1256,21 @@ forward void MT_OnRockThrow(int tank, int rock); **/ forward void MT_OnSettingsCached(int tank, bool apply, int type); +/** + * Вызывается, когда выжившему дается или отнимается пассивный навык. + * Используйте этот форвард, чтобы давать или убирать пассивы. + * + * @param survivor Клиентский индекс выжившего. + * @param type 1 = Здоровье, 2 = Усиление урона, 4 = Ускорение, 8 = Боеприпасы, 16 = Предмет, 32 = Режим бога, 64 = Здоровье и пополнение боеприпасов, + * 128 = Возрождение, 255 = Все восемь пассивов, 256-2147483647 = Зарезервировано для сторонних плагинов + * @param apply True, если пассив дана, в противном случае - false. + * @param weaponOnly True, если пассив дана только оружию, в противном случае - false. + * @param weaponIndex Индекс типа оружия. + * + * @return Plugin_Handled, чтобы предотвратить выдачу или прекращение пассивов, Plugin_Continue, чтобы разрешить. + **/ +forward Action MT_OnToggleSurvivorPassive(int survivor, int &type, bool apply, bool weaponOnly, int weaponIndex); + /** * Вызывается при выборе типа танка-мутанта. * Используйте этот forward, чтобы проверить или изменить выбранный тип. @@ -1281,12 +1320,24 @@ native void MT_DeafenPlayer(int player); **/ native void MT_DetonateTankRock(int rock); +/** + * Возвращается, если у определённого выжившего активен тип пассивы. + * + * @param survivor Клиентский индекс выжившего. + * @param type 1 = Здоровье, 2 = Усиление урона, 4 = Ускорение, 8 = Боеприпасы, 16 = Предмет, 32 = Режим бога, 64 = Здоровье и пополнение боеприпасов, + * 128 = Возрождение, 255 = Все восемь пассивы, 256-2147483647 = Зарезервировано для сторонних плагинов + * + * @return True, если у выжившего активен тип пассивы, в противном случае - false. + * @error Неверный индекс клиента, клиента нет в игре или тип равен 0 или меньше. + **/ +native bool MT_DoesSurvivorHavePassiveType(int survivor, int type); + /** * Возвращается, если у определённого выжившего активен тип награды. * * @param survivor Клиентский индекс выжившего. * @param type 1 = Здоровье, 2 = Усиление урона, 4 = Ускорение, 8 = Боеприпасы, 16 = Предмет, 32 = Режим бога, 64 = Здоровье и пополнение боеприпасов, - * 128 = Возрождение, 255 = Все восемь наград, 256-2147483647 = Зарезервировано для сторонних плагинов + * 128 = Возрождение, 255 = Все восемь награды, 256-2147483647 = Зарезервировано для сторонних плагинов * * @return True, если у выжившего активен тип награды, в противном случае - false. * @error Неверный индекс клиента, клиента нет в игре или тип равен 0 или меньше. @@ -1368,6 +1419,13 @@ native int MT_GetGlowRange(int tank, bool mode); **/ native int MT_GetGlowType(int tank); +/** + * Возвращает текущий уровень графики. + * + * @return Текущий уровень графики. + **/ +native int MT_GetGraphicsLevel(); + /** * Возвращает текущие флаги иммунитета, установленные основным плагином. * @@ -1670,10 +1728,11 @@ native void MT_ShoveBySurvivor(int player, int survivor, float direction[3]); * * @param tank Клиентский индекс танка. * @param type Тип танка-мутанта. + * @param specType Тип особого заражённого. * * @error Неверный индекс клиента, клиент не в игре, или тип 0 или меньше. **/ -native void MT_SpawnTank(int tank, int type); +native void MT_SpawnTank(int tank, int type, int specType = 0); /** * Ошеломляет игрока с определённого направления. @@ -2581,7 +2640,7 @@ mutant_tanks // 3-й формат 4. Как мне изменить кнопки или добавить дополнительные кнопки? -Отредактируйте `104-107` строки файла `mutant_tanks.inc` и перекомпилируйте каждый плагин способности. +Отредактируйте `107-110` строки файла `mutant_tanks.inc` и перекомпилируйте каждый плагин способности.
Вопрос 5 @@ -2659,7 +2718,7 @@ mutant_tanks // 3-й формат 10. Есть ли способ просмотреть информацию об этой функции в игре? -Да, используйте `sm_mt_ability`/`sm_mt_ability2` команды. +Да, используйте `sm_mt_ability` команда. Каждая команда предоставляет меню, которое игроки могут использовать для отображения определённой информации в чате. @@ -2753,7 +2812,7 @@ Overrides **honorcode23** - За плагин [[L4D & L4D2] New Custom Commands](https://forums.alliedmods.net/showthread.php?t=133475). -**panxiaohai** - За плагины [[L4D & L4D2] We Can Not Survive Alone](https://forums.alliedmods.net/showthread.php?t=167389), [[L4D & L4D2] Melee Weapon Tank](https://forums.alliedmods.net/showthread.php?t=166356), [[L4D & L4D2] Tank's Power](https://forums.alliedmods.net/showthread.php?t=134537), и [[L4D & L4D2] Automatic Robot](https://forums.alliedmods.net/showthread.php?t=130177). +**panxiaohai** - За плагины [[L4D & L4D2] We Can Not Survive Alone](https://forums.alliedmods.net/showthread.php?t=167389), [[L4D & L4D2] Melee Weapon Tank](https://forums.alliedmods.net/showthread.php?t=166356), [[L4D & L4D2] Tank's Power](https://forums.alliedmods.net/showthread.php?t=134537), [[L4D & L4D2] Automatic Robot](https://forums.alliedmods.net/showthread.php?t=130177), и [[L4D2] Variable Size Of Infected and Witch](https://forums.alliedmods.net/showthread.php?t=165905). **strontiumdog** - За плагины [[ANY] Evil Admin: Mirror Damage](https://forums.alliedmods.net/showthread.php?t=79321), [[ANY] Evil Admin: Pimp Slap](https://forums.alliedmods.net/showthread.php?t=79322), [[ANY] Evil Admin: Rocket](https://forums.alliedmods.net/showthread.php?t=79617), и [Evil Admin: Vision](https://forums.alliedmods.net/showthread.php?t=79324). @@ -2843,7 +2902,7 @@ Overrides **Princess LadyRain, Nekrob, fig101, BloodyBlade, user2000, MedicDTI, ben12398, AK978, ricksfishin, Voevoda, ur5efj, What, moekai, weffer, AlexAlcala, ddd123, GL_INS, Slaven555, Neki93, kot4404, KadabraZz, Krufftys Killers, thewintersoldier97, Balloons, George Rex, swofleswof, bedildewo, Dudus1st** - За сообщения о проблемах. -**Electr000999, foquaxticity, foxhound27, sxslmk, FatalOE71, zaviier, RDiver, BHaType, HarryPotter, jeremyvillanueva, DonProof, XXrevoltadoXX, XYZC, JustMadMan, DARG367, zonbarbar, Unfellowed** - За предложения идей. +**Electr000999, foquaxticity, foxhound27, sxslmk, FatalOE71, zaviier, RDiver, BHaType, HarryPotter, jeremyvillanueva, DonProof, XXrevoltadoXX, XYZC, JustMadMan, DARG367, zonbarbar, Unfellowed, maclarens** - За предложения идей. **Marttt** - За помощь во многих вещах и pull request'ы. diff --git a/addons/sourcemod/data/mutant_tanks/backup_config/format1/mutant_tanks.cfg b/addons/sourcemod/data/mutant_tanks/backup_config/format1/mutant_tanks.cfg index 2b0a87aa1d..3dfd15df26 100644 --- a/addons/sourcemod/data/mutant_tanks/backup_config/format1/mutant_tanks.cfg +++ b/addons/sourcemod/data/mutant_tanks/backup_config/format1/mutant_tanks.cfg @@ -21,6 +21,7 @@ { "Plugin Enabled" "Yes" "Auto Update" "On" + "Graphics Level" "Max" "Bullet Fix" "Max" "Kick Bots" "Min" "Listen Support" "Enabled" @@ -38,11 +39,29 @@ "Cycle Types" "Min" "Spawn Enabled" "Max" "Spawn Limit" "Min" - "Type Range" "1-128" + "Type Range" "1-146" "Special" { "Special Types" "Min" } + "Mob" + { + "Mob Variants" "Min" + "Common Bio Chance" "50.0" + "Common Chance" "100.0" + "Common Check" "300.0" + "Common Damage Points" "50.0" + "Common Death Points" "100.0" + "Common Filter" "0" + "Common Goal" "5000.0" + "Common Variant" "0" + "Witch Chance" "100.0" + "Witch Filter" "0" + "Witch Mode" "0" + "Witch Mutate Chance" "100.0" + "Witch Range" "500.0" + "Witch Types" "0" + } } "Announcements" { @@ -64,6 +83,22 @@ "Announce Kill" "Min" } } + "Punishment" + { + "Punish Enabled" "-1,-1" //"145,146" + "Punish Bots" "-1,-1" //"145,146" + "Finale Check" "0" + "Punisher Types" "127,127" + "Punisher Lifetime" "5.0,5.0" + "Warning Distance" "500.0,1000.0" + "Punish Distance" "1000.0,2000.0" + "Warning Limit" "3,3" + "Warning Interval" "5,5" + "Survivor Types" "1" + "Survivors Required" "3" + "Incaps Required" "2" + "Zed Time" "1.0,1.0" + } "Rewards" { "Reward Enabled" "-1,-1,-1,-1" @@ -78,50 +113,69 @@ "Share Rewards" "0,0,0,0" "Teammate Limit" "0" "Action Duration Reward" "2.0,2.0,2.0,2.0" + "Adrenaline Time Reward" "30.0,30.0,30.0,30.0" "Ammo Boost Reward" "1,1,1,1" + "Ammo Refill Reward" "1,1,1,1" "Ammo Regen Reward" "1,1,1,1" "Attack Boost Reward" "1.25,1.25,1.25,1.25" "Blaze Health Reward" "1,1,1,1" + "Blood Donor Reward" "0,0,0,0" "Bunny Hop Reward" "1,1,1,1" "Burst Doors Reward" "1,1,1,1" "Clean Kills Reward" "1,1,1,1" "Cluster Bombs Reward" "3,3,3,3" "Damage Boost Reward" "1.25,1.25,1.25,1.25" "Damage Resistance Reward" "0.5,0.5,0.5,0.5" + "Dopamine Radius Reward" "150.0,150.0,150.0,150.0" + "Eternal Flames Reward" "1,1,1,1" "Fall Voiceline Reward" "PlayerLaugh,PlayerLaugh,PlayerLaugh,PlayerLaugh" + "Fast Recovery Reward" "1,1,1,1" + "Fire Rate Reward" "1.25,1.25,1.25,1.25" "Friendly Fire Reward" "1,1,1,1" "Ghost Bullets Reward" "1,1,1,1" + "Grenade Launcher Reward" "10.0,10.0,10.0,10.0" "Heal Percent Reward" "100.0,100.0,100.0,100.0" + "Healthcare Radius Reward" "150.0,150.0,150.0,150.0" "Health Regen Reward" "1,1,1,1" - "Hollowpoint Ammo Reward" "1,1,1,1" - "Inextinguishable Fire Reward" "1,1,1,1" + "Heartbeat Reward" "3.0,3.0,3.0,3.0" + "Hollowpoint Ammo Reward" "100.0,100.0,100.0,100.0" "Infinite Ammo Reward" "31,31,31,31" "Item Reward" "first_aid_kit,first_aid_kit,first_aid_kit,first_aid_kit" "Jump Height Reward" "75.0,75.0,75.0,75.0" "Ladder Actions Reward" "1,1,1,1" - "Lady Killer Reward" "1,1,1,1" + "Lady Killer Reward" "25.0,25.0,25.0,25.0" "Laser Sight Reward" "1,1,1,1" "Life Leech Reward" "1,1,1,1" + "Lucky Bullet Reward" "25.0,25.0,25.0,25.0" "Medical Cuts Reward" "1,1,1,1" "Melee Range Reward" "150,150,150,150" "Midair Dashes Reward" "2,2,2,2" + "Motivation Radius Reward" "150.0,150.0,150.0,150.0" + "Overdose Radius Reward" "150.0,150.0,150.0,150.0" + "Overhealth Reward" "200,200,200,200" "Pipebomb Duration Reward" "10.0,10.0,10.0,10.0" "Punch Resistance Reward" "0.25,0.25,0.25,0.25" "Rapid Pistol Reward" "0.130,0.130,0.130,0.130" "Recoil Dampener Reward" "1,1,1,1" "Refill Percent Reward" "100.0,100.0,100.0,100.0" "Regen Bursts Reward" "1,1,1,1" + "Reload Rate Reward" "1.25,1.25,1.25,1.25" "Respawn Loadout Reward" "1,1,1,1" "Revive Health Reward" "100,100,100,100" + "Riot Gear Reward" "1,1,1,1" + "Safety Bubble Reward" "1,1,1,1" + "Shockwave Radius Reward" "150.0,150.0,150.0,150.0" "Shove Damage Reward" "0.025,0.025,0.025,0.025" "Shove Penalty Reward" "1,1,1,1" "Shove Rate Reward" "0.7,0.7,0.7,0.7" - "Sledgehammer Rounds Reward" "1,1,1,1" + "Sledgehammer Rounds Reward" "100.0,100.0,100.0,100.0" "Special Ammo Reward" "3,3,3,3" "Speed Boost Reward" "1.25,1.25,1.25,1.25" "Stack Limits" "0,0,0,0,0,0,0" "Stack Rewards" "0,0,0,0" "Sticky Grenades Reward" "1,1,1,1" + "Supplier Reward" "3.0,3.0,3.0,3.0" + "Swing Rate Reward" "1.25,1.25,1.25,1.25" "Syringe Darts Reward" "1,1,1,1" "Thorns Reward" "1,1,1,1" "Useful Rewards" "15,15,15,15" @@ -139,6 +193,533 @@ "Reward Bots" "-1,-1,-1,-1" } } + "Survivors" + { + "Carrier Enabled" "0" + "Carrier Bots" "0" + "Carrier Body" "0" + "Carrier Chance" "0.0" + "Carrier Cleanse" "0" + "Carrier Damage Multiplier" "0.0" + "Carrier Delay" "0.0" + "Carrier Filter" "0" + "Carrier Health Multiplier" "0.0" + "Carrier Infection" "0" + "Carrier Mix" "0" + "Carrier Mode" "0" + "Carrier Teleport" "0" + "Carrier Type" "0" + "Carrier Voice" "0" + "Carrier Voice Chance" "0.0" + "Carrier Voice Interval" "0.0" + "Carrier Attack Voicelines" "" + "Carrier Bait Voicelines" "" + "Passive Enabled" "-1" + "Passive Bots" "-1" + "Passive Notify" "0" + "Action Duration Passive" "0.0" + "Adrenaline Time Passive" "0.0" + "Ammo Boost Passive" "0" + "Ammo Refill Passive" "0" + "Ammo Regen Passive" "0" + "Attack Boost Passive" "0.0" + "Blaze Health Passive" "0" + "Blood Donor Passive" "0" + "Bunny Hop Passive" "0" + "Burst Doors Passive" "0" + "Clean Kills Passive" "0" + "Cluster Bombs Passive" "0" + "Damage Boost Passive" "0.0" + "Damage Resistance Passive" "0.0" + "Dopamine Radius Passive" "0.0" + "Eternal Flames Passive" "0" + "Fast Recovery Passive" "0" + "Fire Rate Passive" "0.0" + "Friendly Fire Passive" "0" + "Ghost Bullets Passive" "0" + "Grenade Launcher Passive" "0.0" + "Heal Percent Passive" "0.0" + "Healthcare Radius Passive" "0.0" + "Health Regen Passive" "0" + "Heartbeat Passive" "0.0" + "Hollowpoint Ammo Passive" "0.0" + "Infinite Ammo Passive" "0" + "Item Passive" "" + "Jump Height Passive" "0.0" + "Ladder Actions Passive" "0" + "Lady Killer Passive" "0.0" + "Laser Sight Passive" "0" + "Life Leech Passive" "0" + "Lucky Bullet Passive" "0.0" + "Medical Cuts Passive" "0" + "Melee Range Passive" "0" + "Midair Dashes Passive" "0" + "Motivation Radius Passive" "0.0" + "Overdose Radius Passive" "0.0" + "Overhealth Passive" "0" + "Pipebomb Duration Passive" "0.0" + "Punch Resistance Passive" "0.0" + "Rapid Pistol Passive" "0.0" + "Recoil Dampener Passive" "0" + "Refill Percent Passive" "0.0" + "Regen Bursts Passive" "0" + "Reload Rate Passive" "0.0" + "Respawn Loadout Passive" "0" + "Revive Health Passive" "0" + "Riot Gear Passive" "0" + "Safety Bubble Passive" "0" + "Shockwave Radius Passive" "0.0" + "Shove Damage Passive" "0.0" + "Shove Penalty Passive" "0" + "Shove Rate Passive" "0.0" + "Sledgehammer Rounds Passive" "0.0" + "Special Ammo Passive" "0" + "Speed Boost Passive" "0.0" + "Sticky Grenades Passive" "0" + "Supplier Passive" "0.0" + "Swing Rate Passive" "0.0" + "Syringe Darts Passive" "0" + "Thorns Passive" "0" + "weapon_pistol" // Fire faster and no shove fatigue while pistol is being held + { + "Weapon Index" "1" + "Passive Enabled" "-1" //"9" + "Passive Bots" "-1" //"9" + "Stack Passives" "0" + "Blood Donor Passive" "2" + "Rapid Pistol Passive" "0.130" + "Shove Penalty Passive" "1" + "Syringe Darts Passive" "1" + } + "weapon_pistol_magnum" // Fire faster and no shove fatigue while magnum pistol is being held + { + "Weapon Index" "2" + "Passive Enabled" "-1" //"12" + "Passive Bots" "-1" //"12" + "Stack Passives" "0" + "Ghost Bullets Passive" "1" + "Hollowpoint Ammo Passive" "100.0" + "Rapid Pistol Passive" "0.130" + "Shove Penalty Passive" "1" + "Sledgehammer Rounds Passive" "0.5" + } + "weapon_smg" // Shoot grenades and perform ladder actions while uzi is being held + { + "Weapon Index" "3" + "Passive Enabled" "-1" //"26" + "Passive Bots" "-1" //"26" + "Stack Passives" "0" + "Grenade Launcher Passive" "25.0" + "Ladder Actions Passive" "1" + "Midair Dashes Passive" "1" + } + "weapon_smg_silenced" // Shoot grenades and perform ladder actions while silenced uzi is being held + { + "Weapon Index" "4" + "Passive Enabled" "-1" //"26" + "Passive Bots" "-1" //"26" + "Stack Passives" "0" + "Grenade Launcher Passive" "25.0" + "Ladder Actions Passive" "1" + "Jump Height Passive" "65.0" + } + "weapon_smg_mp5" // Shoot grenades and perform ladder actions while mp5 uzi is being held + { + "Weapon Index" "5" + "Passive Enabled" "-1" //"26" + "Passive Bots" "-1" //"26" + "Stack Passives" "0" + "Grenade Launcher Passive" "25.0" + "Ladder Actions Passive" "1" + "Speed Boost Passive" "1.125" + } + "weapon_rifle" // Remove recoil and deal more damage while m16 rifle is being held + { + "Weapon Index" "6" + "Passive Enabled" "-1" //"20" + "Passive Bots" "-1" //"20" + "Stack Passives" "0" + "Damage Boost Passive" "1.2" + "Grenade Launcher Passive" "25.0" + "Recoil Dampener Passive" "1" + } + "weapon_rifle_ak47" // Remove recoil and deal more damage while ak47 rifle is being held + { + "Weapon Index" "7" + "Passive Enabled" "-1" //"4" + "Passive Bots" "-1" //"4" + "Stack Passives" "0" + "Damage Boost Passive" "1.1" + "Laser Sight Passive" "1" + "Recoil Dampener Passive" "1" + } + "weapon_rifle_desert" // Remove recoil and deal more damage while scar-l rifle is being held + { + "Weapon Index" "8" + "Passive Enabled" "-1" //"20" + "Passive Bots" "-1" //"20" + "Stack Passives" "0" + "Damage Boost Passive" "1.125" + "Recoil Dampener Passive" "1" + "Special Ammo Passive" "3" + } + "weapon_rifle_sg552" // Remove recoil and deal more damage while sg552 rifle is being held + { + "Weapon Index" "9" + "Passive Enabled" "-1" //"20" + "Passive Bots" "-1" //"20" + "Stack Passives" "0" + "Damage Boost Passive" "1.15" + "Lucky Bullet Passive" "33.3" + "Recoil Dampener Passive" "1" + } + "weapon_pumpshotgun" // Reload faster and knock back zombies while pump shotgun is being held + { + "Weapon Index" "10" + "Passive Enabled" "-1" //"12" + "Passive Bots" "-1" //"12" + "Stack Passives" "0" + "Reload Rate Passive" "1.6" + "Shove Penalty Passive" "1" + "Sledgehammer Rounds Passive" "1.0" + } + "weapon_shotgun_chrome" // Reload faster and knock back zombies while chrome shotgun is being held + { + "Weapon Index" "11" + "Passive Enabled" "-1" //"12" + "Passive Bots" "-1" //"12" + "Stack Passives" "0" + "Reload Rate Passive" "1.6" + "Shove Damage Passive" "0.025" + "Sledgehammer Rounds Passive" "1.0" + } + "weapon_autoshotgun" // Reload faster and knock back zombies while auto shotgun is being held + { + "Weapon Index" "12" + "Passive Enabled" "-1" //"28" + "Passive Bots" "-1" //"28" + "Stack Passives" "0" + "Grenade Launcher Passive" "10.0" + "Reload Rate Passive" "1.6" + "Sledgehammer Rounds Passive" "1.0" + } + "weapon_shotgun_spas" // Reload faster and knock back zombies while spas shotgun is being held + { + "Weapon Index" "13" + "Passive Enabled" "-1" //"12" + "Passive Bots" "-1" //"12" + "Stack Passives" "0" + "Lady Killer Passive" "50.0" + "Reload Rate Passive" "1.6" + "Sledgehammer Rounds Passive" "1.0" + } + "weapon_hunting_rifle" // Shoot through walls and shoot stronger bullets while hunting rifle is being held + { + "Weapon Index" "14" + "Passive Enabled" "-1" //"20" + "Passive Bots" "-1" //"20" + "Stack Passives" "0" + "Ghost Bullets Passive" "1" + "Grenade Launcher Passive" "10.0" + "Hollowpoint Ammo Passive" "100.0" + } + "weapon_sniper_military" // Shoot through walls and shoot stronger bullets while military rifle is being held + { + "Weapon Index" "15" + "Passive Enabled" "-1" //"68" + "Passive Bots" "-1" //"68" + "Stack Passives" "0" + "Clean Kills Passive" "1" + "Ghost Bullets Passive" "1" + "Hollowpoint Ammo Passive" "100.0" + } + "weapon_sniper_awp" // Shoot through walls and shoot stronger bullets while awp rifle is being held + { + "Weapon Index" "16" + "Passive Enabled" "-1" //"4" + "Passive Bots" "-1" //"4" + "Stack Passives" "0" + "Damage Boost Passive" "2.0" + "Ghost Bullets Passive" "1" + "Hollowpoint Ammo Passive" "100.0" + } + "weapon_sniper_scout" // Shoot through walls and shoot stronger bullets while steyr scout rifle is being held + { + "Weapon Index" "17" + "Passive Enabled" "-1" //"12" + "Passive Bots" "-1" //"12" + "Stack Passives" "0" + "Ghost Bullets Passive" "1" + "Hollowpoint Ammo Passive" "100.0" + "Reload Rate Passive" "1.3" + } + "weapon_rifle_m60" // Refill nearby teammates' ammo periodically while dealing damage with the m60 rifle + { + "Weapon Index" "18" + "Passive Enabled" "-1" //"16" + "Passive Bots" "-1" //"16" + "Stack Passives" "0" + "Supplier Passive" "3.0" + } + "weapon_grenade_launcher" // Heal teammates with explosions while grenade launcher is being held + { + "Weapon Index" "19" + "Passive Enabled" "-1" //"1" + "Passive Bots" "-1" //"1" + "Stack Passives" "0" + "Blood Donor Passive" "4" + "Regen Bursts Passive" "2" + } + "weapon_first_aid_kit" // Take less damage while the medkit is being held and trigger a healing AoE when used + { + "Weapon Index" "20" + "Passive Enabled" "-1" //"5" + "Passive Bots" "-1" //"5" + "Stack Passives" "0" + "Damage Resistance Passive" "0.95" + "Healthcare Radius Passive" "250.0" + } + "weapon_defibrillator" // Take less damage while the defibrillator is being held and trigger a revive AoE when used + { + "Weapon Index" "21" + "Passive Enabled" "-1" //"5" + "Passive Bots" "-1" //"5" + "Stack Passives" "0" + "Damage Resistance Passive" "0.95" + "Shockwave Radius Passive" "1000.0" + } + "weapon_pain_pills" // Take less damage while the pain pills bottle is being held and trigger a healing AoE when used + { + "Weapon Index" "22" + "Passive Enabled" "-1" //"5" + "Passive Bots" "-1" //"5" + "Stack Passives" "0" + "Damage Resistance Passive" "0.95" + "Overdose Radius Passive" "250.0" + } + "weapon_adrenaline" // Take less damage while the adrenaline shot is being held and trigger an energy boost AoE when used + { + "Weapon Index" "23" + "Passive Enabled" "-1" //"5" + "Passive Bots" "-1" //"5" + "Stack Passives" "0" + "Damage Resistance Passive" "0.95" + "Dopamine Radius Passive" "250.0" + } + "weapon_melee" // Auto-bhop while knife is being held + { + "Weapon Index" "24" + "Weapon Name" "knife" + "Passive Enabled" "-1" //"2" + "Passive Bots" "-1" //"2" + "Stack Passives" "0" + "Bunny Hop Passive" "1" + } + "weapon_melee" // Berserker blunt weapons - High damage, low uptime, revive radius, damage resistance, and heal nearby teammates periodically while dealing damage + { + "Weapon Index" "25" + "Weapon Name" "baseball_bat,cricket_bat,tonfa,shovel,electric_guitar,frying_pan,golfclub" + "Passive Enabled" "-1" //"15" + "Passive Bots" "-1" //"15" + "Stack Passives" "0" + "Damage Boost Passive" "1.45" + "Damage Resistance Passive" "0.9" + "Heartbeat Passive" "3.0" + "Melee Range Passive" "100" + "Motivation Radius Passive" "250.0" + "Speed Boost Passive" "0.875" + "Swing Rate Passive" "0.65" + } + "weapon_melee" // Berserker sharp weapons - Low damage, high uptime, revive radius, leech health from zombies, and heal teammates by damaging them + { + "Weapon Index" "26" + "Weapon Name" "crowbar,machete,katana,knife,fireaxe,pitchfork" + "Passive Enabled" "-1" //"15" + "Passive Bots" "-1" //"15" + "Stack Passives" "0" + "Damage Boost Passive" "0.65" + "Life Leech Passive" "1" + "Medical Cuts Passive" "2" + "Melee Range Passive" "100" + "Motivation Radius Passive" "250.0" + "Swing Rate Passive" "1.45" + "Speed Boost Passive" "1.125" + } + "Bill" // General - Medium-high survivability, high mobility, medium-low damage, high uptime + { + "Carrier Filter" "2" + "Carrier Attack Voicelines" "namvet/laughter04.wav,namvet/laughter11.wav,namvet/cough06.wav,namvet/doubledeathresponse01.wav,namvet/doubledeathresponse02.wav,namvet/help11.wav,namvet/friendlyfire04.wav" + "Carrier Bait Voicelines" "namvet/callforrescue01.wav,namvet/callforrescue05.wav,namvet/callforrescue10.wav" + "Passive Enabled" "-1" //"31" + "Passive Bots" "-1" //"31" + "Passive Notify" "0" + "Blood Donor Passive" "1" + "Bunny Hop Passive" "1" + "Damage Boost Passive" "0.95" + "Damage Resistance Passive" "0.95" + "Eternal Flames Passive" "1" + "Ladder Actions Passive" "1" + "Overhealth Passive" "110" + "Pipebomb Duration Passive" "6.5" + "Rapid Pistol Passive" "0.130" + "Recoil Dampener Passive" "1" + "Revive Health Passive" "50" + "Special Ammo Passive" "0" + "Speed Boost Passive" "1.1" + } + "Zoey" // Damage - Medium-low survivability, medium mobility, medium-high damage, medium uptime + { + "Carrier Filter" "20" + "Carrier Attack Voicelines" "teengirl/laughter02.wav,teengirl/laughter06.wav,teengirl/hurtminor01.wav,teengirl/help04.wav" + "Carrier Bait Voicelines" "teengirl/callforrescue01.wav,teengirl/callforrescue02.wav,teengirl/callforrescue06.wav,teengirl/callforrescue07.wav,teengirl/callforrescue14.wav,teengirl/callforrescue16.wav" + "Passive Enabled" "-1" //"7" + "Passive Bots" "-1" //"7" + "Passive Notify" "0" + "Blood Donor Passive" "1" + "Damage Boost Passive" "1.25" + "Damage Resistance Passive" "1.15" + "Ghost Bullets Passive" "1" + "Heal Percent Passive" "75.0" + "Hollowpoint Ammo Passive" "100.0" + "Overhealth Passive" "115" + "Revive Health Passive" "40" + "Speed Boost Passive" "1.1" + } + "Francis" // Tank - Medium-high survivability, low mobility, medium-low damage, low uptime + { + "Carrier Filter" "65" + "Carrier Attack Voicelines" "biker/goingtodie03.wav,biker/goingtodie12.wav,biker/goingtodieaskforheal02.wav,biker/grabbedbysmoker03.wav,biker/help04.wav,biker/laughter04.wav,biker/laughter12.wav" + "Carrier Bait Voicelines" "biker/callforrescue02.wav,biker/callforrescue06.wav,biker/callforrescue08.wav" + "Passive Enabled" "-1" //"271" + "Passive Bots" "-1" //"271" + "Passive Notify" "0" + "Blood Donor Passive" "2" + "Burst Doors Passive" "0" + "Damage Boost Passive" "0.75" + "Damage Resistance Passive" "0.7" + "Fast Recovery Passive" "1" + "Jump Height Passive" "70.0" + "Lady Killer Passive" "25.0" + "Melee Range Passive" "125" + "Overhealth Passive" "130" + "Punch Resistance Passive" "0.7" + "Revive Health Passive" "70" + "Riot Gear Passive" "0" + "Shove Damage Passive" "0.0" + "Shove Penalty Passive" "1" + "Speed Boost Passive" "0.95" + } + "Louis" // Support - Low survivability, medium mobility, medium-low damage, high uptime + { + "Carrier Filter" "8" + "Carrier Attack Voicelines" "manager/choke01.wav,manager/cough03.wav,manager/deathscream02.wav,manager/friendlyfire03.wav,manager/friendlyfire06.wav,manager/help05.wav,manager/laughter04.wav,manager/laughter20.wav" + "Carrier Bait Voicelines" "manager/callforrescue01.wav,manager/callforrescue03.wav" + "Passive Enabled" "-1" //"31" + "Passive Bots" "-1" //"31" + "Passive Notify" "0" + "Blood Donor Passive" "2" + "Damage Boost Passive" "0.85" + "Damage Resistance Passive" "1.4" + "Heal Percent Passive" "80.0" + "Health Regen Passive" "1" + "Jump Height Passive" "70.0" + "Medical Cuts Passive" "2" + "Midair Dashes Passive" "0" + "Overdose Radius Passive" "250.0" + "Overhealth Passive" "110" + "Revive Health Passive" "60" + "Shockwave Radius Passive" "0.0" + "Speed Boost Passive" "1.1" + "Syringe Darts Passive" "0" + } + "Nick" // General - Medium-low survivability, high mobility, medium-high damage, high uptime + { + "Carrier Filter" "2" + "Carrier Attack Voicelines" "gambler/battlecry04.wav,gambler/choke01.wav,gambler/choke04.wav,gambler/choke05.wav,gambler/cough01.wav,gambler/defibrillator13.wav,gambler/friendlyfire02.wav,gambler/laughter01.wav" + "Carrier Bait Voicelines" "gambler/callforrescue02.wav,gambler/callforrescue05.wav" + "Passive Enabled" "-1" //"31" + "Passive Bots" "-1" //"31" + "Passive Notify" "0" + "Blood Donor Passive" "2" + "Bunny Hop Passive" "0" + "Damage Boost Passive" "0.65" + "Damage Resistance Passive" "1.1" + "Eternal Flames Passive" "0" + "Ladder Actions Passive" "0" + "Overhealth Passive" "120" + "Pipebomb Duration Passive" "6.5" + "Rapid Pistol Passive" "0.130" + "Recoil Dampener Passive" "0" + "Revive Health Passive" "50" + "Special Ammo Passive" "1" + "Speed Boost Passive" "0.95" + } + "Ellis" // Damage - Low survivability, medium mobility, high damage, medium uptime + { + "Carrier Filter" "40" + "Carrier Attack Voicelines" "mechanic/choke01.wav,mechanic/choke04.wav,mechanic/cough01.wav,mechanic/cough02.wav,mechanic/friendlyfire01.wav,mechanic/laughter04.wav,mechanic/laughter06.wav" + "Carrier Bait Voicelines" "mechanic/callforrescue01.wav,mechanic/callforrescue03.wav,mechanic/callforrescue05.wav" + "Passive Enabled" "-1" //"7" + "Passive Bots" "-1" //"7" + "Passive Notify" "0" + "Blood Donor Passive" "2" + "Damage Boost Passive" "1.35" + "Damage Resistance Passive" "1.25" + "Ghost Bullets Passive" "0" + "Heal Percent Passive" "70.0" + "Hollowpoint Ammo Passive" "0.0" + "Overhealth Passive" "105" + "Revive Health Passive" "40" + "Speed Boost Passive" "0.95" + } + "Coach" // Tank - Medium survivability, medium-low mobility, medium damage, low uptime + { + "Carrier Filter" "5" + "Carrier Attack Voicelines" "coach/taunt06.wav,coach/tankpound01.wav,coach/tankpound05.wav,coach/laughter23.wav,coach/laughter15.wav,coach/help03.wav,coach/goingtodie28.wav" + "Carrier Bait Voicelines" "coach/callforrescue05.wav,coach/callforrescue08.wav,coach/callforrescue12.wav" + "Passive Enabled" "-1" //"271" + "Passive Bots" "-1" //"271" + "Passive Notify" "0" + "Blood Donor Passive" "3" + "Burst Doors Passive" "1" + "Damage Boost Passive" "0.85" + "Damage Resistance Passive" "0.8" + "Fast Recovery Passive" "0" + "Jump Height Passive" "60.0" + "Lady Killer Passive" "0.0" + "Melee Range Passive" "100" + "Overhealth Passive" "140" + "Punch Resistance Passive" "0.8" + "Revive Health Passive" "70" + "Riot Gear Passive" "1" + "Shove Damage Passive" "0.025" + "Shove Penalty Passive" "0" + "Speed Boost Passive" "0.85" + } + "Rochelle" // Support - Medium-low survivability, high mobility, low damage, high uptime + { + "Carrier Filter" "16" + "Carrier Attack Voicelines" "producer/battlecry02.wav,producer/boomerreaction02.wav,producer/deathscream02.wav,producer/defibrillator18.wav,producer/goingtodie08.wav,producer/goingtodie02.wav,producer/gooedbyspitter03.wav,producer/heardspitter05.wav" + "Carrier Bait Voicelines" "producer/callforrescue01.wav,producer/callforrescue07.wav" + "Passive Enabled" "-1" //"31" + "Passive Bots" "-1" //"31" + "Passive Notify" "0" + "Blood Donor Passive" "3" + "Damage Boost Passive" "0.75" + "Damage Resistance Passive" "1.3" + "Heal Percent Passive" "90.0" + "Health Regen Passive" "2" + "Jump Height Passive" "60.0" + "Medical Cuts Passive" "0" + "Midair Dashes Passive" "1" + "Overdose Radius Passive" "0.0" + "Overhealth Passive" "120" + "Revive Health Passive" "60" + "Shockwave Radius Passive" "250.0" + "Speed Boost Passive" "1.2" + "Syringe Darts Passive" "1" + } + } "Competitive" { "Auto Aggravate" "Enabled" @@ -153,9 +734,33 @@ "Scale Damage" "Disabled" "Difficulty Damage" "0.0,0.0,0.0,0.0" } + "Size" + { + "Infected Chance" "0.0" + "Infected Damage" "1" + "Infected Health" "1" + "Infected Scale" "0.1-10.0" + "Jockey Chance" "0.0" + "Jockey Damage" "1" + "Jockey Health" "1" + "Jockey Scale" "0.1-10.0" + "Witch Chance" "0.0" + "Witch Damage" "1" + "Witch Health" "1" + "Witch Scale" "0.1-10.0" + } "Health" { "Base Health" "6000" + "Armor Characters" "],=" + "Armor Percentage" "0.0" + "Armor Resistance" "0.75" + "Shield Characters" ">,-" + "Shield Percentage" "0.0" + "Shield Rate" "0.5" + "Passive Delay" "5.0" + "Passive Health" "0" + "Passive Interval" "1.0" "Display Health" "Max" "Display Health Type" "1" "Health Characters" "|,-" @@ -192,6 +797,7 @@ "Enhancements" { "Attack Interval" "0.0" + "Bunny Hop" "0" "Claw Damage" "-1.0" "Footstep Shake" "0" "Ground Pound" "0" @@ -199,7 +805,7 @@ "Incap Damage Multiplier" "1.0" "Intangible Body" "0" "Melee Hit Mode" "1" - "Melee Hit Value" "0.0" + "Melee Hit Value" "0.04" "Punch Force" "-1.0" "Punch Throw" "0.0" "Rock Damage" "-1.0" @@ -235,11 +841,11 @@ "Regular Delay" "10.0" "Regular Interval" "300.0" "Regular Limit" "99999" - "Regular Type" "1-128" + "Regular Type" "1-144" "Regular Wave" "No" "Finale Amount" "Min" "Finale Mode" "0" - "Finale Types" "1-128,1-128,1-128,1-128,1-128,1-128,1-128,1-128,1-128,1-128,1-128" + "Finale Types" "1-144,1-144,1-144,1-144,1-144,1-144,1-144,1-144,1-144,1-144,1-144" "Finale Waves" "0,0,0,0,0,0,0,0,0,0,0" } "Rush" @@ -299,6 +905,12 @@ "Smoker Name" "Absorber Smoker" "Spitter Name" "Absorber Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Absorber Common" + "Witch Name" "Absorber Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -372,6 +984,12 @@ "Smoker Name" "Acidic Smoker" "Spitter Name" "Acidic Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Acidic Common" + "Witch Name" "Acidic Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -457,6 +1075,12 @@ "Smoker Name" "Aimless Smoker" "Spitter Name" "Aimless Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Aimless Common" + "Witch Name" "Aimless Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -528,6 +1152,12 @@ "Smoker Name" "Ammo Smoker" "Spitter Name" "Ammo Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Ammo Common" + "Witch Name" "Ammo Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -599,6 +1229,12 @@ "Smoker Name" "Blind Smoker" "Spitter Name" "Blind Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Blind Common" + "Witch Name" "Blind Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -638,21 +1274,21 @@ "Spitter Extra Health" "100" } } - "Blind Ability" + "Vision Ability" { "Human Ability" "1" "Human Ammo" "2" "Ability Enabled" "1" "Ability Effect" "7" "Ability Message" "1" - "Blind Chance" "33.3" - "Blind Duration" "5.0" - "Blind Hit" "1" - "Blind Hit Mode" "0" - "Blind Intensity" "255" - "Blind Mode" "0" - "Blind Range" "150.0" - "Blind Range Chance" "15.0" + "Vision Chance" "33.3" + "Vision Duration" "5.0" + "Vision Hit" "1" + "Vision Hit Mode" "0" + "Vision Intensity" "255" + "Vision Mode" "1" + "Vision Range" "150.0" + "Vision Range Chance" "15.0" } } "Tank #6" @@ -671,6 +1307,12 @@ "Smoker Name" "Bomber Smoker" "Spitter Name" "Bomber Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Bomber Common" + "Witch Name" "Bomber Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -755,6 +1397,12 @@ "Smoker Name" "Boomer Smoker" "Spitter Name" "Boomer Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Boomer Common" + "Witch Name" "Boomer Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -810,10 +1458,22 @@ "Ability Message" "1" "Minion Amount" "5" "Minion Chance" "20.0" + "Minion Filter" "2" "Minion Lifetime" "0.0" "Minion Remove" "1" "Minion Replace" "1" - "Minion Types" "2" + } + "Respawn Ability" + { + "Human Ability" "1" + "Human Ammo" "2" + "Human Duration" "5" + "Ability Enabled" "1" + "Ability Message" "1" + "Respawn Chance" "100.0" + "Respawn Duration" "0" + "Respawn Filter" "2" + "Respawn Range" "300.0" } "Throw Ability" { @@ -824,7 +1484,7 @@ "Throw Chance" "33.3" "Throw Infected Amount" "2" "Throw Infected Lifetime" "0.0" - "Throw Infected Options" "2" + "Throw Infected Options" "4" "Throw Infected Remove" "1" "Special" { @@ -848,6 +1508,12 @@ "Smoker Name" "Bulletproof Smoker" "Spitter Name" "Bulletproof Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Bulletproof Common" + "Witch Name" "Bulletproof Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -908,6 +1574,12 @@ "Smoker Name" "Burier Smoker" "Spitter Name" "Burier Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Burier Common" + "Witch Name" "Burier Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -990,6 +1662,12 @@ "Smoker Name" "Car Smoker" "Spitter Name" "Car Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Car Common" + "Witch Name" "Car Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -1045,6 +1723,7 @@ "Ability Enabled" "1" "Ability Message" "1" "Car Chance" "15.0" + "Car Damage" "5.0" "Car Duration" "5" "Car Interval" "0.6" "Car Lifetime" "30.0" @@ -1058,6 +1737,7 @@ "Human Ammo" "2" "Ability Enabled" "1" "Ability Message" "1" + "Throw Car Damage" "5.0" "Throw Car Lifetime" "10.0" "Throw Car Options" "0" "Throw Car Owner" "1" @@ -1085,6 +1765,12 @@ "Smoker Name" "Charger Smoker" "Spitter Name" "Charger Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Charger Common" + "Witch Name" "Charger Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -1135,10 +1821,22 @@ "Ability Message" "1" "Minion Amount" "5" "Minion Chance" "20.0" + "Minion Filter" "32" "Minion Lifetime" "0.0" "Minion Remove" "1" "Minion Replace" "1" - "Minion Types" "32" + } + "Respawn Ability" + { + "Human Ability" "1" + "Human Ammo" "2" + "Human Duration" "5" + "Ability Enabled" "1" + "Ability Message" "1" + "Respawn Chance" "100.0" + "Respawn Duration" "0" + "Respawn Filter" "32" + "Respawn Range" "300.0" } "Throw Ability" { @@ -1149,7 +1847,7 @@ "Throw Chance" "33.3" "Throw Infected Amount" "2" "Throw Infected Lifetime" "0.0" - "Throw Infected Options" "32" + "Throw Infected Options" "64" "Throw Infected Remove" "1" "Special" { @@ -1173,6 +1871,12 @@ "Smoker Name" "Choker Smoker" "Spitter Name" "Choker Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Choker Common" + "Witch Name" "Choker Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -1245,6 +1949,12 @@ "Smoker Name" "Clone Smoker" "Spitter Name" "Clone Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Clone Common" + "Witch Name" "Clone Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -1323,6 +2033,12 @@ "Smoker Name" "Cloudy Smoker" "Spitter Name" "Cloudy Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Cloudy Common" + "Witch Name" "Cloudy Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -1375,6 +2091,9 @@ "Cloud Chance" "50.0" "Cloud Damage" "5.0" "Cloud Duration" "0" + "Cloud Interval" "5.0" + "Cloud Range" "500.0" + "Cloud Remove" "0" } } "Tank #15" @@ -1393,6 +2112,12 @@ "Smoker Name" "Dropper Smoker" "Spitter Name" "Dropper Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Dropper Common" + "Witch Name" "Dropper Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -1460,6 +2185,12 @@ "Smoker Name" "Drugger Smoker" "Spitter Name" "Drugger Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Drugger Common" + "Witch Name" "Drugger Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -1489,6 +2220,10 @@ "Particles" { "Body Effects" "32" + "Common" + { + "Body Chance" "100.0,100.0,100.0,100.0,100.0,33.3,100.0" + } } "Health" { @@ -1535,6 +2270,12 @@ "Smoker Name" "Drunk Smoker" "Spitter Name" "Drunk Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Drunk Common" + "Witch Name" "Drunk Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -1606,6 +2347,12 @@ "Smoker Name" "Electric Smoker" "Spitter Name" "Electric Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Electric Common" + "Witch Name" "Electric Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -1687,6 +2434,12 @@ "Smoker Name" "Enforcer Smoker" "Spitter Name" "Enforcer Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Enforcer Common" + "Witch Name" "Enforcer Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -1758,6 +2511,12 @@ "Smoker Name" "Fast Smoker" "Spitter Name" "Fast Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Fast Common" + "Witch Name" "Fast Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -1850,6 +2609,12 @@ "Smoker Name" "Fireproof Smoker" "Spitter Name" "Fireproof Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Fireproof Common" + "Witch Name" "Fireproof Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -1943,6 +2708,12 @@ "Smoker Name" "Flinger Smoker" "Spitter Name" "Flinger Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Flinger Common" + "Witch Name" "Flinger Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -2015,6 +2786,12 @@ "Smoker Name" "Flying Smoker" "Spitter Name" "Flying Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Flying Common" + "Witch Name" "Flying Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -2084,6 +2861,12 @@ "Smoker Name" "Fragile Smoker" "Spitter Name" "Fragile Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Fragile Common" + "Witch Name" "Fragile Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -2158,6 +2941,12 @@ "Smoker Name" "Ghost Smoker" "Spitter Name" "Ghost Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Ghost Common" + "Witch Name" "Ghost Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -2237,6 +3026,12 @@ "Smoker Name" "Godly Smoker" "Spitter Name" "Godly Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Godly Common" + "Witch Name" "Godly Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -2303,6 +3098,12 @@ "Smoker Name" "Gravity Smoker" "Spitter Name" "Gravity Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Gravity Common" + "Witch Name" "Gravity Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -2384,6 +3185,12 @@ "Smoker Name" "Gunner Smoker" "Spitter Name" "Gunner Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Gunner Common" + "Witch Name" "Gunner Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -2458,6 +3265,12 @@ "Smoker Name" "Healthy Smoker" "Spitter Name" "Healthy Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Healthy Common" + "Witch Name" "Healthy Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -2541,6 +3354,12 @@ "Smoker Name" "Hitter Smoker" "Spitter Name" "Hitter Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Hitter Common" + "Witch Name" "Hitter Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -2580,12 +3399,11 @@ "Spitter Extra Health" "100" } } - "Hit Ability" + "Medic Ability" { "Human Ability" "1" - "Ability Enabled" "1" - "Hit Damage Multiplier" "1.5" - "Hit Group" "1" + "Medic Damage Multiplier" "1.5" + "Medic Hit Group" "1" } } "Tank #31" @@ -2604,6 +3422,12 @@ "Smoker Name" "Hunter Smoker" "Spitter Name" "Hunter Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Hunter Common" + "Witch Name" "Hunter Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -2654,10 +3478,22 @@ "Ability Message" "1" "Minion Amount" "5" "Minion Chance" "20.0" + "Minion Filter" "4" "Minion Lifetime" "0.0" "Minion Remove" "1" "Minion Replace" "1" - "Minion Types" "4" + } + "Respawn Ability" + { + "Human Ability" "1" + "Human Ammo" "2" + "Human Duration" "5" + "Ability Enabled" "1" + "Ability Message" "1" + "Respawn Chance" "100.0" + "Respawn Duration" "0" + "Respawn Filter" "4" + "Respawn Range" "300.0" } "Throw Ability" { @@ -2668,7 +3504,7 @@ "Throw Chance" "33.3" "Throw Infected Amount" "2" "Throw Infected Lifetime" "0.0" - "Throw Infected Options" "4" + "Throw Infected Options" "8" "Throw Infected Remove" "1" "Special" { @@ -2692,6 +3528,12 @@ "Smoker Name" "Hurtful Smoker" "Spitter Name" "Hurtful Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Hurtful Common" + "Witch Name" "Hurtful Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -2743,6 +3585,7 @@ "Hurt Hit" "1" "Hurt Hit Mode" "0" "Hurt Interval" "1.0" + "Hurt Mode" "1" "Hurt Range" "150.0" "Hurt Range Chance" "15.0" } @@ -2763,6 +3606,12 @@ "Smoker Name" "Hypnotizer Smoker" "Spitter Name" "Hypnotizer Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Hypnotizer Common" + "Witch Name" "Hypnotizer Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -2840,6 +3689,12 @@ "Smoker Name" "Icy Smoker" "Spitter Name" "Icy Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Icy Common" + "Witch Name" "Icy Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -2913,6 +3768,12 @@ "Smoker Name" "Idler Smoker" "Spitter Name" "Idler Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Idler Common" + "Witch Name" "Idler Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -2982,6 +3843,12 @@ "Smoker Name" "Inverter Smoker" "Spitter Name" "Inverter Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Inverter Common" + "Witch Name" "Inverter Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -3051,6 +3918,12 @@ "Smoker Name" "Item Smoker" "Spitter Name" "Item Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Item Common" + "Witch Name" "Item Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -3090,21 +3963,21 @@ "Spitter Extra Health" "100" } } - "Item Ability" + "Drop Ability" { "Human Ability" "1" - "Ability Enabled" "1" + "Ability Enabled" "2" "Ability Message" "1" - "Item Chance" "50.0" - "Item Loadout" "rifle,pistol,first_aid_kit,pain_pills" - "Item Mode" "0" - "Item Pinata" "" - "Item Pinata Body" "1" - "Item Pinata Chance" "33.3" + "Drop Chance" "50.0" + "Drop Loadout" "rifle,pistol,first_aid_kit,pain_pills" + "Drop Item Mode" "0" + "Drop Pinata" "" + "Drop Pinata Body" "1" + "Drop Pinata Chance" "33.3" "Special" { "Ability Enabled" "0" - "Item Loadout" "smg,pistol,pain_pills" + "Drop Loadout" "smg,pistol,pain_pills" } } } @@ -3125,6 +3998,12 @@ "Smoker Name" "Jockey Smoker" "Spitter Name" "Jockey Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Jockey Common" + "Witch Name" "Jockey Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -3175,10 +4054,22 @@ "Ability Message" "1" "Minion Amount" "5" "Minion Chance" "20.0" + "Minion Filter" "16" "Minion Lifetime" "0.0" "Minion Remove" "1" "Minion Replace" "1" - "Minion Types" "16" + } + "Respawn Ability" + { + "Human Ability" "1" + "Human Ammo" "2" + "Human Duration" "5" + "Ability Enabled" "1" + "Ability Message" "1" + "Respawn Chance" "100.0" + "Respawn Duration" "0" + "Respawn Filter" "16" + "Respawn Range" "300.0" } "Throw Ability" { @@ -3189,7 +4080,7 @@ "Throw Chance" "33.3" "Throw Infected Amount" "2" "Throw Infected Lifetime" "0.0" - "Throw Infected Options" "16" + "Throw Infected Options" "32" "Throw Infected Remove" "1" "Special" { @@ -3213,6 +4104,12 @@ "Smoker Name" "Jumper Smoker" "Spitter Name" "Jumper Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Jumper Common" + "Witch Name" "Jumper Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -3286,6 +4183,12 @@ "Smoker Name" "Kamikaze Smoker" "Spitter Name" "Kamikaze Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Kamikaze Common" + "Witch Name" "Kamikaze Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -3328,23 +4231,25 @@ { "Run Speed" "0.65" } - "Kamikaze Ability" + "Smash Ability" { "Human Ability" "1" "Ability Enabled" "1" "Ability Effect" "7" "Ability Message" "1" - "Kamikaze Body" "1" - "Kamikaze Chance" "33.3" - "Kamikaze Hit" "1" - "Kamikaze Hit Mode" "0" - "Kamikaze Mode" "1" - "Kamikaze Range" "150.0" - "Kamikaze Range Chance" "33.3" + "Smash Body" "1" + "Smash Chance" "33.3" + "Smash Hit" "1" + "Smash Hit Mode" "0" + "Smash Mode" "1" + "Smash Range" "150.0" + "Smash Range Chance" "33.3" + "Smash Remove" "1" + "Smash Type" "1" "Special" { - "Kamikaze Body" "0" - "Kamikaze Meter" "50.0" + "Smash Body" "0" + "Smash Meter" "50.0" } } } @@ -3364,6 +4269,12 @@ "Smoker Name" "Lagger Smoker" "Spitter Name" "Lagger Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Lagger Common" + "Witch Name" "Lagger Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -3434,6 +4345,12 @@ "Smoker Name" "Laser Smoker" "Spitter Name" "Laser Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Laser Common" + "Witch Name" "Laser Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -3502,6 +4419,12 @@ "Smoker Name" "Leecher Smoker" "Spitter Name" "Leecher Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Leecher Common" + "Witch Name" "Leecher Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -3540,20 +4463,25 @@ "Spitter Extra Health" "100" } } - "Leech Ability" + "Regen Ability" { "Human Ability" "1" "Human Ammo" "2" + "Human Duration" "5" "Ability Enabled" "1" - "Ability Effect" "7" + "Ability Effect" "4" "Ability Message" "1" - "Leech Chance" "33.3" - "Leech Duration" "5" - "Leech Hit" "1" - "Leech Hit Mode" "0" - "Leech Interval" "1.0" - "Leech Range" "150.0" - "Leech Range Chance" "15.0" + "Regen Chance" "100.0" + "Regen Duration" "5" + "Regen Health" "1" + "Regen Interval" "1.0" + "Regen Limit" "1000000" + "Regen Range" "500.0" + "Special" + { + "Regen Limit" "100000" + "Regen Range" "150.0" + } } } "Tank #44" @@ -3573,6 +4501,12 @@ "Smoker Name" "Lightning Smoker" "Spitter Name" "Lightning Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Lightning Common" + "Witch Name" "Lightning Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -3644,6 +4578,12 @@ "Smoker Name" "Medic Smoker" "Spitter Name" "Medic Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Medic Common" + "Witch Name" "Medic Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -3722,6 +4662,12 @@ "Smoker Name" "Meteor Smoker" "Spitter Name" "Meteor Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Meteor Common" + "Witch Name" "Meteor Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -3804,6 +4750,12 @@ "Smoker Name" "Necromancer Smoker" "Spitter Name" "Necromancer Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Necromancer Common" + "Witch Name" "Necromancer Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -3843,16 +4795,17 @@ "Spitter Extra Health" "100" } } - "Necro Ability" + "Respawn Ability" { "Human Ability" "1" "Human Ammo" "2" "Human Duration" "5" "Ability Enabled" "1" "Ability Message" "1" - "Necro Chance" "100.0" - "Necro Duration" "0" - "Necro Range" "500.0" + "Respawn Chance" "100.0" + "Respawn Duration" "0" + "Respawn Filter" "0" + "Respawn Range" "500.0" } } "Tank #48" @@ -3871,6 +4824,12 @@ "Smoker Name" "Nullifier Smoker" "Spitter Name" "Nullifier Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Nullifier Common" + "Witch Name" "Nullifier Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -3945,6 +4904,12 @@ "Smoker Name" "Omni Smoker" "Spitter Name" "Omni Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Omni Common" + "Witch Name" "Omni Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -4013,6 +4978,12 @@ "Smoker Name" "Panic Smoker" "Spitter Name" "Panic Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Panic Common" + "Witch Name" "Panic Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -4083,6 +5054,12 @@ "Smoker Name" "Pet Smoker" "Spitter Name" "Pet Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Pet Common" + "Witch Name" "Pet Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -4171,6 +5148,12 @@ "Smoker Name" "Pimp Smoker" "Spitter Name" "Pimp Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Pimp Common" + "Witch Name" "Pimp Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -4209,21 +5192,22 @@ "Spitter Extra Health" "100" } } - "Pimp Ability" + "Hurt Ability" { "Human Ability" "1" "Human Ammo" "2" "Ability Enabled" "1" "Ability Effect" "7" "Ability Message" "1" - "Pimp Chance" "33.3" - "Pimp Damage" "1" - "Pimp Duration" "5" - "Pimp Hit" "1" - "Pimp Hit Mode" "0" - "Pimp Interval" "1.0" - "Pimp Range" "150.0" - "Pimp Range Chance" "15.0" + "Hurt Chance" "33.3" + "Hurt Damage" "1" + "Hurt Duration" "5" + "Hurt Hit" "1" + "Hurt Hit Mode" "0" + "Hurt Interval" "1.0" + "Hurt Mode" "2" + "Hurt Range" "150.0" + "Hurt Range Chance" "15.0" } } "Tank #53" @@ -4242,6 +5226,12 @@ "Smoker Name" "Platinum Smoker" "Spitter Name" "Platinum Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Platinum Common" + "Witch Name" "Platinum Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -4301,6 +5291,12 @@ "Smoker Name" "Puke Smoker" "Spitter Name" "Puke Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Puke Common" + "Witch Name" "Puke Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -4381,6 +5377,12 @@ "Smoker Name" "Pyromaniac Smoker" "Spitter Name" "Pyromaniac Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Pyromaniac Common" + "Witch Name" "Pyromaniac Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -4416,12 +5418,12 @@ "Extra Health" "1000" "Special" { - "Boomer Extra Health" "500" - "Charger Extra Health" "500" - "Hunter Extra Health" "500" - "Jockey Extra Health" "500" - "Smoker Extra Health" "500" - "Spitter Extra Health" "500" + "Boomer Extra Health" "100" + "Charger Extra Health" "100" + "Hunter Extra Health" "100" + "Jockey Extra Health" "100" + "Smoker Extra Health" "100" + "Spitter Extra Health" "100" } } "Enhancements" @@ -4464,6 +5466,12 @@ "Smoker Name" "Quiet Smoker" "Spitter Name" "Quiet Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Quiet Common" + "Witch Name" "Quiet Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -4535,6 +5543,12 @@ "Smoker Name" "Recall Smoker" "Spitter Name" "Recall Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Recall Common" + "Witch Name" "Recall Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -4628,6 +5642,12 @@ "Smoker Name" "Recoil Smoker" "Spitter Name" "Recoil Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Recoil Common" + "Witch Name" "Recoil Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -4698,6 +5718,12 @@ "Smoker Name" "Regenerative Smoker" "Spitter Name" "Regenerative Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Regenerative Common" + "Witch Name" "Regenerative Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -4743,17 +5769,18 @@ "Human Ammo" "2" "Human Duration" "5" "Ability Enabled" "1" + "Ability Effect" "4" "Ability Message" "1" "Regen Chance" "100.0" "Regen Duration" "0" "Regen Health" "1" "Regen Interval" "1.0" - "Regen Leech" "1" - "Regen Leech Range" "500.0" "Regen Limit" "1000000" + "Regen Range" "500.0" "Special" { "Regen Limit" "100000" + "Regen Range" "150.0" } } } @@ -4773,6 +5800,12 @@ "Smoker Name" "Respawner Smoker" "Spitter Name" "Respawner Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Respawner Common" + "Witch Name" "Respawner Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -4816,7 +5849,7 @@ { "Human Ability" "1" "Human Ammo" "1" - "Ability Enabled" "1" + "Ability Enabled" "2" "Ability Message" "1" "Respawn Amount" "1" "Respawn Chance" "100.0" @@ -4839,6 +5872,12 @@ "Smoker Name" "Restarter Smoker" "Spitter Name" "Restarter Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Restarter Common" + "Witch Name" "Restarter Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -4914,6 +5953,12 @@ "Smoker Name" "Rock Smoker" "Spitter Name" "Rock Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Rock Common" + "Witch Name" "Rock Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -4968,6 +6013,7 @@ "Rock Damage" "5" "Rock Duration" "5" "Rock Interval" "0.2" + "Rock Mode" "1" "Rock Radius" "-1.25,1.25" } } @@ -4987,6 +6033,12 @@ "Smoker Name" "Rocketeer Smoker" "Spitter Name" "Rocketeer Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Rocketeer Common" + "Witch Name" "Rocketeer Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -5025,25 +6077,26 @@ "Spitter Extra Health" "100" } } - "Rocket Ability" + "Smash Ability" { "Human Ability" "1" "Human Ammo" "1" "Ability Enabled" "1" "Ability Effect" "7" "Ability Message" "1" - "Rocket Body" "1" - "Rocket Chance" "15.0" - "Rocket Delay" "1.0" - "Rocket Hit" "1" - "Rocket Hit Mode" "0" - "Rocket Mode" "1" - "Rocket Range" "150.0" - "Rocket Range Chance" "15.0" + "Smash Body" "1" + "Smash Chance" "15.0" + "Smash Delay" "1.0" + "Smash Hit" "1" + "Smash Hit Mode" "0" + "Smash Mode" "2" + "Smash Range" "150.0" + "Smash Range Chance" "15.0" + "Smash Type" "1" "Special" { - "Rocket Body" "0" - "Rocket Countdown" "3.0" + "Smash Body" "0" + "Smash Countdown" "3.0" } } } @@ -5063,6 +6116,12 @@ "Smoker Name" "Self-throwing Smoker" "Spitter Name" "Self-throwing Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Self-throwing Common" + "Witch Name" "Self-throwing Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -5134,6 +6193,12 @@ "Smoker Name" "Shaker Smoker" "Spitter Name" "Shaker Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Shaker Common" + "Witch Name" "Shaker Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -5173,23 +6238,24 @@ "Spitter Extra Health" "100" } } - "Shake Ability" + "Vision Ability" { "Human Ability" "1" "Human Ammo" "2" "Ability Enabled" "1" "Ability Effect" "7" "Ability Message" "1" - "Shake Chance" "33.3" - "Shake Death" "1" - "Shake Death Chance" "33.3" - "Shake Death Range" "200.0" - "Shake Duration" "5" - "Shake Hit" "1" - "Shake Hit Mode" "0" - "Shake Interval" "1.0" - "Shake Range" "150.0" - "Shake Range Chance" "15.0" + "Vision Chance" "33.3" + "Vision Death" "1" + "Vision Death Chance" "33.3" + "Vision Death Range" "200.0" + "Vision Duration" "5" + "Vision Hit" "1" + "Vision Hit Mode" "0" + "Vision Interval" "1.0" + "Vision Mode" "4" + "Vision Range" "150.0" + "Vision Range Chance" "15.0" } } "Tank #66" @@ -5208,6 +6274,12 @@ "Smoker Name" "Shield Smoker" "Spitter Name" "Shield Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Shield Common" + "Witch Name" "Shield Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -5286,6 +6358,12 @@ "Smoker Name" "Shover Smoker" "Spitter Name" "Shover Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Shover Common" + "Witch Name" "Shover Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -5359,6 +6437,12 @@ "Smoker Name" "Slow Smoker" "Spitter Name" "Slow Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Slow Common" + "Witch Name" "Slow Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -5430,6 +6514,12 @@ "Smoker Name" "Smasher Smoker" "Spitter Name" "Smasher Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Smasher Common" + "Witch Name" "Smasher Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -5486,6 +6576,8 @@ "Smash Mode" "1" "Smash Range" "150.0" "Smash Range Chance" "33.3" + "Smash Remove" "0" + "Smash Type" "1" "Special" { "Smash Body" "0" @@ -5509,7 +6601,13 @@ "Smoker Name" "Smiter Smoker" "Spitter Name" "Smiter Spitter" } - "Tank Enabled" "-1" + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Smiter Common" + "Witch Name" "Smiter Witch" + } + "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" "Skin Color" "0,230,230,255" @@ -5551,24 +6649,25 @@ { "Run Speed" "0.65" } - "Smite Ability" + "Smash Ability" { "Human Ability" "1" "Human Ammo" "1" "Ability Enabled" "1" "Ability Effect" "7" "Ability Message" "1" - "Smite Body" "1" - "Smite Chance" "33.3" - "Smite Hit" "1" - "Smite Hit Mode" "0" - "Smite Mode" "1" - "Smite Range" "150.0" - "Smite Range Chance" "33.3" + "Smash Body" "1" + "Smash Chance" "33.3" + "Smash Hit" "1" + "Smash Hit Mode" "0" + "Smash Mode" "4" + "Smash Range" "150.0" + "Smash Range Chance" "33.3" + "Smash Type" "1" "Special" { - "Smite Body" "0" - "Smite Countdown" "3.0" + "Smash Body" "0" + "Smash Countdown" "3.0" } } } @@ -5588,6 +6687,12 @@ "Smoker Name" "Smoker Smoker" "Spitter Name" "Smoker Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Smoker Common" + "Witch Name" "Smoker Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -5620,6 +6725,10 @@ "Particles" { "Body Effects" "32" + "Common" + { + "Body Chance" "100.0,100.0,100.0,100.0,100.0,33.3,100.0" + } } "Health" { @@ -5642,10 +6751,22 @@ "Ability Message" "1" "Minion Amount" "5" "Minion Chance" "20.0" + "Minion Filter" "1" "Minion Lifetime" "0.0" "Minion Remove" "1" "Minion Replace" "1" - "Minion Types" "1" + } + "Respawn Ability" + { + "Human Ability" "1" + "Human Ammo" "2" + "Human Duration" "5" + "Ability Enabled" "1" + "Ability Message" "1" + "Respawn Chance" "100.0" + "Respawn Duration" "0" + "Respawn Filter" "1" + "Respawn Range" "300.0" } "Throw Ability" { @@ -5656,7 +6777,7 @@ "Throw Chance" "33.3" "Throw Infected Amount" "2" "Throw Infected Lifetime" "0.0" - "Throw Infected Options" "1" + "Throw Infected Options" "2" "Throw Infected Remove" "1" "Special" { @@ -5680,6 +6801,12 @@ "Smoker Name" "Spammer Smoker" "Spitter Name" "Spammer Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Spammer Common" + "Witch Name" "Spammer Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -5722,16 +6849,17 @@ "Spitter Extra Health" "100" } } - "Spam Ability" + "Rock Ability" { "Human Ability" "1" "Human Ammo" "2" "Human Duration" "5" "Ability Enabled" "1" - "Spam Chance" "15.0" - "Spam Damage" "5" - "Spam Duration" "5" - "Spam Interval" "0.5" + "Rock Chance" "15.0" + "Rock Damage" "5" + "Rock Duration" "5" + "Rock Interval" "0.5" + "Rock Mode" "2" } } "Tank #73" @@ -5750,6 +6878,12 @@ "Smoker Name" "Special Smoker" "Spitter Name" "Special Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Special Common" + "Witch Name" "Special Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -5800,10 +6934,22 @@ "Ability Message" "1" "Minion Amount" "5" "Minion Chance" "20.0" + "Minion Filter" "0" "Minion Lifetime" "0.0" "Minion Remove" "1" "Minion Replace" "1" - "Minion Types" "0" + } + "Respawn Ability" + { + "Human Ability" "1" + "Human Ammo" "2" + "Human Duration" "5" + "Ability Enabled" "1" + "Ability Message" "1" + "Respawn Chance" "100.0" + "Respawn Duration" "0" + "Respawn Filter" "0" + "Respawn Range" "300.0" } "Throw Ability" { @@ -5814,7 +6960,7 @@ "Throw Chance" "33.3" "Throw Infected Amount" "2" "Throw Infected Lifetime" "0.0" - "Throw Infected Options" "63" + "Throw Infected Options" "126" "Throw Infected Remove" "1" "Special" { @@ -5839,6 +6985,12 @@ "Smoker Name" "Spitter Smoker" "Spitter Name" "Spitter Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Spitter Common" + "Witch Name" "Spitter Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -5894,10 +7046,22 @@ "Ability Message" "1" "Minion Amount" "5" "Minion Chance" "20.0" + "Minion Filter" "8" "Minion Lifetime" "0.0" "Minion Remove" "1" "Minion Replace" "1" - "Minion Types" "8" + } + "Respawn Ability" + { + "Human Ability" "1" + "Human Ammo" "2" + "Human Duration" "5" + "Ability Enabled" "1" + "Ability Message" "1" + "Respawn Chance" "100.0" + "Respawn Duration" "0" + "Respawn Filter" "8" + "Respawn Range" "300.0" } "Throw Ability" { @@ -5908,7 +7072,7 @@ "Throw Chance" "33.3" "Throw Infected Amount" "2" "Throw Infected Lifetime" "0.0" - "Throw Infected Options" "8" + "Throw Infected Options" "16" "Throw Infected Remove" "1" "Special" { @@ -5932,6 +7096,12 @@ "Smoker Name" "Splasher Smoker" "Spitter Name" "Splasher Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Splasher Common" + "Witch Name" "Splasher Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -5974,18 +7144,19 @@ "Spitter Extra Health" "100" } } - "Splash Ability" + "Cloud Ability" { "Human Ability" "1" "Human Ammo" "2" "Human Duration" "5" "Ability Enabled" "1" "Ability Message" "1" - "Splash Chance" "15.0" - "Splash Damage" "5.0" - "Splash Duration" "0" - "Splash Interval" "5.0" - "Splash Range" "500.0" + "Cloud Chance" "15.0" + "Cloud Damage" "5.0" + "Cloud Duration" "0" + "Cloud Interval" "5.0" + "Cloud Range" "500.0" + "Cloud Remove" "1" } } "Tank #76" @@ -6005,6 +7176,12 @@ "Smoker Name" "Splatter Smoker" "Spitter Name" "Splatter Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Splatter Common" + "Witch Name" "Splatter Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -6044,21 +7221,22 @@ "Spitter Extra Health" "100" } } - "Splatter Ability" + "Vision Ability" { "Human Ability" "1" "Human Ammo" "2" "Ability Enabled" "1" "Ability Effect" "7" "Ability Message" "1" - "Splatter Chance" "33.3" - "Splatter Duration" "5" - "Splatter Hit" "1" - "Splatter Hit Mode" "0" - "Splatter Interval" "1.0" - "Splatter Range" "150.0" - "Splatter Range Chance" "15.0" - "Splatter Type" "0" + "Vision Chance" "33.3" + "Vision Duration" "5.0" + "Vision Hit" "1" + "Vision Hit Mode" "0" + "Vision Interval" "1.0" + "Vision Mode" "8" + "Vision Range" "150.0" + "Vision Range Chance" "15.0" + "Vision Type" "0" } } "Tank #77" @@ -6077,6 +7255,12 @@ "Smoker Name" "Thrower Smoker" "Spitter Name" "Thrower Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Thrower Common" + "Witch Name" "Thrower Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -6129,13 +7313,14 @@ "Human Ammo" "2" "Ability Enabled" "15" "Ability Message" "15" + "Throw Car Damage" "5.0" "Throw Car Lifetime" "10.0" "Throw Car Options" "0" "Throw Car Owner" "1" "Throw Chance" "33.3" "Throw Infected Amount" "2" "Throw Infected Lifetime" "0.0" - "Throw Infected Options" "63" + "Throw Infected Options" "126" "Throw Infected Remove" "1" "Throw Witch Amount" "3" "Throw Witch Damage" "5.0" @@ -6163,6 +7348,12 @@ "Smoker Name" "Tracker Smoker" "Spitter Name" "Tracker Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Tracker Common" + "Witch Name" "Tracker Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -6241,6 +7432,12 @@ "Smoker Name" "Ultimate Smoker" "Spitter Name" "Ultimate Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Ultimate Common" + "Witch Name" "Ultimate Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -6310,6 +7507,12 @@ "Smoker Name" "Undead Smoker" "Spitter Name" "Undead Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Undead Common" + "Witch Name" "Undead Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -6379,6 +7582,12 @@ "Smoker Name" "Vampire Smoker" "Spitter Name" "Vampire Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Vampire Common" + "Witch Name" "Vampire Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -6422,13 +7631,13 @@ "Spitter Extra Health" "100" } } - "Vampire Ability" + "Regen Ability" { "Human Ability" "1" - "Ability Enabled" "1" "Ability Effect" "1" "Ability Message" "1" - "Vampire Chance" "33.3" + "Regen Chance" "33.3" + "Regen Mode" "1" } } "Tank #82" @@ -6447,6 +7656,12 @@ "Smoker Name" "Visual Smoker" "Spitter Name" "Visual Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Visual Common" + "Witch Name" "Visual Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -6494,10 +7709,11 @@ "Ability Effect" "7" "Ability Message" "1" "Vision Chance" "33.3" - "Vision Duration" "5" + "Vision Duration" "5.0" "Vision FOV" "160" "Vision Hit" "1" "Vision Hit Mode" "0" + "Vision Mode" "16" "Vision Range" "150.0" "Vision Range Chance" "15.0" } @@ -6518,6 +7734,12 @@ "Smoker Name" "Warper Smoker" "Spitter Name" "Warper Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Warper Common" + "Witch Name" "Warper Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -6605,6 +7827,12 @@ "Smoker Name" "Whirler Smoker" "Spitter Name" "Whirler Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Whirler Common" + "Witch Name" "Whirler Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -6677,6 +7905,12 @@ "Smoker Name" "Witch Smoker" "Spitter Name" "Witch Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Witch Common" + "Witch Name" "Witch Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -6767,6 +8001,12 @@ "Smoker Name" "Xiphos Smoker" "Spitter Name" "Xiphos Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Xiphos Common" + "Witch Name" "Xiphos Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -6805,14 +8045,14 @@ "Spitter Extra Health" "100" } } - "Xiphos Ability" + "Regen Ability" { "Human Ability" "1" - "Ability Enabled" "1" - "Ability Effect" "1" + "Ability Effect" "3" "Ability Message" "1" - "Xiphos Chance" "33.3" - "Xiphos Max Health" "0" + "Regen Chance" "33.3" + "Regen Max Health" "0" + "Regen Mode" "2" } } "Tank #87" @@ -6831,6 +8071,12 @@ "Smoker Name" "Yeller Smoker" "Spitter Name" "Yeller Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Yeller Common" + "Witch Name" "Yeller Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -6901,6 +8147,12 @@ "Smoker Name" "Zombie Smoker" "Spitter Name" "Zombie Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Zombie Common" + "Witch Name" "Zombie Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -6939,19 +8191,19 @@ "Spitter Extra Health" "100" } } - "Zombie Ability" + "Panic Ability" { "Human Ability" "1" "Human Ammo" "2" "Human Duration" "6" - "Ability Enabled" "1" + "Ability Enabled" "2" "Ability Message" "1" - "Zombie Amount" "10" - "Zombie Chance" "33.3" - "Zombie Duration" "0" - "Zombie Interval" "5.0" - "Zombie Mode" "0" - "Zombie Type" "0" + "Panic Amount" "10" + "Panic Chance" "33.3" + "Panic Duration" "0" + "Panic Interval" "5.0" + "Panic Mode" "0" + "Panic Type" "0" } } /** @@ -6974,6 +8226,12 @@ "Smoker Name" "Armageddon Smoker" "Spitter Name" "Armageddon Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Armageddon Common" + "Witch Name" "Armageddon Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -7020,7 +8278,7 @@ "Gravity Ability" { "Ability Enabled" "2" - "Ability Message" "5" + "Ability Message" "4" "Gravity Flags" "8" "Gravity Force" "-50.0" } @@ -7053,6 +8311,12 @@ "Smoker Name" "Boss Smoker" "Spitter Name" "Boss Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Boss Common" + "Witch Name" "Boss Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -7080,6 +8344,7 @@ "Particles" { "Body Effects" "127" + "Body Chance" "100.0,100.0,100.0,100.0,100.0,33.3,100.0" "Rock Effects" "15" } "Health" @@ -7199,6 +8464,8 @@ "Smash Chance" "20.0" "Smash Hit" "1" "Smash Hit Mode" "0" + "Smash Mode" "1" + "Smash Type" "1" "Special" { "Smash Body" "0" @@ -7222,16 +8489,16 @@ "Witch Range" "500.0" "Witch Remove" "1" } - "Zombie Ability" + "Panic Ability" { - "Ability Enabled" "1" + "Ability Enabled" "2" "Ability Message" "1" - "Zombie Amount" "50" - "Zombie Chance" "33.3" - "Zombie Duration" "0" - "Zombie Interval" "50.0" - "Zombie Mode" "0" - "Zombie Type" "0" + "Panic Amount" "50" + "Panic Chance" "33.3" + "Panic Duration" "0" + "Panic Interval" "50.0" + "Panic Mode" "0" + "Panic Type" "0" } } "Tank #91" @@ -7250,6 +8517,12 @@ "Smoker Name" "Cobalt Smoker" "Spitter Name" "Cobalt Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Cobalt Common" + "Witch Name" "Cobalt Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -7329,6 +8602,12 @@ "Smoker Name" "Distraction Smoker" "Spitter Name" "Distraction Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Distraction Common" + "Witch Name" "Distraction Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -7413,6 +8692,12 @@ "Smoker Name" "Feedback Smoker" "Spitter Name" "Feedback Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Feedback Common" + "Witch Name" "Feedback Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -7465,7 +8750,7 @@ "Human Ability" "1" "Human Ammo" "2" "Ability Enabled" "2" - "Ability Message" "5" + "Ability Message" "4" "Gravity Flags" "8" "Gravity Force" "50.0" } @@ -7486,6 +8771,12 @@ "Smoker Name" "Flash Smoker" "Spitter Name" "Flash Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Flash Common" + "Witch Name" "Flash Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -7621,6 +8912,12 @@ "Smoker Name" "Goliath Smoker" "Spitter Name" "Goliath Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Goliath Common" + "Witch Name" "Goliath Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -7715,6 +9012,8 @@ "Smash Chance" "33.3" "Smash Hit" "1" "Smash Hit Mode" "0" + "Smash Mode" "1" + "Smash Type" "1" "Special" { "Smash Body" "0" @@ -7738,6 +9037,12 @@ "Smoker Name" "Hallucination Smoker" "Spitter Name" "Hallucination Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Hallucination Common" + "Witch Name" "Hallucination Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -7820,6 +9125,12 @@ "Smoker Name" "Meme Smoker" "Spitter Name" "Meme Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Meme Common" + "Witch Name" "Meme Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -7847,6 +9158,7 @@ "Particles" { "Body Effects" "127" + "Body Chance" "100.0,100.0,100.0,100.0,100.0,33.3,100.0" "Rock Effects" "15" } "Health" @@ -7947,19 +9259,22 @@ "Smash Chance" "20.0" "Smash Hit" "1" "Smash Hit Mode" "0" + "Smash Mode" "1" + "Smash Type" "1" "Special" { "Smash Body" "0" "Smash Meter" "50.0" } } - "Spam Ability" + "Rock Ability" { "Ability Enabled" "1" - "Spam Chance" "50.0" - "Spam Damage" "5" - "Spam Duration" "1" - "Spam Interval" "0.5" + "Rock Chance" "50.0" + "Rock Damage" "5" + "Rock Duration" "1" + "Rock Interval" "0.5" + "Rock Mode" "2" } "Warp Ability" { @@ -7978,16 +9293,16 @@ "Witch Range" "500.0" "Witch Remove" "1" } - "Zombie Ability" + "Panic Ability" { - "Ability Enabled" "1" + "Ability Enabled" "2" "Ability Message" "1" - "Zombie Amount" "50" - "Zombie Chance" "33.3" - "Zombie Duration" "0" - "Zombie Interval" "50.0" - "Zombie Mode" "0" - "Zombie Type" "0" + "Panic Amount" "50" + "Panic Chance" "33.3" + "Panic Duration" "0" + "Panic Interval" "50.0" + "Panic Mode" "0" + "Panic Type" "0" } } "Tank #98" @@ -8006,6 +9321,12 @@ "Smoker Name" "Mirage Smoker" "Spitter Name" "Mirage Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Mirage Common" + "Witch Name" "Mirage Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -8095,6 +9416,12 @@ "Smoker Name" "Poltergeist Smoker" "Spitter Name" "Poltergeist Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Poltergeist Common" + "Witch Name" "Poltergeist Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -8200,6 +9527,12 @@ "Smoker Name" "Psychotic Smoker" "Spitter Name" "Psychotic Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Psychotic Common" + "Witch Name" "Psychotic Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -8319,6 +9652,12 @@ "Smoker Name" "Reverse-Flash Smoker" "Spitter Name" "Reverse-Flash Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Reverse-Flash Common" + "Witch Name" "Reverse-Flash Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -8417,6 +9756,12 @@ "Smoker Name" "Spawner Smoker" "Spitter Name" "Spawner Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Spawner Common" + "Witch Name" "Spawner Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -8438,6 +9783,10 @@ "Particles" { "Body Effects" "32" + "Common" + { + "Body Chance" "100.0,100.0,100.0,100.0,100.0,33.3,100.0" + } } "Health" { @@ -8452,19 +9801,19 @@ "Spitter Extra Health" "100" } } - "Zombie Ability" + "Panic Ability" { "Human Ability" "1" "Human Ammo" "2" "Human Duration" "26" - "Ability Enabled" "1" + "Ability Enabled" "2" "Ability Message" "1" - "Zombie Amount" "25" - "Zombie Chance" "33.3" - "Zombie Duration" "0" - "Zombie Interval" "25.0" - "Zombie Mode" "0" - "Zombie Type" "0" + "Panic Amount" "25" + "Panic Chance" "33.3" + "Panic Duration" "0" + "Panic Interval" "25.0" + "Panic Mode" "0" + "Panic Type" "0" } } "Tank #103" @@ -8483,6 +9832,12 @@ "Smoker Name" "Zoom Smoker" "Spitter Name" "Zoom Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Zoom Common" + "Witch Name" "Zoom Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -8581,6 +9936,12 @@ "Smoker Name" "Trap Smoker" "Spitter Name" "Trap Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Trap Common" + "Witch Name" "Trap Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -8601,15 +9962,15 @@ } "Health" { - "Extra Health" "2000" + "Extra Health" "1000" "Special" { - "Boomer Extra Health" "200" - "Charger Extra Health" "200" - "Hunter Extra Health" "200" - "Jockey Extra Health" "200" - "Smoker Extra Health" "200" - "Spitter Extra Health" "200" + "Boomer Extra Health" "100" + "Charger Extra Health" "100" + "Hunter Extra Health" "100" + "Jockey Extra Health" "100" + "Smoker Extra Health" "100" + "Spitter Extra Health" "100" } } "Enhancements" @@ -8628,6 +9989,8 @@ "Smash Chance" "33.3" "Smash Hit" "1" "Smash Hit Mode" "0" + "Smash Mode" "1" + "Smash Type" "1" "Special" { "Smash Body" "0" @@ -8655,6 +10018,12 @@ "Smoker Name" "Dread Smoker" "Spitter Name" "Dread Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Dread Common" + "Witch Name" "Dread Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -8686,17 +10055,17 @@ "Spitter Extra Health" "100" } } - "Blind Ability" + "Vision Ability" { "Human Ability" "1" "Ability Effect" "7" "Ability Message" "1" - "Blind Chance" "33.3" - "Blind Duration" "7.5" - "Blind Hit" "1" - "Blind Hit Mode" "0" - "Blind Intensity" "235" - "Blind Mode" "0" + "Vision Chance" "33.3" + "Vision Duration" "7.5" + "Vision Hit" "1" + "Vision Hit Mode" "0" + "Vision Intensity" "235" + "Vision Mode" "1" } } "Tank #106" @@ -8715,6 +10084,12 @@ "Smoker Name" "Rabid Smoker" "Spitter Name" "Rabid Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Rabid Common" + "Witch Name" "Rabid Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -8776,6 +10151,7 @@ "Ability Message" "1" "Hurt Hit" "1" "Hurt Hit Mode" "0" + "Hurt Mode" "1" } } "Tank #107" @@ -8794,6 +10170,12 @@ "Smoker Name" "Tremor Smoker" "Spitter Name" "Tremor Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Tremor Common" + "Witch Name" "Tremor Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -8842,7 +10224,7 @@ "Combo Chance" "33.3,75.0" "Combo Damage" "1.0" "Combo Duration" "5.0" - "Combo Interval" "0.2" + "Combo Interval" "0.75" "Combo Radius" "-1.25;1.25" "Combo Set" "Rock,Track" "Combo Speed" "0.0,500.0" @@ -8856,6 +10238,11 @@ "Human Duration" "5" "Ability Enabled" "1" "Ability Message" "1" + "Rock Chance" "33.3" + "Rock Damage" "5" + "Rock Duration" "5" + "Rock Interval" "0.75" + "Rock Mode" "0" } "Track Ability" { @@ -8866,18 +10253,6 @@ "Ability Message" "1" "Track Mode" "1" } - "Spam Ability" - { - "Human Ability" "1" - "Human Ammo" "2" - "Human Duration" "5" - "Ability Enabled" "1" - "Ability Message" "1" - "Spam Chance" "33.3" - "Spam Damage" "5" - "Spam Duration" "5" - "Spam Interval" "0.5" - } } /** * This is the plugin developer's personal Tank. @@ -8899,6 +10274,12 @@ "Smoker Name" "Psyk0tik Smoker" "Spitter Name" "Psyk0tik Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Psyk0tik Common" + "Witch Name" "Psyk0tik Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -9027,6 +10408,12 @@ "Smoker Name" "Apocalyptic Smoker" "Spitter Name" "Apocalyptic Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Apocalyptic Common" + "Witch Name" "Apocalyptic Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -9112,6 +10499,7 @@ "Rock Damage" "10" "Rock Duration" "3" "Rock Interval" "0.2" + "Rock Mode" "1" "Rock Radius" "-5.0,5.0" } } @@ -9131,6 +10519,12 @@ "Smoker Name" "Darth Vader Smoker" "Spitter Name" "Darth Vader Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Darth Vader Common" + "Witch Name" "Darth Vader Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -9159,7 +10553,16 @@ } "Health" { - "Extra Health" "1500" + "Extra Health" "1000" + "Special" + { + "Boomer Extra Health" "100" + "Charger Extra Health" "100" + "Hunter Extra Health" "100" + "Jockey Extra Health" "100" + "Smoker Extra Health" "100" + "Spitter Extra Health" "100" + } } "Enhancements" { @@ -9228,6 +10631,12 @@ "Smoker Name" "Drug Addict Smoker" "Spitter Name" "Drug Addict Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Drug Addict Common" + "Witch Name" "Drug Addict Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -9256,18 +10665,22 @@ "Particles" { "Body Effects" "32" + "Common" + { + "Body Chance" "100.0,100.0,100.0,100.0,100.0,33.3,100.0" + } } "Health" { - "Extra Health" "2000" + "Extra Health" "1000" "Special" { - "Boomer Extra Health" "200" - "Charger Extra Health" "200" - "Hunter Extra Health" "200" - "Jockey Extra Health" "200" - "Smoker Extra Health" "200" - "Spitter Extra Health" "200" + "Boomer Extra Health" "100" + "Charger Extra Health" "100" + "Hunter Extra Health" "100" + "Jockey Extra Health" "100" + "Smoker Extra Health" "100" + "Spitter Extra Health" "100" } } "Drug Ability" @@ -9282,12 +10695,13 @@ "Drug Hit Mode" "0" "Drug Interval" "1.0" } - "Item Ability" + "Drop Ability" { - "Human Ability" "2" - "Item Pinata" "pain_pills,pain_pills,pain_pills,pain_pills,pain_pills" - "Item Pinata Body" "1" - "Item Pinata Chance" "100.0" + "Human Ability" "1" + "Ability Enabled" "2" + "Drop Pinata" "pain_pills,pain_pills,pain_pills,pain_pills,pain_pills" + "Drop Pinata Body" "1" + "Drop Pinata Chance" "100.0" } "Slow Ability" { @@ -9319,6 +10733,12 @@ "Smoker Name" "Godspeed Smoker" "Spitter Name" "Godspeed Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Godspeed Common" + "Witch Name" "Godspeed Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -9417,6 +10837,12 @@ "Smoker Name" "Grim Reaper Smoker" "Spitter Name" "Grim Reaper Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Grim Reaper Common" + "Witch Name" "Grim Reaper Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -9505,6 +10931,12 @@ "Smoker Name" "Horde Smoker" "Spitter Name" "Horde Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Horde Common" + "Witch Name" "Horde Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -9600,6 +11032,12 @@ "Smoker Name" "Hulk Smoker" "Spitter Name" "Hulk Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Hulk Common" + "Witch Name" "Hulk Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -9669,6 +11107,7 @@ "Ability Message" "1" "Hurt Hit" "1" "Hurt Hit Mode" "1" + "Hurt Mode" "1" } "Absorb Ability" { @@ -9685,15 +11124,16 @@ "Absorb Hittable Divisor" "20.0" "Absorb Melee Divisor" "200.0" } - "Shake Ability" + "Vision Ability" { "Human Ability" "1" "Ability Enabled" "1" "Ability Effect" "7" - "Shake Duration" "99999" - "Shake Interval" "1.0" - "Shake Range" "1000.0" - "Shake Range Chance" "100.0" + "Vision Duration" "99999" + "Vision Interval" "1.0" + "Vision Mode" "4" + "Vision Range" "1000.0" + "Vision Range Chance" "100.0" } "Smash Ability" { @@ -9704,6 +11144,8 @@ "Smash Chance" "15.0" "Smash Hit" "1" "Smash Hit Mode" "1" + "Smash Mode" "1" + "Smash Type" "1" "Special" { "Smash Body" "0" @@ -9727,6 +11169,12 @@ "Smoker Name" "Ninja Smoker" "Spitter Name" "Ninja Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Ninja Common" + "Witch Name" "Ninja Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -9838,6 +11286,12 @@ "Smoker Name" "Zen Smoker" "Spitter Name" "Zen Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Zen Common" + "Witch Name" "Zen Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -9933,6 +11387,12 @@ "Smoker Name" "The Boss (1st Form)" "Spitter Name" "The Boss (1st Form)" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "The Boss (1st Form)" + "Witch Name" "The Boss (1st Form)" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -10016,6 +11476,12 @@ "Smoker Name" "Steel Overlord (2nd Form)" "Spitter Name" "Steel Overlord (2nd Form)" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Steel Overlord (2nd Form)" + "Witch Name" "Steel Overlord (2nd Form)" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -10116,6 +11582,12 @@ "Smoker Name" "Night Stalker (3rd Form)" "Spitter Name" "Night Stalker (3rd Form)" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Night Stalker (3rd Form)" + "Witch Name" "Night Stalker (3rd Form)" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -10177,16 +11649,16 @@ { "Fire Immunity" "1" } - "Blind Ability" + "Vision Ability" { "Ability Effect" "7" "Ability Message" "1" - "Blind Chance" "100.0" - "Blind Duration" "5.0" - "Blind Hit" "1" - "Blind Hit Mode" "1" - "Blind Intensity" "255" - "Blind Mode" "0" + "Vision Chance" "100.0" + "Vision Duration" "5.0" + "Vision Hit" "1" + "Vision Hit Mode" "1" + "Vision Intensity" "255" + "Vision Mode" "1" } "Bomb Ability" { @@ -10236,6 +11708,12 @@ "Smoker Name" "Spirit of Fire (4th Form)" "Spitter Name" "Spirit of Fire (4th Form)" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Spirit of Fire (4th Form)" + "Witch Name" "Spirit of Fire (4th Form)" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -10367,6 +11845,12 @@ "Smoker Name" "Randomizer Smoker" "Spitter Name" "Randomizer Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Randomizer Common" + "Witch Name" "Randomizer Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -10440,6 +11924,12 @@ "Smoker Name" "Shapeshifter Smoker" "Spitter Name" "Shapeshifter Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Shapeshifter Common" + "Witch Name" "Shapeshifter Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -10503,6 +11993,12 @@ "Smoker Name" "Flashbanger Smoker" "Spitter Name" "Flashbanger Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Flashbanger Common" + "Witch Name" "Flashbanger Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -10541,26 +12037,26 @@ "Spitter Extra Health" "100" } } - "Blind Ability" + "Vision Ability" { "Human Ability" "1" "Human Ammo" "2" "Ability Enabled" "1" "Ability Effect" "7" "Ability Message" "1" - "Blind Chance" "33.3" - "Blind Duration" "5.0" - "Blind Hit" "1" - "Blind Hit Mode" "0" - "Blind Intensity" "255" - "Blind Mode" "1" - "Blind Range" "150.0" - "Blind Range Chance" "15.0" - "Blind Stagger" "3" - } - } - // The following sample showcases a certain type of the Splatter ability. - "Tank #125" + "Vision Chance" "33.3" + "Vision Duration" "5.0" + "Vision Hit" "1" + "Vision Hit Mode" "0" + "Vision Intensity" "255" + "Vision Mode" "2" + "Vision Range" "150.0" + "Vision Range Chance" "15.0" + "Vision Stagger" "3" + } + } + // The following sample showcases a certain type of the Splatter ability. + "Tank #125" { "General" { @@ -10577,6 +12073,12 @@ "Smoker Name" "Mudman Smoker" "Spitter Name" "Mudman Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Mudman Common" + "Witch Name" "Mudman Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -10616,21 +12118,22 @@ "Spitter Extra Health" "100" } } - "Splatter Ability" + "Vision Ability" { "Human Ability" "1" "Human Ammo" "2" "Ability Enabled" "1" "Ability Effect" "7" "Ability Message" "1" - "Splatter Chance" "33.3" - "Splatter Duration" "5" - "Splatter Hit" "1" - "Splatter Hit Mode" "0" - "Splatter Interval" "1.0" - "Splatter Range" "150.0" - "Splatter Range Chance" "15.0" - "Splatter Type" "14" + "Vision Chance" "33.3" + "Vision Duration" "5.0" + "Vision Hit" "1" + "Vision Hit Mode" "0" + "Vision Interval" "1.0" + "Vision Mode" "8" + "Vision Range" "150.0" + "Vision Range Chance" "15.0" + "Vision Type" "14" } } // The following samples are impossible to beat and only serve as annoyances or fatal threats. @@ -10650,6 +12153,12 @@ "Smoker Name" "Endgame Smoker" "Spitter Name" "Endgame Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Endgame Common" + "Witch Name" "Endgame Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -10696,6 +12205,13 @@ "Fast Duration" "99999" "Fast Speed" "10.0" } + "Gravity Ability" + { + "Ability Enabled" "2" + "Ability Message" "4" + "Gravity Flags" "8" + "Gravity Force" "-100.0" + } "Smash Ability" { "Human Ability" "1" @@ -10705,6 +12221,8 @@ "Smash Chance" "100.0" "Smash Hit" "1" "Smash Hit Mode" "1" + "Smash Mode" "1" + "Smash Type" "1" "Special" { "Smash Body" "0" @@ -10728,6 +12246,12 @@ "Smoker Name" "Playful Smoker" "Spitter Name" "Playful Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Playful Common" + "Witch Name" "Playful Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -10789,6 +12313,12 @@ "Smoker Name" "Annoying Smoker" "Spitter Name" "Annoying Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Annoying Common" + "Witch Name" "Annoying Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -10821,13 +12351,2005 @@ { "Human Ability" "1" "Human Ammo" "99999" - "Ability Enabled" "1" + "Ability Enabled" "2" "Ability Message" "1" "Respawn Amount" "99999" "Respawn Chance" "100.0" "Respawn Type" "128-128" } } + "Tank #129" + { + "General" + { + "Tank Name" "Sipow Tank" + "Special" + { + "Special Types" "-1" + "Special Note" "-1" + "Boomer Name" "Sipow Boomer" + "Charger Name" "Sipow Charger" + "Hunter Name" "Sipow Hunter" + "Jockey Name" "Sipow Jockey" + "Smoker Name" "Sipow Smoker" + "Spitter Name" "Sipow Spitter" + } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Sipow Common" + "Witch Name" "Sipow Witch" + } + "Tank Enabled" "-1" + "Tank Chance" "100.0" + "Tank Note" "1" + "Skin Color" "50,125,255,255" + } + "Glow" + { + "Glow Enabled" "1" + "Glow Color" "255,175,0" + } + "Human Support" + { + "Human Support" "1" + } + "Props" + { + "Light Color" "255,175,0,255" + "Oxygen Tank Color" "255,175,0,255" + "Flame Color" "255,175,0,180" + "Rock Color" "255,175,0,255" + "Tire Color" "255,175,0,255" + "Propane Tank Color" "255,175,0,255" + "Flashlight Color" "255,175,0,255" + "Crown Color" "255,175,0,255" + } + "Particles" + { + "Body Effects" "80" + "Rock Effects" "8" + } + "Health" + { + "Extra Health" "1000" + "Special" + { + "Boomer Extra Health" "100" + "Charger Extra Health" "100" + "Hunter Extra Health" "100" + "Jockey Extra Health" "100" + "Smoker Extra Health" "100" + "Spitter Extra Health" "100" + } + } + "Enhancements" + { + "Throw Interval" "10.0" + "Run Speed" "1.33" + } + "Immunities" + { + "Explosive Immunity" "1" + "Fire Immunity" "1" + } + "Acid Ability" + { + "Human Ability" "1" + "Human Ammo" "2" + "Ability Enabled" "1" + "Ability Effect" "7" + "Ability Message" "5" + "Acid Chance" "33.3" + "Acid Cooldown" "3" + "Acid Damage" "3.0" + "Acid Death" "1" + "Acid Death Chance" "33.3" + "Acid Death Range" "200.0" + "Acid Hit" "1" + "Acid Hit Mode" "0" + "Acid Range" "150.0" + "Acid Range Chance" "15.0" + "Acid Rock Break" "1" + "Acid Rock Chance" "33.3" + "Special" + { + "Acid Cooldown" "3" + "Acid Damage" "1.0" + } + } + "Meteor Ability" + { + "Human Ability" "1" + "Human Ammo" "1" + "Human Duration" "5" + "Ability Enabled" "1" + "Ability Message" "1" + "Meteor Chance" "15.0" + "Meteor Duration" "5" + "Meteor Interval" "0.6" + "Meteor Lifetime" "15.0" + "Meteor Mode" "0" + "Meteor Radius" "-180.0,180.0" + } + } + "Tank #130" + { + "General" + { + "Tank Name" "Evil Tank" + "Special" + { + "Special Types" "-1" + "Special Note" "-1" + "Boomer Name" "Evil Boomer" + "Charger Name" "Evil Charger" + "Hunter Name" "Evil Hunter" + "Jockey Name" "Evil Jockey" + "Smoker Name" "Evil Smoker" + "Spitter Name" "Evil Spitter" + } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Evil Common" + "Witch Name" "Evil Witch" + } + "Tank Enabled" "-1" + "Tank Chance" "100.0" + "Tank Note" "1" + "Skin Color" "170,20,60,255" + } + "Glow" + { + "Glow Enabled" "1" + "Glow Color" "0,0,140" + } + "Human Support" + { + "Human Support" "1" + } + "Props" + { + "Props Attached" "124" + "Light Color" "0,0,140,255" + "Oxygen Tank Color" "0,0,140,255" + "Flame Color" "0,0,140,180" + "Rock Color" "0,0,140,255" + "Tire Color" "0,0,140,255" + "Propane Tank Color" "0,0,140,255" + "Flashlight Color" "0,0,140,255" + "Crown Color" "0,0,140,255" + } + "Health" + { + "Extra Health" "1000" + "Special" + { + "Boomer Extra Health" "100" + "Charger Extra Health" "100" + "Hunter Extra Health" "100" + "Jockey Extra Health" "100" + "Smoker Extra Health" "100" + "Spitter Extra Health" "100" + } + } + "Fire Ability" + { + "Ability Effect" "7" + "Ability Message" "1" + "Fire Chance" "100.0" + "Fire Cooldown" "3" + "Fire Damage" "0.5" + "Fire Hit" "1" + "Fire Hit Mode" "0" + "Special" + { + "Fire Cooldown" "3" + "Fire Damage" "0.25" + } + } + "Ice Ability" + { + "Ability Effect" "7" + "Ability Message" "1" + "Ice Chance" "100.0" + "Ice Cooldown" "3" + "Ice Hit" "1" + "Ice Hit Mode" "0" + "Special" + { + "Ice Cooldown" "3" + } + } + "Medic Ability" + { + "Human Ability" "1" + "Human Ammo" "2" + "Human Duration" "6" + "Ability Enabled" "1" + "Ability Message" "1" + "Medic Chance" "100.0" + "Medic Duration" "0" + "Medic Field" "1" + "Medic Field Color" "0,255,0" + "Medic Health" "25,25,25,25,25,25,100" + "Medic Interval" "1.0" + "Medic Max Health" "250,50,250,100,325,600,10000" + "Medic Range" "500.0" + } + "Respawn Ability" + { + "Human Ability" "1" + "Human Ammo" "2" + "Human Duration" "5" + "Ability Enabled" "1" + "Ability Message" "1" + "Respawn Chance" "100.0" + "Respawn Duration" "0" + "Respawn Filter" "0" + "Respawn Range" "500.0" + } + } + "Tank #131" + { + "General" + { + "Tank Name" "Officer Tank" + "Special" + { + "Special Types" "-1" + "Special Note" "-1" + "Boomer Name" "Officer Boomer" + "Charger Name" "Officer Charger" + "Hunter Name" "Officer Hunter" + "Jockey Name" "Officer Jockey" + "Smoker Name" "Officer Smoker" + "Spitter Name" "Officer Spitter" + } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Officer Common" + "Witch Name" "Officer Witch" + } + "Tank Enabled" "-1" + "Tank Chance" "100.0" + "Tank Note" "1" + "Skin Color" "100,100,100,255" + } + "Glow" + { + "Glow Enabled" "1" + "Glow Color" "100,100,100" + } + "Human Support" + { + "Human Support" "1" + } + "Spawn" + { + "Open Areas Only" "150.0" + } + "Props" + { + "Props Attached" "242" // L4D1: 194 + "Light Color" "0,0,255,255" + "Rock Color" "0,0,0,255" + "Tire Color" "100,100,100,255" + "Propane Tank Color" "0,0,0,255" + "Flashlight Color" "255,0,0,255" + } + "Health" + { + "Extra Health" "1000" + "Special" + { + "Boomer Extra Health" "100" + "Charger Extra Health" "100" + "Hunter Extra Health" "100" + "Jockey Extra Health" "100" + "Smoker Extra Health" "100" + "Spitter Extra Health" "100" + } + } + "Drop Ability" + { + "Human Ability" "1" + "Ability Enabled" "1" + "Ability Message" "1" + "Drop Chance" "100.0" + "Drop Mode" "2" + "Drop Weapon Boost" "1.15" + "Drop Weapon Name" "tonfa" + "Drop Weapon Resistance" "0.85" + "Drop Weapon Scale" "1.0" + } + "Gunner Ability" + { + "Human Ability" "1" + "Human Ammo" "2" + "Ability Enabled" "1" + "Ability Message" "1" + "Gunner Accuracy" "2.0" + "Gunner Bullets" "5" + "Gunner Chance" "100.0" + "Gunner Clip Size" "10" + "Gunner Damage" "5.0" + "Gunner Duration" "99999.0" + "Gunner Gun Type" "3" + "Gunner Interval" "1.0" + "Gunner Load Time" "1.0" + "Gunner Range" "500.0" + "Gunner Reaction Time" "1.0" + "Gunner Target Type" "7" + "Special" + { + "Gunner Clip Size" "15" + "Gunner Damage" "1.0" + "Gunner Gun Type" "1" + "Gunner Target Type" "7" + } + } + "Minion Ability" + { + "Human Ability" "1" + "Human Ammo" "2" + "Ability Enabled" "1" + "Ability Message" "1" + "Minion Amount" "4" + "Minion Chance" "100.0" + "Minion Filter" "0" + "Minion Lifetime" "0.0" + "Minion Remove" "1" + "Minion Replace" "1" + "Minion Type" "131-131" + } + "Panic Ability" + { + "Special" + { + "Human Ability" "1" + "Human Ammo" "2" + "Ability Enabled" "2" + "Ability Message" "1" + "Panic Amount" "1" + "Panic Chance" "100.0" + "Panic Duration" "0" + "Panic Interval" "5.0" + "Panic Mode" "2" + "Panic Type" "64" + } + } + } + "Tank #132" + { + "General" + { + "Tank Name" "Mafia Tank" + "Special" + { + "Special Types" "-1" + "Special Note" "-1" + "Boomer Name" "Mafia Boomer" + "Charger Name" "Mafia Charger" + "Hunter Name" "Mafia Hunter" + "Jockey Name" "Mafia Jockey" + "Smoker Name" "Mafia Smoker" + "Spitter Name" "Mafia Spitter" + } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Mafia Common" + "Witch Name" "Mafia Witch" + } + "Tank Enabled" "-1" + "Tank Chance" "100.0" + "Tank Note" "1" + "Skin Color" "180,0,180,255" + } + "Glow" + { + "Glow Enabled" "1" + "Glow Color" "180,0,180" + } + "Human Support" + { + "Human Support" "1" + } + "Spawn" + { + "Open Areas Only" "500.0" + } + "Props" + { + "Props Attached" "0" + } + "Health" + { + "Extra Health" "1000" + "Special" + { + "Boomer Extra Health" "100" + "Charger Extra Health" "100" + "Hunter Extra Health" "100" + "Jockey Extra Health" "100" + "Smoker Extra Health" "100" + "Spitter Extra Health" "100" + } + } + "Enhancements" + { + "Run Speed" "2.5" + } + "Clone Ability" + { + "Human Ability" "1" + "Human Ammo" "2" + "Ability Enabled" "1" + "Ability Message" "1" + "Clone Amount" "2" + "Clone Chance" "100.0" + "Clone Health" "1500" + "Clone Lifetime" "0.0" + "Clone Remove" "0" + "Clone Replace" "1" + "Clone Swap" "0.0" + "Clone Type" "132-132" + "Special" + { + "Clone Health" "150" + } + } + "Smash Ability" + { + "Ability Effect" "7" + "Ability Message" "1" + "Smash Body" "1" + "Smash Chance" "33.0" + "Smash Hit" "1" + "Smash Hit Mode" "1" + "Smash Mode" "1" + "Smash Type" "1" + "Special" + { + "Smash Body" "0" + "Smash Meter" "50.0" + } + } + } + "Tank #133" + { + "General" + { + "Tank Name" "Frankenstein Tank" + "Special" + { + "Special Types" "-1" + "Special Note" "-1" + "Boomer Name" "Frankenstein Boomer" + "Charger Name" "Frankenstein Charger" + "Hunter Name" "Frankenstein Hunter" + "Jockey Name" "Frankenstein Jockey" + "Smoker Name" "Frankenstein Smoker" + "Spitter Name" "Frankenstein Spitter" + } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Frankenstein Common" + "Witch Name" "Frankenstein Witch" + } + "Tank Enabled" "-1" + "Tank Chance" "100.0" + "Tank Note" "1" + "Skin Color" "85,125,75,255" + } + "Glow" + { + "Glow Enabled" "1" + "Glow Color" "85,125,75" + } + "Human Support" + { + "Human Support" "1" + } + "Props" + { + "Props Attached" "16" // L4D1: 0 + "Rock Color" "100,100,100,255" + } + "Health" + { + "Extra Health" "1000" + "Special" + { + "Boomer Extra Health" "100" + "Charger Extra Health" "100" + "Hunter Extra Health" "100" + "Jockey Extra Health" "100" + "Smoker Extra Health" "100" + "Spitter Extra Health" "100" + } + } + "Enhancements" + { + "Claw Damage" "1.0" + "Hittable Damage" "1.0" + "Rock Damage" "1.0" + "Run Speed" "0.65" + } + "Ghost Ability" + { + "Ability Effect" "7" + "Ability Message" "1" + "Ghost Hit" "1" + "Ghost Hit Mode" "0" + "Ghost Weapon Slots" "28" + } + "Jump Ability" + { + "Ability Enabled" "2" + "Ability Message" "4" + "Jump Mode" "1" + "Jump Sporadic Chance" "33.3" + "Jump Sporadic Height" "750.0" + } + "Undead Ability" + { + "Human Ability" "1" + "Human Ammo" "2" + "Ability Enabled" "1" + "Ability Message" "1" + "Undead Amount" "2" + "Undead Chance" "100.0" + } + "Warp Ability" + { + "Ability Enabled" "2" + "Ability Message" "4" + "Warp Interval" "10.0" + } + } + "Tank #134" + { + "General" + { + "Tank Name" "Prototype Tank" + "Special" + { + "Special Types" "-1" + "Special Note" "-1" + "Boomer Name" "Prototype Boomer" + "Charger Name" "Prototype Charger" + "Hunter Name" "Prototype Hunter" + "Jockey Name" "Prototype Jockey" + "Smoker Name" "Prototype Smoker" + "Spitter Name" "Prototype Spitter" + } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Prototype Common" + "Witch Name" "Prototype Witch" + } + "Tank Enabled" "-1" + "Tank Chance" "100.0" + "Tank Note" "1" + "Skin Color" "75,75,75,255" + } + "Glow" + { + "Glow Enabled" "1" + "Glow Color" "255,25,55" + } + "Human Support" + { + "Human Support" "1" + } + "Props" + { + "Props Attached" "18" // L4D1: 2 + "Light Color" "255,25,55,255" + "Rock Color" "255,25,55,255" + } + "Health" + { + "Extra Health" "1000" + "Special" + { + "Boomer Extra Health" "100" + "Charger Extra Health" "100" + "Hunter Extra Health" "100" + "Jockey Extra Health" "100" + "Smoker Extra Health" "100" + "Spitter Extra Health" "100" + } + } + "Absorb Ability" + { + "Human Ability" "1" + "Human Ammo" "2" + "Human Duration" "99999" + "Ability Enabled" "1" + "Ability Message" "1" + "Absorb Bullet Divisor" "20.0" + "Absorb Chance" "100.0" + "Absorb Duration" "99999" + "Absorb Explosive Divisor" "20.0" + "Absorb Fire Divisor" "200.0" + "Absorb Hittable Divisor" "20.0" + "Absorb Melee Divisor" "200.0" + } + "Smash Ability" + { + "Ability Effect" "7" + "Ability Message" "1" + "Smash Body" "1" + "Smash Chance" "33.3" + "Smash Hit" "1" + "Smash Hit Mode" "0" + "Smash Mode" "1" + "Smash Remove" "1" + "Smash Type" "1" + "Special" + { + "Smash Body" "0" + "Smash Meter" "50.0" + } + } + "Omni Ability" + { + "Requires Humans" "0" + "Human Ability" "1" + "Human Ammo" "3" + "Human Duration" "5" + "Ability Enabled" "1" + "Ability Message" "1" + "Omni Chance" "33.3" + "Omni Duration" "5" + "Omni Mode" "0" + "Omni Range" "500.0" + } + "Respawn Ability" + { + "Human Ability" "1" + "Human Ammo" "1" + "Ability Enabled" "2" + "Ability Message" "1" + "Respawn Amount" "2" + "Respawn Chance" "100.0" + "Respawn Type" "134-134" + } + } + "Tank #135" + { + "General" + { + "Tank Name" "Zeus Tank" + "Special" + { + "Special Types" "-1" + "Special Note" "-1" + "Boomer Name" "Zeus Boomer" + "Charger Name" "Zeus Charger" + "Hunter Name" "Zeus Hunter" + "Jockey Name" "Zeus Jockey" + "Smoker Name" "Zeus Smoker" + "Spitter Name" "Zeus Spitter" + } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Zeus Common" + "Witch Name" "Zeus Witch" + } + "Tank Enabled" "-1" + "Tank Chance" "100.0" + "Tank Note" "1" + "Skin Color" "175,40,255,255" + } + "Glow" + { + "Glow Enabled" "1" + "Glow Color" "0,100,155" + } + "Human Support" + { + "Human Support" "1" + } + "Spawn" + { + "Open Areas Only" "500.0" + } + "Props" + { + "Props Attached" "272" // L4D1: 224 + "Rock Color" "0,100,155,255" + "Crown Color" "0,100,155,255" + } + "Particles" + { + "Body Effects" "2" + "Rock Effects" "2" + } + "Health" + { + "Extra Health" "1000" + "Special" + { + "Boomer Extra Health" "100" + "Charger Extra Health" "100" + "Hunter Extra Health" "100" + "Jockey Extra Health" "100" + "Smoker Extra Health" "100" + "Spitter Extra Health" "100" + } + } + "Immunities" + { + "Fire Immunity" "1" + } + "Electric Ability" + { + "Human Ability" "1" + "Human Ammo" "2" + "Ability Enabled" "1" + "Ability Effect" "7" + "Ability Message" "7" + "Electric Chance" "66.6" + "Electric Damage" "5.0" + "Electric Duration" "5" + "Electric Hit" "1" + "Electric Hit Mode" "0" + "Electric Interval" "1.0" + "Electric Range" "150.0" + "Electric Range Chance" "30.0" + } + "Lightning Ability" + { + "Ability Enabled" "1" + "Ability Message" "1" + "Lightning Chance" "100.0" + "Lightning Damage" "5" + "Lightning Duration" "99999" + "Lightning Interval" "0.5" + } + "Smash Ability" + { + "Ability Effect" "7" + "Ability Message" "1" + "Smash Body" "1" + "Smash Chance" "15.0" + "Smash Hit" "1" + "Smash Hit Mode" "1" + "Smash Mode" "4" + "Smash Type" "1" + "Special" + { + "Smash Body" "0" + "Smash Meter" "50.0" + } + } + "Warp Ability" + { + "Ability Enabled" "2" + "Ability Message" "4" + "Warp Interval" "7.5" + } + } + "Tank #136" + { + "General" + { + "Tank Name" "Trajectory Tank" + "Special" + { + "Special Types" "-1" + "Special Note" "-1" + "Boomer Name" "Trajectory Boomer" + "Charger Name" "Trajectory Charger" + "Hunter Name" "Trajectory Hunter" + "Jockey Name" "Trajectory Jockey" + "Smoker Name" "Trajectory Smoker" + "Spitter Name" "Trajectory Spitter" + } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Trajectory Common" + "Witch Name" "Trajectory Witch" + } + "Tank Enabled" "-1" + "Tank Chance" "100.0" + "Tank Note" "1" + "Skin Color" "255,150,75,255" + } + "Glow" + { + "Glow Enabled" "1" + "Glow Color" "55,150,125" + } + "Human Support" + { + "Human Support" "1" + } + "Props" + { + "Light Color" "55,150,125,255" + "Oxygen Tank Color" "55,150,125,255" + "Flame Color" "55,150,125,180" + "Rock Color" "55,150,125,255" + "Tire Color" "55,150,125,255" + "Propane Tank Color" "55,150,125,255" + "Flashlight Color" "55,150,125,255" + "Crown Color" "55,150,125,255" + } + "Health" + { + "Extra Health" "1000" + "Special" + { + "Boomer Extra Health" "100" + "Charger Extra Health" "100" + "Hunter Extra Health" "100" + "Jockey Extra Health" "100" + "Smoker Extra Health" "100" + "Spitter Extra Health" "100" + } + } + "Fast Ability" + { + "Human Ability" "1" + "Human Ammo" "2" + "Human Duration" "99999" + "Ability Enabled" "1" + "Ability Message" "1" + "Fast Chance" "100.0" + "Fast Duration" "99999" + "Fast Speed" "5.0" + } + "Jump Ability" + { + "Human Ability" "1" + "Human Ammo" "2" + "Human Duration" "5" + "Ability Enabled" "3" + "Ability Effect" "7" + "Ability Message" "7" + "Jump Chance" "33.3" + "Jump Duration" "5" + "Jump Height" "300.0" + "Jump Hit" "1" + "Jump Hit Mode" "0" + "Jump Mode" "1" + "Jump Range" "150.0" + "Jump Range Chance" "15.0" + "Jump Sporadic Chance" "33.3" + "Jump Sporadic Height" "750.0" + } + "Warp Ability" + { + "Human Ability" "1" + "Human Ammo" "2" + "Human Duration" "10" + "Ability Enabled" "2" + "Ability Message" "4" + "Warp Duration" "0" + "Warp Interval" "7.5" + } + } + "Tank #137" + { + "General" + { + "Tank Name" "Barrage Tank" + "Special" + { + "Special Types" "-1" + "Special Note" "-1" + "Boomer Name" "Barrage Boomer" + "Charger Name" "Barrage Charger" + "Hunter Name" "Barrage Hunter" + "Jockey Name" "Barrage Jockey" + "Smoker Name" "Barrage Smoker" + "Spitter Name" "Barrage Spitter" + } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Barrage Common" + "Witch Name" "Barrage Witch" + } + "Tank Enabled" "-1" + "Tank Chance" "100.0" + "Tank Note" "1" + "Skin Color" "150,80,125,255" + } + "Glow" + { + "Glow Enabled" "1" + "Glow Color" "40,80,165" + } + "Human Support" + { + "Human Support" "1" + } + "Spawn" + { + "Open Areas Only" "500.0" + } + "Props" + { + "Light Color" "40,80,165,255" + "Oxygen Tank Color" "40,80,165,255" + "Flame Color" "40,80,165,180" + "Rock Color" "40,80,165,255" + "Tire Color" "40,80,165,255" + "Propane Tank Color" "40,80,165,255" + "Flashlight Color" "40,80,165,255" + "Crown Color" "40,80,165,255" + } + "Health" + { + "Extra Health" "1000" + "Special" + { + "Boomer Extra Health" "100" + "Charger Extra Health" "100" + "Hunter Extra Health" "100" + "Jockey Extra Health" "100" + "Smoker Extra Health" "100" + "Spitter Extra Health" "100" + } + } + "Meteor Ability" + { + "Human Ability" "1" + "Human Ammo" "1" + "Human Cooldown" "0" + "Ability Enabled" "1" + "Ability Message" "1" + "Meteor Chance" "100.0" + "Meteor Duration" "99999" + "Meteor Interval" "0.6" + "Meteor Lifetime" "15.0" + "Meteor Mode" "1" + "Meteor Radius" "-180.0,180.0" + } + "Regen Ability" + { + "Human Ability" "1" + "Human Ammo" "2" + "Human Duration" "99999" + "Ability Enabled" "1" + "Ability Effect" "4" + "Ability Message" "1" + "Regen Chance" "100.0" + "Regen Duration" "0" + "Regen Health" "200" + "Regen Interval" "1.0" + "Regen Limit" "4000" + "Regen Range" "500.0" + "Special" + { + "Regen Health" "20" + "Regen Limit" "400" + "Regen Range" "150.0" + } + } + "Rock Ability" + { + "Requires Humans" "0" + "Human Ability" "1" + "Human Ammo" "2" + "Human Duration" "99999" + "Ability Enabled" "1" + "Ability Message" "1" + "Rock Chance" "100.0" + "Rock Damage" "5" + "Rock Duration" "99999" + "Rock Interval" "0.75" + "Rock Mode" "0" + "Rock Radius" "-5.0,5.0" + } + "Shove Ability" + { + "Ability Effect" "7" + "Ability Message" "1" + "Shove Chance" "66.6" + "Shove Duration" "5" + "Shove Hit" "1" + "Shove Hit Mode" "1" + "Shove Interval" "1.0" + } + } + "Tank #138" + { + "General" + { + "Tank Name" "Collector Tank" + "Special" + { + "Special Types" "-1" + "Special Note" "-1" + "Boomer Name" "Collector Boomer" + "Charger Name" "Collector Charger" + "Hunter Name" "Collector Hunter" + "Jockey Name" "Collector Jockey" + "Smoker Name" "Collector Smoker" + "Spitter Name" "Collector Spitter" + } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Collector Common" + "Witch Name" "Collector Witch" + } + "Tank Enabled" "-1" + "Tank Chance" "100.0" + "Tank Note" "1" + "Skin Color" "255,70,165,255" + } + "Glow" + { + "Glow Enabled" "1" + "Glow Color" "255,70,165" + } + "Human Support" + { + "Human Support" "1" + } + "Spawn" + { + "Open Areas Only" "500.0" + } + "Props" + { + "Props Attached" "0" + } + "Health" + { + "Extra Health" "1000" + "Special" + { + "Boomer Extra Health" "100" + "Charger Extra Health" "100" + "Hunter Extra Health" "100" + "Jockey Extra Health" "100" + "Smoker Extra Health" "100" + "Spitter Extra Health" "100" + } + } + "Choke Ability" + { + "Ability Effect" "7" + "Ability Message" "1" + "Choke Block" "1" + "Choke Chance" "100.0" + "Choke Damage" "1.0" + "Choke Delay" "1.0" + "Choke Duration" "99999" + "Choke Hit" "1" + "Choke Hit Mode" "1" + } + "Gravity Ability" + { + "Ability Enabled" "2" + "Ability Message" "4" + "Gravity Flags" "8" + "Gravity Force" "-50.0" + } + } + "Tank #139" + { + "General" + { + "Tank Name" "Timewalker Tank" + "Special" + { + "Special Types" "-1" + "Special Note" "-1" + "Boomer Name" "Timewalker Boomer" + "Charger Name" "Timewalker Charger" + "Hunter Name" "Timewalker Hunter" + "Jockey Name" "Timewalker Jockey" + "Smoker Name" "Timewalker Smoker" + "Spitter Name" "Timewalker Spitter" + } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Timewalker Common" + "Witch Name" "Timewalker Witch" + } + "Tank Enabled" "-1" + "Tank Chance" "100.0" + "Tank Note" "1" + "Skin Color" "0,200,255,255" + } + "Glow" + { + "Glow Enabled" "1" + "Glow Color" "0,200,255" + } + "Human Support" + { + "Human Support" "1" + } + "Props" + { + "Props Attached" "0" + } + "Health" + { + "Extra Health" "1000" + "Special" + { + "Boomer Extra Health" "100" + "Charger Extra Health" "100" + "Hunter Extra Health" "100" + "Jockey Extra Health" "100" + "Smoker Extra Health" "100" + "Spitter Extra Health" "100" + } + } + "Clone Ability" + { + "Human Ability" "1" + "Human Ammo" "2" + "Ability Enabled" "1" + "Ability Message" "1" + "Clone Amount" "2" + "Clone Chance" "100.0" + "Clone Health" "1000" + "Clone Lifetime" "10.0" + "Clone Remove" "0" + "Clone Replace" "1" + "Clone Swap" "5.0" + "Clone Type" "139-139" + "Special" + { + "Clone Health" "100" + } + } + "Fast Ability" + { + "Human Ability" "1" + "Human Ammo" "2" + "Human Duration" "3" + "Ability Enabled" "1" + "Ability Message" "1" + "Fast Chance" "33.3" + "Fast Duration" "3" + "Fast Speed" "10.0" + } + "Ghost Ability" + { + "Ability Effect" "7" + "Ability Message" "1" + "Ghost Chance" "15.0" + "Ghost Hit" "1" + "Ghost Hit Mode" "0" + "Ghost Weapon Slots" "28" + } + "Recall Ability" + { + "Human Ability" "1" + "Human Ammo" "5" + "Ability Enabled" "3" + "Ability Message" "1" + "Recall Blink Chance" "0.0" + "Recall Blink Count" "0" + "Recall Rewind Chance" "100.0" + "Recall Rewind Cleanse" "1" + "Recall Rewind Cooldown" "5" + "Recall Rewind Lifetime" "10" + "Recall Rewind Mode" "0" + "Recall Rewind Threshold" "1.0" + } + "Undead Ability" + { + "Human Ability" "1" + "Human Ammo" "2" + "Ability Enabled" "1" + "Ability Message" "1" + "Undead Amount" "2" + "Undead Chance" "100.0" + } + "Warp Ability" + { + "Ability Enabled" "2" + "Ability Message" "4" + "Warp Interval" "10.0" + } + } + "Tank #140" + { + "General" + { + "Tank Name" "Speed Demon Tank" + "Special" + { + "Special Types" "-1" + "Special Note" "-1" + "Boomer Name" "Speed Demon Boomer" + "Charger Name" "Speed Demon Charger" + "Hunter Name" "Speed Demon Hunter" + "Jockey Name" "Speed Demon Jockey" + "Smoker Name" "Speed Demon Smoker" + "Spitter Name" "Speed Demon Spitter" + } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Speed Demon Common" + "Witch Name" "Speed Demon Witch" + } + "Tank Enabled" "-1" + "Tank Chance" "100.0" + "Tank Note" "1" + "Skin Color" "100,0,0,255" + } + "Glow" + { + "Glow Enabled" "1" + "Glow Color" "255,200,60" + } + "Human Support" + { + "Human Support" "1" + } + "Props" + { + "Light Color" "255,200,60,255" + "Oxygen Tank Color" "255,200,60,255" + "Flame Color" "255,200,60,180" + "Rock Color" "255,200,60,255" + "Tire Color" "255,200,60,255" + "Propane Tank Color" "255,200,60,255" + "Flashlight Color" "255,200,60,255" + "Crown Color" "255,200,60,255" + } + "Particles" + { + "Body Effects" "4" + "Rock Effects" "4" + } + "Health" + { + "Extra Health" "1000" + "Special" + { + "Boomer Extra Health" "100" + "Charger Extra Health" "100" + "Hunter Extra Health" "100" + "Jockey Extra Health" "100" + "Smoker Extra Health" "100" + "Spitter Extra Health" "100" + } + } + "Enhancements" + { + "Run Speed" "1.0" + } + "Fast Ability" + { + "Human Ability" "1" + "Human Ammo" "2" + "Human Duration" "3" + "Ability Enabled" "1" + "Ability Message" "1" + "Fast Chance" "33.3" + "Fast Duration" "3" + "Fast Speed" "10.0" + } + "Fire Ability" + { + "Ability Effect" "7" + "Ability Message" "1" + "Fire Chance" "100.0" + "Fire Cooldown" "3" + "Fire Damage" "0.5" + "Fire Hit" "1" + "Fire Hit Mode" "0" + "Special" + { + "Fire Cooldown" "3" + "Fire Damage" "0.25" + } + } + "Pyro Ability" + { + "Human Ability" "1" + "Human Ammo" "2" + "Human Duration" "3" + "Ability Enabled" "1" + "Ability Message" "1" + "Pyro Chance" "33.3" + "Pyro Damage Boost" "2.0" + "Pyro Duration" "3" + "Pyro Fire Divisor" "1.0" + "Pyro Mode" "0" + "Pyro Reignite" "1" + "Pyro Speed Boost" "9.0" + "Special" + { + "Pyro Fire Divisor" "400.0" + } + } + "Slow Ability" + { + "Ability Enabled" "1" + "Ability Effect" "7" + "Ability Message" "2" + "Slow Chance" "100.0" + "Slow Duration" "99999.0" + "Slow Range" "500.0" + "Slow Range Chance" "100.0" + "Slow Speed" "0.65" + } + } + "Tank #141" + { + "General" + { + "Tank Name" "Ravager Tank" + "Special" + { + "Special Types" "-1" + "Special Note" "-1" + "Boomer Name" "Ravager Boomer" + "Charger Name" "Ravager Charger" + "Hunter Name" "Ravager Hunter" + "Jockey Name" "Ravager Jockey" + "Smoker Name" "Ravager Smoker" + "Spitter Name" "Ravager Spitter" + } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Ravager Common" + "Witch Name" "Ravager Witch" + } + "Tank Enabled" "-1" + "Tank Chance" "100.0" + "Tank Note" "1" + "Skin Color" "240,20,60,255" + } + "Glow" + { + "Glow Enabled" "1" + "Glow Color" "75,100,90" + } + "Human Support" + { + "Human Support" "1" + } + "Spawn" + { + "Open Areas Only" "500.0" + } + "Props" + { + "Light Color" "75,100,90,255" + "Oxygen Tank Color" "75,100,90,255" + "Flame Color" "75,100,90,180" + "Rock Color" "75,100,90,255" + "Tire Color" "75,100,90,255" + "Propane Tank Color" "75,100,90,255" + "Flashlight Color" "75,100,90,255" + "Crown Color" "75,100,90,255" + } + "Health" + { + "Extra Health" "1000" + "Special" + { + "Boomer Extra Health" "100" + "Charger Extra Health" "100" + "Hunter Extra Health" "100" + "Jockey Extra Health" "100" + "Smoker Extra Health" "100" + "Spitter Extra Health" "100" + } + } + "Bomb Ability" + { + "Human Ability" "1" + "Ability Message" "4" + "Bomb Rock Break" "1" + "Bomb Rock Chance" "100.0" + } + "Rock Ability" + { + "Requires Humans" "0" + "Human Ability" "1" + "Human Ammo" "2" + "Human Duration" "99999" + "Ability Enabled" "1" + "Ability Message" "1" + "Rock Chance" "100.0" + "Rock Damage" "5" + "Rock Duration" "99999" + "Rock Interval" "1.5" + "Rock Mode" "0" + "Rock Radius" "-5.0,5.0" + } + } + "Tank #142" + { + "General" + { + "Tank Name" "Ramattra Tank" + "Special" + { + "Special Types" "-1" + "Special Note" "-1" + "Boomer Name" "Ramattra Boomer" + "Charger Name" "Ramattra Charger" + "Hunter Name" "Ramattra Hunter" + "Jockey Name" "Ramattra Jockey" + "Smoker Name" "Ramattra Smoker" + "Spitter Name" "Ramattra Spitter" + } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Ramattra Common" + "Witch Name" "Ramattra Witch" + } + "Tank Enabled" "-1" + "Tank Chance" "100.0" + "Tank Note" "1" + "Skin Color" "35,35,35,255" + } + "Glow" + { + "Glow Enabled" "1" + "Glow Color" "160,80,255" + } + "Human Support" + { + "Human Support" "1" + } + "Props" + { + "Props Attached" "380" + "Light Color" "160,80,255,255" + "Oxygen Tank Color" "185,180,135,255" + "Flame Color" "160,80,255,180" + "Rock Color" "185,180,135,255" + "Tire Color" "185,180,135,255" + "Propane Tank Color" "255,255,255,255" + "Flashlight Color" "160,80,255,255" + "Crown Color" "160,80,255,255" + } + "Health" + { + "Extra Health" "1000" + "Special" + { + "Boomer Extra Health" "100" + "Charger Extra Health" "100" + "Hunter Extra Health" "100" + "Jockey Extra Health" "100" + "Smoker Extra Health" "100" + "Spitter Extra Health" "100" + } + } + "Absorb Ability" + { + "Requires Humans" "0" + "Human Ability" "1" + "Human Ammo" "2" + "Human Duration" "5" + "Ability Enabled" "1" + "Ability Message" "1" + "Absorb Bullet Divisor" "20.0" + "Absorb Chance" "15.0" + "Absorb Convert Percentage" "0.0" + "Absorb Duration" "10" + "Absorb Explosive Divisor" "20.0" + "Absorb Fire Divisor" "200.0" + "Absorb Hittable Divisor" "20.0" + "Absorb Melee Divisor" "200.0" + } + "Regen Ability" + { + "Human Ability" "1" + "Human Ammo" "2" + "Human Duration" "5" + "Ability Enabled" "1" + "Ability Effect" "4" + "Ability Message" "1" + "Ability Sight" "1" + "Regen Chance" "100.0" + "Regen Duration" "0" + "Regen Health" "1" + "Regen Interval" "1.0" + "Regen Limit" "1000000" + "Regen Range" "500.0" + "Special" + { + "Regen Limit" "100000" + "Regen Range" "150.0" + } + } + "Shield Ability" + { + "Requires Humans" "0" + "Human Ability" "1" + "Ability Enabled" "1" + "Ability Message" "1" + "Shield Chance" "15.0" + "Shield Convert Percentage" "0.2" + "Shield Color" "160,80,255,50" + "Shield Delay" "10" + "Shield Display Health" "11" + "Shield Display Health Type" "2" + "Shield Duration" "0" + "Shield Health" "250.0" + "Shield Health Characters" "],=" + "Shield Type" "15" + "Special" + { + "Shield Health" "100.0" + } + } + "Slow Ability" + { + "Ability Enabled" "1" + "Ability Effect" "7" + "Ability Message" "2" + "Ability Sight" "1" + "Slow Chance" "100.0" + "Slow Duration" "99999.0" + "Slow Range" "500.0" + "Slow Range Chance" "100.0" + "Slow Speed" "0.4" + } + } + "Tank #143" + { + "General" + { + "Tank Name" "Sigma Tank" + "Special" + { + "Special Types" "-1" + "Special Note" "-1" + "Boomer Name" "Sigma Boomer" + "Charger Name" "Sigma Charger" + "Hunter Name" "Sigma Hunter" + "Jockey Name" "Sigma Jockey" + "Smoker Name" "Sigma Smoker" + "Spitter Name" "Sigma Spitter" + } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Sigma Common" + "Witch Name" "Sigma Witch" + } + "Tank Enabled" "-1" + "Tank Chance" "100.0" + "Tank Note" "1" + "Skin Color" "80,80,80,255" + } + "Glow" + { + "Glow Enabled" "1" + "Glow Color" "130,130,180" + } + "Human Support" + { + "Human Support" "1" + } + "Props" + { + "Props Attached" "124" + "Light Color" "130,130,180,255" + "Oxygen Tank Color" "65,200,170,255" + "Flame Color" "130,130,180,180" + "Rock Color" "65,200,170,255" + "Tire Color" "65,200,170,255" + "Propane Tank Color" "60,0,110,255" + "Flashlight Color" "130,130,180,255" + "Crown Color" "130,130,180,255" + } + "Health" + { + "Extra Health" "1000" + "Special" + { + "Boomer Extra Health" "100" + "Charger Extra Health" "100" + "Hunter Extra Health" "100" + "Jockey Extra Health" "100" + "Smoker Extra Health" "100" + "Spitter Extra Health" "100" + } + } + "Absorb Ability" + { + "Requires Humans" "0" + "Human Ability" "1" + "Human Ammo" "2" + "Human Duration" "5" + "Ability Enabled" "1" + "Ability Message" "1" + "Absorb Bullet Divisor" "20.0" + "Absorb Chance" "15.0" + "Absorb Convert Percentage" "0.75" + "Absorb Duration" "10" + "Absorb Explosive Divisor" "20.0" + "Absorb Fire Divisor" "200.0" + "Absorb Hittable Divisor" "20.0" + "Absorb Melee Divisor" "200.0" + } + "Choke Ability" + { + "Human Ability" "1" + "Human Ammo" "2" + "Ability Enabled" "1" + "Ability Effect" "7" + "Ability Message" "3" + "Ability Sight" "1" + "Choke Block" "0" + "Choke Chance" "33.3" + "Choke Damage" "10.0" + "Choke Delay" "0.5" + "Choke Duration" "3" + "Choke Hit" "1" + "Choke Hit Mode" "0" + "Choke Range" "150.0" + "Choke Range Chance" "15.0" + } + "Gravity Ability" + { + "Human Ability" "1" + "Ability Enabled" "2" + "Ability Message" "4" + "Gravity Flags" "8" + "Gravity Force" "-25.0" + } + "Shield Ability" + { + "Requires Humans" "0" + "Human Ability" "1" + "Ability Enabled" "1" + "Ability Message" "1" + "Shield Chance" "15.0" + "Shield Convert Percentage" "0.15" + "Shield Color" "130,130,180,50" + "Shield Delay" "10" + "Shield Display Health" "11" + "Shield Display Health Type" "2" + "Shield Duration" "0" + "Shield Health" "700.0" + "Shield Health Characters" "],=" + "Shield Type" "15" + "Special" + { + "Shield Health" "70.0" + } + } + } + "Tank #144" + { + "General" + { + "Tank Name" "Zarya Tank" + "Special" + { + "Special Types" "-1" + "Special Note" "-1" + "Boomer Name" "Zarya Boomer" + "Charger Name" "Zarya Charger" + "Hunter Name" "Zarya Hunter" + "Jockey Name" "Zarya Jockey" + "Smoker Name" "Zarya Smoker" + "Spitter Name" "Zarya Spitter" + } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Zarya Common" + "Witch Name" "Zarya Witch" + } + "Tank Enabled" "-1" + "Tank Chance" "100.0" + "Tank Note" "1" + "Skin Color" "55,110,255,255" + } + "Glow" + { + "Glow Enabled" "1" + "Glow Color" "255,130,255" + } + "Human Support" + { + "Human Support" "1" + } + "Props" + { + "Props Attached" "0" + } + "Health" + { + "Extra Health" "1000" + "Special" + { + "Boomer Extra Health" "100" + "Charger Extra Health" "100" + "Hunter Extra Health" "100" + "Jockey Extra Health" "100" + "Smoker Extra Health" "100" + "Spitter Extra Health" "100" + } + } + "Enhancements" + { + "Run Speed" "0.65" + } + "Absorb Ability" + { + "Requires Humans" "0" + "Human Ability" "1" + "Human Ammo" "2" + "Human Duration" "5" + "Ability Enabled" "1" + "Ability Message" "1" + "Absorb Bullet Divisor" "20.0" + "Absorb Chance" "15.0" + "Absorb Convert Percentage" "0.75" + "Absorb Duration" "10" + "Absorb Explosive Divisor" "20.0" + "Absorb Fire Divisor" "200.0" + "Absorb Hittable Divisor" "20.0" + "Absorb Melee Divisor" "200.0" + } + "Gravity Ability" + { + "Human Ability" "1" + "Ability Enabled" "2" + "Ability Message" "4" + "Gravity Flags" "8" + "Gravity Force" "-25.0" + } + "Shield Ability" + { + "Requires Humans" "0" + "Human Ability" "1" + "Ability Enabled" "1" + "Ability Message" "1" + "Shield Chance" "15.0" + "Shield Convert Percentage" "0.15" + "Shield Color" "255,130,255,50" + "Shield Delay" "15" + "Shield Display Health" "11" + "Shield Display Health Type" "2" + "Shield Duration" "5" + "Shield Health" "225.0" + "Shield Health Characters" "],=" + "Shield Type" "15" + "Special" + { + "Shield Health" "22.5" + } + } + } + // The following samples are for punishing rushers/slackers. + "Tank #145" + { + "General" + { + "Tank Name" "Slacker Tank" + "Special" + { + "Special Types" "-1" + "Special Note" "-1" + "Boomer Name" "Slacker Boomer" + "Charger Name" "Slacker Charger" + "Hunter Name" "Slacker Hunter" + "Jockey Name" "Slacker Jockey" + "Smoker Name" "Slacker Smoker" + "Spitter Name" "Slacker Spitter" + } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Slacker Common" + "Witch Name" "Slacker Witch" + } + "Tank Enabled" "-1" + "Tank Chance" "100.0" + "Tank Note" "0" + "Skin Color" "100,100,100,255" + "Spawn Enabled" "0" + } + "Announcements" + { + "Announce Arrival" "0" + "Announce Death" "0" + "Announce Kill" "0" + "Arrival Message" "0" + "Arrival Sound" "0" + "Death Details" "0" + "Death Message" "0" + "Death Sound" "0" + "Kill Message" "0" + "Vocalize Arrival" "0" + "Vocalize Death" "0" + } + "Props" + { + "Props Attached" "0" + } + "Health" + { + "Base Health" "1000000" + "Display Health" "0" + "Display Health Type" "0" + "Special" + { + "Boomer Base Health" "100000" + "Charger Base Health" "100000" + "Hunter Base Health" "100000" + "Jockey Base Health" "100000" + "Smoker Base Health" "100000" + "Spitter Base Health" "100000" + } + } + "Enhancements" + { + "Attack Interval" "0.1" + "Intangible Body" "1" + "Punch Throw" "0.0" + "Skip Taunt" "1" + } + "Fast Ability" + { + "Human Ability" "2" + "Human Ammo" "2" + "Human Duration" "99999" + "Ability Enabled" "1" + "Ability Message" "0" + "Fast Chance" "100.0" + "Fast Dash" "5.0" + "Fast Dash Chance" "50.0" + "Fast Dash Range" "150.0" + "Fast Duration" "99999" + "Fast Speed" "10.0" + } + "Gravity Ability" + { + "Ability Enabled" "2" + "Ability Message" "0" + "Gravity Flags" "8" + "Gravity Force" "-100.0" + } + "Warp Ability" + { + "Human Ability" "2" + "Ability Effect" "7" + "Ability Message" "0" + "Warp Chance" "100.0" + "Warp Hit" "1" + "Warp Hit Mode" "1" + } + } + "Tank #146" + { + "General" + { + "Tank Name" "Rusher Tank" + "Special" + { + "Special Types" "-1" + "Special Note" "-1" + "Boomer Name" "Rusher Boomer" + "Charger Name" "Rusher Charger" + "Hunter Name" "Rusher Hunter" + "Jockey Name" "Rusher Jockey" + "Smoker Name" "Rusher Smoker" + "Spitter Name" "Rusher Spitter" + } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Rusher Common" + "Witch Name" "Rusher Witch" + } + "Tank Enabled" "-1" + "Tank Chance" "100.0" + "Tank Note" "0" + "Skin Color" "150,0,0,255" + "Spawn Enabled" "0" + } + "Announcements" + { + "Announce Arrival" "0" + "Announce Death" "0" + "Announce Kill" "0" + "Arrival Message" "0" + "Arrival Sound" "0" + "Death Details" "0" + "Death Message" "0" + "Death Sound" "0" + "Kill Message" "0" + "Vocalize Arrival" "0" + "Vocalize Death" "0" + } + "Props" + { + "Props Attached" "0" + } + "Health" + { + "Base Health" "1000000" + "Display Health" "0" + "Display Health Type" "0" + "Special" + { + "Boomer Base Health" "100000" + "Charger Base Health" "100000" + "Hunter Base Health" "100000" + "Jockey Base Health" "100000" + "Smoker Base Health" "100000" + "Spitter Base Health" "100000" + } + } + "Enhancements" + { + "Attack Interval" "0.1" + "Intangible Body" "1" + "Punch Throw" "0.0" + "Skip Taunt" "1" + } + "Fast Ability" + { + "Human Ability" "2" + "Human Ammo" "2" + "Human Duration" "99999" + "Ability Enabled" "1" + "Ability Message" "0" + "Fast Chance" "100.0" + "Fast Dash" "5.0" + "Fast Dash Chance" "50.0" + "Fast Dash Range" "150.0" + "Fast Duration" "99999" + "Fast Speed" "10.0" + } + "Gravity Ability" + { + "Ability Enabled" "2" + "Ability Message" "0" + "Gravity Flags" "8" + "Gravity Force" "-100.0" + } + "Fire Ability" + { + "Human Ability" "2" + "Ability Effect" "7" + "Ability Message" "0" + "Fire Chance" "100.0" + "Fire Hit" "1" + "Fire Hit Mode" "1" + } + "Ice Ability" + { + "Human Ability" "2" + "Ability Effect" "7" + "Ability Message" "0" + "Ice Chance" "100.0" + "Ice Duration" "5.0" + "Ice Hit" "1" + "Ice Hit Mode" "1" + } + } /** * Create your own Mutant Tanks below! * Start your imagination here! diff --git a/addons/sourcemod/data/mutant_tanks/backup_config/format2/mutant_tanks.cfg b/addons/sourcemod/data/mutant_tanks/backup_config/format2/mutant_tanks.cfg index 4832b77e47..c790533b00 100644 --- a/addons/sourcemod/data/mutant_tanks/backup_config/format2/mutant_tanks.cfg +++ b/addons/sourcemod/data/mutant_tanks/backup_config/format2/mutant_tanks.cfg @@ -21,6 +21,7 @@ MutantTanks { PluginEnabled Yes AutoUpdate On + GraphicsLevel Max BulletFix Max KickBots Min ListenSupport Enabled @@ -38,11 +39,29 @@ MutantTanks CycleTypes Min SpawnEnabled Max SpawnLimit Min - TypeRange 1-128 + TypeRange 1-146 Special { SpecialTypes Min } + Mob + { + MobVariants Min + CommonBioChance 50.0 + CommonChance 100.0 + CommonCheck 300.0 + CommonDamagePoints 50.0 + CommonDeathPoints 100.0 + CommonFilter 0 + CommonGoal 5000.0 + CommonVariant 0 + WitchChance 100.0 + WitchFilter 0 + WitchMode 0 + WitchMutateChance 100.0 + WitchRange 500.0 + WitchTypes 0 + } } Announcements { @@ -64,6 +83,22 @@ MutantTanks AnnounceKill Min } } + Punishment + { + PunishEnabled -1,-1 //145,146 + PunishBots -1,-1 //145,146 + FinaleCheck 0 + PunisherTypes 127,127 + PunisherLifetime 5.0,5.0 + WarningDistance 500.0,1000.0 + PunishDistance 1000.0,2000.0 + WarningLimit 3,3 + WarningInterval 5,5 + SurvivorTypes 1 + SurvivorsRequired 3 + IncapsRequired 2 + ZedTime 1.0,1.0 + } Rewards { RewardEnabled -1,-1,-1,-1 @@ -78,50 +113,69 @@ MutantTanks ShareRewards 0,0,0,0 TeammateLimit 0 ActionDurationReward 2.0,2.0,2.0,2.0 + AdrenalineTimeReward 30.0,30.0,30.0,30.0 AmmoBoostReward 1,1,1,1 + AmmoRefillReward 1,1,1,1 AmmoRegenReward 1,1,1,1 AttackBoostReward 1.25,1.25,1.25,1.25 BlazeHealthReward 1,1,1,1 + BloodDonorReward 0,0,0,0 BunnyHopReward 1,1,1,1 BurstDoorsReward 1,1,1,1 CleanKillsReward 1,1,1,1 ClusterBombsReward 3,3,3,3 DamageBoostReward 1.25,1.25,1.25,1.25 DamageResistanceReward 0.5,0.5,0.5,0.5 + DopamineRadiusReward 150.0,150.0,150.0,150.0 + EternalFlamesReward 1,1,1,1 FallVoicelineReward PlayerLaugh,PlayerLaugh,PlayerLaugh,PlayerLaugh + FastRecoveryReward 1,1,1,1 + FireRateReward 1.25,1.25,1.25,1.25 FriendlyFireReward 1,1,1,1 GhostBulletsReward 1,1,1,1 + GrenadeLauncherReward 10.0,10.0,10.0,10.0 HealPercentReward 100.0,100.0,100.0,100.0 + HealthcareRadiusReward 150.0,150.0,150.0,150.0 HealthRegenReward 1,1,1,1 - HollowpointAmmoReward 1,1,1,1 - InextinguishableFireReward 1,1,1,1 + HeartbeatReward 3.0,3.0,3.0,3.0 + HollowpointAmmoReward 100.0,100.0,100.0,100.0 InfiniteAmmoReward 31,31,31,31 ItemReward first_aid_kit,first_aid_kit,first_aid_kit,first_aid_kit JumpHeightReward 75.0,75.0,75.0,75.0 LadderActionsReward 1,1,1,1 - LadyKillerReward 1,1,1,1 + LadyKillerReward 25.0,25.0,25.0,25.0 LaserSightReward 1,1,1,1 LifeLeechReward 1,1,1,1 + LuckyBulletReward 25.0,25.0,25.0,25.0 MedicalCutsReward 1,1,1,1 MeleeRangeReward 150,150,150,150 MidairDashesReward 2,2,2,2 + MotivationRadiusReward 150.0,150.0,150.0,150.0 + OverdoseRadiusReward 150.0,150.0,150.0,150.0 + OverhealthReward 200,200,200,200 PipebombDurationReward 10.0,10.0,10.0,10.0 PunchResistanceReward 0.25,0.25,0.25,0.25 RapidPistolReward 0.130,0.130,0.130,0.130 RecoilDampenerReward 1,1,1,1 RefillPercentReward 100.0,100.0,100.0,100.0 RegenBurstsReward 1,1,1,1 + ReloadRateReward 1.25,1.25,1.25,1.25 RespawnLoadoutReward 1,1,1,1 ReviveHealthReward 100,100,100,100 + RiotGearReward 1,1,1,1 + SafetyBubbleReward 1,1,1,1 + ShockwaveRadiusReward 150.0,150.0,150.0,150.0 ShoveDamageReward 0.025,0.025,0.025,0.025 ShovePenaltyReward 1,1,1,1 ShoveRateReward 0.7,0.7,0.7,0.7 - SledgehammerRoundsReward 1,1,1,1 + SledgehammerRoundsReward 100.0,100.0,100.0,100.0 SpecialAmmoReward 3,3,3,3 SpeedBoostReward 1.25,1.25,1.25,1.25 StackLimits 0,0,0,0,0,0,0 StackRewards 0,0,0,0 StickyGrenadesReward 1,1,1,1 + SupplierReward 3.0,3.0,3.0,3.0 + SwingRateReward 1.25,1.25,1.25,1.25 SyringeDartsReward 1,1,1,1 ThornsReward 1,1,1,1 UsefulRewards 15,15,15,15 @@ -139,6 +193,533 @@ MutantTanks RewardBots -1,-1,-1,-1 } } + Survivors + { + CarrierEnabled 0 + CarrierBots 0 + CarrierBody 0 + CarrierChance 0.0 + CarrierCleanse 0 + CarrierDamageMultiplier 0.0 + CarrierDelay 0.0 + CarrierFilter 0 + CarrierHealthMultiplier 0.0 + CarrierInfection 0 + CarrierMix 0 + CarrierMode 0 + CarrierTeleport 0 + CarrierType 0 + CarrierVoice 0 + CarrierVoiceChance 0.0 + CarrierVoiceInterval 0.0 + CarrierAttackVoicelines "" + CarrierBaitVoicelines "" + PassiveEnabled -1 + PassiveBots -1 + PassiveNotify 0 + ActionDurationPassive 0.0 + AdrenalineTimePassive 0.0 + AmmoBoostPassive 0 + AmmoRefillPassive 0 + AmmoRegenPassive 0 + AttackBoostPassive 0.0 + BlazeHealthPassive 0 + BloodDonorPassive 0 + BunnyHopPassive 0 + BurstDoorsPassive 0 + CleanKillsPassive 0 + ClusterBombsPassive 0 + DamageBoostPassive 0.0 + DamageResistancePassive 0.0 + DopamineRadiusPassive 0.0 + EternalFlamesPassive 0 + FastRecoveryPassive 0 + FireRatePassive 0.0 + FriendlyFirePassive 0 + GhostBulletsPassive 0 + GrenadeLauncherPassive 0.0 + HealPercentPassive 0.0 + HealthcareRadiusPassive 0.0 + HealthRegenPassive 0 + HeartbeatPassive 0.0 + HollowpointAmmoPassive 0.0 + InfiniteAmmoPassive 0 + ItemPassive "" + JumpHeightPassive 0.0 + LadderActionsPassive 0 + LadyKillerPassive 0.0 + LaserSightPassive 0 + LifeLeechPassive 0 + LuckyBulletPassive 0.0 + MedicalCutsPassive 0 + MeleeRangePassive 0 + MidairDashesPassive 0 + MotivationRadiusPassive 0.0 + OverdoseRadiusPassive 0.0 + OverhealthPassive 0 + PipebombDurationPassive 0.0 + PunchResistancePassive 0.0 + RapidPistolPassive 0.0 + RecoilDampenerPassive 0 + RefillPercentPassive 0.0 + RegenBurstsPassive 0 + ReloadRatePassive 0.0 + RespawnLoadoutPassive 0 + ReviveHealthPassive 0 + RiotGearPassive 0 + SafetyBubblePassive 0 + ShockwaveRadiusPassive 0.0 + ShoveDamagePassive 0.0 + ShovePenaltyPassive 0 + ShoveRatePassive 0.0 + SledgehammerRoundsPassive 0.0 + SpecialAmmoPassive 0 + SpeedBoostPassive 0.0 + StickyGrenadesPassive 0 + SupplierPassive 0.0 + SwingRatePassive 0.0 + SyringeDartsPassive 0 + ThornsPassive 0 + weapon_pistol // Fire faster and no shove fatigue while pistol is being held + { + WeaponIndex 1 + PassiveEnabled -1 //9 + PassiveBots -1 //9 + StackPassives 0 + BloodDonorPassive 2 + RapidPistolPassive 0.130 + ShovePenaltyPassive 1 + SyringeDartsPassive 1 + } + weapon_pistol_magnum // Fire faster and no shove fatigue while magnum pistol is being held + { + WeaponIndex 2 + PassiveEnabled -1 //12 + PassiveBots -1 //12 + StackPassives 0 + GhostBulletsPassive 1 + HollowpointAmmoPassive 100.0 + RapidPistolPassive 0.130 + ShovePenaltyPassive 1 + SledgehammerRoundsPassive 0.5 + } + weapon_smg // Shoot grenades and perform ladder actions while uzi is being held + { + WeaponIndex 3 + PassiveEnabled -1 //26 + PassiveBots -1 //26 + StackPassives 0 + GrenadeLauncherPassive 25.0 + LadderActionsPassive 1 + MidairDashesPassive 1 + } + weapon_smg_silenced // Shoot grenades and perform ladder actions while silenced uzi is being held + { + WeaponIndex 4 + PassiveEnabled -1 //26 + PassiveBots -1 //26 + StackPassives 0 + GrenadeLauncherPassive 25.0 + LadderActionsPassive 1 + JumpHeightPassive 65.0 + } + weapon_smg_mp5 // Shoot grenades and perform ladder actions while mp5 uzi is being held + { + WeaponIndex 5 + PassiveEnabled -1 //26 + PassiveBots -1 //26 + StackPassives 0 + GrenadeLauncherPassive 25.0 + LadderActionsPassive 1 + SpeedBoostPassive 1.125 + } + weapon_rifle // Remove recoil and deal more damage while m16 rifle is being held + { + WeaponIndex 6 + PassiveEnabled -1 //20 + PassiveBots -1 //20 + StackPassives 0 + DamageBoostPassive 1.2 + GrenadeLauncherPassive 25.0 + RecoilDampenerPassive 1 + } + weapon_rifle_ak47 // Remove recoil and deal more damage while ak47 rifle is being held + { + WeaponIndex 7 + PassiveEnabled -1 //4 + PassiveBots -1 //4 + StackPassives 0 + DamageBoostPassive 1.1 + LaserSightPassive 1 + RecoilDampenerPassive 1 + } + weapon_rifle_desert // Remove recoil and deal more damage while scar-l rifle is being held + { + WeaponIndex 8 + PassiveEnabled -1 //20 + PassiveBots -1 //20 + StackPassives 0 + DamageBoostPassive 1.125 + RecoilDampenerPassive 1 + SpecialAmmoPassive 3 + } + weapon_rifle_sg552 // Remove recoil and deal more damage while sg552 rifle is being held + { + WeaponIndex 9 + PassiveEnabled -1 //20 + PassiveBots -1 //20 + StackPassives 0 + DamageBoostPassive 1.15 + LuckyBulletPassive 33.3 + RecoilDampenerPassive 1 + } + weapon_pumpshotgun // Reload faster and knock back zombies while pump shotgun is being held + { + WeaponIndex 10 + PassiveEnabled -1 //12 + PassiveBots -1 //12 + StackPassives 0 + ReloadRatePassive 1.6 + ShovePenaltyPassive 1 + SledgehammerRoundsPassive 1.0 + } + weapon_shotgun_chrome // Reload faster and knock back zombies while chrome shotgun is being held + { + WeaponIndex 11 + PassiveEnabled -1 //12 + PassiveBots -1 //12 + StackPassives 0 + ReloadRatePassive 1.6 + ShoveDamagePassive 0.025 + SledgehammerRoundsPassive 1.0 + } + weapon_autoshotgun // Reload faster and knock back zombies while auto shotgun is being held + { + WeaponIndex 12 + PassiveEnabled -1 //28 + PassiveBots -1 //28 + StackPassives 0 + GrenadeLauncherPassive 10.0 + ReloadRatePassive 1.6 + SledgehammerRoundsPassive 1.0 + } + weapon_shotgun_spas // Reload faster and knock back zombies while spas shotgun is being held + { + WeaponIndex 13 + PassiveEnabled -1 //12 + PassiveBots -1 //12 + StackPassives 0 + LadyKillerPassive 50.0 + ReloadRatePassive 1.6 + SledgehammerRoundsPassive 1.0 + } + weapon_hunting_rifle // Shoot through walls and shoot stronger bullets while hunting rifle is being held + { + WeaponIndex 14 + PassiveEnabled -1 //20 + PassiveBots -1 //20 + StackPassives 0 + GhostBulletsPassive 1 + GrenadeLauncherPassive 10.0 + HollowpointAmmoPassive 100.0 + } + weapon_sniper_military // Shoot through walls and shoot stronger bullets while military rifle is being held + { + WeaponIndex 15 + PassiveEnabled -1 //68 + PassiveBots -1 //68 + StackPassives 0 + CleanKillsPassive 1 + GhostBulletsPassive 1 + HollowpointAmmoPassive 100.0 + } + weapon_sniper_awp // Shoot through walls and shoot stronger bullets while awp rifle is being held + { + WeaponIndex 16 + PassiveEnabled -1 //4 + PassiveBots -1 //4 + StackPassives 0 + DamageBoostPassive 2.0 + GhostBulletsPassive 1 + HollowpointAmmoPassive 100.0 + } + weapon_sniper_scout // Shoot through walls and shoot stronger bullets while steyr scout rifle is being held + { + WeaponIndex 17 + PassiveEnabled -1 //12 + PassiveBots -1 //12 + StackPassives 0 + GhostBulletsPassive 1 + HollowpointAmmoPassive 100.0 + ReloadRatePassive 1.3 + } + weapon_rifle_m60 // Refill nearby teammates' ammo periodically while dealing damage with the m60 rifle + { + WeaponIndex 18 + PassiveEnabled -1 //16 + PassiveBots -1 //16 + StackPassives 0 + SupplierPassive 3.0 + } + weapon_grenade_launcher // Heal teammates with explosions while grenade launcher is being held + { + WeaponIndex 19 + PassiveEnabled -1 //1 + PassiveBots -1 //1 + StackPassives 0 + BloodDonorPassive 4 + RegenBurstsPassive 2 + } + weapon_first_aid_kit // Take less damage while the medkit is being held and trigger a healing AoE when used + { + WeaponIndex 20 + PassiveEnabled -1 //5 + PassiveBots -1 //5 + StackPassives 0 + DamageResistancePassive 0.95 + HealthcareRadiusPassive 250.0 + } + weapon_defibrillator // Take less damage while the defibrillator is being held and trigger a revive AoE when used + { + WeaponIndex 21 + PassiveEnabled -1 //5 + PassiveBots -1 //5 + StackPassives 0 + DamageResistancePassive 0.95 + ShockwaveRadiusPassive 1000.0 + } + weapon_pain_pills // Take less damage while the pain pills bottle is being held and trigger a healing AoE when used + { + WeaponIndex 22 + PassiveEnabled -1 //5 + PassiveBots -1 //5 + StackPassives 0 + DamageResistancePassive 0.95 + OverdoseRadiusPassive 250.0 + } + weapon_adrenaline // Take less damage while the adrenaline shot is being held and trigger an energy boost AoE when used + { + WeaponIndex 23 + PassiveEnabled -1 //5 + PassiveBots -1 //5 + StackPassives 0 + DamageResistancePassive 0.95 + DopamineRadiusPassive 250.0 + } + weapon_melee // Auto-bhop while knife is being held + { + WeaponIndex 24 + WeaponName knife + PassiveEnabled -1 //2 + PassiveBots -1 //2 + StackPassives 0 + BunnyHopPassive 1 + } + weapon_melee // Berserker blunt weapons - High damage, low uptime, revive radius, damage resistance, and heal nearby teammates periodically while dealing damage + { + WeaponIndex 25 + WeaponName baseball_bat,cricket_bat,tonfa,shovel,electric_guitar,frying_pan,golfclub + PassiveEnabled -1 //15 + PassiveBots -1 //15 + StackPassives 0 + DamageBoostPassive 1.45 + DamageResistancePassive 0.9 + HeartbeatPassive 3.0 + MeleeRangePassive 100 + MotivationRadiusPassive 250.0 + SpeedBoostPassive 0.875 + SwingRatePassive 0.65 + } + weapon_melee // Berserker sharp weapons - Low damage, high uptime, revive radius, leech health from zombies, and heal teammates by damaging them + { + WeaponIndex 26 + WeaponName crowbar,machete,katana,knife,fireaxe,pitchfork + PassiveEnabled -1 //15 + PassiveBots -1 //15 + StackPassives 0 + DamageBoostPassive 0.65 + LifeLeechPassive 1 + MedicalCutsPassive 2 + MeleeRangePassive 100 + MotivationRadiusPassive 250.0 + SwingRatePassive 1.45 + SpeedBoostPassive 1.125 + } + Bill // General - Medium-high survivability, high mobility, medium-low damage, high uptime + { + CarrierFilter 2 + CarrierAttackVoicelines "namvet/laughter04.wav,namvet/laughter11.wav,namvet/cough06.wav,namvet/doubledeathresponse01.wav,namvet/doubledeathresponse02.wav,namvet/help11.wav,namvet/friendlyfire04.wav" + CarrierBaitVoicelines "namvet/callforrescue01.wav,namvet/callforrescue05.wav,namvet/callforrescue10.wav" + PassiveEnabled -1 //31 + PassiveBots -1 //31 + PassiveNotify 0 + BloodDonorPassive 1 + BunnyHopPassive 1 + DamageBoostPassive 0.95 + DamageResistancePassive 0.95 + EternalFlamesPassive 1 + LadderActionsPassive 1 + OverhealthPassive 110 + PipebombDurationPassive 6.5 + RapidPistolPassive 0.130 + RecoilDampenerPassive 1 + ReviveHealthPassive 50 + SpecialAmmoPassive 0 + SpeedBoostPassive 1.1 + } + Zoey // Damage - Medium-low survivability, medium mobility, medium-high damage, medium uptime + { + CarrierFilter 20 + CarrierAttackVoicelines "teengirl/laughter02.wav,teengirl/laughter06.wav,teengirl/hurtminor01.wav,teengirl/help04.wav" + CarrierBaitVoicelines "teengirl/callforrescue01.wav,teengirl/callforrescue02.wav,teengirl/callforrescue06.wav,teengirl/callforrescue07.wav,teengirl/callforrescue14.wav,teengirl/callforrescue16.wav" + PassiveEnabled -1 //7 + PassiveBots -1 //7 + PassiveNotify 0 + BloodDonorPassive 1 + DamageBoostPassive 1.25 + DamageResistancePassive 1.15 + GhostBulletsPassive 1 + HealPercentPassive 75.0 + HollowpointAmmoPassive 100.0 + OverhealthPassive 115 + ReviveHealthPassive 40 + SpeedBoostPassive 1.1 + } + Francis // Tank - Medium-high survivability, low mobility, medium-low damage, low uptime + { + CarrierFilter 65 + CarrierAttackVoicelines "biker/goingtodie03.wav,biker/goingtodie12.wav,biker/goingtodieaskforheal02.wav,biker/grabbedbysmoker03.wav,biker/help04.wav,biker/laughter04.wav,biker/laughter12.wav" + CarrierBaitVoicelines "biker/callforrescue02.wav,biker/callforrescue06.wav,biker/callforrescue08.wav" + PassiveEnabled -1 //271 + PassiveBots -1 //271 + PassiveNotify 0 + BloodDonorPassive 2 + BurstDoorsPassive 0 + DamageBoostPassive 0.75 + DamageResistancePassive 0.7 + FastRecoveryPassive 1 + JumpHeightPassive 70.0 + LadyKillerPassive 25.0 + MeleeRangePassive 125 + OverhealthPassive 130 + PunchResistancePassive 0.7 + ReviveHealthPassive 70 + RiotGearPassive 0 + ShoveDamagePassive 0.0 + ShovePenaltyPassive 1 + SpeedBoostPassive 0.95 + } + Louis // Support - Low survivability, medium mobility, medium-low damage, high uptime + { + CarrierFilter 8 + CarrierAttackVoicelines "manager/choke01.wav,manager/cough03.wav,manager/deathscream02.wav,manager/friendlyfire03.wav,manager/friendlyfire06.wav,manager/help05.wav,manager/laughter04.wav,manager/laughter20.wav" + CarrierBaitVoicelines "manager/callforrescue01.wav,manager/callforrescue03.wav" + PassiveEnabled -1 //31 + PassiveBots -1 //31 + PassiveNotify 0 + BloodDonorPassive 2 + DamageBoostPassive 0.85 + DamageResistancePassive 1.4 + HealPercentPassive 80.0 + HealthRegenPassive 1 + JumpHeightPassive 70.0 + MedicalCutsPassive 2 + MidairDashesPassive 0 + OverdoseRadiusPassive 250.0 + OverhealthPassive 110 + ReviveHealthPassive 60 + ShockwaveRadiusPassive 0.0 + SpeedBoostPassive 1.1 + SyringeDartsPassive 0 + } + Nick // General - Medium-low survivability, high mobility, medium-high damage, high uptime + { + CarrierFilter 2 + CarrierAttackVoicelines "gambler/battlecry04.wav,gambler/choke01.wav,gambler/choke04.wav,gambler/choke05.wav,gambler/cough01.wav,gambler/defibrillator13.wav,gambler/friendlyfire02.wav,gambler/laughter01.wav" + CarrierBaitVoicelines "gambler/callforrescue02.wav,gambler/callforrescue05.wav" + PassiveEnabled -1 //31 + PassiveBots -1 //31 + PassiveNotify 0 + BloodDonorPassive 2 + BunnyHopPassive 0 + DamageBoostPassive 0.65 + DamageResistancePassive 1.1 + EternalFlamesPassive 0 + LadderActionsPassive 0 + OverhealthPassive 120 + PipebombDurationPassive 6.5 + RapidPistolPassive 0.130 + RecoilDampenerPassive 0 + ReviveHealthPassive 50 + SpecialAmmoPassive 1 + SpeedBoostPassive 0.95 + } + Ellis // Damage - Low survivability, medium mobility, high damage, medium uptime + { + CarrierFilter 40 + CarrierAttackVoicelines "mechanic/choke01.wav,mechanic/choke04.wav,mechanic/cough01.wav,mechanic/cough02.wav,mechanic/friendlyfire01.wav,mechanic/laughter04.wav,mechanic/laughter06.wav" + CarrierBaitVoicelines "mechanic/callforrescue01.wav,mechanic/callforrescue03.wav,mechanic/callforrescue05.wav" + PassiveEnabled -1 //7 + PassiveBots -1 //7 + PassiveNotify 0 + BloodDonorPassive 2 + DamageBoostPassive 1.35 + DamageResistancePassive 1.25 + GhostBulletsPassive 0 + HealPercentPassive 70.0 + HollowpointAmmoPassive 0.0 + OverhealthPassive 105 + ReviveHealthPassive 40 + SpeedBoostPassive 0.95 + } + Coach // Tank - Medium survivability, medium-low mobility, medium damage, low uptime + { + CarrierFilter 5 + CarrierAttackVoicelines "coach/taunt06.wav,coach/tankpound01.wav,coach/tankpound05.wav,coach/laughter23.wav,coach/laughter15.wav,coach/help03.wav,coach/goingtodie28.wav" + CarrierBaitVoicelines "coach/callforrescue05.wav,coach/callforrescue08.wav,coach/callforrescue12.wav" + PassiveEnabled -1 //271 + PassiveBots -1 //271 + PassiveNotify 0 + BloodDonorPassive 3 + BurstDoorsPassive 1 + DamageBoostPassive 0.85 + DamageResistancePassive 0.8 + FastRecoveryPassive 0 + JumpHeightPassive 60.0 + LadyKillerPassive 0.0 + MeleeRangePassive 100 + OverhealthPassive 140 + PunchResistancePassive 0.8 + ReviveHealthPassive 70 + RiotGearPassive 1 + ShoveDamagePassive 0.025 + ShovePenaltyPassive 0 + SpeedBoostPassive 0.85 + } + Rochelle // Support - Medium-low survivability, high mobility, low damage, high uptime + { + CarrierFilter 16 + CarrierAttackVoicelines "producer/battlecry02.wav,producer/boomerreaction02.wav,producer/deathscream02.wav,producer/defibrillator18.wav,producer/goingtodie08.wav,producer/goingtodie02.wav,producer/gooedbyspitter03.wav,producer/heardspitter05.wav" + CarrierBaitVoicelines "producer/callforrescue01.wav,producer/callforrescue07.wav" + PassiveEnabled -1 //31 + PassiveBots -1 //31 + PassiveNotify 0 + BloodDonorPassive 3 + DamageBoostPassive 0.75 + DamageResistancePassive 1.3 + HealPercentPassive 90.0 + HealthRegenPassive 2 + JumpHeightPassive 60.0 + MedicalCutsPassive 0 + MidairDashesPassive 1 + OverdoseRadiusPassive 0.0 + OverhealthPassive 120 + ReviveHealthPassive 60 + ShockwaveRadiusPassive 250.0 + SpeedBoostPassive 1.2 + SyringeDartsPassive 1 + } + } Competitive { AutoAggravate Enabled @@ -153,9 +734,33 @@ MutantTanks ScaleDamage Disabled DifficultyDamage 0.0,0.0,0.0,0.0 } + Size + { + InfectedChance 0.0 + InfectedDamage 1 + InfectedHealth 1 + InfectedScale 0.1-10.0 + JockeyChance 0.0 + JockeyDamage 1 + JockeyHealth 1 + JockeyScale 0.1-10.0 + WitchChance 0.0 + WitchDamage 1 + WitchHealth 1 + WitchScale 0.1-10.0 + } Health { BaseHealth 6000 + ArmorCharacters ],= + ArmorPercentage 0.0 + ArmorResistance 0.75 + ShieldCharacters >,- + ShieldPercentage 0.0 + ShieldRate 0.5 + PassiveDelay 5.0 + PassiveHealth 0 + PassiveInterval 1.0 DisplayHealth Max DisplayHealthType 1 HealthCharacters |,- @@ -192,6 +797,7 @@ MutantTanks Enhancements { AttackInterval 0.0 + BunnyHop 0 ClawDamage -1.0 FootstepShake 0 GroundPound 0 @@ -235,11 +841,11 @@ MutantTanks RegularDelay 10.0 RegularInterval 300.0 RegularLimit 99999 - RegularType 1-128 + RegularType 1-144 RegularWave No FinaleAmount Min FinaleMode 0 - FinaleTypes 1-128,1-128,1-128,1-128,1-128,1-128,1-128,1-128,1-128,1-128,1-128 + FinaleTypes 1-144,1-144,1-144,1-144,1-144,1-144,1-144,1-144,1-144,1-144,1-144 FinaleWaves 0,0,0,0,0,0,0,0,0,0,0 } Rush @@ -259,8 +865,8 @@ MutantTanks { tank_burn_duration_expert 150 tank_burn_duration_hard 150 - //tank_burn_duration_normal "150" // L4D1 only - tank_burn_duration "150" // L4D2 only + //tank_burn_duration_normal 150 // L4D1 only + tank_burn_duration 150 // L4D2 only z_burn_max 1.0 } GameModes @@ -299,6 +905,12 @@ MutantTanks SmokerName Absorber SpitterName Absorber } + Mob + { + MobVariants -1 + CommonName Absorber + WitchName Absorber + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -372,6 +984,12 @@ MutantTanks SmokerName Acidic SpitterName Acidic } + Mob + { + MobVariants -1 + CommonName Acidic + WitchName Acidic + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -457,6 +1075,12 @@ MutantTanks SmokerName Aimless SpitterName Aimless } + Mob + { + MobVariants -1 + CommonName Aimless + WitchName Aimless + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -528,6 +1152,12 @@ MutantTanks SmokerName Ammo SpitterName Ammo } + Mob + { + MobVariants -1 + CommonName Ammo + WitchName Ammo + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -599,6 +1229,12 @@ MutantTanks SmokerName Blind SpitterName Blind } + Mob + { + MobVariants -1 + CommonName Blind + WitchName Blind + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -638,21 +1274,21 @@ MutantTanks SpitterExtraHealth 100 } } - BlindAbility + VisionAbility { HumanAbility 1 HumanAmmo 2 AbilityEnabled 1 AbilityEffect 7 AbilityMessage 1 - BlindChance 33.3 - BlindDuration 5.0 - BlindHit 1 - BlindHitMode 0 - BlindIntensity 255 - BlindMode 0 - BlindRange 150.0 - BlindRangeChance 15.0 + VisionChance 33.3 + VisionDuration 5.0 + VisionHit 1 + VisionHitMode 0 + VisionIntensity 255 + VisionMode 1 + VisionRange 150.0 + VisionRangeChance 15.0 } } Tank#6 @@ -671,6 +1307,12 @@ MutantTanks SmokerName Bomber SpitterName Bomber } + Mob + { + MobVariants -1 + CommonName Bomber + WitchName Bomber + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -755,6 +1397,12 @@ MutantTanks SmokerName Boomer SpitterName Boomer } + Mob + { + MobVariants -1 + CommonName Boomer + WitchName Boomer + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -810,10 +1458,22 @@ MutantTanks AbilityMessage 1 MinionAmount 5 MinionChance 20.0 + MinionFilter 2 MinionLifetime 0.0 MinionRemove 1 MinionReplace 1 - MinionTypes 2 + } + RespawnAbility + { + HumanAbility 1 + HumanAmmo 2 + HumanDuration 5 + AbilityEnabled 1 + AbilityMessage 1 + RespawnChance 100.0 + RespawnDuration 0 + RespawnFilter 2 + RespawnRange 300.0 } ThrowAbility { @@ -824,7 +1484,7 @@ MutantTanks ThrowChance 33.3 ThrowInfectedAmount 2 ThrowInfectedLifetime 0.0 - ThrowInfectedOptions 2 + ThrowInfectedOptions 4 ThrowInfectedRemove 1 Special { @@ -848,6 +1508,12 @@ MutantTanks SmokerName Bulletproof SpitterName Bulletproof } + Mob + { + MobVariants -1 + CommonName Bulletproof + WitchName Bulletproof + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -908,6 +1574,12 @@ MutantTanks SmokerName Burier SpitterName Burier } + Mob + { + MobVariants -1 + CommonName Burier + WitchName Burier + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -990,6 +1662,12 @@ MutantTanks SmokerName Car SpitterName Car } + Mob + { + MobVariants -1 + CommonName Car + WitchName Car + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -1045,6 +1723,7 @@ MutantTanks AbilityEnabled 1 AbilityMessage 1 CarChance 15.0 + CarDamage 5.0 CarDuration 5 CarInterval 0.5 CarLifetime 30.0 @@ -1058,6 +1737,7 @@ MutantTanks HumanAmmo 2 AbilityEnabled 1 AbilityMessage 1 + ThrowCarDamage 5.0 ThrowCarLifetime 10.0 ThrowCarOptions 0 ThrowCarOwner 1 @@ -1085,6 +1765,12 @@ MutantTanks SmokerName Charger SpitterName Charger } + Mob + { + MobVariants -1 + CommonName Charger + WitchName Charger + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -1135,10 +1821,22 @@ MutantTanks AbilityMessage 1 MinionAmount 5 MinionChance 20.0 + MinionFilter 32 MinionLifetime 0.0 MinionRemove 1 MinionReplace 1 - MinionTypes 32 + } + RespawnAbility + { + HumanAbility 1 + HumanAmmo 2 + HumanDuration 5 + AbilityEnabled 1 + AbilityMessage 1 + RespawnChance 100.0 + RespawnDuration 0 + RespawnFilter 32 + RespawnRange 300.0 } ThrowAbility { @@ -1149,7 +1847,7 @@ MutantTanks ThrowChance 33.3 ThrowInfectedAmount 2 ThrowInfectedLifetime 0.0 - ThrowInfectedOptions 32 + ThrowInfectedOptions 64 ThrowInfectedRemove 1 Special { @@ -1173,6 +1871,12 @@ MutantTanks SmokerName Choker SpitterName Choker } + Mob + { + MobVariants -1 + CommonName Choker + WitchName Choker + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -1245,6 +1949,12 @@ MutantTanks SmokerName Clone SpitterName Clone } + Mob + { + MobVariants -1 + CommonName Clone + WitchName Clone + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -1323,6 +2033,12 @@ MutantTanks SmokerName Cloudy SpitterName Cloudy } + Mob + { + MobVariants -1 + CommonName Cloudy + WitchName Cloudy + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -1375,6 +2091,9 @@ MutantTanks CloudChance 50.0 CloudDamage 5.0 CloudDuration 0 + CloudInterval 5.0 + CloudRange 500.0 + CloudRemove 0 } } Tank#15 @@ -1393,6 +2112,12 @@ MutantTanks SmokerName Dropper SpitterName Dropper } + Mob + { + MobVariants -1 + CommonName Dropper + WitchName Dropper + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -1460,6 +2185,12 @@ MutantTanks SmokerName Drugger SpitterName Drugger } + Mob + { + MobVariants -1 + CommonName Drugger + WitchName Drugger + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -1489,6 +2220,10 @@ MutantTanks Particles { BodyEffects 32 + Common + { + BodyChance 100.0,100.0,100.0,100.0,100.0,33.3,100.0 + } } Health { @@ -1535,6 +2270,12 @@ MutantTanks SmokerName Drunk SpitterName Drunk } + Mob + { + MobVariants -1 + CommonName Drunk + WitchName Drunk + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -1606,6 +2347,12 @@ MutantTanks SmokerName Electric SpitterName Electric } + Mob + { + MobVariants -1 + CommonName Electric + WitchName Electric + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -1687,6 +2434,12 @@ MutantTanks SmokerName Enforcer SpitterName Enforcer } + Mob + { + MobVariants -1 + CommonName Enforcer + WitchName Enforcer + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -1758,6 +2511,12 @@ MutantTanks SmokerName Fast SpitterName Fast } + Mob + { + MobVariants -1 + CommonName Fast + WitchName Fast + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -1850,6 +2609,12 @@ MutantTanks SmokerName Fireproof SpitterName Fireproof } + Mob + { + MobVariants -1 + CommonName Fireproof + WitchName Fireproof + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -1943,6 +2708,12 @@ MutantTanks SmokerName Flinger SpitterName Flinger } + Mob + { + MobVariants -1 + CommonName Flinger + WitchName Flinger + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -2015,6 +2786,12 @@ MutantTanks SmokerName Flying SpitterName Flying } + Mob + { + MobVariants -1 + CommonName Flying + WitchName Flying + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -2084,6 +2861,12 @@ MutantTanks SmokerName Fragile SpitterName Fragile } + Mob + { + MobVariants -1 + CommonName Fragile + WitchName Fragile + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -2158,6 +2941,12 @@ MutantTanks SmokerName Ghost SpitterName Ghost } + Mob + { + MobVariants -1 + CommonName Ghost + WitchName Ghost + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -2237,6 +3026,12 @@ MutantTanks SmokerName Godly SpitterName Godly } + Mob + { + MobVariants -1 + CommonName Godly + WitchName Godly + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -2303,6 +3098,12 @@ MutantTanks SmokerName Gravity SpitterName Gravity } + Mob + { + MobVariants -1 + CommonName Gravity + WitchName Gravity + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -2384,6 +3185,12 @@ MutantTanks SmokerName Gunner SpitterName Gunner } + Mob + { + MobVariants -1 + CommonName Gunner + WitchName Gunner + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -2458,6 +3265,12 @@ MutantTanks SmokerName Healthy SpitterName Healthy } + Mob + { + MobVariants -1 + CommonName Healthy + WitchName Healthy + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -2541,6 +3354,12 @@ MutantTanks SmokerName Hitter SpitterName Hitter } + Mob + { + MobVariants -1 + CommonName Hitter + WitchName Hitter + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -2580,12 +3399,11 @@ MutantTanks SpitterExtraHealth 100 } } - HitAbility + MedicAbility { HumanAbility 1 - AbilityEnabled 1 - HitDamageMultiplier 1.5 - HitGroup 1 + MedicDamageMultiplier 1.5 + MedicHitGroup 1 } } Tank#31 @@ -2604,6 +3422,12 @@ MutantTanks SmokerName Hunter SpitterName Hunter } + Mob + { + MobVariants -1 + CommonName Hunter + WitchName Hunter + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -2654,10 +3478,22 @@ MutantTanks AbilityMessage 1 MinionAmount 5 MinionChance 20.0 + MinionFilter 4 MinionLifetime 0.0 MinionRemove 1 MinionReplace 1 - MinionTypes 4 + } + RespawnAbility + { + HumanAbility 1 + HumanAmmo 2 + HumanDuration 5 + AbilityEnabled 1 + AbilityMessage 1 + RespawnChance 100.0 + RespawnDuration 0 + RespawnFilter 4 + RespawnRange 300.0 } ThrowAbility { @@ -2668,7 +3504,7 @@ MutantTanks ThrowChance 33.3 ThrowInfectedAmount 2 ThrowInfectedLifetime 0.0 - ThrowInfectedOptions 4 + ThrowInfectedOptions 8 ThrowInfectedRemove 1 Special { @@ -2692,6 +3528,12 @@ MutantTanks SmokerName Hurtful SpitterName Hurtful } + Mob + { + MobVariants -1 + CommonName Hurtful + WitchName Hurtful + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -2743,6 +3585,7 @@ MutantTanks HurtHit 1 HurtHitMode 0 HurtInterval 1.0 + HurtMode 1 HurtRange 150.0 HurtRangeChance 15.0 } @@ -2763,6 +3606,12 @@ MutantTanks SmokerName Hypnotizer SpitterName Hypnotizer } + Mob + { + MobVariants -1 + CommonName Hypnotizer + WitchName Hypnotizer + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -2840,6 +3689,12 @@ MutantTanks SmokerName Icy SpitterName Icy } + Mob + { + MobVariants -1 + CommonName Icy + WitchName Icy + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -2913,6 +3768,12 @@ MutantTanks SmokerName Idler SpitterName Idler } + Mob + { + MobVariants -1 + CommonName Idler + WitchName Idler + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -2982,6 +3843,12 @@ MutantTanks SmokerName Inverter SpitterName Inverter } + Mob + { + MobVariants -1 + CommonName Inverter + WitchName Inverter + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -3051,6 +3918,12 @@ MutantTanks SmokerName Item SpitterName Item } + Mob + { + MobVariants -1 + CommonName Item + WitchName Item + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -3090,21 +3963,21 @@ MutantTanks SpitterExtraHealth 100 } } - ItemAbility + DropAbility { HumanAbility 1 - AbilityEnabled 1 + AbilityEnabled 2 AbilityMessage 1 - ItemChance 50.0 - ItemLoadout rifle,pistol,first_aid_kit,pain_pills - ItemMode 0 - ItemPinata "" - ItemPinataBody 1 - ItemPinataChance 33.3 + DropChance 50.0 + DropLoadout rifle,pistol,first_aid_kit,pain_pills + DropItemMode 0 + DropPinata "" + DropPinataBody 1 + DropPinataChance 33.3 Special { AbilityEnabled 0 - ItemLoadout smg,pistol,pain_pills + DropLoadout smg,pistol,pain_pills } } } @@ -3125,6 +3998,12 @@ MutantTanks SmokerName Jockey SpitterName Jockey } + Mob + { + MobVariants -1 + CommonName Jockey + WitchName Jockey + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -3175,10 +4054,22 @@ MutantTanks AbilityMessage 1 MinionAmount 5 MinionChance 20.0 + MinionFilter 16 MinionLifetime 0.0 MinionRemove 1 MinionReplace 1 - MinionTypes 16 + } + RespawnAbility + { + HumanAbility 1 + HumanAmmo 2 + HumanDuration 5 + AbilityEnabled 1 + AbilityMessage 1 + RespawnChance 100.0 + RespawnDuration 0 + RespawnFilter 16 + RespawnRange 300.0 } ThrowAbility { @@ -3189,7 +4080,7 @@ MutantTanks ThrowChance 33.3 ThrowInfectedAmount 2 ThrowInfectedLifetime 0.0 - ThrowInfectedOptions 16 + ThrowInfectedOptions 32 ThrowInfectedRemove 1 Special { @@ -3213,6 +4104,12 @@ MutantTanks SmokerName Jumper SpitterName Jumper } + Mob + { + MobVariants -1 + CommonName Jumper + WitchName Jumper + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -3286,6 +4183,12 @@ MutantTanks SmokerName Kamikaze SpitterName Kamikaze } + Mob + { + MobVariants -1 + CommonName Kamikaze + WitchName Kamikaze + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -3328,23 +4231,25 @@ MutantTanks { RunSpeed 0.65 } - KamikazeAbility + SmashAbility { HumanAbility 1 AbilityEnabled 1 AbilityEffect 7 AbilityMessage 1 - KamikazeBody 1 - KamikazeChance 33.3 - KamikazeHit 1 - KamikazeHitMode 0 - KamikazeMode 1 - KamikazeRange 150.0 - KamikazeRangeChance 33.3 + SmashBody 1 + SmashChance 33.3 + SmashHit 1 + SmashHitMode 0 + SmashMode 1 + SmashRange 150.0 + SmashRangeChance 33.3 + SmashRemove 1 + SmashType 1 Special { - KamikazeBody 0 - KamikazeMeter 50.0 + SmashBody 0 + SmashMeter 50.0 } } } @@ -3364,6 +4269,12 @@ MutantTanks SmokerName Lagger SpitterName Lagger } + Mob + { + MobVariants -1 + CommonName Lagger + WitchName Lagger + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -3434,6 +4345,12 @@ MutantTanks SmokerName Laser SpitterName Laser } + Mob + { + MobVariants -1 + CommonName Laser + WitchName Laser + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -3502,6 +4419,12 @@ MutantTanks SmokerName Leecher SpitterName Leecher } + Mob + { + MobVariants -1 + CommonName Leecher + WitchName Leecher + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -3540,20 +4463,25 @@ MutantTanks SpitterExtraHealth 100 } } - LeechAbility + RegenAbility { HumanAbility 1 HumanAmmo 2 + HumanDuration 5 AbilityEnabled 1 - AbilityEffect 7 + AbilityEffect 4 AbilityMessage 1 - LeechChance 33.3 - LeechDuration 5 - LeechHit 1 - LeechHitMode 0 - LeechInterval 1.0 - LeechRange 150.0 - LeechRangeChance 15.0 + RegenChance 100.0 + RegenDuration 5 + RegenHealth 1 + RegenInterval 1.0 + RegenLimit 1000000 + RegenRange 500.0 + Special + { + RegenLimit 100000 + RegenRange 150.0 + } } } Tank#44 @@ -3573,6 +4501,12 @@ MutantTanks SmokerName Lightning SpitterName Lightning } + Mob + { + MobVariants -1 + CommonName Lightning + WitchName Lightning + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -3644,6 +4578,12 @@ MutantTanks SmokerName Medic SpitterName Medic } + Mob + { + MobVariants -1 + CommonName Medic + WitchName Medic + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -3722,6 +4662,12 @@ MutantTanks SmokerName Meteor SpitterName Meteor } + Mob + { + MobVariants -1 + CommonName Meteor + WitchName Meteor + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -3804,6 +4750,12 @@ MutantTanks SmokerName Necromancer SpitterName Necromancer } + Mob + { + MobVariants -1 + CommonName Necromancer + WitchName Necromancer + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -3843,16 +4795,17 @@ MutantTanks SpitterExtraHealth 100 } } - NecroAbility + RespawnAbility { HumanAbility 1 HumanAmmo 2 HumanDuration 5 AbilityEnabled 1 AbilityMessage 1 - NecroChance 100.0 - NecroDuration 0 - NecroRange 500.0 + RespawnChance 100.0 + RespawnDuration 0 + RespawnFilter 0 + RespawnRange 500.0 } } Tank#48 @@ -3871,6 +4824,12 @@ MutantTanks SmokerName Nullifier SpitterName Nullifier } + Mob + { + MobVariants -1 + CommonName Nullifier + WitchName Nullifier + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -3945,6 +4904,12 @@ MutantTanks SmokerName Omni SpitterName Omni } + Mob + { + MobVariants -1 + CommonName Omni + WitchName Omni + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -4013,6 +4978,12 @@ MutantTanks SmokerName Panic SpitterName Panic } + Mob + { + MobVariants -1 + CommonName Panic + WitchName Panic + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -4083,6 +5054,12 @@ MutantTanks SmokerName Pet SpitterName Pet } + Mob + { + MobVariants -1 + CommonName Pet + WitchName Pet + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -4171,6 +5148,12 @@ MutantTanks SmokerName Pimp SpitterName Pimp } + Mob + { + MobVariants -1 + CommonName Pimp + WitchName Pimp + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -4209,21 +5192,22 @@ MutantTanks SpitterExtraHealth 100 } } - PimpAbility + HurtAbility { HumanAbility 1 HumanAmmo 2 AbilityEnabled 1 AbilityEffect 7 AbilityMessage 1 - PimpChance 33.3 - PimpDamage 1 - PimpDuration 5 - PimpHit 1 - PimpHitMode 0 - PimpInterval 1.0 - PimpRange 150.0 - PimpRangeChance 15.0 + HurtChance 33.3 + HurtDamage 1 + HurtDuration 5 + HurtHit 1 + HurtHitMode 0 + HurtInterval 1.0 + HurtMode 2 + HurtRange 150.0 + HurtRangeChance 15.0 } } Tank#53 @@ -4242,6 +5226,12 @@ MutantTanks SmokerName Platinum SpitterName Platinum } + Mob + { + MobVariants -1 + CommonName Platinum + WitchName Platinum + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -4301,6 +5291,12 @@ MutantTanks SmokerName Puke SpitterName Puke } + Mob + { + MobVariants -1 + CommonName Puke + WitchName Puke + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -4381,6 +5377,12 @@ MutantTanks SmokerName Pyromaniac SpitterName Pyromaniac } + Mob + { + MobVariants -1 + CommonName Pyromaniac + WitchName Pyromaniac + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -4416,12 +5418,12 @@ MutantTanks ExtraHealth 1000 Special { - BoomerExtraHealth 500 - ChargerExtraHealth 500 - HunterExtraHealth 500 - JockeyExtraHealth 500 - SmokerExtraHealth 500 - SpitterExtraHealth 500 + BoomerExtraHealth 100 + ChargerExtraHealth 100 + HunterExtraHealth 100 + JockeyExtraHealth 100 + SmokerExtraHealth 100 + SpitterExtraHealth 100 } } Enhancements @@ -4464,6 +5466,12 @@ MutantTanks SmokerName Quiet SpitterName Quiet } + Mob + { + MobVariants -1 + CommonName Quiet + WitchName Quiet + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -4535,6 +5543,12 @@ MutantTanks SmokerName Recall SpitterName Recall } + Mob + { + MobVariants -1 + CommonName Recall + WitchName Recall + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -4628,6 +5642,12 @@ MutantTanks SmokerName Recoil SpitterName Recoil } + Mob + { + MobVariants -1 + CommonName Recoil + WitchName Recoil + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -4698,6 +5718,12 @@ MutantTanks SmokerName Regenerative SpitterName Regenerative } + Mob + { + MobVariants -1 + CommonName Regenerative + WitchName Regenerative + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -4743,17 +5769,18 @@ MutantTanks HumanAmmo 2 HumanDuration 5 AbilityEnabled 1 + AbilityEffect 4 AbilityMessage 1 RegenChance 100.0 RegenDuration 0 RegenHealth 1 RegenInterval 1.0 - RegenLeech 1 - RegenLeechRange 500.0 RegenLimit 1000000 + RegenRange 500.0 Special { RegenLimit 100000 + RegenRange 150.0 } } } @@ -4773,6 +5800,12 @@ MutantTanks SmokerName Respawner SpitterName Respawner } + Mob + { + MobVariants -1 + CommonName Respawner + WitchName Respawner + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -4816,7 +5849,7 @@ MutantTanks { HumanAbility 1 HumanAmmo 1 - AbilityEnabled 1 + AbilityEnabled 2 AbilityMessage 1 RespawnAmount 1 RespawnChance 100.0 @@ -4839,6 +5872,12 @@ MutantTanks SmokerName Restarter SpitterName Restarter } + Mob + { + MobVariants -1 + CommonName Restarter + WitchName Restarter + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -4914,6 +5953,12 @@ MutantTanks SmokerName Rock SpitterName Rock } + Mob + { + MobVariants -1 + CommonName Rock + WitchName Rock + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -4968,6 +6013,7 @@ MutantTanks RockDamage 5 RockDuration 5 RockInterval 0.2 + RockMode 1 RockRadius -1.25,1.25 } } @@ -4987,6 +6033,12 @@ MutantTanks SmokerName Rocketeer SpitterName Rocketeer } + Mob + { + MobVariants -1 + CommonName Rocketeer + WitchName Rocketeer + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -5025,25 +6077,26 @@ MutantTanks SpitterExtraHealth 100 } } - RocketAbility + SmashAbility { HumanAbility 1 HumanAmmo 1 AbilityEnabled 1 AbilityEffect 7 AbilityMessage 1 - RocketBody 1 - RocketChance 15.0 - RocketDelay 1.0 - RocketHit 1 - RocketHitMode 0 - RocketMode 1 - RocketRange 150.0 - RocketRangeChance 15.0 + SmashBody 1 + SmashChance 15.0 + SmashDelay 1.0 + SmashHit 1 + SmashHitMode 0 + SmashMode 2 + SmashRange 150.0 + SmashRangeChance 15.0 + SmashType 1 Special { - RocketBody 0 - RocketCountdown 3.0 + SmashBody 0 + SmashCountdown 3.0 } } } @@ -5063,6 +6116,12 @@ MutantTanks SmokerName Self-throwing SpitterName Self-throwing } + Mob + { + MobVariants -1 + CommonName Self-throwing + WitchName Self-throwing + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -5134,6 +6193,12 @@ MutantTanks SmokerName Shaker SpitterName Shaker } + Mob + { + MobVariants -1 + CommonName Shaker + WitchName Shaker + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -5173,23 +6238,24 @@ MutantTanks SpitterExtraHealth 100 } } - ShakeAbility + VisionAbility { HumanAbility 1 HumanAmmo 2 AbilityEnabled 1 AbilityEffect 7 AbilityMessage 1 - ShakeChance 33.3 - ShakeDeath 1 - ShakeDeathChance 33.3 - ShakeDeathRange 200.0 - ShakeDuration 5 - ShakeHit 1 - ShakeHitMode 0 - ShakeInterval 1.0 - ShakeRange 150.0 - ShakeRangeChance 15.0 + VisionChance 33.3 + VisionDeath 1 + VisionDeathChance 33.3 + VisionDeathRange 200.0 + VisionDuration 5 + VisionHit 1 + VisionHitMode 0 + VisionMode 4 + VisionInterval 1.0 + VisionRange 150.0 + VisionRangeChance 15.0 } } Tank#66 @@ -5208,6 +6274,12 @@ MutantTanks SmokerName Shield SpitterName Shield } + Mob + { + MobVariants -1 + CommonName Shield + WitchName Shield + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -5286,6 +6358,12 @@ MutantTanks SmokerName Shover SpitterName Shover } + Mob + { + MobVariants -1 + CommonName Shover + WitchName Shover + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -5359,6 +6437,12 @@ MutantTanks SmokerName Slow SpitterName Slow } + Mob + { + MobVariants -1 + CommonName Slow + WitchName Slow + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -5430,7 +6514,13 @@ MutantTanks SmokerName Smasher SpitterName Smasher } - TankEnabled -1 + Mob + { + MobVariants -1 + CommonName Smasher + WitchName Smasher + } + TankEnabled -1 TankChance 100.0 TankNote 1 SkinColor 70,80,100,255 @@ -5486,6 +6576,8 @@ MutantTanks SmashMode 1 SmashRange 150.0 SmashRangeChance 33.3 + SmashRemove 0 + SmashType 1 Special { SmashBody 0 @@ -5509,6 +6601,12 @@ MutantTanks SmokerName Smiter SpitterName Smiter } + Mob + { + MobVariants -1 + CommonName Smiter + WitchName Smiter + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -5551,24 +6649,25 @@ MutantTanks { RunSpeed 0.65 } - SmiteAbility + SmashAbility { HumanAbility 1 HumanAmmo 1 AbilityEnabled 1 AbilityEffect 7 AbilityMessage 1 - SmiteBody 1 - SmiteChance 33.3 - SmiteHit 1 - SmiteHitMode 0 - SmiteMode 1 - SmiteRange 150.0 - SmiteRangeChance 33.3 + SmashBody 1 + SmashChance 33.3 + SmashHit 1 + SmashHitMode 0 + SmashMode 4 + SmashRange 150.0 + SmashRangeChance 33.3 + SmashType 1 Special { - SmiteBody 0 - SmiteCountdown 3.0 + SmashBody 0 + SmashCountdown 3.0 } } } @@ -5588,6 +6687,12 @@ MutantTanks SmokerName Smoker SpitterName Smoker } + Mob + { + MobVariants -1 + CommonName Smoker + WitchName Smoker + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -5620,6 +6725,10 @@ MutantTanks Particles { BodyEffects 32 + Common + { + BodyChance 100.0,100.0,100.0,100.0,100.0,33.3,100.0 + } } Health { @@ -5642,10 +6751,22 @@ MutantTanks AbilityMessage 1 MinionAmount 5 MinionChance 20.0 + MinionFilter 1 MinionLifetime 0.0 MinionRemove 1 MinionReplace 1 - MinionTypes 1 + } + RespawnAbility + { + HumanAbility 1 + HumanAmmo 2 + HumanDuration 5 + AbilityEnabled 1 + AbilityMessage 1 + RespawnChance 100.0 + RespawnDuration 0 + RespawnFilter 1 + RespawnRange 300.0 } ThrowAbility { @@ -5656,7 +6777,7 @@ MutantTanks ThrowChance 33.3 ThrowInfectedAmount 2 ThrowInfectedLifetime 0.0 - ThrowInfectedOptions 1 + ThrowInfectedOptions 2 ThrowInfectedRemove 1 Special { @@ -5680,6 +6801,12 @@ MutantTanks SmokerName Spammer SpitterName Spammer } + Mob + { + MobVariants -1 + CommonName Spammer + WitchName Spammer + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -5722,16 +6849,17 @@ MutantTanks SpitterExtraHealth 100 } } - SpamAbility + RockAbility { HumanAbility 1 HumanAmmo 2 HumanDuration 5 AbilityEnabled 1 - SpamChance 15.0 - SpamDamage 5 - SpamDuration 5 - SpamInterval 0.5 + RockChance 15.0 + RockDamage 5 + RockDuration 5 + RockInterval 0.5 + RockMode 2 } } Tank#73 @@ -5750,6 +6878,12 @@ MutantTanks SmokerName Special SpitterName Special } + Mob + { + MobVariants -1 + CommonName Special + WitchName Special + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -5800,10 +6934,22 @@ MutantTanks AbilityMessage 1 MinionAmount 5 MinionChance 20.0 + MinionFilter 0 MinionLifetime 0.0 MinionRemove 1 MinionReplace 1 - MinionTypes 0 + } + RespawnAbility + { + HumanAbility 1 + HumanAmmo 2 + HumanDuration 5 + AbilityEnabled 1 + AbilityMessage 1 + RespawnChance 100.0 + RespawnDuration 0 + RespawnFilter 0 + RespawnRange 300.0 } ThrowAbility { @@ -5814,7 +6960,7 @@ MutantTanks ThrowChance 33.3 ThrowInfectedAmount 2 ThrowInfectedLifetime 0.0 - ThrowInfectedOptions 63 + ThrowInfectedOptions 126 ThrowInfectedRemove 1 Special { @@ -5839,6 +6985,12 @@ MutantTanks SmokerName Spitter SpitterName Spitter } + Mob + { + MobVariants -1 + CommonName Spitter + WitchName Spitter + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -5894,10 +7046,22 @@ MutantTanks AbilityMessage 1 MinionAmount 5 MinionChance 20.0 + MinionFilter 8 MinionLifetime 0.0 MinionRemove 1 MinionReplace 1 - MinionTypes 8 + } + RespawnAbility + { + HumanAbility 1 + HumanAmmo 2 + HumanDuration 5 + AbilityEnabled 1 + AbilityMessage 1 + RespawnChance 100.0 + RespawnDuration 0 + RespawnFilter 8 + RespawnRange 300.0 } ThrowAbility { @@ -5908,7 +7072,7 @@ MutantTanks ThrowChance 33.3 ThrowInfectedAmount 2 ThrowInfectedLifetime 0.0 - ThrowInfectedOptions 8 + ThrowInfectedOptions 16 ThrowInfectedRemove 1 Special { @@ -5932,6 +7096,12 @@ MutantTanks SmokerName Splasher SpitterName Splasher } + Mob + { + MobVariants -1 + CommonName Splasher + WitchName Splasher + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -5974,18 +7144,19 @@ MutantTanks SpitterExtraHealth 100 } } - SplashAbility + CloudAbility { HumanAbility 1 HumanAmmo 2 HumanDuration 5 AbilityEnabled 1 AbilityMessage 1 - SplashChance 15.0 - SplashDamage 5.0 - SplashDuration 0 - SplashInterval 5.0 - SplashRange 500.0 + CloudChance 15.0 + CloudDamage 5.0 + CloudDuration 0 + CloudInterval 5.0 + CloudRange 500.0 + CloudRemove 1 } } Tank#76 @@ -6005,6 +7176,12 @@ MutantTanks SmokerName Splatter SpitterName Splatter } + Mob + { + MobVariants -1 + CommonName Splatter + WitchName Splatter + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -6044,21 +7221,22 @@ MutantTanks SpitterExtraHealth 100 } } - SplatterAbility + VisionAbility { HumanAbility 1 HumanAmmo 2 AbilityEnabled 1 AbilityEffect 7 AbilityMessage 1 - SplatterChance 33.3 - SplatterDuration 5 - SplatterHit 1 - SplatterHitMode 0 - SplatterInterval 1.0 - SplatterRange 150.0 - SplatterRangeChance 15.0 - SplatterType 0 + VisionChance 33.3 + VisionDuration 5.0 + VisionHit 1 + VisionHitMode 0 + VisionInterval 1.0 + VisionMode 8 + VisionRange 150.0 + VisionRangeChance 15.0 + VisionType 0 } } Tank#77 @@ -6077,6 +7255,12 @@ MutantTanks SmokerName Thrower SpitterName Thrower } + Mob + { + MobVariants -1 + CommonName Thrower + WitchName Thrower + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -6129,13 +7313,14 @@ MutantTanks HumanAmmo 2 AbilityEnabled 15 AbilityMessage 15 + ThrowCarDamage 5.0 ThrowCarLifetime 10.0 ThrowCarOptions 0 ThrowCarOwner 1 ThrowChance 33.3 ThrowInfectedAmount 2 ThrowInfectedLifetime 0.0 - ThrowInfectedOptions 63 + ThrowInfectedOptions 126 ThrowInfectedRemove 1 ThrowWitchAmount 3 ThrowWitchDamage 5.0 @@ -6163,6 +7348,12 @@ MutantTanks SmokerName Tracker SpitterName Tracker } + Mob + { + MobVariants -1 + CommonName Tracker + WitchName Tracker + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -6241,6 +7432,12 @@ MutantTanks SmokerName Ultimate SpitterName Ultimate } + Mob + { + MobVariants -1 + CommonName Ultimate + WitchName Ultimate + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -6310,6 +7507,12 @@ MutantTanks SmokerName Undead SpitterName Undead } + Mob + { + MobVariants -1 + CommonName Undead + WitchName Undead + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -6379,6 +7582,12 @@ MutantTanks SmokerName Vampire SpitterName Vampire } + Mob + { + MobVariants -1 + CommonName Vampire + WitchName Vampire + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -6422,13 +7631,13 @@ MutantTanks SpitterExtraHealth 100 } } - VampireAbility + RegenAbility { HumanAbility 1 - AbilityEnabled 1 AbilityEffect 1 AbilityMessage 1 - VampireChance 33.3 + RegenChance 33.3 + RegenMode 1 } } Tank#82 @@ -6447,6 +7656,12 @@ MutantTanks SmokerName Visual SpitterName Visual } + Mob + { + MobVariants -1 + CommonName Visual + WitchName Visual + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -6494,10 +7709,11 @@ MutantTanks AbilityEffect 7 AbilityMessage 1 VisionChance 33.3 - VisionDuration 5 + VisionDuration 5.0 VisionFOV 160 VisionHit 1 VisionHitMode 0 + VisionMode 16 VisionRange 150.0 VisionRangeChance 15.0 } @@ -6518,6 +7734,12 @@ MutantTanks SmokerName Warper SpitterName Warper } + Mob + { + MobVariants -1 + CommonName Warper + WitchName Warper + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -6605,6 +7827,12 @@ MutantTanks SmokerName Whirler SpitterName Whirler } + Mob + { + MobVariants -1 + CommonName Whirler + WitchName Whirler + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -6677,6 +7905,12 @@ MutantTanks SmokerName Witch SpitterName Witch } + Mob + { + MobVariants -1 + CommonName Witch + WitchName Witch + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -6767,6 +8001,12 @@ MutantTanks SmokerName Xiphos SpitterName Xiphos } + Mob + { + MobVariants -1 + CommonName Xiphos + WitchName Xiphos + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -6805,14 +8045,14 @@ MutantTanks SpitterExtraHealth 100 } } - XiphosAbility + RegenAbility { HumanAbility 1 - AbilityEnabled 1 - AbilityEffect 1 + AbilityEffect 3 AbilityMessage 1 - XiphosChance 33.3 - XiphosMaxHealth 0 + RegenChance 33.3 + RegenMaxHealth 0 + RegenMode 2 } } Tank#87 @@ -6831,6 +8071,12 @@ MutantTanks SmokerName Yeller SpitterName Yeller } + Mob + { + MobVariants -1 + CommonName Yeller + WitchName Yeller + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -6901,6 +8147,12 @@ MutantTanks SmokerName Zombie SpitterName Zombie } + Mob + { + MobVariants -1 + CommonName Zombie + WitchName Zombie + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -6939,19 +8191,19 @@ MutantTanks SpitterExtraHealth 100 } } - ZombieAbility + PanicAbility { HumanAbility 1 HumanAmmo 2 HumanDuration 6 - AbilityEnabled 1 + AbilityEnabled 2 AbilityMessage 1 - ZombieAmount 10 - ZombieChance 33.3 - ZombieDuration 0 - ZombieInterval 5.0 - ZombieMode 0 - ZombieType 0 + PanicAmount 10 + PanicChance 33.3 + PanicDuration 0 + PanicInterval 5.0 + PanicMode 0 + PanicType 0 } } /** @@ -6974,6 +8226,12 @@ MutantTanks SmokerName Armageddon SpitterName Armageddon } + Mob + { + MobVariants -1 + CommonName Armageddon + WitchName Armageddon + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -7020,7 +8278,7 @@ MutantTanks GravityAbility { AbilityEnabled 2 - AbilityMessage 5 + AbilityMessage 4 GravityFlags 8 GravityForce -50.0 } @@ -7053,6 +8311,12 @@ MutantTanks SmokerName Boss SpitterName Boss } + Mob + { + MobVariants -1 + CommonName Boss + WitchName Boss + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -7080,6 +8344,7 @@ MutantTanks Particles { BodyEffects 127 + BodyChance 100.0,100.0,100.0,100.0,100.0,33.3,100.0 RockEffects 15 } Health @@ -7199,6 +8464,8 @@ MutantTanks SmashChance 20.0 SmashHit 1 SmashHitMode 0 + SmashMode 1 + SmashType 1 Special { SmashBody 0 @@ -7222,16 +8489,16 @@ MutantTanks WitchRange 500.0 WitchRemove 1 } - ZombieAbility + PanicAbility { - AbilityEnabled 1 + AbilityEnabled 2 AbilityMessage 1 - ZombieAmount 50 - ZombieChance 33.3 - ZombieDuration 0 - ZombieInterval 50.0 - ZombieMode 0 - ZombieType 0 + PanicAmount 50 + PanicChance 33.3 + PanicDuration 0 + PanicInterval 50.0 + PanicMode 0 + PanicType 0 } } Tank#91 @@ -7250,6 +8517,12 @@ MutantTanks SmokerName Cobalt SpitterName Cobalt } + Mob + { + MobVariants -1 + CommonName Cobalt + WitchName Cobalt + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -7329,6 +8602,12 @@ MutantTanks SmokerName Distraction SpitterName Distraction } + Mob + { + MobVariants -1 + CommonName Distraction + WitchName Distraction + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -7413,6 +8692,12 @@ MutantTanks SmokerName Feedback SpitterName Feedback } + Mob + { + MobVariants -1 + CommonName Feedback + WitchName Feedback + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -7465,7 +8750,7 @@ MutantTanks HumanAbility 1 HumanAmmo 2 AbilityEnabled 2 - AbilityMessage 5 + AbilityMessage 4 GravityFlags 8 GravityForce 50.0 } @@ -7486,6 +8771,12 @@ MutantTanks SmokerName Flash SpitterName Flash } + Mob + { + MobVariants -1 + CommonName Flash + WitchName Flash + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -7621,6 +8912,12 @@ MutantTanks SmokerName Goliath SpitterName Goliath } + Mob + { + MobVariants -1 + CommonName Goliath + WitchName Goliath + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -7715,6 +9012,8 @@ MutantTanks SmashChance 33.3 SmashHit 1 SmashHitMode 0 + SmashMode 1 + SmashType 1 Special { SmashBody 0 @@ -7738,6 +9037,12 @@ MutantTanks SmokerName Hallucination SpitterName Hallucination } + Mob + { + MobVariants -1 + CommonName Hallucination + WitchName Hallucination + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -7820,6 +9125,12 @@ MutantTanks SmokerName Meme SpitterName Meme } + Mob + { + MobVariants -1 + CommonName Meme + WitchName Meme + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -7847,6 +9158,7 @@ MutantTanks Particles { BodyEffects 127 + BodyChance 100.0,100.0,100.0,100.0,100.0,33.3,100.0 RockEffects 15 } Health @@ -7947,19 +9259,22 @@ MutantTanks SmashChance 20.0 SmashHit 1 SmashHitMode 0 + SmashMode 1 + SmashType 1 Special { SmashBody 0 SmashMeter 50.0 } } - SpamAbility + RockAbility { AbilityEnabled 1 - SpamChance 50.0 - SpamDamage 5 - SpamDuration 1 - SpamInterval 0.5 + RockChance 50.0 + RockDamage 5 + RockDuration 1 + RockInterval 0.5 + RockMode 2 } WarpAbility { @@ -7978,16 +9293,16 @@ MutantTanks WitchRange 500.0 WitchRemove 1 } - ZombieAbility + PanicAbility { - AbilityEnabled 1 + AbilityEnabled 2 AbilityMessage 1 - ZombieAmount 50 - ZombieChance 33.3 - ZombieDuration 0 - ZombieInterval 50.0 - ZombieMode 0 - ZombieType 0 + PanicAmount 50 + PanicChance 33.3 + PanicDuration 0 + PanicInterval 50.0 + PanicMode 0 + PanicType 0 } } Tank#98 @@ -8006,6 +9321,12 @@ MutantTanks SmokerName Mirage SpitterName Mirage } + Mob + { + MobVariants -1 + CommonName Mirage + WitchName Mirage + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -8095,6 +9416,12 @@ MutantTanks SmokerName Poltergeist SpitterName Poltergeist } + Mob + { + MobVariants -1 + CommonName Poltergeist + WitchName Poltergeist + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -8200,6 +9527,12 @@ MutantTanks SmokerName Psychotic SpitterName Psychotic } + Mob + { + MobVariants -1 + CommonName Psychotic + WitchName Psychotic + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -8319,6 +9652,12 @@ MutantTanks SmokerName Reverse-Flash SpitterName Reverse-Flash } + Mob + { + MobVariants -1 + CommonName Reverse-Flash + WitchName Reverse-Flash + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -8417,6 +9756,12 @@ MutantTanks SmokerName Spawner SpitterName Spawner } + Mob + { + MobVariants -1 + CommonName Spawner + WitchName Spawner + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -8438,6 +9783,10 @@ MutantTanks Particles { BodyEffects 32 + Common + { + BodyChance 100.0,100.0,100.0,100.0,100.0,33.3,100.0 + } } Health { @@ -8452,19 +9801,19 @@ MutantTanks SpitterExtraHealth 100 } } - ZombieAbility + PanicAbility { HumanAbility 1 HumanAmmo 2 HumanDuration 26 - AbilityEnabled 1 + AbilityEnabled 2 AbilityMessage 1 - ZombieAmount 25 - ZombieChance 33.3 - ZombieDuration 0 - ZombieInterval 25.0 - ZombieMode 0 - ZombieType 0 + PanicAmount 25 + PanicChance 33.3 + PanicDuration 0 + PanicInterval 25.0 + PanicMode 0 + PanicType 0 } } Tank#103 @@ -8483,6 +9832,12 @@ MutantTanks SmokerName Zoom SpitterName Zoom } + Mob + { + MobVariants -1 + CommonName Zoom + WitchName Zoom + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -8581,6 +9936,12 @@ MutantTanks SmokerName Trap SpitterName Trap } + Mob + { + MobVariants -1 + CommonName Trap + WitchName Trap + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -8593,7 +9954,7 @@ MutantTanks } HumanSupport { - HumanSupport 2 + HumanSupport 1 } Props { @@ -8601,15 +9962,15 @@ MutantTanks } Health { - ExtraHealth 2000 + ExtraHealth 1000 Special { - BoomerExtraHealth 200 - ChargerExtraHealth 200 - HunterExtraHealth 200 - JockeyExtraHealth 200 - SmokerExtraHealth 200 - SpitterExtraHealth 200 + BoomerExtraHealth 100 + ChargerExtraHealth 100 + HunterExtraHealth 100 + JockeyExtraHealth 100 + SmokerExtraHealth 100 + SpitterExtraHealth 100 } } Enhancements @@ -8628,6 +9989,8 @@ MutantTanks SmashChance 33.3 SmashHit 1 SmashHitMode 0 + SmashMode 1 + SmashType 1 Special { SmashBody 0 @@ -8655,6 +10018,12 @@ MutantTanks SmokerName Dread SpitterName Dread } + Mob + { + MobVariants -1 + CommonName Dread + WitchName Dread + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -8686,17 +10055,17 @@ MutantTanks SpitterExtraHealth 100 } } - BlindAbility + VisionAbility { HumanAbility 1 AbilityEffect 7 AbilityMessage 1 - BlindChance 33.3 - BlindDuration 7.5 - BlindHit 1 - BlindHitMode 0 - BlindIntensity 235 - BlindMode 0 + VisionChance 33.3 + VisionDuration 7.5 + VisionHit 1 + VisionHitMode 0 + VisionIntensity 235 + VisionMode 1 } } Tank#106 @@ -8715,6 +10084,12 @@ MutantTanks SmokerName Rabid SpitterName Rabid } + Mob + { + MobVariants -1 + CommonName Rabid + WitchName Rabid + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -8776,6 +10151,7 @@ MutantTanks AbilityMessage 1 HurtHit 1 HurtHitMode 0 + HurtMode 1 } } Tank#107 @@ -8794,6 +10170,12 @@ MutantTanks SmokerName Tremor SpitterName Tremor } + Mob + { + MobVariants -1 + CommonName Tremor + WitchName Tremor + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -8842,7 +10224,7 @@ MutantTanks ComboChance 33.3,75.0 ComboDamage 1.0 ComboDuration 5.0 - ComboInterval 0.2 + ComboInterval 0.75 ComboRadius -1.25;1.25 ComboSet Rock,Track ComboSpeed 0.0,500.0 @@ -8856,6 +10238,11 @@ MutantTanks HumanDuration 5 AbilityEnabled 1 AbilityMessage 1 + RockChance 33.3 + RockDamage 5 + RockDuration 5 + RockInterval 0.75 + RockMode 0 } TrackAbility { @@ -8866,18 +10253,6 @@ MutantTanks AbilityMessage 1 TrackMode 1 } - SpamAbility - { - HumanAbility 1 - HumanAmmo 2 - HumanDuration 5 - AbilityEnabled 1 - AbilityMessage 1 - SpamChance 33.3 - SpamDamage 5 - SpamDuration 5 - SpamInterval 0.5 - } } /** * This is the plugin developer's personal Tank. @@ -8899,6 +10274,12 @@ MutantTanks SmokerName Psyk0tik SpitterName Psyk0tik } + Mob + { + MobVariants -1 + CommonName Psyk0tik + WitchName Psyk0tik + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -9027,6 +10408,12 @@ MutantTanks SmokerName Apocalyptic SpitterName Apocalyptic } + Mob + { + MobVariants -1 + CommonName Apocalyptic + WitchName Apocalyptic + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -9112,6 +10499,7 @@ MutantTanks RockDamage 10 RockDuration 3 RockInterval 0.2 + RockMode 1 RockRadius -5.0,5.0 } } @@ -9131,6 +10519,12 @@ MutantTanks SmokerName "Darth Vader" SpitterName "Darth Vader" } + Mob + { + MobVariants -1 + CommonName "Darth Vader" + WitchName "Darth Vader" + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -9159,7 +10553,16 @@ MutantTanks } Health { - ExtraHealth 1500 + ExtraHealth 1000 + Special + { + BoomerExtraHealth 100 + ChargerExtraHealth 100 + HunterExtraHealth 100 + JockeyExtraHealth 100 + SmokerExtraHealth 100 + SpitterExtraHealth 100 + } } Enhancements { @@ -9228,6 +10631,12 @@ MutantTanks SmokerName "Drug Addict" SpitterName "Drug Addict" } + Mob + { + MobVariants -1 + CommonName "Drug Addict" + WitchName "Drug Addict" + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -9240,7 +10649,7 @@ MutantTanks } HumanSupport { - HumanSupport 2 + HumanSupport 1 } Props { @@ -9256,18 +10665,22 @@ MutantTanks Particles { BodyEffects 32 + Common + { + BodyChance 100.0,100.0,100.0,100.0,100.0,33.3,100.0 + } } Health { - ExtraHealth 2000 + ExtraHealth 1000 Special { - BoomerExtraHealth 200 - ChargerExtraHealth 200 - HunterExtraHealth 200 - JockeyExtraHealth 200 - SmokerExtraHealth 200 - SpitterExtraHealth 200 + BoomerExtraHealth 100 + ChargerExtraHealth 100 + HunterExtraHealth 100 + JockeyExtraHealth 100 + SmokerExtraHealth 100 + SpitterExtraHealth 100 } } DrugAbility @@ -9282,12 +10695,13 @@ MutantTanks DrugHitMode 0 DrugInterval 1.0 } - ItemAbility + DropAbility { HumanAbility 1 - ItemPinata pain_pills,pain_pills,pain_pills,pain_pills,pain_pills - ItemPinataBody 1 - ItemPinataChance 100.0 + AbilityEnabled 2 + DropPinata pain_pills,pain_pills,pain_pills,pain_pills,pain_pills + DropPinataBody 1 + DropPinataChance 100.0 } SlowAbility { @@ -9319,6 +10733,12 @@ MutantTanks SmokerName Godspeed SpitterName Godspeed } + Mob + { + MobVariants -1 + CommonName Godspeed + WitchName Godspeed + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -9417,6 +10837,12 @@ MutantTanks SmokerName "Grim Reaper" SpitterName "Grim Reaper" } + Mob + { + MobVariants -1 + CommonName "Grim Reaper" + WitchName "Grim Reaper" + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -9505,6 +10931,12 @@ MutantTanks SmokerName Horde SpitterName Horde } + Mob + { + MobVariants -1 + CommonName Horde + WitchName Horde + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -9600,6 +11032,12 @@ MutantTanks SmokerName Hulk SpitterName Hulk } + Mob + { + MobVariants -1 + CommonName Hulk + WitchName Hulk + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -9669,6 +11107,7 @@ MutantTanks AbilityMessage 1 HurtHit 1 HurtHitMode 1 + HurtMode 1 } AbsorbAbility { @@ -9685,15 +11124,16 @@ MutantTanks AbsorbHittableDivisor 20.0 AbsorbMeleeDivisor 200.0 } - ShakeAbility + VisionAbility { HumanAbility 1 AbilityEnabled 1 AbilityEffect 7 - ShakeDuration 99999 - ShakeInterval 1.0 - ShakeRange 1000.0 - ShakeRangeChance 100.0 + VisionDuration 99999 + VisionInterval 1.0 + VisionMode 4 + VisionRange 1000.0 + VisionRangeChance 100.0 } SmashAbility { @@ -9704,6 +11144,8 @@ MutantTanks SmashChance 15.0 SmashHit 1 SmashHitMode 1 + SmashMode 1 + SmashType 1 Special { SmashBody 0 @@ -9727,6 +11169,12 @@ MutantTanks SmokerName Ninja SpitterName Ninja } + Mob + { + MobVariants -1 + CommonName Ninja + WitchName Ninja + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -9838,6 +11286,12 @@ MutantTanks SmokerName Zen SpitterName Zen } + Mob + { + MobVariants -1 + CommonName Zen + WitchName Zen + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -9933,6 +11387,12 @@ MutantTanks SmokerName "The Boss (1st Form)" SpitterName "The Boss (1st Form)" } + Mob + { + MobVariants -1 + CommonName "The Boss (1st Form)" + WitchName "The Boss (1st Form)" + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -10016,6 +11476,12 @@ MutantTanks SmokerName "Steel Overlord (2nd Form)" SpitterName "Steel Overlord (2nd Form)" } + Mob + { + MobVariants -1 + CommonName "Steel Overlord (2nd Form)" + WitchName "Steel Overlord (2nd Form)" + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -10116,6 +11582,12 @@ MutantTanks SmokerName "Night Stalker (3rd Form)" SpitterName "Night Stalker (3rd Form)" } + Mob + { + MobVariants -1 + CommonName "Night Stalker (3rd Form)" + WitchName "Night Stalker (3rd Form)" + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -10177,16 +11649,16 @@ MutantTanks { FireImmunity 1 } - BlindAbility + VisionAbility { AbilityEffect 7 AbilityMessage 1 - BlindChance 100.0 - BlindDuration 5.0 - BlindHit 1 - BlindHitMode 1 - BlindIntensity 255 - BlindMode 0 + VisionChance 100.0 + VisionDuration 5.0 + VisionHit 1 + VisionHitMode 1 + VisionIntensity 255 + VisionMode 1 } BombAbility { @@ -10236,6 +11708,12 @@ MutantTanks SmokerName "Spirit of Fire (4th Form)" SpitterName "Spirit of Fire (4th Form)" } + Mob + { + MobVariants -1 + CommonName "Spirit of Fire (4th Form)" + WitchName "Spirit of Fire (4th Form)" + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -10367,6 +11845,12 @@ MutantTanks SmokerName Randomizer SpitterName Randomizer } + Mob + { + MobVariants -1 + CommonName Randomizer + WitchName Randomizer + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -10440,6 +11924,12 @@ MutantTanks SmokerName Shapeshifter SpitterName Shapeshifter } + Mob + { + MobVariants -1 + CommonName Shapeshifter + WitchName Shapeshifter + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -10503,6 +11993,12 @@ MutantTanks SmokerName Flashbanger SpitterName Flashbanger } + Mob + { + MobVariants -1 + CommonName Flashbanger + WitchName Flashbanger + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -10541,24 +12037,24 @@ MutantTanks SpitterExtraHealth 100 } } - BlindAbility + VisionAbility { HumanAbility 1 HumanAmmo 2 AbilityEnabled 1 AbilityEffect 7 AbilityMessage 1 - BlindChance 33.3 - BlindDuration 5.0 - BlindHit 1 - BlindHitMode 0 - BlindIntensity 255 - BlindMode 1 - BlindRange 150.0 - BlindRangeChance 15.0 - BlindStagger 3 - } - } + VisionChance 33.3 + VisionDuration 5.0 + VisionHit 1 + VisionHitMode 0 + VisionIntensity 255 + VisionMode 2 + VisionRange 150.0 + VisionRangeChance 15.0 + VisionStagger 3 + } + } // The following sample showcases a certain type of the Splatter ability. Tank#125 { @@ -10577,6 +12073,12 @@ MutantTanks SmokerName Mudman SpitterName Mudman } + Mob + { + MobVariants -1 + CommonName Mudman + WitchName Mudman + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -10616,21 +12118,22 @@ MutantTanks SpitterExtraHealth 100 } } - SplatterAbility + VisionAbility { HumanAbility 1 HumanAmmo 2 AbilityEnabled 1 AbilityEffect 7 AbilityMessage 1 - SplatterChance 33.3 - SplatterDuration 5 - SplatterHit 1 - SplatterHitMode 0 - SplatterInterval 1.0 - SplatterRange 150.0 - SplatterRangeChance 15.0 - SplatterType 14 + VisionChance 33.3 + VisionDuration 5.0 + VisionHit 1 + VisionHitMode 0 + VisionInterval 1.0 + VisionMode 8 + VisionRange 150.0 + VisionRangeChance 15.0 + VisionType 14 } } // The following samples are impossible to beat and only serve as annoyances or fatal threats. @@ -10650,6 +12153,12 @@ MutantTanks SmokerName Endgame SpitterName Endgame } + Mob + { + MobVariants -1 + CommonName Endgame + WitchName Endgame + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -10696,6 +12205,13 @@ MutantTanks FastDuration 99999 FastSpeed 10.0 } + GravityAbility + { + AbilityEnabled 2 + AbilityMessage 4 + GravityFlags 8 + GravityForce -100.0 + } SmashAbility { HumanAbility 1 @@ -10705,6 +12221,8 @@ MutantTanks SmashChance 100.0 SmashHit 1 SmashHitMode 1 + SmashMode 1 + SmashType 1 Special { SmashBody 0 @@ -10728,6 +12246,12 @@ MutantTanks SmokerName Playful SpitterName Playful } + Mob + { + MobVariants -1 + CommonName Playful + WitchName Playful + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -10789,6 +12313,12 @@ MutantTanks SmokerName Annoying SpitterName Annoying } + Mob + { + MobVariants -1 + CommonName Annoying + WitchName Annoying + } TankEnabled -1 TankChance 100.0 TankNote 1 @@ -10821,13 +12351,2005 @@ MutantTanks { HumanAbility 1 HumanAmmo 99999 - AbilityEnabled 1 + AbilityEnabled 2 AbilityMessage 1 RespawnAmount 99999 RespawnChance 100.0 RespawnType 128-128 } } + Tank#129 + { + General + { + TankName Sipow + Special + { + SpecialTypes -1 + SpecialNote -1 + BoomerName Sipow + ChargerName Sipow + HunterName Sipow + JockeyName Sipow + SmokerName Sipow + SpitterName Sipow + } + Mob + { + MobVariants -1 + CommonName Sipow + WitchName Sipow + } + TankEnabled -1 + TankChance 100.0 + TankNote 1 + SkinColor 50,125,255,255 + } + Glow + { + GlowEnabled 1 + GlowColor 255,175,0 + } + HumanSupport + { + HumanSupport 1 + } + Props + { + LightColor 255,175,0,255 + OxygenTankColor 255,175,0,255 + FlameColor 255,175,0,180 + RockColor 255,175,0,255 + TireColor 255,175,0,255 + PropaneTankColor 255,175,0,255 + FlashlightColor 255,175,0,255 + CrownColor 255,175,0,255 + } + Particles + { + BodyEffects 80 + RockEffects 8 + } + Health + { + ExtraHealth 1000 + Special + { + BoomerExtraHealth 100 + ChargerExtraHealth 100 + HunterExtraHealth 100 + JockeyExtraHealth 100 + SmokerExtraHealth 100 + SpitterExtraHealth 100 + } + } + Enhancements + { + ThrowInterval 10.0 + RunSpeed 1.33 + } + Immunities + { + ExplosiveImmunity 1 + FireImmunity 1 + } + AcidAbility + { + HumanAbility 1 + HumanAmmo 2 + AbilityEnabled 1 + AbilityEffect 7 + AbilityMessage 5 + AcidChance 33.3 + AcidCooldown 3 + AcidDamage 3.0 + AcidDeath 1 + AcidDeathChance 33.3 + AcidDeathRange 200.0 + AcidHit 1 + AcidHitMode 0 + AcidRange 150.0 + AcidRangeChance 15.0 + AcidRockBreak 1 + AcidRockChance 33.3 + Special + { + AcidCooldown 3 + AcidDamage 1.0 + } + } + MeteorAbility + { + HumanAbility 1 + HumanAmmo 1 + HumanDuration 5 + AbilityEnabled 1 + AbilityMessage 1 + MeteorChance 15.0 + MeteorDuration 5 + MeteorInterval 0.6 + MeteorLifetime 15.0 + MeteorMode 0 + MeteorRadius -180.0,180.0 + } + } + Tank#130 + { + General + { + TankName Evil + Special + { + SpecialTypes -1 + SpecialNote -1 + BoomerName Evil + ChargerName Evil + HunterName Evil + JockeyName Evil + SmokerName Evil + SpitterName Evil + } + Mob + { + MobVariants -1 + CommonName Evil + WitchName Evil + } + TankEnabled -1 + TankChance 100.0 + TankNote 1 + SkinColor 170,20,60,255 + } + Glow + { + GlowEnabled 1 + GlowColor 0,0,140 + } + HumanSupport + { + HumanSupport 1 + } + Props + { + PropsAttached 124 + LightColor 0,0,140,255 + OxygenTankColor 0,0,140,255 + FlameColor 0,0,140,180 + RockColor 0,0,140,255 + TireColor 0,0,140,255 + PropaneTankColor 0,0,140,255 + FlashlightColor 0,0,140,255 + CrownColor 0,0,140,255 + } + Health + { + ExtraHealth 1000 + Special + { + BoomerExtraHealth 100 + ChargerExtraHealth 100 + HunterExtraHealth 100 + JockeyExtraHealth 100 + SmokerExtraHealth 100 + SpitterExtraHealth 100 + } + } + FireAbility + { + AbilityEffect 7 + AbilityMessage 1 + FireChance 100.0 + FireCooldown 3 + FireDamage 0.5 + FireHit 1 + FireHitMode 0 + Special + { + FireCooldown 3 + FireDamage 0.25 + } + } + IceAbility + { + AbilityEffect 7 + AbilityMessage 1 + IceChance 100.0 + IceCooldown 3 + IceHit 1 + IceHitMode 0 + Special + { + IceCooldown 3 + } + } + MedicAbility + { + HumanAbility 1 + HumanAmmo 2 + HumanDuration 6 + AbilityEnabled 1 + AbilityMessage 1 + MedicChance 100.0 + MedicDuration 0 + MedicField 1 + MedicFieldColor 0,255,0 + MedicHealth 25,25,25,25,25,25,100 + MedicInterval 1.0 + MedicMaxHealth 250,50,250,100,325,600,10000 + MedicRange 500.0 + } + RespawnAbility + { + HumanAbility 1 + HumanAmmo 2 + HumanDuration 5 + AbilityEnabled 1 + AbilityMessage 1 + RespawnChance 100.0 + RespawnDuration 0 + RespawnFilter 0 + RespawnRange 500.0 + } + } + Tank#131 + { + General + { + TankName Officer + Special + { + SpecialTypes -1 + SpecialNote -1 + BoomerName Officer + ChargerName Officer + HunterName Officer + JockeyName Officer + SmokerName Officer + SpitterName Officer + } + Mob + { + MobVariants -1 + CommonName Officer + WitchName Officer + } + TankEnabled -1 + TankChance 100.0 + TankNote 1 + SkinColor 100,100,100,255 + } + Glow + { + GlowEnabled 1 + GlowColor 100,100,100 + } + HumanSupport + { + HumanSupport 1 + } + Spawn + { + OpenAreasOnly 150.0 + } + Props + { + PropsAttached 242 //L4D1:194 + LightColor 0,0,255,255 + RockColor 0,0,0,255 + TireColor 100,100,100,255 + PropaneTankColor 0,0,0,255 + FlashlightColor 255,0,0,255 + } + Health + { + ExtraHealth 1000 + Special + { + BoomerExtraHealth 100 + ChargerExtraHealth 100 + HunterExtraHealth 100 + JockeyExtraHealth 100 + SmokerExtraHealth 100 + SpitterExtraHealth 100 + } + } + DropAbility + { + HumanAbility 1 + AbilityEnabled 1 + AbilityMessage 1 + DropChance 100.0 + DropMode 2 + DropWeaponBoost 1.15 + DropWeaponName tonfa + DropWeaponResistance 0.85 + DropWeaponScale 1.0 + } + GunnerAbility + { + HumanAbility 1 + HumanAmmo 2 + AbilityEnabled 1 + AbilityMessage 1 + GunnerAccuracy 2.0 + GunnerBullets 5 + GunnerChance 100.0 + GunnerClipSize 10 + GunnerDamage 5.0 + GunnerDuration 99999.0 + GunnerGunType 3 + GunnerInterval 1.0 + GunnerLoadTime 1.0 + GunnerRange 500.0 + GunnerReactionTime 1.0 + GunnerTargetType 7 + Special + { + GunnerClipSize 15 + GunnerDamage 1.0 + GunnerGunType 1 + GunnerTargetType 7 + } + } + MinionAbility + { + HumanAbility 1 + HumanAmmo 2 + AbilityEnabled 1 + AbilityMessage 1 + MinionAmount 4 + MinionChance 100.0 + MinionFilter 0 + MinionLifetime 0.0 + MinionRemove 1 + MinionReplace 1 + MinionType 131-131 + } + PanicAbility + { + Special + { + HumanAbility 1 + HumanAmmo 2 + AbilityEnabled 2 + AbilityMessage 1 + PanicAmount 1 + PanicChance 100.0 + PanicDuration 0 + PanicInterval 5.0 + PanicMode 2 + PanicType 64 + } + } + } + Tank#132 + { + General + { + TankName Mafia + Special + { + SpecialTypes -1 + SpecialNote -1 + BoomerName Mafia + ChargerName Mafia + HunterName Mafia + JockeyName Mafia + SmokerName Mafia + SpitterName Mafia + } + Mob + { + MobVariants -1 + CommonName Mafia + WitchName Mafia + } + TankEnabled -1 + TankChance 100.0 + TankNote 1 + SkinColor 180,0,180,255 + } + Glow + { + GlowEnabled 1 + GlowColor 180,0,180 + } + HumanSupport + { + HumanSupport 1 + } + Spawn + { + OpenAreasOnly 500.0 + } + Props + { + PropsAttached 0 + } + Health + { + ExtraHealth 1000 + Special + { + BoomerExtraHealth 100 + ChargerExtraHealth 100 + HunterExtraHealth 100 + JockeyExtraHealth 100 + SmokerExtraHealth 100 + SpitterExtraHealth 100 + } + } + Enhancements + { + RunSpeed 2.5 + } + CloneAbility + { + HumanAbility 1 + HumanAmmo 2 + AbilityEnabled 1 + AbilityMessage 1 + CloneAmount 2 + CloneChance 100.0 + CloneHealth 1500 + CloneLifetime 0.0 + CloneRemove 0 + CloneReplace 1 + CloneSwap 0.0 + CloneType 132-132 + Special + { + CloneHealth 150 + } + } + SmashAbility + { + AbilityEffect 7 + AbilityMessage 1 + SmashBody 1 + SmashChance 33.0 + SmashHit 1 + SmashHitMode 1 + SmashMode 1 + SmashType 1 + Special + { + SmashBody 0 + SmashMeter 50.0 + } + } + } + Tank#133 + { + General + { + TankName Frankenstein + Special + { + SpecialTypes -1 + SpecialNote -1 + BoomerName Frankenstein + ChargerName Frankenstein + HunterName Frankenstein + JockeyName Frankenstein + SmokerName Frankenstein + SpitterName Frankenstein + } + Mob + { + MobVariants -1 + CommonName Frankenstein + WitchName Frankenstein + } + TankEnabled -1 + TankChance 100.0 + TankNote 1 + SkinColor 85,125,75,255 + } + Glow + { + GlowEnabled 1 + GlowColor 85,125,75 + } + HumanSupport + { + HumanSupport 1 + } + Props + { + PropsAttached 16 //L4D1:0 + RockColor 100,100,100,255 + } + Health + { + ExtraHealth 1000 + Special + { + BoomerExtraHealth 100 + ChargerExtraHealth 100 + HunterExtraHealth 100 + JockeyExtraHealth 100 + SmokerExtraHealth 100 + SpitterExtraHealth 100 + } + } + Enhancements + { + ClawDamage 1.0 + HittableDamage 1.0 + RockDamage 1.0 + RunSpeed 0.65 + } + GhostAbility + { + AbilityEffect 7 + AbilityMessage 1 + GhostHit 1 + GhostHitMode 0 + GhostWeaponSlots 28 + } + JumpAbility + { + AbilityEnabled 2 + AbilityMessage 4 + JumpMode 1 + JumpSporadicChance 33.3 + JumpSporadicHeight 750.0 + } + UndeadAbility + { + HumanAbility 1 + HumanAmmo 2 + AbilityEnabled 1 + AbilityMessage 1 + UndeadAmount 2 + UndeadChance 100.0 + } + WarpAbility + { + AbilityEnabled 2 + AbilityMessage 4 + WarpInterval 10.0 + } + } + Tank#134 + { + General + { + TankName Prototype + Special + { + SpecialTypes -1 + SpecialNote -1 + BoomerName Prototype + ChargerName Prototype + HunterName Prototype + JockeyName Prototype + SmokerName Prototype + SpitterName Prototype + } + Mob + { + MobVariants -1 + CommonName Prototype + WitchName Prototype + } + TankEnabled -1 + TankChance 100.0 + TankNote 1 + SkinColor 75,75,75,255 + } + Glow + { + GlowEnabled 1 + GlowColor 255,25,55 + } + HumanSupport + { + HumanSupport 1 + } + Props + { + PropsAttached 18 //L4D1:2 + LightColor 255,25,55,255 + RockColor 255,25,55,255 + } + Health + { + ExtraHealth 1000 + Special + { + BoomerExtraHealth 100 + ChargerExtraHealth 100 + HunterExtraHealth 100 + JockeyExtraHealth 100 + SmokerExtraHealth 100 + SpitterExtraHealth 100 + } + } + AbsorbAbility + { + HumanAbility 1 + HumanAmmo 2 + HumanDuration 99999 + AbilityEnabled 1 + AbilityMessage 1 + AbsorbBulletDivisor 20.0 + AbsorbChance 100.0 + AbsorbDuration 99999 + AbsorbExplosiveDivisor 20.0 + AbsorbFireDivisor 200.0 + AbsorbHittableDivisor 20.0 + AbsorbMeleeDivisor 200.0 + } + SmashAbility + { + AbilityEffect 7 + AbilityMessage 1 + SmashBody 1 + SmashChance 33.3 + SmashHit 1 + SmashHitMode 0 + SmashMode 1 + SmashRemove 1 + SmashType 1 + Special + { + KamikazeBody 0 + KamikazeMeter 50.0 + } + } + OmniAbility + { + RequiresHumans 0 + HumanAbility 1 + HumanAmmo 3 + HumanDuration 5 + AbilityEnabled 1 + AbilityMessage 1 + OmniChance 33.3 + OmniDuration 5 + OmniMode 0 + OmniRange 500.0 + } + RespawnAbility + { + HumanAbility 1 + HumanAmmo 1 + AbilityEnabled 2 + AbilityMessage 1 + RespawnAmount 2 + RespawnChance 100.0 + RespawnType 134-134 + } + } + Tank#135 + { + General + { + TankName Zeus + Special + { + SpecialTypes -1 + SpecialNote -1 + BoomerName Zeus + ChargerName Zeus + HunterName Zeus + JockeyName Zeus + SmokerName Zeus + SpitterName Zeus + } + Mob + { + MobVariants -1 + CommonName Zeus + WitchName Zeus + } + TankEnabled -1 + TankChance 100.0 + TankNote 1 + SkinColor 175,40,255,255 + } + Glow + { + GlowEnabled 1 + GlowColor 0,100,155 + } + HumanSupport + { + HumanSupport 1 + } + Spawn + { + OpenAreasOnly 500.0 + } + Props + { + PropsAttached 272 //L4D1:224 + RockColor 0,100,155,255 + CrownColor 0,100,155,255 + } + Particles + { + BodyEffects 2 + RockEffects 2 + } + Health + { + ExtraHealth 1000 + Special + { + BoomerExtraHealth 100 + ChargerExtraHealth 100 + HunterExtraHealth 100 + JockeyExtraHealth 100 + SmokerExtraHealth 100 + SpitterExtraHealth 100 + } + } + Immunities + { + FireImmunity 1 + } + ElectricAbility + { + HumanAbility 1 + HumanAmmo 2 + AbilityEnabled 1 + AbilityEffect 7 + AbilityMessage 7 + ElectricChance 66.6 + ElectricDamage 5.0 + ElectricDuration 5 + ElectricHit 1 + ElectricHitMode 0 + ElectricInterval 1.0 + ElectricRange 150.0 + ElectricRangeChance 30.0 + } + LightningAbility + { + AbilityEnabled 1 + AbilityMessage 1 + LightningChance 100.0 + LightningDamage 5 + LightningDuration 99999 + LightningInterval 0.5 + } + SmashAbility + { + AbilityEffect 7 + AbilityMessage 1 + SmashBody 1 + SmashChance 15.0 + SmashHit 1 + SmashHitMode 1 + SmashMode 4 + SmashType 1 + Special + { + SmashBody 0 + SmashMeter 50.0 + } + } + WarpAbility + { + AbilityEnabled 2 + AbilityMessage 4 + WarpInterval 7.5 + } + } + Tank#136 + { + General + { + TankName Trajectory + Special + { + SpecialTypes -1 + SpecialNote -1 + BoomerName Trajectory + ChargerName Trajectory + HunterName Trajectory + JockeyName Trajectory + SmokerName Trajectory + SpitterName Trajectory + } + Mob + { + MobVariants -1 + CommonName Trajectory + WitchName Trajectory + } + TankEnabled -1 + TankChance 100.0 + TankNote 1 + SkinColor 255,150,75,255 + } + Glow + { + GlowEnabled 1 + GlowColor 55,150,125 + } + HumanSupport + { + HumanSupport 1 + } + Props + { + LightColor 55,150,125,255 + OxygenTankColor 55,150,125,255 + FlameColor 55,150,125,180 + RockColor 55,150,125,255 + TireColor 55,150,125,255 + PropaneTankColor 55,150,125,255 + FlashlightColor 55,150,125,255 + CrownColor 55,150,125,255 + } + Health + { + ExtraHealth 1000 + Special + { + BoomerExtraHealth 100 + ChargerExtraHealth 100 + HunterExtraHealth 100 + JockeyExtraHealth 100 + SmokerExtraHealth 100 + SpitterExtraHealth 100 + } + } + FastAbility + { + HumanAbility 1 + HumanAmmo 2 + HumanDuration 99999 + AbilityEnabled 1 + AbilityMessage 1 + FastChance 100.0 + FastDuration 99999 + FastSpeed 5.0 + } + JumpAbility + { + HumanAbility 1 + HumanAmmo 2 + HumanDuration 5 + AbilityEnabled 3 + AbilityEffect 7 + AbilityMessage 7 + JumpChance 33.3 + JumpDuration 5 + JumpHeight 300.0 + JumpHit 1 + JumpHitMode 0 + JumpMode 1 + JumpRange 150.0 + JumpRangeChance 15.0 + JumpSporadicChance 33.3 + JumpSporadicHeight 750.0 + } + WarpAbility + { + HumanAbility 1 + HumanAmmo 2 + HumanDuration 10 + AbilityEnabled 2 + AbilityMessage 4 + WarpDuration 0 + WarpInterval 7.5 + } + } + Tank#137 + { + General + { + TankName Barrage + Special + { + SpecialTypes -1 + SpecialNote -1 + BoomerName Barrage + ChargerName Barrage + HunterName Barrage + JockeyName Barrage + SmokerName Barrage + SpitterName Barrage + } + Mob + { + MobVariants -1 + CommonName Barrage + WitchName Barrage + } + TankEnabled -1 + TankChance 100.0 + TankNote 1 + SkinColor 150,80,125,255 + } + Glow + { + GlowEnabled 1 + GlowColor 40,80,165 + } + HumanSupport + { + HumanSupport 1 + } + Spawn + { + OpenAreasOnly 500.0 + } + Props + { + LightColor 40,80,165,255 + OxygenTankColor 40,80,165,255 + FlameColor 40,80,165,180 + RockColor 40,80,165,255 + TireColor 40,80,165,255 + PropaneTankColor 40,80,165,255 + FlashlightColor 40,80,165,255 + CrownColor 40,80,165,255 + } + Health + { + ExtraHealth 1000 + Special + { + BoomerExtraHealth 100 + ChargerExtraHealth 100 + HunterExtraHealth 100 + JockeyExtraHealth 100 + SmokerExtraHealth 100 + SpitterExtraHealth 100 + } + } + MeteorAbility + { + HumanAbility 1 + HumanAmmo 1 + HumanCooldown 0 + AbilityEnabled 1 + AbilityMessage 1 + MeteorChance 100.0 + MeteorDuration 99999 + MeteorInterval 0.6 + MeteorLifetime 15.0 + MeteorMode 1 + MeteorRadius -180.0,180.0 + } + RegenAbility + { + HumanAbility 1 + HumanAmmo 2 + HumanDuration 99999 + AbilityEnabled 1 + AbilityEffect 4 + AbilityMessage 1 + RegenChance 100.0 + RegenDuration 0 + RegenHealth 200 + RegenInterval 1.0 + RegenLimit 4000 + RegenRange 500.0 + Special + { + RegenHealth 20 + RegenLimit 400 + RegenRange 150.0 + } + } + RockAbility + { + RequiresHumans 0 + HumanAbility 1 + HumanAmmo 2 + HumanDuration 99999 + AbilityEnabled 1 + AbilityMessage 1 + RockChance 100.0 + RockDamage 5 + RockDuration 99999 + RockInterval 0.75 + RockMode 0 + RockRadius -5.0,5.0 + } + ShoveAbility + { + AbilityEffect 7 + AbilityMessage 1 + ShoveChance 66.6 + ShoveDuration 5 + ShoveHit 1 + ShoveHitMode 1 + ShoveInterval 1.0 + } + } + Tank#138 + { + General + { + TankName Collector + Special + { + SpecialTypes -1 + SpecialNote -1 + BoomerName Collector + ChargerName Collector + HunterName Collector + JockeyName Collector + SmokerName Collector + SpitterName Collector + } + Mob + { + MobVariants -1 + CommonName Collector + WitchName Collector + } + TankEnabled -1 + TankChance 100.0 + TankNote 1 + SkinColor 255,70,165,255 + } + Glow + { + GlowEnabled 1 + GlowColor 255,70,165 + } + HumanSupport + { + HumanSupport 1 + } + Spawn + { + OpenAreasOnly 500.0 + } + Props + { + PropsAttached 0 + } + Health + { + ExtraHealth 1000 + Special + { + BoomerExtraHealth 100 + ChargerExtraHealth 100 + HunterExtraHealth 100 + JockeyExtraHealth 100 + SmokerExtraHealth 100 + SpitterExtraHealth 100 + } + } + ChokeAbility + { + AbilityEffect 7 + AbilityMessage 1 + ChokeBlock 1 + ChokeChance 100.0 + ChokeDamage 1.0 + ChokeDelay 1.0 + ChokeDuration 99999 + ChokeHit 1 + ChokeHitMode 1 + } + GravityAbility + { + AbilityEnabled 2 + AbilityMessage 4 + GravityFlags 8 + GravityForce -50.0 + } + } + Tank#139 + { + General + { + TankName Timewalker + Special + { + SpecialTypes -1 + SpecialNote -1 + BoomerName Timewalker + ChargerName Timewalker + HunterName Timewalker + JockeyName Timewalker + SmokerName Timewalker + SpitterName Timewalker + } + Mob + { + MobVariants -1 + CommonName Timewalker + WitchName Timewalker + } + TankEnabled -1 + TankChance 100.0 + TankNote 1 + SkinColor 0,200,255,255 + } + Glow + { + GlowEnabled 1 + GlowColor 0,200,255 + } + HumanSupport + { + HumanSupport 1 + } + Props + { + PropsAttached 0 + } + Health + { + ExtraHealth 1000 + Special + { + BoomerExtraHealth 100 + ChargerExtraHealth 100 + HunterExtraHealth 100 + JockeyExtraHealth 100 + SmokerExtraHealth 100 + SpitterExtraHealth 100 + } + } + CloneAbility + { + HumanAbility 1 + HumanAmmo 2 + AbilityEnabled 1 + AbilityMessage 1 + CloneAmount 2 + CloneChance 100.0 + CloneHealth 1000 + CloneLifetime 10.0 + CloneRemove 0 + CloneReplace 1 + CloneSwap 5.0 + CloneType 139-139 + Special + { + CloneHealth 100 + } + } + FastAbility + { + HumanAbility 1 + HumanAmmo 2 + HumanDuration 3 + AbilityEnabled 1 + AbilityMessage 1 + FastChance 33.3 + FastDuration 3 + FastSpeed 10.0 + } + GhostAbility + { + AbilityEffect 7 + AbilityMessage 1 + GhostChance 15.0 + GhostHit 1 + GhostHitMode 0 + GhostWeaponSlots 28 + } + RecallAbility + { + HumanAbility 1 + HumanAmmo 5 + AbilityEnabled 3 + AbilityMessage 1 + RecallBlinkChance 0.0 + RecallBlinkCount 0 + RecallRewindChance 100.0 + RecallRewindCleanse 1 + RecallRewindCooldown 5 + RecallRewindLifetime 10 + RecallRewindMode 0 + RecallRewindThreshold 1.0 + } + UndeadAbility + { + HumanAbility 1 + HumanAmmo 2 + AbilityEnabled 1 + AbilityMessage 1 + UndeadAmount 2 + UndeadChance 100.0 + } + WarpAbility + { + AbilityEnabled 2 + AbilityMessage 4 + WarpInterval 10.0 + } + } + Tank#140 + { + General + { + TankName "Speed Demon" + Special + { + SpecialTypes -1 + SpecialNote -1 + BoomerName "Speed Demon" + ChargerName "Speed Demon" + HunterName "Speed Demon" + JockeyName "Speed Demon" + SmokerName "Speed Demon" + SpitterName "Speed Demon" + } + Mob + { + MobVariants -1 + CommonName "Speed Demon" + WitchName "Speed Demon" + } + TankEnabled -1 + TankChance 100.0 + TankNote 1 + SkinColor 100,0,0,255 + } + Glow + { + GlowEnabled 1 + GlowColor 255,200,60 + } + HumanSupport + { + HumanSupport 1 + } + Props + { + LightColor 255,200,60,255 + OxygenTankColor 255,200,60,255 + FlameColor 255,200,60,180 + RockColor 255,200,60,255 + TireColor 255,200,60,255 + PropaneTankColor 255,200,60,255 + FlashlightColor 255,200,60,255 + CrownColor 255,200,60,255 + } + Particles + { + BodyEffects 4 + RockEffects 4 + } + Health + { + ExtraHealth 1000 + Special + { + BoomerExtraHealth 100 + ChargerExtraHealth 100 + HunterExtraHealth 100 + JockeyExtraHealth 100 + SmokerExtraHealth 100 + SpitterExtraHealth 100 + } + } + Enhancements + { + RunSpeed 1.0 + } + FastAbility + { + HumanAbility 1 + HumanAmmo 2 + HumanDuration 3 + AbilityEnabled 1 + AbilityMessage 1 + FastChance 33.3 + FastDuration 3 + FastSpeed 10.0 + } + FireAbility + { + AbilityEffect 7 + AbilityMessage 1 + FireChance 100.0 + FireCooldown 3 + FireDamage 0.5 + FireHit 1 + FireHitMode 0 + Special + { + FireCooldown 3 + FireDamage 0.25 + } + } + PyroAbility + { + HumanAbility 1 + HumanAmmo 2 + HumanDuration 3 + AbilityEnabled 1 + AbilityMessage 1 + PyroChance 33.3 + PyroDamageBoost 2.0 + PyroDuration 3 + PyroFireDivisor 1.0 + PyroMode 0 + PyroReignite 1 + PyroSpeedBoost 9.0 + Special + { + PyroFireDivisor 400.0 + } + } + SlowAbility + { + AbilityEnabled 1 + AbilityEffect 7 + AbilityMessage 2 + SlowChance 100.0 + SlowDuration 99999.0 + SlowRange 500.0 + SlowRangeChance 100.0 + SlowSpeed 0.65 + } + } + Tank#141 + { + General + { + TankName Ravager + Special + { + SpecialTypes -1 + SpecialNote -1 + BoomerName Ravager + ChargerName Ravager + HunterName Ravager + JockeyName Ravager + SmokerName Ravager + SpitterName Ravager + } + Mob + { + MobVariants -1 + CommonName Ravager + WitchName Ravager + } + TankEnabled -1 + TankChance 100.0 + TankNote 1 + SkinColor 240,20,60,255 + } + Glow + { + GlowEnabled 1 + GlowColor 75,100,90 + } + HumanSupport + { + HumanSupport 1 + } + Spawn + { + OpenAreasOnly 500.0 + } + Props + { + LightColor 75,100,90,255 + OxygenTankColor 75,100,90,255 + FlameColor 75,100,90,180 + RockColor 75,100,90,255 + TireColor 75,100,90,255 + PropaneTankColor 75,100,90,255 + FlashlightColor 75,100,90,255 + CrownColor 75,100,90,255 + } + Health + { + ExtraHealth 1000 + Special + { + BoomerExtraHealth 100 + ChargerExtraHealth 100 + HunterExtraHealth 100 + JockeyExtraHealth 100 + SmokerExtraHealth 100 + SpitterExtraHealth 100 + } + } + BombAbility + { + HumanAbility 1 + AbilityMessage 4 + BombRockBreak 1 + BombRockChance 100.0 + } + RockAbility + { + RequiresHumans 0 + HumanAbility 1 + HumanAmmo 2 + HumanDuration 99999 + AbilityEnabled 1 + AbilityMessage 1 + RockChance 100.0 + RockDamage 5 + RockDuration 99999 + RockInterval 1.5 + RockMode 0 + RockRadius -5.0,5.0 + } + } + Tank#142 + { + General + { + TankName Ramattra + Special + { + SpecialTypes -1 + SpecialNote -1 + BoomerName Ramattra + ChargerName Ramattra + HunterName Ramattra + JockeyName Ramattra + SmokerName Ramattra + SpitterName Ramattra + } + Mob + { + MobVariants -1 + CommonName Ramattra + WitchName Ramattra + } + TankEnabled -1 + TankChance 100.0 + TankNote 1 + SkinColor 35,35,35,255 + } + Glow + { + GlowEnabled 1 + GlowColor 160,80,255 + } + HumanSupport + { + HumanSupport 1 + } + Props + { + PropsAttached 380 + LightColor 160,80,255,255 + OxygenTankColor 185,180,135,255 + FlameColor 160,80,255,180 + RockColor 185,180,135,255 + TireColor 185,180,135,255 + PropaneTankColor 255,255,255,255 + FlashlightColor 160,80,255,255 + CrownColor 160,80,255,255 + } + Health + { + ExtraHealth 1000 + Special + { + BoomerExtraHealth 100 + ChargerExtraHealth 100 + HunterExtraHealth 100 + JockeyExtraHealth 100 + SmokerExtraHealth 100 + SpitterExtraHealth 100 + } + } + AbsorbAbility + { + RequiresHumans 0 + HumanAbility 1 + HumanAmmo 2 + HumanDuration 5 + AbilityEnabled 1 + AbilityMessage 1 + AbsorbBulletDivisor 20.0 + AbsorbChance 15.0 + AbsorbConvertPercentage 0.0 + AbsorbDuration 10 + AbsorbExplosiveDivisor 20.0 + AbsorbFireDivisor 200.0 + AbsorbHittableDivisor 20.0 + AbsorbMeleeDivisor 200.0 + } + RegenAbility + { + HumanAbility 1 + HumanAmmo 2 + HumanDuration 5 + AbilityEnabled 1 + AbilityEffect 4 + AbilityMessage 1 + AbilitySight 1 + RegenChance 100.0 + RegenDuration 0 + RegenHealth 1 + RegenInterval 1.0 + RegenLimit 1000000 + RegenRange 500.0 + Special + { + RegenLimit 100000 + RegenRange 150.0 + } + } + ShieldAbility + { + RequiresHumans 0 + HumanAbility 1 + AbilityEnabled 1 + AbilityMessage 1 + ShieldChance 15.0 + ShieldConvertPercentage 0.2 + ShieldColor 160,80,255,50 + ShieldDelay 10 + ShieldDisplayHealth 11 + ShieldDisplayHealthType 2 + ShieldDuration 0 + ShieldHealth 250.0 + ShieldHealthCharacters ],= + ShieldType 15 + Special + { + ShieldHealth 100.0 + } + } + SlowAbility + { + AbilityEnabled 1 + AbilityEffect 7 + AbilityMessage 2 + AbilitySight 1 + SlowChance 100.0 + SlowDuration 99999.0 + SlowRange 500.0 + SlowRangeChance 100.0 + SlowSpeed 0.4 + } + } + Tank#143 + { + General + { + TankName Sigma + Special + { + SpecialTypes -1 + SpecialNote -1 + BoomerName Sigma + ChargerName Sigma + HunterName Sigma + JockeyName Sigma + SmokerName Sigma + SpitterName Sigma + } + Mob + { + MobVariants -1 + CommonName Sigma + WitchName Sigma + } + TankEnabled -1 + TankChance 100.0 + TankNote 1 + SkinColor 80,80,80,255 + } + Glow + { + GlowEnabled 1 + GlowColor 130,130,180 + } + HumanSupport + { + HumanSupport 1 + } + Props + { + PropsAttached 124 + LightColor 130,130,180,255 + OxygenTankColor 65,200,170,255 + FlameColor 130,130,180,180 + RockColor 65,200,170,255 + TireColor 65,200,170,255 + PropaneTankColor 60,0,110,255 + FlashlightColor 130,130,180,255 + CrownColor 130,130,180,255 + } + Health + { + ExtraHealth 1000 + Special + { + BoomerExtraHealth 100 + ChargerExtraHealth 100 + HunterExtraHealth 100 + JockeyExtraHealth 100 + SmokerExtraHealth 100 + SpitterExtraHealth 100 + } + } + AbsorbAbility + { + RequiresHumans 0 + HumanAbility 1 + HumanAmmo 2 + HumanDuration 5 + AbilityEnabled 1 + AbilityMessage 1 + AbsorbBulletDivisor 20.0 + AbsorbChance 15.0 + AbsorbConvertPercentage 0.75 + AbsorbDuration 10 + AbsorbExplosiveDivisor 20.0 + AbsorbFireDivisor 200.0 + AbsorbHittableDivisor 20.0 + AbsorbMeleeDivisor 200.0 + } + ChokeAbility + { + HumanAbility 1 + HumanAmmo 2 + AbilityEnabled 1 + AbilityEffect 7 + AbilityMessage 3 + AbilitySight 1 + ChokeBlock 0 + ChokeChance 33.3 + ChokeDamage 10.0 + ChokeDelay 0.5 + ChokeDuration 3 + ChokeHit 1 + ChokeHitMode 0 + ChokeRange 150.0 + ChokeRangeChance 15.0 + } + GravityAbility + { + HumanAbility 1 + AbilityEnabled 2 + AbilityMessage 4 + GravityFlags 8 + GravityForce -25.0 + } + ShieldAbility + { + RequiresHumans 0 + HumanAbility 1 + AbilityEnabled 1 + AbilityMessage 1 + ShieldChance 15.0 + ShieldConvertPercentage 0.15 + ShieldColor 130,130,180,50 + ShieldDelay 10 + ShieldDisplayHealth 11 + ShieldDisplayHealthType 2 + ShieldDuration 0 + ShieldHealth 700.0 + ShieldHealthCharacters ],= + ShieldType 15 + Special + { + ShieldHealth 70.0 + } + } + } + Tank#144 + { + General + { + TankName Zarya + Special + { + SpecialTypes -1 + SpecialNote -1 + BoomerName Zarya + ChargerName Zarya + HunterName Zarya + JockeyName Zarya + SmokerName Zarya + SpitterName Zarya + } + Mob + { + MobVariants -1 + CommonName Zarya + WitchName Zarya + } + TankEnabled -1 + TankChance 100.0 + TankNote 1 + SkinColor 55,110,255,255 + } + Glow + { + GlowEnabled 1 + GlowColor 255,130,255 + } + HumanSupport + { + HumanSupport 1 + } + Props + { + PropsAttached 0 + } + Health + { + ExtraHealth 1000 + Special + { + BoomerExtraHealth 100 + ChargerExtraHealth 100 + HunterExtraHealth 100 + JockeyExtraHealth 100 + SmokerExtraHealth 100 + SpitterExtraHealth 100 + } + } + Enhancements + { + RunSpeed 0.65 + } + AbsorbAbility + { + RequiresHumans 0 + HumanAbility 1 + HumanAmmo 2 + HumanDuration 5 + AbilityEnabled 1 + AbilityMessage 1 + AbsorbBulletDivisor 20.0 + AbsorbChance 15.0 + AbsorbConvertPercentage 0.75 + AbsorbDuration 10 + AbsorbExplosiveDivisor 20.0 + AbsorbFireDivisor 200.0 + AbsorbHittableDivisor 20.0 + AbsorbMeleeDivisor 200.0 + } + GravityAbility + { + HumanAbility 1 + AbilityEnabled 2 + AbilityMessage 4 + GravityFlags 8 + GravityForce -25.0 + } + ShieldAbility + { + RequiresHumans 0 + HumanAbility 1 + AbilityEnabled 1 + AbilityMessage 1 + ShieldChance 15.0 + ShieldConvertPercentage 0.15 + ShieldColor 255,130,255,50 + ShieldDelay 15 + ShieldDisplayHealth 11 + ShieldDisplayHealthType 2 + ShieldDuration 5 + ShieldHealth 225.0 + ShieldHealthCharacters ],= + ShieldType 15 + Special + { + ShieldHealth 22.5 + } + } + } + //Thefollowingsamplesareforpunishingrushers/slackers. + Tank#145 + { + General + { + TankName Slacker + Special + { + SpecialTypes -1 + SpecialNote -1 + BoomerName Slacker + ChargerName Slacker + HunterName Slacker + JockeyName Slacker + SmokerName Slacker + SpitterName Slacker + } + Mob + { + MobVariants -1 + CommonName Slacker + WitchName Slacker + } + TankEnabled -1 + TankChance 100.0 + TankNote 0 + SkinColor 100,100,100,255 + SpawnEnabled 0 + } + Announcements + { + AnnounceArrival 0 + AnnounceDeath 0 + AnnounceKill 0 + ArrivalMessage 0 + ArrivalSound 0 + DeathDetails 0 + DeathMessage 0 + DeathSound 0 + KillMessage 0 + VocalizeArrival 0 + VocalizeDeath 0 + } + Props + { + PropsAttached 0 + } + Health + { + BaseHealth 1000000 + DisplayHealth 0 + DisplayHealthType 0 + Special + { + BoomerBaseHealth 100000 + ChargerBaseHealth 100000 + HunterBaseHealth 100000 + JockeyBaseHealth 100000 + SmokerBaseHealth 100000 + SpitterBaseHealth 100000 + } + } + Enhancements + { + AttackInterval 0.1 + IntangibleBody 1 + PunchThrow 0.0 + SkipTaunt 1 + } + FastAbility + { + HumanAbility 2 + HumanAmmo 2 + HumanDuration 99999 + AbilityEnabled 1 + AbilityMessage 0 + FastChance 100.0 + FastDash 5.0 + FastDashChance 50.0 + FastDashRange 150.0 + FastDuration 99999 + FastSpeed 10.0 + } + GravityAbility + { + AbilityEnabled 2 + AbilityMessage 0 + GravityFlags 8 + GravityForce -100.0 + } + WarpAbility + { + HumanAbility 2 + AbilityEffect 7 + AbilityMessage 0 + WarpChance 100.0 + WarpHit 1 + WarpHitMode 1 + } + } + Tank#146 + { + General + { + TankName Rusher + Special + { + SpecialTypes -1 + SpecialNote -1 + BoomerName Rusher + ChargerName Rusher + HunterName Rusher + JockeyName Rusher + SmokerName Rusher + SpitterName Rusher + } + Mob + { + MobVariants -1 + CommonName Rusher + WitchName Rusher + } + TankEnabled -1 + TankChance 100.0 + TankNote 0 + SkinColor 150,0,0,255 + SpawnEnabled 0 + } + Announcements + { + AnnounceArrival 0 + AnnounceDeath 0 + AnnounceKill 0 + ArrivalMessage 0 + ArrivalSound 0 + DeathDetails 0 + DeathMessage 0 + DeathSound 0 + KillMessage 0 + VocalizeArrival 0 + VocalizeDeath 0 + } + Props + { + PropsAttached 0 + } + Health + { + BaseHealth 1000000 + DisplayHealth 0 + DisplayHealthType 0 + Special + { + BoomerBaseHealth 100000 + ChargerBaseHealth 100000 + HunterBaseHealth 100000 + JockeyBaseHealth 100000 + SmokerBaseHealth 100000 + SpitterBaseHealth 100000 + } + } + Enhancements + { + AttackInterval 0.1 + IntangibleBody 1 + PunchThrow 0.0 + SkipTaunt 1 + } + FastAbility + { + HumanAbility 2 + HumanAmmo 2 + HumanDuration 99999 + AbilityEnabled 1 + AbilityMessage 0 + FastChance 100.0 + FastDash 5.0 + FastDashChance 50.0 + FastDashRange 150.0 + FastDuration 99999 + FastSpeed 10.0 + } + GravityAbility + { + AbilityEnabled 2 + AbilityMessage 0 + GravityFlags 8 + GravityForce -100.0 + } + FireAbility + { + HumanAbility 2 + AbilityEffect 7 + AbilityMessage 0 + FireChance 100.0 + FireHit 1 + FireHitMode 1 + } + IceAbility + { + HumanAbility 2 + AbilityEffect 7 + AbilityMessage 0 + IceChance 100.0 + IceDuration 5.0 + IceHit 1 + IceHitMode 1 + } + } /** * Create your own Mutant Tanks below! * Start your imagination here! diff --git a/addons/sourcemod/data/mutant_tanks/backup_config/format3/mutant_tanks.cfg b/addons/sourcemod/data/mutant_tanks/backup_config/format3/mutant_tanks.cfg index ec665ca8f4..dbaecbc2d0 100644 --- a/addons/sourcemod/data/mutant_tanks/backup_config/format3/mutant_tanks.cfg +++ b/addons/sourcemod/data/mutant_tanks/backup_config/format3/mutant_tanks.cfg @@ -21,6 +21,7 @@ Mutant_Tanks { Plugin_Enabled Yes Auto_Update On + Graphics_Level Max Bullet_Fix Max Kick_Bots Min Listen_Support Enabled @@ -38,11 +39,29 @@ Mutant_Tanks Cycle_Types Min Spawn_Enabled Max Spawn_Limit Min - Type_Range 1-128 + Type_Range 1-146 Special { Special_Types Min } + Mob + { + Mob_Variants Min + Common_Bio_Chance 50.0 + Common_Chance 100.0 + Common_Check 300.0 + Common_Damage_Points 50.0 + Common_Death_Points 100.0 + Common_Filter 0 + Common_Goal 5000.0 + Common_Variant 0 + Witch_Chance 100.0 + Witch_Filter 0 + Witch_Mode 0 + Witch_Mutate_Chance 100.0 + Witch_Range 500.0 + Witch_Types 0 + } } Announcements { @@ -64,6 +83,22 @@ Mutant_Tanks Announce_Kill Min } } + Punishment + { + Punish_Enabled -1,-1 //145,146 + Punish_Bots -1,-1 //145,146 + Finale_Check 0 + Punisher_Types 127,127 + Punisher_Lifetime 5.0,5.0 + Warning_Distance 500.0,1000.0 + Punish_Distance 1000.0,2000.0 + Warning_Limit 3,3 + Warning_Interval 5,5 + Survivor_Types 1 + Survivors_Required 3 + Incaps_Required 2 + Zed_Time 1.0,1.0 + } Rewards { Reward_Enabled -1,-1,-1,-1 @@ -78,50 +113,69 @@ Mutant_Tanks Share_Rewards 0,0,0,0 Teammate_Limit 0 Action_Duration_Reward 2.0,2.0,2.0,2.0 + Adrenaline_Time_Reward 30.0,30.0,30.0,30.0 Ammo_Boost_Reward 1,1,1,1 + Ammo_Refill_Reward 1,1,1,1 Ammo_Regen_Reward 1,1,1,1 Attack_Boost_Reward 1.25,1.25,1.25,1.25 Blaze_Health_Reward 1,1,1,1 + Blood_Donor_Reward 0,0,0,0 Bunny_Hop_Reward 1,1,1,1 Burst_Doors_Reward 1,1,1,1 Clean_Kills_Reward 1,1,1,1 Cluster_Bombs_Reward 3,3,3,3 Damage_Boost_Reward 1.25,1.25,1.25,1.25 Damage_Resistance_Reward 0.5,0.5,0.5,0.5 + Dopamine_Radius_Reward 150.0,150.0,150.0,150.0 + Eternal_Flames_Reward 1,1,1,1 Fall_Voiceline_Reward PlayerLaugh,PlayerLaugh,PlayerLaugh,PlayerLaugh + Fast_Recovery_Reward 1,1,1,1 + Fire_Rate_Reward 1.25,1.25,1.25,1.25 Friendly_Fire_Reward 1,1,1,1 Ghost_Bullets_Reward 1,1,1,1 + Grenade_Launcher_Reward 10.0,10.0,10.0,10.0 Heal_Percent_Reward 100.0,100.0,100.0,100.0 + Healthcare_Radius_Reward 150.0,150.0,150.0,150.0 Health_Regen_Reward 1,1,1,1 - Hollowpoint_Ammo_Reward 1,1,1,1 - Inextinguishable_Fire_Reward 1,1,1,1 + Heartbeat_Reward 3.0,3.0,3.0,3.0 + Hollowpoint_Ammo_Reward 100.0,100.0,100.0,100.0 Infinite_Ammo_Reward 31,31,31,31 Item_Reward first_aid_kit,first_aid_kit,first_aid_kit,first_aid_kit Jump_Height_Reward 75.0,75.0,75.0,75.0 Ladder_Actions_Reward 1,1,1,1 - Lady_Killer_Reward 1,1,1,1 + Lady_Killer_Reward 25.0,25.0,25.0,25.0 Laser_Sight_Reward 1,1,1,1 Life_Leech_Reward 1,1,1,1 + Lucky_Bullet_Reward 25.0,25.0,25.0,25.0 Medical_Cuts_Reward 1,1,1,1 Melee_Range_Reward 150,150,150,150 Midair_Dashes_Reward 2,2,2,2 + Motivation_Radius_Reward 150.0,150.0,150.0,150.0 + Overdose_Radius_Reward 150.0,150.0,150.0,150.0 + Overhealth_Reward 200,200,200,200 Pipebomb_Duration_Reward 10.0,10.0,10.0,10.0 Punch_Resistance_Reward 0.25,0.25,0.25,0.25 Rapid_Pistol_Reward 0.130,0.130,0.130,0.130 Recoil_Dampener_Reward 1,1,1,1 Refill_Percent_Reward 100.0,100.0,100.0,100.0 Regen_Bursts_Reward 1,1,1,1 + Reload_Rate_Reward 1.25,1.25,1.25,1.25 Respawn_Loadout_Reward 1,1,1,1 Revive_Health_Reward 100,100,100,100 + Riot_Gear_Reward 1,1,1,1 + Safety_Bubble_Reward 1,1,1,1 + Shockwave_Radius_Reward 150.0,150.0,150.0,150.0 Shove_Damage_Reward 0.025,0.025,0.025,0.025 Shove_Penalty_Reward 1,1,1,1 Shove_Rate_Reward 0.7,0.7,0.7,0.7 - Sledgehammer_Rounds_Reward 1,1,1,1 + Sledgehammer_Rounds_Reward 100.0,100.0,100.0,100.0 Special_Ammo_Reward 3,3,3,3 Speed_Boost_Reward 1.25,1.25,1.25,1.25 Stack_Limits 0,0,0,0,0,0,0 Stack_Rewards 0,0,0,0 Sticky_Grenades_Reward 1,1,1,1 + Supplier_Reward 3.0,3.0,3.0,3.0 + Swing_Rate_Reward 1.25,1.25,1.25,1.25 Syringe_Darts_Reward 1,1,1,1 Thorns_Reward 1,1,1,1 Useful_Rewards 15,15,15,15 @@ -139,6 +193,533 @@ Mutant_Tanks Reward_Bots -1,-1,-1,-1 } } + Survivors + { + Carrier_Enabled 0 + Carrier_Bots 0 + Carrier_Body 0 + Carrier_Chance 0.0 + Carrier_Cleanse 0 + Carrier_Damage_Multiplier 0.0 + Carrier_Delay 0.0 + Carrier_Filter 0 + Carrier_Health_Multiplier 0.0 + Carrier_Infection 0 + Carrier_Mix 0 + Carrier_Mode 0 + Carrier_Teleport 0 + Carrier_Type 0 + Carrier_Voice 0 + Carrier_Voice_Chance 0.0 + Carrier_Voice_Interval 0.0 + Carrier_Attack_Voicelines "" + Carrier_Bait_Voicelines "" + Passive_Enabled -1 + Passive_Bots -1 + Passive_Notify 0 + Action_Duration_Passive 0.0 + Adrenaline_Time_Passive 0.0 + Ammo_Boost_Passive 0 + Ammo_Refill_Passive 0 + Ammo_Regen_Passive 0 + Attack_Boost_Passive 0.0 + Blaze_Health_Passive 0 + Blood_Donor_Passive 0 + Bunny_Hop_Passive 0 + Burst_Doors_Passive 0 + Clean_Kills_Passive 0 + Cluster_Bombs_Passive 0 + Damage_Boost_Passive 0.0 + Damage_Resistance_Passive 0.0 + Dopamine_Radius_Passive 0.0 + Eternal_Flames_Passive 0 + Fast_Recovery_Passive 0 + Fire_Rate_Passive 0.0 + Friendly_Fire_Passive 0 + Ghost_Bullets_Passive 0 + Grenade_Launcher_Passive 0.0 + Heal_Percent_Passive 0.0 + Healthcare_Radius_Passive 0.0 + Health_Regen_Passive 0 + Heartbeat_Passive 0.0 + Hollowpoint_Ammo_Passive 0.0 + Infinite_Ammo_Passive 0 + Item_Passive "" + Jump_Height_Passive 0.0 + Ladder_Actions_Passive 0 + Lady_Killer_Passive 0.0 + Laser_Sight_Passive 0 + Life_Leech_Passive 0 + Lucky_Bullet_Passive 0.0 + Medical_Cuts_Passive 0 + Melee_Range_Passive 0 + Midair_Dashes_Passive 0 + Motivation_Radius_Passive 0.0 + Overdose_Radius_Passive 0.0 + Overhealth_Passive 0 + Pipebomb_Duration_Passive 0.0 + Punch_Resistance_Passive 0.0 + Rapid_Pistol_Passive 0.0 + Recoil_Dampener_Passive 0 + Refill_Percent_Passive 0.0 + Regen_Bursts_Passive 0 + Reload_Rate_Passive 0.0 + Respawn_Loadout_Passive 0 + Revive_Health_Passive 0 + Riot_Gear_Passive 0 + Safety_Bubble_Passive 0 + Shockwave_Radius_Passive 0.0 + Shove_Damage_Passive 0.0 + Shove_Penalty_Passive 0 + Shove_Rate_Passive 0.0 + Sledgehammer_Rounds_Passive 0.0 + Special_Ammo_Passive 0 + Speed_Boost_Passive 0.0 + Sticky_Grenades_Passive 0 + Supplier_Passive 0.0 + Swing_Rate_Passive 0.0 + Syringe_Darts_Passive 0 + Thorns_Passive 0 + weapon_pistol // Fire faster and no shove fatigue while pistol is being held + { + Weapon_Index 1 + Passive_Enabled -1 //9 + Passive_Bots -1 //9 + Stack_Passives 0 + Blood_Donor_Passive 2 + Rapid_Pistol_Passive 0.130 + Shove_Penalty_Passive 1 + Syringe_Darts_Passive 1 + } + weapon_pistol_magnum // Fire faster and no shove fatigue while magnum pistol is being held + { + Weapon_Index 2 + Passive_Enabled -1 //12 + Passive_Bots -1 //12 + Stack_Passives 0 + Ghost_Bullets_Passive 1 + Hollowpoint_Ammo_Passive 100.0 + Rapid_Pistol_Passive 0.130 + Shove_Penalty_Passive 1 + Sledgehammer_Rounds_Passive 0.5 + } + weapon_smg // Shoot grenades and perform ladder actions while uzi is being held + { + Weapon_Index 3 + Passive_Enabled -1 //26 + Passive_Bots -1 //26 + Stack_Passives 0 + Grenade_Launcher_Passive 25.0 + Ladder_Actions_Passive 1 + Midair_Dashes_Passive 1 + } + weapon_smg_silenced // Shoot grenades and perform ladder actions while silenced uzi is being held + { + Weapon_Index 4 + Passive_Enabled -1 //26 + Passive_Bots -1 //26 + Stack_Passives 0 + Grenade_Launcher_Passive 25.0 + Ladder_Actions_Passive 1 + Jump_Height_Passive 65.0 + } + weapon_smg_mp5 // Shoot grenades and perform ladder actions while mp5 uzi is being held + { + Weapon_Index 5 + Passive_Enabled -1 //26 + Passive_Bots -1 //26 + Stack_Passives 0 + Grenade_Launcher_Passive 25.0 + Ladder_Actions_Passive 1 + Speed_Boost_Passive 1.125 + } + weapon_rifle // Remove recoil and deal more damage while m16 rifle is being held + { + Weapon_Index 6 + Passive_Enabled -1 //20 + Passive_Bots -1 //20 + Stack_Passives 0 + Damage_Boost_Passive 1.2 + Grenade_Launcher_Passive 25.0 + Recoil_Dampener_Passive 1 + } + weapon_rifle_ak47 // Remove recoil and deal more damage while ak47 rifle is being held + { + Weapon_Index 7 + Passive_Enabled -1 //4 + Passive_Bots -1 //4 + Stack_Passives 0 + Damage_Boost_Passive 1.1 + Laser_Sight_Passive 1 + Recoil_Dampener_Passive 1 + } + weapon_rifle_desert // Remove recoil and deal more damage while scar-l rifle is being held + { + Weapon_Index 8 + Passive_Enabled -1 //20 + Passive_Bots -1 //20 + Stack_Passives 0 + Damage_Boost_Passive 1.125 + Recoil_Dampener_Passive 1 + Special_Ammo_Passive 3 + } + weapon_rifle_sg552 // Remove recoil and deal more damage while sg552 rifle is being held + { + Weapon_Index 9 + Passive_Enabled -1 //20 + Passive_Bots -1 //20 + Stack_Passives 0 + Damage_Boost_Passive 1.15 + Lucky_Bullet_Passive 33.3 + Recoil_Dampener_Passive 1 + } + weapon_pumpshotgun // Reload faster and knock back zombies while pump shotgun is being held + { + Weapon_Index 10 + Passive_Enabled -1 //12 + Passive_Bots -1 //12 + Stack_Passives 0 + Reload_Rate_Passive 1.6 + Shove_Penalty_Passive 1 + Sledgehammer_Rounds_Passive 1.0 + } + weapon_shotgun_chrome // Reload faster and knock back zombies while chrome shotgun is being held + { + Weapon_Index 11 + Passive_Enabled -1 //12 + Passive_Bots -1 //12 + Stack_Passives 0 + Reload_Rate_Passive 1.6 + Shove_Damage_Passive 0.025 + Sledgehammer_Rounds_Passive 1.0 + } + weapon_autoshotgun // Reload faster and knock back zombies while auto shotgun is being held + { + Weapon_Index 12 + Passive_Enabled -1 //28 + Passive_Bots -1 //28 + Stack_Passives 0 + Grenade_Launcher_Passive 10.0 + Reload_Rate_Passive 1.6 + Sledgehammer_Rounds_Passive 1.0 + } + weapon_shotgun_spas // Reload faster and knock back zombies while spas shotgun is being held + { + Weapon_Index 13 + Passive_Enabled -1 //12 + Passive_Bots -1 //12 + Stack_Passives 0 + Lady_Killer_Passive 50.0 + Reload_Rate_Passive 1.6 + Sledgehammer_Rounds_Passive 1.0 + } + weapon_hunting_rifle // Shoot through walls and shoot stronger bullets while hunting rifle is being held + { + Weapon_Index 14 + Passive_Enabled -1 //20 + Passive_Bots -1 //20 + Stack_Passives 0 + Ghost_Bullets_Passive 1 + Grenade_Launcher_Passive 10.0 + Hollowpoint_Ammo_Passive 100.0 + } + weapon_sniper_military // Shoot through walls and shoot stronger bullets while military rifle is being held + { + Weapon_Index 15 + Passive_Enabled -1 //68 + Passive_Bots -1 //68 + Stack_Passives 0 + Clean_Kills_Passive 1 + Ghost_Bullets_Passive 1 + Hollowpoint_Ammo_Passive 100.0 + } + weapon_sniper_awp // Shoot through walls and shoot stronger bullets while awp rifle is being held + { + Weapon_Index 16 + Passive_Enabled -1 //4 + Passive_Bots -1 //4 + Stack_Passives 0 + Damage_Boost_Passive 2.0 + Ghost_Bullets_Passive 1 + Hollowpoint_Ammo_Passive 100.0 + } + weapon_sniper_scout // Shoot through walls and shoot stronger bullets while steyr scout rifle is being held + { + Weapon_Index 17 + Passive_Enabled -1 //12 + Passive_Bots -1 //12 + Stack_Passives 0 + Ghost_Bullets_Passive 1 + Hollowpoint_Ammo_Passive 100.0 + Reload_Rate_Passive 1.3 + } + weapon_rifle_m60 // Refill nearby teammates' ammo periodically while dealing damage with the m60 rifle + { + Weapon_Index 18 + Passive_Enabled -1 //16 + Passive_Bots -1 //16 + Stack_Passives 0 + Supplier_Passive 3.0 + } + weapon_grenade_launcher // Heal teammates with explosions while grenade launcher is being held + { + Weapon_Index 19 + Passive_Enabled -1 //1 + Passive_Bots -1 //1 + Stack_Passives 0 + Blood_Donor_Passive 4 + Regen_Bursts_Passive 2 + } + weapon_first_aid_kit // Take less damage while the medkit is being held and trigger a healing AoE when used + { + Weapon_Index 20 + Passive_Enabled -1 //5 + Passive_Bots -1 //5 + Stack_Passives 0 + Damage_Resistance_Passive 0.95 + Healthcare_Radius_Passive 250.0 + } + weapon_defibrillator // Take less damage while the defibrillator is being held and trigger a revive AoE when used + { + Weapon_Index 21 + Passive_Enabled -1 //5 + Passive_Bots -1 //5 + Stack_Passives 0 + Damage_Resistance_Passive 0.95 + Shockwave_Radius_Passive 1000.0 + } + weapon_pain_pills // Take less damage while the pain pills bottle is being held and trigger a healing AoE when used + { + Weapon_Index 22 + Passive_Enabled -1 //5 + Passive_Bots -1 //5 + Stack_Passives 0 + Damage_Resistance_Passive 0.95 + Overdose_Radius_Passive 250.0 + } + weapon_adrenaline // Take less damage while the adrenaline shot is being held and trigger an energy boost AoE when used + { + Weapon_Index 23 + Passive_Enabled -1 //5 + Passive_Bots -1 //5 + Stack_Passives 0 + Damage_Resistance_Passive 0.95 + Dopamine_Radius_Passive 250.0 + } + weapon_melee // Auto-bhop while knife is being held + { + Weapon_Index 24 + Weapon_Name knife + Passive_Enabled -1 //2 + Passive_Bots -1 //2 + Stack_Passives 0 + Bunny_Hop_Passive 1 + } + weapon_melee // Berserker blunt weapons - High damage, low uptime, revive radius, damage resistance, and heal nearby teammates periodically while dealing damage + { + Weapon_Index 25 + Weapon_Name baseball_bat,cricket_bat,tonfa,shovel,electric_guitar,frying_pan,golfclub + Passive_Enabled -1 //15 + Passive_Bots -1 //15 + Stack_Passives 0 + Damage_Boost_Passive 1.45 + Damage_Resistance_Passive 0.9 + Heartbeat_Passive 3.0 + Melee_Range_Passive 100 + Motivation_Radius_Passive 250.0 + Speed_Boost_Passive 0.875 + Swing_Rate_Passive 0.65 + } + weapon_melee // Berserker sharp weapons - Low damage, high uptime, revive radius, leech health from zombies, and heal teammates by damaging them + { + Weapon_Index 26 + Weapon_Name crowbar,machete,katana,knife,fireaxe,pitchfork + Passive_Enabled -1 //15 + Passive_Bots -1 //15 + Stack_Passives 0 + Damage_Boost_Passive 0.65 + Life_Leech_Passive 1 + Medical_Cuts_Passive 2 + Melee_Range_Passive 100 + Motivation_Radius_Passive 250.0 + Swing_Rate_Passive 1.45 + Speed_Boost_Passive 1.125 + } + Bill // General - Medium-high survivability, high mobility, medium-low damage, high uptime + { + Carrier_Filter 2 + Carrier_Attack_Voicelines "namvet/laughter04.wav,namvet/laughter11.wav,namvet/cough06.wav,namvet/doubledeathresponse01.wav,namvet/doubledeathresponse02.wav,namvet/help11.wav,namvet/friendlyfire04.wav" + Carrier_Bait_Voicelines "namvet/callforrescue01.wav,namvet/callforrescue05.wav,namvet/callforrescue10.wav" + Passive_Enabled -1 //31 + Passive_Bots -1 //31 + Passive_Notify 0 + Blood_Donor_Passive 1 + Bunny_Hop_Passive 1 + Damage_Boost_Passive 0.95 + Damage_Resistance_Passive 0.95 + Eternal_Flames_Passive 1 + Ladder_Actions_Passive 1 + Overhealth_Passive 110 + Pipebomb_Duration_Passive 6.5 + Rapid_Pistol_Passive 0.130 + Recoil_Dampener_Passive 1 + Revive_Health_Passive 50 + Special_Ammo_Passive 0 + Speed_Boost_Passive 1.1 + } + Zoey // Damage - Medium-low survivability, medium mobility, medium-high damage, medium uptime + { + Carrier_Filter 20 + Carrier_Attack_Voicelines "teengirl/laughter02.wav,teengirl/laughter06.wav,teengirl/hurtminor01.wav,teengirl/help04.wav" + Carrier_Bait_Voicelines "teengirl/callforrescue01.wav,teengirl/callforrescue02.wav,teengirl/callforrescue06.wav,teengirl/callforrescue07.wav,teengirl/callforrescue14.wav,teengirl/callforrescue16.wav" + Passive_Enabled -1 //7 + Passive_Bots -1 //7 + Passive_Notify 0 + Blood_Donor_Passive 1 + Damage_Boost_Passive 1.25 + Damage_Resistance_Passive 1.15 + Ghost_Bullets_Passive 1 + Heal_Percent_Passive 75.0 + Hollowpoint_Ammo_Passive 100.0 + Overhealth_Passive 115 + Revive_Health_Passive 40 + Speed_Boost_Passive 1.1 + } + Francis // Tank - Medium-high survivability, low mobility, medium-low damage, low uptime + { + Carrier_Filter 65 + Carrier_Attack_Voicelines "biker/goingtodie03.wav,biker/goingtodie12.wav,biker/goingtodieaskforheal02.wav,biker/grabbedbysmoker03.wav,biker/help04.wav,biker/laughter04.wav,biker/laughter12.wav" + Carrier_Bait_Voicelines "biker/callforrescue02.wav,biker/callforrescue06.wav,biker/callforrescue08.wav" + Passive_Enabled -1 //271 + Passive_Bots -1 //271 + Passive_Notify 0 + Blood_Donor_Passive 2 + Burst_Doors_Passive 0 + Damage_Boost_Passive 0.75 + Damage_Resistance_Passive 0.7 + Fast_Recovery_Passive 1 + Jump_Height_Passive 70.0 + Lady_Killer_Passive 25.0 + Melee_Range_Passive 125 + Overhealth_Passive 130 + Punch_Resistance_Passive 0.7 + Revive_Health_Passive 70 + Riot_Gear_Passive 0 + Shove_Damage_Passive 0.0 + Shove_Penalty_Passive 1 + Speed_Boost_Passive 0.95 + } + Louis // Support - Low survivability, medium mobility, medium-low damage, high uptime + { + Carrier_Filter 8 + Carrier_Attack_Voicelines "manager/choke01.wav,manager/cough03.wav,manager/deathscream02.wav,manager/friendlyfire03.wav,manager/friendlyfire06.wav,manager/help05.wav,manager/laughter04.wav,manager/laughter20.wav" + Carrier_Bait_Voicelines "manager/callforrescue01.wav,manager/callforrescue03.wav" + Passive_Enabled -1 //31 + Passive_Bots -1 //31 + Passive_Notify 0 + Blood_Donor_Passive 2 + Damage_Boost_Passive 0.85 + Damage_Resistance_Passive 1.4 + Heal_Percent_Passive 80.0 + Health_Regen_Passive 1 + Jump_Height_Passive 70.0 + Medical_Cuts_Passive 2 + Midair_Dashes_Passive 0 + Overdose_Radius_Passive 250.0 + Overhealth_Passive 110 + Revive_Health_Passive 60 + Shockwave_Radius_Passive 0.0 + Speed_Boost_Passive 1.1 + Syringe_Darts_Passive 0 + } + Nick // General - Medium-low survivability, high mobility, medium-high damage, high uptime + { + Carrier_Filter 2 + Carrier_Attack_Voicelines "gambler/battlecry04.wav,gambler/choke01.wav,gambler/choke04.wav,gambler/choke05.wav,gambler/cough01.wav,gambler/defibrillator13.wav,gambler/friendlyfire02.wav,gambler/laughter01.wav" + Carrier_Bait_Voicelines "gambler/callforrescue02.wav,gambler/callforrescue05.wav" + Passive_Enabled -1 //31 + Passive_Bots -1 //31 + Passive_Notify 0 + Blood_Donor_Passive 2 + Bunny_Hop_Passive 0 + Damage_Boost_Passive 0.65 + Damage_Resistance_Passive 1.1 + Eternal_Flames_Passive 0 + Ladder_Actions_Passive 0 + Overhealth_Passive 120 + Pipebomb_Duration_Passive 6.5 + Rapid_Pistol_Passive 0.130 + Recoil_Dampener_Passive 0 + Revive_Health_Passive 50 + Special_Ammo_Passive 1 + Speed_Boost_Passive 0.95 + } + Ellis // Damage - Low survivability, medium mobility, high damage, medium uptime + { + Carrier_Filter 40 + Carrier_Attack_Voicelines "mechanic/choke01.wav,mechanic/choke04.wav,mechanic/cough01.wav,mechanic/cough02.wav,mechanic/friendlyfire01.wav,mechanic/laughter04.wav,mechanic/laughter06.wav" + Carrier_Bait_Voicelines "mechanic/callforrescue01.wav,mechanic/callforrescue03.wav,mechanic/callforrescue05.wav" + Passive_Enabled -1 //7 + Passive_Bots -1 //7 + Passive_Notify 0 + Blood_Donor_Passive 2 + Damage_Boost_Passive 1.35 + Damage_Resistance_Passive 1.25 + Ghost_Bullets_Passive 0 + Heal_Percent_Passive 70.0 + Hollowpoint_Ammo_Passive 0.0 + Overhealth_Passive 105 + Revive_Health_Passive 40 + Speed_Boost_Passive 0.95 + } + Coach // Tank - Medium survivability, medium-low mobility, medium damage, low uptime + { + Carrier_Filter 5 + Carrier_Attack_Voicelines "coach/taunt06.wav,coach/tankpound01.wav,coach/tankpound05.wav,coach/laughter23.wav,coach/laughter15.wav,coach/help03.wav,coach/goingtodie28.wav" + Carrier_Bait_Voicelines "coach/callforrescue05.wav,coach/callforrescue08.wav,coach/callforrescue12.wav" + Passive_Enabled -1 //271 + Passive_Bots -1 //271 + Passive_Notify 0 + Blood_Donor_Passive 3 + Burst_Doors_Passive 1 + Damage_Boost_Passive 0.85 + Damage_Resistance_Passive 0.8 + Fast_Recovery_Passive 0 + Jump_Height_Passive 60.0 + Lady_Killer_Passive 0.0 + Melee_Range_Passive 100 + Overhealth_Passive 140 + Punch_Resistance_Passive 0.8 + Revive_Health_Passive 70 + Riot_Gear_Passive 1 + Shove_Damage_Passive 0.025 + Shove_Penalty_Passive 0 + Speed_Boost_Passive 0.85 + } + Rochelle // Support - Medium-low survivability, high mobility, low damage, high uptime + { + Carrier_Filter 16 + Carrier_Attack_Voicelines "producer/battlecry02.wav,producer/boomerreaction02.wav,producer/deathscream02.wav,producer/defibrillator18.wav,producer/goingtodie08.wav,producer/goingtodie02.wav,producer/gooedbyspitter03.wav,producer/heardspitter05.wav" + Carrier_Bait_Voicelines "producer/callforrescue01.wav,producer/callforrescue07.wav" + Passive_Enabled -1 //31 + Passive_Bots -1 //31 + Passive_Notify 0 + Blood_Donor_Passive 3 + Damage_Boost_Passive 0.75 + Damage_Resistance_Passive 1.3 + Heal_Percent_Passive 90.0 + Health_Regen_Passive 2 + Jump_Height_Passive 60.0 + Medical_Cuts_Passive 0 + Midair_Dashes_Passive 1 + Overdose_Radius_Passive 0.0 + Overhealth_Passive 120 + Revive_Health_Passive 60 + Shockwave_Radius_Passive 250.0 + Speed_Boost_Passive 1.2 + Syringe_Darts_Passive 1 + } + } Competitive { Auto_Aggravate Enabled @@ -153,9 +734,33 @@ Mutant_Tanks Scale_Damage Disabled Difficulty_Damage 0.0,0.0,0.0,0.0 } + Size + { + Infected_Chance 0.0 + Infected_Damage 1 + Infected_Health 1 + Infected_Scale 0.1-10.0 + Jockey_Chance 0.0 + Jockey_Damage 1 + Jockey_Health 1 + Jockey_Scale 0.1-10.0 + Witch_Chance 0.0 + Witch_Damage 1 + Witch_Health 1 + Witch_Scale 0.1-10.0 + } Health { Base_Health 6000 + Armor_Characters ],= + Armor_Percentage 0.0 + Armor_Resistance 0.75 + Shield_Characters >,- + Shield_Percentage 0.0 + Shield_Rate 0.5 + Passive_Delay 5.0 + Passive_Health 0 + Passive_Interval 1.0 Display_Health Max Display_Health_Type 1 Health_Characters |,- @@ -192,6 +797,7 @@ Mutant_Tanks Enhancements { Attack_Interval 0.0 + BunnyHop 0 Claw_Damage -1.0 Footstep_Shake 0 Ground_Pound 0 @@ -235,11 +841,11 @@ Mutant_Tanks Regular_Delay 10.0 Regular_Interval 300.0 Regular_Limit 99999 - Regular_Type 1-128 + Regular_Type 1-144 Regular_Wave No Finale_Amount Min Finale_Mode 0 - Finale_Types 1-128,1-128,1-128,1-128,1-128,1-128,1-128,1-128,1-128,1-128,1-128 + Finale_Types 1-144,1-144,1-144,1-144,1-144,1-144,1-144,1-144,1-144,1-144,1-144 Finale_Waves 0,0,0,0,0,0,0,0,0,0,0 } Rush @@ -259,8 +865,8 @@ Mutant_Tanks { tank_burn_duration_expert 150 tank_burn_duration_hard 150 - //tank_burn_duration_normal "150" // L4D1 only - tank_burn_duration "150" // L4D2 only + //tank_burn_duration_normal 150 // L4D1 only + tank_burn_duration 150 // L4D2 only z_burn_max 1.0 } Game_Modes @@ -299,6 +905,12 @@ Mutant_Tanks Smoker_Name Absorber Spitter_Name Absorber } + Mob + { + Mob_Variants -1 + Common_Name Absorber + Witch_Name Absorber + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -372,6 +984,12 @@ Mutant_Tanks Smoker_Name Acidic Spitter_Name Acidic } + Mob + { + Mob_Variants -1 + Common_Name Acidic + Witch_Name Acidic + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -457,6 +1075,12 @@ Mutant_Tanks Smoker_Name Aimless Spitter_Name Aimless } + Mob + { + Mob_Variants -1 + Common_Name Aimless + Witch_Name Aimless + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -528,6 +1152,12 @@ Mutant_Tanks Smoker_Name Ammo Spitter_Name Ammo } + Mob + { + Mob_Variants -1 + Common_Name Ammo + Witch_Name Ammo + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -599,6 +1229,12 @@ Mutant_Tanks Smoker_Name Blind Spitter_Name Blind } + Mob + { + Mob_Variants -1 + Common_Name Blind + Witch_Name Blind + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -638,21 +1274,21 @@ Mutant_Tanks Spitter_Extra_Health 100 } } - Blind_Ability + Vision_Ability { Human_Ability 1 Human_Ammo 2 Ability_Enabled 1 Ability_Effect 7 Ability_Message 1 - Blind_Chance 33.3 - Blind_Duration 5.0 - Blind_Hit 1 - Blind_Hit_Mode 0 - Blind_Intensity 255 - Blind_Mode 0 - Blind_Range 150.0 - Blind_Range_Chance 15.0 + Vision_Chance 33.3 + Vision_Duration 5.0 + Vision_Hit 1 + Vision_Hit_Mode 0 + Vision_Intensity 255 + Vision_Mode 1 + Vision_Range 150.0 + Vision_Range_Chance 15.0 } } Tank_#6 @@ -671,6 +1307,12 @@ Mutant_Tanks Smoker_Name Bomber Spitter_Name Bomber } + Mob + { + Mob_Variants -1 + Common_Name Bomber + Witch_Name Bomber + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -755,6 +1397,12 @@ Mutant_Tanks Smoker_Name Boomer Spitter_Name Boomer } + Mob + { + Mob_Variants -1 + Common_Name Boomer + Witch_Name Boomer + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -810,10 +1458,22 @@ Mutant_Tanks Ability_Message 1 Minion_Amount 5 Minion_Chance 20.0 + Minion_Filter 2 Minion_Lifetime 0.0 Minion_Remove 1 Minion_Replace 1 - Minion_Types 2 + } + Respawn_Ability + { + Human_Ability 1 + Human_Ammo 2 + Human_Duration 5 + Ability_Enabled 1 + Ability_Message 1 + Respawn_Chance 100.0 + Respawn_Duration 0 + Respawn_Filter 2 + Respawn_Range 300.0 } Throw_Ability { @@ -824,7 +1484,7 @@ Mutant_Tanks Throw_Chance 33.3 Throw_Infected_Amount 2 Throw_Infected_Lifetime 0.0 - Throw_Infected_Options 2 + Throw_Infected_Options 4 Throw_Infected_Remove 1 Special { @@ -848,6 +1508,12 @@ Mutant_Tanks Smoker_Name Bulletproof Spitter_Name Bulletproof } + Mob + { + Mob_Variants -1 + Common_Name Bulletproof + Witch_Name Bulletproof + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -908,6 +1574,12 @@ Mutant_Tanks Smoker_Name Burier Spitter_Name Burier } + Mob + { + Mob_Variants -1 + Common_Name Burier + Witch_Name Burier + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -990,6 +1662,12 @@ Mutant_Tanks Smoker_Name Car Spitter_Name Car } + Mob + { + Mob_Variants -1 + Common_Name Car + Witch_Name Car + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -1045,6 +1723,7 @@ Mutant_Tanks Ability_Enabled 1 Ability_Message 1 Car_Chance 15.0 + Car_Damage 5.0 Car_Duration 5 Car_Interval 0.5 Car_Lifetime 30.0 @@ -1058,6 +1737,7 @@ Mutant_Tanks Human_Ammo 2 Ability_Enabled 1 Ability_Message 1 + Throw_Car_Damage 5.0 Throw_Car_Lifetime 10.0 Throw_Car_Options 0 Throw_Car_Owner 1 @@ -1085,6 +1765,12 @@ Mutant_Tanks Smoker_Name Charger Spitter_Name Charger } + Mob + { + Mob_Variants -1 + Common_Name Charger + Witch_Name Charger + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -1135,10 +1821,22 @@ Mutant_Tanks Ability_Message 1 Minion_Amount 5 Minion_Chance 20.0 + Minion_Filter 32 Minion_Lifetime 0.0 Minion_Remove 1 Minion_Replace 1 - Minion_Types 32 + } + Respawn_Ability + { + Human_Ability 1 + Human_Ammo 2 + Human_Duration 5 + Ability_Enabled 1 + Ability_Message 1 + Respawn_Chance 100.0 + Respawn_Duration 0 + Respawn_Filter 32 + Respawn_Range 300.0 } Throw_Ability { @@ -1149,7 +1847,7 @@ Mutant_Tanks Throw_Chance 33.3 Throw_Infected_Amount 2 Throw_Infected_Lifetime 0.0 - Throw_Infected_Options 32 + Throw_Infected_Options 64 Throw_Infected_Remove 1 Special { @@ -1173,6 +1871,12 @@ Mutant_Tanks Smoker_Name Choker Spitter_Name Choker } + Mob + { + Mob_Variants -1 + Common_Name Choker + Witch_Name Choker + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -1245,6 +1949,12 @@ Mutant_Tanks Smoker_Name Clone Spitter_Name Clone } + Mob + { + Mob_Variants -1 + Common_Name Clone + Witch_Name Clone + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -1323,6 +2033,12 @@ Mutant_Tanks Smoker_Name Cloudy Spitter_Name Cloudy } + Mob + { + Mob_Variants -1 + Common_Name Cloudy + Witch_Name Cloudy + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -1375,6 +2091,9 @@ Mutant_Tanks Cloud_Chance 50.0 Cloud_Damage 5.0 Cloud_Duration 0 + Cloud_Interval 5.0 + Cloud_Range 500.0 + Cloud_Remove 0 } } Tank_#15 @@ -1393,6 +2112,12 @@ Mutant_Tanks Smoker_Name Dropper Spitter_Name Dropper } + Mob + { + Mob_Variants -1 + Common_Name Dropper + Witch_Name Dropper + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -1460,6 +2185,12 @@ Mutant_Tanks Smoker_Name Drugger Spitter_Name Drugger } + Mob + { + Mob_Variants -1 + Common_Name Drugger + Witch_Name Drugger + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -1489,6 +2220,10 @@ Mutant_Tanks Particles { Body_Effects 32 + Common + { + Body_Chance 100.0,100.0,100.0,100.0,100.0,33.3,100.0 + } } Health { @@ -1535,6 +2270,12 @@ Mutant_Tanks Smoker_Name Drunk Spitter_Name Drunk } + Mob + { + Mob_Variants -1 + Common_Name Drunk + Witch_Name Drunk + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -1606,6 +2347,12 @@ Mutant_Tanks Smoker_Name Electric Spitter_Name Electric } + Mob + { + Mob_Variants -1 + Common_Name Electric + Witch_Name Electric + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -1687,6 +2434,12 @@ Mutant_Tanks Smoker_Name Enforcer Spitter_Name Enforcer } + Mob + { + Mob_Variants -1 + Common_Name Enforcer + Witch_Name Enforcer + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -1758,6 +2511,12 @@ Mutant_Tanks Smoker_Name Fast Spitter_Name Fast } + Mob + { + Mob_Variants -1 + Common_Name Fast + Witch_Name Fast + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -1850,6 +2609,12 @@ Mutant_Tanks Smoker_Name Fireproof Spitter_Name Fireproof } + Mob + { + Mob_Variants -1 + Common_Name Fireproof + Witch_Name Fireproof + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -1943,6 +2708,12 @@ Mutant_Tanks Smoker_Name Flinger Spitter_Name Flinger } + Mob + { + Mob_Variants -1 + Common_Name Flinger + Witch_Name Flinger + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -2015,6 +2786,12 @@ Mutant_Tanks Smoker_Name Flying Spitter_Name Flying } + Mob + { + Mob_Variants -1 + Common_Name Flying + Witch_Name Flying + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -2084,6 +2861,12 @@ Mutant_Tanks Smoker_Name Fragile Spitter_Name Fragile } + Mob + { + Mob_Variants -1 + Common_Name Fragile + Witch_Name Fragile + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -2158,6 +2941,12 @@ Mutant_Tanks Smoker_Name Ghost Spitter_Name Ghost } + Mob + { + Mob_Variants -1 + Common_Name Ghost + Witch_Name Ghost + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -2237,6 +3026,12 @@ Mutant_Tanks Smoker_Name Godly Spitter_Name Godly } + Mob + { + Mob_Variants -1 + Common_Name Godly + Witch_Name Godly + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -2303,6 +3098,12 @@ Mutant_Tanks Smoker_Name Gravity Spitter_Name Gravity } + Mob + { + Mob_Variants -1 + Common_Name Gravity + Witch_Name Gravity + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -2384,6 +3185,12 @@ Mutant_Tanks Smoker_Name Gunner Spitter_Name Gunner } + Mob + { + Mob_Variants -1 + Common_Name Gunner + Witch_Name Gunner + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -2458,6 +3265,12 @@ Mutant_Tanks Smoker_Name Healthy Spitter_Name Healthy } + Mob + { + Mob_Variants -1 + Common_Name Healthy + Witch_Name Healthy + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -2541,6 +3354,12 @@ Mutant_Tanks Smoker_Name Hitter Spitter_Name Hitter } + Mob + { + Mob_Variants -1 + Common_Name Hitter + Witch_Name Hitter + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -2580,12 +3399,11 @@ Mutant_Tanks Spitter_Extra_Health 100 } } - Hit_Ability + Medic_Ability { Human_Ability 1 - Ability_Enabled 1 - Hit_Damage_Multiplier 1.5 - Hit_Group 1 + Medic_Damage_Multiplier 1.5 + Medic_Hit_Group 1 } } Tank_#31 @@ -2604,6 +3422,12 @@ Mutant_Tanks Smoker_Name Hunter Spitter_Name Hunter } + Mob + { + Mob_Variants -1 + Common_Name Hunter + Witch_Name Hunter + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -2654,10 +3478,22 @@ Mutant_Tanks Ability_Message 1 Minion_Amount 5 Minion_Chance 20.0 + Minion_Filter 4 Minion_Lifetime 0.0 Minion_Remove 1 Minion_Replace 1 - Minion_Types 4 + } + Respawn_Ability + { + Human_Ability 1 + Human_Ammo 2 + Human_Duration 5 + Ability_Enabled 1 + Ability_Message 1 + Respawn_Chance 100.0 + Respawn_Duration 0 + Respawn_Filter 4 + Respawn_Range 300.0 } Throw_Ability { @@ -2668,7 +3504,7 @@ Mutant_Tanks Throw_Chance 33.3 Throw_Infected_Amount 2 Throw_Infected_Lifetime 0.0 - Throw_Infected_Options 4 + Throw_Infected_Options 8 Throw_Infected_Remove 1 Special { @@ -2692,6 +3528,12 @@ Mutant_Tanks Smoker_Name Hurtful Spitter_Name Hurtful } + Mob + { + Mob_Variants -1 + Common_Name Hurtful + Witch_Name Hurtful + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -2743,6 +3585,7 @@ Mutant_Tanks Hurt_Hit 1 Hurt_Hit_Mode 0 Hurt_Interval 1.0 + Hurt_Mode 1 Hurt_Range 150.0 Hurt_Range_Chance 15.0 } @@ -2763,6 +3606,12 @@ Mutant_Tanks Smoker_Name Hypnotizer Spitter_Name Hypnotizer } + Mob + { + Mob_Variants -1 + Common_Name Hypnotizer + Witch_Name Hypnotizer + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -2840,6 +3689,12 @@ Mutant_Tanks Smoker_Name Icy Spitter_Name Icy } + Mob + { + Mob_Variants -1 + Common_Name Icy + Witch_Name Icy + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -2913,6 +3768,12 @@ Mutant_Tanks Smoker_Name Idler Spitter_Name Idler } + Mob + { + Mob_Variants -1 + Common_Name Idler + Witch_Name Idler + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -2982,6 +3843,12 @@ Mutant_Tanks Smoker_Name Inverter Spitter_Name Inverter } + Mob + { + Mob_Variants -1 + Common_Name Inverter + Witch_Name Inverter + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -3051,6 +3918,12 @@ Mutant_Tanks Smoker_Name Item Spitter_Name Item } + Mob + { + Mob_Variants -1 + Common_Name Item + Witch_Name Item + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -3090,21 +3963,21 @@ Mutant_Tanks Spitter_Extra_Health 100 } } - Item_Ability + Drop_Ability { Human_Ability 1 - Ability_Enabled 1 + Ability_Enabled 2 Ability_Message 1 - Item_Chance 50.0 - Item_Loadout rifle,pistol,first_aid_kit,pain_pills - Item_Mode 0 - Item_Pinata "" - Item_Pinata_Body 1 - Item_Pinata_Chance 33.3 + Drop_Chance 50.0 + Drop_Loadout rifle,pistol,first_aid_kit,pain_pills + Drop_Item_Mode 0 + Drop_Pinata "" + Drop_Pinata_Body 1 + Drop_Pinata_Chance 33.3 Special { Ability_Enabled 0 - Item_Loadout smg,pistol,pain_pills + Drop_Loadout smg,pistol,pain_pills } } } @@ -3125,6 +3998,12 @@ Mutant_Tanks Smoker_Name Jockey Spitter_Name Jockey } + Mob + { + Mob_Variants -1 + Common_Name Jockey + Witch_Name Jockey + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -3175,10 +4054,22 @@ Mutant_Tanks Ability_Message 1 Minion_Amount 5 Minion_Chance 20.0 + Minion_Filter 16 Minion_Lifetime 0.0 Minion_Remove 1 Minion_Replace 1 - Minion_Types 16 + } + Respawn_Ability + { + Human_Ability 1 + Human_Ammo 2 + Human_Duration 5 + Ability_Enabled 1 + Ability_Message 1 + Respawn_Chance 100.0 + Respawn_Duration 0 + Respawn_Filter 16 + Respawn_Range 300.0 } Throw_Ability { @@ -3189,7 +4080,7 @@ Mutant_Tanks Throw_Chance 33.3 Throw_Infected_Amount 2 Throw_Infected_Lifetime 0.0 - Throw_Infected_Options 16 + Throw_Infected_Options 32 Throw_Infected_Remove 1 Special { @@ -3213,6 +4104,12 @@ Mutant_Tanks Smoker_Name Jumper Spitter_Name Jumper } + Mob + { + Mob_Variants -1 + Common_Name Jumper + Witch_Name Jumper + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -3286,6 +4183,12 @@ Mutant_Tanks Smoker_Name Kamikaze Spitter_Name Kamikaze } + Mob + { + Mob_Variants -1 + Common_Name Kamikaze + Witch_Name Kamikaze + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -3328,23 +4231,25 @@ Mutant_Tanks { Run_Speed 0.65 } - Kamikaze_Ability + Smash_Ability { Human_Ability 1 Ability_Enabled 1 Ability_Effect 7 Ability_Message 1 - Kamikaze_Body 1 - Kamikaze_Chance 33.3 - Kamikaze_Hit 1 - Kamikaze_Hit_Mode 0 - Kamikaze_Mode 1 - Kamikaze_Range 150.0 - Kamikaze_Range_Chance 33.3 + Smash_Body 1 + Smash_Chance 33.3 + Smash_Hit 1 + Smash_Hit_Mode 0 + Smash_Mode 1 + Smash_Range 150.0 + Smash_Range_Chance 33.3 + Smash_Remove 1 + Smash_Type 1 Special { - Kamikaze_Body 0 - Kamikaze_Meter 50.0 + Smash_Body 0 + Smash_Meter 50.0 } } } @@ -3364,6 +4269,12 @@ Mutant_Tanks Smoker_Name Lagger Spitter_Name Lagger } + Mob + { + Mob_Variants -1 + Common_Name Lagger + Witch_Name Lagger + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -3434,6 +4345,12 @@ Mutant_Tanks Smoker_Name Laser Spitter_Name Laser } + Mob + { + Mob_Variants -1 + Common_Name Laser + Witch_Name Laser + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -3502,6 +4419,12 @@ Mutant_Tanks Smoker_Name Leecher Spitter_Name Leecher } + Mob + { + Mob_Variants -1 + Common_Name Leecher + Witch_Name Leecher + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -3540,20 +4463,25 @@ Mutant_Tanks Spitter_Extra_Health 100 } } - Leech_Ability + Regen_Ability { Human_Ability 1 Human_Ammo 2 + Human_Duration 5 Ability_Enabled 1 - Ability_Effect 7 + Ability_Effect 4 Ability_Message 1 - Leech_Chance 33.3 - Leech_Duration 5 - Leech_Hit 1 - Leech_Hit_Mode 0 - Leech_Interval 1.0 - Leech_Range 150.0 - Leech_Range_Chance 15.0 + Regen_Chance 100.0 + Regen_Duration 5 + Regen_Health 1 + Regen_Interval 1.0 + Regen_Limit 1000000 + Regen_Range 500.0 + Special + { + Regen_Limit 100000 + Regen_Range 150.0 + } } } Tank_#44 @@ -3573,6 +4501,12 @@ Mutant_Tanks Smoker_Name Lightning Spitter_Name Lightning } + Mob + { + Mob_Variants -1 + Common_Name Lightning + Witch_Name Lightning + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -3644,6 +4578,12 @@ Mutant_Tanks Smoker_Name Medic Spitter_Name Medic } + Mob + { + Mob_Variants -1 + Common_Name Medic + Witch_Name Medic + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -3722,6 +4662,12 @@ Mutant_Tanks Smoker_Name Meteor Spitter_Name Meteor } + Mob + { + Mob_Variants -1 + Common_Name Meteor + Witch_Name Meteor + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -3804,6 +4750,12 @@ Mutant_Tanks Smoker_Name Necromancer Spitter_Name Necromancer } + Mob + { + Mob_Variants -1 + Common_Name Necromancer + Witch_Name Necromancer + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -3843,16 +4795,17 @@ Mutant_Tanks Spitter_Extra_Health 100 } } - Necro_Ability + Respawn_Ability { Human_Ability 1 Human_Ammo 2 Human_Duration 5 Ability_Enabled 1 Ability_Message 1 - Necro_Chance 100.0 - Necro_Duration 0 - Necro_Range 500.0 + Respawn_Chance 100.0 + Respawn_Duration 0 + Respawn_Filter 0 + Respawn_Range 500.0 } } Tank_#48 @@ -3871,6 +4824,12 @@ Mutant_Tanks Smoker_Name Nullifier Spitter_Name Nullifier } + Mob + { + Mob_Variants -1 + Common_Name Nullifier + Witch_Name Nullifier + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -3945,6 +4904,12 @@ Mutant_Tanks Smoker_Name Omni Spitter_Name Omni } + Mob + { + Mob_Variants -1 + Common_Name Omni + Witch_Name Omni + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -4013,6 +4978,12 @@ Mutant_Tanks Smoker_Name Panic Spitter_Name Panic } + Mob + { + Mob_Variants -1 + Common_Name Panic + Witch_Name Panic + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -4083,6 +5054,12 @@ Mutant_Tanks Smoker_Name Pet Spitter_Name Pet } + Mob + { + Mob_Variants -1 + Common_Name Pet + Witch_Name Pet + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -4171,6 +5148,12 @@ Mutant_Tanks Smoker_Name Pimp Spitter_Name Pimp } + Mob + { + Mob_Variants -1 + Common_Name Pimp + Witch_Name Pimp + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -4209,21 +5192,22 @@ Mutant_Tanks Spitter_Extra_Health 100 } } - Pimp_Ability + Hurt_Ability { Human_Ability 1 Human_Ammo 2 Ability_Enabled 1 Ability_Effect 7 Ability_Message 1 - Pimp_Chance 33.3 - Pimp_Damage 1 - Pimp_Duration 5 - Pimp_Hit 1 - Pimp_Hit_Mode 0 - Pimp_Interval 1.0 - Pimp_Range 150.0 - Pimp_Range_Chance 15.0 + Hurt_Chance 33.3 + Hurt_Damage 1 + Hurt_Duration 5 + Hurt_Hit 1 + Hurt_Hit_Mode 0 + Hurt_Interval 1.0 + Hurt_Mode 2 + Hurt_Range 150.0 + Hurt_Range_Chance 15.0 } } Tank_#53 @@ -4242,6 +5226,12 @@ Mutant_Tanks Smoker_Name Platinum Spitter_Name Platinum } + Mob + { + Mob_Variants -1 + Common_Name Platinum + Witch_Name Platinum + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -4301,6 +5291,12 @@ Mutant_Tanks Smoker_Name Puke Spitter_Name Puke } + Mob + { + Mob_Variants -1 + Common_Name Puke + Witch_Name Puke + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -4381,6 +5377,12 @@ Mutant_Tanks Smoker_Name Pyromaniac Spitter_Name Pyromaniac } + Mob + { + Mob_Variants -1 + Common_Name Pyromaniac + Witch_Name Pyromaniac + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -4416,12 +5418,12 @@ Mutant_Tanks Extra_Health 1000 Special { - Boomer_Extra_Health 500 - Charger_Extra_Health 500 - Hunter_Extra_Health 500 - Jockey_Extra_Health 500 - Smoker_Extra_Health 500 - Spitter_Extra_Health 500 + Boomer_Extra_Health 100 + Charger_Extra_Health 100 + Hunter_Extra_Health 100 + Jockey_Extra_Health 100 + Smoker_Extra_Health 100 + Spitter_Extra_Health 100 } } Enhancements @@ -4464,6 +5466,12 @@ Mutant_Tanks Smoker_Name Quiet Spitter_Name Quiet } + Mob + { + Mob_Variants -1 + Common_Name Quiet + Witch_Name Quiet + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -4535,6 +5543,12 @@ Mutant_Tanks Smoker_Name Recall Spitter_Name Recall } + Mob + { + Mob_Variants -1 + Common_Name Recall + Witch_Name Recall + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -4628,6 +5642,12 @@ Mutant_Tanks Smoker_Name Recoil Spitter_Name Recoil } + Mob + { + Mob_Variants -1 + Common_Name Recoil + Witch_Name Recoil + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -4698,6 +5718,12 @@ Mutant_Tanks Smoker_Name Regenerative Spitter_Name Regenerative } + Mob + { + Mob_Variants -1 + Common_Name Regenerative + Witch_Name Regenerative + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -4743,17 +5769,18 @@ Mutant_Tanks Human_Ammo 2 Human_Duration 5 Ability_Enabled 1 + Ability_Effect 4 Ability_Message 1 Regen_Chance 100.0 Regen_Duration 0 Regen_Health 1 Regen_Interval 1.0 - Regen_Leech 1 - Regen_Leech_Range 500.0 Regen_Limit 1000000 + Regen_Range 500.0 Special { Regen_Limit 100000 + Regen_Range 150.0 } } } @@ -4773,6 +5800,12 @@ Mutant_Tanks Smoker_Name Respawner Spitter_Name Respawner } + Mob + { + Mob_Variants -1 + Common_Name Respawner + Witch_Name Respawner + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -4816,7 +5849,7 @@ Mutant_Tanks { Human_Ability 1 Human_Ammo 1 - Ability_Enabled 1 + Ability_Enabled 2 Ability_Message 1 Respawn_Amount 1 Respawn_Chance 100.0 @@ -4839,6 +5872,12 @@ Mutant_Tanks Smoker_Name Restarter Spitter_Name Restarter } + Mob + { + Mob_Variants -1 + Common_Name Restarter + Witch_Name Restarter + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -4914,6 +5953,12 @@ Mutant_Tanks Smoker_Name Rock Spitter_Name Rock } + Mob + { + Mob_Variants -1 + Common_Name Rock + Witch_Name Rock + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -4968,6 +6013,7 @@ Mutant_Tanks Rock_Damage 5 Rock_Duration 5 Rock_Interval 0.2 + Rock_Mode 1 Rock_Radius -1.25,1.25 } } @@ -4987,6 +6033,12 @@ Mutant_Tanks Smoker_Name Rocketeer Spitter_Name Rocketeer } + Mob + { + Mob_Variants -1 + Common_Name Rocketeer + Witch_Name Rocketeer + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -5025,25 +6077,26 @@ Mutant_Tanks Spitter_Extra_Health 100 } } - Rocket_Ability + Smash_Ability { Human_Ability 1 Human_Ammo 1 Ability_Enabled 1 Ability_Effect 7 Ability_Message 1 - Rocket_Body 1 - Rocket_Chance 15.0 - Rocket_Delay 1.0 - Rocket_Hit 1 - Rocket_Hit_Mode 0 - Rocket_Mode 1 - Rocket_Range 150.0 - Rocket_Range_Chance 15.0 + Smash_Body 1 + Smash_Chance 15.0 + Smash_Delay 1.0 + Smash_Hit 1 + Smash_Hit_Mode 0 + Smash_Mode 2 + Smash_Range 150.0 + Smash_Range_Chance 15.0 + Smash_Type 1 Special { - Rocket_Body 0 - Rocket_Countdown 3.0 + Smash_Body 0 + Smash_Countdown 3.0 } } } @@ -5063,6 +6116,12 @@ Mutant_Tanks Smoker_Name Self-throwing Spitter_Name Self-throwing } + Mob + { + Mob_Variants -1 + Common_Name Self-throwing + Witch_Name Self-throwing + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -5134,6 +6193,12 @@ Mutant_Tanks Smoker_Name Shaker Spitter_Name Shaker } + Mob + { + Mob_Variants -1 + Common_Name Shaker + Witch_Name Shaker + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -5173,23 +6238,24 @@ Mutant_Tanks Spitter_Extra_Health 100 } } - Shake_Ability + Vision_Ability { Human_Ability 1 Human_Ammo 2 Ability_Enabled 1 Ability_Effect 7 Ability_Message 1 - Shake_Chance 33.3 - Shake_Death 1 - Shake_Death_Chance 33.3 - Shake_Death_Range 200.0 - Shake_Duration 5 - Shake_Hit 1 - Shake_Hit_Mode 0 - Shake_Interval 1.0 - Shake_Range 150.0 - Shake_Range_Chance 15.0 + Vision_Chance 33.3 + Vision_Death 1 + Vision_Death_Chance 33.3 + Vision_Death_Range 200.0 + Vision_Duration 5 + Vision_Hit 1 + Vision_Hit_Mode 0 + Vision_Interval 1.0 + Vision_Mode 4 + Vision_Range 150.0 + Vision_Range_Chance 15.0 } } Tank_#66 @@ -5208,6 +6274,12 @@ Mutant_Tanks Smoker_Name Shield Spitter_Name Shield } + Mob + { + Mob_Variants -1 + Common_Name Shield + Witch_Name Shield + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -5286,6 +6358,12 @@ Mutant_Tanks Smoker_Name Shover Spitter_Name Shover } + Mob + { + Mob_Variants -1 + Common_Name Shover + Witch_Name Shover + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -5359,6 +6437,12 @@ Mutant_Tanks Smoker_Name Slow Spitter_Name Slow } + Mob + { + Mob_Variants -1 + Common_Name Slow + Witch_Name Slow + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -5430,6 +6514,12 @@ Mutant_Tanks Smoker_Name Smasher Spitter_Name Smasher } + Mob + { + Mob_Variants -1 + Common_Name Smasher + Witch_Name Smasher + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -5486,6 +6576,8 @@ Mutant_Tanks Smash_Mode 1 Smash_Range 150.0 Smash_Range_Chance 33.3 + Smash_Remove 0 + Smash_Type 1 Special { Smash_Body 0 @@ -5509,7 +6601,13 @@ Mutant_Tanks Smoker_Name Smiter Spitter_Name Smiter } - Tank_Enabled -1 + Mob + { + Mob_Variants -1 + Common_Name Smiter + Witch_Name Smiter + } + Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 Skin_Color 0,230,230,255 @@ -5551,24 +6649,25 @@ Mutant_Tanks { Run_Speed 0.65 } - Smite_Ability + Smash_Ability { Human_Ability 1 Human_Ammo 1 Ability_Enabled 1 Ability_Effect 7 Ability_Message 1 - Smite_Body 1 - Smite_Chance 33.3 - Smite_Hit 1 - Smite_Hit_Mode 0 - Smite_Mode 1 - Smite_Range 150.0 - Smite_Range_Chance 33.3 + Smash_Body 1 + Smash_Chance 33.3 + Smash_Hit 1 + Smash_Hit_Mode 0 + Smash_Mode 4 + Smash_Range 150.0 + Smash_Range_Chance 33.3 + Smash_Type 1 Special { - Smite_Body 0 - Smite_Countdown 3.0 + Smash_Body 0 + Smash_Countdown 3.0 } } } @@ -5588,6 +6687,12 @@ Mutant_Tanks Smoker_Name Smoker Spitter_Name Smoker } + Mob + { + Mob_Variants -1 + Common_Name Smoker + Witch_Name Smoker + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -5620,6 +6725,10 @@ Mutant_Tanks Particles { Body_Effects 32 + Common + { + Body_Chance 100.0,100.0,100.0,100.0,100.0,33.3,100.0 + } } Health { @@ -5642,10 +6751,22 @@ Mutant_Tanks Ability_Message 1 Minion_Amount 5 Minion_Chance 20.0 + Minion_Filter 1 Minion_Lifetime 0.0 Minion_Remove 1 Minion_Replace 1 - Minion_Types 1 + } + Respawn_Ability + { + Human_Ability 1 + Human_Ammo 2 + Human_Duration 5 + Ability_Enabled 1 + Ability_Message 1 + Respawn_Chance 100.0 + Respawn_Duration 0 + Respawn_Filter 1 + Respawn_Range 300.0 } Throw_Ability { @@ -5656,7 +6777,7 @@ Mutant_Tanks Throw_Chance 33.3 Throw_Infected_Amount 2 Throw_Infected_Lifetime 0.0 - Throw_Infected_Options 1 + Throw_Infected_Options 2 Throw_Infected_Remove 1 Special { @@ -5680,6 +6801,12 @@ Mutant_Tanks Smoker_Name Spammer Spitter_Name Spammer } + Mob + { + Mob_Variants -1 + Common_Name Spammer + Witch_Name Spammer + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -5722,16 +6849,17 @@ Mutant_Tanks Spitter_Extra_Health 100 } } - Spam_Ability + Rock_Ability { Human_Ability 1 Human_Ammo 2 Human_Duration 5 Ability_Enabled 1 - Spam_Chance 15.0 - Spam_Damage 5 - Spam_Duration 5 - Spam_Interval 0.5 + Rock_Chance 15.0 + Rock_Damage 5 + Rock_Duration 5 + Rock_Interval 0.5 + Rock_Mode 2 } } Tank_#73 @@ -5750,6 +6878,12 @@ Mutant_Tanks Smoker_Name Special Spitter_Name Special } + Mob + { + Mob_Variants -1 + Common_Name Special + Witch_Name Special + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -5800,10 +6934,22 @@ Mutant_Tanks Ability_Message 1 Minion_Amount 5 Minion_Chance 20.0 + Minion_Filter 0 Minion_Lifetime 0.0 Minion_Remove 1 Minion_Replace 1 - Minion_Types 0 + } + Respawn_Ability + { + Human_Ability 1 + Human_Ammo 2 + Human_Duration 5 + Ability_Enabled 1 + Ability_Message 1 + Respawn_Chance 100.0 + Respawn_Duration 0 + Respawn_Filter 0 + Respawn_Range 300.0 } Throw_Ability { @@ -5814,7 +6960,7 @@ Mutant_Tanks Throw_Chance 33.3 Throw_Infected_Amount 2 Throw_Infected_Lifetime 0.0 - Throw_Infected_Options 63 + Throw_Infected_Options 126 Throw_Infected_Remove 1 Special { @@ -5839,6 +6985,12 @@ Mutant_Tanks Smoker_Name Spitter Spitter_Name Spitter } + Mob + { + Mob_Variants -1 + Common_Name Spitter + Witch_Name Spitter + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -5894,10 +7046,22 @@ Mutant_Tanks Ability_Message 1 Minion_Amount 5 Minion_Chance 20.0 + Minion_Filter 8 Minion_Lifetime 0.0 Minion_Remove 1 Minion_Replace 1 - Minion_Types 8 + } + Respawn_Ability + { + Human_Ability 1 + Human_Ammo 2 + Human_Duration 5 + Ability_Enabled 1 + Ability_Message 1 + Respawn_Chance 100.0 + Respawn_Duration 0 + Respawn_Filter 8 + Respawn_Range 300.0 } Throw_Ability { @@ -5908,7 +7072,7 @@ Mutant_Tanks Throw_Chance 33.3 Throw_Infected_Amount 2 Throw_Infected_Lifetime 0.0 - Throw_Infected_Options 8 + Throw_Infected_Options 16 Throw_Infected_Remove 1 Special { @@ -5932,6 +7096,12 @@ Mutant_Tanks Smoker_Name Splasher Spitter_Name Splasher } + Mob + { + Mob_Variants -1 + Common_Name Splasher + Witch_Name Splasher + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -5974,18 +7144,19 @@ Mutant_Tanks Spitter_Extra_Health 100 } } - Splash_Ability + Cloud_Ability { Human_Ability 1 Human_Ammo 2 Human_Duration 5 Ability_Enabled 1 Ability_Message 1 - Splash_Chance 15.0 - Splash_Damage 5.0 - Splash_Duration 0 - Splash_Interval 5.0 - Splash_Range 500.0 + Cloud_Chance 15.0 + Cloud_Damage 5.0 + Cloud_Duration 0 + Cloud_Interval 5.0 + Cloud_Range 500.0 + Cloud_Remove 1 } } Tank_#76 @@ -6005,6 +7176,12 @@ Mutant_Tanks Smoker_Name Splatter Spitter_Name Splatter } + Mob + { + Mob_Variants -1 + Common_Name Splatter + Witch_Name Splatter + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -6044,21 +7221,22 @@ Mutant_Tanks Spitter_Extra_Health 100 } } - Splatter_Ability + Vision_Ability { Human_Ability 1 Human_Ammo 2 Ability_Enabled 1 Ability_Effect 7 Ability_Message 1 - Splatter_Chance 33.3 - Splatter_Duration 5 - Splatter_Hit 1 - Splatter_Hit_Mode 0 - Splatter_Interval 1.0 - Splatter_Range 150.0 - Splatter_Range_Chance 15.0 - Splatter_Type 0 + Vision_Chance 33.3 + Vision_Duration 5.0 + Vision_Hit 1 + Vision_Hit_Mode 0 + Vision_Interval 1.0 + Vision_Mode 8 + Vision_Range 150.0 + Vision_Range_Chance 15.0 + Vision_Type 0 } } Tank_#77 @@ -6077,6 +7255,12 @@ Mutant_Tanks Smoker_Name Thrower Spitter_Name Thrower } + Mob + { + Mob_Variants -1 + Common_Name Thrower + Witch_Name Thrower + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -6129,13 +7313,14 @@ Mutant_Tanks Human_Ammo 2 Ability_Enabled 15 Ability_Message 15 + Throw_Car_Damage 5.0 Throw_Car_Lifetime 10.0 Throw_Car_Options 0 Throw_Car_Owner 1 Throw_Chance 33.3 Throw_Infected_Amount 2 Throw_Infected_Lifetime 0.0 - Throw_Infected_Options 63 + Throw_Infected_Options 126 Throw_Infected_Remove 1 Throw_Witch_Amount 3 Throw_Witch_Damage 5.0 @@ -6163,6 +7348,12 @@ Mutant_Tanks Smoker_Name Tracker Spitter_Name Tracker } + Mob + { + Mob_Variants -1 + Common_Name Tracker + Witch_Name Tracker + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -6241,6 +7432,12 @@ Mutant_Tanks Smoker_Name Ultimate Spitter_Name Ultimate } + Mob + { + Mob_Variants -1 + Common_Name Ultimate + Witch_Name Ultimate + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -6310,6 +7507,12 @@ Mutant_Tanks Smoker_Name Undead Spitter_Name Undead } + Mob + { + Mob_Variants -1 + Common_Name Undead + Witch_Name Undead + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -6379,6 +7582,12 @@ Mutant_Tanks Smoker_Name Vampire Spitter_Name Vampire } + Mob + { + Mob_Variants -1 + Common_Name Vampire + Witch_Name Vampire + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -6422,13 +7631,13 @@ Mutant_Tanks Spitter_Extra_Health 100 } } - Vampire_Ability + Regen_Ability { Human_Ability 1 - Ability_Enabled 1 Ability_Effect 1 Ability_Message 1 - Vampire_Chance 33.3 + Regen_Chance 33.3 + Regen_Mode 1 } } Tank_#82 @@ -6447,6 +7656,12 @@ Mutant_Tanks Smoker_Name Visual Spitter_Name Visual } + Mob + { + Mob_Variants -1 + Common_Name Visual + Witch_Name Visual + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -6494,10 +7709,11 @@ Mutant_Tanks Ability_Effect 7 Ability_Message 1 Vision_Chance 33.3 - Vision_Duration 5 + Vision_Duration 5.0 Vision_FOV 160 Vision_Hit 1 Vision_Hit_Mode 0 + Vision_Mode 16 Vision_Range 150.0 Vision_Range_Chance 15.0 } @@ -6518,6 +7734,12 @@ Mutant_Tanks Smoker_Name Warper Spitter_Name Warper } + Mob + { + Mob_Variants -1 + Common_Name Warper + Witch_Name Warper + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -6605,6 +7827,12 @@ Mutant_Tanks Smoker_Name Whirler Spitter_Name Whirler } + Mob + { + Mob_Variants -1 + Common_Name Whirler + Witch_Name Whirler + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -6677,6 +7905,12 @@ Mutant_Tanks Smoker_Name Witch Spitter_Name Witch } + Mob + { + Mob_Variants -1 + Common_Name Witch + Witch_Name Witch + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -6767,6 +8001,12 @@ Mutant_Tanks Smoker_Name Xiphos Spitter_Name Xiphos } + Mob + { + Mob_Variants -1 + Common_Name Xiphos + Witch_Name Xiphos + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -6805,14 +8045,14 @@ Mutant_Tanks Spitter_Extra_Health 100 } } - Xiphos_Ability + Regen_Ability { Human_Ability 1 - Ability_Enabled 1 - Ability_Effect 1 + Ability_Effect 3 Ability_Message 1 - Xiphos_Chance 33.3 - Xiphos_Max_Health 0 + Regen_Chance 33.3 + Regen_Max_Health 0 + Regen_Mode 2 } } Tank_#87 @@ -6831,6 +8071,12 @@ Mutant_Tanks Smoker_Name Yeller Spitter_Name Yeller } + Mob + { + Mob_Variants -1 + Common_Name Yeller + Witch_Name Yeller + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -6901,6 +8147,12 @@ Mutant_Tanks Smoker_Name Zombie Spitter_Name Zombie } + Mob + { + Mob_Variants -1 + Common_Name Zombie + Witch_Name Zombie + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -6939,19 +8191,19 @@ Mutant_Tanks Spitter_Extra_Health 100 } } - Zombie_Ability + Panic_Ability { Human_Ability 1 Human_Ammo 2 Human_Duration 6 - Ability_Enabled 1 + Ability_Enabled 2 Ability_Message 1 - Zombie_Amount 10 - Zombie_Chance 33.3 - Zombie_Duration 0 - Zombie_Interval 5.0 - Zombie_Mode 0 - Zombie_Type 0 + Panic_Amount 10 + Panic_Chance 33.3 + Panic_Duration 0 + Panic_Interval 5.0 + Panic_Mode 0 + Panic_Type 0 } } /** @@ -6974,6 +8226,12 @@ Mutant_Tanks Smoker_Name Armageddon Spitter_Name Armageddon } + Mob + { + Mob_Variants -1 + Common_Name Armageddon + Witch_Name Armageddon + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -7020,7 +8278,7 @@ Mutant_Tanks Gravity_Ability { Ability_Enabled 2 - Ability_Message 5 + Ability_Message 4 Gravity_Flags 8 Gravity_Force -50.0 } @@ -7053,6 +8311,12 @@ Mutant_Tanks Smoker_Name Boss Spitter_Name Boss } + Mob + { + Mob_Variants -1 + Common_Name Boss + Witch_Name Boss + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -7080,6 +8344,7 @@ Mutant_Tanks Particles { Body_Effects 127 + Body_Chance 100.0,100.0,100.0,100.0,100.0,33.3,100.0 Rock_Effects 15 } Health @@ -7199,6 +8464,8 @@ Mutant_Tanks Smash_Chance 20.0 Smash_Hit 1 Smash_Hit_Mode 0 + Smash_Mode 1 + Smash_Type 1 Special { Smash_Body 0 @@ -7222,16 +8489,16 @@ Mutant_Tanks Witch_Range 500.0 Witch_Remove 1 } - Zombie_Ability + Panic_Ability { - Ability_Enabled 1 + Ability_Enabled 2 Ability_Message 1 - Zombie_Amount 50 - Zombie_Chance 33.3 - Zombie_Duration 0 - Zombie_Interval 50.0 - Zombie_Mode 0 - Zombie_Type 0 + Panic_Amount 50 + Panic_Chance 33.3 + Panic_Duration 0 + Panic_Interval 50.0 + Panic_Mode 0 + Panic_Type 0 } } Tank_#91 @@ -7250,6 +8517,12 @@ Mutant_Tanks Smoker_Name Cobalt Spitter_Name Cobalt } + Mob + { + Mob_Variants -1 + Common_Name Cobalt + Witch_Name Cobalt + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -7329,6 +8602,12 @@ Mutant_Tanks Smoker_Name Distraction Spitter_Name Distraction } + Mob + { + Mob_Variants -1 + Common_Name Distraction + Witch_Name Distraction + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -7413,6 +8692,12 @@ Mutant_Tanks Smoker_Name Feedback Spitter_Name Feedback } + Mob + { + Mob_Variants -1 + Common_Name Feedback + Witch_Name Feedback + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -7465,7 +8750,7 @@ Mutant_Tanks Human_Ability 1 Human_Ammo 2 Ability_Enabled 2 - Ability_Message 5 + Ability_Message 4 Gravity_Flags 8 Gravity_Force 50.0 } @@ -7486,6 +8771,12 @@ Mutant_Tanks Smoker_Name Flash Spitter_Name Flash } + Mob + { + Mob_Variants -1 + Common_Name Flash + Witch_Name Flash + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -7621,6 +8912,12 @@ Mutant_Tanks Smoker_Name Goliath Spitter_Name Goliath } + Mob + { + Mob_Variants -1 + Common_Name Goliath + Witch_Name Goliath + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -7715,6 +9012,8 @@ Mutant_Tanks Smash_Chance 33.3 Smash_Hit 1 Smash_Hit_Mode 0 + Smash_Mode 1 + Smash_Type 1 Special { Smash_Body 0 @@ -7738,6 +9037,12 @@ Mutant_Tanks Smoker_Name Hallucination Spitter_Name Hallucination } + Mob + { + Mob_Variants -1 + Common_Name Hallucination + Witch_Name Hallucination + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -7820,6 +9125,12 @@ Mutant_Tanks Smoker_Name Meme Spitter_Name Meme } + Mob + { + Mob_Variants -1 + Common_Name Meme + Witch_Name Meme + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -7847,6 +9158,7 @@ Mutant_Tanks Particles { Body_Effects 127 + Body_Chance 100.0,100.0,100.0,100.0,100.0,33.3,100.0 Rock_Effects 15 } Health @@ -7947,19 +9259,22 @@ Mutant_Tanks Smash_Chance 20.0 Smash_Hit 1 Smash_Hit_Mode 0 + Smash_Mode 1 + Smash_Type 1 Special { Smash_Body 0 Smash_Meter 50.0 } } - Spam_Ability + Rock_Ability { Ability_Enabled 1 - Spam_Chance 50.0 - Spam_Damage 5 - Spam_Duration 1 - Spam_Interval 0.5 + Rock_Chance 50.0 + Rock_Damage 5 + Rock_Duration 1 + Rock_Interval 0.5 + Rock_Mode 2 } Warp_Ability { @@ -7978,16 +9293,16 @@ Mutant_Tanks Witch_Range 500.0 Witch_Remove 1 } - Zombie_Ability + Panic_Ability { - Ability_Enabled 1 + Ability_Enabled 2 Ability_Message 1 - Zombie_Amount 50 - Zombie_Chance 33.3 - Zombie_Duration 0 - Zombie_Interval 50.0 - Zombie_Mode 0 - Zombie_Type 0 + Panic_Amount 50 + Panic_Chance 33.3 + Panic_Duration 0 + Panic_Interval 50.0 + Panic_Mode 0 + Panic_Type 0 } } Tank_#98 @@ -8006,6 +9321,12 @@ Mutant_Tanks Smoker_Name Mirage Spitter_Name Mirage } + Mob + { + Mob_Variants -1 + Common_Name Mirage + Witch_Name Mirage + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -8095,6 +9416,12 @@ Mutant_Tanks Smoker_Name Poltergeist Spitter_Name Poltergeist } + Mob + { + Mob_Variants -1 + Common_Name Poltergeist + Witch_Name Poltergeist + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -8200,6 +9527,12 @@ Mutant_Tanks Smoker_Name Psychotic Spitter_Name Psychotic } + Mob + { + Mob_Variants -1 + Common_Name Psychotic + Witch_Name Psychotic + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -8319,6 +9652,12 @@ Mutant_Tanks Smoker_Name Reverse-Flash Spitter_Name Reverse-Flash } + Mob + { + Mob_Variants -1 + Common_Name Reverse-Flash + Witch_Name Reverse-Flash + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -8417,6 +9756,12 @@ Mutant_Tanks Smoker_Name Spawner Spitter_Name Spawner } + Mob + { + Mob_Variants -1 + Common_Name Spawner + Witch_Name Spawner + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -8438,6 +9783,10 @@ Mutant_Tanks Particles { Body_Effects 32 + Common + { + Body_Chance 100.0,100.0,100.0,100.0,100.0,33.3,100.0 + } } Health { @@ -8452,19 +9801,19 @@ Mutant_Tanks Spitter_Extra_Health 100 } } - Zombie_Ability + Panic_Ability { Human_Ability 1 Human_Ammo 2 Human_Duration 26 - Ability_Enabled 1 + Ability_Enabled 2 Ability_Message 1 - Zombie_Amount 25 - Zombie_Chance 33.3 - Zombie_Duration 0 - Zombie_Interval 25.0 - Zombie_Mode 0 - Zombie_Type 0 + Panic_Amount 25 + Panic_Chance 33.3 + Panic_Duration 0 + Panic_Interval 25.0 + Panic_Mode 0 + Panic_Type 0 } } Tank_#103 @@ -8483,6 +9832,12 @@ Mutant_Tanks Smoker_Name Zoom Spitter_Name Zoom } + Mob + { + Mob_Variants -1 + Common_Name Zoom + Witch_Name Zoom + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -8581,6 +9936,12 @@ Mutant_Tanks Smoker_Name Trap Spitter_Name Trap } + Mob + { + Mob_Variants -1 + Common_Name Trap + Witch_Name Trap + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -8593,7 +9954,7 @@ Mutant_Tanks } Human_Support { - Human_Support 2 + Human_Support 1 } Props { @@ -8601,15 +9962,15 @@ Mutant_Tanks } Health { - Extra_Health 2000 + Extra_Health 1000 Special { - Boomer_Extra_Health 200 - Charger_Extra_Health 200 - Hunter_Extra_Health 200 - Jockey_Extra_Health 200 - Smoker_Extra_Health 200 - Spitter_Extra_Health 200 + Boomer_Extra_Health 100 + Charger_Extra_Health 100 + Hunter_Extra_Health 100 + Jockey_Extra_Health 100 + Smoker_Extra_Health 100 + Spitter_Extra_Health 100 } } Enhancements @@ -8628,6 +9989,8 @@ Mutant_Tanks Smash_Chance 33.3 Smash_Hit 1 Smash_Hit_Mode 0 + Smash_Mode 1 + Smash_Type 1 Special { Smash_Body 0 @@ -8655,6 +10018,12 @@ Mutant_Tanks Smoker_Name Dread Spitter_Name Dread } + Mob + { + Mob_Variants -1 + Common_Name Dread + Witch_Name Dread + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -8686,17 +10055,17 @@ Mutant_Tanks Spitter_Extra_Health 100 } } - Blind_Ability + Vision_Ability { Human_Ability 1 Ability_Effect 7 Ability_Message 1 - Blind_Chance 33.3 - Blind_Duration 7.5 - Blind_Hit 1 - Blind_Hit_Mode 0 - Blind_Intensity 235 - Blind_Mode 0 + Vision_Chance 33.3 + Vision_Duration 7.5 + Vision_Hit 1 + Vision_Hit_Mode 0 + Vision_Intensity 235 + Vision_Mode 1 } } Tank_#106 @@ -8715,6 +10084,12 @@ Mutant_Tanks Smoker_Name Rabid Spitter_Name Rabid } + Mob + { + Mob_Variants -1 + Common_Name Rabid + Witch_Name Rabid + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -8776,6 +10151,7 @@ Mutant_Tanks Ability_Message 1 Hurt_Hit 1 Hurt_Hit_Mode 0 + Hurt_Mode 1 } } Tank_#107 @@ -8794,6 +10170,12 @@ Mutant_Tanks Smoker_Name Tremor Spitter_Name Tremor } + Mob + { + Mob_Variants -1 + Common_Name Tremor + Witch_Name Tremor + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -8842,7 +10224,7 @@ Mutant_Tanks Combo_Chance 33.3,75.0 Combo_Damage 1.0 Combo_Duration 5.0 - Combo_Interval 0.2 + Combo_Interval 0.75 Combo_Radius -1.25;1.25 Combo_Set Rock,Track Combo_Speed 0.0,500.0 @@ -8856,6 +10238,11 @@ Mutant_Tanks Human_Duration 5 Ability_Enabled 1 Ability_Message 1 + Rock_Chance 33.3 + Rock_Damage 5 + Rock_Duration 5 + Rock_Interval 0.75 + Rock_Mode 0 } Track_Ability { @@ -8866,18 +10253,6 @@ Mutant_Tanks Ability_Message 1 Track_Mode 1 } - Spam_Ability - { - Human_Ability 1 - Human_Ammo 2 - Human_Duration 5 - Ability_Enabled 1 - Ability_Message 1 - Spam_Chance 33.3 - Spam_Damage 5 - Spam_Duration 5 - Spam_Interval 0.5 - } } /** * This is the plugin developer's personal Tank. @@ -8899,6 +10274,12 @@ Mutant_Tanks Smoker_Name Psyk0tik Spitter_Name Psyk0tik } + Mob + { + Mob_Variants -1 + Common_Name Psyk0tik + Witch_Name Psyk0tik + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -9027,6 +10408,12 @@ Mutant_Tanks Smoker_Name Apocalyptic Spitter_Name Apocalyptic } + Mob + { + Mob_Variants -1 + Common_Name Apocalyptic + Witch_Name Apocalyptic + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -9112,6 +10499,7 @@ Mutant_Tanks Rock_Damage 10 Rock_Duration 3 Rock_Interval 0.2 + Rock_Mode 1 Rock_Radius -5.0,5.0 } } @@ -9131,6 +10519,12 @@ Mutant_Tanks Smoker_Name "Darth Vader" Spitter_Name "Darth Vader" } + Mob + { + Mob_Variants -1 + Common_Name "Darth Vader" + Witch_Name "Darth Vader" + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -9159,7 +10553,16 @@ Mutant_Tanks } Health { - Extra_Health 1500 + Extra_Health 1000 + Special + { + Boomer_Extra_Health 100 + Charger_Extra_Health 100 + Hunter_Extra_Health 100 + Jockey_Extra_Health 100 + Smoker_Extra_Health 100 + Spitter_Extra_Health 100 + } } Enhancements { @@ -9228,6 +10631,12 @@ Mutant_Tanks Smoker_Name "Drug Addict" Spitter_Name "Drug Addict" } + Mob + { + Mob_Variants -1 + Common_Name "Drug Addict" + Witch_Name "Drug Addict" + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -9240,7 +10649,7 @@ Mutant_Tanks } Human_Support { - Human_Support 2 + Human_Support 1 } Props { @@ -9256,18 +10665,22 @@ Mutant_Tanks Particles { Body_Effects 32 + Common + { + Body_Chance 100.0,100.0,100.0,100.0,100.0,33.3,100.0 + } } Health { - Extra_Health 2000 + Extra_Health 1000 Special { - Boomer_Extra_Health 200 - Charger_Extra_Health 200 - Hunter_Extra_Health 200 - Jockey_Extra_Health 200 - Smoker_Extra_Health 200 - Spitter_Extra_Health 200 + Boomer_Extra_Health 100 + Charger_Extra_Health 100 + Hunter_Extra_Health 100 + Jockey_Extra_Health 100 + Smoker_Extra_Health 100 + Spitter_Extra_Health 100 } } Drug_Ability @@ -9282,12 +10695,13 @@ Mutant_Tanks Drug_Hit_Mode 0 Drug_Interval 1.0 } - Item_Ability + Drop_Ability { Human_Ability 1 - Item_Pinata pain_pills,pain_pills,pain_pills,pain_pills,pain_pills - Item_Pinata_Body 1 - Item_Pinata_Chance 100.0 + Ability_Enabled 2 + Drop_Pinata pain_pills,pain_pills,pain_pills,pain_pills,pain_pills + Drop_Pinata_Body 1 + Drop_Pinata_Chance 100.0 } Slow_Ability { @@ -9319,6 +10733,12 @@ Mutant_Tanks Smoker_Name Godspeed Spitter_Name Godspeed } + Mob + { + Mob_Variants -1 + Common_Name Godspeed + Witch_Name Godspeed + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -9417,6 +10837,12 @@ Mutant_Tanks Smoker_Name "Grim Reaper" Spitter_Name "Grim Reaper" } + Mob + { + Mob_Variants -1 + Common_Name "Grim Reaper" + Witch_Name "Grim Reaper" + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -9505,6 +10931,12 @@ Mutant_Tanks Smoker_Name Horde Spitter_Name Horde } + Mob + { + Mob_Variants -1 + Common_Name Horde + Witch_Name Horde + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -9600,6 +11032,12 @@ Mutant_Tanks Smoker_Name Hulk Spitter_Name Hulk } + Mob + { + Mob_Variants -1 + Common_Name Hulk + Witch_Name Hulk + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -9669,6 +11107,7 @@ Mutant_Tanks Ability_Message 1 Hurt_Hit 1 Hurt_Hit_Mode 1 + Hurt_Mode 1 } Absorb_Ability { @@ -9685,15 +11124,16 @@ Mutant_Tanks Absorb_Hittable_Divisor 20.0 Absorb_Melee_Divisor 200.0 } - Shake_Ability + Vision_Ability { Human_Ability 1 Ability_Enabled 1 Ability_Effect 7 - Shake_Duration 99999 - Shake_Interval 1.0 - Shake_Range 1000.0 - Shake_Range_Chance 100.0 + Vision_Duration 99999 + Vision_Interval 1.0 + Vision_Mode 4 + Vision_Range 1000.0 + Vision_Range_Chance 100.0 } Smash_Ability { @@ -9704,6 +11144,8 @@ Mutant_Tanks Smash_Chance 15.0 Smash_Hit 1 Smash_Hit_Mode 1 + Smash_Mode 1 + Smash_Type 1 Special { Smash_Body 0 @@ -9727,6 +11169,12 @@ Mutant_Tanks Smoker_Name Ninja Spitter_Name Ninja } + Mob + { + Mob_Variants -1 + Common_Name Ninja + Witch_Name Ninja + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -9838,6 +11286,12 @@ Mutant_Tanks Smoker_Name Zen Spitter_Name Zen } + Mob + { + Mob_Variants -1 + Common_Name Zen + Witch_Name Zen + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -9933,6 +11387,12 @@ Mutant_Tanks Smoker_Name "The Boss (1st Form)" Spitter_Name "The Boss (1st Form)" } + Mob + { + Mob_Variants -1 + Common_Name "The Boss (1st Form)" + Witch_Name "The Boss (1st Form)" + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -10016,6 +11476,12 @@ Mutant_Tanks Smoker_Name "Steel Overlord (2nd Form)" Spitter_Name "Steel Overlord (2nd Form)" } + Mob + { + Mob_Variants -1 + Common_Name "Steel Overlord (2nd Form)" + Witch_Name "Steel Overlord (2nd Form)" + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -10116,6 +11582,12 @@ Mutant_Tanks Smoker_Name "Night Stalker (3rd Form)" Spitter_Name "Night Stalker (3rd Form)" } + Mob + { + Mob_Variants -1 + Common_Name "Night Stalker (3rd Form)" + Witch_Name "Night Stalker (3rd Form)" + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -10177,16 +11649,16 @@ Mutant_Tanks { Fire_Immunity 1 } - Blind_Ability + Vision_Ability { Ability_Effect 7 Ability_Message 1 - Blind_Chance 100.0 - Blind_Duration 5.0 - Blind_Hit 1 - Blind_Hit_Mode 1 - Blind_Intensity 255 - Blind_Mode 0 + Vision_Chance 100.0 + Vision_Duration 5.0 + Vision_Hit 1 + Vision_Hit_Mode 1 + Vision_Intensity 255 + Vision_Mode 1 } Bomb_Ability { @@ -10236,6 +11708,12 @@ Mutant_Tanks Smoker_Name "Spirit of Fire (4th Form)" Spitter_Name "Spirit of Fire (4th Form)" } + Mob + { + Mob_Variants -1 + Common_Name "Spirit of Fire (4th Form)" + Witch_Name "Spirit of Fire (4th Form)" + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -10367,6 +11845,12 @@ Mutant_Tanks Smoker_Name Randomizer Spitter_Name Randomizer } + Mob + { + Mob_Variants -1 + Common_Name Randomizer + Witch_Name Randomizer + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -10440,6 +11924,12 @@ Mutant_Tanks Smoker_Name Shapeshifter Spitter_Name Shapeshifter } + Mob + { + Mob_Variants -1 + Common_Name Shapeshifter + Witch_Name Shapeshifter + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -10503,6 +11993,12 @@ Mutant_Tanks Smoker_Name Flashbanger Spitter_Name Flashbanger } + Mob + { + Mob_Variants -1 + Common_Name Flashbanger + Witch_Name Flashbanger + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -10541,26 +12037,26 @@ Mutant_Tanks Spitter_Extra_Health 100 } } - Blind_Ability + Vision_Ability { Human_Ability 1 Human_Ammo 2 Ability_Enabled 1 Ability_Effect 7 Ability_Message 1 - Blind_Chance 33.3 - Blind_Duration 5.0 - Blind_Hit 1 - Blind_Hit_Mode 0 - Blind_Intensity 255 - Blind_Mode 1 - Blind_Range 150.0 - Blind_Range_Chance 15.0 - Blind_Stagger 3 - } - } - // The following sample showcases a certain type of the Splatter ability. - Tank_#125 + Vision_Chance 33.3 + Vision_Duration 5.0 + Vision_Hit 1 + Vision_Hit_Mode 0 + Vision_Intensity 255 + Vision_Mode 2 + Vision_Range 150.0 + Vision_Range_Chance 15.0 + Vision_Stagger 3 + } + } + // The following sample showcases a certain type of the Splatter ability. + Tank_#125 { General { @@ -10577,6 +12073,12 @@ Mutant_Tanks Smoker_Name Mudman Spitter_Name Mudman } + Mob + { + Mob_Variants -1 + Common_Name Mudman + Witch_Name Mudman + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -10616,21 +12118,22 @@ Mutant_Tanks Spitter_Extra_Health 100 } } - Splatter_Ability + Vision_Ability { Human_Ability 1 Human_Ammo 2 Ability_Enabled 1 Ability_Effect 7 Ability_Message 1 - Splatter_Chance 33.3 - Splatter_Duration 5 - Splatter_Hit 1 - Splatter_Hit_Mode 0 - Splatter_Interval 1.0 - Splatter_Range 150.0 - Splatter_Range_Chance 15.0 - Splatter_Type 14 + Vision_Chance 33.3 + Vision_Duration 5.0 + Vision_Hit 1 + Vision_Hit_Mode 0 + Vision_Interval 1.0 + Vision_Mode 8 + Vision_Range 150.0 + Vision_Range_Chance 15.0 + Vision_Type 14 } } // The following samples are impossible to beat and only serve as annoyances or fatal threats. @@ -10650,6 +12153,12 @@ Mutant_Tanks Smoker_Name Endgame Spitter_Name Endgame } + Mob + { + Mob_Variants -1 + Common_Name Endgame + Witch_Name Endgame + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -10696,6 +12205,13 @@ Mutant_Tanks Fast_Duration 99999 Fast_Speed 10.0 } + Gravity_Ability + { + Ability_Enabled 2 + Ability_Message 4 + Gravity_Flags 8 + Gravity_Force -100.0 + } Smash_Ability { Human_Ability 1 @@ -10705,6 +12221,8 @@ Mutant_Tanks Smash_Chance 100.0 Smash_Hit 1 Smash_Hit_Mode 1 + Smash_Mode 1 + Smash_Type 1 Special { Smash_Body 0 @@ -10728,6 +12246,12 @@ Mutant_Tanks Smoker_Name Playful Spitter_Name Playful } + Mob + { + Mob_Variants -1 + Common_Name Playful + Witch_Name Playful + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -10789,6 +12313,12 @@ Mutant_Tanks Smoker_Name Annoying Spitter_Name Annoying } + Mob + { + Mob_Variants -1 + Common_Name Annoying + Witch_Name Annoying + } Tank_Enabled -1 Tank_Chance 100.0 Tank_Note 1 @@ -10821,13 +12351,2005 @@ Mutant_Tanks { Human_Ability 1 Human_Ammo 99999 - Ability_Enabled 1 + Ability_Enabled 2 Ability_Message 1 Respawn_Amount 99999 Respawn_Chance 100.0 Respawn_Type 128-128 } } + Tank_#129 + { + General + { + Tank_Name Sipow + Special + { + Special_Types -1 + Special_Note -1 + Boomer_Name Sipow + Charger_Name Sipow + Hunter_Name Sipow + Jockey_Name Sipow + Smoker_Name Sipow + Spitter_Name Sipow + } + Mob + { + Mob_Variants -1 + Common_Name Sipow + Witch_Name Sipow + } + Tank_Enabled -1 + Tank_Chance 100.0 + Tank_Note 1 + Skin_Color 50,125,255,255 + } + Glow + { + Glow_Enabled 1 + Glow_Color 255,175,0 + } + Human_Support + { + Human_Support 1 + } + Props + { + Light_Color 255,175,0,255 + Oxygen_Tank_Color 255,175,0,255 + Flame_Color 255,175,0,180 + Rock_Color 255,175,0,255 + Tire_Color 255,175,0,255 + Propane_Tank_Color 255,175,0,255 + Flashlight_Color 255,175,0,255 + Crown_Color 255,175,0,255 + } + Particles + { + Body_Effects 80 + Rock_Effects 8 + } + Health + { + Extra_Health 1000 + Special + { + Boomer_Extra_Health 100 + Charger_Extra_Health 100 + Hunter_Extra_Health 100 + Jockey_Extra_Health 100 + Smoker_Extra_Health 100 + Spitter_Extra_Health 100 + } + } + Enhancements + { + Throw_Interval 10.0 + Run_Speed 1.33 + } + Immunities + { + Explosive_Immunity 1 + Fire_Immunity 1 + } + Acid_Ability + { + Human_Ability 1 + Human_Ammo 2 + Ability_Enabled 1 + Ability_Effect 7 + Ability_Message 5 + Acid_Chance 33.3 + Acid_Cooldown 3 + Acid_Damage 3.0 + Acid_Death 1 + Acid_Death_Chance 33.3 + Acid_Death_Range 200.0 + Acid_Hit 1 + Acid_Hit_Mode 0 + Acid_Range 150.0 + Acid_Range_Chance 15.0 + Acid_Rock_Break 1 + Acid_Rock_Chance 33.3 + Special + { + Acid_Cooldown 3 + Acid_Damage 1.0 + } + } + Meteor_Ability + { + Human_Ability 1 + Human_Ammo 1 + Human_Duration 5 + Ability_Enabled 1 + Ability_Message 1 + Meteor_Chance 15.0 + Meteor_Duration 5 + Meteor_Interval 0.6 + Meteor_Lifetime 15.0 + Meteor_Mode 0 + Meteor_Radius -180.0,180.0 + } + } + Tank_#130 + { + General + { + Tank_Name Evil + Special + { + Special_Types -1 + Special_Note -1 + Boomer_Name Evil + Charger_Name Evil + Hunter_Name Evil + Jockey_Name Evil + Smoker_Name Evil + Spitter_Name Evil + } + Mob + { + Mob_Variants -1 + Common_Name Evil + Witch_Name Evil + } + Tank_Enabled -1 + Tank_Chance 100.0 + Tank_Note 1 + Skin_Color 170,20,60,255 + } + Glow + { + Glow_Enabled 1 + Glow_Color 0,0,140 + } + Human_Support + { + Human_Support 1 + } + Props + { + Props_Attached 124 + Light_Color 0,0,140,255 + Oxygen_Tank_Color 0,0,140,255 + Flame_Color 0,0,140,180 + Rock_Color 0,0,140,255 + Tire_Color 0,0,140,255 + Propane_Tank_Color 0,0,140,255 + Flashlight_Color 0,0,140,255 + Crown_Color 0,0,140,255 + } + Health + { + Extra_Health 1000 + Special + { + Boomer_Extra_Health 100 + Charger_Extra_Health 100 + Hunter_Extra_Health 100 + Jockey_Extra_Health 100 + Smoker_Extra_Health 100 + Spitter_Extra_Health 100 + } + } + Fire_Ability + { + Ability_Effect 7 + Ability_Message 1 + Fire_Chance 100.0 + Fire_Cooldown 3 + Fire_Damage 0.5 + Fire_Hit 1 + Fire_Hit_Mode 0 + Special + { + Fire_Cooldown 3 + Fire_Damage 0.25 + } + } + Ice_Ability + { + Ability_Effect 7 + Ability_Message 1 + Ice_Chance 100.0 + Ice_Cooldown 3 + Ice_Hit 1 + Ice_Hit_Mode 0 + Special + { + Ice_Cooldown 3 + } + } + Medic_Ability + { + Human_Ability 1 + Human_Ammo 2 + Human_Duration 6 + Ability_Enabled 1 + Ability_Message 1 + Medic_Chance 100.0 + Medic_Duration 0 + Medic_Field 1 + Medic_Field_Color 0,255,0 + Medic_Health 25,25,25,25,25,25,100 + Medic_Interval 1.0 + Medic_Max_Health 250,50,250,100,325,600,10000 + Medic_Range 500.0 + } + Respawn_Ability + { + Human_Ability 1 + Human_Ammo 2 + Human_Duration 5 + Ability_Enabled 1 + Ability_Message 1 + Respawn_Chance 100.0 + Respawn_Duration 0 + Respawn_Filter 0 + Respawn_Range 500.0 + } + } + Tank_#131 + { + General + { + Tank_Name Officer + Special + { + Special_Types -1 + Special_Note -1 + Boomer_Name Officer + Charger_Name Officer + Hunter_Name Officer + Jockey_Name Officer + Smoker_Name Officer + Spitter_Name Officer + } + Mob + { + Mob_Variants -1 + Common_Name Officer + Witch_Name Officer + } + Tank_Enabled -1 + Tank_Chance 100.0 + Tank_Note 1 + Skin_Color 100,100,100,255 + } + Glow + { + Glow_Enabled 1 + Glow_Color 100,100,100 + } + Human_Support + { + Human_Support 1 + } + Spawn + { + Open_Areas_Only 150.0 + } + Props + { + Props_Attached 242 // L4D1: 194 + Light_Color 0,0,255,255 + Rock_Color 0,0,0,255 + Tire_Color 100,100,100,255 + Propane_Tank_Color 0,0,0,255 + Flashlight_Color 255,0,0,255 + } + Health + { + Extra_Health 1000 + Special + { + Boomer_Extra_Health 100 + Charger_Extra_Health 100 + Hunter_Extra_Health 100 + Jockey_Extra_Health 100 + Smoker_Extra_Health 100 + Spitter_Extra_Health 100 + } + } + Drop_Ability + { + Human_Ability 1 + Ability_Enabled 1 + Ability_Message 1 + Drop_Chance 100.0 + Drop_Mode 2 + Drop_Weapon_Boost 1.15 + Drop_Weapon_Name tonfa + Drop_Weapon_Resistance 0.85 + Drop_Weapon_Scale 1.0 + } + Gunner_Ability + { + Human_Ability 1 + Human_Ammo 2 + Ability_Enabled 1 + Ability_Message 1 + Gunner_Accuracy 2.0 + Gunner_Bullets 5 + Gunner_Chance 100.0 + Gunner_Clip_Size 10 + Gunner_Damage 5.0 + Gunner_Duration 99999.0 + Gunner_Gun_Type 3 + Gunner_Interval 1.0 + Gunner_Load_Time 1.0 + Gunner_Range 500.0 + Gunner_Reaction_Time 1.0 + Gunner_Target_Type 7 + Special + { + Gunner_Clip_Size 15 + Gunner_Damage 1.0 + Gunner_Gun_Type 1 + Gunner_Target_Type 7 + } + } + Minion_Ability + { + Human_Ability 1 + Human_Ammo 2 + Ability_Enabled 1 + Ability_Message 1 + Minion_Amount 4 + Minion_Chance 100.0 + Minion_Filter 0 + Minion_Lifetime 0.0 + Minion_Remove 1 + Minion_Replace 1 + Minion_Type 131-131 + } + Panic_Ability + { + Special + { + Human_Ability 1 + Human_Ammo 2 + Ability_Enabled 2 + Ability_Message 1 + Panic_Amount 1 + Panic_Chance 100.0 + Panic_Duration 0 + Panic_Interval 5.0 + Panic_Mode 2 + Panic_Type 64 + } + } + } + Tank_#132 + { + General + { + Tank_Name Mafia + Special + { + Special_Types -1 + Special_Note -1 + Boomer_Name Mafia + Charger_Name Mafia + Hunter_Name Mafia + Jockey_Name Mafia + Smoker_Name Mafia + Spitter_Name Mafia + } + Mob + { + Mob_Variants -1 + Common_Name Mafia + Witch_Name Mafia + } + Tank_Enabled -1 + Tank_Chance 100.0 + Tank_Note 1 + Skin_Color 180,0,180,255 + } + Glow + { + Glow_Enabled 1 + Glow_Color 180,0,180 + } + Human_Support + { + Human_Support 1 + } + Spawn + { + Open_Areas_Only 500.0 + } + Props + { + Props_Attached 0 + } + Health + { + Extra_Health 1000 + Special + { + Boomer_Extra_Health 100 + Charger_Extra_Health 100 + Hunter_Extra_Health 100 + Jockey_Extra_Health 100 + Smoker_Extra_Health 100 + Spitter_Extra_Health 100 + } + } + Enhancements + { + Run_Speed 2.5 + } + Clone_Ability + { + Human_Ability 1 + Human_Ammo 2 + Ability_Enabled 1 + Ability_Message 1 + Clone_Amount 2 + Clone_Chance 100.0 + Clone_Health 1500 + Clone_Lifetime 0.0 + Clone_Remove 0 + Clone_Replace 1 + Clone_Swap 0.0 + Clone_Type 132-132 + Special + { + Clone_Health 150 + } + } + Smash_Ability + { + Ability_Effect 7 + Ability_Message 1 + Smash_Body 1 + Smash_Chance 33.0 + Smash_Hit 1 + Smash_Hit_Mode 1 + Smash_Mode 1 + Smash_Type 1 + Special + { + Smash_Body 0 + Smash_Meter 50.0 + } + } + } + Tank_#133 + { + General + { + Tank_Name Frankenstein + Special + { + Special_Types -1 + Special_Note -1 + Boomer_Name Frankenstein + Charger_Name Frankenstein + Hunter_Name Frankenstein + Jockey_Name Frankenstein + Smoker_Name Frankenstein + Spitter_Name Frankenstein + } + Mob + { + Mob_Variants -1 + Common_Name Frankenstein + Witch_Name Frankenstein + } + Tank_Enabled -1 + Tank_Chance 100.0 + Tank_Note 1 + Skin_Color 85,125,75,255 + } + Glow + { + Glow_Enabled 1 + Glow_Color 85,125,75 + } + Human_Support + { + Human_Support 1 + } + Props + { + Props_Attached 16 // L4D1: 0 + Rock_Color 100,100,100,255 + } + Health + { + Extra_Health 1000 + Special + { + Boomer_Extra_Health 100 + Charger_Extra_Health 100 + Hunter_Extra_Health 100 + Jockey_Extra_Health 100 + Smoker_Extra_Health 100 + Spitter_Extra_Health 100 + } + } + Enhancements + { + Claw_Damage 1.0 + Hittable_Damage 1.0 + Rock_Damage 1.0 + Run_Speed 0.65 + } + Ghost_Ability + { + Ability_Effect 7 + Ability_Message 1 + Ghost_Hit 1 + Ghost_Hit_Mode 0 + Ghost_Weapon_Slots 28 + } + Jump_Ability + { + Ability_Enabled 2 + Ability_Message 4 + Jump_Mode 1 + Jump_Sporadic_Chance 33.3 + Jump_Sporadic_Height 750.0 + } + Undead_Ability + { + Human_Ability 1 + Human_Ammo 2 + Ability_Enabled 1 + Ability_Message 1 + Undead_Amount 2 + Undead_Chance 100.0 + } + Warp_Ability + { + Ability_Enabled 2 + Ability_Message 4 + Warp_Interval 10.0 + } + } + Tank_#134 + { + General + { + Tank_Name Prototype + Special + { + Special_Types -1 + Special_Note -1 + Boomer_Name Prototype + Charger_Name Prototype + Hunter_Name Prototype + Jockey_Name Prototype + Smoker_Name Prototype + Spitter_Name Prototype + } + Mob + { + Mob_Variants -1 + Common_Name Prototype + Witch_Name Prototype + } + Tank_Enabled -1 + Tank_Chance 100.0 + Tank_Note 1 + Skin_Color 75,75,75,255 + } + Glow + { + Glow_Enabled 1 + Glow_Color 255,25,55 + } + Human_Support + { + Human_Support 1 + } + Props + { + Props_Attached 18 // L4D1: 2 + Light_Color 255,25,55,255 + Rock_Color 255,25,55,255 + } + Health + { + Extra_Health 1000 + Special + { + Boomer_Extra_Health 100 + Charger_Extra_Health 100 + Hunter_Extra_Health 100 + Jockey_Extra_Health 100 + Smoker_Extra_Health 100 + Spitter_Extra_Health 100 + } + } + Absorb_Ability + { + Human_Ability 1 + Human_Ammo 2 + Human_Duration 99999 + Ability_Enabled 1 + Ability_Message 1 + Absorb_Bullet_Divisor 20.0 + Absorb_Chance 100.0 + Absorb_Duration 99999 + Absorb_Explosive_Divisor 20.0 + Absorb_Fire_Divisor 200.0 + Absorb_Hittable_Divisor 20.0 + Absorb_Melee_Divisor 200.0 + } + Smash_Ability + { + Ability_Effect 7 + Ability_Message 1 + Smash_Body 1 + Smash_Chance 33.3 + Smash_Hit 1 + Smash_Hit_Mode 0 + Smash_Mode 1 + Smash_Remove 1 + Smash_Type 1 + Special + { + Smash_Body 0 + Smash_Meter 50.0 + } + } + Omni_Ability + { + Requires_Humans 0 + Human_Ability 1 + Human_Ammo 3 + Human_Duration 5 + Ability_Enabled 1 + Ability_Message 1 + Omni_Chance 33.3 + Omni_Duration 5 + Omni_Mode 0 + Omni_Range 500.0 + } + Respawn_Ability + { + Human_Ability 1 + Human_Ammo 1 + Ability_Enabled 2 + Ability_Message 1 + Respawn_Amount 2 + Respawn_Chance 100.0 + Respawn_Type 134-134 + } + } + Tank_#135 + { + General + { + Tank_Name Zeus + Special + { + Special_Types -1 + Special_Note -1 + Boomer_Name Zeus + Charger_Name Zeus + Hunter_Name Zeus + Jockey_Name Zeus + Smoker_Name Zeus + Spitter_Name Zeus + } + Mob + { + Mob_Variants -1 + Common_Name Zeus + Witch_Name Zeus + } + Tank_Enabled -1 + Tank_Chance 100.0 + Tank_Note 1 + Skin_Color 175,40,255,255 + } + Glow + { + Glow_Enabled 1 + Glow_Color 0,100,155 + } + Human_Support + { + Human_Support 1 + } + Spawn + { + Open_Areas_Only 500.0 + } + Props + { + Props_Attached 272 // L4D1: 224 + Rock_Color 0,100,155,255 + Crown_Color 0,100,155,255 + } + Particles + { + Body_Effects 2 + Rock_Effects 2 + } + Health + { + Extra_Health 1000 + Special + { + Boomer_Extra_Health 100 + Charger_Extra_Health 100 + Hunter_Extra_Health 100 + Jockey_Extra_Health 100 + Smoker_Extra_Health 100 + Spitter_Extra_Health 100 + } + } + Immunities + { + Fire_Immunity 1 + } + Electric_Ability + { + Human_Ability 1 + Human_Ammo 2 + Ability_Enabled 1 + Ability_Effect 7 + Ability_Message 7 + Electric_Chance 66.6 + Electric_Damage 5.0 + Electric_Duration 5 + Electric_Hit 1 + Electric_Hit_Mode 0 + Electric_Interval 1.0 + Electric_Range 150.0 + Electric_Range_Chance 30.0 + } + Lightning_Ability + { + Ability_Enabled 1 + Ability_Message 1 + Lightning_Chance 100.0 + Lightning_Damage 5 + Lightning_Duration 99999 + Lightning_Interval 0.5 + } + Smash_Ability + { + Ability_Effect 7 + Ability_Message 1 + Smash_Body 1 + Smash_Chance 15.0 + Smash_Hit 1 + Smash_Hit_Mode 1 + Smash_Mode 4 + Smash_Type 1 + Special + { + Smash_Body 0 + Smash_Meter 50.0 + } + } + Warp_Ability + { + Ability_Enabled 2 + Ability_Message 4 + Warp_Interval 7.5 + } + } + Tank_#136 + { + General + { + Tank_Name Trajectory + Special + { + Special_Types -1 + Special_Note -1 + Boomer_Name Trajectory + Charger_Name Trajectory + Hunter_Name Trajectory + Jockey_Name Trajectory + Smoker_Name Trajectory + Spitter_Name Trajectory + } + Mob + { + Mob_Variants -1 + Common_Name Trajectory + Witch_Name Trajectory + } + Tank_Enabled -1 + Tank_Chance 100.0 + Tank_Note 1 + Skin_Color 255,150,75,255 + } + Glow + { + Glow_Enabled 1 + Glow_Color 55,150,125 + } + Human_Support + { + Human_Support 1 + } + Props + { + Light_Color 55,150,125,255 + Oxygen_Tank_Color 55,150,125,255 + Flame_Color 55,150,125,180 + Rock_Color 55,150,125,255 + Tire_Color 55,150,125,255 + Propane_Tank_Color 55,150,125,255 + Flashlight_Color 55,150,125,255 + Crown_Color 55,150,125,255 + } + Health + { + Extra_Health 1000 + Special + { + Boomer_Extra_Health 100 + Charger_Extra_Health 100 + Hunter_Extra_Health 100 + Jockey_Extra_Health 100 + Smoker_Extra_Health 100 + Spitter_Extra_Health 100 + } + } + Fast_Ability + { + Human_Ability 1 + Human_Ammo 2 + Human_Duration 99999 + Ability_Enabled 1 + Ability_Message 1 + Fast_Chance 100.0 + Fast_Duration 99999 + Fast_Speed 5.0 + } + Jump_Ability + { + Human_Ability 1 + Human_Ammo 2 + Human_Duration 5 + Ability_Enabled 3 + Ability_Effect 7 + Ability_Message 7 + Jump_Chance 33.3 + Jump_Duration 5 + Jump_Height 300.0 + Jump_Hit 1 + Jump_Hit_Mode 0 + Jump_Mode 1 + Jump_Range 150.0 + Jump_Range_Chance 15.0 + Jump_Sporadic_Chance 33.3 + Jump_Sporadic_Height 750.0 + } + Warp_Ability + { + Human_Ability 1 + Human_Ammo 2 + Human_Duration 10 + Ability_Enabled 2 + Ability_Message 4 + Warp_Duration 0 + Warp_Interval 7.5 + } + } + Tank_#137 + { + General + { + Tank_Name Barrage + Special + { + Special_Types -1 + Special_Note -1 + Boomer_Name Barrage + Charger_Name Barrage + Hunter_Name Barrage + Jockey_Name Barrage + Smoker_Name Barrage + Spitter_Name Barrage + } + Mob + { + Mob_Variants -1 + Common_Name Barrage + Witch_Name Barrage + } + Tank_Enabled -1 + Tank_Chance 100.0 + Tank_Note 1 + Skin_Color 150,80,125,255 + } + Glow + { + Glow_Enabled 1 + Glow_Color 40,80,165 + } + Human_Support + { + Human_Support 1 + } + Spawn + { + Open_Areas_Only 500.0 + } + Props + { + Light_Color 40,80,165,255 + Oxygen_Tank_Color 40,80,165,255 + Flame_Color 40,80,165,180 + Rock_Color 40,80,165,255 + Tire_Color 40,80,165,255 + Propane_Tank_Color 40,80,165,255 + Flashlight_Color 40,80,165,255 + Crown_Color 40,80,165,255 + } + Health + { + Extra_Health 1000 + Special + { + Boomer_Extra_Health 100 + Charger_Extra_Health 100 + Hunter_Extra_Health 100 + Jockey_Extra_Health 100 + Smoker_Extra_Health 100 + Spitter_Extra_Health 100 + } + } + Meteor_Ability + { + Human_Ability 1 + Human_Ammo 1 + Human_Cooldown 0 + Ability_Enabled 1 + Ability_Message 1 + Meteor_Chance 100.0 + Meteor_Duration 99999 + Meteor_Interval 0.6 + Meteor_Lifetime 15.0 + Meteor_Mode 1 + Meteor_Radius -180.0,180.0 + } + Regen_Ability + { + Human_Ability 1 + Human_Ammo 2 + Human_Duration 99999 + Ability_Enabled 1 + Ability_Effect 4 + Ability_Message 1 + Regen_Chance 100.0 + Regen_Duration 0 + Regen_Health 200 + Regen_Interval 1.0 + Regen_Limit 4000 + Regen_Range 500.0 + Special + { + Regen_Health 20 + Regen_Limit 400 + Regen_Range 150.0 + } + } + Rock_Ability + { + Requires_Humans 0 + Human_Ability 1 + Human_Ammo 2 + Human_Duration 99999 + Ability_Enabled 1 + Ability_Message 1 + Rock_Chance 100.0 + Rock_Damage 5 + Rock_Duration 99999 + Rock_Interval 0.75 + Rock_Mode 0 + Rock_Radius -5.0,5.0 + } + Shove_Ability + { + Ability_Effect 7 + Ability_Message 1 + Shove_Chance 66.6 + Shove_Duration 5 + Shove_Hit 1 + Shove_Hit_Mode 1 + Shove_Interval 1.0 + } + } + Tank_#138 + { + General + { + Tank_Name Collector + Special + { + Special_Types -1 + Special_Note -1 + Boomer_Name Collector + Charger_Name Collector + Hunter_Name Collector + Jockey_Name Collector + Smoker_Name Collector + Spitter_Name Collector + } + Mob + { + Mob_Variants -1 + Common_Name Collector + Witch_Name Collector + } + Tank_Enabled -1 + Tank_Chance 100.0 + Tank_Note 1 + Skin_Color 255,70,165,255 + } + Glow + { + Glow_Enabled 1 + Glow_Color 255,70,165 + } + Human_Support + { + Human_Support 1 + } + Spawn + { + Open_Areas_Only 500.0 + } + Props + { + Props_Attached 0 + } + Health + { + Extra_Health 1000 + Special + { + Boomer_Extra_Health 100 + Charger_Extra_Health 100 + Hunter_Extra_Health 100 + Jockey_Extra_Health 100 + Smoker_Extra_Health 100 + Spitter_Extra_Health 100 + } + } + Choke_Ability + { + Ability_Effect 7 + Ability_Message 1 + Choke_Block 1 + Choke_Chance 100.0 + Choke_Damage 1.0 + Choke_Delay 1.0 + Choke_Duration 99999 + Choke_Hit 1 + Choke_Hit_Mode 1 + } + Gravity_Ability + { + Ability_Enabled 2 + Ability_Message 4 + Gravity_Flags 8 + Gravity_Force -50.0 + } + } + Tank_#139 + { + General + { + Tank_Name Timewalker + Special + { + Special_Types -1 + Special_Note -1 + Boomer_Name Timewalker + Charger_Name Timewalker + Hunter_Name Timewalker + Jockey_Name Timewalker + Smoker_Name Timewalker + Spitter_Name Timewalker + } + Mob + { + Mob_Variants -1 + Common_Name Timewalker + Witch_Name Timewalker + } + Tank_Enabled -1 + Tank_Chance 100.0 + Tank_Note 1 + Skin_Color 0,200,255,255 + } + Glow + { + Glow_Enabled 1 + Glow_Color 0,200,255 + } + Human_Support + { + Human_Support 1 + } + Props + { + Props_Attached 0 + } + Health + { + Extra_Health 1000 + Special + { + Boomer_Extra_Health 100 + Charger_Extra_Health 100 + Hunter_Extra_Health 100 + Jockey_Extra_Health 100 + Smoker_Extra_Health 100 + Spitter_Extra_Health 100 + } + } + Clone_Ability + { + Human_Ability 1 + Human_Ammo 2 + Ability_Enabled 1 + Ability_Message 1 + Clone_Amount 2 + Clone_Chance 100.0 + Clone_Health 1000 + Clone_Lifetime 10.0 + Clone_Remove 0 + Clone_Replace 1 + Clone_Swap 5.0 + Clone_Type 139-139 + Special + { + Clone_Health 100 + } + } + Fast_Ability + { + Human_Ability 1 + Human_Ammo 2 + Human_Duration 3 + Ability_Enabled 1 + Ability_Message 1 + Fast_Chance 33.3 + Fast_Duration 3 + Fast_Speed 10.0 + } + Ghost_Ability + { + Ability_Effect 7 + Ability_Message 1 + Ghost_Chance 15.0 + Ghost_Hit 1 + Ghost_Hit_Mode 0 + Ghost_Weapon_Slots 28 + } + Recall_Ability + { + Human_Ability 1 + Human_Ammo 5 + Ability_Enabled 3 + Ability_Message 1 + Recall_Blink_Chance 0.0 + Recall_Blink_Count 0 + Recall_Rewind_Chance 100.0 + Recall_Rewind_Cleanse 1 + Recall_Rewind_Cooldown 5 + Recall_Rewind_Lifetime 10 + Recall_Rewind_Mode 0 + Recall_Rewind_Threshold 1.0 + } + Undead_Ability + { + Human_Ability 1 + Human_Ammo 2 + Ability_Enabled 1 + Ability_Message 1 + Undead_Amount 2 + Undead_Chance 100.0 + } + Warp_Ability + { + Ability_Enabled 2 + Ability_Message 4 + Warp_Interval 10.0 + } + } + Tank_#140 + { + General + { + Tank_Name "Speed Demon" + Special + { + Special_Types -1 + Special_Note -1 + Boomer_Name "Speed Demon" + Charger_Name "Speed Demon" + Hunter_Name "Speed Demon" + Jockey_Name "Speed Demon" + Smoker_Name "Speed Demon" + Spitter_Name "Speed Demon" + } + Mob + { + Mob_Variants -1 + Common_Name "Speed Demon" + Witch_Name "Speed Demon" + } + Tank_Enabled -1 + Tank_Chance 100.0 + Tank_Note 1 + Skin_Color 100,0,0,255 + } + Glow + { + Glow_Enabled 1 + Glow_Color 255,200,60 + } + Human_Support + { + Human_Support 1 + } + Props + { + Light_Color 255,200,60,255 + Oxygen_Tank_Color 255,200,60,255 + Flame_Color 255,200,60,180 + Rock_Color 255,200,60,255 + Tire_Color 255,200,60,255 + Propane_Tank_Color 255,200,60,255 + Flashlight_Color 255,200,60,255 + Crown_Color 255,200,60,255 + } + Particles + { + Body_Effects 4 + Rock_Effects 4 + } + Health + { + Extra_Health 1000 + Special + { + Boomer_Extra_Health 100 + Charger_Extra_Health 100 + Hunter_Extra_Health 100 + Jockey_Extra_Health 100 + Smoker_Extra_Health 100 + Spitter_Extra_Health 100 + } + } + Enhancements + { + Run_Speed 1.0 + } + Fast_Ability + { + Human_Ability 1 + Human_Ammo 2 + Human_Duration 3 + Ability_Enabled 1 + Ability_Message 1 + Fast_Chance 33.3 + Fast_Duration 3 + Fast_Speed 10.0 + } + Fire_Ability + { + Ability_Effect 7 + Ability_Message 1 + Fire_Chance 100.0 + Fire_Cooldown 3 + Fire_Damage 0.5 + Fire_Hit 1 + Fire_Hit_Mode 0 + Special + { + Fire_Cooldown 3 + Fire_Damage 0.25 + } + } + Pyro_Ability + { + Human_Ability 1 + Human_Ammo 2 + Human_Duration 3 + Ability_Enabled 1 + Ability_Message 1 + Pyro_Chance 33.3 + Pyro_Damage_Boost 2.0 + Pyro_Duration 3 + Pyro_Fire_Divisor 1.0 + Pyro_Mode 0 + Pyro_Reignite 1 + Pyro_Speed_Boost 9.0 + Special + { + Pyro_Fire_Divisor 400.0 + } + } + Slow_Ability + { + Ability_Enabled 1 + Ability_Effect 7 + Ability_Message 2 + Slow_Chance 100.0 + Slow_Duration 99999.0 + Slow_Range 500.0 + Slow_Range_Chance 100.0 + Slow_Speed 0.65 + } + } + Tank_#141 + { + General + { + Tank_Name Ravager + Special + { + Special_Types -1 + Special_Note -1 + Boomer_Name Ravager + Charger_Name Ravager + Hunter_Name Ravager + Jockey_Name Ravager + Smoker_Name Ravager + Spitter_Name Ravager + } + Mob + { + Mob_Variants -1 + Common_Name Ravager + Witch_Name Ravager + } + Tank_Enabled -1 + Tank_Chance 100.0 + Tank_Note 1 + Skin_Color 240,20,60,255 + } + Glow + { + Glow_Enabled 1 + Glow_Color 75,100,90 + } + Human_Support + { + Human_Support 1 + } + Spawn + { + Open_Areas_Only 500.0 + } + Props + { + Light_Color 75,100,90,255 + Oxygen_Tank_Color 75,100,90,255 + Flame_Color 75,100,90,180 + Rock_Color 75,100,90,255 + Tire_Color 75,100,90,255 + Propane_Tank_Color 75,100,90,255 + Flashlight_Color 75,100,90,255 + Crown_Color 75,100,90,255 + } + Health + { + Extra_Health 1000 + Special + { + Boomer_Extra_Health 100 + Charger_Extra_Health 100 + Hunter_Extra_Health 100 + Jockey_Extra_Health 100 + Smoker_Extra_Health 100 + Spitter_Extra_Health 100 + } + } + Bomb_Ability + { + Human_Ability 1 + Ability_Message 4 + Bomb_Rock_Break 1 + Bomb_Rock_Chance 100.0 + } + Rock_Ability + { + Requires_Humans 0 + Human_Ability 1 + Human_Ammo 2 + Human_Duration 99999 + Ability_Enabled 1 + Ability_Message 1 + Rock_Chance 100.0 + Rock_Damage 5 + Rock_Duration 99999 + Rock_Interval 1.5 + Rock_Mode 0 + Rock_Radius -5.0,5.0 + } + } + Tank_#142 + { + General + { + Tank_Name Ramattra + Special + { + Special_Types -1 + Special_Note -1 + Boomer_Name Ramattra + Charger_Name Ramattra + Hunter_Name Ramattra + Jockey_Name Ramattra + Smoker_Name Ramattra + Spitter_Name Ramattra + } + Mob + { + Mob_Variants -1 + Common_Name Ramattra + Witch_Name Ramattra + } + Tank_Enabled -1 + Tank_Chance 100.0 + Tank_Note 1 + Skin_Color 35,35,35,255 + } + Glow + { + Glow_Enabled 1 + Glow_Color 160,80,255 + } + HumanSupport + { + Human_Support 1 + } + Props + { + Props_Attached 380 + Light_Color 160,80,255,255 + Oxygen_Tank_Color 185,180,135,255 + Flame_Color 160,80,255,180 + Rock_Color 185,180,135,255 + Tire_Color 185,180,135,255 + Propane_Tank_Color 255,255,255,255 + Flashlight_Color 160,80,255,255 + Crown_Color 160,80,255,255 + } + Health + { + Extra_Health 1000 + Special + { + Boomer_Extra_Health 100 + Charger_Extra_Health 100 + Hunter_Extra_Health 100 + Jockey_Extra_Health 100 + Smoker_Extra_Health 100 + Spitter_Extra_Health 100 + } + } + Absorb_Ability + { + Requires_Humans 0 + Human_Ability 1 + Human_Ammo 2 + Human_Duration 5 + Ability_Enabled 1 + Ability_Message 1 + Absorb_Bullet_Divisor 20.0 + Absorb_Chance 15.0 + Absorb_Convert_Percentage 0.0 + Absorb_Duration 10 + Absorb_Explosive_Divisor 20.0 + Absorb_Fire_Divisor 200.0 + Absorb_Hittable_Divisor 20.0 + Absorb_Melee_Divisor 200.0 + } + Regen_Ability + { + Human_Ability 1 + Human_Ammo 2 + Human_Duration 5 + Ability_Enabled 1 + Ability_Effect 4 + Ability_Message 1 + Ability_Sight 1 + Regen_Chance 100.0 + Regen_Duration 0 + Regen_Health 1 + Regen_Interval 1.0 + Regen_Limit 1000000 + Regen_Range 500.0 + Special + { + Regen_Limit 100000 + Regen_Range 150.0 + } + } + Shield_Ability + { + Requires_Humans 0 + Human_Ability 1 + Ability_Enabled 1 + Ability_Message 1 + ShieldChance 15.0 + Shield_Convert_Percentage 0.2 + Shield_Color 160,80,255,50 + Shield_Delay 10 + Shield_Display_Health 11 + Shield_Display_Health_Type 2 + Shield_Duration 0 + Shield_Health 250.0 + Shield_Health_Characters ],= + Shield_Type 15 + Special + { + Shield_Health 100.0 + } + } + Slow_Ability + { + Ability_Enabled 1 + Ability_Effect 7 + Ability_Message 2 + Ability_Sight 1 + Slow_Chance 100.0 + Slow_Duration 99999.0 + Slow_Range 500.0 + Slow_Range_Chance 100.0 + Slow_Speed 0.4 + } + } + Tank_#143 + { + General + { + Tank_Name Sigma + Special + { + Special_Types -1 + Special_Note -1 + Boomer_Name Sigma + Charger_Name Sigma + Hunter_Name Sigma + Jockey_Name Sigma + Smoker_Name Sigma + Spitter_Name Sigma + } + Mob + { + Mob_Variants -1 + Common_Name Sigma + Witch_Name Sigma + } + Tank_Enabled -1 + Tank_Chance 100.0 + Tank_Note 1 + Skin_Color 80,80,80,255 + } + Glow + { + Glow_Enabled 1 + Glow_Color 130,130,180 + } + Human_Support + { + Human_Support 1 + } + Props + { + Props_Attached 124 + Light_Color 130,130,180,255 + Oxygen_Tank_Color 65,200,170,255 + Flame_Color 130,130,180,180 + Rock_Color 65,200,170,255 + Tire_Color 65,200,170,255 + Propane_Tank_Color 60,0,110,255 + Flashlight_Color 130,130,180,255 + Crown_Color 130,130,180,255 + } + Health + { + Extra_Health 1000 + Special + { + Boomer_Extra_Health 100 + Charger_Extra_Health 100 + Hunter_Extra_Health 100 + Jockey_Extra_Health 100 + Smoker_Extra_Health 100 + Spitter_Extra_Health 100 + } + } + Absorb_Ability + { + Requires_Humans 0 + Human_Ability 1 + Human_Ammo 2 + Human_Duration 5 + Ability_Enabled 1 + Ability_Message 1 + Absorb_Bullet_Divisor 20.0 + Absorb_Chance 15.0 + Absorb_Convert_Percentage 0.75 + Absorb_Duration 10 + Absorb_Explosive_Divisor 20.0 + Absorb_Fire_Divisor 200.0 + Absorb_Hittable_Divisor 20.0 + Absorb_Melee_Divisor 200.0 + } + Choke_Ability + { + Human_Ability 1 + Human_Ammo 2 + Ability_Enabled 1 + Ability_Effect 7 + Ability_Message 3 + Ability_Sight 1 + Choke_Block 0 + Choke_Chance 33.3 + Choke_Damage 10.0 + Choke_Delay 0.5 + Choke_Duration 3 + Choke_Hit 1 + Choke_Hit_Mode 0 + Choke_Range 150.0 + Choke_Range_Chance 15.0 + } + Gravity_Ability + { + Human_Ability 1 + Ability_Enabled 2 + Ability_Message 4 + Gravity_Flags 8 + Gravity_Force -25.0 + } + Shield_Ability + { + Requires_Humans 0 + Human_Ability 1 + Ability_Enabled 1 + Ability_Message 1 + Shield_Chance 15.0 + Shield_Convert_Percentage 0.15 + Shield_Color 130,130,180,50 + Shield_Delay 10 + Shield_Display_Health 11 + Shield_Display_Health_Type 2 + Shield_Duration 0 + Shield_Health 700.0 + Shield_Health_Characters ],= + Shield_Type 15 + Special + { + Shield_Health 70.0 + } + } + } + Tank_#144 + { + General + { + Tank_Name Zarya + Special + { + Special_Types -1 + Special_Note -1 + Boomer_Name Zarya + Charger_Name Zarya + Hunter_Name Zarya + Jockey_Name Zarya + Smoker_Name Zarya + Spitter_Name Zarya + } + Mob + { + Mob_Variants -1 + Common_Name Zarya + Witch_Name Zarya + } + Tank_Enabled -1 + Tank_Chance 100.0 + Tank_Note 1 + Skin_Color 55,110,255,255 + } + Glow + { + Glow_Enabled 1 + Glow_Color 255,130,255 + } + Human_Support + { + Human_Support 1 + } + Props + { + Props_Attached 0 + } + Health + { + Extra_Health 1000 + Special + { + Boomer_Extra_Health 100 + Charger_Extra_Health 100 + Hunter_Extra_Health 100 + Jockey_Extra_Health 100 + Smoker_Extra_Health 100 + Spitter_Extra_Health 100 + } + } + Enhancements + { + Run_Speed 0.65 + } + Absorb_Ability + { + Requires_Humans 0 + Human_Ability 1 + Human_Ammo 2 + Human_Duration 5 + Ability_Enabled 1 + Ability_Message 1 + Absorb_Bullet_Divisor 20.0 + Absorb_Chance 15.0 + Absorb_Convert_Percentage 0.75 + Absorb_Duration 10 + Absorb_Explosive_Divisor 20.0 + Absorb_Fire_Divisor 200.0 + Absorb_Hittable_Divisor 20.0 + Absorb_Melee_Divisor 200.0 + } + Gravity_Ability + { + Human_Ability 1 + Ability_Enabled 2 + Ability_Message 4 + Gravity_Flags 8 + Gravity_Force -25.0 + } + Shield_Ability + { + Requires_Humans 0 + Human_Ability 1 + Ability_Enabled 1 + Ability_Message 1 + Shield_Chance 15.0 + Shield_Convert_Percentage 0.15 + Shield_Color 255,130,255,50 + Shield_Delay 15 + Shield_Display_Health 11 + Shield_Display_Health_Type 2 + Shield_Duration 5 + Shield_Health 225.0 + Shield_Health_Characters ],= + Shield_Type 15 + Special + { + Shield_Health 22.5 + } + } + } + //_The_following_samples_are_for_punishing_rushers/slackers. + Tank_#145 + { + General + { + Tank_Name Slacker + Special + { + Special_Types -1 + Special_Note -1 + Boomer_Name Slacker + Charger_Name Slacker + Hunter_Name Slacker + Jockey_Name Slacker + Smoker_Name Slacker + Spitter_Name Slacker + } + Mob + { + Mob_Variants -1 + Common_Name Slacker + Witch_Name Slacker + } + Tank_Enabled -1 + Tank_Chance 100.0 + Tank_Note 0 + Skin_Color 100,100,100,255 + Spawn_Enabled 0 + } + Announcements + { + Announce_Arrival 0 + Announce_Death 0 + Announce_Kill 0 + Arrival_Message 0 + Arrival_Sound 0 + Death_Details 0 + Death_Message 0 + Death_Sound 0 + Kill_Message 0 + Vocalize_Arrival 0 + Vocalize_Death 0 + } + Props + { + Props_Attached 0 + } + Health + { + Base_Health 1000000 + Display_Health 0 + Display_Health_Type 0 + Special + { + Boomer_Base_Health 100000 + Charger_Base_Health 100000 + Hunter_Base_Health 100000 + Jockey_Base_Health 100000 + Smoker_Base_Health 100000 + Spitter_Base_Health 100000 + } + } + Enhancements + { + Attack_Interval 0.1 + Intangible_Body 1 + Punch_Throw 0.0 + Skip_Taunt 1 + } + Fast_Ability + { + Human_Ability 2 + Human_Ammo 2 + Human_Duration 99999 + Ability_Enabled 1 + Ability_Message 0 + Fast_Chance 100.0 + Fast_Dash 5.0 + Fast_Dash_Chance 50.0 + Fast_Dash_Range 150.0 + Fast_Duration 99999 + Fast_Speed 10.0 + } + Gravity_Ability + { + Ability_Enabled 2 + Ability_Message 0 + Gravity_Flags 8 + Gravity_Force -100.0 + } + Warp_Ability + { + Human_Ability 2 + Ability_Effect 7 + Ability_Message 0 + Warp_Chance 100.0 + Warp_Hit 1 + Warp_Hit_Mode 1 + } + } + Tank_#146 + { + General + { + Tank_Name Rusher + Special + { + Special_Types -1 + Special_Note -1 + Boomer_Name Rusher + Charger_Name Rusher + Hunter_Name Rusher + Jockey_Name Rusher + Smoker_Name Rusher + Spitter_Name Rusher + } + Mob + { + Mob_Variants -1 + Common_Name Rusher + Witch_Name Rusher + } + Tank_Enabled -1 + Tank_Chance 100.0 + Tank_Note 0 + Skin_Color 150,0,0,255 + Spawn_Enabled 0 + } + Announcements + { + Announce_Arrival 0 + Announce_Death 0 + Announce_Kill 0 + Arrival_Message 0 + Arrival_Sound 0 + Death_Details 0 + Death_Message 0 + Death_Sound 0 + Kill_Message 0 + Vocalize_Arrival 0 + Vocalize_Death 0 + } + Props + { + Props_Attached 0 + } + Health + { + Base_Health 1000000 + Display_Health 0 + Display_Health_Type 0 + Special + { + Boomer_Base_Health 100000 + Charger_Base_Health 100000 + Hunter_Base_Health 100000 + Jockey_Base_Health 100000 + Smoker_Base_Health 100000 + Spitter_Base_Health 100000 + } + } + Enhancements + { + Attack_Interval 0.1 + Intangible_Body 1 + Punch_Throw 0.0 + Skip_Taunt 1 + } + Fast_Ability + { + Human_Ability 2 + Human_Ammo 2 + Human_Duration 99999 + Ability_Enabled 1 + Ability_Message 0 + Fast_Chance 100.0 + Fast_Dash 5.0 + Fast_Dash_Chance 50.0 + Fast_Dash_Range 150.0 + Fast_Duration 99999 + Fast_Speed 10.0 + } + Gravity_Ability + { + Ability_Enabled 2 + Ability_Message 0 + Gravity_Flags 8 + Gravity_Force -100.0 + } + Fire_Ability + { + Human_Ability 2 + Ability_Effect 7 + Ability_Message 0 + Fire_Chance 100.0 + Fire_Hit 1 + Fire_Hit_Mode 1 + } + Ice_Ability + { + Human_Ability 2 + Ability_Effect 7 + Ability_Message 0 + Ice_Chance 100.0 + Ice_Duration 5.0 + Ice_Hit 1 + Ice_Hit_Mode 1 + } + } /** * Create your own Mutant Tanks below! * Start your imagination here! diff --git a/addons/sourcemod/data/mutant_tanks/backup_config/format4/mutant_tanks.cfg b/addons/sourcemod/data/mutant_tanks/backup_config/format4/mutant_tanks.cfg index e85438f87e..9e59deef3f 100644 --- a/addons/sourcemod/data/mutant_tanks/backup_config/format4/mutant_tanks.cfg +++ b/addons/sourcemod/data/mutant_tanks/backup_config/format4/mutant_tanks.cfg @@ -21,6 +21,7 @@ mtanks { penabled yes update on + graphics max bfix max kick min listen enabled @@ -38,11 +39,29 @@ mtanks cycle min spawn max limit min - types 1-128 + types 1-146 spec { spectypes min } + mob + { + mobvariants min + commbiochance 50.0 + commchance 100.0 + commcheck 300.0 + commdmgpoints 50.0 + commdeathpoints 100.0 + commfilter 0 + commgoal 5000.0 + commvariant 0 + witchchance 100.0 + witchfilter 0 + witchmode 0 + witchmutatechance 100.0 + witchrange 500.0 + witchtypes 0 + } } announce { @@ -64,6 +83,22 @@ mtanks kill min } } + punish + { + puenabled -1,-1 //145,146 + pubots -1,-1 //145,146 + fincheck 0 + ptypes 127,127 + lifetime 5.0,5.0 + warndist 500.0,1000.0 + pudist 1000.0,2000.0 + warnlimit 3,3 + warnint 5,5 + stypes 1 + survivors 3 + incaps 2 + zedtime 1.0,1.0 + } rewards { renabled -1,-1,-1,-1 @@ -78,50 +113,69 @@ mtanks share 0,0,0,0 teamlimit 0 actionduration 2.0,2.0,2.0,2.0 + adrenaline 30.0,30.0,30.0,30.0 ammoboost 1,1,1,1 + ammorefill 1,1,1,1 ammoregen 1,1,1,1 attackboost 1.25,1.25,1.25,1.25 bhop 1,1,1,1 blaze 1,1,1,1 + donor 0,0,0,0 burstdoors 1,1,1,1 cleankills 1,1,1,1 cluster 3,3,3,3 dmgboost 1.25,1.25,1.25,1.25 dmgres 0.5,0.5,0.5,0.5 + dopamine 150.0,150.0,150.0,150.0 + eternal 1,1,1,1 fallvoice PlayerLaugh,PlayerLaugh,PlayerLaugh,PlayerLaugh + fastrecovery 1,1,1,1 + firerate 1.25,1.25,1.25,1.25 friendlyfire 1,1,1,1 ghost 1,1,1,1 + grenade 10.0,10.0,10.0,10.0 healpercent 100.0,100.0,100.0,100.0 + healthcare 150.0,150.0,150.0,150.0 hpregen 1,1,1,1 - hollowpoint 1,1,1,1 - inexfire 1,1,1,1 + heartbeat 3.0,3.0,3.0,3.0 + hollowpoint 100.0,100.0,100.0,100.0 infammo 31,31,31,31 item first_aid_kit,first_aid_kit,first_aid_kit,first_aid_kit jumpheight 75.0,75.0,75.0,75.0 - ladderactions 1,1,1,1 - ladykiller 1,1,1,1 + ladderacts 1,1,1,1 + ladykiller 25.0,25.0,25.0,25.0 lasersight 1,1,1,1 lifeleech 1,1,1,1 + luckybullet 25.0,25.0,25.0,25.0 medcuts 1,1,1,1 meleerange 150,150,150,150 - midairdashes 2,2,2,2 + middash 2,2,2,2 + motivation 150.0,150.0,150.0,150.0 + overdose 150.0,150.0,150.0,150.0 + overhealth 200,200,200,200 pipeduration 10.0,10.0,10.0,10.0 punchres 0.25,0.25,0.25,0.25 - rapid 0.130,0.130,0.130,0.130 + rapidpistol 0.130,0.130,0.130,0.130 recoil 1,1,1,1 refillpercent 100.0,100.0,100.0,100.0 - regburst 1,1,1,1 + regbursts 1,1,1,1 + reloadrate 1.25,1.25,1.25,1.25 resloadout 1,1,1,1 revivehp 100,100,100,100 + riotgear 1,1,1,1 + safetybubble 1,1,1,1 + shockwave 150.0,150.0,150.0,150.0 shovedmg 0.025,0.025,0.025,0.025 shovepenalty 1,1,1,1 shoverate 0.7,0.7,0.7,0.7 - sledgehammer 1,1,1,1 - specialammo 3,3,3,3 + sledgehammer 100.0,100.0,100.0,100.0 + specammo 3,3,3,3 speedboost 1.25,1.25,1.25 limits 0,0,0,0,0,0,0 - stack 0,0,0,0 + rstack 0,0,0,0 sticky 1,1,1,1 + supplier 3.0,3.0,3.0,3.0 + swingrate 1.25,1.25,1.25,1.25 syringe 1,1,1,1 thorns 1,1,1,1 useful 15,15,15,15 @@ -139,6 +193,533 @@ mtanks bots -1,-1,-1,-1 } } + survivors + { + caenabled 0 + cabots 0 + cabody 0 + cachance 0.0 + cacleanse 0 + cadmgmulti 0.0 + cadelay 0.0 + cafilter 0 + cahpmulti 0.0 + cainfect 0 + camix 0 + camode 0 + cateleport 0 + catype 0 + cavoice 0 + cavoicechance 0.0 + cavoiceint 0.0 + caattacklines "" + cabaitlines "" + psnabled -1 + psbots -1 + psnotify 0 + actionduration 0.0 + adrenaline 0.0 + ammoboost 0 + ammorefill 0 + ammoregen 0 + attackboost 0.0 + bhop 0 + blaze 0 + donor 0 + burstdoors 0 + cleankills 0 + cluster 0 + dmgboost 0.0 + dmgres 0.0 + dopamine 0.0 + eternal 0 + fastrecovery 0 + firerate 0.0 + friendlyfire 0 + ghost 0 + grenade 0.0 + healpercent 0.0 + healthcare 0.0 + hpregen 0 + heartbeat 0.0 + hollowpoint 0.0 + infammo 0 + item "" + jumpheight 0.0 + ladderacts 0 + ladykiller 0.0 + lasersight 0 + lifeleech 0 + luckybullet 0.0 + medcuts 0 + meleerange 0 + middash 0 + motivation 0.0 + overdose 0.0 + overhealth 0 + pipeduration 0.0 + punchres 0.0 + rapidpistol 0.0 + recoil 0 + refillpercent 0.0 + regbursts 0 + reloadrate 0.0 + resloadout 0 + revivehp 0 + riotgear 0 + safetybubble 0 + shockwave 0.0 + shovedmg 0.0 + shovepenalty 0 + shoverate 0.0 + sledgehammer 0.0 + specammo 0 + speedboost 0.0 + sticky 0 + supplier 0.0 + swingrate 0.0 + syringe 0 + thorns 0 + weapon_pistol // Fire faster and no shove fatigue while pistol is being held + { + weaponid 1 + psenabled -1 //9 + psbots -1 //9 + psstack 0 + donor 2 + rapidpistol 0.130 + shovepenalty 1 + syringe 1 + } + weapon_pistol_magnum // Fire faster and no shove fatigue while magnum pistol is being held + { + weaponid 2 + psenabled -1 //12 + psbots -1 //12 + psstack 0 + ghost 1 + hollowpoint 100.0 + rapidpistol 0.130 + shovepenalty 1 + sledgehammer 0.5 + } + weapon_smg // Shoot grenades and perform ladder actions while uzi is being held + { + weaponid 3 + psenabled -1 //26 + psbots -1 //26 + psstack 0 + grenade 25.0 + ladderacts 1 + middash 1 + } + weapon_smg_silenced // Shoot grenades and perform ladder actions while silenced uzi is being held + { + weaponid 4 + psenabled -1 //26 + psbots -1 //26 + psstack 0 + grenade 25.0 + ladderacts 1 + jumpheight 65.0 + } + weapon_smg_mp5 // Shoot grenades and perform ladder actions while mp5 uzi is being held + { + weaponid 5 + psenabled -1 //26 + psbots -1 //26 + psstack 0 + grenade 25.0 + ladderacts 1 + speedboost 1.125 + } + weapon_rifle // Remove recoil and deal more damage while m16 rifle is being held + { + weaponid 6 + psenabled -1 //20 + psbots -1 //20 + psstack 0 + dmgboost 1.2 + grenade 25.0 + recoil 1 + } + weapon_rifle_ak47 // Remove recoil and deal more damage while ak47 rifle is being held + { + weaponid 7 + psenabled -1 //4 + psbots -1 //4 + psstack 0 + dmgboost 1.1 + lasersight 1 + recoil 1 + } + weapon_rifle_desert // Remove recoil and deal more damage while scar-l rifle is being held + { + weaponid 8 + psenabled -1 //20 + psbots -1 //20 + psstack 0 + dmgboost 1.125 + recoil 1 + specammo 3 + } + weapon_rifle_sg552 // Remove recoil and deal more damage while sg552 rifle is being held + { + weaponid 9 + psenabled -1 //20 + psbots -1 //20 + psstack 0 + dmgboost 1.15 + luckybullet 33.3 + recoil 1 + } + weapon_pumpshotgun // Reload faster and knock back zombies while pump shotgun is being held + { + weaponid 10 + psenabled -1 //12 + psbots -1 //12 + psstack 0 + reloadrate 1.6 + shovepenalty 1 + sledgehammer 1.0 + } + weapon_shotgun_chrome // Reload faster and knock back zombies while chrome shotgun is being held + { + weaponid 11 + psenabled -1 //12 + psbots -1 //12 + psstack 0 + reloadrate 1.6 + shovedmg 0.025 + sledgehammer 1.0 + } + weapon_autoshotgun // Reload faster and knock back zombies while auto shotgun is being held + { + weaponid 12 + psenabled -1 //28 + psbots -1 //28 + psstack 0 + grenade 10.0 + reloadrate 1.6 + sledgehammer 1.0 + } + weapon_shotgun_spas // Reload faster and knock back zombies while spas shotgun is being held + { + weaponid 13 + psenabled -1 //12 + psbots -1 //12 + psstack 0 + ladykiller 50.0 + reloadrate 1.6 + sledgehammer 1.0 + } + weapon_hunting_rifle // Shoot through walls and shoot stronger bullets while hunting rifle is being held + { + weaponid 14 + psenabled -1 //20 + psbots -1 //20 + psstack 0 + ghost 1 + grenade 10.0 + hollowpoint 100.0 + } + weapon_sniper_military // Shoot through walls and shoot stronger bullets while military rifle is being held + { + weaponid 15 + psenabled -1 //68 + psbots -1 //68 + psstack 0 + cleankills 1 + ghost 1 + hollowpoint 100.0 + } + weapon_sniper_awp // Shoot through walls and shoot stronger bullets while awp rifle is being held + { + weaponid 16 + psenabled -1 //4 + psbots -1 //4 + psstack 0 + dmgboost 2.0 + ghost 1 + hollowpoint 100.0 + } + weapon_sniper_scout // Shoot through walls and shoot stronger bullets while steyr scout rifle is being held + { + weaponid 17 + psenabled -1 //12 + psbots -1 //12 + psstack 0 + ghost 1 + hollowpoint 100.0 + reloadrate 1.3 + } + weapon_rifle_m60 // Refill nearby teammates' ammo periodically while dealing damage with the m60 rifle + { + weaponid 18 + psenabled -1 //16 + psbots -1 //16 + psstack 0 + supplier 3.0 + } + weapon_grenade_launcher // Heal teammates with explosions while grenade launcher is being held + { + weaponid 19 + psenabled -1 //1 + psbots -1 //1 + psstack 0 + donor 4 + regbursts 2 + } + weapon_first_aid_kit // Take less damage while the medkit is being held and trigger a healing AoE when used + { + weaponid 20 + psenabled -1 //5 + psbots -1 //5 + psstack 0 + dmgres 0.95 + healthcare 250.0 + } + weapon_defibrillator // Take less damage while the defibrillator is being held and trigger a revive AoE when used + { + weaponid 21 + psenabled -1 //5 + psbots -1 //5 + psstack 0 + dmgres 0.95 + shockwave 1000.0 + } + weapon_pain_pills // Take less damage while the pain pills bottle is being held and trigger a healing AoE when used + { + weaponid 22 + psenabled -1 //5 + psbots -1 //5 + psstack 0 + dmgres 0.95 + overdose 250.0 + } + weapon_adrenaline // Take less damage while the adrenaline shot is being held and trigger an energy boost AoE when used + { + weaponid 23 + psenabled -1 //5 + psbots -1 //5 + psstack 0 + dmgres 0.95 + dopamine 250.0 + } + weapon_melee // Auto-bhop while knife is being held + { + weaponid 24 + weaponname knife + psenabled -1 //2 + psbots -1 //2 + psstack 0 + bhop 1 + } + weapon_melee // Berserker blunt weapons - High damage, low uptime, revive radius, damage resistance, and heal nearby teammates periodically while dealing damage + { + weaponid 25 + weaponname baseball_bat,cricket_bat,tonfa,shovel,electric_guitar,frying_pan,golfclub + psenabled -1 //15 + psbots -1 //15 + psstack 0 + dmgboost 1.45 + dmgres 0.9 + heartbeat 3.0 + meleerange 100 + motivation 250.0 + speedboost 0.875 + swingrate 0.65 + } + weapon_melee // Berserker sharp weapons - Low damage, high uptime, revive radius, leech health from zombies, and heal teammates by damaging them + { + weaponid 26 + weaponname crowbar,machete,katana,knife,fireaxe,pitchfork + psenabled -1 //15 + psbots -1 //15 + psstack 0 + dmgboost 0.65 + lifeleech 1 + medcuts 2 + meleerange 100 + motivation 250.0 + swingrate 1.45 + speedboost 1.125 + } + bill // General - Medium-high survivability, high mobility, medium-low damage, high uptime + { + cafilter 2 + caattacklines "namvet/laughter04.wav,namvet/laughter11.wav,namvet/cough06.wav,namvet/doubledeathresponse01.wav,namvet/doubledeathresponse02.wav,namvet/help11.wav,namvet/friendlyfire04.wav" + cabaitlines "namvet/callforrescue01.wav,namvet/callforrescue05.wav,namvet/callforrescue10.wav" + psenabled -1 //31 + psbots -1 //31 + psnotify 0 + donor 1 + bhop 1 + dmgboost 0.95 + dmgres 0.95 + eternal 1 + ladderacts 1 + overhealth 110 + pipeduration 6.5 + rapidpistol 0.130 + recoil 1 + revivehp 50 + specammo 0 + speedboost 1.1 + } + zoey // Damage - Medium-low survivability, medium mobility, medium-high damage, medium uptime + { + cafilter 20 + caattacklines "teengirl/laughter02.wav,teengirl/laughter06.wav,teengirl/hurtminor01.wav,teengirl/help04.wav" + cabaitlines "teengirl/callforrescue01.wav,teengirl/callforrescue02.wav,teengirl/callforrescue06.wav,teengirl/callforrescue07.wav,teengirl/callforrescue14.wav,teengirl/callforrescue16.wav" + psenabled -1 //7 + psbots -1 //7 + psnotify 0 + donor 1 + dmgboost 1.25 + dmgres 1.15 + ghost 1 + healpercent 75.0 + hollowpoint 100.0 + overhealth 115 + revivehp 40 + speedboost 1.1 + } + francis // Tank - Medium-high survivability, low mobility, medium-low damage, low uptime + { + cafilter 65 + caattacklines "biker/goingtodie03.wav,biker/goingtodie12.wav,biker/goingtodieaskforheal02.wav,biker/grabbedbysmoker03.wav,biker/help04.wav,biker/laughter04.wav,biker/laughter12.wav" + cabaitlines "biker/callforrescue02.wav,biker/callforrescue06.wav,biker/callforrescue08.wav" + psenabled -1 //271 + psbots -1 //271 + psnotify 0 + donor 2 + burstdoors 0 + dmgboost 0.75 + dmgres 0.7 + fastrecovery 1 + jumpheight 70.0 + ladykiller 25.0 + meleerange 125 + overhealth 130 + punchres 0.7 + revivehp 70 + riotgear 0 + shovedmg 0.0 + shovepenalty 1 + speedboost 0.95 + } + louis // Support - Low survivability, medium mobility, medium-low damage, high uptime + { + cafilter 8 + caattacklines "manager/choke01.wav,manager/cough03.wav,manager/deathscream02.wav,manager/friendlyfire03.wav,manager/friendlyfire06.wav,manager/help05.wav,manager/laughter04.wav,manager/laughter20.wav" + cabaitlines "manager/callforrescue01.wav,manager/callforrescue03.wav" + psenabled -1 //31 + psbots -1 //31 + psnotify 0 + donor 2 + dmgboost 0.85 + dmgres 1.4 + healpercent 80.0 + hpregen 1 + jumpheight 70.0 + medcuts 2 + middash 0 + overdose 250.0 + overhealth 110 + revivehp 60 + shockwave 0.0 + speedboost 1.1 + syringe 0 + } + nick // General - Medium-low survivability, high mobility, medium-high damage, high uptime + { + cafilter 2 + caattacklines "gambler/battlecry04.wav,gambler/choke01.wav,gambler/choke04.wav,gambler/choke05.wav,gambler/cough01.wav,gambler/defibrillator13.wav,gambler/friendlyfire02.wav,gambler/laughter01.wav" + cabaitlines "gambler/callforrescue02.wav,gambler/callforrescue05.wav" + psenabled -1 //31 + psbots -1 //31 + psnotify 0 + donor 2 + bhop 0 + dmgboost 0.65 + dmgres 1.1 + eternal 0 + ladderacts 0 + overhealth 120 + pipeduration 6.5 + rapidpistol 0.130 + recoil 0 + revivehp 50 + specammo 1 + speedboost 0.95 + } + ellis // Damage - Low survivability, medium mobility, high damage, medium uptime + { + cafilter 40 + caattacklines "mechanic/choke01.wav,mechanic/choke04.wav,mechanic/cough01.wav,mechanic/cough02.wav,mechanic/friendlyfire01.wav,mechanic/laughter04.wav,mechanic/laughter06.wav" + cabaitlines "mechanic/callforrescue01.wav,mechanic/callforrescue03.wav,mechanic/callforrescue05.wav" + psenabled -1 //7 + psbots -1 //7 + psnotify 0 + donor 2 + dmgboost 1.35 + dmgres 1.25 + ghost 0 + healpercent 70.0 + hollowpoint 0.0 + overhealth 105 + revivehp 40 + speedboost 0.95 + } + coach // Tank - Medium survivability, medium-low mobility, medium damage, low uptime + { + cafilter 5 + caattacklines "coach/taunt06.wav,coach/tankpound01.wav,coach/tankpound05.wav,coach/laughter23.wav,coach/laughter15.wav,coach/help03.wav,coach/goingtodie28.wav" + cabaitlines "coach/callforrescue05.wav,coach/callforrescue08.wav,coach/callforrescue12.wav" + psenabled -1 //271 + psbots -1 //271 + psnotify 0 + donor 3 + burstdoors 1 + dmgboost 0.85 + dmgres 0.8 + fastrecovery 0 + jumpheight 60.0 + ladykiller 0.0 + meleerange 100 + overhealth 140 + punchres 0.8 + revivehp 70 + riotgear 1 + shovedmg 0.025 + shovepenalty 0 + speedboost 0.85 + } + rochelle // Support - Medium-low survivability, high mobility, low damage, high uptime + { + cafilter 16 + caattacklines "producer/battlecry02.wav,producer/boomerreaction02.wav,producer/deathscream02.wav,producer/defibrillator18.wav,producer/goingtodie08.wav,producer/goingtodie02.wav,producer/gooedbyspitter03.wav,producer/heardspitter05.wav" + cabaitlines "producer/callforrescue01.wav,producer/callforrescue07.wav" + psenabled -1 //31 + psbots -1 //31 + psnotify 0 + donor 3 + dmgboost 0.75 + dmgres 1.3 + healpercent 90.0 + hpregen 2 + jumpheight 60.0 + medcuts 0 + middash 1 + overdose 0.0 + overhealth 120 + revivehp 60 + shockwave 250.0 + speedboost 1.2 + syringe 1 + } + } comp { autoaggro enabled @@ -153,9 +734,33 @@ mtanks scaledmg disabled diffdmg 0.0,0.0,0.0,0.0 } + size + { + infchance 0.0 + infdmg 1 + infhp 1 + infscale 0.1-10.0 + jockeychance 0.0 + jockeydmg 1 + jockeyhp 1 + jockeyscale 0.1-10.0 + witchchance 0.0 + witchdmg 1 + witchhp 1 + witchscale 0.1-10.0 + } health { basehp 6000 + armorchars ],= + armorpercent 0.0 + armorres 0.75 + shieldchars >,- + shieldpercent 0.0 + shieldrate 0.5 + passdelay 5.0 + passhp 0 + passint 1.0 displayhp max displaytype 1 hpchars |,- @@ -192,6 +797,7 @@ mtanks enhance { attack 0.0 + bhop 0 claw -1.0 hittable -1.0 incap 0 @@ -235,16 +841,16 @@ mtanks regdelay 10.0 reginterval 300.0 reglimit 99999 - regtype 1-128 + regtype 1-144 regwave no finamount min finmode 0 - fintypes 1-128,1-128,1-128,1-128,1-128,1-128,1-128,1-128,1-128,1-128,1-128 + fintypes 1-144,1-144,1-144,1-144,1-144,1-144,1-144,1-144,1-144,1-144,1-144 finwaves 0,0,0,0,0,0,0,0,0,0,0 } rush { - types 0 + rutypes 0 climit 0 delay 60.0 cooldown 30.0 @@ -265,7 +871,7 @@ mtanks } modes { - types 5 + gmtypes 5 gmenabled coop,survival gmdisabled versus,scavenge } @@ -299,6 +905,12 @@ mtanks smname "Absorber Smoker" spname "Absorber Spitter" } + mob + { + mobvariants -1 + commname "Absorber Common" + witchname "Absorber Witch" + } tenabled -1 chance 100.0 note 1 @@ -372,6 +984,12 @@ mtanks smname "Acidic Smoker" spname "Acidic Spitter" } + mob + { + mobvariants -1 + commname "Acidic Common" + witchname "Acidic Witch" + } tenabled -1 chance 100.0 note 1 @@ -457,6 +1075,12 @@ mtanks smname "Aimless Smoker" spname "Aimless Spitter" } + mob + { + mobvariants -1 + commname "Aimless Common" + witchname "Aimless Witch" + } tenabled -1 chance 100.0 note 1 @@ -528,6 +1152,12 @@ mtanks smname "Ammo Smoker" spname "Ammo Spitter" } + mob + { + mobvariants -1 + commname "Ammo Common" + witchname "Ammo Witch" + } tenabled -1 chance 100.0 note 1 @@ -599,6 +1229,12 @@ mtanks smname "Blind Smoker" spname "Blind Spitter" } + mob + { + mobvariants -1 + commname "Blind Common" + witchname "Blind Witch" + } tenabled -1 chance 100.0 note 1 @@ -638,7 +1274,7 @@ mtanks spextrahp 100 } } - blind + vision { human 1 hammo 2 @@ -650,7 +1286,7 @@ mtanks hit 1 hitmode 0 intensity 255 - mode 0 + mode 1 range 150.0 rangechance 15.0 } @@ -671,6 +1307,12 @@ mtanks smname "Bomber Smoker" spname "Bomber Spitter" } + mob + { + mobvariants -1 + commname "Bomber Common" + witchname "Bomber Witch" + } tenabled -1 chance 100.0 note 1 @@ -755,6 +1397,12 @@ mtanks smname "Boomer Smoker" spname "Boomer Spitter" } + mob + { + mobvariants -1 + commname "Boomer Common" + witchname "Boomer Witch" + } tenabled -1 chance 100.0 note 1 @@ -810,10 +1458,22 @@ mtanks message 1 amount 5 chance 20.0 + filter 2 lifetime 0.0 remove 1 replace 1 - types 2 + } + respawn + { + human 1 + hammo 2 + hduration 5 + aenabled 1 + message 1 + chance 100.0 + duration 0 + filter 2 + range 300.0 } throw { @@ -824,7 +1484,7 @@ mtanks chance 33.3 infamount 2 inflifetime 0.0 - infoptions 2 + infoptions 4 infremove 1 spec { @@ -848,6 +1508,12 @@ mtanks smname "Bulletproof Smoker" spname "Bulletproof Spitter" } + mob + { + mobvariants -1 + commname "Bulletproof Common" + witchname "Bulletproof Witch" + } tenabled -1 chance 100.0 note 1 @@ -908,6 +1574,12 @@ mtanks smname "Burier Smoker" spname "Burier Spitter" } + mob + { + mobvariants -1 + commname "Burier Common" + witchname "Burier Witch" + } tenabled -1 chance 100.0 note 1 @@ -990,6 +1662,12 @@ mtanks smname "Car Smoker" spname "Car Spitter" } + mob + { + mobvariants -1 + commname "Car Common" + witchname "Car Witch" + } tenabled -1 chance 100.0 note 1 @@ -1045,6 +1723,7 @@ mtanks aenabled 1 message 1 chance 15.0 + damage 5.0 duration 5 interval 0.6 lifetime 30.0 @@ -1058,6 +1737,7 @@ mtanks hammo 2 aenabled 1 message 1 + cardamage 5.0 carlifetime 10.0 caroptions 0 carowner 1 @@ -1085,6 +1765,12 @@ mtanks smname "Charger Smoker" spname "Charger Spitter" } + mob + { + mobvariants -1 + commname "Charger Common" + witchname "Charger Witch" + } tenabled -1 chance 100.0 note 1 @@ -1135,10 +1821,22 @@ mtanks message 1 amount 5 chance 20.0 + filter 32 lifetime 0.0 remove 1 replace 1 - types 32 + } + respawn + { + human 1 + hammo 2 + hduration 5 + aenabled 1 + message 1 + chance 100.0 + duration 0 + filter 32 + range 300.0 } throw { @@ -1149,7 +1847,7 @@ mtanks chance 33.3 infamount 2 inflifetime 0.0 - infoptions 32 + infoptions 64 infremove 1 spec { @@ -1173,6 +1871,12 @@ mtanks smname "Choker Smoker" spname "Choker Spitter" } + mob + { + mobvariants -1 + commname "Choker Common" + witchname "Choker Witch" + } tenabled -1 chance 100.0 note 1 @@ -1245,6 +1949,12 @@ mtanks smname "Clone Smoker" spname "Clone Spitter" } + mob + { + mobvariants -1 + commname "Clone Common" + witchname "Clone Witch" + } tenabled -1 chance 100.0 note 1 @@ -1323,6 +2033,12 @@ mtanks smname "Cloudy Smoker" spname "Cloudy Spitter" } + mob + { + mobvariants -1 + commname "Cloudy Common" + witchname "Cloudy Witch" + } tenabled -1 chance 100.0 note 1 @@ -1375,6 +2091,9 @@ mtanks chance 50.0 damage 5.0 duration 0 + interval 5.0 + range 500.0 + remove 0 } } #15 @@ -1393,6 +2112,12 @@ mtanks smname "Dropper Smoker" spname "Dropper Spitter" } + mob + { + mobvariants -1 + commname "Dropper Common" + witchname "Dropper Witch" + } tenabled -1 chance 100.0 note 1 @@ -1460,6 +2185,12 @@ mtanks smname "Drugger Smoker" spname "Drugger Spitter" } + mob + { + mobvariants -1 + commname "Drugger Common" + witchname "Drugger Witch" + } tenabled -1 chance 100.0 note 1 @@ -1489,6 +2220,10 @@ mtanks particles { body 32 + common + { + bchance 100.0,100.0,100.0,100.0,100.0,33.3,100.0 + } } health { @@ -1535,6 +2270,12 @@ mtanks smname "Drunk Smoker" spname "Drunk Spitter" } + mob + { + mobvariants -1 + commname "Drunk Common" + witchname "Drunk Witch" + } tenabled -1 chance 100.0 note 1 @@ -1606,6 +2347,12 @@ mtanks smname "Electric Smoker" spname "Electric Spitter" } + mob + { + mobvariants -1 + commname "Electric Common" + witchname "Electric Witch" + } tenabled -1 chance 100.0 note 1 @@ -1687,6 +2434,12 @@ mtanks smname "Enforcer Smoker" spname "Enforcer Spitter" } + mob + { + mobvariants -1 + commname "Enforcer Common" + witchname "Enforcer Witch" + } tenabled -1 chance 100.0 note 1 @@ -1758,6 +2511,12 @@ mtanks smname "Fast Smoker" spname "Fast Spitter" } + mob + { + mobvariants -1 + commname "Fast Common" + witchname "Fast Witch" + } tenabled -1 chance 100.0 note 1 @@ -1850,6 +2609,12 @@ mtanks smname "Fireproof Smoker" spname "Fireproof Spitter" } + mob + { + mobvariants -1 + commname "Fireproof Common" + witchname "Fireproof Witch" + } tenabled -1 chance 100.0 note 1 @@ -1943,6 +2708,12 @@ mtanks smname "Flinger Smoker" spname "Flinger Spitter" } + mob + { + mobvariants -1 + commname "Flinger Common" + witchname "Flinger Witch" + } tenabled -1 chance 100.0 note 1 @@ -2015,6 +2786,12 @@ mtanks smname "Flying Smoker" spname "Flying Spitter" } + mob + { + mobvariants -1 + commname "Flying Common" + witchname "Flying Witch" + } tenabled -1 chance 100.0 note 1 @@ -2084,6 +2861,12 @@ mtanks smname "Fragile Smoker" spname "Fragile Spitter" } + mob + { + mobvariants -1 + commname "Fragile Common" + witchname "Fragile Witch" + } tenabled -1 chance 100.0 note 1 @@ -2158,6 +2941,12 @@ mtanks smname "Ghost Smoker" spname "Ghost Spitter" } + mob + { + mobvariants -1 + commname "Ghost Common" + witchname "Ghost Witch" + } tenabled -1 chance 100.0 note 1 @@ -2237,6 +3026,12 @@ mtanks smname "Godly Smoker" spname "Godly Spitter" } + mob + { + mobvariants -1 + commname "Godly Common" + witchname "Godly Witch" + } tenabled -1 chance 100.0 note 1 @@ -2303,6 +3098,12 @@ mtanks smname "Gravity Smoker" spname "Gravity Spitter" } + mob + { + mobvariants -1 + commname "Gravity Common" + witchname "Gravity Witch" + } tenabled -1 chance 100.0 note 1 @@ -2384,6 +3185,12 @@ mtanks smname "Gunner Smoker" spname "Gunner Spitter" } + mob + { + mobvariants -1 + commname "Gunner Common" + witchname "Gunner Witch" + } tenabled -1 chance 100.0 note 1 @@ -2458,6 +3265,12 @@ mtanks smname "Healthy Smoker" spname "Healthy Spitter" } + mob + { + mobvariants -1 + commname "Healthy Common" + witchname "Healthy Witch" + } tenabled -1 chance 100.0 note 1 @@ -2541,6 +3354,12 @@ mtanks smname "Hitter Smoker" spname "Hitter Spitter" } + mob + { + mobvariants -1 + commname "Hitter Common" + witchname "Hitter Witch" + } tenabled -1 chance 100.0 note 1 @@ -2580,12 +3399,11 @@ mtanks spextrahp 100 } } - hit + medic { human 1 - aenabled 1 dmgmulti 1.5 - group 1 + hitgroup 1 } } #31 @@ -2604,6 +3422,12 @@ mtanks smname "Hunter Smoker" spname "Hunter Spitter" } + mob + { + mobvariants -1 + commname "Hunter Common" + witchname "Hunter Witch" + } tenabled -1 chance 100.0 note 1 @@ -2654,10 +3478,22 @@ mtanks message 1 amount 5 chance 20.0 + filter 4 lifetime 0.0 remove 1 replace 1 - types 4 + } + respawn + { + human 1 + hammo 2 + hduration 5 + aenabled 1 + message 1 + chance 100.0 + duration 0 + filter 4 + range 300.0 } throw { @@ -2668,7 +3504,7 @@ mtanks chance 33.3 infamount 2 inflifetime 0.0 - infoptions 4 + infoptions 8 infremove 1 spec { @@ -2692,6 +3528,12 @@ mtanks smname "Hurtful Smoker" spname "Hurtful Spitter" } + mob + { + mobvariants -1 + commname "Hurtful Common" + witchname "Hurtful Witch" + } tenabled -1 chance 100.0 note 1 @@ -2743,6 +3585,7 @@ mtanks hit 1 hitmode 0 interval 1.0 + mode 1 range 150.0 rangechance 15.0 } @@ -2763,6 +3606,12 @@ mtanks smname "Hypnotizer Smoker" spname "Hypnotizer Spitter" } + mob + { + mobvariants -1 + commname "Hypnotizer Common" + witchname "Hypnotizer Witch" + } tenabled -1 chance 100.0 note 1 @@ -2840,6 +3689,12 @@ mtanks smname "Icy Smoker" spname "Icy Spitter" } + mob + { + mobvariants -1 + commname "Icy Common" + witchname "Icy Witch" + } tenabled -1 chance 100.0 note 1 @@ -2913,6 +3768,12 @@ mtanks smname "Idler Smoker" spname "Idler Spitter" } + mob + { + mobvariants -1 + commname "Idler Common" + witchname "Idler Witch" + } tenabled -1 chance 100.0 note 1 @@ -2982,6 +3843,12 @@ mtanks smname "Inverter Smoker" spname "Inverter Spitter" } + mob + { + mobvariants -1 + commname "Inverter Common" + witchname "Inverter Witch" + } tenabled -1 chance 100.0 note 1 @@ -3051,6 +3918,12 @@ mtanks smname "Item Smoker" spname "Item Spitter" } + mob + { + mobvariants -1 + commname "Item Common" + witchname "Item Witch" + } tenabled -1 chance 100.0 note 1 @@ -3090,14 +3963,14 @@ mtanks spextrahp 100 } } - item + drop { human 1 - aenabled 1 + aenabled 2 message 1 chance 50.0 loadout rifle,pistol,first_aid_kit,pain_pills - mode 0 + itemmode 0 pinata "" pinatabody 1 pinatachance 33.3 @@ -3125,6 +3998,12 @@ mtanks smname "Jockey Smoker" spname "Jockey Spitter" } + mob + { + mobvariants -1 + commname "Jockey Common" + witchname "Jockey Witch" + } tenabled -1 chance 100.0 note 1 @@ -3175,10 +4054,22 @@ mtanks message 1 amount 5 chance 20.0 + filter 16 lifetime 0.0 remove 1 replace 1 - types 16 + } + respawn + { + human 1 + hammo 2 + hduration 5 + aenabled 1 + message 1 + chance 100.0 + duration 0 + filter 16 + range 300.0 } throw { @@ -3189,7 +4080,7 @@ mtanks chance 33.3 infamount 2 inflifetime 0.0 - infoptions 16 + infoptions 32 infremove 1 spec { @@ -3213,6 +4104,12 @@ mtanks smname "Jumper Smoker" spname "Jumper Spitter" } + mob + { + mobvariants -1 + commname "Jumper Common" + witchname "Jumper Witch" + } tenabled -1 chance 100.0 note 1 @@ -3286,6 +4183,12 @@ mtanks smname "Kamikaze Smoker" spname "Kamikaze Spitter" } + mob + { + mobvariants -1 + commname "Kamikaze Common" + witchname "Kamikaze Witch" + } tenabled -1 chance 100.0 note 1 @@ -3328,7 +4231,7 @@ mtanks { speed 0.65 } - kamikaze + smash { human 1 aenabled 1 @@ -3341,6 +4244,8 @@ mtanks mode 1 range 150.0 rangechance 33.3 + remove 1 + type 1 spec { body 0 @@ -3364,6 +4269,12 @@ mtanks smname "Lagger Smoker" spname "Lagger Spitter" } + mob + { + mobvariants -1 + commname "Lagger Common" + witchname "Lagger Witch" + } tenabled -1 chance 100.0 note 1 @@ -3434,6 +4345,12 @@ mtanks smname "Laser Smoker" spname "Laser Spitter" } + mob + { + mobvariants -1 + commname "Laser Common" + witchname "Laser Witch" + } tenabled -1 chance 100.0 note 1 @@ -3502,6 +4419,12 @@ mtanks smname "Leecher Smoker" spname "Leecher Spitter" } + mob + { + mobvariants -1 + commname "Leecher Common" + witchname "Leecher Witch" + } tenabled -1 chance 100.0 note 1 @@ -3540,20 +4463,25 @@ mtanks spextrahp 100 } } - leech + regen { human 1 hammo 2 + hduration 5 aenabled 1 - effect 7 + effect 4 message 1 - chance 33.3 + chance 100.0 duration 5 - hit 1 - hitmode 0 + health 1 interval 1.0 - range 150.0 - rangechance 15.0 + limit 1000000 + range 500.0 + spec + { + limit 100000 + range 150.0 + } } } #44 @@ -3573,6 +4501,12 @@ mtanks smname "Lightning Smoker" spname "Lightning Spitter" } + mob + { + mobvariants -1 + commname "Lightning Common" + witchname "Lightning Witch" + } tenabled -1 chance 100.0 note 1 @@ -3644,6 +4578,12 @@ mtanks smname "Medic Smoker" spname "Medic Spitter" } + mob + { + mobvariants -1 + commname "Medic Common" + witchname "Medic Witch" + } tenabled -1 chance 100.0 note 1 @@ -3722,6 +4662,12 @@ mtanks smname "Meteor Smoker" spname "Meteor Spitter" } + mob + { + mobvariants -1 + commname "Meteor Common" + witchname "Meteor Witch" + } tenabled -1 chance 100.0 note 1 @@ -3804,6 +4750,12 @@ mtanks smname "Necromancer Smoker" spname "Necromancer Spitter" } + mob + { + mobvariants -1 + commname "Necromancer Common" + witchname "Necromancer Witch" + } tenabled -1 chance 100.0 note 1 @@ -3843,7 +4795,7 @@ mtanks spextrahp 100 } } - necro + respawn { human 1 hammo 2 @@ -3852,6 +4804,7 @@ mtanks message 1 chance 100.0 duration 0 + filter 0 range 500.0 } } @@ -3871,6 +4824,12 @@ mtanks smname "Nullifier Smoker" spname "Nullifier Spitter" } + mob + { + mobvariants -1 + commname "Nullifier Common" + witchname "Nullifier Witch" + } tenabled -1 chance 100.0 note 1 @@ -3945,6 +4904,12 @@ mtanks smname "Omni Smoker" spname "Omni Spitter" } + mob + { + mobvariants -1 + commname "Omni Common" + witchname "Omni Witch" + } tenabled -1 chance 100.0 note 1 @@ -4013,6 +4978,12 @@ mtanks smname "Panic Smoker" spname "Panic Spitter" } + mob + { + mobvariants -1 + commname "Panic Common" + witchname "Panic Witch" + } tenabled -1 chance 100.0 note 1 @@ -4083,6 +5054,12 @@ mtanks smname "Pet Smoker" spname "Pet Spitter" } + mob + { + mobvariants -1 + commname "Pet Common" + witchname "Pet Witch" + } tenabled -1 chance 100.0 note 1 @@ -4171,6 +5148,12 @@ mtanks smname "Pimp Smoker" spname "Pimp Spitter" } + mob + { + mobvariants -1 + commname "Pimp Common" + witchname "Pimp Witch" + } tenabled -1 chance 100.0 note 1 @@ -4209,7 +5192,7 @@ mtanks spextrahp 100 } } - pimp + hurt { human 1 hammo 2 @@ -4221,6 +5204,7 @@ mtanks duration 5 hit 1 hitmode 0 + mode 2 interval 1.0 range 150.0 rangechance 15.0 @@ -4242,6 +5226,12 @@ mtanks smname "Platinum Smoker" spname "Platinum Spitter" } + mob + { + mobvariants -1 + commname "Platinum Common" + witchname "Platinum Witch" + } tenabled -1 chance 100.0 note 1 @@ -4301,6 +5291,12 @@ mtanks smname "Puke Smoker" spname "Puke Spitter" } + mob + { + mobvariants -1 + commname "Puke Common" + witchname "Puke Witch" + } tenabled -1 chance 100.0 note 1 @@ -4381,6 +5377,12 @@ mtanks smname "Pyromaniac Smoker" spname "Pyromaniac Spitter" } + mob + { + mobvariants -1 + commname "Pyromaniac Common" + witchname "Pyromaniac Witch" + } tenabled -1 chance 100.0 note 1 @@ -4416,12 +5418,12 @@ mtanks extrahp 1000 spec { - bextrahp 500 - cextrahp 500 - hextrahp 500 - jextrahp 500 - smextrahp 500 - spextrahp 500 + bextrahp 100 + cextrahp 100 + hextrahp 100 + jextrahp 100 + smextrahp 100 + spextrahp 100 } } enhance @@ -4464,6 +5466,12 @@ mtanks smname "Quiet Smoker" spname "Quiet Spitter" } + mob + { + mobvariants -1 + commname "Quiet Common" + witchname "Quiet Witch" + } tenabled -1 chance 100.0 note 1 @@ -4535,6 +5543,12 @@ mtanks smname "Recall Smoker" spname "Recall Spitter" } + mob + { + mobvariants -1 + commname "Recall Common" + witchname "Recall Witch" + } tenabled -1 chance 100.0 note 1 @@ -4628,6 +5642,12 @@ mtanks smname "Recoil Smoker" spname "Recoil Spitter" } + mob + { + mobvariants -1 + commname "Recoil Common" + witchname "Recoil Witch" + } tenabled -1 chance 100.0 note 1 @@ -4698,6 +5718,12 @@ mtanks smname "Regenerative Smoker" spname "Regenerative Spitter" } + mob + { + mobvariants -1 + commname "Regenerative Common" + witchname "Regenerative Witch" + } tenabled -1 chance 100.0 note 1 @@ -4743,17 +5769,18 @@ mtanks hammo 2 hduration 5 aenabled 1 + effect 4 message 1 chance 100.0 duration 0 health 1 interval 1.0 - leech 1 - leechrange 500.0 limit 1000000 + range 500.0 spec { limit 100000 + range 150.0 } } } @@ -4773,6 +5800,12 @@ mtanks smname "Respawner Smoker" spname "Respawner Spitter" } + mob + { + mobvariants -1 + commname "Respawner Common" + witchname "Respawner Witch" + } tenabled -1 chance 100.0 note 1 @@ -4816,7 +5849,7 @@ mtanks { human 1 hammo 1 - aenabled 1 + aenabled 2 message 1 amount 1 chance 100.0 @@ -4839,6 +5872,12 @@ mtanks smname "Restarter Smoker" spname "Restarter Spitter" } + mob + { + mobvariants -1 + commname "Restarter Common" + witchname "Restarter Witch" + } tenabled -1 chance 100.0 note 1 @@ -4914,6 +5953,12 @@ mtanks smname "Rock Smoker" spname "Rock Spitter" } + mob + { + mobvariants -1 + commname "Rock Common" + witchname "Rock Witch" + } tenabled -1 chance 100.0 note 1 @@ -4968,6 +6013,7 @@ mtanks rock 5 duration 5 interval 0.2 + mode 1 radius -1.25,1.25 } } @@ -4987,6 +6033,12 @@ mtanks smname "Rocketeer Smoker" spname "Rocketeer Spitter" } + mob + { + mobvariants -1 + commname "Rocketeer Common" + witchname "Rocketeer Witch" + } tenabled -1 chance 100.0 note 1 @@ -5025,7 +6077,7 @@ mtanks spextrahp 100 } } - rocket + smash { human 1 hammo 1 @@ -5037,9 +6089,10 @@ mtanks delay 1.0 hit 1 hitmode 0 - mode 1 + mode 2 range 150.0 rangechance 15.0 + type 1 spec { body 0 @@ -5063,6 +6116,12 @@ mtanks smname "Self-throwing Smoker" spname "Self-throwing Spitter" } + mob + { + mobvariants -1 + commname "Self-throwing Common" + witchname "Self-throwing Witch" + } tenabled -1 chance 100.0 note 1 @@ -5134,6 +6193,12 @@ mtanks smname "Shaker Smoker" spname "Shaker Spitter" } + mob + { + mobvariants -1 + commname "Shaker Common" + witchname "Shaker Witch" + } tenabled -1 chance 100.0 note 1 @@ -5173,7 +6238,7 @@ mtanks spextrahp 100 } } - shake + vision { human 1 hammo 2 @@ -5188,6 +6253,7 @@ mtanks hit 1 hitmode 0 interval 1.0 + mode 4 range 150.0 rangechance 15.0 } @@ -5208,6 +6274,12 @@ mtanks smname "Shield Smoker" spname "Shield Spitter" } + mob + { + mobvariants -1 + commname "Shield Common" + witchname "Shield Witch" + } tenabled -1 chance 100.0 note 1 @@ -5286,6 +6358,12 @@ mtanks smname "Shover Smoker" spname "Shover Spitter" } + mob + { + mobvariants -1 + commname "Shover Common" + witchname "Shover Witch" + } tenabled -1 chance 100.0 note 1 @@ -5359,6 +6437,12 @@ mtanks smname "Slow Smoker" spname "Slow Spitter" } + mob + { + mobvariants -1 + commname "Slow Common" + witchname "Slow Witch" + } tenabled -1 chance 100.0 note 1 @@ -5430,6 +6514,12 @@ mtanks smname "Smasher Smoker" spname "Smasher Spitter" } + mob + { + mobvariants -1 + commname "Smasher Common" + witchname "Smasher Witch" + } tenabled -1 chance 100.0 note 1 @@ -5486,6 +6576,8 @@ mtanks mode 1 range 150.0 rangechance 33.3 + remove 0 + type 1 spec { body 0 @@ -5509,6 +6601,12 @@ mtanks smname "Smiter Smoker" spname "Smiter Spitter" } + mob + { + mobvariants -1 + commname "Smiter Common" + witchname "Smiter Witch" + } tenabled -1 chance 100.0 note 1 @@ -5551,7 +6649,7 @@ mtanks { speed 0.65 } - smite + smash { human 1 hammo 1 @@ -5562,9 +6660,10 @@ mtanks chance 33.3 hit 1 hitmode 0 - mode 1 + mode 4 range 150.0 rangechance 33.3 + type 1 spec { body 0 @@ -5588,6 +6687,12 @@ mtanks smname "Smoker Smoker" spname "Smoker Spitter" } + mob + { + mobvariants -1 + commname "Smoker Common" + witchname "Smoker Witch" + } tenabled -1 chance 100.0 note 1 @@ -5620,6 +6725,10 @@ mtanks particles { body 32 + common + { + bchance 100.0,100.0,100.0,100.0,100.0,33.3,100.0 + } } health { @@ -5642,10 +6751,22 @@ mtanks message 1 amount 5 chance 20.0 + filter 1 lifetime 0.0 remove 1 replace 1 - types 1 + } + respawn + { + human 1 + hammo 2 + hduration 5 + aenabled 1 + message 1 + chance 100.0 + duration 0 + filter 1 + range 300.0 } throw { @@ -5656,7 +6777,7 @@ mtanks chance 33.3 infamount 2 inflifetime 0.0 - infoptions 1 + infoptions 2 infremove 1 spec { @@ -5680,6 +6801,12 @@ mtanks smname "Spammer Smoker" spname "Spammer Spitter" } + mob + { + mobvariants -1 + commname "Spammer Common" + witchname "Spammer Witch" + } tenabled -1 chance 100.0 note 1 @@ -5722,7 +6849,7 @@ mtanks spextrahp 100 } } - spam + rock { human 1 hammo 2 @@ -5732,6 +6859,7 @@ mtanks damage 5 duration 5 interval 0.5 + mode 2 } } #73 @@ -5750,6 +6878,12 @@ mtanks smname "Special Smoker" spname "Special Spitter" } + mob + { + mobvariants -1 + commname "Special Common" + witchname "Special Witch" + } tenabled -1 chance 100.0 note 1 @@ -5800,10 +6934,22 @@ mtanks message 1 amount 5 chance 20.0 + filter 0 lifetime 0.0 remove 1 replace 1 - types 0 + } + respawn + { + human 1 + hammo 2 + hduration 5 + aenabled 1 + message 1 + chance 100.0 + duration 0 + filter 0 + range 300.0 } throw { @@ -5814,7 +6960,7 @@ mtanks chance 33.3 infamount 2 inflifetime 0.0 - infoptions 63 + infoptions 126 infremove 1 spec { @@ -5839,6 +6985,12 @@ mtanks smname "Spitter Smoker" spname "Spitter Spitter" } + mob + { + mobvariants -1 + commname "Spitter Common" + witchname "Spitter Witch" + } tenabled -1 chance 100.0 note 1 @@ -5894,10 +7046,22 @@ mtanks message 1 amount 5 chance 20.0 + filter 8 lifetime 0.0 remove 1 replace 1 - types 8 + } + respawn + { + human 1 + hammo 2 + hduration 5 + aenabled 1 + message 1 + chance 100.0 + duration 0 + filter 8 + range 300.0 } throw { @@ -5908,7 +7072,7 @@ mtanks chance 33.3 infamount 2 inflifetime 0.0 - infoptions 8 + infoptions 16 infremove 1 spec { @@ -5932,6 +7096,12 @@ mtanks smname "Splasher Smoker" spname "Splasher Spitter" } + mob + { + mobvariants -1 + commname "Splasher Common" + witchname "Splasher Witch" + } tenabled -1 chance 100.0 note 1 @@ -5974,7 +7144,7 @@ mtanks spextrahp 100 } } - splash + cloud { human 1 hammo 2 @@ -5986,6 +7156,7 @@ mtanks duration 0 interval 5.0 range 500.0 + remove 1 } } #76 @@ -6005,6 +7176,12 @@ mtanks smname "Splatter Smoker" spname "Splatter Spitter" } + mob + { + mobvariants -1 + commname "Splatter Common" + witchname "Splatter Witch" + } tenabled -1 chance 100.0 note 1 @@ -6044,7 +7221,7 @@ mtanks spextrahp 100 } } - splatter + vision { human 1 hammo 2 @@ -6052,10 +7229,11 @@ mtanks effect 7 message 1 chance 33.3 - duration 5 + duration 5.0 hit 1 hitmode 0 interval 1.0 + mode 8 range 150.0 rangechance 15.0 type 0 @@ -6077,6 +7255,12 @@ mtanks smname "Thrower Smoker" spname "Thrower Spitter" } + mob + { + mobvariants -1 + commname "Thrower Common" + witchname "Thrower Witch" + } tenabled -1 chance 100.0 note 1 @@ -6129,13 +7313,14 @@ mtanks hammo 2 aenabled 15 message 15 + cardamage 5.0 carlifetime 10.0 caroptions 0 carowner 1 chance 33.3 infamount 2 inflifetime 0.0 - infoptions 63 + infoptions 126 infremove 1 witchamount 3 witchdmg 5.0 @@ -6163,6 +7348,12 @@ mtanks smname "Tracker Smoker" spname "Tracker Spitter" } + mob + { + mobvariants -1 + commname "Tracker Common" + witchname "Tracker Witch" + } tenabled -1 chance 100.0 note 1 @@ -6241,6 +7432,12 @@ mtanks smname "Ultimate Smoker" spname "Ultimate Spitter" } + mob + { + mobvariants -1 + commname "Ultimate Common" + witchname "Ultimate Witch" + } tenabled -1 chance 100.0 note 1 @@ -6310,6 +7507,12 @@ mtanks smname "Undead Smoker" spname "Undead Spitter" } + mob + { + mobvariants -1 + commname "Undead Common" + witchname "Undead Witch" + } tenabled -1 chance 100.0 note 1 @@ -6379,6 +7582,12 @@ mtanks smname "Vampire Smoker" spname "Vampire Spitter" } + mob + { + mobvariants -1 + commname "Vampire Common" + witchname "Vampire Witch" + } tenabled -1 chance 100.0 note 1 @@ -6422,13 +7631,13 @@ mtanks spextrahp 100 } } - vampire + regen { human 1 - aenabled 1 effect 1 message 1 chance 33.3 + mode 1 } } #82 @@ -6447,6 +7656,12 @@ mtanks smname "Visual Smoker" spname "Visual Spitter" } + mob + { + mobvariants -1 + commname "Visual Common" + witchname "Visual Witch" + } tenabled -1 chance 100.0 note 1 @@ -6494,10 +7709,11 @@ mtanks effect 7 message 1 chance 33.3 - duration 5 + duration 5.0 fov 160 hit 1 hitmode 0 + mode 16 range 150.0 rangechance 15.0 } @@ -6518,6 +7734,12 @@ mtanks smname "Warper Smoker" spname "Warper Spitter" } + mob + { + mobvariants -1 + commname "Warper Common" + witchname "Warper Witch" + } tenabled -1 chance 100.0 note 1 @@ -6605,6 +7827,12 @@ mtanks smname "Whirler Smoker" spname "Whirler Spitter" } + mob + { + mobvariants -1 + commname "Whirler Common" + witchname "Whirler Witch" + } tenabled -1 chance 100.0 note 1 @@ -6677,6 +7905,12 @@ mtanks smname "Witch Smoker" spname "Witch Spitter" } + mob + { + mobvariants -1 + commname "Witch Common" + witchname "Witch Witch" + } tenabled -1 chance 100.0 note 1 @@ -6767,6 +8001,12 @@ mtanks smname "Xiphos Smoker" spname "Xiphos Spitter" } + mob + { + mobvariants -1 + commname "Xiphos Common" + witchname "Xiphos Witch" + } tenabled -1 chance 100.0 note 1 @@ -6805,14 +8045,14 @@ mtanks spextrahp 100 } } - xiphos + regen { human 1 - aenabled 1 - effect 1 + effect 3 message 1 chance 33.3 maxhealth 0 + mode 2 } } #87 @@ -6831,6 +8071,12 @@ mtanks smname "Yeller Smoker" spname "Yeller Spitter" } + mob + { + mobvariants -1 + commname "Yeller Common" + witchname "Yeller Witch" + } tenabled -1 chance 100.0 note 1 @@ -6901,6 +8147,12 @@ mtanks smname "Zombie Smoker" spname "Zombie Spitter" } + mob + { + mobvariants -1 + commname "Zombie Common" + witchname "Zombie Witch" + } tenabled -1 chance 100.0 note 1 @@ -6939,12 +8191,12 @@ mtanks spextrahp 100 } } - zombie + panic { human 1 hammo 2 hduration 6 - aenabled 1 + aenabled 2 message 1 amount 10 chance 33.3 @@ -6974,6 +8226,12 @@ mtanks smname "Armageddon Smoker" spname "Armageddon Spitter" } + mob + { + mobvariants -1 + commname "Armageddon Common" + witchname "Armageddon Witch" + } tenabled -1 chance 100.0 note 1 @@ -7020,7 +8278,7 @@ mtanks gravity { aenabled 2 - message 5 + message 4 flags 8 force -50.0 } @@ -7053,6 +8311,12 @@ mtanks smname "Boss Smoker" spname "Boss Spitter" } + mob + { + mobvariants -1 + commname "Boss Common" + witchname "Boss Witch" + } tenabled -1 chance 100.0 note 1 @@ -7080,6 +8344,7 @@ mtanks particles { body 127 + bchance 100.0,100.0,100.0,100.0,100.0,33.3,100.0 rock 15 } health @@ -7199,6 +8464,8 @@ mtanks chance 20.0 hit 1 hitmode 0 + mode 1 + type 1 spec { body 0 @@ -7222,9 +8489,9 @@ mtanks range 500.0 remove 1 } - zombie + panic { - aenabled 1 + aenabled 2 message 1 amount 50 chance 33.3 @@ -7250,6 +8517,12 @@ mtanks smname "Cobalt Smoker" spname "Cobalt Spitter" } + mob + { + mobvariants -1 + commname "Cobalt Common" + witchname "Cobalt Witch" + } tenabled -1 chance 100.0 note 1 @@ -7329,6 +8602,12 @@ mtanks smname "Distraction Smoker" spname "Distraction Spitter" } + mob + { + mobvariants -1 + commname "Distraction Common" + witchname "Distraction Witch" + } tenabled -1 chance 100.0 note 1 @@ -7413,6 +8692,12 @@ mtanks smname "Feedback Smoker" spname "Feedback Spitter" } + mob + { + mobvariants -1 + commname "Feedback Common" + witchname "Feedback Witch" + } tenabled -1 chance 100.0 note 1 @@ -7465,7 +8750,7 @@ mtanks human 1 hammo 2 aenabled 2 - message 5 + message 4 flags 8 force 50.0 } @@ -7486,6 +8771,12 @@ mtanks smname "Flash Smoker" spname "Flash Spitter" } + mob + { + mobvariants -1 + commname "Flash Common" + witchname "Flash Witch" + } tenabled -1 chance 100.0 note 1 @@ -7621,6 +8912,12 @@ mtanks smname "Goliath Smoker" spname "Goliath Spitter" } + mob + { + mobvariants -1 + commname "Goliath Common" + witchname "Goliath Witch" + } tenabled -1 chance 100.0 note 1 @@ -7715,6 +9012,8 @@ mtanks chance 33.3 hit 1 hitmode 0 + mode 1 + type 1 spec { body 0 @@ -7738,6 +9037,12 @@ mtanks smname "Hallucination Smoker" spname "Hallucination Spitter" } + mob + { + mobvariants -1 + commname "Hallucination Common" + witchname "Hallucination Witch" + } tenabled -1 chance 100.0 note 1 @@ -7820,6 +9125,12 @@ mtanks smname "Meme Smoker" spname "Meme Spitter" } + mob + { + mobvariants -1 + commname "Meme Common" + witchname "Meme Witch" + } tenabled -1 chance 100.0 note 1 @@ -7847,6 +9158,7 @@ mtanks particles { body 127 + bchance 100.0,100.0,100.0,100.0,100.0,33.3,100.0 rock 15 } health @@ -7947,19 +9259,22 @@ mtanks chance 20.0 hit 1 hitmode 0 + mode 1 + type 1 spec { body 0 meter 50.0 } } - spam + rock { aenabled 1 chance 50.0 damage 5 duration 1 interval 0.5 + mode 2 } warp { @@ -7978,9 +9293,9 @@ mtanks range 500.0 remove 1 } - zombie + panic { - aenabled 1 + aenabled 2 message 1 amount 50 chance 33.3 @@ -8006,6 +9321,12 @@ mtanks smname "Mirage Smoker" spname "Mirage Spitter" } + mob + { + mobvariants -1 + commname "Mirage Common" + witchname "Mirage Witch" + } tenabled -1 chance 100.0 note 1 @@ -8095,6 +9416,12 @@ mtanks smname "Poltergeist Smoker" spname "Poltergeist Spitter" } + mob + { + mobvariants -1 + commname "Poltergeist Common" + witchname "Poltergeist Witch" + } tenabled -1 chance 100.0 note 1 @@ -8200,6 +9527,12 @@ mtanks smname "Psychotic Smoker" spname "Psychotic Spitter" } + mob + { + mobvariants -1 + commname "Psychotic Common" + witchname "Psychotic Witch" + } tenabled -1 chance 100.0 note 1 @@ -8319,6 +9652,12 @@ mtanks smname "Reverse-Flash Smoker" spname "Reverse-Flash Spitter" } + mob + { + mobvariants -1 + commname "Reverse-Flash Common" + witchname "Reverse-Flash Witch" + } tenabled -1 chance 100.0 note 1 @@ -8417,6 +9756,12 @@ mtanks smname "Spawner Smoker" spname "Spawner Spitter" } + mob + { + mobvariants -1 + commname "Spawner Common" + witchname "Spawner Witch" + } tenabled -1 chance 100.0 note 1 @@ -8438,6 +9783,10 @@ mtanks particles { body 32 + common + { + bchance 100.0,100.0,100.0,100.0,100.0,33.3,100.0 + } } health { @@ -8452,12 +9801,12 @@ mtanks spextrahp 100 } } - zombie + panic { human 1 hammo 2 hduration 26 - aenabled 1 + aenabled 2 message 1 amount 25 chance 33.3 @@ -8483,6 +9832,12 @@ mtanks smname "Zoom Smoker" spname "Zoom Spitter" } + mob + { + mobvariants -1 + commname "Zoom Common" + witchname "Zoom Witch" + } tenabled -1 chance 100.0 note 1 @@ -8581,6 +9936,12 @@ mtanks smname "Trap Smoker" spname "Trap Spitter" } + mob + { + mobvariants -1 + commname "Trap Common" + witchname "Trap Witch" + } tenabled -1 chance 100.0 note 1 @@ -8601,15 +9962,15 @@ mtanks } health { - extrahp 2000 + extrahp 1000 spec { - bextrahp 200 - cextrahp 200 - hextrahp 200 - jextrahp 200 - smextrahp 200 - spextrahp 200 + bextrahp 100 + cextrahp 100 + hextrahp 100 + jextrahp 100 + smextrahp 100 + spextrahp 100 } } enhance @@ -8628,6 +9989,8 @@ mtanks chance 33.3 hit 1 hitmode 0 + mode 1 + type 1 spec { body 0 @@ -8655,6 +10018,12 @@ mtanks smname "Dread Smoker" spname "Dread Spitter" } + mob + { + mobvariants -1 + commname "Dread Common" + witchname "Dread Witch" + } tenabled -1 chance 100.0 note 1 @@ -8686,7 +10055,7 @@ mtanks spextrahp 100 } } - blind + vision { human 1 effect 7 @@ -8696,7 +10065,7 @@ mtanks hit 1 hitmode 0 intensity 235 - mode 0 + mode 1 } } #106 @@ -8715,6 +10084,12 @@ mtanks smname "Rabid Smoker" spname "Rabid Spitter" } + mob + { + mobvariants -1 + commname "Rabid Common" + witchname "Rabid Witch" + } tenabled -1 chance 100.0 note 1 @@ -8776,6 +10151,7 @@ mtanks message 1 hit 1 hitmode 0 + mode 1 } } #107 @@ -8794,6 +10170,12 @@ mtanks smname "Tremor Smoker" spname "Tremor Spitter" } + mob + { + mobvariants -1 + commname "Tremor Common" + witchname "Tremor Witch" + } tenabled -1 chance 100.0 note 1 @@ -8842,7 +10224,7 @@ mtanks chance 33.3,75.0 damage 1.0 duration 5.0 - interval 0.2 + interval 0.75 radius -1.25;1.25 set rock,track speed 0.0,500.0 @@ -8856,6 +10238,11 @@ mtanks hduration 5 aenabled 1 message 1 + chance 33.3 + damage 5 + duration 5 + interval 0.75 + mode 0 } track { @@ -8866,18 +10253,6 @@ mtanks message 1 mode 1 } - spam - { - human 1 - hammo 2 - hduration 5 - aenabled 1 - message 1 - chance 33.3 - damage 5 - duration 5 - interval 0.5 - } } /** * This is the plugin developer's personal Tank. @@ -8899,6 +10274,12 @@ mtanks smname "Psyk0tik Smoker" spname "Psyk0tik Spitter" } + mob + { + mobvariants -1 + commname "Psyk0tik Common" + witchname "Psyk0tik Witch" + } tenabled -1 chance 100.0 note 1 @@ -9027,6 +10408,12 @@ mtanks smname "Apocalyptic Smoker" spname "Apocalyptic Spitter" } + mob + { + mobvariants -1 + commname "Apocalyptic Common" + witchname "Apocalyptic Witch" + } tenabled -1 chance 100.0 note 1 @@ -9112,6 +10499,7 @@ mtanks rock 10 duration 3 interval 0.2 + mode 1 radius -5.0,5.0 } } @@ -9131,6 +10519,12 @@ mtanks smname "Darth Vader Smoker" spname "Darth Vader Spitter" } + mob + { + mobvariants -1 + commname "Darth Vader Common" + witchname "Darth Vader Witch" + } tenabled -1 chance 100.0 note 1 @@ -9159,7 +10553,16 @@ mtanks } health { - extrahp 1500 + extrahp 1000 + spec + { + bextrahp 100 + cextrahp 100 + hextrahp 100 + jextrahp 100 + smextrahp 100 + spextrahp 100 + } } enhance { @@ -9228,6 +10631,12 @@ mtanks smname "Drug Addict Smoker" spname "Drug Addict Spitter" } + mob + { + mobvariants -1 + commname "Drug Addict Common" + witchname "Drug Addict Witch" + } tenabled -1 chance 100.0 note 1 @@ -9256,18 +10665,22 @@ mtanks particles { body 32 + common + { + bchance 100.0,100.0,100.0,100.0,100.0,33.3,100.0 + } } health { - extrahp 2000 + extrahp 1000 spec { - bextrahp 200 - cextrahp 200 - hextrahp 200 - jextrahp 200 - smextrahp 200 - spextrahp 200 + bextrahp 100 + cextrahp 100 + hextrahp 100 + jextrahp 100 + smextrahp 100 + spextrahp 100 } } drug @@ -9282,9 +10695,10 @@ mtanks hitmode 0 interval 1.0 } - item + drop { human 1 + aenabled 2 pinata pain_pills,pain_pills,pain_pills,pain_pills,pain_pills pinatabody 1 pinatachance 100.0 @@ -9319,6 +10733,12 @@ mtanks smname "Godspeed Smoker" spname "Godspeed Spitter" } + mob + { + mobvariants -1 + commname "Godspeed Common" + witchname "Godspeed Witch" + } tenabled -1 chance 100.0 note 1 @@ -9417,6 +10837,12 @@ mtanks smname "Grim Reaper Smoker" spname "Grim Reaper Spitter" } + mob + { + mobvariants -1 + commname "Grim Reaper Common" + witchname "Grim Reaper Witch" + } tenabled -1 chance 100.0 note 1 @@ -9505,6 +10931,12 @@ mtanks smname "Horde Smoker" spname "Horde Spitter" } + mob + { + mobvariants -1 + commname "Horde Common" + witchname "Horde Witch" + } tenabled -1 chance 100.0 note 1 @@ -9600,6 +11032,12 @@ mtanks smname "Hulk Smoker" spname "Hulk Spitter" } + mob + { + mobvariants -1 + commname "Hulk Common" + witchname "Hulk Witch" + } tenabled -1 chance 100.0 note 1 @@ -9669,6 +11107,7 @@ mtanks message 1 hit 1 hitmode 1 + mode 1 } absorb { @@ -9685,13 +11124,14 @@ mtanks hittable 20.0 melee 200.0 } - shake + vision { human 1 aenabled 1 effect 7 duration 99999 interval 1.0 + mode 4 range 1000.0 rangechance 100.0 } @@ -9704,6 +11144,8 @@ mtanks chance 15.0 hit 1 hitmode 1 + mode 1 + type 1 spec { body 0 @@ -9727,6 +11169,12 @@ mtanks smname "Ninja Smoker" spname "Ninja Spitter" } + mob + { + mobvariants -1 + commname "Ninja Common" + witchname "Ninja Witch" + } tenabled -1 chance 100.0 note 1 @@ -9838,6 +11286,12 @@ mtanks smname "Zen Smoker" spname "Zen Spitter" } + mob + { + mobvariants -1 + commname "Zen Common" + witchname "Zen Witch" + } tenabled -1 chance 100.0 note 1 @@ -9933,6 +11387,12 @@ mtanks smname "The Boss (1st Form)" spname "The Boss (1st Form)" } + mob + { + mobvariants -1 + commname "The Boss (1st Form)" + witchname "The Boss (1st Form)" + } tenabled -1 chance 100.0 note 1 @@ -10016,6 +11476,12 @@ mtanks smname "Steel Overlord (2nd Form)" spname "Steel Overlord (2nd Form)" } + mob + { + mobvariants -1 + commname "Steel Overlord (2nd Form)" + witchname "Steel Overlord (2nd Form)" + } tenabled -1 chance 100.0 note 1 @@ -10116,6 +11582,12 @@ mtanks smname "Night Stalker (3rd Form)" spname "Night Stalker (3rd Form)" } + mob + { + mobvariants -1 + commname "Night Stalker (3rd Form)" + witchname "Night Stalker (3rd Form)" + } tenabled -1 chance 100.0 note 1 @@ -10177,7 +11649,7 @@ mtanks { fire 1 } - blind + vision { effect 7 message 1 @@ -10186,7 +11658,7 @@ mtanks hit 1 hitmode 1 intensity 255 - mode 0 + mode 1 } bomb { @@ -10236,6 +11708,12 @@ mtanks smname "Spirit of Fire (4th Form)" spname "Spirit of Fire (4th Form)" } + mob + { + mobvariants -1 + commname "Spirit of Fire (4th Form)" + witchname "Spirit of Fire (4th Form)" + } tenabled -1 chance 100.0 note 1 @@ -10367,6 +11845,12 @@ mtanks smname "Randomizer Smoker" spname "Randomizer Spitter" } + mob + { + mobvariants -1 + commname "Randomizer Common" + witchname "Randomizer Witch" + } tenabled -1 chance 100.0 note 1 @@ -10440,6 +11924,12 @@ mtanks smname "Shapeshifter Smoker" spname "Shapeshifter Spitter" } + mob + { + mobvariants -1 + commname "Shapeshifter Common" + witchname "Shapeshifter Witch" + } tenabled -1 chance 100.0 note 1 @@ -10503,6 +11993,12 @@ mtanks smname "Flashbanger Smoker" spname "Flashbanger Spitter" } + mob + { + mobvariants -1 + commname "Flashbanger Common" + witchname "Flashbanger Witch" + } tenabled -1 chance 100.0 note 1 @@ -10541,7 +12037,7 @@ mtanks spextrahp 100 } } - blind + vision { human 1 hammo 2 @@ -10553,7 +12049,7 @@ mtanks hit 1 hitmode 0 intensity 255 - mode 1 + mode 2 range 150.0 rangechance 15.0 stagger 3 @@ -10577,6 +12073,12 @@ mtanks smname "Mudman Smoker" spname "Mudman Spitter" } + mob + { + mobvariants -1 + commname "Mudman Common" + witchname "Mudman Witch" + } tenabled -1 chance 100.0 note 1 @@ -10616,7 +12118,7 @@ mtanks spextrahp 100 } } - splatter + vision { human 1 hammo 2 @@ -10624,10 +12126,11 @@ mtanks effect 7 message 1 chance 33.3 - duration 5 + duration 5.0 hit 1 hitmode 0 interval 1.0 + mode 8 range 150.0 rangechance 15.0 type 14 @@ -10650,6 +12153,12 @@ mtanks smname "Endgame Smoker" spname "Endgame Spitter" } + mob + { + mobvariants -1 + commname "Endgame Common" + witchname "Endgame Witch" + } tenabled -1 chance 100.0 note 1 @@ -10696,15 +12205,24 @@ mtanks duration 99999 speed 10.0 } - smash + gravity { - human 1 - effect 7 + aenabled 2 + message 4 + flags 8 + force -100.0 + } + smash + { + human 1 + effect 7 message 1 body 1 chance 100.0 hit 1 hitmode 1 + mode 1 + type 1 spec { body 0 @@ -10728,6 +12246,12 @@ mtanks smname "Playful Smoker" spname "Playful Spitter" } + mob + { + mobvariants -1 + commname "Playful Common" + witchname "Playful Witch" + } tenabled -1 chance 100.0 note 1 @@ -10789,6 +12313,12 @@ mtanks smname "Annoying Smoker" spname "Annoying Spitter" } + mob + { + mobvariants -1 + commname "Annoying Common" + witchname "Annoying Witch" + } tenabled -1 chance 100.0 note 1 @@ -10821,13 +12351,2005 @@ mtanks { human 1 hammo 99999 - aenabled 1 + aenabled 2 message 1 amount 99999 chance 100.0 type 128-128 } } + #129 + { + general + { + name "Sipow Tank" + spec + { + spectypes -1 + note -1 + bname "Sipow Boomer" + cname "Sipow Charger" + hname "Sipow Hunter" + jname "Sipow Jockey" + smname "Sipow Smoker" + spname "Sipow Spitter" + } + mob + { + mobvariants -1 + commname "Sipow Common" + witchname "Sipow Witch" + } + tenabled -1 + chance 100.0 + note 1 + skin 50,125,255,255 + } + glow + { + genabled 1 + color 255,175,0 + } + human + { + human 1 + } + props + { + light 255,175,0,255 + oxygen 255,175,0,255 + flame 255,175,0,180 + rock 255,175,0,255 + tire 255,175,0,255 + propane 255,175,0,255 + flashlight 255,175,0,255 + crown 255,175,0,255 + } + particles + { + body 80 + rock 8 + } + health + { + extrahp 1000 + spec + { + bextrahp 100 + cextrahp 100 + hextrahp 100 + jextrahp 100 + smextrahp 100 + spextrahp 100 + } + } + enhance + { + throwint 10.0 + speed 1.33 + } + immune + { + explosive 1 + fire 1 + } + acid + { + human 1 + hammo 2 + aenabled 1 + effect 7 + message 5 + chance 33.3 + cooldown 3 + damage 3.0 + death 1 + deathchance 33.3 + deathrange 200.0 + hit 1 + hitmode 0 + range 150.0 + rangechance 15.0 + rock 1 + rockchance 33.3 + spec + { + cooldown 3 + damage 1.0 + } + } + meteor + { + human 1 + hammo 1 + hduration 5 + aenabled 1 + message 1 + chance 15.0 + duration 5 + interval 0.6 + lifetime 15.0 + mode 0 + radius -180.0,180.0 + } + } + #130 + { + general + { + name "Evil Tank" + spec + { + spectypes -1 + note -1 + bname "Evil Boomer" + cname "Evil Charger" + hname "Evil Hunter" + jname "Evil Jockey" + smname "Evil Smoker" + spname "Evil Spitter" + } + mob + { + mobvariants -1 + commname "Evil Common" + witchname "Evil Witch" + } + tenabled -1 + chance 100.0 + note 1 + skin 170,20,60,255 + } + glow + { + genabled 1 + color 0,0,140 + } + human + { + human 1 + } + props + { + attached 124 + light 0,0,140,255 + oxygen 0,0,140,255 + flame 0,0,140,180 + rock 0,0,140,255 + tire 0,0,140,255 + propane 0,0,140,255 + flashlight 0,0,140,255 + crown 0,0,140,255 + } + health + { + extrahp 1000 + spec + { + bextrahp 100 + cextrahp 100 + hextrahp 100 + jextrahp 100 + smextrahp 100 + spextrahp 100 + } + } + fire + { + effect 7 + message 1 + chance 100.0 + cooldown 3 + damage 0.5 + hit 1 + hitmode 0 + spec + { + cooldown 3 + damage 0.25 + } + } + ice + { + effect 7 + message 1 + chance 100.0 + cooldown 3 + hit 1 + hitmode 0 + spec + { + cooldown 3 + } + } + medic + { + human 1 + hammo 2 + hduration 6 + aenabled 1 + message 1 + chance 100.0 + duration 0 + field 1 + fieldcolor 0,255,0 + health 25,25,25,25,25,25,100 + interval 1.0 + maxhealth 250,50,250,100,325,600,10000 + range 500.0 + } + respawn + { + human 1 + hammo 2 + hduration 5 + aenabled 1 + message 1 + chance 100.0 + duration 0 + filter 0 + range 500.0 + } + } + #131 + { + general + { + name "Officer Tank" + spec + { + spectypes -1 + note -1 + bname "Officer Boomer" + cname "Officer Charger" + hname "Officer Hunter" + jname "Officer Jockey" + smname "Officer Smoker" + spname "Officer Spitter" + } + mob + { + mobvariants -1 + commname "Officer Common" + witchname "Officer Witch" + } + tenabled -1 + chance 100.0 + note 1 + skin 100,100,100,255 + } + glow + { + genabled 1 + color 100,100,100 + } + human + { + human 1 + } + spawn + { + openareas 150.0 + } + props + { + attached 242 //L4D1:194 + light 0,0,255,255 + rock 0,0,0,255 + tire 100,100,100,255 + propane 0,0,0,255 + flashlight 255,0,0,255 + } + health + { + extrahp 1000 + spec + { + bestrahp 100 + cextrahp 100 + hextrahp 100 + jextrahp 100 + smextrahp 100 + spextrahp 100 + } + } + drop + { + human 1 + aenabled 1 + message 1 + chance 100.0 + mode 2 + weaponboost 1.15 + weaponname tonfa + weaponres 0.85 + weaponscale 1.0 + } + gunner + { + human 1 + hammo 2 + aenabled 1 + message 1 + accuracy 2.0 + bullets 5 + chance 100.0 + clipsize 10 + damage 5.0 + duration 99999.0 + guntype 3 + interval 1.0 + loadtime 1.0 + range 500.0 + reactiontime 1.0 + targettype 7 + spec + { + clipsize 15 + damage 1.0 + guntype 1 + targettype 7 + } + } + minion + { + human 1 + hammo 2 + aenabled 1 + message 1 + amount 4 + chance 100.0 + filter 0 + lifetime 0.0 + remove 1 + replace 1 + type 131-131 + } + panic + { + spec + { + human 1 + hammo 2 + aenabled 2 + message 1 + amount 1 + chance 100.0 + duration 0 + interval 5.0 + mode 2 + type 64 + } + } + } + #132 + { + general + { + name "Mafia Tank" + spec + { + spectypes -1 + note -1 + bname "Mafia Boomer" + cname "Mafia Charger" + hname "Mafia Hunter" + jname "Mafia Jockey" + smname "Mafia Smoker" + spname "Mafia Spitter" + } + mob + { + mobvariants -1 + commname "Mafia Common" + witchname "Mafia Witch" + } + tenabled -1 + chance 100.0 + note 1 + skin 180,0,180,255 + } + glow + { + genabled 1 + color 180,0,180 + } + human + { + human 1 + } + spawn + { + openareas 500.0 + } + props + { + attached 0 + } + health + { + extrahp 1000 + spec + { + bestrahp 100 + cextrahp 100 + hextrahp 100 + jextrahp 100 + smextrahp 100 + spextrahp 100 + } + } + enhance + { + speed 2.5 + } + clone + { + human 1 + hammo 2 + aenabled 1 + message 1 + amount 2 + chance 100.0 + health 1500 + lifetime 0.0 + remove 0 + replace 1 + swap 0.0 + type 132-132 + spec + { + health 150 + } + } + smash + { + effect 7 + message 1 + body 1 + chance 33.0 + hit 1 + hitmode 1 + mode 1 + type 1 + spec + { + body 0 + meter 50.0 + } + } + } + #133 + { + general + { + name "Frankenstein Tank" + spec + { + spectypes -1 + note -1 + bname "Frankenstein Boomer" + cname "Frankenstein Charger" + hname "Frankenstein Hunter" + jname "Frankenstein Jockey" + smname "Frankenstein Smoker" + spname "Frankenstein Spitter" + } + mob + { + mobvariants -1 + commname "Frankenstein Common" + witchname "Frankenstein Witch" + } + tenabled -1 + chance 100.0 + note 1 + skin 85,125,75,255 + } + glow + { + genabled 1 + color 85,125,75 + } + human + { + human 1 + } + props + { + attached 16 //L4D1:0 + rock 100,100,100,255 + } + health + { + extrahp 1000 + spec + { + bestrahp 100 + cextrahp 100 + hextrahp 100 + jextrahp 100 + smextrahp 100 + spextrahp 100 + } + } + enhance + { + claw 1.0 + hittable 1.0 + rockdmg 1.0 + speed 0.65 + } + ghost + { + effect 7 + message 1 + hit 1 + hitmode 0 + slots 28 + } + jump + { + aenabled 2 + message 4 + mode 1 + sporadicchance 33.3 + sporadicheight 750.0 + } + undead + { + human 1 + hammo 2 + aenabled 1 + message 1 + amount 2 + chance 100.0 + } + warp + { + aenabled 2 + message 4 + interval 10.0 + } + } + #134 + { + general + { + name "Prototype Tank" + spec + { + spectypes -1 + note -1 + bname "Prototype Boomer" + cname "Prototype Charger" + hname "Prototype Hunter" + jname "Prototype Jockey" + smname "Prototype Smoker" + spname "Prototype Spitter" + } + mob + { + mobvariants -1 + commname "Prototype Common" + witchname "Prototype Witch" + } + tenabled -1 + chance 100.0 + note 1 + skin 75,75,75,255 + } + glow + { + genabled 1 + color 255,25,55 + } + human + { + human 1 + } + props + { + attached 18 //L4D1:2 + light 255,25,55,255 + rock 255,25,55,255 + } + health + { + extrahp 1000 + spec + { + bestrahp 100 + cextrahp 100 + hextrahp 100 + jextrahp 100 + smextrahp 100 + spextrahp 100 + } + } + absorb + { + human 1 + hammo 2 + hduration 99999 + aenabled 1 + message 1 + bullet 20.0 + chance 100.0 + duration 99999 + explosive 20.0 + fire 200.0 + hittable 20.0 + melee 200.0 + } + smash + { + effect 7 + message 1 + body 1 + chance 33.3 + hit 1 + hitmode 0 + mode 1 + remove 1 + type 1 + spec + { + body 0 + meter 50.0 + } + } + omni + { + hrequire 0 + human 1 + hammo 3 + hduration 5 + aenabled 1 + message 1 + chance 33.3 + duration 5 + mode 0 + range 500.0 + } + respawn + { + human 1 + hammo 1 + aenabled 2 + message 1 + amount 2 + chance 100.0 + type 134-134 + } + } + #135 + { + general + { + name "Zeus Tank" + spec + { + spectypes -1 + note -1 + bname "Zeus Boomer" + cname "Zeus Charger" + hname "Zeus Hunter" + jname "Zeus Jockey" + smname "Zeus Smoker" + spname "Zeus Spitter" + } + mob + { + mobvariants -1 + commname "Zeus Common" + witchname "Zeus Witch" + } + tenabled -1 + chance 100.0 + note 1 + skin 175,40,255,255 + } + glow + { + genabled 1 + color 0,100,155 + } + human + { + human 1 + } + spawn + { + openareas 500.0 + } + props + { + attached 272 //L4D1:224 + rock 0,100,155,255 + crown 0,100,155,255 + } + particles + { + body 2 + rock 2 + } + health + { + extrahp 1000 + spec + { + bestrahp 100 + cextrahp 100 + hextrahp 100 + jextrahp 100 + smextrahp 100 + spextrahp 100 + } + } + immune + { + fire 1 + } + electric + { + human 1 + hammo 2 + aenabled 1 + effect 7 + message 7 + chance 66.6 + damage 5.0 + duration 5 + hit 1 + hitmode 0 + interval 1.0 + range 150.0 + rangechance 30.0 + } + lightning + { + aenabled 1 + message 1 + chance 100.0 + damage 5 + duration 99999 + interval 0.5 + } + smash + { + effect 7 + message 1 + body 1 + chance 15.0 + hit 1 + hitmode 1 + mode 4 + type 1 + spec + { + body 0 + meter 50.0 + } + } + warp + { + aenabled 2 + message 4 + interval 7.5 + } + } + #136 + { + general + { + name "Trajectory Tank" + spec + { + spectypes -1 + note -1 + bname "Trajectory Boomer" + cname "Trajectory Charger" + hname "Trajectory Hunter" + jname "Trajectory Jockey" + smname "Trajectory Smoker" + spname "Trajectory Spitter" + } + mob + { + mobvariants -1 + commname "Trajectory Common" + witchname "Trajectory Witch" + } + tenabled -1 + chance 100.0 + note 1 + skin 255,150,75,255 + } + glow + { + genabled 1 + color 55,150,125 + } + human + { + human 1 + } + props + { + light 55,150,125,255 + oxygen 55,150,125,255 + flame 55,150,125,180 + rock 55,150,125,255 + tire 55,150,125,255 + propane 55,150,125,255 + flashlight 55,150,125,255 + crown 55,150,125,255 + } + health + { + extrahp 1000 + spec + { + bestrahp 100 + cextrahp 100 + hextrahp 100 + jextrahp 100 + smextrahp 100 + spextrahp 100 + } + } + fast + { + human 1 + hammo 2 + hduration 99999 + aenabled 1 + message 1 + chance 100.0 + duration 99999 + speed 5.0 + } + jump + { + human 1 + hammo 2 + hduration 5 + aenabled 3 + effect 7 + message 7 + chance 33.3 + duration 5 + height 300.0 + hit 1 + hitmode 0 + mode 1 + range 150.0 + rangechance 15.0 + sporadicchance 33.3 + sporadicheight 750.0 + } + warp + { + human 1 + hammo 2 + hduration 10 + aenabled 2 + message 4 + duration 0 + interval 7.5 + } + } + #137 + { + general + { + name "Barrage Tank" + spec + { + spectypes -1 + note -1 + bname "Barrage Boomer" + cname "Barrage Charger" + hname "Barrage Hunter" + jname "Barrage Jockey" + smname "Barrage Smoker" + spname "Barrage Spitter" + } + mob + { + mobvariants -1 + commname "Barrage Common" + witchname "Barrage Witch" + } + tenabled -1 + chance 100.0 + note 1 + skin 150,80,125,255 + } + glow + { + genabled 1 + color 40,80,165 + } + human + { + human 1 + } + spawn + { + openareas 500.0 + } + props + { + light 40,80,165,255 + oxygen 40,80,165,255 + flame 40,80,165,180 + rock 40,80,165,255 + tire 40,80,165,255 + propane 40,80,165,255 + flashlight 40,80,165,255 + crown 40,80,165,255 + } + health + { + extrahp 1000 + spec + { + bestrahp 100 + cextrahp 100 + hextrahp 100 + jextrahp 100 + smextrahp 100 + spextrahp 100 + } + } + meteor + { + human 1 + hammo 1 + HumanCooldown 0 + aenabled 1 + message 1 + chance 100.0 + duration 99999 + interval 0.6 + lifetime 15.0 + mode 1 + radius -180.0,180.0 + } + regen + { + human 1 + hammo 2 + hduration 99999 + aenabled 1 + effect 4 + message 1 + chance 100.0 + duration 0 + health 200 + interval 1.0 + limit 4000 + range 500.0 + spec + { + health 20 + limit 400 + range 150.0 + } + } + rock + { + hrequire 0 + human 1 + hammo 2 + hduration 99999 + aenabled 1 + message 1 + chance 100.0 + damage 5 + duration 99999 + interval 0.75 + mode 0 + radius -5.0,5.0 + } + shove + { + effect 7 + message 1 + chance 66.6 + duration 5 + hit 1 + hitmode 1 + interval 1.0 + } + } + #138 + { + general + { + name "Collector Tank" + spec + { + spectypes -1 + note -1 + bname "Collector Boomer" + cname "Collector Charger" + hname "Collector Hunter" + jname "Collector Jockey" + smname "Collector Smoker" + spname "Collector Spitter" + } + mob + { + mobvariants -1 + commname "Collector Common" + witchname "Collector Witch" + } + tenabled -1 + chance 100.0 + note 1 + skin 255,70,165,255 + } + glow + { + genabled 1 + color 255,70,165 + } + human + { + human 1 + } + spawn + { + openareas 500.0 + } + props + { + attached 0 + } + health + { + extrahp 1000 + spec + { + bestrahp 100 + cextrahp 100 + hextrahp 100 + jextrahp 100 + smextrahp 100 + spextrahp 100 + } + } + choke + { + effect 7 + message 1 + block 1 + chance 100.0 + damage 1.0 + delay 1.0 + duration 99999 + hit 1 + hitmode 1 + } + gravity + { + aenabled 2 + message 4 + flags 8 + force -50.0 + } + } + #139 + { + general + { + name "Timewalker Tank" + spec + { + spectypes -1 + note -1 + bname "Timewalker Boomer" + cname "Timewalker Charger" + hname "Timewalker Hunter" + jname "Timewalker Jockey" + smname "Timewalker Smoker" + spname "Timewalker Spitter" + } + mob + { + mobvariants -1 + commname "Timewalker Common" + witchname "Timewalker Witch" + } + tenabled -1 + chance 100.0 + note 1 + skin 0,200,255,255 + } + glow + { + genabled 1 + color 0,200,255 + } + human + { + human 1 + } + props + { + attached 0 + } + health + { + extrahp 1000 + spec + { + bestrahp 100 + cextrahp 100 + hextrahp 100 + jextrahp 100 + smextrahp 100 + spextrahp 100 + } + } + clone + { + human 1 + hammo 2 + aenabled 1 + message 1 + amount 2 + chance 100.0 + health 1000 + lifetime 10.0 + remove 0 + replace 1 + swap 5.0 + type 139-139 + spec + { + health 100 + } + } + fast + { + human 1 + hammo 2 + hduration 3 + aenabled 1 + message 1 + chance 33.3 + duration 3 + speed 10.0 + } + ghost + { + effect 7 + message 1 + chance 15.0 + hit 1 + hitmode 0 + slots 28 + } + recall + { + human 1 + hammo 5 + aenabled 3 + message 1 + blinkchance 0.0 + blinkcount 0 + rewindchance 100.0 + rewindcleanse 1 + rewindcooldown 5 + rewindlifetime 10 + rewindmode 0 + rewindthreshold 1.0 + } + undead + { + human 1 + hammo 2 + aenabled 1 + message 1 + amount 2 + chance 100.0 + } + warp + { + aenabled 2 + message 4 + interval 10.0 + } + } + #140 + { + general + { + name "Speed Demon Tank" + spec + { + spectypes -1 + note -1 + bname "Speed Demon Boomer" + cname "Speed Demon Charger" + hname "Speed Demon Hunter" + jname "Speed Demon Jockey" + smname "Speed Demon Smoker" + spname "Speed Demon Spitter" + } + mob + { + mobvariants -1 + commname "Speed Demon Common" + witchname "Speed Demon Witch" + } + tenabled -1 + chance 100.0 + note 1 + skin 100,0,0,255 + } + glow + { + genabled 1 + color 255,200,60 + } + human + { + human 1 + } + props + { + light 255,200,60,255 + oxygen 255,200,60,255 + flame 255,200,60,180 + rock 255,200,60,255 + tire 255,200,60,255 + propane 255,200,60,255 + flashlight 255,200,60,255 + crown 255,200,60,255 + } + particles + { + body 4 + rock 4 + } + health + { + extrahp 1000 + spec + { + bestrahp 100 + cextrahp 100 + hextrahp 100 + jextrahp 100 + smextrahp 100 + spextrahp 100 + } + } + enhance + { + speed 1.0 + } + fast + { + human 1 + hammo 2 + hduration 3 + aenabled 1 + message 1 + chance 33.3 + duration 3 + speed 10.0 + } + fire + { + effect 7 + message 1 + chance 100.0 + cooldown 3 + damage 0.5 + hit 1 + hitmode 0 + spec + { + cooldown 3 + damage 0.25 + } + } + pyro + { + human 1 + hammo 2 + hduration 3 + aenabled 1 + message 1 + chance 33.3 + dmgboost 2.0 + duration 3 + fire 1.0 + mode 0 + reignite 1 + speedboost 9.0 + spec + { + fire 400.0 + } + } + slow + { + aenabled 1 + effect 7 + message 2 + chance 100.0 + duration 99999.0 + range 500.0 + rangechance 100.0 + speed 0.65 + } + } + #141 + { + general + { + name "Ravager Tank" + spec + { + spectypes -1 + note -1 + bname "Ravager Boomer" + cname "Ravager Charger" + hname "Ravager Hunter" + jname "Ravager Jockey" + smname "Ravager Smoker" + spname "Ravager Spitter" + } + mob + { + mobvariants -1 + commname "Ravager Common" + witchname "Ravager Witch" + } + tenabled -1 + chance 100.0 + note 1 + skin 240,20,60,255 + } + glow + { + genabled 1 + color 75,100,90 + } + human + { + human 1 + } + spawn + { + openareas 500.0 + } + props + { + light 75,100,90,255 + oxygen 75,100,90,255 + flame 75,100,90,180 + rock 75,100,90,255 + tire 75,100,90,255 + propane 75,100,90,255 + flashlight 75,100,90,255 + crown 75,100,90,255 + } + health + { + extrahp 1000 + spec + { + bestrahp 100 + cextrahp 100 + hextrahp 100 + jextrahp 100 + smextrahp 100 + spextrahp 100 + } + } + bomb + { + human 1 + message 4 + rock 1 + rockchance 100.0 + } + rock + { + hrequire 0 + human 1 + hammo 2 + hduration 99999 + aenabled 1 + message 1 + chance 100.0 + damage 5 + duration 99999 + interval 1.5 + mode 0 + radius -5.0,5.0 + } + } + #142 + { + general + { + name "Ramattra Tank" + spec + { + spectypes -1 + note -1 + bname "Ramattra Boomer" + cname "Ramattra Charger" + hname "Ramattra Hunter" + jname "Ramattra Jockey" + smname "Ramattra Smoker" + spname "Ramattra Spitter" + } + mob + { + mobvariants -1 + commname "Ramattra Common" + witchname "Ramattra Witch" + } + tenabled -1 + chance 100.0 + note 1 + skin 35,35,35,255 + } + glow + { + genabled 1 + color 160,80,255 + } + human + { + human 1 + } + props + { + attached 380 + light 160,80,255,255 + oxygen 185,180,135,255 + flame 160,80,255,180 + rock 185,180,135,255 + tire 185,180,135,255 + propane 255,255,255,255 + flashlight 160,80,255,255 + crown 160,80,255,255 + } + health + { + extrahp 1000 + spec + { + bextrahp 100 + cextrahp 100 + hextrahp 100 + jextrahp 100 + smextrahp 100 + spextrahp 100 + } + } + absorb + { + hrequire 0 + human 1 + hammo 2 + hduration 5 + aenabled 1 + message 1 + bullet 20.0 + chance 15.0 + convertpercent 0.0 + duration 10 + explosive 20.0 + fire 200.0 + hittable 20.0 + melee 200.0 + } + regen + { + human 1 + hammo 2 + hduration 5 + aenabled 1 + effect 4 + message 1 + sight 1 + chance 100.0 + duration 0 + health 1 + interval 1.0 + limit 1000000 + range 500.0 + spec + { + limit 100000 + range 150.0 + } + } + shield + { + hrequire 0 + human 1 + aenabled 1 + message 1 + chance 15.0 + convertpercent 0.2 + color 160,80,255,50 + delay 10 + displayhp 11 + displaytype 2 + duration 0 + health 250.0 + hpchars ],= + type 15 + spec + { + health 100.0 + } + } + slow + { + aenabled 1 + effect 7 + message 2 + sight 1 + chance 100.0 + duration 99999.0 + range 500.0 + rangechance 100.0 + speed 0.4 + } + } + #143 + { + general + { + name "Sigma Tank" + spec + { + spectypes -1 + note -1 + bname "Sigma Boomer" + cname "Sigma Charger" + hname "Sigma Hunter" + jname "Sigma Jockey" + smname "Sigma Smoker" + spname "Sigma Spitter" + } + mob + { + mobvariants -1 + commname "Sigma Common" + witchname "Sigma Witch" + } + tenabled -1 + chance 100.0 + note 1 + skin 80,80,80,255 + } + glow + { + genabled 1 + color 130,130,180 + } + human + { + human 1 + } + props + { + attached 124 + light 130,130,180,255 + oxygen 65,200,170,255 + flame 130,130,180,180 + rock 65,200,170,255 + tire 65,200,170,255 + propane 60,0,110,255 + flashlight 130,130,180,255 + crown 130,130,180,255 + } + health + { + extrahp 1000 + spec + { + bextrahp 100 + cextrahp 100 + hextrahp 100 + jextrahp 100 + smextrahp 100 + spextrahp 100 + } + } + absorb + { + hrequire 0 + human 1 + hammo 2 + hduration 5 + aenabled 1 + message 1 + bullet 20.0 + chance 15.0 + convertpercent 0.75 + duration 10 + explosive 20.0 + fire 200.0 + hittable 20.0 + melee 200.0 + } + choke + { + human 1 + hammo 2 + aenabled 1 + effect 7 + message 3 + sight 1 + block 0 + chance 33.3 + damage 10.0 + delay 0.5 + duration 3 + hit 1 + hitmode 0 + range 150.0 + rangechance 15.0 + } + gravity + { + human 1 + aenabled 2 + message 4 + flags 8 + force -25.0 + } + shield + { + hrequire 0 + human 1 + aenabled 1 + message 1 + chance 15.0 + convertpercent 0.15 + color 130,130,180,50 + delay 10 + displayhp 11 + displaytype 2 + duration 0 + health 700.0 + hpchars ],= + type 15 + spec + { + health 70.0 + } + } + } + #144 + { + general + { + name "Zarya Tank" + spec + { + spectypes -1 + note -1 + bname "Zarya Boomer" + cname "Zarya Charger" + hname "Zarya Hunter" + jname "Zarya Jockey" + smname "Zarya Smoker" + spname "Zarya Spitter" + } + mob + { + mobvariants -1 + commname "Zarya Common" + witchname "Zarya Witch" + } + tenabled -1 + chance 100.0 + note 1 + skin 55,110,255,255 + } + glow + { + genabled 1 + color 255,130,255 + } + human + { + human 1 + } + props + { + attached 0 + } + health + { + extrahp 1000 + spec + { + bestrahp 100 + cextrahp 100 + hextrahp 100 + jextrahp 100 + smextrahp 100 + spextrahp 100 + } + } + enhance + { + speed 0.65 + } + absorb + { + hrequire 0 + human 1 + hammo 2 + hduration 5 + aenabled 1 + message 1 + bullet 20.0 + chance 15.0 + convertpercent 0.75 + duration 10 + explosive 20.0 + fire 200.0 + hittable 20.0 + melee 200.0 + } + gravity + { + human 1 + aenabled 2 + message 4 + flags 8 + force -25.0 + } + shield + { + hrequire 0 + human 1 + aenabled 1 + message 1 + chance 15.0 + convertpercent 0.15 + color 255,130,255,50 + delay 15 + displayhp 11 + displaytype 2 + duration 5 + health 225.0 + hpchars ],= + type 15 + spec + { + health 22.5 + } + } + } + //Thefollowingsamplesareforpunishingrushers/slackers. + #145 + { + general + { + name "Slacker Tank" + spec + { + spectypes -1 + note -1 + bname "Slacker Boomer" + cname "Slacker Charger" + hname "Slacker Hunter" + jname "Slacker Jockey" + smname "Slacker Smoker" + spname "Slacker Spitter" + } + mob + { + mobvariants -1 + commname "Slacker Common" + witchname "Slacker Witch" + } + tenabled -1 + chance 100.0 + note 0 + skin 100,100,100,255 + spawn 0 + } + announce + { + arrival 0 + death 0 + kill 0 + arrivalmsg 0 + arrivalsnd 0 + arrivalvoc 0 + deathdets 0 + deathmsg 0 + deathsnd 0 + deathvoc 0 + killmsg 0 + } + props + { + attached 0 + } + health + { + basehp 1000000 + displayhp 0 + displaytype 0 + spec + { + bbasehp 100000 + cbasehp 100000 + hbasehp 100000 + jbasehp 100000 + smbasehp 100000 + spbasehp 100000 + } + } + enhance + { + attackint 0.1 + intangible 1 + punchthrow 0.0 + taunt 1 + } + fast + { + human 2 + hammo 2 + hduration 99999 + aenabled 1 + message 0 + chance 100.0 + dash 5.0 + dashchance 50.0 + dashrange 150.0 + duration 99999 + speed 10.0 + } + gravity + { + aenabled 2 + message 0 + flags 8 + force -100.0 + } + warp + { + human 2 + effect 7 + message 0 + chance 100.0 + hit 1 + hitmode 1 + } + } + #146 + { + general + { + name "Rusher Tank" + spec + { + spectypes -1 + note -1 + bname "Rusher Boomer" + cname "Rusher Charger" + hname "Rusher Hunter" + jname "Rusher Jockey" + smname "Rusher Smoker" + spname "Rusher Spitter" + } + mob + { + mobvariants -1 + commname "Rusher Common" + witchname "Rusher Witch" + } + tenabled -1 + chance 100.0 + note 0 + skin 150,0,0,255 + spawn 0 + } + announce + { + arrival 0 + death 0 + kill 0 + arrivalmsg 0 + arrivalsnd 0 + arrivalvoc 0 + deathdets 0 + deathmsg 0 + deathsnd 0 + deathvoc 0 + killmsg 0 + } + props + { + attached 0 + } + health + { + basehp 1000000 + displayhp 0 + displaytype 0 + spec + { + bbasehp 100000 + cbasehp 100000 + hbasehp 100000 + jbasehp 100000 + smbasehp 100000 + spbasehp 100000 + } + } + enhance + { + attack 0.1 + intangible 1 + punchthrow 0.0 + taunt 1 + } + fast + { + human 2 + hammo 2 + hduration 99999 + aenabled 1 + message 0 + chance 100.0 + dash 5.0 + dashchance 50.0 + dashrange 150.0 + duration 99999 + speed 10.0 + } + gravity + { + aenabled 2 + message 0 + flags 8 + force -100.0 + } + fire + { + human 2 + effect 7 + message 0 + chance 100.0 + hit 1 + hitmode 1 + } + ice + { + human 2 + effect 7 + message 0 + chance 100.0 + duration 5.0 + hit 1 + hitmode 1 + } + } /** * Create your own Mutant Tanks below! * Start your imagination here! diff --git a/addons/sourcemod/data/mutant_tanks/backup_config/format5/mutant_tanks.cfg b/addons/sourcemod/data/mutant_tanks/backup_config/format5/mutant_tanks.cfg index 2ee4f7a9ce..aad38a4f23 100644 --- a/addons/sourcemod/data/mutant_tanks/backup_config/format5/mutant_tanks.cfg +++ b/addons/sourcemod/data/mutant_tanks/backup_config/format5/mutant_tanks.cfg @@ -21,6 +21,7 @@ mt { penabled yes update on + graphics max bfix max kick min listen enabled @@ -38,11 +39,29 @@ mt cycle min spawn max limit min - types 1-128 + types 1-146 spec { spectypes min } + mob + { + mobvariants min + commbiochance 50.0 + commchance 100.0 + commcheck 300.0 + commdmgpoints 50.0 + commdeathpoints 100.0 + commfilter 0 + commgoal 5000.0 + commvariant 0 + witchchance 100.0 + witchfilter 0 + witchmode 0 + witchmutatechance 100.0 + witchrange 500.0 + witchtypes 0 + } } announce { @@ -64,6 +83,22 @@ mt kill min } } + punish + { + puenabled -1,-1 //145,146 + pubots -1,-1 //145,146 + fincheck 0 + ptypes 127,127 + lifetime 5.0,5.0 + warndist 500.0,1000.0 + pudist 1000.0,2000.0 + warnlimit 3,3 + warnint 5,5 + stypes 1 + survivors 3 + incaps 2 + zedtime 1.0,1.0 + } rewards { renabled -1,-1,-1,-1 @@ -78,50 +113,69 @@ mt share 0,0,0,0 teamlimit 0 actionduration 2.0,2.0,2.0,2.0 + adrenaline 30.0,30.0,30.0,30.0 ammoboost 1,1,1,1 + ammorefill 1,1,1,1 ammoregen 1,1,1,1 attackboost 1.25,1.25,1.25,1.25 bhop 1,1,1,1 blaze 1,1,1,1 + donor 0,0,0,0 burstdoors 1,1,1,1 cleankills 1,1,1,1 cluster 3,3,3,3 dmgboost 1.25,1.25,1.25,1.25 dmgres 0.5,0.5,0.5,0.5 + dopamine 150.0,150.0,150.0,150.0 + eternal 1,1,1,1 fallvoice PlayerLaugh,PlayerLaugh,PlayerLaugh,PlayerLaugh + fastrecovery 1,1,1,1 + firerate 1.25,1.25,1.25,1.25 friendlyfire 1,1,1,1 ghost 1,1,1,1 + grenade 10.0,10.0,10.0,10.0 healpercent 100.0,100.0,100.0,100.0 + healthcare 150.0,150.0,150.0,150.0 hpregen 1,1,1,1 - hollowpoint 1,1,1,1 - inexfire 1,1,1,1 + heartbeat 3.0,3.0,3.0,3.0 + hollowpoint 100.0,100.0,100.0,100.0 infammo 31,31,31,31 item first_aid_kit,first_aid_kit,first_aid_kit,first_aid_kit jumpheight 75.0,75.0,75.0,75.0 - ladderactions 1,1,1,1 - ladykiller 1,1,1,1 + ladderacts 1,1,1,1 + ladykiller 25.0,25.0,25.0,25.0 lasersight 1,1,1,1 lifeleech 1,1,1,1 + luckybullet 25.0,25.0,25.0,25.0 medcuts 1,1,1,1 meleerange 150,150,150,150 - midairdashes 2,2,2,2 + middash 2,2,2,2 + motivation 150.0,150.0,150.0,150.0 + overdose 150.0,150.0,150.0,150.0 + overhealth 200,200,200,200 pipeduration 10.0,10.0,10.0,10.0 punchres 0.25,0.25,0.25,0.25 - rapid 0.130,0.130,0.130,0.130 + rapidpistol 0.130,0.130,0.130,0.130 recoil 1,1,1,1 refillpercent 100.0,100.0,100.0,100.0 - regburst 1,1,1,1 + regbursts 1,1,1,1 + reloadrate 1.25,1.25,1.25,1.25 resloadout 1,1,1,1 revivehp 100,100,100,100 + riotgear 1,1,1,1 + safetybubble 1,1,1,1 + shockwave 150.0,150.0,150.0,150.0 shovedmg 0.025,0.025,0.025,0.025 shovepenalty 1,1,1,1 shoverate 0.7,0.7,0.7,0.7 - sledgehammer 1,1,1,1 - specialammo 3,3,3,3 + sledgehammer 100.0,100.0,100.0,100.0 + specammo 3,3,3,3 speedboost 1.25,1.25,1.25 limits 0,0,0,0,0,0,0 - stack 0,0,0,0 + rstack 0,0,0,0 sticky 1,1,1,1 + supplier 3.0,3.0,3.0,3.0 + swingrate 1.25,1.25,1.25,1.25 syringe 1,1,1,1 thorns 1,1,1,1 useful 15,15,15,15 @@ -139,6 +193,533 @@ mt bots -1,-1,-1,-1 } } + survivors + { + caenabled 0 + cabots 0 + cabody 0 + cachance 0.0 + cacleanse 0 + cadmgmulti 0.0 + cadelay 0.0 + cafilter 0 + cahpmulti 0.0 + cainfect 0 + camix 0 + camode 0 + cateleport 0 + catype 0 + cavoice 0 + cavoicechance 0.0 + cavoiceint 0.0 + caattacklines "" + cabaitlines "" + psnabled -1 + psbots -1 + psnotify 0 + actionduration 0.0 + adrenaline 0.0 + ammoboost 0 + ammorefill 0 + ammoregen 0 + attackboost 0.0 + bhop 0 + blaze 0 + donor 0 + burstdoors 0 + cleankills 0 + cluster 0 + dmgboost 0.0 + dmgres 0.0 + dopamine 0.0 + eternal 0 + fastrecovery 0 + firerate 0.0 + friendlyfire 0 + ghost 0 + grenade 0.0 + healpercent 0.0 + healthcare 0.0 + hpregen 0 + heartbeat 0.0 + hollowpoint 0.0 + infammo 0 + item "" + jumpheight 0.0 + ladderacts 0 + ladykiller 0.0 + lasersight 0 + lifeleech 0 + luckybullet 0.0 + medcuts 0 + meleerange 0 + middash 0 + motivation 0.0 + overdose 0.0 + overhealth 0 + pipeduration 0.0 + punchres 0.0 + rapidpistol 0.0 + recoil 0 + refillpercent 0.0 + regbursts 0 + reloadrate 0.0 + resloadout 0 + revivehp 0 + riotgear 0 + safetybubble 0 + shockwave 0.0 + shovedmg 0.0 + shovepenalty 0 + shoverate 0.0 + sledgehammer 0.0 + specammo 0 + speedboost 0.0 + sticky 0 + supplier 0.0 + swingrate 0.0 + syringe 0 + thorns 0 + weapon_pistol // Fire faster and no shove fatigue while pistol is being held + { + weaponid 1 + psenabled -1 //9 + psbots -1 //9 + psstack 0 + donor 2 + rapidpistol 0.130 + shovepenalty 1 + syringe 1 + } + weapon_pistol_magnum // Fire faster and no shove fatigue while magnum pistol is being held + { + weaponid 2 + psenabled -1 //12 + psbots -1 //12 + psstack 0 + ghost 1 + hollowpoint 100.0 + rapidpistol 0.130 + shovepenalty 1 + sledgehammer 0.5 + } + weapon_smg // Shoot grenades and perform ladder actions while uzi is being held + { + weaponid 3 + psenabled -1 //26 + psbots -1 //26 + psstack 0 + grenade 25.0 + ladderacts 1 + middash 1 + } + weapon_smg_silenced // Shoot grenades and perform ladder actions while silenced uzi is being held + { + weaponid 4 + psenabled -1 //26 + psbots -1 //26 + psstack 0 + grenade 25.0 + ladderacts 1 + jumpheight 65.0 + } + weapon_smg_mp5 // Shoot grenades and perform ladder actions while mp5 uzi is being held + { + weaponid 5 + psenabled -1 //26 + psbots -1 //26 + psstack 0 + grenade 25.0 + ladderacts 1 + speedboost 1.125 + } + weapon_rifle // Remove recoil and deal more damage while m16 rifle is being held + { + weaponid 6 + psenabled -1 //20 + psbots -1 //20 + psstack 0 + dmgboost 1.2 + grenade 25.0 + recoil 1 + } + weapon_rifle_ak47 // Remove recoil and deal more damage while ak47 rifle is being held + { + weaponid 7 + psenabled -1 //4 + psbots -1 //4 + psstack 0 + dmgboost 1.1 + lasersight 1 + recoil 1 + } + weapon_rifle_desert // Remove recoil and deal more damage while scar-l rifle is being held + { + weaponid 8 + psenabled -1 //20 + psbots -1 //20 + psstack 0 + dmgboost 1.125 + recoil 1 + specammo 3 + } + weapon_rifle_sg552 // Remove recoil and deal more damage while sg552 rifle is being held + { + weaponid 9 + psenabled -1 //20 + psbots -1 //20 + psstack 0 + dmgboost 1.15 + luckybullet 33.3 + recoil 1 + } + weapon_pumpshotgun // Reload faster and knock back zombies while pump shotgun is being held + { + weaponid 10 + psenabled -1 //12 + psbots -1 //12 + psstack 0 + reloadrate 1.6 + shovepenalty 1 + sledgehammer 1.0 + } + weapon_shotgun_chrome // Reload faster and knock back zombies while chrome shotgun is being held + { + weaponid 11 + psenabled -1 //12 + psbots -1 //12 + psstack 0 + reloadrate 1.6 + shovedmg 0.025 + sledgehammer 1.0 + } + weapon_autoshotgun // Reload faster and knock back zombies while auto shotgun is being held + { + weaponid 12 + psenabled -1 //28 + psbots -1 //28 + psstack 0 + grenade 10.0 + reloadrate 1.6 + sledgehammer 1.0 + } + weapon_shotgun_spas // Reload faster and knock back zombies while spas shotgun is being held + { + weaponid 13 + psenabled -1 //12 + psbots -1 //12 + psstack 0 + ladykiller 50.0 + reloadrate 1.6 + sledgehammer 1.0 + } + weapon_hunting_rifle // Shoot through walls and shoot stronger bullets while hunting rifle is being held + { + weaponid 14 + psenabled -1 //20 + psbots -1 //20 + psstack 0 + ghost 1 + grenade 10.0 + hollowpoint 100.0 + } + weapon_sniper_military // Shoot through walls and shoot stronger bullets while military rifle is being held + { + weaponid 15 + psenabled -1 //68 + psbots -1 //68 + psstack 0 + cleankills 1 + ghost 1 + hollowpoint 100.0 + } + weapon_sniper_awp // Shoot through walls and shoot stronger bullets while awp rifle is being held + { + weaponid 16 + psenabled -1 //4 + psbots -1 //4 + psstack 0 + dmgboost 2.0 + ghost 1 + hollowpoint 100.0 + } + weapon_sniper_scout // Shoot through walls and shoot stronger bullets while steyr scout rifle is being held + { + weaponid 17 + psenabled -1 //12 + psbots -1 //12 + psstack 0 + ghost 1 + hollowpoint 100.0 + reloadrate 1.3 + } + weapon_rifle_m60 // Refill nearby teammates' ammo periodically while dealing damage with the m60 rifle + { + weaponid 18 + psenabled -1 //16 + psbots -1 //16 + psstack 0 + supplier 3.0 + } + weapon_grenade_launcher // Heal teammates with explosions while grenade launcher is being held + { + weaponid 19 + psenabled -1 //1 + psbots -1 //1 + psstack 0 + donor 4 + regbursts 2 + } + weapon_first_aid_kit // Take less damage while the medkit is being held and trigger a healing AoE when used + { + weaponid 20 + psenabled -1 //5 + psbots -1 //5 + psstack 0 + dmgres 0.95 + healthcare 250.0 + } + weapon_defibrillator // Take less damage while the defibrillator is being held and trigger a revive AoE when used + { + weaponid 21 + psenabled -1 //5 + psbots -1 //5 + psstack 0 + dmgres 0.95 + shockwave 1000.0 + } + weapon_pain_pills // Take less damage while the pain pills bottle is being held and trigger a healing AoE when used + { + weaponid 22 + psenabled -1 //5 + psbots -1 //5 + psstack 0 + dmgres 0.95 + overdose 250.0 + } + weapon_adrenaline // Take less damage while the adrenaline shot is being held and trigger an energy boost AoE when used + { + weaponid 23 + psenabled -1 //5 + psbots -1 //5 + psstack 0 + dmgres 0.95 + dopamine 250.0 + } + weapon_melee // Auto-bhop while knife is being held + { + weaponid 24 + weaponname knife + psenabled -1 //2 + psbots -1 //2 + psstack 0 + bhop 1 + } + weapon_melee // Berserker blunt weapons - High damage, low uptime, revive radius, damage resistance, and heal nearby teammates periodically while dealing damage + { + weaponid 25 + weaponname baseball_bat,cricket_bat,tonfa,shovel,electric_guitar,frying_pan,golfclub + psenabled -1 //15 + psbots -1 //15 + psstack 0 + dmgboost 1.45 + dmgres 0.9 + heartbeat 3.0 + meleerange 100 + motivation 250.0 + speedboost 0.875 + swingrate 0.65 + } + weapon_melee // Berserker sharp weapons - Low damage, high uptime, revive radius, leech health from zombies, and heal teammates by damaging them + { + weaponid 26 + weaponname crowbar,machete,katana,knife,fireaxe,pitchfork + psenabled -1 //15 + psbots -1 //15 + psstack 0 + dmgboost 0.65 + lifeleech 1 + medcuts 2 + meleerange 100 + motivation 250.0 + swingrate 1.45 + speedboost 1.125 + } + bill // General - Medium-high survivability, high mobility, medium-low damage, high uptime + { + cafilter 2 + caattacklines "namvet/laughter04.wav,namvet/laughter11.wav,namvet/cough06.wav,namvet/doubledeathresponse01.wav,namvet/doubledeathresponse02.wav,namvet/help11.wav,namvet/friendlyfire04.wav" + cabaitlines "namvet/callforrescue01.wav,namvet/callforrescue05.wav,namvet/callforrescue10.wav" + psenabled -1 //31 + psbots -1 //31 + psnotify 0 + donor 1 + bhop 1 + dmgboost 0.95 + dmgres 0.95 + eternal 1 + ladderacts 1 + overhealth 110 + pipeduration 6.5 + rapidpistol 0.130 + recoil 1 + revivehp 50 + specammo 0 + speedboost 1.1 + } + zoey // Damage - Medium-low survivability, medium mobility, medium-high damage, medium uptime + { + cafilter 20 + caattacklines "teengirl/laughter02.wav,teengirl/laughter06.wav,teengirl/hurtminor01.wav,teengirl/help04.wav" + cabaitlines "teengirl/callforrescue01.wav,teengirl/callforrescue02.wav,teengirl/callforrescue06.wav,teengirl/callforrescue07.wav,teengirl/callforrescue14.wav,teengirl/callforrescue16.wav" + psenabled -1 //7 + psbots -1 //7 + psnotify 0 + donor 1 + dmgboost 1.25 + dmgres 1.15 + ghost 1 + healpercent 75.0 + hollowpoint 100.0 + overhealth 115 + revivehp 40 + speedboost 1.1 + } + francis // Tank - Medium-high survivability, low mobility, medium-low damage, low uptime + { + cafilter 65 + caattacklines "biker/goingtodie03.wav,biker/goingtodie12.wav,biker/goingtodieaskforheal02.wav,biker/grabbedbysmoker03.wav,biker/help04.wav,biker/laughter04.wav,biker/laughter12.wav" + cabaitlines "biker/callforrescue02.wav,biker/callforrescue06.wav,biker/callforrescue08.wav" + psenabled -1 //271 + psbots -1 //271 + psnotify 0 + donor 2 + burstdoors 0 + dmgboost 0.75 + dmgres 0.7 + fastrecovery 1 + jumpheight 70.0 + ladykiller 25.0 + meleerange 125 + overhealth 130 + punchres 0.7 + revivehp 70 + riotgear 0 + shovedmg 0.0 + shovepenalty 1 + speedboost 0.95 + } + louis // Support - Low survivability, medium mobility, medium-low damage, high uptime + { + cafilter 8 + caattacklines "manager/choke01.wav,manager/cough03.wav,manager/deathscream02.wav,manager/friendlyfire03.wav,manager/friendlyfire06.wav,manager/help05.wav,manager/laughter04.wav,manager/laughter20.wav" + cabaitlines "manager/callforrescue01.wav,manager/callforrescue03.wav" + psenabled -1 //31 + psbots -1 //31 + psnotify 0 + donor 2 + dmgboost 0.85 + dmgres 1.4 + healpercent 80.0 + hpregen 1 + jumpheight 70.0 + medcuts 2 + middash 0 + overdose 250.0 + overhealth 110 + revivehp 60 + shockwave 0.0 + speedboost 1.1 + syringe 0 + } + nick // General - Medium-low survivability, high mobility, medium-high damage, high uptime + { + cafilter 2 + caattacklines "gambler/battlecry04.wav,gambler/choke01.wav,gambler/choke04.wav,gambler/choke05.wav,gambler/cough01.wav,gambler/defibrillator13.wav,gambler/friendlyfire02.wav,gambler/laughter01.wav" + cabaitlines "gambler/callforrescue02.wav,gambler/callforrescue05.wav" + psenabled -1 //31 + psbots -1 //31 + psnotify 0 + donor 2 + bhop 0 + dmgboost 0.65 + dmgres 1.1 + eternal 0 + ladderacts 0 + overhealth 120 + pipeduration 6.5 + rapidpistol 0.130 + recoil 0 + revivehp 50 + specammo 1 + speedboost 0.95 + } + ellis // Damage - Low survivability, medium mobility, high damage, medium uptime + { + cafilter 40 + caattacklines "mechanic/choke01.wav,mechanic/choke04.wav,mechanic/cough01.wav,mechanic/cough02.wav,mechanic/friendlyfire01.wav,mechanic/laughter04.wav,mechanic/laughter06.wav" + cabaitlines "mechanic/callforrescue01.wav,mechanic/callforrescue03.wav,mechanic/callforrescue05.wav" + psenabled -1 //7 + psbots -1 //7 + psnotify 0 + donor 2 + dmgboost 1.35 + dmgres 1.25 + ghost 0 + healpercent 70.0 + hollowpoint 0.0 + overhealth 105 + revivehp 40 + speedboost 0.95 + } + coach // Tank - Medium survivability, medium-low mobility, medium damage, low uptime + { + cafilter 5 + caattacklines "coach/taunt06.wav,coach/tankpound01.wav,coach/tankpound05.wav,coach/laughter23.wav,coach/laughter15.wav,coach/help03.wav,coach/goingtodie28.wav" + cabaitlines "coach/callforrescue05.wav,coach/callforrescue08.wav,coach/callforrescue12.wav" + psenabled -1 //271 + psbots -1 //271 + psnotify 0 + donor 3 + burstdoors 1 + dmgboost 0.85 + dmgres 0.8 + fastrecovery 0 + jumpheight 60.0 + ladykiller 0.0 + meleerange 100 + overhealth 140 + punchres 0.8 + revivehp 70 + riotgear 1 + shovedmg 0.025 + shovepenalty 0 + speedboost 0.85 + } + rochelle // Support - Medium-low survivability, high mobility, low damage, high uptime + { + cafilter 16 + caattacklines "producer/battlecry02.wav,producer/boomerreaction02.wav,producer/deathscream02.wav,producer/defibrillator18.wav,producer/goingtodie08.wav,producer/goingtodie02.wav,producer/gooedbyspitter03.wav,producer/heardspitter05.wav" + cabaitlines "producer/callforrescue01.wav,producer/callforrescue07.wav" + psenabled -1 //31 + psbots -1 //31 + psnotify 0 + donor 3 + dmgboost 0.75 + dmgres 1.3 + healpercent 90.0 + hpregen 2 + jumpheight 60.0 + medcuts 0 + middash 1 + overdose 0.0 + overhealth 120 + revivehp 60 + shockwave 250.0 + speedboost 1.2 + syringe 1 + } + } comp { autoaggro enabled @@ -153,9 +734,33 @@ mt scaledmg disabled diffdmg 0.0,0.0,0.0,0.0 } + size + { + infchance 0.0 + infdmg 1 + infhp 1 + infscale 0.1-10.0 + jockeychance 0.0 + jockeydmg 1 + jockeyhp 1 + jockeyscale 0.1-10.0 + witchchance 0.0 + witchdmg 1 + witchhp 1 + witchscale 0.1-10.0 + } health { basehp 6000 + armorchars ],= + armorpercent 0.0 + armorres 0.75 + shieldchars >,- + shieldpercent 0.0 + shieldrate 0.5 + passdelay 5.0 + passhp 0 + passint 1.0 displayhp max displaytype 1 hpchars |,- @@ -192,6 +797,7 @@ mt enhance { attack 0.0 + bhop 0 claw -1.0 hittable -1.0 incap 0 @@ -235,16 +841,16 @@ mt regdelay 10.0 reginterval 300.0 reglimit 99999 - regtype 1-128 + regtype 1-144 regwave no finamount min finmode 0 - fintypes 1-128,1-128,1-128,1-128,1-128,1-128,1-128,1-128,1-128,1-128,1-128 + fintypes 1-144,1-144,1-144,1-144,1-144,1-144,1-144,1-144,1-144,1-144,1-144 finwaves 0,0,0,0,0,0,0,0,0,0,0 } rush { - types 0 + rutypes 0 climit 0 delay 60.0 cooldown 30.0 @@ -265,7 +871,7 @@ mt } modes { - types 5 + gmtypes 5 gmenabled coop,survival gmdisabled versus,scavenge } @@ -335,7 +941,7 @@ mt game 2 } } - 6,46,89 + 6,46,89,129 { immune { @@ -351,14 +957,14 @@ mt rock 1 } } - 7,11,13,20,31,38,64,71-74,91 + 7,11,13,20,31,38,64,71-74,91,131 { spawn { openareas 150.0 } } - 10,23,46,62,77-78 + 10,23,46,62,77-78,132,135,137-138,141 { spawn { @@ -377,6 +983,10 @@ mt particles { body 32 + common + { + bchance 100.0,100.0,100.0,100.0,100.0,33.3,100.0 + } } } 18,20,93-94,101,103,112 @@ -439,7 +1049,7 @@ mt body 8 } } - 40,69-70 + 40,69-70,144 { enhance { @@ -464,7 +1074,7 @@ mt melee 1 } } - 51,126 + 51,117,126,145-146 { health { @@ -494,7 +1104,7 @@ mt melee 1 } } - 56,90-91,97 + 56,90-91,97,108,140 { enhance { @@ -527,6 +1137,7 @@ mt particles { body 127 + bchance 100.0,100.0,100.0,100.0,100.0,33.3,100.0 rock 15 } smash @@ -536,15 +1147,17 @@ mt chance 20.0 hit 1 hitmode 0 + mode 1 + type 1 spec { body 0 meter 50.0 } } - zombie + panic { - aenabled 1 + aenabled 2 message 1 amount 50 chance 33.3 @@ -633,14 +1246,14 @@ mt interval 3.0 } } - 101,103,112,115-116,120-121 + 101,103,112,115-116,120-121,135 { immune { fire 1 } } - 102,104-106,115,118-121,123,126-128 + 102,104-106,115,118-121,123,126-128,132,138-139,144-146 { props { @@ -655,6 +1268,13 @@ mt vomit 1 } } + 109,132 + { + enhance + { + speed 2.5 + } + } 110 { health @@ -737,6 +1357,12 @@ mt smname "Absorber Smoker" spname "Absorber Spitter" } + mob + { + mobvariants -1 + commname "Absorber Common" + witchname "Absorber Witch" + } skin 50,90,150,255 } glow @@ -787,6 +1413,12 @@ mt smname "Acidic Smoker" spname "Acidic Spitter" } + mob + { + mobvariants -1 + commname "Acidic Common" + witchname "Acidic Witch" + } skin 0,255,125,255 } glow @@ -846,6 +1478,12 @@ mt smname "Aimless Smoker" spname "Aimless Spitter" } + mob + { + mobvariants -1 + commname "Aimless Common" + witchname "Aimless Witch" + } skin 255,255,150,255 } glow @@ -895,6 +1533,12 @@ mt smname "Ammo Smoker" spname "Ammo Spitter" } + mob + { + mobvariants -1 + commname "Ammo Common" + witchname "Ammo Witch" + } skin 170,200,210,255 } glow @@ -944,6 +1588,12 @@ mt smname "Blind Smoker" spname "Blind Spitter" } + mob + { + mobvariants -1 + commname "Blind Common" + witchname "Blind Witch" + } skin 5,0,105,255 } glow @@ -962,7 +1612,7 @@ mt flashlight 30,20,0,255 crown 30,20,0,255 } - blind + vision { hammo 2 aenabled 1 @@ -973,7 +1623,7 @@ mt hit 1 hitmode 0 intensity 255 - mode 0 + mode 1 range 150.0 rangechance 15.0 } @@ -994,6 +1644,12 @@ mt smname "Bomber Smoker" spname "Bomber Spitter" } + mob + { + mobvariants -1 + commname "Bomber Common" + witchname "Bomber Witch" + } skin 100,0,0,255 } glow @@ -1052,6 +1708,12 @@ mt smname "Boomer Smoker" spname "Boomer Spitter" } + mob + { + mobvariants -1 + commname "Boomer Common" + witchname "Boomer Witch" + } skin 65,105,0,255 } glow @@ -1077,10 +1739,22 @@ mt message 1 amount 5 chance 20.0 + filter 2 lifetime 0.0 remove 1 replace 1 - types 2 + } + respawn + { + human 1 + hammo 2 + hduration 5 + aenabled 1 + message 1 + chance 100.0 + duration 0 + filter 2 + range 300.0 } throw { @@ -1090,7 +1764,7 @@ mt chance 33.3 infamount 2 inflifetime 0.0 - infoptions 2 + infoptions 4 infremove 1 spec { @@ -1114,6 +1788,12 @@ mt smname "Bulletproof Smoker" spname "Bulletproof Spitter" } + mob + { + mobvariants -1 + commname "Bulletproof Common" + witchname "Bulletproof Witch" + } skin 135,0,85,255 } glow @@ -1153,6 +1833,12 @@ mt smname "Burier Smoker" spname "Burier Spitter" } + mob + { + mobvariants -1 + commname "Burier Common" + witchname "Burier Witch" + } skin 255,170,0,255 } glow @@ -1213,6 +1899,12 @@ mt smname "Car Smoker" spname "Car Spitter" } + mob + { + mobvariants -1 + commname "Car Common" + witchname "Car Witch" + } skin 255,120,75,255 } glow @@ -1242,6 +1934,7 @@ mt aenabled 1 message 1 chance 15.0 + damage 5.0 duration 5 interval 0.6 lifetime 30.0 @@ -1254,6 +1947,7 @@ mt hammo 2 aenabled 1 message 1 + cardamage 5.0 carlifetime 10.0 caroptions 0 carowner 1 @@ -1281,6 +1975,12 @@ mt smname "Charger Smoker" spname "Charger Spitter" } + mob + { + mobvariants -1 + commname "Charger Common" + witchname "Charger Witch" + } skin 95,140,80,255 } glow @@ -1306,10 +2006,22 @@ mt message 1 amount 5 chance 20.0 + filter 32 lifetime 0.0 remove 1 replace 1 - types 32 + } + respawn + { + human 1 + hammo 2 + hduration 5 + aenabled 1 + message 1 + chance 100.0 + duration 0 + filter 32 + range 300.0 } throw { @@ -1319,7 +2031,7 @@ mt chance 33.3 infamount 2 inflifetime 0.0 - infoptions 32 + infoptions 64 infremove 1 spec { @@ -1343,6 +2055,12 @@ mt smname "Choker Smoker" spname "Choker Spitter" } + mob + { + mobvariants -1 + commname "Choker Common" + witchname "Choker Witch" + } skin 180,0,180,255 } glow @@ -1394,6 +2112,12 @@ mt smname "Clone Smoker" spname "Clone Spitter" } + mob + { + mobvariants -1 + commname "Clone Common" + witchname "Clone Witch" + } skin 10,25,205,255 } glow @@ -1447,6 +2171,12 @@ mt smname "Cloudy Smoker" spname "Cloudy Spitter" } + mob + { + mobvariants -1 + commname "Cloudy Common" + witchname "Cloudy Witch" + } skin 175,100,125,255 } glow @@ -1474,6 +2204,9 @@ mt chance 50.0 damage 5.0 duration 0 + interval 5.0 + range 500.0 + remove 0 } } #15 @@ -1492,6 +2225,12 @@ mt smname "Dropper Smoker" spname "Dropper Spitter" } + mob + { + mobvariants -1 + commname "Dropper Common" + witchname "Dropper Witch" + } skin 200,100,0,255 } glow @@ -1537,6 +2276,12 @@ mt smname "Drugger Smoker" spname "Drugger Spitter" } + mob + { + mobvariants -1 + commname "Drugger Common" + witchname "Drugger Witch" + } skin 255,245,0,255 } glow @@ -1586,6 +2331,12 @@ mt smname "Drunk Smoker" spname "Drunk Spitter" } + mob + { + mobvariants -1 + commname "Drunk Common" + witchname "Drunk Witch" + } skin 150,255,50,255 } glow @@ -1636,6 +2387,12 @@ mt smname "Electric Smoker" spname "Electric Spitter" } + mob + { + mobvariants -1 + commname "Electric Common" + witchname "Electric Witch" + } skin 100,165,255,255 } glow @@ -1687,6 +2444,12 @@ mt smname "Enforcer Smoker" spname "Enforcer Spitter" } + mob + { + mobvariants -1 + commname "Enforcer Common" + witchname "Enforcer Witch" + } skin 200,150,50,255 } glow @@ -1736,6 +2499,12 @@ mt smname "Fast Smoker" spname "Fast Spitter" } + mob + { + mobvariants -1 + commname "Fast Common" + witchname "Fast Witch" + } skin 255,0,0,150 } glow @@ -1785,6 +2554,12 @@ mt smname "Fireproof Smoker" spname "Fireproof Spitter" } + mob + { + mobvariants -1 + commname "Fireproof Common" + witchname "Fireproof Witch" + } skin 150,0,0,255 } glow @@ -1843,6 +2618,12 @@ mt smname "Flinger Smoker" spname "Flinger Spitter" } + mob + { + mobvariants -1 + commname "Flinger Common" + witchname "Flinger Witch" + } skin 160,225,65,255 } glow @@ -1894,6 +2675,12 @@ mt smname "Flying Smoker" spname "Flying Spitter" } + mob + { + mobvariants -1 + commname "Flying Common" + witchname "Flying Witch" + } skin 45,175,230,255 } glow @@ -1938,6 +2725,12 @@ mt smname "Fragile Smoker" spname "Fragile Spitter" } + mob + { + mobvariants -1 + commname "Fragile Common" + witchname "Fragile Witch" + } skin 255,150,50,255 } glow @@ -1990,6 +2783,12 @@ mt smname "Ghost Smoker" spname "Ghost Spitter" } + mob + { + mobvariants -1 + commname "Ghost Common" + witchname "Ghost Witch" + } skin 50,50,50,150 } props @@ -2044,6 +2843,12 @@ mt smname "Godly Smoker" spname "Godly Spitter" } + mob + { + mobvariants -1 + commname "Godly Common" + witchname "Godly Witch" + } skin 50,25,150,255 } glow @@ -2088,6 +2893,12 @@ mt smname "Gravity Smoker" spname "Gravity Spitter" } + mob + { + mobvariants -1 + commname "Gravity Common" + witchname "Gravity Witch" + } skin 25,25,25,255 } glow @@ -2144,6 +2955,12 @@ mt smname "Gunner Smoker" spname "Gunner Spitter" } + mob + { + mobvariants -1 + commname "Gunner Common" + witchname "Gunner Witch" + } skin 80,100,80,255 } glow @@ -2197,6 +3014,12 @@ mt smname "Healthy Smoker" spname "Healthy Spitter" } + mob + { + mobvariants -1 + commname "Healthy Common" + witchname "Healthy Witch" + } skin 75,200,75,255 } glow @@ -2259,6 +3082,12 @@ mt smname "Hitter Smoker" spname "Hitter Spitter" } + mob + { + mobvariants -1 + commname "Hitter Common" + witchname "Hitter Witch" + } skin 125,110,255,255 } glow @@ -2277,11 +3106,10 @@ mt flashlight 255,110,125,255 crown 255,110,125,255 } - hit + medic { - aenabled 1 dmgmulti 1.5 - group 1 + hitgroup 1 } } #31 @@ -2300,6 +3128,12 @@ mt smname "Hunter Smoker" spname "Hunter Spitter" } + mob + { + mobvariants -1 + commname "Hunter Common" + witchname "Hunter Witch" + } skin 0,80,140,255 } glow @@ -2325,10 +3159,22 @@ mt message 1 amount 5 chance 20.0 + filter 4 lifetime 0.0 remove 1 replace 1 - types 4 + } + respawn + { + human 1 + hammo 2 + hduration 5 + aenabled 1 + message 1 + chance 100.0 + duration 0 + filter 4 + range 300.0 } throw { @@ -2338,7 +3184,7 @@ mt chance 33.3 infamount 2 inflifetime 0.0 - infoptions 4 + infoptions 8 infremove 1 spec { @@ -2362,6 +3208,12 @@ mt smname "Hurtful Smoker" spname "Hurtful Spitter" } + mob + { + mobvariants -1 + commname "Hurtful Common" + witchname "Hurtful Witch" + } skin 80,255,255,255 } glow @@ -2392,6 +3244,7 @@ mt hit 1 hitmode 0 interval 1.0 + mode 1 range 150.0 rangechance 15.0 } @@ -2412,6 +3265,12 @@ mt smname "Hypnotizer Smoker" spname "Hypnotizer Spitter" } + mob + { + mobvariants -1 + commname "Hypnotizer Common" + witchname "Hypnotizer Witch" + } skin 110,0,130,255 } glow @@ -2468,6 +3327,12 @@ mt smname "Icy Smoker" spname "Icy Spitter" } + mob + { + mobvariants -1 + commname "Icy Common" + witchname "Icy Witch" + } skin 0,155,255,200 } glow @@ -2516,6 +3381,12 @@ mt smname "Idler Smoker" spname "Idler Spitter" } + mob + { + mobvariants -1 + commname "Idler Common" + witchname "Idler Witch" + } skin 225,235,255,255 } glow @@ -2563,6 +3434,12 @@ mt smname "Inverter Smoker" spname "Inverter Spitter" } + mob + { + mobvariants -1 + commname "Inverter Common" + witchname "Inverter Witch" + } skin 0,235,220,255 } glow @@ -2611,6 +3488,12 @@ mt smname "Item Smoker" spname "Item Spitter" } + mob + { + mobvariants -1 + commname "Item Common" + witchname "Item Witch" + } skin 0,105,255,255 } glow @@ -2629,13 +3512,13 @@ mt flashlight 255,105,0,255 crown 255,105,0,255 } - item + drop { - aenabled 1 + aenabled 2 message 1 chance 50.0 loadout rifle,pistol,first_aid_kit,pain_pills - mode 0 + itemmode 0 pinata "" pinatabody 1 pinatachance 33.3 @@ -2663,6 +3546,12 @@ mt smname "Jockey Smoker" spname "Jockey Spitter" } + mob + { + mobvariants -1 + commname "Jockey Common" + witchname "Jockey Witch" + } skin 255,235,235,255 } glow @@ -2688,10 +3577,22 @@ mt message 1 amount 5 chance 20.0 + filter 16 lifetime 0.0 remove 1 replace 1 - types 16 + } + respawn + { + human 1 + hammo 2 + hduration 5 + aenabled 1 + message 1 + chance 100.0 + duration 0 + filter 16 + range 300.0 } throw { @@ -2701,7 +3602,7 @@ mt chance 33.3 infamount 2 inflifetime 0.0 - infoptions 16 + infoptions 32 infremove 1 spec { @@ -2725,6 +3626,12 @@ mt smname "Jumper Smoker" spname "Jumper Spitter" } + mob + { + mobvariants -1 + commname "Jumper Common" + witchname "Jumper Witch" + } skin 225,215,0,255 } glow @@ -2777,6 +3684,12 @@ mt smname "Kamikaze Smoker" spname "Kamikaze Spitter" } + mob + { + mobvariants -1 + commname "Kamikaze Common" + witchname "Kamikaze Witch" + } skin 50,50,50,255 } glow @@ -2795,7 +3708,7 @@ mt flashlight 0,165,95,255 crown 0,165,95,255 } - kamikaze + smash { aenabled 1 effect 7 @@ -2807,6 +3720,8 @@ mt mode 1 range 150.0 rangechance 33.3 + remove 1 + type 1 spec { body 0 @@ -2830,6 +3745,12 @@ mt smname "Lagger Smoker" spname "Lagger Spitter" } + mob + { + mobvariants -1 + commname "Lagger Common" + witchname "Lagger Witch" + } skin 255,150,0,255 } glow @@ -2878,6 +3799,12 @@ mt smname "Laser Smoker" spname "Laser Spitter" } + mob + { + mobvariants -1 + commname "Laser Common" + witchname "Laser Witch" + } skin 0,110,190,255 } glow @@ -2925,6 +3852,12 @@ mt smname "Leecher Smoker" spname "Leecher Spitter" } + mob + { + mobvariants -1 + commname "Leecher Common" + witchname "Leecher Witch" + } skin 0,50,255,255 } glow @@ -2943,19 +3876,24 @@ mt flashlight 255,50,0,255 crown 255,50,0,255 } - leech + regen { hammo 2 + hduration 5 aenabled 1 - effect 7 + effect 4 message 1 - chance 33.3 + chance 100.0 duration 5 - hit 1 - hitmode 0 + health 1 interval 1.0 - range 150.0 - rangechance 15.0 + limit 1000000 + range 500.0 + spec + { + limit 100000 + range 150.0 + } } } #44 @@ -2974,6 +3912,12 @@ mt smname "Lightning Smoker" spname "Lightning Spitter" } + mob + { + mobvariants -1 + commname "Lightning Common" + witchname "Lightning Witch" + } chance 100.0 note 1 skin 75,100,200,255 @@ -3022,6 +3966,12 @@ mt smname "Medic Smoker" spname "Medic Spitter" } + mob + { + mobvariants -1 + commname "Medic Common" + witchname "Medic Witch" + } skin 255,0,50,255 } glow @@ -3078,6 +4028,12 @@ mt smname "Meteor Smoker" spname "Meteor Spitter" } + mob + { + mobvariants -1 + commname "Meteor Common" + witchname "Meteor Witch" + } skin 120,20,10,255 } glow @@ -3130,6 +4086,12 @@ mt smname "Necromancer Smoker" spname "Necromancer Spitter" } + mob + { + mobvariants -1 + commname "Necromancer Common" + witchname "Necromancer Witch" + } skin 165,100,165,255 } glow @@ -3148,7 +4110,7 @@ mt flashlight 15,15,15,255 crown 15,15,15,255 } - necro + respawn { hammo 2 hduration 5 @@ -3156,6 +4118,7 @@ mt message 1 chance 100.0 duration 0 + filter 0 range 500.0 } } @@ -3175,6 +4138,12 @@ mt smname "Nullifier Smoker" spname "Nullifier Spitter" } + mob + { + mobvariants -1 + commname "Nullifier Common" + witchname "Nullifier Witch" + } skin 255,255,140,255 } glow @@ -3223,6 +4192,12 @@ mt smname "Omni Smoker" spname "Omni Spitter" } + mob + { + mobvariants -1 + commname "Omni Common" + witchname "Omni Witch" + } skin 45,35,175,255 } glow @@ -3269,6 +4244,12 @@ mt smname "Panic Smoker" spname "Panic Spitter" } + mob + { + mobvariants -1 + commname "Panic Common" + witchname "Panic Witch" + } skin 0,0,255,255 } glow @@ -3314,6 +4295,12 @@ mt smname "Pet Smoker" spname "Pet Spitter" } + mob + { + mobvariants -1 + commname "Pet Common" + witchname "Pet Witch" + } skin rainbow } glow @@ -3368,6 +4355,12 @@ mt smname "Pimp Smoker" spname "Pimp Spitter" } + mob + { + mobvariants -1 + commname "Pimp Common" + witchname "Pimp Witch" + } skin 255,0,255,255 } glow @@ -3386,7 +4379,7 @@ mt flashlight 0,255,0,255 crown 0,255,0,255 } - pimp + hurt { hammo 2 aenabled 1 @@ -3398,6 +4391,7 @@ mt hit 1 hitmode 0 interval 1.0 + mode 2 range 150.0 rangechance 15.0 } @@ -3418,6 +4412,12 @@ mt smname "Platinum Smoker" spname "Platinum Spitter" } + mob + { + mobvariants -1 + commname "Platinum Common" + witchname "Platinum Witch" + } skin 110,175,255,255 } glow @@ -3453,6 +4453,12 @@ mt smname "Puke Smoker" spname "Puke Spitter" } + mob + { + mobvariants -1 + commname "Puke Common" + witchname "Puke Witch" + } skin 170,180,45,255 } glow @@ -3503,6 +4509,12 @@ mt smname "Pyromaniac Smoker" spname "Pyromaniac Spitter" } + mob + { + mobvariants -1 + commname "Pyromaniac Common" + witchname "Pyromaniac Witch" + } skin 255,35,0,255 } glow @@ -3521,19 +4533,6 @@ mt flashlight 255,180,0,255 crown 255,180,0,255 } - health - { - extrahp 1000 - spec - { - bextrahp 500 - cextrahp 500 - hextrahp 500 - jextrahp 500 - smextrahp 500 - spextrahp 500 - } - } pyro { hammo 2 @@ -3569,6 +4568,12 @@ mt smname "Quiet Smoker" spname "Quiet Spitter" } + mob + { + mobvariants -1 + commname "Quiet Common" + witchname "Quiet Witch" + } skin 0,150,65,255 } glow @@ -3617,6 +4622,12 @@ mt smname "Recall Smoker" spname "Recall Spitter" } + mob + { + mobvariants -1 + commname "Recall Common" + witchname "Recall Witch" + } skin 255,155,0,255 } glow @@ -3687,6 +4698,12 @@ mt smname "Recoil Smoker" spname "Recoil Spitter" } + mob + { + mobvariants -1 + commname "Recoil Common" + witchname "Recoil Witch" + } skin 255,50,100,255 } glow @@ -3735,6 +4752,12 @@ mt smname "Regenerative Smoker" spname "Regenerative Spitter" } + mob + { + mobvariants -1 + commname "Regenerative Common" + witchname "Regenerative Witch" + } skin 50,25,0,255 } glow @@ -3758,17 +4781,18 @@ mt hammo 2 hduration 5 aenabled 1 + effect 4 message 1 chance 100.0 duration 0 health 1 interval 1.0 - leech 1 - leechrange 500.0 limit 1000000 + range 500.0 spec { limit 100000 + range 150.0 } } } @@ -3788,6 +4812,12 @@ mt smname "Respawner Smoker" spname "Respawner Spitter" } + mob + { + mobvariants -1 + commname "Respawner Common" + witchname "Respawner Witch" + } skin 55,125,70,255 } glow @@ -3809,7 +4839,7 @@ mt respawn { hammo 1 - aenabled 1 + aenabled 2 message 1 amount 1 chance 100.0 @@ -3832,6 +4862,12 @@ mt smname "Restarter Smoker" spname "Restarter Spitter" } + mob + { + mobvariants -1 + commname "Restarter Common" + witchname "Restarter Witch" + } skin 10,40,15,255 } glow @@ -3885,6 +4921,12 @@ mt smname "Rock Smoker" spname "Rock Spitter" } + mob + { + mobvariants -1 + commname "Rock Common" + witchname "Rock Witch" + } skin 75,25,25,255 } glow @@ -3913,6 +4955,7 @@ mt rock 5 duration 5 interval 0.2 + mode 1 radius -1.25,1.25 } } @@ -3932,6 +4975,12 @@ mt smname "Rocketeer Smoker" spname "Rocketeer Spitter" } + mob + { + mobvariants -1 + commname "Rocketeer Common" + witchname "Rocketeer Witch" + } skin 250,110,0,255 } glow @@ -3950,7 +4999,7 @@ mt flashlight 255,180,50,255 crown 255,180,50,255 } - rocket + smash { hammo 1 aenabled 1 @@ -3961,9 +5010,10 @@ mt delay 1.0 hit 1 hitmode 0 - mode 1 + mode 2 range 150.0 rangechance 15.0 + type 1 spec { body 0 @@ -3987,6 +5037,12 @@ mt smname "Self-throwing Smoker" spname "Self-throwing Spitter" } + mob + { + mobvariants -1 + commname "Self-throwing Common" + witchname "Self-throwing Witch" + } skin 90,55,25,255 } glow @@ -4033,6 +5089,12 @@ mt smname "Shaker Smoker" spname "Shaker Spitter" } + mob + { + mobvariants -1 + commname "Shaker Common" + witchname "Shaker Witch" + } skin 100,25,25,255 } glow @@ -4051,7 +5113,7 @@ mt flashlight 0,170,255,255 crown 0,170,255,255 } - shake + vision { hammo 2 aenabled 1 @@ -4065,6 +5127,7 @@ mt hit 1 hitmode 0 interval 1.0 + mode 4 range 150.0 rangechance 15.0 } @@ -4085,6 +5148,12 @@ mt smname "Shield Smoker" spname "Shield Spitter" } + mob + { + mobvariants -1 + commname "Shield Common" + witchname "Shield Witch" + } skin 135,205,255,255 } glow @@ -4141,6 +5210,12 @@ mt smname "Shover Smoker" spname "Shover Spitter" } + mob + { + mobvariants -1 + commname "Shover Common" + witchname "Shover Witch" + } skin 10,100,0,255 } glow @@ -4193,6 +5268,12 @@ mt smname "Slow Smoker" spname "Slow Spitter" } + mob + { + mobvariants -1 + commname "Slow Common" + witchname "Slow Witch" + } skin 80,130,255,255 } glow @@ -4243,6 +5324,12 @@ mt smname "Smasher Smoker" spname "Smasher Spitter" } + mob + { + mobvariants -1 + commname "Smasher Common" + witchname "Smasher Witch" + } skin 70,80,100,255 } glow @@ -4274,6 +5361,8 @@ mt mode 1 range 150.0 rangechance 33.3 + remove 0 + type 1 spec { body 0 @@ -4297,6 +5386,12 @@ mt smname "Smiter Smoker" spname "Smiter Spitter" } + mob + { + mobvariants -1 + commname "Smiter Common" + witchname "Smiter Witch" + } skin 0,230,230,255 } glow @@ -4315,7 +5410,7 @@ mt flashlight 230,230,0,255 crown 230,230,0,255 } - smite + smash { hammo 1 aenabled 1 @@ -4325,9 +5420,10 @@ mt chance 33.3 hit 1 hitmode 0 - mode 1 + mode 4 range 150.0 rangechance 33.3 + type 1 spec { body 0 @@ -4351,6 +5447,12 @@ mt smname "Smoker Smoker" spname "Smoker Spitter" } + mob + { + mobvariants -1 + commname "Smoker Common" + witchname "Smoker Witch" + } skin 150,0,150,255 } glow @@ -4376,10 +5478,22 @@ mt message 1 amount 5 chance 20.0 + filter 1 lifetime 0.0 remove 1 replace 1 - types 1 + } + respawn + { + human 1 + hammo 2 + hduration 5 + aenabled 1 + message 1 + chance 100.0 + duration 0 + filter 1 + range 300.0 } throw { @@ -4389,7 +5503,7 @@ mt chance 33.3 infamount 2 inflifetime 0.0 - infoptions 1 + infoptions 2 infremove 1 spec { @@ -4413,6 +5527,12 @@ mt smname "Spammer Smoker" spname "Spammer Spitter" } + mob + { + mobvariants -1 + commname "Spammer Common" + witchname "Spammer Witch" + } skin 175,75,75,255 } glow @@ -4431,7 +5551,7 @@ mt flashlight 75,175,175,255 crown 75,175,175,255 } - spam + rock { hammo 2 hduration 5 @@ -4440,6 +5560,7 @@ mt damage 5 duration 5 interval 0.5 + mode 2 } } #73 @@ -4458,6 +5579,12 @@ mt smname "Special Smoker" spname "Special Spitter" } + mob + { + mobvariants -1 + commname "Special Common" + witchname "Special Witch" + } skin 0,175,125,255 } glow @@ -4483,10 +5610,22 @@ mt message 1 amount 5 chance 20.0 + filter 0 lifetime 0.0 remove 1 replace 1 - types 0 + } + respawn + { + human 1 + hammo 2 + hduration 5 + aenabled 1 + message 1 + chance 100.0 + duration 0 + filter 0 + range 300.0 } throw { @@ -4496,7 +5635,7 @@ mt chance 33.3 infamount 2 inflifetime 0.0 - infoptions 63 + infoptions 126 infremove 1 spec { @@ -4521,6 +5660,12 @@ mt smname "Spitter Smoker" spname "Spitter Spitter" } + mob + { + mobvariants -1 + commname "Spitter Common" + witchname "Spitter Witch" + } skin 0,200,0,255 } glow @@ -4546,10 +5691,22 @@ mt message 1 amount 5 chance 20.0 + filter 8 lifetime 0.0 remove 1 replace 1 - types 8 + } + respawn + { + human 1 + hammo 2 + hduration 5 + aenabled 1 + message 1 + chance 100.0 + duration 0 + filter 8 + range 300.0 } throw { @@ -4559,7 +5716,7 @@ mt chance 33.3 infamount 2 inflifetime 0.0 - infoptions 8 + infoptions 16 infremove 1 spec { @@ -4583,6 +5740,12 @@ mt smname "Splasher Smoker" spname "Splasher Spitter" } + mob + { + mobvariants -1 + commname "Splasher Common" + witchname "Splasher Witch" + } skin 75,50,75,255 } glow @@ -4601,7 +5764,7 @@ mt flashlight 50,75,50,255 crown 50,75,50,255 } - splash + cloud { hammo 2 hduration 5 @@ -4612,6 +5775,7 @@ mt duration 0 interval 5.0 range 500.0 + remove 1 } } #76 @@ -4630,6 +5794,12 @@ mt smname "Splatter Smoker" spname "Splatter Spitter" } + mob + { + mobvariants -1 + commname "Splatter Common" + witchname "Splatter Witch" + } skin 80,25,175,255 } glow @@ -4648,17 +5818,18 @@ mt flashlight 175,25,80,255 crown 175,25,80,255 } - splatter + vision { hammo 2 aenabled 1 effect 7 message 1 chance 33.3 - duration 5 + duration 5.0 hit 1 hitmode 0 interval 1.0 + mode 8 range 150.0 rangechance 15.0 type 0 @@ -4680,6 +5851,12 @@ mt smname "Thrower Smoker" spname "Thrower Spitter" } + mob + { + mobvariants -1 + commname "Thrower Common" + witchname "Thrower Witch" + } skin 100,130,225,255 } glow @@ -4703,13 +5880,14 @@ mt hammo 2 aenabled 15 message 15 + cardamage 5.0 carlifetime 10.0 caroptions 0 carowner 1 chance 33.3 infamount 2 inflifetime 0.0 - infoptions 63 + infoptions 126 infremove 1 witchamount 3 witchdmg 5.0 @@ -4737,6 +5915,12 @@ mt smname "Tracker Smoker" spname "Tracker Spitter" } + mob + { + mobvariants -1 + commname "Tracker Common" + witchname "Tracker Witch" + } skin 150,50,0,255 } glow @@ -4785,6 +5969,12 @@ mt smname "Ultimate Smoker" spname "Ultimate Spitter" } + mob + { + mobvariants -1 + commname "Ultimate Common" + witchname "Ultimate Witch" + } skin 35,0,0,255 } glow @@ -4833,6 +6023,12 @@ mt smname "Undead Smoker" spname "Undead Spitter" } + mob + { + mobvariants -1 + commname "Undead Common" + witchname "Undead Witch" + } skin 0,75,55,255 } glow @@ -4876,6 +6072,12 @@ mt smname "Vampire Smoker" spname "Vampire Spitter" } + mob + { + mobvariants -1 + commname "Vampire Common" + witchname "Vampire Witch" + } skin 180,0,70,255 } glow @@ -4894,12 +6096,12 @@ mt flashlight 70,210,70,255 crown 70,210,70,255 } - vampire + regen { - aenabled 1 effect 1 message 1 chance 33.3 + mode 1 } } #82 @@ -4918,6 +6120,12 @@ mt smname "Visual Smoker" spname "Visual Spitter" } + mob + { + mobvariants -1 + commname "Visual Common" + witchname "Visual Witch" + } skin 175,25,205,255 } glow @@ -4943,10 +6151,11 @@ mt effect 7 message 1 chance 33.3 - duration 5 + duration 5.0 fov 160 hit 1 hitmode 0 + mode 16 range 150.0 rangechance 15.0 } @@ -4967,6 +6176,12 @@ mt smname "Warper Smoker" spname "Warper Spitter" } + mob + { + mobvariants -1 + commname "Warper Common" + witchname "Warper Witch" + } skin 130,130,255,255 } glow @@ -5029,6 +6244,12 @@ mt smname "Whirler Smoker" spname "Whirler Spitter" } + mob + { + mobvariants -1 + commname "Whirler Common" + witchname "Whirler Witch" + } skin 0,200,255,255 } glow @@ -5079,6 +6300,12 @@ mt smname "Witch Smoker" spname "Witch Spitter" } + mob + { + mobvariants -1 + commname "Witch Common" + witchname "Witch Witch" + } skin 255,145,255,255 } glow @@ -5141,6 +6368,12 @@ mt smname "Xiphos Smoker" spname "Xiphos Spitter" } + mob + { + mobvariants -1 + commname "Xiphos Common" + witchname "Xiphos Witch" + } skin 95,70,85,255 } glow @@ -5159,13 +6392,13 @@ mt flashlight 40,70,55,255 crown 40,70,55,255 } - xiphos + regen { - aenabled 1 - effect 1 + effect 3 message 1 chance 33.3 maxhealth 0 + mode 2 } } #87 @@ -5184,6 +6417,12 @@ mt smname "Yeller Smoker" spname "Yeller Spitter" } + mob + { + mobvariants -1 + commname "Yeller Common" + witchname "Yeller Witch" + } skin 210,140,55,255 } glow @@ -5233,6 +6472,12 @@ mt smname "Zombie Smoker" spname "Zombie Spitter" } + mob + { + mobvariants -1 + commname "Zombie Common" + witchname "Zombie Witch" + } skin 165,205,175,255 } glow @@ -5251,11 +6496,11 @@ mt flashlight 190,255,250,255 crown 190,255,250,255 } - zombie + panic { hammo 2 hduration 6 - aenabled 1 + aenabled 2 message 1 amount 10 chance 33.3 @@ -5285,6 +6530,12 @@ mt smname "Armageddon Smoker" spname "Armageddon Spitter" } + mob + { + mobvariants -1 + commname "Armageddon Common" + witchname "Armageddon Witch" + } skin 75,0,0,255 } glow @@ -5306,7 +6557,7 @@ mt gravity { aenabled 2 - message 5 + message 4 flags 8 force -50.0 } @@ -5339,6 +6590,12 @@ mt smname "Boss Smoker" spname "Boss Spitter" } + mob + { + mobvariants -1 + commname "Boss Common" + witchname "Boss Witch" + } skin 0,0,50,255 } glow @@ -5444,6 +6701,12 @@ mt smname "Cobalt Smoker" spname "Cobalt Spitter" } + mob + { + mobvariants -1 + commname "Cobalt Common" + witchname "Cobalt Witch" + } skin 0,105,255,150 } glow @@ -5486,6 +6749,12 @@ mt smname "Distraction Smoker" spname "Distraction Spitter" } + mob + { + mobvariants -1 + commname "Distraction Common" + witchname "Distraction Witch" + } skin 225,225,0,255 } glow @@ -5539,6 +6808,12 @@ mt smname "Feedback Smoker" spname "Feedback Spitter" } + mob + { + mobvariants -1 + commname "Feedback Common" + witchname "Feedback Witch" + } skin 90,60,90,255 } glow @@ -5561,7 +6836,7 @@ mt { hammo 2 aenabled 2 - message 5 + message 4 flags 8 force 50.0 } @@ -5582,6 +6857,12 @@ mt smname "Flash Smoker" spname "Flash Spitter" } + mob + { + mobvariants -1 + commname "Flash Common" + witchname "Flash Witch" + } skin 150,0,0,150 } glow @@ -5669,6 +6950,12 @@ mt smname "Goliath Smoker" spname "Goliath Spitter" } + mob + { + mobvariants -1 + commname "Goliath Common" + witchname "Goliath Witch" + } skin 0,0,100,255 } glow @@ -5738,6 +7025,8 @@ mt chance 33.3 hit 1 hitmode 0 + mode 1 + type 1 spec { body 0 @@ -5761,6 +7050,12 @@ mt smname "Hallucination Smoker" spname "Hallucination Spitter" } + mob + { + mobvariants -1 + commname "Hallucination Common" + witchname "Hallucination Witch" + } skin 50,50,50,0 } props @@ -5792,6 +7087,12 @@ mt smname "Meme Smoker" spname "Meme Spitter" } + mob + { + mobvariants -1 + commname "Meme Common" + witchname "Meme Witch" + } skin 0,255,0,255 } glow @@ -5850,13 +7151,14 @@ mt mode 1 radius -180.0,180.0 } - spam + rock { aenabled 1 chance 50.0 damage 5 duration 1 interval 0.5 + mode 2 } witch { @@ -5886,6 +7188,12 @@ mt smname "Mirage Smoker" spname "Mirage Spitter" } + mob + { + mobvariants -1 + commname "Mirage Common" + witchname "Mirage Witch" + } skin 25,40,25,255 } glow @@ -5935,6 +7243,12 @@ mt smname "Poltergeist Smoker" spname "Poltergeist Spitter" } + mob + { + mobvariants -1 + commname "Poltergeist Common" + witchname "Poltergeist Witch" + } skin 100,50,50,255 } props @@ -5980,6 +7294,12 @@ mt smname "Psychotic Smoker" spname "Psychotic Spitter" } + mob + { + mobvariants -1 + commname "Psychotic Common" + witchname "Psychotic Witch" + } skin 0,0,0,255 } glow @@ -6082,6 +7402,12 @@ mt smname "Reverse-Flash Smoker" spname "Reverse-Flash Spitter" } + mob + { + mobvariants -1 + commname "Reverse-Flash Common" + witchname "Reverse-Flash Witch" + } skin 255,255,0,150 } glow @@ -6140,6 +7466,12 @@ mt smname "Spawner Smoker" spname "Spawner Spitter" } + mob + { + mobvariants -1 + commname "Spawner Common" + witchname "Spawner Witch" + } skin 75,95,105,255 } glow @@ -6147,11 +7479,11 @@ mt genabled 1 color 75,95,105 } - zombie + panic { hammo 2 hduration 26 - aenabled 1 + aenabled 2 message 1 amount 25 chance 33.3 @@ -6177,6 +7509,12 @@ mt smname "Zoom Smoker" spname "Zoom Spitter" } + mob + { + mobvariants -1 + commname "Zoom Common" + witchname "Zoom Witch" + } skin 45,45,45,150 } glow @@ -6226,6 +7564,12 @@ mt smname "Trap Smoker" spname "Trap Spitter" } + mob + { + mobvariants -1 + commname "Trap Common" + witchname "Trap Witch" + } skin 55,125,70,255 } glow @@ -6242,6 +7586,8 @@ mt chance 33.3 hit 1 hitmode 0 + mode 1 + type 1 spec { body 0 @@ -6269,6 +7615,12 @@ mt smname "Dread Smoker" spname "Dread Spitter" } + mob + { + mobvariants -1 + commname "Dread Common" + witchname "Dread Witch" + } skin 90,90,90,255 } glow @@ -6276,7 +7628,7 @@ mt genabled 1 color 90,90,90 } - blind + vision { effect 7 message 1 @@ -6285,7 +7637,7 @@ mt hit 1 hitmode 0 intensity 235 - mode 0 + mode 1 } } #106 @@ -6304,6 +7656,12 @@ mt smname "Rabid Smoker" spname "Rabid Spitter" } + mob + { + mobvariants -1 + commname "Rabid Common" + witchname "Rabid Witch" + } skin 175,50,95,255 } glow @@ -6335,6 +7693,7 @@ mt message 1 hit 1 hitmode 0 + mode 1 } } #107 @@ -6353,6 +7712,12 @@ mt smname "Tremor Smoker" spname "Tremor Spitter" } + mob + { + mobvariants -1 + commname "Tremor Common" + witchname "Tremor Witch" + } skin 130,65,0,255 } glow @@ -6376,7 +7741,7 @@ mt chance 33.3,75.0 damage 1.0 duration 5.0 - interval 0.2 + interval 0.75 radius -1.25;1.25 set rock,track speed 0.0,500.0 @@ -6389,6 +7754,11 @@ mt hduration 5 aenabled 1 message 1 + chance 33.3 + damage 5 + duration 5 + interval 0.75 + mode 0 } track { @@ -6398,17 +7768,6 @@ mt message 1 mode 1 } - spam - { - hammo 2 - hduration 5 - aenabled 1 - message 1 - chance 33.3 - damage 5 - duration 5 - interval 0.5 - } } /** * This is the plugin developer's personal Tank. @@ -6430,6 +7789,12 @@ mt smname "Psyk0tik Smoker" spname "Psyk0tik Spitter" } + mob + { + mobvariants -1 + commname "Psyk0tik Common" + witchname "Psyk0tik Witch" + } skin 0,170,255,150 } glow @@ -6459,7 +7824,6 @@ mt claw 10.0 hittable 10.0 rock 10.0 - speed 1.0 } combo { @@ -6528,6 +7892,12 @@ mt smname "Apocalyptic Smoker" spname "Apocalyptic Spitter" } + mob + { + mobvariants -1 + commname "Apocalyptic Common" + witchname "Apocalyptic Witch" + } skin 15,15,15,255 } glow @@ -6546,10 +7916,6 @@ mt flashlight 100,15,15,255 crown 100,15,15,255 } - enhance - { - speed 2.5 - } meteor { hammo 1 @@ -6583,6 +7949,7 @@ mt rock 10 duration 3 interval 0.2 + mode 1 radius -5.0,5.0 } } @@ -6602,6 +7969,12 @@ mt smname "Darth Vader Smoker" spname "Darth Vader Spitter" } + mob + { + mobvariants -1 + commname "Darth Vader Common" + witchname "Darth Vader Witch" + } skin 0,0,0,255 } glow @@ -6681,6 +8054,12 @@ mt smname "Drug Addict Smoker" spname "Drug Addict Spitter" } + mob + { + mobvariants -1 + commname "Drug Addict Common" + witchname "Drug Addict Witch" + } skin 0,255,255,255 } glow @@ -6710,8 +8089,9 @@ mt hitmode 0 interval 1.0 } - item + drop { + aenabled 2 pinata pain_pills,pain_pills,pain_pills,pain_pills,pain_pills pinatabody 1 pinatachance 100.0 @@ -6745,6 +8125,12 @@ mt smname "Godspeed Smoker" spname "Godspeed Spitter" } + mob + { + mobvariants -1 + commname "Godspeed Common" + witchname "Godspeed Witch" + } skin 75,75,75,150 } glow @@ -6811,6 +8197,12 @@ mt smname "Grim Reaper Smoker" spname "Grim Reaper Spitter" } + mob + { + mobvariants -1 + commname "Grim Reaper Common" + witchname "Grim Reaper Witch" + } skin 50,50,50,50 } props @@ -6867,6 +8259,12 @@ mt smname "Horde Smoker" spname "Horde Spitter" } + mob + { + mobvariants -1 + commname "Horde Common" + witchname "Horde Witch" + } skin 100,100,15,255 } glow @@ -6934,6 +8332,12 @@ mt smname "Hulk Smoker" spname "Hulk Spitter" } + mob + { + mobvariants -1 + commname "Hulk Common" + witchname "Hulk Witch" + } skin 100,235,100,255 } enhance @@ -6969,6 +8373,7 @@ mt message 1 hit 1 hitmode 1 + mode 1 } absorb { @@ -6984,12 +8389,13 @@ mt hittable 20.0 melee 200.0 } - shake + vision { aenabled 1 effect 7 duration 99999 interval 1.0 + mode 4 range 1000.0 rangechance 100.0 } @@ -7001,6 +8407,8 @@ mt chance 15.0 hit 1 hitmode 1 + mode 1 + type 1 spec { body 0 @@ -7024,6 +8432,12 @@ mt smname "Ninja Smoker" spname "Ninja Spitter" } + mob + { + mobvariants -1 + commname "Ninja Common" + witchname "Ninja Witch" + } skin 50,50,50,150 } props @@ -7102,6 +8516,12 @@ mt smname "Zen Smoker" spname "Zen Spitter" } + mob + { + mobvariants -1 + commname "Zen Common" + witchname "Zen Witch" + } skin 255,150,255,255 } glow @@ -7120,19 +8540,6 @@ mt flashlight 160,255,160,255 crown 160,255,160,255 } - health - { - basehp 1000000 - spec - { - bbasehp 100000 - cbasehp 100000 - hbasehp 100000 - jbasehp 100000 - smbasehp 100000 - spbasehp 100000 - } - } absorb { hammo 2 @@ -7179,6 +8586,12 @@ mt smname "The Boss (1st Form)" spname "The Boss (1st Form)" } + mob + { + mobvariants -1 + commname "The Boss (1st Form)" + witchname "The Boss (1st Form)" + } skin 255,255,80,255 } health @@ -7215,6 +8628,12 @@ mt smname "Steel Overlord (2nd Form)" spname "Steel Overlord (2nd Form)" } + mob + { + mobvariants -1 + commname "Steel Overlord (2nd Form)" + witchname "Steel Overlord (2nd Form)" + } skin 80,255,80,255 } enhance @@ -7250,6 +8669,12 @@ mt smname "Night Stalker (3rd Form)" spname "Night Stalker (3rd Form)" } + mob + { + mobvariants -1 + commname "Night Stalker (3rd Form)" + witchname "Night Stalker (3rd Form)" + } skin 80,80,255,255 } enhance @@ -7259,7 +8684,7 @@ mt rock 3.0 speed 1.3 } - blind + vision { effect 7 message 1 @@ -7268,7 +8693,7 @@ mt hit 1 hitmode 1 intensity 255 - mode 0 + mode 1 } ghost { @@ -7301,6 +8726,12 @@ mt smname "Spirit of Fire (4th Form)" spname "Spirit of Fire (4th Form)" } + mob + { + mobvariants -1 + commname "Spirit of Fire (4th Form)" + witchname "Spirit of Fire (4th Form)" + } skin 255,80,80,255 } particles @@ -7367,6 +8798,12 @@ mt smname "Randomizer Smoker" spname "Randomizer Spitter" } + mob + { + mobvariants -1 + commname "Randomizer Common" + witchname "Randomizer Witch" + } skin 0,0,255,255 } glow @@ -7419,6 +8856,12 @@ mt smname "Shapeshifter Smoker" spname "Shapeshifter Spitter" } + mob + { + mobvariants -1 + commname "Shapeshifter Common" + witchname "Shapeshifter Witch" + } skin 255,255,255,255 } spawn @@ -7457,6 +8900,12 @@ mt smname "Flashbanger Smoker" spname "Flashbanger Spitter" } + mob + { + mobvariants -1 + commname "Flashbanger Common" + witchname "Flashbanger Witch" + } skin 80,70,90,255 } glow @@ -7475,7 +8924,7 @@ mt flashlight 100,0,90,255 crown 100,0,90,255 } - blind + vision { hammo 2 aenabled 1 @@ -7486,7 +8935,7 @@ mt hit 1 hitmode 0 intensity 255 - mode 1 + mode 2 range 150.0 rangechance 15.0 stagger 3 @@ -7509,6 +8958,12 @@ mt smname "Mudman Smoker" spname "Mudman Spitter" } + mob + { + mobvariants -1 + commname "Mudman Common" + witchname "Mudman Witch" + } skin 100,75,0,255 } glow @@ -7527,17 +8982,18 @@ mt flashlight 100,75,0,255 crown 100,75,0,255 } - splatter + vision { hammo 2 aenabled 1 effect 7 message 1 chance 33.3 - duration 5 + duration 5.0 hit 1 hitmode 0 interval 1.0 + mode 8 range 150.0 rangechance 15.0 type 14 @@ -7560,6 +9016,12 @@ mt smname "Endgame Smoker" spname "Endgame Spitter" } + mob + { + mobvariants -1 + commname "Endgame Common" + witchname "Endgame Witch" + } skin 110,60,140,255 } fast @@ -7575,6 +9037,13 @@ mt duration 99999 speed 10.0 } + gravity + { + aenabled 2 + message 4 + flags 8 + force -100.0 + } smash { effect 7 @@ -7583,6 +9052,8 @@ mt chance 100.0 hit 1 hitmode 1 + mode 1 + type 1 spec { body 0 @@ -7606,6 +9077,12 @@ mt smname "Playful Smoker" spname "Playful Spitter" } + mob + { + mobvariants -1 + commname "Playful Common" + witchname "Playful Witch" + } skin 255,110,140,255 } } @@ -7625,6 +9102,12 @@ mt smname "Annoying Smoker" spname "Annoying Spitter" } + mob + { + mobvariants -1 + commname "Annoying Common" + witchname "Annoying Witch" + } skin 20,140,160,255 } health @@ -7643,13 +9126,1630 @@ mt respawn { hammo 99999 - aenabled 1 + aenabled 2 message 1 amount 99999 chance 100.0 type 128-128 } } + #129 + { + general + { + name "Sipow Tank" + spec + { + spectypes -1 + note -1 + bname "Sipow Boomer" + cname "Sipow Charger" + hname "Sipow Hunter" + jname "Sipow Jockey" + smname "Sipow Smoker" + spname "Sipow Spitter" + } + mob + { + mobvariants -1 + commname "Sipow Common" + witchname "Sipow Witch" + } + skin 50,125,255,255 + } + glow + { + genabled 1 + color 255,175,0 + } + props + { + light 255,175,0,255 + oxygen 255,175,0,255 + flame 255,175,0,180 + rock 255,175,0,255 + tire 255,175,0,255 + propane 255,175,0,255 + flashlight 255,175,0,255 + crown 255,175,0,255 + } + particles + { + body 80 + rock 8 + } + enhance + { + throwint 10.0 + speed 1.33 + } + acid + { + human 1 + hammo 2 + aenabled 1 + effect 7 + message 5 + chance 33.3 + cooldown 3 + damage 3.0 + death 1 + deathchance 33.3 + deathrange 200.0 + hit 1 + hitmode 0 + range 150.0 + rangechance 15.0 + rock 1 + rockchance 33.3 + spec + { + cooldown 3 + damage 1.0 + } + } + meteor + { + human 1 + hammo 1 + hduration 5 + aenabled 1 + message 1 + chance 15.0 + duration 5 + interval 0.6 + lifetime 15.0 + mode 0 + radius -180.0,180.0 + } + } + #130 + { + general + { + name "Evil Tank" + spec + { + spectypes -1 + note -1 + bname "Evil Boomer" + cname "Evil Charger" + hname "Evil Hunter" + jname "Evil Jockey" + smname "Evil Smoker" + spname "Evil Spitter" + } + mob + { + mobvariants -1 + commname "Evil Common" + witchname "Evil Witch" + } + skin 170,20,60,255 + } + glow + { + genabled 1 + color 0,0,140 + } + props + { + attached 124 + light 0,0,140,255 + oxygen 0,0,140,255 + flame 0,0,140,180 + rock 0,0,140,255 + tire 0,0,140,255 + propane 0,0,140,255 + flashlight 0,0,140,255 + crown 0,0,140,255 + } + fire + { + effect 7 + message 1 + chance 100.0 + cooldown 3 + damage 0.5 + hit 1 + hitmode 0 + spec + { + cooldown 3 + damage 0.25 + } + } + ice + { + effect 7 + message 1 + chance 100.0 + cooldown 3 + hit 1 + hitmode 0 + spec + { + cooldown 3 + } + } + medic + { + human 1 + hammo 2 + hduration 6 + aenabled 1 + message 1 + chance 100.0 + duration 0 + field 1 + fieldcolor 0,255,0 + health 25,25,25,25,25,25,100 + interval 1.0 + maxhealth 250,50,250,100,325,600,10000 + range 500.0 + } + respawn + { + human 1 + hammo 2 + hduration 5 + aenabled 1 + message 1 + chance 100.0 + duration 0 + filter 0 + range 500.0 + } + } + #131 + { + general + { + name "Officer Tank" + spec + { + spectypes -1 + note -1 + bname "Officer Boomer" + cname "Officer Charger" + hname "Officer Hunter" + jname "Officer Jockey" + smname "Officer Smoker" + spname "Officer Spitter" + } + mob + { + mobvariants -1 + commname "Officer Common" + witchname "Officer Witch" + } + tenabled -1 + chance 100.0 + note 1 + skin 100,100,100,255 + } + glow + { + genabled 1 + color 100,100,100 + } + props + { + attached 242 //L4D1:194 + light 0,0,255,255 + rock 0,0,0,255 + tire 100,100,100,255 + propane 0,0,0,255 + flashlight 255,0,0,255 + } + drop + { + human 1 + aenabled 1 + message 1 + chance 100.0 + mode 2 + weaponboost 1.15 + weaponname tonfa + weaponres 0.85 + weaponscale 1.0 + } + gunner + { + human 1 + hammo 2 + aenabled 1 + message 1 + accuracy 2.0 + bullets 5 + chance 100.0 + clipsize 10 + damage 5.0 + duration 99999.0 + guntype 3 + interval 1.0 + loadtime 1.0 + range 500.0 + reactiontime 1.0 + targettype 7 + spec + { + clipsize 15 + damage 1.0 + guntype 1 + targettype 7 + } + } + minion + { + human 1 + hammo 2 + aenabled 1 + message 1 + amount 4 + chance 100.0 + filter 0 + lifetime 0.0 + remove 1 + replace 1 + type 131-131 + } + panic + { + spec + { + human 1 + hammo 2 + aenabled 2 + message 1 + amount 1 + chance 100.0 + duration 0 + interval 5.0 + mode 2 + type 64 + } + } + } + #132 + { + general + { + name "Mafia Tank" + spec + { + spectypes -1 + note -1 + bname "Mafia Boomer" + cname "Mafia Charger" + hname "Mafia Hunter" + jname "Mafia Jockey" + smname "Mafia Smoker" + spname "Mafia Spitter" + } + mob + { + mobvariants -1 + commname "Mafia Common" + witchname "Mafia Witch" + } + tenabled -1 + chance 100.0 + note 1 + skin 180,0,180,255 + } + glow + { + genabled 1 + color 180,0,180 + } + clone + { + human 1 + hammo 2 + aenabled 1 + message 1 + amount 2 + chance 100.0 + health 1500 + lifetime 0.0 + remove 0 + replace 1 + swap 0.0 + type 132-132 + spec + { + health 150 + } + } + smash + { + effect 7 + message 1 + body 1 + chance 33.0 + hit 1 + hitmode 1 + mode 1 + type 1 + spec + { + body 0 + meter 50.0 + } + } + } + #133 + { + general + { + name "Frankenstein Tank" + spec + { + spectypes -1 + note -1 + bname "Frankenstein Boomer" + cname "Frankenstein Charger" + hname "Frankenstein Hunter" + jname "Frankenstein Jockey" + smname "Frankenstein Smoker" + spname "Frankenstein Spitter" + } + mob + { + mobvariants -1 + commname "Frankenstein Common" + witchname "Frankenstein Witch" + } + tenabled -1 + chance 100.0 + note 1 + skin 85,125,75,255 + } + glow + { + genabled 1 + color 85,125,75 + } + props + { + attached 16 //L4D1:0 + rock 100,100,100,255 + } + enhance + { + claw 1.0 + hittable 1.0 + rockdmg 1.0 + speed 0.65 + } + ghost + { + effect 7 + message 1 + hit 1 + hitmode 0 + slots 28 + } + jump + { + aenabled 2 + message 4 + mode 1 + sporadicchance 33.3 + sporadicheight 750.0 + } + undead + { + human 1 + hammo 2 + aenabled 1 + message 1 + amount 2 + chance 100.0 + } + warp + { + aenabled 2 + message 4 + interval 10.0 + } + } + #134 + { + general + { + name "Prototype Tank" + spec + { + spectypes -1 + note -1 + bname "Prototype Boomer" + cname "Prototype Charger" + hname "Prototype Hunter" + jname "Prototype Jockey" + smname "Prototype Smoker" + spname "Prototype Spitter" + } + mob + { + mobvariants -1 + commname "Prototype Common" + witchname "Prototype Witch" + } + tenabled -1 + chance 100.0 + note 1 + skin 75,75,75,255 + } + glow + { + genabled 1 + color 255,25,55 + } + props + { + attached 18 //L4D1:2 + light 255,25,55,255 + rock 255,25,55,255 + } + absorb + { + human 1 + hammo 2 + hduration 99999 + aenabled 1 + message 1 + bullet 20.0 + chance 100.0 + duration 99999 + explosive 20.0 + fire 200.0 + hittable 20.0 + melee 200.0 + } + smash + { + effect 7 + message 1 + body 1 + chance 33.3 + hit 1 + hitmode 0 + mode 1 + type 1 + spec + { + body 0 + meter 50.0 + } + } + omni + { + hrequire 0 + human 1 + hammo 3 + hduration 5 + aenabled 1 + message 1 + chance 33.3 + duration 5 + mode 0 + range 500.0 + } + respawn + { + human 1 + hammo 1 + aenabled 2 + message 1 + amount 2 + chance 100.0 + type 134-134 + } + } + #135 + { + general + { + name "Zeus Tank" + spec + { + spectypes -1 + note -1 + bname "Zeus Boomer" + cname "Zeus Charger" + hname "Zeus Hunter" + jname "Zeus Jockey" + smname "Zeus Smoker" + spname "Zeus Spitter" + } + mob + { + mobvariants -1 + commname "Zeus Common" + witchname "Zeus Witch" + } + tenabled -1 + chance 100.0 + note 1 + skin 175,40,255,255 + } + glow + { + genabled 1 + color 0,100,155 + } + props + { + attached 272 //L4D1:224 + rock 0,100,155,255 + crown 0,100,155,255 + } + particles + { + body 2 + rock 2 + } + electric + { + human 1 + hammo 2 + aenabled 1 + effect 7 + message 7 + chance 66.6 + damage 5.0 + duration 5 + hit 1 + hitmode 0 + interval 1.0 + range 150.0 + rangechance 30.0 + } + lightning + { + aenabled 1 + message 1 + chance 100.0 + damage 5 + duration 99999 + interval 0.5 + } + smash + { + effect 7 + message 1 + body 1 + chance 15.0 + hit 1 + hitmode 1 + mode 4 + type 1 + spec + { + body 0 + meter 50.0 + } + } + warp + { + aenabled 2 + message 4 + interval 7.5 + } + } + #136 + { + general + { + name "Trajectory Tank" + spec + { + spectypes -1 + note -1 + bname "Trajectory Boomer" + cname "Trajectory Charger" + hname "Trajectory Hunter" + jname "Trajectory Jockey" + smname "Trajectory Smoker" + spname "Trajectory Spitter" + } + mob + { + mobvariants -1 + commname "Trajectory Common" + witchname "Trajectory Witch" + } + tenabled -1 + chance 100.0 + note 1 + skin 255,150,75,255 + } + glow + { + genabled 1 + color 55,150,125 + } + props + { + light 55,150,125,255 + oxygen 55,150,125,255 + flame 55,150,125,180 + rock 55,150,125,255 + tire 55,150,125,255 + propane 55,150,125,255 + flashlight 55,150,125,255 + crown 55,150,125,255 + } + fast + { + human 1 + hammo 2 + hduration 99999 + aenabled 1 + message 1 + chance 100.0 + duration 99999 + speed 5.0 + } + jump + { + human 1 + hammo 2 + hduration 5 + aenabled 3 + effect 7 + message 7 + chance 33.3 + duration 5 + height 300.0 + hit 1 + hitmode 0 + mode 1 + range 150.0 + rangechance 15.0 + sporadicchance 33.3 + sporadicheight 750.0 + } + warp + { + human 1 + hammo 2 + hduration 10 + aenabled 2 + message 4 + duration 0 + interval 7.5 + } + } + #137 + { + general + { + name "Barrage Tank" + spec + { + spectypes -1 + note -1 + bname "Barrage Boomer" + cname "Barrage Charger" + hname "Barrage Hunter" + jname "Barrage Jockey" + smname "Barrage Smoker" + spname "Barrage Spitter" + } + mob + { + mobvariants -1 + commname "Barrage Common" + witchname "Barrage Witch" + } + tenabled -1 + chance 100.0 + note 1 + skin 150,80,125,255 + } + glow + { + genabled 1 + color 40,80,165 + } + props + { + light 40,80,165,255 + oxygen 40,80,165,255 + flame 40,80,165,180 + rock 40,80,165,255 + tire 40,80,165,255 + propane 40,80,165,255 + flashlight 40,80,165,255 + crown 40,80,165,255 + } + meteor + { + human 1 + hammo 1 + HumanCooldown 0 + aenabled 1 + message 1 + chance 100.0 + duration 99999 + interval 0.6 + lifetime 15.0 + mode 1 + radius -180.0,180.0 + } + regen + { + human 1 + hammo 2 + hduration 99999 + aenabled 1 + effect 4 + message 1 + chance 100.0 + duration 0 + health 200 + interval 1.0 + limit 4000 + range 500.0 + spec + { + health 20 + limit 400 + range 150.0 + } + } + rock + { + hrequire 0 + human 1 + hammo 2 + hduration 99999 + aenabled 1 + message 1 + chance 100.0 + damage 5 + duration 99999 + interval 0.75 + mode 0 + radius -5.0,5.0 + } + shove + { + effect 7 + message 1 + chance 66.6 + duration 5 + hit 1 + hitmode 1 + interval 1.0 + } + } + #138 + { + general + { + name "Collector Tank" + spec + { + spectypes -1 + note -1 + bname "Collector Boomer" + cname "Collector Charger" + hname "Collector Hunter" + jname "Collector Jockey" + smname "Collector Smoker" + spname "Collector Spitter" + } + mob + { + mobvariants -1 + commname "Collector Common" + witchname "Collector Witch" + } + tenabled -1 + chance 100.0 + note 1 + skin 255,70,165,255 + } + glow + { + genabled 1 + color 255,70,165 + } + choke + { + effect 7 + message 1 + block 1 + chance 100.0 + damage 1.0 + delay 1.0 + duration 99999 + hit 1 + hitmode 1 + } + gravity + { + aenabled 2 + message 4 + flags 8 + force -50.0 + } + } + #139 + { + general + { + name "Timewalker Tank" + spec + { + spectypes -1 + note -1 + bname "Timewalker Boomer" + cname "Timewalker Charger" + hname "Timewalker Hunter" + jname "Timewalker Jockey" + smname "Timewalker Smoker" + spname "Timewalker Spitter" + } + mob + { + mobvariants -1 + commname "Timewalker Common" + witchname "Timewalker Witch" + } + tenabled -1 + chance 100.0 + note 1 + skin 0,200,255,255 + } + glow + { + genabled 1 + color 0,200,255 + } + clone + { + human 1 + hammo 2 + aenabled 1 + message 1 + amount 2 + chance 100.0 + health 1000 + lifetime 10.0 + remove 0 + replace 1 + swap 5.0 + type 139-139 + spec + { + health 100 + } + } + fast + { + human 1 + hammo 2 + hduration 3 + aenabled 1 + message 1 + chance 33.3 + duration 3 + speed 10.0 + } + ghost + { + effect 7 + message 1 + chance 15.0 + hit 1 + hitmode 0 + slots 28 + } + recall + { + human 1 + hammo 5 + aenabled 3 + message 1 + blinkchance 0.0 + blinkcount 0 + rewindchance 100.0 + rewindcleanse 1 + rewindcooldown 5 + rewindlifetime 10 + rewindmode 0 + rewindthreshold 1.0 + } + undead + { + human 1 + hammo 2 + aenabled 1 + message 1 + amount 2 + chance 100.0 + } + warp + { + aenabled 2 + message 4 + interval 10.0 + } + } + #140 + { + general + { + name "Speed Demon Tank" + spec + { + spectypes -1 + note -1 + bname "Speed Demon Boomer" + cname "Speed Demon Charger" + hname "Speed Demon Hunter" + jname "Speed Demon Jockey" + smname "Speed Demon Smoker" + spname "Speed Demon Spitter" + } + mob + { + mobvariants -1 + commname "Speed Demon Common" + witchname "Speed Demon Witch" + } + tenabled -1 + chance 100.0 + note 1 + skin 100,0,0,255 + } + glow + { + genabled 1 + color 255,200,60 + } + props + { + light 255,200,60,255 + oxygen 255,200,60,255 + flame 255,200,60,180 + rock 255,200,60,255 + tire 255,200,60,255 + propane 255,200,60,255 + flashlight 255,200,60,255 + crown 255,200,60,255 + } + particles + { + body 4 + rock 4 + } + fast + { + human 1 + hammo 2 + hduration 3 + aenabled 1 + message 1 + chance 33.3 + duration 3 + speed 10.0 + } + fire + { + effect 7 + message 1 + chance 100.0 + cooldown 3 + damage 0.5 + hit 1 + hitmode 0 + spec + { + cooldown 3 + damage 0.25 + } + } + pyro + { + human 1 + hammo 2 + hduration 3 + aenabled 1 + message 1 + chance 33.3 + dmgboost 2.0 + duration 3 + fire 1.0 + mode 0 + reignite 1 + speedboost 9.0 + spec + { + fire 400.0 + } + } + slow + { + aenabled 1 + effect 7 + message 2 + chance 100.0 + duration 99999.0 + range 500.0 + rangechance 100.0 + speed 0.65 + } + } + #141 + { + general + { + name "Ravager Tank" + spec + { + spectypes -1 + note -1 + bname "Ravager Boomer" + cname "Ravager Charger" + hname "Ravager Hunter" + jname "Ravager Jockey" + smname "Ravager Smoker" + spname "Ravager Spitter" + } + mob + { + mobvariants -1 + commname "Ravager Common" + witchname "Ravager Witch" + } + tenabled -1 + chance 100.0 + note 1 + skin 240,20,60,255 + } + glow + { + genabled 1 + color 75,100,90 + } + props + { + light 75,100,90,255 + oxygen 75,100,90,255 + flame 75,100,90,180 + rock 75,100,90,255 + tire 75,100,90,255 + propane 75,100,90,255 + flashlight 75,100,90,255 + crown 75,100,90,255 + } + bomb + { + human 1 + message 4 + rock 1 + rockchance 100.0 + } + rock + { + hrequire 0 + human 1 + hammo 2 + hduration 99999 + aenabled 1 + message 1 + chance 100.0 + damage 5 + duration 99999 + interval 1.5 + radius -5.0,5.0 + } + } + #142 + { + general + { + name "Ramattra Tank" + spec + { + spectypes -1 + note -1 + bname "Ramattra Boomer" + cname "Ramattra Charger" + hname "Ramattra Hunter" + jname "Ramattra Jockey" + smname "Ramattra Smoker" + spname "Ramattra Spitter" + } + mob + { + mobvariants -1 + commname "Ramattra Common" + witchname "Ramattra Witch" + } + skin 35,35,35,255 + } + glow + { + genabled 1 + color 160,80,255 + } + props + { + attached 380 + light 160,80,255,255 + oxygen 185,180,135,255 + flame 160,80,255,180 + rock 185,180,135,255 + tire 185,180,135,255 + propane 255,255,255,255 + flashlight 160,80,255,255 + crown 160,80,255,255 + } + absorb + { + hrequire 0 + human 1 + hammo 2 + hduration 5 + aenabled 1 + message 1 + bullet 20.0 + chance 15.0 + convertpercent 0.0 + duration 10 + explosive 20.0 + fire 200.0 + hittable 20.0 + melee 200.0 + } + regen + { + human 1 + hammo 2 + hduration 5 + aenabled 1 + effect 4 + message 1 + sight 1 + chance 100.0 + duration 0 + health 1 + interval 1.0 + limit 1000000 + range 500.0 + spec + { + limit 100000 + range 150.0 + } + } + shield + { + hrequire 0 + human 1 + aenabled 1 + message 1 + chance 15.0 + convertpercent 0.2 + color 160,80,255,50 + delay 10 + displayhp 11 + displaytype 2 + duration 0 + health 250.0 + hpchars ],= + type 15 + spec + { + health 100.0 + } + } + slow + { + aenabled 1 + effect 7 + message 2 + sight 1 + chance 100.0 + duration 99999.0 + range 500.0 + rangechance 100.0 + speed 0.4 + } + } + #143 + { + general + { + name "Sigma Tank" + spec + { + spectypes -1 + note -1 + bname "Sigma Boomer" + cname "Sigma Charger" + hname "Sigma Hunter" + jname "Sigma Jockey" + smname "Sigma Smoker" + spname "Sigma Spitter" + } + mob + { + mobvariants -1 + commname "Sigma Common" + witchname "Sigma Witch" + } + skin 80,80,80,255 + } + glow + { + genabled 1 + color 130,130,180 + } + props + { + attached 124 + light 130,130,180,255 + oxygen 65,200,170,255 + flame 130,130,180,180 + rock 65,200,170,255 + tire 65,200,170,255 + propane 60,0,110,255 + flashlight 130,130,180,255 + crown 130,130,180,255 + } + absorb + { + hrequire 0 + human 1 + hammo 2 + hduration 5 + aenabled 1 + message 1 + bullet 20.0 + chance 15.0 + convertpercent 0.75 + duration 10 + explosive 20.0 + fire 200.0 + hittable 20.0 + melee 200.0 + } + choke + { + human 1 + hammo 2 + aenabled 1 + effect 7 + message 3 + sight 1 + block 0 + chance 33.3 + damage 10.0 + delay 0.5 + duration 3 + hit 1 + hitmode 0 + range 150.0 + rangechance 15.0 + } + gravity + { + human 1 + aenabled 2 + message 4 + flags 8 + force -25.0 + } + shield + { + hrequire 0 + human 1 + aenabled 1 + message 1 + chance 15.0 + convertpercent 0.15 + color 130,130,180,50 + delay 10 + displayhp 11 + displaytype 2 + duration 0 + health 700.0 + hpchars ],= + type 15 + spec + { + health 70.0 + } + } + } + #144 + { + general + { + name "Zarya Tank" + spec + { + spectypes -1 + note -1 + bname "Zarya Boomer" + cname "Zarya Charger" + hname "Zarya Hunter" + jname "Zarya Jockey" + smname "Zarya Smoker" + spname "Zarya Spitter" + } + mob + { + mobvariants -1 + commname "Zarya Common" + witchname "Zarya Witch" + } + tenabled -1 + chance 100.0 + note 1 + skin 55,110,255,255 + } + glow + { + genabled 1 + color 255,130,255 + } + absorb + { + hrequire 0 + human 1 + hammo 2 + hduration 5 + aenabled 1 + message 1 + bullet 20.0 + chance 15.0 + convertpercent 0.75 + duration 10 + explosive 20.0 + fire 200.0 + hittable 20.0 + melee 200.0 + } + gravity + { + human 1 + aenabled 2 + message 4 + flags 8 + force -25.0 + } + shield + { + hrequire 0 + human 1 + aenabled 1 + message 1 + chance 15.0 + convertpercent 0.15 + color 255,130,255,50 + delay 15 + displayhp 11 + displaytype 2 + duration 5 + health 225.0 + hpchars ],= + type 15 + spec + { + health 22.5 + } + } + } + //The following samples are for punishing rushers/slackers. + #145 + { + general + { + name "Slacker Tank" + spec + { + spectypes -1 + note -1 + bname "Slacker Boomer" + cname "Slacker Charger" + hname "Slacker Hunter" + jname "Slacker Jockey" + smname "Slacker Smoker" + spname "Slacker Spitter" + } + mob + { + mobvariants -1 + commname "Slacker Common" + witchname "Slacker Witch" + } + tenabled -1 + chance 100.0 + note 0 + skin 100,100,100,255 + spawn 0 + } + announce + { + arrival 0 + death 0 + kill 0 + arrivalmsg 0 + arrivalsnd 0 + arrivalvoc 0 + deathdets 0 + deathmsg 0 + deathsnd 0 + deathvoc 0 + killmsg 0 + } + health + { + displayhp 0 + displaytype 0 + } + enhance + { + attackint 0.1 + intangible 1 + punchthrow 0.0 + taunt 1 + } + fast + { + human 2 + hammo 2 + hduration 99999 + aenabled 1 + message 0 + chance 100.0 + dash 5.0 + dashchance 50.0 + dashrange 150.0 + duration 99999 + speed 10.0 + } + gravity + { + aenabled 2 + message 0 + flags 8 + force -100.0 + } + warp + { + human 2 + effect 7 + message 0 + chance 100.0 + hit 1 + hitmode 1 + } + } + #146 + { + general + { + name "Rusher Tank" + spec + { + spectypes -1 + note -1 + bname "Rusher Boomer" + cname "Rusher Charger" + hname "Rusher Hunter" + jname "Rusher Jockey" + smname "Rusher Smoker" + spname "Rusher Spitter" + } + mob + { + mobvariants -1 + commname "Rusher Common" + witchname "Rusher Witch" + } + tenabled -1 + chance 100.0 + note 0 + skin 150,0,0,255 + spawn 0 + } + announce + { + arrival 0 + death 0 + kill 0 + arrivalmsg 0 + arrivalsnd 0 + arrivalvoc 0 + deathdets 0 + deathmsg 0 + deathsnd 0 + deathvoc 0 + killmsg 0 + } + health + { + displayhp 0 + displaytype 0 + } + enhance + { + attack 0.1 + intangible 1 + punchthrow 0.0 + taunt 1 + } + fast + { + human 2 + hammo 2 + hduration 99999 + aenabled 1 + message 0 + chance 100.0 + dash 5.0 + dashchance 50.0 + dashrange 150.0 + duration 99999 + speed 10.0 + } + gravity + { + aenabled 2 + message 0 + flags 8 + force -100.0 + } + fire + { + human 2 + effect 7 + message 0 + chance 100.0 + hit 1 + hitmode 1 + } + ice + { + human 2 + effect 7 + message 0 + chance 100.0 + duration 5.0 + hit 1 + hitmode 1 + } + } /** * Create your own Mutant Tanks below! * Start your imagination here! diff --git a/addons/sourcemod/data/mutant_tanks/mutant_tanks.cfg b/addons/sourcemod/data/mutant_tanks/mutant_tanks.cfg index c93fb25493..3dfd15df26 100644 --- a/addons/sourcemod/data/mutant_tanks/mutant_tanks.cfg +++ b/addons/sourcemod/data/mutant_tanks/mutant_tanks.cfg @@ -21,6 +21,7 @@ { "Plugin Enabled" "Yes" "Auto Update" "On" + "Graphics Level" "Max" "Bullet Fix" "Max" "Kick Bots" "Min" "Listen Support" "Enabled" @@ -38,11 +39,29 @@ "Cycle Types" "Min" "Spawn Enabled" "Max" "Spawn Limit" "Min" - "Type Range" "1-128" + "Type Range" "1-146" "Special" { "Special Types" "Min" } + "Mob" + { + "Mob Variants" "Min" + "Common Bio Chance" "50.0" + "Common Chance" "100.0" + "Common Check" "300.0" + "Common Damage Points" "50.0" + "Common Death Points" "100.0" + "Common Filter" "0" + "Common Goal" "5000.0" + "Common Variant" "0" + "Witch Chance" "100.0" + "Witch Filter" "0" + "Witch Mode" "0" + "Witch Mutate Chance" "100.0" + "Witch Range" "500.0" + "Witch Types" "0" + } } "Announcements" { @@ -64,6 +83,22 @@ "Announce Kill" "Min" } } + "Punishment" + { + "Punish Enabled" "-1,-1" //"145,146" + "Punish Bots" "-1,-1" //"145,146" + "Finale Check" "0" + "Punisher Types" "127,127" + "Punisher Lifetime" "5.0,5.0" + "Warning Distance" "500.0,1000.0" + "Punish Distance" "1000.0,2000.0" + "Warning Limit" "3,3" + "Warning Interval" "5,5" + "Survivor Types" "1" + "Survivors Required" "3" + "Incaps Required" "2" + "Zed Time" "1.0,1.0" + } "Rewards" { "Reward Enabled" "-1,-1,-1,-1" @@ -78,50 +113,69 @@ "Share Rewards" "0,0,0,0" "Teammate Limit" "0" "Action Duration Reward" "2.0,2.0,2.0,2.0" + "Adrenaline Time Reward" "30.0,30.0,30.0,30.0" "Ammo Boost Reward" "1,1,1,1" + "Ammo Refill Reward" "1,1,1,1" "Ammo Regen Reward" "1,1,1,1" "Attack Boost Reward" "1.25,1.25,1.25,1.25" "Blaze Health Reward" "1,1,1,1" + "Blood Donor Reward" "0,0,0,0" "Bunny Hop Reward" "1,1,1,1" "Burst Doors Reward" "1,1,1,1" "Clean Kills Reward" "1,1,1,1" "Cluster Bombs Reward" "3,3,3,3" "Damage Boost Reward" "1.25,1.25,1.25,1.25" "Damage Resistance Reward" "0.5,0.5,0.5,0.5" + "Dopamine Radius Reward" "150.0,150.0,150.0,150.0" + "Eternal Flames Reward" "1,1,1,1" "Fall Voiceline Reward" "PlayerLaugh,PlayerLaugh,PlayerLaugh,PlayerLaugh" + "Fast Recovery Reward" "1,1,1,1" + "Fire Rate Reward" "1.25,1.25,1.25,1.25" "Friendly Fire Reward" "1,1,1,1" "Ghost Bullets Reward" "1,1,1,1" + "Grenade Launcher Reward" "10.0,10.0,10.0,10.0" "Heal Percent Reward" "100.0,100.0,100.0,100.0" + "Healthcare Radius Reward" "150.0,150.0,150.0,150.0" "Health Regen Reward" "1,1,1,1" - "Hollowpoint Ammo Reward" "1,1,1,1" - "Inextinguishable Fire Reward" "1,1,1,1" + "Heartbeat Reward" "3.0,3.0,3.0,3.0" + "Hollowpoint Ammo Reward" "100.0,100.0,100.0,100.0" "Infinite Ammo Reward" "31,31,31,31" "Item Reward" "first_aid_kit,first_aid_kit,first_aid_kit,first_aid_kit" "Jump Height Reward" "75.0,75.0,75.0,75.0" "Ladder Actions Reward" "1,1,1,1" - "Lady Killer Reward" "1,1,1,1" + "Lady Killer Reward" "25.0,25.0,25.0,25.0" "Laser Sight Reward" "1,1,1,1" "Life Leech Reward" "1,1,1,1" + "Lucky Bullet Reward" "25.0,25.0,25.0,25.0" "Medical Cuts Reward" "1,1,1,1" "Melee Range Reward" "150,150,150,150" "Midair Dashes Reward" "2,2,2,2" + "Motivation Radius Reward" "150.0,150.0,150.0,150.0" + "Overdose Radius Reward" "150.0,150.0,150.0,150.0" + "Overhealth Reward" "200,200,200,200" "Pipebomb Duration Reward" "10.0,10.0,10.0,10.0" "Punch Resistance Reward" "0.25,0.25,0.25,0.25" "Rapid Pistol Reward" "0.130,0.130,0.130,0.130" "Recoil Dampener Reward" "1,1,1,1" "Refill Percent Reward" "100.0,100.0,100.0,100.0" "Regen Bursts Reward" "1,1,1,1" + "Reload Rate Reward" "1.25,1.25,1.25,1.25" "Respawn Loadout Reward" "1,1,1,1" "Revive Health Reward" "100,100,100,100" + "Riot Gear Reward" "1,1,1,1" + "Safety Bubble Reward" "1,1,1,1" + "Shockwave Radius Reward" "150.0,150.0,150.0,150.0" "Shove Damage Reward" "0.025,0.025,0.025,0.025" "Shove Penalty Reward" "1,1,1,1" "Shove Rate Reward" "0.7,0.7,0.7,0.7" - "Sledgehammer Rounds Reward" "1,1,1,1" + "Sledgehammer Rounds Reward" "100.0,100.0,100.0,100.0" "Special Ammo Reward" "3,3,3,3" "Speed Boost Reward" "1.25,1.25,1.25,1.25" "Stack Limits" "0,0,0,0,0,0,0" "Stack Rewards" "0,0,0,0" "Sticky Grenades Reward" "1,1,1,1" + "Supplier Reward" "3.0,3.0,3.0,3.0" + "Swing Rate Reward" "1.25,1.25,1.25,1.25" "Syringe Darts Reward" "1,1,1,1" "Thorns Reward" "1,1,1,1" "Useful Rewards" "15,15,15,15" @@ -139,6 +193,533 @@ "Reward Bots" "-1,-1,-1,-1" } } + "Survivors" + { + "Carrier Enabled" "0" + "Carrier Bots" "0" + "Carrier Body" "0" + "Carrier Chance" "0.0" + "Carrier Cleanse" "0" + "Carrier Damage Multiplier" "0.0" + "Carrier Delay" "0.0" + "Carrier Filter" "0" + "Carrier Health Multiplier" "0.0" + "Carrier Infection" "0" + "Carrier Mix" "0" + "Carrier Mode" "0" + "Carrier Teleport" "0" + "Carrier Type" "0" + "Carrier Voice" "0" + "Carrier Voice Chance" "0.0" + "Carrier Voice Interval" "0.0" + "Carrier Attack Voicelines" "" + "Carrier Bait Voicelines" "" + "Passive Enabled" "-1" + "Passive Bots" "-1" + "Passive Notify" "0" + "Action Duration Passive" "0.0" + "Adrenaline Time Passive" "0.0" + "Ammo Boost Passive" "0" + "Ammo Refill Passive" "0" + "Ammo Regen Passive" "0" + "Attack Boost Passive" "0.0" + "Blaze Health Passive" "0" + "Blood Donor Passive" "0" + "Bunny Hop Passive" "0" + "Burst Doors Passive" "0" + "Clean Kills Passive" "0" + "Cluster Bombs Passive" "0" + "Damage Boost Passive" "0.0" + "Damage Resistance Passive" "0.0" + "Dopamine Radius Passive" "0.0" + "Eternal Flames Passive" "0" + "Fast Recovery Passive" "0" + "Fire Rate Passive" "0.0" + "Friendly Fire Passive" "0" + "Ghost Bullets Passive" "0" + "Grenade Launcher Passive" "0.0" + "Heal Percent Passive" "0.0" + "Healthcare Radius Passive" "0.0" + "Health Regen Passive" "0" + "Heartbeat Passive" "0.0" + "Hollowpoint Ammo Passive" "0.0" + "Infinite Ammo Passive" "0" + "Item Passive" "" + "Jump Height Passive" "0.0" + "Ladder Actions Passive" "0" + "Lady Killer Passive" "0.0" + "Laser Sight Passive" "0" + "Life Leech Passive" "0" + "Lucky Bullet Passive" "0.0" + "Medical Cuts Passive" "0" + "Melee Range Passive" "0" + "Midair Dashes Passive" "0" + "Motivation Radius Passive" "0.0" + "Overdose Radius Passive" "0.0" + "Overhealth Passive" "0" + "Pipebomb Duration Passive" "0.0" + "Punch Resistance Passive" "0.0" + "Rapid Pistol Passive" "0.0" + "Recoil Dampener Passive" "0" + "Refill Percent Passive" "0.0" + "Regen Bursts Passive" "0" + "Reload Rate Passive" "0.0" + "Respawn Loadout Passive" "0" + "Revive Health Passive" "0" + "Riot Gear Passive" "0" + "Safety Bubble Passive" "0" + "Shockwave Radius Passive" "0.0" + "Shove Damage Passive" "0.0" + "Shove Penalty Passive" "0" + "Shove Rate Passive" "0.0" + "Sledgehammer Rounds Passive" "0.0" + "Special Ammo Passive" "0" + "Speed Boost Passive" "0.0" + "Sticky Grenades Passive" "0" + "Supplier Passive" "0.0" + "Swing Rate Passive" "0.0" + "Syringe Darts Passive" "0" + "Thorns Passive" "0" + "weapon_pistol" // Fire faster and no shove fatigue while pistol is being held + { + "Weapon Index" "1" + "Passive Enabled" "-1" //"9" + "Passive Bots" "-1" //"9" + "Stack Passives" "0" + "Blood Donor Passive" "2" + "Rapid Pistol Passive" "0.130" + "Shove Penalty Passive" "1" + "Syringe Darts Passive" "1" + } + "weapon_pistol_magnum" // Fire faster and no shove fatigue while magnum pistol is being held + { + "Weapon Index" "2" + "Passive Enabled" "-1" //"12" + "Passive Bots" "-1" //"12" + "Stack Passives" "0" + "Ghost Bullets Passive" "1" + "Hollowpoint Ammo Passive" "100.0" + "Rapid Pistol Passive" "0.130" + "Shove Penalty Passive" "1" + "Sledgehammer Rounds Passive" "0.5" + } + "weapon_smg" // Shoot grenades and perform ladder actions while uzi is being held + { + "Weapon Index" "3" + "Passive Enabled" "-1" //"26" + "Passive Bots" "-1" //"26" + "Stack Passives" "0" + "Grenade Launcher Passive" "25.0" + "Ladder Actions Passive" "1" + "Midair Dashes Passive" "1" + } + "weapon_smg_silenced" // Shoot grenades and perform ladder actions while silenced uzi is being held + { + "Weapon Index" "4" + "Passive Enabled" "-1" //"26" + "Passive Bots" "-1" //"26" + "Stack Passives" "0" + "Grenade Launcher Passive" "25.0" + "Ladder Actions Passive" "1" + "Jump Height Passive" "65.0" + } + "weapon_smg_mp5" // Shoot grenades and perform ladder actions while mp5 uzi is being held + { + "Weapon Index" "5" + "Passive Enabled" "-1" //"26" + "Passive Bots" "-1" //"26" + "Stack Passives" "0" + "Grenade Launcher Passive" "25.0" + "Ladder Actions Passive" "1" + "Speed Boost Passive" "1.125" + } + "weapon_rifle" // Remove recoil and deal more damage while m16 rifle is being held + { + "Weapon Index" "6" + "Passive Enabled" "-1" //"20" + "Passive Bots" "-1" //"20" + "Stack Passives" "0" + "Damage Boost Passive" "1.2" + "Grenade Launcher Passive" "25.0" + "Recoil Dampener Passive" "1" + } + "weapon_rifle_ak47" // Remove recoil and deal more damage while ak47 rifle is being held + { + "Weapon Index" "7" + "Passive Enabled" "-1" //"4" + "Passive Bots" "-1" //"4" + "Stack Passives" "0" + "Damage Boost Passive" "1.1" + "Laser Sight Passive" "1" + "Recoil Dampener Passive" "1" + } + "weapon_rifle_desert" // Remove recoil and deal more damage while scar-l rifle is being held + { + "Weapon Index" "8" + "Passive Enabled" "-1" //"20" + "Passive Bots" "-1" //"20" + "Stack Passives" "0" + "Damage Boost Passive" "1.125" + "Recoil Dampener Passive" "1" + "Special Ammo Passive" "3" + } + "weapon_rifle_sg552" // Remove recoil and deal more damage while sg552 rifle is being held + { + "Weapon Index" "9" + "Passive Enabled" "-1" //"20" + "Passive Bots" "-1" //"20" + "Stack Passives" "0" + "Damage Boost Passive" "1.15" + "Lucky Bullet Passive" "33.3" + "Recoil Dampener Passive" "1" + } + "weapon_pumpshotgun" // Reload faster and knock back zombies while pump shotgun is being held + { + "Weapon Index" "10" + "Passive Enabled" "-1" //"12" + "Passive Bots" "-1" //"12" + "Stack Passives" "0" + "Reload Rate Passive" "1.6" + "Shove Penalty Passive" "1" + "Sledgehammer Rounds Passive" "1.0" + } + "weapon_shotgun_chrome" // Reload faster and knock back zombies while chrome shotgun is being held + { + "Weapon Index" "11" + "Passive Enabled" "-1" //"12" + "Passive Bots" "-1" //"12" + "Stack Passives" "0" + "Reload Rate Passive" "1.6" + "Shove Damage Passive" "0.025" + "Sledgehammer Rounds Passive" "1.0" + } + "weapon_autoshotgun" // Reload faster and knock back zombies while auto shotgun is being held + { + "Weapon Index" "12" + "Passive Enabled" "-1" //"28" + "Passive Bots" "-1" //"28" + "Stack Passives" "0" + "Grenade Launcher Passive" "10.0" + "Reload Rate Passive" "1.6" + "Sledgehammer Rounds Passive" "1.0" + } + "weapon_shotgun_spas" // Reload faster and knock back zombies while spas shotgun is being held + { + "Weapon Index" "13" + "Passive Enabled" "-1" //"12" + "Passive Bots" "-1" //"12" + "Stack Passives" "0" + "Lady Killer Passive" "50.0" + "Reload Rate Passive" "1.6" + "Sledgehammer Rounds Passive" "1.0" + } + "weapon_hunting_rifle" // Shoot through walls and shoot stronger bullets while hunting rifle is being held + { + "Weapon Index" "14" + "Passive Enabled" "-1" //"20" + "Passive Bots" "-1" //"20" + "Stack Passives" "0" + "Ghost Bullets Passive" "1" + "Grenade Launcher Passive" "10.0" + "Hollowpoint Ammo Passive" "100.0" + } + "weapon_sniper_military" // Shoot through walls and shoot stronger bullets while military rifle is being held + { + "Weapon Index" "15" + "Passive Enabled" "-1" //"68" + "Passive Bots" "-1" //"68" + "Stack Passives" "0" + "Clean Kills Passive" "1" + "Ghost Bullets Passive" "1" + "Hollowpoint Ammo Passive" "100.0" + } + "weapon_sniper_awp" // Shoot through walls and shoot stronger bullets while awp rifle is being held + { + "Weapon Index" "16" + "Passive Enabled" "-1" //"4" + "Passive Bots" "-1" //"4" + "Stack Passives" "0" + "Damage Boost Passive" "2.0" + "Ghost Bullets Passive" "1" + "Hollowpoint Ammo Passive" "100.0" + } + "weapon_sniper_scout" // Shoot through walls and shoot stronger bullets while steyr scout rifle is being held + { + "Weapon Index" "17" + "Passive Enabled" "-1" //"12" + "Passive Bots" "-1" //"12" + "Stack Passives" "0" + "Ghost Bullets Passive" "1" + "Hollowpoint Ammo Passive" "100.0" + "Reload Rate Passive" "1.3" + } + "weapon_rifle_m60" // Refill nearby teammates' ammo periodically while dealing damage with the m60 rifle + { + "Weapon Index" "18" + "Passive Enabled" "-1" //"16" + "Passive Bots" "-1" //"16" + "Stack Passives" "0" + "Supplier Passive" "3.0" + } + "weapon_grenade_launcher" // Heal teammates with explosions while grenade launcher is being held + { + "Weapon Index" "19" + "Passive Enabled" "-1" //"1" + "Passive Bots" "-1" //"1" + "Stack Passives" "0" + "Blood Donor Passive" "4" + "Regen Bursts Passive" "2" + } + "weapon_first_aid_kit" // Take less damage while the medkit is being held and trigger a healing AoE when used + { + "Weapon Index" "20" + "Passive Enabled" "-1" //"5" + "Passive Bots" "-1" //"5" + "Stack Passives" "0" + "Damage Resistance Passive" "0.95" + "Healthcare Radius Passive" "250.0" + } + "weapon_defibrillator" // Take less damage while the defibrillator is being held and trigger a revive AoE when used + { + "Weapon Index" "21" + "Passive Enabled" "-1" //"5" + "Passive Bots" "-1" //"5" + "Stack Passives" "0" + "Damage Resistance Passive" "0.95" + "Shockwave Radius Passive" "1000.0" + } + "weapon_pain_pills" // Take less damage while the pain pills bottle is being held and trigger a healing AoE when used + { + "Weapon Index" "22" + "Passive Enabled" "-1" //"5" + "Passive Bots" "-1" //"5" + "Stack Passives" "0" + "Damage Resistance Passive" "0.95" + "Overdose Radius Passive" "250.0" + } + "weapon_adrenaline" // Take less damage while the adrenaline shot is being held and trigger an energy boost AoE when used + { + "Weapon Index" "23" + "Passive Enabled" "-1" //"5" + "Passive Bots" "-1" //"5" + "Stack Passives" "0" + "Damage Resistance Passive" "0.95" + "Dopamine Radius Passive" "250.0" + } + "weapon_melee" // Auto-bhop while knife is being held + { + "Weapon Index" "24" + "Weapon Name" "knife" + "Passive Enabled" "-1" //"2" + "Passive Bots" "-1" //"2" + "Stack Passives" "0" + "Bunny Hop Passive" "1" + } + "weapon_melee" // Berserker blunt weapons - High damage, low uptime, revive radius, damage resistance, and heal nearby teammates periodically while dealing damage + { + "Weapon Index" "25" + "Weapon Name" "baseball_bat,cricket_bat,tonfa,shovel,electric_guitar,frying_pan,golfclub" + "Passive Enabled" "-1" //"15" + "Passive Bots" "-1" //"15" + "Stack Passives" "0" + "Damage Boost Passive" "1.45" + "Damage Resistance Passive" "0.9" + "Heartbeat Passive" "3.0" + "Melee Range Passive" "100" + "Motivation Radius Passive" "250.0" + "Speed Boost Passive" "0.875" + "Swing Rate Passive" "0.65" + } + "weapon_melee" // Berserker sharp weapons - Low damage, high uptime, revive radius, leech health from zombies, and heal teammates by damaging them + { + "Weapon Index" "26" + "Weapon Name" "crowbar,machete,katana,knife,fireaxe,pitchfork" + "Passive Enabled" "-1" //"15" + "Passive Bots" "-1" //"15" + "Stack Passives" "0" + "Damage Boost Passive" "0.65" + "Life Leech Passive" "1" + "Medical Cuts Passive" "2" + "Melee Range Passive" "100" + "Motivation Radius Passive" "250.0" + "Swing Rate Passive" "1.45" + "Speed Boost Passive" "1.125" + } + "Bill" // General - Medium-high survivability, high mobility, medium-low damage, high uptime + { + "Carrier Filter" "2" + "Carrier Attack Voicelines" "namvet/laughter04.wav,namvet/laughter11.wav,namvet/cough06.wav,namvet/doubledeathresponse01.wav,namvet/doubledeathresponse02.wav,namvet/help11.wav,namvet/friendlyfire04.wav" + "Carrier Bait Voicelines" "namvet/callforrescue01.wav,namvet/callforrescue05.wav,namvet/callforrescue10.wav" + "Passive Enabled" "-1" //"31" + "Passive Bots" "-1" //"31" + "Passive Notify" "0" + "Blood Donor Passive" "1" + "Bunny Hop Passive" "1" + "Damage Boost Passive" "0.95" + "Damage Resistance Passive" "0.95" + "Eternal Flames Passive" "1" + "Ladder Actions Passive" "1" + "Overhealth Passive" "110" + "Pipebomb Duration Passive" "6.5" + "Rapid Pistol Passive" "0.130" + "Recoil Dampener Passive" "1" + "Revive Health Passive" "50" + "Special Ammo Passive" "0" + "Speed Boost Passive" "1.1" + } + "Zoey" // Damage - Medium-low survivability, medium mobility, medium-high damage, medium uptime + { + "Carrier Filter" "20" + "Carrier Attack Voicelines" "teengirl/laughter02.wav,teengirl/laughter06.wav,teengirl/hurtminor01.wav,teengirl/help04.wav" + "Carrier Bait Voicelines" "teengirl/callforrescue01.wav,teengirl/callforrescue02.wav,teengirl/callforrescue06.wav,teengirl/callforrescue07.wav,teengirl/callforrescue14.wav,teengirl/callforrescue16.wav" + "Passive Enabled" "-1" //"7" + "Passive Bots" "-1" //"7" + "Passive Notify" "0" + "Blood Donor Passive" "1" + "Damage Boost Passive" "1.25" + "Damage Resistance Passive" "1.15" + "Ghost Bullets Passive" "1" + "Heal Percent Passive" "75.0" + "Hollowpoint Ammo Passive" "100.0" + "Overhealth Passive" "115" + "Revive Health Passive" "40" + "Speed Boost Passive" "1.1" + } + "Francis" // Tank - Medium-high survivability, low mobility, medium-low damage, low uptime + { + "Carrier Filter" "65" + "Carrier Attack Voicelines" "biker/goingtodie03.wav,biker/goingtodie12.wav,biker/goingtodieaskforheal02.wav,biker/grabbedbysmoker03.wav,biker/help04.wav,biker/laughter04.wav,biker/laughter12.wav" + "Carrier Bait Voicelines" "biker/callforrescue02.wav,biker/callforrescue06.wav,biker/callforrescue08.wav" + "Passive Enabled" "-1" //"271" + "Passive Bots" "-1" //"271" + "Passive Notify" "0" + "Blood Donor Passive" "2" + "Burst Doors Passive" "0" + "Damage Boost Passive" "0.75" + "Damage Resistance Passive" "0.7" + "Fast Recovery Passive" "1" + "Jump Height Passive" "70.0" + "Lady Killer Passive" "25.0" + "Melee Range Passive" "125" + "Overhealth Passive" "130" + "Punch Resistance Passive" "0.7" + "Revive Health Passive" "70" + "Riot Gear Passive" "0" + "Shove Damage Passive" "0.0" + "Shove Penalty Passive" "1" + "Speed Boost Passive" "0.95" + } + "Louis" // Support - Low survivability, medium mobility, medium-low damage, high uptime + { + "Carrier Filter" "8" + "Carrier Attack Voicelines" "manager/choke01.wav,manager/cough03.wav,manager/deathscream02.wav,manager/friendlyfire03.wav,manager/friendlyfire06.wav,manager/help05.wav,manager/laughter04.wav,manager/laughter20.wav" + "Carrier Bait Voicelines" "manager/callforrescue01.wav,manager/callforrescue03.wav" + "Passive Enabled" "-1" //"31" + "Passive Bots" "-1" //"31" + "Passive Notify" "0" + "Blood Donor Passive" "2" + "Damage Boost Passive" "0.85" + "Damage Resistance Passive" "1.4" + "Heal Percent Passive" "80.0" + "Health Regen Passive" "1" + "Jump Height Passive" "70.0" + "Medical Cuts Passive" "2" + "Midair Dashes Passive" "0" + "Overdose Radius Passive" "250.0" + "Overhealth Passive" "110" + "Revive Health Passive" "60" + "Shockwave Radius Passive" "0.0" + "Speed Boost Passive" "1.1" + "Syringe Darts Passive" "0" + } + "Nick" // General - Medium-low survivability, high mobility, medium-high damage, high uptime + { + "Carrier Filter" "2" + "Carrier Attack Voicelines" "gambler/battlecry04.wav,gambler/choke01.wav,gambler/choke04.wav,gambler/choke05.wav,gambler/cough01.wav,gambler/defibrillator13.wav,gambler/friendlyfire02.wav,gambler/laughter01.wav" + "Carrier Bait Voicelines" "gambler/callforrescue02.wav,gambler/callforrescue05.wav" + "Passive Enabled" "-1" //"31" + "Passive Bots" "-1" //"31" + "Passive Notify" "0" + "Blood Donor Passive" "2" + "Bunny Hop Passive" "0" + "Damage Boost Passive" "0.65" + "Damage Resistance Passive" "1.1" + "Eternal Flames Passive" "0" + "Ladder Actions Passive" "0" + "Overhealth Passive" "120" + "Pipebomb Duration Passive" "6.5" + "Rapid Pistol Passive" "0.130" + "Recoil Dampener Passive" "0" + "Revive Health Passive" "50" + "Special Ammo Passive" "1" + "Speed Boost Passive" "0.95" + } + "Ellis" // Damage - Low survivability, medium mobility, high damage, medium uptime + { + "Carrier Filter" "40" + "Carrier Attack Voicelines" "mechanic/choke01.wav,mechanic/choke04.wav,mechanic/cough01.wav,mechanic/cough02.wav,mechanic/friendlyfire01.wav,mechanic/laughter04.wav,mechanic/laughter06.wav" + "Carrier Bait Voicelines" "mechanic/callforrescue01.wav,mechanic/callforrescue03.wav,mechanic/callforrescue05.wav" + "Passive Enabled" "-1" //"7" + "Passive Bots" "-1" //"7" + "Passive Notify" "0" + "Blood Donor Passive" "2" + "Damage Boost Passive" "1.35" + "Damage Resistance Passive" "1.25" + "Ghost Bullets Passive" "0" + "Heal Percent Passive" "70.0" + "Hollowpoint Ammo Passive" "0.0" + "Overhealth Passive" "105" + "Revive Health Passive" "40" + "Speed Boost Passive" "0.95" + } + "Coach" // Tank - Medium survivability, medium-low mobility, medium damage, low uptime + { + "Carrier Filter" "5" + "Carrier Attack Voicelines" "coach/taunt06.wav,coach/tankpound01.wav,coach/tankpound05.wav,coach/laughter23.wav,coach/laughter15.wav,coach/help03.wav,coach/goingtodie28.wav" + "Carrier Bait Voicelines" "coach/callforrescue05.wav,coach/callforrescue08.wav,coach/callforrescue12.wav" + "Passive Enabled" "-1" //"271" + "Passive Bots" "-1" //"271" + "Passive Notify" "0" + "Blood Donor Passive" "3" + "Burst Doors Passive" "1" + "Damage Boost Passive" "0.85" + "Damage Resistance Passive" "0.8" + "Fast Recovery Passive" "0" + "Jump Height Passive" "60.0" + "Lady Killer Passive" "0.0" + "Melee Range Passive" "100" + "Overhealth Passive" "140" + "Punch Resistance Passive" "0.8" + "Revive Health Passive" "70" + "Riot Gear Passive" "1" + "Shove Damage Passive" "0.025" + "Shove Penalty Passive" "0" + "Speed Boost Passive" "0.85" + } + "Rochelle" // Support - Medium-low survivability, high mobility, low damage, high uptime + { + "Carrier Filter" "16" + "Carrier Attack Voicelines" "producer/battlecry02.wav,producer/boomerreaction02.wav,producer/deathscream02.wav,producer/defibrillator18.wav,producer/goingtodie08.wav,producer/goingtodie02.wav,producer/gooedbyspitter03.wav,producer/heardspitter05.wav" + "Carrier Bait Voicelines" "producer/callforrescue01.wav,producer/callforrescue07.wav" + "Passive Enabled" "-1" //"31" + "Passive Bots" "-1" //"31" + "Passive Notify" "0" + "Blood Donor Passive" "3" + "Damage Boost Passive" "0.75" + "Damage Resistance Passive" "1.3" + "Heal Percent Passive" "90.0" + "Health Regen Passive" "2" + "Jump Height Passive" "60.0" + "Medical Cuts Passive" "0" + "Midair Dashes Passive" "1" + "Overdose Radius Passive" "0.0" + "Overhealth Passive" "120" + "Revive Health Passive" "60" + "Shockwave Radius Passive" "250.0" + "Speed Boost Passive" "1.2" + "Syringe Darts Passive" "1" + } + } "Competitive" { "Auto Aggravate" "Enabled" @@ -153,9 +734,33 @@ "Scale Damage" "Disabled" "Difficulty Damage" "0.0,0.0,0.0,0.0" } + "Size" + { + "Infected Chance" "0.0" + "Infected Damage" "1" + "Infected Health" "1" + "Infected Scale" "0.1-10.0" + "Jockey Chance" "0.0" + "Jockey Damage" "1" + "Jockey Health" "1" + "Jockey Scale" "0.1-10.0" + "Witch Chance" "0.0" + "Witch Damage" "1" + "Witch Health" "1" + "Witch Scale" "0.1-10.0" + } "Health" { "Base Health" "6000" + "Armor Characters" "],=" + "Armor Percentage" "0.0" + "Armor Resistance" "0.75" + "Shield Characters" ">,-" + "Shield Percentage" "0.0" + "Shield Rate" "0.5" + "Passive Delay" "5.0" + "Passive Health" "0" + "Passive Interval" "1.0" "Display Health" "Max" "Display Health Type" "1" "Health Characters" "|,-" @@ -192,6 +797,7 @@ "Enhancements" { "Attack Interval" "0.0" + "Bunny Hop" "0" "Claw Damage" "-1.0" "Footstep Shake" "0" "Ground Pound" "0" @@ -235,11 +841,11 @@ "Regular Delay" "10.0" "Regular Interval" "300.0" "Regular Limit" "99999" - "Regular Type" "1-128" + "Regular Type" "1-144" "Regular Wave" "No" "Finale Amount" "Min" "Finale Mode" "0" - "Finale Types" "1-128,1-128,1-128,1-128,1-128,1-128,1-128,1-128,1-128,1-128,1-128" + "Finale Types" "1-144,1-144,1-144,1-144,1-144,1-144,1-144,1-144,1-144,1-144,1-144" "Finale Waves" "0,0,0,0,0,0,0,0,0,0,0" } "Rush" @@ -299,6 +905,12 @@ "Smoker Name" "Absorber Smoker" "Spitter Name" "Absorber Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Absorber Common" + "Witch Name" "Absorber Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -372,6 +984,12 @@ "Smoker Name" "Acidic Smoker" "Spitter Name" "Acidic Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Acidic Common" + "Witch Name" "Acidic Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -457,6 +1075,12 @@ "Smoker Name" "Aimless Smoker" "Spitter Name" "Aimless Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Aimless Common" + "Witch Name" "Aimless Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -528,6 +1152,12 @@ "Smoker Name" "Ammo Smoker" "Spitter Name" "Ammo Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Ammo Common" + "Witch Name" "Ammo Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -599,6 +1229,12 @@ "Smoker Name" "Blind Smoker" "Spitter Name" "Blind Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Blind Common" + "Witch Name" "Blind Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -638,21 +1274,21 @@ "Spitter Extra Health" "100" } } - "Blind Ability" + "Vision Ability" { "Human Ability" "1" "Human Ammo" "2" "Ability Enabled" "1" "Ability Effect" "7" "Ability Message" "1" - "Blind Chance" "33.3" - "Blind Duration" "5.0" - "Blind Hit" "1" - "Blind Hit Mode" "0" - "Blind Intensity" "255" - "Blind Mode" "0" - "Blind Range" "150.0" - "Blind Range Chance" "15.0" + "Vision Chance" "33.3" + "Vision Duration" "5.0" + "Vision Hit" "1" + "Vision Hit Mode" "0" + "Vision Intensity" "255" + "Vision Mode" "1" + "Vision Range" "150.0" + "Vision Range Chance" "15.0" } } "Tank #6" @@ -671,6 +1307,12 @@ "Smoker Name" "Bomber Smoker" "Spitter Name" "Bomber Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Bomber Common" + "Witch Name" "Bomber Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -755,6 +1397,12 @@ "Smoker Name" "Boomer Smoker" "Spitter Name" "Boomer Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Boomer Common" + "Witch Name" "Boomer Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -810,10 +1458,22 @@ "Ability Message" "1" "Minion Amount" "5" "Minion Chance" "20.0" + "Minion Filter" "2" "Minion Lifetime" "0.0" "Minion Remove" "1" "Minion Replace" "1" - "Minion Types" "2" + } + "Respawn Ability" + { + "Human Ability" "1" + "Human Ammo" "2" + "Human Duration" "5" + "Ability Enabled" "1" + "Ability Message" "1" + "Respawn Chance" "100.0" + "Respawn Duration" "0" + "Respawn Filter" "2" + "Respawn Range" "300.0" } "Throw Ability" { @@ -824,7 +1484,7 @@ "Throw Chance" "33.3" "Throw Infected Amount" "2" "Throw Infected Lifetime" "0.0" - "Throw Infected Options" "2" + "Throw Infected Options" "4" "Throw Infected Remove" "1" "Special" { @@ -848,6 +1508,12 @@ "Smoker Name" "Bulletproof Smoker" "Spitter Name" "Bulletproof Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Bulletproof Common" + "Witch Name" "Bulletproof Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -908,6 +1574,12 @@ "Smoker Name" "Burier Smoker" "Spitter Name" "Burier Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Burier Common" + "Witch Name" "Burier Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -990,6 +1662,12 @@ "Smoker Name" "Car Smoker" "Spitter Name" "Car Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Car Common" + "Witch Name" "Car Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -1045,6 +1723,7 @@ "Ability Enabled" "1" "Ability Message" "1" "Car Chance" "15.0" + "Car Damage" "5.0" "Car Duration" "5" "Car Interval" "0.6" "Car Lifetime" "30.0" @@ -1058,6 +1737,7 @@ "Human Ammo" "2" "Ability Enabled" "1" "Ability Message" "1" + "Throw Car Damage" "5.0" "Throw Car Lifetime" "10.0" "Throw Car Options" "0" "Throw Car Owner" "1" @@ -1085,6 +1765,12 @@ "Smoker Name" "Charger Smoker" "Spitter Name" "Charger Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Charger Common" + "Witch Name" "Charger Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -1135,10 +1821,22 @@ "Ability Message" "1" "Minion Amount" "5" "Minion Chance" "20.0" + "Minion Filter" "32" "Minion Lifetime" "0.0" "Minion Remove" "1" "Minion Replace" "1" - "Minion Types" "32" + } + "Respawn Ability" + { + "Human Ability" "1" + "Human Ammo" "2" + "Human Duration" "5" + "Ability Enabled" "1" + "Ability Message" "1" + "Respawn Chance" "100.0" + "Respawn Duration" "0" + "Respawn Filter" "32" + "Respawn Range" "300.0" } "Throw Ability" { @@ -1149,7 +1847,7 @@ "Throw Chance" "33.3" "Throw Infected Amount" "2" "Throw Infected Lifetime" "0.0" - "Throw Infected Options" "32" + "Throw Infected Options" "64" "Throw Infected Remove" "1" "Special" { @@ -1173,6 +1871,12 @@ "Smoker Name" "Choker Smoker" "Spitter Name" "Choker Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Choker Common" + "Witch Name" "Choker Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -1245,6 +1949,12 @@ "Smoker Name" "Clone Smoker" "Spitter Name" "Clone Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Clone Common" + "Witch Name" "Clone Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -1323,6 +2033,12 @@ "Smoker Name" "Cloudy Smoker" "Spitter Name" "Cloudy Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Cloudy Common" + "Witch Name" "Cloudy Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -1375,6 +2091,9 @@ "Cloud Chance" "50.0" "Cloud Damage" "5.0" "Cloud Duration" "0" + "Cloud Interval" "5.0" + "Cloud Range" "500.0" + "Cloud Remove" "0" } } "Tank #15" @@ -1393,6 +2112,12 @@ "Smoker Name" "Dropper Smoker" "Spitter Name" "Dropper Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Dropper Common" + "Witch Name" "Dropper Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -1460,6 +2185,12 @@ "Smoker Name" "Drugger Smoker" "Spitter Name" "Drugger Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Drugger Common" + "Witch Name" "Drugger Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -1489,6 +2220,10 @@ "Particles" { "Body Effects" "32" + "Common" + { + "Body Chance" "100.0,100.0,100.0,100.0,100.0,33.3,100.0" + } } "Health" { @@ -1535,6 +2270,12 @@ "Smoker Name" "Drunk Smoker" "Spitter Name" "Drunk Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Drunk Common" + "Witch Name" "Drunk Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -1606,6 +2347,12 @@ "Smoker Name" "Electric Smoker" "Spitter Name" "Electric Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Electric Common" + "Witch Name" "Electric Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -1687,6 +2434,12 @@ "Smoker Name" "Enforcer Smoker" "Spitter Name" "Enforcer Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Enforcer Common" + "Witch Name" "Enforcer Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -1758,6 +2511,12 @@ "Smoker Name" "Fast Smoker" "Spitter Name" "Fast Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Fast Common" + "Witch Name" "Fast Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -1850,6 +2609,12 @@ "Smoker Name" "Fireproof Smoker" "Spitter Name" "Fireproof Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Fireproof Common" + "Witch Name" "Fireproof Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -1943,6 +2708,12 @@ "Smoker Name" "Flinger Smoker" "Spitter Name" "Flinger Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Flinger Common" + "Witch Name" "Flinger Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -2015,6 +2786,12 @@ "Smoker Name" "Flying Smoker" "Spitter Name" "Flying Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Flying Common" + "Witch Name" "Flying Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -2084,6 +2861,12 @@ "Smoker Name" "Fragile Smoker" "Spitter Name" "Fragile Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Fragile Common" + "Witch Name" "Fragile Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -2158,6 +2941,12 @@ "Smoker Name" "Ghost Smoker" "Spitter Name" "Ghost Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Ghost Common" + "Witch Name" "Ghost Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -2237,6 +3026,12 @@ "Smoker Name" "Godly Smoker" "Spitter Name" "Godly Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Godly Common" + "Witch Name" "Godly Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -2303,6 +3098,12 @@ "Smoker Name" "Gravity Smoker" "Spitter Name" "Gravity Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Gravity Common" + "Witch Name" "Gravity Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -2384,6 +3185,12 @@ "Smoker Name" "Gunner Smoker" "Spitter Name" "Gunner Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Gunner Common" + "Witch Name" "Gunner Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -2458,6 +3265,12 @@ "Smoker Name" "Healthy Smoker" "Spitter Name" "Healthy Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Healthy Common" + "Witch Name" "Healthy Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -2541,6 +3354,12 @@ "Smoker Name" "Hitter Smoker" "Spitter Name" "Hitter Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Hitter Common" + "Witch Name" "Hitter Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -2580,12 +3399,11 @@ "Spitter Extra Health" "100" } } - "Hit Ability" + "Medic Ability" { "Human Ability" "1" - "Ability Enabled" "1" - "Hit Damage Multiplier" "1.5" - "Hit Group" "1" + "Medic Damage Multiplier" "1.5" + "Medic Hit Group" "1" } } "Tank #31" @@ -2604,6 +3422,12 @@ "Smoker Name" "Hunter Smoker" "Spitter Name" "Hunter Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Hunter Common" + "Witch Name" "Hunter Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -2654,10 +3478,22 @@ "Ability Message" "1" "Minion Amount" "5" "Minion Chance" "20.0" + "Minion Filter" "4" "Minion Lifetime" "0.0" "Minion Remove" "1" "Minion Replace" "1" - "Minion Types" "4" + } + "Respawn Ability" + { + "Human Ability" "1" + "Human Ammo" "2" + "Human Duration" "5" + "Ability Enabled" "1" + "Ability Message" "1" + "Respawn Chance" "100.0" + "Respawn Duration" "0" + "Respawn Filter" "4" + "Respawn Range" "300.0" } "Throw Ability" { @@ -2668,7 +3504,7 @@ "Throw Chance" "33.3" "Throw Infected Amount" "2" "Throw Infected Lifetime" "0.0" - "Throw Infected Options" "4" + "Throw Infected Options" "8" "Throw Infected Remove" "1" "Special" { @@ -2692,6 +3528,12 @@ "Smoker Name" "Hurtful Smoker" "Spitter Name" "Hurtful Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Hurtful Common" + "Witch Name" "Hurtful Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -2743,6 +3585,7 @@ "Hurt Hit" "1" "Hurt Hit Mode" "0" "Hurt Interval" "1.0" + "Hurt Mode" "1" "Hurt Range" "150.0" "Hurt Range Chance" "15.0" } @@ -2763,6 +3606,12 @@ "Smoker Name" "Hypnotizer Smoker" "Spitter Name" "Hypnotizer Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Hypnotizer Common" + "Witch Name" "Hypnotizer Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -2840,6 +3689,12 @@ "Smoker Name" "Icy Smoker" "Spitter Name" "Icy Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Icy Common" + "Witch Name" "Icy Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -2913,6 +3768,12 @@ "Smoker Name" "Idler Smoker" "Spitter Name" "Idler Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Idler Common" + "Witch Name" "Idler Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -2982,6 +3843,12 @@ "Smoker Name" "Inverter Smoker" "Spitter Name" "Inverter Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Inverter Common" + "Witch Name" "Inverter Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -3051,6 +3918,12 @@ "Smoker Name" "Item Smoker" "Spitter Name" "Item Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Item Common" + "Witch Name" "Item Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -3090,21 +3963,21 @@ "Spitter Extra Health" "100" } } - "Item Ability" + "Drop Ability" { "Human Ability" "1" - "Ability Enabled" "1" + "Ability Enabled" "2" "Ability Message" "1" - "Item Chance" "50.0" - "Item Loadout" "rifle,pistol,first_aid_kit,pain_pills" - "Item Mode" "0" - "Item Pinata" "" - "Item Pinata Body" "1" - "Item Pinata Chance" "33.3" + "Drop Chance" "50.0" + "Drop Loadout" "rifle,pistol,first_aid_kit,pain_pills" + "Drop Item Mode" "0" + "Drop Pinata" "" + "Drop Pinata Body" "1" + "Drop Pinata Chance" "33.3" "Special" { "Ability Enabled" "0" - "Item Loadout" "smg,pistol,pain_pills" + "Drop Loadout" "smg,pistol,pain_pills" } } } @@ -3125,6 +3998,12 @@ "Smoker Name" "Jockey Smoker" "Spitter Name" "Jockey Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Jockey Common" + "Witch Name" "Jockey Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -3175,10 +4054,22 @@ "Ability Message" "1" "Minion Amount" "5" "Minion Chance" "20.0" + "Minion Filter" "16" "Minion Lifetime" "0.0" "Minion Remove" "1" "Minion Replace" "1" - "Minion Types" "16" + } + "Respawn Ability" + { + "Human Ability" "1" + "Human Ammo" "2" + "Human Duration" "5" + "Ability Enabled" "1" + "Ability Message" "1" + "Respawn Chance" "100.0" + "Respawn Duration" "0" + "Respawn Filter" "16" + "Respawn Range" "300.0" } "Throw Ability" { @@ -3189,7 +4080,7 @@ "Throw Chance" "33.3" "Throw Infected Amount" "2" "Throw Infected Lifetime" "0.0" - "Throw Infected Options" "16" + "Throw Infected Options" "32" "Throw Infected Remove" "1" "Special" { @@ -3213,6 +4104,12 @@ "Smoker Name" "Jumper Smoker" "Spitter Name" "Jumper Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Jumper Common" + "Witch Name" "Jumper Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -3286,6 +4183,12 @@ "Smoker Name" "Kamikaze Smoker" "Spitter Name" "Kamikaze Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Kamikaze Common" + "Witch Name" "Kamikaze Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -3328,23 +4231,25 @@ { "Run Speed" "0.65" } - "Kamikaze Ability" + "Smash Ability" { "Human Ability" "1" "Ability Enabled" "1" "Ability Effect" "7" "Ability Message" "1" - "Kamikaze Body" "1" - "Kamikaze Chance" "33.3" - "Kamikaze Hit" "1" - "Kamikaze Hit Mode" "0" - "Kamikaze Mode" "1" - "Kamikaze Range" "150.0" - "Kamikaze Range Chance" "33.3" + "Smash Body" "1" + "Smash Chance" "33.3" + "Smash Hit" "1" + "Smash Hit Mode" "0" + "Smash Mode" "1" + "Smash Range" "150.0" + "Smash Range Chance" "33.3" + "Smash Remove" "1" + "Smash Type" "1" "Special" { - "Kamikaze Body" "0" - "Kamikaze Meter" "50.0" + "Smash Body" "0" + "Smash Meter" "50.0" } } } @@ -3364,6 +4269,12 @@ "Smoker Name" "Lagger Smoker" "Spitter Name" "Lagger Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Lagger Common" + "Witch Name" "Lagger Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -3434,6 +4345,12 @@ "Smoker Name" "Laser Smoker" "Spitter Name" "Laser Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Laser Common" + "Witch Name" "Laser Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -3502,6 +4419,12 @@ "Smoker Name" "Leecher Smoker" "Spitter Name" "Leecher Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Leecher Common" + "Witch Name" "Leecher Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -3540,20 +4463,25 @@ "Spitter Extra Health" "100" } } - "Leech Ability" + "Regen Ability" { "Human Ability" "1" "Human Ammo" "2" + "Human Duration" "5" "Ability Enabled" "1" - "Ability Effect" "7" + "Ability Effect" "4" "Ability Message" "1" - "Leech Chance" "33.3" - "Leech Duration" "5" - "Leech Hit" "1" - "Leech Hit Mode" "0" - "Leech Interval" "1.0" - "Leech Range" "150.0" - "Leech Range Chance" "15.0" + "Regen Chance" "100.0" + "Regen Duration" "5" + "Regen Health" "1" + "Regen Interval" "1.0" + "Regen Limit" "1000000" + "Regen Range" "500.0" + "Special" + { + "Regen Limit" "100000" + "Regen Range" "150.0" + } } } "Tank #44" @@ -3573,6 +4501,12 @@ "Smoker Name" "Lightning Smoker" "Spitter Name" "Lightning Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Lightning Common" + "Witch Name" "Lightning Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -3644,6 +4578,12 @@ "Smoker Name" "Medic Smoker" "Spitter Name" "Medic Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Medic Common" + "Witch Name" "Medic Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -3722,6 +4662,12 @@ "Smoker Name" "Meteor Smoker" "Spitter Name" "Meteor Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Meteor Common" + "Witch Name" "Meteor Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -3804,6 +4750,12 @@ "Smoker Name" "Necromancer Smoker" "Spitter Name" "Necromancer Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Necromancer Common" + "Witch Name" "Necromancer Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -3843,16 +4795,17 @@ "Spitter Extra Health" "100" } } - "Necro Ability" + "Respawn Ability" { "Human Ability" "1" "Human Ammo" "2" "Human Duration" "5" "Ability Enabled" "1" "Ability Message" "1" - "Necro Chance" "100.0" - "Necro Duration" "0" - "Necro Range" "500.0" + "Respawn Chance" "100.0" + "Respawn Duration" "0" + "Respawn Filter" "0" + "Respawn Range" "500.0" } } "Tank #48" @@ -3871,6 +4824,12 @@ "Smoker Name" "Nullifier Smoker" "Spitter Name" "Nullifier Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Nullifier Common" + "Witch Name" "Nullifier Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -3945,6 +4904,12 @@ "Smoker Name" "Omni Smoker" "Spitter Name" "Omni Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Omni Common" + "Witch Name" "Omni Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -4013,6 +4978,12 @@ "Smoker Name" "Panic Smoker" "Spitter Name" "Panic Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Panic Common" + "Witch Name" "Panic Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -4083,6 +5054,12 @@ "Smoker Name" "Pet Smoker" "Spitter Name" "Pet Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Pet Common" + "Witch Name" "Pet Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -4171,6 +5148,12 @@ "Smoker Name" "Pimp Smoker" "Spitter Name" "Pimp Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Pimp Common" + "Witch Name" "Pimp Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -4209,21 +5192,22 @@ "Spitter Extra Health" "100" } } - "Pimp Ability" + "Hurt Ability" { "Human Ability" "1" "Human Ammo" "2" "Ability Enabled" "1" "Ability Effect" "7" "Ability Message" "1" - "Pimp Chance" "33.3" - "Pimp Damage" "1" - "Pimp Duration" "5" - "Pimp Hit" "1" - "Pimp Hit Mode" "0" - "Pimp Interval" "1.0" - "Pimp Range" "150.0" - "Pimp Range Chance" "15.0" + "Hurt Chance" "33.3" + "Hurt Damage" "1" + "Hurt Duration" "5" + "Hurt Hit" "1" + "Hurt Hit Mode" "0" + "Hurt Interval" "1.0" + "Hurt Mode" "2" + "Hurt Range" "150.0" + "Hurt Range Chance" "15.0" } } "Tank #53" @@ -4242,6 +5226,12 @@ "Smoker Name" "Platinum Smoker" "Spitter Name" "Platinum Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Platinum Common" + "Witch Name" "Platinum Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -4301,6 +5291,12 @@ "Smoker Name" "Puke Smoker" "Spitter Name" "Puke Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Puke Common" + "Witch Name" "Puke Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -4381,6 +5377,12 @@ "Smoker Name" "Pyromaniac Smoker" "Spitter Name" "Pyromaniac Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Pyromaniac Common" + "Witch Name" "Pyromaniac Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -4416,12 +5418,12 @@ "Extra Health" "1000" "Special" { - "Boomer Extra Health" "500" - "Charger Extra Health" "500" - "Hunter Extra Health" "500" - "Jockey Extra Health" "500" - "Smoker Extra Health" "500" - "Spitter Extra Health" "500" + "Boomer Extra Health" "100" + "Charger Extra Health" "100" + "Hunter Extra Health" "100" + "Jockey Extra Health" "100" + "Smoker Extra Health" "100" + "Spitter Extra Health" "100" } } "Enhancements" @@ -4464,6 +5466,12 @@ "Smoker Name" "Quiet Smoker" "Spitter Name" "Quiet Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Quiet Common" + "Witch Name" "Quiet Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -4535,6 +5543,12 @@ "Smoker Name" "Recall Smoker" "Spitter Name" "Recall Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Recall Common" + "Witch Name" "Recall Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -4628,6 +5642,12 @@ "Smoker Name" "Recoil Smoker" "Spitter Name" "Recoil Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Recoil Common" + "Witch Name" "Recoil Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -4698,6 +5718,12 @@ "Smoker Name" "Regenerative Smoker" "Spitter Name" "Regenerative Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Regenerative Common" + "Witch Name" "Regenerative Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -4743,17 +5769,18 @@ "Human Ammo" "2" "Human Duration" "5" "Ability Enabled" "1" + "Ability Effect" "4" "Ability Message" "1" "Regen Chance" "100.0" "Regen Duration" "0" "Regen Health" "1" "Regen Interval" "1.0" - "Regen Leech" "1" - "Regen Leech Range" "500.0" "Regen Limit" "1000000" + "Regen Range" "500.0" "Special" { "Regen Limit" "100000" + "Regen Range" "150.0" } } } @@ -4773,6 +5800,12 @@ "Smoker Name" "Respawner Smoker" "Spitter Name" "Respawner Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Respawner Common" + "Witch Name" "Respawner Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -4816,7 +5849,7 @@ { "Human Ability" "1" "Human Ammo" "1" - "Ability Enabled" "1" + "Ability Enabled" "2" "Ability Message" "1" "Respawn Amount" "1" "Respawn Chance" "100.0" @@ -4839,6 +5872,12 @@ "Smoker Name" "Restarter Smoker" "Spitter Name" "Restarter Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Restarter Common" + "Witch Name" "Restarter Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -4914,6 +5953,12 @@ "Smoker Name" "Rock Smoker" "Spitter Name" "Rock Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Rock Common" + "Witch Name" "Rock Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -4968,6 +6013,7 @@ "Rock Damage" "5" "Rock Duration" "5" "Rock Interval" "0.2" + "Rock Mode" "1" "Rock Radius" "-1.25,1.25" } } @@ -4987,6 +6033,12 @@ "Smoker Name" "Rocketeer Smoker" "Spitter Name" "Rocketeer Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Rocketeer Common" + "Witch Name" "Rocketeer Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -5025,25 +6077,26 @@ "Spitter Extra Health" "100" } } - "Rocket Ability" + "Smash Ability" { "Human Ability" "1" "Human Ammo" "1" "Ability Enabled" "1" "Ability Effect" "7" "Ability Message" "1" - "Rocket Body" "1" - "Rocket Chance" "15.0" - "Rocket Delay" "1.0" - "Rocket Hit" "1" - "Rocket Hit Mode" "0" - "Rocket Mode" "1" - "Rocket Range" "150.0" - "Rocket Range Chance" "15.0" + "Smash Body" "1" + "Smash Chance" "15.0" + "Smash Delay" "1.0" + "Smash Hit" "1" + "Smash Hit Mode" "0" + "Smash Mode" "2" + "Smash Range" "150.0" + "Smash Range Chance" "15.0" + "Smash Type" "1" "Special" { - "Rocket Body" "0" - "Rocket Countdown" "3.0" + "Smash Body" "0" + "Smash Countdown" "3.0" } } } @@ -5063,6 +6116,12 @@ "Smoker Name" "Self-throwing Smoker" "Spitter Name" "Self-throwing Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Self-throwing Common" + "Witch Name" "Self-throwing Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -5134,6 +6193,12 @@ "Smoker Name" "Shaker Smoker" "Spitter Name" "Shaker Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Shaker Common" + "Witch Name" "Shaker Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -5173,23 +6238,24 @@ "Spitter Extra Health" "100" } } - "Shake Ability" + "Vision Ability" { "Human Ability" "1" "Human Ammo" "2" "Ability Enabled" "1" "Ability Effect" "7" "Ability Message" "1" - "Shake Chance" "33.3" - "Shake Death" "1" - "Shake Death Chance" "33.3" - "Shake Death Range" "200.0" - "Shake Duration" "5" - "Shake Hit" "1" - "Shake Hit Mode" "0" - "Shake Interval" "1.0" - "Shake Range" "150.0" - "Shake Range Chance" "15.0" + "Vision Chance" "33.3" + "Vision Death" "1" + "Vision Death Chance" "33.3" + "Vision Death Range" "200.0" + "Vision Duration" "5" + "Vision Hit" "1" + "Vision Hit Mode" "0" + "Vision Interval" "1.0" + "Vision Mode" "4" + "Vision Range" "150.0" + "Vision Range Chance" "15.0" } } "Tank #66" @@ -5208,6 +6274,12 @@ "Smoker Name" "Shield Smoker" "Spitter Name" "Shield Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Shield Common" + "Witch Name" "Shield Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -5286,6 +6358,12 @@ "Smoker Name" "Shover Smoker" "Spitter Name" "Shover Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Shover Common" + "Witch Name" "Shover Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -5359,6 +6437,12 @@ "Smoker Name" "Slow Smoker" "Spitter Name" "Slow Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Slow Common" + "Witch Name" "Slow Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -5430,6 +6514,12 @@ "Smoker Name" "Smasher Smoker" "Spitter Name" "Smasher Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Smasher Common" + "Witch Name" "Smasher Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -5486,6 +6576,8 @@ "Smash Mode" "1" "Smash Range" "150.0" "Smash Range Chance" "33.3" + "Smash Remove" "0" + "Smash Type" "1" "Special" { "Smash Body" "0" @@ -5509,7 +6601,13 @@ "Smoker Name" "Smiter Smoker" "Spitter Name" "Smiter Spitter" } - "Tank Enabled" "-1" + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Smiter Common" + "Witch Name" "Smiter Witch" + } + "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" "Skin Color" "0,230,230,255" @@ -5551,24 +6649,25 @@ { "Run Speed" "0.65" } - "Smite Ability" + "Smash Ability" { "Human Ability" "1" "Human Ammo" "1" "Ability Enabled" "1" "Ability Effect" "7" "Ability Message" "1" - "Smite Body" "1" - "Smite Chance" "33.3" - "Smite Hit" "1" - "Smite Hit Mode" "0" - "Smite Mode" "1" - "Smite Range" "150.0" - "Smite Range Chance" "33.3" + "Smash Body" "1" + "Smash Chance" "33.3" + "Smash Hit" "1" + "Smash Hit Mode" "0" + "Smash Mode" "4" + "Smash Range" "150.0" + "Smash Range Chance" "33.3" + "Smash Type" "1" "Special" { - "Smite Body" "0" - "Smite Countdown" "3.0" + "Smash Body" "0" + "Smash Countdown" "3.0" } } } @@ -5588,6 +6687,12 @@ "Smoker Name" "Smoker Smoker" "Spitter Name" "Smoker Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Smoker Common" + "Witch Name" "Smoker Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -5620,6 +6725,10 @@ "Particles" { "Body Effects" "32" + "Common" + { + "Body Chance" "100.0,100.0,100.0,100.0,100.0,33.3,100.0" + } } "Health" { @@ -5642,10 +6751,22 @@ "Ability Message" "1" "Minion Amount" "5" "Minion Chance" "20.0" + "Minion Filter" "1" "Minion Lifetime" "0.0" "Minion Remove" "1" "Minion Replace" "1" - "Minion Types" "1" + } + "Respawn Ability" + { + "Human Ability" "1" + "Human Ammo" "2" + "Human Duration" "5" + "Ability Enabled" "1" + "Ability Message" "1" + "Respawn Chance" "100.0" + "Respawn Duration" "0" + "Respawn Filter" "1" + "Respawn Range" "300.0" } "Throw Ability" { @@ -5656,7 +6777,7 @@ "Throw Chance" "33.3" "Throw Infected Amount" "2" "Throw Infected Lifetime" "0.0" - "Throw Infected Options" "1" + "Throw Infected Options" "2" "Throw Infected Remove" "1" "Special" { @@ -5680,6 +6801,12 @@ "Smoker Name" "Spammer Smoker" "Spitter Name" "Spammer Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Spammer Common" + "Witch Name" "Spammer Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -5722,16 +6849,17 @@ "Spitter Extra Health" "100" } } - "Spam Ability" + "Rock Ability" { "Human Ability" "1" "Human Ammo" "2" "Human Duration" "5" "Ability Enabled" "1" - "Spam Chance" "15.0" - "Spam Damage" "5" - "Spam Duration" "5" - "Spam Interval" "0.5" + "Rock Chance" "15.0" + "Rock Damage" "5" + "Rock Duration" "5" + "Rock Interval" "0.5" + "Rock Mode" "2" } } "Tank #73" @@ -5750,6 +6878,12 @@ "Smoker Name" "Special Smoker" "Spitter Name" "Special Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Special Common" + "Witch Name" "Special Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -5800,10 +6934,22 @@ "Ability Message" "1" "Minion Amount" "5" "Minion Chance" "20.0" + "Minion Filter" "0" "Minion Lifetime" "0.0" "Minion Remove" "1" "Minion Replace" "1" - "Minion Types" "0" + } + "Respawn Ability" + { + "Human Ability" "1" + "Human Ammo" "2" + "Human Duration" "5" + "Ability Enabled" "1" + "Ability Message" "1" + "Respawn Chance" "100.0" + "Respawn Duration" "0" + "Respawn Filter" "0" + "Respawn Range" "300.0" } "Throw Ability" { @@ -5814,7 +6960,7 @@ "Throw Chance" "33.3" "Throw Infected Amount" "2" "Throw Infected Lifetime" "0.0" - "Throw Infected Options" "63" + "Throw Infected Options" "126" "Throw Infected Remove" "1" "Special" { @@ -5839,6 +6985,12 @@ "Smoker Name" "Spitter Smoker" "Spitter Name" "Spitter Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Spitter Common" + "Witch Name" "Spitter Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -5894,10 +7046,22 @@ "Ability Message" "1" "Minion Amount" "5" "Minion Chance" "20.0" + "Minion Filter" "8" "Minion Lifetime" "0.0" "Minion Remove" "1" "Minion Replace" "1" - "Minion Types" "8" + } + "Respawn Ability" + { + "Human Ability" "1" + "Human Ammo" "2" + "Human Duration" "5" + "Ability Enabled" "1" + "Ability Message" "1" + "Respawn Chance" "100.0" + "Respawn Duration" "0" + "Respawn Filter" "8" + "Respawn Range" "300.0" } "Throw Ability" { @@ -5908,7 +7072,7 @@ "Throw Chance" "33.3" "Throw Infected Amount" "2" "Throw Infected Lifetime" "0.0" - "Throw Infected Options" "8" + "Throw Infected Options" "16" "Throw Infected Remove" "1" "Special" { @@ -5932,6 +7096,12 @@ "Smoker Name" "Splasher Smoker" "Spitter Name" "Splasher Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Splasher Common" + "Witch Name" "Splasher Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -5974,18 +7144,19 @@ "Spitter Extra Health" "100" } } - "Splash Ability" + "Cloud Ability" { "Human Ability" "1" "Human Ammo" "2" "Human Duration" "5" "Ability Enabled" "1" "Ability Message" "1" - "Splash Chance" "15.0" - "Splash Damage" "5.0" - "Splash Duration" "0" - "Splash Interval" "5.0" - "Splash Range" "500.0" + "Cloud Chance" "15.0" + "Cloud Damage" "5.0" + "Cloud Duration" "0" + "Cloud Interval" "5.0" + "Cloud Range" "500.0" + "Cloud Remove" "1" } } "Tank #76" @@ -6005,6 +7176,12 @@ "Smoker Name" "Splatter Smoker" "Spitter Name" "Splatter Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Splatter Common" + "Witch Name" "Splatter Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -6044,21 +7221,22 @@ "Spitter Extra Health" "100" } } - "Splatter Ability" + "Vision Ability" { "Human Ability" "1" "Human Ammo" "2" "Ability Enabled" "1" "Ability Effect" "7" "Ability Message" "1" - "Splatter Chance" "33.3" - "Splatter Duration" "5" - "Splatter Hit" "1" - "Splatter Hit Mode" "0" - "Splatter Interval" "1.0" - "Splatter Range" "150.0" - "Splatter Range Chance" "15.0" - "Splatter Type" "0" + "Vision Chance" "33.3" + "Vision Duration" "5.0" + "Vision Hit" "1" + "Vision Hit Mode" "0" + "Vision Interval" "1.0" + "Vision Mode" "8" + "Vision Range" "150.0" + "Vision Range Chance" "15.0" + "Vision Type" "0" } } "Tank #77" @@ -6077,6 +7255,12 @@ "Smoker Name" "Thrower Smoker" "Spitter Name" "Thrower Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Thrower Common" + "Witch Name" "Thrower Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -6129,13 +7313,14 @@ "Human Ammo" "2" "Ability Enabled" "15" "Ability Message" "15" + "Throw Car Damage" "5.0" "Throw Car Lifetime" "10.0" "Throw Car Options" "0" "Throw Car Owner" "1" "Throw Chance" "33.3" "Throw Infected Amount" "2" "Throw Infected Lifetime" "0.0" - "Throw Infected Options" "63" + "Throw Infected Options" "126" "Throw Infected Remove" "1" "Throw Witch Amount" "3" "Throw Witch Damage" "5.0" @@ -6163,6 +7348,12 @@ "Smoker Name" "Tracker Smoker" "Spitter Name" "Tracker Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Tracker Common" + "Witch Name" "Tracker Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -6241,6 +7432,12 @@ "Smoker Name" "Ultimate Smoker" "Spitter Name" "Ultimate Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Ultimate Common" + "Witch Name" "Ultimate Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -6310,6 +7507,12 @@ "Smoker Name" "Undead Smoker" "Spitter Name" "Undead Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Undead Common" + "Witch Name" "Undead Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -6379,6 +7582,12 @@ "Smoker Name" "Vampire Smoker" "Spitter Name" "Vampire Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Vampire Common" + "Witch Name" "Vampire Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -6422,13 +7631,13 @@ "Spitter Extra Health" "100" } } - "Vampire Ability" + "Regen Ability" { "Human Ability" "1" - "Ability Enabled" "1" "Ability Effect" "1" "Ability Message" "1" - "Vampire Chance" "33.3" + "Regen Chance" "33.3" + "Regen Mode" "1" } } "Tank #82" @@ -6447,6 +7656,12 @@ "Smoker Name" "Visual Smoker" "Spitter Name" "Visual Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Visual Common" + "Witch Name" "Visual Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -6494,10 +7709,11 @@ "Ability Effect" "7" "Ability Message" "1" "Vision Chance" "33.3" - "Vision Duration" "5" + "Vision Duration" "5.0" "Vision FOV" "160" "Vision Hit" "1" "Vision Hit Mode" "0" + "Vision Mode" "16" "Vision Range" "150.0" "Vision Range Chance" "15.0" } @@ -6518,6 +7734,12 @@ "Smoker Name" "Warper Smoker" "Spitter Name" "Warper Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Warper Common" + "Witch Name" "Warper Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -6605,6 +7827,12 @@ "Smoker Name" "Whirler Smoker" "Spitter Name" "Whirler Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Whirler Common" + "Witch Name" "Whirler Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -6677,6 +7905,12 @@ "Smoker Name" "Witch Smoker" "Spitter Name" "Witch Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Witch Common" + "Witch Name" "Witch Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -6767,6 +8001,12 @@ "Smoker Name" "Xiphos Smoker" "Spitter Name" "Xiphos Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Xiphos Common" + "Witch Name" "Xiphos Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -6805,14 +8045,14 @@ "Spitter Extra Health" "100" } } - "Xiphos Ability" + "Regen Ability" { "Human Ability" "1" - "Ability Enabled" "1" - "Ability Effect" "1" + "Ability Effect" "3" "Ability Message" "1" - "Xiphos Chance" "33.3" - "Xiphos Max Health" "0" + "Regen Chance" "33.3" + "Regen Max Health" "0" + "Regen Mode" "2" } } "Tank #87" @@ -6831,6 +8071,12 @@ "Smoker Name" "Yeller Smoker" "Spitter Name" "Yeller Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Yeller Common" + "Witch Name" "Yeller Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -6901,6 +8147,12 @@ "Smoker Name" "Zombie Smoker" "Spitter Name" "Zombie Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Zombie Common" + "Witch Name" "Zombie Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -6939,19 +8191,19 @@ "Spitter Extra Health" "100" } } - "Zombie Ability" + "Panic Ability" { "Human Ability" "1" "Human Ammo" "2" "Human Duration" "6" - "Ability Enabled" "1" + "Ability Enabled" "2" "Ability Message" "1" - "Zombie Amount" "10" - "Zombie Chance" "33.3" - "Zombie Duration" "0" - "Zombie Interval" "5.0" - "Zombie Mode" "0" - "Zombie Type" "0" + "Panic Amount" "10" + "Panic Chance" "33.3" + "Panic Duration" "0" + "Panic Interval" "5.0" + "Panic Mode" "0" + "Panic Type" "0" } } /** @@ -6974,6 +8226,12 @@ "Smoker Name" "Armageddon Smoker" "Spitter Name" "Armageddon Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Armageddon Common" + "Witch Name" "Armageddon Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -7020,7 +8278,7 @@ "Gravity Ability" { "Ability Enabled" "2" - "Ability Message" "5" + "Ability Message" "4" "Gravity Flags" "8" "Gravity Force" "-50.0" } @@ -7053,6 +8311,12 @@ "Smoker Name" "Boss Smoker" "Spitter Name" "Boss Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Boss Common" + "Witch Name" "Boss Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -7080,6 +8344,7 @@ "Particles" { "Body Effects" "127" + "Body Chance" "100.0,100.0,100.0,100.0,100.0,33.3,100.0" "Rock Effects" "15" } "Health" @@ -7199,6 +8464,8 @@ "Smash Chance" "20.0" "Smash Hit" "1" "Smash Hit Mode" "0" + "Smash Mode" "1" + "Smash Type" "1" "Special" { "Smash Body" "0" @@ -7222,16 +8489,16 @@ "Witch Range" "500.0" "Witch Remove" "1" } - "Zombie Ability" + "Panic Ability" { - "Ability Enabled" "1" + "Ability Enabled" "2" "Ability Message" "1" - "Zombie Amount" "50" - "Zombie Chance" "33.3" - "Zombie Duration" "0" - "Zombie Interval" "50.0" - "Zombie Mode" "0" - "Zombie Type" "0" + "Panic Amount" "50" + "Panic Chance" "33.3" + "Panic Duration" "0" + "Panic Interval" "50.0" + "Panic Mode" "0" + "Panic Type" "0" } } "Tank #91" @@ -7250,6 +8517,12 @@ "Smoker Name" "Cobalt Smoker" "Spitter Name" "Cobalt Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Cobalt Common" + "Witch Name" "Cobalt Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -7329,6 +8602,12 @@ "Smoker Name" "Distraction Smoker" "Spitter Name" "Distraction Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Distraction Common" + "Witch Name" "Distraction Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -7413,6 +8692,12 @@ "Smoker Name" "Feedback Smoker" "Spitter Name" "Feedback Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Feedback Common" + "Witch Name" "Feedback Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -7465,7 +8750,7 @@ "Human Ability" "1" "Human Ammo" "2" "Ability Enabled" "2" - "Ability Message" "5" + "Ability Message" "4" "Gravity Flags" "8" "Gravity Force" "50.0" } @@ -7486,6 +8771,12 @@ "Smoker Name" "Flash Smoker" "Spitter Name" "Flash Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Flash Common" + "Witch Name" "Flash Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -7621,6 +8912,12 @@ "Smoker Name" "Goliath Smoker" "Spitter Name" "Goliath Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Goliath Common" + "Witch Name" "Goliath Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -7715,6 +9012,8 @@ "Smash Chance" "33.3" "Smash Hit" "1" "Smash Hit Mode" "0" + "Smash Mode" "1" + "Smash Type" "1" "Special" { "Smash Body" "0" @@ -7738,6 +9037,12 @@ "Smoker Name" "Hallucination Smoker" "Spitter Name" "Hallucination Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Hallucination Common" + "Witch Name" "Hallucination Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -7820,6 +9125,12 @@ "Smoker Name" "Meme Smoker" "Spitter Name" "Meme Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Meme Common" + "Witch Name" "Meme Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -7847,6 +9158,7 @@ "Particles" { "Body Effects" "127" + "Body Chance" "100.0,100.0,100.0,100.0,100.0,33.3,100.0" "Rock Effects" "15" } "Health" @@ -7947,19 +9259,22 @@ "Smash Chance" "20.0" "Smash Hit" "1" "Smash Hit Mode" "0" + "Smash Mode" "1" + "Smash Type" "1" "Special" { "Smash Body" "0" "Smash Meter" "50.0" } } - "Spam Ability" + "Rock Ability" { "Ability Enabled" "1" - "Spam Chance" "50.0" - "Spam Damage" "5" - "Spam Duration" "1" - "Spam Interval" "0.5" + "Rock Chance" "50.0" + "Rock Damage" "5" + "Rock Duration" "1" + "Rock Interval" "0.5" + "Rock Mode" "2" } "Warp Ability" { @@ -7978,16 +9293,16 @@ "Witch Range" "500.0" "Witch Remove" "1" } - "Zombie Ability" + "Panic Ability" { - "Ability Enabled" "1" + "Ability Enabled" "2" "Ability Message" "1" - "Zombie Amount" "50" - "Zombie Chance" "33.3" - "Zombie Duration" "0" - "Zombie Interval" "50.0" - "Zombie Mode" "0" - "Zombie Type" "0" + "Panic Amount" "50" + "Panic Chance" "33.3" + "Panic Duration" "0" + "Panic Interval" "50.0" + "Panic Mode" "0" + "Panic Type" "0" } } "Tank #98" @@ -8006,6 +9321,12 @@ "Smoker Name" "Mirage Smoker" "Spitter Name" "Mirage Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Mirage Common" + "Witch Name" "Mirage Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -8095,6 +9416,12 @@ "Smoker Name" "Poltergeist Smoker" "Spitter Name" "Poltergeist Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Poltergeist Common" + "Witch Name" "Poltergeist Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -8200,6 +9527,12 @@ "Smoker Name" "Psychotic Smoker" "Spitter Name" "Psychotic Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Psychotic Common" + "Witch Name" "Psychotic Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -8319,6 +9652,12 @@ "Smoker Name" "Reverse-Flash Smoker" "Spitter Name" "Reverse-Flash Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Reverse-Flash Common" + "Witch Name" "Reverse-Flash Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -8417,6 +9756,12 @@ "Smoker Name" "Spawner Smoker" "Spitter Name" "Spawner Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Spawner Common" + "Witch Name" "Spawner Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -8438,6 +9783,10 @@ "Particles" { "Body Effects" "32" + "Common" + { + "Body Chance" "100.0,100.0,100.0,100.0,100.0,33.3,100.0" + } } "Health" { @@ -8452,19 +9801,19 @@ "Spitter Extra Health" "100" } } - "Zombie Ability" + "Panic Ability" { "Human Ability" "1" "Human Ammo" "2" "Human Duration" "26" - "Ability Enabled" "1" + "Ability Enabled" "2" "Ability Message" "1" - "Zombie Amount" "25" - "Zombie Chance" "33.3" - "Zombie Duration" "0" - "Zombie Interval" "25.0" - "Zombie Mode" "0" - "Zombie Type" "0" + "Panic Amount" "25" + "Panic Chance" "33.3" + "Panic Duration" "0" + "Panic Interval" "25.0" + "Panic Mode" "0" + "Panic Type" "0" } } "Tank #103" @@ -8483,6 +9832,12 @@ "Smoker Name" "Zoom Smoker" "Spitter Name" "Zoom Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Zoom Common" + "Witch Name" "Zoom Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -8581,6 +9936,12 @@ "Smoker Name" "Trap Smoker" "Spitter Name" "Trap Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Trap Common" + "Witch Name" "Trap Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -8601,15 +9962,15 @@ } "Health" { - "Extra Health" "2000" + "Extra Health" "1000" "Special" { - "Boomer Extra Health" "200" - "Charger Extra Health" "200" - "Hunter Extra Health" "200" - "Jockey Extra Health" "200" - "Smoker Extra Health" "200" - "Spitter Extra Health" "200" + "Boomer Extra Health" "100" + "Charger Extra Health" "100" + "Hunter Extra Health" "100" + "Jockey Extra Health" "100" + "Smoker Extra Health" "100" + "Spitter Extra Health" "100" } } "Enhancements" @@ -8628,6 +9989,8 @@ "Smash Chance" "33.3" "Smash Hit" "1" "Smash Hit Mode" "0" + "Smash Mode" "1" + "Smash Type" "1" "Special" { "Smash Body" "0" @@ -8655,6 +10018,12 @@ "Smoker Name" "Dread Smoker" "Spitter Name" "Dread Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Dread Common" + "Witch Name" "Dread Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -8686,17 +10055,17 @@ "Spitter Extra Health" "100" } } - "Blind Ability" + "Vision Ability" { "Human Ability" "1" "Ability Effect" "7" "Ability Message" "1" - "Blind Chance" "33.3" - "Blind Duration" "7.5" - "Blind Hit" "1" - "Blind Hit Mode" "0" - "Blind Intensity" "235" - "Blind Mode" "0" + "Vision Chance" "33.3" + "Vision Duration" "7.5" + "Vision Hit" "1" + "Vision Hit Mode" "0" + "Vision Intensity" "235" + "Vision Mode" "1" } } "Tank #106" @@ -8715,6 +10084,12 @@ "Smoker Name" "Rabid Smoker" "Spitter Name" "Rabid Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Rabid Common" + "Witch Name" "Rabid Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -8776,6 +10151,7 @@ "Ability Message" "1" "Hurt Hit" "1" "Hurt Hit Mode" "0" + "Hurt Mode" "1" } } "Tank #107" @@ -8794,6 +10170,12 @@ "Smoker Name" "Tremor Smoker" "Spitter Name" "Tremor Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Tremor Common" + "Witch Name" "Tremor Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -8842,7 +10224,7 @@ "Combo Chance" "33.3,75.0" "Combo Damage" "1.0" "Combo Duration" "5.0" - "Combo Interval" "0.2" + "Combo Interval" "0.75" "Combo Radius" "-1.25;1.25" "Combo Set" "Rock,Track" "Combo Speed" "0.0,500.0" @@ -8856,6 +10238,11 @@ "Human Duration" "5" "Ability Enabled" "1" "Ability Message" "1" + "Rock Chance" "33.3" + "Rock Damage" "5" + "Rock Duration" "5" + "Rock Interval" "0.75" + "Rock Mode" "0" } "Track Ability" { @@ -8866,18 +10253,6 @@ "Ability Message" "1" "Track Mode" "1" } - "Spam Ability" - { - "Human Ability" "1" - "Human Ammo" "2" - "Human Duration" "5" - "Ability Enabled" "1" - "Ability Message" "1" - "Spam Chance" "33.3" - "Spam Damage" "5" - "Spam Duration" "5" - "Spam Interval" "0.5" - } } /** * This is the plugin developer's personal Tank. @@ -8899,6 +10274,12 @@ "Smoker Name" "Psyk0tik Smoker" "Spitter Name" "Psyk0tik Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Psyk0tik Common" + "Witch Name" "Psyk0tik Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -9027,6 +10408,12 @@ "Smoker Name" "Apocalyptic Smoker" "Spitter Name" "Apocalyptic Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Apocalyptic Common" + "Witch Name" "Apocalyptic Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -9112,6 +10499,7 @@ "Rock Damage" "10" "Rock Duration" "3" "Rock Interval" "0.2" + "Rock Mode" "1" "Rock Radius" "-5.0,5.0" } } @@ -9131,6 +10519,12 @@ "Smoker Name" "Darth Vader Smoker" "Spitter Name" "Darth Vader Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Darth Vader Common" + "Witch Name" "Darth Vader Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -9159,7 +10553,16 @@ } "Health" { - "Extra Health" "1500" + "Extra Health" "1000" + "Special" + { + "Boomer Extra Health" "100" + "Charger Extra Health" "100" + "Hunter Extra Health" "100" + "Jockey Extra Health" "100" + "Smoker Extra Health" "100" + "Spitter Extra Health" "100" + } } "Enhancements" { @@ -9228,6 +10631,12 @@ "Smoker Name" "Drug Addict Smoker" "Spitter Name" "Drug Addict Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Drug Addict Common" + "Witch Name" "Drug Addict Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -9256,18 +10665,22 @@ "Particles" { "Body Effects" "32" + "Common" + { + "Body Chance" "100.0,100.0,100.0,100.0,100.0,33.3,100.0" + } } "Health" { - "Extra Health" "2000" + "Extra Health" "1000" "Special" { - "Boomer Extra Health" "200" - "Charger Extra Health" "200" - "Hunter Extra Health" "200" - "Jockey Extra Health" "200" - "Smoker Extra Health" "200" - "Spitter Extra Health" "200" + "Boomer Extra Health" "100" + "Charger Extra Health" "100" + "Hunter Extra Health" "100" + "Jockey Extra Health" "100" + "Smoker Extra Health" "100" + "Spitter Extra Health" "100" } } "Drug Ability" @@ -9282,12 +10695,13 @@ "Drug Hit Mode" "0" "Drug Interval" "1.0" } - "Item Ability" + "Drop Ability" { - "Human Ability" "2" - "Item Pinata" "pain_pills,pain_pills,pain_pills,pain_pills,pain_pills" - "Item Pinata Body" "1" - "Item Pinata Chance" "100.0" + "Human Ability" "1" + "Ability Enabled" "2" + "Drop Pinata" "pain_pills,pain_pills,pain_pills,pain_pills,pain_pills" + "Drop Pinata Body" "1" + "Drop Pinata Chance" "100.0" } "Slow Ability" { @@ -9319,6 +10733,12 @@ "Smoker Name" "Godspeed Smoker" "Spitter Name" "Godspeed Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Godspeed Common" + "Witch Name" "Godspeed Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -9417,6 +10837,12 @@ "Smoker Name" "Grim Reaper Smoker" "Spitter Name" "Grim Reaper Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Grim Reaper Common" + "Witch Name" "Grim Reaper Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -9505,6 +10931,12 @@ "Smoker Name" "Horde Smoker" "Spitter Name" "Horde Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Horde Common" + "Witch Name" "Horde Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -9600,6 +11032,12 @@ "Smoker Name" "Hulk Smoker" "Spitter Name" "Hulk Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Hulk Common" + "Witch Name" "Hulk Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -9669,6 +11107,7 @@ "Ability Message" "1" "Hurt Hit" "1" "Hurt Hit Mode" "1" + "Hurt Mode" "1" } "Absorb Ability" { @@ -9685,15 +11124,16 @@ "Absorb Hittable Divisor" "20.0" "Absorb Melee Divisor" "200.0" } - "Shake Ability" + "Vision Ability" { "Human Ability" "1" "Ability Enabled" "1" "Ability Effect" "7" - "Shake Duration" "99999" - "Shake Interval" "1.0" - "Shake Range" "1000.0" - "Shake Range Chance" "100.0" + "Vision Duration" "99999" + "Vision Interval" "1.0" + "Vision Mode" "4" + "Vision Range" "1000.0" + "Vision Range Chance" "100.0" } "Smash Ability" { @@ -9704,6 +11144,8 @@ "Smash Chance" "15.0" "Smash Hit" "1" "Smash Hit Mode" "1" + "Smash Mode" "1" + "Smash Type" "1" "Special" { "Smash Body" "0" @@ -9727,6 +11169,12 @@ "Smoker Name" "Ninja Smoker" "Spitter Name" "Ninja Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Ninja Common" + "Witch Name" "Ninja Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -9838,6 +11286,12 @@ "Smoker Name" "Zen Smoker" "Spitter Name" "Zen Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Zen Common" + "Witch Name" "Zen Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -9933,6 +11387,12 @@ "Smoker Name" "The Boss (1st Form)" "Spitter Name" "The Boss (1st Form)" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "The Boss (1st Form)" + "Witch Name" "The Boss (1st Form)" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -10016,6 +11476,12 @@ "Smoker Name" "Steel Overlord (2nd Form)" "Spitter Name" "Steel Overlord (2nd Form)" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Steel Overlord (2nd Form)" + "Witch Name" "Steel Overlord (2nd Form)" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -10116,6 +11582,12 @@ "Smoker Name" "Night Stalker (3rd Form)" "Spitter Name" "Night Stalker (3rd Form)" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Night Stalker (3rd Form)" + "Witch Name" "Night Stalker (3rd Form)" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -10177,16 +11649,16 @@ { "Fire Immunity" "1" } - "Blind Ability" + "Vision Ability" { "Ability Effect" "7" "Ability Message" "1" - "Blind Chance" "100.0" - "Blind Duration" "5.0" - "Blind Hit" "1" - "Blind Hit Mode" "1" - "Blind Intensity" "255" - "Blind Mode" "0" + "Vision Chance" "100.0" + "Vision Duration" "5.0" + "Vision Hit" "1" + "Vision Hit Mode" "1" + "Vision Intensity" "255" + "Vision Mode" "1" } "Bomb Ability" { @@ -10236,6 +11708,12 @@ "Smoker Name" "Spirit of Fire (4th Form)" "Spitter Name" "Spirit of Fire (4th Form)" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Spirit of Fire (4th Form)" + "Witch Name" "Spirit of Fire (4th Form)" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -10367,6 +11845,12 @@ "Smoker Name" "Randomizer Smoker" "Spitter Name" "Randomizer Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Randomizer Common" + "Witch Name" "Randomizer Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -10440,6 +11924,12 @@ "Smoker Name" "Shapeshifter Smoker" "Spitter Name" "Shapeshifter Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Shapeshifter Common" + "Witch Name" "Shapeshifter Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -10503,6 +11993,12 @@ "Smoker Name" "Flashbanger Smoker" "Spitter Name" "Flashbanger Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Flashbanger Common" + "Witch Name" "Flashbanger Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -10541,26 +12037,26 @@ "Spitter Extra Health" "100" } } - "Blind Ability" + "Vision Ability" { "Human Ability" "1" "Human Ammo" "2" "Ability Enabled" "1" "Ability Effect" "7" "Ability Message" "1" - "Blind Chance" "33.3" - "Blind Duration" "5.0" - "Blind Hit" "1" - "Blind Hit Mode" "0" - "Blind Intensity" "255" - "Blind Mode" "1" - "Blind Range" "150.0" - "Blind Range Chance" "15.0" - "Blind Stagger" "3" - } - } - // The following sample showcases a certain type of the Splatter ability. - "Tank #125" + "Vision Chance" "33.3" + "Vision Duration" "5.0" + "Vision Hit" "1" + "Vision Hit Mode" "0" + "Vision Intensity" "255" + "Vision Mode" "2" + "Vision Range" "150.0" + "Vision Range Chance" "15.0" + "Vision Stagger" "3" + } + } + // The following sample showcases a certain type of the Splatter ability. + "Tank #125" { "General" { @@ -10577,6 +12073,12 @@ "Smoker Name" "Mudman Smoker" "Spitter Name" "Mudman Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Mudman Common" + "Witch Name" "Mudman Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -10616,21 +12118,22 @@ "Spitter Extra Health" "100" } } - "Splatter Ability" + "Vision Ability" { "Human Ability" "1" "Human Ammo" "2" "Ability Enabled" "1" "Ability Effect" "7" "Ability Message" "1" - "Splatter Chance" "33.3" - "Splatter Duration" "5" - "Splatter Hit" "1" - "Splatter Hit Mode" "0" - "Splatter Interval" "1.0" - "Splatter Range" "150.0" - "Splatter Range Chance" "15.0" - "Splatter Type" "14" + "Vision Chance" "33.3" + "Vision Duration" "5.0" + "Vision Hit" "1" + "Vision Hit Mode" "0" + "Vision Interval" "1.0" + "Vision Mode" "8" + "Vision Range" "150.0" + "Vision Range Chance" "15.0" + "Vision Type" "14" } } // The following samples are impossible to beat and only serve as annoyances or fatal threats. @@ -10650,6 +12153,12 @@ "Smoker Name" "Endgame Smoker" "Spitter Name" "Endgame Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Endgame Common" + "Witch Name" "Endgame Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -10696,6 +12205,13 @@ "Fast Duration" "99999" "Fast Speed" "10.0" } + "Gravity Ability" + { + "Ability Enabled" "2" + "Ability Message" "4" + "Gravity Flags" "8" + "Gravity Force" "-100.0" + } "Smash Ability" { "Human Ability" "1" @@ -10705,6 +12221,8 @@ "Smash Chance" "100.0" "Smash Hit" "1" "Smash Hit Mode" "1" + "Smash Mode" "1" + "Smash Type" "1" "Special" { "Smash Body" "0" @@ -10728,6 +12246,12 @@ "Smoker Name" "Playful Smoker" "Spitter Name" "Playful Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Playful Common" + "Witch Name" "Playful Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -10789,6 +12313,12 @@ "Smoker Name" "Annoying Smoker" "Spitter Name" "Annoying Spitter" } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Annoying Common" + "Witch Name" "Annoying Witch" + } "Tank Enabled" "-1" "Tank Chance" "100.0" "Tank Note" "1" @@ -10821,13 +12351,2005 @@ { "Human Ability" "1" "Human Ammo" "99999" - "Ability Enabled" "1" + "Ability Enabled" "2" "Ability Message" "1" "Respawn Amount" "99999" "Respawn Chance" "100.0" "Respawn Type" "128-128" } } + "Tank #129" + { + "General" + { + "Tank Name" "Sipow Tank" + "Special" + { + "Special Types" "-1" + "Special Note" "-1" + "Boomer Name" "Sipow Boomer" + "Charger Name" "Sipow Charger" + "Hunter Name" "Sipow Hunter" + "Jockey Name" "Sipow Jockey" + "Smoker Name" "Sipow Smoker" + "Spitter Name" "Sipow Spitter" + } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Sipow Common" + "Witch Name" "Sipow Witch" + } + "Tank Enabled" "-1" + "Tank Chance" "100.0" + "Tank Note" "1" + "Skin Color" "50,125,255,255" + } + "Glow" + { + "Glow Enabled" "1" + "Glow Color" "255,175,0" + } + "Human Support" + { + "Human Support" "1" + } + "Props" + { + "Light Color" "255,175,0,255" + "Oxygen Tank Color" "255,175,0,255" + "Flame Color" "255,175,0,180" + "Rock Color" "255,175,0,255" + "Tire Color" "255,175,0,255" + "Propane Tank Color" "255,175,0,255" + "Flashlight Color" "255,175,0,255" + "Crown Color" "255,175,0,255" + } + "Particles" + { + "Body Effects" "80" + "Rock Effects" "8" + } + "Health" + { + "Extra Health" "1000" + "Special" + { + "Boomer Extra Health" "100" + "Charger Extra Health" "100" + "Hunter Extra Health" "100" + "Jockey Extra Health" "100" + "Smoker Extra Health" "100" + "Spitter Extra Health" "100" + } + } + "Enhancements" + { + "Throw Interval" "10.0" + "Run Speed" "1.33" + } + "Immunities" + { + "Explosive Immunity" "1" + "Fire Immunity" "1" + } + "Acid Ability" + { + "Human Ability" "1" + "Human Ammo" "2" + "Ability Enabled" "1" + "Ability Effect" "7" + "Ability Message" "5" + "Acid Chance" "33.3" + "Acid Cooldown" "3" + "Acid Damage" "3.0" + "Acid Death" "1" + "Acid Death Chance" "33.3" + "Acid Death Range" "200.0" + "Acid Hit" "1" + "Acid Hit Mode" "0" + "Acid Range" "150.0" + "Acid Range Chance" "15.0" + "Acid Rock Break" "1" + "Acid Rock Chance" "33.3" + "Special" + { + "Acid Cooldown" "3" + "Acid Damage" "1.0" + } + } + "Meteor Ability" + { + "Human Ability" "1" + "Human Ammo" "1" + "Human Duration" "5" + "Ability Enabled" "1" + "Ability Message" "1" + "Meteor Chance" "15.0" + "Meteor Duration" "5" + "Meteor Interval" "0.6" + "Meteor Lifetime" "15.0" + "Meteor Mode" "0" + "Meteor Radius" "-180.0,180.0" + } + } + "Tank #130" + { + "General" + { + "Tank Name" "Evil Tank" + "Special" + { + "Special Types" "-1" + "Special Note" "-1" + "Boomer Name" "Evil Boomer" + "Charger Name" "Evil Charger" + "Hunter Name" "Evil Hunter" + "Jockey Name" "Evil Jockey" + "Smoker Name" "Evil Smoker" + "Spitter Name" "Evil Spitter" + } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Evil Common" + "Witch Name" "Evil Witch" + } + "Tank Enabled" "-1" + "Tank Chance" "100.0" + "Tank Note" "1" + "Skin Color" "170,20,60,255" + } + "Glow" + { + "Glow Enabled" "1" + "Glow Color" "0,0,140" + } + "Human Support" + { + "Human Support" "1" + } + "Props" + { + "Props Attached" "124" + "Light Color" "0,0,140,255" + "Oxygen Tank Color" "0,0,140,255" + "Flame Color" "0,0,140,180" + "Rock Color" "0,0,140,255" + "Tire Color" "0,0,140,255" + "Propane Tank Color" "0,0,140,255" + "Flashlight Color" "0,0,140,255" + "Crown Color" "0,0,140,255" + } + "Health" + { + "Extra Health" "1000" + "Special" + { + "Boomer Extra Health" "100" + "Charger Extra Health" "100" + "Hunter Extra Health" "100" + "Jockey Extra Health" "100" + "Smoker Extra Health" "100" + "Spitter Extra Health" "100" + } + } + "Fire Ability" + { + "Ability Effect" "7" + "Ability Message" "1" + "Fire Chance" "100.0" + "Fire Cooldown" "3" + "Fire Damage" "0.5" + "Fire Hit" "1" + "Fire Hit Mode" "0" + "Special" + { + "Fire Cooldown" "3" + "Fire Damage" "0.25" + } + } + "Ice Ability" + { + "Ability Effect" "7" + "Ability Message" "1" + "Ice Chance" "100.0" + "Ice Cooldown" "3" + "Ice Hit" "1" + "Ice Hit Mode" "0" + "Special" + { + "Ice Cooldown" "3" + } + } + "Medic Ability" + { + "Human Ability" "1" + "Human Ammo" "2" + "Human Duration" "6" + "Ability Enabled" "1" + "Ability Message" "1" + "Medic Chance" "100.0" + "Medic Duration" "0" + "Medic Field" "1" + "Medic Field Color" "0,255,0" + "Medic Health" "25,25,25,25,25,25,100" + "Medic Interval" "1.0" + "Medic Max Health" "250,50,250,100,325,600,10000" + "Medic Range" "500.0" + } + "Respawn Ability" + { + "Human Ability" "1" + "Human Ammo" "2" + "Human Duration" "5" + "Ability Enabled" "1" + "Ability Message" "1" + "Respawn Chance" "100.0" + "Respawn Duration" "0" + "Respawn Filter" "0" + "Respawn Range" "500.0" + } + } + "Tank #131" + { + "General" + { + "Tank Name" "Officer Tank" + "Special" + { + "Special Types" "-1" + "Special Note" "-1" + "Boomer Name" "Officer Boomer" + "Charger Name" "Officer Charger" + "Hunter Name" "Officer Hunter" + "Jockey Name" "Officer Jockey" + "Smoker Name" "Officer Smoker" + "Spitter Name" "Officer Spitter" + } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Officer Common" + "Witch Name" "Officer Witch" + } + "Tank Enabled" "-1" + "Tank Chance" "100.0" + "Tank Note" "1" + "Skin Color" "100,100,100,255" + } + "Glow" + { + "Glow Enabled" "1" + "Glow Color" "100,100,100" + } + "Human Support" + { + "Human Support" "1" + } + "Spawn" + { + "Open Areas Only" "150.0" + } + "Props" + { + "Props Attached" "242" // L4D1: 194 + "Light Color" "0,0,255,255" + "Rock Color" "0,0,0,255" + "Tire Color" "100,100,100,255" + "Propane Tank Color" "0,0,0,255" + "Flashlight Color" "255,0,0,255" + } + "Health" + { + "Extra Health" "1000" + "Special" + { + "Boomer Extra Health" "100" + "Charger Extra Health" "100" + "Hunter Extra Health" "100" + "Jockey Extra Health" "100" + "Smoker Extra Health" "100" + "Spitter Extra Health" "100" + } + } + "Drop Ability" + { + "Human Ability" "1" + "Ability Enabled" "1" + "Ability Message" "1" + "Drop Chance" "100.0" + "Drop Mode" "2" + "Drop Weapon Boost" "1.15" + "Drop Weapon Name" "tonfa" + "Drop Weapon Resistance" "0.85" + "Drop Weapon Scale" "1.0" + } + "Gunner Ability" + { + "Human Ability" "1" + "Human Ammo" "2" + "Ability Enabled" "1" + "Ability Message" "1" + "Gunner Accuracy" "2.0" + "Gunner Bullets" "5" + "Gunner Chance" "100.0" + "Gunner Clip Size" "10" + "Gunner Damage" "5.0" + "Gunner Duration" "99999.0" + "Gunner Gun Type" "3" + "Gunner Interval" "1.0" + "Gunner Load Time" "1.0" + "Gunner Range" "500.0" + "Gunner Reaction Time" "1.0" + "Gunner Target Type" "7" + "Special" + { + "Gunner Clip Size" "15" + "Gunner Damage" "1.0" + "Gunner Gun Type" "1" + "Gunner Target Type" "7" + } + } + "Minion Ability" + { + "Human Ability" "1" + "Human Ammo" "2" + "Ability Enabled" "1" + "Ability Message" "1" + "Minion Amount" "4" + "Minion Chance" "100.0" + "Minion Filter" "0" + "Minion Lifetime" "0.0" + "Minion Remove" "1" + "Minion Replace" "1" + "Minion Type" "131-131" + } + "Panic Ability" + { + "Special" + { + "Human Ability" "1" + "Human Ammo" "2" + "Ability Enabled" "2" + "Ability Message" "1" + "Panic Amount" "1" + "Panic Chance" "100.0" + "Panic Duration" "0" + "Panic Interval" "5.0" + "Panic Mode" "2" + "Panic Type" "64" + } + } + } + "Tank #132" + { + "General" + { + "Tank Name" "Mafia Tank" + "Special" + { + "Special Types" "-1" + "Special Note" "-1" + "Boomer Name" "Mafia Boomer" + "Charger Name" "Mafia Charger" + "Hunter Name" "Mafia Hunter" + "Jockey Name" "Mafia Jockey" + "Smoker Name" "Mafia Smoker" + "Spitter Name" "Mafia Spitter" + } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Mafia Common" + "Witch Name" "Mafia Witch" + } + "Tank Enabled" "-1" + "Tank Chance" "100.0" + "Tank Note" "1" + "Skin Color" "180,0,180,255" + } + "Glow" + { + "Glow Enabled" "1" + "Glow Color" "180,0,180" + } + "Human Support" + { + "Human Support" "1" + } + "Spawn" + { + "Open Areas Only" "500.0" + } + "Props" + { + "Props Attached" "0" + } + "Health" + { + "Extra Health" "1000" + "Special" + { + "Boomer Extra Health" "100" + "Charger Extra Health" "100" + "Hunter Extra Health" "100" + "Jockey Extra Health" "100" + "Smoker Extra Health" "100" + "Spitter Extra Health" "100" + } + } + "Enhancements" + { + "Run Speed" "2.5" + } + "Clone Ability" + { + "Human Ability" "1" + "Human Ammo" "2" + "Ability Enabled" "1" + "Ability Message" "1" + "Clone Amount" "2" + "Clone Chance" "100.0" + "Clone Health" "1500" + "Clone Lifetime" "0.0" + "Clone Remove" "0" + "Clone Replace" "1" + "Clone Swap" "0.0" + "Clone Type" "132-132" + "Special" + { + "Clone Health" "150" + } + } + "Smash Ability" + { + "Ability Effect" "7" + "Ability Message" "1" + "Smash Body" "1" + "Smash Chance" "33.0" + "Smash Hit" "1" + "Smash Hit Mode" "1" + "Smash Mode" "1" + "Smash Type" "1" + "Special" + { + "Smash Body" "0" + "Smash Meter" "50.0" + } + } + } + "Tank #133" + { + "General" + { + "Tank Name" "Frankenstein Tank" + "Special" + { + "Special Types" "-1" + "Special Note" "-1" + "Boomer Name" "Frankenstein Boomer" + "Charger Name" "Frankenstein Charger" + "Hunter Name" "Frankenstein Hunter" + "Jockey Name" "Frankenstein Jockey" + "Smoker Name" "Frankenstein Smoker" + "Spitter Name" "Frankenstein Spitter" + } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Frankenstein Common" + "Witch Name" "Frankenstein Witch" + } + "Tank Enabled" "-1" + "Tank Chance" "100.0" + "Tank Note" "1" + "Skin Color" "85,125,75,255" + } + "Glow" + { + "Glow Enabled" "1" + "Glow Color" "85,125,75" + } + "Human Support" + { + "Human Support" "1" + } + "Props" + { + "Props Attached" "16" // L4D1: 0 + "Rock Color" "100,100,100,255" + } + "Health" + { + "Extra Health" "1000" + "Special" + { + "Boomer Extra Health" "100" + "Charger Extra Health" "100" + "Hunter Extra Health" "100" + "Jockey Extra Health" "100" + "Smoker Extra Health" "100" + "Spitter Extra Health" "100" + } + } + "Enhancements" + { + "Claw Damage" "1.0" + "Hittable Damage" "1.0" + "Rock Damage" "1.0" + "Run Speed" "0.65" + } + "Ghost Ability" + { + "Ability Effect" "7" + "Ability Message" "1" + "Ghost Hit" "1" + "Ghost Hit Mode" "0" + "Ghost Weapon Slots" "28" + } + "Jump Ability" + { + "Ability Enabled" "2" + "Ability Message" "4" + "Jump Mode" "1" + "Jump Sporadic Chance" "33.3" + "Jump Sporadic Height" "750.0" + } + "Undead Ability" + { + "Human Ability" "1" + "Human Ammo" "2" + "Ability Enabled" "1" + "Ability Message" "1" + "Undead Amount" "2" + "Undead Chance" "100.0" + } + "Warp Ability" + { + "Ability Enabled" "2" + "Ability Message" "4" + "Warp Interval" "10.0" + } + } + "Tank #134" + { + "General" + { + "Tank Name" "Prototype Tank" + "Special" + { + "Special Types" "-1" + "Special Note" "-1" + "Boomer Name" "Prototype Boomer" + "Charger Name" "Prototype Charger" + "Hunter Name" "Prototype Hunter" + "Jockey Name" "Prototype Jockey" + "Smoker Name" "Prototype Smoker" + "Spitter Name" "Prototype Spitter" + } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Prototype Common" + "Witch Name" "Prototype Witch" + } + "Tank Enabled" "-1" + "Tank Chance" "100.0" + "Tank Note" "1" + "Skin Color" "75,75,75,255" + } + "Glow" + { + "Glow Enabled" "1" + "Glow Color" "255,25,55" + } + "Human Support" + { + "Human Support" "1" + } + "Props" + { + "Props Attached" "18" // L4D1: 2 + "Light Color" "255,25,55,255" + "Rock Color" "255,25,55,255" + } + "Health" + { + "Extra Health" "1000" + "Special" + { + "Boomer Extra Health" "100" + "Charger Extra Health" "100" + "Hunter Extra Health" "100" + "Jockey Extra Health" "100" + "Smoker Extra Health" "100" + "Spitter Extra Health" "100" + } + } + "Absorb Ability" + { + "Human Ability" "1" + "Human Ammo" "2" + "Human Duration" "99999" + "Ability Enabled" "1" + "Ability Message" "1" + "Absorb Bullet Divisor" "20.0" + "Absorb Chance" "100.0" + "Absorb Duration" "99999" + "Absorb Explosive Divisor" "20.0" + "Absorb Fire Divisor" "200.0" + "Absorb Hittable Divisor" "20.0" + "Absorb Melee Divisor" "200.0" + } + "Smash Ability" + { + "Ability Effect" "7" + "Ability Message" "1" + "Smash Body" "1" + "Smash Chance" "33.3" + "Smash Hit" "1" + "Smash Hit Mode" "0" + "Smash Mode" "1" + "Smash Remove" "1" + "Smash Type" "1" + "Special" + { + "Smash Body" "0" + "Smash Meter" "50.0" + } + } + "Omni Ability" + { + "Requires Humans" "0" + "Human Ability" "1" + "Human Ammo" "3" + "Human Duration" "5" + "Ability Enabled" "1" + "Ability Message" "1" + "Omni Chance" "33.3" + "Omni Duration" "5" + "Omni Mode" "0" + "Omni Range" "500.0" + } + "Respawn Ability" + { + "Human Ability" "1" + "Human Ammo" "1" + "Ability Enabled" "2" + "Ability Message" "1" + "Respawn Amount" "2" + "Respawn Chance" "100.0" + "Respawn Type" "134-134" + } + } + "Tank #135" + { + "General" + { + "Tank Name" "Zeus Tank" + "Special" + { + "Special Types" "-1" + "Special Note" "-1" + "Boomer Name" "Zeus Boomer" + "Charger Name" "Zeus Charger" + "Hunter Name" "Zeus Hunter" + "Jockey Name" "Zeus Jockey" + "Smoker Name" "Zeus Smoker" + "Spitter Name" "Zeus Spitter" + } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Zeus Common" + "Witch Name" "Zeus Witch" + } + "Tank Enabled" "-1" + "Tank Chance" "100.0" + "Tank Note" "1" + "Skin Color" "175,40,255,255" + } + "Glow" + { + "Glow Enabled" "1" + "Glow Color" "0,100,155" + } + "Human Support" + { + "Human Support" "1" + } + "Spawn" + { + "Open Areas Only" "500.0" + } + "Props" + { + "Props Attached" "272" // L4D1: 224 + "Rock Color" "0,100,155,255" + "Crown Color" "0,100,155,255" + } + "Particles" + { + "Body Effects" "2" + "Rock Effects" "2" + } + "Health" + { + "Extra Health" "1000" + "Special" + { + "Boomer Extra Health" "100" + "Charger Extra Health" "100" + "Hunter Extra Health" "100" + "Jockey Extra Health" "100" + "Smoker Extra Health" "100" + "Spitter Extra Health" "100" + } + } + "Immunities" + { + "Fire Immunity" "1" + } + "Electric Ability" + { + "Human Ability" "1" + "Human Ammo" "2" + "Ability Enabled" "1" + "Ability Effect" "7" + "Ability Message" "7" + "Electric Chance" "66.6" + "Electric Damage" "5.0" + "Electric Duration" "5" + "Electric Hit" "1" + "Electric Hit Mode" "0" + "Electric Interval" "1.0" + "Electric Range" "150.0" + "Electric Range Chance" "30.0" + } + "Lightning Ability" + { + "Ability Enabled" "1" + "Ability Message" "1" + "Lightning Chance" "100.0" + "Lightning Damage" "5" + "Lightning Duration" "99999" + "Lightning Interval" "0.5" + } + "Smash Ability" + { + "Ability Effect" "7" + "Ability Message" "1" + "Smash Body" "1" + "Smash Chance" "15.0" + "Smash Hit" "1" + "Smash Hit Mode" "1" + "Smash Mode" "4" + "Smash Type" "1" + "Special" + { + "Smash Body" "0" + "Smash Meter" "50.0" + } + } + "Warp Ability" + { + "Ability Enabled" "2" + "Ability Message" "4" + "Warp Interval" "7.5" + } + } + "Tank #136" + { + "General" + { + "Tank Name" "Trajectory Tank" + "Special" + { + "Special Types" "-1" + "Special Note" "-1" + "Boomer Name" "Trajectory Boomer" + "Charger Name" "Trajectory Charger" + "Hunter Name" "Trajectory Hunter" + "Jockey Name" "Trajectory Jockey" + "Smoker Name" "Trajectory Smoker" + "Spitter Name" "Trajectory Spitter" + } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Trajectory Common" + "Witch Name" "Trajectory Witch" + } + "Tank Enabled" "-1" + "Tank Chance" "100.0" + "Tank Note" "1" + "Skin Color" "255,150,75,255" + } + "Glow" + { + "Glow Enabled" "1" + "Glow Color" "55,150,125" + } + "Human Support" + { + "Human Support" "1" + } + "Props" + { + "Light Color" "55,150,125,255" + "Oxygen Tank Color" "55,150,125,255" + "Flame Color" "55,150,125,180" + "Rock Color" "55,150,125,255" + "Tire Color" "55,150,125,255" + "Propane Tank Color" "55,150,125,255" + "Flashlight Color" "55,150,125,255" + "Crown Color" "55,150,125,255" + } + "Health" + { + "Extra Health" "1000" + "Special" + { + "Boomer Extra Health" "100" + "Charger Extra Health" "100" + "Hunter Extra Health" "100" + "Jockey Extra Health" "100" + "Smoker Extra Health" "100" + "Spitter Extra Health" "100" + } + } + "Fast Ability" + { + "Human Ability" "1" + "Human Ammo" "2" + "Human Duration" "99999" + "Ability Enabled" "1" + "Ability Message" "1" + "Fast Chance" "100.0" + "Fast Duration" "99999" + "Fast Speed" "5.0" + } + "Jump Ability" + { + "Human Ability" "1" + "Human Ammo" "2" + "Human Duration" "5" + "Ability Enabled" "3" + "Ability Effect" "7" + "Ability Message" "7" + "Jump Chance" "33.3" + "Jump Duration" "5" + "Jump Height" "300.0" + "Jump Hit" "1" + "Jump Hit Mode" "0" + "Jump Mode" "1" + "Jump Range" "150.0" + "Jump Range Chance" "15.0" + "Jump Sporadic Chance" "33.3" + "Jump Sporadic Height" "750.0" + } + "Warp Ability" + { + "Human Ability" "1" + "Human Ammo" "2" + "Human Duration" "10" + "Ability Enabled" "2" + "Ability Message" "4" + "Warp Duration" "0" + "Warp Interval" "7.5" + } + } + "Tank #137" + { + "General" + { + "Tank Name" "Barrage Tank" + "Special" + { + "Special Types" "-1" + "Special Note" "-1" + "Boomer Name" "Barrage Boomer" + "Charger Name" "Barrage Charger" + "Hunter Name" "Barrage Hunter" + "Jockey Name" "Barrage Jockey" + "Smoker Name" "Barrage Smoker" + "Spitter Name" "Barrage Spitter" + } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Barrage Common" + "Witch Name" "Barrage Witch" + } + "Tank Enabled" "-1" + "Tank Chance" "100.0" + "Tank Note" "1" + "Skin Color" "150,80,125,255" + } + "Glow" + { + "Glow Enabled" "1" + "Glow Color" "40,80,165" + } + "Human Support" + { + "Human Support" "1" + } + "Spawn" + { + "Open Areas Only" "500.0" + } + "Props" + { + "Light Color" "40,80,165,255" + "Oxygen Tank Color" "40,80,165,255" + "Flame Color" "40,80,165,180" + "Rock Color" "40,80,165,255" + "Tire Color" "40,80,165,255" + "Propane Tank Color" "40,80,165,255" + "Flashlight Color" "40,80,165,255" + "Crown Color" "40,80,165,255" + } + "Health" + { + "Extra Health" "1000" + "Special" + { + "Boomer Extra Health" "100" + "Charger Extra Health" "100" + "Hunter Extra Health" "100" + "Jockey Extra Health" "100" + "Smoker Extra Health" "100" + "Spitter Extra Health" "100" + } + } + "Meteor Ability" + { + "Human Ability" "1" + "Human Ammo" "1" + "Human Cooldown" "0" + "Ability Enabled" "1" + "Ability Message" "1" + "Meteor Chance" "100.0" + "Meteor Duration" "99999" + "Meteor Interval" "0.6" + "Meteor Lifetime" "15.0" + "Meteor Mode" "1" + "Meteor Radius" "-180.0,180.0" + } + "Regen Ability" + { + "Human Ability" "1" + "Human Ammo" "2" + "Human Duration" "99999" + "Ability Enabled" "1" + "Ability Effect" "4" + "Ability Message" "1" + "Regen Chance" "100.0" + "Regen Duration" "0" + "Regen Health" "200" + "Regen Interval" "1.0" + "Regen Limit" "4000" + "Regen Range" "500.0" + "Special" + { + "Regen Health" "20" + "Regen Limit" "400" + "Regen Range" "150.0" + } + } + "Rock Ability" + { + "Requires Humans" "0" + "Human Ability" "1" + "Human Ammo" "2" + "Human Duration" "99999" + "Ability Enabled" "1" + "Ability Message" "1" + "Rock Chance" "100.0" + "Rock Damage" "5" + "Rock Duration" "99999" + "Rock Interval" "0.75" + "Rock Mode" "0" + "Rock Radius" "-5.0,5.0" + } + "Shove Ability" + { + "Ability Effect" "7" + "Ability Message" "1" + "Shove Chance" "66.6" + "Shove Duration" "5" + "Shove Hit" "1" + "Shove Hit Mode" "1" + "Shove Interval" "1.0" + } + } + "Tank #138" + { + "General" + { + "Tank Name" "Collector Tank" + "Special" + { + "Special Types" "-1" + "Special Note" "-1" + "Boomer Name" "Collector Boomer" + "Charger Name" "Collector Charger" + "Hunter Name" "Collector Hunter" + "Jockey Name" "Collector Jockey" + "Smoker Name" "Collector Smoker" + "Spitter Name" "Collector Spitter" + } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Collector Common" + "Witch Name" "Collector Witch" + } + "Tank Enabled" "-1" + "Tank Chance" "100.0" + "Tank Note" "1" + "Skin Color" "255,70,165,255" + } + "Glow" + { + "Glow Enabled" "1" + "Glow Color" "255,70,165" + } + "Human Support" + { + "Human Support" "1" + } + "Spawn" + { + "Open Areas Only" "500.0" + } + "Props" + { + "Props Attached" "0" + } + "Health" + { + "Extra Health" "1000" + "Special" + { + "Boomer Extra Health" "100" + "Charger Extra Health" "100" + "Hunter Extra Health" "100" + "Jockey Extra Health" "100" + "Smoker Extra Health" "100" + "Spitter Extra Health" "100" + } + } + "Choke Ability" + { + "Ability Effect" "7" + "Ability Message" "1" + "Choke Block" "1" + "Choke Chance" "100.0" + "Choke Damage" "1.0" + "Choke Delay" "1.0" + "Choke Duration" "99999" + "Choke Hit" "1" + "Choke Hit Mode" "1" + } + "Gravity Ability" + { + "Ability Enabled" "2" + "Ability Message" "4" + "Gravity Flags" "8" + "Gravity Force" "-50.0" + } + } + "Tank #139" + { + "General" + { + "Tank Name" "Timewalker Tank" + "Special" + { + "Special Types" "-1" + "Special Note" "-1" + "Boomer Name" "Timewalker Boomer" + "Charger Name" "Timewalker Charger" + "Hunter Name" "Timewalker Hunter" + "Jockey Name" "Timewalker Jockey" + "Smoker Name" "Timewalker Smoker" + "Spitter Name" "Timewalker Spitter" + } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Timewalker Common" + "Witch Name" "Timewalker Witch" + } + "Tank Enabled" "-1" + "Tank Chance" "100.0" + "Tank Note" "1" + "Skin Color" "0,200,255,255" + } + "Glow" + { + "Glow Enabled" "1" + "Glow Color" "0,200,255" + } + "Human Support" + { + "Human Support" "1" + } + "Props" + { + "Props Attached" "0" + } + "Health" + { + "Extra Health" "1000" + "Special" + { + "Boomer Extra Health" "100" + "Charger Extra Health" "100" + "Hunter Extra Health" "100" + "Jockey Extra Health" "100" + "Smoker Extra Health" "100" + "Spitter Extra Health" "100" + } + } + "Clone Ability" + { + "Human Ability" "1" + "Human Ammo" "2" + "Ability Enabled" "1" + "Ability Message" "1" + "Clone Amount" "2" + "Clone Chance" "100.0" + "Clone Health" "1000" + "Clone Lifetime" "10.0" + "Clone Remove" "0" + "Clone Replace" "1" + "Clone Swap" "5.0" + "Clone Type" "139-139" + "Special" + { + "Clone Health" "100" + } + } + "Fast Ability" + { + "Human Ability" "1" + "Human Ammo" "2" + "Human Duration" "3" + "Ability Enabled" "1" + "Ability Message" "1" + "Fast Chance" "33.3" + "Fast Duration" "3" + "Fast Speed" "10.0" + } + "Ghost Ability" + { + "Ability Effect" "7" + "Ability Message" "1" + "Ghost Chance" "15.0" + "Ghost Hit" "1" + "Ghost Hit Mode" "0" + "Ghost Weapon Slots" "28" + } + "Recall Ability" + { + "Human Ability" "1" + "Human Ammo" "5" + "Ability Enabled" "3" + "Ability Message" "1" + "Recall Blink Chance" "0.0" + "Recall Blink Count" "0" + "Recall Rewind Chance" "100.0" + "Recall Rewind Cleanse" "1" + "Recall Rewind Cooldown" "5" + "Recall Rewind Lifetime" "10" + "Recall Rewind Mode" "0" + "Recall Rewind Threshold" "1.0" + } + "Undead Ability" + { + "Human Ability" "1" + "Human Ammo" "2" + "Ability Enabled" "1" + "Ability Message" "1" + "Undead Amount" "2" + "Undead Chance" "100.0" + } + "Warp Ability" + { + "Ability Enabled" "2" + "Ability Message" "4" + "Warp Interval" "10.0" + } + } + "Tank #140" + { + "General" + { + "Tank Name" "Speed Demon Tank" + "Special" + { + "Special Types" "-1" + "Special Note" "-1" + "Boomer Name" "Speed Demon Boomer" + "Charger Name" "Speed Demon Charger" + "Hunter Name" "Speed Demon Hunter" + "Jockey Name" "Speed Demon Jockey" + "Smoker Name" "Speed Demon Smoker" + "Spitter Name" "Speed Demon Spitter" + } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Speed Demon Common" + "Witch Name" "Speed Demon Witch" + } + "Tank Enabled" "-1" + "Tank Chance" "100.0" + "Tank Note" "1" + "Skin Color" "100,0,0,255" + } + "Glow" + { + "Glow Enabled" "1" + "Glow Color" "255,200,60" + } + "Human Support" + { + "Human Support" "1" + } + "Props" + { + "Light Color" "255,200,60,255" + "Oxygen Tank Color" "255,200,60,255" + "Flame Color" "255,200,60,180" + "Rock Color" "255,200,60,255" + "Tire Color" "255,200,60,255" + "Propane Tank Color" "255,200,60,255" + "Flashlight Color" "255,200,60,255" + "Crown Color" "255,200,60,255" + } + "Particles" + { + "Body Effects" "4" + "Rock Effects" "4" + } + "Health" + { + "Extra Health" "1000" + "Special" + { + "Boomer Extra Health" "100" + "Charger Extra Health" "100" + "Hunter Extra Health" "100" + "Jockey Extra Health" "100" + "Smoker Extra Health" "100" + "Spitter Extra Health" "100" + } + } + "Enhancements" + { + "Run Speed" "1.0" + } + "Fast Ability" + { + "Human Ability" "1" + "Human Ammo" "2" + "Human Duration" "3" + "Ability Enabled" "1" + "Ability Message" "1" + "Fast Chance" "33.3" + "Fast Duration" "3" + "Fast Speed" "10.0" + } + "Fire Ability" + { + "Ability Effect" "7" + "Ability Message" "1" + "Fire Chance" "100.0" + "Fire Cooldown" "3" + "Fire Damage" "0.5" + "Fire Hit" "1" + "Fire Hit Mode" "0" + "Special" + { + "Fire Cooldown" "3" + "Fire Damage" "0.25" + } + } + "Pyro Ability" + { + "Human Ability" "1" + "Human Ammo" "2" + "Human Duration" "3" + "Ability Enabled" "1" + "Ability Message" "1" + "Pyro Chance" "33.3" + "Pyro Damage Boost" "2.0" + "Pyro Duration" "3" + "Pyro Fire Divisor" "1.0" + "Pyro Mode" "0" + "Pyro Reignite" "1" + "Pyro Speed Boost" "9.0" + "Special" + { + "Pyro Fire Divisor" "400.0" + } + } + "Slow Ability" + { + "Ability Enabled" "1" + "Ability Effect" "7" + "Ability Message" "2" + "Slow Chance" "100.0" + "Slow Duration" "99999.0" + "Slow Range" "500.0" + "Slow Range Chance" "100.0" + "Slow Speed" "0.65" + } + } + "Tank #141" + { + "General" + { + "Tank Name" "Ravager Tank" + "Special" + { + "Special Types" "-1" + "Special Note" "-1" + "Boomer Name" "Ravager Boomer" + "Charger Name" "Ravager Charger" + "Hunter Name" "Ravager Hunter" + "Jockey Name" "Ravager Jockey" + "Smoker Name" "Ravager Smoker" + "Spitter Name" "Ravager Spitter" + } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Ravager Common" + "Witch Name" "Ravager Witch" + } + "Tank Enabled" "-1" + "Tank Chance" "100.0" + "Tank Note" "1" + "Skin Color" "240,20,60,255" + } + "Glow" + { + "Glow Enabled" "1" + "Glow Color" "75,100,90" + } + "Human Support" + { + "Human Support" "1" + } + "Spawn" + { + "Open Areas Only" "500.0" + } + "Props" + { + "Light Color" "75,100,90,255" + "Oxygen Tank Color" "75,100,90,255" + "Flame Color" "75,100,90,180" + "Rock Color" "75,100,90,255" + "Tire Color" "75,100,90,255" + "Propane Tank Color" "75,100,90,255" + "Flashlight Color" "75,100,90,255" + "Crown Color" "75,100,90,255" + } + "Health" + { + "Extra Health" "1000" + "Special" + { + "Boomer Extra Health" "100" + "Charger Extra Health" "100" + "Hunter Extra Health" "100" + "Jockey Extra Health" "100" + "Smoker Extra Health" "100" + "Spitter Extra Health" "100" + } + } + "Bomb Ability" + { + "Human Ability" "1" + "Ability Message" "4" + "Bomb Rock Break" "1" + "Bomb Rock Chance" "100.0" + } + "Rock Ability" + { + "Requires Humans" "0" + "Human Ability" "1" + "Human Ammo" "2" + "Human Duration" "99999" + "Ability Enabled" "1" + "Ability Message" "1" + "Rock Chance" "100.0" + "Rock Damage" "5" + "Rock Duration" "99999" + "Rock Interval" "1.5" + "Rock Mode" "0" + "Rock Radius" "-5.0,5.0" + } + } + "Tank #142" + { + "General" + { + "Tank Name" "Ramattra Tank" + "Special" + { + "Special Types" "-1" + "Special Note" "-1" + "Boomer Name" "Ramattra Boomer" + "Charger Name" "Ramattra Charger" + "Hunter Name" "Ramattra Hunter" + "Jockey Name" "Ramattra Jockey" + "Smoker Name" "Ramattra Smoker" + "Spitter Name" "Ramattra Spitter" + } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Ramattra Common" + "Witch Name" "Ramattra Witch" + } + "Tank Enabled" "-1" + "Tank Chance" "100.0" + "Tank Note" "1" + "Skin Color" "35,35,35,255" + } + "Glow" + { + "Glow Enabled" "1" + "Glow Color" "160,80,255" + } + "Human Support" + { + "Human Support" "1" + } + "Props" + { + "Props Attached" "380" + "Light Color" "160,80,255,255" + "Oxygen Tank Color" "185,180,135,255" + "Flame Color" "160,80,255,180" + "Rock Color" "185,180,135,255" + "Tire Color" "185,180,135,255" + "Propane Tank Color" "255,255,255,255" + "Flashlight Color" "160,80,255,255" + "Crown Color" "160,80,255,255" + } + "Health" + { + "Extra Health" "1000" + "Special" + { + "Boomer Extra Health" "100" + "Charger Extra Health" "100" + "Hunter Extra Health" "100" + "Jockey Extra Health" "100" + "Smoker Extra Health" "100" + "Spitter Extra Health" "100" + } + } + "Absorb Ability" + { + "Requires Humans" "0" + "Human Ability" "1" + "Human Ammo" "2" + "Human Duration" "5" + "Ability Enabled" "1" + "Ability Message" "1" + "Absorb Bullet Divisor" "20.0" + "Absorb Chance" "15.0" + "Absorb Convert Percentage" "0.0" + "Absorb Duration" "10" + "Absorb Explosive Divisor" "20.0" + "Absorb Fire Divisor" "200.0" + "Absorb Hittable Divisor" "20.0" + "Absorb Melee Divisor" "200.0" + } + "Regen Ability" + { + "Human Ability" "1" + "Human Ammo" "2" + "Human Duration" "5" + "Ability Enabled" "1" + "Ability Effect" "4" + "Ability Message" "1" + "Ability Sight" "1" + "Regen Chance" "100.0" + "Regen Duration" "0" + "Regen Health" "1" + "Regen Interval" "1.0" + "Regen Limit" "1000000" + "Regen Range" "500.0" + "Special" + { + "Regen Limit" "100000" + "Regen Range" "150.0" + } + } + "Shield Ability" + { + "Requires Humans" "0" + "Human Ability" "1" + "Ability Enabled" "1" + "Ability Message" "1" + "Shield Chance" "15.0" + "Shield Convert Percentage" "0.2" + "Shield Color" "160,80,255,50" + "Shield Delay" "10" + "Shield Display Health" "11" + "Shield Display Health Type" "2" + "Shield Duration" "0" + "Shield Health" "250.0" + "Shield Health Characters" "],=" + "Shield Type" "15" + "Special" + { + "Shield Health" "100.0" + } + } + "Slow Ability" + { + "Ability Enabled" "1" + "Ability Effect" "7" + "Ability Message" "2" + "Ability Sight" "1" + "Slow Chance" "100.0" + "Slow Duration" "99999.0" + "Slow Range" "500.0" + "Slow Range Chance" "100.0" + "Slow Speed" "0.4" + } + } + "Tank #143" + { + "General" + { + "Tank Name" "Sigma Tank" + "Special" + { + "Special Types" "-1" + "Special Note" "-1" + "Boomer Name" "Sigma Boomer" + "Charger Name" "Sigma Charger" + "Hunter Name" "Sigma Hunter" + "Jockey Name" "Sigma Jockey" + "Smoker Name" "Sigma Smoker" + "Spitter Name" "Sigma Spitter" + } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Sigma Common" + "Witch Name" "Sigma Witch" + } + "Tank Enabled" "-1" + "Tank Chance" "100.0" + "Tank Note" "1" + "Skin Color" "80,80,80,255" + } + "Glow" + { + "Glow Enabled" "1" + "Glow Color" "130,130,180" + } + "Human Support" + { + "Human Support" "1" + } + "Props" + { + "Props Attached" "124" + "Light Color" "130,130,180,255" + "Oxygen Tank Color" "65,200,170,255" + "Flame Color" "130,130,180,180" + "Rock Color" "65,200,170,255" + "Tire Color" "65,200,170,255" + "Propane Tank Color" "60,0,110,255" + "Flashlight Color" "130,130,180,255" + "Crown Color" "130,130,180,255" + } + "Health" + { + "Extra Health" "1000" + "Special" + { + "Boomer Extra Health" "100" + "Charger Extra Health" "100" + "Hunter Extra Health" "100" + "Jockey Extra Health" "100" + "Smoker Extra Health" "100" + "Spitter Extra Health" "100" + } + } + "Absorb Ability" + { + "Requires Humans" "0" + "Human Ability" "1" + "Human Ammo" "2" + "Human Duration" "5" + "Ability Enabled" "1" + "Ability Message" "1" + "Absorb Bullet Divisor" "20.0" + "Absorb Chance" "15.0" + "Absorb Convert Percentage" "0.75" + "Absorb Duration" "10" + "Absorb Explosive Divisor" "20.0" + "Absorb Fire Divisor" "200.0" + "Absorb Hittable Divisor" "20.0" + "Absorb Melee Divisor" "200.0" + } + "Choke Ability" + { + "Human Ability" "1" + "Human Ammo" "2" + "Ability Enabled" "1" + "Ability Effect" "7" + "Ability Message" "3" + "Ability Sight" "1" + "Choke Block" "0" + "Choke Chance" "33.3" + "Choke Damage" "10.0" + "Choke Delay" "0.5" + "Choke Duration" "3" + "Choke Hit" "1" + "Choke Hit Mode" "0" + "Choke Range" "150.0" + "Choke Range Chance" "15.0" + } + "Gravity Ability" + { + "Human Ability" "1" + "Ability Enabled" "2" + "Ability Message" "4" + "Gravity Flags" "8" + "Gravity Force" "-25.0" + } + "Shield Ability" + { + "Requires Humans" "0" + "Human Ability" "1" + "Ability Enabled" "1" + "Ability Message" "1" + "Shield Chance" "15.0" + "Shield Convert Percentage" "0.15" + "Shield Color" "130,130,180,50" + "Shield Delay" "10" + "Shield Display Health" "11" + "Shield Display Health Type" "2" + "Shield Duration" "0" + "Shield Health" "700.0" + "Shield Health Characters" "],=" + "Shield Type" "15" + "Special" + { + "Shield Health" "70.0" + } + } + } + "Tank #144" + { + "General" + { + "Tank Name" "Zarya Tank" + "Special" + { + "Special Types" "-1" + "Special Note" "-1" + "Boomer Name" "Zarya Boomer" + "Charger Name" "Zarya Charger" + "Hunter Name" "Zarya Hunter" + "Jockey Name" "Zarya Jockey" + "Smoker Name" "Zarya Smoker" + "Spitter Name" "Zarya Spitter" + } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Zarya Common" + "Witch Name" "Zarya Witch" + } + "Tank Enabled" "-1" + "Tank Chance" "100.0" + "Tank Note" "1" + "Skin Color" "55,110,255,255" + } + "Glow" + { + "Glow Enabled" "1" + "Glow Color" "255,130,255" + } + "Human Support" + { + "Human Support" "1" + } + "Props" + { + "Props Attached" "0" + } + "Health" + { + "Extra Health" "1000" + "Special" + { + "Boomer Extra Health" "100" + "Charger Extra Health" "100" + "Hunter Extra Health" "100" + "Jockey Extra Health" "100" + "Smoker Extra Health" "100" + "Spitter Extra Health" "100" + } + } + "Enhancements" + { + "Run Speed" "0.65" + } + "Absorb Ability" + { + "Requires Humans" "0" + "Human Ability" "1" + "Human Ammo" "2" + "Human Duration" "5" + "Ability Enabled" "1" + "Ability Message" "1" + "Absorb Bullet Divisor" "20.0" + "Absorb Chance" "15.0" + "Absorb Convert Percentage" "0.75" + "Absorb Duration" "10" + "Absorb Explosive Divisor" "20.0" + "Absorb Fire Divisor" "200.0" + "Absorb Hittable Divisor" "20.0" + "Absorb Melee Divisor" "200.0" + } + "Gravity Ability" + { + "Human Ability" "1" + "Ability Enabled" "2" + "Ability Message" "4" + "Gravity Flags" "8" + "Gravity Force" "-25.0" + } + "Shield Ability" + { + "Requires Humans" "0" + "Human Ability" "1" + "Ability Enabled" "1" + "Ability Message" "1" + "Shield Chance" "15.0" + "Shield Convert Percentage" "0.15" + "Shield Color" "255,130,255,50" + "Shield Delay" "15" + "Shield Display Health" "11" + "Shield Display Health Type" "2" + "Shield Duration" "5" + "Shield Health" "225.0" + "Shield Health Characters" "],=" + "Shield Type" "15" + "Special" + { + "Shield Health" "22.5" + } + } + } + // The following samples are for punishing rushers/slackers. + "Tank #145" + { + "General" + { + "Tank Name" "Slacker Tank" + "Special" + { + "Special Types" "-1" + "Special Note" "-1" + "Boomer Name" "Slacker Boomer" + "Charger Name" "Slacker Charger" + "Hunter Name" "Slacker Hunter" + "Jockey Name" "Slacker Jockey" + "Smoker Name" "Slacker Smoker" + "Spitter Name" "Slacker Spitter" + } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Slacker Common" + "Witch Name" "Slacker Witch" + } + "Tank Enabled" "-1" + "Tank Chance" "100.0" + "Tank Note" "0" + "Skin Color" "100,100,100,255" + "Spawn Enabled" "0" + } + "Announcements" + { + "Announce Arrival" "0" + "Announce Death" "0" + "Announce Kill" "0" + "Arrival Message" "0" + "Arrival Sound" "0" + "Death Details" "0" + "Death Message" "0" + "Death Sound" "0" + "Kill Message" "0" + "Vocalize Arrival" "0" + "Vocalize Death" "0" + } + "Props" + { + "Props Attached" "0" + } + "Health" + { + "Base Health" "1000000" + "Display Health" "0" + "Display Health Type" "0" + "Special" + { + "Boomer Base Health" "100000" + "Charger Base Health" "100000" + "Hunter Base Health" "100000" + "Jockey Base Health" "100000" + "Smoker Base Health" "100000" + "Spitter Base Health" "100000" + } + } + "Enhancements" + { + "Attack Interval" "0.1" + "Intangible Body" "1" + "Punch Throw" "0.0" + "Skip Taunt" "1" + } + "Fast Ability" + { + "Human Ability" "2" + "Human Ammo" "2" + "Human Duration" "99999" + "Ability Enabled" "1" + "Ability Message" "0" + "Fast Chance" "100.0" + "Fast Dash" "5.0" + "Fast Dash Chance" "50.0" + "Fast Dash Range" "150.0" + "Fast Duration" "99999" + "Fast Speed" "10.0" + } + "Gravity Ability" + { + "Ability Enabled" "2" + "Ability Message" "0" + "Gravity Flags" "8" + "Gravity Force" "-100.0" + } + "Warp Ability" + { + "Human Ability" "2" + "Ability Effect" "7" + "Ability Message" "0" + "Warp Chance" "100.0" + "Warp Hit" "1" + "Warp Hit Mode" "1" + } + } + "Tank #146" + { + "General" + { + "Tank Name" "Rusher Tank" + "Special" + { + "Special Types" "-1" + "Special Note" "-1" + "Boomer Name" "Rusher Boomer" + "Charger Name" "Rusher Charger" + "Hunter Name" "Rusher Hunter" + "Jockey Name" "Rusher Jockey" + "Smoker Name" "Rusher Smoker" + "Spitter Name" "Rusher Spitter" + } + "Mob" + { + "Mob Variants" "-1" + "Common Name" "Rusher Common" + "Witch Name" "Rusher Witch" + } + "Tank Enabled" "-1" + "Tank Chance" "100.0" + "Tank Note" "0" + "Skin Color" "150,0,0,255" + "Spawn Enabled" "0" + } + "Announcements" + { + "Announce Arrival" "0" + "Announce Death" "0" + "Announce Kill" "0" + "Arrival Message" "0" + "Arrival Sound" "0" + "Death Details" "0" + "Death Message" "0" + "Death Sound" "0" + "Kill Message" "0" + "Vocalize Arrival" "0" + "Vocalize Death" "0" + } + "Props" + { + "Props Attached" "0" + } + "Health" + { + "Base Health" "1000000" + "Display Health" "0" + "Display Health Type" "0" + "Special" + { + "Boomer Base Health" "100000" + "Charger Base Health" "100000" + "Hunter Base Health" "100000" + "Jockey Base Health" "100000" + "Smoker Base Health" "100000" + "Spitter Base Health" "100000" + } + } + "Enhancements" + { + "Attack Interval" "0.1" + "Intangible Body" "1" + "Punch Throw" "0.0" + "Skip Taunt" "1" + } + "Fast Ability" + { + "Human Ability" "2" + "Human Ammo" "2" + "Human Duration" "99999" + "Ability Enabled" "1" + "Ability Message" "0" + "Fast Chance" "100.0" + "Fast Dash" "5.0" + "Fast Dash Chance" "50.0" + "Fast Dash Range" "150.0" + "Fast Duration" "99999" + "Fast Speed" "10.0" + } + "Gravity Ability" + { + "Ability Enabled" "2" + "Ability Message" "0" + "Gravity Flags" "8" + "Gravity Force" "-100.0" + } + "Fire Ability" + { + "Human Ability" "2" + "Ability Effect" "7" + "Ability Message" "0" + "Fire Chance" "100.0" + "Fire Hit" "1" + "Fire Hit Mode" "1" + } + "Ice Ability" + { + "Human Ability" "2" + "Ability Effect" "7" + "Ability Message" "0" + "Ice Chance" "100.0" + "Ice Duration" "5.0" + "Ice Hit" "1" + "Ice Hit Mode" "1" + } + } /** * Create your own Mutant Tanks below! * Start your imagination here! diff --git a/addons/sourcemod/gamedata/mutant_tanks.txt b/addons/sourcemod/gamedata/mutant_tanks.txt index 68efe3be3b..82349c9bf2 100644 --- a/addons/sourcemod/gamedata/mutant_tanks.txt +++ b/addons/sourcemod/gamedata/mutant_tanks.txt @@ -2377,7 +2377,7 @@ } /** - * CBaseAbility::CreateForPlayer(CTerrorPlayer *) + * CBaseAbility::CreateForPlayer(CTerrorPlayer*) * * How to find on Windows: * 1. Search for any of the following strings: @@ -5624,7 +5624,7 @@ } /** - * CBaseAbility::CreateForPlayer(CTerrorPlayer *) + * CBaseAbility::CreateForPlayer(CTerrorPlayer*) * * How to find on Windows: * 1. Search for any of the following strings: @@ -5915,6 +5915,25 @@ /* ? ? ? ? ? ? 53 56 57 8B ? ? 85 ? 74 ? 8B ? 8B 90 */ } + /** + * CGrenadeLauncher::LaunchGrenade(CTerrorPlayer*) + * + * Note: Used for calling the function. + * + * How to find on Windows: + * 1. Search for the "CGrenadeLauncher_Projectile spawned at %f %f %f, velocity %f %f %f\n" string. + * 2. The string can only be found in "CGrenadeLauncher_Projectile::Create". + * 3. The only function that calls "CGrenadeLauncher_Projectile::Create" should be this function. + **/ + "CGrenadeLauncher::LaunchGrenade" + { + "library" "server" + "linux" "@_ZN16CGrenadeLauncher13LaunchGrenadeEP13CTerrorPlayer" + "mac" "@_ZN16CGrenadeLauncher13LaunchGrenadeEP13CTerrorPlayer" + "windows" "\x2A\x2A\x2A\x2A\x2A\x2A\x83\x2A\x2A\x83\x2A\x2A\x55\x8B\x2A\x2A\x89\x2A\x2A\x2A\x8B\x2A\x81\xEC\x2A\x2A\x2A\x2A\xA1\x2A\x2A\x2A\x2A\x33\x2A\x89\x2A\x2A\x56\x8B\x2A\x2A\x57\x8B\x2A\x8D" + /* ? ? ? ? ? ? 83 ? ? 83 ? ? 55 8B ? ? 89 ? ? ? 8B ? 81 EC ? ? ? ? A1 ? ? ? ? 33 ? 89 ? ? 56 8B ? ? 57 8B ? 8D */ + } + /** * CPipeBombProjectile::Create(Vector const&, QAngle const&, Vector const&, Vector const&, CBaseCombatCharacter *, float) * diff --git a/addons/sourcemod/mutant_tanks_updater.txt b/addons/sourcemod/mutant_tanks_updater.txt index aa078221d6..3d5a5d7b05 100644 --- a/addons/sourcemod/mutant_tanks_updater.txt +++ b/addons/sourcemod/mutant_tanks_updater.txt @@ -4,43 +4,384 @@ { "Version" { - "Latest" "9.2" - "Previous" "9.1" + "Latest" "9.3" + "Previous" "9.2" } "Notes" "AlliedModders forum thread: https://forums.alliedmods.net/showthread.php?t=302140" "Notes" "GitHub repository: https://github.com/Psykotikism/Mutant_Tanks" - "Notes" "Release date: 9-10-2024" - "Notes" "Changes in v9.2:" + "Notes" "Release date: 1-1-2025" + "Notes" "Changes in v9.3:" "Notes" "Bug Fixes:" "Notes" "Core Plugin:" - "Notes" "- Fixed the looping heartbeat sound effect after reviving a survivor multiple times." + "Notes" "- Fixed the \"Tank Rush\" feature enforcing several convars' default values while disabled. (Thanks to \"xcd222\" for reporting!)" + "Notes" "- Fixed Mutant Infected's healthbars sometimes displaying the wrong name." "Notes" "Abilities:" - "Notes" "- Fixed the \"* Pin\", \"* Pin Chance\", and \"* Pin Cooldown\" settings not working for the following abilities:" - "Notes" " - Acid" - "Notes" " - Bomb" - "Notes" " - Fire" - "Notes" " - Gravity" - "Notes" " - Medic" - "Notes" " - Warp" - "Notes" "- Bury: Fixed the looping heartbeat sound effect after reviving a survivor multiple times. (Thanks to \"Dudus1st\" for reporting!)" - "Notes" "- Throw: Fixed thrown special infected not having any velocity. (Thanks to \"Mi.Cura\" for testing and reporting!)" + "Notes" "- Medic: Fixed the ability affecting the Mutant Infected who triggers it." "Notes" "Changes:" + "Notes" "General:" + "Notes" "- Dead survivors can now respawn into random combinations of Mutant types." + "Notes" " - The mutation continues to evolve and aims to devour everyone..." + "Notes" "- Common infected can now combine their bio mass to turn into random Mutant types." + "Notes" " - The mutation continues to evolve and use people as resources..." + "Notes" "- Witches can now turn other infected into random Mutant Types." + "Notes" " - The mutation continues to evolve and use any means to multiply..." + "Notes" "Core Plugin:" + "Notes" "- Improved the mutant spawner to respect the \"* Chance\" setting for each mutant type. (Thanks to \"maclarens\" for suggesting!)" + "Notes" "- Added a \"Punishment\" system for punishing rushers/slackers. (Thanks to \"Silvers\" for the code!)" + "Notes" "- Added a \"Passives\" system for adding buffs/debuffs to survivors and weapons." + "Notes" "ConVars:" + "Notes" "- Added the \"mt_graphicslevel\" convar." + "Notes" "Config Files:" + "Notes" "- Added the following default Mutant Tank types:" + "Notes" " - \"Sipow Tank\"" + "Notes" " - \"Evil Tank\"" + "Notes" " - \"Officer Tank\"" + "Notes" " - \"Mafia Tank\"" + "Notes" " - \"Frankenstein Tank\"" + "Notes" " - \"Prototype Tank\"" + "Notes" " - \"Zeus Tank\"" + "Notes" " - \"Trajectory Tank\"" + "Notes" " - \"Barrage Tank\"" + "Notes" " - \"Collector Tank\"" + "Notes" " - \"Timewalker Tank\"" + "Notes" " - \"Speed Demon Tank\"" + "Notes" " - \"Ramattra Tank\"" + "Notes" " - \"Sigma Tank\"" + "Notes" " - \"Zarya Tank\"" + "Notes" " - \"Slacker Tank\"" + "Notes" " - \"Rusher Tank\"" "Notes" "Game Data:" - "Notes" "- L4D1: Updated some offsets for the \"1.0.4.3\" update." - "Notes" "- L4D2: Updated some signatures and offsets for the \"2.2.3.5\" update." + "Notes" "- Added a signature for the \"CGrenadeLauncher::LaunchGrenade\" function. (L4D2)" + "Notes" "Settings:" + "Notes" "- Added the following settings under the \"Plugin Settings->General\" section:" + "Notes" " - \"Graphics Level\"" + "Notes" " - \"Tank Chance\"" + "Notes" " - \"Tank Note\"" + "Notes" " - \"Special Chance\"" + "Notes" " - \"Special Note\"" + "Notes" "- Added the following settings under the \"Plugin Settings->Punishment\" section:" + "Notes" " - \"Punish Enabled\"" + "Notes" " - \"Punish Bots\"" + "Notes" " - \"Finale Check\"" + "Notes" " - \"Punisher Types\"" + "Notes" " - \"Punisher Lifetime\"" + "Notes" " - \"Warning Distance\"" + "Notes" " - \"Punish Distance\"" + "Notes" " - \"Warning Limit\"" + "Notes" " - \"Warning Interval\"" + "Notes" " - \"Survivor Types\"" + "Notes" " - \"Survivors Required\"" + "Notes" " - \"Incaps Required\"" + "Notes" " - \"Zed Time\"" + "Notes" "- Added the following settings under the \"Plugin Settings->Survivors\" section:" + "Notes" " - \"Carrier Enabled\"" + "Notes" " - \"Carrier Bots\"" + "Notes" " - \"Carrier Body\"" + "Notes" " - \"Carrier Chance\"" + "Notes" " - \"Carrier Cleanse\"" + "Notes" " - \"Carrier Damage Multiplier\"" + "Notes" " - \"Carrier Delay\"" + "Notes" " - \"Carrier Filter\"" + "Notes" " - \"Carrier Health Multiplier\"" + "Notes" " - \"Carrier Infection\"" + "Notes" " - \"Carrier Mix\"" + "Notes" " - \"Carrier Mode\"" + "Notes" " - \"Carrier Teleport\"" + "Notes" " - \"Carrier Type\"" + "Notes" " - \"Carrier Voice\"" + "Notes" " - \"Carrier Voice Chance\"" + "Notes" " - \"Carrier Voice Interval\"" + "Notes" " - \"Carrier Attack Voicelines\"" + "Notes" " - \"Carrier Bait Voicelines\"" + "Notes" " - \"Weapon Character\"" + "Notes" " - \"Weapon Index\"" + "Notes" " - \"Weapon Name\"" + "Notes" " - \"Stack Passives\"" + "Notes" " - \"Passive Enabled\"" + "Notes" " - \"Passive Bots\"" + "Notes" " - \"Passive Notify\"" + "Notes" " - \"Action Duration Passive\"" + "Notes" " - \"Adrenaline Time Passive\"" + "Notes" " - \"Ammo Boost Passive\"" + "Notes" " - \"Ammo Refill Passive\"" + "Notes" " - \"Ammo Regen Passive\"" + "Notes" " - \"Attack Boost Passive\"" + "Notes" " - \"Blaze Health Passive\"" + "Notes" " - \"Blood Donor Passive\"" + "Notes" " - \"Bunny Hop Passive\"" + "Notes" " - \"Burst Doors Passive\"" + "Notes" " - \"Clean Kills Passive\"" + "Notes" " - \"Cluster Bombs Passive\"" + "Notes" " - \"Damage Boost Passive\"" + "Notes" " - \"Damage Resistance Passive\"" + "Notes" " - \"Dopamine Radius Passive\"" + "Notes" " - \"Eternal Flames Passive\"" + "Notes" " - \"Fast Recovery Passive\"" + "Notes" " - \"Fire Rate Passive\"" + "Notes" " - \"Friendly Fire Passive\"" + "Notes" " - \"Ghost Bullets Passive\"" + "Notes" " - \"Grenade Launcher Passive\" (Thanks to \"epzminion\" for the code!)" + "Notes" " - \"Heal Percent Passive\"" + "Notes" " - \"Healthcare Radius Passive\"" + "Notes" " - \"Health Regen Passive\"" + "Notes" " - \"Heartbeat Passive\"" + "Notes" " - \"Hollowpoint Ammo Passive\"" + "Notes" " - \"Infinite Ammo Passive\"" + "Notes" " - \"Item Passive\"" + "Notes" " - \"Jump Height Passive\"" + "Notes" " - \"Ladder Actions Passive\"" + "Notes" " - \"Lady Killer Passive\"" + "Notes" " - \"Laser Sight Passive\"" + "Notes" " - \"Life Leech Passive\"" + "Notes" " - \"Lucky Bullet Passive\"" + "Notes" " - \"Medical Cuts Passive\"" + "Notes" " - \"Melee Range Passive\"" + "Notes" " - \"Midair Dashes Passive\"" + "Notes" " - \"Motivation Radius Passive\"" + "Notes" " - \"Overdose Radius Passive\"" + "Notes" " - \"Overhealth Passive\"" + "Notes" " - \"Pipebomb Duration Passive\"" + "Notes" " - \"Punch Resistance Passive\"" + "Notes" " - \"Rapid Pistol Passive\"" + "Notes" " - \"Recoil Dampener Passive\"" + "Notes" " - \"Refill Percent Passive\"" + "Notes" " - \"Regen Bursts Passive\"" + "Notes" " - \"Reload Rate Passive\"" + "Notes" " - \"Respawn Loadout Passive\"" + "Notes" " - \"Revive Health Passive\"" + "Notes" " - \"Riot Gear Passive\"" + "Notes" " - \"Safety Bubble Passive\"" + "Notes" " - \"Shockwave Radius Passive\"" + "Notes" " - \"Shove Damage Passive\"" + "Notes" " - \"Shove Penalty Passive\"" + "Notes" " - \"Shove Rate Passive\"" + "Notes" " - \"Sledgehammer Rounds Passive\"" + "Notes" " - \"Special Ammo Passive\"" + "Notes" " - \"Speed Boost Passive\"" + "Notes" " - \"Sticky Grenades Passive\"" + "Notes" " - \"Supplier Passive\"" + "Notes" " - \"Swing Rate Passive\"" + "Notes" " - \"Syringe Darts Passive\"" + "Notes" " - \"Thorns Passive\"" + "Notes" "- Divided the \"Attack Boost Reward\" setting into several settings:" + "Notes" " - \"Attack Boost Reward\"" + "Notes" " - \"Fire Rate Reward\"" + "Notes" " - \"Reload Rate Reward\"" + "Notes" " - \"Swing Rate Reward\"" + "Notes" "- Changed the following settings to now take in values to determine the chance of activating their corresponding rewards:" + "Notes" " - \"Hollowpoint Ammo Reward\"" + "Notes" " - \"Sledgehammer Rounds Reward\"" + "Notes" "- Changed the \"Lady Killer Reward\" setting to now take in a value to determine the percentage of reserved ammo taken for its corresponding reward." + "Notes" "- Renamed the \"Inextinguishable Fire Reward\" setting to \"Eternal Flames Reward\"." + "Notes" "- Added the following settings under the \"Plugin Settings->Rewards\", \"Tank #->Rewards\", and \"STEAM_ID->Rewards\" sections:" + "Notes" " - \"Adrenaline Time Reward\"" + "Notes" " - \"Ammo Refill Reward\"" + "Notes" " - \"Blood Donor Reward\"" + "Notes" " - \"Dopamine Radius Reward\"" + "Notes" " - \"Fast Recovery Reward\"" + "Notes" " - \"Grenade Launcher Reward\" (Thanks to \"epzminion\" for the code!)" + "Notes" " - \"Healthcare Radius Reward\"" + "Notes" " - \"Heartbeat Reward\"" + "Notes" " - \"Lucky Bullet Reward\"" + "Notes" " - \"Motivation Radius Reward\"" + "Notes" " - \"Overdose Radius Reward\"" + "Notes" " - \"Overhealth Reward\"" + "Notes" " - \"Riot Gear Reward\"" + "Notes" " - \"Safety Bubble Reward\"" + "Notes" " - \"Shockwave Radius Reward\"" + "Notes" " - \"Supplier Reward\"" + "Notes" "- Added the \"Classes\" section under the \"Plugin Settings\" section which allows to group mutant types into classes." + "Notes" "- Added the \"Bunny Hop\" setting under the \"Plugin Settings->Enhancements\", \"Tank #->Enhancements\", and \"STEAM_ID->Enhancements\" sections. (Requested by \"xcd222\".)" + "Notes" "- Added the following settings under the \"Plugin Settings->Size\" section (Thanks to \"panxiaohai\" for the code!):" + "Notes" " - \"Infected Chance\"" + "Notes" " - \"Infected Damage\"" + "Notes" " - \"Infected Health\"" + "Notes" " - \"Infected Scale\"" + "Notes" " - \"Jockey Chance\"" + "Notes" " - \"Jockey Damage\"" + "Notes" " - \"Jockey Health\"" + "Notes" " - \"Jockey Scale\"" + "Notes" " - \"Witch Chance\"" + "Notes" " - \"Witch Damage\"" + "Notes" " - \"Witch Health\"" + "Notes" " - \"Witch Scale\"" + "Notes" "- Added the following settings under the \"Tank #->Particles\", and \"STEAM_ID->Particles\" sections:" + "Notes" " - \"Body Chance\"" + "Notes" " - \"Rock Chance\"" + "Notes" "- Added the following settings under the \"Plugin Settings->Health\", \"Tank #->Health\", and \"STEAM_ID->Health\" sections:" + "Notes" " - \"Armor Characters\"" + "Notes" " - \"Armor Percentage\"" + "Notes" " - \"Armor Resistance\"" + "Notes" " - \"Shield Characters\"" + "Notes" " - \"Shield Percentage\"" + "Notes" " - \"Shield Rate\"" + "Notes" " - \"Passive Delay\"" + "Notes" " - \"Passive Health\"" + "Notes" " - \"Passive Interval\"" + "Notes" "- Added the \"Tank Class\" setting under the \"Tank #->General\" section." + "Notes" "- Added the following settings for Mutant Special Infected:" + "Notes" " - \"Boomer Class\"" + "Notes" " - \"Charger Class\"" + "Notes" " - \"Hunter Class\"" + "Notes" " - \"Jockey Class\"" + "Notes" " - \"Smoker Class\"" + "Notes" " - \"Spitter Class\"" + "Notes" "- Added the following settings for Mutant Mob Infected:" + "Notes" " - \"Mob Variants\"" + "Notes" " - \"Common Bio Chance\"" + "Notes" " - \"Common Chance\"" + "Notes" " - \"Common Check\"" + "Notes" " - \"Common Damage Points\"" + "Notes" " - \"Common Death Points\"" + "Notes" " - \"Common Filter\"" + "Notes" " - \"Common Goal\"" + "Notes" " - \"Common Name\"" + "Notes" " - \"Common Variant\"" + "Notes" " - \"Witch Chance\"" + "Notes" " - \"Witch Filter\"" + "Notes" " - \"Witch Mode\"" + "Notes" " - \"Witch Mutate Chance\"" + "Notes" " - \"Witch Name\"" + "Notes" " - \"Witch Range\"" + "Notes" " - \"Witch Types\"" + "Notes" " - \"Skin Color\"" + "Notes" " - \"Display Health\"" + "Notes" " - \"Display Health Type\"" + "Notes" " - \"Health Characters\"" + "Notes" " - \"Body Effects\"" + "Notes" " - \"Glow Color\"" + "Notes" " - \"Glow Enabled\"" + "Notes" " - \"Glow Flashing\"" + "Notes" " - \"Glow Range\"" + "Notes" " - \"Glow Type\"" + "Notes" "Translations:" + "Notes" "- Updated English translations." + "Notes" "- Updated Simplified Chinese translations. (Thanks to \"yuzumi\"!)" + "Notes" "- Updated Hungarian translations. (Thanks to \"KasperH\"/\"Ladis\"!)" + "Notes" "- Updated Russian translations. (Thanks to \"Blueberry\"/\"Kleiner\"!)" + "Notes" "Natives & Forwards:" + "Notes" "- Added the \"MT_OnToggleSurvivorPassive\" forward." + "Notes" "- Added the \"MT_GetGraphicsLevel\" native." + "Notes" "- Added the \"MT_DoesSurvivorHavePassiveType\" native." + "Notes" "- The \"MT_SpawnTank\" native now has a third parameter." "Notes" "Abilities:" - "Notes" "- Gravity: Added the \"Gravity Mode\" setting." + "Notes" "- Combined the following abilities:" + "Notes" " - \"Cloud\"<->\"Splash\" (Use \"Cloud Remove\" to toggle \"Cloud\".)" + "Notes" " - \"Drop\"<->\"Item\" (Use \"Ability Enabled\" to choose between \"Drop\" and \"Item\".)" + "Notes" " - \"Hurt\"<->\"Pimp\" (Use \"Hurt Mode\" to choose between \"Hurt\" and \"Pimp\".)" + "Notes" " - \"Medic\"<->\"Hit\" (Use \"Medic Hit Group\" to toggle \"Hit\".)" + "Notes" " - \"Panic\"<->\"Zombie\" (Use \"Ability Enabled\" to choose between \"Panic\" and \"Zombie\".)" + "Notes" " - \"Regen\"<->\"Leech\"<->\"Vampire\"<->\"Xiphos\" (Use \"Ability Enabled\" to toggle \"Regen/Leech\"; use \"Regen Mode\" to choose between \"Vampire\" and \"Xiphos\".)" + "Notes" " - \"Respawn\"<->\"Necro\" (Use \"Ability Enabled\" to choose between \"Necro\" and \"Respawn\".)" + "Notes" " - \"Rock\"<->\"Spam\" (Use \"Rock Mode\" to choose between \"Rock\" and \"Spam\".)" + "Notes" " - \"Smash\"<->\"Kamikaze\"<->\"Rocket\"<->\"Smite\" (Use \"Smash Mode\" to choose between \"Rocket\", \"Smash\" and \"Smite\"; use \"Smash Remove\" to toggle \"Kamikaze\".)" + "Notes" " - \"Vision\"<->\"Blind\"<->\"Shake\"<->\"Splatter\" (Use \"Vision Mode\" to choose between \"Blind\", \"Shake\", \"Splatter\" and \"Vision\".)" + "Notes" "- Added a 3rd option for the \"Human Mode\" setting for several abilities." + "Notes" "- Car:" + "Notes" " - Added the \"Immunity Flags\" setting." + "Notes" " - Added the \"Car Damage\" setting. (Requested by \"xcd222\".)" + "Notes" "- Cloud:" + "Notes" " - Added the \"Cloud Interval\" setting." + "Notes" " - Added the \"Cloud Range\" setting." + "Notes" " - Added the \"Cloud Remove\" setting." + "Notes" "- Drop:" + "Notes" " - Added more options for the \"Ability Enabled\" setting." + "Notes" " - Added the \"Drop Item Mode\" setting." + "Notes" " - Added the \"Drop Loadout\" setting." + "Notes" " - Added the \"Drop Pinata\" setting." + "Notes" " - Added the \"Drop Pinata Body\" setting." + "Notes" " - Added the \"Drop Pinata Chance\" setting." + "Notes" " - Added the \"Drop Weapon Boost\" setting." + "Notes" " - Added the \"Drop Weapon Resistance\" setting." + "Notes" " - Added the \"Immunity Flags\" setting." + "Notes" "- Hurt: Added the \"Hurt Mode\" setting." + "Notes" "- Medic:" + "Notes" " - Added the \"Immunity Flags\" setting." + "Notes" " - Added the \"Medic Hit Group\" setting." + "Notes" " - Added the \"Medic Damage Multiplier\" setting." + "Notes" "- Minion:" + "Notes" " - Renamed the \"Minion Types\" setting to \"Minion Filter\"." + "Notes" " - Added the \"Minion Type\" setting." + "Notes" "- Panic:" + "Notes" " - Added more options for the \"Ability Enabled\" setting." + "Notes" " - Added the \"Panic Amount\" setting." + "Notes" " - Added the \"Panic Mode\" setting." + "Notes" " - Added the \"Panic Type\" setting." + "Notes" "- Regen:" + "Notes" " - Removed the \"Regen Leech\" setting." + "Notes" " - Removed the \"Regen Leech Range\" setting." + "Notes" " - Added the \"Ability Effect\" setting." + "Notes" " - Added the \"Regen Health Multiplier\" setting." + "Notes" " - Added the \"Regen Max Health\" setting." + "Notes" " - Added the \"Regen Mode\" setting." + "Notes" " - Added the \"Regen Range\" setting." + "Notes" "- Rock: Added the \"Rock Mode\" setting." + "Notes" "- Respawn:" + "Notes" " - Added more options for the \"Ability Enabled\" setting." + "Notes" " - Added the \"Human Cooldown\" setting." + "Notes" " - Added the \"Human Duration\" setting." + "Notes" " - Added the \"Human Mode\" setting." + "Notes" " - Added the \"Ability Sight\" setting." + "Notes" " - Added the \"Respawn Cooldown\" setting." + "Notes" " - Added the \"Respawn Duration\" setting." + "Notes" " - Added the \"Respawn Filter\" setting." + "Notes" " - Added the \"Respawn Range\" setting." + "Notes" "- Smash:" + "Notes" " - Renamed the \"Smash Mode\" setting to \"Smash Type\"." + "Notes" " - Added the \"Smash Countdown\" setting." + "Notes" " - Added the \"Smash Delay\" setting." + "Notes" " - Added the \"Smash Mode\" setting." + "Notes" " - Added the \"Smash Remove\" setting." + "Notes" "- Throw:" + "Notes" " - Added the \"Throw Car Damage\" setting. (Requested by \"xcd222\".)" + "Notes" " - Updated the options for the \"Throw Infected Options\" setting." + "Notes" "- Vision:" + "Notes" " - Added the \"Vision Death\" setting." + "Notes" " - Added the \"Vision Death Chance\" setting." + "Notes" " - Added the \"Vision Death Range\" setting." + "Notes" " - Added the \"Vision Intensity\" setting." + "Notes" " - Added the \"Vision Interval\" setting." + "Notes" " - Added the \"Vision Mode\" setting." + "Notes" " - Added the \"Vision Stagger\" setting." + "Notes" " - Added the \"Vision Type\" setting." "Notes" "Files:" "Notes" "General:" "Notes" "- The pre-compiled plugins included in the package are:" "Notes" " - Compiled without any of the optional dependencies." "Notes" " - Compiled with the \"SourceMod 1.12.0.7066\" compiler." "Notes" "- The plugins can still be compiled with \"SourceMod 1.12.0.6985\" or higher." + "Notes" "- Added backwards compatibility for \"SourceMod 1.11\" builds. (Requested by \"bedildewo\".)" + "Notes" "- Each folder for the abilities now has \"8\" less files (from \"39\" to \"31\")." + "Notes" "- Removed the following ability source files from the \"addons/sourcemod/scripting/mutant_tanks\" folder:" + "Notes" " - \"abilities/mt_blind.sp\"" + "Notes" " - \"abilities/mt_hit.sp\"" + "Notes" " - \"abilities/mt_item.sp\"" + "Notes" " - \"abilities/mt_kamikaze.sp\"" + "Notes" " - \"abilities/mt_lag.sp\"" + "Notes" " - \"abilities/mt_laser.sp\"" + "Notes" " - \"abilities/mt_leech.sp\"" + "Notes" " - \"abilities/mt_lightning.sp\"" + "Notes" " - \"abilities2/mt_necro.sp\"" + "Notes" " - \"abilities2/mt_pimp.sp\"" + "Notes" " - \"abilities2/mt_rocket.sp\"" + "Notes" " - \"abilities2/mt_shake.sp\"" + "Notes" " - \"abilities2/mt_smite.sp\"" + "Notes" " - \"abilities2/mt_spam.sp\"" + "Notes" " - \"abilities2/mt_splash.sp\"" + "Notes" " - \"abilities2/mt_splatter.sp\"" + "Notes" " - \"abilities2/mt_vampire.sp\"" + "Notes" " - \"abilities2/mt_xiphos.sp\"" + "Notes" " - \"abilities2/mt_zombie.sp\"" + "Notes" "- Added the following ability source files to the \"addons/sourcemod/scripting/mutant_tanks\" folder:" + "Notes" " - \"abilities2/mt_lag.sp\"" + "Notes" " - \"abilities2/mt_laser.sp\"" + "Notes" " - \"abilities2/mt_lightning.sp\"" "Notes" "Updates:" "Notes" "- Updated config files." "Notes" "- Updated gamedata file." "Notes" "- Updated include file." + "Notes" "- Updated translation files." "Notes" "- Updated updater file." } @@ -74,7 +415,6 @@ "Source" "Path_SM/scripting/mutant_tanks/abilities/mt_acid.sp" "Source" "Path_SM/scripting/mutant_tanks/abilities/mt_aimless.sp" "Source" "Path_SM/scripting/mutant_tanks/abilities/mt_ammo.sp" - "Source" "Path_SM/scripting/mutant_tanks/abilities/mt_blind.sp" "Source" "Path_SM/scripting/mutant_tanks/abilities/mt_bomb.sp" "Source" "Path_SM/scripting/mutant_tanks/abilities/mt_bury.sp" "Source" "Path_SM/scripting/mutant_tanks/abilities/mt_car.sp" @@ -96,29 +436,23 @@ "Source" "Path_SM/scripting/mutant_tanks/abilities/mt_gravity.sp" "Source" "Path_SM/scripting/mutant_tanks/abilities/mt_gunner.sp" "Source" "Path_SM/scripting/mutant_tanks/abilities/mt_heal.sp" - "Source" "Path_SM/scripting/mutant_tanks/abilities/mt_hit.sp" "Source" "Path_SM/scripting/mutant_tanks/abilities/mt_hurt.sp" "Source" "Path_SM/scripting/mutant_tanks/abilities/mt_hypno.sp" "Source" "Path_SM/scripting/mutant_tanks/abilities/mt_ice.sp" "Source" "Path_SM/scripting/mutant_tanks/abilities/mt_idle.sp" "Source" "Path_SM/scripting/mutant_tanks/abilities/mt_invert.sp" - "Source" "Path_SM/scripting/mutant_tanks/abilities/mt_item.sp" "Source" "Path_SM/scripting/mutant_tanks/abilities/mt_jump.sp" - "Source" "Path_SM/scripting/mutant_tanks/abilities/mt_kamikaze.sp" - "Source" "Path_SM/scripting/mutant_tanks/abilities/mt_lag.sp" - "Source" "Path_SM/scripting/mutant_tanks/abilities/mt_laser.sp" - "Source" "Path_SM/scripting/mutant_tanks/abilities/mt_leech.sp" - "Source" "Path_SM/scripting/mutant_tanks/abilities/mt_lightning.sp" // Abilities source code #2 + "Source" "Path_SM/scripting/mutant_tanks/abilities2/mt_lag.sp" + "Source" "Path_SM/scripting/mutant_tanks/abilities2/mt_laser.sp" + "Source" "Path_SM/scripting/mutant_tanks/abilities2/mt_lightning.sp" "Source" "Path_SM/scripting/mutant_tanks/abilities2/mt_medic.sp" "Source" "Path_SM/scripting/mutant_tanks/abilities2/mt_meteor.sp" "Source" "Path_SM/scripting/mutant_tanks/abilities2/mt_minion.sp" - "Source" "Path_SM/scripting/mutant_tanks/abilities2/mt_necro.sp" "Source" "Path_SM/scripting/mutant_tanks/abilities2/mt_nullify.sp" "Source" "Path_SM/scripting/mutant_tanks/abilities2/mt_omni.sp" "Source" "Path_SM/scripting/mutant_tanks/abilities2/mt_panic.sp" - "Source" "Path_SM/scripting/mutant_tanks/abilities2/mt_pimp.sp" "Source" "Path_SM/scripting/mutant_tanks/abilities2/mt_puke.sp" "Source" "Path_SM/scripting/mutant_tanks/abilities2/mt_pyro.sp" "Source" "Path_SM/scripting/mutant_tanks/abilities2/mt_quiet.sp" @@ -128,28 +462,19 @@ "Source" "Path_SM/scripting/mutant_tanks/abilities2/mt_respawn.sp" "Source" "Path_SM/scripting/mutant_tanks/abilities2/mt_restart.sp" "Source" "Path_SM/scripting/mutant_tanks/abilities2/mt_rock.sp" - "Source" "Path_SM/scripting/mutant_tanks/abilities2/mt_rocket.sp" - "Source" "Path_SM/scripting/mutant_tanks/abilities2/mt_shake.sp" "Source" "Path_SM/scripting/mutant_tanks/abilities2/mt_shield.sp" "Source" "Path_SM/scripting/mutant_tanks/abilities2/mt_shove.sp" "Source" "Path_SM/scripting/mutant_tanks/abilities2/mt_slow.sp" "Source" "Path_SM/scripting/mutant_tanks/abilities2/mt_smash.sp" - "Source" "Path_SM/scripting/mutant_tanks/abilities2/mt_smite.sp" - "Source" "Path_SM/scripting/mutant_tanks/abilities2/mt_spam.sp" - "Source" "Path_SM/scripting/mutant_tanks/abilities2/mt_splash.sp" - "Source" "Path_SM/scripting/mutant_tanks/abilities2/mt_splatter.sp" "Source" "Path_SM/scripting/mutant_tanks/abilities2/mt_throw.sp" "Source" "Path_SM/scripting/mutant_tanks/abilities2/mt_track.sp" "Source" "Path_SM/scripting/mutant_tanks/abilities2/mt_ultimate.sp" "Source" "Path_SM/scripting/mutant_tanks/abilities2/mt_undead.sp" - "Source" "Path_SM/scripting/mutant_tanks/abilities2/mt_vampire.sp" "Source" "Path_SM/scripting/mutant_tanks/abilities2/mt_vision.sp" "Source" "Path_SM/scripting/mutant_tanks/abilities2/mt_warp.sp" "Source" "Path_SM/scripting/mutant_tanks/abilities2/mt_whirl.sp" "Source" "Path_SM/scripting/mutant_tanks/abilities2/mt_witch.sp" - "Source" "Path_SM/scripting/mutant_tanks/abilities2/mt_xiphos.sp" "Source" "Path_SM/scripting/mutant_tanks/abilities2/mt_yell.sp" - "Source" "Path_SM/scripting/mutant_tanks/abilities2/mt_zombie.sp" // Includes "Source" "Path_SM/scripting/include/mutant_tanks.inc" diff --git a/addons/sourcemod/plugins/mutant_tanks/mt_abilities.smx b/addons/sourcemod/plugins/mutant_tanks/mt_abilities.smx index b38cee16bbe59eee1700b7b31d90cd3ea0bc60ae..3517e93f27e2de6293c2e2b0fdf192174e7660e6 100644 GIT binary patch literal 642067 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ⅇ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ξP{dC9aWSA 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ɢ-Rs~VMp{fR@_Ly)G5zLbr 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
bE^0o9 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�PIaB+xkTgSOYVZE6J%PpNLvKu?Y?ji;J5?C! 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 literal 756246 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�^_|TGbvReHWY|I^ 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

{URrHLGl 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 z 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�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%0A+&ybG^A+#}j*FbX>#jv~J`VCza0syzj`itLM; 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

    Kiz(L= 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 IR0Y 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

    2US2 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 z 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

    29&N@6*%O$o3+h; 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%0Aj@#JO+n|4#QvH7khB|;n! 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

    ?r9i!T245Dz;n9d(3Uq_ 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

    XJvF<%h%9|vllaRU_IL->7 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
    ;yY)WTeak=|4 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 jYAEg?kBLvT@ok#ro7bdA88GCAF+(Hmx1 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

    4=OM~%IR`_i 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%0At*Y5&hOxMeo}VKh-{>)ps(8EuAUVon*BN@dtv?^ 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

    #!#LACC;F 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%0A$)_2Xc(-}@a5sU*9 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�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%0Ad_t{0|+ROL)@JFG$9%ya3Q%kj?xYdA@VMoTLdY

  1. +Mdln=``i6to<4UU< z(x_+)3L;+*VZSF(*l#sN4%Z3biA;@!V2B5z5X~)yR5B$_KEz74K_(fjB?S<$HWF|I zN*i^Rg#Gp)r4k{Ud)^uxHf9j7yqw8Lk?XUDg8F%g6If*o?^IrC#elbJShNNa#XxAX zEV#M+=OJ9}8XvNrofkv68m!{)r%6H|h%ogP??zK4(txTqO;jK>Kr0E}0&*IdHAdmw z`e>@+mm)V2q$$gHQeoi?TDqXfbz4v?6U}uV9z|M^u?q6PN_+xlWNtP3 zhtp=iG%9`9JapBf8B>~D5lX|$MAum5Enn+z@6 zpryS||L1~Y4MfRTova`3)vUaVFU?Af$;t>(u^+KhI=g*~uPrN)#3i5>VT!T5bS$)l z{f(D=XielY4d^4|pmd?E5Ag;lHhQd9LPn_$$OLGRReNQemE3id8i0;LddSK9*RPO5 zJ`9E}=D~xq$AHk#TIkf$B;ooD5c1gwEfD~h>IWTRK6_jd3**}n3+=!{&_-yP*n|ib zekDXhgfxK=*%b(7)*wQO5<(Op1obtZ``Xs(zxB0x4J}KOY3pw;w|WJAtWgUN9Pxw0 z_CP4lUP8zT5!!(WsR5xv5}NBy$y_~BjFqYlksfpr+o6bsr4l^|k+3^Jq?~L`vX&y< z4u+eS$TWB>ud$x5iaH&IPL3GfvAV!@lHpu6L39V9B@9fU^=llUkMv%ohfQ{%)uo_1 z&R%Hn`w2ME15EVe5xeU!9|ac>Hl-fs)7uR5iT~Qg8M-te29`q?^;T%;tCMsA06G|p zv;groF^)gOSQU4WY-;S$JeMO;-v$W;?*Yc9^(C{RCBr<~NT3jKI6Zji|EC()h>q zMn5h#`f=U*gKN-#%MPO76c-=#^R?Y3PAfiI#t+IDgc>U48`Jrf{1!cm7S^CAp9(LF zyQg2ud?nQSq0kkNTYdKZ9!~bbouShFv$#`d`tUC(4NqAiy{1{~ds>8AC!OhRg8ah= z8+~z89V+jtenOo?%P2>8OmE?2+wTlh=XZR&p(w;|3Grpf*>?PAmH*~{Vu2?i zLPhGw%+JhkRz%#+>W)ZkJM4Hn*ips*?ANJ6S z+}dSjl;`V1VEWLS^tIIxwMt*c#h?Bih+McCensGZ{RhKFq1J(rUvP~=U`)mjwbn~o zqfu*283i$g`AB$^_%G9+qcWN8@B7=+j|XJlG6{UFTk`nl-LA~8pX~$dc$)Nphk2&O zUq;Sfv(4J*?Pa3v>YZTIA8KuBd_tq6*DTpOEqi!7bU* zyfRlIj&b%7n^#*tU%pURr#lvxJDG)3Si0^#RWb2vyP=j6kIZOPpNwuG)ZcCQFgI`M zEzRoNf^kWPc=*a_X>cG?NB`3Tx1iA=SJu+4x3!af@w$D`{g9@*<84E=Sy6ZkCXR@Z z4rwf9BPu7gn8>iMs@)bcEBh?Iwq>#rw8<1Ea=1%F1bj7W^|kG3Ry-ab(v`0UYH6lo z%Eu*KX097SM?;SXRL|?Dx!24$K69`6q<>?QK6O^BBBvsK-jS)Uv{X>+F(sSg)z_ih zrx0&2fpaZ%b63y-a*{@u8l6e6_YxnOpsRxN0$|+Seb^yi9ZrV4eC?=13JM&fYQ7+sEVJ^M z(60vRXw`UiEMY&}YsX!%FKwSSM|vq$xpgd&zg+fHDzm#Rp>nv3Nv{f?#ZQJr<Z-b-`Ic`Rdcd3WF|A#L8}i zZj^@N)R-faRwF7w?T%%b+WEz9YR?!ue3y1_B9`ZM)hklVnctDhbXzLqo6+;k#IA`Z z(Jl9gXh%c)fA{U&ncb#a=c<0*8N2t_pou-X9Fv2Lj9;%o(`PCAjgDhy4l;=INoOf% zHosgcdt4B<|GTjiXkoH`%`ZQx99F@YZQykmPM?U54cKG>T` z!;h=TVnTG+dr|@6bSlsLuSlpFqkc96Yl8&sv7lO}!&OP&k6Rj0=8~``wZmTvlA=2Y zy5b|WydU%mpA-yoyxU8~1gxnd@ic-bG+VBD`}qdr>(!dK)9x7u62GkJVt+z##yjD; zpB?hy#p+O=cWCxp9Y+29KR*{bu`!RUP70=Z2fWNYSrW0M;}_kzTFu)pQoR3)zC5Y* zG{UFbh~p4ir&U2H{V1t^W|z>(G0ecZ%@arCMxr=bDXfkyVL@Ig4ZOKF9}LK zKNpGg51?EKa!80q-#ketTB=_N$i{4;6Ki5K+<&4IXS($d7%yIIL#+wF-onmGS)JSx zr}==14rg`kiPKJIcI^;-mTt`2(uNxL{_DMCzj_-=!|_q{rSa2ksH%xSz8nqQNhb~~ z0`#jAnCLZ`eIA$roqF%&-{ajeQyKNK#3=(cKWes3M%%C9Qr|Ez%Wqw}xz=CuS;5NAcXk z5zloaA0`t5CuP561#Vk|_0c%DBxThhG_urlU7|}eVIYeTeev8bI#FPTC?{nI@HqwC zra5nHU7$rf+wsWuPPxe2bnZ7UTayXCUB4M#WSj%tPyA+hnY*bCwZ`NA)^!ujf!+Yr zD{ZL3ES%oUmk*ifL{`U9;WDpv3sJOn3nf5jAO9hdQDn5vq8YGj&A`de>+)29Ifgol zrwRcYOJGdASlO{I@3UPSYRzwXLg1TY2BTTYgitOW6$ml|@Z z)4CbG#QbLC@VZFwV+1n85%KWy!ZuapYcx_K?TLsdruidAG`&;uyT~Y2 zV}>EI8JdSIt2A$CN{T)g*Ig|qR673k{^hvO5Xx~X{lu4J3xTu5wW5(Xyl)LT<%G^| zeY0lt=Z8ZmEyXixkwbOsMQ)!l=g|n;W2pO>@2$w+i$=c}m3abQe*1E?h``B8+T`%y z{K$J=Y^HYe<<#HZ=)foUHD4N+7(xvz{%K<@|K@wq-1vHt#d^_K*IA zIy$lGAA-JXU-LtIFuh&VepAJ|VZ0wjKdl#mx$ZZ^HdlN%OlRG&;DmJ*wZWwOn~Fb* zV!s#t&>rz!``?z)D%(Hqi3`5VSw~pAXbf0 zN71hJBFuN~8-KW>{W=`nAQ1Y-nA-PNfP*#9C;jkJD-hGct|XbFS z%xG`X*)a3`lqj)?BKxl3B~g@+VJY#IHnCE(^;*|y`S z*V}bn2~}^tha(( z1ehXp{P7UoFH!NW%ozB|w_dAutxMFn$2q10LfmgRl1`{y{c_4oQ_{71lP;2;%+Nrx zYuk``P4!Y`Y4p=unH9N8*Vm%A`k{Q0(h~32%BY7%{=t__4|nwrs4Y8NNX6VXYKJQS zIYg_UZRk^|BK9R$O#~Wl(e1nKP|jNXO-ds@ZW}*9JFFDlYNs8SXx?hyrU7O^Q~WHH z2Teg!C7H`s3ZsK5^~7}LzMcVLDKQ!;JgjjW$v14eKi_@rwdrVuF3GAa zAS9AX4e!+abL&yedc@JzO-1Jsi9a_%I|S0_cv0#ybx|3OfQ6A$663J zt8TfH`h2D&iPdGTuGc`6BQC|NHqqzXQ~x6l)2jZbI4o%!p}yOzBa8k$7AQtc3u)}e z?(iavm6krubqT|nuDteO`PtLpSw7#hiBl?4J77tjp~qX%`5I_J4Kd=5E;T<1 z3vVs2it&_l(G^N5PS@rWd;FWo=;Hi^|2CdN+8CIdI@`@IMb0Jc%1d9X$7hyl^;e!$ zBF%l?mH+Ll+V(zCE9ctNgb0etE;#K~7b! z3;sRJ`zy^@-$p-jbC`@&d)Op>rPg_taog3|W!%ASU_<8$Wg0#ui{FCdqo(HeTn_y`(b;kHUZ&Rjvr2&Ja3 zy1mh)x{DEXybkwt1{m3!dWFx8M^B?&RFZ>OhD~C0U&HrTLPxWO(^P8rD{9@)eR=NH z7G3-NE$Q@ETX^)mEqLaY&`PFhXwl~UEo086p>MZc3AK2A{B(W2X(**q*!t_~SyBQ= zW|ZGj4tdU!?sBFppi4uf$DI7n{7ti1fn{Vg2hq;!bBA6JL1$*Ebv*M5(tS?;7=LDn zO6IA!W4A4rc|b80qxAULs?R_2f<)Rc#Jiz8!5NLbs8GBA7Pfl7BF|g*1Hyb~ zAhve@LC@oL^D?HPtt88xhmTwdO{L~-DQpt9o>&IJBTPew7KE+)2&SQDF}i!W(~%dU zWnpX0*ofJ|xQL?XUuE4nUoZMKewDp)T~gjYHsZ;XuOG4TUoQrgeU-g-O|osMAiwxLX$7nM=d2q zB`->P3Z4+GYLgOt?A2U;X>xO{j-~72qIR_=XJZ&zyW~=rseopHo(VJ8F5v!>u82#*+x_&3MEuaPWc-8QIJoBO~8(W5^MBY$Dqp zkBw&2@!-Gv?07sjjBN@|=zumc-Q=O&%sE+v4PT2!wdZf3A#ZB8agUI}^2A=Im2A5l zB+UGkMzZE>&`9?D&9p{5bf0aN0L8JX2@wuQYb+GSRkcKwN3=x`&;GVOC^9{5^?}2l z3NOVHY8ZPsAzq%enHeNc5@B*=t=@CNZyV%z1sQuuTg$ha?}2erv>ZJ0uYkL3Gjh8% zMw+Qac1}S4&Ax|6hO#%3o$<(I_JIVe58RtHAF_-sW-qe^Z}ql1m7Sj8c8l*oGgWZA z!M{pNNo%(y)3nfYex2y!|q_x<*2RPjpU#Na43gC0x6c=lCUg~-N-bR!zwZRWanV?fh;{* zne3cBe>cs|maj~kyP^GtYe5DrwaC=Q;79Du2>|_lG=#PGJFX2`P!9TqiIRg9neDPj zGS`btdc%z(lime~0`##D*?oBIJ@!r-)s8PgquTOAX!>~Q5gV5PC9qL=z=#)3jYhh~ zcc$$kV_Slsu;=j5V>TfH!Uv?Xt?*C^+tEJ!@nFi{fv7ft3_n!`@$xae^;k-qz%Kjb zy{y>ez1efkTvzg38#k5Qk^ok>LK3L)Z1B@kLjDa&Tg+i*9NC7PlhBCIx8wgwvzJ3A zfy_8BJfV>rOcT5bPOjWYMl^G+$%wXK31(D+6`A`xEnd#5o%@)af1~yeJC3X(Pl^oK zz-*MoiZcz#gg3zoOlQ1`JW8J0Tzx+vlD$Mu!h>Ia5(ADim1!uuk++)lTs@kK90|`x zVO06VWzzTwSikf24841MdatK`8R2R2*3fJbeDY`KWEE#q5*Q%Y5DfGIQB_0 z^&PjBOsxw>GRqXe;jDi0SQX|5GPQ*pLZ-HJ?~w)NAz3D%!Itkqi%0sUxrW|g~TI9)i6Atr47DM>hO)?C<{ zF(|xG;mXeQwWd2)Nme_ZuorjgVXyA&91~8PI3k=jM-)z@*$eOEFe5+4=4@eGT?rkr zG7Wv_CRI1@){kuBgVXMD3}_bzyyi@k12ywW#ZXC{^}O$Kosf=ZSqvvGjT3!br$6ON z_#K5S;gwI~tQpeBb!e`~b()4v!}&q41YX-7ub-&7622I6CHy%jPatI3e6Q2~<2t_V z=8wj;^5f~pb=(@7AN`#xP#<@^o@R2q{#LNuzD0={g&2^IH4;w)r5uc{x+EJ%-dGB=^9e(+{J85^jjAKJdoQgLi6^ zp7MZ3)BPkIudDz9QwjwRwT{nYU^O^k-r!dRSuntRo0f~95C#^>0Uz%%px-#)1=KW<~Kx_etv&P{7ilM{=tqQfW~Y^;y& z+_v4m@$_u+Rf>=6i8F0B*zFv|JO1WkXdeT6l;hkFxwDXWc_Kw%de&D6U1ovzskQWj z93sHxQI=H`U%wcVVyP5Bg$%4Xn7i|j6aYX8AHc~8NBT)|JVOSU-1QZc@L+<5P2}Y= z+-#s2c!DOtak~Z3hYPH+Djcx8+r9w8GqAfkVB)66z)Erm?R=2}n82Hm0R>0~E>yz+ zl7Zux7DGymIlv+X+Qb5{+b%005qNHPka<6(%mS0a4GioN4z-oPTmaQD5Vs&sKXi%( z{*UMf`~e=v)_5$!CV&hf$i5%`-yZvvXLSpT?*~lh7hz+0R`!reKQ@#{wS)F>NG<%i zVvu)){lEtt0Tyjx7Lx&skW4@1%mO}9#(*R^*mgd$2vUUyC8+?)XFwVp9ov^A3)?-& z8hLMOt$gfop}c^QX?UfAR6QjHj7RCXv~kzCG*XFt_ei?@gOOtS7jq_iBWKZjSD%`M zCvr@}8NA~#$9(xtuOrdPsSx=!Y(_z&q)xDA0A*oE-%24X0Uvjs^y`o*!QXePPVmLdW|_@w|LH2#oti zKDaX=IAHv%6vA9uLl_p22tZ{BeoUH3*J=k#z&b{%D}$v*UD z;q$ZCgjeUT2s_PL3hT{X67IA$Nt+lkNt@F)Nu$-8> zdSMf5uUAqRu3QOAH8I&&S}7%<^-N0fVD{iP!C(^W2QPdu@29@w3vu%8 zAzv2qKF^T_Zb1)uGmN<#*zkXPMEMm%jtuN3j^7pb!(;!iV$N^Vszrpahfa2SdajL) zdVp8<*xhZ?2DZ|MWy8jOL-=#0t_BwFrwqn?u1C1HhKD(rB zD=odg2B)ozwsfd1Pp{@Zz2&?(mB(T!Ysa|fOy@kw?IS*CBCHpd$aGEKWXiX7(J-0M zlW42@=DNltJTt2dWUhFHDiIUgPlAjUwtAc7jPWu`!h;q{5062TGUvI+W(ljmpWr4+ z^Xa>JwXSDh`-U}#v#IrUV__seutZ8N1D_C8?pi_5zz4!OBY5G6;?mH4DjHrYoofiQ zzp79*SE^X%n^|frs^NCtw?rt9JzA6IVXhv~#Tbh&by1lwKNM$_aay&9{v^2~xhDEB zDp^Ikaz{q+E2n|8GqEoj7ed)oTm`Odf?a{Dnqa?2Ya;z5WVqEIeFqFVld=-&pSu#e z0?#Lpd#%{Fdz)KTwLP8QHB+r!nz3u9iPrm`Me`mtN8UCl^U3tzd*0K-W7NZDR5-hM zp}BXl6`lWU82vfAT^Hr=I+ZnPZ-&^B)$IaundK5hlnQ zDXW=RkmC%zzCm4d?teZFy{o-7+T-j>?QS6Ftz~J{+6;2rnTx4x#Qda1RGtWzD-&R^ zKN@yx@IIo7y*ovcZkXmH3P7?=lT`_Kket~ZT^QENfU54AFEdLy+I zde26qW}Rk_a<48VDz0U^T>Pg@m+=JifS{sJ?P>1~>{1g$kOdQgEYBtlbe~1zH1lrA z5lej$i*`%t04sy+VugSZCs%6t_eI$1{9^X%%r<_tYxU~8>51pl{Vf@!5f_eQ+x2%n0yEW?)TDT;e#Oa#b4|f0 zT97;lIaA5Yw`z|tweWLIuDpRN7cm*7>Kzw;EGSRU|5#8~LP08&tYwM#cFojb)gX9{ zoAc{RYS(gdEqzgoIHwlUJ{e?0^;%8sf_6;&=g!yUK^mW+lXGe!PJ~rX%fqbR3)u&H zy31XHoCdegxU}Zt*=FiK7PQc}&x7oqq9Cow!LNjovezfOR2AmVEhB-w9r$2QBj4qP4bu4ReylIQ_I;+YJbEQ3IW0$_r(;Ob&&qkw@L^bd>!X2=RNCtd z$5CVq`PP#`*Q3ENDzLT1T57x+(!|)%)PpD*G%@YfnP1P~Nw`?#Dx~8ZvwAZ(=99w8 zPJtEcxnqRpI*yZ(Cs5ub=42HVmDUA>uu{J8e-czWO>WC(T*d6 zK8kJznQSQ+=U3Wgg-lx81*fUGeT1pGQ7dY&jnojU&t}z2ZRQGLx(?F1lSPuOnHO;8 zH{@Fx*m%*u%p^Vz{ehGTmhKw+7@DVb({Ffv*eM?g`m~CSf%~+Lwe& zySC)=ZkbT@8wfYS58XcX3}Pn=BQ0E7?_kF-K2HEOxdo5PXe+uIHg*^S7x?gg6r%Wj4BC-}E zOssd!q}v$t(z6Th?YOkyZ$dd6G{LYP*Na-n}z{VhiQ z&ql{#H&{VN8H31EJmrjS#He4$h+z;zydPv^+cD~A8n8D&enh$uc+WNvKE@zwd51p7 z0w`h0?F{11Yb+5~7r^dyz?#?`tl*U&^PWy9`P~elOY!`I#;dKvil+-T^0sOmHR$+k zvQH=Cm?zOBEhXHse{as|#2uIVQ%u8V6whQF$~nDD;>DAyS6j^;9!1VoO5M)fVC-E6 zP}zR*sD-eo1M-XG*sy6BU}_M3VoO5Oi8~{8Rgt#GDnX8pb>yp0T*V75 z&1xV|tLP}5xKBzehS_yWDhqslw&6JV`q}e6bmC82<3Nf9I#v0K2dqSnD$=lXRh3Ts zHQT(EeN2B^@(p`(PmlH^W|wNNp*zUOQUci;qUlq`po6q`AU#9xm?cQH3B5@NSr?bR zx6_IBLTWf>m+Z-$QLgvj&24lpz(Mdc*Za|VNiy5a&2FH`*#z5uakS!G5tChm+lFJU+L??P&s{*}U$__Y8C(31GcGHOmV*Qn2 z%;!FHf&0_lVazMm%nnE<0N-~7_`hVZ!RMEY8^QONo3_DrdkDhP7x%ZJHV9b)7l3`< zV9ju?WWr%bp23>oEvf+Y;TAwf`hevc=)!BDA6J7x2Yw0M4SWwkSAs#W31_08KF|Nc z^-kCyvL+p%2t2(H0QJ061$gS&LmX8Yb(r60&p~R`_KW@i2bgjm=o!reNC00ibB8G} z0}j+t34ecSX7CF8|7?M?a=YQ2neZluCr;EVDaP{?aW!rxlnWpOJn^kbT2gq{I4|e) zhNTYGL)ryWw;cYC)Gn9mM$0_B#Q2o`DDzY^dN|@rn51aNhX~WK!=lg5W%IUhjv3hM zFo>AuORf6-sCwhCax9QaJjJsC*_?wQ9e+P~Ky3ebuxCdx zp~#r!$U-B(yrd~GKmtGe1Sbpk{+LGsPw|W{!3HE%?P<_%2YLCLJt22MqQc`7Af5ei z7AuNDJP{XipVtlY<=OHa$At5G6jX?!(f#}aK<`8jgJ>z5P65x2d$GjIORTP=y0vX! zPyuB(!OBu^A(zn6PSK!p);M^6Xp0ixmGz@^j29(Xu&K8nd{b5$R+ehBrYtz^F*c(p z{hOJB6xd9iZ)WPlW{TRcDT^VmDa#9ml_eArV3=`*u$c z8b!TAt3tx2V<;aINHD#83xM@!j4?-yg?`$MX~9f^+%kkHsFfh3y^wW^Yizn!U@nfW0pO-oV}< z8Q9+0)-`*FB4B%4zR}7lf@#Hkqm|dcM(Y-soR)sn2E}u)kHaF50}24E&tY@bV%8+S zya7u*zlPI^_iNOc6oH4r<%TtwEE>Q~!Yp~sjm%oX7Lg~L3ka(Y$-fKU0_`r{T|-GD z>YIs4u!&xjHF-U-|D}8*=9M+rw$c=^M$DP*VBas;8AD!yI|E(1Karb^>(mdUEeJ@41k^u?_RVtKO{8rW10V{2aBF*>^Nrk1tTn-M3~)cz zeEQ9qRbg_K3kj>o^p$Y-FlM{Hk?TwWBd-L{`={9&gjOFY9lp4-B!zisS^ipWIJrVC zFksrpMdD=B1ut`FYhRzk_{phcXgv_0oUCgU@v)V6$xVsEJalz%KA$qb^0~Cs8$D=< zMg)zHRT>}ePo7PNUgy}%dR<-d4>2_;QVR4j4GJ>XrycB5XiVUHw_AAE91eZ%tgLuF zC~!+$N=NfXNK@ZYqvtm3EaY#gI$UuiV76O>9!>JMT;V0~)RRAt^vg6Q*7c1GLFDdu zJKAwCS5-FiNDX#$xgp%x*>u#yww}BE=jcKml~cFG5OL%$bh|BgFV#`$;IcncQf8&* z9`7fK3C9p$c+ zkq%#U_E>LmOo(<9zNK!=;p;myo3FiupdZ^!ZZ0%lTN$duRm{V2IcdIfUPYw0>t6%& z6ALE>J6%$;Zs|)kEw?p5jLM~>gysCOl_-`JV{aFt(HuzQitPCR9|bINd#F=3UHQFr#2t# zHla*PFp+P&g5cdIKUsCwX0k=@OolM?w{~&BSNp%+mChcQ>U+`H%Z5r$TTgK zX2RP|E;z1jH!0h>miAPV|9!iO^N;N&L9LY3+rv*2G27j${a0^JEd{?F!$%kd8zw@< z?tzWmU0p#&)s`#v^vf)zL*|*ayU|rsnKGHI6aJb^cSi*FErHslK_euLczs@~L(at) z4R*rzK65PTH{Hy&kXU&wB(4fR#(Da6?patq-J~g#R)-}etX^xset`$xgfp9f z7is5mmR;_LPhyX-wC>LB490y5`h|L6Me;3{wA3yQF~0uCAF3N9#^?Dun`ahkrBti+ zbWk3DJ~c{@qSq~Y?JH6A^Zn}5^aj6dY?tg`x#WQnvaH=zZiJ7a`u(vmP zT)-=+jkMIbYT5&q#8z{Z*suI2Fus~XGm#OJQb9(VivG;{LD zXg;{qwe9mheZ0tfomAhYcREc`pVQ*^%S1W z=IF7|yps%KtJ_Uv2B#l2>;`_up`dKtY>^GDVuI7idrWo^NOc^QU=TBZVxeg%45G!{ zO{l6L^>_n=_%4WodOc^0>;XULl>|KE#bS`0EY1c7IOHaa@drn66)ULoUpxx<<^mzA zl21bpO3EvqzMtk#F$5uF`oc&3#;j4B1^2(sYfB0aIwm}i_?(s$eX;e(XKTSP4!k2{ zX@olBXKMwC7e%A~4#X1;ND09z5Wry$OR_o-x^Qo63S3+OCC_z)*w-}~&n{*2gEbdF z%4Ks-YckR`U7Fw5{}G3glkD_PxM>v`k)o*QOcEEYQ9QMDV4;8zS^K-7xx?R2L*kfS zTMpH}XFDeMJ_KQs(RM33*ZAvp5D^IR!0i2iu~#TOx5q{?(JNpEf6tgD(FV3C;y}oE z{x$UrSMi(}sga$v!r{*?{L7;AD%EWUHI{~}D+D^$$F7)ZGSbcsEHeG~JfD#HY%L;@ zzIt6#{8^FJ`}!TC={}^$2#gfpNArbasMF!k)-qolTiiZdCwwM7jF3!x7EW!bKNWf5 zeZ7$=afyVB_(_VVqj_s$OAlX8l69$L!JlGemd!_NE_QkhaOwW4X9`L0>Rp>V-Un+6 zbQY1`>!?U%RFWF%F;eUx&62L8x!ZGe5Mf7{wJxb`l*6@?;VCEOo49FmJ*$crGZ+#l`t zGn4S`RLvz#Ps#q7;b$%(?;Yx7U>Xr(?7iG$tznzBDw(4rBSCCkzAmxj(yQA(6hpNE z|NI{7M^A@?d?qr}jr|Bc*2uUM<`M&rvArYlOmsN{M8vV>AUHoaAT-JqvS@=tyZldF z<11}!#|OQ-YDi&16Nq7*q(A`V*mAxNwE)8MU!7i#bA_@%pk*`-f>No6AjUiWItNtN z`U?a;*@zDyVsuQ04x${x@3Lf3Srk2@CT~^9}a+!w`;}EcYX{>||g6*3RlL?+B9$>qT?KxNj z*W+~J6F5S4bO90HBe3|8@H@~q@r5A>4muTf)Mp;SP*?4i`RFb6Y$)etZwZH%E4Z75qno1)&dFCZARV~qo8n1cXG zI&lRA)4RIogWFJ#ML;-DTmtwT57e_KxAfHh%|v%ZsexJI>LDPmiw45zn=)U(g2_Xf zF`&a2SO*Ik0D&oJnejRw$h2&Lbzs3OEQa|spaVb==m3^0Y(ex4h6jkAg-KxPWJ^!= z8Vd}dI2Np6{OVL5#zc=Bf=Z4dz>7Oo);!S-z_18_GRq!mhdmJkRy8PtYRG@Ndpubr zQPdDCrON>jHX1DiHo5D5?67rYx)|-y?MR97T70DDu{*ZwKx^XdhZ*NkF|Nax1R7)o z>ev4X>F)eR_tLk&+*Ed7rdpDh&n%BO3r-yN*IeSTYZI%#8pXJ251ReDFZ8$5TmA?C zydyP_bCi>4%Wldxs`q*)TWNntKZiCXwaQ(8J0j?+OzhyNwI06HMe(#N?#Fpi*rTm9 z+1;}9k6UTKC1SVTaIsos%bwMDc3xXuVv<__FiK;B z|5V$a&!LlA_mOSdi7H8B4w=eH+M4&G+ixq^Cp7f7yDINe#aR#rZ%2RneG{k zYJ*8`%$rj{N?XrwCgUD5$v7Zd2NsQa2a851AoFg_{me|~feh0w%2zb4QH{af%e47v zLlhae9chozj4~wMz>w28@nqaKN{T(^`umUh2?!UG9VYoS-7NuO-(d>MZQ9-Nh}Jov z>a($BGS2L_#Z6c=5~ylDj{~By;QAd67`V5DPliR4WMR=(c*M-{HPI?-qBUUA&<)IO zS@7C+`@+fn@h}G}Uib~=e+`RNkuP0;fAL;R^69}=3%lQl9|N|)gYKf{;?l(kdI7Ud+H23YJ>^j?$#24|6t2BRp9?Xg2+n2g&fP$Gv^E>Qr24+}DF zb`0-kj{WTG2Rp!r7Oq28DBELeiZ%^EV9^YV-7Jqx+$@JoJ*9tyX|vlLLFNMY69isU z_elqj5UWZ+94Ta5lW__TTFGo+IPL}p3c6F1(pb1Ci{nPXL15>grk2JDr*#+tsFwemjUvJ@3J~ndw zcPHi9z>e1hJD!9caJ-91X8OrGu4-7D1Q}O6AqM*$Dwf^x4wh?kgqi+7dsF$}?pcue z-#aSF2bCKw>;!;ekuBoybQkA**L>;Mc(sSDeevf$DV83zumi_u*f-nm0KQ!>?e()* zo*y0_SO=tI-ilXtNqhZ6q(Ea#Uf*M{PP#O>y#!r{eY>L1_B|Nb;EaMTOiFRPZFG9Y zTiexn0rk`=dHCkyvF6%=i7n!94+&@w+Zx>*Q@9S_TdLRm${rB*95N&0j#D_d0l~j8 z#}rF7BVdBT&z4u;ykRCF#CFKSE=^YehfVN)rZsM4VD`Zb?~q4s{V(s%@1S3xzZU1u zYVI-!YPPD^7&{=BlOEE3F+AAqgnaV(Of8+PGg2`FW5>crSMqKxh-nNg>#^pw>hFK3 zrTlHLFQxP@oQ~T-FQWXkH z@imz47l5<$#K;Sc|E%($!!wTm3|=TbI|1j zqYfvY>=h7Pm@?v;j+igpQdfTTD{)y*FFbPk!odm+%}0MTawSC&|7g@HJafXXZFyyX zkFD*@gIDeKk5>a2!TDitKL_m^PU>{EaSg^!x91PftujZM$yVlNyQw;=e{Y`u#b|85 zvgMg*tqEl@!enM@)txg^5>XG{?XT{YmXVAo+buGh6LUW#WBSxWa?6^E$5IwvE25UXg}A=9%B2C%`jC4K%Q{PyCS9hr(LK44M9AaMan7&v zOI~{CO2iAQjK~$RETxxU)l{@t_)I4*^TRdtBSpZ;M$2N-7G`y?`_etJJmQ~Uf``K# z(s75B#0{=k*3z7!ovmscd}a*F%JTyHE#Ghpr}f#IGHsrQY*`8E?QxbC8q>XTU&1vG zJg7LZGpaXuQ&|4X!qbCPdwZcfYg+KsRsKnQpzR{<<@)+@;my zElxmK_0YV};nXbF;=4YUxl&_B{k96|bLy+i1Jy1r77UNxS7uMIh|Ke)snr9fgC<_r zrTZQ9C(|8s#}b>12GC{FGBPi7zJ}+_VFi}J@eZf1 zbFOCFt8i1hwJ&qd&K!7+`)jpsX)8VeZYj2Zrv`y2*6sbp0WX^R7lf7K% zi~WL~yxm)i)Dk~t)u`81_}JfjDOmos%Js@k#{3>^2`gwn{zB+6yU;F@4bda(kpP6eJ8=ozX=3f+I%YIP0xV^i-i}*wC-rM z$lU!{JKCxADf=@r9Ct7hI#XLRqD`jBCQ3#xD7wn<+$O2*xLchIVv$sLUHQrye{aJt z9E5PoFE^VkG7#O^FUyKfw0V9``xiqGG^Abi^uxz!{}cFQQ25yelcYR;=UIw*z)Pre zE;c!dhugEYvCH((=Kb}L@AxmMML)$HzE^m5zk+}N(JEa_yu^r6TSL(KBdrhnplD8c z=GRmiEuu&dlKNf<6_3fk!`xTv8`5l>DYxhtk8gYz+j3&;ojo{@&n#XoGMC_m@1khU z$eS^E)h#DJ&5K;O+b9^^VJi+w!)IkG$a@#D{kEQzW#M?UcNf}h$)*;xKa@jS!Si9s zCtfW|OF>%U9*^pd*NhJ7vK6iUA|Fu@&}(b-Y;I6m;r^Yua`Fj1(zN_WaUkgZTm{+M z8$$)p4!R&X2jU(RoDFdg>5V@$1RaPk%e==E~KN# zI9>}GXM^p9@{9lN<9dPG)Iq8wZ)N3{lg)1PlUg2tnK5tJHv02c7Vn;TQtNJoXfKLS z$8Ikn(}FoWaH{m}+5~ZWLCzgPi&aEA3Szcxf(_vr}&9^ z-Y$I%dK-QUSM>!|gFsbj4Yj-*REZCT?C5dT2n)acjlvACM>foqCeU#9G~CeC^S0}L zFiWl!gR2fV6|yDas;%SYcSDvBHqwIDdQAeowx5e`UEZhvUp`1fe}nMJ1Jw|Y-{8KCRy)`?Rtx{C5llmvBhG`lB36Xwp!EQw zC`d$rSZB*>VPO&`xnVYUF`XyB>LD2tvhC)w&4fOuXK_rE^~+>qW@9HV3QY4b-mXN%Hj3DDAXOi3 zIyR|4{p(`-WCkqt%xdAnxy7*)zE%dv0nS8Y0HY!rb30HT)>xJ|!B}ew6!!awYoQ?j zL|(hJ+VO6pQQUX-1wzcP16NGZI*S|_gJo)lVQvo?BBgK2o$?Iy~9fE5rkM z)i0*|Xz?8M;D(u#jqe3`s!_w~i|HYPJXM@l5KvZb)nn&9&V)XF`=ZTHL4@rs)H;|eGUt* z0nBQzc2pApvvfxwcmpgL`v_Bl{TqZUsR}@F#3T@m3B`D0VnI+aX9fh@z=E;Km=f(% z$i#E2auF#6zz|4d0&YQ^)aMAn78BACN!kXmV6Vk=uSB>l9dINAlMCstb~FRD3}B^6 z7m&)BFxVT#c@B^i+}0``kyL90+PVXm!rX(~s(`j`9k62 zEUQi&lM(|)0Y(?rxetJ)0)w?}(Pr9h5^gI2+NNR@fzGbypu^YyCl@dNw>aZJEtPym z3J+3C6MnJl;4Pn|{XvtP$DO1d9C$EzP&R5dY6$+uU7<|verZ&bT-59)PqNJ?+PFj2 zMm4*R5Cd@a?6J5@+5W~8m2QU70Rlte;x5XbBI!;SRK6vo3pm&(DoBH(Hp zfO6-792`sy>VW=W7u>f!+&2ecbOE;A3`VTDsY4lN6bbj?FAbW(iX&hoQc=;RA}|Ls zFl0NPq|fNWY5;G;-HCscKJyz8&ASW(XbS*T16Lsla3>qp1}x8kPDqj9O7(PfsVU6X z8iJNU$#l4rY1ptn;1}EBE1u}*uOw0D}SgBXv6do{@Z8ue;R=Q zcQ5%z@GE~0o_GeOyLyR>wN)Al5evT9xGLP)HUX)sDF@#bCl=T~5f}Lgo%6iCBBW+y z-9l{g_=$%er_As5Os;#{{$%XuRiu9O_O5Z&u#-|E z7rr0wFJ(rSe@u1=oSE)TOY68*E#50>rJUIG;>l!BemwE=eFrDE1?gUJ#3=r(=3`5a zy87kZYkort>O$w#%WyjciF)$%t5&QOpc_lA?0Z*w z)iZX?5G)E{!J+`&5-bYP))xhA;-j50aHM-LFEt1ISH|o>-~VFoJ;R#H+J#{q$Bv+) z6b-}?1q(`(5?aPVjRi$V9aIE_D4-xMAU#o05s_pNr57DW(QyC~5R@hY1|$#xCG?2F z1f&EE5J*V!-7C*|$~n(-&inm1=e&R3>*8AMm38;E_TK9*d++R*gOfOCR*_LigD~u9 zP5fZ{kJ@RyYt_}aFY*~a4MheNBJ zt3C0RE#NQqo-!3L5G{zw6Mr?%d6X9(`_w^ZAzEMiwDW@V`6Gj;EVg64%ZO)2tQeU;R0(QsnOc zGE=t1+3DnQeC1b&F}%&o@#GipXMauJ&lXKq_PtsjyW24GX@s=pk8W_+t;?QK-zlGL zEf9INO~}o4DvYZ4xH3TEVCp{e)xAxaXJK!C+`6D|G$rEn!>~!)he488Zk*yiPe;q6 zgI}ZbMxUe`)4!mwz=LBuUbL;~{pED-q?u=%Zo|`9VQqYJdtJs}*AZOVg-P3&1>WT^ zx_xAcVQCG6D5`J(KP|9H?T8wu;Idp!rc>~!$~=W2WH^`-k|2eZl`a?;SStTN-B zEd4=1`0+0#ohMMt<>SKpR;5$JodurETy!8iD(1;NDcj#?IEGys=_qn%{UhfA+m?OzD(=9Ucp3|PdDXg_lL?spEA!>Tx8_Ii;o7qFS@Ov zkM_Eq;y1gwjsHkW9V~NCJz1kAykKM{^fqb;e$(L=%5QaB!*3Yz8zXmDT<_wvYkN~D z-n509uSXnST4{DLMjX2}?Y#P?yuI0PNBo|pcZHQ$QBQVPM0RoJ>J?XB>*B1y7FXWw z;zTd>7ccY^AM&O}DsiWj`ligL4tuj}N5)@Qmq@CCR>=3oeC|}R>(=7R+g;90BYy9h zBYB^u%%D_;vZ0th&#GIx#hXUZtR2BNj*RcR+~vcWq5+v;<6za}AI!=j%^U^9K_`72MmnpmcDYNMf-jr>{^!y4F$;$NqqeK2TUv?J%u0OuZ*1n`M zZKpFO6?c7fZz}G}HuzSfftRL-5#jxci$+oJRXmLrK67zT?VxQnd-1eUw{PrBYCY#n zS)(qzx22PTnHu#rGE%cGOxB%JC`#TueCS1TL3{EAqwMB2-bOn4lkiDHOuE)Z?k1Cm zT@05(_fE!6FU&Hv~wpmuJr8e@SN08kw%-0L#>wW|OMf_Av~Xz8Vv@UBDTGaQH$cef$(2 z;DqxTv?^6Y{1gVl8{`!NA}=Nxo0F(7J1`;Z()us==SR+cIeyXY^WN0_@>h+Rw_H|X zGG~B%5xy|#Na$j$THwTTb9=_0yy!Mp*~i1^fEoGE#vNt(jhJ2Z)K10`uMkoyF1mtq zk*h0Wx41o53-wG*t{&*>wAD1y>0~T9RF*CU2f2~|JGMt>ke&;E@s*%fS_J;V}dCV>lYZG#tq2L~Gq{0;D=2f%$}fEyL9*OCd|Y~?QeD{$Q| zMO-H<^bgQ0@>*!odCfGAb2bH>w(v-@*Nip@pduLnXdCd@ve*x>M(l@J9qxckQ_?;g zA!?S)6XknmkQHWsB@c^NNRp-vBxV&q%IpRRbh|-%LS{3q0z5?-Nn|jwRAeAJATj_C zO^3W&mN!V}vfo3XNzy*)ATk)U5asiQ6GYc&GDbE}Liru5K>-C41_|uUL4wSAfd1YY z6j&ljnprC`8xIo6cH&J^FOe`kszs@-?STcCjILja>1tG%GA>M=Z`)ngquV#Vt@B{@ zwywsV0Xtr#X0`i2y+m3WQS5E%-b_io6kq#mP7lLn;>CzIExD^Gb#+=vL}`9USEGwp z#XQMCg_fi}P)B6&={{CGYKzw%{RvNH-;-*Kn*B^+Vn!#j_?i=0mC0m>26pGY1KTQ5lpUMVpnZ<9n! zWO2+v_4NJ;4{g?p>sj;A0+KT zzmjdsZjvz+1Bu=PtOi7w5)xZz6^YF>DVXU&^#pNZH4wN51fCAyf5MworjP?FZvcU9 z5;e2^_^EO#5Xb-m^CWaw&1(n$vmoGqvU~n7uP}eR2LE@*AZ`lsXQwX3hY(6PpZT0V z;*#nY>3FH+|Z35JNGcZi4(~%*lTYAubHMj_Q?p2a^k8ZqF$+_xJ!D>`xSO$=o~Ftk zkKm(0+lgGLXNcC*$M31En{7`#M^=c4o-r6Z$0f+@ldz@!3|d8=AzY^3&bEIGa6Uho>8pNr^5ZlI|ArGgylMBf} zU8Kb&@My`{RFx#`2;PP4HM?1mH3PwLLpPOVtTGfz+?HOQ$>%3BXb&s}#837Nn$+0{ ze@Sv<2GvId$P(c069jjkN_TRAt^vLiBI5011a$WiLovXZp@8!#GZ`zEy_szn+jHrk zmI#PUHfSMhnr)v^;u0Ey8T-7->xk4Wftx02RqFPsq-qbJv82fMU=l6)N77Q7I{h4@ zyM?$U$zvjE_wC+yL~cI6P17jmL07P?;ye>t@*demE4P)U-aG^M_d#Ja+;#6#dfMv* zi(t5CS7gyKJL&0`+~u7ZO_;dRVFR(>eER5Tg9B#a_B6O@$J61a-DByd7{(tpFj6av zqMyyr?jSyTCeF}=dE7QkX6% zci7_qikcYVZ=7b(u54q_$beQTQ=jO^`L|%cZvw^zr7UFjX%=06ikvt1NA% zc{&-JXh51TAb#G@r4ML<0HH}(8+!x%0?pdl0m=@L;POm!aqLX9M2$;Ncnau|3>uXV zByvHd_9iG-ApXFm_t6dTiq;u3`Le|fT6sBa6LeskU>QA=FFwVkH(7HDL*^iYjuGCx znn61#VbG=)35Xm;F2U&aY{~89O#Son$8sSBmFzrRKCrN~* zqGW)7u>trW1^zBzf=Mue7Nqgb65Pm`CVjjj6*%%;$iqDivuYS3dAI|N95D|zDMw+G z;s@Nb4e;ifux=(4An#A+(%(WYKnlE045pw1reHBxfRuz4X8?YvCM?!Dkg%Cy&>Z#7 zkSEH2ooSBv6&CAmSgd+(TC0(J^$U;sQ(svGUw*WP#P|>!Zet%IRGn2Qf~jYhlab+ z=<_W}YaqCQj`^v}kA}Ov%x4^uGgpZ|lSvyfsg3Z3=v?h2YQGPEO?>O8ZiJmk z`cB)r-ylZKien&X7rM}rYu^(r;WA4LW$X|!Lm3+`Mckfg7W#1sLY*Y6gElM*eEsae z^eREtNGq%gSRpVY>M$crxR8;lGx_jh!F(ZH6|3N?I28^FHw!4Hnb`=d5|VB?&f^2u zH~*LSmLt{6`cN%GnmT6R$TGfdtU}H0Xq}+93k>r;4A^U#3JTu>H?5A{*pkr~_rcfP zGUc{2evM$)XRYcdakq8u?Az7Sr=gW!H#$b$yS~|a)xlLhshYRxE4v$}TI_jk8sobx z3z#9t?_@mKtDUj`&bhzUb##Z}o?2CS?TFvEu{F>+y({>{5LM6a;mYO@y=U_)|61MA z$!d;!r=>qc4cim7ejjhDx$pB?-U<5~oABM#S4FI(8=l42b4%Nk4xZ;dO5wZT{V?t30q-XWGBmBizp)~K}BlUe@3tO@aPjyP4uon;>l4c)>#6onJckb21yPoje^ZokT@ zFpX6-Pl~iQa55SK9Fn>NL!Fs{evaw60jC9mZMmM<)05rsK8%BTOi5>MI^E$Fn^c}C zweZ;G&=_jAqC<7T~D*w9TeG?C0(e-Xj51-#0!wIK&Lua;2as_}S+2 zkV$Lr9_8?xq_P~(qoTfxoIs(2)Z6>T%ZYC9Klp)8VNK$ST&cL}W4`DFD{3gTNzgvz z?N>oRO`*#s=`v=9vK32~&YV1KHgj#Sw#mwyBhjnz!8aBPA9CiMXD(-5-Zew19z3>Q za~VDAhSt2~u`_2kgq|1o)@4lcACM~PT7R!E@w}SOFVa5|u3IbYeN-4WBJdrNwq-h( zvL{h=sq%&QHu52t@lO9acAs`^SIJwd8b@UA{^I$1kNY>L&?lvPNay*>FdLX zN#zw~!I<7tr?2H5(w@3!O^M;9JtQ>+^7d!HbN@p~8SNF(i>68z%41E;;EEgel(SzT z*n?sp>@(v=S+B5<2e?y%&q`ReZ~MAP?Yl`x4|4r_~G;aaw(AsIzz{M4VLG zr%!7^*$GFhHtJ&TX6&Qthb}EoQTfR8ZeRCn20muEkIwp72spHvsXWep&!_6_e znR>B>BDHtP0?f&cf9x}nmb6WMcuITXe__(^Plr6mbtawlnTA^8Hqq?8b47XHj!xbs zTQjzM$1jZX6urxSV};5KPP95$^Z&GP#yR4`uF$j!e9SJ5(pM<1&LZJe+%LWu9lv{Z z8U9fU-sm{?=;SdV?40NL*tGNI*0@fGR$<-e=PeM?GVh)?F8DU@&wvlIw4pXsK66j% z`p|#plYkrhDJ=hx5uE#A8mZ@H%ae~W4L8IG@~9s}Y&`P}+#CI7j0^jC0ZDTSEyk>d z6_+~l;{qgtucuXW!l<6{%bfEHu^-9D#79O5MSnk#(7I`R7Az>~{}yuiFZC(MJAD$M zxai-?Q!0<#%bja~occ6Y9`B2oBkK}&t(BDae=WkrtvOlht*TnYntT^}-~aHeMc_gc z7Xf9wGWxizG*No`K3;WzIbTG&^6w8Tv)kB5J@J1?9#3U;(k}eNfqX>9o(=n|@x-=d zHf(KQoZ7-#RejzsltkjDj6T@Mr#|#okiOJ9uU|?KZq%|F zpIaam%Q_-1K7IslakDZzT+_O$8ZzvE^tT@uF1e-J=()b$G5_Lt z|Er?SJ=RXAqqZd8I&Si<)c;A`^!6=`y&E#Rk5r`PRWd&x*tSAXI*YAmhPHbRg#2l_ zP!+yDJRUF@WMPIqMRD$>OonW8?-c}u_yhY-oEz^4s^0+l*+@+NkoSN0(SxdXDNkWTi`5Q<}OhzP2~)l-t}W{<-AUmcBj> zW@!mf_#!^RRS@w#lQC00Ov9L@^ZCKgw~>~oj`}2XJgi_ym)iiwWTNO;}=B0ZZgpjKT26AfLGk+Ka8Kr zAF6`=dz3z2Tl3wlS##~I5^NtM%mhTCRuVQ0_LNb@hO%D{RI2Izmv>R*q0O3po^XJ= zPoi)&h|k^MFu~bij@?HUwD;Ihxm*0xcJZ?6{4`6k2dUaWQsW1@_rQ=u&3}h|JOD=a zo6&k`8wsRkxI@2@EO1T4pqrRRPMzP%beay7PLRLDr8prP%Jo1aa~G9+3VQBX02BuH zdt}%GMTK~dVUDB$xEeZQRDO@_IOTt{tN~r&Y5eZLlH<(YIa>J$^eOQW?`wIf?#$SpqI* zn_UrO=jk^Uehsz{#OD)mx3{WAygK)MAZ&r8{aGeCtt!{Oh4#X|nMN9*m_WqoK2}wK z3mlH%y8>p{vP<&52&@K#zpu%?|zxi2uzhfg74$^Nxd4*B?q^qcTYNg0eQ4$6I zHN-pSE0o$e0yW)FfuV4rsMLOyX z5W2bs>9~o?NZ1?4Lp}a$h)&EnBB}XMY0wKrGcN4SAhi>cnxBP@;Admk9%@BW&jqP> zBB@bO!+ijx4o@O`Nf#lh2@vusKvGBCCI>)y1xO9N*bs*q+b8l{P-+d8DArJk@_=#+ z0&F)BV|R#yF_F{ z^cqRY^og{1u(QRKH+tOB@p17I!bUGjtkrsBl!fIGyS$Qn_d;9x|Q zeR%V46P)iBK!Jsc3~Gsp15jXb;0jcxSFl@XqwHqdRyB#0WWeD!>{{uM_@*-~>>!~l za{w%@*Gi+}TWRn(#8QYd*^3Nl4_3nz`ygXU(!sZm1YPBH4_!(H>%Mqp$#B56k=$1D$+a4T@{r?~5|8McP{#}%-hO#LtcR+u>f>Vdfp$C#U z4L3EC$7Dc~&575aj`w>|R^hnsLwDd*^wri8#88;>U{cLr_srM@|H6g!22pLq`uxjP zo^{O?=@^p7^*ZR#;qojDG~MJ@w6+T6D}Q3q;$o-vhe=I(~@j=6(x>6J zTXzGBVtke)6yg5_ok#V}89x9@7J}0BFXV584iR;r;Dh}ml4d`EQ32;X5_Av^8G#O& zpo3LBW~o}Z3W$vuX(Nqzzh+5ZBES#?IM=@rj{wUrBfuYUol19ziaD?WpBt&CO%NZb z1FQUignbCsQ%Barfr7zFn3247AP3a7e7C@PH+4!2QT&J~g88JUkXh~`iW<01XFFis zi%g-ZMG&t=c1}ftn1aM+h~iRYzhC?dD`P>B^mRayeTX_0^eYGg6&G_Ob?Td?P;K*I z(i;h4)$f7djVK-fiWM}>2ww*T$wtUYaqz%CR`^IsYXMp zVRZ;%9i-X@#Cjh9-a>#W0GPI(Aa+MX?ua5YE(?Bzp$tUhJ6vZan*QgAd?M(14oS5d zq|zr)r}7Z_JVf3Z$SZ(mq6LWjK_DLkG#ZgEY%ppNA|Hgv<6ww}$Y&z*b8($KWE~|m zgoTAi2VFd`prOUMPRf4ZOx^=ZZ@-fz;UP6uksNxkK9B_}*Ms3G2dPtRWVr7TX9xd6 z85PJ&ko2cPF)ZSYMdb0ISTY()M&y^`I%SCbFKAvWfioYG#{&8L<0(fyD(jy9UpcL( zu@A>x^VDn3dtDq$nOAbt%2b%5+#U>Nw{P2^>~{UsjypsSl-;gzfMT&2g+{OIPiZ$h){OxwH_W( zDqo90q3m`X%5GzGpzQXh6_nk+g|b_qnhI3u`>3(P9}uV>0+rO|=U>NU=Lagwdw@6> zA?5($zq>B|eMcuX+Nbnrs%H9C`Siz^fdtDH%wdw#z3${S>bK5*esb2JVV7anU{Rh! z)Qvsy)&JINvC6>Sq66*LkD+?-0Fs=g}+p^7PAO z$ly$lqE}OwqXt`SSCKuj<5=D9O7Dy$-H(h>Z&I*}#jWi#hR*7cp3J^!x^<^PqT z{BM+@{H-2E6z1_yB`$xdLSfs;DyN0-;W?Et-}TS+OjiC|4NB8p<~VMRU3Lg7s^d{& zZ>rXl=CeD}ns)6myvI55yd>^%H(`AA7k+jq)>EjO>(tix-&lge{KN6DzPKv*;z8hx z59Z5Sd2hlp$oyEb&#hEZ(Dcxvu*UCArotL`781(1`X(b|DOm%Uu@p}Gn#q)SkMYZg zh`d92xR{>OGPfmR3(B=)s!CXlGyJ1vZi?cdu*UBcwac_=)izEA*NB!uTTAe@B(q`T zh3_wwvoJr=Z?Z5|+(H(nI^i}e?MLBbR@zT&%{*MBV_3P{N(s@)DE3N(Q+)ONWllyh z5q6U)A-Abvjq9~DxW@AtmOY*cezWS9FU9caXlDJa2Sr6dY%NH}rYl1*ndw3>m8R^Xw5>gWZr@PNam%4jGjXQo0)w}NIiw$WjL z4g`J?jVp9Q_52~%*2N;fHR(R+F$s|()c@xMp~CQxJ7f?5YAxmuhnPaWf0YnQ?pH~I zm#k$UfM;#Rkayna6^fUb#WuAzujfvs1s?8My57hed1soXXOoR8!8owI~7FM1nL2`6m0^XSMRqV!g(Ei zqe4U+M&qPEpeEM&Ew*unG5b0g!}*_n^WMI`dE6L{vFc&WsDEI30j}vjKefN)+5?}s zEMfx2{k`xaf()u_9(P2L7#y$<14wHGxe!5y_y^4XiXgQRB(1(V|3|9PfOs*2%mzqx zfb@yOB2fRN#NA8Hpu_Ci{9-O1uyLStR=FgDyjP%;l`OhscBaaq+n zLB~=fq~mrN+X`cO(V$0wseeFsI_Margmg5*nUC&6kg5o>w|~I*4u>Ig;d{UCZsJK~ zl(q#sS14Rvw|DUc(~GU=%_Zx58gq4XVn^-||7mL;KXN-g`Sw1yu5-+0lJ2eDM-*ho1gxAi}Q0SfwTbS|b`-N1E_*p@w`PmQ0*0aY)Y6slf;qc@wGgCxiwB zCcK=0@ZJ?V_!L~IW;G01C*V}xW8J738Vm#4r}>D)QowoxLrzG<$|L}!LvIfvn5a)+ za*&8R`XFKu2(=vv6^+mi0NPtbF&ZdR)JYS=ZXkykq1gfbY<;@rRl9S*o9_ZW1JrYe zo^un%Y98Xf8WC~VC)lNdK`>`wNGB=FU5~`jGDCtO88<*Dcq2*oJ_SpfxQz&A$&o;g zJTz%E2B9c*(MvwWDnLRBjM)&oNNtuAjAZyPh+@; z_iui9_vioJ=4<8i&jORR{J_-4xr{2=EWGt%|Dv)p1-NTVe$wmqQp~zB_Mp*iLEtXu z!VZkhynIz36S|Aj^N!)2DosPCsXG~OCR-Zaz7HvJe$iq3+ai8L2Msr^RDj+1y;BwW z*z(Yg;v+WG$A<|T&052RdHMDQSg!FfL8XcH99!Vq_zVk(bn>dc2rIF{LfP7O+RE<; z9keAs`JBaHSOg!Oc&sIIo65S@LLv@CrTdw5Pk>ovqt>H9ZG_^Q(8-T0JoI2u!CmVjdjJ}8Y3r3k|N>d%fN1t z_{h$ItYN~kK3YCDaF+n7M+5bgk$QGWz18i22CwM^v=l&-84VK_Us;dP3J@9-q2Zb2 z9m_3h$w_+8uqVwb>&RfxjZ<1mLX7yxHDLqN&e;XOe^K~7$>Vi9nB))3rEA1T2opny zozFAuqZ;zrzFBP~WievMb^~?^Xc8)`k(ApJyD-FV2|^PiH0(1hHwsC)1)Z+(PAS-a?NgQc}%Ta%DWipw!FZ%XS>IqU!%lRJB^~(mo?qTUB*rGm+x43 zu z-SJ@806ny7%F(LvMzbH$u0(Q1voC3b{W>ox`}lN zEfS$AxxiwZX;&)9K#TP76j3ENDjycN1g*8G0xW3^J}a^5hq1kAjV?fFS?z$v%Llu{ zn=b$N&U#Vhd&b-QPqbcb_Mkqv($2k)Q&d(+v8sFXa-+urgQfO9?{BYD61Lq>-nF9l z@O#W_%xu?HbV-<)-}u9^<(-;4qK??KFF|t@u>)DyU^ps77c6YV01FpIO6sa3=AxDR z6PjE&MSl9U9;sZ5mJ%H;csOI`tzv{mxyuVA(vY>QG?2-YDIPTuKZN4|OfH8X<>Q1!%{o?A0qT*T1)B?V%B$ za@r_8?yRQs2^#$Bo?M*Eeks{Q z;_^(5Gw}_TY!PQr8g@d$45Vxy-har}6r0C)mWKIQk4nYf8LG0}R9Y!JNKh8cZsX)u zvbZnBkxt>>lMCBBdnQ9(iUbq3JfjHfAolsAJW21dEameRgL}*QA;olY`5ivh9VW9)5v%X8L3X z-&&mNY^PTB1BS4|*o^5y-DL9T_;%Atp7D-^{W{7=>%Y&mS2e-XgLWv5AJBPwil051 zRy>&&R7=Xq?quqYnzz!QiHN5y6(7D8K03vw1+R6MF7-?=f7;|eUG@rBx+f)*6T>ck zb*ZS5mSfItag62$(&|eTUPQz))GfrsuF9OOg~y(|4^vG{%E8%@t7f98t)3@9WC}ugxMJJ85(hKs|fnS8~cjg)>B%V z=^$AXc#yqSJ3hy!B&WQzE2^y`m!2NwDHeV7+*z_3DJ>=<>>>NrZe0$xm z=GmNCPt0Y0Z8ViywT@5UBU&hnr#40fJC*2*qdxyERxs#(!yq!Z4X$9XTrkOt0 zJtD^w8GL?k=^(d9fEV+^j#d)LM|+pYl`He=Z?33pZ6Ao{VnrtI-WU58bwSXglFdgzbdP9Nq2K4in}-kl(ga z(Wci2-QX)4$w`LdxNSo+$2;{kA-Ri%@;-G&Q zXNf0L4gbtEii*9`%IKS!PrBbWP zB+jz<9PsWk0N!0jQS^F%4LYN^c3#j~MP_Cgq~J?P zG(1wykQAJO$k`#wg#m>fh=Mr`m89V;=K)gSd<3_E6#N-F#&w{=N>BmKv<*@r31_(v zP+p-0F-%lsE&{1zkvQ&#QM@fMvW5thIgGyKGhjAknrbGJAu`03TVs%`*vx zJd>-9ssSz!sgdWd$XtuW*n~)Ek%D_`V93V}hUhN_cE|p!v+IBOH<8}R*!Z?b;B*!z zpNa5upN?Qm6m zaP@syaZ>gFb3*?wJE0I%y|5^=)zj@TVZx-GtG4E5dY31)+AI{^aLO)1+EVv)@sP0= z_&H)Hxfkk$W|IAYh1s?Eip5ll4Y-p!$iXv5ZcBOxZGmf$3!dTF0YQlE=(bUc{6c;c z1U^9r=b|c3KWANJcpZ`$uopj z3usm}iO0H2)?%0M5LzsXu%x1(06c@azHBFAwhdu9AxG{PP|f!y`1Y@20jUjmjR4Z2 z806YFBS)G33^~dT;KyOzz`q_o1JM;nbRVtw6|mMIKiRQ{oD_rXK_fy?<`%k*>bW2Z zGmwOf5wCQl7zApT_31nZr%~@5pw)uYxB)qh=a7UDyRqz+3`hMBpWgpKUZ%Pxe1Bf@ z^`R%_DBvZWNZAL0t5bO>3X$3CiFO=c%F&Kv*+dFDk$2}M@6>2^pGYBktW)6|(_I#X zp+#gnkpfY(qC}V%s~T7Z8g8(8fOyfy?{m+BtwvDvg!T-ShCtW?SLRtf1Hxx2O$KP~ z_@M~K_uyZfLO`PmUk{<0U=;|}c-(^URhk?A>rJ73Ex-oa(q4dmswxp)d8wyl{T;o$x{3DV<89T`pG!}VGfmhoLz&5G8ER`zO5IQK z(~3(||H+|_Q$KichkNoaH}mq@OZ4gKi5icvcFFYBL0fI(IH%Asmo3I7X`SqF)vcO@ zJIOTzCqf4=2K<9Bt?wLBp=*$@H|R)Kddf_vy^{1@JRR73_BQ96qr^VVlOZY$iV#Qw zx#0s(3L4Gr+XG(Aw0!$0Xv^e$u4SAID$Z?x*(Z0TCF$^Hf5Ll-`zukV!?^I(R-8d2 zXHwEYiE53P3K6`q&qWaO4_@JGg zqg80&g)PXH*z=k5q_4l7!X5GpSf7r0SJNt1KFVn%@rLyCDdXeEE(~nZgrdwl^#u{( z(GQ8@;e&ss(UnbK(U#7wNpX&Ee`Z}?mDVT839cBDM^# z0u1-2YxTC0)`OCcWw8%i>T8Y}R`EKoH`2#78f|7z)l$*+ zpuls+Pu$lTq_7Ph`WEU^{ECBe%!49E@QScY|&XS||1@JP$ zU7nH?KgZWcH)ZF&yi4!NtY{<&v%Lk~ljp;hj%J3pO$;0pG|*4Ck&~#!+wVD=HkK3X`*JgPj>nkWZL3&wBGAb)H^lwhyR9?U-9B<$;6SJzE1OE_B@HahRfV{Xq#ka@-I(3%>qu>L1PN?G_tcU;H z$TA+YE{66z`lm+3kCstn!kY3Ywq+7=v)q-YkStj<>F2Gp39W<8A9kfB{+5#`eDYzU z#@8}^pY1twTD)@gfl8u=PetiNVZpR@0^3<^dOVS$W08?zTPSP#n%SA+6vBX@yRNMv4khdmYO5q)Rlf@+^0S! zKE>Tw@Gs--BKBQ=lS5zpJN3J8;Th_d^;V3& z5*^a2Po=7)V=G>olFYgpM=tZN8Ao>aSHKV!h6MVA)p25@D9&6obOnZL8Zgv_286j4 z3yokXN;9K6nVQ2`< zh5LB@^GF<&-~%5>y58D*4LV4;80ge-lB!oAFvz*Cj-!JTi$ORa9Yn4cL)9?^I7qqP z+It&^v2#Um1_0LsA|MMv#&yejI~PUz(d4W-Y)#gh~PSsnRN|_Xw3i-{TY4JixB5cXh@A@_6@1RK?_|O zhBm;^R-~mJSgI8b8Ntx+b!Cs)e#igS)#HEoH(Aj=?u(SyiN)xwpSUMK>nVXx(Jp)@ z2f1<)7oWoAYBI-7>A5eN_!Rka4|C97zVhWql)Nr}kuncFkS>SDop+aSDnJpyY7_y4 zBr0Jd3`GE!h+Qg}DC0U8rB0QQ4|04eYY`uksJLkg1Eo$E!+!knTZ9IAEW!jNQRn4D z5|z6HUE@^c*Eke#l-+`hm4iD992z4J&=h$*kVG}Uri!j{kVJ)RTn1d@&cHR!1f|KO zb&&OzDx>Tg6Xk_X5SkuBgCwf)H5u?+Vf+J%J~S;(=I9qMPKLBzh26-$!Kb%D|QVkmvBjwjXO40L{}1c`Og)sndK&or+PKUdbJtBde?6=gdM9 zl{x@P)GO^-kf_x}b`3|~5ps0Gw7@<=$|$=Jg#*`q1gCRd;dQ|3ZUFQ2yaUyi=40K~ z0#bpTmjxhop&Y%nJV$SUyiYpvkKZ8gQv=O|8;2$4B z_BenF7vOt*AmJ6@Rfg>GDh3?nsa;dmr{4kE?R?~nN2C0xI+D;7x&C-GgY{?zvyn5N z`3{L#4I+lE5xZnGA#UKbU-!I>(B`9wS4U=q8i#AI*TFK|R0Yed7b&LU3d?0#0am*n zA>BbpSY(ZBFl83+P}bTOA%Q13|A7IDPME>k47dssCb;4m8;}W4qNRBhP1p|LWD1e- zDtsd>=#ms`wXmM)Zv{2^M62v1OUpG#N%S0zzj-sN>^< z(alrO#N+c@lWi}oFQ1rtbL@hbSyAQ8_FpWi8;qix^Cw!m1}1`C-;{=h`WqV8Mg?RE z&P7K@?Bjn6I}tG&{$WJPhx3O(n}|u|f35s{n%I_IK9tJOGve9Up=9)%e@jLeOEIc? zZcVRB18bX>nWh-wD+l?r;vD?dQGDx1S@*31bg3s~p?g#QEerjS z%NbSj_p1=iyD;)qnr3JkVa?&W3N=iM*gm15U%xg#J$iJ!@9cV`l~}uFI&`U#^SmtO z!T!VA8NHcFYkV?{qND#sQhJ1QKv$#7-N*HdWkyMJ#OX!rZtU|qk=c8uX-xWyC3})= zZ;8b>2pruh0?$QSX4g2Iep|r9F;>*xaPZAe6&0*qbKqfo^pmq!nMF%eX&j4`sOg8w z#2l*}UK#vt&G5APNOtpMspD^a#1dH=H-6@X9nIn6%3}3olA+VyZ>4z*6HbmM3K9Bh8V zt-P?^6K_j*NZhZ7@~P>ZlpyUAZf}0SFN=A9dUtxZiu1BRQ4+e$DCEn%aO`Mj@i*`m zkw?uAHcUS>d|>-XSJ7X8at;k(?`1K+PLKXuqPkH$_2`C!j{`pMvufd?kxWNNT9*<_ zY8AM_z~JubZa)`ZVTt?4m!#8TA^%I>U{l3IcXRPC89vwf@I{ZoXj@){?&#@oH$UDj z!8gAVXMR?4Q|`b(izmTH?ht>Irsl;a1l0r?(;C9c9NnoSt=p!}hi1hi5k25h2POO& zNEjm2v{2hj#Z6SXBko1uDOY$hTihd9*8E$%PJCEGg^G8F^b2!vHAFY^VvS}o!=e-3 z^;Gv?b3cGMKxRM;2wzSYw_FzhK24o;z*zIARO%R^kbwOG@+C8Vsx zZycFwcFu(P@w}sx|J2CJkK}PC%n$u@!(Jd24;}8W>vzz9i}k(!odO>!&sL19 zxN#>sKREQ2Ap8An`p0snmvqP1S&K$W#30*YHYhAV$EwRH@6#Zuc;%7sCJ1*L5KAaBI(v_vTF`GT+fluR)#6Np5R z-4;{UnSpD*#y!=$jqZQ6=L28Ltz2W+JM$~<=8`wgOOuKE&PvHU`}-u|0xaKd5H+Js zf{qGwq$Z>!L)1}3o$aI~z5zkAcM0lP!|P}Cp@TIf%)DzUnL?f9% z4hIyh8ZoP{QK~T9L`Gbc(4KK*XGs%=%R(Jf=u8(gTvU>@l=%FltgB=EPDNYA{?5Mb}k<6@_P&T>MH2b$yqN^*2f)c(UQ6WwjTwv80Jr!MZHq`p)njai;a zRj=BYw9wng!XR?XcfA+6r&cu!?q76UuJiuK{wjED;@v(!CAxW$yJ$=MSlvbLoF%>&+uauU zVwNt#Ur2qaxpBIw%S}5jQZRe*5ti<|=D{2x9b>unCH~MGug}t?ovW`jc4K!>d=Ed| zzfz|%N;8}-@5YAw+4WB1H}C7SpSrPvF>j7E>3SAT%mK#UJgM3I;#x`E_1J-|mv~^R zHcI>MH0_Jjj5_~XbvJh7^d(|=&$G`3Q|_bm%^wnjTaMDsE*xO!V#OX=x%KGr;58`t)*+5)r5rk zYcpyjM=lQ;j?y?MehfAh5*AmGM`@TeJFe91M(ZN0>tdo}Mz%jC?OI2*1lib*Bi-~H zZ?GGSEbNaIoQD)Fy(;D`_~2p{DJE+6nhEK;m`FK8{VIvyl2Ne1$@ZIyew1U+T$03D zbL{VkIc6%$EAEK1zGqt_ep=mfa~>I`;es>jC4MWpTSjT>$5yBzcJ66%{cL?Hcl+%8 zDE;}~fRDJvAa0vSX(!EE{=%&qaXUXs)Aibw$CW-lQw_>|cY0w7o=TkC=UIZ^KW3FG z)>_CT!7qI~eq#Ak7*zr#P{u_XCnhd9{(VM+imh=+5zi-8L z`Kp=F>ju|jcB_!SFA1>R4)6ZNF2Ua#mJli&EC!Ll|9FpsR#m$K4Hi`D<(B>nH~N`gi@mAs8`kVq(OJRO7a zI)UZhh8EXUS9N1@g}gl?Zw*j;kB0`a@;37mI?n7z?R+`NW_f#F-m0VaxO_14iyV+6 zZ{?`jW?Bo^wyFN5#i8Rw`7y@5|4g;WP~I+)w_8w~B1dwT6L6Lvv*o-u$~hgBx7+0H zMLAcw2JAk>k1glTmZPqggG9*NdGgjq4lW15e@5VVIVxU`YAgpiDsPSCEeW-ODMtR! zTqIZJ?Hzf03$-8RdgRGlAGtO@^5gI1dT7X7D|tH)wHJK%D4P6<_m{VR@|FaxZmOK( zb$NSF-o~Of*_yNs{-sx|!&G_8+a|f(igKA8K>l1P zKVFDXb>$$T%MnPZzPw!|2bWWvOpA+LHuON=x}f&|Bn3k$DIaNz?#AV-iA0 z@;@ixuCKkf@ArNGwchtz%awaeo_+TI?Y*Cq^V|D8=jotAkosNH&lc(DOZaIi9nncD z#F5%AfR}G?mVPO<@gV#|AQBF)DE-3@_=n;<$bYQk{vS%%|K)x5sqYc`t$&)gzQgeR z0W|#I*qpFsoDYLtT23Ye{bVHk6M>Opkl{qdSWm2EbaPz0tS?1+29sMdUSW#zuQ?+<5qqqScif_!K>oTHKYL66W4iEV+(NJ(15VWzREffBJN` z^2K(MD2j7IhdMhl81cOap4%YcSIjX(!5-$%gj2^j)b~b`11v%z$FQ@}CdrS9Gkvu}c5RergBvTXpBBU!5w+}?o}OQD7YU*Z zIhm-kdUoYQPF%>N1HSJb&B((djvL0ULXwLvn;ppq+i=m{nfx$BBJ^-M>8g zzuCX+^zZwZcVix&H#5C;V73_H#V{Q^Ca=NKEN<=iPZe;%D@MLsQNk4pMfqyVb3GZj?r5Ian&b>dTr11 zjL^Yo_hBL8r1(-0+f}RxxFVp5a$Y@6^vMvp>DUh1x*?%+Zhh04k~6eOmfJCZFvc%2 zpy9|PSu{%Co;r7*^D+4Q$uNFV4Diy!G5d(vtg>m;v6ub_35P7u?${GTAKS6IAEQ44 zZZo6X|J1mJ%S+pwR3BIP-1w9IvpF;0-l)$tg|QPa&)ZfQ*FFvGe^nU)|5U}+GPri_ z-YH>BiH18QMrYZsarYbjCu@cN%#%E2PAKhN?8fQcfv^z@_hOgk z)28)04nO6W*hfejygHh?uN^q|>C^LpH%J7V}Kv_5(|>--{cN1@&x+EUp~->Kl$H@ zyYTUUecSdm*3?(ss4G$X=aKR;$V>=@Hz)m!zJFx`|03e zC2~*Z^Ir-%);8S>D_%!|_Xkyfjnkl!zX+364cBBcB#**BQ>)jcS!2EMoJcnj~m}@Vl4Sirplvxj9$g zXy1Sb0&;YLWHbglCbm87k(=|5fE?t81=k7q!{=|?owX(D-R7OG{VcR~vvYH)E#dB8 z!Rw9n3&rPeYsTNDx)W^Y%RVA2XYK2$x<9V#W`50F6Y4SSZ??5%J_&_YO2bbf4Xm#; zV}%qobCb|=>U+Ad2!&l)q$XsduVSY1{g&3}t2;q|I{%Fzr>UZ&65 z3i^?Jn-uUA>(Ts|Ey8ywtlqB!g5Oa$9I4z`#y7845}#5>zF~IEQ`R$9R@BZxGxg3Q_FohU4bj|XeRIZvu6OuND= z6kkI)hyP`DlmX~WT7^lhK1y=y{)@?+OM6&>iDhg$`{URf|5CEOz2uF5Vwl{ja`7{& zd(yEFwfCq><12FZ%+ls5&$fDx68V{Nx{m8~#0At-za>mW<_}&o*h=E}p^%9;%GIKD zgr=(0;X%S0*NfqoMAldGBFYg~<1pU&~QF{wf96k5qslD_+WVf;;@ZIyZcI!KM%^(fhTe!DS z$dnT$!e8^Xp6{~;XBB_*Boz0UI@O|(Q3idJlsaHFPf-r=_J2s#CCS~VO(C6*I=y!T zD_AwLCErQeIa640{dGhQC~n5x5f-F0^8qm!I6@a^BuRvDsVo9)Yi$Giy?ATuu}QF) z7a7bD?4#o-qVxoo;RvGA)deiX6_|%>L3dyw1#lAzwHBR5+B0R&cUo$PZxK~o{9s%Q zwlFPR7fzVBhR+bROT4i7U)1K60p)6;ox|T$a~&6N^&zoq&iNlcO})MDtq7B@g~*B-0Ip(b{~MrjamLUIs_%dk*a@|uiD7>k5R7U9bOLt-VN;|3 zN@SWGt_nS0ln?kTnFL67vpwLQzybO%McvI^$|HzXS5eo61!?V3FxsemVZn;+&7z}@ z0S3_V2LaJpW{Jh$EdRD0kSYn_=QeZEV3?NrTfpy!0e$<1ZwX^P59w17Q=IX_Hd#2a zDTlxix3_)<+{V>vadkFF{j5PZYV14%WH6YUHbO>^PEl~La(6fq}eK67uDG+2ZR4D@F z*vEi(YKE}l0tztlCEb9Lzf}W_JWQKj6o!B6?T`y~PC}i4?7mv*-U4;{L;8;ZC=x<` zgBh&=RmQ;NQUxr!8wnG7`%CCn7s&9j2$)--y0FHiV3>P<&p%c7|1bacNrGX=jq6aE zu>^d-#!j_mJ3sGEy4&8h!Uy@W3|U#+k@9%dd*DRof$Ut~S;?86(Gx2Yb{<{p2>&f} zJOcmiT>Kny`MvO9J+hv8o;iXozZXm7P`!972ENu2y?9m_7G)3&Q_N3qrY?P<2 z=cHeZQs9`T8I{~ILjW_0DFR?+7mjlO8%akdVQo&CH>wa60dG-&eF_YWx=p0#3*07e z&rV#5!77#o#YuPbzzvF%_DsJSqH=4q#Fk;OoXN^0oOw^r^##^7#7nKSg4S7?LP%MD zsCS?fhvcLu3U^S*MvAlG)$Ds)Y)H5RpujksLD-}l;*SFLFQy*FNzU)K0D93blVJT* zIqe1R0UexWZkjB&fTcJocJWORJ?$i+C&NI2EX*M6dp~{+2^8_AzMKDsqvoW*lg}iW zk8q@l@K=E%fe!Hf!_?XkEzfg1xPu&q&>XA^|s`I-nZ@(*;)xmI;AH+A~z7)D6pl8~m?J{cUUp z{N40i>hC+5gk=w$>MkWxg-5Rp|TMD)@GAPSMXZr)Og zC?W$OIw6%IcHkb2FX&6Nf#whVZG@B}S_%>EmLfv?LPTArh%+^KiZrl?GeBU`r(s|t zu0TXcDWbS8fGDm7BHB)sX3&0^L1oeml30MW!`_l2qL~0haUD`b>Hwct zZo6w(`0vxtCwvLLWvo54+VsxxrjtQVG0`!;{UHieM*1Ps%#e7nA>@yXW^N!UcV^$`whb=-6;-lh3)1q$I2SpK)99H}5c>@!- z;A+BG$N9${dsfKHC;ArIc+!64((|gPBdbl7?;w;s!b(l+6CZno2&O%Do>SBq$HGo{KgC~u_L{-D zi>ntiy-=mG1(qQ$aqn+U%;$#-YO3mAP1ogz2x`PFysmK7D~vQM523UqspJm%d9s z4eRP;caqY@e>-SrqMNGZXt2=0zZH@+{7Rm_e?F${@q+j^^~5b~-)-!zW4*{{LR(SF zG{J{sdO_u@p5C7gduA;fK2JQhR-Q7iLUzKhls%oD`W3Al> zDYI=A&!!_qp=6}NSx!L6)8d)NjX3)J!y)<0LF8v7J?d1limFqZqZLDMB>HTSU8&wo zIP^%_VNjjg0Y6YHd*(dCdXV-Eg zIhyz)Wc|k2Tlp{N8$_(6XHmcjDiNr%8RYIDzv*9s7=06+npwGBQy&SANu_CD`#KwH zF8mtHfMe-Vb+3QzkEONVDMj=#fEoHTb5RBSm_`~)tNJUYGP11AMV{r8W*49Sfv z%xv4WrGwaIyWaF6>otPAL>9SzuF+nUsd;LeYqAGdg z?h5X3xA@DdiTT)@?BI#GU-=bLczS8TCTDT~zF*0tg!E7B_wAwQ|12uzA&VP)^YL|f z|38CABbKuIt1lSL)Xy(@PeetCvaqEwO}M%*>mwC_B7R zpZ7W`Pg4Gh@)Jway0i`Z_+tH06cUX#o&srqKW46 zlr=ln&*)zN@^a%Fi|5&)A&2pkoL4+7z2F&k)WF`D6N6-$sy_?zuDy~CGL zl+;u{6tBmbQ5|%N z_TGJ=UqYMB-PKGA0&qVyr;ygEWb8B7Q^+`D4i*aLJ9`6~H^l8D;CaS+tdRTY6ILcivl${vhPY`Dt%HZ;$r& z^YL75lC(MrWA2@{VF`0pCSlWvu`lZ9acp3F8~7PPlWer6b`3QtpGN0_1i2wE zD(>cM(-*i5E3hQ79&5*K8po{xzt%B8;vkEtdF-ElZ6%)T{FiR|+I2BAiRH0m&F&RV z5%QE}*H?B{sPxCUI<08pKS|rTi;dAMwPv+9^W*xC{`g^O35mP2FFigaFMO@q{AyNc zY)1I0ap6kV){Qs4^-2j((v)xrjGp6VRF|#$suF{xG(%S>wR?x3sPq@XAvb{wznfR0EIF*oY zVZeoP6x-`7MVG^C;$8tu9+v~%Xn;E(>Lz-FA-@3J`vGpY3mmfSL{i`_s9PE8b^}A| zfgxSsg>h6{cf2PO#WcZqV#%A7D*zhpqb|X!ZqY_B60Y1z3|0b<`QKLPw!B^+;gNdq2I>dg#E2(?D#d z&DQ-OG!aPcvE->X6+@zBU6z-2!G z-DOvRwrG$l4lq?>V5+=7tyju{Vx!P3K?!LR20{N7K;w`SUZdXy&b1l$j3{yzYN3V1x9OEWX_6daI`@VbsGYjE=Urzq*27fE*^o!xI@2Ljw=+R9R zJ1|zNhpJ4Oj_z%Bs39wDT+VtJ1E(;pAHj?J724w7LsaU(}a!K(dxUMQ01P z-kY$YBt?DCQA?Uw3&<%a3J}j3CRjYX8Us!?n_`AI5$V;Adq0j>I87d8Ukl z%V~E^5R5+n9ZkCf*t0cI45mweI9&ohL66$ZNxu?t2~L;a!RfLWPM2jqsGmM$oI+6o zp_OGAFkLp~fu*^Fbh?a(R_=jTW@i8^0Xfs>WoLrvlGX~Q%g@dX5=A;)0$k%bJ1|`e z0bNz>GXk`hnM-lf7>h7P*v!#7aqoSorT`o<34&_`;1B?u0pMEWI5ZSn3dJBvwdX)F zRVaq005SY!!PdJDEl}H01__rUxJvpQ26!D)4vMXTVunyG-xu{{b_;Z6z8`QUnuJ^X zT6_Zf#1V+4L9r+(rU|I^$TmR9Sjm8HJj0DqQ8i~{_8 zg2ACqtCL7-=1#v|J3t(3L%f%oWjkTN~(xKs2-K$a6EmM~?4V9J1eP|&N! zpeWNY(;~bN<0eO%+nYUCHz(xB~peeI8)I;B`F`K(n^?01~8RCHOt(72~?JMH}9X%wxT@( z%y_SnhTeCyrn91|-V0BQstqqZ4iA&uTDm(n-Ie+S{lS@`vrKP$%JS*){X#t#It+=gQdxvBKw{y^HqP#!fj zHb_|CAw-k%AL4ZSh^v^HJ^92Y)^=Lqd_I|nj;Ld{wFF4^3L;$sI8jHMJR}@rM1LG_ za+r&JMSj-k65KD!=^%4en=S+kmp-P9@!TCoIs606Qnn2-wyeINIeNrFMC$HxjhxGB zKjI~@*7!*LZe&oWw(vqsz+KLF!F>vKAqAI zwi%5LL3^Pw!jp5+eV?dNuZY`CQB%Y?}$gjgLBnN8=|kUyp|Rd zP7CYb&I^K!FZfS{DJ$&}_T!Z)n@42yS)zE8z{(T*e-x_6e%ebtB5--*ezMUE-N*$Oy4%@ruN2-V zkuowU@;z?OGRfpbDwfHBdMYY`TUzuH;HxNl1g<5WVvaRq%R?LvR z5u8%LgNr0O)KY)H%P6xrmHadRUf@JU4#QpKUs?IZ_Vt=!oYJ&I#g2SpmEIjy>KjT^ zeCdbVwe*BZq?^Cna97x)bBwe0iFt7q_&P{{?`O$}!UtGTnIm#tWy!mu3 zm0S*L1hZ3}Gb8gcE-^9g67De1x`dTe*5u$!&1)o|AEl9|LxzVD{XEXFB<-A~zT4DL z%ZJ;{1Aj*QPE?$=^F-U*mHEt1l~B9>`C}nJhB`I%{_(|r#;g8W$HsIF=@y^*3KS=5 zq9dK-Tpmeu4xFBb%>AQ`xwm{^E6v*_h`a6*k^l66@nfa`m97%}m{`(=4nfouA?Uxe)bXfhFc|^8d9X9EEL@`1y$@_*(tL{SwfOWvPw|=G&&QhltLej~1-9 zmt3i$v1fAGfqX7yG&ZZ&>aDUUVog)}-D?GtpYCQlax8WtQwt|{A{F|d?L?-v6)o@F zs-35AZdj2xVR)(VYK#A}&hP5-wam9$e<`_pqV3*|oi}!pD--+_roowxjssNXtmSiu zmv@39|EesoT@hi9EcaY(ek_!*qH|e}u~L?)wdY#%B5zM!bHgLM&Kd~*R2j!X+c!b+76?k)EmZ;#P#T24+ACJ)1 z{{(N|kS4+?lf9^7Q|lMvZqW)J!64+6#QN(N9wF@vkHE94#1Dk{NI7WOk z#JwP*l{)`z@%ZoS)kl-r%2}o*8)m!iW;TDvBW@2UJn}p~LcUX}Z*>*`X5L^Jpn}m) zWh-ZWZ`90fy8H3P#;kWc*O1h+Xb5w|-*$G$Ut+AiO&4z9R9tGd=Tux5A$(ESt!F_I zU-=%v1fdL?68fp2zo9Wczn)WZwUB^B><<9-d$Rz+GERjO4J?t?EknJ)mH6U+7i@jk zT$D+$xD1N-=D6E}45x{WoQiMynHdB}^VmFr>n;vhBq^QznL;+hd7VNzubxxqRLpM{ z@s0lp zFZzuf&z3)^TRM5yChhb9dS#ZDb=-RM#=Rtd!QIT~+G+1E`Kje078lsA|eq0gfRGfLK*0C5mr24GI z#MXDOAD`@$D`|7aDn{wngcn~Ug=afsbvw#KhJW=N53S1bd_b@FD25&xY3em<#U?o; z6XkZ5I^X!AN6)QuU&&q3p~t`_cGX$ypRBBL>onJ%X%z#LJOu5143M?Q!C}%O zQmiU;2YBGFpxal{-i$ZqsbWKTgtaGUNaCZ<@A>gm12u(C`tma!VtO4yNH#mGDomOX zPa)3C={Jij5)D*ONoJpxJ9P(5Hh$g@or<25FaFct!5`%m+r%4_hhX?(>&LnB~)IJXPjVs5uuP z_LxHKpWP$%^=6?H#}xYdd?mgnW&nL|K!TV;q=Fgd)HwUJ#3UAG-q%X}+OU9&B9b;p zp^4^WgJ}2NF!7RrS|DtWGnhgITA#BJCNZ^P-jN52)^L~cTj?xk)`R71qcL3d)iy-)_4%aqzL9hF@JTq~%uCSq5NbeA^k)kB}gXguN|UXDrBodj>sbYyzdh z#@>{T@)Em~oz`E<{oOhNFUR{ALtf7IMN#S@4Z%XX1sbUPYG`0F?%hZL>}8EVpj%D( zkSBvxwyH1zF603%RnP;oE+q+yA$-6>ehXwTu&G>*Y6A;-fifR_IB zVXqm2(F0jI6?8GJ(H)=&;0Z|&iVVd7*}KADMR8IQ1FoMWa)e|a5Vp>{ZI^a zNfoS#uYj0X8`KVN`GFb$E*H=SA?T3GOF)OzeoBc02pXWJ>b6atxC}OA4^SU@94l@!3tL`xtuOM=Xd0BfJX2?}~>KNRIKBq^XLsvcSjU4jR&yhS;%2Cxdy zjgUNu4YWg5g)R^qprt>3a6OHpgg`MO6ceWbZsXw%u*Fd!wxtjo0b<(-u^B>afR=7P zzi>rhvKeq2GU$LV%fVwn(^irTI*KPT0NX+W#C8~BBW4in&x&ava%i$;4h9|rtY=nU;ml@d?@GYHyS z4ehmsj2Up!pUZ=xy|vKZ{uh8T6Agg9u~K{OpuIJjs#wsJR3U?=3~J;1pbj8mH9!**?IuXHg-{F-L}jWd6BH2uK?KF`-#`%| z*atGd)sXomWP&G~A@jQfm|v7Ws0PGX!J-i$h>2t}h+yni7(pKxK@#NFBB+eujiLa8 zXbp~N0QmwcD(W*1poZZ58)W3KfYdWs9tna%o-h!xP)G=XeG3Z@8({^Z0H*XbEIhn` z6$B^b|HB(z6cR9dG3e)Vl_7@pn_2rlOGA)5>cij;#wP`V-hjw@_`v;(y!}DQRCU|$ zD?5!2w8J!*_*@0~_~G({R=0QR*=FUc%f1dpPW;NH7IlOh7E{LGJm$ zSgHZY{+B_<#@+;}_X#wrXV1fWPyrO$4uvpKXcYR%0TgIdq0n)7SHZm&5eN{HUYIso z<=p50u`v&}L?jm+cIYO5^;(w}uBz<5rsi6 zwh^tJ{Pn9!2rlTaRNj>q*C77$(FAq)Lc?%IVuxyCsdayb2dS^L4o%&yW8E_}zuO*c zz}8WX5Jpde9mL~|l*;XHuC$gY##d%U{>=OiG$El|tQO2x42olSRI`Z8$%!F;J!ozV z-BG0uZ@)~>)1Ps7pd+v(a#3v4TlCmyuW))*gx9%)`12oH#jae{x8Xy=l(V|dgvafD z+|c*7gcb#3Ta&A|JxDtk=KShO+^8tn27w|8>M(}|wbz1Ed^NVcr&}k5KP{NtGxe}C z!rL0WJ8RF}3HElHO7$(();nMM&ND^lx*p|JR^=4uJj#1G+JDCXEM6&`P=US6{_w+O z#H})VXa3(~F;u;!Xe8`gIHRTD$>G=H9BQj!7rz79tv*rBRQuU{oXY`0$P({!zwHtS=uvzH-B zxN$dq>9b?3vRnWvcj7H0Q^x}DUB1v~cJ>p)>u0;;R`_9?L%m%i8H1DjlvMuJPgAcR z*41W{Co@@^Q;~k4@rkT64G{%k^4$pisuAM(I>A^2Dr5q5;UAOz>Cf&JNnY)xHSd+Q z`QI_gpT3`45uj;&k;{BM6cxx441MHQTD=Q98{-*bpSIMkD+HDHm>F2a%6o71uHtM= zT8RDa{Z%)zA%`b8Z_G*Z$x2(7Tw+=Xb6WiA3fA*g~L|D&%*3s+#T9PZt zss19e=oj(t5mcVHCN!o87VM_q+iLZyY#|5Pi(L@p(S71*B-}`;eScEqo4;~)(#!wg z>~ZU#P0(BRavOb4S=+wtc_u~%mBsBvO%pjy;uGAbfwx!}yr@Ir5(gnN)~oA$Q&ZDy zZ+DmBk1_JLWtG1?TtGNnmai|f_ndn|C{qqvwm!#3AZJ zP7vCq>Gok4v7KC3Qt&u2Mr%f==Fvh9?j-l2CWEwR+LGE6--LV|&N+!Md`54{bB+2u zUn(KQcNO37&tf$q#!?c~Dk5VE6$@U|zet3+J@#q%iAE1L7Q@%d)2T0$)Q05>Z6r#3 ztT>!q#G4N-6b_3=N=FFb0X%m7j3}hZPf*Iqx)oa=gkzU?T03{60<*O;B8C_y>Yt}gr8LCxO-qVt2&43>tBSYp~S5+V4xu+W{q7{s72 z+zpCO-^FPNI^?S*Rvq+{Tdq4-9^}_Ot2V6LA~&Ki{QS2)9Zo^W>+1#(m7QyUS{XZH z8D{?dK%q`@Im#z{O?xXJ6bg=mH$;j^n+DP9p|M#aj6xo@9RGgxoRQE;O)q&0kw&e+ zZ|eRU1=vo5m$#%H1Fps>CpEQ;=?m&YC&f;$DlTH(Kb@+$?GN!V7XQLhZ@r`X=1AhN z*}(_Ext0BAd(v*~z5C7KAxkHdYv#IM)v2iyR}EBII#o88!yb4yozX$BFiqAS(PCiM z?z=fI(g54wjB-G4;?Tx;IeVH9*p-!N(1Fu+(v5PZokq2#UlM?wa#v5h9~YxIrq?(9 zH2Xc=ZPyBV6%(7(w>HBKbLwZT{8T)XMgX!NM zb`}*WE(}>3R;(mH3R3ab)vCc`vPl_jiuS~32aVrtZI##!=lr0qynOg6M(IpVTuAor zj9n_7c<`gmIC7CqsIp00o^d~jhgrKnRQ%HN+XKE@efdE>S5B0GSAKxFG;2@&9(3s2 zD{aJ~!li54?|%#dKl)nlyT3#XEBWegUe-5&)&SiMA=%n2RB}Uv(cV70kSsDt+qh8J z3H36cW?o47R=NM+5artg-zG7z!v~<^vU{DnWI4*gVM<(zuR>S$v&_|7DwJ4^pu$y^ zu2=fI{e1U&EAw^?QMNsJ9ob>o6R&Wp`+Tt_b{Vq0;E#$$F<8n6Tpwuj2WoU3=cxXYz4u$lV$(!(ch%Dp7*JJ= zBxCoICcyfQn&$@5dn%SO4F=HAr|DB*H~$sB9FMT9&l?c-p94lnV$*n|tV>e}=*?Rq z42a`d9>LLiXaL=o9v@>YB%3>r50b@dPHJM&6k?ybd%IMZW(6L`&Ic}r{~M1Zk&+1@umm^ z($yFk4zl%I9svXmod<(vSS}6Pnn4&e4*13foYn=ZLvj>QDuBo)rP{(XL>P_YS-_Xm zL6#Q5;>LPENyZNv2b~7ce!n^G2RZ?=v?q9@*6x>L(=??KP&)u#G<+pRwtW!&dw_MD z6xrw$;#m8=+9YX$h!aGZC5-Q+Asg%vn_fHZ3MvV}iPia1U|_S(HglD#kGuc-Pq6-V ze&zirAd^(#m?oUA$?L%7w8~u%umRhNzfEXk znj#EM2*=IQ`GSmQb#2dPnNX@30^|Bz8)tk9Y(NgPyk%)^%r3M+U*v$XB^3jDcCv5!#p|u)eZIjcz>4#_6I?C99vYRv#1Dc=|;LH zvJO(n+l=mBy$yCnLq(Y~MFOz1d)e*Rv(5~IM4OVkXA&0`=|~lgb;;ZiCC@RvqNMGg zDN{syDOCh26jHa3fj#CvYJszzrcy-?i;DPWAXDysj-`+lD42Df059-&B$}f}(sh3Q zbqNEbl;*}iJ_|4{ zFGJMSEJO5120_b+#C2p$NR#MJ24UN&*K?;C6U!JC*BP6oh~^X*5glJd6evaX6B1EW zesSZ;rY>m)g_y`P2!BHwShK|#fog~}8A6a!*V!$)PG%g~GcHS22bm(!vxlyG3U(nw zcZ)6xGFr^s(WhjtTadZVX3;qCbGXKJ7YUS0q^`?fblrBTar0W7Fvb6dniy9SbIul#$T*;_>%Q+M29?ZPK=Cn$cPRVOqPU5U1%Dyx51<@fvoT-ze%kZIF<#bhl|= zHKGjt=+oSP_MK;_oYyP5o>qxh$NHb7Mb-@WZ>JRvEw%E`@fd8KSLs3)p^3ut{UL%V z-4q@nGzN5;W4u6@*#UH!n`ofROk;u*i0<7E=~pd#93rUA)Id}2ZRy@1R4%%(5X zp>Bc=xPADL$++*BC9iA(J8EA&{FFHqn|q;+M?S(|Zzn&Wrt(W1LZCgiAowK>Y*-E& z=2ay`jZQM%rz7fuJ-HFM;m?B^n%g9OA(Ud>66#QcM`JBVD>s{Xs@Eo)7~XqgIE@vz zEy5P-Z8Ag@-!#1wS})#q3{{G+gFWHz>}bp*UmqGc?C$C(F{A%u;k-ZCntKwd1!#;Ye;8RH*9MY3UjU@wn0ejO7p9>dOOI?4OO zX9@nbJ=))rd4Q{nCg;)VdGTVCkdRvvkKh3B2gL36y2(l}`a+z99q0tEa4T)JP4spK z!x6W7bnh)$KzsG3CCMA~GR4w{YM{t}&@=X!?X;w+Ry-Cu^z2o5eVPCC0;`03rGuy} zToEmw_PV>3PgP|^m%N+ZU8BFmxWC||eJNQx zIs)sUl0)SNd=7KaM!e#>zMvu~aWMzlF9 z3))7YM=w*E>Lmsg{B_p(`}AuYIE|n3L|)%)Z9Evb3$A_B8l@|Iept*wC54ifrt{!v z=C#_!!-2LYU`e_wrc(_rx5;dagbZ-Bqv4bVWHxK~S<)r`?wC%W1DNG`hSL^}R|{53 zZh%+O@4Zj|(pad6*-HwKEVH=`7T&lQo;|5>$@mH!+`P(!-smS?G^$Bg`q#k<6s+_M zrVv2;%qh^AssQVBu+VoLgloo*TT=+m)^9^oL>RTSU>$@8H7kdTR7- zBJ;brdr7t}+`X*=rBWwdMy5OA%vx`BGAliSzp39qnKkH6*px%1M?d$;lZkCBby68) zhJg|Ds8CD}i22=QnWoB3X`XX9H`{cTm7d7;Ep<}wGKC{A-3QS>*eprUJR2iEIl!?B9$`as+9H=a* z1}YPqKxIxfU_=FojBpMhLrh4KO+fQkL1c$R0kXK?0WyKi{C&`khhbn)Kx3=m1axD% z)Q!|I;KsN-=*H!6#I?{wN2!U#=iK%d;ptK*?LKvAq6;*!?3_d4(TgGrIHEZ;kp)ep zjRVk4FCpj)iO~6O(2fu+v?B@F@lqz`0j1b5oJ}yCwG@yb3m2t!AYeGfFr2q0fU6cv zp&e_acHmzDJL+43tLC+!9n@N2hgT@HBUkFG&Cm`PXa|u2>~NOGMXU^66#|`4gd-Y- z0#^~4Qdg-$SK;4-NUy8a-)Aj(4(-U4+CdBjcHD*z#!o^!bf6s(Qak!#$Rr?rN%Mx# z4q}b|XZ$V6XnJhnQV<)If4&xgmpz3vOiv7-K_Rbh%25V~89et1ekIL@PADG&?}2kL zKx3DHV`?``Ltgz3gggiuG@8ZwAK!jF&klT-COn{VFk%RtBm?;ANECSB-u|bRHT=vQ zu9qji7gCl$^6kNwl@=m~{i7i#E{tU?`#qpWi0Vl*eL$}xgVPxRdlcjerL_$z7!2@7 zPob=~5yM7Gt17X)% z)msAV8uCx@aL&_^5#+0oAcOh;=%ph9Bn^%E{r5jKm0L(x9TdA%_U>;!pV7~yES97KF zss}}EnqYrYA6N!Y-Sv?GzkVYvpn%~a^Cz5^z`1-gtTTZ600ai=1CaUuF@?Zx1$){7 z^FMG^1S?eFoiiBqj`F-_v1#&g@cvOL^9SAhZRRMjl>p4*4w+J9?p;!Cpv4c$H2@{3 zGvv35O;guJwo1!2=vHz1kGnyA03ZYP0a(;HBrP+rz)pvY*FebyAOrOQSU(v6Z~X?( zdDF-Z5`5aR%gUFgf~WipQ^es}97@NYbB^O+%Ye@2e5RNxR-&lA-lsCI%vEcZq+ z-mErrG#i|*uyJVD6k+qtZi`povHW>!9(i9$Ym@A4~EKpP&yFT<$WgKzB8NImIIzb+wvy zN>v^9!5jIm(K~z^Z&WaOMyd;mGvoic=vUEKv{26Z@<#WUqcR@Plwyb>^-W zjDw?v@*qMyMlkZK&3k(E{%WljP_x+|k!^kZ$ew<;LBt7HTALVZr*(;~ugKXa%lxJX z{RR%RHchS!1;s~GLU_&LN;Fg(QHj3Y{Y9VWq`tkJSnY=X_pQsH@Q&S~RX*%9KY(5)t6H-}#bG{n&mI;)=V5?96c zqNAFqT3Jf84`pNAe)ME1+D&k|7riD|7ojq}kohtcciw2Vs`Cumm(|32Wl%uxo(pr4 z%qgcU=xe2>xS-;K>{sWfOpkclSX$bkP6`7iM8#VsKDS4n6;|1)D-eE6JC1gm5aoH> zn`oy^j~qI5HorHLW@n?ZKElIJD|OG7cg&ix=(=Y`;U{{yD9p)HJM&16PHc(zEtUUy+9C_>DbenWu%+T+8)I*Yx;Xxi0)vC1GHv)1%p7z-|Lc)Z+>>*$ zFUPz1W#@>Wh0e95#-6pbxyDEC{SlAGLgvK3lBBPT!pg^zYs4h4;J_@#AERu zK>?&6CTm-;`zY8_>gYn`gjOelLwiNmMqpjy2x_fL8oxO%(P&Z)j-=QAP_L3?P~q*p zas4>6ss0=de|oYN&yB2^_b(>YJ|fg!aBzspRtp&(86v|=RtM7#{emW2JgYaw zhj$O~o)v$LW_`JogYXs^(8u?ZXl`PWn`$r3)7+!q*tlJQX>l$2V&;VwzMcU_g^Rwl zPN6h1bqVZ-V9tbRtT!_p$LID_`chxSw~EFW{QZOD&l7Jkv8U`` zU-qom4Ig41YVI66{n)cUt2FSA=DU&ZAw24&$W_uOn*Yd^dgSGY*xa%HkN^2W`yfgk z`}>C&Ta50Pj64$1hV-sI7d^uhKIN}GSM+754dW)+)02wnY8R@Uqx%E z9(Z0oBTsg!k{m21e)(91J}kmc;ZTwfbD=p8MoBJiJhSKa(A<)4{Lr+`u^cqtm_NoMy!w z^asmta}otU)izgcN(!c(z|?Fs^&%K~+5D#ug0SjLNBx=n^I*>P5uK_2OkZpHy0$yW zFI1y6AI#;qUw`2QBQLH6kM%fKXYNr+>kLL-a=b|wovyaIW)T_J8&nv&qRJ~Go8;QO zrS7NEE!U1e6&DWwm>xe_Jw=FG+x^*&M^?-^%_E=5pjDz7nb}87nI@(GxWdtT zhXZ4S`d-kk%#A)^*t+*y_?@5rzEejobBr^bJE@@;cp0l16^g@~9omx582K!n5q{117SuX#<7Z4gGFmq(hStWUs8+VO zF05i2Twh+&^0_Prl(P#iSK%jcpdxRn%EV~zAGj!_*&wj4@smwCgl$Imzv=%Yhj8MQ z&yY3ZsFAmFT8A~LOz%+$5?UiTu2-hxatKmg7rMy0&fc{-po;FecDxSF#AuwzkPk)O zcWu_z)mzjfe+~r=T(>AA9|m4^E4SZ}iBU`jhvFindh{uRtG-JDL+vlaYVOU~eJ=!{ zmvPqR9ICM5vT{w?I~;@*+(lliar9zw5;(5Jh!WT3w04ziLcyIy5wcXovx{tgyL?Fm zutjBix$ZdbfREa8a8eXF)~+aNsIO z?S)+5`1(m$HQ)TyA&p~7I6e^k9(Mqvpc9%TjpykUS!}eK(6BXh+>aF(Ev)Y^h9+AY z&Y(*&yYxUp054n1lvuo!y3B78%6cYfRBgQ%bX}?>4cHC?gP=-Xc6iav>QX3q?Tf*@ zw&>XSH%RusJNWU{7B^d=bium`-wdfwQS*c{fVeE1e=siW?Nfr z`Y|dS;f>r>LO#DydWUn)$?kBk7U`WFczy9s_Izpod;8s$%wpLD5^J$|=TndbIFdk{ zk^X~rl&e>Vy==lM!^kF_wX%t&%wIOKuHPfOUNggK{kHc<5}5}n2G^9Xhc;zK zZTfAGeqXhTY=SzR6}2gSr&?FF8DZI*cGA2hLv4?u%}sigoovEMmQ6%W|C(^d7R{`e znd#8EXbyXE{&QHo{>~z-+p_r&hme^mdAWGK1Wa52u79G;96oY!zLb|;zpz1eeaGUw z$oW?0H8e%)HI~!AU@6JWM4Xn*qnLkPA11rLQf5xvrA2d4i{=-}%c{6WOE%1^oxSM6y6Bo_=ZZU|sD>5&aEqd8v(aSFv zgBvaj7O`c~JG4{M;9^r{-U<1anbnJCs>sY_{Y$OKqS{3>`HN;2HOq49|0C`_z?#gu zMo|?7Q3MqmHKSNZREqQxdvsK=jDkuP1eFpH>5zzpfC?GL22!FjBPt~zB2q(9VhIFP z2uKNtCPILKA%PGQ?s^k&=KJRR|MQ=F&vWiPK6}W!%W8YCz1D6^MMkZ7`P6I@BSU9} ztQoY&B(#00J!RBNQe@~jPxc-9YG8i;;|a>qe>pYtzj!v|Uk24#a_Z<2 zqFG#EGrrv|Y(8~e%Fexysn6VIuJM;oJ}ur)RC}qIQe)mnIi>BNQg!Uvczo#f&Xsj8 zs@bPl{xdT2lttVmjAn-4k_~tlZ5`8C!{!|jn42oC<3Z`!D$QEjZ_>Z4a!*R->f_i# zrqbt`Hf~yiYm@ah&?bSES@BGxKG+k)$~2w$!=~46TNn@*q`Xw~e$ZHDY16s6$(5qY zi}_p3n#U8h`{Ri-<#cK+AB1s=zrQ{mvKiObh{kPqKdCz(6?a`D;NN^N`+xXeadvfQ zN|~zH6?RqU^`GE=v3F?;?04U+o)p6yVsWz99I=o*eaMNddFBv&dT{JoT+vEa@gH4u z-p3Vek-d0b8n?UEwouqzKt3!^A_bQhS2fAsNeV!h(^K3aiexu9T)z|N4Mg;>AJL$& zZgIv8Zi(WY*>3~INk<1vw4EkK2e=|1XOf8h=a6t96W5_X@yKM^Z0dH85phF^pKj0@ z?{k~2HRtTpoVUxjw6B~x!vtGvN9y{@9xMK6T}~E^?ktQb{q7gIMjN%69o`W&_O+>C zeXgimvW1ssEb-QmpMQn@d!i?M#DmT2$3?Jt1GqMP8Z|hl{T2!TYxz+_`z=dm**CY& z+hpm%wV3zAoqGJ2J2e`@4=(tgm^qf{#c*pRoF#rlGm7Y^amp5Se^Y~?m4_m&I-4ls z{>P4Bz6Wm{iEw)KUG)fl{~1%VK>fq{$mMl&e{~9cPR|5)ssP-nV6LYUcl>uoU5hZA zoZ5K4eegjp!%(N8bF_(gz38qe4sCFYQ-iwmHn5ubwqqn^cE@Hj^95NE=$yyxal*{G zubz_~_cKo13AZ+^xQnT(Oo(Q9Pe`%}y?8TYaHk+fp1t0ZxtjBQNx`Q_!1F4`6^&?7 zSKR0x8uMC-{-fYsKZDlJXuT6Yk*b1tQ?2YktYZ`1tGJ_lT-C`fNTQrYI);CQV-0Xp zoqw|;J!bq`_ORFJ2>Ef?{xTQx|RF#_onKJNt=j5;vM`X`OjuhMCMfIewoT$r@{Dy5d6%B11r3_lSw?z7B{GdDx! zzYglfAKmhICH8T`F+imQd;8#p{^g?m3ekF(c4k$b?>F&Pa+$+>eNrxd{Ydi0%X-&V zWmTSQ#C?!QJ3w?nvj(y%fFG8SDIvuGv$S9%A~rSVQ(Xo6LQ*rJ;!xl?*e#+^c$ zu*QNWxpPcr4e_)l(Y!Hrs^oMbuJ&%b)9#ccy4NZbKJmhlfprzuWWZsD9CN~iqoq?QsG)luhrFd{4^7n(g7GS??`tu(Zu>L>DE}YVX5riLPbEa@& zex1Te`!5irNf3LZepEnrPLaKQifrN!QKY|~;uG};pT-nnDlyYdpVn$?hT5K3x#Fm+ z@sA4Ko>P3n)d>e()#uu8Rm^dQl?th@^*J{wig9r3Cq;pKH3fq41H{i$%2^!E)0g$B z!W824eXiQayeoz*>M*nO?W@#vPt_4rKG;{x`NdD120pqbGRvr>5SP6^mF2ujDmHIwK}0P}?8;XfZ>{YDj?5G6s_Wk`Z}|GSeR&EpXFRN27F2 z^_vrQ)M*d(h<(gnJcTsn;q%$ewNZKBzU`>Dd>ZthEcaxu?x<0Bnm1E0vpcH6&s)^= z_YIMVIxx-Y$22HeJz*sM4Gb;yQpriTjj=@=ACC*O*@q^E3r9zrBKV2fhc_CsaS_g6 zhgiagVC_-Y)ULW@Av!Vu$M4#(rE;D54W+CQ-^jJy5sm#KNyLBDP`ccG|DouFXH)scrR|?NzCWwjk>(Or)C0;L zXPmeL3)U_pRPla>hpA@lEIFm`Mguu*BhJT)2A!?6t)0xsWB+PPht`2D-AdR0RjA#B zHx~2v_o6fRGc3Tq-Gpp0WS`Ap;kuuINo=&9F>n1qBsI2k|BYK)iysD=u*e%1wU!4N zIbt0LgtTd1+KLJob=<_bs8IU}pURlsA(lDQ8CHoX_D=? z6kwyP^YR(Vr{X$(-Y0^(^;5Q(U;GDSRoTX#z#d8q=a5TC;-=;3O;hXp;?Nw~`hK{T z*LiR6a}k_^Kk*!#_~jU4qf2HE7iTgY%LaM_?YIg*8rs8E7&-T_tc;OzS$xjdm4YtJ zMPE44Z1LiXII67*Hw%8oz|W#9Vl;fJY^##Y_jTodULsfzpMHivSxW@kzOGFAhQ6}4 zst)RgJ}3CdULuf#q6d6k(XTi35um0kG-gzotKv6TR1G!N0o3gi%?j}60w}oK*A>60 zFjoWx8{p?M$c;Y%@qXuu`0&%-*L4K`oL`u$00m}4EAR{cht!t$#nw|4|KlyrzXth4 z* zxVy5c9(S0Wv{l!qi3S7wTa1J@C9`syHti*$4lAI()UrZE>2KfO_l&33kClZ%f#} z|EFnRaJ*+$naALjGLHpKOZj)_*Hr{QWvtA-Dp)#l_ZY;j-9t8;#e44*uxxKG9WXxU zN6BKORH&OfcX+XKW25Yb?{3z8>|}WHl&N!z*F(Q0KIC4bJ&WpjaEz2_5Wy>BZT2Sj z7`eJPjD2!4jI%U%VtCn{lvA+f-<<`!(hQ~La#W45{hI3sOY;~s7cIxRWvj0&lxMz_ zqXV2apJt0qSh9OT(GnS<@GH>LFA??$92cscL0&myv?F+ z-A^60lC}5PR($}UdkWutyBT%tSvgUhfT7}_qK*9qDb1)2Y66UW{763fXs2+R$W6-; z<&M9p_kt$L#l;{{RUij0xC$@}It=?%cyP*LVIRs3f<{P8MQ-y_j|r%&<*h3vxe>pM z^OV>b%_z@?+irLu`-}jiR!+}Fdy`J#-5ZLlB(KxE1Nw;bG{-GP>0jrt!7Zrg+&uKt(_(9gd=NiFAUK31MeK^J1gMcWAcleH zP9M?eyyU7lFE+|KAFaDeKs89AxZ+cGwqjdQvxdjx#RsFwz%qzJp0JaHYDR^g9|y9c zET$U7`gXd;+pJjqO`x_97cjJvG&b-mx|$>{n_lp#R}obb_Q-X^`^V+VD#L z>5_2Lo(C7w!iSSWZ+4Y>vOP$eY}P+MtZcJ3J4Ow}yaf zUM#r{p&ahr5W9+DTTJbRBn@E#-UYf@U>=%=eu}>B0vD`w6h_c_=%)IXx02?U6|4GG z-bKQB5I>0_(#_iXh%>?@SAYpzXJ9?v4Fuln3K1ZNxQM_@H-W$pAz+PRixU0(GM&Je?wz^buFU(*XEHWu%v>xI-^1zX;>FP9YC%tY7~|k~noRxEW##=D6dVb4~)#Pqom?(g_IXMJ@jqFY!wk1H`sx_y)Gylx6(I0^KezYj?f9$u-mR^2B595bA>K(})2HS~}Vxt34p znl&qqM?}^THq+8Yw4at7sHt#+u5i~?UAcvjh-ot(UiWQws`MpG=7;M8QE2 z$a88Qh_@^O;(XlJ6S*ze;MPanOoM?v{gl#!2pO%3=`>s|YH}fT9AaPST9TZYRzgw!8tMG8syUO7}#%%#gQ$ zs{RQce0iO|;f=)p3cCmai6)BkE;h0Afx_CS=%;?=7Z3`ULbr9rFM#3Rx(E7F)+P^p zO7z!NeZ-y5N^go2qLbY4y7#U}L0A06bo3nPuu`%M-uvE~R}c-9a|=3_xie@{3^fy> zlH>_pS)h(kNd`S}MHJXaT>LEUBy`U(D+r>()&Q;78KQ%5br!-^6NIagFf=ynV&SOP zgH^SX-PNVH;9!}7d`FFBZC5Ag?c~9Yz}$KsjK>9zptl#*3pXN+waJHJCh-+uw0*d) z_^c|P6C%euh#VtPFb)}@x}W+RvGFJVRhH#buXR{JP zc_W;KPOwVTvKrxRI>OnA>j-D5pt{a`AbN0gCaCg$5{$P7!8(LYGXx~MRss{XXEV$& z*6*P26jgy{rm|t!=i))nMfHOYUu926Kz`o|hu@BuzXUQPlB8rFZ2^$ub6`&DAWO+K zLdXn7x{ot-lJss3P^r)Gpj|Po>d5?zg=212V$kGsj#EIyl?8PGQs@ZE!L*zT6Pj2A zGluspM3`te9~b?VfCzIu286lpsgz2h6r>^ol7xWFuSA6D3BvqOv;F`1Z-pH#&ckXW z9;7`kv$83DhKC`PRHn5mW=Wm%2r}>w_8PkCR!fql1D`374*U}7z`rS?x$43dCF#IN zjmZW+N`wsj`Vhp-Dtqm9sCf&$ztlr{=Xpmsmw#}J=QRd0?h8kxc9w$F&I%sBt7?CR z`q}7%>D-aj($!ImpLKvK0t#qTDWZUml4CzBX$BA7)w}IV$z)vqEvnxa43<^)K2C`K zX>0dV1|2XmsE&HCH!^&8D-4n8C5)79{~jb+Y8sx!wp*%ez$OOob#L~+94w2?+fq7~ zC-soL*@Cxud2faqK2g=V&PHlPOpRM>VSB>vkd^1WOV8Q-%ek^t_n`I>oA_BZjtrY! z=?Sr;W;tZV>!^9fLDm60ev?5#M&v(^m>m*EoIrX0`C4fGyx>zgFETBx@Z1aO_m`*v}3gb>h+NT06?VI3|&WE);owp4$AFKsG~c6K z?6@Wo`1Oo9+hU15Pc_T(xrohsPNs_k+FyJq?`4-|@1nX@cD+Cc>FVhpEs9sD!49hs zE8kyUNdf{b1U=oe`Q&A+(O*;%suepXtK6@~baS$JG?C9}(Lf-8gPX zBoOVKxBvY26J+A705pNcevx18=iaybk1_LC*?3W_T?u$zT!#T+>4C58a>?B$Kc{}9 zoSw05DN7%fKJg*hl{K4tv2pza9rR@#!qn{4eBNFM3vhP2f+OgjHorRQMhD}a@chLu znWN^vT2O@8m~3jYlb>MBVTE)zge=_+DMxlg+L7Imeo`)e@Zp<=*tcXNJUEKDe~bU& z{z(RgxXiFe68Q(n&IjA@l1WrPB^}7F0wbmr;x|n!KI~8?&cJ3nz+nhq%w=flK6yP&w+Bu2RsU+-r?n)S|k>@ zacB=YsljW)t$5L|Yx((MWZV}4BfksBALzg{G2MJR_p7g%XVOOQ5FfUluy=!*z zUl;gQ)2`a+PGe>n$u3gZA(S}e2OdL{dy0dEYf=mNmzW_=;ta~rK1L4pEPm@pyrSe8 zFBrEV2;@P<3hx~04tR_%W-~EmjQ8Oi{*jDL^pzb2NA!-alkJm2xGdFqI%_Pc*LXl zh8O*c9rF{Fs9uy{%nE<}W=&J=ltJ5>MTdpa-xD8O)sRqeM^rxhoZ|BXR~VRCe46s2;Qg=ysIB0)fHqqS4GT*v_Nh$pt+?G9;z*U>~R)TVs9 zO|;X_k+dGuMzx8B0x@O4znm2NiB`_DBt#a5C>J*Rh)>k>tcYQc#ZCda46nDlM?z~| z$qai@+3HJ!)5-qUAHB}))*M!+FDJjz5$ch9NqVe}?; zvl2oU@vK=15u15LSMA4~L^wO}o?$p)&l1ygEMG=k2wfSk2j70zp(!L`dgWO}1LFA@ z;XxJ(mbKvqw1;-AK8u=!F@Q(GL;vtS31{Y{D_J*|oH#A+=|omDhXOJoviPNtJ3YZ)-pl zEHzXS?MTu8BT86$&k%Kw5qefqk=S>3knr`qzFqg?;H7 zEnTbyE!!Ybwd3mQ%Mnh1O7eoMS@Up4ouOjcM96Cid zQ*3?0Sm`Rf%1F5&guf1K8~1X`kMisAnzKw;%*g5*G%591e2F=Hcd@1e@2+lG`76n{ zabr=s*rHDb@k#k5eJbpcW|V-NkIn)c@tq3zE&Ig3i5G~$Nd46vuOvCEU; z;mV8B5yK^(l#l)dZm1vjDcXVJjyJ`<0w43P*mWIvW>_%lUgF3V6^$&UAH6>Oe zw?UOY;w8L0emD`Af4%P7Sna}3SO#`USJ4Zm?!AIPnY8Lq5zbISq%{T%3hpy8Je@b3 zeCDQpUgbZ2xo}d@Hueuek+# zRDU#B>@iDWqMYg8zyn-umI9AZEvU5ceDv{&SaFv(EK_W9#oKeM!Cm)+C4|FZ2@g9r zqweER0h2UD)ofS1(zu1FI^0=+VZhY`a4Ipar}|VztOW!Pu1^I6c|m5P>T`GjA#@rz z_#p}+o$)OK>g&aQ#A=n3c%`7HXl03lD4ku|N30{{qCb^1qte#5pt9}q&?)VGD&Z=y z3_%h%yniQI>-K~wUci5f-X`uN-k0lBVQz0h$tkp;I=1%_a|n58^BfQSvw6AbHWg3& ziyT+HX$}w|--5c0$wkw2z#@H#dL@}HYDVc0K}0yXj4@~~pjKA*5z{y=s8r%9{4?-W zA?yss>w>t;vPzN*HhY#%AMy525IOWQcoq#{vLA>M>u-K58MFdX`{{_PH9YX=;{bR~ z3(9AKfMD@f;@AFC;s@@Qx4wX|s!pPJqmQ`ovq?U>iVC2?H>(C~{}Ry?uNg5zl)k1? z@-1QoaDET;&Kp4Z2k4!Lp?AV6T9&OF{#l9({-!?vJa8U7v3kQ6)OJ|=VdgiZ z_`mn0{=Xbr`gf)EZ;D)O_O*66dDROh6U%ZDZlNS?n_jLWNY*vKEvlWNiRv{mT)TX@ z3zt8Ki%BGilz6!?zbxt$E#rL~HRbuaCt(!t+v=%s*CY`{psRm()1EbIU2AD>U2Ule z=h9YPKAK1v37}PrLs_oE89cbebvyKYL_#P8B81y@kx8K;c2ILYt@`^B*1-#0FIu_| z-BQ!p6Ka-MT9(4mG6=`#DqI3JM|@ZfLt3mZduir7$aK>l;2NszjY1Hb4hSvh`HjcG zt+}5KRJcTFb`3Op7@Eaif+eu)p{BSxfGNHh8e#&OcOY{;0+T^YPk(8tNpS_3IB1pv z%^L7>$J3Bz<)B#|o?oJzhy1F`8_ivgc9peH&!0K+N`a=SyFq~lm$2F;7v4PRR#u?R z&e0de6rI8yDT0kO7IL+uADEur#_(DThn zgzilUBPl1fJ18F7z6!kDwrdD<4WPJ?R^5d(D~S&cnMezLF%cDN??6kR#zY$s? zsw&X12k5K6kwgdv8sLb9uI(v6C9THN+(u6YVvmCyJz+o?CK1A;q2?>7X_Xv$-jWb% z`a4oHAc-&%3c`qBxh5esoho4U{k5g$CU`{avJLdyYe3;D=$!B6!Vdp8H|nRh2mf~l z`@fC-|M5@$M8NYqT6!OvE9&2=BrZN*_W8oG%j*LxXjP@(FT|dlCr37Sx!oY>mGjVk z9?Hs#x({bBau^0G3{E1!?3HDc-e4H3K_Jg^4cFm88#8#{!c=*FWl5olg?dCIr9YA| zttXNQ{XR4|x$Rg_ZO3c0YQ8ed6^`#h)s3u%pu3^X9kBMGH>}NS;5)Ipj-S+KMbg~n z$-xobPm*h)%?3zSE>uOiXy>RHsN~a-s>=bYE6Y_h8-c0@RU72SD*u}eCdXWDBXyLr z)^#OJ&5EIh*Q1N=hN(Fzv*qR2%rH?{b217pBrUePE|eP@efcfnO-QbZrm1=+%@H~7 z__lwQz8%(Ov!T}G)YD5SSpElWv^*{5__j(SPe&Y@xHb(GS} z&nj9(O%3wC3FnmX6C_tg0RFuDxvD^J>$0MeCU$($4Arf6?grKiV-zq0UNhVnOh8&_Kt=osq0*-{-n(2JrhH_%`5C?fV} zREe>6jBQPjFIiI~Sre5V`D{pXI4!HJ) z5C8mLTl`|ItaxQPk1ag3!?)i}^fO&-i6Z0Q_;z=Te8t_j$OEU?A${ZY&~OfmXou78 zWfFL_Cd#V9=XU%P`TW!(T8e1sL^2u2QOED98)1(wNejMHLmJv%IrOHN+tOJ_5BQ4f zru%;_mdtA@auzpaJDFIM;DjjW*D~f{!0{qqhi9-za;TB2zO*?kYbf}sFnHL3!5(w; zZ3|~M{k2w7!`8@jpvrZdj1j7%-1s6@%VPt?S=E)Dp=lTw&eL+JG=?`@|EsWw zOffb|ITD`jTP!(DpYy9zXd(RxoC?iHPK9Dg_z?Ee{GggT?AiX5hn#5VFIK50PkAd2 zSzy^m{tR+L?%ma;)oEmwKl4dF5}ulw`oT|D@4@$rCZ!^;FXZw$V;au9v!2EiK4tun z57$^7X$llV;i%J5r_kWEnx=qee*C>4$pAd}l7fnrrxxP+Ya8JpKmpmoMDo@yM+4VB z@&YScVkxY3I9#H^v%3@PgRF@ZZX7x9bb%i-*XsS?NGX1zX*<90_5`6UJPK0{uI1LOZMUJEg*iYA?8133j!L6-z)~5 z8qbB+w}tb(4|9Fk$0w3&TKjORV;om>8lOoJ#nhrBfB?lxL)cbEv zpMEmN25)3VUCFihg&xp<(GP!sz0Rv2rsjGYfsqyRp$3>HO~3JH9@6fYZ2@ z+*+Di&7xuh3X>g7#MA_x01`4=H?R%n`=M@+(FGbGNByp1@)nzcJ-DB3JV2*L7>1nR6or&Zr;wW(>Axe(TEyf3k0WOkH?z@=U?Az~q(VBR$4vhT95T-Szz_zBj6; zdltTN8-;tBF?kB-lNUZv=`%j1d4_Au+S<-q)~7OHtZ%CQ-p8h@r`I^6E9`XPu?uY1 zc9v493fFk=U{Oh}L2(_|c->6x1|Ngj*1rq&zq#TxBNp-8zBJH?kEwcSmU$uygL*f< zR1cjsHwoqA#KMR+vIy{Wdpf+Xj`3W>bEChasZ6Y*5!3c2q2#Pt)F`SxIvT~yo`{m) zd2rGH;Gb`B{6LQ}yxr3bZ``UdZxq)mE^6R^@eP=>YG!e9t>xR<1O3MSiSLSQe_G;7 zDQ(r(ciGvYlPAT&DpK2+1X2h|+*!v0{Su{eRS=@0y-hik7s_>cd_nQsTX zd~aL~|D#oN`*cZzZ~nB_fZ|%cLw?S5^ErdWJmpqX&hAR9O85cMP+J$l53xhj!3+4i zfz2NFm^lM$IcqD>@65eTa^n}ZnLLf3F&>ar9i)nsvxIUJ5GFI|a^N4Gxam-EVq24I z_yWj_gh-Q}czsT8nKW-5J1jXj~CpQSTvL<7k)0VMY{C0rEk&q|**k$jBMzX8cxhoF+3RV^?^ z^7@gyGk}T$f~F0U=a^M(Ohk!IO?#Qp-1DhpRk$Tc!z#>UB{F0nN7#0h^;*nqB2t1TMVM8Uro6tenVhfnj z5j+i$Uz^|;8Tmy)=-boeDhfuh-i}~RI7Zm;3hLo61D+FWIk{qlhExxLj;=BHMoIBR zq~!^0xq&p2fw09kU-`ss1h^6c;21Qi3DwG~pddaiu(`YfL1hi(k=(SNLlE0VZO$j5 zNea!}8)Dba8nHtfAp>tAi0zyKOQexNXha_2-+rKnQep1RJPACa)FMq10-LWQ)q;;f zH7;}_2x2>Dzz88+0f^gA z0%rj%LwcZ?isX@Um6H*6PDp!TaFc5Z!p?p~?A$lz-XjP}T!f@TAR-c>9YV&=7>AIt z#%rKpB!rB;FaaTB1rRd!Vo55}cjj|)A!ICccnBF=!9A(zxDIs)V9PRHc&( z1a;a0^A$}u4(RLbt_oFz9dOQ}F`cmjgB-)eN8-{p&DB*$EALiaTd4Jtk*;4?GoQdmsIFw){7hfW@E` zMTdKcGd0_X;bAWAF`apKQ1wa%0<6^*l;Yg?ph-bd{xTaB<=feyC=;iTxh)W6G(b3x zG#fm;I3^FUynciIeBQn>cn&KcQNWCPs0NDim)W2w0Yzi6>$YL)iarGdmg^Y2Y_%L< zG3Em-&qRQwaUcDC&=G@Q)DV~mT3c@$RMPwtO$+!&+}TXdfOpBSBl?%xL)`43I*eJ8 zwg&;V2qCLz7>*u%7=|b9)W*`UyWEuMH$IDKhVGX)it2byzqShO50M(!w7_j z3lL^3tw*hz>9iX`aDmu0{ypkiE+tX2yJBb|g5h2S81)-b*K$)j%n{`&lGoKEQYLmI z(Cpr$PR(@QiBGiq0QI2UOih>`;JLTka8816j__U)L6Xx0{J=`*79C`6St&laYjFQC zA=D6I{t2XB#y5CZ4Era{EoE^CAA^v3XAm?kzJaJa_JF8EmO?$hG>IPfA$o}`UIk{d z?lMGZvk*p#5Hz{SREE0%XfDlwscg(}4BpiyeE>8kE=u$~5musi<5zZ$?nTIRM%c2X z2kPNr_UjaDAn=%oxHmKaTO{$4wK}6C!vvuMBJY_9JX8#ZOL zT0M$&1Cbu-0f;=}F3i+P2wNhf5w;vd*uqA@tw&@|%7E?_5hYo>{eNU-{7)>A|9531 z^AFMZi8-63<9YB;Z8#8m(Ro1MKe18UFlJ{nawZ(md~>*r_z?s zr8B~52Z8guh-UGY5zIdQH3xRs0X@qHH$YGBECe2EAv|1x@V*4$As3NZxh?SU7}6yr zh^$ApBRoVQGW!KFTTmZRtThM^(SHIDvp&GE!S6yuW(I?ey%f|z2gr@Uy@T+O@&I@^ zephnfzoPu+#NMQ&yV`NPJT_{kU3c=U4*A$-YG7_vBlP^WyjY;EuB8#z@um3e=i)a# zLw@JapSxI)ncnrSkJiK}>+a51O)q%G>VD^u-tZ73nA-vU^Nj7}{rKqVlz2BNK=D};?_tFdXbIm-tHKQfiuJ9-5=rLQ@J7yx`iBHaA zeIvAXHnXtbtU)6w@$2Y#R5q1zu5J8lbLUM|1a&!O2XQPN00WhEZR*OVG8Tn z&#ln4*$mG}ClmU!lAw~p+YPZvuMceA9N-obR(c3it;!%o*HoDp$7ie|9dn)y9C z|AWZDY;n>fbmV?CwbqvTOZ)i8?2r3xTP@&fN>P6Lhg)}uEzTAxibn`{Te86OFKhFs z>$z#GUsE!P6kN`EL^|uR_1VX`b5tuGh9gzvcbL)-c>3P7fZNAONs6d=Zvm&>sRUV7 z=*AhQ6EJtJ)3@7UWs3+xH&c`2Wy+6nPFDm+Gsip`P5%9UZ0=*7uGss#)2UziPZ~1* z%(-KMpXdnN&k*^fJsxRwn$YeDk50}xb=Imd$M>w&iQb3TNLrK*Ogi5ws-c$ii`@tR z{=xV*$>h=uv(H8*BTU9`=ry-t_!q~22u#W8 zKChL*F?FQ&m=EB;20DbCjw#&Uk@>`VyIuSh6+5QaS(yXhZ**M5`_emvIPg@d10TGF z@wnKgG4M&w;lR`nIq&`_<`Hc9yZ}M#qa4SGk|tjclSpaNjT41A?M0OzwXvH}He@S2=QATq zJjgly))-Q|2{*v2sDKjOnldz>yHvC$J&vCI#VtIJchSl4%4Ub9g1ct!T|-@*j8V^7kIb+z=YyNN4Y7+5 z1IKYEGBN)Q6LW5|M9&IQx-ccrh_{CM)e~&4==Hnt|E2x;cH+&JU79;X)y7mM;3!=12qSI39&h3WkdodV{29*CX@mEH{r z#gSuIC~|g_)n3l{r5QvSpt;_!ESGV8`SjLnVf*K29NfWfa0*zYX6oGL6`dC|Z>H0G zFPjy__&Xr(KRQjDyp(^64?JI%#d!JKCDGS1k2&vhDHnzMM5EDoL%0ZlU&V7%WF4Uq z53j8don>Lvec@nKdxo$0L_iSX3p4z@-T zO3l>P03P#;sz^?Rqy42x!i0<68)!t+riQ?)LbxB0O(ULaX4Z@+Qq?1{o;ddg++AVb zOrA1}x^7WtR-gC`gt@WeEt z61>EQ(>*B{Wy*v53urgoADyECEQ}^xS(wYhC=VDS@X)WN@bGWOUq29&6H$BhuF2?Q z(1@EqNuq`R@~1{8ZVU6~&=>M_6gk{P)ZDeMbfzH?IHthD%y>SN*S-1bw{Z*$BVUI< zDFul4z!LC+J zA_|dbI*oWFL~==(aQT)8PWRqrE0h~9tAg*3z_ZnZ7cFDzlz2LF>@`X7s^pf=!!#o7 zT-O4;gj2Yea1n&A2Pe7lfVGl{oe1wkUBX@wChQcklYl;F7aTl{*)idc`vWeS;8M1# zNj4dvk9G;A^u43O&7fS*Tf)2<47)^>VsrW1anraJ=9HT8*A+>gQu4@#=)$Q_4R-%0>Ctp_-FEv6^6C^#GzDr5Xe&oJ1{ZpDszu268`CC*V9!dGrr0EtU zZM2D7W{|7BLz?cBrrVIz;bY8lInI4)>MBjUko4VtB(p99X_t6Un*M>L+R_%+O4HNQ zbeXjEtke0ZOlxUao!B>hx0P>l$ z8Y#!Ol%^3)p4~!ge zn?CCWb8p4aN=FP@ts*1LlD$DXa zcJbT8*YA9UKbaL~(HM}^YsPpU(0I7OFs{|yi`XQpKaV0vy)|c2#5^A>>qgi(<@zM~ zD2R9cOs}l*Dt+wSZ^S$_VLf(bJ$FX3_{q*PnYUvV{oLt%f%OS;)p7Fe;+~zwAJT3d zPKX^lTr(WdHh%N*$6DJvzqAkk+9FK(kif2sx54~O6?qX1@AqyoOh){QI~D_K9<=Rl z30)6I>gyNt569VNBKxr~*dgv7t0PRGwvdCvk=??tb)K4}l+>6ercP*l)05f}T0gjR zL!3xt+xE25=Z0?2=q@8?RvS+XOIfFuAyz&bv9kc&9CgdDRci!u`Dfp9@ z_i*v<^XDTtf^AmGo@d3!d$Yj<%&1mvoPJg;u**D7eh6_v>%w=`tid*qs|}Ft;*yT{ zh81!)SoD9tk4b9CK zeC{qCQzx++t^T&DSxf%MrsjZ$bWhU>pKqAZ)6g~Mb~N&Exsd7kVuM=hi;V`0vdd6J zf^Uox-B|Al9~D?}~UhSv|ju87E?pFcS>BjJkApY&0^=+LYRiO@P<0fH3oaDC<0nmvcUdsYl+x@O=C^3?+6Usjk*j0eAWUG+CPQ?*o7$=uc1bAx zm3hi^u)L%ooloIXcBpF%;^KtRE%OhiR2h8FjVz&u)L&YcvSUW39<#^Lccxx6M59vH@LMdp zj?#&7U9f&_y0|3r;oNG|c*EBxwd%P1BrDSxw-}vE3qO@JJtIsnq}y*%_wvi)C)p@{ zp3O?wwxCHR5#BzjKC=>nNf2nnpB|WAIrYU=w1AhcaM(0<=26#QXvAqXelzyIc9qLP z8KQU1uU>H!mxZ=H`eQY0z}|rJCD`i){uTGB=|$6{F1T9mi)Ak%e$`^ZJe+3@NMg(M zc;=vm=`O#8d$KBpCvX|B7TM^;1-`&hxvvweXTSq8)Zygmny=KpxLA;xA^y{-d6zA- zEchCzX#W}S);{R36F;2mW_o4OFQ*In$wq3#EwTPw$9px%s6QWma{R$dW3bBg=`0FlLc?S*DDC(xiJQo?FYy9S{yIC)p#=T^aqN>IdtIqt9r+nv{P@gahp2eYW zhid-t^t^V>xGD7iZQ4!MNvLYms8fp?SRT0RU5gH_y$>hga8RL<8@DqcT)_t$FZn- zHZE#ApE*{JFRNbn$AN94TQqovC}FGGK!zSV{-^lGiPNS;LOwagt)Hj3)lMU>OWCE) z@#Di;0BPsyIfavUX3i8LnIxh9byfTSulCb-XVO>C;bcqiOX8YK+WWdzF0{WA>Ot|> zxuBm?vG82;1kj`p?_O6g@xTqc%vqCA@iT2X z3p35lG-}nC-06(@Ks^lcS*MG|6$^OOZF>Q>F|nrb)egR~Ito}7LrtI{6? z9ix+o0mY_6BTlDvZT=miw7eakz2fR&`(4`4*?Q3%yDVmf{SCmf9{`Ad0Z^q8 zC#mrH9mXvt@51J$&cu_@0c6@N0FGD4v{~d`;es8DGIFn5dc#`5B(Gu(&@+}*E9x#M z%zNPh9dS};%0ma3%qj=>KQ`Yg<(?k~Ik7YNV4fq)gBNf3YI650I+2&B7Cfj|bMj0)iGv;fn%m2+|_ z(LdNkKJ`P;oJ7?0>s>Q%|5h#UuqN>bpZG8uHK}UudCF{98B*|9@^?S5trb>>6#N#= z-R(9n{sxV>RkPCa(Ap|EYWo93(hm?=*B>C({Y}&-{t|`HUm#kc-ANE73I&%KEJ+q`FRLs zsB3Zz40--Qdn|xOotoTXDQi-`sef@sA!&;FH41#ntiP5R+wy2}HgWsvmKoZMdq0Jr zKJUFb>;~saEN68FwYs6cW2UVVSLdLemR7zl;hZ*|vq{IZ~zv@Ej?4$WnT)fMzR@PF;!*ZsV%Bb{&U-A+w-OD`LWnBxM|&SG2)6D%FWYJ%(E7+)b(f#W)p|F9wd*wS!ZT4n z^tO^ona4J}kG4h~)1=!dX>d66n$phXF(273ia%xOHErLhpL@PDck;aEh=#hNt(rrFEGwd3P8d@62PEXtPGIo!Z zEjKib{vq(U4%Okbdm}R)724}aKBv#~JZpxURI*O_XvCJ9UU-~0xIdw1?t1*bpssm0(zhqf#a_K0 zcZ74`ynER9n%{yMvrM9~kJ<)&MmyRIyTdmXYcX3xEy_new+@xvX^ZDZw)sqSICj9V zWHfUT5ni6KevcKnEYsI@UHqIVNLE(roW10?$}tR9=%1x&q+N4jqP)FuNVKsyj>!mx z`{bWnMRS& zxznM?gnFPViawIO*_=|3Wx0wyDM{O>S2|FRMYFHL4L#bOvD#(l2JuBq-3O5cOiik} zGVTgP5uP72lA|(0#P?#NA}D(vbaTY4Mc&NLg3Cu{mcQ{*fe@utA{3 zqN>YZqp5I%li)g|KCGt-t$EdDHRH_{ufd#lM7!fm@h`{Mc5R6jHVEBV1imT@Grf}3 z%QgS`UrqjhUtOHAFdWRs&KI6Xf3x;l>$leX?)~nyqY`uI4oMlojs7ffz{f#9FfZ*b0H+J$ z7eSWaUjUVZaJ3*ek#hic69_cC@DaE|8>t32#;Iwnyv3+@f#WL(;KrEyo)sXLs>M*0 zmjB+;ZqL1Gn60tI!~ac*eBBq=mH6<75&hWp%Fm?EhfRbyKghlvHu{@UQ;>Om8f9-k zD*H(;`D`D8J)~09u}SbFhB;&N>SstN{OeDlucm?^@|P+mV=$Z_tIR)lR9-tiGsP1X z{zPIV#`sC#*Q4xhdSoxLzrRWr_>}YA&s=kqQj*%!1$&64 zh|W!AG{vtu1`+iZ*)y+x#@`V;5OnxLPv%ZI=>oV%*butg zH`_pb!dLWdH=uisWh7uPYN;M#q zz&K;Tt|c5DN?>q->6B{b101AA06d_IK!KtJC{Q{4O)>W=qB*qLfVdN)Jw4|EV#&@0 zFbiyy?-BMtF!!02XalGf8%8S~Nd$s%3g*ywoTY(Nk|De9i}&2ONBax#MUl^r1d z@fGO?1Z9{6lBv3(I5EatqDK?l$}7RobwRTMS-lM@%SI2Y7sv=mq7#)3$eu(Z;A>72 zNZZNlmf)TwfM73wgpp|?kVN7@$t>eUZ7`DWK2Un%0^&(q*jkzUKfaIt&u^>$f6%J~ z8E(>-Eu2_G_G>E$)zLv3{LO>_v->!+ngM2y>|-Ba$d0DGdE8Q30o0jWx_z=>gOxz- zsdd=rw~EvX#jf<@7F#s*a98@-ux&XS8oGr<&=4&$Dqyn_4ISJvaaGvH)46b|4+&qpBBu33;# zUr_tI(v+t6_uGLtnPVB?_1L7{b_<^YHg z3_zma0cdX6haT+v=vEhYC6LSBTRHjUBtMF938+yK*&M7NRIH3GO0i$ZfukLEZAEv0|!FuVe=j{_~GHw2YzLMag) zj;{bB{`)o$(aA=N4wPOGAR{^mP!2Le+s)MvMAwr5oxC1sXUWjyrQC+_KH9oyfCk4F*o$t|5Ug5-+dqbfA{~08?v5otqWdcceLUwxs4^v_R?**UqG z?d&Wa9nFP|&0C%vnO2VdUHdIRps9HPEVx=YT91h_?u-%mVB3h81%(7l_n6hR3@h3$ zK{i&~cHP`MoX>VAC)b=#*`2+^<`){AM4wlHRfAOSftn+PGcQS0Wa-De~W~=_4>Ff0mpQ5|~S8M7=t|)|1g3M>{FO{Q=do zEu?vtVzp4eoj;${ZJk;yz2p5URx)N4!dQ5Kjjj+qM^}i_*X>)xnt=*YX*W_zt#lsw zUd~(E6Q~feCN~2Wq7n3ZIP+SGsmuEl7#YD$XwMiR1 z{!>?4N|)*&l8l<)eE0WQM+LR}Nw@^Ge~7Z(IVqnu-g#R*0&hT^I5DAuJ6EUDJ*yL1 zKd2*LQq2&$x*!$OxBlDiz?nNDTLQw5!{wJBEnN)~>Q_7enlH_^VReOzmNu_XdQ2_* z7I^=N*nx;Npz_E5j=o=o2UP#^Kq~Z{p&fPt7L=~~1jA>(ZSM)7TZem1I|r7~IZ%xb3frkwsjnYeuz+???*#?Z!9K0i*i7=O!RD=e zTo`%8fT`brQ6}*7iO>5j8H$ z*T^y?rMJtnYI>-xk8Ukrf}YpWyM#mM_2u)VVM5@<$?^z4V5hy@C%HXdm7<>~bVbHg z7$8$B>zj7r52HzDR6ArBWILabf;(ETH<`46BZYW?`~6~yj4@NwKcc~xJD&zBB8Z)Q zf}M+uS1JL}5e>4T+etU4vNi-$vHiVLng;Yx0`1VE+etvT(=sSL|3SOwp>S)5@HF?K z#`GARZ@S!nSae6Lr)@@CdO<)74fX+`GMLI5*b4)+!;c1CwQeG=1&aO;Z}w|t$Bjnh zpfKFaHeDzfZ@#5 z{{XvY051K-zwmtr9G8ijIqgA<0h=UVFWCOQ6{|&y9sEU$b?yqNuy?vF`Ah`FXayk^ zkwav_jdVAu=gDLrMr{^sgYB_)W*vb8c*uA@HSYL`asRL81QE8O=ljSZ6%*jTY#-hr zdddjY2C!3Zzkc~Xx|`UqUQT%hEQ_rKx))%$L{A9}mjHC&w&y{X13eEgG9f8JRsu^M zsoQ+mJAmO*qBM^F-mWzD5;nS1q6Ru^nA-!OQ(FBf0UYu$BRLl-+C*p!oKz{6f_mQp zLw9Av=C=^tEC5BC0FXOcS0uXQp&q)`)l&xO5k*2^#2|ctfyx<6$FtSC$d zyc+8Sgib3!C(Idzk*MCzg%KYU*ux5dB{?P6_s)>dJOVJJ$Xj5r^Gwid3m4m-zgAVs~6;dq#(AQ{FM3YWB4;- zK1+4=$vlW7) zrqrmbGv9*N#}w)D|I@BCy4_7xv?$%JNlJi8eeVBI;q>D?>^T8t0A0Y0mEL1Mdefho z`kv#L=zPSb@|aYACbdaxBHCh~ckYuBPdL$f*Hrs6_wopd^`+2FC#a!?OIZMi{xG72 zOMde$v7sHliAQU;`H2>8%>*=?Q2Z0N$wCV!Ge-(X?V0swy2Q@DMLTuC5?PZeuI_}3 z7G9QhpA7lDaBG)!th7iJRPmO}UlO-;@uKZoe2sSMAPemj$3Lg`exjR}K=ZY*7~8tw zf!)V5z+O4{fAOE|o2p`81KLGq6sO$pP@ORvb!fv|{!EToc-xcwS1^M0vZ)_v=Di_Fd8a1}P;z;B>z z@5!KX>P+uRe}bPKJroe-Z7h)xGu1PnM4nwO?xhPls6D|`a=LnV=U_+8Df zke}GLrM7%?y(hmBWc(qu06Aw=Db7pZdJqC1qmI4e*~>JW3{5E=72ke^qYqdzDjthq z-OJ>Edj4!LvpA0;yHydHM@;pm%kx%R;1j6&Cq~|(!o0Mn^0Dqe(_JRe(zX-gmT!>C z8zNPa^UBc1s>qsOHnB^9C1~k`G4bs;76-sjUSli6u&W{g^1S~^`@Bax?)CPc;~?NC zlJ-c8e~uIVbNo6M?Km>*pW}cf0Bz~O52c!W5tw_K1hIzG*4xY^!H$UID{S3we^Xx4qRZdq58HN^lt=gw9QMiWP_%PI~;?J`al2d&>jFW>Dp z>d1tCGa&3(v9g%A?zgGdKLtEE%C5lU%QRS{1QcK};N^Hv2EsE2Y0&iP-TOyAArM`3 z=!~i&8kh6YGZqIn2U&nx`G2kuWvv~YJvkhZ)VxIlq^oBzEjz&ka#hKnl3`m;0K*kFFC*`#DZc}a} z{$I*nHmM%{LWeC~nKc=BWReY8iEq;uS9V<$NSbuuSwqKNrYcfc8CcwL8#)dknS=i* z=KN#--M@#XDG~k1i3I(7XcBI-Ud{r9&R2He-Q@QK9dLBMP5^I&jJk>cWDU!|z^4N* zGu-S{AS=<&j5&}M0nrKn64sr6kM94S{fZmi4;pGP_%vuM-(a2Nyq+zBy)?g|Am6}X z{kS0^p^;6mvXHguhC97>18V8po!(#Dzkb$Gm@p$SS$tAdm_H$VrGCwqR#0$u^R8I~ zpZKP{L|7^Opj9ZL;hE+;_f#bG)zXP&!3Pg0t+{0tRqgod*~Rn%iF#>4exUEu}kq)_z}Lip@OqFnKiBuL-4&w3T5 zxz!f*(Auh2PmbcCS{8d)ae*Id7{^bo*Jkb`b>k>}S!pc_lAiQ9b0~Q=o?cTwh)e*c z3S{U@sa{A`Gds$9o8?6YZSx`}&wii=2v-TSc_%9)S;rWwF!rR7DqeWVF|Sw_iJKHM zdjvJLqbW5(*%*E4z7ZOH_){%yvr3y2G3{DlMeG;}U-m*LjRb7t zv16fYlb_9HPF#pqG7-sg{!z0w;!hJP1kP9K3pp7J*zF6Cc^p(Jwu7e*rMNBV$EvG(=bA9>^D2w()pc zwBv`g*2#nahiD`5Lh-DPx71-PA`EOAZtGq=Q@x~L+cZ2B?9p%(vcLMnV|&N_Q9Q5n z=%qFlRmn&9<`Ip}6WhkZsV{4#k{YB%Ov=)EE$hTK2};c*kKfPCG@Q1KDj$@bsNXLs zanEP%h*^tGzC7ZSA=Y*DL5 zBo1jBpE#&lx5(C7kH=oh)J&DIQfs9T)by`9k4(>KK_}*_udJO)Z`WFDFP{TGiQJ5w zuRZ`Zz>D_k^ojYE#9j=lLQ3@wCYqHIiiJn@eMY)^nw1TTp_Wl2lQ)xB*69UiKO&gV z$RlW8Diqt4naUrT%;!uh)eco~^Uo}7vspcBBCfGK7j~s0ZBf*}U^XSS%IG(oKZ(iC zjNd%6%G2obEy(l!(R&J`?b0Mna9j}|_YFvm#7|%dp_K!HI5azd!C}WQMK7-Ggy>{` zU;nYIr{-@K)-wn`p0^_xe3P}=46Aqu_mm5Wv2 zG6MfV^S?478Q>b z4ne2b_pr6M+IP-7tiTQ)zeKTJJ87iLu0?oMhW)TNnfj@?j?&(S$Pvq=vqWR-HV~Pz zIJKlQlXey#Fv;RVPmF$f-C=8$eY)@|Ds`D&mPKCtJ2PoVNkGW4?q3v*O4^q_RLmM( zo%yS1`f!??HhTMx`3rg>;(07489H`~G;D2HWz{NTbJB_iO^^ zENDemlFA&VqV?_!P|6%X`W%cjl5&Zbr)C0^UP`BrY_s-NjP`9OCS>Z1;)hEL z49>>Tw+3Jv%166`*X3k*oM_L}Aze7U1~SpSD;t_IYdUp1XY}rb-3JQMfijbXq-|zy z_)rYcm!;Zh6VBMkXp`S2X>5YnF73ERdp$D8nso`Qpw!_b?-+X1GF$^J0jl@W`gWST z4-i-e!Zv|fO0b6U(BUs|IjLSlqk{mtHLJg#p919*`@KC)0%JSi=2E?8iI$}9SkzuN zf$F2?mWI!01UfkCC~8{8-n94!@u*UgLm`P#fBbbX!($cf?4j=wL{Khp7TyLqoZuM? zrk(De_u3c>ui#Kc(BJj`v6HPZr+S6T5V9{7n^94L)Q) zND)_!Z!>Va3l%rcg5p~X(XH#xs=Yx%k*UBp&1cV4xY5y4lmpdgAI~h&dySq_{Rw5| zu32H5^EJNQswC~FoYJy%r{27(CBelIseVH+4e#O%*h{Y>Y<-^bTq*v~TtO?79EN7?Eb_P(OsB? zW())Tg3D3tBW+^J70d~#?9!bthE3`p43Egf^J{tPRd`|Pu8?7!5%(|+$k+}1F{yvL zpC=pN+P2qeyiPZZaH)|01FeaWjhZl;f6Q{smYDW~*4MwUp4OJN^~F0guH>!O(K z(w9)z$Y>CFdmz)~4bAy#oQeZ&k+*ZKdOLn;c(fJxa!JKO0(#!fyydUIn7JnX7b+mj z6A2Uc;+7ru7lFl($qAL z;5Y4$EAH~!N1V4Unp4w&I*84?Ww(ze2}8jh-?X$bLYGC~)Ud_(^cR+K@@ZU-z%Hb6 zzfpPgWc6!vb;h$MgO7i!yFZ?1%$9ZF9+`?&*M86y#YzG5GA|IlL)d<9v@w?dFD%XtX-xn;C4YDFbhv3Rv1P71Xu;<{)q`qU#B`SYlHrb`p@NZ0QlS_h-VlEF7Xf2?k=Pti zy#T#Xoq6#gLTk`lNKhvtz~FC?_aT2BB0bZT^YfmB)MctaXgGKXqq|qTjLkjlv!Ca# z@mgsa60U`K`r&1d?D3QSMRK)uDN?KGLXPnVikG^EZFVCb?cIZ_hWP;asJ9a9=}t1ty2*k4;hz zAN~*GkZ`Vb`TcWGW7EgGG$=N$*Pxv*eIs4{hm~#wMsV%z`p`JlPjU(|Y%2s8=5>ql zjJBNtL=z^HJSFF`FSQ>eo8|Nc4NQVKv-?1>kBr%STqshDV;c5L(;vSpXju%R7%Rch z{+HT#A}c~=Q>ly!Wj)D^BOO--FSh~~V5f!-H!IKF9vI*!TTWzQ*6fGJQInlZ72)X) zAEl%-o~%e|5w7xQ^)1?oT;16>b4Y3ON0H|A-Kz_6*a2TAmsb$&*YPMUL69qUr01}L zmqH{t&BSc@htHdE_FK3W41$^$%bzqxbFcWlEbq*5HSWR$1`V){G%a_%J@Y{XfiP1< z4EcIkW_nluoE@j}fQH?`*6Ny2VuMqP7Y2p?s)^{%;&9yRniE;8Wr`k#_mcgwAQV?3 zXkoiYCM?;02WroQY13kolJda26~x4MIQn9Bjd8ZxJ4N)Nrws+uLEAS8WgBAD_OLw< z)jn!fkR`zWJTfNKh_Q*tCdjsPk;|G7MMaHqUKJ6;Yh;QPtbe%gPuS7H)ZJ%p$C;wu z=j>^d!X7ARL?`d&lLA%A-$1OcDbyh+?8lco&kmNAQbt`S-Lx@@K13uew-+CByMfQ# z5M*X0RGb!8%(XU6DffwHA`|efCO2WL>jbm*?QZV(yHOrZyFqfL`;5l0S>t6U=!JYgK& zE9WadoA=4JJL|T8JU=no=*Lkd6evx5zF^ez1Lqh^ul)~OM*L=ty+0*3(X`Tc%eq~E zoMS7u6-}ZwYQdX+oMRsLMoa&z2PXnb-%lOg(qK4tJ$yvJaT|SkUzY^v3&?-(S@G$< zJRep$a`2~A>2Y+~yw4Kc=c@2sZpG_@vM6Y|ExM8Ey`|XsrXP+2tGu_J|7U-NLzcvw z(fhz{!Qxle{%h#hCHr>b^V&C?14LOAHII3N1?-j#<-Zddosjd_ll7A%i{2AxR{|g5 z^OILbc-U0+ZE^WDDwOycTnMsTmG|Y^byf1qh$Wo34>RI|N2rr0+xIwU*QB%%zZB8} z$vNlNc->g!KL_gb3lYFuOo>26P}>-iI;xhtq2fl|jcJ=0ByAXnqKWW)1s_5I_ekhh5t&s^Zdlx*u|^R7aF!_{xW52G{7M zCFD<#h(ro=Yd{c4DYgd&S7PcH|BL$k>$LUzW=6u5-N+`9Deq_0$6unDwcbK11RZZb z&e)TVjeL$Vp@QQ15-z~34)2J5q}$}RkEX;FP)wsYZyQRAS+ktQ2l=s?DMXj9&<>potY)KicsC9;=xk_c|kh`JtrCbLauPw1qIVH^-E zV{xq5y{Y~oAs=6!{8y=xaX>YZ%d_H&fMi1e z{IV!>3 zsI7{JIR~-{6fnk%sy~@q#~kdQtom4bBhDU-`V|?jt_|!#Nh1zTWvd9Mxw}O0tN}>b zUXWAB4gQvu%}7)2-|pO-HxBuKV#(lLEC7wp{=$iqJ@)dv)aO$Oq<&o&8Mct#wC$~>Vb6w z=j(BuRj}~vN?qtl01urP|GN*JLxXWYz%zmQJUfgf5bFZ=pj4vVeg?bq)BFme{-XS2 zoYR&`rE#0!IW<%9-9Y@ZqjjJ0`>t0X3#yijN~|R22qzjY`&Jmcb2X8DpS8+A7qI&^ zn=8eIf)|eS$MIZC6In;v5bJ8$q}`3Vvf~F^N`<-o<#rZB>iPZ(n+kEduzh^BY+Mq3 zE{$s(*H_3FP>>eJDn|;d?#g&*Zh!jErYWT*Kem!&)&SdeA&AhZJ4#&}Lj-1hxbi~H zH1c>^SfeEXX>{pwWqTgOyD}}I6t@FbQj)L;KpLd7f;#cdm10zCxt9?&=_z-T!T7s@ zzJVe(>5K=jk)RxztG$#>u?c$I8s8bE?UlQ;56__j3hz}!FVjKNYn^=>qJ2FJkXC$q9x%{9c#1+Zy<1`v;u{b99jIjCf8~Pe5-}n8^ zEDxjPu)p;nO=&@WR=!Q}{>E?AbfDy_6qQU17J;3YW%;i*CvO(=OZLND>M-L|V`w5fvre!wY6%DgDC?SdIe5s{`|J$ z{f)UGkxnDfR)fL2Ca#5`I_qE*G$EbAOnX4sQC+rU$oo}BloZ3Pzq5>LKcEZ4y#FtR zoN47_B8i0Bu&1^V*SEPoq5|-gS+{ z-uV^mS;VP)(y?ZD&!$;_QW;_@3Ha*s_RbN#M|zOT0&3e^)=KfrIiazrsh ze~NayVQ;oEYT-~oO!|qr5MSjjAjF4qbs#fQMG5(#Sch4HQb@~K(y@RW*dd3~zgpU~ zf6!%Kf=SV5uH+H}@$;ly-W{u^z0}A^I!E5k|9HftUp4VUHb)Qh#4vl2Y4SWZ=~!qt zu!c#dHHw8vG=CbERDtDkFc2&E^I$^09+v~fqm~x%;-)vYbfw1ET=samt_8xgE?BpP zl-I`GylF$U&-+xa8E6TC^DEb|wR)eilm>W|CNYTD-2`hFF>I;%rZM;i>=lK> z*>1w^c}`ij>qG1@J}gl(Q776of>4)d-AExi=+hIFi-5qfhA3Vx!)7eqbTq z{spzIS5G)vT3Vs^1W+}tPVG*l9x_mjH$pzYQ8aIS# zmmO|hJKWvP<#j)8S zu?=eNM2aGvhbeC8<#u!pW^<@m)M4=R^th99C_J@ri@Vkpdu0=>P)qPV0elI+dn_iu z!2QasrQ6MWPTJ`(>sC#;)3%D$90?Fq(a$C?0kukh^Y^c{=f zmRjsyN4r%Kj5S=XN#0k{=MKO{CEr(J@k-e5sdleFeu3UwZJ~Uw)Zyj!$irx#;*`nl z*=Gi+>Gt_j>|SRs807BpeLXCR05Q9c^=5R?*rtSQ&Ymfta39RlI!Ai(Zn|Fa3BahZ}C=fEL# znVLDsjztf{)tgJ1!%MSSlUvy)D4CETmIOpc=<)!07c#d>=tOd)DBwapV|D9ptH6H-nr!*Er%K_BaSl z$UeLSeIQ`>V*i8JbAzQX#f^VVFCfs!2sZ?#`lbWHXD?xc>j#Z6HmJ$jb0(`|&+_;J&Tp_BHO` z7!fSozGW#`6fpNP?ESz#%z$-Vtp^bAK9q<@+2EJz6Rd%xGAe_Ip-N=zjbOs7dmNcd zlj8e}ZDdKdAXJuqH?E!WYyBr{P3&XJ+>=;5u!jLG|S@*|1xJ1F-y=;e%&hW2) zY}#ps39gKn|9;UG#qA&h#W4&{R{OZNY*=U|suh6>-n4KEQ}@jjuMLUPh5e}_+xjv@ z1nJe~avXmYBGh&i9vZb}hbu~wqX?q4BFsDJ3+^p08{&Rz@TF##=J*AafXR2@BDNa^ z*?K2wg1;;7_*D;MfvKmLgRIu_tJiVy<(21GdQ?D_`B#&6g1QGa9+2MpQGNy~n*gyh z$u)~v@BK%Jr~7RZe?%gTQIE9mP#6*K`uTq8+r*DL2h)TJ^?Ii~qgw@UV@jHkvoki6 zd%)7cJ2^DRlwpk@zfyil26sycU9&-YIbp$8klwh%@h$H0hq|^@w4iqJ#0yS78-l1e zi9REb@`L1V_}|+2Q>~I`g8u~GN8E#NboXBP7LMF}G`ag3LfT=9;6A?Nl$P>btPGz( z@b?il6Hd+v=(qMb^Z-!{02MX1bROSQ-p%Z1V*^MzH~p|Z|~4@z4iI)>-(!5GT%v8G6tTk z>1sK-`-h>Tkay&a1g`L_P{OaNzd%aff7b*zgu5sGe!ptl2h@*3!F~8^0Z7=U^7Z%U zna1yzLiQZ-jf-i{*7rw*w&)4`<-QF{Gc5b&ra5kE`A? zZx@1tFKPO=m5jxPlJx{Oj0<^UJnK8ATu%iz5K>S3fIN7{YS<?+EaH#!9hrohrGms8wZ^*MuhmqGG*KMZ&VKxhwvZXH?+X1l6|jU(oBpe=EC# z;+tNfFg|AC3gQ9v;V-~@3#VfYHRcya7?q#TgsWlGkWj`>nZe`XnXDuQfK z&^=K;JTfXCH@Gip)E&lE{}iszFYnT^m_Qgqt>rMqMb7*61S%@87_95X?I5J*vd86q zr^beY5!5+J0qJ|+ouXjJak}(Uep+&QsB?`bag1Mn36i`3>3iOt)vWe*_zSiHIU}j$ zvQ_7r64zd_(eabr;N`aNT1emN{gMGl=bHK~7U!2OkP4^X!y6od4*M|c0daE1p0;M} zU>UK&3ztMFP!OT8yOt1C>~5N$g*i}u_T#gA*9voBgGRs9Gk_%VLga2>l$zu0eZVaE zQ1nz8lWn}-9X1(5+;f{0hT6^wIkUb1yQ8DZwSzKu7(3#jjV_PeM~OrbVA#6z+6G>4+~3q-vL;lgHp=ax5*D^0YX zoa00U3{ASyr?k4qQxcvVipePkgl1516#w+8_FZG2yU!*y6rHRg1WdJlQR>8>JZIbu z5qcx8vGur$*MBu=^=Y2~1@(K_WgAMn3Y(N^B)ZZ_RI)>-Zgqq zuFoA^-J}B|t6e)$D0XBJa`nu$aEeV;aK1C#ak#wbb=fsIU1zv|{U8Iq*5*^`u@5VFWl`iJn45>3`F`QGjS_qggL+=WD}kLywzgZX#{kF`;x$+bXmJl%v(h@AdleF5iaLASMBhF%sKnHcZ;SVYX?N%u zEmK?F09K!B-PU${g;cgHel+e%#P19TD(D5J{e9{y#@GA7@K6YsrkS2$>hqDdt9Y7Y zVfMMAZjt#`KcD*xB=~U`K6(dZo%F=}`4p@Z$ozxN;DNESEFl#||6)%37+$c-vR!^4 z5{tmxi{2(RgGHj_Gr&b66AMxlbyqVW;U0^$XNxOd5}l>PmM@_MoF;HB(~fagW9L z9irt_py>0>m3IxR&U^~bXp41#WB56>UGsh#$4JL1gg1~O-$^Nj#gO@?MBXTbd1#N< zWcF3W!9o%bbvMc?m=cG#W-xjc>^Kpn`p{}?d7TRdpZlYR97$tH=p?q2Nh6RN-}nO%=Pf&IC5ci@w6dTwar7w)>*pALprx*sz`$70xgA^9wr zzd8Fisk?aFj+#?ACGt?`q`jlBDMwn5O)2F)PnnbOiF^fhzG3CJDu~IFbn=Xh{qfhY zrDQl8bSW-po1bT2er;scye_2A@bpM;Sbs{F}_ zR`q7E;d|E44JTSj1Z)z_Pjaq*SFUE=Cs|aXH*fE%?&;I1J3`RT-AQndNU&OoNZ#n( z8x^>Avk2Og-0bBo%U*MHmz&~k(7FU4_6GTv(Gs9b=E%aa~yBy5HRaoBitYzWW0kyTKT9b+Hr0@6BB9XQGIw z)NXDqUW63BuD|dUR)o@d4ZAz){vddWE_FzIRm%1X5Dv7^iYs~{Tn?Y+w@r4MP#GYr z()4IG+fmY~^a|gsNc)@ZPNtX!R=MaLGp?xkyVKbZ+J?Ju*X7&}3u73}@-BVcqQU|j z(N3!?9fsSf4)&z7v(4@^Ftz!HqH00VYOkY)Sg??dHBPbi^w1 zU;R?24i4JO?X4_B?K2$b^tawT-3sy+NTHSJkVIY%j2h`-j~jzw#um}s^36)qO2;c^ zZnW}s9>FR2L@;5kMsdx=k9{QzZV^TlUUrF>EmmJdG0(5)v<(80EpqXMU>W-iF6XFb zC5|UKtQGmjQCV$rA!;!zEWZae@*eAd^$D-}NimlCSN!z3$5ZE@idCfE->&_nfDw^; zY^0)ep$b*QeH6)JIQ3hlpJIQVPq{Cjp(q&26e)vperhw54!z6$xt>R$?_VOlFy{Ri z=ak0-q%wuaV|-CsspwIYwO8+eX{j+`C(H)& z#Sopbn7<5Fg!u2nqn^IRC;s_l?G5$h7mnAh?|fe={UjX|`73uy_iWfh5Mw=)Xq5aD zpD@V!HPGOw+F#;RlFNJEq1Qowdh8ZQot$3kd>wwn_X(rn35sAbi2BV)X6>l?U)`rY z!lIAEC3(kGK2Zx(X*>rt;4OanG3JRq7H;qw zlo7xj;*7#ud)1TC^*138OaE($WNjwNsh|h>*-y~u;SrQAHgY3_SDCosj*rpx8+_n2)ZQ&QjBT7u_le=UvH0u1?U8=jXmrDo-k8;$ZJp3CU{%1T zXs1yx6IZIM^+9LL-jl6AueqqAWCQBX=e+Kx|AX#hWTQ`prNE(;!0R4LP4{f0*6Z5P z3@3}?M(FBsFr}%DrUtR}#`y)5&v`>Qu170hHrY~xz_GgDxMW6csEcQ+&>ip0(!#j; zN2hw}2KSU_MPpM*w^s4SgQ)@r{5Swf{n4ps8Zfh?UA?59zt5vyC=y1zL#;N|Frbe3 zRbZ)P*Et&~3)$9Wkz8lBDALYWnBs8JNKU^$^teDt?iuUkc=t0tNWH9*MsdE>c<@6R z@*O&hf{3d6n&4_1HR~+=>L{LRsd04*3rFjnAp!kt{OV$XMTfYTQ#Ind!Rg~G_Qd`;A$biB`-F*|aOdqb~?;U90PLD7$rJey}oFmk>#7#my_>C9+NFbzAa5@;?q4m*_YKX_ol-(ib_b^JtV% zGSw9>I%gEb4nWh61FLiOHsF^1Ge4fuS$_(NEmw@rc_<@2Y3B3CDY9N_f;U&B!wTPX zTb50K!yrfKO|_+rWVX({R_?}wLe+N+j;Z~|Me5lK)vS@bLxzzxqCTd#W?L);N}3RwG?-?&XJxd*seyTLV8jD*_LBQ?xoc&xOJdJ{^a@jb3jeN=+)&vhr zHmmLbA@G0+Fn%Rlbz${fS#nEt8Dnptg`t~?SHYK85?-W5DoPaFlT_V0sMbc3f*Hpq zU3@oZYB4@(l=4qFuLu1`V-sJ7K0}EIU+?|s`HEgWEypC>t-EzvsFbA3*Fp!s91E+B zPwszoex6B!^J{G)_@omd*`>5TOY*c*L!vaNTl2tirUF(BM&x_pUP;_FwR>R(|HE?L zQ2o|!E|0@wG?S@dx-cCpdQRKLv&Pt^9O6zgG9t5omRsM1zddt7|D$wClW9l&&2+;| zdJ#!kk>iwiW?Iob$fA&Es_*a?93eVYcxGPw=9j0~JmGrrq_4j$(n3try4bZj&$Oms zENVSbECE-wz{jGbNXl?bE-M$>I$5e|ASG4%a`Ho-N>z>ltEjW8+NSnie*C45fLe<1 z&EuJZYuX*lCj2$SY}B{3ndafWDIcPWXVbiT?u*y`Q!o?r_03IeMLR`>Vz`p#v|M23 zeDRCfY$?NWt9Mi`(uebdrTN+-uBintJIWmtvm3pN^G0au#C2XvE86`08E;N4`RUOA znWzUQb@98s8{E3Ko|%iPo2>;t4N(&xR;B!#&A~UiZkof^MQ6wIAM8|4rLuGy$9C=| z(Dc~7_w&uFgl=l*dOvg!Y-LTf8mYy8xP9|*{o`4ta)zo|Zm#@df7}lxw)6zjhOgVT zf|@(6z$}D{rhy7uEQs|fnQ2FK`@~Ez&hWyGWV+rR4F)_DWu-~h(uM}h(Ct+C6?8QG zEYOA}xr-y+iu>eFe%_0-smV*uoN4UplFELHs|*FDLvwMf{F$4=!m}qAU79x|vD5Vh zY?cM|hipzdNW>NCk-RYdc&4d~a5aT;*VUY_;6`kG{ui4~&JmAZDp4k}#}}X9n7-(J zxTtJhDmlpVLal_(w?=7kprP$`KInVI>EPz+Ups0PE$5h0%?JHgQ@Pb7j=OVJWGa(1 zDtc#*iDA=LBPFa`c57G!opu7Wlxc0YvjseJb93`C!r@JvW&W&x`8{1B9 zY}?kx+&CNC_GV+-wrwXHzxVflzutLfdTv+GsZ*!At19)UL_1cB!zQ&Eq8BO&%m|6N z)Yf&?Di6!u7F#Rue>4mfV^yihR{~FE!e&3XYc={332ztw>8`nCB&B9wKjfyttMjFV z-LrW&O-$*Q?$Xll@X2oKe{k_4?;{NiXLV!+ZPYbOFRV0Mr+fjA4-dKD zQ%(eHO5+|9a`w;8bkAk^HVkWr15)qr8o|vVzJ%)Y>qd*mxSPK$Y`#2BFaQ8ZTBYoM z)k~yLz5@IqJ>^Od8E6_V3-ZTeL^}27T4b|wCUq-*yy}BBQN^{aj5GC|#m6<6tpvhp za3Ibv?R35XdX{5HNt)ss8n!O)md}ZWH;aI^+RrxHiim4DX>2?VXlEtAz~Itt1HXe9 z@;M&f=-V-#cH65v6_1?+HVU;ce4jdndGem*CDzwt(F}Pd z7igV`h*H$9lo-d9njeHsixqY7zgkQBWIgZnc8h}*s-=YOZ;&$gYFG0cDvo<|7juPO zc=3BB2+#~e112;N5kKLZ#xk=lrnw9N_suh`hX;_7U@rgIc$=zTys;Mcv%h*o;8G}< zMM(${{Ce#eg2|?hCU#I%MaC1cI%qPubmTx+b6b^|qh5Rrs7av-w3j--Re>gqx5yni ztQ^!+9_<}nGPe`=YT;o5yFFNd1327nt&w$|4T5POK5Qk2zn@bOXhxsTAWg zDm@pooQ#5(kIO08>+RA;*cZxi{&2eO|09^P^}Co880LUhZWNu)Kp(^9h$l3U1Foc} z-~qX1m_H&ry(wNVk?}JH^Kg^2IlbMfGX+mV&}e02`4yvcg=q`{2vnQe3k#o! z^?~bzC}NB>9v^1JQu6&3-_FNyJK>*5?gy+RHA>QDRfns64gV`i!`z*R=O)Mp-wmXn zE5{gZ4v!N1t~cvZRsiLt(4JpLLn!`_IzBr)H5;$`C$BXsM(o3)aOa;NOBFjgF#Vwc zcDOl90WVqqD#X>{4_6uy6je==qmF=sX=*lZZ@AX7=?c}=sW+zC0ju;%E`$Y@P-=XY^wM8w)A$!D;etvRb*7Q~*#DqQpE)~>Yn zJPIHL8D)|U@ps7x*413YF%JS=_s%S6!vBDa<|0W5iOQIbO^+cmoCFat1G*6yzph_x zitpYvWZv!+{3OaGU`&vs+eAAl@-gQc+Kls`kR;NdkishJd%Azj!)J&@kLH^piosmk z^p)jPyb@MB8vaE#i^SAM>ei?g%jJfQWkAtJkY>=a|4pJ}xPnYMl4#+$5z>f?^cMzMJjIqTpT?RIyV5z6NC(n^`+?oiHP?L(~kjnqicg- zFX_L@=rO}u--(hKW@2Ofldlm15aj4OPI%R3=_PNhD{Co!J5EL0@CBxehom|R3;RX+ z>tf8iFr4LHl^bFz?P(n@)xM%#R#b8}7nM11J&3ouqd&+G6&-%!m6#!tk8N6~lo09G z1b~-6NlL6q)zT(kj&Sg~9!cRH%{5pYOX#-W$d;H*a3I}%P8$cWS9U}{IDi3vv&fYP zK#1^J?<9CX23#f>YCD_>l%(N;?m0fY9VQZkm>o`2TXnvK%I}9CTu_o3KNy+L?Q|CQ zy9xI6LnvRoI^BJ*?6~jXIF6G1h&H$Oy0$4ZA>7?Y=|??q(eFLM$L2=><2_JWZJur? zedZz0P{g2iwBBqk@vSC-$5Zt#;R`6SyydFUq5EC#}3`kcPLm z1QLZ~d`K(7xx!b=@dw+f1yFzX?WOZ|g`gX4eKp*#2&>IrkH`VffC&AZ;l}orc3J++eHj} z#pe4D>r@rWx$!bE+7iEE(u$#wEna!Mn&;m6;KCA)U4 z53mYAYR=POQr5lyoBO%Ql;2iJ!kJo5y@4?@K{^p zt{IK=3pr-!WOA{Q);T@~;K*Pvc4wH7oaMsTU6wyNRQ}-c{<3p_o2c)x(~VE4C+6jf zzh%DdA#mdvYU?BX3vR!yH~{%>_t|UVJE6`AHg4J)z$BE;ixz?8?!(|z{K|$Qu}SAf>7SG*XV*? z)S1i7%1%a>aGJ1u;l}yG?k*Mke_b5wyQUQTaXjpW<|)N%FoI`W$IWCR+bKEwER(mKh$JC3MW$%VN@Rf5@W!<@^vuz#aas)MjD#0aA~nIOE!$g z>n|?eJHREAFRm=19(0QRraBb9_G9Y|F(zACZ^q(jGspAr`PwY=rwCd{#-==05c!w! zuQp03Ftr-{9HR3}L;qWkWlJ|FmUm?nXBmX0z=xE;7>&Z=@s6vZ}9~ySxdTx{+YTU0qbhfq6$9uS5i5L-+mv)O&5)y_FDg zNDE#RFXm}SR1{@*BAQT#(q=$AJ{m3aIh)Eafew6LL0yLUaW@Orgw=92Pi76jIiYT0 z<9@e-w%b~6M)49x1T?Q2Y@y%eEnEKIGD@cK_uULEwqTgH>tL@9?^ko^Ik1G&6xQ7A! zmBg+Sz1X%?1$1 z+4+vtK2VetUwaAkvoJ>B1Ll8}ZyBdU@zcPRSiG@N96Fg%+jRHgn8Dte4 zov<$W1M`d>%c@=`3dkBjAq^WZ-Ed8(wcU!@#1RpUXfK1LA4G9>%;&O!bqMTGsAFo5 zUbm68!OeAE|2$#;0{d`IHPT4#Ahx@l6~Bovv&ljax*uru^15nt11~lV11)cPD{_Nk>AylGrwyZab{SLj_{m>K-wYVJO3%id@M=5RL6si1 zGPm?K z+i6lN14OUBqE{olqyV+F2NTHnYMOPidt?Fnf&HL1yt0!%?iLv z9gF~EPI=irKGP`;hhJ0fIB#V2um2uP7uCFcsoKsCsN7%P4MZ&$%hKa%YM(56FotW9 zJMkWpe41sPFQ4iN4Kv8aA1i~9EG%zg(kR7$sG|~oFKv}NVS6gmSEpX~?3Qb+WRCm2 ziqnR;ronUOEFDtVN5uZ1mi;O1s^H(H_r2aex9b_Q7PypL<;)S~-RPa-jUm#>rCZ}y zTa|LO5yj)2t3%W`m{lP-sebHK{+xvpC7>6~AQ#tqsqxpV}1#^{L67-WQN zDYpdEZy2b`z=9ALa6&8TQh~O%{4WqJO9wdATKy;)NUfll-d+I|Y*W|Yf2*cjlm!o@ zmY?L)ed3c8^Kg+Wk{rK4K)@T~CAgY#Ir<@ruJkdN4*HaUbw4ig@I}tF;S_CNnx?1U zk);i5aAnHqk$m)PXrliYwA)iZg&kFfC6666!3b8shDOiCa2(9C9z%C~athQZ5PrN# za}b%Gs%xoU*I*(?Gx|Lick^r122d9+W*)~$=rZl=&ZR9h9zr#UXG=>wPA_fYEHh~^ ziza&=7(H8In4S`736g%*;ei5j=U}b(q>i4FKkYp=@+2Pu{RpfRs+C@9=~eV!^f|68 z4=fXfW{i$2h?n7tgoUl@EaCjasK5z!x0thK_zLFgw!+tPnER&j3+43Y$d0G7w_MN3 z%p?N7gSt`WG|A~Kq7i%n4tNi%)em$XH=RPcn1WXI`k;#$GV>hFP_L1Tk$RXPO`_mc zWr#VsWYb^0peE zreT7ZjuE8;s>N-_JJlx}S$to|4Ay_6(vHP`&?Hvc<2SdRSLkic^Vx$Z(HzcywGneo z?|$Kn^Xm0q41t1XbC~dN_aTE9N?O@oy*Ze6Q7DtuQHTEoC5-|GAW8bTbbQFTT;Jpp zwl4mMjS{}GXrOrSUt!g5IB=qT^=$AE--kHq%LVWS6t|2Y@i^d~aM8I>296hYb5y0k z`7fbuP>KffQ;nngXX2yn&NN`IAm%F&gwo_Ul(ijs;XYas9$(FNEk^Fm>30dJ(k|9I zm1&?L5{0VDx;xGwN%Zdg`AxEX%5Lr$0lJ0zqF0gv04Dk$f&!^aUcy6_-oO7ax5-5f z{}kc)J4}*5n8HIvH>_66k{Pgq>}Q;$(<358Kr>G-3dvrgM)~0o*}Od!iS|{{)@-b` zhE23Vg!6&aE=yNa8~hMFYhqxjGrfagIfeXLN61Dn9_p8rW{7qlmGbbcy}GkwUeaz zQf&ko(=tw1frnH`aMr38PcIke$2^pY$l=UZ!CWr1pBl4m2_%0q zB5d>+IEHXwo~io_P7(vVhMzV#jg0^o}r-T-iPnySIXJ2H%%R=Ej?>gntRQa}SqX zg#}T$>dv0x><*TpjCt*$Dj^BKmRE>Irn3m~ zt2XBk@jJfDaZxuc!~iENnFK1uH?|4@FN5{sD0VGsg0P_$OXy~9BXXd(o5>%uV4#92v_fF{Q z&N}kdyG!fM{^t1rMiHIjW!VtX@$!$Apr>HIFl(#qvWrMfD7HVbYHUqk{T2O;1 z(*2#?=Ti*JXoxS=)6Lmjo+B~Mo5tJp<;*r526NMs_`yaPl zx-k;u1Ypq;rN9d$k}}gXCn!A38K0*P`U{G!>5SE?EKQ<8b;@XIU+W5rF?6)SZsDSE zF%0TeWEq-oBWs%qx*iQ|0&>|7KKzlLud2QRYCER|d}=$F1&%KoxdLu*iVk=OZF9(g zbR`e_Scq0gsAC6%I}$vjp5EG+;|XY9&I9LfP*YsSc`EtSwxEbSpQUKvw>>fnYcJ^xyc4aY|c?nk#o0( zLoS)%LzQY?A?aBnq!1`$JMQXWtJ*lb=@$Ph&4xQT35yI?NiRK~_sZ`Gc=eM)-YrC=N=5iRTCD*uJ|qnz`VS1^5H2d1`lpCvZVQS9 zvxx&VXeR7nl3310icqW7{@C#ldKB@9l>uxOaboyLgVfP0D=^Y(Fl3Y!`VmCRbsb9+ z62cQuG*e;3goUYS#p|pGtAFLY>_MoMAAJAgz}yc@)d;RXXoF?vP0Wkn2&v|kp2AJ8 zYy~|AH!X3La_c*MDGHp|BVAITblynkBRwl8RUqking+Fe8nMyLCcFGgfRYlWK6|wo zfv-!q$GGH}vmcv=#D-sb(bmx8R7zv1k(jaFBs$FxF?~Bmk#uY6iNaE)EB#&>6Aq)r zE;*mm`yDyUpK==Y97@%NrZjgCCBGt<)+N!ZG}oL5O+xAixAQAW|JWVl3X|fswmH0z zoc|gz{Oq7<0-&&hXlHb;xAz;FvDm7%Azx1f4X}32dm7i!bT$H-ZCj3D*Hn^F;?+5v z97uZyfzavkEnt$Lho7~CwQQ8eSCh@&5ALdlj#H=i8-;NmLMB%vG)8KHR6B5|7JM%x z11D1Ub~&o1FKACuwMwsf&FIC#afT_i+P@9ld=SS|g~j3Y zY|zrKPk$3}aO$|V0A~`y8=VQ<@mB!LrUDu+%}7|+w|)G4eKssm-3?L^H5)IFJxj=h zL6stBeZpwZ-p_v|Nk^7YIS3;*yDX8RISrW9m7- z?Anu4M`lF2e`1$6UXBss^~M-%ZzmVuVrh}t`F_Rtdmjl&iy#zT3SvB=(xt#FNPAQR zDMLjFr_r=yA6_rq&t~iBeM2nYTRRo#&RR`m7S1sQ@tm%+M_mRAG_bVzJ>9=aGDr_^ zDDa!fD_1eLG=7>>1^TZDlZkNDqc*gi$PuE_>1T^=y2>SZCyt~-I%%@e1?jdSyk@AL zOX!fPvSvgYre>D(&FgWNsAx&-H8{vtv`-n*sAyrzu%_R%UBnwMRG5}>%iqShSbx?|s`M}BcBW(8z)c!H)NyG-XKi~s0W*RMjy4`=OS6ub!=3bIeFCGBo{ zsf~6lc@Ny*f6kalrI+$Rjs+4{o}7-~>6*$Gj*oi`4v;g+&!GO)Ebcf}s!vi{xrafZ zqbl*({fKJt`MMyE)vsFIJ4q)rJTg=$F`W>#nDGWfjy9guXwqvISK6C3883x!KuIDH zbvET+mQ)JHUM-OCynd9_jHpLuNLQ&mb+M%s!1Z+2bPSt6%3Oa(#5+m7f;K zx`e|q*87%_wtKx#Nv_a|sU80$NCQ1K*ul{{l42;V4C|o89o^MXl2*QgA9o1^ zt3&tgl1=6GKsd@N;Ff#tbo?krnN;9(6rX^}U=X#Aaf@p85y^ayr(pfFpEknEEHPrQ zv+$-nciv#C+RF9ulfYY&@}tE9GS#Y`G43<(x4~*Tg7rj4W&a%UyJ^a^;A58RH}PuQ zg@!Cu&S_MylGM_8cLla^X>jcBbbRUc$8VK4+5~-3-|I<(Dm9Z@&3KNpj7$0vh7*`d zaKfi(%r#rBYgzhv%;xar+mr-1JQP;>BoAt_9!manT}PzjSJ64xFy0Z+L@mD1QI#h( zU4s~lJSFLw~DLUJ?(?=fj7tUh!!x4M2Eg+fib6MW>)_P+6!%au7h`S|-{dsi9p zIt%yMbHsDIZfBmx6rxh%+=Ws7-g?zBVi!$^j+4VVo??_n<8os;${Pk$utn!dbFwEY z5JR+nM-fvvdrOKiTr5z36cC98nJ>|YvxoaPifBFK`H|9pm3$N0M2pnM?+NmnI6o{F zIJ&e0pNSLs({I&V?#x<5v=dT!FV8Of@pDJQO*=$ko?YzK7uu+n`C89LF%%hnoJW(Q zb7JQ8X4lv_p};cPcCS+i-fOZ4BuLuV&)bvG<;EGw;=}OxtArZ50#j7b=rAs{YuxA- ztJIoR24&3XQmWLNRE&#*M#HDDEapu0j&(2lmL~qmWme?t2O$>=(?8ShYCMDfi)U0O zQt}x5w@S6~a_Gb|0N7$h%kNrF45B)jS@#fg?p;%0PZG*!+fR)tbDM~~8h{pVD%qmU z6v=(LFHb69)O%JkL%uV6U5=${!hm0NqLQd*MY<w+SA z?3KAIacw?ZAcvVykw($r)pzxFwJmHO4}kJPr}*^Z>&_9ENv^=6c(_WZm)!FbTryS> z@E<}EW85{XDc$pWrAJd9c@-Uw_QRP+D5rcW`kn2~#_Ly}uabYJ;doJDvE$NE!)A66 zMY;F{dt_-exsq^{ww3*c6O^$};GZn%QO&2|>eVP9C|~bAgX7s!Xa#>Z*x~T}DMS)1 z3aS4=TjO&reHud&p?lQ(Q#o=7ca^=w+(3hf;5G`fUDa3nLA;wWFk{KXt)~(i*2}e??UU@V$?I3()Wj1p7FDxp1WWcg< zw>k~WNV!UTkp7uP^qb`2=9KTRrgP6QA%%h{=Y~}@lg9*V_3Xrl1BEaVsFFqJA{Q*0 z3NnCX<*lJg#EfzgwX#QQ<}P`ISL}#lsR-1z@C3@wvPZsYY4nu3+&CJQTFkqx5C#X1 z#`uw2 zs7LQnw#Tx!X<{0gYL$pmE12k3vpYbozVl$Fb~=N+GlD-P>5CLkIz8vG$NW@-?={MQ z02PYw`p5!dR@FnOp1(b5aUY>s@wah6&lft9IwkSEJm`wwTyyn&DFz-!?S*%f*g{!C zt6G1Yx=ySZM}_eq+Wr>RW$atM%HV3=X%~MF?Nxa;oB6t%4?^`u zmJqUg$?w|YudGCM@IVVIuc}LWw!g7Q+~%mVBN-1tpRB?Aup4}xru~F2CEsGl9`UU_ z{f5MSeKoZo%L9?+Z0yg6q|cQxH$ zC6=_ycW6HM4+CR=>-G0mRX!QyAl;#t3=bibocFqnq$WTX$WrMxiPEEdZVSkfu>N~5 z7nlecHEtdq&I=Z#64IO4s7SnWpV838Opd+J_-wE*qUWm=H;FAFtUrImP9K;``fIb3vx zQwC^WdR#k8hZxyzc(&L!8cXsXOR0gi>6xR!t{Ro8@rrCbTj4XDF9i*KSDX$LoHQ1- zw{6Qx53t%kc(FLv~4M2r(Dl)!1h0!<-)PX-;J7m8Yby}{}r3yWX{UhUeycb zs)>RF9x4|5+1zP22XyOIEPGws!rg`&(om)*-$QL(lGOchfaQdkMzyI?mJqE20l+^u zJJ;0sGIoef^3{TWPc3~Jdf zZ38AE#Z!YPjLCvuaM+@=jcr z!Rm?oTxOs}Lj-w?AgsH9pitF7?URtjzc<^A!duvd&{E%z31Kt>&T6)P{veRO1=max z`KwY;GzTU&f9F>P#6=>(#wyhxUUosb+njMjx2gLdgp>tF$ARWa!a@PB?OECi8U$C&c-g0%c0l*$iz~6g7|Cn$8Fh-{HVLB-Gv1QX< zzmRvMLOxTVi?(S+s@5D`z8K|uCPFV7^ErNT!%?fU9b7RQ)@Mw)e3Y=~mrw9+)@K6} z@}48ak}kXqo!l*nF;B%ZpD$MFFOB_RgCwSG;Wg;xVB$cJ^Hl%*Ey+0VeSy+|E7$~i z-M#}WT0eD-Hdvx!5MnW3Z8tge*S|@pciD+eFGB137zdmuG{az}K`JgzGki1MVrq+; zBuSi{6D>Qr3T@96sWx4#5LGNA$U8mv^)ItWTzW5wNa(frU*`@Iu@J3#OF&_Y{d{s+ z=8yX$ybu&?b^6*p##IL0fgY(E+vBh8BD3bRnr4mp42D~i-B)o;}i-Z$>y;=Fr3xrrMpuFSko8 zgH9&@Nvq$I=Zy1&W7@}mAdQS-p##d?!o7#;o5KoC7|&LV&<-7rD(yULC5rs5lZrC7 zTSq)YEkft{YmG1%L&%?wVf|z~+edDN^xEMrR7c@g%dxhxwz7Glpb%S`E~@Pcvut;n zkz;+d?r0%zCUdrgsFhGTMFY6I zW$eaMtyx%9KjR&BaoGxVImTv3*v0F;%WW6fhDy@e3sUZ;D1(&EC*qyOF^waGGjPu2 z33}bUcN+w0Xu~gs4=|CXi=i`dOc_BHo4SUwHWAN6CZbpkouDqOmII(wC&#m3kYI-b zK)Tne??f$9fMp8kH9r5u_V4$qW{8H+I%rd19ma)$)Gj*U;)@qif(nU2^9!b;Ly_|4 znRX?zVd%&rj5a^NAOWe@i5pD4*EjP})#t^XfsR}M4oE5JNbE;vm8f%iWtt#$uLQQs zD{dPw;*^l?M7U^D-i@+hlx57>Iz5Wb6(Dfktc+ihSe@t&dlrE_cUOD<_6{QI~ou-PUbuZ z%n6tsF)Ik+mP{oy$sk9_j8;fZJBUM?pzi37J5QAk$PN2GC{Zw}bF3oy$xPHaPwJb5 zDUKHL;073DguDq*WJ(T*1a==A|C%WkLr6|yT^AG)$wgzU(xt&U94RfL1|DyYJ+{!$ zx;IE*PNiw9gxn|?_ zVV}5!Zbsi?iB!zE6Tl%C?+yDwk?C>l2eM8F7cvZ_0tIQF_CZ|w$LmeD4CUl(#nOs# zY2p!zFeh_j$1CWnX7hm@ecPx4h=~}0N!iQ?XnW(yv^d3g&994d$Yn>i#%eFRi$$^q zxSUXUo+TQ5Gjgg^$+vg0winAr2sLKOt*93(h6S2+=WqVfjY8HeKI6=>__L~t8lp|( zpp)&StY8lHT(tRz_M8*Hx5BMG3pIRz$WxrWAbGW}*4}N1(g!E|O%4n{#Ud~=%r!n| z0vZiX!}#S)$pgB=v3^!heGR3Ru8w%61-m*`OR3&=m7AQ}VDB zl#61Q7Z*NO{2-TFs1BoZBaGDb-^Enm+Ai2B&fF>q-PdsNC3lKN-I`xN9R9CrnaXiDA`>9YBu%Fsy|$o9Btazbgp>C;QL83{S$sA@U8@ zv3l(4LX@*eQ$|ZgGTi2g4?wD&cW5aC=H%$c&3>Dr339mHKg@E50hU>nw4n$;Mp_h_ zoy)BeIP7t7@WsnUo+A<|c<*3IDsQXFJOegRji{Hbg}>ZR#a4Xu#?vi6*g&pDl)TR(yA1`p(KN7Vj1Ad%Gn?*;l2>8ih7dM8AlfMhyzQIBP1- z%`eJ8hxy8n(8P6=ebh{G$2-c^3NE?fRb;KQT7YVQf_b4fDvg&x<9LXHG)C~ zYA!Mxsy?g$TFsD(L#cD{IWUDtyEhaVn zT}^iI()be1Y$`Ar%@b@^?kJ^Hj3QTt;;eoIK2l2kY)B+hdErjrQx&}{nidEPv7)X* zt3{E$zhpGNa;s3vCPcw8LEAJK>4}0EfFe&K$~J!yHZ_(_`Pj|tCyu8Wy_Y=e z*;k{KSoxg>hJV>T7>E>%#ty&!;1`TH*5q*-o8`B|994eUs|u;j!cJ&kg%zpJIe83y zRy-NP`KHoK1@?4sqC4hcPR=m!wT#G*8 zb!KS6^m$CbaopxnNw6=e=YglF<*B#kSCWrr?U=2 zFEy&N%hlHx_g-HVwz%O-ZQG9u6LqF)p&)g7iyq+MN5&=}BnVZTj@_GT#vBQp&sQFln}@toZb&*zBl0)!u1?C zHP2kdI(28v9~NpcHt^lgPo9#C`boKMW^WzqO0@~g6jG(mrj66zj^i1nvCqm^@vy0N5j2TV0-ZE7RV$0hlr|bq$KT?x#j1frqe$=0b6yvb@(%jj50J^$3W_uv$ z4#xpiOvj0*aGeB7-@IR$uCYVx%R@^0iyDl)J6LwHgrpAYsD0!CR3#bO!Nn{u5Wlpq zz}*5fE|>@O@gsH&l67FKH5qSG0lKcYBRtV!2)EHpx%jK=d}Ud#zurj@Wp1I)pt6EP z0=^rv)W$XqR)v?gqkA?akxJFmr;zXsLDGs9iTF)KFGOo52F>@Pll@XKDdJe1(Z~=# zwlqA+?Y*$>?sDsi1I)Fr+hqE*O_tCL-+TLq%fXHEA=`N_y-8wwzavF@Z6^&wT7i-V z6es9GqYZ2~?FXyqd#T?C%MN|^f7;^KdjgSRBny8cFb=y6>6hulmIE98DZ9W%Nogdq z4Q{1zy!OM>ewq(jpE(*=hE_Zhxl5ts;dcd3>y(VDdDsa3i=V6M&$o=a9rh~RGxz|DCyrc1E7G9$mM-;!-$ zA{pnFNT@VM*1hYLwZ!43Q2yoe`75^J7W!?|Ya(K_*wJepp%9VmFn;%-^X=x5 zb?8U)#@Vd0R#kN=U&8C~DJMtRkyH?oXQy^{3s3#(-LSM3qehja%g<%@lKL~9jM3Y% z)R(HF%=AbXs71QH7dc~7URDU&XtGCZP5gzrC(Bv_)gs;0d^kdAntLvdK8@tOTI(hq z?-yJQVU@nmlCTszN;SxGvMYBlsW=K+@JqUkc6CS>Rz2t{`eciZ*0H=Fn!)k@WqmSG zF$`H#f28lLNac6u!K&nrne3>At%ly#z9}}+B!+zp( zCOzE&kfj?mqf{#?^?h!_F=^n}I26|r$wjh2=^&2j;X8UIMZ!ZS+N#W5JCQ%J>}&Gn zfWvYAkrOOUMcm(P{+R+M^A=ZVX6%*X^Epwy)2}h3YN#zQ{%~pQ+3}%~4rDAohw0QXz91e+s1tHaz zfODFVC(FCgBN*vAS|hN#pctFnSUUF=5-A?tB*GmFho+!V>LtplHT3zXx2Vyk?!stO z1`(hPiorlW*lf@S1{ul82_u^G==BK*D1n2xkERv>0c-#O`1%hy@Qt);h!c%FB)ykXR=bzTjGq03>kohTFl&1?^8q-g!A92p-x0R2#86l@CE&VaCS|REuW&z(?eOK|1d-I{j6_d24MczVm z+o)bjRN+0_nsewjHE{sqYtt^u0T|wFELyuu7x40)hCYI8E^mmDKg#$qhQuHF86D9< z!BMF{mz|Y^-RWGwv8YND1Tfozffs!0#=$?`M~6`u#ubflUXZ=lhQ=4~BDY=fVzh?- zp)thyN2j#yye7NExSUHi#Y*@O}1f&0H@pO@U zwPd6gITt2$tei{np=UnMgeRyS>zRs~ieeNo|8i5OlN4Xw2>n*?Jcm`_t^?J;9b`;t)gxfb(=kraw%oO>UBnJ?^& z0`zH;-&e#z{z0E%6dhQ{XMS(?0Kpm`eBWq-Jg=A;7~Vg#&qJkyi(ZY&#STkivls&$ z+A)MCy!GUuXX4}F^9*B-jmvKzMM6gL{f4Lyt1jif0($Ic;meB=-!oqzI-9hUz!{m2dBL~2z-Ndca$6Wgn$2md?H36-j5e{C_8^cI`stS z`&ITq+V%oue7~sC6j`sQdM7D1(ahTBEUwScVr5yP=~l z${%~IK*QhE2`$-y>;fwrRWbpwFlq}{wN`R8AEldFO8dVc9xRXv6O*mD%`SP|L$pk5 zc4235RsocWH4_ZS+yO|$kJ)cD?G;fYIKYckA8IlY^~3mBBDW7Y{*Vz6M;o20;yt0>2C+RB}? zvG*)m6fzYr6Je0sdKuz7((p;P!07+e)I8D5)ibdLapbQ#(ShT-1y%E!!0bP@xSy2v{N<*TqK1FU0K!qlA|z6Ciio=@KP=if zt{8+ch?mN(vgwzzq*duxQKz9w3GQQrBPOrsT@?lxc+>kUDRr|-6HvmA=@|OCQ}Iy= zP-cd?x0!f5m!zRn=v3!6bd(onyd)vny$BO{Y!2EQK?u7O*Z!fj?PM_*k#fWJ35%@H zFD8ccsfJtDISu!XCOL|7eixRQRI{;!gY1ilZRSwxQ+LyEgnoOiQ# zF#u3|4fyXBT6iM#jHAYk;;st1x_ab8vAxX-kF$bdq=IE!dW(Z0w95eJ)xxZ^i(R&yt}w| zM;x!j{>-lZk37<~zgY{%qFVZarvvidg4gmb!@N)DG$uGCfqpu^E$}N>nhaA>#I^VI zGhm1~R?qDv@pF5W$JWx~p5dbwWDT!KhW@{wf}}r)^9&A_xrB^T2~lV0)jJy{^t>^n zx!-ZOkssS17wM)JeWT+FgK9IE#UOXr<220s>5ZD!v3TBPy? zUo@=-4&Ybktz44A9Cmu&zPx|B?qnuj2^}NO6a3OoJ;zEP&j5LMr$t{a1AoWsOj74X z5q$$G-`uRxbe-eh9>;PX(Pr~Qs#AQEhZS%o`!aVb?H!tICFZ7yfcyeU;H*N$XIFWL zl9ati<~32ui>zz5fl6fL-vrTb`Gec#KanJmNX+>wprzZ*6qE<{AQ_y-j>r@-_7zOp zmQ4>6PjA?U2({=3r9D3}ME2_?qew4F9m2*_PvZDR5IWmtqa8r02dh-u$#$d}ywebDZ;F;yn08hJ3D3m`aq}V*@sOpr z&T~Q3OQ#U`I_>peSobkEm~0*)6;5T$1C(JMnyCanz%^o8P9CBD>h|Aup2;010-=FT zb`^;trF=b_*PV;w5YIas42gT-H9c}0&U?$mF^bC~~_a73_bf+>tcGzQPO z`+I8mUM?I(vKfNqZE-FeR}NxyWV}{VWr8J95xUK^6zR;vu|-y z8syd(oQKLbA2TTBnPXa(H$bT=#$_wguHTdx5~)aM7f+0feOC%_TCmM2*roKphYW`) zL1W|L`@yl9C=gpU!h#rBdF0Wjq zi;nEgY{TkHDeH9RZPFlHe-kf&Rz&ZN17~n(4W&Kg_6lbpgY$GDgQ8NTb>c_i;i0EC`? z`tT9`1!tqxz+QQ*aNV-QRF7(ha}KWp5cbDZ8i}61TF6Uv8d{T)vvX|}vDM;BPS{JH zA}G0TQ_FF2F$ZX(TY{hC*Wk?VN9fj`9J&LQ=my=ys`(uFN!rYkRQMTO>M;<>&W3gr z6vh>4D|xlVHX628{6x)8aE5;&K8*AudSbESouX|t)XfnUG;>Jl&-^NK2i6PGD^nzw z<_%U+DSv&%1jvHPK2%2C81>@_(P!v&~da?=44olSDWtJY~?V2D}Z+U zS&g~x&iTkbd=o0PmN$4l%!zSy$BdO#`z8fZ$#s6UhTC*n%TF3U%{Z2lY+f)2;@Y>d z)033H--oz0rtkU5^cJN04P+VmX7;a_LZ)vZ{@eGeZeN@&GKS8lN?b~8vvbZ@&jgEd zzL1UN(Uc>%8;X{*!9DdF3{qX;>t#B$>v!_76jf(x{?f@m@3Y-RXfOcxJoOa?RKFQJ z`(TFNY=MpoPLi9FSTuf8a*YrsRv2gO9l=Fn{S5^`UCK1?DO|X{Si!GtL4{@eL&NxW z-m&R~Zqt>P<4cqel8d&d7f%m{)w)~jEN5hue8;!i`HsV6Y>r}# zrB`a(X$;Ha6Rt+r0j#9KV*S4U1SywqLEId*{7YrqXU`FhrM-YZ=_IJzGkKaayMlzm`i(}#` z&)Y?EOCNRe!6@rk?VMHR<$-yZ*||KsMz^~D-&=l8b-@sk>H~T% zhrfL4x=erQSZMs`)QE!Z7&clyB=w?X94Jt<65ns=(;kEL$KYwz%@jdXDV%vYK3n7JQtk}mF zUxLeWb44UJ9$%TBU%QRXdiYqkeD$^C2uUq%N5)tysk^#kZx=n|E5UKM@C`$-`&!}B|J%i+{Asl7aU44@FDO_`x3Zk8IPOjpA z$o5XY9&8!npTsTKY?Xhqnt$xfv*zDp$Pbgdu9KWDI_N(-x0Gr4(aSeV0($ns=*Q5I za4%&{VnXE{^{;?WN62)y!F}F-ZBZ}o7}HnYl3R~l_>L&S;^Dl?sxx&*4{X(_ zRw)jtesNyTp{_P=x#?d{l8{(y%kw{mlaH$MvQ?dQ*j|-)-RpHmmTBpGut#nUm*#}r zf7-sQMr6^c@(Jl~y8a3!u5zfNh$QpmL8!r@{dXz%&KwfG)EUlVKH7=Nl1a%!gzD_5 zOA#w;=?WSnW;>{miVo$}N^QS>K5~vQq~-0;@_IVv_x+zC{DsZgI^I@~0k4Mobm^;< zydEvIS4>G|h1K?xVJC~$(-1pU+=(nJLZs zDZ1ln^=_&`?oR&;vXN}Rsy_ig2hsDBSr5G@%;y^vP>ZfJUiV*LL=qaX z|2**9owrZ^eyIH4JoM+|ee-&FZHtJh*s)Wi|Mi|->V#S&3b3$o*1~XZzfW}Czs#Si z9rKLk+}c0=@;7HgWCwK`Go0lElz5M=oW2F^sD4L^ofu)hYJ;6~-5*?*&fh=Wc%yIf zUMk~Swgpj4ad>KU_hGf;m7_Jra*3U(tD0?gvlrD*f!pfREXQ1a2Xst7W;9lsH{5<% z?10#PD%M*@Yh2~%;5Mg&(xbAG-f_(Xy1y4Ml>61nm(Q=sO}S zsoR{bEozH6_1EIF>}e+Ui9Au?2uwX+mexi+-y)<*JZ_(a`BxVjYSHFtv#5Q;H>}X` zs?p^0BOg4IgpQ&1ACHZ2Ds}O6KahYooA@3#l(2?*Ztjsje1&!7%t7Y$82(|2-nSjQ z@7oG2(juVW-XK0etsL|1D^6uw5K?~Av}%-37d&syRXf>o3%AkZH1@8jX&3G4_zMK- zEW&b^b>#`jfTeYJ-U6#hmQJYqqdREk8$H(4c0$EDCY0gjx&0C{Z?~#S+3MMpg)3GE z+iu#-Sw7wKPj4nMuCyQ#ulPjIVz2I{ir%Rzmx(3>Lr(E(M)+SnnjuDO!M~zU$4v>R zP3-sVBGX1a`wpx9$th*m-MKHGx+kCMfu&zGXYX@L`S?N_dud`vW1hXoYv)M^`EGn{ zGw-q((cyY*oY~yL#k2?gQ_g}8+}w=`>A1FIoja~KnzQE?Orh?xXWqBHR+K}8;Bi_F z^**26(tD!j0!crlMl^FNmy*wAPRSm6eWu5AzV+4+Tb3B`IjzEkiG5IeL99DK>!hQ^ zOs~Sdus>m+IWwg1k!2z#fAj0SrHf;p>>n`HGXxvQhm{^&@D98eWV*UW+S8-)_>D(g z+vO9&)OL;|Vh+h9^V#`M=h#xODIA5$z@+b+rSg+e*A}bPF`O`xD?GAXq>&!Fr z%h39t1>3+s^1UNpts4aZ;wph`>o}_r70f{2Ad_5PLIg-MJhA3f{ybJv?Fe7ZhiO? zs&hngHF5akY`it~_r;)xPO_hdX4->xUf_Q>vDukG_@cj3=v%c{qgU$#dih2tV(?xq`+qtB_VGxh!w0p9{6&gh-YjD(vPp2CNAWtg=P)givCC9Cqo zvj2sc$36_)=eqFgbr`fQBR=Kx%y?6PQ*A}UOJyfG<$CxbK0c&!Kkk*Z^ht(#3-dPHUe*O*f9jW{1 zWXZj)pcw3a=ep&en|J0QUVDkM1I7mxu6Q(F+@|Pv+P?3n%GKD(9*o_gYkCs_kA(h{ z6{EuQ{^cpz_!!@5oRt^ws-kHu9z&5&L2`tY??1>;2wqluvne?&E%c8GOL? z%?->gkJ7ZQg1Hz~@pZ@6*~urO*N66p{w;TF*JMG(U*Eb=bSiBE7SZ59d*}zb_L~04 zxAJM1CE}>~yqvC3!|nr@cfNjCjU#47A&t&!U{1K|Uvo$l4LC(_ORlfZ-Ra<9>tlO* zVfPt5XLiZ8mkqtiBkDDa9}OFvzBPEob){6j+_0A~_0om*oL^i{me14b%xH1dz20|U zEBcYOU8X7Le($3mFP6cCGsaiO`%L)-b(cbw!572_?i*ajbsJddfS<#q(4!BB<39eb zao@9l;7{G@hL)Nd?bU$M$WyDDqJs}f(WUVQN!l8)JG?#5<55kqrQR>Ms(O-*K0K4^ z-b)}E5(m{>a9&V^59%|Ml zX;wD|kucMhUv@HSH<~oloRfCKLk=`o>^zjZ7h_6+dWlVfJ?bWiQ7We#j&&`Jk38Oc z>}rE+nR{&Sc6OTg37aj)C6N2xCx;wV$Z~aYua~;Q`emU5eSMYlEEe|kqwfe$EnjY_ ze>oL_h1#1p$q$SuTZnb{gs zf63J0Yd`mV96Ss9qud_D!#|!$%sRbk^wR#kueZ+VeqT=h*-53OqlO~~%aNtCI{1h0 zp%)LepNxR{BP}z0cKBy}8ejYL>ksk+Nz~LlD*RM_{rrlSnK4f9xl@34gofuo)_k$J z`sB6Yn@ty+61z*c$1cQ)E~Qi&M%%oPVx*(T9fjRxmTU|j8^mPS?-$ca^|7RBDP&V; zJgPNj*bn}jl&Z}3h;B$xOpkCKmW#PoO>rpNTd<89dREa;x?&G^=}BR>)h~F&uG^S*;M&@%1;@6W?=X5I{J}f6ZaLxBGo?76f%R>i znm~~~yM2dcf}l@bTtZ)#;X~RbPiry2mQgw;@V|%tzH{Rr46T&t#+i+ccis|yX|Z#h zsQ2lVzlMXFFmvH;sp9){fhCpshpLY-7zNp|$Bo6Q?Zz$&2_7LCH$2{0*c#*BiLP3x zmOZ?0bFK7l_=?5rPa4W^oi1JJ?;e!+eL@*$7#rQ?Y~Ud_dCNscV(2o7boBrS(VfmJOdFr zKHqahVygj*`70_rD6i2yJ+7eidav5?XU>Wu$8W!i6U%@FA_4`wmp=SQhb!!bj&J+e z`>#v`dLMVuDR6>8JmNa`>o4JZ6tW27*g_#*UYUbg7N(yf=R()OxxrqxT2 zGtbspkMi85A9;I;?i2rGe|e|!qTA2Qxb2PKJ$oaAZ_e;M29qv*Sbuy&xI(B+)NRL( zv-ed5AL;ZxBtmu5C7!#$3!h_wm@0*Hu8G>hKn7xtO@tqm%PC44ef446@C~w3T-EUSqe`9-7 zf$xE#1Gy%Z$6D0o7E|)}UUH7QdPwTw{h-6ek7FzI;m1{OjaSoTj}o$;j|7XI`0f9G z`b3Ln9X)Fx&_~wgTl>_HGgopZoT9X$uJ8yOQZv^kH<@k$JArup_%li|BsaYdnXI_Rh8Jfg-JrR-k|bp@6N9E!-nU{knx7-UY`-`&i>GO>m_4T z!=6qZ`5Ww3kt6Dsj}~tf9shmhT0)PchGE->_^b!h(h;a577;s|(kNLbyIypj-!;-F zTD<*_u41#Z&X)30;_7I*wv?mVevxmU*`3#@i~F%!CH6O{v|)hz>uo zE~qVYo|1}3YlMeSytTUI#5n`*@O@7xZMl5ft}t$OVdg+$SMic@keesOR&??rF)zxF+OyN3(wa^+WRs zVxoUd+#kA>hlZ#)sEy7|uEsU(F3FR7Xlab`SR1-AV;9wZx4hlr74gAocTC)Q83@?( z!u#PsC9@(l*$Gcu%D?5#aW8!`3)`i#81SsDKer(?s`lZ-Q$G$`z3S%#NH3vH5`#Lu z41e9%yz=tX6VwmS{$6<>Z3TCSZo5|wu(KDt9eHd1XGMSAACj|X^#1IB_In$~@<-k& zc~SI;T~0*Y+mgjM?n8=t4DKw{=LTHJ4Qfl4N*tZN|FfyFlh({HJ|Rkf(@ffaspW9{ z;J%;Y!iP9*FY?x%h_g%L8ISQ%EZ#F$m-2m?ovC6EZO%at?%=q#z(e1cjW4-6j=%4E zV`8ufsS~XfK7GF90QJ!ftkgsQQPin2xfFZ>8mJAZtMKVeyHSw@mHW;)7t$<7JG*1e zcq6PctBiJ1aVRla4(+tuLRnRp{)|TaF)j8fVzgeBJXbmd3M6n zk0)%u{--oO^LbGiH$tc9v4d+nTiLlXv9f>G^T&UOtrb4fuBn}e>pig!-Z^wShVCYU znOWM&%x~1zC8}vgL7lfc$lafU8M?0@+CHAXRg#~wmBiC|R>QI$_(Ql*(#4uKpbfb? zx}^Cj@y4UIq0F<+R7HQ;(Y0NZ)39Bv;;#Grvc7%VU0Gdubw9QD?1W3JMlj4??rSXX zX;_e2bkdR>l~YuDX=M9#OzO+c<>QVeFf-pHxSLbgp&EN8rIYubZj&67y8LW+_{Qb? z&3Dgg?U;7roTyAAHRxC0>*|Sn&v|)ftSj8>#*XQ8vi_|feVkr2-bW_k%rLFa`{JS+ z&Pvwby!dL-_i2S2l_NE=Z5K*0M|a5oNB;L&pOK~NfO`t|!%)JX zT$j>$IuezB<2haGgafOlEU+Rwpl!wGpi3e_<=akUw_EknM=iPB^@FT-xpMz;hv;ujrd#7iP6xxLeMUJWp zmFo$G2@#e`t_#G(MW@`>cKWP}F@tvQ^=9@@E1FOO>*8!Mkaz$1I4 zs=BM7KZmbfm_Au>f_s8yH{cr>^+?Q2b0-(Gq`my`$($#m4b%t|^|L2Vu7rrLU5=6z;nj78d@;bXQ8su}eb-&Y8W-H5KfwBiv2b z4m)7sh8mkPDlWgIDWT~gjasScPAU`lEJ^rtxmP};{1Ar)+yKz-pP`KFSijCV&Hgg<>WW11cG^f6EYd;CTWmtcG zukyJ+LBB+LlY&*mY<&Woi@Z-<%8|Xs-Lk(jWt`ts@hv9x9Pj%$->zljJDCvZv5?rP z-hGLze(Il5Wz+?()}fXyy8~7p-aGB8p0C6E&$BgBsZz0a3)m4QoN&nK0y)>@Eez@pt1`>lXneg>IGq%PBDxw#hOZDQFLf}K5! z>ji4f%JW87lNOG+2pMmL)tbC*TXYX-73)#}iYRJ5_h*!uf$O=nd)e(*59^JLTTh?1 zd|+bCO^A7+<{d2l(FT?vcsXY_wwGlfWGplr^#0J5lj`Q3v_qCx{S-SESv|rx_ntjc z9GSICh-c9yTV^indR~8Vx8;1_YbL8S-1+=@_)W^irlLszA?kHwyl_t!}ZA_58l1!UG4o9{IHn(>DFw1_YhwxVs&jztVc^tth+yD zi_5utRt+Lj1}7)aoaHSNPr!c_H^gI!`G2mrzRi3Vefo=JP?%5>W$P~w#S)r%c)tGM z5^~!tb^Cz|-&HNgfxoicM{=-JjgI6awLiB0sM>mP(Bjw%!9?`+^2G^w-NSg{*wW*K zUx!t*&VPAmsd6S}%5LAKfC1$q ziXP!cyA|DPDetsci*oZ>n3H^=w*7R_<5lT3)c#*z(RU&@mepl1*}18{$5ise6NHJ~1|e~*_x@`;(1gQ^>rSZ)hD_3yy7$29dhE6V%$ zmxW@gczI&{%k{69O;h4!U+E#C*JqXe9nIP;E;&Y^)ArTA zkN@W{8g3hou88RGDb0$vxaiSH$cunlw!8X!Z1=fOqAb=p&&PvjP5#pIlU4?L-Fdlg)N{7k~WK2%Bj9I5z&E{J`_U z81%VpAHCzV@3;3f5h@~T{a0t-Z#xx-4vS#+`8=E%C#u2 z?L$f;M`O`d+MIUYy2|0vH)y#P#<}C(Q{<}f^AYHvF-qojYz)eK8_kQyQ$>!pOm*?r zp?j$<1T^@O>trg03=yVDvuk!h6z|i+dFx7hO;;GsJVZoi0-aiP*eD8}FiDYQU-+ej zo+4YlV4p#HwGiCi^V9`M@t;dt96dgP>lcwN8bo2#|+<+N>~a*flYo zxEV5TEA1|CI1Y_D#i`=02OVB+B9K{PC-b6atLKj8^=Ey%!wZ#5?hTPfUL5D_G4Pccv^}4DZa?;;_Ef1~^xu2UERDo6C(Fn+*=C$l zY>EC{b?VBFJyLk-EZy9E5ty+I{gfX6`HG5&aTX3?))2Wu*kz1Oi}C^8_!o zr_u#aUM;L|ZBA5VyP3l>vuzdD^JZaJWavw{{RWmYbe_r%T(b65G?lSIU7 zPt{p{RGUK=*dp)W*NlcFXit%>QdcZQjF*3Zz^|2ph2{}bSAzCO)i2#?f*lhLnSA0` z!$*OWmQuRz!juqG>aAt=s&j_dL2%TR`7c}FOfQ_pf)nT1ECfM1Wc=ri-P63_>7yl~&9#KHdITj0ADJN1B zyx#FVkBf3-j93@O|4_*OHJHamJ z4hf`}CaGl|ECm7WW*IjpN}!yJxeC8s3Lb<|(vExQq(0@_QI98HTh}k;7e*_U!miClB4q~$*Jf!H{ z;TI3Sd)j?hJt)4DqYp6hjn*z=jJ&vj3I{Ms$VH-V$dqwE{H4ZpgEMkI{Po@p1M2wN zx^r`)zTn6j9QdmR_puNeNr!5>qQWc-$T^1lO$J+VNnF7R=MG&1)inWF0d)~_!!TWs zoz0NKdtX>T(=Cu~PGoo+#Vz3A*xZH_n7?zmf}_p5;1gO_lU&sD?pFHWG|Ndk@|1H& z6>9p-vH)NXyT0(nX9ERr^<_DYVOV*&7h7Vsc5x2(0kNl9Pr^JDgqhT&W6u zHi5K$H$q8KVL#6le9G_`4YKLOnj}5}jj%wpJx1p9LOdiqL99Lrt)bp)PaU0-xg}uj zi>m)&kU$ck_C@h#O**N&pDrYN3;r4u3km_E7S`iLl}Uy(4$-Pr2f zkzjCg&M?|TlKw*Fia;4yy0NFpCBlv`(d4Zx8ZvM55^_<7E^oC53o_$EImM6LuC!_`4v@=Q4rM7b&Xs-P|7LCE9yF)LugVfn9UfIK6*hll{6Nzv%;%Ac46 zc!`X2=%s96$3IG!8)`+oIq{#bIkhlCDM2HRjXNsJIT$Bd7S_RfyrCvytPnPes7%n^ z8^ychY(#382RURmQy#XN$wK~(M%@}GQrq7!h(^$>GV~kDB7(in9df^X`7RMkLH7u5 z>lZ$lbyW3iT`vIc^b0m3S)~JpsQgXgPlDVqZC7rHo)xBtL$U}=otXKVj)IM+l)`l) z@}8v0VAmdLZ7je?>ldvtZf&GCKIY)FkYNkJk$HOtvB-i2E?19pP*2d7G*MFEx?f-g zTr~1pIqlqgqyNsa*M}noDJK8aJjm%XfaH704F8~nqmmLB{ z5Pn3?SnfC5EQV&2{w`yq70nBRx?RS|RVQDp@Gj#lRPq>kUld~e#%Ek^zAbb$YljDF z0hq}N-!sS;-yg-3kuSl4bT(jS@9=;@K&+W>!6ADJvJPuuJ-3nuKw@F?g_r>v&K==s zU_pQyFh%ebyu$*ZUoq~an%@ygO!IDY;*|lKvBNb6jN6@i`Ob}bF+FZkH?WqN9RpP?rz2?L;MTd^bbc|#aZ&2cj zKpK!5uj6vDKnM2CR@3l!@LA^$VPt9I`j?GOhwm{L0LMdUiZ5{>9V6R!5Ngay5eq&S z$N>9_eQb$c#`kasHYA|Aw#X@)Jwzn`h4z#X4%WeBkN|#Jy<68+>#vvA-^%P}mV@HZ zKKFbB5urV0x_*quPct7Gy*$l(bdrFLnd3@l6&FJm{O7DhjPot83=M$7z^UmY@{yp{ z9@M*!(y}kI&D!`3UNHe!|BmkF)3lvCSXlesI(S6}Jh6Ck$saT?Z(92KEB=-32F|Mi z34JfPVNxI<`s>8eQ4^5PZ;_TDefF`~pRao0aNF}sOjVBYlg_?r5zi=nMZ=32d!cJy z;o*Ry)zUO4R=tmkhVaX-&TCIo1$(3FR~?&N-)!eZF{Ei6*8ZsP`^^Q$X78rNl$#^~ zLVmOXeALe?zjR+XfN$4w%r&|=$LcpH8u*kBYaw20H!s&;?`8oe`qzEcKmqbP_P{_b z-M(g2Ha4~Soa0e074S?`gD)1dH)>g_NMIGQ?_TY_Rf^;1^Bzyp5tLm=J$!6_E$jw3 zL+{_%jE>LEm3`nD)@vVG0s$(-7jN62OO#=;H`CMJeRBZKvz~f5a9j~>0D#7EK_ChI z^`HIEC715JH`6f^S`$nkC6G=%FPNu*R^qX=9;^$_1Lp60!K4WRu@dI7kHkVrwpEZB zp*8$gEt~(&2_|C(M`3_c8vGka$$;xTVU9mHmM8!R5*B>LBe6d!VOnz=%hPXK;yuqB zXGu8bpI_{OEZZoCZ*qQf5X%p>Cer*Tb0bw}5UW^w-NWUv?c!ur#J<2+;#k<1%P$PB z=<-V_g#hg<%R1*F(I5#Y30DMafGYIV*+7U$C?4DhNmEOe7!KXZA}BW}dUJ*j4MV(D zV(Ul!ZHFcmK_R?BJ|DimkN{YIHa&?i1h6VVC-E_wY3{^}fxF_Z+Xysld6KioC0&0fF)n50oa zBiO5xIG{5WiZ=CwY1aAhB`eQc>RQNo(MlZeV5=*w!<75aZI%lpoU^Ci{RD52m*?e6 z+A*8K!FAt<^T?ZV?ET=8;D)*oMR}g5${p5k%BNhQ!L?# zedkboyI$yK>2I<_@coMKsC(N5AEXG5G$%$MG-tbu7(+v5>^unGz~&yJTd5%uln^2O z4ip-Qpgn{K>pa8WoO*SxFOKT~e%z$+K(wcwGNld>zrIZ;XB3ndNm&#S@f_(_{7K+6 z+UN2?s8vYbgOHXO!UMQG2#mIT2?5A7Y21{0CBZ@DsFrcinjaESnR8I@R(M$VzcX9hKG1%;@{SkRC7tDx`yl?%{#xCidv-b94%#>^IYA^8(<*P?X!&>$PF2Kwki0XF9Epr7;cTh z=G7d1fNy{7_;OWuuZg{G1Kp!iAQX{Z$IG>w@HV}|vZRNTKl3);Y5Pk%g`Fc2{7j|r z!m@7VhBzR-g@er5KwwZ7jnezp&p3Bjdx{8vHf%q$+2TpCy6-_gGcx<{sFN#U6EJYa zY+ZC0a|6`zFGkPKkys?a#@z6vQP3Si5LYHpKxmml5a&qbWFYL2cbcV_@2Nxhv~nVL zU~d#+G5IAB;aM9YP0=7@)^Uk2m7AE5Ypx*rO^`jsV!+zqV z_QtbsrtiWDfB*L_7fiDeb#IK9{o4d zIl|jP2?$yFGzI~NuFGx50j^UaA7fKN)p?eaE1&{D!0RHkaxaHF>K_}|0vx8Qcax6+ zv7FUc=5+zY&=s1hK*zAM4lDubPA^T+80QKw?s*=|p^=*C;)xQHk>(sIeFg%_q|q;+ zj((y6O|^`;yow$H?IiE-{>tdxAR0&?5t1=zQ?8%C*`i4YH&GRS+uxG~{<>6=bKc!=xe* zSWA_8i;91dt@Q5o)H2iwP4D4;P*y)~xSdlW%|rz`bP zA)joKF>TTy2U4Tcelc9{C!yJI$BaQb8DifpO)h}?AL7`}vH(2Dw`szQpG>8)ZOjD$ zz?}s&(4}heYi2h)^aZpnFfR<4w-KsJYWIU;Y>^S-gY6cZ+8dQx7Iqz&bO!h$Cqil9 z@9D|}DoCYo-iH!wzy^DX?XzPnMR2lZSR2z90Fs0*zb>z`;Q%nqt#|E3gJV|>@qTl8bH6G}OmQcyO@4-0_ zIO8g*1>~N!MZg9xP|`fG?I)GpdKwGks5*B<3yfF%1UE|!YF8aA(*}6i@4Eik;2EES zfRa+udxqU?tiALS(PZG@+%{=Pj4ibO`l>F#!$t_@7aJs}abdSB{K7RE`ceNzC=yU! z_nyrcmJ$x&t@^gY?M!8SHG(w%2RD`3=Z1(3?WvRsFo=lEXY z-mVnkI2i;$L{sP_!1e?98;J##B_xU&g{No5RaR%I)Kl!K86qiGsE5&+^3RJj`~XmYwERpAoA-O8H{Qa2i}}G zpt)}Y_ya-OZ%+MObuv})U-0H&C-n_q7{oht84Ml3kO6`J#u!xC`E|b%_-7En z%st&M@M=)Mn})$LC?LHe?_MAiHZMOCLa$%&d^7!J_IX1+7|@aW(d|rMK!$}-AB6o@M01T9L4U}m(pr$-!H_K#ia+(e_05o|6s`v|h za8fAZV+1Y*%;y-&JipD!gKam5vk!2Zv<8Kn#Sm|$i^Uw{wSp9b9ivHLjZ5o!qD^Q} z`zH^5764IQg$4>|9Y_$WJ=SrCRBv5s5X|>2rUHHd1iZEZ=8rZ-w%uzRpfkGr8^Ac4t+mo17^uyrdhX%|8H_L_H?I!?ok&aiRA}l*t}S-K z6Yt93;hftrE$J)Z27iHaWI#tSR>@y-M!FOp zk2<-=@@-BG;@_F40Bu8o9A9JDfde_kj1yd3N}7Y1ey z(<>ZDr~rt|qBJyN`Ye@jfHKX+T>IY$C)xiKFCXwt$s9rxM*vxgVsIRhpo-MbpQZS5 zy7a%>D&z=FSAjHYB@rleebD-~xpz}&tDb=IxGtT7(iY#PXxRxW(pVHXdA5b$MEm56=Jl_V+0EEpV@8!+IN*PXMf$?2qm2icpTsx&4^vp>%XSLvu;|DV z`7O`rx{PxU$z~;ZqY9OM-h=+y#k5i`|u57G@v4hqWf^erB@F)K6>{t zK)7Q$d({3iI+6Jzlfwx{dNCM5AMom6&~&K6k=T*~m<9X0gqnEWas|N!uCXbxj{;5@ zz9dsy#j~GZ2mgbi$gB8E-GuK3`lTR7dtwH{MG^Jow2SiB1k^A29}4mx<@=r6{nPYd-yS-TlDx;u#}hYoK1jflM99~DOrYm=7G-%S#J{F7TxGD8nf-bM2>%#D zgY?Uk<0p+xm8uGAhwp&l^#Qr(6=2-%=>7ort2k!>8I5C8mC_@m!NbYo?7?TnTbxJQ};KJ)wiapxPsdDMuYc zvd{~hKxmDc)$kH9WH(QfUH0W&-I~PDG{aDV0YvfmIKJ4(fY7D;GtDXZN*0D9%r2ua z-e%ocUP09PU(dpjfq&a$2@De1j$P))c#CALxTc}sQt<&=7o~fPEWZgOi@drgo)I zRpNwT%%6TEwA3;DvJo-GTL`;YU~SJK>^Z$mN5IE8UK^T0A=u2I7bLP0yG%#(=`^MN zD!WWg(~ob+E|Yd5|01M`vC9Ua)cAoZFG7`t_p^1#E*LYnQJ{}qtkJDrqc*2yKC@PX z!0t`pyQ|An&{{NxAz1-$%ITGYF++`hr6sSpT4fG^6FIE7QbtMO!8E(flyM6i%nHV4 z`oh3xhbHj~8;{j+4gVDYl%&CL&z^>6; zrNz5hYX$(FCU#h~V%0dlTlOuLDiA{ur-iH6+{qLUv$>HPp#|UA>a`ILEYSO@qy1 zmY!!g%VAE~I3d;zXPFgi!36z`jT_AaWxuSP5Z*0m4Ues{x~bEIv32HvCHe+{T-Xwm z{3x43!fzAYL=YWbt`Pvt=nh{9;LY~-gKX~i#x$o+Q|@0x2V)8Avjc171TZvyG%UU~ zEmI0MHXt~OAmZ6y`2?dWPM}@OHV7HOaHQ&MqZUjv&YtU326%D)#TbygIbRzS+QR{T zg)OFH+S269dpP7t{3!S83$&n1VGRK{_sAwIE^mA-bZ3cV1)UBZ5qza+S-jF(WeJo3 zD*7tR%;{@x!Rm&IBr)Zu%@}H6g^uYztE~8V9Z8EM*}yISFrMqxB;4LLY#&#P8tM5siuSQ zWwq5&@zH^h7+Gl!K{84+u;#A$^cjBLE>yGf)zR9*H$1LpW11mr^a#!XGl_??-|3G^ z#Eev0TOPIaz)||L6zgaMZR~|KfNi)_ENrxsUB>WwO`8mWU>BQfyy{m^VHZyY)hy|t zX$ZK}SP;lF`h_Zfhud&z+KpW5Bs-Z_q0VxxLMVXT!jCZ3Xs!hN@l;f}7JOcZdQOOFzAIw-tMRDuPDVBkpRL;wC%B}Z%Xm#~ti!|x#X;fGf@q+aTGYvbo z_^lBg1F2JR9rHWIPu8k-71Hv@Lz-;t%8n1v*Au3cz3g~by+Zi=t2_~5gu3lGkJk>B z%SVEE)@kSAzs^vs947iT#QM=yKQ#))Q*q@#iPn3mzPw>+L&2aQ`-C8B0$=>m9#0UI zLst=Xi@sl|IRMYlIbIwn-oFD$D(V64SqlH*w!rWvBa5ku&$a4KuUNIDWuC^Q>L#yY z07{oGRS7~YMzHtjHE*X06Yj*{kzVUoG*=tLseY@_&VQan(Qf(gWCa*L-^dY9p!gz) zF$zHo=y)x7b8-cbd0H4?T4jV=xZ>JwFx_tjo8bgf8npoSxT;nBU<7dlT`*mh=Dy;p zg{Vm-L$jbW^S3i*>Ek)B#ot40YI#pVdBw=#>Ql+codD2nrb}+8v5WOm;M|Nq_$==r z6ebm7gjjH`!nlIN3mS%rsy6yK9c+KmSPnBl6kxCd92)?t-7VN(Iz|NzTds6EIlSFf%UpLS{zw$Y)x5o(yX3vLyUJrKz$;|& znw!dRU*zaDH}A~pcrq%loC2frChzIhE$$@1cMCqIbZ4Q$N&L=~?&9j#291J8dFAWA zBNhJ%CTtvuD#~?qNGztTt5&JsI{`h0@6ME8pg6P@W_i1H#jTM{Rk4e7eWx&$NqljA zdl7C6xr!RVCk-j+&y?BP~YZg5ya%tH*1X2{-=a0c##jDG=|qiYV|_|3NN+b-1csClvZ76I7502 zAJ6%{M3qMnGXa~p^FC5YliN_**u_IlTo=F=f+PLj5)|yr{Am_c8VzpEQXh}D#f8;_ z7#~oaMlB5(lA$f_XjrTkd?KL~$wvbm)th9XcQB<*TB+`{ePwj{C{4= zJ3Do{?2s-MurkkRENrADSR2hLxiUT`+5c%G63+!yqtk1 z++~-+8>W~7G3??zV3-hZcsH_-vknN9lkb27%+kynrsKfV^%{nB{St@yL&IxhV8xa7 z=I1&d2iT&-q#kGB9!DWbot@l3%mY8$WH=!A0xWK)pkHXgA8iB+LLX{k7kxTuNFyAO zCMIPhvIM)VFlmJ8L(MysI35aQZaTdf z1S-9Couj`U7I>Kv%)*Kwh(eqbFe(r$DGBrnSs?g62kXLEhJ-3zrtkDZloos>l7>Vo zY-Gi3Tr;xSPsNY=F-?a4iLo&al*QLS*Us^#Dl~Nu=Juc`sSW)M*4gFdV2Gd%R9XM3 z7{Xallt&e*6nvli2sS@w(%1uc)d+u3-G5pwn9NuzYxP>c1r%eJ4?mJx=b6?}xc+-} zfNg(IUR@vx3+ylVLWxy>eQUV9qpDsCyZAmWb5lPKPJ3-g0;&z|;@FJgp^SU=sIb)) z;pIV*Z_@1ozR;J})$4?HSpi$Z5H+&qUAI91%kzjMkv9OD;U?*mcM-%rkZ1TR5I(_M zJnrDaaB1ajtuEG~Sd44Txz_ao$Yg&AwjnT?L4j0tHQV#T_xlVGehBZTyEI zT31%{hUH+D($*vbK}4~}MT`4q1pPh^O_VdA2oRiEpHqGb${kBvt7CZ0z!&p4I#tyK+>l> zfG)lVT^&Yv9TU7`Q9uP1X}V|#iPZd=mbnt>8H8+2lV>=4LLdu8EJWRUyO#hyj?b#= zDMA4{iy&m8z{S@b+}9}-cz>Ov*^?^*JPpz^P`36VfX4{ne#!E-dhFQlBpAnQb`?)9 zdynB2h`I5K=)M&&7YyK0Vg?ZNoIqEdDn6(O6iPphF)f53nn!kH!Vi`u>kZHtdF?xG zDsLggKOrW6WVlLYj?jvm(i-y1Ndh3+RGl(llRAW|x*(qg${4pw>^lDBU3A!i`Ist&y7E{jtsvgD?o34k%{urJ8RhvRkddFIc)2y66)^dv-Gy%|r zcn85u;76NHIg;x&6w*J_zcj`dK-#Wub=?1AF=2UsO9H#c+N@Cu8aA(lCD%w8?${N7s8m zHIapX!zv;oC95dCtgFHbN|6@&t|+K96)8#w5u`@xEfHxdZCylqSd8?Np!5<#BCymL zT9B3mga82&N+=0Q-r4s%=l%ZYd(U^yO!7R>+_{;Vd++o7eotoR&L7?_Fe1U{=4(k( zZs9@5HYodG@L74!f+9RZf^EX*HdqC!p*3g9YHWyFyoFsfg_2;=Oj%en34XBF{&MeiBqWb$IHVy{yTsjseItHJ2a0ZY0RVkuy$u>;z;MDh zhtO+inI=GwH`>11%wq!^4Jx0%Cc)=flS|l7Wep=mpTmu#5xd<9BKX2&ZpqJR&KIix%H{fPNYbR8@Vgn}}3EPhO`YScR{U z-eUU}5IP=UO$VE2yP$aB#9qG_+=O04f3%YPWs8ashtUrQt1?3SWSE`RPC*$|BQs7N zhWO=kebC_|;Pg&%3joL@OFy~}I1rn#zCmvH&c=IK$Y2bBHti`N6*AOj4CW50T=HS~ z(rO)AcVW;qyv&K4IN6txw|=z0+K20r{2I5V4~Jc&1v6wn9$`KzTwlw2 zi0cVwog~V$$pE4oVICbBoptj@{wf(=JX{2Lqd;dP6PSa)Uig3;?QrYec-lcY_9{@y zFIBBQ__onL`%fT~gMUeLOI9;j3ZSZu?@iIvs;K+r)mz^CowaZhtheV@Y)rp%GxRKa zy)mMNLkH0OViEJ`pzxJi%%I8KHh}Vx1#bAv|G12+P!SIx3Er9dU4PcT2@Z}L-v|zl z{ee&jVH*JWF%9De>_qSi;y3_kB>EG)Sb?<2-b)1z$X7vTYvXb32aq|y`X4{Rce(-O z^Ecyxlx%=JI}mq_FLSN5>@jfW6C)E7AXR`|M#O>vn$Hh^?HG->QDV_@L+KW4^pkU&`9>R@eh(ts#Ef}}%94h9P|r4s)^ z&2{wH8oSHKMBWV`$8*~<{_W1=2JlDlB_JNSml?PwUjA70B7FyFAe+wKK-ftj?i2N4 z;sA*w>cIfa*KwQ4p%o#4&DAyZxFoohluZ9TFf*)#Q);~&y5YNlrM7&lsN0}o$65yO zJbJxGcb01ckoaNqEoAX8TO03m=eG6$wz$Y)xyJ4B8~_YHA3<}=R5RG;Ywq#`SR$Xv z`}(}~y9zDLnT0`l=7YF>u1)NZYTbzlIt;-3&8_HSHyZ#q_L(0t0csoXHnG1`t?gy- zW6}RI>rm^A+n%BEKsj&%nRR(9)G=U4lq)H*ID--gUxb8a*^UKDX0cB6SSAUXi1cw1 zlQ|!Cb)4sW)G?OYQD5Fpwe?v*u0Hyi&Aht351jDFTKG@6&s?Hfd+e7T1t1nvvA@C4 z%MW7%4SamxoA5S6Vt;6+v~!4e-W}}yt8qJsd!1YM;`V%Q)*Scc7PBT0YW*JRAaIm) z%~tB`Rr=|pMp>1`Pro7gx$h6AC*916SqB%cr*?z|rp6kn^%Bv$MLh0p0OiHj8_eGX zE{^UEi9(t}r0d^zygsWh2Qp6v_8n9!keXtX2x>qd71qapSCkGd2k9FO7vBVY) zdN1z0f7`S5RAL)(?!>c2iBf$ReXR2l6m@!2Xa;BMArX0QT~G;kk+JP=^3`?@z=M&$ zl1$#O)yd@u#OhA0GL!a@#=l-)kn4^X`DZzeTGqn#m2PUwe-&hpI*&UClCt5w9H_|*{_N-loC8d@N#>BuV^`op23)zJoLbO7bQmKco5fbflf#SI_t64?_Y{i`7o z?$c?Hk`4F&x&6!+lW+q53&azXO1?AMB`tp_*A)ZjaTw+#(TjGyFTRo9+mGjN(}R zsDti&DS~I3rWbwmp`E(Q6q#gSoLLI?%z7g+xF3UwMrm3ma6D`yj}0Zk0v9r36vu;y z%e7yy^DZzl$ZU2&OL(KC_?NjshG&b0d%)P6h^v+fn(oItPKC$oVn@sBoCR63$99I8N&n#~O7JmWyiSiHM&npViZq-}m{ixy}~RQzk~FY9N_wL%VKBT?MD z!_FP$S|Kl54H?17osW4Jrxc7qDOlb7*6@~+$KQE65ljBxXPIKd1?{odo^P^#KpBuG z15_(bH`9M}K#tROBAWj&=f)5zN(8z_A~DLj@JbVA=3K9dw+!!nLorK1hgHdo{aVb5 zklV85ef5W~DKs6HL*Md9zhJw#Z%vr~I9(4nVq` zO1Hut+pbs{*r*P7Jn+bS=AgQHt81<|Gb79IfZmZAspNWR{_MU|kYG;F8q3>g@#IT} z*jkLJTkJ^drnh6iPQ;jQU1@q#dF@cSu?;bN=Gkhi6{N7A&Dm|)qlbT-VC8wI?uRV? zyTPgTe2fi86C=W27cx8I{;r>fRm9BJ&}*u>-ke3Z$?Lo?*z58K#E8s)r=P(nqouqj z(skuVnR~U(+{XD7-j{j#g}uLj`QSi2QfhiBU3qtSIP+lK#{=!(byXVg86k@1opM6H z7`k71#<#s&pX5<2J=G|5Y5sP!@n@gqDcw_~2rSxdM==z6JSLACu{H0!PCOBFaj!j} zR>=;WDn3Q(O6Fu!xxxSHujijFXGYyVi}Y~EW9Ips=DLTcDdP{U?ijlzq*J52@H{jO3(9Eq4yR$i7ed6XFYJBY{3?9TaZuWaL*HO@2 z=VH{uOE!}{i=W_@Vi8SeVa8=`B~#&PGJFOi>@sQVW}|wAGiZ8ZXG8L)+GvD(a0TV% zhTi)1c#eK}dcJC1u{#mDiss21@U^2G{1vwLgeRpk=TuQj9`p+}nw^~nHZ-!$IOE0+ueq*MU(=E6XSe1>*9+=(1!m?G zT+~M5+@(}gdZllNJo}#14XG_vL9`7HeZh%`{!N123YI`_ zyEbqz@(CQd@Q}H3jCE!NsW`<&mOecmHwAke!FHZ5*a~v*dK(ArFxX_x2LU~}*;6eo zqOW$WFFhgKYc&RF_Y>_`!Z)T>Gm20J#BdVm+vdZWY#-Qqf?s=!T93TM)Wnp}WO(bA z#-4ZgKFOW*$l!ZP@VA(g?BB!MI4gX722$*}_4>9<-~sdl^htxfWWzrL#oJxvh$+tR zT+XFs`Hi(Q&#aqGm4-Q+Jbo4T2O|!&eu>sHC70;(ps(@A(DAduPu!^<_`1cl89{b8 znSFdpZTtmi4?3lAk`y5+xrG*4hfXnRZ5(<^krOcvc0QcirW#)EPIn_N@%R&do3D?L z)85PLW;J`biN|*R5@YQmfz0i0_|axP145BbuMbbj(AsYF3BQeeA-Kstzg}}Pr#NZK z=-jMvb^YK8w%7Wl*UV;jhm)kf>>GPF5N2RTod4@;hq;o5G0ey}S2%gQ>dIbU_r6^H z74%xWZunUACi^4%R)=W(-0_$@M$H@ZQ|2d0pg!YTxXMn+6wy=3FE%MI#=R@O69uPf z>bjdq#Pay|)}rfF1##fu$&k1~{wb0G%`M)g3;Lbpsas25i_r~lXQ?_A_iZ|nme!Ql zP1gkCVx*`87$`sch*dYF;Eq3oCcQT5LRZHeq0iDwS#`p;D3a*93d%$%BTOv(G9eD8 z7XI>6s@IipR|e++uD=*#d?CjD)68D%I$r`E*=wvrSk+Tt&)#x?FPcF%(F|%7(440vH9C`;oP6=TI=Fdwahg6_FzVwz&Z|Pz`uAkPW78fyItt{ zUOiQm_CUValwa4rK)6+U$O)&#$%**d`qehfq+?`=dtX03qN%rHHNIBkVURnmgQS7d z&XE3PN}0rsujNv5F_U`xX&8G|E1`hrF@f$XKH)@_3J0hoQrQ-1cj(b+Ul4tpCKJ5o zG&A0uQ5o!FOFC&wiY`Mlt>VP2;<7B`vaI4{a#=b@3K?Fpe>x(+T6L=GGV{IG!n!IQ zw92X+`~V|R*E0Wqb%D*oD!f7~{6p`k>yK;dSGd*+VWY#YpQcR^#{FNtUF0feJcxUk zW?X4jtc9>)i7r6h|E$1k@Rt~009Fa{MAoCmX=W5O46xP$7La5dT!Yo|@Rzk6YrvHJ zx`=wX$=dvkKAgex><-%%d1FF2)^dJ$Tw^7@whRr*1*QdGlbN{OK$*!j_==`5m-)PT4~3*XIBO{1lM@&R{HPWRcDQBvc`2;m-A=u+<0=O0Qx0< zRY^u##5OIt(hR4C@Mt5b<9u_UYXvkU6iT^D`n60Kn!g;5B)`Gl#|b8tB-@@b6+x;B zYab!xRHSM7%Pks;s*RRXo>o!|mQo8=Qho(D#t#)Lg0(=4mh!y?UnX?CtGx#7i65?e z2zbu~4A@uye$C16fn(Fh+g+V*tbWNFK<9lz1+Xt9ZR}QjLKVTEoNpSNTOu`52ST%C zT9=)F5I%HuU4=Dd+%3!KFUt@K@AGZfxTn3*Jn+FJnp+jP=GZr0Usvh%`YlmS9$z5I z)YW*m_Wk?HU!I|N=Hf*yQg6!5-_Vcs3#}lqn)@_b!zxVcq;L%Za%> z#o8IbEw4%D_X-qNgws(QL_@L#r$y~<(U$NeW0v(TQ z3#mBA&k`y1QwVU{ZR&!$c)~lJqpY)RuV*uy#~-~M46A8W<`L5yJvTZpX-?kLiCeDG znW3w^9PS*8NrPvb;l0i970b`fc0v(R$pphO-}!%i=cjz(-dcE_eBB>KxOT&ojZWkn zJ<^0`beW71UWeK~I2@9G9N3Nf!i*P*fCVC8a#=fJ!%_F6=O4+gJ@y`n7#?O~j~4FZ zeb@iCT9?k9($=cC(5Sc2uD8&vx6s|V8Ex#hn+CU$$=iAECFZ}xNL5ThP$w0aXQ#)1 znr8H;JX2K2FNmGO{WPuXPZ3vC*wZ@vKKj!X-k)NxsIYBiyt4ni_=M~ z`vV3qzz|hg`#b{pK5PRjXs2;yXz(uoI-yaaX5KaOecS!5vQ27!8(uxE*lP`%S;_V) z+f>VIGuOVWo&TBBze6Fl8oyh!9b6If-+im8Cl)-y-Q-RMFmtiKML{Z@rt6YYona0gCZ4$x#T9SmTjiIve1>jkMp<#T&mImW=tLx0$`% zLf9VHSgK^3)R_A3IG0sFkH|_Fb&!_(v}CEiRMVXBQYR=FuFyD*Hl|tX={8S8^@L_p zmevWz*Qnq3%7O#Bb|N_?gIQgis9V+Bu({StL}yL${Ow)!rMDk7yFct?O7^*Jrx`zK z3fwVa`Yd18(#2~pH}k^q@OAL##=NZW6GM03OllCuHTuUjevH2`$HU>8`3?p8L4FF8 z8ud?!hB1D2=O*i8?mG6x-NWk3yL!TnvJ=CO{xi&l{jhd{QmOD-OP98Swso(ybG5-= zDuelKNy$8~`mdbcwsSj%4Ns|y6TWf&d92=iR&O4Q`;mRPV+Esyou+-6p2cVSWj}4W zr=!QP=&OEUG?oTmHNy)de98!4-xEU2_YE}-5~G{e7&FxF<@~1at)>-JjA#j5AoMiT zunJHr<-(y{7E+C>nr~j@+QOj*6j}>*?3Z$Gsxr#7-RIP=uYa=LoMT{ikKU;RS*_0RU zSNmIavC>x^{AJ`mvA#*gL6NOuCK18kjX{Bd%MT*7y=pzoQcSHz3ZK4w_N70sVmZ%j z$INV}*KFq+BC3fHYmPVV3qPZ6g0QVP+_f%Q)(x9x?u5&4p7-N=mfzor(3cuENXqXE z6V^^tjeeSz^ zSA+FgI&L)0c(r}!Y0glHjDP4GzYG2i?=+uq&Qe=%Yujk&mrD(gr7ugF?N}nBE+L}4 z5K$iqhBLnN-wF-#^F#VFmRql{%Jwb{k9b_u2^IA^ySmNh&MUWCNTx2kU>!e%3VIQM z`;k*Q?dwOn*mfEd#xCf73ZQ~AS3;YvdRVaU8hqPCcFb)%*5hp@u>dgZPu>VSLL8k^ z|M9J%_3iVwZ=XK`n(=P_Dst2c)`*}L0nb!CF(NGObFLq4tCrZ)Lj@aIvp+GJiUQ}_ zH;;60@V+kbib$P|5U-Ak{^_D_`Nr3)Y)lb0?+8j0D_PHWf6Tdt4~NkN%~C4t>&>dchzW(QHsf*TelzPdTIBFd6|2ei01=qmPH)~lyZ@9s_EE6X!87D3MKakj_ z;bD$3(^3IG|BQ`)`)MbnX#-W9>&qcNCAXGK=m+F^+kp5bh>T!`q z2%k8F&nJRr|4QqI^T4xb>qWuPm;!&O$`jJhyG{LB75{g?=Q{PyBlk~xZN11;7dP2E z?L~kf)y1#xo$-3`g;@9eYj};eFJKT@ztFod)roa{^q+tQgrQlLw4OphxHbg{3xLpp zCXURk2gPwsSwDk$QGIH8ByX5GF9eS|B^4*C&XV=ttyE_@`|jpF-_7&deeAybcI~4_ z=-_OTgTZh$j4FF}0`-xgKItpzqm`yBJ*gwTxe|B6?pXk-gG?N5w$Y)VeYgD7Gz5J| zgPQtCELBS^HB>BBSS;02EY(a=Jl*Qr7t3p3tghwfI%;Xx|EodGc(y!SvM<;`yL-z| zez~urdA-w|%_8vfgf_aacm_1Q1 zmq~*(=EY8&WAS%Dcnk<`8u_u5^3zI#=ZCF{AX z*S!+*kwEEc$dvDM8fu4kK-#%5o?a8R~hpMJ%vT{kqdxBo$2pdU6NgP&EZq|oL zDmQ8c)T@B%GOv_IC^Ys+6WJN@~MRXwt)#9 z{KNM~kMGM?!qW`G(|E#9K}7#c#NGcl_;CYtVcepSKa&Zcvk8~0oC*oo=U4X3V?|$n z=`X&j2>ZnHk>qHmbJNqf>FM0ZX1o9dObh|D9ph1Rxm`a*Uozix;#vwDA|!MAr{?7m zup4U84qSQ4HgNTBk@%||XImm9Q``4Ny|xbK4S4DO#dWGY^RD-;v*TBuke=F-PL-iW ztm16BeV+Rk%k>H#0E}@+t8}R4;Yiq{QraG@FRt~i%cHFGh`UvU%fr5Z2eFEU$9NSm ziw%o7^Ya-^PegQ|q<=Shj~-E_j$J_kQ>=hdJWs73q!sni704?B<&Uuxg{N!acX*F( zW01X@+*Arf&jbZp3JG(kg;==LG8Pl!Yk77&XLp5??UQ?w#xi{Df9JwT+F^JQ&DDDi z4J3z(Dq|j{B&3NVEV&8+T6*7nUse#FHV}TQBl;<3S(nljz0wrTrL8h<MLFi*{_nv-sSDcxQ`vi8xw=~Oup+TgaYEVl0pi>V-lG^_@LG^gc* z8jP^M2ED#9pZn_(LkA3B#GxbNP{VA;D}A|7Y8Y5}ep)8;zR=f%*bc(ctudwIr>vh@ zoyBPUQ6ba-R(#0hKkuu3?i)~;=0`S(X_*j2yWrXyvm!&D}?bY z{o_}DjF-k&4ra_N9DJn@uPFGr5=_RAK5@H%|K{tTjfA&Jkz7e83ND9mvZ zP&NRicn=hIPzS3pojVRZp4Zuq?)ro_*@6GZ|Cf1HQ!$>z0@l3u8oQ;Ee#4gZKTu&H zJ(&07B{|2LmafgLRcEG8a`vOu7VsPsgm2Jg>Ds^3?EB5CPnlIGn^m7j*i{jfhkdhy z8V1xkPs>)7B6eYaWlH|y2ln`*g2K;tQv@lG@`o<&;E$IiXNsKGcGmfI95VdsKF&rU zQJSm%>$v(0_X-M}59ZQU-;Oq@q|+HP&9Hoy@w2t|q49|H%HT&SPZ6ek2vbu8u4y02 z3wXhc*gOP!E|9O7^gZXJb%;3H1Xl&VBj`-{7CdXP(w%-L8K{}wl%Cc!!!54yb;}QA zjmmY-K(;aWcl=K!=aaP6$B$OyyEwe{4kPvP*hRqJ@@L6%x^vflSCIpQAxci=(|LOlf?f}6H&g0861gBYi?e=h<28k|?`Y`JB)aWKt zL)mh&y%nAiNrcd;6pc1NKq&Z6hyVm7ffS7=Mv?5Dh6rMu#5f1=BAdZ$(1yyGq)Ik_ z*``BY8|mp96bXzzzyb8DbwYWXz}uHJU9EJ&GS~h$jbt5t-16JG*bdDY;3_I)=p6ns zp*Orz7!*39uJ0pVBqLQMBUAKs2&^~b%XNZQ&qUpkOg(Ojb(Gcm*74Q%-#VDjax0)Z zKl6OC_?No)zObOz1HH>>J%3;93QB8k&zPxPq#KqmIotLPTFM1$g?03eYdqOMRkqo+ zd$iqk-YtfwSsF^^b^Y_Ta`BjLpYNQP)f{Y)r^D1gYV$vG+$pFD1=bL&ST)V9biZuR zhI`siN&zG`$1bk5FcpdUkSx9FB<%+-(;8=d9(ByP7H^SEr>v>lxZY{CT$&08syf{z>I< z+xHz(L`1Yrp88fC3YwY@<7M0Y>oQekr2ULzDh^3+OozXwm6R-7q$KA%fJC%;5TKj` zP|klt%x~Ve*o|nuF-g%~V;Ibu0+}QAnH6=?3L}@`QAsG72B=MW2|=l6CChL3ur!WY zeBFjy6eEO76MazYnQs5WteQ9I0NxxhkZJ@PD^y#8PL{3wC0CZVSE+X2ZS0 z&ec-})RvfHb@6O=01P@^{As9bhv(e#?ZaWT?Xs`ST0vU?+nC2Q&CTH&`c3Nk%;Z7ENBHHx!;EF>iJ2_vW5fCcbo3YNU^51!ML#T?z z65W5Gs~AXuy1p%QoyiE~&Ma<+czu2Jzd7IUUSH3N<)9T+32jOR|1nTfIQ$R)or3N< z{+Z&`#_?~v8!qR^)PSF;)H59aOkv#5633ZZ>5GE2S4|AZpYkXM!Tzv!+w@Q91);Gr zzx-`ot)*a(0TKad6yz;iq#W}CFa1Sp*uftAU1`}-Fi`L}ed=M(-UYW@bY0n1n5kHf z`2YC%z0TL+9V`p3&59S!G|p98e(meC$O?Q8pm>@Gz~G0-B2C6ux~TM7zrS^V8~;pu zb3beJY>A>k=G39~;HEzJoj!M{-O*u*&e}g+TA;t2r*9VK>l=DULx0`ZdYk800}DFZ z$*o+pD9iA-1e|-V_nHh_p@qw8Z4C)Wzi4|K27epoAV#bBZ*-GxLE_&I z#_2G2^sNdf=co#&XHk)=|Elov{HN^OpUr}+ttveBUuG#SDcTH}ie##Rv`jlNd?_u7>hheS)#=B=>BKS^m9cy&G6&`cbZLt!|k|r zhi<1H3}>Y;i=-`!q%U7J+j)eD$|rQZCv@Zy4Dr761HSNJEj9Ig3F+a~aOw^{A8!)D zosKct;ns16c+a(`&6r5<-Arv(pA=^?o!gks4NK#W?!DpM478b38*du$E%1X<9lfCj zVn!hDC`qq3Un8nbs(I)}S4di~D(;)=*tfd(Z(Y2^+OLVV%ZjysR1B}RTA$9Hx==9H zs9o>x<4K$sA}u+3j(n9HifZ!uhkbSU(tN5_+Pe~4CEc|81-EqH24z5MpK7=@2U4!G(fnJvYD zy4A*H6}QwavwvYDKCK&e|c{!$W?i#R`YkwptLTn2?HtnfIB;N z$xh|ZB2&rZVR`e?;JSb69lm;hbJA2D^cVEn?B7eqJP#>|?88koYccCyc@dW)K{yS) z;m&6AiegNp_O`oO9r27R^dfP_oa=hMLl82#8WT;#Y+c&!xD6pNYdf?dtRIK2mMRmv zB!B*#Z{pFVkee^xH^XBc=1nAj?wI~*0Cn82JTP2njrei>A^dq-zmH;ZUs$nI>o*^% zVx@x`VsP7e*y!ffB@t)gnC^1Q?+0m{B{(07uw&_LBEB*ZN1X^K3;EGQPg-b!gwPe? z$8)gn8CSq1$p(9&2R8}@a;oF77uFQW_wZrAAy-@tV(q$A;;Y^DoJIO@M6%X_exXn` z#q*%77tgrfasgc%e%HLgEbthbZ;;%cufRu2u%$c!3!v4~$pZP!r%c9oerd7h950$O z_lse8HHIAs$~p}`*W-s)9ln4hcpfvcHR036S}{U;(nT3UML2Q}FonX(<^me+=X1WOcrzJ1IvvL zNA9@4dwHe|+o*nhLH|fNmtXVZ@SOk2K@Tsm{Il-o>M|oqRv+3?SDpDn$o5mh&mg1! zu($91I+x*KPh4Vw?=+LGlC(mCML++D&i?D!ik)eGQ8WK&Y4lYs!!|3VKHD{8eN!+ruZlC8Q+f!P`)lwakM zSN$>>!b?7X(=5!oce33eRnu}E_oM#p-~Fx8BC>w^c*o6+Gp?24g2>V6LSLl4K@ges zxt>w%m%<2Q+Cb3LD%7Hw4_ypbri92`jGB*DD81EL#G&elVb>#2_ffPE<(4JN2wPH! zH9ZurzTk6EwtWhHMUEUZ4RWrIUA)XgZ%aV`X~BZBl`88p3qU4z?06^gy@Ttsr@L(7 z8tPM391Q&eNlO>}QqAl0lwJqZx3oAbK5VcI`Q5UoCHd}M@@M<~x?77h? z*&pf>I`LOfSJw+EEbSP>fBuZ281-T&A5ig>9cH~ zcHNhBw~dK^J7dD!FYQAo2BIQ zEP}jr&7}BEJU9eM=N@rt)ld#vW|$&VYH;MtIXQcIj`EBtAp99^&mMgFBJWIB{MRqe zhE?tzyRRBc4QejQdAPI)Dq^;Ns9KM?pDPs2q6`H{6!-j4HIAODKKOU*ko?1d;?j3aQ3BVGg^y<2lhhA_V?8_1rm;*03gbF|y9sw+N8MKtD z5NDGH#XhDfaHmt3?bHxcQ>>sB`b@tN0X;Tf$2~b;0<4u#v5~Q;fAlsUaAZ1U_5wFY zn0yo?eGrC!8Wel~MLg)LD8qvp%sAVKGm?y`Af;qh&tdLunB=@jnZ6MFaA`1X!|!3x zFTpK;vhiUrii>Fr=&QsYqiTMtMK&@i6?Ruhf~Rrac~+?rvVp2fN{!K8e~tDhyS~$1 zuZ+aGs=pON%%f!Y;>A4NdgS(O4dOW$l)!h`@uhw~X~A>{*pJb4oEa`jpWYn0hzetv z6}dU-%h_%hW?W&o770+|wp&-C|6pOMp~msZ3SQ6>tFa!EJsAvqzk3z(q?H>Oq(bbn zYkbL>`P;q@MjPRuH2_Y`ff^r6#Fw6L;a)>x(urq;W+Q7`ew9RCXxVxa6)%HK7Y3JN z(r3!VTVBk}p3n^{a3J>vK28cM)T#Q;R9Y081N+}Bk#QSV4qdFeozxv!^*z1(+&ky4 zzaRaaUo3R^IZtu6|H;aE_uKyb+K=0tMH66cuYQg*cX}y}>fpd{%pK4|BLqULM z7wE!6)dSko#*oFlFX6y0rA0FMYXMYNruK$2?<{GasgShc!XpTU+qMVMd(R^N;r38I z>;(;(fc7S%MD_>=m7Ov^KVNQDIK0gH*s|4ovVzDOdCfNt`_Qu07hT~X+;bA_Q5NG#ftwtVG-8G(FS^pNXSvN_#qe5GoX2pHkpF2lI4Iu4jeDe za%DtK389bmVXnNp6#GD*Sq{qT-{$GB5+Ph^z|IY9ehSK-qyWxjXwn&29b1DQ1_D5 z_zoqbAdV)>lA)|t z(a{ZFj;HX6UgXE`Bn+LFlBg>!48@+~BLpb$R*z+P7h;pH*Uyf5cuH( z*Ct+2j3HvOWh~j=L$Qz8mw^JjPm9?1kW;c(j40isV)7>>aHfy|3NX0mn=U0f+>403FeEp4_=G7%+q|lpO#Gdfxz#~?6a=<7 z6ycR@V`vx5BNKKLzuE;yA_fG5AGl(iDB_U?+uM#Tl?jFUIu_30vq6U~GiB$I!huZ> z9n4b82F=&TChb=MJqNrDj-ZEJ>2QnE$>3T6${z@l~Wi_Gs!Cr1R-Pr=WGkV)>Ff}3!E zw@7JOKARLTiWKC8q0C5p7TGg0V}KuT7e$Uz_co0CYk*&Ebc=GON}y0Qr+bimFS2!j zADQUSCtiGKHY_$$yYPgMUtDDRrbzLvSv#)aHz(r`U>xaUT_G83$Aj%!DS@aHBT1>` z4Sm%P)4rq#76|c1tq}IEo!B8cU(V`gQ^XIB&7M&h-?F(9qz}bxGR}hKRbP)$5YzI; zWgG5S3Ztc|5?~SI>P3ultw3>t4BxY&kpnBX(cIjQJYNo0ig6`dMm2>G?|xLa1SwtM zcO$$YSL=&9^GjeRP||4CBE^?+%0=#tO$otOvkW;$K~m19*j(q{1j8#gw2T_}35;VZ zyJ6}XwsI0sML7y}R0>+s0$++Mu!A0Cf5ai}R9kNM#gkUR45yyO06bfCxtneW0)~|U zY&_hjU7%^gr`_k6VAdP{q4+Ql)f$0n_e(7&pLJWQ%Pbe+A}<8R50mX%1e_yP7az2o zUhYmuWdp-V-TwwL1SKnu%|nS43K-xHQPtq2opa8|Vz5k94&11)FY??oj4{e!Rwg4U zuF-hC{3V79xguK;U4%cp%Y2>SaaHz2Ip*O8{X}n;vcjyu$L_O08=khuBs6j!S;tqI z7&^CMyeK!o*6hyjMw(X>%I^_VSN55f{MHYR$WK>K;K#O9_d0g$j3bX1o+-yZXWRty zS=$zpNz7Mq(wyUI@i|qoj5C1($kA|!qBEZ^rV)b3kWpWxXTX@19CAf$;n-I_RJzB zcd*|8d|@&Lz^Tr^K&&u{Dv~DMo>Rv@Vv?s#EaS7>l?y?d4MszW6R5Lk#ob{!O$k=y zYg6az66GjNns~MO6gVW;Jd41zqrGddQAejH-_J9m zYXyRVX#dO+7~lVOdt$(TO|X223v2e@DATQYUZMrrW%T%bZFKixl|+X*jr5I~7Mik8 zJAhm)JgxAcgMt{40pb9t_Dds4tdb6yvko}8$~_`^z>}w5U>pZ z2wDd~4!%Y$4__o9@8F%lHUQqxUYCbhVpbX26CiY5M@#lj@_`BeCipm-Bs7%x-|T82ICEa>08(C)jB zI^WxULlV@7n}(dI;q$?^L5|lTecB?%(3C%N%QooY_++J%g(8|jTiy{%Uq)!iihQNq znmTFy+N#lbC_cnp(~*DwRnq?V=ITNe|Fx7D>y+PeK`I^>uRX>@oeNJ6qyW%@ z>2BU48Xiyc(9L~m!Z|tg$~+a+;xqr4A=z?4UdHmCo;4m#*#dxc*-MNC`3~5Hh8uK8 zChdYyvhy`d3~{jdNYWyC17e1`7b!3l_vXcKg=eUh#-OoH5B@?>dABlH&KS99vH-jU z2TP=!JUCSdG=ubk;*is=cET1#S`LI3kihLz%npvvo-}#HQMj!FmWI|a$x71-&LASz z#$(8UdHDI|(@(z^4m@b^fL#4ZEKvg&>PZ)>FsrvDOfk z^_sU({QF{*WO%~=24yjKKvQDNMmBQp7uRc97__q5x?B!;vwRYz8oz)L7grBSe;b#`tWeH$39lx-cj) zj`BNLP+qtkW7+_V%-wYzIh3|eFt3WF09xfKOW_S*MiY& z%U`a&w*4ScEt#XNMot>gjC{YFC{bO=IF}ugUBLb#@2WUQS>g^79y=_>JNUtn8g=*K z82@Y=hQfeSWWoZgjf#J6`AWA+?&MH{F71F}zr^2R72UbHJQa}CY(dwp5GoYqRc>S2 z-JfeO3T2DUS0BCFzuTpIHMJ>W-@hyPg;7-tw&$HntXXvDFjG;M-Bd8B2@$zk%fV6` zjh&TU$W8-%EoO(iqQnFsPvSBmgI0Emk$XUaiGdK+h1$a%)2Xu;gHJtXm7;h*y~hz`A` zVhzE!S(qKNV60k9uDs!m5-yZgHt;GfTMDcS0SqL9ZP!*NfZr zo<_NSpMOMGGot&|?w1zWeiTC5w(6Xf={d_a)yL2%!jXK1BEgSjbz%t26x!5Gg zx!5})i)5TKFyVmVt4w7#iq|{7nnzL15Tk#hu}T1laAe`iOHE?USUBZu0b_uDP)m1o z;rjqf%u!ZlT$$iGWt4KdbL?DOZblskIvL|awnW`SZY*t?VTUC?ay>{6<&F%m76_6a z9a3f>mz)ui*oe=I_AHR2FezbT3!IiZ_P%d<*aS*QY(-agpqev4>?>>Y zvEO8JD`FUDgHgM$P04P2k+tM?YBDrFrQd5p*?4>EyKpdiVCL ztbdkUtmEmpFa}>X2>QDVrSEM%U1rPpJrrX4X_;=;f%iBA#8pA?FF_AuPuOFI-%88e z?m#{YI%wQ|?R1{VI!l+y7J?!d{kB8TwPB?1`dvD!rg&FRX3JAsK%%#sscw9C=fx%0 zz?PGfcSnzA-Z*oK%fzohgPhFrxDs%Th)q^UACD4A^-x?FlIe~|)$a*?B|GPe zs~Illb*so$8b#x1-tE92JV#+bJo`ZRKS`lH6}eZX%n?TDjST z8C#6a%*^b2ozL&_`(v*?@2=~5UU$#u^L4$h*Y&dS+D!&`a#|0cy0>IT+W%M^{3bk7 z>qk}e8{@&mHytlb12h#^>5&nS^7Q7HsVgsF0qQn6cqhYko}b=h>^5m-aUx+X4Xs

    y2}t$X{$tWW;!n-@!c+ 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

    !=|9#oL#mwHS7_bM6oqXTe}^|WEKdj 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 diff --git a/addons/sourcemod/plugins/mutant_tanks/mutant_tanks.smx b/addons/sourcemod/plugins/mutant_tanks/mutant_tanks.smx index 35ff403898b8d7b0e1e947b51c7ecb861ddf321c..baccc1b379ec7478b8a3bfc3c26bc95f2478033c 100644 GIT binary patch literal 497180 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%0A_fz$_+fyg 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%0DxBS5x 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 literal 392741 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%0A7O`#nbHmX{lf}4Ws+La^^P$v_QsL3~S{lb% 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

    Eh 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⪙#?x%%5q0K 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 diff --git a/addons/sourcemod/scripting/include/mt_clone.inc b/addons/sourcemod/scripting/include/mt_clone.inc index 978c7added..34a36c1f57 100644 --- a/addons/sourcemod/scripting/include/mt_clone.inc +++ b/addons/sourcemod/scripting/include/mt_clone.inc @@ -1,6 +1,6 @@ /** - * Mutant Tanks: a L4D/L4D2 SourceMod Plugin - * Copyright (C) 2024 Alfred "Psyk0tik" Llagas + * Mutant Tanks: A L4D/L4D2 SourceMod Plugin + * Copyright (C) 2017-2025 Alfred "Psyk0tik" Llagas * * 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. * diff --git a/addons/sourcemod/scripting/include/mutant_tanks.inc b/addons/sourcemod/scripting/include/mutant_tanks.inc index 4114479ac2..88108264eb 100644 --- a/addons/sourcemod/scripting/include/mutant_tanks.inc +++ b/addons/sourcemod/scripting/include/mutant_tanks.inc @@ -1,6 +1,6 @@ /** - * Mutant Tanks: a L4D/L4D2 SourceMod Plugin - * Copyright (C) 2024 Alfred "Psyk0tik" Llagas + * Mutant Tanks: A L4D/L4D2 SourceMod Plugin + * Copyright (C) 2017-2025 Alfred "Psyk0tik" Llagas * * 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. * @@ -22,7 +22,7 @@ #define MT_AUTHOR "Psyk0tik" #define MT_AUTHOR2 "Crasher_3637" #define MT_DESCRIPTION "Mutant Tanks enhances the fun and excitement players get from Tank fights by creating a unique experience with every Tank." -#define MT_VERSION "9.2" +#define MT_VERSION "9.3" #define MT_URL "https://forums.alliedmods.net/showthread.php?t=302140" #define MT_URL2 "https://github.com/Psykotikism/Mutant_Tanks" @@ -43,6 +43,7 @@ public void __pl_mutanttanks_SetNTVOptional() MarkNativeAsOptional("MT_CanTypeSpawn"); MarkNativeAsOptional("MT_DeafenPlayer"); MarkNativeAsOptional("MT_DetonateTankRock"); + MarkNativeAsOptional("MT_DoesSurvivorHavePassiveType"); MarkNativeAsOptional("MT_DoesSurvivorHaveRewardType"); MarkNativeAsOptional("MT_DoesTypeRequireHumans"); MarkNativeAsOptional("MT_GetAccessFlags"); @@ -51,6 +52,7 @@ public void __pl_mutanttanks_SetNTVOptional() MarkNativeAsOptional("MT_GetCurrentFinaleWave"); MarkNativeAsOptional("MT_GetGlowRange"); MarkNativeAsOptional("MT_GetGlowType"); + MarkNativeAsOptional("MT_GetGraphicsLevel"); MarkNativeAsOptional("MT_GetImmunityFlags"); MarkNativeAsOptional("MT_GetMaxType"); MarkNativeAsOptional("MT_GetMinType"); @@ -96,6 +98,7 @@ public void __pl_mutanttanks_SetNTVOptional() // Constants #define MT_MAXABILITIES 100 +#define MT_MAXSURVIVORS 8 #define MT_MAXTYPES 500 #define MT_MAXHEALTH 1000000 #define MT_MAX_HEALTH_REDUCTION -1000000 @@ -148,6 +151,30 @@ public void __pl_mutanttanks_SetNTVOptional() #define MT_MESSAGE_SPECIAL (1 << 2) // special ability #define MT_MESSAGE_SPECIAL2 (1 << 3) // special ability #2 +// Passive flags +#define MT_PASSIVE_HEALTH (1 << 0) // health passive +#define MT_PASSIVE_SPEEDBOOST (1 << 1) // speed boost passive +#define MT_PASSIVE_DAMAGEBOOST (1 << 2) // damage boost passive +#define MT_PASSIVE_ATTACKBOOST (1 << 3) // attack boost passive +#define MT_PASSIVE_AMMO (1 << 4) // ammo passive +#define MT_PASSIVE_ITEM (1 << 5) // item passive +#define MT_PASSIVE_GODMODE (1 << 6) // god mode passive +#define MT_PASSIVE_REFILL (1 << 7) // refill passive +#define MT_PASSIVE_RESPAWN (1 << 8) // respawn passive +#define MT_PASSIVE_INFAMMO (1 << 9) // infinite primary ammo passive +#define MT_PASSIVE_DEVELOPER (1 << 10) // access level 1 +#define MT_PASSIVE_DEVELOPER2 (1 << 11) // access level 2 +#define MT_PASSIVE_DEVELOPER3 (1 << 12) // access level 3 +#define MT_PASSIVE_DEVELOPER4 (1 << 13) // access level 4 +#define MT_PASSIVE_DEVELOPER5 (1 << 14) // access level 5 +#define MT_PASSIVE_DEVELOPER6 (1 << 15) // access level 6 +#define MT_PASSIVE_DEVELOPER7 (1 << 16) // access level 7 +#define MT_PASSIVE_DEVELOPER8 (1 << 17) // access level 8 +#define MT_PASSIVE_DEVELOPER9 (1 << 18) // access level 9 +#define MT_PASSIVE_DEVELOPER10 (1 << 19) // access level 10 +#define MT_PASSIVE_DEVELOPER11 (1 << 20) // access level 11 +#define MT_PASSIVE_DEVELOPER12 (1 << 21) // access level 12 + // Reward flags #define MT_REWARD_HEALTH (1 << 0) // health reward #define MT_REWARD_SPEEDBOOST (1 << 1) // speed boost reward @@ -463,6 +490,21 @@ forward void MT_OnRockThrow(int tank, int rock); **/ forward void MT_OnSettingsCached(int tank, bool apply, int type); +/** + * Called when a passive is given to or taken away from a survivor. + * Use this forward to give or take away passives. + * + * @param survivor Client index of the survivor. + * @param type 1 = Health, 2 = Damage boost, 4 = Speed boost, 8 = Ammo, 16 = Item, 32 = God mode, 64 = Health and ammo refill, 128 = Respawn, + * 255 = All eight passives, 256-2147483647 = Reserved for third-party plugins + * @param apply True if the passive is given, false otherwise. + * @param weaponOnly True if the passive is given to weapons only, false otherwise. + * @param weaponIndex Type index of the weapon. + * + * @return Plugin_Handled to prevent giving or taking passives, Plugin_Continue to allow. + **/ +forward Action MT_OnToggleSurvivorPassive(int survivor, int &type, bool apply, bool weaponOnly, int weaponIndex); + /** * Called when a Mutant Tank type has been chosen. * Use this forward to check or change the chosen type. @@ -505,6 +547,18 @@ native void MT_DeafenPlayer(int player); **/ native void MT_DetonateTankRock(int rock); +/** + * Returns if a certain survivor has a passive type active. + * + * @param survivor Client index of the survivor. + * @param type 1 = Health, 2 = Damage boost, 4 = Speed boost, 8 = Ammo, 16 = Item, 32 = God mode, 64 = Health and ammo refill, + * 128 = Respawn, 255 = All eight passives, 256-2147483647 = Reserved for third-party plugins + * + * @return True if the survivor has the passive type active, false otherwise. + * @error Invalid client index, client is not in-game, or type is 0 or less. + **/ +native bool MT_DoesSurvivorHavePassiveType(int survivor, int type); + /** * Returns if a certain survivor has a reward type active. * @@ -592,6 +646,13 @@ native int MT_GetGlowRange(int tank, bool mode); **/ native int MT_GetGlowType(int tank); +/** + * Returns the current graphics level. + * + * @return The current graphics level. + **/ +native int MT_GetGraphicsLevel(); + /** * Returns the current immunity flags set by the core plugin. * @@ -894,10 +955,11 @@ native void MT_ShoveBySurvivor(int player, int survivor, float direction[3]); * * @param tank Client index of the Tank. * @param type Mutant Tank type. + * @param specType Special Infected type. * * @error Invalid client index, client is not in-game, or type is 0 or less. **/ -native void MT_SpawnTank(int tank, int type); +native void MT_SpawnTank(int tank, int type, int specType = 0); /** * Staggers a player from a certain direction. @@ -1111,7 +1173,7 @@ forward void ST_Spawn(int client); #pragma deprecated Use the MT_CanTypeSpawn() native instead. stock bool MT_CanTankSpawn(int type) { - return MT_CanTypeSpawn(type, (bIsSecondGame() ? 8 : 5)); + return MT_CanTypeSpawn(type, 8); } /** @@ -1202,7 +1264,7 @@ stock void ST_PropsColors(int tank, int mode, int &red, int &green, int &blue, i #pragma deprecated Use the MT_CanTypeSpawn() native instead. stock bool ST_SpawnEnabled(int type) { - return MT_CanTypeSpawn(type, (bIsSecondGame() ? 8 : 5)); + return MT_CanTypeSpawn(type, 8); } /** @@ -1596,7 +1658,7 @@ stock void vRemoveWeapons(int survivor) stock void vScreenEffect(int survivor, int tank, int mode, int flags = MT_ATTACK_MELEE|MT_ATTACK_CLAW, int red = -1, int green = -1, int blue = -1, int alpha = -1, int type1 = MT_FADE_IN, int type2 = MT_FADE_PURGE) { - if (mode & flags) + if ((mode & flags) && MT_GetGraphicsLevel() > 0) { int iColor[4]; MT_GetTankColors(tank, MT_GetRandomInt(1, 2), iColor[0], iColor[1], iColor[2], iColor[3]); @@ -1665,9 +1727,26 @@ stock void vSetEntityParent(int entity, int parent, bool owner = false) } } +stock void vSetSurvivorLastLife(int survivor, int reviveCount, bool setHealth, float tempHealth = 0.0) +{ + if (setHealth) + { + SetEntProp(survivor, Prop_Data, "m_iHealth", 1); + vSetTempHealth(survivor, tempHealth); + } + + SetEntProp(survivor, Prop_Send, "m_currentReviveCount", reviveCount); + SetEntProp(survivor, Prop_Send, "m_isGoingToDie", 1); + + if (bIsSecondGame()) + { + SetEntProp(survivor, Prop_Send, "m_bIsOnThirdStrike", 1); + } +} + stock void vSetTempHealth(int survivor, float health) { - SetEntPropFloat(survivor, Prop_Send, "m_healthBuffer", (health < 0.0) ? 0.0 : health); + SetEntPropFloat(survivor, Prop_Send, "m_healthBuffer", ((health < 0.0) ? 0.0 : health)); SetEntPropFloat(survivor, Prop_Send, "m_healthBufferTime", GetGameTime()); } @@ -1696,7 +1775,7 @@ stock void vSetWounds(int common, int type = -1) } } -stock void vSpawnBreakProp(int tank, float pos[3], float offset, const char[] model) +stock void vSpawnBreakProp(int owner, float pos[3], float offset, const char[] model) { int iProp = CreateEntityByName("prop_physics"); if (bIsValidEntity(iProp)) @@ -1708,8 +1787,8 @@ stock void vSpawnBreakProp(int tank, float pos[3], float offset, const char[] mo TeleportEntity(iProp, pos); DispatchSpawn(iProp); - SetEntPropEnt(iProp, Prop_Data, "m_hOwnerEntity", tank); - SetEntPropEnt(iProp, Prop_Data, "m_hPhysicsAttacker", tank); + SetEntPropEnt(iProp, Prop_Data, "m_hOwnerEntity", owner); + SetEntPropEnt(iProp, Prop_Data, "m_hPhysicsAttacker", owner); SetEntPropFloat(iProp, Prop_Data, "m_flLastPhysicsInfluenceTime", GetGameTime()); SetEntProp(iProp, Prop_Send, "m_CollisionGroup", 1); @@ -1718,7 +1797,7 @@ stock void vSpawnBreakProp(int tank, float pos[3], float offset, const char[] mo DataPack dpProp = new DataPack(); dpProp.WriteCell(EntIndexToEntRef(iProp)); - dpProp.WriteCell(GetClientUserId(tank)); + dpProp.WriteCell(GetClientUserId(owner)); RequestFrame(vBreakProp, dpProp); } } @@ -1726,12 +1805,12 @@ stock void vSpawnBreakProp(int tank, float pos[3], float offset, const char[] mo void vBreakProp(DataPack pack) { pack.Reset(); - int iProp = EntRefToEntIndex(pack.ReadCell()), iTank = GetClientOfUserId(pack.ReadCell()); + int iProp = EntRefToEntIndex(pack.ReadCell()), iOwner = GetClientOfUserId(pack.ReadCell()); delete pack; - if (bIsValidEntity(iProp) && bIsInfected(iTank, MT_CHECK_INDEX|MT_CHECK_INGAME)) + if (bIsValidEntity(iProp) && bIsValidClient(iOwner)) { - AcceptEntityInput(iProp, "Break", iTank); + AcceptEntityInput(iProp, "Break", iOwner); } } @@ -2225,6 +2304,20 @@ stock bool bHasIdlePlayer(int survivor) return false; } +stock bool bHasSpecialAmmo(int weapon, int type) +{ + if (weapon > MaxClients) + { + int iUpgrades = GetEntProp(weapon, Prop_Send, "m_upgradeBitVec"); + if ((type != 2 && (iUpgrades & MT_UPGRADE_INCENDIARY)) || (type != 1 && (iUpgrades & MT_UPGRADE_EXPLOSIVE))) + { + return true; + } + } + + return false; +} + stock bool bIsAdminImmune(int admin, int type, int flags, int flags2) { if (!bIsHumanSurvivor(admin)) @@ -2365,7 +2458,7 @@ stock bool bIsFinalMap() stock bool bIsGunWeapon(int survivor) { - int iWeapon = GetEntPropEnt(survivor, Prop_Send, "m_hActiveWeapon"); + int iWeapon = iGetSurvivorActiveWeapon(survivor); if (iWeapon > MaxClients) { int iSlot = GetPlayerWeaponSlot(survivor, 0), @@ -2465,6 +2558,11 @@ stock bool bIsPlayerInThirdPerson(int player, int flags = MT_CHECK_INDEX|MT_CHEC { case 28, 29, 30, 31, 47, 48, 49, 50, 51, 73, 74, 75, 76, 77: return true; } + + if (bIsPlayerIncapacitated(player)) + { + return true; + } } else if (bIsSurvivor(player, flags)) { @@ -2477,51 +2575,51 @@ stock bool bIsPlayerInThirdPerson(int player, int flags = MT_CHECK_INDEX|MT_CHEC { case 'b': // Nick { - return iSequence == 626 || iSequence == 625 || iSequence == 624 || iSequence == 623 || iSequence == 622 || iSequence == 621 || iSequence == 661 + return (iSequence == 626 || iSequence == 625 || iSequence == 624 || iSequence == 623 || iSequence == 622 || iSequence == 621 || iSequence == 661 || iSequence == 662 || iSequence == 664 || iSequence == 665 || iSequence == 666 || iSequence == 667 || iSequence == 668 || iSequence == 670 - || iSequence == 671 || iSequence == 672 || iSequence == 673 || iSequence == 674 || iSequence == 620 || iSequence == 680 || iSequence == 616; + || iSequence == 671 || iSequence == 672 || iSequence == 673 || iSequence == 674 || iSequence == 620 || iSequence == 680 || iSequence == 616); } case 'd': // Rochelle { - return iSequence == 674 || iSequence == 678 || iSequence == 679 || iSequence == 630 || iSequence == 631 || iSequence == 632 || iSequence == 633 || iSequence == 634 + return (iSequence == 674 || iSequence == 678 || iSequence == 679 || iSequence == 630 || iSequence == 631 || iSequence == 632 || iSequence == 633 || iSequence == 634 || iSequence == 668 || iSequence == 677 || iSequence == 681 || iSequence == 680 || iSequence == 676 || iSequence == 675 || iSequence == 673 - || iSequence == 672 || iSequence == 671 || iSequence == 670 || iSequence == 687 || iSequence == 629 || iSequence == 625 || iSequence == 616; + || iSequence == 672 || iSequence == 671 || iSequence == 670 || iSequence == 687 || iSequence == 629 || iSequence == 625 || iSequence == 616); } case 'c': // Coach { - return iSequence == 656 || iSequence == 622 || iSequence == 623 || iSequence == 624 || iSequence == 625 || iSequence == 626 || iSequence == 663 + return (iSequence == 656 || iSequence == 622 || iSequence == 623 || iSequence == 624 || iSequence == 625 || iSequence == 626 || iSequence == 663 || iSequence == 662 || iSequence == 661 || iSequence == 660 || iSequence == 659 || iSequence == 658 || iSequence == 657 || iSequence == 654 - || iSequence == 653 || iSequence == 652 || iSequence == 651 || iSequence == 621 || iSequence == 620 || iSequence == 669 || iSequence == 615; + || iSequence == 653 || iSequence == 652 || iSequence == 651 || iSequence == 621 || iSequence == 620 || iSequence == 669 || iSequence == 615); } case 'h': // Ellis { - return iSequence == 625 || iSequence == 675 || iSequence == 626 || iSequence == 627 || iSequence == 628 || iSequence == 629 || iSequence == 630 || iSequence == 631 + return (iSequence == 625 || iSequence == 675 || iSequence == 626 || iSequence == 627 || iSequence == 628 || iSequence == 629 || iSequence == 630 || iSequence == 631 || iSequence == 678 || iSequence == 677 || iSequence == 676 || iSequence == 575 || iSequence == 674 || iSequence == 673 || iSequence == 672 || iSequence == 671 - || iSequence == 670 || iSequence == 669 || iSequence == 668 || iSequence == 667 || iSequence == 666 || iSequence == 665 || iSequence == 684 || iSequence == 621; + || iSequence == 670 || iSequence == 669 || iSequence == 668 || iSequence == 667 || iSequence == 666 || iSequence == 665 || iSequence == 684 || iSequence == 621); } case 'v': // Bill { - return iSequence == 528 || iSequence == 759 || iSequence == 763 || iSequence == 764 || iSequence == 529 || iSequence == 530 || iSequence == 531 || iSequence == 532 + return (iSequence == 528 || iSequence == 759 || iSequence == 763 || iSequence == 764 || iSequence == 529 || iSequence == 530 || iSequence == 531 || iSequence == 532 || iSequence == 533 || iSequence == 534 || iSequence == 753 || iSequence == 676 || iSequence == 675 || iSequence == 761 || iSequence == 758 || iSequence == 757 - || iSequence == 756 || iSequence == 755 || iSequence == 754 || iSequence == 527 || iSequence == 772 || iSequence == 762 || iSequence == 522; + || iSequence == 756 || iSequence == 755 || iSequence == 754 || iSequence == 527 || iSequence == 772 || iSequence == 762 || iSequence == 522); } case 'n': // Zoey { - return iSequence == 537 || iSequence == 819 || iSequence == 823 || iSequence == 824 || iSequence == 538 || iSequence == 539 || iSequence == 540 || iSequence == 541 + return (iSequence == 537 || iSequence == 819 || iSequence == 823 || iSequence == 824 || iSequence == 538 || iSequence == 539 || iSequence == 540 || iSequence == 541 || iSequence == 542 || iSequence == 543 || iSequence == 813 || iSequence == 828 || iSequence == 825 || iSequence == 822 || iSequence == 821 || iSequence == 820 - || iSequence == 818 || iSequence == 817 || iSequence == 816 || iSequence == 815 || iSequence == 814 || iSequence == 536 || iSequence == 809 || iSequence == 572; + || iSequence == 818 || iSequence == 817 || iSequence == 816 || iSequence == 815 || iSequence == 814 || iSequence == 536 || iSequence == 809 || iSequence == 572); } case 'e': // Francis { - return iSequence == 532 || iSequence == 533 || iSequence == 534 || iSequence == 535 || iSequence == 536 || iSequence == 537 || iSequence == 769 || iSequence == 768 + return (iSequence == 532 || iSequence == 533 || iSequence == 534 || iSequence == 535 || iSequence == 536 || iSequence == 537 || iSequence == 769 || iSequence == 768 || iSequence == 767 || iSequence == 766 || iSequence == 765 || iSequence == 764 || iSequence == 763 || iSequence == 762 || iSequence == 761 || iSequence == 760 - || iSequence == 759 || iSequence == 758 || iSequence == 757 || iSequence == 756 || iSequence == 531 || iSequence == 530 || iSequence == 775 || iSequence == 525; + || iSequence == 759 || iSequence == 758 || iSequence == 757 || iSequence == 756 || iSequence == 531 || iSequence == 530 || iSequence == 775 || iSequence == 525); } case 'a': // Louis { - return iSequence == 529 || iSequence == 530 || iSequence == 531 || iSequence == 532 || iSequence == 533 || iSequence == 534 || iSequence == 766 || iSequence == 765 + return (iSequence == 529 || iSequence == 530 || iSequence == 531 || iSequence == 532 || iSequence == 533 || iSequence == 534 || iSequence == 766 || iSequence == 765 || iSequence == 764 || iSequence == 763 || iSequence == 762 || iSequence == 761 || iSequence == 760 || iSequence == 759 || iSequence == 758 || iSequence == 757 - || iSequence == 756 || iSequence == 755 || iSequence == 754 || iSequence == 753 || iSequence == 527 || iSequence == 772 || iSequence == 528 || iSequence == 522; + || iSequence == 756 || iSequence == 755 || iSequence == 754 || iSequence == 753 || iSequence == 527 || iSequence == 772 || iSequence == 528 || iSequence == 522); } } } @@ -2529,15 +2627,20 @@ stock bool bIsPlayerInThirdPerson(int player, int flags = MT_CHECK_INDEX|MT_CHEC { switch (sModel[29]) { - case 'v': return iSequence == 535 || iSequence == 537 || iSequence == 539 || iSequence == 540 || iSequence == 541; // Bill - case 'n': return iSequence == 517 || iSequence == 519 || iSequence == 521 || iSequence == 522 || iSequence == 523; // Zoey - case 'e': return iSequence == 536 || iSequence == 538 || iSequence == 540 || iSequence == 541 || iSequence == 542; // Francis - case 'a': return iSequence == 535 || iSequence == 537 || iSequence == 539 || iSequence == 540 || iSequence == 541; // Louis + case 'v': return (iSequence == 535 || iSequence == 537 || iSequence == 539 || iSequence == 540 || iSequence == 541); // Bill + case 'n': return (iSequence == 517 || iSequence == 519 || iSequence == 521 || iSequence == 522 || iSequence == 523); // Zoey + case 'e': return (iSequence == 536 || iSequence == 538 || iSequence == 540 || iSequence == 541 || iSequence == 542); // Francis + case 'a': return (iSequence == 535 || iSequence == 537 || iSequence == 539 || iSequence == 540 || iSequence == 541); // Louis } } + + if (bIsSurvivorHelping(player) || bIsSurvivorHanging(player) || bIsSurvivorCaught(player)) + { + return true; + } } - return bIsPlayerIncapacitated(player) || (bIsSecondGame() && GetEntPropFloat(player, Prop_Send, "m_TimeForceExternalView") > GetGameTime()) || GetEntPropFloat(player, Prop_Send, "m_staggerTimer", 1) > -1.0 || GetEntPropEnt(player, Prop_Send, "m_hViewEntity") > 0; + return ((bIsSecondGame() && GetEntPropFloat(player, Prop_Send, "m_TimeForceExternalView") > GetGameTime()) || GetEntPropFloat(player, Prop_Send, "m_staggerTimer", 1) > -1.0 || GetEntPropEnt(player, Prop_Send, "m_hViewEntity") > 0); } stock bool bIsPlayerPositionFixed(int client, float radius, float zAxis, bool noVelocity = true) @@ -2672,6 +2775,11 @@ stock bool bIsSurvivorHanging(int survivor) return !!GetEntProp(survivor, Prop_Send, "m_isHangingFromLedge") || !!GetEntProp(survivor, Prop_Send, "m_isFallingFromLedge"); } +stock bool bIsSurvivorHelping(int survivor) +{ + return (bIsSecondGame() && GetEntPropEnt(survivor, Prop_Send, "m_useActionTarget") > 0) || GetEntPropEnt(survivor, Prop_Send, "m_reviveOwner") > 0 || GetEntPropEnt(survivor, Prop_Send, "m_reviveTarget") > 0; +} + stock bool bIsTank(int tank, int flags = MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_ALIVE) { int iClass = bIsSecondGame() ? 8 : 5; @@ -2745,12 +2853,13 @@ stock bool bIsVisiblePosition(float pos1[3], float pos2[3], int entity, int type return true; } -stock bool bIsVisibleToPlayer(int player, int target, int type, float playerPos[3] = NULL_VECTOR, float targetPos[3] = NULL_VECTOR, float range = 0.0, float threshold = 0.73) +stock bool bIsVisibleToPlayer(int player, int target = 0, int type = -1, float playerPos[3] = NULL_VECTOR, float targetPos[3] = NULL_VECTOR, float range = 0.0, float threshold = 0.73) { bool bReturn = true; switch (type) { + case -1: return !!GetEntProp(player, Prop_Send, "m_hasVisibleThreats"); case 0: return true; case 1, 2, 3, 4, 5: { @@ -3519,7 +3628,7 @@ stock float flGetTempHealth(int survivor, float decayRate) { float flTempHealth = GetEntPropFloat(survivor, Prop_Send, "m_healthBuffer"); flTempHealth -= (GetGameTime() - GetEntPropFloat(survivor, Prop_Send, "m_healthBufferTime")) * decayRate; - return (flTempHealth < 0.0) ? 0.0 : flTempHealth; + return ((flTempHealth < 0.0) ? 0.0 : flTempHealth); } stock int iGetAdminFlagsValue(const char[] subsection, const char[] sub1, const char[] sub2, const char[] sub3, const char[] sub4, const char[] key, const char[] setting1, const char[] setting2, const char[] setting3, const char[] setting4, const char[] value) @@ -3607,6 +3716,22 @@ stock int iGetIdlePlayer(int bot) return 0; } +stock int iGetIncapacitatedCount(bool human = false) +{ + bool bValidPlayer = false; + int iCount = 0; + for (int iSurvivor = 1; iSurvivor <= MaxClients; iSurvivor++) + { + bValidPlayer = human ? bIsHumanSurvivor(iSurvivor) : bIsSurvivor(iSurvivor); + if (bValidPlayer && bIsSurvivorDisabled(iSurvivor)) + { + iCount++; + } + } + + return iCount; +} + stock int iGetInfectedCount(bool human = false, int flags = MT_CHECK_INGAME) { bool bValidPlayer = false; @@ -3937,7 +4062,7 @@ stock int iGetListenServerHost(int client, bool dedicated) return client; } -stock int iGetNearestCommonInfected(int tank, float pos[3], float range) +stock int iGetNearestCommonInfected(float pos[3], float range) { float flCommonPos[3]; int iCommonCount = 0, iCommon = -1; @@ -4183,6 +4308,11 @@ stock int iGetSubSettingValue(bool apply, bool human, int teamVal, int playerVal return (overrideLevel == 1) ? -1 : 0; } +stock int iGetSurvivorActiveWeapon(int survivor) +{ + return GetEntPropEnt(survivor, Prop_Send, "m_hActiveWeapon"); +} + stock int iGetSurvivorAttacker(int survivor) { int iSpecial = GetEntPropEnt(survivor, Prop_Send, "m_pounceAttacker"); diff --git a/addons/sourcemod/scripting/mutant_tanks/abilities/mt_absorb.sp b/addons/sourcemod/scripting/mutant_tanks/abilities/mt_absorb.sp index 7695afb25f..6e50899816 100644 --- a/addons/sourcemod/scripting/mutant_tanks/abilities/mt_absorb.sp +++ b/addons/sourcemod/scripting/mutant_tanks/abilities/mt_absorb.sp @@ -1,6 +1,6 @@ /** - * Mutant Tanks: a L4D/L4D2 SourceMod Plugin - * Copyright (C) 2024 Alfred "Psyk0tik" Llagas + * Mutant Tanks: A L4D/L4D2 SourceMod Plugin + * Copyright (C) 2017-2025 Alfred "Psyk0tik" Llagas * * 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. * @@ -327,7 +327,15 @@ int iAbsorbMenuHandler(Menu menu, MenuAction action, int param1, int param2) case 0: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esAbsorbCache[param1].g_iAbsorbAbility == 0) ? "AbilityStatus1" : "AbilityStatus2"); case 1: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityAmmo", (g_esAbsorbCache[param1].g_iHumanAmmo - g_esAbsorbPlayer[param1].g_iAmmoCount), g_esAbsorbCache[param1].g_iHumanAmmo); case 2: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtons"); - case 3: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esAbsorbCache[param1].g_iHumanMode == 0) ? "AbilityButtonMode1" : "AbilityButtonMode2"); + case 3: + { + switch (g_esAbsorbCache[param1].g_iHumanMode) + { + case 0: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtonMode1"); + case 1: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtonMode2"); + case 2: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtonMode3"); + } + } case 4: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityCooldown", ((g_esAbsorbCache[param1].g_iHumanAbility == 1) ? g_esAbsorbCache[param1].g_iHumanCooldown : g_esAbsorbCache[param1].g_iAbsorbCooldown)); case 5: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbsorbDetails"); case 6: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityDuration2", ((g_esAbsorbCache[param1].g_iHumanAbility == 1) ? g_esAbsorbCache[param1].g_iHumanDuration : g_esAbsorbCache[param1].g_iAbsorbDuration)); @@ -411,7 +419,7 @@ void vAbsorbPlayerRunCmd(int client) public Action OnPlayerRunCmd(int client, int &buttons, int &impulse, float vel[3], float angles[3], int &weapon) #endif { - if (!MT_IsTankSupported(client) || !g_esAbsorbPlayer[client].g_bActivated || (bIsInfected(client, MT_CHECK_FAKECLIENT) && g_esAbsorbCache[client].g_iHumanMode == 1) || g_esAbsorbPlayer[client].g_iDuration == -1) + if (!MT_IsTankSupported(client) || !g_esAbsorbPlayer[client].g_bActivated || (bIsInfected(client, MT_CHECK_FAKECLIENT) && g_esAbsorbCache[client].g_iHumanMode > 0) || g_esAbsorbPlayer[client].g_iDuration == -1) { #if defined MT_ABILITIES_MAIN return; @@ -700,7 +708,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esAbsorbTeammate[admin].g_iHumanAmmo = iGetKeyValue(subsection, MT_ABSORB_SECTION, MT_ABSORB_SECTION2, MT_ABSORB_SECTION3, MT_ABSORB_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esAbsorbTeammate[admin].g_iHumanAmmo, value, -1, 99999); g_esAbsorbTeammate[admin].g_iHumanCooldown = iGetKeyValue(subsection, MT_ABSORB_SECTION, MT_ABSORB_SECTION2, MT_ABSORB_SECTION3, MT_ABSORB_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esAbsorbTeammate[admin].g_iHumanCooldown, value, -1, 99999); g_esAbsorbTeammate[admin].g_iHumanDuration = iGetKeyValue(subsection, MT_ABSORB_SECTION, MT_ABSORB_SECTION2, MT_ABSORB_SECTION3, MT_ABSORB_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esAbsorbTeammate[admin].g_iHumanDuration, value, -1, 99999); - g_esAbsorbTeammate[admin].g_iHumanMode = iGetKeyValue(subsection, MT_ABSORB_SECTION, MT_ABSORB_SECTION2, MT_ABSORB_SECTION3, MT_ABSORB_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esAbsorbTeammate[admin].g_iHumanMode, value, -1, 1); + g_esAbsorbTeammate[admin].g_iHumanMode = iGetKeyValue(subsection, MT_ABSORB_SECTION, MT_ABSORB_SECTION2, MT_ABSORB_SECTION3, MT_ABSORB_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esAbsorbTeammate[admin].g_iHumanMode, value, -1, 2); g_esAbsorbTeammate[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_ABSORB_SECTION, MT_ABSORB_SECTION2, MT_ABSORB_SECTION3, MT_ABSORB_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esAbsorbTeammate[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); g_esAbsorbTeammate[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_ABSORB_SECTION, MT_ABSORB_SECTION2, MT_ABSORB_SECTION3, MT_ABSORB_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esAbsorbTeammate[admin].g_iRequiresHumans, value, -1, 32); g_esAbsorbTeammate[admin].g_iAbsorbAbility = iGetKeyValue(subsection, MT_ABSORB_SECTION, MT_ABSORB_SECTION2, MT_ABSORB_SECTION3, MT_ABSORB_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esAbsorbTeammate[admin].g_iAbsorbAbility, value, -1, 1); @@ -723,7 +731,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esAbsorbPlayer[admin].g_iHumanAmmo = iGetKeyValue(subsection, MT_ABSORB_SECTION, MT_ABSORB_SECTION2, MT_ABSORB_SECTION3, MT_ABSORB_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esAbsorbPlayer[admin].g_iHumanAmmo, value, -1, 99999); g_esAbsorbPlayer[admin].g_iHumanCooldown = iGetKeyValue(subsection, MT_ABSORB_SECTION, MT_ABSORB_SECTION2, MT_ABSORB_SECTION3, MT_ABSORB_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esAbsorbPlayer[admin].g_iHumanCooldown, value, -1, 99999); g_esAbsorbPlayer[admin].g_iHumanDuration = iGetKeyValue(subsection, MT_ABSORB_SECTION, MT_ABSORB_SECTION2, MT_ABSORB_SECTION3, MT_ABSORB_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esAbsorbPlayer[admin].g_iHumanDuration, value, -1, 99999); - g_esAbsorbPlayer[admin].g_iHumanMode = iGetKeyValue(subsection, MT_ABSORB_SECTION, MT_ABSORB_SECTION2, MT_ABSORB_SECTION3, MT_ABSORB_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esAbsorbPlayer[admin].g_iHumanMode, value, -1, 1); + g_esAbsorbPlayer[admin].g_iHumanMode = iGetKeyValue(subsection, MT_ABSORB_SECTION, MT_ABSORB_SECTION2, MT_ABSORB_SECTION3, MT_ABSORB_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esAbsorbPlayer[admin].g_iHumanMode, value, -1, 2); g_esAbsorbPlayer[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_ABSORB_SECTION, MT_ABSORB_SECTION2, MT_ABSORB_SECTION3, MT_ABSORB_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esAbsorbPlayer[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); g_esAbsorbPlayer[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_ABSORB_SECTION, MT_ABSORB_SECTION2, MT_ABSORB_SECTION3, MT_ABSORB_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esAbsorbPlayer[admin].g_iRequiresHumans, value, -1, 32); g_esAbsorbPlayer[admin].g_iAbsorbAbility = iGetKeyValue(subsection, MT_ABSORB_SECTION, MT_ABSORB_SECTION2, MT_ABSORB_SECTION3, MT_ABSORB_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esAbsorbPlayer[admin].g_iAbsorbAbility, value, -1, 1); @@ -752,7 +760,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esAbsorbSpecial[type].g_iHumanAmmo = iGetKeyValue(subsection, MT_ABSORB_SECTION, MT_ABSORB_SECTION2, MT_ABSORB_SECTION3, MT_ABSORB_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esAbsorbSpecial[type].g_iHumanAmmo, value, -1, 99999); g_esAbsorbSpecial[type].g_iHumanCooldown = iGetKeyValue(subsection, MT_ABSORB_SECTION, MT_ABSORB_SECTION2, MT_ABSORB_SECTION3, MT_ABSORB_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esAbsorbSpecial[type].g_iHumanCooldown, value, -1, 99999); g_esAbsorbSpecial[type].g_iHumanDuration = iGetKeyValue(subsection, MT_ABSORB_SECTION, MT_ABSORB_SECTION2, MT_ABSORB_SECTION3, MT_ABSORB_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esAbsorbSpecial[type].g_iHumanDuration, value, -1, 99999); - g_esAbsorbSpecial[type].g_iHumanMode = iGetKeyValue(subsection, MT_ABSORB_SECTION, MT_ABSORB_SECTION2, MT_ABSORB_SECTION3, MT_ABSORB_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esAbsorbSpecial[type].g_iHumanMode, value, -1, 1); + g_esAbsorbSpecial[type].g_iHumanMode = iGetKeyValue(subsection, MT_ABSORB_SECTION, MT_ABSORB_SECTION2, MT_ABSORB_SECTION3, MT_ABSORB_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esAbsorbSpecial[type].g_iHumanMode, value, -1, 2); g_esAbsorbSpecial[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_ABSORB_SECTION, MT_ABSORB_SECTION2, MT_ABSORB_SECTION3, MT_ABSORB_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esAbsorbSpecial[type].g_flOpenAreasOnly, value, -1.0, 99999.0); g_esAbsorbSpecial[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_ABSORB_SECTION, MT_ABSORB_SECTION2, MT_ABSORB_SECTION3, MT_ABSORB_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esAbsorbSpecial[type].g_iRequiresHumans, value, -1, 32); g_esAbsorbSpecial[type].g_iAbsorbAbility = iGetKeyValue(subsection, MT_ABSORB_SECTION, MT_ABSORB_SECTION2, MT_ABSORB_SECTION3, MT_ABSORB_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esAbsorbSpecial[type].g_iAbsorbAbility, value, -1, 1); @@ -775,7 +783,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esAbsorbAbility[type].g_iHumanAmmo = iGetKeyValue(subsection, MT_ABSORB_SECTION, MT_ABSORB_SECTION2, MT_ABSORB_SECTION3, MT_ABSORB_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esAbsorbAbility[type].g_iHumanAmmo, value, -1, 99999); g_esAbsorbAbility[type].g_iHumanCooldown = iGetKeyValue(subsection, MT_ABSORB_SECTION, MT_ABSORB_SECTION2, MT_ABSORB_SECTION3, MT_ABSORB_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esAbsorbAbility[type].g_iHumanCooldown, value, -1, 99999); g_esAbsorbAbility[type].g_iHumanDuration = iGetKeyValue(subsection, MT_ABSORB_SECTION, MT_ABSORB_SECTION2, MT_ABSORB_SECTION3, MT_ABSORB_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esAbsorbAbility[type].g_iHumanDuration, value, -1, 99999); - g_esAbsorbAbility[type].g_iHumanMode = iGetKeyValue(subsection, MT_ABSORB_SECTION, MT_ABSORB_SECTION2, MT_ABSORB_SECTION3, MT_ABSORB_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esAbsorbAbility[type].g_iHumanMode, value, -1, 1); + g_esAbsorbAbility[type].g_iHumanMode = iGetKeyValue(subsection, MT_ABSORB_SECTION, MT_ABSORB_SECTION2, MT_ABSORB_SECTION3, MT_ABSORB_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esAbsorbAbility[type].g_iHumanMode, value, -1, 2); g_esAbsorbAbility[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_ABSORB_SECTION, MT_ABSORB_SECTION2, MT_ABSORB_SECTION3, MT_ABSORB_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esAbsorbAbility[type].g_flOpenAreasOnly, value, -1.0, 99999.0); g_esAbsorbAbility[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_ABSORB_SECTION, MT_ABSORB_SECTION2, MT_ABSORB_SECTION3, MT_ABSORB_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esAbsorbAbility[type].g_iRequiresHumans, value, -1, 32); g_esAbsorbAbility[type].g_iAbsorbAbility = iGetKeyValue(subsection, MT_ABSORB_SECTION, MT_ABSORB_SECTION2, MT_ABSORB_SECTION3, MT_ABSORB_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esAbsorbAbility[type].g_iAbsorbAbility, value, -1, 1); @@ -947,10 +955,10 @@ public void MT_OnButtonPressed(int tank, int button) if ((button & MT_MAIN_KEY) && g_esAbsorbCache[tank].g_iAbsorbAbility == 1 && g_esAbsorbCache[tank].g_iHumanAbility == 1) { - int iTime = GetTime(); + int iHumanMode = g_esAbsorbCache[tank].g_iHumanMode, iTime = GetTime(); bool bRecharging = g_esAbsorbPlayer[tank].g_iCooldown != -1 && g_esAbsorbPlayer[tank].g_iCooldown >= iTime; - switch (g_esAbsorbCache[tank].g_iHumanMode) + switch (iHumanMode) { case 0: { @@ -967,9 +975,9 @@ public void MT_OnButtonPressed(int tank, int button) MT_PrintToChat(tank, "%s %t", MT_TAG3, "AbsorbHuman4", (g_esAbsorbPlayer[tank].g_iCooldown - iTime)); } } - case 1: + case 1, 2: { - if (g_esAbsorbPlayer[tank].g_iAmmoCount < g_esAbsorbCache[tank].g_iHumanAmmo && g_esAbsorbCache[tank].g_iHumanAmmo > 0) + if ((iHumanMode == 2 && g_esAbsorbPlayer[tank].g_bActivated) || (g_esAbsorbPlayer[tank].g_iAmmoCount < g_esAbsorbCache[tank].g_iHumanAmmo && g_esAbsorbCache[tank].g_iHumanAmmo > 0)) { if (!g_esAbsorbPlayer[tank].g_bActivated && !bRecharging) { @@ -981,7 +989,15 @@ public void MT_OnButtonPressed(int tank, int button) } else if (g_esAbsorbPlayer[tank].g_bActivated) { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "AbsorbHuman3"); + switch (iHumanMode) + { + case 1: MT_PrintToChat(tank, "%s %t", MT_TAG3, "AbsorbHuman3"); + case 2: + { + vAbsorbReset2(tank); + vAbsorbReset3(tank); + } + } } else if (bRecharging) { @@ -1138,16 +1154,18 @@ void vAbsorbReset3(int tank) } } -void tTimerAbsorbCombo(Handle timer, DataPack pack) +Action tTimerAbsorbCombo(Handle timer, DataPack pack) { pack.Reset(); int iTank = GetClientOfUserId(pack.ReadCell()); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esAbsorbAbility[g_esAbsorbPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esAbsorbPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esAbsorbPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esAbsorbCache[iTank].g_iAbsorbAbility == 0 || g_esAbsorbPlayer[iTank].g_bActivated) { - return; + return Plugin_Stop; } int iPos = pack.ReadCell(); vAbsorb(iTank, iPos); + + return Plugin_Continue; } \ No newline at end of file diff --git a/addons/sourcemod/scripting/mutant_tanks/abilities/mt_acid.sp b/addons/sourcemod/scripting/mutant_tanks/abilities/mt_acid.sp index 722c146e10..4f566511ba 100644 --- a/addons/sourcemod/scripting/mutant_tanks/abilities/mt_acid.sp +++ b/addons/sourcemod/scripting/mutant_tanks/abilities/mt_acid.sp @@ -1,6 +1,6 @@ /** - * Mutant Tanks: a L4D/L4D2 SourceMod Plugin - * Copyright (C) 2024 Alfred "Psyk0tik" Llagas + * Mutant Tanks: A L4D/L4D2 SourceMod Plugin + * Copyright (C) 2017-2025 Alfred "Psyk0tik" Llagas * * 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. * @@ -1436,35 +1436,37 @@ void vAcidReset() } } -void tTimerAcidCombo(Handle timer, DataPack pack) +Action tTimerAcidCombo(Handle timer, DataPack pack) { pack.Reset(); int iTank = GetClientOfUserId(pack.ReadCell()); if (!g_bSecondGame || !MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esAcidAbility[g_esAcidPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esAcidPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esAcidPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esAcidCache[iTank].g_iAcidAbility == 0) { - return; + return Plugin_Stop; } float flRandom = pack.ReadFloat(); int iPos = pack.ReadCell(); vAcidAbility(iTank, flRandom, iPos); + + return Plugin_Continue; } -void tTimerAcidCombo2(Handle timer, DataPack pack) +Action tTimerAcidCombo2(Handle timer, DataPack pack) { pack.Reset(); int iSurvivor = GetClientOfUserId(pack.ReadCell()); if (!g_bSecondGame || !bIsSurvivor(iSurvivor)) { - return; + return Plugin_Stop; } int iTank = GetClientOfUserId(pack.ReadCell()); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esAcidAbility[g_esAcidPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esAcidPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esAcidPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esAcidCache[iTank].g_iAcidHit == 0) { - return; + return Plugin_Stop; } float flRandom = pack.ReadFloat(), flChance = pack.ReadFloat(); @@ -1479,4 +1481,6 @@ void tTimerAcidCombo2(Handle timer, DataPack pack) { vAcidHit(iSurvivor, iTank, flRandom, flChance, g_esAcidCache[iTank].g_iAcidHit, MT_MESSAGE_MELEE, MT_ATTACK_MELEE, iPos); } + + return Plugin_Continue; } \ No newline at end of file diff --git a/addons/sourcemod/scripting/mutant_tanks/abilities/mt_aimless.sp b/addons/sourcemod/scripting/mutant_tanks/abilities/mt_aimless.sp index 9e08c7870d..085ae2e09e 100644 --- a/addons/sourcemod/scripting/mutant_tanks/abilities/mt_aimless.sp +++ b/addons/sourcemod/scripting/mutant_tanks/abilities/mt_aimless.sp @@ -1,6 +1,6 @@ /** - * Mutant Tanks: a L4D/L4D2 SourceMod Plugin - * Copyright (C) 2024 Alfred "Psyk0tik" Llagas + * Mutant Tanks: A L4D/L4D2 SourceMod Plugin + * Copyright (C) 2017-2025 Alfred "Psyk0tik" Llagas * * 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. * @@ -429,7 +429,7 @@ public Action OnPlayerRunCmd(int client, int &buttons, int &impulse, float vel[3 { TeleportEntity(client, .angles = g_esAimlessPlayer[client].g_flAngle); - int iWeapon = GetEntPropEnt(client, Prop_Send, "m_hActiveWeapon"); + int iWeapon = iGetSurvivorActiveWeapon(client); if (iWeapon > MaxClients) { if (g_esAimlessPlayer[client].g_bForced && GetPlayerWeaponSlot(client, 0) == iWeapon) @@ -1159,7 +1159,7 @@ void vAimlessHit(int survivor, int tank, float random, float chance, int enabled float flDuration = (pos != -1) ? MT_GetCombinationSetting(tank, 5, pos) : g_esAimlessCache[tank].g_flAimlessDuration; if (flDuration > 0.0) { - int iWeapon = GetEntPropEnt(survivor, Prop_Send, "m_hActiveWeapon"); + int iWeapon = iGetSurvivorActiveWeapon(survivor); if (iWeapon > MaxClients) { g_esAimlessPlayer[survivor].g_flDuration = GetGameTime() + flDuration; @@ -1270,35 +1270,37 @@ void vStopAimless(int survivor) SetEntPropFloat(survivor, Prop_Send, "m_flNextAttack", 1.0); } -void tTimerAimlessCombo(Handle timer, DataPack pack) +Action tTimerAimlessCombo(Handle timer, DataPack pack) { pack.Reset(); int iTank = GetClientOfUserId(pack.ReadCell()); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esAimlessAbility[g_esAimlessPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esAimlessPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esAimlessPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esAimlessCache[iTank].g_iAimlessAbility == 0) { - return; + return Plugin_Stop; } float flRandom = pack.ReadFloat(); int iPos = pack.ReadCell(); vAimlessAbility(iTank, flRandom, iPos); + + return Plugin_Continue; } -void tTimerAimlessCombo2(Handle timer, DataPack pack) +Action tTimerAimlessCombo2(Handle timer, DataPack pack) { pack.Reset(); int iSurvivor = GetClientOfUserId(pack.ReadCell()); if (!bIsSurvivor(iSurvivor) || g_esAimlessPlayer[iSurvivor].g_bAffected) { - return; + return Plugin_Stop; } int iTank = GetClientOfUserId(pack.ReadCell()); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esAimlessAbility[g_esAimlessPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esAimlessPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esAimlessPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esAimlessCache[iTank].g_iAimlessHit == 0) { - return; + return Plugin_Stop; } float flRandom = pack.ReadFloat(), flChance = pack.ReadFloat(); @@ -1313,9 +1315,11 @@ void tTimerAimlessCombo2(Handle timer, DataPack pack) { vAimlessHit(iSurvivor, iTank, flRandom, flChance, g_esAimlessCache[iTank].g_iAimlessHit, MT_MESSAGE_MELEE, MT_ATTACK_MELEE, iPos); } + + return Plugin_Continue; } -void tTimerStopAimless(Handle timer, DataPack pack) +Action tTimerStopAimless(Handle timer, DataPack pack) { pack.Reset(); @@ -1326,7 +1330,7 @@ void tTimerStopAimless(Handle timer, DataPack pack) g_esAimlessPlayer[iSurvivor].g_bForced = false; g_esAimlessPlayer[iSurvivor].g_iOwner = -1; - return; + return Plugin_Stop; } int iTank = GetClientOfUserId(pack.ReadCell()); @@ -1334,7 +1338,7 @@ void tTimerStopAimless(Handle timer, DataPack pack) { vStopAimless(iSurvivor); - return; + return Plugin_Stop; } vStopAimless(iSurvivor); @@ -1345,4 +1349,6 @@ void tTimerStopAimless(Handle timer, DataPack pack) MT_PrintToChatAll("%s %t", MT_TAG2, "Aimless2", iSurvivor); MT_LogMessage(MT_LOG_ABILITY, "%s %T", MT_TAG, "Aimless2", LANG_SERVER, iSurvivor); } + + return Plugin_Continue; } \ No newline at end of file diff --git a/addons/sourcemod/scripting/mutant_tanks/abilities/mt_ammo.sp b/addons/sourcemod/scripting/mutant_tanks/abilities/mt_ammo.sp index c62181c62c..a6a5b55e31 100644 --- a/addons/sourcemod/scripting/mutant_tanks/abilities/mt_ammo.sp +++ b/addons/sourcemod/scripting/mutant_tanks/abilities/mt_ammo.sp @@ -1,6 +1,6 @@ /** - * Mutant Tanks: a L4D/L4D2 SourceMod Plugin - * Copyright (C) 2024 Alfred "Psyk0tik" Llagas + * Mutant Tanks: A L4D/L4D2 SourceMod Plugin + * Copyright (C) 2017-2025 Alfred "Psyk0tik" Llagas * * 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. * @@ -1141,35 +1141,37 @@ void vAmmoReset() } } -void tTimerAmmoCombo(Handle timer, DataPack pack) +Action tTimerAmmoCombo(Handle timer, DataPack pack) { pack.Reset(); int iTank = GetClientOfUserId(pack.ReadCell()); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esAmmoAbility[g_esAmmoPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esAmmoPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esAmmoPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esAmmoCache[iTank].g_iAmmoAbility == 0) { - return; + return Plugin_Stop; } float flRandom = pack.ReadFloat(); int iPos = pack.ReadCell(); vAmmoAbility(iTank, flRandom, iPos); + + return Plugin_Continue; } -void tTimerAmmoCombo2(Handle timer, DataPack pack) +Action tTimerAmmoCombo2(Handle timer, DataPack pack) { pack.Reset(); int iSurvivor = GetClientOfUserId(pack.ReadCell()); if (!bIsSurvivor(iSurvivor)) { - return; + return Plugin_Stop; } int iTank = GetClientOfUserId(pack.ReadCell()); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esAmmoAbility[g_esAmmoPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esAmmoPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esAmmoPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esAmmoCache[iTank].g_iAmmoHit == 0) { - return; + return Plugin_Stop; } float flRandom = pack.ReadFloat(), flChance = pack.ReadFloat(); @@ -1184,4 +1186,6 @@ void tTimerAmmoCombo2(Handle timer, DataPack pack) { vAmmoHit(iSurvivor, iTank, flRandom, flChance, g_esAmmoCache[iTank].g_iAmmoHit, MT_MESSAGE_MELEE, MT_ATTACK_MELEE, iPos); } + + return Plugin_Continue; } \ No newline at end of file diff --git a/addons/sourcemod/scripting/mutant_tanks/abilities/mt_blind.sp b/addons/sourcemod/scripting/mutant_tanks/abilities/mt_blind.sp deleted file mode 100644 index 3f555d6692..0000000000 --- a/addons/sourcemod/scripting/mutant_tanks/abilities/mt_blind.sp +++ /dev/null @@ -1,1460 +0,0 @@ -/** - * Mutant Tanks: a L4D/L4D2 SourceMod Plugin - * Copyright (C) 2024 Alfred "Psyk0tik" Llagas - * - * 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 . - **/ - -#define MT_BLIND_COMPILE_METHOD 0 // 0: packaged, 1: standalone - -#if !defined MT_ABILITIES_MAIN - #if MT_BLIND_COMPILE_METHOD == 1 - #include - #include - #else - #error This file must be inside "scripting/mutant_tanks/abilities" while compiling "mt_abilities.sp" to include its content. - #endif -public Plugin myinfo = -{ - name = "[MT] Blind Ability", - author = MT_AUTHOR, - description = "The Mutant Tank blinds survivors.", - version = MT_VERSION, - url = MT_URL -}; - -bool g_bDedicated, g_bLateLoad, g_bSecondGame; - -public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max) -{ - switch (GetEngineVersion()) - { - case Engine_Left4Dead: g_bSecondGame = false; - case Engine_Left4Dead2: g_bSecondGame = true; - default: - { - strcopy(error, err_max, "\"[MT] Blind Ability\" only supports Left 4 Dead 1 & 2."); - - return APLRes_SilentFailure; - } - } - - g_bDedicated = IsDedicatedServer(); - g_bLateLoad = late; - - return APLRes_Success; -} - -#define PARTICLE_BASHED "screen_bashed" - -#define SOUND_GROAN1 "ambient/random_amb_sfx/metalscrapeverb08.wav" -#define SOUND_GROAN2 "ambient/random_amb_sounds/randbridgegroan_03.wav" // Only available in L4D2 -#else - #if MT_BLIND_COMPILE_METHOD == 1 - #error This file must be compiled as a standalone plugin. - #endif -#endif - -#define MT_BLIND_SECTION "blindability" -#define MT_BLIND_SECTION2 "blind ability" -#define MT_BLIND_SECTION3 "blind_ability" -#define MT_BLIND_SECTION4 "blind" - -#define MT_MENU_BLIND "Blind Ability" - -enum struct esBlindPlayer -{ - bool g_bAffected; - bool g_bFailed; - bool g_bNoAmmo; - - float g_flBlindChance; - float g_flBlindDuration; - float g_flBlindRange; - float g_flBlindRangeChance; - float g_flCloseAreasOnly; - float g_flOpenAreasOnly; - - int g_iAccessFlags; - int g_iAmmoCount; - int g_iBlindAbility; - int g_iBlindCooldown; - int g_iBlindEffect; - int g_iBlindHit; - int g_iBlindHitMode; - int g_iBlindIntensity; - int g_iBlindMessage; - int g_iBlindMode; - int g_iBlindRangeCooldown; - int g_iBlindSight; - int g_iBlindStagger; - int g_iComboAbility; - int g_iCooldown; - int g_iHumanAbility; - int g_iHumanAmmo; - int g_iHumanCooldown; - int g_iHumanRangeCooldown; - int g_iImmunityFlags; - int g_iOwner; - int g_iRangeCooldown; - int g_iRequiresHumans; - int g_iTankType; - int g_iTankTypeRecorded; -} - -esBlindPlayer g_esBlindPlayer[MAXPLAYERS + 1]; - -enum struct esBlindTeammate -{ - float g_flBlindChance; - float g_flBlindDuration; - float g_flBlindRange; - float g_flBlindRangeChance; - float g_flCloseAreasOnly; - float g_flOpenAreasOnly; - - int g_iBlindAbility; - int g_iBlindCooldown; - int g_iBlindEffect; - int g_iBlindHit; - int g_iBlindHitMode; - int g_iBlindIntensity; - int g_iBlindMessage; - int g_iBlindMode; - int g_iBlindRangeCooldown; - int g_iBlindSight; - int g_iBlindStagger; - int g_iComboAbility; - int g_iHumanAbility; - int g_iHumanAmmo; - int g_iHumanCooldown; - int g_iHumanRangeCooldown; - int g_iRequiresHumans; -} - -esBlindTeammate g_esBlindTeammate[MAXPLAYERS + 1]; - -enum struct esBlindAbility -{ - float g_flBlindChance; - float g_flBlindDuration; - float g_flBlindRange; - float g_flBlindRangeChance; - float g_flCloseAreasOnly; - float g_flOpenAreasOnly; - - int g_iAccessFlags; - int g_iBlindAbility; - int g_iBlindCooldown; - int g_iBlindEffect; - int g_iBlindHit; - int g_iBlindHitMode; - int g_iBlindIntensity; - int g_iBlindMessage; - int g_iBlindMode; - int g_iBlindRangeCooldown; - int g_iBlindSight; - int g_iBlindStagger; - int g_iComboAbility; - int g_iHumanAbility; - int g_iHumanAmmo; - int g_iHumanCooldown; - int g_iHumanRangeCooldown; - int g_iImmunityFlags; - int g_iRequiresHumans; -} - -esBlindAbility g_esBlindAbility[MT_MAXTYPES + 1]; - -enum struct esBlindSpecial -{ - float g_flBlindChance; - float g_flBlindDuration; - float g_flBlindRange; - float g_flBlindRangeChance; - float g_flCloseAreasOnly; - float g_flOpenAreasOnly; - - int g_iBlindAbility; - int g_iBlindCooldown; - int g_iBlindEffect; - int g_iBlindHit; - int g_iBlindHitMode; - int g_iBlindIntensity; - int g_iBlindMessage; - int g_iBlindMode; - int g_iBlindRangeCooldown; - int g_iBlindSight; - int g_iBlindStagger; - int g_iComboAbility; - int g_iHumanAbility; - int g_iHumanAmmo; - int g_iHumanCooldown; - int g_iHumanRangeCooldown; - int g_iRequiresHumans; -} - -esBlindSpecial g_esBlindSpecial[MT_MAXTYPES + 1]; - -enum struct esBlindCache -{ - float g_flBlindChance; - float g_flBlindDuration; - float g_flBlindRange; - float g_flBlindRangeChance; - float g_flCloseAreasOnly; - float g_flOpenAreasOnly; - - int g_iBlindAbility; - int g_iBlindCooldown; - int g_iBlindEffect; - int g_iBlindHit; - int g_iBlindHitMode; - int g_iBlindIntensity; - int g_iBlindMessage; - int g_iBlindMode; - int g_iBlindRangeCooldown; - int g_iBlindSight; - int g_iBlindStagger; - int g_iComboAbility; - int g_iHumanAbility; - int g_iHumanAmmo; - int g_iHumanCooldown; - int g_iHumanRangeCooldown; - int g_iRequiresHumans; -} - -esBlindCache g_esBlindCache[MAXPLAYERS + 1]; - -int g_iBashedParticle = -1; - -UserMsg g_umBlindFade; - -#if defined MT_ABILITIES_MAIN -void vBlindPluginStart() -#else -public void OnPluginStart() -#endif -{ - g_umBlindFade = GetUserMessageId("Fade"); -#if !defined MT_ABILITIES_MAIN - LoadTranslations("common.phrases"); - LoadTranslations("mutant_tanks.phrases"); - LoadTranslations("mutant_tanks_names.phrases"); - - RegConsoleCmd("sm_mt_blind", cmdBlindInfo, "View information about the Blind ability."); - - if (g_bLateLoad) - { - for (int iPlayer = 1; iPlayer <= MaxClients; iPlayer++) - { - if (bIsValidClient(iPlayer, MT_CHECK_INGAME)) - { - OnClientPutInServer(iPlayer); - } - } - - g_bLateLoad = false; - } -#endif -} - -#if defined MT_ABILITIES_MAIN -void vBlindMapStart() -#else -public void OnMapStart() -#endif -{ - g_iBashedParticle = iPrecacheParticle(PARTICLE_BASHED); - - switch (g_bSecondGame) - { - case true: PrecacheSound(SOUND_GROAN2, true); - case false: PrecacheSound(SOUND_GROAN1, true); - } - - vBlindReset(); -} - -#if defined MT_ABILITIES_MAIN -void vBlindClientPutInServer(int client) -#else -public void OnClientPutInServer(int client) -#endif -{ - SDKHook(client, SDKHook_OnTakeDamage, OnBlindTakeDamage); - vBlindReset2(client); -} - -#if defined MT_ABILITIES_MAIN -void vBlindClientDisconnect_Post(int client) -#else -public void OnClientDisconnect_Post(int client) -#endif -{ - vBlindReset2(client); -} - -#if defined MT_ABILITIES_MAIN -void vBlindMapEnd() -#else -public void OnMapEnd() -#endif -{ - vBlindReset(); -} - -#if !defined MT_ABILITIES_MAIN -Action cmdBlindInfo(int client, int args) -{ - client = iGetListenServerHost(client, g_bDedicated); - - if (!MT_IsCorePluginEnabled()) - { - MT_ReplyToCommand(client, "%s %t", MT_TAG5, "PluginDisabled"); - - return Plugin_Handled; - } - - if (!bIsValidClient(client, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_FAKECLIENT)) - { - MT_ReplyToCommand(client, "%s %t", MT_TAG, "Command is in-game only"); - - return Plugin_Handled; - } - - switch (IsVoteInProgress()) - { - case true: MT_ReplyToCommand(client, "%s %t", MT_TAG2, "Vote in Progress"); - case false: vBlindMenu(client, MT_BLIND_SECTION4, 0); - } - - return Plugin_Handled; -} -#endif - -void vBlindMenu(int client, const char[] name, int item) -{ - if (StrContains(MT_BLIND_SECTION4, name, false) == -1) - { - return; - } - - Menu mAbilityMenu = new Menu(iBlindMenuHandler, MENU_ACTIONS_DEFAULT|MenuAction_Display|MenuAction_DisplayItem); - mAbilityMenu.SetTitle("Blind Ability Information"); - mAbilityMenu.AddItem("Status", "Status"); - mAbilityMenu.AddItem("Ammunition", "Ammunition"); - mAbilityMenu.AddItem("Buttons", "Buttons"); - mAbilityMenu.AddItem("Cooldown", "Cooldown"); - mAbilityMenu.AddItem("Details", "Details"); - mAbilityMenu.AddItem("Duration", "Duration"); - mAbilityMenu.AddItem("Human Support", "Human Support"); - mAbilityMenu.AddItem("Range Cooldown", "Range Cooldown"); - mAbilityMenu.DisplayAt(client, item, MENU_TIME_FOREVER); -} - -int iBlindMenuHandler(Menu menu, MenuAction action, int param1, int param2) -{ - switch (action) - { - case MenuAction_End: delete menu; - case MenuAction_Select: - { - switch (param2) - { - case 0: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esBlindCache[param1].g_iBlindAbility == 0) ? "AbilityStatus1" : "AbilityStatus2"); - case 1: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityAmmo", (g_esBlindCache[param1].g_iHumanAmmo - g_esBlindPlayer[param1].g_iAmmoCount), g_esBlindCache[param1].g_iHumanAmmo); - case 2: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtons2"); - case 3: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityCooldown", ((g_esBlindCache[param1].g_iHumanAbility == 1) ? g_esBlindCache[param1].g_iHumanCooldown : g_esBlindCache[param1].g_iBlindCooldown)); - case 4: MT_PrintToChat(param1, "%s %t", MT_TAG3, "BlindDetails"); - case 5: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityDuration", g_esBlindCache[param1].g_flBlindDuration); - case 6: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esBlindCache[param1].g_iHumanAbility == 0) ? "AbilityHumanSupport1" : "AbilityHumanSupport2"); - case 7: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityRangeCooldown", ((g_esBlindCache[param1].g_iHumanAbility == 1) ? g_esBlindCache[param1].g_iHumanRangeCooldown : g_esBlindCache[param1].g_iBlindRangeCooldown)); - } - - if (bIsValidClient(param1, MT_CHECK_INGAME)) - { - vBlindMenu(param1, MT_BLIND_SECTION4, menu.Selection); - } - } - case MenuAction_Display: - { - char sMenuTitle[PLATFORM_MAX_PATH]; - Panel pBlind = view_as(param2); - FormatEx(sMenuTitle, sizeof sMenuTitle, "%T", "BlindMenu", param1); - pBlind.SetTitle(sMenuTitle); - } - case MenuAction_DisplayItem: - { - if (param2 >= 0) - { - char sMenuOption[PLATFORM_MAX_PATH]; - - switch (param2) - { - case 0: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Status", param1); - case 1: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Ammunition", param1); - case 2: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Buttons", param1); - case 3: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Cooldown", param1); - case 4: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Details", param1); - case 5: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Duration", param1); - case 6: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "HumanSupport", param1); - case 7: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "RangeCooldown", param1); - } - - return RedrawMenuItem(sMenuOption); - } - } - } - - return 0; -} - -#if defined MT_ABILITIES_MAIN -void vBlindDisplayMenu(Menu menu) -#else -public void MT_OnDisplayMenu(Menu menu) -#endif -{ - menu.AddItem(MT_MENU_BLIND, MT_MENU_BLIND); -} - -#if defined MT_ABILITIES_MAIN -void vBlindMenuItemSelected(int client, const char[] info) -#else -public void MT_OnMenuItemSelected(int client, const char[] info) -#endif -{ - if (StrEqual(info, MT_MENU_BLIND, false)) - { - vBlindMenu(client, MT_BLIND_SECTION4, 0); - } -} - -#if defined MT_ABILITIES_MAIN -void vBlindMenuItemDisplayed(int client, const char[] info, char[] buffer, int size) -#else -public void MT_OnMenuItemDisplayed(int client, const char[] info, char[] buffer, int size) -#endif -{ - if (StrEqual(info, MT_MENU_BLIND, false)) - { - FormatEx(buffer, size, "%T", "BlindMenu2", client); - } -} - -Action OnBlindTakeDamage(int victim, int &attacker, int &inflictor, float &damage, int &damagetype) -{ - if (MT_IsCorePluginEnabled() && bIsValidClient(victim, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_ALIVE) && damage > 0.0) - { - char sClassname[32]; - if (bIsValidEntity(inflictor)) - { - GetEntityClassname(inflictor, sClassname, sizeof sClassname); - } - - if (MT_IsTankSupported(attacker) && MT_IsCustomTankSupported(attacker) && (g_esBlindCache[attacker].g_iBlindHitMode == 0 || g_esBlindCache[attacker].g_iBlindHitMode == 1) && bIsSurvivor(victim) && g_esBlindCache[attacker].g_iComboAbility == 0) - { - if ((!MT_HasAdminAccess(attacker) && !bHasAdminAccess(attacker, g_esBlindAbility[g_esBlindPlayer[attacker].g_iTankTypeRecorded].g_iAccessFlags, g_esBlindPlayer[attacker].g_iAccessFlags)) || MT_IsAdminImmune(victim, attacker) || bIsAdminImmune(victim, g_esBlindPlayer[attacker].g_iTankType, g_esBlindAbility[g_esBlindPlayer[attacker].g_iTankTypeRecorded].g_iImmunityFlags, g_esBlindPlayer[victim].g_iImmunityFlags)) - { - return Plugin_Continue; - } - - bool bCaught = bIsSurvivorCaught(victim); - if ((bIsSpecialInfected(attacker) && (bCaught || (!bCaught && (damagetype & DMG_CLUB)) || (bIsSpitter(attacker) && StrEqual(sClassname, "insect_swarm")))) || StrEqual(sClassname[7], "tank_claw") || StrEqual(sClassname, "tank_rock")) - { - vBlindHit(victim, attacker, GetRandomFloat(0.1, 100.0), g_esBlindCache[attacker].g_flBlindChance, g_esBlindCache[attacker].g_iBlindHit, MT_MESSAGE_MELEE, MT_ATTACK_CLAW); - } - } - else if (MT_IsTankSupported(victim) && MT_IsCustomTankSupported(victim) && (g_esBlindCache[victim].g_iBlindHitMode == 0 || g_esBlindCache[victim].g_iBlindHitMode == 2) && bIsSurvivor(attacker) && g_esBlindCache[victim].g_iComboAbility == 0) - { - if ((!MT_HasAdminAccess(victim) && !bHasAdminAccess(victim, g_esBlindAbility[g_esBlindPlayer[victim].g_iTankTypeRecorded].g_iAccessFlags, g_esBlindPlayer[victim].g_iAccessFlags)) || MT_IsAdminImmune(attacker, victim) || bIsAdminImmune(attacker, g_esBlindPlayer[victim].g_iTankType, g_esBlindAbility[g_esBlindPlayer[victim].g_iTankTypeRecorded].g_iImmunityFlags, g_esBlindPlayer[attacker].g_iImmunityFlags)) - { - return Plugin_Continue; - } - - if (StrEqual(sClassname[7], "melee")) - { - vBlindHit(attacker, victim, GetRandomFloat(0.1, 100.0), g_esBlindCache[victim].g_flBlindChance, g_esBlindCache[victim].g_iBlindHit, MT_MESSAGE_MELEE, MT_ATTACK_MELEE); - } - } - } - - return Plugin_Continue; -} - -#if defined MT_ABILITIES_MAIN -void vBlindPluginCheck(ArrayList list) -#else -public void MT_OnPluginCheck(ArrayList list) -#endif -{ - list.PushString(MT_MENU_BLIND); -} - -#if defined MT_ABILITIES_MAIN -void vBlindAbilityCheck(ArrayList list, ArrayList list2, ArrayList list3, ArrayList list4) -#else -public void MT_OnAbilityCheck(ArrayList list, ArrayList list2, ArrayList list3, ArrayList list4) -#endif -{ - list.PushString(MT_BLIND_SECTION); - list2.PushString(MT_BLIND_SECTION2); - list3.PushString(MT_BLIND_SECTION3); - list4.PushString(MT_BLIND_SECTION4); -} - -#if defined MT_ABILITIES_MAIN -void vBlindCombineAbilities(int tank, int type, const float random, const char[] combo, int survivor, const char[] classname) -#else -public void MT_OnCombineAbilities(int tank, int type, const float random, const char[] combo, int survivor, int weapon, const char[] classname) -#endif -{ - if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esBlindCache[tank].g_iHumanAbility != 2) - { - return; - } - - char sCombo[320], sSet[4][32]; - FormatEx(sCombo, sizeof sCombo, ",%s,", combo); - FormatEx(sSet[0], sizeof sSet[], ",%s,", MT_BLIND_SECTION); - FormatEx(sSet[1], sizeof sSet[], ",%s,", MT_BLIND_SECTION2); - FormatEx(sSet[2], sizeof sSet[], ",%s,", MT_BLIND_SECTION3); - FormatEx(sSet[3], sizeof sSet[], ",%s,", MT_BLIND_SECTION4); - if (g_esBlindCache[tank].g_iComboAbility == 1 && (StrContains(sCombo, sSet[0], false) != -1 || StrContains(sCombo, sSet[1], false) != -1 || StrContains(sCombo, sSet[2], false) != -1 || StrContains(sCombo, sSet[3], false) != -1)) - { - char sAbilities[320], sSubset[10][32]; - strcopy(sAbilities, sizeof sAbilities, combo); - ExplodeString(sAbilities, ",", sSubset, sizeof sSubset, sizeof sSubset[]); - - float flChance = 0.0, flDelay = 0.0; - for (int iPos = 0; iPos < (sizeof sSubset); iPos++) - { - if (StrEqual(sSubset[iPos], MT_BLIND_SECTION, false) || StrEqual(sSubset[iPos], MT_BLIND_SECTION2, false) || StrEqual(sSubset[iPos], MT_BLIND_SECTION3, false) || StrEqual(sSubset[iPos], MT_BLIND_SECTION4, false)) - { - flDelay = MT_GetCombinationSetting(tank, 4, iPos); - - switch (type) - { - case MT_COMBO_MAINRANGE: - { - if (g_esBlindCache[tank].g_iBlindAbility == 1) - { - switch (flDelay) - { - case 0.0: vBlindAbility(tank, random, iPos); - default: - { - DataPack dpCombo; - CreateDataTimer(flDelay, tTimerBlindCombo, dpCombo, TIMER_FLAG_NO_MAPCHANGE); - dpCombo.WriteCell(GetClientUserId(tank)); - dpCombo.WriteFloat(random); - dpCombo.WriteCell(iPos); - } - } - } - } - case MT_COMBO_MELEEHIT: - { - flChance = MT_GetCombinationSetting(tank, 1, iPos); - - switch (flDelay) - { - case 0.0: - { - if ((g_esBlindCache[tank].g_iBlindHitMode == 0 || g_esBlindCache[tank].g_iBlindHitMode == 1) && (StrEqual(classname[7], "tank_claw") || StrEqual(classname, "tank_rock"))) - { - vBlindHit(survivor, tank, random, flChance, g_esBlindCache[tank].g_iBlindHit, MT_MESSAGE_MELEE, MT_ATTACK_CLAW, iPos); - } - else if ((g_esBlindCache[tank].g_iBlindHitMode == 0 || g_esBlindCache[tank].g_iBlindHitMode == 2) && StrEqual(classname[7], "melee")) - { - vBlindHit(survivor, tank, random, flChance, g_esBlindCache[tank].g_iBlindHit, MT_MESSAGE_MELEE, MT_ATTACK_MELEE, iPos); - } - } - default: - { - DataPack dpCombo; - CreateDataTimer(flDelay, tTimerBlindCombo2, dpCombo, TIMER_FLAG_NO_MAPCHANGE); - dpCombo.WriteCell(GetClientUserId(survivor)); - dpCombo.WriteCell(GetClientUserId(tank)); - dpCombo.WriteFloat(random); - dpCombo.WriteFloat(flChance); - dpCombo.WriteCell(iPos); - dpCombo.WriteString(classname); - } - } - } - } - - break; - } - } - } -} - -#if defined MT_ABILITIES_MAIN -void vBlindConfigsLoad(int mode) -#else -public void MT_OnConfigsLoad(int mode) -#endif -{ - switch (mode) - { - case 1: - { - for (int iIndex = MT_GetMinType(); iIndex <= MT_GetMaxType(); iIndex++) - { - g_esBlindAbility[iIndex].g_iAccessFlags = 0; - g_esBlindAbility[iIndex].g_iImmunityFlags = 0; - g_esBlindAbility[iIndex].g_flCloseAreasOnly = 0.0; - g_esBlindAbility[iIndex].g_iComboAbility = 0; - g_esBlindAbility[iIndex].g_iHumanAbility = 0; - g_esBlindAbility[iIndex].g_iHumanAmmo = 5; - g_esBlindAbility[iIndex].g_iHumanCooldown = 0; - g_esBlindAbility[iIndex].g_iHumanRangeCooldown = 0; - g_esBlindAbility[iIndex].g_flOpenAreasOnly = 0.0; - g_esBlindAbility[iIndex].g_iRequiresHumans = 1; - g_esBlindAbility[iIndex].g_iBlindAbility = 0; - g_esBlindAbility[iIndex].g_iBlindEffect = 0; - g_esBlindAbility[iIndex].g_iBlindMessage = 0; - g_esBlindAbility[iIndex].g_flBlindChance = 33.3; - g_esBlindAbility[iIndex].g_iBlindCooldown = 0; - g_esBlindAbility[iIndex].g_flBlindDuration = 5.0; - g_esBlindAbility[iIndex].g_iBlindHit = 0; - g_esBlindAbility[iIndex].g_iBlindHitMode = 0; - g_esBlindAbility[iIndex].g_iBlindIntensity = 255; - g_esBlindAbility[iIndex].g_iBlindMode = 0; - g_esBlindAbility[iIndex].g_flBlindRange = 150.0; - g_esBlindAbility[iIndex].g_flBlindRangeChance = 15.0; - g_esBlindAbility[iIndex].g_iBlindRangeCooldown = 0; - g_esBlindAbility[iIndex].g_iBlindSight = 0; - g_esBlindAbility[iIndex].g_iBlindStagger = 3; - - g_esBlindSpecial[iIndex].g_flCloseAreasOnly = -1.0; - g_esBlindSpecial[iIndex].g_iComboAbility = -1; - g_esBlindSpecial[iIndex].g_iHumanAbility = -1; - g_esBlindSpecial[iIndex].g_iHumanAmmo = -1; - g_esBlindSpecial[iIndex].g_iHumanCooldown = -1; - g_esBlindSpecial[iIndex].g_iHumanRangeCooldown = -1; - g_esBlindSpecial[iIndex].g_flOpenAreasOnly = -1.0; - g_esBlindSpecial[iIndex].g_iRequiresHumans = -1; - g_esBlindSpecial[iIndex].g_iBlindAbility = -1; - g_esBlindSpecial[iIndex].g_iBlindEffect = -1; - g_esBlindSpecial[iIndex].g_iBlindMessage = -1; - g_esBlindSpecial[iIndex].g_flBlindChance = -1.0; - g_esBlindSpecial[iIndex].g_iBlindCooldown = -1; - g_esBlindSpecial[iIndex].g_flBlindDuration = -1.0; - g_esBlindSpecial[iIndex].g_iBlindHit = -1; - g_esBlindSpecial[iIndex].g_iBlindHitMode = -1; - g_esBlindSpecial[iIndex].g_iBlindIntensity = -1; - g_esBlindSpecial[iIndex].g_iBlindMode = -1; - g_esBlindSpecial[iIndex].g_flBlindRange = -1.0; - g_esBlindSpecial[iIndex].g_flBlindRangeChance = -1.0; - g_esBlindSpecial[iIndex].g_iBlindRangeCooldown = -1; - g_esBlindSpecial[iIndex].g_iBlindSight = -1; - g_esBlindSpecial[iIndex].g_iBlindStagger = -1; - } - } - case 3: - { - for (int iPlayer = 1; iPlayer <= MaxClients; iPlayer++) - { - g_esBlindPlayer[iPlayer].g_iAccessFlags = -1; - g_esBlindPlayer[iPlayer].g_iImmunityFlags = -1; - g_esBlindPlayer[iPlayer].g_flCloseAreasOnly = -1.0; - g_esBlindPlayer[iPlayer].g_iComboAbility = -1; - g_esBlindPlayer[iPlayer].g_iHumanAbility = -1; - g_esBlindPlayer[iPlayer].g_iHumanAmmo = -1; - g_esBlindPlayer[iPlayer].g_iHumanCooldown = -1; - g_esBlindPlayer[iPlayer].g_iHumanRangeCooldown = -1; - g_esBlindPlayer[iPlayer].g_flOpenAreasOnly = -1.0; - g_esBlindPlayer[iPlayer].g_iRequiresHumans = -1; - g_esBlindPlayer[iPlayer].g_iBlindAbility = -1; - g_esBlindPlayer[iPlayer].g_iBlindEffect = -1; - g_esBlindPlayer[iPlayer].g_iBlindMessage = -1; - g_esBlindPlayer[iPlayer].g_flBlindChance = -1.0; - g_esBlindPlayer[iPlayer].g_iBlindCooldown = -1; - g_esBlindPlayer[iPlayer].g_flBlindDuration = -1.0; - g_esBlindPlayer[iPlayer].g_iBlindHit = -1; - g_esBlindPlayer[iPlayer].g_iBlindHitMode = -1; - g_esBlindPlayer[iPlayer].g_iBlindIntensity = -1; - g_esBlindPlayer[iPlayer].g_iBlindMode = -1; - g_esBlindPlayer[iPlayer].g_flBlindRange = -1.0; - g_esBlindPlayer[iPlayer].g_flBlindRangeChance = -1.0; - g_esBlindPlayer[iPlayer].g_iBlindRangeCooldown = -1; - g_esBlindPlayer[iPlayer].g_iBlindSight = -1; - g_esBlindPlayer[iPlayer].g_iBlindStagger = -1; - - g_esBlindTeammate[iPlayer].g_flCloseAreasOnly = -1.0; - g_esBlindTeammate[iPlayer].g_iComboAbility = -1; - g_esBlindTeammate[iPlayer].g_iHumanAbility = -1; - g_esBlindTeammate[iPlayer].g_iHumanAmmo = -1; - g_esBlindTeammate[iPlayer].g_iHumanCooldown = -1; - g_esBlindTeammate[iPlayer].g_iHumanRangeCooldown = -1; - g_esBlindTeammate[iPlayer].g_flOpenAreasOnly = -1.0; - g_esBlindTeammate[iPlayer].g_iRequiresHumans = -1; - g_esBlindTeammate[iPlayer].g_iBlindAbility = -1; - g_esBlindTeammate[iPlayer].g_iBlindEffect = -1; - g_esBlindTeammate[iPlayer].g_iBlindMessage = -1; - g_esBlindTeammate[iPlayer].g_flBlindChance = -1.0; - g_esBlindTeammate[iPlayer].g_iBlindCooldown = -1; - g_esBlindTeammate[iPlayer].g_flBlindDuration = -1.0; - g_esBlindTeammate[iPlayer].g_iBlindHit = -1; - g_esBlindTeammate[iPlayer].g_iBlindHitMode = -1; - g_esBlindTeammate[iPlayer].g_iBlindIntensity = -1; - g_esBlindTeammate[iPlayer].g_iBlindMode = -1; - g_esBlindTeammate[iPlayer].g_flBlindRange = -1.0; - g_esBlindTeammate[iPlayer].g_flBlindRangeChance = -1.0; - g_esBlindTeammate[iPlayer].g_iBlindRangeCooldown = -1; - g_esBlindTeammate[iPlayer].g_iBlindSight = -1; - g_esBlindTeammate[iPlayer].g_iBlindStagger = -1; - } - } - } -} - -#if defined MT_ABILITIES_MAIN -void vBlindConfigsLoaded(const char[] subsection, const char[] key, const char[] value, int type, int admin, int mode, bool special, const char[] specsection) -#else -public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const char[] value, int type, int admin, int mode, bool special, const char[] specsection) -#endif -{ - if ((mode == -1 || mode == 3) && bIsValidClient(admin)) - { - if (special && specsection[0] != '\0') - { - g_esBlindTeammate[admin].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esBlindTeammate[admin].g_flCloseAreasOnly, value, -1.0, 99999.0); - g_esBlindTeammate[admin].g_iComboAbility = iGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "ComboAbility", "Combo Ability", "Combo_Ability", "combo", g_esBlindTeammate[admin].g_iComboAbility, value, -1, 1); - g_esBlindTeammate[admin].g_iHumanAbility = iGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esBlindTeammate[admin].g_iHumanAbility, value, -1, 2); - g_esBlindTeammate[admin].g_iHumanAmmo = iGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esBlindTeammate[admin].g_iHumanAmmo, value, -1, 99999); - g_esBlindTeammate[admin].g_iHumanCooldown = iGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esBlindTeammate[admin].g_iHumanCooldown, value, -1, 99999); - g_esBlindTeammate[admin].g_iHumanRangeCooldown = iGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "HumanRangeCooldown", "Human Range Cooldown", "Human_Range_Cooldown", "hrangecooldown", g_esBlindTeammate[admin].g_iHumanRangeCooldown, value, -1, 99999); - g_esBlindTeammate[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esBlindTeammate[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); - g_esBlindTeammate[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esBlindTeammate[admin].g_iRequiresHumans, value, -1, 32); - g_esBlindTeammate[admin].g_iBlindAbility = iGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esBlindTeammate[admin].g_iBlindAbility, value, -1, 1); - g_esBlindTeammate[admin].g_iBlindEffect = iGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "AbilityEffect", "Ability Effect", "Ability_Effect", "effect", g_esBlindTeammate[admin].g_iBlindEffect, value, -1, 7); - g_esBlindTeammate[admin].g_iBlindMessage = iGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esBlindTeammate[admin].g_iBlindMessage, value, -1, 3); - g_esBlindTeammate[admin].g_iBlindSight = iGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "AbilitySight", "Ability Sight", "Ability_Sight", "sight", g_esBlindTeammate[admin].g_iBlindSight, value, -1, 5); - g_esBlindTeammate[admin].g_flBlindChance = flGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "BlindChance", "Blind Chance", "Blind_Chance", "chance", g_esBlindTeammate[admin].g_flBlindChance, value, -1.0, 100.0); - g_esBlindTeammate[admin].g_iBlindCooldown = iGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "BlindCooldown", "Blind Cooldown", "Blind_Cooldown", "cooldown", g_esBlindTeammate[admin].g_iBlindCooldown, value, -1, 99999); - g_esBlindTeammate[admin].g_flBlindDuration = flGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "BlindDuration", "Blind Duration", "Blind_Duration", "duration", g_esBlindTeammate[admin].g_flBlindDuration, value, -1.0, 99999.0); - g_esBlindTeammate[admin].g_iBlindHit = iGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "BlindHit", "Blind Hit", "Blind_Hit", "hit", g_esBlindTeammate[admin].g_iBlindHit, value, -1, 1); - g_esBlindTeammate[admin].g_iBlindHitMode = iGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "BlindHitMode", "Blind Hit Mode", "Blind_Hit_Mode", "hitmode", g_esBlindTeammate[admin].g_iBlindHitMode, value, -1, 2); - g_esBlindTeammate[admin].g_iBlindIntensity = iGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "BlindIntensity", "Blind Intensity", "Blind_Intensity", "intensity", g_esBlindTeammate[admin].g_iBlindIntensity, value, -1, 255); - g_esBlindTeammate[admin].g_iBlindMode = iGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "BlindMode", "Blind Mode", "Blind_Mode", "mode", g_esBlindTeammate[admin].g_iBlindMode, value, -1, 1); - g_esBlindTeammate[admin].g_flBlindRange = flGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "BlindRange", "Blind Range", "Blind_Range", "range", g_esBlindTeammate[admin].g_flBlindRange, value, -1.0, 99999.0); - g_esBlindTeammate[admin].g_flBlindRangeChance = flGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "BlindRangeChance", "Blind Range Chance", "Blind_Range_Chance", "rangechance", g_esBlindTeammate[admin].g_flBlindRangeChance, value, -1.0, 100.0); - g_esBlindTeammate[admin].g_iBlindRangeCooldown = iGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "BlindRangeCooldown", "Blind Range Cooldown", "Blind_Range_Cooldown", "rangecooldown", g_esBlindTeammate[admin].g_iBlindRangeCooldown, value, -1, 99999); - g_esBlindTeammate[admin].g_iBlindStagger = iGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "BlindStagger", "Blind Stagger", "Blind_Stagger", "stagger", g_esBlindTeammate[admin].g_iBlindStagger, value, -1, 3); - } - else - { - g_esBlindPlayer[admin].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esBlindPlayer[admin].g_flCloseAreasOnly, value, -1.0, 99999.0); - g_esBlindPlayer[admin].g_iComboAbility = iGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "ComboAbility", "Combo Ability", "Combo_Ability", "combo", g_esBlindPlayer[admin].g_iComboAbility, value, -1, 1); - g_esBlindPlayer[admin].g_iHumanAbility = iGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esBlindPlayer[admin].g_iHumanAbility, value, -1, 2); - g_esBlindPlayer[admin].g_iHumanAmmo = iGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esBlindPlayer[admin].g_iHumanAmmo, value, -1, 99999); - g_esBlindPlayer[admin].g_iHumanCooldown = iGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esBlindPlayer[admin].g_iHumanCooldown, value, -1, 99999); - g_esBlindPlayer[admin].g_iHumanRangeCooldown = iGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "HumanRangeCooldown", "Human Range Cooldown", "Human_Range_Cooldown", "hrangecooldown", g_esBlindPlayer[admin].g_iHumanRangeCooldown, value, -1, 99999); - g_esBlindPlayer[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esBlindPlayer[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); - g_esBlindPlayer[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esBlindPlayer[admin].g_iRequiresHumans, value, -1, 32); - g_esBlindPlayer[admin].g_iBlindAbility = iGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esBlindPlayer[admin].g_iBlindAbility, value, -1, 1); - g_esBlindPlayer[admin].g_iBlindEffect = iGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "AbilityEffect", "Ability Effect", "Ability_Effect", "effect", g_esBlindPlayer[admin].g_iBlindEffect, value, -1, 7); - g_esBlindPlayer[admin].g_iBlindMessage = iGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esBlindPlayer[admin].g_iBlindMessage, value, -1, 3); - g_esBlindPlayer[admin].g_iBlindSight = iGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "AbilitySight", "Ability Sight", "Ability_Sight", "sight", g_esBlindPlayer[admin].g_iBlindSight, value, -1, 5); - g_esBlindPlayer[admin].g_flBlindChance = flGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "BlindChance", "Blind Chance", "Blind_Chance", "chance", g_esBlindPlayer[admin].g_flBlindChance, value, -1.0, 100.0); - g_esBlindPlayer[admin].g_iBlindCooldown = iGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "BlindCooldown", "Blind Cooldown", "Blind_Cooldown", "cooldown", g_esBlindPlayer[admin].g_iBlindCooldown, value, -1, 99999); - g_esBlindPlayer[admin].g_flBlindDuration = flGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "BlindDuration", "Blind Duration", "Blind_Duration", "duration", g_esBlindPlayer[admin].g_flBlindDuration, value, -1.0, 99999.0); - g_esBlindPlayer[admin].g_iBlindHit = iGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "BlindHit", "Blind Hit", "Blind_Hit", "hit", g_esBlindPlayer[admin].g_iBlindHit, value, -1, 1); - g_esBlindPlayer[admin].g_iBlindHitMode = iGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "BlindHitMode", "Blind Hit Mode", "Blind_Hit_Mode", "hitmode", g_esBlindPlayer[admin].g_iBlindHitMode, value, -1, 2); - g_esBlindPlayer[admin].g_iBlindIntensity = iGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "BlindIntensity", "Blind Intensity", "Blind_Intensity", "intensity", g_esBlindPlayer[admin].g_iBlindIntensity, value, -1, 255); - g_esBlindPlayer[admin].g_iBlindMode = iGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "BlindMode", "Blind Mode", "Blind_Mode", "mode", g_esBlindPlayer[admin].g_iBlindMode, value, -1, 1); - g_esBlindPlayer[admin].g_flBlindRange = flGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "BlindRange", "Blind Range", "Blind_Range", "range", g_esBlindPlayer[admin].g_flBlindRange, value, -1.0, 99999.0); - g_esBlindPlayer[admin].g_flBlindRangeChance = flGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "BlindRangeChance", "Blind Range Chance", "Blind_Range_Chance", "rangechance", g_esBlindPlayer[admin].g_flBlindRangeChance, value, -1.0, 100.0); - g_esBlindPlayer[admin].g_iBlindRangeCooldown = iGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "BlindRangeCooldown", "Blind Range Cooldown", "Blind_Range_Cooldown", "rangecooldown", g_esBlindPlayer[admin].g_iBlindRangeCooldown, value, -1, 99999); - g_esBlindPlayer[admin].g_iBlindStagger = iGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "BlindStagger", "Blind Stagger", "Blind_Stagger", "stagger", g_esBlindPlayer[admin].g_iBlindStagger, value, -1, 3); - g_esBlindPlayer[admin].g_iAccessFlags = iGetAdminFlagsValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "AccessFlags", "Access Flags", "Access_Flags", "access", value); - g_esBlindPlayer[admin].g_iImmunityFlags = iGetAdminFlagsValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "ImmunityFlags", "Immunity Flags", "Immunity_Flags", "immunity", value); - } - } - - if (mode < 3 && type > 0) - { - if (special && specsection[0] != '\0') - { - g_esBlindSpecial[type].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "openareas", g_esBlindSpecial[type].g_flCloseAreasOnly, value, -1.0, 99999.0); - g_esBlindSpecial[type].g_iComboAbility = iGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "ComboAbility", "Combo Ability", "Combo_Ability", "combo", g_esBlindSpecial[type].g_iComboAbility, value, -1, 1); - g_esBlindSpecial[type].g_iHumanAbility = iGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esBlindSpecial[type].g_iHumanAbility, value, -1, 2); - g_esBlindSpecial[type].g_iHumanAmmo = iGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esBlindSpecial[type].g_iHumanAmmo, value, -1, 99999); - g_esBlindSpecial[type].g_iHumanCooldown = iGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esBlindSpecial[type].g_iHumanCooldown, value, -1, 99999); - g_esBlindSpecial[type].g_iHumanRangeCooldown = iGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "HumanRangeCooldown", "Human Range Cooldown", "Human_Range_Cooldown", "hrangecooldown", g_esBlindSpecial[type].g_iHumanRangeCooldown, value, -1, 99999); - g_esBlindSpecial[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esBlindSpecial[type].g_flOpenAreasOnly, value, -1.0, 99999.0); - g_esBlindSpecial[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esBlindSpecial[type].g_iRequiresHumans, value, -1, 32); - g_esBlindSpecial[type].g_iBlindAbility = iGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esBlindSpecial[type].g_iBlindAbility, value, -1, 1); - g_esBlindSpecial[type].g_iBlindEffect = iGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "AbilityEffect", "Ability Effect", "Ability_Effect", "effect", g_esBlindSpecial[type].g_iBlindEffect, value, -1, 7); - g_esBlindSpecial[type].g_iBlindMessage = iGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esBlindSpecial[type].g_iBlindMessage, value, -1, 3); - g_esBlindSpecial[type].g_iBlindSight = iGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "AbilitySight", "Ability Sight", "Ability_Sight", "sight", g_esBlindSpecial[type].g_iBlindSight, value, -1, 5); - g_esBlindSpecial[type].g_flBlindChance = flGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "BlindChance", "Blind Chance", "Blind_Chance", "chance", g_esBlindSpecial[type].g_flBlindChance, value, -1.0, 100.0); - g_esBlindSpecial[type].g_iBlindCooldown = iGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "BlindCooldown", "Blind Cooldown", "Blind_Cooldown", "cooldown", g_esBlindSpecial[type].g_iBlindCooldown, value, -1, 99999); - g_esBlindSpecial[type].g_flBlindDuration = flGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "BlindDuration", "Blind Duration", "Blind_Duration", "duration", g_esBlindSpecial[type].g_flBlindDuration, value, -1.0, 99999.0); - g_esBlindSpecial[type].g_iBlindHit = iGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "BlindHit", "Blind Hit", "Blind_Hit", "hit", g_esBlindSpecial[type].g_iBlindHit, value, -1, 1); - g_esBlindSpecial[type].g_iBlindHitMode = iGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "BlindHitMode", "Blind Hit Mode", "Blind_Hit_Mode", "hitmode", g_esBlindSpecial[type].g_iBlindHitMode, value, -1, 2); - g_esBlindSpecial[type].g_iBlindIntensity = iGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "BlindIntensity", "Blind Intensity", "Blind_Intensity", "intensity", g_esBlindSpecial[type].g_iBlindIntensity, value, -1, 255); - g_esBlindSpecial[type].g_iBlindMode = iGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "BlindMode", "Blind Mode", "Blind_Mode", "mode", g_esBlindSpecial[type].g_iBlindMode, value, -1, 1); - g_esBlindSpecial[type].g_flBlindRange = flGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "BlindRange", "Blind Range", "Blind_Range", "range", g_esBlindSpecial[type].g_flBlindRange, value, -1.0, 99999.0); - g_esBlindSpecial[type].g_flBlindRangeChance = flGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "BlindRangeChance", "Blind Range Chance", "Blind_Range_Chance", "rangechance", g_esBlindSpecial[type].g_flBlindRangeChance, value, -1.0, 100.0); - g_esBlindSpecial[type].g_iBlindRangeCooldown = iGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "BlindRangeCooldown", "Blind Range Cooldown", "Blind_Range_Cooldown", "rangecooldown", g_esBlindSpecial[type].g_iBlindRangeCooldown, value, -1, 99999); - g_esBlindSpecial[type].g_iBlindStagger = iGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "BlindStagger", "Blind Stagger", "Blind_Stagger", "stagger", g_esBlindSpecial[type].g_iBlindStagger, value, -1, 3); - } - else - { - g_esBlindAbility[type].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "openareas", g_esBlindAbility[type].g_flCloseAreasOnly, value, -1.0, 99999.0); - g_esBlindAbility[type].g_iComboAbility = iGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "ComboAbility", "Combo Ability", "Combo_Ability", "combo", g_esBlindAbility[type].g_iComboAbility, value, -1, 1); - g_esBlindAbility[type].g_iHumanAbility = iGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esBlindAbility[type].g_iHumanAbility, value, -1, 2); - g_esBlindAbility[type].g_iHumanAmmo = iGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esBlindAbility[type].g_iHumanAmmo, value, -1, 99999); - g_esBlindAbility[type].g_iHumanCooldown = iGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esBlindAbility[type].g_iHumanCooldown, value, -1, 99999); - g_esBlindAbility[type].g_iHumanRangeCooldown = iGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "HumanRangeCooldown", "Human Range Cooldown", "Human_Range_Cooldown", "hrangecooldown", g_esBlindAbility[type].g_iHumanRangeCooldown, value, -1, 99999); - g_esBlindAbility[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esBlindAbility[type].g_flOpenAreasOnly, value, -1.0, 99999.0); - g_esBlindAbility[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esBlindAbility[type].g_iRequiresHumans, value, -1, 32); - g_esBlindAbility[type].g_iBlindAbility = iGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esBlindAbility[type].g_iBlindAbility, value, -1, 1); - g_esBlindAbility[type].g_iBlindEffect = iGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "AbilityEffect", "Ability Effect", "Ability_Effect", "effect", g_esBlindAbility[type].g_iBlindEffect, value, -1, 7); - g_esBlindAbility[type].g_iBlindMessage = iGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esBlindAbility[type].g_iBlindMessage, value, -1, 3); - g_esBlindAbility[type].g_iBlindSight = iGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "AbilitySight", "Ability Sight", "Ability_Sight", "sight", g_esBlindAbility[type].g_iBlindSight, value, -1, 5); - g_esBlindAbility[type].g_flBlindChance = flGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "BlindChance", "Blind Chance", "Blind_Chance", "chance", g_esBlindAbility[type].g_flBlindChance, value, -1.0, 100.0); - g_esBlindAbility[type].g_iBlindCooldown = iGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "BlindCooldown", "Blind Cooldown", "Blind_Cooldown", "cooldown", g_esBlindAbility[type].g_iBlindCooldown, value, -1, 99999); - g_esBlindAbility[type].g_flBlindDuration = flGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "BlindDuration", "Blind Duration", "Blind_Duration", "duration", g_esBlindAbility[type].g_flBlindDuration, value, -1.0, 99999.0); - g_esBlindAbility[type].g_iBlindHit = iGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "BlindHit", "Blind Hit", "Blind_Hit", "hit", g_esBlindAbility[type].g_iBlindHit, value, -1, 1); - g_esBlindAbility[type].g_iBlindHitMode = iGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "BlindHitMode", "Blind Hit Mode", "Blind_Hit_Mode", "hitmode", g_esBlindAbility[type].g_iBlindHitMode, value, -1, 2); - g_esBlindAbility[type].g_iBlindIntensity = iGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "BlindIntensity", "Blind Intensity", "Blind_Intensity", "intensity", g_esBlindAbility[type].g_iBlindIntensity, value, -1, 255); - g_esBlindAbility[type].g_iBlindMode = iGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "BlindMode", "Blind Mode", "Blind_Mode", "mode", g_esBlindAbility[type].g_iBlindMode, value, -1, 1); - g_esBlindAbility[type].g_flBlindRange = flGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "BlindRange", "Blind Range", "Blind_Range", "range", g_esBlindAbility[type].g_flBlindRange, value, -1.0, 99999.0); - g_esBlindAbility[type].g_flBlindRangeChance = flGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "BlindRangeChance", "Blind Range Chance", "Blind_Range_Chance", "rangechance", g_esBlindAbility[type].g_flBlindRangeChance, value, -1.0, 100.0); - g_esBlindAbility[type].g_iBlindRangeCooldown = iGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "BlindRangeCooldown", "Blind Range Cooldown", "Blind_Range_Cooldown", "rangecooldown", g_esBlindAbility[type].g_iBlindRangeCooldown, value, -1, 99999); - g_esBlindAbility[type].g_iBlindStagger = iGetKeyValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "BlindStagger", "Blind Stagger", "Blind_Stagger", "stagger", g_esBlindAbility[type].g_iBlindStagger, value, -1, 3); - g_esBlindAbility[type].g_iAccessFlags = iGetAdminFlagsValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "AccessFlags", "Access Flags", "Access_Flags", "access", value); - g_esBlindAbility[type].g_iImmunityFlags = iGetAdminFlagsValue(subsection, MT_BLIND_SECTION, MT_BLIND_SECTION2, MT_BLIND_SECTION3, MT_BLIND_SECTION4, key, "ImmunityFlags", "Immunity Flags", "Immunity_Flags", "immunity", value); - } - } -} - -#if defined MT_ABILITIES_MAIN -void vBlindSettingsCached(int tank, bool apply, int type) -#else -public void MT_OnSettingsCached(int tank, bool apply, int type) -#endif -{ - bool bHuman = bIsValidClient(tank, MT_CHECK_FAKECLIENT); - g_esBlindPlayer[tank].g_iTankTypeRecorded = apply ? MT_GetRecordedTankType(tank, type) : 0; - g_esBlindPlayer[tank].g_iTankType = apply ? type : 0; - int iType = g_esBlindPlayer[tank].g_iTankTypeRecorded; - - if (bIsSpecialInfected(tank, MT_CHECK_INDEX|MT_CHECK_INGAME)) - { - g_esBlindCache[tank].g_flBlindChance = flGetSubSettingValue(apply, bHuman, g_esBlindTeammate[tank].g_flBlindChance, g_esBlindPlayer[tank].g_flBlindChance, g_esBlindSpecial[iType].g_flBlindChance, g_esBlindAbility[iType].g_flBlindChance, 1); - g_esBlindCache[tank].g_flBlindDuration = flGetSubSettingValue(apply, bHuman, g_esBlindTeammate[tank].g_flBlindDuration, g_esBlindPlayer[tank].g_flBlindDuration, g_esBlindSpecial[iType].g_flBlindDuration, g_esBlindAbility[iType].g_flBlindDuration, 1); - g_esBlindCache[tank].g_flBlindRange = flGetSubSettingValue(apply, bHuman, g_esBlindTeammate[tank].g_flBlindRange, g_esBlindPlayer[tank].g_flBlindRange, g_esBlindSpecial[iType].g_flBlindRange, g_esBlindAbility[iType].g_flBlindRange, 1); - g_esBlindCache[tank].g_flBlindRangeChance = flGetSubSettingValue(apply, bHuman, g_esBlindTeammate[tank].g_flBlindRangeChance, g_esBlindPlayer[tank].g_flBlindRangeChance, g_esBlindSpecial[iType].g_flBlindRangeChance, g_esBlindAbility[iType].g_flBlindRangeChance, 1); - g_esBlindCache[tank].g_iBlindAbility = iGetSubSettingValue(apply, bHuman, g_esBlindTeammate[tank].g_iBlindAbility, g_esBlindPlayer[tank].g_iBlindAbility, g_esBlindSpecial[iType].g_iBlindAbility, g_esBlindAbility[iType].g_iBlindAbility, 1); - g_esBlindCache[tank].g_iBlindCooldown = iGetSubSettingValue(apply, bHuman, g_esBlindTeammate[tank].g_iBlindCooldown, g_esBlindPlayer[tank].g_iBlindCooldown, g_esBlindSpecial[iType].g_iBlindCooldown, g_esBlindAbility[iType].g_iBlindCooldown, 1); - g_esBlindCache[tank].g_iBlindEffect = iGetSubSettingValue(apply, bHuman, g_esBlindTeammate[tank].g_iBlindEffect, g_esBlindPlayer[tank].g_iBlindEffect, g_esBlindSpecial[iType].g_iBlindEffect, g_esBlindAbility[iType].g_iBlindEffect, 1); - g_esBlindCache[tank].g_iBlindHit = iGetSubSettingValue(apply, bHuman, g_esBlindTeammate[tank].g_iBlindHit, g_esBlindPlayer[tank].g_iBlindHit, g_esBlindSpecial[iType].g_iBlindHit, g_esBlindAbility[iType].g_iBlindHit, 1); - g_esBlindCache[tank].g_iBlindHitMode = iGetSubSettingValue(apply, bHuman, g_esBlindTeammate[tank].g_iBlindHitMode, g_esBlindPlayer[tank].g_iBlindHitMode, g_esBlindSpecial[iType].g_iBlindHitMode, g_esBlindAbility[iType].g_iBlindHitMode, 1); - g_esBlindCache[tank].g_iBlindIntensity = iGetSubSettingValue(apply, bHuman, g_esBlindTeammate[tank].g_iBlindIntensity, g_esBlindPlayer[tank].g_iBlindIntensity, g_esBlindSpecial[iType].g_iBlindIntensity, g_esBlindAbility[iType].g_iBlindIntensity, 1); - g_esBlindCache[tank].g_iBlindMessage = iGetSubSettingValue(apply, bHuman, g_esBlindTeammate[tank].g_iBlindMessage, g_esBlindPlayer[tank].g_iBlindMessage, g_esBlindSpecial[iType].g_iBlindMessage, g_esBlindAbility[iType].g_iBlindMessage, 1); - g_esBlindCache[tank].g_iBlindMode = iGetSubSettingValue(apply, bHuman, g_esBlindTeammate[tank].g_iBlindMode, g_esBlindPlayer[tank].g_iBlindMode, g_esBlindSpecial[iType].g_iBlindMode, g_esBlindAbility[iType].g_iBlindMode, 1); - g_esBlindCache[tank].g_iBlindRangeCooldown = iGetSubSettingValue(apply, bHuman, g_esBlindTeammate[tank].g_iBlindRangeCooldown, g_esBlindPlayer[tank].g_iBlindRangeCooldown, g_esBlindSpecial[iType].g_iBlindRangeCooldown, g_esBlindAbility[iType].g_iBlindRangeCooldown, 1); - g_esBlindCache[tank].g_iBlindSight = iGetSubSettingValue(apply, bHuman, g_esBlindTeammate[tank].g_iBlindSight, g_esBlindPlayer[tank].g_iBlindSight, g_esBlindSpecial[iType].g_iBlindSight, g_esBlindAbility[iType].g_iBlindSight, 1); - g_esBlindCache[tank].g_iBlindStagger = iGetSubSettingValue(apply, bHuman, g_esBlindTeammate[tank].g_iBlindStagger, g_esBlindPlayer[tank].g_iBlindStagger, g_esBlindSpecial[iType].g_iBlindStagger, g_esBlindAbility[iType].g_iBlindStagger, 1); - g_esBlindCache[tank].g_flCloseAreasOnly = flGetSubSettingValue(apply, bHuman, g_esBlindTeammate[tank].g_flCloseAreasOnly, g_esBlindPlayer[tank].g_flCloseAreasOnly, g_esBlindSpecial[iType].g_flCloseAreasOnly, g_esBlindAbility[iType].g_flCloseAreasOnly, 1); - g_esBlindCache[tank].g_iComboAbility = iGetSubSettingValue(apply, bHuman, g_esBlindTeammate[tank].g_iComboAbility, g_esBlindPlayer[tank].g_iComboAbility, g_esBlindSpecial[iType].g_iComboAbility, g_esBlindAbility[iType].g_iComboAbility, 1); - g_esBlindCache[tank].g_iHumanAbility = iGetSubSettingValue(apply, bHuman, g_esBlindTeammate[tank].g_iHumanAbility, g_esBlindPlayer[tank].g_iHumanAbility, g_esBlindSpecial[iType].g_iHumanAbility, g_esBlindAbility[iType].g_iHumanAbility, 1); - g_esBlindCache[tank].g_iHumanAmmo = iGetSubSettingValue(apply, bHuman, g_esBlindTeammate[tank].g_iHumanAmmo, g_esBlindPlayer[tank].g_iHumanAmmo, g_esBlindSpecial[iType].g_iHumanAmmo, g_esBlindAbility[iType].g_iHumanAmmo, 1); - g_esBlindCache[tank].g_iHumanCooldown = iGetSubSettingValue(apply, bHuman, g_esBlindTeammate[tank].g_iHumanCooldown, g_esBlindPlayer[tank].g_iHumanCooldown, g_esBlindSpecial[iType].g_iHumanCooldown, g_esBlindAbility[iType].g_iHumanCooldown, 1); - g_esBlindCache[tank].g_iHumanRangeCooldown = iGetSubSettingValue(apply, bHuman, g_esBlindTeammate[tank].g_iHumanRangeCooldown, g_esBlindPlayer[tank].g_iHumanRangeCooldown, g_esBlindSpecial[iType].g_iHumanRangeCooldown, g_esBlindAbility[iType].g_iHumanRangeCooldown, 1); - g_esBlindCache[tank].g_flOpenAreasOnly = flGetSubSettingValue(apply, bHuman, g_esBlindTeammate[tank].g_flOpenAreasOnly, g_esBlindPlayer[tank].g_flOpenAreasOnly, g_esBlindSpecial[iType].g_flOpenAreasOnly, g_esBlindAbility[iType].g_flOpenAreasOnly, 1); - g_esBlindCache[tank].g_iRequiresHumans = iGetSubSettingValue(apply, bHuman, g_esBlindTeammate[tank].g_iRequiresHumans, g_esBlindPlayer[tank].g_iRequiresHumans, g_esBlindSpecial[iType].g_iRequiresHumans, g_esBlindAbility[iType].g_iRequiresHumans, 1); - } - else - { - g_esBlindCache[tank].g_flBlindChance = flGetSettingValue(apply, bHuman, g_esBlindPlayer[tank].g_flBlindChance, g_esBlindAbility[iType].g_flBlindChance, 1); - g_esBlindCache[tank].g_flBlindDuration = flGetSettingValue(apply, bHuman, g_esBlindPlayer[tank].g_flBlindDuration, g_esBlindAbility[iType].g_flBlindDuration, 1); - g_esBlindCache[tank].g_flBlindRange = flGetSettingValue(apply, bHuman, g_esBlindPlayer[tank].g_flBlindRange, g_esBlindAbility[iType].g_flBlindRange, 1); - g_esBlindCache[tank].g_flBlindRangeChance = flGetSettingValue(apply, bHuman, g_esBlindPlayer[tank].g_flBlindRangeChance, g_esBlindAbility[iType].g_flBlindRangeChance, 1); - g_esBlindCache[tank].g_iBlindAbility = iGetSettingValue(apply, bHuman, g_esBlindPlayer[tank].g_iBlindAbility, g_esBlindAbility[iType].g_iBlindAbility, 1); - g_esBlindCache[tank].g_iBlindCooldown = iGetSettingValue(apply, bHuman, g_esBlindPlayer[tank].g_iBlindCooldown, g_esBlindAbility[iType].g_iBlindCooldown, 1); - g_esBlindCache[tank].g_iBlindEffect = iGetSettingValue(apply, bHuman, g_esBlindPlayer[tank].g_iBlindEffect, g_esBlindAbility[iType].g_iBlindEffect, 1); - g_esBlindCache[tank].g_iBlindHit = iGetSettingValue(apply, bHuman, g_esBlindPlayer[tank].g_iBlindHit, g_esBlindAbility[iType].g_iBlindHit, 1); - g_esBlindCache[tank].g_iBlindHitMode = iGetSettingValue(apply, bHuman, g_esBlindPlayer[tank].g_iBlindHitMode, g_esBlindAbility[iType].g_iBlindHitMode, 1); - g_esBlindCache[tank].g_iBlindIntensity = iGetSettingValue(apply, bHuman, g_esBlindPlayer[tank].g_iBlindIntensity, g_esBlindAbility[iType].g_iBlindIntensity, 1); - g_esBlindCache[tank].g_iBlindMessage = iGetSettingValue(apply, bHuman, g_esBlindPlayer[tank].g_iBlindMessage, g_esBlindAbility[iType].g_iBlindMessage, 1); - g_esBlindCache[tank].g_iBlindMode = iGetSettingValue(apply, bHuman, g_esBlindPlayer[tank].g_iBlindMode, g_esBlindAbility[iType].g_iBlindMode, 1); - g_esBlindCache[tank].g_iBlindRangeCooldown = iGetSettingValue(apply, bHuman, g_esBlindPlayer[tank].g_iBlindRangeCooldown, g_esBlindAbility[iType].g_iBlindRangeCooldown, 1); - g_esBlindCache[tank].g_iBlindSight = iGetSettingValue(apply, bHuman, g_esBlindPlayer[tank].g_iBlindSight, g_esBlindAbility[iType].g_iBlindSight, 1); - g_esBlindCache[tank].g_iBlindStagger = iGetSettingValue(apply, bHuman, g_esBlindPlayer[tank].g_iBlindStagger, g_esBlindAbility[iType].g_iBlindStagger, 1); - g_esBlindCache[tank].g_flCloseAreasOnly = flGetSettingValue(apply, bHuman, g_esBlindPlayer[tank].g_flCloseAreasOnly, g_esBlindAbility[iType].g_flCloseAreasOnly, 1); - g_esBlindCache[tank].g_iComboAbility = iGetSettingValue(apply, bHuman, g_esBlindPlayer[tank].g_iComboAbility, g_esBlindAbility[iType].g_iComboAbility, 1); - g_esBlindCache[tank].g_iHumanAbility = iGetSettingValue(apply, bHuman, g_esBlindPlayer[tank].g_iHumanAbility, g_esBlindAbility[iType].g_iHumanAbility, 1); - g_esBlindCache[tank].g_iHumanAmmo = iGetSettingValue(apply, bHuman, g_esBlindPlayer[tank].g_iHumanAmmo, g_esBlindAbility[iType].g_iHumanAmmo, 1); - g_esBlindCache[tank].g_iHumanCooldown = iGetSettingValue(apply, bHuman, g_esBlindPlayer[tank].g_iHumanCooldown, g_esBlindAbility[iType].g_iHumanCooldown, 1); - g_esBlindCache[tank].g_iHumanRangeCooldown = iGetSettingValue(apply, bHuman, g_esBlindPlayer[tank].g_iHumanRangeCooldown, g_esBlindAbility[iType].g_iHumanRangeCooldown, 1); - g_esBlindCache[tank].g_flOpenAreasOnly = flGetSettingValue(apply, bHuman, g_esBlindPlayer[tank].g_flOpenAreasOnly, g_esBlindAbility[iType].g_flOpenAreasOnly, 1); - g_esBlindCache[tank].g_iRequiresHumans = iGetSettingValue(apply, bHuman, g_esBlindPlayer[tank].g_iRequiresHumans, g_esBlindAbility[iType].g_iRequiresHumans, 1); - } -} - -#if defined MT_ABILITIES_MAIN -void vBlindCopyStats(int oldTank, int newTank) -#else -public void MT_OnCopyStats(int oldTank, int newTank) -#endif -{ - vBlindCopyStats2(oldTank, newTank); - - if (oldTank != newTank) - { - vRemoveBlind(oldTank); - } -} - -#if !defined MT_ABILITIES_MAIN -public void MT_OnPluginUpdate() -{ - MT_ReloadPlugin(null); -} -#endif - -#if defined MT_ABILITIES_MAIN -void vBlindPluginEnd() -#else -public void MT_OnPluginEnd() -#endif -{ - for (int iTank = 1; iTank <= MaxClients; iTank++) - { - if (bIsInfected(iTank, MT_CHECK_INGAME|MT_CHECK_ALIVE)) - { - vRemoveBlind(iTank); - } - } -} - -#if defined MT_ABILITIES_MAIN -void vBlindEventFired(Event event, const char[] name) -#else -public void MT_OnEventFired(Event event, const char[] name, bool dontBroadcast) -#endif -{ - if (StrEqual(name, "bot_player_replace")) - { - int iBotId = event.GetInt("bot"), iBot = GetClientOfUserId(iBotId), - iTankId = event.GetInt("player"), iTank = GetClientOfUserId(iTankId); - if (bIsValidClient(iBot) && bIsInfected(iTank)) - { - vBlindCopyStats2(iBot, iTank); - vRemoveBlind(iBot); - } - } - else if (StrEqual(name, "mission_lost") || StrEqual(name, "round_start") || StrEqual(name, "round_end")) - { - vBlindReset(); - } - else if (StrEqual(name, "player_bot_replace")) - { - int iTankId = event.GetInt("player"), iTank = GetClientOfUserId(iTankId), - iBotId = event.GetInt("bot"), iBot = GetClientOfUserId(iBotId); - if (bIsValidClient(iTank) && bIsInfected(iBot)) - { - vBlindCopyStats2(iTank, iBot); - vRemoveBlind(iTank); - } - } - else if (StrEqual(name, "player_death") || StrEqual(name, "player_spawn")) - { - int iPlayerId = event.GetInt("userid"), iPlayer = GetClientOfUserId(iPlayerId); - if (MT_IsTankSupported(iPlayer, MT_CHECK_INDEX|MT_CHECK_INGAME)) - { - vRemoveBlind(iPlayer); - } - else if (bIsHumanSurvivor(iPlayer, MT_CHECK_INDEX|MT_CHECK_INGAME)) - { - vBlind(iPlayer, 0); - } - } - else if (StrEqual(name, "player_now_it")) - { - bool bExploded = event.GetBool("exploded"); - int iSurvivorId = event.GetInt("userid"), iSurvivor = GetClientOfUserId(iSurvivorId), - iBoomerId = event.GetInt("attacker"), iBoomer = GetClientOfUserId(iBoomerId); - if (bIsBoomer(iBoomer) && bIsSurvivor(iSurvivor) && !bExploded) - { - vBlindHit(iSurvivor, iBoomer, GetRandomFloat(0.1, 100.0), g_esBlindCache[iBoomer].g_flBlindChance, g_esBlindCache[iBoomer].g_iBlindHit, MT_MESSAGE_RANGE, MT_ATTACK_RANGE); - } - } -} - -#if defined MT_ABILITIES_MAIN -void vBlindAbilityActivated(int tank) -#else -public void MT_OnAbilityActivated(int tank) -#endif -{ - if (MT_IsTankSupported(tank, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_FAKECLIENT) && ((!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esBlindAbility[g_esBlindPlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esBlindPlayer[tank].g_iAccessFlags)) || g_esBlindCache[tank].g_iHumanAbility == 0)) - { - return; - } - - if (MT_IsTankSupported(tank) && (!bIsInfected(tank, MT_CHECK_FAKECLIENT) || g_esBlindCache[tank].g_iHumanAbility != 1) && MT_IsCustomTankSupported(tank) && g_esBlindCache[tank].g_iBlindAbility == 1 && g_esBlindCache[tank].g_iComboAbility == 0) - { - vBlindAbility(tank, GetRandomFloat(0.1, 100.0)); - } -} - -#if defined MT_ABILITIES_MAIN -void vBlindButtonPressed(int tank, int button) -#else -public void MT_OnButtonPressed(int tank, int button) -#endif -{ - if (MT_IsTankSupported(tank, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_ALIVE|MT_CHECK_FAKECLIENT) && MT_IsCustomTankSupported(tank)) - { - if (bIsAreaNarrow(tank, g_esBlindCache[tank].g_flOpenAreasOnly) || bIsAreaWide(tank, g_esBlindCache[tank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esBlindPlayer[tank].g_iTankType, tank) || (g_esBlindCache[tank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esBlindCache[tank].g_iRequiresHumans) || (!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esBlindAbility[g_esBlindPlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esBlindPlayer[tank].g_iAccessFlags))) - { - return; - } - - if ((button & MT_SUB_KEY) && g_esBlindCache[tank].g_iBlindAbility == 1 && g_esBlindCache[tank].g_iHumanAbility == 1) - { - int iTime = GetTime(); - - switch (g_esBlindPlayer[tank].g_iRangeCooldown == -1 || g_esBlindPlayer[tank].g_iRangeCooldown <= iTime) - { - case true: vBlindAbility(tank, GetRandomFloat(0.1, 100.0)); - case false: MT_PrintToChat(tank, "%s %t", MT_TAG3, "BlindHuman3", (g_esBlindPlayer[tank].g_iRangeCooldown - iTime)); - } - } - } -} - -#if defined MT_ABILITIES_MAIN -void vBlindChangeType(int tank, int oldType) -#else -public void MT_OnChangeType(int tank, int oldType, int newType, bool revert) -#endif -{ - if (oldType <= 0) - { - return; - } - - vRemoveBlind(tank); -} - -void vBlind(int survivor, int intensity) -{ - int iTargets[1], iFlags = (intensity == 0) ? (MT_FADE_IN|MT_FADE_PURGE) : (MT_FADE_OUT|MT_FADE_STAYOUT), iColor[4] = {0, 0, 0, 0}; - iTargets[0] = survivor; - iColor[3] = intensity; - - Handle hMessage = StartMessageEx(g_umBlindFade, iTargets, 1); - if (hMessage != null) - { - BfWrite bfWrite = UserMessageToBfWrite(hMessage); - bfWrite.WriteShort(1536); - bfWrite.WriteShort(1536); - bfWrite.WriteShort(iFlags); - - for (int iPos = 0; iPos < (sizeof iColor); iPos++) - { - bfWrite.WriteByte(iColor[iPos]); - } - - EndMessage(); - } -} - -void vBlind2(int survivor, int red = 255, int green = 255, int blue = 255, int alpha = 255) -{ - int iTargets[2]; - iTargets[0] = survivor; - - Handle hMessage = StartMessageEx(g_umBlindFade, iTargets, 1); - if (hMessage != null) - { - BfWrite bfWrite = UserMessageToBfWrite(hMessage); - bfWrite.WriteShort(3000); - bfWrite.WriteShort(100); - bfWrite.WriteShort(MT_FADE_IN); - bfWrite.WriteByte(red); - bfWrite.WriteByte(green); - bfWrite.WriteByte(blue); - bfWrite.WriteByte(alpha); - - EndMessage(); - } - - MT_TE_CreateParticle(.particle = g_iBashedParticle, .all = false); - TE_SendToClient(survivor); -} - -void vBlindAbility(int tank, float random, int pos = -1) -{ - if (bIsAreaNarrow(tank, g_esBlindCache[tank].g_flOpenAreasOnly) || bIsAreaWide(tank, g_esBlindCache[tank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esBlindPlayer[tank].g_iTankType, tank) || (g_esBlindCache[tank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esBlindCache[tank].g_iRequiresHumans) || (!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esBlindAbility[g_esBlindPlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esBlindPlayer[tank].g_iAccessFlags))) - { - return; - } - - if (!bIsInfected(tank, MT_CHECK_FAKECLIENT) || (g_esBlindPlayer[tank].g_iAmmoCount < g_esBlindCache[tank].g_iHumanAmmo && g_esBlindCache[tank].g_iHumanAmmo > 0)) - { - g_esBlindPlayer[tank].g_bFailed = false; - g_esBlindPlayer[tank].g_bNoAmmo = false; - - float flTankPos[3], flSurvivorPos[3]; - GetClientAbsOrigin(tank, flTankPos); - float flRange = (pos != -1) ? MT_GetCombinationSetting(tank, 9, pos) : g_esBlindCache[tank].g_flBlindRange, - flChance = (pos != -1) ? MT_GetCombinationSetting(tank, 10, pos) : g_esBlindCache[tank].g_flBlindRangeChance; - int iSurvivorCount = 0; - for (int iSurvivor = 1; iSurvivor <= MaxClients; iSurvivor++) - { - if (bIsSurvivor(iSurvivor, MT_CHECK_INGAME|MT_CHECK_ALIVE) && !MT_IsAdminImmune(iSurvivor, tank) && !bIsAdminImmune(iSurvivor, g_esBlindPlayer[tank].g_iTankType, g_esBlindAbility[g_esBlindPlayer[tank].g_iTankTypeRecorded].g_iImmunityFlags, g_esBlindPlayer[iSurvivor].g_iImmunityFlags)) - { - GetClientAbsOrigin(iSurvivor, flSurvivorPos); - if (GetVectorDistance(flTankPos, flSurvivorPos) <= flRange && bIsVisibleToPlayer(tank, iSurvivor, g_esBlindCache[tank].g_iBlindSight, .range = flRange)) - { - vBlindHit(iSurvivor, tank, random, flChance, g_esBlindCache[tank].g_iBlindAbility, MT_MESSAGE_RANGE, MT_ATTACK_RANGE, pos); - - iSurvivorCount++; - } - } - } - - if (iSurvivorCount == 0) - { - if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esBlindCache[tank].g_iHumanAbility == 1) - { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "BlindHuman4"); - } - } - } - else if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esBlindCache[tank].g_iHumanAbility == 1) - { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "BlindAmmo"); - } -} - -void vBlindHit(int survivor, int tank, float random, float chance, int enabled, int messages, int flags, int pos = -1) -{ - if (bIsAreaNarrow(tank, g_esBlindCache[tank].g_flOpenAreasOnly) || bIsAreaWide(tank, g_esBlindCache[tank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esBlindPlayer[tank].g_iTankType, tank) || (g_esBlindCache[tank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esBlindCache[tank].g_iRequiresHumans) || (!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esBlindAbility[g_esBlindPlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esBlindPlayer[tank].g_iAccessFlags)) || MT_IsAdminImmune(survivor, tank) || bIsAdminImmune(survivor, g_esBlindPlayer[tank].g_iTankType, g_esBlindAbility[g_esBlindPlayer[tank].g_iTankTypeRecorded].g_iImmunityFlags, g_esBlindPlayer[survivor].g_iImmunityFlags)) - { - return; - } - - int iTime = GetTime(); - if (((flags & MT_ATTACK_RANGE) && g_esBlindPlayer[tank].g_iRangeCooldown != -1 && g_esBlindPlayer[tank].g_iRangeCooldown >= iTime) || (((flags & MT_ATTACK_CLAW) || (flags & MT_ATTACK_MELEE)) && g_esBlindPlayer[tank].g_iCooldown != -1 && g_esBlindPlayer[tank].g_iCooldown >= iTime)) - { - return; - } - - if (enabled == 1 && bIsSurvivor(survivor)) - { - if (!bIsInfected(tank, MT_CHECK_FAKECLIENT) || (flags & MT_ATTACK_CLAW) || (flags & MT_ATTACK_MELEE) || (g_esBlindPlayer[tank].g_iAmmoCount < g_esBlindCache[tank].g_iHumanAmmo && g_esBlindCache[tank].g_iHumanAmmo > 0)) - { - if (random <= chance && !g_esBlindPlayer[survivor].g_bAffected) - { - if ((messages & MT_MESSAGE_MELEE) && !bIsVisibleToPlayer(tank, survivor, g_esBlindCache[tank].g_iBlindSight, .range = 100.0)) - { - return; - } - - g_esBlindPlayer[survivor].g_bAffected = true; - g_esBlindPlayer[survivor].g_iOwner = tank; - - int iCooldown = -1; - if ((flags & MT_ATTACK_RANGE) && (g_esBlindPlayer[tank].g_iRangeCooldown == -1 || g_esBlindPlayer[tank].g_iRangeCooldown <= iTime)) - { - if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esBlindCache[tank].g_iHumanAbility == 1) - { - g_esBlindPlayer[tank].g_iAmmoCount++; - - MT_PrintToChat(tank, "%s %t", MT_TAG3, "BlindHuman", g_esBlindPlayer[tank].g_iAmmoCount, g_esBlindCache[tank].g_iHumanAmmo); - } - - iCooldown = (pos != -1) ? RoundToNearest(MT_GetCombinationSetting(tank, 11, pos)) : g_esBlindCache[tank].g_iBlindRangeCooldown; - iCooldown = (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esBlindCache[tank].g_iHumanAbility == 1 && g_esBlindPlayer[tank].g_iAmmoCount < g_esBlindCache[tank].g_iHumanAmmo && g_esBlindCache[tank].g_iHumanAmmo > 0) ? g_esBlindCache[tank].g_iHumanRangeCooldown : iCooldown; - g_esBlindPlayer[tank].g_iRangeCooldown = (iTime + iCooldown); - if (g_esBlindPlayer[tank].g_iRangeCooldown != -1 && g_esBlindPlayer[tank].g_iRangeCooldown >= iTime) - { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "BlindHuman5", (g_esBlindPlayer[tank].g_iRangeCooldown - iTime)); - } - } - else if (((flags & MT_ATTACK_CLAW) || (flags & MT_ATTACK_MELEE)) && (g_esBlindPlayer[tank].g_iCooldown == -1 || g_esBlindPlayer[tank].g_iCooldown <= iTime)) - { - iCooldown = (pos != -1) ? RoundToNearest(MT_GetCombinationSetting(tank, 2, pos)) : g_esBlindCache[tank].g_iBlindCooldown; - iCooldown = (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esBlindCache[tank].g_iHumanAbility == 1) ? g_esBlindCache[tank].g_iHumanCooldown : iCooldown; - g_esBlindPlayer[tank].g_iCooldown = (iTime + iCooldown); - if (g_esBlindPlayer[tank].g_iCooldown != -1 && g_esBlindPlayer[tank].g_iCooldown >= iTime) - { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "BlindHuman5", (g_esBlindPlayer[tank].g_iCooldown - iTime)); - } - } - - if (g_esBlindCache[tank].g_iBlindMode == 1) - { - g_esBlindPlayer[survivor].g_bAffected = false; - g_esBlindPlayer[survivor].g_iOwner = -1; - - vBlind2(survivor, .alpha = 240); - vShakePlayerScreen(survivor); - MT_DeafenPlayer(survivor); - - int iStagger = g_esBlindCache[tank].g_iBlindStagger; - if (iStagger > 0) - { - float flTankOrigin[3]; - GetClientAbsOrigin(tank, flTankOrigin); - if (iStagger == 1 || iStagger == 3) - { - MT_StaggerPlayer(survivor, tank, flTankOrigin); - } - - if (iStagger == 2 || iStagger == 3) - { - float flSurvivorOrigin[3], flDirection[3]; - GetClientAbsOrigin(survivor, flSurvivorOrigin); - MakeVectorFromPoints(flSurvivorOrigin, flTankOrigin, flDirection); - NormalizeVector(flDirection, flDirection); - MT_ShoveBySurvivor(tank, survivor, flDirection); - SetEntPropFloat(tank, Prop_Send, "m_flVelocityModifier", 0.4); - } - } - } - else if (g_esBlindCache[tank].g_iBlindMode == 0 && bIsValidClient(survivor, MT_CHECK_FAKECLIENT)) - { - int iSurvivorId = GetClientUserId(survivor), iTankId = GetClientUserId(tank); - DataPack dpBlind; - CreateDataTimer(1.0, tTimerBlind, dpBlind, TIMER_FLAG_NO_MAPCHANGE); - dpBlind.WriteCell(iSurvivorId); - dpBlind.WriteCell(iTankId); - dpBlind.WriteCell(g_esBlindPlayer[tank].g_iTankType); - dpBlind.WriteCell(enabled); - - float flDuration = (pos != -1) ? MT_GetCombinationSetting(tank, 5, pos) : g_esBlindCache[tank].g_flBlindDuration; - if (flDuration > 0.0) - { - DataPack dpStopBlind; - CreateDataTimer(0.1, tTimerStopBlind, dpStopBlind, TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); - dpStopBlind.WriteCell(iSurvivorId); - dpStopBlind.WriteCell(iTankId); - dpStopBlind.WriteFloat(GetGameTime()); - dpStopBlind.WriteFloat(flDuration + 1.0); - dpStopBlind.WriteCell(messages); - } - - vScreenEffect(survivor, tank, g_esBlindCache[tank].g_iBlindEffect, flags); - - switch (g_bSecondGame) - { - case true: EmitSoundToAll(SOUND_GROAN2, survivor); - case false: EmitSoundToAll(SOUND_GROAN1, survivor); - } - } - - if (g_esBlindCache[tank].g_iBlindMessage & messages) - { - char sTankName[64]; - MT_GetTankName(tank, sTankName); - MT_PrintToChatAll("%s %t", MT_TAG2, "Blind", sTankName, survivor); - MT_LogMessage(MT_LOG_ABILITY, "%s %T", MT_TAG, "Blind", LANG_SERVER, sTankName, survivor); - } - } - else if ((flags & MT_ATTACK_RANGE) && (g_esBlindPlayer[tank].g_iRangeCooldown == -1 || g_esBlindPlayer[tank].g_iRangeCooldown <= iTime)) - { - if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esBlindCache[tank].g_iHumanAbility == 1 && !g_esBlindPlayer[tank].g_bFailed) - { - g_esBlindPlayer[tank].g_bFailed = true; - - MT_PrintToChat(tank, "%s %t", MT_TAG3, "BlindHuman2"); - } - } - } - else if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esBlindCache[tank].g_iHumanAbility == 1 && !g_esBlindPlayer[tank].g_bNoAmmo) - { - g_esBlindPlayer[tank].g_bNoAmmo = true; - - MT_PrintToChat(tank, "%s %t", MT_TAG3, "BlindAmmo"); - } - } -} - -void vBlindCopyStats2(int oldTank, int newTank) -{ - g_esBlindPlayer[newTank].g_iAmmoCount = g_esBlindPlayer[oldTank].g_iAmmoCount; - g_esBlindPlayer[newTank].g_iCooldown = g_esBlindPlayer[oldTank].g_iCooldown; - g_esBlindPlayer[newTank].g_iRangeCooldown = g_esBlindPlayer[oldTank].g_iRangeCooldown; -} - -void vRemoveBlind(int tank) -{ - for (int iSurvivor = 1; iSurvivor <= MaxClients; iSurvivor++) - { - if (bIsSurvivor(iSurvivor, MT_CHECK_INGAME|MT_CHECK_ALIVE) && g_esBlindPlayer[iSurvivor].g_bAffected && g_esBlindPlayer[iSurvivor].g_iOwner == tank) - { - vBlind(iSurvivor, 0); - - g_esBlindPlayer[iSurvivor].g_bAffected = false; - g_esBlindPlayer[iSurvivor].g_iOwner = -1; - } - } - - vBlindReset2(tank); -} - -void vBlindReset() -{ - for (int iPlayer = 1; iPlayer <= MaxClients; iPlayer++) - { - if (bIsValidClient(iPlayer, MT_CHECK_INGAME)) - { - vBlindReset2(iPlayer); - - g_esBlindPlayer[iPlayer].g_iOwner = -1; - } - } -} - -void vBlindReset2(int tank) -{ - g_esBlindPlayer[tank].g_bAffected = false; - g_esBlindPlayer[tank].g_bFailed = false; - g_esBlindPlayer[tank].g_bNoAmmo = false; - g_esBlindPlayer[tank].g_iAmmoCount = 0; - g_esBlindPlayer[tank].g_iCooldown = -1; - g_esBlindPlayer[tank].g_iRangeCooldown = -1; -} - -void tTimerBlind(Handle timer, DataPack pack) -{ - pack.Reset(); - - int iSurvivor = GetClientOfUserId(pack.ReadCell()); - if (!MT_IsCorePluginEnabled() || !bIsHumanSurvivor(iSurvivor) || !g_esBlindPlayer[iSurvivor].g_bAffected) - { - g_esBlindPlayer[iSurvivor].g_bAffected = false; - g_esBlindPlayer[iSurvivor].g_iOwner = -1; - - return; - } - - int iTank = GetClientOfUserId(pack.ReadCell()), - iType = pack.ReadCell(), - iBlindEnabled = pack.ReadCell(); - if (!MT_IsTankSupported(iTank) || bIsAreaNarrow(iTank, g_esBlindCache[iTank].g_flOpenAreasOnly) || bIsAreaWide(iTank, g_esBlindCache[iTank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esBlindPlayer[iTank].g_iTankType, iTank) || (g_esBlindCache[iTank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esBlindCache[iTank].g_iRequiresHumans) || !MT_HasAdminAccess(iTank) || !bHasAdminAccess(iTank, g_esBlindAbility[g_esBlindPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esBlindPlayer[iTank].g_iAccessFlags) || !MT_IsTypeEnabled(g_esBlindPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || iType != g_esBlindPlayer[iTank].g_iTankType || MT_IsAdminImmune(iSurvivor, iTank) || bIsAdminImmune(iSurvivor, g_esBlindPlayer[iTank].g_iTankType, g_esBlindAbility[g_esBlindPlayer[iTank].g_iTankTypeRecorded].g_iImmunityFlags, g_esBlindPlayer[iSurvivor].g_iImmunityFlags) || iBlindEnabled == 0) - { - g_esBlindPlayer[iSurvivor].g_bAffected = false; - g_esBlindPlayer[iSurvivor].g_iOwner = -1; - - vBlind(iSurvivor, 0); - - return; - } - - vBlind(iSurvivor, g_esBlindCache[iTank].g_iBlindIntensity); -} - -void tTimerBlindCombo(Handle timer, DataPack pack) -{ - pack.Reset(); - - int iTank = GetClientOfUserId(pack.ReadCell()); - if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esBlindAbility[g_esBlindPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esBlindPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esBlindPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esBlindCache[iTank].g_iBlindAbility == 0) - { - return; - } - - float flRandom = pack.ReadFloat(); - int iPos = pack.ReadCell(); - vBlindAbility(iTank, flRandom, iPos); -} - -void tTimerBlindCombo2(Handle timer, DataPack pack) -{ - pack.Reset(); - - int iSurvivor = GetClientOfUserId(pack.ReadCell()); - if (!bIsHumanSurvivor(iSurvivor) || g_esBlindPlayer[iSurvivor].g_bAffected) - { - return; - } - - int iTank = GetClientOfUserId(pack.ReadCell()); - if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esBlindAbility[g_esBlindPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esBlindPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esBlindPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esBlindCache[iTank].g_iBlindHit == 0) - { - return; - } - - float flRandom = pack.ReadFloat(), flChance = pack.ReadFloat(); - int iPos = pack.ReadCell(); - char sClassname[32]; - pack.ReadString(sClassname, sizeof sClassname); - if ((g_esBlindCache[iTank].g_iBlindHitMode == 0 || g_esBlindCache[iTank].g_iBlindHitMode == 1) && (bIsSpecialInfected(iTank) || StrEqual(sClassname[7], "tank_claw") || StrEqual(sClassname, "tank_rock"))) - { - vBlindHit(iSurvivor, iTank, flRandom, flChance, g_esBlindCache[iTank].g_iBlindHit, MT_MESSAGE_MELEE, MT_ATTACK_CLAW, iPos); - } - else if ((g_esBlindCache[iTank].g_iBlindHitMode == 0 || g_esBlindCache[iTank].g_iBlindHitMode == 2) && StrEqual(sClassname[7], "melee")) - { - vBlindHit(iSurvivor, iTank, flRandom, flChance, g_esBlindCache[iTank].g_iBlindHit, MT_MESSAGE_MELEE, MT_ATTACK_MELEE, iPos); - } -} - -Action tTimerStopBlind(Handle timer, DataPack pack) -{ - pack.Reset(); - - int iSurvivor = GetClientOfUserId(pack.ReadCell()); - if (!bIsHumanSurvivor(iSurvivor)) - { - g_esBlindPlayer[iSurvivor].g_bAffected = false; - g_esBlindPlayer[iSurvivor].g_iOwner = -1; - - return Plugin_Stop; - } - - int iTank = GetClientOfUserId(pack.ReadCell()); - if (!MT_IsTankSupported(iTank) || !MT_IsCustomTankSupported(iTank) || !g_esBlindPlayer[iSurvivor].g_bAffected) - { - g_esBlindPlayer[iSurvivor].g_bAffected = false; - g_esBlindPlayer[iSurvivor].g_iOwner = -1; - - vBlind(iSurvivor, 0); - - return Plugin_Stop; - } - - float flCurrentTime = pack.ReadFloat(), flDuration = pack.ReadFloat(); - int iMessage = pack.ReadCell(); - if ((flCurrentTime + flDuration) < GetGameTime()) - { - g_esBlindPlayer[iSurvivor].g_bAffected = false; - g_esBlindPlayer[iSurvivor].g_iOwner = -1; - - vBlind(iSurvivor, 0); - - if (g_esBlindCache[iTank].g_iBlindMessage & iMessage) - { - MT_PrintToChatAll("%s %t", MT_TAG2, "Blind2", iSurvivor); - MT_LogMessage(MT_LOG_ABILITY, "%s %T", MT_TAG, "Blind2", LANG_SERVER, iSurvivor); - } - - return Plugin_Stop; - } - - switch (bIsVisibleToPlayer(iTank, iSurvivor, g_esBlindCache[iTank].g_iBlindSight)) - { - case true: vBlind(iSurvivor, g_esBlindCache[iTank].g_iBlindIntensity); - case false: vBlind(iSurvivor, 0); - } - - return Plugin_Continue; -} \ No newline at end of file diff --git a/addons/sourcemod/scripting/mutant_tanks/abilities/mt_bomb.sp b/addons/sourcemod/scripting/mutant_tanks/abilities/mt_bomb.sp index 024e092e2c..fb12c42eed 100644 --- a/addons/sourcemod/scripting/mutant_tanks/abilities/mt_bomb.sp +++ b/addons/sourcemod/scripting/mutant_tanks/abilities/mt_bomb.sp @@ -1,6 +1,6 @@ /** - * Mutant Tanks: a L4D/L4D2 SourceMod Plugin - * Copyright (C) 2024 Alfred "Psyk0tik" Llagas + * Mutant Tanks: A L4D/L4D2 SourceMod Plugin + * Copyright (C) 2017-2025 Alfred "Psyk0tik" Llagas * * 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. * @@ -1366,35 +1366,37 @@ void vBombReset() } } -void tTimerBombCombo(Handle timer, DataPack pack) +Action tTimerBombCombo(Handle timer, DataPack pack) { pack.Reset(); int iTank = GetClientOfUserId(pack.ReadCell()); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esBombAbility[g_esBombPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esBombPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esBombPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esBombCache[iTank].g_iBombAbility == 0) { - return; + return Plugin_Stop; } float flRandom = pack.ReadFloat(); int iPos = pack.ReadCell(); vBombAbility(iTank, flRandom, iPos); + + return Plugin_Continue; } -void tTimerBombCombo2(Handle timer, DataPack pack) +Action tTimerBombCombo2(Handle timer, DataPack pack) { pack.Reset(); int iSurvivor = GetClientOfUserId(pack.ReadCell()); if (!bIsSurvivor(iSurvivor)) { - return; + return Plugin_Stop; } int iTank = GetClientOfUserId(pack.ReadCell()); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esBombAbility[g_esBombPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esBombPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esBombPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esBombCache[iTank].g_iBombHit == 0) { - return; + return Plugin_Stop; } float flRandom = pack.ReadFloat(), flChance = pack.ReadFloat(); @@ -1409,4 +1411,6 @@ void tTimerBombCombo2(Handle timer, DataPack pack) { vBombHit(iSurvivor, iTank, flRandom, flChance, g_esBombCache[iTank].g_iBombHit, MT_MESSAGE_MELEE, MT_ATTACK_MELEE, iPos); } + + return Plugin_Continue; } \ No newline at end of file diff --git a/addons/sourcemod/scripting/mutant_tanks/abilities/mt_bury.sp b/addons/sourcemod/scripting/mutant_tanks/abilities/mt_bury.sp index 6c9c15bb9c..431dc8dfd5 100644 --- a/addons/sourcemod/scripting/mutant_tanks/abilities/mt_bury.sp +++ b/addons/sourcemod/scripting/mutant_tanks/abilities/mt_bury.sp @@ -1,6 +1,6 @@ /** - * Mutant Tanks: a L4D/L4D2 SourceMod Plugin - * Copyright (C) 2024 Alfred "Psyk0tik" Llagas + * Mutant Tanks: A L4D/L4D2 SourceMod Plugin + * Copyright (C) 2017-2025 Alfred "Psyk0tik" Llagas * * 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. * @@ -488,7 +488,7 @@ public Action OnPlayerRunCmd(int client, int &buttons, int &impulse, float vel[3 { TeleportEntity(client, .angles = g_esBuryPlayer[client].g_flAngle); - int iWeapon = GetEntPropEnt(client, Prop_Send, "m_hActiveWeapon"); + int iWeapon = iGetSurvivorActiveWeapon(client); if (iWeapon > MaxClients && g_esBuryPlayer[client].g_flDuration > 0.0) { SetEntPropFloat(iWeapon, Prop_Send, "m_flNextPrimaryAttack", g_esBuryPlayer[client].g_flDuration); @@ -1240,7 +1240,7 @@ void vBuryHit(int survivor, int tank, float random, float chance, int enabled, i float flDuration = (pos != -1) ? MT_GetCombinationSetting(tank, 5, pos) : g_esBuryCache[tank].g_flBuryDuration; if (flDuration > 0.0) { - int iWeapon = GetEntPropEnt(survivor, Prop_Send, "m_hActiveWeapon"); + int iWeapon = iGetSurvivorActiveWeapon(survivor); if (iWeapon > MaxClients) { g_esBuryPlayer[survivor].g_flDuration = GetGameTime() + flDuration; @@ -1416,35 +1416,37 @@ void vStopBury(int survivor, int tank) } } -void tTimerBuryCombo(Handle timer, DataPack pack) +Action tTimerBuryCombo(Handle timer, DataPack pack) { pack.Reset(); int iTank = GetClientOfUserId(pack.ReadCell()); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esBuryAbility[g_esBuryPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esBuryPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esBuryPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esBuryCache[iTank].g_iBuryAbility == 0) { - return; + return Plugin_Stop; } float flRandom = pack.ReadFloat(); int iPos = pack.ReadCell(); vBuryAbility(iTank, flRandom, iPos); + + return Plugin_Continue; } -void tTimerBuryCombo2(Handle timer, DataPack pack) +Action tTimerBuryCombo2(Handle timer, DataPack pack) { pack.Reset(); int iSurvivor = GetClientOfUserId(pack.ReadCell()); if (!bIsSurvivor(iSurvivor) || g_esBuryPlayer[iSurvivor].g_bAffected) { - return; + return Plugin_Stop; } int iTank = GetClientOfUserId(pack.ReadCell()); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esBuryAbility[g_esBuryPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esBuryPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esBuryPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esBuryCache[iTank].g_iBuryHit == 0) { - return; + return Plugin_Stop; } float flRandom = pack.ReadFloat(), flChance = pack.ReadFloat(); @@ -1459,9 +1461,11 @@ void tTimerBuryCombo2(Handle timer, DataPack pack) { vBuryHit(iSurvivor, iTank, flRandom, flChance, g_esBuryCache[iTank].g_iBuryHit, MT_MESSAGE_MELEE, MT_ATTACK_MELEE, iPos); } + + return Plugin_Continue; } -void tTimerStopBury(Handle timer, DataPack pack) +Action tTimerStopBury(Handle timer, DataPack pack) { pack.Reset(); @@ -1471,7 +1475,7 @@ void tTimerStopBury(Handle timer, DataPack pack) g_esBuryPlayer[iSurvivor].g_bAffected = false; g_esBuryPlayer[iSurvivor].g_iOwner = -1; - return; + return Plugin_Stop; } int iTank = GetClientOfUserId(pack.ReadCell()); @@ -1479,7 +1483,7 @@ void tTimerStopBury(Handle timer, DataPack pack) { vStopBury(iSurvivor, iTank); - return; + return Plugin_Stop; } vStopBury(iSurvivor, iTank); @@ -1490,4 +1494,6 @@ void tTimerStopBury(Handle timer, DataPack pack) MT_PrintToChatAll("%s %t", MT_TAG2, "Bury2", iSurvivor); MT_LogMessage(MT_LOG_ABILITY, "%s %T", MT_TAG, "Bury2", LANG_SERVER, iSurvivor); } + + return Plugin_Continue; } \ No newline at end of file diff --git a/addons/sourcemod/scripting/mutant_tanks/abilities/mt_car.sp b/addons/sourcemod/scripting/mutant_tanks/abilities/mt_car.sp index aa2065845d..e37c218d99 100644 --- a/addons/sourcemod/scripting/mutant_tanks/abilities/mt_car.sp +++ b/addons/sourcemod/scripting/mutant_tanks/abilities/mt_car.sp @@ -1,6 +1,6 @@ /** - * Mutant Tanks: a L4D/L4D2 SourceMod Plugin - * Copyright (C) 2024 Alfred "Psyk0tik" Llagas + * Mutant Tanks: A L4D/L4D2 SourceMod Plugin + * Copyright (C) 2017-2025 Alfred "Psyk0tik" Llagas * * 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. * @@ -60,11 +60,20 @@ public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max #define MT_MENU_CAR "Car Ability" +enum struct esCarGeneral +{ + int g_iCar[2048]; + int g_iCarOwner[2048]; +} + +esCarGeneral g_esCarGeneral; + enum struct esCarPlayer { bool g_bActivated; float g_flCarChance; + float g_flCarDamage; float g_flCarInterval; float g_flCarLifetime; float g_flCarRadius[2]; @@ -86,6 +95,7 @@ enum struct esCarPlayer int g_iHumanCooldown; int g_iHumanDuration; int g_iHumanMode; + int g_iImmunityFlags; int g_iRequiresHumans; int g_iTankType; int g_iTankTypeRecorded; @@ -96,6 +106,7 @@ esCarPlayer g_esCarPlayer[MAXPLAYERS + 1]; enum struct esCarTeammate { float g_flCarChance; + float g_flCarDamage; float g_flCarInterval; float g_flCarLifetime; float g_flCarRadius[2]; @@ -122,6 +133,7 @@ esCarTeammate g_esCarTeammate[MAXPLAYERS + 1]; enum struct esCarAbility { float g_flCarChance; + float g_flCarDamage; float g_flCarInterval; float g_flCarLifetime; float g_flCarRadius[2]; @@ -142,6 +154,7 @@ enum struct esCarAbility int g_iHumanCooldown; int g_iHumanDuration; int g_iHumanMode; + int g_iImmunityFlags; int g_iRequiresHumans; } @@ -150,6 +163,7 @@ esCarAbility g_esCarAbility[MT_MAXTYPES + 1]; enum struct esCarSpecial { float g_flCarChance; + float g_flCarDamage; float g_flCarInterval; float g_flCarLifetime; float g_flCarRadius[2]; @@ -176,6 +190,7 @@ esCarSpecial g_esCarSpecial[MT_MAXTYPES + 1]; enum struct esCarCache { float g_flCarChance; + float g_flCarDamage; float g_flCarInterval; float g_flCarLifetime; float g_flCarRadius[2]; @@ -229,6 +244,7 @@ void vCarClientPutInServer(int client) public void OnClientPutInServer(int client) #endif { + SDKHook(client, SDKHook_OnTakeDamage, OnCarTakeDamage); vRemoveCar(client); } @@ -311,7 +327,15 @@ int iCarMenuHandler(Menu menu, MenuAction action, int param1, int param2) case 0: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esCarCache[param1].g_iCarAbility == 0) ? "AbilityStatus1" : "AbilityStatus2"); case 1: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityAmmo", (g_esCarCache[param1].g_iHumanAmmo - g_esCarPlayer[param1].g_iAmmoCount), g_esCarCache[param1].g_iHumanAmmo); case 2: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtons"); - case 3: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esCarCache[param1].g_iHumanMode == 0) ? "AbilityButtonMode1" : "AbilityButtonMode2"); + case 3: + { + switch (g_esCarCache[param1].g_iHumanMode) + { + case 0: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtonMode1"); + case 1: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtonMode2"); + case 2: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtonMode3"); + } + } case 4: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityCooldown", ((g_esCarCache[param1].g_iHumanAbility == 1) ? g_esCarCache[param1].g_iHumanCooldown : g_esCarCache[param1].g_iCarCooldown)); case 5: MT_PrintToChat(param1, "%s %t", MT_TAG3, "CarDetails"); case 6: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityDuration2", ((g_esCarCache[param1].g_iHumanAbility == 1) ? g_esCarCache[param1].g_iHumanDuration : g_esCarCache[param1].g_iCarDuration)); @@ -389,6 +413,46 @@ public void MT_OnMenuItemDisplayed(int client, const char[] info, char[] buffer, } } +#if defined MT_ABILITIES_MAIN +void vCarEntityDestroyed(int entity) +#else +public void OnEntityDestroyed(int entity) +#endif +{ + if (bIsValidEntity(entity)) + { + g_esCarGeneral.g_iCar[entity] = INVALID_ENT_REFERENCE; + g_esCarGeneral.g_iCarOwner[entity] = -1; + } +} + +Action OnCarTakeDamage(int victim, int &attacker, int &inflictor, float &damage, int &damagetype) +{ + if (MT_IsCorePluginEnabled() && bIsSurvivor(victim) && bIsValidEntity(inflictor) && damage > 0.0) + { + int iCar = EntRefToEntIndex(g_esCarGeneral.g_iCar[inflictor]); + if (iCar > MaxClients && iCar == inflictor) + { + int iTank = g_esCarGeneral.g_iCarOwner[iCar]; + if (MT_IsTankSupported(iTank) && MT_IsCustomTankSupported(iTank)) + { + if ((!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esCarAbility[g_esCarPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esCarPlayer[iTank].g_iAccessFlags)) || MT_IsAdminImmune(victim, iTank) || bIsAdminImmune(victim, g_esCarPlayer[iTank].g_iTankType, g_esCarAbility[g_esCarPlayer[iTank].g_iTankTypeRecorded].g_iImmunityFlags, g_esCarPlayer[victim].g_iImmunityFlags)) + { + return Plugin_Handled; + } + + int iPos = g_esCarAbility[g_esCarPlayer[iTank].g_iTankTypeRecorded].g_iComboPosition; + float flDamage = (iPos != -1) ? MT_GetCombinationSetting(iTank, 3, iPos) : g_esCarCache[iTank].g_flCarDamage; + damage = MT_GetScaledDamage(flDamage); + + return (damage > 0.0) ? Plugin_Changed : Plugin_Handled; + } + } + } + + return Plugin_Continue; +} + Action OnCarStartTouch(int car, int other) { if (bIsValidEntity(car) && bIsValidEntity(other)) @@ -494,6 +558,7 @@ public void MT_OnConfigsLoad(int mode) for (int iIndex = MT_GetMinType(); iIndex <= MT_GetMaxType(); iIndex++) { g_esCarAbility[iIndex].g_iAccessFlags = 0; + g_esCarAbility[iIndex].g_iImmunityFlags = 0; g_esCarAbility[iIndex].g_flCloseAreasOnly = 0.0; g_esCarAbility[iIndex].g_iComboAbility = 0; g_esCarAbility[iIndex].g_iComboPosition = -1; @@ -511,6 +576,7 @@ public void MT_OnConfigsLoad(int mode) g_esCarAbility[iIndex].g_iCarDuration = 5; g_esCarAbility[iIndex].g_iCarOptions = 0; g_esCarAbility[iIndex].g_iCarOwner = 1; + g_esCarAbility[iIndex].g_flCarDamage = 5.0; g_esCarAbility[iIndex].g_flCarInterval = 0.6; g_esCarAbility[iIndex].g_flCarLifetime = 30.0; g_esCarAbility[iIndex].g_flCarRadius[0] = -180.0; @@ -531,6 +597,7 @@ public void MT_OnConfigsLoad(int mode) g_esCarSpecial[iIndex].g_iCarDuration = -1; g_esCarSpecial[iIndex].g_iCarOptions = -1; g_esCarSpecial[iIndex].g_iCarOwner = -1; + g_esCarSpecial[iIndex].g_flCarDamage = -1.0; g_esCarSpecial[iIndex].g_flCarInterval = -1.0; g_esCarSpecial[iIndex].g_flCarLifetime = -1.0; g_esCarSpecial[iIndex].g_flCarRadius[0] = 1.0; @@ -542,6 +609,7 @@ public void MT_OnConfigsLoad(int mode) for (int iPlayer = 1; iPlayer <= MaxClients; iPlayer++) { g_esCarPlayer[iPlayer].g_iAccessFlags = -1; + g_esCarPlayer[iPlayer].g_iImmunityFlags = -1; g_esCarPlayer[iPlayer].g_flCloseAreasOnly = -1.0; g_esCarPlayer[iPlayer].g_iComboAbility = -1; g_esCarPlayer[iPlayer].g_iHumanAbility = -1; @@ -558,6 +626,7 @@ public void MT_OnConfigsLoad(int mode) g_esCarPlayer[iPlayer].g_iCarDuration = -1; g_esCarPlayer[iPlayer].g_iCarOptions = -1; g_esCarPlayer[iPlayer].g_iCarOwner = -1; + g_esCarPlayer[iPlayer].g_flCarDamage = -1.0; g_esCarPlayer[iPlayer].g_flCarInterval = -1.0; g_esCarPlayer[iPlayer].g_flCarLifetime = -1.0; g_esCarPlayer[iPlayer].g_flCarRadius[0] = 1.0; @@ -579,6 +648,7 @@ public void MT_OnConfigsLoad(int mode) g_esCarTeammate[iPlayer].g_iCarDuration = -1; g_esCarTeammate[iPlayer].g_iCarOptions = -1; g_esCarTeammate[iPlayer].g_iCarOwner = -1; + g_esCarTeammate[iPlayer].g_flCarDamage = -1.0; g_esCarTeammate[iPlayer].g_flCarInterval = -1.0; g_esCarTeammate[iPlayer].g_flCarLifetime = -1.0; g_esCarTeammate[iPlayer].g_flCarRadius[0] = 1.0; @@ -604,13 +674,14 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esCarTeammate[admin].g_iHumanAmmo = iGetKeyValue(subsection, MT_CAR_SECTION, MT_CAR_SECTION2, MT_CAR_SECTION3, MT_CAR_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esCarTeammate[admin].g_iHumanAmmo, value, -1, 99999); g_esCarTeammate[admin].g_iHumanCooldown = iGetKeyValue(subsection, MT_CAR_SECTION, MT_CAR_SECTION2, MT_CAR_SECTION3, MT_CAR_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esCarTeammate[admin].g_iHumanCooldown, value, -1, 99999); g_esCarTeammate[admin].g_iHumanDuration = iGetKeyValue(subsection, MT_CAR_SECTION, MT_CAR_SECTION2, MT_CAR_SECTION3, MT_CAR_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esCarTeammate[admin].g_iHumanDuration, value, -1, 99999); - g_esCarTeammate[admin].g_iHumanMode = iGetKeyValue(subsection, MT_CAR_SECTION, MT_CAR_SECTION2, MT_CAR_SECTION3, MT_CAR_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esCarTeammate[admin].g_iHumanMode, value, -1, 1); + g_esCarTeammate[admin].g_iHumanMode = iGetKeyValue(subsection, MT_CAR_SECTION, MT_CAR_SECTION2, MT_CAR_SECTION3, MT_CAR_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esCarTeammate[admin].g_iHumanMode, value, -1, 2); g_esCarTeammate[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_CAR_SECTION, MT_CAR_SECTION2, MT_CAR_SECTION3, MT_CAR_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esCarTeammate[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); g_esCarTeammate[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_CAR_SECTION, MT_CAR_SECTION2, MT_CAR_SECTION3, MT_CAR_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esCarTeammate[admin].g_iRequiresHumans, value, -1, 32); g_esCarTeammate[admin].g_iCarAbility = iGetKeyValue(subsection, MT_CAR_SECTION, MT_CAR_SECTION2, MT_CAR_SECTION3, MT_CAR_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esCarTeammate[admin].g_iCarAbility, value, -1, 1); g_esCarTeammate[admin].g_iCarMessage = iGetKeyValue(subsection, MT_CAR_SECTION, MT_CAR_SECTION2, MT_CAR_SECTION3, MT_CAR_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esCarTeammate[admin].g_iCarMessage, value, -1, 1); g_esCarTeammate[admin].g_flCarChance = flGetKeyValue(subsection, MT_CAR_SECTION, MT_CAR_SECTION2, MT_CAR_SECTION3, MT_CAR_SECTION4, key, "CarChance", "Car Chance", "Car_Chance", "chance", g_esCarTeammate[admin].g_flCarChance, value, -1.0, 100.0); g_esCarTeammate[admin].g_iCarCooldown = iGetKeyValue(subsection, MT_CAR_SECTION, MT_CAR_SECTION2, MT_CAR_SECTION3, MT_CAR_SECTION4, key, "CarCooldown", "Car Cooldown", "Car_Cooldown", "cooldown", g_esCarTeammate[admin].g_iCarCooldown, value, -1, 99999); + g_esCarTeammate[admin].g_flCarDamage = flGetKeyValue(subsection, MT_CAR_SECTION, MT_CAR_SECTION2, MT_CAR_SECTION3, MT_CAR_SECTION4, key, "CarDamage", "Car Damage", "Car_Damage", "damage", g_esCarTeammate[admin].g_flCarDamage, value, -1.0, 99999.0); g_esCarTeammate[admin].g_iCarDuration = iGetKeyValue(subsection, MT_CAR_SECTION, MT_CAR_SECTION2, MT_CAR_SECTION3, MT_CAR_SECTION4, key, "CarDuration", "Car Duration", "Car_Duration", "duration", g_esCarTeammate[admin].g_iCarDuration, value, -1, 99999); g_esCarTeammate[admin].g_flCarInterval = flGetKeyValue(subsection, MT_CAR_SECTION, MT_CAR_SECTION2, MT_CAR_SECTION3, MT_CAR_SECTION4, key, "CarInterval", "Car Interval", "Car_Interval", "interval", g_esCarTeammate[admin].g_flCarInterval, value, -1.0, 1.0); g_esCarTeammate[admin].g_flCarLifetime = flGetKeyValue(subsection, MT_CAR_SECTION, MT_CAR_SECTION2, MT_CAR_SECTION3, MT_CAR_SECTION4, key, "CarLifetime", "Car Lifetime", "Car_Lifetime", "lifetime", g_esCarTeammate[admin].g_flCarLifetime, value, -1.0, 99999.0); @@ -625,19 +696,21 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esCarPlayer[admin].g_iHumanAmmo = iGetKeyValue(subsection, MT_CAR_SECTION, MT_CAR_SECTION2, MT_CAR_SECTION3, MT_CAR_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esCarPlayer[admin].g_iHumanAmmo, value, -1, 99999); g_esCarPlayer[admin].g_iHumanCooldown = iGetKeyValue(subsection, MT_CAR_SECTION, MT_CAR_SECTION2, MT_CAR_SECTION3, MT_CAR_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esCarPlayer[admin].g_iHumanCooldown, value, -1, 99999); g_esCarPlayer[admin].g_iHumanDuration = iGetKeyValue(subsection, MT_CAR_SECTION, MT_CAR_SECTION2, MT_CAR_SECTION3, MT_CAR_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esCarPlayer[admin].g_iHumanDuration, value, -1, 99999); - g_esCarPlayer[admin].g_iHumanMode = iGetKeyValue(subsection, MT_CAR_SECTION, MT_CAR_SECTION2, MT_CAR_SECTION3, MT_CAR_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esCarPlayer[admin].g_iHumanMode, value, -1, 1); + g_esCarPlayer[admin].g_iHumanMode = iGetKeyValue(subsection, MT_CAR_SECTION, MT_CAR_SECTION2, MT_CAR_SECTION3, MT_CAR_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esCarPlayer[admin].g_iHumanMode, value, -1, 2); g_esCarPlayer[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_CAR_SECTION, MT_CAR_SECTION2, MT_CAR_SECTION3, MT_CAR_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esCarPlayer[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); g_esCarPlayer[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_CAR_SECTION, MT_CAR_SECTION2, MT_CAR_SECTION3, MT_CAR_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esCarPlayer[admin].g_iRequiresHumans, value, -1, 32); g_esCarPlayer[admin].g_iCarAbility = iGetKeyValue(subsection, MT_CAR_SECTION, MT_CAR_SECTION2, MT_CAR_SECTION3, MT_CAR_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esCarPlayer[admin].g_iCarAbility, value, -1, 1); g_esCarPlayer[admin].g_iCarMessage = iGetKeyValue(subsection, MT_CAR_SECTION, MT_CAR_SECTION2, MT_CAR_SECTION3, MT_CAR_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esCarPlayer[admin].g_iCarMessage, value, -1, 1); g_esCarPlayer[admin].g_flCarChance = flGetKeyValue(subsection, MT_CAR_SECTION, MT_CAR_SECTION2, MT_CAR_SECTION3, MT_CAR_SECTION4, key, "CarChance", "Car Chance", "Car_Chance", "chance", g_esCarPlayer[admin].g_flCarChance, value, -1.0, 100.0); g_esCarPlayer[admin].g_iCarCooldown = iGetKeyValue(subsection, MT_CAR_SECTION, MT_CAR_SECTION2, MT_CAR_SECTION3, MT_CAR_SECTION4, key, "CarCooldown", "Car Cooldown", "Car_Cooldown", "cooldown", g_esCarPlayer[admin].g_iCarCooldown, value, -1, 99999); + g_esCarPlayer[admin].g_flCarDamage = flGetKeyValue(subsection, MT_CAR_SECTION, MT_CAR_SECTION2, MT_CAR_SECTION3, MT_CAR_SECTION4, key, "CarDamage", "Car Damage", "Car_Damage", "damage", g_esCarPlayer[admin].g_flCarDamage, value, -1.0, 99999.0); g_esCarPlayer[admin].g_iCarDuration = iGetKeyValue(subsection, MT_CAR_SECTION, MT_CAR_SECTION2, MT_CAR_SECTION3, MT_CAR_SECTION4, key, "CarDuration", "Car Duration", "Car_Duration", "duration", g_esCarPlayer[admin].g_iCarDuration, value, -1, 99999); g_esCarPlayer[admin].g_flCarInterval = flGetKeyValue(subsection, MT_CAR_SECTION, MT_CAR_SECTION2, MT_CAR_SECTION3, MT_CAR_SECTION4, key, "CarInterval", "Car Interval", "Car_Interval", "interval", g_esCarPlayer[admin].g_flCarInterval, value, -1.0, 1.0); g_esCarPlayer[admin].g_flCarLifetime = flGetKeyValue(subsection, MT_CAR_SECTION, MT_CAR_SECTION2, MT_CAR_SECTION3, MT_CAR_SECTION4, key, "CarLifetime", "Car Lifetime", "Car_Lifetime", "lifetime", g_esCarPlayer[admin].g_flCarLifetime, value, -1.0, 99999.0); g_esCarPlayer[admin].g_iCarOptions = iGetKeyValue(subsection, MT_CAR_SECTION, MT_CAR_SECTION2, MT_CAR_SECTION3, MT_CAR_SECTION4, key, "CarOptions", "Car Options", "Car_Options", "options", g_esCarPlayer[admin].g_iCarOptions, value, -1, 7); g_esCarPlayer[admin].g_iCarOwner = iGetKeyValue(subsection, MT_CAR_SECTION, MT_CAR_SECTION2, MT_CAR_SECTION3, MT_CAR_SECTION4, key, "CarOwner", "Car Owner", "Car_Owner", "owner", g_esCarPlayer[admin].g_iCarOwner, value, -1, 1); g_esCarPlayer[admin].g_iAccessFlags = iGetAdminFlagsValue(subsection, MT_CAR_SECTION, MT_CAR_SECTION2, MT_CAR_SECTION3, MT_CAR_SECTION4, key, "AccessFlags", "Access Flags", "Access_Flags", "access", value); + g_esCarPlayer[admin].g_iImmunityFlags = iGetAdminFlagsValue(subsection, MT_CAR_SECTION, MT_CAR_SECTION2, MT_CAR_SECTION3, MT_CAR_SECTION4, key, "ImmunityFlags", "Immunity Flags", "Immunity_Flags", "immunity", value); } if (StrEqual(subsection, MT_CAR_SECTION, false) || StrEqual(subsection, MT_CAR_SECTION2, false) || StrEqual(subsection, MT_CAR_SECTION3, false) || StrEqual(subsection, MT_CAR_SECTION4, false)) @@ -673,13 +746,14 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esCarSpecial[type].g_iHumanAmmo = iGetKeyValue(subsection, MT_CAR_SECTION, MT_CAR_SECTION2, MT_CAR_SECTION3, MT_CAR_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esCarSpecial[type].g_iHumanAmmo, value, -1, 99999); g_esCarSpecial[type].g_iHumanCooldown = iGetKeyValue(subsection, MT_CAR_SECTION, MT_CAR_SECTION2, MT_CAR_SECTION3, MT_CAR_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esCarSpecial[type].g_iHumanCooldown, value, -1, 99999); g_esCarSpecial[type].g_iHumanDuration = iGetKeyValue(subsection, MT_CAR_SECTION, MT_CAR_SECTION2, MT_CAR_SECTION3, MT_CAR_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esCarSpecial[type].g_iHumanDuration, value, -1, 99999); - g_esCarSpecial[type].g_iHumanMode = iGetKeyValue(subsection, MT_CAR_SECTION, MT_CAR_SECTION2, MT_CAR_SECTION3, MT_CAR_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esCarSpecial[type].g_iHumanMode, value, -1, 1); + g_esCarSpecial[type].g_iHumanMode = iGetKeyValue(subsection, MT_CAR_SECTION, MT_CAR_SECTION2, MT_CAR_SECTION3, MT_CAR_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esCarSpecial[type].g_iHumanMode, value, -1, 2); g_esCarSpecial[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_CAR_SECTION, MT_CAR_SECTION2, MT_CAR_SECTION3, MT_CAR_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esCarSpecial[type].g_flOpenAreasOnly, value, -1.0, 99999.0); g_esCarSpecial[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_CAR_SECTION, MT_CAR_SECTION2, MT_CAR_SECTION3, MT_CAR_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esCarSpecial[type].g_iRequiresHumans, value, -1, 32); g_esCarSpecial[type].g_iCarAbility = iGetKeyValue(subsection, MT_CAR_SECTION, MT_CAR_SECTION2, MT_CAR_SECTION3, MT_CAR_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esCarSpecial[type].g_iCarAbility, value, -1, 1); g_esCarSpecial[type].g_iCarMessage = iGetKeyValue(subsection, MT_CAR_SECTION, MT_CAR_SECTION2, MT_CAR_SECTION3, MT_CAR_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esCarSpecial[type].g_iCarMessage, value, -1, 1); g_esCarSpecial[type].g_flCarChance = flGetKeyValue(subsection, MT_CAR_SECTION, MT_CAR_SECTION2, MT_CAR_SECTION3, MT_CAR_SECTION4, key, "CarChance", "Car Chance", "Car_Chance", "chance", g_esCarSpecial[type].g_flCarChance, value, -1.0, 100.0); g_esCarSpecial[type].g_iCarCooldown = iGetKeyValue(subsection, MT_CAR_SECTION, MT_CAR_SECTION2, MT_CAR_SECTION3, MT_CAR_SECTION4, key, "CarCooldown", "Car Cooldown", "Car_Cooldown", "cooldown", g_esCarSpecial[type].g_iCarCooldown, value, -1, 99999); + g_esCarSpecial[type].g_flCarDamage = flGetKeyValue(subsection, MT_CAR_SECTION, MT_CAR_SECTION2, MT_CAR_SECTION3, MT_CAR_SECTION4, key, "CarDamage", "Car Damage", "Car_Damage", "damage", g_esCarSpecial[type].g_flCarDamage, value, -1.0, 99999.0); g_esCarSpecial[type].g_iCarDuration = iGetKeyValue(subsection, MT_CAR_SECTION, MT_CAR_SECTION2, MT_CAR_SECTION3, MT_CAR_SECTION4, key, "CarDuration", "Car Duration", "Car_Duration", "duration", g_esCarSpecial[type].g_iCarDuration, value, -1, 99999); g_esCarSpecial[type].g_flCarInterval = flGetKeyValue(subsection, MT_CAR_SECTION, MT_CAR_SECTION2, MT_CAR_SECTION3, MT_CAR_SECTION4, key, "CarInterval", "Car Interval", "Car_Interval", "interval", g_esCarSpecial[type].g_flCarInterval, value, -1.0, 1.0); g_esCarSpecial[type].g_flCarLifetime = flGetKeyValue(subsection, MT_CAR_SECTION, MT_CAR_SECTION2, MT_CAR_SECTION3, MT_CAR_SECTION4, key, "CarLifetime", "Car Lifetime", "Car_Lifetime", "lifetime", g_esCarSpecial[type].g_flCarLifetime, value, -1.0, 99999.0); @@ -694,19 +768,21 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esCarAbility[type].g_iHumanAmmo = iGetKeyValue(subsection, MT_CAR_SECTION, MT_CAR_SECTION2, MT_CAR_SECTION3, MT_CAR_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esCarAbility[type].g_iHumanAmmo, value, -1, 99999); g_esCarAbility[type].g_iHumanCooldown = iGetKeyValue(subsection, MT_CAR_SECTION, MT_CAR_SECTION2, MT_CAR_SECTION3, MT_CAR_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esCarAbility[type].g_iHumanCooldown, value, -1, 99999); g_esCarAbility[type].g_iHumanDuration = iGetKeyValue(subsection, MT_CAR_SECTION, MT_CAR_SECTION2, MT_CAR_SECTION3, MT_CAR_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esCarAbility[type].g_iHumanDuration, value, -1, 99999); - g_esCarAbility[type].g_iHumanMode = iGetKeyValue(subsection, MT_CAR_SECTION, MT_CAR_SECTION2, MT_CAR_SECTION3, MT_CAR_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esCarAbility[type].g_iHumanMode, value, -1, 1); + g_esCarAbility[type].g_iHumanMode = iGetKeyValue(subsection, MT_CAR_SECTION, MT_CAR_SECTION2, MT_CAR_SECTION3, MT_CAR_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esCarAbility[type].g_iHumanMode, value, -1, 2); g_esCarAbility[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_CAR_SECTION, MT_CAR_SECTION2, MT_CAR_SECTION3, MT_CAR_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esCarAbility[type].g_flOpenAreasOnly, value, -1.0, 99999.0); g_esCarAbility[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_CAR_SECTION, MT_CAR_SECTION2, MT_CAR_SECTION3, MT_CAR_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esCarAbility[type].g_iRequiresHumans, value, -1, 32); g_esCarAbility[type].g_iCarAbility = iGetKeyValue(subsection, MT_CAR_SECTION, MT_CAR_SECTION2, MT_CAR_SECTION3, MT_CAR_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esCarAbility[type].g_iCarAbility, value, -1, 1); g_esCarAbility[type].g_iCarMessage = iGetKeyValue(subsection, MT_CAR_SECTION, MT_CAR_SECTION2, MT_CAR_SECTION3, MT_CAR_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esCarAbility[type].g_iCarMessage, value, -1, 1); g_esCarAbility[type].g_flCarChance = flGetKeyValue(subsection, MT_CAR_SECTION, MT_CAR_SECTION2, MT_CAR_SECTION3, MT_CAR_SECTION4, key, "CarChance", "Car Chance", "Car_Chance", "chance", g_esCarAbility[type].g_flCarChance, value, -1.0, 100.0); g_esCarAbility[type].g_iCarCooldown = iGetKeyValue(subsection, MT_CAR_SECTION, MT_CAR_SECTION2, MT_CAR_SECTION3, MT_CAR_SECTION4, key, "CarCooldown", "Car Cooldown", "Car_Cooldown", "cooldown", g_esCarAbility[type].g_iCarCooldown, value, -1, 99999); + g_esCarAbility[type].g_flCarDamage = flGetKeyValue(subsection, MT_CAR_SECTION, MT_CAR_SECTION2, MT_CAR_SECTION3, MT_CAR_SECTION4, key, "CarDamage", "Car Damage", "Car_Damage", "damage", g_esCarAbility[type].g_flCarDamage, value, -1.0, 99999.0); g_esCarAbility[type].g_iCarDuration = iGetKeyValue(subsection, MT_CAR_SECTION, MT_CAR_SECTION2, MT_CAR_SECTION3, MT_CAR_SECTION4, key, "CarDuration", "Car Duration", "Car_Duration", "duration", g_esCarAbility[type].g_iCarDuration, value, -1, 99999); g_esCarAbility[type].g_flCarInterval = flGetKeyValue(subsection, MT_CAR_SECTION, MT_CAR_SECTION2, MT_CAR_SECTION3, MT_CAR_SECTION4, key, "CarInterval", "Car Interval", "Car_Interval", "interval", g_esCarAbility[type].g_flCarInterval, value, -1.0, 1.0); g_esCarAbility[type].g_flCarLifetime = flGetKeyValue(subsection, MT_CAR_SECTION, MT_CAR_SECTION2, MT_CAR_SECTION3, MT_CAR_SECTION4, key, "CarLifetime", "Car Lifetime", "Car_Lifetime", "lifetime", g_esCarAbility[type].g_flCarLifetime, value, -1.0, 99999.0); g_esCarAbility[type].g_iCarOptions = iGetKeyValue(subsection, MT_CAR_SECTION, MT_CAR_SECTION2, MT_CAR_SECTION3, MT_CAR_SECTION4, key, "CarOptions", "Car Options", "Car_Options", "options", g_esCarAbility[type].g_iCarOptions, value, -1, 7); g_esCarAbility[type].g_iCarOwner = iGetKeyValue(subsection, MT_CAR_SECTION, MT_CAR_SECTION2, MT_CAR_SECTION3, MT_CAR_SECTION4, key, "CarOwner", "Car Owner", "Car_Owner", "owner", g_esCarAbility[type].g_iCarOwner, value, -1, 1); g_esCarAbility[type].g_iAccessFlags = iGetAdminFlagsValue(subsection, MT_CAR_SECTION, MT_CAR_SECTION2, MT_CAR_SECTION3, MT_CAR_SECTION4, key, "AccessFlags", "Access Flags", "Access_Flags", "access", value); + g_esCarAbility[type].g_iImmunityFlags = iGetAdminFlagsValue(subsection, MT_CAR_SECTION, MT_CAR_SECTION2, MT_CAR_SECTION3, MT_CAR_SECTION4, key, "ImmunityFlags", "Immunity Flags", "Immunity_Flags", "immunity", value); } if (StrEqual(subsection, MT_CAR_SECTION, false) || StrEqual(subsection, MT_CAR_SECTION2, false) || StrEqual(subsection, MT_CAR_SECTION3, false) || StrEqual(subsection, MT_CAR_SECTION4, false)) @@ -747,6 +823,7 @@ public void MT_OnSettingsCached(int tank, bool apply, int type) if (bIsSpecialInfected(tank, MT_CHECK_INDEX|MT_CHECK_INGAME)) { g_esCarCache[tank].g_flCarChance = flGetSubSettingValue(apply, bHuman, g_esCarTeammate[tank].g_flCarChance, g_esCarPlayer[tank].g_flCarChance, g_esCarSpecial[iType].g_flCarChance, g_esCarAbility[iType].g_flCarChance, 1); + g_esCarCache[tank].g_flCarDamage = flGetSubSettingValue(apply, bHuman, g_esCarTeammate[tank].g_flCarDamage, g_esCarPlayer[tank].g_flCarDamage, g_esCarSpecial[iType].g_flCarDamage, g_esCarAbility[iType].g_flCarDamage, 1); g_esCarCache[tank].g_flCarInterval = flGetSubSettingValue(apply, bHuman, g_esCarTeammate[tank].g_flCarInterval, g_esCarPlayer[tank].g_flCarInterval, g_esCarSpecial[iType].g_flCarInterval, g_esCarAbility[iType].g_flCarInterval, 1); g_esCarCache[tank].g_flCarLifetime = flGetSubSettingValue(apply, bHuman, g_esCarTeammate[tank].g_flCarLifetime, g_esCarPlayer[tank].g_flCarLifetime, g_esCarSpecial[iType].g_flCarLifetime, g_esCarAbility[iType].g_flCarLifetime, 1); g_esCarCache[tank].g_flCarRadius[0] = flGetSubSettingValue(apply, bHuman, g_esCarTeammate[tank].g_flCarRadius[0], g_esCarPlayer[tank].g_flCarRadius[0], g_esCarSpecial[iType].g_flCarRadius[0], g_esCarAbility[iType].g_flCarRadius[0], 2, 1.0); @@ -770,6 +847,7 @@ public void MT_OnSettingsCached(int tank, bool apply, int type) else { g_esCarCache[tank].g_flCarChance = flGetSettingValue(apply, bHuman, g_esCarPlayer[tank].g_flCarChance, g_esCarAbility[iType].g_flCarChance, 1); + g_esCarCache[tank].g_flCarDamage = flGetSettingValue(apply, bHuman, g_esCarPlayer[tank].g_flCarDamage, g_esCarAbility[iType].g_flCarDamage, 1); g_esCarCache[tank].g_flCarInterval = flGetSettingValue(apply, bHuman, g_esCarPlayer[tank].g_flCarInterval, g_esCarAbility[iType].g_flCarInterval, 1); g_esCarCache[tank].g_flCarLifetime = flGetSettingValue(apply, bHuman, g_esCarPlayer[tank].g_flCarLifetime, g_esCarAbility[iType].g_flCarLifetime, 1); g_esCarCache[tank].g_flCarRadius[0] = flGetSettingValue(apply, bHuman, g_esCarPlayer[tank].g_flCarRadius[0], g_esCarAbility[iType].g_flCarRadius[0], 2, 1.0); @@ -885,10 +963,10 @@ public void MT_OnButtonPressed(int tank, int button) if ((button & MT_MAIN_KEY) && g_esCarCache[tank].g_iCarAbility == 1 && g_esCarCache[tank].g_iHumanAbility == 1) { - int iTime = GetTime(); + int iHumanMode = g_esCarCache[tank].g_iHumanMode, iTime = GetTime(); bool bRecharging = g_esCarPlayer[tank].g_iCooldown != -1 && g_esCarPlayer[tank].g_iCooldown >= iTime; - switch (g_esCarCache[tank].g_iHumanMode) + switch (iHumanMode) { case 0: { @@ -905,9 +983,9 @@ public void MT_OnButtonPressed(int tank, int button) MT_PrintToChat(tank, "%s %t", MT_TAG3, "CarHuman4", (g_esCarPlayer[tank].g_iCooldown - iTime)); } } - case 1: + case 1, 2: { - if (g_esCarPlayer[tank].g_iAmmoCount < g_esCarCache[tank].g_iHumanAmmo && g_esCarCache[tank].g_iHumanAmmo > 0) + if ((iHumanMode == 2 && g_esCarPlayer[tank].g_bActivated) || (g_esCarPlayer[tank].g_iAmmoCount < g_esCarCache[tank].g_iHumanAmmo && g_esCarCache[tank].g_iHumanAmmo > 0)) { if (!g_esCarPlayer[tank].g_bActivated && !bRecharging) { @@ -919,7 +997,15 @@ public void MT_OnButtonPressed(int tank, int button) } else if (g_esCarPlayer[tank].g_bActivated) { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "CarHuman3"); + switch (iHumanMode) + { + case 1: MT_PrintToChat(tank, "%s %t", MT_TAG3, "CarHuman3"); + case 2: + { + vCarReset2(tank); + vCarReset3(tank); + } + } } else if (bRecharging) { @@ -1212,6 +1298,8 @@ Action tTimerCar(Handle timer, DataPack pack) TeleportEntity(iCar, .velocity = flVelocity); SDKHook(iCar, SDKHook_StartTouch, OnCarStartTouch); + g_esCarGeneral.g_iCar[iCar] = EntIndexToEntRef(iCar); + g_esCarGeneral.g_iCarOwner[iCar] = GetClientUserId(iTank); iCar = EntIndexToEntRef(iCar); vDeleteEntity(iCar, g_esCarCache[iTank].g_flCarLifetime); } @@ -1220,16 +1308,18 @@ Action tTimerCar(Handle timer, DataPack pack) return Plugin_Continue; } -void tTimerCarCombo(Handle timer, DataPack pack) +Action tTimerCarCombo(Handle timer, DataPack pack) { pack.Reset(); int iTank = GetClientOfUserId(pack.ReadCell()); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esCarAbility[g_esCarPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esCarPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esCarPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esCarCache[iTank].g_iCarAbility == 0 || g_esCarPlayer[iTank].g_bActivated) { - return; + return Plugin_Stop; } int iPos = pack.ReadCell(); vCar(iTank, iPos); + + return Plugin_Continue; } \ No newline at end of file diff --git a/addons/sourcemod/scripting/mutant_tanks/abilities/mt_choke.sp b/addons/sourcemod/scripting/mutant_tanks/abilities/mt_choke.sp index 08a3e1a6bd..f33acedf9e 100644 --- a/addons/sourcemod/scripting/mutant_tanks/abilities/mt_choke.sp +++ b/addons/sourcemod/scripting/mutant_tanks/abilities/mt_choke.sp @@ -1,6 +1,6 @@ /** - * Mutant Tanks: a L4D/L4D2 SourceMod Plugin - * Copyright (C) 2024 Alfred "Psyk0tik" Llagas + * Mutant Tanks: A L4D/L4D2 SourceMod Plugin + * Copyright (C) 2017-2025 Alfred "Psyk0tik" Llagas * * 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. * @@ -443,7 +443,7 @@ public Action OnPlayerRunCmd(int client, int &buttons, int &impulse, float vel[3 { TeleportEntity(client, .angles = g_esChokePlayer[client].g_flAngle); - int iWeapon = GetEntPropEnt(client, Prop_Send, "m_hActiveWeapon"); + int iWeapon = iGetSurvivorActiveWeapon(client); if (iWeapon > MaxClients && g_esChokePlayer[client].g_flDuration > 0.0) { SetEntPropFloat(iWeapon, Prop_Send, "m_flNextPrimaryAttack", g_esChokePlayer[client].g_flDuration); @@ -1189,7 +1189,7 @@ void vChokeHit(int survivor, int tank, float random, float chance, int enabled, flDuration = (pos != -1) ? MT_GetCombinationSetting(tank, 5, pos) : float(g_esChokeCache[tank].g_iChokeDuration); if (flDelay > 0.0) { - int iWeapon = GetEntPropEnt(survivor, Prop_Send, "m_hActiveWeapon"); + int iWeapon = iGetSurvivorActiveWeapon(survivor); if (iWeapon > MaxClients) { g_esChokePlayer[survivor].g_flDuration = GetGameTime() + flDelay + flDuration + 1.0; @@ -1316,35 +1316,37 @@ void vChokeReset3(int tank) g_esChokePlayer[tank].g_iRangeCooldown = -1; } -void tTimerChokeCombo(Handle timer, DataPack pack) +Action tTimerChokeCombo(Handle timer, DataPack pack) { pack.Reset(); int iTank = GetClientOfUserId(pack.ReadCell()); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esChokeAbility[g_esChokePlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esChokePlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esChokePlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esChokeCache[iTank].g_iChokeAbility == 0) { - return; + return Plugin_Stop; } float flRandom = pack.ReadFloat(); int iPos = pack.ReadCell(); vChokeAbility(iTank, flRandom, iPos); + + return Plugin_Continue; } -void tTimerChokeCombo2(Handle timer, DataPack pack) +Action tTimerChokeCombo2(Handle timer, DataPack pack) { pack.Reset(); int iSurvivor = GetClientOfUserId(pack.ReadCell()); if (!bIsHumanSurvivor(iSurvivor) || g_esChokePlayer[iSurvivor].g_bAffected) { - return; + return Plugin_Stop; } int iTank = GetClientOfUserId(pack.ReadCell()); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esChokeAbility[g_esChokePlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esChokePlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esChokePlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esChokeCache[iTank].g_iChokeHit == 0) { - return; + return Plugin_Stop; } float flRandom = pack.ReadFloat(), flChance = pack.ReadFloat(); @@ -1359,9 +1361,11 @@ void tTimerChokeCombo2(Handle timer, DataPack pack) { vChokeHit(iSurvivor, iTank, flRandom, flChance, g_esChokeCache[iTank].g_iChokeHit, MT_MESSAGE_MELEE, MT_ATTACK_MELEE, iPos); } + + return Plugin_Continue; } -void tTimerChokeLaunch(Handle timer, DataPack pack) +Action tTimerChokeLaunch(Handle timer, DataPack pack) { pack.Reset(); @@ -1371,7 +1375,7 @@ void tTimerChokeLaunch(Handle timer, DataPack pack) g_esChokePlayer[iSurvivor].g_bAffected = false; g_esChokePlayer[iSurvivor].g_iOwner = -1; - return; + return Plugin_Stop; } int iTank = GetClientOfUserId(pack.ReadCell()), iType = pack.ReadCell(), iChokeEnabled = pack.ReadCell(); @@ -1380,7 +1384,7 @@ void tTimerChokeLaunch(Handle timer, DataPack pack) g_esChokePlayer[iSurvivor].g_bAffected = false; g_esChokePlayer[iSurvivor].g_iOwner = -1; - return; + return Plugin_Stop; } g_esChokePlayer[iSurvivor].g_bBlockFall = g_esChokeCache[iTank].g_iChokeBlock == 1; @@ -1399,6 +1403,8 @@ void tTimerChokeLaunch(Handle timer, DataPack pack) dpChokeDamage.WriteCell(iChokeEnabled); dpChokeDamage.WriteCell(iPos); dpChokeDamage.WriteCell(GetTime()); + + return Plugin_Continue; } Action tTimerChokeDamage(Handle timer, DataPack pack) @@ -1450,13 +1456,15 @@ Action tTimerChokeDamage(Handle timer, DataPack pack) return Plugin_Continue; } -void tTimerChokeGravityReset(Handle timer, int userid) +Action tTimerChokeGravityReset(Handle timer, int userid) { int iSurvivor = GetClientOfUserId(userid); if (!bIsSurvivor(iSurvivor)) { - return; + return Plugin_Stop; } SetEntityGravity(iSurvivor, 1.0); + + return Plugin_Continue; } \ No newline at end of file diff --git a/addons/sourcemod/scripting/mutant_tanks/abilities/mt_clone.sp b/addons/sourcemod/scripting/mutant_tanks/abilities/mt_clone.sp index c9841c4ef9..66640389a9 100644 --- a/addons/sourcemod/scripting/mutant_tanks/abilities/mt_clone.sp +++ b/addons/sourcemod/scripting/mutant_tanks/abilities/mt_clone.sp @@ -1,6 +1,6 @@ /** - * Mutant Tanks: a L4D/L4D2 SourceMod Plugin - * Copyright (C) 2024 Alfred "Psyk0tik" Llagas + * Mutant Tanks: A L4D/L4D2 SourceMod Plugin + * Copyright (C) 2017-2025 Alfred "Psyk0tik" Llagas * * 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. * @@ -79,8 +79,8 @@ enum struct esClonePlayer int g_iCloneCooldown; int g_iCloneHealth; int g_iCloneMaxType; - int g_iCloneMinType; int g_iCloneMessage; + int g_iCloneMinType; int g_iCloneMode; int g_iCloneRemove; int g_iCloneReplace; @@ -111,8 +111,8 @@ enum struct esCloneTeammate int g_iCloneCooldown; int g_iCloneHealth; int g_iCloneMaxType; - int g_iCloneMinType; int g_iCloneMessage; + int g_iCloneMinType; int g_iCloneMode; int g_iCloneRemove; int g_iCloneReplace; @@ -139,8 +139,8 @@ enum struct esCloneAbility int g_iCloneCooldown; int g_iCloneHealth; int g_iCloneMaxType; - int g_iCloneMinType; int g_iCloneMessage; + int g_iCloneMinType; int g_iCloneMode; int g_iCloneRemove; int g_iCloneReplace; @@ -167,8 +167,8 @@ enum struct esCloneSpecial int g_iCloneCooldown; int g_iCloneHealth; int g_iCloneMaxType; - int g_iCloneMinType; int g_iCloneMessage; + int g_iCloneMinType; int g_iCloneMode; int g_iCloneRemove; int g_iCloneReplace; @@ -194,8 +194,8 @@ enum struct esCloneCache int g_iCloneCooldown; int g_iCloneHealth; int g_iCloneMaxType; - int g_iCloneMinType; int g_iCloneMessage; + int g_iCloneMinType; int g_iCloneMode; int g_iCloneRemove; int g_iCloneReplace; @@ -772,8 +772,8 @@ public void MT_OnSettingsCached(int tank, bool apply, int type) g_esCloneCache[tank].g_iCloneCooldown = iGetSubSettingValue(apply, bHuman, g_esCloneTeammate[tank].g_iCloneCooldown, g_esClonePlayer[tank].g_iCloneCooldown, g_esCloneSpecial[iType].g_iCloneCooldown, g_esCloneAbility[iType].g_iCloneCooldown, 1); g_esCloneCache[tank].g_iCloneHealth = iGetSubSettingValue(apply, bHuman, g_esCloneTeammate[tank].g_iCloneHealth, g_esClonePlayer[tank].g_iCloneHealth, g_esCloneSpecial[iType].g_iCloneHealth, g_esCloneAbility[iType].g_iCloneHealth, 1); g_esCloneCache[tank].g_iCloneMaxType = iGetSubSettingValue(apply, bHuman, g_esCloneTeammate[tank].g_iCloneMaxType, g_esClonePlayer[tank].g_iCloneMaxType, g_esCloneSpecial[iType].g_iCloneMaxType, g_esCloneAbility[iType].g_iCloneMaxType, 1); - g_esCloneCache[tank].g_iCloneMinType = iGetSubSettingValue(apply, bHuman, g_esCloneTeammate[tank].g_iCloneMinType, g_esClonePlayer[tank].g_iCloneMinType, g_esCloneSpecial[iType].g_iCloneMinType, g_esCloneAbility[iType].g_iCloneMinType, 1); g_esCloneCache[tank].g_iCloneMessage = iGetSubSettingValue(apply, bHuman, g_esCloneTeammate[tank].g_iCloneMessage, g_esClonePlayer[tank].g_iCloneMessage, g_esCloneSpecial[iType].g_iCloneMessage, g_esCloneAbility[iType].g_iCloneMessage, 1); + g_esCloneCache[tank].g_iCloneMinType = iGetSubSettingValue(apply, bHuman, g_esCloneTeammate[tank].g_iCloneMinType, g_esClonePlayer[tank].g_iCloneMinType, g_esCloneSpecial[iType].g_iCloneMinType, g_esCloneAbility[iType].g_iCloneMinType, 1); g_esCloneCache[tank].g_iCloneMode = iGetSubSettingValue(apply, bHuman, g_esCloneTeammate[tank].g_iCloneMode, g_esClonePlayer[tank].g_iCloneMode, g_esCloneSpecial[iType].g_iCloneMode, g_esCloneAbility[iType].g_iCloneMode, 1); g_esCloneCache[tank].g_iCloneRemove = iGetSubSettingValue(apply, bHuman, g_esCloneTeammate[tank].g_iCloneRemove, g_esClonePlayer[tank].g_iCloneRemove, g_esCloneSpecial[iType].g_iCloneRemove, g_esCloneAbility[iType].g_iCloneRemove, 1); g_esCloneCache[tank].g_iCloneReplace = iGetSubSettingValue(apply, bHuman, g_esCloneTeammate[tank].g_iCloneReplace, g_esClonePlayer[tank].g_iCloneReplace, g_esCloneSpecial[iType].g_iCloneReplace, g_esCloneAbility[iType].g_iCloneReplace, 1); @@ -795,8 +795,8 @@ public void MT_OnSettingsCached(int tank, bool apply, int type) g_esCloneCache[tank].g_iCloneCooldown = iGetSettingValue(apply, bHuman, g_esClonePlayer[tank].g_iCloneCooldown, g_esCloneAbility[iType].g_iCloneCooldown, 1); g_esCloneCache[tank].g_iCloneHealth = iGetSettingValue(apply, bHuman, g_esClonePlayer[tank].g_iCloneHealth, g_esCloneAbility[iType].g_iCloneHealth, 1); g_esCloneCache[tank].g_iCloneMaxType = iGetSettingValue(apply, bHuman, g_esClonePlayer[tank].g_iCloneMaxType, g_esCloneAbility[iType].g_iCloneMaxType, 1); - g_esCloneCache[tank].g_iCloneMinType = iGetSettingValue(apply, bHuman, g_esClonePlayer[tank].g_iCloneMinType, g_esCloneAbility[iType].g_iCloneMinType, 1); g_esCloneCache[tank].g_iCloneMessage = iGetSettingValue(apply, bHuman, g_esClonePlayer[tank].g_iCloneMessage, g_esCloneAbility[iType].g_iCloneMessage, 1); + g_esCloneCache[tank].g_iCloneMinType = iGetSettingValue(apply, bHuman, g_esClonePlayer[tank].g_iCloneMinType, g_esCloneAbility[iType].g_iCloneMinType, 1); g_esCloneCache[tank].g_iCloneMode = iGetSettingValue(apply, bHuman, g_esClonePlayer[tank].g_iCloneMode, g_esCloneAbility[iType].g_iCloneMode, 1); g_esCloneCache[tank].g_iCloneRemove = iGetSettingValue(apply, bHuman, g_esClonePlayer[tank].g_iCloneRemove, g_esCloneAbility[iType].g_iCloneRemove, 1); g_esCloneCache[tank].g_iCloneReplace = iGetSettingValue(apply, bHuman, g_esClonePlayer[tank].g_iCloneReplace, g_esCloneAbility[iType].g_iCloneReplace, 1); @@ -1128,6 +1128,7 @@ void vClone2(int tank, int min = 0, int max = 0) iMax = (max > 0) ? max : MT_GetMaxType(), iSpecType = iGetInfectedType(tank), iType = iMin, iTypeCount = 0, iTankTypes[MT_MAXTYPES + 1]; + if (iMin != iMax) { for (int iIndex = iMin; iIndex <= iMax; iIndex++) @@ -1144,7 +1145,7 @@ void vClone2(int tank, int min = 0, int max = 0) iType = (iTypeCount > 0) ? iTankTypes[MT_GetRandomInt(1, iTypeCount)] : g_esClonePlayer[tank].g_iTankType; } - MT_SpawnTank(tank, iType); + MT_SpawnTank(tank, iType, iSpecType); } void vCloneAbility(int tank) @@ -1229,26 +1230,30 @@ void vCloneReset() } } -void tTimerCloneCombo(Handle timer, int userid) +Action tTimerCloneCombo(Handle timer, int userid) { int iTank = GetClientOfUserId(userid); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esCloneAbility[g_esClonePlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esClonePlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esClonePlayer[iTank].g_iTankType, iTank) || g_esClonePlayer[iTank].g_bCloned || g_esCloneCache[iTank].g_iCloneAbility == 0) { - return; + return Plugin_Stop; } vClone(iTank); + + return Plugin_Continue; } -void tTimerKillClone(Handle timer, int userid) +Action tTimerKillClone(Handle timer, int userid) { int iTank = GetClientOfUserId(userid); if (!MT_IsTankSupported(iTank) || !g_esClonePlayer[iTank].g_bCloned) { - return; + return Plugin_Stop; } ForcePlayerSuicide(iTank); + + return Plugin_Continue; } Action tTimerSwapClone(Handle timer, DataPack pack) diff --git a/addons/sourcemod/scripting/mutant_tanks/abilities/mt_cloud.sp b/addons/sourcemod/scripting/mutant_tanks/abilities/mt_cloud.sp index ec13c92067..a8e9cb74f9 100644 --- a/addons/sourcemod/scripting/mutant_tanks/abilities/mt_cloud.sp +++ b/addons/sourcemod/scripting/mutant_tanks/abilities/mt_cloud.sp @@ -1,6 +1,6 @@ /** - * Mutant Tanks: a L4D/L4D2 SourceMod Plugin - * Copyright (C) 2024 Alfred "Psyk0tik" Llagas + * Mutant Tanks: A L4D/L4D2 SourceMod Plugin + * Copyright (C) 2017-2025 Alfred "Psyk0tik" Llagas * * 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. * @@ -29,6 +29,8 @@ public Plugin myinfo = bool g_bDedicated; +int g_iGraphicsLevel; + public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max) { EngineVersion evEngine = GetEngineVersion(); @@ -45,6 +47,7 @@ public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max } #define PARTICLE_SMOKE "smoker_smokecloud" +#define PARTICLE_BLOOD "boomer_explode_D" #else #if MT_CLOUD_COMPILE_METHOD == 1 #error This file must be compiled as a standalone plugin. @@ -65,6 +68,8 @@ enum struct esCloudPlayer float g_flCloseAreasOnly; float g_flCloudChance; float g_flCloudDamage; + float g_flCloudInterval; + float g_flCloudRange; float g_flOpenAreasOnly; int g_iAccessFlags; @@ -73,6 +78,7 @@ enum struct esCloudPlayer int g_iCloudCooldown; int g_iCloudDuration; int g_iCloudMessage; + int g_iCloudRemove; int g_iCloudSight; int g_iComboAbility; int g_iCooldown; @@ -94,12 +100,15 @@ enum struct esCloudTeammate float g_flCloseAreasOnly; float g_flCloudChance; float g_flCloudDamage; + float g_flCloudInterval; + float g_flCloudRange; float g_flOpenAreasOnly; int g_iCloudAbility; int g_iCloudCooldown; int g_iCloudDuration; int g_iCloudMessage; + int g_iCloudRemove; int g_iCloudSight; int g_iComboAbility; int g_iHumanAbility; @@ -117,6 +126,8 @@ enum struct esCloudAbility float g_flCloseAreasOnly; float g_flCloudChance; float g_flCloudDamage; + float g_flCloudInterval; + float g_flCloudRange; float g_flOpenAreasOnly; int g_iAccessFlags; @@ -124,6 +135,7 @@ enum struct esCloudAbility int g_iCloudCooldown; int g_iCloudDuration; int g_iCloudMessage; + int g_iCloudRemove; int g_iCloudSight; int g_iComboAbility; int g_iComboPosition; @@ -143,12 +155,15 @@ enum struct esCloudSpecial float g_flCloseAreasOnly; float g_flCloudChance; float g_flCloudDamage; + float g_flCloudInterval; + float g_flCloudRange; float g_flOpenAreasOnly; int g_iCloudAbility; int g_iCloudCooldown; int g_iCloudDuration; int g_iCloudMessage; + int g_iCloudRemove; int g_iCloudSight; int g_iComboAbility; int g_iHumanAbility; @@ -166,12 +181,15 @@ enum struct esCloudCache float g_flCloseAreasOnly; float g_flCloudChance; float g_flCloudDamage; + float g_flCloudInterval; + float g_flCloudRange; float g_flOpenAreasOnly; int g_iCloudAbility; int g_iCloudCooldown; int g_iCloudDuration; int g_iCloudMessage; + int g_iCloudRemove; int g_iCloudSight; int g_iComboAbility; int g_iHumanAbility; @@ -293,7 +311,15 @@ int iCloudMenuHandler(Menu menu, MenuAction action, int param1, int param2) case 0: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esCloudCache[param1].g_iCloudAbility == 0) ? "AbilityStatus1" : "AbilityStatus2"); case 1: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityAmmo", (g_esCloudCache[param1].g_iHumanAmmo - g_esCloudPlayer[param1].g_iAmmoCount), g_esCloudCache[param1].g_iHumanAmmo); case 2: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtons"); - case 3: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esCloudCache[param1].g_iHumanMode == 0) ? "AbilityButtonMode1" : "AbilityButtonMode2"); + case 3: + { + switch (g_esCloudCache[param1].g_iHumanMode) + { + case 0: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtonMode1"); + case 1: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtonMode2"); + case 2: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtonMode3"); + } + } case 4: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityCooldown", ((g_esCloudCache[param1].g_iHumanAbility == 1) ? g_esCloudCache[param1].g_iHumanCooldown : g_esCloudCache[param1].g_iCloudCooldown)); case 5: MT_PrintToChat(param1, "%s %t", MT_TAG3, "CloudDetails"); case 6: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityDuration2", ((g_esCloudCache[param1].g_iHumanAbility == 1) ? g_esCloudCache[param1].g_iHumanDuration : g_esCloudCache[param1].g_iCloudDuration)); @@ -482,6 +508,9 @@ public void MT_OnConfigsLoad(int mode) g_esCloudAbility[iIndex].g_iCloudCooldown = 0; g_esCloudAbility[iIndex].g_flCloudDamage = 5.0; g_esCloudAbility[iIndex].g_iCloudDuration = 0; + g_esCloudAbility[iIndex].g_flCloudInterval = 5.0; + g_esCloudAbility[iIndex].g_flCloudRange = 500.0; + g_esCloudAbility[iIndex].g_iCloudRemove = 0; g_esCloudAbility[iIndex].g_iCloudSight = 0; g_esCloudSpecial[iIndex].g_flCloseAreasOnly = -1.0; @@ -499,6 +528,9 @@ public void MT_OnConfigsLoad(int mode) g_esCloudSpecial[iIndex].g_iCloudCooldown = -1; g_esCloudSpecial[iIndex].g_flCloudDamage = -1.0; g_esCloudSpecial[iIndex].g_iCloudDuration = -1; + g_esCloudSpecial[iIndex].g_flCloudInterval = -1.0; + g_esCloudSpecial[iIndex].g_flCloudRange = -1.0; + g_esCloudSpecial[iIndex].g_iCloudRemove = -1; g_esCloudSpecial[iIndex].g_iCloudSight = -1; } } @@ -523,6 +555,9 @@ public void MT_OnConfigsLoad(int mode) g_esCloudPlayer[iPlayer].g_iCloudCooldown = -1; g_esCloudPlayer[iPlayer].g_flCloudDamage = -1.0; g_esCloudPlayer[iPlayer].g_iCloudDuration = -1; + g_esCloudPlayer[iPlayer].g_flCloudInterval = -1.0; + g_esCloudPlayer[iPlayer].g_flCloudRange = -1.0; + g_esCloudPlayer[iPlayer].g_iCloudRemove = -1; g_esCloudPlayer[iPlayer].g_iCloudSight = -1; g_esCloudTeammate[iPlayer].g_flCloseAreasOnly = -1.0; @@ -540,6 +575,9 @@ public void MT_OnConfigsLoad(int mode) g_esCloudTeammate[iPlayer].g_iCloudCooldown = -1; g_esCloudTeammate[iPlayer].g_flCloudDamage = -1.0; g_esCloudTeammate[iPlayer].g_iCloudDuration = -1; + g_esCloudTeammate[iPlayer].g_flCloudInterval = -1.0; + g_esCloudTeammate[iPlayer].g_flCloudRange = -1.0; + g_esCloudTeammate[iPlayer].g_iCloudRemove = -1; g_esCloudTeammate[iPlayer].g_iCloudSight = -1; } } @@ -562,7 +600,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esCloudTeammate[admin].g_iHumanAmmo = iGetKeyValue(subsection, MT_CLOUD_SECTION, MT_CLOUD_SECTION2, MT_CLOUD_SECTION3, MT_CLOUD_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esCloudTeammate[admin].g_iHumanAmmo, value, -1, 99999); g_esCloudTeammate[admin].g_iHumanCooldown = iGetKeyValue(subsection, MT_CLOUD_SECTION, MT_CLOUD_SECTION2, MT_CLOUD_SECTION3, MT_CLOUD_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esCloudTeammate[admin].g_iHumanCooldown, value, -1, 99999); g_esCloudTeammate[admin].g_iHumanDuration = iGetKeyValue(subsection, MT_CLOUD_SECTION, MT_CLOUD_SECTION2, MT_CLOUD_SECTION3, MT_CLOUD_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esCloudTeammate[admin].g_iHumanDuration, value, -1, 99999); - g_esCloudTeammate[admin].g_iHumanMode = iGetKeyValue(subsection, MT_CLOUD_SECTION, MT_CLOUD_SECTION2, MT_CLOUD_SECTION3, MT_CLOUD_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esCloudTeammate[admin].g_iHumanMode, value, -1, 1); + g_esCloudTeammate[admin].g_iHumanMode = iGetKeyValue(subsection, MT_CLOUD_SECTION, MT_CLOUD_SECTION2, MT_CLOUD_SECTION3, MT_CLOUD_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esCloudTeammate[admin].g_iHumanMode, value, -1, 2); g_esCloudTeammate[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_CLOUD_SECTION, MT_CLOUD_SECTION2, MT_CLOUD_SECTION3, MT_CLOUD_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esCloudTeammate[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); g_esCloudTeammate[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_CLOUD_SECTION, MT_CLOUD_SECTION2, MT_CLOUD_SECTION3, MT_CLOUD_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esCloudTeammate[admin].g_iRequiresHumans, value, -1, 32); g_esCloudTeammate[admin].g_iCloudAbility = iGetKeyValue(subsection, MT_CLOUD_SECTION, MT_CLOUD_SECTION2, MT_CLOUD_SECTION3, MT_CLOUD_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esCloudTeammate[admin].g_iCloudAbility, value, -1, 1); @@ -572,6 +610,9 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esCloudTeammate[admin].g_iCloudCooldown = iGetKeyValue(subsection, MT_CLOUD_SECTION, MT_CLOUD_SECTION2, MT_CLOUD_SECTION3, MT_CLOUD_SECTION4, key, "CloudCooldown", "Cloud Cooldown", "Cloud_Cooldown", "cooldown", g_esCloudTeammate[admin].g_iCloudCooldown, value, -1, 99999); g_esCloudTeammate[admin].g_flCloudDamage = flGetKeyValue(subsection, MT_CLOUD_SECTION, MT_CLOUD_SECTION2, MT_CLOUD_SECTION3, MT_CLOUD_SECTION4, key, "CloudDamage", "Cloud Damage", "Cloud_Damage", "damage", g_esCloudTeammate[admin].g_flCloudDamage, value, -1.0, 99999.0); g_esCloudTeammate[admin].g_iCloudDuration = iGetKeyValue(subsection, MT_CLOUD_SECTION, MT_CLOUD_SECTION2, MT_CLOUD_SECTION3, MT_CLOUD_SECTION4, key, "CloudDuration", "Cloud Duration", "Cloud_Duration", "duration", g_esCloudTeammate[admin].g_iCloudDuration, value, -1, 99999); + g_esCloudTeammate[admin].g_flCloudInterval = flGetKeyValue(subsection, MT_CLOUD_SECTION, MT_CLOUD_SECTION2, MT_CLOUD_SECTION3, MT_CLOUD_SECTION4, key, "CloudInterval", "Cloud Interval", "Cloud_Interval", "interval", g_esCloudTeammate[admin].g_flCloudInterval, value, -1.0, 99999.0); + g_esCloudTeammate[admin].g_flCloudRange = flGetKeyValue(subsection, MT_CLOUD_SECTION, MT_CLOUD_SECTION2, MT_CLOUD_SECTION3, MT_CLOUD_SECTION4, key, "CloudRange", "Cloud Range", "Cloud_Range", "range", g_esCloudTeammate[admin].g_flCloudRange, value, -1.0, 99999.0); + g_esCloudTeammate[admin].g_iCloudRemove = iGetKeyValue(subsection, MT_CLOUD_SECTION, MT_CLOUD_SECTION2, MT_CLOUD_SECTION3, MT_CLOUD_SECTION4, key, "CloudRemove", "Cloud Remove", "Cloud_Remove", "remove", g_esCloudTeammate[admin].g_iCloudRemove, value, -1, 1); } else { @@ -581,7 +622,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esCloudPlayer[admin].g_iHumanAmmo = iGetKeyValue(subsection, MT_CLOUD_SECTION, MT_CLOUD_SECTION2, MT_CLOUD_SECTION3, MT_CLOUD_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esCloudPlayer[admin].g_iHumanAmmo, value, -1, 99999); g_esCloudPlayer[admin].g_iHumanCooldown = iGetKeyValue(subsection, MT_CLOUD_SECTION, MT_CLOUD_SECTION2, MT_CLOUD_SECTION3, MT_CLOUD_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esCloudPlayer[admin].g_iHumanCooldown, value, -1, 99999); g_esCloudPlayer[admin].g_iHumanDuration = iGetKeyValue(subsection, MT_CLOUD_SECTION, MT_CLOUD_SECTION2, MT_CLOUD_SECTION3, MT_CLOUD_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esCloudPlayer[admin].g_iHumanDuration, value, -1, 99999); - g_esCloudPlayer[admin].g_iHumanMode = iGetKeyValue(subsection, MT_CLOUD_SECTION, MT_CLOUD_SECTION2, MT_CLOUD_SECTION3, MT_CLOUD_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esCloudPlayer[admin].g_iHumanMode, value, -1, 1); + g_esCloudPlayer[admin].g_iHumanMode = iGetKeyValue(subsection, MT_CLOUD_SECTION, MT_CLOUD_SECTION2, MT_CLOUD_SECTION3, MT_CLOUD_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esCloudPlayer[admin].g_iHumanMode, value, -1, 2); g_esCloudPlayer[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_CLOUD_SECTION, MT_CLOUD_SECTION2, MT_CLOUD_SECTION3, MT_CLOUD_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esCloudPlayer[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); g_esCloudPlayer[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_CLOUD_SECTION, MT_CLOUD_SECTION2, MT_CLOUD_SECTION3, MT_CLOUD_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esCloudPlayer[admin].g_iRequiresHumans, value, -1, 32); g_esCloudPlayer[admin].g_iCloudAbility = iGetKeyValue(subsection, MT_CLOUD_SECTION, MT_CLOUD_SECTION2, MT_CLOUD_SECTION3, MT_CLOUD_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esCloudPlayer[admin].g_iCloudAbility, value, -1, 1); @@ -591,6 +632,9 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esCloudPlayer[admin].g_iCloudCooldown = iGetKeyValue(subsection, MT_CLOUD_SECTION, MT_CLOUD_SECTION2, MT_CLOUD_SECTION3, MT_CLOUD_SECTION4, key, "CloudCooldown", "Cloud Cooldown", "Cloud_Cooldown", "cooldown", g_esCloudPlayer[admin].g_iCloudCooldown, value, -1, 99999); g_esCloudPlayer[admin].g_flCloudDamage = flGetKeyValue(subsection, MT_CLOUD_SECTION, MT_CLOUD_SECTION2, MT_CLOUD_SECTION3, MT_CLOUD_SECTION4, key, "CloudDamage", "Cloud Damage", "Cloud_Damage", "damage", g_esCloudPlayer[admin].g_flCloudDamage, value, -1.0, 99999.0); g_esCloudPlayer[admin].g_iCloudDuration = iGetKeyValue(subsection, MT_CLOUD_SECTION, MT_CLOUD_SECTION2, MT_CLOUD_SECTION3, MT_CLOUD_SECTION4, key, "CloudDuration", "Cloud Duration", "Cloud_Duration", "duration", g_esCloudPlayer[admin].g_iCloudDuration, value, -1, 99999); + g_esCloudPlayer[admin].g_flCloudInterval = flGetKeyValue(subsection, MT_CLOUD_SECTION, MT_CLOUD_SECTION2, MT_CLOUD_SECTION3, MT_CLOUD_SECTION4, key, "CloudInterval", "Cloud Interval", "Cloud_Interval", "interval", g_esCloudPlayer[admin].g_flCloudInterval, value, -1.0, 99999.0); + g_esCloudPlayer[admin].g_flCloudRange = flGetKeyValue(subsection, MT_CLOUD_SECTION, MT_CLOUD_SECTION2, MT_CLOUD_SECTION3, MT_CLOUD_SECTION4, key, "CloudRange", "Cloud Range", "Cloud_Range", "range", g_esCloudPlayer[admin].g_flCloudRange, value, -1.0, 99999.0); + g_esCloudPlayer[admin].g_iCloudRemove = iGetKeyValue(subsection, MT_CLOUD_SECTION, MT_CLOUD_SECTION2, MT_CLOUD_SECTION3, MT_CLOUD_SECTION4, key, "CloudRemove", "Cloud Remove", "Cloud_Remove", "remove", g_esCloudPlayer[admin].g_iCloudRemove, value, -1, 1); g_esCloudPlayer[admin].g_iAccessFlags = iGetAdminFlagsValue(subsection, MT_CLOUD_SECTION, MT_CLOUD_SECTION2, MT_CLOUD_SECTION3, MT_CLOUD_SECTION4, key, "AccessFlags", "Access Flags", "Access_Flags", "access", value); g_esCloudPlayer[admin].g_iImmunityFlags = iGetAdminFlagsValue(subsection, MT_CLOUD_SECTION, MT_CLOUD_SECTION2, MT_CLOUD_SECTION3, MT_CLOUD_SECTION4, key, "ImmunityFlags", "Immunity Flags", "Immunity_Flags", "immunity", value); } @@ -606,7 +650,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esCloudSpecial[type].g_iHumanAmmo = iGetKeyValue(subsection, MT_CLOUD_SECTION, MT_CLOUD_SECTION2, MT_CLOUD_SECTION3, MT_CLOUD_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esCloudSpecial[type].g_iHumanAmmo, value, -1, 99999); g_esCloudSpecial[type].g_iHumanCooldown = iGetKeyValue(subsection, MT_CLOUD_SECTION, MT_CLOUD_SECTION2, MT_CLOUD_SECTION3, MT_CLOUD_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esCloudSpecial[type].g_iHumanCooldown, value, -1, 99999); g_esCloudSpecial[type].g_iHumanDuration = iGetKeyValue(subsection, MT_CLOUD_SECTION, MT_CLOUD_SECTION2, MT_CLOUD_SECTION3, MT_CLOUD_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esCloudSpecial[type].g_iHumanDuration, value, -1, 99999); - g_esCloudSpecial[type].g_iHumanMode = iGetKeyValue(subsection, MT_CLOUD_SECTION, MT_CLOUD_SECTION2, MT_CLOUD_SECTION3, MT_CLOUD_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esCloudSpecial[type].g_iHumanMode, value, -1, 1); + g_esCloudSpecial[type].g_iHumanMode = iGetKeyValue(subsection, MT_CLOUD_SECTION, MT_CLOUD_SECTION2, MT_CLOUD_SECTION3, MT_CLOUD_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esCloudSpecial[type].g_iHumanMode, value, -1, 2); g_esCloudSpecial[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_CLOUD_SECTION, MT_CLOUD_SECTION2, MT_CLOUD_SECTION3, MT_CLOUD_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esCloudSpecial[type].g_flOpenAreasOnly, value, -1.0, 99999.0); g_esCloudSpecial[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_CLOUD_SECTION, MT_CLOUD_SECTION2, MT_CLOUD_SECTION3, MT_CLOUD_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esCloudSpecial[type].g_iRequiresHumans, value, -1, 32); g_esCloudSpecial[type].g_iCloudAbility = iGetKeyValue(subsection, MT_CLOUD_SECTION, MT_CLOUD_SECTION2, MT_CLOUD_SECTION3, MT_CLOUD_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esCloudSpecial[type].g_iCloudAbility, value, -1, 1); @@ -616,6 +660,9 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esCloudSpecial[type].g_iCloudCooldown = iGetKeyValue(subsection, MT_CLOUD_SECTION, MT_CLOUD_SECTION2, MT_CLOUD_SECTION3, MT_CLOUD_SECTION4, key, "CloudCooldown", "Cloud Cooldown", "Cloud_Cooldown", "cooldown", g_esCloudSpecial[type].g_iCloudCooldown, value, -1, 99999); g_esCloudSpecial[type].g_flCloudDamage = flGetKeyValue(subsection, MT_CLOUD_SECTION, MT_CLOUD_SECTION2, MT_CLOUD_SECTION3, MT_CLOUD_SECTION4, key, "CloudDamage", "Cloud Damage", "Cloud_Damage", "damage", g_esCloudSpecial[type].g_flCloudDamage, value, -1.0, 99999.0); g_esCloudSpecial[type].g_iCloudDuration = iGetKeyValue(subsection, MT_CLOUD_SECTION, MT_CLOUD_SECTION2, MT_CLOUD_SECTION3, MT_CLOUD_SECTION4, key, "CloudDuration", "Cloud Duration", "Cloud_Duration", "duration", g_esCloudSpecial[type].g_iCloudDuration, value, -1, 99999); + g_esCloudSpecial[type].g_flCloudInterval = flGetKeyValue(subsection, MT_CLOUD_SECTION, MT_CLOUD_SECTION2, MT_CLOUD_SECTION3, MT_CLOUD_SECTION4, key, "CloudInterval", "Cloud Interval", "Cloud_Interval", "interval", g_esCloudSpecial[type].g_flCloudInterval, value, -1.0, 99999.0); + g_esCloudSpecial[type].g_flCloudRange = flGetKeyValue(subsection, MT_CLOUD_SECTION, MT_CLOUD_SECTION2, MT_CLOUD_SECTION3, MT_CLOUD_SECTION4, key, "CloudRange", "Cloud Range", "Cloud_Range", "range", g_esCloudSpecial[type].g_flCloudRange, value, -1.0, 99999.0); + g_esCloudSpecial[type].g_iCloudRemove = iGetKeyValue(subsection, MT_CLOUD_SECTION, MT_CLOUD_SECTION2, MT_CLOUD_SECTION3, MT_CLOUD_SECTION4, key, "CloudRemove", "Cloud Remove", "Cloud_Remove", "remove", g_esCloudSpecial[type].g_iCloudRemove, value, -1, 1); } else { @@ -625,7 +672,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esCloudAbility[type].g_iHumanAmmo = iGetKeyValue(subsection, MT_CLOUD_SECTION, MT_CLOUD_SECTION2, MT_CLOUD_SECTION3, MT_CLOUD_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esCloudAbility[type].g_iHumanAmmo, value, -1, 99999); g_esCloudAbility[type].g_iHumanCooldown = iGetKeyValue(subsection, MT_CLOUD_SECTION, MT_CLOUD_SECTION2, MT_CLOUD_SECTION3, MT_CLOUD_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esCloudAbility[type].g_iHumanCooldown, value, -1, 99999); g_esCloudAbility[type].g_iHumanDuration = iGetKeyValue(subsection, MT_CLOUD_SECTION, MT_CLOUD_SECTION2, MT_CLOUD_SECTION3, MT_CLOUD_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esCloudAbility[type].g_iHumanDuration, value, -1, 99999); - g_esCloudAbility[type].g_iHumanMode = iGetKeyValue(subsection, MT_CLOUD_SECTION, MT_CLOUD_SECTION2, MT_CLOUD_SECTION3, MT_CLOUD_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esCloudAbility[type].g_iHumanMode, value, -1, 1); + g_esCloudAbility[type].g_iHumanMode = iGetKeyValue(subsection, MT_CLOUD_SECTION, MT_CLOUD_SECTION2, MT_CLOUD_SECTION3, MT_CLOUD_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esCloudAbility[type].g_iHumanMode, value, -1, 2); g_esCloudAbility[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_CLOUD_SECTION, MT_CLOUD_SECTION2, MT_CLOUD_SECTION3, MT_CLOUD_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esCloudAbility[type].g_flOpenAreasOnly, value, -1.0, 99999.0); g_esCloudAbility[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_CLOUD_SECTION, MT_CLOUD_SECTION2, MT_CLOUD_SECTION3, MT_CLOUD_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esCloudAbility[type].g_iRequiresHumans, value, -1, 32); g_esCloudAbility[type].g_iCloudAbility = iGetKeyValue(subsection, MT_CLOUD_SECTION, MT_CLOUD_SECTION2, MT_CLOUD_SECTION3, MT_CLOUD_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esCloudAbility[type].g_iCloudAbility, value, -1, 1); @@ -635,6 +682,9 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esCloudAbility[type].g_iCloudCooldown = iGetKeyValue(subsection, MT_CLOUD_SECTION, MT_CLOUD_SECTION2, MT_CLOUD_SECTION3, MT_CLOUD_SECTION4, key, "CloudCooldown", "Cloud Cooldown", "Cloud_Cooldown", "cooldown", g_esCloudAbility[type].g_iCloudCooldown, value, -1, 99999); g_esCloudAbility[type].g_flCloudDamage = flGetKeyValue(subsection, MT_CLOUD_SECTION, MT_CLOUD_SECTION2, MT_CLOUD_SECTION3, MT_CLOUD_SECTION4, key, "CloudDamage", "Cloud Damage", "Cloud_Damage", "damage", g_esCloudAbility[type].g_flCloudDamage, value, -1.0, 99999.0); g_esCloudAbility[type].g_iCloudDuration = iGetKeyValue(subsection, MT_CLOUD_SECTION, MT_CLOUD_SECTION2, MT_CLOUD_SECTION3, MT_CLOUD_SECTION4, key, "CloudDuration", "Cloud Duration", "Cloud_Duration", "duration", g_esCloudAbility[type].g_iCloudDuration, value, -1, 99999); + g_esCloudAbility[type].g_flCloudInterval = flGetKeyValue(subsection, MT_CLOUD_SECTION, MT_CLOUD_SECTION2, MT_CLOUD_SECTION3, MT_CLOUD_SECTION4, key, "CloudInterval", "Cloud Interval", "Cloud_Interval", "interval", g_esCloudAbility[type].g_flCloudInterval, value, -1.0, 99999.0); + g_esCloudAbility[type].g_flCloudRange = flGetKeyValue(subsection, MT_CLOUD_SECTION, MT_CLOUD_SECTION2, MT_CLOUD_SECTION3, MT_CLOUD_SECTION4, key, "CloudRange", "Cloud Range", "Cloud_Range", "range", g_esCloudAbility[type].g_flCloudRange, value, -1.0, 99999.0); + g_esCloudAbility[type].g_iCloudRemove = iGetKeyValue(subsection, MT_CLOUD_SECTION, MT_CLOUD_SECTION2, MT_CLOUD_SECTION3, MT_CLOUD_SECTION4, key, "CloudRemove", "Cloud Remove", "Cloud_Remove", "remove", g_esCloudAbility[type].g_iCloudRemove, value, -1, 1); g_esCloudAbility[type].g_iAccessFlags = iGetAdminFlagsValue(subsection, MT_CLOUD_SECTION, MT_CLOUD_SECTION2, MT_CLOUD_SECTION3, MT_CLOUD_SECTION4, key, "AccessFlags", "Access Flags", "Access_Flags", "access", value); g_esCloudAbility[type].g_iImmunityFlags = iGetAdminFlagsValue(subsection, MT_CLOUD_SECTION, MT_CLOUD_SECTION2, MT_CLOUD_SECTION3, MT_CLOUD_SECTION4, key, "ImmunityFlags", "Immunity Flags", "Immunity_Flags", "immunity", value); } @@ -651,16 +701,21 @@ public void MT_OnSettingsCached(int tank, bool apply, int type) g_esCloudPlayer[tank].g_iTankTypeRecorded = apply ? MT_GetRecordedTankType(tank, type) : 0; g_esCloudPlayer[tank].g_iTankType = apply ? type : 0; int iType = g_esCloudPlayer[tank].g_iTankTypeRecorded; - +#if !defined MT_ABILITIES_MAIN + g_iGraphicsLevel = MT_GetGraphicsLevel(); +#endif if (bIsSpecialInfected(tank, MT_CHECK_INDEX|MT_CHECK_INGAME)) { g_esCloudCache[tank].g_flCloseAreasOnly = flGetSubSettingValue(apply, bHuman, g_esCloudTeammate[tank].g_flCloseAreasOnly, g_esCloudPlayer[tank].g_flCloseAreasOnly, g_esCloudSpecial[iType].g_flCloseAreasOnly, g_esCloudAbility[iType].g_flCloseAreasOnly, 1); g_esCloudCache[tank].g_flCloudChance = flGetSubSettingValue(apply, bHuman, g_esCloudTeammate[tank].g_flCloudChance, g_esCloudPlayer[tank].g_flCloudChance, g_esCloudSpecial[iType].g_flCloudChance, g_esCloudAbility[iType].g_flCloudChance, 1); g_esCloudCache[tank].g_flCloudDamage = flGetSubSettingValue(apply, bHuman, g_esCloudTeammate[tank].g_flCloudDamage, g_esCloudPlayer[tank].g_flCloudDamage, g_esCloudSpecial[iType].g_flCloudDamage, g_esCloudAbility[iType].g_flCloudDamage, 1); + g_esCloudCache[tank].g_flCloudInterval = flGetSubSettingValue(apply, bHuman, g_esCloudTeammate[tank].g_flCloudInterval, g_esCloudPlayer[tank].g_flCloudInterval, g_esCloudSpecial[iType].g_flCloudInterval, g_esCloudAbility[iType].g_flCloudInterval, 1); + g_esCloudCache[tank].g_flCloudRange = flGetSubSettingValue(apply, bHuman, g_esCloudTeammate[tank].g_flCloudRange, g_esCloudPlayer[tank].g_flCloudRange, g_esCloudSpecial[iType].g_flCloudRange, g_esCloudAbility[iType].g_flCloudRange, 1); g_esCloudCache[tank].g_iCloudAbility = iGetSubSettingValue(apply, bHuman, g_esCloudTeammate[tank].g_iCloudAbility, g_esCloudPlayer[tank].g_iCloudAbility, g_esCloudSpecial[iType].g_iCloudAbility, g_esCloudAbility[iType].g_iCloudAbility, 1); g_esCloudCache[tank].g_iCloudCooldown = iGetSubSettingValue(apply, bHuman, g_esCloudTeammate[tank].g_iCloudCooldown, g_esCloudPlayer[tank].g_iCloudCooldown, g_esCloudSpecial[iType].g_iCloudCooldown, g_esCloudAbility[iType].g_iCloudCooldown, 1); g_esCloudCache[tank].g_iCloudDuration = iGetSubSettingValue(apply, bHuman, g_esCloudTeammate[tank].g_iCloudDuration, g_esCloudPlayer[tank].g_iCloudDuration, g_esCloudSpecial[iType].g_iCloudDuration, g_esCloudAbility[iType].g_iCloudDuration, 1); g_esCloudCache[tank].g_iCloudMessage = iGetSubSettingValue(apply, bHuman, g_esCloudTeammate[tank].g_iCloudMessage, g_esCloudPlayer[tank].g_iCloudMessage, g_esCloudSpecial[iType].g_iCloudMessage, g_esCloudAbility[iType].g_iCloudMessage, 1); + g_esCloudCache[tank].g_iCloudRemove = iGetSubSettingValue(apply, bHuman, g_esCloudTeammate[tank].g_iCloudRemove, g_esCloudPlayer[tank].g_iCloudRemove, g_esCloudSpecial[iType].g_iCloudRemove, g_esCloudAbility[iType].g_iCloudRemove, 1); g_esCloudCache[tank].g_iCloudSight = iGetSubSettingValue(apply, bHuman, g_esCloudTeammate[tank].g_iCloudSight, g_esCloudPlayer[tank].g_iCloudSight, g_esCloudSpecial[iType].g_iCloudSight, g_esCloudAbility[iType].g_iCloudSight, 1); g_esCloudCache[tank].g_iComboAbility = iGetSubSettingValue(apply, bHuman, g_esCloudTeammate[tank].g_iComboAbility, g_esCloudPlayer[tank].g_iComboAbility, g_esCloudSpecial[iType].g_iComboAbility, g_esCloudAbility[iType].g_iComboAbility, 1); g_esCloudCache[tank].g_iHumanAbility = iGetSubSettingValue(apply, bHuman, g_esCloudTeammate[tank].g_iHumanAbility, g_esCloudPlayer[tank].g_iHumanAbility, g_esCloudSpecial[iType].g_iHumanAbility, g_esCloudAbility[iType].g_iHumanAbility, 1); @@ -676,10 +731,13 @@ public void MT_OnSettingsCached(int tank, bool apply, int type) g_esCloudCache[tank].g_flCloseAreasOnly = flGetSettingValue(apply, bHuman, g_esCloudPlayer[tank].g_flCloseAreasOnly, g_esCloudAbility[iType].g_flCloseAreasOnly, 1); g_esCloudCache[tank].g_flCloudChance = flGetSettingValue(apply, bHuman, g_esCloudPlayer[tank].g_flCloudChance, g_esCloudAbility[iType].g_flCloudChance, 1); g_esCloudCache[tank].g_flCloudDamage = flGetSettingValue(apply, bHuman, g_esCloudPlayer[tank].g_flCloudDamage, g_esCloudAbility[iType].g_flCloudDamage, 1); + g_esCloudCache[tank].g_flCloudInterval = flGetSettingValue(apply, bHuman, g_esCloudPlayer[tank].g_flCloudInterval, g_esCloudAbility[iType].g_flCloudInterval, 1); + g_esCloudCache[tank].g_flCloudRange = flGetSettingValue(apply, bHuman, g_esCloudPlayer[tank].g_flCloudRange, g_esCloudAbility[iType].g_flCloudRange, 1); g_esCloudCache[tank].g_iCloudAbility = iGetSettingValue(apply, bHuman, g_esCloudPlayer[tank].g_iCloudAbility, g_esCloudAbility[iType].g_iCloudAbility, 1); g_esCloudCache[tank].g_iCloudCooldown = iGetSettingValue(apply, bHuman, g_esCloudPlayer[tank].g_iCloudCooldown, g_esCloudAbility[iType].g_iCloudCooldown, 1); g_esCloudCache[tank].g_iCloudDuration = iGetSettingValue(apply, bHuman, g_esCloudPlayer[tank].g_iCloudDuration, g_esCloudAbility[iType].g_iCloudDuration, 1); g_esCloudCache[tank].g_iCloudMessage = iGetSettingValue(apply, bHuman, g_esCloudPlayer[tank].g_iCloudMessage, g_esCloudAbility[iType].g_iCloudMessage, 1); + g_esCloudCache[tank].g_iCloudRemove = iGetSettingValue(apply, bHuman, g_esCloudPlayer[tank].g_iCloudRemove, g_esCloudAbility[iType].g_iCloudRemove, 1); g_esCloudCache[tank].g_iCloudSight = iGetSettingValue(apply, bHuman, g_esCloudPlayer[tank].g_iCloudSight, g_esCloudAbility[iType].g_iCloudSight, 1); g_esCloudCache[tank].g_iComboAbility = iGetSettingValue(apply, bHuman, g_esCloudPlayer[tank].g_iComboAbility, g_esCloudAbility[iType].g_iComboAbility, 1); g_esCloudCache[tank].g_iHumanAbility = iGetSettingValue(apply, bHuman, g_esCloudPlayer[tank].g_iHumanAbility, g_esCloudAbility[iType].g_iHumanAbility, 1); @@ -785,10 +843,10 @@ public void MT_OnButtonPressed(int tank, int button) if ((button & MT_MAIN_KEY) && g_esCloudCache[tank].g_iCloudAbility == 1 && g_esCloudCache[tank].g_iHumanAbility == 1) { - int iTime = GetTime(); + int iHumanMode = g_esCloudCache[tank].g_iHumanMode, iTime = GetTime(); bool bRecharging = g_esCloudPlayer[tank].g_iCooldown != -1 && g_esCloudPlayer[tank].g_iCooldown >= iTime; - switch (g_esCloudCache[tank].g_iHumanMode) + switch (iHumanMode) { case 0: { @@ -805,9 +863,9 @@ public void MT_OnButtonPressed(int tank, int button) MT_PrintToChat(tank, "%s %t", MT_TAG3, "CloudHuman4", (g_esCloudPlayer[tank].g_iCooldown - iTime)); } } - case 1: + case 1, 2: { - if (g_esCloudPlayer[tank].g_iAmmoCount < g_esCloudCache[tank].g_iHumanAmmo && g_esCloudCache[tank].g_iHumanAmmo > 0) + if ((iHumanMode == 2 && g_esCloudPlayer[tank].g_bActivated) || (g_esCloudPlayer[tank].g_iAmmoCount < g_esCloudCache[tank].g_iHumanAmmo && g_esCloudCache[tank].g_iHumanAmmo > 0)) { if (!g_esCloudPlayer[tank].g_bActivated && !bRecharging) { @@ -819,7 +877,15 @@ public void MT_OnButtonPressed(int tank, int button) } else if (g_esCloudPlayer[tank].g_bActivated) { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "CloudHuman3"); + switch (iHumanMode) + { + case 1: MT_PrintToChat(tank, "%s %t", MT_TAG3, "CloudHuman3"); + case 2: + { + vCloudReset2(tank); + vCloudReset3(tank); + } + } } else if (bRecharging) { @@ -900,12 +966,16 @@ void vCloud2(int tank, int pos = -1) return; } - DataPack dpCloud; - CreateDataTimer(1.5, tTimerCloud, dpCloud, TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); - dpCloud.WriteCell(GetClientUserId(tank)); - dpCloud.WriteCell(g_esCloudPlayer[tank].g_iTankType); - dpCloud.WriteCell(GetTime()); - dpCloud.WriteCell(pos); + float flInterval = (pos != -1) ? MT_GetCombinationSetting(tank, 6, pos) : g_esCloudCache[tank].g_flCloudInterval; + if (flInterval > 0.0) + { + DataPack dpCloud; + CreateDataTimer(flInterval, tTimerCloud, dpCloud, TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); + dpCloud.WriteCell(GetClientUserId(tank)); + dpCloud.WriteCell(g_esCloudPlayer[tank].g_iTankType); + dpCloud.WriteCell(GetTime()); + dpCloud.WriteCell(pos); + } } void vCloudAbility(int tank) @@ -1011,11 +1081,16 @@ Action tTimerCloud(Handle timer, DataPack pack) return Plugin_Stop; } - vAttachParticle(iTank, PARTICLE_SMOKE, 1.5); + if (g_iGraphicsLevel > 2 && g_esCloudCache[iTank].g_iCloudRemove == 0) + { + float flInterval = (iPos != -1) ? MT_GetCombinationSetting(iTank, 6, iPos) : g_esCloudCache[iTank].g_flCloudInterval; + vAttachParticle(iTank, PARTICLE_SMOKE, flInterval); + } float flTankPos[3], flSurvivorPos[3]; GetClientAbsOrigin(iTank, flTankPos); - float flDamage = (iPos != -1) ? MT_GetCombinationSetting(iTank, 3, iPos) : g_esCloudCache[iTank].g_flCloudDamage; + float flDamage = (iPos != -1) ? MT_GetCombinationSetting(iTank, 3, iPos) : g_esCloudCache[iTank].g_flCloudDamage, + flRange = (iPos != -1) ? MT_GetCombinationSetting(iTank, 9, iPos) : g_esCloudCache[iTank].g_flCloudRange; if (flDamage > 0.0) { for (int iSurvivor = 1; iSurvivor <= MaxClients; iSurvivor++) @@ -1023,9 +1098,14 @@ Action tTimerCloud(Handle timer, DataPack pack) if (bIsSurvivor(iSurvivor, MT_CHECK_INGAME|MT_CHECK_ALIVE) && !MT_IsAdminImmune(iSurvivor, iTank) && !bIsAdminImmune(iSurvivor, g_esCloudPlayer[iTank].g_iTankType, g_esCloudAbility[g_esCloudPlayer[iTank].g_iTankTypeRecorded].g_iImmunityFlags, g_esCloudPlayer[iSurvivor].g_iImmunityFlags)) { GetClientAbsOrigin(iSurvivor, flSurvivorPos); - if (GetVectorDistance(flTankPos, flSurvivorPos) <= 200.0 && bIsVisibleToPlayer(iTank, iSurvivor, g_esCloudCache[iTank].g_iCloudSight, .range = 200.0)) + if (GetVectorDistance(flTankPos, flSurvivorPos) <= flRange && bIsVisibleToPlayer(iTank, iSurvivor, g_esCloudCache[iTank].g_iCloudSight, .range = flRange)) { vDamagePlayer(iSurvivor, iTank, MT_GetScaledDamage(flDamage), "65536"); + + if (g_iGraphicsLevel > 2) + { + vAttachParticle(iSurvivor, PARTICLE_BLOOD, 0.1); + } } } } @@ -1034,16 +1114,18 @@ Action tTimerCloud(Handle timer, DataPack pack) return Plugin_Continue; } -void tTimerCloudCombo(Handle timer, DataPack pack) +Action tTimerCloudCombo(Handle timer, DataPack pack) { pack.Reset(); int iTank = GetClientOfUserId(pack.ReadCell()); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esCloudAbility[g_esCloudPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esCloudPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esCloudPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esCloudCache[iTank].g_iCloudAbility == 0 || g_esCloudPlayer[iTank].g_bActivated) { - return; + return Plugin_Stop; } int iPos = pack.ReadCell(); vCloud(iTank, iPos); + + return Plugin_Continue; } \ No newline at end of file diff --git a/addons/sourcemod/scripting/mutant_tanks/abilities/mt_drop.sp b/addons/sourcemod/scripting/mutant_tanks/abilities/mt_drop.sp index 0d10aac26b..06ea6541ff 100644 --- a/addons/sourcemod/scripting/mutant_tanks/abilities/mt_drop.sp +++ b/addons/sourcemod/scripting/mutant_tanks/abilities/mt_drop.sp @@ -1,6 +1,6 @@ /** - * Mutant Tanks: a L4D/L4D2 SourceMod Plugin - * Copyright (C) 2024 Alfred "Psyk0tik" Llagas + * Mutant Tanks: A L4D/L4D2 SourceMod Plugin + * Copyright (C) 2017-2025 Alfred "Psyk0tik" Llagas * * 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. * @@ -22,7 +22,7 @@ public Plugin myinfo = { name = "[MT] Drop Ability", author = MT_AUTHOR, - description = "The Mutant Tank drops weapons upon death.", + description = "The Mutant Tank drops weapons and gives survivors items upon death.", version = MT_VERSION, url = MT_URL }; @@ -49,6 +49,10 @@ public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max } #define MT_GAMEDATA "mutant_tanks" + +#define MODEL_FIREWORKCRATE "models/props_junk/explosive_box001.mdl" // Only available in L4D2 +#define MODEL_OXYGENTANK "models/props_equipment/oxygentank01.mdl" +#define MODEL_PROPANETANK "models/props_junk/propanecanister001a.mdl" #else #if MT_DROP_COMPILE_METHOD == 1 #error This file must be compiled as a standalone plugin. @@ -219,6 +223,8 @@ enum struct esDropGeneral ConVar g_cvMTSniperRifleAmmo; Handle g_hSDKGetMaxClip1; + + int g_iDropWeapon[2048]; } esDropGeneral g_esDropGeneral; @@ -226,12 +232,19 @@ esDropGeneral g_esDropGeneral; enum struct esDropPlayer { bool g_bActivated; + bool g_bActivated2; + char g_sDropLoadout[325]; + char g_sDropPinata[325]; char g_sDropWeaponName[32]; + char g_sGiveLoadout[325]; float g_flCloseAreasOnly; float g_flDropChance; float g_flDropClipChance; + float g_flDropPinataChance; + float g_flDropWeaponBoost; + float g_flDropWeaponResistance; float g_flDropWeaponScale; float g_flOpenAreasOnly; @@ -241,8 +254,12 @@ enum struct esDropPlayer int g_iDropCount; int g_iDropMessage; int g_iDropHandPosition; + int g_iDropItemMode; int g_iDropMode; + int g_iDropPinataBody; + int g_iGiveMode; int g_iHumanAbility; + int g_iImmunityFlags; int g_iRequiresHumans; int g_iTankType; int g_iTankTypeRecorded; @@ -254,11 +271,16 @@ esDropPlayer g_esDropPlayer[MAXPLAYERS + 1]; enum struct esDropTeammate { + char g_sDropLoadout[325]; + char g_sDropPinata[325]; char g_sDropWeaponName[32]; float g_flCloseAreasOnly; float g_flDropChance; float g_flDropClipChance; + float g_flDropPinataChance; + float g_flDropWeaponBoost; + float g_flDropWeaponResistance; float g_flDropWeaponScale; float g_flOpenAreasOnly; @@ -267,7 +289,9 @@ enum struct esDropTeammate int g_iDropCount; int g_iDropMessage; int g_iDropHandPosition; + int g_iDropItemMode; int g_iDropMode; + int g_iDropPinataBody; int g_iHumanAbility; int g_iRequiresHumans; } @@ -276,11 +300,16 @@ esDropTeammate g_esDropTeammate[MAXPLAYERS + 1]; enum struct esDropAbility { + char g_sDropLoadout[325]; + char g_sDropPinata[325]; char g_sDropWeaponName[32]; float g_flCloseAreasOnly; float g_flDropChance; float g_flDropClipChance; + float g_flDropPinataChance; + float g_flDropWeaponBoost; + float g_flDropWeaponResistance; float g_flDropWeaponScale; float g_flOpenAreasOnly; @@ -290,8 +319,11 @@ enum struct esDropAbility int g_iDropCount; int g_iDropMessage; int g_iDropHandPosition; + int g_iDropItemMode; int g_iDropMode; + int g_iDropPinataBody; int g_iHumanAbility; + int g_iImmunityFlags; int g_iRequiresHumans; } @@ -299,11 +331,16 @@ esDropAbility g_esDropAbility[MT_MAXTYPES + 1]; enum struct esDropSpecial { + char g_sDropLoadout[325]; + char g_sDropPinata[325]; char g_sDropWeaponName[32]; float g_flCloseAreasOnly; float g_flDropChance; float g_flDropClipChance; + float g_flDropPinataChance; + float g_flDropWeaponBoost; + float g_flDropWeaponResistance; float g_flDropWeaponScale; float g_flOpenAreasOnly; @@ -312,7 +349,9 @@ enum struct esDropSpecial int g_iDropCount; int g_iDropMessage; int g_iDropHandPosition; + int g_iDropItemMode; int g_iDropMode; + int g_iDropPinataBody; int g_iHumanAbility; int g_iRequiresHumans; } @@ -321,11 +360,16 @@ esDropSpecial g_esDropSpecial[MT_MAXTYPES + 1]; enum struct esDropCache { + char g_sDropLoadout[325]; + char g_sDropPinata[325]; char g_sDropWeaponName[32]; float g_flCloseAreasOnly; float g_flDropChance; float g_flDropClipChance; + float g_flDropPinataChance; + float g_flDropWeaponBoost; + float g_flDropWeaponResistance; float g_flDropWeaponScale; float g_flOpenAreasOnly; @@ -334,13 +378,17 @@ enum struct esDropCache int g_iDropCount; int g_iDropMessage; int g_iDropHandPosition; + int g_iDropItemMode; int g_iDropMode; + int g_iDropPinataBody; int g_iHumanAbility; int g_iRequiresHumans; } esDropCache g_esDropCache[MAXPLAYERS + 1]; +int g_iDropDeathModelOwner = 0; + #if defined MT_ABILITIES_MAIN void vDropAllPluginsLoaded(GameData gdMutantTanks) #else @@ -390,10 +438,10 @@ public void OnPluginStart() #endif { g_esDropGeneral.g_cvMTAssaultRifleAmmo = FindConVar("ammo_assaultrifle_max"); - g_esDropGeneral.g_cvMTAutoShotgunAmmo = g_bSecondGame ? FindConVar("ammo_autoshotgun_max") : FindConVar("ammo_buckshot_max"); + g_esDropGeneral.g_cvMTAutoShotgunAmmo = (g_bSecondGame ? FindConVar("ammo_autoshotgun_max") : FindConVar("ammo_buckshot_max")); g_esDropGeneral.g_cvMTGrenadeLauncherAmmo = FindConVar("ammo_grenadelauncher_max"); g_esDropGeneral.g_cvMTHuntingRifleAmmo = FindConVar("ammo_huntingrifle_max"); - g_esDropGeneral.g_cvMTShotgunAmmo = g_bSecondGame ? FindConVar("ammo_shotgun_max") : FindConVar("ammo_buckshot_max"); + g_esDropGeneral.g_cvMTShotgunAmmo = (g_bSecondGame ? FindConVar("ammo_shotgun_max") : FindConVar("ammo_buckshot_max")); g_esDropGeneral.g_cvMTSMGAmmo = FindConVar("ammo_smg_max"); g_esDropGeneral.g_cvMTSniperRifleAmmo = FindConVar("ammo_sniperrifle_max"); #if !defined MT_ABILITIES_MAIN @@ -445,6 +493,7 @@ void vDropClientPutInServer(int client) public void OnClientPutInServer(int client) #endif { + SDKHook(client, SDKHook_OnTakeDamage, OnDropTakeDamage); vDropReset2(client); } @@ -593,6 +642,121 @@ public void MT_OnMenuItemDisplayed(int client, const char[] info, char[] buffer, } } +#if defined MT_ABILITIES_MAIN +void vDropEntityCreated(int entity, const char[] classname) +#else +public void OnEntityCreated(int entity, const char[] classname) +#endif +{ + if (bIsValidEntity(entity) && StrEqual(classname, "survivor_death_model")) + { + int iOwner = GetClientOfUserId(g_iDropDeathModelOwner); + if (bIsValidClient(iOwner)) + { + SDKHook(entity, SDKHook_SpawnPost, OnDropModelSpawnPost); + } + + g_iDropDeathModelOwner = 0; + } +} + +#if defined MT_ABILITIES_MAIN +void vDropEntityDestroyed(int entity) +#else +public void OnEntityDestroyed(int entity) +#endif +{ + if (bIsValidEntity(entity)) + { + g_esDropGeneral.g_iDropWeapon[entity] = INVALID_ENT_REFERENCE; + } +} + +void OnDropModelSpawnPost(int model) +{ + g_iDropDeathModelOwner = 0; + + SDKUnhook(model, SDKHook_SpawnPost, OnDropModelSpawnPost); + + if (!bIsValidEntity(model)) + { + return; + } + + RemoveEntity(model); +} + +Action OnDropTakeDamage(int victim, int &attacker, int &inflictor, float &damage, int &damagetype) +{ + if (MT_IsCorePluginEnabled() && bIsValidClient(victim, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_ALIVE) && damage > 0.0) + { + char sClassname[32]; + if (bIsValidEntity(inflictor)) + { + GetEntityClassname(inflictor, sClassname, sizeof sClassname); + } + + if (MT_IsTankSupported(attacker) && MT_IsCustomTankSupported(attacker) && bIsSurvivor(victim)) + { + if ((!MT_HasAdminAccess(attacker) && !bHasAdminAccess(attacker, g_esDropAbility[g_esDropPlayer[attacker].g_iTankTypeRecorded].g_iAccessFlags, g_esDropPlayer[attacker].g_iAccessFlags)) || MT_IsAdminImmune(victim, attacker) || bIsAdminImmune(victim, g_esDropPlayer[attacker].g_iTankType, g_esDropAbility[g_esDropPlayer[attacker].g_iTankTypeRecorded].g_iImmunityFlags, g_esDropPlayer[victim].g_iImmunityFlags)) + { + return Plugin_Continue; + } + + bool bCaught = bIsSurvivorCaught(victim); + if ((bIsSpecialInfected(attacker) && (bCaught || (!bCaught && (damagetype & DMG_CLUB)) || (bIsSpitter(attacker) && StrEqual(sClassname, "insect_swarm")))) || StrEqual(sClassname[7], "tank_claw") || StrEqual(sClassname, "tank_rock")) + { + int iWeapon = iGetSurvivorActiveWeapon(attacker); + if (iWeapon > MaxClients) + { + if (iWeapon == EntRefToEntIndex(g_esDropGeneral.g_iDropWeapon[iWeapon])) + { + damage *= g_esDropCache[attacker].g_flDropWeaponResistance; + + return Plugin_Changed; + } + } + } + } + else if (MT_IsTankSupported(victim) && MT_IsCustomTankSupported(victim) && bIsSurvivor(attacker)) + { + if ((!MT_HasAdminAccess(victim) && !bHasAdminAccess(victim, g_esDropAbility[g_esDropPlayer[victim].g_iTankTypeRecorded].g_iAccessFlags, g_esDropPlayer[victim].g_iAccessFlags)) || MT_IsAdminImmune(attacker, victim) || bIsAdminImmune(attacker, g_esDropPlayer[victim].g_iTankType, g_esDropAbility[g_esDropPlayer[victim].g_iTankTypeRecorded].g_iImmunityFlags, g_esDropPlayer[attacker].g_iImmunityFlags)) + { + return Plugin_Continue; + } + + int iWeapon = iGetSurvivorActiveWeapon(attacker); + if (iWeapon > MaxClients) + { + if (iWeapon == EntRefToEntIndex(g_esDropGeneral.g_iDropWeapon[iWeapon])) + { + damage *= g_esDropCache[attacker].g_flDropWeaponBoost; + + return Plugin_Changed; + } + } + } + } + + return Plugin_Continue; +} + +Action OnDropTakeDamage2(int victim, int &attacker, int &inflictor, float &damage, int &damagetype) +{ + return Plugin_Handled; +} + +void OnDropUse(int entity, int activator, int caller, UseType type, float value) +{ + if (!bIsValidEntity(entity)) + { + return; + } + + SDKUnhook(entity, SDKHook_OnTakeDamage, OnDropTakeDamage2); + SDKUnhook(entity, SDKHook_Use, OnDropUse); +} + #if defined MT_ABILITIES_MAIN void vDropPluginCheck(ArrayList list) #else @@ -633,7 +797,7 @@ public void MT_OnCombineAbilities(int tank, int type, const float random, const FormatEx(sSet[3], sizeof sSet[], ",%s,", MT_DROP_SECTION4); if (StrContains(sCombo, sSet[0], false) != -1 || StrContains(sCombo, sSet[1], false) != -1 || StrContains(sCombo, sSet[2], false) != -1 || StrContains(sCombo, sSet[3], false) != -1) { - if (type == MT_COMBO_UPONDEATH && g_esDropCache[tank].g_iDropAbility == 1 && g_esDropCache[tank].g_iComboAbility == 1 && g_esDropPlayer[tank].g_bActivated) + if (type == MT_COMBO_UPONDEATH && g_esDropCache[tank].g_iDropAbility > 0 && g_esDropCache[tank].g_iComboAbility == 1 && g_esDropPlayer[tank].g_bActivated) { char sAbilities[320], sSubset[10][32]; strcopy(sAbilities, sizeof sAbilities, combo); @@ -648,7 +812,15 @@ public void MT_OnCombineAbilities(int tank, int type, const float random, const switch (flDelay) { - case 0.0: vDropWeapon(tank, 0, random, iPos); + case 0.0: + { + if ((g_esDropCache[tank].g_iDropAbility == 2 || g_esDropCache[tank].g_iDropAbility == 3) && random <= MT_GetCombinationSetting(tank, 1, iPos)) + { + g_esDropPlayer[tank].g_bActivated2 = true; + } + + vDropWeapon(tank, 0, random, iPos); + } default: { DataPack dpCombo; @@ -679,6 +851,7 @@ public void MT_OnConfigsLoad(int mode) for (int iIndex = MT_GetMinType(); iIndex <= MT_GetMaxType(); iIndex++) { g_esDropAbility[iIndex].g_iAccessFlags = 0; + g_esDropAbility[iIndex].g_iImmunityFlags = 0; g_esDropAbility[iIndex].g_flCloseAreasOnly = 0.0; g_esDropAbility[iIndex].g_iComboAbility = 0; g_esDropAbility[iIndex].g_iHumanAbility = 0; @@ -690,8 +863,15 @@ public void MT_OnConfigsLoad(int mode) g_esDropAbility[iIndex].g_flDropClipChance = 33.3; g_esDropAbility[iIndex].g_iDropCount = 1; g_esDropAbility[iIndex].g_iDropHandPosition = 0; + g_esDropAbility[iIndex].g_sDropLoadout = "rifle,pistol,first_aid_kit,pain_pills"; + g_esDropAbility[iIndex].g_iDropItemMode = 0; g_esDropAbility[iIndex].g_iDropMode = 0; + g_esDropAbility[iIndex].g_sDropPinata[0] = '\0'; + g_esDropAbility[iIndex].g_iDropPinataBody = 1; + g_esDropAbility[iIndex].g_flDropPinataChance = 33.3; + g_esDropAbility[iIndex].g_flDropWeaponBoost = 0.0; g_esDropAbility[iIndex].g_sDropWeaponName[0] = '\0'; + g_esDropAbility[iIndex].g_flDropWeaponResistance = 0.0; g_esDropAbility[iIndex].g_flDropWeaponScale = 1.0; g_esDropSpecial[iIndex].g_flCloseAreasOnly = -1.0; @@ -705,8 +885,15 @@ public void MT_OnConfigsLoad(int mode) g_esDropSpecial[iIndex].g_flDropClipChance = -1.0; g_esDropSpecial[iIndex].g_iDropCount = -1; g_esDropSpecial[iIndex].g_iDropHandPosition = -1; + g_esDropSpecial[iIndex].g_sDropLoadout[0] = '\0'; + g_esDropSpecial[iIndex].g_iDropItemMode = -1; g_esDropSpecial[iIndex].g_iDropMode = -1; + g_esDropSpecial[iIndex].g_sDropPinata[0] = '\0'; + g_esDropSpecial[iIndex].g_iDropPinataBody = -1; + g_esDropSpecial[iIndex].g_flDropPinataChance = -1.0; + g_esDropSpecial[iIndex].g_flDropWeaponBoost = 0.0; g_esDropSpecial[iIndex].g_sDropWeaponName[0] = '\0'; + g_esDropSpecial[iIndex].g_flDropWeaponResistance = 0.0; g_esDropSpecial[iIndex].g_flDropWeaponScale = -1.0; } } @@ -715,6 +902,7 @@ public void MT_OnConfigsLoad(int mode) for (int iPlayer = 1; iPlayer <= MaxClients; iPlayer++) { g_esDropPlayer[iPlayer].g_iAccessFlags = -1; + g_esDropPlayer[iPlayer].g_iImmunityFlags = -1; g_esDropPlayer[iPlayer].g_flCloseAreasOnly = -1.0; g_esDropPlayer[iPlayer].g_iComboAbility = -1; g_esDropPlayer[iPlayer].g_iHumanAbility = -1; @@ -726,8 +914,15 @@ public void MT_OnConfigsLoad(int mode) g_esDropPlayer[iPlayer].g_flDropClipChance = -1.0; g_esDropPlayer[iPlayer].g_iDropCount = -1; g_esDropPlayer[iPlayer].g_iDropHandPosition = -1; + g_esDropPlayer[iPlayer].g_sDropLoadout[0] = '\0'; + g_esDropPlayer[iPlayer].g_iDropItemMode = -1; g_esDropPlayer[iPlayer].g_iDropMode = -1; + g_esDropPlayer[iPlayer].g_sDropPinata[0] = '\0'; + g_esDropPlayer[iPlayer].g_iDropPinataBody = -1; + g_esDropPlayer[iPlayer].g_flDropPinataChance = -1.0; + g_esDropPlayer[iPlayer].g_flDropWeaponBoost = -1.0; g_esDropPlayer[iPlayer].g_sDropWeaponName[0] = '\0'; + g_esDropPlayer[iPlayer].g_flDropWeaponResistance = -1.0; g_esDropPlayer[iPlayer].g_flDropWeaponScale = -1.0; g_esDropTeammate[iPlayer].g_flCloseAreasOnly = -1.0; @@ -741,8 +936,15 @@ public void MT_OnConfigsLoad(int mode) g_esDropTeammate[iPlayer].g_flDropClipChance = -1.0; g_esDropTeammate[iPlayer].g_iDropCount = -1; g_esDropTeammate[iPlayer].g_iDropHandPosition = -1; + g_esDropTeammate[iPlayer].g_sDropLoadout[0] = '\0'; + g_esDropTeammate[iPlayer].g_iDropItemMode = -1; g_esDropTeammate[iPlayer].g_iDropMode = -1; + g_esDropTeammate[iPlayer].g_sDropPinata[0] = '\0'; + g_esDropTeammate[iPlayer].g_iDropPinataBody = -1; + g_esDropTeammate[iPlayer].g_flDropPinataChance = -1.0; + g_esDropTeammate[iPlayer].g_flDropWeaponBoost = -1.0; g_esDropTeammate[iPlayer].g_sDropWeaponName[0] = '\0'; + g_esDropTeammate[iPlayer].g_flDropWeaponResistance = -1.0; g_esDropTeammate[iPlayer].g_flDropWeaponScale = -1.0; } } @@ -764,15 +966,22 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esDropTeammate[admin].g_iHumanAbility = iGetKeyValue(subsection, MT_DROP_SECTION, MT_DROP_SECTION2, MT_DROP_SECTION3, MT_DROP_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esDropTeammate[admin].g_iHumanAbility, value, -1, 2); g_esDropTeammate[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_DROP_SECTION, MT_DROP_SECTION2, MT_DROP_SECTION3, MT_DROP_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esDropTeammate[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); g_esDropTeammate[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_DROP_SECTION, MT_DROP_SECTION2, MT_DROP_SECTION3, MT_DROP_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esDropTeammate[admin].g_iRequiresHumans, value, -1, 32); - g_esDropTeammate[admin].g_iDropAbility = iGetKeyValue(subsection, MT_DROP_SECTION, MT_DROP_SECTION2, MT_DROP_SECTION3, MT_DROP_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esDropTeammate[admin].g_iDropAbility, value, -1, 1); + g_esDropTeammate[admin].g_iDropAbility = iGetKeyValue(subsection, MT_DROP_SECTION, MT_DROP_SECTION2, MT_DROP_SECTION3, MT_DROP_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esDropTeammate[admin].g_iDropAbility, value, -1, 3); g_esDropTeammate[admin].g_iDropMessage = iGetKeyValue(subsection, MT_DROP_SECTION, MT_DROP_SECTION2, MT_DROP_SECTION3, MT_DROP_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esDropTeammate[admin].g_iDropMessage, value, -1, 1); g_esDropTeammate[admin].g_flDropChance = flGetKeyValue(subsection, MT_DROP_SECTION, MT_DROP_SECTION2, MT_DROP_SECTION3, MT_DROP_SECTION4, key, "DropChance", "Drop Chance", "Drop_Chance", "chance", g_esDropTeammate[admin].g_flDropChance, value, -1.0, 100.0); g_esDropTeammate[admin].g_flDropClipChance = flGetKeyValue(subsection, MT_DROP_SECTION, MT_DROP_SECTION2, MT_DROP_SECTION3, MT_DROP_SECTION4, key, "DropClipChance", "Drop Clip Chance", "Drop_Clip_Chance", "clipchance", g_esDropTeammate[admin].g_flDropClipChance, value, -1.0, 100.0); g_esDropTeammate[admin].g_iDropCount = iGetKeyValue(subsection, MT_DROP_SECTION, MT_DROP_SECTION2, MT_DROP_SECTION3, MT_DROP_SECTION4, key, "DropCount", "Drop Count", "Drop_Count", "count", g_esDropTeammate[admin].g_iDropCount, value, -1, 32); g_esDropTeammate[admin].g_iDropHandPosition = iGetKeyValue(subsection, MT_DROP_SECTION, MT_DROP_SECTION2, MT_DROP_SECTION3, MT_DROP_SECTION4, key, "DropHandPosition", "Drop Hand Position", "Drop_Hand_Position", "handpos", g_esDropTeammate[admin].g_iDropHandPosition, value, -1, 3); + g_esDropTeammate[admin].g_iDropItemMode = iGetKeyValue(subsection, MT_DROP_SECTION, MT_DROP_SECTION2, MT_DROP_SECTION3, MT_DROP_SECTION4, key, "DropItemMode", "Drop Item Mode", "Drop_Item_Mode", "itemmode", g_esDropTeammate[admin].g_iDropItemMode, value, -1, 3); g_esDropTeammate[admin].g_iDropMode = iGetKeyValue(subsection, MT_DROP_SECTION, MT_DROP_SECTION2, MT_DROP_SECTION3, MT_DROP_SECTION4, key, "DropMode", "Drop Mode", "Drop_Mode", "mode", g_esDropTeammate[admin].g_iDropMode, value, -1, 2); + g_esDropTeammate[admin].g_iDropPinataBody = iGetKeyValue(subsection, MT_DROP_SECTION, MT_DROP_SECTION2, MT_DROP_SECTION3, MT_DROP_SECTION4, key, "DropPinataBody", "Drop Pinata Body", "Drop_Pinata_Body", "pinatabody", g_esDropTeammate[admin].g_iDropPinataBody, value, -1, 1); + g_esDropTeammate[admin].g_flDropPinataChance = flGetKeyValue(subsection, MT_DROP_SECTION, MT_DROP_SECTION2, MT_DROP_SECTION3, MT_DROP_SECTION4, key, "DropPinataChance", "Drop Pinata Chance", "Drop_Pinata_Chance", "pinatachance", g_esDropTeammate[admin].g_flDropPinataChance, value, -1.0, 100.0); + g_esDropTeammate[admin].g_flDropWeaponBoost = flGetKeyValue(subsection, MT_DROP_SECTION, MT_DROP_SECTION2, MT_DROP_SECTION3, MT_DROP_SECTION4, key, "DropWeaponBoost", "Drop Weapon Boost", "Drop_Weapon_Boost", "weaponboost", g_esDropTeammate[admin].g_flDropWeaponBoost, value, -1.0, 99999.0); + g_esDropTeammate[admin].g_flDropWeaponResistance = flGetKeyValue(subsection, MT_DROP_SECTION, MT_DROP_SECTION2, MT_DROP_SECTION3, MT_DROP_SECTION4, key, "DropWeaponResistance", "Drop Weapon Resistance", "Drop_Weapon_Resistance", "weaponres", g_esDropTeammate[admin].g_flDropWeaponResistance, value, -1.0, 1.0); g_esDropTeammate[admin].g_flDropWeaponScale = flGetKeyValue(subsection, MT_DROP_SECTION, MT_DROP_SECTION2, MT_DROP_SECTION3, MT_DROP_SECTION4, key, "DropWeaponScale", "Drop Weapon Scale", "Drop_Weapon_Scale", "weaponscale", g_esDropTeammate[admin].g_flDropWeaponScale, value, -1.0, 2.0); + vGetKeyValue(subsection, MT_DROP_SECTION, MT_DROP_SECTION2, MT_DROP_SECTION3, MT_DROP_SECTION4, key, "DropLoadout", "Drop Loadout", "Drop_Loadout", "loadout", g_esDropTeammate[admin].g_sDropLoadout, sizeof esDropTeammate::g_sDropLoadout, value); + vGetKeyValue(subsection, MT_DROP_SECTION, MT_DROP_SECTION2, MT_DROP_SECTION3, MT_DROP_SECTION4, key, "DropPinata", "Drop Pinata", "Drop_Pinata", "pinata", g_esDropTeammate[admin].g_sDropPinata, sizeof esDropTeammate::g_sDropPinata, value); vGetKeyValue(subsection, MT_DROP_SECTION, MT_DROP_SECTION2, MT_DROP_SECTION3, MT_DROP_SECTION4, key, "DropWeaponName", "Drop Weapon Name", "Drop_Weapon_Name", "weaponname", g_esDropTeammate[admin].g_sDropWeaponName, sizeof esDropTeammate::g_sDropWeaponName, value); } else @@ -782,16 +991,24 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esDropPlayer[admin].g_iHumanAbility = iGetKeyValue(subsection, MT_DROP_SECTION, MT_DROP_SECTION2, MT_DROP_SECTION3, MT_DROP_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esDropPlayer[admin].g_iHumanAbility, value, -1, 2); g_esDropPlayer[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_DROP_SECTION, MT_DROP_SECTION2, MT_DROP_SECTION3, MT_DROP_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esDropPlayer[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); g_esDropPlayer[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_DROP_SECTION, MT_DROP_SECTION2, MT_DROP_SECTION3, MT_DROP_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esDropPlayer[admin].g_iRequiresHumans, value, -1, 32); - g_esDropPlayer[admin].g_iDropAbility = iGetKeyValue(subsection, MT_DROP_SECTION, MT_DROP_SECTION2, MT_DROP_SECTION3, MT_DROP_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esDropPlayer[admin].g_iDropAbility, value, -1, 1); + g_esDropPlayer[admin].g_iDropAbility = iGetKeyValue(subsection, MT_DROP_SECTION, MT_DROP_SECTION2, MT_DROP_SECTION3, MT_DROP_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esDropPlayer[admin].g_iDropAbility, value, -1, 3); g_esDropPlayer[admin].g_iDropMessage = iGetKeyValue(subsection, MT_DROP_SECTION, MT_DROP_SECTION2, MT_DROP_SECTION3, MT_DROP_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esDropPlayer[admin].g_iDropMessage, value, -1, 1); g_esDropPlayer[admin].g_flDropChance = flGetKeyValue(subsection, MT_DROP_SECTION, MT_DROP_SECTION2, MT_DROP_SECTION3, MT_DROP_SECTION4, key, "DropChance", "Drop Chance", "Drop_Chance", "chance", g_esDropPlayer[admin].g_flDropChance, value, -1.0, 100.0); g_esDropPlayer[admin].g_flDropClipChance = flGetKeyValue(subsection, MT_DROP_SECTION, MT_DROP_SECTION2, MT_DROP_SECTION3, MT_DROP_SECTION4, key, "DropClipChance", "Drop Clip Chance", "Drop_Clip_Chance", "clipchance", g_esDropPlayer[admin].g_flDropClipChance, value, -1.0, 100.0); g_esDropPlayer[admin].g_iDropCount = iGetKeyValue(subsection, MT_DROP_SECTION, MT_DROP_SECTION2, MT_DROP_SECTION3, MT_DROP_SECTION4, key, "DropCount", "Drop Count", "Drop_Count", "count", g_esDropPlayer[admin].g_iDropCount, value, -1, 32); g_esDropPlayer[admin].g_iDropHandPosition = iGetKeyValue(subsection, MT_DROP_SECTION, MT_DROP_SECTION2, MT_DROP_SECTION3, MT_DROP_SECTION4, key, "DropHandPosition", "Drop Hand Position", "Drop_Hand_Position", "handpos", g_esDropPlayer[admin].g_iDropHandPosition, value, -1, 3); + g_esDropPlayer[admin].g_iDropItemMode = iGetKeyValue(subsection, MT_DROP_SECTION, MT_DROP_SECTION2, MT_DROP_SECTION3, MT_DROP_SECTION4, key, "DropItemMode", "Drop Item Mode", "Drop_Item_Mode", "itemmode", g_esDropPlayer[admin].g_iDropItemMode, value, -1, 3); g_esDropPlayer[admin].g_iDropMode = iGetKeyValue(subsection, MT_DROP_SECTION, MT_DROP_SECTION2, MT_DROP_SECTION3, MT_DROP_SECTION4, key, "DropMode", "Drop Mode", "Drop_Mode", "mode", g_esDropPlayer[admin].g_iDropMode, value, -1, 2); + g_esDropPlayer[admin].g_iDropPinataBody = iGetKeyValue(subsection, MT_DROP_SECTION, MT_DROP_SECTION2, MT_DROP_SECTION3, MT_DROP_SECTION4, key, "DropPinataBody", "Drop Pinata Body", "Drop_Pinata_Body", "pinatabody", g_esDropPlayer[admin].g_iDropPinataBody, value, -1, 1); + g_esDropPlayer[admin].g_flDropPinataChance = flGetKeyValue(subsection, MT_DROP_SECTION, MT_DROP_SECTION2, MT_DROP_SECTION3, MT_DROP_SECTION4, key, "DropPinataChance", "Drop Pinata Chance", "Drop_Pinata_Chance", "pinatachance", g_esDropPlayer[admin].g_flDropPinataChance, value, -1.0, 100.0); + g_esDropPlayer[admin].g_flDropWeaponBoost = flGetKeyValue(subsection, MT_DROP_SECTION, MT_DROP_SECTION2, MT_DROP_SECTION3, MT_DROP_SECTION4, key, "DropWeaponBoost", "Drop Weapon Boost", "Drop_Weapon_Boost", "weaponboost", g_esDropPlayer[admin].g_flDropWeaponBoost, value, -1.0, 99999.0); + g_esDropPlayer[admin].g_flDropWeaponResistance = flGetKeyValue(subsection, MT_DROP_SECTION, MT_DROP_SECTION2, MT_DROP_SECTION3, MT_DROP_SECTION4, key, "DropWeaponResistance", "Drop Weapon Resistance", "Drop_Weapon_Resistance", "weaponres", g_esDropPlayer[admin].g_flDropWeaponResistance, value, -1.0, 1.0); g_esDropPlayer[admin].g_flDropWeaponScale = flGetKeyValue(subsection, MT_DROP_SECTION, MT_DROP_SECTION2, MT_DROP_SECTION3, MT_DROP_SECTION4, key, "DropWeaponScale", "Drop Weapon Scale", "Drop_Weapon_Scale", "weaponscale", g_esDropPlayer[admin].g_flDropWeaponScale, value, -1.0, 2.0); g_esDropPlayer[admin].g_iAccessFlags = iGetAdminFlagsValue(subsection, MT_DROP_SECTION, MT_DROP_SECTION2, MT_DROP_SECTION3, MT_DROP_SECTION4, key, "AccessFlags", "Access Flags", "Access_Flags", "access", value); + g_esDropPlayer[admin].g_iImmunityFlags = iGetAdminFlagsValue(subsection, MT_DROP_SECTION, MT_DROP_SECTION2, MT_DROP_SECTION3, MT_DROP_SECTION4, key, "ImmunityFlags", "Immunity Flags", "Immunity_Flags", "immunity", value); + vGetKeyValue(subsection, MT_DROP_SECTION, MT_DROP_SECTION2, MT_DROP_SECTION3, MT_DROP_SECTION4, key, "DropLoadout", "Drop Loadout", "Drop_Loadout", "loadout", g_esDropPlayer[admin].g_sDropLoadout, sizeof esDropPlayer::g_sDropLoadout, value); + vGetKeyValue(subsection, MT_DROP_SECTION, MT_DROP_SECTION2, MT_DROP_SECTION3, MT_DROP_SECTION4, key, "DropPinata", "Drop Pinata", "Drop_Pinata", "pinata", g_esDropPlayer[admin].g_sDropPinata, sizeof esDropPlayer::g_sDropPinata, value); vGetKeyValue(subsection, MT_DROP_SECTION, MT_DROP_SECTION2, MT_DROP_SECTION3, MT_DROP_SECTION4, key, "DropWeaponName", "Drop Weapon Name", "Drop_Weapon_Name", "weaponname", g_esDropPlayer[admin].g_sDropWeaponName, sizeof esDropPlayer::g_sDropWeaponName, value); } } @@ -805,15 +1022,22 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esDropSpecial[type].g_iHumanAbility = iGetKeyValue(subsection, MT_DROP_SECTION, MT_DROP_SECTION2, MT_DROP_SECTION3, MT_DROP_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esDropSpecial[type].g_iHumanAbility, value, -1, 2); g_esDropSpecial[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_DROP_SECTION, MT_DROP_SECTION2, MT_DROP_SECTION3, MT_DROP_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esDropSpecial[type].g_flOpenAreasOnly, value, -1.0, 99999.0); g_esDropSpecial[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_DROP_SECTION, MT_DROP_SECTION2, MT_DROP_SECTION3, MT_DROP_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esDropSpecial[type].g_iRequiresHumans, value, -1, 32); - g_esDropSpecial[type].g_iDropAbility = iGetKeyValue(subsection, MT_DROP_SECTION, MT_DROP_SECTION2, MT_DROP_SECTION3, MT_DROP_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esDropSpecial[type].g_iDropAbility, value, -1, 1); + g_esDropSpecial[type].g_iDropAbility = iGetKeyValue(subsection, MT_DROP_SECTION, MT_DROP_SECTION2, MT_DROP_SECTION3, MT_DROP_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esDropSpecial[type].g_iDropAbility, value, -1, 3); g_esDropSpecial[type].g_iDropMessage = iGetKeyValue(subsection, MT_DROP_SECTION, MT_DROP_SECTION2, MT_DROP_SECTION3, MT_DROP_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esDropSpecial[type].g_iDropMessage, value, -1, 1); g_esDropSpecial[type].g_flDropChance = flGetKeyValue(subsection, MT_DROP_SECTION, MT_DROP_SECTION2, MT_DROP_SECTION3, MT_DROP_SECTION4, key, "DropChance", "Drop Chance", "Drop_Chance", "chance", g_esDropSpecial[type].g_flDropChance, value, -1.0, 100.0); g_esDropSpecial[type].g_flDropClipChance = flGetKeyValue(subsection, MT_DROP_SECTION, MT_DROP_SECTION2, MT_DROP_SECTION3, MT_DROP_SECTION4, key, "DropClipChance", "Drop Clip Chance", "Drop_Clip_Chance", "clipchance", g_esDropSpecial[type].g_flDropClipChance, value, -1.0, 100.0); g_esDropSpecial[type].g_iDropCount = iGetKeyValue(subsection, MT_DROP_SECTION, MT_DROP_SECTION2, MT_DROP_SECTION3, MT_DROP_SECTION4, key, "DropCount", "Drop Count", "Drop_Count", "count", g_esDropSpecial[type].g_iDropCount, value, -1, 32); g_esDropSpecial[type].g_iDropHandPosition = iGetKeyValue(subsection, MT_DROP_SECTION, MT_DROP_SECTION2, MT_DROP_SECTION3, MT_DROP_SECTION4, key, "DropHandPosition", "Drop Hand Position", "Drop_Hand_Position", "handpos", g_esDropSpecial[type].g_iDropHandPosition, value, -1, 3); + g_esDropSpecial[type].g_iDropItemMode = iGetKeyValue(subsection, MT_DROP_SECTION, MT_DROP_SECTION2, MT_DROP_SECTION3, MT_DROP_SECTION4, key, "DropItemMode", "Drop Item Mode", "Drop_Item_Mode", "itemmode", g_esDropSpecial[type].g_iDropItemMode, value, -1, 3); g_esDropSpecial[type].g_iDropMode = iGetKeyValue(subsection, MT_DROP_SECTION, MT_DROP_SECTION2, MT_DROP_SECTION3, MT_DROP_SECTION4, key, "DropMode", "Drop Mode", "Drop_Mode", "mode", g_esDropSpecial[type].g_iDropMode, value, -1, 2); + g_esDropSpecial[type].g_iDropPinataBody = iGetKeyValue(subsection, MT_DROP_SECTION, MT_DROP_SECTION2, MT_DROP_SECTION3, MT_DROP_SECTION4, key, "DropPinataBody", "Drop Pinata Body", "Drop_Pinata_Body", "pinatabody", g_esDropSpecial[type].g_iDropPinataBody, value, -1, 1); + g_esDropSpecial[type].g_flDropPinataChance = flGetKeyValue(subsection, MT_DROP_SECTION, MT_DROP_SECTION2, MT_DROP_SECTION3, MT_DROP_SECTION4, key, "DropPinataChance", "Drop Pinata Chance", "Drop_Pinata_Chance", "pinatachance", g_esDropSpecial[type].g_flDropPinataChance, value, -1.0, 100.0); + g_esDropSpecial[type].g_flDropWeaponBoost = flGetKeyValue(subsection, MT_DROP_SECTION, MT_DROP_SECTION2, MT_DROP_SECTION3, MT_DROP_SECTION4, key, "DropWeaponBoost", "Drop Weapon Boost", "Drop_Weapon_Boost", "weaponboost", g_esDropSpecial[type].g_flDropWeaponBoost, value, -1.0, 99999.0); + g_esDropSpecial[type].g_flDropWeaponResistance = flGetKeyValue(subsection, MT_DROP_SECTION, MT_DROP_SECTION2, MT_DROP_SECTION3, MT_DROP_SECTION4, key, "DropWeaponResistance", "Drop Weapon Resistance", "Drop_Weapon_Resistance", "weaponres", g_esDropSpecial[type].g_flDropWeaponResistance, value, -1.0, 1.0); g_esDropSpecial[type].g_flDropWeaponScale = flGetKeyValue(subsection, MT_DROP_SECTION, MT_DROP_SECTION2, MT_DROP_SECTION3, MT_DROP_SECTION4, key, "DropWeaponScale", "Drop Weapon Scale", "Drop_Weapon_Scale", "weaponscale", g_esDropSpecial[type].g_flDropWeaponScale, value, -1.0, 2.0); + vGetKeyValue(subsection, MT_DROP_SECTION, MT_DROP_SECTION2, MT_DROP_SECTION3, MT_DROP_SECTION4, key, "DropLoadout", "Drop Loadout", "Drop_Loadout", "loadout", g_esDropSpecial[type].g_sDropLoadout, sizeof esDropSpecial::g_sDropLoadout, value); + vGetKeyValue(subsection, MT_DROP_SECTION, MT_DROP_SECTION2, MT_DROP_SECTION3, MT_DROP_SECTION4, key, "DropPinata", "Drop Pinata", "Drop_Pinata", "pinata", g_esDropSpecial[type].g_sDropPinata, sizeof esDropSpecial::g_sDropPinata, value); vGetKeyValue(subsection, MT_DROP_SECTION, MT_DROP_SECTION2, MT_DROP_SECTION3, MT_DROP_SECTION4, key, "DropWeaponName", "Drop Weapon Name", "Drop_Weapon_Name", "weaponname", g_esDropSpecial[type].g_sDropWeaponName, sizeof esDropSpecial::g_sDropWeaponName, value); } else @@ -823,16 +1047,24 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esDropAbility[type].g_iHumanAbility = iGetKeyValue(subsection, MT_DROP_SECTION, MT_DROP_SECTION2, MT_DROP_SECTION3, MT_DROP_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esDropAbility[type].g_iHumanAbility, value, -1, 2); g_esDropAbility[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_DROP_SECTION, MT_DROP_SECTION2, MT_DROP_SECTION3, MT_DROP_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esDropAbility[type].g_flOpenAreasOnly, value, -1.0, 99999.0); g_esDropAbility[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_DROP_SECTION, MT_DROP_SECTION2, MT_DROP_SECTION3, MT_DROP_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esDropAbility[type].g_iRequiresHumans, value, -1, 32); - g_esDropAbility[type].g_iDropAbility = iGetKeyValue(subsection, MT_DROP_SECTION, MT_DROP_SECTION2, MT_DROP_SECTION3, MT_DROP_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esDropAbility[type].g_iDropAbility, value, -1, 1); + g_esDropAbility[type].g_iDropAbility = iGetKeyValue(subsection, MT_DROP_SECTION, MT_DROP_SECTION2, MT_DROP_SECTION3, MT_DROP_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esDropAbility[type].g_iDropAbility, value, -1, 3); g_esDropAbility[type].g_iDropMessage = iGetKeyValue(subsection, MT_DROP_SECTION, MT_DROP_SECTION2, MT_DROP_SECTION3, MT_DROP_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esDropAbility[type].g_iDropMessage, value, -1, 1); g_esDropAbility[type].g_flDropChance = flGetKeyValue(subsection, MT_DROP_SECTION, MT_DROP_SECTION2, MT_DROP_SECTION3, MT_DROP_SECTION4, key, "DropChance", "Drop Chance", "Drop_Chance", "chance", g_esDropAbility[type].g_flDropChance, value, -1.0, 100.0); g_esDropAbility[type].g_flDropClipChance = flGetKeyValue(subsection, MT_DROP_SECTION, MT_DROP_SECTION2, MT_DROP_SECTION3, MT_DROP_SECTION4, key, "DropClipChance", "Drop Clip Chance", "Drop_Clip_Chance", "clipchance", g_esDropAbility[type].g_flDropClipChance, value, -1.0, 100.0); g_esDropAbility[type].g_iDropCount = iGetKeyValue(subsection, MT_DROP_SECTION, MT_DROP_SECTION2, MT_DROP_SECTION3, MT_DROP_SECTION4, key, "DropCount", "Drop Count", "Drop_Count", "count", g_esDropAbility[type].g_iDropCount, value, -1, 32); g_esDropAbility[type].g_iDropHandPosition = iGetKeyValue(subsection, MT_DROP_SECTION, MT_DROP_SECTION2, MT_DROP_SECTION3, MT_DROP_SECTION4, key, "DropHandPosition", "Drop Hand Position", "Drop_Hand_Position", "handpos", g_esDropAbility[type].g_iDropHandPosition, value, -1, 3); + g_esDropAbility[type].g_iDropItemMode = iGetKeyValue(subsection, MT_DROP_SECTION, MT_DROP_SECTION2, MT_DROP_SECTION3, MT_DROP_SECTION4, key, "DropItemMode", "Drop Item Mode", "Drop_Item_Mode", "itemmode", g_esDropAbility[type].g_iDropItemMode, value, -1, 3); g_esDropAbility[type].g_iDropMode = iGetKeyValue(subsection, MT_DROP_SECTION, MT_DROP_SECTION2, MT_DROP_SECTION3, MT_DROP_SECTION4, key, "DropMode", "Drop Mode", "Drop_Mode", "mode", g_esDropAbility[type].g_iDropMode, value, -1, 2); + g_esDropAbility[type].g_iDropPinataBody = iGetKeyValue(subsection, MT_DROP_SECTION, MT_DROP_SECTION2, MT_DROP_SECTION3, MT_DROP_SECTION4, key, "DropPinataBody", "Drop Pinata Body", "Drop_Pinata_Body", "pinatabody", g_esDropAbility[type].g_iDropPinataBody, value, -1, 1); + g_esDropAbility[type].g_flDropPinataChance = flGetKeyValue(subsection, MT_DROP_SECTION, MT_DROP_SECTION2, MT_DROP_SECTION3, MT_DROP_SECTION4, key, "DropPinataChance", "Drop Pinata Chance", "Drop_Pinata_Chance", "pinatachance", g_esDropAbility[type].g_flDropPinataChance, value, -1.0, 100.0); + g_esDropAbility[type].g_flDropWeaponBoost = flGetKeyValue(subsection, MT_DROP_SECTION, MT_DROP_SECTION2, MT_DROP_SECTION3, MT_DROP_SECTION4, key, "DropWeaponBoost", "Drop Weapon Boost", "Drop_Weapon_Boost", "weaponboost", g_esDropAbility[type].g_flDropWeaponBoost, value, -1.0, 99999.0); + g_esDropAbility[type].g_flDropWeaponResistance = flGetKeyValue(subsection, MT_DROP_SECTION, MT_DROP_SECTION2, MT_DROP_SECTION3, MT_DROP_SECTION4, key, "DropWeaponResistance", "Drop Weapon Resistance", "Drop_Weapon_Resistance", "weaponres", g_esDropAbility[type].g_flDropWeaponResistance, value, -1.0, 1.0); g_esDropAbility[type].g_flDropWeaponScale = flGetKeyValue(subsection, MT_DROP_SECTION, MT_DROP_SECTION2, MT_DROP_SECTION3, MT_DROP_SECTION4, key, "DropWeaponScale", "Drop Weapon Scale", "Drop_Weapon_Scale", "weaponscale", g_esDropAbility[type].g_flDropWeaponScale, value, -1.0, 2.0); g_esDropAbility[type].g_iAccessFlags = iGetAdminFlagsValue(subsection, MT_DROP_SECTION, MT_DROP_SECTION2, MT_DROP_SECTION3, MT_DROP_SECTION4, key, "AccessFlags", "Access Flags", "Access_Flags", "access", value); + g_esDropAbility[type].g_iImmunityFlags = iGetAdminFlagsValue(subsection, MT_DROP_SECTION, MT_DROP_SECTION2, MT_DROP_SECTION3, MT_DROP_SECTION4, key, "ImmunityFlags", "Immunity Flags", "Immunity_Flags", "immunity", value); + vGetKeyValue(subsection, MT_DROP_SECTION, MT_DROP_SECTION2, MT_DROP_SECTION3, MT_DROP_SECTION4, key, "DropLoadout", "Drop Loadout", "Drop_Loadout", "loadout", g_esDropAbility[type].g_sDropLoadout, sizeof esDropAbility::g_sDropLoadout, value); + vGetKeyValue(subsection, MT_DROP_SECTION, MT_DROP_SECTION2, MT_DROP_SECTION3, MT_DROP_SECTION4, key, "DropPinata", "Drop Pinata", "Drop_Pinata", "pinata", g_esDropAbility[type].g_sDropPinata, sizeof esDropAbility::g_sDropPinata, value); vGetKeyValue(subsection, MT_DROP_SECTION, MT_DROP_SECTION2, MT_DROP_SECTION3, MT_DROP_SECTION4, key, "DropWeaponName", "Drop Weapon Name", "Drop_Weapon_Name", "weaponname", g_esDropAbility[type].g_sDropWeaponName, sizeof esDropAbility::g_sDropWeaponName, value); } } @@ -855,16 +1087,23 @@ public void MT_OnSettingsCached(int tank, bool apply, int type) g_esDropCache[tank].g_iComboAbility = iGetSubSettingValue(apply, bHuman, g_esDropTeammate[tank].g_iComboAbility, g_esDropPlayer[tank].g_iComboAbility, g_esDropSpecial[iType].g_iComboAbility, g_esDropAbility[iType].g_iComboAbility, 1); g_esDropCache[tank].g_flDropChance = flGetSubSettingValue(apply, bHuman, g_esDropTeammate[tank].g_flDropChance, g_esDropPlayer[tank].g_flDropChance, g_esDropSpecial[iType].g_flDropChance, g_esDropAbility[iType].g_flDropChance, 1); g_esDropCache[tank].g_flDropClipChance = flGetSubSettingValue(apply, bHuman, g_esDropTeammate[tank].g_flDropClipChance, g_esDropPlayer[tank].g_flDropClipChance, g_esDropSpecial[iType].g_flDropClipChance, g_esDropAbility[iType].g_flDropClipChance, 1); + g_esDropCache[tank].g_flDropPinataChance = flGetSubSettingValue(apply, bHuman, g_esDropTeammate[tank].g_flDropPinataChance, g_esDropPlayer[tank].g_flDropPinataChance, g_esDropSpecial[iType].g_flDropPinataChance, g_esDropAbility[iType].g_flDropPinataChance, 1); + g_esDropCache[tank].g_flDropWeaponBoost = flGetSubSettingValue(apply, bHuman, g_esDropTeammate[tank].g_flDropWeaponBoost, g_esDropPlayer[tank].g_flDropWeaponBoost, g_esDropSpecial[iType].g_flDropWeaponBoost, g_esDropAbility[iType].g_flDropWeaponBoost, 1); + g_esDropCache[tank].g_flDropWeaponResistance = flGetSubSettingValue(apply, bHuman, g_esDropTeammate[tank].g_flDropWeaponResistance, g_esDropPlayer[tank].g_flDropWeaponResistance, g_esDropSpecial[iType].g_flDropWeaponResistance, g_esDropAbility[iType].g_flDropWeaponResistance, 1); g_esDropCache[tank].g_flDropWeaponScale = flGetSubSettingValue(apply, bHuman, g_esDropTeammate[tank].g_flDropWeaponScale, g_esDropPlayer[tank].g_flDropWeaponScale, g_esDropSpecial[iType].g_flDropWeaponScale, g_esDropAbility[iType].g_flDropWeaponScale, 1); g_esDropCache[tank].g_iDropAbility = iGetSubSettingValue(apply, bHuman, g_esDropTeammate[tank].g_iDropAbility, g_esDropPlayer[tank].g_iDropAbility, g_esDropSpecial[iType].g_iDropAbility, g_esDropAbility[iType].g_iDropAbility, 1); g_esDropCache[tank].g_iDropCount = iGetSubSettingValue(apply, bHuman, g_esDropTeammate[tank].g_iDropCount, g_esDropPlayer[tank].g_iDropCount, g_esDropSpecial[iType].g_iDropCount, g_esDropAbility[iType].g_iDropCount, 1); g_esDropCache[tank].g_iDropMessage = iGetSubSettingValue(apply, bHuman, g_esDropTeammate[tank].g_iDropMessage, g_esDropPlayer[tank].g_iDropMessage, g_esDropSpecial[iType].g_iDropMessage, g_esDropAbility[iType].g_iDropMessage, 1); g_esDropCache[tank].g_iDropHandPosition = iGetSubSettingValue(apply, bHuman, g_esDropTeammate[tank].g_iDropHandPosition, g_esDropPlayer[tank].g_iDropHandPosition, g_esDropSpecial[iType].g_iDropHandPosition, g_esDropAbility[iType].g_iDropHandPosition, 1); + g_esDropCache[tank].g_iDropItemMode = iGetSubSettingValue(apply, bHuman, g_esDropTeammate[tank].g_iDropItemMode, g_esDropPlayer[tank].g_iDropItemMode, g_esDropSpecial[iType].g_iDropItemMode, g_esDropAbility[iType].g_iDropItemMode, 1); g_esDropCache[tank].g_iDropMode = iGetSubSettingValue(apply, bHuman, g_esDropTeammate[tank].g_iDropMode, g_esDropPlayer[tank].g_iDropMode, g_esDropSpecial[iType].g_iDropMode, g_esDropAbility[iType].g_iDropMode, 1); + g_esDropCache[tank].g_iDropPinataBody = iGetSubSettingValue(apply, bHuman, g_esDropTeammate[tank].g_iDropPinataBody, g_esDropPlayer[tank].g_iDropPinataBody, g_esDropSpecial[iType].g_iDropPinataBody, g_esDropAbility[iType].g_iDropPinataBody, 1); g_esDropCache[tank].g_iHumanAbility = iGetSubSettingValue(apply, bHuman, g_esDropTeammate[tank].g_iHumanAbility, g_esDropPlayer[tank].g_iHumanAbility, g_esDropSpecial[iType].g_iHumanAbility, g_esDropAbility[iType].g_iHumanAbility, 1); g_esDropCache[tank].g_flOpenAreasOnly = flGetSubSettingValue(apply, bHuman, g_esDropTeammate[tank].g_flOpenAreasOnly, g_esDropPlayer[tank].g_flOpenAreasOnly, g_esDropSpecial[iType].g_flOpenAreasOnly, g_esDropAbility[iType].g_flOpenAreasOnly, 1); g_esDropCache[tank].g_iRequiresHumans = iGetSubSettingValue(apply, bHuman, g_esDropTeammate[tank].g_iRequiresHumans, g_esDropPlayer[tank].g_iRequiresHumans, g_esDropSpecial[iType].g_iRequiresHumans, g_esDropAbility[iType].g_iRequiresHumans, 1); + vGetSubSettingValue(apply, bHuman, g_esDropCache[tank].g_sDropLoadout, sizeof esDropCache::g_sDropLoadout, g_esDropTeammate[tank].g_sDropLoadout, g_esDropPlayer[tank].g_sDropLoadout, g_esDropSpecial[iType].g_sDropLoadout, g_esDropAbility[iType].g_sDropLoadout); + vGetSubSettingValue(apply, bHuman, g_esDropCache[tank].g_sDropPinata, sizeof esDropCache::g_sDropPinata, g_esDropTeammate[tank].g_sDropPinata, g_esDropPlayer[tank].g_sDropPinata, g_esDropSpecial[iType].g_sDropPinata, g_esDropAbility[iType].g_sDropPinata); vGetSubSettingValue(apply, bHuman, g_esDropCache[tank].g_sDropWeaponName, sizeof esDropCache::g_sDropWeaponName, g_esDropTeammate[tank].g_sDropWeaponName, g_esDropPlayer[tank].g_sDropWeaponName, g_esDropSpecial[iType].g_sDropWeaponName, g_esDropAbility[iType].g_sDropWeaponName); } else @@ -873,16 +1112,23 @@ public void MT_OnSettingsCached(int tank, bool apply, int type) g_esDropCache[tank].g_iComboAbility = iGetSettingValue(apply, bHuman, g_esDropPlayer[tank].g_iComboAbility, g_esDropAbility[iType].g_iComboAbility, 1); g_esDropCache[tank].g_flDropChance = flGetSettingValue(apply, bHuman, g_esDropPlayer[tank].g_flDropChance, g_esDropAbility[iType].g_flDropChance, 1); g_esDropCache[tank].g_flDropClipChance = flGetSettingValue(apply, bHuman, g_esDropPlayer[tank].g_flDropClipChance, g_esDropAbility[iType].g_flDropClipChance, 1); + g_esDropCache[tank].g_flDropPinataChance = flGetSettingValue(apply, bHuman, g_esDropPlayer[tank].g_flDropPinataChance, g_esDropAbility[iType].g_flDropPinataChance, 1); + g_esDropCache[tank].g_flDropWeaponBoost = flGetSettingValue(apply, bHuman, g_esDropPlayer[tank].g_flDropWeaponBoost, g_esDropAbility[iType].g_flDropWeaponBoost, 1); + g_esDropCache[tank].g_flDropWeaponResistance = flGetSettingValue(apply, bHuman, g_esDropPlayer[tank].g_flDropWeaponResistance, g_esDropAbility[iType].g_flDropWeaponResistance, 1); g_esDropCache[tank].g_flDropWeaponScale = flGetSettingValue(apply, bHuman, g_esDropPlayer[tank].g_flDropWeaponScale, g_esDropAbility[iType].g_flDropWeaponScale, 1); g_esDropCache[tank].g_iDropAbility = iGetSettingValue(apply, bHuman, g_esDropPlayer[tank].g_iDropAbility, g_esDropAbility[iType].g_iDropAbility, 1); g_esDropCache[tank].g_iDropCount = iGetSettingValue(apply, bHuman, g_esDropPlayer[tank].g_iDropCount, g_esDropAbility[iType].g_iDropCount, 1); g_esDropCache[tank].g_iDropMessage = iGetSettingValue(apply, bHuman, g_esDropPlayer[tank].g_iDropMessage, g_esDropAbility[iType].g_iDropMessage, 1); g_esDropCache[tank].g_iDropHandPosition = iGetSettingValue(apply, bHuman, g_esDropPlayer[tank].g_iDropHandPosition, g_esDropAbility[iType].g_iDropHandPosition, 1); + g_esDropCache[tank].g_iDropItemMode = iGetSettingValue(apply, bHuman, g_esDropPlayer[tank].g_iDropItemMode, g_esDropAbility[iType].g_iDropItemMode, 1); g_esDropCache[tank].g_iDropMode = iGetSettingValue(apply, bHuman, g_esDropPlayer[tank].g_iDropMode, g_esDropAbility[iType].g_iDropMode, 1); + g_esDropCache[tank].g_iDropPinataBody = iGetSettingValue(apply, bHuman, g_esDropPlayer[tank].g_iDropPinataBody, g_esDropAbility[iType].g_iDropPinataBody, 1); g_esDropCache[tank].g_iHumanAbility = iGetSettingValue(apply, bHuman, g_esDropPlayer[tank].g_iHumanAbility, g_esDropAbility[iType].g_iHumanAbility, 1); g_esDropCache[tank].g_flOpenAreasOnly = flGetSettingValue(apply, bHuman, g_esDropPlayer[tank].g_flOpenAreasOnly, g_esDropAbility[iType].g_flOpenAreasOnly, 1); g_esDropCache[tank].g_iRequiresHumans = iGetSettingValue(apply, bHuman, g_esDropPlayer[tank].g_iRequiresHumans, g_esDropAbility[iType].g_iRequiresHumans, 1); + vGetSettingValue(apply, bHuman, g_esDropCache[tank].g_sDropLoadout, sizeof esDropCache::g_sDropLoadout, g_esDropPlayer[tank].g_sDropLoadout, g_esDropAbility[iType].g_sDropLoadout); + vGetSettingValue(apply, bHuman, g_esDropCache[tank].g_sDropPinata, sizeof esDropCache::g_sDropPinata, g_esDropPlayer[tank].g_sDropPinata, g_esDropAbility[iType].g_sDropPinata); vGetSettingValue(apply, bHuman, g_esDropCache[tank].g_sDropWeaponName, sizeof esDropCache::g_sDropWeaponName, g_esDropPlayer[tank].g_sDropWeaponName, g_esDropAbility[iType].g_sDropWeaponName); } } @@ -917,11 +1163,19 @@ public void MT_OnEventFired(Event event, const char[] name, bool dontBroadcast) if (StrEqual(name, "bot_player_replace")) { int iBotId = event.GetInt("bot"), iBot = GetClientOfUserId(iBotId), - iTankId = event.GetInt("player"), iTank = GetClientOfUserId(iTankId); - if (bIsValidClient(iBot) && bIsInfected(iTank)) + iPlayerId = event.GetInt("player"), iPlayer = GetClientOfUserId(iPlayerId); + if (bIsValidClient(iBot)) { - vDropCopyStats2(iBot, iTank); - vRemoveDrop(iBot); + if (bIsInfected(iPlayer)) + { + vDropCopyStats2(iBot, iPlayer); + vRemoveDrop(iBot); + } + else if (bIsSurvivor(iPlayer)) + { + g_esDropPlayer[iPlayer].g_iGiveMode = g_esDropPlayer[iBot].g_iGiveMode; + g_esDropPlayer[iPlayer].g_sGiveLoadout = g_esDropPlayer[iBot].g_sGiveLoadout; + } } } else if (StrEqual(name, "mission_lost") || StrEqual(name, "round_start") || StrEqual(name, "round_end")) @@ -930,25 +1184,89 @@ public void MT_OnEventFired(Event event, const char[] name, bool dontBroadcast) } else if (StrEqual(name, "player_bot_replace")) { - int iTankId = event.GetInt("player"), iTank = GetClientOfUserId(iTankId), + int iPlayerId = event.GetInt("player"), iPlayer = GetClientOfUserId(iPlayerId), iBotId = event.GetInt("bot"), iBot = GetClientOfUserId(iBotId); - if (bIsValidClient(iTank) && bIsInfected(iBot)) + if (bIsValidClient(iPlayer)) { - vDropCopyStats2(iTank, iBot); - vRemoveDrop(iTank); + if (bIsInfected(iBot)) + { + vDropCopyStats2(iPlayer, iBot); + vRemoveDrop(iPlayer); + } + else if (bIsSurvivor(iBot)) + { + g_esDropPlayer[iBot].g_iGiveMode = g_esDropPlayer[iPlayer].g_iGiveMode; + g_esDropPlayer[iBot].g_sGiveLoadout = g_esDropPlayer[iPlayer].g_sGiveLoadout; + } } } else if (StrEqual(name, "player_death")) { int iTankId = event.GetInt("userid"), iTank = GetClientOfUserId(iTankId); - if (MT_IsTankSupported(iTank, MT_CHECK_INDEX|MT_CHECK_INGAME) && MT_IsCustomTankSupported(iTank) && g_esDropPlayer[iTank].g_bActivated) + if (MT_IsTankSupported(iTank, MT_CHECK_INDEX|MT_CHECK_INGAME) && MT_IsCustomTankSupported(iTank)) + { + if (g_esDropPlayer[iTank].g_bActivated) + { + if (MT_HasAdminAccess(iTank) || bHasAdminAccess(iTank, g_esDropAbility[g_esDropPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esDropPlayer[iTank].g_iAccessFlags)) + { + vDropWeapon(iTank, 1, GetRandomFloat(0.1, 100.0)); + } + + vDropReset2(iTank); + } + + if (g_esDropPlayer[iTank].g_bActivated2) + { + vDropAbility(iTank); + } + } + } + else if (StrEqual(name, "revive_success")) + { + int iSurvivorId = event.GetInt("userid"), iSurvivor = GetClientOfUserId(iSurvivorId); + if (bIsSurvivor(iSurvivor) && g_esDropPlayer[iSurvivor].g_iGiveMode >= 0 && g_esDropPlayer[iSurvivor].g_sGiveLoadout[0] != '\0') + { + char sItems[5][64]; + ReplaceString(g_esDropPlayer[iSurvivor].g_sGiveLoadout, sizeof esDropPlayer::g_sGiveLoadout, " ", ""); + ExplodeString(g_esDropPlayer[iSurvivor].g_sGiveLoadout, ",", sItems, sizeof sItems, sizeof sItems[]); + + switch (g_esDropPlayer[iSurvivor].g_iGiveMode) + { + case 0: vCheatCommand(iSurvivor, "give", sItems[MT_GetRandomInt(1, (sizeof sItems)) - 1]); + case 1: vDropLoadout(iSurvivor, g_esDropPlayer[iSurvivor].g_sGiveLoadout, sItems, sizeof sItems); + } + + vDropReset2(iSurvivor); + } + } +} + +#if defined MT_ABILITIES_MAIN +void vDropPlayerEventKilled(int victim, int attacker) +#else +public void MT_OnPlayerEventKilled(int victim, int attacker) +#endif +{ + if (bIsSurvivor(victim, MT_CHECK_INDEX|MT_CHECK_INGAME) && MT_IsTankSupported(attacker, MT_CHECK_INDEX|MT_CHECK_INGAME) && MT_IsCustomTankSupported(attacker) && (g_esDropCache[attacker].g_iDropAbility == 2 || g_esDropCache[attacker].g_iDropAbility == 3) && g_esDropCache[attacker].g_sDropPinata[0] != '\0' && GetRandomFloat(0.1, 100.0) <= g_esDropCache[attacker].g_flDropPinataChance) + { + float flPos[3]; + GetClientAbsOrigin(victim, flPos); + flPos[2] += 50.0; + + char sItems[5][64]; + ReplaceString(g_esDropCache[attacker].g_sDropPinata, sizeof esDropCache::g_sDropPinata, " ", ""); + ExplodeString(g_esDropCache[attacker].g_sDropPinata, ",", sItems, sizeof sItems, sizeof sItems[]); + for (int iItem = 0; iItem < (sizeof sItems); iItem++) { - if (MT_HasAdminAccess(iTank) || bHasAdminAccess(iTank, g_esDropAbility[g_esDropPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esDropPlayer[iTank].g_iAccessFlags)) + if (sItems[iItem][0] != '\0') { - vDropWeapon(iTank, 1, GetRandomFloat(0.1, 100.0)); + vSpawnItem(sItems[iItem], flPos); } + } - vDropReset2(iTank); + if (g_esDropCache[attacker].g_iDropPinataBody == 1) + { + g_iDropDeathModelOwner = GetClientUserId(victim); } } } @@ -964,9 +1282,17 @@ public void MT_OnAbilityActivated(int tank) return; } - if (MT_IsTankSupported(tank) && (!bIsInfected(tank, MT_CHECK_FAKECLIENT) || g_esDropCache[tank].g_iHumanAbility != 1) && MT_IsCustomTankSupported(tank) && g_esDropCache[tank].g_iDropAbility == 1 && !g_esDropPlayer[tank].g_bActivated) + if (MT_IsTankSupported(tank) && (!bIsInfected(tank, MT_CHECK_FAKECLIENT) || g_esDropCache[tank].g_iHumanAbility != 1) && MT_IsCustomTankSupported(tank) && g_esDropCache[tank].g_iDropAbility > 0) { - RequestFrame(vDropFrame, GetClientUserId(tank)); + if ((g_esDropCache[tank].g_iDropAbility == 1 || g_esDropCache[tank].g_iDropAbility == 3) && !g_esDropPlayer[tank].g_bActivated) + { + RequestFrame(vDropFrame, GetClientUserId(tank)); + } + + if ((g_esDropCache[tank].g_iDropAbility == 2 || g_esDropCache[tank].g_iDropAbility == 3) && g_esDropCache[tank].g_iComboAbility == 0 && GetRandomFloat(0.1, 100.0) <= g_esDropCache[tank].g_flDropChance && !g_esDropPlayer[tank].g_bActivated2) + { + g_esDropPlayer[tank].g_bActivated2 = true; + } } } @@ -983,17 +1309,25 @@ public void MT_OnButtonPressed(int tank, int button) return; } - if ((button & MT_SPECIAL_KEY2) && g_esDropCache[tank].g_iDropAbility == 1 && g_esDropCache[tank].g_iHumanAbility == 1) + if ((button & MT_SPECIAL_KEY2) && g_esDropCache[tank].g_iDropAbility > 0 && g_esDropCache[tank].g_iHumanAbility == 1) { - switch (g_esDropPlayer[tank].g_bActivated) + if (g_esDropPlayer[tank].g_bActivated || g_esDropPlayer[tank].g_bActivated2) { - case true: MT_PrintToChat(tank, "%s %t", MT_TAG3, "DropHuman2"); - case false: + MT_PrintToChat(tank, "%s %t", MT_TAG3, "DropHuman2"); + } + else + { + if ((g_esDropCache[tank].g_iDropAbility == 1 || g_esDropCache[tank].g_iDropAbility == 3) && !g_esDropPlayer[tank].g_bActivated) { RequestFrame(vDropFrame, GetClientUserId(tank)); + } - MT_PrintToChat(tank, "%s %t", MT_TAG3, "DropHuman"); + if ((g_esDropCache[tank].g_iDropAbility == 2 || g_esDropCache[tank].g_iDropAbility == 3) && !g_esDropPlayer[tank].g_bActivated2) + { + g_esDropPlayer[tank].g_bActivated2 = true; } + + MT_PrintToChat(tank, "%s %t", MT_TAG3, "DropHuman"); } } } @@ -1011,12 +1345,86 @@ public void MT_OnChangeType(int tank, int oldType, int newType, bool revert) } vDropWeapon(tank, 1, GetRandomFloat(0.1, 100.0)); + + if (MT_IsTankSupported(tank, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_FAKECLIENT) && ((!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esDropAbility[g_esDropPlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esDropPlayer[tank].g_iAccessFlags)) || g_esDropCache[tank].g_iHumanAbility == 0)) + { + return; + } + + if (MT_IsTankSupported(tank) && MT_IsCustomTankSupported(tank) && (g_esDropCache[tank].g_iDropAbility == 2 || g_esDropCache[tank].g_iDropAbility == 3)) + { + vDropAbility(tank); + } +} + +void vDropAbility(int tank) +{ + g_esDropPlayer[tank].g_bActivated2 = false; + + if (bIsAreaNarrow(tank, g_esDropCache[tank].g_flOpenAreasOnly) || bIsAreaWide(tank, g_esDropCache[tank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esDropPlayer[tank].g_iTankType, tank) || (g_esDropCache[tank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esDropCache[tank].g_iRequiresHumans) || (!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esDropAbility[g_esDropPlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esDropPlayer[tank].g_iAccessFlags))) + { + return; + } + + char sItems[5][64]; + ReplaceString(g_esDropCache[tank].g_sDropLoadout, sizeof esDropCache::g_sDropLoadout, " ", ""); + ExplodeString(g_esDropCache[tank].g_sDropLoadout, ",", sItems, sizeof sItems, sizeof sItems[]); + + switch (g_esDropCache[tank].g_iDropItemMode) + { + case 0, 1: + { + for (int iSurvivor = 1; iSurvivor <= MaxClients; iSurvivor++) + { + if (bIsSurvivor(iSurvivor, MT_CHECK_INGAME|MT_CHECK_ALIVE) && !MT_IsAdminImmune(iSurvivor, tank) && !bIsAdminImmune(iSurvivor, g_esDropPlayer[tank].g_iTankType, g_esDropAbility[g_esDropPlayer[tank].g_iTankTypeRecorded].g_iImmunityFlags, g_esDropPlayer[iSurvivor].g_iImmunityFlags)) + { + switch (bIsSurvivorDisabled(iSurvivor)) + { + case true: + { + g_esDropPlayer[iSurvivor].g_iGiveMode = g_esDropCache[tank].g_iDropItemMode; + strcopy(g_esDropPlayer[iSurvivor].g_sGiveLoadout, sizeof esDropPlayer::g_sGiveLoadout, g_esDropCache[tank].g_sDropLoadout); + } + case false: + { + switch (g_esDropCache[tank].g_iDropItemMode) + { + case 0: vCheatCommand(iSurvivor, "give", sItems[MT_GetRandomInt(1, (sizeof sItems)) - 1]); + case 1: vDropLoadout(iSurvivor, g_esDropCache[tank].g_sDropLoadout, sItems, sizeof sItems); + } + } + } + } + } + } + case 2: vCheatCommand(tank, "give", sItems[MT_GetRandomInt(1, (sizeof sItems)) - 1]); + case 3: vDropLoadout(tank, g_esDropCache[tank].g_sDropLoadout, sItems, sizeof sItems); + } + + if (g_esDropCache[tank].g_iDropMessage == 1) + { + char sTankName[64]; + MT_GetTankName(tank, sTankName); + MT_PrintToChatAll("%s %t", MT_TAG2, "Drop3", sTankName); + MT_LogMessage(MT_LOG_ABILITY, "%s %T", MT_TAG, "Drop3", LANG_SERVER, sTankName); + } +} + +void vDropLoadout(int survivor, const char[] loadout, const char[][] list, int size) +{ + for (int iItem = 0; iItem < size; iItem++) + { + if (StrContains(loadout, list[iItem]) != -1 && list[iItem][0] != '\0') + { + vCheatCommand(survivor, "give", list[iItem]); + } + } } void vDropWeapon(int tank, int value, float random, int pos = -1) { float flChance = (pos != -1) ? MT_GetCombinationSetting(tank, 1, pos) : g_esDropCache[tank].g_flDropChance; - if (MT_IsTankSupported(tank, MT_CHECK_INDEX|MT_CHECK_INGAME) && MT_IsCustomTankSupported(tank) && g_esDropCache[tank].g_iDropAbility == 1 && random <= flChance && bIsValidEntRef(g_esDropPlayer[tank].g_iWeapon)) + if (MT_IsTankSupported(tank, MT_CHECK_INDEX|MT_CHECK_INGAME) && MT_IsCustomTankSupported(tank) && (g_esDropCache[tank].g_iDropAbility == 1 || g_esDropCache[tank].g_iDropAbility == 3) && random <= flChance && bIsValidEntRef(g_esDropPlayer[tank].g_iWeapon)) { if (g_esDropCache[tank].g_iComboAbility == value || bIsAreaNarrow(tank, g_esDropCache[tank].g_flOpenAreasOnly) || bIsAreaWide(tank, g_esDropCache[tank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esDropPlayer[tank].g_iTankType, tank) || (g_esDropCache[tank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esDropCache[tank].g_iRequiresHumans) || (!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esDropAbility[g_esDropPlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esDropPlayer[tank].g_iAccessFlags))) { @@ -1081,6 +1489,8 @@ void vDropWeapon(int tank, int value, float random, int pos = -1) { SetEntProp(iDrop, Prop_Send, "m_iExtraPrimaryAmmo", iAmmo); } + + g_esDropGeneral.g_iDropWeapon[iDrop] = EntIndexToEntRef(iDrop); } } @@ -1102,6 +1512,8 @@ void vDropWeapon(int tank, int value, float random, int pos = -1) DispatchKeyValue(iDrop, "melee_script_name", sWeapon); TeleportEntity(iDrop, flPos, flAngles); DispatchSpawn(iDrop); + + g_esDropGeneral.g_iDropWeapon[iDrop] = EntIndexToEntRef(iDrop); } } @@ -1121,6 +1533,7 @@ void vDropWeapon(int tank, int value, float random, int pos = -1) void vDropCopyStats2(int oldTank, int newTank) { g_esDropPlayer[newTank].g_bActivated = g_esDropPlayer[oldTank].g_bActivated; + g_esDropPlayer[newTank].g_bActivated2 = g_esDropPlayer[oldTank].g_bActivated2; g_esDropPlayer[newTank].g_iWeapon = g_esDropPlayer[oldTank].g_iWeapon; g_esDropPlayer[newTank].g_iWeaponIndex = g_esDropPlayer[oldTank].g_iWeaponIndex; } @@ -1155,8 +1568,11 @@ void vDropReset() void vDropReset2(int tank) { g_esDropPlayer[tank].g_bActivated = false; + g_esDropPlayer[tank].g_bActivated2 = false; + g_esDropPlayer[tank].g_iGiveMode = -1; g_esDropPlayer[tank].g_iWeapon = INVALID_ENT_REFERENCE; g_esDropPlayer[tank].g_iWeaponIndex = 0; + g_esDropPlayer[tank].g_sGiveLoadout[0] = '\0'; } int iGetNamedWeapon(int tank) @@ -1167,7 +1583,7 @@ int iGetNamedWeapon(int tank) } char sName[32]; - int iSize = g_bSecondGame ? (sizeof g_sWeaponClasses2) : (sizeof g_sWeaponClasses); + int iSize = (g_bSecondGame ? (sizeof g_sWeaponClasses2) : (sizeof g_sWeaponClasses)); for (int iPos = 0; iPos < iSize; iPos++) { strcopy(sName, sizeof sName, (g_bSecondGame ? g_sWeaponClasses2[iPos] : g_sWeaponClasses[iPos])); @@ -1191,7 +1607,7 @@ int iGetRandomWeapon(int tank) case 2: iDropValue = MT_GetRandomInt(19, 32); } - return g_bSecondGame ? iDropValue : MT_GetRandomInt(0, 5); + return (g_bSecondGame ? iDropValue : MT_GetRandomInt(0, 5)); } void vDropFrame(int userid) @@ -1345,19 +1761,136 @@ void vDropFrame(int userid) } } -void tTimerDropCombo(Handle timer, DataPack pack) +void vSpawnItem(const char[] name, float pos[3]) +{ + char sClassname[32]; + int iItem = -1, iType = 0; + if (StrEqual(name, "gascan") || StrEqual(name, "propanetank") || StrEqual(name, "oxygentank") || StrEqual(name, "fireworkcrate")) + { + iType = 1; + } + else if (StrEqual(name, "grenade_launcher") || strncmp(name, "pistol", 6) == 0 || strncmp(name, "rifle", 6) != -1 + || strncmp(name, "smg", 3) == 0 || strncmp(name, "shotgun", 7) != -1 || strncmp(name, "sniper", 6) == 0) + { + iType = 2; + } + else if (StrEqual(name, "molotov") || StrEqual(name, "pipe_bomb") || StrEqual(name, "vomitjar") || StrEqual(name, "first_aid_kit") + || StrEqual(name, "defibrillator") || strncmp(name, "upgrade", 7) != -1 || StrEqual(name, "pain_pills") || StrEqual(name, "adrenaline")) + { + iType = 3; + } + else + { + iType = 4; + } + + switch (iType) + { + case 1: + { + FormatEx(sClassname, sizeof sClassname, "weapon_%s", name); + + switch (StrEqual(sClassname[7], "gascan")) + { + case true: iItem = CreateEntityByName(sClassname); + case false: + { + iItem = CreateEntityByName("prop_physics"); + if (bIsValidEntity(iItem)) + { + if (StrEqual(name, "fireworkcrate")) + { + SetEntityModel(iItem, MODEL_FIREWORKCRATE); + } + else if (StrEqual(name, "oxygentank")) + { + SetEntityModel(iItem, MODEL_OXYGENTANK); + } + else if (StrEqual(name, "propanetank")) + { + SetEntityModel(iItem, MODEL_PROPANETANK); + } + } + } + } + + if (bIsValidEntity(iItem)) + { + SDKHook(iItem, SDKHook_OnTakeDamage, OnDropTakeDamage2); + SDKHook(iItem, SDKHook_Use, OnDropUse); + CreateTimer(3.0, tTimerRemoveDropHooks, EntIndexToEntRef(iItem), TIMER_FLAG_NO_MAPCHANGE); + } + } + case 2, 3: + { + FormatEx(sClassname, sizeof sClassname, "weapon_%s", name); + iItem = CreateEntityByName(sClassname); + } + case 4: + { + iItem = CreateEntityByName("weapon_melee"); + if (bIsValidEntity(iItem)) + { + DispatchKeyValue(iItem, "melee_script_name", name); + } + } + } + + if (bIsValidEntity(iItem)) + { + TeleportEntity(iItem, pos); + DispatchSpawn(iItem); + ActivateEntity(iItem); + + if (iType == 2) + { + if (strncmp(name, "rifle", 6) == 0) + { + SetEntProp(iItem, Prop_Send, "m_iExtraPrimaryAmmo", 300); + } + else if (strncmp(name, "smg", 3) == 0) + { + SetEntProp(iItem, Prop_Send, "m_iExtraPrimaryAmmo", 600); + } + else if (StrEqual(name, "autoshotgun") || StrEqual(name, "shotgun_spas")) + { + SetEntProp(iItem, Prop_Send, "m_iExtraPrimaryAmmo", 100); + } + else if (StrEqual(name, "pumpshotgun") || StrEqual(name, "shotgun_chrome")) + { + SetEntProp(iItem, Prop_Send, "m_iExtraPrimaryAmmo", 50); + } + else if (StrEqual(name, "hunting_rifle") || strncmp(name, "sniper", 6) == 0) + { + SetEntProp(iItem, Prop_Send, "m_iExtraPrimaryAmmo", 150); + } + } + } +} + +Action tTimerDropCombo(Handle timer, DataPack pack) { pack.Reset(); int iTank = GetClientOfUserId(pack.ReadCell()); - if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esDropAbility[g_esDropPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esDropPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esDropPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esDropCache[iTank].g_iDropAbility == 0 || g_esDropPlayer[iTank].g_bActivated) + if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esDropAbility[g_esDropPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esDropPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esDropPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esDropCache[iTank].g_iDropAbility == 0) { - return; + return Plugin_Stop; + } + + if (g_esDropCache[iTank].g_iDropAbility == 1 || g_esDropCache[iTank].g_iDropAbility == 3) + { + float flRandom = pack.ReadFloat(); + int iPos = pack.ReadCell(); + vDropWeapon(iTank, 0, flRandom, iPos); + } + + if (g_esDropCache[iTank].g_iDropAbility == 2 || g_esDropCache[iTank].g_iDropAbility == 3) + { + g_esDropPlayer[iTank].g_bActivated2 = true; } - float flRandom = pack.ReadFloat(); - int iPos = pack.ReadCell(); - vDropWeapon(iTank, 0, flRandom, iPos); + return Plugin_Continue; } Action tTimerDropRenderWeapon(Handle timer, DataPack pack) @@ -1374,5 +1907,19 @@ Action tTimerDropRenderWeapon(Handle timer, DataPack pack) SetEntityRenderMode(iWeapon, GetEntityRenderMode(iTank)); SetEntData(iWeapon, (GetEntSendPropOffs(iWeapon, "m_clrRender") + 3), iAlpha, 1, true); + return Plugin_Continue; +} + +Action tTimerRemoveDropHooks(Handle timer, int ref) +{ + int iItem = EntRefToEntIndex(ref); + if (!bIsValidEntity(iItem)) + { + return Plugin_Stop; + } + + SDKUnhook(iItem, SDKHook_OnTakeDamage, OnDropTakeDamage2); + SDKUnhook(iItem, SDKHook_Use, OnDropUse); + return Plugin_Continue; } \ No newline at end of file diff --git a/addons/sourcemod/scripting/mutant_tanks/abilities/mt_drug.sp b/addons/sourcemod/scripting/mutant_tanks/abilities/mt_drug.sp index 636784947a..0b966b101a 100644 --- a/addons/sourcemod/scripting/mutant_tanks/abilities/mt_drug.sp +++ b/addons/sourcemod/scripting/mutant_tanks/abilities/mt_drug.sp @@ -1,6 +1,6 @@ /** - * Mutant Tanks: a L4D/L4D2 SourceMod Plugin - * Copyright (C) 2024 Alfred "Psyk0tik" Llagas + * Mutant Tanks: A L4D/L4D2 SourceMod Plugin + * Copyright (C) 2017-2025 Alfred "Psyk0tik" Llagas * * 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. * @@ -29,6 +29,8 @@ public Plugin myinfo = bool g_bDedicated, g_bLateLoad; +int g_iGraphicsLevel; + public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max) { EngineVersion evEngine = GetEngineVersion(); @@ -829,7 +831,9 @@ public void MT_OnSettingsCached(int tank, bool apply, int type) g_esDrugPlayer[tank].g_iTankTypeRecorded = apply ? MT_GetRecordedTankType(tank, type) : 0; g_esDrugPlayer[tank].g_iTankType = apply ? type : 0; int iType = g_esDrugPlayer[tank].g_iTankTypeRecorded; - +#if !defined MT_ABILITIES_MAIN + g_iGraphicsLevel = MT_GetGraphicsLevel(); +#endif if (bIsSpecialInfected(tank, MT_CHECK_INDEX|MT_CHECK_INGAME)) { g_esDrugCache[tank].g_flCloseAreasOnly = flGetSubSettingValue(apply, bHuman, g_esDrugTeammate[tank].g_flCloseAreasOnly, g_esDrugPlayer[tank].g_flCloseAreasOnly, g_esDrugSpecial[iType].g_flCloseAreasOnly, g_esDrugAbility[iType].g_flCloseAreasOnly, 1); @@ -1029,6 +1033,11 @@ public void MT_OnChangeType(int tank, int oldType, int newType, bool revert) void vDrug(int survivor, bool toggle, float angles[20]) { + if (g_iGraphicsLevel <= 0) + { + return; + } + float flAngles[3]; GetClientEyeAngles(survivor, flAngles); flAngles[2] = toggle ? angles[MT_GetRandomInt(0, 100) % 20] : 0.0; @@ -1266,35 +1275,37 @@ void vDrugReset3(int tank) g_esDrugPlayer[tank].g_iRangeCooldown = -1; } -void tTimerDrugCombo(Handle timer, DataPack pack) +Action tTimerDrugCombo(Handle timer, DataPack pack) { pack.Reset(); int iTank = GetClientOfUserId(pack.ReadCell()); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esDrugAbility[g_esDrugPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esDrugPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esDrugPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esDrugCache[iTank].g_iDrugAbility == 0) { - return; + return Plugin_Stop; } float flRandom = pack.ReadFloat(); int iPos = pack.ReadCell(); vDrugAbility(iTank, flRandom, iPos); + + return Plugin_Continue; } -void tTimerDrugCombo2(Handle timer, DataPack pack) +Action tTimerDrugCombo2(Handle timer, DataPack pack) { pack.Reset(); int iSurvivor = GetClientOfUserId(pack.ReadCell()); if (!bIsSurvivor(iSurvivor) || g_esDrugPlayer[iSurvivor].g_bAffected) { - return; + return Plugin_Stop; } int iTank = GetClientOfUserId(pack.ReadCell()); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esDrugAbility[g_esDrugPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esDrugPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esDrugPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esDrugCache[iTank].g_iDrugHit == 0) { - return; + return Plugin_Stop; } float flRandom = pack.ReadFloat(), flChance = pack.ReadFloat(); @@ -1309,6 +1320,8 @@ void tTimerDrugCombo2(Handle timer, DataPack pack) { vDrugHit(iSurvivor, iTank, flRandom, flChance, g_esDrugCache[iTank].g_iDrugHit, MT_MESSAGE_MELEE, MT_ATTACK_MELEE, iPos); } + + return Plugin_Continue; } Action tTimerDrug(Handle timer, DataPack pack) diff --git a/addons/sourcemod/scripting/mutant_tanks/abilities/mt_drunk.sp b/addons/sourcemod/scripting/mutant_tanks/abilities/mt_drunk.sp index dcaf266d86..1c7b1ed5e0 100644 --- a/addons/sourcemod/scripting/mutant_tanks/abilities/mt_drunk.sp +++ b/addons/sourcemod/scripting/mutant_tanks/abilities/mt_drunk.sp @@ -1,6 +1,6 @@ /** - * Mutant Tanks: a L4D/L4D2 SourceMod Plugin - * Copyright (C) 2024 Alfred "Psyk0tik" Llagas + * Mutant Tanks: A L4D/L4D2 SourceMod Plugin + * Copyright (C) 2017-2025 Alfred "Psyk0tik" Llagas * * 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. * @@ -1245,35 +1245,37 @@ void vDrunkReset3(int tank) g_esDrunkPlayer[tank].g_iRangeCooldown = -1; } -void tTimerDrunkCombo(Handle timer, DataPack pack) +Action tTimerDrunkCombo(Handle timer, DataPack pack) { pack.Reset(); int iTank = GetClientOfUserId(pack.ReadCell()); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esDrunkAbility[g_esDrunkPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esDrunkPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esDrunkPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esDrunkCache[iTank].g_iDrunkAbility == 0) { - return; + return Plugin_Stop; } float flRandom = pack.ReadFloat(); int iPos = pack.ReadCell(); vDrunkAbility(iTank, flRandom, iPos); + + return Plugin_Continue; } -void tTimerDrunkCombo2(Handle timer, DataPack pack) +Action tTimerDrunkCombo2(Handle timer, DataPack pack) { pack.Reset(); int iSurvivor = GetClientOfUserId(pack.ReadCell()); if (!bIsSurvivor(iSurvivor) || g_esDrunkPlayer[iSurvivor].g_bAffected) { - return; + return Plugin_Stop; } int iTank = GetClientOfUserId(pack.ReadCell()); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esDrunkAbility[g_esDrunkPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esDrunkPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esDrunkPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esDrunkCache[iTank].g_iDrunkHit == 0) { - return; + return Plugin_Stop; } float flRandom = pack.ReadFloat(), flChance = pack.ReadFloat(); @@ -1288,6 +1290,8 @@ void tTimerDrunkCombo2(Handle timer, DataPack pack) { vDrunkHit(iSurvivor, iTank, flRandom, flChance, g_esDrunkCache[iTank].g_iDrunkHit, MT_MESSAGE_MELEE, MT_ATTACK_MELEE, iPos); } + + return Plugin_Continue; } Action tTimerDrunkSpeed(Handle timer, DataPack pack) @@ -1377,13 +1381,15 @@ Action tTimerDrunkTurn(Handle timer, DataPack pack) return Plugin_Continue; } -void tTimerStopDrunkSpeed(Handle timer, int userid) +Action tTimerStopDrunkSpeed(Handle timer, int userid) { int iSurvivor = GetClientOfUserId(userid); if (!bIsSurvivor(iSurvivor)) { - return; + return Plugin_Stop; } SetEntPropFloat(iSurvivor, Prop_Send, "m_flLaggedMovementValue", (g_bLaggedMovementInstalled ? L4D_LaggedMovement(iSurvivor, 1.0, true) : 1.0)); + + return Plugin_Continue; } \ No newline at end of file diff --git a/addons/sourcemod/scripting/mutant_tanks/abilities/mt_electric.sp b/addons/sourcemod/scripting/mutant_tanks/abilities/mt_electric.sp index 99bc5c427a..5b26bc5ab0 100644 --- a/addons/sourcemod/scripting/mutant_tanks/abilities/mt_electric.sp +++ b/addons/sourcemod/scripting/mutant_tanks/abilities/mt_electric.sp @@ -1,6 +1,6 @@ /** - * Mutant Tanks: a L4D/L4D2 SourceMod Plugin - * Copyright (C) 2024 Alfred "Psyk0tik" Llagas + * Mutant Tanks: A L4D/L4D2 SourceMod Plugin + * Copyright (C) 2017-2025 Alfred "Psyk0tik" Llagas * * 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. * @@ -29,6 +29,8 @@ public Plugin myinfo = bool g_bDedicated, g_bLaggedMovementInstalled, g_bLateLoad; +int g_iGraphicsLevel; + /** * Third-party natives **/ @@ -869,7 +871,9 @@ public void MT_OnSettingsCached(int tank, bool apply, int type) g_esElectricPlayer[tank].g_iTankTypeRecorded = apply ? MT_GetRecordedTankType(tank, type) : 0; g_esElectricPlayer[tank].g_iTankType = apply ? type : 0; int iType = g_esElectricPlayer[tank].g_iTankTypeRecorded; - +#if !defined MT_ABILITIES_MAIN + g_iGraphicsLevel = MT_GetGraphicsLevel(); +#endif if (bIsSpecialInfected(tank, MT_CHECK_INDEX|MT_CHECK_INGAME)) { g_esElectricCache[tank].g_flCloseAreasOnly = flGetSubSettingValue(apply, bHuman, g_esElectricTeammate[tank].g_flCloseAreasOnly, g_esElectricPlayer[tank].g_flCloseAreasOnly, g_esElectricSpecial[iType].g_flCloseAreasOnly, g_esElectricAbility[iType].g_flCloseAreasOnly, 1); @@ -1064,7 +1068,11 @@ public void MT_OnPostTankSpawn(int tank) void vElectric(int survivor, int tank, bool main, int pos = -1) { - vAttachParticle(survivor, PARTICLE_ELECTRICITY, 2.0, 30.0); + if (g_iGraphicsLevel > 2) + { + vAttachParticle(survivor, PARTICLE_ELECTRICITY, 2.0, 30.0); + } + EmitSoundToAll(g_sElectricSounds[MT_GetRandomInt(0, (sizeof g_sElectricSounds - 1))], survivor); float flDamage = (pos != -1) ? MT_GetCombinationSetting(tank, 3, pos) : g_esElectricCache[tank].g_flElectricDamage; @@ -1195,7 +1203,11 @@ void vElectricHit(int survivor, int tank, float random, float chance, int enable dpElectric.WriteCell(iTime); } - vAttachParticle(survivor, PARTICLE_ELECTRICITY2, 2.0, 30.0); + if (g_iGraphicsLevel > 2) + { + vAttachParticle(survivor, PARTICLE_ELECTRICITY2, 2.0, 30.0); + } + vScreenEffect(survivor, tank, g_esElectricCache[tank].g_iElectricEffect, flags); if (g_esElectricCache[tank].g_iElectricMessage & messages) @@ -1227,7 +1239,7 @@ void vElectricHit(int survivor, int tank, float random, float chance, int enable void vElectricRange(int tank) { - if (MT_IsTankSupported(tank, MT_CHECK_INDEX|MT_CHECK_INGAME) && MT_IsCustomTankSupported(tank) && g_esElectricCache[tank].g_iElectricAbility == 1) + if (MT_IsTankSupported(tank, MT_CHECK_INDEX|MT_CHECK_INGAME) && MT_IsCustomTankSupported(tank) && g_esElectricCache[tank].g_iElectricAbility == 1 && g_iGraphicsLevel > 2) { if (bIsAreaNarrow(tank, g_esElectricCache[tank].g_flOpenAreasOnly) || bIsAreaWide(tank, g_esElectricCache[tank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esElectricPlayer[tank].g_iTankType, tank) || (g_esElectricCache[tank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esElectricCache[tank].g_iRequiresHumans) || (bIsInfected(tank, MT_CHECK_FAKECLIENT) && ((!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esElectricAbility[g_esElectricPlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esElectricPlayer[tank].g_iAccessFlags)) || g_esElectricCache[tank].g_iHumanAbility == 0))) { @@ -1296,35 +1308,37 @@ void vElectricReset3(int tank) g_esElectricPlayer[tank].g_iRangeCooldown = -1; } -void tTimerElectricCombo(Handle timer, DataPack pack) +Action tTimerElectricCombo(Handle timer, DataPack pack) { pack.Reset(); int iTank = GetClientOfUserId(pack.ReadCell()); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esElectricAbility[g_esElectricPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esElectricPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esElectricPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esElectricCache[iTank].g_iElectricAbility == 0) { - return; + return Plugin_Stop; } float flRandom = pack.ReadFloat(); int iPos = pack.ReadCell(); vElectricAbility(iTank, flRandom, iPos); + + return Plugin_Continue; } -void tTimerElectricCombo2(Handle timer, DataPack pack) +Action tTimerElectricCombo2(Handle timer, DataPack pack) { pack.Reset(); int iSurvivor = GetClientOfUserId(pack.ReadCell()); if (!bIsSurvivor(iSurvivor) || g_esElectricPlayer[iSurvivor].g_bAffected) { - return; + return Plugin_Stop; } int iTank = GetClientOfUserId(pack.ReadCell()); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esElectricAbility[g_esElectricPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esElectricPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esElectricPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esElectricCache[iTank].g_iElectricHit == 0) { - return; + return Plugin_Stop; } float flRandom = pack.ReadFloat(), flChance = pack.ReadFloat(); @@ -1339,6 +1353,8 @@ void tTimerElectricCombo2(Handle timer, DataPack pack) { vElectricHit(iSurvivor, iTank, flRandom, flChance, g_esElectricCache[iTank].g_iElectricHit, MT_MESSAGE_MELEE, MT_ATTACK_MELEE, iPos); } + + return Plugin_Continue; } Action tTimerElectric(Handle timer, DataPack pack) diff --git a/addons/sourcemod/scripting/mutant_tanks/abilities/mt_enforce.sp b/addons/sourcemod/scripting/mutant_tanks/abilities/mt_enforce.sp index 697d8828a1..d0b9485132 100644 --- a/addons/sourcemod/scripting/mutant_tanks/abilities/mt_enforce.sp +++ b/addons/sourcemod/scripting/mutant_tanks/abilities/mt_enforce.sp @@ -1,6 +1,6 @@ /** - * Mutant Tanks: a L4D/L4D2 SourceMod Plugin - * Copyright (C) 2024 Alfred "Psyk0tik" Llagas + * Mutant Tanks: A L4D/L4D2 SourceMod Plugin + * Copyright (C) 2017-2025 Alfred "Psyk0tik" Llagas * * 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. * @@ -1233,35 +1233,37 @@ void vEnforceReset3(int survivor) g_esEnforcePlayer[survivor].g_iSlot = -1; } -void tTimerEnforceCombo(Handle timer, DataPack pack) +Action tTimerEnforceCombo(Handle timer, DataPack pack) { pack.Reset(); int iTank = GetClientOfUserId(pack.ReadCell()); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esEnforceAbility[g_esEnforcePlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esEnforcePlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esEnforcePlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esEnforceCache[iTank].g_iEnforceAbility == 0) { - return; + return Plugin_Stop; } float flRandom = pack.ReadFloat(); int iPos = pack.ReadCell(); vEnforceAbility(iTank, flRandom, iPos); + + return Plugin_Continue; } -void tTimerEnforceCombo2(Handle timer, DataPack pack) +Action tTimerEnforceCombo2(Handle timer, DataPack pack) { pack.Reset(); int iSurvivor = GetClientOfUserId(pack.ReadCell()); if (!bIsSurvivor(iSurvivor) || g_esEnforcePlayer[iSurvivor].g_bAffected) { - return; + return Plugin_Stop; } int iTank = GetClientOfUserId(pack.ReadCell()); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esEnforceAbility[g_esEnforcePlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esEnforcePlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esEnforcePlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esEnforceCache[iTank].g_iEnforceHit == 0) { - return; + return Plugin_Stop; } float flRandom = pack.ReadFloat(), flChance = pack.ReadFloat(); @@ -1276,9 +1278,11 @@ void tTimerEnforceCombo2(Handle timer, DataPack pack) { vEnforceHit(iSurvivor, iTank, flRandom, flChance, g_esEnforceCache[iTank].g_iEnforceHit, MT_MESSAGE_MELEE, MT_ATTACK_MELEE, iPos); } + + return Plugin_Continue; } -void tTimerStopEnforce(Handle timer, DataPack pack) +Action tTimerStopEnforce(Handle timer, DataPack pack) { pack.Reset(); @@ -1287,7 +1291,7 @@ void tTimerStopEnforce(Handle timer, DataPack pack) { vEnforceReset3(iSurvivor); - return; + return Plugin_Stop; } int iTank = GetClientOfUserId(pack.ReadCell()); @@ -1295,7 +1299,7 @@ void tTimerStopEnforce(Handle timer, DataPack pack) { vEnforceReset3(iSurvivor); - return; + return Plugin_Stop; } vEnforceReset3(iSurvivor); @@ -1306,4 +1310,6 @@ void tTimerStopEnforce(Handle timer, DataPack pack) MT_PrintToChatAll("%s %t", MT_TAG2, "Enforce2", iSurvivor); MT_LogMessage(MT_LOG_ABILITY, "%s %T", MT_TAG, "Enforce2", LANG_SERVER, iSurvivor); } + + return Plugin_Continue; } \ No newline at end of file diff --git a/addons/sourcemod/scripting/mutant_tanks/abilities/mt_fast.sp b/addons/sourcemod/scripting/mutant_tanks/abilities/mt_fast.sp index b9f2f82c48..abd7597ec9 100644 --- a/addons/sourcemod/scripting/mutant_tanks/abilities/mt_fast.sp +++ b/addons/sourcemod/scripting/mutant_tanks/abilities/mt_fast.sp @@ -1,6 +1,6 @@ /** - * Mutant Tanks: a L4D/L4D2 SourceMod Plugin - * Copyright (C) 2024 Alfred "Psyk0tik" Llagas + * Mutant Tanks: A L4D/L4D2 SourceMod Plugin + * Copyright (C) 2017-2025 Alfred "Psyk0tik" Llagas * * 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. * @@ -331,7 +331,15 @@ int iFastMenuHandler(Menu menu, MenuAction action, int param1, int param2) case 0: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esFastCache[param1].g_iFastAbility == 0) ? "AbilityStatus1" : "AbilityStatus2"); case 1: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityAmmo", (g_esFastCache[param1].g_iHumanAmmo - g_esFastPlayer[param1].g_iAmmoCount), g_esFastCache[param1].g_iHumanAmmo); case 2: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtons"); - case 3: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esFastCache[param1].g_iHumanMode == 0) ? "AbilityButtonMode1" : "AbilityButtonMode2"); + case 3: + { + switch (g_esFastCache[param1].g_iHumanMode) + { + case 0: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtonMode1"); + case 1: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtonMode2"); + case 2: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtonMode3"); + } + } case 4: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityCooldown", ((g_esFastCache[param1].g_iHumanAbility == 1) ? g_esFastCache[param1].g_iHumanCooldown : g_esFastCache[param1].g_iFastCooldown)); case 5: MT_PrintToChat(param1, "%s %t", MT_TAG3, "FastDetails"); case 6: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityDuration2", ((g_esFastCache[param1].g_iHumanAbility == 1) ? g_esFastCache[param1].g_iHumanDuration : g_esFastCache[param1].g_iFastDuration)); @@ -415,7 +423,7 @@ void vFastPlayerRunCmd(int client) public Action OnPlayerRunCmd(int client, int &buttons, int &impulse, float vel[3], float angles[3], int &weapon) #endif { - if (!MT_IsTankSupported(client) || !g_esFastPlayer[client].g_bActivated || (bIsInfected(client, MT_CHECK_FAKECLIENT) && g_esFastCache[client].g_iHumanMode == 1) || g_esFastPlayer[client].g_iDuration == -1) + if (!MT_IsTankSupported(client) || !g_esFastPlayer[client].g_bActivated || (bIsInfected(client, MT_CHECK_FAKECLIENT) && g_esFastCache[client].g_iHumanMode > 0) || g_esFastPlayer[client].g_iDuration == -1) { #if defined MT_ABILITIES_MAIN return; @@ -641,7 +649,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esFastTeammate[admin].g_iHumanAmmo = iGetKeyValue(subsection, MT_FAST_SECTION, MT_FAST_SECTION2, MT_FAST_SECTION3, MT_FAST_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esFastTeammate[admin].g_iHumanAmmo, value, -1, 99999); g_esFastTeammate[admin].g_iHumanCooldown = iGetKeyValue(subsection, MT_FAST_SECTION, MT_FAST_SECTION2, MT_FAST_SECTION3, MT_FAST_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esFastTeammate[admin].g_iHumanCooldown, value, -1, 99999); g_esFastTeammate[admin].g_iHumanDuration = iGetKeyValue(subsection, MT_FAST_SECTION, MT_FAST_SECTION2, MT_FAST_SECTION3, MT_FAST_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esFastTeammate[admin].g_iHumanDuration, value, -1, 99999); - g_esFastTeammate[admin].g_iHumanMode = iGetKeyValue(subsection, MT_FAST_SECTION, MT_FAST_SECTION2, MT_FAST_SECTION3, MT_FAST_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esFastTeammate[admin].g_iHumanMode, value, -1, 1); + g_esFastTeammate[admin].g_iHumanMode = iGetKeyValue(subsection, MT_FAST_SECTION, MT_FAST_SECTION2, MT_FAST_SECTION3, MT_FAST_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esFastTeammate[admin].g_iHumanMode, value, -1, 2); g_esFastTeammate[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_FAST_SECTION, MT_FAST_SECTION2, MT_FAST_SECTION3, MT_FAST_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esFastTeammate[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); g_esFastTeammate[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_FAST_SECTION, MT_FAST_SECTION2, MT_FAST_SECTION3, MT_FAST_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esFastTeammate[admin].g_iRequiresHumans, value, -1, 32); g_esFastTeammate[admin].g_iFastAbility = iGetKeyValue(subsection, MT_FAST_SECTION, MT_FAST_SECTION2, MT_FAST_SECTION3, MT_FAST_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esFastTeammate[admin].g_iFastAbility, value, -1, 1); @@ -663,7 +671,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esFastPlayer[admin].g_iHumanAmmo = iGetKeyValue(subsection, MT_FAST_SECTION, MT_FAST_SECTION2, MT_FAST_SECTION3, MT_FAST_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esFastPlayer[admin].g_iHumanAmmo, value, -1, 99999); g_esFastPlayer[admin].g_iHumanCooldown = iGetKeyValue(subsection, MT_FAST_SECTION, MT_FAST_SECTION2, MT_FAST_SECTION3, MT_FAST_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esFastPlayer[admin].g_iHumanCooldown, value, -1, 99999); g_esFastPlayer[admin].g_iHumanDuration = iGetKeyValue(subsection, MT_FAST_SECTION, MT_FAST_SECTION2, MT_FAST_SECTION3, MT_FAST_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esFastPlayer[admin].g_iHumanDuration, value, -1, 99999); - g_esFastPlayer[admin].g_iHumanMode = iGetKeyValue(subsection, MT_FAST_SECTION, MT_FAST_SECTION2, MT_FAST_SECTION3, MT_FAST_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esFastPlayer[admin].g_iHumanMode, value, -1, 1); + g_esFastPlayer[admin].g_iHumanMode = iGetKeyValue(subsection, MT_FAST_SECTION, MT_FAST_SECTION2, MT_FAST_SECTION3, MT_FAST_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esFastPlayer[admin].g_iHumanMode, value, -1, 2); g_esFastPlayer[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_FAST_SECTION, MT_FAST_SECTION2, MT_FAST_SECTION3, MT_FAST_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esFastPlayer[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); g_esFastPlayer[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_FAST_SECTION, MT_FAST_SECTION2, MT_FAST_SECTION3, MT_FAST_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esFastPlayer[admin].g_iRequiresHumans, value, -1, 32); g_esFastPlayer[admin].g_iFastAbility = iGetKeyValue(subsection, MT_FAST_SECTION, MT_FAST_SECTION2, MT_FAST_SECTION3, MT_FAST_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esFastPlayer[admin].g_iFastAbility, value, -1, 1); @@ -691,7 +699,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esFastSpecial[type].g_iHumanAmmo = iGetKeyValue(subsection, MT_FAST_SECTION, MT_FAST_SECTION2, MT_FAST_SECTION3, MT_FAST_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esFastSpecial[type].g_iHumanAmmo, value, -1, 99999); g_esFastSpecial[type].g_iHumanCooldown = iGetKeyValue(subsection, MT_FAST_SECTION, MT_FAST_SECTION2, MT_FAST_SECTION3, MT_FAST_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esFastSpecial[type].g_iHumanCooldown, value, -1, 99999); g_esFastSpecial[type].g_iHumanDuration = iGetKeyValue(subsection, MT_FAST_SECTION, MT_FAST_SECTION2, MT_FAST_SECTION3, MT_FAST_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esFastSpecial[type].g_iHumanDuration, value, -1, 99999); - g_esFastSpecial[type].g_iHumanMode = iGetKeyValue(subsection, MT_FAST_SECTION, MT_FAST_SECTION2, MT_FAST_SECTION3, MT_FAST_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esFastSpecial[type].g_iHumanMode, value, -1, 1); + g_esFastSpecial[type].g_iHumanMode = iGetKeyValue(subsection, MT_FAST_SECTION, MT_FAST_SECTION2, MT_FAST_SECTION3, MT_FAST_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esFastSpecial[type].g_iHumanMode, value, -1, 2); g_esFastSpecial[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_FAST_SECTION, MT_FAST_SECTION2, MT_FAST_SECTION3, MT_FAST_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esFastSpecial[type].g_flOpenAreasOnly, value, -1.0, 99999.0); g_esFastSpecial[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_FAST_SECTION, MT_FAST_SECTION2, MT_FAST_SECTION3, MT_FAST_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esFastSpecial[type].g_iRequiresHumans, value, -1, 32); g_esFastSpecial[type].g_iFastAbility = iGetKeyValue(subsection, MT_FAST_SECTION, MT_FAST_SECTION2, MT_FAST_SECTION3, MT_FAST_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esFastSpecial[type].g_iFastAbility, value, -1, 1); @@ -713,7 +721,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esFastAbility[type].g_iHumanAmmo = iGetKeyValue(subsection, MT_FAST_SECTION, MT_FAST_SECTION2, MT_FAST_SECTION3, MT_FAST_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esFastAbility[type].g_iHumanAmmo, value, -1, 99999); g_esFastAbility[type].g_iHumanCooldown = iGetKeyValue(subsection, MT_FAST_SECTION, MT_FAST_SECTION2, MT_FAST_SECTION3, MT_FAST_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esFastAbility[type].g_iHumanCooldown, value, -1, 99999); g_esFastAbility[type].g_iHumanDuration = iGetKeyValue(subsection, MT_FAST_SECTION, MT_FAST_SECTION2, MT_FAST_SECTION3, MT_FAST_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esFastAbility[type].g_iHumanDuration, value, -1, 99999); - g_esFastAbility[type].g_iHumanMode = iGetKeyValue(subsection, MT_FAST_SECTION, MT_FAST_SECTION2, MT_FAST_SECTION3, MT_FAST_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esFastAbility[type].g_iHumanMode, value, -1, 1); + g_esFastAbility[type].g_iHumanMode = iGetKeyValue(subsection, MT_FAST_SECTION, MT_FAST_SECTION2, MT_FAST_SECTION3, MT_FAST_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esFastAbility[type].g_iHumanMode, value, -1, 2); g_esFastAbility[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_FAST_SECTION, MT_FAST_SECTION2, MT_FAST_SECTION3, MT_FAST_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esFastAbility[type].g_flOpenAreasOnly, value, -1.0, 99999.0); g_esFastAbility[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_FAST_SECTION, MT_FAST_SECTION2, MT_FAST_SECTION3, MT_FAST_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esFastAbility[type].g_iRequiresHumans, value, -1, 32); g_esFastAbility[type].g_iFastAbility = iGetKeyValue(subsection, MT_FAST_SECTION, MT_FAST_SECTION2, MT_FAST_SECTION3, MT_FAST_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esFastAbility[type].g_iFastAbility, value, -1, 1); @@ -942,10 +950,10 @@ public void MT_OnButtonPressed(int tank, int button) if ((button & MT_MAIN_KEY) && g_esFastCache[tank].g_iFastAbility == 1 && g_esFastCache[tank].g_iHumanAbility == 1) { - int iTime = GetTime(); + int iHumanMode = g_esFastCache[tank].g_iHumanMode, iTime = GetTime(); bool bRecharging = g_esFastPlayer[tank].g_iCooldown != -1 && g_esFastPlayer[tank].g_iCooldown >= iTime; - switch (g_esFastCache[tank].g_iHumanMode) + switch (iHumanMode) { case 0: { @@ -962,9 +970,9 @@ public void MT_OnButtonPressed(int tank, int button) MT_PrintToChat(tank, "%s %t", MT_TAG3, "FastHuman4", (g_esFastPlayer[tank].g_iCooldown - iTime)); } } - case 1: + case 1, 2: { - if (!bIsInfected(tank, MT_CHECK_FAKECLIENT) || (g_esFastPlayer[tank].g_iAmmoCount < g_esFastCache[tank].g_iHumanAmmo && g_esFastCache[tank].g_iHumanAmmo > 0)) + if ((iHumanMode == 2 && g_esFastPlayer[tank].g_bActivated) || (g_esFastPlayer[tank].g_iAmmoCount < g_esFastCache[tank].g_iHumanAmmo && g_esFastCache[tank].g_iHumanAmmo > 0)) { if (!g_esFastPlayer[tank].g_bActivated && !bRecharging) { @@ -976,7 +984,15 @@ public void MT_OnButtonPressed(int tank, int button) } else if (g_esFastPlayer[tank].g_bActivated) { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "FastHuman3"); + switch (iHumanMode) + { + case 1: MT_PrintToChat(tank, "%s %t", MT_TAG3, "FastHuman3"); + case 2: + { + vFastReset2(tank); + vFastReset3(tank); + } + } } else if (bRecharging) { @@ -1133,26 +1149,28 @@ void vFastReset3(int tank) } } -void tTimerFastCombo(Handle timer, DataPack pack) +Action tTimerFastCombo(Handle timer, DataPack pack) { pack.Reset(); int iTank = GetClientOfUserId(pack.ReadCell()); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esFastAbility[g_esFastPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esFastPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esFastPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esFastCache[iTank].g_iFastAbility == 0 || g_esFastPlayer[iTank].g_bActivated) { - return; + return Plugin_Stop; } int iPos = pack.ReadCell(); vFast(iTank, iPos); + + return Plugin_Continue; } -void tTimerFastDash(Handle timer, int userid) +Action tTimerFastDash(Handle timer, int userid) { int iTank = GetClientOfUserId(userid); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esFastAbility[g_esFastPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esFastPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esFastPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esFastCache[iTank].g_iFastAbility == 0 || g_esFastCache[iTank].g_flFastDash <= 0.0) { - return; + return Plugin_Stop; } float flTankPos[3], flSurvivorPos[3]; @@ -1168,6 +1186,8 @@ void tTimerFastDash(Handle timer, int userid) } } } + + return Plugin_Continue; } Action tTimerFastGhost(Handle timer, int userid) diff --git a/addons/sourcemod/scripting/mutant_tanks/abilities/mt_fire.sp b/addons/sourcemod/scripting/mutant_tanks/abilities/mt_fire.sp index 137cf08090..8372a96714 100644 --- a/addons/sourcemod/scripting/mutant_tanks/abilities/mt_fire.sp +++ b/addons/sourcemod/scripting/mutant_tanks/abilities/mt_fire.sp @@ -1,6 +1,6 @@ /** - * Mutant Tanks: a L4D/L4D2 SourceMod Plugin - * Copyright (C) 2024 Alfred "Psyk0tik" Llagas + * Mutant Tanks: A L4D/L4D2 SourceMod Plugin + * Copyright (C) 2017-2025 Alfred "Psyk0tik" Llagas * * 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. * @@ -1346,35 +1346,37 @@ void vFireReset() } } -void tTimerFireCombo(Handle timer, DataPack pack) +Action tTimerFireCombo(Handle timer, DataPack pack) { pack.Reset(); int iTank = GetClientOfUserId(pack.ReadCell()); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esFireAbility[g_esFirePlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esFirePlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esFirePlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esFireCache[iTank].g_iFireAbility == 0) { - return; + return Plugin_Stop; } float flRandom = pack.ReadFloat(); int iPos = pack.ReadCell(); vFireAbility(iTank, flRandom, iPos); + + return Plugin_Continue; } -void tTimerFireCombo2(Handle timer, DataPack pack) +Action tTimerFireCombo2(Handle timer, DataPack pack) { pack.Reset(); int iSurvivor = GetClientOfUserId(pack.ReadCell()); if (!bIsSurvivor(iSurvivor)) { - return; + return Plugin_Stop; } int iTank = GetClientOfUserId(pack.ReadCell()); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esFireAbility[g_esFirePlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esFirePlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esFirePlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esFireCache[iTank].g_iFireHit == 0) { - return; + return Plugin_Stop; } float flRandom = pack.ReadFloat(), flChance = pack.ReadFloat(); @@ -1389,4 +1391,6 @@ void tTimerFireCombo2(Handle timer, DataPack pack) { vFireHit(iSurvivor, iTank, flRandom, flChance, g_esFireCache[iTank].g_iFireHit, MT_MESSAGE_MELEE, MT_ATTACK_MELEE, iPos); } + + return Plugin_Continue; } \ No newline at end of file diff --git a/addons/sourcemod/scripting/mutant_tanks/abilities/mt_fling.sp b/addons/sourcemod/scripting/mutant_tanks/abilities/mt_fling.sp index 89b3dbe582..2b392476a0 100644 --- a/addons/sourcemod/scripting/mutant_tanks/abilities/mt_fling.sp +++ b/addons/sourcemod/scripting/mutant_tanks/abilities/mt_fling.sp @@ -1,6 +1,6 @@ /** - * Mutant Tanks: a L4D/L4D2 SourceMod Plugin - * Copyright (C) 2024 Alfred "Psyk0tik" Llagas + * Mutant Tanks: A L4D/L4D2 SourceMod Plugin + * Copyright (C) 2017-2025 Alfred "Psyk0tik" Llagas * * 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. * @@ -50,8 +50,6 @@ public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max } #define MT_GAMEDATA "mutant_tanks" - -#define PARTICLE_BLOOD "boomer_explode_D" #else #if MT_FLING_COMPILE_METHOD == 1 #error This file must be compiled as a standalone plugin. @@ -308,8 +306,6 @@ void vFlingMapStart() public void OnMapStart() #endif { - iPrecacheParticle(PARTICLE_BLOOD); - vFlingReset(); } @@ -1287,35 +1283,37 @@ void vFlingReset() } } -void tTimerFlingCombo(Handle timer, DataPack pack) +Action tTimerFlingCombo(Handle timer, DataPack pack) { pack.Reset(); int iTank = GetClientOfUserId(pack.ReadCell()); if (!g_bSecondGame || !MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esFlingAbility[g_esFlingPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esFlingPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esFlingPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esFlingCache[iTank].g_iFlingAbility == 0) { - return; + return Plugin_Stop; } float flRandom = pack.ReadFloat(); int iPos = pack.ReadCell(); vFlingAbility(iTank, flRandom, iPos); + + return Plugin_Continue; } -void tTimerFlingCombo2(Handle timer, DataPack pack) +Action tTimerFlingCombo2(Handle timer, DataPack pack) { pack.Reset(); int iSurvivor = GetClientOfUserId(pack.ReadCell()); if (!g_bSecondGame || !bIsSurvivor(iSurvivor)) { - return; + return Plugin_Stop; } int iTank = GetClientOfUserId(pack.ReadCell()); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esFlingAbility[g_esFlingPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esFlingPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esFlingPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esFlingCache[iTank].g_iFlingHit == 0) { - return; + return Plugin_Stop; } float flRandom = pack.ReadFloat(), flChance = pack.ReadFloat(); @@ -1330,4 +1328,6 @@ void tTimerFlingCombo2(Handle timer, DataPack pack) { vFlingHit(iSurvivor, iTank, flRandom, flChance, g_esFlingCache[iTank].g_iFlingHit, MT_MESSAGE_MELEE, MT_ATTACK_MELEE, iPos); } + + return Plugin_Continue; } \ No newline at end of file diff --git a/addons/sourcemod/scripting/mutant_tanks/abilities/mt_fly.sp b/addons/sourcemod/scripting/mutant_tanks/abilities/mt_fly.sp index 2ab10bf4f0..b395b5d8a7 100644 --- a/addons/sourcemod/scripting/mutant_tanks/abilities/mt_fly.sp +++ b/addons/sourcemod/scripting/mutant_tanks/abilities/mt_fly.sp @@ -1,6 +1,6 @@ /** - * Mutant Tanks: a L4D/L4D2 SourceMod Plugin - * Copyright (C) 2024 Alfred "Psyk0tik" Llagas + * Mutant Tanks: A L4D/L4D2 SourceMod Plugin + * Copyright (C) 2017-2025 Alfred "Psyk0tik" Llagas * * 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. * @@ -313,7 +313,15 @@ int iFlyMenuHandler(Menu menu, MenuAction action, int param1, int param2) case 0: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esFlyCache[param1].g_iFlyAbility == 0) ? "AbilityStatus1" : "AbilityStatus2"); case 1: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityAmmo", (g_esFlyCache[param1].g_iHumanAmmo - g_esFlyPlayer[param1].g_iAmmoCount), g_esFlyCache[param1].g_iHumanAmmo); case 2: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtons"); - case 3: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esFlyCache[param1].g_iHumanMode == 0) ? "AbilityButtonMode1" : "AbilityButtonMode2"); + case 3: + { + switch (g_esFlyCache[param1].g_iHumanMode) + { + case 0: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtonMode1"); + case 1: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtonMode2"); + case 2: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtonMode3"); + } + } case 4: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityCooldown", ((g_esFlyCache[param1].g_iHumanAbility == 1) ? g_esFlyCache[param1].g_iHumanCooldown : g_esFlyCache[param1].g_iFlyCooldown)); case 5: MT_PrintToChat(param1, "%s %t", MT_TAG3, "FlyDetails"); case 6: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityDuration2", ((g_esFlyCache[param1].g_iHumanAbility == 1) ? g_esFlyCache[param1].g_iHumanDuration : g_esFlyCache[param1].g_iFlyDuration)); @@ -675,7 +683,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esFlyTeammate[admin].g_iHumanAmmo = iGetKeyValue(subsection, MT_FLY_SECTION, MT_FLY_SECTION2, MT_FLY_SECTION3, MT_FLY_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esFlyTeammate[admin].g_iHumanAmmo, value, -1, 99999); g_esFlyTeammate[admin].g_iHumanCooldown = iGetKeyValue(subsection, MT_FLY_SECTION, MT_FLY_SECTION2, MT_FLY_SECTION3, MT_FLY_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esFlyTeammate[admin].g_iHumanCooldown, value, -1, 99999); g_esFlyTeammate[admin].g_iHumanDuration = iGetKeyValue(subsection, MT_FLY_SECTION, MT_FLY_SECTION2, MT_FLY_SECTION3, MT_FLY_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esFlyTeammate[admin].g_iHumanDuration, value, -1, 99999); - g_esFlyTeammate[admin].g_iHumanMode = iGetKeyValue(subsection, MT_FLY_SECTION, MT_FLY_SECTION2, MT_FLY_SECTION3, MT_FLY_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esFlyTeammate[admin].g_iHumanMode, value, -1, 1); + g_esFlyTeammate[admin].g_iHumanMode = iGetKeyValue(subsection, MT_FLY_SECTION, MT_FLY_SECTION2, MT_FLY_SECTION3, MT_FLY_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esFlyTeammate[admin].g_iHumanMode, value, -1, 2); g_esFlyTeammate[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_FLY_SECTION, MT_FLY_SECTION2, MT_FLY_SECTION3, MT_FLY_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esFlyTeammate[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); g_esFlyTeammate[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_FLY_SECTION, MT_FLY_SECTION2, MT_FLY_SECTION3, MT_FLY_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esFlyTeammate[admin].g_iRequiresHumans, value, -1, 32); g_esFlyTeammate[admin].g_iFlyAbility = iGetKeyValue(subsection, MT_FLY_SECTION, MT_FLY_SECTION2, MT_FLY_SECTION3, MT_FLY_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esFlyTeammate[admin].g_iFlyAbility, value, -1, 1); @@ -694,7 +702,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esFlyPlayer[admin].g_iHumanAmmo = iGetKeyValue(subsection, MT_FLY_SECTION, MT_FLY_SECTION2, MT_FLY_SECTION3, MT_FLY_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esFlyPlayer[admin].g_iHumanAmmo, value, -1, 99999); g_esFlyPlayer[admin].g_iHumanCooldown = iGetKeyValue(subsection, MT_FLY_SECTION, MT_FLY_SECTION2, MT_FLY_SECTION3, MT_FLY_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esFlyPlayer[admin].g_iHumanCooldown, value, -1, 99999); g_esFlyPlayer[admin].g_iHumanDuration = iGetKeyValue(subsection, MT_FLY_SECTION, MT_FLY_SECTION2, MT_FLY_SECTION3, MT_FLY_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esFlyPlayer[admin].g_iHumanDuration, value, -1, 99999); - g_esFlyPlayer[admin].g_iHumanMode = iGetKeyValue(subsection, MT_FLY_SECTION, MT_FLY_SECTION2, MT_FLY_SECTION3, MT_FLY_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esFlyPlayer[admin].g_iHumanMode, value, -1, 1); + g_esFlyPlayer[admin].g_iHumanMode = iGetKeyValue(subsection, MT_FLY_SECTION, MT_FLY_SECTION2, MT_FLY_SECTION3, MT_FLY_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esFlyPlayer[admin].g_iHumanMode, value, -1, 2); g_esFlyPlayer[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_FLY_SECTION, MT_FLY_SECTION2, MT_FLY_SECTION3, MT_FLY_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esFlyPlayer[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); g_esFlyPlayer[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_FLY_SECTION, MT_FLY_SECTION2, MT_FLY_SECTION3, MT_FLY_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esFlyPlayer[admin].g_iRequiresHumans, value, -1, 32); g_esFlyPlayer[admin].g_iFlyAbility = iGetKeyValue(subsection, MT_FLY_SECTION, MT_FLY_SECTION2, MT_FLY_SECTION3, MT_FLY_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esFlyPlayer[admin].g_iFlyAbility, value, -1, 1); @@ -719,7 +727,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esFlySpecial[type].g_iHumanAmmo = iGetKeyValue(subsection, MT_FLY_SECTION, MT_FLY_SECTION2, MT_FLY_SECTION3, MT_FLY_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esFlySpecial[type].g_iHumanAmmo, value, -1, 99999); g_esFlySpecial[type].g_iHumanCooldown = iGetKeyValue(subsection, MT_FLY_SECTION, MT_FLY_SECTION2, MT_FLY_SECTION3, MT_FLY_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esFlySpecial[type].g_iHumanCooldown, value, -1, 99999); g_esFlySpecial[type].g_iHumanDuration = iGetKeyValue(subsection, MT_FLY_SECTION, MT_FLY_SECTION2, MT_FLY_SECTION3, MT_FLY_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esFlySpecial[type].g_iHumanDuration, value, -1, 99999); - g_esFlySpecial[type].g_iHumanMode = iGetKeyValue(subsection, MT_FLY_SECTION, MT_FLY_SECTION2, MT_FLY_SECTION3, MT_FLY_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esFlySpecial[type].g_iHumanMode, value, -1, 1); + g_esFlySpecial[type].g_iHumanMode = iGetKeyValue(subsection, MT_FLY_SECTION, MT_FLY_SECTION2, MT_FLY_SECTION3, MT_FLY_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esFlySpecial[type].g_iHumanMode, value, -1, 2); g_esFlySpecial[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_FLY_SECTION, MT_FLY_SECTION2, MT_FLY_SECTION3, MT_FLY_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esFlySpecial[type].g_flOpenAreasOnly, value, -1.0, 99999.0); g_esFlySpecial[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_FLY_SECTION, MT_FLY_SECTION2, MT_FLY_SECTION3, MT_FLY_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esFlySpecial[type].g_iRequiresHumans, value, -1, 32); g_esFlySpecial[type].g_iFlyAbility = iGetKeyValue(subsection, MT_FLY_SECTION, MT_FLY_SECTION2, MT_FLY_SECTION3, MT_FLY_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esFlySpecial[type].g_iFlyAbility, value, -1, 1); @@ -738,7 +746,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esFlyAbility[type].g_iHumanAmmo = iGetKeyValue(subsection, MT_FLY_SECTION, MT_FLY_SECTION2, MT_FLY_SECTION3, MT_FLY_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esFlyAbility[type].g_iHumanAmmo, value, -1, 99999); g_esFlyAbility[type].g_iHumanCooldown = iGetKeyValue(subsection, MT_FLY_SECTION, MT_FLY_SECTION2, MT_FLY_SECTION3, MT_FLY_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esFlyAbility[type].g_iHumanCooldown, value, -1, 99999); g_esFlyAbility[type].g_iHumanDuration = iGetKeyValue(subsection, MT_FLY_SECTION, MT_FLY_SECTION2, MT_FLY_SECTION3, MT_FLY_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esFlyAbility[type].g_iHumanDuration, value, -1, 99999); - g_esFlyAbility[type].g_iHumanMode = iGetKeyValue(subsection, MT_FLY_SECTION, MT_FLY_SECTION2, MT_FLY_SECTION3, MT_FLY_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esFlyAbility[type].g_iHumanMode, value, -1, 1); + g_esFlyAbility[type].g_iHumanMode = iGetKeyValue(subsection, MT_FLY_SECTION, MT_FLY_SECTION2, MT_FLY_SECTION3, MT_FLY_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esFlyAbility[type].g_iHumanMode, value, -1, 2); g_esFlyAbility[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_FLY_SECTION, MT_FLY_SECTION2, MT_FLY_SECTION3, MT_FLY_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esFlyAbility[type].g_flOpenAreasOnly, value, -1.0, 99999.0); g_esFlyAbility[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_FLY_SECTION, MT_FLY_SECTION2, MT_FLY_SECTION3, MT_FLY_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esFlyAbility[type].g_iRequiresHumans, value, -1, 32); g_esFlyAbility[type].g_iFlyAbility = iGetKeyValue(subsection, MT_FLY_SECTION, MT_FLY_SECTION2, MT_FLY_SECTION3, MT_FLY_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esFlyAbility[type].g_iFlyAbility, value, -1, 1); @@ -929,10 +937,10 @@ public void MT_OnButtonPressed(int tank, int button) if ((button & MT_MAIN_KEY) && g_esFlyCache[tank].g_iFlyAbility == 1 && g_esFlyCache[tank].g_iHumanAbility == 1) { - int iTime = GetTime(); + int iHumanMode = g_esFlyCache[tank].g_iHumanMode, iTime = GetTime(); bool bRecharging = g_esFlyPlayer[tank].g_iCooldown != -1 && g_esFlyPlayer[tank].g_iCooldown >= iTime; - switch (g_esFlyCache[tank].g_iHumanMode) + switch (iHumanMode) { case 0: { @@ -949,9 +957,9 @@ public void MT_OnButtonPressed(int tank, int button) MT_PrintToChat(tank, "%s %t", MT_TAG3, "FlyHuman4", (g_esFlyPlayer[tank].g_iCooldown - iTime)); } } - case 1: + case 1, 2: { - if (g_esFlyPlayer[tank].g_iAmmoCount < g_esFlyCache[tank].g_iHumanAmmo && g_esFlyCache[tank].g_iHumanAmmo > 0) + if ((iHumanMode == 2 && g_esFlyPlayer[tank].g_bActivated) || (g_esFlyPlayer[tank].g_iAmmoCount < g_esFlyCache[tank].g_iHumanAmmo && g_esFlyCache[tank].g_iHumanAmmo > 0)) { if (!g_esFlyPlayer[tank].g_bActivated && !bRecharging) { @@ -959,7 +967,11 @@ public void MT_OnButtonPressed(int tank, int button) } else if (g_esFlyPlayer[tank].g_bActivated) { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "FlyHuman3"); + switch (iHumanMode) + { + case 1: MT_PrintToChat(tank, "%s %t", MT_TAG3, "FlyHuman3"); + case 2: vRemoveFly2(tank); + } } else if (bRecharging) { @@ -1635,16 +1647,18 @@ int iGetFlyTarget(float pos[3], float angles[3], int tank) return iTarget; } -void tTimerFlyCombo(Handle timer, DataPack pack) +Action tTimerFlyCombo(Handle timer, DataPack pack) { pack.Reset(); int iTank = GetClientOfUserId(pack.ReadCell()); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esFlyAbility[g_esFlyPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esFlyPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esFlyPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esFlyCache[iTank].g_iFlyAbility == 0 || g_esFlyPlayer[iTank].g_bActivated) { - return; + return Plugin_Stop; } int iPos = pack.ReadCell(); vFly(iTank, true, iPos); + + return Plugin_Continue; } \ No newline at end of file diff --git a/addons/sourcemod/scripting/mutant_tanks/abilities/mt_fragile.sp b/addons/sourcemod/scripting/mutant_tanks/abilities/mt_fragile.sp index de63e5cb45..87f4fde8a7 100644 --- a/addons/sourcemod/scripting/mutant_tanks/abilities/mt_fragile.sp +++ b/addons/sourcemod/scripting/mutant_tanks/abilities/mt_fragile.sp @@ -1,6 +1,6 @@ /** - * Mutant Tanks: a L4D/L4D2 SourceMod Plugin - * Copyright (C) 2024 Alfred "Psyk0tik" Llagas + * Mutant Tanks: A L4D/L4D2 SourceMod Plugin + * Copyright (C) 2017-2025 Alfred "Psyk0tik" Llagas * * 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. * @@ -359,7 +359,15 @@ int iFragileMenuHandler(Menu menu, MenuAction action, int param1, int param2) case 0: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esFragileCache[param1].g_iFragileAbility == 0) ? "AbilityStatus1" : "AbilityStatus2"); case 1: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityAmmo", (g_esFragileCache[param1].g_iHumanAmmo - g_esFragilePlayer[param1].g_iAmmoCount), g_esFragileCache[param1].g_iHumanAmmo); case 2: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtons"); - case 3: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esFragileCache[param1].g_iHumanMode == 0) ? "AbilityButtonMode1" : "AbilityButtonMode2"); + case 3: + { + switch (g_esFragileCache[param1].g_iHumanMode) + { + case 0: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtonMode1"); + case 1: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtonMode2"); + case 2: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtonMode3"); + } + } case 4: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityCooldown", ((g_esFragileCache[param1].g_iHumanAbility == 1) ? g_esFragileCache[param1].g_iHumanCooldown : g_esFragileCache[param1].g_iFragileCooldown)); case 5: MT_PrintToChat(param1, "%s %t", MT_TAG3, "FragileDetails"); case 6: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityDuration2", ((g_esFragileCache[param1].g_iHumanAbility == 1) ? g_esFragileCache[param1].g_iHumanDuration : g_esFragileCache[param1].g_iFragileDuration)); @@ -443,7 +451,7 @@ void vFragilePlayerRunCmd(int client) public Action OnPlayerRunCmd(int client, int &buttons, int &impulse, float vel[3], float angles[3], int &weapon) #endif { - if (!MT_IsTankSupported(client) || !g_esFragilePlayer[client].g_bActivated || (bIsInfected(client, MT_CHECK_FAKECLIENT) && g_esFragileCache[client].g_iHumanMode == 1) || g_esFragilePlayer[client].g_iDuration == -1) + if (!MT_IsTankSupported(client) || !g_esFragilePlayer[client].g_bActivated || (bIsInfected(client, MT_CHECK_FAKECLIENT) && g_esFragileCache[client].g_iHumanMode > 0) || g_esFragilePlayer[client].g_iDuration == -1) { #if defined MT_ABILITIES_MAIN return; @@ -505,7 +513,7 @@ Action OnFragileTakeDamage(int victim, int &attacker, int &inflictor, float &dam bChanged = true; damage *= g_esFragileCache[victim].g_flFragileMeleeMultiplier; - if (bSurvivor && MT_DoesSurvivorHaveRewardType(attacker, MT_REWARD_ATTACKBOOST) && MT_GetRandomFloat(0.0, 100.0) <= 15.0) + if (bSurvivor && MT_DoesSurvivorHaveRewardType(attacker, MT_REWARD_ATTACKBOOST) && GetRandomFloat(0.1, 100.0) <= 15.0) { float flTankOrigin[3], flSurvivorOrigin[3], flDirection[3]; GetClientAbsOrigin(attacker, flSurvivorOrigin); @@ -772,7 +780,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esFragileTeammate[admin].g_iHumanAmmo = iGetKeyValue(subsection, MT_FRAGILE_SECTION, MT_FRAGILE_SECTION2, MT_FRAGILE_SECTION3, MT_FRAGILE_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esFragileTeammate[admin].g_iHumanAmmo, value, -1, 99999); g_esFragileTeammate[admin].g_iHumanCooldown = iGetKeyValue(subsection, MT_FRAGILE_SECTION, MT_FRAGILE_SECTION2, MT_FRAGILE_SECTION3, MT_FRAGILE_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esFragileTeammate[admin].g_iHumanCooldown, value, -1, 99999); g_esFragileTeammate[admin].g_iHumanDuration = iGetKeyValue(subsection, MT_FRAGILE_SECTION, MT_FRAGILE_SECTION2, MT_FRAGILE_SECTION3, MT_FRAGILE_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esFragileTeammate[admin].g_iHumanDuration, value, -1, 99999); - g_esFragileTeammate[admin].g_iHumanMode = iGetKeyValue(subsection, MT_FRAGILE_SECTION, MT_FRAGILE_SECTION2, MT_FRAGILE_SECTION3, MT_FRAGILE_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esFragileTeammate[admin].g_iHumanMode, value, -1, 1); + g_esFragileTeammate[admin].g_iHumanMode = iGetKeyValue(subsection, MT_FRAGILE_SECTION, MT_FRAGILE_SECTION2, MT_FRAGILE_SECTION3, MT_FRAGILE_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esFragileTeammate[admin].g_iHumanMode, value, -1, 2); g_esFragileTeammate[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_FRAGILE_SECTION, MT_FRAGILE_SECTION2, MT_FRAGILE_SECTION3, MT_FRAGILE_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esFragileTeammate[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); g_esFragileTeammate[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_FRAGILE_SECTION, MT_FRAGILE_SECTION2, MT_FRAGILE_SECTION3, MT_FRAGILE_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esFragileTeammate[admin].g_iRequiresHumans, value, -1, 32); g_esFragileTeammate[admin].g_iFragileAbility = iGetKeyValue(subsection, MT_FRAGILE_SECTION, MT_FRAGILE_SECTION2, MT_FRAGILE_SECTION3, MT_FRAGILE_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esFragileTeammate[admin].g_iFragileAbility, value, -1, 1); @@ -797,7 +805,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esFragilePlayer[admin].g_iHumanAmmo = iGetKeyValue(subsection, MT_FRAGILE_SECTION, MT_FRAGILE_SECTION2, MT_FRAGILE_SECTION3, MT_FRAGILE_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esFragilePlayer[admin].g_iHumanAmmo, value, -1, 99999); g_esFragilePlayer[admin].g_iHumanCooldown = iGetKeyValue(subsection, MT_FRAGILE_SECTION, MT_FRAGILE_SECTION2, MT_FRAGILE_SECTION3, MT_FRAGILE_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esFragilePlayer[admin].g_iHumanCooldown, value, -1, 99999); g_esFragilePlayer[admin].g_iHumanDuration = iGetKeyValue(subsection, MT_FRAGILE_SECTION, MT_FRAGILE_SECTION2, MT_FRAGILE_SECTION3, MT_FRAGILE_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esFragilePlayer[admin].g_iHumanDuration, value, -1, 99999); - g_esFragilePlayer[admin].g_iHumanMode = iGetKeyValue(subsection, MT_FRAGILE_SECTION, MT_FRAGILE_SECTION2, MT_FRAGILE_SECTION3, MT_FRAGILE_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esFragilePlayer[admin].g_iHumanMode, value, -1, 1); + g_esFragilePlayer[admin].g_iHumanMode = iGetKeyValue(subsection, MT_FRAGILE_SECTION, MT_FRAGILE_SECTION2, MT_FRAGILE_SECTION3, MT_FRAGILE_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esFragilePlayer[admin].g_iHumanMode, value, -1, 2); g_esFragilePlayer[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_FRAGILE_SECTION, MT_FRAGILE_SECTION2, MT_FRAGILE_SECTION3, MT_FRAGILE_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esFragilePlayer[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); g_esFragilePlayer[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_FRAGILE_SECTION, MT_FRAGILE_SECTION2, MT_FRAGILE_SECTION3, MT_FRAGILE_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esFragilePlayer[admin].g_iRequiresHumans, value, -1, 32); g_esFragilePlayer[admin].g_iFragileAbility = iGetKeyValue(subsection, MT_FRAGILE_SECTION, MT_FRAGILE_SECTION2, MT_FRAGILE_SECTION3, MT_FRAGILE_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esFragilePlayer[admin].g_iFragileAbility, value, -1, 1); @@ -828,7 +836,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esFragileSpecial[type].g_iHumanAmmo = iGetKeyValue(subsection, MT_FRAGILE_SECTION, MT_FRAGILE_SECTION2, MT_FRAGILE_SECTION3, MT_FRAGILE_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esFragileSpecial[type].g_iHumanAmmo, value, -1, 99999); g_esFragileSpecial[type].g_iHumanCooldown = iGetKeyValue(subsection, MT_FRAGILE_SECTION, MT_FRAGILE_SECTION2, MT_FRAGILE_SECTION3, MT_FRAGILE_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esFragileSpecial[type].g_iHumanCooldown, value, -1, 99999); g_esFragileSpecial[type].g_iHumanDuration = iGetKeyValue(subsection, MT_FRAGILE_SECTION, MT_FRAGILE_SECTION2, MT_FRAGILE_SECTION3, MT_FRAGILE_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esFragileSpecial[type].g_iHumanDuration, value, -1, 99999); - g_esFragileSpecial[type].g_iHumanMode = iGetKeyValue(subsection, MT_FRAGILE_SECTION, MT_FRAGILE_SECTION2, MT_FRAGILE_SECTION3, MT_FRAGILE_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esFragileSpecial[type].g_iHumanMode, value, -1, 1); + g_esFragileSpecial[type].g_iHumanMode = iGetKeyValue(subsection, MT_FRAGILE_SECTION, MT_FRAGILE_SECTION2, MT_FRAGILE_SECTION3, MT_FRAGILE_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esFragileSpecial[type].g_iHumanMode, value, -1, 2); g_esFragileSpecial[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_FRAGILE_SECTION, MT_FRAGILE_SECTION2, MT_FRAGILE_SECTION3, MT_FRAGILE_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esFragileSpecial[type].g_flOpenAreasOnly, value, -1.0, 99999.0); g_esFragileSpecial[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_FRAGILE_SECTION, MT_FRAGILE_SECTION2, MT_FRAGILE_SECTION3, MT_FRAGILE_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esFragileSpecial[type].g_iRequiresHumans, value, -1, 32); g_esFragileSpecial[type].g_iFragileAbility = iGetKeyValue(subsection, MT_FRAGILE_SECTION, MT_FRAGILE_SECTION2, MT_FRAGILE_SECTION3, MT_FRAGILE_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esFragileSpecial[type].g_iFragileAbility, value, -1, 1); @@ -853,7 +861,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esFragileAbility[type].g_iHumanAmmo = iGetKeyValue(subsection, MT_FRAGILE_SECTION, MT_FRAGILE_SECTION2, MT_FRAGILE_SECTION3, MT_FRAGILE_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esFragileAbility[type].g_iHumanAmmo, value, -1, 99999); g_esFragileAbility[type].g_iHumanCooldown = iGetKeyValue(subsection, MT_FRAGILE_SECTION, MT_FRAGILE_SECTION2, MT_FRAGILE_SECTION3, MT_FRAGILE_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esFragileAbility[type].g_iHumanCooldown, value, -1, 99999); g_esFragileAbility[type].g_iHumanDuration = iGetKeyValue(subsection, MT_FRAGILE_SECTION, MT_FRAGILE_SECTION2, MT_FRAGILE_SECTION3, MT_FRAGILE_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esFragileAbility[type].g_iHumanDuration, value, -1, 99999); - g_esFragileAbility[type].g_iHumanMode = iGetKeyValue(subsection, MT_FRAGILE_SECTION, MT_FRAGILE_SECTION2, MT_FRAGILE_SECTION3, MT_FRAGILE_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esFragileAbility[type].g_iHumanMode, value, -1, 1); + g_esFragileAbility[type].g_iHumanMode = iGetKeyValue(subsection, MT_FRAGILE_SECTION, MT_FRAGILE_SECTION2, MT_FRAGILE_SECTION3, MT_FRAGILE_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esFragileAbility[type].g_iHumanMode, value, -1, 2); g_esFragileAbility[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_FRAGILE_SECTION, MT_FRAGILE_SECTION2, MT_FRAGILE_SECTION3, MT_FRAGILE_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esFragileAbility[type].g_flOpenAreasOnly, value, -1.0, 99999.0); g_esFragileAbility[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_FRAGILE_SECTION, MT_FRAGILE_SECTION2, MT_FRAGILE_SECTION3, MT_FRAGILE_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esFragileAbility[type].g_iRequiresHumans, value, -1, 32); g_esFragileAbility[type].g_iFragileAbility = iGetKeyValue(subsection, MT_FRAGILE_SECTION, MT_FRAGILE_SECTION2, MT_FRAGILE_SECTION3, MT_FRAGILE_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esFragileAbility[type].g_iFragileAbility, value, -1, 1); @@ -902,6 +910,7 @@ public void MT_OnSettingsCached(int tank, bool apply, int type) g_esFragileCache[tank].g_iFragileCooldown = iGetSubSettingValue(apply, bHuman, g_esFragileTeammate[tank].g_iFragileCooldown, g_esFragilePlayer[tank].g_iFragileCooldown, g_esFragileSpecial[iType].g_iFragileCooldown, g_esFragileAbility[iType].g_iFragileCooldown, 1); g_esFragileCache[tank].g_iFragileDuration = iGetSubSettingValue(apply, bHuman, g_esFragileTeammate[tank].g_iFragileDuration, g_esFragilePlayer[tank].g_iFragileDuration, g_esFragileSpecial[iType].g_iFragileDuration, g_esFragileAbility[iType].g_iFragileDuration, 1); g_esFragileCache[tank].g_iFragileMessage = iGetSubSettingValue(apply, bHuman, g_esFragileTeammate[tank].g_iFragileMessage, g_esFragilePlayer[tank].g_iFragileMessage, g_esFragileSpecial[iType].g_iFragileMessage, g_esFragileAbility[iType].g_iFragileMessage, 1); + g_esFragileCache[tank].g_iFragileMode = iGetSubSettingValue(apply, bHuman, g_esFragileTeammate[tank].g_iFragileMode, g_esFragilePlayer[tank].g_iFragileMode, g_esFragileSpecial[iType].g_iFragileMode, g_esFragileAbility[iType].g_iFragileMode, 1); g_esFragileCache[tank].g_iHumanAbility = iGetSubSettingValue(apply, bHuman, g_esFragileTeammate[tank].g_iHumanAbility, g_esFragilePlayer[tank].g_iHumanAbility, g_esFragileSpecial[iType].g_iHumanAbility, g_esFragileAbility[iType].g_iHumanAbility, 1); g_esFragileCache[tank].g_iHumanAmmo = iGetSubSettingValue(apply, bHuman, g_esFragileTeammate[tank].g_iHumanAmmo, g_esFragilePlayer[tank].g_iHumanAmmo, g_esFragileSpecial[iType].g_iHumanAmmo, g_esFragileAbility[iType].g_iHumanAmmo, 1); g_esFragileCache[tank].g_iHumanCooldown = iGetSubSettingValue(apply, bHuman, g_esFragileTeammate[tank].g_iHumanCooldown, g_esFragilePlayer[tank].g_iHumanCooldown, g_esFragileSpecial[iType].g_iHumanCooldown, g_esFragileAbility[iType].g_iHumanCooldown, 1); @@ -926,6 +935,7 @@ public void MT_OnSettingsCached(int tank, bool apply, int type) g_esFragileCache[tank].g_iFragileCooldown = iGetSettingValue(apply, bHuman, g_esFragilePlayer[tank].g_iFragileCooldown, g_esFragileAbility[iType].g_iFragileCooldown, 1); g_esFragileCache[tank].g_iFragileDuration = iGetSettingValue(apply, bHuman, g_esFragilePlayer[tank].g_iFragileDuration, g_esFragileAbility[iType].g_iFragileDuration, 1); g_esFragileCache[tank].g_iFragileMessage = iGetSettingValue(apply, bHuman, g_esFragilePlayer[tank].g_iFragileMessage, g_esFragileAbility[iType].g_iFragileMessage, 1); + g_esFragileCache[tank].g_iFragileMode = iGetSettingValue(apply, bHuman, g_esFragilePlayer[tank].g_iFragileMode, g_esFragileAbility[iType].g_iFragileMode, 1); g_esFragileCache[tank].g_iHumanAbility = iGetSettingValue(apply, bHuman, g_esFragilePlayer[tank].g_iHumanAbility, g_esFragileAbility[iType].g_iHumanAbility, 1); g_esFragileCache[tank].g_iHumanAmmo = iGetSettingValue(apply, bHuman, g_esFragilePlayer[tank].g_iHumanAmmo, g_esFragileAbility[iType].g_iHumanAmmo, 1); g_esFragileCache[tank].g_iHumanCooldown = iGetSettingValue(apply, bHuman, g_esFragilePlayer[tank].g_iHumanCooldown, g_esFragileAbility[iType].g_iHumanCooldown, 1); @@ -1044,10 +1054,10 @@ public void MT_OnButtonPressed(int tank, int button) if ((button & MT_MAIN_KEY) && g_esFragileCache[tank].g_iFragileAbility == 1 && g_esFragileCache[tank].g_iHumanAbility == 1) { - int iTime = GetTime(); + int iHumanMode = g_esFragileCache[tank].g_iHumanMode, iTime = GetTime(); bool bRecharging = g_esFragilePlayer[tank].g_iCooldown != -1 && g_esFragilePlayer[tank].g_iCooldown >= iTime; - switch (g_esFragileCache[tank].g_iHumanMode) + switch (iHumanMode) { case 0: { @@ -1064,9 +1074,9 @@ public void MT_OnButtonPressed(int tank, int button) MT_PrintToChat(tank, "%s %t", MT_TAG3, "FragileHuman4", (g_esFragilePlayer[tank].g_iCooldown - iTime)); } } - case 1: + case 1, 2: { - if (g_esFragilePlayer[tank].g_iAmmoCount < g_esFragileCache[tank].g_iHumanAmmo && g_esFragileCache[tank].g_iHumanAmmo > 0) + if ((iHumanMode == 2 && g_esFragilePlayer[tank].g_bActivated) || (g_esFragilePlayer[tank].g_iAmmoCount < g_esFragileCache[tank].g_iHumanAmmo && g_esFragileCache[tank].g_iHumanAmmo > 0)) { if (!g_esFragilePlayer[tank].g_bActivated && !bRecharging) { @@ -1077,7 +1087,15 @@ public void MT_OnButtonPressed(int tank, int button) } else if (g_esFragilePlayer[tank].g_bActivated) { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "FragileHuman3"); + switch (iHumanMode) + { + case 1: MT_PrintToChat(tank, "%s %t", MT_TAG3, "FragileHuman3"); + case 2: + { + vFragileReset2(tank); + vFragileReset3(tank); + } + } } else if (bRecharging) { @@ -1230,16 +1248,18 @@ void vFragileReset3(int tank) } } -void tTimerFragileCombo(Handle timer, DataPack pack) +Action tTimerFragileCombo(Handle timer, DataPack pack) { pack.Reset(); int iTank = GetClientOfUserId(pack.ReadCell()); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esFragileAbility[g_esFragilePlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esFragilePlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esFragilePlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esFragileCache[iTank].g_iFragileAbility == 0 || g_esFragilePlayer[iTank].g_bActivated) { - return; + return Plugin_Stop; } int iPos = pack.ReadCell(); vFragile(iTank, iPos); + + return Plugin_Continue; } \ No newline at end of file diff --git a/addons/sourcemod/scripting/mutant_tanks/abilities/mt_ghost.sp b/addons/sourcemod/scripting/mutant_tanks/abilities/mt_ghost.sp index 48884f7e9e..27e7dd7f67 100644 --- a/addons/sourcemod/scripting/mutant_tanks/abilities/mt_ghost.sp +++ b/addons/sourcemod/scripting/mutant_tanks/abilities/mt_ghost.sp @@ -1,6 +1,6 @@ /** - * Mutant Tanks: a L4D/L4D2 SourceMod Plugin - * Copyright (C) 2024 Alfred "Psyk0tik" Llagas + * Mutant Tanks: A L4D/L4D2 SourceMod Plugin + * Copyright (C) 2017-2025 Alfred "Psyk0tik" Llagas * * 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. * @@ -415,7 +415,15 @@ int iGhostMenuHandler(Menu menu, MenuAction action, int param1, int param2) MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtons"); MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtons2"); } - case 3: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esGhostCache[param1].g_iHumanMode == 0) ? "AbilityButtonMode1" : "AbilityButtonMode2"); + case 3: + { + switch (g_esGhostCache[param1].g_iHumanMode) + { + case 0: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtonMode1"); + case 1: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtonMode2"); + case 2: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtonMode3"); + } + } case 4: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityCooldown", ((g_esGhostCache[param1].g_iHumanAbility == 1) ? g_esGhostCache[param1].g_iHumanCooldown : g_esGhostCache[param1].g_iGhostCooldown)); case 5: MT_PrintToChat(param1, "%s %t", MT_TAG3, "GhostDetails"); case 6: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityDuration2", ((g_esGhostCache[param1].g_iHumanAbility == 1) ? g_esGhostCache[param1].g_iHumanDuration : g_esGhostCache[param1].g_iGhostDuration)); @@ -879,7 +887,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esGhostTeammate[admin].g_iHumanAmmo = iGetKeyValue(subsection, MT_GHOST_SECTION, MT_GHOST_SECTION2, MT_GHOST_SECTION3, MT_GHOST_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esGhostTeammate[admin].g_iHumanAmmo, value, -1, 99999); g_esGhostTeammate[admin].g_iHumanCooldown = iGetKeyValue(subsection, MT_GHOST_SECTION, MT_GHOST_SECTION2, MT_GHOST_SECTION3, MT_GHOST_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esGhostTeammate[admin].g_iHumanCooldown, value, -1, 99999); g_esGhostTeammate[admin].g_iHumanDuration = iGetKeyValue(subsection, MT_GHOST_SECTION, MT_GHOST_SECTION2, MT_GHOST_SECTION3, MT_GHOST_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esGhostTeammate[admin].g_iHumanDuration, value, -1, 99999); - g_esGhostTeammate[admin].g_iHumanMode = iGetKeyValue(subsection, MT_GHOST_SECTION, MT_GHOST_SECTION2, MT_GHOST_SECTION3, MT_GHOST_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esGhostTeammate[admin].g_iHumanMode, value, -1, 1); + g_esGhostTeammate[admin].g_iHumanMode = iGetKeyValue(subsection, MT_GHOST_SECTION, MT_GHOST_SECTION2, MT_GHOST_SECTION3, MT_GHOST_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esGhostTeammate[admin].g_iHumanMode, value, -1, 2); g_esGhostTeammate[admin].g_iHumanRangeCooldown = iGetKeyValue(subsection, MT_GHOST_SECTION, MT_GHOST_SECTION2, MT_GHOST_SECTION3, MT_GHOST_SECTION4, key, "HumanRangeCooldown", "Human Range Cooldown", "Human_Range_Cooldown", "hrangecooldown", g_esGhostTeammate[admin].g_iHumanRangeCooldown, value, -1, 99999); g_esGhostTeammate[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_GHOST_SECTION, MT_GHOST_SECTION2, MT_GHOST_SECTION3, MT_GHOST_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esGhostTeammate[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); g_esGhostTeammate[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_GHOST_SECTION, MT_GHOST_SECTION2, MT_GHOST_SECTION3, MT_GHOST_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esGhostTeammate[admin].g_iRequiresHumans, value, -1, 32); @@ -913,7 +921,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esGhostPlayer[admin].g_iHumanAmmo = iGetKeyValue(subsection, MT_GHOST_SECTION, MT_GHOST_SECTION2, MT_GHOST_SECTION3, MT_GHOST_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esGhostPlayer[admin].g_iHumanAmmo, value, -1, 99999); g_esGhostPlayer[admin].g_iHumanCooldown = iGetKeyValue(subsection, MT_GHOST_SECTION, MT_GHOST_SECTION2, MT_GHOST_SECTION3, MT_GHOST_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esGhostPlayer[admin].g_iHumanCooldown, value, -1, 99999); g_esGhostPlayer[admin].g_iHumanDuration = iGetKeyValue(subsection, MT_GHOST_SECTION, MT_GHOST_SECTION2, MT_GHOST_SECTION3, MT_GHOST_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esGhostPlayer[admin].g_iHumanDuration, value, -1, 99999); - g_esGhostPlayer[admin].g_iHumanMode = iGetKeyValue(subsection, MT_GHOST_SECTION, MT_GHOST_SECTION2, MT_GHOST_SECTION3, MT_GHOST_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esGhostPlayer[admin].g_iHumanMode, value, -1, 1); + g_esGhostPlayer[admin].g_iHumanMode = iGetKeyValue(subsection, MT_GHOST_SECTION, MT_GHOST_SECTION2, MT_GHOST_SECTION3, MT_GHOST_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esGhostPlayer[admin].g_iHumanMode, value, -1, 2); g_esGhostPlayer[admin].g_iHumanRangeCooldown = iGetKeyValue(subsection, MT_GHOST_SECTION, MT_GHOST_SECTION2, MT_GHOST_SECTION3, MT_GHOST_SECTION4, key, "HumanRangeCooldown", "Human Range Cooldown", "Human_Range_Cooldown", "hrangecooldown", g_esGhostPlayer[admin].g_iHumanRangeCooldown, value, -1, 99999); g_esGhostPlayer[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_GHOST_SECTION, MT_GHOST_SECTION2, MT_GHOST_SECTION3, MT_GHOST_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esGhostPlayer[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); g_esGhostPlayer[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_GHOST_SECTION, MT_GHOST_SECTION2, MT_GHOST_SECTION3, MT_GHOST_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esGhostPlayer[admin].g_iRequiresHumans, value, -1, 32); @@ -953,7 +961,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esGhostSpecial[type].g_iHumanAmmo = iGetKeyValue(subsection, MT_GHOST_SECTION, MT_GHOST_SECTION2, MT_GHOST_SECTION3, MT_GHOST_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esGhostSpecial[type].g_iHumanAmmo, value, -1, 99999); g_esGhostSpecial[type].g_iHumanCooldown = iGetKeyValue(subsection, MT_GHOST_SECTION, MT_GHOST_SECTION2, MT_GHOST_SECTION3, MT_GHOST_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esGhostSpecial[type].g_iHumanCooldown, value, -1, 99999); g_esGhostSpecial[type].g_iHumanDuration = iGetKeyValue(subsection, MT_GHOST_SECTION, MT_GHOST_SECTION2, MT_GHOST_SECTION3, MT_GHOST_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esGhostSpecial[type].g_iHumanDuration, value, -1, 99999); - g_esGhostSpecial[type].g_iHumanMode = iGetKeyValue(subsection, MT_GHOST_SECTION, MT_GHOST_SECTION2, MT_GHOST_SECTION3, MT_GHOST_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esGhostSpecial[type].g_iHumanMode, value, -1, 1); + g_esGhostSpecial[type].g_iHumanMode = iGetKeyValue(subsection, MT_GHOST_SECTION, MT_GHOST_SECTION2, MT_GHOST_SECTION3, MT_GHOST_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esGhostSpecial[type].g_iHumanMode, value, -1, 2); g_esGhostSpecial[type].g_iHumanRangeCooldown = iGetKeyValue(subsection, MT_GHOST_SECTION, MT_GHOST_SECTION2, MT_GHOST_SECTION3, MT_GHOST_SECTION4, key, "HumanRangeCooldown", "Human Range Cooldown", "Human_Range_Cooldown", "hrangecooldown", g_esGhostSpecial[type].g_iHumanRangeCooldown, value, -1, 99999); g_esGhostSpecial[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_GHOST_SECTION, MT_GHOST_SECTION2, MT_GHOST_SECTION3, MT_GHOST_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esGhostSpecial[type].g_flOpenAreasOnly, value, -1.0, 99999.0); g_esGhostSpecial[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_GHOST_SECTION, MT_GHOST_SECTION2, MT_GHOST_SECTION3, MT_GHOST_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esGhostSpecial[type].g_iRequiresHumans, value, -1, 32); @@ -987,7 +995,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esGhostAbility[type].g_iHumanAmmo = iGetKeyValue(subsection, MT_GHOST_SECTION, MT_GHOST_SECTION2, MT_GHOST_SECTION3, MT_GHOST_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esGhostAbility[type].g_iHumanAmmo, value, -1, 99999); g_esGhostAbility[type].g_iHumanCooldown = iGetKeyValue(subsection, MT_GHOST_SECTION, MT_GHOST_SECTION2, MT_GHOST_SECTION3, MT_GHOST_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esGhostAbility[type].g_iHumanCooldown, value, -1, 99999); g_esGhostAbility[type].g_iHumanDuration = iGetKeyValue(subsection, MT_GHOST_SECTION, MT_GHOST_SECTION2, MT_GHOST_SECTION3, MT_GHOST_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esGhostAbility[type].g_iHumanDuration, value, -1, 99999); - g_esGhostAbility[type].g_iHumanMode = iGetKeyValue(subsection, MT_GHOST_SECTION, MT_GHOST_SECTION2, MT_GHOST_SECTION3, MT_GHOST_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esGhostAbility[type].g_iHumanMode, value, -1, 1); + g_esGhostAbility[type].g_iHumanMode = iGetKeyValue(subsection, MT_GHOST_SECTION, MT_GHOST_SECTION2, MT_GHOST_SECTION3, MT_GHOST_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esGhostAbility[type].g_iHumanMode, value, -1, 2); g_esGhostAbility[type].g_iHumanRangeCooldown = iGetKeyValue(subsection, MT_GHOST_SECTION, MT_GHOST_SECTION2, MT_GHOST_SECTION3, MT_GHOST_SECTION4, key, "HumanRangeCooldown", "Human Range Cooldown", "Human_Range_Cooldown", "hrangecooldown", g_esGhostAbility[type].g_iHumanRangeCooldown, value, -1, 99999); g_esGhostAbility[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_GHOST_SECTION, MT_GHOST_SECTION2, MT_GHOST_SECTION3, MT_GHOST_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esGhostAbility[type].g_flOpenAreasOnly, value, -1.0, 99999.0); g_esGhostAbility[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_GHOST_SECTION, MT_GHOST_SECTION2, MT_GHOST_SECTION3, MT_GHOST_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esGhostAbility[type].g_iRequiresHumans, value, -1, 32); @@ -1205,8 +1213,9 @@ public void MT_OnButtonPressed(int tank, int button) if ((button & MT_MAIN_KEY) && (g_esGhostCache[tank].g_iGhostAbility == 2 || g_esGhostCache[tank].g_iGhostAbility == 3) && g_esGhostCache[tank].g_iHumanAbility == 1) { bool bRecharging = g_esGhostPlayer[tank].g_iCooldown != -1 && g_esGhostPlayer[tank].g_iCooldown >= iTime; + int iHumanMode = g_esGhostCache[tank].g_iHumanMode; - switch (g_esGhostCache[tank].g_iHumanMode) + switch (iHumanMode) { case 0: { @@ -1223,9 +1232,9 @@ public void MT_OnButtonPressed(int tank, int button) MT_PrintToChat(tank, "%s %t", MT_TAG3, "GhostHuman5", (g_esGhostPlayer[tank].g_iCooldown - iTime)); } } - case 1: + case 1, 2: { - if (g_esGhostPlayer[tank].g_iAmmoCount < g_esGhostCache[tank].g_iHumanAmmo && g_esGhostCache[tank].g_iHumanAmmo > 0) + if ((iHumanMode == 2 && g_esGhostPlayer[tank].g_bActivated) || (g_esGhostPlayer[tank].g_iAmmoCount < g_esGhostCache[tank].g_iHumanAmmo && g_esGhostCache[tank].g_iHumanAmmo > 0)) { if (!g_esGhostPlayer[tank].g_bActivated && !bRecharging) { @@ -1238,7 +1247,11 @@ public void MT_OnButtonPressed(int tank, int button) } else if (g_esGhostPlayer[tank].g_bActivated) { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "GhostHuman4"); + switch (iHumanMode) + { + case 1: MT_PrintToChat(tank, "%s %t", MT_TAG3, "GhostHuman4"); + case 2: vGhostReset2(tank); + } } else if (bRecharging) { @@ -1675,49 +1688,53 @@ void vGhostResetRender(int tank) SetEntityRenderColor(tank, iSkinColor[0], iSkinColor[1], iSkinColor[2], g_esGhostPlayer[tank].g_iGhostAlpha); } -void tTimerGhostCombo(Handle timer, DataPack pack) +Action tTimerGhostCombo(Handle timer, DataPack pack) { pack.Reset(); int iTank = GetClientOfUserId(pack.ReadCell()); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esGhostAbility[g_esGhostPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esGhostPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esGhostPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esGhostCache[iTank].g_iGhostAbility == 0 || g_esGhostCache[iTank].g_iGhostAbility == 2) { - return; + return Plugin_Stop; } float flRandom = pack.ReadFloat(); int iPos = pack.ReadCell(); vGhostAbility(iTank, true, flRandom, iPos); + + return Plugin_Continue; } -void tTimerGhostCombo2(Handle timer, DataPack pack) +Action tTimerGhostCombo2(Handle timer, DataPack pack) { pack.Reset(); int iTank = GetClientOfUserId(pack.ReadCell()); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esGhostAbility[g_esGhostPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esGhostPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esGhostPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esGhostCache[iTank].g_iGhostAbility == 0 || g_esGhostCache[iTank].g_iGhostAbility == 1) { - return; + return Plugin_Stop; } int iPos = pack.ReadCell(); vGhostAbility(iTank, false, .pos = iPos); + + return Plugin_Continue; } -void tTimerGhostCombo3(Handle timer, DataPack pack) +Action tTimerGhostCombo3(Handle timer, DataPack pack) { pack.Reset(); int iSurvivor = GetClientOfUserId(pack.ReadCell()); if (!bIsSurvivor(iSurvivor)) { - return; + return Plugin_Stop; } int iTank = GetClientOfUserId(pack.ReadCell()); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esGhostAbility[g_esGhostPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esGhostPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esGhostPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esGhostCache[iTank].g_iGhostHit == 0) { - return; + return Plugin_Stop; } float flRandom = pack.ReadFloat(), flChance = pack.ReadFloat(); @@ -1731,6 +1748,8 @@ void tTimerGhostCombo3(Handle timer, DataPack pack) { vGhostHit(iSurvivor, iTank, flRandom, flChance, g_esGhostCache[iTank].g_iGhostHit, MT_MESSAGE_MELEE, MT_ATTACK_MELEE); } + + return Plugin_Continue; } Action tTimerGhost(Handle timer, DataPack pack) diff --git a/addons/sourcemod/scripting/mutant_tanks/abilities/mt_god.sp b/addons/sourcemod/scripting/mutant_tanks/abilities/mt_god.sp index c483a36f93..7fc9a4bfd6 100644 --- a/addons/sourcemod/scripting/mutant_tanks/abilities/mt_god.sp +++ b/addons/sourcemod/scripting/mutant_tanks/abilities/mt_god.sp @@ -1,6 +1,6 @@ /** - * Mutant Tanks: a L4D/L4D2 SourceMod Plugin - * Copyright (C) 2024 Alfred "Psyk0tik" Llagas + * Mutant Tanks: A L4D/L4D2 SourceMod Plugin + * Copyright (C) 2017-2025 Alfred "Psyk0tik" Llagas * * 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. * @@ -298,7 +298,15 @@ int iGodMenuHandler(Menu menu, MenuAction action, int param1, int param2) case 0: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esGodCache[param1].g_iGodAbility == 0) ? "AbilityStatus1" : "AbilityStatus2"); case 1: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityAmmo", (g_esGodCache[param1].g_iHumanAmmo - g_esGodPlayer[param1].g_iAmmoCount), g_esGodCache[param1].g_iHumanAmmo); case 2: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtons"); - case 3: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esGodCache[param1].g_iHumanMode == 0) ? "AbilityButtonMode1" : "AbilityButtonMode2"); + case 3: + { + switch (g_esGodCache[param1].g_iHumanMode) + { + case 0: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtonMode1"); + case 1: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtonMode2"); + case 2: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtonMode3"); + } + } case 4: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityCooldown", ((g_esGodCache[param1].g_iHumanAbility == 1) ? g_esGodCache[param1].g_iHumanCooldown : g_esGodCache[param1].g_iGodCooldown)); case 5: MT_PrintToChat(param1, "%s %t", MT_TAG3, "GodDetails"); case 6: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityDuration2", ((g_esGodCache[param1].g_iHumanAbility == 1) ? g_esGodCache[param1].g_iHumanDuration : g_esGodCache[param1].g_iGodDuration)); @@ -382,7 +390,7 @@ void vGodPlayerRunCmd(int client) public Action OnPlayerRunCmd(int client, int &buttons, int &impulse, float vel[3], float angles[3], int &weapon) #endif { - if (!MT_IsTankSupported(client) || !g_esGodPlayer[client].g_bActivated || (bIsInfected(client, MT_CHECK_FAKECLIENT) && g_esGodCache[client].g_iHumanMode == 1) || g_esGodPlayer[client].g_iDuration == -1) + if (!MT_IsTankSupported(client) || !g_esGodPlayer[client].g_bActivated || (bIsInfected(client, MT_CHECK_FAKECLIENT) && g_esGodCache[client].g_iHumanMode > 0) || g_esGodPlayer[client].g_iDuration == -1) { #if defined MT_ABILITIES_MAIN return; @@ -627,7 +635,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esGodTeammate[admin].g_iHumanAmmo = iGetKeyValue(subsection, MT_GOD_SECTION, MT_GOD_SECTION2, MT_GOD_SECTION3, MT_GOD_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esGodTeammate[admin].g_iHumanAmmo, value, -1, 99999); g_esGodTeammate[admin].g_iHumanCooldown = iGetKeyValue(subsection, MT_GOD_SECTION, MT_GOD_SECTION2, MT_GOD_SECTION3, MT_GOD_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esGodTeammate[admin].g_iHumanCooldown, value, -1, 99999); g_esGodTeammate[admin].g_iHumanDuration = iGetKeyValue(subsection, MT_GOD_SECTION, MT_GOD_SECTION2, MT_GOD_SECTION3, MT_GOD_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esGodTeammate[admin].g_iHumanDuration, value, -1, 99999); - g_esGodTeammate[admin].g_iHumanMode = iGetKeyValue(subsection, MT_GOD_SECTION, MT_GOD_SECTION2, MT_GOD_SECTION3, MT_GOD_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esGodTeammate[admin].g_iHumanMode, value, -1, 1); + g_esGodTeammate[admin].g_iHumanMode = iGetKeyValue(subsection, MT_GOD_SECTION, MT_GOD_SECTION2, MT_GOD_SECTION3, MT_GOD_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esGodTeammate[admin].g_iHumanMode, value, -1, 2); g_esGodTeammate[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_GOD_SECTION, MT_GOD_SECTION2, MT_GOD_SECTION3, MT_GOD_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esGodTeammate[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); g_esGodTeammate[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_GOD_SECTION, MT_GOD_SECTION2, MT_GOD_SECTION3, MT_GOD_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esGodTeammate[admin].g_iRequiresHumans, value, -1, 32); g_esGodTeammate[admin].g_iGodAbility = iGetKeyValue(subsection, MT_GOD_SECTION, MT_GOD_SECTION2, MT_GOD_SECTION3, MT_GOD_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esGodTeammate[admin].g_iGodAbility, value, -1, 1); @@ -644,7 +652,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esGodPlayer[admin].g_iHumanAmmo = iGetKeyValue(subsection, MT_GOD_SECTION, MT_GOD_SECTION2, MT_GOD_SECTION3, MT_GOD_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esGodPlayer[admin].g_iHumanAmmo, value, -1, 99999); g_esGodPlayer[admin].g_iHumanCooldown = iGetKeyValue(subsection, MT_GOD_SECTION, MT_GOD_SECTION2, MT_GOD_SECTION3, MT_GOD_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esGodPlayer[admin].g_iHumanCooldown, value, -1, 99999); g_esGodPlayer[admin].g_iHumanDuration = iGetKeyValue(subsection, MT_GOD_SECTION, MT_GOD_SECTION2, MT_GOD_SECTION3, MT_GOD_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esGodPlayer[admin].g_iHumanDuration, value, -1, 99999); - g_esGodPlayer[admin].g_iHumanMode = iGetKeyValue(subsection, MT_GOD_SECTION, MT_GOD_SECTION2, MT_GOD_SECTION3, MT_GOD_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esGodPlayer[admin].g_iHumanMode, value, -1, 1); + g_esGodPlayer[admin].g_iHumanMode = iGetKeyValue(subsection, MT_GOD_SECTION, MT_GOD_SECTION2, MT_GOD_SECTION3, MT_GOD_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esGodPlayer[admin].g_iHumanMode, value, -1, 2); g_esGodPlayer[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_GOD_SECTION, MT_GOD_SECTION2, MT_GOD_SECTION3, MT_GOD_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esGodPlayer[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); g_esGodPlayer[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_GOD_SECTION, MT_GOD_SECTION2, MT_GOD_SECTION3, MT_GOD_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esGodPlayer[admin].g_iRequiresHumans, value, -1, 32); g_esGodPlayer[admin].g_iGodAbility = iGetKeyValue(subsection, MT_GOD_SECTION, MT_GOD_SECTION2, MT_GOD_SECTION3, MT_GOD_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esGodPlayer[admin].g_iGodAbility, value, -1, 1); @@ -667,7 +675,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esGodSpecial[type].g_iHumanAmmo = iGetKeyValue(subsection, MT_GOD_SECTION, MT_GOD_SECTION2, MT_GOD_SECTION3, MT_GOD_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esGodSpecial[type].g_iHumanAmmo, value, -1, 99999); g_esGodSpecial[type].g_iHumanCooldown = iGetKeyValue(subsection, MT_GOD_SECTION, MT_GOD_SECTION2, MT_GOD_SECTION3, MT_GOD_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esGodSpecial[type].g_iHumanCooldown, value, -1, 99999); g_esGodSpecial[type].g_iHumanDuration = iGetKeyValue(subsection, MT_GOD_SECTION, MT_GOD_SECTION2, MT_GOD_SECTION3, MT_GOD_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esGodSpecial[type].g_iHumanDuration, value, -1, 99999); - g_esGodSpecial[type].g_iHumanMode = iGetKeyValue(subsection, MT_GOD_SECTION, MT_GOD_SECTION2, MT_GOD_SECTION3, MT_GOD_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esGodSpecial[type].g_iHumanMode, value, -1, 1); + g_esGodSpecial[type].g_iHumanMode = iGetKeyValue(subsection, MT_GOD_SECTION, MT_GOD_SECTION2, MT_GOD_SECTION3, MT_GOD_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esGodSpecial[type].g_iHumanMode, value, -1, 2); g_esGodSpecial[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_GOD_SECTION, MT_GOD_SECTION2, MT_GOD_SECTION3, MT_GOD_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esGodSpecial[type].g_flOpenAreasOnly, value, -1.0, 99999.0); g_esGodSpecial[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_GOD_SECTION, MT_GOD_SECTION2, MT_GOD_SECTION3, MT_GOD_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esGodSpecial[type].g_iRequiresHumans, value, -1, 32); g_esGodSpecial[type].g_iGodAbility = iGetKeyValue(subsection, MT_GOD_SECTION, MT_GOD_SECTION2, MT_GOD_SECTION3, MT_GOD_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esGodSpecial[type].g_iGodAbility, value, -1, 1); @@ -684,7 +692,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esGodAbility[type].g_iHumanAmmo = iGetKeyValue(subsection, MT_GOD_SECTION, MT_GOD_SECTION2, MT_GOD_SECTION3, MT_GOD_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esGodAbility[type].g_iHumanAmmo, value, -1, 99999); g_esGodAbility[type].g_iHumanCooldown = iGetKeyValue(subsection, MT_GOD_SECTION, MT_GOD_SECTION2, MT_GOD_SECTION3, MT_GOD_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esGodAbility[type].g_iHumanCooldown, value, -1, 99999); g_esGodAbility[type].g_iHumanDuration = iGetKeyValue(subsection, MT_GOD_SECTION, MT_GOD_SECTION2, MT_GOD_SECTION3, MT_GOD_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esGodAbility[type].g_iHumanDuration, value, -1, 99999); - g_esGodAbility[type].g_iHumanMode = iGetKeyValue(subsection, MT_GOD_SECTION, MT_GOD_SECTION2, MT_GOD_SECTION3, MT_GOD_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esGodAbility[type].g_iHumanMode, value, -1, 1); + g_esGodAbility[type].g_iHumanMode = iGetKeyValue(subsection, MT_GOD_SECTION, MT_GOD_SECTION2, MT_GOD_SECTION3, MT_GOD_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esGodAbility[type].g_iHumanMode, value, -1, 2); g_esGodAbility[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_GOD_SECTION, MT_GOD_SECTION2, MT_GOD_SECTION3, MT_GOD_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esGodAbility[type].g_flOpenAreasOnly, value, -1.0, 99999.0); g_esGodAbility[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_GOD_SECTION, MT_GOD_SECTION2, MT_GOD_SECTION3, MT_GOD_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esGodAbility[type].g_iRequiresHumans, value, -1, 32); g_esGodAbility[type].g_iGodAbility = iGetKeyValue(subsection, MT_GOD_SECTION, MT_GOD_SECTION2, MT_GOD_SECTION3, MT_GOD_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esGodAbility[type].g_iGodAbility, value, -1, 1); @@ -866,10 +874,10 @@ public void MT_OnButtonPressed(int tank, int button) if ((button & MT_MAIN_KEY) && g_esGodCache[tank].g_iGodAbility == 1 && g_esGodCache[tank].g_iHumanAbility == 1) { - int iTime = GetTime(); + int iHumanMode = g_esGodCache[tank].g_iHumanMode, iTime = GetTime(); bool bRecharging = g_esGodPlayer[tank].g_iCooldown != -1 && g_esGodPlayer[tank].g_iCooldown >= iTime; - switch (g_esGodCache[tank].g_iHumanMode) + switch (iHumanMode) { case 0: { @@ -886,9 +894,9 @@ public void MT_OnButtonPressed(int tank, int button) MT_PrintToChat(tank, "%s %t", MT_TAG3, "GodHuman4", (g_esGodPlayer[tank].g_iCooldown - iTime)); } } - case 1: + case 1, 2: { - if (g_esGodPlayer[tank].g_iAmmoCount < g_esGodCache[tank].g_iHumanAmmo && g_esGodCache[tank].g_iHumanAmmo > 0) + if ((iHumanMode == 2 && g_esGodPlayer[tank].g_bActivated) || (g_esGodPlayer[tank].g_iAmmoCount < g_esGodCache[tank].g_iHumanAmmo && g_esGodCache[tank].g_iHumanAmmo > 0)) { if (!g_esGodPlayer[tank].g_bActivated && !bRecharging) { @@ -899,7 +907,15 @@ public void MT_OnButtonPressed(int tank, int button) } else if (g_esGodPlayer[tank].g_bActivated) { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "GodHuman3"); + switch (iHumanMode) + { + case 1: MT_PrintToChat(tank, "%s %t", MT_TAG3, "GodHuman3"); + case 2: + { + vGodReset2(tank); + vGodReset3(tank); + } + } } else if (bRecharging) { @@ -1051,16 +1067,18 @@ void vGodReset3(int tank) } } -void tTimerGodCombo(Handle timer, DataPack pack) +Action tTimerGodCombo(Handle timer, DataPack pack) { pack.Reset(); int iTank = GetClientOfUserId(pack.ReadCell()); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esGodAbility[g_esGodPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esGodPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esGodPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esGodCache[iTank].g_iGodAbility == 0 || g_esGodPlayer[iTank].g_bActivated) { - return; + return Plugin_Stop; } int iPos = pack.ReadCell(); vGod(iTank, iPos); + + return Plugin_Continue; } \ No newline at end of file diff --git a/addons/sourcemod/scripting/mutant_tanks/abilities/mt_gravity.sp b/addons/sourcemod/scripting/mutant_tanks/abilities/mt_gravity.sp index a9aff78e1a..0e73f0fbb1 100644 --- a/addons/sourcemod/scripting/mutant_tanks/abilities/mt_gravity.sp +++ b/addons/sourcemod/scripting/mutant_tanks/abilities/mt_gravity.sp @@ -1,6 +1,6 @@ /** - * Mutant Tanks: a L4D/L4D2 SourceMod Plugin - * Copyright (C) 2024 Alfred "Psyk0tik" Llagas + * Mutant Tanks: A L4D/L4D2 SourceMod Plugin + * Copyright (C) 2017-2025 Alfred "Psyk0tik" Llagas * * 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. * @@ -405,7 +405,15 @@ int iGravityMenuHandler(Menu menu, MenuAction action, int param1, int param2) MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtons"); MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtons2"); } - case 3: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esGravityCache[param1].g_iHumanMode == 0) ? "AbilityButtonMode1" : "AbilityButtonMode2"); + case 3: + { + switch (g_esGravityCache[param1].g_iHumanMode) + { + case 0: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtonMode1"); + case 1: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtonMode2"); + case 2: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtonMode3"); + } + } case 4: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityCooldown", ((g_esGravityCache[param1].g_iHumanAbility == 1) ? g_esGravityCache[param1].g_iHumanCooldown : g_esGravityCache[param1].g_iGravityCooldown)); case 5: MT_PrintToChat(param1, "%s %t", MT_TAG3, "GravityDetails"); case 6: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityDuration2", ((g_esGravityCache[param1].g_iHumanAbility == 1) ? g_esGravityCache[param1].g_iHumanDuration : g_esGravityCache[param1].g_iGravityDuration)); @@ -493,7 +501,7 @@ void vGravityPlayerRunCmd(int client) public Action OnPlayerRunCmd(int client, int &buttons, int &impulse, float vel[3], float angles[3], int &weapon) #endif { - if (!MT_IsTankSupported(client) || !g_esGravityPlayer[client].g_bActivated || (bIsInfected(client, MT_CHECK_FAKECLIENT) && g_esGravityCache[client].g_iHumanMode == 1) || g_esGravityPlayer[client].g_iDuration == -1) + if (!MT_IsTankSupported(client) || !g_esGravityPlayer[client].g_bActivated || (bIsInfected(client, MT_CHECK_FAKECLIENT) && g_esGravityCache[client].g_iHumanMode > 0) || g_esGravityPlayer[client].g_iDuration == -1) { #if defined MT_ABILITIES_MAIN return; @@ -734,10 +742,10 @@ public void MT_OnConfigsLoad(int mode) g_esGravityAbility[iIndex].g_flGravityRange = 150.0; g_esGravityAbility[iIndex].g_flGravityRangeChance = 15.0; g_esGravityAbility[iIndex].g_iGravityRangeCooldown = 0; - g_esGravityAbility[iIndex].g_iGravitySight = 0; g_esGravityAbility[iIndex].g_iGravityRockBreak = 0; g_esGravityAbility[iIndex].g_flGravityRockChance = 33.3; g_esGravityAbility[iIndex].g_iGravityRockCooldown = 0; + g_esGravityAbility[iIndex].g_iGravitySight = 0; g_esGravityAbility[iIndex].g_flGravityValue = 0.3; g_esGravitySpecial[iIndex].g_flCloseAreasOnly = -1.0; @@ -863,7 +871,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esGravityTeammate[admin].g_iHumanAmmo = iGetKeyValue(subsection, MT_GRAVITY_SECTION, MT_GRAVITY_SECTION2, MT_GRAVITY_SECTION3, MT_GRAVITY_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esGravityTeammate[admin].g_iHumanAmmo, value, -1, 99999); g_esGravityTeammate[admin].g_iHumanCooldown = iGetKeyValue(subsection, MT_GRAVITY_SECTION, MT_GRAVITY_SECTION2, MT_GRAVITY_SECTION3, MT_GRAVITY_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esGravityTeammate[admin].g_iHumanCooldown, value, -1, 99999); g_esGravityTeammate[admin].g_iHumanDuration = iGetKeyValue(subsection, MT_GRAVITY_SECTION, MT_GRAVITY_SECTION2, MT_GRAVITY_SECTION3, MT_GRAVITY_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esGravityTeammate[admin].g_iHumanDuration, value, -1, 99999); - g_esGravityTeammate[admin].g_iHumanMode = iGetKeyValue(subsection, MT_GRAVITY_SECTION, MT_GRAVITY_SECTION2, MT_GRAVITY_SECTION3, MT_GRAVITY_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esGravityTeammate[admin].g_iHumanMode, value, -1, 1); + g_esGravityTeammate[admin].g_iHumanMode = iGetKeyValue(subsection, MT_GRAVITY_SECTION, MT_GRAVITY_SECTION2, MT_GRAVITY_SECTION3, MT_GRAVITY_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esGravityTeammate[admin].g_iHumanMode, value, -1, 2); g_esGravityTeammate[admin].g_iHumanRangeCooldown = iGetKeyValue(subsection, MT_GRAVITY_SECTION, MT_GRAVITY_SECTION2, MT_GRAVITY_SECTION3, MT_GRAVITY_SECTION4, key, "HumanRangeCooldown", "Human Range Cooldown", "Human_Range_Cooldown", "hrangecooldown", g_esGravityTeammate[admin].g_iHumanRangeCooldown, value, -1, 99999); g_esGravityTeammate[admin].g_iHumanRockCooldown = iGetKeyValue(subsection, MT_GRAVITY_SECTION, MT_GRAVITY_SECTION2, MT_GRAVITY_SECTION3, MT_GRAVITY_SECTION4, key, "HumanRockCooldown", "Human Rock Cooldown", "Human_Rock_Cooldown", "hrockcooldown", g_esGravityTeammate[admin].g_iHumanRockCooldown, value, -1, 99999); g_esGravityTeammate[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_GRAVITY_SECTION, MT_GRAVITY_SECTION2, MT_GRAVITY_SECTION3, MT_GRAVITY_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esGravityTeammate[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); @@ -897,7 +905,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esGravityPlayer[admin].g_iHumanAmmo = iGetKeyValue(subsection, MT_GRAVITY_SECTION, MT_GRAVITY_SECTION2, MT_GRAVITY_SECTION3, MT_GRAVITY_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esGravityPlayer[admin].g_iHumanAmmo, value, -1, 99999); g_esGravityPlayer[admin].g_iHumanCooldown = iGetKeyValue(subsection, MT_GRAVITY_SECTION, MT_GRAVITY_SECTION2, MT_GRAVITY_SECTION3, MT_GRAVITY_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esGravityPlayer[admin].g_iHumanCooldown, value, -1, 99999); g_esGravityPlayer[admin].g_iHumanDuration = iGetKeyValue(subsection, MT_GRAVITY_SECTION, MT_GRAVITY_SECTION2, MT_GRAVITY_SECTION3, MT_GRAVITY_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esGravityPlayer[admin].g_iHumanDuration, value, -1, 99999); - g_esGravityPlayer[admin].g_iHumanMode = iGetKeyValue(subsection, MT_GRAVITY_SECTION, MT_GRAVITY_SECTION2, MT_GRAVITY_SECTION3, MT_GRAVITY_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esGravityPlayer[admin].g_iHumanMode, value, -1, 1); + g_esGravityPlayer[admin].g_iHumanMode = iGetKeyValue(subsection, MT_GRAVITY_SECTION, MT_GRAVITY_SECTION2, MT_GRAVITY_SECTION3, MT_GRAVITY_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esGravityPlayer[admin].g_iHumanMode, value, -1, 2); g_esGravityPlayer[admin].g_iHumanRangeCooldown = iGetKeyValue(subsection, MT_GRAVITY_SECTION, MT_GRAVITY_SECTION2, MT_GRAVITY_SECTION3, MT_GRAVITY_SECTION4, key, "HumanRangeCooldown", "Human Range Cooldown", "Human_Range_Cooldown", "hrangecooldown", g_esGravityPlayer[admin].g_iHumanRangeCooldown, value, -1, 99999); g_esGravityPlayer[admin].g_iHumanRockCooldown = iGetKeyValue(subsection, MT_GRAVITY_SECTION, MT_GRAVITY_SECTION2, MT_GRAVITY_SECTION3, MT_GRAVITY_SECTION4, key, "HumanRockCooldown", "Human Rock Cooldown", "Human_Rock_Cooldown", "hrockcooldown", g_esGravityPlayer[admin].g_iHumanRockCooldown, value, -1, 99999); g_esGravityPlayer[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_GRAVITY_SECTION, MT_GRAVITY_SECTION2, MT_GRAVITY_SECTION3, MT_GRAVITY_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esGravityPlayer[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); @@ -937,7 +945,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esGravitySpecial[type].g_iHumanAmmo = iGetKeyValue(subsection, MT_GRAVITY_SECTION, MT_GRAVITY_SECTION2, MT_GRAVITY_SECTION3, MT_GRAVITY_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esGravitySpecial[type].g_iHumanAmmo, value, -1, 99999); g_esGravitySpecial[type].g_iHumanCooldown = iGetKeyValue(subsection, MT_GRAVITY_SECTION, MT_GRAVITY_SECTION2, MT_GRAVITY_SECTION3, MT_GRAVITY_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esGravitySpecial[type].g_iHumanCooldown, value, -1, 99999); g_esGravitySpecial[type].g_iHumanDuration = iGetKeyValue(subsection, MT_GRAVITY_SECTION, MT_GRAVITY_SECTION2, MT_GRAVITY_SECTION3, MT_GRAVITY_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esGravitySpecial[type].g_iHumanDuration, value, -1, 99999); - g_esGravitySpecial[type].g_iHumanMode = iGetKeyValue(subsection, MT_GRAVITY_SECTION, MT_GRAVITY_SECTION2, MT_GRAVITY_SECTION3, MT_GRAVITY_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esGravitySpecial[type].g_iHumanMode, value, -1, 1); + g_esGravitySpecial[type].g_iHumanMode = iGetKeyValue(subsection, MT_GRAVITY_SECTION, MT_GRAVITY_SECTION2, MT_GRAVITY_SECTION3, MT_GRAVITY_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esGravitySpecial[type].g_iHumanMode, value, -1, 2); g_esGravitySpecial[type].g_iHumanRangeCooldown = iGetKeyValue(subsection, MT_GRAVITY_SECTION, MT_GRAVITY_SECTION2, MT_GRAVITY_SECTION3, MT_GRAVITY_SECTION4, key, "HumanRangeCooldown", "Human Range Cooldown", "Human_Range_Cooldown", "hrangecooldown", g_esGravitySpecial[type].g_iHumanRangeCooldown, value, -1, 99999); g_esGravitySpecial[type].g_iHumanRockCooldown = iGetKeyValue(subsection, MT_GRAVITY_SECTION, MT_GRAVITY_SECTION2, MT_GRAVITY_SECTION3, MT_GRAVITY_SECTION4, key, "HumanRockCooldown", "Human Rock Cooldown", "Human_Rock_Cooldown", "hrockcooldown", g_esGravitySpecial[type].g_iHumanRockCooldown, value, -1, 99999); g_esGravitySpecial[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_GRAVITY_SECTION, MT_GRAVITY_SECTION2, MT_GRAVITY_SECTION3, MT_GRAVITY_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esGravitySpecial[type].g_flOpenAreasOnly, value, -1.0, 99999.0); @@ -971,7 +979,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esGravityAbility[type].g_iHumanAmmo = iGetKeyValue(subsection, MT_GRAVITY_SECTION, MT_GRAVITY_SECTION2, MT_GRAVITY_SECTION3, MT_GRAVITY_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esGravityAbility[type].g_iHumanAmmo, value, -1, 99999); g_esGravityAbility[type].g_iHumanCooldown = iGetKeyValue(subsection, MT_GRAVITY_SECTION, MT_GRAVITY_SECTION2, MT_GRAVITY_SECTION3, MT_GRAVITY_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esGravityAbility[type].g_iHumanCooldown, value, -1, 99999); g_esGravityAbility[type].g_iHumanDuration = iGetKeyValue(subsection, MT_GRAVITY_SECTION, MT_GRAVITY_SECTION2, MT_GRAVITY_SECTION3, MT_GRAVITY_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esGravityAbility[type].g_iHumanDuration, value, -1, 99999); - g_esGravityAbility[type].g_iHumanMode = iGetKeyValue(subsection, MT_GRAVITY_SECTION, MT_GRAVITY_SECTION2, MT_GRAVITY_SECTION3, MT_GRAVITY_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esGravityAbility[type].g_iHumanMode, value, -1, 1); + g_esGravityAbility[type].g_iHumanMode = iGetKeyValue(subsection, MT_GRAVITY_SECTION, MT_GRAVITY_SECTION2, MT_GRAVITY_SECTION3, MT_GRAVITY_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esGravityAbility[type].g_iHumanMode, value, -1, 2); g_esGravityAbility[type].g_iHumanRangeCooldown = iGetKeyValue(subsection, MT_GRAVITY_SECTION, MT_GRAVITY_SECTION2, MT_GRAVITY_SECTION3, MT_GRAVITY_SECTION4, key, "HumanRangeCooldown", "Human Range Cooldown", "Human_Range_Cooldown", "hrangecooldown", g_esGravityAbility[type].g_iHumanRangeCooldown, value, -1, 99999); g_esGravityAbility[type].g_iHumanRockCooldown = iGetKeyValue(subsection, MT_GRAVITY_SECTION, MT_GRAVITY_SECTION2, MT_GRAVITY_SECTION3, MT_GRAVITY_SECTION4, key, "HumanRockCooldown", "Human Rock Cooldown", "Human_Rock_Cooldown", "hrockcooldown", g_esGravityAbility[type].g_iHumanRockCooldown, value, -1, 99999); g_esGravityAbility[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_GRAVITY_SECTION, MT_GRAVITY_SECTION2, MT_GRAVITY_SECTION3, MT_GRAVITY_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esGravityAbility[type].g_flOpenAreasOnly, value, -1.0, 99999.0); @@ -1224,8 +1232,9 @@ public void MT_OnButtonPressed(int tank, int button) if ((button & MT_MAIN_KEY) && (g_esGravityCache[tank].g_iGravityAbility == 2 || g_esGravityCache[tank].g_iGravityAbility == 3) && g_esGravityCache[tank].g_iHumanAbility == 1) { bool bRecharging = g_esGravityPlayer[tank].g_iCooldown != -1 && g_esGravityPlayer[tank].g_iCooldown >= iTime; + int iHumanMode = g_esGravityCache[tank].g_iHumanMode; - switch (g_esGravityCache[tank].g_iHumanMode) + switch (iHumanMode) { case 0: { @@ -1242,9 +1251,9 @@ public void MT_OnButtonPressed(int tank, int button) MT_PrintToChat(tank, "%s %t", MT_TAG3, "GravityHuman5", (g_esGravityPlayer[tank].g_iCooldown - iTime)); } } - case 1: + case 1, 2: { - if (g_esGravityPlayer[tank].g_iAmmoCount < g_esGravityCache[tank].g_iHumanAmmo && g_esGravityCache[tank].g_iHumanAmmo > 0) + if ((iHumanMode == 2 && g_esGravityPlayer[tank].g_bActivated) || (g_esGravityPlayer[tank].g_iAmmoCount < g_esGravityCache[tank].g_iHumanAmmo && g_esGravityCache[tank].g_iHumanAmmo > 0)) { if (!g_esGravityPlayer[tank].g_bActivated && !bRecharging) { @@ -1256,7 +1265,15 @@ public void MT_OnButtonPressed(int tank, int button) } else if (g_esGravityPlayer[tank].g_bActivated) { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "GravityHuman4"); + switch (iHumanMode) + { + case 1: MT_PrintToChat(tank, "%s %t", MT_TAG3, "GravityHuman4"); + case 2: + { + vGravityReset3(tank); + vGravityReset4(tank); + } + } } else if (bRecharging) { @@ -1730,49 +1747,53 @@ void vStopGravity(int survivor) SetEntityGravity(survivor, 1.0); } -void tTimerGravityCombo(Handle timer, DataPack pack) +Action tTimerGravityCombo(Handle timer, DataPack pack) { pack.Reset(); int iTank = GetClientOfUserId(pack.ReadCell()); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esGravityAbility[g_esGravityPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esGravityPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esGravityPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esGravityCache[iTank].g_iGravityAbility == 0 || g_esGravityCache[iTank].g_iGravityAbility == 2) { - return; + return Plugin_Stop; } float flRandom = pack.ReadFloat(); int iPos = pack.ReadCell(); vGravityAbility(iTank, true, flRandom, iPos); + + return Plugin_Continue; } -void tTimerGravityCombo2(Handle timer, DataPack pack) +Action tTimerGravityCombo2(Handle timer, DataPack pack) { pack.Reset(); int iTank = GetClientOfUserId(pack.ReadCell()); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esGravityAbility[g_esGravityPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esGravityPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esGravityPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esGravityCache[iTank].g_iGravityAbility == 0 || g_esGravityCache[iTank].g_iGravityAbility == 1) { - return; + return Plugin_Stop; } int iPos = pack.ReadCell(); vGravityAbility(iTank, false, .pos = iPos); + + return Plugin_Continue; } -void tTimerGravityCombo3(Handle timer, DataPack pack) +Action tTimerGravityCombo3(Handle timer, DataPack pack) { pack.Reset(); int iSurvivor = GetClientOfUserId(pack.ReadCell()); if (!bIsSurvivor(iSurvivor) || g_esGravityPlayer[iSurvivor].g_bAffected) { - return; + return Plugin_Stop; } int iTank = GetClientOfUserId(pack.ReadCell()); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esGravityAbility[g_esGravityPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esGravityPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esGravityPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esGravityCache[iTank].g_iGravityHit == 0) { - return; + return Plugin_Stop; } float flRandom = pack.ReadFloat(), flChance = pack.ReadFloat(); @@ -1787,6 +1808,8 @@ void tTimerGravityCombo3(Handle timer, DataPack pack) { vGravityHit(iSurvivor, iTank, flRandom, flChance, g_esGravityCache[iTank].g_iGravityHit, MT_MESSAGE_MELEE, MT_ATTACK_MELEE, iPos); } + + return Plugin_Continue; } Action tTimerStopGravity(Handle timer, DataPack pack) diff --git a/addons/sourcemod/scripting/mutant_tanks/abilities/mt_gunner.sp b/addons/sourcemod/scripting/mutant_tanks/abilities/mt_gunner.sp index f5426352b8..9b67b393c3 100644 --- a/addons/sourcemod/scripting/mutant_tanks/abilities/mt_gunner.sp +++ b/addons/sourcemod/scripting/mutant_tanks/abilities/mt_gunner.sp @@ -1,6 +1,6 @@ /** - * Mutant Tanks: a L4D/L4D2 SourceMod Plugin - * Copyright (C) 2024 Alfred "Psyk0tik" Llagas + * Mutant Tanks: A L4D/L4D2 SourceMod Plugin + * Copyright (C) 2017-2025 Alfred "Psyk0tik" Llagas * * 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. * @@ -29,6 +29,8 @@ public Plugin myinfo = bool g_bDedicated, g_bSecondGame; +int g_iGraphicsLevel; + public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max) { switch (GetEngineVersion()) @@ -464,7 +466,15 @@ int iGunnerMenuHandler(Menu menu, MenuAction action, int param1, int param2) case 0: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esGunnerCache[param1].g_iGunnerAbility == 0) ? "AbilityStatus1" : "AbilityStatus2"); case 1: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityAmmo", (g_esGunnerCache[param1].g_iHumanAmmo - g_esGunnerPlayer[param1].g_iAmmoCount), g_esGunnerCache[param1].g_iHumanAmmo); case 2: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtons"); - case 3: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esGunnerCache[param1].g_iHumanMode == 0) ? "AbilityButtonMode1" : "AbilityButtonMode2"); + case 3: + { + switch (g_esGunnerCache[param1].g_iHumanMode) + { + case 0: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtonMode1"); + case 1: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtonMode2"); + case 2: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtonMode3"); + } + } case 4: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityCooldown", ((g_esGunnerCache[param1].g_iHumanAbility == 1) ? g_esGunnerCache[param1].g_iHumanCooldown : g_esGunnerCache[param1].g_iGunnerCooldown)); case 5: MT_PrintToChat(param1, "%s %t", MT_TAG3, "GunnerDetails"); case 6: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityDuration", g_esGunnerCache[param1].g_flGunnerDuration); @@ -777,7 +787,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esGunnerTeammate[admin].g_iHumanAbility = iGetKeyValue(subsection, MT_GUNNER_SECTION, MT_GUNNER_SECTION2, MT_GUNNER_SECTION3, MT_GUNNER_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esGunnerTeammate[admin].g_iHumanAbility, value, -1, 2); g_esGunnerTeammate[admin].g_iHumanAmmo = iGetKeyValue(subsection, MT_GUNNER_SECTION, MT_GUNNER_SECTION2, MT_GUNNER_SECTION3, MT_GUNNER_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esGunnerTeammate[admin].g_iHumanAmmo, value, -1, 99999); g_esGunnerTeammate[admin].g_iHumanCooldown = iGetKeyValue(subsection, MT_GUNNER_SECTION, MT_GUNNER_SECTION2, MT_GUNNER_SECTION3, MT_GUNNER_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esGunnerTeammate[admin].g_iHumanCooldown, value, -1, 99999); - g_esGunnerTeammate[admin].g_iHumanMode = iGetKeyValue(subsection, MT_GUNNER_SECTION, MT_GUNNER_SECTION2, MT_GUNNER_SECTION3, MT_GUNNER_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esGunnerTeammate[admin].g_iHumanMode, value, -1, 1); + g_esGunnerTeammate[admin].g_iHumanMode = iGetKeyValue(subsection, MT_GUNNER_SECTION, MT_GUNNER_SECTION2, MT_GUNNER_SECTION3, MT_GUNNER_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esGunnerTeammate[admin].g_iHumanMode, value, -1, 2); g_esGunnerTeammate[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_GUNNER_SECTION, MT_GUNNER_SECTION2, MT_GUNNER_SECTION3, MT_GUNNER_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esGunnerTeammate[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); g_esGunnerTeammate[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_GUNNER_SECTION, MT_GUNNER_SECTION2, MT_GUNNER_SECTION3, MT_GUNNER_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esGunnerTeammate[admin].g_iRequiresHumans, value, -1, 32); g_esGunnerTeammate[admin].g_iGunnerAbility = iGetKeyValue(subsection, MT_GUNNER_SECTION, MT_GUNNER_SECTION2, MT_GUNNER_SECTION3, MT_GUNNER_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esGunnerTeammate[admin].g_iGunnerAbility, value, -1, 1); @@ -804,7 +814,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esGunnerPlayer[admin].g_iHumanAbility = iGetKeyValue(subsection, MT_GUNNER_SECTION, MT_GUNNER_SECTION2, MT_GUNNER_SECTION3, MT_GUNNER_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esGunnerPlayer[admin].g_iHumanAbility, value, -1, 2); g_esGunnerPlayer[admin].g_iHumanAmmo = iGetKeyValue(subsection, MT_GUNNER_SECTION, MT_GUNNER_SECTION2, MT_GUNNER_SECTION3, MT_GUNNER_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esGunnerPlayer[admin].g_iHumanAmmo, value, -1, 99999); g_esGunnerPlayer[admin].g_iHumanCooldown = iGetKeyValue(subsection, MT_GUNNER_SECTION, MT_GUNNER_SECTION2, MT_GUNNER_SECTION3, MT_GUNNER_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esGunnerPlayer[admin].g_iHumanCooldown, value, -1, 99999); - g_esGunnerPlayer[admin].g_iHumanMode = iGetKeyValue(subsection, MT_GUNNER_SECTION, MT_GUNNER_SECTION2, MT_GUNNER_SECTION3, MT_GUNNER_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esGunnerPlayer[admin].g_iHumanMode, value, -1, 1); + g_esGunnerPlayer[admin].g_iHumanMode = iGetKeyValue(subsection, MT_GUNNER_SECTION, MT_GUNNER_SECTION2, MT_GUNNER_SECTION3, MT_GUNNER_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esGunnerPlayer[admin].g_iHumanMode, value, -1, 2); g_esGunnerPlayer[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_GUNNER_SECTION, MT_GUNNER_SECTION2, MT_GUNNER_SECTION3, MT_GUNNER_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esGunnerPlayer[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); g_esGunnerPlayer[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_GUNNER_SECTION, MT_GUNNER_SECTION2, MT_GUNNER_SECTION3, MT_GUNNER_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esGunnerPlayer[admin].g_iRequiresHumans, value, -1, 32); g_esGunnerPlayer[admin].g_iGunnerAbility = iGetKeyValue(subsection, MT_GUNNER_SECTION, MT_GUNNER_SECTION2, MT_GUNNER_SECTION3, MT_GUNNER_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esGunnerPlayer[admin].g_iGunnerAbility, value, -1, 1); @@ -837,7 +847,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esGunnerSpecial[type].g_iHumanAbility = iGetKeyValue(subsection, MT_GUNNER_SECTION, MT_GUNNER_SECTION2, MT_GUNNER_SECTION3, MT_GUNNER_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esGunnerSpecial[type].g_iHumanAbility, value, -1, 2); g_esGunnerSpecial[type].g_iHumanAmmo = iGetKeyValue(subsection, MT_GUNNER_SECTION, MT_GUNNER_SECTION2, MT_GUNNER_SECTION3, MT_GUNNER_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esGunnerSpecial[type].g_iHumanAmmo, value, -1, 99999); g_esGunnerSpecial[type].g_iHumanCooldown = iGetKeyValue(subsection, MT_GUNNER_SECTION, MT_GUNNER_SECTION2, MT_GUNNER_SECTION3, MT_GUNNER_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esGunnerSpecial[type].g_iHumanCooldown, value, -1, 99999); - g_esGunnerSpecial[type].g_iHumanMode = iGetKeyValue(subsection, MT_GUNNER_SECTION, MT_GUNNER_SECTION2, MT_GUNNER_SECTION3, MT_GUNNER_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esGunnerSpecial[type].g_iHumanMode, value, -1, 1); + g_esGunnerSpecial[type].g_iHumanMode = iGetKeyValue(subsection, MT_GUNNER_SECTION, MT_GUNNER_SECTION2, MT_GUNNER_SECTION3, MT_GUNNER_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esGunnerSpecial[type].g_iHumanMode, value, -1, 2); g_esGunnerSpecial[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_GUNNER_SECTION, MT_GUNNER_SECTION2, MT_GUNNER_SECTION3, MT_GUNNER_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esGunnerSpecial[type].g_flOpenAreasOnly, value, -1.0, 99999.0); g_esGunnerSpecial[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_GUNNER_SECTION, MT_GUNNER_SECTION2, MT_GUNNER_SECTION3, MT_GUNNER_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esGunnerSpecial[type].g_iRequiresHumans, value, -1, 32); g_esGunnerSpecial[type].g_iGunnerAbility = iGetKeyValue(subsection, MT_GUNNER_SECTION, MT_GUNNER_SECTION2, MT_GUNNER_SECTION3, MT_GUNNER_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esGunnerSpecial[type].g_iGunnerAbility, value, -1, 1); @@ -864,7 +874,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esGunnerAbility[type].g_iHumanAbility = iGetKeyValue(subsection, MT_GUNNER_SECTION, MT_GUNNER_SECTION2, MT_GUNNER_SECTION3, MT_GUNNER_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esGunnerAbility[type].g_iHumanAbility, value, -1, 2); g_esGunnerAbility[type].g_iHumanAmmo = iGetKeyValue(subsection, MT_GUNNER_SECTION, MT_GUNNER_SECTION2, MT_GUNNER_SECTION3, MT_GUNNER_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esGunnerAbility[type].g_iHumanAmmo, value, -1, 99999); g_esGunnerAbility[type].g_iHumanCooldown = iGetKeyValue(subsection, MT_GUNNER_SECTION, MT_GUNNER_SECTION2, MT_GUNNER_SECTION3, MT_GUNNER_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esGunnerAbility[type].g_iHumanCooldown, value, -1, 99999); - g_esGunnerAbility[type].g_iHumanMode = iGetKeyValue(subsection, MT_GUNNER_SECTION, MT_GUNNER_SECTION2, MT_GUNNER_SECTION3, MT_GUNNER_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esGunnerAbility[type].g_iHumanMode, value, -1, 1); + g_esGunnerAbility[type].g_iHumanMode = iGetKeyValue(subsection, MT_GUNNER_SECTION, MT_GUNNER_SECTION2, MT_GUNNER_SECTION3, MT_GUNNER_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esGunnerAbility[type].g_iHumanMode, value, -1, 2); g_esGunnerAbility[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_GUNNER_SECTION, MT_GUNNER_SECTION2, MT_GUNNER_SECTION3, MT_GUNNER_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esGunnerAbility[type].g_flOpenAreasOnly, value, -1.0, 99999.0); g_esGunnerAbility[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_GUNNER_SECTION, MT_GUNNER_SECTION2, MT_GUNNER_SECTION3, MT_GUNNER_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esGunnerAbility[type].g_iRequiresHumans, value, -1, 32); g_esGunnerAbility[type].g_iGunnerAbility = iGetKeyValue(subsection, MT_GUNNER_SECTION, MT_GUNNER_SECTION2, MT_GUNNER_SECTION3, MT_GUNNER_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esGunnerAbility[type].g_iGunnerAbility, value, -1, 1); @@ -899,7 +909,9 @@ public void MT_OnSettingsCached(int tank, bool apply, int type) g_esGunnerPlayer[tank].g_iTankTypeRecorded = apply ? MT_GetRecordedTankType(tank, type) : 0; g_esGunnerPlayer[tank].g_iTankType = apply ? type : 0; int iType = g_esGunnerPlayer[tank].g_iTankTypeRecorded; - +#if !defined MT_ABILITIES_MAIN + g_iGraphicsLevel = MT_GetGraphicsLevel(); +#endif if (bIsSpecialInfected(tank, MT_CHECK_INDEX|MT_CHECK_INGAME)) { g_esGunnerCache[tank].g_flCloseAreasOnly = flGetSubSettingValue(apply, bHuman, g_esGunnerTeammate[tank].g_flCloseAreasOnly, g_esGunnerPlayer[tank].g_flCloseAreasOnly, g_esGunnerSpecial[iType].g_flCloseAreasOnly, g_esGunnerAbility[iType].g_flCloseAreasOnly, 1); @@ -1080,10 +1092,10 @@ public void MT_OnButtonPressed(int tank, int button) if ((button & MT_MAIN_KEY) && g_esGunnerCache[tank].g_iGunnerAbility == 1 && g_esGunnerCache[tank].g_iHumanAbility == 1) { - int iTime = GetTime(); + int iHumanMode = g_esGunnerCache[tank].g_iHumanMode, iTime = GetTime(); bool bRecharging = g_esGunnerPlayer[tank].g_iCooldown != -1 && g_esGunnerPlayer[tank].g_iCooldown >= iTime; - switch (g_esGunnerCache[tank].g_iHumanMode) + switch (iHumanMode) { case 0: { @@ -1100,9 +1112,9 @@ public void MT_OnButtonPressed(int tank, int button) MT_PrintToChat(tank, "%s %t", MT_TAG3, "GunnerHuman4", (g_esGunnerPlayer[tank].g_iCooldown - iTime)); } } - case 1: + case 1, 2: { - if (g_esGunnerPlayer[tank].g_iAmmoCount < g_esGunnerCache[tank].g_iHumanAmmo && g_esGunnerCache[tank].g_iHumanAmmo > 0) + if ((iHumanMode == 2 && g_esGunnerPlayer[tank].g_bActivated) || (g_esGunnerPlayer[tank].g_iAmmoCount < g_esGunnerCache[tank].g_iHumanAmmo && g_esGunnerCache[tank].g_iHumanAmmo > 0)) { if (!g_esGunnerPlayer[tank].g_bActivated && !bRecharging) { @@ -1114,7 +1126,15 @@ public void MT_OnButtonPressed(int tank, int button) } else if (g_esGunnerPlayer[tank].g_bActivated) { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "GunnerHuman3"); + switch (iHumanMode) + { + case 1: MT_PrintToChat(tank, "%s %t", MT_TAG3, "GunnerHuman3"); + case 2: + { + vGunnerReset2(tank); + vGunnerReset3(tank); + } + } } else if (bRecharging) { @@ -1183,7 +1203,7 @@ void vGunner(int tank) void vGunner2(int tank) { - int iType = g_esGunnerCache[tank].g_iGunnerGunType, iDifference = g_bSecondGame ? 1 : 13; + int iType = g_esGunnerCache[tank].g_iGunnerGunType, iDifference = (g_bSecondGame ? 1 : 13); g_esGunnerPlayer[tank].g_iGunType = (iType > 0) ? (iType - 1) : MT_GetRandomInt(0, (sizeof g_sWeaponModels - iDifference)); float flAngles[3], flOrigin[3], flPos[3]; @@ -1306,7 +1326,7 @@ void vGunner3(int tank, float time, float duration) if (iTargetType == 0 || (iTargetType & MT_GUNNER_COMMON)) { - g_esGunnerPlayer[tank].g_iCommonEnemy = iGetNearestCommonInfected(tank, flPos, flRange); + g_esGunnerPlayer[tank].g_iCommonEnemy = iGetNearestCommonInfected(flPos, flRange); } } @@ -1527,8 +1547,11 @@ void vGunner4(int tank, int target, int drone, float pos[3], float origin[3]) ScaleVector(flVector2, 36.0); SubtractVectors(origin, flVector2, g_esGunnerPlayer[tank].g_flEnemyOrigin); - TE_SetupBeamPoints(g_esGunnerPlayer[tank].g_flEnemyOrigin, flPos, g_iGunnerSprite, 0, 0, 0, 0.06, 0.01, (g_bSecondGame ? 0.08 : 0.3), 1, 0.0, {200, 200, 200, 230}, 0); - TE_SendToAll(); + if (g_iGraphicsLevel > 1) + { + TE_SetupBeamPoints(g_esGunnerPlayer[tank].g_flEnemyOrigin, flPos, g_iGunnerSprite, 0, 0, 0, 0.06, 0.01, (g_bSecondGame ? 0.08 : 0.3), 1, 0.0, {200, 200, 200, 230}, 0); + TE_SendToAll(); + } EmitSoundToAll(g_sWeaponSounds[g_esGunnerPlayer[tank].g_iGunType], SOUND_FROM_WORLD, SNDCHAN_WEAPON, SNDLEVEL_TRAFFIC, SND_NOFLAGS, SNDVOL_NORMAL, SNDPITCH_NORMAL, .origin = origin, .updatePos = false); } @@ -1561,7 +1584,7 @@ void vGunnerAbility(int tank) void OnGunnerPreThinkPost(int tank) { - if (!g_bSecondGame || !MT_IsTankSupported(tank) || !MT_IsCustomTankSupported(tank) || !g_esGunnerPlayer[tank].g_bRainbowColor) + if (!g_bSecondGame || !MT_IsTankSupported(tank) || !MT_IsCustomTankSupported(tank) || !g_esGunnerPlayer[tank].g_bRainbowColor || g_iGraphicsLevel <= 2) { g_esGunnerPlayer[tank].g_bRainbowColor = false; @@ -1677,7 +1700,7 @@ void vGunnerReset3(int tank) void vSetGunnerGlow(int drone, int color, bool flashing, int min, int max, int type) { - if (!g_bSecondGame) + if (!g_bSecondGame || g_iGraphicsLevel <= 1) { return; } @@ -1689,13 +1712,15 @@ void vSetGunnerGlow(int drone, int color, bool flashing, int min, int max, int t SetEntProp(drone, Prop_Send, "m_iGlowType", type); } -void tTimerGunnerCombo(Handle timer, int userid) +Action tTimerGunnerCombo(Handle timer, int userid) { int iTank = GetClientOfUserId(userid); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esGunnerAbility[g_esGunnerPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esGunnerPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esGunnerPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esGunnerCache[iTank].g_iGunnerAbility == 0 || g_esGunnerPlayer[iTank].g_bActivated) { - return; + return Plugin_Stop; } vGunner(iTank); + + return Plugin_Continue; } \ No newline at end of file diff --git a/addons/sourcemod/scripting/mutant_tanks/abilities/mt_heal.sp b/addons/sourcemod/scripting/mutant_tanks/abilities/mt_heal.sp index b5e706c0f9..7b02b3091a 100644 --- a/addons/sourcemod/scripting/mutant_tanks/abilities/mt_heal.sp +++ b/addons/sourcemod/scripting/mutant_tanks/abilities/mt_heal.sp @@ -1,6 +1,6 @@ /** - * Mutant Tanks: a L4D/L4D2 SourceMod Plugin - * Copyright (C) 2024 Alfred "Psyk0tik" Llagas + * Mutant Tanks: A L4D/L4D2 SourceMod Plugin + * Copyright (C) 2017-2025 Alfred "Psyk0tik" Llagas * * 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. * @@ -415,7 +415,15 @@ int iHealMenuHandler(Menu menu, MenuAction action, int param1, int param2) MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtons"); MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtons2"); } - case 3: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esHealCache[param1].g_iHumanMode == 0) ? "AbilityButtonMode1" : "AbilityButtonMode2"); + case 3: + { + switch (g_esHealCache[param1].g_iHumanMode) + { + case 0: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtonMode1"); + case 1: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtonMode2"); + case 2: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtonMode3"); + } + } case 4: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityCooldown", ((g_esHealCache[param1].g_iHumanAbility == 1) ? g_esHealCache[param1].g_iHumanCooldown : g_esHealCache[param1].g_iHealCooldown)); case 5: MT_PrintToChat(param1, "%s %t", MT_TAG3, "HealDetails"); case 6: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityDuration2", ((g_esHealCache[param1].g_iHumanAbility == 1) ? g_esHealCache[param1].g_iHumanDuration : g_esHealCache[param1].g_iHealDuration)); @@ -825,7 +833,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esHealTeammate[admin].g_iHumanAmmo = iGetKeyValue(subsection, MT_HEAL_SECTION, MT_HEAL_SECTION2, MT_HEAL_SECTION3, MT_HEAL_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esHealTeammate[admin].g_iHumanAmmo, value, -1, 99999); g_esHealTeammate[admin].g_iHumanCooldown = iGetKeyValue(subsection, MT_HEAL_SECTION, MT_HEAL_SECTION2, MT_HEAL_SECTION3, MT_HEAL_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esHealTeammate[admin].g_iHumanCooldown, value, -1, 99999); g_esHealTeammate[admin].g_iHumanDuration = iGetKeyValue(subsection, MT_HEAL_SECTION, MT_HEAL_SECTION2, MT_HEAL_SECTION3, MT_HEAL_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esHealTeammate[admin].g_iHumanDuration, value, -1, 99999); - g_esHealTeammate[admin].g_iHumanMode = iGetKeyValue(subsection, MT_HEAL_SECTION, MT_HEAL_SECTION2, MT_HEAL_SECTION3, MT_HEAL_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esHealTeammate[admin].g_iHumanMode, value, -1, 1); + g_esHealTeammate[admin].g_iHumanMode = iGetKeyValue(subsection, MT_HEAL_SECTION, MT_HEAL_SECTION2, MT_HEAL_SECTION3, MT_HEAL_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esHealTeammate[admin].g_iHumanMode, value, -1, 2); g_esHealTeammate[admin].g_iHumanRangeCooldown = iGetKeyValue(subsection, MT_HEAL_SECTION, MT_HEAL_SECTION2, MT_HEAL_SECTION3, MT_HEAL_SECTION4, key, "HumanRangeCooldown", "Human Range Cooldown", "Human_Range_Cooldown", "hrangecooldown", g_esHealTeammate[admin].g_iHumanRangeCooldown, value, -1, 99999); g_esHealTeammate[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_HEAL_SECTION, MT_HEAL_SECTION2, MT_HEAL_SECTION3, MT_HEAL_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esHealTeammate[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); g_esHealTeammate[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_HEAL_SECTION, MT_HEAL_SECTION2, MT_HEAL_SECTION3, MT_HEAL_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esHealTeammate[admin].g_iRequiresHumans, value, -1, 32); @@ -857,7 +865,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esHealPlayer[admin].g_iHumanAmmo = iGetKeyValue(subsection, MT_HEAL_SECTION, MT_HEAL_SECTION2, MT_HEAL_SECTION3, MT_HEAL_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esHealPlayer[admin].g_iHumanAmmo, value, -1, 99999); g_esHealPlayer[admin].g_iHumanCooldown = iGetKeyValue(subsection, MT_HEAL_SECTION, MT_HEAL_SECTION2, MT_HEAL_SECTION3, MT_HEAL_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esHealPlayer[admin].g_iHumanCooldown, value, -1, 99999); g_esHealPlayer[admin].g_iHumanDuration = iGetKeyValue(subsection, MT_HEAL_SECTION, MT_HEAL_SECTION2, MT_HEAL_SECTION3, MT_HEAL_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esHealPlayer[admin].g_iHumanDuration, value, -1, 99999); - g_esHealPlayer[admin].g_iHumanMode = iGetKeyValue(subsection, MT_HEAL_SECTION, MT_HEAL_SECTION2, MT_HEAL_SECTION3, MT_HEAL_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esHealPlayer[admin].g_iHumanMode, value, -1, 1); + g_esHealPlayer[admin].g_iHumanMode = iGetKeyValue(subsection, MT_HEAL_SECTION, MT_HEAL_SECTION2, MT_HEAL_SECTION3, MT_HEAL_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esHealPlayer[admin].g_iHumanMode, value, -1, 2); g_esHealPlayer[admin].g_iHumanRangeCooldown = iGetKeyValue(subsection, MT_HEAL_SECTION, MT_HEAL_SECTION2, MT_HEAL_SECTION3, MT_HEAL_SECTION4, key, "HumanRangeCooldown", "Human Range Cooldown", "Human_Range_Cooldown", "hrangecooldown", g_esHealPlayer[admin].g_iHumanRangeCooldown, value, -1, 99999); g_esHealPlayer[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_HEAL_SECTION, MT_HEAL_SECTION2, MT_HEAL_SECTION3, MT_HEAL_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esHealPlayer[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); g_esHealPlayer[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_HEAL_SECTION, MT_HEAL_SECTION2, MT_HEAL_SECTION3, MT_HEAL_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esHealPlayer[admin].g_iRequiresHumans, value, -1, 32); @@ -895,7 +903,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esHealSpecial[type].g_iHumanAmmo = iGetKeyValue(subsection, MT_HEAL_SECTION, MT_HEAL_SECTION2, MT_HEAL_SECTION3, MT_HEAL_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esHealSpecial[type].g_iHumanAmmo, value, -1, 99999); g_esHealSpecial[type].g_iHumanCooldown = iGetKeyValue(subsection, MT_HEAL_SECTION, MT_HEAL_SECTION2, MT_HEAL_SECTION3, MT_HEAL_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esHealSpecial[type].g_iHumanCooldown, value, -1, 99999); g_esHealSpecial[type].g_iHumanDuration = iGetKeyValue(subsection, MT_HEAL_SECTION, MT_HEAL_SECTION2, MT_HEAL_SECTION3, MT_HEAL_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esHealSpecial[type].g_iHumanDuration, value, -1, 99999); - g_esHealSpecial[type].g_iHumanMode = iGetKeyValue(subsection, MT_HEAL_SECTION, MT_HEAL_SECTION2, MT_HEAL_SECTION3, MT_HEAL_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esHealSpecial[type].g_iHumanMode, value, -1, 1); + g_esHealSpecial[type].g_iHumanMode = iGetKeyValue(subsection, MT_HEAL_SECTION, MT_HEAL_SECTION2, MT_HEAL_SECTION3, MT_HEAL_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esHealSpecial[type].g_iHumanMode, value, -1, 2); g_esHealSpecial[type].g_iHumanRangeCooldown = iGetKeyValue(subsection, MT_HEAL_SECTION, MT_HEAL_SECTION2, MT_HEAL_SECTION3, MT_HEAL_SECTION4, key, "HumanRangeCooldown", "Human Range Cooldown", "Human_Range_Cooldown", "hrangecooldown", g_esHealSpecial[type].g_iHumanRangeCooldown, value, -1, 99999); g_esHealSpecial[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_HEAL_SECTION, MT_HEAL_SECTION2, MT_HEAL_SECTION3, MT_HEAL_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esHealSpecial[type].g_flOpenAreasOnly, value, -1.0, 99999.0); g_esHealSpecial[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_HEAL_SECTION, MT_HEAL_SECTION2, MT_HEAL_SECTION3, MT_HEAL_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esHealSpecial[type].g_iRequiresHumans, value, -1, 32); @@ -927,7 +935,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esHealAbility[type].g_iHumanAmmo = iGetKeyValue(subsection, MT_HEAL_SECTION, MT_HEAL_SECTION2, MT_HEAL_SECTION3, MT_HEAL_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esHealAbility[type].g_iHumanAmmo, value, -1, 99999); g_esHealAbility[type].g_iHumanCooldown = iGetKeyValue(subsection, MT_HEAL_SECTION, MT_HEAL_SECTION2, MT_HEAL_SECTION3, MT_HEAL_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esHealAbility[type].g_iHumanCooldown, value, -1, 99999); g_esHealAbility[type].g_iHumanDuration = iGetKeyValue(subsection, MT_HEAL_SECTION, MT_HEAL_SECTION2, MT_HEAL_SECTION3, MT_HEAL_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esHealAbility[type].g_iHumanDuration, value, -1, 99999); - g_esHealAbility[type].g_iHumanMode = iGetKeyValue(subsection, MT_HEAL_SECTION, MT_HEAL_SECTION2, MT_HEAL_SECTION3, MT_HEAL_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esHealAbility[type].g_iHumanMode, value, -1, 1); + g_esHealAbility[type].g_iHumanMode = iGetKeyValue(subsection, MT_HEAL_SECTION, MT_HEAL_SECTION2, MT_HEAL_SECTION3, MT_HEAL_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esHealAbility[type].g_iHumanMode, value, -1, 2); g_esHealAbility[type].g_iHumanRangeCooldown = iGetKeyValue(subsection, MT_HEAL_SECTION, MT_HEAL_SECTION2, MT_HEAL_SECTION3, MT_HEAL_SECTION4, key, "HumanRangeCooldown", "Human Range Cooldown", "Human_Range_Cooldown", "hrangecooldown", g_esHealAbility[type].g_iHumanRangeCooldown, value, -1, 99999); g_esHealAbility[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_HEAL_SECTION, MT_HEAL_SECTION2, MT_HEAL_SECTION3, MT_HEAL_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esHealAbility[type].g_flOpenAreasOnly, value, -1.0, 99999.0); g_esHealAbility[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_HEAL_SECTION, MT_HEAL_SECTION2, MT_HEAL_SECTION3, MT_HEAL_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esHealAbility[type].g_iRequiresHumans, value, -1, 32); @@ -1161,8 +1169,9 @@ public void MT_OnButtonPressed(int tank, int button) if ((button & MT_MAIN_KEY) && (g_esHealCache[tank].g_iHealAbility == 2 || g_esHealCache[tank].g_iHealAbility == 3) && g_esHealCache[tank].g_iHumanAbility == 1) { bool bRecharging = g_esHealPlayer[tank].g_iCooldown != -1 && g_esHealPlayer[tank].g_iCooldown >= iTime; + int iHumanMode = g_esHealCache[tank].g_iHumanMode; - switch (g_esHealCache[tank].g_iHumanMode) + switch (iHumanMode) { case 0: { @@ -1179,9 +1188,9 @@ public void MT_OnButtonPressed(int tank, int button) MT_PrintToChat(tank, "%s %t", MT_TAG3, "HealHuman5", (g_esHealPlayer[tank].g_iCooldown - iTime)); } } - case 1: + case 1, 2: { - if (g_esHealPlayer[tank].g_iAmmoCount < g_esHealCache[tank].g_iHumanAmmo && g_esHealCache[tank].g_iHumanAmmo > 0) + if ((iHumanMode == 2 && g_esHealPlayer[tank].g_bActivated) || (g_esHealPlayer[tank].g_iAmmoCount < g_esHealCache[tank].g_iHumanAmmo && g_esHealCache[tank].g_iHumanAmmo > 0)) { if (!g_esHealPlayer[tank].g_bActivated && !bRecharging) { @@ -1193,7 +1202,15 @@ public void MT_OnButtonPressed(int tank, int button) } else if (g_esHealPlayer[tank].g_bActivated) { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "HealHuman4"); + switch (iHumanMode) + { + case 1: MT_PrintToChat(tank, "%s %t", MT_TAG3, "HealHuman4"); + case 2: + { + vHealReset2(tank); + vHealReset3(tank); + } + } } else if (bRecharging) { @@ -1416,17 +1433,7 @@ void vHealHit(int survivor, int tank, float random, float chance, int enabled, i } } - SetEntProp(survivor, Prop_Data, "m_iHealth", 1); - SetEntPropFloat(survivor, Prop_Send, "m_healthBufferTime", GetGameTime()); - SetEntPropFloat(survivor, Prop_Send, "m_healthBuffer", g_esHealCache[tank].g_flHealBuffer); - SetEntProp(survivor, Prop_Send, "m_currentReviveCount", g_cvMTMaxIncapCount.IntValue); - SetEntProp(survivor, Prop_Send, "m_isGoingToDie", 1); - - if (g_bSecondGame) - { - SetEntProp(survivor, Prop_Send, "m_bIsOnThirdStrike", 1); - } - + vSetSurvivorLastLife(survivor, g_cvMTMaxIncapCount.IntValue, true, g_esHealCache[tank].g_flHealBuffer); vScreenEffect(survivor, tank, g_esHealCache[tank].g_iHealEffect, flags); if (g_esHealCache[tank].g_iHealMessage & messages) @@ -1550,49 +1557,53 @@ void vSetHealGlow(int tank, int color, bool flashing, int min, int max, int type SetEntProp(tank, Prop_Send, "m_iGlowType", type); } -void tTimerHealCombo(Handle timer, DataPack pack) +Action tTimerHealCombo(Handle timer, DataPack pack) { pack.Reset(); int iTank = GetClientOfUserId(pack.ReadCell()); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esHealAbility[g_esHealPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esHealPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esHealPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esHealCache[iTank].g_iHealAbility == 0 || g_esHealCache[iTank].g_iHealAbility == 2) { - return; + return Plugin_Stop; } float flRandom = pack.ReadFloat(); int iPos = pack.ReadCell(); vHealAbility(iTank, true, flRandom, iPos); + + return Plugin_Continue; } -void tTimerHealCombo2(Handle timer, DataPack pack) +Action tTimerHealCombo2(Handle timer, DataPack pack) { pack.Reset(); int iTank = GetClientOfUserId(pack.ReadCell()); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esHealAbility[g_esHealPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esHealPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esHealPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esHealCache[iTank].g_iHealAbility == 0 || g_esHealCache[iTank].g_iHealAbility == 1) { - return; + return Plugin_Stop; } int iPos = pack.ReadCell(); vHealAbility(iTank, false, .pos = iPos); + + return Plugin_Continue; } -void tTimerHealCombo3(Handle timer, DataPack pack) +Action tTimerHealCombo3(Handle timer, DataPack pack) { pack.Reset(); int iSurvivor = GetClientOfUserId(pack.ReadCell()); if (!bIsSurvivor(iSurvivor) || g_esHealPlayer[iSurvivor].g_bAffected) { - return; + return Plugin_Stop; } int iTank = GetClientOfUserId(pack.ReadCell()); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esHealAbility[g_esHealPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esHealPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esHealPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esHealCache[iTank].g_iHealHit == 0) { - return; + return Plugin_Stop; } float flRandom = pack.ReadFloat(), flChance = pack.ReadFloat(); @@ -1606,6 +1617,8 @@ void tTimerHealCombo3(Handle timer, DataPack pack) { vHealHit(iSurvivor, iTank, flRandom, flChance, g_esHealCache[iTank].g_iHealHit, MT_MESSAGE_MELEE, MT_ATTACK_MELEE); } + + return Plugin_Continue; } Action tTimerHeal(Handle timer, DataPack pack) diff --git a/addons/sourcemod/scripting/mutant_tanks/abilities/mt_hit.sp b/addons/sourcemod/scripting/mutant_tanks/abilities/mt_hit.sp deleted file mode 100644 index 4d5200eaaa..0000000000 --- a/addons/sourcemod/scripting/mutant_tanks/abilities/mt_hit.sp +++ /dev/null @@ -1,500 +0,0 @@ -/** - * Mutant Tanks: a L4D/L4D2 SourceMod Plugin - * Copyright (C) 2024 Alfred "Psyk0tik" Llagas - * - * 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 . - **/ - -#define MT_HIT_COMPILE_METHOD 0 // 0: packaged, 1: standalone - -#if !defined MT_ABILITIES_MAIN - #if MT_HIT_COMPILE_METHOD == 1 - #include - #include - #else - #error This file must be inside "scripting/mutant_tanks/abilities" while compiling "mt_abilities.sp" to include its content. - #endif -public Plugin myinfo = -{ - name = "[MT] Hit Ability", - author = MT_AUTHOR, - description = "The Mutant Tank only takes damage in certain parts of its body.", - version = MT_VERSION, - url = MT_URL -}; - -bool g_bDedicated, g_bLateLoad; - -public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max) -{ - EngineVersion evEngine = GetEngineVersion(); - if (evEngine != Engine_Left4Dead && evEngine != Engine_Left4Dead2) - { - strcopy(error, err_max, "\"[MT] Hit Ability\" only supports Left 4 Dead 1 & 2."); - - return APLRes_SilentFailure; - } - - g_bDedicated = IsDedicatedServer(); - g_bLateLoad = late; - - return APLRes_Success; -} - -#define SOUND_METAL "physics/metal/metal_solid_impact_hard5.wav" -#else - #if MT_HIT_COMPILE_METHOD == 1 - #error This file must be compiled as a standalone plugin. - #endif -#endif - -#define MT_HIT_SECTION "hitability" -#define MT_HIT_SECTION2 "hit ability" -#define MT_HIT_SECTION3 "hit_ability" -#define MT_HIT_SECTION4 "hit" - -#define MT_MENU_HIT "Hit Ability" - -enum struct esHitPlayer -{ - float g_flCloseAreasOnly; - float g_flHitDamageMultiplier; - float g_flOpenAreasOnly; - - int g_iAccessFlags; - int g_iHitAbility; - int g_iHitGroup; - int g_iHumanAbility; - int g_iImmunityFlags; - int g_iRequiresHumans; - int g_iTankType; - int g_iTankTypeRecorded; -} - -esHitPlayer g_esHitPlayer[MAXPLAYERS + 1]; - -enum struct esHitTeammate -{ - float g_flCloseAreasOnly; - float g_flHitDamageMultiplier; - float g_flOpenAreasOnly; - - int g_iHitAbility; - int g_iHitGroup; - int g_iHumanAbility; - int g_iRequiresHumans; -} - -esHitTeammate g_esHitTeammate[MAXPLAYERS + 1]; - -enum struct esHitAbility -{ - float g_flCloseAreasOnly; - float g_flHitDamageMultiplier; - float g_flOpenAreasOnly; - - int g_iAccessFlags; - int g_iHitAbility; - int g_iHitGroup; - int g_iHumanAbility; - int g_iImmunityFlags; - int g_iRequiresHumans; -} - -esHitAbility g_esHitAbility[MT_MAXTYPES + 1]; - -enum struct esHitSpecial -{ - float g_flCloseAreasOnly; - float g_flHitDamageMultiplier; - float g_flOpenAreasOnly; - - int g_iHitAbility; - int g_iHitGroup; - int g_iHumanAbility; - int g_iRequiresHumans; -} - -esHitSpecial g_esHitSpecial[MT_MAXTYPES + 1]; - -enum struct esHitCache -{ - float g_flCloseAreasOnly; - float g_flHitDamageMultiplier; - float g_flOpenAreasOnly; - - int g_iHitAbility; - int g_iHitGroup; - int g_iHumanAbility; - int g_iRequiresHumans; -} - -esHitCache g_esHitCache[MAXPLAYERS + 1]; - -#if !defined MT_ABILITIES_MAIN -public void OnPluginStart() -{ - LoadTranslations("common.phrases"); - LoadTranslations("mutant_tanks.phrases"); - LoadTranslations("mutant_tanks_names.phrases"); - - RegConsoleCmd("sm_mt_hit", cmdHitInfo, "View information about the Hit ability."); - - if (g_bLateLoad) - { - for (int iPlayer = 1; iPlayer <= MaxClients; iPlayer++) - { - if (bIsValidClient(iPlayer, MT_CHECK_INGAME)) - { - OnClientPutInServer(iPlayer); - } - } - - g_bLateLoad = false; - } -} -#endif - -#if defined MT_ABILITIES_MAIN -void vHitClientPutInServer(int client) -#else -public void OnClientPutInServer(int client) -#endif -{ - SDKHook(client, SDKHook_TraceAttack, HitTraceAttack); -} - -#if !defined MT_ABILITIES_MAIN -Action cmdHitInfo(int client, int args) -{ - client = iGetListenServerHost(client, g_bDedicated); - - if (!MT_IsCorePluginEnabled()) - { - MT_ReplyToCommand(client, "%s %t", MT_TAG5, "PluginDisabled"); - - return Plugin_Handled; - } - - if (!bIsValidClient(client, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_FAKECLIENT)) - { - MT_ReplyToCommand(client, "%s %t", MT_TAG, "Command is in-game only"); - - return Plugin_Handled; - } - - switch (IsVoteInProgress()) - { - case true: MT_ReplyToCommand(client, "%s %t", MT_TAG2, "Vote in Progress"); - case false: vHitMenu(client, MT_HIT_SECTION4, 0); - } - - return Plugin_Handled; -} -#endif - -void vHitMenu(int client, const char[] name, int item) -{ - if (StrContains(MT_HIT_SECTION4, name, false) == -1) - { - return; - } - - Menu mAbilityMenu = new Menu(iHitMenuHandler, MENU_ACTIONS_DEFAULT|MenuAction_Display|MenuAction_DisplayItem); - mAbilityMenu.SetTitle("Hit Ability Information"); - mAbilityMenu.AddItem("Status", "Status"); - mAbilityMenu.AddItem("Details", "Details"); - mAbilityMenu.AddItem("Human Support", "Human Support"); - mAbilityMenu.DisplayAt(client, item, MENU_TIME_FOREVER); -} - -int iHitMenuHandler(Menu menu, MenuAction action, int param1, int param2) -{ - switch (action) - { - case MenuAction_End: delete menu; - case MenuAction_Select: - { - switch (param2) - { - case 0: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esHitCache[param1].g_iHitAbility == 0) ? "AbilityStatus1" : "AbilityStatus2"); - case 1: MT_PrintToChat(param1, "%s %t", MT_TAG3, "HitDetails"); - case 2: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esHitCache[param1].g_iHumanAbility == 0) ? "AbilityHumanSupport1" : "AbilityHumanSupport2"); - } - - if (bIsValidClient(param1, MT_CHECK_INGAME)) - { - vHitMenu(param1, MT_HIT_SECTION4, menu.Selection); - } - } - case MenuAction_Display: - { - char sMenuTitle[PLATFORM_MAX_PATH]; - Panel pHit = view_as(param2); - FormatEx(sMenuTitle, sizeof sMenuTitle, "%T", "HitMenu", param1); - pHit.SetTitle(sMenuTitle); - } - case MenuAction_DisplayItem: - { - if (param2 >= 0) - { - char sMenuOption[PLATFORM_MAX_PATH]; - - switch (param2) - { - case 0: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Status", param1); - case 1: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Details", param1); - case 2: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "HumanSupport", param1); - } - - return RedrawMenuItem(sMenuOption); - } - } - } - - return 0; -} - -#if defined MT_ABILITIES_MAIN -void vHitDisplayMenu(Menu menu) -#else -public void MT_OnDisplayMenu(Menu menu) -#endif -{ - menu.AddItem(MT_MENU_HIT, MT_MENU_HIT); -} - -#if defined MT_ABILITIES_MAIN -void vHitMenuItemSelected(int client, const char[] info) -#else -public void MT_OnMenuItemSelected(int client, const char[] info) -#endif -{ - if (StrEqual(info, MT_MENU_HIT, false)) - { - vHitMenu(client, MT_HIT_SECTION4, 0); - } -} - -#if defined MT_ABILITIES_MAIN -void vHitMenuItemDisplayed(int client, const char[] info, char[] buffer, int size) -#else -public void MT_OnMenuItemDisplayed(int client, const char[] info, char[] buffer, int size) -#endif -{ - if (StrEqual(info, MT_MENU_HIT, false)) - { - FormatEx(buffer, size, "%T", "HitMenu2", client); - } -} - -Action HitTraceAttack(int victim, int &attacker, int &inflictor, float &damage, int &damagetype, int &ammotype, int hitbox, int hitgroup) -{ - if (MT_IsCorePluginEnabled() && bIsValidClient(victim, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_ALIVE) && damage > 0.0) - { - if (MT_IsTankSupported(victim) && MT_IsCustomTankSupported(victim) && g_esHitCache[victim].g_iHitAbility == 1) - { - if (bIsAreaNarrow(victim, g_esHitCache[victim].g_flOpenAreasOnly) || bIsAreaWide(victim, g_esHitCache[victim].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esHitPlayer[victim].g_iTankType, victim) || (g_esHitCache[victim].g_iRequiresHumans > 0 && iGetHumanCount() < g_esHitCache[victim].g_iRequiresHumans) || (!MT_HasAdminAccess(victim) && !bHasAdminAccess(victim, g_esHitAbility[g_esHitPlayer[victim].g_iTankTypeRecorded].g_iAccessFlags, g_esHitPlayer[victim].g_iAccessFlags)) || (bIsSurvivor(attacker) && (MT_IsAdminImmune(attacker, victim) || bIsAdminImmune(attacker, g_esHitPlayer[victim].g_iTankType, g_esHitAbility[g_esHitPlayer[victim].g_iTankTypeRecorded].g_iImmunityFlags, g_esHitPlayer[attacker].g_iImmunityFlags) || MT_DoesSurvivorHaveRewardType(attacker, MT_REWARD_DAMAGEBOOST))) || (bIsInfected(victim, MT_CHECK_FAKECLIENT) && g_esHitCache[victim].g_iHumanAbility == 0)) - { - return Plugin_Continue; - } - - damage *= g_esHitCache[victim].g_flHitDamageMultiplier; - - int iBit = (hitgroup - 1), iFlag = (1 << iBit); - if (g_esHitCache[victim].g_iHitGroup & iFlag) - { - return Plugin_Changed; - } - else - { - EmitSoundToAll(SOUND_METAL, victim); - - return Plugin_Handled; - } - } - } - - return Plugin_Continue; -} - -#if defined MT_ABILITIES_MAIN -void vHitPluginCheck(ArrayList list) -#else -public void MT_OnPluginCheck(ArrayList list) -#endif -{ - list.PushString(MT_MENU_HIT); -} - -#if defined MT_ABILITIES_MAIN -void vHitAbilityCheck(ArrayList list, ArrayList list2, ArrayList list3, ArrayList list4) -#else -public void MT_OnAbilityCheck(ArrayList list, ArrayList list2, ArrayList list3, ArrayList list4) -#endif -{ - list.PushString(MT_HIT_SECTION); - list2.PushString(MT_HIT_SECTION2); - list3.PushString(MT_HIT_SECTION3); - list4.PushString(MT_HIT_SECTION4); -} - -#if defined MT_ABILITIES_MAIN -void vHitConfigsLoad(int mode) -#else -public void MT_OnConfigsLoad(int mode) -#endif -{ - switch (mode) - { - case 1: - { - for (int iIndex = MT_GetMinType(); iIndex <= MT_GetMaxType(); iIndex++) - { - g_esHitAbility[iIndex].g_iAccessFlags = 0; - g_esHitAbility[iIndex].g_iImmunityFlags = 0; - g_esHitAbility[iIndex].g_flCloseAreasOnly = 0.0; - g_esHitAbility[iIndex].g_iHumanAbility = 0; - g_esHitAbility[iIndex].g_flOpenAreasOnly = 0.0; - g_esHitAbility[iIndex].g_iRequiresHumans = 1; - g_esHitAbility[iIndex].g_iHitAbility = 0; - g_esHitAbility[iIndex].g_flHitDamageMultiplier = 1.5; - g_esHitAbility[iIndex].g_iHitGroup = 1; - - g_esHitSpecial[iIndex].g_flCloseAreasOnly = -1.0; - g_esHitSpecial[iIndex].g_iHumanAbility = -1; - g_esHitSpecial[iIndex].g_flOpenAreasOnly = -1.0; - g_esHitSpecial[iIndex].g_iRequiresHumans = -1; - g_esHitSpecial[iIndex].g_iHitAbility = -1; - g_esHitSpecial[iIndex].g_flHitDamageMultiplier = -1.0; - g_esHitSpecial[iIndex].g_iHitGroup = -1; - } - } - case 3: - { - for (int iPlayer = 1; iPlayer <= MaxClients; iPlayer++) - { - g_esHitPlayer[iPlayer].g_iAccessFlags = -1; - g_esHitPlayer[iPlayer].g_iImmunityFlags = -1; - g_esHitPlayer[iPlayer].g_flCloseAreasOnly = -1.0; - g_esHitPlayer[iPlayer].g_iHumanAbility = -1; - g_esHitPlayer[iPlayer].g_flOpenAreasOnly = -1.0; - g_esHitPlayer[iPlayer].g_iRequiresHumans = -1; - g_esHitPlayer[iPlayer].g_iHitAbility = -1; - g_esHitPlayer[iPlayer].g_flHitDamageMultiplier = -1.0; - g_esHitPlayer[iPlayer].g_iHitGroup = -1; - - g_esHitTeammate[iPlayer].g_flCloseAreasOnly = -1.0; - g_esHitTeammate[iPlayer].g_iHumanAbility = -1; - g_esHitTeammate[iPlayer].g_flOpenAreasOnly = -1.0; - g_esHitTeammate[iPlayer].g_iRequiresHumans = -1; - g_esHitTeammate[iPlayer].g_iHitAbility = -1; - g_esHitTeammate[iPlayer].g_flHitDamageMultiplier = -1.0; - g_esHitTeammate[iPlayer].g_iHitGroup = -1; - } - } - } -} - -#if defined MT_ABILITIES_MAIN -void vHitConfigsLoaded(const char[] subsection, const char[] key, const char[] value, int type, int admin, int mode, bool special, const char[] specsection) -#else -public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const char[] value, int type, int admin, int mode, bool special, const char[] specsection) -#endif -{ - if ((mode == -1 || mode == 3) && bIsValidClient(admin)) - { - if (special && specsection[0] != '\0') - { - g_esHitTeammate[admin].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_HIT_SECTION, MT_HIT_SECTION2, MT_HIT_SECTION3, MT_HIT_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esHitTeammate[admin].g_flCloseAreasOnly, value, -1.0, 99999.0); - g_esHitTeammate[admin].g_iHumanAbility = iGetKeyValue(subsection, MT_HIT_SECTION, MT_HIT_SECTION2, MT_HIT_SECTION3, MT_HIT_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esHitTeammate[admin].g_iHumanAbility, value, -1, 1); - g_esHitTeammate[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_HIT_SECTION, MT_HIT_SECTION2, MT_HIT_SECTION3, MT_HIT_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esHitTeammate[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); - g_esHitTeammate[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_HIT_SECTION, MT_HIT_SECTION2, MT_HIT_SECTION3, MT_HIT_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esHitTeammate[admin].g_iRequiresHumans, value, -1, 32); - g_esHitTeammate[admin].g_iHitAbility = iGetKeyValue(subsection, MT_HIT_SECTION, MT_HIT_SECTION2, MT_HIT_SECTION3, MT_HIT_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esHitTeammate[admin].g_iHitAbility, value, -1, 1); - g_esHitTeammate[admin].g_flHitDamageMultiplier = flGetKeyValue(subsection, MT_HIT_SECTION, MT_HIT_SECTION2, MT_HIT_SECTION3, MT_HIT_SECTION4, key, "HitDamageMultiplier", "Hit Damage Multiplier", "Hit_Damage_Multiplier", "dmgmulti", g_esHitTeammate[admin].g_flHitDamageMultiplier, value, -1.0, 99999.0); - g_esHitTeammate[admin].g_iHitGroup = iGetKeyValue(subsection, MT_HIT_SECTION, MT_HIT_SECTION2, MT_HIT_SECTION3, MT_HIT_SECTION4, key, "HitGroup", "Hit Group", "Hit_Group", "group", g_esHitTeammate[admin].g_iHitGroup, value, -1, 127); - } - else - { - g_esHitPlayer[admin].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_HIT_SECTION, MT_HIT_SECTION2, MT_HIT_SECTION3, MT_HIT_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esHitPlayer[admin].g_flCloseAreasOnly, value, -1.0, 99999.0); - g_esHitPlayer[admin].g_iHumanAbility = iGetKeyValue(subsection, MT_HIT_SECTION, MT_HIT_SECTION2, MT_HIT_SECTION3, MT_HIT_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esHitPlayer[admin].g_iHumanAbility, value, -1, 1); - g_esHitPlayer[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_HIT_SECTION, MT_HIT_SECTION2, MT_HIT_SECTION3, MT_HIT_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esHitPlayer[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); - g_esHitPlayer[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_HIT_SECTION, MT_HIT_SECTION2, MT_HIT_SECTION3, MT_HIT_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esHitPlayer[admin].g_iRequiresHumans, value, -1, 32); - g_esHitPlayer[admin].g_iHitAbility = iGetKeyValue(subsection, MT_HIT_SECTION, MT_HIT_SECTION2, MT_HIT_SECTION3, MT_HIT_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esHitPlayer[admin].g_iHitAbility, value, -1, 1); - g_esHitPlayer[admin].g_flHitDamageMultiplier = flGetKeyValue(subsection, MT_HIT_SECTION, MT_HIT_SECTION2, MT_HIT_SECTION3, MT_HIT_SECTION4, key, "HitDamageMultiplier", "Hit Damage Multiplier", "Hit_Damage_Multiplier", "dmgmulti", g_esHitPlayer[admin].g_flHitDamageMultiplier, value, -1.0, 99999.0); - g_esHitPlayer[admin].g_iHitGroup = iGetKeyValue(subsection, MT_HIT_SECTION, MT_HIT_SECTION2, MT_HIT_SECTION3, MT_HIT_SECTION4, key, "HitGroup", "Hit Group", "Hit_Group", "group", g_esHitPlayer[admin].g_iHitGroup, value, -1, 127); - g_esHitPlayer[admin].g_iAccessFlags = iGetAdminFlagsValue(subsection, MT_HIT_SECTION, MT_HIT_SECTION2, MT_HIT_SECTION3, MT_HIT_SECTION4, key, "AccessFlags", "Access Flags", "Access_Flags", "access", value); - g_esHitPlayer[admin].g_iImmunityFlags = iGetAdminFlagsValue(subsection, MT_HIT_SECTION, MT_HIT_SECTION2, MT_HIT_SECTION3, MT_HIT_SECTION4, key, "ImmunityFlags", "Immunity Flags", "Immunity_Flags", "immunity", value); - } - } - - if (mode < 3 && type > 0) - { - if (special && specsection[0] != '\0') - { - g_esHitSpecial[type].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_HIT_SECTION, MT_HIT_SECTION2, MT_HIT_SECTION3, MT_HIT_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esHitSpecial[type].g_flCloseAreasOnly, value, -1.0, 99999.0); - g_esHitSpecial[type].g_iHumanAbility = iGetKeyValue(subsection, MT_HIT_SECTION, MT_HIT_SECTION2, MT_HIT_SECTION3, MT_HIT_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esHitSpecial[type].g_iHumanAbility, value, -1, 1); - g_esHitSpecial[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_HIT_SECTION, MT_HIT_SECTION2, MT_HIT_SECTION3, MT_HIT_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esHitSpecial[type].g_flOpenAreasOnly, value, -1.0, 99999.0); - g_esHitSpecial[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_HIT_SECTION, MT_HIT_SECTION2, MT_HIT_SECTION3, MT_HIT_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esHitSpecial[type].g_iRequiresHumans, value, -1, 32); - g_esHitSpecial[type].g_iHitAbility = iGetKeyValue(subsection, MT_HIT_SECTION, MT_HIT_SECTION2, MT_HIT_SECTION3, MT_HIT_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esHitSpecial[type].g_iHitAbility, value, -1, 1); - g_esHitSpecial[type].g_flHitDamageMultiplier = flGetKeyValue(subsection, MT_HIT_SECTION, MT_HIT_SECTION2, MT_HIT_SECTION3, MT_HIT_SECTION4, key, "HitDamageMultiplier", "Hit Damage Multiplier", "Hit_Damage_Multiplier", "dmgmulti", g_esHitSpecial[type].g_flHitDamageMultiplier, value, -1.0, 99999.0); - g_esHitSpecial[type].g_iHitGroup = iGetKeyValue(subsection, MT_HIT_SECTION, MT_HIT_SECTION2, MT_HIT_SECTION3, MT_HIT_SECTION4, key, "HitGroup", "Hit Group", "Hit_Group", "group", g_esHitSpecial[type].g_iHitGroup, value, -1, 127); - } - else - { - g_esHitAbility[type].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_HIT_SECTION, MT_HIT_SECTION2, MT_HIT_SECTION3, MT_HIT_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esHitAbility[type].g_flCloseAreasOnly, value, -1.0, 99999.0); - g_esHitAbility[type].g_iHumanAbility = iGetKeyValue(subsection, MT_HIT_SECTION, MT_HIT_SECTION2, MT_HIT_SECTION3, MT_HIT_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esHitAbility[type].g_iHumanAbility, value, -1, 1); - g_esHitAbility[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_HIT_SECTION, MT_HIT_SECTION2, MT_HIT_SECTION3, MT_HIT_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esHitAbility[type].g_flOpenAreasOnly, value, -1.0, 99999.0); - g_esHitAbility[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_HIT_SECTION, MT_HIT_SECTION2, MT_HIT_SECTION3, MT_HIT_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esHitAbility[type].g_iRequiresHumans, value, -1, 32); - g_esHitAbility[type].g_iHitAbility = iGetKeyValue(subsection, MT_HIT_SECTION, MT_HIT_SECTION2, MT_HIT_SECTION3, MT_HIT_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esHitAbility[type].g_iHitAbility, value, -1, 1); - g_esHitAbility[type].g_flHitDamageMultiplier = flGetKeyValue(subsection, MT_HIT_SECTION, MT_HIT_SECTION2, MT_HIT_SECTION3, MT_HIT_SECTION4, key, "HitDamageMultiplier", "Hit Damage Multiplier", "Hit_Damage_Multiplier", "dmgmulti", g_esHitAbility[type].g_flHitDamageMultiplier, value, -1.0, 99999.0); - g_esHitAbility[type].g_iHitGroup = iGetKeyValue(subsection, MT_HIT_SECTION, MT_HIT_SECTION2, MT_HIT_SECTION3, MT_HIT_SECTION4, key, "HitGroup", "Hit Group", "Hit_Group", "group", g_esHitAbility[type].g_iHitGroup, value, -1, 127); - g_esHitAbility[type].g_iAccessFlags = iGetAdminFlagsValue(subsection, MT_HIT_SECTION, MT_HIT_SECTION2, MT_HIT_SECTION3, MT_HIT_SECTION4, key, "AccessFlags", "Access Flags", "Access_Flags", "access", value); - g_esHitAbility[type].g_iImmunityFlags = iGetAdminFlagsValue(subsection, MT_HIT_SECTION, MT_HIT_SECTION2, MT_HIT_SECTION3, MT_HIT_SECTION4, key, "ImmunityFlags", "Immunity Flags", "Immunity_Flags", "immunity", value); - } - } -} - -#if defined MT_ABILITIES_MAIN -void vHitSettingsCached(int tank, bool apply, int type) -#else -public void MT_OnSettingsCached(int tank, bool apply, int type) -#endif -{ - bool bHuman = bIsValidClient(tank, MT_CHECK_FAKECLIENT); - g_esHitPlayer[tank].g_iTankTypeRecorded = apply ? MT_GetRecordedTankType(tank, type) : 0; - g_esHitPlayer[tank].g_iTankType = apply ? type : 0; - int iType = g_esHitPlayer[tank].g_iTankTypeRecorded; - - if (bIsSpecialInfected(tank, MT_CHECK_INDEX|MT_CHECK_INGAME)) - { - g_esHitCache[tank].g_flCloseAreasOnly = flGetSubSettingValue(apply, bHuman, g_esHitTeammate[tank].g_flCloseAreasOnly, g_esHitPlayer[tank].g_flCloseAreasOnly, g_esHitSpecial[iType].g_flCloseAreasOnly, g_esHitAbility[iType].g_flCloseAreasOnly, 1); - g_esHitCache[tank].g_flHitDamageMultiplier = flGetSubSettingValue(apply, bHuman, g_esHitTeammate[tank].g_flHitDamageMultiplier, g_esHitPlayer[tank].g_flHitDamageMultiplier, g_esHitSpecial[iType].g_flHitDamageMultiplier, g_esHitAbility[iType].g_flHitDamageMultiplier, 1); - g_esHitCache[tank].g_iHitAbility = iGetSubSettingValue(apply, bHuman, g_esHitTeammate[tank].g_iHitAbility, g_esHitPlayer[tank].g_iHitAbility, g_esHitSpecial[iType].g_iHitAbility, g_esHitAbility[iType].g_iHitAbility, 1); - g_esHitCache[tank].g_iHitGroup = iGetSubSettingValue(apply, bHuman, g_esHitTeammate[tank].g_iHitGroup, g_esHitPlayer[tank].g_iHitGroup, g_esHitSpecial[iType].g_iHitGroup, g_esHitAbility[iType].g_iHitGroup, 1); - g_esHitCache[tank].g_iHumanAbility = iGetSubSettingValue(apply, bHuman, g_esHitTeammate[tank].g_iHumanAbility, g_esHitPlayer[tank].g_iHumanAbility, g_esHitSpecial[iType].g_iHumanAbility, g_esHitAbility[iType].g_iHumanAbility, 1); - g_esHitCache[tank].g_flOpenAreasOnly = flGetSubSettingValue(apply, bHuman, g_esHitTeammate[tank].g_flOpenAreasOnly, g_esHitPlayer[tank].g_flOpenAreasOnly, g_esHitSpecial[iType].g_flOpenAreasOnly, g_esHitAbility[iType].g_flOpenAreasOnly, 1); - g_esHitCache[tank].g_iRequiresHumans = iGetSubSettingValue(apply, bHuman, g_esHitTeammate[tank].g_iRequiresHumans, g_esHitPlayer[tank].g_iRequiresHumans, g_esHitSpecial[iType].g_iRequiresHumans, g_esHitAbility[iType].g_iRequiresHumans, 1); - } - else - { - g_esHitCache[tank].g_flCloseAreasOnly = flGetSettingValue(apply, bHuman, g_esHitPlayer[tank].g_flCloseAreasOnly, g_esHitAbility[iType].g_flCloseAreasOnly, 1); - g_esHitCache[tank].g_flHitDamageMultiplier = flGetSettingValue(apply, bHuman, g_esHitPlayer[tank].g_flHitDamageMultiplier, g_esHitAbility[iType].g_flHitDamageMultiplier, 1); - g_esHitCache[tank].g_iHitAbility = iGetSettingValue(apply, bHuman, g_esHitPlayer[tank].g_iHitAbility, g_esHitAbility[iType].g_iHitAbility, 1); - g_esHitCache[tank].g_iHitGroup = iGetSettingValue(apply, bHuman, g_esHitPlayer[tank].g_iHitGroup, g_esHitAbility[iType].g_iHitGroup, 1); - g_esHitCache[tank].g_iHumanAbility = iGetSettingValue(apply, bHuman, g_esHitPlayer[tank].g_iHumanAbility, g_esHitAbility[iType].g_iHumanAbility, 1); - g_esHitCache[tank].g_flOpenAreasOnly = flGetSettingValue(apply, bHuman, g_esHitPlayer[tank].g_flOpenAreasOnly, g_esHitAbility[iType].g_flOpenAreasOnly, 1); - g_esHitCache[tank].g_iRequiresHumans = iGetSettingValue(apply, bHuman, g_esHitPlayer[tank].g_iRequiresHumans, g_esHitAbility[iType].g_iRequiresHumans, 1); - } -} - -#if !defined MT_ABILITIES_MAIN -public void MT_OnPluginUpdate() -{ - MT_ReloadPlugin(null); -} -#endif \ No newline at end of file diff --git a/addons/sourcemod/scripting/mutant_tanks/abilities/mt_hurt.sp b/addons/sourcemod/scripting/mutant_tanks/abilities/mt_hurt.sp index 7d98037ab8..f4321ab6f7 100644 --- a/addons/sourcemod/scripting/mutant_tanks/abilities/mt_hurt.sp +++ b/addons/sourcemod/scripting/mutant_tanks/abilities/mt_hurt.sp @@ -1,6 +1,6 @@ /** - * Mutant Tanks: a L4D/L4D2 SourceMod Plugin - * Copyright (C) 2024 Alfred "Psyk0tik" Llagas + * Mutant Tanks: A L4D/L4D2 SourceMod Plugin + * Copyright (C) 2017-2025 Alfred "Psyk0tik" Llagas * * 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. * @@ -22,13 +22,15 @@ public Plugin myinfo = { name = "[MT] Hurt Ability", author = MT_AUTHOR, - description = "The Mutant Tank repeatedly hurts survivors.", + description = "The Mutant Tank repeatedly hurts or pimp slaps survivors.", version = MT_VERSION, url = MT_URL }; bool g_bDedicated, g_bLateLoad, g_bSecondGame; +int g_iGraphicsLevel; + public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max) { switch (GetEngineVersion()) @@ -96,6 +98,7 @@ enum struct esHurtPlayer int g_iHurtHit; int g_iHurtHitMode; int g_iHurtMessage; + int g_iHurtMode; int g_iHurtRangeCooldown; int g_iHurtSight; int g_iImmunityFlags; @@ -130,6 +133,7 @@ enum struct esHurtTeammate int g_iHurtHit; int g_iHurtHitMode; int g_iHurtMessage; + int g_iHurtMode; int g_iHurtRangeCooldown; int g_iHurtSight; int g_iRequiresHumans; @@ -160,6 +164,7 @@ enum struct esHurtAbility int g_iHurtHit; int g_iHurtHitMode; int g_iHurtMessage; + int g_iHurtMode; int g_iHurtRangeCooldown; int g_iHurtSight; int g_iImmunityFlags; @@ -190,6 +195,7 @@ enum struct esHurtSpecial int g_iHurtHit; int g_iHurtHitMode; int g_iHurtMessage; + int g_iHurtMode; int g_iHurtRangeCooldown; int g_iHurtSight; int g_iRequiresHumans; @@ -219,6 +225,7 @@ enum struct esHurtCache int g_iHurtHit; int g_iHurtHitMode; int g_iHurtMessage; + int g_iHurtMode; int g_iHurtRangeCooldown; int g_iHurtSight; int g_iRequiresHumans; @@ -615,6 +622,7 @@ public void MT_OnConfigsLoad(int mode) g_esHurtAbility[iIndex].g_iHurtHit = 0; g_esHurtAbility[iIndex].g_iHurtHitMode = 0; g_esHurtAbility[iIndex].g_flHurtInterval = 1.0; + g_esHurtAbility[iIndex].g_iHurtMode = 0; g_esHurtAbility[iIndex].g_flHurtRange = 150.0; g_esHurtAbility[iIndex].g_flHurtRangeChance = 15.0; g_esHurtAbility[iIndex].g_iHurtRangeCooldown = 0; @@ -638,6 +646,7 @@ public void MT_OnConfigsLoad(int mode) g_esHurtSpecial[iIndex].g_iHurtHit = -1; g_esHurtSpecial[iIndex].g_iHurtHitMode = -1; g_esHurtSpecial[iIndex].g_flHurtInterval = -1.0; + g_esHurtSpecial[iIndex].g_iHurtMode = -1; g_esHurtSpecial[iIndex].g_flHurtRange = -1.0; g_esHurtSpecial[iIndex].g_flHurtRangeChance = -1.0; g_esHurtSpecial[iIndex].g_iHurtRangeCooldown = -1; @@ -668,6 +677,7 @@ public void MT_OnConfigsLoad(int mode) g_esHurtPlayer[iPlayer].g_iHurtHit = -1; g_esHurtPlayer[iPlayer].g_iHurtHitMode = -1; g_esHurtPlayer[iPlayer].g_flHurtInterval = -1.0; + g_esHurtPlayer[iPlayer].g_iHurtMode = -1; g_esHurtPlayer[iPlayer].g_flHurtRange = -1.0; g_esHurtPlayer[iPlayer].g_flHurtRangeChance = -1.0; g_esHurtPlayer[iPlayer].g_iHurtRangeCooldown = -1; @@ -691,6 +701,7 @@ public void MT_OnConfigsLoad(int mode) g_esHurtTeammate[iPlayer].g_iHurtHit = -1; g_esHurtTeammate[iPlayer].g_iHurtHitMode = -1; g_esHurtTeammate[iPlayer].g_flHurtInterval = -1.0; + g_esHurtTeammate[iPlayer].g_iHurtMode = -1; g_esHurtTeammate[iPlayer].g_flHurtRange = -1.0; g_esHurtTeammate[iPlayer].g_flHurtRangeChance = -1.0; g_esHurtTeammate[iPlayer].g_iHurtRangeCooldown = -1; @@ -729,6 +740,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esHurtTeammate[admin].g_iHurtHit = iGetKeyValue(subsection, MT_HURT_SECTION, MT_HURT_SECTION2, MT_HURT_SECTION3, MT_HURT_SECTION4, key, "HurtHit", "Hurt Hit", "Hurt_Hit", "hit", g_esHurtTeammate[admin].g_iHurtHit, value, -1, 1); g_esHurtTeammate[admin].g_iHurtHitMode = iGetKeyValue(subsection, MT_HURT_SECTION, MT_HURT_SECTION2, MT_HURT_SECTION3, MT_HURT_SECTION4, key, "HurtHitMode", "Hurt Hit Mode", "Hurt_Hit_Mode", "hitmode", g_esHurtTeammate[admin].g_iHurtHitMode, value, -1, 2); g_esHurtTeammate[admin].g_flHurtInterval = flGetKeyValue(subsection, MT_HURT_SECTION, MT_HURT_SECTION2, MT_HURT_SECTION3, MT_HURT_SECTION4, key, "HurtInterval", "Hurt Interval", "Hurt_Interval", "interval", g_esHurtTeammate[admin].g_flHurtInterval, value, -1.0, 99999.0); + g_esHurtTeammate[admin].g_iHurtMode = iGetKeyValue(subsection, MT_HURT_SECTION, MT_HURT_SECTION2, MT_HURT_SECTION3, MT_HURT_SECTION4, key, "HurtMode", "Hurt Mode", "Hurt_Mode", "mode", g_esHurtTeammate[admin].g_iHurtMode, value, -1, 3); g_esHurtTeammate[admin].g_flHurtRange = flGetKeyValue(subsection, MT_HURT_SECTION, MT_HURT_SECTION2, MT_HURT_SECTION3, MT_HURT_SECTION4, key, "HurtRange", "Hurt Range", "Hurt_Range", "range", g_esHurtTeammate[admin].g_flHurtRange, value, -1.0, 99999.0); g_esHurtTeammate[admin].g_flHurtRangeChance = flGetKeyValue(subsection, MT_HURT_SECTION, MT_HURT_SECTION2, MT_HURT_SECTION3, MT_HURT_SECTION4, key, "HurtRangeChance", "Hurt Range Chance", "Hurt_Range_Chance", "rangechance", g_esHurtTeammate[admin].g_flHurtRangeChance, value, -1.0, 100.0); g_esHurtTeammate[admin].g_iHurtRangeCooldown = iGetKeyValue(subsection, MT_HURT_SECTION, MT_HURT_SECTION2, MT_HURT_SECTION3, MT_HURT_SECTION4, key, "HurtRangeCooldown", "Hurt Range Cooldown", "Hurt_Range_Cooldown", "rangecooldown", g_esHurtTeammate[admin].g_iHurtRangeCooldown, value, -1, 99999); @@ -754,6 +766,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esHurtPlayer[admin].g_iHurtHit = iGetKeyValue(subsection, MT_HURT_SECTION, MT_HURT_SECTION2, MT_HURT_SECTION3, MT_HURT_SECTION4, key, "HurtHit", "Hurt Hit", "Hurt_Hit", "hit", g_esHurtPlayer[admin].g_iHurtHit, value, -1, 1); g_esHurtPlayer[admin].g_iHurtHitMode = iGetKeyValue(subsection, MT_HURT_SECTION, MT_HURT_SECTION2, MT_HURT_SECTION3, MT_HURT_SECTION4, key, "HurtHitMode", "Hurt Hit Mode", "Hurt_Hit_Mode", "hitmode", g_esHurtPlayer[admin].g_iHurtHitMode, value, -1, 2); g_esHurtPlayer[admin].g_flHurtInterval = flGetKeyValue(subsection, MT_HURT_SECTION, MT_HURT_SECTION2, MT_HURT_SECTION3, MT_HURT_SECTION4, key, "HurtInterval", "Hurt Interval", "Hurt_Interval", "interval", g_esHurtPlayer[admin].g_flHurtInterval, value, -1.0, 99999.0); + g_esHurtPlayer[admin].g_iHurtMode = iGetKeyValue(subsection, MT_HURT_SECTION, MT_HURT_SECTION2, MT_HURT_SECTION3, MT_HURT_SECTION4, key, "HurtMode", "Hurt Mode", "Hurt_Mode", "mode", g_esHurtPlayer[admin].g_iHurtMode, value, -1, 3); g_esHurtPlayer[admin].g_flHurtRange = flGetKeyValue(subsection, MT_HURT_SECTION, MT_HURT_SECTION2, MT_HURT_SECTION3, MT_HURT_SECTION4, key, "HurtRange", "Hurt Range", "Hurt_Range", "range", g_esHurtPlayer[admin].g_flHurtRange, value, -1.0, 99999.0); g_esHurtPlayer[admin].g_flHurtRangeChance = flGetKeyValue(subsection, MT_HURT_SECTION, MT_HURT_SECTION2, MT_HURT_SECTION3, MT_HURT_SECTION4, key, "HurtRangeChance", "Hurt Range Chance", "Hurt_Range_Chance", "rangechance", g_esHurtPlayer[admin].g_flHurtRangeChance, value, -1.0, 100.0); g_esHurtPlayer[admin].g_iHurtRangeCooldown = iGetKeyValue(subsection, MT_HURT_SECTION, MT_HURT_SECTION2, MT_HURT_SECTION3, MT_HURT_SECTION4, key, "HurtRangeCooldown", "Hurt Range Cooldown", "Hurt_Range_Cooldown", "rangecooldown", g_esHurtPlayer[admin].g_iHurtRangeCooldown, value, -1, 99999); @@ -785,6 +798,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esHurtSpecial[type].g_iHurtHit = iGetKeyValue(subsection, MT_HURT_SECTION, MT_HURT_SECTION2, MT_HURT_SECTION3, MT_HURT_SECTION4, key, "HurtHit", "Hurt Hit", "Hurt_Hit", "hit", g_esHurtSpecial[type].g_iHurtHit, value, -1, 1); g_esHurtSpecial[type].g_iHurtHitMode = iGetKeyValue(subsection, MT_HURT_SECTION, MT_HURT_SECTION2, MT_HURT_SECTION3, MT_HURT_SECTION4, key, "HurtHitMode", "Hurt Hit Mode", "Hurt_Hit_Mode", "hitmode", g_esHurtSpecial[type].g_iHurtHitMode, value, -1, 2); g_esHurtSpecial[type].g_flHurtInterval = flGetKeyValue(subsection, MT_HURT_SECTION, MT_HURT_SECTION2, MT_HURT_SECTION3, MT_HURT_SECTION4, key, "HurtInterval", "Hurt Interval", "Hurt_Interval", "interval", g_esHurtSpecial[type].g_flHurtInterval, value, -1.0, 99999.0); + g_esHurtSpecial[type].g_iHurtMode = iGetKeyValue(subsection, MT_HURT_SECTION, MT_HURT_SECTION2, MT_HURT_SECTION3, MT_HURT_SECTION4, key, "HurtMode", "Hurt Mode", "Hurt_Mode", "mode", g_esHurtSpecial[type].g_iHurtMode, value, -1, 3); g_esHurtSpecial[type].g_flHurtRange = flGetKeyValue(subsection, MT_HURT_SECTION, MT_HURT_SECTION2, MT_HURT_SECTION3, MT_HURT_SECTION4, key, "HurtRange", "Hurt Range", "Hurt_Range", "range", g_esHurtSpecial[type].g_flHurtRange, value, -1.0, 99999.0); g_esHurtSpecial[type].g_flHurtRangeChance = flGetKeyValue(subsection, MT_HURT_SECTION, MT_HURT_SECTION2, MT_HURT_SECTION3, MT_HURT_SECTION4, key, "HurtRangeChance", "Hurt Range Chance", "Hurt_Range_Chance", "rangechance", g_esHurtSpecial[type].g_flHurtRangeChance, value, -1.0, 100.0); g_esHurtSpecial[type].g_iHurtRangeCooldown = iGetKeyValue(subsection, MT_HURT_SECTION, MT_HURT_SECTION2, MT_HURT_SECTION3, MT_HURT_SECTION4, key, "HurtRangeCooldown", "Hurt Range Cooldown", "Hurt_Range_Cooldown", "rangecooldown", g_esHurtSpecial[type].g_iHurtRangeCooldown, value, -1, 99999); @@ -810,6 +824,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esHurtAbility[type].g_iHurtHit = iGetKeyValue(subsection, MT_HURT_SECTION, MT_HURT_SECTION2, MT_HURT_SECTION3, MT_HURT_SECTION4, key, "HurtHit", "Hurt Hit", "Hurt_Hit", "hit", g_esHurtAbility[type].g_iHurtHit, value, -1, 1); g_esHurtAbility[type].g_iHurtHitMode = iGetKeyValue(subsection, MT_HURT_SECTION, MT_HURT_SECTION2, MT_HURT_SECTION3, MT_HURT_SECTION4, key, "HurtHitMode", "Hurt Hit Mode", "Hurt_Hit_Mode", "hitmode", g_esHurtAbility[type].g_iHurtHitMode, value, -1, 2); g_esHurtAbility[type].g_flHurtInterval = flGetKeyValue(subsection, MT_HURT_SECTION, MT_HURT_SECTION2, MT_HURT_SECTION3, MT_HURT_SECTION4, key, "HurtInterval", "Hurt Interval", "Hurt_Interval", "interval", g_esHurtAbility[type].g_flHurtInterval, value, -1.0, 99999.0); + g_esHurtAbility[type].g_iHurtMode = iGetKeyValue(subsection, MT_HURT_SECTION, MT_HURT_SECTION2, MT_HURT_SECTION3, MT_HURT_SECTION4, key, "HurtMode", "Hurt Mode", "Hurt_Mode", "mode", g_esHurtAbility[type].g_iHurtMode, value, -1, 3); g_esHurtAbility[type].g_flHurtRange = flGetKeyValue(subsection, MT_HURT_SECTION, MT_HURT_SECTION2, MT_HURT_SECTION3, MT_HURT_SECTION4, key, "HurtRange", "Hurt Range", "Hurt_Range", "range", g_esHurtAbility[type].g_flHurtRange, value, -1.0, 99999.0); g_esHurtAbility[type].g_flHurtRangeChance = flGetKeyValue(subsection, MT_HURT_SECTION, MT_HURT_SECTION2, MT_HURT_SECTION3, MT_HURT_SECTION4, key, "HurtRangeChance", "Hurt Range Chance", "Hurt_Range_Chance", "rangechance", g_esHurtAbility[type].g_flHurtRangeChance, value, -1.0, 100.0); g_esHurtAbility[type].g_iHurtRangeCooldown = iGetKeyValue(subsection, MT_HURT_SECTION, MT_HURT_SECTION2, MT_HURT_SECTION3, MT_HURT_SECTION4, key, "HurtRangeCooldown", "Hurt Range Cooldown", "Hurt_Range_Cooldown", "rangecooldown", g_esHurtAbility[type].g_iHurtRangeCooldown, value, -1, 99999); @@ -829,7 +844,9 @@ public void MT_OnSettingsCached(int tank, bool apply, int type) g_esHurtPlayer[tank].g_iTankTypeRecorded = apply ? MT_GetRecordedTankType(tank, type) : 0; g_esHurtPlayer[tank].g_iTankType = apply ? type : 0; int iType = g_esHurtPlayer[tank].g_iTankTypeRecorded; - +#if !defined MT_ABILITIES_MAIN + g_iGraphicsLevel = MT_GetGraphicsLevel(); +#endif if (bIsSpecialInfected(tank, MT_CHECK_INDEX|MT_CHECK_INGAME)) { g_esHurtCache[tank].g_flCloseAreasOnly = flGetSubSettingValue(apply, bHuman, g_esHurtTeammate[tank].g_flCloseAreasOnly, g_esHurtPlayer[tank].g_flCloseAreasOnly, g_esHurtSpecial[iType].g_flCloseAreasOnly, g_esHurtAbility[iType].g_flCloseAreasOnly, 1); @@ -850,6 +867,7 @@ public void MT_OnSettingsCached(int tank, bool apply, int type) g_esHurtCache[tank].g_iHurtHit = iGetSubSettingValue(apply, bHuman, g_esHurtTeammate[tank].g_iHurtHit, g_esHurtPlayer[tank].g_iHurtHit, g_esHurtSpecial[iType].g_iHurtHit, g_esHurtAbility[iType].g_iHurtHit, 1); g_esHurtCache[tank].g_iHurtHitMode = iGetSubSettingValue(apply, bHuman, g_esHurtTeammate[tank].g_iHurtHitMode, g_esHurtPlayer[tank].g_iHurtHitMode, g_esHurtSpecial[iType].g_iHurtHitMode, g_esHurtAbility[iType].g_iHurtHitMode, 1); g_esHurtCache[tank].g_iHurtMessage = iGetSubSettingValue(apply, bHuman, g_esHurtTeammate[tank].g_iHurtMessage, g_esHurtPlayer[tank].g_iHurtMessage, g_esHurtSpecial[iType].g_iHurtMessage, g_esHurtAbility[iType].g_iHurtMessage, 1); + g_esHurtCache[tank].g_iHurtMode = iGetSubSettingValue(apply, bHuman, g_esHurtTeammate[tank].g_iHurtMode, g_esHurtPlayer[tank].g_iHurtMode, g_esHurtSpecial[iType].g_iHurtMode, g_esHurtAbility[iType].g_iHurtMode, 1); g_esHurtCache[tank].g_iHurtRangeCooldown = iGetSubSettingValue(apply, bHuman, g_esHurtTeammate[tank].g_iHurtRangeCooldown, g_esHurtPlayer[tank].g_iHurtRangeCooldown, g_esHurtSpecial[iType].g_iHurtRangeCooldown, g_esHurtAbility[iType].g_iHurtRangeCooldown, 1); g_esHurtCache[tank].g_iHurtSight = iGetSubSettingValue(apply, bHuman, g_esHurtTeammate[tank].g_iHurtSight, g_esHurtPlayer[tank].g_iHurtSight, g_esHurtSpecial[iType].g_iHurtSight, g_esHurtAbility[iType].g_iHurtSight, 1); g_esHurtCache[tank].g_flOpenAreasOnly = flGetSubSettingValue(apply, bHuman, g_esHurtTeammate[tank].g_flOpenAreasOnly, g_esHurtPlayer[tank].g_flOpenAreasOnly, g_esHurtSpecial[iType].g_flOpenAreasOnly, g_esHurtAbility[iType].g_flOpenAreasOnly, 1); @@ -875,6 +893,7 @@ public void MT_OnSettingsCached(int tank, bool apply, int type) g_esHurtCache[tank].g_iHurtHit = iGetSettingValue(apply, bHuman, g_esHurtPlayer[tank].g_iHurtHit, g_esHurtAbility[iType].g_iHurtHit, 1); g_esHurtCache[tank].g_iHurtHitMode = iGetSettingValue(apply, bHuman, g_esHurtPlayer[tank].g_iHurtHitMode, g_esHurtAbility[iType].g_iHurtHitMode, 1); g_esHurtCache[tank].g_iHurtMessage = iGetSettingValue(apply, bHuman, g_esHurtPlayer[tank].g_iHurtMessage, g_esHurtAbility[iType].g_iHurtMessage, 1); + g_esHurtCache[tank].g_iHurtMode = iGetSettingValue(apply, bHuman, g_esHurtPlayer[tank].g_iHurtMode, g_esHurtAbility[iType].g_iHurtMode, 1); g_esHurtCache[tank].g_iHurtRangeCooldown = iGetSettingValue(apply, bHuman, g_esHurtPlayer[tank].g_iHurtRangeCooldown, g_esHurtAbility[iType].g_iHurtRangeCooldown, 1); g_esHurtCache[tank].g_iHurtSight = iGetSettingValue(apply, bHuman, g_esHurtPlayer[tank].g_iHurtSight, g_esHurtAbility[iType].g_iHurtSight, 1); g_esHurtCache[tank].g_flOpenAreasOnly = flGetSettingValue(apply, bHuman, g_esHurtPlayer[tank].g_flOpenAreasOnly, g_esHurtAbility[iType].g_flOpenAreasOnly, 1); @@ -1137,8 +1156,17 @@ void vHurtHit(int survivor, int tank, float random, float chance, int enabled, i { char sTankName[64]; MT_GetTankName(tank, sTankName); - MT_PrintToChatAll("%s %t", MT_TAG2, "Hurt", sTankName, survivor); - MT_LogMessage(MT_LOG_ABILITY, "%s %T", MT_TAG, "Hurt", LANG_SERVER, sTankName, survivor); + if (g_esHurtCache[tank].g_iHurtMode == 0 || g_esHurtCache[tank].g_iHurtMode == 1) + { + MT_PrintToChatAll("%s %t", MT_TAG2, "Hurt", sTankName, survivor); + MT_LogMessage(MT_LOG_ABILITY, "%s %T", MT_TAG, "Hurt", LANG_SERVER, sTankName, survivor); + } + + if (g_esHurtCache[tank].g_iHurtMode == 0 || g_esHurtCache[tank].g_iHurtMode == 2) + { + MT_PrintToChatAll("%s %t", MT_TAG2, "Hurt3", sTankName, survivor); + MT_LogMessage(MT_LOG_ABILITY, "%s %T", MT_TAG, "Hurt3", LANG_SERVER, sTankName, survivor); + } } } else if ((flags & MT_ATTACK_RANGE) && (g_esHurtPlayer[tank].g_iRangeCooldown == -1 || g_esHurtPlayer[tank].g_iRangeCooldown <= iTime)) @@ -1201,8 +1229,17 @@ void vHurtReset2(int survivor, int tank, int messages) if (g_esHurtCache[tank].g_iHurtMessage & messages) { - MT_PrintToChatAll("%s %t", MT_TAG2, "Hurt2", survivor); - MT_LogMessage(MT_LOG_ABILITY, "%s %T", MT_TAG, "Hurt2", LANG_SERVER, survivor); + if (g_esHurtCache[tank].g_iHurtMode == 0 || g_esHurtCache[tank].g_iHurtMode == 1) + { + MT_PrintToChatAll("%s %t", MT_TAG2, "Hurt2", survivor); + MT_LogMessage(MT_LOG_ABILITY, "%s %T", MT_TAG, "Hurt2", LANG_SERVER, survivor); + } + + if (g_esHurtCache[tank].g_iHurtMode == 0 || g_esHurtCache[tank].g_iHurtMode == 2) + { + MT_PrintToChatAll("%s %t", MT_TAG2, "Hurt4", survivor); + MT_LogMessage(MT_LOG_ABILITY, "%s %T", MT_TAG, "Hurt4", LANG_SERVER, survivor); + } } } @@ -1216,35 +1253,37 @@ void vHurtReset3(int tank) g_esHurtPlayer[tank].g_iRangeCooldown = -1; } -void tTimerHurtCombo(Handle timer, DataPack pack) +Action tTimerHurtCombo(Handle timer, DataPack pack) { pack.Reset(); int iTank = GetClientOfUserId(pack.ReadCell()); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esHurtAbility[g_esHurtPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esHurtPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esHurtPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esHurtCache[iTank].g_iHurtAbility == 0) { - return; + return Plugin_Stop; } float flRandom = pack.ReadFloat(); int iPos = pack.ReadCell(); vHurtAbility(iTank, flRandom, iPos); + + return Plugin_Continue; } -void tTimerHurtCombo2(Handle timer, DataPack pack) +Action tTimerHurtCombo2(Handle timer, DataPack pack) { pack.Reset(); int iSurvivor = GetClientOfUserId(pack.ReadCell()); if (!bIsSurvivor(iSurvivor) || g_esHurtPlayer[iSurvivor].g_bAffected) { - return; + return Plugin_Stop; } int iTank = GetClientOfUserId(pack.ReadCell()); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esHurtAbility[g_esHurtPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esHurtPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esHurtPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esHurtCache[iTank].g_iHurtHit == 0) { - return; + return Plugin_Stop; } float flRandom = pack.ReadFloat(), flChance = pack.ReadFloat(); @@ -1259,6 +1298,8 @@ void tTimerHurtCombo2(Handle timer, DataPack pack) { vHurtHit(iSurvivor, iTank, flRandom, flChance, g_esHurtCache[iTank].g_iHurtHit, MT_MESSAGE_MELEE, MT_ATTACK_MELEE, iPos); } + + return Plugin_Continue; } Action tTimerHurt(Handle timer, DataPack pack) @@ -1300,11 +1341,22 @@ Action tTimerHurt(Handle timer, DataPack pack) float flDamage = (iPos != -1) ? MT_GetCombinationSetting(iTank, 3, iPos) : g_esHurtCache[iTank].g_flHurtDamage; if (flDamage > 0.0) { - vDamagePlayer(iSurvivor, iTank, MT_GetScaledDamage(flDamage)); - } + if (g_esHurtCache[iTank].g_iHurtMode == 0 || g_esHurtCache[iTank].g_iHurtMode == 1) + { + vDamagePlayer(iSurvivor, iTank, MT_GetScaledDamage(flDamage)); + EmitSoundToAll(SOUND_ATTACK, iSurvivor); + } + + if (g_esHurtCache[iTank].g_iHurtMode == 0 || g_esHurtCache[iTank].g_iHurtMode == 2) + { + SlapPlayer(iSurvivor, RoundToNearest(MT_GetScaledDamage(flDamage)), true); + } - vAttachParticle(iSurvivor, PARTICLE_BLOOD, 0.1); - EmitSoundToAll(SOUND_ATTACK, iSurvivor); + if (g_iGraphicsLevel > 2) + { + vAttachParticle(iSurvivor, PARTICLE_BLOOD, 0.1); + } + } return Plugin_Continue; } \ No newline at end of file diff --git a/addons/sourcemod/scripting/mutant_tanks/abilities/mt_hypno.sp b/addons/sourcemod/scripting/mutant_tanks/abilities/mt_hypno.sp index 2c087bf054..bcd02a78d4 100644 --- a/addons/sourcemod/scripting/mutant_tanks/abilities/mt_hypno.sp +++ b/addons/sourcemod/scripting/mutant_tanks/abilities/mt_hypno.sp @@ -1,6 +1,6 @@ /** - * Mutant Tanks: a L4D/L4D2 SourceMod Plugin - * Copyright (C) 2024 Alfred "Psyk0tik" Llagas + * Mutant Tanks: A L4D/L4D2 SourceMod Plugin + * Copyright (C) 2017-2025 Alfred "Psyk0tik" Llagas * * 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. * @@ -29,6 +29,8 @@ public Plugin myinfo = bool g_bDedicated, g_bLateLoad; +int g_iGraphicsLevel; + public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max) { EngineVersion evEngine = GetEngineVersion(); @@ -1030,7 +1032,9 @@ public void MT_OnSettingsCached(int tank, bool apply, int type) g_esHypnoPlayer[tank].g_iTankTypeRecorded = apply ? MT_GetRecordedTankType(tank, type) : 0; g_esHypnoPlayer[tank].g_iTankType = apply ? type : 0; int iType = g_esHypnoPlayer[tank].g_iTankTypeRecorded; - +#if !defined MT_ABILITIES_MAIN + g_iGraphicsLevel = MT_GetGraphicsLevel(); +#endif if (bInfected) { g_esHypnoCache[tank].g_flCloseAreasOnly = flGetSubSettingValue(apply, bHuman, g_esHypnoTeammate[tank].g_flCloseAreasOnly, g_esHypnoPlayer[tank].g_flCloseAreasOnly, g_esHypnoSpecial[iType].g_flCloseAreasOnly, g_esHypnoAbility[iType].g_flCloseAreasOnly, 1); @@ -1264,38 +1268,41 @@ void vHypno(int tank) { g_esHypnoPlayer[tank].g_bActivated = true; - g_esHypnoPlayer[tank].g_iShield = CreateEntityByName("prop_dynamic"); - if (bIsValidEntity(g_esHypnoPlayer[tank].g_iShield)) + if (g_iGraphicsLevel > 1) { - float flOrigin[3]; - GetClientAbsOrigin(tank, flOrigin); - flOrigin[2] -= 120.0; + g_esHypnoPlayer[tank].g_iShield = CreateEntityByName("prop_dynamic"); + if (bIsValidEntity(g_esHypnoPlayer[tank].g_iShield)) + { + float flOrigin[3]; + GetClientAbsOrigin(tank, flOrigin); + flOrigin[2] -= 120.0; - SetEntityModel(g_esHypnoPlayer[tank].g_iShield, MODEL_SHIELD); - DispatchKeyValueVector(g_esHypnoPlayer[tank].g_iShield, "origin", flOrigin); - DispatchSpawn(g_esHypnoPlayer[tank].g_iShield); - vSetEntityParent(g_esHypnoPlayer[tank].g_iShield, tank, true); + SetEntityModel(g_esHypnoPlayer[tank].g_iShield, MODEL_SHIELD); + DispatchKeyValueVector(g_esHypnoPlayer[tank].g_iShield, "origin", flOrigin); + DispatchSpawn(g_esHypnoPlayer[tank].g_iShield); + vSetEntityParent(g_esHypnoPlayer[tank].g_iShield, tank, true); - switch (StrEqual(g_esHypnoPlayer[tank].g_sHypnoColor, "rainbow", false)) - { - case true: + switch (StrEqual(g_esHypnoPlayer[tank].g_sHypnoColor, "rainbow", false) && g_iGraphicsLevel > 2) { - if (!g_esHypnoPlayer[tank].g_bRainbowColor) + case true: { - g_esHypnoPlayer[tank].g_bRainbowColor = SDKHookEx(tank, SDKHook_PreThinkPost, OnHypnoPreThinkPost); + if (!g_esHypnoPlayer[tank].g_bRainbowColor) + { + g_esHypnoPlayer[tank].g_bRainbowColor = SDKHookEx(tank, SDKHook_PreThinkPost, OnHypnoPreThinkPost); + } + } + case false: + { + SetEntityRenderMode(g_esHypnoPlayer[tank].g_iShield, RENDER_TRANSTEXTURE); + SetEntityRenderColor(g_esHypnoPlayer[tank].g_iShield, iGetRandomColor(g_esHypnoCache[tank].g_iHypnoColor[0]), iGetRandomColor(g_esHypnoCache[tank].g_iHypnoColor[1]), iGetRandomColor(g_esHypnoCache[tank].g_iHypnoColor[2]), iGetRandomColor(g_esHypnoCache[tank].g_iHypnoColor[3])); } } - case false: - { - SetEntityRenderMode(g_esHypnoPlayer[tank].g_iShield, RENDER_TRANSTEXTURE); - SetEntityRenderColor(g_esHypnoPlayer[tank].g_iShield, iGetRandomColor(g_esHypnoCache[tank].g_iHypnoColor[0]), iGetRandomColor(g_esHypnoCache[tank].g_iHypnoColor[1]), iGetRandomColor(g_esHypnoCache[tank].g_iHypnoColor[2]), iGetRandomColor(g_esHypnoCache[tank].g_iHypnoColor[3])); - } - } - SetEntProp(g_esHypnoPlayer[tank].g_iShield, Prop_Send, "m_CollisionGroup", 1); - MT_HideEntity(g_esHypnoPlayer[tank].g_iShield, true); - SDKHook(g_esHypnoPlayer[tank].g_iShield, SDKHook_SetTransmit, OnHypnoSetTransmit); - g_esHypnoPlayer[tank].g_iShield = EntIndexToEntRef(g_esHypnoPlayer[tank].g_iShield); + SetEntProp(g_esHypnoPlayer[tank].g_iShield, Prop_Send, "m_CollisionGroup", 1); + MT_HideEntity(g_esHypnoPlayer[tank].g_iShield, true); + SDKHook(g_esHypnoPlayer[tank].g_iShield, SDKHook_SetTransmit, OnHypnoSetTransmit); + g_esHypnoPlayer[tank].g_iShield = EntIndexToEntRef(g_esHypnoPlayer[tank].g_iShield); + } } } } @@ -1442,7 +1449,7 @@ void vHypnoHit(int survivor, int tank, float random, float chance, int enabled, void OnHypnoPreThinkPost(int tank) { - if (!MT_IsTankSupported(tank) || !MT_IsCustomTankSupported(tank) || !g_esHypnoPlayer[tank].g_bRainbowColor) + if (!MT_IsTankSupported(tank) || !MT_IsCustomTankSupported(tank) || !g_esHypnoPlayer[tank].g_bRainbowColor || g_iGraphicsLevel <= 2) { g_esHypnoPlayer[tank].g_bRainbowColor = false; @@ -1554,35 +1561,37 @@ void vHypnoReset2(int tank) g_esHypnoPlayer[tank].g_iRangeCooldown = -1; } -void tTimerHypnoCombo(Handle timer, DataPack pack) +Action tTimerHypnoCombo(Handle timer, DataPack pack) { pack.Reset(); int iTank = GetClientOfUserId(pack.ReadCell()); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esHypnoAbility[g_esHypnoPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esHypnoPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esHypnoPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esHypnoCache[iTank].g_iHypnoAbility == 0) { - return; + return Plugin_Stop; } float flRandom = pack.ReadFloat(); int iPos = pack.ReadCell(); vHypnoAbility(iTank, flRandom, iPos); + + return Plugin_Continue; } -void tTimerHypnoCombo2(Handle timer, DataPack pack) +Action tTimerHypnoCombo2(Handle timer, DataPack pack) { pack.Reset(); int iSurvivor = GetClientOfUserId(pack.ReadCell()); if (!bIsSurvivor(iSurvivor) || g_esHypnoPlayer[iSurvivor].g_bAffected) { - return; + return Plugin_Stop; } int iTank = GetClientOfUserId(pack.ReadCell()); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esHypnoAbility[g_esHypnoPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esHypnoPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esHypnoPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esHypnoCache[iTank].g_iHypnoHit == 0) { - return; + return Plugin_Stop; } float flRandom = pack.ReadFloat(), flChance = pack.ReadFloat(); @@ -1597,9 +1606,11 @@ void tTimerHypnoCombo2(Handle timer, DataPack pack) { vHypnoHit(iSurvivor, iTank, flRandom, flChance, g_esHypnoCache[iTank].g_iHypnoHit, MT_MESSAGE_MELEE, MT_ATTACK_MELEE, iPos); } + + return Plugin_Continue; } -void tTimerStopHypno(Handle timer, DataPack pack) +Action tTimerStopHypno(Handle timer, DataPack pack) { pack.Reset(); @@ -1609,7 +1620,7 @@ void tTimerStopHypno(Handle timer, DataPack pack) g_esHypnoPlayer[iSurvivor].g_bAffected = false; g_esHypnoPlayer[iSurvivor].g_iOwner = -1; - return; + return Plugin_Stop; } int iTank = GetClientOfUserId(pack.ReadCell()); @@ -1618,7 +1629,7 @@ void tTimerStopHypno(Handle timer, DataPack pack) g_esHypnoPlayer[iSurvivor].g_bAffected = false; g_esHypnoPlayer[iSurvivor].g_iOwner = -1; - return; + return Plugin_Stop; } g_esHypnoPlayer[iSurvivor].g_bAffected = false; @@ -1630,4 +1641,6 @@ void tTimerStopHypno(Handle timer, DataPack pack) MT_PrintToChatAll("%s %t", MT_TAG2, "Hypno2", iSurvivor); MT_LogMessage(MT_LOG_ABILITY, "%s %T", MT_TAG, "Hypno2", LANG_SERVER, iSurvivor); } + + return Plugin_Continue; } \ No newline at end of file diff --git a/addons/sourcemod/scripting/mutant_tanks/abilities/mt_ice.sp b/addons/sourcemod/scripting/mutant_tanks/abilities/mt_ice.sp index 8d5b345a6c..dca91c4f14 100644 --- a/addons/sourcemod/scripting/mutant_tanks/abilities/mt_ice.sp +++ b/addons/sourcemod/scripting/mutant_tanks/abilities/mt_ice.sp @@ -1,6 +1,6 @@ /** - * Mutant Tanks: a L4D/L4D2 SourceMod Plugin - * Copyright (C) 2024 Alfred "Psyk0tik" Llagas + * Mutant Tanks: A L4D/L4D2 SourceMod Plugin + * Copyright (C) 2017-2025 Alfred "Psyk0tik" Llagas * * 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. * @@ -432,7 +432,7 @@ public Action OnPlayerRunCmd(int client, int &buttons, int &impulse, float vel[3 { TeleportEntity(client, .angles = g_esIcePlayer[client].g_flAngle); - int iWeapon = GetEntPropEnt(client, Prop_Send, "m_hActiveWeapon"); + int iWeapon = iGetSurvivorActiveWeapon(client); if (iWeapon > MaxClients && g_esIcePlayer[client].g_flDuration > 0.0) { SetEntPropFloat(iWeapon, Prop_Send, "m_flNextPrimaryAttack", g_esIcePlayer[client].g_flDuration); @@ -1124,7 +1124,7 @@ void vIceHit(int survivor, int tank, float random, float chance, int enabled, in float flDuration = (pos != -1) ? MT_GetCombinationSetting(tank, 5, pos) : g_esIceCache[tank].g_flIceDuration; if (flDuration > 0.0) { - int iWeapon = GetEntPropEnt(survivor, Prop_Send, "m_hActiveWeapon"); + int iWeapon = iGetSurvivorActiveWeapon(survivor); if (iWeapon > MaxClients) { g_esIcePlayer[survivor].g_flDuration = GetGameTime() + flDuration; @@ -1263,35 +1263,37 @@ void vStopIce(int survivor, bool all = true) } } -void tTimerIceCombo(Handle timer, DataPack pack) +Action tTimerIceCombo(Handle timer, DataPack pack) { pack.Reset(); int iTank = GetClientOfUserId(pack.ReadCell()); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esIceAbility[g_esIcePlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esIcePlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esIcePlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esIceCache[iTank].g_iIceAbility == 0) { - return; + return Plugin_Stop; } float flRandom = pack.ReadFloat(); int iPos = pack.ReadCell(); vIceAbility(iTank, flRandom, iPos); + + return Plugin_Continue; } -void tTimerIceCombo2(Handle timer, DataPack pack) +Action tTimerIceCombo2(Handle timer, DataPack pack) { pack.Reset(); int iSurvivor = GetClientOfUserId(pack.ReadCell()); if (!bIsSurvivor(iSurvivor) || g_esIcePlayer[iSurvivor].g_bAffected) { - return; + return Plugin_Stop; } int iTank = GetClientOfUserId(pack.ReadCell()); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esIceAbility[g_esIcePlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esIcePlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esIcePlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esIceCache[iTank].g_iIceHit == 0) { - return; + return Plugin_Stop; } float flRandom = pack.ReadFloat(), flChance = pack.ReadFloat(); @@ -1306,9 +1308,11 @@ void tTimerIceCombo2(Handle timer, DataPack pack) { vIceHit(iSurvivor, iTank, flRandom, flChance, g_esIceCache[iTank].g_iIceHit, MT_MESSAGE_MELEE, MT_ATTACK_MELEE, iPos); } + + return Plugin_Continue; } -void tTimerStopIce(Handle timer, DataPack pack) +Action tTimerStopIce(Handle timer, DataPack pack) { pack.Reset(); @@ -1318,7 +1322,7 @@ void tTimerStopIce(Handle timer, DataPack pack) g_esIcePlayer[iSurvivor].g_bAffected = false; g_esIcePlayer[iSurvivor].g_iOwner = -1; - return; + return Plugin_Stop; } int iTank = GetClientOfUserId(pack.ReadCell()); @@ -1326,7 +1330,7 @@ void tTimerStopIce(Handle timer, DataPack pack) { vStopIce(iSurvivor); - return; + return Plugin_Stop; } vStopIce(iSurvivor); @@ -1337,4 +1341,6 @@ void tTimerStopIce(Handle timer, DataPack pack) MT_PrintToChatAll("%s %t", MT_TAG2, "Ice2", iSurvivor); MT_LogMessage(MT_LOG_ABILITY, "%s %T", MT_TAG, "Ice2", LANG_SERVER, iSurvivor); } + + return Plugin_Continue; } \ No newline at end of file diff --git a/addons/sourcemod/scripting/mutant_tanks/abilities/mt_idle.sp b/addons/sourcemod/scripting/mutant_tanks/abilities/mt_idle.sp index 77d1b063e1..0fde85304f 100644 --- a/addons/sourcemod/scripting/mutant_tanks/abilities/mt_idle.sp +++ b/addons/sourcemod/scripting/mutant_tanks/abilities/mt_idle.sp @@ -1,6 +1,6 @@ /** - * Mutant Tanks: a L4D/L4D2 SourceMod Plugin - * Copyright (C) 2024 Alfred "Psyk0tik" Llagas + * Mutant Tanks: A L4D/L4D2 SourceMod Plugin + * Copyright (C) 2017-2025 Alfred "Psyk0tik" Llagas * * 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. * @@ -1154,35 +1154,37 @@ void vIdleReset() } } -void tTimerIdleCombo(Handle timer, DataPack pack) +Action tTimerIdleCombo(Handle timer, DataPack pack) { pack.Reset(); int iTank = GetClientOfUserId(pack.ReadCell()); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esIdleAbility[g_esIdlePlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esIdlePlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esIdlePlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esIdleCache[iTank].g_iIdleAbility == 0) { - return; + return Plugin_Stop; } float flRandom = pack.ReadFloat(); int iPos = pack.ReadCell(); vIdleAbility(iTank, flRandom, iPos); + + return Plugin_Continue; } -void tTimerIdleCombo2(Handle timer, DataPack pack) +Action tTimerIdleCombo2(Handle timer, DataPack pack) { pack.Reset(); int iSurvivor = GetClientOfUserId(pack.ReadCell()); if (!bIsSurvivor(iSurvivor)) { - return; + return Plugin_Stop; } int iTank = GetClientOfUserId(pack.ReadCell()); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esIdleAbility[g_esIdlePlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esIdlePlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esIdlePlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esIdleCache[iTank].g_iIdleHit == 0) { - return; + return Plugin_Stop; } float flRandom = pack.ReadFloat(), flChance = pack.ReadFloat(); @@ -1197,4 +1199,6 @@ void tTimerIdleCombo2(Handle timer, DataPack pack) { vIdleHit(iSurvivor, iTank, flRandom, flChance, g_esIdleCache[iTank].g_iIdleHit, MT_MESSAGE_MELEE, MT_ATTACK_MELEE, iPos); } + + return Plugin_Continue; } \ No newline at end of file diff --git a/addons/sourcemod/scripting/mutant_tanks/abilities/mt_invert.sp b/addons/sourcemod/scripting/mutant_tanks/abilities/mt_invert.sp index 7cc169f618..61a9bf9291 100644 --- a/addons/sourcemod/scripting/mutant_tanks/abilities/mt_invert.sp +++ b/addons/sourcemod/scripting/mutant_tanks/abilities/mt_invert.sp @@ -1,6 +1,6 @@ /** - * Mutant Tanks: a L4D/L4D2 SourceMod Plugin - * Copyright (C) 2024 Alfred "Psyk0tik" Llagas + * Mutant Tanks: A L4D/L4D2 SourceMod Plugin + * Copyright (C) 2017-2025 Alfred "Psyk0tik" Llagas * * 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. * @@ -1184,35 +1184,37 @@ void vInvertReset2(int tank) g_esInvertPlayer[tank].g_iRangeCooldown = -1; } -void tTimerInvertCombo(Handle timer, DataPack pack) +Action tTimerInvertCombo(Handle timer, DataPack pack) { pack.Reset(); int iTank = GetClientOfUserId(pack.ReadCell()); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esInvertAbility[g_esInvertPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esInvertPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esInvertPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esInvertCache[iTank].g_iInvertAbility == 0) { - return; + return Plugin_Stop; } float flRandom = pack.ReadFloat(); int iPos = pack.ReadCell(); vInvertAbility(iTank, flRandom, iPos); + + return Plugin_Continue; } -void tTimerInvertCombo2(Handle timer, DataPack pack) +Action tTimerInvertCombo2(Handle timer, DataPack pack) { pack.Reset(); int iSurvivor = GetClientOfUserId(pack.ReadCell()); if (!bIsSurvivor(iSurvivor) || g_esInvertPlayer[iSurvivor].g_bAffected) { - return; + return Plugin_Stop; } int iTank = GetClientOfUserId(pack.ReadCell()); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esInvertAbility[g_esInvertPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esInvertPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esInvertPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esInvertCache[iTank].g_iInvertHit == 0) { - return; + return Plugin_Stop; } float flRandom = pack.ReadFloat(), flChance = pack.ReadFloat(); @@ -1227,9 +1229,11 @@ void tTimerInvertCombo2(Handle timer, DataPack pack) { vInvertHit(iSurvivor, iTank, flRandom, flChance, g_esInvertCache[iTank].g_iInvertHit, MT_MESSAGE_MELEE, MT_ATTACK_MELEE, iPos); } + + return Plugin_Continue; } -void tTimerStopInvert(Handle timer, DataPack pack) +Action tTimerStopInvert(Handle timer, DataPack pack) { pack.Reset(); @@ -1239,7 +1243,7 @@ void tTimerStopInvert(Handle timer, DataPack pack) g_esInvertPlayer[iSurvivor].g_bAffected = false; g_esInvertPlayer[iSurvivor].g_iOwner = -1; - return; + return Plugin_Stop; } int iTank = GetClientOfUserId(pack.ReadCell()); @@ -1248,7 +1252,7 @@ void tTimerStopInvert(Handle timer, DataPack pack) g_esInvertPlayer[iSurvivor].g_bAffected = false; g_esInvertPlayer[iSurvivor].g_iOwner = -1; - return; + return Plugin_Stop; } g_esInvertPlayer[iSurvivor].g_bAffected = false; @@ -1260,4 +1264,6 @@ void tTimerStopInvert(Handle timer, DataPack pack) MT_PrintToChatAll("%s %t", MT_TAG2, "Invert2", iSurvivor); MT_LogMessage(MT_LOG_ABILITY, "%s %T", MT_TAG, "Invert2", LANG_SERVER, iSurvivor); } + + return Plugin_Continue; } \ No newline at end of file diff --git a/addons/sourcemod/scripting/mutant_tanks/abilities/mt_item.sp b/addons/sourcemod/scripting/mutant_tanks/abilities/mt_item.sp deleted file mode 100644 index 2647c37162..0000000000 --- a/addons/sourcemod/scripting/mutant_tanks/abilities/mt_item.sp +++ /dev/null @@ -1,1077 +0,0 @@ -/** - * Mutant Tanks: a L4D/L4D2 SourceMod Plugin - * Copyright (C) 2024 Alfred "Psyk0tik" Llagas - * - * 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 . - **/ - -#define MT_ITEM_COMPILE_METHOD 0 // 0: packaged, 1: standalone - -#if !defined MT_ABILITIES_MAIN - #if MT_ITEM_COMPILE_METHOD == 1 - #include - #include - #else - #error This file must be inside "scripting/mutant_tanks/abilities" while compiling "mt_abilities.sp" to include its content. - #endif -public Plugin myinfo = -{ - name = "[MT] Item Ability", - author = MT_AUTHOR, - description = "The Mutant Tank gives survivors items upon death.", - version = MT_VERSION, - url = MT_URL -}; - -bool g_bDedicated; - -public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max) -{ - EngineVersion evEngine = GetEngineVersion(); - if (evEngine != Engine_Left4Dead && evEngine != Engine_Left4Dead2) - { - strcopy(error, err_max, "\"[MT] Item Ability\" only supports Left 4 Dead 1 & 2."); - - return APLRes_SilentFailure; - } - - g_bDedicated = IsDedicatedServer(); - - return APLRes_Success; -} - -#define MODEL_FIREWORKCRATE "models/props_junk/explosive_box001.mdl" // Only available in L4D2 -#define MODEL_OXYGENTANK "models/props_equipment/oxygentank01.mdl" -#define MODEL_PROPANETANK "models/props_junk/propanecanister001a.mdl" -#else - #if MT_ITEM_COMPILE_METHOD == 1 - #error This file must be compiled as a standalone plugin. - #endif -#endif - -#define MT_ITEM_SECTION "itemability" -#define MT_ITEM_SECTION2 "item ability" -#define MT_ITEM_SECTION3 "item_ability" -#define MT_ITEM_SECTION4 "item" - -#define MT_MENU_ITEM "Item Ability" - -enum struct esItemPlayer -{ - bool g_bActivated; - - char g_sGiveLoadout[325]; - char g_sItemLoadout[325]; - char g_sItemPinata[325]; - - float g_flCloseAreasOnly; - float g_flItemChance; - float g_flItemPinataChance; - float g_flOpenAreasOnly; - - int g_iAccessFlags; - int g_iComboAbility; - int g_iGiveMode; - int g_iHumanAbility; - int g_iImmunityFlags; - int g_iItemAbility; - int g_iItemMessage; - int g_iItemMode; - int g_iItemPinataBody; - int g_iRequiresHumans; - int g_iTankType; - int g_iTankTypeRecorded; -} - -esItemPlayer g_esItemPlayer[MAXPLAYERS + 1]; - -enum struct esItemTeammate -{ - char g_sItemLoadout[325]; - char g_sItemPinata[325]; - - float g_flCloseAreasOnly; - float g_flItemChance; - float g_flItemPinataChance; - float g_flOpenAreasOnly; - - int g_iComboAbility; - int g_iHumanAbility; - int g_iItemAbility; - int g_iItemMessage; - int g_iItemMode; - int g_iItemPinataBody; - int g_iRequiresHumans; -} - -esItemTeammate g_esItemTeammate[MAXPLAYERS + 1]; - -enum struct esItemAbility -{ - char g_sItemLoadout[325]; - char g_sItemPinata[325]; - - float g_flCloseAreasOnly; - float g_flItemChance; - float g_flItemPinataChance; - float g_flOpenAreasOnly; - - int g_iAccessFlags; - int g_iComboAbility; - int g_iHumanAbility; - int g_iImmunityFlags; - int g_iItemAbility; - int g_iItemMessage; - int g_iItemMode; - int g_iItemPinataBody; - int g_iRequiresHumans; -} - -esItemAbility g_esItemAbility[MT_MAXTYPES + 1]; - -enum struct esItemSpecial -{ - char g_sItemLoadout[325]; - char g_sItemPinata[325]; - - float g_flCloseAreasOnly; - float g_flItemChance; - float g_flItemPinataChance; - float g_flOpenAreasOnly; - - int g_iComboAbility; - int g_iHumanAbility; - int g_iItemAbility; - int g_iItemMessage; - int g_iItemMode; - int g_iItemPinataBody; - int g_iRequiresHumans; -} - -esItemSpecial g_esItemSpecial[MT_MAXTYPES + 1]; - -enum struct esItemCache -{ - char g_sItemLoadout[325]; - char g_sItemPinata[325]; - - float g_flCloseAreasOnly; - float g_flItemChance; - float g_flItemPinataChance; - float g_flOpenAreasOnly; - - int g_iComboAbility; - int g_iHumanAbility; - int g_iItemAbility; - int g_iItemMessage; - int g_iItemMode; - int g_iItemPinataBody; - int g_iRequiresHumans; -} - -esItemCache g_esItemCache[MAXPLAYERS + 1]; - -int g_iItemDeathModelOwner = 0; - -#if !defined MT_ABILITIES_MAIN -public void OnPluginStart() -{ - LoadTranslations("common.phrases"); - LoadTranslations("mutant_tanks.phrases"); - LoadTranslations("mutant_tanks_names.phrases"); - - RegConsoleCmd("sm_mt_item", cmdItemInfo, "View information about the Item ability."); -} -#endif - -#if defined MT_ABILITIES_MAIN -void vItemMapStart() -#else -public void OnMapStart() -#endif -{ - vItemReset(); -} - -#if defined MT_ABILITIES_MAIN -void vItemClientPutInServer(int client) -#else -public void OnClientPutInServer(int client) -#endif -{ - vItemReset2(client); -} - -#if defined MT_ABILITIES_MAIN -void vItemClientDisconnect_Post(int client) -#else -public void OnClientDisconnect_Post(int client) -#endif -{ - vItemReset2(client); -} - -#if defined MT_ABILITIES_MAIN -void vItemMapEnd() -#else -public void OnMapEnd() -#endif -{ - vItemReset(); -} - -#if !defined MT_ABILITIES_MAIN -Action cmdItemInfo(int client, int args) -{ - client = iGetListenServerHost(client, g_bDedicated); - - if (!MT_IsCorePluginEnabled()) - { - MT_ReplyToCommand(client, "%s %t", MT_TAG5, "PluginDisabled"); - - return Plugin_Handled; - } - - if (!bIsValidClient(client, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_FAKECLIENT)) - { - MT_ReplyToCommand(client, "%s %t", MT_TAG, "Command is in-game only"); - - return Plugin_Handled; - } - - switch (IsVoteInProgress()) - { - case true: MT_ReplyToCommand(client, "%s %t", MT_TAG2, "Vote in Progress"); - case false: vItemMenu(client, MT_ITEM_SECTION4, 0); - } - - return Plugin_Handled; -} -#endif - -void vItemMenu(int client, const char[] name, int item) -{ - if (StrContains(MT_ITEM_SECTION4, name, false) == -1) - { - return; - } - - Menu mAbilityMenu = new Menu(iItemMenuHandler, MENU_ACTIONS_DEFAULT|MenuAction_Display|MenuAction_DisplayItem); - mAbilityMenu.SetTitle("Item Ability Information"); - mAbilityMenu.AddItem("Status", "Status"); - mAbilityMenu.AddItem("Buttons", "Buttons"); - mAbilityMenu.AddItem("Details", "Details"); - mAbilityMenu.AddItem("Human Support", "Human Support"); - mAbilityMenu.DisplayAt(client, item, MENU_TIME_FOREVER); -} - -int iItemMenuHandler(Menu menu, MenuAction action, int param1, int param2) -{ - switch (action) - { - case MenuAction_End: delete menu; - case MenuAction_Select: - { - switch (param2) - { - case 0: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esItemCache[param1].g_iItemAbility == 0) ? "AbilityStatus1" : "AbilityStatus2"); - case 1: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtons4"); - case 2: MT_PrintToChat(param1, "%s %t", MT_TAG3, "ItemDetails"); - case 3: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esItemCache[param1].g_iHumanAbility == 0) ? "AbilityHumanSupport1" : "AbilityHumanSupport2"); - } - - if (bIsValidClient(param1, MT_CHECK_INGAME)) - { - vItemMenu(param1, MT_ITEM_SECTION4, menu.Selection); - } - } - case MenuAction_Display: - { - char sMenuTitle[PLATFORM_MAX_PATH]; - Panel pItem = view_as(param2); - FormatEx(sMenuTitle, sizeof sMenuTitle, "%T", "ItemMenu", param1); - pItem.SetTitle(sMenuTitle); - } - case MenuAction_DisplayItem: - { - if (param2 >= 0) - { - char sMenuOption[PLATFORM_MAX_PATH]; - - switch (param2) - { - case 0: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Status", param1); - case 1: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Buttons", param1); - case 2: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Details", param1); - case 3: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "HumanSupport", param1); - } - - return RedrawMenuItem(sMenuOption); - } - } - } - - return 0; -} - -#if defined MT_ABILITIES_MAIN -void vItemDisplayMenu(Menu menu) -#else -public void MT_OnDisplayMenu(Menu menu) -#endif -{ - menu.AddItem(MT_MENU_ITEM, MT_MENU_ITEM); -} - -#if defined MT_ABILITIES_MAIN -void vItemMenuItemSelected(int client, const char[] info) -#else -public void MT_OnMenuItemSelected(int client, const char[] info) -#endif -{ - if (StrEqual(info, MT_MENU_ITEM, false)) - { - vItemMenu(client, MT_ITEM_SECTION4, 0); - } -} - -#if defined MT_ABILITIES_MAIN -void vItemMenuItemDisplayed(int client, const char[] info, char[] buffer, int size) -#else -public void MT_OnMenuItemDisplayed(int client, const char[] info, char[] buffer, int size) -#endif -{ - if (StrEqual(info, MT_MENU_ITEM, false)) - { - FormatEx(buffer, size, "%T", "ItemMenu2", client); - } -} - -#if defined MT_ABILITIES_MAIN -void vItemEntityCreated(int entity, const char[] classname) -#else -public void OnEntityCreated(int entity, const char[] classname) -#endif -{ - if (bIsValidEntity(entity) && StrEqual(classname, "survivor_death_model")) - { - int iOwner = GetClientOfUserId(g_iItemDeathModelOwner); - if (bIsValidClient(iOwner)) - { - SDKHook(entity, SDKHook_SpawnPost, OnItemModelSpawnPost); - } - - g_iItemDeathModelOwner = 0; - } -} - -void OnItemModelSpawnPost(int model) -{ - g_iItemDeathModelOwner = 0; - - SDKUnhook(model, SDKHook_SpawnPost, OnItemModelSpawnPost); - - if (!bIsValidEntity(model)) - { - return; - } - - RemoveEntity(model); -} - -Action OnItemTakeDamage(int victim, int &attacker, int &inflictor, float &damage, int &damagetype) -{ - return Plugin_Handled; -} - -void OnItemUse(int entity, int activator, int caller, UseType type, float value) -{ - if (!bIsValidEntity(entity)) - { - return; - } - - SDKUnhook(entity, SDKHook_OnTakeDamage, OnItemTakeDamage); - SDKUnhook(entity, SDKHook_Use, OnItemUse); -} - -#if defined MT_ABILITIES_MAIN -void vItemPluginCheck(ArrayList list) -#else -public void MT_OnPluginCheck(ArrayList list) -#endif -{ - list.PushString(MT_MENU_ITEM); -} - -#if defined MT_ABILITIES_MAIN -void vItemAbilityCheck(ArrayList list, ArrayList list2, ArrayList list3, ArrayList list4) -#else -public void MT_OnAbilityCheck(ArrayList list, ArrayList list2, ArrayList list3, ArrayList list4) -#endif -{ - list.PushString(MT_ITEM_SECTION); - list2.PushString(MT_ITEM_SECTION2); - list3.PushString(MT_ITEM_SECTION3); - list4.PushString(MT_ITEM_SECTION4); -} - -#if defined MT_ABILITIES_MAIN -void vItemCombineAbilities(int tank, int type, const float random, const char[] combo) -#else -public void MT_OnCombineAbilities(int tank, int type, const float random, const char[] combo, int survivor, int weapon, const char[] classname) -#endif -{ - if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esItemCache[tank].g_iHumanAbility != 2) - { - return; - } - - char sCombo[320], sSet[4][32]; - FormatEx(sCombo, sizeof sCombo, ",%s,", combo); - FormatEx(sSet[0], sizeof sSet[], ",%s,", MT_ITEM_SECTION); - FormatEx(sSet[1], sizeof sSet[], ",%s,", MT_ITEM_SECTION2); - FormatEx(sSet[2], sizeof sSet[], ",%s,", MT_ITEM_SECTION3); - FormatEx(sSet[3], sizeof sSet[], ",%s,", MT_ITEM_SECTION4); - if (StrContains(sCombo, sSet[0], false) != -1 || StrContains(sCombo, sSet[1], false) != -1 || StrContains(sCombo, sSet[2], false) != -1 || StrContains(sCombo, sSet[3], false) != -1) - { - if (type == MT_COMBO_MAINRANGE && g_esItemCache[tank].g_iItemAbility == 1 && g_esItemCache[tank].g_iComboAbility == 1 && !g_esItemPlayer[tank].g_bActivated) - { - char sAbilities[320], sSubset[10][32]; - strcopy(sAbilities, sizeof sAbilities, combo); - ExplodeString(sAbilities, ",", sSubset, sizeof sSubset, sizeof sSubset[]); - - float flDelay = 0.0; - for (int iPos = 0; iPos < (sizeof sSubset); iPos++) - { - if (StrEqual(sSubset[iPos], MT_ITEM_SECTION, false) || StrEqual(sSubset[iPos], MT_ITEM_SECTION2, false) || StrEqual(sSubset[iPos], MT_ITEM_SECTION3, false) || StrEqual(sSubset[iPos], MT_ITEM_SECTION4, false)) - { - if (random <= MT_GetCombinationSetting(tank, 1, iPos)) - { - flDelay = MT_GetCombinationSetting(tank, 4, iPos); - - switch (flDelay) - { - case 0.0: g_esItemPlayer[tank].g_bActivated = true; - default: CreateTimer(flDelay, tTimerItemCombo, GetClientUserId(tank), TIMER_FLAG_NO_MAPCHANGE); - } - } - - break; - } - } - } - } -} - -#if defined MT_ABILITIES_MAIN -void vItemConfigsLoad(int mode) -#else -public void MT_OnConfigsLoad(int mode) -#endif -{ - switch (mode) - { - case 1: - { - for (int iIndex = MT_GetMinType(); iIndex <= MT_GetMaxType(); iIndex++) - { - g_esItemAbility[iIndex].g_iAccessFlags = 0; - g_esItemAbility[iIndex].g_iImmunityFlags = 0; - g_esItemAbility[iIndex].g_flCloseAreasOnly = 0.0; - g_esItemAbility[iIndex].g_iComboAbility = 0; - g_esItemAbility[iIndex].g_iHumanAbility = 0; - g_esItemAbility[iIndex].g_flOpenAreasOnly = 0.0; - g_esItemAbility[iIndex].g_iRequiresHumans = 0; - g_esItemAbility[iIndex].g_iItemAbility = 0; - g_esItemAbility[iIndex].g_iItemMessage = 0; - g_esItemAbility[iIndex].g_flItemChance = 33.3; - g_esItemAbility[iIndex].g_sItemLoadout = "rifle,pistol,first_aid_kit,pain_pills"; - g_esItemAbility[iIndex].g_iItemMode = 0; - g_esItemAbility[iIndex].g_sItemPinata[0] = '\0'; - g_esItemAbility[iIndex].g_iItemPinataBody = 1; - g_esItemAbility[iIndex].g_flItemPinataChance = 33.3; - - g_esItemSpecial[iIndex].g_flCloseAreasOnly = -1.0; - g_esItemSpecial[iIndex].g_iComboAbility = -1; - g_esItemSpecial[iIndex].g_iHumanAbility = -1; - g_esItemSpecial[iIndex].g_flOpenAreasOnly = -1.0; - g_esItemSpecial[iIndex].g_iRequiresHumans = -1; - g_esItemSpecial[iIndex].g_iItemAbility = -1; - g_esItemSpecial[iIndex].g_iItemMessage = -1; - g_esItemSpecial[iIndex].g_flItemChance = -1.0; - g_esItemSpecial[iIndex].g_sItemLoadout[0] = '\0'; - g_esItemSpecial[iIndex].g_iItemMode = -1; - g_esItemSpecial[iIndex].g_sItemPinata[0] = '\0'; - g_esItemSpecial[iIndex].g_iItemPinataBody = -1; - g_esItemSpecial[iIndex].g_flItemPinataChance = -1.0; - } - } - case 3: - { - for (int iPlayer = 1; iPlayer <= MaxClients; iPlayer++) - { - g_esItemPlayer[iPlayer].g_iAccessFlags = -1; - g_esItemPlayer[iPlayer].g_iImmunityFlags = -1; - g_esItemPlayer[iPlayer].g_flCloseAreasOnly = -1.0; - g_esItemPlayer[iPlayer].g_iComboAbility = -1; - g_esItemPlayer[iPlayer].g_iHumanAbility = -1; - g_esItemPlayer[iPlayer].g_flOpenAreasOnly = -1.0; - g_esItemPlayer[iPlayer].g_iRequiresHumans = -1; - g_esItemPlayer[iPlayer].g_iItemAbility = -1; - g_esItemPlayer[iPlayer].g_iItemMessage = -1; - g_esItemPlayer[iPlayer].g_flItemChance = -1.0; - g_esItemPlayer[iPlayer].g_sItemLoadout[0] = '\0'; - g_esItemPlayer[iPlayer].g_iItemMode = -1; - g_esItemPlayer[iPlayer].g_sItemPinata[0] = '\0'; - g_esItemPlayer[iPlayer].g_iItemPinataBody = -1; - g_esItemPlayer[iPlayer].g_flItemPinataChance = -1.0; - - g_esItemTeammate[iPlayer].g_flCloseAreasOnly = -1.0; - g_esItemTeammate[iPlayer].g_iComboAbility = -1; - g_esItemTeammate[iPlayer].g_iHumanAbility = -1; - g_esItemTeammate[iPlayer].g_flOpenAreasOnly = -1.0; - g_esItemTeammate[iPlayer].g_iRequiresHumans = -1; - g_esItemTeammate[iPlayer].g_iItemAbility = -1; - g_esItemTeammate[iPlayer].g_iItemMessage = -1; - g_esItemTeammate[iPlayer].g_flItemChance = -1.0; - g_esItemTeammate[iPlayer].g_sItemLoadout[0] = '\0'; - g_esItemTeammate[iPlayer].g_iItemMode = -1; - g_esItemTeammate[iPlayer].g_sItemPinata[0] = '\0'; - g_esItemTeammate[iPlayer].g_iItemPinataBody = -1; - g_esItemTeammate[iPlayer].g_flItemPinataChance = -1.0; - } - } - } -} - -#if defined MT_ABILITIES_MAIN -void vItemConfigsLoaded(const char[] subsection, const char[] key, const char[] value, int type, int admin, int mode, bool special, const char[] specsection) -#else -public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const char[] value, int type, int admin, int mode, bool special, const char[] specsection) -#endif -{ - if ((mode == -1 || mode == 3) && bIsValidClient(admin)) - { - if (special && specsection[0] != '\0') - { - g_esItemTeammate[admin].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_ITEM_SECTION, MT_ITEM_SECTION2, MT_ITEM_SECTION3, MT_ITEM_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esItemTeammate[admin].g_flCloseAreasOnly, value, -1.0, 99999.0); - g_esItemTeammate[admin].g_iComboAbility = iGetKeyValue(subsection, MT_ITEM_SECTION, MT_ITEM_SECTION2, MT_ITEM_SECTION3, MT_ITEM_SECTION4, key, "ComboAbility", "Combo Ability", "Combo_Ability", "combo", g_esItemTeammate[admin].g_iComboAbility, value, -1, 1); - g_esItemTeammate[admin].g_iHumanAbility = iGetKeyValue(subsection, MT_ITEM_SECTION, MT_ITEM_SECTION2, MT_ITEM_SECTION3, MT_ITEM_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esItemTeammate[admin].g_iHumanAbility, value, -1, 2); - g_esItemTeammate[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_ITEM_SECTION, MT_ITEM_SECTION2, MT_ITEM_SECTION3, MT_ITEM_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esItemTeammate[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); - g_esItemTeammate[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_ITEM_SECTION, MT_ITEM_SECTION2, MT_ITEM_SECTION3, MT_ITEM_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esItemTeammate[admin].g_iRequiresHumans, value, -1, 32); - g_esItemTeammate[admin].g_iItemAbility = iGetKeyValue(subsection, MT_ITEM_SECTION, MT_ITEM_SECTION2, MT_ITEM_SECTION3, MT_ITEM_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esItemTeammate[admin].g_iItemAbility, value, -1, 1); - g_esItemTeammate[admin].g_iItemMessage = iGetKeyValue(subsection, MT_ITEM_SECTION, MT_ITEM_SECTION2, MT_ITEM_SECTION3, MT_ITEM_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esItemTeammate[admin].g_iItemMessage, value, -1, 1); - g_esItemTeammate[admin].g_flItemChance = flGetKeyValue(subsection, MT_ITEM_SECTION, MT_ITEM_SECTION2, MT_ITEM_SECTION3, MT_ITEM_SECTION4, key, "ItemChance", "Item Chance", "Item_Chance", "chance", g_esItemTeammate[admin].g_flItemChance, value, -1.0, 100.0); - g_esItemTeammate[admin].g_iItemMode = iGetKeyValue(subsection, MT_ITEM_SECTION, MT_ITEM_SECTION2, MT_ITEM_SECTION3, MT_ITEM_SECTION4, key, "ItemMode", "Item Mode", "Item_Mode", "mode", g_esItemTeammate[admin].g_iItemMode, value, -1, 3); - g_esItemTeammate[admin].g_iItemPinataBody = iGetKeyValue(subsection, MT_ITEM_SECTION, MT_ITEM_SECTION2, MT_ITEM_SECTION3, MT_ITEM_SECTION4, key, "ItemPinataBody", "Item Pinata Body", "Item_Pinata_Body", "pinatabody", g_esItemTeammate[admin].g_iItemPinataBody, value, -1, 1); - g_esItemTeammate[admin].g_flItemPinataChance = flGetKeyValue(subsection, MT_ITEM_SECTION, MT_ITEM_SECTION2, MT_ITEM_SECTION3, MT_ITEM_SECTION4, key, "ItemPinataChance", "Item Pinata Chance", "Item_Pinata_Chance", "pinatachance", g_esItemTeammate[admin].g_flItemPinataChance, value, -1.0, 100.0); - - vGetKeyValue(subsection, MT_ITEM_SECTION, MT_ITEM_SECTION2, MT_ITEM_SECTION3, MT_ITEM_SECTION4, key, "ItemLoadout", "Item Loadout", "Item_Loadout", "loadout", g_esItemTeammate[admin].g_sItemLoadout, sizeof esItemTeammate::g_sItemLoadout, value); - vGetKeyValue(subsection, MT_ITEM_SECTION, MT_ITEM_SECTION2, MT_ITEM_SECTION3, MT_ITEM_SECTION4, key, "ItemPinata", "Item Pinata", "Item_Pinata", "pinata", g_esItemTeammate[admin].g_sItemPinata, sizeof esItemTeammate::g_sItemPinata, value); - } - else - { - g_esItemPlayer[admin].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_ITEM_SECTION, MT_ITEM_SECTION2, MT_ITEM_SECTION3, MT_ITEM_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esItemPlayer[admin].g_flCloseAreasOnly, value, -1.0, 99999.0); - g_esItemPlayer[admin].g_iComboAbility = iGetKeyValue(subsection, MT_ITEM_SECTION, MT_ITEM_SECTION2, MT_ITEM_SECTION3, MT_ITEM_SECTION4, key, "ComboAbility", "Combo Ability", "Combo_Ability", "combo", g_esItemPlayer[admin].g_iComboAbility, value, -1, 1); - g_esItemPlayer[admin].g_iHumanAbility = iGetKeyValue(subsection, MT_ITEM_SECTION, MT_ITEM_SECTION2, MT_ITEM_SECTION3, MT_ITEM_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esItemPlayer[admin].g_iHumanAbility, value, -1, 2); - g_esItemPlayer[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_ITEM_SECTION, MT_ITEM_SECTION2, MT_ITEM_SECTION3, MT_ITEM_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esItemPlayer[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); - g_esItemPlayer[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_ITEM_SECTION, MT_ITEM_SECTION2, MT_ITEM_SECTION3, MT_ITEM_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esItemPlayer[admin].g_iRequiresHumans, value, -1, 32); - g_esItemPlayer[admin].g_iItemAbility = iGetKeyValue(subsection, MT_ITEM_SECTION, MT_ITEM_SECTION2, MT_ITEM_SECTION3, MT_ITEM_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esItemPlayer[admin].g_iItemAbility, value, -1, 1); - g_esItemPlayer[admin].g_iItemMessage = iGetKeyValue(subsection, MT_ITEM_SECTION, MT_ITEM_SECTION2, MT_ITEM_SECTION3, MT_ITEM_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esItemPlayer[admin].g_iItemMessage, value, -1, 1); - g_esItemPlayer[admin].g_flItemChance = flGetKeyValue(subsection, MT_ITEM_SECTION, MT_ITEM_SECTION2, MT_ITEM_SECTION3, MT_ITEM_SECTION4, key, "ItemChance", "Item Chance", "Item_Chance", "chance", g_esItemPlayer[admin].g_flItemChance, value, -1.0, 100.0); - g_esItemPlayer[admin].g_iItemMode = iGetKeyValue(subsection, MT_ITEM_SECTION, MT_ITEM_SECTION2, MT_ITEM_SECTION3, MT_ITEM_SECTION4, key, "ItemMode", "Item Mode", "Item_Mode", "mode", g_esItemPlayer[admin].g_iItemMode, value, -1, 3); - g_esItemPlayer[admin].g_iItemPinataBody = iGetKeyValue(subsection, MT_ITEM_SECTION, MT_ITEM_SECTION2, MT_ITEM_SECTION3, MT_ITEM_SECTION4, key, "ItemPinataBody", "Item Pinata Body", "Item_Pinata_Body", "pinatabody", g_esItemPlayer[admin].g_iItemPinataBody, value, -1, 1); - g_esItemPlayer[admin].g_flItemPinataChance = flGetKeyValue(subsection, MT_ITEM_SECTION, MT_ITEM_SECTION2, MT_ITEM_SECTION3, MT_ITEM_SECTION4, key, "ItemPinataChance", "Item Pinata Chance", "Item_Pinata_Chance", "pinatachance", g_esItemPlayer[admin].g_flItemPinataChance, value, -1.0, 100.0); - g_esItemPlayer[admin].g_iAccessFlags = iGetAdminFlagsValue(subsection, MT_ITEM_SECTION, MT_ITEM_SECTION2, MT_ITEM_SECTION3, MT_ITEM_SECTION4, key, "AccessFlags", "Access Flags", "Access_Flags", "access", value); - g_esItemPlayer[admin].g_iImmunityFlags = iGetAdminFlagsValue(subsection, MT_ITEM_SECTION, MT_ITEM_SECTION2, MT_ITEM_SECTION3, MT_ITEM_SECTION4, key, "ImmunityFlags", "Immunity Flags", "Immunity_Flags", "immunity", value); - - vGetKeyValue(subsection, MT_ITEM_SECTION, MT_ITEM_SECTION2, MT_ITEM_SECTION3, MT_ITEM_SECTION4, key, "ItemLoadout", "Item Loadout", "Item_Loadout", "loadout", g_esItemPlayer[admin].g_sItemLoadout, sizeof esItemPlayer::g_sItemLoadout, value); - vGetKeyValue(subsection, MT_ITEM_SECTION, MT_ITEM_SECTION2, MT_ITEM_SECTION3, MT_ITEM_SECTION4, key, "ItemPinata", "Item Pinata", "Item_Pinata", "pinata", g_esItemPlayer[admin].g_sItemPinata, sizeof esItemPlayer::g_sItemPinata, value); - } - } - - if (mode < 3 && type > 0) - { - if (special && specsection[0] != '\0') - { - g_esItemSpecial[type].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_ITEM_SECTION, MT_ITEM_SECTION2, MT_ITEM_SECTION3, MT_ITEM_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esItemSpecial[type].g_flCloseAreasOnly, value, -1.0, 99999.0); - g_esItemSpecial[type].g_iComboAbility = iGetKeyValue(subsection, MT_ITEM_SECTION, MT_ITEM_SECTION2, MT_ITEM_SECTION3, MT_ITEM_SECTION4, key, "ComboAbility", "Combo Ability", "Combo_Ability", "combo", g_esItemSpecial[type].g_iComboAbility, value, -1, 1); - g_esItemSpecial[type].g_iHumanAbility = iGetKeyValue(subsection, MT_ITEM_SECTION, MT_ITEM_SECTION2, MT_ITEM_SECTION3, MT_ITEM_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esItemSpecial[type].g_iHumanAbility, value, -1, 2); - g_esItemSpecial[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_ITEM_SECTION, MT_ITEM_SECTION2, MT_ITEM_SECTION3, MT_ITEM_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esItemSpecial[type].g_flOpenAreasOnly, value, -1.0, 99999.0); - g_esItemSpecial[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_ITEM_SECTION, MT_ITEM_SECTION2, MT_ITEM_SECTION3, MT_ITEM_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esItemSpecial[type].g_iRequiresHumans, value, -1, 32); - g_esItemSpecial[type].g_iItemAbility = iGetKeyValue(subsection, MT_ITEM_SECTION, MT_ITEM_SECTION2, MT_ITEM_SECTION3, MT_ITEM_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esItemSpecial[type].g_iItemAbility, value, -1, 1); - g_esItemSpecial[type].g_iItemMessage = iGetKeyValue(subsection, MT_ITEM_SECTION, MT_ITEM_SECTION2, MT_ITEM_SECTION3, MT_ITEM_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esItemSpecial[type].g_iItemMessage, value, -1, 1); - g_esItemSpecial[type].g_flItemChance = flGetKeyValue(subsection, MT_ITEM_SECTION, MT_ITEM_SECTION2, MT_ITEM_SECTION3, MT_ITEM_SECTION4, key, "ItemChance", "Item Chance", "Item_Chance", "chance", g_esItemSpecial[type].g_flItemChance, value, -1.0, 100.0); - g_esItemSpecial[type].g_iItemMode = iGetKeyValue(subsection, MT_ITEM_SECTION, MT_ITEM_SECTION2, MT_ITEM_SECTION3, MT_ITEM_SECTION4, key, "ItemMode", "Item Mode", "Item_Mode", "mode", g_esItemSpecial[type].g_iItemMode, value, -1, 3); - g_esItemSpecial[type].g_iItemPinataBody = iGetKeyValue(subsection, MT_ITEM_SECTION, MT_ITEM_SECTION2, MT_ITEM_SECTION3, MT_ITEM_SECTION4, key, "ItemPinataBody", "Item Pinata Body", "Item_Pinata_Body", "pinatabody", g_esItemSpecial[type].g_iItemPinataBody, value, -1, 1); - g_esItemSpecial[type].g_flItemPinataChance = flGetKeyValue(subsection, MT_ITEM_SECTION, MT_ITEM_SECTION2, MT_ITEM_SECTION3, MT_ITEM_SECTION4, key, "ItemPinataChance", "Item Pinata Chance", "Item_Pinata_Chance", "pinatachance", g_esItemSpecial[type].g_flItemPinataChance, value, -1.0, 100.0); - - vGetKeyValue(subsection, MT_ITEM_SECTION, MT_ITEM_SECTION2, MT_ITEM_SECTION3, MT_ITEM_SECTION4, key, "ItemLoadout", "Item Loadout", "Item_Loadout", "loadout", g_esItemSpecial[type].g_sItemLoadout, sizeof esItemSpecial::g_sItemLoadout, value); - vGetKeyValue(subsection, MT_ITEM_SECTION, MT_ITEM_SECTION2, MT_ITEM_SECTION3, MT_ITEM_SECTION4, key, "ItemPinata", "Item Pinata", "Item_Pinata", "pinata", g_esItemSpecial[type].g_sItemPinata, sizeof esItemSpecial::g_sItemPinata, value); - } - else - { - g_esItemAbility[type].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_ITEM_SECTION, MT_ITEM_SECTION2, MT_ITEM_SECTION3, MT_ITEM_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esItemAbility[type].g_flCloseAreasOnly, value, -1.0, 99999.0); - g_esItemAbility[type].g_iComboAbility = iGetKeyValue(subsection, MT_ITEM_SECTION, MT_ITEM_SECTION2, MT_ITEM_SECTION3, MT_ITEM_SECTION4, key, "ComboAbility", "Combo Ability", "Combo_Ability", "combo", g_esItemAbility[type].g_iComboAbility, value, -1, 1); - g_esItemAbility[type].g_iHumanAbility = iGetKeyValue(subsection, MT_ITEM_SECTION, MT_ITEM_SECTION2, MT_ITEM_SECTION3, MT_ITEM_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esItemAbility[type].g_iHumanAbility, value, -1, 2); - g_esItemAbility[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_ITEM_SECTION, MT_ITEM_SECTION2, MT_ITEM_SECTION3, MT_ITEM_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esItemAbility[type].g_flOpenAreasOnly, value, -1.0, 99999.0); - g_esItemAbility[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_ITEM_SECTION, MT_ITEM_SECTION2, MT_ITEM_SECTION3, MT_ITEM_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esItemAbility[type].g_iRequiresHumans, value, -1, 32); - g_esItemAbility[type].g_iItemAbility = iGetKeyValue(subsection, MT_ITEM_SECTION, MT_ITEM_SECTION2, MT_ITEM_SECTION3, MT_ITEM_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esItemAbility[type].g_iItemAbility, value, -1, 1); - g_esItemAbility[type].g_iItemMessage = iGetKeyValue(subsection, MT_ITEM_SECTION, MT_ITEM_SECTION2, MT_ITEM_SECTION3, MT_ITEM_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esItemAbility[type].g_iItemMessage, value, -1, 1); - g_esItemAbility[type].g_flItemChance = flGetKeyValue(subsection, MT_ITEM_SECTION, MT_ITEM_SECTION2, MT_ITEM_SECTION3, MT_ITEM_SECTION4, key, "ItemChance", "Item Chance", "Item_Chance", "chance", g_esItemAbility[type].g_flItemChance, value, -1.0, 100.0); - g_esItemAbility[type].g_iItemMode = iGetKeyValue(subsection, MT_ITEM_SECTION, MT_ITEM_SECTION2, MT_ITEM_SECTION3, MT_ITEM_SECTION4, key, "ItemMode", "Item Mode", "Item_Mode", "mode", g_esItemAbility[type].g_iItemMode, value, -1, 3); - g_esItemAbility[type].g_iItemPinataBody = iGetKeyValue(subsection, MT_ITEM_SECTION, MT_ITEM_SECTION2, MT_ITEM_SECTION3, MT_ITEM_SECTION4, key, "ItemPinataBody", "Item Pinata Body", "Item_Pinata_Body", "pinatabody", g_esItemAbility[type].g_iItemPinataBody, value, -1, 1); - g_esItemAbility[type].g_flItemPinataChance = flGetKeyValue(subsection, MT_ITEM_SECTION, MT_ITEM_SECTION2, MT_ITEM_SECTION3, MT_ITEM_SECTION4, key, "ItemPinataChance", "Item Pinata Chance", "Item_Pinata_Chance", "pinatachance", g_esItemAbility[type].g_flItemPinataChance, value, -1.0, 100.0); - g_esItemAbility[type].g_iAccessFlags = iGetAdminFlagsValue(subsection, MT_ITEM_SECTION, MT_ITEM_SECTION2, MT_ITEM_SECTION3, MT_ITEM_SECTION4, key, "AccessFlags", "Access Flags", "Access_Flags", "access", value); - g_esItemAbility[type].g_iImmunityFlags = iGetAdminFlagsValue(subsection, MT_ITEM_SECTION, MT_ITEM_SECTION2, MT_ITEM_SECTION3, MT_ITEM_SECTION4, key, "ImmunityFlags", "Immunity Flags", "Immunity_Flags", "immunity", value); - - vGetKeyValue(subsection, MT_ITEM_SECTION, MT_ITEM_SECTION2, MT_ITEM_SECTION3, MT_ITEM_SECTION4, key, "ItemLoadout", "Item Loadout", "Item_Loadout", "loadout", g_esItemAbility[type].g_sItemLoadout, sizeof esItemAbility::g_sItemLoadout, value); - vGetKeyValue(subsection, MT_ITEM_SECTION, MT_ITEM_SECTION2, MT_ITEM_SECTION3, MT_ITEM_SECTION4, key, "ItemPinata", "Item Pinata", "Item_Pinata", "pinata", g_esItemAbility[type].g_sItemPinata, sizeof esItemAbility::g_sItemPinata, value); - } - } -} - -#if defined MT_ABILITIES_MAIN -void vItemSettingsCached(int tank, bool apply, int type) -#else -public void MT_OnSettingsCached(int tank, bool apply, int type) -#endif -{ - bool bHuman = bIsValidClient(tank, MT_CHECK_FAKECLIENT); - g_esItemPlayer[tank].g_iTankTypeRecorded = apply ? MT_GetRecordedTankType(tank, type) : 0; - g_esItemPlayer[tank].g_iTankType = apply ? type : 0; - int iType = g_esItemPlayer[tank].g_iTankTypeRecorded; - - if (bIsSpecialInfected(tank, MT_CHECK_INDEX|MT_CHECK_INGAME)) - { - g_esItemCache[tank].g_flCloseAreasOnly = flGetSubSettingValue(apply, bHuman, g_esItemTeammate[tank].g_flCloseAreasOnly, g_esItemPlayer[tank].g_flCloseAreasOnly, g_esItemSpecial[iType].g_flCloseAreasOnly, g_esItemAbility[iType].g_flCloseAreasOnly, 1); - g_esItemCache[tank].g_iComboAbility = iGetSubSettingValue(apply, bHuman, g_esItemTeammate[tank].g_iComboAbility, g_esItemPlayer[tank].g_iComboAbility, g_esItemSpecial[iType].g_iComboAbility, g_esItemAbility[iType].g_iComboAbility, 1); - g_esItemCache[tank].g_flItemChance = flGetSubSettingValue(apply, bHuman, g_esItemTeammate[tank].g_flItemChance, g_esItemPlayer[tank].g_flItemChance, g_esItemSpecial[iType].g_flItemChance, g_esItemAbility[iType].g_flItemChance, 1); - g_esItemCache[tank].g_flItemPinataChance = flGetSubSettingValue(apply, bHuman, g_esItemTeammate[tank].g_flItemPinataChance, g_esItemPlayer[tank].g_flItemPinataChance, g_esItemSpecial[iType].g_flItemPinataChance, g_esItemAbility[iType].g_flItemPinataChance, 1); - g_esItemCache[tank].g_iHumanAbility = iGetSubSettingValue(apply, bHuman, g_esItemTeammate[tank].g_iHumanAbility, g_esItemPlayer[tank].g_iHumanAbility, g_esItemSpecial[iType].g_iHumanAbility, g_esItemAbility[iType].g_iHumanAbility, 1); - g_esItemCache[tank].g_iItemAbility = iGetSubSettingValue(apply, bHuman, g_esItemTeammate[tank].g_iItemAbility, g_esItemPlayer[tank].g_iItemAbility, g_esItemSpecial[iType].g_iItemAbility, g_esItemAbility[iType].g_iItemAbility, 1); - g_esItemCache[tank].g_iItemMessage = iGetSubSettingValue(apply, bHuman, g_esItemTeammate[tank].g_iItemMessage, g_esItemPlayer[tank].g_iItemMessage, g_esItemSpecial[iType].g_iItemMessage, g_esItemAbility[iType].g_iItemMessage, 1); - g_esItemCache[tank].g_iItemMode = iGetSubSettingValue(apply, bHuman, g_esItemTeammate[tank].g_iItemMode, g_esItemPlayer[tank].g_iItemMode, g_esItemSpecial[iType].g_iItemMode, g_esItemAbility[iType].g_iItemMode, 1); - g_esItemCache[tank].g_iItemPinataBody = iGetSubSettingValue(apply, bHuman, g_esItemTeammate[tank].g_iItemPinataBody, g_esItemPlayer[tank].g_iItemPinataBody, g_esItemSpecial[iType].g_iItemPinataBody, g_esItemAbility[iType].g_iItemPinataBody, 1); - g_esItemCache[tank].g_flOpenAreasOnly = flGetSubSettingValue(apply, bHuman, g_esItemTeammate[tank].g_flOpenAreasOnly, g_esItemPlayer[tank].g_flOpenAreasOnly, g_esItemSpecial[iType].g_flOpenAreasOnly, g_esItemAbility[iType].g_flOpenAreasOnly, 1); - g_esItemCache[tank].g_iRequiresHumans = iGetSubSettingValue(apply, bHuman, g_esItemTeammate[tank].g_iRequiresHumans, g_esItemPlayer[tank].g_iRequiresHumans, g_esItemSpecial[iType].g_iRequiresHumans, g_esItemAbility[iType].g_iRequiresHumans, 1); - - vGetSubSettingValue(apply, bHuman, g_esItemCache[tank].g_sItemLoadout, sizeof esItemCache::g_sItemLoadout, g_esItemTeammate[tank].g_sItemLoadout, g_esItemPlayer[tank].g_sItemLoadout, g_esItemSpecial[iType].g_sItemLoadout, g_esItemAbility[iType].g_sItemLoadout); - vGetSubSettingValue(apply, bHuman, g_esItemCache[tank].g_sItemPinata, sizeof esItemCache::g_sItemPinata, g_esItemTeammate[tank].g_sItemPinata, g_esItemPlayer[tank].g_sItemPinata, g_esItemSpecial[iType].g_sItemPinata, g_esItemAbility[iType].g_sItemPinata); - } - else - { - g_esItemCache[tank].g_flCloseAreasOnly = flGetSettingValue(apply, bHuman, g_esItemPlayer[tank].g_flCloseAreasOnly, g_esItemAbility[iType].g_flCloseAreasOnly, 1); - g_esItemCache[tank].g_iComboAbility = iGetSettingValue(apply, bHuman, g_esItemPlayer[tank].g_iComboAbility, g_esItemAbility[iType].g_iComboAbility, 1); - g_esItemCache[tank].g_flItemChance = flGetSettingValue(apply, bHuman, g_esItemPlayer[tank].g_flItemChance, g_esItemAbility[iType].g_flItemChance, 1); - g_esItemCache[tank].g_flItemPinataChance = flGetSettingValue(apply, bHuman, g_esItemPlayer[tank].g_flItemPinataChance, g_esItemAbility[iType].g_flItemPinataChance, 1); - g_esItemCache[tank].g_iHumanAbility = iGetSettingValue(apply, bHuman, g_esItemPlayer[tank].g_iHumanAbility, g_esItemAbility[iType].g_iHumanAbility, 1); - g_esItemCache[tank].g_iItemAbility = iGetSettingValue(apply, bHuman, g_esItemPlayer[tank].g_iItemAbility, g_esItemAbility[iType].g_iItemAbility, 1); - g_esItemCache[tank].g_iItemMessage = iGetSettingValue(apply, bHuman, g_esItemPlayer[tank].g_iItemMessage, g_esItemAbility[iType].g_iItemMessage, 1); - g_esItemCache[tank].g_iItemMode = iGetSettingValue(apply, bHuman, g_esItemPlayer[tank].g_iItemMode, g_esItemAbility[iType].g_iItemMode, 1); - g_esItemCache[tank].g_iItemPinataBody = iGetSettingValue(apply, bHuman, g_esItemPlayer[tank].g_iItemPinataBody, g_esItemAbility[iType].g_iItemPinataBody, 1); - g_esItemCache[tank].g_flOpenAreasOnly = flGetSettingValue(apply, bHuman, g_esItemPlayer[tank].g_flOpenAreasOnly, g_esItemAbility[iType].g_flOpenAreasOnly, 1); - g_esItemCache[tank].g_iRequiresHumans = iGetSettingValue(apply, bHuman, g_esItemPlayer[tank].g_iRequiresHumans, g_esItemAbility[iType].g_iRequiresHumans, 1); - - vGetSettingValue(apply, bHuman, g_esItemCache[tank].g_sItemLoadout, sizeof esItemCache::g_sItemLoadout, g_esItemPlayer[tank].g_sItemLoadout, g_esItemAbility[iType].g_sItemLoadout); - vGetSettingValue(apply, bHuman, g_esItemCache[tank].g_sItemPinata, sizeof esItemCache::g_sItemPinata, g_esItemPlayer[tank].g_sItemPinata, g_esItemAbility[iType].g_sItemPinata); - } -} - -#if defined MT_ABILITIES_MAIN -void vItemCopyStats(int oldTank, int newTank) -#else -public void MT_OnCopyStats(int oldTank, int newTank) -#endif -{ - g_esItemPlayer[newTank].g_bActivated = g_esItemPlayer[oldTank].g_bActivated; -} - -#if !defined MT_ABILITIES_MAIN -public void MT_OnPluginUpdate() -{ - MT_ReloadPlugin(null); -} -#endif - -#if defined MT_ABILITIES_MAIN -void vItemEventFired(Event event, const char[] name) -#else -public void MT_OnEventFired(Event event, const char[] name, bool dontBroadcast) -#endif -{ - if (StrEqual(name, "bot_player_replace")) - { - int iBotId = event.GetInt("bot"), iBot = GetClientOfUserId(iBotId), - iPlayerId = event.GetInt("player"), iPlayer = GetClientOfUserId(iPlayerId); - if (bIsValidClient(iBot)) - { - if (bIsInfected(iPlayer)) - { - g_esItemPlayer[iPlayer].g_bActivated = g_esItemPlayer[iBot].g_bActivated; - } - else if (bIsSurvivor(iPlayer)) - { - g_esItemPlayer[iPlayer].g_iGiveMode = g_esItemPlayer[iBot].g_iGiveMode; - g_esItemPlayer[iPlayer].g_sGiveLoadout = g_esItemPlayer[iBot].g_sGiveLoadout; - } - } - } - else if (StrEqual(name, "mission_lost") || StrEqual(name, "round_start") || StrEqual(name, "round_end")) - { - vItemReset(); - } - else if (StrEqual(name, "player_bot_replace")) - { - int iPlayerId = event.GetInt("player"), iPlayer = GetClientOfUserId(iPlayerId), - iBotId = event.GetInt("bot"), iBot = GetClientOfUserId(iBotId); - if (bIsValidClient(iPlayer)) - { - if (bIsInfected(iBot)) - { - g_esItemPlayer[iBot].g_bActivated = g_esItemPlayer[iPlayer].g_bActivated; - } - else if (bIsSurvivor(iBot)) - { - g_esItemPlayer[iBot].g_iGiveMode = g_esItemPlayer[iPlayer].g_iGiveMode; - g_esItemPlayer[iBot].g_sGiveLoadout = g_esItemPlayer[iPlayer].g_sGiveLoadout; - } - } - } - else if (StrEqual(name, "player_death")) - { - int iTankId = event.GetInt("userid"), iTank = GetClientOfUserId(iTankId); - if (MT_IsTankSupported(iTank, MT_CHECK_INDEX|MT_CHECK_INGAME) && MT_IsCustomTankSupported(iTank) && g_esItemCache[iTank].g_iItemAbility == 1 && g_esItemPlayer[iTank].g_bActivated) - { - vItemAbility(iTank); - } - } - else if (StrEqual(name, "revive_success")) - { - int iSurvivorId = event.GetInt("userid"), iSurvivor = GetClientOfUserId(iSurvivorId); - if (bIsSurvivor(iSurvivor) && g_esItemPlayer[iSurvivor].g_iGiveMode >= 0 && g_esItemPlayer[iSurvivor].g_sGiveLoadout[0] != '\0') - { - char sItems[5][64]; - ReplaceString(g_esItemPlayer[iSurvivor].g_sGiveLoadout, sizeof esItemPlayer::g_sGiveLoadout, " ", ""); - ExplodeString(g_esItemPlayer[iSurvivor].g_sGiveLoadout, ",", sItems, sizeof sItems, sizeof sItems[]); - - switch (g_esItemPlayer[iSurvivor].g_iGiveMode) - { - case 0: vCheatCommand(iSurvivor, "give", sItems[MT_GetRandomInt(1, (sizeof sItems)) - 1]); - case 1: vItemLoadout(iSurvivor, g_esItemPlayer[iSurvivor].g_sGiveLoadout, sItems, sizeof sItems); - } - - vItemReset2(iSurvivor); - } - } -} - -#if defined MT_ABILITIES_MAIN -void vItemPlayerEventKilled(int victim, int attacker) -#else -public void MT_OnPlayerEventKilled(int victim, int attacker) -#endif -{ - if (bIsSurvivor(victim, MT_CHECK_INDEX|MT_CHECK_INGAME) && MT_IsTankSupported(attacker, MT_CHECK_INDEX|MT_CHECK_INGAME) && MT_IsCustomTankSupported(attacker) && g_esItemCache[attacker].g_iItemAbility == 1 && g_esItemCache[attacker].g_sItemPinata[0] != '\0' && GetRandomFloat(0.1, 100.0) <= g_esItemCache[attacker].g_flItemPinataChance) - { - float flPos[3]; - GetClientAbsOrigin(victim, flPos); - flPos[2] += 50.0; - - char sItems[5][64]; - ReplaceString(g_esItemCache[attacker].g_sItemPinata, sizeof esItemCache::g_sItemPinata, " ", ""); - ExplodeString(g_esItemCache[attacker].g_sItemPinata, ",", sItems, sizeof sItems, sizeof sItems[]); - for (int iItem = 0; iItem < (sizeof sItems); iItem++) - { - if (sItems[iItem][0] != '\0') - { - vSpawnItem(sItems[iItem], flPos); - } - } - - if (g_esItemCache[attacker].g_iItemPinataBody == 1) - { - g_iItemDeathModelOwner = GetClientUserId(victim); - } - } -} - -#if defined MT_ABILITIES_MAIN -void vItemAbilityActivated(int tank) -#else -public void MT_OnAbilityActivated(int tank) -#endif -{ - if (MT_IsTankSupported(tank, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_FAKECLIENT) && ((!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esItemAbility[g_esItemPlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esItemPlayer[tank].g_iAccessFlags)) || g_esItemCache[tank].g_iHumanAbility == 0)) - { - return; - } - - if (MT_IsTankSupported(tank) && (!bIsInfected(tank, MT_CHECK_FAKECLIENT) || g_esItemCache[tank].g_iHumanAbility != 1) && MT_IsCustomTankSupported(tank) && g_esItemCache[tank].g_iItemAbility == 1 && g_esItemCache[tank].g_iComboAbility == 0 && GetRandomFloat(0.1, 100.0) <= g_esItemCache[tank].g_flItemChance && !g_esItemPlayer[tank].g_bActivated) - { - g_esItemPlayer[tank].g_bActivated = true; - } -} - -#if defined MT_ABILITIES_MAIN -void vItemButtonPressed(int tank, int button) -#else -public void MT_OnButtonPressed(int tank, int button) -#endif -{ - if (MT_IsTankSupported(tank, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_ALIVE|MT_CHECK_FAKECLIENT) && MT_IsCustomTankSupported(tank)) - { - if (bIsAreaNarrow(tank, g_esItemCache[tank].g_flOpenAreasOnly) || bIsAreaWide(tank, g_esItemCache[tank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esItemPlayer[tank].g_iTankType, tank) || (g_esItemCache[tank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esItemCache[tank].g_iRequiresHumans) || (!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esItemAbility[g_esItemPlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esItemPlayer[tank].g_iAccessFlags))) - { - return; - } - - if ((button & MT_SPECIAL_KEY2) && g_esItemCache[tank].g_iItemAbility == 1 && g_esItemCache[tank].g_iHumanAbility == 1) - { - switch (g_esItemPlayer[tank].g_bActivated) - { - case true: MT_PrintToChat(tank, "%s %t", MT_TAG3, "ItemHuman2"); - case false: - { - g_esItemPlayer[tank].g_bActivated = true; - - MT_PrintToChat(tank, "%s %t", MT_TAG3, "ItemHuman"); - } - } - } - } -} - -#if defined MT_ABILITIES_MAIN -void vItemChangeType(int tank, int oldType) -#else -public void MT_OnChangeType(int tank, int oldType, int newType, bool revert) -#endif -{ - if (oldType <= 0 || (MT_IsTankSupported(tank, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_FAKECLIENT) && ((!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esItemAbility[g_esItemPlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esItemPlayer[tank].g_iAccessFlags)) || g_esItemCache[tank].g_iHumanAbility == 0))) - { - return; - } - - if (MT_IsTankSupported(tank) && MT_IsCustomTankSupported(tank) && g_esItemCache[tank].g_iItemAbility == 1) - { - vItemAbility(tank); - } -} - -void vItemAbility(int tank) -{ - g_esItemPlayer[tank].g_bActivated = false; - - if (bIsAreaNarrow(tank, g_esItemCache[tank].g_flOpenAreasOnly) || bIsAreaWide(tank, g_esItemCache[tank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esItemPlayer[tank].g_iTankType, tank) || (g_esItemCache[tank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esItemCache[tank].g_iRequiresHumans) || (!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esItemAbility[g_esItemPlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esItemPlayer[tank].g_iAccessFlags))) - { - return; - } - - char sItems[5][64]; - ReplaceString(g_esItemCache[tank].g_sItemLoadout, sizeof esItemCache::g_sItemLoadout, " ", ""); - ExplodeString(g_esItemCache[tank].g_sItemLoadout, ",", sItems, sizeof sItems, sizeof sItems[]); - - switch (g_esItemCache[tank].g_iItemMode) - { - case 0, 1: - { - for (int iSurvivor = 1; iSurvivor <= MaxClients; iSurvivor++) - { - if (bIsSurvivor(iSurvivor, MT_CHECK_INGAME|MT_CHECK_ALIVE) && !MT_IsAdminImmune(iSurvivor, tank) && !bIsAdminImmune(iSurvivor, g_esItemPlayer[tank].g_iTankType, g_esItemAbility[g_esItemPlayer[tank].g_iTankTypeRecorded].g_iImmunityFlags, g_esItemPlayer[iSurvivor].g_iImmunityFlags)) - { - switch (bIsSurvivorDisabled(iSurvivor)) - { - case true: - { - g_esItemPlayer[iSurvivor].g_iGiveMode = g_esItemCache[tank].g_iItemMode; - strcopy(g_esItemPlayer[iSurvivor].g_sGiveLoadout, sizeof esItemPlayer::g_sGiveLoadout, g_esItemCache[tank].g_sItemLoadout); - } - case false: - { - switch (g_esItemCache[tank].g_iItemMode) - { - case 0: vCheatCommand(iSurvivor, "give", sItems[MT_GetRandomInt(1, (sizeof sItems)) - 1]); - case 1: vItemLoadout(iSurvivor, g_esItemCache[tank].g_sItemLoadout, sItems, sizeof sItems); - } - } - } - } - } - } - case 2: vCheatCommand(tank, "give", sItems[MT_GetRandomInt(1, (sizeof sItems)) - 1]); - case 3: vItemLoadout(tank, g_esItemCache[tank].g_sItemLoadout, sItems, sizeof sItems); - } - - if (g_esItemCache[tank].g_iItemMessage == 1) - { - char sTankName[64]; - MT_GetTankName(tank, sTankName); - MT_PrintToChatAll("%s %t", MT_TAG2, "Item", sTankName); - MT_LogMessage(MT_LOG_ABILITY, "%s %T", MT_TAG, "Item", LANG_SERVER, sTankName); - } -} - -void vItemLoadout(int survivor, const char[] loadout, const char[][] list, int size) -{ - for (int iItem = 0; iItem < size; iItem++) - { - if (StrContains(loadout, list[iItem]) != -1 && list[iItem][0] != '\0') - { - vCheatCommand(survivor, "give", list[iItem]); - } - } -} - -void vItemReset() -{ - for (int iPlayer = 1; iPlayer <= MaxClients; iPlayer++) - { - if (bIsValidClient(iPlayer, MT_CHECK_INGAME)) - { - vItemReset2(iPlayer); - } - } -} - -void vItemReset2(int tank) -{ - g_esItemPlayer[tank].g_bActivated = false; - g_esItemPlayer[tank].g_iGiveMode = -1; - g_esItemPlayer[tank].g_sGiveLoadout[0] = '\0'; -} - -void vSpawnItem(const char[] name, float pos[3]) -{ - char sClassname[32]; - int iItem = -1, iType = 0; - if (StrEqual(name, "gascan") || StrEqual(name, "propanetank") || StrEqual(name, "oxygentank") || StrEqual(name, "fireworkcrate")) - { - iType = 1; - } - else if (StrEqual(name, "grenade_launcher") || strncmp(name, "pistol", 6) == 0 || strncmp(name, "rifle", 6) != -1 - || strncmp(name, "smg", 3) == 0 || strncmp(name, "shotgun", 7) != -1 || strncmp(name, "sniper", 6) == 0) - { - iType = 2; - } - else if (StrEqual(name, "molotov") || StrEqual(name, "pipe_bomb") || StrEqual(name, "vomitjar") || StrEqual(name, "first_aid_kit") - || StrEqual(name, "defibrillator") || strncmp(name, "upgrade", 7) != -1 || StrEqual(name, "pain_pills") || StrEqual(name, "adrenaline")) - { - iType = 3; - } - else - { - iType = 4; - } - - switch (iType) - { - case 1: - { - FormatEx(sClassname, sizeof sClassname, "weapon_%s", name); - - switch (StrEqual(sClassname[7], "gascan")) - { - case true: iItem = CreateEntityByName(sClassname); - case false: - { - iItem = CreateEntityByName("prop_physics"); - if (bIsValidEntity(iItem)) - { - if (StrEqual(name, "fireworkcrate")) - { - SetEntityModel(iItem, MODEL_FIREWORKCRATE); - } - else if (StrEqual(name, "oxygentank")) - { - SetEntityModel(iItem, MODEL_OXYGENTANK); - } - else if (StrEqual(name, "propanetank")) - { - SetEntityModel(iItem, MODEL_PROPANETANK); - } - } - } - } - - if (bIsValidEntity(iItem)) - { - SDKHook(iItem, SDKHook_OnTakeDamage, OnItemTakeDamage); - SDKHook(iItem, SDKHook_Use, OnItemUse); - CreateTimer(3.0, tTimerRemoveItemHooks, EntIndexToEntRef(iItem), TIMER_FLAG_NO_MAPCHANGE); - } - } - case 2, 3: - { - FormatEx(sClassname, sizeof sClassname, "weapon_%s", name); - iItem = CreateEntityByName(sClassname); - } - case 4: - { - iItem = CreateEntityByName("weapon_melee"); - if (bIsValidEntity(iItem)) - { - DispatchKeyValue(iItem, "melee_script_name", name); - } - } - } - - if (bIsValidEntity(iItem)) - { - TeleportEntity(iItem, pos); - DispatchSpawn(iItem); - ActivateEntity(iItem); - - if (iType == 2) - { - if (strncmp(name, "rifle", 6) == 0) - { - SetEntProp(iItem, Prop_Send, "m_iExtraPrimaryAmmo", 300); - } - else if (strncmp(name, "smg", 3) == 0) - { - SetEntProp(iItem, Prop_Send, "m_iExtraPrimaryAmmo", 600); - } - else if (StrEqual(name, "autoshotgun") || StrEqual(name, "shotgun_spas")) - { - SetEntProp(iItem, Prop_Send, "m_iExtraPrimaryAmmo", 100); - } - else if (StrEqual(name, "pumpshotgun") || StrEqual(name, "shotgun_chrome")) - { - SetEntProp(iItem, Prop_Send, "m_iExtraPrimaryAmmo", 50); - } - else if (StrEqual(name, "hunting_rifle") || strncmp(name, "sniper", 6) == 0) - { - SetEntProp(iItem, Prop_Send, "m_iExtraPrimaryAmmo", 150); - } - } - } -} - -void tTimerItemCombo(Handle timer, int userid) -{ - int iTank = GetClientOfUserId(userid); - if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esItemAbility[g_esItemPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esItemPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esItemPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esItemCache[iTank].g_iItemAbility == 0 || g_esItemPlayer[iTank].g_bActivated) - { - return; - } - - g_esItemPlayer[iTank].g_bActivated = true; -} - -void tTimerRemoveItemHooks(Handle timer, int ref) -{ - int iItem = EntRefToEntIndex(ref); - if (!bIsValidEntity(iItem)) - { - return; - } - - SDKUnhook(iItem, SDKHook_OnTakeDamage, OnItemTakeDamage); - SDKUnhook(iItem, SDKHook_Use, OnItemUse); -} \ No newline at end of file diff --git a/addons/sourcemod/scripting/mutant_tanks/abilities/mt_jump.sp b/addons/sourcemod/scripting/mutant_tanks/abilities/mt_jump.sp index c4d7a1532d..ff6aa01d15 100644 --- a/addons/sourcemod/scripting/mutant_tanks/abilities/mt_jump.sp +++ b/addons/sourcemod/scripting/mutant_tanks/abilities/mt_jump.sp @@ -1,6 +1,6 @@ /** - * Mutant Tanks: a L4D/L4D2 SourceMod Plugin - * Copyright (C) 2024 Alfred "Psyk0tik" Llagas + * Mutant Tanks: A L4D/L4D2 SourceMod Plugin + * Copyright (C) 2017-2025 Alfred "Psyk0tik" Llagas * * 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. * @@ -377,7 +377,15 @@ int iJumpMenuHandler(Menu menu, MenuAction action, int param1, int param2) MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtons"); MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtons2"); } - case 3: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esJumpCache[param1].g_iHumanMode == 0) ? "AbilityButtonMode1" : "AbilityButtonMode2"); + case 3: + { + switch (g_esJumpCache[param1].g_iHumanMode) + { + case 0: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtonMode1"); + case 1: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtonMode2"); + case 2: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtonMode3"); + } + } case 4: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityCooldown", ((g_esJumpCache[param1].g_iHumanAbility == 1) ? g_esJumpCache[param1].g_iHumanCooldown : g_esJumpCache[param1].g_iJumpCooldown)); case 5: MT_PrintToChat(param1, "%s %t", MT_TAG3, "JumpDetails"); case 6: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityDuration2", ((g_esJumpCache[param1].g_iHumanAbility == 1) ? g_esJumpCache[param1].g_iHumanDuration : g_esJumpCache[param1].g_iJumpDuration)); @@ -780,7 +788,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esJumpTeammate[admin].g_iHumanAmmo = iGetKeyValue(subsection, MT_JUMP_SECTION, MT_JUMP_SECTION2, MT_JUMP_SECTION3, MT_JUMP_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esJumpTeammate[admin].g_iHumanAmmo, value, -1, 99999); g_esJumpTeammate[admin].g_iHumanCooldown = iGetKeyValue(subsection, MT_JUMP_SECTION, MT_JUMP_SECTION2, MT_JUMP_SECTION3, MT_JUMP_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esJumpTeammate[admin].g_iHumanCooldown, value, -1, 99999); g_esJumpTeammate[admin].g_iHumanDuration = iGetKeyValue(subsection, MT_JUMP_SECTION, MT_JUMP_SECTION2, MT_JUMP_SECTION3, MT_JUMP_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esJumpTeammate[admin].g_iHumanDuration, value, -1, 99999); - g_esJumpTeammate[admin].g_iHumanMode = iGetKeyValue(subsection, MT_JUMP_SECTION, MT_JUMP_SECTION2, MT_JUMP_SECTION3, MT_JUMP_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esJumpTeammate[admin].g_iHumanMode, value, -1, 1); + g_esJumpTeammate[admin].g_iHumanMode = iGetKeyValue(subsection, MT_JUMP_SECTION, MT_JUMP_SECTION2, MT_JUMP_SECTION3, MT_JUMP_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esJumpTeammate[admin].g_iHumanMode, value, -1, 2); g_esJumpTeammate[admin].g_iHumanRangeCooldown = iGetKeyValue(subsection, MT_JUMP_SECTION, MT_JUMP_SECTION2, MT_JUMP_SECTION3, MT_JUMP_SECTION4, key, "HumanRangeCooldown", "Human Range Cooldown", "Human_Range_Cooldown", "hrangecooldown", g_esJumpTeammate[admin].g_iHumanRangeCooldown, value, -1, 99999); g_esJumpTeammate[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_JUMP_SECTION, MT_JUMP_SECTION2, MT_JUMP_SECTION3, MT_JUMP_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esJumpTeammate[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); g_esJumpTeammate[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_JUMP_SECTION, MT_JUMP_SECTION2, MT_JUMP_SECTION3, MT_JUMP_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esJumpTeammate[admin].g_iRequiresHumans, value, -1, 32); @@ -810,7 +818,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esJumpPlayer[admin].g_iHumanAmmo = iGetKeyValue(subsection, MT_JUMP_SECTION, MT_JUMP_SECTION2, MT_JUMP_SECTION3, MT_JUMP_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esJumpPlayer[admin].g_iHumanAmmo, value, -1, 99999); g_esJumpPlayer[admin].g_iHumanCooldown = iGetKeyValue(subsection, MT_JUMP_SECTION, MT_JUMP_SECTION2, MT_JUMP_SECTION3, MT_JUMP_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esJumpPlayer[admin].g_iHumanCooldown, value, -1, 99999); g_esJumpPlayer[admin].g_iHumanDuration = iGetKeyValue(subsection, MT_JUMP_SECTION, MT_JUMP_SECTION2, MT_JUMP_SECTION3, MT_JUMP_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esJumpPlayer[admin].g_iHumanDuration, value, -1, 99999); - g_esJumpPlayer[admin].g_iHumanMode = iGetKeyValue(subsection, MT_JUMP_SECTION, MT_JUMP_SECTION2, MT_JUMP_SECTION3, MT_JUMP_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esJumpPlayer[admin].g_iHumanMode, value, -1, 1); + g_esJumpPlayer[admin].g_iHumanMode = iGetKeyValue(subsection, MT_JUMP_SECTION, MT_JUMP_SECTION2, MT_JUMP_SECTION3, MT_JUMP_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esJumpPlayer[admin].g_iHumanMode, value, -1, 2); g_esJumpPlayer[admin].g_iHumanRangeCooldown = iGetKeyValue(subsection, MT_JUMP_SECTION, MT_JUMP_SECTION2, MT_JUMP_SECTION3, MT_JUMP_SECTION4, key, "HumanRangeCooldown", "Human Range Cooldown", "Human_Range_Cooldown", "hrangecooldown", g_esJumpPlayer[admin].g_iHumanRangeCooldown, value, -1, 99999); g_esJumpPlayer[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_JUMP_SECTION, MT_JUMP_SECTION2, MT_JUMP_SECTION3, MT_JUMP_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esJumpPlayer[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); g_esJumpPlayer[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_JUMP_SECTION, MT_JUMP_SECTION2, MT_JUMP_SECTION3, MT_JUMP_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esJumpPlayer[admin].g_iRequiresHumans, value, -1, 32); @@ -846,7 +854,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esJumpSpecial[type].g_iHumanAmmo = iGetKeyValue(subsection, MT_JUMP_SECTION, MT_JUMP_SECTION2, MT_JUMP_SECTION3, MT_JUMP_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esJumpSpecial[type].g_iHumanAmmo, value, -1, 99999); g_esJumpSpecial[type].g_iHumanCooldown = iGetKeyValue(subsection, MT_JUMP_SECTION, MT_JUMP_SECTION2, MT_JUMP_SECTION3, MT_JUMP_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esJumpSpecial[type].g_iHumanCooldown, value, -1, 99999); g_esJumpSpecial[type].g_iHumanDuration = iGetKeyValue(subsection, MT_JUMP_SECTION, MT_JUMP_SECTION2, MT_JUMP_SECTION3, MT_JUMP_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esJumpSpecial[type].g_iHumanDuration, value, -1, 99999); - g_esJumpSpecial[type].g_iHumanMode = iGetKeyValue(subsection, MT_JUMP_SECTION, MT_JUMP_SECTION2, MT_JUMP_SECTION3, MT_JUMP_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esJumpSpecial[type].g_iHumanMode, value, -1, 1); + g_esJumpSpecial[type].g_iHumanMode = iGetKeyValue(subsection, MT_JUMP_SECTION, MT_JUMP_SECTION2, MT_JUMP_SECTION3, MT_JUMP_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esJumpSpecial[type].g_iHumanMode, value, -1, 2); g_esJumpSpecial[type].g_iHumanRangeCooldown = iGetKeyValue(subsection, MT_JUMP_SECTION, MT_JUMP_SECTION2, MT_JUMP_SECTION3, MT_JUMP_SECTION4, key, "HumanRangeCooldown", "Human Range Cooldown", "Human_Range_Cooldown", "hrangecooldown", g_esJumpSpecial[type].g_iHumanRangeCooldown, value, -1, 99999); g_esJumpSpecial[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_JUMP_SECTION, MT_JUMP_SECTION2, MT_JUMP_SECTION3, MT_JUMP_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esJumpSpecial[type].g_flOpenAreasOnly, value, -1.0, 99999.0); g_esJumpSpecial[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_JUMP_SECTION, MT_JUMP_SECTION2, MT_JUMP_SECTION3, MT_JUMP_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esJumpSpecial[type].g_iRequiresHumans, value, -1, 32); @@ -876,7 +884,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esJumpAbility[type].g_iHumanAmmo = iGetKeyValue(subsection, MT_JUMP_SECTION, MT_JUMP_SECTION2, MT_JUMP_SECTION3, MT_JUMP_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esJumpAbility[type].g_iHumanAmmo, value, -1, 99999); g_esJumpAbility[type].g_iHumanCooldown = iGetKeyValue(subsection, MT_JUMP_SECTION, MT_JUMP_SECTION2, MT_JUMP_SECTION3, MT_JUMP_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esJumpAbility[type].g_iHumanCooldown, value, -1, 99999); g_esJumpAbility[type].g_iHumanDuration = iGetKeyValue(subsection, MT_JUMP_SECTION, MT_JUMP_SECTION2, MT_JUMP_SECTION3, MT_JUMP_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esJumpAbility[type].g_iHumanDuration, value, -1, 99999); - g_esJumpAbility[type].g_iHumanMode = iGetKeyValue(subsection, MT_JUMP_SECTION, MT_JUMP_SECTION2, MT_JUMP_SECTION3, MT_JUMP_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esJumpAbility[type].g_iHumanMode, value, -1, 1); + g_esJumpAbility[type].g_iHumanMode = iGetKeyValue(subsection, MT_JUMP_SECTION, MT_JUMP_SECTION2, MT_JUMP_SECTION3, MT_JUMP_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esJumpAbility[type].g_iHumanMode, value, -1, 2); g_esJumpAbility[type].g_iHumanRangeCooldown = iGetKeyValue(subsection, MT_JUMP_SECTION, MT_JUMP_SECTION2, MT_JUMP_SECTION3, MT_JUMP_SECTION4, key, "HumanRangeCooldown", "Human Range Cooldown", "Human_Range_Cooldown", "hrangecooldown", g_esJumpAbility[type].g_iHumanRangeCooldown, value, -1, 99999); g_esJumpAbility[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_JUMP_SECTION, MT_JUMP_SECTION2, MT_JUMP_SECTION3, MT_JUMP_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esJumpAbility[type].g_flOpenAreasOnly, value, -1.0, 99999.0); g_esJumpAbility[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_JUMP_SECTION, MT_JUMP_SECTION2, MT_JUMP_SECTION3, MT_JUMP_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esJumpAbility[type].g_iRequiresHumans, value, -1, 32); @@ -1083,8 +1091,9 @@ public void MT_OnButtonPressed(int tank, int button) if ((button & MT_MAIN_KEY) && (g_esJumpCache[tank].g_iJumpAbility == 2 || g_esJumpCache[tank].g_iJumpAbility == 3) && g_esJumpCache[tank].g_iHumanAbility == 1) { bool bRecharging = g_esJumpPlayer[tank].g_iCooldown != -1 && g_esJumpPlayer[tank].g_iCooldown >= iTime; + int iHumanMode = g_esJumpCache[tank].g_iHumanMode; - switch (g_esJumpCache[tank].g_iHumanMode) + switch (iHumanMode) { case 0: { @@ -1101,9 +1110,9 @@ public void MT_OnButtonPressed(int tank, int button) MT_PrintToChat(tank, "%s %t", MT_TAG3, "JumpHuman5", (g_esJumpPlayer[tank].g_iCooldown - iTime)); } } - case 1: + case 1, 2: { - if (g_esJumpPlayer[tank].g_iAmmoCount < g_esJumpCache[tank].g_iHumanAmmo && g_esJumpCache[tank].g_iHumanAmmo > 0) + if ((iHumanMode == 2 && g_esJumpPlayer[tank].g_bActivated) || (g_esJumpPlayer[tank].g_iAmmoCount < g_esJumpCache[tank].g_iHumanAmmo && g_esJumpCache[tank].g_iHumanAmmo > 0)) { if (!g_esJumpPlayer[tank].g_bActivated && !bRecharging) { @@ -1115,7 +1124,11 @@ public void MT_OnButtonPressed(int tank, int button) } else if (g_esJumpPlayer[tank].g_bActivated) { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "JumpHuman4"); + switch (iHumanMode) + { + case 1: MT_PrintToChat(tank, "%s %t", MT_TAG3, "JumpHuman4"); + case 2: vJumpReset3(tank); + } } else if (bRecharging) { @@ -1497,49 +1510,53 @@ float flGetNearestSurvivor(int tank) return 0.0; } -void tTimerJumpCombo(Handle timer, DataPack pack) +Action tTimerJumpCombo(Handle timer, DataPack pack) { pack.Reset(); int iTank = GetClientOfUserId(pack.ReadCell()); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esJumpAbility[g_esJumpPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esJumpPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esJumpPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esJumpCache[iTank].g_iJumpAbility == 0 || g_esJumpCache[iTank].g_iJumpAbility == 2) { - return; + return Plugin_Stop; } float flRandom = pack.ReadFloat(); int iPos = pack.ReadCell(); vJumpAbility(iTank, true, flRandom, iPos); + + return Plugin_Continue; } -void tTimerJumpCombo2(Handle timer, DataPack pack) +Action tTimerJumpCombo2(Handle timer, DataPack pack) { pack.Reset(); int iTank = GetClientOfUserId(pack.ReadCell()); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esJumpAbility[g_esJumpPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esJumpPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esJumpPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esJumpCache[iTank].g_iJumpAbility == 0 || g_esJumpCache[iTank].g_iJumpAbility == 1) { - return; + return Plugin_Stop; } int iPos = pack.ReadCell(); vJumpAbility(iTank, false, .pos = iPos); + + return Plugin_Continue; } -void tTimerJumpCombo3(Handle timer, DataPack pack) +Action tTimerJumpCombo3(Handle timer, DataPack pack) { pack.Reset(); int iSurvivor = GetClientOfUserId(pack.ReadCell()); if (!bIsSurvivor(iSurvivor) || g_esJumpPlayer[iSurvivor].g_bAffected) { - return; + return Plugin_Stop; } int iTank = GetClientOfUserId(pack.ReadCell()); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esJumpAbility[g_esJumpPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esJumpPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esJumpPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esJumpCache[iTank].g_iJumpHit == 0) { - return; + return Plugin_Stop; } float flRandom = pack.ReadFloat(), flChance = pack.ReadFloat(); @@ -1554,6 +1571,8 @@ void tTimerJumpCombo3(Handle timer, DataPack pack) { vJumpHit(iSurvivor, iTank, flRandom, flChance, g_esJumpCache[iTank].g_iJumpHit, MT_MESSAGE_MELEE, MT_ATTACK_MELEE, iPos); } + + return Plugin_Continue; } Action tTimerJump(Handle timer, DataPack pack) diff --git a/addons/sourcemod/scripting/mutant_tanks/abilities/mt_kamikaze.sp b/addons/sourcemod/scripting/mutant_tanks/abilities/mt_kamikaze.sp deleted file mode 100644 index b3f015828a..0000000000 --- a/addons/sourcemod/scripting/mutant_tanks/abilities/mt_kamikaze.sp +++ /dev/null @@ -1,1146 +0,0 @@ -/** - * Mutant Tanks: a L4D/L4D2 SourceMod Plugin - * Copyright (C) 2024 Alfred "Psyk0tik" Llagas - * - * 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 . - **/ - -#define MT_KAMIKAZE_COMPILE_METHOD 0 // 0: packaged, 1: standalone - -#if !defined MT_ABILITIES_MAIN - #if MT_KAMIKAZE_COMPILE_METHOD == 1 - #include - #include - #else - #error This file must be inside "scripting/mutant_tanks/abilities" while compiling "mt_abilities.sp" to include its content. - #endif -public Plugin myinfo = -{ - name = "[MT] Kamikaze Ability", - author = MT_AUTHOR, - description = "The Mutant Tank kills itself along with a survivor victim.", - version = MT_VERSION, - url = MT_URL -}; - -bool g_bDedicated, g_bLateLoad, g_bSecondGame; - -public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max) -{ - switch (GetEngineVersion()) - { - case Engine_Left4Dead: g_bSecondGame = false; - case Engine_Left4Dead2: g_bSecondGame = true; - default: - { - strcopy(error, err_max, "\"[MT] Kamikaze Ability\" only supports Left 4 Dead 1 & 2."); - - return APLRes_SilentFailure; - } - } - - g_bDedicated = IsDedicatedServer(); - g_bLateLoad = late; - - return APLRes_Success; -} - -#define PARTICLE_BLOOD "boomer_explode_D" - -#define SOUND_GROWL2 "player/tank/voice/growl/tank_climb_01.wav" // Only available in L4D2 -#define SOUND_GROWL1 "player/tank/voice/growl/hulk_growl_1.wav" // Only available in L4D1 -#define SOUND_SMASH2 "player/charger/hit/charger_smash_02.wav" // Only available in L4D2 -#define SOUND_SMASH1 "player/tank/hit/hulk_punch_1.wav" -#else - #if MT_KAMIKAZE_COMPILE_METHOD == 1 - #error This file must be compiled as a standalone plugin. - #endif -#endif - -#define MT_KAMIKAZE_SECTION "kamikazeability" -#define MT_KAMIKAZE_SECTION2 "kamikaze ability" -#define MT_KAMIKAZE_SECTION3 "kamikaze_ability" -#define MT_KAMIKAZE_SECTION4 "kamikaze" - -#define MT_MENU_KAMIKAZE "Kamikaze Ability" - -enum struct esKamikazePlayer -{ - bool g_bFailed; - - float g_flCloseAreasOnly; - float g_flDamage; - float g_flKamikazeChance; - float g_flKamikazeMeter; - float g_flKamikazeRange; - float g_flKamikazeRangeChance; - float g_flOpenAreasOnly; - - int g_iAccessFlags; - int g_iComboAbility; - int g_iHumanAbility; - int g_iImmunityFlags; - int g_iKamikazeAbility; - int g_iKamikazeBody; - int g_iKamikazeEffect; - int g_iKamikazeHit; - int g_iKamikazeHitMode; - int g_iKamikazeMessage; - int g_iKamikazeMode; - int g_iKamikazeSight; - int g_iRequiresHumans; - int g_iTankType; - int g_iTankTypeRecorded; -} - -esKamikazePlayer g_esKamikazePlayer[MAXPLAYERS + 1]; - -enum struct esKamikazeTeammate -{ - float g_flCloseAreasOnly; - float g_flKamikazeChance; - float g_flKamikazeMeter; - float g_flKamikazeRange; - float g_flKamikazeRangeChance; - float g_flOpenAreasOnly; - - int g_iComboAbility; - int g_iHumanAbility; - int g_iKamikazeAbility; - int g_iKamikazeBody; - int g_iKamikazeEffect; - int g_iKamikazeHit; - int g_iKamikazeHitMode; - int g_iKamikazeMessage; - int g_iKamikazeMode; - int g_iKamikazeSight; - int g_iRequiresHumans; -} - -esKamikazeTeammate g_esKamikazeTeammate[MAXPLAYERS + 1]; - -enum struct esKamikazeAbility -{ - float g_flCloseAreasOnly; - float g_flKamikazeChance; - float g_flKamikazeMeter; - float g_flKamikazeRange; - float g_flKamikazeRangeChance; - float g_flOpenAreasOnly; - - int g_iAccessFlags; - int g_iComboAbility; - int g_iHumanAbility; - int g_iImmunityFlags; - int g_iKamikazeAbility; - int g_iKamikazeBody; - int g_iKamikazeEffect; - int g_iKamikazeHit; - int g_iKamikazeHitMode; - int g_iKamikazeMessage; - int g_iKamikazeMode; - int g_iKamikazeSight; - int g_iRequiresHumans; -} - -esKamikazeAbility g_esKamikazeAbility[MT_MAXTYPES + 1]; - -enum struct esKamikazeSpecial -{ - float g_flCloseAreasOnly; - float g_flKamikazeChance; - float g_flKamikazeMeter; - float g_flKamikazeRange; - float g_flKamikazeRangeChance; - float g_flOpenAreasOnly; - - int g_iComboAbility; - int g_iHumanAbility; - int g_iKamikazeAbility; - int g_iKamikazeBody; - int g_iKamikazeEffect; - int g_iKamikazeHit; - int g_iKamikazeHitMode; - int g_iKamikazeMessage; - int g_iKamikazeMode; - int g_iKamikazeSight; - int g_iRequiresHumans; -} - -esKamikazeSpecial g_esKamikazeSpecial[MT_MAXTYPES + 1]; - -enum struct esKamikazeCache -{ - float g_flCloseAreasOnly; - float g_flKamikazeChance; - float g_flKamikazeMeter; - float g_flKamikazeRange; - float g_flKamikazeRangeChance; - float g_flOpenAreasOnly; - - int g_iComboAbility; - int g_iHumanAbility; - int g_iKamikazeAbility; - int g_iKamikazeBody; - int g_iKamikazeEffect; - int g_iKamikazeHit; - int g_iKamikazeHitMode; - int g_iKamikazeMessage; - int g_iKamikazeMode; - int g_iKamikazeSight; - int g_iRequiresHumans; -} - -esKamikazeCache g_esKamikazeCache[MAXPLAYERS + 1]; - -int g_iKamikazeDeathModelOwner = 0; - -#if !defined MT_ABILITIES_MAIN -public void OnPluginStart() -{ - LoadTranslations("common.phrases"); - LoadTranslations("mutant_tanks.phrases"); - LoadTranslations("mutant_tanks_names.phrases"); - - RegConsoleCmd("sm_mt_kamikaze", cmdKamikazeInfo, "View information about the Kamikaze ability."); - - if (g_bLateLoad) - { - for (int iPlayer = 1; iPlayer <= MaxClients; iPlayer++) - { - if (bIsValidClient(iPlayer, MT_CHECK_INGAME)) - { - OnClientPutInServer(iPlayer); - } - } - - g_bLateLoad = false; - } -} -#endif - -#if defined MT_ABILITIES_MAIN -void vKamikazeMapStart() -#else -public void OnMapStart() -#endif -{ - if (g_bSecondGame) - { - PrecacheSound(SOUND_GROWL2, true); - PrecacheSound(SOUND_SMASH2, true); - } - else - { - PrecacheSound(SOUND_GROWL1, true); - PrecacheSound(SOUND_SMASH1, true); - } - - vKamikazeReset(); -} - -#if defined MT_ABILITIES_MAIN -void vKamikazeClientPutInServer(int client) -#else -public void OnClientPutInServer(int client) -#endif -{ - g_esKamikazePlayer[client].g_bFailed = false; - g_esKamikazePlayer[client].g_flDamage = 0.0; - - SDKHook(client, SDKHook_OnTakeDamage, OnKamikazeTakeDamage); -} - -#if defined MT_ABILITIES_MAIN -void vKamikazeClientDisconnect_Post(int client) -#else -public void OnClientDisconnect_Post(int client) -#endif -{ - g_esKamikazePlayer[client].g_bFailed = false; - g_esKamikazePlayer[client].g_flDamage = 0.0; -} - -#if defined MT_ABILITIES_MAIN -void vKamikazeMapEnd() -#else -public void OnMapEnd() -#endif -{ - vKamikazeReset(); -} - -#if !defined MT_ABILITIES_MAIN -Action cmdKamikazeInfo(int client, int args) -{ - client = iGetListenServerHost(client, g_bDedicated); - - if (!MT_IsCorePluginEnabled()) - { - MT_ReplyToCommand(client, "%s %t", MT_TAG5, "PluginDisabled"); - - return Plugin_Handled; - } - - if (!bIsValidClient(client, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_FAKECLIENT)) - { - MT_ReplyToCommand(client, "%s %t", MT_TAG, "Command is in-game only"); - - return Plugin_Handled; - } - - switch (IsVoteInProgress()) - { - case true: MT_ReplyToCommand(client, "%s %t", MT_TAG2, "Vote in Progress"); - case false: vKamikazeMenu(client, MT_KAMIKAZE_SECTION4, 0); - } - - return Plugin_Handled; -} -#endif - -void vKamikazeMenu(int client, const char[] name, int item) -{ - if (StrContains(MT_KAMIKAZE_SECTION4, name, false) == -1) - { - return; - } - - Menu mAbilityMenu = new Menu(iKamikazeMenuHandler, MENU_ACTIONS_DEFAULT|MenuAction_Display|MenuAction_DisplayItem); - mAbilityMenu.SetTitle("Kamikaze Ability Information"); - mAbilityMenu.AddItem("Status", "Status"); - mAbilityMenu.AddItem("Buttons", "Buttons"); - mAbilityMenu.AddItem("Details", "Details"); - mAbilityMenu.AddItem("Human Support", "Human Support"); - mAbilityMenu.DisplayAt(client, item, MENU_TIME_FOREVER); -} - -int iKamikazeMenuHandler(Menu menu, MenuAction action, int param1, int param2) -{ - switch (action) - { - case MenuAction_End: delete menu; - case MenuAction_Select: - { - switch (param2) - { - case 0: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esKamikazeCache[param1].g_iKamikazeAbility == 0) ? "AbilityStatus1" : "AbilityStatus2"); - case 1: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtons2"); - case 2: MT_PrintToChat(param1, "%s %t", MT_TAG3, "KamikazeDetails"); - case 3: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esKamikazeCache[param1].g_iHumanAbility == 0) ? "AbilityHumanSupport1" : "AbilityHumanSupport2"); - } - - if (bIsValidClient(param1, MT_CHECK_INGAME)) - { - vKamikazeMenu(param1, MT_KAMIKAZE_SECTION4, menu.Selection); - } - } - case MenuAction_Display: - { - char sMenuTitle[PLATFORM_MAX_PATH]; - Panel pKamikaze = view_as(param2); - FormatEx(sMenuTitle, sizeof sMenuTitle, "%T", "KamikazeMenu", param1); - pKamikaze.SetTitle(sMenuTitle); - } - case MenuAction_DisplayItem: - { - if (param2 >= 0) - { - char sMenuOption[PLATFORM_MAX_PATH]; - - switch (param2) - { - case 0: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Status", param1); - case 1: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Buttons", param1); - case 2: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Details", param1); - case 3: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "HumanSupport", param1); - } - - return RedrawMenuItem(sMenuOption); - } - } - } - - return 0; -} - -#if defined MT_ABILITIES_MAIN -void vKamikazeDisplayMenu(Menu menu) -#else -public void MT_OnDisplayMenu(Menu menu) -#endif -{ - menu.AddItem(MT_MENU_KAMIKAZE, MT_MENU_KAMIKAZE); -} - -#if defined MT_ABILITIES_MAIN -void vKamikazeMenuItemSelected(int client, const char[] info) -#else -public void MT_OnMenuItemSelected(int client, const char[] info) -#endif -{ - if (StrEqual(info, MT_MENU_KAMIKAZE, false)) - { - vKamikazeMenu(client, MT_KAMIKAZE_SECTION4, 0); - } -} - -#if defined MT_ABILITIES_MAIN -void vKamikazeMenuItemDisplayed(int client, const char[] info, char[] buffer, int size) -#else -public void MT_OnMenuItemDisplayed(int client, const char[] info, char[] buffer, int size) -#endif -{ - if (StrEqual(info, MT_MENU_KAMIKAZE, false)) - { - FormatEx(buffer, size, "%T", "KamikazeMenu2", client); - } -} - -#if defined MT_ABILITIES_MAIN -void vKamikazeEntityCreated(int entity, const char[] classname) -#else -public void OnEntityCreated(int entity, const char[] classname) -#endif -{ - if (bIsValidEntity(entity) && StrEqual(classname, "survivor_death_model")) - { - int iOwner = GetClientOfUserId(g_iKamikazeDeathModelOwner); - if (bIsValidClient(iOwner)) - { - SDKHook(entity, SDKHook_SpawnPost, OnKamikazeModelSpawnPost); - } - - g_iKamikazeDeathModelOwner = 0; - } -} - -void OnKamikazeModelSpawnPost(int model) -{ - g_iKamikazeDeathModelOwner = 0; - - SDKUnhook(model, SDKHook_SpawnPost, OnKamikazeModelSpawnPost); - - if (!bIsValidEntity(model)) - { - return; - } - - RemoveEntity(model); -} - -Action OnKamikazeTakeDamage(int victim, int &attacker, int &inflictor, float &damage, int &damagetype) -{ - if (MT_IsCorePluginEnabled() && bIsValidClient(victim, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_ALIVE) && damage > 0.0) - { - char sClassname[32]; - if (bIsValidEntity(inflictor)) - { - GetEntityClassname(inflictor, sClassname, sizeof sClassname); - } - - if (MT_IsTankSupported(attacker) && MT_IsCustomTankSupported(attacker) && bIsSurvivor(victim)) - { - if ((!MT_HasAdminAccess(attacker) && !bHasAdminAccess(attacker, g_esKamikazeAbility[g_esKamikazePlayer[attacker].g_iTankTypeRecorded].g_iAccessFlags, g_esKamikazePlayer[attacker].g_iAccessFlags)) || MT_IsAdminImmune(victim, attacker) || bIsAdminImmune(victim, g_esKamikazePlayer[attacker].g_iTankType, g_esKamikazeAbility[g_esKamikazePlayer[attacker].g_iTankTypeRecorded].g_iImmunityFlags, g_esKamikazePlayer[victim].g_iImmunityFlags)) - { - return Plugin_Continue; - } - - if (g_esKamikazeCache[attacker].g_flKamikazeMeter > 0.0 && g_esKamikazePlayer[attacker].g_flDamage < g_esKamikazeCache[attacker].g_flKamikazeMeter) - { - g_esKamikazePlayer[attacker].g_flDamage += damage; - } - - if ((g_esKamikazeCache[attacker].g_iKamikazeHitMode == 0 || g_esKamikazeCache[attacker].g_iKamikazeHitMode == 1) && g_esKamikazeCache[attacker].g_iComboAbility == 0) - { - bool bCaught = bIsSurvivorCaught(victim); - if ((bIsSpecialInfected(attacker) && (bCaught || (!bCaught && (damagetype & DMG_CLUB)) || (bIsSpitter(attacker) && StrEqual(sClassname, "insect_swarm")))) || StrEqual(sClassname[7], "tank_claw") || StrEqual(sClassname, "tank_rock")) - { - vKamikazeHit(victim, attacker, GetRandomFloat(0.1, 100.0), g_esKamikazeCache[attacker].g_flKamikazeChance, g_esKamikazeCache[attacker].g_iKamikazeHit, MT_MESSAGE_MELEE, MT_ATTACK_CLAW); - } - } - } - else if (MT_IsTankSupported(victim) && MT_IsCustomTankSupported(victim) && (g_esKamikazeCache[victim].g_iKamikazeHitMode == 0 || g_esKamikazeCache[victim].g_iKamikazeHitMode == 2) && bIsSurvivor(attacker) && g_esKamikazeCache[victim].g_iComboAbility == 0) - { - if ((!MT_HasAdminAccess(victim) && !bHasAdminAccess(victim, g_esKamikazeAbility[g_esKamikazePlayer[victim].g_iTankTypeRecorded].g_iAccessFlags, g_esKamikazePlayer[victim].g_iAccessFlags)) || MT_IsAdminImmune(attacker, victim) || bIsAdminImmune(attacker, g_esKamikazePlayer[victim].g_iTankType, g_esKamikazeAbility[g_esKamikazePlayer[victim].g_iTankTypeRecorded].g_iImmunityFlags, g_esKamikazePlayer[attacker].g_iImmunityFlags)) - { - return Plugin_Continue; - } - - if (StrEqual(sClassname[7], "melee")) - { - vKamikazeHit(attacker, victim, GetRandomFloat(0.1, 100.0), g_esKamikazeCache[victim].g_flKamikazeChance, g_esKamikazeCache[victim].g_iKamikazeHit, MT_MESSAGE_MELEE, MT_ATTACK_MELEE); - } - } - } - - return Plugin_Continue; -} - -#if defined MT_ABILITIES_MAIN -void vKamikazePluginCheck(ArrayList list) -#else -public void MT_OnPluginCheck(ArrayList list) -#endif -{ - list.PushString(MT_MENU_KAMIKAZE); -} - -#if defined MT_ABILITIES_MAIN -void vKamikazeAbilityCheck(ArrayList list, ArrayList list2, ArrayList list3, ArrayList list4) -#else -public void MT_OnAbilityCheck(ArrayList list, ArrayList list2, ArrayList list3, ArrayList list4) -#endif -{ - list.PushString(MT_KAMIKAZE_SECTION); - list2.PushString(MT_KAMIKAZE_SECTION2); - list3.PushString(MT_KAMIKAZE_SECTION3); - list4.PushString(MT_KAMIKAZE_SECTION4); -} - -#if defined MT_ABILITIES_MAIN -void vKamikazeCombineAbilities(int tank, int type, const float random, const char[] combo, int survivor, const char[] classname) -#else -public void MT_OnCombineAbilities(int tank, int type, const float random, const char[] combo, int survivor, int weapon, const char[] classname) -#endif -{ - if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esKamikazeCache[tank].g_iHumanAbility != 2) - { - return; - } - - char sCombo[320], sSet[4][32]; - FormatEx(sCombo, sizeof sCombo, ",%s,", combo); - FormatEx(sSet[0], sizeof sSet[], ",%s,", MT_KAMIKAZE_SECTION); - FormatEx(sSet[1], sizeof sSet[], ",%s,", MT_KAMIKAZE_SECTION2); - FormatEx(sSet[2], sizeof sSet[], ",%s,", MT_KAMIKAZE_SECTION3); - FormatEx(sSet[3], sizeof sSet[], ",%s,", MT_KAMIKAZE_SECTION4); - if (g_esKamikazeCache[tank].g_iComboAbility == 1 && (StrContains(sCombo, sSet[0], false) != -1 || StrContains(sCombo, sSet[1], false) != -1 || StrContains(sCombo, sSet[2], false) != -1 || StrContains(sCombo, sSet[3], false) != -1)) - { - char sAbilities[320], sSubset[10][32]; - strcopy(sAbilities, sizeof sAbilities, combo); - ExplodeString(sAbilities, ",", sSubset, sizeof sSubset, sizeof sSubset[]); - - float flChance = 0.0, flDelay = 0.0; - for (int iPos = 0; iPos < (sizeof sSubset); iPos++) - { - if (StrEqual(sSubset[iPos], MT_KAMIKAZE_SECTION, false) || StrEqual(sSubset[iPos], MT_KAMIKAZE_SECTION2, false) || StrEqual(sSubset[iPos], MT_KAMIKAZE_SECTION3, false) || StrEqual(sSubset[iPos], MT_KAMIKAZE_SECTION4, false)) - { - flDelay = MT_GetCombinationSetting(tank, 4, iPos); - - switch (type) - { - case MT_COMBO_MAINRANGE: - { - if (g_esKamikazeCache[tank].g_iKamikazeAbility == 1) - { - switch (flDelay) - { - case 0.0: vKamikazeAbility(tank, random, iPos); - default: - { - DataPack dpCombo; - CreateDataTimer(flDelay, tTimerKamikazeCombo, dpCombo, TIMER_FLAG_NO_MAPCHANGE); - dpCombo.WriteCell(GetClientUserId(tank)); - dpCombo.WriteFloat(random); - dpCombo.WriteCell(iPos); - } - } - } - } - case MT_COMBO_MELEEHIT: - { - flChance = MT_GetCombinationSetting(tank, 1, iPos); - - switch (flDelay) - { - case 0.0: - { - if ((g_esKamikazeCache[tank].g_iKamikazeHitMode == 0 || g_esKamikazeCache[tank].g_iKamikazeHitMode == 1) && (StrEqual(classname[7], "tank_claw") || StrEqual(classname, "tank_rock"))) - { - vKamikazeHit(survivor, tank, random, flChance, g_esKamikazeCache[tank].g_iKamikazeHit, MT_MESSAGE_MELEE, MT_ATTACK_CLAW); - } - else if ((g_esKamikazeCache[tank].g_iKamikazeHitMode == 0 || g_esKamikazeCache[tank].g_iKamikazeHitMode == 2) && StrEqual(classname[7], "melee")) - { - vKamikazeHit(survivor, tank, random, flChance, g_esKamikazeCache[tank].g_iKamikazeHit, MT_MESSAGE_MELEE, MT_ATTACK_MELEE); - } - } - default: - { - DataPack dpCombo; - CreateDataTimer(flDelay, tTimerKamikazeCombo2, dpCombo, TIMER_FLAG_NO_MAPCHANGE); - dpCombo.WriteCell(GetClientUserId(survivor)); - dpCombo.WriteCell(GetClientUserId(tank)); - dpCombo.WriteFloat(random); - dpCombo.WriteFloat(flChance); - dpCombo.WriteString(classname); - } - } - } - } - - break; - } - } - } -} - -#if defined MT_ABILITIES_MAIN -void vKamikazeConfigsLoad(int mode) -#else -public void MT_OnConfigsLoad(int mode) -#endif -{ - switch (mode) - { - case 1: - { - for (int iIndex = MT_GetMinType(); iIndex <= MT_GetMaxType(); iIndex++) - { - g_esKamikazeAbility[iIndex].g_iAccessFlags = 0; - g_esKamikazeAbility[iIndex].g_iImmunityFlags = 0; - g_esKamikazeAbility[iIndex].g_flCloseAreasOnly = 0.0; - g_esKamikazeAbility[iIndex].g_iComboAbility = 0; - g_esKamikazeAbility[iIndex].g_iHumanAbility = 0; - g_esKamikazeAbility[iIndex].g_flOpenAreasOnly = 0.0; - g_esKamikazeAbility[iIndex].g_iRequiresHumans = 0; - g_esKamikazeAbility[iIndex].g_iKamikazeAbility = 0; - g_esKamikazeAbility[iIndex].g_iKamikazeEffect = 0; - g_esKamikazeAbility[iIndex].g_iKamikazeMessage = 0; - g_esKamikazeAbility[iIndex].g_iKamikazeBody = 1; - g_esKamikazeAbility[iIndex].g_flKamikazeChance = 33.3; - g_esKamikazeAbility[iIndex].g_iKamikazeHit = 0; - g_esKamikazeAbility[iIndex].g_iKamikazeHitMode = 0; - g_esKamikazeAbility[iIndex].g_flKamikazeMeter = 0.0; - g_esKamikazeAbility[iIndex].g_iKamikazeMode = 1; - g_esKamikazeAbility[iIndex].g_flKamikazeRange = 150.0; - g_esKamikazeAbility[iIndex].g_flKamikazeRangeChance = 15.0; - g_esKamikazeAbility[iIndex].g_iKamikazeSight = 0; - - g_esKamikazeSpecial[iIndex].g_flCloseAreasOnly = -1.0; - g_esKamikazeSpecial[iIndex].g_iComboAbility = -1; - g_esKamikazeSpecial[iIndex].g_iHumanAbility = -1; - g_esKamikazeSpecial[iIndex].g_flOpenAreasOnly = -1.0; - g_esKamikazeSpecial[iIndex].g_iRequiresHumans = -1; - g_esKamikazeSpecial[iIndex].g_iKamikazeAbility = -1; - g_esKamikazeSpecial[iIndex].g_iKamikazeEffect = -1; - g_esKamikazeSpecial[iIndex].g_iKamikazeMessage = -1; - g_esKamikazeSpecial[iIndex].g_iKamikazeBody = -1; - g_esKamikazeSpecial[iIndex].g_flKamikazeChance = -1.0; - g_esKamikazeSpecial[iIndex].g_iKamikazeHit = -1; - g_esKamikazeSpecial[iIndex].g_iKamikazeHitMode = -1; - g_esKamikazeSpecial[iIndex].g_flKamikazeMeter = -1.0; - g_esKamikazeSpecial[iIndex].g_iKamikazeMode = -1; - g_esKamikazeSpecial[iIndex].g_flKamikazeRange = -1.0; - g_esKamikazeSpecial[iIndex].g_flKamikazeRangeChance = -1.0; - g_esKamikazeSpecial[iIndex].g_iKamikazeSight = -1; - } - } - case 3: - { - for (int iPlayer = 1; iPlayer <= MaxClients; iPlayer++) - { - g_esKamikazePlayer[iPlayer].g_iAccessFlags = -1; - g_esKamikazePlayer[iPlayer].g_iImmunityFlags = -1; - g_esKamikazePlayer[iPlayer].g_flCloseAreasOnly = -1.0; - g_esKamikazePlayer[iPlayer].g_iComboAbility = -1; - g_esKamikazePlayer[iPlayer].g_iHumanAbility = -1; - g_esKamikazePlayer[iPlayer].g_flOpenAreasOnly = -1.0; - g_esKamikazePlayer[iPlayer].g_iRequiresHumans = -1; - g_esKamikazePlayer[iPlayer].g_iKamikazeAbility = -1; - g_esKamikazePlayer[iPlayer].g_iKamikazeEffect = -1; - g_esKamikazePlayer[iPlayer].g_iKamikazeMessage = -1; - g_esKamikazePlayer[iPlayer].g_iKamikazeBody = -1; - g_esKamikazePlayer[iPlayer].g_flKamikazeChance = -1.0; - g_esKamikazePlayer[iPlayer].g_iKamikazeHit = -1; - g_esKamikazePlayer[iPlayer].g_iKamikazeHitMode = -1; - g_esKamikazePlayer[iPlayer].g_flKamikazeMeter = -1.0; - g_esKamikazePlayer[iPlayer].g_iKamikazeMode = -1; - g_esKamikazePlayer[iPlayer].g_flKamikazeRange = -1.0; - g_esKamikazePlayer[iPlayer].g_flKamikazeRangeChance = -1.0; - g_esKamikazePlayer[iPlayer].g_iKamikazeSight = -1; - - g_esKamikazeTeammate[iPlayer].g_flCloseAreasOnly = -1.0; - g_esKamikazeTeammate[iPlayer].g_iComboAbility = -1; - g_esKamikazeTeammate[iPlayer].g_iHumanAbility = -1; - g_esKamikazeTeammate[iPlayer].g_flOpenAreasOnly = -1.0; - g_esKamikazeTeammate[iPlayer].g_iRequiresHumans = -1; - g_esKamikazeTeammate[iPlayer].g_iKamikazeAbility = -1; - g_esKamikazeTeammate[iPlayer].g_iKamikazeEffect = -1; - g_esKamikazeTeammate[iPlayer].g_iKamikazeMessage = -1; - g_esKamikazeTeammate[iPlayer].g_iKamikazeBody = -1; - g_esKamikazeTeammate[iPlayer].g_flKamikazeChance = -1.0; - g_esKamikazeTeammate[iPlayer].g_iKamikazeHit = -1; - g_esKamikazeTeammate[iPlayer].g_iKamikazeHitMode = -1; - g_esKamikazeTeammate[iPlayer].g_flKamikazeMeter = -1.0; - g_esKamikazeTeammate[iPlayer].g_iKamikazeMode = -1; - g_esKamikazeTeammate[iPlayer].g_flKamikazeRange = -1.0; - g_esKamikazeTeammate[iPlayer].g_flKamikazeRangeChance = -1.0; - g_esKamikazeTeammate[iPlayer].g_iKamikazeSight = -1; - } - } - } -} - -#if defined MT_ABILITIES_MAIN -void vKamikazeConfigsLoaded(const char[] subsection, const char[] key, const char[] value, int type, int admin, int mode, bool special, const char[] specsection) -#else -public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const char[] value, int type, int admin, int mode, bool special, const char[] specsection) -#endif -{ - if ((mode == -1 || mode == 3) && bIsValidClient(admin)) - { - if (special && specsection[0] != '\0') - { - g_esKamikazeTeammate[admin].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_KAMIKAZE_SECTION, MT_KAMIKAZE_SECTION2, MT_KAMIKAZE_SECTION3, MT_KAMIKAZE_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esKamikazeTeammate[admin].g_flCloseAreasOnly, value, -1.0, 99999.0); - g_esKamikazeTeammate[admin].g_iComboAbility = iGetKeyValue(subsection, MT_KAMIKAZE_SECTION, MT_KAMIKAZE_SECTION2, MT_KAMIKAZE_SECTION3, MT_KAMIKAZE_SECTION4, key, "ComboAbility", "Combo Ability", "Combo_Ability", "combo", g_esKamikazeTeammate[admin].g_iComboAbility, value, -1, 1); - g_esKamikazeTeammate[admin].g_iHumanAbility = iGetKeyValue(subsection, MT_KAMIKAZE_SECTION, MT_KAMIKAZE_SECTION2, MT_KAMIKAZE_SECTION3, MT_KAMIKAZE_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esKamikazeTeammate[admin].g_iHumanAbility, value, -1, 2); - g_esKamikazeTeammate[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_KAMIKAZE_SECTION, MT_KAMIKAZE_SECTION2, MT_KAMIKAZE_SECTION3, MT_KAMIKAZE_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esKamikazeTeammate[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); - g_esKamikazeTeammate[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_KAMIKAZE_SECTION, MT_KAMIKAZE_SECTION2, MT_KAMIKAZE_SECTION3, MT_KAMIKAZE_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esKamikazeTeammate[admin].g_iRequiresHumans, value, -1, 32); - g_esKamikazeTeammate[admin].g_iKamikazeAbility = iGetKeyValue(subsection, MT_KAMIKAZE_SECTION, MT_KAMIKAZE_SECTION2, MT_KAMIKAZE_SECTION3, MT_KAMIKAZE_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esKamikazeTeammate[admin].g_iKamikazeAbility, value, -1, 1); - g_esKamikazeTeammate[admin].g_iKamikazeEffect = iGetKeyValue(subsection, MT_KAMIKAZE_SECTION, MT_KAMIKAZE_SECTION2, MT_KAMIKAZE_SECTION3, MT_KAMIKAZE_SECTION4, key, "AbilityEffect", "Ability Effect", "Ability_Effect", "effect", g_esKamikazeTeammate[admin].g_iKamikazeEffect, value, -1, 7); - g_esKamikazeTeammate[admin].g_iKamikazeMessage = iGetKeyValue(subsection, MT_KAMIKAZE_SECTION, MT_KAMIKAZE_SECTION2, MT_KAMIKAZE_SECTION3, MT_KAMIKAZE_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esKamikazeTeammate[admin].g_iKamikazeMessage, value, -1, 3); - g_esKamikazeTeammate[admin].g_iKamikazeSight = iGetKeyValue(subsection, MT_KAMIKAZE_SECTION, MT_KAMIKAZE_SECTION2, MT_KAMIKAZE_SECTION3, MT_KAMIKAZE_SECTION4, key, "AbilitySight", "Ability Sight", "Ability_Sight", "sight", g_esKamikazeTeammate[admin].g_iKamikazeSight, value, -1, 5); - g_esKamikazeTeammate[admin].g_iKamikazeBody = iGetKeyValue(subsection, MT_KAMIKAZE_SECTION, MT_KAMIKAZE_SECTION2, MT_KAMIKAZE_SECTION3, MT_KAMIKAZE_SECTION4, key, "KamikazeBody", "Kamikaze Body", "Kamikaze_Body", "body", g_esKamikazeTeammate[admin].g_iKamikazeBody, value, -1, 1); - g_esKamikazeTeammate[admin].g_flKamikazeChance = flGetKeyValue(subsection, MT_KAMIKAZE_SECTION, MT_KAMIKAZE_SECTION2, MT_KAMIKAZE_SECTION3, MT_KAMIKAZE_SECTION4, key, "KamikazeChance", "Kamikaze Chance", "Kamikaze_Chance", "chance", g_esKamikazeTeammate[admin].g_flKamikazeChance, value, -1.0, 100.0); - g_esKamikazeTeammate[admin].g_iKamikazeHit = iGetKeyValue(subsection, MT_KAMIKAZE_SECTION, MT_KAMIKAZE_SECTION2, MT_KAMIKAZE_SECTION3, MT_KAMIKAZE_SECTION4, key, "KamikazeHit", "Kamikaze Hit", "Kamikaze_Hit", "hit", g_esKamikazeTeammate[admin].g_iKamikazeHit, value, -1, 1); - g_esKamikazeTeammate[admin].g_iKamikazeHitMode = iGetKeyValue(subsection, MT_KAMIKAZE_SECTION, MT_KAMIKAZE_SECTION2, MT_KAMIKAZE_SECTION3, MT_KAMIKAZE_SECTION4, key, "KamikazeHitMode", "Kamikaze Hit Mode", "Kamikaze_Hit_Mode", "hitmode", g_esKamikazeTeammate[admin].g_iKamikazeHitMode, value, -1, 2); - g_esKamikazeTeammate[admin].g_flKamikazeMeter = flGetKeyValue(subsection, MT_KAMIKAZE_SECTION, MT_KAMIKAZE_SECTION2, MT_KAMIKAZE_SECTION3, MT_KAMIKAZE_SECTION4, key, "KamikazeMeter", "Kamikaze Meter", "Kamikaze_Meter", "meter", g_esKamikazeTeammate[admin].g_flKamikazeMeter, value, -1.0, 99999.0); - g_esKamikazeTeammate[admin].g_iKamikazeMode = iGetKeyValue(subsection, MT_KAMIKAZE_SECTION, MT_KAMIKAZE_SECTION2, MT_KAMIKAZE_SECTION3, MT_KAMIKAZE_SECTION4, key, "KamikazeMode", "Kamikaze Mode", "Kamikaze_Mode", "mode", g_esKamikazeTeammate[admin].g_iKamikazeMode, value, -1, 3); - g_esKamikazeTeammate[admin].g_flKamikazeRange = flGetKeyValue(subsection, MT_KAMIKAZE_SECTION, MT_KAMIKAZE_SECTION2, MT_KAMIKAZE_SECTION3, MT_KAMIKAZE_SECTION4, key, "KamikazeRange", "Kamikaze Range", "Kamikaze_Range", "range", g_esKamikazeTeammate[admin].g_flKamikazeRange, value, -1.0, 99999.0); - g_esKamikazeTeammate[admin].g_flKamikazeRangeChance = flGetKeyValue(subsection, MT_KAMIKAZE_SECTION, MT_KAMIKAZE_SECTION2, MT_KAMIKAZE_SECTION3, MT_KAMIKAZE_SECTION4, key, "KamikazeRangeChance", "Kamikaze Range Chance", "Kamikaze_Range_Chance", "rangechance", g_esKamikazeTeammate[admin].g_flKamikazeRangeChance, value, -1.0, 100.0); - } - else - { - g_esKamikazePlayer[admin].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_KAMIKAZE_SECTION, MT_KAMIKAZE_SECTION2, MT_KAMIKAZE_SECTION3, MT_KAMIKAZE_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esKamikazePlayer[admin].g_flCloseAreasOnly, value, -1.0, 99999.0); - g_esKamikazePlayer[admin].g_iComboAbility = iGetKeyValue(subsection, MT_KAMIKAZE_SECTION, MT_KAMIKAZE_SECTION2, MT_KAMIKAZE_SECTION3, MT_KAMIKAZE_SECTION4, key, "ComboAbility", "Combo Ability", "Combo_Ability", "combo", g_esKamikazePlayer[admin].g_iComboAbility, value, -1, 1); - g_esKamikazePlayer[admin].g_iHumanAbility = iGetKeyValue(subsection, MT_KAMIKAZE_SECTION, MT_KAMIKAZE_SECTION2, MT_KAMIKAZE_SECTION3, MT_KAMIKAZE_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esKamikazePlayer[admin].g_iHumanAbility, value, -1, 2); - g_esKamikazePlayer[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_KAMIKAZE_SECTION, MT_KAMIKAZE_SECTION2, MT_KAMIKAZE_SECTION3, MT_KAMIKAZE_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esKamikazePlayer[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); - g_esKamikazePlayer[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_KAMIKAZE_SECTION, MT_KAMIKAZE_SECTION2, MT_KAMIKAZE_SECTION3, MT_KAMIKAZE_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esKamikazePlayer[admin].g_iRequiresHumans, value, -1, 32); - g_esKamikazePlayer[admin].g_iKamikazeAbility = iGetKeyValue(subsection, MT_KAMIKAZE_SECTION, MT_KAMIKAZE_SECTION2, MT_KAMIKAZE_SECTION3, MT_KAMIKAZE_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esKamikazePlayer[admin].g_iKamikazeAbility, value, -1, 1); - g_esKamikazePlayer[admin].g_iKamikazeEffect = iGetKeyValue(subsection, MT_KAMIKAZE_SECTION, MT_KAMIKAZE_SECTION2, MT_KAMIKAZE_SECTION3, MT_KAMIKAZE_SECTION4, key, "AbilityEffect", "Ability Effect", "Ability_Effect", "effect", g_esKamikazePlayer[admin].g_iKamikazeEffect, value, -1, 7); - g_esKamikazePlayer[admin].g_iKamikazeMessage = iGetKeyValue(subsection, MT_KAMIKAZE_SECTION, MT_KAMIKAZE_SECTION2, MT_KAMIKAZE_SECTION3, MT_KAMIKAZE_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esKamikazePlayer[admin].g_iKamikazeMessage, value, -1, 3); - g_esKamikazePlayer[admin].g_iKamikazeSight = iGetKeyValue(subsection, MT_KAMIKAZE_SECTION, MT_KAMIKAZE_SECTION2, MT_KAMIKAZE_SECTION3, MT_KAMIKAZE_SECTION4, key, "AbilitySight", "Ability Sight", "Ability_Sight", "sight", g_esKamikazePlayer[admin].g_iKamikazeSight, value, -1, 5); - g_esKamikazePlayer[admin].g_iKamikazeBody = iGetKeyValue(subsection, MT_KAMIKAZE_SECTION, MT_KAMIKAZE_SECTION2, MT_KAMIKAZE_SECTION3, MT_KAMIKAZE_SECTION4, key, "KamikazeBody", "Kamikaze Body", "Kamikaze_Body", "body", g_esKamikazePlayer[admin].g_iKamikazeBody, value, -1, 1); - g_esKamikazePlayer[admin].g_flKamikazeChance = flGetKeyValue(subsection, MT_KAMIKAZE_SECTION, MT_KAMIKAZE_SECTION2, MT_KAMIKAZE_SECTION3, MT_KAMIKAZE_SECTION4, key, "KamikazeChance", "Kamikaze Chance", "Kamikaze_Chance", "chance", g_esKamikazePlayer[admin].g_flKamikazeChance, value, -1.0, 100.0); - g_esKamikazePlayer[admin].g_iKamikazeHit = iGetKeyValue(subsection, MT_KAMIKAZE_SECTION, MT_KAMIKAZE_SECTION2, MT_KAMIKAZE_SECTION3, MT_KAMIKAZE_SECTION4, key, "KamikazeHit", "Kamikaze Hit", "Kamikaze_Hit", "hit", g_esKamikazePlayer[admin].g_iKamikazeHit, value, -1, 1); - g_esKamikazePlayer[admin].g_iKamikazeHitMode = iGetKeyValue(subsection, MT_KAMIKAZE_SECTION, MT_KAMIKAZE_SECTION2, MT_KAMIKAZE_SECTION3, MT_KAMIKAZE_SECTION4, key, "KamikazeHitMode", "Kamikaze Hit Mode", "Kamikaze_Hit_Mode", "hitmode", g_esKamikazePlayer[admin].g_iKamikazeHitMode, value, -1, 2); - g_esKamikazePlayer[admin].g_flKamikazeMeter = flGetKeyValue(subsection, MT_KAMIKAZE_SECTION, MT_KAMIKAZE_SECTION2, MT_KAMIKAZE_SECTION3, MT_KAMIKAZE_SECTION4, key, "KamikazeMeter", "Kamikaze Meter", "Kamikaze_Meter", "meter", g_esKamikazePlayer[admin].g_flKamikazeMeter, value, -1.0, 99999.0); - g_esKamikazePlayer[admin].g_iKamikazeMode = iGetKeyValue(subsection, MT_KAMIKAZE_SECTION, MT_KAMIKAZE_SECTION2, MT_KAMIKAZE_SECTION3, MT_KAMIKAZE_SECTION4, key, "KamikazeMode", "Kamikaze Mode", "Kamikaze_Mode", "mode", g_esKamikazePlayer[admin].g_iKamikazeMode, value, -1, 3); - g_esKamikazePlayer[admin].g_flKamikazeRange = flGetKeyValue(subsection, MT_KAMIKAZE_SECTION, MT_KAMIKAZE_SECTION2, MT_KAMIKAZE_SECTION3, MT_KAMIKAZE_SECTION4, key, "KamikazeRange", "Kamikaze Range", "Kamikaze_Range", "range", g_esKamikazePlayer[admin].g_flKamikazeRange, value, -1.0, 99999.0); - g_esKamikazePlayer[admin].g_flKamikazeRangeChance = flGetKeyValue(subsection, MT_KAMIKAZE_SECTION, MT_KAMIKAZE_SECTION2, MT_KAMIKAZE_SECTION3, MT_KAMIKAZE_SECTION4, key, "KamikazeRangeChance", "Kamikaze Range Chance", "Kamikaze_Range_Chance", "rangechance", g_esKamikazePlayer[admin].g_flKamikazeRangeChance, value, -1.0, 100.0); - g_esKamikazePlayer[admin].g_iAccessFlags = iGetAdminFlagsValue(subsection, MT_KAMIKAZE_SECTION, MT_KAMIKAZE_SECTION2, MT_KAMIKAZE_SECTION3, MT_KAMIKAZE_SECTION4, key, "AccessFlags", "Access Flags", "Access_Flags", "access", value); - g_esKamikazePlayer[admin].g_iImmunityFlags = iGetAdminFlagsValue(subsection, MT_KAMIKAZE_SECTION, MT_KAMIKAZE_SECTION2, MT_KAMIKAZE_SECTION3, MT_KAMIKAZE_SECTION4, key, "ImmunityFlags", "Immunity Flags", "Immunity_Flags", "immunity", value); - } - } - - if (mode < 3 && type > 0) - { - if (special && specsection[0] != '\0') - { - g_esKamikazeSpecial[type].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_KAMIKAZE_SECTION, MT_KAMIKAZE_SECTION2, MT_KAMIKAZE_SECTION3, MT_KAMIKAZE_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esKamikazeSpecial[type].g_flCloseAreasOnly, value, -1.0, 99999.0); - g_esKamikazeSpecial[type].g_iComboAbility = iGetKeyValue(subsection, MT_KAMIKAZE_SECTION, MT_KAMIKAZE_SECTION2, MT_KAMIKAZE_SECTION3, MT_KAMIKAZE_SECTION4, key, "ComboAbility", "Combo Ability", "Combo_Ability", "combo", g_esKamikazeSpecial[type].g_iComboAbility, value, -1, 1); - g_esKamikazeSpecial[type].g_iHumanAbility = iGetKeyValue(subsection, MT_KAMIKAZE_SECTION, MT_KAMIKAZE_SECTION2, MT_KAMIKAZE_SECTION3, MT_KAMIKAZE_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esKamikazeSpecial[type].g_iHumanAbility, value, -1, 2); - g_esKamikazeSpecial[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_KAMIKAZE_SECTION, MT_KAMIKAZE_SECTION2, MT_KAMIKAZE_SECTION3, MT_KAMIKAZE_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esKamikazeSpecial[type].g_flOpenAreasOnly, value, -1.0, 99999.0); - g_esKamikazeSpecial[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_KAMIKAZE_SECTION, MT_KAMIKAZE_SECTION2, MT_KAMIKAZE_SECTION3, MT_KAMIKAZE_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esKamikazeSpecial[type].g_iRequiresHumans, value, -1, 32); - g_esKamikazeSpecial[type].g_iKamikazeAbility = iGetKeyValue(subsection, MT_KAMIKAZE_SECTION, MT_KAMIKAZE_SECTION2, MT_KAMIKAZE_SECTION3, MT_KAMIKAZE_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esKamikazeSpecial[type].g_iKamikazeAbility, value, -1, 1); - g_esKamikazeSpecial[type].g_iKamikazeEffect = iGetKeyValue(subsection, MT_KAMIKAZE_SECTION, MT_KAMIKAZE_SECTION2, MT_KAMIKAZE_SECTION3, MT_KAMIKAZE_SECTION4, key, "AbilityEffect", "Ability Effect", "Ability_Effect", "effect", g_esKamikazeSpecial[type].g_iKamikazeEffect, value, -1, 7); - g_esKamikazeSpecial[type].g_iKamikazeMessage = iGetKeyValue(subsection, MT_KAMIKAZE_SECTION, MT_KAMIKAZE_SECTION2, MT_KAMIKAZE_SECTION3, MT_KAMIKAZE_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esKamikazeSpecial[type].g_iKamikazeMessage, value, -1, 3); - g_esKamikazeSpecial[type].g_iKamikazeSight = iGetKeyValue(subsection, MT_KAMIKAZE_SECTION, MT_KAMIKAZE_SECTION2, MT_KAMIKAZE_SECTION3, MT_KAMIKAZE_SECTION4, key, "AbilitySight", "Ability Sight", "Ability_Sight", "sight", g_esKamikazeSpecial[type].g_iKamikazeSight, value, -1, 5); - g_esKamikazeSpecial[type].g_iKamikazeBody = iGetKeyValue(subsection, MT_KAMIKAZE_SECTION, MT_KAMIKAZE_SECTION2, MT_KAMIKAZE_SECTION3, MT_KAMIKAZE_SECTION4, key, "KamikazeBody", "Kamikaze Body", "Kamikaze_Body", "body", g_esKamikazeSpecial[type].g_iKamikazeBody, value, -1, 1); - g_esKamikazeSpecial[type].g_flKamikazeChance = flGetKeyValue(subsection, MT_KAMIKAZE_SECTION, MT_KAMIKAZE_SECTION2, MT_KAMIKAZE_SECTION3, MT_KAMIKAZE_SECTION4, key, "KamikazeChance", "Kamikaze Chance", "Kamikaze_Chance", "chance", g_esKamikazeSpecial[type].g_flKamikazeChance, value, -1.0, 100.0); - g_esKamikazeSpecial[type].g_iKamikazeHit = iGetKeyValue(subsection, MT_KAMIKAZE_SECTION, MT_KAMIKAZE_SECTION2, MT_KAMIKAZE_SECTION3, MT_KAMIKAZE_SECTION4, key, "KamikazeHit", "Kamikaze Hit", "Kamikaze_Hit", "hit", g_esKamikazeSpecial[type].g_iKamikazeHit, value, -1, 1); - g_esKamikazeSpecial[type].g_iKamikazeHitMode = iGetKeyValue(subsection, MT_KAMIKAZE_SECTION, MT_KAMIKAZE_SECTION2, MT_KAMIKAZE_SECTION3, MT_KAMIKAZE_SECTION4, key, "KamikazeHitMode", "Kamikaze Hit Mode", "Kamikaze_Hit_Mode", "hitmode", g_esKamikazeSpecial[type].g_iKamikazeHitMode, value, -1, 2); - g_esKamikazeSpecial[type].g_flKamikazeMeter = flGetKeyValue(subsection, MT_KAMIKAZE_SECTION, MT_KAMIKAZE_SECTION2, MT_KAMIKAZE_SECTION3, MT_KAMIKAZE_SECTION4, key, "KamikazeMeter", "Kamikaze Meter", "Kamikaze_Meter", "meter", g_esKamikazeSpecial[type].g_flKamikazeMeter, value, -1.0, 99999.0); - g_esKamikazeSpecial[type].g_iKamikazeMode = iGetKeyValue(subsection, MT_KAMIKAZE_SECTION, MT_KAMIKAZE_SECTION2, MT_KAMIKAZE_SECTION3, MT_KAMIKAZE_SECTION4, key, "KamikazeMode", "Kamikaze Mode", "Kamikaze_Mode", "mode", g_esKamikazeSpecial[type].g_iKamikazeMode, value, -1, 3); - g_esKamikazeSpecial[type].g_flKamikazeRange = flGetKeyValue(subsection, MT_KAMIKAZE_SECTION, MT_KAMIKAZE_SECTION2, MT_KAMIKAZE_SECTION3, MT_KAMIKAZE_SECTION4, key, "KamikazeRange", "Kamikaze Range", "Kamikaze_Range", "range", g_esKamikazeSpecial[type].g_flKamikazeRange, value, -1.0, 99999.0); - g_esKamikazeSpecial[type].g_flKamikazeRangeChance = flGetKeyValue(subsection, MT_KAMIKAZE_SECTION, MT_KAMIKAZE_SECTION2, MT_KAMIKAZE_SECTION3, MT_KAMIKAZE_SECTION4, key, "KamikazeRangeChance", "Kamikaze Range Chance", "Kamikaze_Range_Chance", "rangechance", g_esKamikazeSpecial[type].g_flKamikazeRangeChance, value, -1.0, 100.0); - } - else - { - g_esKamikazeAbility[type].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_KAMIKAZE_SECTION, MT_KAMIKAZE_SECTION2, MT_KAMIKAZE_SECTION3, MT_KAMIKAZE_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esKamikazeAbility[type].g_flCloseAreasOnly, value, -1.0, 99999.0); - g_esKamikazeAbility[type].g_iComboAbility = iGetKeyValue(subsection, MT_KAMIKAZE_SECTION, MT_KAMIKAZE_SECTION2, MT_KAMIKAZE_SECTION3, MT_KAMIKAZE_SECTION4, key, "ComboAbility", "Combo Ability", "Combo_Ability", "combo", g_esKamikazeAbility[type].g_iComboAbility, value, -1, 1); - g_esKamikazeAbility[type].g_iHumanAbility = iGetKeyValue(subsection, MT_KAMIKAZE_SECTION, MT_KAMIKAZE_SECTION2, MT_KAMIKAZE_SECTION3, MT_KAMIKAZE_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esKamikazeAbility[type].g_iHumanAbility, value, -1, 2); - g_esKamikazeAbility[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_KAMIKAZE_SECTION, MT_KAMIKAZE_SECTION2, MT_KAMIKAZE_SECTION3, MT_KAMIKAZE_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esKamikazeAbility[type].g_flOpenAreasOnly, value, -1.0, 99999.0); - g_esKamikazeAbility[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_KAMIKAZE_SECTION, MT_KAMIKAZE_SECTION2, MT_KAMIKAZE_SECTION3, MT_KAMIKAZE_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esKamikazeAbility[type].g_iRequiresHumans, value, -1, 32); - g_esKamikazeAbility[type].g_iKamikazeAbility = iGetKeyValue(subsection, MT_KAMIKAZE_SECTION, MT_KAMIKAZE_SECTION2, MT_KAMIKAZE_SECTION3, MT_KAMIKAZE_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esKamikazeAbility[type].g_iKamikazeAbility, value, -1, 1); - g_esKamikazeAbility[type].g_iKamikazeEffect = iGetKeyValue(subsection, MT_KAMIKAZE_SECTION, MT_KAMIKAZE_SECTION2, MT_KAMIKAZE_SECTION3, MT_KAMIKAZE_SECTION4, key, "AbilityEffect", "Ability Effect", "Ability_Effect", "effect", g_esKamikazeAbility[type].g_iKamikazeEffect, value, -1, 7); - g_esKamikazeAbility[type].g_iKamikazeMessage = iGetKeyValue(subsection, MT_KAMIKAZE_SECTION, MT_KAMIKAZE_SECTION2, MT_KAMIKAZE_SECTION3, MT_KAMIKAZE_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esKamikazeAbility[type].g_iKamikazeMessage, value, -1, 3); - g_esKamikazeAbility[type].g_iKamikazeSight = iGetKeyValue(subsection, MT_KAMIKAZE_SECTION, MT_KAMIKAZE_SECTION2, MT_KAMIKAZE_SECTION3, MT_KAMIKAZE_SECTION4, key, "AbilitySight", "Ability Sight", "Ability_Sight", "sight", g_esKamikazeAbility[type].g_iKamikazeSight, value, -1, 5); - g_esKamikazeAbility[type].g_iKamikazeBody = iGetKeyValue(subsection, MT_KAMIKAZE_SECTION, MT_KAMIKAZE_SECTION2, MT_KAMIKAZE_SECTION3, MT_KAMIKAZE_SECTION4, key, "KamikazeBody", "Kamikaze Body", "Kamikaze_Body", "body", g_esKamikazeAbility[type].g_iKamikazeBody, value, -1, 1); - g_esKamikazeAbility[type].g_flKamikazeChance = flGetKeyValue(subsection, MT_KAMIKAZE_SECTION, MT_KAMIKAZE_SECTION2, MT_KAMIKAZE_SECTION3, MT_KAMIKAZE_SECTION4, key, "KamikazeChance", "Kamikaze Chance", "Kamikaze_Chance", "chance", g_esKamikazeAbility[type].g_flKamikazeChance, value, -1.0, 100.0); - g_esKamikazeAbility[type].g_iKamikazeHit = iGetKeyValue(subsection, MT_KAMIKAZE_SECTION, MT_KAMIKAZE_SECTION2, MT_KAMIKAZE_SECTION3, MT_KAMIKAZE_SECTION4, key, "KamikazeHit", "Kamikaze Hit", "Kamikaze_Hit", "hit", g_esKamikazeAbility[type].g_iKamikazeHit, value, -1, 1); - g_esKamikazeAbility[type].g_iKamikazeHitMode = iGetKeyValue(subsection, MT_KAMIKAZE_SECTION, MT_KAMIKAZE_SECTION2, MT_KAMIKAZE_SECTION3, MT_KAMIKAZE_SECTION4, key, "KamikazeHitMode", "Kamikaze Hit Mode", "Kamikaze_Hit_Mode", "hitmode", g_esKamikazeAbility[type].g_iKamikazeHitMode, value, -1, 2); - g_esKamikazeAbility[type].g_flKamikazeMeter = flGetKeyValue(subsection, MT_KAMIKAZE_SECTION, MT_KAMIKAZE_SECTION2, MT_KAMIKAZE_SECTION3, MT_KAMIKAZE_SECTION4, key, "KamikazeMeter", "Kamikaze Meter", "Kamikaze_Meter", "meter", g_esKamikazeAbility[type].g_flKamikazeMeter, value, -1.0, 99999.0); - g_esKamikazeAbility[type].g_iKamikazeMode = iGetKeyValue(subsection, MT_KAMIKAZE_SECTION, MT_KAMIKAZE_SECTION2, MT_KAMIKAZE_SECTION3, MT_KAMIKAZE_SECTION4, key, "KamikazeMode", "Kamikaze Mode", "Kamikaze_Mode", "mode", g_esKamikazeAbility[type].g_iKamikazeMode, value, -1, 3); - g_esKamikazeAbility[type].g_flKamikazeRange = flGetKeyValue(subsection, MT_KAMIKAZE_SECTION, MT_KAMIKAZE_SECTION2, MT_KAMIKAZE_SECTION3, MT_KAMIKAZE_SECTION4, key, "KamikazeRange", "Kamikaze Range", "Kamikaze_Range", "range", g_esKamikazeAbility[type].g_flKamikazeRange, value, -1.0, 99999.0); - g_esKamikazeAbility[type].g_flKamikazeRangeChance = flGetKeyValue(subsection, MT_KAMIKAZE_SECTION, MT_KAMIKAZE_SECTION2, MT_KAMIKAZE_SECTION3, MT_KAMIKAZE_SECTION4, key, "KamikazeRangeChance", "Kamikaze Range Chance", "Kamikaze_Range_Chance", "rangechance", g_esKamikazeAbility[type].g_flKamikazeRangeChance, value, -1.0, 100.0); - g_esKamikazeAbility[type].g_iAccessFlags = iGetAdminFlagsValue(subsection, MT_KAMIKAZE_SECTION, MT_KAMIKAZE_SECTION2, MT_KAMIKAZE_SECTION3, MT_KAMIKAZE_SECTION4, key, "AccessFlags", "Access Flags", "Access_Flags", "access", value); - g_esKamikazeAbility[type].g_iImmunityFlags = iGetAdminFlagsValue(subsection, MT_KAMIKAZE_SECTION, MT_KAMIKAZE_SECTION2, MT_KAMIKAZE_SECTION3, MT_KAMIKAZE_SECTION4, key, "ImmunityFlags", "Immunity Flags", "Immunity_Flags", "immunity", value); - } - } -} - -#if defined MT_ABILITIES_MAIN -void vKamikazeSettingsCached(int tank, bool apply, int type) -#else -public void MT_OnSettingsCached(int tank, bool apply, int type) -#endif -{ - bool bHuman = bIsValidClient(tank, MT_CHECK_FAKECLIENT); - g_esKamikazePlayer[tank].g_iTankTypeRecorded = apply ? MT_GetRecordedTankType(tank, type) : 0; - g_esKamikazePlayer[tank].g_iTankType = apply ? type : 0; - int iType = g_esKamikazePlayer[tank].g_iTankTypeRecorded; - - if (bIsSpecialInfected(tank, MT_CHECK_INDEX|MT_CHECK_INGAME)) - { - g_esKamikazeCache[tank].g_flCloseAreasOnly = flGetSubSettingValue(apply, bHuman, g_esKamikazeTeammate[tank].g_flCloseAreasOnly, g_esKamikazePlayer[tank].g_flCloseAreasOnly, g_esKamikazeSpecial[iType].g_flCloseAreasOnly, g_esKamikazeAbility[iType].g_flCloseAreasOnly, 1); - g_esKamikazeCache[tank].g_iComboAbility = iGetSubSettingValue(apply, bHuman, g_esKamikazeTeammate[tank].g_iComboAbility, g_esKamikazePlayer[tank].g_iComboAbility, g_esKamikazeSpecial[iType].g_iComboAbility, g_esKamikazeAbility[iType].g_iComboAbility, 1); - g_esKamikazeCache[tank].g_flKamikazeChance = flGetSubSettingValue(apply, bHuman, g_esKamikazeTeammate[tank].g_flKamikazeChance, g_esKamikazePlayer[tank].g_flKamikazeChance, g_esKamikazeSpecial[iType].g_flKamikazeChance, g_esKamikazeAbility[iType].g_flKamikazeChance, 1); - g_esKamikazeCache[tank].g_flKamikazeMeter = flGetSubSettingValue(apply, bHuman, g_esKamikazeTeammate[tank].g_flKamikazeMeter, g_esKamikazePlayer[tank].g_flKamikazeMeter, g_esKamikazeSpecial[iType].g_flKamikazeMeter, g_esKamikazeAbility[iType].g_flKamikazeMeter, 1); - g_esKamikazeCache[tank].g_flKamikazeRange = flGetSubSettingValue(apply, bHuman, g_esKamikazeTeammate[tank].g_flKamikazeRange, g_esKamikazePlayer[tank].g_flKamikazeRange, g_esKamikazeSpecial[iType].g_flKamikazeRange, g_esKamikazeAbility[iType].g_flKamikazeRange, 1); - g_esKamikazeCache[tank].g_flKamikazeRangeChance = flGetSubSettingValue(apply, bHuman, g_esKamikazeTeammate[tank].g_flKamikazeRangeChance, g_esKamikazePlayer[tank].g_flKamikazeRangeChance, g_esKamikazeSpecial[iType].g_flKamikazeRangeChance, g_esKamikazeAbility[iType].g_flKamikazeRangeChance, 1); - g_esKamikazeCache[tank].g_iHumanAbility = iGetSubSettingValue(apply, bHuman, g_esKamikazeTeammate[tank].g_iHumanAbility, g_esKamikazePlayer[tank].g_iHumanAbility, g_esKamikazeSpecial[iType].g_iHumanAbility, g_esKamikazeAbility[iType].g_iHumanAbility, 1); - g_esKamikazeCache[tank].g_iKamikazeAbility = iGetSubSettingValue(apply, bHuman, g_esKamikazeTeammate[tank].g_iKamikazeAbility, g_esKamikazePlayer[tank].g_iKamikazeAbility, g_esKamikazeSpecial[iType].g_iKamikazeAbility, g_esKamikazeAbility[iType].g_iKamikazeAbility, 1); - g_esKamikazeCache[tank].g_iKamikazeEffect = iGetSubSettingValue(apply, bHuman, g_esKamikazeTeammate[tank].g_iKamikazeEffect, g_esKamikazePlayer[tank].g_iKamikazeEffect, g_esKamikazeSpecial[iType].g_iKamikazeEffect, g_esKamikazeAbility[iType].g_iKamikazeEffect, 1); - g_esKamikazeCache[tank].g_iKamikazeBody = iGetSubSettingValue(apply, bHuman, g_esKamikazeTeammate[tank].g_iKamikazeBody, g_esKamikazePlayer[tank].g_iKamikazeBody, g_esKamikazeSpecial[iType].g_iKamikazeBody, g_esKamikazeAbility[iType].g_iKamikazeBody, 1); - g_esKamikazeCache[tank].g_iKamikazeHit = iGetSubSettingValue(apply, bHuman, g_esKamikazeTeammate[tank].g_iKamikazeHit, g_esKamikazePlayer[tank].g_iKamikazeHit, g_esKamikazeSpecial[iType].g_iKamikazeHit, g_esKamikazeAbility[iType].g_iKamikazeHit, 1); - g_esKamikazeCache[tank].g_iKamikazeHitMode = iGetSubSettingValue(apply, bHuman, g_esKamikazeTeammate[tank].g_iKamikazeHitMode, g_esKamikazePlayer[tank].g_iKamikazeHitMode, g_esKamikazeSpecial[iType].g_iKamikazeHitMode, g_esKamikazeAbility[iType].g_iKamikazeHitMode, 1); - g_esKamikazeCache[tank].g_iKamikazeMessage = iGetSubSettingValue(apply, bHuman, g_esKamikazeTeammate[tank].g_iKamikazeMessage, g_esKamikazePlayer[tank].g_iKamikazeMessage, g_esKamikazeSpecial[iType].g_iKamikazeMessage, g_esKamikazeAbility[iType].g_iKamikazeMessage, 1); - g_esKamikazeCache[tank].g_iKamikazeMode = iGetSubSettingValue(apply, bHuman, g_esKamikazeTeammate[tank].g_iKamikazeMode, g_esKamikazePlayer[tank].g_iKamikazeMode, g_esKamikazeSpecial[iType].g_iKamikazeMode, g_esKamikazeAbility[iType].g_iKamikazeMode, 1); - g_esKamikazeCache[tank].g_iKamikazeSight = iGetSubSettingValue(apply, bHuman, g_esKamikazeTeammate[tank].g_iKamikazeSight, g_esKamikazePlayer[tank].g_iKamikazeSight, g_esKamikazeSpecial[iType].g_iKamikazeSight, g_esKamikazeAbility[iType].g_iKamikazeSight, 1); - g_esKamikazeCache[tank].g_flOpenAreasOnly = flGetSubSettingValue(apply, bHuman, g_esKamikazeTeammate[tank].g_flOpenAreasOnly, g_esKamikazePlayer[tank].g_flOpenAreasOnly, g_esKamikazeSpecial[iType].g_flOpenAreasOnly, g_esKamikazeAbility[iType].g_flOpenAreasOnly, 1); - g_esKamikazeCache[tank].g_iRequiresHumans = iGetSubSettingValue(apply, bHuman, g_esKamikazeTeammate[tank].g_iRequiresHumans, g_esKamikazePlayer[tank].g_iRequiresHumans, g_esKamikazeSpecial[iType].g_iRequiresHumans, g_esKamikazeAbility[iType].g_iRequiresHumans, 1); - } - else - { - g_esKamikazeCache[tank].g_flCloseAreasOnly = flGetSettingValue(apply, bHuman, g_esKamikazePlayer[tank].g_flCloseAreasOnly, g_esKamikazeAbility[iType].g_flCloseAreasOnly, 1); - g_esKamikazeCache[tank].g_iComboAbility = iGetSettingValue(apply, bHuman, g_esKamikazePlayer[tank].g_iComboAbility, g_esKamikazeAbility[iType].g_iComboAbility, 1); - g_esKamikazeCache[tank].g_flKamikazeChance = flGetSettingValue(apply, bHuman, g_esKamikazePlayer[tank].g_flKamikazeChance, g_esKamikazeAbility[iType].g_flKamikazeChance, 1); - g_esKamikazeCache[tank].g_flKamikazeMeter = flGetSettingValue(apply, bHuman, g_esKamikazePlayer[tank].g_flKamikazeMeter, g_esKamikazeAbility[iType].g_flKamikazeMeter, 1); - g_esKamikazeCache[tank].g_flKamikazeRange = flGetSettingValue(apply, bHuman, g_esKamikazePlayer[tank].g_flKamikazeRange, g_esKamikazeAbility[iType].g_flKamikazeRange, 1); - g_esKamikazeCache[tank].g_flKamikazeRangeChance = flGetSettingValue(apply, bHuman, g_esKamikazePlayer[tank].g_flKamikazeRangeChance, g_esKamikazeAbility[iType].g_flKamikazeRangeChance, 1); - g_esKamikazeCache[tank].g_iHumanAbility = iGetSettingValue(apply, bHuman, g_esKamikazePlayer[tank].g_iHumanAbility, g_esKamikazeAbility[iType].g_iHumanAbility, 1); - g_esKamikazeCache[tank].g_iKamikazeAbility = iGetSettingValue(apply, bHuman, g_esKamikazePlayer[tank].g_iKamikazeAbility, g_esKamikazeAbility[iType].g_iKamikazeAbility, 1); - g_esKamikazeCache[tank].g_iKamikazeEffect = iGetSettingValue(apply, bHuman, g_esKamikazePlayer[tank].g_iKamikazeEffect, g_esKamikazeAbility[iType].g_iKamikazeEffect, 1); - g_esKamikazeCache[tank].g_iKamikazeBody = iGetSettingValue(apply, bHuman, g_esKamikazePlayer[tank].g_iKamikazeBody, g_esKamikazeAbility[iType].g_iKamikazeBody, 1); - g_esKamikazeCache[tank].g_iKamikazeHit = iGetSettingValue(apply, bHuman, g_esKamikazePlayer[tank].g_iKamikazeHit, g_esKamikazeAbility[iType].g_iKamikazeHit, 1); - g_esKamikazeCache[tank].g_iKamikazeHitMode = iGetSettingValue(apply, bHuman, g_esKamikazePlayer[tank].g_iKamikazeHitMode, g_esKamikazeAbility[iType].g_iKamikazeHitMode, 1); - g_esKamikazeCache[tank].g_iKamikazeMessage = iGetSettingValue(apply, bHuman, g_esKamikazePlayer[tank].g_iKamikazeMessage, g_esKamikazeAbility[iType].g_iKamikazeMessage, 1); - g_esKamikazeCache[tank].g_iKamikazeMode = iGetSettingValue(apply, bHuman, g_esKamikazePlayer[tank].g_iKamikazeMode, g_esKamikazeAbility[iType].g_iKamikazeMode, 1); - g_esKamikazeCache[tank].g_iKamikazeSight = iGetSettingValue(apply, bHuman, g_esKamikazePlayer[tank].g_iKamikazeSight, g_esKamikazeAbility[iType].g_iKamikazeSight, 1); - g_esKamikazeCache[tank].g_flOpenAreasOnly = flGetSettingValue(apply, bHuman, g_esKamikazePlayer[tank].g_flOpenAreasOnly, g_esKamikazeAbility[iType].g_flOpenAreasOnly, 1); - g_esKamikazeCache[tank].g_iRequiresHumans = iGetSettingValue(apply, bHuman, g_esKamikazePlayer[tank].g_iRequiresHumans, g_esKamikazeAbility[iType].g_iRequiresHumans, 1); - } -} - -#if defined MT_ABILITIES_MAIN -void vKamikazeCopyStats(int oldTank, int newTank) -#else -public void MT_OnCopyStats(int oldTank, int newTank) -#endif -{ - g_esKamikazePlayer[newTank].g_flDamage = g_esKamikazePlayer[oldTank].g_flDamage; - - if (oldTank != newTank) - { - g_esKamikazePlayer[oldTank].g_bFailed = false; - g_esKamikazePlayer[oldTank].g_flDamage = 0.0; - } -} - -#if !defined MT_ABILITIES_MAIN -public void MT_OnPluginUpdate() -{ - MT_ReloadPlugin(null); -} -#endif - -#if defined MT_ABILITIES_MAIN -void vKamikazeEventFired(Event event, const char[] name) -#else -public void MT_OnEventFired(Event event, const char[] name, bool dontBroadcast) -#endif -{ - if (StrEqual(name, "bot_player_replace")) - { - int iBotId = event.GetInt("bot"), iBot = GetClientOfUserId(iBotId), - iTankId = event.GetInt("player"), iTank = GetClientOfUserId(iTankId); - if (bIsValidClient(iBot) && bIsInfected(iTank)) - { - g_esKamikazePlayer[iBot].g_bFailed = false; - } - } - else if (StrEqual(name, "mission_lost") || StrEqual(name, "round_start") || StrEqual(name, "round_end")) - { - vKamikazeReset(); - } - else if (StrEqual(name, "player_bot_replace")) - { - int iTankId = event.GetInt("player"), iTank = GetClientOfUserId(iTankId), - iBotId = event.GetInt("bot"), iBot = GetClientOfUserId(iBotId); - if (bIsValidClient(iTank) && bIsInfected(iBot)) - { - g_esKamikazePlayer[iTank].g_bFailed = false; - } - } - else if (StrEqual(name, "player_death") || StrEqual(name, "player_spawn")) - { - int iTankId = event.GetInt("userid"), iTank = GetClientOfUserId(iTankId); - if (MT_IsTankSupported(iTank, MT_CHECK_INDEX|MT_CHECK_INGAME)) - { - g_esKamikazePlayer[iTank].g_bFailed = false; - g_esKamikazePlayer[iTank].g_flDamage = 0.0; - } - } - else if (StrEqual(name, "player_now_it")) - { - bool bExploded = event.GetBool("exploded"); - int iSurvivorId = event.GetInt("userid"), iSurvivor = GetClientOfUserId(iSurvivorId), - iBoomerId = event.GetInt("attacker"), iBoomer = GetClientOfUserId(iBoomerId); - if (bIsBoomer(iBoomer) && bIsSurvivor(iSurvivor) && !bExploded) - { - vKamikazeHit(iSurvivor, iBoomer, GetRandomFloat(0.1, 100.0), g_esKamikazeCache[iBoomer].g_flKamikazeChance, g_esKamikazeCache[iBoomer].g_iKamikazeHit, MT_MESSAGE_RANGE, MT_ATTACK_RANGE); - } - } -} - -#if defined MT_ABILITIES_MAIN -void vKamikazePlayerEventKilled(int victim, int attacker) -#else -public void MT_OnPlayerEventKilled(int victim, int attacker) -#endif -{ - if (bIsSurvivor(victim, MT_CHECK_INDEX|MT_CHECK_INGAME) && MT_IsTankSupported(attacker, MT_CHECK_INDEX|MT_CHECK_INGAME) && MT_IsCustomTankSupported(attacker) && g_esKamikazeCache[attacker].g_iKamikazeAbility == 1 && g_esKamikazeCache[attacker].g_iKamikazeBody == 1) - { - g_iKamikazeDeathModelOwner = GetClientUserId(victim); - } -} - -#if defined MT_ABILITIES_MAIN -void vKamikazeAbilityActivated(int tank) -#else -public void MT_OnAbilityActivated(int tank) -#endif -{ - if (MT_IsTankSupported(tank, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_FAKECLIENT) && ((!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esKamikazeAbility[g_esKamikazePlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esKamikazePlayer[tank].g_iAccessFlags)) || g_esKamikazeCache[tank].g_iHumanAbility == 0)) - { - return; - } - - if (MT_IsTankSupported(tank) && (!bIsInfected(tank, MT_CHECK_FAKECLIENT) || g_esKamikazeCache[tank].g_iHumanAbility != 1) && MT_IsCustomTankSupported(tank) && g_esKamikazeCache[tank].g_iKamikazeAbility == 1 && g_esKamikazeCache[tank].g_iComboAbility == 0) - { - vKamikazeAbility(tank, GetRandomFloat(0.1, 100.0)); - } -} - -#if defined MT_ABILITIES_MAIN -void vKamikazeButtonPressed(int tank, int button) -#else -public void MT_OnButtonPressed(int tank, int button) -#endif -{ - if (MT_IsTankSupported(tank, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_ALIVE|MT_CHECK_FAKECLIENT) && MT_IsCustomTankSupported(tank)) - { - if (bIsAreaNarrow(tank, g_esKamikazeCache[tank].g_flOpenAreasOnly) || bIsAreaWide(tank, g_esKamikazeCache[tank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esKamikazePlayer[tank].g_iTankType, tank) || (g_esKamikazeCache[tank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esKamikazeCache[tank].g_iRequiresHumans) || (!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esKamikazeAbility[g_esKamikazePlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esKamikazePlayer[tank].g_iAccessFlags))) - { - return; - } - - if ((button & MT_SUB_KEY) && g_esKamikazeCache[tank].g_iKamikazeAbility == 1 && g_esKamikazeCache[tank].g_iHumanAbility == 1) - { - vKamikazeAbility(tank, GetRandomFloat(0.1, 100.0)); - } - } -} - -#if defined MT_ABILITIES_MAIN -void vKamikazeChangeType(int tank, int oldType) -#else -public void MT_OnChangeType(int tank, int oldType, int newType, bool revert) -#endif -{ - if (oldType <= 0) - { - return; - } - - g_esKamikazePlayer[tank].g_bFailed = false; - g_esKamikazePlayer[tank].g_flDamage = 0.0; -} - -void vKamikazeAbility(int tank, float random, int pos = -1) -{ - if (bIsAreaNarrow(tank, g_esKamikazeCache[tank].g_flOpenAreasOnly) || bIsAreaWide(tank, g_esKamikazeCache[tank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esKamikazePlayer[tank].g_iTankType, tank) || (g_esKamikazeCache[tank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esKamikazeCache[tank].g_iRequiresHumans) || (!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esKamikazeAbility[g_esKamikazePlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esKamikazePlayer[tank].g_iAccessFlags))) - { - return; - } - - g_esKamikazePlayer[tank].g_bFailed = false; - - float flTankPos[3], flSurvivorPos[3]; - GetClientAbsOrigin(tank, flTankPos); - float flRange = (pos != -1) ? MT_GetCombinationSetting(tank, 9, pos) : g_esKamikazeCache[tank].g_flKamikazeRange, - flChance = (pos != -1) ? MT_GetCombinationSetting(tank, 10, pos) : g_esKamikazeCache[tank].g_flKamikazeRangeChance; - int iSurvivorCount = 0; - for (int iSurvivor = 1; iSurvivor <= MaxClients; iSurvivor++) - { - if (bIsSurvivor(iSurvivor, MT_CHECK_INGAME|MT_CHECK_ALIVE) && !MT_IsAdminImmune(iSurvivor, tank) && !bIsAdminImmune(iSurvivor, g_esKamikazePlayer[tank].g_iTankType, g_esKamikazeAbility[g_esKamikazePlayer[tank].g_iTankTypeRecorded].g_iImmunityFlags, g_esKamikazePlayer[iSurvivor].g_iImmunityFlags)) - { - GetClientAbsOrigin(iSurvivor, flSurvivorPos); - if (GetVectorDistance(flTankPos, flSurvivorPos) <= flRange && bIsVisibleToPlayer(tank, iSurvivor, g_esKamikazeCache[tank].g_iKamikazeSight, .range = flRange)) - { - vKamikazeHit(iSurvivor, tank, random, flChance, g_esKamikazeCache[tank].g_iKamikazeAbility, MT_MESSAGE_RANGE, MT_ATTACK_RANGE); - - iSurvivorCount++; - } - } - } - - if (iSurvivorCount == 0) - { - if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esKamikazeCache[tank].g_iHumanAbility == 1) - { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "KamikazeHuman3"); - } - } -} - -void vKamikazeHit(int survivor, int tank, float random, float chance, int enabled, int messages, int flags) -{ - if (bIsAreaNarrow(tank, g_esKamikazeCache[tank].g_flOpenAreasOnly) || bIsAreaWide(tank, g_esKamikazeCache[tank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esKamikazePlayer[tank].g_iTankType, tank) || (g_esKamikazeCache[tank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esKamikazeCache[tank].g_iRequiresHumans) || (!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esKamikazeAbility[g_esKamikazePlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esKamikazePlayer[tank].g_iAccessFlags)) || MT_IsAdminImmune(survivor, tank) || bIsAdminImmune(survivor, g_esKamikazePlayer[tank].g_iTankType, g_esKamikazeAbility[g_esKamikazePlayer[tank].g_iTankTypeRecorded].g_iImmunityFlags, g_esKamikazePlayer[survivor].g_iImmunityFlags)) - { - return; - } - - if (enabled == 1 && bIsSurvivor(survivor) && !MT_DoesSurvivorHaveRewardType(survivor, MT_REWARD_GODMODE)) - { - if (!bIsInfected(tank, MT_CHECK_FAKECLIENT) || (flags & MT_ATTACK_CLAW) || (flags & MT_ATTACK_MELEE)) - { - if (random <= chance) - { - if ((messages & MT_MESSAGE_MELEE) && !bIsVisibleToPlayer(tank, survivor, g_esKamikazeCache[tank].g_iKamikazeSight, .range = 100.0)) - { - return; - } - - if (g_esKamikazeCache[tank].g_flKamikazeMeter <= 0.0 || (0.0 < g_esKamikazeCache[tank].g_flKamikazeMeter <= g_esKamikazePlayer[tank].g_flDamage)) - { - if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esKamikazeCache[tank].g_iHumanAbility == 1 && (flags & MT_ATTACK_RANGE)) - { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "KamikazeHuman"); - } - - vAttachParticle(survivor, PARTICLE_BLOOD, 0.1); - EmitSoundToAll((g_bSecondGame ? SOUND_SMASH2 : SOUND_SMASH1), survivor); - - switch (g_esKamikazeCache[tank].g_iKamikazeMode) - { - case 0, 3: - { - switch (MT_GetRandomInt(1, 2)) - { - case 1: - { - SetEntProp(survivor, Prop_Send, "m_isIncapacitated", 1); - SetEntPropFloat(survivor, Prop_Send, "m_healthBuffer", 1.0); - vDamagePlayer(survivor, tank, float(GetEntProp(survivor, Prop_Data, "m_iHealth")), "128"); - } - case 2: vDamagePlayer(survivor, tank, float(GetEntProp(survivor, Prop_Data, "m_iHealth")), "128"); - } - } - case 1: - { - SetEntProp(survivor, Prop_Send, "m_isIncapacitated", 1); - SetEntPropFloat(survivor, Prop_Send, "m_healthBuffer", 1.0); - vDamagePlayer(survivor, tank, float(GetEntProp(survivor, Prop_Data, "m_iHealth")), "128"); - } - case 2: vDamagePlayer(survivor, tank, float(GetEntProp(survivor, Prop_Data, "m_iHealth")), "128"); - } - - vAttachParticle(tank, PARTICLE_BLOOD, 0.1); - EmitSoundToAll((g_bSecondGame ? SOUND_GROWL2 : SOUND_GROWL1), tank); - SDKHooks_TakeDamage(tank, survivor, survivor, float(GetEntProp(tank, Prop_Data, "m_iHealth")), DMG_CLUB); - vScreenEffect(survivor, tank, g_esKamikazeCache[tank].g_iKamikazeEffect, flags); - - if (g_esKamikazeCache[tank].g_iKamikazeMessage & messages) - { - char sTankName[64]; - MT_GetTankName(tank, sTankName); - MT_PrintToChatAll("%s %t", MT_TAG2, "Kamikaze", sTankName, survivor); - MT_LogMessage(MT_LOG_ABILITY, "%s %T", MT_TAG, "Kamikaze", LANG_SERVER, sTankName, survivor); - } - } - } - else if ((flags & MT_ATTACK_RANGE)) - { - if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esKamikazeCache[tank].g_iHumanAbility == 1 && !g_esKamikazePlayer[tank].g_bFailed) - { - g_esKamikazePlayer[tank].g_bFailed = true; - - MT_PrintToChat(tank, "%s %t", MT_TAG3, "KamikazeHuman2"); - } - } - } - } -} - -void vKamikazeReset() -{ - for (int iPlayer = 1; iPlayer <= MaxClients; iPlayer++) - { - if (bIsValidClient(iPlayer, MT_CHECK_INGAME)) - { - g_esKamikazePlayer[iPlayer].g_bFailed = false; - g_esKamikazePlayer[iPlayer].g_flDamage = 0.0; - } - } -} - -void tTimerKamikazeCombo(Handle timer, DataPack pack) -{ - pack.Reset(); - - int iTank = GetClientOfUserId(pack.ReadCell()); - if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esKamikazeAbility[g_esKamikazePlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esKamikazePlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esKamikazePlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esKamikazeCache[iTank].g_iKamikazeAbility == 0) - { - return; - } - - float flRandom = pack.ReadFloat(); - int iPos = pack.ReadCell(); - vKamikazeAbility(iTank, flRandom, iPos); -} - -void tTimerKamikazeCombo2(Handle timer, DataPack pack) -{ - pack.Reset(); - - int iSurvivor = GetClientOfUserId(pack.ReadCell()); - if (!bIsSurvivor(iSurvivor)) - { - return; - } - - int iTank = GetClientOfUserId(pack.ReadCell()); - if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esKamikazeAbility[g_esKamikazePlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esKamikazePlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esKamikazePlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esKamikazeCache[iTank].g_iKamikazeHit == 0) - { - return; - } - - float flRandom = pack.ReadFloat(), flChance = pack.ReadFloat(); - char sClassname[32]; - pack.ReadString(sClassname, sizeof sClassname); - if ((g_esKamikazeCache[iTank].g_iKamikazeHitMode == 0 || g_esKamikazeCache[iTank].g_iKamikazeHitMode == 1) && (bIsSpecialInfected(iTank) || StrEqual(sClassname[7], "tank_claw") || StrEqual(sClassname, "tank_rock"))) - { - vKamikazeHit(iSurvivor, iTank, flRandom, flChance, g_esKamikazeCache[iTank].g_iKamikazeHit, MT_MESSAGE_MELEE, MT_ATTACK_CLAW); - } - else if ((g_esKamikazeCache[iTank].g_iKamikazeHitMode == 0 || g_esKamikazeCache[iTank].g_iKamikazeHitMode == 2) && StrEqual(sClassname[7], "melee")) - { - vKamikazeHit(iSurvivor, iTank, flRandom, flChance, g_esKamikazeCache[iTank].g_iKamikazeHit, MT_MESSAGE_MELEE, MT_ATTACK_MELEE); - } -} \ No newline at end of file diff --git a/addons/sourcemod/scripting/mutant_tanks/abilities/mt_leech.sp b/addons/sourcemod/scripting/mutant_tanks/abilities/mt_leech.sp deleted file mode 100644 index 8e637cd684..0000000000 --- a/addons/sourcemod/scripting/mutant_tanks/abilities/mt_leech.sp +++ /dev/null @@ -1,1277 +0,0 @@ -/** - * Mutant Tanks: a L4D/L4D2 SourceMod Plugin - * Copyright (C) 2024 Alfred "Psyk0tik" Llagas - * - * 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 . - **/ - -#define MT_LEECH_COMPILE_METHOD 0 // 0: packaged, 1: standalone - -#if !defined MT_ABILITIES_MAIN - #if MT_LEECH_COMPILE_METHOD == 1 - #include - #include - #else - #error This file must be inside "scripting/mutant_tanks/abilities" while compiling "mt_abilities.sp" to include its content. - #endif -public Plugin myinfo = -{ - name = "[MT] Leech Ability", - author = MT_AUTHOR, - description = "The Mutant Tank leeches health off of survivors.", - version = MT_VERSION, - url = MT_URL -}; - -bool g_bDedicated, g_bLateLoad; - -public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max) -{ - EngineVersion evEngine = GetEngineVersion(); - if (evEngine != Engine_Left4Dead && evEngine != Engine_Left4Dead2) - { - strcopy(error, err_max, "\"[MT] Leech Ability\" only supports Left 4 Dead 1 & 2."); - - return APLRes_SilentFailure; - } - - g_bDedicated = IsDedicatedServer(); - g_bLateLoad = late; - - return APLRes_Success; -} - -#define PARTICLE_BLOOD "boomer_explode_D" -#else - #if MT_LEECH_COMPILE_METHOD == 1 - #error This file must be compiled as a standalone plugin. - #endif -#endif - -#define MT_LEECH_SECTION "leechability" -#define MT_LEECH_SECTION2 "leech ability" -#define MT_LEECH_SECTION3 "leech_ability" -#define MT_LEECH_SECTION4 "leech" - -#define MT_MENU_LEECH "Leech Ability" - -enum struct esLeechPlayer -{ - bool g_bAffected; - bool g_bFailed; - bool g_bNoAmmo; - - float g_flCloseAreasOnly; - float g_flLeechChance; - float g_flLeechInterval; - float g_flLeechRange; - float g_flLeechRangeChance; - float g_flOpenAreasOnly; - - int g_iAccessFlags; - int g_iAmmoCount; - int g_iComboAbility; - int g_iCooldown; - int g_iHumanAbility; - int g_iHumanAmmo; - int g_iHumanCooldown; - int g_iHumanRangeCooldown; - int g_iImmunityFlags; - int g_iLeechAbility; - int g_iLeechCooldown; - int g_iLeechDuration; - int g_iLeechEffect; - int g_iLeechHit; - int g_iLeechHitMode; - int g_iLeechMessage; - int g_iLeechRangeCooldown; - int g_iLeechSight; - int g_iOwner; - int g_iRangeCooldown; - int g_iRequiresHumans; - int g_iTankType; - int g_iTankTypeRecorded; -} - -esLeechPlayer g_esLeechPlayer[MAXPLAYERS + 1]; - -enum struct esLeechTeammate -{ - float g_flCloseAreasOnly; - float g_flLeechChance; - float g_flLeechInterval; - float g_flLeechRange; - float g_flLeechRangeChance; - float g_flOpenAreasOnly; - - int g_iComboAbility; - int g_iHumanAbility; - int g_iHumanAmmo; - int g_iHumanCooldown; - int g_iHumanRangeCooldown; - int g_iLeechAbility; - int g_iLeechCooldown; - int g_iLeechDuration; - int g_iLeechEffect; - int g_iLeechHit; - int g_iLeechHitMode; - int g_iLeechMessage; - int g_iLeechRangeCooldown; - int g_iLeechSight; - int g_iRequiresHumans; -} - -esLeechTeammate g_esLeechTeammate[MAXPLAYERS + 1]; - -enum struct esLeechAbility -{ - float g_flCloseAreasOnly; - float g_flLeechChance; - float g_flLeechInterval; - float g_flLeechRange; - float g_flLeechRangeChance; - float g_flOpenAreasOnly; - - int g_iAccessFlags; - int g_iComboAbility; - int g_iHumanAbility; - int g_iHumanAmmo; - int g_iHumanCooldown; - int g_iHumanRangeCooldown; - int g_iImmunityFlags; - int g_iLeechAbility; - int g_iLeechCooldown; - int g_iLeechDuration; - int g_iLeechEffect; - int g_iLeechHit; - int g_iLeechHitMode; - int g_iLeechMessage; - int g_iLeechRangeCooldown; - int g_iLeechSight; - int g_iRequiresHumans; -} - -esLeechAbility g_esLeechAbility[MT_MAXTYPES + 1]; - -enum struct esLeechSpecial -{ - float g_flCloseAreasOnly; - float g_flLeechChance; - float g_flLeechInterval; - float g_flLeechRange; - float g_flLeechRangeChance; - float g_flOpenAreasOnly; - - int g_iComboAbility; - int g_iHumanAbility; - int g_iHumanAmmo; - int g_iHumanCooldown; - int g_iHumanRangeCooldown; - int g_iLeechAbility; - int g_iLeechCooldown; - int g_iLeechDuration; - int g_iLeechEffect; - int g_iLeechHit; - int g_iLeechHitMode; - int g_iLeechMessage; - int g_iLeechRangeCooldown; - int g_iLeechSight; - int g_iRequiresHumans; -} - -esLeechSpecial g_esLeechSpecial[MT_MAXTYPES + 1]; - -enum struct esLeechCache -{ - float g_flCloseAreasOnly; - float g_flLeechChance; - float g_flLeechInterval; - float g_flLeechRange; - float g_flLeechRangeChance; - float g_flOpenAreasOnly; - - int g_iComboAbility; - int g_iHumanAbility; - int g_iHumanAmmo; - int g_iHumanCooldown; - int g_iHumanRangeCooldown; - int g_iLeechAbility; - int g_iLeechCooldown; - int g_iLeechDuration; - int g_iLeechEffect; - int g_iLeechHit; - int g_iLeechHitMode; - int g_iLeechMessage; - int g_iLeechRangeCooldown; - int g_iLeechSight; - int g_iRequiresHumans; -} - -esLeechCache g_esLeechCache[MAXPLAYERS + 1]; - -#if !defined MT_ABILITIES_MAIN -public void OnPluginStart() -{ - LoadTranslations("common.phrases"); - LoadTranslations("mutant_tanks.phrases"); - LoadTranslations("mutant_tanks_names.phrases"); - - RegConsoleCmd("sm_mt_leech", cmdLeechInfo, "View information about the Leech ability."); - - if (g_bLateLoad) - { - for (int iPlayer = 1; iPlayer <= MaxClients; iPlayer++) - { - if (bIsValidClient(iPlayer, MT_CHECK_INGAME)) - { - OnClientPutInServer(iPlayer); - } - } - - g_bLateLoad = false; - } -} -#endif - -#if defined MT_ABILITIES_MAIN -void vLeechMapStart() -#else -public void OnMapStart() -#endif -{ - vLeechReset(); -} - -#if defined MT_ABILITIES_MAIN -void vLeechClientPutInServer(int client) -#else -public void OnClientPutInServer(int client) -#endif -{ - SDKHook(client, SDKHook_OnTakeDamage, OnLeechTakeDamage); - vLeechReset3(client); -} - -#if defined MT_ABILITIES_MAIN -void vLeechClientDisconnect_Post(int client) -#else -public void OnClientDisconnect_Post(int client) -#endif -{ - vLeechReset3(client); -} - -#if defined MT_ABILITIES_MAIN -void vLeechMapEnd() -#else -public void OnMapEnd() -#endif -{ - vLeechReset(); -} - -#if !defined MT_ABILITIES_MAIN -Action cmdLeechInfo(int client, int args) -{ - client = iGetListenServerHost(client, g_bDedicated); - - if (!MT_IsCorePluginEnabled()) - { - MT_ReplyToCommand(client, "%s %t", MT_TAG5, "PluginDisabled"); - - return Plugin_Handled; - } - - if (!bIsValidClient(client, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_FAKECLIENT)) - { - MT_ReplyToCommand(client, "%s %t", MT_TAG, "Command is in-game only"); - - return Plugin_Handled; - } - - switch (IsVoteInProgress()) - { - case true: MT_ReplyToCommand(client, "%s %t", MT_TAG2, "Vote in Progress"); - case false: vLeechMenu(client, MT_LEECH_SECTION4, 0); - } - - return Plugin_Handled; -} -#endif - -void vLeechMenu(int client, const char[] name, int item) -{ - if (StrContains(MT_LEECH_SECTION4, name, false) == -1) - { - return; - } - - Menu mAbilityMenu = new Menu(iLeechMenuHandler, MENU_ACTIONS_DEFAULT|MenuAction_Display|MenuAction_DisplayItem); - mAbilityMenu.SetTitle("Leech Ability Information"); - mAbilityMenu.AddItem("Status", "Status"); - mAbilityMenu.AddItem("Ammunition", "Ammunition"); - mAbilityMenu.AddItem("Buttons", "Buttons"); - mAbilityMenu.AddItem("Cooldown", "Cooldown"); - mAbilityMenu.AddItem("Details", "Details"); - mAbilityMenu.AddItem("Duration", "Duration"); - mAbilityMenu.AddItem("Human Support", "Human Support"); - mAbilityMenu.AddItem("Range Cooldown", "Range Cooldown"); - mAbilityMenu.DisplayAt(client, item, MENU_TIME_FOREVER); -} - -int iLeechMenuHandler(Menu menu, MenuAction action, int param1, int param2) -{ - switch (action) - { - case MenuAction_End: delete menu; - case MenuAction_Select: - { - switch (param2) - { - case 0: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esLeechCache[param1].g_iLeechAbility == 0) ? "AbilityStatus1" : "AbilityStatus2"); - case 1: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityAmmo", (g_esLeechCache[param1].g_iHumanAmmo - g_esLeechPlayer[param1].g_iAmmoCount), g_esLeechCache[param1].g_iHumanAmmo); - case 2: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtons2"); - case 3: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityCooldown", ((g_esLeechCache[param1].g_iHumanAbility == 1) ? g_esLeechCache[param1].g_iHumanCooldown : g_esLeechCache[param1].g_iLeechCooldown)); - case 4: MT_PrintToChat(param1, "%s %t", MT_TAG3, "LeechDetails"); - case 5: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityDuration2", g_esLeechCache[param1].g_iLeechDuration); - case 6: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esLeechCache[param1].g_iHumanAbility == 0) ? "AbilityHumanSupport1" : "AbilityHumanSupport2"); - case 7: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityRangeCooldown", ((g_esLeechCache[param1].g_iHumanAbility == 1) ? g_esLeechCache[param1].g_iHumanRangeCooldown : g_esLeechCache[param1].g_iLeechRangeCooldown)); - } - - if (bIsValidClient(param1, MT_CHECK_INGAME)) - { - vLeechMenu(param1, MT_LEECH_SECTION4, menu.Selection); - } - } - case MenuAction_Display: - { - char sMenuTitle[PLATFORM_MAX_PATH]; - Panel pLeech = view_as(param2); - FormatEx(sMenuTitle, sizeof sMenuTitle, "%T", "LeechMenu", param1); - pLeech.SetTitle(sMenuTitle); - } - case MenuAction_DisplayItem: - { - if (param2 >= 0) - { - char sMenuOption[PLATFORM_MAX_PATH]; - - switch (param2) - { - case 0: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Status", param1); - case 1: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Ammunition", param1); - case 2: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Buttons", param1); - case 3: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Cooldown", param1); - case 4: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Details", param1); - case 5: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Duration", param1); - case 6: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "HumanSupport", param1); - case 7: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "RangeCooldown", param1); - } - - return RedrawMenuItem(sMenuOption); - } - } - } - - return 0; -} - -#if defined MT_ABILITIES_MAIN -void vLeechDisplayMenu(Menu menu) -#else -public void MT_OnDisplayMenu(Menu menu) -#endif -{ - menu.AddItem(MT_MENU_LEECH, MT_MENU_LEECH); -} - -#if defined MT_ABILITIES_MAIN -void vLeechMenuItemSelected(int client, const char[] info) -#else -public void MT_OnMenuItemSelected(int client, const char[] info) -#endif -{ - if (StrEqual(info, MT_MENU_LEECH, false)) - { - vLeechMenu(client, MT_LEECH_SECTION4, 0); - } -} - -#if defined MT_ABILITIES_MAIN -void vLeechMenuItemDisplayed(int client, const char[] info, char[] buffer, int size) -#else -public void MT_OnMenuItemDisplayed(int client, const char[] info, char[] buffer, int size) -#endif -{ - if (StrEqual(info, MT_MENU_LEECH, false)) - { - FormatEx(buffer, size, "%T", "LeechMenu2", client); - } -} - -Action OnLeechTakeDamage(int victim, int &attacker, int &inflictor, float &damage, int &damagetype) -{ - if (MT_IsCorePluginEnabled() && bIsValidClient(victim, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_ALIVE) && damage > 0.0) - { - char sClassname[32]; - if (bIsValidEntity(inflictor)) - { - GetEntityClassname(inflictor, sClassname, sizeof sClassname); - } - - if (MT_IsTankSupported(attacker) && MT_IsCustomTankSupported(attacker) && (g_esLeechCache[attacker].g_iLeechHitMode == 0 || g_esLeechCache[attacker].g_iLeechHitMode == 1) && bIsSurvivor(victim) && g_esLeechCache[attacker].g_iComboAbility == 0) - { - if ((!MT_HasAdminAccess(attacker) && !bHasAdminAccess(attacker, g_esLeechAbility[g_esLeechPlayer[attacker].g_iTankTypeRecorded].g_iAccessFlags, g_esLeechPlayer[attacker].g_iAccessFlags)) || MT_IsAdminImmune(victim, attacker) || bIsAdminImmune(victim, g_esLeechPlayer[attacker].g_iTankType, g_esLeechAbility[g_esLeechPlayer[attacker].g_iTankTypeRecorded].g_iImmunityFlags, g_esLeechPlayer[victim].g_iImmunityFlags)) - { - return Plugin_Continue; - } - - bool bCaught = bIsSurvivorCaught(victim); - if ((bIsSpecialInfected(attacker) && (bCaught || (!bCaught && (damagetype & DMG_CLUB)) || (bIsSpitter(attacker) && StrEqual(sClassname, "insect_swarm")))) || StrEqual(sClassname[7], "tank_claw") || StrEqual(sClassname, "tank_rock")) - { - vLeechHit(victim, attacker, GetRandomFloat(0.1, 100.0), g_esLeechCache[attacker].g_flLeechChance, g_esLeechCache[attacker].g_iLeechHit, MT_MESSAGE_MELEE, MT_ATTACK_CLAW); - } - } - else if (MT_IsTankSupported(victim) && MT_IsCustomTankSupported(victim) && (g_esLeechCache[victim].g_iLeechHitMode == 0 || g_esLeechCache[victim].g_iLeechHitMode == 2) && bIsSurvivor(attacker) && g_esLeechCache[victim].g_iComboAbility == 0) - { - if ((!MT_HasAdminAccess(victim) && !bHasAdminAccess(victim, g_esLeechAbility[g_esLeechPlayer[victim].g_iTankTypeRecorded].g_iAccessFlags, g_esLeechPlayer[victim].g_iAccessFlags)) || MT_IsAdminImmune(attacker, victim) || bIsAdminImmune(attacker, g_esLeechPlayer[victim].g_iTankType, g_esLeechAbility[g_esLeechPlayer[victim].g_iTankTypeRecorded].g_iImmunityFlags, g_esLeechPlayer[attacker].g_iImmunityFlags)) - { - return Plugin_Continue; - } - - if (StrEqual(sClassname[7], "melee")) - { - vLeechHit(attacker, victim, GetRandomFloat(0.1, 100.0), g_esLeechCache[victim].g_flLeechChance, g_esLeechCache[victim].g_iLeechHit, MT_MESSAGE_MELEE, MT_ATTACK_MELEE); - } - } - } - - return Plugin_Continue; -} - -#if defined MT_ABILITIES_MAIN -void vLeechPluginCheck(ArrayList list) -#else -public void MT_OnPluginCheck(ArrayList list) -#endif -{ - list.PushString(MT_MENU_LEECH); -} - -#if defined MT_ABILITIES_MAIN -void vLeechAbilityCheck(ArrayList list, ArrayList list2, ArrayList list3, ArrayList list4) -#else -public void MT_OnAbilityCheck(ArrayList list, ArrayList list2, ArrayList list3, ArrayList list4) -#endif -{ - list.PushString(MT_LEECH_SECTION); - list2.PushString(MT_LEECH_SECTION2); - list3.PushString(MT_LEECH_SECTION3); - list4.PushString(MT_LEECH_SECTION4); -} - -#if defined MT_ABILITIES_MAIN -void vLeechCombineAbilities(int tank, int type, const float random, const char[] combo, int survivor, const char[] classname) -#else -public void MT_OnCombineAbilities(int tank, int type, const float random, const char[] combo, int survivor, int weapon, const char[] classname) -#endif -{ - if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esLeechCache[tank].g_iHumanAbility != 2) - { - return; - } - - char sCombo[320], sSet[4][32]; - FormatEx(sCombo, sizeof sCombo, ",%s,", combo); - FormatEx(sSet[0], sizeof sSet[], ",%s,", MT_LEECH_SECTION); - FormatEx(sSet[1], sizeof sSet[], ",%s,", MT_LEECH_SECTION2); - FormatEx(sSet[2], sizeof sSet[], ",%s,", MT_LEECH_SECTION3); - FormatEx(sSet[3], sizeof sSet[], ",%s,", MT_LEECH_SECTION4); - if (g_esLeechCache[tank].g_iComboAbility == 1 && (StrContains(sCombo, sSet[0], false) != -1 || StrContains(sCombo, sSet[1], false) != -1 || StrContains(sCombo, sSet[2], false) != -1 || StrContains(sCombo, sSet[3], false) != -1)) - { - char sAbilities[320], sSubset[10][32]; - strcopy(sAbilities, sizeof sAbilities, combo); - ExplodeString(sAbilities, ",", sSubset, sizeof sSubset, sizeof sSubset[]); - - float flChance = 0.0, flDelay = 0.0; - for (int iPos = 0; iPos < (sizeof sSubset); iPos++) - { - if (StrEqual(sSubset[iPos], MT_LEECH_SECTION, false) || StrEqual(sSubset[iPos], MT_LEECH_SECTION2, false) || StrEqual(sSubset[iPos], MT_LEECH_SECTION3, false) || StrEqual(sSubset[iPos], MT_LEECH_SECTION4, false)) - { - flDelay = MT_GetCombinationSetting(tank, 4, iPos); - - switch (type) - { - case MT_COMBO_MAINRANGE: - { - if (g_esLeechCache[tank].g_iLeechAbility == 1) - { - switch (flDelay) - { - case 0.0: vLeechAbility(tank, random, iPos); - default: - { - DataPack dpCombo; - CreateDataTimer(flDelay, tTimerLeechCombo, dpCombo, TIMER_FLAG_NO_MAPCHANGE); - dpCombo.WriteCell(GetClientUserId(tank)); - dpCombo.WriteFloat(random); - dpCombo.WriteCell(iPos); - } - } - } - } - case MT_COMBO_MELEEHIT: - { - flChance = MT_GetCombinationSetting(tank, 1, iPos); - - switch (flDelay) - { - case 0.0: - { - if ((g_esLeechCache[tank].g_iLeechHitMode == 0 || g_esLeechCache[tank].g_iLeechHitMode == 1) && (StrEqual(classname[7], "tank_claw") || StrEqual(classname, "tank_rock"))) - { - vLeechHit(survivor, tank, random, flChance, g_esLeechCache[tank].g_iLeechHit, MT_MESSAGE_MELEE, MT_ATTACK_CLAW, iPos); - } - else if ((g_esLeechCache[tank].g_iLeechHitMode == 0 || g_esLeechCache[tank].g_iLeechHitMode == 2) && StrEqual(classname[7], "melee")) - { - vLeechHit(survivor, tank, random, flChance, g_esLeechCache[tank].g_iLeechHit, MT_MESSAGE_MELEE, MT_ATTACK_MELEE, iPos); - } - } - default: - { - DataPack dpCombo; - CreateDataTimer(flDelay, tTimerLeechCombo2, dpCombo, TIMER_FLAG_NO_MAPCHANGE); - dpCombo.WriteCell(GetClientUserId(survivor)); - dpCombo.WriteCell(GetClientUserId(tank)); - dpCombo.WriteFloat(random); - dpCombo.WriteFloat(flChance); - dpCombo.WriteCell(iPos); - dpCombo.WriteString(classname); - } - } - } - } - - break; - } - } - } -} - -#if defined MT_ABILITIES_MAIN -void vLeechConfigsLoad(int mode) -#else -public void MT_OnConfigsLoad(int mode) -#endif -{ - switch (mode) - { - case 1: - { - for (int iIndex = MT_GetMinType(); iIndex <= MT_GetMaxType(); iIndex++) - { - g_esLeechAbility[iIndex].g_iAccessFlags = 0; - g_esLeechAbility[iIndex].g_iImmunityFlags = 0; - g_esLeechAbility[iIndex].g_flCloseAreasOnly = 0.0; - g_esLeechAbility[iIndex].g_iComboAbility = 0; - g_esLeechAbility[iIndex].g_iHumanAbility = 0; - g_esLeechAbility[iIndex].g_iHumanAmmo = 5; - g_esLeechAbility[iIndex].g_iHumanCooldown = 0; - g_esLeechAbility[iIndex].g_iHumanRangeCooldown = 0; - g_esLeechAbility[iIndex].g_flOpenAreasOnly = 0.0; - g_esLeechAbility[iIndex].g_iRequiresHumans = 0; - g_esLeechAbility[iIndex].g_iLeechAbility = 0; - g_esLeechAbility[iIndex].g_iLeechEffect = 0; - g_esLeechAbility[iIndex].g_iLeechMessage = 0; - g_esLeechAbility[iIndex].g_flLeechChance = 33.3; - g_esLeechAbility[iIndex].g_iLeechCooldown = 0; - g_esLeechAbility[iIndex].g_iLeechDuration = 5; - g_esLeechAbility[iIndex].g_iLeechHit = 0; - g_esLeechAbility[iIndex].g_iLeechHitMode = 0; - g_esLeechAbility[iIndex].g_flLeechInterval = 1.0; - g_esLeechAbility[iIndex].g_flLeechRange = 150.0; - g_esLeechAbility[iIndex].g_flLeechRangeChance = 15.0; - g_esLeechAbility[iIndex].g_iLeechRangeCooldown = 0; - g_esLeechAbility[iIndex].g_iLeechSight = 0; - - g_esLeechSpecial[iIndex].g_flCloseAreasOnly = -1.0; - g_esLeechSpecial[iIndex].g_iComboAbility = -1; - g_esLeechSpecial[iIndex].g_iHumanAbility = -1; - g_esLeechSpecial[iIndex].g_iHumanAmmo = -1; - g_esLeechSpecial[iIndex].g_iHumanCooldown = -1; - g_esLeechSpecial[iIndex].g_iHumanRangeCooldown = -1; - g_esLeechSpecial[iIndex].g_flOpenAreasOnly = -1.0; - g_esLeechSpecial[iIndex].g_iRequiresHumans = -1; - g_esLeechSpecial[iIndex].g_iLeechAbility = -1; - g_esLeechSpecial[iIndex].g_iLeechEffect = -1; - g_esLeechSpecial[iIndex].g_iLeechMessage = -1; - g_esLeechSpecial[iIndex].g_flLeechChance = -1.0; - g_esLeechSpecial[iIndex].g_iLeechCooldown = -1; - g_esLeechSpecial[iIndex].g_iLeechDuration = -1; - g_esLeechSpecial[iIndex].g_iLeechHit = -1; - g_esLeechSpecial[iIndex].g_iLeechHitMode = -1; - g_esLeechSpecial[iIndex].g_flLeechInterval = -1.0; - g_esLeechSpecial[iIndex].g_flLeechRange = -1.0; - g_esLeechSpecial[iIndex].g_flLeechRangeChance = -1.0; - g_esLeechSpecial[iIndex].g_iLeechRangeCooldown = -1; - g_esLeechSpecial[iIndex].g_iLeechSight = -1; - } - } - case 3: - { - for (int iPlayer = 1; iPlayer <= MaxClients; iPlayer++) - { - g_esLeechPlayer[iPlayer].g_iAccessFlags = -1; - g_esLeechPlayer[iPlayer].g_iImmunityFlags = -1; - g_esLeechPlayer[iPlayer].g_flCloseAreasOnly = -1.0; - g_esLeechPlayer[iPlayer].g_iComboAbility = -1; - g_esLeechPlayer[iPlayer].g_iHumanAbility = -1; - g_esLeechPlayer[iPlayer].g_iHumanAmmo = -1; - g_esLeechPlayer[iPlayer].g_iHumanCooldown = -1; - g_esLeechPlayer[iPlayer].g_iHumanRangeCooldown = -1; - g_esLeechPlayer[iPlayer].g_flOpenAreasOnly = -1.0; - g_esLeechPlayer[iPlayer].g_iRequiresHumans = -1; - g_esLeechPlayer[iPlayer].g_iLeechAbility = -1; - g_esLeechPlayer[iPlayer].g_iLeechEffect = -1; - g_esLeechPlayer[iPlayer].g_iLeechMessage = -1; - g_esLeechPlayer[iPlayer].g_flLeechChance = -1.0; - g_esLeechPlayer[iPlayer].g_iLeechCooldown = -1; - g_esLeechPlayer[iPlayer].g_iLeechDuration = -1; - g_esLeechPlayer[iPlayer].g_iLeechHit = -1; - g_esLeechPlayer[iPlayer].g_iLeechHitMode = -1; - g_esLeechPlayer[iPlayer].g_flLeechInterval = -1.0; - g_esLeechPlayer[iPlayer].g_flLeechRange = -1.0; - g_esLeechPlayer[iPlayer].g_flLeechRangeChance = -1.0; - g_esLeechPlayer[iPlayer].g_iLeechRangeCooldown = -1; - g_esLeechPlayer[iPlayer].g_iLeechSight = -1; - - g_esLeechTeammate[iPlayer].g_flCloseAreasOnly = -1.0; - g_esLeechTeammate[iPlayer].g_iComboAbility = -1; - g_esLeechTeammate[iPlayer].g_iHumanAbility = -1; - g_esLeechTeammate[iPlayer].g_iHumanAmmo = -1; - g_esLeechTeammate[iPlayer].g_iHumanCooldown = -1; - g_esLeechTeammate[iPlayer].g_iHumanRangeCooldown = -1; - g_esLeechTeammate[iPlayer].g_flOpenAreasOnly = -1.0; - g_esLeechTeammate[iPlayer].g_iRequiresHumans = -1; - g_esLeechTeammate[iPlayer].g_iLeechAbility = -1; - g_esLeechTeammate[iPlayer].g_iLeechEffect = -1; - g_esLeechTeammate[iPlayer].g_iLeechMessage = -1; - g_esLeechTeammate[iPlayer].g_flLeechChance = -1.0; - g_esLeechTeammate[iPlayer].g_iLeechCooldown = -1; - g_esLeechTeammate[iPlayer].g_iLeechDuration = -1; - g_esLeechTeammate[iPlayer].g_iLeechHit = -1; - g_esLeechTeammate[iPlayer].g_iLeechHitMode = -1; - g_esLeechTeammate[iPlayer].g_flLeechInterval = -1.0; - g_esLeechTeammate[iPlayer].g_flLeechRange = -1.0; - g_esLeechTeammate[iPlayer].g_flLeechRangeChance = -1.0; - g_esLeechTeammate[iPlayer].g_iLeechRangeCooldown = -1; - g_esLeechTeammate[iPlayer].g_iLeechSight = -1; - } - } - } -} - -#if defined MT_ABILITIES_MAIN -void vLeechConfigsLoaded(const char[] subsection, const char[] key, const char[] value, int type, int admin, int mode, bool special, const char[] specsection) -#else -public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const char[] value, int type, int admin, int mode, bool special, const char[] specsection) -#endif -{ - if ((mode == -1 || mode == 3) && bIsValidClient(admin)) - { - if (special && specsection[0] != '\0') - { - g_esLeechTeammate[admin].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_LEECH_SECTION, MT_LEECH_SECTION2, MT_LEECH_SECTION3, MT_LEECH_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esLeechTeammate[admin].g_flCloseAreasOnly, value, -1.0, 99999.0); - g_esLeechTeammate[admin].g_iComboAbility = iGetKeyValue(subsection, MT_LEECH_SECTION, MT_LEECH_SECTION2, MT_LEECH_SECTION3, MT_LEECH_SECTION4, key, "ComboAbility", "Combo Ability", "Combo_Ability", "combo", g_esLeechTeammate[admin].g_iComboAbility, value, -1, 1); - g_esLeechTeammate[admin].g_iHumanAbility = iGetKeyValue(subsection, MT_LEECH_SECTION, MT_LEECH_SECTION2, MT_LEECH_SECTION3, MT_LEECH_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esLeechTeammate[admin].g_iHumanAbility, value, -1, 2); - g_esLeechTeammate[admin].g_iHumanAmmo = iGetKeyValue(subsection, MT_LEECH_SECTION, MT_LEECH_SECTION2, MT_LEECH_SECTION3, MT_LEECH_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esLeechTeammate[admin].g_iHumanAmmo, value, -1, 99999); - g_esLeechTeammate[admin].g_iHumanCooldown = iGetKeyValue(subsection, MT_LEECH_SECTION, MT_LEECH_SECTION2, MT_LEECH_SECTION3, MT_LEECH_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esLeechTeammate[admin].g_iHumanCooldown, value, -1, 99999); - g_esLeechTeammate[admin].g_iHumanRangeCooldown = iGetKeyValue(subsection, MT_LEECH_SECTION, MT_LEECH_SECTION2, MT_LEECH_SECTION3, MT_LEECH_SECTION4, key, "HumanRangeCooldown", "Human Range Cooldown", "Human_Range_Cooldown", "hrangecooldown", g_esLeechTeammate[admin].g_iHumanRangeCooldown, value, -1, 99999); - g_esLeechTeammate[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_LEECH_SECTION, MT_LEECH_SECTION2, MT_LEECH_SECTION3, MT_LEECH_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esLeechTeammate[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); - g_esLeechTeammate[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_LEECH_SECTION, MT_LEECH_SECTION2, MT_LEECH_SECTION3, MT_LEECH_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esLeechTeammate[admin].g_iRequiresHumans, value, -1, 32); - g_esLeechTeammate[admin].g_iLeechAbility = iGetKeyValue(subsection, MT_LEECH_SECTION, MT_LEECH_SECTION2, MT_LEECH_SECTION3, MT_LEECH_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esLeechTeammate[admin].g_iLeechAbility, value, -1, 1); - g_esLeechTeammate[admin].g_iLeechEffect = iGetKeyValue(subsection, MT_LEECH_SECTION, MT_LEECH_SECTION2, MT_LEECH_SECTION3, MT_LEECH_SECTION4, key, "AbilityEffect", "Ability Effect", "Ability_Effect", "effect", g_esLeechTeammate[admin].g_iLeechEffect, value, -1, 7); - g_esLeechTeammate[admin].g_iLeechMessage = iGetKeyValue(subsection, MT_LEECH_SECTION, MT_LEECH_SECTION2, MT_LEECH_SECTION3, MT_LEECH_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esLeechTeammate[admin].g_iLeechMessage, value, -1, 3); - g_esLeechTeammate[admin].g_iLeechSight = iGetKeyValue(subsection, MT_LEECH_SECTION, MT_LEECH_SECTION2, MT_LEECH_SECTION3, MT_LEECH_SECTION4, key, "AbilitySight", "Ability Sight", "Ability_Sight", "sight", g_esLeechTeammate[admin].g_iLeechSight, value, -1, 5); - g_esLeechTeammate[admin].g_flLeechChance = flGetKeyValue(subsection, MT_LEECH_SECTION, MT_LEECH_SECTION2, MT_LEECH_SECTION3, MT_LEECH_SECTION4, key, "LeechChance", "Leech Chance", "Leech_Chance", "chance", g_esLeechTeammate[admin].g_flLeechChance, value, -1.0, 100.0); - g_esLeechTeammate[admin].g_iLeechCooldown = iGetKeyValue(subsection, MT_LEECH_SECTION, MT_LEECH_SECTION2, MT_LEECH_SECTION3, MT_LEECH_SECTION4, key, "LeechCooldown", "Leech Cooldown", "Leech_Cooldown", "cooldown", g_esLeechTeammate[admin].g_iLeechCooldown, value, -1, 99999); - g_esLeechTeammate[admin].g_iLeechDuration = iGetKeyValue(subsection, MT_LEECH_SECTION, MT_LEECH_SECTION2, MT_LEECH_SECTION3, MT_LEECH_SECTION4, key, "LeechDuration", "Leech Duration", "Leech_Duration", "duration", g_esLeechTeammate[admin].g_iLeechDuration, value, -1, 99999); - g_esLeechTeammate[admin].g_iLeechHit = iGetKeyValue(subsection, MT_LEECH_SECTION, MT_LEECH_SECTION2, MT_LEECH_SECTION3, MT_LEECH_SECTION4, key, "LeechHit", "Leech Hit", "Leech_Hit", "hit", g_esLeechTeammate[admin].g_iLeechHit, value, -1, 1); - g_esLeechTeammate[admin].g_iLeechHitMode = iGetKeyValue(subsection, MT_LEECH_SECTION, MT_LEECH_SECTION2, MT_LEECH_SECTION3, MT_LEECH_SECTION4, key, "LeechHitMode", "Leech Hit Mode", "Leech_Hit_Mode", "hitmode", g_esLeechTeammate[admin].g_iLeechHitMode, value, -1, 2); - g_esLeechTeammate[admin].g_flLeechInterval = flGetKeyValue(subsection, MT_LEECH_SECTION, MT_LEECH_SECTION2, MT_LEECH_SECTION3, MT_LEECH_SECTION4, key, "LeechInterval", "Leech Interval", "Leech_Interval", "interval", g_esLeechTeammate[admin].g_flLeechInterval, value, -1.0, 99999.0); - g_esLeechTeammate[admin].g_flLeechRange = flGetKeyValue(subsection, MT_LEECH_SECTION, MT_LEECH_SECTION2, MT_LEECH_SECTION3, MT_LEECH_SECTION4, key, "LeechRange", "Leech Range", "Leech_Range", "range", g_esLeechTeammate[admin].g_flLeechRange, value, -1.0, 99999.0); - g_esLeechTeammate[admin].g_flLeechRangeChance = flGetKeyValue(subsection, MT_LEECH_SECTION, MT_LEECH_SECTION2, MT_LEECH_SECTION3, MT_LEECH_SECTION4, key, "LeechRangeChance", "Leech Range Chance", "Leech_Range_Chance", "rangechance", g_esLeechTeammate[admin].g_flLeechRangeChance, value, -1.0, 100.0); - g_esLeechTeammate[admin].g_iLeechRangeCooldown = iGetKeyValue(subsection, MT_LEECH_SECTION, MT_LEECH_SECTION2, MT_LEECH_SECTION3, MT_LEECH_SECTION4, key, "LeechRangeCooldown", "Leech Range Cooldown", "Leech_Range_Cooldown", "rangecooldown", g_esLeechTeammate[admin].g_iLeechRangeCooldown, value, -1, 99999); - } - else - { - g_esLeechPlayer[admin].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_LEECH_SECTION, MT_LEECH_SECTION2, MT_LEECH_SECTION3, MT_LEECH_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esLeechPlayer[admin].g_flCloseAreasOnly, value, -1.0, 99999.0); - g_esLeechPlayer[admin].g_iComboAbility = iGetKeyValue(subsection, MT_LEECH_SECTION, MT_LEECH_SECTION2, MT_LEECH_SECTION3, MT_LEECH_SECTION4, key, "ComboAbility", "Combo Ability", "Combo_Ability", "combo", g_esLeechPlayer[admin].g_iComboAbility, value, -1, 1); - g_esLeechPlayer[admin].g_iHumanAbility = iGetKeyValue(subsection, MT_LEECH_SECTION, MT_LEECH_SECTION2, MT_LEECH_SECTION3, MT_LEECH_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esLeechPlayer[admin].g_iHumanAbility, value, -1, 2); - g_esLeechPlayer[admin].g_iHumanAmmo = iGetKeyValue(subsection, MT_LEECH_SECTION, MT_LEECH_SECTION2, MT_LEECH_SECTION3, MT_LEECH_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esLeechPlayer[admin].g_iHumanAmmo, value, -1, 99999); - g_esLeechPlayer[admin].g_iHumanCooldown = iGetKeyValue(subsection, MT_LEECH_SECTION, MT_LEECH_SECTION2, MT_LEECH_SECTION3, MT_LEECH_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esLeechPlayer[admin].g_iHumanCooldown, value, -1, 99999); - g_esLeechPlayer[admin].g_iHumanRangeCooldown = iGetKeyValue(subsection, MT_LEECH_SECTION, MT_LEECH_SECTION2, MT_LEECH_SECTION3, MT_LEECH_SECTION4, key, "HumanRangeCooldown", "Human Range Cooldown", "Human_Range_Cooldown", "hrangecooldown", g_esLeechPlayer[admin].g_iHumanRangeCooldown, value, -1, 99999); - g_esLeechPlayer[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_LEECH_SECTION, MT_LEECH_SECTION2, MT_LEECH_SECTION3, MT_LEECH_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esLeechPlayer[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); - g_esLeechPlayer[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_LEECH_SECTION, MT_LEECH_SECTION2, MT_LEECH_SECTION3, MT_LEECH_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esLeechPlayer[admin].g_iRequiresHumans, value, -1, 32); - g_esLeechPlayer[admin].g_iLeechAbility = iGetKeyValue(subsection, MT_LEECH_SECTION, MT_LEECH_SECTION2, MT_LEECH_SECTION3, MT_LEECH_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esLeechPlayer[admin].g_iLeechAbility, value, -1, 1); - g_esLeechPlayer[admin].g_iLeechEffect = iGetKeyValue(subsection, MT_LEECH_SECTION, MT_LEECH_SECTION2, MT_LEECH_SECTION3, MT_LEECH_SECTION4, key, "AbilityEffect", "Ability Effect", "Ability_Effect", "effect", g_esLeechPlayer[admin].g_iLeechEffect, value, -1, 7); - g_esLeechPlayer[admin].g_iLeechMessage = iGetKeyValue(subsection, MT_LEECH_SECTION, MT_LEECH_SECTION2, MT_LEECH_SECTION3, MT_LEECH_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esLeechPlayer[admin].g_iLeechMessage, value, -1, 3); - g_esLeechPlayer[admin].g_iLeechSight = iGetKeyValue(subsection, MT_LEECH_SECTION, MT_LEECH_SECTION2, MT_LEECH_SECTION3, MT_LEECH_SECTION4, key, "AbilitySight", "Ability Sight", "Ability_Sight", "sight", g_esLeechPlayer[admin].g_iLeechSight, value, -1, 5); - g_esLeechPlayer[admin].g_flLeechChance = flGetKeyValue(subsection, MT_LEECH_SECTION, MT_LEECH_SECTION2, MT_LEECH_SECTION3, MT_LEECH_SECTION4, key, "LeechChance", "Leech Chance", "Leech_Chance", "chance", g_esLeechPlayer[admin].g_flLeechChance, value, -1.0, 100.0); - g_esLeechPlayer[admin].g_iLeechCooldown = iGetKeyValue(subsection, MT_LEECH_SECTION, MT_LEECH_SECTION2, MT_LEECH_SECTION3, MT_LEECH_SECTION4, key, "LeechCooldown", "Leech Cooldown", "Leech_Cooldown", "cooldown", g_esLeechPlayer[admin].g_iLeechCooldown, value, -1, 99999); - g_esLeechPlayer[admin].g_iLeechDuration = iGetKeyValue(subsection, MT_LEECH_SECTION, MT_LEECH_SECTION2, MT_LEECH_SECTION3, MT_LEECH_SECTION4, key, "LeechDuration", "Leech Duration", "Leech_Duration", "duration", g_esLeechPlayer[admin].g_iLeechDuration, value, -1, 99999); - g_esLeechPlayer[admin].g_iLeechHit = iGetKeyValue(subsection, MT_LEECH_SECTION, MT_LEECH_SECTION2, MT_LEECH_SECTION3, MT_LEECH_SECTION4, key, "LeechHit", "Leech Hit", "Leech_Hit", "hit", g_esLeechPlayer[admin].g_iLeechHit, value, -1, 1); - g_esLeechPlayer[admin].g_iLeechHitMode = iGetKeyValue(subsection, MT_LEECH_SECTION, MT_LEECH_SECTION2, MT_LEECH_SECTION3, MT_LEECH_SECTION4, key, "LeechHitMode", "Leech Hit Mode", "Leech_Hit_Mode", "hitmode", g_esLeechPlayer[admin].g_iLeechHitMode, value, -1, 2); - g_esLeechPlayer[admin].g_flLeechInterval = flGetKeyValue(subsection, MT_LEECH_SECTION, MT_LEECH_SECTION2, MT_LEECH_SECTION3, MT_LEECH_SECTION4, key, "LeechInterval", "Leech Interval", "Leech_Interval", "interval", g_esLeechPlayer[admin].g_flLeechInterval, value, -1.0, 99999.0); - g_esLeechPlayer[admin].g_flLeechRange = flGetKeyValue(subsection, MT_LEECH_SECTION, MT_LEECH_SECTION2, MT_LEECH_SECTION3, MT_LEECH_SECTION4, key, "LeechRange", "Leech Range", "Leech_Range", "range", g_esLeechPlayer[admin].g_flLeechRange, value, -1.0, 99999.0); - g_esLeechPlayer[admin].g_flLeechRangeChance = flGetKeyValue(subsection, MT_LEECH_SECTION, MT_LEECH_SECTION2, MT_LEECH_SECTION3, MT_LEECH_SECTION4, key, "LeechRangeChance", "Leech Range Chance", "Leech_Range_Chance", "rangechance", g_esLeechPlayer[admin].g_flLeechRangeChance, value, -1.0, 100.0); - g_esLeechPlayer[admin].g_iLeechRangeCooldown = iGetKeyValue(subsection, MT_LEECH_SECTION, MT_LEECH_SECTION2, MT_LEECH_SECTION3, MT_LEECH_SECTION4, key, "LeechRangeCooldown", "Leech Range Cooldown", "Leech_Range_Cooldown", "rangecooldown", g_esLeechPlayer[admin].g_iLeechRangeCooldown, value, -1, 99999); - g_esLeechPlayer[admin].g_iAccessFlags = iGetAdminFlagsValue(subsection, MT_LEECH_SECTION, MT_LEECH_SECTION2, MT_LEECH_SECTION3, MT_LEECH_SECTION4, key, "AccessFlags", "Access Flags", "Access_Flags", "access", value); - g_esLeechPlayer[admin].g_iImmunityFlags = iGetAdminFlagsValue(subsection, MT_LEECH_SECTION, MT_LEECH_SECTION2, MT_LEECH_SECTION3, MT_LEECH_SECTION4, key, "ImmunityFlags", "Immunity Flags", "Immunity_Flags", "immunity", value); - } - } - - if (mode < 3 && type > 0) - { - if (special && specsection[0] != '\0') - { - g_esLeechSpecial[type].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_LEECH_SECTION, MT_LEECH_SECTION2, MT_LEECH_SECTION3, MT_LEECH_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esLeechSpecial[type].g_flCloseAreasOnly, value, -1.0, 99999.0); - g_esLeechSpecial[type].g_iComboAbility = iGetKeyValue(subsection, MT_LEECH_SECTION, MT_LEECH_SECTION2, MT_LEECH_SECTION3, MT_LEECH_SECTION4, key, "ComboAbility", "Combo Ability", "Combo_Ability", "combo", g_esLeechSpecial[type].g_iComboAbility, value, -1, 1); - g_esLeechSpecial[type].g_iHumanAbility = iGetKeyValue(subsection, MT_LEECH_SECTION, MT_LEECH_SECTION2, MT_LEECH_SECTION3, MT_LEECH_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esLeechSpecial[type].g_iHumanAbility, value, -1, 2); - g_esLeechSpecial[type].g_iHumanAmmo = iGetKeyValue(subsection, MT_LEECH_SECTION, MT_LEECH_SECTION2, MT_LEECH_SECTION3, MT_LEECH_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esLeechSpecial[type].g_iHumanAmmo, value, -1, 99999); - g_esLeechSpecial[type].g_iHumanCooldown = iGetKeyValue(subsection, MT_LEECH_SECTION, MT_LEECH_SECTION2, MT_LEECH_SECTION3, MT_LEECH_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esLeechSpecial[type].g_iHumanCooldown, value, -1, 99999); - g_esLeechSpecial[type].g_iHumanRangeCooldown = iGetKeyValue(subsection, MT_LEECH_SECTION, MT_LEECH_SECTION2, MT_LEECH_SECTION3, MT_LEECH_SECTION4, key, "HumanRangeCooldown", "Human Range Cooldown", "Human_Range_Cooldown", "hrangecooldown", g_esLeechSpecial[type].g_iHumanRangeCooldown, value, -1, 99999); - g_esLeechSpecial[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_LEECH_SECTION, MT_LEECH_SECTION2, MT_LEECH_SECTION3, MT_LEECH_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esLeechSpecial[type].g_flOpenAreasOnly, value, -1.0, 99999.0); - g_esLeechSpecial[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_LEECH_SECTION, MT_LEECH_SECTION2, MT_LEECH_SECTION3, MT_LEECH_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esLeechSpecial[type].g_iRequiresHumans, value, -1, 32); - g_esLeechSpecial[type].g_iLeechAbility = iGetKeyValue(subsection, MT_LEECH_SECTION, MT_LEECH_SECTION2, MT_LEECH_SECTION3, MT_LEECH_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esLeechSpecial[type].g_iLeechAbility, value, -1, 1); - g_esLeechSpecial[type].g_iLeechEffect = iGetKeyValue(subsection, MT_LEECH_SECTION, MT_LEECH_SECTION2, MT_LEECH_SECTION3, MT_LEECH_SECTION4, key, "AbilityEffect", "Ability Effect", "Ability_Effect", "effect", g_esLeechSpecial[type].g_iLeechEffect, value, -1, 7); - g_esLeechSpecial[type].g_iLeechMessage = iGetKeyValue(subsection, MT_LEECH_SECTION, MT_LEECH_SECTION2, MT_LEECH_SECTION3, MT_LEECH_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esLeechSpecial[type].g_iLeechMessage, value, -1, 3); - g_esLeechSpecial[type].g_iLeechSight = iGetKeyValue(subsection, MT_LEECH_SECTION, MT_LEECH_SECTION2, MT_LEECH_SECTION3, MT_LEECH_SECTION4, key, "AbilitySight", "Ability Sight", "Ability_Sight", "sight", g_esLeechSpecial[type].g_iLeechSight, value, -1, 5); - g_esLeechSpecial[type].g_flLeechChance = flGetKeyValue(subsection, MT_LEECH_SECTION, MT_LEECH_SECTION2, MT_LEECH_SECTION3, MT_LEECH_SECTION4, key, "LeechChance", "Leech Chance", "Leech_Chance", "chance", g_esLeechSpecial[type].g_flLeechChance, value, -1.0, 100.0); - g_esLeechSpecial[type].g_iLeechCooldown = iGetKeyValue(subsection, MT_LEECH_SECTION, MT_LEECH_SECTION2, MT_LEECH_SECTION3, MT_LEECH_SECTION4, key, "LeechCooldown", "Leech Cooldown", "Leech_Cooldown", "cooldown", g_esLeechSpecial[type].g_iLeechCooldown, value, -1, 99999); - g_esLeechSpecial[type].g_iLeechDuration = iGetKeyValue(subsection, MT_LEECH_SECTION, MT_LEECH_SECTION2, MT_LEECH_SECTION3, MT_LEECH_SECTION4, key, "LeechDuration", "Leech Duration", "Leech_Duration", "duration", g_esLeechSpecial[type].g_iLeechDuration, value, -1, 99999); - g_esLeechSpecial[type].g_iLeechHit = iGetKeyValue(subsection, MT_LEECH_SECTION, MT_LEECH_SECTION2, MT_LEECH_SECTION3, MT_LEECH_SECTION4, key, "LeechHit", "Leech Hit", "Leech_Hit", "hit", g_esLeechSpecial[type].g_iLeechHit, value, -1, 1); - g_esLeechSpecial[type].g_iLeechHitMode = iGetKeyValue(subsection, MT_LEECH_SECTION, MT_LEECH_SECTION2, MT_LEECH_SECTION3, MT_LEECH_SECTION4, key, "LeechHitMode", "Leech Hit Mode", "Leech_Hit_Mode", "hitmode", g_esLeechSpecial[type].g_iLeechHitMode, value, -1, 2); - g_esLeechSpecial[type].g_flLeechInterval = flGetKeyValue(subsection, MT_LEECH_SECTION, MT_LEECH_SECTION2, MT_LEECH_SECTION3, MT_LEECH_SECTION4, key, "LeechInterval", "Leech Interval", "Leech_Interval", "interval", g_esLeechSpecial[type].g_flLeechInterval, value, -1.0, 99999.0); - g_esLeechSpecial[type].g_flLeechRange = flGetKeyValue(subsection, MT_LEECH_SECTION, MT_LEECH_SECTION2, MT_LEECH_SECTION3, MT_LEECH_SECTION4, key, "LeechRange", "Leech Range", "Leech_Range", "range", g_esLeechSpecial[type].g_flLeechRange, value, -1.0, 99999.0); - g_esLeechSpecial[type].g_flLeechRangeChance = flGetKeyValue(subsection, MT_LEECH_SECTION, MT_LEECH_SECTION2, MT_LEECH_SECTION3, MT_LEECH_SECTION4, key, "LeechRangeChance", "Leech Range Chance", "Leech_Range_Chance", "rangechance", g_esLeechSpecial[type].g_flLeechRangeChance, value, -1.0, 100.0); - g_esLeechSpecial[type].g_iLeechRangeCooldown = iGetKeyValue(subsection, MT_LEECH_SECTION, MT_LEECH_SECTION2, MT_LEECH_SECTION3, MT_LEECH_SECTION4, key, "LeechRangeCooldown", "Leech Range Cooldown", "Leech_Range_Cooldown", "rangecooldown", g_esLeechSpecial[type].g_iLeechRangeCooldown, value, -1, 99999); - } - else - { - g_esLeechAbility[type].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_LEECH_SECTION, MT_LEECH_SECTION2, MT_LEECH_SECTION3, MT_LEECH_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esLeechAbility[type].g_flCloseAreasOnly, value, -1.0, 99999.0); - g_esLeechAbility[type].g_iComboAbility = iGetKeyValue(subsection, MT_LEECH_SECTION, MT_LEECH_SECTION2, MT_LEECH_SECTION3, MT_LEECH_SECTION4, key, "ComboAbility", "Combo Ability", "Combo_Ability", "combo", g_esLeechAbility[type].g_iComboAbility, value, -1, 1); - g_esLeechAbility[type].g_iHumanAbility = iGetKeyValue(subsection, MT_LEECH_SECTION, MT_LEECH_SECTION2, MT_LEECH_SECTION3, MT_LEECH_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esLeechAbility[type].g_iHumanAbility, value, -1, 2); - g_esLeechAbility[type].g_iHumanAmmo = iGetKeyValue(subsection, MT_LEECH_SECTION, MT_LEECH_SECTION2, MT_LEECH_SECTION3, MT_LEECH_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esLeechAbility[type].g_iHumanAmmo, value, -1, 99999); - g_esLeechAbility[type].g_iHumanCooldown = iGetKeyValue(subsection, MT_LEECH_SECTION, MT_LEECH_SECTION2, MT_LEECH_SECTION3, MT_LEECH_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esLeechAbility[type].g_iHumanCooldown, value, -1, 99999); - g_esLeechAbility[type].g_iHumanRangeCooldown = iGetKeyValue(subsection, MT_LEECH_SECTION, MT_LEECH_SECTION2, MT_LEECH_SECTION3, MT_LEECH_SECTION4, key, "HumanRangeCooldown", "Human Range Cooldown", "Human_Range_Cooldown", "hrangecooldown", g_esLeechAbility[type].g_iHumanRangeCooldown, value, -1, 99999); - g_esLeechAbility[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_LEECH_SECTION, MT_LEECH_SECTION2, MT_LEECH_SECTION3, MT_LEECH_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esLeechAbility[type].g_flOpenAreasOnly, value, -1.0, 99999.0); - g_esLeechAbility[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_LEECH_SECTION, MT_LEECH_SECTION2, MT_LEECH_SECTION3, MT_LEECH_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esLeechAbility[type].g_iRequiresHumans, value, -1, 32); - g_esLeechAbility[type].g_iLeechAbility = iGetKeyValue(subsection, MT_LEECH_SECTION, MT_LEECH_SECTION2, MT_LEECH_SECTION3, MT_LEECH_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esLeechAbility[type].g_iLeechAbility, value, -1, 1); - g_esLeechAbility[type].g_iLeechEffect = iGetKeyValue(subsection, MT_LEECH_SECTION, MT_LEECH_SECTION2, MT_LEECH_SECTION3, MT_LEECH_SECTION4, key, "AbilityEffect", "Ability Effect", "Ability_Effect", "effect", g_esLeechAbility[type].g_iLeechEffect, value, -1, 7); - g_esLeechAbility[type].g_iLeechMessage = iGetKeyValue(subsection, MT_LEECH_SECTION, MT_LEECH_SECTION2, MT_LEECH_SECTION3, MT_LEECH_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esLeechAbility[type].g_iLeechMessage, value, -1, 3); - g_esLeechAbility[type].g_iLeechSight = iGetKeyValue(subsection, MT_LEECH_SECTION, MT_LEECH_SECTION2, MT_LEECH_SECTION3, MT_LEECH_SECTION4, key, "AbilitySight", "Ability Sight", "Ability_Sight", "sight", g_esLeechAbility[type].g_iLeechSight, value, -1, 5); - g_esLeechAbility[type].g_flLeechChance = flGetKeyValue(subsection, MT_LEECH_SECTION, MT_LEECH_SECTION2, MT_LEECH_SECTION3, MT_LEECH_SECTION4, key, "LeechChance", "Leech Chance", "Leech_Chance", "chance", g_esLeechAbility[type].g_flLeechChance, value, -1.0, 100.0); - g_esLeechAbility[type].g_iLeechCooldown = iGetKeyValue(subsection, MT_LEECH_SECTION, MT_LEECH_SECTION2, MT_LEECH_SECTION3, MT_LEECH_SECTION4, key, "LeechCooldown", "Leech Cooldown", "Leech_Cooldown", "cooldown", g_esLeechAbility[type].g_iLeechCooldown, value, -1, 99999); - g_esLeechAbility[type].g_iLeechDuration = iGetKeyValue(subsection, MT_LEECH_SECTION, MT_LEECH_SECTION2, MT_LEECH_SECTION3, MT_LEECH_SECTION4, key, "LeechDuration", "Leech Duration", "Leech_Duration", "duration", g_esLeechAbility[type].g_iLeechDuration, value, -1, 99999); - g_esLeechAbility[type].g_iLeechHit = iGetKeyValue(subsection, MT_LEECH_SECTION, MT_LEECH_SECTION2, MT_LEECH_SECTION3, MT_LEECH_SECTION4, key, "LeechHit", "Leech Hit", "Leech_Hit", "hit", g_esLeechAbility[type].g_iLeechHit, value, -1, 1); - g_esLeechAbility[type].g_iLeechHitMode = iGetKeyValue(subsection, MT_LEECH_SECTION, MT_LEECH_SECTION2, MT_LEECH_SECTION3, MT_LEECH_SECTION4, key, "LeechHitMode", "Leech Hit Mode", "Leech_Hit_Mode", "hitmode", g_esLeechAbility[type].g_iLeechHitMode, value, -1, 2); - g_esLeechAbility[type].g_flLeechInterval = flGetKeyValue(subsection, MT_LEECH_SECTION, MT_LEECH_SECTION2, MT_LEECH_SECTION3, MT_LEECH_SECTION4, key, "LeechInterval", "Leech Interval", "Leech_Interval", "interval", g_esLeechAbility[type].g_flLeechInterval, value, -1.0, 99999.0); - g_esLeechAbility[type].g_flLeechRange = flGetKeyValue(subsection, MT_LEECH_SECTION, MT_LEECH_SECTION2, MT_LEECH_SECTION3, MT_LEECH_SECTION4, key, "LeechRange", "Leech Range", "Leech_Range", "range", g_esLeechAbility[type].g_flLeechRange, value, -1.0, 99999.0); - g_esLeechAbility[type].g_flLeechRangeChance = flGetKeyValue(subsection, MT_LEECH_SECTION, MT_LEECH_SECTION2, MT_LEECH_SECTION3, MT_LEECH_SECTION4, key, "LeechRangeChance", "Leech Range Chance", "Leech_Range_Chance", "rangechance", g_esLeechAbility[type].g_flLeechRangeChance, value, -1.0, 100.0); - g_esLeechAbility[type].g_iLeechRangeCooldown = iGetKeyValue(subsection, MT_LEECH_SECTION, MT_LEECH_SECTION2, MT_LEECH_SECTION3, MT_LEECH_SECTION4, key, "LeechRangeCooldown", "Leech Range Cooldown", "Leech_Range_Cooldown", "rangecooldown", g_esLeechAbility[type].g_iLeechRangeCooldown, value, -1, 99999); - g_esLeechAbility[type].g_iAccessFlags = iGetAdminFlagsValue(subsection, MT_LEECH_SECTION, MT_LEECH_SECTION2, MT_LEECH_SECTION3, MT_LEECH_SECTION4, key, "AccessFlags", "Access Flags", "Access_Flags", "access", value); - g_esLeechAbility[type].g_iImmunityFlags = iGetAdminFlagsValue(subsection, MT_LEECH_SECTION, MT_LEECH_SECTION2, MT_LEECH_SECTION3, MT_LEECH_SECTION4, key, "ImmunityFlags", "Immunity Flags", "Immunity_Flags", "immunity", value); - } - } -} - -#if defined MT_ABILITIES_MAIN -void vLeechSettingsCached(int tank, bool apply, int type) -#else -public void MT_OnSettingsCached(int tank, bool apply, int type) -#endif -{ - bool bHuman = bIsValidClient(tank, MT_CHECK_FAKECLIENT); - g_esLeechPlayer[tank].g_iTankTypeRecorded = apply ? MT_GetRecordedTankType(tank, type) : 0; - g_esLeechPlayer[tank].g_iTankType = apply ? type : 0; - int iType = g_esLeechPlayer[tank].g_iTankTypeRecorded; - - if (bIsSpecialInfected(tank, MT_CHECK_INDEX|MT_CHECK_INGAME)) - { - g_esLeechCache[tank].g_flCloseAreasOnly = flGetSubSettingValue(apply, bHuman, g_esLeechTeammate[tank].g_flCloseAreasOnly, g_esLeechPlayer[tank].g_flCloseAreasOnly, g_esLeechSpecial[iType].g_flCloseAreasOnly, g_esLeechAbility[iType].g_flCloseAreasOnly, 1); - g_esLeechCache[tank].g_iComboAbility = iGetSubSettingValue(apply, bHuman, g_esLeechTeammate[tank].g_iComboAbility, g_esLeechPlayer[tank].g_iComboAbility, g_esLeechSpecial[iType].g_iComboAbility, g_esLeechAbility[iType].g_iComboAbility, 1); - g_esLeechCache[tank].g_flLeechChance = flGetSubSettingValue(apply, bHuman, g_esLeechTeammate[tank].g_flLeechChance, g_esLeechPlayer[tank].g_flLeechChance, g_esLeechSpecial[iType].g_flLeechChance, g_esLeechAbility[iType].g_flLeechChance, 1); - g_esLeechCache[tank].g_flLeechInterval = flGetSubSettingValue(apply, bHuman, g_esLeechTeammate[tank].g_flLeechInterval, g_esLeechPlayer[tank].g_flLeechInterval, g_esLeechSpecial[iType].g_flLeechInterval, g_esLeechAbility[iType].g_flLeechInterval, 1); - g_esLeechCache[tank].g_flLeechRange = flGetSubSettingValue(apply, bHuman, g_esLeechTeammate[tank].g_flLeechRange, g_esLeechPlayer[tank].g_flLeechRange, g_esLeechSpecial[iType].g_flLeechRange, g_esLeechAbility[iType].g_flLeechRange, 1); - g_esLeechCache[tank].g_flLeechRangeChance = flGetSubSettingValue(apply, bHuman, g_esLeechTeammate[tank].g_flLeechRangeChance, g_esLeechPlayer[tank].g_flLeechRangeChance, g_esLeechSpecial[iType].g_flLeechRangeChance, g_esLeechAbility[iType].g_flLeechRangeChance, 1); - g_esLeechCache[tank].g_iHumanAbility = iGetSubSettingValue(apply, bHuman, g_esLeechTeammate[tank].g_iHumanAbility, g_esLeechPlayer[tank].g_iHumanAbility, g_esLeechSpecial[iType].g_iHumanAbility, g_esLeechAbility[iType].g_iHumanAbility, 1); - g_esLeechCache[tank].g_iHumanAmmo = iGetSubSettingValue(apply, bHuman, g_esLeechTeammate[tank].g_iHumanAmmo, g_esLeechPlayer[tank].g_iHumanAmmo, g_esLeechSpecial[iType].g_iHumanAmmo, g_esLeechAbility[iType].g_iHumanAmmo, 1); - g_esLeechCache[tank].g_iHumanCooldown = iGetSubSettingValue(apply, bHuman, g_esLeechTeammate[tank].g_iHumanCooldown, g_esLeechPlayer[tank].g_iHumanCooldown, g_esLeechSpecial[iType].g_iHumanCooldown, g_esLeechAbility[iType].g_iHumanCooldown, 1); - g_esLeechCache[tank].g_iHumanRangeCooldown = iGetSubSettingValue(apply, bHuman, g_esLeechTeammate[tank].g_iHumanRangeCooldown, g_esLeechPlayer[tank].g_iHumanRangeCooldown, g_esLeechSpecial[iType].g_iHumanRangeCooldown, g_esLeechAbility[iType].g_iHumanRangeCooldown, 1); - g_esLeechCache[tank].g_iLeechAbility = iGetSubSettingValue(apply, bHuman, g_esLeechTeammate[tank].g_iLeechAbility, g_esLeechPlayer[tank].g_iLeechAbility, g_esLeechSpecial[iType].g_iLeechAbility, g_esLeechAbility[iType].g_iLeechAbility, 1); - g_esLeechCache[tank].g_iLeechCooldown = iGetSubSettingValue(apply, bHuman, g_esLeechTeammate[tank].g_iLeechCooldown, g_esLeechPlayer[tank].g_iLeechCooldown, g_esLeechSpecial[iType].g_iLeechCooldown, g_esLeechAbility[iType].g_iLeechCooldown, 1); - g_esLeechCache[tank].g_iLeechDuration = iGetSubSettingValue(apply, bHuman, g_esLeechTeammate[tank].g_iLeechDuration, g_esLeechPlayer[tank].g_iLeechDuration, g_esLeechSpecial[iType].g_iLeechDuration, g_esLeechAbility[iType].g_iLeechDuration, 1); - g_esLeechCache[tank].g_iLeechEffect = iGetSubSettingValue(apply, bHuman, g_esLeechTeammate[tank].g_iLeechEffect, g_esLeechPlayer[tank].g_iLeechEffect, g_esLeechSpecial[iType].g_iLeechEffect, g_esLeechAbility[iType].g_iLeechEffect, 1); - g_esLeechCache[tank].g_iLeechHit = iGetSubSettingValue(apply, bHuman, g_esLeechTeammate[tank].g_iLeechHit, g_esLeechPlayer[tank].g_iLeechHit, g_esLeechSpecial[iType].g_iLeechHit, g_esLeechAbility[iType].g_iLeechHit, 1); - g_esLeechCache[tank].g_iLeechHitMode = iGetSubSettingValue(apply, bHuman, g_esLeechTeammate[tank].g_iLeechHitMode, g_esLeechPlayer[tank].g_iLeechHitMode, g_esLeechSpecial[iType].g_iLeechHitMode, g_esLeechAbility[iType].g_iLeechHitMode, 1); - g_esLeechCache[tank].g_iLeechMessage = iGetSubSettingValue(apply, bHuman, g_esLeechTeammate[tank].g_iLeechMessage, g_esLeechPlayer[tank].g_iLeechMessage, g_esLeechSpecial[iType].g_iLeechMessage, g_esLeechAbility[iType].g_iLeechMessage, 1); - g_esLeechCache[tank].g_iLeechRangeCooldown = iGetSubSettingValue(apply, bHuman, g_esLeechTeammate[tank].g_iLeechRangeCooldown, g_esLeechPlayer[tank].g_iLeechRangeCooldown, g_esLeechSpecial[iType].g_iLeechRangeCooldown, g_esLeechAbility[iType].g_iLeechRangeCooldown, 1); - g_esLeechCache[tank].g_iLeechSight = iGetSubSettingValue(apply, bHuman, g_esLeechTeammate[tank].g_iLeechSight, g_esLeechPlayer[tank].g_iLeechSight, g_esLeechSpecial[iType].g_iLeechSight, g_esLeechAbility[iType].g_iLeechSight, 1); - g_esLeechCache[tank].g_flOpenAreasOnly = flGetSubSettingValue(apply, bHuman, g_esLeechTeammate[tank].g_flOpenAreasOnly, g_esLeechPlayer[tank].g_flOpenAreasOnly, g_esLeechSpecial[iType].g_flOpenAreasOnly, g_esLeechAbility[iType].g_flOpenAreasOnly, 1); - g_esLeechCache[tank].g_iRequiresHumans = iGetSubSettingValue(apply, bHuman, g_esLeechTeammate[tank].g_iRequiresHumans, g_esLeechPlayer[tank].g_iRequiresHumans, g_esLeechSpecial[iType].g_iRequiresHumans, g_esLeechAbility[iType].g_iRequiresHumans, 1); - } - else - { - g_esLeechCache[tank].g_flCloseAreasOnly = flGetSettingValue(apply, bHuman, g_esLeechPlayer[tank].g_flCloseAreasOnly, g_esLeechAbility[iType].g_flCloseAreasOnly, 1); - g_esLeechCache[tank].g_iComboAbility = iGetSettingValue(apply, bHuman, g_esLeechPlayer[tank].g_iComboAbility, g_esLeechAbility[iType].g_iComboAbility, 1); - g_esLeechCache[tank].g_flLeechChance = flGetSettingValue(apply, bHuman, g_esLeechPlayer[tank].g_flLeechChance, g_esLeechAbility[iType].g_flLeechChance, 1); - g_esLeechCache[tank].g_flLeechInterval = flGetSettingValue(apply, bHuman, g_esLeechPlayer[tank].g_flLeechInterval, g_esLeechAbility[iType].g_flLeechInterval, 1); - g_esLeechCache[tank].g_flLeechRange = flGetSettingValue(apply, bHuman, g_esLeechPlayer[tank].g_flLeechRange, g_esLeechAbility[iType].g_flLeechRange, 1); - g_esLeechCache[tank].g_flLeechRangeChance = flGetSettingValue(apply, bHuman, g_esLeechPlayer[tank].g_flLeechRangeChance, g_esLeechAbility[iType].g_flLeechRangeChance, 1); - g_esLeechCache[tank].g_iHumanAbility = iGetSettingValue(apply, bHuman, g_esLeechPlayer[tank].g_iHumanAbility, g_esLeechAbility[iType].g_iHumanAbility, 1); - g_esLeechCache[tank].g_iHumanAmmo = iGetSettingValue(apply, bHuman, g_esLeechPlayer[tank].g_iHumanAmmo, g_esLeechAbility[iType].g_iHumanAmmo, 1); - g_esLeechCache[tank].g_iHumanCooldown = iGetSettingValue(apply, bHuman, g_esLeechPlayer[tank].g_iHumanCooldown, g_esLeechAbility[iType].g_iHumanCooldown, 1); - g_esLeechCache[tank].g_iHumanRangeCooldown = iGetSettingValue(apply, bHuman, g_esLeechPlayer[tank].g_iHumanRangeCooldown, g_esLeechAbility[iType].g_iHumanRangeCooldown, 1); - g_esLeechCache[tank].g_iLeechAbility = iGetSettingValue(apply, bHuman, g_esLeechPlayer[tank].g_iLeechAbility, g_esLeechAbility[iType].g_iLeechAbility, 1); - g_esLeechCache[tank].g_iLeechCooldown = iGetSettingValue(apply, bHuman, g_esLeechPlayer[tank].g_iLeechCooldown, g_esLeechAbility[iType].g_iLeechCooldown, 1); - g_esLeechCache[tank].g_iLeechDuration = iGetSettingValue(apply, bHuman, g_esLeechPlayer[tank].g_iLeechDuration, g_esLeechAbility[iType].g_iLeechDuration, 1); - g_esLeechCache[tank].g_iLeechEffect = iGetSettingValue(apply, bHuman, g_esLeechPlayer[tank].g_iLeechEffect, g_esLeechAbility[iType].g_iLeechEffect, 1); - g_esLeechCache[tank].g_iLeechHit = iGetSettingValue(apply, bHuman, g_esLeechPlayer[tank].g_iLeechHit, g_esLeechAbility[iType].g_iLeechHit, 1); - g_esLeechCache[tank].g_iLeechHitMode = iGetSettingValue(apply, bHuman, g_esLeechPlayer[tank].g_iLeechHitMode, g_esLeechAbility[iType].g_iLeechHitMode, 1); - g_esLeechCache[tank].g_iLeechMessage = iGetSettingValue(apply, bHuman, g_esLeechPlayer[tank].g_iLeechMessage, g_esLeechAbility[iType].g_iLeechMessage, 1); - g_esLeechCache[tank].g_iLeechRangeCooldown = iGetSettingValue(apply, bHuman, g_esLeechPlayer[tank].g_iLeechRangeCooldown, g_esLeechAbility[iType].g_iLeechRangeCooldown, 1); - g_esLeechCache[tank].g_iLeechSight = iGetSettingValue(apply, bHuman, g_esLeechPlayer[tank].g_iLeechSight, g_esLeechAbility[iType].g_iLeechSight, 1); - g_esLeechCache[tank].g_flOpenAreasOnly = flGetSettingValue(apply, bHuman, g_esLeechPlayer[tank].g_flOpenAreasOnly, g_esLeechAbility[iType].g_flOpenAreasOnly, 1); - g_esLeechCache[tank].g_iRequiresHumans = iGetSettingValue(apply, bHuman, g_esLeechPlayer[tank].g_iRequiresHumans, g_esLeechAbility[iType].g_iRequiresHumans, 1); - } -} - -#if defined MT_ABILITIES_MAIN -void vLeechCopyStats(int oldTank, int newTank) -#else -public void MT_OnCopyStats(int oldTank, int newTank) -#endif -{ - vLeechCopyStats2(oldTank, newTank); - - if (oldTank != newTank) - { - vRemoveLeech(oldTank); - } -} - -#if !defined MT_ABILITIES_MAIN -public void MT_OnPluginUpdate() -{ - MT_ReloadPlugin(null); -} -#endif - -#if defined MT_ABILITIES_MAIN -void vLeechEventFired(Event event, const char[] name) -#else -public void MT_OnEventFired(Event event, const char[] name, bool dontBroadcast) -#endif -{ - if (StrEqual(name, "bot_player_replace")) - { - int iBotId = event.GetInt("bot"), iBot = GetClientOfUserId(iBotId), - iTankId = event.GetInt("player"), iTank = GetClientOfUserId(iTankId); - if (bIsValidClient(iBot) && bIsInfected(iTank)) - { - vLeechCopyStats2(iBot, iTank); - vRemoveLeech(iBot); - } - } - else if (StrEqual(name, "mission_lost") || StrEqual(name, "round_start") || StrEqual(name, "round_end")) - { - vLeechReset(); - } - else if (StrEqual(name, "player_bot_replace")) - { - int iTankId = event.GetInt("player"), iTank = GetClientOfUserId(iTankId), - iBotId = event.GetInt("bot"), iBot = GetClientOfUserId(iBotId); - if (bIsValidClient(iTank) && bIsInfected(iBot)) - { - vLeechCopyStats2(iTank, iBot); - vRemoveLeech(iTank); - } - } - else if (StrEqual(name, "player_death") || StrEqual(name, "player_spawn")) - { - int iTankId = event.GetInt("userid"), iTank = GetClientOfUserId(iTankId); - if (MT_IsTankSupported(iTank, MT_CHECK_INDEX|MT_CHECK_INGAME)) - { - vRemoveLeech(iTank); - } - } - else if (StrEqual(name, "player_now_it")) - { - bool bExploded = event.GetBool("exploded"); - int iSurvivorId = event.GetInt("userid"), iSurvivor = GetClientOfUserId(iSurvivorId), - iBoomerId = event.GetInt("attacker"), iBoomer = GetClientOfUserId(iBoomerId); - if (bIsBoomer(iBoomer) && bIsSurvivor(iSurvivor) && !bExploded) - { - vLeechHit(iSurvivor, iBoomer, GetRandomFloat(0.1, 100.0), g_esLeechCache[iBoomer].g_flLeechChance, g_esLeechCache[iBoomer].g_iLeechHit, MT_MESSAGE_RANGE, MT_ATTACK_RANGE); - } - } -} - -#if defined MT_ABILITIES_MAIN -void vLeechAbilityActivated(int tank) -#else -public void MT_OnAbilityActivated(int tank) -#endif -{ - if (MT_IsTankSupported(tank, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_FAKECLIENT) && ((!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esLeechAbility[g_esLeechPlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esLeechPlayer[tank].g_iAccessFlags)) || g_esLeechCache[tank].g_iHumanAbility == 0)) - { - return; - } - - if (MT_IsTankSupported(tank) && (!bIsInfected(tank, MT_CHECK_FAKECLIENT) || g_esLeechCache[tank].g_iHumanAbility != 1) && MT_IsCustomTankSupported(tank) && g_esLeechCache[tank].g_iLeechAbility == 1 && g_esLeechCache[tank].g_iComboAbility == 0) - { - vLeechAbility(tank, GetRandomFloat(0.1, 100.0)); - } -} - -#if defined MT_ABILITIES_MAIN -void vLeechButtonPressed(int tank, int button) -#else -public void MT_OnButtonPressed(int tank, int button) -#endif -{ - if (MT_IsTankSupported(tank, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_ALIVE|MT_CHECK_FAKECLIENT) && MT_IsCustomTankSupported(tank)) - { - if (bIsAreaNarrow(tank, g_esLeechCache[tank].g_flOpenAreasOnly) || bIsAreaWide(tank, g_esLeechCache[tank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esLeechPlayer[tank].g_iTankType, tank) || (g_esLeechCache[tank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esLeechCache[tank].g_iRequiresHumans) || (!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esLeechAbility[g_esLeechPlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esLeechPlayer[tank].g_iAccessFlags))) - { - return; - } - - if ((button & MT_SUB_KEY) && g_esLeechCache[tank].g_iLeechAbility == 1 && g_esLeechCache[tank].g_iHumanAbility == 1) - { - int iTime = GetTime(); - - switch (g_esLeechPlayer[tank].g_iRangeCooldown == -1 || g_esLeechPlayer[tank].g_iRangeCooldown <= iTime) - { - case true: vLeechAbility(tank, GetRandomFloat(0.1, 100.0)); - case false: MT_PrintToChat(tank, "%s %t", MT_TAG3, "LeechHuman3", (g_esLeechPlayer[tank].g_iRangeCooldown - iTime)); - } - } - } -} - -#if defined MT_ABILITIES_MAIN -void vLeechChangeType(int tank, int oldType) -#else -public void MT_OnChangeType(int tank, int oldType, int newType, bool revert) -#endif -{ - if (oldType <= 0) - { - return; - } - - vRemoveLeech(tank); -} - -void vLeechAbility(int tank, float random, int pos = -1) -{ - if (bIsAreaNarrow(tank, g_esLeechCache[tank].g_flOpenAreasOnly) || bIsAreaWide(tank, g_esLeechCache[tank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esLeechPlayer[tank].g_iTankType, tank) || (g_esLeechCache[tank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esLeechCache[tank].g_iRequiresHumans) || (!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esLeechAbility[g_esLeechPlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esLeechPlayer[tank].g_iAccessFlags))) - { - return; - } - - if (!bIsInfected(tank, MT_CHECK_FAKECLIENT) || (g_esLeechPlayer[tank].g_iAmmoCount < g_esLeechCache[tank].g_iHumanAmmo && g_esLeechCache[tank].g_iHumanAmmo > 0)) - { - g_esLeechPlayer[tank].g_bFailed = false; - g_esLeechPlayer[tank].g_bNoAmmo = false; - - float flTankPos[3], flSurvivorPos[3]; - GetClientAbsOrigin(tank, flTankPos); - float flRange = (pos != -1) ? MT_GetCombinationSetting(tank, 9, pos) : g_esLeechCache[tank].g_flLeechRange, - flChance = (pos != -1) ? MT_GetCombinationSetting(tank, 10, pos) : g_esLeechCache[tank].g_flLeechRangeChance; - int iSurvivorCount = 0; - for (int iSurvivor = 1; iSurvivor <= MaxClients; iSurvivor++) - { - if (bIsSurvivor(iSurvivor, MT_CHECK_INGAME|MT_CHECK_ALIVE) && !MT_IsAdminImmune(iSurvivor, tank) && !bIsAdminImmune(iSurvivor, g_esLeechPlayer[tank].g_iTankType, g_esLeechAbility[g_esLeechPlayer[tank].g_iTankTypeRecorded].g_iImmunityFlags, g_esLeechPlayer[iSurvivor].g_iImmunityFlags)) - { - GetClientAbsOrigin(iSurvivor, flSurvivorPos); - if (GetVectorDistance(flTankPos, flSurvivorPos) <= flRange && bIsVisibleToPlayer(tank, iSurvivor, g_esLeechCache[tank].g_iLeechSight, .range = flRange)) - { - vLeechHit(iSurvivor, tank, random, flChance, g_esLeechCache[tank].g_iLeechAbility, MT_MESSAGE_RANGE, MT_ATTACK_RANGE, pos); - - iSurvivorCount++; - } - } - } - - if (iSurvivorCount == 0) - { - if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esLeechCache[tank].g_iHumanAbility == 1) - { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "LeechHuman4"); - } - } - } - else if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esLeechCache[tank].g_iHumanAbility == 1) - { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "LeechAmmo"); - } -} - -void vLeechHit(int survivor, int tank, float random, float chance, int enabled, int messages, int flags, int pos = -1) -{ - if (bIsAreaNarrow(tank, g_esLeechCache[tank].g_flOpenAreasOnly) || bIsAreaWide(tank, g_esLeechCache[tank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esLeechPlayer[tank].g_iTankType, tank) || (g_esLeechCache[tank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esLeechCache[tank].g_iRequiresHumans) || (!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esLeechAbility[g_esLeechPlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esLeechPlayer[tank].g_iAccessFlags)) || MT_IsAdminImmune(survivor, tank) || bIsAdminImmune(survivor, g_esLeechPlayer[tank].g_iTankType, g_esLeechAbility[g_esLeechPlayer[tank].g_iTankTypeRecorded].g_iImmunityFlags, g_esLeechPlayer[survivor].g_iImmunityFlags)) - { - return; - } - - int iTime = GetTime(); - if (((flags & MT_ATTACK_RANGE) && g_esLeechPlayer[tank].g_iRangeCooldown != -1 && g_esLeechPlayer[tank].g_iRangeCooldown >= iTime) || (((flags & MT_ATTACK_CLAW) || (flags & MT_ATTACK_MELEE)) && g_esLeechPlayer[tank].g_iCooldown != -1 && g_esLeechPlayer[tank].g_iCooldown >= iTime)) - { - return; - } - - if (enabled == 1 && bIsSurvivor(survivor)) - { - if (!bIsInfected(tank, MT_CHECK_FAKECLIENT) || (flags & MT_ATTACK_CLAW) || (flags & MT_ATTACK_MELEE) || (g_esLeechPlayer[tank].g_iAmmoCount < g_esLeechCache[tank].g_iHumanAmmo && g_esLeechCache[tank].g_iHumanAmmo > 0)) - { - if (random <= chance && !g_esLeechPlayer[survivor].g_bAffected) - { - if ((messages & MT_MESSAGE_MELEE) && !bIsVisibleToPlayer(tank, survivor, g_esLeechCache[tank].g_iLeechSight, .range = 100.0)) - { - return; - } - - g_esLeechPlayer[survivor].g_bAffected = true; - g_esLeechPlayer[survivor].g_iOwner = tank; - - int iCooldown = -1; - if ((flags & MT_ATTACK_RANGE) && (g_esLeechPlayer[tank].g_iRangeCooldown == -1 || g_esLeechPlayer[tank].g_iRangeCooldown <= iTime)) - { - if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esLeechCache[tank].g_iHumanAbility == 1) - { - g_esLeechPlayer[tank].g_iAmmoCount++; - - MT_PrintToChat(tank, "%s %t", MT_TAG3, "LeechHuman", g_esLeechPlayer[tank].g_iAmmoCount, g_esLeechCache[tank].g_iHumanAmmo); - } - - iCooldown = (pos != -1) ? RoundToNearest(MT_GetCombinationSetting(tank, 11, pos)) : g_esLeechCache[tank].g_iLeechRangeCooldown; - iCooldown = (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esLeechCache[tank].g_iHumanAbility == 1 && g_esLeechPlayer[tank].g_iAmmoCount < g_esLeechCache[tank].g_iHumanAmmo && g_esLeechCache[tank].g_iHumanAmmo > 0) ? g_esLeechCache[tank].g_iHumanRangeCooldown : iCooldown; - g_esLeechPlayer[tank].g_iRangeCooldown = (iTime + iCooldown); - if (g_esLeechPlayer[tank].g_iRangeCooldown != -1 && g_esLeechPlayer[tank].g_iRangeCooldown >= iTime) - { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "LeechHuman5", (g_esLeechPlayer[tank].g_iRangeCooldown - iTime)); - } - } - else if (((flags & MT_ATTACK_CLAW) || (flags & MT_ATTACK_MELEE)) && (g_esLeechPlayer[tank].g_iCooldown == -1 || g_esLeechPlayer[tank].g_iCooldown <= iTime)) - { - iCooldown = (pos != -1) ? RoundToNearest(MT_GetCombinationSetting(tank, 2, pos)) : g_esLeechCache[tank].g_iLeechCooldown; - iCooldown = (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esLeechCache[tank].g_iHumanAbility == 1) ? g_esLeechCache[tank].g_iHumanCooldown : iCooldown; - g_esLeechPlayer[tank].g_iCooldown = (iTime + iCooldown); - if (g_esLeechPlayer[tank].g_iCooldown != -1 && g_esLeechPlayer[tank].g_iCooldown >= iTime) - { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "LeechHuman5", (g_esLeechPlayer[tank].g_iCooldown - iTime)); - } - } - - float flInterval = (pos != -1) ? MT_GetCombinationSetting(tank, 6, pos) : g_esLeechCache[tank].g_flLeechInterval; - if (flInterval > 0.0) - { - DataPack dpLeech; - CreateDataTimer(flInterval, tTimerLeech, dpLeech, TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); - dpLeech.WriteCell(GetClientUserId(survivor)); - dpLeech.WriteCell(GetClientUserId(tank)); - dpLeech.WriteCell(g_esLeechPlayer[tank].g_iTankType); - dpLeech.WriteCell(messages); - dpLeech.WriteCell(enabled); - dpLeech.WriteCell(pos); - dpLeech.WriteCell(iTime); - } - - vScreenEffect(survivor, tank, g_esLeechCache[tank].g_iLeechEffect, flags); - - if (g_esLeechCache[tank].g_iLeechMessage & messages) - { - char sTankName[64]; - MT_GetTankName(tank, sTankName); - MT_PrintToChatAll("%s %t", MT_TAG2, "Leech", sTankName, survivor); - MT_LogMessage(MT_LOG_ABILITY, "%s %T", MT_TAG, "Leech", LANG_SERVER, sTankName, survivor); - } - } - else if ((flags & MT_ATTACK_RANGE) && (g_esLeechPlayer[tank].g_iRangeCooldown == -1 || g_esLeechPlayer[tank].g_iRangeCooldown <= iTime)) - { - if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esLeechCache[tank].g_iHumanAbility == 1 && !g_esLeechPlayer[tank].g_bFailed) - { - g_esLeechPlayer[tank].g_bFailed = true; - - MT_PrintToChat(tank, "%s %t", MT_TAG3, "LeechHuman2"); - } - } - } - else if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esLeechCache[tank].g_iHumanAbility == 1 && !g_esLeechPlayer[tank].g_bNoAmmo) - { - g_esLeechPlayer[tank].g_bNoAmmo = true; - - MT_PrintToChat(tank, "%s %t", MT_TAG3, "LeechAmmo"); - } - } -} - -void vLeechCopyStats2(int oldTank, int newTank) -{ - g_esLeechPlayer[newTank].g_iAmmoCount = g_esLeechPlayer[oldTank].g_iAmmoCount; - g_esLeechPlayer[newTank].g_iCooldown = g_esLeechPlayer[oldTank].g_iCooldown; - g_esLeechPlayer[newTank].g_iRangeCooldown = g_esLeechPlayer[oldTank].g_iRangeCooldown; -} - -void vRemoveLeech(int tank) -{ - for (int iSurvivor = 1; iSurvivor <= MaxClients; iSurvivor++) - { - if (bIsSurvivor(iSurvivor, MT_CHECK_INGAME|MT_CHECK_ALIVE) && g_esLeechPlayer[iSurvivor].g_bAffected && g_esLeechPlayer[iSurvivor].g_iOwner == tank) - { - g_esLeechPlayer[iSurvivor].g_bAffected = false; - g_esLeechPlayer[iSurvivor].g_iOwner = -1; - } - } - - vLeechReset3(tank); -} - -void vLeechReset() -{ - for (int iPlayer = 1; iPlayer <= MaxClients; iPlayer++) - { - if (bIsValidClient(iPlayer, MT_CHECK_INGAME)) - { - vLeechReset3(iPlayer); - - g_esLeechPlayer[iPlayer].g_iOwner = -1; - } - } -} - -void vLeechReset2(int survivor, int tank, int messages) -{ - g_esLeechPlayer[survivor].g_bAffected = false; - g_esLeechPlayer[survivor].g_iOwner = -1; - - if (g_esLeechCache[tank].g_iLeechMessage & messages) - { - char sTankName[64]; - MT_GetTankName(tank, sTankName); - MT_PrintToChatAll("%s %t", MT_TAG2, "Leech2", sTankName, survivor); - MT_LogMessage(MT_LOG_ABILITY, "%s %T", MT_TAG, "Leech2", LANG_SERVER, sTankName, survivor); - } -} - -void vLeechReset3(int tank) -{ - g_esLeechPlayer[tank].g_bAffected = false; - g_esLeechPlayer[tank].g_bFailed = false; - g_esLeechPlayer[tank].g_bNoAmmo = false; - g_esLeechPlayer[tank].g_iAmmoCount = 0; - g_esLeechPlayer[tank].g_iCooldown = -1; - g_esLeechPlayer[tank].g_iRangeCooldown = -1; -} - -void tTimerLeechCombo(Handle timer, DataPack pack) -{ - pack.Reset(); - - int iTank = GetClientOfUserId(pack.ReadCell()); - if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esLeechAbility[g_esLeechPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esLeechPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esLeechPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esLeechCache[iTank].g_iLeechAbility == 0) - { - return; - } - - float flRandom = pack.ReadFloat(); - int iPos = pack.ReadCell(); - vLeechAbility(iTank, flRandom, iPos); -} - -void tTimerLeechCombo2(Handle timer, DataPack pack) -{ - pack.Reset(); - - int iSurvivor = GetClientOfUserId(pack.ReadCell()); - if (!bIsSurvivor(iSurvivor) || g_esLeechPlayer[iSurvivor].g_bAffected) - { - return; - } - - int iTank = GetClientOfUserId(pack.ReadCell()); - if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esLeechAbility[g_esLeechPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esLeechPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esLeechPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esLeechCache[iTank].g_iLeechHit == 0) - { - return; - } - - float flRandom = pack.ReadFloat(), flChance = pack.ReadFloat(); - int iPos = pack.ReadCell(); - char sClassname[32]; - pack.ReadString(sClassname, sizeof sClassname); - if ((g_esLeechCache[iTank].g_iLeechHitMode == 0 || g_esLeechCache[iTank].g_iLeechHitMode == 1) && (bIsSpecialInfected(iTank) || StrEqual(sClassname[7], "tank_claw") || StrEqual(sClassname, "tank_rock"))) - { - vLeechHit(iSurvivor, iTank, flRandom, flChance, g_esLeechCache[iTank].g_iLeechHit, MT_MESSAGE_MELEE, MT_ATTACK_CLAW, iPos); - } - else if ((g_esLeechCache[iTank].g_iLeechHitMode == 0 || g_esLeechCache[iTank].g_iLeechHitMode == 2) && StrEqual(sClassname[7], "melee")) - { - vLeechHit(iSurvivor, iTank, flRandom, flChance, g_esLeechCache[iTank].g_iLeechHit, MT_MESSAGE_MELEE, MT_ATTACK_MELEE, iPos); - } -} - -Action tTimerLeech(Handle timer, DataPack pack) -{ - pack.Reset(); - - int iSurvivor = GetClientOfUserId(pack.ReadCell()); - if (!MT_IsCorePluginEnabled() || !bIsSurvivor(iSurvivor)) - { - g_esLeechPlayer[iSurvivor].g_bAffected = false; - g_esLeechPlayer[iSurvivor].g_iOwner = -1; - - return Plugin_Stop; - } - - int iTank = GetClientOfUserId(pack.ReadCell()), iType = pack.ReadCell(), iMessage = pack.ReadCell(); - if (!MT_IsTankSupported(iTank) || bIsPlayerIncapacitated(iTank) || bIsAreaNarrow(iTank, g_esLeechCache[iTank].g_flOpenAreasOnly) || bIsAreaWide(iTank, g_esLeechCache[iTank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esLeechPlayer[iTank].g_iTankType, iTank) || (g_esLeechCache[iTank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esLeechCache[iTank].g_iRequiresHumans) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esLeechAbility[g_esLeechPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esLeechPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esLeechPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || iType != g_esLeechPlayer[iTank].g_iTankType || MT_IsAdminImmune(iSurvivor, iTank) || bIsAdminImmune(iSurvivor, g_esLeechPlayer[iTank].g_iTankType, g_esLeechAbility[g_esLeechPlayer[iTank].g_iTankTypeRecorded].g_iImmunityFlags, g_esLeechPlayer[iSurvivor].g_iImmunityFlags) || !g_esLeechPlayer[iSurvivor].g_bAffected) - { - vLeechReset2(iSurvivor, iTank, iMessage); - - return Plugin_Stop; - } - - int iLeechEnabled = pack.ReadCell(), iPos = pack.ReadCell(), - iDuration = (iPos != -1) ? RoundToNearest(MT_GetCombinationSetting(iTank, 5, iPos)) : g_esLeechCache[iTank].g_iLeechDuration, - iTime = pack.ReadCell(); - if (iLeechEnabled == 0 || (iTime + iDuration) <= GetTime()) - { - vLeechReset2(iSurvivor, iTank, iMessage); - - return Plugin_Stop; - } - - if (!bIsVisibleToPlayer(iSurvivor, iTank, g_esLeechCache[iTank].g_iLeechSight)) - { - return Plugin_Continue; - } - - int iTankHealth = GetEntProp(iTank, Prop_Data, "m_iHealth"), - iMaxHealth = MT_TankMaxHealth(iTank, 1), - iNewHealth = (iTankHealth + 1), - iLeftover = (iNewHealth > MT_MAXHEALTH) ? (iNewHealth - MT_MAXHEALTH) : iNewHealth, - iFinalHealth = iClamp(iNewHealth, 1, MT_MAXHEALTH), - iTotalHealth = (iNewHealth > MT_MAXHEALTH) ? iLeftover : 1; - MT_TankMaxHealth(iTank, 3, (iMaxHealth + iTotalHealth)); - SetEntProp(iTank, Prop_Data, "m_iHealth", iFinalHealth); - vDamagePlayer(iSurvivor, iTank, 1.0, "128"); - vAttachParticle(iSurvivor, PARTICLE_BLOOD, 0.1); - - return Plugin_Continue; -} \ No newline at end of file diff --git a/addons/sourcemod/scripting/mutant_tanks/abilities/mt_lag.sp b/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_lag.sp similarity index 96% rename from addons/sourcemod/scripting/mutant_tanks/abilities/mt_lag.sp rename to addons/sourcemod/scripting/mutant_tanks/abilities2/mt_lag.sp index 638c7e6066..a750d7e73e 100644 --- a/addons/sourcemod/scripting/mutant_tanks/abilities/mt_lag.sp +++ b/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_lag.sp @@ -1,1287 +1,1291 @@ -/** - * Mutant Tanks: a L4D/L4D2 SourceMod Plugin - * Copyright (C) 2024 Alfred "Psyk0tik" Llagas - * - * 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 . - **/ - -#define MT_LAG_COMPILE_METHOD 0 // 0: packaged, 1: standalone - -#if !defined MT_ABILITIES_MAIN - #if MT_LAG_COMPILE_METHOD == 1 - #include - #include - #else - #error This file must be inside "scripting/mutant_tanks/abilities" while compiling "mt_abilities.sp" to include its content. - #endif -public Plugin myinfo = -{ - name = "[MT] Lag Ability", - author = MT_AUTHOR, - description = "The Mutant Tank makes survivors lag.", - version = MT_VERSION, - url = MT_URL -}; - -bool g_bDedicated, g_bLateLoad; - -public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max) -{ - EngineVersion evEngine = GetEngineVersion(); - if (evEngine != Engine_Left4Dead && evEngine != Engine_Left4Dead2) - { - strcopy(error, err_max, "\"[MT] Lag Ability\" only supports Left 4 Dead 1 & 2."); - - return APLRes_SilentFailure; - } - - g_bDedicated = IsDedicatedServer(); - g_bLateLoad = late; - - return APLRes_Success; -} -#else - #if MT_LAG_COMPILE_METHOD == 1 - #error This file must be compiled as a standalone plugin. - #endif -#endif - -#define MT_LAG_SECTION "lagability" -#define MT_LAG_SECTION2 "lag ability" -#define MT_LAG_SECTION3 "lag_ability" -#define MT_LAG_SECTION4 "lag" - -#define MT_MENU_LAG "Lag Ability" - -enum struct esLagPlayer -{ - bool g_bAffected; - bool g_bFailed; - bool g_bNoAmmo; - - float g_flCloseAreasOnly; - float g_flLagChance; - float g_flLagRange; - float g_flLagRangeChance; - float g_flLastPosition[3]; - float g_flOpenAreasOnly; - - int g_iAccessFlags; - int g_iAmmoCount; - int g_iComboAbility; - int g_iCooldown; - int g_iHumanAbility; - int g_iHumanAmmo; - int g_iHumanCooldown; - int g_iHumanRangeCooldown; - int g_iImmunityFlags; - int g_iLagAbility; - int g_iLagCooldown; - int g_iLagDuration; - int g_iLagEffect; - int g_iLagHit; - int g_iLagMessage; - int g_iLagHitMode; - int g_iLagRangeCooldown; - int g_iLagSight; - int g_iOwner; - int g_iRangeCooldown; - int g_iRequiresHumans; - int g_iTankType; - int g_iTankTypeRecorded; -} - -esLagPlayer g_esLagPlayer[MAXPLAYERS + 1]; - -enum struct esLagTeammate -{ - float g_flCloseAreasOnly; - float g_flLagChance; - float g_flLagRange; - float g_flLagRangeChance; - float g_flOpenAreasOnly; - - int g_iComboAbility; - int g_iHumanAbility; - int g_iHumanAmmo; - int g_iHumanCooldown; - int g_iHumanRangeCooldown; - int g_iLagAbility; - int g_iLagCooldown; - int g_iLagDuration; - int g_iLagEffect; - int g_iLagHit; - int g_iLagMessage; - int g_iLagHitMode; - int g_iLagRangeCooldown; - int g_iLagSight; - int g_iRequiresHumans; -} - -esLagTeammate g_esLagTeammate[MAXPLAYERS + 1]; - -enum struct esLagAbility -{ - float g_flCloseAreasOnly; - float g_flLagChance; - float g_flLagRange; - float g_flLagRangeChance; - float g_flOpenAreasOnly; - - int g_iAccessFlags; - int g_iComboAbility; - int g_iHumanAbility; - int g_iHumanAmmo; - int g_iHumanCooldown; - int g_iHumanRangeCooldown; - int g_iImmunityFlags; - int g_iLagAbility; - int g_iLagCooldown; - int g_iLagDuration; - int g_iLagEffect; - int g_iLagHit; - int g_iLagMessage; - int g_iLagHitMode; - int g_iLagRangeCooldown; - int g_iLagSight; - int g_iRequiresHumans; -} - -esLagAbility g_esLagAbility[MT_MAXTYPES + 1]; - -enum struct esLagSpecial -{ - float g_flCloseAreasOnly; - float g_flLagChance; - float g_flLagRange; - float g_flLagRangeChance; - float g_flOpenAreasOnly; - - int g_iComboAbility; - int g_iHumanAbility; - int g_iHumanAmmo; - int g_iHumanCooldown; - int g_iHumanRangeCooldown; - int g_iLagAbility; - int g_iLagCooldown; - int g_iLagDuration; - int g_iLagEffect; - int g_iLagHit; - int g_iLagMessage; - int g_iLagHitMode; - int g_iLagRangeCooldown; - int g_iLagSight; - int g_iRequiresHumans; -} - -esLagSpecial g_esLagSpecial[MT_MAXTYPES + 1]; - -enum struct esLagCache -{ - float g_flCloseAreasOnly; - float g_flLagChance; - float g_flLagRange; - float g_flLagRangeChance; - float g_flOpenAreasOnly; - - int g_iComboAbility; - int g_iHumanAbility; - int g_iHumanAmmo; - int g_iHumanCooldown; - int g_iHumanRangeCooldown; - int g_iLagAbility; - int g_iLagCooldown; - int g_iLagDuration; - int g_iLagEffect; - int g_iLagHit; - int g_iLagMessage; - int g_iLagHitMode; - int g_iLagRangeCooldown; - int g_iLagSight; - int g_iRequiresHumans; -} - -esLagCache g_esLagCache[MAXPLAYERS + 1]; - -#if !defined MT_ABILITIES_MAIN -public void OnPluginStart() -{ - LoadTranslations("common.phrases"); - LoadTranslations("mutant_tanks.phrases"); - LoadTranslations("mutant_tanks_names.phrases"); - - RegConsoleCmd("sm_mt_lag", cmdLagInfo, "View information about the Lag ability."); - - if (g_bLateLoad) - { - for (int iPlayer = 1; iPlayer <= MaxClients; iPlayer++) - { - if (bIsValidClient(iPlayer, MT_CHECK_INGAME)) - { - OnClientPutInServer(iPlayer); - } - } - - g_bLateLoad = false; - } -} -#endif - -#if defined MT_ABILITIES_MAIN -void vLagMapStart() -#else -public void OnMapStart() -#endif -{ - vLagReset(); -} - -#if defined MT_ABILITIES_MAIN -void vLagClientPutInServer(int client) -#else -public void OnClientPutInServer(int client) -#endif -{ - SDKHook(client, SDKHook_OnTakeDamage, OnLagTakeDamage); - vLagReset3(client); -} - -#if defined MT_ABILITIES_MAIN -void vLagClientDisconnect_Post(int client) -#else -public void OnClientDisconnect_Post(int client) -#endif -{ - vLagReset3(client); -} - -#if defined MT_ABILITIES_MAIN -void vLagMapEnd() -#else -public void OnMapEnd() -#endif -{ - vLagReset(); -} - -#if !defined MT_ABILITIES_MAIN -Action cmdLagInfo(int client, int args) -{ - client = iGetListenServerHost(client, g_bDedicated); - - if (!MT_IsCorePluginEnabled()) - { - MT_ReplyToCommand(client, "%s %t", MT_TAG5, "PluginDisabled"); - - return Plugin_Handled; - } - - if (!bIsValidClient(client, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_FAKECLIENT)) - { - MT_ReplyToCommand(client, "%s %t", MT_TAG, "Command is in-game only"); - - return Plugin_Handled; - } - - switch (IsVoteInProgress()) - { - case true: MT_ReplyToCommand(client, "%s %t", MT_TAG2, "Vote in Progress"); - case false: vLagMenu(client, MT_LAG_SECTION4, 0); - } - - return Plugin_Handled; -} -#endif - -void vLagMenu(int client, const char[] name, int item) -{ - if (StrContains(MT_LAG_SECTION4, name, false) == -1) - { - return; - } - - Menu mAbilityMenu = new Menu(iLagMenuHandler, MENU_ACTIONS_DEFAULT|MenuAction_Display|MenuAction_DisplayItem); - mAbilityMenu.SetTitle("Lag Ability Information"); - mAbilityMenu.AddItem("Status", "Status"); - mAbilityMenu.AddItem("Ammunition", "Ammunition"); - mAbilityMenu.AddItem("Buttons", "Buttons"); - mAbilityMenu.AddItem("Cooldown", "Cooldown"); - mAbilityMenu.AddItem("Details", "Details"); - mAbilityMenu.AddItem("Duration", "Duration"); - mAbilityMenu.AddItem("Human Support", "Human Support"); - mAbilityMenu.AddItem("Range Cooldown", "Range Cooldown"); - mAbilityMenu.DisplayAt(client, item, MENU_TIME_FOREVER); -} - -int iLagMenuHandler(Menu menu, MenuAction action, int param1, int param2) -{ - switch (action) - { - case MenuAction_End: delete menu; - case MenuAction_Select: - { - switch (param2) - { - case 0: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esLagCache[param1].g_iLagAbility == 0) ? "AbilityStatus1" : "AbilityStatus2"); - case 1: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityAmmo", (g_esLagCache[param1].g_iHumanAmmo - g_esLagPlayer[param1].g_iAmmoCount), g_esLagCache[param1].g_iHumanAmmo); - case 2: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtons2"); - case 3: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityCooldown", ((g_esLagCache[param1].g_iHumanAbility == 1) ? g_esLagCache[param1].g_iHumanCooldown : g_esLagCache[param1].g_iLagCooldown)); - case 4: MT_PrintToChat(param1, "%s %t", MT_TAG3, "LagDetails"); - case 5: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityDuration2", g_esLagCache[param1].g_iLagDuration); - case 6: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esLagCache[param1].g_iHumanAbility == 0) ? "AbilityHumanSupport1" : "AbilityHumanSupport2"); - case 7: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityRangeCooldown", ((g_esLagCache[param1].g_iHumanAbility == 1) ? g_esLagCache[param1].g_iHumanRangeCooldown : g_esLagCache[param1].g_iLagRangeCooldown)); - } - - if (bIsValidClient(param1, MT_CHECK_INGAME)) - { - vLagMenu(param1, MT_LAG_SECTION4, menu.Selection); - } - } - case MenuAction_Display: - { - char sMenuTitle[PLATFORM_MAX_PATH]; - Panel pLag = view_as(param2); - FormatEx(sMenuTitle, sizeof sMenuTitle, "%T", "LagMenu", param1); - pLag.SetTitle(sMenuTitle); - } - case MenuAction_DisplayItem: - { - if (param2 >= 0) - { - char sMenuOption[PLATFORM_MAX_PATH]; - - switch (param2) - { - case 0: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Status", param1); - case 1: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Ammunition", param1); - case 2: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Buttons", param1); - case 3: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Cooldown", param1); - case 4: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Details", param1); - case 5: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Duration", param1); - case 6: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "HumanSupport", param1); - case 7: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "RangeCooldown", param1); - } - - return RedrawMenuItem(sMenuOption); - } - } - } - - return 0; -} - -#if defined MT_ABILITIES_MAIN -void vLagDisplayMenu(Menu menu) -#else -public void MT_OnDisplayMenu(Menu menu) -#endif -{ - menu.AddItem(MT_MENU_LAG, MT_MENU_LAG); -} - -#if defined MT_ABILITIES_MAIN -void vLagMenuItemSelected(int client, const char[] info) -#else -public void MT_OnMenuItemSelected(int client, const char[] info) -#endif -{ - if (StrEqual(info, MT_MENU_LAG, false)) - { - vLagMenu(client, MT_LAG_SECTION4, 0); - } -} - -#if defined MT_ABILITIES_MAIN -void vLagMenuItemDisplayed(int client, const char[] info, char[] buffer, int size) -#else -public void MT_OnMenuItemDisplayed(int client, const char[] info, char[] buffer, int size) -#endif -{ - if (StrEqual(info, MT_MENU_LAG, false)) - { - FormatEx(buffer, size, "%T", "LagMenu2", client); - } -} - -Action OnLagTakeDamage(int victim, int &attacker, int &inflictor, float &damage, int &damagetype) -{ - if (MT_IsCorePluginEnabled() && bIsValidClient(victim, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_ALIVE) && damage > 0.0) - { - char sClassname[32]; - if (bIsValidEntity(inflictor)) - { - GetEntityClassname(inflictor, sClassname, sizeof sClassname); - } - - if (MT_IsTankSupported(attacker) && MT_IsCustomTankSupported(attacker) && (g_esLagCache[attacker].g_iLagHitMode == 0 || g_esLagCache[attacker].g_iLagHitMode == 1) && bIsSurvivor(victim) && g_esLagCache[attacker].g_iComboAbility == 0) - { - if ((!MT_HasAdminAccess(attacker) && !bHasAdminAccess(attacker, g_esLagAbility[g_esLagPlayer[attacker].g_iTankTypeRecorded].g_iAccessFlags, g_esLagPlayer[attacker].g_iAccessFlags)) || MT_IsAdminImmune(victim, attacker) || bIsAdminImmune(victim, g_esLagPlayer[attacker].g_iTankType, g_esLagAbility[g_esLagPlayer[attacker].g_iTankTypeRecorded].g_iImmunityFlags, g_esLagPlayer[victim].g_iImmunityFlags)) - { - return Plugin_Continue; - } - - bool bCaught = bIsSurvivorCaught(victim); - if ((bIsSpecialInfected(attacker) && (bCaught || (!bCaught && (damagetype & DMG_CLUB)) || (bIsSpitter(attacker) && StrEqual(sClassname, "insect_swarm")))) || StrEqual(sClassname[7], "tank_claw") || StrEqual(sClassname, "tank_rock")) - { - vLagHit(victim, attacker, GetRandomFloat(0.1, 100.0), g_esLagCache[attacker].g_flLagChance, g_esLagCache[attacker].g_iLagHit, MT_MESSAGE_MELEE, MT_ATTACK_CLAW); - } - } - else if (MT_IsTankSupported(victim) && MT_IsCustomTankSupported(victim) && (g_esLagCache[victim].g_iLagHitMode == 0 || g_esLagCache[victim].g_iLagHitMode == 2) && bIsSurvivor(attacker) && g_esLagCache[victim].g_iComboAbility == 0) - { - if ((!MT_HasAdminAccess(victim) && !bHasAdminAccess(victim, g_esLagAbility[g_esLagPlayer[victim].g_iTankTypeRecorded].g_iAccessFlags, g_esLagPlayer[victim].g_iAccessFlags)) || MT_IsAdminImmune(attacker, victim) || bIsAdminImmune(attacker, g_esLagPlayer[victim].g_iTankType, g_esLagAbility[g_esLagPlayer[victim].g_iTankTypeRecorded].g_iImmunityFlags, g_esLagPlayer[attacker].g_iImmunityFlags)) - { - return Plugin_Continue; - } - - if (StrEqual(sClassname[7], "melee")) - { - vLagHit(attacker, victim, GetRandomFloat(0.1, 100.0), g_esLagCache[victim].g_flLagChance, g_esLagCache[victim].g_iLagHit, MT_MESSAGE_MELEE, MT_ATTACK_MELEE); - } - } - } - - return Plugin_Continue; -} - -#if defined MT_ABILITIES_MAIN -void vLagPluginCheck(ArrayList list) -#else -public void MT_OnPluginCheck(ArrayList list) -#endif -{ - list.PushString(MT_MENU_LAG); -} - -#if defined MT_ABILITIES_MAIN -void vLagAbilityCheck(ArrayList list, ArrayList list2, ArrayList list3, ArrayList list4) -#else -public void MT_OnAbilityCheck(ArrayList list, ArrayList list2, ArrayList list3, ArrayList list4) -#endif -{ - list.PushString(MT_LAG_SECTION); - list2.PushString(MT_LAG_SECTION2); - list3.PushString(MT_LAG_SECTION3); - list4.PushString(MT_LAG_SECTION4); -} - -#if defined MT_ABILITIES_MAIN -void vLagCombineAbilities(int tank, int type, const float random, const char[] combo, int survivor, const char[] classname) -#else -public void MT_OnCombineAbilities(int tank, int type, const float random, const char[] combo, int survivor, int weapon, const char[] classname) -#endif -{ - if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esLagCache[tank].g_iHumanAbility != 2) - { - return; - } - - char sCombo[320], sSet[4][32]; - FormatEx(sCombo, sizeof sCombo, ",%s,", combo); - FormatEx(sSet[0], sizeof sSet[], ",%s,", MT_LAG_SECTION); - FormatEx(sSet[1], sizeof sSet[], ",%s,", MT_LAG_SECTION2); - FormatEx(sSet[2], sizeof sSet[], ",%s,", MT_LAG_SECTION3); - FormatEx(sSet[3], sizeof sSet[], ",%s,", MT_LAG_SECTION4); - if (g_esLagCache[tank].g_iComboAbility == 1 && (StrContains(sCombo, sSet[0], false) != -1 || StrContains(sCombo, sSet[1], false) != -1 || StrContains(sCombo, sSet[2], false) != -1 || StrContains(sCombo, sSet[3], false) != -1)) - { - char sAbilities[320], sSubset[10][32]; - strcopy(sAbilities, sizeof sAbilities, combo); - ExplodeString(sAbilities, ",", sSubset, sizeof sSubset, sizeof sSubset[]); - - float flChance = 0.0, flDelay = 0.0; - for (int iPos = 0; iPos < (sizeof sSubset); iPos++) - { - if (StrEqual(sSubset[iPos], MT_LAG_SECTION, false) || StrEqual(sSubset[iPos], MT_LAG_SECTION2, false) || StrEqual(sSubset[iPos], MT_LAG_SECTION3, false) || StrEqual(sSubset[iPos], MT_LAG_SECTION4, false)) - { - flDelay = MT_GetCombinationSetting(tank, 4, iPos); - - switch (type) - { - case MT_COMBO_MAINRANGE: - { - if (g_esLagCache[tank].g_iLagAbility == 1) - { - switch (flDelay) - { - case 0.0: vLagAbility(tank, random, iPos); - default: - { - DataPack dpCombo; - CreateDataTimer(flDelay, tTimerLagCombo, dpCombo, TIMER_FLAG_NO_MAPCHANGE); - dpCombo.WriteCell(GetClientUserId(tank)); - dpCombo.WriteFloat(random); - dpCombo.WriteCell(iPos); - } - } - } - } - case MT_COMBO_MELEEHIT: - { - flChance = MT_GetCombinationSetting(tank, 1, iPos); - - switch (flDelay) - { - case 0.0: - { - if ((g_esLagCache[tank].g_iLagHitMode == 0 || g_esLagCache[tank].g_iLagHitMode == 1) && (StrEqual(classname[7], "tank_claw") || StrEqual(classname, "tank_rock"))) - { - vLagHit(survivor, tank, random, flChance, g_esLagCache[tank].g_iLagHit, MT_MESSAGE_MELEE, MT_ATTACK_CLAW, iPos); - } - else if ((g_esLagCache[tank].g_iLagHitMode == 0 || g_esLagCache[tank].g_iLagHitMode == 2) && StrEqual(classname[7], "melee")) - { - vLagHit(survivor, tank, random, flChance, g_esLagCache[tank].g_iLagHit, MT_MESSAGE_MELEE, MT_ATTACK_MELEE, iPos); - } - } - default: - { - DataPack dpCombo; - CreateDataTimer(flDelay, tTimerLagCombo2, dpCombo, TIMER_FLAG_NO_MAPCHANGE); - dpCombo.WriteCell(GetClientUserId(survivor)); - dpCombo.WriteCell(GetClientUserId(tank)); - dpCombo.WriteFloat(random); - dpCombo.WriteFloat(flChance); - dpCombo.WriteCell(iPos); - dpCombo.WriteString(classname); - } - } - } - } - - break; - } - } - } -} - -#if defined MT_ABILITIES_MAIN -void vLagConfigsLoad(int mode) -#else -public void MT_OnConfigsLoad(int mode) -#endif -{ - switch (mode) - { - case 1: - { - for (int iIndex = MT_GetMinType(); iIndex <= MT_GetMaxType(); iIndex++) - { - g_esLagAbility[iIndex].g_iAccessFlags = 0; - g_esLagAbility[iIndex].g_iImmunityFlags = 0; - g_esLagAbility[iIndex].g_flCloseAreasOnly = 0.0; - g_esLagAbility[iIndex].g_iComboAbility = 0; - g_esLagAbility[iIndex].g_iHumanAbility = 0; - g_esLagAbility[iIndex].g_iHumanAmmo = 5; - g_esLagAbility[iIndex].g_iHumanCooldown = 0; - g_esLagAbility[iIndex].g_iHumanRangeCooldown = 0; - g_esLagAbility[iIndex].g_flOpenAreasOnly = 0.0; - g_esLagAbility[iIndex].g_iRequiresHumans = 1; - g_esLagAbility[iIndex].g_iLagAbility = 0; - g_esLagAbility[iIndex].g_iLagEffect = 0; - g_esLagAbility[iIndex].g_iLagMessage = 0; - g_esLagAbility[iIndex].g_flLagChance = 33.3; - g_esLagAbility[iIndex].g_iLagCooldown = 0; - g_esLagAbility[iIndex].g_iLagDuration = 5; - g_esLagAbility[iIndex].g_iLagHit = 0; - g_esLagAbility[iIndex].g_iLagHitMode = 0; - g_esLagAbility[iIndex].g_flLagRange = 150.0; - g_esLagAbility[iIndex].g_flLagRangeChance = 15.0; - g_esLagAbility[iIndex].g_iLagRangeCooldown = 0; - g_esLagAbility[iIndex].g_iLagSight = 0; - - g_esLagSpecial[iIndex].g_flCloseAreasOnly = -1.0; - g_esLagSpecial[iIndex].g_iComboAbility = -1; - g_esLagSpecial[iIndex].g_iHumanAbility = -1; - g_esLagSpecial[iIndex].g_iHumanAmmo = -1; - g_esLagSpecial[iIndex].g_iHumanCooldown = -1; - g_esLagSpecial[iIndex].g_iHumanRangeCooldown = -1; - g_esLagSpecial[iIndex].g_flOpenAreasOnly = -1.0; - g_esLagSpecial[iIndex].g_iRequiresHumans = -1; - g_esLagSpecial[iIndex].g_iLagAbility = -1; - g_esLagSpecial[iIndex].g_iLagEffect = -1; - g_esLagSpecial[iIndex].g_iLagMessage = -1; - g_esLagSpecial[iIndex].g_flLagChance = -1.0; - g_esLagSpecial[iIndex].g_iLagCooldown = -1; - g_esLagSpecial[iIndex].g_iLagDuration = -1; - g_esLagSpecial[iIndex].g_iLagHit = -1; - g_esLagSpecial[iIndex].g_iLagHitMode = -1; - g_esLagSpecial[iIndex].g_flLagRange = -1.0; - g_esLagSpecial[iIndex].g_flLagRangeChance = -1.0; - g_esLagSpecial[iIndex].g_iLagRangeCooldown = -1; - g_esLagSpecial[iIndex].g_iLagSight = -1; - } - } - case 3: - { - for (int iPlayer = 1; iPlayer <= MaxClients; iPlayer++) - { - g_esLagPlayer[iPlayer].g_iAccessFlags = -1; - g_esLagPlayer[iPlayer].g_iImmunityFlags = -1; - g_esLagPlayer[iPlayer].g_flCloseAreasOnly = -1.0; - g_esLagPlayer[iPlayer].g_iComboAbility = -1; - g_esLagPlayer[iPlayer].g_iHumanAbility = -1; - g_esLagPlayer[iPlayer].g_iHumanAmmo = -1; - g_esLagPlayer[iPlayer].g_iHumanCooldown = -1; - g_esLagPlayer[iPlayer].g_iHumanRangeCooldown = -1; - g_esLagPlayer[iPlayer].g_flOpenAreasOnly = -1.0; - g_esLagPlayer[iPlayer].g_iRequiresHumans = -1; - g_esLagPlayer[iPlayer].g_iLagAbility = -1; - g_esLagPlayer[iPlayer].g_iLagEffect = -1; - g_esLagPlayer[iPlayer].g_iLagMessage = -1; - g_esLagPlayer[iPlayer].g_flLagChance = -1.0; - g_esLagPlayer[iPlayer].g_iLagCooldown = -1; - g_esLagPlayer[iPlayer].g_iLagDuration = -1; - g_esLagPlayer[iPlayer].g_iLagHit = -1; - g_esLagPlayer[iPlayer].g_iLagHitMode = -1; - g_esLagPlayer[iPlayer].g_flLagRange = -1.0; - g_esLagPlayer[iPlayer].g_flLagRangeChance = -1.0; - g_esLagPlayer[iPlayer].g_iLagRangeCooldown = -1; - g_esLagPlayer[iPlayer].g_iLagSight = -1; - - g_esLagTeammate[iPlayer].g_flCloseAreasOnly = -1.0; - g_esLagTeammate[iPlayer].g_iComboAbility = -1; - g_esLagTeammate[iPlayer].g_iHumanAbility = -1; - g_esLagTeammate[iPlayer].g_iHumanAmmo = -1; - g_esLagTeammate[iPlayer].g_iHumanCooldown = -1; - g_esLagTeammate[iPlayer].g_iHumanRangeCooldown = -1; - g_esLagTeammate[iPlayer].g_flOpenAreasOnly = -1.0; - g_esLagTeammate[iPlayer].g_iRequiresHumans = -1; - g_esLagTeammate[iPlayer].g_iLagAbility = -1; - g_esLagTeammate[iPlayer].g_iLagEffect = -1; - g_esLagTeammate[iPlayer].g_iLagMessage = -1; - g_esLagTeammate[iPlayer].g_flLagChance = -1.0; - g_esLagTeammate[iPlayer].g_iLagCooldown = -1; - g_esLagTeammate[iPlayer].g_iLagDuration = -1; - g_esLagTeammate[iPlayer].g_iLagHit = -1; - g_esLagTeammate[iPlayer].g_iLagHitMode = -1; - g_esLagTeammate[iPlayer].g_flLagRange = -1.0; - g_esLagTeammate[iPlayer].g_flLagRangeChance = -1.0; - g_esLagTeammate[iPlayer].g_iLagRangeCooldown = -1; - g_esLagTeammate[iPlayer].g_iLagSight = -1; - } - } - } -} - -#if defined MT_ABILITIES_MAIN -void vLagConfigsLoaded(const char[] subsection, const char[] key, const char[] value, int type, int admin, int mode, bool special, const char[] specsection) -#else -public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const char[] value, int type, int admin, int mode, bool special, const char[] specsection) -#endif -{ - if ((mode == -1 || mode == 3) && bIsValidClient(admin)) - { - if (special && specsection[0] != '\0') - { - g_esLagTeammate[admin].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esLagTeammate[admin].g_flCloseAreasOnly, value, -1.0, 99999.0); - g_esLagTeammate[admin].g_iComboAbility = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "ComboAbility", "Combo Ability", "Combo_Ability", "combo", g_esLagTeammate[admin].g_iComboAbility, value, -1, 1); - g_esLagTeammate[admin].g_iHumanAbility = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esLagTeammate[admin].g_iHumanAbility, value, -1, 2); - g_esLagTeammate[admin].g_iHumanAmmo = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esLagTeammate[admin].g_iHumanAmmo, value, -1, 99999); - g_esLagTeammate[admin].g_iHumanCooldown = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esLagTeammate[admin].g_iHumanCooldown, value, -1, 99999); - g_esLagTeammate[admin].g_iHumanRangeCooldown = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "HumanRangeCooldown", "Human Range Cooldown", "Human_Range_Cooldown", "hrangecooldown", g_esLagTeammate[admin].g_iHumanRangeCooldown, value, -1, 99999); - g_esLagTeammate[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esLagTeammate[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); - g_esLagTeammate[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esLagTeammate[admin].g_iRequiresHumans, value, -1, 32); - g_esLagTeammate[admin].g_iLagAbility = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esLagTeammate[admin].g_iLagAbility, value, -1, 1); - g_esLagTeammate[admin].g_iLagEffect = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "AbilityEffect", "Ability Effect", "Ability_Effect", "effect", g_esLagTeammate[admin].g_iLagEffect, value, -1, 7); - g_esLagTeammate[admin].g_iLagMessage = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esLagTeammate[admin].g_iLagMessage, value, -1, 3); - g_esLagTeammate[admin].g_iLagSight = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "AbilitySight", "Ability Sight", "Ability_Sight", "sight", g_esLagTeammate[admin].g_iLagSight, value, -1, 5); - g_esLagTeammate[admin].g_flLagChance = flGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "LagChance", "Lag Chance", "Lag_Chance", "chance", g_esLagTeammate[admin].g_flLagChance, value, -1.0, 100.0); - g_esLagTeammate[admin].g_iLagCooldown = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "LagCooldown", "Lag Cooldown", "Lag_Cooldown", "cooldown", g_esLagTeammate[admin].g_iLagCooldown, value, -1, 99999); - g_esLagTeammate[admin].g_iLagDuration = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "LagDuration", "Lag Duration", "Lag_Duration", "duration", g_esLagTeammate[admin].g_iLagDuration, value, -1, 99999); - g_esLagTeammate[admin].g_iLagHit = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "LagHit", "Lag Hit", "Lag_Hit", "hit", g_esLagTeammate[admin].g_iLagHit, value, -1, 1); - g_esLagTeammate[admin].g_iLagHitMode = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "LagHitMode", "Lag Hit Mode", "Lag_Hit_Mode", "hitmode", g_esLagTeammate[admin].g_iLagHitMode, value, -1, 2); - g_esLagTeammate[admin].g_flLagRange = flGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "LagRange", "Lag Range", "Lag_Range", "range", g_esLagTeammate[admin].g_flLagRange, value, -1.0, 99999.0); - g_esLagTeammate[admin].g_flLagRangeChance = flGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "LagRangeChance", "Lag Range Chance", "Lag_Range_Chance", "rangechance", g_esLagTeammate[admin].g_flLagRangeChance, value, -1.0, 100.0); - g_esLagTeammate[admin].g_iLagRangeCooldown = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "LagRangeCooldown", "Lag Range Cooldown", "Lag_Range_Cooldown", "rangecooldown", g_esLagTeammate[admin].g_iLagRangeCooldown, value, -1, 99999); - } - else - { - g_esLagPlayer[admin].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esLagPlayer[admin].g_flCloseAreasOnly, value, -1.0, 99999.0); - g_esLagPlayer[admin].g_iComboAbility = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "ComboAbility", "Combo Ability", "Combo_Ability", "combo", g_esLagPlayer[admin].g_iComboAbility, value, -1, 1); - g_esLagPlayer[admin].g_iHumanAbility = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esLagPlayer[admin].g_iHumanAbility, value, -1, 2); - g_esLagPlayer[admin].g_iHumanAmmo = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esLagPlayer[admin].g_iHumanAmmo, value, -1, 99999); - g_esLagPlayer[admin].g_iHumanCooldown = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esLagPlayer[admin].g_iHumanCooldown, value, -1, 99999); - g_esLagPlayer[admin].g_iHumanRangeCooldown = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "HumanRangeCooldown", "Human Range Cooldown", "Human_Range_Cooldown", "hrangecooldown", g_esLagPlayer[admin].g_iHumanRangeCooldown, value, -1, 99999); - g_esLagPlayer[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esLagPlayer[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); - g_esLagPlayer[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esLagPlayer[admin].g_iRequiresHumans, value, -1, 32); - g_esLagPlayer[admin].g_iLagAbility = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esLagPlayer[admin].g_iLagAbility, value, -1, 1); - g_esLagPlayer[admin].g_iLagEffect = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "AbilityEffect", "Ability Effect", "Ability_Effect", "effect", g_esLagPlayer[admin].g_iLagEffect, value, -1, 7); - g_esLagPlayer[admin].g_iLagMessage = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esLagPlayer[admin].g_iLagMessage, value, -1, 3); - g_esLagPlayer[admin].g_iLagSight = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "AbilitySight", "Ability Sight", "Ability_Sight", "sight", g_esLagPlayer[admin].g_iLagSight, value, -1, 5); - g_esLagPlayer[admin].g_flLagChance = flGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "LagChance", "Lag Chance", "Lag_Chance", "chance", g_esLagPlayer[admin].g_flLagChance, value, -1.0, 100.0); - g_esLagPlayer[admin].g_iLagCooldown = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "LagCooldown", "Lag Cooldown", "Lag_Cooldown", "cooldown", g_esLagPlayer[admin].g_iLagCooldown, value, -1, 99999); - g_esLagPlayer[admin].g_iLagDuration = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "LagDuration", "Lag Duration", "Lag_Duration", "duration", g_esLagPlayer[admin].g_iLagDuration, value, -1, 99999); - g_esLagPlayer[admin].g_iLagHit = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "LagHit", "Lag Hit", "Lag_Hit", "hit", g_esLagPlayer[admin].g_iLagHit, value, -1, 1); - g_esLagPlayer[admin].g_iLagHitMode = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "LagHitMode", "Lag Hit Mode", "Lag_Hit_Mode", "hitmode", g_esLagPlayer[admin].g_iLagHitMode, value, -1, 2); - g_esLagPlayer[admin].g_flLagRange = flGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "LagRange", "Lag Range", "Lag_Range", "range", g_esLagPlayer[admin].g_flLagRange, value, -1.0, 99999.0); - g_esLagPlayer[admin].g_flLagRangeChance = flGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "LagRangeChance", "Lag Range Chance", "Lag_Range_Chance", "rangechance", g_esLagPlayer[admin].g_flLagRangeChance, value, -1.0, 100.0); - g_esLagPlayer[admin].g_iLagRangeCooldown = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "LagRangeCooldown", "Lag Range Cooldown", "Lag_Range_Cooldown", "rangecooldown", g_esLagPlayer[admin].g_iLagRangeCooldown, value, -1, 99999); - g_esLagPlayer[admin].g_iAccessFlags = iGetAdminFlagsValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "AccessFlags", "Access Flags", "Access_Flags", "access", value); - g_esLagPlayer[admin].g_iImmunityFlags = iGetAdminFlagsValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "ImmunityFlags", "Immunity Flags", "Immunity_Flags", "immunity", value); - } - } - - if (mode < 3 && type > 0) - { - if (special && specsection[0] != '\0') - { - g_esLagSpecial[type].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esLagSpecial[type].g_flCloseAreasOnly, value, -1.0, 99999.0); - g_esLagSpecial[type].g_iComboAbility = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "ComboAbility", "Combo Ability", "Combo_Ability", "combo", g_esLagSpecial[type].g_iComboAbility, value, -1, 1); - g_esLagSpecial[type].g_iHumanAbility = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esLagSpecial[type].g_iHumanAbility, value, -1, 2); - g_esLagSpecial[type].g_iHumanAmmo = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esLagSpecial[type].g_iHumanAmmo, value, -1, 99999); - g_esLagSpecial[type].g_iHumanCooldown = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esLagSpecial[type].g_iHumanCooldown, value, -1, 99999); - g_esLagSpecial[type].g_iHumanRangeCooldown = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "HumanRangeCooldown", "Human Range Cooldown", "Human_Range_Cooldown", "hrangecooldown", g_esLagSpecial[type].g_iHumanRangeCooldown, value, -1, 99999); - g_esLagSpecial[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esLagSpecial[type].g_flOpenAreasOnly, value, -1.0, 99999.0); - g_esLagSpecial[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esLagSpecial[type].g_iRequiresHumans, value, -1, 32); - g_esLagSpecial[type].g_iLagAbility = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esLagSpecial[type].g_iLagAbility, value, -1, 1); - g_esLagSpecial[type].g_iLagEffect = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "AbilityEffect", "Ability Effect", "Ability_Effect", "effect", g_esLagSpecial[type].g_iLagEffect, value, -1, 7); - g_esLagSpecial[type].g_iLagMessage = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esLagSpecial[type].g_iLagMessage, value, -1, 3); - g_esLagSpecial[type].g_iLagSight = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "AbilitySight", "Ability Sight", "Ability_Sight", "sight", g_esLagSpecial[type].g_iLagSight, value, -1, 5); - g_esLagSpecial[type].g_flLagChance = flGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "LagChance", "Lag Chance", "Lag_Chance", "chance", g_esLagSpecial[type].g_flLagChance, value, -1.0, 100.0); - g_esLagSpecial[type].g_iLagCooldown = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "LagCooldown", "Lag Cooldown", "Lag_Cooldown", "cooldown", g_esLagSpecial[type].g_iLagCooldown, value, -1, 99999); - g_esLagSpecial[type].g_iLagDuration = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "LagDuration", "Lag Duration", "Lag_Duration", "duration", g_esLagSpecial[type].g_iLagDuration, value, -1, 99999); - g_esLagSpecial[type].g_iLagHit = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "LagHit", "Lag Hit", "Lag_Hit", "hit", g_esLagSpecial[type].g_iLagHit, value, -1, 1); - g_esLagSpecial[type].g_iLagHitMode = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "LagHitMode", "Lag Hit Mode", "Lag_Hit_Mode", "hitmode", g_esLagSpecial[type].g_iLagHitMode, value, -1, 2); - g_esLagSpecial[type].g_flLagRange = flGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "LagRange", "Lag Range", "Lag_Range", "range", g_esLagSpecial[type].g_flLagRange, value, -1.0, 99999.0); - g_esLagSpecial[type].g_flLagRangeChance = flGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "LagRangeChance", "Lag Range Chance", "Lag_Range_Chance", "rangechance", g_esLagSpecial[type].g_flLagRangeChance, value, -1.0, 100.0); - g_esLagSpecial[type].g_iLagRangeCooldown = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "LagRangeCooldown", "Lag Range Cooldown", "Lag_Range_Cooldown", "rangecooldown", g_esLagSpecial[type].g_iLagRangeCooldown, value, -1, 99999); - } - else - { - g_esLagAbility[type].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esLagAbility[type].g_flCloseAreasOnly, value, -1.0, 99999.0); - g_esLagAbility[type].g_iComboAbility = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "ComboAbility", "Combo Ability", "Combo_Ability", "combo", g_esLagAbility[type].g_iComboAbility, value, -1, 1); - g_esLagAbility[type].g_iHumanAbility = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esLagAbility[type].g_iHumanAbility, value, -1, 2); - g_esLagAbility[type].g_iHumanAmmo = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esLagAbility[type].g_iHumanAmmo, value, -1, 99999); - g_esLagAbility[type].g_iHumanCooldown = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esLagAbility[type].g_iHumanCooldown, value, -1, 99999); - g_esLagAbility[type].g_iHumanRangeCooldown = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "HumanRangeCooldown", "Human Range Cooldown", "Human_Range_Cooldown", "hrangecooldown", g_esLagAbility[type].g_iHumanRangeCooldown, value, -1, 99999); - g_esLagAbility[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esLagAbility[type].g_flOpenAreasOnly, value, -1.0, 99999.0); - g_esLagAbility[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esLagAbility[type].g_iRequiresHumans, value, -1, 32); - g_esLagAbility[type].g_iLagAbility = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esLagAbility[type].g_iLagAbility, value, -1, 1); - g_esLagAbility[type].g_iLagEffect = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "AbilityEffect", "Ability Effect", "Ability_Effect", "effect", g_esLagAbility[type].g_iLagEffect, value, -1, 7); - g_esLagAbility[type].g_iLagMessage = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esLagAbility[type].g_iLagMessage, value, -1, 3); - g_esLagAbility[type].g_iLagSight = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "AbilitySight", "Ability Sight", "Ability_Sight", "sight", g_esLagAbility[type].g_iLagSight, value, -1, 5); - g_esLagAbility[type].g_flLagChance = flGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "LagChance", "Lag Chance", "Lag_Chance", "chance", g_esLagAbility[type].g_flLagChance, value, -1.0, 100.0); - g_esLagAbility[type].g_iLagCooldown = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "LagCooldown", "Lag Cooldown", "Lag_Cooldown", "cooldown", g_esLagAbility[type].g_iLagCooldown, value, -1, 99999); - g_esLagAbility[type].g_iLagDuration = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "LagDuration", "Lag Duration", "Lag_Duration", "duration", g_esLagAbility[type].g_iLagDuration, value, -1, 99999); - g_esLagAbility[type].g_iLagHit = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "LagHit", "Lag Hit", "Lag_Hit", "hit", g_esLagAbility[type].g_iLagHit, value, -1, 1); - g_esLagAbility[type].g_iLagHitMode = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "LagHitMode", "Lag Hit Mode", "Lag_Hit_Mode", "hitmode", g_esLagAbility[type].g_iLagHitMode, value, -1, 2); - g_esLagAbility[type].g_flLagRange = flGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "LagRange", "Lag Range", "Lag_Range", "range", g_esLagAbility[type].g_flLagRange, value, -1.0, 99999.0); - g_esLagAbility[type].g_flLagRangeChance = flGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "LagRangeChance", "Lag Range Chance", "Lag_Range_Chance", "rangechance", g_esLagAbility[type].g_flLagRangeChance, value, -1.0, 100.0); - g_esLagAbility[type].g_iLagRangeCooldown = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "LagRangeCooldown", "Lag Range Cooldown", "Lag_Range_Cooldown", "rangecooldown", g_esLagAbility[type].g_iLagRangeCooldown, value, -1, 99999); - g_esLagAbility[type].g_iAccessFlags = iGetAdminFlagsValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "AccessFlags", "Access Flags", "Access_Flags", "access", value); - g_esLagAbility[type].g_iImmunityFlags = iGetAdminFlagsValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "ImmunityFlags", "Immunity Flags", "Immunity_Flags", "immunity", value); - } - } -} - -#if defined MT_ABILITIES_MAIN -void vLagSettingsCached(int tank, bool apply, int type) -#else -public void MT_OnSettingsCached(int tank, bool apply, int type) -#endif -{ - bool bHuman = bIsValidClient(tank, MT_CHECK_FAKECLIENT); - g_esLagPlayer[tank].g_iTankTypeRecorded = apply ? MT_GetRecordedTankType(tank, type) : 0; - g_esLagPlayer[tank].g_iTankType = apply ? type : 0; - int iType = g_esLagPlayer[tank].g_iTankTypeRecorded; - - if (bIsSpecialInfected(tank, MT_CHECK_INDEX|MT_CHECK_INGAME)) - { - g_esLagCache[tank].g_flCloseAreasOnly = flGetSubSettingValue(apply, bHuman, g_esLagTeammate[tank].g_flCloseAreasOnly, g_esLagPlayer[tank].g_flCloseAreasOnly, g_esLagSpecial[iType].g_flCloseAreasOnly, g_esLagAbility[iType].g_flCloseAreasOnly, 1); - g_esLagCache[tank].g_iComboAbility = iGetSubSettingValue(apply, bHuman, g_esLagTeammate[tank].g_iComboAbility, g_esLagPlayer[tank].g_iComboAbility, g_esLagSpecial[iType].g_iComboAbility, g_esLagAbility[iType].g_iComboAbility, 1); - g_esLagCache[tank].g_flLagChance = flGetSubSettingValue(apply, bHuman, g_esLagTeammate[tank].g_flLagChance, g_esLagPlayer[tank].g_flLagChance, g_esLagSpecial[iType].g_flLagChance, g_esLagAbility[iType].g_flLagChance, 1); - g_esLagCache[tank].g_flLagRange = flGetSubSettingValue(apply, bHuman, g_esLagTeammate[tank].g_flLagRange, g_esLagPlayer[tank].g_flLagRange, g_esLagSpecial[iType].g_flLagRange, g_esLagAbility[iType].g_flLagRange, 1); - g_esLagCache[tank].g_flLagRangeChance = flGetSubSettingValue(apply, bHuman, g_esLagTeammate[tank].g_flLagRangeChance, g_esLagPlayer[tank].g_flLagRangeChance, g_esLagSpecial[iType].g_flLagRangeChance, g_esLagAbility[iType].g_flLagRangeChance, 1); - g_esLagCache[tank].g_iHumanAbility = iGetSubSettingValue(apply, bHuman, g_esLagTeammate[tank].g_iHumanAbility, g_esLagPlayer[tank].g_iHumanAbility, g_esLagSpecial[iType].g_iHumanAbility, g_esLagAbility[iType].g_iHumanAbility, 1); - g_esLagCache[tank].g_iHumanAmmo = iGetSubSettingValue(apply, bHuman, g_esLagTeammate[tank].g_iHumanAmmo, g_esLagPlayer[tank].g_iHumanAmmo, g_esLagSpecial[iType].g_iHumanAmmo, g_esLagAbility[iType].g_iHumanAmmo, 1); - g_esLagCache[tank].g_iHumanCooldown = iGetSubSettingValue(apply, bHuman, g_esLagTeammate[tank].g_iHumanCooldown, g_esLagPlayer[tank].g_iHumanCooldown, g_esLagSpecial[iType].g_iHumanCooldown, g_esLagAbility[iType].g_iHumanCooldown, 1); - g_esLagCache[tank].g_iHumanRangeCooldown = iGetSubSettingValue(apply, bHuman, g_esLagTeammate[tank].g_iHumanRangeCooldown, g_esLagPlayer[tank].g_iHumanRangeCooldown, g_esLagSpecial[iType].g_iHumanRangeCooldown, g_esLagAbility[iType].g_iHumanRangeCooldown, 1); - g_esLagCache[tank].g_iLagAbility = iGetSubSettingValue(apply, bHuman, g_esLagTeammate[tank].g_iLagAbility, g_esLagPlayer[tank].g_iLagAbility, g_esLagSpecial[iType].g_iLagAbility, g_esLagAbility[iType].g_iLagAbility, 1); - g_esLagCache[tank].g_iLagCooldown = iGetSubSettingValue(apply, bHuman, g_esLagTeammate[tank].g_iLagCooldown, g_esLagPlayer[tank].g_iLagCooldown, g_esLagSpecial[iType].g_iLagCooldown, g_esLagAbility[iType].g_iLagCooldown, 1); - g_esLagCache[tank].g_iLagDuration = iGetSubSettingValue(apply, bHuman, g_esLagTeammate[tank].g_iLagDuration, g_esLagPlayer[tank].g_iLagDuration, g_esLagSpecial[iType].g_iLagDuration, g_esLagAbility[iType].g_iLagDuration, 1); - g_esLagCache[tank].g_iLagEffect = iGetSubSettingValue(apply, bHuman, g_esLagTeammate[tank].g_iLagEffect, g_esLagPlayer[tank].g_iLagEffect, g_esLagSpecial[iType].g_iLagEffect, g_esLagAbility[iType].g_iLagEffect, 1); - g_esLagCache[tank].g_iLagHit = iGetSubSettingValue(apply, bHuman, g_esLagTeammate[tank].g_iLagHit, g_esLagPlayer[tank].g_iLagHit, g_esLagSpecial[iType].g_iLagHit, g_esLagAbility[iType].g_iLagHit, 1); - g_esLagCache[tank].g_iLagMessage = iGetSubSettingValue(apply, bHuman, g_esLagTeammate[tank].g_iLagMessage, g_esLagPlayer[tank].g_iLagMessage, g_esLagSpecial[iType].g_iLagMessage, g_esLagAbility[iType].g_iLagMessage, 1); - g_esLagCache[tank].g_iLagHitMode = iGetSubSettingValue(apply, bHuman, g_esLagTeammate[tank].g_iLagHitMode, g_esLagPlayer[tank].g_iLagHitMode, g_esLagSpecial[iType].g_iLagHitMode, g_esLagAbility[iType].g_iLagHitMode, 1); - g_esLagCache[tank].g_iLagRangeCooldown = iGetSubSettingValue(apply, bHuman, g_esLagTeammate[tank].g_iLagRangeCooldown, g_esLagPlayer[tank].g_iLagRangeCooldown, g_esLagSpecial[iType].g_iLagRangeCooldown, g_esLagAbility[iType].g_iLagRangeCooldown, 1); - g_esLagCache[tank].g_iLagSight = iGetSubSettingValue(apply, bHuman, g_esLagTeammate[tank].g_iLagSight, g_esLagPlayer[tank].g_iLagSight, g_esLagSpecial[iType].g_iLagSight, g_esLagAbility[iType].g_iLagSight, 1); - g_esLagCache[tank].g_flOpenAreasOnly = flGetSubSettingValue(apply, bHuman, g_esLagTeammate[tank].g_flOpenAreasOnly, g_esLagPlayer[tank].g_flOpenAreasOnly, g_esLagSpecial[iType].g_flOpenAreasOnly, g_esLagAbility[iType].g_flOpenAreasOnly, 1); - g_esLagCache[tank].g_iRequiresHumans = iGetSubSettingValue(apply, bHuman, g_esLagTeammate[tank].g_iRequiresHumans, g_esLagPlayer[tank].g_iRequiresHumans, g_esLagSpecial[iType].g_iRequiresHumans, g_esLagAbility[iType].g_iRequiresHumans, 1); - } - else - { - g_esLagCache[tank].g_flCloseAreasOnly = flGetSettingValue(apply, bHuman, g_esLagPlayer[tank].g_flCloseAreasOnly, g_esLagAbility[iType].g_flCloseAreasOnly, 1); - g_esLagCache[tank].g_iComboAbility = iGetSettingValue(apply, bHuman, g_esLagPlayer[tank].g_iComboAbility, g_esLagAbility[iType].g_iComboAbility, 1); - g_esLagCache[tank].g_flLagChance = flGetSettingValue(apply, bHuman, g_esLagPlayer[tank].g_flLagChance, g_esLagAbility[iType].g_flLagChance, 1); - g_esLagCache[tank].g_flLagRange = flGetSettingValue(apply, bHuman, g_esLagPlayer[tank].g_flLagRange, g_esLagAbility[iType].g_flLagRange, 1); - g_esLagCache[tank].g_flLagRangeChance = flGetSettingValue(apply, bHuman, g_esLagPlayer[tank].g_flLagRangeChance, g_esLagAbility[iType].g_flLagRangeChance, 1); - g_esLagCache[tank].g_iHumanAbility = iGetSettingValue(apply, bHuman, g_esLagPlayer[tank].g_iHumanAbility, g_esLagAbility[iType].g_iHumanAbility, 1); - g_esLagCache[tank].g_iHumanAmmo = iGetSettingValue(apply, bHuman, g_esLagPlayer[tank].g_iHumanAmmo, g_esLagAbility[iType].g_iHumanAmmo, 1); - g_esLagCache[tank].g_iHumanCooldown = iGetSettingValue(apply, bHuman, g_esLagPlayer[tank].g_iHumanCooldown, g_esLagAbility[iType].g_iHumanCooldown, 1); - g_esLagCache[tank].g_iHumanRangeCooldown = iGetSettingValue(apply, bHuman, g_esLagPlayer[tank].g_iHumanRangeCooldown, g_esLagAbility[iType].g_iHumanRangeCooldown, 1); - g_esLagCache[tank].g_iLagAbility = iGetSettingValue(apply, bHuman, g_esLagPlayer[tank].g_iLagAbility, g_esLagAbility[iType].g_iLagAbility, 1); - g_esLagCache[tank].g_iLagCooldown = iGetSettingValue(apply, bHuman, g_esLagPlayer[tank].g_iLagCooldown, g_esLagAbility[iType].g_iLagCooldown, 1); - g_esLagCache[tank].g_iLagDuration = iGetSettingValue(apply, bHuman, g_esLagPlayer[tank].g_iLagDuration, g_esLagAbility[iType].g_iLagDuration, 1); - g_esLagCache[tank].g_iLagEffect = iGetSettingValue(apply, bHuman, g_esLagPlayer[tank].g_iLagEffect, g_esLagAbility[iType].g_iLagEffect, 1); - g_esLagCache[tank].g_iLagHit = iGetSettingValue(apply, bHuman, g_esLagPlayer[tank].g_iLagHit, g_esLagAbility[iType].g_iLagHit, 1); - g_esLagCache[tank].g_iLagMessage = iGetSettingValue(apply, bHuman, g_esLagPlayer[tank].g_iLagMessage, g_esLagAbility[iType].g_iLagMessage, 1); - g_esLagCache[tank].g_iLagHitMode = iGetSettingValue(apply, bHuman, g_esLagPlayer[tank].g_iLagHitMode, g_esLagAbility[iType].g_iLagHitMode, 1); - g_esLagCache[tank].g_iLagRangeCooldown = iGetSettingValue(apply, bHuman, g_esLagPlayer[tank].g_iLagRangeCooldown, g_esLagAbility[iType].g_iLagRangeCooldown, 1); - g_esLagCache[tank].g_iLagSight = iGetSettingValue(apply, bHuman, g_esLagPlayer[tank].g_iLagSight, g_esLagAbility[iType].g_iLagSight, 1); - g_esLagCache[tank].g_flOpenAreasOnly = flGetSettingValue(apply, bHuman, g_esLagPlayer[tank].g_flOpenAreasOnly, g_esLagAbility[iType].g_flOpenAreasOnly, 1); - g_esLagCache[tank].g_iRequiresHumans = iGetSettingValue(apply, bHuman, g_esLagPlayer[tank].g_iRequiresHumans, g_esLagAbility[iType].g_iRequiresHumans, 1); - } -} - -#if defined MT_ABILITIES_MAIN -void vLagCopyStats(int oldTank, int newTank) -#else -public void MT_OnCopyStats(int oldTank, int newTank) -#endif -{ - vLagCopyStats2(oldTank, newTank); - - if (oldTank != newTank) - { - vRemoveLag(oldTank); - } -} - -#if !defined MT_ABILITIES_MAIN -public void MT_OnPluginUpdate() -{ - MT_ReloadPlugin(null); -} -#endif - -#if defined MT_ABILITIES_MAIN -void vLagEventFired(Event event, const char[] name) -#else -public void MT_OnEventFired(Event event, const char[] name, bool dontBroadcast) -#endif -{ - if (StrEqual(name, "bot_player_replace")) - { - int iBotId = event.GetInt("bot"), iBot = GetClientOfUserId(iBotId), - iTankId = event.GetInt("player"), iTank = GetClientOfUserId(iTankId); - if (bIsValidClient(iBot) && bIsInfected(iTank)) - { - vLagCopyStats2(iBot, iTank); - vRemoveLag(iBot); - } - } - else if (StrEqual(name, "mission_lost") || StrEqual(name, "round_start") || StrEqual(name, "round_end")) - { - vLagReset(); - } - else if (StrEqual(name, "player_bot_replace")) - { - int iTankId = event.GetInt("player"), iTank = GetClientOfUserId(iTankId), - iBotId = event.GetInt("bot"), iBot = GetClientOfUserId(iBotId); - if (bIsValidClient(iTank) && bIsInfected(iBot)) - { - vLagCopyStats2(iTank, iBot); - vRemoveLag(iTank); - } - } - else if (StrEqual(name, "player_death") || StrEqual(name, "player_spawn")) - { - int iTankId = event.GetInt("userid"), iTank = GetClientOfUserId(iTankId); - if (MT_IsTankSupported(iTank, MT_CHECK_INDEX|MT_CHECK_INGAME)) - { - vRemoveLag(iTank); - } - } - else if (StrEqual(name, "player_now_it")) - { - bool bExploded = event.GetBool("exploded"); - int iSurvivorId = event.GetInt("userid"), iSurvivor = GetClientOfUserId(iSurvivorId), - iBoomerId = event.GetInt("attacker"), iBoomer = GetClientOfUserId(iBoomerId); - if (bIsBoomer(iBoomer) && bIsSurvivor(iSurvivor) && !bExploded) - { - vLagHit(iSurvivor, iBoomer, GetRandomFloat(0.1, 100.0), g_esLagCache[iBoomer].g_flLagChance, g_esLagCache[iBoomer].g_iLagHit, MT_MESSAGE_RANGE, MT_ATTACK_RANGE); - } - } -} - -#if defined MT_ABILITIES_MAIN -void vLagAbilityActivated(int tank) -#else -public void MT_OnAbilityActivated(int tank) -#endif -{ - if (MT_IsTankSupported(tank, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_FAKECLIENT) && ((!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esLagAbility[g_esLagPlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esLagPlayer[tank].g_iAccessFlags)) || g_esLagCache[tank].g_iHumanAbility == 0)) - { - return; - } - - if (MT_IsTankSupported(tank) && (!bIsInfected(tank, MT_CHECK_FAKECLIENT) || g_esLagCache[tank].g_iHumanAbility != 1) && MT_IsCustomTankSupported(tank) && g_esLagCache[tank].g_iLagAbility == 1 && g_esLagCache[tank].g_iComboAbility == 0) - { - vLagAbility(tank, GetRandomFloat(0.1, 100.0)); - } -} - -#if defined MT_ABILITIES_MAIN -void vLagButtonPressed(int tank, int button) -#else -public void MT_OnButtonPressed(int tank, int button) -#endif -{ - if (MT_IsTankSupported(tank, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_ALIVE|MT_CHECK_FAKECLIENT) && MT_IsCustomTankSupported(tank)) - { - if (bIsAreaNarrow(tank, g_esLagCache[tank].g_flOpenAreasOnly) || bIsAreaWide(tank, g_esLagCache[tank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esLagPlayer[tank].g_iTankType, tank) || (g_esLagCache[tank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esLagCache[tank].g_iRequiresHumans) || (!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esLagAbility[g_esLagPlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esLagPlayer[tank].g_iAccessFlags))) - { - return; - } - - if ((button & MT_SUB_KEY) && g_esLagCache[tank].g_iLagAbility == 1 && g_esLagCache[tank].g_iHumanAbility == 1) - { - int iTime = GetTime(); - - switch (g_esLagPlayer[tank].g_iRangeCooldown == -1 || g_esLagPlayer[tank].g_iRangeCooldown <= iTime) - { - case true: vLagAbility(tank, GetRandomFloat(0.1, 100.0)); - case false: MT_PrintToChat(tank, "%s %t", MT_TAG3, "LagHuman3", (g_esLagPlayer[tank].g_iRangeCooldown - iTime)); - } - } - } -} - -#if defined MT_ABILITIES_MAIN -void vLagChangeType(int tank, int oldType) -#else -public void MT_OnChangeType(int tank, int oldType, int newType, bool revert) -#endif -{ - if (oldType <= 0) - { - return; - } - - vRemoveLag(tank); -} - -void vLagAbility(int tank, float random, int pos = -1) -{ - if (bIsAreaNarrow(tank, g_esLagCache[tank].g_flOpenAreasOnly) || bIsAreaWide(tank, g_esLagCache[tank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esLagPlayer[tank].g_iTankType, tank) || (g_esLagCache[tank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esLagCache[tank].g_iRequiresHumans) || (!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esLagAbility[g_esLagPlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esLagPlayer[tank].g_iAccessFlags))) - { - return; - } - - if (!bIsInfected(tank, MT_CHECK_FAKECLIENT) || (g_esLagPlayer[tank].g_iAmmoCount < g_esLagCache[tank].g_iHumanAmmo && g_esLagCache[tank].g_iHumanAmmo > 0)) - { - g_esLagPlayer[tank].g_bFailed = false; - g_esLagPlayer[tank].g_bNoAmmo = false; - - float flTankPos[3], flSurvivorPos[3]; - GetClientAbsOrigin(tank, flTankPos); - float flRange = (pos != -1) ? MT_GetCombinationSetting(tank, 9, pos) : g_esLagCache[tank].g_flLagRange, - flChance = (pos != -1) ? MT_GetCombinationSetting(tank, 10, pos) : g_esLagCache[tank].g_flLagRangeChance; - int iSurvivorCount = 0; - for (int iSurvivor = 1; iSurvivor <= MaxClients; iSurvivor++) - { - if (bIsSurvivor(iSurvivor, MT_CHECK_INGAME|MT_CHECK_ALIVE) && !MT_IsAdminImmune(iSurvivor, tank) && !bIsAdminImmune(iSurvivor, g_esLagPlayer[tank].g_iTankType, g_esLagAbility[g_esLagPlayer[tank].g_iTankTypeRecorded].g_iImmunityFlags, g_esLagPlayer[iSurvivor].g_iImmunityFlags)) - { - GetClientAbsOrigin(iSurvivor, flSurvivorPos); - if (GetVectorDistance(flTankPos, flSurvivorPos) <= flRange && bIsVisibleToPlayer(tank, iSurvivor, g_esLagCache[tank].g_iLagSight, .range = flRange)) - { - vLagHit(iSurvivor, tank, random, flChance, g_esLagCache[tank].g_iLagAbility, MT_MESSAGE_RANGE, MT_ATTACK_RANGE, pos); - - iSurvivorCount++; - } - } - } - - if (iSurvivorCount == 0) - { - if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esLagCache[tank].g_iHumanAbility == 1) - { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "LagHuman4"); - } - } - } - else if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esLagCache[tank].g_iHumanAbility == 1) - { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "LagAmmo"); - } -} - -void vLagHit(int survivor, int tank, float random, float chance, int enabled, int messages, int flags, int pos = -1) -{ - if (bIsAreaNarrow(tank, g_esLagCache[tank].g_flOpenAreasOnly) || bIsAreaWide(tank, g_esLagCache[tank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esLagPlayer[tank].g_iTankType, tank) || (g_esLagCache[tank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esLagCache[tank].g_iRequiresHumans) || (!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esLagAbility[g_esLagPlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esLagPlayer[tank].g_iAccessFlags)) || MT_IsAdminImmune(survivor, tank) || bIsAdminImmune(survivor, g_esLagPlayer[tank].g_iTankType, g_esLagAbility[g_esLagPlayer[tank].g_iTankTypeRecorded].g_iImmunityFlags, g_esLagPlayer[survivor].g_iImmunityFlags)) - { - return; - } - - int iTime = GetTime(); - if (((flags & MT_ATTACK_RANGE) && g_esLagPlayer[tank].g_iRangeCooldown != -1 && g_esLagPlayer[tank].g_iRangeCooldown >= iTime) || (((flags & MT_ATTACK_CLAW) || (flags & MT_ATTACK_MELEE)) && g_esLagPlayer[tank].g_iCooldown != -1 && g_esLagPlayer[tank].g_iCooldown >= iTime)) - { - return; - } - - if (enabled == 1 && bIsSurvivor(survivor) && !bIsSurvivorCaught(survivor) && !bIsSurvivorDisabled(survivor)) - { - if (!bIsInfected(tank, MT_CHECK_FAKECLIENT) || (flags & MT_ATTACK_CLAW) || (flags & MT_ATTACK_MELEE) || (g_esLagPlayer[tank].g_iAmmoCount < g_esLagCache[tank].g_iHumanAmmo && g_esLagCache[tank].g_iHumanAmmo > 0)) - { - if (random <= chance && !g_esLagPlayer[survivor].g_bAffected) - { - if ((messages & MT_MESSAGE_MELEE) && !bIsVisibleToPlayer(tank, survivor, g_esLagCache[tank].g_iLagSight, .range = 100.0)) - { - return; - } - - g_esLagPlayer[survivor].g_bAffected = true; - g_esLagPlayer[survivor].g_iOwner = tank; - - int iCooldown = -1; - if ((flags & MT_ATTACK_RANGE) && (g_esLagPlayer[tank].g_iRangeCooldown == -1 || g_esLagPlayer[tank].g_iRangeCooldown <= iTime)) - { - if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esLagCache[tank].g_iHumanAbility == 1) - { - g_esLagPlayer[tank].g_iAmmoCount++; - - MT_PrintToChat(tank, "%s %t", MT_TAG3, "LagHuman", g_esLagPlayer[tank].g_iAmmoCount, g_esLagCache[tank].g_iHumanAmmo); - } - - iCooldown = (pos != -1) ? RoundToNearest(MT_GetCombinationSetting(tank, 11, pos)) : g_esLagCache[tank].g_iLagRangeCooldown; - iCooldown = (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esLagCache[tank].g_iHumanAbility == 1 && g_esLagPlayer[tank].g_iAmmoCount < g_esLagCache[tank].g_iHumanAmmo && g_esLagCache[tank].g_iHumanAmmo > 0) ? g_esLagCache[tank].g_iHumanRangeCooldown : iCooldown; - g_esLagPlayer[tank].g_iRangeCooldown = (iTime + iCooldown); - if (g_esLagPlayer[tank].g_iRangeCooldown != -1 && g_esLagPlayer[tank].g_iRangeCooldown >= iTime) - { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "LagHuman5", (g_esLagPlayer[tank].g_iRangeCooldown - iTime)); - } - } - else if (((flags & MT_ATTACK_CLAW) || (flags & MT_ATTACK_MELEE)) && (g_esLagPlayer[tank].g_iCooldown == -1 || g_esLagPlayer[tank].g_iCooldown <= iTime)) - { - iCooldown = (pos != -1) ? RoundToNearest(MT_GetCombinationSetting(tank, 2, pos)) : g_esLagCache[tank].g_iLagCooldown; - iCooldown = (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esLagCache[tank].g_iHumanAbility == 1) ? g_esLagCache[tank].g_iHumanCooldown : iCooldown; - g_esLagPlayer[tank].g_iCooldown = (iTime + iCooldown); - if (g_esLagPlayer[tank].g_iCooldown != -1 && g_esLagPlayer[tank].g_iCooldown >= iTime) - { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "LagHuman5", (g_esLagPlayer[tank].g_iCooldown - iTime)); - } - } - - GetClientAbsOrigin(survivor, g_esLagPlayer[survivor].g_flLastPosition); - - int iSurvivorId = GetClientUserId(survivor), iTankId = GetClientUserId(tank); - DataPack dpLagTeleport; - CreateDataTimer(1.0, tTimerLagTeleport, dpLagTeleport, TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); - dpLagTeleport.WriteCell(iSurvivorId); - dpLagTeleport.WriteCell(iTankId); - dpLagTeleport.WriteCell(g_esLagPlayer[tank].g_iTankType); - dpLagTeleport.WriteCell(messages); - dpLagTeleport.WriteCell(enabled); - dpLagTeleport.WriteCell(pos); - dpLagTeleport.WriteCell(iTime); - - DataPack dpLagPosition; - CreateDataTimer(0.5, tTimerLagPosition, dpLagPosition, TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); - dpLagPosition.WriteCell(iSurvivorId); - dpLagPosition.WriteCell(iTankId); - dpLagPosition.WriteCell(g_esLagPlayer[tank].g_iTankType); - dpLagPosition.WriteCell(enabled); - dpLagPosition.WriteCell(pos); - dpLagPosition.WriteCell(iTime); - - vScreenEffect(survivor, tank, g_esLagCache[tank].g_iLagEffect, flags); - - if (g_esLagCache[tank].g_iLagMessage & messages) - { - char sTankName[64]; - MT_GetTankName(tank, sTankName); - MT_PrintToChatAll("%s %t", MT_TAG2, "Lag", sTankName, survivor); - MT_LogMessage(MT_LOG_ABILITY, "%s %T", MT_TAG, "Lag", LANG_SERVER, sTankName, survivor); - } - } - else if ((flags & MT_ATTACK_RANGE) && (g_esLagPlayer[tank].g_iRangeCooldown == -1 || g_esLagPlayer[tank].g_iRangeCooldown <= iTime)) - { - if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esLagCache[tank].g_iHumanAbility == 1 && !g_esLagPlayer[tank].g_bFailed) - { - g_esLagPlayer[tank].g_bFailed = true; - - MT_PrintToChat(tank, "%s %t", MT_TAG3, "LagHuman2"); - } - } - } - else if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esLagCache[tank].g_iHumanAbility == 1 && !g_esLagPlayer[tank].g_bNoAmmo) - { - g_esLagPlayer[tank].g_bNoAmmo = true; - - MT_PrintToChat(tank, "%s %t", MT_TAG3, "LagAmmo"); - } - } -} - -void vLagCopyStats2(int oldTank, int newTank) -{ - g_esLagPlayer[newTank].g_iAmmoCount = g_esLagPlayer[oldTank].g_iAmmoCount; - g_esLagPlayer[newTank].g_iCooldown = g_esLagPlayer[oldTank].g_iCooldown; - g_esLagPlayer[newTank].g_iRangeCooldown = g_esLagPlayer[oldTank].g_iRangeCooldown; -} - -void vRemoveLag(int tank) -{ - for (int iSurvivor = 1; iSurvivor <= MaxClients; iSurvivor++) - { - if (bIsSurvivor(iSurvivor, MT_CHECK_INGAME|MT_CHECK_ALIVE) && g_esLagPlayer[iSurvivor].g_bAffected && g_esLagPlayer[iSurvivor].g_iOwner == tank) - { - g_esLagPlayer[iSurvivor].g_bAffected = false; - g_esLagPlayer[iSurvivor].g_iOwner = -1; - } - } - - vLagReset3(tank); -} - -void vLagReset() -{ - for (int iPlayer = 1; iPlayer <= MaxClients; iPlayer++) - { - if (bIsValidClient(iPlayer, MT_CHECK_INGAME)) - { - vLagReset3(iPlayer); - - g_esLagPlayer[iPlayer].g_iOwner = -1; - } - } -} - -void vLagReset2(int survivor, int tank, int messages) -{ - g_esLagPlayer[survivor].g_bAffected = false; - g_esLagPlayer[survivor].g_iOwner = -1; - - if (g_esLagCache[tank].g_iLagMessage & messages) - { - MT_PrintToChatAll("%s %t", MT_TAG2, "Lag2", survivor); - MT_LogMessage(MT_LOG_ABILITY, "%s %T", MT_TAG, "Lag2", LANG_SERVER, survivor); - } -} - -void vLagReset3(int tank) -{ - g_esLagPlayer[tank].g_bAffected = false; - g_esLagPlayer[tank].g_bFailed = false; - g_esLagPlayer[tank].g_bNoAmmo = false; - g_esLagPlayer[tank].g_iAmmoCount = 0; - g_esLagPlayer[tank].g_iCooldown = -1; - g_esLagPlayer[tank].g_iRangeCooldown = -1; -} - -void tTimerLagCombo(Handle timer, DataPack pack) -{ - pack.Reset(); - - int iTank = GetClientOfUserId(pack.ReadCell()); - if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esLagAbility[g_esLagPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esLagPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esLagPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esLagCache[iTank].g_iLagAbility == 0) - { - return; - } - - float flRandom = pack.ReadFloat(); - int iPos = pack.ReadCell(); - vLagAbility(iTank, flRandom, iPos); -} - -void tTimerLagCombo2(Handle timer, DataPack pack) -{ - pack.Reset(); - - int iSurvivor = GetClientOfUserId(pack.ReadCell()); - if (!bIsSurvivor(iSurvivor) || g_esLagPlayer[iSurvivor].g_bAffected) - { - return; - } - - int iTank = GetClientOfUserId(pack.ReadCell()); - if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esLagAbility[g_esLagPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esLagPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esLagPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esLagCache[iTank].g_iLagHit == 0) - { - return; - } - - float flRandom = pack.ReadFloat(), flChance = pack.ReadFloat(); - int iPos = pack.ReadCell(); - char sClassname[32]; - pack.ReadString(sClassname, sizeof sClassname); - if ((g_esLagCache[iTank].g_iLagHitMode == 0 || g_esLagCache[iTank].g_iLagHitMode == 1) && (bIsSpecialInfected(iTank) || StrEqual(sClassname[7], "tank_claw") || StrEqual(sClassname, "tank_rock"))) - { - vLagHit(iSurvivor, iTank, flRandom, flChance, g_esLagCache[iTank].g_iLagHit, MT_MESSAGE_MELEE, MT_ATTACK_CLAW, iPos); - } - else if ((g_esLagCache[iTank].g_iLagHitMode == 0 || g_esLagCache[iTank].g_iLagHitMode == 2) && StrEqual(sClassname[7], "melee")) - { - vLagHit(iSurvivor, iTank, flRandom, flChance, g_esLagCache[iTank].g_iLagHit, MT_MESSAGE_MELEE, MT_ATTACK_MELEE, iPos); - } -} - -Action tTimerLagTeleport(Handle timer, DataPack pack) -{ - pack.Reset(); - - int iSurvivor = GetClientOfUserId(pack.ReadCell()); - if (!MT_IsCorePluginEnabled() || !bIsSurvivor(iSurvivor)) - { - g_esLagPlayer[iSurvivor].g_bAffected = false; - g_esLagPlayer[iSurvivor].g_iOwner = -1; - - return Plugin_Stop; - } - - int iTank = GetClientOfUserId(pack.ReadCell()), iType = pack.ReadCell(), iMessage = pack.ReadCell(); - if (!MT_IsTankSupported(iTank) || bIsAreaNarrow(iTank, g_esLagCache[iTank].g_flOpenAreasOnly) || bIsAreaWide(iTank, g_esLagCache[iTank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esLagPlayer[iTank].g_iTankType, iTank) || (g_esLagCache[iTank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esLagCache[iTank].g_iRequiresHumans) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esLagAbility[g_esLagPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esLagPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esLagPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || iType != g_esLagPlayer[iTank].g_iTankType || MT_IsAdminImmune(iSurvivor, iTank) || bIsAdminImmune(iSurvivor, g_esLagPlayer[iTank].g_iTankType, g_esLagAbility[g_esLagPlayer[iTank].g_iTankTypeRecorded].g_iImmunityFlags, g_esLagPlayer[iSurvivor].g_iImmunityFlags) || !g_esLagPlayer[iSurvivor].g_bAffected) - { - vLagReset2(iSurvivor, iTank, iMessage); - - return Plugin_Stop; - } - - int iLagEnabled = pack.ReadCell(), iPos = pack.ReadCell(), - iDuration = (iPos != -1) ? RoundToNearest(MT_GetCombinationSetting(iTank, 5, iPos)) : g_esLagCache[iTank].g_iLagDuration, - iTime = pack.ReadCell(); - if (iLagEnabled == 0 || (iTime + iDuration) <= GetTime()) - { - vLagReset2(iSurvivor, iTank, iMessage); - - return Plugin_Stop; - } - - if (!bIsVisibleToPlayer(iSurvivor, iTank, g_esLagCache[iTank].g_iLagSight)) - { - return Plugin_Continue; - } - - TeleportEntity(iSurvivor, g_esLagPlayer[iSurvivor].g_flLastPosition); - - return Plugin_Continue; -} - -Action tTimerLagPosition(Handle timer, DataPack pack) -{ - pack.Reset(); - - int iSurvivor = GetClientOfUserId(pack.ReadCell()); - if (!MT_IsCorePluginEnabled() || !bIsSurvivor(iSurvivor)) - { - return Plugin_Stop; - } - - int iTank = GetClientOfUserId(pack.ReadCell()), iType = pack.ReadCell(); - if (!MT_IsTankSupported(iTank) || bIsAreaNarrow(iTank, g_esLagCache[iTank].g_flOpenAreasOnly) || bIsAreaWide(iTank, g_esLagCache[iTank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esLagPlayer[iTank].g_iTankType, iTank) || (g_esLagCache[iTank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esLagCache[iTank].g_iRequiresHumans) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esLagAbility[g_esLagPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esLagPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esLagPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || iType != g_esLagPlayer[iTank].g_iTankType || MT_IsAdminImmune(iSurvivor, iTank) || bIsAdminImmune(iSurvivor, g_esLagPlayer[iTank].g_iTankType, g_esLagAbility[g_esLagPlayer[iTank].g_iTankTypeRecorded].g_iImmunityFlags, g_esLagPlayer[iSurvivor].g_iImmunityFlags)) - { - return Plugin_Stop; - } - - int iLagEnabled = pack.ReadCell(), iPos = pack.ReadCell(), - iDuration = (iPos != -1) ? RoundToNearest(MT_GetCombinationSetting(iTank, 5, iPos)) : g_esLagCache[iTank].g_iLagDuration, - iTime = pack.ReadCell(); - if (iLagEnabled == 0 || (iTime + iDuration) <= GetTime()) - { - return Plugin_Stop; - } - - GetClientAbsOrigin(iSurvivor, g_esLagPlayer[iSurvivor].g_flLastPosition); - - return Plugin_Continue; +/** + * Mutant Tanks: A L4D/L4D2 SourceMod Plugin + * Copyright (C) 2017-2025 Alfred "Psyk0tik" Llagas + * + * 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 . + **/ + +#define MT_LAG_COMPILE_METHOD 0 // 0: packaged, 1: standalone + +#if !defined MT_ABILITIES_MAIN2 + #if MT_LAG_COMPILE_METHOD == 1 + #include + #include + #else + #error This file must be inside "scripting/mutant_tanks/abilities2" while compiling "mt_abilities2.sp" to include its content. + #endif +public Plugin myinfo = +{ + name = "[MT] Lag Ability", + author = MT_AUTHOR, + description = "The Mutant Tank makes survivors lag.", + version = MT_VERSION, + url = MT_URL +}; + +bool g_bDedicated, g_bLateLoad; + +public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max) +{ + EngineVersion evEngine = GetEngineVersion(); + if (evEngine != Engine_Left4Dead && evEngine != Engine_Left4Dead2) + { + strcopy(error, err_max, "\"[MT] Lag Ability\" only supports Left 4 Dead 1 & 2."); + + return APLRes_SilentFailure; + } + + g_bDedicated = IsDedicatedServer(); + g_bLateLoad = late; + + return APLRes_Success; +} +#else + #if MT_LAG_COMPILE_METHOD == 1 + #error This file must be compiled as a standalone plugin. + #endif +#endif + +#define MT_LAG_SECTION "lagability" +#define MT_LAG_SECTION2 "lag ability" +#define MT_LAG_SECTION3 "lag_ability" +#define MT_LAG_SECTION4 "lag" + +#define MT_MENU_LAG "Lag Ability" + +enum struct esLagPlayer +{ + bool g_bAffected; + bool g_bFailed; + bool g_bNoAmmo; + + float g_flCloseAreasOnly; + float g_flLagChance; + float g_flLagRange; + float g_flLagRangeChance; + float g_flLastPosition[3]; + float g_flOpenAreasOnly; + + int g_iAccessFlags; + int g_iAmmoCount; + int g_iComboAbility; + int g_iCooldown; + int g_iHumanAbility; + int g_iHumanAmmo; + int g_iHumanCooldown; + int g_iHumanRangeCooldown; + int g_iImmunityFlags; + int g_iLagAbility; + int g_iLagCooldown; + int g_iLagDuration; + int g_iLagEffect; + int g_iLagHit; + int g_iLagMessage; + int g_iLagHitMode; + int g_iLagRangeCooldown; + int g_iLagSight; + int g_iOwner; + int g_iRangeCooldown; + int g_iRequiresHumans; + int g_iTankType; + int g_iTankTypeRecorded; +} + +esLagPlayer g_esLagPlayer[MAXPLAYERS + 1]; + +enum struct esLagTeammate +{ + float g_flCloseAreasOnly; + float g_flLagChance; + float g_flLagRange; + float g_flLagRangeChance; + float g_flOpenAreasOnly; + + int g_iComboAbility; + int g_iHumanAbility; + int g_iHumanAmmo; + int g_iHumanCooldown; + int g_iHumanRangeCooldown; + int g_iLagAbility; + int g_iLagCooldown; + int g_iLagDuration; + int g_iLagEffect; + int g_iLagHit; + int g_iLagMessage; + int g_iLagHitMode; + int g_iLagRangeCooldown; + int g_iLagSight; + int g_iRequiresHumans; +} + +esLagTeammate g_esLagTeammate[MAXPLAYERS + 1]; + +enum struct esLagAbility +{ + float g_flCloseAreasOnly; + float g_flLagChance; + float g_flLagRange; + float g_flLagRangeChance; + float g_flOpenAreasOnly; + + int g_iAccessFlags; + int g_iComboAbility; + int g_iHumanAbility; + int g_iHumanAmmo; + int g_iHumanCooldown; + int g_iHumanRangeCooldown; + int g_iImmunityFlags; + int g_iLagAbility; + int g_iLagCooldown; + int g_iLagDuration; + int g_iLagEffect; + int g_iLagHit; + int g_iLagMessage; + int g_iLagHitMode; + int g_iLagRangeCooldown; + int g_iLagSight; + int g_iRequiresHumans; +} + +esLagAbility g_esLagAbility[MT_MAXTYPES + 1]; + +enum struct esLagSpecial +{ + float g_flCloseAreasOnly; + float g_flLagChance; + float g_flLagRange; + float g_flLagRangeChance; + float g_flOpenAreasOnly; + + int g_iComboAbility; + int g_iHumanAbility; + int g_iHumanAmmo; + int g_iHumanCooldown; + int g_iHumanRangeCooldown; + int g_iLagAbility; + int g_iLagCooldown; + int g_iLagDuration; + int g_iLagEffect; + int g_iLagHit; + int g_iLagMessage; + int g_iLagHitMode; + int g_iLagRangeCooldown; + int g_iLagSight; + int g_iRequiresHumans; +} + +esLagSpecial g_esLagSpecial[MT_MAXTYPES + 1]; + +enum struct esLagCache +{ + float g_flCloseAreasOnly; + float g_flLagChance; + float g_flLagRange; + float g_flLagRangeChance; + float g_flOpenAreasOnly; + + int g_iComboAbility; + int g_iHumanAbility; + int g_iHumanAmmo; + int g_iHumanCooldown; + int g_iHumanRangeCooldown; + int g_iLagAbility; + int g_iLagCooldown; + int g_iLagDuration; + int g_iLagEffect; + int g_iLagHit; + int g_iLagMessage; + int g_iLagHitMode; + int g_iLagRangeCooldown; + int g_iLagSight; + int g_iRequiresHumans; +} + +esLagCache g_esLagCache[MAXPLAYERS + 1]; + +#if !defined MT_ABILITIES_MAIN2 +public void OnPluginStart() +{ + LoadTranslations("common.phrases"); + LoadTranslations("mutant_tanks.phrases"); + LoadTranslations("mutant_tanks_names.phrases"); + + RegConsoleCmd("sm_mt_lag", cmdLagInfo, "View information about the Lag ability."); + + if (g_bLateLoad) + { + for (int iPlayer = 1; iPlayer <= MaxClients; iPlayer++) + { + if (bIsValidClient(iPlayer, MT_CHECK_INGAME)) + { + OnClientPutInServer(iPlayer); + } + } + + g_bLateLoad = false; + } +} +#endif + +#if defined MT_ABILITIES_MAIN2 +void vLagMapStart() +#else +public void OnMapStart() +#endif +{ + vLagReset(); +} + +#if defined MT_ABILITIES_MAIN2 +void vLagClientPutInServer(int client) +#else +public void OnClientPutInServer(int client) +#endif +{ + SDKHook(client, SDKHook_OnTakeDamage, OnLagTakeDamage); + vLagReset3(client); +} + +#if defined MT_ABILITIES_MAIN2 +void vLagClientDisconnect_Post(int client) +#else +public void OnClientDisconnect_Post(int client) +#endif +{ + vLagReset3(client); +} + +#if defined MT_ABILITIES_MAIN2 +void vLagMapEnd() +#else +public void OnMapEnd() +#endif +{ + vLagReset(); +} + +#if !defined MT_ABILITIES_MAIN2 +Action cmdLagInfo(int client, int args) +{ + client = iGetListenServerHost(client, g_bDedicated); + + if (!MT_IsCorePluginEnabled()) + { + MT_ReplyToCommand(client, "%s %t", MT_TAG5, "PluginDisabled"); + + return Plugin_Handled; + } + + if (!bIsValidClient(client, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_FAKECLIENT)) + { + MT_ReplyToCommand(client, "%s %t", MT_TAG, "Command is in-game only"); + + return Plugin_Handled; + } + + switch (IsVoteInProgress()) + { + case true: MT_ReplyToCommand(client, "%s %t", MT_TAG2, "Vote in Progress"); + case false: vLagMenu(client, MT_LAG_SECTION4, 0); + } + + return Plugin_Handled; +} +#endif + +void vLagMenu(int client, const char[] name, int item) +{ + if (StrContains(MT_LAG_SECTION4, name, false) == -1) + { + return; + } + + Menu mAbilityMenu = new Menu(iLagMenuHandler, MENU_ACTIONS_DEFAULT|MenuAction_Display|MenuAction_DisplayItem); + mAbilityMenu.SetTitle("Lag Ability Information"); + mAbilityMenu.AddItem("Status", "Status"); + mAbilityMenu.AddItem("Ammunition", "Ammunition"); + mAbilityMenu.AddItem("Buttons", "Buttons"); + mAbilityMenu.AddItem("Cooldown", "Cooldown"); + mAbilityMenu.AddItem("Details", "Details"); + mAbilityMenu.AddItem("Duration", "Duration"); + mAbilityMenu.AddItem("Human Support", "Human Support"); + mAbilityMenu.AddItem("Range Cooldown", "Range Cooldown"); + mAbilityMenu.DisplayAt(client, item, MENU_TIME_FOREVER); +} + +int iLagMenuHandler(Menu menu, MenuAction action, int param1, int param2) +{ + switch (action) + { + case MenuAction_End: delete menu; + case MenuAction_Select: + { + switch (param2) + { + case 0: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esLagCache[param1].g_iLagAbility == 0) ? "AbilityStatus1" : "AbilityStatus2"); + case 1: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityAmmo", (g_esLagCache[param1].g_iHumanAmmo - g_esLagPlayer[param1].g_iAmmoCount), g_esLagCache[param1].g_iHumanAmmo); + case 2: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtons2"); + case 3: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityCooldown", ((g_esLagCache[param1].g_iHumanAbility == 1) ? g_esLagCache[param1].g_iHumanCooldown : g_esLagCache[param1].g_iLagCooldown)); + case 4: MT_PrintToChat(param1, "%s %t", MT_TAG3, "LagDetails"); + case 5: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityDuration2", g_esLagCache[param1].g_iLagDuration); + case 6: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esLagCache[param1].g_iHumanAbility == 0) ? "AbilityHumanSupport1" : "AbilityHumanSupport2"); + case 7: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityRangeCooldown", ((g_esLagCache[param1].g_iHumanAbility == 1) ? g_esLagCache[param1].g_iHumanRangeCooldown : g_esLagCache[param1].g_iLagRangeCooldown)); + } + + if (bIsValidClient(param1, MT_CHECK_INGAME)) + { + vLagMenu(param1, MT_LAG_SECTION4, menu.Selection); + } + } + case MenuAction_Display: + { + char sMenuTitle[PLATFORM_MAX_PATH]; + Panel pLag = view_as(param2); + FormatEx(sMenuTitle, sizeof sMenuTitle, "%T", "LagMenu", param1); + pLag.SetTitle(sMenuTitle); + } + case MenuAction_DisplayItem: + { + if (param2 >= 0) + { + char sMenuOption[PLATFORM_MAX_PATH]; + + switch (param2) + { + case 0: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Status", param1); + case 1: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Ammunition", param1); + case 2: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Buttons", param1); + case 3: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Cooldown", param1); + case 4: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Details", param1); + case 5: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Duration", param1); + case 6: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "HumanSupport", param1); + case 7: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "RangeCooldown", param1); + } + + return RedrawMenuItem(sMenuOption); + } + } + } + + return 0; +} + +#if defined MT_ABILITIES_MAIN2 +void vLagDisplayMenu(Menu menu) +#else +public void MT_OnDisplayMenu(Menu menu) +#endif +{ + menu.AddItem(MT_MENU_LAG, MT_MENU_LAG); +} + +#if defined MT_ABILITIES_MAIN2 +void vLagMenuItemSelected(int client, const char[] info) +#else +public void MT_OnMenuItemSelected(int client, const char[] info) +#endif +{ + if (StrEqual(info, MT_MENU_LAG, false)) + { + vLagMenu(client, MT_LAG_SECTION4, 0); + } +} + +#if defined MT_ABILITIES_MAIN2 +void vLagMenuItemDisplayed(int client, const char[] info, char[] buffer, int size) +#else +public void MT_OnMenuItemDisplayed(int client, const char[] info, char[] buffer, int size) +#endif +{ + if (StrEqual(info, MT_MENU_LAG, false)) + { + FormatEx(buffer, size, "%T", "LagMenu2", client); + } +} + +Action OnLagTakeDamage(int victim, int &attacker, int &inflictor, float &damage, int &damagetype) +{ + if (MT_IsCorePluginEnabled() && bIsValidClient(victim, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_ALIVE) && damage > 0.0) + { + char sClassname[32]; + if (bIsValidEntity(inflictor)) + { + GetEntityClassname(inflictor, sClassname, sizeof sClassname); + } + + if (MT_IsTankSupported(attacker) && MT_IsCustomTankSupported(attacker) && (g_esLagCache[attacker].g_iLagHitMode == 0 || g_esLagCache[attacker].g_iLagHitMode == 1) && bIsSurvivor(victim) && g_esLagCache[attacker].g_iComboAbility == 0) + { + if ((!MT_HasAdminAccess(attacker) && !bHasAdminAccess(attacker, g_esLagAbility[g_esLagPlayer[attacker].g_iTankTypeRecorded].g_iAccessFlags, g_esLagPlayer[attacker].g_iAccessFlags)) || MT_IsAdminImmune(victim, attacker) || bIsAdminImmune(victim, g_esLagPlayer[attacker].g_iTankType, g_esLagAbility[g_esLagPlayer[attacker].g_iTankTypeRecorded].g_iImmunityFlags, g_esLagPlayer[victim].g_iImmunityFlags)) + { + return Plugin_Continue; + } + + bool bCaught = bIsSurvivorCaught(victim); + if ((bIsSpecialInfected(attacker) && (bCaught || (!bCaught && (damagetype & DMG_CLUB)) || (bIsSpitter(attacker) && StrEqual(sClassname, "insect_swarm")))) || StrEqual(sClassname[7], "tank_claw") || StrEqual(sClassname, "tank_rock")) + { + vLagHit(victim, attacker, GetRandomFloat(0.1, 100.0), g_esLagCache[attacker].g_flLagChance, g_esLagCache[attacker].g_iLagHit, MT_MESSAGE_MELEE, MT_ATTACK_CLAW); + } + } + else if (MT_IsTankSupported(victim) && MT_IsCustomTankSupported(victim) && (g_esLagCache[victim].g_iLagHitMode == 0 || g_esLagCache[victim].g_iLagHitMode == 2) && bIsSurvivor(attacker) && g_esLagCache[victim].g_iComboAbility == 0) + { + if ((!MT_HasAdminAccess(victim) && !bHasAdminAccess(victim, g_esLagAbility[g_esLagPlayer[victim].g_iTankTypeRecorded].g_iAccessFlags, g_esLagPlayer[victim].g_iAccessFlags)) || MT_IsAdminImmune(attacker, victim) || bIsAdminImmune(attacker, g_esLagPlayer[victim].g_iTankType, g_esLagAbility[g_esLagPlayer[victim].g_iTankTypeRecorded].g_iImmunityFlags, g_esLagPlayer[attacker].g_iImmunityFlags)) + { + return Plugin_Continue; + } + + if (StrEqual(sClassname[7], "melee")) + { + vLagHit(attacker, victim, GetRandomFloat(0.1, 100.0), g_esLagCache[victim].g_flLagChance, g_esLagCache[victim].g_iLagHit, MT_MESSAGE_MELEE, MT_ATTACK_MELEE); + } + } + } + + return Plugin_Continue; +} + +#if defined MT_ABILITIES_MAIN2 +void vLagPluginCheck(ArrayList list) +#else +public void MT_OnPluginCheck(ArrayList list) +#endif +{ + list.PushString(MT_MENU_LAG); +} + +#if defined MT_ABILITIES_MAIN2 +void vLagAbilityCheck(ArrayList list, ArrayList list2, ArrayList list3, ArrayList list4) +#else +public void MT_OnAbilityCheck(ArrayList list, ArrayList list2, ArrayList list3, ArrayList list4) +#endif +{ + list.PushString(MT_LAG_SECTION); + list2.PushString(MT_LAG_SECTION2); + list3.PushString(MT_LAG_SECTION3); + list4.PushString(MT_LAG_SECTION4); +} + +#if defined MT_ABILITIES_MAIN2 +void vLagCombineAbilities(int tank, int type, const float random, const char[] combo, int survivor, const char[] classname) +#else +public void MT_OnCombineAbilities(int tank, int type, const float random, const char[] combo, int survivor, int weapon, const char[] classname) +#endif +{ + if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esLagCache[tank].g_iHumanAbility != 2) + { + return; + } + + char sCombo[320], sSet[4][32]; + FormatEx(sCombo, sizeof sCombo, ",%s,", combo); + FormatEx(sSet[0], sizeof sSet[], ",%s,", MT_LAG_SECTION); + FormatEx(sSet[1], sizeof sSet[], ",%s,", MT_LAG_SECTION2); + FormatEx(sSet[2], sizeof sSet[], ",%s,", MT_LAG_SECTION3); + FormatEx(sSet[3], sizeof sSet[], ",%s,", MT_LAG_SECTION4); + if (g_esLagCache[tank].g_iComboAbility == 1 && (StrContains(sCombo, sSet[0], false) != -1 || StrContains(sCombo, sSet[1], false) != -1 || StrContains(sCombo, sSet[2], false) != -1 || StrContains(sCombo, sSet[3], false) != -1)) + { + char sAbilities[320], sSubset[10][32]; + strcopy(sAbilities, sizeof sAbilities, combo); + ExplodeString(sAbilities, ",", sSubset, sizeof sSubset, sizeof sSubset[]); + + float flChance = 0.0, flDelay = 0.0; + for (int iPos = 0; iPos < (sizeof sSubset); iPos++) + { + if (StrEqual(sSubset[iPos], MT_LAG_SECTION, false) || StrEqual(sSubset[iPos], MT_LAG_SECTION2, false) || StrEqual(sSubset[iPos], MT_LAG_SECTION3, false) || StrEqual(sSubset[iPos], MT_LAG_SECTION4, false)) + { + flDelay = MT_GetCombinationSetting(tank, 4, iPos); + + switch (type) + { + case MT_COMBO_MAINRANGE: + { + if (g_esLagCache[tank].g_iLagAbility == 1) + { + switch (flDelay) + { + case 0.0: vLagAbility(tank, random, iPos); + default: + { + DataPack dpCombo; + CreateDataTimer(flDelay, tTimerLagCombo, dpCombo, TIMER_FLAG_NO_MAPCHANGE); + dpCombo.WriteCell(GetClientUserId(tank)); + dpCombo.WriteFloat(random); + dpCombo.WriteCell(iPos); + } + } + } + } + case MT_COMBO_MELEEHIT: + { + flChance = MT_GetCombinationSetting(tank, 1, iPos); + + switch (flDelay) + { + case 0.0: + { + if ((g_esLagCache[tank].g_iLagHitMode == 0 || g_esLagCache[tank].g_iLagHitMode == 1) && (StrEqual(classname[7], "tank_claw") || StrEqual(classname, "tank_rock"))) + { + vLagHit(survivor, tank, random, flChance, g_esLagCache[tank].g_iLagHit, MT_MESSAGE_MELEE, MT_ATTACK_CLAW, iPos); + } + else if ((g_esLagCache[tank].g_iLagHitMode == 0 || g_esLagCache[tank].g_iLagHitMode == 2) && StrEqual(classname[7], "melee")) + { + vLagHit(survivor, tank, random, flChance, g_esLagCache[tank].g_iLagHit, MT_MESSAGE_MELEE, MT_ATTACK_MELEE, iPos); + } + } + default: + { + DataPack dpCombo; + CreateDataTimer(flDelay, tTimerLagCombo2, dpCombo, TIMER_FLAG_NO_MAPCHANGE); + dpCombo.WriteCell(GetClientUserId(survivor)); + dpCombo.WriteCell(GetClientUserId(tank)); + dpCombo.WriteFloat(random); + dpCombo.WriteFloat(flChance); + dpCombo.WriteCell(iPos); + dpCombo.WriteString(classname); + } + } + } + } + + break; + } + } + } +} + +#if defined MT_ABILITIES_MAIN2 +void vLagConfigsLoad(int mode) +#else +public void MT_OnConfigsLoad(int mode) +#endif +{ + switch (mode) + { + case 1: + { + for (int iIndex = MT_GetMinType(); iIndex <= MT_GetMaxType(); iIndex++) + { + g_esLagAbility[iIndex].g_iAccessFlags = 0; + g_esLagAbility[iIndex].g_iImmunityFlags = 0; + g_esLagAbility[iIndex].g_flCloseAreasOnly = 0.0; + g_esLagAbility[iIndex].g_iComboAbility = 0; + g_esLagAbility[iIndex].g_iHumanAbility = 0; + g_esLagAbility[iIndex].g_iHumanAmmo = 5; + g_esLagAbility[iIndex].g_iHumanCooldown = 0; + g_esLagAbility[iIndex].g_iHumanRangeCooldown = 0; + g_esLagAbility[iIndex].g_flOpenAreasOnly = 0.0; + g_esLagAbility[iIndex].g_iRequiresHumans = 1; + g_esLagAbility[iIndex].g_iLagAbility = 0; + g_esLagAbility[iIndex].g_iLagEffect = 0; + g_esLagAbility[iIndex].g_iLagMessage = 0; + g_esLagAbility[iIndex].g_flLagChance = 33.3; + g_esLagAbility[iIndex].g_iLagCooldown = 0; + g_esLagAbility[iIndex].g_iLagDuration = 5; + g_esLagAbility[iIndex].g_iLagHit = 0; + g_esLagAbility[iIndex].g_iLagHitMode = 0; + g_esLagAbility[iIndex].g_flLagRange = 150.0; + g_esLagAbility[iIndex].g_flLagRangeChance = 15.0; + g_esLagAbility[iIndex].g_iLagRangeCooldown = 0; + g_esLagAbility[iIndex].g_iLagSight = 0; + + g_esLagSpecial[iIndex].g_flCloseAreasOnly = -1.0; + g_esLagSpecial[iIndex].g_iComboAbility = -1; + g_esLagSpecial[iIndex].g_iHumanAbility = -1; + g_esLagSpecial[iIndex].g_iHumanAmmo = -1; + g_esLagSpecial[iIndex].g_iHumanCooldown = -1; + g_esLagSpecial[iIndex].g_iHumanRangeCooldown = -1; + g_esLagSpecial[iIndex].g_flOpenAreasOnly = -1.0; + g_esLagSpecial[iIndex].g_iRequiresHumans = -1; + g_esLagSpecial[iIndex].g_iLagAbility = -1; + g_esLagSpecial[iIndex].g_iLagEffect = -1; + g_esLagSpecial[iIndex].g_iLagMessage = -1; + g_esLagSpecial[iIndex].g_flLagChance = -1.0; + g_esLagSpecial[iIndex].g_iLagCooldown = -1; + g_esLagSpecial[iIndex].g_iLagDuration = -1; + g_esLagSpecial[iIndex].g_iLagHit = -1; + g_esLagSpecial[iIndex].g_iLagHitMode = -1; + g_esLagSpecial[iIndex].g_flLagRange = -1.0; + g_esLagSpecial[iIndex].g_flLagRangeChance = -1.0; + g_esLagSpecial[iIndex].g_iLagRangeCooldown = -1; + g_esLagSpecial[iIndex].g_iLagSight = -1; + } + } + case 3: + { + for (int iPlayer = 1; iPlayer <= MaxClients; iPlayer++) + { + g_esLagPlayer[iPlayer].g_iAccessFlags = -1; + g_esLagPlayer[iPlayer].g_iImmunityFlags = -1; + g_esLagPlayer[iPlayer].g_flCloseAreasOnly = -1.0; + g_esLagPlayer[iPlayer].g_iComboAbility = -1; + g_esLagPlayer[iPlayer].g_iHumanAbility = -1; + g_esLagPlayer[iPlayer].g_iHumanAmmo = -1; + g_esLagPlayer[iPlayer].g_iHumanCooldown = -1; + g_esLagPlayer[iPlayer].g_iHumanRangeCooldown = -1; + g_esLagPlayer[iPlayer].g_flOpenAreasOnly = -1.0; + g_esLagPlayer[iPlayer].g_iRequiresHumans = -1; + g_esLagPlayer[iPlayer].g_iLagAbility = -1; + g_esLagPlayer[iPlayer].g_iLagEffect = -1; + g_esLagPlayer[iPlayer].g_iLagMessage = -1; + g_esLagPlayer[iPlayer].g_flLagChance = -1.0; + g_esLagPlayer[iPlayer].g_iLagCooldown = -1; + g_esLagPlayer[iPlayer].g_iLagDuration = -1; + g_esLagPlayer[iPlayer].g_iLagHit = -1; + g_esLagPlayer[iPlayer].g_iLagHitMode = -1; + g_esLagPlayer[iPlayer].g_flLagRange = -1.0; + g_esLagPlayer[iPlayer].g_flLagRangeChance = -1.0; + g_esLagPlayer[iPlayer].g_iLagRangeCooldown = -1; + g_esLagPlayer[iPlayer].g_iLagSight = -1; + + g_esLagTeammate[iPlayer].g_flCloseAreasOnly = -1.0; + g_esLagTeammate[iPlayer].g_iComboAbility = -1; + g_esLagTeammate[iPlayer].g_iHumanAbility = -1; + g_esLagTeammate[iPlayer].g_iHumanAmmo = -1; + g_esLagTeammate[iPlayer].g_iHumanCooldown = -1; + g_esLagTeammate[iPlayer].g_iHumanRangeCooldown = -1; + g_esLagTeammate[iPlayer].g_flOpenAreasOnly = -1.0; + g_esLagTeammate[iPlayer].g_iRequiresHumans = -1; + g_esLagTeammate[iPlayer].g_iLagAbility = -1; + g_esLagTeammate[iPlayer].g_iLagEffect = -1; + g_esLagTeammate[iPlayer].g_iLagMessage = -1; + g_esLagTeammate[iPlayer].g_flLagChance = -1.0; + g_esLagTeammate[iPlayer].g_iLagCooldown = -1; + g_esLagTeammate[iPlayer].g_iLagDuration = -1; + g_esLagTeammate[iPlayer].g_iLagHit = -1; + g_esLagTeammate[iPlayer].g_iLagHitMode = -1; + g_esLagTeammate[iPlayer].g_flLagRange = -1.0; + g_esLagTeammate[iPlayer].g_flLagRangeChance = -1.0; + g_esLagTeammate[iPlayer].g_iLagRangeCooldown = -1; + g_esLagTeammate[iPlayer].g_iLagSight = -1; + } + } + } +} + +#if defined MT_ABILITIES_MAIN2 +void vLagConfigsLoaded(const char[] subsection, const char[] key, const char[] value, int type, int admin, int mode, bool special, const char[] specsection) +#else +public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const char[] value, int type, int admin, int mode, bool special, const char[] specsection) +#endif +{ + if ((mode == -1 || mode == 3) && bIsValidClient(admin)) + { + if (special && specsection[0] != '\0') + { + g_esLagTeammate[admin].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esLagTeammate[admin].g_flCloseAreasOnly, value, -1.0, 99999.0); + g_esLagTeammate[admin].g_iComboAbility = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "ComboAbility", "Combo Ability", "Combo_Ability", "combo", g_esLagTeammate[admin].g_iComboAbility, value, -1, 1); + g_esLagTeammate[admin].g_iHumanAbility = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esLagTeammate[admin].g_iHumanAbility, value, -1, 2); + g_esLagTeammate[admin].g_iHumanAmmo = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esLagTeammate[admin].g_iHumanAmmo, value, -1, 99999); + g_esLagTeammate[admin].g_iHumanCooldown = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esLagTeammate[admin].g_iHumanCooldown, value, -1, 99999); + g_esLagTeammate[admin].g_iHumanRangeCooldown = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "HumanRangeCooldown", "Human Range Cooldown", "Human_Range_Cooldown", "hrangecooldown", g_esLagTeammate[admin].g_iHumanRangeCooldown, value, -1, 99999); + g_esLagTeammate[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esLagTeammate[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); + g_esLagTeammate[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esLagTeammate[admin].g_iRequiresHumans, value, -1, 32); + g_esLagTeammate[admin].g_iLagAbility = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esLagTeammate[admin].g_iLagAbility, value, -1, 1); + g_esLagTeammate[admin].g_iLagEffect = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "AbilityEffect", "Ability Effect", "Ability_Effect", "effect", g_esLagTeammate[admin].g_iLagEffect, value, -1, 7); + g_esLagTeammate[admin].g_iLagMessage = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esLagTeammate[admin].g_iLagMessage, value, -1, 3); + g_esLagTeammate[admin].g_iLagSight = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "AbilitySight", "Ability Sight", "Ability_Sight", "sight", g_esLagTeammate[admin].g_iLagSight, value, -1, 5); + g_esLagTeammate[admin].g_flLagChance = flGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "LagChance", "Lag Chance", "Lag_Chance", "chance", g_esLagTeammate[admin].g_flLagChance, value, -1.0, 100.0); + g_esLagTeammate[admin].g_iLagCooldown = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "LagCooldown", "Lag Cooldown", "Lag_Cooldown", "cooldown", g_esLagTeammate[admin].g_iLagCooldown, value, -1, 99999); + g_esLagTeammate[admin].g_iLagDuration = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "LagDuration", "Lag Duration", "Lag_Duration", "duration", g_esLagTeammate[admin].g_iLagDuration, value, -1, 99999); + g_esLagTeammate[admin].g_iLagHit = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "LagHit", "Lag Hit", "Lag_Hit", "hit", g_esLagTeammate[admin].g_iLagHit, value, -1, 1); + g_esLagTeammate[admin].g_iLagHitMode = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "LagHitMode", "Lag Hit Mode", "Lag_Hit_Mode", "hitmode", g_esLagTeammate[admin].g_iLagHitMode, value, -1, 2); + g_esLagTeammate[admin].g_flLagRange = flGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "LagRange", "Lag Range", "Lag_Range", "range", g_esLagTeammate[admin].g_flLagRange, value, -1.0, 99999.0); + g_esLagTeammate[admin].g_flLagRangeChance = flGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "LagRangeChance", "Lag Range Chance", "Lag_Range_Chance", "rangechance", g_esLagTeammate[admin].g_flLagRangeChance, value, -1.0, 100.0); + g_esLagTeammate[admin].g_iLagRangeCooldown = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "LagRangeCooldown", "Lag Range Cooldown", "Lag_Range_Cooldown", "rangecooldown", g_esLagTeammate[admin].g_iLagRangeCooldown, value, -1, 99999); + } + else + { + g_esLagPlayer[admin].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esLagPlayer[admin].g_flCloseAreasOnly, value, -1.0, 99999.0); + g_esLagPlayer[admin].g_iComboAbility = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "ComboAbility", "Combo Ability", "Combo_Ability", "combo", g_esLagPlayer[admin].g_iComboAbility, value, -1, 1); + g_esLagPlayer[admin].g_iHumanAbility = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esLagPlayer[admin].g_iHumanAbility, value, -1, 2); + g_esLagPlayer[admin].g_iHumanAmmo = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esLagPlayer[admin].g_iHumanAmmo, value, -1, 99999); + g_esLagPlayer[admin].g_iHumanCooldown = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esLagPlayer[admin].g_iHumanCooldown, value, -1, 99999); + g_esLagPlayer[admin].g_iHumanRangeCooldown = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "HumanRangeCooldown", "Human Range Cooldown", "Human_Range_Cooldown", "hrangecooldown", g_esLagPlayer[admin].g_iHumanRangeCooldown, value, -1, 99999); + g_esLagPlayer[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esLagPlayer[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); + g_esLagPlayer[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esLagPlayer[admin].g_iRequiresHumans, value, -1, 32); + g_esLagPlayer[admin].g_iLagAbility = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esLagPlayer[admin].g_iLagAbility, value, -1, 1); + g_esLagPlayer[admin].g_iLagEffect = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "AbilityEffect", "Ability Effect", "Ability_Effect", "effect", g_esLagPlayer[admin].g_iLagEffect, value, -1, 7); + g_esLagPlayer[admin].g_iLagMessage = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esLagPlayer[admin].g_iLagMessage, value, -1, 3); + g_esLagPlayer[admin].g_iLagSight = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "AbilitySight", "Ability Sight", "Ability_Sight", "sight", g_esLagPlayer[admin].g_iLagSight, value, -1, 5); + g_esLagPlayer[admin].g_flLagChance = flGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "LagChance", "Lag Chance", "Lag_Chance", "chance", g_esLagPlayer[admin].g_flLagChance, value, -1.0, 100.0); + g_esLagPlayer[admin].g_iLagCooldown = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "LagCooldown", "Lag Cooldown", "Lag_Cooldown", "cooldown", g_esLagPlayer[admin].g_iLagCooldown, value, -1, 99999); + g_esLagPlayer[admin].g_iLagDuration = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "LagDuration", "Lag Duration", "Lag_Duration", "duration", g_esLagPlayer[admin].g_iLagDuration, value, -1, 99999); + g_esLagPlayer[admin].g_iLagHit = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "LagHit", "Lag Hit", "Lag_Hit", "hit", g_esLagPlayer[admin].g_iLagHit, value, -1, 1); + g_esLagPlayer[admin].g_iLagHitMode = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "LagHitMode", "Lag Hit Mode", "Lag_Hit_Mode", "hitmode", g_esLagPlayer[admin].g_iLagHitMode, value, -1, 2); + g_esLagPlayer[admin].g_flLagRange = flGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "LagRange", "Lag Range", "Lag_Range", "range", g_esLagPlayer[admin].g_flLagRange, value, -1.0, 99999.0); + g_esLagPlayer[admin].g_flLagRangeChance = flGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "LagRangeChance", "Lag Range Chance", "Lag_Range_Chance", "rangechance", g_esLagPlayer[admin].g_flLagRangeChance, value, -1.0, 100.0); + g_esLagPlayer[admin].g_iLagRangeCooldown = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "LagRangeCooldown", "Lag Range Cooldown", "Lag_Range_Cooldown", "rangecooldown", g_esLagPlayer[admin].g_iLagRangeCooldown, value, -1, 99999); + g_esLagPlayer[admin].g_iAccessFlags = iGetAdminFlagsValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "AccessFlags", "Access Flags", "Access_Flags", "access", value); + g_esLagPlayer[admin].g_iImmunityFlags = iGetAdminFlagsValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "ImmunityFlags", "Immunity Flags", "Immunity_Flags", "immunity", value); + } + } + + if (mode < 3 && type > 0) + { + if (special && specsection[0] != '\0') + { + g_esLagSpecial[type].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esLagSpecial[type].g_flCloseAreasOnly, value, -1.0, 99999.0); + g_esLagSpecial[type].g_iComboAbility = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "ComboAbility", "Combo Ability", "Combo_Ability", "combo", g_esLagSpecial[type].g_iComboAbility, value, -1, 1); + g_esLagSpecial[type].g_iHumanAbility = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esLagSpecial[type].g_iHumanAbility, value, -1, 2); + g_esLagSpecial[type].g_iHumanAmmo = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esLagSpecial[type].g_iHumanAmmo, value, -1, 99999); + g_esLagSpecial[type].g_iHumanCooldown = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esLagSpecial[type].g_iHumanCooldown, value, -1, 99999); + g_esLagSpecial[type].g_iHumanRangeCooldown = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "HumanRangeCooldown", "Human Range Cooldown", "Human_Range_Cooldown", "hrangecooldown", g_esLagSpecial[type].g_iHumanRangeCooldown, value, -1, 99999); + g_esLagSpecial[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esLagSpecial[type].g_flOpenAreasOnly, value, -1.0, 99999.0); + g_esLagSpecial[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esLagSpecial[type].g_iRequiresHumans, value, -1, 32); + g_esLagSpecial[type].g_iLagAbility = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esLagSpecial[type].g_iLagAbility, value, -1, 1); + g_esLagSpecial[type].g_iLagEffect = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "AbilityEffect", "Ability Effect", "Ability_Effect", "effect", g_esLagSpecial[type].g_iLagEffect, value, -1, 7); + g_esLagSpecial[type].g_iLagMessage = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esLagSpecial[type].g_iLagMessage, value, -1, 3); + g_esLagSpecial[type].g_iLagSight = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "AbilitySight", "Ability Sight", "Ability_Sight", "sight", g_esLagSpecial[type].g_iLagSight, value, -1, 5); + g_esLagSpecial[type].g_flLagChance = flGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "LagChance", "Lag Chance", "Lag_Chance", "chance", g_esLagSpecial[type].g_flLagChance, value, -1.0, 100.0); + g_esLagSpecial[type].g_iLagCooldown = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "LagCooldown", "Lag Cooldown", "Lag_Cooldown", "cooldown", g_esLagSpecial[type].g_iLagCooldown, value, -1, 99999); + g_esLagSpecial[type].g_iLagDuration = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "LagDuration", "Lag Duration", "Lag_Duration", "duration", g_esLagSpecial[type].g_iLagDuration, value, -1, 99999); + g_esLagSpecial[type].g_iLagHit = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "LagHit", "Lag Hit", "Lag_Hit", "hit", g_esLagSpecial[type].g_iLagHit, value, -1, 1); + g_esLagSpecial[type].g_iLagHitMode = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "LagHitMode", "Lag Hit Mode", "Lag_Hit_Mode", "hitmode", g_esLagSpecial[type].g_iLagHitMode, value, -1, 2); + g_esLagSpecial[type].g_flLagRange = flGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "LagRange", "Lag Range", "Lag_Range", "range", g_esLagSpecial[type].g_flLagRange, value, -1.0, 99999.0); + g_esLagSpecial[type].g_flLagRangeChance = flGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "LagRangeChance", "Lag Range Chance", "Lag_Range_Chance", "rangechance", g_esLagSpecial[type].g_flLagRangeChance, value, -1.0, 100.0); + g_esLagSpecial[type].g_iLagRangeCooldown = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "LagRangeCooldown", "Lag Range Cooldown", "Lag_Range_Cooldown", "rangecooldown", g_esLagSpecial[type].g_iLagRangeCooldown, value, -1, 99999); + } + else + { + g_esLagAbility[type].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esLagAbility[type].g_flCloseAreasOnly, value, -1.0, 99999.0); + g_esLagAbility[type].g_iComboAbility = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "ComboAbility", "Combo Ability", "Combo_Ability", "combo", g_esLagAbility[type].g_iComboAbility, value, -1, 1); + g_esLagAbility[type].g_iHumanAbility = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esLagAbility[type].g_iHumanAbility, value, -1, 2); + g_esLagAbility[type].g_iHumanAmmo = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esLagAbility[type].g_iHumanAmmo, value, -1, 99999); + g_esLagAbility[type].g_iHumanCooldown = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esLagAbility[type].g_iHumanCooldown, value, -1, 99999); + g_esLagAbility[type].g_iHumanRangeCooldown = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "HumanRangeCooldown", "Human Range Cooldown", "Human_Range_Cooldown", "hrangecooldown", g_esLagAbility[type].g_iHumanRangeCooldown, value, -1, 99999); + g_esLagAbility[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esLagAbility[type].g_flOpenAreasOnly, value, -1.0, 99999.0); + g_esLagAbility[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esLagAbility[type].g_iRequiresHumans, value, -1, 32); + g_esLagAbility[type].g_iLagAbility = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esLagAbility[type].g_iLagAbility, value, -1, 1); + g_esLagAbility[type].g_iLagEffect = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "AbilityEffect", "Ability Effect", "Ability_Effect", "effect", g_esLagAbility[type].g_iLagEffect, value, -1, 7); + g_esLagAbility[type].g_iLagMessage = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esLagAbility[type].g_iLagMessage, value, -1, 3); + g_esLagAbility[type].g_iLagSight = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "AbilitySight", "Ability Sight", "Ability_Sight", "sight", g_esLagAbility[type].g_iLagSight, value, -1, 5); + g_esLagAbility[type].g_flLagChance = flGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "LagChance", "Lag Chance", "Lag_Chance", "chance", g_esLagAbility[type].g_flLagChance, value, -1.0, 100.0); + g_esLagAbility[type].g_iLagCooldown = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "LagCooldown", "Lag Cooldown", "Lag_Cooldown", "cooldown", g_esLagAbility[type].g_iLagCooldown, value, -1, 99999); + g_esLagAbility[type].g_iLagDuration = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "LagDuration", "Lag Duration", "Lag_Duration", "duration", g_esLagAbility[type].g_iLagDuration, value, -1, 99999); + g_esLagAbility[type].g_iLagHit = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "LagHit", "Lag Hit", "Lag_Hit", "hit", g_esLagAbility[type].g_iLagHit, value, -1, 1); + g_esLagAbility[type].g_iLagHitMode = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "LagHitMode", "Lag Hit Mode", "Lag_Hit_Mode", "hitmode", g_esLagAbility[type].g_iLagHitMode, value, -1, 2); + g_esLagAbility[type].g_flLagRange = flGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "LagRange", "Lag Range", "Lag_Range", "range", g_esLagAbility[type].g_flLagRange, value, -1.0, 99999.0); + g_esLagAbility[type].g_flLagRangeChance = flGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "LagRangeChance", "Lag Range Chance", "Lag_Range_Chance", "rangechance", g_esLagAbility[type].g_flLagRangeChance, value, -1.0, 100.0); + g_esLagAbility[type].g_iLagRangeCooldown = iGetKeyValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "LagRangeCooldown", "Lag Range Cooldown", "Lag_Range_Cooldown", "rangecooldown", g_esLagAbility[type].g_iLagRangeCooldown, value, -1, 99999); + g_esLagAbility[type].g_iAccessFlags = iGetAdminFlagsValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "AccessFlags", "Access Flags", "Access_Flags", "access", value); + g_esLagAbility[type].g_iImmunityFlags = iGetAdminFlagsValue(subsection, MT_LAG_SECTION, MT_LAG_SECTION2, MT_LAG_SECTION3, MT_LAG_SECTION4, key, "ImmunityFlags", "Immunity Flags", "Immunity_Flags", "immunity", value); + } + } +} + +#if defined MT_ABILITIES_MAIN2 +void vLagSettingsCached(int tank, bool apply, int type) +#else +public void MT_OnSettingsCached(int tank, bool apply, int type) +#endif +{ + bool bHuman = bIsValidClient(tank, MT_CHECK_FAKECLIENT); + g_esLagPlayer[tank].g_iTankTypeRecorded = apply ? MT_GetRecordedTankType(tank, type) : 0; + g_esLagPlayer[tank].g_iTankType = apply ? type : 0; + int iType = g_esLagPlayer[tank].g_iTankTypeRecorded; + + if (bIsSpecialInfected(tank, MT_CHECK_INDEX|MT_CHECK_INGAME)) + { + g_esLagCache[tank].g_flCloseAreasOnly = flGetSubSettingValue(apply, bHuman, g_esLagTeammate[tank].g_flCloseAreasOnly, g_esLagPlayer[tank].g_flCloseAreasOnly, g_esLagSpecial[iType].g_flCloseAreasOnly, g_esLagAbility[iType].g_flCloseAreasOnly, 1); + g_esLagCache[tank].g_iComboAbility = iGetSubSettingValue(apply, bHuman, g_esLagTeammate[tank].g_iComboAbility, g_esLagPlayer[tank].g_iComboAbility, g_esLagSpecial[iType].g_iComboAbility, g_esLagAbility[iType].g_iComboAbility, 1); + g_esLagCache[tank].g_flLagChance = flGetSubSettingValue(apply, bHuman, g_esLagTeammate[tank].g_flLagChance, g_esLagPlayer[tank].g_flLagChance, g_esLagSpecial[iType].g_flLagChance, g_esLagAbility[iType].g_flLagChance, 1); + g_esLagCache[tank].g_flLagRange = flGetSubSettingValue(apply, bHuman, g_esLagTeammate[tank].g_flLagRange, g_esLagPlayer[tank].g_flLagRange, g_esLagSpecial[iType].g_flLagRange, g_esLagAbility[iType].g_flLagRange, 1); + g_esLagCache[tank].g_flLagRangeChance = flGetSubSettingValue(apply, bHuman, g_esLagTeammate[tank].g_flLagRangeChance, g_esLagPlayer[tank].g_flLagRangeChance, g_esLagSpecial[iType].g_flLagRangeChance, g_esLagAbility[iType].g_flLagRangeChance, 1); + g_esLagCache[tank].g_iHumanAbility = iGetSubSettingValue(apply, bHuman, g_esLagTeammate[tank].g_iHumanAbility, g_esLagPlayer[tank].g_iHumanAbility, g_esLagSpecial[iType].g_iHumanAbility, g_esLagAbility[iType].g_iHumanAbility, 1); + g_esLagCache[tank].g_iHumanAmmo = iGetSubSettingValue(apply, bHuman, g_esLagTeammate[tank].g_iHumanAmmo, g_esLagPlayer[tank].g_iHumanAmmo, g_esLagSpecial[iType].g_iHumanAmmo, g_esLagAbility[iType].g_iHumanAmmo, 1); + g_esLagCache[tank].g_iHumanCooldown = iGetSubSettingValue(apply, bHuman, g_esLagTeammate[tank].g_iHumanCooldown, g_esLagPlayer[tank].g_iHumanCooldown, g_esLagSpecial[iType].g_iHumanCooldown, g_esLagAbility[iType].g_iHumanCooldown, 1); + g_esLagCache[tank].g_iHumanRangeCooldown = iGetSubSettingValue(apply, bHuman, g_esLagTeammate[tank].g_iHumanRangeCooldown, g_esLagPlayer[tank].g_iHumanRangeCooldown, g_esLagSpecial[iType].g_iHumanRangeCooldown, g_esLagAbility[iType].g_iHumanRangeCooldown, 1); + g_esLagCache[tank].g_iLagAbility = iGetSubSettingValue(apply, bHuman, g_esLagTeammate[tank].g_iLagAbility, g_esLagPlayer[tank].g_iLagAbility, g_esLagSpecial[iType].g_iLagAbility, g_esLagAbility[iType].g_iLagAbility, 1); + g_esLagCache[tank].g_iLagCooldown = iGetSubSettingValue(apply, bHuman, g_esLagTeammate[tank].g_iLagCooldown, g_esLagPlayer[tank].g_iLagCooldown, g_esLagSpecial[iType].g_iLagCooldown, g_esLagAbility[iType].g_iLagCooldown, 1); + g_esLagCache[tank].g_iLagDuration = iGetSubSettingValue(apply, bHuman, g_esLagTeammate[tank].g_iLagDuration, g_esLagPlayer[tank].g_iLagDuration, g_esLagSpecial[iType].g_iLagDuration, g_esLagAbility[iType].g_iLagDuration, 1); + g_esLagCache[tank].g_iLagEffect = iGetSubSettingValue(apply, bHuman, g_esLagTeammate[tank].g_iLagEffect, g_esLagPlayer[tank].g_iLagEffect, g_esLagSpecial[iType].g_iLagEffect, g_esLagAbility[iType].g_iLagEffect, 1); + g_esLagCache[tank].g_iLagHit = iGetSubSettingValue(apply, bHuman, g_esLagTeammate[tank].g_iLagHit, g_esLagPlayer[tank].g_iLagHit, g_esLagSpecial[iType].g_iLagHit, g_esLagAbility[iType].g_iLagHit, 1); + g_esLagCache[tank].g_iLagMessage = iGetSubSettingValue(apply, bHuman, g_esLagTeammate[tank].g_iLagMessage, g_esLagPlayer[tank].g_iLagMessage, g_esLagSpecial[iType].g_iLagMessage, g_esLagAbility[iType].g_iLagMessage, 1); + g_esLagCache[tank].g_iLagHitMode = iGetSubSettingValue(apply, bHuman, g_esLagTeammate[tank].g_iLagHitMode, g_esLagPlayer[tank].g_iLagHitMode, g_esLagSpecial[iType].g_iLagHitMode, g_esLagAbility[iType].g_iLagHitMode, 1); + g_esLagCache[tank].g_iLagRangeCooldown = iGetSubSettingValue(apply, bHuman, g_esLagTeammate[tank].g_iLagRangeCooldown, g_esLagPlayer[tank].g_iLagRangeCooldown, g_esLagSpecial[iType].g_iLagRangeCooldown, g_esLagAbility[iType].g_iLagRangeCooldown, 1); + g_esLagCache[tank].g_iLagSight = iGetSubSettingValue(apply, bHuman, g_esLagTeammate[tank].g_iLagSight, g_esLagPlayer[tank].g_iLagSight, g_esLagSpecial[iType].g_iLagSight, g_esLagAbility[iType].g_iLagSight, 1); + g_esLagCache[tank].g_flOpenAreasOnly = flGetSubSettingValue(apply, bHuman, g_esLagTeammate[tank].g_flOpenAreasOnly, g_esLagPlayer[tank].g_flOpenAreasOnly, g_esLagSpecial[iType].g_flOpenAreasOnly, g_esLagAbility[iType].g_flOpenAreasOnly, 1); + g_esLagCache[tank].g_iRequiresHumans = iGetSubSettingValue(apply, bHuman, g_esLagTeammate[tank].g_iRequiresHumans, g_esLagPlayer[tank].g_iRequiresHumans, g_esLagSpecial[iType].g_iRequiresHumans, g_esLagAbility[iType].g_iRequiresHumans, 1); + } + else + { + g_esLagCache[tank].g_flCloseAreasOnly = flGetSettingValue(apply, bHuman, g_esLagPlayer[tank].g_flCloseAreasOnly, g_esLagAbility[iType].g_flCloseAreasOnly, 1); + g_esLagCache[tank].g_iComboAbility = iGetSettingValue(apply, bHuman, g_esLagPlayer[tank].g_iComboAbility, g_esLagAbility[iType].g_iComboAbility, 1); + g_esLagCache[tank].g_flLagChance = flGetSettingValue(apply, bHuman, g_esLagPlayer[tank].g_flLagChance, g_esLagAbility[iType].g_flLagChance, 1); + g_esLagCache[tank].g_flLagRange = flGetSettingValue(apply, bHuman, g_esLagPlayer[tank].g_flLagRange, g_esLagAbility[iType].g_flLagRange, 1); + g_esLagCache[tank].g_flLagRangeChance = flGetSettingValue(apply, bHuman, g_esLagPlayer[tank].g_flLagRangeChance, g_esLagAbility[iType].g_flLagRangeChance, 1); + g_esLagCache[tank].g_iHumanAbility = iGetSettingValue(apply, bHuman, g_esLagPlayer[tank].g_iHumanAbility, g_esLagAbility[iType].g_iHumanAbility, 1); + g_esLagCache[tank].g_iHumanAmmo = iGetSettingValue(apply, bHuman, g_esLagPlayer[tank].g_iHumanAmmo, g_esLagAbility[iType].g_iHumanAmmo, 1); + g_esLagCache[tank].g_iHumanCooldown = iGetSettingValue(apply, bHuman, g_esLagPlayer[tank].g_iHumanCooldown, g_esLagAbility[iType].g_iHumanCooldown, 1); + g_esLagCache[tank].g_iHumanRangeCooldown = iGetSettingValue(apply, bHuman, g_esLagPlayer[tank].g_iHumanRangeCooldown, g_esLagAbility[iType].g_iHumanRangeCooldown, 1); + g_esLagCache[tank].g_iLagAbility = iGetSettingValue(apply, bHuman, g_esLagPlayer[tank].g_iLagAbility, g_esLagAbility[iType].g_iLagAbility, 1); + g_esLagCache[tank].g_iLagCooldown = iGetSettingValue(apply, bHuman, g_esLagPlayer[tank].g_iLagCooldown, g_esLagAbility[iType].g_iLagCooldown, 1); + g_esLagCache[tank].g_iLagDuration = iGetSettingValue(apply, bHuman, g_esLagPlayer[tank].g_iLagDuration, g_esLagAbility[iType].g_iLagDuration, 1); + g_esLagCache[tank].g_iLagEffect = iGetSettingValue(apply, bHuman, g_esLagPlayer[tank].g_iLagEffect, g_esLagAbility[iType].g_iLagEffect, 1); + g_esLagCache[tank].g_iLagHit = iGetSettingValue(apply, bHuman, g_esLagPlayer[tank].g_iLagHit, g_esLagAbility[iType].g_iLagHit, 1); + g_esLagCache[tank].g_iLagMessage = iGetSettingValue(apply, bHuman, g_esLagPlayer[tank].g_iLagMessage, g_esLagAbility[iType].g_iLagMessage, 1); + g_esLagCache[tank].g_iLagHitMode = iGetSettingValue(apply, bHuman, g_esLagPlayer[tank].g_iLagHitMode, g_esLagAbility[iType].g_iLagHitMode, 1); + g_esLagCache[tank].g_iLagRangeCooldown = iGetSettingValue(apply, bHuman, g_esLagPlayer[tank].g_iLagRangeCooldown, g_esLagAbility[iType].g_iLagRangeCooldown, 1); + g_esLagCache[tank].g_iLagSight = iGetSettingValue(apply, bHuman, g_esLagPlayer[tank].g_iLagSight, g_esLagAbility[iType].g_iLagSight, 1); + g_esLagCache[tank].g_flOpenAreasOnly = flGetSettingValue(apply, bHuman, g_esLagPlayer[tank].g_flOpenAreasOnly, g_esLagAbility[iType].g_flOpenAreasOnly, 1); + g_esLagCache[tank].g_iRequiresHumans = iGetSettingValue(apply, bHuman, g_esLagPlayer[tank].g_iRequiresHumans, g_esLagAbility[iType].g_iRequiresHumans, 1); + } +} + +#if defined MT_ABILITIES_MAIN2 +void vLagCopyStats(int oldTank, int newTank) +#else +public void MT_OnCopyStats(int oldTank, int newTank) +#endif +{ + vLagCopyStats2(oldTank, newTank); + + if (oldTank != newTank) + { + vRemoveLag(oldTank); + } +} + +#if !defined MT_ABILITIES_MAIN2 +public void MT_OnPluginUpdate() +{ + MT_ReloadPlugin(null); +} +#endif + +#if defined MT_ABILITIES_MAIN2 +void vLagEventFired(Event event, const char[] name) +#else +public void MT_OnEventFired(Event event, const char[] name, bool dontBroadcast) +#endif +{ + if (StrEqual(name, "bot_player_replace")) + { + int iBotId = event.GetInt("bot"), iBot = GetClientOfUserId(iBotId), + iTankId = event.GetInt("player"), iTank = GetClientOfUserId(iTankId); + if (bIsValidClient(iBot) && bIsInfected(iTank)) + { + vLagCopyStats2(iBot, iTank); + vRemoveLag(iBot); + } + } + else if (StrEqual(name, "mission_lost") || StrEqual(name, "round_start") || StrEqual(name, "round_end")) + { + vLagReset(); + } + else if (StrEqual(name, "player_bot_replace")) + { + int iTankId = event.GetInt("player"), iTank = GetClientOfUserId(iTankId), + iBotId = event.GetInt("bot"), iBot = GetClientOfUserId(iBotId); + if (bIsValidClient(iTank) && bIsInfected(iBot)) + { + vLagCopyStats2(iTank, iBot); + vRemoveLag(iTank); + } + } + else if (StrEqual(name, "player_death") || StrEqual(name, "player_spawn")) + { + int iTankId = event.GetInt("userid"), iTank = GetClientOfUserId(iTankId); + if (MT_IsTankSupported(iTank, MT_CHECK_INDEX|MT_CHECK_INGAME)) + { + vRemoveLag(iTank); + } + } + else if (StrEqual(name, "player_now_it")) + { + bool bExploded = event.GetBool("exploded"); + int iSurvivorId = event.GetInt("userid"), iSurvivor = GetClientOfUserId(iSurvivorId), + iBoomerId = event.GetInt("attacker"), iBoomer = GetClientOfUserId(iBoomerId); + if (bIsBoomer(iBoomer) && bIsSurvivor(iSurvivor) && !bExploded) + { + vLagHit(iSurvivor, iBoomer, GetRandomFloat(0.1, 100.0), g_esLagCache[iBoomer].g_flLagChance, g_esLagCache[iBoomer].g_iLagHit, MT_MESSAGE_RANGE, MT_ATTACK_RANGE); + } + } +} + +#if defined MT_ABILITIES_MAIN2 +void vLagAbilityActivated(int tank) +#else +public void MT_OnAbilityActivated(int tank) +#endif +{ + if (MT_IsTankSupported(tank, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_FAKECLIENT) && ((!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esLagAbility[g_esLagPlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esLagPlayer[tank].g_iAccessFlags)) || g_esLagCache[tank].g_iHumanAbility == 0)) + { + return; + } + + if (MT_IsTankSupported(tank) && (!bIsInfected(tank, MT_CHECK_FAKECLIENT) || g_esLagCache[tank].g_iHumanAbility != 1) && MT_IsCustomTankSupported(tank) && g_esLagCache[tank].g_iLagAbility == 1 && g_esLagCache[tank].g_iComboAbility == 0) + { + vLagAbility(tank, GetRandomFloat(0.1, 100.0)); + } +} + +#if defined MT_ABILITIES_MAIN2 +void vLagButtonPressed(int tank, int button) +#else +public void MT_OnButtonPressed(int tank, int button) +#endif +{ + if (MT_IsTankSupported(tank, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_ALIVE|MT_CHECK_FAKECLIENT) && MT_IsCustomTankSupported(tank)) + { + if (bIsAreaNarrow(tank, g_esLagCache[tank].g_flOpenAreasOnly) || bIsAreaWide(tank, g_esLagCache[tank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esLagPlayer[tank].g_iTankType, tank) || (g_esLagCache[tank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esLagCache[tank].g_iRequiresHumans) || (!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esLagAbility[g_esLagPlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esLagPlayer[tank].g_iAccessFlags))) + { + return; + } + + if ((button & MT_SUB_KEY) && g_esLagCache[tank].g_iLagAbility == 1 && g_esLagCache[tank].g_iHumanAbility == 1) + { + int iTime = GetTime(); + + switch (g_esLagPlayer[tank].g_iRangeCooldown == -1 || g_esLagPlayer[tank].g_iRangeCooldown <= iTime) + { + case true: vLagAbility(tank, GetRandomFloat(0.1, 100.0)); + case false: MT_PrintToChat(tank, "%s %t", MT_TAG3, "LagHuman3", (g_esLagPlayer[tank].g_iRangeCooldown - iTime)); + } + } + } +} + +#if defined MT_ABILITIES_MAIN2 +void vLagChangeType(int tank, int oldType) +#else +public void MT_OnChangeType(int tank, int oldType, int newType, bool revert) +#endif +{ + if (oldType <= 0) + { + return; + } + + vRemoveLag(tank); +} + +void vLagAbility(int tank, float random, int pos = -1) +{ + if (bIsAreaNarrow(tank, g_esLagCache[tank].g_flOpenAreasOnly) || bIsAreaWide(tank, g_esLagCache[tank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esLagPlayer[tank].g_iTankType, tank) || (g_esLagCache[tank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esLagCache[tank].g_iRequiresHumans) || (!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esLagAbility[g_esLagPlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esLagPlayer[tank].g_iAccessFlags))) + { + return; + } + + if (!bIsInfected(tank, MT_CHECK_FAKECLIENT) || (g_esLagPlayer[tank].g_iAmmoCount < g_esLagCache[tank].g_iHumanAmmo && g_esLagCache[tank].g_iHumanAmmo > 0)) + { + g_esLagPlayer[tank].g_bFailed = false; + g_esLagPlayer[tank].g_bNoAmmo = false; + + float flTankPos[3], flSurvivorPos[3]; + GetClientAbsOrigin(tank, flTankPos); + float flRange = (pos != -1) ? MT_GetCombinationSetting(tank, 9, pos) : g_esLagCache[tank].g_flLagRange, + flChance = (pos != -1) ? MT_GetCombinationSetting(tank, 10, pos) : g_esLagCache[tank].g_flLagRangeChance; + int iSurvivorCount = 0; + for (int iSurvivor = 1; iSurvivor <= MaxClients; iSurvivor++) + { + if (bIsSurvivor(iSurvivor, MT_CHECK_INGAME|MT_CHECK_ALIVE) && !MT_IsAdminImmune(iSurvivor, tank) && !bIsAdminImmune(iSurvivor, g_esLagPlayer[tank].g_iTankType, g_esLagAbility[g_esLagPlayer[tank].g_iTankTypeRecorded].g_iImmunityFlags, g_esLagPlayer[iSurvivor].g_iImmunityFlags)) + { + GetClientAbsOrigin(iSurvivor, flSurvivorPos); + if (GetVectorDistance(flTankPos, flSurvivorPos) <= flRange && bIsVisibleToPlayer(tank, iSurvivor, g_esLagCache[tank].g_iLagSight, .range = flRange)) + { + vLagHit(iSurvivor, tank, random, flChance, g_esLagCache[tank].g_iLagAbility, MT_MESSAGE_RANGE, MT_ATTACK_RANGE, pos); + + iSurvivorCount++; + } + } + } + + if (iSurvivorCount == 0) + { + if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esLagCache[tank].g_iHumanAbility == 1) + { + MT_PrintToChat(tank, "%s %t", MT_TAG3, "LagHuman4"); + } + } + } + else if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esLagCache[tank].g_iHumanAbility == 1) + { + MT_PrintToChat(tank, "%s %t", MT_TAG3, "LagAmmo"); + } +} + +void vLagHit(int survivor, int tank, float random, float chance, int enabled, int messages, int flags, int pos = -1) +{ + if (bIsAreaNarrow(tank, g_esLagCache[tank].g_flOpenAreasOnly) || bIsAreaWide(tank, g_esLagCache[tank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esLagPlayer[tank].g_iTankType, tank) || (g_esLagCache[tank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esLagCache[tank].g_iRequiresHumans) || (!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esLagAbility[g_esLagPlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esLagPlayer[tank].g_iAccessFlags)) || MT_IsAdminImmune(survivor, tank) || bIsAdminImmune(survivor, g_esLagPlayer[tank].g_iTankType, g_esLagAbility[g_esLagPlayer[tank].g_iTankTypeRecorded].g_iImmunityFlags, g_esLagPlayer[survivor].g_iImmunityFlags)) + { + return; + } + + int iTime = GetTime(); + if (((flags & MT_ATTACK_RANGE) && g_esLagPlayer[tank].g_iRangeCooldown != -1 && g_esLagPlayer[tank].g_iRangeCooldown >= iTime) || (((flags & MT_ATTACK_CLAW) || (flags & MT_ATTACK_MELEE)) && g_esLagPlayer[tank].g_iCooldown != -1 && g_esLagPlayer[tank].g_iCooldown >= iTime)) + { + return; + } + + if (enabled == 1 && bIsSurvivor(survivor) && !bIsSurvivorCaught(survivor) && !bIsSurvivorDisabled(survivor)) + { + if (!bIsInfected(tank, MT_CHECK_FAKECLIENT) || (flags & MT_ATTACK_CLAW) || (flags & MT_ATTACK_MELEE) || (g_esLagPlayer[tank].g_iAmmoCount < g_esLagCache[tank].g_iHumanAmmo && g_esLagCache[tank].g_iHumanAmmo > 0)) + { + if (random <= chance && !g_esLagPlayer[survivor].g_bAffected) + { + if ((messages & MT_MESSAGE_MELEE) && !bIsVisibleToPlayer(tank, survivor, g_esLagCache[tank].g_iLagSight, .range = 100.0)) + { + return; + } + + g_esLagPlayer[survivor].g_bAffected = true; + g_esLagPlayer[survivor].g_iOwner = tank; + + int iCooldown = -1; + if ((flags & MT_ATTACK_RANGE) && (g_esLagPlayer[tank].g_iRangeCooldown == -1 || g_esLagPlayer[tank].g_iRangeCooldown <= iTime)) + { + if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esLagCache[tank].g_iHumanAbility == 1) + { + g_esLagPlayer[tank].g_iAmmoCount++; + + MT_PrintToChat(tank, "%s %t", MT_TAG3, "LagHuman", g_esLagPlayer[tank].g_iAmmoCount, g_esLagCache[tank].g_iHumanAmmo); + } + + iCooldown = (pos != -1) ? RoundToNearest(MT_GetCombinationSetting(tank, 11, pos)) : g_esLagCache[tank].g_iLagRangeCooldown; + iCooldown = (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esLagCache[tank].g_iHumanAbility == 1 && g_esLagPlayer[tank].g_iAmmoCount < g_esLagCache[tank].g_iHumanAmmo && g_esLagCache[tank].g_iHumanAmmo > 0) ? g_esLagCache[tank].g_iHumanRangeCooldown : iCooldown; + g_esLagPlayer[tank].g_iRangeCooldown = (iTime + iCooldown); + if (g_esLagPlayer[tank].g_iRangeCooldown != -1 && g_esLagPlayer[tank].g_iRangeCooldown >= iTime) + { + MT_PrintToChat(tank, "%s %t", MT_TAG3, "LagHuman5", (g_esLagPlayer[tank].g_iRangeCooldown - iTime)); + } + } + else if (((flags & MT_ATTACK_CLAW) || (flags & MT_ATTACK_MELEE)) && (g_esLagPlayer[tank].g_iCooldown == -1 || g_esLagPlayer[tank].g_iCooldown <= iTime)) + { + iCooldown = (pos != -1) ? RoundToNearest(MT_GetCombinationSetting(tank, 2, pos)) : g_esLagCache[tank].g_iLagCooldown; + iCooldown = (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esLagCache[tank].g_iHumanAbility == 1) ? g_esLagCache[tank].g_iHumanCooldown : iCooldown; + g_esLagPlayer[tank].g_iCooldown = (iTime + iCooldown); + if (g_esLagPlayer[tank].g_iCooldown != -1 && g_esLagPlayer[tank].g_iCooldown >= iTime) + { + MT_PrintToChat(tank, "%s %t", MT_TAG3, "LagHuman5", (g_esLagPlayer[tank].g_iCooldown - iTime)); + } + } + + GetClientAbsOrigin(survivor, g_esLagPlayer[survivor].g_flLastPosition); + + int iSurvivorId = GetClientUserId(survivor), iTankId = GetClientUserId(tank); + DataPack dpLagTeleport; + CreateDataTimer(1.0, tTimerLagTeleport, dpLagTeleport, TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); + dpLagTeleport.WriteCell(iSurvivorId); + dpLagTeleport.WriteCell(iTankId); + dpLagTeleport.WriteCell(g_esLagPlayer[tank].g_iTankType); + dpLagTeleport.WriteCell(messages); + dpLagTeleport.WriteCell(enabled); + dpLagTeleport.WriteCell(pos); + dpLagTeleport.WriteCell(iTime); + + DataPack dpLagPosition; + CreateDataTimer(0.5, tTimerLagPosition, dpLagPosition, TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); + dpLagPosition.WriteCell(iSurvivorId); + dpLagPosition.WriteCell(iTankId); + dpLagPosition.WriteCell(g_esLagPlayer[tank].g_iTankType); + dpLagPosition.WriteCell(enabled); + dpLagPosition.WriteCell(pos); + dpLagPosition.WriteCell(iTime); + + vScreenEffect(survivor, tank, g_esLagCache[tank].g_iLagEffect, flags); + + if (g_esLagCache[tank].g_iLagMessage & messages) + { + char sTankName[64]; + MT_GetTankName(tank, sTankName); + MT_PrintToChatAll("%s %t", MT_TAG2, "Lag", sTankName, survivor); + MT_LogMessage(MT_LOG_ABILITY, "%s %T", MT_TAG, "Lag", LANG_SERVER, sTankName, survivor); + } + } + else if ((flags & MT_ATTACK_RANGE) && (g_esLagPlayer[tank].g_iRangeCooldown == -1 || g_esLagPlayer[tank].g_iRangeCooldown <= iTime)) + { + if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esLagCache[tank].g_iHumanAbility == 1 && !g_esLagPlayer[tank].g_bFailed) + { + g_esLagPlayer[tank].g_bFailed = true; + + MT_PrintToChat(tank, "%s %t", MT_TAG3, "LagHuman2"); + } + } + } + else if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esLagCache[tank].g_iHumanAbility == 1 && !g_esLagPlayer[tank].g_bNoAmmo) + { + g_esLagPlayer[tank].g_bNoAmmo = true; + + MT_PrintToChat(tank, "%s %t", MT_TAG3, "LagAmmo"); + } + } +} + +void vLagCopyStats2(int oldTank, int newTank) +{ + g_esLagPlayer[newTank].g_iAmmoCount = g_esLagPlayer[oldTank].g_iAmmoCount; + g_esLagPlayer[newTank].g_iCooldown = g_esLagPlayer[oldTank].g_iCooldown; + g_esLagPlayer[newTank].g_iRangeCooldown = g_esLagPlayer[oldTank].g_iRangeCooldown; +} + +void vRemoveLag(int tank) +{ + for (int iSurvivor = 1; iSurvivor <= MaxClients; iSurvivor++) + { + if (bIsSurvivor(iSurvivor, MT_CHECK_INGAME|MT_CHECK_ALIVE) && g_esLagPlayer[iSurvivor].g_bAffected && g_esLagPlayer[iSurvivor].g_iOwner == tank) + { + g_esLagPlayer[iSurvivor].g_bAffected = false; + g_esLagPlayer[iSurvivor].g_iOwner = -1; + } + } + + vLagReset3(tank); +} + +void vLagReset() +{ + for (int iPlayer = 1; iPlayer <= MaxClients; iPlayer++) + { + if (bIsValidClient(iPlayer, MT_CHECK_INGAME)) + { + vLagReset3(iPlayer); + + g_esLagPlayer[iPlayer].g_iOwner = -1; + } + } +} + +void vLagReset2(int survivor, int tank, int messages) +{ + g_esLagPlayer[survivor].g_bAffected = false; + g_esLagPlayer[survivor].g_iOwner = -1; + + if (g_esLagCache[tank].g_iLagMessage & messages) + { + MT_PrintToChatAll("%s %t", MT_TAG2, "Lag2", survivor); + MT_LogMessage(MT_LOG_ABILITY, "%s %T", MT_TAG, "Lag2", LANG_SERVER, survivor); + } +} + +void vLagReset3(int tank) +{ + g_esLagPlayer[tank].g_bAffected = false; + g_esLagPlayer[tank].g_bFailed = false; + g_esLagPlayer[tank].g_bNoAmmo = false; + g_esLagPlayer[tank].g_iAmmoCount = 0; + g_esLagPlayer[tank].g_iCooldown = -1; + g_esLagPlayer[tank].g_iRangeCooldown = -1; +} + +Action tTimerLagCombo(Handle timer, DataPack pack) +{ + pack.Reset(); + + int iTank = GetClientOfUserId(pack.ReadCell()); + if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esLagAbility[g_esLagPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esLagPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esLagPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esLagCache[iTank].g_iLagAbility == 0) + { + return Plugin_Stop; + } + + float flRandom = pack.ReadFloat(); + int iPos = pack.ReadCell(); + vLagAbility(iTank, flRandom, iPos); + + return Plugin_Continue; +} + +Action tTimerLagCombo2(Handle timer, DataPack pack) +{ + pack.Reset(); + + int iSurvivor = GetClientOfUserId(pack.ReadCell()); + if (!bIsSurvivor(iSurvivor) || g_esLagPlayer[iSurvivor].g_bAffected) + { + return Plugin_Stop; + } + + int iTank = GetClientOfUserId(pack.ReadCell()); + if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esLagAbility[g_esLagPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esLagPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esLagPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esLagCache[iTank].g_iLagHit == 0) + { + return Plugin_Stop; + } + + float flRandom = pack.ReadFloat(), flChance = pack.ReadFloat(); + int iPos = pack.ReadCell(); + char sClassname[32]; + pack.ReadString(sClassname, sizeof sClassname); + if ((g_esLagCache[iTank].g_iLagHitMode == 0 || g_esLagCache[iTank].g_iLagHitMode == 1) && (bIsSpecialInfected(iTank) || StrEqual(sClassname[7], "tank_claw") || StrEqual(sClassname, "tank_rock"))) + { + vLagHit(iSurvivor, iTank, flRandom, flChance, g_esLagCache[iTank].g_iLagHit, MT_MESSAGE_MELEE, MT_ATTACK_CLAW, iPos); + } + else if ((g_esLagCache[iTank].g_iLagHitMode == 0 || g_esLagCache[iTank].g_iLagHitMode == 2) && StrEqual(sClassname[7], "melee")) + { + vLagHit(iSurvivor, iTank, flRandom, flChance, g_esLagCache[iTank].g_iLagHit, MT_MESSAGE_MELEE, MT_ATTACK_MELEE, iPos); + } + + return Plugin_Continue; +} + +Action tTimerLagTeleport(Handle timer, DataPack pack) +{ + pack.Reset(); + + int iSurvivor = GetClientOfUserId(pack.ReadCell()); + if (!MT_IsCorePluginEnabled() || !bIsSurvivor(iSurvivor)) + { + g_esLagPlayer[iSurvivor].g_bAffected = false; + g_esLagPlayer[iSurvivor].g_iOwner = -1; + + return Plugin_Stop; + } + + int iTank = GetClientOfUserId(pack.ReadCell()), iType = pack.ReadCell(), iMessage = pack.ReadCell(); + if (!MT_IsTankSupported(iTank) || bIsAreaNarrow(iTank, g_esLagCache[iTank].g_flOpenAreasOnly) || bIsAreaWide(iTank, g_esLagCache[iTank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esLagPlayer[iTank].g_iTankType, iTank) || (g_esLagCache[iTank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esLagCache[iTank].g_iRequiresHumans) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esLagAbility[g_esLagPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esLagPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esLagPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || iType != g_esLagPlayer[iTank].g_iTankType || MT_IsAdminImmune(iSurvivor, iTank) || bIsAdminImmune(iSurvivor, g_esLagPlayer[iTank].g_iTankType, g_esLagAbility[g_esLagPlayer[iTank].g_iTankTypeRecorded].g_iImmunityFlags, g_esLagPlayer[iSurvivor].g_iImmunityFlags) || !g_esLagPlayer[iSurvivor].g_bAffected) + { + vLagReset2(iSurvivor, iTank, iMessage); + + return Plugin_Stop; + } + + int iLagEnabled = pack.ReadCell(), iPos = pack.ReadCell(), + iDuration = (iPos != -1) ? RoundToNearest(MT_GetCombinationSetting(iTank, 5, iPos)) : g_esLagCache[iTank].g_iLagDuration, + iTime = pack.ReadCell(); + if (iLagEnabled == 0 || (iTime + iDuration) <= GetTime()) + { + vLagReset2(iSurvivor, iTank, iMessage); + + return Plugin_Stop; + } + + if (!bIsVisibleToPlayer(iSurvivor, iTank, g_esLagCache[iTank].g_iLagSight)) + { + return Plugin_Continue; + } + + TeleportEntity(iSurvivor, g_esLagPlayer[iSurvivor].g_flLastPosition); + + return Plugin_Continue; +} + +Action tTimerLagPosition(Handle timer, DataPack pack) +{ + pack.Reset(); + + int iSurvivor = GetClientOfUserId(pack.ReadCell()); + if (!MT_IsCorePluginEnabled() || !bIsSurvivor(iSurvivor)) + { + return Plugin_Stop; + } + + int iTank = GetClientOfUserId(pack.ReadCell()), iType = pack.ReadCell(); + if (!MT_IsTankSupported(iTank) || bIsAreaNarrow(iTank, g_esLagCache[iTank].g_flOpenAreasOnly) || bIsAreaWide(iTank, g_esLagCache[iTank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esLagPlayer[iTank].g_iTankType, iTank) || (g_esLagCache[iTank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esLagCache[iTank].g_iRequiresHumans) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esLagAbility[g_esLagPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esLagPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esLagPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || iType != g_esLagPlayer[iTank].g_iTankType || MT_IsAdminImmune(iSurvivor, iTank) || bIsAdminImmune(iSurvivor, g_esLagPlayer[iTank].g_iTankType, g_esLagAbility[g_esLagPlayer[iTank].g_iTankTypeRecorded].g_iImmunityFlags, g_esLagPlayer[iSurvivor].g_iImmunityFlags)) + { + return Plugin_Stop; + } + + int iLagEnabled = pack.ReadCell(), iPos = pack.ReadCell(), + iDuration = (iPos != -1) ? RoundToNearest(MT_GetCombinationSetting(iTank, 5, iPos)) : g_esLagCache[iTank].g_iLagDuration, + iTime = pack.ReadCell(); + if (iLagEnabled == 0 || (iTime + iDuration) <= GetTime()) + { + return Plugin_Stop; + } + + GetClientAbsOrigin(iSurvivor, g_esLagPlayer[iSurvivor].g_flLastPosition); + + return Plugin_Continue; } \ No newline at end of file diff --git a/addons/sourcemod/scripting/mutant_tanks/abilities/mt_laser.sp b/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_laser.sp similarity index 95% rename from addons/sourcemod/scripting/mutant_tanks/abilities/mt_laser.sp rename to addons/sourcemod/scripting/mutant_tanks/abilities2/mt_laser.sp index ca30c94974..2e6500d395 100644 --- a/addons/sourcemod/scripting/mutant_tanks/abilities/mt_laser.sp +++ b/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_laser.sp @@ -1,1148 +1,1174 @@ -/** - * Mutant Tanks: a L4D/L4D2 SourceMod Plugin - * Copyright (C) 2024 Alfred "Psyk0tik" Llagas - * - * 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 . - **/ - -#define MT_LASER_COMPILE_METHOD 0 // 0: packaged, 1: standalone - -#if !defined MT_ABILITIES_MAIN - #if MT_LASER_COMPILE_METHOD == 1 - #include - #include - #else - #error This file must be inside "scripting/mutant_tanks/abilities" while compiling "mt_abilities.sp" to include its content. - #endif -public Plugin myinfo = -{ - name = "[MT] Laser Ability", - author = MT_AUTHOR, - description = "The Mutant Tank shoots lasers at survivors.", - version = MT_VERSION, - url = MT_URL -}; - -bool g_bDedicated, g_bSecondGame; - -public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max) -{ - switch (GetEngineVersion()) - { - case Engine_Left4Dead: g_bSecondGame = false; - case Engine_Left4Dead2: g_bSecondGame = true; - default: - { - strcopy(error, err_max, "\"[MT] Laser Ability\" only supports Left 4 Dead 1 & 2."); - - return APLRes_SilentFailure; - } - } - - g_bDedicated = IsDedicatedServer(); - - return APLRes_Success; -} - -#define PARTICLE_ELECTRICITY "electrical_arc_01_system" - -#define SOUND_ELECTRICITY "ambient/energy/zap5.wav" -#define SOUND_ELECTRICITY2 "ambient/energy/zap7.wav" - -#define SPRITE_LASER "sprites/laser.vmt" -#define SPRITE_LASERBEAM "sprites/laserbeam.vmt" -#else - #if MT_LASER_COMPILE_METHOD == 1 - #error This file must be compiled as a standalone plugin. - #endif -#endif - -#define MT_LASER_SECTION "laserability" -#define MT_LASER_SECTION2 "laser ability" -#define MT_LASER_SECTION3 "laser_ability" -#define MT_LASER_SECTION4 "laser" - -#define MT_MENU_LASER "Laser Ability" - -enum struct esLaserPlayer -{ - bool g_bActivated; - - float g_flCloseAreasOnly; - float g_flLaserChance; - float g_flLaserDamage; - float g_flLaserInterval; - float g_flLaserRange; - float g_flOpenAreasOnly; - - int g_iAccessFlags; - int g_iAmmoCount; - int g_iComboAbility; - int g_iCooldown; - int g_iHumanAbility; - int g_iHumanAmmo; - int g_iHumanCooldown; - int g_iHumanDuration; - int g_iHumanMode; - int g_iImmunityFlags; - int g_iLaserAbility; - int g_iLaserCooldown; - int g_iLaserDuration; - int g_iLaserMessage; - int g_iLaserMode; - int g_iLaserSight; - int g_iRequiresHumans; - int g_iTankType; - int g_iTankTypeRecorded; -} - -esLaserPlayer g_esLaserPlayer[MAXPLAYERS + 1]; - -enum struct esLaserTeammate -{ - float g_flCloseAreasOnly; - float g_flLaserChance; - float g_flLaserDamage; - float g_flLaserInterval; - float g_flLaserRange; - float g_flOpenAreasOnly; - - int g_iComboAbility; - int g_iHumanAbility; - int g_iHumanAmmo; - int g_iHumanCooldown; - int g_iHumanDuration; - int g_iHumanMode; - int g_iLaserAbility; - int g_iLaserCooldown; - int g_iLaserDuration; - int g_iLaserMessage; - int g_iLaserMode; - int g_iLaserSight; - int g_iRequiresHumans; -} - -esLaserTeammate g_esLaserTeammate[MAXPLAYERS + 1]; - -enum struct esLaserAbility -{ - float g_flCloseAreasOnly; - float g_flLaserChance; - float g_flLaserDamage; - float g_flLaserInterval; - float g_flLaserRange; - float g_flOpenAreasOnly; - - int g_iAccessFlags; - int g_iComboAbility; - int g_iComboPosition; - int g_iHumanAbility; - int g_iHumanAmmo; - int g_iHumanCooldown; - int g_iHumanDuration; - int g_iHumanMode; - int g_iImmunityFlags; - int g_iLaserAbility; - int g_iLaserCooldown; - int g_iLaserDuration; - int g_iLaserMessage; - int g_iLaserMode; - int g_iLaserSight; - int g_iRequiresHumans; -} - -esLaserAbility g_esLaserAbility[MT_MAXTYPES + 1]; - -enum struct esLaserSpecial -{ - float g_flCloseAreasOnly; - float g_flLaserChance; - float g_flLaserDamage; - float g_flLaserInterval; - float g_flLaserRange; - float g_flOpenAreasOnly; - - int g_iComboAbility; - int g_iHumanAbility; - int g_iHumanAmmo; - int g_iHumanCooldown; - int g_iHumanDuration; - int g_iHumanMode; - int g_iLaserAbility; - int g_iLaserCooldown; - int g_iLaserDuration; - int g_iLaserMessage; - int g_iLaserMode; - int g_iLaserSight; - int g_iRequiresHumans; -} - -esLaserSpecial g_esLaserSpecial[MT_MAXTYPES + 1]; - -enum struct esLaserCache -{ - float g_flCloseAreasOnly; - float g_flLaserChance; - float g_flLaserDamage; - float g_flLaserInterval; - float g_flLaserRange; - float g_flOpenAreasOnly; - - int g_iComboAbility; - int g_iHumanAbility; - int g_iHumanAmmo; - int g_iHumanCooldown; - int g_iHumanDuration; - int g_iHumanMode; - int g_iLaserAbility; - int g_iLaserCooldown; - int g_iLaserDuration; - int g_iLaserMessage; - int g_iLaserMode; - int g_iLaserSight; - int g_iRequiresHumans; -} - -esLaserCache g_esLaserCache[MAXPLAYERS + 1]; - -int g_iLaserSprite = -1; - -#if !defined MT_ABILITIES_MAIN -public void OnPluginStart() -{ - LoadTranslations("common.phrases"); - LoadTranslations("mutant_tanks.phrases"); - LoadTranslations("mutant_tanks_names.phrases"); - - RegConsoleCmd("sm_mt_laser", cmdLaserInfo, "View information about the Laser ability."); -} -#endif - -#if defined MT_ABILITIES_MAIN -void vLaserMapStart() -#else -public void OnMapStart() -#endif -{ - switch (g_bSecondGame) - { - case true: g_iLaserSprite = PrecacheModel(SPRITE_LASERBEAM, true); - case false: g_iLaserSprite = PrecacheModel(SPRITE_LASER, true); - } - - PrecacheSound(SOUND_ELECTRICITY, true); - PrecacheSound(SOUND_ELECTRICITY2, true); - - vLaserReset(); -} - -#if defined MT_ABILITIES_MAIN -void vLaserClientPutInServer(int client) -#else -public void OnClientPutInServer(int client) -#endif -{ - vRemoveLaser(client); -} - -#if defined MT_ABILITIES_MAIN -void vLaserClientDisconnect_Post(int client) -#else -public void OnClientDisconnect_Post(int client) -#endif -{ - vRemoveLaser(client); -} - -#if defined MT_ABILITIES_MAIN -void vLaserMapEnd() -#else -public void OnMapEnd() -#endif -{ - vLaserReset(); -} - -#if !defined MT_ABILITIES_MAIN -Action cmdLaserInfo(int client, int args) -{ - client = iGetListenServerHost(client, g_bDedicated); - - if (!MT_IsCorePluginEnabled()) - { - MT_ReplyToCommand(client, "%s %t", MT_TAG5, "PluginDisabled"); - - return Plugin_Handled; - } - - if (!bIsValidClient(client, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_FAKECLIENT)) - { - MT_ReplyToCommand(client, "%s %t", MT_TAG, "Command is in-game only"); - - return Plugin_Handled; - } - - switch (IsVoteInProgress()) - { - case true: MT_ReplyToCommand(client, "%s %t", MT_TAG2, "Vote in Progress"); - case false: vLaserMenu(client, MT_LASER_SECTION4, 0); - } - - return Plugin_Handled; -} -#endif - -void vLaserMenu(int client, const char[] name, int item) -{ - if (StrContains(MT_LASER_SECTION4, name, false) == -1) - { - return; - } - - Menu mAbilityMenu = new Menu(iLaserMenuHandler, MENU_ACTIONS_DEFAULT|MenuAction_Display|MenuAction_DisplayItem); - mAbilityMenu.SetTitle("Laser Ability Information"); - mAbilityMenu.AddItem("Status", "Status"); - mAbilityMenu.AddItem("Ammunition", "Ammunition"); - mAbilityMenu.AddItem("Buttons", "Buttons"); - mAbilityMenu.AddItem("Button Mode", "Button Mode"); - mAbilityMenu.AddItem("Cooldown", "Cooldown"); - mAbilityMenu.AddItem("Details", "Details"); - mAbilityMenu.AddItem("Duration", "Duration"); - mAbilityMenu.AddItem("Human Support", "Human Support"); - mAbilityMenu.DisplayAt(client, item, MENU_TIME_FOREVER); -} - -int iLaserMenuHandler(Menu menu, MenuAction action, int param1, int param2) -{ - switch (action) - { - case MenuAction_End: delete menu; - case MenuAction_Select: - { - switch (param2) - { - case 0: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esLaserCache[param1].g_iLaserAbility == 0) ? "AbilityStatus1" : "AbilityStatus2"); - case 1: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityAmmo", (g_esLaserCache[param1].g_iHumanAmmo - g_esLaserPlayer[param1].g_iAmmoCount), g_esLaserCache[param1].g_iHumanAmmo); - case 2: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtons"); - case 3: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esLaserCache[param1].g_iHumanMode == 0) ? "AbilityButtonMode1" : "AbilityButtonMode2"); - case 4: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityCooldown", ((g_esLaserCache[param1].g_iHumanAbility == 1) ? g_esLaserCache[param1].g_iHumanCooldown : g_esLaserCache[param1].g_iLaserCooldown)); - case 5: MT_PrintToChat(param1, "%s %t", MT_TAG3, "LaserDetails"); - case 6: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityDuration2", ((g_esLaserCache[param1].g_iHumanAbility == 1) ? g_esLaserCache[param1].g_iHumanDuration : g_esLaserCache[param1].g_iLaserDuration)); - case 7: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esLaserCache[param1].g_iHumanAbility == 0) ? "AbilityHumanSupport1" : "AbilityHumanSupport2"); - } - - if (bIsValidClient(param1, MT_CHECK_INGAME)) - { - vLaserMenu(param1, MT_LASER_SECTION4, menu.Selection); - } - } - case MenuAction_Display: - { - char sMenuTitle[PLATFORM_MAX_PATH]; - Panel pLaser = view_as(param2); - FormatEx(sMenuTitle, sizeof sMenuTitle, "%T", "LaserMenu", param1); - pLaser.SetTitle(sMenuTitle); - } - case MenuAction_DisplayItem: - { - if (param2 >= 0) - { - char sMenuOption[PLATFORM_MAX_PATH]; - - switch (param2) - { - case 0: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Status", param1); - case 1: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Ammunition", param1); - case 2: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Buttons", param1); - case 3: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "ButtonMode", param1); - case 4: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Cooldown", param1); - case 5: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Details", param1); - case 6: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Duration", param1); - case 7: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "HumanSupport", param1); - } - - return RedrawMenuItem(sMenuOption); - } - } - } - - return 0; -} - -#if defined MT_ABILITIES_MAIN -void vLaserDisplayMenu(Menu menu) -#else -public void MT_OnDisplayMenu(Menu menu) -#endif -{ - menu.AddItem(MT_MENU_LASER, MT_MENU_LASER); -} - -#if defined MT_ABILITIES_MAIN -void vLaserMenuItemSelected(int client, const char[] info) -#else -public void MT_OnMenuItemSelected(int client, const char[] info) -#endif -{ - if (StrEqual(info, MT_MENU_LASER, false)) - { - vLaserMenu(client, MT_LASER_SECTION4, 0); - } -} - -#if defined MT_ABILITIES_MAIN -void vLaserMenuItemDisplayed(int client, const char[] info, char[] buffer, int size) -#else -public void MT_OnMenuItemDisplayed(int client, const char[] info, char[] buffer, int size) -#endif -{ - if (StrEqual(info, MT_MENU_LASER, false)) - { - FormatEx(buffer, size, "%T", "LaserMenu2", client); - } -} - -#if defined MT_ABILITIES_MAIN -void vLaserPluginCheck(ArrayList list) -#else -public void MT_OnPluginCheck(ArrayList list) -#endif -{ - list.PushString(MT_MENU_LASER); -} - -#if defined MT_ABILITIES_MAIN -void vLaserAbilityCheck(ArrayList list, ArrayList list2, ArrayList list3, ArrayList list4) -#else -public void MT_OnAbilityCheck(ArrayList list, ArrayList list2, ArrayList list3, ArrayList list4) -#endif -{ - list.PushString(MT_LASER_SECTION); - list2.PushString(MT_LASER_SECTION2); - list3.PushString(MT_LASER_SECTION3); - list4.PushString(MT_LASER_SECTION4); -} - -#if defined MT_ABILITIES_MAIN -void vLaserCombineAbilities(int tank, int type, const float random, const char[] combo) -#else -public void MT_OnCombineAbilities(int tank, int type, const float random, const char[] combo, int survivor, int weapon, const char[] classname) -#endif -{ - if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esLaserCache[tank].g_iHumanAbility != 2) - { - g_esLaserAbility[g_esLaserPlayer[tank].g_iTankTypeRecorded].g_iComboPosition = -1; - - return; - } - - g_esLaserAbility[g_esLaserPlayer[tank].g_iTankTypeRecorded].g_iComboPosition = -1; - - char sCombo[320], sSet[4][32]; - FormatEx(sCombo, sizeof sCombo, ",%s,", combo); - FormatEx(sSet[0], sizeof sSet[], ",%s,", MT_LASER_SECTION); - FormatEx(sSet[1], sizeof sSet[], ",%s,", MT_LASER_SECTION2); - FormatEx(sSet[2], sizeof sSet[], ",%s,", MT_LASER_SECTION3); - FormatEx(sSet[3], sizeof sSet[], ",%s,", MT_LASER_SECTION4); - if (StrContains(sCombo, sSet[0], false) != -1 || StrContains(sCombo, sSet[1], false) != -1 || StrContains(sCombo, sSet[2], false) != -1 || StrContains(sCombo, sSet[3], false) != -1) - { - if (type == MT_COMBO_MAINRANGE && g_esLaserCache[tank].g_iLaserAbility == 1 && g_esLaserCache[tank].g_iComboAbility == 1 && !g_esLaserPlayer[tank].g_bActivated) - { - char sAbilities[320], sSubset[10][32]; - strcopy(sAbilities, sizeof sAbilities, combo); - ExplodeString(sAbilities, ",", sSubset, sizeof sSubset, sizeof sSubset[]); - - float flDelay = 0.0; - for (int iPos = 0; iPos < (sizeof sSubset); iPos++) - { - if (StrEqual(sSubset[iPos], MT_LASER_SECTION, false) || StrEqual(sSubset[iPos], MT_LASER_SECTION2, false) || StrEqual(sSubset[iPos], MT_LASER_SECTION3, false) || StrEqual(sSubset[iPos], MT_LASER_SECTION4, false)) - { - g_esLaserAbility[g_esLaserPlayer[tank].g_iTankTypeRecorded].g_iComboPosition = iPos; - - if (random <= MT_GetCombinationSetting(tank, 1, iPos)) - { - flDelay = MT_GetCombinationSetting(tank, 4, iPos); - - switch (flDelay) - { - case 0.0: vLaser(tank, iPos); - default: - { - DataPack dpCombo; - CreateDataTimer(flDelay, tTimerLaserCombo, dpCombo, TIMER_FLAG_NO_MAPCHANGE); - dpCombo.WriteCell(GetClientUserId(tank)); - dpCombo.WriteCell(iPos); - } - } - } - - break; - } - } - } - } -} - -#if defined MT_ABILITIES_MAIN -void vLaserConfigsLoad(int mode) -#else -public void MT_OnConfigsLoad(int mode) -#endif -{ - switch (mode) - { - case 1: - { - for (int iIndex = MT_GetMinType(); iIndex <= MT_GetMaxType(); iIndex++) - { - g_esLaserAbility[iIndex].g_iAccessFlags = 0; - g_esLaserAbility[iIndex].g_iImmunityFlags = 0; - g_esLaserAbility[iIndex].g_flCloseAreasOnly = 0.0; - g_esLaserAbility[iIndex].g_iComboAbility = 0; - g_esLaserAbility[iIndex].g_iComboPosition = -1; - g_esLaserAbility[iIndex].g_iHumanAbility = 0; - g_esLaserAbility[iIndex].g_iHumanAmmo = 5; - g_esLaserAbility[iIndex].g_iHumanCooldown = 0; - g_esLaserAbility[iIndex].g_iHumanDuration = 5; - g_esLaserAbility[iIndex].g_iHumanMode = 1; - g_esLaserAbility[iIndex].g_flOpenAreasOnly = 0.0; - g_esLaserAbility[iIndex].g_iRequiresHumans = 0; - g_esLaserAbility[iIndex].g_iLaserAbility = 0; - g_esLaserAbility[iIndex].g_iLaserMessage = 0; - g_esLaserAbility[iIndex].g_flLaserChance = 33.3; - g_esLaserAbility[iIndex].g_iLaserCooldown = 0; - g_esLaserAbility[iIndex].g_flLaserDamage = 5.0; - g_esLaserAbility[iIndex].g_iLaserDuration = 5; - g_esLaserAbility[iIndex].g_flLaserInterval = 1.0; - g_esLaserAbility[iIndex].g_iLaserMode = 0; - g_esLaserAbility[iIndex].g_flLaserRange = 500.0; - g_esLaserAbility[iIndex].g_iLaserSight = 0; - - g_esLaserSpecial[iIndex].g_flCloseAreasOnly = -1.0; - g_esLaserSpecial[iIndex].g_iComboAbility = -1; - g_esLaserSpecial[iIndex].g_iHumanAbility = -1; - g_esLaserSpecial[iIndex].g_iHumanAmmo = -1; - g_esLaserSpecial[iIndex].g_iHumanCooldown = -1; - g_esLaserSpecial[iIndex].g_iHumanDuration = -1; - g_esLaserSpecial[iIndex].g_iHumanMode = -1; - g_esLaserSpecial[iIndex].g_flOpenAreasOnly = -1.0; - g_esLaserSpecial[iIndex].g_iRequiresHumans = -1; - g_esLaserSpecial[iIndex].g_iLaserAbility = -1; - g_esLaserSpecial[iIndex].g_iLaserMessage = -1; - g_esLaserSpecial[iIndex].g_flLaserChance = -1.0; - g_esLaserSpecial[iIndex].g_iLaserCooldown = -1; - g_esLaserSpecial[iIndex].g_flLaserDamage = -1.0; - g_esLaserSpecial[iIndex].g_iLaserDuration = -1; - g_esLaserSpecial[iIndex].g_flLaserInterval = -1.0; - g_esLaserSpecial[iIndex].g_iLaserMode = -1; - g_esLaserSpecial[iIndex].g_flLaserRange = -1.0; - g_esLaserSpecial[iIndex].g_iLaserSight = -1; - } - } - case 3: - { - for (int iPlayer = 1; iPlayer <= MaxClients; iPlayer++) - { - g_esLaserPlayer[iPlayer].g_iAccessFlags = -1; - g_esLaserPlayer[iPlayer].g_iImmunityFlags = -1; - g_esLaserPlayer[iPlayer].g_flCloseAreasOnly = -1.0; - g_esLaserPlayer[iPlayer].g_iComboAbility = -1; - g_esLaserPlayer[iPlayer].g_iHumanAbility = -1; - g_esLaserPlayer[iPlayer].g_iHumanAmmo = -1; - g_esLaserPlayer[iPlayer].g_iHumanCooldown = -1; - g_esLaserPlayer[iPlayer].g_iHumanDuration = -1; - g_esLaserPlayer[iPlayer].g_iHumanMode = -1; - g_esLaserPlayer[iPlayer].g_flOpenAreasOnly = -1.0; - g_esLaserPlayer[iPlayer].g_iRequiresHumans = -1; - g_esLaserPlayer[iPlayer].g_iLaserAbility = -1; - g_esLaserPlayer[iPlayer].g_iLaserMessage = -1; - g_esLaserPlayer[iPlayer].g_flLaserChance = -1.0; - g_esLaserPlayer[iPlayer].g_iLaserCooldown = -1; - g_esLaserPlayer[iPlayer].g_flLaserDamage = -1.0; - g_esLaserPlayer[iPlayer].g_iLaserDuration = -1; - g_esLaserPlayer[iPlayer].g_flLaserInterval = -1.0; - g_esLaserPlayer[iPlayer].g_iLaserMode = -1; - g_esLaserPlayer[iPlayer].g_flLaserRange = -1.0; - g_esLaserPlayer[iPlayer].g_iLaserSight = -1; - - g_esLaserTeammate[iPlayer].g_flCloseAreasOnly = -1.0; - g_esLaserTeammate[iPlayer].g_iComboAbility = -1; - g_esLaserTeammate[iPlayer].g_iHumanAbility = -1; - g_esLaserTeammate[iPlayer].g_iHumanAmmo = -1; - g_esLaserTeammate[iPlayer].g_iHumanCooldown = -1; - g_esLaserTeammate[iPlayer].g_iHumanDuration = -1; - g_esLaserTeammate[iPlayer].g_iHumanMode = -1; - g_esLaserTeammate[iPlayer].g_flOpenAreasOnly = -1.0; - g_esLaserTeammate[iPlayer].g_iRequiresHumans = -1; - g_esLaserTeammate[iPlayer].g_iLaserAbility = -1; - g_esLaserTeammate[iPlayer].g_iLaserMessage = -1; - g_esLaserTeammate[iPlayer].g_flLaserChance = -1.0; - g_esLaserTeammate[iPlayer].g_iLaserCooldown = -1; - g_esLaserTeammate[iPlayer].g_flLaserDamage = -1.0; - g_esLaserTeammate[iPlayer].g_iLaserDuration = -1; - g_esLaserTeammate[iPlayer].g_flLaserInterval = -1.0; - g_esLaserTeammate[iPlayer].g_iLaserMode = -1; - g_esLaserTeammate[iPlayer].g_flLaserRange = -1.0; - g_esLaserTeammate[iPlayer].g_iLaserSight = -1; - } - } - } -} - -#if defined MT_ABILITIES_MAIN -void vLaserConfigsLoaded(const char[] subsection, const char[] key, const char[] value, int type, int admin, int mode, bool special, const char[] specsection) -#else -public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const char[] value, int type, int admin, int mode, bool special, const char[] specsection) -#endif -{ - if ((mode == -1 || mode == 3) && bIsValidClient(admin)) - { - if (special && specsection[0] != '\0') - { - g_esLaserTeammate[admin].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esLaserTeammate[admin].g_flCloseAreasOnly, value, -1.0, 99999.0); - g_esLaserTeammate[admin].g_iComboAbility = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "ComboAbility", "Combo Ability", "Combo_Ability", "combo", g_esLaserTeammate[admin].g_iComboAbility, value, -1, 1); - g_esLaserTeammate[admin].g_iHumanAbility = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esLaserTeammate[admin].g_iHumanAbility, value, -1, 2); - g_esLaserTeammate[admin].g_iHumanAmmo = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esLaserTeammate[admin].g_iHumanAmmo, value, -1, 99999); - g_esLaserTeammate[admin].g_iHumanCooldown = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esLaserTeammate[admin].g_iHumanCooldown, value, -1, 99999); - g_esLaserTeammate[admin].g_iHumanDuration = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esLaserTeammate[admin].g_iHumanDuration, value, -1, 99999); - g_esLaserTeammate[admin].g_iHumanMode = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esLaserTeammate[admin].g_iHumanMode, value, -1, 1); - g_esLaserTeammate[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esLaserTeammate[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); - g_esLaserTeammate[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esLaserTeammate[admin].g_iRequiresHumans, value, -1, 32); - g_esLaserTeammate[admin].g_iLaserAbility = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esLaserTeammate[admin].g_iLaserAbility, value, -1, 1); - g_esLaserTeammate[admin].g_iLaserMessage = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esLaserTeammate[admin].g_iLaserMessage, value, -1, 1); - g_esLaserTeammate[admin].g_iLaserSight = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "AbilitySight", "Ability Sight", "Ability_Sight", "sight", g_esLaserTeammate[admin].g_iLaserSight, value, -1, 5); - g_esLaserTeammate[admin].g_flLaserChance = flGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "LaserChance", "Laser Chance", "Laser_Chance", "chance", g_esLaserTeammate[admin].g_flLaserChance, value, -1.0, 100.0); - g_esLaserTeammate[admin].g_iLaserCooldown = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "LaserCooldown", "Laser Cooldown", "Laser_Cooldown", "cooldown", g_esLaserTeammate[admin].g_iLaserCooldown, value, -1, 99999); - g_esLaserTeammate[admin].g_flLaserDamage = flGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "LaserDamage", "Laser Damage", "Laser_Damage", "damage", g_esLaserTeammate[admin].g_flLaserDamage, value, -1.0, 99999.0); - g_esLaserTeammate[admin].g_iLaserDuration = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "LaserDuration", "Laser Duration", "Laser_Duration", "duration", g_esLaserTeammate[admin].g_iLaserDuration, value, -1, 99999); - g_esLaserTeammate[admin].g_flLaserInterval = flGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "LaserInterval", "Laser Interval", "Laser_Interval", "interval", g_esLaserTeammate[admin].g_flLaserInterval, value, -1.0, 99999.0); - g_esLaserTeammate[admin].g_iLaserMode = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "LaserMode", "Laser Mode", "Laser_Mode", "mode", g_esLaserTeammate[admin].g_iLaserMode, value, -1, 1); - g_esLaserTeammate[admin].g_flLaserRange = flGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "LaserRange", "Laser Range", "Laser_Range", "range", g_esLaserTeammate[admin].g_flLaserRange, value, -1.0, 99999.0); - } - else - { - g_esLaserPlayer[admin].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esLaserPlayer[admin].g_flCloseAreasOnly, value, -1.0, 99999.0); - g_esLaserPlayer[admin].g_iComboAbility = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "ComboAbility", "Combo Ability", "Combo_Ability", "combo", g_esLaserPlayer[admin].g_iComboAbility, value, -1, 1); - g_esLaserPlayer[admin].g_iHumanAbility = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esLaserPlayer[admin].g_iHumanAbility, value, -1, 2); - g_esLaserPlayer[admin].g_iHumanAmmo = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esLaserPlayer[admin].g_iHumanAmmo, value, -1, 99999); - g_esLaserPlayer[admin].g_iHumanCooldown = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esLaserPlayer[admin].g_iHumanCooldown, value, -1, 99999); - g_esLaserPlayer[admin].g_iHumanDuration = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esLaserPlayer[admin].g_iHumanDuration, value, -1, 99999); - g_esLaserPlayer[admin].g_iHumanMode = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esLaserPlayer[admin].g_iHumanMode, value, -1, 1); - g_esLaserPlayer[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esLaserPlayer[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); - g_esLaserPlayer[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esLaserPlayer[admin].g_iRequiresHumans, value, -1, 32); - g_esLaserPlayer[admin].g_iLaserAbility = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esLaserPlayer[admin].g_iLaserAbility, value, -1, 1); - g_esLaserPlayer[admin].g_iLaserMessage = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esLaserPlayer[admin].g_iLaserMessage, value, -1, 1); - g_esLaserPlayer[admin].g_iLaserSight = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "AbilitySight", "Ability Sight", "Ability_Sight", "sight", g_esLaserPlayer[admin].g_iLaserSight, value, -1, 5); - g_esLaserPlayer[admin].g_flLaserChance = flGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "LaserChance", "Laser Chance", "Laser_Chance", "chance", g_esLaserPlayer[admin].g_flLaserChance, value, -1.0, 100.0); - g_esLaserPlayer[admin].g_iLaserCooldown = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "LaserCooldown", "Laser Cooldown", "Laser_Cooldown", "cooldown", g_esLaserPlayer[admin].g_iLaserCooldown, value, -1, 99999); - g_esLaserPlayer[admin].g_flLaserDamage = flGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "LaserDamage", "Laser Damage", "Laser_Damage", "damage", g_esLaserPlayer[admin].g_flLaserDamage, value, -1.0, 99999.0); - g_esLaserPlayer[admin].g_iLaserDuration = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "LaserDuration", "Laser Duration", "Laser_Duration", "duration", g_esLaserPlayer[admin].g_iLaserDuration, value, -1, 99999); - g_esLaserPlayer[admin].g_flLaserInterval = flGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "LaserInterval", "Laser Interval", "Laser_Interval", "interval", g_esLaserPlayer[admin].g_flLaserInterval, value, -1.0, 99999.0); - g_esLaserPlayer[admin].g_iLaserMode = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "LaserMode", "Laser Mode", "Laser_Mode", "mode", g_esLaserPlayer[admin].g_iLaserMode, value, -1, 1); - g_esLaserPlayer[admin].g_flLaserRange = flGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "LaserRange", "Laser Range", "Laser_Range", "range", g_esLaserPlayer[admin].g_flLaserRange, value, -1.0, 99999.0); - g_esLaserPlayer[admin].g_iAccessFlags = iGetAdminFlagsValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "AccessFlags", "Access Flags", "Access_Flags", "access", value); - g_esLaserPlayer[admin].g_iImmunityFlags = iGetAdminFlagsValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "ImmunityFlags", "Immunity Flags", "Immunity_Flags", "immunity", value); - } - } - - if (mode < 3 && type > 0) - { - if (special && specsection[0] != '\0') - { - g_esLaserSpecial[type].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esLaserSpecial[type].g_flCloseAreasOnly, value, -1.0, 99999.0); - g_esLaserSpecial[type].g_iComboAbility = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "ComboAbility", "Combo Ability", "Combo_Ability", "combo", g_esLaserSpecial[type].g_iComboAbility, value, -1, 1); - g_esLaserSpecial[type].g_iHumanAbility = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esLaserSpecial[type].g_iHumanAbility, value, -1, 2); - g_esLaserSpecial[type].g_iHumanAmmo = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esLaserSpecial[type].g_iHumanAmmo, value, -1, 99999); - g_esLaserSpecial[type].g_iHumanCooldown = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esLaserSpecial[type].g_iHumanCooldown, value, -1, 99999); - g_esLaserSpecial[type].g_iHumanDuration = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esLaserSpecial[type].g_iHumanDuration, value, -1, 99999); - g_esLaserSpecial[type].g_iHumanMode = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esLaserSpecial[type].g_iHumanMode, value, -1, 1); - g_esLaserSpecial[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esLaserSpecial[type].g_flOpenAreasOnly, value, -1.0, 99999.0); - g_esLaserSpecial[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esLaserSpecial[type].g_iRequiresHumans, value, -1, 32); - g_esLaserSpecial[type].g_iLaserAbility = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esLaserSpecial[type].g_iLaserAbility, value, -1, 1); - g_esLaserSpecial[type].g_iLaserMessage = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esLaserSpecial[type].g_iLaserMessage, value, -1, 1); - g_esLaserSpecial[type].g_iLaserSight = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "AbilitySight", "Ability Sight", "Ability_Sight", "sight", g_esLaserSpecial[type].g_iLaserSight, value, -1, 5); - g_esLaserSpecial[type].g_flLaserChance = flGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "LaserChance", "Laser Chance", "Laser_Chance", "chance", g_esLaserSpecial[type].g_flLaserChance, value, -1.0, 100.0); - g_esLaserSpecial[type].g_iLaserCooldown = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "LaserCooldown", "Laser Cooldown", "Laser_Cooldown", "cooldown", g_esLaserSpecial[type].g_iLaserCooldown, value, -1, 99999); - g_esLaserSpecial[type].g_flLaserDamage = flGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "LaserDamage", "Laser Damage", "Laser_Damage", "damage", g_esLaserSpecial[type].g_flLaserDamage, value, -1.0, 99999.0); - g_esLaserSpecial[type].g_iLaserDuration = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "LaserDuration", "Laser Duration", "Laser_Duration", "duration", g_esLaserSpecial[type].g_iLaserDuration, value, -1, 99999); - g_esLaserSpecial[type].g_flLaserInterval = flGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "LaserInterval", "Laser Interval", "Laser_Interval", "interval", g_esLaserSpecial[type].g_flLaserInterval, value, -1.0, 99999.0); - g_esLaserSpecial[type].g_iLaserMode = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "LaserMode", "Laser Mode", "Laser_Mode", "mode", g_esLaserSpecial[type].g_iLaserMode, value, -1, 1); - g_esLaserSpecial[type].g_flLaserRange = flGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "LaserRange", "Laser Range", "Laser_Range", "range", g_esLaserSpecial[type].g_flLaserRange, value, -1.0, 99999.0); - } - else - { - g_esLaserAbility[type].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esLaserAbility[type].g_flCloseAreasOnly, value, -1.0, 99999.0); - g_esLaserAbility[type].g_iComboAbility = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "ComboAbility", "Combo Ability", "Combo_Ability", "combo", g_esLaserAbility[type].g_iComboAbility, value, -1, 1); - g_esLaserAbility[type].g_iHumanAbility = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esLaserAbility[type].g_iHumanAbility, value, -1, 2); - g_esLaserAbility[type].g_iHumanAmmo = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esLaserAbility[type].g_iHumanAmmo, value, -1, 99999); - g_esLaserAbility[type].g_iHumanCooldown = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esLaserAbility[type].g_iHumanCooldown, value, -1, 99999); - g_esLaserAbility[type].g_iHumanDuration = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esLaserAbility[type].g_iHumanDuration, value, -1, 99999); - g_esLaserAbility[type].g_iHumanMode = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esLaserAbility[type].g_iHumanMode, value, -1, 1); - g_esLaserAbility[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esLaserAbility[type].g_flOpenAreasOnly, value, -1.0, 99999.0); - g_esLaserAbility[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esLaserAbility[type].g_iRequiresHumans, value, -1, 32); - g_esLaserAbility[type].g_iLaserAbility = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esLaserAbility[type].g_iLaserAbility, value, -1, 1); - g_esLaserAbility[type].g_iLaserMessage = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esLaserAbility[type].g_iLaserMessage, value, -1, 1); - g_esLaserAbility[type].g_iLaserSight = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "AbilitySight", "Ability Sight", "Ability_Sight", "sight", g_esLaserAbility[type].g_iLaserSight, value, -1, 5); - g_esLaserAbility[type].g_flLaserChance = flGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "LaserChance", "Laser Chance", "Laser_Chance", "chance", g_esLaserAbility[type].g_flLaserChance, value, -1.0, 100.0); - g_esLaserAbility[type].g_iLaserCooldown = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "LaserCooldown", "Laser Cooldown", "Laser_Cooldown", "cooldown", g_esLaserAbility[type].g_iLaserCooldown, value, -1, 99999); - g_esLaserAbility[type].g_flLaserDamage = flGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "LaserDamage", "Laser Damage", "Laser_Damage", "damage", g_esLaserAbility[type].g_flLaserDamage, value, -1.0, 99999.0); - g_esLaserAbility[type].g_iLaserDuration = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "LaserDuration", "Laser Duration", "Laser_Duration", "duration", g_esLaserAbility[type].g_iLaserDuration, value, -1, 99999); - g_esLaserAbility[type].g_flLaserInterval = flGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "LaserInterval", "Laser Interval", "Laser_Interval", "interval", g_esLaserAbility[type].g_flLaserInterval, value, -1.0, 99999.0); - g_esLaserAbility[type].g_iLaserMode = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "LaserMode", "Laser Mode", "Laser_Mode", "mode", g_esLaserAbility[type].g_iLaserMode, value, -1, 1); - g_esLaserAbility[type].g_flLaserRange = flGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "LaserRange", "Laser Range", "Laser_Range", "range", g_esLaserAbility[type].g_flLaserRange, value, -1.0, 99999.0); - g_esLaserAbility[type].g_iAccessFlags = iGetAdminFlagsValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "AccessFlags", "Access Flags", "Access_Flags", "access", value); - g_esLaserAbility[type].g_iImmunityFlags = iGetAdminFlagsValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "ImmunityFlags", "Immunity Flags", "Immunity_Flags", "immunity", value); - } - } -} - -#if defined MT_ABILITIES_MAIN -void vLaserSettingsCached(int tank, bool apply, int type) -#else -public void MT_OnSettingsCached(int tank, bool apply, int type) -#endif -{ - bool bHuman = bIsValidClient(tank, MT_CHECK_FAKECLIENT); - g_esLaserPlayer[tank].g_iTankTypeRecorded = apply ? MT_GetRecordedTankType(tank, type) : 0; - g_esLaserPlayer[tank].g_iTankType = apply ? type : 0; - int iType = g_esLaserPlayer[tank].g_iTankTypeRecorded; - - if (bIsSpecialInfected(tank, MT_CHECK_INDEX|MT_CHECK_INGAME)) - { - g_esLaserCache[tank].g_flCloseAreasOnly = flGetSubSettingValue(apply, bHuman, g_esLaserTeammate[tank].g_flCloseAreasOnly, g_esLaserPlayer[tank].g_flCloseAreasOnly, g_esLaserSpecial[iType].g_flCloseAreasOnly, g_esLaserAbility[iType].g_flCloseAreasOnly, 1); - g_esLaserCache[tank].g_iComboAbility = iGetSubSettingValue(apply, bHuman, g_esLaserTeammate[tank].g_iComboAbility, g_esLaserPlayer[tank].g_iComboAbility, g_esLaserSpecial[iType].g_iComboAbility, g_esLaserAbility[iType].g_iComboAbility, 1); - g_esLaserCache[tank].g_flLaserChance = flGetSubSettingValue(apply, bHuman, g_esLaserTeammate[tank].g_flLaserChance, g_esLaserPlayer[tank].g_flLaserChance, g_esLaserSpecial[iType].g_flLaserChance, g_esLaserAbility[iType].g_flLaserChance, 1); - g_esLaserCache[tank].g_flLaserDamage = flGetSubSettingValue(apply, bHuman, g_esLaserTeammate[tank].g_flLaserDamage, g_esLaserPlayer[tank].g_flLaserDamage, g_esLaserSpecial[iType].g_flLaserDamage, g_esLaserAbility[iType].g_flLaserDamage, 1); - g_esLaserCache[tank].g_flLaserInterval = flGetSubSettingValue(apply, bHuman, g_esLaserTeammate[tank].g_flLaserInterval, g_esLaserPlayer[tank].g_flLaserInterval, g_esLaserSpecial[iType].g_flLaserInterval, g_esLaserAbility[iType].g_flLaserInterval, 1); - g_esLaserCache[tank].g_flLaserRange = flGetSubSettingValue(apply, bHuman, g_esLaserTeammate[tank].g_flLaserRange, g_esLaserPlayer[tank].g_flLaserRange, g_esLaserSpecial[iType].g_flLaserRange, g_esLaserAbility[iType].g_flLaserRange, 1); - g_esLaserCache[tank].g_iHumanAbility = iGetSubSettingValue(apply, bHuman, g_esLaserTeammate[tank].g_iHumanAbility, g_esLaserPlayer[tank].g_iHumanAbility, g_esLaserSpecial[iType].g_iHumanAbility, g_esLaserAbility[iType].g_iHumanAbility, 1); - g_esLaserCache[tank].g_iHumanAmmo = iGetSubSettingValue(apply, bHuman, g_esLaserTeammate[tank].g_iHumanAmmo, g_esLaserPlayer[tank].g_iHumanAmmo, g_esLaserSpecial[iType].g_iHumanAmmo, g_esLaserAbility[iType].g_iHumanAmmo, 1); - g_esLaserCache[tank].g_iHumanCooldown = iGetSubSettingValue(apply, bHuman, g_esLaserTeammate[tank].g_iHumanCooldown, g_esLaserPlayer[tank].g_iHumanCooldown, g_esLaserSpecial[iType].g_iHumanCooldown, g_esLaserAbility[iType].g_iHumanCooldown, 1); - g_esLaserCache[tank].g_iHumanDuration = iGetSubSettingValue(apply, bHuman, g_esLaserTeammate[tank].g_iHumanDuration, g_esLaserPlayer[tank].g_iHumanDuration, g_esLaserSpecial[iType].g_iHumanDuration, g_esLaserAbility[iType].g_iHumanDuration, 1); - g_esLaserCache[tank].g_iHumanMode = iGetSubSettingValue(apply, bHuman, g_esLaserTeammate[tank].g_iHumanMode, g_esLaserPlayer[tank].g_iHumanMode, g_esLaserSpecial[iType].g_iHumanMode, g_esLaserAbility[iType].g_iHumanMode, 1); - g_esLaserCache[tank].g_iLaserAbility = iGetSubSettingValue(apply, bHuman, g_esLaserTeammate[tank].g_iLaserAbility, g_esLaserPlayer[tank].g_iLaserAbility, g_esLaserSpecial[iType].g_iLaserAbility, g_esLaserAbility[iType].g_iLaserAbility, 1); - g_esLaserCache[tank].g_iLaserCooldown = iGetSubSettingValue(apply, bHuman, g_esLaserTeammate[tank].g_iLaserCooldown, g_esLaserPlayer[tank].g_iLaserCooldown, g_esLaserSpecial[iType].g_iLaserCooldown, g_esLaserAbility[iType].g_iLaserCooldown, 1); - g_esLaserCache[tank].g_iLaserDuration = iGetSubSettingValue(apply, bHuman, g_esLaserTeammate[tank].g_iLaserDuration, g_esLaserPlayer[tank].g_iLaserDuration, g_esLaserSpecial[iType].g_iLaserDuration, g_esLaserAbility[iType].g_iLaserDuration, 1); - g_esLaserCache[tank].g_iLaserMessage = iGetSubSettingValue(apply, bHuman, g_esLaserTeammate[tank].g_iLaserMessage, g_esLaserPlayer[tank].g_iLaserMessage, g_esLaserSpecial[iType].g_iLaserMessage, g_esLaserAbility[iType].g_iLaserMessage, 1); - g_esLaserCache[tank].g_iLaserMode = iGetSubSettingValue(apply, bHuman, g_esLaserTeammate[tank].g_iLaserMode, g_esLaserPlayer[tank].g_iLaserMode, g_esLaserSpecial[iType].g_iLaserMode, g_esLaserAbility[iType].g_iLaserMode, 1); - g_esLaserCache[tank].g_iLaserSight = iGetSubSettingValue(apply, bHuman, g_esLaserTeammate[tank].g_iLaserSight, g_esLaserPlayer[tank].g_iLaserSight, g_esLaserSpecial[iType].g_iLaserSight, g_esLaserAbility[iType].g_iLaserSight, 1); - g_esLaserCache[tank].g_flOpenAreasOnly = flGetSubSettingValue(apply, bHuman, g_esLaserTeammate[tank].g_flOpenAreasOnly, g_esLaserPlayer[tank].g_flOpenAreasOnly, g_esLaserSpecial[iType].g_flOpenAreasOnly, g_esLaserAbility[iType].g_flOpenAreasOnly, 1); - g_esLaserCache[tank].g_iRequiresHumans = iGetSubSettingValue(apply, bHuman, g_esLaserTeammate[tank].g_iRequiresHumans, g_esLaserPlayer[tank].g_iRequiresHumans, g_esLaserSpecial[iType].g_iRequiresHumans, g_esLaserAbility[iType].g_iRequiresHumans, 1); - } - else - { - g_esLaserCache[tank].g_flCloseAreasOnly = flGetSettingValue(apply, bHuman, g_esLaserPlayer[tank].g_flCloseAreasOnly, g_esLaserAbility[iType].g_flCloseAreasOnly, 1); - g_esLaserCache[tank].g_iComboAbility = iGetSettingValue(apply, bHuman, g_esLaserPlayer[tank].g_iComboAbility, g_esLaserAbility[iType].g_iComboAbility, 1); - g_esLaserCache[tank].g_flLaserChance = flGetSettingValue(apply, bHuman, g_esLaserPlayer[tank].g_flLaserChance, g_esLaserAbility[iType].g_flLaserChance, 1); - g_esLaserCache[tank].g_flLaserDamage = flGetSettingValue(apply, bHuman, g_esLaserPlayer[tank].g_flLaserDamage, g_esLaserAbility[iType].g_flLaserDamage, 1); - g_esLaserCache[tank].g_flLaserInterval = flGetSettingValue(apply, bHuman, g_esLaserPlayer[tank].g_flLaserInterval, g_esLaserAbility[iType].g_flLaserInterval, 1); - g_esLaserCache[tank].g_flLaserRange = flGetSettingValue(apply, bHuman, g_esLaserPlayer[tank].g_flLaserRange, g_esLaserAbility[iType].g_flLaserRange, 1); - g_esLaserCache[tank].g_iHumanAbility = iGetSettingValue(apply, bHuman, g_esLaserPlayer[tank].g_iHumanAbility, g_esLaserAbility[iType].g_iHumanAbility, 1); - g_esLaserCache[tank].g_iHumanAmmo = iGetSettingValue(apply, bHuman, g_esLaserPlayer[tank].g_iHumanAmmo, g_esLaserAbility[iType].g_iHumanAmmo, 1); - g_esLaserCache[tank].g_iHumanCooldown = iGetSettingValue(apply, bHuman, g_esLaserPlayer[tank].g_iHumanCooldown, g_esLaserAbility[iType].g_iHumanCooldown, 1); - g_esLaserCache[tank].g_iHumanDuration = iGetSettingValue(apply, bHuman, g_esLaserPlayer[tank].g_iHumanDuration, g_esLaserAbility[iType].g_iHumanDuration, 1); - g_esLaserCache[tank].g_iHumanMode = iGetSettingValue(apply, bHuman, g_esLaserPlayer[tank].g_iHumanMode, g_esLaserAbility[iType].g_iHumanMode, 1); - g_esLaserCache[tank].g_iLaserAbility = iGetSettingValue(apply, bHuman, g_esLaserPlayer[tank].g_iLaserAbility, g_esLaserAbility[iType].g_iLaserAbility, 1); - g_esLaserCache[tank].g_iLaserCooldown = iGetSettingValue(apply, bHuman, g_esLaserPlayer[tank].g_iLaserCooldown, g_esLaserAbility[iType].g_iLaserCooldown, 1); - g_esLaserCache[tank].g_iLaserDuration = iGetSettingValue(apply, bHuman, g_esLaserPlayer[tank].g_iLaserDuration, g_esLaserAbility[iType].g_iLaserDuration, 1); - g_esLaserCache[tank].g_iLaserMessage = iGetSettingValue(apply, bHuman, g_esLaserPlayer[tank].g_iLaserMessage, g_esLaserAbility[iType].g_iLaserMessage, 1); - g_esLaserCache[tank].g_iLaserMode = iGetSettingValue(apply, bHuman, g_esLaserPlayer[tank].g_iLaserMode, g_esLaserAbility[iType].g_iLaserMode, 1); - g_esLaserCache[tank].g_iLaserSight = iGetSettingValue(apply, bHuman, g_esLaserPlayer[tank].g_iLaserSight, g_esLaserAbility[iType].g_iLaserSight, 1); - g_esLaserCache[tank].g_flOpenAreasOnly = flGetSettingValue(apply, bHuman, g_esLaserPlayer[tank].g_flOpenAreasOnly, g_esLaserAbility[iType].g_flOpenAreasOnly, 1); - g_esLaserCache[tank].g_iRequiresHumans = iGetSettingValue(apply, bHuman, g_esLaserPlayer[tank].g_iRequiresHumans, g_esLaserAbility[iType].g_iRequiresHumans, 1); - } -} - -#if defined MT_ABILITIES_MAIN -void vLaserCopyStats(int oldTank, int newTank) -#else -public void MT_OnCopyStats(int oldTank, int newTank) -#endif -{ - vLaserCopyStats2(oldTank, newTank); - - if (oldTank != newTank) - { - vRemoveLaser(oldTank); - } -} - -#if !defined MT_ABILITIES_MAIN -public void MT_OnPluginUpdate() -{ - MT_ReloadPlugin(null); -} -#endif - -#if defined MT_ABILITIES_MAIN -void vLaserEventFired(Event event, const char[] name) -#else -public void MT_OnEventFired(Event event, const char[] name, bool dontBroadcast) -#endif -{ - if (StrEqual(name, "bot_player_replace")) - { - int iBotId = event.GetInt("bot"), iBot = GetClientOfUserId(iBotId), - iTankId = event.GetInt("player"), iTank = GetClientOfUserId(iTankId); - if (bIsValidClient(iBot) && bIsInfected(iTank)) - { - vLaserCopyStats2(iBot, iTank); - vRemoveLaser(iBot); - } - } - else if (StrEqual(name, "mission_lost") || StrEqual(name, "round_start") || StrEqual(name, "round_end")) - { - vLaserReset(); - } - else if (StrEqual(name, "player_bot_replace")) - { - int iTankId = event.GetInt("player"), iTank = GetClientOfUserId(iTankId), - iBotId = event.GetInt("bot"), iBot = GetClientOfUserId(iBotId); - if (bIsValidClient(iTank) && bIsInfected(iBot)) - { - vLaserCopyStats2(iTank, iBot); - vRemoveLaser(iTank); - } - } - else if (StrEqual(name, "player_death") || StrEqual(name, "player_spawn")) - { - int iTankId = event.GetInt("userid"), iTank = GetClientOfUserId(iTankId); - if (MT_IsTankSupported(iTank, MT_CHECK_INDEX|MT_CHECK_INGAME)) - { - vRemoveLaser(iTank); - } - } -} - -#if defined MT_ABILITIES_MAIN -void vLaserAbilityActivated(int tank) -#else -public void MT_OnAbilityActivated(int tank) -#endif -{ - if (MT_IsTankSupported(tank, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_FAKECLIENT) && ((!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esLaserAbility[g_esLaserPlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esLaserPlayer[tank].g_iAccessFlags)) || g_esLaserCache[tank].g_iHumanAbility == 0)) - { - return; - } - - if (MT_IsTankSupported(tank) && (!bIsInfected(tank, MT_CHECK_FAKECLIENT) || g_esLaserCache[tank].g_iHumanAbility != 1) && MT_IsCustomTankSupported(tank) && g_esLaserCache[tank].g_iLaserAbility == 1 && g_esLaserCache[tank].g_iComboAbility == 0 && !g_esLaserPlayer[tank].g_bActivated) - { - vLaserAbility(tank); - } -} - -#if defined MT_ABILITIES_MAIN -void vLaserButtonPressed(int tank, int button) -#else -public void MT_OnButtonPressed(int tank, int button) -#endif -{ - if (MT_IsTankSupported(tank, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_ALIVE|MT_CHECK_FAKECLIENT) && MT_IsCustomTankSupported(tank)) - { - if (bIsAreaNarrow(tank, g_esLaserCache[tank].g_flOpenAreasOnly) || bIsAreaWide(tank, g_esLaserCache[tank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esLaserPlayer[tank].g_iTankType, tank) || (g_esLaserCache[tank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esLaserCache[tank].g_iRequiresHumans) || (!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esLaserAbility[g_esLaserPlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esLaserPlayer[tank].g_iAccessFlags))) - { - return; - } - - if ((button & MT_MAIN_KEY) && g_esLaserCache[tank].g_iLaserAbility == 1 && g_esLaserCache[tank].g_iHumanAbility == 1) - { - int iTime = GetTime(); - bool bRecharging = g_esLaserPlayer[tank].g_iCooldown != -1 && g_esLaserPlayer[tank].g_iCooldown >= iTime; - - switch (g_esLaserCache[tank].g_iHumanMode) - { - case 0: - { - if (!g_esLaserPlayer[tank].g_bActivated && !bRecharging) - { - vLaserAbility(tank); - } - else if (g_esLaserPlayer[tank].g_bActivated) - { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "LaserHuman3"); - } - else if (bRecharging) - { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "LaserHuman4", (g_esLaserPlayer[tank].g_iCooldown - iTime)); - } - } - case 1: - { - if (g_esLaserPlayer[tank].g_iAmmoCount < g_esLaserCache[tank].g_iHumanAmmo && g_esLaserCache[tank].g_iHumanAmmo > 0) - { - if (!g_esLaserPlayer[tank].g_bActivated && !bRecharging) - { - g_esLaserPlayer[tank].g_bActivated = true; - g_esLaserPlayer[tank].g_iAmmoCount++; - - iLaserTarget(tank, tank); - MT_PrintToChat(tank, "%s %t", MT_TAG3, "LaserHuman", g_esLaserPlayer[tank].g_iAmmoCount, g_esLaserCache[tank].g_iHumanAmmo); - } - else if (g_esLaserPlayer[tank].g_bActivated) - { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "LaserHuman3"); - } - else if (bRecharging) - { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "LaserHuman4", (g_esLaserPlayer[tank].g_iCooldown - iTime)); - } - } - else - { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "LaserAmmo"); - } - } - } - } - } -} - -#if defined MT_ABILITIES_MAIN -void vLaserButtonReleased(int tank, int button) -#else -public void MT_OnButtonReleased(int tank, int button) -#endif -{ - if (MT_IsTankSupported(tank, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_ALIVE|MT_CHECK_FAKECLIENT) && g_esLaserCache[tank].g_iHumanAbility == 1) - { - if ((button & MT_MAIN_KEY) && g_esLaserCache[tank].g_iHumanMode == 1 && g_esLaserPlayer[tank].g_bActivated && (g_esLaserPlayer[tank].g_iCooldown == -1 || g_esLaserPlayer[tank].g_iCooldown <= GetTime())) - { - vLaserReset2(tank); - vLaserReset3(tank); - } - } -} - -#if defined MT_ABILITIES_MAIN -void vLaserChangeType(int tank, int oldType) -#else -public void MT_OnChangeType(int tank, int oldType, int newType, bool revert) -#endif -{ - if (oldType <= 0) - { - return; - } - - vRemoveLaser(tank); -} - -void vLaser(int tank, int pos = -1) -{ - int iTime = GetTime(); - if (g_esLaserPlayer[tank].g_iCooldown != -1 && g_esLaserPlayer[tank].g_iCooldown >= iTime) - { - return; - } - - g_esLaserPlayer[tank].g_bActivated = true; - - if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esLaserCache[tank].g_iHumanAbility == 1) - { - g_esLaserPlayer[tank].g_iAmmoCount++; - - MT_PrintToChat(tank, "%s %t", MT_TAG3, "LaserHuman", g_esLaserPlayer[tank].g_iAmmoCount, g_esLaserCache[tank].g_iHumanAmmo); - } - - float flInterval = (pos != -1) ? MT_GetCombinationSetting(tank, 6, pos) : g_esLaserCache[tank].g_flLaserInterval; - if (flInterval > 0.0) - { - DataPack dpLaser; - CreateDataTimer(flInterval, tTimerLaser, dpLaser, TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); - dpLaser.WriteCell(GetClientUserId(tank)); - dpLaser.WriteCell(g_esLaserPlayer[tank].g_iTankType); - dpLaser.WriteCell(iTime); - dpLaser.WriteCell(pos); - } -} - -void vLaser2(int tank, int survivor, int target, float range, int pos = -1) -{ - float flTankPos[3], flSurvivorPos[3]; - GetClientEyePosition(survivor, flTankPos); - GetClientEyePosition(target, flSurvivorPos); - if (GetVectorDistance(flTankPos, flSurvivorPos) > range) - { - return; - } - - vAttachParticle2(flSurvivorPos, NULL_VECTOR, PARTICLE_ELECTRICITY, 3.0); - EmitSoundToAll(((MT_GetRandomInt(1, 2) == 1) ? SOUND_ELECTRICITY : SOUND_ELECTRICITY2), 0, SNDCHAN_AUTO, SNDLEVEL_NORMAL, SND_NOFLAGS, 1.0, SNDPITCH_NORMAL, -1, flSurvivorPos, NULL_VECTOR, true, 0.0); - EmitSoundToAll(((MT_GetRandomInt(1, 2) == 1) ? SOUND_ELECTRICITY : SOUND_ELECTRICITY2), 0, SNDCHAN_AUTO, SNDLEVEL_NORMAL, SND_NOFLAGS, 1.0, SNDPITCH_NORMAL, -1, flTankPos, NULL_VECTOR, true, 0.0); - - int iColor[4]; - GetEntityRenderColor(tank, iColor[0], iColor[1], iColor[2], iColor[3]); - TE_SetupBeamPoints(flTankPos, flSurvivorPos, g_iLaserSprite, 0, 0, 0, 0.5, 5.0, 5.0, 1, 0.0, iColor, 0); - TE_SendToAll(); - - float flDamage = (pos != -1) ? MT_GetCombinationSetting(tank, 3, pos) : g_esLaserCache[tank].g_flLaserDamage; - if (flDamage > 0.0) - { - vDamagePlayer(target, tank, MT_GetScaledDamage(flDamage), "1024"); - } - - if (g_esLaserCache[tank].g_iLaserMessage == 1) - { - char sTankName[64]; - MT_GetTankName(tank, sTankName); - MT_PrintToChatAll("%s %t", MT_TAG2, "Laser", sTankName, target); - MT_LogMessage(MT_LOG_ABILITY, "%s %T", MT_TAG, "Laser", LANG_SERVER, sTankName, target); - } -} - -void vLaserAbility(int tank) -{ - if ((g_esLaserPlayer[tank].g_iCooldown != -1 && g_esLaserPlayer[tank].g_iCooldown >= GetTime()) || bIsAreaNarrow(tank, g_esLaserCache[tank].g_flOpenAreasOnly) || bIsAreaWide(tank, g_esLaserCache[tank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esLaserPlayer[tank].g_iTankType, tank) || (g_esLaserCache[tank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esLaserCache[tank].g_iRequiresHumans) || (!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esLaserAbility[g_esLaserPlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esLaserPlayer[tank].g_iAccessFlags))) - { - return; - } - - if (!bIsInfected(tank, MT_CHECK_FAKECLIENT) || (g_esLaserPlayer[tank].g_iAmmoCount < g_esLaserCache[tank].g_iHumanAmmo && g_esLaserCache[tank].g_iHumanAmmo > 0)) - { - if (GetRandomFloat(0.1, 100.0) <= g_esLaserCache[tank].g_flLaserChance && !g_esLaserPlayer[tank].g_bActivated) - { - vLaser(tank); - } - else if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esLaserCache[tank].g_iHumanAbility == 1) - { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "LaserHuman2"); - } - } - else if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esLaserCache[tank].g_iHumanAbility == 1) - { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "LaserAmmo"); - } -} - -void vLaserCopyStats2(int oldTank, int newTank) -{ - g_esLaserPlayer[newTank].g_iAmmoCount = g_esLaserPlayer[oldTank].g_iAmmoCount; - g_esLaserPlayer[newTank].g_iCooldown = g_esLaserPlayer[oldTank].g_iCooldown; -} - -void vRemoveLaser(int tank) -{ - g_esLaserPlayer[tank].g_bActivated = false; - g_esLaserPlayer[tank].g_iAmmoCount = 0; - g_esLaserPlayer[tank].g_iCooldown = -1; -} - -void vLaserReset() -{ - for (int iPlayer = 1; iPlayer <= MaxClients; iPlayer++) - { - if (bIsValidClient(iPlayer, MT_CHECK_INGAME)) - { - vRemoveLaser(iPlayer); - } - } -} - -void vLaserReset2(int tank) -{ - g_esLaserPlayer[tank].g_bActivated = false; - - if (g_esLaserCache[tank].g_iLaserMessage == 1) - { - char sTankName[64]; - MT_GetTankName(tank, sTankName); - MT_PrintToChatAll("%s %t", MT_TAG2, "Laser2", sTankName); - MT_LogMessage(MT_LOG_ABILITY, "%s %T", MT_TAG, "Laser2", LANG_SERVER, sTankName); - } -} - -void vLaserReset3(int tank) -{ - int iTime = GetTime(), iPos = g_esLaserAbility[g_esLaserPlayer[tank].g_iTankTypeRecorded].g_iComboPosition, iCooldown = (iPos != -1) ? RoundToNearest(MT_GetCombinationSetting(tank, 2, iPos)) : g_esLaserCache[tank].g_iLaserCooldown; - iCooldown = (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esLaserCache[tank].g_iHumanAbility == 1 && g_esLaserCache[tank].g_iHumanMode == 0 && g_esLaserPlayer[tank].g_iAmmoCount < g_esLaserCache[tank].g_iHumanAmmo && g_esLaserCache[tank].g_iHumanAmmo > 0) ? g_esLaserCache[tank].g_iHumanCooldown : iCooldown; - g_esLaserPlayer[tank].g_iCooldown = (iTime + iCooldown); - if (g_esLaserPlayer[tank].g_iCooldown != -1 && g_esLaserPlayer[tank].g_iCooldown >= iTime) - { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "LaserHuman5", (g_esLaserPlayer[tank].g_iCooldown - iTime)); - } -} - -int iLaserTarget(int tank, int survivor, float range = 0.0, int pos = -1) -{ - float flRange = range; - if (range == 0.0) - { - flRange = (pos != -1) ? MT_GetCombinationSetting(tank, 9, pos) : g_esLaserCache[tank].g_flLaserRange; - } - - if (tank == survivor) - { - float flTankPos[3]; - GetClientEyePosition(survivor, flTankPos); - int iSurvivor = iGetNearestSurvivor(survivor, flTankPos, flRange); - if (bIsSurvivor(iSurvivor) && bIsVisibleToPlayer(tank, survivor, g_esLaserCache[tank].g_iLaserSight, .range = flRange)) - { - vLaser2(tank, survivor, iSurvivor, flRange, pos); - - return iSurvivor; - } - } - else - { - for (int iSurvivor = 1; iSurvivor <= MaxClients; iSurvivor++) - { - if (bIsSurvivor(iSurvivor, MT_CHECK_INGAME|MT_CHECK_ALIVE) && bIsVisibleToPlayer(survivor, iSurvivor, 1, .range = flRange) && !MT_IsAdminImmune(iSurvivor, tank) && !bIsAdminImmune(iSurvivor, g_esLaserPlayer[tank].g_iTankType, g_esLaserAbility[g_esLaserPlayer[tank].g_iTankTypeRecorded].g_iImmunityFlags, g_esLaserPlayer[iSurvivor].g_iImmunityFlags) && iSurvivor != survivor) - { - vLaser2(tank, survivor, iSurvivor, flRange, pos); - } - } - } - - return 0; -} - -void tTimerLaserCombo(Handle timer, DataPack pack) -{ - pack.Reset(); - - int iTank = GetClientOfUserId(pack.ReadCell()); - if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esLaserAbility[g_esLaserPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esLaserPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esLaserPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esLaserCache[iTank].g_iLaserAbility == 0 || g_esLaserPlayer[iTank].g_bActivated) - { - return; - } - - int iPos = pack.ReadCell(); - vLaser(iTank, iPos); -} - -Action tTimerLaser(Handle timer, DataPack pack) -{ - pack.Reset(); - - int iTank = GetClientOfUserId(pack.ReadCell()), iType = pack.ReadCell(); - if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || bIsAreaNarrow(iTank, g_esLaserCache[iTank].g_flOpenAreasOnly) || bIsAreaWide(iTank, g_esLaserCache[iTank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esLaserPlayer[iTank].g_iTankType, iTank) || (g_esLaserCache[iTank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esLaserCache[iTank].g_iRequiresHumans) || !MT_HasAdminAccess(iTank) || !bHasAdminAccess(iTank, g_esLaserAbility[g_esLaserPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esLaserPlayer[iTank].g_iAccessFlags) || !MT_IsTypeEnabled(g_esLaserPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || iType != g_esLaserPlayer[iTank].g_iTankType || !g_esLaserPlayer[iTank].g_bActivated) - { - vLaserReset2(iTank); - - return Plugin_Stop; - } - - int iTime = pack.ReadCell(), iPos = pack.ReadCell(), - iDuration = (iPos != -1) ? RoundToNearest(MT_GetCombinationSetting(iTank, 5, iPos)) : g_esLaserCache[iTank].g_iLaserDuration; - iDuration = (bIsInfected(iTank, MT_CHECK_FAKECLIENT) && g_esLaserCache[iTank].g_iHumanAbility == 1) ? g_esLaserCache[iTank].g_iHumanDuration : iDuration; - if ((iTime + iDuration) <= GetTime()) - { - vLaserReset2(iTank); - vLaserReset3(iTank); - - return Plugin_Stop; - } - - float flRange = (iPos != -1) ? MT_GetCombinationSetting(iTank, 9, iPos) : g_esLaserCache[iTank].g_flLaserRange; - int iSurvivor = iLaserTarget(iTank, iTank, flRange, iPos); - if (g_esLaserCache[iTank].g_iLaserMode == 1 && iSurvivor > 0) - { - iLaserTarget(iTank, iSurvivor, (flRange / 2.0), iPos); - } - - return Plugin_Continue; +/** + * Mutant Tanks: A L4D/L4D2 SourceMod Plugin + * Copyright (C) 2017-2025 Alfred "Psyk0tik" Llagas + * + * 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 . + **/ + +#define MT_LASER_COMPILE_METHOD 0 // 0: packaged, 1: standalone + +#if !defined MT_ABILITIES_MAIN2 + #if MT_LASER_COMPILE_METHOD == 1 + #include + #include + #else + #error This file must be inside "scripting/mutant_tanks/abilities2" while compiling "mt_abilities2.sp" to include its content. + #endif +public Plugin myinfo = +{ + name = "[MT] Laser Ability", + author = MT_AUTHOR, + description = "The Mutant Tank shoots lasers at survivors.", + version = MT_VERSION, + url = MT_URL +}; + +bool g_bDedicated, g_bSecondGame; + +int g_iGraphicsLevel; + +public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max) +{ + switch (GetEngineVersion()) + { + case Engine_Left4Dead: g_bSecondGame = false; + case Engine_Left4Dead2: g_bSecondGame = true; + default: + { + strcopy(error, err_max, "\"[MT] Laser Ability\" only supports Left 4 Dead 1 & 2."); + + return APLRes_SilentFailure; + } + } + + g_bDedicated = IsDedicatedServer(); + + return APLRes_Success; +} + +#define PARTICLE_ELECTRICITY "electrical_arc_01_system" + +#define SOUND_ELECTRICITY "ambient/energy/zap5.wav" +#define SOUND_ELECTRICITY2 "ambient/energy/zap7.wav" + +#define SPRITE_LASER "sprites/laser.vmt" +#define SPRITE_LASERBEAM "sprites/laserbeam.vmt" +#else + #if MT_LASER_COMPILE_METHOD == 1 + #error This file must be compiled as a standalone plugin. + #endif +#endif + +#define MT_LASER_SECTION "laserability" +#define MT_LASER_SECTION2 "laser ability" +#define MT_LASER_SECTION3 "laser_ability" +#define MT_LASER_SECTION4 "laser" + +#define MT_MENU_LASER "Laser Ability" + +enum struct esLaserPlayer +{ + bool g_bActivated; + + float g_flCloseAreasOnly; + float g_flLaserChance; + float g_flLaserDamage; + float g_flLaserInterval; + float g_flLaserRange; + float g_flOpenAreasOnly; + + int g_iAccessFlags; + int g_iAmmoCount; + int g_iComboAbility; + int g_iCooldown; + int g_iHumanAbility; + int g_iHumanAmmo; + int g_iHumanCooldown; + int g_iHumanDuration; + int g_iHumanMode; + int g_iImmunityFlags; + int g_iLaserAbility; + int g_iLaserCooldown; + int g_iLaserDuration; + int g_iLaserMessage; + int g_iLaserMode; + int g_iLaserSight; + int g_iRequiresHumans; + int g_iTankType; + int g_iTankTypeRecorded; +} + +esLaserPlayer g_esLaserPlayer[MAXPLAYERS + 1]; + +enum struct esLaserTeammate +{ + float g_flCloseAreasOnly; + float g_flLaserChance; + float g_flLaserDamage; + float g_flLaserInterval; + float g_flLaserRange; + float g_flOpenAreasOnly; + + int g_iComboAbility; + int g_iHumanAbility; + int g_iHumanAmmo; + int g_iHumanCooldown; + int g_iHumanDuration; + int g_iHumanMode; + int g_iLaserAbility; + int g_iLaserCooldown; + int g_iLaserDuration; + int g_iLaserMessage; + int g_iLaserMode; + int g_iLaserSight; + int g_iRequiresHumans; +} + +esLaserTeammate g_esLaserTeammate[MAXPLAYERS + 1]; + +enum struct esLaserAbility +{ + float g_flCloseAreasOnly; + float g_flLaserChance; + float g_flLaserDamage; + float g_flLaserInterval; + float g_flLaserRange; + float g_flOpenAreasOnly; + + int g_iAccessFlags; + int g_iComboAbility; + int g_iComboPosition; + int g_iHumanAbility; + int g_iHumanAmmo; + int g_iHumanCooldown; + int g_iHumanDuration; + int g_iHumanMode; + int g_iImmunityFlags; + int g_iLaserAbility; + int g_iLaserCooldown; + int g_iLaserDuration; + int g_iLaserMessage; + int g_iLaserMode; + int g_iLaserSight; + int g_iRequiresHumans; +} + +esLaserAbility g_esLaserAbility[MT_MAXTYPES + 1]; + +enum struct esLaserSpecial +{ + float g_flCloseAreasOnly; + float g_flLaserChance; + float g_flLaserDamage; + float g_flLaserInterval; + float g_flLaserRange; + float g_flOpenAreasOnly; + + int g_iComboAbility; + int g_iHumanAbility; + int g_iHumanAmmo; + int g_iHumanCooldown; + int g_iHumanDuration; + int g_iHumanMode; + int g_iLaserAbility; + int g_iLaserCooldown; + int g_iLaserDuration; + int g_iLaserMessage; + int g_iLaserMode; + int g_iLaserSight; + int g_iRequiresHumans; +} + +esLaserSpecial g_esLaserSpecial[MT_MAXTYPES + 1]; + +enum struct esLaserCache +{ + float g_flCloseAreasOnly; + float g_flLaserChance; + float g_flLaserDamage; + float g_flLaserInterval; + float g_flLaserRange; + float g_flOpenAreasOnly; + + int g_iComboAbility; + int g_iHumanAbility; + int g_iHumanAmmo; + int g_iHumanCooldown; + int g_iHumanDuration; + int g_iHumanMode; + int g_iLaserAbility; + int g_iLaserCooldown; + int g_iLaserDuration; + int g_iLaserMessage; + int g_iLaserMode; + int g_iLaserSight; + int g_iRequiresHumans; +} + +esLaserCache g_esLaserCache[MAXPLAYERS + 1]; + +int g_iLaserSprite = -1; + +#if !defined MT_ABILITIES_MAIN2 +public void OnPluginStart() +{ + LoadTranslations("common.phrases"); + LoadTranslations("mutant_tanks.phrases"); + LoadTranslations("mutant_tanks_names.phrases"); + + RegConsoleCmd("sm_mt_laser", cmdLaserInfo, "View information about the Laser ability."); +} +#endif + +#if defined MT_ABILITIES_MAIN2 +void vLaserMapStart() +#else +public void OnMapStart() +#endif +{ + switch (g_bSecondGame) + { + case true: g_iLaserSprite = PrecacheModel(SPRITE_LASERBEAM, true); + case false: g_iLaserSprite = PrecacheModel(SPRITE_LASER, true); + } + + PrecacheSound(SOUND_ELECTRICITY, true); + PrecacheSound(SOUND_ELECTRICITY2, true); + + vLaserReset(); +} + +#if defined MT_ABILITIES_MAIN2 +void vLaserClientPutInServer(int client) +#else +public void OnClientPutInServer(int client) +#endif +{ + vRemoveLaser(client); +} + +#if defined MT_ABILITIES_MAIN2 +void vLaserClientDisconnect_Post(int client) +#else +public void OnClientDisconnect_Post(int client) +#endif +{ + vRemoveLaser(client); +} + +#if defined MT_ABILITIES_MAIN2 +void vLaserMapEnd() +#else +public void OnMapEnd() +#endif +{ + vLaserReset(); +} + +#if !defined MT_ABILITIES_MAIN2 +Action cmdLaserInfo(int client, int args) +{ + client = iGetListenServerHost(client, g_bDedicated); + + if (!MT_IsCorePluginEnabled()) + { + MT_ReplyToCommand(client, "%s %t", MT_TAG5, "PluginDisabled"); + + return Plugin_Handled; + } + + if (!bIsValidClient(client, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_FAKECLIENT)) + { + MT_ReplyToCommand(client, "%s %t", MT_TAG, "Command is in-game only"); + + return Plugin_Handled; + } + + switch (IsVoteInProgress()) + { + case true: MT_ReplyToCommand(client, "%s %t", MT_TAG2, "Vote in Progress"); + case false: vLaserMenu(client, MT_LASER_SECTION4, 0); + } + + return Plugin_Handled; +} +#endif + +void vLaserMenu(int client, const char[] name, int item) +{ + if (StrContains(MT_LASER_SECTION4, name, false) == -1) + { + return; + } + + Menu mAbilityMenu = new Menu(iLaserMenuHandler, MENU_ACTIONS_DEFAULT|MenuAction_Display|MenuAction_DisplayItem); + mAbilityMenu.SetTitle("Laser Ability Information"); + mAbilityMenu.AddItem("Status", "Status"); + mAbilityMenu.AddItem("Ammunition", "Ammunition"); + mAbilityMenu.AddItem("Buttons", "Buttons"); + mAbilityMenu.AddItem("Button Mode", "Button Mode"); + mAbilityMenu.AddItem("Cooldown", "Cooldown"); + mAbilityMenu.AddItem("Details", "Details"); + mAbilityMenu.AddItem("Duration", "Duration"); + mAbilityMenu.AddItem("Human Support", "Human Support"); + mAbilityMenu.DisplayAt(client, item, MENU_TIME_FOREVER); +} + +int iLaserMenuHandler(Menu menu, MenuAction action, int param1, int param2) +{ + switch (action) + { + case MenuAction_End: delete menu; + case MenuAction_Select: + { + switch (param2) + { + case 0: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esLaserCache[param1].g_iLaserAbility == 0) ? "AbilityStatus1" : "AbilityStatus2"); + case 1: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityAmmo", (g_esLaserCache[param1].g_iHumanAmmo - g_esLaserPlayer[param1].g_iAmmoCount), g_esLaserCache[param1].g_iHumanAmmo); + case 2: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtons"); + case 3: + { + switch (g_esLaserCache[param1].g_iHumanMode) + { + case 0: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtonMode1"); + case 1: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtonMode2"); + case 2: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtonMode3"); + } + } + case 4: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityCooldown", ((g_esLaserCache[param1].g_iHumanAbility == 1) ? g_esLaserCache[param1].g_iHumanCooldown : g_esLaserCache[param1].g_iLaserCooldown)); + case 5: MT_PrintToChat(param1, "%s %t", MT_TAG3, "LaserDetails"); + case 6: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityDuration2", ((g_esLaserCache[param1].g_iHumanAbility == 1) ? g_esLaserCache[param1].g_iHumanDuration : g_esLaserCache[param1].g_iLaserDuration)); + case 7: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esLaserCache[param1].g_iHumanAbility == 0) ? "AbilityHumanSupport1" : "AbilityHumanSupport2"); + } + + if (bIsValidClient(param1, MT_CHECK_INGAME)) + { + vLaserMenu(param1, MT_LASER_SECTION4, menu.Selection); + } + } + case MenuAction_Display: + { + char sMenuTitle[PLATFORM_MAX_PATH]; + Panel pLaser = view_as(param2); + FormatEx(sMenuTitle, sizeof sMenuTitle, "%T", "LaserMenu", param1); + pLaser.SetTitle(sMenuTitle); + } + case MenuAction_DisplayItem: + { + if (param2 >= 0) + { + char sMenuOption[PLATFORM_MAX_PATH]; + + switch (param2) + { + case 0: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Status", param1); + case 1: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Ammunition", param1); + case 2: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Buttons", param1); + case 3: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "ButtonMode", param1); + case 4: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Cooldown", param1); + case 5: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Details", param1); + case 6: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Duration", param1); + case 7: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "HumanSupport", param1); + } + + return RedrawMenuItem(sMenuOption); + } + } + } + + return 0; +} + +#if defined MT_ABILITIES_MAIN2 +void vLaserDisplayMenu(Menu menu) +#else +public void MT_OnDisplayMenu(Menu menu) +#endif +{ + menu.AddItem(MT_MENU_LASER, MT_MENU_LASER); +} + +#if defined MT_ABILITIES_MAIN2 +void vLaserMenuItemSelected(int client, const char[] info) +#else +public void MT_OnMenuItemSelected(int client, const char[] info) +#endif +{ + if (StrEqual(info, MT_MENU_LASER, false)) + { + vLaserMenu(client, MT_LASER_SECTION4, 0); + } +} + +#if defined MT_ABILITIES_MAIN2 +void vLaserMenuItemDisplayed(int client, const char[] info, char[] buffer, int size) +#else +public void MT_OnMenuItemDisplayed(int client, const char[] info, char[] buffer, int size) +#endif +{ + if (StrEqual(info, MT_MENU_LASER, false)) + { + FormatEx(buffer, size, "%T", "LaserMenu2", client); + } +} + +#if defined MT_ABILITIES_MAIN2 +void vLaserPluginCheck(ArrayList list) +#else +public void MT_OnPluginCheck(ArrayList list) +#endif +{ + list.PushString(MT_MENU_LASER); +} + +#if defined MT_ABILITIES_MAIN2 +void vLaserAbilityCheck(ArrayList list, ArrayList list2, ArrayList list3, ArrayList list4) +#else +public void MT_OnAbilityCheck(ArrayList list, ArrayList list2, ArrayList list3, ArrayList list4) +#endif +{ + list.PushString(MT_LASER_SECTION); + list2.PushString(MT_LASER_SECTION2); + list3.PushString(MT_LASER_SECTION3); + list4.PushString(MT_LASER_SECTION4); +} + +#if defined MT_ABILITIES_MAIN2 +void vLaserCombineAbilities(int tank, int type, const float random, const char[] combo) +#else +public void MT_OnCombineAbilities(int tank, int type, const float random, const char[] combo, int survivor, int weapon, const char[] classname) +#endif +{ + if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esLaserCache[tank].g_iHumanAbility != 2) + { + g_esLaserAbility[g_esLaserPlayer[tank].g_iTankTypeRecorded].g_iComboPosition = -1; + + return; + } + + g_esLaserAbility[g_esLaserPlayer[tank].g_iTankTypeRecorded].g_iComboPosition = -1; + + char sCombo[320], sSet[4][32]; + FormatEx(sCombo, sizeof sCombo, ",%s,", combo); + FormatEx(sSet[0], sizeof sSet[], ",%s,", MT_LASER_SECTION); + FormatEx(sSet[1], sizeof sSet[], ",%s,", MT_LASER_SECTION2); + FormatEx(sSet[2], sizeof sSet[], ",%s,", MT_LASER_SECTION3); + FormatEx(sSet[3], sizeof sSet[], ",%s,", MT_LASER_SECTION4); + if (StrContains(sCombo, sSet[0], false) != -1 || StrContains(sCombo, sSet[1], false) != -1 || StrContains(sCombo, sSet[2], false) != -1 || StrContains(sCombo, sSet[3], false) != -1) + { + if (type == MT_COMBO_MAINRANGE && g_esLaserCache[tank].g_iLaserAbility == 1 && g_esLaserCache[tank].g_iComboAbility == 1 && !g_esLaserPlayer[tank].g_bActivated) + { + char sAbilities[320], sSubset[10][32]; + strcopy(sAbilities, sizeof sAbilities, combo); + ExplodeString(sAbilities, ",", sSubset, sizeof sSubset, sizeof sSubset[]); + + float flDelay = 0.0; + for (int iPos = 0; iPos < (sizeof sSubset); iPos++) + { + if (StrEqual(sSubset[iPos], MT_LASER_SECTION, false) || StrEqual(sSubset[iPos], MT_LASER_SECTION2, false) || StrEqual(sSubset[iPos], MT_LASER_SECTION3, false) || StrEqual(sSubset[iPos], MT_LASER_SECTION4, false)) + { + g_esLaserAbility[g_esLaserPlayer[tank].g_iTankTypeRecorded].g_iComboPosition = iPos; + + if (random <= MT_GetCombinationSetting(tank, 1, iPos)) + { + flDelay = MT_GetCombinationSetting(tank, 4, iPos); + + switch (flDelay) + { + case 0.0: vLaser(tank, iPos); + default: + { + DataPack dpCombo; + CreateDataTimer(flDelay, tTimerLaserCombo, dpCombo, TIMER_FLAG_NO_MAPCHANGE); + dpCombo.WriteCell(GetClientUserId(tank)); + dpCombo.WriteCell(iPos); + } + } + } + + break; + } + } + } + } +} + +#if defined MT_ABILITIES_MAIN2 +void vLaserConfigsLoad(int mode) +#else +public void MT_OnConfigsLoad(int mode) +#endif +{ + switch (mode) + { + case 1: + { + for (int iIndex = MT_GetMinType(); iIndex <= MT_GetMaxType(); iIndex++) + { + g_esLaserAbility[iIndex].g_iAccessFlags = 0; + g_esLaserAbility[iIndex].g_iImmunityFlags = 0; + g_esLaserAbility[iIndex].g_flCloseAreasOnly = 0.0; + g_esLaserAbility[iIndex].g_iComboAbility = 0; + g_esLaserAbility[iIndex].g_iComboPosition = -1; + g_esLaserAbility[iIndex].g_iHumanAbility = 0; + g_esLaserAbility[iIndex].g_iHumanAmmo = 5; + g_esLaserAbility[iIndex].g_iHumanCooldown = 0; + g_esLaserAbility[iIndex].g_iHumanDuration = 5; + g_esLaserAbility[iIndex].g_iHumanMode = 1; + g_esLaserAbility[iIndex].g_flOpenAreasOnly = 0.0; + g_esLaserAbility[iIndex].g_iRequiresHumans = 0; + g_esLaserAbility[iIndex].g_iLaserAbility = 0; + g_esLaserAbility[iIndex].g_iLaserMessage = 0; + g_esLaserAbility[iIndex].g_flLaserChance = 33.3; + g_esLaserAbility[iIndex].g_iLaserCooldown = 0; + g_esLaserAbility[iIndex].g_flLaserDamage = 5.0; + g_esLaserAbility[iIndex].g_iLaserDuration = 5; + g_esLaserAbility[iIndex].g_flLaserInterval = 1.0; + g_esLaserAbility[iIndex].g_iLaserMode = 0; + g_esLaserAbility[iIndex].g_flLaserRange = 500.0; + g_esLaserAbility[iIndex].g_iLaserSight = 0; + + g_esLaserSpecial[iIndex].g_flCloseAreasOnly = -1.0; + g_esLaserSpecial[iIndex].g_iComboAbility = -1; + g_esLaserSpecial[iIndex].g_iHumanAbility = -1; + g_esLaserSpecial[iIndex].g_iHumanAmmo = -1; + g_esLaserSpecial[iIndex].g_iHumanCooldown = -1; + g_esLaserSpecial[iIndex].g_iHumanDuration = -1; + g_esLaserSpecial[iIndex].g_iHumanMode = -1; + g_esLaserSpecial[iIndex].g_flOpenAreasOnly = -1.0; + g_esLaserSpecial[iIndex].g_iRequiresHumans = -1; + g_esLaserSpecial[iIndex].g_iLaserAbility = -1; + g_esLaserSpecial[iIndex].g_iLaserMessage = -1; + g_esLaserSpecial[iIndex].g_flLaserChance = -1.0; + g_esLaserSpecial[iIndex].g_iLaserCooldown = -1; + g_esLaserSpecial[iIndex].g_flLaserDamage = -1.0; + g_esLaserSpecial[iIndex].g_iLaserDuration = -1; + g_esLaserSpecial[iIndex].g_flLaserInterval = -1.0; + g_esLaserSpecial[iIndex].g_iLaserMode = -1; + g_esLaserSpecial[iIndex].g_flLaserRange = -1.0; + g_esLaserSpecial[iIndex].g_iLaserSight = -1; + } + } + case 3: + { + for (int iPlayer = 1; iPlayer <= MaxClients; iPlayer++) + { + g_esLaserPlayer[iPlayer].g_iAccessFlags = -1; + g_esLaserPlayer[iPlayer].g_iImmunityFlags = -1; + g_esLaserPlayer[iPlayer].g_flCloseAreasOnly = -1.0; + g_esLaserPlayer[iPlayer].g_iComboAbility = -1; + g_esLaserPlayer[iPlayer].g_iHumanAbility = -1; + g_esLaserPlayer[iPlayer].g_iHumanAmmo = -1; + g_esLaserPlayer[iPlayer].g_iHumanCooldown = -1; + g_esLaserPlayer[iPlayer].g_iHumanDuration = -1; + g_esLaserPlayer[iPlayer].g_iHumanMode = -1; + g_esLaserPlayer[iPlayer].g_flOpenAreasOnly = -1.0; + g_esLaserPlayer[iPlayer].g_iRequiresHumans = -1; + g_esLaserPlayer[iPlayer].g_iLaserAbility = -1; + g_esLaserPlayer[iPlayer].g_iLaserMessage = -1; + g_esLaserPlayer[iPlayer].g_flLaserChance = -1.0; + g_esLaserPlayer[iPlayer].g_iLaserCooldown = -1; + g_esLaserPlayer[iPlayer].g_flLaserDamage = -1.0; + g_esLaserPlayer[iPlayer].g_iLaserDuration = -1; + g_esLaserPlayer[iPlayer].g_flLaserInterval = -1.0; + g_esLaserPlayer[iPlayer].g_iLaserMode = -1; + g_esLaserPlayer[iPlayer].g_flLaserRange = -1.0; + g_esLaserPlayer[iPlayer].g_iLaserSight = -1; + + g_esLaserTeammate[iPlayer].g_flCloseAreasOnly = -1.0; + g_esLaserTeammate[iPlayer].g_iComboAbility = -1; + g_esLaserTeammate[iPlayer].g_iHumanAbility = -1; + g_esLaserTeammate[iPlayer].g_iHumanAmmo = -1; + g_esLaserTeammate[iPlayer].g_iHumanCooldown = -1; + g_esLaserTeammate[iPlayer].g_iHumanDuration = -1; + g_esLaserTeammate[iPlayer].g_iHumanMode = -1; + g_esLaserTeammate[iPlayer].g_flOpenAreasOnly = -1.0; + g_esLaserTeammate[iPlayer].g_iRequiresHumans = -1; + g_esLaserTeammate[iPlayer].g_iLaserAbility = -1; + g_esLaserTeammate[iPlayer].g_iLaserMessage = -1; + g_esLaserTeammate[iPlayer].g_flLaserChance = -1.0; + g_esLaserTeammate[iPlayer].g_iLaserCooldown = -1; + g_esLaserTeammate[iPlayer].g_flLaserDamage = -1.0; + g_esLaserTeammate[iPlayer].g_iLaserDuration = -1; + g_esLaserTeammate[iPlayer].g_flLaserInterval = -1.0; + g_esLaserTeammate[iPlayer].g_iLaserMode = -1; + g_esLaserTeammate[iPlayer].g_flLaserRange = -1.0; + g_esLaserTeammate[iPlayer].g_iLaserSight = -1; + } + } + } +} + +#if defined MT_ABILITIES_MAIN2 +void vLaserConfigsLoaded(const char[] subsection, const char[] key, const char[] value, int type, int admin, int mode, bool special, const char[] specsection) +#else +public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const char[] value, int type, int admin, int mode, bool special, const char[] specsection) +#endif +{ + if ((mode == -1 || mode == 3) && bIsValidClient(admin)) + { + if (special && specsection[0] != '\0') + { + g_esLaserTeammate[admin].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esLaserTeammate[admin].g_flCloseAreasOnly, value, -1.0, 99999.0); + g_esLaserTeammate[admin].g_iComboAbility = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "ComboAbility", "Combo Ability", "Combo_Ability", "combo", g_esLaserTeammate[admin].g_iComboAbility, value, -1, 1); + g_esLaserTeammate[admin].g_iHumanAbility = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esLaserTeammate[admin].g_iHumanAbility, value, -1, 2); + g_esLaserTeammate[admin].g_iHumanAmmo = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esLaserTeammate[admin].g_iHumanAmmo, value, -1, 99999); + g_esLaserTeammate[admin].g_iHumanCooldown = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esLaserTeammate[admin].g_iHumanCooldown, value, -1, 99999); + g_esLaserTeammate[admin].g_iHumanDuration = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esLaserTeammate[admin].g_iHumanDuration, value, -1, 99999); + g_esLaserTeammate[admin].g_iHumanMode = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esLaserTeammate[admin].g_iHumanMode, value, -1, 2); + g_esLaserTeammate[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esLaserTeammate[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); + g_esLaserTeammate[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esLaserTeammate[admin].g_iRequiresHumans, value, -1, 32); + g_esLaserTeammate[admin].g_iLaserAbility = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esLaserTeammate[admin].g_iLaserAbility, value, -1, 1); + g_esLaserTeammate[admin].g_iLaserMessage = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esLaserTeammate[admin].g_iLaserMessage, value, -1, 1); + g_esLaserTeammate[admin].g_iLaserSight = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "AbilitySight", "Ability Sight", "Ability_Sight", "sight", g_esLaserTeammate[admin].g_iLaserSight, value, -1, 5); + g_esLaserTeammate[admin].g_flLaserChance = flGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "LaserChance", "Laser Chance", "Laser_Chance", "chance", g_esLaserTeammate[admin].g_flLaserChance, value, -1.0, 100.0); + g_esLaserTeammate[admin].g_iLaserCooldown = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "LaserCooldown", "Laser Cooldown", "Laser_Cooldown", "cooldown", g_esLaserTeammate[admin].g_iLaserCooldown, value, -1, 99999); + g_esLaserTeammate[admin].g_flLaserDamage = flGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "LaserDamage", "Laser Damage", "Laser_Damage", "damage", g_esLaserTeammate[admin].g_flLaserDamage, value, -1.0, 99999.0); + g_esLaserTeammate[admin].g_iLaserDuration = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "LaserDuration", "Laser Duration", "Laser_Duration", "duration", g_esLaserTeammate[admin].g_iLaserDuration, value, -1, 99999); + g_esLaserTeammate[admin].g_flLaserInterval = flGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "LaserInterval", "Laser Interval", "Laser_Interval", "interval", g_esLaserTeammate[admin].g_flLaserInterval, value, -1.0, 99999.0); + g_esLaserTeammate[admin].g_iLaserMode = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "LaserMode", "Laser Mode", "Laser_Mode", "mode", g_esLaserTeammate[admin].g_iLaserMode, value, -1, 1); + g_esLaserTeammate[admin].g_flLaserRange = flGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "LaserRange", "Laser Range", "Laser_Range", "range", g_esLaserTeammate[admin].g_flLaserRange, value, -1.0, 99999.0); + } + else + { + g_esLaserPlayer[admin].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esLaserPlayer[admin].g_flCloseAreasOnly, value, -1.0, 99999.0); + g_esLaserPlayer[admin].g_iComboAbility = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "ComboAbility", "Combo Ability", "Combo_Ability", "combo", g_esLaserPlayer[admin].g_iComboAbility, value, -1, 1); + g_esLaserPlayer[admin].g_iHumanAbility = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esLaserPlayer[admin].g_iHumanAbility, value, -1, 2); + g_esLaserPlayer[admin].g_iHumanAmmo = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esLaserPlayer[admin].g_iHumanAmmo, value, -1, 99999); + g_esLaserPlayer[admin].g_iHumanCooldown = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esLaserPlayer[admin].g_iHumanCooldown, value, -1, 99999); + g_esLaserPlayer[admin].g_iHumanDuration = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esLaserPlayer[admin].g_iHumanDuration, value, -1, 99999); + g_esLaserPlayer[admin].g_iHumanMode = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esLaserPlayer[admin].g_iHumanMode, value, -1, 2); + g_esLaserPlayer[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esLaserPlayer[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); + g_esLaserPlayer[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esLaserPlayer[admin].g_iRequiresHumans, value, -1, 32); + g_esLaserPlayer[admin].g_iLaserAbility = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esLaserPlayer[admin].g_iLaserAbility, value, -1, 1); + g_esLaserPlayer[admin].g_iLaserMessage = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esLaserPlayer[admin].g_iLaserMessage, value, -1, 1); + g_esLaserPlayer[admin].g_iLaserSight = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "AbilitySight", "Ability Sight", "Ability_Sight", "sight", g_esLaserPlayer[admin].g_iLaserSight, value, -1, 5); + g_esLaserPlayer[admin].g_flLaserChance = flGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "LaserChance", "Laser Chance", "Laser_Chance", "chance", g_esLaserPlayer[admin].g_flLaserChance, value, -1.0, 100.0); + g_esLaserPlayer[admin].g_iLaserCooldown = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "LaserCooldown", "Laser Cooldown", "Laser_Cooldown", "cooldown", g_esLaserPlayer[admin].g_iLaserCooldown, value, -1, 99999); + g_esLaserPlayer[admin].g_flLaserDamage = flGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "LaserDamage", "Laser Damage", "Laser_Damage", "damage", g_esLaserPlayer[admin].g_flLaserDamage, value, -1.0, 99999.0); + g_esLaserPlayer[admin].g_iLaserDuration = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "LaserDuration", "Laser Duration", "Laser_Duration", "duration", g_esLaserPlayer[admin].g_iLaserDuration, value, -1, 99999); + g_esLaserPlayer[admin].g_flLaserInterval = flGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "LaserInterval", "Laser Interval", "Laser_Interval", "interval", g_esLaserPlayer[admin].g_flLaserInterval, value, -1.0, 99999.0); + g_esLaserPlayer[admin].g_iLaserMode = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "LaserMode", "Laser Mode", "Laser_Mode", "mode", g_esLaserPlayer[admin].g_iLaserMode, value, -1, 1); + g_esLaserPlayer[admin].g_flLaserRange = flGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "LaserRange", "Laser Range", "Laser_Range", "range", g_esLaserPlayer[admin].g_flLaserRange, value, -1.0, 99999.0); + g_esLaserPlayer[admin].g_iAccessFlags = iGetAdminFlagsValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "AccessFlags", "Access Flags", "Access_Flags", "access", value); + g_esLaserPlayer[admin].g_iImmunityFlags = iGetAdminFlagsValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "ImmunityFlags", "Immunity Flags", "Immunity_Flags", "immunity", value); + } + } + + if (mode < 3 && type > 0) + { + if (special && specsection[0] != '\0') + { + g_esLaserSpecial[type].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esLaserSpecial[type].g_flCloseAreasOnly, value, -1.0, 99999.0); + g_esLaserSpecial[type].g_iComboAbility = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "ComboAbility", "Combo Ability", "Combo_Ability", "combo", g_esLaserSpecial[type].g_iComboAbility, value, -1, 1); + g_esLaserSpecial[type].g_iHumanAbility = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esLaserSpecial[type].g_iHumanAbility, value, -1, 2); + g_esLaserSpecial[type].g_iHumanAmmo = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esLaserSpecial[type].g_iHumanAmmo, value, -1, 99999); + g_esLaserSpecial[type].g_iHumanCooldown = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esLaserSpecial[type].g_iHumanCooldown, value, -1, 99999); + g_esLaserSpecial[type].g_iHumanDuration = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esLaserSpecial[type].g_iHumanDuration, value, -1, 99999); + g_esLaserSpecial[type].g_iHumanMode = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esLaserSpecial[type].g_iHumanMode, value, -1, 2); + g_esLaserSpecial[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esLaserSpecial[type].g_flOpenAreasOnly, value, -1.0, 99999.0); + g_esLaserSpecial[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esLaserSpecial[type].g_iRequiresHumans, value, -1, 32); + g_esLaserSpecial[type].g_iLaserAbility = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esLaserSpecial[type].g_iLaserAbility, value, -1, 1); + g_esLaserSpecial[type].g_iLaserMessage = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esLaserSpecial[type].g_iLaserMessage, value, -1, 1); + g_esLaserSpecial[type].g_iLaserSight = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "AbilitySight", "Ability Sight", "Ability_Sight", "sight", g_esLaserSpecial[type].g_iLaserSight, value, -1, 5); + g_esLaserSpecial[type].g_flLaserChance = flGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "LaserChance", "Laser Chance", "Laser_Chance", "chance", g_esLaserSpecial[type].g_flLaserChance, value, -1.0, 100.0); + g_esLaserSpecial[type].g_iLaserCooldown = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "LaserCooldown", "Laser Cooldown", "Laser_Cooldown", "cooldown", g_esLaserSpecial[type].g_iLaserCooldown, value, -1, 99999); + g_esLaserSpecial[type].g_flLaserDamage = flGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "LaserDamage", "Laser Damage", "Laser_Damage", "damage", g_esLaserSpecial[type].g_flLaserDamage, value, -1.0, 99999.0); + g_esLaserSpecial[type].g_iLaserDuration = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "LaserDuration", "Laser Duration", "Laser_Duration", "duration", g_esLaserSpecial[type].g_iLaserDuration, value, -1, 99999); + g_esLaserSpecial[type].g_flLaserInterval = flGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "LaserInterval", "Laser Interval", "Laser_Interval", "interval", g_esLaserSpecial[type].g_flLaserInterval, value, -1.0, 99999.0); + g_esLaserSpecial[type].g_iLaserMode = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "LaserMode", "Laser Mode", "Laser_Mode", "mode", g_esLaserSpecial[type].g_iLaserMode, value, -1, 1); + g_esLaserSpecial[type].g_flLaserRange = flGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "LaserRange", "Laser Range", "Laser_Range", "range", g_esLaserSpecial[type].g_flLaserRange, value, -1.0, 99999.0); + } + else + { + g_esLaserAbility[type].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esLaserAbility[type].g_flCloseAreasOnly, value, -1.0, 99999.0); + g_esLaserAbility[type].g_iComboAbility = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "ComboAbility", "Combo Ability", "Combo_Ability", "combo", g_esLaserAbility[type].g_iComboAbility, value, -1, 1); + g_esLaserAbility[type].g_iHumanAbility = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esLaserAbility[type].g_iHumanAbility, value, -1, 2); + g_esLaserAbility[type].g_iHumanAmmo = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esLaserAbility[type].g_iHumanAmmo, value, -1, 99999); + g_esLaserAbility[type].g_iHumanCooldown = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esLaserAbility[type].g_iHumanCooldown, value, -1, 99999); + g_esLaserAbility[type].g_iHumanDuration = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esLaserAbility[type].g_iHumanDuration, value, -1, 99999); + g_esLaserAbility[type].g_iHumanMode = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esLaserAbility[type].g_iHumanMode, value, -1, 2); + g_esLaserAbility[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esLaserAbility[type].g_flOpenAreasOnly, value, -1.0, 99999.0); + g_esLaserAbility[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esLaserAbility[type].g_iRequiresHumans, value, -1, 32); + g_esLaserAbility[type].g_iLaserAbility = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esLaserAbility[type].g_iLaserAbility, value, -1, 1); + g_esLaserAbility[type].g_iLaserMessage = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esLaserAbility[type].g_iLaserMessage, value, -1, 1); + g_esLaserAbility[type].g_iLaserSight = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "AbilitySight", "Ability Sight", "Ability_Sight", "sight", g_esLaserAbility[type].g_iLaserSight, value, -1, 5); + g_esLaserAbility[type].g_flLaserChance = flGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "LaserChance", "Laser Chance", "Laser_Chance", "chance", g_esLaserAbility[type].g_flLaserChance, value, -1.0, 100.0); + g_esLaserAbility[type].g_iLaserCooldown = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "LaserCooldown", "Laser Cooldown", "Laser_Cooldown", "cooldown", g_esLaserAbility[type].g_iLaserCooldown, value, -1, 99999); + g_esLaserAbility[type].g_flLaserDamage = flGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "LaserDamage", "Laser Damage", "Laser_Damage", "damage", g_esLaserAbility[type].g_flLaserDamage, value, -1.0, 99999.0); + g_esLaserAbility[type].g_iLaserDuration = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "LaserDuration", "Laser Duration", "Laser_Duration", "duration", g_esLaserAbility[type].g_iLaserDuration, value, -1, 99999); + g_esLaserAbility[type].g_flLaserInterval = flGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "LaserInterval", "Laser Interval", "Laser_Interval", "interval", g_esLaserAbility[type].g_flLaserInterval, value, -1.0, 99999.0); + g_esLaserAbility[type].g_iLaserMode = iGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "LaserMode", "Laser Mode", "Laser_Mode", "mode", g_esLaserAbility[type].g_iLaserMode, value, -1, 1); + g_esLaserAbility[type].g_flLaserRange = flGetKeyValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "LaserRange", "Laser Range", "Laser_Range", "range", g_esLaserAbility[type].g_flLaserRange, value, -1.0, 99999.0); + g_esLaserAbility[type].g_iAccessFlags = iGetAdminFlagsValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "AccessFlags", "Access Flags", "Access_Flags", "access", value); + g_esLaserAbility[type].g_iImmunityFlags = iGetAdminFlagsValue(subsection, MT_LASER_SECTION, MT_LASER_SECTION2, MT_LASER_SECTION3, MT_LASER_SECTION4, key, "ImmunityFlags", "Immunity Flags", "Immunity_Flags", "immunity", value); + } + } +} + +#if defined MT_ABILITIES_MAIN2 +void vLaserSettingsCached(int tank, bool apply, int type) +#else +public void MT_OnSettingsCached(int tank, bool apply, int type) +#endif +{ + bool bHuman = bIsValidClient(tank, MT_CHECK_FAKECLIENT); + g_esLaserPlayer[tank].g_iTankTypeRecorded = apply ? MT_GetRecordedTankType(tank, type) : 0; + g_esLaserPlayer[tank].g_iTankType = apply ? type : 0; + int iType = g_esLaserPlayer[tank].g_iTankTypeRecorded; +#if !defined MT_ABILITIES_MAIN2 + g_iGraphicsLevel = MT_GetGraphicsLevel(); +#endif + if (bIsSpecialInfected(tank, MT_CHECK_INDEX|MT_CHECK_INGAME)) + { + g_esLaserCache[tank].g_flCloseAreasOnly = flGetSubSettingValue(apply, bHuman, g_esLaserTeammate[tank].g_flCloseAreasOnly, g_esLaserPlayer[tank].g_flCloseAreasOnly, g_esLaserSpecial[iType].g_flCloseAreasOnly, g_esLaserAbility[iType].g_flCloseAreasOnly, 1); + g_esLaserCache[tank].g_iComboAbility = iGetSubSettingValue(apply, bHuman, g_esLaserTeammate[tank].g_iComboAbility, g_esLaserPlayer[tank].g_iComboAbility, g_esLaserSpecial[iType].g_iComboAbility, g_esLaserAbility[iType].g_iComboAbility, 1); + g_esLaserCache[tank].g_flLaserChance = flGetSubSettingValue(apply, bHuman, g_esLaserTeammate[tank].g_flLaserChance, g_esLaserPlayer[tank].g_flLaserChance, g_esLaserSpecial[iType].g_flLaserChance, g_esLaserAbility[iType].g_flLaserChance, 1); + g_esLaserCache[tank].g_flLaserDamage = flGetSubSettingValue(apply, bHuman, g_esLaserTeammate[tank].g_flLaserDamage, g_esLaserPlayer[tank].g_flLaserDamage, g_esLaserSpecial[iType].g_flLaserDamage, g_esLaserAbility[iType].g_flLaserDamage, 1); + g_esLaserCache[tank].g_flLaserInterval = flGetSubSettingValue(apply, bHuman, g_esLaserTeammate[tank].g_flLaserInterval, g_esLaserPlayer[tank].g_flLaserInterval, g_esLaserSpecial[iType].g_flLaserInterval, g_esLaserAbility[iType].g_flLaserInterval, 1); + g_esLaserCache[tank].g_flLaserRange = flGetSubSettingValue(apply, bHuman, g_esLaserTeammate[tank].g_flLaserRange, g_esLaserPlayer[tank].g_flLaserRange, g_esLaserSpecial[iType].g_flLaserRange, g_esLaserAbility[iType].g_flLaserRange, 1); + g_esLaserCache[tank].g_iHumanAbility = iGetSubSettingValue(apply, bHuman, g_esLaserTeammate[tank].g_iHumanAbility, g_esLaserPlayer[tank].g_iHumanAbility, g_esLaserSpecial[iType].g_iHumanAbility, g_esLaserAbility[iType].g_iHumanAbility, 1); + g_esLaserCache[tank].g_iHumanAmmo = iGetSubSettingValue(apply, bHuman, g_esLaserTeammate[tank].g_iHumanAmmo, g_esLaserPlayer[tank].g_iHumanAmmo, g_esLaserSpecial[iType].g_iHumanAmmo, g_esLaserAbility[iType].g_iHumanAmmo, 1); + g_esLaserCache[tank].g_iHumanCooldown = iGetSubSettingValue(apply, bHuman, g_esLaserTeammate[tank].g_iHumanCooldown, g_esLaserPlayer[tank].g_iHumanCooldown, g_esLaserSpecial[iType].g_iHumanCooldown, g_esLaserAbility[iType].g_iHumanCooldown, 1); + g_esLaserCache[tank].g_iHumanDuration = iGetSubSettingValue(apply, bHuman, g_esLaserTeammate[tank].g_iHumanDuration, g_esLaserPlayer[tank].g_iHumanDuration, g_esLaserSpecial[iType].g_iHumanDuration, g_esLaserAbility[iType].g_iHumanDuration, 1); + g_esLaserCache[tank].g_iHumanMode = iGetSubSettingValue(apply, bHuman, g_esLaserTeammate[tank].g_iHumanMode, g_esLaserPlayer[tank].g_iHumanMode, g_esLaserSpecial[iType].g_iHumanMode, g_esLaserAbility[iType].g_iHumanMode, 1); + g_esLaserCache[tank].g_iLaserAbility = iGetSubSettingValue(apply, bHuman, g_esLaserTeammate[tank].g_iLaserAbility, g_esLaserPlayer[tank].g_iLaserAbility, g_esLaserSpecial[iType].g_iLaserAbility, g_esLaserAbility[iType].g_iLaserAbility, 1); + g_esLaserCache[tank].g_iLaserCooldown = iGetSubSettingValue(apply, bHuman, g_esLaserTeammate[tank].g_iLaserCooldown, g_esLaserPlayer[tank].g_iLaserCooldown, g_esLaserSpecial[iType].g_iLaserCooldown, g_esLaserAbility[iType].g_iLaserCooldown, 1); + g_esLaserCache[tank].g_iLaserDuration = iGetSubSettingValue(apply, bHuman, g_esLaserTeammate[tank].g_iLaserDuration, g_esLaserPlayer[tank].g_iLaserDuration, g_esLaserSpecial[iType].g_iLaserDuration, g_esLaserAbility[iType].g_iLaserDuration, 1); + g_esLaserCache[tank].g_iLaserMessage = iGetSubSettingValue(apply, bHuman, g_esLaserTeammate[tank].g_iLaserMessage, g_esLaserPlayer[tank].g_iLaserMessage, g_esLaserSpecial[iType].g_iLaserMessage, g_esLaserAbility[iType].g_iLaserMessage, 1); + g_esLaserCache[tank].g_iLaserMode = iGetSubSettingValue(apply, bHuman, g_esLaserTeammate[tank].g_iLaserMode, g_esLaserPlayer[tank].g_iLaserMode, g_esLaserSpecial[iType].g_iLaserMode, g_esLaserAbility[iType].g_iLaserMode, 1); + g_esLaserCache[tank].g_iLaserSight = iGetSubSettingValue(apply, bHuman, g_esLaserTeammate[tank].g_iLaserSight, g_esLaserPlayer[tank].g_iLaserSight, g_esLaserSpecial[iType].g_iLaserSight, g_esLaserAbility[iType].g_iLaserSight, 1); + g_esLaserCache[tank].g_flOpenAreasOnly = flGetSubSettingValue(apply, bHuman, g_esLaserTeammate[tank].g_flOpenAreasOnly, g_esLaserPlayer[tank].g_flOpenAreasOnly, g_esLaserSpecial[iType].g_flOpenAreasOnly, g_esLaserAbility[iType].g_flOpenAreasOnly, 1); + g_esLaserCache[tank].g_iRequiresHumans = iGetSubSettingValue(apply, bHuman, g_esLaserTeammate[tank].g_iRequiresHumans, g_esLaserPlayer[tank].g_iRequiresHumans, g_esLaserSpecial[iType].g_iRequiresHumans, g_esLaserAbility[iType].g_iRequiresHumans, 1); + } + else + { + g_esLaserCache[tank].g_flCloseAreasOnly = flGetSettingValue(apply, bHuman, g_esLaserPlayer[tank].g_flCloseAreasOnly, g_esLaserAbility[iType].g_flCloseAreasOnly, 1); + g_esLaserCache[tank].g_iComboAbility = iGetSettingValue(apply, bHuman, g_esLaserPlayer[tank].g_iComboAbility, g_esLaserAbility[iType].g_iComboAbility, 1); + g_esLaserCache[tank].g_flLaserChance = flGetSettingValue(apply, bHuman, g_esLaserPlayer[tank].g_flLaserChance, g_esLaserAbility[iType].g_flLaserChance, 1); + g_esLaserCache[tank].g_flLaserDamage = flGetSettingValue(apply, bHuman, g_esLaserPlayer[tank].g_flLaserDamage, g_esLaserAbility[iType].g_flLaserDamage, 1); + g_esLaserCache[tank].g_flLaserInterval = flGetSettingValue(apply, bHuman, g_esLaserPlayer[tank].g_flLaserInterval, g_esLaserAbility[iType].g_flLaserInterval, 1); + g_esLaserCache[tank].g_flLaserRange = flGetSettingValue(apply, bHuman, g_esLaserPlayer[tank].g_flLaserRange, g_esLaserAbility[iType].g_flLaserRange, 1); + g_esLaserCache[tank].g_iHumanAbility = iGetSettingValue(apply, bHuman, g_esLaserPlayer[tank].g_iHumanAbility, g_esLaserAbility[iType].g_iHumanAbility, 1); + g_esLaserCache[tank].g_iHumanAmmo = iGetSettingValue(apply, bHuman, g_esLaserPlayer[tank].g_iHumanAmmo, g_esLaserAbility[iType].g_iHumanAmmo, 1); + g_esLaserCache[tank].g_iHumanCooldown = iGetSettingValue(apply, bHuman, g_esLaserPlayer[tank].g_iHumanCooldown, g_esLaserAbility[iType].g_iHumanCooldown, 1); + g_esLaserCache[tank].g_iHumanDuration = iGetSettingValue(apply, bHuman, g_esLaserPlayer[tank].g_iHumanDuration, g_esLaserAbility[iType].g_iHumanDuration, 1); + g_esLaserCache[tank].g_iHumanMode = iGetSettingValue(apply, bHuman, g_esLaserPlayer[tank].g_iHumanMode, g_esLaserAbility[iType].g_iHumanMode, 1); + g_esLaserCache[tank].g_iLaserAbility = iGetSettingValue(apply, bHuman, g_esLaserPlayer[tank].g_iLaserAbility, g_esLaserAbility[iType].g_iLaserAbility, 1); + g_esLaserCache[tank].g_iLaserCooldown = iGetSettingValue(apply, bHuman, g_esLaserPlayer[tank].g_iLaserCooldown, g_esLaserAbility[iType].g_iLaserCooldown, 1); + g_esLaserCache[tank].g_iLaserDuration = iGetSettingValue(apply, bHuman, g_esLaserPlayer[tank].g_iLaserDuration, g_esLaserAbility[iType].g_iLaserDuration, 1); + g_esLaserCache[tank].g_iLaserMessage = iGetSettingValue(apply, bHuman, g_esLaserPlayer[tank].g_iLaserMessage, g_esLaserAbility[iType].g_iLaserMessage, 1); + g_esLaserCache[tank].g_iLaserMode = iGetSettingValue(apply, bHuman, g_esLaserPlayer[tank].g_iLaserMode, g_esLaserAbility[iType].g_iLaserMode, 1); + g_esLaserCache[tank].g_iLaserSight = iGetSettingValue(apply, bHuman, g_esLaserPlayer[tank].g_iLaserSight, g_esLaserAbility[iType].g_iLaserSight, 1); + g_esLaserCache[tank].g_flOpenAreasOnly = flGetSettingValue(apply, bHuman, g_esLaserPlayer[tank].g_flOpenAreasOnly, g_esLaserAbility[iType].g_flOpenAreasOnly, 1); + g_esLaserCache[tank].g_iRequiresHumans = iGetSettingValue(apply, bHuman, g_esLaserPlayer[tank].g_iRequiresHumans, g_esLaserAbility[iType].g_iRequiresHumans, 1); + } +} + +#if defined MT_ABILITIES_MAIN2 +void vLaserCopyStats(int oldTank, int newTank) +#else +public void MT_OnCopyStats(int oldTank, int newTank) +#endif +{ + vLaserCopyStats2(oldTank, newTank); + + if (oldTank != newTank) + { + vRemoveLaser(oldTank); + } +} + +#if !defined MT_ABILITIES_MAIN2 +public void MT_OnPluginUpdate() +{ + MT_ReloadPlugin(null); +} +#endif + +#if defined MT_ABILITIES_MAIN2 +void vLaserEventFired(Event event, const char[] name) +#else +public void MT_OnEventFired(Event event, const char[] name, bool dontBroadcast) +#endif +{ + if (StrEqual(name, "bot_player_replace")) + { + int iBotId = event.GetInt("bot"), iBot = GetClientOfUserId(iBotId), + iTankId = event.GetInt("player"), iTank = GetClientOfUserId(iTankId); + if (bIsValidClient(iBot) && bIsInfected(iTank)) + { + vLaserCopyStats2(iBot, iTank); + vRemoveLaser(iBot); + } + } + else if (StrEqual(name, "mission_lost") || StrEqual(name, "round_start") || StrEqual(name, "round_end")) + { + vLaserReset(); + } + else if (StrEqual(name, "player_bot_replace")) + { + int iTankId = event.GetInt("player"), iTank = GetClientOfUserId(iTankId), + iBotId = event.GetInt("bot"), iBot = GetClientOfUserId(iBotId); + if (bIsValidClient(iTank) && bIsInfected(iBot)) + { + vLaserCopyStats2(iTank, iBot); + vRemoveLaser(iTank); + } + } + else if (StrEqual(name, "player_death") || StrEqual(name, "player_spawn")) + { + int iTankId = event.GetInt("userid"), iTank = GetClientOfUserId(iTankId); + if (MT_IsTankSupported(iTank, MT_CHECK_INDEX|MT_CHECK_INGAME)) + { + vRemoveLaser(iTank); + } + } +} + +#if defined MT_ABILITIES_MAIN2 +void vLaserAbilityActivated(int tank) +#else +public void MT_OnAbilityActivated(int tank) +#endif +{ + if (MT_IsTankSupported(tank, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_FAKECLIENT) && ((!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esLaserAbility[g_esLaserPlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esLaserPlayer[tank].g_iAccessFlags)) || g_esLaserCache[tank].g_iHumanAbility == 0)) + { + return; + } + + if (MT_IsTankSupported(tank) && (!bIsInfected(tank, MT_CHECK_FAKECLIENT) || g_esLaserCache[tank].g_iHumanAbility != 1) && MT_IsCustomTankSupported(tank) && g_esLaserCache[tank].g_iLaserAbility == 1 && g_esLaserCache[tank].g_iComboAbility == 0 && !g_esLaserPlayer[tank].g_bActivated) + { + vLaserAbility(tank); + } +} + +#if defined MT_ABILITIES_MAIN2 +void vLaserButtonPressed(int tank, int button) +#else +public void MT_OnButtonPressed(int tank, int button) +#endif +{ + if (MT_IsTankSupported(tank, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_ALIVE|MT_CHECK_FAKECLIENT) && MT_IsCustomTankSupported(tank)) + { + if (bIsAreaNarrow(tank, g_esLaserCache[tank].g_flOpenAreasOnly) || bIsAreaWide(tank, g_esLaserCache[tank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esLaserPlayer[tank].g_iTankType, tank) || (g_esLaserCache[tank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esLaserCache[tank].g_iRequiresHumans) || (!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esLaserAbility[g_esLaserPlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esLaserPlayer[tank].g_iAccessFlags))) + { + return; + } + + if ((button & MT_MAIN_KEY) && g_esLaserCache[tank].g_iLaserAbility == 1 && g_esLaserCache[tank].g_iHumanAbility == 1) + { + int iHumanMode = g_esLaserCache[tank].g_iHumanMode, iTime = GetTime(); + bool bRecharging = g_esLaserPlayer[tank].g_iCooldown != -1 && g_esLaserPlayer[tank].g_iCooldown >= iTime; + + switch (iHumanMode) + { + case 0: + { + if (!g_esLaserPlayer[tank].g_bActivated && !bRecharging) + { + vLaserAbility(tank); + } + else if (g_esLaserPlayer[tank].g_bActivated) + { + MT_PrintToChat(tank, "%s %t", MT_TAG3, "LaserHuman3"); + } + else if (bRecharging) + { + MT_PrintToChat(tank, "%s %t", MT_TAG3, "LaserHuman4", (g_esLaserPlayer[tank].g_iCooldown - iTime)); + } + } + case 1, 2: + { + if ((iHumanMode == 2 && g_esLaserPlayer[tank].g_bActivated) || (g_esLaserPlayer[tank].g_iAmmoCount < g_esLaserCache[tank].g_iHumanAmmo && g_esLaserCache[tank].g_iHumanAmmo > 0)) + { + if (!g_esLaserPlayer[tank].g_bActivated && !bRecharging) + { + g_esLaserPlayer[tank].g_bActivated = true; + g_esLaserPlayer[tank].g_iAmmoCount++; + + iLaserTarget(tank, tank); + MT_PrintToChat(tank, "%s %t", MT_TAG3, "LaserHuman", g_esLaserPlayer[tank].g_iAmmoCount, g_esLaserCache[tank].g_iHumanAmmo); + } + else if (g_esLaserPlayer[tank].g_bActivated) + { + switch (iHumanMode) + { + case 1: MT_PrintToChat(tank, "%s %t", MT_TAG3, "LaserHuman3"); + case 2: + { + vLaserReset2(tank); + vLaserReset3(tank); + } + } + } + else if (bRecharging) + { + MT_PrintToChat(tank, "%s %t", MT_TAG3, "LaserHuman4", (g_esLaserPlayer[tank].g_iCooldown - iTime)); + } + } + else + { + MT_PrintToChat(tank, "%s %t", MT_TAG3, "LaserAmmo"); + } + } + } + } + } +} + +#if defined MT_ABILITIES_MAIN2 +void vLaserButtonReleased(int tank, int button) +#else +public void MT_OnButtonReleased(int tank, int button) +#endif +{ + if (MT_IsTankSupported(tank, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_ALIVE|MT_CHECK_FAKECLIENT) && g_esLaserCache[tank].g_iHumanAbility == 1) + { + if ((button & MT_MAIN_KEY) && g_esLaserCache[tank].g_iHumanMode == 1 && g_esLaserPlayer[tank].g_bActivated && (g_esLaserPlayer[tank].g_iCooldown == -1 || g_esLaserPlayer[tank].g_iCooldown <= GetTime())) + { + vLaserReset2(tank); + vLaserReset3(tank); + } + } +} + +#if defined MT_ABILITIES_MAIN2 +void vLaserChangeType(int tank, int oldType) +#else +public void MT_OnChangeType(int tank, int oldType, int newType, bool revert) +#endif +{ + if (oldType <= 0) + { + return; + } + + vRemoveLaser(tank); +} + +void vLaser(int tank, int pos = -1) +{ + int iTime = GetTime(); + if (g_esLaserPlayer[tank].g_iCooldown != -1 && g_esLaserPlayer[tank].g_iCooldown >= iTime) + { + return; + } + + g_esLaserPlayer[tank].g_bActivated = true; + + if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esLaserCache[tank].g_iHumanAbility == 1) + { + g_esLaserPlayer[tank].g_iAmmoCount++; + + MT_PrintToChat(tank, "%s %t", MT_TAG3, "LaserHuman", g_esLaserPlayer[tank].g_iAmmoCount, g_esLaserCache[tank].g_iHumanAmmo); + } + + float flInterval = (pos != -1) ? MT_GetCombinationSetting(tank, 6, pos) : g_esLaserCache[tank].g_flLaserInterval; + if (flInterval > 0.0) + { + DataPack dpLaser; + CreateDataTimer(flInterval, tTimerLaser, dpLaser, TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); + dpLaser.WriteCell(GetClientUserId(tank)); + dpLaser.WriteCell(g_esLaserPlayer[tank].g_iTankType); + dpLaser.WriteCell(iTime); + dpLaser.WriteCell(pos); + } +} + +void vLaser2(int tank, int survivor, int target, float range, int pos = -1) +{ + float flTankPos[3], flSurvivorPos[3]; + GetClientEyePosition(survivor, flTankPos); + GetClientEyePosition(target, flSurvivorPos); + if (GetVectorDistance(flTankPos, flSurvivorPos) > range) + { + return; + } + + EmitSoundToAll(((MT_GetRandomInt(1, 2) == 1) ? SOUND_ELECTRICITY : SOUND_ELECTRICITY2), 0, SNDCHAN_AUTO, SNDLEVEL_NORMAL, SND_NOFLAGS, 1.0, SNDPITCH_NORMAL, -1, flSurvivorPos, NULL_VECTOR, true, 0.0); + EmitSoundToAll(((MT_GetRandomInt(1, 2) == 1) ? SOUND_ELECTRICITY : SOUND_ELECTRICITY2), 0, SNDCHAN_AUTO, SNDLEVEL_NORMAL, SND_NOFLAGS, 1.0, SNDPITCH_NORMAL, -1, flTankPos, NULL_VECTOR, true, 0.0); + + if (g_iGraphicsLevel > 2) + { + vAttachParticle2(flSurvivorPos, NULL_VECTOR, PARTICLE_ELECTRICITY, 3.0); + + int iColor[4]; + GetEntityRenderColor(tank, iColor[0], iColor[1], iColor[2], iColor[3]); + TE_SetupBeamPoints(flTankPos, flSurvivorPos, g_iLaserSprite, 0, 0, 0, 0.5, 5.0, 5.0, 1, 0.0, iColor, 0); + TE_SendToAll(); + } + + float flDamage = (pos != -1) ? MT_GetCombinationSetting(tank, 3, pos) : g_esLaserCache[tank].g_flLaserDamage; + if (flDamage > 0.0) + { + vDamagePlayer(target, tank, MT_GetScaledDamage(flDamage), "1024"); + } + + if (g_esLaserCache[tank].g_iLaserMessage == 1) + { + char sTankName[64]; + MT_GetTankName(tank, sTankName); + MT_PrintToChatAll("%s %t", MT_TAG2, "Laser", sTankName, target); + MT_LogMessage(MT_LOG_ABILITY, "%s %T", MT_TAG, "Laser", LANG_SERVER, sTankName, target); + } +} + +void vLaserAbility(int tank) +{ + if ((g_esLaserPlayer[tank].g_iCooldown != -1 && g_esLaserPlayer[tank].g_iCooldown >= GetTime()) || bIsAreaNarrow(tank, g_esLaserCache[tank].g_flOpenAreasOnly) || bIsAreaWide(tank, g_esLaserCache[tank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esLaserPlayer[tank].g_iTankType, tank) || (g_esLaserCache[tank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esLaserCache[tank].g_iRequiresHumans) || (!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esLaserAbility[g_esLaserPlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esLaserPlayer[tank].g_iAccessFlags))) + { + return; + } + + if (!bIsInfected(tank, MT_CHECK_FAKECLIENT) || (g_esLaserPlayer[tank].g_iAmmoCount < g_esLaserCache[tank].g_iHumanAmmo && g_esLaserCache[tank].g_iHumanAmmo > 0)) + { + if (GetRandomFloat(0.1, 100.0) <= g_esLaserCache[tank].g_flLaserChance && !g_esLaserPlayer[tank].g_bActivated) + { + vLaser(tank); + } + else if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esLaserCache[tank].g_iHumanAbility == 1) + { + MT_PrintToChat(tank, "%s %t", MT_TAG3, "LaserHuman2"); + } + } + else if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esLaserCache[tank].g_iHumanAbility == 1) + { + MT_PrintToChat(tank, "%s %t", MT_TAG3, "LaserAmmo"); + } +} + +void vLaserCopyStats2(int oldTank, int newTank) +{ + g_esLaserPlayer[newTank].g_iAmmoCount = g_esLaserPlayer[oldTank].g_iAmmoCount; + g_esLaserPlayer[newTank].g_iCooldown = g_esLaserPlayer[oldTank].g_iCooldown; +} + +void vRemoveLaser(int tank) +{ + g_esLaserPlayer[tank].g_bActivated = false; + g_esLaserPlayer[tank].g_iAmmoCount = 0; + g_esLaserPlayer[tank].g_iCooldown = -1; +} + +void vLaserReset() +{ + for (int iPlayer = 1; iPlayer <= MaxClients; iPlayer++) + { + if (bIsValidClient(iPlayer, MT_CHECK_INGAME)) + { + vRemoveLaser(iPlayer); + } + } +} + +void vLaserReset2(int tank) +{ + g_esLaserPlayer[tank].g_bActivated = false; + + if (g_esLaserCache[tank].g_iLaserMessage == 1) + { + char sTankName[64]; + MT_GetTankName(tank, sTankName); + MT_PrintToChatAll("%s %t", MT_TAG2, "Laser2", sTankName); + MT_LogMessage(MT_LOG_ABILITY, "%s %T", MT_TAG, "Laser2", LANG_SERVER, sTankName); + } +} + +void vLaserReset3(int tank) +{ + int iTime = GetTime(), iPos = g_esLaserAbility[g_esLaserPlayer[tank].g_iTankTypeRecorded].g_iComboPosition, iCooldown = (iPos != -1) ? RoundToNearest(MT_GetCombinationSetting(tank, 2, iPos)) : g_esLaserCache[tank].g_iLaserCooldown; + iCooldown = (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esLaserCache[tank].g_iHumanAbility == 1 && g_esLaserCache[tank].g_iHumanMode == 0 && g_esLaserPlayer[tank].g_iAmmoCount < g_esLaserCache[tank].g_iHumanAmmo && g_esLaserCache[tank].g_iHumanAmmo > 0) ? g_esLaserCache[tank].g_iHumanCooldown : iCooldown; + g_esLaserPlayer[tank].g_iCooldown = (iTime + iCooldown); + if (g_esLaserPlayer[tank].g_iCooldown != -1 && g_esLaserPlayer[tank].g_iCooldown >= iTime) + { + MT_PrintToChat(tank, "%s %t", MT_TAG3, "LaserHuman5", (g_esLaserPlayer[tank].g_iCooldown - iTime)); + } +} + +int iLaserTarget(int tank, int survivor, float range = 0.0, int pos = -1) +{ + float flRange = range; + if (range == 0.0) + { + flRange = (pos != -1) ? MT_GetCombinationSetting(tank, 9, pos) : g_esLaserCache[tank].g_flLaserRange; + } + + if (tank == survivor) + { + float flTankPos[3]; + GetClientEyePosition(survivor, flTankPos); + int iSurvivor = iGetNearestSurvivor(survivor, flTankPos, flRange); + if (bIsSurvivor(iSurvivor) && bIsVisibleToPlayer(tank, survivor, g_esLaserCache[tank].g_iLaserSight, .range = flRange)) + { + vLaser2(tank, survivor, iSurvivor, flRange, pos); + + return iSurvivor; + } + } + else + { + for (int iSurvivor = 1; iSurvivor <= MaxClients; iSurvivor++) + { + if (bIsSurvivor(iSurvivor, MT_CHECK_INGAME|MT_CHECK_ALIVE) && bIsVisibleToPlayer(survivor, iSurvivor, 1, .range = flRange) && !MT_IsAdminImmune(iSurvivor, tank) && !bIsAdminImmune(iSurvivor, g_esLaserPlayer[tank].g_iTankType, g_esLaserAbility[g_esLaserPlayer[tank].g_iTankTypeRecorded].g_iImmunityFlags, g_esLaserPlayer[iSurvivor].g_iImmunityFlags) && iSurvivor != survivor) + { + vLaser2(tank, survivor, iSurvivor, flRange, pos); + } + } + } + + return 0; +} + +Action tTimerLaserCombo(Handle timer, DataPack pack) +{ + pack.Reset(); + + int iTank = GetClientOfUserId(pack.ReadCell()); + if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esLaserAbility[g_esLaserPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esLaserPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esLaserPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esLaserCache[iTank].g_iLaserAbility == 0 || g_esLaserPlayer[iTank].g_bActivated) + { + return Plugin_Stop; + } + + int iPos = pack.ReadCell(); + vLaser(iTank, iPos); + + return Plugin_Continue; +} + +Action tTimerLaser(Handle timer, DataPack pack) +{ + pack.Reset(); + + int iTank = GetClientOfUserId(pack.ReadCell()), iType = pack.ReadCell(); + if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || bIsAreaNarrow(iTank, g_esLaserCache[iTank].g_flOpenAreasOnly) || bIsAreaWide(iTank, g_esLaserCache[iTank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esLaserPlayer[iTank].g_iTankType, iTank) || (g_esLaserCache[iTank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esLaserCache[iTank].g_iRequiresHumans) || !MT_HasAdminAccess(iTank) || !bHasAdminAccess(iTank, g_esLaserAbility[g_esLaserPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esLaserPlayer[iTank].g_iAccessFlags) || !MT_IsTypeEnabled(g_esLaserPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || iType != g_esLaserPlayer[iTank].g_iTankType || !g_esLaserPlayer[iTank].g_bActivated) + { + vLaserReset2(iTank); + + return Plugin_Stop; + } + + int iTime = pack.ReadCell(), iPos = pack.ReadCell(), + iDuration = (iPos != -1) ? RoundToNearest(MT_GetCombinationSetting(iTank, 5, iPos)) : g_esLaserCache[iTank].g_iLaserDuration; + iDuration = (bIsInfected(iTank, MT_CHECK_FAKECLIENT) && g_esLaserCache[iTank].g_iHumanAbility == 1) ? g_esLaserCache[iTank].g_iHumanDuration : iDuration; + if ((iTime + iDuration) <= GetTime()) + { + vLaserReset2(iTank); + vLaserReset3(iTank); + + return Plugin_Stop; + } + + float flRange = (iPos != -1) ? MT_GetCombinationSetting(iTank, 9, iPos) : g_esLaserCache[iTank].g_flLaserRange; + int iSurvivor = iLaserTarget(iTank, iTank, flRange, iPos); + if (g_esLaserCache[iTank].g_iLaserMode == 1 && iSurvivor > 0) + { + iLaserTarget(iTank, iSurvivor, (flRange / 2.0), iPos); + } + + return Plugin_Continue; } \ No newline at end of file diff --git a/addons/sourcemod/scripting/mutant_tanks/abilities/mt_lightning.sp b/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_lightning.sp similarity index 95% rename from addons/sourcemod/scripting/mutant_tanks/abilities/mt_lightning.sp rename to addons/sourcemod/scripting/mutant_tanks/abilities2/mt_lightning.sp index 7f030c892e..abf18e703e 100644 --- a/addons/sourcemod/scripting/mutant_tanks/abilities/mt_lightning.sp +++ b/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_lightning.sp @@ -1,1132 +1,1154 @@ -/** - * Mutant Tanks: a L4D/L4D2 SourceMod Plugin - * Copyright (C) 2024 Alfred "Psyk0tik" Llagas - * - * 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 . - **/ - -#define MT_LIGHTNING_COMPILE_METHOD 0 // 0: packaged, 1: standalone - -#if !defined MT_ABILITIES_MAIN - #if MT_LIGHTNING_COMPILE_METHOD == 1 - #include - #include - #else - #error This file must be inside "scripting/mutant_tanks/abilities" while compiling "mt_abilities.sp" to include its content. - #endif -public Plugin myinfo = -{ - name = "[MT] Lightning Ability", - author = MT_AUTHOR, - description = "The Mutant Tank creates lightning storms.", - version = MT_VERSION, - url = MT_URL -}; - -bool g_bDedicated, g_bSecondGame; - -public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max) -{ - switch (GetEngineVersion()) - { - case Engine_Left4Dead: g_bSecondGame = false; - case Engine_Left4Dead2: g_bSecondGame = true; - default: - { - strcopy(error, err_max, "\"[MT] Lightning Ability\" only supports Left 4 Dead 1 & 2."); - - return APLRes_SilentFailure; - } - } - - g_bDedicated = IsDedicatedServer(); - - return APLRes_Success; -} - -#define PARTICLE_LIGHTNING "storm_lightning_01" - -#define SPRITE_EXPLODE "sprites/zerogxplode.spr" -#else - #if MT_LIGHTNING_COMPILE_METHOD == 1 - #error This file must be compiled as a standalone plugin. - #endif -#endif - -#define MT_LIGHTNING_SECTION "lightningability" -#define MT_LIGHTNING_SECTION2 "lightning ability" -#define MT_LIGHTNING_SECTION3 "lightning_ability" -#define MT_LIGHTNING_SECTION4 "lightning" - -#define MT_MENU_LIGHTNING "Lightning Ability" - -char g_sLightningSounds[8][26] = -{ - "ambient/energy/zap1.wav", - "ambient/energy/zap2.wav", - "ambient/energy/zap3.wav", - "ambient/energy/zap5.wav", - "ambient/energy/zap6.wav", - "ambient/energy/zap7.wav", - "ambient/energy/zap8.wav", - "ambient/energy/zap9.wav" -}; - -enum struct esLightningPlayer -{ - bool g_bActivated; - - float g_flCloseAreasOnly; - float g_flLightningChance; - float g_flLightningDamage; - float g_flLightningInterval; - float g_flOpenAreasOnly; - - int g_iAccessFlags; - int g_iAmmoCount; - int g_iComboAbility; - int g_iCooldown; - int g_iHumanAbility; - int g_iHumanAmmo; - int g_iHumanCooldown; - int g_iHumanDuration; - int g_iHumanMode; - int g_iImmunityFlags; - int g_iLightningAbility; - int g_iLightningCooldown; - int g_iLightningDuration; - int g_iLightningMessage; - int g_iLightningSight; - int g_iRequiresHumans; - int g_iTankType; - int g_iTankTypeRecorded; -} - -esLightningPlayer g_esLightningPlayer[MAXPLAYERS + 1]; - -enum struct esLightningTeammate -{ - float g_flCloseAreasOnly; - float g_flLightningChance; - float g_flLightningDamage; - float g_flLightningInterval; - float g_flOpenAreasOnly; - - int g_iComboAbility; - int g_iHumanAbility; - int g_iHumanAmmo; - int g_iHumanCooldown; - int g_iHumanDuration; - int g_iHumanMode; - int g_iLightningAbility; - int g_iLightningCooldown; - int g_iLightningDuration; - int g_iLightningMessage; - int g_iLightningSight; - int g_iRequiresHumans; -} - -esLightningTeammate g_esLightningTeammate[MAXPLAYERS + 1]; - -enum struct esLightningAbility -{ - float g_flCloseAreasOnly; - float g_flLightningChance; - float g_flLightningDamage; - float g_flLightningInterval; - float g_flOpenAreasOnly; - - int g_iAccessFlags; - int g_iComboAbility; - int g_iComboPosition; - int g_iHumanAbility; - int g_iHumanAmmo; - int g_iHumanCooldown; - int g_iHumanDuration; - int g_iHumanMode; - int g_iImmunityFlags; - int g_iLightningAbility; - int g_iLightningCooldown; - int g_iLightningDuration; - int g_iLightningMessage; - int g_iLightningSight; - int g_iRequiresHumans; -} - -esLightningAbility g_esLightningAbility[MT_MAXTYPES + 1]; - -enum struct esLightningSpecial -{ - float g_flCloseAreasOnly; - float g_flLightningChance; - float g_flLightningDamage; - float g_flLightningInterval; - float g_flOpenAreasOnly; - - int g_iComboAbility; - int g_iHumanAbility; - int g_iHumanAmmo; - int g_iHumanCooldown; - int g_iHumanDuration; - int g_iHumanMode; - int g_iLightningAbility; - int g_iLightningCooldown; - int g_iLightningDuration; - int g_iLightningMessage; - int g_iLightningSight; - int g_iRequiresHumans; -} - -esLightningSpecial g_esLightningSpecial[MT_MAXTYPES + 1]; - -enum struct esLightningCache -{ - float g_flCloseAreasOnly; - float g_flLightningChance; - float g_flLightningDamage; - float g_flLightningInterval; - float g_flOpenAreasOnly; - - int g_iComboAbility; - int g_iHumanAbility; - int g_iHumanAmmo; - int g_iHumanCooldown; - int g_iHumanDuration; - int g_iHumanMode; - int g_iLightningAbility; - int g_iLightningCooldown; - int g_iLightningDuration; - int g_iLightningMessage; - int g_iLightningSight; - int g_iRequiresHumans; -} - -esLightningCache g_esLightningCache[MAXPLAYERS + 1]; - -#if !defined MT_ABILITIES_MAIN -public void OnPluginStart() -{ - LoadTranslations("common.phrases"); - LoadTranslations("mutant_tanks.phrases"); - LoadTranslations("mutant_tanks_names.phrases"); - - RegConsoleCmd("sm_mt_lightning", cmdLightningInfo, "View information about the Lightning ability."); -} -#endif - -#if defined MT_ABILITIES_MAIN -void vLightningMapStart() -#else -public void OnMapStart() -#endif -{ - if (g_bSecondGame) - { - PrecacheModel(SPRITE_EXPLODE, true); - iPrecacheParticle(PARTICLE_LIGHTNING); - - for (int iPos = 0; iPos < (sizeof g_sLightningSounds); iPos++) - { - PrecacheSound(g_sLightningSounds[iPos], true); - } - } - - vLightningReset(); -} - -#if defined MT_ABILITIES_MAIN -void vLightningClientPutInServer(int client) -#else -public void OnClientPutInServer(int client) -#endif -{ - vRemoveLightning(client); -} - -#if defined MT_ABILITIES_MAIN -void vLightningClientDisconnect_Post(int client) -#else -public void OnClientDisconnect_Post(int client) -#endif -{ - vRemoveLightning(client); -} - -#if defined MT_ABILITIES_MAIN -void vLightningMapEnd() -#else -public void OnMapEnd() -#endif -{ - vLightningReset(); -} - -#if !defined MT_ABILITIES_MAIN -Action cmdLightningInfo(int client, int args) -{ - client = iGetListenServerHost(client, g_bDedicated); - - if (!MT_IsCorePluginEnabled()) - { - MT_ReplyToCommand(client, "%s %t", MT_TAG5, "PluginDisabled"); - - return Plugin_Handled; - } - - if (!bIsValidClient(client, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_FAKECLIENT)) - { - MT_ReplyToCommand(client, "%s %t", MT_TAG, "Command is in-game only"); - - return Plugin_Handled; - } - - switch (IsVoteInProgress()) - { - case true: MT_ReplyToCommand(client, "%s %t", MT_TAG2, "Vote in Progress"); - case false: vLightningMenu(client, MT_LIGHTNING_SECTION4, 0); - } - - return Plugin_Handled; -} -#endif - -void vLightningMenu(int client, const char[] name, int item) -{ - if (StrContains(MT_LIGHTNING_SECTION4, name, false) == -1) - { - return; - } - - Menu mAbilityMenu = new Menu(iLightningMenuHandler, MENU_ACTIONS_DEFAULT|MenuAction_Display|MenuAction_DisplayItem); - mAbilityMenu.SetTitle("Lightning Ability Information"); - mAbilityMenu.AddItem("Status", "Status"); - mAbilityMenu.AddItem("Ammunition", "Ammunition"); - mAbilityMenu.AddItem("Buttons", "Buttons"); - mAbilityMenu.AddItem("Button Mode", "Button Mode"); - mAbilityMenu.AddItem("Cooldown", "Cooldown"); - mAbilityMenu.AddItem("Details", "Details"); - mAbilityMenu.AddItem("Duration", "Duration"); - mAbilityMenu.AddItem("Human Support", "Human Support"); - mAbilityMenu.DisplayAt(client, item, MENU_TIME_FOREVER); -} - -int iLightningMenuHandler(Menu menu, MenuAction action, int param1, int param2) -{ - switch (action) - { - case MenuAction_End: delete menu; - case MenuAction_Select: - { - switch (param2) - { - case 0: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esLightningCache[param1].g_iLightningAbility == 0) ? "AbilityStatus1" : "AbilityStatus2"); - case 1: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityAmmo", (g_esLightningCache[param1].g_iHumanAmmo - g_esLightningPlayer[param1].g_iAmmoCount), g_esLightningCache[param1].g_iHumanAmmo); - case 2: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtons"); - case 3: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esLightningCache[param1].g_iHumanMode == 0) ? "AbilityButtonMode1" : "AbilityButtonMode2"); - case 4: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityCooldown", ((g_esLightningCache[param1].g_iHumanAbility == 1) ? g_esLightningCache[param1].g_iHumanCooldown : g_esLightningCache[param1].g_iLightningCooldown)); - case 5: MT_PrintToChat(param1, "%s %t", MT_TAG3, "LightningDetails"); - case 6: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityDuration2", ((g_esLightningCache[param1].g_iHumanAbility == 1) ? g_esLightningCache[param1].g_iHumanDuration : g_esLightningCache[param1].g_iLightningDuration)); - case 7: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esLightningCache[param1].g_iHumanAbility == 0) ? "AbilityHumanSupport1" : "AbilityHumanSupport2"); - } - - if (bIsValidClient(param1, MT_CHECK_INGAME)) - { - vLightningMenu(param1, MT_LIGHTNING_SECTION4, menu.Selection); - } - } - case MenuAction_Display: - { - char sMenuTitle[PLATFORM_MAX_PATH]; - Panel pLightning = view_as(param2); - FormatEx(sMenuTitle, sizeof sMenuTitle, "%T", "LightningMenu", param1); - pLightning.SetTitle(sMenuTitle); - } - case MenuAction_DisplayItem: - { - if (param2 >= 0) - { - char sMenuOption[PLATFORM_MAX_PATH]; - - switch (param2) - { - case 0: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Status", param1); - case 1: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Ammunition", param1); - case 2: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Buttons", param1); - case 3: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "ButtonMode", param1); - case 4: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Cooldown", param1); - case 5: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Details", param1); - case 6: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Duration", param1); - case 7: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "HumanSupport", param1); - } - - return RedrawMenuItem(sMenuOption); - } - } - } - - return 0; -} - -#if defined MT_ABILITIES_MAIN -void vLightningDisplayMenu(Menu menu) -#else -public void MT_OnDisplayMenu(Menu menu) -#endif -{ - menu.AddItem(MT_MENU_LIGHTNING, MT_MENU_LIGHTNING); -} - -#if defined MT_ABILITIES_MAIN -void vLightningMenuItemSelected(int client, const char[] info) -#else -public void MT_OnMenuItemSelected(int client, const char[] info) -#endif -{ - if (StrEqual(info, MT_MENU_LIGHTNING, false)) - { - vLightningMenu(client, MT_LIGHTNING_SECTION4, 0); - } -} - -#if defined MT_ABILITIES_MAIN -void vLightningMenuItemDisplayed(int client, const char[] info, char[] buffer, int size) -#else -public void MT_OnMenuItemDisplayed(int client, const char[] info, char[] buffer, int size) -#endif -{ - if (StrEqual(info, MT_MENU_LIGHTNING, false)) - { - FormatEx(buffer, size, "%T", "LightningMenu2", client); - } -} - -#if defined MT_ABILITIES_MAIN -void vLightningPluginCheck(ArrayList list) -#else -public void MT_OnPluginCheck(ArrayList list) -#endif -{ - list.PushString(MT_MENU_LIGHTNING); -} - -#if defined MT_ABILITIES_MAIN -void vLightningAbilityCheck(ArrayList list, ArrayList list2, ArrayList list3, ArrayList list4) -#else -public void MT_OnAbilityCheck(ArrayList list, ArrayList list2, ArrayList list3, ArrayList list4) -#endif -{ - list.PushString(MT_LIGHTNING_SECTION); - list2.PushString(MT_LIGHTNING_SECTION2); - list3.PushString(MT_LIGHTNING_SECTION3); - list4.PushString(MT_LIGHTNING_SECTION4); -} - -#if defined MT_ABILITIES_MAIN -void vLightningCombineAbilities(int tank, int type, const float random, const char[] combo) -#else -public void MT_OnCombineAbilities(int tank, int type, const float random, const char[] combo, int survivor, int weapon, const char[] classname) -#endif -{ - if (!g_bSecondGame || (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esLightningCache[tank].g_iHumanAbility != 2)) - { - g_esLightningAbility[g_esLightningPlayer[tank].g_iTankTypeRecorded].g_iComboPosition = -1; - - return; - } - - g_esLightningAbility[g_esLightningPlayer[tank].g_iTankTypeRecorded].g_iComboPosition = -1; - - char sCombo[320], sSet[4][32]; - FormatEx(sCombo, sizeof sCombo, ",%s,", combo); - FormatEx(sSet[0], sizeof sSet[], ",%s,", MT_LIGHTNING_SECTION); - FormatEx(sSet[1], sizeof sSet[], ",%s,", MT_LIGHTNING_SECTION2); - FormatEx(sSet[2], sizeof sSet[], ",%s,", MT_LIGHTNING_SECTION3); - FormatEx(sSet[3], sizeof sSet[], ",%s,", MT_LIGHTNING_SECTION4); - if (StrContains(sCombo, sSet[0], false) != -1 || StrContains(sCombo, sSet[1], false) != -1 || StrContains(sCombo, sSet[2], false) != -1 || StrContains(sCombo, sSet[3], false) != -1) - { - if (type == MT_COMBO_MAINRANGE && g_esLightningCache[tank].g_iLightningAbility == 1 && g_esLightningCache[tank].g_iComboAbility == 1 && !g_esLightningPlayer[tank].g_bActivated) - { - char sAbilities[320], sSubset[10][32]; - strcopy(sAbilities, sizeof sAbilities, combo); - ExplodeString(sAbilities, ",", sSubset, sizeof sSubset, sizeof sSubset[]); - - float flDelay = 0.0; - for (int iPos = 0; iPos < (sizeof sSubset); iPos++) - { - if (StrEqual(sSubset[iPos], MT_LIGHTNING_SECTION, false) || StrEqual(sSubset[iPos], MT_LIGHTNING_SECTION2, false) || StrEqual(sSubset[iPos], MT_LIGHTNING_SECTION3, false) || StrEqual(sSubset[iPos], MT_LIGHTNING_SECTION4, false)) - { - g_esLightningAbility[g_esLightningPlayer[tank].g_iTankTypeRecorded].g_iComboPosition = iPos; - - if (random <= MT_GetCombinationSetting(tank, 1, iPos)) - { - flDelay = MT_GetCombinationSetting(tank, 4, iPos); - - switch (flDelay) - { - case 0.0: vLightning(tank, iPos); - default: - { - DataPack dpCombo; - CreateDataTimer(flDelay, tTimerLightningCombo, dpCombo, TIMER_FLAG_NO_MAPCHANGE); - dpCombo.WriteCell(GetClientUserId(tank)); - dpCombo.WriteCell(iPos); - } - } - } - - break; - } - } - } - } -} - -#if defined MT_ABILITIES_MAIN -void vLightningConfigsLoad(int mode) -#else -public void MT_OnConfigsLoad(int mode) -#endif -{ - switch (mode) - { - case 1: - { - for (int iIndex = MT_GetMinType(); iIndex <= MT_GetMaxType(); iIndex++) - { - g_esLightningAbility[iIndex].g_iAccessFlags = 0; - g_esLightningAbility[iIndex].g_iImmunityFlags = 0; - g_esLightningAbility[iIndex].g_flCloseAreasOnly = 0.0; - g_esLightningAbility[iIndex].g_iComboAbility = 0; - g_esLightningAbility[iIndex].g_iComboPosition = -1; - g_esLightningAbility[iIndex].g_iHumanAbility = 0; - g_esLightningAbility[iIndex].g_iHumanAmmo = 5; - g_esLightningAbility[iIndex].g_iHumanCooldown = 0; - g_esLightningAbility[iIndex].g_iHumanDuration = 5; - g_esLightningAbility[iIndex].g_iHumanMode = 1; - g_esLightningAbility[iIndex].g_flOpenAreasOnly = 0.0; - g_esLightningAbility[iIndex].g_iRequiresHumans = 0; - g_esLightningAbility[iIndex].g_iLightningAbility = 0; - g_esLightningAbility[iIndex].g_iLightningMessage = 0; - g_esLightningAbility[iIndex].g_flLightningChance = 33.3; - g_esLightningAbility[iIndex].g_iLightningCooldown = 0; - g_esLightningAbility[iIndex].g_flLightningDamage = 5.0; - g_esLightningAbility[iIndex].g_iLightningDuration = 5; - g_esLightningAbility[iIndex].g_flLightningInterval = 1.0; - g_esLightningAbility[iIndex].g_iLightningSight = 0; - - g_esLightningSpecial[iIndex].g_flCloseAreasOnly = -1.0; - g_esLightningSpecial[iIndex].g_iComboAbility = -1; - g_esLightningSpecial[iIndex].g_iHumanAbility = -1; - g_esLightningSpecial[iIndex].g_iHumanAmmo = -1; - g_esLightningSpecial[iIndex].g_iHumanCooldown = -1; - g_esLightningSpecial[iIndex].g_iHumanDuration = -1; - g_esLightningSpecial[iIndex].g_iHumanMode = -1; - g_esLightningSpecial[iIndex].g_flOpenAreasOnly = -1.0; - g_esLightningSpecial[iIndex].g_iRequiresHumans = -1; - g_esLightningSpecial[iIndex].g_iLightningAbility = -1; - g_esLightningSpecial[iIndex].g_iLightningMessage = -1; - g_esLightningSpecial[iIndex].g_flLightningChance = -1.0; - g_esLightningSpecial[iIndex].g_iLightningCooldown = -1; - g_esLightningSpecial[iIndex].g_flLightningDamage = -1.0; - g_esLightningSpecial[iIndex].g_iLightningDuration = -1; - g_esLightningSpecial[iIndex].g_flLightningInterval = -1.0; - g_esLightningSpecial[iIndex].g_iLightningSight = -1; - } - } - case 3: - { - for (int iPlayer = 1; iPlayer <= MaxClients; iPlayer++) - { - g_esLightningPlayer[iPlayer].g_iAccessFlags = -1; - g_esLightningPlayer[iPlayer].g_iImmunityFlags = -1; - g_esLightningPlayer[iPlayer].g_flCloseAreasOnly = -1.0; - g_esLightningPlayer[iPlayer].g_iComboAbility = -1; - g_esLightningPlayer[iPlayer].g_iHumanAbility = -1; - g_esLightningPlayer[iPlayer].g_iHumanAmmo = -1; - g_esLightningPlayer[iPlayer].g_iHumanCooldown = -1; - g_esLightningPlayer[iPlayer].g_iHumanDuration = -1; - g_esLightningPlayer[iPlayer].g_iHumanMode = -1; - g_esLightningPlayer[iPlayer].g_flOpenAreasOnly = -1.0; - g_esLightningPlayer[iPlayer].g_iRequiresHumans = -1; - g_esLightningPlayer[iPlayer].g_iLightningAbility = -1; - g_esLightningPlayer[iPlayer].g_iLightningMessage = -1; - g_esLightningPlayer[iPlayer].g_flLightningChance = -1.0; - g_esLightningPlayer[iPlayer].g_iLightningCooldown = -1; - g_esLightningPlayer[iPlayer].g_flLightningDamage = -1.0; - g_esLightningPlayer[iPlayer].g_iLightningDuration = -1; - g_esLightningPlayer[iPlayer].g_flLightningInterval = -1.0; - g_esLightningPlayer[iPlayer].g_iLightningSight = -1; - - g_esLightningTeammate[iPlayer].g_flCloseAreasOnly = -1.0; - g_esLightningTeammate[iPlayer].g_iComboAbility = -1; - g_esLightningTeammate[iPlayer].g_iHumanAbility = -1; - g_esLightningTeammate[iPlayer].g_iHumanAmmo = -1; - g_esLightningTeammate[iPlayer].g_iHumanCooldown = -1; - g_esLightningTeammate[iPlayer].g_iHumanDuration = -1; - g_esLightningTeammate[iPlayer].g_iHumanMode = -1; - g_esLightningTeammate[iPlayer].g_flOpenAreasOnly = -1.0; - g_esLightningTeammate[iPlayer].g_iRequiresHumans = -1; - g_esLightningTeammate[iPlayer].g_iLightningAbility = -1; - g_esLightningTeammate[iPlayer].g_iLightningMessage = -1; - g_esLightningTeammate[iPlayer].g_flLightningChance = -1.0; - g_esLightningTeammate[iPlayer].g_iLightningCooldown = -1; - g_esLightningTeammate[iPlayer].g_flLightningDamage = -1.0; - g_esLightningTeammate[iPlayer].g_iLightningDuration = -1; - g_esLightningTeammate[iPlayer].g_flLightningInterval = -1.0; - g_esLightningTeammate[iPlayer].g_iLightningSight = -1; - } - } - } -} - -#if defined MT_ABILITIES_MAIN -void vLightningConfigsLoaded(const char[] subsection, const char[] key, const char[] value, int type, int admin, int mode, bool special, const char[] specsection) -#else -public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const char[] value, int type, int admin, int mode, bool special, const char[] specsection) -#endif -{ - if ((mode == -1 || mode == 3) && bIsValidClient(admin)) - { - if (special && specsection[0] != '\0') - { - g_esLightningTeammate[admin].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esLightningTeammate[admin].g_flCloseAreasOnly, value, -1.0, 99999.0); - g_esLightningTeammate[admin].g_iComboAbility = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "ComboAbility", "Combo Ability", "Combo_Ability", "combo", g_esLightningTeammate[admin].g_iComboAbility, value, -1, 1); - g_esLightningTeammate[admin].g_iHumanAbility = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esLightningTeammate[admin].g_iHumanAbility, value, -1, 2); - g_esLightningTeammate[admin].g_iHumanAmmo = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esLightningTeammate[admin].g_iHumanAmmo, value, -1, 99999); - g_esLightningTeammate[admin].g_iHumanCooldown = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esLightningTeammate[admin].g_iHumanCooldown, value, -1, 99999); - g_esLightningTeammate[admin].g_iHumanDuration = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esLightningTeammate[admin].g_iHumanDuration, value, -1, 99999); - g_esLightningTeammate[admin].g_iHumanMode = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esLightningTeammate[admin].g_iHumanMode, value, -1, 1); - g_esLightningTeammate[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esLightningTeammate[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); - g_esLightningTeammate[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esLightningTeammate[admin].g_iRequiresHumans, value, -1, 32); - g_esLightningTeammate[admin].g_iLightningAbility = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esLightningTeammate[admin].g_iLightningAbility, value, -1, 1); - g_esLightningTeammate[admin].g_iLightningMessage = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esLightningTeammate[admin].g_iLightningMessage, value, -1, 1); - g_esLightningTeammate[admin].g_iLightningSight = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "AbilitySight", "Ability Sight", "Ability_Sight", "sight", g_esLightningTeammate[admin].g_iLightningSight, value, -1, 5); - g_esLightningTeammate[admin].g_flLightningChance = flGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "LightningChance", "Lightning Chance", "Lightning_Chance", "chance", g_esLightningTeammate[admin].g_flLightningChance, value, -1.0, 100.0); - g_esLightningTeammate[admin].g_iLightningCooldown = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "LightningCooldown", "Lightning Cooldown", "Lightning_Cooldown", "cooldown", g_esLightningTeammate[admin].g_iLightningCooldown, value, -1, 99999); - g_esLightningTeammate[admin].g_flLightningDamage = flGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "LightningDamage", "Lightning Damage", "Lightning_Damage", "damage", g_esLightningTeammate[admin].g_flLightningDamage, value, -1.0, 99999.0); - g_esLightningTeammate[admin].g_iLightningDuration = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "LightningDuration", "Lightning Duration", "Lightning_Duration", "duration", g_esLightningTeammate[admin].g_iLightningDuration, value, -1, 99999); - g_esLightningTeammate[admin].g_flLightningInterval = flGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "LightningInterval", "Lightning Interval", "Lightning_Interval", "interval", g_esLightningTeammate[admin].g_flLightningInterval, value, -1.0, 99999.0); - } - else - { - g_esLightningPlayer[admin].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esLightningPlayer[admin].g_flCloseAreasOnly, value, -1.0, 99999.0); - g_esLightningPlayer[admin].g_iComboAbility = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "ComboAbility", "Combo Ability", "Combo_Ability", "combo", g_esLightningPlayer[admin].g_iComboAbility, value, -1, 1); - g_esLightningPlayer[admin].g_iHumanAbility = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esLightningPlayer[admin].g_iHumanAbility, value, -1, 2); - g_esLightningPlayer[admin].g_iHumanAmmo = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esLightningPlayer[admin].g_iHumanAmmo, value, -1, 99999); - g_esLightningPlayer[admin].g_iHumanCooldown = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esLightningPlayer[admin].g_iHumanCooldown, value, -1, 99999); - g_esLightningPlayer[admin].g_iHumanDuration = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esLightningPlayer[admin].g_iHumanDuration, value, -1, 99999); - g_esLightningPlayer[admin].g_iHumanMode = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esLightningPlayer[admin].g_iHumanMode, value, -1, 1); - g_esLightningPlayer[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esLightningPlayer[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); - g_esLightningPlayer[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esLightningPlayer[admin].g_iRequiresHumans, value, -1, 32); - g_esLightningPlayer[admin].g_iLightningAbility = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esLightningPlayer[admin].g_iLightningAbility, value, -1, 1); - g_esLightningPlayer[admin].g_iLightningMessage = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esLightningPlayer[admin].g_iLightningMessage, value, -1, 1); - g_esLightningPlayer[admin].g_iLightningSight = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "AbilitySight", "Ability Sight", "Ability_Sight", "sight", g_esLightningPlayer[admin].g_iLightningSight, value, -1, 5); - g_esLightningPlayer[admin].g_flLightningChance = flGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "LightningChance", "Lightning Chance", "Lightning_Chance", "chance", g_esLightningPlayer[admin].g_flLightningChance, value, -1.0, 100.0); - g_esLightningPlayer[admin].g_iLightningCooldown = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "LightningCooldown", "Lightning Cooldown", "Lightning_Cooldown", "cooldown", g_esLightningPlayer[admin].g_iLightningCooldown, value, -1, 99999); - g_esLightningPlayer[admin].g_flLightningDamage = flGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "LightningDamage", "Lightning Damage", "Lightning_Damage", "damage", g_esLightningPlayer[admin].g_flLightningDamage, value, -1.0, 99999.0); - g_esLightningPlayer[admin].g_iLightningDuration = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "LightningDuration", "Lightning Duration", "Lightning_Duration", "duration", g_esLightningPlayer[admin].g_iLightningDuration, value, -1, 99999); - g_esLightningPlayer[admin].g_flLightningInterval = flGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "LightningInterval", "Lightning Interval", "Lightning_Interval", "interval", g_esLightningPlayer[admin].g_flLightningInterval, value, -1.0, 99999.0); - g_esLightningPlayer[admin].g_iAccessFlags = iGetAdminFlagsValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "AccessFlags", "Access Flags", "Access_Flags", "access", value); - g_esLightningPlayer[admin].g_iImmunityFlags = iGetAdminFlagsValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "ImmunityFlags", "Immunity Flags", "Immunity_Flags", "immunity", value); - } - } - - if (mode < 3 && type > 0) - { - if (special && specsection[0] != '\0') - { - g_esLightningSpecial[type].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esLightningSpecial[type].g_flCloseAreasOnly, value, -1.0, 99999.0); - g_esLightningSpecial[type].g_iComboAbility = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "ComboAbility", "Combo Ability", "Combo_Ability", "combo", g_esLightningSpecial[type].g_iComboAbility, value, -1, 1); - g_esLightningSpecial[type].g_iHumanAbility = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esLightningSpecial[type].g_iHumanAbility, value, -1, 2); - g_esLightningSpecial[type].g_iHumanAmmo = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esLightningSpecial[type].g_iHumanAmmo, value, -1, 99999); - g_esLightningSpecial[type].g_iHumanCooldown = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esLightningSpecial[type].g_iHumanCooldown, value, -1, 99999); - g_esLightningSpecial[type].g_iHumanDuration = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esLightningSpecial[type].g_iHumanDuration, value, -1, 99999); - g_esLightningSpecial[type].g_iHumanMode = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esLightningSpecial[type].g_iHumanMode, value, -1, 1); - g_esLightningSpecial[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esLightningSpecial[type].g_flOpenAreasOnly, value, -1.0, 99999.0); - g_esLightningSpecial[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esLightningSpecial[type].g_iRequiresHumans, value, -1, 32); - g_esLightningSpecial[type].g_iLightningAbility = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esLightningSpecial[type].g_iLightningAbility, value, -1, 1); - g_esLightningSpecial[type].g_iLightningMessage = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esLightningSpecial[type].g_iLightningMessage, value, -1, 1); - g_esLightningSpecial[type].g_iLightningSight = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "AbilitySight", "Ability Sight", "Ability_Sight", "sight", g_esLightningSpecial[type].g_iLightningSight, value, -1, 5); - g_esLightningSpecial[type].g_flLightningChance = flGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "LightningChance", "Lightning Chance", "Lightning_Chance", "chance", g_esLightningSpecial[type].g_flLightningChance, value, -1.0, 100.0); - g_esLightningSpecial[type].g_iLightningCooldown = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "LightningCooldown", "Lightning Cooldown", "Lightning_Cooldown", "cooldown", g_esLightningSpecial[type].g_iLightningCooldown, value, -1, 99999); - g_esLightningSpecial[type].g_flLightningDamage = flGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "LightningDamage", "Lightning Damage", "Lightning_Damage", "damage", g_esLightningSpecial[type].g_flLightningDamage, value, -1.0, 99999.0); - g_esLightningSpecial[type].g_iLightningDuration = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "LightningDuration", "Lightning Duration", "Lightning_Duration", "duration", g_esLightningSpecial[type].g_iLightningDuration, value, -1, 99999); - g_esLightningSpecial[type].g_flLightningInterval = flGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "LightningInterval", "Lightning Interval", "Lightning_Interval", "interval", g_esLightningSpecial[type].g_flLightningInterval, value, -1.0, 99999.0); - } - else - { - g_esLightningAbility[type].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esLightningAbility[type].g_flCloseAreasOnly, value, -1.0, 99999.0); - g_esLightningAbility[type].g_iComboAbility = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "ComboAbility", "Combo Ability", "Combo_Ability", "combo", g_esLightningAbility[type].g_iComboAbility, value, -1, 1); - g_esLightningAbility[type].g_iHumanAbility = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esLightningAbility[type].g_iHumanAbility, value, -1, 2); - g_esLightningAbility[type].g_iHumanAmmo = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esLightningAbility[type].g_iHumanAmmo, value, -1, 99999); - g_esLightningAbility[type].g_iHumanCooldown = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esLightningAbility[type].g_iHumanCooldown, value, -1, 99999); - g_esLightningAbility[type].g_iHumanDuration = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esLightningAbility[type].g_iHumanDuration, value, -1, 99999); - g_esLightningAbility[type].g_iHumanMode = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esLightningAbility[type].g_iHumanMode, value, -1, 1); - g_esLightningAbility[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esLightningAbility[type].g_flOpenAreasOnly, value, -1.0, 99999.0); - g_esLightningAbility[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esLightningAbility[type].g_iRequiresHumans, value, -1, 32); - g_esLightningAbility[type].g_iLightningAbility = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esLightningAbility[type].g_iLightningAbility, value, -1, 1); - g_esLightningAbility[type].g_iLightningMessage = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esLightningAbility[type].g_iLightningMessage, value, -1, 1); - g_esLightningAbility[type].g_iLightningSight = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "AbilitySight", "Ability Sight", "Ability_Sight", "sight", g_esLightningAbility[type].g_iLightningSight, value, -1, 5); - g_esLightningAbility[type].g_flLightningChance = flGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "LightningChance", "Lightning Chance", "Lightning_Chance", "chance", g_esLightningAbility[type].g_flLightningChance, value, -1.0, 100.0); - g_esLightningAbility[type].g_iLightningCooldown = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "LightningCooldown", "Lightning Cooldown", "Lightning_Cooldown", "cooldown", g_esLightningAbility[type].g_iLightningCooldown, value, -1, 99999); - g_esLightningAbility[type].g_flLightningDamage = flGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "LightningDamage", "Lightning Damage", "Lightning_Damage", "damage", g_esLightningAbility[type].g_flLightningDamage, value, -1.0, 99999.0); - g_esLightningAbility[type].g_iLightningDuration = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "LightningDuration", "Lightning Duration", "Lightning_Duration", "duration", g_esLightningAbility[type].g_iLightningDuration, value, -1, 99999); - g_esLightningAbility[type].g_flLightningInterval = flGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "LightningInterval", "Lightning Interval", "Lightning_Interval", "interval", g_esLightningAbility[type].g_flLightningInterval, value, -1.0, 99999.0); - g_esLightningAbility[type].g_iAccessFlags = iGetAdminFlagsValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "AccessFlags", "Access Flags", "Access_Flags", "access", value); - g_esLightningAbility[type].g_iImmunityFlags = iGetAdminFlagsValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "ImmunityFlags", "Immunity Flags", "Immunity_Flags", "immunity", value); - } - } -} - -#if defined MT_ABILITIES_MAIN -void vLightningSettingsCached(int tank, bool apply, int type) -#else -public void MT_OnSettingsCached(int tank, bool apply, int type) -#endif -{ - bool bHuman = bIsValidClient(tank, MT_CHECK_FAKECLIENT); - g_esLightningPlayer[tank].g_iTankTypeRecorded = apply ? MT_GetRecordedTankType(tank, type) : 0; - g_esLightningPlayer[tank].g_iTankType = apply ? type : 0; - int iType = g_esLightningPlayer[tank].g_iTankTypeRecorded; - - if (bIsSpecialInfected(tank, MT_CHECK_INDEX|MT_CHECK_INGAME)) - { - g_esLightningCache[tank].g_flCloseAreasOnly = flGetSubSettingValue(apply, bHuman, g_esLightningTeammate[tank].g_flCloseAreasOnly, g_esLightningPlayer[tank].g_flCloseAreasOnly, g_esLightningSpecial[iType].g_flCloseAreasOnly, g_esLightningAbility[iType].g_flCloseAreasOnly, 1); - g_esLightningCache[tank].g_iComboAbility = iGetSubSettingValue(apply, bHuman, g_esLightningTeammate[tank].g_iComboAbility, g_esLightningPlayer[tank].g_iComboAbility, g_esLightningSpecial[iType].g_iComboAbility, g_esLightningAbility[iType].g_iComboAbility, 1); - g_esLightningCache[tank].g_flLightningChance = flGetSubSettingValue(apply, bHuman, g_esLightningTeammate[tank].g_flLightningChance, g_esLightningPlayer[tank].g_flLightningChance, g_esLightningSpecial[iType].g_flLightningChance, g_esLightningAbility[iType].g_flLightningChance, 1); - g_esLightningCache[tank].g_flLightningDamage = flGetSubSettingValue(apply, bHuman, g_esLightningTeammate[tank].g_flLightningDamage, g_esLightningPlayer[tank].g_flLightningDamage, g_esLightningSpecial[iType].g_flLightningDamage, g_esLightningAbility[iType].g_flLightningDamage, 1); - g_esLightningCache[tank].g_flLightningInterval = flGetSubSettingValue(apply, bHuman, g_esLightningTeammate[tank].g_flLightningInterval, g_esLightningPlayer[tank].g_flLightningInterval, g_esLightningSpecial[iType].g_flLightningInterval, g_esLightningAbility[iType].g_flLightningInterval, 1); - g_esLightningCache[tank].g_iLightningAbility = iGetSubSettingValue(apply, bHuman, g_esLightningTeammate[tank].g_iLightningAbility, g_esLightningPlayer[tank].g_iLightningAbility, g_esLightningSpecial[iType].g_iLightningAbility, g_esLightningAbility[iType].g_iLightningAbility, 1); - g_esLightningCache[tank].g_iLightningCooldown = iGetSubSettingValue(apply, bHuman, g_esLightningTeammate[tank].g_iLightningCooldown, g_esLightningPlayer[tank].g_iLightningCooldown, g_esLightningSpecial[iType].g_iLightningCooldown, g_esLightningAbility[iType].g_iLightningCooldown, 1); - g_esLightningCache[tank].g_iLightningDuration = iGetSubSettingValue(apply, bHuman, g_esLightningTeammate[tank].g_iLightningDuration, g_esLightningPlayer[tank].g_iLightningDuration, g_esLightningSpecial[iType].g_iLightningDuration, g_esLightningAbility[iType].g_iLightningDuration, 1); - g_esLightningCache[tank].g_iLightningMessage = iGetSubSettingValue(apply, bHuman, g_esLightningTeammate[tank].g_iLightningMessage, g_esLightningPlayer[tank].g_iLightningMessage, g_esLightningSpecial[iType].g_iLightningMessage, g_esLightningAbility[iType].g_iLightningMessage, 1); - g_esLightningCache[tank].g_iLightningSight = iGetSubSettingValue(apply, bHuman, g_esLightningTeammate[tank].g_iLightningSight, g_esLightningPlayer[tank].g_iLightningSight, g_esLightningSpecial[iType].g_iLightningSight, g_esLightningAbility[iType].g_iLightningSight, 1); - g_esLightningCache[tank].g_iHumanAbility = iGetSubSettingValue(apply, bHuman, g_esLightningTeammate[tank].g_iHumanAbility, g_esLightningPlayer[tank].g_iHumanAbility, g_esLightningSpecial[iType].g_iHumanAbility, g_esLightningAbility[iType].g_iHumanAbility, 1); - g_esLightningCache[tank].g_iHumanAmmo = iGetSubSettingValue(apply, bHuman, g_esLightningTeammate[tank].g_iHumanAmmo, g_esLightningPlayer[tank].g_iHumanAmmo, g_esLightningSpecial[iType].g_iHumanAmmo, g_esLightningAbility[iType].g_iHumanAmmo, 1); - g_esLightningCache[tank].g_iHumanCooldown = iGetSubSettingValue(apply, bHuman, g_esLightningTeammate[tank].g_iHumanCooldown, g_esLightningPlayer[tank].g_iHumanCooldown, g_esLightningSpecial[iType].g_iHumanCooldown, g_esLightningAbility[iType].g_iHumanCooldown, 1); - g_esLightningCache[tank].g_iHumanDuration = iGetSubSettingValue(apply, bHuman, g_esLightningTeammate[tank].g_iHumanDuration, g_esLightningPlayer[tank].g_iHumanDuration, g_esLightningSpecial[iType].g_iHumanDuration, g_esLightningAbility[iType].g_iHumanDuration, 1); - g_esLightningCache[tank].g_iHumanMode = iGetSubSettingValue(apply, bHuman, g_esLightningTeammate[tank].g_iHumanMode, g_esLightningPlayer[tank].g_iHumanMode, g_esLightningSpecial[iType].g_iHumanMode, g_esLightningAbility[iType].g_iHumanMode, 1); - g_esLightningCache[tank].g_flOpenAreasOnly = flGetSubSettingValue(apply, bHuman, g_esLightningTeammate[tank].g_flOpenAreasOnly, g_esLightningPlayer[tank].g_flOpenAreasOnly, g_esLightningSpecial[iType].g_flOpenAreasOnly, g_esLightningAbility[iType].g_flOpenAreasOnly, 1); - g_esLightningCache[tank].g_iRequiresHumans = iGetSubSettingValue(apply, bHuman, g_esLightningTeammate[tank].g_iRequiresHumans, g_esLightningPlayer[tank].g_iRequiresHumans, g_esLightningSpecial[iType].g_iRequiresHumans, g_esLightningAbility[iType].g_iRequiresHumans, 1); - } - else - { - g_esLightningCache[tank].g_flCloseAreasOnly = flGetSettingValue(apply, bHuman, g_esLightningPlayer[tank].g_flCloseAreasOnly, g_esLightningAbility[iType].g_flCloseAreasOnly, 1); - g_esLightningCache[tank].g_iComboAbility = iGetSettingValue(apply, bHuman, g_esLightningPlayer[tank].g_iComboAbility, g_esLightningAbility[iType].g_iComboAbility, 1); - g_esLightningCache[tank].g_flLightningChance = flGetSettingValue(apply, bHuman, g_esLightningPlayer[tank].g_flLightningChance, g_esLightningAbility[iType].g_flLightningChance, 1); - g_esLightningCache[tank].g_flLightningDamage = flGetSettingValue(apply, bHuman, g_esLightningPlayer[tank].g_flLightningDamage, g_esLightningAbility[iType].g_flLightningDamage, 1); - g_esLightningCache[tank].g_flLightningInterval = flGetSettingValue(apply, bHuman, g_esLightningPlayer[tank].g_flLightningInterval, g_esLightningAbility[iType].g_flLightningInterval, 1); - g_esLightningCache[tank].g_iLightningAbility = iGetSettingValue(apply, bHuman, g_esLightningPlayer[tank].g_iLightningAbility, g_esLightningAbility[iType].g_iLightningAbility, 1); - g_esLightningCache[tank].g_iLightningCooldown = iGetSettingValue(apply, bHuman, g_esLightningPlayer[tank].g_iLightningCooldown, g_esLightningAbility[iType].g_iLightningCooldown, 1); - g_esLightningCache[tank].g_iLightningDuration = iGetSettingValue(apply, bHuman, g_esLightningPlayer[tank].g_iLightningDuration, g_esLightningAbility[iType].g_iLightningDuration, 1); - g_esLightningCache[tank].g_iLightningMessage = iGetSettingValue(apply, bHuman, g_esLightningPlayer[tank].g_iLightningMessage, g_esLightningAbility[iType].g_iLightningMessage, 1); - g_esLightningCache[tank].g_iLightningSight = iGetSettingValue(apply, bHuman, g_esLightningPlayer[tank].g_iLightningSight, g_esLightningAbility[iType].g_iLightningSight, 1); - g_esLightningCache[tank].g_iHumanAbility = iGetSettingValue(apply, bHuman, g_esLightningPlayer[tank].g_iHumanAbility, g_esLightningAbility[iType].g_iHumanAbility, 1); - g_esLightningCache[tank].g_iHumanAmmo = iGetSettingValue(apply, bHuman, g_esLightningPlayer[tank].g_iHumanAmmo, g_esLightningAbility[iType].g_iHumanAmmo, 1); - g_esLightningCache[tank].g_iHumanCooldown = iGetSettingValue(apply, bHuman, g_esLightningPlayer[tank].g_iHumanCooldown, g_esLightningAbility[iType].g_iHumanCooldown, 1); - g_esLightningCache[tank].g_iHumanDuration = iGetSettingValue(apply, bHuman, g_esLightningPlayer[tank].g_iHumanDuration, g_esLightningAbility[iType].g_iHumanDuration, 1); - g_esLightningCache[tank].g_iHumanMode = iGetSettingValue(apply, bHuman, g_esLightningPlayer[tank].g_iHumanMode, g_esLightningAbility[iType].g_iHumanMode, 1); - g_esLightningCache[tank].g_flOpenAreasOnly = flGetSettingValue(apply, bHuman, g_esLightningPlayer[tank].g_flOpenAreasOnly, g_esLightningAbility[iType].g_flOpenAreasOnly, 1); - g_esLightningCache[tank].g_iRequiresHumans = iGetSettingValue(apply, bHuman, g_esLightningPlayer[tank].g_iRequiresHumans, g_esLightningAbility[iType].g_iRequiresHumans, 1); - } -} - -#if defined MT_ABILITIES_MAIN -void vLightningCopyStats(int oldTank, int newTank) -#else -public void MT_OnCopyStats(int oldTank, int newTank) -#endif -{ - vLightningCopyStats2(oldTank, newTank); - - if (oldTank != newTank) - { - vRemoveLightning(oldTank); - } -} - -#if !defined MT_ABILITIES_MAIN -public void MT_OnPluginUpdate() -{ - MT_ReloadPlugin(null); -} -#endif - -#if defined MT_ABILITIES_MAIN -void vLightningEventFired(Event event, const char[] name) -#else -public void MT_OnEventFired(Event event, const char[] name, bool dontBroadcast) -#endif -{ - if (StrEqual(name, "bot_player_replace")) - { - int iBotId = event.GetInt("bot"), iBot = GetClientOfUserId(iBotId), - iTankId = event.GetInt("player"), iTank = GetClientOfUserId(iTankId); - if (bIsValidClient(iBot) && bIsInfected(iTank)) - { - vLightningCopyStats2(iBot, iTank); - vRemoveLightning(iBot); - } - } - else if (StrEqual(name, "mission_lost") || StrEqual(name, "round_start") || StrEqual(name, "round_end")) - { - vLightningReset(); - } - else if (StrEqual(name, "player_bot_replace")) - { - int iTankId = event.GetInt("player"), iTank = GetClientOfUserId(iTankId), - iBotId = event.GetInt("bot"), iBot = GetClientOfUserId(iBotId); - if (bIsValidClient(iTank) && bIsInfected(iBot)) - { - vLightningCopyStats2(iTank, iBot); - vRemoveLightning(iTank); - } - } - else if (StrEqual(name, "player_death") || StrEqual(name, "player_spawn")) - { - int iTankId = event.GetInt("userid"), iTank = GetClientOfUserId(iTankId); - if (MT_IsTankSupported(iTank, MT_CHECK_INDEX|MT_CHECK_INGAME)) - { - vRemoveLightning(iTank); - } - } -} - -#if defined MT_ABILITIES_MAIN -void vLightningAbilityActivated(int tank) -#else -public void MT_OnAbilityActivated(int tank) -#endif -{ - if (!g_bSecondGame || (MT_IsTankSupported(tank, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_FAKECLIENT) && ((!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esLightningAbility[g_esLightningPlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esLightningPlayer[tank].g_iAccessFlags)) || g_esLightningCache[tank].g_iHumanAbility == 0))) - { - return; - } - - if (MT_IsTankSupported(tank) && (!bIsInfected(tank, MT_CHECK_FAKECLIENT) || g_esLightningCache[tank].g_iHumanAbility != 1) && MT_IsCustomTankSupported(tank) && g_esLightningCache[tank].g_iLightningAbility == 1 && g_esLightningCache[tank].g_iComboAbility == 0 && !g_esLightningPlayer[tank].g_bActivated) - { - vLightningAbility(tank); - } -} - -#if defined MT_ABILITIES_MAIN -void vLightningButtonPressed(int tank, int button) -#else -public void MT_OnButtonPressed(int tank, int button) -#endif -{ - if (MT_IsTankSupported(tank, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_ALIVE|MT_CHECK_FAKECLIENT) && MT_IsCustomTankSupported(tank)) - { - if (!g_bSecondGame || bIsAreaNarrow(tank, g_esLightningCache[tank].g_flOpenAreasOnly) || bIsAreaWide(tank, g_esLightningCache[tank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esLightningPlayer[tank].g_iTankType, tank) || (g_esLightningCache[tank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esLightningCache[tank].g_iRequiresHumans) || (!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esLightningAbility[g_esLightningPlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esLightningPlayer[tank].g_iAccessFlags))) - { - return; - } - - if ((button & MT_MAIN_KEY) && g_esLightningCache[tank].g_iLightningAbility == 1 && g_esLightningCache[tank].g_iHumanAbility == 1) - { - int iTime = GetTime(); - bool bRecharging = g_esLightningPlayer[tank].g_iCooldown != -1 && g_esLightningPlayer[tank].g_iCooldown >= iTime; - - switch (g_esLightningCache[tank].g_iHumanMode) - { - case 0: - { - if (!g_esLightningPlayer[tank].g_bActivated && !bRecharging) - { - vLightningAbility(tank); - } - else if (g_esLightningPlayer[tank].g_bActivated) - { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "LightningHuman3"); - } - else if (bRecharging) - { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "LightningHuman4", (g_esLightningPlayer[tank].g_iCooldown - iTime)); - } - } - case 1: - { - if (g_esLightningPlayer[tank].g_iAmmoCount < g_esLightningCache[tank].g_iHumanAmmo && g_esLightningCache[tank].g_iHumanAmmo > 0) - { - if (!g_esLightningPlayer[tank].g_bActivated && !bRecharging) - { - g_esLightningPlayer[tank].g_bActivated = true; - g_esLightningPlayer[tank].g_iAmmoCount++; - - vLightning2(tank); - MT_PrintToChat(tank, "%s %t", MT_TAG3, "LightningHuman", g_esLightningPlayer[tank].g_iAmmoCount, g_esLightningCache[tank].g_iHumanAmmo); - } - else if (g_esLightningPlayer[tank].g_bActivated) - { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "LightningHuman3"); - } - else if (bRecharging) - { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "LightningHuman4", (g_esLightningPlayer[tank].g_iCooldown - iTime)); - } - } - else - { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "LightningAmmo"); - } - } - } - } - } -} - -#if defined MT_ABILITIES_MAIN -void vLightningButtonReleased(int tank, int button) -#else -public void MT_OnButtonReleased(int tank, int button) -#endif -{ - if (MT_IsTankSupported(tank, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_ALIVE|MT_CHECK_FAKECLIENT) && g_esLightningCache[tank].g_iHumanAbility == 1) - { - if ((button & MT_MAIN_KEY) && g_esLightningCache[tank].g_iHumanMode == 1 && g_esLightningPlayer[tank].g_bActivated && (g_esLightningPlayer[tank].g_iCooldown == -1 || g_esLightningPlayer[tank].g_iCooldown <= GetTime())) - { - vLightningReset2(tank); - vLightningReset3(tank); - } - } -} - -#if defined MT_ABILITIES_MAIN -void vLightningChangeType(int tank, int oldType) -#else -public void MT_OnChangeType(int tank, int oldType, int newType, bool revert) -#endif -{ - if (oldType <= 0) - { - return; - } - - vRemoveLightning(tank); -} - -void vLightning(int tank, int pos = -1) -{ - if (g_esLightningPlayer[tank].g_iCooldown != -1 && g_esLightningPlayer[tank].g_iCooldown >= GetTime()) - { - return; - } - - g_esLightningPlayer[tank].g_bActivated = true; - - vLightning2(tank, pos); - - if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esLightningCache[tank].g_iHumanAbility == 1) - { - g_esLightningPlayer[tank].g_iAmmoCount++; - - MT_PrintToChat(tank, "%s %t", MT_TAG3, "LightningHuman", g_esLightningPlayer[tank].g_iAmmoCount, g_esLightningCache[tank].g_iHumanAmmo); - } - - if (g_esLightningCache[tank].g_iLightningMessage == 1) - { - char sTankName[64]; - MT_GetTankName(tank, sTankName); - MT_PrintToChatAll("%s %t", MT_TAG2, "Lightning", sTankName); - MT_LogMessage(MT_LOG_ABILITY, "%s %T", MT_TAG, "Lightning", LANG_SERVER, sTankName); - } -} - -void vLightning2(int tank, int pos = -1) -{ - if (!g_bSecondGame || bIsAreaNarrow(tank, g_esLightningCache[tank].g_flOpenAreasOnly) || bIsAreaWide(tank, g_esLightningCache[tank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esLightningPlayer[tank].g_iTankType, tank) || (g_esLightningCache[tank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esLightningCache[tank].g_iRequiresHumans) || (!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esLightningAbility[g_esLightningPlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esLightningPlayer[tank].g_iAccessFlags))) - { - return; - } - - float flInterval = (pos != -1) ? MT_GetCombinationSetting(tank, 6, pos) : g_esLightningCache[tank].g_flLightningInterval; - if (flInterval > 0.0) - { - DataPack dpLightning; - CreateDataTimer(flInterval, tTimerLightning, dpLightning, TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); - dpLightning.WriteCell(GetClientUserId(tank)); - dpLightning.WriteCell(g_esLightningPlayer[tank].g_iTankType); - dpLightning.WriteCell(GetTime()); - dpLightning.WriteCell(pos); - } -} - -void vLightningAbility(int tank) -{ - if (!g_bSecondGame || (g_esLightningPlayer[tank].g_iCooldown != -1 && g_esLightningPlayer[tank].g_iCooldown >= GetTime()) || bIsAreaNarrow(tank, g_esLightningCache[tank].g_flOpenAreasOnly) || bIsAreaWide(tank, g_esLightningCache[tank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esLightningPlayer[tank].g_iTankType, tank) || (g_esLightningCache[tank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esLightningCache[tank].g_iRequiresHumans) || (!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esLightningAbility[g_esLightningPlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esLightningPlayer[tank].g_iAccessFlags))) - { - return; - } - - if (!bIsInfected(tank, MT_CHECK_FAKECLIENT) || (g_esLightningPlayer[tank].g_iAmmoCount < g_esLightningCache[tank].g_iHumanAmmo && g_esLightningCache[tank].g_iHumanAmmo > 0)) - { - if (GetRandomFloat(0.1, 100.0) <= g_esLightningCache[tank].g_flLightningChance) - { - vLightning(tank); - } - else if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esLightningCache[tank].g_iHumanAbility == 1) - { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "LightningHuman2"); - } - } - else if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esLightningCache[tank].g_iHumanAbility == 1) - { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "LightningAmmo"); - } -} - -void vLightningCopyStats2(int oldTank, int newTank) -{ - g_esLightningPlayer[newTank].g_iAmmoCount = g_esLightningPlayer[oldTank].g_iAmmoCount; - g_esLightningPlayer[newTank].g_iCooldown = g_esLightningPlayer[oldTank].g_iCooldown; -} - -void vRemoveLightning(int tank) -{ - g_esLightningPlayer[tank].g_bActivated = false; - g_esLightningPlayer[tank].g_iAmmoCount = 0; - g_esLightningPlayer[tank].g_iCooldown = -1; -} - -void vLightningReset() -{ - for (int iPlayer = 1; iPlayer <= MaxClients; iPlayer++) - { - if (bIsValidClient(iPlayer, MT_CHECK_INGAME)) - { - vRemoveLightning(iPlayer); - } - } -} - -void vLightningReset2(int tank) -{ - g_esLightningPlayer[tank].g_bActivated = false; - - if (g_esLightningCache[tank].g_iLightningMessage == 1) - { - char sTankName[64]; - MT_GetTankName(tank, sTankName); - MT_PrintToChatAll("%s %t", MT_TAG2, "Lightning2", sTankName); - MT_LogMessage(MT_LOG_ABILITY, "%s %T", MT_TAG, "Lightning2", LANG_SERVER, sTankName); - } -} - -void vLightningReset3(int tank) -{ - int iTime = GetTime(), iPos = g_esLightningAbility[g_esLightningPlayer[tank].g_iTankTypeRecorded].g_iComboPosition, iCooldown = (iPos != -1) ? RoundToNearest(MT_GetCombinationSetting(tank, 2, iPos)) : g_esLightningCache[tank].g_iLightningCooldown; - iCooldown = (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esLightningCache[tank].g_iHumanAbility == 1 && g_esLightningCache[tank].g_iHumanMode == 0 && g_esLightningPlayer[tank].g_iAmmoCount < g_esLightningCache[tank].g_iHumanAmmo && g_esLightningCache[tank].g_iHumanAmmo > 0) ? g_esLightningCache[tank].g_iHumanCooldown : iCooldown; - g_esLightningPlayer[tank].g_iCooldown = (iTime + iCooldown); - if (g_esLightningPlayer[tank].g_iCooldown != -1 && g_esLightningPlayer[tank].g_iCooldown >= iTime) - { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "LightningHuman5", (g_esLightningPlayer[tank].g_iCooldown - iTime)); - } -} - -void tTimerLightningCombo(Handle timer, DataPack pack) -{ - pack.Reset(); - - int iTank = GetClientOfUserId(pack.ReadCell()); - if (!g_bSecondGame || !MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esLightningAbility[g_esLightningPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esLightningPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esLightningPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esLightningCache[iTank].g_iLightningAbility == 0 || g_esLightningPlayer[iTank].g_bActivated) - { - return; - } - - int iPos = pack.ReadCell(); - vLightning(iTank, iPos); -} - -Action tTimerLightning(Handle timer, DataPack pack) -{ - pack.Reset(); - - int iTank = GetClientOfUserId(pack.ReadCell()), iType = pack.ReadCell(); - if (!g_bSecondGame || !MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esLightningAbility[g_esLightningPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esLightningPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esLightningPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || iType != g_esLightningPlayer[iTank].g_iTankType || !g_esLightningPlayer[iTank].g_bActivated) - { - g_esLightningPlayer[iTank].g_bActivated = false; - - return Plugin_Stop; - } - - if (g_esLightningCache[iTank].g_iLightningAbility == 0 || bIsAreaNarrow(iTank, g_esLightningCache[iTank].g_flOpenAreasOnly) || bIsAreaWide(iTank, g_esLightningCache[iTank].g_flCloseAreasOnly)) - { - vLightningReset2(iTank); - - return Plugin_Stop; - } - - bool bHuman = bIsInfected(iTank, MT_CHECK_FAKECLIENT); - int iTime = pack.ReadCell(), iCurrentTime = GetTime(), iPos = pack.ReadCell(), - iDuration = (iPos != -1) ? RoundToNearest(MT_GetCombinationSetting(iTank, 5, iPos)) : g_esLightningCache[iTank].g_iLightningDuration; - iDuration = (bHuman && g_esLightningCache[iTank].g_iHumanAbility == 1) ? g_esLightningCache[iTank].g_iHumanDuration : iDuration; - if (iDuration > 0 && (!bHuman || (bHuman && g_esLightningCache[iTank].g_iHumanAbility == 1 && g_esLightningCache[iTank].g_iHumanMode == 0)) && (iTime + iDuration) < iCurrentTime) - { - vLightningReset2(iTank); - vLightningReset3(iTank); - - return Plugin_Stop; - } - - char sTargetName[64]; - float flOrigin[3]; - GetClientAbsOrigin(iTank, flOrigin); - float flRadius = MT_GetRandomFloat(100.0, 360.0), - flRadius2 = MT_GetRandomFloat(0.0, 360.0); - flOrigin[0] += (flRadius * Cosine(DegToRad(flRadius2))); - flOrigin[1] += (flRadius * Sine(DegToRad(flRadius2))); - - int iTarget = CreateEntityByName("info_particle_target"); - if (bIsValidEntity(iTarget)) - { - Format(sTargetName, sizeof sTargetName, "mutant_tank_target_%i_%i", iTank, g_esLightningPlayer[iTank].g_iTankTypeRecorded); - DispatchKeyValue(iTarget, "targetname", sTargetName); - TeleportEntity(iTarget, flOrigin); - DispatchSpawn(iTarget); - ActivateEntity(iTarget); - SetVariantString("OnUser2 !self:Kill::2.0:1"); - AcceptEntityInput(iTarget, "AddOutput"); - AcceptEntityInput(iTarget, "FireUser2"); - } - - float flSurvivorPos[3], flDamage = (iPos != -1) ? MT_GetCombinationSetting(iTank, 3, iPos) : g_esLightningCache[iTank].g_flLightningDamage; - for (int iSurvivor = 1; iSurvivor <= MaxClients; iSurvivor++) - { - if (bIsSurvivor(iSurvivor, MT_CHECK_INGAME|MT_CHECK_ALIVE) && !MT_IsAdminImmune(iSurvivor, iTank) && !bIsAdminImmune(iSurvivor, g_esLightningPlayer[iTank].g_iTankType, g_esLightningAbility[g_esLightningPlayer[iTank].g_iTankTypeRecorded].g_iImmunityFlags, g_esLightningPlayer[iSurvivor].g_iImmunityFlags)) - { - GetClientAbsOrigin(iSurvivor, flSurvivorPos); - if (GetVectorDistance(flOrigin, flSurvivorPos) <= 200.0 && bIsVisibleToPlayer(iTank, iSurvivor, g_esLightningCache[iTank].g_iLightningSight, .range = 200.0)) - { - if (flDamage > 0.0) - { - vDamagePlayer(iSurvivor, iTank, MT_GetScaledDamage(flDamage), "1024"); - } - - EmitSoundToAll(g_sLightningSounds[MT_GetRandomInt(0, (sizeof g_sLightningSounds - 1))], iSurvivor); - } - } - } - - flOrigin[2] += 1800.0; - - int iLightning = CreateEntityByName("info_particle_system"); - if (bIsValidEntity(iLightning)) - { - DispatchKeyValue(iLightning, "effect_name", PARTICLE_LIGHTNING); - DispatchKeyValue(iLightning, "cpoint1", sTargetName); - - TeleportEntity(iLightning, flOrigin); - DispatchSpawn(iLightning); - ActivateEntity(iLightning); - AcceptEntityInput(iLightning, "Start"); - - iLightning = EntIndexToEntRef(iLightning); - vDeleteEntity(iLightning, 2.0); - } - - return Plugin_Continue; +/** + * Mutant Tanks: A L4D/L4D2 SourceMod Plugin + * Copyright (C) 2017-2025 Alfred "Psyk0tik" Llagas + * + * 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 . + **/ + +#define MT_LIGHTNING_COMPILE_METHOD 0 // 0: packaged, 1: standalone + +#if !defined MT_ABILITIES_MAIN2 + #if MT_LIGHTNING_COMPILE_METHOD == 1 + #include + #include + #else + #error This file must be inside "scripting/mutant_tanks/abilities2" while compiling "mt_abilities2.sp" to include its content. + #endif +public Plugin myinfo = +{ + name = "[MT] Lightning Ability", + author = MT_AUTHOR, + description = "The Mutant Tank creates lightning storms.", + version = MT_VERSION, + url = MT_URL +}; + +bool g_bDedicated, g_bSecondGame; + +int g_iGraphicsLevel; + +public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max) +{ + switch (GetEngineVersion()) + { + case Engine_Left4Dead: g_bSecondGame = false; + case Engine_Left4Dead2: g_bSecondGame = true; + default: + { + strcopy(error, err_max, "\"[MT] Lightning Ability\" only supports Left 4 Dead 1 & 2."); + + return APLRes_SilentFailure; + } + } + + g_bDedicated = IsDedicatedServer(); + + return APLRes_Success; +} + +#define PARTICLE_LIGHTNING "storm_lightning_01" +#else + #if MT_LIGHTNING_COMPILE_METHOD == 1 + #error This file must be compiled as a standalone plugin. + #endif +#endif + +#define MT_LIGHTNING_SECTION "lightningability" +#define MT_LIGHTNING_SECTION2 "lightning ability" +#define MT_LIGHTNING_SECTION3 "lightning_ability" +#define MT_LIGHTNING_SECTION4 "lightning" + +#define MT_MENU_LIGHTNING "Lightning Ability" + +char g_sLightningSounds[8][26] = +{ + "ambient/energy/zap1.wav", + "ambient/energy/zap2.wav", + "ambient/energy/zap3.wav", + "ambient/energy/zap5.wav", + "ambient/energy/zap6.wav", + "ambient/energy/zap7.wav", + "ambient/energy/zap8.wav", + "ambient/energy/zap9.wav" +}; + +enum struct esLightningPlayer +{ + bool g_bActivated; + + float g_flCloseAreasOnly; + float g_flLightningChance; + float g_flLightningDamage; + float g_flLightningInterval; + float g_flOpenAreasOnly; + + int g_iAccessFlags; + int g_iAmmoCount; + int g_iComboAbility; + int g_iCooldown; + int g_iHumanAbility; + int g_iHumanAmmo; + int g_iHumanCooldown; + int g_iHumanDuration; + int g_iHumanMode; + int g_iImmunityFlags; + int g_iLightningAbility; + int g_iLightningCooldown; + int g_iLightningDuration; + int g_iLightningMessage; + int g_iLightningSight; + int g_iRequiresHumans; + int g_iTankType; + int g_iTankTypeRecorded; +} + +esLightningPlayer g_esLightningPlayer[MAXPLAYERS + 1]; + +enum struct esLightningTeammate +{ + float g_flCloseAreasOnly; + float g_flLightningChance; + float g_flLightningDamage; + float g_flLightningInterval; + float g_flOpenAreasOnly; + + int g_iComboAbility; + int g_iHumanAbility; + int g_iHumanAmmo; + int g_iHumanCooldown; + int g_iHumanDuration; + int g_iHumanMode; + int g_iLightningAbility; + int g_iLightningCooldown; + int g_iLightningDuration; + int g_iLightningMessage; + int g_iLightningSight; + int g_iRequiresHumans; +} + +esLightningTeammate g_esLightningTeammate[MAXPLAYERS + 1]; + +enum struct esLightningAbility +{ + float g_flCloseAreasOnly; + float g_flLightningChance; + float g_flLightningDamage; + float g_flLightningInterval; + float g_flOpenAreasOnly; + + int g_iAccessFlags; + int g_iComboAbility; + int g_iComboPosition; + int g_iHumanAbility; + int g_iHumanAmmo; + int g_iHumanCooldown; + int g_iHumanDuration; + int g_iHumanMode; + int g_iImmunityFlags; + int g_iLightningAbility; + int g_iLightningCooldown; + int g_iLightningDuration; + int g_iLightningMessage; + int g_iLightningSight; + int g_iRequiresHumans; +} + +esLightningAbility g_esLightningAbility[MT_MAXTYPES + 1]; + +enum struct esLightningSpecial +{ + float g_flCloseAreasOnly; + float g_flLightningChance; + float g_flLightningDamage; + float g_flLightningInterval; + float g_flOpenAreasOnly; + + int g_iComboAbility; + int g_iHumanAbility; + int g_iHumanAmmo; + int g_iHumanCooldown; + int g_iHumanDuration; + int g_iHumanMode; + int g_iLightningAbility; + int g_iLightningCooldown; + int g_iLightningDuration; + int g_iLightningMessage; + int g_iLightningSight; + int g_iRequiresHumans; +} + +esLightningSpecial g_esLightningSpecial[MT_MAXTYPES + 1]; + +enum struct esLightningCache +{ + float g_flCloseAreasOnly; + float g_flLightningChance; + float g_flLightningDamage; + float g_flLightningInterval; + float g_flOpenAreasOnly; + + int g_iComboAbility; + int g_iHumanAbility; + int g_iHumanAmmo; + int g_iHumanCooldown; + int g_iHumanDuration; + int g_iHumanMode; + int g_iLightningAbility; + int g_iLightningCooldown; + int g_iLightningDuration; + int g_iLightningMessage; + int g_iLightningSight; + int g_iRequiresHumans; +} + +esLightningCache g_esLightningCache[MAXPLAYERS + 1]; + +#if !defined MT_ABILITIES_MAIN2 +public void OnPluginStart() +{ + LoadTranslations("common.phrases"); + LoadTranslations("mutant_tanks.phrases"); + LoadTranslations("mutant_tanks_names.phrases"); + + RegConsoleCmd("sm_mt_lightning", cmdLightningInfo, "View information about the Lightning ability."); +} +#endif + +#if defined MT_ABILITIES_MAIN2 +void vLightningMapStart() +#else +public void OnMapStart() +#endif +{ + if (g_bSecondGame) + { + iPrecacheParticle(PARTICLE_LIGHTNING); + + for (int iPos = 0; iPos < (sizeof g_sLightningSounds); iPos++) + { + PrecacheSound(g_sLightningSounds[iPos], true); + } + } + + vLightningReset(); +} + +#if defined MT_ABILITIES_MAIN2 +void vLightningClientPutInServer(int client) +#else +public void OnClientPutInServer(int client) +#endif +{ + vRemoveLightning(client); +} + +#if defined MT_ABILITIES_MAIN2 +void vLightningClientDisconnect_Post(int client) +#else +public void OnClientDisconnect_Post(int client) +#endif +{ + vRemoveLightning(client); +} + +#if defined MT_ABILITIES_MAIN2 +void vLightningMapEnd() +#else +public void OnMapEnd() +#endif +{ + vLightningReset(); +} + +#if !defined MT_ABILITIES_MAIN2 +Action cmdLightningInfo(int client, int args) +{ + client = iGetListenServerHost(client, g_bDedicated); + + if (!MT_IsCorePluginEnabled()) + { + MT_ReplyToCommand(client, "%s %t", MT_TAG5, "PluginDisabled"); + + return Plugin_Handled; + } + + if (!bIsValidClient(client, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_FAKECLIENT)) + { + MT_ReplyToCommand(client, "%s %t", MT_TAG, "Command is in-game only"); + + return Plugin_Handled; + } + + switch (IsVoteInProgress()) + { + case true: MT_ReplyToCommand(client, "%s %t", MT_TAG2, "Vote in Progress"); + case false: vLightningMenu(client, MT_LIGHTNING_SECTION4, 0); + } + + return Plugin_Handled; +} +#endif + +void vLightningMenu(int client, const char[] name, int item) +{ + if (StrContains(MT_LIGHTNING_SECTION4, name, false) == -1) + { + return; + } + + Menu mAbilityMenu = new Menu(iLightningMenuHandler, MENU_ACTIONS_DEFAULT|MenuAction_Display|MenuAction_DisplayItem); + mAbilityMenu.SetTitle("Lightning Ability Information"); + mAbilityMenu.AddItem("Status", "Status"); + mAbilityMenu.AddItem("Ammunition", "Ammunition"); + mAbilityMenu.AddItem("Buttons", "Buttons"); + mAbilityMenu.AddItem("Button Mode", "Button Mode"); + mAbilityMenu.AddItem("Cooldown", "Cooldown"); + mAbilityMenu.AddItem("Details", "Details"); + mAbilityMenu.AddItem("Duration", "Duration"); + mAbilityMenu.AddItem("Human Support", "Human Support"); + mAbilityMenu.DisplayAt(client, item, MENU_TIME_FOREVER); +} + +int iLightningMenuHandler(Menu menu, MenuAction action, int param1, int param2) +{ + switch (action) + { + case MenuAction_End: delete menu; + case MenuAction_Select: + { + switch (param2) + { + case 0: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esLightningCache[param1].g_iLightningAbility == 0) ? "AbilityStatus1" : "AbilityStatus2"); + case 1: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityAmmo", (g_esLightningCache[param1].g_iHumanAmmo - g_esLightningPlayer[param1].g_iAmmoCount), g_esLightningCache[param1].g_iHumanAmmo); + case 2: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtons"); + case 3: + { + switch (g_esLightningCache[param1].g_iHumanMode) + { + case 0: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtonMode1"); + case 1: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtonMode2"); + case 2: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtonMode3"); + } + } + case 4: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityCooldown", ((g_esLightningCache[param1].g_iHumanAbility == 1) ? g_esLightningCache[param1].g_iHumanCooldown : g_esLightningCache[param1].g_iLightningCooldown)); + case 5: MT_PrintToChat(param1, "%s %t", MT_TAG3, "LightningDetails"); + case 6: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityDuration2", ((g_esLightningCache[param1].g_iHumanAbility == 1) ? g_esLightningCache[param1].g_iHumanDuration : g_esLightningCache[param1].g_iLightningDuration)); + case 7: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esLightningCache[param1].g_iHumanAbility == 0) ? "AbilityHumanSupport1" : "AbilityHumanSupport2"); + } + + if (bIsValidClient(param1, MT_CHECK_INGAME)) + { + vLightningMenu(param1, MT_LIGHTNING_SECTION4, menu.Selection); + } + } + case MenuAction_Display: + { + char sMenuTitle[PLATFORM_MAX_PATH]; + Panel pLightning = view_as(param2); + FormatEx(sMenuTitle, sizeof sMenuTitle, "%T", "LightningMenu", param1); + pLightning.SetTitle(sMenuTitle); + } + case MenuAction_DisplayItem: + { + if (param2 >= 0) + { + char sMenuOption[PLATFORM_MAX_PATH]; + + switch (param2) + { + case 0: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Status", param1); + case 1: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Ammunition", param1); + case 2: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Buttons", param1); + case 3: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "ButtonMode", param1); + case 4: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Cooldown", param1); + case 5: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Details", param1); + case 6: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Duration", param1); + case 7: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "HumanSupport", param1); + } + + return RedrawMenuItem(sMenuOption); + } + } + } + + return 0; +} + +#if defined MT_ABILITIES_MAIN2 +void vLightningDisplayMenu(Menu menu) +#else +public void MT_OnDisplayMenu(Menu menu) +#endif +{ + menu.AddItem(MT_MENU_LIGHTNING, MT_MENU_LIGHTNING); +} + +#if defined MT_ABILITIES_MAIN2 +void vLightningMenuItemSelected(int client, const char[] info) +#else +public void MT_OnMenuItemSelected(int client, const char[] info) +#endif +{ + if (StrEqual(info, MT_MENU_LIGHTNING, false)) + { + vLightningMenu(client, MT_LIGHTNING_SECTION4, 0); + } +} + +#if defined MT_ABILITIES_MAIN2 +void vLightningMenuItemDisplayed(int client, const char[] info, char[] buffer, int size) +#else +public void MT_OnMenuItemDisplayed(int client, const char[] info, char[] buffer, int size) +#endif +{ + if (StrEqual(info, MT_MENU_LIGHTNING, false)) + { + FormatEx(buffer, size, "%T", "LightningMenu2", client); + } +} + +#if defined MT_ABILITIES_MAIN2 +void vLightningPluginCheck(ArrayList list) +#else +public void MT_OnPluginCheck(ArrayList list) +#endif +{ + list.PushString(MT_MENU_LIGHTNING); +} + +#if defined MT_ABILITIES_MAIN2 +void vLightningAbilityCheck(ArrayList list, ArrayList list2, ArrayList list3, ArrayList list4) +#else +public void MT_OnAbilityCheck(ArrayList list, ArrayList list2, ArrayList list3, ArrayList list4) +#endif +{ + list.PushString(MT_LIGHTNING_SECTION); + list2.PushString(MT_LIGHTNING_SECTION2); + list3.PushString(MT_LIGHTNING_SECTION3); + list4.PushString(MT_LIGHTNING_SECTION4); +} + +#if defined MT_ABILITIES_MAIN2 +void vLightningCombineAbilities(int tank, int type, const float random, const char[] combo) +#else +public void MT_OnCombineAbilities(int tank, int type, const float random, const char[] combo, int survivor, int weapon, const char[] classname) +#endif +{ + if (!g_bSecondGame || (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esLightningCache[tank].g_iHumanAbility != 2)) + { + g_esLightningAbility[g_esLightningPlayer[tank].g_iTankTypeRecorded].g_iComboPosition = -1; + + return; + } + + g_esLightningAbility[g_esLightningPlayer[tank].g_iTankTypeRecorded].g_iComboPosition = -1; + + char sCombo[320], sSet[4][32]; + FormatEx(sCombo, sizeof sCombo, ",%s,", combo); + FormatEx(sSet[0], sizeof sSet[], ",%s,", MT_LIGHTNING_SECTION); + FormatEx(sSet[1], sizeof sSet[], ",%s,", MT_LIGHTNING_SECTION2); + FormatEx(sSet[2], sizeof sSet[], ",%s,", MT_LIGHTNING_SECTION3); + FormatEx(sSet[3], sizeof sSet[], ",%s,", MT_LIGHTNING_SECTION4); + if (StrContains(sCombo, sSet[0], false) != -1 || StrContains(sCombo, sSet[1], false) != -1 || StrContains(sCombo, sSet[2], false) != -1 || StrContains(sCombo, sSet[3], false) != -1) + { + if (type == MT_COMBO_MAINRANGE && g_esLightningCache[tank].g_iLightningAbility == 1 && g_esLightningCache[tank].g_iComboAbility == 1 && !g_esLightningPlayer[tank].g_bActivated) + { + char sAbilities[320], sSubset[10][32]; + strcopy(sAbilities, sizeof sAbilities, combo); + ExplodeString(sAbilities, ",", sSubset, sizeof sSubset, sizeof sSubset[]); + + float flDelay = 0.0; + for (int iPos = 0; iPos < (sizeof sSubset); iPos++) + { + if (StrEqual(sSubset[iPos], MT_LIGHTNING_SECTION, false) || StrEqual(sSubset[iPos], MT_LIGHTNING_SECTION2, false) || StrEqual(sSubset[iPos], MT_LIGHTNING_SECTION3, false) || StrEqual(sSubset[iPos], MT_LIGHTNING_SECTION4, false)) + { + g_esLightningAbility[g_esLightningPlayer[tank].g_iTankTypeRecorded].g_iComboPosition = iPos; + + if (random <= MT_GetCombinationSetting(tank, 1, iPos)) + { + flDelay = MT_GetCombinationSetting(tank, 4, iPos); + + switch (flDelay) + { + case 0.0: vLightning(tank, iPos); + default: + { + DataPack dpCombo; + CreateDataTimer(flDelay, tTimerLightningCombo, dpCombo, TIMER_FLAG_NO_MAPCHANGE); + dpCombo.WriteCell(GetClientUserId(tank)); + dpCombo.WriteCell(iPos); + } + } + } + + break; + } + } + } + } +} + +#if defined MT_ABILITIES_MAIN2 +void vLightningConfigsLoad(int mode) +#else +public void MT_OnConfigsLoad(int mode) +#endif +{ + switch (mode) + { + case 1: + { + for (int iIndex = MT_GetMinType(); iIndex <= MT_GetMaxType(); iIndex++) + { + g_esLightningAbility[iIndex].g_iAccessFlags = 0; + g_esLightningAbility[iIndex].g_iImmunityFlags = 0; + g_esLightningAbility[iIndex].g_flCloseAreasOnly = 0.0; + g_esLightningAbility[iIndex].g_iComboAbility = 0; + g_esLightningAbility[iIndex].g_iComboPosition = -1; + g_esLightningAbility[iIndex].g_iHumanAbility = 0; + g_esLightningAbility[iIndex].g_iHumanAmmo = 5; + g_esLightningAbility[iIndex].g_iHumanCooldown = 0; + g_esLightningAbility[iIndex].g_iHumanDuration = 5; + g_esLightningAbility[iIndex].g_iHumanMode = 1; + g_esLightningAbility[iIndex].g_flOpenAreasOnly = 0.0; + g_esLightningAbility[iIndex].g_iRequiresHumans = 0; + g_esLightningAbility[iIndex].g_iLightningAbility = 0; + g_esLightningAbility[iIndex].g_iLightningMessage = 0; + g_esLightningAbility[iIndex].g_flLightningChance = 33.3; + g_esLightningAbility[iIndex].g_iLightningCooldown = 0; + g_esLightningAbility[iIndex].g_flLightningDamage = 5.0; + g_esLightningAbility[iIndex].g_iLightningDuration = 5; + g_esLightningAbility[iIndex].g_flLightningInterval = 1.0; + g_esLightningAbility[iIndex].g_iLightningSight = 0; + + g_esLightningSpecial[iIndex].g_flCloseAreasOnly = -1.0; + g_esLightningSpecial[iIndex].g_iComboAbility = -1; + g_esLightningSpecial[iIndex].g_iHumanAbility = -1; + g_esLightningSpecial[iIndex].g_iHumanAmmo = -1; + g_esLightningSpecial[iIndex].g_iHumanCooldown = -1; + g_esLightningSpecial[iIndex].g_iHumanDuration = -1; + g_esLightningSpecial[iIndex].g_iHumanMode = -1; + g_esLightningSpecial[iIndex].g_flOpenAreasOnly = -1.0; + g_esLightningSpecial[iIndex].g_iRequiresHumans = -1; + g_esLightningSpecial[iIndex].g_iLightningAbility = -1; + g_esLightningSpecial[iIndex].g_iLightningMessage = -1; + g_esLightningSpecial[iIndex].g_flLightningChance = -1.0; + g_esLightningSpecial[iIndex].g_iLightningCooldown = -1; + g_esLightningSpecial[iIndex].g_flLightningDamage = -1.0; + g_esLightningSpecial[iIndex].g_iLightningDuration = -1; + g_esLightningSpecial[iIndex].g_flLightningInterval = -1.0; + g_esLightningSpecial[iIndex].g_iLightningSight = -1; + } + } + case 3: + { + for (int iPlayer = 1; iPlayer <= MaxClients; iPlayer++) + { + g_esLightningPlayer[iPlayer].g_iAccessFlags = -1; + g_esLightningPlayer[iPlayer].g_iImmunityFlags = -1; + g_esLightningPlayer[iPlayer].g_flCloseAreasOnly = -1.0; + g_esLightningPlayer[iPlayer].g_iComboAbility = -1; + g_esLightningPlayer[iPlayer].g_iHumanAbility = -1; + g_esLightningPlayer[iPlayer].g_iHumanAmmo = -1; + g_esLightningPlayer[iPlayer].g_iHumanCooldown = -1; + g_esLightningPlayer[iPlayer].g_iHumanDuration = -1; + g_esLightningPlayer[iPlayer].g_iHumanMode = -1; + g_esLightningPlayer[iPlayer].g_flOpenAreasOnly = -1.0; + g_esLightningPlayer[iPlayer].g_iRequiresHumans = -1; + g_esLightningPlayer[iPlayer].g_iLightningAbility = -1; + g_esLightningPlayer[iPlayer].g_iLightningMessage = -1; + g_esLightningPlayer[iPlayer].g_flLightningChance = -1.0; + g_esLightningPlayer[iPlayer].g_iLightningCooldown = -1; + g_esLightningPlayer[iPlayer].g_flLightningDamage = -1.0; + g_esLightningPlayer[iPlayer].g_iLightningDuration = -1; + g_esLightningPlayer[iPlayer].g_flLightningInterval = -1.0; + g_esLightningPlayer[iPlayer].g_iLightningSight = -1; + + g_esLightningTeammate[iPlayer].g_flCloseAreasOnly = -1.0; + g_esLightningTeammate[iPlayer].g_iComboAbility = -1; + g_esLightningTeammate[iPlayer].g_iHumanAbility = -1; + g_esLightningTeammate[iPlayer].g_iHumanAmmo = -1; + g_esLightningTeammate[iPlayer].g_iHumanCooldown = -1; + g_esLightningTeammate[iPlayer].g_iHumanDuration = -1; + g_esLightningTeammate[iPlayer].g_iHumanMode = -1; + g_esLightningTeammate[iPlayer].g_flOpenAreasOnly = -1.0; + g_esLightningTeammate[iPlayer].g_iRequiresHumans = -1; + g_esLightningTeammate[iPlayer].g_iLightningAbility = -1; + g_esLightningTeammate[iPlayer].g_iLightningMessage = -1; + g_esLightningTeammate[iPlayer].g_flLightningChance = -1.0; + g_esLightningTeammate[iPlayer].g_iLightningCooldown = -1; + g_esLightningTeammate[iPlayer].g_flLightningDamage = -1.0; + g_esLightningTeammate[iPlayer].g_iLightningDuration = -1; + g_esLightningTeammate[iPlayer].g_flLightningInterval = -1.0; + g_esLightningTeammate[iPlayer].g_iLightningSight = -1; + } + } + } +} + +#if defined MT_ABILITIES_MAIN2 +void vLightningConfigsLoaded(const char[] subsection, const char[] key, const char[] value, int type, int admin, int mode, bool special, const char[] specsection) +#else +public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const char[] value, int type, int admin, int mode, bool special, const char[] specsection) +#endif +{ + if ((mode == -1 || mode == 3) && bIsValidClient(admin)) + { + if (special && specsection[0] != '\0') + { + g_esLightningTeammate[admin].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esLightningTeammate[admin].g_flCloseAreasOnly, value, -1.0, 99999.0); + g_esLightningTeammate[admin].g_iComboAbility = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "ComboAbility", "Combo Ability", "Combo_Ability", "combo", g_esLightningTeammate[admin].g_iComboAbility, value, -1, 1); + g_esLightningTeammate[admin].g_iHumanAbility = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esLightningTeammate[admin].g_iHumanAbility, value, -1, 2); + g_esLightningTeammate[admin].g_iHumanAmmo = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esLightningTeammate[admin].g_iHumanAmmo, value, -1, 99999); + g_esLightningTeammate[admin].g_iHumanCooldown = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esLightningTeammate[admin].g_iHumanCooldown, value, -1, 99999); + g_esLightningTeammate[admin].g_iHumanDuration = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esLightningTeammate[admin].g_iHumanDuration, value, -1, 99999); + g_esLightningTeammate[admin].g_iHumanMode = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esLightningTeammate[admin].g_iHumanMode, value, -1, 2); + g_esLightningTeammate[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esLightningTeammate[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); + g_esLightningTeammate[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esLightningTeammate[admin].g_iRequiresHumans, value, -1, 32); + g_esLightningTeammate[admin].g_iLightningAbility = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esLightningTeammate[admin].g_iLightningAbility, value, -1, 1); + g_esLightningTeammate[admin].g_iLightningMessage = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esLightningTeammate[admin].g_iLightningMessage, value, -1, 1); + g_esLightningTeammate[admin].g_iLightningSight = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "AbilitySight", "Ability Sight", "Ability_Sight", "sight", g_esLightningTeammate[admin].g_iLightningSight, value, -1, 5); + g_esLightningTeammate[admin].g_flLightningChance = flGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "LightningChance", "Lightning Chance", "Lightning_Chance", "chance", g_esLightningTeammate[admin].g_flLightningChance, value, -1.0, 100.0); + g_esLightningTeammate[admin].g_iLightningCooldown = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "LightningCooldown", "Lightning Cooldown", "Lightning_Cooldown", "cooldown", g_esLightningTeammate[admin].g_iLightningCooldown, value, -1, 99999); + g_esLightningTeammate[admin].g_flLightningDamage = flGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "LightningDamage", "Lightning Damage", "Lightning_Damage", "damage", g_esLightningTeammate[admin].g_flLightningDamage, value, -1.0, 99999.0); + g_esLightningTeammate[admin].g_iLightningDuration = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "LightningDuration", "Lightning Duration", "Lightning_Duration", "duration", g_esLightningTeammate[admin].g_iLightningDuration, value, -1, 99999); + g_esLightningTeammate[admin].g_flLightningInterval = flGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "LightningInterval", "Lightning Interval", "Lightning_Interval", "interval", g_esLightningTeammate[admin].g_flLightningInterval, value, -1.0, 99999.0); + } + else + { + g_esLightningPlayer[admin].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esLightningPlayer[admin].g_flCloseAreasOnly, value, -1.0, 99999.0); + g_esLightningPlayer[admin].g_iComboAbility = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "ComboAbility", "Combo Ability", "Combo_Ability", "combo", g_esLightningPlayer[admin].g_iComboAbility, value, -1, 1); + g_esLightningPlayer[admin].g_iHumanAbility = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esLightningPlayer[admin].g_iHumanAbility, value, -1, 2); + g_esLightningPlayer[admin].g_iHumanAmmo = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esLightningPlayer[admin].g_iHumanAmmo, value, -1, 99999); + g_esLightningPlayer[admin].g_iHumanCooldown = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esLightningPlayer[admin].g_iHumanCooldown, value, -1, 99999); + g_esLightningPlayer[admin].g_iHumanDuration = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esLightningPlayer[admin].g_iHumanDuration, value, -1, 99999); + g_esLightningPlayer[admin].g_iHumanMode = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esLightningPlayer[admin].g_iHumanMode, value, -1, 2); + g_esLightningPlayer[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esLightningPlayer[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); + g_esLightningPlayer[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esLightningPlayer[admin].g_iRequiresHumans, value, -1, 32); + g_esLightningPlayer[admin].g_iLightningAbility = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esLightningPlayer[admin].g_iLightningAbility, value, -1, 1); + g_esLightningPlayer[admin].g_iLightningMessage = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esLightningPlayer[admin].g_iLightningMessage, value, -1, 1); + g_esLightningPlayer[admin].g_iLightningSight = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "AbilitySight", "Ability Sight", "Ability_Sight", "sight", g_esLightningPlayer[admin].g_iLightningSight, value, -1, 5); + g_esLightningPlayer[admin].g_flLightningChance = flGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "LightningChance", "Lightning Chance", "Lightning_Chance", "chance", g_esLightningPlayer[admin].g_flLightningChance, value, -1.0, 100.0); + g_esLightningPlayer[admin].g_iLightningCooldown = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "LightningCooldown", "Lightning Cooldown", "Lightning_Cooldown", "cooldown", g_esLightningPlayer[admin].g_iLightningCooldown, value, -1, 99999); + g_esLightningPlayer[admin].g_flLightningDamage = flGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "LightningDamage", "Lightning Damage", "Lightning_Damage", "damage", g_esLightningPlayer[admin].g_flLightningDamage, value, -1.0, 99999.0); + g_esLightningPlayer[admin].g_iLightningDuration = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "LightningDuration", "Lightning Duration", "Lightning_Duration", "duration", g_esLightningPlayer[admin].g_iLightningDuration, value, -1, 99999); + g_esLightningPlayer[admin].g_flLightningInterval = flGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "LightningInterval", "Lightning Interval", "Lightning_Interval", "interval", g_esLightningPlayer[admin].g_flLightningInterval, value, -1.0, 99999.0); + g_esLightningPlayer[admin].g_iAccessFlags = iGetAdminFlagsValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "AccessFlags", "Access Flags", "Access_Flags", "access", value); + g_esLightningPlayer[admin].g_iImmunityFlags = iGetAdminFlagsValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "ImmunityFlags", "Immunity Flags", "Immunity_Flags", "immunity", value); + } + } + + if (mode < 3 && type > 0) + { + if (special && specsection[0] != '\0') + { + g_esLightningSpecial[type].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esLightningSpecial[type].g_flCloseAreasOnly, value, -1.0, 99999.0); + g_esLightningSpecial[type].g_iComboAbility = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "ComboAbility", "Combo Ability", "Combo_Ability", "combo", g_esLightningSpecial[type].g_iComboAbility, value, -1, 1); + g_esLightningSpecial[type].g_iHumanAbility = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esLightningSpecial[type].g_iHumanAbility, value, -1, 2); + g_esLightningSpecial[type].g_iHumanAmmo = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esLightningSpecial[type].g_iHumanAmmo, value, -1, 99999); + g_esLightningSpecial[type].g_iHumanCooldown = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esLightningSpecial[type].g_iHumanCooldown, value, -1, 99999); + g_esLightningSpecial[type].g_iHumanDuration = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esLightningSpecial[type].g_iHumanDuration, value, -1, 99999); + g_esLightningSpecial[type].g_iHumanMode = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esLightningSpecial[type].g_iHumanMode, value, -1, 2); + g_esLightningSpecial[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esLightningSpecial[type].g_flOpenAreasOnly, value, -1.0, 99999.0); + g_esLightningSpecial[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esLightningSpecial[type].g_iRequiresHumans, value, -1, 32); + g_esLightningSpecial[type].g_iLightningAbility = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esLightningSpecial[type].g_iLightningAbility, value, -1, 1); + g_esLightningSpecial[type].g_iLightningMessage = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esLightningSpecial[type].g_iLightningMessage, value, -1, 1); + g_esLightningSpecial[type].g_iLightningSight = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "AbilitySight", "Ability Sight", "Ability_Sight", "sight", g_esLightningSpecial[type].g_iLightningSight, value, -1, 5); + g_esLightningSpecial[type].g_flLightningChance = flGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "LightningChance", "Lightning Chance", "Lightning_Chance", "chance", g_esLightningSpecial[type].g_flLightningChance, value, -1.0, 100.0); + g_esLightningSpecial[type].g_iLightningCooldown = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "LightningCooldown", "Lightning Cooldown", "Lightning_Cooldown", "cooldown", g_esLightningSpecial[type].g_iLightningCooldown, value, -1, 99999); + g_esLightningSpecial[type].g_flLightningDamage = flGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "LightningDamage", "Lightning Damage", "Lightning_Damage", "damage", g_esLightningSpecial[type].g_flLightningDamage, value, -1.0, 99999.0); + g_esLightningSpecial[type].g_iLightningDuration = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "LightningDuration", "Lightning Duration", "Lightning_Duration", "duration", g_esLightningSpecial[type].g_iLightningDuration, value, -1, 99999); + g_esLightningSpecial[type].g_flLightningInterval = flGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "LightningInterval", "Lightning Interval", "Lightning_Interval", "interval", g_esLightningSpecial[type].g_flLightningInterval, value, -1.0, 99999.0); + } + else + { + g_esLightningAbility[type].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esLightningAbility[type].g_flCloseAreasOnly, value, -1.0, 99999.0); + g_esLightningAbility[type].g_iComboAbility = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "ComboAbility", "Combo Ability", "Combo_Ability", "combo", g_esLightningAbility[type].g_iComboAbility, value, -1, 1); + g_esLightningAbility[type].g_iHumanAbility = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esLightningAbility[type].g_iHumanAbility, value, -1, 2); + g_esLightningAbility[type].g_iHumanAmmo = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esLightningAbility[type].g_iHumanAmmo, value, -1, 99999); + g_esLightningAbility[type].g_iHumanCooldown = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esLightningAbility[type].g_iHumanCooldown, value, -1, 99999); + g_esLightningAbility[type].g_iHumanDuration = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esLightningAbility[type].g_iHumanDuration, value, -1, 99999); + g_esLightningAbility[type].g_iHumanMode = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esLightningAbility[type].g_iHumanMode, value, -1, 2); + g_esLightningAbility[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esLightningAbility[type].g_flOpenAreasOnly, value, -1.0, 99999.0); + g_esLightningAbility[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esLightningAbility[type].g_iRequiresHumans, value, -1, 32); + g_esLightningAbility[type].g_iLightningAbility = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esLightningAbility[type].g_iLightningAbility, value, -1, 1); + g_esLightningAbility[type].g_iLightningMessage = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esLightningAbility[type].g_iLightningMessage, value, -1, 1); + g_esLightningAbility[type].g_iLightningSight = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "AbilitySight", "Ability Sight", "Ability_Sight", "sight", g_esLightningAbility[type].g_iLightningSight, value, -1, 5); + g_esLightningAbility[type].g_flLightningChance = flGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "LightningChance", "Lightning Chance", "Lightning_Chance", "chance", g_esLightningAbility[type].g_flLightningChance, value, -1.0, 100.0); + g_esLightningAbility[type].g_iLightningCooldown = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "LightningCooldown", "Lightning Cooldown", "Lightning_Cooldown", "cooldown", g_esLightningAbility[type].g_iLightningCooldown, value, -1, 99999); + g_esLightningAbility[type].g_flLightningDamage = flGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "LightningDamage", "Lightning Damage", "Lightning_Damage", "damage", g_esLightningAbility[type].g_flLightningDamage, value, -1.0, 99999.0); + g_esLightningAbility[type].g_iLightningDuration = iGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "LightningDuration", "Lightning Duration", "Lightning_Duration", "duration", g_esLightningAbility[type].g_iLightningDuration, value, -1, 99999); + g_esLightningAbility[type].g_flLightningInterval = flGetKeyValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "LightningInterval", "Lightning Interval", "Lightning_Interval", "interval", g_esLightningAbility[type].g_flLightningInterval, value, -1.0, 99999.0); + g_esLightningAbility[type].g_iAccessFlags = iGetAdminFlagsValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "AccessFlags", "Access Flags", "Access_Flags", "access", value); + g_esLightningAbility[type].g_iImmunityFlags = iGetAdminFlagsValue(subsection, MT_LIGHTNING_SECTION, MT_LIGHTNING_SECTION2, MT_LIGHTNING_SECTION3, MT_LIGHTNING_SECTION4, key, "ImmunityFlags", "Immunity Flags", "Immunity_Flags", "immunity", value); + } + } +} + +#if defined MT_ABILITIES_MAIN2 +void vLightningSettingsCached(int tank, bool apply, int type) +#else +public void MT_OnSettingsCached(int tank, bool apply, int type) +#endif +{ + bool bHuman = bIsValidClient(tank, MT_CHECK_FAKECLIENT); + g_esLightningPlayer[tank].g_iTankTypeRecorded = apply ? MT_GetRecordedTankType(tank, type) : 0; + g_esLightningPlayer[tank].g_iTankType = apply ? type : 0; + int iType = g_esLightningPlayer[tank].g_iTankTypeRecorded; +#if !defined MT_ABILITIES_MAIN2 + g_iGraphicsLevel = MT_GetGraphicsLevel(); +#endif + if (bIsSpecialInfected(tank, MT_CHECK_INDEX|MT_CHECK_INGAME)) + { + g_esLightningCache[tank].g_flCloseAreasOnly = flGetSubSettingValue(apply, bHuman, g_esLightningTeammate[tank].g_flCloseAreasOnly, g_esLightningPlayer[tank].g_flCloseAreasOnly, g_esLightningSpecial[iType].g_flCloseAreasOnly, g_esLightningAbility[iType].g_flCloseAreasOnly, 1); + g_esLightningCache[tank].g_iComboAbility = iGetSubSettingValue(apply, bHuman, g_esLightningTeammate[tank].g_iComboAbility, g_esLightningPlayer[tank].g_iComboAbility, g_esLightningSpecial[iType].g_iComboAbility, g_esLightningAbility[iType].g_iComboAbility, 1); + g_esLightningCache[tank].g_flLightningChance = flGetSubSettingValue(apply, bHuman, g_esLightningTeammate[tank].g_flLightningChance, g_esLightningPlayer[tank].g_flLightningChance, g_esLightningSpecial[iType].g_flLightningChance, g_esLightningAbility[iType].g_flLightningChance, 1); + g_esLightningCache[tank].g_flLightningDamage = flGetSubSettingValue(apply, bHuman, g_esLightningTeammate[tank].g_flLightningDamage, g_esLightningPlayer[tank].g_flLightningDamage, g_esLightningSpecial[iType].g_flLightningDamage, g_esLightningAbility[iType].g_flLightningDamage, 1); + g_esLightningCache[tank].g_flLightningInterval = flGetSubSettingValue(apply, bHuman, g_esLightningTeammate[tank].g_flLightningInterval, g_esLightningPlayer[tank].g_flLightningInterval, g_esLightningSpecial[iType].g_flLightningInterval, g_esLightningAbility[iType].g_flLightningInterval, 1); + g_esLightningCache[tank].g_iLightningAbility = iGetSubSettingValue(apply, bHuman, g_esLightningTeammate[tank].g_iLightningAbility, g_esLightningPlayer[tank].g_iLightningAbility, g_esLightningSpecial[iType].g_iLightningAbility, g_esLightningAbility[iType].g_iLightningAbility, 1); + g_esLightningCache[tank].g_iLightningCooldown = iGetSubSettingValue(apply, bHuman, g_esLightningTeammate[tank].g_iLightningCooldown, g_esLightningPlayer[tank].g_iLightningCooldown, g_esLightningSpecial[iType].g_iLightningCooldown, g_esLightningAbility[iType].g_iLightningCooldown, 1); + g_esLightningCache[tank].g_iLightningDuration = iGetSubSettingValue(apply, bHuman, g_esLightningTeammate[tank].g_iLightningDuration, g_esLightningPlayer[tank].g_iLightningDuration, g_esLightningSpecial[iType].g_iLightningDuration, g_esLightningAbility[iType].g_iLightningDuration, 1); + g_esLightningCache[tank].g_iLightningMessage = iGetSubSettingValue(apply, bHuman, g_esLightningTeammate[tank].g_iLightningMessage, g_esLightningPlayer[tank].g_iLightningMessage, g_esLightningSpecial[iType].g_iLightningMessage, g_esLightningAbility[iType].g_iLightningMessage, 1); + g_esLightningCache[tank].g_iLightningSight = iGetSubSettingValue(apply, bHuman, g_esLightningTeammate[tank].g_iLightningSight, g_esLightningPlayer[tank].g_iLightningSight, g_esLightningSpecial[iType].g_iLightningSight, g_esLightningAbility[iType].g_iLightningSight, 1); + g_esLightningCache[tank].g_iHumanAbility = iGetSubSettingValue(apply, bHuman, g_esLightningTeammate[tank].g_iHumanAbility, g_esLightningPlayer[tank].g_iHumanAbility, g_esLightningSpecial[iType].g_iHumanAbility, g_esLightningAbility[iType].g_iHumanAbility, 1); + g_esLightningCache[tank].g_iHumanAmmo = iGetSubSettingValue(apply, bHuman, g_esLightningTeammate[tank].g_iHumanAmmo, g_esLightningPlayer[tank].g_iHumanAmmo, g_esLightningSpecial[iType].g_iHumanAmmo, g_esLightningAbility[iType].g_iHumanAmmo, 1); + g_esLightningCache[tank].g_iHumanCooldown = iGetSubSettingValue(apply, bHuman, g_esLightningTeammate[tank].g_iHumanCooldown, g_esLightningPlayer[tank].g_iHumanCooldown, g_esLightningSpecial[iType].g_iHumanCooldown, g_esLightningAbility[iType].g_iHumanCooldown, 1); + g_esLightningCache[tank].g_iHumanDuration = iGetSubSettingValue(apply, bHuman, g_esLightningTeammate[tank].g_iHumanDuration, g_esLightningPlayer[tank].g_iHumanDuration, g_esLightningSpecial[iType].g_iHumanDuration, g_esLightningAbility[iType].g_iHumanDuration, 1); + g_esLightningCache[tank].g_iHumanMode = iGetSubSettingValue(apply, bHuman, g_esLightningTeammate[tank].g_iHumanMode, g_esLightningPlayer[tank].g_iHumanMode, g_esLightningSpecial[iType].g_iHumanMode, g_esLightningAbility[iType].g_iHumanMode, 1); + g_esLightningCache[tank].g_flOpenAreasOnly = flGetSubSettingValue(apply, bHuman, g_esLightningTeammate[tank].g_flOpenAreasOnly, g_esLightningPlayer[tank].g_flOpenAreasOnly, g_esLightningSpecial[iType].g_flOpenAreasOnly, g_esLightningAbility[iType].g_flOpenAreasOnly, 1); + g_esLightningCache[tank].g_iRequiresHumans = iGetSubSettingValue(apply, bHuman, g_esLightningTeammate[tank].g_iRequiresHumans, g_esLightningPlayer[tank].g_iRequiresHumans, g_esLightningSpecial[iType].g_iRequiresHumans, g_esLightningAbility[iType].g_iRequiresHumans, 1); + } + else + { + g_esLightningCache[tank].g_flCloseAreasOnly = flGetSettingValue(apply, bHuman, g_esLightningPlayer[tank].g_flCloseAreasOnly, g_esLightningAbility[iType].g_flCloseAreasOnly, 1); + g_esLightningCache[tank].g_iComboAbility = iGetSettingValue(apply, bHuman, g_esLightningPlayer[tank].g_iComboAbility, g_esLightningAbility[iType].g_iComboAbility, 1); + g_esLightningCache[tank].g_flLightningChance = flGetSettingValue(apply, bHuman, g_esLightningPlayer[tank].g_flLightningChance, g_esLightningAbility[iType].g_flLightningChance, 1); + g_esLightningCache[tank].g_flLightningDamage = flGetSettingValue(apply, bHuman, g_esLightningPlayer[tank].g_flLightningDamage, g_esLightningAbility[iType].g_flLightningDamage, 1); + g_esLightningCache[tank].g_flLightningInterval = flGetSettingValue(apply, bHuman, g_esLightningPlayer[tank].g_flLightningInterval, g_esLightningAbility[iType].g_flLightningInterval, 1); + g_esLightningCache[tank].g_iLightningAbility = iGetSettingValue(apply, bHuman, g_esLightningPlayer[tank].g_iLightningAbility, g_esLightningAbility[iType].g_iLightningAbility, 1); + g_esLightningCache[tank].g_iLightningCooldown = iGetSettingValue(apply, bHuman, g_esLightningPlayer[tank].g_iLightningCooldown, g_esLightningAbility[iType].g_iLightningCooldown, 1); + g_esLightningCache[tank].g_iLightningDuration = iGetSettingValue(apply, bHuman, g_esLightningPlayer[tank].g_iLightningDuration, g_esLightningAbility[iType].g_iLightningDuration, 1); + g_esLightningCache[tank].g_iLightningMessage = iGetSettingValue(apply, bHuman, g_esLightningPlayer[tank].g_iLightningMessage, g_esLightningAbility[iType].g_iLightningMessage, 1); + g_esLightningCache[tank].g_iLightningSight = iGetSettingValue(apply, bHuman, g_esLightningPlayer[tank].g_iLightningSight, g_esLightningAbility[iType].g_iLightningSight, 1); + g_esLightningCache[tank].g_iHumanAbility = iGetSettingValue(apply, bHuman, g_esLightningPlayer[tank].g_iHumanAbility, g_esLightningAbility[iType].g_iHumanAbility, 1); + g_esLightningCache[tank].g_iHumanAmmo = iGetSettingValue(apply, bHuman, g_esLightningPlayer[tank].g_iHumanAmmo, g_esLightningAbility[iType].g_iHumanAmmo, 1); + g_esLightningCache[tank].g_iHumanCooldown = iGetSettingValue(apply, bHuman, g_esLightningPlayer[tank].g_iHumanCooldown, g_esLightningAbility[iType].g_iHumanCooldown, 1); + g_esLightningCache[tank].g_iHumanDuration = iGetSettingValue(apply, bHuman, g_esLightningPlayer[tank].g_iHumanDuration, g_esLightningAbility[iType].g_iHumanDuration, 1); + g_esLightningCache[tank].g_iHumanMode = iGetSettingValue(apply, bHuman, g_esLightningPlayer[tank].g_iHumanMode, g_esLightningAbility[iType].g_iHumanMode, 1); + g_esLightningCache[tank].g_flOpenAreasOnly = flGetSettingValue(apply, bHuman, g_esLightningPlayer[tank].g_flOpenAreasOnly, g_esLightningAbility[iType].g_flOpenAreasOnly, 1); + g_esLightningCache[tank].g_iRequiresHumans = iGetSettingValue(apply, bHuman, g_esLightningPlayer[tank].g_iRequiresHumans, g_esLightningAbility[iType].g_iRequiresHumans, 1); + } +} + +#if defined MT_ABILITIES_MAIN2 +void vLightningCopyStats(int oldTank, int newTank) +#else +public void MT_OnCopyStats(int oldTank, int newTank) +#endif +{ + vLightningCopyStats2(oldTank, newTank); + + if (oldTank != newTank) + { + vRemoveLightning(oldTank); + } +} + +#if !defined MT_ABILITIES_MAIN2 +public void MT_OnPluginUpdate() +{ + MT_ReloadPlugin(null); +} +#endif + +#if defined MT_ABILITIES_MAIN2 +void vLightningEventFired(Event event, const char[] name) +#else +public void MT_OnEventFired(Event event, const char[] name, bool dontBroadcast) +#endif +{ + if (StrEqual(name, "bot_player_replace")) + { + int iBotId = event.GetInt("bot"), iBot = GetClientOfUserId(iBotId), + iTankId = event.GetInt("player"), iTank = GetClientOfUserId(iTankId); + if (bIsValidClient(iBot) && bIsInfected(iTank)) + { + vLightningCopyStats2(iBot, iTank); + vRemoveLightning(iBot); + } + } + else if (StrEqual(name, "mission_lost") || StrEqual(name, "round_start") || StrEqual(name, "round_end")) + { + vLightningReset(); + } + else if (StrEqual(name, "player_bot_replace")) + { + int iTankId = event.GetInt("player"), iTank = GetClientOfUserId(iTankId), + iBotId = event.GetInt("bot"), iBot = GetClientOfUserId(iBotId); + if (bIsValidClient(iTank) && bIsInfected(iBot)) + { + vLightningCopyStats2(iTank, iBot); + vRemoveLightning(iTank); + } + } + else if (StrEqual(name, "player_death") || StrEqual(name, "player_spawn")) + { + int iTankId = event.GetInt("userid"), iTank = GetClientOfUserId(iTankId); + if (MT_IsTankSupported(iTank, MT_CHECK_INDEX|MT_CHECK_INGAME)) + { + vRemoveLightning(iTank); + } + } +} + +#if defined MT_ABILITIES_MAIN2 +void vLightningAbilityActivated(int tank) +#else +public void MT_OnAbilityActivated(int tank) +#endif +{ + if (!g_bSecondGame || (MT_IsTankSupported(tank, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_FAKECLIENT) && ((!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esLightningAbility[g_esLightningPlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esLightningPlayer[tank].g_iAccessFlags)) || g_esLightningCache[tank].g_iHumanAbility == 0))) + { + return; + } + + if (MT_IsTankSupported(tank) && (!bIsInfected(tank, MT_CHECK_FAKECLIENT) || g_esLightningCache[tank].g_iHumanAbility != 1) && MT_IsCustomTankSupported(tank) && g_esLightningCache[tank].g_iLightningAbility == 1 && g_esLightningCache[tank].g_iComboAbility == 0 && !g_esLightningPlayer[tank].g_bActivated) + { + vLightningAbility(tank); + } +} + +#if defined MT_ABILITIES_MAIN2 +void vLightningButtonPressed(int tank, int button) +#else +public void MT_OnButtonPressed(int tank, int button) +#endif +{ + if (MT_IsTankSupported(tank, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_ALIVE|MT_CHECK_FAKECLIENT) && MT_IsCustomTankSupported(tank)) + { + if (!g_bSecondGame || bIsAreaNarrow(tank, g_esLightningCache[tank].g_flOpenAreasOnly) || bIsAreaWide(tank, g_esLightningCache[tank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esLightningPlayer[tank].g_iTankType, tank) || (g_esLightningCache[tank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esLightningCache[tank].g_iRequiresHumans) || (!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esLightningAbility[g_esLightningPlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esLightningPlayer[tank].g_iAccessFlags))) + { + return; + } + + if ((button & MT_MAIN_KEY) && g_esLightningCache[tank].g_iLightningAbility == 1 && g_esLightningCache[tank].g_iHumanAbility == 1) + { + int iHumanMode = g_esLightningCache[tank].g_iHumanMode, iTime = GetTime(); + bool bRecharging = g_esLightningPlayer[tank].g_iCooldown != -1 && g_esLightningPlayer[tank].g_iCooldown >= iTime; + + switch (iHumanMode) + { + case 0: + { + if (!g_esLightningPlayer[tank].g_bActivated && !bRecharging) + { + vLightningAbility(tank); + } + else if (g_esLightningPlayer[tank].g_bActivated) + { + MT_PrintToChat(tank, "%s %t", MT_TAG3, "LightningHuman3"); + } + else if (bRecharging) + { + MT_PrintToChat(tank, "%s %t", MT_TAG3, "LightningHuman4", (g_esLightningPlayer[tank].g_iCooldown - iTime)); + } + } + case 1, 2: + { + if ((iHumanMode == 2 && g_esLightningPlayer[tank].g_bActivated) || (g_esLightningPlayer[tank].g_iAmmoCount < g_esLightningCache[tank].g_iHumanAmmo && g_esLightningCache[tank].g_iHumanAmmo > 0)) + { + if (!g_esLightningPlayer[tank].g_bActivated && !bRecharging) + { + g_esLightningPlayer[tank].g_bActivated = true; + g_esLightningPlayer[tank].g_iAmmoCount++; + + vLightning2(tank); + MT_PrintToChat(tank, "%s %t", MT_TAG3, "LightningHuman", g_esLightningPlayer[tank].g_iAmmoCount, g_esLightningCache[tank].g_iHumanAmmo); + } + else if (g_esLightningPlayer[tank].g_bActivated) + { + switch (iHumanMode) + { + case 1: MT_PrintToChat(tank, "%s %t", MT_TAG3, "LightningHuman3"); + case 2: + { + vLightningReset2(tank); + vLightningReset3(tank); + } + } + } + else if (bRecharging) + { + MT_PrintToChat(tank, "%s %t", MT_TAG3, "LightningHuman4", (g_esLightningPlayer[tank].g_iCooldown - iTime)); + } + } + else + { + MT_PrintToChat(tank, "%s %t", MT_TAG3, "LightningAmmo"); + } + } + } + } + } +} + +#if defined MT_ABILITIES_MAIN2 +void vLightningButtonReleased(int tank, int button) +#else +public void MT_OnButtonReleased(int tank, int button) +#endif +{ + if (MT_IsTankSupported(tank, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_ALIVE|MT_CHECK_FAKECLIENT) && g_esLightningCache[tank].g_iHumanAbility == 1) + { + if ((button & MT_MAIN_KEY) && g_esLightningCache[tank].g_iHumanMode == 1 && g_esLightningPlayer[tank].g_bActivated && (g_esLightningPlayer[tank].g_iCooldown == -1 || g_esLightningPlayer[tank].g_iCooldown <= GetTime())) + { + vLightningReset2(tank); + vLightningReset3(tank); + } + } +} + +#if defined MT_ABILITIES_MAIN2 +void vLightningChangeType(int tank, int oldType) +#else +public void MT_OnChangeType(int tank, int oldType, int newType, bool revert) +#endif +{ + if (oldType <= 0) + { + return; + } + + vRemoveLightning(tank); +} + +void vLightning(int tank, int pos = -1) +{ + if (g_esLightningPlayer[tank].g_iCooldown != -1 && g_esLightningPlayer[tank].g_iCooldown >= GetTime()) + { + return; + } + + g_esLightningPlayer[tank].g_bActivated = true; + + vLightning2(tank, pos); + + if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esLightningCache[tank].g_iHumanAbility == 1) + { + g_esLightningPlayer[tank].g_iAmmoCount++; + + MT_PrintToChat(tank, "%s %t", MT_TAG3, "LightningHuman", g_esLightningPlayer[tank].g_iAmmoCount, g_esLightningCache[tank].g_iHumanAmmo); + } + + if (g_esLightningCache[tank].g_iLightningMessage == 1) + { + char sTankName[64]; + MT_GetTankName(tank, sTankName); + MT_PrintToChatAll("%s %t", MT_TAG2, "Lightning", sTankName); + MT_LogMessage(MT_LOG_ABILITY, "%s %T", MT_TAG, "Lightning", LANG_SERVER, sTankName); + } +} + +void vLightning2(int tank, int pos = -1) +{ + if (!g_bSecondGame || bIsAreaNarrow(tank, g_esLightningCache[tank].g_flOpenAreasOnly) || bIsAreaWide(tank, g_esLightningCache[tank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esLightningPlayer[tank].g_iTankType, tank) || (g_esLightningCache[tank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esLightningCache[tank].g_iRequiresHumans) || (!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esLightningAbility[g_esLightningPlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esLightningPlayer[tank].g_iAccessFlags))) + { + return; + } + + float flInterval = (pos != -1) ? MT_GetCombinationSetting(tank, 6, pos) : g_esLightningCache[tank].g_flLightningInterval; + if (flInterval > 0.0) + { + DataPack dpLightning; + CreateDataTimer(flInterval, tTimerLightning, dpLightning, TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); + dpLightning.WriteCell(GetClientUserId(tank)); + dpLightning.WriteCell(g_esLightningPlayer[tank].g_iTankType); + dpLightning.WriteCell(GetTime()); + dpLightning.WriteCell(pos); + } +} + +void vLightningAbility(int tank) +{ + if (!g_bSecondGame || (g_esLightningPlayer[tank].g_iCooldown != -1 && g_esLightningPlayer[tank].g_iCooldown >= GetTime()) || bIsAreaNarrow(tank, g_esLightningCache[tank].g_flOpenAreasOnly) || bIsAreaWide(tank, g_esLightningCache[tank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esLightningPlayer[tank].g_iTankType, tank) || (g_esLightningCache[tank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esLightningCache[tank].g_iRequiresHumans) || (!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esLightningAbility[g_esLightningPlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esLightningPlayer[tank].g_iAccessFlags))) + { + return; + } + + if (!bIsInfected(tank, MT_CHECK_FAKECLIENT) || (g_esLightningPlayer[tank].g_iAmmoCount < g_esLightningCache[tank].g_iHumanAmmo && g_esLightningCache[tank].g_iHumanAmmo > 0)) + { + if (GetRandomFloat(0.1, 100.0) <= g_esLightningCache[tank].g_flLightningChance) + { + vLightning(tank); + } + else if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esLightningCache[tank].g_iHumanAbility == 1) + { + MT_PrintToChat(tank, "%s %t", MT_TAG3, "LightningHuman2"); + } + } + else if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esLightningCache[tank].g_iHumanAbility == 1) + { + MT_PrintToChat(tank, "%s %t", MT_TAG3, "LightningAmmo"); + } +} + +void vLightningCopyStats2(int oldTank, int newTank) +{ + g_esLightningPlayer[newTank].g_iAmmoCount = g_esLightningPlayer[oldTank].g_iAmmoCount; + g_esLightningPlayer[newTank].g_iCooldown = g_esLightningPlayer[oldTank].g_iCooldown; +} + +void vRemoveLightning(int tank) +{ + g_esLightningPlayer[tank].g_bActivated = false; + g_esLightningPlayer[tank].g_iAmmoCount = 0; + g_esLightningPlayer[tank].g_iCooldown = -1; +} + +void vLightningReset() +{ + for (int iPlayer = 1; iPlayer <= MaxClients; iPlayer++) + { + if (bIsValidClient(iPlayer, MT_CHECK_INGAME)) + { + vRemoveLightning(iPlayer); + } + } +} + +void vLightningReset2(int tank) +{ + g_esLightningPlayer[tank].g_bActivated = false; + + if (g_esLightningCache[tank].g_iLightningMessage == 1) + { + char sTankName[64]; + MT_GetTankName(tank, sTankName); + MT_PrintToChatAll("%s %t", MT_TAG2, "Lightning2", sTankName); + MT_LogMessage(MT_LOG_ABILITY, "%s %T", MT_TAG, "Lightning2", LANG_SERVER, sTankName); + } +} + +void vLightningReset3(int tank) +{ + int iTime = GetTime(), iPos = g_esLightningAbility[g_esLightningPlayer[tank].g_iTankTypeRecorded].g_iComboPosition, iCooldown = (iPos != -1) ? RoundToNearest(MT_GetCombinationSetting(tank, 2, iPos)) : g_esLightningCache[tank].g_iLightningCooldown; + iCooldown = (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esLightningCache[tank].g_iHumanAbility == 1 && g_esLightningCache[tank].g_iHumanMode == 0 && g_esLightningPlayer[tank].g_iAmmoCount < g_esLightningCache[tank].g_iHumanAmmo && g_esLightningCache[tank].g_iHumanAmmo > 0) ? g_esLightningCache[tank].g_iHumanCooldown : iCooldown; + g_esLightningPlayer[tank].g_iCooldown = (iTime + iCooldown); + if (g_esLightningPlayer[tank].g_iCooldown != -1 && g_esLightningPlayer[tank].g_iCooldown >= iTime) + { + MT_PrintToChat(tank, "%s %t", MT_TAG3, "LightningHuman5", (g_esLightningPlayer[tank].g_iCooldown - iTime)); + } +} + +Action tTimerLightningCombo(Handle timer, DataPack pack) +{ + pack.Reset(); + + int iTank = GetClientOfUserId(pack.ReadCell()); + if (!g_bSecondGame || !MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esLightningAbility[g_esLightningPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esLightningPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esLightningPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esLightningCache[iTank].g_iLightningAbility == 0 || g_esLightningPlayer[iTank].g_bActivated) + { + return Plugin_Stop; + } + + int iPos = pack.ReadCell(); + vLightning(iTank, iPos); + + return Plugin_Continue; +} + +Action tTimerLightning(Handle timer, DataPack pack) +{ + pack.Reset(); + + int iTank = GetClientOfUserId(pack.ReadCell()), iType = pack.ReadCell(); + if (!g_bSecondGame || !MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esLightningAbility[g_esLightningPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esLightningPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esLightningPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || iType != g_esLightningPlayer[iTank].g_iTankType || !g_esLightningPlayer[iTank].g_bActivated) + { + g_esLightningPlayer[iTank].g_bActivated = false; + + return Plugin_Stop; + } + + if (g_esLightningCache[iTank].g_iLightningAbility == 0 || bIsAreaNarrow(iTank, g_esLightningCache[iTank].g_flOpenAreasOnly) || bIsAreaWide(iTank, g_esLightningCache[iTank].g_flCloseAreasOnly)) + { + vLightningReset2(iTank); + + return Plugin_Stop; + } + + bool bHuman = bIsInfected(iTank, MT_CHECK_FAKECLIENT); + int iTime = pack.ReadCell(), iCurrentTime = GetTime(), iPos = pack.ReadCell(), + iDuration = (iPos != -1) ? RoundToNearest(MT_GetCombinationSetting(iTank, 5, iPos)) : g_esLightningCache[iTank].g_iLightningDuration; + iDuration = (bHuman && g_esLightningCache[iTank].g_iHumanAbility == 1) ? g_esLightningCache[iTank].g_iHumanDuration : iDuration; + if (iDuration > 0 && (!bHuman || (bHuman && g_esLightningCache[iTank].g_iHumanAbility == 1 && g_esLightningCache[iTank].g_iHumanMode == 0)) && (iTime + iDuration) < iCurrentTime) + { + vLightningReset2(iTank); + vLightningReset3(iTank); + + return Plugin_Stop; + } + + char sTargetName[64]; + float flOrigin[3]; + GetClientAbsOrigin(iTank, flOrigin); + float flRadius = MT_GetRandomFloat(100.0, 360.0), + flRadius2 = MT_GetRandomFloat(0.0, 360.0); + flOrigin[0] += (flRadius * Cosine(DegToRad(flRadius2))); + flOrigin[1] += (flRadius * Sine(DegToRad(flRadius2))); + + int iTarget = CreateEntityByName("info_particle_target"); + if (bIsValidEntity(iTarget)) + { + Format(sTargetName, sizeof sTargetName, "mutant_tank_target_%i_%i", iTank, g_esLightningPlayer[iTank].g_iTankTypeRecorded); + DispatchKeyValue(iTarget, "targetname", sTargetName); + TeleportEntity(iTarget, flOrigin); + DispatchSpawn(iTarget); + ActivateEntity(iTarget); + SetVariantString("OnUser2 !self:Kill::2.0:1"); + AcceptEntityInput(iTarget, "AddOutput"); + AcceptEntityInput(iTarget, "FireUser2"); + } + + float flSurvivorPos[3], flDamage = (iPos != -1) ? MT_GetCombinationSetting(iTank, 3, iPos) : g_esLightningCache[iTank].g_flLightningDamage; + for (int iSurvivor = 1; iSurvivor <= MaxClients; iSurvivor++) + { + if (bIsSurvivor(iSurvivor, MT_CHECK_INGAME|MT_CHECK_ALIVE) && !MT_IsAdminImmune(iSurvivor, iTank) && !bIsAdminImmune(iSurvivor, g_esLightningPlayer[iTank].g_iTankType, g_esLightningAbility[g_esLightningPlayer[iTank].g_iTankTypeRecorded].g_iImmunityFlags, g_esLightningPlayer[iSurvivor].g_iImmunityFlags)) + { + GetClientAbsOrigin(iSurvivor, flSurvivorPos); + if (GetVectorDistance(flOrigin, flSurvivorPos) <= 200.0 && bIsVisibleToPlayer(iTank, iSurvivor, g_esLightningCache[iTank].g_iLightningSight, .range = 200.0)) + { + if (flDamage > 0.0) + { + vDamagePlayer(iSurvivor, iTank, MT_GetScaledDamage(flDamage), "1024"); + } + + EmitSoundToAll(g_sLightningSounds[MT_GetRandomInt(0, (sizeof g_sLightningSounds - 1))], iSurvivor); + } + } + } + + flOrigin[2] += 1800.0; + + if (g_iGraphicsLevel > 2) + { + int iLightning = CreateEntityByName("info_particle_system"); + if (bIsValidEntity(iLightning)) + { + DispatchKeyValue(iLightning, "effect_name", PARTICLE_LIGHTNING); + DispatchKeyValue(iLightning, "cpoint1", sTargetName); + + TeleportEntity(iLightning, flOrigin); + DispatchSpawn(iLightning); + ActivateEntity(iLightning); + AcceptEntityInput(iLightning, "Start"); + + iLightning = EntIndexToEntRef(iLightning); + vDeleteEntity(iLightning, 2.0); + } + } + + return Plugin_Continue; } \ No newline at end of file diff --git a/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_medic.sp b/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_medic.sp index f9fdb351b2..208623d74e 100644 --- a/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_medic.sp +++ b/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_medic.sp @@ -1,6 +1,6 @@ /** - * Mutant Tanks: a L4D/L4D2 SourceMod Plugin - * Copyright (C) 2024 Alfred "Psyk0tik" Llagas + * Mutant Tanks: A L4D/L4D2 SourceMod Plugin + * Copyright (C) 2017-2025 Alfred "Psyk0tik" Llagas * * 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. * @@ -22,12 +22,14 @@ public Plugin myinfo = { name = "[MT] Medic Ability", author = MT_AUTHOR, - description = "The Mutant Tank heals nearby special infected.", + description = "The Mutant Tank heals nearby special infected and only takes damage in certain parts of its body.", version = MT_VERSION, url = MT_URL }; -bool g_bDedicated, g_bLaggedMovementInstalled, g_bSecondGame; +bool g_bDedicated, g_bLaggedMovementInstalled, g_bLateLoad, g_bSecondGame; + +int g_iGraphicsLevel; /** * Third-party natives @@ -51,6 +53,7 @@ public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max } g_bDedicated = IsDedicatedServer(); + g_bLateLoad = late; return APLRes_Success; } @@ -71,6 +74,8 @@ public void OnLibraryRemoved(const char[] name) } } +#define SOUND_METAL "physics/metal/metal_solid_impact_hard5.wav" + #define SPRITE_GLOW "sprites/glow01.vmt" #define SPRITE_LASERBEAM "sprites/laserbeam.vmt" #else @@ -97,6 +102,7 @@ enum struct esMedicPlayer float g_flMedicBuffResistance; float g_flMedicBuffSpeed; float g_flMedicChance; + float g_flMedicDamageMultiplier; float g_flMedicInterval; float g_flMedicRange; float g_flMedicRockChance; @@ -115,12 +121,14 @@ enum struct esMedicPlayer int g_iHumanDuration; int g_iHumanMode; int g_iHumanRockCooldown; + int g_iImmunityFlags; int g_iMedicAbility; int g_iMedicCooldown; int g_iMedicDuration; int g_iMedicField; int g_iMedicFieldColor[4]; int g_iMedicHealth[7]; + int g_iMedicHitGroup; int g_iMedicMaxHealth[7]; int g_iMedicMessage; int g_iMedicRockBreak; @@ -142,6 +150,7 @@ enum struct esMedicTeammate float g_flMedicBuffResistance; float g_flMedicBuffSpeed; float g_flMedicChance; + float g_flMedicDamageMultiplier; float g_flMedicInterval; float g_flMedicRange; float g_flMedicRockChance; @@ -160,6 +169,7 @@ enum struct esMedicTeammate int g_iMedicField; int g_iMedicFieldColor[4]; int g_iMedicHealth[7]; + int g_iMedicHitGroup; int g_iMedicMaxHealth[7]; int g_iMedicMessage; int g_iMedicRockBreak; @@ -178,6 +188,7 @@ enum struct esMedicAbility float g_flMedicBuffResistance; float g_flMedicBuffSpeed; float g_flMedicChance; + float g_flMedicDamageMultiplier; float g_flMedicInterval; float g_flMedicRange; float g_flMedicRockChance; @@ -192,12 +203,14 @@ enum struct esMedicAbility int g_iHumanDuration; int g_iHumanMode; int g_iHumanRockCooldown; + int g_iImmunityFlags; int g_iMedicAbility; int g_iMedicCooldown; int g_iMedicDuration; int g_iMedicField; int g_iMedicFieldColor[4]; int g_iMedicHealth[7]; + int g_iMedicHitGroup; int g_iMedicMaxHealth[7]; int g_iMedicMessage; int g_iMedicRockBreak; @@ -216,6 +229,7 @@ enum struct esMedicSpecial float g_flMedicBuffResistance; float g_flMedicBuffSpeed; float g_flMedicChance; + float g_flMedicDamageMultiplier; float g_flMedicInterval; float g_flMedicRange; float g_flMedicRockChance; @@ -234,6 +248,7 @@ enum struct esMedicSpecial int g_iMedicField; int g_iMedicFieldColor[4]; int g_iMedicHealth[7]; + int g_iMedicHitGroup; int g_iMedicMaxHealth[7]; int g_iMedicMessage; int g_iMedicRockBreak; @@ -252,6 +267,7 @@ enum struct esMedicCache float g_flMedicBuffResistance; float g_flMedicBuffSpeed; float g_flMedicChance; + float g_flMedicDamageMultiplier; float g_flMedicInterval; float g_flMedicRange; float g_flMedicRockChance; @@ -270,6 +286,7 @@ enum struct esMedicCache int g_iMedicField; int g_iMedicFieldColor[4]; int g_iMedicHealth[7]; + int g_iMedicHitGroup; int g_iMedicMaxHealth[7]; int g_iMedicMessage; int g_iMedicRockBreak; @@ -291,6 +308,19 @@ public void OnPluginStart() LoadTranslations("mutant_tanks_names.phrases"); RegConsoleCmd("sm_mt_medic", cmdMedicInfo, "View information about the Medic ability."); + + if (g_bLateLoad) + { + for (int iPlayer = 1; iPlayer <= MaxClients; iPlayer++) + { + if (bIsValidClient(iPlayer, MT_CHECK_INGAME)) + { + OnClientPutInServer(iPlayer); + } + } + + g_bLateLoad = false; + } } #endif @@ -313,6 +343,7 @@ public void OnClientPutInServer(int client) #endif { SDKHook(client, SDKHook_OnTakeDamage, OnMedicTakeDamage); + SDKHook(client, SDKHook_TraceAttack, MedicTraceAttack); vRemoveMedic(client); } @@ -400,7 +431,15 @@ int iMedicMenuHandler(Menu menu, MenuAction action, int param1, int param2) MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtons"); MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtons4"); } - case 3: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esMedicCache[param1].g_iHumanMode == 0) ? "AbilityButtonMode1" : "AbilityButtonMode2"); + case 3: + { + switch (g_esMedicCache[param1].g_iHumanMode) + { + case 0: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtonMode1"); + case 1: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtonMode2"); + case 2: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtonMode3"); + } + } case 4: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityCooldown", ((g_esMedicCache[param1].g_iHumanAbility == 1) ? g_esMedicCache[param1].g_iHumanCooldown : g_esMedicCache[param1].g_iMedicCooldown)); case 5: MT_PrintToChat(param1, "%s %t", MT_TAG3, "MedicDetails"); case 6: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityDuration2", ((g_esMedicCache[param1].g_iHumanAbility == 1) ? g_esMedicCache[param1].g_iHumanDuration : g_esMedicCache[param1].g_iMedicDuration)); @@ -501,6 +540,36 @@ Action OnMedicTakeDamage(int victim, int &attacker, int &inflictor, float &damag return Plugin_Continue; } +Action MedicTraceAttack(int victim, int &attacker, int &inflictor, float &damage, int &damagetype, int &ammotype, int hitbox, int hitgroup) +{ + if (MT_IsCorePluginEnabled() && bIsValidClient(victim, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_ALIVE) && damage > 0.0) + { + if (MT_IsTankSupported(victim) && MT_IsCustomTankSupported(victim) && g_esMedicCache[victim].g_iMedicHitGroup > 0) + { + if (bIsAreaNarrow(victim, g_esMedicCache[victim].g_flOpenAreasOnly) || bIsAreaWide(victim, g_esMedicCache[victim].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esMedicPlayer[victim].g_iTankType, victim) || (g_esMedicCache[victim].g_iRequiresHumans > 0 && iGetHumanCount() < g_esMedicCache[victim].g_iRequiresHumans) || (!MT_HasAdminAccess(victim) && !bHasAdminAccess(victim, g_esMedicAbility[g_esMedicPlayer[victim].g_iTankTypeRecorded].g_iAccessFlags, g_esMedicPlayer[victim].g_iAccessFlags)) || (bIsSurvivor(attacker) && (MT_IsAdminImmune(attacker, victim) || bIsAdminImmune(attacker, g_esMedicPlayer[victim].g_iTankType, g_esMedicAbility[g_esMedicPlayer[victim].g_iTankTypeRecorded].g_iImmunityFlags, g_esMedicPlayer[attacker].g_iImmunityFlags) || MT_DoesSurvivorHaveRewardType(attacker, MT_REWARD_DAMAGEBOOST))) || (bIsInfected(victim, MT_CHECK_FAKECLIENT) && g_esMedicCache[victim].g_iHumanAbility == 0)) + { + return Plugin_Continue; + } + + damage *= g_esMedicCache[victim].g_flMedicDamageMultiplier; + + int iBit = (hitgroup - 1), iFlag = (1 << iBit); + if (g_esMedicCache[victim].g_iMedicHitGroup & iFlag) + { + return Plugin_Changed; + } + else + { + EmitSoundToAll(SOUND_METAL, victim); + + return Plugin_Handled; + } + } + } + + return Plugin_Continue; +} + #if defined MT_ABILITIES_MAIN2 void vMedicPluginCheck(ArrayList list) #else @@ -605,6 +674,7 @@ public void MT_OnConfigsLoad(int mode) for (int iIndex = MT_GetMinType(); iIndex <= MT_GetMaxType(); iIndex++) { g_esMedicAbility[iIndex].g_iAccessFlags = 0; + g_esMedicAbility[iIndex].g_iImmunityFlags = 0; g_esMedicAbility[iIndex].g_flCloseAreasOnly = 0.0; g_esMedicAbility[iIndex].g_iComboAbility = 0; g_esMedicAbility[iIndex].g_iComboPosition = -1; @@ -623,12 +693,14 @@ public void MT_OnConfigsLoad(int mode) g_esMedicAbility[iIndex].g_flMedicBuffSpeed = 1.25; g_esMedicAbility[iIndex].g_flMedicChance = 33.3; g_esMedicAbility[iIndex].g_iMedicCooldown = 0; + g_esMedicAbility[iIndex].g_flMedicDamageMultiplier = 1.5; g_esMedicAbility[iIndex].g_iMedicDuration = 0; g_esMedicAbility[iIndex].g_iMedicField = 1; g_esMedicAbility[iIndex].g_iMedicFieldColor[0] = 0; g_esMedicAbility[iIndex].g_iMedicFieldColor[1] = 255; g_esMedicAbility[iIndex].g_iMedicFieldColor[2] = 0; g_esMedicAbility[iIndex].g_iMedicFieldColor[3] = 255; + g_esMedicAbility[iIndex].g_iMedicHitGroup = 0; g_esMedicAbility[iIndex].g_flMedicInterval = 5.0; g_esMedicAbility[iIndex].g_iMedicMaxHealth[0] = 250; g_esMedicAbility[iIndex].g_iMedicMaxHealth[1] = 50; @@ -666,12 +738,14 @@ public void MT_OnConfigsLoad(int mode) g_esMedicSpecial[iIndex].g_flMedicBuffSpeed = -1.0; g_esMedicSpecial[iIndex].g_flMedicChance = -1.0; g_esMedicSpecial[iIndex].g_iMedicCooldown = -1; + g_esMedicSpecial[iIndex].g_flMedicDamageMultiplier = -1.0; g_esMedicSpecial[iIndex].g_iMedicDuration = -1; g_esMedicSpecial[iIndex].g_iMedicField = -1; g_esMedicSpecial[iIndex].g_iMedicFieldColor[0] = -1; g_esMedicSpecial[iIndex].g_iMedicFieldColor[1] = -1; g_esMedicSpecial[iIndex].g_iMedicFieldColor[2] = -1; g_esMedicSpecial[iIndex].g_iMedicFieldColor[3] = -1; + g_esMedicSpecial[iIndex].g_iMedicHitGroup = -1; g_esMedicSpecial[iIndex].g_flMedicInterval = -1.0; g_esMedicSpecial[iIndex].g_iMedicMaxHealth[0] = -1; g_esMedicSpecial[iIndex].g_iMedicMaxHealth[1] = -1; @@ -698,6 +772,7 @@ public void MT_OnConfigsLoad(int mode) for (int iPlayer = 1; iPlayer <= MaxClients; iPlayer++) { g_esMedicPlayer[iPlayer].g_iAccessFlags = -1; + g_esMedicPlayer[iPlayer].g_iImmunityFlags = -1; g_esMedicPlayer[iPlayer].g_flCloseAreasOnly = -1.0; g_esMedicPlayer[iPlayer].g_iComboAbility = -1; g_esMedicPlayer[iPlayer].g_iHumanAbility = -1; @@ -715,9 +790,11 @@ public void MT_OnConfigsLoad(int mode) g_esMedicPlayer[iPlayer].g_flMedicBuffSpeed = -1.0; g_esMedicPlayer[iPlayer].g_flMedicChance = -1.0; g_esMedicPlayer[iPlayer].g_iMedicCooldown = -1; + g_esMedicPlayer[iPlayer].g_flMedicDamageMultiplier = -1.0; g_esMedicPlayer[iPlayer].g_iMedicDuration = -1; g_esMedicPlayer[iPlayer].g_iMedicField = -1; g_esMedicPlayer[iPlayer].g_iMedicFieldColor[3] = 255; + g_esMedicPlayer[iPlayer].g_iMedicHitGroup = -1; g_esMedicPlayer[iPlayer].g_flMedicInterval = -1.0; g_esMedicPlayer[iPlayer].g_flMedicRange = -1.0; g_esMedicPlayer[iPlayer].g_iMedicRockBreak = -1; @@ -754,9 +831,11 @@ public void MT_OnConfigsLoad(int mode) g_esMedicTeammate[iPlayer].g_flMedicBuffSpeed = -1.0; g_esMedicTeammate[iPlayer].g_flMedicChance = -1.0; g_esMedicTeammate[iPlayer].g_iMedicCooldown = -1; + g_esMedicTeammate[iPlayer].g_flMedicDamageMultiplier = -1.0; g_esMedicTeammate[iPlayer].g_iMedicDuration = -1; g_esMedicTeammate[iPlayer].g_iMedicField = -1; g_esMedicTeammate[iPlayer].g_iMedicFieldColor[3] = 255; + g_esMedicTeammate[iPlayer].g_iMedicHitGroup = -1; g_esMedicTeammate[iPlayer].g_flMedicInterval = -1.0; g_esMedicTeammate[iPlayer].g_flMedicRange = -1.0; g_esMedicTeammate[iPlayer].g_iMedicRockBreak = -1; @@ -796,7 +875,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esMedicTeammate[admin].g_iHumanAmmo = iGetKeyValue(subsection, MT_MEDIC_SECTION, MT_MEDIC_SECTION2, MT_MEDIC_SECTION3, MT_MEDIC_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esMedicTeammate[admin].g_iHumanAmmo, value, -1, 99999); g_esMedicTeammate[admin].g_iHumanCooldown = iGetKeyValue(subsection, MT_MEDIC_SECTION, MT_MEDIC_SECTION2, MT_MEDIC_SECTION3, MT_MEDIC_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esMedicTeammate[admin].g_iHumanCooldown, value, -1, 99999); g_esMedicTeammate[admin].g_iHumanDuration = iGetKeyValue(subsection, MT_MEDIC_SECTION, MT_MEDIC_SECTION2, MT_MEDIC_SECTION3, MT_MEDIC_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esMedicTeammate[admin].g_iHumanDuration, value, -1, 99999); - g_esMedicTeammate[admin].g_iHumanMode = iGetKeyValue(subsection, MT_MEDIC_SECTION, MT_MEDIC_SECTION2, MT_MEDIC_SECTION3, MT_MEDIC_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esMedicTeammate[admin].g_iHumanMode, value, -1, 1); + g_esMedicTeammate[admin].g_iHumanMode = iGetKeyValue(subsection, MT_MEDIC_SECTION, MT_MEDIC_SECTION2, MT_MEDIC_SECTION3, MT_MEDIC_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esMedicTeammate[admin].g_iHumanMode, value, -1, 2); g_esMedicTeammate[admin].g_iHumanRockCooldown = iGetKeyValue(subsection, MT_MEDIC_SECTION, MT_MEDIC_SECTION2, MT_MEDIC_SECTION3, MT_MEDIC_SECTION4, key, "HumanRockCooldown", "Human Rock Cooldown", "Human_Rock_Cooldown", "hrockcooldown", g_esMedicTeammate[admin].g_iHumanRockCooldown, value, -1, 99999); g_esMedicTeammate[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_MEDIC_SECTION, MT_MEDIC_SECTION2, MT_MEDIC_SECTION3, MT_MEDIC_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esMedicTeammate[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); g_esMedicTeammate[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_MEDIC_SECTION, MT_MEDIC_SECTION2, MT_MEDIC_SECTION3, MT_MEDIC_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esMedicTeammate[admin].g_iRequiresHumans, value, -1, 32); @@ -808,8 +887,10 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esMedicTeammate[admin].g_flMedicBuffSpeed = flGetKeyValue(subsection, MT_MEDIC_SECTION, MT_MEDIC_SECTION2, MT_MEDIC_SECTION3, MT_MEDIC_SECTION4, key, "MedicBuffSpeed", "Medic Buff Speed", "Medic_Buff_Speed", "buffspeed", g_esMedicTeammate[admin].g_flMedicBuffSpeed, value, -1.0, 10.0); g_esMedicTeammate[admin].g_flMedicChance = flGetKeyValue(subsection, MT_MEDIC_SECTION, MT_MEDIC_SECTION2, MT_MEDIC_SECTION3, MT_MEDIC_SECTION4, key, "MedicChance", "Medic Chance", "Medic_Chance", "chance", g_esMedicTeammate[admin].g_flMedicChance, value, -1.0, 100.0); g_esMedicTeammate[admin].g_iMedicCooldown = iGetKeyValue(subsection, MT_MEDIC_SECTION, MT_MEDIC_SECTION2, MT_MEDIC_SECTION3, MT_MEDIC_SECTION4, key, "MedicCooldown", "Medic Cooldown", "Medic_Cooldown", "cooldown", g_esMedicTeammate[admin].g_iMedicCooldown, value, -1, 99999); + g_esMedicTeammate[admin].g_flMedicDamageMultiplier = flGetKeyValue(subsection, MT_MEDIC_SECTION, MT_MEDIC_SECTION2, MT_MEDIC_SECTION3, MT_MEDIC_SECTION4, key, "MedicDamageMultiplier", "Medic Damage Multiplier", "Medic_Damage_Multiplier", "dmgmulti", g_esMedicTeammate[admin].g_flMedicDamageMultiplier, value, -1.0, 99999.0); g_esMedicTeammate[admin].g_iMedicDuration = iGetKeyValue(subsection, MT_MEDIC_SECTION, MT_MEDIC_SECTION2, MT_MEDIC_SECTION3, MT_MEDIC_SECTION4, key, "MedicDuration", "Medic Duration", "Medic_Duration", "duration", g_esMedicTeammate[admin].g_iMedicDuration, value, -1, 99999); g_esMedicTeammate[admin].g_iMedicField = iGetKeyValue(subsection, MT_MEDIC_SECTION, MT_MEDIC_SECTION2, MT_MEDIC_SECTION3, MT_MEDIC_SECTION4, key, "MedicField", "Medic Field", "Medic_Field", "field", g_esMedicTeammate[admin].g_iMedicField, value, -1, 1); + g_esMedicTeammate[admin].g_iMedicHitGroup = iGetKeyValue(subsection, MT_MEDIC_SECTION, MT_MEDIC_SECTION2, MT_MEDIC_SECTION3, MT_MEDIC_SECTION4, key, "MedicHitGroup", "Medic Hit Group", "Medic_Hit_Group", "hitgroup", g_esMedicTeammate[admin].g_iMedicHitGroup, value, -1, 127); g_esMedicTeammate[admin].g_flMedicInterval = flGetKeyValue(subsection, MT_MEDIC_SECTION, MT_MEDIC_SECTION2, MT_MEDIC_SECTION3, MT_MEDIC_SECTION4, key, "MedicInterval", "Medic Interval", "Medic_Interval", "interval", g_esMedicTeammate[admin].g_flMedicInterval, value, -1.0, 99999.0); g_esMedicTeammate[admin].g_flMedicRange = flGetKeyValue(subsection, MT_MEDIC_SECTION, MT_MEDIC_SECTION2, MT_MEDIC_SECTION3, MT_MEDIC_SECTION4, key, "MedicRange", "Medic Range", "Medic_Range", "range", g_esMedicTeammate[admin].g_flMedicRange, value, -1.0, 99999.0); g_esMedicTeammate[admin].g_iMedicRockBreak = iGetKeyValue(subsection, MT_MEDIC_SECTION, MT_MEDIC_SECTION2, MT_MEDIC_SECTION3, MT_MEDIC_SECTION4, key, "MedicPin", "Medic Pin", "Medic_Pin", "pin", g_esMedicTeammate[admin].g_iMedicRockBreak, value, -1, 1); @@ -825,7 +906,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esMedicPlayer[admin].g_iHumanAmmo = iGetKeyValue(subsection, MT_MEDIC_SECTION, MT_MEDIC_SECTION2, MT_MEDIC_SECTION3, MT_MEDIC_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esMedicPlayer[admin].g_iHumanAmmo, value, -1, 99999); g_esMedicPlayer[admin].g_iHumanCooldown = iGetKeyValue(subsection, MT_MEDIC_SECTION, MT_MEDIC_SECTION2, MT_MEDIC_SECTION3, MT_MEDIC_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esMedicPlayer[admin].g_iHumanCooldown, value, -1, 99999); g_esMedicPlayer[admin].g_iHumanDuration = iGetKeyValue(subsection, MT_MEDIC_SECTION, MT_MEDIC_SECTION2, MT_MEDIC_SECTION3, MT_MEDIC_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esMedicPlayer[admin].g_iHumanDuration, value, -1, 99999); - g_esMedicPlayer[admin].g_iHumanMode = iGetKeyValue(subsection, MT_MEDIC_SECTION, MT_MEDIC_SECTION2, MT_MEDIC_SECTION3, MT_MEDIC_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esMedicPlayer[admin].g_iHumanMode, value, -1, 1); + g_esMedicPlayer[admin].g_iHumanMode = iGetKeyValue(subsection, MT_MEDIC_SECTION, MT_MEDIC_SECTION2, MT_MEDIC_SECTION3, MT_MEDIC_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esMedicPlayer[admin].g_iHumanMode, value, -1, 2); g_esMedicPlayer[admin].g_iHumanRockCooldown = iGetKeyValue(subsection, MT_MEDIC_SECTION, MT_MEDIC_SECTION2, MT_MEDIC_SECTION3, MT_MEDIC_SECTION4, key, "HumanRockCooldown", "Human Rock Cooldown", "Human_Rock_Cooldown", "hrockcooldown", g_esMedicPlayer[admin].g_iHumanRockCooldown, value, -1, 99999); g_esMedicPlayer[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_MEDIC_SECTION, MT_MEDIC_SECTION2, MT_MEDIC_SECTION3, MT_MEDIC_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esMedicPlayer[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); g_esMedicPlayer[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_MEDIC_SECTION, MT_MEDIC_SECTION2, MT_MEDIC_SECTION3, MT_MEDIC_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esMedicPlayer[admin].g_iRequiresHumans, value, -1, 32); @@ -837,8 +918,10 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esMedicPlayer[admin].g_flMedicBuffSpeed = flGetKeyValue(subsection, MT_MEDIC_SECTION, MT_MEDIC_SECTION2, MT_MEDIC_SECTION3, MT_MEDIC_SECTION4, key, "MedicBuffSpeed", "Medic Buff Speed", "Medic_Buff_Speed", "buffspeed", g_esMedicPlayer[admin].g_flMedicBuffSpeed, value, -1.0, 10.0); g_esMedicPlayer[admin].g_flMedicChance = flGetKeyValue(subsection, MT_MEDIC_SECTION, MT_MEDIC_SECTION2, MT_MEDIC_SECTION3, MT_MEDIC_SECTION4, key, "MedicChance", "Medic Chance", "Medic_Chance", "chance", g_esMedicPlayer[admin].g_flMedicChance, value, -1.0, 100.0); g_esMedicPlayer[admin].g_iMedicCooldown = iGetKeyValue(subsection, MT_MEDIC_SECTION, MT_MEDIC_SECTION2, MT_MEDIC_SECTION3, MT_MEDIC_SECTION4, key, "MedicCooldown", "Medic Cooldown", "Medic_Cooldown", "cooldown", g_esMedicPlayer[admin].g_iMedicCooldown, value, -1, 99999); + g_esMedicPlayer[admin].g_flMedicDamageMultiplier = flGetKeyValue(subsection, MT_MEDIC_SECTION, MT_MEDIC_SECTION2, MT_MEDIC_SECTION3, MT_MEDIC_SECTION4, key, "MedicDamageMultiplier", "Medic Damage Multiplier", "Medic_Damage_Multiplier", "dmgmulti", g_esMedicPlayer[admin].g_flMedicDamageMultiplier, value, -1.0, 99999.0); g_esMedicPlayer[admin].g_iMedicDuration = iGetKeyValue(subsection, MT_MEDIC_SECTION, MT_MEDIC_SECTION2, MT_MEDIC_SECTION3, MT_MEDIC_SECTION4, key, "MedicDuration", "Medic Duration", "Medic_Duration", "duration", g_esMedicPlayer[admin].g_iMedicDuration, value, -1, 99999); g_esMedicPlayer[admin].g_iMedicField = iGetKeyValue(subsection, MT_MEDIC_SECTION, MT_MEDIC_SECTION2, MT_MEDIC_SECTION3, MT_MEDIC_SECTION4, key, "MedicField", "Medic Field", "Medic_Field", "field", g_esMedicPlayer[admin].g_iMedicField, value, -1, 1); + g_esMedicPlayer[admin].g_iMedicHitGroup = iGetKeyValue(subsection, MT_MEDIC_SECTION, MT_MEDIC_SECTION2, MT_MEDIC_SECTION3, MT_MEDIC_SECTION4, key, "MedicHitGroup", "Medic Hit Group", "Medic_Hit_Group", "hitgroup", g_esMedicPlayer[admin].g_iMedicHitGroup, value, -1, 127); g_esMedicPlayer[admin].g_flMedicInterval = flGetKeyValue(subsection, MT_MEDIC_SECTION, MT_MEDIC_SECTION2, MT_MEDIC_SECTION3, MT_MEDIC_SECTION4, key, "MedicInterval", "Medic Interval", "Medic_Interval", "interval", g_esMedicPlayer[admin].g_flMedicInterval, value, -1.0, 99999.0); g_esMedicPlayer[admin].g_flMedicRange = flGetKeyValue(subsection, MT_MEDIC_SECTION, MT_MEDIC_SECTION2, MT_MEDIC_SECTION3, MT_MEDIC_SECTION4, key, "MedicRange", "Medic Range", "Medic_Range", "range", g_esMedicPlayer[admin].g_flMedicRange, value, -1.0, 99999.0); g_esMedicPlayer[admin].g_iMedicRockBreak = iGetKeyValue(subsection, MT_MEDIC_SECTION, MT_MEDIC_SECTION2, MT_MEDIC_SECTION3, MT_MEDIC_SECTION4, key, "MedicRockBreak", "Medic Rock Break", "Medic_Rock_Break", "rock", g_esMedicPlayer[admin].g_iMedicRockBreak, value, -1, 1); @@ -846,6 +929,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esMedicPlayer[admin].g_iMedicRockCooldown = iGetKeyValue(subsection, MT_MEDIC_SECTION, MT_MEDIC_SECTION2, MT_MEDIC_SECTION3, MT_MEDIC_SECTION4, key, "MedicRockCooldown", "Medic Rock Cooldown", "Medic_Rock_Cooldown", "rockcooldown", g_esMedicPlayer[admin].g_iMedicRockCooldown, value, -1, 99999); g_esMedicPlayer[admin].g_iMedicSymbiosis = iGetKeyValue(subsection, MT_MEDIC_SECTION, MT_MEDIC_SECTION2, MT_MEDIC_SECTION3, MT_MEDIC_SECTION4, key, "MedicSymbiosis", "Medic Symbiosis", "Medic_Symbiosis", "symbiosis", g_esMedicPlayer[admin].g_iMedicSymbiosis, value, -1, 1); g_esMedicPlayer[admin].g_iAccessFlags = iGetAdminFlagsValue(subsection, MT_MEDIC_SECTION, MT_MEDIC_SECTION2, MT_MEDIC_SECTION3, MT_MEDIC_SECTION4, key, "AccessFlags", "Access Flags", "Access_Flags", "access", value); + g_esMedicPlayer[admin].g_iImmunityFlags = iGetAdminFlagsValue(subsection, MT_MEDIC_SECTION, MT_MEDIC_SECTION2, MT_MEDIC_SECTION3, MT_MEDIC_SECTION4, key, "ImmunityFlags", "Immunity Flags", "Immunity_Flags", "immunity", value); } if (StrEqual(subsection, MT_MEDIC_SECTION, false) || StrEqual(subsection, MT_MEDIC_SECTION2, false) || StrEqual(subsection, MT_MEDIC_SECTION3, false) || StrEqual(subsection, MT_MEDIC_SECTION4, false)) @@ -904,7 +988,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esMedicSpecial[type].g_iHumanAmmo = iGetKeyValue(subsection, MT_MEDIC_SECTION, MT_MEDIC_SECTION2, MT_MEDIC_SECTION3, MT_MEDIC_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esMedicSpecial[type].g_iHumanAmmo, value, -1, 99999); g_esMedicSpecial[type].g_iHumanCooldown = iGetKeyValue(subsection, MT_MEDIC_SECTION, MT_MEDIC_SECTION2, MT_MEDIC_SECTION3, MT_MEDIC_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esMedicSpecial[type].g_iHumanCooldown, value, -1, 99999); g_esMedicSpecial[type].g_iHumanDuration = iGetKeyValue(subsection, MT_MEDIC_SECTION, MT_MEDIC_SECTION2, MT_MEDIC_SECTION3, MT_MEDIC_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esMedicSpecial[type].g_iHumanDuration, value, -1, 99999); - g_esMedicSpecial[type].g_iHumanMode = iGetKeyValue(subsection, MT_MEDIC_SECTION, MT_MEDIC_SECTION2, MT_MEDIC_SECTION3, MT_MEDIC_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esMedicSpecial[type].g_iHumanMode, value, -1, 1); + g_esMedicSpecial[type].g_iHumanMode = iGetKeyValue(subsection, MT_MEDIC_SECTION, MT_MEDIC_SECTION2, MT_MEDIC_SECTION3, MT_MEDIC_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esMedicSpecial[type].g_iHumanMode, value, -1, 2); g_esMedicSpecial[type].g_iHumanRockCooldown = iGetKeyValue(subsection, MT_MEDIC_SECTION, MT_MEDIC_SECTION2, MT_MEDIC_SECTION3, MT_MEDIC_SECTION4, key, "HumanRockCooldown", "Human Rock Cooldown", "Human_Rock_Cooldown", "hrockcooldown", g_esMedicSpecial[type].g_iHumanRockCooldown, value, -1, 99999); g_esMedicSpecial[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_MEDIC_SECTION, MT_MEDIC_SECTION2, MT_MEDIC_SECTION3, MT_MEDIC_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esMedicSpecial[type].g_flOpenAreasOnly, value, -1.0, 99999.0); g_esMedicSpecial[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_MEDIC_SECTION, MT_MEDIC_SECTION2, MT_MEDIC_SECTION3, MT_MEDIC_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esMedicSpecial[type].g_iRequiresHumans, value, -1, 32); @@ -916,8 +1000,10 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esMedicSpecial[type].g_flMedicBuffSpeed = flGetKeyValue(subsection, MT_MEDIC_SECTION, MT_MEDIC_SECTION2, MT_MEDIC_SECTION3, MT_MEDIC_SECTION4, key, "MedicBuffSpeed", "Medic Buff Speed", "Medic_Buff_Speed", "buffspeed", g_esMedicSpecial[type].g_flMedicBuffSpeed, value, -1.0, 10.0); g_esMedicSpecial[type].g_flMedicChance = flGetKeyValue(subsection, MT_MEDIC_SECTION, MT_MEDIC_SECTION2, MT_MEDIC_SECTION3, MT_MEDIC_SECTION4, key, "MedicChance", "Medic Chance", "Medic_Chance", "chance", g_esMedicSpecial[type].g_flMedicChance, value, -1.0, 100.0); g_esMedicSpecial[type].g_iMedicCooldown = iGetKeyValue(subsection, MT_MEDIC_SECTION, MT_MEDIC_SECTION2, MT_MEDIC_SECTION3, MT_MEDIC_SECTION4, key, "MedicCooldown", "Medic Cooldown", "Medic_Cooldown", "cooldown", g_esMedicSpecial[type].g_iMedicCooldown, value, -1, 99999); + g_esMedicSpecial[type].g_flMedicDamageMultiplier = flGetKeyValue(subsection, MT_MEDIC_SECTION, MT_MEDIC_SECTION2, MT_MEDIC_SECTION3, MT_MEDIC_SECTION4, key, "MedicDamageMultiplier", "Medic Damage Multiplier", "Medic_Damage_Multiplier", "dmgmulti", g_esMedicSpecial[type].g_flMedicDamageMultiplier, value, -1.0, 99999.0); g_esMedicSpecial[type].g_iMedicDuration = iGetKeyValue(subsection, MT_MEDIC_SECTION, MT_MEDIC_SECTION2, MT_MEDIC_SECTION3, MT_MEDIC_SECTION4, key, "MedicDuration", "Medic Duration", "Medic_Duration", "duration", g_esMedicSpecial[type].g_iMedicDuration, value, -1, 99999); g_esMedicSpecial[type].g_iMedicField = iGetKeyValue(subsection, MT_MEDIC_SECTION, MT_MEDIC_SECTION2, MT_MEDIC_SECTION3, MT_MEDIC_SECTION4, key, "MedicField", "Medic Field", "Medic_Field", "field", g_esMedicSpecial[type].g_iMedicField, value, -1, 1); + g_esMedicSpecial[type].g_iMedicHitGroup = iGetKeyValue(subsection, MT_MEDIC_SECTION, MT_MEDIC_SECTION2, MT_MEDIC_SECTION3, MT_MEDIC_SECTION4, key, "MedicHitGroup", "Medic Hit Group", "Medic_Hit_Group", "hitgroup", g_esMedicSpecial[type].g_iMedicHitGroup, value, -1, 127); g_esMedicSpecial[type].g_flMedicInterval = flGetKeyValue(subsection, MT_MEDIC_SECTION, MT_MEDIC_SECTION2, MT_MEDIC_SECTION3, MT_MEDIC_SECTION4, key, "MedicInterval", "Medic Interval", "Medic_Interval", "interval", g_esMedicSpecial[type].g_flMedicInterval, value, -1.0, 99999.0); g_esMedicSpecial[type].g_flMedicRange = flGetKeyValue(subsection, MT_MEDIC_SECTION, MT_MEDIC_SECTION2, MT_MEDIC_SECTION3, MT_MEDIC_SECTION4, key, "MedicRange", "Medic Range", "Medic_Range", "range", g_esMedicSpecial[type].g_flMedicRange, value, -1.0, 99999.0); g_esMedicSpecial[type].g_iMedicRockBreak = iGetKeyValue(subsection, MT_MEDIC_SECTION, MT_MEDIC_SECTION2, MT_MEDIC_SECTION3, MT_MEDIC_SECTION4, key, "MedicPin", "Medic Pin", "Medic_Pin", "pin", g_esMedicSpecial[type].g_iMedicRockBreak, value, -1, 1); @@ -933,7 +1019,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esMedicAbility[type].g_iHumanAmmo = iGetKeyValue(subsection, MT_MEDIC_SECTION, MT_MEDIC_SECTION2, MT_MEDIC_SECTION3, MT_MEDIC_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esMedicAbility[type].g_iHumanAmmo, value, -1, 99999); g_esMedicAbility[type].g_iHumanCooldown = iGetKeyValue(subsection, MT_MEDIC_SECTION, MT_MEDIC_SECTION2, MT_MEDIC_SECTION3, MT_MEDIC_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esMedicAbility[type].g_iHumanCooldown, value, -1, 99999); g_esMedicAbility[type].g_iHumanDuration = iGetKeyValue(subsection, MT_MEDIC_SECTION, MT_MEDIC_SECTION2, MT_MEDIC_SECTION3, MT_MEDIC_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esMedicAbility[type].g_iHumanDuration, value, -1, 99999); - g_esMedicAbility[type].g_iHumanMode = iGetKeyValue(subsection, MT_MEDIC_SECTION, MT_MEDIC_SECTION2, MT_MEDIC_SECTION3, MT_MEDIC_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esMedicAbility[type].g_iHumanMode, value, -1, 1); + g_esMedicAbility[type].g_iHumanMode = iGetKeyValue(subsection, MT_MEDIC_SECTION, MT_MEDIC_SECTION2, MT_MEDIC_SECTION3, MT_MEDIC_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esMedicAbility[type].g_iHumanMode, value, -1, 2); g_esMedicAbility[type].g_iHumanRockCooldown = iGetKeyValue(subsection, MT_MEDIC_SECTION, MT_MEDIC_SECTION2, MT_MEDIC_SECTION3, MT_MEDIC_SECTION4, key, "HumanRockCooldown", "Human Rock Cooldown", "Human_Rock_Cooldown", "hrockcooldown", g_esMedicAbility[type].g_iHumanRockCooldown, value, -1, 99999); g_esMedicAbility[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_MEDIC_SECTION, MT_MEDIC_SECTION2, MT_MEDIC_SECTION3, MT_MEDIC_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esMedicAbility[type].g_flOpenAreasOnly, value, -1.0, 99999.0); g_esMedicAbility[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_MEDIC_SECTION, MT_MEDIC_SECTION2, MT_MEDIC_SECTION3, MT_MEDIC_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esMedicAbility[type].g_iRequiresHumans, value, -1, 32); @@ -945,8 +1031,10 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esMedicAbility[type].g_flMedicBuffSpeed = flGetKeyValue(subsection, MT_MEDIC_SECTION, MT_MEDIC_SECTION2, MT_MEDIC_SECTION3, MT_MEDIC_SECTION4, key, "MedicBuffSpeed", "Medic Buff Speed", "Medic_Buff_Speed", "buffspeed", g_esMedicAbility[type].g_flMedicBuffSpeed, value, -1.0, 10.0); g_esMedicAbility[type].g_flMedicChance = flGetKeyValue(subsection, MT_MEDIC_SECTION, MT_MEDIC_SECTION2, MT_MEDIC_SECTION3, MT_MEDIC_SECTION4, key, "MedicChance", "Medic Chance", "Medic_Chance", "chance", g_esMedicAbility[type].g_flMedicChance, value, -1.0, 100.0); g_esMedicAbility[type].g_iMedicCooldown = iGetKeyValue(subsection, MT_MEDIC_SECTION, MT_MEDIC_SECTION2, MT_MEDIC_SECTION3, MT_MEDIC_SECTION4, key, "MedicCooldown", "Medic Cooldown", "Medic_Cooldown", "cooldown", g_esMedicAbility[type].g_iMedicCooldown, value, -1, 99999); + g_esMedicAbility[type].g_flMedicDamageMultiplier = flGetKeyValue(subsection, MT_MEDIC_SECTION, MT_MEDIC_SECTION2, MT_MEDIC_SECTION3, MT_MEDIC_SECTION4, key, "MedicDamageMultiplier", "Medic Damage Multiplier", "Medic_Damage_Multiplier", "dmgmulti", g_esMedicAbility[type].g_flMedicDamageMultiplier, value, -1.0, 99999.0); g_esMedicAbility[type].g_iMedicDuration = iGetKeyValue(subsection, MT_MEDIC_SECTION, MT_MEDIC_SECTION2, MT_MEDIC_SECTION3, MT_MEDIC_SECTION4, key, "MedicDuration", "Medic Duration", "Medic_Duration", "duration", g_esMedicAbility[type].g_iMedicDuration, value, -1, 99999); g_esMedicAbility[type].g_iMedicField = iGetKeyValue(subsection, MT_MEDIC_SECTION, MT_MEDIC_SECTION2, MT_MEDIC_SECTION3, MT_MEDIC_SECTION4, key, "MedicField", "Medic Field", "Medic_Field", "field", g_esMedicAbility[type].g_iMedicField, value, -1, 1); + g_esMedicAbility[type].g_iMedicHitGroup = iGetKeyValue(subsection, MT_MEDIC_SECTION, MT_MEDIC_SECTION2, MT_MEDIC_SECTION3, MT_MEDIC_SECTION4, key, "MedicHitGroup", "Medic Hit Group", "Medic_Hit_Group", "hitgroup", g_esMedicAbility[type].g_iMedicHitGroup, value, -1, 127); g_esMedicAbility[type].g_flMedicInterval = flGetKeyValue(subsection, MT_MEDIC_SECTION, MT_MEDIC_SECTION2, MT_MEDIC_SECTION3, MT_MEDIC_SECTION4, key, "MedicInterval", "Medic Interval", "Medic_Interval", "interval", g_esMedicAbility[type].g_flMedicInterval, value, -1.0, 99999.0); g_esMedicAbility[type].g_flMedicRange = flGetKeyValue(subsection, MT_MEDIC_SECTION, MT_MEDIC_SECTION2, MT_MEDIC_SECTION3, MT_MEDIC_SECTION4, key, "MedicRange", "Medic Range", "Medic_Range", "range", g_esMedicAbility[type].g_flMedicRange, value, -1.0, 99999.0); g_esMedicAbility[type].g_iMedicRockBreak = iGetKeyValue(subsection, MT_MEDIC_SECTION, MT_MEDIC_SECTION2, MT_MEDIC_SECTION3, MT_MEDIC_SECTION4, key, "MedicRockBreak", "Medic Rock Break", "Medic_Rock_Break", "rock", g_esMedicAbility[type].g_iMedicRockBreak, value, -1, 1); @@ -954,6 +1042,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esMedicAbility[type].g_iMedicRockCooldown = iGetKeyValue(subsection, MT_MEDIC_SECTION, MT_MEDIC_SECTION2, MT_MEDIC_SECTION3, MT_MEDIC_SECTION4, key, "MedicRockCooldown", "Medic Rock Cooldown", "Medic_Rock_Cooldown", "rockcooldown", g_esMedicAbility[type].g_iMedicRockCooldown, value, -1, 99999); g_esMedicAbility[type].g_iMedicSymbiosis = iGetKeyValue(subsection, MT_MEDIC_SECTION, MT_MEDIC_SECTION2, MT_MEDIC_SECTION3, MT_MEDIC_SECTION4, key, "MedicSymbiosis", "Medic Symbiosis", "Medic_Symbiosis", "symbiosis", g_esMedicAbility[type].g_iMedicSymbiosis, value, -1, 1); g_esMedicAbility[type].g_iAccessFlags = iGetAdminFlagsValue(subsection, MT_MEDIC_SECTION, MT_MEDIC_SECTION2, MT_MEDIC_SECTION3, MT_MEDIC_SECTION4, key, "AccessFlags", "Access Flags", "Access_Flags", "access", value); + g_esMedicAbility[type].g_iImmunityFlags = iGetAdminFlagsValue(subsection, MT_MEDIC_SECTION, MT_MEDIC_SECTION2, MT_MEDIC_SECTION3, MT_MEDIC_SECTION4, key, "ImmunityFlags", "Immunity Flags", "Immunity_Flags", "immunity", value); } if (StrEqual(subsection, MT_MEDIC_SECTION, false) || StrEqual(subsection, MT_MEDIC_SECTION2, false) || StrEqual(subsection, MT_MEDIC_SECTION3, false) || StrEqual(subsection, MT_MEDIC_SECTION4, false)) @@ -1013,7 +1102,9 @@ public void MT_OnSettingsCached(int tank, bool apply, int type) g_esMedicPlayer[tank].g_iTankTypeRecorded = apply ? MT_GetRecordedTankType(tank, type) : 0; g_esMedicPlayer[tank].g_iTankType = apply ? type : 0; int iType = g_esMedicPlayer[tank].g_iTankTypeRecorded; - +#if !defined MT_ABILITIES_MAIN2 + g_iGraphicsLevel = MT_GetGraphicsLevel(); +#endif if (bInfected) { g_esMedicCache[tank].g_flCloseAreasOnly = flGetSubSettingValue(apply, bHuman, g_esMedicTeammate[tank].g_flCloseAreasOnly, g_esMedicPlayer[tank].g_flCloseAreasOnly, g_esMedicSpecial[iType].g_flCloseAreasOnly, g_esMedicAbility[iType].g_flCloseAreasOnly, 1); @@ -1022,6 +1113,7 @@ public void MT_OnSettingsCached(int tank, bool apply, int type) g_esMedicCache[tank].g_flMedicBuffResistance = flGetSubSettingValue(apply, bHuman, g_esMedicTeammate[tank].g_flMedicBuffResistance, g_esMedicPlayer[tank].g_flMedicBuffResistance, g_esMedicSpecial[iType].g_flMedicBuffResistance, g_esMedicAbility[iType].g_flMedicBuffResistance, 1); g_esMedicCache[tank].g_flMedicBuffSpeed = flGetSubSettingValue(apply, bHuman, g_esMedicTeammate[tank].g_flMedicBuffSpeed, g_esMedicPlayer[tank].g_flMedicBuffSpeed, g_esMedicSpecial[iType].g_flMedicBuffSpeed, g_esMedicAbility[iType].g_flMedicBuffSpeed, 1); g_esMedicCache[tank].g_flMedicChance = flGetSubSettingValue(apply, bHuman, g_esMedicTeammate[tank].g_flMedicChance, g_esMedicPlayer[tank].g_flMedicChance, g_esMedicSpecial[iType].g_flMedicChance, g_esMedicAbility[iType].g_flMedicChance, 1); + g_esMedicCache[tank].g_flMedicDamageMultiplier = flGetSubSettingValue(apply, bHuman, g_esMedicTeammate[tank].g_flMedicDamageMultiplier, g_esMedicPlayer[tank].g_flMedicDamageMultiplier, g_esMedicSpecial[iType].g_flMedicDamageMultiplier, g_esMedicAbility[iType].g_flMedicDamageMultiplier, 1); g_esMedicCache[tank].g_flMedicInterval = flGetSubSettingValue(apply, bHuman, g_esMedicTeammate[tank].g_flMedicInterval, g_esMedicPlayer[tank].g_flMedicInterval, g_esMedicSpecial[iType].g_flMedicInterval, g_esMedicAbility[iType].g_flMedicInterval, 1); g_esMedicCache[tank].g_flMedicRange = flGetSubSettingValue(apply, bHuman, g_esMedicTeammate[tank].g_flMedicRange, g_esMedicPlayer[tank].g_flMedicRange, g_esMedicSpecial[iType].g_flMedicRange, g_esMedicAbility[iType].g_flMedicRange, 1); g_esMedicCache[tank].g_flMedicRockChance = flGetSubSettingValue(apply, bHuman, g_esMedicTeammate[tank].g_flMedicRockChance, g_esMedicPlayer[tank].g_flMedicRockChance, g_esMedicSpecial[iType].g_flMedicRockChance, g_esMedicAbility[iType].g_flMedicRockChance, 1); @@ -1035,6 +1127,7 @@ public void MT_OnSettingsCached(int tank, bool apply, int type) g_esMedicCache[tank].g_iMedicCooldown = iGetSubSettingValue(apply, bHuman, g_esMedicTeammate[tank].g_iMedicCooldown, g_esMedicPlayer[tank].g_iMedicCooldown, g_esMedicSpecial[iType].g_iMedicCooldown, g_esMedicAbility[iType].g_iMedicCooldown, 1); g_esMedicCache[tank].g_iMedicDuration = iGetSubSettingValue(apply, bHuman, g_esMedicTeammate[tank].g_iMedicDuration, g_esMedicPlayer[tank].g_iMedicDuration, g_esMedicSpecial[iType].g_iMedicDuration, g_esMedicAbility[iType].g_iMedicDuration, 1); g_esMedicCache[tank].g_iMedicField = iGetSubSettingValue(apply, bHuman, g_esMedicTeammate[tank].g_iMedicField, g_esMedicPlayer[tank].g_iMedicField, g_esMedicSpecial[iType].g_iMedicField, g_esMedicAbility[iType].g_iMedicField, 1); + g_esMedicCache[tank].g_iMedicHitGroup = iGetSubSettingValue(apply, bHuman, g_esMedicTeammate[tank].g_iMedicHitGroup, g_esMedicPlayer[tank].g_iMedicHitGroup, g_esMedicSpecial[iType].g_iMedicHitGroup, g_esMedicAbility[iType].g_iMedicHitGroup, 1); g_esMedicCache[tank].g_iMedicMessage = iGetSubSettingValue(apply, bHuman, g_esMedicTeammate[tank].g_iMedicMessage, g_esMedicPlayer[tank].g_iMedicMessage, g_esMedicSpecial[iType].g_iMedicMessage, g_esMedicAbility[iType].g_iMedicMessage, 1); g_esMedicCache[tank].g_iMedicRockBreak = iGetSubSettingValue(apply, bHuman, g_esMedicTeammate[tank].g_iMedicRockBreak, g_esMedicPlayer[tank].g_iMedicRockBreak, g_esMedicSpecial[iType].g_iMedicRockBreak, g_esMedicAbility[iType].g_iMedicRockBreak, 1); g_esMedicCache[tank].g_iMedicRockCooldown = iGetSubSettingValue(apply, bHuman, g_esMedicTeammate[tank].g_iMedicRockCooldown, g_esMedicPlayer[tank].g_iMedicRockCooldown, g_esMedicSpecial[iType].g_iMedicRockCooldown, g_esMedicAbility[iType].g_iMedicRockCooldown, 1); @@ -1051,6 +1144,7 @@ public void MT_OnSettingsCached(int tank, bool apply, int type) g_esMedicCache[tank].g_flMedicBuffResistance = flGetSettingValue(apply, bHuman, g_esMedicPlayer[tank].g_flMedicBuffResistance, g_esMedicAbility[iType].g_flMedicBuffResistance, 1); g_esMedicCache[tank].g_flMedicBuffSpeed = flGetSettingValue(apply, bHuman, g_esMedicPlayer[tank].g_flMedicBuffSpeed, g_esMedicAbility[iType].g_flMedicBuffSpeed, 1); g_esMedicCache[tank].g_flMedicChance = flGetSettingValue(apply, bHuman, g_esMedicPlayer[tank].g_flMedicChance, g_esMedicAbility[iType].g_flMedicChance, 1); + g_esMedicCache[tank].g_flMedicDamageMultiplier = flGetSettingValue(apply, bHuman, g_esMedicPlayer[tank].g_flMedicDamageMultiplier, g_esMedicAbility[iType].g_flMedicDamageMultiplier, 1); g_esMedicCache[tank].g_flMedicInterval = flGetSettingValue(apply, bHuman, g_esMedicPlayer[tank].g_flMedicInterval, g_esMedicAbility[iType].g_flMedicInterval, 1); g_esMedicCache[tank].g_flMedicRange = flGetSettingValue(apply, bHuman, g_esMedicPlayer[tank].g_flMedicRange, g_esMedicAbility[iType].g_flMedicRange, 1); g_esMedicCache[tank].g_flMedicRockChance = flGetSettingValue(apply, bHuman, g_esMedicPlayer[tank].g_flMedicRockChance, g_esMedicAbility[iType].g_flMedicRockChance, 1); @@ -1064,6 +1158,7 @@ public void MT_OnSettingsCached(int tank, bool apply, int type) g_esMedicCache[tank].g_iMedicCooldown = iGetSettingValue(apply, bHuman, g_esMedicPlayer[tank].g_iMedicCooldown, g_esMedicAbility[iType].g_iMedicCooldown, 1); g_esMedicCache[tank].g_iMedicDuration = iGetSettingValue(apply, bHuman, g_esMedicPlayer[tank].g_iMedicDuration, g_esMedicAbility[iType].g_iMedicDuration, 1); g_esMedicCache[tank].g_iMedicField = iGetSettingValue(apply, bHuman, g_esMedicPlayer[tank].g_iMedicField, g_esMedicAbility[iType].g_iMedicField, 1); + g_esMedicCache[tank].g_iMedicHitGroup = iGetSettingValue(apply, bHuman, g_esMedicPlayer[tank].g_iMedicHitGroup, g_esMedicAbility[iType].g_iMedicHitGroup, 1); g_esMedicCache[tank].g_iMedicMessage = iGetSettingValue(apply, bHuman, g_esMedicPlayer[tank].g_iMedicMessage, g_esMedicAbility[iType].g_iMedicMessage, 1); g_esMedicCache[tank].g_iMedicRockBreak = iGetSettingValue(apply, bHuman, g_esMedicPlayer[tank].g_iMedicRockBreak, g_esMedicAbility[iType].g_iMedicRockBreak, 1); g_esMedicCache[tank].g_iMedicRockCooldown = iGetSettingValue(apply, bHuman, g_esMedicPlayer[tank].g_iMedicRockCooldown, g_esMedicAbility[iType].g_iMedicRockCooldown, 1); @@ -1190,10 +1285,10 @@ public void MT_OnButtonPressed(int tank, int button) if ((button & MT_MAIN_KEY) && g_esMedicCache[tank].g_iMedicAbility == 1 && g_esMedicCache[tank].g_iHumanAbility == 1) { - int iTime = GetTime(); + int iHumanMode = g_esMedicCache[tank].g_iHumanMode, iTime = GetTime(); bool bRecharging = g_esMedicPlayer[tank].g_iCooldown != -1 && g_esMedicPlayer[tank].g_iCooldown >= iTime; - switch (g_esMedicCache[tank].g_iHumanMode) + switch (iHumanMode) { case 0: { @@ -1210,9 +1305,9 @@ public void MT_OnButtonPressed(int tank, int button) MT_PrintToChat(tank, "%s %t", MT_TAG3, "MedicHuman4", (g_esMedicPlayer[tank].g_iCooldown - iTime)); } } - case 1: + case 1, 2: { - if (g_esMedicPlayer[tank].g_iAmmoCount < g_esMedicCache[tank].g_iHumanAmmo && g_esMedicCache[tank].g_iHumanAmmo > 0) + if ((iHumanMode == 2 && g_esMedicPlayer[tank].g_bActivated) || (g_esMedicPlayer[tank].g_iAmmoCount < g_esMedicCache[tank].g_iHumanAmmo && g_esMedicCache[tank].g_iHumanAmmo > 0)) { if (!g_esMedicPlayer[tank].g_bActivated && !bRecharging) { @@ -1224,7 +1319,15 @@ public void MT_OnButtonPressed(int tank, int button) } else if (g_esMedicPlayer[tank].g_bActivated) { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "MedicHuman3"); + switch (iHumanMode) + { + case 1: MT_PrintToChat(tank, "%s %t", MT_TAG3, "MedicHuman3"); + case 2: + { + vMedicReset2(tank); + vMedicReset3(tank); + } + } } else if (bRecharging) { @@ -1337,7 +1440,7 @@ void vMedic2(int tank, int pos = -1) void vMedic3(int tank, float origin[3], int duration, int pos = -1) { float flRange = (pos != -1) ? MT_GetCombinationSetting(tank, 9, pos) : g_esMedicCache[tank].g_flMedicRange; - if (g_esMedicCache[tank].g_iMedicField == 1) + if (g_esMedicCache[tank].g_iMedicField == 1 && g_iGraphicsLevel > 2) { origin[2] += 10.0; TE_SetupBeamRingPoint(origin, 50.0, flRange, g_iMedicBeamSprite, g_iMedicHaloSprite, 0, 0, 1.0, 3.0, 0.0, iGetRandomColors(tank), 0, 0); @@ -1348,7 +1451,7 @@ void vMedic3(int tank, float origin[3], int duration, int pos = -1) int iCount = 0; for (int iInfected = 1; iInfected <= MaxClients; iInfected++) { - if (((MT_IsTankSupported(iInfected, MT_CHECK_INGAME|MT_CHECK_ALIVE) && !bIsPlayerIncapacitated(iInfected)) || bIsSpecialInfected(iInfected, MT_CHECK_INGAME|MT_CHECK_ALIVE)) && tank != iInfected) + if (((MT_IsTankSupported(iInfected, MT_CHECK_INGAME|MT_CHECK_ALIVE) && !bIsPlayerIncapacitated(iInfected)) || bIsSpecialInfected(iInfected, MT_CHECK_INGAME|MT_CHECK_ALIVE)) && iInfected != tank) { GetClientAbsOrigin(iInfected, flInfectedPos); if (GetVectorDistance(origin, flInfectedPos) <= flRange && bIsVisibleToPlayer(tank, iInfected, g_esMedicCache[tank].g_iMedicSight, .range = flRange)) @@ -1368,17 +1471,12 @@ void vMedic3(int tank, float origin[3], int duration, int pos = -1) void vMedic4(int special, int tank, int duration) { - int iHealth = 0, iValue = 0, iLimit = 0, iMaxHealth = 0, iNewHealth = 0, iLeftover = 0, iExtraHealth = 0, iExtraHealth2 = 0, iRealHealth = 0, iTotalHealth = 0; - iHealth = GetEntProp(special, Prop_Data, "m_iHealth"); - iValue = iGetHealth(tank, special); - iLimit = iGetMaxHealth(tank, special); - iMaxHealth = (special == tank) ? MT_TankMaxHealth(special, 1) : GetEntProp(special, Prop_Data, "m_iMaxHealth"); - iNewHealth = (iHealth + iValue); - iLeftover = (iNewHealth > iLimit) ? (iNewHealth - iLimit) : iNewHealth; - iExtraHealth = iClamp(iNewHealth, 1, iLimit); - iExtraHealth2 = (iNewHealth < iHealth) ? 1 : iNewHealth; - iRealHealth = (iNewHealth >= 0) ? iExtraHealth : iExtraHealth2; - iTotalHealth = (iNewHealth > iLimit) ? iLeftover : iValue; + int iHealth = GetEntProp(special, Prop_Data, "m_iHealth"), iValue = iGetHealth(tank, special), iLimit = iGetMaxHealth(tank, special), + iMaxHealth = (special == tank) ? MT_TankMaxHealth(special, 1) : GetEntProp(special, Prop_Data, "m_iMaxHealth"), + iNewHealth = (iHealth + iValue), iLeftover = (iNewHealth > iLimit) ? (iNewHealth - iLimit) : iNewHealth, + iExtraHealth = iClamp(iNewHealth, 1, iLimit), iExtraHealth2 = (iNewHealth < iHealth) ? 1 : iNewHealth, + iRealHealth = (iNewHealth >= 0) ? iExtraHealth : iExtraHealth2, iTotalHealth = (iNewHealth > iLimit) ? iLeftover : iValue; + SetEntProp(special, Prop_Data, "m_iHealth", iRealHealth); if (special == tank) @@ -1549,7 +1647,7 @@ int iGetHealth(int tank, int infected) case 2: return g_esMedicCache[tank].g_iMedicHealth[iClass - 1]; case 3: return g_esMedicCache[tank].g_iMedicHealth[iClass - 1]; case 4: return g_esMedicCache[tank].g_iMedicHealth[iClass - 1]; - case 5: return g_bSecondGame ? g_esMedicCache[tank].g_iMedicHealth[iClass - 1] : g_esMedicCache[tank].g_iMedicHealth[iClass + 1]; + case 5: return (g_bSecondGame ? g_esMedicCache[tank].g_iMedicHealth[iClass - 1] : g_esMedicCache[tank].g_iMedicHealth[iClass + 1]); case 6: return g_esMedicCache[tank].g_iMedicHealth[iClass - 1]; case 8: return g_esMedicCache[tank].g_iMedicHealth[iClass - 2]; } @@ -1567,7 +1665,7 @@ int iGetMaxHealth(int tank, int infected) case 2: return g_esMedicCache[tank].g_iMedicMaxHealth[iClass - 1]; case 3: return g_esMedicCache[tank].g_iMedicMaxHealth[iClass - 1]; case 4: return g_esMedicCache[tank].g_iMedicMaxHealth[iClass - 1]; - case 5: return g_bSecondGame ? g_esMedicCache[tank].g_iMedicMaxHealth[iClass - 1] : g_esMedicCache[tank].g_iMedicMaxHealth[iClass + 1]; + case 5: return (g_bSecondGame ? g_esMedicCache[tank].g_iMedicMaxHealth[iClass - 1] : g_esMedicCache[tank].g_iMedicMaxHealth[iClass + 1]); case 6: return g_esMedicCache[tank].g_iMedicMaxHealth[iClass - 1]; case 8: return g_esMedicCache[tank].g_iMedicMaxHealth[iClass - 2]; } @@ -1587,18 +1685,20 @@ int[] iGetRandomColors(int tank) return g_esMedicCache[tank].g_iMedicFieldColor; } -void tTimerMedicCombo(Handle timer, DataPack pack) +Action tTimerMedicCombo(Handle timer, DataPack pack) { pack.Reset(); int iTank = GetClientOfUserId(pack.ReadCell()); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esMedicAbility[g_esMedicPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esMedicPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esMedicPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esMedicCache[iTank].g_iMedicAbility == 0 || g_esMedicPlayer[iTank].g_bActivated) { - return; + return Plugin_Stop; } int iPos = pack.ReadCell(); vMedic(iTank, iPos); + + return Plugin_Continue; } Action tTimerMedic(Handle timer, DataPack pack) @@ -1632,14 +1732,14 @@ Action tTimerMedic(Handle timer, DataPack pack) return Plugin_Continue; } -void tTimerRemoveBuffs(Handle timer, int userid) +Action tTimerRemoveBuffs(Handle timer, int userid) { int iInfected = GetClientOfUserId(userid); if (!bIsInfected(iInfected)) { g_esMedicPlayer[iInfected].g_hBuffTimer = null; - return; + return Plugin_Stop; } float flSpeed = bIsInfected(iInfected) ? g_esMedicPlayer[iInfected].g_flDefaultSpeed : 1.0; @@ -1649,4 +1749,6 @@ void tTimerRemoveBuffs(Handle timer, int userid) g_esMedicPlayer[iInfected].g_flDefaultSpeed = 0.0; SetEntPropFloat(iInfected, Prop_Send, "m_flLaggedMovementValue", (g_bLaggedMovementInstalled ? L4D_LaggedMovement(iInfected, flSpeed) : flSpeed)); + + return Plugin_Continue; } \ No newline at end of file diff --git a/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_meteor.sp b/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_meteor.sp index 5d6dd5eda6..732bd4eb90 100644 --- a/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_meteor.sp +++ b/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_meteor.sp @@ -1,6 +1,6 @@ /** - * Mutant Tanks: a L4D/L4D2 SourceMod Plugin - * Copyright (C) 2024 Alfred "Psyk0tik" Llagas + * Mutant Tanks: A L4D/L4D2 SourceMod Plugin + * Copyright (C) 2017-2025 Alfred "Psyk0tik" Llagas * * 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. * @@ -325,7 +325,15 @@ int iMeteorMenuHandler(Menu menu, MenuAction action, int param1, int param2) case 0: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esMeteorCache[param1].g_iMeteorAbility == 0) ? "AbilityStatus1" : "AbilityStatus2"); case 1: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityAmmo", (g_esMeteorCache[param1].g_iHumanAmmo - g_esMeteorPlayer[param1].g_iAmmoCount), g_esMeteorCache[param1].g_iHumanAmmo); case 2: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtons"); - case 3: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esMeteorCache[param1].g_iHumanMode == 0) ? "AbilityButtonMode1" : "AbilityButtonMode2"); + case 3: + { + switch (g_esMeteorCache[param1].g_iHumanMode) + { + case 0: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtonMode1"); + case 1: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtonMode2"); + case 2: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtonMode3"); + } + } case 4: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityCooldown", ((g_esMeteorCache[param1].g_iHumanAbility == 1) ? g_esMeteorCache[param1].g_iHumanCooldown : g_esMeteorCache[param1].g_iMeteorCooldown)); case 5: MT_PrintToChat(param1, "%s %t", MT_TAG3, "MeteorDetails"); case 6: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityDuration2", ((g_esMeteorCache[param1].g_iHumanAbility == 1) ? g_esMeteorCache[param1].g_iHumanDuration : g_esMeteorCache[param1].g_iMeteorDuration)); @@ -667,7 +675,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esMeteorTeammate[admin].g_iHumanAmmo = iGetKeyValue(subsection, MT_METEOR_SECTION, MT_METEOR_SECTION2, MT_METEOR_SECTION3, MT_METEOR_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esMeteorTeammate[admin].g_iHumanAmmo, value, -1, 99999); g_esMeteorTeammate[admin].g_iHumanCooldown = iGetKeyValue(subsection, MT_METEOR_SECTION, MT_METEOR_SECTION2, MT_METEOR_SECTION3, MT_METEOR_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esMeteorTeammate[admin].g_iHumanCooldown, value, -1, 99999); g_esMeteorTeammate[admin].g_iHumanDuration = iGetKeyValue(subsection, MT_METEOR_SECTION, MT_METEOR_SECTION2, MT_METEOR_SECTION3, MT_METEOR_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esMeteorTeammate[admin].g_iHumanDuration, value, -1, 99999); - g_esMeteorTeammate[admin].g_iHumanMode = iGetKeyValue(subsection, MT_METEOR_SECTION, MT_METEOR_SECTION2, MT_METEOR_SECTION3, MT_METEOR_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esMeteorTeammate[admin].g_iHumanMode, value, -1, 1); + g_esMeteorTeammate[admin].g_iHumanMode = iGetKeyValue(subsection, MT_METEOR_SECTION, MT_METEOR_SECTION2, MT_METEOR_SECTION3, MT_METEOR_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esMeteorTeammate[admin].g_iHumanMode, value, -1, 2); g_esMeteorTeammate[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_METEOR_SECTION, MT_METEOR_SECTION2, MT_METEOR_SECTION3, MT_METEOR_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esMeteorTeammate[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); g_esMeteorTeammate[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_METEOR_SECTION, MT_METEOR_SECTION2, MT_METEOR_SECTION3, MT_METEOR_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esMeteorTeammate[admin].g_iRequiresHumans, value, -1, 32); g_esMeteorTeammate[admin].g_iMeteorAbility = iGetKeyValue(subsection, MT_METEOR_SECTION, MT_METEOR_SECTION2, MT_METEOR_SECTION3, MT_METEOR_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esMeteorTeammate[admin].g_iMeteorAbility, value, -1, 1); @@ -688,7 +696,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esMeteorPlayer[admin].g_iHumanAmmo = iGetKeyValue(subsection, MT_METEOR_SECTION, MT_METEOR_SECTION2, MT_METEOR_SECTION3, MT_METEOR_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esMeteorPlayer[admin].g_iHumanAmmo, value, -1, 99999); g_esMeteorPlayer[admin].g_iHumanCooldown = iGetKeyValue(subsection, MT_METEOR_SECTION, MT_METEOR_SECTION2, MT_METEOR_SECTION3, MT_METEOR_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esMeteorPlayer[admin].g_iHumanCooldown, value, -1, 99999); g_esMeteorPlayer[admin].g_iHumanDuration = iGetKeyValue(subsection, MT_METEOR_SECTION, MT_METEOR_SECTION2, MT_METEOR_SECTION3, MT_METEOR_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esMeteorPlayer[admin].g_iHumanDuration, value, -1, 99999); - g_esMeteorPlayer[admin].g_iHumanMode = iGetKeyValue(subsection, MT_METEOR_SECTION, MT_METEOR_SECTION2, MT_METEOR_SECTION3, MT_METEOR_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esMeteorPlayer[admin].g_iHumanMode, value, -1, 1); + g_esMeteorPlayer[admin].g_iHumanMode = iGetKeyValue(subsection, MT_METEOR_SECTION, MT_METEOR_SECTION2, MT_METEOR_SECTION3, MT_METEOR_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esMeteorPlayer[admin].g_iHumanMode, value, -1, 2); g_esMeteorPlayer[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_METEOR_SECTION, MT_METEOR_SECTION2, MT_METEOR_SECTION3, MT_METEOR_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esMeteorPlayer[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); g_esMeteorPlayer[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_METEOR_SECTION, MT_METEOR_SECTION2, MT_METEOR_SECTION3, MT_METEOR_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esMeteorPlayer[admin].g_iRequiresHumans, value, -1, 32); g_esMeteorPlayer[admin].g_iMeteorAbility = iGetKeyValue(subsection, MT_METEOR_SECTION, MT_METEOR_SECTION2, MT_METEOR_SECTION3, MT_METEOR_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esMeteorPlayer[admin].g_iMeteorAbility, value, -1, 1); @@ -737,7 +745,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esMeteorSpecial[type].g_iHumanAmmo = iGetKeyValue(subsection, MT_METEOR_SECTION, MT_METEOR_SECTION2, MT_METEOR_SECTION3, MT_METEOR_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esMeteorSpecial[type].g_iHumanAmmo, value, -1, 99999); g_esMeteorSpecial[type].g_iHumanCooldown = iGetKeyValue(subsection, MT_METEOR_SECTION, MT_METEOR_SECTION2, MT_METEOR_SECTION3, MT_METEOR_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esMeteorSpecial[type].g_iHumanCooldown, value, -1, 99999); g_esMeteorSpecial[type].g_iHumanDuration = iGetKeyValue(subsection, MT_METEOR_SECTION, MT_METEOR_SECTION2, MT_METEOR_SECTION3, MT_METEOR_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esMeteorSpecial[type].g_iHumanDuration, value, -1, 99999); - g_esMeteorSpecial[type].g_iHumanMode = iGetKeyValue(subsection, MT_METEOR_SECTION, MT_METEOR_SECTION2, MT_METEOR_SECTION3, MT_METEOR_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esMeteorSpecial[type].g_iHumanMode, value, -1, 1); + g_esMeteorSpecial[type].g_iHumanMode = iGetKeyValue(subsection, MT_METEOR_SECTION, MT_METEOR_SECTION2, MT_METEOR_SECTION3, MT_METEOR_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esMeteorSpecial[type].g_iHumanMode, value, -1, 2); g_esMeteorSpecial[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_METEOR_SECTION, MT_METEOR_SECTION2, MT_METEOR_SECTION3, MT_METEOR_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esMeteorSpecial[type].g_flOpenAreasOnly, value, -1.0, 99999.0); g_esMeteorSpecial[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_METEOR_SECTION, MT_METEOR_SECTION2, MT_METEOR_SECTION3, MT_METEOR_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esMeteorSpecial[type].g_iRequiresHumans, value, -1, 32); g_esMeteorSpecial[type].g_iMeteorAbility = iGetKeyValue(subsection, MT_METEOR_SECTION, MT_METEOR_SECTION2, MT_METEOR_SECTION3, MT_METEOR_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esMeteorSpecial[type].g_iMeteorAbility, value, -1, 1); @@ -758,7 +766,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esMeteorAbility[type].g_iHumanAmmo = iGetKeyValue(subsection, MT_METEOR_SECTION, MT_METEOR_SECTION2, MT_METEOR_SECTION3, MT_METEOR_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esMeteorAbility[type].g_iHumanAmmo, value, -1, 99999); g_esMeteorAbility[type].g_iHumanCooldown = iGetKeyValue(subsection, MT_METEOR_SECTION, MT_METEOR_SECTION2, MT_METEOR_SECTION3, MT_METEOR_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esMeteorAbility[type].g_iHumanCooldown, value, -1, 99999); g_esMeteorAbility[type].g_iHumanDuration = iGetKeyValue(subsection, MT_METEOR_SECTION, MT_METEOR_SECTION2, MT_METEOR_SECTION3, MT_METEOR_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esMeteorAbility[type].g_iHumanDuration, value, -1, 99999); - g_esMeteorAbility[type].g_iHumanMode = iGetKeyValue(subsection, MT_METEOR_SECTION, MT_METEOR_SECTION2, MT_METEOR_SECTION3, MT_METEOR_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esMeteorAbility[type].g_iHumanMode, value, -1, 1); + g_esMeteorAbility[type].g_iHumanMode = iGetKeyValue(subsection, MT_METEOR_SECTION, MT_METEOR_SECTION2, MT_METEOR_SECTION3, MT_METEOR_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esMeteorAbility[type].g_iHumanMode, value, -1, 2); g_esMeteorAbility[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_METEOR_SECTION, MT_METEOR_SECTION2, MT_METEOR_SECTION3, MT_METEOR_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esMeteorAbility[type].g_flOpenAreasOnly, value, -1.0, 99999.0); g_esMeteorAbility[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_METEOR_SECTION, MT_METEOR_SECTION2, MT_METEOR_SECTION3, MT_METEOR_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esMeteorAbility[type].g_iRequiresHumans, value, -1, 32); g_esMeteorAbility[type].g_iMeteorAbility = iGetKeyValue(subsection, MT_METEOR_SECTION, MT_METEOR_SECTION2, MT_METEOR_SECTION3, MT_METEOR_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esMeteorAbility[type].g_iMeteorAbility, value, -1, 1); @@ -950,10 +958,10 @@ public void MT_OnButtonPressed(int tank, int button) if ((button & MT_MAIN_KEY) && g_esMeteorCache[tank].g_iMeteorAbility == 1 && g_esMeteorCache[tank].g_iHumanAbility == 1) { - int iTime = GetTime(); + int iHumanMode = g_esMeteorCache[tank].g_iHumanMode, iTime = GetTime(); bool bRecharging = g_esMeteorPlayer[tank].g_iCooldown != -1 && g_esMeteorPlayer[tank].g_iCooldown >= iTime; - switch (g_esMeteorCache[tank].g_iHumanMode) + switch (iHumanMode) { case 0: { @@ -970,9 +978,9 @@ public void MT_OnButtonPressed(int tank, int button) MT_PrintToChat(tank, "%s %t", MT_TAG3, "MeteorHuman4", (g_esMeteorPlayer[tank].g_iCooldown - iTime)); } } - case 1: + case 1, 2: { - if (g_esMeteorPlayer[tank].g_iAmmoCount < g_esMeteorCache[tank].g_iHumanAmmo && g_esMeteorCache[tank].g_iHumanAmmo > 0) + if ((iHumanMode == 2 && g_esMeteorPlayer[tank].g_bActivated) || (g_esMeteorPlayer[tank].g_iAmmoCount < g_esMeteorCache[tank].g_iHumanAmmo && g_esMeteorCache[tank].g_iHumanAmmo > 0)) { if (!g_esMeteorPlayer[tank].g_bActivated && !bRecharging) { @@ -984,7 +992,15 @@ public void MT_OnButtonPressed(int tank, int button) } else if (g_esMeteorPlayer[tank].g_bActivated) { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "MeteorHuman3"); + switch (iHumanMode) + { + case 1: MT_PrintToChat(tank, "%s %t", MT_TAG3, "MeteorHuman3"); + case 2: + { + vMeteorReset2(tank); + vMeteorReset3(tank); + } + } } else if (bRecharging) { @@ -1196,18 +1212,20 @@ void vMeteorReset3(int tank) } } -void tTimerMeteorCombo(Handle timer, DataPack pack) +Action tTimerMeteorCombo(Handle timer, DataPack pack) { pack.Reset(); int iTank = GetClientOfUserId(pack.ReadCell()); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esMeteorAbility[g_esMeteorPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esMeteorPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esMeteorPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esMeteorCache[iTank].g_iMeteorAbility == 0 || g_esMeteorPlayer[iTank].g_bActivated) { - return; + return Plugin_Stop; } int iPos = pack.ReadCell(); vMeteor(iTank, iPos); + + return Plugin_Continue; } Action tTimerDestroyMeteor(Handle timer, DataPack pack) diff --git a/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_minion.sp b/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_minion.sp index 3ce5d333d1..ce3615e16a 100644 --- a/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_minion.sp +++ b/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_minion.sp @@ -1,6 +1,6 @@ /** - * Mutant Tanks: a L4D/L4D2 SourceMod Plugin - * Copyright (C) 2024 Alfred "Psyk0tik" Llagas + * Mutant Tanks: A L4D/L4D2 SourceMod Plugin + * Copyright (C) 2017-2025 Alfred "Psyk0tik" Llagas * * 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. * @@ -80,10 +80,12 @@ enum struct esMinionPlayer int g_iMinionAbility; int g_iMinionAmount; int g_iMinionCooldown; + int g_iMinionFilter; + int g_iMinionMaxType; int g_iMinionMessage; + int g_iMinionMinType; int g_iMinionRemove; int g_iMinionReplace; - int g_iMinionTypes; int g_iOwner; int g_iRequiresHumans; int g_iTankType; @@ -106,10 +108,12 @@ enum struct esMinionTeammate int g_iMinionAbility; int g_iMinionAmount; int g_iMinionCooldown; + int g_iMinionFilter; + int g_iMinionMaxType; int g_iMinionMessage; + int g_iMinionMinType; int g_iMinionRemove; int g_iMinionReplace; - int g_iMinionTypes; int g_iRequiresHumans; } @@ -131,10 +135,12 @@ enum struct esMinionAbility int g_iMinionAbility; int g_iMinionAmount; int g_iMinionCooldown; + int g_iMinionFilter; + int g_iMinionMaxType; int g_iMinionMessage; + int g_iMinionMinType; int g_iMinionRemove; int g_iMinionReplace; - int g_iMinionTypes; int g_iRequiresHumans; } @@ -154,10 +160,12 @@ enum struct esMinionSpecial int g_iMinionAbility; int g_iMinionAmount; int g_iMinionCooldown; + int g_iMinionFilter; + int g_iMinionMaxType; int g_iMinionMessage; + int g_iMinionMinType; int g_iMinionRemove; int g_iMinionReplace; - int g_iMinionTypes; int g_iRequiresHumans; } @@ -177,10 +185,12 @@ enum struct esMinionCache int g_iMinionAbility; int g_iMinionAmount; int g_iMinionCooldown; + int g_iMinionFilter; + int g_iMinionMaxType; int g_iMinionMessage; + int g_iMinionMinType; int g_iMinionRemove; int g_iMinionReplace; - int g_iMinionTypes; int g_iRequiresHumans; } @@ -485,10 +495,12 @@ public void MT_OnConfigsLoad(int mode) g_esMinionAbility[iIndex].g_iMinionAmount = 5; g_esMinionAbility[iIndex].g_flMinionChance = 33.3; g_esMinionAbility[iIndex].g_iMinionCooldown = 0; + g_esMinionAbility[iIndex].g_iMinionFilter = 0; g_esMinionAbility[iIndex].g_flMinionLifetime = 0.0; + g_esMinionAbility[iIndex].g_iMinionMaxType = 0; + g_esMinionAbility[iIndex].g_iMinionMinType = 0; g_esMinionAbility[iIndex].g_iMinionRemove = 1; g_esMinionAbility[iIndex].g_iMinionReplace = 1; - g_esMinionAbility[iIndex].g_iMinionTypes = 0; g_esMinionSpecial[iIndex].g_flCloseAreasOnly = -1.0; g_esMinionSpecial[iIndex].g_iComboAbility = -1; @@ -502,10 +514,12 @@ public void MT_OnConfigsLoad(int mode) g_esMinionSpecial[iIndex].g_iMinionAmount = -1; g_esMinionSpecial[iIndex].g_flMinionChance = -1.0; g_esMinionSpecial[iIndex].g_iMinionCooldown = -1; + g_esMinionSpecial[iIndex].g_iMinionFilter = -1; g_esMinionSpecial[iIndex].g_flMinionLifetime = -1.0; + g_esMinionSpecial[iIndex].g_iMinionMaxType = -1; + g_esMinionSpecial[iIndex].g_iMinionMinType = -1; g_esMinionSpecial[iIndex].g_iMinionRemove = -1; g_esMinionSpecial[iIndex].g_iMinionReplace = -1; - g_esMinionSpecial[iIndex].g_iMinionTypes = -1; } } case 3: @@ -525,10 +539,12 @@ public void MT_OnConfigsLoad(int mode) g_esMinionPlayer[iPlayer].g_iMinionAmount = -1; g_esMinionPlayer[iPlayer].g_flMinionChance = -1.0; g_esMinionPlayer[iPlayer].g_iMinionCooldown = -1; + g_esMinionPlayer[iPlayer].g_iMinionFilter = -1; g_esMinionPlayer[iPlayer].g_flMinionLifetime = -1.0; + g_esMinionPlayer[iPlayer].g_iMinionMaxType = -1; + g_esMinionPlayer[iPlayer].g_iMinionMinType = -1; g_esMinionPlayer[iPlayer].g_iMinionRemove = -1; g_esMinionPlayer[iPlayer].g_iMinionReplace = -1; - g_esMinionPlayer[iPlayer].g_iMinionTypes = -1; g_esMinionTeammate[iPlayer].g_flCloseAreasOnly = -1.0; g_esMinionTeammate[iPlayer].g_iComboAbility = -1; @@ -542,10 +558,12 @@ public void MT_OnConfigsLoad(int mode) g_esMinionTeammate[iPlayer].g_iMinionAmount = -1; g_esMinionTeammate[iPlayer].g_flMinionChance = -1.0; g_esMinionTeammate[iPlayer].g_iMinionCooldown = -1; + g_esMinionTeammate[iPlayer].g_iMinionFilter = -1; g_esMinionTeammate[iPlayer].g_flMinionLifetime = -1.0; + g_esMinionTeammate[iPlayer].g_iMinionMaxType = -1; + g_esMinionTeammate[iPlayer].g_iMinionMinType = -1; g_esMinionTeammate[iPlayer].g_iMinionRemove = -1; g_esMinionTeammate[iPlayer].g_iMinionReplace = -1; - g_esMinionTeammate[iPlayer].g_iMinionTypes = -1; } } } @@ -573,10 +591,10 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esMinionTeammate[admin].g_iMinionAmount = iGetKeyValue(subsection, MT_MINION_SECTION, MT_MINION_SECTION2, MT_MINION_SECTION3, MT_MINION_SECTION4, key, "MinionAmount", "Minion Amount", "Minion_Amount", "amount", g_esMinionTeammate[admin].g_iMinionAmount, value, -1, 15); g_esMinionTeammate[admin].g_flMinionChance = flGetKeyValue(subsection, MT_MINION_SECTION, MT_MINION_SECTION2, MT_MINION_SECTION3, MT_MINION_SECTION4, key, "MinionChance", "Minion Chance", "Minion_Chance", "chance", g_esMinionTeammate[admin].g_flMinionChance, value, -1.0, 100.0); g_esMinionTeammate[admin].g_iMinionCooldown = iGetKeyValue(subsection, MT_MINION_SECTION, MT_MINION_SECTION2, MT_MINION_SECTION3, MT_MINION_SECTION4, key, "MinionCooldown", "Minion Cooldown", "Minion_Cooldown", "cooldown", g_esMinionTeammate[admin].g_iMinionCooldown, value, -1, 99999); + g_esMinionTeammate[admin].g_iMinionFilter = iGetKeyValue(subsection, MT_MINION_SECTION, MT_MINION_SECTION2, MT_MINION_SECTION3, MT_MINION_SECTION4, key, "MinionFilter", "Minion Filter", "Minion_Filter", "filter", g_esMinionTeammate[admin].g_iMinionFilter, value, -1, 63); g_esMinionTeammate[admin].g_flMinionLifetime = flGetKeyValue(subsection, MT_MINION_SECTION, MT_MINION_SECTION2, MT_MINION_SECTION3, MT_MINION_SECTION4, key, "MinionLifetime", "Minion Lifetime", "Minion_Lifetime", "lifetime", g_esMinionTeammate[admin].g_flMinionLifetime, value, -1.0, 99999.0); g_esMinionTeammate[admin].g_iMinionRemove = iGetKeyValue(subsection, MT_MINION_SECTION, MT_MINION_SECTION2, MT_MINION_SECTION3, MT_MINION_SECTION4, key, "MinionRemove", "Minion Remove", "Minion_Remove", "remove", g_esMinionTeammate[admin].g_iMinionRemove, value, -1, 1); g_esMinionTeammate[admin].g_iMinionReplace = iGetKeyValue(subsection, MT_MINION_SECTION, MT_MINION_SECTION2, MT_MINION_SECTION3, MT_MINION_SECTION4, key, "MinionReplace", "Minion Replace", "Minion_Replace", "replace", g_esMinionTeammate[admin].g_iMinionReplace, value, -1, 1); - g_esMinionTeammate[admin].g_iMinionTypes = iGetKeyValue(subsection, MT_MINION_SECTION, MT_MINION_SECTION2, MT_MINION_SECTION3, MT_MINION_SECTION4, key, "MinionTypes", "Minion Types", "Minion_Types", "types", g_esMinionTeammate[admin].g_iMinionTypes, value, -1, 63); } else { @@ -592,12 +610,34 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esMinionPlayer[admin].g_iMinionAmount = iGetKeyValue(subsection, MT_MINION_SECTION, MT_MINION_SECTION2, MT_MINION_SECTION3, MT_MINION_SECTION4, key, "MinionAmount", "Minion Amount", "Minion_Amount", "amount", g_esMinionPlayer[admin].g_iMinionAmount, value, -1, 15); g_esMinionPlayer[admin].g_flMinionChance = flGetKeyValue(subsection, MT_MINION_SECTION, MT_MINION_SECTION2, MT_MINION_SECTION3, MT_MINION_SECTION4, key, "MinionChance", "Minion Chance", "Minion_Chance", "chance", g_esMinionPlayer[admin].g_flMinionChance, value, -1.0, 100.0); g_esMinionPlayer[admin].g_iMinionCooldown = iGetKeyValue(subsection, MT_MINION_SECTION, MT_MINION_SECTION2, MT_MINION_SECTION3, MT_MINION_SECTION4, key, "MinionCooldown", "Minion Cooldown", "Minion_Cooldown", "cooldown", g_esMinionPlayer[admin].g_iMinionCooldown, value, -1, 99999); + g_esMinionPlayer[admin].g_iMinionFilter = iGetKeyValue(subsection, MT_MINION_SECTION, MT_MINION_SECTION2, MT_MINION_SECTION3, MT_MINION_SECTION4, key, "MinionFilter", "Minion Filter", "Minion_Filter", "filter", g_esMinionPlayer[admin].g_iMinionFilter, value, -1, 63); g_esMinionPlayer[admin].g_flMinionLifetime = flGetKeyValue(subsection, MT_MINION_SECTION, MT_MINION_SECTION2, MT_MINION_SECTION3, MT_MINION_SECTION4, key, "MinionLifetime", "Minion Lifetime", "Minion_Lifetime", "lifetime", g_esMinionPlayer[admin].g_flMinionLifetime, value, -1.0, 99999.0); g_esMinionPlayer[admin].g_iMinionRemove = iGetKeyValue(subsection, MT_MINION_SECTION, MT_MINION_SECTION2, MT_MINION_SECTION3, MT_MINION_SECTION4, key, "MinionRemove", "Minion Remove", "Minion_Remove", "remove", g_esMinionPlayer[admin].g_iMinionRemove, value, -1, 1); g_esMinionPlayer[admin].g_iMinionReplace = iGetKeyValue(subsection, MT_MINION_SECTION, MT_MINION_SECTION2, MT_MINION_SECTION3, MT_MINION_SECTION4, key, "MinionReplace", "Minion Replace", "Minion_Replace", "replace", g_esMinionPlayer[admin].g_iMinionReplace, value, -1, 1); - g_esMinionPlayer[admin].g_iMinionTypes = iGetKeyValue(subsection, MT_MINION_SECTION, MT_MINION_SECTION2, MT_MINION_SECTION3, MT_MINION_SECTION4, key, "MinionTypes", "Minion Types", "Minion_Types", "types", g_esMinionPlayer[admin].g_iMinionTypes, value, -1, 63); g_esMinionPlayer[admin].g_iAccessFlags = iGetAdminFlagsValue(subsection, MT_MINION_SECTION, MT_MINION_SECTION2, MT_MINION_SECTION3, MT_MINION_SECTION4, key, "AccessFlags", "Access Flags", "Access_Flags", "access", value); } + + if (StrEqual(subsection, MT_MINION_SECTION, false) || StrEqual(subsection, MT_MINION_SECTION2, false) || StrEqual(subsection, MT_MINION_SECTION3, false) || StrEqual(subsection, MT_MINION_SECTION4, false)) + { + if (StrEqual(key, "MinionType", false) || StrEqual(key, "Minion Type", false) || StrEqual(key, "Minion_Type", false) || StrEqual(key, "type", false)) + { + char sValue[10], sRange[2][5]; + strcopy(sValue, sizeof sValue, value); + ReplaceString(sValue, sizeof sValue, " ", ""); + ExplodeString(sValue, "-", sRange, sizeof sRange, sizeof sRange[]); + + if (special && specsection[0] != '\0') + { + g_esMinionTeammate[admin].g_iMinionMinType = (sRange[0][0] != '\0') ? iClamp(StringToInt(sRange[0]), 0, MT_MAXTYPES) : g_esMinionTeammate[admin].g_iMinionMinType; + g_esMinionTeammate[admin].g_iMinionMaxType = (sRange[1][0] != '\0') ? iClamp(StringToInt(sRange[1]), 0, MT_MAXTYPES) : g_esMinionTeammate[admin].g_iMinionMaxType; + } + else + { + g_esMinionPlayer[admin].g_iMinionMinType = (sRange[0][0] != '\0') ? iClamp(StringToInt(sRange[0]), 0, MT_MAXTYPES) : g_esMinionPlayer[admin].g_iMinionMinType; + g_esMinionPlayer[admin].g_iMinionMaxType = (sRange[1][0] != '\0') ? iClamp(StringToInt(sRange[1]), 0, MT_MAXTYPES) : g_esMinionPlayer[admin].g_iMinionMaxType; + } + } + } } if (mode < 3 && type > 0) @@ -616,10 +656,10 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esMinionSpecial[type].g_iMinionAmount = iGetKeyValue(subsection, MT_MINION_SECTION, MT_MINION_SECTION2, MT_MINION_SECTION3, MT_MINION_SECTION4, key, "MinionAmount", "Minion Amount", "Minion_Amount", "amount", g_esMinionSpecial[type].g_iMinionAmount, value, -1, 15); g_esMinionSpecial[type].g_flMinionChance = flGetKeyValue(subsection, MT_MINION_SECTION, MT_MINION_SECTION2, MT_MINION_SECTION3, MT_MINION_SECTION4, key, "MinionChance", "Minion Chance", "Minion_Chance", "chance", g_esMinionSpecial[type].g_flMinionChance, value, -1.0, 100.0); g_esMinionSpecial[type].g_iMinionCooldown = iGetKeyValue(subsection, MT_MINION_SECTION, MT_MINION_SECTION2, MT_MINION_SECTION3, MT_MINION_SECTION4, key, "MinionCooldown", "Minion Cooldown", "Minion_Cooldown", "cooldown", g_esMinionSpecial[type].g_iMinionCooldown, value, -1, 99999); + g_esMinionSpecial[type].g_iMinionFilter = iGetKeyValue(subsection, MT_MINION_SECTION, MT_MINION_SECTION2, MT_MINION_SECTION3, MT_MINION_SECTION4, key, "MinionFilter", "Minion Filter", "Minion_Filter", "filter", g_esMinionSpecial[type].g_iMinionFilter, value, -1, 63); g_esMinionSpecial[type].g_flMinionLifetime = flGetKeyValue(subsection, MT_MINION_SECTION, MT_MINION_SECTION2, MT_MINION_SECTION3, MT_MINION_SECTION4, key, "MinionLifetime", "Minion Lifetime", "Minion_Lifetime", "lifetime", g_esMinionSpecial[type].g_flMinionLifetime, value, -1.0, 99999.0); g_esMinionSpecial[type].g_iMinionRemove = iGetKeyValue(subsection, MT_MINION_SECTION, MT_MINION_SECTION2, MT_MINION_SECTION3, MT_MINION_SECTION4, key, "MinionRemove", "Minion Remove", "Minion_Remove", "remove", g_esMinionSpecial[type].g_iMinionRemove, value, -1, 1); g_esMinionSpecial[type].g_iMinionReplace = iGetKeyValue(subsection, MT_MINION_SECTION, MT_MINION_SECTION2, MT_MINION_SECTION3, MT_MINION_SECTION4, key, "MinionReplace", "Minion Replace", "Minion_Replace", "replace", g_esMinionSpecial[type].g_iMinionReplace, value, -1, 1); - g_esMinionSpecial[type].g_iMinionTypes = iGetKeyValue(subsection, MT_MINION_SECTION, MT_MINION_SECTION2, MT_MINION_SECTION3, MT_MINION_SECTION4, key, "MinionTypes", "Minion Types", "Minion_Types", "types", g_esMinionSpecial[type].g_iMinionTypes, value, -1, 63); } else { @@ -635,12 +675,34 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esMinionAbility[type].g_iMinionAmount = iGetKeyValue(subsection, MT_MINION_SECTION, MT_MINION_SECTION2, MT_MINION_SECTION3, MT_MINION_SECTION4, key, "MinionAmount", "Minion Amount", "Minion_Amount", "amount", g_esMinionAbility[type].g_iMinionAmount, value, -1, 15); g_esMinionAbility[type].g_flMinionChance = flGetKeyValue(subsection, MT_MINION_SECTION, MT_MINION_SECTION2, MT_MINION_SECTION3, MT_MINION_SECTION4, key, "MinionChance", "Minion Chance", "Minion_Chance", "chance", g_esMinionAbility[type].g_flMinionChance, value, -1.0, 100.0); g_esMinionAbility[type].g_iMinionCooldown = iGetKeyValue(subsection, MT_MINION_SECTION, MT_MINION_SECTION2, MT_MINION_SECTION3, MT_MINION_SECTION4, key, "MinionCooldown", "Minion Cooldown", "Minion_Cooldown", "cooldown", g_esMinionAbility[type].g_iMinionCooldown, value, -1, 99999); + g_esMinionAbility[type].g_iMinionFilter = iGetKeyValue(subsection, MT_MINION_SECTION, MT_MINION_SECTION2, MT_MINION_SECTION3, MT_MINION_SECTION4, key, "MinionFilter", "Minion Filter", "Minion_Filter", "filter", g_esMinionAbility[type].g_iMinionFilter, value, -1, 63); g_esMinionAbility[type].g_flMinionLifetime = flGetKeyValue(subsection, MT_MINION_SECTION, MT_MINION_SECTION2, MT_MINION_SECTION3, MT_MINION_SECTION4, key, "MinionLifetime", "Minion Lifetime", "Minion_Lifetime", "lifetime", g_esMinionAbility[type].g_flMinionLifetime, value, -1.0, 99999.0); g_esMinionAbility[type].g_iMinionRemove = iGetKeyValue(subsection, MT_MINION_SECTION, MT_MINION_SECTION2, MT_MINION_SECTION3, MT_MINION_SECTION4, key, "MinionRemove", "Minion Remove", "Minion_Remove", "remove", g_esMinionAbility[type].g_iMinionRemove, value, -1, 1); g_esMinionAbility[type].g_iMinionReplace = iGetKeyValue(subsection, MT_MINION_SECTION, MT_MINION_SECTION2, MT_MINION_SECTION3, MT_MINION_SECTION4, key, "MinionReplace", "Minion Replace", "Minion_Replace", "replace", g_esMinionAbility[type].g_iMinionReplace, value, -1, 1); - g_esMinionAbility[type].g_iMinionTypes = iGetKeyValue(subsection, MT_MINION_SECTION, MT_MINION_SECTION2, MT_MINION_SECTION3, MT_MINION_SECTION4, key, "MinionTypes", "Minion Types", "Minion_Types", "types", g_esMinionAbility[type].g_iMinionTypes, value, -1, 63); g_esMinionAbility[type].g_iAccessFlags = iGetAdminFlagsValue(subsection, MT_MINION_SECTION, MT_MINION_SECTION2, MT_MINION_SECTION3, MT_MINION_SECTION4, key, "AccessFlags", "Access Flags", "Access_Flags", "access", value); } + + if (StrEqual(subsection, MT_MINION_SECTION, false) || StrEqual(subsection, MT_MINION_SECTION2, false) || StrEqual(subsection, MT_MINION_SECTION3, false) || StrEqual(subsection, MT_MINION_SECTION4, false)) + { + if (StrEqual(key, "MinionType", false) || StrEqual(key, "Minion Type", false) || StrEqual(key, "Minion_Type", false) || StrEqual(key, "type", false)) + { + char sValue[10], sRange[2][5]; + strcopy(sValue, sizeof sValue, value); + ReplaceString(sValue, sizeof sValue, " ", ""); + ExplodeString(sValue, "-", sRange, sizeof sRange, sizeof sRange[]); + + if (special && specsection[0] != '\0') + { + g_esMinionSpecial[type].g_iMinionMinType = (sRange[0][0] != '\0') ? iClamp(StringToInt(sRange[0]), 0, MT_MAXTYPES) : g_esMinionSpecial[type].g_iMinionMinType; + g_esMinionSpecial[type].g_iMinionMaxType = (sRange[1][0] != '\0') ? iClamp(StringToInt(sRange[1]), 0, MT_MAXTYPES) : g_esMinionSpecial[type].g_iMinionMaxType; + } + else + { + g_esMinionAbility[type].g_iMinionMinType = (sRange[0][0] != '\0') ? iClamp(StringToInt(sRange[0]), 0, MT_MAXTYPES) : g_esMinionAbility[type].g_iMinionMinType; + g_esMinionAbility[type].g_iMinionMaxType = (sRange[1][0] != '\0') ? iClamp(StringToInt(sRange[1]), 0, MT_MAXTYPES) : g_esMinionAbility[type].g_iMinionMaxType; + } + } + } } } @@ -667,10 +729,12 @@ public void MT_OnSettingsCached(int tank, bool apply, int type) g_esMinionCache[tank].g_iMinionAbility = iGetSubSettingValue(apply, bHuman, g_esMinionTeammate[tank].g_iMinionAbility, g_esMinionPlayer[tank].g_iMinionAbility, g_esMinionSpecial[iType].g_iMinionAbility, g_esMinionAbility[iType].g_iMinionAbility, 1); g_esMinionCache[tank].g_iMinionAmount = iGetSubSettingValue(apply, bHuman, g_esMinionTeammate[tank].g_iMinionAmount, g_esMinionPlayer[tank].g_iMinionAmount, g_esMinionSpecial[iType].g_iMinionAmount, g_esMinionAbility[iType].g_iMinionAmount, 1); g_esMinionCache[tank].g_iMinionCooldown = iGetSubSettingValue(apply, bHuman, g_esMinionTeammate[tank].g_iMinionCooldown, g_esMinionPlayer[tank].g_iMinionCooldown, g_esMinionSpecial[iType].g_iMinionCooldown, g_esMinionAbility[iType].g_iMinionCooldown, 1); + g_esMinionCache[tank].g_iMinionFilter = iGetSubSettingValue(apply, bHuman, g_esMinionTeammate[tank].g_iMinionFilter, g_esMinionPlayer[tank].g_iMinionFilter, g_esMinionSpecial[iType].g_iMinionFilter, g_esMinionAbility[iType].g_iMinionFilter, 1); + g_esMinionCache[tank].g_iMinionMaxType = iGetSubSettingValue(apply, bHuman, g_esMinionTeammate[tank].g_iMinionMaxType, g_esMinionPlayer[tank].g_iMinionMaxType, g_esMinionSpecial[iType].g_iMinionMaxType, g_esMinionAbility[iType].g_iMinionMaxType, 1); g_esMinionCache[tank].g_iMinionMessage = iGetSubSettingValue(apply, bHuman, g_esMinionTeammate[tank].g_iMinionMessage, g_esMinionPlayer[tank].g_iMinionMessage, g_esMinionSpecial[iType].g_iMinionMessage, g_esMinionAbility[iType].g_iMinionMessage, 1); + g_esMinionCache[tank].g_iMinionMinType = iGetSubSettingValue(apply, bHuman, g_esMinionTeammate[tank].g_iMinionMinType, g_esMinionPlayer[tank].g_iMinionMinType, g_esMinionSpecial[iType].g_iMinionMinType, g_esMinionAbility[iType].g_iMinionMinType, 1); g_esMinionCache[tank].g_iMinionRemove = iGetSubSettingValue(apply, bHuman, g_esMinionTeammate[tank].g_iMinionRemove, g_esMinionPlayer[tank].g_iMinionRemove, g_esMinionSpecial[iType].g_iMinionRemove, g_esMinionAbility[iType].g_iMinionRemove, 1); g_esMinionCache[tank].g_iMinionReplace = iGetSubSettingValue(apply, bHuman, g_esMinionTeammate[tank].g_iMinionReplace, g_esMinionPlayer[tank].g_iMinionReplace, g_esMinionSpecial[iType].g_iMinionReplace, g_esMinionAbility[iType].g_iMinionReplace, 1); - g_esMinionCache[tank].g_iMinionTypes = iGetSubSettingValue(apply, bHuman, g_esMinionTeammate[tank].g_iMinionTypes, g_esMinionPlayer[tank].g_iMinionTypes, g_esMinionSpecial[iType].g_iMinionTypes, g_esMinionAbility[iType].g_iMinionTypes, 1); g_esMinionCache[tank].g_flOpenAreasOnly = flGetSubSettingValue(apply, bHuman, g_esMinionTeammate[tank].g_flOpenAreasOnly, g_esMinionPlayer[tank].g_flOpenAreasOnly, g_esMinionSpecial[iType].g_flOpenAreasOnly, g_esMinionAbility[iType].g_flOpenAreasOnly, 1); g_esMinionCache[tank].g_iRequiresHumans = iGetSubSettingValue(apply, bHuman, g_esMinionTeammate[tank].g_iRequiresHumans, g_esMinionPlayer[tank].g_iRequiresHumans, g_esMinionSpecial[iType].g_iRequiresHumans, g_esMinionAbility[iType].g_iRequiresHumans, 1); } @@ -686,10 +750,12 @@ public void MT_OnSettingsCached(int tank, bool apply, int type) g_esMinionCache[tank].g_iMinionAbility = iGetSettingValue(apply, bHuman, g_esMinionPlayer[tank].g_iMinionAbility, g_esMinionAbility[iType].g_iMinionAbility, 1); g_esMinionCache[tank].g_iMinionAmount = iGetSettingValue(apply, bHuman, g_esMinionPlayer[tank].g_iMinionAmount, g_esMinionAbility[iType].g_iMinionAmount, 1); g_esMinionCache[tank].g_iMinionCooldown = iGetSettingValue(apply, bHuman, g_esMinionPlayer[tank].g_iMinionCooldown, g_esMinionAbility[iType].g_iMinionCooldown, 1); + g_esMinionCache[tank].g_iMinionFilter = iGetSettingValue(apply, bHuman, g_esMinionPlayer[tank].g_iMinionFilter, g_esMinionAbility[iType].g_iMinionFilter, 1); + g_esMinionCache[tank].g_iMinionMaxType = iGetSettingValue(apply, bHuman, g_esMinionPlayer[tank].g_iMinionMaxType, g_esMinionAbility[iType].g_iMinionMaxType, 1); g_esMinionCache[tank].g_iMinionMessage = iGetSettingValue(apply, bHuman, g_esMinionPlayer[tank].g_iMinionMessage, g_esMinionAbility[iType].g_iMinionMessage, 1); + g_esMinionCache[tank].g_iMinionMinType = iGetSettingValue(apply, bHuman, g_esMinionPlayer[tank].g_iMinionMinType, g_esMinionAbility[iType].g_iMinionMinType, 1); g_esMinionCache[tank].g_iMinionRemove = iGetSettingValue(apply, bHuman, g_esMinionPlayer[tank].g_iMinionRemove, g_esMinionAbility[iType].g_iMinionRemove, 1); g_esMinionCache[tank].g_iMinionReplace = iGetSettingValue(apply, bHuman, g_esMinionPlayer[tank].g_iMinionReplace, g_esMinionAbility[iType].g_iMinionReplace, 1); - g_esMinionCache[tank].g_iMinionTypes = iGetSettingValue(apply, bHuman, g_esMinionPlayer[tank].g_iMinionTypes, g_esMinionAbility[iType].g_iMinionTypes, 1); g_esMinionCache[tank].g_flOpenAreasOnly = flGetSettingValue(apply, bHuman, g_esMinionPlayer[tank].g_flOpenAreasOnly, g_esMinionAbility[iType].g_flOpenAreasOnly, 1); g_esMinionCache[tank].g_iRequiresHumans = iGetSettingValue(apply, bHuman, g_esMinionPlayer[tank].g_iRequiresHumans, g_esMinionAbility[iType].g_iRequiresHumans, 1); } @@ -902,41 +968,10 @@ void vMinion(int tank) } } - int iTypeCount = 0, iTypes[6], iFlag = 0; - for (int iBit = 0; iBit < (sizeof iTypes); iBit++) - { - iFlag = (1 << iBit); - if (!(g_esMinionCache[tank].g_iMinionTypes & iFlag)) - { - continue; - } - - iTypes[iTypeCount] = iFlag; - iTypeCount++; - } - - int iType = (iTypeCount > 0) ? iTypes[MT_GetRandomInt(0, (iTypeCount - 1))] : iTypes[0]; - - switch (iType) + switch (g_esMinionCache[tank].g_iMinionMinType == 0 || g_esMinionCache[tank].g_iMinionMaxType == 0) { - case 1: vCheatCommand(tank, g_bSecondGame ? "z_spawn_old" : "z_spawn", "smoker"); - case 2: vCheatCommand(tank, g_bSecondGame ? "z_spawn_old" : "z_spawn", "boomer"); - case 4: vCheatCommand(tank, g_bSecondGame ? "z_spawn_old" : "z_spawn", "hunter"); - case 8: vCheatCommand(tank, g_bSecondGame ? "z_spawn_old" : "z_spawn", g_bSecondGame ? "spitter" : "boomer"); - case 16: vCheatCommand(tank, g_bSecondGame ? "z_spawn_old" : "z_spawn", g_bSecondGame ? "jockey" : "hunter"); - case 32: vCheatCommand(tank, g_bSecondGame ? "z_spawn_old" : "z_spawn", g_bSecondGame ? "charger" : "smoker"); - default: - { - switch (MT_GetRandomInt(1, (sizeof iTypes))) - { - case 1: vCheatCommand(tank, g_bSecondGame ? "z_spawn_old" : "z_spawn", "smoker"); - case 2: vCheatCommand(tank, g_bSecondGame ? "z_spawn_old" : "z_spawn", "boomer"); - case 3: vCheatCommand(tank, g_bSecondGame ? "z_spawn_old" : "z_spawn", "hunter"); - case 4: vCheatCommand(tank, g_bSecondGame ? "z_spawn_old" : "z_spawn", g_bSecondGame ? "spitter" : "boomer"); - case 5: vCheatCommand(tank, g_bSecondGame ? "z_spawn_old" : "z_spawn", g_bSecondGame ? "jockey" : "hunter"); - case 6: vCheatCommand(tank, g_bSecondGame ? "z_spawn_old" : "z_spawn", g_bSecondGame ? "charger" : "smoker"); - } - } + case true: vMinion2(tank); + case false: vMinion2(tank, g_esMinionCache[tank].g_iMinionMinType, g_esMinionCache[tank].g_iMinionMaxType); } int iSpecial = 0; @@ -997,6 +1032,74 @@ void vMinion(int tank) } } +void vMinion2(int tank, int min = 0, int max = 0) +{ + if (bIsAreaNarrow(tank, g_esMinionCache[tank].g_flOpenAreasOnly) || bIsAreaWide(tank, g_esMinionCache[tank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esMinionPlayer[tank].g_iTankType, tank) || (g_esMinionCache[tank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esMinionCache[tank].g_iRequiresHumans) || (!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esMinionAbility[g_esMinionPlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esMinionPlayer[tank].g_iAccessFlags))) + { + return; + } + + int iMin = (min > 0) ? min : MT_GetMinType(), + iMax = (max > 0) ? max : MT_GetMaxType(), + iSpecType = iGetInfectedType(tank), iType = iMin, + iTypeCount = 0, iTankTypes[MT_MAXTYPES + 1]; + + if (iMin != iMax) + { + for (int iIndex = iMin; iIndex <= iMax; iIndex++) + { + if (!MT_IsTypeEnabled(iIndex, tank) || !MT_CanTypeSpawn(iIndex, iSpecType) || MT_DoesTypeRequireHumans(iIndex, tank)) + { + continue; + } + + iTankTypes[iTypeCount + 1] = iIndex; + iTypeCount++; + } + + iType = (iTypeCount > 0) ? iTankTypes[MT_GetRandomInt(1, iTypeCount)] : g_esMinionPlayer[tank].g_iTankType; + } + + int iTypes[6], iFlag = 0; + iSpecType = 0; + iTypeCount = 0; + for (int iBit = 0; iBit < (sizeof iTypes); iBit++) + { + iFlag = (1 << iBit); + if (!(g_esMinionCache[tank].g_iMinionFilter & iFlag)) + { + continue; + } + + iTypes[iTypeCount] = iFlag; + iTypeCount++; + } + + iSpecType = (iTypeCount > 0) ? iTypes[MT_GetRandomInt(0, (iTypeCount - 1))] : iTypes[0]; + + switch (iSpecType) + { + case 1: MT_SpawnTank(tank, iType, 1); + case 2: MT_SpawnTank(tank, iType, 2); + case 4: MT_SpawnTank(tank, iType, 3); + case 8: MT_SpawnTank(tank, iType, (g_bSecondGame ? 4 : 2)); + case 16: MT_SpawnTank(tank, iType, (g_bSecondGame ? 5 : 3)); + case 32: MT_SpawnTank(tank, iType, (g_bSecondGame ? 6 : 1)); + default: + { + switch (MT_GetRandomInt(1, (sizeof iTypes))) + { + case 1: MT_SpawnTank(tank, iType, 1); + case 2: MT_SpawnTank(tank, iType, 2); + case 3: MT_SpawnTank(tank, iType, 3); + case 4: MT_SpawnTank(tank, iType, (g_bSecondGame ? 4 : 2)); + case 5: MT_SpawnTank(tank, iType, (g_bSecondGame ? 5 : 3)); + case 6: MT_SpawnTank(tank, iType, (g_bSecondGame ? 6 : 1)); + } + } + } +} + void vMinionAbility(int tank) { if ((g_esMinionPlayer[tank].g_iCooldown != -1 && g_esMinionPlayer[tank].g_iCooldown >= GetTime()) || bIsAreaNarrow(tank, g_esMinionCache[tank].g_flOpenAreasOnly) || bIsAreaWide(tank, g_esMinionCache[tank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esMinionPlayer[tank].g_iTankType, tank) || (g_esMinionCache[tank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esMinionCache[tank].g_iRequiresHumans) || (!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esMinionAbility[g_esMinionPlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esMinionPlayer[tank].g_iAccessFlags))) @@ -1067,24 +1170,28 @@ void vMinionReset() } } -void tTimerMinionCombo(Handle timer, int userid) +Action tTimerMinionCombo(Handle timer, int userid) { int iTank = GetClientOfUserId(userid); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esMinionAbility[g_esMinionPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esMinionPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esMinionPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esMinionCache[iTank].g_iMinionAbility == 0) { - return; + return Plugin_Stop; } vMinion(iTank); + + return Plugin_Continue; } -void tTimerKillMinion(Handle timer, int userid) +Action tTimerKillMinion(Handle timer, int userid) { int iSpecial = GetClientOfUserId(userid); if (!bIsSpecialInfected(iSpecial) || !g_esMinionPlayer[iSpecial].g_bMinion) { - return; + return Plugin_Stop; } ForcePlayerSuicide(iSpecial); + + return Plugin_Continue; } \ No newline at end of file diff --git a/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_necro.sp b/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_necro.sp deleted file mode 100644 index e5a913ecb7..0000000000 --- a/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_necro.sp +++ /dev/null @@ -1,1080 +0,0 @@ -/** - * Mutant Tanks: a L4D/L4D2 SourceMod Plugin - * Copyright (C) 2024 Alfred "Psyk0tik" Llagas - * - * 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 . - **/ - -#define MT_NECRO_COMPILE_METHOD 0 // 0: packaged, 1: standalone - -#if !defined MT_ABILITIES_MAIN2 - #if MT_NECRO_COMPILE_METHOD == 1 - #include - #include - #else - #error This file must be inside "scripting/mutant_tanks/abilities2" while compiling "mt_abilities2.sp" to include its content. - #endif -public Plugin myinfo = -{ - name = "[MT] Necro Ability", - author = MT_AUTHOR, - description = "The Mutant Tank resurrects nearby special infected that die.", - version = MT_VERSION, - url = MT_URL -}; - -bool g_bDedicated, g_bSecondGame; - -public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max) -{ - switch (GetEngineVersion()) - { - case Engine_Left4Dead: g_bSecondGame = false; - case Engine_Left4Dead2: g_bSecondGame = true; - default: - { - strcopy(error, err_max, "\"[MT] Necro Ability\" only supports Left 4 Dead 1 & 2."); - - return APLRes_SilentFailure; - } - } - - g_bDedicated = IsDedicatedServer(); - - return APLRes_Success; -} - -#define PARTICLE_ELECTRICITY "electrical_arc_01_system" - -#define SOUND_ELECTRICITY "ambient/energy/zap5.wav" -#else - #if MT_NECRO_COMPILE_METHOD == 1 - #error This file must be compiled as a standalone plugin. - #endif -#endif - -#define MT_NECRO_SECTION "necroability" -#define MT_NECRO_SECTION2 "necro ability" -#define MT_NECRO_SECTION3 "necro_ability" -#define MT_NECRO_SECTION4 "necro" - -#define MT_MENU_NECRO "Necro Ability" - -enum struct esNecroPlayer -{ - bool g_bActivated; - - float g_flCloseAreasOnly; - float g_flNecroChance; - float g_flNecroRange; - float g_flOpenAreasOnly; - - int g_iAccessFlags; - int g_iAmmoCount; - int g_iComboAbility; - int g_iCooldown; - int g_iDuration; - int g_iHumanAbility; - int g_iHumanAmmo; - int g_iHumanCooldown; - int g_iHumanDuration; - int g_iHumanMode; - int g_iNecroAbility; - int g_iNecroCooldown; - int g_iNecroDuration; - int g_iNecroMessage; - int g_iNecroSight; - int g_iRequiresHumans; - int g_iTankType; - int g_iTankTypeRecorded; -} - -esNecroPlayer g_esNecroPlayer[MAXPLAYERS + 1]; - -enum struct esNecroTeammate -{ - float g_flCloseAreasOnly; - float g_flNecroChance; - float g_flNecroRange; - float g_flOpenAreasOnly; - - int g_iComboAbility; - int g_iHumanAbility; - int g_iHumanAmmo; - int g_iHumanCooldown; - int g_iHumanDuration; - int g_iHumanMode; - int g_iNecroAbility; - int g_iNecroCooldown; - int g_iNecroDuration; - int g_iNecroMessage; - int g_iNecroSight; - int g_iRequiresHumans; -} - -esNecroTeammate g_esNecroTeammate[MAXPLAYERS + 1]; - -enum struct esNecroAbility -{ - float g_flCloseAreasOnly; - float g_flNecroChance; - float g_flNecroRange; - float g_flOpenAreasOnly; - - int g_iAccessFlags; - int g_iComboAbility; - int g_iComboPosition; - int g_iHumanAbility; - int g_iHumanAmmo; - int g_iHumanCooldown; - int g_iHumanDuration; - int g_iHumanMode; - int g_iNecroAbility; - int g_iNecroCooldown; - int g_iNecroDuration; - int g_iNecroMessage; - int g_iNecroSight; - int g_iRequiresHumans; -} - -esNecroAbility g_esNecroAbility[MT_MAXTYPES + 1]; - -enum struct esNecroSpecial -{ - float g_flCloseAreasOnly; - float g_flNecroChance; - float g_flNecroRange; - float g_flOpenAreasOnly; - - int g_iComboAbility; - int g_iHumanAbility; - int g_iHumanAmmo; - int g_iHumanCooldown; - int g_iHumanDuration; - int g_iHumanMode; - int g_iNecroAbility; - int g_iNecroCooldown; - int g_iNecroDuration; - int g_iNecroMessage; - int g_iNecroSight; - int g_iRequiresHumans; -} - -esNecroSpecial g_esNecroSpecial[MT_MAXTYPES + 1]; - -enum struct esNecroCache -{ - float g_flCloseAreasOnly; - float g_flNecroChance; - float g_flNecroRange; - float g_flOpenAreasOnly; - - int g_iComboAbility; - int g_iHumanAbility; - int g_iHumanAmmo; - int g_iHumanCooldown; - int g_iHumanDuration; - int g_iHumanMode; - int g_iNecroAbility; - int g_iNecroCooldown; - int g_iNecroDuration; - int g_iNecroMessage; - int g_iNecroSight; - int g_iRequiresHumans; -} - -esNecroCache g_esNecroCache[MAXPLAYERS + 1]; - -#if !defined MT_ABILITIES_MAIN2 -public void OnPluginStart() -{ - LoadTranslations("common.phrases"); - LoadTranslations("mutant_tanks.phrases"); - LoadTranslations("mutant_tanks_names.phrases"); - - RegConsoleCmd("sm_mt_necro", cmdNecroInfo, "View information about the Necro ability."); -} -#endif - -#if defined MT_ABILITIES_MAIN2 -void vNecroMapStart() -#else -public void OnMapStart() -#endif -{ - PrecacheSound(SOUND_ELECTRICITY, true); - - vNecroReset(); -} - -#if defined MT_ABILITIES_MAIN2 -void vNecroClientPutInServer(int client) -#else -public void OnClientPutInServer(int client) -#endif -{ - vRemoveNecro(client); -} - -#if defined MT_ABILITIES_MAIN2 -void vNecroClientDisconnect_Post(int client) -#else -public void OnClientDisconnect_Post(int client) -#endif -{ - vRemoveNecro(client); -} - -#if defined MT_ABILITIES_MAIN2 -void vNecroMapEnd() -#else -public void OnMapEnd() -#endif -{ - vNecroReset(); -} - -#if !defined MT_ABILITIES_MAIN2 -Action cmdNecroInfo(int client, int args) -{ - client = iGetListenServerHost(client, g_bDedicated); - - if (!MT_IsCorePluginEnabled()) - { - MT_ReplyToCommand(client, "%s %t", MT_TAG5, "PluginDisabled"); - - return Plugin_Handled; - } - - if (!bIsValidClient(client, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_FAKECLIENT)) - { - MT_ReplyToCommand(client, "%s %t", MT_TAG, "Command is in-game only"); - - return Plugin_Handled; - } - - switch (IsVoteInProgress()) - { - case true: MT_ReplyToCommand(client, "%s %t", MT_TAG2, "Vote in Progress"); - case false: vNecroMenu(client, MT_NECRO_SECTION4, 0); - } - - return Plugin_Handled; -} -#endif - -void vNecroMenu(int client, const char[] name, int item) -{ - if (StrContains(MT_NECRO_SECTION4, name, false) == -1) - { - return; - } - - Menu mAbilityMenu = new Menu(iNecroMenuHandler, MENU_ACTIONS_DEFAULT|MenuAction_Display|MenuAction_DisplayItem); - mAbilityMenu.SetTitle("Necro Ability Information"); - mAbilityMenu.AddItem("Status", "Status"); - mAbilityMenu.AddItem("Ammunition", "Ammunition"); - mAbilityMenu.AddItem("Buttons", "Buttons"); - mAbilityMenu.AddItem("Button Mode", "Button Mode"); - mAbilityMenu.AddItem("Cooldown", "Cooldown"); - mAbilityMenu.AddItem("Details", "Details"); - mAbilityMenu.AddItem("Duration", "Duration"); - mAbilityMenu.AddItem("Human Support", "Human Support"); - mAbilityMenu.DisplayAt(client, item, MENU_TIME_FOREVER); -} - -int iNecroMenuHandler(Menu menu, MenuAction action, int param1, int param2) -{ - switch (action) - { - case MenuAction_End: delete menu; - case MenuAction_Select: - { - switch (param2) - { - case 0: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esNecroCache[param1].g_iNecroAbility == 0) ? "AbilityStatus1" : "AbilityStatus2"); - case 1: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityAmmo", (g_esNecroCache[param1].g_iHumanAmmo - g_esNecroPlayer[param1].g_iAmmoCount), g_esNecroCache[param1].g_iHumanAmmo); - case 2: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtons3"); - case 3: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esNecroCache[param1].g_iHumanMode == 0) ? "AbilityButtonMode1" : "AbilityButtonMode2"); - case 4: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityCooldown", ((g_esNecroCache[param1].g_iHumanAbility == 1) ? g_esNecroCache[param1].g_iHumanCooldown : g_esNecroCache[param1].g_iNecroCooldown)); - case 5: MT_PrintToChat(param1, "%s %t", MT_TAG3, "NecroDetails"); - case 6: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityDuration2", ((g_esNecroCache[param1].g_iHumanAbility == 1) ? g_esNecroCache[param1].g_iHumanDuration : g_esNecroCache[param1].g_iNecroDuration)); - case 7: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esNecroCache[param1].g_iHumanAbility == 0) ? "AbilityHumanSupport1" : "AbilityHumanSupport2"); - } - - if (bIsValidClient(param1, MT_CHECK_INGAME)) - { - vNecroMenu(param1, MT_NECRO_SECTION4, menu.Selection); - } - } - case MenuAction_Display: - { - char sMenuTitle[PLATFORM_MAX_PATH]; - Panel pNecro = view_as(param2); - FormatEx(sMenuTitle, sizeof sMenuTitle, "%T", "NecroMenu", param1); - pNecro.SetTitle(sMenuTitle); - } - case MenuAction_DisplayItem: - { - if (param2 >= 0) - { - char sMenuOption[PLATFORM_MAX_PATH]; - - switch (param2) - { - case 0: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Status", param1); - case 1: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Ammunition", param1); - case 2: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Buttons", param1); - case 3: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "ButtonMode", param1); - case 4: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Cooldown", param1); - case 5: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Details", param1); - case 6: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Duration", param1); - case 7: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "HumanSupport", param1); - } - - return RedrawMenuItem(sMenuOption); - } - } - } - - return 0; -} - -#if defined MT_ABILITIES_MAIN2 -void vNecroDisplayMenu(Menu menu) -#else -public void MT_OnDisplayMenu(Menu menu) -#endif -{ - menu.AddItem(MT_MENU_NECRO, MT_MENU_NECRO); -} - -#if defined MT_ABILITIES_MAIN2 -void vNecroMenuItemSelected(int client, const char[] info) -#else -public void MT_OnMenuItemSelected(int client, const char[] info) -#endif -{ - if (StrEqual(info, MT_MENU_NECRO, false)) - { - vNecroMenu(client, MT_NECRO_SECTION4, 0); - } -} - -#if defined MT_ABILITIES_MAIN2 -void vNecroMenuItemDisplayed(int client, const char[] info, char[] buffer, int size) -#else -public void MT_OnMenuItemDisplayed(int client, const char[] info, char[] buffer, int size) -#endif -{ - if (StrEqual(info, MT_MENU_NECRO, false)) - { - FormatEx(buffer, size, "%T", "NecroMenu2", client); - } -} - -#if defined MT_ABILITIES_MAIN2 -void vNecroPlayerRunCmd(int client) -#else -public Action OnPlayerRunCmd(int client, int &buttons, int &impulse, float vel[3], float angles[3], int &weapon) -#endif -{ - if (!MT_IsTankSupported(client) || !g_esNecroPlayer[client].g_bActivated || (bIsInfected(client, MT_CHECK_FAKECLIENT) && g_esNecroCache[client].g_iHumanMode == 1) || g_esNecroPlayer[client].g_iDuration == -1) - { -#if defined MT_ABILITIES_MAIN2 - return; -#else - return Plugin_Continue; -#endif - } - - int iTime = GetTime(); - if (g_esNecroPlayer[client].g_iDuration <= iTime) - { - if (g_esNecroPlayer[client].g_iCooldown == -1 || g_esNecroPlayer[client].g_iCooldown <= iTime) - { - vNecroReset2(client); - } - - g_esNecroPlayer[client].g_bActivated = false; - g_esNecroPlayer[client].g_iDuration = -1; - } -#if !defined MT_ABILITIES_MAIN2 - return Plugin_Continue; -#endif -} - -#if defined MT_ABILITIES_MAIN2 -void vNecroPluginCheck(ArrayList list) -#else -public void MT_OnPluginCheck(ArrayList list) -#endif -{ - list.PushString(MT_MENU_NECRO); -} - -#if defined MT_ABILITIES_MAIN2 -void vNecroAbilityCheck(ArrayList list, ArrayList list2, ArrayList list3, ArrayList list4) -#else -public void MT_OnAbilityCheck(ArrayList list, ArrayList list2, ArrayList list3, ArrayList list4) -#endif -{ - list.PushString(MT_NECRO_SECTION); - list2.PushString(MT_NECRO_SECTION2); - list3.PushString(MT_NECRO_SECTION3); - list4.PushString(MT_NECRO_SECTION4); -} - -#if defined MT_ABILITIES_MAIN2 -void vNecroCombineAbilities(int tank, int type, const float random, const char[] combo) -#else -public void MT_OnCombineAbilities(int tank, int type, const float random, const char[] combo, int survivor, int weapon, const char[] classname) -#endif -{ - if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esNecroCache[tank].g_iHumanAbility != 2) - { - g_esNecroAbility[g_esNecroPlayer[tank].g_iTankTypeRecorded].g_iComboPosition = -1; - - return; - } - - g_esNecroAbility[g_esNecroPlayer[tank].g_iTankTypeRecorded].g_iComboPosition = -1; - - char sCombo[320], sSet[4][32]; - FormatEx(sCombo, sizeof sCombo, ",%s,", combo); - FormatEx(sSet[0], sizeof sSet[], ",%s,", MT_NECRO_SECTION); - FormatEx(sSet[1], sizeof sSet[], ",%s,", MT_NECRO_SECTION2); - FormatEx(sSet[2], sizeof sSet[], ",%s,", MT_NECRO_SECTION3); - FormatEx(sSet[3], sizeof sSet[], ",%s,", MT_NECRO_SECTION4); - if (StrContains(sCombo, sSet[0], false) != -1 || StrContains(sCombo, sSet[1], false) != -1 || StrContains(sCombo, sSet[2], false) != -1 || StrContains(sCombo, sSet[3], false) != -1) - { - if (type == MT_COMBO_MAINRANGE && g_esNecroCache[tank].g_iNecroAbility == 1 && g_esNecroCache[tank].g_iComboAbility == 1 && !g_esNecroPlayer[tank].g_bActivated) - { - char sAbilities[320], sSubset[10][32]; - strcopy(sAbilities, sizeof sAbilities, combo); - ExplodeString(sAbilities, ",", sSubset, sizeof sSubset, sizeof sSubset[]); - - float flDelay = 0.0; - for (int iPos = 0; iPos < (sizeof sSubset); iPos++) - { - if (StrEqual(sSubset[iPos], MT_NECRO_SECTION, false) || StrEqual(sSubset[iPos], MT_NECRO_SECTION2, false) || StrEqual(sSubset[iPos], MT_NECRO_SECTION3, false) || StrEqual(sSubset[iPos], MT_NECRO_SECTION4, false)) - { - g_esNecroAbility[g_esNecroPlayer[tank].g_iTankTypeRecorded].g_iComboPosition = iPos; - - if (random <= MT_GetCombinationSetting(tank, 1, iPos)) - { - flDelay = MT_GetCombinationSetting(tank, 4, iPos); - - switch (flDelay) - { - case 0.0: g_esNecroPlayer[tank].g_bActivated = true; - default: CreateTimer(flDelay, tTimerNecroCombo, GetClientUserId(tank), TIMER_FLAG_NO_MAPCHANGE); - } - } - - break; - } - } - } - } -} - -#if defined MT_ABILITIES_MAIN2 -void vNecroConfigsLoad(int mode) -#else -public void MT_OnConfigsLoad(int mode) -#endif -{ - switch (mode) - { - case 1: - { - for (int iIndex = MT_GetMinType(); iIndex <= MT_GetMaxType(); iIndex++) - { - g_esNecroAbility[iIndex].g_iAccessFlags = 0; - g_esNecroAbility[iIndex].g_flCloseAreasOnly = 0.0; - g_esNecroAbility[iIndex].g_iComboAbility = 0; - g_esNecroAbility[iIndex].g_iComboPosition = -1; - g_esNecroAbility[iIndex].g_iHumanAbility = 0; - g_esNecroAbility[iIndex].g_iHumanAmmo = 5; - g_esNecroAbility[iIndex].g_iHumanCooldown = 0; - g_esNecroAbility[iIndex].g_iHumanDuration = 5; - g_esNecroAbility[iIndex].g_iHumanMode = 1; - g_esNecroAbility[iIndex].g_flOpenAreasOnly = 0.0; - g_esNecroAbility[iIndex].g_iRequiresHumans = 0; - g_esNecroAbility[iIndex].g_iNecroAbility = 0; - g_esNecroAbility[iIndex].g_iNecroMessage = 0; - g_esNecroAbility[iIndex].g_flNecroChance = 33.3; - g_esNecroAbility[iIndex].g_iNecroCooldown = 0; - g_esNecroAbility[iIndex].g_iNecroDuration = 0; - g_esNecroAbility[iIndex].g_flNecroRange = 500.0; - g_esNecroAbility[iIndex].g_iNecroSight = 0; - - g_esNecroSpecial[iIndex].g_flCloseAreasOnly = -1.0; - g_esNecroSpecial[iIndex].g_iComboAbility = -1; - g_esNecroSpecial[iIndex].g_iHumanAbility = -1; - g_esNecroSpecial[iIndex].g_iHumanAmmo = -1; - g_esNecroSpecial[iIndex].g_iHumanCooldown = -1; - g_esNecroSpecial[iIndex].g_iHumanDuration = -1; - g_esNecroSpecial[iIndex].g_iHumanMode = -1; - g_esNecroSpecial[iIndex].g_flOpenAreasOnly = -1.0; - g_esNecroSpecial[iIndex].g_iRequiresHumans = -1; - g_esNecroSpecial[iIndex].g_iNecroAbility = -1; - g_esNecroSpecial[iIndex].g_iNecroMessage = -1; - g_esNecroSpecial[iIndex].g_flNecroChance = -1.0; - g_esNecroSpecial[iIndex].g_iNecroCooldown = -1; - g_esNecroSpecial[iIndex].g_iNecroDuration = -1; - g_esNecroSpecial[iIndex].g_flNecroRange = -1.0; - g_esNecroSpecial[iIndex].g_iNecroSight = -1; - } - } - case 3: - { - for (int iPlayer = 1; iPlayer <= MaxClients; iPlayer++) - { - g_esNecroPlayer[iPlayer].g_iAccessFlags = -1; - g_esNecroPlayer[iPlayer].g_flCloseAreasOnly = -1.0; - g_esNecroPlayer[iPlayer].g_iComboAbility = -1; - g_esNecroPlayer[iPlayer].g_iHumanAbility = -1; - g_esNecroPlayer[iPlayer].g_iHumanAmmo = -1; - g_esNecroPlayer[iPlayer].g_iHumanCooldown = -1; - g_esNecroPlayer[iPlayer].g_iHumanDuration = -1; - g_esNecroPlayer[iPlayer].g_iHumanMode = -1; - g_esNecroPlayer[iPlayer].g_flOpenAreasOnly = -1.0; - g_esNecroPlayer[iPlayer].g_iRequiresHumans = -1; - g_esNecroPlayer[iPlayer].g_iNecroAbility = -1; - g_esNecroPlayer[iPlayer].g_iNecroMessage = -1; - g_esNecroPlayer[iPlayer].g_flNecroChance = -1.0; - g_esNecroPlayer[iPlayer].g_iNecroCooldown = -1; - g_esNecroPlayer[iPlayer].g_iNecroDuration = -1; - g_esNecroPlayer[iPlayer].g_flNecroRange = -1.0; - g_esNecroPlayer[iPlayer].g_iNecroSight = -1; - - g_esNecroTeammate[iPlayer].g_flCloseAreasOnly = -1.0; - g_esNecroTeammate[iPlayer].g_iComboAbility = -1; - g_esNecroTeammate[iPlayer].g_iHumanAbility = -1; - g_esNecroTeammate[iPlayer].g_iHumanAmmo = -1; - g_esNecroTeammate[iPlayer].g_iHumanCooldown = -1; - g_esNecroTeammate[iPlayer].g_iHumanDuration = -1; - g_esNecroTeammate[iPlayer].g_iHumanMode = -1; - g_esNecroTeammate[iPlayer].g_flOpenAreasOnly = -1.0; - g_esNecroTeammate[iPlayer].g_iRequiresHumans = -1; - g_esNecroTeammate[iPlayer].g_iNecroAbility = -1; - g_esNecroTeammate[iPlayer].g_iNecroMessage = -1; - g_esNecroTeammate[iPlayer].g_flNecroChance = -1.0; - g_esNecroTeammate[iPlayer].g_iNecroCooldown = -1; - g_esNecroTeammate[iPlayer].g_iNecroDuration = -1; - g_esNecroTeammate[iPlayer].g_flNecroRange = -1.0; - g_esNecroTeammate[iPlayer].g_iNecroSight = -1; - } - } - } -} - -#if defined MT_ABILITIES_MAIN2 -void vNecroConfigsLoaded(const char[] subsection, const char[] key, const char[] value, int type, int admin, int mode, bool special, const char[] specsection) -#else -public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const char[] value, int type, int admin, int mode, bool special, const char[] specsection) -#endif -{ - if ((mode == -1 || mode == 3) && bIsValidClient(admin)) - { - if (special && specsection[0] != '\0') - { - g_esNecroTeammate[admin].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_NECRO_SECTION, MT_NECRO_SECTION2, MT_NECRO_SECTION3, MT_NECRO_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esNecroTeammate[admin].g_flCloseAreasOnly, value, -1.0, 99999.0); - g_esNecroTeammate[admin].g_iComboAbility = iGetKeyValue(subsection, MT_NECRO_SECTION, MT_NECRO_SECTION2, MT_NECRO_SECTION3, MT_NECRO_SECTION4, key, "ComboAbility", "Combo Ability", "Combo_Ability", "combo", g_esNecroTeammate[admin].g_iComboAbility, value, -1, 1); - g_esNecroTeammate[admin].g_iHumanAbility = iGetKeyValue(subsection, MT_NECRO_SECTION, MT_NECRO_SECTION2, MT_NECRO_SECTION3, MT_NECRO_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esNecroTeammate[admin].g_iHumanAbility, value, -1, 2); - g_esNecroTeammate[admin].g_iHumanAmmo = iGetKeyValue(subsection, MT_NECRO_SECTION, MT_NECRO_SECTION2, MT_NECRO_SECTION3, MT_NECRO_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esNecroTeammate[admin].g_iHumanAmmo, value, -1, 99999); - g_esNecroTeammate[admin].g_iHumanCooldown = iGetKeyValue(subsection, MT_NECRO_SECTION, MT_NECRO_SECTION2, MT_NECRO_SECTION3, MT_NECRO_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esNecroTeammate[admin].g_iHumanCooldown, value, -1, 99999); - g_esNecroTeammate[admin].g_iHumanDuration = iGetKeyValue(subsection, MT_NECRO_SECTION, MT_NECRO_SECTION2, MT_NECRO_SECTION3, MT_NECRO_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esNecroTeammate[admin].g_iHumanDuration, value, -1, 99999); - g_esNecroTeammate[admin].g_iHumanMode = iGetKeyValue(subsection, MT_NECRO_SECTION, MT_NECRO_SECTION2, MT_NECRO_SECTION3, MT_NECRO_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esNecroTeammate[admin].g_iHumanMode, value, -1, 1); - g_esNecroTeammate[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_NECRO_SECTION, MT_NECRO_SECTION2, MT_NECRO_SECTION3, MT_NECRO_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esNecroTeammate[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); - g_esNecroTeammate[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_NECRO_SECTION, MT_NECRO_SECTION2, MT_NECRO_SECTION3, MT_NECRO_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esNecroTeammate[admin].g_iRequiresHumans, value, -1, 32); - g_esNecroTeammate[admin].g_iNecroAbility = iGetKeyValue(subsection, MT_NECRO_SECTION, MT_NECRO_SECTION2, MT_NECRO_SECTION3, MT_NECRO_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esNecroTeammate[admin].g_iNecroAbility, value, -1, 1); - g_esNecroTeammate[admin].g_iNecroMessage = iGetKeyValue(subsection, MT_NECRO_SECTION, MT_NECRO_SECTION2, MT_NECRO_SECTION3, MT_NECRO_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esNecroTeammate[admin].g_iNecroMessage, value, -1, 1); - g_esNecroTeammate[admin].g_iNecroSight = iGetKeyValue(subsection, MT_NECRO_SECTION, MT_NECRO_SECTION2, MT_NECRO_SECTION3, MT_NECRO_SECTION4, key, "AbilitySight", "Ability Sight", "Ability_Sight", "sight", g_esNecroTeammate[admin].g_iNecroSight, value, -1, 5); - g_esNecroTeammate[admin].g_flNecroChance = flGetKeyValue(subsection, MT_NECRO_SECTION, MT_NECRO_SECTION2, MT_NECRO_SECTION3, MT_NECRO_SECTION4, key, "NecroChance", "Necro Chance", "Necro_Chance", "chance", g_esNecroTeammate[admin].g_flNecroChance, value, -1.0, 100.0); - g_esNecroTeammate[admin].g_iNecroCooldown = iGetKeyValue(subsection, MT_NECRO_SECTION, MT_NECRO_SECTION2, MT_NECRO_SECTION3, MT_NECRO_SECTION4, key, "NecroCooldown", "Necro Cooldown", "Necro_Cooldown", "cooldown", g_esNecroTeammate[admin].g_iNecroCooldown, value, -1, 99999); - g_esNecroTeammate[admin].g_iNecroDuration = iGetKeyValue(subsection, MT_NECRO_SECTION, MT_NECRO_SECTION2, MT_NECRO_SECTION3, MT_NECRO_SECTION4, key, "NecroDuration", "Necro Duration", "Necro_Duration", "duration", g_esNecroTeammate[admin].g_iNecroDuration, value, -1, 99999); - g_esNecroTeammate[admin].g_flNecroRange = flGetKeyValue(subsection, MT_NECRO_SECTION, MT_NECRO_SECTION2, MT_NECRO_SECTION3, MT_NECRO_SECTION4, key, "NecroRange", "Necro Range", "Necro_Range", "range", g_esNecroTeammate[admin].g_flNecroRange, value, -1.0, 99999.0); - } - else - { - g_esNecroPlayer[admin].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_NECRO_SECTION, MT_NECRO_SECTION2, MT_NECRO_SECTION3, MT_NECRO_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esNecroPlayer[admin].g_flCloseAreasOnly, value, -1.0, 99999.0); - g_esNecroPlayer[admin].g_iComboAbility = iGetKeyValue(subsection, MT_NECRO_SECTION, MT_NECRO_SECTION2, MT_NECRO_SECTION3, MT_NECRO_SECTION4, key, "ComboAbility", "Combo Ability", "Combo_Ability", "combo", g_esNecroPlayer[admin].g_iComboAbility, value, -1, 1); - g_esNecroPlayer[admin].g_iHumanAbility = iGetKeyValue(subsection, MT_NECRO_SECTION, MT_NECRO_SECTION2, MT_NECRO_SECTION3, MT_NECRO_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esNecroPlayer[admin].g_iHumanAbility, value, -1, 2); - g_esNecroPlayer[admin].g_iHumanAmmo = iGetKeyValue(subsection, MT_NECRO_SECTION, MT_NECRO_SECTION2, MT_NECRO_SECTION3, MT_NECRO_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esNecroPlayer[admin].g_iHumanAmmo, value, -1, 99999); - g_esNecroPlayer[admin].g_iHumanCooldown = iGetKeyValue(subsection, MT_NECRO_SECTION, MT_NECRO_SECTION2, MT_NECRO_SECTION3, MT_NECRO_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esNecroPlayer[admin].g_iHumanCooldown, value, -1, 99999); - g_esNecroPlayer[admin].g_iHumanDuration = iGetKeyValue(subsection, MT_NECRO_SECTION, MT_NECRO_SECTION2, MT_NECRO_SECTION3, MT_NECRO_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esNecroPlayer[admin].g_iHumanDuration, value, -1, 99999); - g_esNecroPlayer[admin].g_iHumanMode = iGetKeyValue(subsection, MT_NECRO_SECTION, MT_NECRO_SECTION2, MT_NECRO_SECTION3, MT_NECRO_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esNecroPlayer[admin].g_iHumanMode, value, -1, 1); - g_esNecroPlayer[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_NECRO_SECTION, MT_NECRO_SECTION2, MT_NECRO_SECTION3, MT_NECRO_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esNecroPlayer[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); - g_esNecroPlayer[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_NECRO_SECTION, MT_NECRO_SECTION2, MT_NECRO_SECTION3, MT_NECRO_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esNecroPlayer[admin].g_iRequiresHumans, value, -1, 32); - g_esNecroPlayer[admin].g_iNecroAbility = iGetKeyValue(subsection, MT_NECRO_SECTION, MT_NECRO_SECTION2, MT_NECRO_SECTION3, MT_NECRO_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esNecroPlayer[admin].g_iNecroAbility, value, -1, 1); - g_esNecroPlayer[admin].g_iNecroMessage = iGetKeyValue(subsection, MT_NECRO_SECTION, MT_NECRO_SECTION2, MT_NECRO_SECTION3, MT_NECRO_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esNecroPlayer[admin].g_iNecroMessage, value, -1, 1); - g_esNecroPlayer[admin].g_iNecroSight = iGetKeyValue(subsection, MT_NECRO_SECTION, MT_NECRO_SECTION2, MT_NECRO_SECTION3, MT_NECRO_SECTION4, key, "AbilitySight", "Ability Sight", "Ability_Sight", "sight", g_esNecroPlayer[admin].g_iNecroSight, value, -1, 5); - g_esNecroPlayer[admin].g_flNecroChance = flGetKeyValue(subsection, MT_NECRO_SECTION, MT_NECRO_SECTION2, MT_NECRO_SECTION3, MT_NECRO_SECTION4, key, "NecroChance", "Necro Chance", "Necro_Chance", "chance", g_esNecroPlayer[admin].g_flNecroChance, value, -1.0, 100.0); - g_esNecroPlayer[admin].g_iNecroCooldown = iGetKeyValue(subsection, MT_NECRO_SECTION, MT_NECRO_SECTION2, MT_NECRO_SECTION3, MT_NECRO_SECTION4, key, "NecroCooldown", "Necro Cooldown", "Necro_Cooldown", "cooldown", g_esNecroPlayer[admin].g_iNecroCooldown, value, -1, 99999); - g_esNecroPlayer[admin].g_iNecroDuration = iGetKeyValue(subsection, MT_NECRO_SECTION, MT_NECRO_SECTION2, MT_NECRO_SECTION3, MT_NECRO_SECTION4, key, "NecroDuration", "Necro Duration", "Necro_Duration", "duration", g_esNecroPlayer[admin].g_iNecroDuration, value, -1, 99999); - g_esNecroPlayer[admin].g_flNecroRange = flGetKeyValue(subsection, MT_NECRO_SECTION, MT_NECRO_SECTION2, MT_NECRO_SECTION3, MT_NECRO_SECTION4, key, "NecroRange", "Necro Range", "Necro_Range", "range", g_esNecroPlayer[admin].g_flNecroRange, value, -1.0, 99999.0); - g_esNecroPlayer[admin].g_iAccessFlags = iGetAdminFlagsValue(subsection, MT_NECRO_SECTION, MT_NECRO_SECTION2, MT_NECRO_SECTION3, MT_NECRO_SECTION4, key, "AccessFlags", "Access Flags", "Access_Flags", "access", value); - } - } - - if (mode < 3 && type > 0) - { - if (special && specsection[0] != '\0') - { - g_esNecroSpecial[type].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_NECRO_SECTION, MT_NECRO_SECTION2, MT_NECRO_SECTION3, MT_NECRO_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esNecroSpecial[type].g_flCloseAreasOnly, value, -1.0, 99999.0); - g_esNecroSpecial[type].g_iComboAbility = iGetKeyValue(subsection, MT_NECRO_SECTION, MT_NECRO_SECTION2, MT_NECRO_SECTION3, MT_NECRO_SECTION4, key, "ComboAbility", "Combo Ability", "Combo_Ability", "combo", g_esNecroSpecial[type].g_iComboAbility, value, -1, 1); - g_esNecroSpecial[type].g_iHumanAbility = iGetKeyValue(subsection, MT_NECRO_SECTION, MT_NECRO_SECTION2, MT_NECRO_SECTION3, MT_NECRO_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esNecroSpecial[type].g_iHumanAbility, value, -1, 2); - g_esNecroSpecial[type].g_iHumanAmmo = iGetKeyValue(subsection, MT_NECRO_SECTION, MT_NECRO_SECTION2, MT_NECRO_SECTION3, MT_NECRO_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esNecroSpecial[type].g_iHumanAmmo, value, -1, 99999); - g_esNecroSpecial[type].g_iHumanCooldown = iGetKeyValue(subsection, MT_NECRO_SECTION, MT_NECRO_SECTION2, MT_NECRO_SECTION3, MT_NECRO_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esNecroSpecial[type].g_iHumanCooldown, value, -1, 99999); - g_esNecroSpecial[type].g_iHumanDuration = iGetKeyValue(subsection, MT_NECRO_SECTION, MT_NECRO_SECTION2, MT_NECRO_SECTION3, MT_NECRO_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esNecroSpecial[type].g_iHumanDuration, value, -1, 99999); - g_esNecroSpecial[type].g_iHumanMode = iGetKeyValue(subsection, MT_NECRO_SECTION, MT_NECRO_SECTION2, MT_NECRO_SECTION3, MT_NECRO_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esNecroSpecial[type].g_iHumanMode, value, -1, 1); - g_esNecroSpecial[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_NECRO_SECTION, MT_NECRO_SECTION2, MT_NECRO_SECTION3, MT_NECRO_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esNecroSpecial[type].g_flOpenAreasOnly, value, -1.0, 99999.0); - g_esNecroSpecial[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_NECRO_SECTION, MT_NECRO_SECTION2, MT_NECRO_SECTION3, MT_NECRO_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esNecroSpecial[type].g_iRequiresHumans, value, -1, 32); - g_esNecroSpecial[type].g_iNecroAbility = iGetKeyValue(subsection, MT_NECRO_SECTION, MT_NECRO_SECTION2, MT_NECRO_SECTION3, MT_NECRO_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esNecroSpecial[type].g_iNecroAbility, value, -1, 1); - g_esNecroSpecial[type].g_iNecroMessage = iGetKeyValue(subsection, MT_NECRO_SECTION, MT_NECRO_SECTION2, MT_NECRO_SECTION3, MT_NECRO_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esNecroSpecial[type].g_iNecroMessage, value, -1, 1); - g_esNecroSpecial[type].g_iNecroSight = iGetKeyValue(subsection, MT_NECRO_SECTION, MT_NECRO_SECTION2, MT_NECRO_SECTION3, MT_NECRO_SECTION4, key, "AbilitySight", "Ability Sight", "Ability_Sight", "sight", g_esNecroSpecial[type].g_iNecroSight, value, -1, 5); - g_esNecroSpecial[type].g_flNecroChance = flGetKeyValue(subsection, MT_NECRO_SECTION, MT_NECRO_SECTION2, MT_NECRO_SECTION3, MT_NECRO_SECTION4, key, "NecroChance", "Necro Chance", "Necro_Chance", "chance", g_esNecroSpecial[type].g_flNecroChance, value, -1.0, 100.0); - g_esNecroSpecial[type].g_iNecroCooldown = iGetKeyValue(subsection, MT_NECRO_SECTION, MT_NECRO_SECTION2, MT_NECRO_SECTION3, MT_NECRO_SECTION4, key, "NecroCooldown", "Necro Cooldown", "Necro_Cooldown", "cooldown", g_esNecroSpecial[type].g_iNecroCooldown, value, -1, 99999); - g_esNecroSpecial[type].g_iNecroDuration = iGetKeyValue(subsection, MT_NECRO_SECTION, MT_NECRO_SECTION2, MT_NECRO_SECTION3, MT_NECRO_SECTION4, key, "NecroDuration", "Necro Duration", "Necro_Duration", "duration", g_esNecroSpecial[type].g_iNecroDuration, value, -1, 99999); - g_esNecroSpecial[type].g_flNecroRange = flGetKeyValue(subsection, MT_NECRO_SECTION, MT_NECRO_SECTION2, MT_NECRO_SECTION3, MT_NECRO_SECTION4, key, "NecroRange", "Necro Range", "Necro_Range", "range", g_esNecroSpecial[type].g_flNecroRange, value, -1.0, 99999.0); - } - else - { - g_esNecroAbility[type].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_NECRO_SECTION, MT_NECRO_SECTION2, MT_NECRO_SECTION3, MT_NECRO_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esNecroAbility[type].g_flCloseAreasOnly, value, -1.0, 99999.0); - g_esNecroAbility[type].g_iComboAbility = iGetKeyValue(subsection, MT_NECRO_SECTION, MT_NECRO_SECTION2, MT_NECRO_SECTION3, MT_NECRO_SECTION4, key, "ComboAbility", "Combo Ability", "Combo_Ability", "combo", g_esNecroAbility[type].g_iComboAbility, value, -1, 1); - g_esNecroAbility[type].g_iHumanAbility = iGetKeyValue(subsection, MT_NECRO_SECTION, MT_NECRO_SECTION2, MT_NECRO_SECTION3, MT_NECRO_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esNecroAbility[type].g_iHumanAbility, value, -1, 2); - g_esNecroAbility[type].g_iHumanAmmo = iGetKeyValue(subsection, MT_NECRO_SECTION, MT_NECRO_SECTION2, MT_NECRO_SECTION3, MT_NECRO_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esNecroAbility[type].g_iHumanAmmo, value, -1, 99999); - g_esNecroAbility[type].g_iHumanCooldown = iGetKeyValue(subsection, MT_NECRO_SECTION, MT_NECRO_SECTION2, MT_NECRO_SECTION3, MT_NECRO_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esNecroAbility[type].g_iHumanCooldown, value, -1, 99999); - g_esNecroAbility[type].g_iHumanDuration = iGetKeyValue(subsection, MT_NECRO_SECTION, MT_NECRO_SECTION2, MT_NECRO_SECTION3, MT_NECRO_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esNecroAbility[type].g_iHumanDuration, value, -1, 99999); - g_esNecroAbility[type].g_iHumanMode = iGetKeyValue(subsection, MT_NECRO_SECTION, MT_NECRO_SECTION2, MT_NECRO_SECTION3, MT_NECRO_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esNecroAbility[type].g_iHumanMode, value, -1, 1); - g_esNecroAbility[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_NECRO_SECTION, MT_NECRO_SECTION2, MT_NECRO_SECTION3, MT_NECRO_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esNecroAbility[type].g_flOpenAreasOnly, value, -1.0, 99999.0); - g_esNecroAbility[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_NECRO_SECTION, MT_NECRO_SECTION2, MT_NECRO_SECTION3, MT_NECRO_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esNecroAbility[type].g_iRequiresHumans, value, -1, 32); - g_esNecroAbility[type].g_iNecroAbility = iGetKeyValue(subsection, MT_NECRO_SECTION, MT_NECRO_SECTION2, MT_NECRO_SECTION3, MT_NECRO_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esNecroAbility[type].g_iNecroAbility, value, -1, 1); - g_esNecroAbility[type].g_iNecroMessage = iGetKeyValue(subsection, MT_NECRO_SECTION, MT_NECRO_SECTION2, MT_NECRO_SECTION3, MT_NECRO_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esNecroAbility[type].g_iNecroMessage, value, -1, 1); - g_esNecroAbility[type].g_iNecroSight = iGetKeyValue(subsection, MT_NECRO_SECTION, MT_NECRO_SECTION2, MT_NECRO_SECTION3, MT_NECRO_SECTION4, key, "AbilitySight", "Ability Sight", "Ability_Sight", "sight", g_esNecroAbility[type].g_iNecroSight, value, -1, 5); - g_esNecroAbility[type].g_flNecroChance = flGetKeyValue(subsection, MT_NECRO_SECTION, MT_NECRO_SECTION2, MT_NECRO_SECTION3, MT_NECRO_SECTION4, key, "NecroChance", "Necro Chance", "Necro_Chance", "chance", g_esNecroAbility[type].g_flNecroChance, value, -1.0, 100.0); - g_esNecroAbility[type].g_iNecroCooldown = iGetKeyValue(subsection, MT_NECRO_SECTION, MT_NECRO_SECTION2, MT_NECRO_SECTION3, MT_NECRO_SECTION4, key, "NecroCooldown", "Necro Cooldown", "Necro_Cooldown", "cooldown", g_esNecroAbility[type].g_iNecroCooldown, value, -1, 99999); - g_esNecroAbility[type].g_iNecroDuration = iGetKeyValue(subsection, MT_NECRO_SECTION, MT_NECRO_SECTION2, MT_NECRO_SECTION3, MT_NECRO_SECTION4, key, "NecroDuration", "Necro Duration", "Necro_Duration", "duration", g_esNecroAbility[type].g_iNecroDuration, value, -1, 99999); - g_esNecroAbility[type].g_flNecroRange = flGetKeyValue(subsection, MT_NECRO_SECTION, MT_NECRO_SECTION2, MT_NECRO_SECTION3, MT_NECRO_SECTION4, key, "NecroRange", "Necro Range", "Necro_Range", "range", g_esNecroAbility[type].g_flNecroRange, value, -1.0, 99999.0); - g_esNecroAbility[type].g_iAccessFlags = iGetAdminFlagsValue(subsection, MT_NECRO_SECTION, MT_NECRO_SECTION2, MT_NECRO_SECTION3, MT_NECRO_SECTION4, key, "AccessFlags", "Access Flags", "Access_Flags", "access", value); - } - } -} - -#if defined MT_ABILITIES_MAIN2 -void vNecroSettingsCached(int tank, bool apply, int type) -#else -public void MT_OnSettingsCached(int tank, bool apply, int type) -#endif -{ - bool bHuman = bIsValidClient(tank, MT_CHECK_FAKECLIENT); - g_esNecroPlayer[tank].g_iTankTypeRecorded = apply ? MT_GetRecordedTankType(tank, type) : 0; - g_esNecroPlayer[tank].g_iTankType = apply ? type : 0; - int iType = g_esNecroPlayer[tank].g_iTankTypeRecorded; - - if (bIsSpecialInfected(tank, MT_CHECK_INDEX|MT_CHECK_INGAME)) - { - g_esNecroCache[tank].g_flCloseAreasOnly = flGetSubSettingValue(apply, bHuman, g_esNecroTeammate[tank].g_flCloseAreasOnly, g_esNecroPlayer[tank].g_flCloseAreasOnly, g_esNecroSpecial[iType].g_flCloseAreasOnly, g_esNecroAbility[iType].g_flCloseAreasOnly, 1); - g_esNecroCache[tank].g_iComboAbility = iGetSubSettingValue(apply, bHuman, g_esNecroTeammate[tank].g_iComboAbility, g_esNecroPlayer[tank].g_iComboAbility, g_esNecroSpecial[iType].g_iComboAbility, g_esNecroAbility[iType].g_iComboAbility, 1); - g_esNecroCache[tank].g_flNecroChance = flGetSubSettingValue(apply, bHuman, g_esNecroTeammate[tank].g_flNecroChance, g_esNecroPlayer[tank].g_flNecroChance, g_esNecroSpecial[iType].g_flNecroChance, g_esNecroAbility[iType].g_flNecroChance, 1); - g_esNecroCache[tank].g_flNecroRange = flGetSubSettingValue(apply, bHuman, g_esNecroTeammate[tank].g_flNecroRange, g_esNecroPlayer[tank].g_flNecroRange, g_esNecroSpecial[iType].g_flNecroRange, g_esNecroAbility[iType].g_flNecroRange, 1); - g_esNecroCache[tank].g_iHumanAbility = iGetSubSettingValue(apply, bHuman, g_esNecroTeammate[tank].g_iHumanAbility, g_esNecroPlayer[tank].g_iHumanAbility, g_esNecroSpecial[iType].g_iHumanAbility, g_esNecroAbility[iType].g_iHumanAbility, 1); - g_esNecroCache[tank].g_iHumanAmmo = iGetSubSettingValue(apply, bHuman, g_esNecroTeammate[tank].g_iHumanAmmo, g_esNecroPlayer[tank].g_iHumanAmmo, g_esNecroSpecial[iType].g_iHumanAmmo, g_esNecroAbility[iType].g_iHumanAmmo, 1); - g_esNecroCache[tank].g_iHumanCooldown = iGetSubSettingValue(apply, bHuman, g_esNecroTeammate[tank].g_iHumanCooldown, g_esNecroPlayer[tank].g_iHumanCooldown, g_esNecroSpecial[iType].g_iHumanCooldown, g_esNecroAbility[iType].g_iHumanCooldown, 1); - g_esNecroCache[tank].g_iHumanDuration = iGetSubSettingValue(apply, bHuman, g_esNecroTeammate[tank].g_iHumanDuration, g_esNecroPlayer[tank].g_iHumanDuration, g_esNecroSpecial[iType].g_iHumanDuration, g_esNecroAbility[iType].g_iHumanDuration, 1); - g_esNecroCache[tank].g_iHumanMode = iGetSubSettingValue(apply, bHuman, g_esNecroTeammate[tank].g_iHumanMode, g_esNecroPlayer[tank].g_iHumanMode, g_esNecroSpecial[iType].g_iHumanMode, g_esNecroAbility[iType].g_iHumanMode, 1); - g_esNecroCache[tank].g_iNecroAbility = iGetSubSettingValue(apply, bHuman, g_esNecroTeammate[tank].g_iNecroAbility, g_esNecroPlayer[tank].g_iNecroAbility, g_esNecroSpecial[iType].g_iNecroAbility, g_esNecroAbility[iType].g_iNecroAbility, 1); - g_esNecroCache[tank].g_iNecroCooldown = iGetSubSettingValue(apply, bHuman, g_esNecroTeammate[tank].g_iNecroCooldown, g_esNecroPlayer[tank].g_iNecroCooldown, g_esNecroSpecial[iType].g_iNecroCooldown, g_esNecroAbility[iType].g_iNecroCooldown, 1); - g_esNecroCache[tank].g_iNecroDuration = iGetSubSettingValue(apply, bHuman, g_esNecroTeammate[tank].g_iNecroDuration, g_esNecroPlayer[tank].g_iNecroDuration, g_esNecroSpecial[iType].g_iNecroDuration, g_esNecroAbility[iType].g_iNecroDuration, 1); - g_esNecroCache[tank].g_iNecroMessage = iGetSubSettingValue(apply, bHuman, g_esNecroTeammate[tank].g_iNecroMessage, g_esNecroPlayer[tank].g_iNecroMessage, g_esNecroSpecial[iType].g_iNecroMessage, g_esNecroAbility[iType].g_iNecroMessage, 1); - g_esNecroCache[tank].g_iNecroSight = iGetSubSettingValue(apply, bHuman, g_esNecroTeammate[tank].g_iNecroSight, g_esNecroPlayer[tank].g_iNecroSight, g_esNecroSpecial[iType].g_iNecroSight, g_esNecroAbility[iType].g_iNecroSight, 1); - g_esNecroCache[tank].g_flOpenAreasOnly = flGetSubSettingValue(apply, bHuman, g_esNecroTeammate[tank].g_flOpenAreasOnly, g_esNecroPlayer[tank].g_flOpenAreasOnly, g_esNecroSpecial[iType].g_flOpenAreasOnly, g_esNecroAbility[iType].g_flOpenAreasOnly, 1); - g_esNecroCache[tank].g_iRequiresHumans = iGetSubSettingValue(apply, bHuman, g_esNecroTeammate[tank].g_iRequiresHumans, g_esNecroPlayer[tank].g_iRequiresHumans, g_esNecroSpecial[iType].g_iRequiresHumans, g_esNecroAbility[iType].g_iRequiresHumans, 1); - } - else - { - g_esNecroCache[tank].g_flCloseAreasOnly = flGetSettingValue(apply, bHuman, g_esNecroPlayer[tank].g_flCloseAreasOnly, g_esNecroAbility[iType].g_flCloseAreasOnly, 1); - g_esNecroCache[tank].g_iComboAbility = iGetSettingValue(apply, bHuman, g_esNecroPlayer[tank].g_iComboAbility, g_esNecroAbility[iType].g_iComboAbility, 1); - g_esNecroCache[tank].g_flNecroChance = flGetSettingValue(apply, bHuman, g_esNecroPlayer[tank].g_flNecroChance, g_esNecroAbility[iType].g_flNecroChance, 1); - g_esNecroCache[tank].g_flNecroRange = flGetSettingValue(apply, bHuman, g_esNecroPlayer[tank].g_flNecroRange, g_esNecroAbility[iType].g_flNecroRange, 1); - g_esNecroCache[tank].g_iHumanAbility = iGetSettingValue(apply, bHuman, g_esNecroPlayer[tank].g_iHumanAbility, g_esNecroAbility[iType].g_iHumanAbility, 1); - g_esNecroCache[tank].g_iHumanAmmo = iGetSettingValue(apply, bHuman, g_esNecroPlayer[tank].g_iHumanAmmo, g_esNecroAbility[iType].g_iHumanAmmo, 1); - g_esNecroCache[tank].g_iHumanCooldown = iGetSettingValue(apply, bHuman, g_esNecroPlayer[tank].g_iHumanCooldown, g_esNecroAbility[iType].g_iHumanCooldown, 1); - g_esNecroCache[tank].g_iHumanDuration = iGetSettingValue(apply, bHuman, g_esNecroPlayer[tank].g_iHumanDuration, g_esNecroAbility[iType].g_iHumanDuration, 1); - g_esNecroCache[tank].g_iHumanMode = iGetSettingValue(apply, bHuman, g_esNecroPlayer[tank].g_iHumanMode, g_esNecroAbility[iType].g_iHumanMode, 1); - g_esNecroCache[tank].g_iNecroAbility = iGetSettingValue(apply, bHuman, g_esNecroPlayer[tank].g_iNecroAbility, g_esNecroAbility[iType].g_iNecroAbility, 1); - g_esNecroCache[tank].g_iNecroCooldown = iGetSettingValue(apply, bHuman, g_esNecroPlayer[tank].g_iNecroCooldown, g_esNecroAbility[iType].g_iNecroCooldown, 1); - g_esNecroCache[tank].g_iNecroDuration = iGetSettingValue(apply, bHuman, g_esNecroPlayer[tank].g_iNecroDuration, g_esNecroAbility[iType].g_iNecroDuration, 1); - g_esNecroCache[tank].g_iNecroMessage = iGetSettingValue(apply, bHuman, g_esNecroPlayer[tank].g_iNecroMessage, g_esNecroAbility[iType].g_iNecroMessage, 1); - g_esNecroCache[tank].g_iNecroSight = iGetSettingValue(apply, bHuman, g_esNecroPlayer[tank].g_iNecroSight, g_esNecroAbility[iType].g_iNecroSight, 1); - g_esNecroCache[tank].g_flOpenAreasOnly = flGetSettingValue(apply, bHuman, g_esNecroPlayer[tank].g_flOpenAreasOnly, g_esNecroAbility[iType].g_flOpenAreasOnly, 1); - g_esNecroCache[tank].g_iRequiresHumans = iGetSettingValue(apply, bHuman, g_esNecroPlayer[tank].g_iRequiresHumans, g_esNecroAbility[iType].g_iRequiresHumans, 1); - } -} - -#if defined MT_ABILITIES_MAIN2 -void vNecroCopyStats(int oldTank, int newTank) -#else -public void MT_OnCopyStats(int oldTank, int newTank) -#endif -{ - vNecroCopyStats2(oldTank, newTank); - - if (oldTank != newTank) - { - vRemoveNecro(oldTank); - } -} - -#if !defined MT_ABILITIES_MAIN2 -public void MT_OnPluginUpdate() -{ - MT_ReloadPlugin(null); -} -#endif - -#if defined MT_ABILITIES_MAIN2 -void vNecroEventFired(Event event, const char[] name) -#else -public void MT_OnEventFired(Event event, const char[] name, bool dontBroadcast) -#endif -{ - if (StrEqual(name, "bot_player_replace")) - { - int iBotId = event.GetInt("bot"), iBot = GetClientOfUserId(iBotId), - iTankId = event.GetInt("player"), iTank = GetClientOfUserId(iTankId); - if (bIsValidClient(iBot) && bIsInfected(iTank)) - { - vNecroCopyStats2(iBot, iTank); - vRemoveNecro(iBot); - } - } - else if (StrEqual(name, "mission_lost") || StrEqual(name, "round_start") || StrEqual(name, "round_end")) - { - vNecroReset(); - } - else if (StrEqual(name, "player_bot_replace")) - { - int iTankId = event.GetInt("player"), iTank = GetClientOfUserId(iTankId), - iBotId = event.GetInt("bot"), iBot = GetClientOfUserId(iBotId); - if (bIsValidClient(iTank) && bIsInfected(iBot)) - { - vNecroCopyStats2(iTank, iBot); - vRemoveNecro(iTank); - } - } - else if (StrEqual(name, "player_death")) - { - int iTankId = event.GetInt("userid"), iTank = GetClientOfUserId(iTankId); - if (MT_IsTankSupported(iTank, MT_CHECK_INDEX|MT_CHECK_INGAME)) - { - vRemoveNecro(iTank); - } - } -} - -#if defined MT_ABILITIES_MAIN2 -void vNecroPlayerEventKilled(int victim) -#else -public void MT_OnPlayerEventKilled(int victim, int attacker) -#endif -{ - if (bIsSpecialInfected(victim, MT_CHECK_INDEX|MT_CHECK_INGAME)) - { - bool bRandom = false; - float flInfectedPos[3], flTankPos[3], flRange = 0.0; - int iPos = -1, iClass = 0, iTime = GetTime(); - GetClientAbsOrigin(victim, flInfectedPos); - for (int iTank = 1; iTank <= MaxClients; iTank++) - { - if (MT_IsTankSupported(iTank) && MT_IsCustomTankSupported(iTank) && g_esNecroPlayer[iTank].g_bActivated) - { - if ((g_esNecroPlayer[iTank].g_iCooldown != -1 && g_esNecroPlayer[iTank].g_iCooldown >= iTime) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esNecroAbility[g_esNecroPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esNecroPlayer[iTank].g_iAccessFlags))) - { - continue; - } - - iPos = g_esNecroAbility[g_esNecroPlayer[iTank].g_iTankTypeRecorded].g_iComboPosition; - bRandom = (iPos != -1) ? true : GetRandomFloat(0.1, 100.0) <= g_esNecroCache[iTank].g_flNecroChance; - if (g_esNecroCache[iTank].g_iNecroAbility == 1 && bRandom) - { - flRange = (iPos != -1) ? MT_GetCombinationSetting(iTank, 9, iPos) : g_esNecroCache[iTank].g_flNecroRange; - GetClientAbsOrigin(iTank, flTankPos); - if (GetVectorDistance(flInfectedPos, flTankPos) <= flRange && bIsVisibleToPlayer(iTank, victim, g_esNecroCache[iTank].g_iNecroSight, .range = flRange)) - { - iClass = GetEntProp(victim, Prop_Send, "m_zombieClass"); - - switch (iClass) - { - case 1: vNecro(iTank, flInfectedPos, "smoker"); - case 2: vNecro(iTank, flInfectedPos, "boomer"); - case 3: vNecro(iTank, flInfectedPos, "hunter"); - case 4, 5, 6: - { - if (g_bSecondGame) - { - switch (iClass) - { - case 4: vNecro(iTank, flInfectedPos, "spitter"); - case 5: vNecro(iTank, flInfectedPos, "jockey"); - case 6: vNecro(iTank, flInfectedPos, "charger"); - } - } - } - } - } - } - - break; - } - } - } -} - -#if defined MT_ABILITIES_MAIN2 -void vNecroAbilityActivated(int tank) -#else -public void MT_OnAbilityActivated(int tank) -#endif -{ - if (MT_IsTankSupported(tank, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_FAKECLIENT) && ((!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esNecroAbility[g_esNecroPlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esNecroPlayer[tank].g_iAccessFlags)) || g_esNecroCache[tank].g_iHumanAbility == 0)) - { - return; - } - - if (MT_IsTankSupported(tank) && (!bIsInfected(tank, MT_CHECK_FAKECLIENT) || g_esNecroCache[tank].g_iHumanAbility != 1) && MT_IsCustomTankSupported(tank) && g_esNecroCache[tank].g_iNecroAbility == 1 && g_esNecroCache[tank].g_iComboAbility == 0 && !g_esNecroPlayer[tank].g_bActivated) - { - vNecroAbility(tank); - } -} - -#if defined MT_ABILITIES_MAIN2 -void vNecroButtonPressed(int tank, int button) -#else -public void MT_OnButtonPressed(int tank, int button) -#endif -{ - if (MT_IsTankSupported(tank, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_ALIVE|MT_CHECK_FAKECLIENT) && MT_IsCustomTankSupported(tank)) - { - if (bIsAreaNarrow(tank, g_esNecroCache[tank].g_flOpenAreasOnly) || bIsAreaWide(tank, g_esNecroCache[tank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esNecroPlayer[tank].g_iTankType, tank) || (g_esNecroCache[tank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esNecroCache[tank].g_iRequiresHumans) || (!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esNecroAbility[g_esNecroPlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esNecroPlayer[tank].g_iAccessFlags))) - { - return; - } - - if ((button & MT_MAIN_KEY) && g_esNecroCache[tank].g_iNecroAbility == 1 && g_esNecroCache[tank].g_iHumanAbility == 1) - { - int iTime = GetTime(); - bool bRecharging = g_esNecroPlayer[tank].g_iCooldown != -1 && g_esNecroPlayer[tank].g_iCooldown >= iTime; - - switch (g_esNecroCache[tank].g_iHumanMode) - { - case 0: - { - if (!g_esNecroPlayer[tank].g_bActivated && !bRecharging) - { - vNecroAbility(tank); - } - else if (g_esNecroPlayer[tank].g_bActivated) - { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "NecroHuman3"); - } - else if (bRecharging) - { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "NecroHuman4", (g_esNecroPlayer[tank].g_iCooldown - iTime)); - } - } - case 1: - { - if (g_esNecroPlayer[tank].g_iAmmoCount < g_esNecroCache[tank].g_iHumanAmmo && g_esNecroCache[tank].g_iHumanAmmo > 0) - { - if (!g_esNecroPlayer[tank].g_bActivated && !bRecharging) - { - g_esNecroPlayer[tank].g_bActivated = true; - g_esNecroPlayer[tank].g_iAmmoCount++; - - MT_PrintToChat(tank, "%s %t", MT_TAG3, "NecroHuman", g_esNecroPlayer[tank].g_iAmmoCount, g_esNecroCache[tank].g_iHumanAmmo); - } - else if (g_esNecroPlayer[tank].g_bActivated) - { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "NecroHuman3"); - } - else if (bRecharging) - { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "NecroHuman4", (g_esNecroPlayer[tank].g_iCooldown - iTime)); - } - } - else - { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "NecroAmmo"); - } - } - } - } - } -} - -#if defined MT_ABILITIES_MAIN2 -void vNecroButtonReleased(int tank, int button) -#else -public void MT_OnButtonReleased(int tank, int button) -#endif -{ - if (MT_IsTankSupported(tank, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_ALIVE|MT_CHECK_FAKECLIENT) && g_esNecroCache[tank].g_iHumanAbility == 1) - { - if ((button & MT_MAIN_KEY) && g_esNecroCache[tank].g_iHumanMode == 1 && g_esNecroPlayer[tank].g_bActivated && (g_esNecroPlayer[tank].g_iCooldown == -1 || g_esNecroPlayer[tank].g_iCooldown <= GetTime())) - { - g_esNecroPlayer[tank].g_bActivated = false; - - vNecroReset2(tank); - } - } -} - -#if defined MT_ABILITIES_MAIN2 -void vNecroChangeType(int tank, int oldType) -#else -public void MT_OnChangeType(int tank, int oldType, int newType, bool revert) -#endif -{ - if (oldType <= 0) - { - return; - } - - vRemoveNecro(tank); -} - -void vNecro(int tank, float pos[3], const char[] type) -{ - if (bIsAreaNarrow(tank, g_esNecroCache[tank].g_flOpenAreasOnly) || bIsAreaWide(tank, g_esNecroCache[tank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esNecroPlayer[tank].g_iTankType, tank) || (g_esNecroCache[tank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esNecroCache[tank].g_iRequiresHumans) || (!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esNecroAbility[g_esNecroPlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esNecroPlayer[tank].g_iAccessFlags))) - { - return; - } - - bool[] bExists = new bool[MaxClients + 1]; - for (int iSpecial = 1; iSpecial <= MaxClients; iSpecial++) - { - bExists[iSpecial] = false; - if (bIsSpecialInfected(iSpecial, MT_CHECK_INGAME)) - { - bExists[iSpecial] = true; - } - } - - vCheatCommand(tank, g_bSecondGame ? "z_spawn_old" : "z_spawn", type); - - int iInfected = 0; - for (int iSpecial = 1; iSpecial <= MaxClients; iSpecial++) - { - if (bIsSpecialInfected(iSpecial, MT_CHECK_INGAME|MT_CHECK_ALIVE) && !bExists[iSpecial]) - { - iInfected = iSpecial; - - break; - } - } - - if (bIsSpecialInfected(iInfected)) - { - TeleportEntity(iInfected, pos); - vAttachParticle(iInfected, PARTICLE_ELECTRICITY, 1.0); - EmitSoundToAll(SOUND_ELECTRICITY, iInfected); - - if (g_esNecroCache[tank].g_iNecroMessage == 1) - { - char sTankName[64]; - MT_GetTankName(tank, sTankName); - MT_PrintToChatAll("%s %t", MT_TAG2, "Necro", sTankName); - MT_LogMessage(MT_LOG_ABILITY, "%s %T", MT_TAG, "Necro", LANG_SERVER, sTankName); - } - } -} - -void vNecroAbility(int tank) -{ - int iTime = GetTime(); - if ((g_esNecroPlayer[tank].g_iCooldown != -1 && g_esNecroPlayer[tank].g_iCooldown >= iTime) || bIsAreaNarrow(tank, g_esNecroCache[tank].g_flOpenAreasOnly) || bIsAreaWide(tank, g_esNecroCache[tank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esNecroPlayer[tank].g_iTankType, tank) || (g_esNecroCache[tank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esNecroCache[tank].g_iRequiresHumans) || (!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esNecroAbility[g_esNecroPlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esNecroPlayer[tank].g_iAccessFlags))) - { - return; - } - - if (!bIsInfected(tank, MT_CHECK_FAKECLIENT) || (g_esNecroPlayer[tank].g_iAmmoCount < g_esNecroCache[tank].g_iHumanAmmo && g_esNecroCache[tank].g_iHumanAmmo > 0)) - { - if (GetRandomFloat(0.1, 100.0) <= g_esNecroCache[tank].g_flNecroChance) - { - g_esNecroPlayer[tank].g_bActivated = true; - - if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esNecroCache[tank].g_iHumanAbility == 1) - { - int iPos = g_esNecroAbility[g_esNecroPlayer[tank].g_iTankTypeRecorded].g_iComboPosition, iDuration = (iPos != -1) ? RoundToNearest(MT_GetCombinationSetting(tank, 5, iPos)) : g_esNecroCache[tank].g_iNecroDuration; - iDuration = (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esNecroCache[tank].g_iHumanAbility == 1) ? g_esNecroCache[tank].g_iHumanDuration : iDuration; - g_esNecroPlayer[tank].g_iAmmoCount++; - g_esNecroPlayer[tank].g_iDuration = (iTime + iDuration); - - MT_PrintToChat(tank, "%s %t", MT_TAG3, "NecroHuman", g_esNecroPlayer[tank].g_iAmmoCount, g_esNecroCache[tank].g_iHumanAmmo); - } - } - else if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esNecroCache[tank].g_iHumanAbility == 1) - { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "NecroHuman2"); - } - } - else if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esNecroCache[tank].g_iHumanAbility == 1) - { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "NecroAmmo"); - } -} - -void vNecroCopyStats2(int oldTank, int newTank) -{ - g_esNecroPlayer[newTank].g_iAmmoCount = g_esNecroPlayer[oldTank].g_iAmmoCount; - g_esNecroPlayer[newTank].g_iCooldown = g_esNecroPlayer[oldTank].g_iCooldown; -} - -void vRemoveNecro(int tank) -{ - g_esNecroPlayer[tank].g_bActivated = false; - g_esNecroPlayer[tank].g_iAmmoCount = 0; - g_esNecroPlayer[tank].g_iCooldown = -1; - g_esNecroPlayer[tank].g_iDuration = -1; -} - -void vNecroReset() -{ - for (int iPlayer = 1; iPlayer <= MaxClients; iPlayer++) - { - if (bIsValidClient(iPlayer, MT_CHECK_INGAME)) - { - vRemoveNecro(iPlayer); - } - } -} - -void vNecroReset2(int tank) -{ - int iTime = GetTime(), iPos = g_esNecroAbility[g_esNecroPlayer[tank].g_iTankTypeRecorded].g_iComboPosition, iCooldown = (iPos != -1) ? RoundToNearest(MT_GetCombinationSetting(tank, 2, iPos)) : g_esNecroCache[tank].g_iNecroCooldown; - iCooldown = (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esNecroCache[tank].g_iHumanAbility == 1 && g_esNecroCache[tank].g_iHumanMode == 0 && g_esNecroPlayer[tank].g_iAmmoCount < g_esNecroCache[tank].g_iHumanAmmo && g_esNecroCache[tank].g_iHumanAmmo > 0) ? g_esNecroCache[tank].g_iHumanCooldown : iCooldown; - g_esNecroPlayer[tank].g_iCooldown = (iTime + iCooldown); - if (g_esNecroPlayer[tank].g_iCooldown != -1 && g_esNecroPlayer[tank].g_iCooldown >= iTime) - { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "NecroHuman5", (g_esNecroPlayer[tank].g_iCooldown - iTime)); - } -} - -void tTimerNecroCombo(Handle timer, int userid) -{ - int iTank = GetClientOfUserId(userid); - if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esNecroAbility[g_esNecroPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esNecroPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esNecroPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esNecroCache[iTank].g_iNecroAbility == 0 || g_esNecroPlayer[iTank].g_bActivated) - { - return; - } - - g_esNecroPlayer[iTank].g_bActivated = true; -} \ No newline at end of file diff --git a/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_nullify.sp b/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_nullify.sp index 420704e3fe..83a210216e 100644 --- a/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_nullify.sp +++ b/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_nullify.sp @@ -1,6 +1,6 @@ /** - * Mutant Tanks: a L4D/L4D2 SourceMod Plugin - * Copyright (C) 2024 Alfred "Psyk0tik" Llagas + * Mutant Tanks: A L4D/L4D2 SourceMod Plugin + * Copyright (C) 2017-2025 Alfred "Psyk0tik" Llagas * * 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. * @@ -1174,35 +1174,37 @@ void vNullifyReset2(int tank) g_esNullifyPlayer[tank].g_iRangeCooldown = -1; } -void tTimerNullifyCombo(Handle timer, DataPack pack) +Action tTimerNullifyCombo(Handle timer, DataPack pack) { pack.Reset(); int iTank = GetClientOfUserId(pack.ReadCell()); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esNullifyAbility[g_esNullifyPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esNullifyPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esNullifyPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esNullifyCache[iTank].g_iNullifyAbility == 0) { - return; + return Plugin_Stop; } float flRandom = pack.ReadFloat(); int iPos = pack.ReadCell(); vNullifyAbility(iTank, flRandom, iPos); + + return Plugin_Continue; } -void tTimerNullifyCombo2(Handle timer, DataPack pack) +Action tTimerNullifyCombo2(Handle timer, DataPack pack) { pack.Reset(); int iSurvivor = GetClientOfUserId(pack.ReadCell()); if (!bIsSurvivor(iSurvivor) || g_esNullifyPlayer[iSurvivor].g_bAffected) { - return; + return Plugin_Stop; } int iTank = GetClientOfUserId(pack.ReadCell()); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esNullifyAbility[g_esNullifyPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esNullifyPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esNullifyPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esNullifyCache[iTank].g_iNullifyHit == 0) { - return; + return Plugin_Stop; } float flRandom = pack.ReadFloat(), flChance = pack.ReadFloat(); @@ -1217,9 +1219,11 @@ void tTimerNullifyCombo2(Handle timer, DataPack pack) { vNullifyHit(iSurvivor, iTank, flRandom, flChance, g_esNullifyCache[iTank].g_iNullifyHit, MT_MESSAGE_MELEE, MT_ATTACK_MELEE, iPos); } + + return Plugin_Continue; } -void tTimerStopNullify(Handle timer, DataPack pack) +Action tTimerStopNullify(Handle timer, DataPack pack) { pack.Reset(); @@ -1229,7 +1233,7 @@ void tTimerStopNullify(Handle timer, DataPack pack) g_esNullifyPlayer[iSurvivor].g_bAffected = false; g_esNullifyPlayer[iSurvivor].g_iOwner = -1; - return; + return Plugin_Stop; } int iTank = GetClientOfUserId(pack.ReadCell()); @@ -1238,7 +1242,7 @@ void tTimerStopNullify(Handle timer, DataPack pack) g_esNullifyPlayer[iSurvivor].g_bAffected = false; g_esNullifyPlayer[iSurvivor].g_iOwner = -1; - return; + return Plugin_Stop; } g_esNullifyPlayer[iSurvivor].g_bAffected = false; @@ -1250,4 +1254,6 @@ void tTimerStopNullify(Handle timer, DataPack pack) MT_PrintToChatAll("%s %t", MT_TAG2, "Nullify2", iSurvivor); MT_LogMessage(MT_LOG_ABILITY, "%s %T", MT_TAG, "Nullify2", LANG_SERVER, iSurvivor); } + + return Plugin_Continue; } \ No newline at end of file diff --git a/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_omni.sp b/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_omni.sp index f02f7e7344..842621fd7b 100644 --- a/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_omni.sp +++ b/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_omni.sp @@ -1,6 +1,6 @@ /** - * Mutant Tanks: a L4D/L4D2 SourceMod Plugin - * Copyright (C) 2024 Alfred "Psyk0tik" Llagas + * Mutant Tanks: A L4D/L4D2 SourceMod Plugin + * Copyright (C) 2017-2025 Alfred "Psyk0tik" Llagas * * 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. * @@ -29,6 +29,8 @@ public Plugin myinfo = bool g_bDedicated; +int g_iGraphicsLevel; + public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max) { EngineVersion evEngine = GetEngineVersion(); @@ -324,7 +326,15 @@ int iOmniMenuHandler(Menu menu, MenuAction action, int param1, int param2) case 0: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esOmni[param1].g_iOmniAbility == 0) ? "AbilityStatus1" : "AbilityStatus2"); case 1: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityAmmo", (g_esOmni[param1].g_iHumanAmmo - g_esOmniPlayer[param1].g_iAmmoCount), g_esOmni[param1].g_iHumanAmmo); case 2: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtons"); - case 3: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esOmni[param1].g_iHumanMode == 0) ? "AbilityButtonMode1" : "AbilityButtonMode2"); + case 3: + { + switch (g_esOmni[param1].g_iHumanMode) + { + case 0: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtonMode1"); + case 1: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtonMode2"); + case 2: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtonMode3"); + } + } case 4: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityCooldown", ((g_esOmni[param1].g_iHumanAbility == 1) ? g_esOmni[param1].g_iHumanCooldown : g_esOmni[param1].g_iOmniCooldown)); case 5: MT_PrintToChat(param1, "%s %t", MT_TAG3, "OmniDetails"); case 6: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityDuration2", ((g_esOmni[param1].g_iHumanAbility == 1) ? g_esOmni[param1].g_iHumanDuration : g_esOmni[param1].g_iOmniDuration)); @@ -408,7 +418,7 @@ void vOmniPlayerRunCmd(int client) public Action OnPlayerRunCmd(int client, int &buttons, int &impulse, float vel[3], float angles[3], int &weapon) #endif { - if (!MT_IsTankSupported(client) || !g_esOmniPlayer[client].g_bActivated || (bIsInfected(client, MT_CHECK_FAKECLIENT) && g_esOmni[client].g_iHumanMode == 1) || g_esOmniPlayer[client].g_iDuration == -1) + if (!MT_IsTankSupported(client) || !g_esOmniPlayer[client].g_bActivated || (bIsInfected(client, MT_CHECK_FAKECLIENT) && g_esOmni[client].g_iHumanMode > 0) || g_esOmniPlayer[client].g_iDuration == -1) { #if defined MT_ABILITIES_MAIN2 return; @@ -625,7 +635,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esOmniTeammate[admin].g_iHumanAmmo = iGetKeyValue(subsection, MT_OMNI_SECTION, MT_OMNI_SECTION2, MT_OMNI_SECTION3, MT_OMNI_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esOmniTeammate[admin].g_iHumanAmmo, value, -1, 99999); g_esOmniTeammate[admin].g_iHumanCooldown = iGetKeyValue(subsection, MT_OMNI_SECTION, MT_OMNI_SECTION2, MT_OMNI_SECTION3, MT_OMNI_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esOmniTeammate[admin].g_iHumanCooldown, value, -1, 99999); g_esOmniTeammate[admin].g_iHumanDuration = iGetKeyValue(subsection, MT_OMNI_SECTION, MT_OMNI_SECTION2, MT_OMNI_SECTION3, MT_OMNI_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esOmniTeammate[admin].g_iHumanDuration, value, -1, 99999); - g_esOmniTeammate[admin].g_iHumanMode = iGetKeyValue(subsection, MT_OMNI_SECTION, MT_OMNI_SECTION2, MT_OMNI_SECTION3, MT_OMNI_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esOmniTeammate[admin].g_iHumanMode, value, -1, 1); + g_esOmniTeammate[admin].g_iHumanMode = iGetKeyValue(subsection, MT_OMNI_SECTION, MT_OMNI_SECTION2, MT_OMNI_SECTION3, MT_OMNI_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esOmniTeammate[admin].g_iHumanMode, value, -1, 2); g_esOmniTeammate[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_OMNI_SECTION, MT_OMNI_SECTION2, MT_OMNI_SECTION3, MT_OMNI_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esOmniTeammate[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); g_esOmniTeammate[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_OMNI_SECTION, MT_OMNI_SECTION2, MT_OMNI_SECTION3, MT_OMNI_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esOmniTeammate[admin].g_iRequiresHumans, value, -1, 32); g_esOmniTeammate[admin].g_iOmniAbility = iGetKeyValue(subsection, MT_OMNI_SECTION, MT_OMNI_SECTION2, MT_OMNI_SECTION3, MT_OMNI_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esOmniTeammate[admin].g_iOmniAbility, value, -1, 1); @@ -645,7 +655,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esOmniPlayer[admin].g_iHumanAmmo = iGetKeyValue(subsection, MT_OMNI_SECTION, MT_OMNI_SECTION2, MT_OMNI_SECTION3, MT_OMNI_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esOmniPlayer[admin].g_iHumanAmmo, value, -1, 99999); g_esOmniPlayer[admin].g_iHumanCooldown = iGetKeyValue(subsection, MT_OMNI_SECTION, MT_OMNI_SECTION2, MT_OMNI_SECTION3, MT_OMNI_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esOmniPlayer[admin].g_iHumanCooldown, value, -1, 99999); g_esOmniPlayer[admin].g_iHumanDuration = iGetKeyValue(subsection, MT_OMNI_SECTION, MT_OMNI_SECTION2, MT_OMNI_SECTION3, MT_OMNI_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esOmniPlayer[admin].g_iHumanDuration, value, -1, 99999); - g_esOmniPlayer[admin].g_iHumanMode = iGetKeyValue(subsection, MT_OMNI_SECTION, MT_OMNI_SECTION2, MT_OMNI_SECTION3, MT_OMNI_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esOmniPlayer[admin].g_iHumanMode, value, -1, 1); + g_esOmniPlayer[admin].g_iHumanMode = iGetKeyValue(subsection, MT_OMNI_SECTION, MT_OMNI_SECTION2, MT_OMNI_SECTION3, MT_OMNI_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esOmniPlayer[admin].g_iHumanMode, value, -1, 2); g_esOmniPlayer[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_OMNI_SECTION, MT_OMNI_SECTION2, MT_OMNI_SECTION3, MT_OMNI_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esOmniPlayer[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); g_esOmniPlayer[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_OMNI_SECTION, MT_OMNI_SECTION2, MT_OMNI_SECTION3, MT_OMNI_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esOmniPlayer[admin].g_iRequiresHumans, value, -1, 32); g_esOmniPlayer[admin].g_iOmniAbility = iGetKeyValue(subsection, MT_OMNI_SECTION, MT_OMNI_SECTION2, MT_OMNI_SECTION3, MT_OMNI_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esOmniPlayer[admin].g_iOmniAbility, value, -1, 1); @@ -670,7 +680,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esOmniSpecial[type].g_iHumanAmmo = iGetKeyValue(subsection, MT_OMNI_SECTION, MT_OMNI_SECTION2, MT_OMNI_SECTION3, MT_OMNI_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esOmniSpecial[type].g_iHumanAmmo, value, -1, 99999); g_esOmniSpecial[type].g_iHumanCooldown = iGetKeyValue(subsection, MT_OMNI_SECTION, MT_OMNI_SECTION2, MT_OMNI_SECTION3, MT_OMNI_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esOmniSpecial[type].g_iHumanCooldown, value, -1, 99999); g_esOmniSpecial[type].g_iHumanDuration = iGetKeyValue(subsection, MT_OMNI_SECTION, MT_OMNI_SECTION2, MT_OMNI_SECTION3, MT_OMNI_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esOmniSpecial[type].g_iHumanDuration, value, -1, 99999); - g_esOmniSpecial[type].g_iHumanMode = iGetKeyValue(subsection, MT_OMNI_SECTION, MT_OMNI_SECTION2, MT_OMNI_SECTION3, MT_OMNI_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esOmniSpecial[type].g_iHumanMode, value, -1, 1); + g_esOmniSpecial[type].g_iHumanMode = iGetKeyValue(subsection, MT_OMNI_SECTION, MT_OMNI_SECTION2, MT_OMNI_SECTION3, MT_OMNI_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esOmniSpecial[type].g_iHumanMode, value, -1, 2); g_esOmniSpecial[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_OMNI_SECTION, MT_OMNI_SECTION2, MT_OMNI_SECTION3, MT_OMNI_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esOmniSpecial[type].g_flOpenAreasOnly, value, -1.0, 99999.0); g_esOmniSpecial[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_OMNI_SECTION, MT_OMNI_SECTION2, MT_OMNI_SECTION3, MT_OMNI_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esOmniSpecial[type].g_iRequiresHumans, value, -1, 32); g_esOmniSpecial[type].g_iOmniAbility = iGetKeyValue(subsection, MT_OMNI_SECTION, MT_OMNI_SECTION2, MT_OMNI_SECTION3, MT_OMNI_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esOmniSpecial[type].g_iOmniAbility, value, -1, 1); @@ -690,7 +700,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esOmniAbility[type].g_iHumanAmmo = iGetKeyValue(subsection, MT_OMNI_SECTION, MT_OMNI_SECTION2, MT_OMNI_SECTION3, MT_OMNI_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esOmniAbility[type].g_iHumanAmmo, value, -1, 99999); g_esOmniAbility[type].g_iHumanCooldown = iGetKeyValue(subsection, MT_OMNI_SECTION, MT_OMNI_SECTION2, MT_OMNI_SECTION3, MT_OMNI_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esOmniAbility[type].g_iHumanCooldown, value, -1, 99999); g_esOmniAbility[type].g_iHumanDuration = iGetKeyValue(subsection, MT_OMNI_SECTION, MT_OMNI_SECTION2, MT_OMNI_SECTION3, MT_OMNI_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esOmniAbility[type].g_iHumanDuration, value, -1, 99999); - g_esOmniAbility[type].g_iHumanMode = iGetKeyValue(subsection, MT_OMNI_SECTION, MT_OMNI_SECTION2, MT_OMNI_SECTION3, MT_OMNI_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esOmniAbility[type].g_iHumanMode, value, -1, 1); + g_esOmniAbility[type].g_iHumanMode = iGetKeyValue(subsection, MT_OMNI_SECTION, MT_OMNI_SECTION2, MT_OMNI_SECTION3, MT_OMNI_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esOmniAbility[type].g_iHumanMode, value, -1, 2); g_esOmniAbility[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_OMNI_SECTION, MT_OMNI_SECTION2, MT_OMNI_SECTION3, MT_OMNI_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esOmniAbility[type].g_flOpenAreasOnly, value, -1.0, 99999.0); g_esOmniAbility[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_OMNI_SECTION, MT_OMNI_SECTION2, MT_OMNI_SECTION3, MT_OMNI_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esOmniAbility[type].g_iRequiresHumans, value, -1, 32); g_esOmniAbility[type].g_iOmniAbility = iGetKeyValue(subsection, MT_OMNI_SECTION, MT_OMNI_SECTION2, MT_OMNI_SECTION3, MT_OMNI_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esOmniAbility[type].g_iOmniAbility, value, -1, 1); @@ -717,7 +727,9 @@ public void MT_OnSettingsCached(int tank, bool apply, int type) g_esOmniPlayer[tank].g_iTankTypeRecorded = apply ? MT_GetRecordedTankType(tank, type) : 0; g_esOmniPlayer[tank].g_iTankType = apply ? type : 0; int iType = g_esOmniPlayer[tank].g_iTankTypeRecorded; - +#if !defined MT_ABILITIES_MAIN2 + g_iGraphicsLevel = MT_GetGraphicsLevel(); +#endif if (bIsSpecialInfected(tank, MT_CHECK_INDEX|MT_CHECK_INGAME)) { g_esOmniCache[tank].g_flCloseAreasOnly = flGetSubSettingValue(apply, bHuman, g_esOmniTeammate[tank].g_flCloseAreasOnly, g_esOmniPlayer[tank].g_flCloseAreasOnly, g_esOmniSpecial[iType].g_flCloseAreasOnly, g_esOmniAbility[iType].g_flCloseAreasOnly, 1); @@ -896,10 +908,10 @@ public void MT_OnButtonPressed(int tank, int button) if ((button & MT_MAIN_KEY) && g_esOmni[tank].g_iOmniAbility == 1 && g_esOmni[tank].g_iHumanAbility == 1) { - int iTime = GetTime(); + int iHumanMode = g_esOmni[tank].g_iHumanMode, iTime = GetTime(); bool bRecharging = g_esOmniPlayer[tank].g_iCooldown != -1 && g_esOmniPlayer[tank].g_iCooldown >= iTime; - switch (g_esOmni[tank].g_iHumanMode) + switch (iHumanMode) { case 0: { @@ -916,9 +928,9 @@ public void MT_OnButtonPressed(int tank, int button) MT_PrintToChat(tank, "%s %t", MT_TAG3, "OmniHuman4", (g_esOmniPlayer[tank].g_iCooldown - iTime)); } } - case 1: + case 1, 2: { - if (g_esOmniPlayer[tank].g_iAmmoCount < g_esOmni[tank].g_iHumanAmmo && g_esOmni[tank].g_iHumanAmmo > 0) + if ((iHumanMode == 2 && g_esOmniPlayer[tank].g_bActivated) || (g_esOmniPlayer[tank].g_iAmmoCount < g_esOmni[tank].g_iHumanAmmo && g_esOmni[tank].g_iHumanAmmo > 0)) { if (!g_esOmniPlayer[tank].g_bActivated && !bRecharging) { @@ -931,7 +943,15 @@ public void MT_OnButtonPressed(int tank, int button) } else if (g_esOmniPlayer[tank].g_bActivated) { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "OmniHuman3"); + switch (iHumanMode) + { + case 1: MT_PrintToChat(tank, "%s %t", MT_TAG3, "OmniHuman3"); + case 2: + { + vOmniReset2(tank); + vOmniReset3(tank); + } + } } else if (bRecharging) { @@ -1034,8 +1054,12 @@ void vOmni2(int tank, int pos = -1) if (iTypeCount > 0) { MT_SetTankType(tank, iTypes[MT_GetRandomInt(1, iTypeCount)], (g_esOmni[tank].g_iOmniMode == 1)); - vAttachParticle(tank, PARTICLE_ELECTRICITY, 1.0); EmitSoundToAll(SOUND_ELECTRICITY, tank); + + if (g_iGraphicsLevel > 2) + { + vAttachParticle(tank, PARTICLE_ELECTRICITY, 1.0); + } } else { @@ -1054,8 +1078,12 @@ void vOmni2(int tank, int pos = -1) if (iTypeCount > 0) { MT_SetTankType(tank, iTypes[MT_GetRandomInt(1, iTypeCount)], (g_esOmni[tank].g_iOmniMode == 1)); - vAttachParticle(tank, PARTICLE_ELECTRICITY, 1.0); EmitSoundToAll(SOUND_ELECTRICITY, tank); + + if (g_iGraphicsLevel > 2) + { + vAttachParticle(tank, PARTICLE_ELECTRICITY, 1.0); + } } } } @@ -1131,9 +1159,13 @@ void vOmniReset2(int tank) g_esOmniPlayer[tank].g_bActivated = false; g_esOmniPlayer[tank].g_iDuration = -1; - MT_SetTankType(tank, g_esOmniPlayer[tank].g_iOmniType, (g_esOmni[tank].g_iOmniMode == 1)); - vAttachParticle(tank, PARTICLE_ELECTRICITY, 1.0); + if (g_iGraphicsLevel > 2) + { + vAttachParticle(tank, PARTICLE_ELECTRICITY, 1.0); + } + EmitSoundToAll(SOUND_ELECTRICITY, tank); + MT_SetTankType(tank, g_esOmniPlayer[tank].g_iOmniType, (g_esOmni[tank].g_iOmniMode == 1)); g_esOmniPlayer[tank].g_iOmniType = 0; if (g_esOmni[tank].g_iOmniMessage == 1) @@ -1170,14 +1202,16 @@ bool bIsOmniType(int tank, int type, int specType) return bReturn; } -void tTimerOmniCombo(Handle timer, DataPack pack) +Action tTimerOmniCombo(Handle timer, DataPack pack) { int iTank = GetClientOfUserId(pack.ReadCell()); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esOmniAbility[g_esOmniPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esOmniPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esOmniPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esOmniCache[iTank].g_iOmniAbility == 0 || g_esOmniPlayer[iTank].g_bActivated) { - return; + return Plugin_Stop; } int iPos = pack.ReadCell(); vOmni(iTank, iPos); + + return Plugin_Continue; } \ No newline at end of file diff --git a/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_panic.sp b/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_panic.sp index ef5d463c23..65f77e651b 100644 --- a/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_panic.sp +++ b/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_panic.sp @@ -1,6 +1,6 @@ /** - * Mutant Tanks: a L4D/L4D2 SourceMod Plugin - * Copyright (C) 2024 Alfred "Psyk0tik" Llagas + * Mutant Tanks: A L4D/L4D2 SourceMod Plugin + * Copyright (C) 2017-2025 Alfred "Psyk0tik" Llagas * * 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. * @@ -22,7 +22,7 @@ public Plugin myinfo = { name = "[MT] Panic Ability", author = MT_AUTHOR, - description = "The Mutant Tank starts panic events.", + description = "The Mutant Tank starts panic events and spawns zombies.", version = MT_VERSION, url = MT_URL }; @@ -47,6 +47,14 @@ public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max return APLRes_Success; } + +#define MODEL_CEDA "models/infected/common_male_ceda.mdl" +#define MODEL_CLOWN "models/infected/common_male_clown.mdl" +#define MODEL_FALLEN "models/infected/common_male_fallen_survivor.mdl" +#define MODEL_JIMMY "models/infected/common_male_jimmy.mdl" +#define MODEL_MUDMAN "models/infected/common_male_mud.mdl" +#define MODEL_RIOTCOP "models/infected/common_male_riot.mdl" +#define MODEL_ROADCREW "models/infected/common_male_roadcrew.mdl" #else #if MT_PANIC_COMPILE_METHOD == 1 #error This file must be compiled as a standalone plugin. @@ -79,9 +87,12 @@ enum struct esPanicPlayer int g_iHumanDuration; int g_iHumanMode; int g_iPanicAbility; + int g_iPanicAmount; int g_iPanicCooldown; int g_iPanicDuration; int g_iPanicMessage; + int g_iPanicMode; + int g_iPanicType; int g_iRequiresHumans; int g_iTankType; int g_iTankTypeRecorded; @@ -103,9 +114,12 @@ enum struct esPanicTeammate int g_iHumanDuration; int g_iHumanMode; int g_iPanicAbility; + int g_iPanicAmount; int g_iPanicCooldown; int g_iPanicDuration; int g_iPanicMessage; + int g_iPanicMode; + int g_iPanicType; int g_iRequiresHumans; } @@ -127,9 +141,12 @@ enum struct esPanicAbility int g_iHumanDuration; int g_iHumanMode; int g_iPanicAbility; + int g_iPanicAmount; int g_iPanicCooldown; int g_iPanicDuration; int g_iPanicMessage; + int g_iPanicMode; + int g_iPanicType; int g_iRequiresHumans; } @@ -149,9 +166,12 @@ enum struct esPanicSpecial int g_iHumanDuration; int g_iHumanMode; int g_iPanicAbility; + int g_iPanicAmount; int g_iPanicCooldown; int g_iPanicDuration; int g_iPanicMessage; + int g_iPanicMode; + int g_iPanicType; int g_iRequiresHumans; } @@ -171,9 +191,12 @@ enum struct esPanicCache int g_iHumanDuration; int g_iHumanMode; int g_iPanicAbility; + int g_iPanicAmount; int g_iPanicCooldown; int g_iPanicDuration; int g_iPanicMessage; + int g_iPanicMode; + int g_iPanicType; int g_iRequiresHumans; } @@ -196,6 +219,14 @@ void vPanicMapStart() public void OnMapStart() #endif { + PrecacheModel(MODEL_CEDA, true); + PrecacheModel(MODEL_CLOWN, true); + PrecacheModel(MODEL_FALLEN, true); + PrecacheModel(MODEL_JIMMY, true); + PrecacheModel(MODEL_MUDMAN, true); + PrecacheModel(MODEL_RIOTCOP, true); + PrecacheModel(MODEL_ROADCREW, true); + vPanicReset(); } @@ -287,7 +318,15 @@ int iPanicMenuHandler(Menu menu, MenuAction action, int param1, int param2) case 0: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esPanicCache[param1].g_iPanicAbility == 0) ? "AbilityStatus1" : "AbilityStatus2"); case 1: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityAmmo", (g_esPanicCache[param1].g_iHumanAmmo - g_esPanicPlayer[param1].g_iAmmoCount), g_esPanicCache[param1].g_iHumanAmmo); case 2: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtons"); - case 3: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esPanicCache[param1].g_iHumanMode == 0) ? "AbilityButtonMode1" : "AbilityButtonMode2"); + case 3: + { + switch (g_esPanicCache[param1].g_iHumanMode) + { + case 0: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtonMode1"); + case 1: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtonMode2"); + case 2: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtonMode3"); + } + } case 4: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityCooldown", ((g_esPanicCache[param1].g_iHumanAbility == 1) ? g_esPanicCache[param1].g_iHumanCooldown : g_esPanicCache[param1].g_iPanicCooldown)); case 5: MT_PrintToChat(param1, "%s %t", MT_TAG3, "PanicDetails"); case 6: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityDuration2", ((g_esPanicCache[param1].g_iHumanAbility == 1) ? g_esPanicCache[param1].g_iHumanDuration : g_esPanicCache[param1].g_iPanicDuration)); @@ -409,7 +448,7 @@ public void MT_OnCombineAbilities(int tank, int type, const float random, const FormatEx(sSet[3], sizeof sSet[], ",%s,", MT_PANIC_SECTION4); if (StrContains(sCombo, sSet[0], false) != -1 || StrContains(sCombo, sSet[1], false) != -1 || StrContains(sCombo, sSet[2], false) != -1 || StrContains(sCombo, sSet[3], false) != -1) { - if (type == MT_COMBO_MAINRANGE && g_esPanicCache[tank].g_iPanicAbility == 1 && g_esPanicCache[tank].g_iComboAbility == 1 && !g_esPanicPlayer[tank].g_bActivated) + if (type == MT_COMBO_MAINRANGE && g_esPanicCache[tank].g_iPanicAbility > 0 && g_esPanicCache[tank].g_iComboAbility == 1 && !g_esPanicPlayer[tank].g_bActivated) { char sAbilities[320], sSubset[10][32]; strcopy(sAbilities, sizeof sAbilities, combo); @@ -471,10 +510,13 @@ public void MT_OnConfigsLoad(int mode) g_esPanicAbility[iIndex].g_iRequiresHumans = 0; g_esPanicAbility[iIndex].g_iPanicAbility = 0; g_esPanicAbility[iIndex].g_iPanicMessage = 0; + g_esPanicAbility[iIndex].g_iPanicAmount = 10; g_esPanicAbility[iIndex].g_flPanicChance = 33.3; g_esPanicAbility[iIndex].g_iPanicCooldown = 0; g_esPanicAbility[iIndex].g_iPanicDuration = 0; g_esPanicAbility[iIndex].g_flPanicInterval = 5.0; + g_esPanicAbility[iIndex].g_iPanicMode = 0; + g_esPanicAbility[iIndex].g_iPanicType = 0; g_esPanicSpecial[iIndex].g_flCloseAreasOnly = -1.0; g_esPanicSpecial[iIndex].g_iComboAbility = -1; @@ -487,10 +529,13 @@ public void MT_OnConfigsLoad(int mode) g_esPanicSpecial[iIndex].g_iRequiresHumans = -1; g_esPanicSpecial[iIndex].g_iPanicAbility = -1; g_esPanicSpecial[iIndex].g_iPanicMessage = -1; + g_esPanicSpecial[iIndex].g_iPanicAmount = -1; g_esPanicSpecial[iIndex].g_flPanicChance = -1.0; g_esPanicSpecial[iIndex].g_iPanicCooldown = -1; g_esPanicSpecial[iIndex].g_iPanicDuration = -1; g_esPanicSpecial[iIndex].g_flPanicInterval = -1.0; + g_esPanicSpecial[iIndex].g_iPanicMode = -1; + g_esPanicSpecial[iIndex].g_iPanicType = -1; } } case 3: @@ -509,10 +554,13 @@ public void MT_OnConfigsLoad(int mode) g_esPanicPlayer[iPlayer].g_iRequiresHumans = -1; g_esPanicPlayer[iPlayer].g_iPanicAbility = -1; g_esPanicPlayer[iPlayer].g_iPanicMessage = -1; + g_esPanicPlayer[iPlayer].g_iPanicAmount = -1; g_esPanicPlayer[iPlayer].g_flPanicChance = -1.0; g_esPanicPlayer[iPlayer].g_iPanicCooldown = -1; g_esPanicPlayer[iPlayer].g_iPanicDuration = -1; g_esPanicPlayer[iPlayer].g_flPanicInterval = -1.0; + g_esPanicPlayer[iPlayer].g_iPanicMode = -1; + g_esPanicPlayer[iPlayer].g_iPanicType = -1; g_esPanicTeammate[iPlayer].g_flCloseAreasOnly = -1.0; g_esPanicTeammate[iPlayer].g_iComboAbility = -1; @@ -525,10 +573,13 @@ public void MT_OnConfigsLoad(int mode) g_esPanicTeammate[iPlayer].g_iRequiresHumans = -1; g_esPanicTeammate[iPlayer].g_iPanicAbility = -1; g_esPanicTeammate[iPlayer].g_iPanicMessage = -1; + g_esPanicTeammate[iPlayer].g_iPanicAmount = -1; g_esPanicTeammate[iPlayer].g_flPanicChance = -1.0; g_esPanicTeammate[iPlayer].g_iPanicCooldown = -1; g_esPanicTeammate[iPlayer].g_iPanicDuration = -1; g_esPanicTeammate[iPlayer].g_flPanicInterval = -1.0; + g_esPanicTeammate[iPlayer].g_iPanicMode = -1; + g_esPanicTeammate[iPlayer].g_iPanicType = -1; } } } @@ -550,15 +601,18 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esPanicTeammate[admin].g_iHumanAmmo = iGetKeyValue(subsection, MT_PANIC_SECTION, MT_PANIC_SECTION2, MT_PANIC_SECTION3, MT_PANIC_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esPanicTeammate[admin].g_iHumanAmmo, value, -1, 99999); g_esPanicTeammate[admin].g_iHumanCooldown = iGetKeyValue(subsection, MT_PANIC_SECTION, MT_PANIC_SECTION2, MT_PANIC_SECTION3, MT_PANIC_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esPanicTeammate[admin].g_iHumanCooldown, value, -1, 99999); g_esPanicTeammate[admin].g_iHumanDuration = iGetKeyValue(subsection, MT_PANIC_SECTION, MT_PANIC_SECTION2, MT_PANIC_SECTION3, MT_PANIC_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esPanicTeammate[admin].g_iHumanDuration, value, -1, 99999); - g_esPanicTeammate[admin].g_iHumanMode = iGetKeyValue(subsection, MT_PANIC_SECTION, MT_PANIC_SECTION2, MT_PANIC_SECTION3, MT_PANIC_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esPanicTeammate[admin].g_iHumanMode, value, -1, 1); + g_esPanicTeammate[admin].g_iHumanMode = iGetKeyValue(subsection, MT_PANIC_SECTION, MT_PANIC_SECTION2, MT_PANIC_SECTION3, MT_PANIC_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esPanicTeammate[admin].g_iHumanMode, value, -1, 2); g_esPanicTeammate[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_PANIC_SECTION, MT_PANIC_SECTION2, MT_PANIC_SECTION3, MT_PANIC_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esPanicTeammate[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); g_esPanicTeammate[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_PANIC_SECTION, MT_PANIC_SECTION2, MT_PANIC_SECTION3, MT_PANIC_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esPanicTeammate[admin].g_iRequiresHumans, value, -1, 32); g_esPanicTeammate[admin].g_iPanicAbility = iGetKeyValue(subsection, MT_PANIC_SECTION, MT_PANIC_SECTION2, MT_PANIC_SECTION3, MT_PANIC_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esPanicTeammate[admin].g_iPanicAbility, value, -1, 3); g_esPanicTeammate[admin].g_iPanicMessage = iGetKeyValue(subsection, MT_PANIC_SECTION, MT_PANIC_SECTION2, MT_PANIC_SECTION3, MT_PANIC_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esPanicTeammate[admin].g_iPanicMessage, value, -1, 1); + g_esPanicTeammate[admin].g_iPanicAmount = iGetKeyValue(subsection, MT_PANIC_SECTION, MT_PANIC_SECTION2, MT_PANIC_SECTION3, MT_PANIC_SECTION4, key, "PanicAmount", "Panic Amount", "Panic_Amount", "amount", g_esPanicTeammate[admin].g_iPanicAmount, value, -1, 100); g_esPanicTeammate[admin].g_flPanicChance = flGetKeyValue(subsection, MT_PANIC_SECTION, MT_PANIC_SECTION2, MT_PANIC_SECTION3, MT_PANIC_SECTION4, key, "PanicChance", "Panic Chance", "Panic_Chance", "chance", g_esPanicTeammate[admin].g_flPanicChance, value, -1.0, 100.0); g_esPanicTeammate[admin].g_iPanicCooldown = iGetKeyValue(subsection, MT_PANIC_SECTION, MT_PANIC_SECTION2, MT_PANIC_SECTION3, MT_PANIC_SECTION4, key, "PanicCooldown", "Panic Cooldown", "Panic_Cooldown", "cooldown", g_esPanicTeammate[admin].g_iPanicCooldown, value, -1, 99999); g_esPanicTeammate[admin].g_iPanicDuration = iGetKeyValue(subsection, MT_PANIC_SECTION, MT_PANIC_SECTION2, MT_PANIC_SECTION3, MT_PANIC_SECTION4, key, "PanicDuration", "Panic Duration", "Panic_Duration", "duration", g_esPanicTeammate[admin].g_iPanicDuration, value, -1, 99999); g_esPanicTeammate[admin].g_flPanicInterval = flGetKeyValue(subsection, MT_PANIC_SECTION, MT_PANIC_SECTION2, MT_PANIC_SECTION3, MT_PANIC_SECTION4, key, "PanicInterval", "Panic Interval", "Panic_Interval", "interval", g_esPanicTeammate[admin].g_flPanicInterval, value, -1.0, 99999.0); + g_esPanicTeammate[admin].g_iPanicMode = iGetKeyValue(subsection, MT_PANIC_SECTION, MT_PANIC_SECTION2, MT_PANIC_SECTION3, MT_PANIC_SECTION4, key, "PanicMode", "Panic Mode", "Panic_Mode", "mode", g_esPanicTeammate[admin].g_iPanicMode, value, -1, 2); + g_esPanicTeammate[admin].g_iPanicType = iGetKeyValue(subsection, MT_PANIC_SECTION, MT_PANIC_SECTION2, MT_PANIC_SECTION3, MT_PANIC_SECTION4, key, "PanicType", "Panic Type", "Panic_Type", "type", g_esPanicTeammate[admin].g_iPanicType, value, -1, 127); } else { @@ -568,15 +622,18 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esPanicPlayer[admin].g_iHumanAmmo = iGetKeyValue(subsection, MT_PANIC_SECTION, MT_PANIC_SECTION2, MT_PANIC_SECTION3, MT_PANIC_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esPanicPlayer[admin].g_iHumanAmmo, value, -1, 99999); g_esPanicPlayer[admin].g_iHumanCooldown = iGetKeyValue(subsection, MT_PANIC_SECTION, MT_PANIC_SECTION2, MT_PANIC_SECTION3, MT_PANIC_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esPanicPlayer[admin].g_iHumanCooldown, value, -1, 99999); g_esPanicPlayer[admin].g_iHumanDuration = iGetKeyValue(subsection, MT_PANIC_SECTION, MT_PANIC_SECTION2, MT_PANIC_SECTION3, MT_PANIC_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esPanicPlayer[admin].g_iHumanDuration, value, -1, 99999); - g_esPanicPlayer[admin].g_iHumanMode = iGetKeyValue(subsection, MT_PANIC_SECTION, MT_PANIC_SECTION2, MT_PANIC_SECTION3, MT_PANIC_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esPanicPlayer[admin].g_iHumanMode, value, -1, 1); + g_esPanicPlayer[admin].g_iHumanMode = iGetKeyValue(subsection, MT_PANIC_SECTION, MT_PANIC_SECTION2, MT_PANIC_SECTION3, MT_PANIC_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esPanicPlayer[admin].g_iHumanMode, value, -1, 2); g_esPanicPlayer[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_PANIC_SECTION, MT_PANIC_SECTION2, MT_PANIC_SECTION3, MT_PANIC_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esPanicPlayer[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); g_esPanicPlayer[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_PANIC_SECTION, MT_PANIC_SECTION2, MT_PANIC_SECTION3, MT_PANIC_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esPanicPlayer[admin].g_iRequiresHumans, value, -1, 32); g_esPanicPlayer[admin].g_iPanicAbility = iGetKeyValue(subsection, MT_PANIC_SECTION, MT_PANIC_SECTION2, MT_PANIC_SECTION3, MT_PANIC_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esPanicPlayer[admin].g_iPanicAbility, value, -1, 3); g_esPanicPlayer[admin].g_iPanicMessage = iGetKeyValue(subsection, MT_PANIC_SECTION, MT_PANIC_SECTION2, MT_PANIC_SECTION3, MT_PANIC_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esPanicPlayer[admin].g_iPanicMessage, value, -1, 1); + g_esPanicPlayer[admin].g_iPanicAmount = iGetKeyValue(subsection, MT_PANIC_SECTION, MT_PANIC_SECTION2, MT_PANIC_SECTION3, MT_PANIC_SECTION4, key, "PanicAmount", "Panic Amount", "Panic_Amount", "amount", g_esPanicPlayer[admin].g_iPanicAmount, value, -1, 100); g_esPanicPlayer[admin].g_flPanicChance = flGetKeyValue(subsection, MT_PANIC_SECTION, MT_PANIC_SECTION2, MT_PANIC_SECTION3, MT_PANIC_SECTION4, key, "PanicChance", "Panic Chance", "Panic_Chance", "chance", g_esPanicPlayer[admin].g_flPanicChance, value, -1.0, 100.0); g_esPanicPlayer[admin].g_iPanicCooldown = iGetKeyValue(subsection, MT_PANIC_SECTION, MT_PANIC_SECTION2, MT_PANIC_SECTION3, MT_PANIC_SECTION4, key, "PanicCooldown", "Panic Cooldown", "Panic_Cooldown", "cooldown", g_esPanicPlayer[admin].g_iPanicCooldown, value, -1, 99999); g_esPanicPlayer[admin].g_iPanicDuration = iGetKeyValue(subsection, MT_PANIC_SECTION, MT_PANIC_SECTION2, MT_PANIC_SECTION3, MT_PANIC_SECTION4, key, "PanicDuration", "Panic Duration", "Panic_Duration", "duration", g_esPanicPlayer[admin].g_iPanicDuration, value, -1, 99999); g_esPanicPlayer[admin].g_flPanicInterval = flGetKeyValue(subsection, MT_PANIC_SECTION, MT_PANIC_SECTION2, MT_PANIC_SECTION3, MT_PANIC_SECTION4, key, "PanicInterval", "Panic Interval", "Panic_Interval", "interval", g_esPanicPlayer[admin].g_flPanicInterval, value, -1.0, 99999.0); + g_esPanicPlayer[admin].g_iPanicMode = iGetKeyValue(subsection, MT_PANIC_SECTION, MT_PANIC_SECTION2, MT_PANIC_SECTION3, MT_PANIC_SECTION4, key, "PanicMode", "Panic Mode", "Panic_Mode", "mode", g_esPanicPlayer[admin].g_iPanicMode, value, -1, 2); + g_esPanicPlayer[admin].g_iPanicType = iGetKeyValue(subsection, MT_PANIC_SECTION, MT_PANIC_SECTION2, MT_PANIC_SECTION3, MT_PANIC_SECTION4, key, "PanicType", "Panic Type", "Panic_Type", "type", g_esPanicPlayer[admin].g_iPanicType, value, -1, 127); g_esPanicPlayer[admin].g_iAccessFlags = iGetAdminFlagsValue(subsection, MT_PANIC_SECTION, MT_PANIC_SECTION2, MT_PANIC_SECTION3, MT_PANIC_SECTION4, key, "AccessFlags", "Access Flags", "Access_Flags", "access", value); } } @@ -591,15 +648,18 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esPanicSpecial[type].g_iHumanAmmo = iGetKeyValue(subsection, MT_PANIC_SECTION, MT_PANIC_SECTION2, MT_PANIC_SECTION3, MT_PANIC_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esPanicSpecial[type].g_iHumanAmmo, value, -1, 99999); g_esPanicSpecial[type].g_iHumanCooldown = iGetKeyValue(subsection, MT_PANIC_SECTION, MT_PANIC_SECTION2, MT_PANIC_SECTION3, MT_PANIC_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esPanicSpecial[type].g_iHumanCooldown, value, -1, 99999); g_esPanicSpecial[type].g_iHumanDuration = iGetKeyValue(subsection, MT_PANIC_SECTION, MT_PANIC_SECTION2, MT_PANIC_SECTION3, MT_PANIC_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esPanicSpecial[type].g_iHumanDuration, value, -1, 99999); - g_esPanicSpecial[type].g_iHumanMode = iGetKeyValue(subsection, MT_PANIC_SECTION, MT_PANIC_SECTION2, MT_PANIC_SECTION3, MT_PANIC_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esPanicSpecial[type].g_iHumanMode, value, -1, 1); + g_esPanicSpecial[type].g_iHumanMode = iGetKeyValue(subsection, MT_PANIC_SECTION, MT_PANIC_SECTION2, MT_PANIC_SECTION3, MT_PANIC_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esPanicSpecial[type].g_iHumanMode, value, -1, 2); g_esPanicSpecial[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_PANIC_SECTION, MT_PANIC_SECTION2, MT_PANIC_SECTION3, MT_PANIC_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esPanicSpecial[type].g_flOpenAreasOnly, value, -1.0, 99999.0); g_esPanicSpecial[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_PANIC_SECTION, MT_PANIC_SECTION2, MT_PANIC_SECTION3, MT_PANIC_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esPanicSpecial[type].g_iRequiresHumans, value, -1, 32); g_esPanicSpecial[type].g_iPanicAbility = iGetKeyValue(subsection, MT_PANIC_SECTION, MT_PANIC_SECTION2, MT_PANIC_SECTION3, MT_PANIC_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esPanicSpecial[type].g_iPanicAbility, value, -1, 3); g_esPanicSpecial[type].g_iPanicMessage = iGetKeyValue(subsection, MT_PANIC_SECTION, MT_PANIC_SECTION2, MT_PANIC_SECTION3, MT_PANIC_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esPanicSpecial[type].g_iPanicMessage, value, -1, 1); + g_esPanicSpecial[type].g_iPanicAmount = iGetKeyValue(subsection, MT_PANIC_SECTION, MT_PANIC_SECTION2, MT_PANIC_SECTION3, MT_PANIC_SECTION4, key, "PanicAmount", "Panic Amount", "Panic_Amount", "amount", g_esPanicSpecial[type].g_iPanicAmount, value, -1, 100); g_esPanicSpecial[type].g_flPanicChance = flGetKeyValue(subsection, MT_PANIC_SECTION, MT_PANIC_SECTION2, MT_PANIC_SECTION3, MT_PANIC_SECTION4, key, "PanicChance", "Panic Chance", "Panic_Chance", "chance", g_esPanicSpecial[type].g_flPanicChance, value, -1.0, 100.0); g_esPanicSpecial[type].g_iPanicCooldown = iGetKeyValue(subsection, MT_PANIC_SECTION, MT_PANIC_SECTION2, MT_PANIC_SECTION3, MT_PANIC_SECTION4, key, "PanicCooldown", "Panic Cooldown", "Panic_Cooldown", "cooldown", g_esPanicSpecial[type].g_iPanicCooldown, value, -1, 99999); g_esPanicSpecial[type].g_iPanicDuration = iGetKeyValue(subsection, MT_PANIC_SECTION, MT_PANIC_SECTION2, MT_PANIC_SECTION3, MT_PANIC_SECTION4, key, "PanicDuration", "Panic Duration", "Panic_Duration", "duration", g_esPanicSpecial[type].g_iPanicDuration, value, -1, 99999); g_esPanicSpecial[type].g_flPanicInterval = flGetKeyValue(subsection, MT_PANIC_SECTION, MT_PANIC_SECTION2, MT_PANIC_SECTION3, MT_PANIC_SECTION4, key, "PanicInterval", "Panic Interval", "Panic_Interval", "interval", g_esPanicSpecial[type].g_flPanicInterval, value, -1.0, 99999.0); + g_esPanicSpecial[type].g_iPanicMode = iGetKeyValue(subsection, MT_PANIC_SECTION, MT_PANIC_SECTION2, MT_PANIC_SECTION3, MT_PANIC_SECTION4, key, "PanicMode", "Panic Mode", "Panic_Mode", "mode", g_esPanicSpecial[type].g_iPanicMode, value, -1, 2); + g_esPanicSpecial[type].g_iPanicType = iGetKeyValue(subsection, MT_PANIC_SECTION, MT_PANIC_SECTION2, MT_PANIC_SECTION3, MT_PANIC_SECTION4, key, "PanicType", "Panic Type", "Panic_Type", "type", g_esPanicSpecial[type].g_iPanicType, value, -1, 127); } else { @@ -609,15 +669,18 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esPanicAbility[type].g_iHumanAmmo = iGetKeyValue(subsection, MT_PANIC_SECTION, MT_PANIC_SECTION2, MT_PANIC_SECTION3, MT_PANIC_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esPanicAbility[type].g_iHumanAmmo, value, -1, 99999); g_esPanicAbility[type].g_iHumanCooldown = iGetKeyValue(subsection, MT_PANIC_SECTION, MT_PANIC_SECTION2, MT_PANIC_SECTION3, MT_PANIC_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esPanicAbility[type].g_iHumanCooldown, value, -1, 99999); g_esPanicAbility[type].g_iHumanDuration = iGetKeyValue(subsection, MT_PANIC_SECTION, MT_PANIC_SECTION2, MT_PANIC_SECTION3, MT_PANIC_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esPanicAbility[type].g_iHumanDuration, value, -1, 99999); - g_esPanicAbility[type].g_iHumanMode = iGetKeyValue(subsection, MT_PANIC_SECTION, MT_PANIC_SECTION2, MT_PANIC_SECTION3, MT_PANIC_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esPanicAbility[type].g_iHumanMode, value, -1, 1); + g_esPanicAbility[type].g_iHumanMode = iGetKeyValue(subsection, MT_PANIC_SECTION, MT_PANIC_SECTION2, MT_PANIC_SECTION3, MT_PANIC_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esPanicAbility[type].g_iHumanMode, value, -1, 2); g_esPanicAbility[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_PANIC_SECTION, MT_PANIC_SECTION2, MT_PANIC_SECTION3, MT_PANIC_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esPanicAbility[type].g_flOpenAreasOnly, value, -1.0, 99999.0); g_esPanicAbility[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_PANIC_SECTION, MT_PANIC_SECTION2, MT_PANIC_SECTION3, MT_PANIC_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esPanicAbility[type].g_iRequiresHumans, value, -1, 32); g_esPanicAbility[type].g_iPanicAbility = iGetKeyValue(subsection, MT_PANIC_SECTION, MT_PANIC_SECTION2, MT_PANIC_SECTION3, MT_PANIC_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esPanicAbility[type].g_iPanicAbility, value, -1, 3); g_esPanicAbility[type].g_iPanicMessage = iGetKeyValue(subsection, MT_PANIC_SECTION, MT_PANIC_SECTION2, MT_PANIC_SECTION3, MT_PANIC_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esPanicAbility[type].g_iPanicMessage, value, -1, 1); + g_esPanicAbility[type].g_iPanicAmount = iGetKeyValue(subsection, MT_PANIC_SECTION, MT_PANIC_SECTION2, MT_PANIC_SECTION3, MT_PANIC_SECTION4, key, "PanicAmount", "Panic Amount", "Panic_Amount", "amount", g_esPanicAbility[type].g_iPanicAmount, value, -1, 100); g_esPanicAbility[type].g_flPanicChance = flGetKeyValue(subsection, MT_PANIC_SECTION, MT_PANIC_SECTION2, MT_PANIC_SECTION3, MT_PANIC_SECTION4, key, "PanicChance", "Panic Chance", "Panic_Chance", "chance", g_esPanicAbility[type].g_flPanicChance, value, -1.0, 100.0); g_esPanicAbility[type].g_iPanicCooldown = iGetKeyValue(subsection, MT_PANIC_SECTION, MT_PANIC_SECTION2, MT_PANIC_SECTION3, MT_PANIC_SECTION4, key, "PanicCooldown", "Panic Cooldown", "Panic_Cooldown", "cooldown", g_esPanicAbility[type].g_iPanicCooldown, value, -1, 99999); g_esPanicAbility[type].g_iPanicDuration = iGetKeyValue(subsection, MT_PANIC_SECTION, MT_PANIC_SECTION2, MT_PANIC_SECTION3, MT_PANIC_SECTION4, key, "PanicDuration", "Panic Duration", "Panic_Duration", "duration", g_esPanicAbility[type].g_iPanicDuration, value, -1, 99999); g_esPanicAbility[type].g_flPanicInterval = flGetKeyValue(subsection, MT_PANIC_SECTION, MT_PANIC_SECTION2, MT_PANIC_SECTION3, MT_PANIC_SECTION4, key, "PanicInterval", "Panic Interval", "Panic_Interval", "interval", g_esPanicAbility[type].g_flPanicInterval, value, -1.0, 99999.0); + g_esPanicAbility[type].g_iPanicMode = iGetKeyValue(subsection, MT_PANIC_SECTION, MT_PANIC_SECTION2, MT_PANIC_SECTION3, MT_PANIC_SECTION4, key, "PanicMode", "Panic Mode", "Panic_Mode", "mode", g_esPanicAbility[type].g_iPanicMode, value, -1, 2); + g_esPanicAbility[type].g_iPanicType = iGetKeyValue(subsection, MT_PANIC_SECTION, MT_PANIC_SECTION2, MT_PANIC_SECTION3, MT_PANIC_SECTION4, key, "PanicType", "Panic Type", "Panic_Type", "type", g_esPanicAbility[type].g_iPanicType, value, -1, 127); g_esPanicAbility[type].g_iAccessFlags = iGetAdminFlagsValue(subsection, MT_PANIC_SECTION, MT_PANIC_SECTION2, MT_PANIC_SECTION3, MT_PANIC_SECTION4, key, "AccessFlags", "Access Flags", "Access_Flags", "access", value); } } @@ -646,9 +709,12 @@ public void MT_OnSettingsCached(int tank, bool apply, int type) g_esPanicCache[tank].g_iHumanDuration = iGetSubSettingValue(apply, bHuman, g_esPanicTeammate[tank].g_iHumanDuration, g_esPanicPlayer[tank].g_iHumanDuration, g_esPanicSpecial[iType].g_iHumanDuration, g_esPanicAbility[iType].g_iHumanDuration, 1); g_esPanicCache[tank].g_iHumanMode = iGetSubSettingValue(apply, bHuman, g_esPanicTeammate[tank].g_iHumanMode, g_esPanicPlayer[tank].g_iHumanMode, g_esPanicSpecial[iType].g_iHumanMode, g_esPanicAbility[iType].g_iHumanMode, 1); g_esPanicCache[tank].g_iPanicAbility = iGetSubSettingValue(apply, bHuman, g_esPanicTeammate[tank].g_iPanicAbility, g_esPanicPlayer[tank].g_iPanicAbility, g_esPanicSpecial[iType].g_iPanicAbility, g_esPanicAbility[iType].g_iPanicAbility, 1); + g_esPanicCache[tank].g_iPanicAmount = iGetSubSettingValue(apply, bHuman, g_esPanicTeammate[tank].g_iPanicAmount, g_esPanicPlayer[tank].g_iPanicAmount, g_esPanicSpecial[iType].g_iPanicAmount, g_esPanicAbility[iType].g_iPanicAmount, 1); g_esPanicCache[tank].g_iPanicCooldown = iGetSubSettingValue(apply, bHuman, g_esPanicTeammate[tank].g_iPanicCooldown, g_esPanicPlayer[tank].g_iPanicCooldown, g_esPanicSpecial[iType].g_iPanicCooldown, g_esPanicAbility[iType].g_iPanicCooldown, 1); g_esPanicCache[tank].g_iPanicDuration = iGetSubSettingValue(apply, bHuman, g_esPanicTeammate[tank].g_iPanicDuration, g_esPanicPlayer[tank].g_iPanicDuration, g_esPanicSpecial[iType].g_iPanicDuration, g_esPanicAbility[iType].g_iPanicDuration, 1); g_esPanicCache[tank].g_iPanicMessage = iGetSubSettingValue(apply, bHuman, g_esPanicTeammate[tank].g_iPanicMessage, g_esPanicPlayer[tank].g_iPanicMessage, g_esPanicSpecial[iType].g_iPanicMessage, g_esPanicAbility[iType].g_iPanicMessage, 1); + g_esPanicCache[tank].g_iPanicMode = iGetSubSettingValue(apply, bHuman, g_esPanicTeammate[tank].g_iPanicMode, g_esPanicPlayer[tank].g_iPanicMode, g_esPanicSpecial[iType].g_iPanicMode, g_esPanicAbility[iType].g_iPanicMode, 1); + g_esPanicCache[tank].g_iPanicType = iGetSubSettingValue(apply, bHuman, g_esPanicTeammate[tank].g_iPanicType, g_esPanicPlayer[tank].g_iPanicType, g_esPanicSpecial[iType].g_iPanicType, g_esPanicAbility[iType].g_iPanicType, 1); g_esPanicCache[tank].g_flOpenAreasOnly = flGetSubSettingValue(apply, bHuman, g_esPanicTeammate[tank].g_flOpenAreasOnly, g_esPanicPlayer[tank].g_flOpenAreasOnly, g_esPanicSpecial[iType].g_flOpenAreasOnly, g_esPanicAbility[iType].g_flOpenAreasOnly, 1); g_esPanicCache[tank].g_iRequiresHumans = iGetSubSettingValue(apply, bHuman, g_esPanicTeammate[tank].g_iRequiresHumans, g_esPanicPlayer[tank].g_iRequiresHumans, g_esPanicSpecial[iType].g_iRequiresHumans, g_esPanicAbility[iType].g_iRequiresHumans, 1); } @@ -664,9 +730,12 @@ public void MT_OnSettingsCached(int tank, bool apply, int type) g_esPanicCache[tank].g_iHumanDuration = iGetSettingValue(apply, bHuman, g_esPanicPlayer[tank].g_iHumanDuration, g_esPanicAbility[iType].g_iHumanDuration, 1); g_esPanicCache[tank].g_iHumanMode = iGetSettingValue(apply, bHuman, g_esPanicPlayer[tank].g_iHumanMode, g_esPanicAbility[iType].g_iHumanMode, 1); g_esPanicCache[tank].g_iPanicAbility = iGetSettingValue(apply, bHuman, g_esPanicPlayer[tank].g_iPanicAbility, g_esPanicAbility[iType].g_iPanicAbility, 1); + g_esPanicCache[tank].g_iPanicAmount = iGetSettingValue(apply, bHuman, g_esPanicPlayer[tank].g_iPanicAmount, g_esPanicAbility[iType].g_iPanicAmount, 1); g_esPanicCache[tank].g_iPanicCooldown = iGetSettingValue(apply, bHuman, g_esPanicPlayer[tank].g_iPanicCooldown, g_esPanicAbility[iType].g_iPanicCooldown, 1); g_esPanicCache[tank].g_iPanicDuration = iGetSettingValue(apply, bHuman, g_esPanicPlayer[tank].g_iPanicDuration, g_esPanicAbility[iType].g_iPanicDuration, 1); g_esPanicCache[tank].g_iPanicMessage = iGetSettingValue(apply, bHuman, g_esPanicPlayer[tank].g_iPanicMessage, g_esPanicAbility[iType].g_iPanicMessage, 1); + g_esPanicCache[tank].g_iPanicMode = iGetSettingValue(apply, bHuman, g_esPanicPlayer[tank].g_iPanicMode, g_esPanicAbility[iType].g_iPanicMode, 1); + g_esPanicCache[tank].g_iPanicType = iGetSettingValue(apply, bHuman, g_esPanicPlayer[tank].g_iPanicType, g_esPanicAbility[iType].g_iPanicType, 1); g_esPanicCache[tank].g_flOpenAreasOnly = flGetSettingValue(apply, bHuman, g_esPanicPlayer[tank].g_flOpenAreasOnly, g_esPanicAbility[iType].g_flOpenAreasOnly, 1); g_esPanicCache[tank].g_iRequiresHumans = iGetSettingValue(apply, bHuman, g_esPanicPlayer[tank].g_iRequiresHumans, g_esPanicAbility[iType].g_iRequiresHumans, 1); } @@ -745,7 +814,7 @@ public void MT_OnAbilityActivated(int tank) return; } - if (MT_IsTankSupported(tank) && (!bIsInfected(tank, MT_CHECK_FAKECLIENT) || g_esPanicCache[tank].g_iHumanAbility != 1) && MT_IsCustomTankSupported(tank) && g_esPanicCache[tank].g_iPanicAbility == 1 && g_esPanicCache[tank].g_iComboAbility == 0 && !g_esPanicPlayer[tank].g_bActivated) + if (MT_IsTankSupported(tank) && (!bIsInfected(tank, MT_CHECK_FAKECLIENT) || g_esPanicCache[tank].g_iHumanAbility != 1) && MT_IsCustomTankSupported(tank) && g_esPanicCache[tank].g_iPanicAbility > 0 && g_esPanicCache[tank].g_iComboAbility == 0 && !g_esPanicPlayer[tank].g_bActivated) { vPanicAbility(tank); } @@ -764,12 +833,12 @@ public void MT_OnButtonPressed(int tank, int button) return; } - if ((button & MT_MAIN_KEY) && g_esPanicCache[tank].g_iPanicAbility == 1 && g_esPanicCache[tank].g_iHumanAbility == 1) + if ((button & MT_MAIN_KEY) && g_esPanicCache[tank].g_iPanicAbility > 0 && g_esPanicCache[tank].g_iHumanAbility == 1) { - int iTime = GetTime(); + int iHumanMode = g_esPanicCache[tank].g_iHumanMode, iTime = GetTime(); bool bRecharging = g_esPanicPlayer[tank].g_iCooldown != -1 && g_esPanicPlayer[tank].g_iCooldown >= iTime; - switch (g_esPanicCache[tank].g_iHumanMode) + switch (iHumanMode) { case 0: { @@ -786,9 +855,9 @@ public void MT_OnButtonPressed(int tank, int button) MT_PrintToChat(tank, "%s %t", MT_TAG3, "PanicHuman4", (g_esPanicPlayer[tank].g_iCooldown - iTime)); } } - case 1: + case 1, 2: { - if (g_esPanicPlayer[tank].g_iAmmoCount < g_esPanicCache[tank].g_iHumanAmmo && g_esPanicCache[tank].g_iHumanAmmo > 0) + if ((iHumanMode == 2 && g_esPanicPlayer[tank].g_bActivated) || (g_esPanicPlayer[tank].g_iAmmoCount < g_esPanicCache[tank].g_iHumanAmmo && g_esPanicCache[tank].g_iHumanAmmo > 0)) { if (!g_esPanicPlayer[tank].g_bActivated && !bRecharging) { @@ -800,7 +869,11 @@ public void MT_OnButtonPressed(int tank, int button) } else if (g_esPanicPlayer[tank].g_bActivated) { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "PanicHuman3"); + switch (iHumanMode) + { + case 1: MT_PrintToChat(tank, "%s %t", MT_TAG3, "PanicHuman3"); + case 2: vPanicReset2(tank); + } } else if (bRecharging) { @@ -903,19 +976,40 @@ void vPanic2(int tank, int pos = -1) void vPanic3(int tank) { - switch (g_bSecondGame) + if (bIsAreaNarrow(tank, g_esPanicCache[tank].g_flOpenAreasOnly) || bIsAreaWide(tank, g_esPanicCache[tank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esPanicPlayer[tank].g_iTankType, tank) || (g_esPanicCache[tank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esPanicCache[tank].g_iRequiresHumans) || (!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esPanicAbility[g_esPanicPlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esPanicPlayer[tank].g_iAccessFlags))) { - case true: + return; + } + + if (g_esPanicCache[tank].g_iPanicAbility == 1 || g_esPanicCache[tank].g_iPanicAbility == 3) + { + switch (g_bSecondGame) + { + case true: + { + int iDirector = CreateEntityByName("info_director"); + if (IsValidEntity(iDirector)) + { + DispatchSpawn(iDirector); + AcceptEntityInput(iDirector, "ForcePanicEvent"); + RemoveEntity(iDirector); + } + } + case false: vCheatCommand(tank, "director_force_panic_event"); + } + } + + if (g_esPanicCache[tank].g_iPanicAbility == 2 || g_esPanicCache[tank].g_iPanicAbility == 3) + { + for (int iZombie = 1; iZombie <= g_esPanicCache[tank].g_iPanicAmount; iZombie++) { - int iDirector = CreateEntityByName("info_director"); - if (IsValidEntity(iDirector)) + switch (g_esPanicCache[tank].g_iPanicMode) { - DispatchSpawn(iDirector); - AcceptEntityInput(iDirector, "ForcePanicEvent"); - RemoveEntity(iDirector); + case 0: vSpawnZombie(tank, (MT_GetRandomInt(1, 2) == 2)); + case 1: vSpawnZombie(tank, false); + case 2: vSpawnZombie(tank, true); } } - case false: vCheatCommand(tank, "director_force_panic_event"); } } @@ -945,7 +1039,7 @@ void vPanicAbility(int tank) void vPanicRange(int tank, bool idle) { - if (MT_IsTankSupported(tank, MT_CHECK_INDEX|MT_CHECK_INGAME) && MT_IsCustomTankSupported(tank) && g_esPanicCache[tank].g_iPanicAbility == 1 && GetRandomFloat(0.1, 100.0) <= g_esPanicCache[tank].g_flPanicChance) + if (MT_IsTankSupported(tank, MT_CHECK_INDEX|MT_CHECK_INGAME) && MT_IsCustomTankSupported(tank) && g_esPanicCache[tank].g_iPanicAbility > 0 && GetRandomFloat(0.1, 100.0) <= g_esPanicCache[tank].g_flPanicChance) { if ((idle && MT_IsTankIdle(tank)) || bIsAreaNarrow(tank, g_esPanicCache[tank].g_flOpenAreasOnly) || bIsAreaWide(tank, g_esPanicCache[tank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esPanicPlayer[tank].g_iTankType, tank) || (g_esPanicCache[tank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esPanicCache[tank].g_iRequiresHumans) || (bIsInfected(tank, MT_CHECK_FAKECLIENT) && ((!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esPanicAbility[g_esPanicPlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esPanicPlayer[tank].g_iAccessFlags)) || g_esPanicCache[tank].g_iHumanAbility == 0))) { @@ -993,18 +1087,98 @@ void vPanicReset2(int tank) } } -void tTimerPanicCombo(Handle timer, DataPack pack) +void vSpawnUncommon(int tank, const char[] model) +{ + int iCommon = CreateEntityByName("infected"); + if (bIsValidEntity(iCommon)) + { + SetEntityModel(iCommon, model); + SetEntProp(iCommon, Prop_Data, "m_nNextThinkTick", (RoundToNearest(GetGameTime() / GetTickInterval()) + 5)); + DispatchSpawn(iCommon); + ActivateEntity(iCommon); + + float flOrigin[3], flAngles[3]; + GetClientAbsOrigin(tank, flOrigin); + GetClientEyeAngles(tank, flAngles); + + flOrigin[0] += (50.0 * (Cosine(DegToRad(flAngles[1])))); + flOrigin[1] += (50.0 * (Sine(DegToRad(flAngles[1])))); + flOrigin[2] += 5.0; + + TeleportEntity(iCommon, flOrigin); + } +} + +void vSpawnZombie(int tank, bool uncommon) +{ + switch (uncommon) + { + case true: + { + switch (g_bSecondGame) + { + case true: + { + int iTypeCount = 0, iTypes[7], iFlag = 0; + for (int iBit = 0; iBit < (sizeof iTypes); iBit++) + { + iFlag = (1 << iBit); + if (!(g_esPanicCache[tank].g_iPanicType & iFlag)) + { + continue; + } + + iTypes[iTypeCount] = iFlag; + iTypeCount++; + } + + int iType = (iTypeCount > 0) ? iTypes[MT_GetRandomInt(0, (iTypeCount - 1))] : iTypes[0]; + + switch (iType) + { + case 1: vSpawnUncommon(tank, MODEL_CEDA); + case 2: vSpawnUncommon(tank, MODEL_JIMMY); + case 4: vSpawnUncommon(tank, MODEL_FALLEN); + case 8: vSpawnUncommon(tank, MODEL_CLOWN); + case 16: vSpawnUncommon(tank, MODEL_MUDMAN); + case 32: vSpawnUncommon(tank, MODEL_ROADCREW); + case 64: vSpawnUncommon(tank, MODEL_RIOTCOP); + default: + { + switch (MT_GetRandomInt(1, (sizeof iTypes))) + { + case 1: vSpawnUncommon(tank, MODEL_CEDA); + case 2: vSpawnUncommon(tank, MODEL_JIMMY); + case 3: vSpawnUncommon(tank, MODEL_FALLEN); + case 4: vSpawnUncommon(tank, MODEL_CLOWN); + case 5: vSpawnUncommon(tank, MODEL_MUDMAN); + case 6: vSpawnUncommon(tank, MODEL_ROADCREW); + case 7: vSpawnUncommon(tank, MODEL_RIOTCOP); + } + } + } + } + case false: vSpawnZombie(tank, false); + } + } + case false: vCheatCommand(tank, (g_bSecondGame ? "z_spawn_old" : "z_spawn"), "zombie area"); + } +} + +Action tTimerPanicCombo(Handle timer, DataPack pack) { pack.Reset(); int iTank = GetClientOfUserId(pack.ReadCell()); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esPanicAbility[g_esPanicPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esPanicPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esPanicPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esPanicCache[iTank].g_iPanicAbility == 0 || g_esPanicPlayer[iTank].g_bActivated) { - return; + return Plugin_Stop; } int iPos = pack.ReadCell(); vPanic(iTank, iPos); + + return Plugin_Continue; } Action tTimerPanic(Handle timer, DataPack pack) diff --git a/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_pimp.sp b/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_pimp.sp deleted file mode 100644 index 458e4ac640..0000000000 --- a/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_pimp.sp +++ /dev/null @@ -1,1286 +0,0 @@ -/** - * Mutant Tanks: a L4D/L4D2 SourceMod Plugin - * Copyright (C) 2024 Alfred "Psyk0tik" Llagas - * - * 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 . - **/ - -#define MT_PIMP_COMPILE_METHOD 0 // 0: packaged, 1: standalone - -#if !defined MT_ABILITIES_MAIN2 - #if MT_PIMP_COMPILE_METHOD == 1 - #include - #include - #else - #error This file must be inside "scripting/mutant_tanks/abilities2" while compiling "mt_abilities2.sp" to include its content. - #endif -public Plugin myinfo = -{ - name = "[MT] Pimp Ability", - author = MT_AUTHOR, - description = "The Mutant Tank pimp slaps survivors.", - version = MT_VERSION, - url = MT_URL -}; - -bool g_bDedicated, g_bLateLoad; - -public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max) -{ - EngineVersion evEngine = GetEngineVersion(); - if (evEngine != Engine_Left4Dead && evEngine != Engine_Left4Dead2) - { - strcopy(error, err_max, "\"[MT] Pimp Ability\" only supports Left 4 Dead 1 & 2."); - - return APLRes_SilentFailure; - } - - g_bDedicated = IsDedicatedServer(); - g_bLateLoad = late; - - return APLRes_Success; -} - -#define PARTICLE_BLOOD "boomer_explode_D" -#else - #if MT_PIMP_COMPILE_METHOD == 1 - #error This file must be compiled as a standalone plugin. - #endif -#endif - -#define MT_PIMP_SECTION "pimpability" -#define MT_PIMP_SECTION2 "pimp ability" -#define MT_PIMP_SECTION3 "pimp_ability" -#define MT_PIMP_SECTION4 "pimp" - -#define MT_MENU_PIMP "Pimp Ability" - -enum struct esPimpPlayer -{ - bool g_bAffected; - bool g_bFailed; - bool g_bNoAmmo; - - float g_flCloseAreasOnly; - float g_flOpenAreasOnly; - float g_flPimpChance; - float g_flPimpInterval; - float g_flPimpRange; - float g_flPimpRangeChance; - - int g_iAccessFlags; - int g_iAmmoCount; - int g_iComboAbility; - int g_iCooldown; - int g_iHumanAbility; - int g_iHumanAmmo; - int g_iHumanCooldown; - int g_iHumanRangeCooldown; - int g_iImmunityFlags; - int g_iOwner; - int g_iPimpAbility; - int g_iPimpCooldown; - int g_iPimpDamage; - int g_iPimpDuration; - int g_iPimpEffect; - int g_iPimpHit; - int g_iPimpHitMode; - int g_iPimpMessage; - int g_iPimpRangeCooldown; - int g_iPimpSight; - int g_iRangeCooldown; - int g_iRequiresHumans; - int g_iTankType; - int g_iTankTypeRecorded; -} - -esPimpPlayer g_esPimpPlayer[MAXPLAYERS + 1]; - -enum struct esPimpTeammate -{ - float g_flCloseAreasOnly; - float g_flOpenAreasOnly; - float g_flPimpChance; - float g_flPimpInterval; - float g_flPimpRange; - float g_flPimpRangeChance; - - int g_iComboAbility; - int g_iHumanAbility; - int g_iHumanAmmo; - int g_iHumanCooldown; - int g_iHumanRangeCooldown; - int g_iPimpAbility; - int g_iPimpCooldown; - int g_iPimpDamage; - int g_iPimpDuration; - int g_iPimpEffect; - int g_iPimpHit; - int g_iPimpHitMode; - int g_iPimpMessage; - int g_iPimpRangeCooldown; - int g_iPimpSight; - int g_iRequiresHumans; -} - -esPimpTeammate g_esPimpTeammate[MAXPLAYERS + 1]; - -enum struct esPimpAbility -{ - float g_flCloseAreasOnly; - float g_flOpenAreasOnly; - float g_flPimpChance; - float g_flPimpInterval; - float g_flPimpRange; - float g_flPimpRangeChance; - - int g_iAccessFlags; - int g_iComboAbility; - int g_iHumanAbility; - int g_iHumanAmmo; - int g_iHumanCooldown; - int g_iHumanRangeCooldown; - int g_iImmunityFlags; - int g_iPimpAbility; - int g_iPimpCooldown; - int g_iPimpDamage; - int g_iPimpDuration; - int g_iPimpEffect; - int g_iPimpHit; - int g_iPimpHitMode; - int g_iPimpMessage; - int g_iPimpRangeCooldown; - int g_iPimpSight; - int g_iRequiresHumans; -} - -esPimpAbility g_esPimpAbility[MT_MAXTYPES + 1]; - -enum struct esPimpSpecial -{ - float g_flCloseAreasOnly; - float g_flOpenAreasOnly; - float g_flPimpChance; - float g_flPimpInterval; - float g_flPimpRange; - float g_flPimpRangeChance; - - int g_iComboAbility; - int g_iHumanAbility; - int g_iHumanAmmo; - int g_iHumanCooldown; - int g_iHumanRangeCooldown; - int g_iPimpAbility; - int g_iPimpCooldown; - int g_iPimpDamage; - int g_iPimpDuration; - int g_iPimpEffect; - int g_iPimpHit; - int g_iPimpHitMode; - int g_iPimpMessage; - int g_iPimpRangeCooldown; - int g_iPimpSight; - int g_iRequiresHumans; -} - -esPimpSpecial g_esPimpSpecial[MT_MAXTYPES + 1]; - -enum struct esPimpCache -{ - float g_flCloseAreasOnly; - float g_flOpenAreasOnly; - float g_flPimpChance; - float g_flPimpInterval; - float g_flPimpRange; - float g_flPimpRangeChance; - - int g_iComboAbility; - int g_iHumanAbility; - int g_iHumanAmmo; - int g_iHumanCooldown; - int g_iHumanRangeCooldown; - int g_iPimpAbility; - int g_iPimpCooldown; - int g_iPimpDamage; - int g_iPimpDuration; - int g_iPimpEffect; - int g_iPimpHit; - int g_iPimpHitMode; - int g_iPimpMessage; - int g_iPimpRangeCooldown; - int g_iPimpSight; - int g_iRequiresHumans; -} - -esPimpCache g_esPimpCache[MAXPLAYERS + 1]; - -#if !defined MT_ABILITIES_MAIN2 -public void OnPluginStart() -{ - LoadTranslations("common.phrases"); - LoadTranslations("mutant_tanks.phrases"); - LoadTranslations("mutant_tanks_names.phrases"); - - RegConsoleCmd("sm_mt_pimp", cmdPimpInfo, "View information about the Pimp ability."); - - if (g_bLateLoad) - { - for (int iPlayer = 1; iPlayer <= MaxClients; iPlayer++) - { - if (bIsValidClient(iPlayer, MT_CHECK_INGAME)) - { - OnClientPutInServer(iPlayer); - } - } - - g_bLateLoad = false; - } -} -#endif - -#if defined MT_ABILITIES_MAIN2 -void vPimpMapStart() -#else -public void OnMapStart() -#endif -{ - vPimpReset(); -} - -#if defined MT_ABILITIES_MAIN2 -void vPimpClientPutInServer(int client) -#else -public void OnClientPutInServer(int client) -#endif -{ - SDKHook(client, SDKHook_OnTakeDamage, OnPimpTakeDamage); - vRemovePimp(client); -} - -#if defined MT_ABILITIES_MAIN2 -void vPimpClientDisconnect_Post(int client) -#else -public void OnClientDisconnect_Post(int client) -#endif -{ - vRemovePimp(client); -} - -#if defined MT_ABILITIES_MAIN2 -void vPimpMapEnd() -#else -public void OnMapEnd() -#endif -{ - vPimpReset(); -} - -#if !defined MT_ABILITIES_MAIN2 -Action cmdPimpInfo(int client, int args) -{ - client = iGetListenServerHost(client, g_bDedicated); - - if (!MT_IsCorePluginEnabled()) - { - MT_ReplyToCommand(client, "%s %t", MT_TAG5, "PluginDisabled"); - - return Plugin_Handled; - } - - if (!bIsValidClient(client, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_FAKECLIENT)) - { - MT_ReplyToCommand(client, "%s %t", MT_TAG, "Command is in-game only"); - - return Plugin_Handled; - } - - switch (IsVoteInProgress()) - { - case true: MT_ReplyToCommand(client, "%s %t", MT_TAG2, "Vote in Progress"); - case false: vPimpMenu(client, MT_PIMP_SECTION4, 0); - } - - return Plugin_Handled; -} -#endif - -void vPimpMenu(int client, const char[] name, int item) -{ - if (StrContains(MT_PIMP_SECTION4, name, false) == -1) - { - return; - } - - Menu mAbilityMenu = new Menu(iPimpMenuHandler, MENU_ACTIONS_DEFAULT|MenuAction_Display|MenuAction_DisplayItem); - mAbilityMenu.SetTitle("Pimp Ability Information"); - mAbilityMenu.AddItem("Status", "Status"); - mAbilityMenu.AddItem("Ammunition", "Ammunition"); - mAbilityMenu.AddItem("Buttons", "Buttons"); - mAbilityMenu.AddItem("Cooldown", "Cooldown"); - mAbilityMenu.AddItem("Details", "Details"); - mAbilityMenu.AddItem("Duration", "Duration"); - mAbilityMenu.AddItem("Human Support", "Human Support"); - mAbilityMenu.AddItem("Range Cooldown", "Range Cooldown"); - mAbilityMenu.DisplayAt(client, item, MENU_TIME_FOREVER); -} - -int iPimpMenuHandler(Menu menu, MenuAction action, int param1, int param2) -{ - switch (action) - { - case MenuAction_End: delete menu; - case MenuAction_Select: - { - switch (param2) - { - case 0: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esPimpCache[param1].g_iPimpAbility == 0) ? "AbilityStatus1" : "AbilityStatus2"); - case 1: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityAmmo", (g_esPimpCache[param1].g_iHumanAmmo - g_esPimpPlayer[param1].g_iAmmoCount), g_esPimpCache[param1].g_iHumanAmmo); - case 2: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtons2"); - case 3: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityCooldown", ((g_esPimpCache[param1].g_iHumanAbility == 1) ? g_esPimpCache[param1].g_iHumanCooldown : g_esPimpCache[param1].g_iPimpCooldown)); - case 4: MT_PrintToChat(param1, "%s %t", MT_TAG3, "PimpDetails"); - case 5: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityDuration2", g_esPimpCache[param1].g_iPimpDuration); - case 6: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esPimpCache[param1].g_iHumanAbility == 0) ? "AbilityHumanSupport1" : "AbilityHumanSupport2"); - case 7: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityRangeCooldown", ((g_esPimpCache[param1].g_iHumanAbility == 1) ? g_esPimpCache[param1].g_iHumanRangeCooldown : g_esPimpCache[param1].g_iPimpRangeCooldown)); - } - - if (bIsValidClient(param1, MT_CHECK_INGAME)) - { - vPimpMenu(param1, MT_PIMP_SECTION4, menu.Selection); - } - } - case MenuAction_Display: - { - char sMenuTitle[PLATFORM_MAX_PATH]; - Panel pPimp = view_as(param2); - FormatEx(sMenuTitle, sizeof sMenuTitle, "%T", "PimpMenu", param1); - pPimp.SetTitle(sMenuTitle); - } - case MenuAction_DisplayItem: - { - if (param2 >= 0) - { - char sMenuOption[PLATFORM_MAX_PATH]; - - switch (param2) - { - case 0: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Status", param1); - case 1: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Ammunition", param1); - case 2: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Buttons", param1); - case 3: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Cooldown", param1); - case 4: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Details", param1); - case 5: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Duration", param1); - case 6: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "HumanSupport", param1); - case 7: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "RangeCooldown", param1); - } - - return RedrawMenuItem(sMenuOption); - } - } - } - - return 0; -} - -#if defined MT_ABILITIES_MAIN2 -void vPimpDisplayMenu(Menu menu) -#else -public void MT_OnDisplayMenu(Menu menu) -#endif -{ - menu.AddItem(MT_MENU_PIMP, MT_MENU_PIMP); -} - -#if defined MT_ABILITIES_MAIN2 -void vPimpMenuItemSelected(int client, const char[] info) -#else -public void MT_OnMenuItemSelected(int client, const char[] info) -#endif -{ - if (StrEqual(info, MT_MENU_PIMP, false)) - { - vPimpMenu(client, MT_PIMP_SECTION4, 0); - } -} - -#if defined MT_ABILITIES_MAIN2 -void vPimpMenuItemDisplayed(int client, const char[] info, char[] buffer, int size) -#else -public void MT_OnMenuItemDisplayed(int client, const char[] info, char[] buffer, int size) -#endif -{ - if (StrEqual(info, MT_MENU_PIMP, false)) - { - FormatEx(buffer, size, "%T", "PimpMenu2", client); - } -} - -Action OnPimpTakeDamage(int victim, int &attacker, int &inflictor, float &damage, int &damagetype) -{ - if (MT_IsCorePluginEnabled() && bIsValidClient(victim, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_ALIVE) && damage > 0.0) - { - char sClassname[32]; - if (bIsValidEntity(inflictor)) - { - GetEntityClassname(inflictor, sClassname, sizeof sClassname); - } - - if (MT_IsTankSupported(attacker) && MT_IsCustomTankSupported(attacker) && (g_esPimpCache[attacker].g_iPimpHitMode == 0 || g_esPimpCache[attacker].g_iPimpHitMode == 1) && bIsSurvivor(victim) && g_esPimpCache[attacker].g_iComboAbility == 0) - { - if ((!MT_HasAdminAccess(attacker) && !bHasAdminAccess(attacker, g_esPimpAbility[g_esPimpPlayer[attacker].g_iTankTypeRecorded].g_iAccessFlags, g_esPimpPlayer[attacker].g_iAccessFlags)) || MT_IsAdminImmune(victim, attacker) || bIsAdminImmune(victim, g_esPimpPlayer[attacker].g_iTankType, g_esPimpAbility[g_esPimpPlayer[attacker].g_iTankTypeRecorded].g_iImmunityFlags, g_esPimpPlayer[victim].g_iImmunityFlags)) - { - return Plugin_Continue; - } - - bool bCaught = bIsSurvivorCaught(victim); - if ((bIsSpecialInfected(attacker) && (bCaught || (!bCaught && (damagetype & DMG_CLUB)) || (bIsSpitter(attacker) && StrEqual(sClassname, "insect_swarm")))) || StrEqual(sClassname[7], "tank_claw") || StrEqual(sClassname, "tank_rock")) - { - vPimpHit(victim, attacker, GetRandomFloat(0.1, 100.0), g_esPimpCache[attacker].g_flPimpChance, g_esPimpCache[attacker].g_iPimpHit, MT_MESSAGE_MELEE, MT_ATTACK_CLAW); - } - } - else if (MT_IsTankSupported(victim) && MT_IsCustomTankSupported(victim) && (g_esPimpCache[victim].g_iPimpHitMode == 0 || g_esPimpCache[victim].g_iPimpHitMode == 2) && bIsSurvivor(attacker) && g_esPimpCache[victim].g_iComboAbility == 0) - { - if ((!MT_HasAdminAccess(victim) && !bHasAdminAccess(victim, g_esPimpAbility[g_esPimpPlayer[victim].g_iTankTypeRecorded].g_iAccessFlags, g_esPimpPlayer[victim].g_iAccessFlags)) || MT_IsAdminImmune(attacker, victim) || bIsAdminImmune(attacker, g_esPimpPlayer[victim].g_iTankType, g_esPimpAbility[g_esPimpPlayer[victim].g_iTankTypeRecorded].g_iImmunityFlags, g_esPimpPlayer[attacker].g_iImmunityFlags)) - { - return Plugin_Continue; - } - - if (StrEqual(sClassname[7], "melee")) - { - vPimpHit(attacker, victim, GetRandomFloat(0.1, 100.0), g_esPimpCache[victim].g_flPimpChance, g_esPimpCache[victim].g_iPimpHit, MT_MESSAGE_MELEE, MT_ATTACK_MELEE); - } - } - } - - return Plugin_Continue; -} - -#if defined MT_ABILITIES_MAIN2 -void vPimpPluginCheck(ArrayList list) -#else -public void MT_OnPluginCheck(ArrayList list) -#endif -{ - list.PushString(MT_MENU_PIMP); -} - -#if defined MT_ABILITIES_MAIN2 -void vPimpAbilityCheck(ArrayList list, ArrayList list2, ArrayList list3, ArrayList list4) -#else -public void MT_OnAbilityCheck(ArrayList list, ArrayList list2, ArrayList list3, ArrayList list4) -#endif -{ - list.PushString(MT_PIMP_SECTION); - list2.PushString(MT_PIMP_SECTION2); - list3.PushString(MT_PIMP_SECTION3); - list4.PushString(MT_PIMP_SECTION4); -} - -#if defined MT_ABILITIES_MAIN2 -void vPimpCombineAbilities(int tank, int type, const float random, const char[] combo, int survivor, const char[] classname) -#else -public void MT_OnCombineAbilities(int tank, int type, const float random, const char[] combo, int survivor, int weapon, const char[] classname) -#endif -{ - if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esPimpCache[tank].g_iHumanAbility != 2) - { - return; - } - - char sCombo[320], sSet[4][32]; - FormatEx(sCombo, sizeof sCombo, ",%s,", combo); - FormatEx(sSet[0], sizeof sSet[], ",%s,", MT_PIMP_SECTION); - FormatEx(sSet[1], sizeof sSet[], ",%s,", MT_PIMP_SECTION2); - FormatEx(sSet[2], sizeof sSet[], ",%s,", MT_PIMP_SECTION3); - FormatEx(sSet[3], sizeof sSet[], ",%s,", MT_PIMP_SECTION4); - if (g_esPimpCache[tank].g_iComboAbility == 1 && (StrContains(sCombo, sSet[0], false) != -1 || StrContains(sCombo, sSet[1], false) != -1 || StrContains(sCombo, sSet[2], false) != -1 || StrContains(sCombo, sSet[3], false) != -1)) - { - char sAbilities[320], sSubset[10][32]; - strcopy(sAbilities, sizeof sAbilities, combo); - ExplodeString(sAbilities, ",", sSubset, sizeof sSubset, sizeof sSubset[]); - - float flChance = 0.0, flDelay = 0.0; - for (int iPos = 0; iPos < (sizeof sSubset); iPos++) - { - if (StrEqual(sSubset[iPos], MT_PIMP_SECTION, false) || StrEqual(sSubset[iPos], MT_PIMP_SECTION2, false) || StrEqual(sSubset[iPos], MT_PIMP_SECTION3, false) || StrEqual(sSubset[iPos], MT_PIMP_SECTION4, false)) - { - flDelay = MT_GetCombinationSetting(tank, 4, iPos); - - switch (type) - { - case MT_COMBO_MAINRANGE: - { - if (g_esPimpCache[tank].g_iPimpAbility == 1) - { - switch (flDelay) - { - case 0.0: vPimpAbility(tank, random, iPos); - default: - { - DataPack dpCombo; - CreateDataTimer(flDelay, tTimerPimpCombo, dpCombo, TIMER_FLAG_NO_MAPCHANGE); - dpCombo.WriteCell(GetClientUserId(tank)); - dpCombo.WriteFloat(random); - dpCombo.WriteCell(iPos); - } - } - } - } - case MT_COMBO_MELEEHIT: - { - flChance = MT_GetCombinationSetting(tank, 1, iPos); - - switch (flDelay) - { - case 0.0: - { - if ((g_esPimpCache[tank].g_iPimpHitMode == 0 || g_esPimpCache[tank].g_iPimpHitMode == 1) && (StrEqual(classname[7], "tank_claw") || StrEqual(classname, "tank_rock"))) - { - vPimpHit(survivor, tank, random, flChance, g_esPimpCache[tank].g_iPimpHit, MT_MESSAGE_MELEE, MT_ATTACK_CLAW, iPos); - } - else if ((g_esPimpCache[tank].g_iPimpHitMode == 0 || g_esPimpCache[tank].g_iPimpHitMode == 2) && StrEqual(classname[7], "melee")) - { - vPimpHit(survivor, tank, random, flChance, g_esPimpCache[tank].g_iPimpHit, MT_MESSAGE_MELEE, MT_ATTACK_MELEE, iPos); - } - } - default: - { - DataPack dpCombo; - CreateDataTimer(flDelay, tTimerPimpCombo2, dpCombo, TIMER_FLAG_NO_MAPCHANGE); - dpCombo.WriteCell(GetClientUserId(survivor)); - dpCombo.WriteCell(GetClientUserId(tank)); - dpCombo.WriteFloat(random); - dpCombo.WriteFloat(flChance); - dpCombo.WriteCell(iPos); - dpCombo.WriteString(classname); - } - } - } - } - - break; - } - } - } -} - -#if defined MT_ABILITIES_MAIN2 -void vPimpConfigsLoad(int mode) -#else -public void MT_OnConfigsLoad(int mode) -#endif -{ - switch (mode) - { - case 1: - { - for (int iIndex = MT_GetMinType(); iIndex <= MT_GetMaxType(); iIndex++) - { - g_esPimpAbility[iIndex].g_iAccessFlags = 0; - g_esPimpAbility[iIndex].g_iImmunityFlags = 0; - g_esPimpAbility[iIndex].g_flCloseAreasOnly = 0.0; - g_esPimpAbility[iIndex].g_iComboAbility = 0; - g_esPimpAbility[iIndex].g_iHumanAbility = 0; - g_esPimpAbility[iIndex].g_iHumanAmmo = 5; - g_esPimpAbility[iIndex].g_iHumanCooldown = 0; - g_esPimpAbility[iIndex].g_iHumanRangeCooldown = 0; - g_esPimpAbility[iIndex].g_flOpenAreasOnly = 0.0; - g_esPimpAbility[iIndex].g_iRequiresHumans = 0; - g_esPimpAbility[iIndex].g_iPimpAbility = 0; - g_esPimpAbility[iIndex].g_iPimpEffect = 0; - g_esPimpAbility[iIndex].g_iPimpMessage = 0; - g_esPimpAbility[iIndex].g_flPimpChance = 33.3; - g_esPimpAbility[iIndex].g_iPimpCooldown = 0; - g_esPimpAbility[iIndex].g_iPimpDamage = 1; - g_esPimpAbility[iIndex].g_iPimpDuration = 5; - g_esPimpAbility[iIndex].g_iPimpHit = 0; - g_esPimpAbility[iIndex].g_iPimpHitMode = 0; - g_esPimpAbility[iIndex].g_flPimpInterval = 1.0; - g_esPimpAbility[iIndex].g_flPimpRange = 150.0; - g_esPimpAbility[iIndex].g_flPimpRangeChance = 15.0; - g_esPimpAbility[iIndex].g_iPimpRangeCooldown = 0; - g_esPimpAbility[iIndex].g_iPimpSight = 0; - - g_esPimpSpecial[iIndex].g_flCloseAreasOnly = -1.0; - g_esPimpSpecial[iIndex].g_iComboAbility = -1; - g_esPimpSpecial[iIndex].g_iHumanAbility = -1; - g_esPimpSpecial[iIndex].g_iHumanAmmo = -1; - g_esPimpSpecial[iIndex].g_iHumanCooldown = -1; - g_esPimpSpecial[iIndex].g_iHumanRangeCooldown = -1; - g_esPimpSpecial[iIndex].g_flOpenAreasOnly = -1.0; - g_esPimpSpecial[iIndex].g_iRequiresHumans = -1; - g_esPimpSpecial[iIndex].g_iPimpAbility = -1; - g_esPimpSpecial[iIndex].g_iPimpEffect = -1; - g_esPimpSpecial[iIndex].g_iPimpMessage = -1; - g_esPimpSpecial[iIndex].g_flPimpChance = -1.0; - g_esPimpSpecial[iIndex].g_iPimpCooldown = -1; - g_esPimpSpecial[iIndex].g_iPimpDamage = -1; - g_esPimpSpecial[iIndex].g_iPimpDuration = -1; - g_esPimpSpecial[iIndex].g_iPimpHit = -1; - g_esPimpSpecial[iIndex].g_iPimpHitMode = -1; - g_esPimpSpecial[iIndex].g_flPimpInterval = -1.0; - g_esPimpSpecial[iIndex].g_flPimpRange = -1.0; - g_esPimpSpecial[iIndex].g_flPimpRangeChance = -1.0; - g_esPimpSpecial[iIndex].g_iPimpRangeCooldown = -1; - g_esPimpSpecial[iIndex].g_iPimpSight = -1; - } - } - case 3: - { - for (int iPlayer = 1; iPlayer <= MaxClients; iPlayer++) - { - g_esPimpPlayer[iPlayer].g_iAccessFlags = -1; - g_esPimpPlayer[iPlayer].g_iImmunityFlags = -1; - g_esPimpPlayer[iPlayer].g_flCloseAreasOnly = -1.0; - g_esPimpPlayer[iPlayer].g_iComboAbility = -1; - g_esPimpPlayer[iPlayer].g_iHumanAbility = -1; - g_esPimpPlayer[iPlayer].g_iHumanAmmo = -1; - g_esPimpPlayer[iPlayer].g_iHumanCooldown = -1; - g_esPimpPlayer[iPlayer].g_iHumanRangeCooldown = -1; - g_esPimpPlayer[iPlayer].g_flOpenAreasOnly = -1.0; - g_esPimpPlayer[iPlayer].g_iRequiresHumans = -1; - g_esPimpPlayer[iPlayer].g_iPimpAbility = -1; - g_esPimpPlayer[iPlayer].g_iPimpEffect = -1; - g_esPimpPlayer[iPlayer].g_iPimpMessage = -1; - g_esPimpPlayer[iPlayer].g_flPimpChance = -1.0; - g_esPimpPlayer[iPlayer].g_iPimpCooldown = -1; - g_esPimpPlayer[iPlayer].g_iPimpDamage = -1; - g_esPimpPlayer[iPlayer].g_iPimpDuration = -1; - g_esPimpPlayer[iPlayer].g_iPimpHit = -1; - g_esPimpPlayer[iPlayer].g_iPimpHitMode = -1; - g_esPimpPlayer[iPlayer].g_flPimpInterval = -1.0; - g_esPimpPlayer[iPlayer].g_flPimpRange = -1.0; - g_esPimpPlayer[iPlayer].g_flPimpRangeChance = -1.0; - g_esPimpPlayer[iPlayer].g_iPimpRangeCooldown = -1; - g_esPimpPlayer[iPlayer].g_iPimpSight = -1; - - g_esPimpTeammate[iPlayer].g_flCloseAreasOnly = -1.0; - g_esPimpTeammate[iPlayer].g_iComboAbility = -1; - g_esPimpTeammate[iPlayer].g_iHumanAbility = -1; - g_esPimpTeammate[iPlayer].g_iHumanAmmo = -1; - g_esPimpTeammate[iPlayer].g_iHumanCooldown = -1; - g_esPimpTeammate[iPlayer].g_iHumanRangeCooldown = -1; - g_esPimpTeammate[iPlayer].g_flOpenAreasOnly = -1.0; - g_esPimpTeammate[iPlayer].g_iRequiresHumans = -1; - g_esPimpTeammate[iPlayer].g_iPimpAbility = -1; - g_esPimpTeammate[iPlayer].g_iPimpEffect = -1; - g_esPimpTeammate[iPlayer].g_iPimpMessage = -1; - g_esPimpTeammate[iPlayer].g_flPimpChance = -1.0; - g_esPimpTeammate[iPlayer].g_iPimpCooldown = -1; - g_esPimpTeammate[iPlayer].g_iPimpDamage = -1; - g_esPimpTeammate[iPlayer].g_iPimpDuration = -1; - g_esPimpTeammate[iPlayer].g_iPimpHit = -1; - g_esPimpTeammate[iPlayer].g_iPimpHitMode = -1; - g_esPimpTeammate[iPlayer].g_flPimpInterval = -1.0; - g_esPimpTeammate[iPlayer].g_flPimpRange = -1.0; - g_esPimpTeammate[iPlayer].g_flPimpRangeChance = -1.0; - g_esPimpTeammate[iPlayer].g_iPimpRangeCooldown = -1; - g_esPimpTeammate[iPlayer].g_iPimpSight = -1; - } - } - } -} - -#if defined MT_ABILITIES_MAIN2 -void vPimpConfigsLoaded(const char[] subsection, const char[] key, const char[] value, int type, int admin, int mode, bool special, const char[] specsection) -#else -public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const char[] value, int type, int admin, int mode, bool special, const char[] specsection) -#endif -{ - if ((mode == -1 || mode == 3) && bIsValidClient(admin)) - { - if (special && specsection[0] != '\0') - { - g_esPimpTeammate[admin].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esPimpTeammate[admin].g_flCloseAreasOnly, value, -1.0, 99999.0); - g_esPimpTeammate[admin].g_iComboAbility = iGetKeyValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "ComboAbility", "Combo Ability", "Combo_Ability", "combo", g_esPimpTeammate[admin].g_iComboAbility, value, -1, 1); - g_esPimpTeammate[admin].g_iHumanAbility = iGetKeyValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esPimpTeammate[admin].g_iHumanAbility, value, -1, 2); - g_esPimpTeammate[admin].g_iHumanAmmo = iGetKeyValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esPimpTeammate[admin].g_iHumanAmmo, value, -1, 99999); - g_esPimpTeammate[admin].g_iHumanCooldown = iGetKeyValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esPimpTeammate[admin].g_iHumanCooldown, value, -1, 99999); - g_esPimpTeammate[admin].g_iHumanRangeCooldown = iGetKeyValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "HumanRangeCooldown", "Human Range Cooldown", "Human_Range_Cooldown", "hrangecooldown", g_esPimpTeammate[admin].g_iHumanRangeCooldown, value, -1, 99999); - g_esPimpTeammate[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esPimpTeammate[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); - g_esPimpTeammate[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esPimpTeammate[admin].g_iRequiresHumans, value, -1, 32); - g_esPimpTeammate[admin].g_iPimpAbility = iGetKeyValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esPimpTeammate[admin].g_iPimpAbility, value, -1, 1); - g_esPimpTeammate[admin].g_iPimpEffect = iGetKeyValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "AbilityEffect", "Ability Effect", "Ability_Effect", "effect", g_esPimpTeammate[admin].g_iPimpEffect, value, -1, 7); - g_esPimpTeammate[admin].g_iPimpMessage = iGetKeyValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esPimpTeammate[admin].g_iPimpMessage, value, -1, 3); - g_esPimpTeammate[admin].g_iPimpSight = iGetKeyValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "AbilitySight", "Ability Sight", "Ability_Sight", "sight", g_esPimpTeammate[admin].g_iPimpSight, value, -1, 5); - g_esPimpTeammate[admin].g_flPimpChance = flGetKeyValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "PimpChance", "Pimp Chance", "Pimp_Chance", "chance", g_esPimpTeammate[admin].g_flPimpChance, value, -1.0, 100.0); - g_esPimpTeammate[admin].g_iPimpCooldown = iGetKeyValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "PimpCooldown", "Pimp Cooldown", "Pimp_Cooldown", "cooldown", g_esPimpTeammate[admin].g_iPimpCooldown, value, -1, 99999); - g_esPimpTeammate[admin].g_iPimpDamage = iGetKeyValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "PimpDamage", "Pimp Damage", "Pimp_Damage", "damage", g_esPimpTeammate[admin].g_iPimpDamage, value, -1, 99999); - g_esPimpTeammate[admin].g_iPimpDuration = iGetKeyValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "PimpDuration", "Pimp Duration", "Pimp_Duration", "duration", g_esPimpTeammate[admin].g_iPimpDuration, value, -1, 99999); - g_esPimpTeammate[admin].g_iPimpHit = iGetKeyValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "PimpHit", "Pimp Hit", "Pimp_Hit", "hit", g_esPimpTeammate[admin].g_iPimpHit, value, -1, 1); - g_esPimpTeammate[admin].g_iPimpHitMode = iGetKeyValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "PimpHitMode", "Pimp Hit Mode", "Pimp_Hit_Mode", "hitmode", g_esPimpTeammate[admin].g_iPimpHitMode, value, -1, 2); - g_esPimpTeammate[admin].g_flPimpInterval = flGetKeyValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "PimpInterval", "Pimp Interval", "Pimp_Interval", "interval", g_esPimpTeammate[admin].g_flPimpInterval, value, -1.0, 99999.0); - g_esPimpTeammate[admin].g_flPimpRange = flGetKeyValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "PimpRange", "Pimp Range", "Pimp_Range", "range", g_esPimpTeammate[admin].g_flPimpRange, value, -1.0, 99999.0); - g_esPimpTeammate[admin].g_flPimpRangeChance = flGetKeyValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "PimpRangeChance", "Pimp Range Chance", "Pimp_Range_Chance", "rangechance", g_esPimpTeammate[admin].g_flPimpRangeChance, value, -1.0, 100.0); - g_esPimpTeammate[admin].g_iPimpRangeCooldown = iGetKeyValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "PimpRangeCooldown", "Pimp Range Cooldown", "Pimp_Range_Cooldown", "rangecooldown", g_esPimpTeammate[admin].g_iPimpRangeCooldown, value, -1, 99999); - } - else - { - g_esPimpPlayer[admin].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esPimpPlayer[admin].g_flCloseAreasOnly, value, -1.0, 99999.0); - g_esPimpPlayer[admin].g_iComboAbility = iGetKeyValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "ComboAbility", "Combo Ability", "Combo_Ability", "combo", g_esPimpPlayer[admin].g_iComboAbility, value, -1, 1); - g_esPimpPlayer[admin].g_iHumanAbility = iGetKeyValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esPimpPlayer[admin].g_iHumanAbility, value, -1, 2); - g_esPimpPlayer[admin].g_iHumanAmmo = iGetKeyValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esPimpPlayer[admin].g_iHumanAmmo, value, -1, 99999); - g_esPimpPlayer[admin].g_iHumanCooldown = iGetKeyValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esPimpPlayer[admin].g_iHumanCooldown, value, -1, 99999); - g_esPimpPlayer[admin].g_iHumanRangeCooldown = iGetKeyValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "HumanRangeCooldown", "Human Range Cooldown", "Human_Range_Cooldown", "hrangecooldown", g_esPimpPlayer[admin].g_iHumanRangeCooldown, value, -1, 99999); - g_esPimpPlayer[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esPimpPlayer[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); - g_esPimpPlayer[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esPimpPlayer[admin].g_iRequiresHumans, value, -1, 32); - g_esPimpPlayer[admin].g_iPimpAbility = iGetKeyValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esPimpPlayer[admin].g_iPimpAbility, value, -1, 1); - g_esPimpPlayer[admin].g_iPimpEffect = iGetKeyValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "AbilityEffect", "Ability Effect", "Ability_Effect", "effect", g_esPimpPlayer[admin].g_iPimpEffect, value, -1, 7); - g_esPimpPlayer[admin].g_iPimpMessage = iGetKeyValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esPimpPlayer[admin].g_iPimpMessage, value, -1, 3); - g_esPimpPlayer[admin].g_iPimpSight = iGetKeyValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "AbilitySight", "Ability Sight", "Ability_Sight", "sight", g_esPimpPlayer[admin].g_iPimpSight, value, -1, 5); - g_esPimpPlayer[admin].g_flPimpChance = flGetKeyValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "PimpChance", "Pimp Chance", "Pimp_Chance", "chance", g_esPimpPlayer[admin].g_flPimpChance, value, -1.0, 100.0); - g_esPimpPlayer[admin].g_iPimpCooldown = iGetKeyValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "PimpCooldown", "Pimp Cooldown", "Pimp_Cooldown", "cooldown", g_esPimpPlayer[admin].g_iPimpCooldown, value, -1, 99999); - g_esPimpPlayer[admin].g_iPimpDamage = iGetKeyValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "PimpDamage", "Pimp Damage", "Pimp_Damage", "damage", g_esPimpPlayer[admin].g_iPimpDamage, value, -1, 99999); - g_esPimpPlayer[admin].g_iPimpDuration = iGetKeyValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "PimpDuration", "Pimp Duration", "Pimp_Duration", "duration", g_esPimpPlayer[admin].g_iPimpDuration, value, -1, 99999); - g_esPimpPlayer[admin].g_iPimpHit = iGetKeyValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "PimpHit", "Pimp Hit", "Pimp_Hit", "hit", g_esPimpPlayer[admin].g_iPimpHit, value, -1, 1); - g_esPimpPlayer[admin].g_iPimpHitMode = iGetKeyValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "PimpHitMode", "Pimp Hit Mode", "Pimp_Hit_Mode", "hitmode", g_esPimpPlayer[admin].g_iPimpHitMode, value, -1, 2); - g_esPimpPlayer[admin].g_flPimpInterval = flGetKeyValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "PimpInterval", "Pimp Interval", "Pimp_Interval", "interval", g_esPimpPlayer[admin].g_flPimpInterval, value, -1.0, 99999.0); - g_esPimpPlayer[admin].g_flPimpRange = flGetKeyValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "PimpRange", "Pimp Range", "Pimp_Range", "range", g_esPimpPlayer[admin].g_flPimpRange, value, -1.0, 99999.0); - g_esPimpPlayer[admin].g_flPimpRangeChance = flGetKeyValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "PimpRangeChance", "Pimp Range Chance", "Pimp_Range_Chance", "rangechance", g_esPimpPlayer[admin].g_flPimpRangeChance, value, -1.0, 100.0); - g_esPimpPlayer[admin].g_iPimpRangeCooldown = iGetKeyValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "PimpRangeCooldown", "Pimp Range Cooldown", "Pimp_Range_Cooldown", "rangecooldown", g_esPimpPlayer[admin].g_iPimpRangeCooldown, value, -1, 99999); - g_esPimpPlayer[admin].g_iAccessFlags = iGetAdminFlagsValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "AccessFlags", "Access Flags", "Access_Flags", "access", value); - g_esPimpPlayer[admin].g_iImmunityFlags = iGetAdminFlagsValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "ImmunityFlags", "Immunity Flags", "Immunity_Flags", "immunity", value); - } - } - - if (mode < 3 && type > 0) - { - if (special && specsection[0] != '\0') - { - g_esPimpSpecial[type].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esPimpSpecial[type].g_flCloseAreasOnly, value, -1.0, 99999.0); - g_esPimpSpecial[type].g_iComboAbility = iGetKeyValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "ComboAbility", "Combo Ability", "Combo_Ability", "combo", g_esPimpSpecial[type].g_iComboAbility, value, -1, 1); - g_esPimpSpecial[type].g_iHumanAbility = iGetKeyValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esPimpSpecial[type].g_iHumanAbility, value, -1, 2); - g_esPimpSpecial[type].g_iHumanAmmo = iGetKeyValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esPimpSpecial[type].g_iHumanAmmo, value, -1, 99999); - g_esPimpSpecial[type].g_iHumanCooldown = iGetKeyValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esPimpSpecial[type].g_iHumanCooldown, value, -1, 99999); - g_esPimpSpecial[type].g_iHumanRangeCooldown = iGetKeyValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "HumanRangeCooldown", "Human Range Cooldown", "Human_Range_Cooldown", "hrangecooldown", g_esPimpSpecial[type].g_iHumanRangeCooldown, value, -1, 99999); - g_esPimpSpecial[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esPimpSpecial[type].g_flOpenAreasOnly, value, -1.0, 99999.0); - g_esPimpSpecial[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esPimpSpecial[type].g_iRequiresHumans, value, -1, 32); - g_esPimpSpecial[type].g_iPimpAbility = iGetKeyValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esPimpSpecial[type].g_iPimpAbility, value, -1, 1); - g_esPimpSpecial[type].g_iPimpEffect = iGetKeyValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "AbilityEffect", "Ability Effect", "Ability_Effect", "effect", g_esPimpSpecial[type].g_iPimpEffect, value, -1, 7); - g_esPimpSpecial[type].g_iPimpMessage = iGetKeyValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esPimpSpecial[type].g_iPimpMessage, value, -1, 3); - g_esPimpSpecial[type].g_iPimpSight = iGetKeyValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "AbilitySight", "Ability Sight", "Ability_Sight", "sight", g_esPimpSpecial[type].g_iPimpSight, value, -1, 5); - g_esPimpSpecial[type].g_flPimpChance = flGetKeyValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "PimpChance", "Pimp Chance", "Pimp_Chance", "chance", g_esPimpSpecial[type].g_flPimpChance, value, -1.0, 100.0); - g_esPimpSpecial[type].g_iPimpCooldown = iGetKeyValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "PimpCooldown", "Pimp Cooldown", "Pimp_Cooldown", "cooldown", g_esPimpSpecial[type].g_iPimpCooldown, value, -1, 99999); - g_esPimpSpecial[type].g_iPimpDamage = iGetKeyValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "PimpDamage", "Pimp Damage", "Pimp_Damage", "damage", g_esPimpSpecial[type].g_iPimpDamage, value, -1, 99999); - g_esPimpSpecial[type].g_iPimpDuration = iGetKeyValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "PimpDuration", "Pimp Duration", "Pimp_Duration", "duration", g_esPimpSpecial[type].g_iPimpDuration, value, -1, 99999); - g_esPimpSpecial[type].g_iPimpHit = iGetKeyValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "PimpHit", "Pimp Hit", "Pimp_Hit", "hit", g_esPimpSpecial[type].g_iPimpHit, value, -1, 1); - g_esPimpSpecial[type].g_iPimpHitMode = iGetKeyValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "PimpHitMode", "Pimp Hit Mode", "Pimp_Hit_Mode", "hitmode", g_esPimpSpecial[type].g_iPimpHitMode, value, -1, 2); - g_esPimpSpecial[type].g_flPimpInterval = flGetKeyValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "PimpInterval", "Pimp Interval", "Pimp_Interval", "interval", g_esPimpSpecial[type].g_flPimpInterval, value, -1.0, 99999.0); - g_esPimpSpecial[type].g_flPimpRange = flGetKeyValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "PimpRange", "Pimp Range", "Pimp_Range", "range", g_esPimpSpecial[type].g_flPimpRange, value, -1.0, 99999.0); - g_esPimpSpecial[type].g_flPimpRangeChance = flGetKeyValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "PimpRangeChance", "Pimp Range Chance", "Pimp_Range_Chance", "rangechance", g_esPimpSpecial[type].g_flPimpRangeChance, value, -1.0, 100.0); - g_esPimpSpecial[type].g_iPimpRangeCooldown = iGetKeyValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "PimpRangeCooldown", "Pimp Range Cooldown", "Pimp_Range_Cooldown", "rangecooldown", g_esPimpSpecial[type].g_iPimpRangeCooldown, value, -1, 99999); - } - else - { - g_esPimpAbility[type].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esPimpAbility[type].g_flCloseAreasOnly, value, -1.0, 99999.0); - g_esPimpAbility[type].g_iComboAbility = iGetKeyValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "ComboAbility", "Combo Ability", "Combo_Ability", "combo", g_esPimpAbility[type].g_iComboAbility, value, -1, 1); - g_esPimpAbility[type].g_iHumanAbility = iGetKeyValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esPimpAbility[type].g_iHumanAbility, value, -1, 2); - g_esPimpAbility[type].g_iHumanAmmo = iGetKeyValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esPimpAbility[type].g_iHumanAmmo, value, -1, 99999); - g_esPimpAbility[type].g_iHumanCooldown = iGetKeyValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esPimpAbility[type].g_iHumanCooldown, value, -1, 99999); - g_esPimpAbility[type].g_iHumanRangeCooldown = iGetKeyValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "HumanRangeCooldown", "Human Range Cooldown", "Human_Range_Cooldown", "hrangecooldown", g_esPimpAbility[type].g_iHumanRangeCooldown, value, -1, 99999); - g_esPimpAbility[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esPimpAbility[type].g_flOpenAreasOnly, value, -1.0, 99999.0); - g_esPimpAbility[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esPimpAbility[type].g_iRequiresHumans, value, -1, 32); - g_esPimpAbility[type].g_iPimpAbility = iGetKeyValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esPimpAbility[type].g_iPimpAbility, value, -1, 1); - g_esPimpAbility[type].g_iPimpEffect = iGetKeyValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "AbilityEffect", "Ability Effect", "Ability_Effect", "effect", g_esPimpAbility[type].g_iPimpEffect, value, -1, 7); - g_esPimpAbility[type].g_iPimpMessage = iGetKeyValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esPimpAbility[type].g_iPimpMessage, value, -1, 3); - g_esPimpAbility[type].g_iPimpSight = iGetKeyValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "AbilitySight", "Ability Sight", "Ability_Sight", "sight", g_esPimpAbility[type].g_iPimpSight, value, -1, 5); - g_esPimpAbility[type].g_flPimpChance = flGetKeyValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "PimpChance", "Pimp Chance", "Pimp_Chance", "chance", g_esPimpAbility[type].g_flPimpChance, value, -1.0, 100.0); - g_esPimpAbility[type].g_iPimpCooldown = iGetKeyValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "PimpCooldown", "Pimp Cooldown", "Pimp_Cooldown", "cooldown", g_esPimpAbility[type].g_iPimpCooldown, value, -1, 99999); - g_esPimpAbility[type].g_iPimpDamage = iGetKeyValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "PimpDamage", "Pimp Damage", "Pimp_Damage", "damage", g_esPimpAbility[type].g_iPimpDamage, value, -1, 99999); - g_esPimpAbility[type].g_iPimpDuration = iGetKeyValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "PimpDuration", "Pimp Duration", "Pimp_Duration", "duration", g_esPimpAbility[type].g_iPimpDuration, value, -1, 99999); - g_esPimpAbility[type].g_iPimpHit = iGetKeyValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "PimpHit", "Pimp Hit", "Pimp_Hit", "hit", g_esPimpAbility[type].g_iPimpHit, value, -1, 1); - g_esPimpAbility[type].g_iPimpHitMode = iGetKeyValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "PimpHitMode", "Pimp Hit Mode", "Pimp_Hit_Mode", "hitmode", g_esPimpAbility[type].g_iPimpHitMode, value, -1, 2); - g_esPimpAbility[type].g_flPimpInterval = flGetKeyValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "PimpInterval", "Pimp Interval", "Pimp_Interval", "interval", g_esPimpAbility[type].g_flPimpInterval, value, -1.0, 99999.0); - g_esPimpAbility[type].g_flPimpRange = flGetKeyValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "PimpRange", "Pimp Range", "Pimp_Range", "range", g_esPimpAbility[type].g_flPimpRange, value, -1.0, 99999.0); - g_esPimpAbility[type].g_flPimpRangeChance = flGetKeyValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "PimpRangeChance", "Pimp Range Chance", "Pimp_Range_Chance", "rangechance", g_esPimpAbility[type].g_flPimpRangeChance, value, -1.0, 100.0); - g_esPimpAbility[type].g_iPimpRangeCooldown = iGetKeyValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "PimpRangeCooldown", "Pimp Range Cooldown", "Pimp_Range_Cooldown", "rangecooldown", g_esPimpAbility[type].g_iPimpRangeCooldown, value, -1, 99999); - g_esPimpAbility[type].g_iAccessFlags = iGetAdminFlagsValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "AccessFlags", "Access Flags", "Access_Flags", "access", value); - g_esPimpAbility[type].g_iImmunityFlags = iGetAdminFlagsValue(subsection, MT_PIMP_SECTION, MT_PIMP_SECTION2, MT_PIMP_SECTION3, MT_PIMP_SECTION4, key, "ImmunityFlags", "Immunity Flags", "Immunity_Flags", "immunity", value); - } - } -} - -#if defined MT_ABILITIES_MAIN2 -void vPimpSettingsCached(int tank, bool apply, int type) -#else -public void MT_OnSettingsCached(int tank, bool apply, int type) -#endif -{ - bool bHuman = bIsValidClient(tank, MT_CHECK_FAKECLIENT); - g_esPimpPlayer[tank].g_iTankTypeRecorded = apply ? MT_GetRecordedTankType(tank, type) : 0; - g_esPimpPlayer[tank].g_iTankType = apply ? type : 0; - int iType = g_esPimpPlayer[tank].g_iTankTypeRecorded; - - if (bIsSpecialInfected(tank, MT_CHECK_INDEX|MT_CHECK_INGAME)) - { - g_esPimpCache[tank].g_flCloseAreasOnly = flGetSubSettingValue(apply, bHuman, g_esPimpTeammate[tank].g_flCloseAreasOnly, g_esPimpPlayer[tank].g_flCloseAreasOnly, g_esPimpSpecial[iType].g_flCloseAreasOnly, g_esPimpAbility[iType].g_flCloseAreasOnly, 1); - g_esPimpCache[tank].g_iComboAbility = iGetSubSettingValue(apply, bHuman, g_esPimpTeammate[tank].g_iComboAbility, g_esPimpPlayer[tank].g_iComboAbility, g_esPimpSpecial[iType].g_iComboAbility, g_esPimpAbility[iType].g_iComboAbility, 1); - g_esPimpCache[tank].g_flPimpChance = flGetSubSettingValue(apply, bHuman, g_esPimpTeammate[tank].g_flPimpChance, g_esPimpPlayer[tank].g_flPimpChance, g_esPimpSpecial[iType].g_flPimpChance, g_esPimpAbility[iType].g_flPimpChance, 1); - g_esPimpCache[tank].g_flPimpInterval = flGetSubSettingValue(apply, bHuman, g_esPimpTeammate[tank].g_flPimpInterval, g_esPimpPlayer[tank].g_flPimpInterval, g_esPimpSpecial[iType].g_flPimpInterval, g_esPimpAbility[iType].g_flPimpInterval, 1); - g_esPimpCache[tank].g_flPimpRange = flGetSubSettingValue(apply, bHuman, g_esPimpTeammate[tank].g_flPimpRange, g_esPimpPlayer[tank].g_flPimpRange, g_esPimpSpecial[iType].g_flPimpRange, g_esPimpAbility[iType].g_flPimpRange, 1); - g_esPimpCache[tank].g_flPimpRangeChance = flGetSubSettingValue(apply, bHuman, g_esPimpTeammate[tank].g_flPimpRangeChance, g_esPimpPlayer[tank].g_flPimpRangeChance, g_esPimpSpecial[iType].g_flPimpRangeChance, g_esPimpAbility[iType].g_flPimpRangeChance, 1); - g_esPimpCache[tank].g_iHumanAbility = iGetSubSettingValue(apply, bHuman, g_esPimpTeammate[tank].g_iHumanAbility, g_esPimpPlayer[tank].g_iHumanAbility, g_esPimpSpecial[iType].g_iHumanAbility, g_esPimpAbility[iType].g_iHumanAbility, 1); - g_esPimpCache[tank].g_iHumanAmmo = iGetSubSettingValue(apply, bHuman, g_esPimpTeammate[tank].g_iHumanAmmo, g_esPimpPlayer[tank].g_iHumanAmmo, g_esPimpSpecial[iType].g_iHumanAmmo, g_esPimpAbility[iType].g_iHumanAmmo, 1); - g_esPimpCache[tank].g_iHumanCooldown = iGetSubSettingValue(apply, bHuman, g_esPimpTeammate[tank].g_iHumanCooldown, g_esPimpPlayer[tank].g_iHumanCooldown, g_esPimpSpecial[iType].g_iHumanCooldown, g_esPimpAbility[iType].g_iHumanCooldown, 1); - g_esPimpCache[tank].g_iHumanRangeCooldown = iGetSubSettingValue(apply, bHuman, g_esPimpTeammate[tank].g_iHumanRangeCooldown, g_esPimpPlayer[tank].g_iHumanRangeCooldown, g_esPimpSpecial[iType].g_iHumanRangeCooldown, g_esPimpAbility[iType].g_iHumanRangeCooldown, 1); - g_esPimpCache[tank].g_iPimpAbility = iGetSubSettingValue(apply, bHuman, g_esPimpTeammate[tank].g_iPimpAbility, g_esPimpPlayer[tank].g_iPimpAbility, g_esPimpSpecial[iType].g_iPimpAbility, g_esPimpAbility[iType].g_iPimpAbility, 1); - g_esPimpCache[tank].g_iPimpCooldown = iGetSubSettingValue(apply, bHuman, g_esPimpTeammate[tank].g_iPimpCooldown, g_esPimpPlayer[tank].g_iPimpCooldown, g_esPimpSpecial[iType].g_iPimpCooldown, g_esPimpAbility[iType].g_iPimpCooldown, 1); - g_esPimpCache[tank].g_iPimpDamage = iGetSubSettingValue(apply, bHuman, g_esPimpTeammate[tank].g_iPimpDamage, g_esPimpPlayer[tank].g_iPimpDamage, g_esPimpSpecial[iType].g_iPimpDamage, g_esPimpAbility[iType].g_iPimpDamage, 1); - g_esPimpCache[tank].g_iPimpDuration = iGetSubSettingValue(apply, bHuman, g_esPimpTeammate[tank].g_iPimpDuration, g_esPimpPlayer[tank].g_iPimpDuration, g_esPimpSpecial[iType].g_iPimpDuration, g_esPimpAbility[iType].g_iPimpDuration, 1); - g_esPimpCache[tank].g_iPimpEffect = iGetSubSettingValue(apply, bHuman, g_esPimpTeammate[tank].g_iPimpEffect, g_esPimpPlayer[tank].g_iPimpEffect, g_esPimpSpecial[iType].g_iPimpEffect, g_esPimpAbility[iType].g_iPimpEffect, 1); - g_esPimpCache[tank].g_iPimpHit = iGetSubSettingValue(apply, bHuman, g_esPimpTeammate[tank].g_iPimpHit, g_esPimpPlayer[tank].g_iPimpHit, g_esPimpSpecial[iType].g_iPimpHit, g_esPimpAbility[iType].g_iPimpHit, 1); - g_esPimpCache[tank].g_iPimpHitMode = iGetSubSettingValue(apply, bHuman, g_esPimpTeammate[tank].g_iPimpHitMode, g_esPimpPlayer[tank].g_iPimpHitMode, g_esPimpSpecial[iType].g_iPimpHitMode, g_esPimpAbility[iType].g_iPimpHitMode, 1); - g_esPimpCache[tank].g_iPimpMessage = iGetSubSettingValue(apply, bHuman, g_esPimpTeammate[tank].g_iPimpMessage, g_esPimpPlayer[tank].g_iPimpMessage, g_esPimpSpecial[iType].g_iPimpMessage, g_esPimpAbility[iType].g_iPimpMessage, 1); - g_esPimpCache[tank].g_iPimpRangeCooldown = iGetSubSettingValue(apply, bHuman, g_esPimpTeammate[tank].g_iPimpRangeCooldown, g_esPimpPlayer[tank].g_iPimpRangeCooldown, g_esPimpSpecial[iType].g_iPimpRangeCooldown, g_esPimpAbility[iType].g_iPimpRangeCooldown, 1); - g_esPimpCache[tank].g_iPimpSight = iGetSubSettingValue(apply, bHuman, g_esPimpTeammate[tank].g_iPimpSight, g_esPimpPlayer[tank].g_iPimpSight, g_esPimpSpecial[iType].g_iPimpSight, g_esPimpAbility[iType].g_iPimpSight, 1); - g_esPimpCache[tank].g_flOpenAreasOnly = flGetSubSettingValue(apply, bHuman, g_esPimpTeammate[tank].g_flOpenAreasOnly, g_esPimpPlayer[tank].g_flOpenAreasOnly, g_esPimpSpecial[iType].g_flOpenAreasOnly, g_esPimpAbility[iType].g_flOpenAreasOnly, 1); - g_esPimpCache[tank].g_iRequiresHumans = iGetSubSettingValue(apply, bHuman, g_esPimpTeammate[tank].g_iRequiresHumans, g_esPimpPlayer[tank].g_iRequiresHumans, g_esPimpSpecial[iType].g_iRequiresHumans, g_esPimpAbility[iType].g_iRequiresHumans, 1); - } - else - { - g_esPimpCache[tank].g_flCloseAreasOnly = flGetSettingValue(apply, bHuman, g_esPimpPlayer[tank].g_flCloseAreasOnly, g_esPimpAbility[iType].g_flCloseAreasOnly, 1); - g_esPimpCache[tank].g_iComboAbility = iGetSettingValue(apply, bHuman, g_esPimpPlayer[tank].g_iComboAbility, g_esPimpAbility[iType].g_iComboAbility, 1); - g_esPimpCache[tank].g_flPimpChance = flGetSettingValue(apply, bHuman, g_esPimpPlayer[tank].g_flPimpChance, g_esPimpAbility[iType].g_flPimpChance, 1); - g_esPimpCache[tank].g_flPimpInterval = flGetSettingValue(apply, bHuman, g_esPimpPlayer[tank].g_flPimpInterval, g_esPimpAbility[iType].g_flPimpInterval, 1); - g_esPimpCache[tank].g_flPimpRange = flGetSettingValue(apply, bHuman, g_esPimpPlayer[tank].g_flPimpRange, g_esPimpAbility[iType].g_flPimpRange, 1); - g_esPimpCache[tank].g_flPimpRangeChance = flGetSettingValue(apply, bHuman, g_esPimpPlayer[tank].g_flPimpRangeChance, g_esPimpAbility[iType].g_flPimpRangeChance, 1); - g_esPimpCache[tank].g_iHumanAbility = iGetSettingValue(apply, bHuman, g_esPimpPlayer[tank].g_iHumanAbility, g_esPimpAbility[iType].g_iHumanAbility, 1); - g_esPimpCache[tank].g_iHumanAmmo = iGetSettingValue(apply, bHuman, g_esPimpPlayer[tank].g_iHumanAmmo, g_esPimpAbility[iType].g_iHumanAmmo, 1); - g_esPimpCache[tank].g_iHumanCooldown = iGetSettingValue(apply, bHuman, g_esPimpPlayer[tank].g_iHumanCooldown, g_esPimpAbility[iType].g_iHumanCooldown, 1); - g_esPimpCache[tank].g_iHumanRangeCooldown = iGetSettingValue(apply, bHuman, g_esPimpPlayer[tank].g_iHumanRangeCooldown, g_esPimpAbility[iType].g_iHumanRangeCooldown, 1); - g_esPimpCache[tank].g_iPimpAbility = iGetSettingValue(apply, bHuman, g_esPimpPlayer[tank].g_iPimpAbility, g_esPimpAbility[iType].g_iPimpAbility, 1); - g_esPimpCache[tank].g_iPimpCooldown = iGetSettingValue(apply, bHuman, g_esPimpPlayer[tank].g_iPimpCooldown, g_esPimpAbility[iType].g_iPimpCooldown, 1); - g_esPimpCache[tank].g_iPimpDamage = iGetSettingValue(apply, bHuman, g_esPimpPlayer[tank].g_iPimpDamage, g_esPimpAbility[iType].g_iPimpDamage, 1); - g_esPimpCache[tank].g_iPimpDuration = iGetSettingValue(apply, bHuman, g_esPimpPlayer[tank].g_iPimpDuration, g_esPimpAbility[iType].g_iPimpDuration, 1); - g_esPimpCache[tank].g_iPimpEffect = iGetSettingValue(apply, bHuman, g_esPimpPlayer[tank].g_iPimpEffect, g_esPimpAbility[iType].g_iPimpEffect, 1); - g_esPimpCache[tank].g_iPimpHit = iGetSettingValue(apply, bHuman, g_esPimpPlayer[tank].g_iPimpHit, g_esPimpAbility[iType].g_iPimpHit, 1); - g_esPimpCache[tank].g_iPimpHitMode = iGetSettingValue(apply, bHuman, g_esPimpPlayer[tank].g_iPimpHitMode, g_esPimpAbility[iType].g_iPimpHitMode, 1); - g_esPimpCache[tank].g_iPimpMessage = iGetSettingValue(apply, bHuman, g_esPimpPlayer[tank].g_iPimpMessage, g_esPimpAbility[iType].g_iPimpMessage, 1); - g_esPimpCache[tank].g_iPimpRangeCooldown = iGetSettingValue(apply, bHuman, g_esPimpPlayer[tank].g_iPimpRangeCooldown, g_esPimpAbility[iType].g_iPimpRangeCooldown, 1); - g_esPimpCache[tank].g_iPimpSight = iGetSettingValue(apply, bHuman, g_esPimpPlayer[tank].g_iPimpSight, g_esPimpAbility[iType].g_iPimpSight, 1); - g_esPimpCache[tank].g_flOpenAreasOnly = flGetSettingValue(apply, bHuman, g_esPimpPlayer[tank].g_flOpenAreasOnly, g_esPimpAbility[iType].g_flOpenAreasOnly, 1); - g_esPimpCache[tank].g_iRequiresHumans = iGetSettingValue(apply, bHuman, g_esPimpPlayer[tank].g_iRequiresHumans, g_esPimpAbility[iType].g_iRequiresHumans, 1); - } -} - -#if defined MT_ABILITIES_MAIN2 -void vPimpCopyStats(int oldTank, int newTank) -#else -public void MT_OnCopyStats(int oldTank, int newTank) -#endif -{ - vPimpCopyStats2(oldTank, newTank); - - if (oldTank != newTank) - { - vRemovePimp(oldTank); - } -} - -#if !defined MT_ABILITIES_MAIN2 -public void MT_OnPluginUpdate() -{ - MT_ReloadPlugin(null); -} -#endif - -#if defined MT_ABILITIES_MAIN2 -void vPimpEventFired(Event event, const char[] name) -#else -public void MT_OnEventFired(Event event, const char[] name, bool dontBroadcast) -#endif -{ - if (StrEqual(name, "bot_player_replace")) - { - int iBotId = event.GetInt("bot"), iBot = GetClientOfUserId(iBotId), - iTankId = event.GetInt("player"), iTank = GetClientOfUserId(iTankId); - if (bIsValidClient(iBot) && bIsInfected(iTank)) - { - vPimpCopyStats2(iBot, iTank); - vRemovePimp(iBot); - } - } - else if (StrEqual(name, "mission_lost") || StrEqual(name, "round_start") || StrEqual(name, "round_end")) - { - vPimpReset(); - } - else if (StrEqual(name, "player_bot_replace")) - { - int iTankId = event.GetInt("player"), iTank = GetClientOfUserId(iTankId), - iBotId = event.GetInt("bot"), iBot = GetClientOfUserId(iBotId); - if (bIsValidClient(iTank) && bIsInfected(iBot)) - { - vPimpCopyStats2(iTank, iBot); - vRemovePimp(iTank); - } - } - else if (StrEqual(name, "player_death") || StrEqual(name, "player_spawn")) - { - int iTankId = event.GetInt("userid"), iTank = GetClientOfUserId(iTankId); - if (MT_IsTankSupported(iTank, MT_CHECK_INDEX|MT_CHECK_INGAME)) - { - vRemovePimp(iTank); - } - } - else if (StrEqual(name, "player_now_it")) - { - bool bExploded = event.GetBool("exploded"); - int iSurvivorId = event.GetInt("userid"), iSurvivor = GetClientOfUserId(iSurvivorId), - iBoomerId = event.GetInt("attacker"), iBoomer = GetClientOfUserId(iBoomerId); - if (bIsBoomer(iBoomer) && bIsSurvivor(iSurvivor) && !bExploded) - { - vPimpHit(iSurvivor, iBoomer, GetRandomFloat(0.1, 100.0), g_esPimpCache[iBoomer].g_flPimpChance, g_esPimpCache[iBoomer].g_iPimpHit, MT_MESSAGE_RANGE, MT_ATTACK_RANGE); - } - } -} - -#if defined MT_ABILITIES_MAIN2 -void vPimpAbilityActivated(int tank) -#else -public void MT_OnAbilityActivated(int tank) -#endif -{ - if (MT_IsTankSupported(tank, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_FAKECLIENT) && ((!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esPimpAbility[g_esPimpPlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esPimpPlayer[tank].g_iAccessFlags)) || g_esPimpCache[tank].g_iHumanAbility == 0)) - { - return; - } - - if (MT_IsTankSupported(tank) && (!bIsInfected(tank, MT_CHECK_FAKECLIENT) || g_esPimpCache[tank].g_iHumanAbility != 1) && MT_IsCustomTankSupported(tank) && g_esPimpCache[tank].g_iPimpAbility == 1 && g_esPimpCache[tank].g_iComboAbility == 0) - { - vPimpAbility(tank, GetRandomFloat(0.1, 100.0)); - } -} - -#if defined MT_ABILITIES_MAIN2 -void vPimpButtonPressed(int tank, int button) -#else -public void MT_OnButtonPressed(int tank, int button) -#endif -{ - if (MT_IsTankSupported(tank, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_ALIVE|MT_CHECK_FAKECLIENT) && MT_IsCustomTankSupported(tank)) - { - if (bIsAreaNarrow(tank, g_esPimpCache[tank].g_flOpenAreasOnly) || bIsAreaWide(tank, g_esPimpCache[tank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esPimpPlayer[tank].g_iTankType, tank) || (g_esPimpCache[tank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esPimpCache[tank].g_iRequiresHumans) || (!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esPimpAbility[g_esPimpPlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esPimpPlayer[tank].g_iAccessFlags))) - { - return; - } - - if ((button & MT_SUB_KEY) && g_esPimpCache[tank].g_iPimpAbility == 1 && g_esPimpCache[tank].g_iHumanAbility == 1) - { - int iTime = GetTime(); - - switch (g_esPimpPlayer[tank].g_iRangeCooldown == -1 || g_esPimpPlayer[tank].g_iRangeCooldown <= iTime) - { - case true: vPimpAbility(tank, GetRandomFloat(0.1, 100.0)); - case false: MT_PrintToChat(tank, "%s %t", MT_TAG3, "PimpHuman3", (g_esPimpPlayer[tank].g_iRangeCooldown - iTime)); - } - } - } -} - -#if defined MT_ABILITIES_MAIN2 -void vPimpChangeType(int tank, int oldType) -#else -public void MT_OnChangeType(int tank, int oldType, int newType, bool revert) -#endif -{ - if (oldType <= 0) - { - return; - } - - vRemovePimp(tank); -} - -void vPimpAbility(int tank, float random, int pos = -1) -{ - if (bIsAreaNarrow(tank, g_esPimpCache[tank].g_flOpenAreasOnly) || bIsAreaWide(tank, g_esPimpCache[tank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esPimpPlayer[tank].g_iTankType, tank) || (g_esPimpCache[tank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esPimpCache[tank].g_iRequiresHumans) || (!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esPimpAbility[g_esPimpPlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esPimpPlayer[tank].g_iAccessFlags))) - { - return; - } - - if (!bIsInfected(tank, MT_CHECK_FAKECLIENT) || (g_esPimpPlayer[tank].g_iAmmoCount < g_esPimpCache[tank].g_iHumanAmmo && g_esPimpCache[tank].g_iHumanAmmo > 0)) - { - g_esPimpPlayer[tank].g_bFailed = false; - g_esPimpPlayer[tank].g_bNoAmmo = false; - - float flTankPos[3], flSurvivorPos[3]; - GetClientAbsOrigin(tank, flTankPos); - float flRange = (pos != -1) ? MT_GetCombinationSetting(tank, 9, pos) : g_esPimpCache[tank].g_flPimpRange, - flChance = (pos != -1) ? MT_GetCombinationSetting(tank, 10, pos) : g_esPimpCache[tank].g_flPimpRangeChance; - int iSurvivorCount = 0; - for (int iSurvivor = 1; iSurvivor <= MaxClients; iSurvivor++) - { - if (bIsSurvivor(iSurvivor, MT_CHECK_INGAME|MT_CHECK_ALIVE) && !MT_IsAdminImmune(iSurvivor, tank) && !bIsAdminImmune(iSurvivor, g_esPimpPlayer[tank].g_iTankType, g_esPimpAbility[g_esPimpPlayer[tank].g_iTankTypeRecorded].g_iImmunityFlags, g_esPimpPlayer[iSurvivor].g_iImmunityFlags)) - { - GetClientAbsOrigin(iSurvivor, flSurvivorPos); - if (GetVectorDistance(flTankPos, flSurvivorPos) <= flRange && bIsVisibleToPlayer(tank, iSurvivor, g_esPimpCache[tank].g_iPimpSight, .range = flRange)) - { - vPimpHit(iSurvivor, tank, random, flChance, g_esPimpCache[tank].g_iPimpAbility, MT_MESSAGE_RANGE, MT_ATTACK_RANGE, pos); - - iSurvivorCount++; - } - } - } - - if (iSurvivorCount == 0) - { - if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esPimpCache[tank].g_iHumanAbility == 1) - { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "PimpHuman4"); - } - } - } - else if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esPimpCache[tank].g_iHumanAbility == 1) - { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "PimpAmmo"); - } -} - -void vPimpHit(int survivor, int tank, float random, float chance, int enabled, int messages, int flags, int pos = -1) -{ - if (bIsAreaNarrow(tank, g_esPimpCache[tank].g_flOpenAreasOnly) || bIsAreaWide(tank, g_esPimpCache[tank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esPimpPlayer[tank].g_iTankType, tank) || (g_esPimpCache[tank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esPimpCache[tank].g_iRequiresHumans) || (!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esPimpAbility[g_esPimpPlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esPimpPlayer[tank].g_iAccessFlags)) || MT_IsAdminImmune(survivor, tank) || bIsAdminImmune(survivor, g_esPimpPlayer[tank].g_iTankType, g_esPimpAbility[g_esPimpPlayer[tank].g_iTankTypeRecorded].g_iImmunityFlags, g_esPimpPlayer[survivor].g_iImmunityFlags)) - { - return; - } - - int iTime = GetTime(); - if (((flags & MT_ATTACK_RANGE) && g_esPimpPlayer[tank].g_iRangeCooldown != -1 && g_esPimpPlayer[tank].g_iRangeCooldown >= iTime) || (((flags & MT_ATTACK_CLAW) || (flags & MT_ATTACK_MELEE)) && g_esPimpPlayer[tank].g_iCooldown != -1 && g_esPimpPlayer[tank].g_iCooldown >= iTime)) - { - return; - } - - if (enabled == 1 && bIsSurvivor(survivor) && !MT_DoesSurvivorHaveRewardType(survivor, MT_REWARD_GODMODE)) - { - if (!bIsInfected(tank, MT_CHECK_FAKECLIENT) || (flags & MT_ATTACK_CLAW) || (flags & MT_ATTACK_MELEE) || (g_esPimpPlayer[tank].g_iAmmoCount < g_esPimpCache[tank].g_iHumanAmmo && g_esPimpCache[tank].g_iHumanAmmo > 0)) - { - if (random <= chance && !g_esPimpPlayer[survivor].g_bAffected) - { - if ((messages & MT_MESSAGE_MELEE) && !bIsVisibleToPlayer(tank, survivor, g_esPimpCache[tank].g_iPimpSight, .range = 100.0)) - { - return; - } - - g_esPimpPlayer[survivor].g_bAffected = true; - g_esPimpPlayer[survivor].g_iOwner = tank; - - int iCooldown = -1; - if ((flags & MT_ATTACK_RANGE) && (g_esPimpPlayer[tank].g_iRangeCooldown == -1 || g_esPimpPlayer[tank].g_iRangeCooldown <= iTime)) - { - if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esPimpCache[tank].g_iHumanAbility == 1) - { - g_esPimpPlayer[tank].g_iAmmoCount++; - - MT_PrintToChat(tank, "%s %t", MT_TAG3, "PimpHuman", g_esPimpPlayer[tank].g_iAmmoCount, g_esPimpCache[tank].g_iHumanAmmo); - } - - iCooldown = (pos != -1) ? RoundToNearest(MT_GetCombinationSetting(tank, 11, pos)) : g_esPimpCache[tank].g_iPimpRangeCooldown; - iCooldown = (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esPimpCache[tank].g_iHumanAbility == 1 && g_esPimpPlayer[tank].g_iAmmoCount < g_esPimpCache[tank].g_iHumanAmmo && g_esPimpCache[tank].g_iHumanAmmo > 0) ? g_esPimpCache[tank].g_iHumanRangeCooldown : iCooldown; - g_esPimpPlayer[tank].g_iRangeCooldown = (iTime + iCooldown); - if (g_esPimpPlayer[tank].g_iRangeCooldown != -1 && g_esPimpPlayer[tank].g_iRangeCooldown >= iTime) - { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "PimpHuman5", (g_esPimpPlayer[tank].g_iRangeCooldown - iTime)); - } - } - else if (((flags & MT_ATTACK_CLAW) || (flags & MT_ATTACK_MELEE)) && (g_esPimpPlayer[tank].g_iCooldown == -1 || g_esPimpPlayer[tank].g_iCooldown <= iTime)) - { - iCooldown = (pos != -1) ? RoundToNearest(MT_GetCombinationSetting(tank, 2, pos)) : g_esPimpCache[tank].g_iPimpCooldown; - iCooldown = (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esPimpCache[tank].g_iHumanAbility == 1) ? g_esPimpCache[tank].g_iHumanCooldown : iCooldown; - g_esPimpPlayer[tank].g_iCooldown = (iTime + iCooldown); - if (g_esPimpPlayer[tank].g_iCooldown != -1 && g_esPimpPlayer[tank].g_iCooldown >= iTime) - { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "PimpHuman5", (g_esPimpPlayer[tank].g_iCooldown - iTime)); - } - } - - float flInterval = (pos != -1) ? MT_GetCombinationSetting(tank, 6, pos) : g_esPimpCache[tank].g_flPimpInterval; - if (flInterval > 0.0) - { - DataPack dpPimp; - CreateDataTimer(flInterval, tTimerPimp, dpPimp, TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); - dpPimp.WriteCell(GetClientUserId(survivor)); - dpPimp.WriteCell(GetClientUserId(tank)); - dpPimp.WriteCell(g_esPimpPlayer[tank].g_iTankType); - dpPimp.WriteCell(messages); - dpPimp.WriteCell(enabled); - dpPimp.WriteCell(pos); - dpPimp.WriteCell(iTime); - } - - vScreenEffect(survivor, tank, g_esPimpCache[tank].g_iPimpEffect, flags); - - if (g_esPimpCache[tank].g_iPimpMessage & messages) - { - char sTankName[64]; - MT_GetTankName(tank, sTankName); - MT_PrintToChatAll("%s %t", MT_TAG2, "Pimp", sTankName, survivor); - MT_LogMessage(MT_LOG_ABILITY, "%s %T", MT_TAG, "Pimp", LANG_SERVER, sTankName, survivor); - } - } - else if ((flags & MT_ATTACK_RANGE) && (g_esPimpPlayer[tank].g_iRangeCooldown == -1 || g_esPimpPlayer[tank].g_iRangeCooldown <= iTime)) - { - if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esPimpCache[tank].g_iHumanAbility == 1 && !g_esPimpPlayer[tank].g_bFailed) - { - g_esPimpPlayer[tank].g_bFailed = true; - - MT_PrintToChat(tank, "%s %t", MT_TAG3, "PimpHuman2"); - } - } - } - else if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esPimpCache[tank].g_iHumanAbility == 1 && !g_esPimpPlayer[tank].g_bNoAmmo) - { - g_esPimpPlayer[tank].g_bNoAmmo = true; - - MT_PrintToChat(tank, "%s %t", MT_TAG3, "PimpAmmo"); - } - } -} - -void vPimpCopyStats2(int oldTank, int newTank) -{ - g_esPimpPlayer[newTank].g_iAmmoCount = g_esPimpPlayer[oldTank].g_iAmmoCount; - g_esPimpPlayer[newTank].g_iCooldown = g_esPimpPlayer[oldTank].g_iCooldown; - g_esPimpPlayer[newTank].g_iRangeCooldown = g_esPimpPlayer[oldTank].g_iRangeCooldown; -} - -void vRemovePimp(int tank) -{ - for (int iSurvivor = 1; iSurvivor <= MaxClients; iSurvivor++) - { - if (bIsSurvivor(iSurvivor, MT_CHECK_INGAME|MT_CHECK_ALIVE) && g_esPimpPlayer[iSurvivor].g_bAffected && g_esPimpPlayer[iSurvivor].g_iOwner == tank) - { - g_esPimpPlayer[iSurvivor].g_bAffected = false; - g_esPimpPlayer[iSurvivor].g_iOwner = -1; - } - } - - vPimpReset3(tank); -} - -void vPimpReset() -{ - for (int iPlayer = 1; iPlayer <= MaxClients; iPlayer++) - { - if (bIsValidClient(iPlayer, MT_CHECK_INGAME)) - { - vPimpReset3(iPlayer); - - g_esPimpPlayer[iPlayer].g_iOwner = -1; - } - } -} - -void vPimpReset2(int survivor, int tank, int messages) -{ - g_esPimpPlayer[survivor].g_bAffected = false; - g_esPimpPlayer[survivor].g_iOwner = -1; - - if (g_esPimpCache[tank].g_iPimpMessage & messages) - { - MT_PrintToChatAll("%s %t", MT_TAG2, "Pimp2", survivor); - MT_LogMessage(MT_LOG_ABILITY, "%s %T", MT_TAG, "Pimp2", LANG_SERVER, survivor); - } -} - -void vPimpReset3(int tank) -{ - g_esPimpPlayer[tank].g_bAffected = false; - g_esPimpPlayer[tank].g_bFailed = false; - g_esPimpPlayer[tank].g_bNoAmmo = false; - g_esPimpPlayer[tank].g_iAmmoCount = 0; - g_esPimpPlayer[tank].g_iCooldown = -1; - g_esPimpPlayer[tank].g_iRangeCooldown = -1; -} - -void tTimerPimpCombo(Handle timer, DataPack pack) -{ - pack.Reset(); - - int iTank = GetClientOfUserId(pack.ReadCell()); - if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esPimpAbility[g_esPimpPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esPimpPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esPimpPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esPimpCache[iTank].g_iPimpAbility == 0) - { - return; - } - - float flRandom = pack.ReadFloat(); - int iPos = pack.ReadCell(); - vPimpAbility(iTank, flRandom, iPos); -} - -void tTimerPimpCombo2(Handle timer, DataPack pack) -{ - pack.Reset(); - - int iSurvivor = GetClientOfUserId(pack.ReadCell()); - if (!bIsSurvivor(iSurvivor) || g_esPimpPlayer[iSurvivor].g_bAffected) - { - return; - } - - int iTank = GetClientOfUserId(pack.ReadCell()); - if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esPimpAbility[g_esPimpPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esPimpPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esPimpPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esPimpCache[iTank].g_iPimpHit == 0) - { - return; - } - - float flRandom = pack.ReadFloat(), flChance = pack.ReadFloat(); - int iPos = pack.ReadCell(); - char sClassname[32]; - pack.ReadString(sClassname, sizeof sClassname); - if ((g_esPimpCache[iTank].g_iPimpHitMode == 0 || g_esPimpCache[iTank].g_iPimpHitMode == 1) && (bIsSpecialInfected(iTank) || StrEqual(sClassname[7], "tank_claw") || StrEqual(sClassname, "tank_rock"))) - { - vPimpHit(iSurvivor, iTank, flRandom, flChance, g_esPimpCache[iTank].g_iPimpHit, MT_MESSAGE_MELEE, MT_ATTACK_CLAW, iPos); - } - else if ((g_esPimpCache[iTank].g_iPimpHitMode == 0 || g_esPimpCache[iTank].g_iPimpHitMode == 2) && StrEqual(sClassname[7], "melee")) - { - vPimpHit(iSurvivor, iTank, flRandom, flChance, g_esPimpCache[iTank].g_iPimpHit, MT_MESSAGE_MELEE, MT_ATTACK_MELEE, iPos); - } -} - -Action tTimerPimp(Handle timer, DataPack pack) -{ - pack.Reset(); - - int iSurvivor = GetClientOfUserId(pack.ReadCell()); - if (!MT_IsCorePluginEnabled() || !bIsSurvivor(iSurvivor)) - { - g_esPimpPlayer[iSurvivor].g_bAffected = false; - g_esPimpPlayer[iSurvivor].g_iOwner = -1; - - return Plugin_Stop; - } - - int iTank = GetClientOfUserId(pack.ReadCell()), iType = pack.ReadCell(), iMessage = pack.ReadCell(); - if (!MT_IsTankSupported(iTank) || bIsAreaNarrow(iTank, g_esPimpCache[iTank].g_flOpenAreasOnly) || bIsAreaWide(iTank, g_esPimpCache[iTank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esPimpPlayer[iTank].g_iTankType, iTank) || (g_esPimpCache[iTank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esPimpCache[iTank].g_iRequiresHumans) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esPimpAbility[g_esPimpPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esPimpPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esPimpPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || iType != g_esPimpPlayer[iTank].g_iTankType || MT_IsAdminImmune(iSurvivor, iTank) || bIsAdminImmune(iSurvivor, g_esPimpPlayer[iTank].g_iTankType, g_esPimpAbility[g_esPimpPlayer[iTank].g_iTankTypeRecorded].g_iImmunityFlags, g_esPimpPlayer[iSurvivor].g_iImmunityFlags) || !g_esPimpPlayer[iSurvivor].g_bAffected || MT_DoesSurvivorHaveRewardType(iSurvivor, MT_REWARD_GODMODE)) - { - vPimpReset2(iSurvivor, iTank, iMessage); - - return Plugin_Stop; - } - - int iPimpEnabled = pack.ReadCell(), iPos = pack.ReadCell(), - iDuration = (iPos != -1) ? RoundToNearest(MT_GetCombinationSetting(iTank, 5, iPos)) : g_esPimpCache[iTank].g_iPimpDuration, - iTime = pack.ReadCell(); - if (iPimpEnabled == 0 || (iTime + iDuration) <= GetTime() || !g_esPimpPlayer[iSurvivor].g_bAffected) - { - vPimpReset2(iSurvivor, iTank, iMessage); - - return Plugin_Stop; - } - - if (!bIsVisibleToPlayer(iSurvivor, iTank, g_esPimpCache[iTank].g_iPimpSight)) - { - return Plugin_Continue; - } - - float flDamage = (iPos != -1) ? MT_GetCombinationSetting(iTank, 3, iPos) : float(g_esPimpCache[iTank].g_iPimpDamage); - if (flDamage > 0.0) - { - SlapPlayer(iSurvivor, RoundToNearest(MT_GetScaledDamage(flDamage)), true); - vAttachParticle(iSurvivor, PARTICLE_BLOOD, 0.1); - } - - return Plugin_Continue; -} \ No newline at end of file diff --git a/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_puke.sp b/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_puke.sp index e9278b2558..931feed595 100644 --- a/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_puke.sp +++ b/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_puke.sp @@ -1,6 +1,6 @@ /** - * Mutant Tanks: a L4D/L4D2 SourceMod Plugin - * Copyright (C) 2024 Alfred "Psyk0tik" Llagas + * Mutant Tanks: A L4D/L4D2 SourceMod Plugin + * Copyright (C) 2017-2025 Alfred "Psyk0tik" Llagas * * 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. * @@ -29,6 +29,8 @@ public Plugin myinfo = bool g_bDedicated, g_bLateLoad; +int g_iGraphicsLevel; + public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max) { EngineVersion evEngine = GetEngineVersion(); @@ -814,7 +816,9 @@ public void MT_OnSettingsCached(int tank, bool apply, int type) g_esPukePlayer[tank].g_iTankTypeRecorded = apply ? MT_GetRecordedTankType(tank, type) : 0; g_esPukePlayer[tank].g_iTankType = apply ? type : 0; int iType = g_esPukePlayer[tank].g_iTankTypeRecorded; - +#if !defined MT_ABILITIES_MAIN2 + g_iGraphicsLevel = MT_GetGraphicsLevel(); +#endif if (bIsSpecialInfected(tank, MT_CHECK_INDEX|MT_CHECK_INGAME)) { g_esPukeCache[tank].g_flCloseAreasOnly = flGetSubSettingValue(apply, bHuman, g_esPukeTeammate[tank].g_flCloseAreasOnly, g_esPukePlayer[tank].g_flCloseAreasOnly, g_esPukeSpecial[iType].g_flCloseAreasOnly, g_esPukeAbility[iType].g_flCloseAreasOnly, 1); @@ -1044,7 +1048,7 @@ void vPukeAbility(int tank, float random, int pos = -1) MT_PrintToChat(tank, "%s %t", MT_TAG3, "PukeHuman4"); } } - else if (random <= flChance) + else if (random <= flChance && g_iGraphicsLevel > 2) { iCreateParticle(tank, PARTICLE_VOMIT, view_as({0.0, 0.0, 70.0}), view_as({-90.0, 0.0, 0.0}), 0.95, 1.0); } @@ -1159,8 +1163,11 @@ void vPukeRange(int tank, int value, int bit, float random, int pos = -1) return; } - vAttachParticle(tank, PARTICLE_BLOOD, 0.1); - iCreateParticle(tank, PARTICLE_VOMIT, view_as({0.0, 0.0, 70.0}), view_as({-90.0, 0.0, 0.0}), 0.95, 1.0); + if (g_iGraphicsLevel > 2) + { + vAttachParticle(tank, PARTICLE_BLOOD, 0.1); + iCreateParticle(tank, PARTICLE_VOMIT, view_as({0.0, 0.0, 70.0}), view_as({-90.0, 0.0, 0.0}), 0.95, 1.0); + } float flTankPos[3], flSurvivorPos[3]; GetClientAbsOrigin(tank, flTankPos); @@ -1209,35 +1216,37 @@ void vPukeReset() } } -void tTimerPukeCombo(Handle timer, DataPack pack) +Action tTimerPukeCombo(Handle timer, DataPack pack) { pack.Reset(); int iTank = GetClientOfUserId(pack.ReadCell()); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esPukeAbility[g_esPukePlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esPukePlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esPukePlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esPukeCache[iTank].g_iPukeAbility == 0) { - return; + return Plugin_Stop; } float flRandom = pack.ReadFloat(); int iPos = pack.ReadCell(); vPukeAbility(iTank, flRandom, iPos); + + return Plugin_Continue; } -void tTimerPukeCombo2(Handle timer, DataPack pack) +Action tTimerPukeCombo2(Handle timer, DataPack pack) { pack.Reset(); int iSurvivor = GetClientOfUserId(pack.ReadCell()); if (!bIsSurvivor(iSurvivor)) { - return; + return Plugin_Stop; } int iTank = GetClientOfUserId(pack.ReadCell()); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esPukeAbility[g_esPukePlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esPukePlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esPukePlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esPukeCache[iTank].g_iPukeHit == 0) { - return; + return Plugin_Stop; } float flRandom = pack.ReadFloat(), flChance = pack.ReadFloat(); @@ -1252,44 +1261,50 @@ void tTimerPukeCombo2(Handle timer, DataPack pack) { vPukeHit(iSurvivor, iTank, flRandom, flChance, g_esPukeCache[iTank].g_iPukeHit, MT_MESSAGE_MELEE, MT_ATTACK_MELEE, iPos); } + + return Plugin_Continue; } -void tTimerPukeHit(Handle timer, DataPack pack) +Action tTimerPukeHit(Handle timer, DataPack pack) { pack.Reset(); int iSurvivor = GetClientOfUserId(pack.ReadCell()); if (!bIsSurvivor(iSurvivor)) { - return; + return Plugin_Stop; } int iTank = GetClientOfUserId(pack.ReadCell()); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esPukeAbility[g_esPukePlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esPukePlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esPukePlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esPukeCache[iTank].g_iPukeAbility == 0) { - return; + return Plugin_Stop; } int iFlags = pack.ReadCell(); MT_VomitPlayer(iSurvivor, iTank); vScreenEffect(iSurvivor, iTank, g_esPukeCache[iTank].g_iPukeEffect, iFlags); + + return Plugin_Continue; } -void tTimerPukeRange(Handle timer, DataPack pack) +Action tTimerPukeRange(Handle timer, DataPack pack) { pack.Reset(); int iSurvivor = GetClientOfUserId(pack.ReadCell()); if (!bIsSurvivor(iSurvivor)) { - return; + return Plugin_Stop; } int iTank = GetClientOfUserId(pack.ReadCell()); if (!MT_IsCorePluginEnabled() || !bIsValidClient(iTank, MT_CHECK_INDEX|MT_CHECK_INGAME)) { - return; + return Plugin_Stop; } MT_VomitPlayer(iSurvivor, iTank); + + return Plugin_Continue; } \ No newline at end of file diff --git a/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_pyro.sp b/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_pyro.sp index 4c8be6f2f8..2eacb53a5e 100644 --- a/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_pyro.sp +++ b/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_pyro.sp @@ -1,6 +1,6 @@ /** - * Mutant Tanks: a L4D/L4D2 SourceMod Plugin - * Copyright (C) 2024 Alfred "Psyk0tik" Llagas + * Mutant Tanks: A L4D/L4D2 SourceMod Plugin + * Copyright (C) 2017-2025 Alfred "Psyk0tik" Llagas * * 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. * @@ -343,7 +343,15 @@ int iPyroMenuHandler(Menu menu, MenuAction action, int param1, int param2) case 0: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esPyroCache[param1].g_iPyroAbility == 0) ? "AbilityStatus1" : "AbilityStatus2"); case 1: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityAmmo", (g_esPyroCache[param1].g_iHumanAmmo - g_esPyroPlayer[param1].g_iAmmoCount), g_esPyroCache[param1].g_iHumanAmmo); case 2: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtons"); - case 3: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esPyroCache[param1].g_iHumanMode == 0) ? "AbilityButtonMode1" : "AbilityButtonMode2"); + case 3: + { + switch (g_esPyroCache[param1].g_iHumanMode) + { + case 0: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtonMode1"); + case 1: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtonMode2"); + case 2: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtonMode3"); + } + } case 4: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityCooldown", ((g_esPyroCache[param1].g_iHumanAbility == 1) ? g_esPyroCache[param1].g_iHumanCooldown : g_esPyroCache[param1].g_iPyroCooldown)); case 5: MT_PrintToChat(param1, "%s %t", MT_TAG3, "PyroDetails"); case 6: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityDuration2", ((g_esPyroCache[param1].g_iHumanAbility == 1) ? g_esPyroCache[param1].g_iHumanDuration : g_esPyroCache[param1].g_iPyroDuration)); @@ -427,7 +435,7 @@ void vPyroPlayerRunCmd(int client) public Action OnPlayerRunCmd(int client, int &buttons, int &impulse, float vel[3], float angles[3], int &weapon) #endif { - if (!MT_IsTankSupported(client) || !g_esPyroPlayer[client].g_bActivated || (bIsInfected(client, MT_CHECK_FAKECLIENT) && g_esPyroCache[client].g_iHumanMode == 1) || g_esPyroPlayer[client].g_iDuration == -1) + if (!MT_IsTankSupported(client) || !g_esPyroPlayer[client].g_bActivated || (bIsInfected(client, MT_CHECK_FAKECLIENT) && g_esPyroCache[client].g_iHumanMode > 0) || g_esPyroPlayer[client].g_iDuration == -1) { #if defined MT_ABILITIES_MAIN2 return; @@ -743,7 +751,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esPyroTeammate[admin].g_iHumanAmmo = iGetKeyValue(subsection, MT_PYRO_SECTION, MT_PYRO_SECTION2, MT_PYRO_SECTION3, MT_PYRO_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esPyroTeammate[admin].g_iHumanAmmo, value, -1, 99999); g_esPyroTeammate[admin].g_iHumanCooldown = iGetKeyValue(subsection, MT_PYRO_SECTION, MT_PYRO_SECTION2, MT_PYRO_SECTION3, MT_PYRO_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esPyroTeammate[admin].g_iHumanCooldown, value, -1, 99999); g_esPyroTeammate[admin].g_iHumanDuration = iGetKeyValue(subsection, MT_PYRO_SECTION, MT_PYRO_SECTION2, MT_PYRO_SECTION3, MT_PYRO_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esPyroTeammate[admin].g_iHumanDuration, value, -1, 99999); - g_esPyroTeammate[admin].g_iHumanMode = iGetKeyValue(subsection, MT_PYRO_SECTION, MT_PYRO_SECTION2, MT_PYRO_SECTION3, MT_PYRO_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esPyroTeammate[admin].g_iHumanMode, value, -1, 1); + g_esPyroTeammate[admin].g_iHumanMode = iGetKeyValue(subsection, MT_PYRO_SECTION, MT_PYRO_SECTION2, MT_PYRO_SECTION3, MT_PYRO_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esPyroTeammate[admin].g_iHumanMode, value, -1, 2); g_esPyroTeammate[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_PYRO_SECTION, MT_PYRO_SECTION2, MT_PYRO_SECTION3, MT_PYRO_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esPyroTeammate[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); g_esPyroTeammate[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_PYRO_SECTION, MT_PYRO_SECTION2, MT_PYRO_SECTION3, MT_PYRO_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esPyroTeammate[admin].g_iRequiresHumans, value, -1, 32); g_esPyroTeammate[admin].g_iPyroAbility = iGetKeyValue(subsection, MT_PYRO_SECTION, MT_PYRO_SECTION2, MT_PYRO_SECTION3, MT_PYRO_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esPyroTeammate[admin].g_iPyroAbility, value, -1, 1); @@ -765,7 +773,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esPyroPlayer[admin].g_iHumanAmmo = iGetKeyValue(subsection, MT_PYRO_SECTION, MT_PYRO_SECTION2, MT_PYRO_SECTION3, MT_PYRO_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esPyroPlayer[admin].g_iHumanAmmo, value, -1, 99999); g_esPyroPlayer[admin].g_iHumanCooldown = iGetKeyValue(subsection, MT_PYRO_SECTION, MT_PYRO_SECTION2, MT_PYRO_SECTION3, MT_PYRO_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esPyroPlayer[admin].g_iHumanCooldown, value, -1, 99999); g_esPyroPlayer[admin].g_iHumanDuration = iGetKeyValue(subsection, MT_PYRO_SECTION, MT_PYRO_SECTION2, MT_PYRO_SECTION3, MT_PYRO_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esPyroPlayer[admin].g_iHumanDuration, value, -1, 99999); - g_esPyroPlayer[admin].g_iHumanMode = iGetKeyValue(subsection, MT_PYRO_SECTION, MT_PYRO_SECTION2, MT_PYRO_SECTION3, MT_PYRO_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esPyroPlayer[admin].g_iHumanMode, value, -1, 1); + g_esPyroPlayer[admin].g_iHumanMode = iGetKeyValue(subsection, MT_PYRO_SECTION, MT_PYRO_SECTION2, MT_PYRO_SECTION3, MT_PYRO_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esPyroPlayer[admin].g_iHumanMode, value, -1, 2); g_esPyroPlayer[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_PYRO_SECTION, MT_PYRO_SECTION2, MT_PYRO_SECTION3, MT_PYRO_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esPyroPlayer[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); g_esPyroPlayer[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_PYRO_SECTION, MT_PYRO_SECTION2, MT_PYRO_SECTION3, MT_PYRO_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esPyroPlayer[admin].g_iRequiresHumans, value, -1, 32); g_esPyroPlayer[admin].g_iPyroAbility = iGetKeyValue(subsection, MT_PYRO_SECTION, MT_PYRO_SECTION2, MT_PYRO_SECTION3, MT_PYRO_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esPyroPlayer[admin].g_iPyroAbility, value, -1, 1); @@ -792,7 +800,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esPyroSpecial[type].g_iHumanAmmo = iGetKeyValue(subsection, MT_PYRO_SECTION, MT_PYRO_SECTION2, MT_PYRO_SECTION3, MT_PYRO_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esPyroSpecial[type].g_iHumanAmmo, value, -1, 99999); g_esPyroSpecial[type].g_iHumanCooldown = iGetKeyValue(subsection, MT_PYRO_SECTION, MT_PYRO_SECTION2, MT_PYRO_SECTION3, MT_PYRO_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esPyroSpecial[type].g_iHumanCooldown, value, -1, 99999); g_esPyroSpecial[type].g_iHumanDuration = iGetKeyValue(subsection, MT_PYRO_SECTION, MT_PYRO_SECTION2, MT_PYRO_SECTION3, MT_PYRO_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esPyroSpecial[type].g_iHumanDuration, value, -1, 99999); - g_esPyroSpecial[type].g_iHumanMode = iGetKeyValue(subsection, MT_PYRO_SECTION, MT_PYRO_SECTION2, MT_PYRO_SECTION3, MT_PYRO_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esPyroSpecial[type].g_iHumanMode, value, -1, 1); + g_esPyroSpecial[type].g_iHumanMode = iGetKeyValue(subsection, MT_PYRO_SECTION, MT_PYRO_SECTION2, MT_PYRO_SECTION3, MT_PYRO_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esPyroSpecial[type].g_iHumanMode, value, -1, 2); g_esPyroSpecial[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_PYRO_SECTION, MT_PYRO_SECTION2, MT_PYRO_SECTION3, MT_PYRO_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esPyroSpecial[type].g_flOpenAreasOnly, value, -1.0, 99999.0); g_esPyroSpecial[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_PYRO_SECTION, MT_PYRO_SECTION2, MT_PYRO_SECTION3, MT_PYRO_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esPyroSpecial[type].g_iRequiresHumans, value, -1, 32); g_esPyroSpecial[type].g_iPyroAbility = iGetKeyValue(subsection, MT_PYRO_SECTION, MT_PYRO_SECTION2, MT_PYRO_SECTION3, MT_PYRO_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esPyroSpecial[type].g_iPyroAbility, value, -1, 1); @@ -814,7 +822,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esPyroAbility[type].g_iHumanAmmo = iGetKeyValue(subsection, MT_PYRO_SECTION, MT_PYRO_SECTION2, MT_PYRO_SECTION3, MT_PYRO_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esPyroAbility[type].g_iHumanAmmo, value, -1, 99999); g_esPyroAbility[type].g_iHumanCooldown = iGetKeyValue(subsection, MT_PYRO_SECTION, MT_PYRO_SECTION2, MT_PYRO_SECTION3, MT_PYRO_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esPyroAbility[type].g_iHumanCooldown, value, -1, 99999); g_esPyroAbility[type].g_iHumanDuration = iGetKeyValue(subsection, MT_PYRO_SECTION, MT_PYRO_SECTION2, MT_PYRO_SECTION3, MT_PYRO_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esPyroAbility[type].g_iHumanDuration, value, -1, 99999); - g_esPyroAbility[type].g_iHumanMode = iGetKeyValue(subsection, MT_PYRO_SECTION, MT_PYRO_SECTION2, MT_PYRO_SECTION3, MT_PYRO_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esPyroAbility[type].g_iHumanMode, value, -1, 1); + g_esPyroAbility[type].g_iHumanMode = iGetKeyValue(subsection, MT_PYRO_SECTION, MT_PYRO_SECTION2, MT_PYRO_SECTION3, MT_PYRO_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esPyroAbility[type].g_iHumanMode, value, -1, 2); g_esPyroAbility[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_PYRO_SECTION, MT_PYRO_SECTION2, MT_PYRO_SECTION3, MT_PYRO_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esPyroAbility[type].g_flOpenAreasOnly, value, -1.0, 99999.0); g_esPyroAbility[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_PYRO_SECTION, MT_PYRO_SECTION2, MT_PYRO_SECTION3, MT_PYRO_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esPyroAbility[type].g_iRequiresHumans, value, -1, 32); g_esPyroAbility[type].g_iPyroAbility = iGetKeyValue(subsection, MT_PYRO_SECTION, MT_PYRO_SECTION2, MT_PYRO_SECTION3, MT_PYRO_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esPyroAbility[type].g_iPyroAbility, value, -1, 1); @@ -997,10 +1005,10 @@ public void MT_OnButtonPressed(int tank, int button) if ((button & MT_MAIN_KEY) && g_esPyroCache[tank].g_iPyroAbility == 1 && g_esPyroCache[tank].g_iHumanAbility == 1) { - int iTime = GetTime(); + int iHumanMode = g_esPyroCache[tank].g_iHumanMode, iTime = GetTime(); bool bRecharging = g_esPyroPlayer[tank].g_iCooldown != -1 && g_esPyroPlayer[tank].g_iCooldown >= iTime; - switch (g_esPyroCache[tank].g_iHumanMode) + switch (iHumanMode) { case 0: { @@ -1017,9 +1025,9 @@ public void MT_OnButtonPressed(int tank, int button) MT_PrintToChat(tank, "%s %t", MT_TAG3, "PyroHuman4", (g_esPyroPlayer[tank].g_iCooldown - iTime)); } } - case 1: + case 1, 2: { - if (g_esPyroPlayer[tank].g_iAmmoCount < g_esPyroCache[tank].g_iHumanAmmo && g_esPyroCache[tank].g_iHumanAmmo > 0) + if ((iHumanMode == 2 && g_esPyroPlayer[tank].g_bActivated) || (g_esPyroPlayer[tank].g_iAmmoCount < g_esPyroCache[tank].g_iHumanAmmo && g_esPyroCache[tank].g_iHumanAmmo > 0)) { if (!g_esPyroPlayer[tank].g_bActivated && !bRecharging) { @@ -1033,7 +1041,15 @@ public void MT_OnButtonPressed(int tank, int button) } else if (g_esPyroPlayer[tank].g_bActivated) { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "PyroHuman3"); + switch (iHumanMode) + { + case 1: MT_PrintToChat(tank, "%s %t", MT_TAG3, "PyroHuman3"); + case 2: + { + vPyroReset2(tank); + vPyroReset3(tank); + } + } } else if (bRecharging) { @@ -1201,16 +1217,18 @@ void vPyroReset3(int tank) } } -void tTimerPyroCombo(Handle timer, DataPack pack) +Action tTimerPyroCombo(Handle timer, DataPack pack) { pack.Reset(); int iTank = GetClientOfUserId(pack.ReadCell()); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esPyroAbility[g_esPyroPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esPyroPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esPyroPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esPyroCache[iTank].g_iPyroAbility == 0 || g_esPyroPlayer[iTank].g_bActivated) { - return; + return Plugin_Stop; } int iPos = pack.ReadCell(); vPyro(iTank, iPos); + + return Plugin_Continue; } \ No newline at end of file diff --git a/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_quiet.sp b/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_quiet.sp index 5c7cdcf803..7bed17876d 100644 --- a/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_quiet.sp +++ b/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_quiet.sp @@ -1,6 +1,6 @@ /** - * Mutant Tanks: a L4D/L4D2 SourceMod Plugin - * Copyright (C) 2024 Alfred "Psyk0tik" Llagas + * Mutant Tanks: A L4D/L4D2 SourceMod Plugin + * Copyright (C) 2017-2025 Alfred "Psyk0tik" Llagas * * 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. * @@ -1229,35 +1229,37 @@ void vQuietReset2(int tank) g_esQuietPlayer[tank].g_iRangeCooldown = -1; } -void tTimerQuietCombo(Handle timer, DataPack pack) +Action tTimerQuietCombo(Handle timer, DataPack pack) { pack.Reset(); int iTank = GetClientOfUserId(pack.ReadCell()); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esQuietAbility[g_esQuietPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esQuietPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esQuietPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esQuietCache[iTank].g_iQuietAbility == 0) { - return; + return Plugin_Stop; } float flRandom = pack.ReadFloat(); int iPos = pack.ReadCell(); vQuietAbility(iTank, flRandom, iPos); + + return Plugin_Continue; } -void tTimerQuietCombo2(Handle timer, DataPack pack) +Action tTimerQuietCombo2(Handle timer, DataPack pack) { pack.Reset(); int iSurvivor = GetClientOfUserId(pack.ReadCell()); if (!bIsHumanSurvivor(iSurvivor) || g_esQuietPlayer[iSurvivor].g_bAffected) { - return; + return Plugin_Stop; } int iTank = GetClientOfUserId(pack.ReadCell()); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esQuietAbility[g_esQuietPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esQuietPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esQuietPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esQuietCache[iTank].g_iQuietHit == 0) { - return; + return Plugin_Stop; } float flRandom = pack.ReadFloat(), flChance = pack.ReadFloat(); @@ -1272,9 +1274,11 @@ void tTimerQuietCombo2(Handle timer, DataPack pack) { vQuietHit(iSurvivor, iTank, flRandom, flChance, g_esQuietCache[iTank].g_iQuietHit, MT_MESSAGE_MELEE, MT_ATTACK_MELEE, iPos); } + + return Plugin_Continue; } -void tTimerStopQuiet(Handle timer, DataPack pack) +Action tTimerStopQuiet(Handle timer, DataPack pack) { pack.Reset(); @@ -1285,7 +1289,7 @@ void tTimerStopQuiet(Handle timer, DataPack pack) g_esQuietPlayer[iSurvivor].g_iFilter = 0; g_esQuietPlayer[iSurvivor].g_iOwner = -1; - return; + return Plugin_Stop; } int iTank = GetClientOfUserId(pack.ReadCell()); @@ -1295,7 +1299,7 @@ void tTimerStopQuiet(Handle timer, DataPack pack) g_esQuietPlayer[iSurvivor].g_iFilter = 0; g_esQuietPlayer[iSurvivor].g_iOwner = -1; - return; + return Plugin_Stop; } g_esQuietPlayer[iSurvivor].g_bAffected = false; @@ -1310,4 +1314,6 @@ void tTimerStopQuiet(Handle timer, DataPack pack) MT_PrintToChatAll("%s %t", MT_TAG2, "Quiet2", sTankName, iSurvivor); MT_LogMessage(MT_LOG_ABILITY, "%s %T", MT_TAG, "Quiet2", LANG_SERVER, sTankName, iSurvivor); } + + return Plugin_Continue; } \ No newline at end of file diff --git a/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_recall.sp b/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_recall.sp index eeb5cc6834..8d9d56bc4a 100644 --- a/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_recall.sp +++ b/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_recall.sp @@ -1,6 +1,6 @@ /** - * Mutant Tanks: a L4D/L4D2 SourceMod Plugin - * Copyright (C) 2024 Alfred "Psyk0tik" Llagas + * Mutant Tanks: A L4D/L4D2 SourceMod Plugin + * Copyright (C) 2017-2025 Alfred "Psyk0tik" Llagas * * 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. * @@ -29,6 +29,8 @@ public Plugin myinfo = bool g_bDedicated, g_bLateLoad; +int g_iGraphicsLevel; + public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max) { EngineVersion evEngine = GetEngineVersion(); @@ -454,8 +456,12 @@ public Action OnPlayerRunCmd(int client, int &buttons, int &impulse, float vel[3 g_esRecallPlayer[client].g_flLastRecall[0] = flCurrentTime + 5.0; MT_TeleportPlayerAhead(client, flOrigin, flEyeAngles, NULL_VECTOR, flDirection, 150.0); - vAttachParticle(client, PARTICLE_ELECTRICITY, 0.75, 30.0); vForceVocalize(client, "PlayerLaugh"); + + if (g_iGraphicsLevel > 2) + { + vAttachParticle(client, PARTICLE_ELECTRICITY, 0.75, 30.0); + } } } else if (buttons & IN_RELOAD) @@ -751,7 +757,9 @@ public void MT_OnSettingsCached(int tank, bool apply, int type) g_esRecallPlayer[tank].g_iTankTypeRecorded = apply ? MT_GetRecordedTankType(tank, type) : 0; g_esRecallPlayer[tank].g_iTankType = apply ? type : 0; int iType = g_esRecallPlayer[tank].g_iTankTypeRecorded; - +#if !defined MT_ABILITIES_MAIN2 + g_iGraphicsLevel = MT_GetGraphicsLevel(); +#endif if (bIsSpecialInfected(tank, MT_CHECK_INDEX|MT_CHECK_INGAME)) { g_esRecallCache[tank].g_flCloseAreasOnly = flGetSubSettingValue(apply, bHuman, g_esRecallTeammate[tank].g_flCloseAreasOnly, g_esRecallPlayer[tank].g_flCloseAreasOnly, g_esRecallSpecial[iType].g_flCloseAreasOnly, g_esRecallAbility[iType].g_flCloseAreasOnly, 1); @@ -1073,7 +1081,7 @@ void vRecallAbility(int tank, bool main) { if (!bIsInfected(tank, MT_CHECK_FAKECLIENT) || (g_esRecallPlayer[tank].g_iAmmoCount2 < g_esRecallCache[tank].g_iHumanAmmo && g_esRecallCache[tank].g_iHumanAmmo > 0)) { - if (MT_GetRandomFloat(0.0, 100.0) <= g_esRecallCache[tank].g_flRecallRewindChance) + if (GetRandomFloat(0.1, 100.0) <= g_esRecallCache[tank].g_flRecallRewindChance) { vRecallRewind(tank, g_esRecallCache[tank].g_flRecallRewindThreshold, g_esRecallCache[tank].g_iRecallRewindLifetime, g_esRecallCache[tank].g_iRecallRewindMode, g_esRecallCache[tank].g_iRecallRewindCleanse); } @@ -1105,7 +1113,7 @@ void vRecallAbility(int tank, bool main) { if (g_esRecallPlayer[tank].g_iCount < g_esRecallCache[tank].g_iRecallBlinkCount) { - if (MT_GetRandomFloat(0.0, 100.0) <= g_esRecallCache[tank].g_flRecallBlinkChance) + if (GetRandomFloat(0.1, 100.0) <= g_esRecallCache[tank].g_flRecallBlinkChance) { g_esRecallPlayer[tank].g_iCount++; @@ -1168,7 +1176,11 @@ void vRecallAbility(int tank, bool main) } MT_TeleportPlayerAhead(tank, flOrigin, flEyeAngles, NULL_VECTOR, flDirection, g_esRecallCache[tank].g_flRecallBlinkRange); - vAttachParticle(iVictim, PARTICLE_ELECTRICITY, 0.75, 30.0); + + if (g_iGraphicsLevel > 2) + { + vAttachParticle(iVictim, PARTICLE_ELECTRICITY, 0.75, 30.0); + } if (bIsPlayerStuck(tank)) { @@ -1317,7 +1329,11 @@ void vRecallRewind(int player, float threshold, int lifetime, int mode, int clea TeleportEntity(player, flNewPos, flEyeAngles); vFixPlayerPosition(player); - vAttachParticle(iVictim, PARTICLE_ELECTRICITY, 0.75, 30.0); + + if (g_iGraphicsLevel > 2) + { + vAttachParticle(iVictim, PARTICLE_ELECTRICITY, 0.75, 30.0); + } if (cleanse == 1) { diff --git a/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_recoil.sp b/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_recoil.sp index 5be773c83d..f455e1da29 100644 --- a/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_recoil.sp +++ b/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_recoil.sp @@ -1,6 +1,6 @@ /** - * Mutant Tanks: a L4D/L4D2 SourceMod Plugin - * Copyright (C) 2024 Alfred "Psyk0tik" Llagas + * Mutant Tanks: A L4D/L4D2 SourceMod Plugin + * Copyright (C) 2017-2025 Alfred "Psyk0tik" Llagas * * 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. * @@ -1184,35 +1184,37 @@ void vRecoilReset2(int tank) g_esRecoilPlayer[tank].g_iRangeCooldown = -1; } -void tTimerRecoilCombo(Handle timer, DataPack pack) +Action tTimerRecoilCombo(Handle timer, DataPack pack) { pack.Reset(); int iTank = GetClientOfUserId(pack.ReadCell()); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esRecoilAbility[g_esRecoilPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esRecoilPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esRecoilPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esRecoilCache[iTank].g_iRecoilAbility == 0) { - return; + return Plugin_Stop; } float flRandom = pack.ReadFloat(); int iPos = pack.ReadCell(); vRecoilAbility(iTank, flRandom, iPos); + + return Plugin_Continue; } -void tTimerRecoilCombo2(Handle timer, DataPack pack) +Action tTimerRecoilCombo2(Handle timer, DataPack pack) { pack.Reset(); int iSurvivor = GetClientOfUserId(pack.ReadCell()); if (!bIsSurvivor(iSurvivor) || g_esRecoilPlayer[iSurvivor].g_bAffected) { - return; + return Plugin_Stop; } int iTank = GetClientOfUserId(pack.ReadCell()); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esRecoilAbility[g_esRecoilPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esRecoilPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esRecoilPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esRecoilCache[iTank].g_iRecoilHit == 0) { - return; + return Plugin_Stop; } float flRandom = pack.ReadFloat(), flChance = pack.ReadFloat(); @@ -1227,9 +1229,11 @@ void tTimerRecoilCombo2(Handle timer, DataPack pack) { vRecoilHit(iSurvivor, iTank, flRandom, flChance, g_esRecoilCache[iTank].g_iRecoilHit, MT_MESSAGE_MELEE, MT_ATTACK_MELEE, iPos); } + + return Plugin_Continue; } -void tTimerStopRecoil(Handle timer, DataPack pack) +Action tTimerStopRecoil(Handle timer, DataPack pack) { pack.Reset(); @@ -1239,7 +1243,7 @@ void tTimerStopRecoil(Handle timer, DataPack pack) g_esRecoilPlayer[iSurvivor].g_bAffected = false; g_esRecoilPlayer[iSurvivor].g_iOwner = -1; - return; + return Plugin_Stop; } int iTank = GetClientOfUserId(pack.ReadCell()); @@ -1248,7 +1252,7 @@ void tTimerStopRecoil(Handle timer, DataPack pack) g_esRecoilPlayer[iSurvivor].g_bAffected = false; g_esRecoilPlayer[iSurvivor].g_iOwner = -1; - return; + return Plugin_Stop; } g_esRecoilPlayer[iSurvivor].g_bAffected = false; @@ -1260,4 +1264,6 @@ void tTimerStopRecoil(Handle timer, DataPack pack) MT_PrintToChatAll("%s %t", MT_TAG2, "Recoil2", iSurvivor); MT_LogMessage(MT_LOG_ABILITY, "%s %T", MT_TAG, "Recoil2", LANG_SERVER, iSurvivor); } + + return Plugin_Continue; } \ No newline at end of file diff --git a/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_regen.sp b/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_regen.sp index b5d0a30e27..808826ac7a 100644 --- a/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_regen.sp +++ b/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_regen.sp @@ -1,6 +1,6 @@ /** - * Mutant Tanks: a L4D/L4D2 SourceMod Plugin - * Copyright (C) 2024 Alfred "Psyk0tik" Llagas + * Mutant Tanks: A L4D/L4D2 SourceMod Plugin + * Copyright (C) 2017-2025 Alfred "Psyk0tik" Llagas * * 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. * @@ -22,12 +22,14 @@ public Plugin myinfo = { name = "[MT] Regen Ability", author = MT_AUTHOR, - description = "The Mutant Tank regenerates health.", + description = "The Mutant Tank leeches health off of survivors, regenerates health, gains health from hurting survivors, and can steal health from survivors and vice-versa.", version = MT_VERSION, url = MT_URL }; -bool g_bDedicated, g_bSecondGame; +bool g_bDedicated, g_bLateLoad, g_bSecondGame; + +int g_iGraphicsLevel; public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max) { @@ -44,6 +46,7 @@ public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max } g_bDedicated = IsDedicatedServer(); + g_bLateLoad = late; return APLRes_Success; } @@ -70,8 +73,9 @@ enum struct esRegenPlayer float g_flCloseAreasOnly; float g_flOpenAreasOnly; float g_flRegenChance; + float g_flRegenHealthMultiplier; float g_flRegenInterval; - float g_flRegenLeechRange; + float g_flRegenRange; int g_iAccessFlags; int g_iAmmoCount; @@ -86,10 +90,12 @@ enum struct esRegenPlayer int g_iRegenAbility; int g_iRegenCooldown; int g_iRegenDuration; + int g_iRegenEffect; int g_iRegenHealth; - int g_iRegenLeech; int g_iRegenLimit; + int g_iRegenMaxHealth; int g_iRegenMessage; + int g_iRegenMode; int g_iRegenSight; int g_iRequiresHumans; int g_iTankType; @@ -103,8 +109,9 @@ enum struct esRegenTeammate float g_flCloseAreasOnly; float g_flOpenAreasOnly; float g_flRegenChance; + float g_flRegenHealthMultiplier; float g_flRegenInterval; - float g_flRegenLeechRange; + float g_flRegenRange; int g_iComboAbility; int g_iHumanAbility; @@ -115,10 +122,12 @@ enum struct esRegenTeammate int g_iRegenAbility; int g_iRegenCooldown; int g_iRegenDuration; + int g_iRegenEffect; int g_iRegenHealth; - int g_iRegenLeech; int g_iRegenLimit; + int g_iRegenMaxHealth; int g_iRegenMessage; + int g_iRegenMode; int g_iRegenSight; int g_iRequiresHumans; } @@ -130,8 +139,9 @@ enum struct esRegenAbility float g_flCloseAreasOnly; float g_flOpenAreasOnly; float g_flRegenChance; + float g_flRegenHealthMultiplier; float g_flRegenInterval; - float g_flRegenLeechRange; + float g_flRegenRange; int g_iAccessFlags; int g_iComboAbility; @@ -145,10 +155,12 @@ enum struct esRegenAbility int g_iRegenAbility; int g_iRegenCooldown; int g_iRegenDuration; + int g_iRegenEffect; int g_iRegenHealth; - int g_iRegenLeech; int g_iRegenLimit; + int g_iRegenMaxHealth; int g_iRegenMessage; + int g_iRegenMode; int g_iRegenSight; int g_iRequiresHumans; } @@ -160,8 +172,9 @@ enum struct esRegenSpecial float g_flCloseAreasOnly; float g_flOpenAreasOnly; float g_flRegenChance; + float g_flRegenHealthMultiplier; float g_flRegenInterval; - float g_flRegenLeechRange; + float g_flRegenRange; int g_iComboAbility; int g_iHumanAbility; @@ -172,10 +185,12 @@ enum struct esRegenSpecial int g_iRegenAbility; int g_iRegenCooldown; int g_iRegenDuration; + int g_iRegenEffect; int g_iRegenHealth; - int g_iRegenLeech; int g_iRegenLimit; + int g_iRegenMaxHealth; int g_iRegenMessage; + int g_iRegenMode; int g_iRegenSight; int g_iRequiresHumans; } @@ -187,8 +202,9 @@ enum struct esRegenCache float g_flCloseAreasOnly; float g_flOpenAreasOnly; float g_flRegenChance; + float g_flRegenHealthMultiplier; float g_flRegenInterval; - float g_flRegenLeechRange; + float g_flRegenRange; int g_iComboAbility; int g_iHumanAbility; @@ -199,17 +215,19 @@ enum struct esRegenCache int g_iRegenAbility; int g_iRegenCooldown; int g_iRegenDuration; + int g_iRegenEffect; int g_iRegenHealth; - int g_iRegenLeech; int g_iRegenLimit; + int g_iRegenMaxHealth; int g_iRegenMessage; + int g_iRegenMode; int g_iRegenSight; int g_iRequiresHumans; } esRegenCache g_esRegenCache[MAXPLAYERS + 1]; -int g_iLaserSprite = -1; +int g_iRegenSprite = -1; #if !defined MT_ABILITIES_MAIN2 public void OnPluginStart() @@ -219,6 +237,19 @@ public void OnPluginStart() LoadTranslations("mutant_tanks_names.phrases"); RegConsoleCmd("sm_mt_regen", cmdRegenInfo, "View information about the Regen ability."); + + if (g_bLateLoad) + { + for (int iPlayer = 1; iPlayer <= MaxClients; iPlayer++) + { + if (bIsValidClient(iPlayer, MT_CHECK_INGAME)) + { + OnClientPutInServer(iPlayer); + } + } + + g_bLateLoad = false; + } } #endif @@ -230,8 +261,8 @@ public void OnMapStart() { switch (g_bSecondGame) { - case true: g_iLaserSprite = PrecacheModel(SPRITE_LASERBEAM, true); - case false: g_iLaserSprite = PrecacheModel(SPRITE_LASER, true); + case true: g_iRegenSprite = PrecacheModel(SPRITE_LASERBEAM, true); + case false: g_iRegenSprite = PrecacheModel(SPRITE_LASER, true); } vRegenReset(); @@ -243,6 +274,7 @@ void vRegenClientPutInServer(int client) public void OnClientPutInServer(int client) #endif { + SDKHook(client, SDKHook_OnTakeDamage, OnRegenTakeDamage); vRemoveRegen(client); } @@ -325,7 +357,15 @@ int iRegenMenuHandler(Menu menu, MenuAction action, int param1, int param2) case 0: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esRegenCache[param1].g_iRegenAbility == 0) ? "AbilityStatus1" : "AbilityStatus2"); case 1: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityAmmo", (g_esRegenCache[param1].g_iHumanAmmo - g_esRegenPlayer[param1].g_iAmmoCount), g_esRegenCache[param1].g_iHumanAmmo); case 2: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtons"); - case 3: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esRegenCache[param1].g_iHumanMode == 0) ? "AbilityButtonMode1" : "AbilityButtonMode2"); + case 3: + { + switch (g_esRegenCache[param1].g_iHumanMode) + { + case 0: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtonMode1"); + case 1: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtonMode2"); + case 2: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtonMode3"); + } + } case 4: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityCooldown", ((g_esRegenCache[param1].g_iHumanAbility == 1) ? g_esRegenCache[param1].g_iHumanCooldown : g_esRegenCache[param1].g_iRegenCooldown)); case 5: MT_PrintToChat(param1, "%s %t", MT_TAG3, "RegenDetails"); case 6: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityDuration2", ((g_esRegenCache[param1].g_iHumanAbility == 1) ? g_esRegenCache[param1].g_iHumanDuration : g_esRegenCache[param1].g_iRegenDuration)); @@ -403,6 +443,94 @@ public void MT_OnMenuItemDisplayed(int client, const char[] info, char[] buffer, } } +Action OnRegenTakeDamage(int victim, int &attacker, int &inflictor, float &damage, int &damagetype) +{ + if (MT_IsCorePluginEnabled() && bIsValidClient(victim, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_ALIVE) && damage > 0.0) + { + char sClassname[32]; + if (bIsValidEntity(inflictor)) + { + GetEntityClassname(inflictor, sClassname, sizeof sClassname); + } + + if (MT_IsTankSupported(attacker) && MT_IsCustomTankSupported(attacker) && !bIsPlayerIncapacitated(attacker) && g_esRegenCache[attacker].g_iRegenMode > 0 && GetRandomFloat(0.1, 100.0) <= g_esRegenCache[attacker].g_flRegenChance && bIsSurvivor(victim) && !bIsSurvivorDisabled(victim)) + { + if (bIsAreaNarrow(attacker, g_esRegenCache[attacker].g_flOpenAreasOnly) || bIsAreaWide(attacker, g_esRegenCache[attacker].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esRegenPlayer[attacker].g_iTankType, attacker) || (g_esRegenCache[attacker].g_iRequiresHumans > 0 && iGetHumanCount() < g_esRegenCache[attacker].g_iRequiresHumans) || (!MT_HasAdminAccess(attacker) && !bHasAdminAccess(attacker, g_esRegenAbility[g_esRegenPlayer[attacker].g_iTankTypeRecorded].g_iAccessFlags, g_esRegenPlayer[attacker].g_iAccessFlags)) || MT_IsAdminImmune(victim, attacker) || bIsAdminImmune(victim, g_esRegenPlayer[attacker].g_iTankType, g_esRegenAbility[g_esRegenPlayer[attacker].g_iTankTypeRecorded].g_iImmunityFlags, g_esRegenPlayer[victim].g_iImmunityFlags)) + { + return Plugin_Continue; + } + + bool bCaught = bIsSurvivorCaught(victim); + if ((!bIsInfected(attacker, MT_CHECK_FAKECLIENT) || g_esRegenCache[attacker].g_iHumanAbility == 1) && ((bIsSpecialInfected(attacker) && (bCaught || (!bCaught && (damagetype & DMG_CLUB)) || (bIsSpitter(attacker) && StrEqual(sClassname, "insect_swarm")))) || StrEqual(sClassname[7], "tank_claw") || StrEqual(sClassname, "tank_rock"))) + { + if (g_esRegenCache[attacker].g_iRegenMode == 1 || g_esRegenCache[attacker].g_iRegenMode == 3) + { + float flHealth = (g_esRegenCache[attacker].g_iRegenHealth > 0) ? float(g_esRegenCache[attacker].g_iRegenHealth) : damage; + flHealth *= g_esRegenCache[attacker].g_flRegenHealthMultiplier; + int iDamage = RoundToNearest(flHealth), + iHealth = GetEntProp(attacker, Prop_Data, "m_iHealth"), + iMaxHealth = MT_TankMaxHealth(attacker, 1), + iNewHealth = (iHealth + iDamage), + iLeftover = (iNewHealth > MT_MAXHEALTH) ? (iDamage - MT_MAXHEALTH) : iNewHealth, + iFinalHealth = iClamp(iNewHealth, 1, MT_MAXHEALTH), + iTotalHealth = (iNewHealth > MT_MAXHEALTH) ? iLeftover : iDamage; + MT_TankMaxHealth(attacker, 3, (iMaxHealth + iTotalHealth)); + SetEntProp(attacker, Prop_Data, "m_iHealth", iFinalHealth); + vScreenEffect(victim, attacker, g_esRegenCache[attacker].g_iRegenEffect, MT_ATTACK_CLAW); + + if (g_esRegenCache[attacker].g_iRegenMessage & MT_MESSAGE_MELEE) + { + char sTankName[64]; + MT_GetTankName(attacker, sTankName); + MT_PrintToChatAll("%s %t", MT_TAG2, "Regen3", sTankName, victim); + MT_LogMessage(MT_LOG_ABILITY, "%s %T", MT_TAG, "Regen3", LANG_SERVER, sTankName, victim); + } + } + + if (g_esRegenCache[attacker].g_iRegenMode == 2 || g_esRegenCache[attacker].g_iRegenMode == 3) + { + vRegen3(attacker, victim, damage, true); + } + } + } + else if (MT_IsTankSupported(victim) && MT_IsCustomTankSupported(victim) && !bIsPlayerIncapacitated(victim) && g_esRegenCache[victim].g_iRegenMode > 0 && GetRandomFloat(0.1, 100.0) <= g_esRegenCache[victim].g_flRegenChance && bIsSurvivor(attacker) && !bIsSurvivorDisabled(attacker) && (g_esRegenCache[victim].g_iRegenMode == 2 || g_esRegenCache[victim].g_iRegenMode == 3)) + { + if (bIsAreaNarrow(victim, g_esRegenCache[victim].g_flOpenAreasOnly) || bIsAreaWide(victim, g_esRegenCache[victim].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esRegenPlayer[victim].g_iTankType, victim) || (g_esRegenCache[victim].g_iRequiresHumans > 0 && iGetHumanCount() < g_esRegenCache[victim].g_iRequiresHumans) || (!MT_HasAdminAccess(victim) && !bHasAdminAccess(victim, g_esRegenAbility[g_esRegenPlayer[victim].g_iTankTypeRecorded].g_iAccessFlags, g_esRegenPlayer[victim].g_iAccessFlags)) || MT_IsAdminImmune(attacker, victim) || bIsAdminImmune(attacker, g_esRegenPlayer[victim].g_iTankType, g_esRegenAbility[g_esRegenPlayer[victim].g_iTankTypeRecorded].g_iImmunityFlags, g_esRegenPlayer[attacker].g_iImmunityFlags)) + { + return Plugin_Continue; + } + + if (!bIsInfected(victim, MT_CHECK_FAKECLIENT) || g_esRegenCache[victim].g_iHumanAbility == 1) + { + if (damagetype & DMG_BULLET) + { + damage /= 20.0; + } + else if ((damagetype & DMG_BLAST) || (damagetype & DMG_BLAST_SURFACE) || (damagetype & DMG_AIRBOAT) || (damagetype & DMG_PLASMA)) + { + damage /= 20.0; + } + else if ((damagetype & DMG_BURN) || (damagetype & DMG_DIRECT)) + { + damage /= 200.0; + } + else if ((damagetype & DMG_CRUSH) && bIsValidEntity(inflictor) && HasEntProp(inflictor, Prop_Send, "m_isCarryable")) + { + damage /= 20.0; + } + else if ((damagetype & DMG_SLASH) || (damagetype & DMG_CLUB)) + { + damage /= 200.0; + } + + vRegen3(attacker, victim, damage, false); + } + } + } + + return Plugin_Continue; +} + #if defined MT_ABILITIES_MAIN2 void vRegenPluginCheck(ArrayList list) #else @@ -509,15 +637,18 @@ public void MT_OnConfigsLoad(int mode) g_esRegenAbility[iIndex].g_flOpenAreasOnly = 0.0; g_esRegenAbility[iIndex].g_iRequiresHumans = 0; g_esRegenAbility[iIndex].g_iRegenAbility = 0; + g_esRegenAbility[iIndex].g_iRegenEffect = 0; g_esRegenAbility[iIndex].g_iRegenMessage = 0; g_esRegenAbility[iIndex].g_flRegenChance = 33.3; g_esRegenAbility[iIndex].g_iRegenCooldown = 0; g_esRegenAbility[iIndex].g_iRegenDuration = 0; g_esRegenAbility[iIndex].g_iRegenHealth = 1; + g_esRegenAbility[iIndex].g_flRegenHealthMultiplier = 1.0; g_esRegenAbility[iIndex].g_flRegenInterval = 1.0; - g_esRegenAbility[iIndex].g_iRegenLeech = 0; - g_esRegenAbility[iIndex].g_flRegenLeechRange = 500.0; g_esRegenAbility[iIndex].g_iRegenLimit = MT_MAXHEALTH; + g_esRegenAbility[iIndex].g_iRegenMaxHealth = 100; + g_esRegenAbility[iIndex].g_iRegenMode = 0; + g_esRegenAbility[iIndex].g_flRegenRange = 150.0; g_esRegenAbility[iIndex].g_iRegenSight = 0; g_esRegenSpecial[iIndex].g_iComboAbility = -1; @@ -529,15 +660,18 @@ public void MT_OnConfigsLoad(int mode) g_esRegenSpecial[iIndex].g_flOpenAreasOnly = -1.0; g_esRegenSpecial[iIndex].g_iRequiresHumans = -1; g_esRegenSpecial[iIndex].g_iRegenAbility = -1; + g_esRegenSpecial[iIndex].g_iRegenEffect = -1; g_esRegenSpecial[iIndex].g_iRegenMessage = -1; g_esRegenSpecial[iIndex].g_flRegenChance = -1.0; g_esRegenSpecial[iIndex].g_iRegenCooldown = -1; g_esRegenSpecial[iIndex].g_iRegenDuration = -1; g_esRegenSpecial[iIndex].g_iRegenHealth = -1; + g_esRegenSpecial[iIndex].g_flRegenHealthMultiplier = -1.0; g_esRegenSpecial[iIndex].g_flRegenInterval = -1.0; - g_esRegenSpecial[iIndex].g_iRegenLeech = -1; - g_esRegenSpecial[iIndex].g_flRegenLeechRange = -1.0; g_esRegenSpecial[iIndex].g_iRegenLimit = -1; + g_esRegenSpecial[iIndex].g_iRegenMaxHealth = -1; + g_esRegenSpecial[iIndex].g_iRegenMode = -1; + g_esRegenSpecial[iIndex].g_flRegenRange = -1.0; g_esRegenSpecial[iIndex].g_iRegenSight = -1; } } @@ -557,15 +691,18 @@ public void MT_OnConfigsLoad(int mode) g_esRegenPlayer[iPlayer].g_flOpenAreasOnly = -1.0; g_esRegenPlayer[iPlayer].g_iRequiresHumans = -1; g_esRegenPlayer[iPlayer].g_iRegenAbility = -1; + g_esRegenPlayer[iPlayer].g_iRegenEffect = -1; g_esRegenPlayer[iPlayer].g_iRegenMessage = -1; g_esRegenPlayer[iPlayer].g_flRegenChance = -1.0; g_esRegenPlayer[iPlayer].g_iRegenCooldown = -1; g_esRegenPlayer[iPlayer].g_iRegenDuration = -1; g_esRegenPlayer[iPlayer].g_iRegenHealth = -1; + g_esRegenPlayer[iPlayer].g_flRegenHealthMultiplier = -1.0; g_esRegenPlayer[iPlayer].g_flRegenInterval = -1.0; - g_esRegenPlayer[iPlayer].g_iRegenLeech = -1; - g_esRegenPlayer[iPlayer].g_flRegenLeechRange = -1.0; g_esRegenPlayer[iPlayer].g_iRegenLimit = -1; + g_esRegenPlayer[iPlayer].g_iRegenMaxHealth = -1; + g_esRegenPlayer[iPlayer].g_iRegenMode = -1; + g_esRegenPlayer[iPlayer].g_flRegenRange = -1.0; g_esRegenPlayer[iPlayer].g_iRegenSight = -1; g_esRegenTeammate[iPlayer].g_flCloseAreasOnly = -1.0; @@ -578,15 +715,18 @@ public void MT_OnConfigsLoad(int mode) g_esRegenTeammate[iPlayer].g_flOpenAreasOnly = -1.0; g_esRegenTeammate[iPlayer].g_iRequiresHumans = -1; g_esRegenTeammate[iPlayer].g_iRegenAbility = -1; + g_esRegenTeammate[iPlayer].g_iRegenEffect = -1; g_esRegenTeammate[iPlayer].g_iRegenMessage = -1; g_esRegenTeammate[iPlayer].g_flRegenChance = -1.0; g_esRegenTeammate[iPlayer].g_iRegenCooldown = -1; g_esRegenTeammate[iPlayer].g_iRegenDuration = -1; g_esRegenTeammate[iPlayer].g_iRegenHealth = -1; + g_esRegenTeammate[iPlayer].g_flRegenHealthMultiplier = -1.0; g_esRegenTeammate[iPlayer].g_flRegenInterval = -1.0; - g_esRegenTeammate[iPlayer].g_iRegenLeech = -1; - g_esRegenTeammate[iPlayer].g_flRegenLeechRange = -1.0; g_esRegenTeammate[iPlayer].g_iRegenLimit = -1; + g_esRegenTeammate[iPlayer].g_iRegenMaxHealth = -1; + g_esRegenTeammate[iPlayer].g_iRegenMode = -1; + g_esRegenTeammate[iPlayer].g_flRegenRange = -1.0; g_esRegenTeammate[iPlayer].g_iRegenSight = -1; } } @@ -609,20 +749,23 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esRegenTeammate[admin].g_iHumanAmmo = iGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esRegenTeammate[admin].g_iHumanAmmo, value, -1, 99999); g_esRegenTeammate[admin].g_iHumanCooldown = iGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esRegenTeammate[admin].g_iHumanCooldown, value, -1, 99999); g_esRegenTeammate[admin].g_iHumanDuration = iGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esRegenTeammate[admin].g_iHumanDuration, value, -1, 99999); - g_esRegenTeammate[admin].g_iHumanMode = iGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esRegenTeammate[admin].g_iHumanMode, value, -1, 1); + g_esRegenTeammate[admin].g_iHumanMode = iGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esRegenTeammate[admin].g_iHumanMode, value, -1, 2); g_esRegenTeammate[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esRegenTeammate[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); g_esRegenTeammate[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esRegenTeammate[admin].g_iRequiresHumans, value, -1, 32); g_esRegenTeammate[admin].g_iRegenAbility = iGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esRegenTeammate[admin].g_iRegenAbility, value, -1, 1); - g_esRegenTeammate[admin].g_iRegenMessage = iGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esRegenTeammate[admin].g_iRegenMessage, value, -1, 1); + g_esRegenTeammate[admin].g_iRegenEffect = iGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "AbilityEffect", "Ability Effect", "Ability_Effect", "effect", g_esRegenTeammate[admin].g_iRegenEffect, value, -1, 7); + g_esRegenTeammate[admin].g_iRegenMessage = iGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esRegenTeammate[admin].g_iRegenMessage, value, -1, 7); g_esRegenTeammate[admin].g_iRegenSight = iGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "AbilitySight", "Ability Sight", "Ability_Sight", "sight", g_esRegenTeammate[admin].g_iRegenSight, value, -1, 5); g_esRegenTeammate[admin].g_flRegenChance = flGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "RegenChance", "Regen Chance", "Regen_Chance", "chance", g_esRegenTeammate[admin].g_flRegenChance, value, -1.0, 100.0); g_esRegenTeammate[admin].g_iRegenCooldown = iGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "RegenCooldown", "Regen Cooldown", "Regen_Cooldown", "cooldown", g_esRegenTeammate[admin].g_iRegenCooldown, value, -1, 99999); g_esRegenTeammate[admin].g_iRegenDuration = iGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "RegenDuration", "Regen Duration", "Regen_Duration", "duration", g_esRegenTeammate[admin].g_iRegenDuration, value, -1, 99999); g_esRegenTeammate[admin].g_iRegenHealth = iGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "RegenHealth", "Regen Health", "Regen_Health", "health", g_esRegenTeammate[admin].g_iRegenHealth, value, MT_MAX_HEALTH_REDUCTION, MT_MAXHEALTH); + g_esRegenTeammate[admin].g_flRegenHealthMultiplier = flGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "RegenHealthMultiplier", "Regen Health Multiplier", "Regen_Health_Multiplier", "hpmulti", g_esRegenTeammate[admin].g_flRegenHealthMultiplier, value, -1.0, 99999.0); g_esRegenTeammate[admin].g_flRegenInterval = flGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "RegenInterval", "Regen Interval", "Regen_Interval", "interval", g_esRegenTeammate[admin].g_flRegenInterval, value, -1.0, 99999.0); - g_esRegenTeammate[admin].g_iRegenLeech = iGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "RegenLeech", "Regen Leech", "Regen_Leech", "leech", g_esRegenTeammate[admin].g_iRegenLeech, value, MT_MAX_HEALTH_REDUCTION, MT_MAXHEALTH); - g_esRegenTeammate[admin].g_flRegenLeechRange = flGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "RegenLeechRange", "Regen Leech Range", "Regen_Leech_Range", "leechrange", g_esRegenTeammate[admin].g_flRegenLeechRange, value, -1.0, 99999.0); g_esRegenTeammate[admin].g_iRegenLimit = iGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "RegenLimit", "Regen Limit", "Regen_Limit", "limit", g_esRegenTeammate[admin].g_iRegenLimit, value, -1, MT_MAXHEALTH); + g_esRegenTeammate[admin].g_iRegenMaxHealth = iGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "RegenMaxHealth", "Regen Max Health", "Regen_Max_Health", "maxhealth", g_esRegenTeammate[admin].g_iRegenMaxHealth, value, -1, MT_MAXHEALTH); + g_esRegenTeammate[admin].g_iRegenMode = iGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "RegenMode", "Regen Mode", "Regen_Mode", "mode", g_esRegenTeammate[admin].g_iRegenMode, value, -1, 3); + g_esRegenTeammate[admin].g_flRegenRange = flGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "RegenRange", "Regen Range", "Regen_Range", "range", g_esRegenTeammate[admin].g_flRegenRange, value, -1.0, 99999.0); } else { @@ -632,20 +775,23 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esRegenPlayer[admin].g_iHumanAmmo = iGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esRegenPlayer[admin].g_iHumanAmmo, value, -1, 99999); g_esRegenPlayer[admin].g_iHumanCooldown = iGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esRegenPlayer[admin].g_iHumanCooldown, value, -1, 99999); g_esRegenPlayer[admin].g_iHumanDuration = iGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esRegenPlayer[admin].g_iHumanDuration, value, -1, 99999); - g_esRegenPlayer[admin].g_iHumanMode = iGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esRegenPlayer[admin].g_iHumanMode, value, -1, 1); + g_esRegenPlayer[admin].g_iHumanMode = iGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esRegenPlayer[admin].g_iHumanMode, value, -1, 2); g_esRegenPlayer[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esRegenPlayer[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); g_esRegenPlayer[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esRegenPlayer[admin].g_iRequiresHumans, value, -1, 32); g_esRegenPlayer[admin].g_iRegenAbility = iGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esRegenPlayer[admin].g_iRegenAbility, value, -1, 1); - g_esRegenPlayer[admin].g_iRegenMessage = iGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esRegenPlayer[admin].g_iRegenMessage, value, -1, 1); + g_esRegenPlayer[admin].g_iRegenEffect = iGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "AbilityEffect", "Ability Effect", "Ability_Effect", "effect", g_esRegenPlayer[admin].g_iRegenEffect, value, -1, 7); + g_esRegenPlayer[admin].g_iRegenMessage = iGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esRegenPlayer[admin].g_iRegenMessage, value, -1, 7); g_esRegenPlayer[admin].g_iRegenSight = iGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "AbilitySight", "Ability Sight", "Ability_Sight", "sight", g_esRegenPlayer[admin].g_iRegenSight, value, -1, 5); g_esRegenPlayer[admin].g_flRegenChance = flGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "RegenChance", "Regen Chance", "Regen_Chance", "chance", g_esRegenPlayer[admin].g_flRegenChance, value, -1.0, 100.0); g_esRegenPlayer[admin].g_iRegenCooldown = iGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "RegenCooldown", "Regen Cooldown", "Regen_Cooldown", "cooldown", g_esRegenPlayer[admin].g_iRegenCooldown, value, -1, 99999); g_esRegenPlayer[admin].g_iRegenDuration = iGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "RegenDuration", "Regen Duration", "Regen_Duration", "duration", g_esRegenPlayer[admin].g_iRegenDuration, value, -1, 99999); g_esRegenPlayer[admin].g_iRegenHealth = iGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "RegenHealth", "Regen Health", "Regen_Health", "health", g_esRegenPlayer[admin].g_iRegenHealth, value, MT_MAX_HEALTH_REDUCTION, MT_MAXHEALTH); + g_esRegenPlayer[admin].g_flRegenHealthMultiplier = flGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "RegenHealthMultiplier", "Regen Health Multiplier", "Regen_Health_Multiplier", "hpmulti", g_esRegenPlayer[admin].g_flRegenHealthMultiplier, value, -1.0, 99999.0); g_esRegenPlayer[admin].g_flRegenInterval = flGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "RegenInterval", "Regen Interval", "Regen_Interval", "interval", g_esRegenPlayer[admin].g_flRegenInterval, value, -1.0, 99999.0); - g_esRegenPlayer[admin].g_iRegenLeech = iGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "RegenLeech", "Regen Leech", "Regen_Leech", "leech", g_esRegenPlayer[admin].g_iRegenLeech, value, MT_MAX_HEALTH_REDUCTION, MT_MAXHEALTH); - g_esRegenPlayer[admin].g_flRegenLeechRange = flGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "RegenLeechRange", "Regen Leech Range", "Regen_Leech_Range", "leechrange", g_esRegenPlayer[admin].g_flRegenLeechRange, value, -1.0, 99999.0); g_esRegenPlayer[admin].g_iRegenLimit = iGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "RegenLimit", "Regen Limit", "Regen_Limit", "limit", g_esRegenPlayer[admin].g_iRegenLimit, value, -1, MT_MAXHEALTH); + g_esRegenPlayer[admin].g_iRegenMaxHealth = iGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "RegenMaxHealth", "Regen Max Health", "Regen_Max_Health", "maxhealth", g_esRegenPlayer[admin].g_iRegenMaxHealth, value, -1, MT_MAXHEALTH); + g_esRegenPlayer[admin].g_iRegenMode = iGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "RegenMode", "Regen Mode", "Regen_Mode", "mode", g_esRegenPlayer[admin].g_iRegenMode, value, -1, 3); + g_esRegenPlayer[admin].g_flRegenRange = flGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "RegenRange", "Regen Range", "Regen_Range", "range", g_esRegenPlayer[admin].g_flRegenRange, value, -1.0, 99999.0); g_esRegenPlayer[admin].g_iAccessFlags = iGetAdminFlagsValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "AccessFlags", "Access Flags", "Access_Flags", "access", value); g_esRegenPlayer[admin].g_iImmunityFlags = iGetAdminFlagsValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "ImmunityFlags", "Immunity Flags", "Immunity_Flags", "access", value); } @@ -661,20 +807,23 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esRegenSpecial[type].g_iHumanAmmo = iGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esRegenSpecial[type].g_iHumanAmmo, value, -1, 99999); g_esRegenSpecial[type].g_iHumanCooldown = iGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esRegenSpecial[type].g_iHumanCooldown, value, -1, 99999); g_esRegenSpecial[type].g_iHumanDuration = iGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esRegenSpecial[type].g_iHumanDuration, value, -1, 99999); - g_esRegenSpecial[type].g_iHumanMode = iGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esRegenSpecial[type].g_iHumanMode, value, -1, 1); + g_esRegenSpecial[type].g_iHumanMode = iGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esRegenSpecial[type].g_iHumanMode, value, -1, 2); g_esRegenSpecial[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esRegenSpecial[type].g_flOpenAreasOnly, value, -1.0, 99999.0); g_esRegenSpecial[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esRegenSpecial[type].g_iRequiresHumans, value, -1, 32); g_esRegenSpecial[type].g_iRegenAbility = iGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esRegenSpecial[type].g_iRegenAbility, value, -1, 1); - g_esRegenSpecial[type].g_iRegenMessage = iGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esRegenSpecial[type].g_iRegenMessage, value, -1, 1); + g_esRegenSpecial[type].g_iRegenEffect = iGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "AbilityEffect", "Ability Effect", "Ability_Effect", "effect", g_esRegenSpecial[type].g_iRegenEffect, value, -1, 7); + g_esRegenSpecial[type].g_iRegenMessage = iGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esRegenSpecial[type].g_iRegenMessage, value, -1, 7); g_esRegenSpecial[type].g_iRegenSight = iGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "AbilitySight", "Ability Sight", "Ability_Sight", "sight", g_esRegenSpecial[type].g_iRegenSight, value, -1, 5); g_esRegenSpecial[type].g_flRegenChance = flGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "RegenChance", "Regen Chance", "Regen_Chance", "chance", g_esRegenSpecial[type].g_flRegenChance, value, -1.0, 100.0); g_esRegenSpecial[type].g_iRegenCooldown = iGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "RegenCooldown", "Regen Cooldown", "Regen_Cooldown", "cooldown", g_esRegenSpecial[type].g_iRegenCooldown, value, -1, 99999); g_esRegenSpecial[type].g_iRegenDuration = iGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "RegenDuration", "Regen Duration", "Regen_Duration", "duration", g_esRegenSpecial[type].g_iRegenDuration, value, -1, 99999); g_esRegenSpecial[type].g_iRegenHealth = iGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "RegenHealth", "Regen Health", "Regen_Health", "health", g_esRegenSpecial[type].g_iRegenHealth, value, MT_MAX_HEALTH_REDUCTION, MT_MAXHEALTH); + g_esRegenSpecial[type].g_flRegenHealthMultiplier = flGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "RegenHealthMultiplier", "Regen Health Multiplier", "Regen_Health_Multiplier", "hpmulti", g_esRegenSpecial[type].g_flRegenHealthMultiplier, value, -1.0, 99999.0); g_esRegenSpecial[type].g_flRegenInterval = flGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "RegenInterval", "Regen Interval", "Regen_Interval", "interval", g_esRegenSpecial[type].g_flRegenInterval, value, -1.0, 99999.0); - g_esRegenSpecial[type].g_iRegenLeech = iGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "RegenLeech", "Regen Leech", "Regen_Leech", "leech", g_esRegenSpecial[type].g_iRegenLeech, value, MT_MAX_HEALTH_REDUCTION, MT_MAXHEALTH); - g_esRegenSpecial[type].g_flRegenLeechRange = flGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "RegenLeechRange", "Regen Leech Range", "Regen_Leech_Range", "leechrange", g_esRegenSpecial[type].g_flRegenLeechRange, value, -1.0, 99999.0); g_esRegenSpecial[type].g_iRegenLimit = iGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "RegenLimit", "Regen Limit", "Regen_Limit", "limit", g_esRegenSpecial[type].g_iRegenLimit, value, -1, MT_MAXHEALTH); + g_esRegenSpecial[type].g_iRegenMaxHealth = iGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "RegenMaxHealth", "Regen Max Health", "Regen_Max_Health", "maxhealth", g_esRegenSpecial[type].g_iRegenMaxHealth, value, -1, MT_MAXHEALTH); + g_esRegenSpecial[type].g_iRegenMode = iGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "RegenMode", "Regen Mode", "Regen_Mode", "mode", g_esRegenSpecial[type].g_iRegenMode, value, -1, 3); + g_esRegenSpecial[type].g_flRegenRange = flGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "RegenRange", "Regen Range", "Regen_Range", "range", g_esRegenSpecial[type].g_flRegenRange, value, -1.0, 99999.0); } else { @@ -684,20 +833,23 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esRegenAbility[type].g_iHumanAmmo = iGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esRegenAbility[type].g_iHumanAmmo, value, -1, 99999); g_esRegenAbility[type].g_iHumanCooldown = iGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esRegenAbility[type].g_iHumanCooldown, value, -1, 99999); g_esRegenAbility[type].g_iHumanDuration = iGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esRegenAbility[type].g_iHumanDuration, value, -1, 99999); - g_esRegenAbility[type].g_iHumanMode = iGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esRegenAbility[type].g_iHumanMode, value, -1, 1); + g_esRegenAbility[type].g_iHumanMode = iGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esRegenAbility[type].g_iHumanMode, value, -1, 2); g_esRegenAbility[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esRegenAbility[type].g_flOpenAreasOnly, value, -1.0, 99999.0); g_esRegenAbility[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esRegenAbility[type].g_iRequiresHumans, value, -1, 32); g_esRegenAbility[type].g_iRegenAbility = iGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esRegenAbility[type].g_iRegenAbility, value, -1, 1); - g_esRegenAbility[type].g_iRegenMessage = iGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esRegenAbility[type].g_iRegenMessage, value, -1, 1); + g_esRegenAbility[type].g_iRegenEffect = iGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "AbilityEffect", "Ability Effect", "Ability_Effect", "effect", g_esRegenAbility[type].g_iRegenEffect, value, -1, 7); + g_esRegenAbility[type].g_iRegenMessage = iGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esRegenAbility[type].g_iRegenMessage, value, -1, 7); g_esRegenAbility[type].g_iRegenSight = iGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "AbilitySight", "Ability Sight", "Ability_Sight", "sight", g_esRegenAbility[type].g_iRegenSight, value, -1, 5); g_esRegenAbility[type].g_flRegenChance = flGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "RegenChance", "Regen Chance", "Regen_Chance", "chance", g_esRegenAbility[type].g_flRegenChance, value, -1.0, 100.0); g_esRegenAbility[type].g_iRegenCooldown = iGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "RegenCooldown", "Regen Cooldown", "Regen_Cooldown", "cooldown", g_esRegenAbility[type].g_iRegenCooldown, value, -1, 99999); g_esRegenAbility[type].g_iRegenDuration = iGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "RegenDuration", "Regen Duration", "Regen_Duration", "duration", g_esRegenAbility[type].g_iRegenDuration, value, -1, 99999); g_esRegenAbility[type].g_iRegenHealth = iGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "RegenHealth", "Regen Health", "Regen_Health", "health", g_esRegenAbility[type].g_iRegenHealth, value, MT_MAX_HEALTH_REDUCTION, MT_MAXHEALTH); + g_esRegenAbility[type].g_flRegenHealthMultiplier = flGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "RegenHealthMultiplier", "Regen Health Multiplier", "Regen_Health_Multiplier", "hpmulti", g_esRegenAbility[type].g_flRegenHealthMultiplier, value, -1.0, 99999.0); g_esRegenAbility[type].g_flRegenInterval = flGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "RegenInterval", "Regen Interval", "Regen_Interval", "interval", g_esRegenAbility[type].g_flRegenInterval, value, -1.0, 99999.0); - g_esRegenAbility[type].g_iRegenLeech = iGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "RegenLeech", "Regen Leech", "Regen_Leech", "leech", g_esRegenAbility[type].g_iRegenLeech, value, MT_MAX_HEALTH_REDUCTION, MT_MAXHEALTH); - g_esRegenAbility[type].g_flRegenLeechRange = flGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "RegenLeechRange", "Regen Leech Range", "Regen_Leech_Range", "leechrange", g_esRegenAbility[type].g_flRegenLeechRange, value, -1.0, 99999.0); g_esRegenAbility[type].g_iRegenLimit = iGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "RegenLimit", "Regen Limit", "Regen_Limit", "limit", g_esRegenAbility[type].g_iRegenLimit, value, -1, MT_MAXHEALTH); + g_esRegenAbility[type].g_iRegenMaxHealth = iGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "RegenMaxHealth", "Regen Max Health", "Regen_Max_Health", "maxhealth", g_esRegenAbility[type].g_iRegenMaxHealth, value, -1, MT_MAXHEALTH); + g_esRegenAbility[type].g_iRegenMode = iGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "RegenMode", "Regen Mode", "Regen_Mode", "mode", g_esRegenAbility[type].g_iRegenMode, value, -1, 3); + g_esRegenAbility[type].g_flRegenRange = flGetKeyValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "RegenRange", "Regen Range", "Regen_Range", "range", g_esRegenAbility[type].g_flRegenRange, value, -1.0, 99999.0); g_esRegenAbility[type].g_iAccessFlags = iGetAdminFlagsValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "AccessFlags", "Access Flags", "Access_Flags", "access", value); g_esRegenAbility[type].g_iImmunityFlags = iGetAdminFlagsValue(subsection, MT_REGEN_SECTION, MT_REGEN_SECTION2, MT_REGEN_SECTION3, MT_REGEN_SECTION4, key, "ImmunityFlags", "Immunity Flags", "Immunity_Flags", "access", value); } @@ -714,14 +866,17 @@ public void MT_OnSettingsCached(int tank, bool apply, int type) g_esRegenPlayer[tank].g_iTankTypeRecorded = apply ? MT_GetRecordedTankType(tank, type) : 0; g_esRegenPlayer[tank].g_iTankType = apply ? type : 0; int iType = g_esRegenPlayer[tank].g_iTankTypeRecorded; - +#if !defined MT_ABILITIES_MAIN2 + g_iGraphicsLevel = MT_GetGraphicsLevel(); +#endif if (bIsSpecialInfected(tank, MT_CHECK_INDEX|MT_CHECK_INGAME)) { g_esRegenCache[tank].g_flCloseAreasOnly = flGetSubSettingValue(apply, bHuman, g_esRegenTeammate[tank].g_flCloseAreasOnly, g_esRegenPlayer[tank].g_flCloseAreasOnly, g_esRegenSpecial[iType].g_flCloseAreasOnly, g_esRegenAbility[iType].g_flCloseAreasOnly, 1); g_esRegenCache[tank].g_iComboAbility = iGetSubSettingValue(apply, bHuman, g_esRegenTeammate[tank].g_iComboAbility, g_esRegenPlayer[tank].g_iComboAbility, g_esRegenSpecial[iType].g_iComboAbility, g_esRegenAbility[iType].g_iComboAbility, 1); g_esRegenCache[tank].g_flRegenChance = flGetSubSettingValue(apply, bHuman, g_esRegenTeammate[tank].g_flRegenChance, g_esRegenPlayer[tank].g_flRegenChance, g_esRegenSpecial[iType].g_flRegenChance, g_esRegenAbility[iType].g_flRegenChance, 1); + g_esRegenCache[tank].g_flRegenHealthMultiplier = flGetSubSettingValue(apply, bHuman, g_esRegenTeammate[tank].g_flRegenHealthMultiplier, g_esRegenPlayer[tank].g_flRegenHealthMultiplier, g_esRegenSpecial[iType].g_flRegenHealthMultiplier, g_esRegenAbility[iType].g_flRegenHealthMultiplier, 1); g_esRegenCache[tank].g_flRegenInterval = flGetSubSettingValue(apply, bHuman, g_esRegenTeammate[tank].g_flRegenInterval, g_esRegenPlayer[tank].g_flRegenInterval, g_esRegenSpecial[iType].g_flRegenInterval, g_esRegenAbility[iType].g_flRegenInterval, 1); - g_esRegenCache[tank].g_flRegenLeechRange = flGetSubSettingValue(apply, bHuman, g_esRegenTeammate[tank].g_flRegenLeechRange, g_esRegenPlayer[tank].g_flRegenLeechRange, g_esRegenSpecial[iType].g_flRegenLeechRange, g_esRegenAbility[iType].g_flRegenLeechRange, 1); + g_esRegenCache[tank].g_flRegenRange = flGetSubSettingValue(apply, bHuman, g_esRegenTeammate[tank].g_flRegenRange, g_esRegenPlayer[tank].g_flRegenRange, g_esRegenSpecial[iType].g_flRegenRange, g_esRegenAbility[iType].g_flRegenRange, 1); g_esRegenCache[tank].g_iHumanAbility = iGetSubSettingValue(apply, bHuman, g_esRegenTeammate[tank].g_iHumanAbility, g_esRegenPlayer[tank].g_iHumanAbility, g_esRegenSpecial[iType].g_iHumanAbility, g_esRegenAbility[iType].g_iHumanAbility, 1); g_esRegenCache[tank].g_iHumanAmmo = iGetSubSettingValue(apply, bHuman, g_esRegenTeammate[tank].g_iHumanAmmo, g_esRegenPlayer[tank].g_iHumanAmmo, g_esRegenSpecial[iType].g_iHumanAmmo, g_esRegenAbility[iType].g_iHumanAmmo, 1); g_esRegenCache[tank].g_iHumanCooldown = iGetSubSettingValue(apply, bHuman, g_esRegenTeammate[tank].g_iHumanCooldown, g_esRegenPlayer[tank].g_iHumanCooldown, g_esRegenSpecial[iType].g_iHumanCooldown, g_esRegenAbility[iType].g_iHumanCooldown, 1); @@ -730,10 +885,11 @@ public void MT_OnSettingsCached(int tank, bool apply, int type) g_esRegenCache[tank].g_iRegenAbility = iGetSubSettingValue(apply, bHuman, g_esRegenTeammate[tank].g_iRegenAbility, g_esRegenPlayer[tank].g_iRegenAbility, g_esRegenSpecial[iType].g_iRegenAbility, g_esRegenAbility[iType].g_iRegenAbility, 1); g_esRegenCache[tank].g_iRegenCooldown = iGetSubSettingValue(apply, bHuman, g_esRegenTeammate[tank].g_iRegenCooldown, g_esRegenPlayer[tank].g_iRegenCooldown, g_esRegenSpecial[iType].g_iRegenCooldown, g_esRegenAbility[iType].g_iRegenCooldown, 1); g_esRegenCache[tank].g_iRegenDuration = iGetSubSettingValue(apply, bHuman, g_esRegenTeammate[tank].g_iRegenDuration, g_esRegenPlayer[tank].g_iRegenDuration, g_esRegenSpecial[iType].g_iRegenDuration, g_esRegenAbility[iType].g_iRegenDuration, 1); + g_esRegenCache[tank].g_iRegenEffect = iGetSubSettingValue(apply, bHuman, g_esRegenTeammate[tank].g_iRegenEffect, g_esRegenPlayer[tank].g_iRegenEffect, g_esRegenSpecial[iType].g_iRegenEffect, g_esRegenAbility[iType].g_iRegenEffect, 1); g_esRegenCache[tank].g_iRegenHealth = iGetSubSettingValue(apply, bHuman, g_esRegenTeammate[tank].g_iRegenHealth, g_esRegenPlayer[tank].g_iRegenHealth, g_esRegenSpecial[iType].g_iRegenHealth, g_esRegenAbility[iType].g_iRegenHealth, 2, -1); - g_esRegenCache[tank].g_iRegenLeech = iGetSubSettingValue(apply, bHuman, g_esRegenTeammate[tank].g_iRegenLeech, g_esRegenPlayer[tank].g_iRegenLeech, g_esRegenSpecial[iType].g_iRegenLeech, g_esRegenAbility[iType].g_iRegenLeech, 2, -1); g_esRegenCache[tank].g_iRegenLimit = iGetSubSettingValue(apply, bHuman, g_esRegenTeammate[tank].g_iRegenLimit, g_esRegenPlayer[tank].g_iRegenLimit, g_esRegenSpecial[iType].g_iRegenLimit, g_esRegenAbility[iType].g_iRegenLimit, 1); g_esRegenCache[tank].g_iRegenMessage = iGetSubSettingValue(apply, bHuman, g_esRegenTeammate[tank].g_iRegenMessage, g_esRegenPlayer[tank].g_iRegenMessage, g_esRegenSpecial[iType].g_iRegenMessage, g_esRegenAbility[iType].g_iRegenMessage, 1); + g_esRegenCache[tank].g_iRegenMode = iGetSubSettingValue(apply, bHuman, g_esRegenTeammate[tank].g_iRegenMode, g_esRegenPlayer[tank].g_iRegenMode, g_esRegenSpecial[iType].g_iRegenMode, g_esRegenAbility[iType].g_iRegenMode, 1); g_esRegenCache[tank].g_iRegenSight = iGetSubSettingValue(apply, bHuman, g_esRegenTeammate[tank].g_iRegenSight, g_esRegenPlayer[tank].g_iRegenSight, g_esRegenSpecial[iType].g_iRegenSight, g_esRegenAbility[iType].g_iRegenSight, 1); g_esRegenCache[tank].g_flOpenAreasOnly = flGetSubSettingValue(apply, bHuman, g_esRegenTeammate[tank].g_flOpenAreasOnly, g_esRegenPlayer[tank].g_flOpenAreasOnly, g_esRegenSpecial[iType].g_flOpenAreasOnly, g_esRegenAbility[iType].g_flOpenAreasOnly, 1); g_esRegenCache[tank].g_iRequiresHumans = iGetSubSettingValue(apply, bHuman, g_esRegenTeammate[tank].g_iRequiresHumans, g_esRegenPlayer[tank].g_iRequiresHumans, g_esRegenSpecial[iType].g_iRequiresHumans, g_esRegenAbility[iType].g_iRequiresHumans, 1); @@ -743,8 +899,9 @@ public void MT_OnSettingsCached(int tank, bool apply, int type) g_esRegenCache[tank].g_flCloseAreasOnly = flGetSettingValue(apply, bHuman, g_esRegenPlayer[tank].g_flCloseAreasOnly, g_esRegenAbility[iType].g_flCloseAreasOnly, 1); g_esRegenCache[tank].g_iComboAbility = iGetSettingValue(apply, bHuman, g_esRegenPlayer[tank].g_iComboAbility, g_esRegenAbility[iType].g_iComboAbility, 1); g_esRegenCache[tank].g_flRegenChance = flGetSettingValue(apply, bHuman, g_esRegenPlayer[tank].g_flRegenChance, g_esRegenAbility[iType].g_flRegenChance, 1); + g_esRegenCache[tank].g_flRegenHealthMultiplier = flGetSettingValue(apply, bHuman, g_esRegenPlayer[tank].g_flRegenHealthMultiplier, g_esRegenAbility[iType].g_flRegenHealthMultiplier, 1); g_esRegenCache[tank].g_flRegenInterval = flGetSettingValue(apply, bHuman, g_esRegenPlayer[tank].g_flRegenInterval, g_esRegenAbility[iType].g_flRegenInterval, 1); - g_esRegenCache[tank].g_flRegenLeechRange = flGetSettingValue(apply, bHuman, g_esRegenPlayer[tank].g_flRegenLeechRange, g_esRegenAbility[iType].g_flRegenLeechRange, 1); + g_esRegenCache[tank].g_flRegenRange = flGetSettingValue(apply, bHuman, g_esRegenPlayer[tank].g_flRegenRange, g_esRegenAbility[iType].g_flRegenRange, 1); g_esRegenCache[tank].g_iHumanAbility = iGetSettingValue(apply, bHuman, g_esRegenPlayer[tank].g_iHumanAbility, g_esRegenAbility[iType].g_iHumanAbility, 1); g_esRegenCache[tank].g_iHumanAmmo = iGetSettingValue(apply, bHuman, g_esRegenPlayer[tank].g_iHumanAmmo, g_esRegenAbility[iType].g_iHumanAmmo, 1); g_esRegenCache[tank].g_iHumanCooldown = iGetSettingValue(apply, bHuman, g_esRegenPlayer[tank].g_iHumanCooldown, g_esRegenAbility[iType].g_iHumanCooldown, 1); @@ -753,10 +910,11 @@ public void MT_OnSettingsCached(int tank, bool apply, int type) g_esRegenCache[tank].g_iRegenAbility = iGetSettingValue(apply, bHuman, g_esRegenPlayer[tank].g_iRegenAbility, g_esRegenAbility[iType].g_iRegenAbility, 1); g_esRegenCache[tank].g_iRegenCooldown = iGetSettingValue(apply, bHuman, g_esRegenPlayer[tank].g_iRegenCooldown, g_esRegenAbility[iType].g_iRegenCooldown, 1); g_esRegenCache[tank].g_iRegenDuration = iGetSettingValue(apply, bHuman, g_esRegenPlayer[tank].g_iRegenDuration, g_esRegenAbility[iType].g_iRegenDuration, 1); + g_esRegenCache[tank].g_iRegenEffect = iGetSettingValue(apply, bHuman, g_esRegenPlayer[tank].g_iRegenEffect, g_esRegenAbility[iType].g_iRegenEffect, 1); g_esRegenCache[tank].g_iRegenHealth = iGetSettingValue(apply, bHuman, g_esRegenPlayer[tank].g_iRegenHealth, g_esRegenAbility[iType].g_iRegenHealth, 2, -1); - g_esRegenCache[tank].g_iRegenLeech = iGetSettingValue(apply, bHuman, g_esRegenPlayer[tank].g_iRegenLeech, g_esRegenAbility[iType].g_iRegenLeech, 2, -1); g_esRegenCache[tank].g_iRegenLimit = iGetSettingValue(apply, bHuman, g_esRegenPlayer[tank].g_iRegenLimit, g_esRegenAbility[iType].g_iRegenLimit, 1); g_esRegenCache[tank].g_iRegenMessage = iGetSettingValue(apply, bHuman, g_esRegenPlayer[tank].g_iRegenMessage, g_esRegenAbility[iType].g_iRegenMessage, 1); + g_esRegenCache[tank].g_iRegenMode = iGetSettingValue(apply, bHuman, g_esRegenPlayer[tank].g_iRegenMode, g_esRegenAbility[iType].g_iRegenMode, 1); g_esRegenCache[tank].g_iRegenSight = iGetSettingValue(apply, bHuman, g_esRegenPlayer[tank].g_iRegenSight, g_esRegenAbility[iType].g_iRegenSight, 1); g_esRegenCache[tank].g_flOpenAreasOnly = flGetSettingValue(apply, bHuman, g_esRegenPlayer[tank].g_flOpenAreasOnly, g_esRegenAbility[iType].g_flOpenAreasOnly, 1); g_esRegenCache[tank].g_iRequiresHumans = iGetSettingValue(apply, bHuman, g_esRegenPlayer[tank].g_iRequiresHumans, g_esRegenAbility[iType].g_iRequiresHumans, 1); @@ -856,10 +1014,10 @@ public void MT_OnButtonPressed(int tank, int button) if ((button & MT_MAIN_KEY) && g_esRegenCache[tank].g_iRegenAbility == 1 && g_esRegenCache[tank].g_iHumanAbility == 1) { - int iTime = GetTime(); + int iHumanMode = g_esRegenCache[tank].g_iHumanMode, iTime = GetTime(); bool bRecharging = g_esRegenPlayer[tank].g_iCooldown != -1 && g_esRegenPlayer[tank].g_iCooldown >= iTime; - switch (g_esRegenCache[tank].g_iHumanMode) + switch (iHumanMode) { case 0: { @@ -876,9 +1034,9 @@ public void MT_OnButtonPressed(int tank, int button) MT_PrintToChat(tank, "%s %t", MT_TAG3, "RegenHuman4", (g_esRegenPlayer[tank].g_iCooldown - iTime)); } } - case 1: + case 1, 2: { - if (g_esRegenPlayer[tank].g_iAmmoCount < g_esRegenCache[tank].g_iHumanAmmo && g_esRegenCache[tank].g_iHumanAmmo > 0) + if ((iHumanMode == 2 && g_esRegenPlayer[tank].g_bActivated) || (g_esRegenPlayer[tank].g_iAmmoCount < g_esRegenCache[tank].g_iHumanAmmo && g_esRegenCache[tank].g_iHumanAmmo > 0)) { if (!g_esRegenPlayer[tank].g_bActivated && !bRecharging) { @@ -890,7 +1048,15 @@ public void MT_OnButtonPressed(int tank, int button) } else if (g_esRegenPlayer[tank].g_bActivated) { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "RegenHuman3"); + switch (iHumanMode) + { + case 1: MT_PrintToChat(tank, "%s %t", MT_TAG3, "RegenHuman3"); + case 2: + { + vRegenReset2(tank); + vRegenReset3(tank); + } + } } else if (bRecharging) { @@ -955,7 +1121,7 @@ void vRegen(int tank, int pos = -1) vRegen2(tank, pos); - if (g_esRegenCache[tank].g_iRegenMessage == 1) + if (g_esRegenCache[tank].g_iRegenMessage & MT_MESSAGE_RANGE) { char sTankName[64]; MT_GetTankName(tank, sTankName); @@ -983,6 +1149,49 @@ void vRegen2(int tank, int pos = -1) } } +void vRegen3(int attacker, int victim, float damage, bool tank) +{ + int iTank = tank ? attacker : victim, + iDamage = (damage < 1.0) ? 1 : RoundToNearest(damage), + iHealth = GetEntProp(attacker, Prop_Data, "m_iHealth"), + iMaxHealth = tank ? MT_MAXHEALTH : g_esRegenCache[iTank].g_iRegenMaxHealth, + iNewHealth = (iHealth + iDamage), iLeftover = 0, iFinalHealth = 0, iTotalHealth = 0; + iMaxHealth = (!tank && g_esRegenCache[iTank].g_iRegenMaxHealth == 0) ? GetEntProp(attacker, Prop_Data, "m_iMaxHealth") : iMaxHealth; + iLeftover = (iNewHealth > iMaxHealth) ? (iNewHealth - iMaxHealth) : iNewHealth; + iFinalHealth = iClamp(iNewHealth, 1, iMaxHealth); + iTotalHealth = (iNewHealth > iMaxHealth) ? iLeftover : iDamage; + SetEntProp(attacker, Prop_Data, "m_iHealth", iFinalHealth); + + if (tank) + { + MT_TankMaxHealth(attacker, 3, (MT_TankMaxHealth(attacker, 1) + iTotalHealth)); + } + + int iSurvivor = tank ? victim : attacker, iFlag = tank ? MT_ATTACK_CLAW : MT_ATTACK_MELEE; + vScreenEffect(iSurvivor, iTank, g_esRegenCache[iTank].g_iRegenEffect, iFlag); + + iFlag = tank ? MT_MESSAGE_MELEE : MT_MESSAGE_RANGE; + if (g_esRegenCache[iTank].g_iRegenMessage & iFlag) + { + char sTankName[64]; + MT_GetTankName(iTank, sTankName); + + switch (tank) + { + case true: + { + MT_PrintToChatAll("%s %t", MT_TAG2, "Regen3", sTankName, victim); + MT_LogMessage(MT_LOG_ABILITY, "%s %T", MT_TAG, "Regen3", LANG_SERVER, sTankName, victim); + } + case false: + { + MT_PrintToChatAll("%s %t", MT_TAG2, "Regen4", attacker, sTankName); + MT_LogMessage(MT_LOG_ABILITY, "%s %T", MT_TAG, "Regen4", LANG_SERVER, attacker, sTankName); + } + } + } +} + void vRegenAbility(int tank) { if ((g_esRegenPlayer[tank].g_iCooldown != -1 && g_esRegenPlayer[tank].g_iCooldown >= GetTime()) || bIsAreaNarrow(tank, g_esRegenCache[tank].g_flOpenAreasOnly) || bIsAreaWide(tank, g_esRegenCache[tank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esRegenPlayer[tank].g_iTankType, tank) || (g_esRegenCache[tank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esRegenCache[tank].g_iRequiresHumans) || (!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esRegenAbility[g_esRegenPlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esRegenPlayer[tank].g_iAccessFlags))) @@ -992,14 +1201,7 @@ void vRegenAbility(int tank) if (!bIsInfected(tank, MT_CHECK_FAKECLIENT) || (g_esRegenPlayer[tank].g_iAmmoCount < g_esRegenCache[tank].g_iHumanAmmo && g_esRegenCache[tank].g_iHumanAmmo > 0)) { - if (GetRandomFloat(0.1, 100.0) <= g_esRegenCache[tank].g_flRegenChance) - { - vRegen(tank); - } - else if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esRegenCache[tank].g_iHumanAbility == 1) - { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "RegenHuman2"); - } + vRegen(tank); } else if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esRegenCache[tank].g_iHumanAbility == 1) { @@ -1035,7 +1237,7 @@ void vRegenReset2(int tank) { g_esRegenPlayer[tank].g_bActivated = false; - if (g_esRegenCache[tank].g_iRegenMessage == 1) + if (g_esRegenCache[tank].g_iRegenMessage & MT_MESSAGE_RANGE) { char sTankName[64]; MT_GetTankName(tank, sTankName); @@ -1055,18 +1257,20 @@ void vRegenReset3(int tank) } } -void tTimerRegenCombo(Handle timer, DataPack pack) +Action tTimerRegenCombo(Handle timer, DataPack pack) { pack.Reset(); int iTank = GetClientOfUserId(pack.ReadCell()); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esRegenAbility[g_esRegenPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esRegenPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esRegenPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esRegenCache[iTank].g_iRegenAbility == 0 || g_esRegenPlayer[iTank].g_bActivated) { - return; + return Plugin_Stop; } int iPos = pack.ReadCell(); vRegen(iTank, iPos); + + return Plugin_Continue; } Action tTimerRegen(Handle timer, DataPack pack) @@ -1093,36 +1297,37 @@ Action tTimerRegen(Handle timer, DataPack pack) return Plugin_Stop; } - int iMultiplier = 0; - if (g_esRegenCache[iTank].g_iRegenLeech > 0) + float flTankPos[3], flSurvivorPos[3]; + GetClientAbsOrigin(iTank, flTankPos); + flTankPos[2] += 40.0; + float flInterval = (iPos != -1) ? MT_GetCombinationSetting(iTank, 6, iPos) : g_esRegenCache[iTank].g_flRegenInterval, + flRange = (iPos != -1) ? MT_GetCombinationSetting(iTank, 9, iPos) : g_esRegenCache[iTank].g_flRegenRange; + int iColor[4], iMultiplier = 0; + MT_GetPropColors(iTank, 8, iColor[0], iColor[1], iColor[2], iColor[3]); + iColor[3] = 150; + for (int iSurvivor = 1; iSurvivor <= MaxClients; iSurvivor++) { - float flTankPos[3], flSurvivorPos[3]; - GetClientAbsOrigin(iTank, flTankPos); - flTankPos[2] += 40.0; - float flInterval = (iPos != -1) ? MT_GetCombinationSetting(iTank, 6, iPos) : g_esRegenCache[iTank].g_flRegenInterval, - flRange = (iPos != -1) ? MT_GetCombinationSetting(iTank, 9, iPos) : g_esRegenCache[iTank].g_flRegenLeechRange; - int iColor[4]; - MT_GetPropColors(iTank, 8, iColor[0], iColor[1], iColor[2], iColor[3]); - iColor[3] = 150; - for (int iSurvivor = 1; iSurvivor <= MaxClients; iSurvivor++) + if (bIsSurvivor(iSurvivor, MT_CHECK_INGAME|MT_CHECK_ALIVE) && !MT_IsAdminImmune(iSurvivor, iTank) && !bIsAdminImmune(iSurvivor, g_esRegenPlayer[iTank].g_iTankType, g_esRegenAbility[g_esRegenPlayer[iTank].g_iTankTypeRecorded].g_iImmunityFlags, g_esRegenPlayer[iSurvivor].g_iImmunityFlags)) { - if (bIsSurvivor(iSurvivor, MT_CHECK_INGAME|MT_CHECK_ALIVE) && !MT_IsAdminImmune(iSurvivor, iTank) && !bIsAdminImmune(iSurvivor, g_esRegenPlayer[iTank].g_iTankType, g_esRegenAbility[g_esRegenPlayer[iTank].g_iTankTypeRecorded].g_iImmunityFlags, g_esRegenPlayer[iSurvivor].g_iImmunityFlags)) + GetClientAbsOrigin(iSurvivor, flSurvivorPos); + flSurvivorPos[2] += 40.0; + if (GetVectorDistance(flTankPos, flSurvivorPos) <= flRange && bIsVisibleToPlayer(iTank, iSurvivor, g_esRegenCache[iTank].g_iRegenSight, .range = flRange)) { - GetClientAbsOrigin(iSurvivor, flSurvivorPos); - flSurvivorPos[2] += 40.0; - if (GetVectorDistance(flTankPos, flSurvivorPos) <= flRange && bIsVisibleToPlayer(iTank, iSurvivor, g_esRegenCache[iTank].g_iRegenSight, .range = flRange)) - { - iMultiplier++; + iMultiplier++; + + vDamagePlayer(iSurvivor, iTank, MT_GetScaledDamage(float(g_esRegenCache[iTank].g_iRegenHealth)), "128"); + vScreenEffect(iSurvivor, iTank, g_esRegenCache[iTank].g_iRegenEffect, MT_ATTACK_RANGE); - vDamagePlayer(iSurvivor, iTank, MT_GetScaledDamage(float(g_esRegenCache[iTank].g_iRegenLeech)), "128"); - TE_SetupBeamPoints(flTankPos, flSurvivorPos, g_iLaserSprite, 0, 0, 0, flInterval, 5.0, 5.0, 1, 0.0, iColor, 0); + if (g_iGraphicsLevel > 2) + { + TE_SetupBeamPoints(flTankPos, flSurvivorPos, g_iRegenSprite, 0, 0, 0, flInterval, 5.0, 5.0, 1, 0.0, iColor, 0); TE_SendToAll(); } } } } - int iLeech = g_esRegenCache[iTank].g_iRegenHealth + (g_esRegenCache[iTank].g_iRegenLeech * iMultiplier), + int iLeech = g_esRegenCache[iTank].g_iRegenHealth + (g_esRegenCache[iTank].g_iRegenHealth * iMultiplier), iHealth = GetEntProp(iTank, Prop_Data, "m_iHealth"), iExtraHealth = iHealth + iLeech, iMaxHealth = MT_TankMaxHealth(iTank, 1), @@ -1132,6 +1337,7 @@ Action tTimerRegen(Handle timer, DataPack pack) iRealHealth = (iLeech >= 1) ? iNewHealth : iNewHealth2, iFinalHealth = (iLeech >= 1 && iRealHealth >= g_esRegenCache[iTank].g_iRegenLimit) ? g_esRegenCache[iTank].g_iRegenLimit : iRealHealth, iTotalHealth = (iExtraHealth > MT_MAXHEALTH) ? iLeftover : iLeech; + MT_TankMaxHealth(iTank, 3, (iMaxHealth + iTotalHealth)); SetEntProp(iTank, Prop_Data, "m_iHealth", iFinalHealth); diff --git a/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_respawn.sp b/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_respawn.sp index 475e6eac6b..7514cf7bd5 100644 --- a/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_respawn.sp +++ b/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_respawn.sp @@ -1,6 +1,6 @@ /** - * Mutant Tanks: a L4D/L4D2 SourceMod Plugin - * Copyright (C) 2024 Alfred "Psyk0tik" Llagas + * Mutant Tanks: A L4D/L4D2 SourceMod Plugin + * Copyright (C) 2017-2025 Alfred "Psyk0tik" Llagas * * 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. * @@ -22,21 +22,27 @@ public Plugin myinfo = { name = "[MT] Respawn Ability", author = MT_AUTHOR, - description = "The Mutant Tank respawns upon death.", + description = "The Mutant Tank respawns upon death and resurrects nearby special infected that die.", version = MT_VERSION, url = MT_URL }; -bool g_bDedicated; +bool g_bDedicated, g_bSecondGame; + +int g_iGraphicsLevel; public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max) { - EngineVersion evEngine = GetEngineVersion(); - if (evEngine != Engine_Left4Dead && evEngine != Engine_Left4Dead2) + switch (GetEngineVersion()) { - strcopy(error, err_max, "\"[MT] Respawn Ability\" only supports Left 4 Dead 1 & 2."); + case Engine_Left4Dead: g_bSecondGame = false; + case Engine_Left4Dead2: g_bSecondGame = true; + default: + { + strcopy(error, err_max, "\"[MT] Respawn Ability\" only supports Left 4 Dead 1 & 2."); - return APLRes_SilentFailure; + return APLRes_SilentFailure; + } } g_bDedicated = IsDedicatedServer(); @@ -44,7 +50,10 @@ public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max return APLRes_Success; } +#define PARTICLE_ELECTRICITY "electrical_arc_01_system" + #define SOUND_CHARGE "items/suitchargeok1.wav" +#define SOUND_ELECTRICITY "ambient/energy/zap5.wav" #else #if MT_RESPAWN_COMPILE_METHOD == 1 #error This file must be compiled as a standalone plugin. @@ -61,24 +70,36 @@ public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max enum struct esRespawnPlayer { bool g_bActivated; + bool g_bActivated2; bool g_bRespawning[4]; float g_flCloseAreasOnly; float g_flOpenAreasOnly; float g_flRespawnChance; + float g_flRespawnRange; int g_iAccessFlags; int g_iAmmoCount; + int g_iAmmoCount2; int g_iComboAbility; + int g_iCooldown; int g_iCount; + int g_iDuration; int g_iHumanAbility; int g_iHumanAmmo; + int g_iHumanCooldown; + int g_iHumanDuration; + int g_iHumanMode; int g_iRequiresHumans; int g_iRespawnAbility; int g_iRespawnAmount; + int g_iRespawnCooldown; + int g_iRespawnDuration; + int g_iRespawnFilter; int g_iRespawnMaxType; int g_iRespawnMinType; int g_iRespawnMessage; + int g_iRespawnSight; int g_iTankType; int g_iTankTypeRecorded; } @@ -90,16 +111,24 @@ enum struct esRespawnTeammate float g_flCloseAreasOnly; float g_flOpenAreasOnly; float g_flRespawnChance; + float g_flRespawnRange; int g_iComboAbility; int g_iHumanAbility; int g_iHumanAmmo; + int g_iHumanCooldown; + int g_iHumanDuration; + int g_iHumanMode; int g_iRequiresHumans; int g_iRespawnAbility; int g_iRespawnAmount; + int g_iRespawnCooldown; + int g_iRespawnDuration; + int g_iRespawnFilter; int g_iRespawnMaxType; int g_iRespawnMinType; int g_iRespawnMessage; + int g_iRespawnSight; } esRespawnTeammate g_esRespawnTeammate[MAXPLAYERS + 1]; @@ -109,17 +138,26 @@ enum struct esRespawnAbility float g_flCloseAreasOnly; float g_flOpenAreasOnly; float g_flRespawnChance; + float g_flRespawnRange; int g_iAccessFlags; int g_iComboAbility; + int g_iComboPosition; int g_iHumanAbility; int g_iHumanAmmo; + int g_iHumanCooldown; + int g_iHumanDuration; + int g_iHumanMode; int g_iRequiresHumans; int g_iRespawnAbility; int g_iRespawnAmount; + int g_iRespawnCooldown; + int g_iRespawnDuration; + int g_iRespawnFilter; int g_iRespawnMaxType; int g_iRespawnMinType; int g_iRespawnMessage; + int g_iRespawnSight; } esRespawnAbility g_esRespawnAbility[MT_MAXTYPES + 1]; @@ -129,16 +167,24 @@ enum struct esRespawnSpecial float g_flCloseAreasOnly; float g_flOpenAreasOnly; float g_flRespawnChance; + float g_flRespawnRange; int g_iComboAbility; int g_iHumanAbility; int g_iHumanAmmo; + int g_iHumanCooldown; + int g_iHumanDuration; + int g_iHumanMode; int g_iRequiresHumans; int g_iRespawnAbility; int g_iRespawnAmount; + int g_iRespawnCooldown; + int g_iRespawnDuration; + int g_iRespawnFilter; int g_iRespawnMaxType; int g_iRespawnMinType; int g_iRespawnMessage; + int g_iRespawnSight; } esRespawnSpecial g_esRespawnSpecial[MT_MAXTYPES + 1]; @@ -148,16 +194,24 @@ enum struct esRespawnCache float g_flCloseAreasOnly; float g_flOpenAreasOnly; float g_flRespawnChance; + float g_flRespawnRange; int g_iComboAbility; int g_iHumanAbility; int g_iHumanAmmo; + int g_iHumanCooldown; + int g_iHumanDuration; + int g_iHumanMode; int g_iRequiresHumans; int g_iRespawnAbility; int g_iRespawnAmount; + int g_iRespawnCooldown; + int g_iRespawnDuration; + int g_iRespawnFilter; int g_iRespawnMaxType; int g_iRespawnMinType; int g_iRespawnMessage; + int g_iRespawnSight; } esRespawnCache g_esRespawnCache[MAXPLAYERS + 1]; @@ -179,6 +233,8 @@ void vRespawnMapStart() public void OnMapStart() #endif { + PrecacheSound(SOUND_ELECTRICITY, true); + vRespawnReset(); } @@ -250,7 +306,10 @@ void vRespawnMenu(int client, const char[] name, int item) mAbilityMenu.AddItem("Status", "Status"); mAbilityMenu.AddItem("Ammunition", "Ammunition"); mAbilityMenu.AddItem("Buttons", "Buttons"); + mAbilityMenu.AddItem("Button Mode", "Button Mode"); + mAbilityMenu.AddItem("Cooldown", "Cooldown"); mAbilityMenu.AddItem("Details", "Details"); + mAbilityMenu.AddItem("Duration", "Duration"); mAbilityMenu.AddItem("Human Support", "Human Support"); mAbilityMenu.DisplayAt(client, item, MENU_TIME_FOREVER); } @@ -265,10 +324,29 @@ int iRespawnMenuHandler(Menu menu, MenuAction action, int param1, int param2) switch (param2) { case 0: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esRespawnCache[param1].g_iRespawnAbility == 0) ? "AbilityStatus1" : "AbilityStatus2"); - case 1: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityAmmo", (g_esRespawnCache[param1].g_iHumanAmmo - g_esRespawnPlayer[param1].g_iAmmoCount), g_esRespawnCache[param1].g_iHumanAmmo); - case 2: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtons4"); - case 3: MT_PrintToChat(param1, "%s %t", MT_TAG3, "RespawnDetails"); - case 4: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esRespawnCache[param1].g_iHumanAbility == 0) ? "AbilityHumanSupport1" : "AbilityHumanSupport2"); + case 1: + { + MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityAmmo", (g_esRespawnCache[param1].g_iHumanAmmo - g_esRespawnPlayer[param1].g_iAmmoCount), g_esRespawnCache[param1].g_iHumanAmmo); + MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityAmmo2", (g_esRespawnCache[param1].g_iHumanAmmo - g_esRespawnPlayer[param1].g_iAmmoCount2), g_esRespawnCache[param1].g_iHumanAmmo); + } + case 2: + { + MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtons"); + MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtons4"); + } + case 3: + { + switch (g_esRespawnCache[param1].g_iHumanMode) + { + case 0: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtonMode1"); + case 1: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtonMode2"); + case 2: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtonMode3"); + } + } + case 4: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityCooldown", ((g_esRespawnCache[param1].g_iHumanAbility == 1) ? g_esRespawnCache[param1].g_iHumanCooldown : g_esRespawnCache[param1].g_iRespawnCooldown)); + case 5: MT_PrintToChat(param1, "%s %t", MT_TAG3, "RespawnDetails"); + case 6: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityDuration2", ((g_esRespawnCache[param1].g_iHumanAbility == 1) ? g_esRespawnCache[param1].g_iHumanDuration : g_esRespawnCache[param1].g_iRespawnDuration)); + case 7: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esRespawnCache[param1].g_iHumanAbility == 0) ? "AbilityHumanSupport1" : "AbilityHumanSupport2"); } if (bIsValidClient(param1, MT_CHECK_INGAME)) @@ -294,8 +372,11 @@ int iRespawnMenuHandler(Menu menu, MenuAction action, int param1, int param2) case 0: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Status", param1); case 1: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Ammunition", param1); case 2: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Buttons", param1); - case 3: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Details", param1); - case 4: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "HumanSupport", param1); + case 3: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "ButtonMode", param1); + case 4: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Cooldown", param1); + case 5: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Details", param1); + case 6: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Duration", param1); + case 7: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "HumanSupport", param1); } return RedrawMenuItem(sMenuOption); @@ -339,6 +420,37 @@ public void MT_OnMenuItemDisplayed(int client, const char[] info, char[] buffer, } } +#if defined MT_ABILITIES_MAIN2 +void vRespawnPlayerRunCmd(int client) +#else +public Action OnPlayerRunCmd(int client, int &buttons, int &impulse, float vel[3], float angles[3], int &weapon) +#endif +{ + if (!MT_IsTankSupported(client) || !g_esRespawnPlayer[client].g_bActivated || (bIsInfected(client, MT_CHECK_FAKECLIENT) && g_esRespawnCache[client].g_iHumanMode > 0) || g_esRespawnPlayer[client].g_iDuration == -1) + { +#if defined MT_ABILITIES_MAIN2 + return; +#else + return Plugin_Continue; +#endif + } + + int iTime = GetTime(); + if (g_esRespawnPlayer[client].g_iDuration <= iTime) + { + if (g_esRespawnPlayer[client].g_iCooldown == -1 || g_esRespawnPlayer[client].g_iCooldown <= iTime) + { + vRespawnReset2(client); + } + + g_esRespawnPlayer[client].g_bActivated = false; + g_esRespawnPlayer[client].g_iDuration = -1; + } +#if !defined MT_ABILITIES_MAIN2 + return Plugin_Continue; +#endif +} + #if defined MT_ABILITIES_MAIN2 void vRespawnPluginCheck(ArrayList list) #else @@ -368,9 +480,13 @@ public void MT_OnCombineAbilities(int tank, int type, const float random, const { if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esRespawnCache[tank].g_iHumanAbility != 2) { + g_esRespawnAbility[g_esRespawnPlayer[tank].g_iTankTypeRecorded].g_iComboPosition = -1; + return; } + g_esRespawnAbility[g_esRespawnPlayer[tank].g_iTankTypeRecorded].g_iComboPosition = -1; + char sCombo[320], sSet[4][32]; FormatEx(sCombo, sizeof sCombo, ",%s,", combo); FormatEx(sSet[0], sizeof sSet[], ",%s,", MT_RESPAWN_SECTION); @@ -379,7 +495,7 @@ public void MT_OnCombineAbilities(int tank, int type, const float random, const FormatEx(sSet[3], sizeof sSet[], ",%s,", MT_RESPAWN_SECTION4); if (StrContains(sCombo, sSet[0], false) != -1 || StrContains(sCombo, sSet[1], false) != -1 || StrContains(sCombo, sSet[2], false) != -1 || StrContains(sCombo, sSet[3], false) != -1) { - if (type == MT_COMBO_UPONDEATH && g_esRespawnCache[tank].g_iRespawnAbility == 1 && g_esRespawnCache[tank].g_iComboAbility == 1) + if (type == MT_COMBO_UPONDEATH && g_esRespawnCache[tank].g_iRespawnAbility > 0 && g_esRespawnCache[tank].g_iComboAbility == 1) { char sAbilities[320], sSubset[10][32]; strcopy(sAbilities, sizeof sAbilities, combo); @@ -396,7 +512,7 @@ public void MT_OnCombineAbilities(int tank, int type, const float random, const switch (flDelay) { - case 0.0: vRespawn(tank); + case 0.0: vRespawn2(tank, true); default: CreateTimer(flDelay, tTimerRespawnCombo, GetClientUserId(tank), TIMER_FLAG_NO_MAPCHANGE); } } @@ -423,29 +539,46 @@ public void MT_OnConfigsLoad(int mode) g_esRespawnAbility[iIndex].g_iAccessFlags = 0; g_esRespawnAbility[iIndex].g_flCloseAreasOnly = 0.0; g_esRespawnAbility[iIndex].g_iComboAbility = 0; + g_esRespawnAbility[iIndex].g_iComboPosition = -1; g_esRespawnAbility[iIndex].g_iHumanAbility = 0; g_esRespawnAbility[iIndex].g_iHumanAmmo = 5; + g_esRespawnAbility[iIndex].g_iHumanCooldown = 0; + g_esRespawnAbility[iIndex].g_iHumanDuration = 5; + g_esRespawnAbility[iIndex].g_iHumanMode = 1; g_esRespawnAbility[iIndex].g_flOpenAreasOnly = 0.0; g_esRespawnAbility[iIndex].g_iRequiresHumans = 0; g_esRespawnAbility[iIndex].g_iRespawnAbility = 0; g_esRespawnAbility[iIndex].g_iRespawnMessage = 0; g_esRespawnAbility[iIndex].g_iRespawnAmount = 1; g_esRespawnAbility[iIndex].g_flRespawnChance = 33.3; + g_esRespawnAbility[iIndex].g_iRespawnCooldown = 0; + g_esRespawnAbility[iIndex].g_iRespawnDuration = 0; + g_esRespawnAbility[iIndex].g_iRespawnFilter = 0; g_esRespawnAbility[iIndex].g_iRespawnMaxType = 0; g_esRespawnAbility[iIndex].g_iRespawnMinType = 0; + g_esRespawnAbility[iIndex].g_flRespawnRange = 500.0; + g_esRespawnAbility[iIndex].g_iRespawnSight = 0; g_esRespawnSpecial[iIndex].g_flCloseAreasOnly = -1.0; g_esRespawnSpecial[iIndex].g_iComboAbility = -1; g_esRespawnSpecial[iIndex].g_iHumanAbility = -1; g_esRespawnSpecial[iIndex].g_iHumanAmmo = -1; + g_esRespawnSpecial[iIndex].g_iHumanCooldown = -1; + g_esRespawnSpecial[iIndex].g_iHumanDuration = -1; + g_esRespawnSpecial[iIndex].g_iHumanMode = -1; g_esRespawnSpecial[iIndex].g_flOpenAreasOnly = -1.0; g_esRespawnSpecial[iIndex].g_iRequiresHumans = -1; g_esRespawnSpecial[iIndex].g_iRespawnAbility = -1; g_esRespawnSpecial[iIndex].g_iRespawnMessage = -1; g_esRespawnSpecial[iIndex].g_iRespawnAmount = -1; g_esRespawnSpecial[iIndex].g_flRespawnChance = -1.0; + g_esRespawnSpecial[iIndex].g_iRespawnCooldown = -1; + g_esRespawnSpecial[iIndex].g_iRespawnDuration = -1; + g_esRespawnSpecial[iIndex].g_iRespawnFilter = -1; g_esRespawnSpecial[iIndex].g_iRespawnMaxType = -1; g_esRespawnSpecial[iIndex].g_iRespawnMinType = -1; + g_esRespawnSpecial[iIndex].g_flRespawnRange = -1.0; + g_esRespawnSpecial[iIndex].g_iRespawnSight = -1; } } case 3: @@ -457,27 +590,43 @@ public void MT_OnConfigsLoad(int mode) g_esRespawnPlayer[iPlayer].g_iComboAbility = -1; g_esRespawnPlayer[iPlayer].g_iHumanAbility = -1; g_esRespawnPlayer[iPlayer].g_iHumanAmmo = -1; + g_esRespawnPlayer[iPlayer].g_iHumanCooldown = -1; + g_esRespawnPlayer[iPlayer].g_iHumanDuration = -1; + g_esRespawnPlayer[iPlayer].g_iHumanMode = -1; g_esRespawnPlayer[iPlayer].g_flOpenAreasOnly = -1.0; g_esRespawnPlayer[iPlayer].g_iRequiresHumans = -1; g_esRespawnPlayer[iPlayer].g_iRespawnAbility = -1; g_esRespawnPlayer[iPlayer].g_iRespawnMessage = -1; g_esRespawnPlayer[iPlayer].g_iRespawnAmount = -1; g_esRespawnPlayer[iPlayer].g_flRespawnChance = -1.0; + g_esRespawnPlayer[iPlayer].g_iRespawnCooldown = -1; + g_esRespawnPlayer[iPlayer].g_iRespawnDuration = -1; + g_esRespawnPlayer[iPlayer].g_iRespawnFilter = -1; g_esRespawnPlayer[iPlayer].g_iRespawnMaxType = -1; g_esRespawnPlayer[iPlayer].g_iRespawnMinType = -1; + g_esRespawnPlayer[iPlayer].g_flRespawnRange = -1.0; + g_esRespawnPlayer[iPlayer].g_iRespawnSight = -1; g_esRespawnTeammate[iPlayer].g_flCloseAreasOnly = -1.0; g_esRespawnTeammate[iPlayer].g_iComboAbility = -1; g_esRespawnTeammate[iPlayer].g_iHumanAbility = -1; g_esRespawnTeammate[iPlayer].g_iHumanAmmo = -1; + g_esRespawnTeammate[iPlayer].g_iHumanCooldown = -1; + g_esRespawnTeammate[iPlayer].g_iHumanDuration = -1; + g_esRespawnTeammate[iPlayer].g_iHumanMode = -1; g_esRespawnTeammate[iPlayer].g_flOpenAreasOnly = -1.0; g_esRespawnTeammate[iPlayer].g_iRequiresHumans = -1; g_esRespawnTeammate[iPlayer].g_iRespawnAbility = -1; g_esRespawnTeammate[iPlayer].g_iRespawnMessage = -1; g_esRespawnTeammate[iPlayer].g_iRespawnAmount = -1; g_esRespawnTeammate[iPlayer].g_flRespawnChance = -1.0; + g_esRespawnTeammate[iPlayer].g_iRespawnCooldown = -1; + g_esRespawnTeammate[iPlayer].g_iRespawnDuration = -1; + g_esRespawnTeammate[iPlayer].g_iRespawnFilter = -1; g_esRespawnTeammate[iPlayer].g_iRespawnMaxType = -1; g_esRespawnTeammate[iPlayer].g_iRespawnMinType = -1; + g_esRespawnTeammate[iPlayer].g_flRespawnRange = -1.0; + g_esRespawnTeammate[iPlayer].g_iRespawnSight = -1; } } } @@ -497,12 +646,20 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esRespawnTeammate[admin].g_iComboAbility = iGetKeyValue(subsection, MT_RESPAWN_SECTION, MT_RESPAWN_SECTION2, MT_RESPAWN_SECTION3, MT_RESPAWN_SECTION4, key, "ComboAbility", "Combo Ability", "Combo_Ability", "combo", g_esRespawnTeammate[admin].g_iComboAbility, value, -1, 1); g_esRespawnTeammate[admin].g_iHumanAbility = iGetKeyValue(subsection, MT_RESPAWN_SECTION, MT_RESPAWN_SECTION2, MT_RESPAWN_SECTION3, MT_RESPAWN_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esRespawnTeammate[admin].g_iHumanAbility, value, -1, 2); g_esRespawnTeammate[admin].g_iHumanAmmo = iGetKeyValue(subsection, MT_RESPAWN_SECTION, MT_RESPAWN_SECTION2, MT_RESPAWN_SECTION3, MT_RESPAWN_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esRespawnTeammate[admin].g_iHumanAmmo, value, -1, 99999); + g_esRespawnTeammate[admin].g_iHumanCooldown = iGetKeyValue(subsection, MT_RESPAWN_SECTION, MT_RESPAWN_SECTION2, MT_RESPAWN_SECTION3, MT_RESPAWN_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esRespawnTeammate[admin].g_iHumanCooldown, value, -1, 99999); + g_esRespawnTeammate[admin].g_iHumanDuration = iGetKeyValue(subsection, MT_RESPAWN_SECTION, MT_RESPAWN_SECTION2, MT_RESPAWN_SECTION3, MT_RESPAWN_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esRespawnTeammate[admin].g_iHumanDuration, value, -1, 99999); + g_esRespawnTeammate[admin].g_iHumanMode = iGetKeyValue(subsection, MT_RESPAWN_SECTION, MT_RESPAWN_SECTION2, MT_RESPAWN_SECTION3, MT_RESPAWN_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esRespawnTeammate[admin].g_iHumanMode, value, -1, 2); g_esRespawnTeammate[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_RESPAWN_SECTION, MT_RESPAWN_SECTION2, MT_RESPAWN_SECTION3, MT_RESPAWN_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esRespawnTeammate[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); g_esRespawnTeammate[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_RESPAWN_SECTION, MT_RESPAWN_SECTION2, MT_RESPAWN_SECTION3, MT_RESPAWN_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esRespawnTeammate[admin].g_iRequiresHumans, value, -1, 32); - g_esRespawnTeammate[admin].g_iRespawnAbility = iGetKeyValue(subsection, MT_RESPAWN_SECTION, MT_RESPAWN_SECTION2, MT_RESPAWN_SECTION3, MT_RESPAWN_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esRespawnTeammate[admin].g_iRespawnAbility, value, -1, 1); + g_esRespawnTeammate[admin].g_iRespawnAbility = iGetKeyValue(subsection, MT_RESPAWN_SECTION, MT_RESPAWN_SECTION2, MT_RESPAWN_SECTION3, MT_RESPAWN_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esRespawnTeammate[admin].g_iRespawnAbility, value, -1, 3); g_esRespawnTeammate[admin].g_iRespawnMessage = iGetKeyValue(subsection, MT_RESPAWN_SECTION, MT_RESPAWN_SECTION2, MT_RESPAWN_SECTION3, MT_RESPAWN_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esRespawnTeammate[admin].g_iRespawnMessage, value, -1, 1); + g_esRespawnTeammate[admin].g_iRespawnSight = iGetKeyValue(subsection, MT_RESPAWN_SECTION, MT_RESPAWN_SECTION2, MT_RESPAWN_SECTION3, MT_RESPAWN_SECTION4, key, "AbilitySight", "Ability Sight", "Ability_Sight", "sight", g_esRespawnTeammate[admin].g_iRespawnSight, value, -1, 5); g_esRespawnTeammate[admin].g_iRespawnAmount = iGetKeyValue(subsection, MT_RESPAWN_SECTION, MT_RESPAWN_SECTION2, MT_RESPAWN_SECTION3, MT_RESPAWN_SECTION4, key, "RespawnAmount", "Respawn Amount", "Respawn_Amount", "amount", g_esRespawnTeammate[admin].g_iRespawnAmount, value, -1, 99999); g_esRespawnTeammate[admin].g_flRespawnChance = flGetKeyValue(subsection, MT_RESPAWN_SECTION, MT_RESPAWN_SECTION2, MT_RESPAWN_SECTION3, MT_RESPAWN_SECTION4, key, "RespawnChance", "Respawn Chance", "Respawn_Chance", "chance", g_esRespawnTeammate[admin].g_flRespawnChance, value, -1.0, 100.0); + g_esRespawnTeammate[admin].g_iRespawnCooldown = iGetKeyValue(subsection, MT_RESPAWN_SECTION, MT_RESPAWN_SECTION2, MT_RESPAWN_SECTION3, MT_RESPAWN_SECTION4, key, "RespawnCooldown", "Respawn Cooldown", "Respawn_Cooldown", "cooldown", g_esRespawnTeammate[admin].g_iRespawnCooldown, value, -1, 99999); + g_esRespawnTeammate[admin].g_iRespawnDuration = iGetKeyValue(subsection, MT_RESPAWN_SECTION, MT_RESPAWN_SECTION2, MT_RESPAWN_SECTION3, MT_RESPAWN_SECTION4, key, "RespawnDuration", "Respawn Duration", "Respawn_Duration", "duration", g_esRespawnTeammate[admin].g_iRespawnDuration, value, -1, 99999); + g_esRespawnTeammate[admin].g_iRespawnFilter = iGetKeyValue(subsection, MT_RESPAWN_SECTION, MT_RESPAWN_SECTION2, MT_RESPAWN_SECTION3, MT_RESPAWN_SECTION4, key, "RespawnFilter", "Respawn Filter", "Respawn_Filter", "filter", g_esRespawnTeammate[admin].g_iRespawnFilter, value, -1, 127); + g_esRespawnTeammate[admin].g_flRespawnRange = flGetKeyValue(subsection, MT_RESPAWN_SECTION, MT_RESPAWN_SECTION2, MT_RESPAWN_SECTION3, MT_RESPAWN_SECTION4, key, "RespawnRange", "Respawn Range", "Respawn_Range", "range", g_esRespawnTeammate[admin].g_flRespawnRange, value, -1.0, 99999.0); } else { @@ -510,12 +667,20 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esRespawnPlayer[admin].g_iComboAbility = iGetKeyValue(subsection, MT_RESPAWN_SECTION, MT_RESPAWN_SECTION2, MT_RESPAWN_SECTION3, MT_RESPAWN_SECTION4, key, "ComboAbility", "Combo Ability", "Combo_Ability", "combo", g_esRespawnPlayer[admin].g_iComboAbility, value, -1, 1); g_esRespawnPlayer[admin].g_iHumanAbility = iGetKeyValue(subsection, MT_RESPAWN_SECTION, MT_RESPAWN_SECTION2, MT_RESPAWN_SECTION3, MT_RESPAWN_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esRespawnPlayer[admin].g_iHumanAbility, value, -1, 2); g_esRespawnPlayer[admin].g_iHumanAmmo = iGetKeyValue(subsection, MT_RESPAWN_SECTION, MT_RESPAWN_SECTION2, MT_RESPAWN_SECTION3, MT_RESPAWN_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esRespawnPlayer[admin].g_iHumanAmmo, value, -1, 99999); + g_esRespawnPlayer[admin].g_iHumanCooldown = iGetKeyValue(subsection, MT_RESPAWN_SECTION, MT_RESPAWN_SECTION2, MT_RESPAWN_SECTION3, MT_RESPAWN_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esRespawnPlayer[admin].g_iHumanCooldown, value, -1, 99999); + g_esRespawnPlayer[admin].g_iHumanDuration = iGetKeyValue(subsection, MT_RESPAWN_SECTION, MT_RESPAWN_SECTION2, MT_RESPAWN_SECTION3, MT_RESPAWN_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esRespawnPlayer[admin].g_iHumanDuration, value, -1, 99999); + g_esRespawnPlayer[admin].g_iHumanMode = iGetKeyValue(subsection, MT_RESPAWN_SECTION, MT_RESPAWN_SECTION2, MT_RESPAWN_SECTION3, MT_RESPAWN_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esRespawnPlayer[admin].g_iHumanMode, value, -1, 2); g_esRespawnPlayer[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_RESPAWN_SECTION, MT_RESPAWN_SECTION2, MT_RESPAWN_SECTION3, MT_RESPAWN_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esRespawnPlayer[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); g_esRespawnPlayer[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_RESPAWN_SECTION, MT_RESPAWN_SECTION2, MT_RESPAWN_SECTION3, MT_RESPAWN_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esRespawnPlayer[admin].g_iRequiresHumans, value, -1, 32); - g_esRespawnPlayer[admin].g_iRespawnAbility = iGetKeyValue(subsection, MT_RESPAWN_SECTION, MT_RESPAWN_SECTION2, MT_RESPAWN_SECTION3, MT_RESPAWN_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esRespawnPlayer[admin].g_iRespawnAbility, value, -1, 1); + g_esRespawnPlayer[admin].g_iRespawnAbility = iGetKeyValue(subsection, MT_RESPAWN_SECTION, MT_RESPAWN_SECTION2, MT_RESPAWN_SECTION3, MT_RESPAWN_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esRespawnPlayer[admin].g_iRespawnAbility, value, -1, 3); g_esRespawnPlayer[admin].g_iRespawnMessage = iGetKeyValue(subsection, MT_RESPAWN_SECTION, MT_RESPAWN_SECTION2, MT_RESPAWN_SECTION3, MT_RESPAWN_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esRespawnPlayer[admin].g_iRespawnMessage, value, -1, 1); + g_esRespawnPlayer[admin].g_iRespawnSight = iGetKeyValue(subsection, MT_RESPAWN_SECTION, MT_RESPAWN_SECTION2, MT_RESPAWN_SECTION3, MT_RESPAWN_SECTION4, key, "AbilitySight", "Ability Sight", "Ability_Sight", "sight", g_esRespawnPlayer[admin].g_iRespawnSight, value, -1, 5); g_esRespawnPlayer[admin].g_iRespawnAmount = iGetKeyValue(subsection, MT_RESPAWN_SECTION, MT_RESPAWN_SECTION2, MT_RESPAWN_SECTION3, MT_RESPAWN_SECTION4, key, "RespawnAmount", "Respawn Amount", "Respawn_Amount", "amount", g_esRespawnPlayer[admin].g_iRespawnAmount, value, -1, 99999); g_esRespawnPlayer[admin].g_flRespawnChance = flGetKeyValue(subsection, MT_RESPAWN_SECTION, MT_RESPAWN_SECTION2, MT_RESPAWN_SECTION3, MT_RESPAWN_SECTION4, key, "RespawnChance", "Respawn Chance", "Respawn_Chance", "chance", g_esRespawnPlayer[admin].g_flRespawnChance, value, -1.0, 100.0); + g_esRespawnPlayer[admin].g_iRespawnCooldown = iGetKeyValue(subsection, MT_RESPAWN_SECTION, MT_RESPAWN_SECTION2, MT_RESPAWN_SECTION3, MT_RESPAWN_SECTION4, key, "RespawnCooldown", "Respawn Cooldown", "Respawn_Cooldown", "cooldown", g_esRespawnPlayer[admin].g_iRespawnCooldown, value, -1, 99999); + g_esRespawnPlayer[admin].g_iRespawnDuration = iGetKeyValue(subsection, MT_RESPAWN_SECTION, MT_RESPAWN_SECTION2, MT_RESPAWN_SECTION3, MT_RESPAWN_SECTION4, key, "RespawnDuration", "Respawn Duration", "Respawn_Duration", "duration", g_esRespawnPlayer[admin].g_iRespawnDuration, value, -1, 99999); + g_esRespawnPlayer[admin].g_iRespawnFilter = iGetKeyValue(subsection, MT_RESPAWN_SECTION, MT_RESPAWN_SECTION2, MT_RESPAWN_SECTION3, MT_RESPAWN_SECTION4, key, "RespawnFilter", "Respawn Filter", "Respawn_Filter", "filter", g_esRespawnPlayer[admin].g_iRespawnFilter, value, -1, 127); + g_esRespawnPlayer[admin].g_flRespawnRange = flGetKeyValue(subsection, MT_RESPAWN_SECTION, MT_RESPAWN_SECTION2, MT_RESPAWN_SECTION3, MT_RESPAWN_SECTION4, key, "RespawnRange", "Respawn Range", "Respawn_Range", "range", g_esRespawnPlayer[admin].g_flRespawnRange, value, -1.0, 99999.0); g_esRespawnPlayer[admin].g_iAccessFlags = iGetAdminFlagsValue(subsection, MT_RESPAWN_SECTION, MT_RESPAWN_SECTION2, MT_RESPAWN_SECTION3, MT_RESPAWN_SECTION4, key, "AccessFlags", "Access Flags", "Access_Flags", "access", value); } @@ -550,12 +715,20 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esRespawnSpecial[type].g_iComboAbility = iGetKeyValue(subsection, MT_RESPAWN_SECTION, MT_RESPAWN_SECTION2, MT_RESPAWN_SECTION3, MT_RESPAWN_SECTION4, key, "ComboAbility", "Combo Ability", "Combo_Ability", "combo", g_esRespawnSpecial[type].g_iComboAbility, value, -1, 1); g_esRespawnSpecial[type].g_iHumanAbility = iGetKeyValue(subsection, MT_RESPAWN_SECTION, MT_RESPAWN_SECTION2, MT_RESPAWN_SECTION3, MT_RESPAWN_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esRespawnSpecial[type].g_iHumanAbility, value, -1, 2); g_esRespawnSpecial[type].g_iHumanAmmo = iGetKeyValue(subsection, MT_RESPAWN_SECTION, MT_RESPAWN_SECTION2, MT_RESPAWN_SECTION3, MT_RESPAWN_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esRespawnSpecial[type].g_iHumanAmmo, value, -1, 99999); + g_esRespawnSpecial[type].g_iHumanCooldown = iGetKeyValue(subsection, MT_RESPAWN_SECTION, MT_RESPAWN_SECTION2, MT_RESPAWN_SECTION3, MT_RESPAWN_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esRespawnSpecial[type].g_iHumanCooldown, value, -1, 99999); + g_esRespawnSpecial[type].g_iHumanDuration = iGetKeyValue(subsection, MT_RESPAWN_SECTION, MT_RESPAWN_SECTION2, MT_RESPAWN_SECTION3, MT_RESPAWN_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esRespawnSpecial[type].g_iHumanDuration, value, -1, 99999); + g_esRespawnSpecial[type].g_iHumanMode = iGetKeyValue(subsection, MT_RESPAWN_SECTION, MT_RESPAWN_SECTION2, MT_RESPAWN_SECTION3, MT_RESPAWN_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esRespawnSpecial[type].g_iHumanMode, value, -1, 2); g_esRespawnSpecial[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_RESPAWN_SECTION, MT_RESPAWN_SECTION2, MT_RESPAWN_SECTION3, MT_RESPAWN_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esRespawnSpecial[type].g_flOpenAreasOnly, value, -1.0, 99999.0); g_esRespawnSpecial[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_RESPAWN_SECTION, MT_RESPAWN_SECTION2, MT_RESPAWN_SECTION3, MT_RESPAWN_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esRespawnSpecial[type].g_iRequiresHumans, value, -1, 32); - g_esRespawnSpecial[type].g_iRespawnAbility = iGetKeyValue(subsection, MT_RESPAWN_SECTION, MT_RESPAWN_SECTION2, MT_RESPAWN_SECTION3, MT_RESPAWN_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esRespawnSpecial[type].g_iRespawnAbility, value, -1, 1); + g_esRespawnSpecial[type].g_iRespawnAbility = iGetKeyValue(subsection, MT_RESPAWN_SECTION, MT_RESPAWN_SECTION2, MT_RESPAWN_SECTION3, MT_RESPAWN_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esRespawnSpecial[type].g_iRespawnAbility, value, -1, 3); g_esRespawnSpecial[type].g_iRespawnMessage = iGetKeyValue(subsection, MT_RESPAWN_SECTION, MT_RESPAWN_SECTION2, MT_RESPAWN_SECTION3, MT_RESPAWN_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esRespawnSpecial[type].g_iRespawnMessage, value, -1, 1); + g_esRespawnSpecial[type].g_iRespawnSight = iGetKeyValue(subsection, MT_RESPAWN_SECTION, MT_RESPAWN_SECTION2, MT_RESPAWN_SECTION3, MT_RESPAWN_SECTION4, key, "AbilitySight", "Ability Sight", "Ability_Sight", "sight", g_esRespawnSpecial[type].g_iRespawnSight, value, -1, 5); g_esRespawnSpecial[type].g_iRespawnAmount = iGetKeyValue(subsection, MT_RESPAWN_SECTION, MT_RESPAWN_SECTION2, MT_RESPAWN_SECTION3, MT_RESPAWN_SECTION4, key, "RespawnAmount", "Respawn Amount", "Respawn_Amount", "amount", g_esRespawnSpecial[type].g_iRespawnAmount, value, -1, 99999); g_esRespawnSpecial[type].g_flRespawnChance = flGetKeyValue(subsection, MT_RESPAWN_SECTION, MT_RESPAWN_SECTION2, MT_RESPAWN_SECTION3, MT_RESPAWN_SECTION4, key, "RespawnChance", "Respawn Chance", "Respawn_Chance", "chance", g_esRespawnSpecial[type].g_flRespawnChance, value, -1.0, 100.0); + g_esRespawnSpecial[type].g_iRespawnCooldown = iGetKeyValue(subsection, MT_RESPAWN_SECTION, MT_RESPAWN_SECTION2, MT_RESPAWN_SECTION3, MT_RESPAWN_SECTION4, key, "RespawnCooldown", "Respawn Cooldown", "Respawn_Cooldown", "cooldown", g_esRespawnSpecial[type].g_iRespawnCooldown, value, -1, 99999); + g_esRespawnSpecial[type].g_iRespawnDuration = iGetKeyValue(subsection, MT_RESPAWN_SECTION, MT_RESPAWN_SECTION2, MT_RESPAWN_SECTION3, MT_RESPAWN_SECTION4, key, "RespawnDuration", "Respawn Duration", "Respawn_Duration", "duration", g_esRespawnSpecial[type].g_iRespawnDuration, value, -1, 99999); + g_esRespawnSpecial[type].g_iRespawnFilter = iGetKeyValue(subsection, MT_RESPAWN_SECTION, MT_RESPAWN_SECTION2, MT_RESPAWN_SECTION3, MT_RESPAWN_SECTION4, key, "RespawnFilter", "Respawn Filter", "Respawn_Filter", "filter", g_esRespawnSpecial[type].g_iRespawnFilter, value, -1, 127); + g_esRespawnSpecial[type].g_flRespawnRange = flGetKeyValue(subsection, MT_RESPAWN_SECTION, MT_RESPAWN_SECTION2, MT_RESPAWN_SECTION3, MT_RESPAWN_SECTION4, key, "RespawnRange", "Respawn Range", "Respawn_Range", "range", g_esRespawnSpecial[type].g_flRespawnRange, value, -1.0, 99999.0); } else { @@ -563,12 +736,20 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esRespawnAbility[type].g_iComboAbility = iGetKeyValue(subsection, MT_RESPAWN_SECTION, MT_RESPAWN_SECTION2, MT_RESPAWN_SECTION3, MT_RESPAWN_SECTION4, key, "ComboAbility", "Combo Ability", "Combo_Ability", "combo", g_esRespawnAbility[type].g_iComboAbility, value, -1, 1); g_esRespawnAbility[type].g_iHumanAbility = iGetKeyValue(subsection, MT_RESPAWN_SECTION, MT_RESPAWN_SECTION2, MT_RESPAWN_SECTION3, MT_RESPAWN_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esRespawnAbility[type].g_iHumanAbility, value, -1, 2); g_esRespawnAbility[type].g_iHumanAmmo = iGetKeyValue(subsection, MT_RESPAWN_SECTION, MT_RESPAWN_SECTION2, MT_RESPAWN_SECTION3, MT_RESPAWN_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esRespawnAbility[type].g_iHumanAmmo, value, -1, 99999); + g_esRespawnAbility[type].g_iHumanCooldown = iGetKeyValue(subsection, MT_RESPAWN_SECTION, MT_RESPAWN_SECTION2, MT_RESPAWN_SECTION3, MT_RESPAWN_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esRespawnAbility[type].g_iHumanCooldown, value, -1, 99999); + g_esRespawnAbility[type].g_iHumanDuration = iGetKeyValue(subsection, MT_RESPAWN_SECTION, MT_RESPAWN_SECTION2, MT_RESPAWN_SECTION3, MT_RESPAWN_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esRespawnAbility[type].g_iHumanDuration, value, -1, 99999); + g_esRespawnAbility[type].g_iHumanMode = iGetKeyValue(subsection, MT_RESPAWN_SECTION, MT_RESPAWN_SECTION2, MT_RESPAWN_SECTION3, MT_RESPAWN_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esRespawnAbility[type].g_iHumanMode, value, -1, 2); g_esRespawnAbility[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_RESPAWN_SECTION, MT_RESPAWN_SECTION2, MT_RESPAWN_SECTION3, MT_RESPAWN_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esRespawnAbility[type].g_flOpenAreasOnly, value, -1.0, 99999.0); g_esRespawnAbility[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_RESPAWN_SECTION, MT_RESPAWN_SECTION2, MT_RESPAWN_SECTION3, MT_RESPAWN_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esRespawnAbility[type].g_iRequiresHumans, value, -1, 32); - g_esRespawnAbility[type].g_iRespawnAbility = iGetKeyValue(subsection, MT_RESPAWN_SECTION, MT_RESPAWN_SECTION2, MT_RESPAWN_SECTION3, MT_RESPAWN_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esRespawnAbility[type].g_iRespawnAbility, value, -1, 1); + g_esRespawnAbility[type].g_iRespawnAbility = iGetKeyValue(subsection, MT_RESPAWN_SECTION, MT_RESPAWN_SECTION2, MT_RESPAWN_SECTION3, MT_RESPAWN_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esRespawnAbility[type].g_iRespawnAbility, value, -1, 3); g_esRespawnAbility[type].g_iRespawnMessage = iGetKeyValue(subsection, MT_RESPAWN_SECTION, MT_RESPAWN_SECTION2, MT_RESPAWN_SECTION3, MT_RESPAWN_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esRespawnAbility[type].g_iRespawnMessage, value, -1, 1); + g_esRespawnAbility[type].g_iRespawnSight = iGetKeyValue(subsection, MT_RESPAWN_SECTION, MT_RESPAWN_SECTION2, MT_RESPAWN_SECTION3, MT_RESPAWN_SECTION4, key, "AbilitySight", "Ability Sight", "Ability_Sight", "sight", g_esRespawnAbility[type].g_iRespawnSight, value, -1, 5); g_esRespawnAbility[type].g_iRespawnAmount = iGetKeyValue(subsection, MT_RESPAWN_SECTION, MT_RESPAWN_SECTION2, MT_RESPAWN_SECTION3, MT_RESPAWN_SECTION4, key, "RespawnAmount", "Respawn Amount", "Respawn_Amount", "amount", g_esRespawnAbility[type].g_iRespawnAmount, value, -1, 99999); g_esRespawnAbility[type].g_flRespawnChance = flGetKeyValue(subsection, MT_RESPAWN_SECTION, MT_RESPAWN_SECTION2, MT_RESPAWN_SECTION3, MT_RESPAWN_SECTION4, key, "RespawnChance", "Respawn Chance", "Respawn_Chance", "chance", g_esRespawnAbility[type].g_flRespawnChance, value, -1.0, 100.0); + g_esRespawnAbility[type].g_iRespawnCooldown = iGetKeyValue(subsection, MT_RESPAWN_SECTION, MT_RESPAWN_SECTION2, MT_RESPAWN_SECTION3, MT_RESPAWN_SECTION4, key, "RespawnCooldown", "Respawn Cooldown", "Respawn_Cooldown", "cooldown", g_esRespawnAbility[type].g_iRespawnCooldown, value, -1, 99999); + g_esRespawnAbility[type].g_iRespawnDuration = iGetKeyValue(subsection, MT_RESPAWN_SECTION, MT_RESPAWN_SECTION2, MT_RESPAWN_SECTION3, MT_RESPAWN_SECTION4, key, "RespawnDuration", "Respawn Duration", "Respawn_Duration", "duration", g_esRespawnAbility[type].g_iRespawnDuration, value, -1, 99999); + g_esRespawnAbility[type].g_iRespawnFilter = iGetKeyValue(subsection, MT_RESPAWN_SECTION, MT_RESPAWN_SECTION2, MT_RESPAWN_SECTION3, MT_RESPAWN_SECTION4, key, "RespawnFilter", "Respawn Filter", "Respawn_Filter", "filter", g_esRespawnAbility[type].g_iRespawnFilter, value, -1, 127); + g_esRespawnAbility[type].g_flRespawnRange = flGetKeyValue(subsection, MT_RESPAWN_SECTION, MT_RESPAWN_SECTION2, MT_RESPAWN_SECTION3, MT_RESPAWN_SECTION4, key, "RespawnRange", "Respawn Range", "Respawn_Range", "range", g_esRespawnAbility[type].g_flRespawnRange, value, -1.0, 99999.0); g_esRespawnAbility[type].g_iAccessFlags = iGetAdminFlagsValue(subsection, MT_RESPAWN_SECTION, MT_RESPAWN_SECTION2, MT_RESPAWN_SECTION3, MT_RESPAWN_SECTION4, key, "AccessFlags", "Access Flags", "Access_Flags", "access", value); } @@ -614,13 +795,20 @@ public void MT_OnSettingsCached(int tank, bool apply, int type) g_esRespawnCache[tank].g_flRespawnChance = flGetSubSettingValue(apply, bHuman, g_esRespawnTeammate[tank].g_flRespawnChance, g_esRespawnPlayer[tank].g_flRespawnChance, g_esRespawnSpecial[iType].g_flRespawnChance, g_esRespawnAbility[iType].g_flRespawnChance, 1); g_esRespawnCache[tank].g_iHumanAbility = iGetSubSettingValue(apply, bHuman, g_esRespawnTeammate[tank].g_iHumanAbility, g_esRespawnPlayer[tank].g_iHumanAbility, g_esRespawnSpecial[iType].g_iHumanAbility, g_esRespawnAbility[iType].g_iHumanAbility, 1); g_esRespawnCache[tank].g_iHumanAmmo = iGetSubSettingValue(apply, bHuman, g_esRespawnTeammate[tank].g_iHumanAmmo, g_esRespawnPlayer[tank].g_iHumanAmmo, g_esRespawnSpecial[iType].g_iHumanAmmo, g_esRespawnAbility[iType].g_iHumanAmmo, 1); + g_esRespawnCache[tank].g_iHumanCooldown = iGetSubSettingValue(apply, bHuman, g_esRespawnTeammate[tank].g_iHumanCooldown, g_esRespawnPlayer[tank].g_iHumanCooldown, g_esRespawnSpecial[iType].g_iHumanCooldown, g_esRespawnAbility[iType].g_iHumanCooldown, 1); + g_esRespawnCache[tank].g_iHumanDuration = iGetSubSettingValue(apply, bHuman, g_esRespawnTeammate[tank].g_iHumanDuration, g_esRespawnPlayer[tank].g_iHumanDuration, g_esRespawnSpecial[iType].g_iHumanDuration, g_esRespawnAbility[iType].g_iHumanDuration, 1); + g_esRespawnCache[tank].g_iHumanMode = iGetSubSettingValue(apply, bHuman, g_esRespawnTeammate[tank].g_iHumanMode, g_esRespawnPlayer[tank].g_iHumanMode, g_esRespawnSpecial[iType].g_iHumanMode, g_esRespawnAbility[iType].g_iHumanMode, 1); g_esRespawnCache[tank].g_flOpenAreasOnly = flGetSubSettingValue(apply, bHuman, g_esRespawnTeammate[tank].g_flOpenAreasOnly, g_esRespawnPlayer[tank].g_flOpenAreasOnly, g_esRespawnSpecial[iType].g_flOpenAreasOnly, g_esRespawnAbility[iType].g_flOpenAreasOnly, 1); g_esRespawnCache[tank].g_iRequiresHumans = iGetSubSettingValue(apply, bHuman, g_esRespawnTeammate[tank].g_iRequiresHumans, g_esRespawnPlayer[tank].g_iRequiresHumans, g_esRespawnSpecial[iType].g_iRequiresHumans, g_esRespawnAbility[iType].g_iRequiresHumans, 1); g_esRespawnCache[tank].g_iRespawnAbility = iGetSubSettingValue(apply, bHuman, g_esRespawnTeammate[tank].g_iRespawnAbility, g_esRespawnPlayer[tank].g_iRespawnAbility, g_esRespawnSpecial[iType].g_iRespawnAbility, g_esRespawnAbility[iType].g_iRespawnAbility, 1); g_esRespawnCache[tank].g_iRespawnAmount = iGetSubSettingValue(apply, bHuman, g_esRespawnTeammate[tank].g_iRespawnAmount, g_esRespawnPlayer[tank].g_iRespawnAmount, g_esRespawnSpecial[iType].g_iRespawnAmount, g_esRespawnAbility[iType].g_iRespawnAmount, 1); + g_esRespawnCache[tank].g_iRespawnCooldown = iGetSubSettingValue(apply, bHuman, g_esRespawnTeammate[tank].g_iRespawnCooldown, g_esRespawnPlayer[tank].g_iRespawnCooldown, g_esRespawnSpecial[iType].g_iRespawnCooldown, g_esRespawnAbility[iType].g_iRespawnCooldown, 1); + g_esRespawnCache[tank].g_iRespawnDuration = iGetSubSettingValue(apply, bHuman, g_esRespawnTeammate[tank].g_iRespawnDuration, g_esRespawnPlayer[tank].g_iRespawnDuration, g_esRespawnSpecial[iType].g_iRespawnDuration, g_esRespawnAbility[iType].g_iRespawnDuration, 1); + g_esRespawnCache[tank].g_iRespawnFilter = iGetSubSettingValue(apply, bHuman, g_esRespawnTeammate[tank].g_iRespawnFilter, g_esRespawnPlayer[tank].g_iRespawnFilter, g_esRespawnSpecial[iType].g_iRespawnFilter, g_esRespawnAbility[iType].g_iRespawnFilter, 1); g_esRespawnCache[tank].g_iRespawnMaxType = iGetSubSettingValue(apply, bHuman, g_esRespawnTeammate[tank].g_iRespawnMaxType, g_esRespawnPlayer[tank].g_iRespawnMaxType, g_esRespawnSpecial[iType].g_iRespawnMaxType, g_esRespawnAbility[iType].g_iRespawnMaxType, 1); g_esRespawnCache[tank].g_iRespawnMinType = iGetSubSettingValue(apply, bHuman, g_esRespawnTeammate[tank].g_iRespawnMinType, g_esRespawnPlayer[tank].g_iRespawnMinType, g_esRespawnSpecial[iType].g_iRespawnMinType, g_esRespawnAbility[iType].g_iRespawnMinType, 1); g_esRespawnCache[tank].g_iRespawnMessage = iGetSubSettingValue(apply, bHuman, g_esRespawnTeammate[tank].g_iRespawnMessage, g_esRespawnPlayer[tank].g_iRespawnMessage, g_esRespawnSpecial[iType].g_iRespawnMessage, g_esRespawnAbility[iType].g_iRespawnMessage, 1); + g_esRespawnCache[tank].g_iRespawnSight = iGetSubSettingValue(apply, bHuman, g_esRespawnTeammate[tank].g_iRespawnSight, g_esRespawnPlayer[tank].g_iRespawnSight, g_esRespawnSpecial[iType].g_iRespawnSight, g_esRespawnAbility[iType].g_iRespawnSight, 1); } else { @@ -629,13 +817,20 @@ public void MT_OnSettingsCached(int tank, bool apply, int type) g_esRespawnCache[tank].g_flRespawnChance = flGetSettingValue(apply, bHuman, g_esRespawnPlayer[tank].g_flRespawnChance, g_esRespawnAbility[iType].g_flRespawnChance, 1); g_esRespawnCache[tank].g_iHumanAbility = iGetSettingValue(apply, bHuman, g_esRespawnPlayer[tank].g_iHumanAbility, g_esRespawnAbility[iType].g_iHumanAbility, 1); g_esRespawnCache[tank].g_iHumanAmmo = iGetSettingValue(apply, bHuman, g_esRespawnPlayer[tank].g_iHumanAmmo, g_esRespawnAbility[iType].g_iHumanAmmo, 1); + g_esRespawnCache[tank].g_iHumanCooldown = iGetSettingValue(apply, bHuman, g_esRespawnPlayer[tank].g_iHumanCooldown, g_esRespawnAbility[iType].g_iHumanCooldown, 1); + g_esRespawnCache[tank].g_iHumanDuration = iGetSettingValue(apply, bHuman, g_esRespawnPlayer[tank].g_iHumanDuration, g_esRespawnAbility[iType].g_iHumanDuration, 1); + g_esRespawnCache[tank].g_iHumanMode = iGetSettingValue(apply, bHuman, g_esRespawnPlayer[tank].g_iHumanMode, g_esRespawnAbility[iType].g_iHumanMode, 1); g_esRespawnCache[tank].g_flOpenAreasOnly = flGetSettingValue(apply, bHuman, g_esRespawnPlayer[tank].g_flOpenAreasOnly, g_esRespawnAbility[iType].g_flOpenAreasOnly, 1); g_esRespawnCache[tank].g_iRequiresHumans = iGetSettingValue(apply, bHuman, g_esRespawnPlayer[tank].g_iRequiresHumans, g_esRespawnAbility[iType].g_iRequiresHumans, 1); g_esRespawnCache[tank].g_iRespawnAbility = iGetSettingValue(apply, bHuman, g_esRespawnPlayer[tank].g_iRespawnAbility, g_esRespawnAbility[iType].g_iRespawnAbility, 1); g_esRespawnCache[tank].g_iRespawnAmount = iGetSettingValue(apply, bHuman, g_esRespawnPlayer[tank].g_iRespawnAmount, g_esRespawnAbility[iType].g_iRespawnAmount, 1); + g_esRespawnCache[tank].g_iRespawnCooldown = iGetSettingValue(apply, bHuman, g_esRespawnPlayer[tank].g_iRespawnCooldown, g_esRespawnAbility[iType].g_iRespawnCooldown, 1); + g_esRespawnCache[tank].g_iRespawnDuration = iGetSettingValue(apply, bHuman, g_esRespawnPlayer[tank].g_iRespawnDuration, g_esRespawnAbility[iType].g_iRespawnDuration, 1); + g_esRespawnCache[tank].g_iRespawnFilter = iGetSettingValue(apply, bHuman, g_esRespawnPlayer[tank].g_iRespawnFilter, g_esRespawnAbility[iType].g_iRespawnFilter, 1); g_esRespawnCache[tank].g_iRespawnMaxType = iGetSettingValue(apply, bHuman, g_esRespawnPlayer[tank].g_iRespawnMaxType, g_esRespawnAbility[iType].g_iRespawnMaxType, 1); g_esRespawnCache[tank].g_iRespawnMinType = iGetSettingValue(apply, bHuman, g_esRespawnPlayer[tank].g_iRespawnMinType, g_esRespawnAbility[iType].g_iRespawnMinType, 1); g_esRespawnCache[tank].g_iRespawnMessage = iGetSettingValue(apply, bHuman, g_esRespawnPlayer[tank].g_iRespawnMessage, g_esRespawnAbility[iType].g_iRespawnMessage, 1); + g_esRespawnCache[tank].g_iRespawnSight = iGetSettingValue(apply, bHuman, g_esRespawnPlayer[tank].g_iRespawnSight, g_esRespawnAbility[iType].g_iRespawnSight, 1); } } @@ -690,6 +885,14 @@ public void MT_OnEventFired(Event event, const char[] name, bool dontBroadcast) vRemoveRespawn(iTank); } } + else if (StrEqual(name, "player_death")) + { + int iTankId = event.GetInt("userid"), iTank = GetClientOfUserId(iTankId); + if (MT_IsTankSupported(iTank, MT_CHECK_INDEX|MT_CHECK_INGAME)) + { + vRemoveRespawn(iTank); + } + } } #if defined MT_ABILITIES_MAIN2 @@ -698,9 +901,53 @@ void vRespawnPlayerEventKilled(int victim) public void MT_OnPlayerEventKilled(int victim, int attacker) #endif { - if (MT_IsTankSupported(victim, MT_CHECK_INDEX|MT_CHECK_INGAME) && MT_IsCustomTankSupported(victim) && g_esRespawnCache[victim].g_iRespawnAbility == 1 && g_esRespawnCache[victim].g_iComboAbility == 0 && GetRandomFloat(0.1, 100.0) <= g_esRespawnCache[victim].g_flRespawnChance) + if (bIsSpecialInfected(victim, MT_CHECK_INDEX|MT_CHECK_INGAME)) { - vRespawn(victim); + bool bRandom = false; + float flInfectedPos[3], flTankPos[3], flRange = 0.0; + int iPos = -1, iClass = 0, iFilter = 0, iTime = GetTime(); + GetClientAbsOrigin(victim, flInfectedPos); + for (int iTank = 1; iTank <= MaxClients; iTank++) + { + if (MT_IsTankSupported(iTank) && MT_IsCustomTankSupported(iTank) && g_esRespawnPlayer[iTank].g_bActivated2 && iTank != victim) + { + if ((g_esRespawnPlayer[iTank].g_iCooldown != -1 && g_esRespawnPlayer[iTank].g_iCooldown >= iTime) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esRespawnAbility[g_esRespawnPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esRespawnPlayer[iTank].g_iAccessFlags))) + { + continue; + } + + iPos = g_esRespawnAbility[g_esRespawnPlayer[iTank].g_iTankTypeRecorded].g_iComboPosition; + bRandom = (iPos != -1) ? true : GetRandomFloat(0.1, 100.0) <= g_esRespawnCache[iTank].g_flRespawnChance; + if ((g_esRespawnCache[iTank].g_iRespawnAbility == 1 || g_esRespawnCache[iTank].g_iRespawnAbility == 3) && bRandom) + { + flRange = (iPos != -1) ? MT_GetCombinationSetting(iTank, 9, iPos) : g_esRespawnCache[iTank].g_flRespawnRange; + GetClientAbsOrigin(iTank, flTankPos); + if (GetVectorDistance(flInfectedPos, flTankPos) <= flRange && bIsVisibleToPlayer(iTank, victim, g_esRespawnCache[iTank].g_iRespawnSight, .range = flRange)) + { + iClass = GetEntProp(victim, Prop_Send, "m_zombieClass"); + iFilter = g_esRespawnCache[iTank].g_iRespawnFilter; + if (iFilter == 0 || (iFilter & (1 << (iClass - 1)))) + { + switch (iClass) + { + case 1: vRespawn(iTank, flInfectedPos, "smoker"); + case 2: vRespawn(iTank, flInfectedPos, "boomer"); + case 3: vRespawn(iTank, flInfectedPos, "hunter"); + case 4: vRespawn(iTank, flInfectedPos, (g_bSecondGame ? "spitter" : "boomer")); + case 5: vRespawn(iTank, flInfectedPos, (g_bSecondGame ? "jockey" : "hunter")); + case 6: vRespawn(iTank, flInfectedPos, (g_bSecondGame ? "charger" : "smoker")); + } + } + } + } + + break; + } + } + } + else if (MT_IsTankSupported(victim, MT_CHECK_INDEX|MT_CHECK_INGAME) && MT_IsCustomTankSupported(victim) && (g_esRespawnCache[victim].g_iRespawnAbility == 2 || g_esRespawnCache[victim].g_iRespawnAbility == 3) && g_esRespawnCache[victim].g_iComboAbility == 0 && GetRandomFloat(0.1, 100.0) <= g_esRespawnCache[victim].g_flRespawnChance) + { + vRespawn2(victim, false); } } @@ -720,6 +967,23 @@ public Action MT_OnRewardSurvivor(int survivor, int tank, int &type, int priorit return Plugin_Continue; } +#if defined MT_ABILITIES_MAIN2 +void vRespawnAbilityActivated(int tank) +#else +public void MT_OnAbilityActivated(int tank) +#endif +{ + if (MT_IsTankSupported(tank, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_FAKECLIENT) && ((!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esRespawnAbility[g_esRespawnPlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esRespawnPlayer[tank].g_iAccessFlags)) || g_esRespawnCache[tank].g_iHumanAbility == 0)) + { + return; + } + + if (MT_IsTankSupported(tank) && (!bIsInfected(tank, MT_CHECK_FAKECLIENT) || g_esRespawnCache[tank].g_iHumanAbility != 1) && MT_IsCustomTankSupported(tank) && (g_esRespawnCache[tank].g_iRespawnAbility == 1 || g_esRespawnCache[tank].g_iRespawnAbility == 3) && g_esRespawnCache[tank].g_iComboAbility == 0 && !g_esRespawnPlayer[tank].g_bActivated2) + { + vRespawnAbility(tank); + } +} + #if defined MT_ABILITIES_MAIN2 void vRespawnButtonPressed(int tank, int button) #else @@ -733,22 +997,76 @@ public void MT_OnButtonPressed(int tank, int button) return; } - if ((button & MT_SPECIAL_KEY2) && g_esRespawnCache[tank].g_iRespawnAbility == 1 && g_esRespawnCache[tank].g_iHumanAbility == 1) + if ((button & MT_MAIN_KEY) && (g_esRespawnCache[tank].g_iRespawnAbility == 1 || g_esRespawnCache[tank].g_iRespawnAbility == 3) && g_esRespawnCache[tank].g_iHumanAbility == 1) + { + int iHumanMode = g_esRespawnCache[tank].g_iHumanMode, iTime = GetTime(); + bool bRecharging = g_esRespawnPlayer[tank].g_iCooldown != -1 && g_esRespawnPlayer[tank].g_iCooldown >= iTime; + + switch (iHumanMode) + { + case 0: + { + if (!g_esRespawnPlayer[tank].g_bActivated && !bRecharging) + { + vRespawnAbility(tank); + } + else if (g_esRespawnPlayer[tank].g_bActivated) + { + MT_PrintToChat(tank, "%s %t", MT_TAG3, "RespawnHuman3"); + } + else if (bRecharging) + { + MT_PrintToChat(tank, "%s %t", MT_TAG3, "RespawnHuman4", (g_esRespawnPlayer[tank].g_iCooldown - iTime)); + } + } + case 1, 2: + { + if ((iHumanMode == 2 && g_esRespawnPlayer[tank].g_bActivated) || (g_esRespawnPlayer[tank].g_iAmmoCount < g_esRespawnCache[tank].g_iHumanAmmo && g_esRespawnCache[tank].g_iHumanAmmo > 0)) + { + if (!g_esRespawnPlayer[tank].g_bActivated && !bRecharging) + { + g_esRespawnPlayer[tank].g_bActivated = true; + g_esRespawnPlayer[tank].g_iAmmoCount++; + + MT_PrintToChat(tank, "%s %t", MT_TAG3, "RespawnHuman", g_esRespawnPlayer[tank].g_iAmmoCount, g_esRespawnCache[tank].g_iHumanAmmo); + } + else if (g_esRespawnPlayer[tank].g_bActivated) + { + switch (iHumanMode) + { + case 1: MT_PrintToChat(tank, "%s %t", MT_TAG3, "RespawnHuman3"); + case 2: vRespawnReset2(tank); + } + } + else if (bRecharging) + { + MT_PrintToChat(tank, "%s %t", MT_TAG3, "RespawnHuman4", (g_esRespawnPlayer[tank].g_iCooldown - iTime)); + } + } + else + { + MT_PrintToChat(tank, "%s %t", MT_TAG3, "RespawnAmmo"); + } + } + } + } + + if ((button & MT_SPECIAL_KEY2) && (g_esRespawnCache[tank].g_iRespawnAbility == 2 || g_esRespawnCache[tank].g_iRespawnAbility == 3) && g_esRespawnCache[tank].g_iHumanAbility == 1) { - switch (g_esRespawnPlayer[tank].g_bActivated) + switch (g_esRespawnPlayer[tank].g_bActivated2) { - case true: MT_PrintToChat(tank, "%s %t", MT_TAG3, "RespawnHuman2"); + case true: MT_PrintToChat(tank, "%s %t", MT_TAG3, "RespawnHuman7"); case false: { - switch (g_esRespawnPlayer[tank].g_iAmmoCount < g_esRespawnCache[tank].g_iHumanAmmo && g_esRespawnCache[tank].g_iHumanAmmo > 0) + switch (g_esRespawnPlayer[tank].g_iAmmoCount2 < g_esRespawnCache[tank].g_iHumanAmmo && g_esRespawnCache[tank].g_iHumanAmmo > 0) { case true: { - g_esRespawnPlayer[tank].g_bActivated = true; + g_esRespawnPlayer[tank].g_bActivated2 = true; - MT_PrintToChat(tank, "%s %t", MT_TAG3, "RespawnHuman"); + MT_PrintToChat(tank, "%s %t", MT_TAG3, "RespawnHuman6"); } - case false: MT_PrintToChat(tank, "%s %t", MT_TAG3, "RespawnAmmo"); + case false: MT_PrintToChat(tank, "%s %t", MT_TAG3, "RespawnAmmo2"); } } } @@ -756,6 +1074,21 @@ public void MT_OnButtonPressed(int tank, int button) } } +#if defined MT_ABILITIES_MAIN2 +void vRespawnButtonReleased(int tank, int button) +#else +public void MT_OnButtonReleased(int tank, int button) +#endif +{ + if (MT_IsTankSupported(tank, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_ALIVE|MT_CHECK_FAKECLIENT) && g_esRespawnCache[tank].g_iHumanAbility == 1) + { + if ((button & MT_MAIN_KEY) && g_esRespawnCache[tank].g_iHumanMode == 1 && g_esRespawnPlayer[tank].g_bActivated && (g_esRespawnPlayer[tank].g_iCooldown == -1 || g_esRespawnPlayer[tank].g_iCooldown <= GetTime())) + { + vRespawnReset2(tank); + } + } +} + #if defined MT_ABILITIES_MAIN2 void vRespawnChangeType(int tank, int oldType, bool revert) #else @@ -770,24 +1103,79 @@ public void MT_OnChangeType(int tank, int oldType, int newType, bool revert) vRemoveRespawn(tank, revert); } -void vRespawn(int tank) +void vRespawn(int tank, float pos[3], const char[] type) { if (bIsAreaNarrow(tank, g_esRespawnCache[tank].g_flOpenAreasOnly) || bIsAreaWide(tank, g_esRespawnCache[tank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esRespawnPlayer[tank].g_iTankType, tank) || (g_esRespawnCache[tank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esRespawnCache[tank].g_iRequiresHumans) || (!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esRespawnAbility[g_esRespawnPlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esRespawnPlayer[tank].g_iAccessFlags))) { return; } - if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esRespawnCache[tank].g_iHumanAbility == 1 && !g_esRespawnPlayer[tank].g_bActivated) + bool[] bExists = new bool[MaxClients + 1]; + for (int iSpecial = 1; iSpecial <= MaxClients; iSpecial++) { - g_esRespawnPlayer[tank].g_bActivated = false; + bExists[iSpecial] = false; + if (bIsSpecialInfected(iSpecial, MT_CHECK_INGAME)) + { + bExists[iSpecial] = true; + } + } + + vCheatCommand(tank, (g_bSecondGame ? "z_spawn_old" : "z_spawn"), type); + + int iInfected = 0; + for (int iSpecial = 1; iSpecial <= MaxClients; iSpecial++) + { + if (bIsSpecialInfected(iSpecial, MT_CHECK_INGAME|MT_CHECK_ALIVE) && !bExists[iSpecial]) + { + iInfected = iSpecial; + + break; + } + } + + if (bIsSpecialInfected(iInfected)) + { + TeleportEntity(iInfected, pos); + EmitSoundToAll(SOUND_ELECTRICITY, iInfected); + + if (g_iGraphicsLevel > 2) + { + vAttachParticle(iInfected, PARTICLE_ELECTRICITY, 1.0); + } + + if (g_esRespawnCache[tank].g_iRespawnMessage == 1) + { + char sTankName[64]; + MT_GetTankName(tank, sTankName); + MT_PrintToChatAll("%s %t", MT_TAG2, "Respawn2", sTankName); + MT_LogMessage(MT_LOG_ABILITY, "%s %T", MT_TAG, "Respawn2", LANG_SERVER, sTankName); + } + } +} + +void vRespawn2(int tank, bool both) +{ + if (both) + { + g_esRespawnPlayer[tank].g_bActivated = true; + } + + if (bIsAreaNarrow(tank, g_esRespawnCache[tank].g_flOpenAreasOnly) || bIsAreaWide(tank, g_esRespawnCache[tank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esRespawnPlayer[tank].g_iTankType, tank) || (g_esRespawnCache[tank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esRespawnCache[tank].g_iRequiresHumans) || (!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esRespawnAbility[g_esRespawnPlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esRespawnPlayer[tank].g_iAccessFlags))) + { + return; + } + + if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esRespawnCache[tank].g_iHumanAbility == 1 && !g_esRespawnPlayer[tank].g_bActivated2) + { + g_esRespawnPlayer[tank].g_bActivated2 = false; g_esRespawnPlayer[tank].g_iCount = 0; return; } - if (g_esRespawnPlayer[tank].g_iCount < g_esRespawnCache[tank].g_iRespawnAmount && (!bIsInfected(tank, MT_CHECK_FAKECLIENT) || (g_esRespawnPlayer[tank].g_iAmmoCount < g_esRespawnCache[tank].g_iHumanAmmo && g_esRespawnCache[tank].g_iHumanAmmo > 0))) + if (g_esRespawnPlayer[tank].g_iCount < g_esRespawnCache[tank].g_iRespawnAmount && (!bIsInfected(tank, MT_CHECK_FAKECLIENT) || (g_esRespawnPlayer[tank].g_iAmmoCount2 < g_esRespawnCache[tank].g_iHumanAmmo && g_esRespawnCache[tank].g_iHumanAmmo > 0))) { - g_esRespawnPlayer[tank].g_bActivated = false; + g_esRespawnPlayer[tank].g_bActivated2 = false; g_esRespawnPlayer[tank].g_bRespawning[0] = true; g_esRespawnPlayer[tank].g_bRespawning[1] = true; g_esRespawnPlayer[tank].g_bRespawning[2] = true; @@ -796,9 +1184,9 @@ void vRespawn(int tank) if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esRespawnCache[tank].g_iHumanAbility == 1) { - g_esRespawnPlayer[tank].g_iAmmoCount++; + g_esRespawnPlayer[tank].g_iAmmoCount2++; - MT_PrintToChat(tank, "%s %t", MT_TAG3, "RespawnHuman3", g_esRespawnPlayer[tank].g_iAmmoCount, g_esRespawnCache[tank].g_iHumanAmmo); + MT_PrintToChat(tank, "%s %t", MT_TAG3, "RespawnHuman8", g_esRespawnPlayer[tank].g_iAmmoCount2, g_esRespawnCache[tank].g_iHumanAmmo); } bool[] bExists = new bool[MaxClients + 1]; @@ -813,8 +1201,8 @@ void vRespawn(int tank) switch (g_esRespawnCache[tank].g_iRespawnMinType == 0 || g_esRespawnCache[tank].g_iRespawnMaxType == 0) { - case true: vRespawn2(tank); - case false: vRespawn2(tank, g_esRespawnCache[tank].g_iRespawnMinType, g_esRespawnCache[tank].g_iRespawnMaxType); + case true: vRespawn3(tank); + case false: vRespawn3(tank, g_esRespawnCache[tank].g_iRespawnMinType, g_esRespawnCache[tank].g_iRespawnMaxType); } int iTank = 0; @@ -823,8 +1211,8 @@ void vRespawn(int tank) if (bIsInfected(iPlayer, MT_CHECK_INGAME|MT_CHECK_ALIVE) && !bExists[iPlayer] && iPlayer != tank) { iTank = iPlayer; - g_esRespawnPlayer[iTank].g_bActivated = false; - g_esRespawnPlayer[iTank].g_iAmmoCount = g_esRespawnPlayer[tank].g_iAmmoCount; + g_esRespawnPlayer[iTank].g_bActivated2 = false; + g_esRespawnPlayer[iTank].g_iAmmoCount2 = g_esRespawnPlayer[tank].g_iAmmoCount2; g_esRespawnPlayer[iTank].g_iCount = g_esRespawnPlayer[tank].g_iCount; vRemoveRespawn(tank); @@ -859,17 +1247,18 @@ void vRespawn(int tank) if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esRespawnCache[tank].g_iHumanAbility == 1) { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "RespawnAmmo"); + MT_PrintToChat(tank, "%s %t", MT_TAG3, "RespawnAmmo2"); } } } -void vRespawn2(int tank, int min = 0, int max = 0) +void vRespawn3(int tank, int min = 0, int max = 0) { int iMin = (min > 0) ? min : MT_GetMinType(), - iMax = (max > 0) ? max : MT_GetMaxType(), - iSpecType = iGetInfectedType(tank), - iTypeCount = 0, iTankTypes[MT_MAXTYPES + 1]; + iMax = (max > 0) ? max : MT_GetMaxType(), + iSpecType = iGetInfectedType(tank), + iTypeCount = 0, iTankTypes[MT_MAXTYPES + 1]; + for (int iIndex = iMin; iIndex <= iMax; iIndex++) { if (!MT_IsTypeEnabled(iIndex, tank) || !MT_CanTypeSpawn(iIndex, iSpecType) || MT_DoesTypeRequireHumans(iIndex, tank)) @@ -882,24 +1271,65 @@ void vRespawn2(int tank, int min = 0, int max = 0) } int iType = (iTypeCount > 0) ? iTankTypes[MT_GetRandomInt(1, iTypeCount)] : g_esRespawnPlayer[tank].g_iTankType; - MT_SpawnTank(tank, iType); + MT_SpawnTank(tank, iType, iSpecType); EmitSoundToAll(SOUND_CHARGE, tank); } +void vRespawnAbility(int tank) +{ + int iTime = GetTime(); + if ((g_esRespawnPlayer[tank].g_iCooldown != -1 && g_esRespawnPlayer[tank].g_iCooldown >= iTime) || bIsAreaNarrow(tank, g_esRespawnCache[tank].g_flOpenAreasOnly) || bIsAreaWide(tank, g_esRespawnCache[tank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esRespawnPlayer[tank].g_iTankType, tank) || (g_esRespawnCache[tank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esRespawnCache[tank].g_iRequiresHumans) || (!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esRespawnAbility[g_esRespawnPlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esRespawnPlayer[tank].g_iAccessFlags))) + { + return; + } + + if (!bIsInfected(tank, MT_CHECK_FAKECLIENT) || (g_esRespawnPlayer[tank].g_iAmmoCount < g_esRespawnCache[tank].g_iHumanAmmo && g_esRespawnCache[tank].g_iHumanAmmo > 0)) + { + if (GetRandomFloat(0.1, 100.0) <= g_esRespawnCache[tank].g_flRespawnChance) + { + g_esRespawnPlayer[tank].g_bActivated = true; + + if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esRespawnCache[tank].g_iHumanAbility == 1) + { + int iPos = g_esRespawnAbility[g_esRespawnPlayer[tank].g_iTankTypeRecorded].g_iComboPosition, iDuration = (iPos != -1) ? RoundToNearest(MT_GetCombinationSetting(tank, 5, iPos)) : g_esRespawnCache[tank].g_iRespawnDuration; + iDuration = (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esRespawnCache[tank].g_iHumanAbility == 1) ? g_esRespawnCache[tank].g_iHumanDuration : iDuration; + g_esRespawnPlayer[tank].g_iAmmoCount++; + g_esRespawnPlayer[tank].g_iDuration = (iTime + iDuration); + + MT_PrintToChat(tank, "%s %t", MT_TAG3, "RespawnHuman", g_esRespawnPlayer[tank].g_iAmmoCount, g_esRespawnCache[tank].g_iHumanAmmo); + } + } + else if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esRespawnCache[tank].g_iHumanAbility == 1) + { + MT_PrintToChat(tank, "%s %t", MT_TAG3, "RespawnHuman2"); + } + } + else if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esRespawnCache[tank].g_iHumanAbility == 1) + { + MT_PrintToChat(tank, "%s %t", MT_TAG3, "RespawnAmmo"); + } +} + void vRespawnCopyStats2(int oldTank, int newTank) { - g_esRespawnPlayer[newTank].g_bActivated = g_esRespawnPlayer[oldTank].g_bActivated; + g_esRespawnPlayer[newTank].g_bActivated2 = g_esRespawnPlayer[oldTank].g_bActivated2; g_esRespawnPlayer[newTank].g_iAmmoCount = g_esRespawnPlayer[oldTank].g_iAmmoCount; + g_esRespawnPlayer[newTank].g_iAmmoCount2 = g_esRespawnPlayer[oldTank].g_iAmmoCount2; + g_esRespawnPlayer[newTank].g_iCooldown = g_esRespawnPlayer[oldTank].g_iCooldown; g_esRespawnPlayer[newTank].g_iCount = g_esRespawnPlayer[oldTank].g_iCount; } void vRemoveRespawn(int tank, bool revert = true) { g_esRespawnPlayer[tank].g_bActivated = false; + g_esRespawnPlayer[tank].g_bActivated2 = false; + g_esRespawnPlayer[tank].g_iAmmoCount = 0; + g_esRespawnPlayer[tank].g_iCooldown = -1; + g_esRespawnPlayer[tank].g_iDuration = -1; if (revert) { - g_esRespawnPlayer[tank].g_iAmmoCount = 0; + g_esRespawnPlayer[tank].g_iAmmoCount2 = 0; g_esRespawnPlayer[tank].g_iCount = 0; } } @@ -915,13 +1345,28 @@ void vRespawnReset() } } -void tTimerRespawnCombo(Handle timer, int userid) +void vRespawnReset2(int tank) +{ + g_esRespawnPlayer[tank].g_bActivated = false; + + int iTime = GetTime(), iPos = g_esRespawnAbility[g_esRespawnPlayer[tank].g_iTankTypeRecorded].g_iComboPosition, iCooldown = (iPos != -1) ? RoundToNearest(MT_GetCombinationSetting(tank, 2, iPos)) : g_esRespawnCache[tank].g_iRespawnCooldown; + iCooldown = (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esRespawnCache[tank].g_iHumanAbility == 1 && g_esRespawnCache[tank].g_iHumanMode == 0 && g_esRespawnPlayer[tank].g_iAmmoCount < g_esRespawnCache[tank].g_iHumanAmmo && g_esRespawnCache[tank].g_iHumanAmmo > 0) ? g_esRespawnCache[tank].g_iHumanCooldown : iCooldown; + g_esRespawnPlayer[tank].g_iCooldown = (iTime + iCooldown); + if (g_esRespawnPlayer[tank].g_iCooldown != -1 && g_esRespawnPlayer[tank].g_iCooldown >= iTime) + { + MT_PrintToChat(tank, "%s %t", MT_TAG3, "RespawnHuman5", (g_esRespawnPlayer[tank].g_iCooldown - iTime)); + } +} + +Action tTimerRespawnCombo(Handle timer, int userid) { int iTank = GetClientOfUserId(userid); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esRespawnAbility[g_esRespawnPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esRespawnPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esRespawnPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esRespawnCache[iTank].g_iRespawnAbility == 0) { - return; + return Plugin_Stop; } - vRespawn(iTank); + vRespawn2(iTank, true); + + return Plugin_Continue; } \ No newline at end of file diff --git a/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_restart.sp b/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_restart.sp index ffa91df9d8..758e342e96 100644 --- a/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_restart.sp +++ b/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_restart.sp @@ -1,6 +1,6 @@ /** - * Mutant Tanks: a L4D/L4D2 SourceMod Plugin - * Copyright (C) 2024 Alfred "Psyk0tik" Llagas + * Mutant Tanks: A L4D/L4D2 SourceMod Plugin + * Copyright (C) 2017-2025 Alfred "Psyk0tik" Llagas * * 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. * @@ -29,6 +29,8 @@ public Plugin myinfo = bool g_bDedicated, g_bLateLoad, g_bSecondGame; +int g_iGraphicsLevel; + public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max) { switch (GetEngineVersion()) @@ -879,7 +881,9 @@ public void MT_OnSettingsCached(int tank, bool apply, int type) g_esRestartPlayer[tank].g_iTankTypeRecorded = apply ? MT_GetRecordedTankType(tank, type) : 0; g_esRestartPlayer[tank].g_iTankType = apply ? type : 0; int iType = g_esRestartPlayer[tank].g_iTankTypeRecorded; - +#if !defined MT_ABILITIES_MAIN2 + g_iGraphicsLevel = MT_GetGraphicsLevel(); +#endif if (bIsSpecialInfected(tank, MT_CHECK_INDEX|MT_CHECK_INGAME)) { g_esRestartCache[tank].g_flCloseAreasOnly = flGetSubSettingValue(apply, bHuman, g_esRestartTeammate[tank].g_flCloseAreasOnly, g_esRestartPlayer[tank].g_flCloseAreasOnly, g_esRestartSpecial[iType].g_flCloseAreasOnly, g_esRestartAbility[iType].g_flCloseAreasOnly, 1); @@ -1244,9 +1248,13 @@ void vRestartHit(int survivor, int tank, float random, float chance, int enabled ExplodeString(g_esRestartCache[tank].g_sRestartLoadout, ",", sItems, sizeof sItems, sizeof sItems[]); MT_RespawnSurvivor(survivor); vRemoveWeapons(survivor); - vAttachParticle(survivor, PARTICLE_ELECTRICITY, 1.0); EmitSoundToAll(SOUND_ELECTRICITY, survivor); + if (g_iGraphicsLevel > 2) + { + vAttachParticle(survivor, PARTICLE_ELECTRICITY, 1.0); + } + for (int iItem = 0; iItem < (sizeof sItems); iItem++) { if (sItems[iItem][0] != '\0') @@ -1376,35 +1384,37 @@ bool bIsSurvivorInCheckpoint(int survivor, bool start) return bReturn || bReturn2; } -void tTimerRestartCombo(Handle timer, DataPack pack) +Action tTimerRestartCombo(Handle timer, DataPack pack) { pack.Reset(); int iTank = GetClientOfUserId(pack.ReadCell()); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esRestartAbility[g_esRestartPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esRestartPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esRestartPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esRestartCache[iTank].g_iRestartAbility == 0) { - return; + return Plugin_Stop; } float flRandom = pack.ReadFloat(); int iPos = pack.ReadCell(); vRestartAbility(iTank, flRandom, iPos); + + return Plugin_Continue; } -void tTimerRestartCombo2(Handle timer, DataPack pack) +Action tTimerRestartCombo2(Handle timer, DataPack pack) { pack.Reset(); int iSurvivor = GetClientOfUserId(pack.ReadCell()); if (!bIsSurvivor(iSurvivor)) { - return; + return Plugin_Stop; } int iTank = GetClientOfUserId(pack.ReadCell()); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esRestartAbility[g_esRestartPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esRestartPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esRestartPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esRestartCache[iTank].g_iRestartHit == 0) { - return; + return Plugin_Stop; } float flRandom = pack.ReadFloat(), flChance = pack.ReadFloat(); @@ -1419,4 +1429,6 @@ void tTimerRestartCombo2(Handle timer, DataPack pack) { vRestartHit(iSurvivor, iTank, flRandom, flChance, g_esRestartCache[iTank].g_iRestartHit, MT_MESSAGE_MELEE, MT_ATTACK_MELEE, iPos); } + + return Plugin_Continue; } \ No newline at end of file diff --git a/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_rock.sp b/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_rock.sp index 021f57cb35..69b2ad4d40 100644 --- a/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_rock.sp +++ b/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_rock.sp @@ -1,6 +1,6 @@ /** - * Mutant Tanks: a L4D/L4D2 SourceMod Plugin - * Copyright (C) 2024 Alfred "Psyk0tik" Llagas + * Mutant Tanks: A L4D/L4D2 SourceMod Plugin + * Copyright (C) 2017-2025 Alfred "Psyk0tik" Llagas * * 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. * @@ -22,7 +22,7 @@ public Plugin myinfo = { name = "[MT] Rock Ability", author = MT_AUTHOR, - description = "The Mutant Tank creates rock showers.", + description = "The Mutant Tank creates rock showers and spams rocks at survivors.", version = MT_VERSION, url = MT_URL }; @@ -76,13 +76,14 @@ enum struct esRockPlayer int g_iHumanDuration; int g_iHumanMode; int g_iImmunityFlags; - int g_iLauncher; + int g_iLauncher[2]; int g_iRequiresHumans; int g_iRockAbility; int g_iRockCooldown; int g_iRockDamage; int g_iRockDuration; int g_iRockMessage; + int g_iRockMode; int g_iTankType; int g_iTankTypeRecorded; } @@ -109,6 +110,7 @@ enum struct esRockTeammate int g_iRockDamage; int g_iRockDuration; int g_iRockMessage; + int g_iRockMode; } esRockTeammate g_esRockTeammate[MAXPLAYERS + 1]; @@ -136,6 +138,7 @@ enum struct esRockAbility int g_iRockDamage; int g_iRockDuration; int g_iRockMessage; + int g_iRockMode; } esRockAbility g_esRockAbility[MT_MAXTYPES + 1]; @@ -160,6 +163,7 @@ enum struct esRockSpecial int g_iRockDamage; int g_iRockDuration; int g_iRockMessage; + int g_iRockMode; } esRockSpecial g_esRockSpecial[MT_MAXTYPES + 1]; @@ -184,6 +188,7 @@ enum struct esRockCache int g_iRockDamage; int g_iRockDuration; int g_iRockMessage; + int g_iRockMode; } esRockCache g_esRockCache[MAXPLAYERS + 1]; @@ -215,7 +220,8 @@ public void OnClientPutInServer(int client) #endif { SDKHook(client, SDKHook_OnTakeDamage, OnRockTakeDamage); - vRemoveRock(client); + vRemoveRock(client, 0); + vRemoveRock(client, 1); } #if defined MT_ABILITIES_MAIN2 @@ -224,7 +230,8 @@ void vRockClientDisconnect_Post(int client) public void OnClientDisconnect_Post(int client) #endif { - vRemoveRock(client); + vRemoveRock(client, 0); + vRemoveRock(client, 1); } #if defined MT_ABILITIES_MAIN2 @@ -297,7 +304,15 @@ int iRockMenuHandler(Menu menu, MenuAction action, int param1, int param2) case 0: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esRockCache[param1].g_iRockAbility == 0) ? "AbilityStatus1" : "AbilityStatus2"); case 1: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityAmmo", (g_esRockCache[param1].g_iHumanAmmo - g_esRockPlayer[param1].g_iAmmoCount), g_esRockCache[param1].g_iHumanAmmo); case 2: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtons"); - case 3: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esRockCache[param1].g_iHumanMode == 0) ? "AbilityButtonMode1" : "AbilityButtonMode2"); + case 3: + { + switch (g_esRockCache[param1].g_iHumanMode) + { + case 0: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtonMode1"); + case 1: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtonMode2"); + case 2: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtonMode3"); + } + } case 4: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityCooldown", ((g_esRockCache[param1].g_iHumanAbility == 1) ? g_esRockCache[param1].g_iHumanCooldown : g_esRockCache[param1].g_iRockCooldown)); case 5: MT_PrintToChat(param1, "%s %t", MT_TAG3, "RockDetails"); case 6: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityDuration2", ((g_esRockCache[param1].g_iHumanAbility == 1) ? g_esRockCache[param1].g_iHumanDuration : g_esRockCache[param1].g_iRockDuration)); @@ -392,7 +407,8 @@ Action OnRockTakeDamage(int victim, int &attacker, int &inflictor, float &damage if (bIsValidEntity(iLauncher) && bIsInfected(iThrower, MT_CHECK_INDEX|MT_CHECK_INGAME)) { int iTank = GetEntPropEnt(iLauncher, Prop_Data, "m_hOwnerEntity"); - if (iThrower == iTank && MT_IsTankSupported(iTank) && MT_IsCustomTankSupported(iTank) && g_esRockCache[iTank].g_iRockAbility == 1 && g_esRockPlayer[iTank].g_iLauncher != INVALID_ENT_REFERENCE && iLauncher == EntRefToEntIndex(g_esRockPlayer[iTank].g_iLauncher) && (MT_HasAdminAccess(iTank) || bHasAdminAccess(iTank, g_esRockAbility[g_esRockPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esRockPlayer[iTank].g_iAccessFlags))) + bool bCheck = (g_esRockPlayer[iTank].g_iLauncher[0] != INVALID_ENT_REFERENCE && iLauncher == EntRefToEntIndex(g_esRockPlayer[iTank].g_iLauncher[0])) || (g_esRockPlayer[iTank].g_iLauncher[1] != INVALID_ENT_REFERENCE && iLauncher == EntRefToEntIndex(g_esRockPlayer[iTank].g_iLauncher[1])); + if (iThrower == iTank && MT_IsTankSupported(iTank) && MT_IsCustomTankSupported(iTank) && g_esRockCache[iTank].g_iRockAbility == 1 && bCheck && (MT_HasAdminAccess(iTank) || bHasAdminAccess(iTank, g_esRockAbility[g_esRockPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esRockPlayer[iTank].g_iAccessFlags))) { if (bIsInfected(victim) || (bIsSurvivor(victim) && (MT_IsAdminImmune(victim, iTank) || bIsAdminImmune(victim, g_esRockPlayer[iTank].g_iTankType, g_esRockAbility[g_esRockPlayer[iTank].g_iTankTypeRecorded].g_iImmunityFlags, g_esRockPlayer[victim].g_iImmunityFlags)))) { @@ -524,6 +540,7 @@ public void MT_OnConfigsLoad(int mode) g_esRockAbility[iIndex].g_iRockDamage = 5; g_esRockAbility[iIndex].g_iRockDuration = 5; g_esRockAbility[iIndex].g_flRockInterval = 0.2; + g_esRockAbility[iIndex].g_iRockMode = 0; g_esRockAbility[iIndex].g_flRockRadius[0] = -1.25; g_esRockAbility[iIndex].g_flRockRadius[1] = 1.25; @@ -543,6 +560,7 @@ public void MT_OnConfigsLoad(int mode) g_esRockSpecial[iIndex].g_iRockDamage = -1; g_esRockSpecial[iIndex].g_iRockDuration = -1; g_esRockSpecial[iIndex].g_flRockInterval = -1.0; + g_esRockSpecial[iIndex].g_iRockMode = -1; g_esRockSpecial[iIndex].g_flRockRadius[0] = 1.0; g_esRockSpecial[iIndex].g_flRockRadius[1] = -1.0; } @@ -569,6 +587,7 @@ public void MT_OnConfigsLoad(int mode) g_esRockPlayer[iPlayer].g_iRockDamage = -1; g_esRockPlayer[iPlayer].g_iRockDuration = -1; g_esRockPlayer[iPlayer].g_flRockInterval = -1.0; + g_esRockPlayer[iPlayer].g_iRockMode = -1; g_esRockPlayer[iPlayer].g_flRockRadius[0] = 1.0; g_esRockPlayer[iPlayer].g_flRockRadius[1] = -1.0; @@ -588,6 +607,7 @@ public void MT_OnConfigsLoad(int mode) g_esRockTeammate[iPlayer].g_iRockDamage = -1; g_esRockTeammate[iPlayer].g_iRockDuration = -1; g_esRockTeammate[iPlayer].g_flRockInterval = -1.0; + g_esRockTeammate[iPlayer].g_iRockMode = -1; g_esRockTeammate[iPlayer].g_flRockRadius[0] = 1.0; g_esRockTeammate[iPlayer].g_flRockRadius[1] = -1.0; } @@ -611,7 +631,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esRockTeammate[admin].g_iHumanAmmo = iGetKeyValue(subsection, MT_ROCK_SECTION, MT_ROCK_SECTION2, MT_ROCK_SECTION3, MT_ROCK_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esRockTeammate[admin].g_iHumanAmmo, value, -1, 99999); g_esRockTeammate[admin].g_iHumanCooldown = iGetKeyValue(subsection, MT_ROCK_SECTION, MT_ROCK_SECTION2, MT_ROCK_SECTION3, MT_ROCK_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esRockTeammate[admin].g_iHumanCooldown, value, -1, 99999); g_esRockTeammate[admin].g_iHumanDuration = iGetKeyValue(subsection, MT_ROCK_SECTION, MT_ROCK_SECTION2, MT_ROCK_SECTION3, MT_ROCK_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esRockTeammate[admin].g_iHumanDuration, value, -1, 99999); - g_esRockTeammate[admin].g_iHumanMode = iGetKeyValue(subsection, MT_ROCK_SECTION, MT_ROCK_SECTION2, MT_ROCK_SECTION3, MT_ROCK_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esRockTeammate[admin].g_iHumanMode, value, -1, 1); + g_esRockTeammate[admin].g_iHumanMode = iGetKeyValue(subsection, MT_ROCK_SECTION, MT_ROCK_SECTION2, MT_ROCK_SECTION3, MT_ROCK_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esRockTeammate[admin].g_iHumanMode, value, -1, 2); g_esRockTeammate[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_ROCK_SECTION, MT_ROCK_SECTION2, MT_ROCK_SECTION3, MT_ROCK_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esRockTeammate[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); g_esRockTeammate[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_ROCK_SECTION, MT_ROCK_SECTION2, MT_ROCK_SECTION3, MT_ROCK_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esRockTeammate[admin].g_iRequiresHumans, value, -1, 32); g_esRockTeammate[admin].g_iRockAbility = iGetKeyValue(subsection, MT_ROCK_SECTION, MT_ROCK_SECTION2, MT_ROCK_SECTION3, MT_ROCK_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esRockTeammate[admin].g_iRockAbility, value, -1, 1); @@ -621,6 +641,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esRockTeammate[admin].g_iRockDamage = iGetKeyValue(subsection, MT_ROCK_SECTION, MT_ROCK_SECTION2, MT_ROCK_SECTION3, MT_ROCK_SECTION4, key, "RockDamage", "Rock Damage", "Rock_Damage", "damage", g_esRockTeammate[admin].g_iRockDamage, value, -1, 99999); g_esRockTeammate[admin].g_iRockDuration = iGetKeyValue(subsection, MT_ROCK_SECTION, MT_ROCK_SECTION2, MT_ROCK_SECTION3, MT_ROCK_SECTION4, key, "RockDuration", "Rock Duration", "Rock_Duration", "duration", g_esRockTeammate[admin].g_iRockDuration, value, -1, 99999); g_esRockTeammate[admin].g_flRockInterval = flGetKeyValue(subsection, MT_ROCK_SECTION, MT_ROCK_SECTION2, MT_ROCK_SECTION3, MT_ROCK_SECTION4, key, "RockInterval", "Rock Interval", "Rock_Interval", "interval", g_esRockTeammate[admin].g_flRockInterval, value, -1.0, 1.0); + g_esRockTeammate[admin].g_iRockMode = iGetKeyValue(subsection, MT_ROCK_SECTION, MT_ROCK_SECTION2, MT_ROCK_SECTION3, MT_ROCK_SECTION4, key, "RockMode", "Rock Mode", "Rock_Mode", "mode", g_esRockTeammate[admin].g_iRockMode, value, -1, 2); } else { @@ -630,7 +651,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esRockPlayer[admin].g_iHumanAmmo = iGetKeyValue(subsection, MT_ROCK_SECTION, MT_ROCK_SECTION2, MT_ROCK_SECTION3, MT_ROCK_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esRockPlayer[admin].g_iHumanAmmo, value, -1, 99999); g_esRockPlayer[admin].g_iHumanCooldown = iGetKeyValue(subsection, MT_ROCK_SECTION, MT_ROCK_SECTION2, MT_ROCK_SECTION3, MT_ROCK_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esRockPlayer[admin].g_iHumanCooldown, value, -1, 99999); g_esRockPlayer[admin].g_iHumanDuration = iGetKeyValue(subsection, MT_ROCK_SECTION, MT_ROCK_SECTION2, MT_ROCK_SECTION3, MT_ROCK_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esRockPlayer[admin].g_iHumanDuration, value, -1, 99999); - g_esRockPlayer[admin].g_iHumanMode = iGetKeyValue(subsection, MT_ROCK_SECTION, MT_ROCK_SECTION2, MT_ROCK_SECTION3, MT_ROCK_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esRockPlayer[admin].g_iHumanMode, value, -1, 1); + g_esRockPlayer[admin].g_iHumanMode = iGetKeyValue(subsection, MT_ROCK_SECTION, MT_ROCK_SECTION2, MT_ROCK_SECTION3, MT_ROCK_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esRockPlayer[admin].g_iHumanMode, value, -1, 2); g_esRockPlayer[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_ROCK_SECTION, MT_ROCK_SECTION2, MT_ROCK_SECTION3, MT_ROCK_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esRockPlayer[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); g_esRockPlayer[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_ROCK_SECTION, MT_ROCK_SECTION2, MT_ROCK_SECTION3, MT_ROCK_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esRockPlayer[admin].g_iRequiresHumans, value, -1, 32); g_esRockPlayer[admin].g_iRockAbility = iGetKeyValue(subsection, MT_ROCK_SECTION, MT_ROCK_SECTION2, MT_ROCK_SECTION3, MT_ROCK_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esRockPlayer[admin].g_iRockAbility, value, -1, 1); @@ -640,6 +661,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esRockPlayer[admin].g_iRockDamage = iGetKeyValue(subsection, MT_ROCK_SECTION, MT_ROCK_SECTION2, MT_ROCK_SECTION3, MT_ROCK_SECTION4, key, "RockDamage", "Rock Damage", "Rock_Damage", "damage", g_esRockPlayer[admin].g_iRockDamage, value, -1, 99999); g_esRockPlayer[admin].g_iRockDuration = iGetKeyValue(subsection, MT_ROCK_SECTION, MT_ROCK_SECTION2, MT_ROCK_SECTION3, MT_ROCK_SECTION4, key, "RockDuration", "Rock Duration", "Rock_Duration", "duration", g_esRockPlayer[admin].g_iRockDuration, value, -1, 99999); g_esRockPlayer[admin].g_flRockInterval = flGetKeyValue(subsection, MT_ROCK_SECTION, MT_ROCK_SECTION2, MT_ROCK_SECTION3, MT_ROCK_SECTION4, key, "RockInterval", "Rock Interval", "Rock_Interval", "interval", g_esRockPlayer[admin].g_flRockInterval, value, -1.0, 1.0); + g_esRockPlayer[admin].g_iRockMode = iGetKeyValue(subsection, MT_ROCK_SECTION, MT_ROCK_SECTION2, MT_ROCK_SECTION3, MT_ROCK_SECTION4, key, "RockMode", "Rock Mode", "Rock_Mode", "mode", g_esRockPlayer[admin].g_iRockMode, value, -1, 2); g_esRockPlayer[admin].g_iAccessFlags = iGetAdminFlagsValue(subsection, MT_ROCK_SECTION, MT_ROCK_SECTION2, MT_ROCK_SECTION3, MT_ROCK_SECTION4, key, "AccessFlags", "Access Flags", "Access_Flags", "access", value); g_esRockPlayer[admin].g_iImmunityFlags = iGetAdminFlagsValue(subsection, MT_ROCK_SECTION, MT_ROCK_SECTION2, MT_ROCK_SECTION3, MT_ROCK_SECTION4, key, "ImmunityFlags", "Immunity Flags", "Immunity_Flags", "immunity", value); } @@ -677,7 +699,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esRockSpecial[type].g_iHumanAmmo = iGetKeyValue(subsection, MT_ROCK_SECTION, MT_ROCK_SECTION2, MT_ROCK_SECTION3, MT_ROCK_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esRockSpecial[type].g_iHumanAmmo, value, -1, 99999); g_esRockSpecial[type].g_iHumanCooldown = iGetKeyValue(subsection, MT_ROCK_SECTION, MT_ROCK_SECTION2, MT_ROCK_SECTION3, MT_ROCK_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esRockSpecial[type].g_iHumanCooldown, value, -1, 99999); g_esRockSpecial[type].g_iHumanDuration = iGetKeyValue(subsection, MT_ROCK_SECTION, MT_ROCK_SECTION2, MT_ROCK_SECTION3, MT_ROCK_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esRockSpecial[type].g_iHumanDuration, value, -1, 99999); - g_esRockSpecial[type].g_iHumanMode = iGetKeyValue(subsection, MT_ROCK_SECTION, MT_ROCK_SECTION2, MT_ROCK_SECTION3, MT_ROCK_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esRockSpecial[type].g_iHumanMode, value, -1, 1); + g_esRockSpecial[type].g_iHumanMode = iGetKeyValue(subsection, MT_ROCK_SECTION, MT_ROCK_SECTION2, MT_ROCK_SECTION3, MT_ROCK_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esRockSpecial[type].g_iHumanMode, value, -1, 2); g_esRockSpecial[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_ROCK_SECTION, MT_ROCK_SECTION2, MT_ROCK_SECTION3, MT_ROCK_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esRockSpecial[type].g_flOpenAreasOnly, value, -1.0, 99999.0); g_esRockSpecial[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_ROCK_SECTION, MT_ROCK_SECTION2, MT_ROCK_SECTION3, MT_ROCK_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esRockSpecial[type].g_iRequiresHumans, value, -1, 32); g_esRockSpecial[type].g_iRockAbility = iGetKeyValue(subsection, MT_ROCK_SECTION, MT_ROCK_SECTION2, MT_ROCK_SECTION3, MT_ROCK_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esRockSpecial[type].g_iRockAbility, value, -1, 1); @@ -687,6 +709,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esRockSpecial[type].g_iRockDamage = iGetKeyValue(subsection, MT_ROCK_SECTION, MT_ROCK_SECTION2, MT_ROCK_SECTION3, MT_ROCK_SECTION4, key, "RockDamage", "Rock Damage", "Rock_Damage", "damage", g_esRockSpecial[type].g_iRockDamage, value, -1, 99999); g_esRockSpecial[type].g_iRockDuration = iGetKeyValue(subsection, MT_ROCK_SECTION, MT_ROCK_SECTION2, MT_ROCK_SECTION3, MT_ROCK_SECTION4, key, "RockDuration", "Rock Duration", "Rock_Duration", "duration", g_esRockSpecial[type].g_iRockDuration, value, -1, 99999); g_esRockSpecial[type].g_flRockInterval = flGetKeyValue(subsection, MT_ROCK_SECTION, MT_ROCK_SECTION2, MT_ROCK_SECTION3, MT_ROCK_SECTION4, key, "RockInterval", "Rock Interval", "Rock_Interval", "interval", g_esRockSpecial[type].g_flRockInterval, value, -1.0, 1.0); + g_esRockSpecial[type].g_iRockMode = iGetKeyValue(subsection, MT_ROCK_SECTION, MT_ROCK_SECTION2, MT_ROCK_SECTION3, MT_ROCK_SECTION4, key, "RockMode", "Rock Mode", "Rock_Mode", "mode", g_esRockSpecial[type].g_iRockMode, value, -1, 2); } else { @@ -696,7 +719,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esRockAbility[type].g_iHumanAmmo = iGetKeyValue(subsection, MT_ROCK_SECTION, MT_ROCK_SECTION2, MT_ROCK_SECTION3, MT_ROCK_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esRockAbility[type].g_iHumanAmmo, value, -1, 99999); g_esRockAbility[type].g_iHumanCooldown = iGetKeyValue(subsection, MT_ROCK_SECTION, MT_ROCK_SECTION2, MT_ROCK_SECTION3, MT_ROCK_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esRockAbility[type].g_iHumanCooldown, value, -1, 99999); g_esRockAbility[type].g_iHumanDuration = iGetKeyValue(subsection, MT_ROCK_SECTION, MT_ROCK_SECTION2, MT_ROCK_SECTION3, MT_ROCK_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esRockAbility[type].g_iHumanDuration, value, -1, 99999); - g_esRockAbility[type].g_iHumanMode = iGetKeyValue(subsection, MT_ROCK_SECTION, MT_ROCK_SECTION2, MT_ROCK_SECTION3, MT_ROCK_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esRockAbility[type].g_iHumanMode, value, -1, 1); + g_esRockAbility[type].g_iHumanMode = iGetKeyValue(subsection, MT_ROCK_SECTION, MT_ROCK_SECTION2, MT_ROCK_SECTION3, MT_ROCK_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esRockAbility[type].g_iHumanMode, value, -1, 2); g_esRockAbility[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_ROCK_SECTION, MT_ROCK_SECTION2, MT_ROCK_SECTION3, MT_ROCK_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esRockAbility[type].g_flOpenAreasOnly, value, -1.0, 99999.0); g_esRockAbility[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_ROCK_SECTION, MT_ROCK_SECTION2, MT_ROCK_SECTION3, MT_ROCK_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esRockAbility[type].g_iRequiresHumans, value, -1, 32); g_esRockAbility[type].g_iRockAbility = iGetKeyValue(subsection, MT_ROCK_SECTION, MT_ROCK_SECTION2, MT_ROCK_SECTION3, MT_ROCK_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esRockAbility[type].g_iRockAbility, value, -1, 1); @@ -706,6 +729,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esRockAbility[type].g_iRockDamage = iGetKeyValue(subsection, MT_ROCK_SECTION, MT_ROCK_SECTION2, MT_ROCK_SECTION3, MT_ROCK_SECTION4, key, "RockDamage", "Rock Damage", "Rock_Damage", "damage", g_esRockAbility[type].g_iRockDamage, value, -1, 99999); g_esRockAbility[type].g_iRockDuration = iGetKeyValue(subsection, MT_ROCK_SECTION, MT_ROCK_SECTION2, MT_ROCK_SECTION3, MT_ROCK_SECTION4, key, "RockDuration", "Rock Duration", "Rock_Duration", "duration", g_esRockAbility[type].g_iRockDuration, value, -1, 99999); g_esRockAbility[type].g_flRockInterval = flGetKeyValue(subsection, MT_ROCK_SECTION, MT_ROCK_SECTION2, MT_ROCK_SECTION3, MT_ROCK_SECTION4, key, "RockInterval", "Rock Interval", "Rock_Interval", "interval", g_esRockAbility[type].g_flRockInterval, value, -1.0, 1.0); + g_esRockAbility[type].g_iRockMode = iGetKeyValue(subsection, MT_ROCK_SECTION, MT_ROCK_SECTION2, MT_ROCK_SECTION3, MT_ROCK_SECTION4, key, "RockMode", "Rock Mode", "Rock_Mode", "mode", g_esRockAbility[type].g_iRockMode, value, -1, 2); g_esRockAbility[type].g_iAccessFlags = iGetAdminFlagsValue(subsection, MT_ROCK_SECTION, MT_ROCK_SECTION2, MT_ROCK_SECTION3, MT_ROCK_SECTION4, key, "AccessFlags", "Access Flags", "Access_Flags", "access", value); g_esRockAbility[type].g_iImmunityFlags = iGetAdminFlagsValue(subsection, MT_ROCK_SECTION, MT_ROCK_SECTION2, MT_ROCK_SECTION3, MT_ROCK_SECTION4, key, "ImmunityFlags", "Immunity Flags", "Immunity_Flags", "immunity", value); } @@ -765,6 +789,7 @@ public void MT_OnSettingsCached(int tank, bool apply, int type) g_esRockCache[tank].g_iRockDamage = iGetSubSettingValue(apply, bHuman, g_esRockTeammate[tank].g_iRockDamage, g_esRockPlayer[tank].g_iRockDamage, g_esRockSpecial[iType].g_iRockDamage, g_esRockAbility[iType].g_iRockDamage, 1); g_esRockCache[tank].g_iRockDuration = iGetSubSettingValue(apply, bHuman, g_esRockTeammate[tank].g_iRockDuration, g_esRockPlayer[tank].g_iRockDuration, g_esRockSpecial[iType].g_iRockDuration, g_esRockAbility[iType].g_iRockDuration, 1); g_esRockCache[tank].g_iRockMessage = iGetSubSettingValue(apply, bHuman, g_esRockTeammate[tank].g_iRockMessage, g_esRockPlayer[tank].g_iRockMessage, g_esRockSpecial[iType].g_iRockMessage, g_esRockAbility[iType].g_iRockMessage, 1); + g_esRockCache[tank].g_iRockMode = iGetSubSettingValue(apply, bHuman, g_esRockTeammate[tank].g_iRockMode, g_esRockPlayer[tank].g_iRockMode, g_esRockSpecial[iType].g_iRockMode, g_esRockAbility[iType].g_iRockMode, 1); } else { @@ -786,6 +811,7 @@ public void MT_OnSettingsCached(int tank, bool apply, int type) g_esRockCache[tank].g_iRockDamage = iGetSettingValue(apply, bHuman, g_esRockPlayer[tank].g_iRockDamage, g_esRockAbility[iType].g_iRockDamage, 1); g_esRockCache[tank].g_iRockDuration = iGetSettingValue(apply, bHuman, g_esRockPlayer[tank].g_iRockDuration, g_esRockAbility[iType].g_iRockDuration, 1); g_esRockCache[tank].g_iRockMessage = iGetSettingValue(apply, bHuman, g_esRockPlayer[tank].g_iRockMessage, g_esRockAbility[iType].g_iRockMessage, 1); + g_esRockCache[tank].g_iRockMode = iGetSettingValue(apply, bHuman, g_esRockPlayer[tank].g_iRockMode, g_esRockAbility[iType].g_iRockMode, 1); } } @@ -799,7 +825,8 @@ public void MT_OnCopyStats(int oldTank, int newTank) if (oldTank != newTank) { - vRemoveRock(oldTank); + vRemoveRock(oldTank, 0); + vRemoveRock(oldTank, 1); } } @@ -823,7 +850,8 @@ public void MT_OnEventFired(Event event, const char[] name, bool dontBroadcast) if (bIsValidClient(iBot) && bIsInfected(iTank)) { vRockCopyStats2(iBot, iTank); - vRemoveRock(iBot); + vRemoveRock(iBot, 0); + vRemoveRock(iBot, 1); } } else if (StrEqual(name, "mission_lost") || StrEqual(name, "round_start") || StrEqual(name, "round_end")) @@ -837,7 +865,8 @@ public void MT_OnEventFired(Event event, const char[] name, bool dontBroadcast) if (bIsValidClient(iTank) && bIsInfected(iBot)) { vRockCopyStats2(iTank, iBot); - vRemoveRock(iTank); + vRemoveRock(iTank, 0); + vRemoveRock(iTank, 1); } } else if (StrEqual(name, "player_death") || StrEqual(name, "player_spawn")) @@ -845,7 +874,8 @@ public void MT_OnEventFired(Event event, const char[] name, bool dontBroadcast) int iTankId = event.GetInt("userid"), iTank = GetClientOfUserId(iTankId); if (MT_IsTankSupported(iTank, MT_CHECK_INDEX|MT_CHECK_INGAME)) { - vRemoveRock(iTank); + vRemoveRock(iTank, 0); + vRemoveRock(iTank, 1); } } } @@ -882,10 +912,10 @@ public void MT_OnButtonPressed(int tank, int button) if ((button & MT_MAIN_KEY) && g_esRockCache[tank].g_iRockAbility == 1 && g_esRockCache[tank].g_iHumanAbility == 1) { - int iTime = GetTime(); + int iHumanMode = g_esRockCache[tank].g_iHumanMode, iTime = GetTime(); bool bRecharging = g_esRockPlayer[tank].g_iCooldown != -1 && g_esRockPlayer[tank].g_iCooldown >= iTime; - switch (g_esRockCache[tank].g_iHumanMode) + switch (iHumanMode) { case 0: { @@ -902,9 +932,9 @@ public void MT_OnButtonPressed(int tank, int button) MT_PrintToChat(tank, "%s %t", MT_TAG3, "RockHuman4", (g_esRockPlayer[tank].g_iCooldown - iTime)); } } - case 1: + case 1, 2: { - if (g_esRockPlayer[tank].g_iAmmoCount < g_esRockCache[tank].g_iHumanAmmo && g_esRockCache[tank].g_iHumanAmmo > 0) + if ((iHumanMode == 2 && g_esRockPlayer[tank].g_bActivated) || (g_esRockPlayer[tank].g_iAmmoCount < g_esRockCache[tank].g_iHumanAmmo && g_esRockCache[tank].g_iHumanAmmo > 0)) { if (!g_esRockPlayer[tank].g_bActivated && !bRecharging) { @@ -916,7 +946,16 @@ public void MT_OnButtonPressed(int tank, int button) } else if (g_esRockPlayer[tank].g_bActivated) { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "RockHuman3"); + switch (iHumanMode) + { + case 1: MT_PrintToChat(tank, "%s %t", MT_TAG3, "RockHuman3"); + case 2: + { + vRockReset2(tank, 0); + vRockReset2(tank, 1); + vRockReset3(tank); + } + } } else if (bRecharging) { @@ -943,7 +982,8 @@ public void MT_OnButtonReleased(int tank, int button) { if ((button & MT_MAIN_KEY) && g_esRockCache[tank].g_iHumanMode == 1 && g_esRockPlayer[tank].g_bActivated && (g_esRockPlayer[tank].g_iCooldown == -1 || g_esRockPlayer[tank].g_iCooldown <= GetTime())) { - vRockReset2(tank); + vRockReset2(tank, 0); + vRockReset2(tank, 1); vRockReset3(tank); } } @@ -960,7 +1000,8 @@ public void MT_OnChangeType(int tank, int oldType, int newType, bool revert) return; } - vRemoveRock(tank); + vRemoveRock(tank, 0); + vRemoveRock(tank, 1); } void vRock(int tank, int pos = -1) @@ -998,34 +1039,37 @@ void vRock2(int tank, int pos = -1) } char sDamage[11]; - float flDamage = (pos != -1) ? MT_GetCombinationSetting(tank, 3, pos) : float(g_esRockCache[tank].g_iRockDamage); - IntToString(RoundToNearest(MT_GetScaledDamage(flDamage)), sDamage, sizeof sDamage); - - float flPos[3], flAngles[3]; - GetClientEyePosition(tank, flPos); - GetClientEyeAngles(tank, flAngles); - - int iLauncher = CreateEntityByName("env_rock_launcher"); - if (bIsValidEntity(iLauncher)) - { - SetEntPropEnt(iLauncher, Prop_Data, "m_hOwnerEntity", tank); - TeleportEntity(iLauncher, flPos, flAngles); - DispatchSpawn(iLauncher); - DispatchKeyValue(iLauncher, "rockdamageoverride", sDamage); - iLauncher = EntIndexToEntRef(iLauncher); - g_esRockPlayer[tank].g_iLauncher = iLauncher; - } - - float flInterval = (pos != -1) ? MT_GetCombinationSetting(tank, 6, pos) : g_esRockCache[tank].g_flRockInterval; + float flPos[3], flAngles[3], flDamage = (pos != -1) ? MT_GetCombinationSetting(tank, 3, pos) : float(g_esRockCache[tank].g_iRockDamage), + flInterval = (pos != -1) ? MT_GetCombinationSetting(tank, 6, pos) : g_esRockCache[tank].g_flRockInterval; if (flInterval > 0.0) { - DataPack dpRock; - CreateDataTimer(flInterval, tTimerRock, dpRock, TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); - dpRock.WriteCell(iLauncher); - dpRock.WriteCell(GetClientUserId(tank)); - dpRock.WriteCell(g_esRockPlayer[tank].g_iTankType); - dpRock.WriteCell(GetTime()); - dpRock.WriteCell(pos); + IntToString(RoundToNearest(MT_GetScaledDamage(flDamage)), sDamage, sizeof sDamage); + GetClientEyePosition(tank, flPos); + GetClientEyeAngles(tank, flAngles); + + int iLauncher = -1; + for (int iPos = 0; iPos < (sizeof esRockPlayer::g_iLauncher); iPos++) + { + iLauncher = CreateEntityByName("env_rock_launcher"); + if (bIsValidEntity(iLauncher)) + { + SetEntPropEnt(iLauncher, Prop_Data, "m_hOwnerEntity", tank); + TeleportEntity(iLauncher, flPos, flAngles); + DispatchSpawn(iLauncher); + DispatchKeyValue(iLauncher, "rockdamageoverride", sDamage); + iLauncher = EntIndexToEntRef(iLauncher); + g_esRockPlayer[tank].g_iLauncher[iPos] = iLauncher; + + DataPack dpRock; + CreateDataTimer(flInterval, tTimerRock, dpRock, TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); + dpRock.WriteCell(iLauncher); + dpRock.WriteCell(iPos); + dpRock.WriteCell(GetClientUserId(tank)); + dpRock.WriteCell(g_esRockPlayer[tank].g_iTankType); + dpRock.WriteCell(GetTime()); + dpRock.WriteCell(pos); + } + } } } @@ -1059,27 +1103,27 @@ void vRockCopyStats2(int oldTank, int newTank) g_esRockPlayer[newTank].g_iCooldown = g_esRockPlayer[oldTank].g_iCooldown; } -void vRemoveRockLauncher(int tank) +void vRemoveRockLauncher(int tank, int pos) { - if (bIsValidEntRef(g_esRockPlayer[tank].g_iLauncher)) + if (bIsValidEntRef(g_esRockPlayer[tank].g_iLauncher[pos])) { - g_esRockPlayer[tank].g_iLauncher = EntRefToEntIndex(g_esRockPlayer[tank].g_iLauncher); - if (bIsValidEntity(g_esRockPlayer[tank].g_iLauncher)) + g_esRockPlayer[tank].g_iLauncher[pos] = EntRefToEntIndex(g_esRockPlayer[tank].g_iLauncher[pos]); + if (bIsValidEntity(g_esRockPlayer[tank].g_iLauncher[pos])) { - RemoveEntity(g_esRockPlayer[tank].g_iLauncher); + RemoveEntity(g_esRockPlayer[tank].g_iLauncher[pos]); } } - g_esRockPlayer[tank].g_iLauncher = INVALID_ENT_REFERENCE; + g_esRockPlayer[tank].g_iLauncher[pos] = INVALID_ENT_REFERENCE; } -void vRemoveRock(int tank) +void vRemoveRock(int tank, int pos) { - vRemoveRockLauncher(tank); - g_esRockPlayer[tank].g_bActivated = false; g_esRockPlayer[tank].g_iAmmoCount = 0; g_esRockPlayer[tank].g_iCooldown = -1; + + vRemoveRockLauncher(tank, pos); } void vRockReset() @@ -1088,17 +1132,18 @@ void vRockReset() { if (bIsValidClient(iPlayer, MT_CHECK_INGAME)) { - vRemoveRock(iPlayer); + vRemoveRock(iPlayer, 0); + vRemoveRock(iPlayer, 1); } } } -void vRockReset2(int tank) +void vRockReset2(int tank, int pos) { - vRemoveRockLauncher(tank); - g_esRockPlayer[tank].g_bActivated = false; + vRemoveRockLauncher(tank, pos); + if (g_esRockCache[tank].g_iRockMessage == 1) { char sTankName[64]; @@ -1119,25 +1164,27 @@ void vRockReset3(int tank) } } -void tTimerRockCombo(Handle timer, DataPack pack) +Action tTimerRockCombo(Handle timer, DataPack pack) { pack.Reset(); int iTank = GetClientOfUserId(pack.ReadCell()); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esRockAbility[g_esRockPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esRockPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esRockPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esRockCache[iTank].g_iRockAbility == 0 || g_esRockPlayer[iTank].g_bActivated) { - return; + return Plugin_Stop; } int iPos = pack.ReadCell(); vRock(iTank, iPos); + + return Plugin_Continue; } Action tTimerRock(Handle timer, DataPack pack) { pack.Reset(); - int iLauncher = EntRefToEntIndex(pack.ReadCell()), iTank = GetClientOfUserId(pack.ReadCell()); + int iLauncher = EntRefToEntIndex(pack.ReadCell()), iIndex = pack.ReadCell(), iTank = GetClientOfUserId(pack.ReadCell()); if (iLauncher == INVALID_ENT_REFERENCE || !bIsValidEntity(iLauncher)) { g_esRockPlayer[iTank].g_bActivated = false; @@ -1148,7 +1195,22 @@ Action tTimerRock(Handle timer, DataPack pack) int iType = pack.ReadCell(); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || bIsAreaNarrow(iTank, g_esRockCache[iTank].g_flOpenAreasOnly) || bIsAreaWide(iTank, g_esRockCache[iTank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esRockPlayer[iTank].g_iTankType, iTank) || (g_esRockCache[iTank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esRockCache[iTank].g_iRequiresHumans) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esRockAbility[g_esRockPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esRockPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esRockPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || iType != g_esRockPlayer[iTank].g_iTankType || g_esRockCache[iTank].g_iRockAbility == 0 || !g_esRockPlayer[iTank].g_bActivated) { - vRockReset2(iTank); + vRockReset2(iTank, iIndex); + + return Plugin_Stop; + } + + bool bCheck = true; + + switch (iIndex) + { + case 0: bCheck = (g_esRockCache[iTank].g_iRockMode == 0 || g_esRockCache[iTank].g_iRockMode == 1); + case 1: bCheck = (g_esRockCache[iTank].g_iRockMode == 0 || g_esRockCache[iTank].g_iRockMode == 2); + } + + if (!bCheck) + { + vRemoveRockLauncher(iTank, iIndex); return Plugin_Stop; } @@ -1159,46 +1221,62 @@ Action tTimerRock(Handle timer, DataPack pack) iDuration = (bHuman && g_esRockCache[iTank].g_iHumanAbility == 1) ? g_esRockCache[iTank].g_iHumanDuration : iDuration; if (iDuration > 0 && (!bHuman || (bHuman && g_esRockCache[iTank].g_iHumanAbility == 1 && g_esRockCache[iTank].g_iHumanMode == 0)) && (iTime + iDuration) < iCurrentTime) { - vRockReset2(iTank); + vRockReset2(iTank, iIndex); vRockReset3(iTank); return Plugin_Stop; } - float flPos[3], flAngles[3]; - GetClientEyePosition(iTank, flPos); - flPos[2] += 20.0; - flAngles[0] = MT_GetRandomFloat(-1.0, 1.0); - flAngles[1] = MT_GetRandomFloat(-1.0, 1.0); - flAngles[2] = 2.0; - GetVectorAngles(flAngles, flAngles); - - float flMinRadius = (iPos != -1) ? MT_GetCombinationSetting(iTank, 7, iPos) : g_esRockCache[iTank].g_flRockRadius[0], - flMaxRadius = (iPos != -1) ? MT_GetCombinationSetting(iTank, 8, iPos) : g_esRockCache[iTank].g_flRockRadius[1], - flHitPos[3]; - iGetRayHitPos(flPos, flAngles, flHitPos, iTank, true, 2); - float flDistance = GetVectorDistance(flPos, flHitPos); - if (flDistance > 800.0) + if (bIsValidEntity(iLauncher)) { - flDistance = 800.0; - } + float flPos[3], flAngles[3]; + GetClientEyePosition(iTank, flPos); - float flVector[3]; - MakeVectorFromPoints(flPos, flHitPos, flVector); - NormalizeVector(flVector, flVector); - ScaleVector(flVector, (flDistance - 40.0)); - AddVectors(flPos, flVector, flHitPos); - if (flDistance > 300.0) - { - if (bIsValidEntity(iLauncher)) + switch (iIndex) { - flAngles[0] = MT_GetRandomFloat(flMinRadius, flMaxRadius); - flAngles[1] = MT_GetRandomFloat(flMinRadius, flMaxRadius); - flAngles[2] = -2.0; - GetVectorAngles(flAngles, flAngles); + case 0: + { + flPos[2] += 20.0; + flAngles[0] = MT_GetRandomFloat(-1.0, 1.0); + flAngles[1] = MT_GetRandomFloat(-1.0, 1.0); + flAngles[2] = 2.0; + GetVectorAngles(flAngles, flAngles); + + float flMinRadius = (iPos != -1) ? MT_GetCombinationSetting(iTank, 7, iPos) : g_esRockCache[iTank].g_flRockRadius[0], + flMaxRadius = (iPos != -1) ? MT_GetCombinationSetting(iTank, 8, iPos) : g_esRockCache[iTank].g_flRockRadius[1], + flHitPos[3]; + + iGetRayHitPos(flPos, flAngles, flHitPos, iTank, true, 2); + float flDistance = GetVectorDistance(flPos, flHitPos); + if (flDistance > 800.0) + { + flDistance = 800.0; + } + + float flVector[3]; + MakeVectorFromPoints(flPos, flHitPos, flVector); + NormalizeVector(flVector, flVector); + ScaleVector(flVector, (flDistance - 40.0)); + AddVectors(flPos, flVector, flHitPos); + if (flDistance > 300.0) + { + flAngles[0] = MT_GetRandomFloat(flMinRadius, flMaxRadius); + flAngles[1] = MT_GetRandomFloat(flMinRadius, flMaxRadius); + flAngles[2] = -2.0; + GetVectorAngles(flAngles, flAngles); - TeleportEntity(iLauncher, flHitPos, flAngles); - AcceptEntityInput(iLauncher, "LaunchRock"); + TeleportEntity(iLauncher, flHitPos, flAngles); + AcceptEntityInput(iLauncher, "LaunchRock"); + } + } + case 1: + { + GetClientEyeAngles(iTank, flAngles); + flPos[2] += 80.0; + + TeleportEntity(iLauncher, flPos, flAngles); + AcceptEntityInput(iLauncher, "LaunchRock"); + } } } diff --git a/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_rocket.sp b/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_rocket.sp deleted file mode 100644 index a886c688ab..0000000000 --- a/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_rocket.sp +++ /dev/null @@ -1,1488 +0,0 @@ -/** - * Mutant Tanks: a L4D/L4D2 SourceMod Plugin - * Copyright (C) 2024 Alfred "Psyk0tik" Llagas - * - * 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 . - **/ - -#define MT_ROCKET_COMPILE_METHOD 0 // 0: packaged, 1: standalone - -#if !defined MT_ABILITIES_MAIN2 - #if MT_ROCKET_COMPILE_METHOD == 1 - #include - #include - #else - #error This file must be inside "scripting/mutant_tanks/abilities2" while compiling "mt_abilities2.sp" to include its content. - #endif -public Plugin myinfo = -{ - name = "[MT] Rocket Ability", - author = MT_AUTHOR, - description = "The Mutant Tank sends survivors into space.", - version = MT_VERSION, - url = MT_URL -}; - -bool g_bDedicated, g_bLateLoad; - -public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max) -{ - EngineVersion evEngine = GetEngineVersion(); - if (evEngine != Engine_Left4Dead && evEngine != Engine_Left4Dead2) - { - strcopy(error, err_max, "\"[MT] Rocket Ability\" only supports Left 4 Dead 1 & 2."); - - return APLRes_SilentFailure; - } - - g_bDedicated = IsDedicatedServer(); - g_bLateLoad = late; - - return APLRes_Success; -} - -#define SOUND_EXPLOSION "ambient/explosions/explode_2.wav" -#define SOUND_FIRE "weapons/molotov/fire_ignite_1.wav" -#define SOUND_LAUNCH "player/boomer/explode/explo_medium_14.wav" - -#define SPRITE_FIRE "sprites/sprite_fire01.vmt" -#else - #if MT_ROCKET_COMPILE_METHOD == 1 - #error This file must be compiled as a standalone plugin. - #endif -#endif - -#define MT_ROCKET_SECTION "rocketability" -#define MT_ROCKET_SECTION2 "rocket ability" -#define MT_ROCKET_SECTION3 "rocket_ability" -#define MT_ROCKET_SECTION4 "rocket" - -#define MT_MENU_ROCKET "Rocket Ability" - -enum struct esRocketPlayer -{ - bool g_bAffected; - bool g_bFailed; - bool g_bNoAmmo; - - float g_flCloseAreasOnly; - float g_flOpenAreasOnly; - float g_flRocketChance; - float g_flRocketCountdown; - float g_flRocketDelay; - float g_flRocketRange; - float g_flRocketRangeChance; - - int g_iAccessFlags; - int g_iAmmoCount; - int g_iComboAbility; - int g_iCooldown; - int g_iHumanAbility; - int g_iHumanAmmo; - int g_iHumanCooldown; - int g_iHumanRangeCooldown; - int g_iImmunityFlags; - int g_iOwner; - int g_iRangeCooldown; - int g_iRequiresHumans; - int g_iRocketAbility; - int g_iRocketBody; - int g_iRocketCooldown; - int g_iRocketEffect; - int g_iRocketHit; - int g_iRocketHitMode; - int g_iRocketMessage; - int g_iRocketMode; - int g_iRocketRangeCooldown; - int g_iRocketSight; - int g_iTankType; - int g_iTankTypeRecorded; -} - -esRocketPlayer g_esRocketPlayer[MAXPLAYERS + 1]; - -enum struct esRocketTeammate -{ - float g_flCloseAreasOnly; - float g_flOpenAreasOnly; - float g_flRocketChance; - float g_flRocketCountdown; - float g_flRocketDelay; - float g_flRocketRange; - float g_flRocketRangeChance; - - int g_iComboAbility; - int g_iHumanAbility; - int g_iHumanAmmo; - int g_iHumanCooldown; - int g_iHumanRangeCooldown; - int g_iRequiresHumans; - int g_iRocketAbility; - int g_iRocketBody; - int g_iRocketCooldown; - int g_iRocketEffect; - int g_iRocketHit; - int g_iRocketHitMode; - int g_iRocketMessage; - int g_iRocketMode; - int g_iRocketRangeCooldown; - int g_iRocketSight; -} - -esRocketTeammate g_esRocketTeammate[MAXPLAYERS + 1]; - -enum struct esRocketAbility -{ - float g_flCloseAreasOnly; - float g_flOpenAreasOnly; - float g_flRocketChance; - float g_flRocketCountdown; - float g_flRocketDelay; - float g_flRocketRange; - float g_flRocketRangeChance; - - int g_iAccessFlags; - int g_iComboAbility; - int g_iHumanAbility; - int g_iHumanAmmo; - int g_iHumanCooldown; - int g_iHumanRangeCooldown; - int g_iImmunityFlags; - int g_iRequiresHumans; - int g_iRocketAbility; - int g_iRocketBody; - int g_iRocketCooldown; - int g_iRocketEffect; - int g_iRocketHit; - int g_iRocketHitMode; - int g_iRocketMessage; - int g_iRocketMode; - int g_iRocketRangeCooldown; - int g_iRocketSight; -} - -esRocketAbility g_esRocketAbility[MT_MAXTYPES + 1]; - -enum struct esRocketSpecial -{ - float g_flCloseAreasOnly; - float g_flOpenAreasOnly; - float g_flRocketChance; - float g_flRocketCountdown; - float g_flRocketDelay; - float g_flRocketRange; - float g_flRocketRangeChance; - - int g_iComboAbility; - int g_iHumanAbility; - int g_iHumanAmmo; - int g_iHumanCooldown; - int g_iHumanRangeCooldown; - int g_iRequiresHumans; - int g_iRocketAbility; - int g_iRocketBody; - int g_iRocketCooldown; - int g_iRocketEffect; - int g_iRocketHit; - int g_iRocketHitMode; - int g_iRocketMessage; - int g_iRocketMode; - int g_iRocketRangeCooldown; - int g_iRocketSight; -} - -esRocketSpecial g_esRocketSpecial[MT_MAXTYPES + 1]; - -enum struct esRocketCache -{ - float g_flCloseAreasOnly; - float g_flOpenAreasOnly; - float g_flRocketChance; - float g_flRocketCountdown; - float g_flRocketDelay; - float g_flRocketRange; - float g_flRocketRangeChance; - - int g_iComboAbility; - int g_iHumanAbility; - int g_iHumanAmmo; - int g_iHumanCooldown; - int g_iHumanRangeCooldown; - int g_iRequiresHumans; - int g_iRocketAbility; - int g_iRocketBody; - int g_iRocketCooldown; - int g_iRocketEffect; - int g_iRocketHit; - int g_iRocketHitMode; - int g_iRocketMessage; - int g_iRocketMode; - int g_iRocketRangeCooldown; - int g_iRocketSight; -} - -esRocketCache g_esRocketCache[MAXPLAYERS + 1]; - -int g_iRocketDeathModelOwner = 0, g_iRocketSprite = -1; - -#if !defined MT_ABILITIES_MAIN2 -public void OnPluginStart() -{ - LoadTranslations("common.phrases"); - LoadTranslations("mutant_tanks.phrases"); - LoadTranslations("mutant_tanks_names.phrases"); - - RegConsoleCmd("sm_mt_rocket", cmdRocketInfo, "View information about the Rocket ability."); - - if (g_bLateLoad) - { - for (int iPlayer = 1; iPlayer <= MaxClients; iPlayer++) - { - if (bIsValidClient(iPlayer, MT_CHECK_INGAME)) - { - OnClientPutInServer(iPlayer); - } - } - - g_bLateLoad = false; - } -} -#endif - -#if defined MT_ABILITIES_MAIN2 -void vRocketMapStart() -#else -public void OnMapStart() -#endif -{ - g_iRocketSprite = PrecacheModel(SPRITE_FIRE, true); - - PrecacheSound(SOUND_FIRE, true); - PrecacheSound(SOUND_LAUNCH, true); - - vRocketReset(); -} - -#if defined MT_ABILITIES_MAIN2 -void vRocketClientPutInServer(int client) -#else -public void OnClientPutInServer(int client) -#endif -{ - SDKHook(client, SDKHook_OnTakeDamage, OnRocketTakeDamage); - vRocketReset3(client); -} - -#if defined MT_ABILITIES_MAIN2 -void vRocketClientDisconnect_Post(int client) -#else -public void OnClientDisconnect_Post(int client) -#endif -{ - vRocketReset3(client); -} - -#if defined MT_ABILITIES_MAIN2 -void vRocketMapEnd() -#else -public void OnMapEnd() -#endif -{ - vRocketReset(); -} - -#if !defined MT_ABILITIES_MAIN2 -Action cmdRocketInfo(int client, int args) -{ - client = iGetListenServerHost(client, g_bDedicated); - - if (!MT_IsCorePluginEnabled()) - { - MT_ReplyToCommand(client, "%s %t", MT_TAG5, "PluginDisabled"); - - return Plugin_Handled; - } - - if (!bIsValidClient(client, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_FAKECLIENT)) - { - MT_ReplyToCommand(client, "%s %t", MT_TAG, "Command is in-game only"); - - return Plugin_Handled; - } - - switch (IsVoteInProgress()) - { - case true: MT_ReplyToCommand(client, "%s %t", MT_TAG2, "Vote in Progress"); - case false: vRocketMenu(client, MT_ROCKET_SECTION4, 0); - } - - return Plugin_Handled; -} -#endif - -void vRocketMenu(int client, const char[] name, int item) -{ - if (StrContains(MT_ROCKET_SECTION4, name, false) == -1) - { - return; - } - - Menu mAbilityMenu = new Menu(iRocketMenuHandler, MENU_ACTIONS_DEFAULT|MenuAction_Display|MenuAction_DisplayItem); - mAbilityMenu.SetTitle("Rocket Ability Information"); - mAbilityMenu.AddItem("Status", "Status"); - mAbilityMenu.AddItem("Ammunition", "Ammunition"); - mAbilityMenu.AddItem("Buttons", "Buttons"); - mAbilityMenu.AddItem("Cooldown", "Cooldown"); - mAbilityMenu.AddItem("Details", "Details"); - mAbilityMenu.AddItem("Human Support", "Human Support"); - mAbilityMenu.AddItem("Range Cooldown", "Range Cooldown"); - mAbilityMenu.DisplayAt(client, item, MENU_TIME_FOREVER); -} - -int iRocketMenuHandler(Menu menu, MenuAction action, int param1, int param2) -{ - switch (action) - { - case MenuAction_End: delete menu; - case MenuAction_Select: - { - switch (param2) - { - case 0: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esRocketCache[param1].g_iRocketAbility == 0) ? "AbilityStatus1" : "AbilityStatus2"); - case 1: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityAmmo", (g_esRocketCache[param1].g_iHumanAmmo - g_esRocketPlayer[param1].g_iAmmoCount), g_esRocketCache[param1].g_iHumanAmmo); - case 2: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtons2"); - case 3: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityCooldown", ((g_esRocketCache[param1].g_iHumanAbility == 1) ? g_esRocketCache[param1].g_iHumanCooldown : g_esRocketCache[param1].g_iRocketCooldown)); - case 4: MT_PrintToChat(param1, "%s %t", MT_TAG3, "RocketDetails"); - case 5: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esRocketCache[param1].g_iHumanAbility == 0) ? "AbilityHumanSupport1" : "AbilityHumanSupport2"); - case 6: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityRangeCooldown", ((g_esRocketCache[param1].g_iHumanAbility == 1) ? g_esRocketCache[param1].g_iHumanRangeCooldown : g_esRocketCache[param1].g_iRocketRangeCooldown)); - } - - if (bIsValidClient(param1, MT_CHECK_INGAME)) - { - vRocketMenu(param1, MT_ROCKET_SECTION4, menu.Selection); - } - } - case MenuAction_Display: - { - char sMenuTitle[PLATFORM_MAX_PATH]; - Panel pRocket = view_as(param2); - FormatEx(sMenuTitle, sizeof sMenuTitle, "%T", "RocketMenu", param1); - pRocket.SetTitle(sMenuTitle); - } - case MenuAction_DisplayItem: - { - if (param2 >= 0) - { - char sMenuOption[PLATFORM_MAX_PATH]; - - switch (param2) - { - case 0: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Status", param1); - case 1: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Ammunition", param1); - case 2: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Buttons", param1); - case 3: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Cooldown", param1); - case 4: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Details", param1); - case 5: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "HumanSupport", param1); - case 6: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "RangeCooldown", param1); - } - - return RedrawMenuItem(sMenuOption); - } - } - } - - return 0; -} - -#if defined MT_ABILITIES_MAIN2 -void vRocketDisplayMenu(Menu menu) -#else -public void MT_OnDisplayMenu(Menu menu) -#endif -{ - menu.AddItem(MT_MENU_ROCKET, MT_MENU_ROCKET); -} - -#if defined MT_ABILITIES_MAIN2 -void vRocketMenuItemSelected(int client, const char[] info) -#else -public void MT_OnMenuItemSelected(int client, const char[] info) -#endif -{ - if (StrEqual(info, MT_MENU_ROCKET, false)) - { - vRocketMenu(client, MT_ROCKET_SECTION4, 0); - } -} - -#if defined MT_ABILITIES_MAIN2 -void vRocketMenuItemDisplayed(int client, const char[] info, char[] buffer, int size) -#else -public void MT_OnMenuItemDisplayed(int client, const char[] info, char[] buffer, int size) -#endif -{ - if (StrEqual(info, MT_MENU_ROCKET, false)) - { - FormatEx(buffer, size, "%T", "RocketMenu2", client); - } -} - -#if defined MT_ABILITIES_MAIN2 -void vRocketEntityCreated(int entity, const char[] classname) -#else -public void OnEntityCreated(int entity, const char[] classname) -#endif -{ - if (bIsValidEntity(entity) && StrEqual(classname, "survivor_death_model")) - { - int iOwner = GetClientOfUserId(g_iRocketDeathModelOwner); - if (bIsValidClient(iOwner)) - { - SDKHook(entity, SDKHook_SpawnPost, OnRocketModelSpawnPost); - } - - g_iRocketDeathModelOwner = 0; - } -} - -void OnRocketModelSpawnPost(int model) -{ - g_iRocketDeathModelOwner = 0; - - SDKUnhook(model, SDKHook_SpawnPost, OnRocketModelSpawnPost); - - if (!bIsValidEntity(model)) - { - return; - } - - RemoveEntity(model); -} - -Action OnRocketTakeDamage(int victim, int &attacker, int &inflictor, float &damage, int &damagetype) -{ - if (MT_IsCorePluginEnabled() && bIsValidClient(victim, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_ALIVE) && damage > 0.0) - { - char sClassname[32]; - if (bIsValidEntity(inflictor)) - { - GetEntityClassname(inflictor, sClassname, sizeof sClassname); - } - - if (MT_IsTankSupported(attacker) && MT_IsCustomTankSupported(attacker) && (g_esRocketCache[attacker].g_iRocketHitMode == 0 || g_esRocketCache[attacker].g_iRocketHitMode == 1) && bIsSurvivor(victim) && g_esRocketCache[attacker].g_iComboAbility == 0) - { - if ((!MT_HasAdminAccess(attacker) && !bHasAdminAccess(attacker, g_esRocketAbility[g_esRocketPlayer[attacker].g_iTankTypeRecorded].g_iAccessFlags, g_esRocketPlayer[attacker].g_iAccessFlags)) || MT_IsAdminImmune(victim, attacker) || bIsAdminImmune(victim, g_esRocketPlayer[attacker].g_iTankType, g_esRocketAbility[g_esRocketPlayer[attacker].g_iTankTypeRecorded].g_iImmunityFlags, g_esRocketPlayer[victim].g_iImmunityFlags)) - { - return Plugin_Continue; - } - - bool bCaught = bIsSurvivorCaught(victim); - if ((bIsSpecialInfected(attacker) && (bCaught || (!bCaught && (damagetype & DMG_CLUB)) || (bIsSpitter(attacker) && StrEqual(sClassname, "insect_swarm")))) || StrEqual(sClassname[7], "tank_claw") || StrEqual(sClassname, "tank_rock")) - { - vRocketHit(victim, attacker, GetRandomFloat(0.1, 100.0), g_esRocketCache[attacker].g_flRocketChance, g_esRocketCache[attacker].g_iRocketHit, MT_MESSAGE_MELEE, MT_ATTACK_CLAW); - } - } - else if (MT_IsTankSupported(victim) && MT_IsCustomTankSupported(victim) && (g_esRocketCache[victim].g_iRocketHitMode == 0 || g_esRocketCache[victim].g_iRocketHitMode == 2) && bIsSurvivor(attacker) && g_esRocketCache[victim].g_iComboAbility == 0) - { - if ((!MT_HasAdminAccess(victim) && !bHasAdminAccess(victim, g_esRocketAbility[g_esRocketPlayer[victim].g_iTankTypeRecorded].g_iAccessFlags, g_esRocketPlayer[victim].g_iAccessFlags)) || MT_IsAdminImmune(attacker, victim) || bIsAdminImmune(attacker, g_esRocketPlayer[victim].g_iTankType, g_esRocketAbility[g_esRocketPlayer[victim].g_iTankTypeRecorded].g_iImmunityFlags, g_esRocketPlayer[attacker].g_iImmunityFlags)) - { - return Plugin_Continue; - } - - if (StrEqual(sClassname[7], "melee")) - { - vRocketHit(attacker, victim, GetRandomFloat(0.1, 100.0), g_esRocketCache[victim].g_flRocketChance, g_esRocketCache[victim].g_iRocketHit, MT_MESSAGE_MELEE, MT_ATTACK_MELEE); - } - } - } - - return Plugin_Continue; -} - -#if defined MT_ABILITIES_MAIN2 -void vRocketPluginCheck(ArrayList list) -#else -public void MT_OnPluginCheck(ArrayList list) -#endif -{ - list.PushString(MT_MENU_ROCKET); -} - -#if defined MT_ABILITIES_MAIN2 -void vRocketAbilityCheck(ArrayList list, ArrayList list2, ArrayList list3, ArrayList list4) -#else -public void MT_OnAbilityCheck(ArrayList list, ArrayList list2, ArrayList list3, ArrayList list4) -#endif -{ - list.PushString(MT_ROCKET_SECTION); - list2.PushString(MT_ROCKET_SECTION2); - list3.PushString(MT_ROCKET_SECTION3); - list4.PushString(MT_ROCKET_SECTION4); -} - -#if defined MT_ABILITIES_MAIN2 -void vRocketCombineAbilities(int tank, int type, const float random, const char[] combo, int survivor, const char[] classname) -#else -public void MT_OnCombineAbilities(int tank, int type, const float random, const char[] combo, int survivor, int weapon, const char[] classname) -#endif -{ - if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esRocketCache[tank].g_iHumanAbility != 2) - { - return; - } - - char sCombo[320], sSet[4][32]; - FormatEx(sCombo, sizeof sCombo, ",%s,", combo); - FormatEx(sSet[0], sizeof sSet[], ",%s,", MT_ROCKET_SECTION); - FormatEx(sSet[1], sizeof sSet[], ",%s,", MT_ROCKET_SECTION2); - FormatEx(sSet[2], sizeof sSet[], ",%s,", MT_ROCKET_SECTION3); - FormatEx(sSet[3], sizeof sSet[], ",%s,", MT_ROCKET_SECTION4); - if (g_esRocketCache[tank].g_iComboAbility == 1 && (StrContains(sCombo, sSet[0], false) != -1 || StrContains(sCombo, sSet[1], false) != -1 || StrContains(sCombo, sSet[2], false) != -1 || StrContains(sCombo, sSet[3], false) != -1)) - { - char sAbilities[320], sSubset[10][32]; - strcopy(sAbilities, sizeof sAbilities, combo); - ExplodeString(sAbilities, ",", sSubset, sizeof sSubset, sizeof sSubset[]); - - float flChance = 0.0, flDelay = 0.0; - for (int iPos = 0; iPos < (sizeof sSubset); iPos++) - { - if (StrEqual(sSubset[iPos], MT_ROCKET_SECTION, false) || StrEqual(sSubset[iPos], MT_ROCKET_SECTION2, false) || StrEqual(sSubset[iPos], MT_ROCKET_SECTION3, false) || StrEqual(sSubset[iPos], MT_ROCKET_SECTION4, false)) - { - flDelay = MT_GetCombinationSetting(tank, 4, iPos); - - switch (type) - { - case MT_COMBO_MAINRANGE: - { - if (g_esRocketCache[tank].g_iRocketAbility == 1) - { - switch (flDelay) - { - case 0.0: vRocketAbility(tank, random); - default: - { - DataPack dpCombo; - CreateDataTimer(flDelay, tTimerRocketCombo, dpCombo, TIMER_FLAG_NO_MAPCHANGE); - dpCombo.WriteCell(GetClientUserId(tank)); - dpCombo.WriteFloat(random); - dpCombo.WriteCell(iPos); - } - } - } - } - case MT_COMBO_MELEEHIT: - { - flChance = MT_GetCombinationSetting(tank, 1, iPos); - - switch (flDelay) - { - case 0.0: - { - if ((g_esRocketCache[tank].g_iRocketHitMode == 0 || g_esRocketCache[tank].g_iRocketHitMode == 1) && (StrEqual(classname[7], "tank_claw") || StrEqual(classname, "tank_rock"))) - { - vRocketHit(survivor, tank, random, flChance, g_esRocketCache[tank].g_iRocketHit, MT_MESSAGE_MELEE, MT_ATTACK_CLAW, iPos); - } - else if ((g_esRocketCache[tank].g_iRocketHitMode == 0 || g_esRocketCache[tank].g_iRocketHitMode == 2) && StrEqual(classname[7], "melee")) - { - vRocketHit(survivor, tank, random, flChance, g_esRocketCache[tank].g_iRocketHit, MT_MESSAGE_MELEE, MT_ATTACK_MELEE, iPos); - } - } - default: - { - DataPack dpCombo; - CreateDataTimer(flDelay, tTimerRocketCombo2, dpCombo, TIMER_FLAG_NO_MAPCHANGE); - dpCombo.WriteCell(GetClientUserId(survivor)); - dpCombo.WriteCell(GetClientUserId(tank)); - dpCombo.WriteFloat(random); - dpCombo.WriteFloat(flChance); - dpCombo.WriteCell(iPos); - dpCombo.WriteString(classname); - } - } - } - } - - break; - } - } - } -} - -#if defined MT_ABILITIES_MAIN2 -void vRocketConfigsLoad(int mode) -#else -public void MT_OnConfigsLoad(int mode) -#endif -{ - switch (mode) - { - case 1: - { - for (int iIndex = MT_GetMinType(); iIndex <= MT_GetMaxType(); iIndex++) - { - g_esRocketAbility[iIndex].g_iAccessFlags = 0; - g_esRocketAbility[iIndex].g_iImmunityFlags = 0; - g_esRocketAbility[iIndex].g_flCloseAreasOnly = 0.0; - g_esRocketAbility[iIndex].g_iComboAbility = 0; - g_esRocketAbility[iIndex].g_iHumanAbility = 0; - g_esRocketAbility[iIndex].g_iHumanAmmo = 5; - g_esRocketAbility[iIndex].g_iHumanCooldown = 0; - g_esRocketAbility[iIndex].g_iHumanRangeCooldown = 0; - g_esRocketAbility[iIndex].g_flOpenAreasOnly = 0.0; - g_esRocketAbility[iIndex].g_iRequiresHumans = 0; - g_esRocketAbility[iIndex].g_iRocketAbility = 0; - g_esRocketAbility[iIndex].g_iRocketEffect = 0; - g_esRocketAbility[iIndex].g_iRocketMessage = 0; - g_esRocketAbility[iIndex].g_iRocketBody = 1; - g_esRocketAbility[iIndex].g_flRocketChance = 33.3; - g_esRocketAbility[iIndex].g_iRocketCooldown = 0; - g_esRocketAbility[iIndex].g_flRocketCountdown = 0.0; - g_esRocketAbility[iIndex].g_flRocketDelay = 1.0; - g_esRocketAbility[iIndex].g_iRocketHit = 0; - g_esRocketAbility[iIndex].g_iRocketHitMode = 0; - g_esRocketAbility[iIndex].g_iRocketMode = 1; - g_esRocketAbility[iIndex].g_flRocketRange = 150.0; - g_esRocketAbility[iIndex].g_flRocketRangeChance = 15.0; - g_esRocketAbility[iIndex].g_iRocketRangeCooldown = 0; - g_esRocketAbility[iIndex].g_iRocketSight = 0; - - g_esRocketSpecial[iIndex].g_flCloseAreasOnly = -1.0; - g_esRocketSpecial[iIndex].g_iComboAbility = -1; - g_esRocketSpecial[iIndex].g_iHumanAbility = -1; - g_esRocketSpecial[iIndex].g_iHumanAmmo = -1; - g_esRocketSpecial[iIndex].g_iHumanCooldown = -1; - g_esRocketSpecial[iIndex].g_iHumanRangeCooldown = -1; - g_esRocketSpecial[iIndex].g_flOpenAreasOnly = -1.0; - g_esRocketSpecial[iIndex].g_iRequiresHumans = -1; - g_esRocketSpecial[iIndex].g_iRocketAbility = -1; - g_esRocketSpecial[iIndex].g_iRocketEffect = -1; - g_esRocketSpecial[iIndex].g_iRocketMessage = -1; - g_esRocketSpecial[iIndex].g_iRocketBody = -1; - g_esRocketSpecial[iIndex].g_flRocketChance = -1.0; - g_esRocketSpecial[iIndex].g_iRocketCooldown = -1; - g_esRocketSpecial[iIndex].g_flRocketCountdown = 0.0; - g_esRocketSpecial[iIndex].g_flRocketDelay = -1.0; - g_esRocketSpecial[iIndex].g_iRocketHit = -1; - g_esRocketSpecial[iIndex].g_iRocketHitMode = -1; - g_esRocketSpecial[iIndex].g_iRocketMode = -1; - g_esRocketSpecial[iIndex].g_flRocketRange = -1.0; - g_esRocketSpecial[iIndex].g_flRocketRangeChance = -1.0; - g_esRocketSpecial[iIndex].g_iRocketRangeCooldown = -1; - g_esRocketSpecial[iIndex].g_iRocketSight = -1; - } - } - case 3: - { - for (int iPlayer = 1; iPlayer <= MaxClients; iPlayer++) - { - g_esRocketPlayer[iPlayer].g_iAccessFlags = -1; - g_esRocketPlayer[iPlayer].g_iImmunityFlags = -1; - g_esRocketPlayer[iPlayer].g_flCloseAreasOnly = -1.0; - g_esRocketPlayer[iPlayer].g_iComboAbility = -1; - g_esRocketPlayer[iPlayer].g_iHumanAbility = -1; - g_esRocketPlayer[iPlayer].g_iHumanAmmo = -1; - g_esRocketPlayer[iPlayer].g_iHumanCooldown = -1; - g_esRocketPlayer[iPlayer].g_iHumanRangeCooldown = -1; - g_esRocketPlayer[iPlayer].g_flOpenAreasOnly = -1.0; - g_esRocketPlayer[iPlayer].g_iRequiresHumans = -1; - g_esRocketPlayer[iPlayer].g_iRocketAbility = -1; - g_esRocketPlayer[iPlayer].g_iRocketEffect = -1; - g_esRocketPlayer[iPlayer].g_iRocketMessage = -1; - g_esRocketPlayer[iPlayer].g_iRocketBody = -1; - g_esRocketPlayer[iPlayer].g_flRocketChance = -1.0; - g_esRocketPlayer[iPlayer].g_iRocketCooldown = -1; - g_esRocketPlayer[iPlayer].g_flRocketCountdown = 0.0; - g_esRocketPlayer[iPlayer].g_flRocketDelay = -1.0; - g_esRocketPlayer[iPlayer].g_iRocketHit = -1; - g_esRocketPlayer[iPlayer].g_iRocketHitMode = -1; - g_esRocketPlayer[iPlayer].g_iRocketMode = -1; - g_esRocketPlayer[iPlayer].g_flRocketRange = -1.0; - g_esRocketPlayer[iPlayer].g_flRocketRangeChance = -1.0; - g_esRocketPlayer[iPlayer].g_iRocketRangeCooldown = -1; - g_esRocketPlayer[iPlayer].g_iRocketSight = -1; - - g_esRocketTeammate[iPlayer].g_flCloseAreasOnly = -1.0; - g_esRocketTeammate[iPlayer].g_iComboAbility = -1; - g_esRocketTeammate[iPlayer].g_iHumanAbility = -1; - g_esRocketTeammate[iPlayer].g_iHumanAmmo = -1; - g_esRocketTeammate[iPlayer].g_iHumanCooldown = -1; - g_esRocketTeammate[iPlayer].g_iHumanRangeCooldown = -1; - g_esRocketTeammate[iPlayer].g_flOpenAreasOnly = -1.0; - g_esRocketTeammate[iPlayer].g_iRequiresHumans = -1; - g_esRocketTeammate[iPlayer].g_iRocketAbility = -1; - g_esRocketTeammate[iPlayer].g_iRocketEffect = -1; - g_esRocketTeammate[iPlayer].g_iRocketMessage = -1; - g_esRocketTeammate[iPlayer].g_iRocketBody = -1; - g_esRocketTeammate[iPlayer].g_flRocketChance = -1.0; - g_esRocketTeammate[iPlayer].g_iRocketCooldown = -1; - g_esRocketTeammate[iPlayer].g_flRocketCountdown = 0.0; - g_esRocketTeammate[iPlayer].g_flRocketDelay = -1.0; - g_esRocketTeammate[iPlayer].g_iRocketHit = -1; - g_esRocketTeammate[iPlayer].g_iRocketHitMode = -1; - g_esRocketTeammate[iPlayer].g_iRocketMode = -1; - g_esRocketTeammate[iPlayer].g_flRocketRange = -1.0; - g_esRocketTeammate[iPlayer].g_flRocketRangeChance = -1.0; - g_esRocketTeammate[iPlayer].g_iRocketRangeCooldown = -1; - g_esRocketTeammate[iPlayer].g_iRocketSight = -1; - } - } - } -} - -#if defined MT_ABILITIES_MAIN2 -void vRocketConfigsLoaded(const char[] subsection, const char[] key, const char[] value, int type, int admin, int mode, bool special, const char[] specsection) -#else -public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const char[] value, int type, int admin, int mode, bool special, const char[] specsection) -#endif -{ - if ((mode == -1 || mode == 3) && bIsValidClient(admin)) - { - if (special && specsection[0] != '\0') - { - g_esRocketTeammate[admin].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esRocketTeammate[admin].g_flCloseAreasOnly, value, -1.0, 99999.0); - g_esRocketTeammate[admin].g_iComboAbility = iGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "ComboAbility", "Combo Ability", "Combo_Ability", "combo", g_esRocketTeammate[admin].g_iComboAbility, value, -1, 1); - g_esRocketTeammate[admin].g_iHumanAbility = iGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esRocketTeammate[admin].g_iHumanAbility, value, -1, 2); - g_esRocketTeammate[admin].g_iHumanAmmo = iGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esRocketTeammate[admin].g_iHumanAmmo, value, -1, 99999); - g_esRocketTeammate[admin].g_iHumanCooldown = iGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esRocketTeammate[admin].g_iHumanCooldown, value, -1, 99999); - g_esRocketTeammate[admin].g_iHumanRangeCooldown = iGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "HumanRangeCooldown", "Human Range Cooldown", "Human_Range_Cooldown", "hrangecooldown", g_esRocketTeammate[admin].g_iHumanRangeCooldown, value, -1, 99999); - g_esRocketTeammate[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esRocketTeammate[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); - g_esRocketTeammate[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esRocketTeammate[admin].g_iRequiresHumans, value, -1, 32); - g_esRocketTeammate[admin].g_iRocketAbility = iGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esRocketTeammate[admin].g_iRocketAbility, value, -1, 1); - g_esRocketTeammate[admin].g_iRocketEffect = iGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "AbilityEffect", "Ability Effect", "Ability_Effect", "effect", g_esRocketTeammate[admin].g_iRocketEffect, value, -1, 7); - g_esRocketTeammate[admin].g_iRocketMessage = iGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esRocketTeammate[admin].g_iRocketMessage, value, -1, 3); - g_esRocketTeammate[admin].g_iRocketSight = iGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "AbilitySight", "Ability Sight", "Ability_Sight", "sight", g_esRocketTeammate[admin].g_iRocketSight, value, -1, 5); - g_esRocketTeammate[admin].g_iRocketBody = iGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "RocketBody", "Rocket Body", "Rocket_Body", "body", g_esRocketTeammate[admin].g_iRocketBody, value, -1, 1); - g_esRocketTeammate[admin].g_flRocketChance = flGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "RocketChance", "Rocket Chance", "Rocket_Chance", "chance", g_esRocketTeammate[admin].g_flRocketChance, value, -1.0, 100.0); - g_esRocketTeammate[admin].g_iRocketCooldown = iGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "RocketCooldown", "Rocket Cooldown", "Rocket_Cooldown", "cooldown", g_esRocketTeammate[admin].g_iRocketCooldown, value, -1, 99999); - g_esRocketTeammate[admin].g_flRocketCountdown = flGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "RocketCountdown", "Rocket Countdown", "Rocket_Countdown", "countdown", g_esRocketTeammate[admin].g_flRocketCountdown, value, -1.0, 99999.0); - g_esRocketTeammate[admin].g_flRocketDelay = flGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "RocketDelay", "Rocket Delay", "Rocket_Delay", "delay", g_esRocketTeammate[admin].g_flRocketDelay, value, -1.0, 99999.0); - g_esRocketTeammate[admin].g_iRocketHit = iGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "RocketHit", "Rocket Hit", "Rocket_Hit", "hit", g_esRocketTeammate[admin].g_iRocketHit, value, -1, 1); - g_esRocketTeammate[admin].g_iRocketHitMode = iGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "RocketHitMode", "Rocket Hit Mode", "Rocket_Hit_Mode", "hitmode", g_esRocketTeammate[admin].g_iRocketHitMode, value, -1, 2); - g_esRocketTeammate[admin].g_iRocketMode = iGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "RocketMode", "Rocket Mode", "Rocket_Mode", "mode", g_esRocketTeammate[admin].g_iRocketMode, value, -1, 3); - g_esRocketTeammate[admin].g_flRocketRange = flGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "RocketRange", "Rocket Range", "Rocket_Range", "range", g_esRocketTeammate[admin].g_flRocketRange, value, -1.0, 99999.0); - g_esRocketTeammate[admin].g_flRocketRangeChance = flGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "RocketRangeChance", "Rocket Range Chance", "Rocket_Range_Chance", "rangechance", g_esRocketTeammate[admin].g_flRocketRangeChance, value, -1.0, 100.0); - g_esRocketTeammate[admin].g_iRocketRangeCooldown = iGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "RocketRangeCooldown", "Rocket Range Cooldown", "Rocket_Range_Cooldown", "rangecooldown", g_esRocketTeammate[admin].g_iRocketRangeCooldown, value, -1, 99999); - } - else - { - g_esRocketPlayer[admin].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esRocketPlayer[admin].g_flCloseAreasOnly, value, -1.0, 99999.0); - g_esRocketPlayer[admin].g_iComboAbility = iGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "ComboAbility", "Combo Ability", "Combo_Ability", "combo", g_esRocketPlayer[admin].g_iComboAbility, value, -1, 1); - g_esRocketPlayer[admin].g_iHumanAbility = iGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esRocketPlayer[admin].g_iHumanAbility, value, -1, 2); - g_esRocketPlayer[admin].g_iHumanAmmo = iGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esRocketPlayer[admin].g_iHumanAmmo, value, -1, 99999); - g_esRocketPlayer[admin].g_iHumanCooldown = iGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esRocketPlayer[admin].g_iHumanCooldown, value, -1, 99999); - g_esRocketPlayer[admin].g_iHumanRangeCooldown = iGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "HumanRangeCooldown", "Human Range Cooldown", "Human_Range_Cooldown", "hrangecooldown", g_esRocketPlayer[admin].g_iHumanRangeCooldown, value, -1, 99999); - g_esRocketPlayer[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esRocketPlayer[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); - g_esRocketPlayer[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esRocketPlayer[admin].g_iRequiresHumans, value, -1, 32); - g_esRocketPlayer[admin].g_iRocketAbility = iGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esRocketPlayer[admin].g_iRocketAbility, value, -1, 1); - g_esRocketPlayer[admin].g_iRocketEffect = iGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "AbilityEffect", "Ability Effect", "Ability_Effect", "effect", g_esRocketPlayer[admin].g_iRocketEffect, value, -1, 7); - g_esRocketPlayer[admin].g_iRocketMessage = iGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esRocketPlayer[admin].g_iRocketMessage, value, -1, 3); - g_esRocketPlayer[admin].g_iRocketSight = iGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "AbilitySight", "Ability Sight", "Ability_Sight", "sight", g_esRocketPlayer[admin].g_iRocketSight, value, -1, 5); - g_esRocketPlayer[admin].g_iRocketBody = iGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "RocketBody", "Rocket Body", "Rocket_Body", "body", g_esRocketPlayer[admin].g_iRocketBody, value, -1, 1); - g_esRocketPlayer[admin].g_flRocketChance = flGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "RocketChance", "Rocket Chance", "Rocket_Chance", "chance", g_esRocketPlayer[admin].g_flRocketChance, value, -1.0, 100.0); - g_esRocketPlayer[admin].g_iRocketCooldown = iGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "RocketCooldown", "Rocket Cooldown", "Rocket_Cooldown", "cooldown", g_esRocketPlayer[admin].g_iRocketCooldown, value, -1, 99999); - g_esRocketPlayer[admin].g_flRocketCountdown = flGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "RocketCountdown", "Rocket Countdown", "Rocket_Countdown", "countdown", g_esRocketPlayer[admin].g_flRocketCountdown, value, -1.0, 99999.0); - g_esRocketPlayer[admin].g_flRocketDelay = flGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "RocketDelay", "Rocket Delay", "Rocket_Delay", "delay", g_esRocketPlayer[admin].g_flRocketDelay, value, -1.0, 99999.0); - g_esRocketPlayer[admin].g_iRocketHit = iGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "RocketHit", "Rocket Hit", "Rocket_Hit", "hit", g_esRocketPlayer[admin].g_iRocketHit, value, -1, 1); - g_esRocketPlayer[admin].g_iRocketHitMode = iGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "RocketHitMode", "Rocket Hit Mode", "Rocket_Hit_Mode", "hitmode", g_esRocketPlayer[admin].g_iRocketHitMode, value, -1, 2); - g_esRocketPlayer[admin].g_iRocketMode = iGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "RocketMode", "Rocket Mode", "Rocket_Mode", "mode", g_esRocketPlayer[admin].g_iRocketMode, value, -1, 3); - g_esRocketPlayer[admin].g_flRocketRange = flGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "RocketRange", "Rocket Range", "Rocket_Range", "range", g_esRocketPlayer[admin].g_flRocketRange, value, -1.0, 99999.0); - g_esRocketPlayer[admin].g_flRocketRangeChance = flGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "RocketRangeChance", "Rocket Range Chance", "Rocket_Range_Chance", "rangechance", g_esRocketPlayer[admin].g_flRocketRangeChance, value, -1.0, 100.0); - g_esRocketPlayer[admin].g_iRocketRangeCooldown = iGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "RocketRangeCooldown", "Rocket Range Cooldown", "Rocket_Range_Cooldown", "rangecooldown", g_esRocketPlayer[admin].g_iRocketRangeCooldown, value, -1, 99999); - g_esRocketPlayer[admin].g_iAccessFlags = iGetAdminFlagsValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "AccessFlags", "Access Flags", "Access_Flags", "access", value); - g_esRocketPlayer[admin].g_iImmunityFlags = iGetAdminFlagsValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "ImmunityFlags", "Immunity Flags", "Immunity_Flags", "immunity", value); - } - } - - if (mode < 3 && type > 0) - { - if (special && specsection[0] != '\0') - { - g_esRocketSpecial[type].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esRocketSpecial[type].g_flCloseAreasOnly, value, -1.0, 99999.0); - g_esRocketSpecial[type].g_iComboAbility = iGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "ComboAbility", "Combo Ability", "Combo_Ability", "combo", g_esRocketSpecial[type].g_iComboAbility, value, -1, 1); - g_esRocketSpecial[type].g_iHumanAbility = iGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esRocketSpecial[type].g_iHumanAbility, value, -1, 2); - g_esRocketSpecial[type].g_iHumanAmmo = iGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esRocketSpecial[type].g_iHumanAmmo, value, -1, 99999); - g_esRocketSpecial[type].g_iHumanCooldown = iGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esRocketSpecial[type].g_iHumanCooldown, value, -1, 99999); - g_esRocketSpecial[type].g_iHumanRangeCooldown = iGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "HumanRangeCooldown", "Human Range Cooldown", "Human_Range_Cooldown", "hrangecooldown", g_esRocketSpecial[type].g_iHumanRangeCooldown, value, -1, 99999); - g_esRocketSpecial[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esRocketSpecial[type].g_flOpenAreasOnly, value, -1.0, 99999.0); - g_esRocketSpecial[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esRocketSpecial[type].g_iRequiresHumans, value, -1, 32); - g_esRocketSpecial[type].g_iRocketAbility = iGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esRocketSpecial[type].g_iRocketAbility, value, -1, 1); - g_esRocketSpecial[type].g_iRocketEffect = iGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "AbilityEffect", "Ability Effect", "Ability_Effect", "effect", g_esRocketSpecial[type].g_iRocketEffect, value, -1, 7); - g_esRocketSpecial[type].g_iRocketMessage = iGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esRocketSpecial[type].g_iRocketMessage, value, -1, 3); - g_esRocketSpecial[type].g_iRocketSight = iGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "AbilitySight", "Ability Sight", "Ability_Sight", "sight", g_esRocketSpecial[type].g_iRocketSight, value, -1, 5); - g_esRocketSpecial[type].g_iRocketBody = iGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "RocketBody", "Rocket Body", "Rocket_Body", "body", g_esRocketSpecial[type].g_iRocketBody, value, -1, 1); - g_esRocketSpecial[type].g_flRocketChance = flGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "RocketChance", "Rocket Chance", "Rocket_Chance", "chance", g_esRocketSpecial[type].g_flRocketChance, value, -1.0, 100.0); - g_esRocketSpecial[type].g_iRocketCooldown = iGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "RocketCooldown", "Rocket Cooldown", "Rocket_Cooldown", "cooldown", g_esRocketSpecial[type].g_iRocketCooldown, value, -1, 99999); - g_esRocketSpecial[type].g_flRocketCountdown = flGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "RocketCountdown", "Rocket Countdown", "Rocket_Countdown", "countdown", g_esRocketSpecial[type].g_flRocketCountdown, value, -1.0, 99999.0); - g_esRocketSpecial[type].g_flRocketDelay = flGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "RocketDelay", "Rocket Delay", "Rocket_Delay", "delay", g_esRocketSpecial[type].g_flRocketDelay, value, -1.0, 99999.0); - g_esRocketSpecial[type].g_iRocketHit = iGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "RocketHit", "Rocket Hit", "Rocket_Hit", "hit", g_esRocketSpecial[type].g_iRocketHit, value, -1, 1); - g_esRocketSpecial[type].g_iRocketHitMode = iGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "RocketHitMode", "Rocket Hit Mode", "Rocket_Hit_Mode", "hitmode", g_esRocketSpecial[type].g_iRocketHitMode, value, -1, 2); - g_esRocketSpecial[type].g_iRocketMode = iGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "RocketMode", "Rocket Mode", "Rocket_Mode", "mode", g_esRocketSpecial[type].g_iRocketMode, value, -1, 3); - g_esRocketSpecial[type].g_flRocketRange = flGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "RocketRange", "Rocket Range", "Rocket_Range", "range", g_esRocketSpecial[type].g_flRocketRange, value, -1.0, 99999.0); - g_esRocketSpecial[type].g_flRocketRangeChance = flGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "RocketRangeChance", "Rocket Range Chance", "Rocket_Range_Chance", "rangechance", g_esRocketSpecial[type].g_flRocketRangeChance, value, -1.0, 100.0); - g_esRocketSpecial[type].g_iRocketRangeCooldown = iGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "RocketRangeCooldown", "Rocket Range Cooldown", "Rocket_Range_Cooldown", "rangecooldown", g_esRocketSpecial[type].g_iRocketRangeCooldown, value, -1, 99999); - } - else - { - g_esRocketAbility[type].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esRocketAbility[type].g_flCloseAreasOnly, value, -1.0, 99999.0); - g_esRocketAbility[type].g_iComboAbility = iGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "ComboAbility", "Combo Ability", "Combo_Ability", "combo", g_esRocketAbility[type].g_iComboAbility, value, -1, 1); - g_esRocketAbility[type].g_iHumanAbility = iGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esRocketAbility[type].g_iHumanAbility, value, -1, 2); - g_esRocketAbility[type].g_iHumanAmmo = iGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esRocketAbility[type].g_iHumanAmmo, value, -1, 99999); - g_esRocketAbility[type].g_iHumanCooldown = iGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esRocketAbility[type].g_iHumanCooldown, value, -1, 99999); - g_esRocketAbility[type].g_iHumanRangeCooldown = iGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "HumanRangeCooldown", "Human Range Cooldown", "Human_Range_Cooldown", "hrangecooldown", g_esRocketAbility[type].g_iHumanRangeCooldown, value, -1, 99999); - g_esRocketAbility[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esRocketAbility[type].g_flOpenAreasOnly, value, -1.0, 99999.0); - g_esRocketAbility[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esRocketAbility[type].g_iRequiresHumans, value, -1, 32); - g_esRocketAbility[type].g_iRocketAbility = iGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esRocketAbility[type].g_iRocketAbility, value, -1, 1); - g_esRocketAbility[type].g_iRocketEffect = iGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "AbilityEffect", "Ability Effect", "Ability_Effect", "effect", g_esRocketAbility[type].g_iRocketEffect, value, -1, 7); - g_esRocketAbility[type].g_iRocketMessage = iGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esRocketAbility[type].g_iRocketMessage, value, -1, 3); - g_esRocketAbility[type].g_iRocketSight = iGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "AbilitySight", "Ability Sight", "Ability_Sight", "sight", g_esRocketAbility[type].g_iRocketSight, value, -1, 5); - g_esRocketAbility[type].g_iRocketBody = iGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "RocketBody", "Rocket Body", "Rocket_Body", "body", g_esRocketAbility[type].g_iRocketBody, value, -1, 1); - g_esRocketAbility[type].g_flRocketChance = flGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "RocketChance", "Rocket Chance", "Rocket_Chance", "chance", g_esRocketAbility[type].g_flRocketChance, value, -1.0, 100.0); - g_esRocketAbility[type].g_iRocketCooldown = iGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "RocketCooldown", "Rocket Cooldown", "Rocket_Cooldown", "cooldown", g_esRocketAbility[type].g_iRocketCooldown, value, -1, 99999); - g_esRocketAbility[type].g_flRocketCountdown = flGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "RocketCountdown", "Rocket Countdown", "Rocket_Countdown", "countdown", g_esRocketAbility[type].g_flRocketCountdown, value, -1.0, 99999.0); - g_esRocketAbility[type].g_flRocketDelay = flGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "RocketDelay", "Rocket Delay", "Rocket_Delay", "delay", g_esRocketAbility[type].g_flRocketDelay, value, -1.0, 99999.0); - g_esRocketAbility[type].g_iRocketHit = iGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "RocketHit", "Rocket Hit", "Rocket_Hit", "hit", g_esRocketAbility[type].g_iRocketHit, value, -1, 1); - g_esRocketAbility[type].g_iRocketHitMode = iGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "RocketHitMode", "Rocket Hit Mode", "Rocket_Hit_Mode", "hitmode", g_esRocketAbility[type].g_iRocketHitMode, value, -1, 2); - g_esRocketAbility[type].g_iRocketMode = iGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "RocketMode", "Rocket Mode", "Rocket_Mode", "mode", g_esRocketAbility[type].g_iRocketMode, value, -1, 3); - g_esRocketAbility[type].g_flRocketRange = flGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "RocketRange", "Rocket Range", "Rocket_Range", "range", g_esRocketAbility[type].g_flRocketRange, value, -1.0, 99999.0); - g_esRocketAbility[type].g_flRocketRangeChance = flGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "RocketRangeChance", "Rocket Range Chance", "Rocket_Range_Chance", "rangechance", g_esRocketAbility[type].g_flRocketRangeChance, value, -1.0, 100.0); - g_esRocketAbility[type].g_iRocketRangeCooldown = iGetKeyValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "RocketRangeCooldown", "Rocket Range Cooldown", "Rocket_Range_Cooldown", "rangecooldown", g_esRocketAbility[type].g_iRocketRangeCooldown, value, -1, 99999); - g_esRocketAbility[type].g_iAccessFlags = iGetAdminFlagsValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "AccessFlags", "Access Flags", "Access_Flags", "access", value); - g_esRocketAbility[type].g_iImmunityFlags = iGetAdminFlagsValue(subsection, MT_ROCKET_SECTION, MT_ROCKET_SECTION2, MT_ROCKET_SECTION3, MT_ROCKET_SECTION4, key, "ImmunityFlags", "Immunity Flags", "Immunity_Flags", "immunity", value); - } - } -} - -#if defined MT_ABILITIES_MAIN2 -void vRocketSettingsCached(int tank, bool apply, int type) -#else -public void MT_OnSettingsCached(int tank, bool apply, int type) -#endif -{ - bool bHuman = bIsValidClient(tank, MT_CHECK_FAKECLIENT); - g_esRocketPlayer[tank].g_iTankTypeRecorded = apply ? MT_GetRecordedTankType(tank, type) : 0; - g_esRocketPlayer[tank].g_iTankType = apply ? type : 0; - int iType = g_esRocketPlayer[tank].g_iTankTypeRecorded; - - if (bIsSpecialInfected(tank, MT_CHECK_INDEX|MT_CHECK_INGAME)) - { - g_esRocketCache[tank].g_flCloseAreasOnly = flGetSubSettingValue(apply, bHuman, g_esRocketTeammate[tank].g_flCloseAreasOnly, g_esRocketPlayer[tank].g_flCloseAreasOnly, g_esRocketSpecial[iType].g_flCloseAreasOnly, g_esRocketAbility[iType].g_flCloseAreasOnly, 1); - g_esRocketCache[tank].g_iComboAbility = iGetSubSettingValue(apply, bHuman, g_esRocketTeammate[tank].g_iComboAbility, g_esRocketPlayer[tank].g_iComboAbility, g_esRocketSpecial[iType].g_iComboAbility, g_esRocketAbility[iType].g_iComboAbility, 1); - g_esRocketCache[tank].g_flRocketChance = flGetSubSettingValue(apply, bHuman, g_esRocketTeammate[tank].g_flRocketChance, g_esRocketPlayer[tank].g_flRocketChance, g_esRocketSpecial[iType].g_flRocketChance, g_esRocketAbility[iType].g_flRocketChance, 1); - g_esRocketCache[tank].g_flRocketCountdown = flGetSubSettingValue(apply, bHuman, g_esRocketTeammate[tank].g_flRocketCountdown, g_esRocketPlayer[tank].g_flRocketCountdown, g_esRocketSpecial[iType].g_flRocketCountdown, g_esRocketAbility[iType].g_flRocketCountdown, 1); - g_esRocketCache[tank].g_flRocketDelay = flGetSubSettingValue(apply, bHuman, g_esRocketTeammate[tank].g_flRocketDelay, g_esRocketPlayer[tank].g_flRocketDelay, g_esRocketSpecial[iType].g_flRocketDelay, g_esRocketAbility[iType].g_flRocketDelay, 1); - g_esRocketCache[tank].g_flRocketRange = flGetSubSettingValue(apply, bHuman, g_esRocketTeammate[tank].g_flRocketRange, g_esRocketPlayer[tank].g_flRocketRange, g_esRocketSpecial[iType].g_flRocketRange, g_esRocketAbility[iType].g_flRocketRange, 1); - g_esRocketCache[tank].g_flRocketRangeChance = flGetSubSettingValue(apply, bHuman, g_esRocketTeammate[tank].g_flRocketRangeChance, g_esRocketPlayer[tank].g_flRocketRangeChance, g_esRocketSpecial[iType].g_flRocketRangeChance, g_esRocketAbility[iType].g_flRocketRangeChance, 1); - g_esRocketCache[tank].g_iHumanAbility = iGetSubSettingValue(apply, bHuman, g_esRocketTeammate[tank].g_iHumanAbility, g_esRocketPlayer[tank].g_iHumanAbility, g_esRocketSpecial[iType].g_iHumanAbility, g_esRocketAbility[iType].g_iHumanAbility, 1); - g_esRocketCache[tank].g_iHumanAmmo = iGetSubSettingValue(apply, bHuman, g_esRocketTeammate[tank].g_iHumanAmmo, g_esRocketPlayer[tank].g_iHumanAmmo, g_esRocketSpecial[iType].g_iHumanAmmo, g_esRocketAbility[iType].g_iHumanAmmo, 1); - g_esRocketCache[tank].g_iHumanCooldown = iGetSubSettingValue(apply, bHuman, g_esRocketTeammate[tank].g_iHumanCooldown, g_esRocketPlayer[tank].g_iHumanCooldown, g_esRocketSpecial[iType].g_iHumanCooldown, g_esRocketAbility[iType].g_iHumanCooldown, 1); - g_esRocketCache[tank].g_iHumanRangeCooldown = iGetSubSettingValue(apply, bHuman, g_esRocketTeammate[tank].g_iHumanRangeCooldown, g_esRocketPlayer[tank].g_iHumanRangeCooldown, g_esRocketSpecial[iType].g_iHumanRangeCooldown, g_esRocketAbility[iType].g_iHumanRangeCooldown, 1); - g_esRocketCache[tank].g_flOpenAreasOnly = flGetSubSettingValue(apply, bHuman, g_esRocketTeammate[tank].g_flOpenAreasOnly, g_esRocketPlayer[tank].g_flOpenAreasOnly, g_esRocketSpecial[iType].g_flOpenAreasOnly, g_esRocketAbility[iType].g_flOpenAreasOnly, 1); - g_esRocketCache[tank].g_iRequiresHumans = iGetSubSettingValue(apply, bHuman, g_esRocketTeammate[tank].g_iRequiresHumans, g_esRocketPlayer[tank].g_iRequiresHumans, g_esRocketSpecial[iType].g_iRequiresHumans, g_esRocketAbility[iType].g_iRequiresHumans, 1); - g_esRocketCache[tank].g_iRocketAbility = iGetSubSettingValue(apply, bHuman, g_esRocketTeammate[tank].g_iRocketAbility, g_esRocketPlayer[tank].g_iRocketAbility, g_esRocketSpecial[iType].g_iRocketAbility, g_esRocketAbility[iType].g_iRocketAbility, 1); - g_esRocketCache[tank].g_iRocketBody = iGetSubSettingValue(apply, bHuman, g_esRocketTeammate[tank].g_iRocketBody, g_esRocketPlayer[tank].g_iRocketBody, g_esRocketSpecial[iType].g_iRocketBody, g_esRocketAbility[iType].g_iRocketBody, 1); - g_esRocketCache[tank].g_iRocketCooldown = iGetSubSettingValue(apply, bHuman, g_esRocketTeammate[tank].g_iRocketCooldown, g_esRocketPlayer[tank].g_iRocketCooldown, g_esRocketSpecial[iType].g_iRocketCooldown, g_esRocketAbility[iType].g_iRocketCooldown, 1); - g_esRocketCache[tank].g_iRocketEffect = iGetSubSettingValue(apply, bHuman, g_esRocketTeammate[tank].g_iRocketEffect, g_esRocketPlayer[tank].g_iRocketEffect, g_esRocketSpecial[iType].g_iRocketEffect, g_esRocketAbility[iType].g_iRocketEffect, 1); - g_esRocketCache[tank].g_iRocketHit = iGetSubSettingValue(apply, bHuman, g_esRocketTeammate[tank].g_iRocketHit, g_esRocketPlayer[tank].g_iRocketHit, g_esRocketSpecial[iType].g_iRocketHit, g_esRocketAbility[iType].g_iRocketHit, 1); - g_esRocketCache[tank].g_iRocketHitMode = iGetSubSettingValue(apply, bHuman, g_esRocketTeammate[tank].g_iRocketHitMode, g_esRocketPlayer[tank].g_iRocketHitMode, g_esRocketSpecial[iType].g_iRocketHitMode, g_esRocketAbility[iType].g_iRocketHitMode, 1); - g_esRocketCache[tank].g_iRocketMessage = iGetSubSettingValue(apply, bHuman, g_esRocketTeammate[tank].g_iRocketMessage, g_esRocketPlayer[tank].g_iRocketMessage, g_esRocketSpecial[iType].g_iRocketMessage, g_esRocketAbility[iType].g_iRocketMessage, 1); - g_esRocketCache[tank].g_iRocketMode = iGetSubSettingValue(apply, bHuman, g_esRocketTeammate[tank].g_iRocketMode, g_esRocketPlayer[tank].g_iRocketMode, g_esRocketSpecial[iType].g_iRocketMode, g_esRocketAbility[iType].g_iRocketMode, 1); - g_esRocketCache[tank].g_iRocketRangeCooldown = iGetSubSettingValue(apply, bHuman, g_esRocketTeammate[tank].g_iRocketRangeCooldown, g_esRocketPlayer[tank].g_iRocketRangeCooldown, g_esRocketSpecial[iType].g_iRocketRangeCooldown, g_esRocketAbility[iType].g_iRocketRangeCooldown, 1); - g_esRocketCache[tank].g_iRocketSight = iGetSubSettingValue(apply, bHuman, g_esRocketTeammate[tank].g_iRocketSight, g_esRocketPlayer[tank].g_iRocketSight, g_esRocketSpecial[iType].g_iRocketSight, g_esRocketAbility[iType].g_iRocketSight, 1); - } - else - { - g_esRocketCache[tank].g_flCloseAreasOnly = flGetSettingValue(apply, bHuman, g_esRocketPlayer[tank].g_flCloseAreasOnly, g_esRocketAbility[iType].g_flCloseAreasOnly, 1); - g_esRocketCache[tank].g_iComboAbility = iGetSettingValue(apply, bHuman, g_esRocketPlayer[tank].g_iComboAbility, g_esRocketAbility[iType].g_iComboAbility, 1); - g_esRocketCache[tank].g_flRocketChance = flGetSettingValue(apply, bHuman, g_esRocketPlayer[tank].g_flRocketChance, g_esRocketAbility[iType].g_flRocketChance, 1); - g_esRocketCache[tank].g_flRocketCountdown = flGetSettingValue(apply, bHuman, g_esRocketPlayer[tank].g_flRocketCountdown, g_esRocketAbility[iType].g_flRocketCountdown, 1); - g_esRocketCache[tank].g_flRocketDelay = flGetSettingValue(apply, bHuman, g_esRocketPlayer[tank].g_flRocketDelay, g_esRocketAbility[iType].g_flRocketDelay, 1); - g_esRocketCache[tank].g_flRocketRange = flGetSettingValue(apply, bHuman, g_esRocketPlayer[tank].g_flRocketRange, g_esRocketAbility[iType].g_flRocketRange, 1); - g_esRocketCache[tank].g_flRocketRangeChance = flGetSettingValue(apply, bHuman, g_esRocketPlayer[tank].g_flRocketRangeChance, g_esRocketAbility[iType].g_flRocketRangeChance, 1); - g_esRocketCache[tank].g_iHumanAbility = iGetSettingValue(apply, bHuman, g_esRocketPlayer[tank].g_iHumanAbility, g_esRocketAbility[iType].g_iHumanAbility, 1); - g_esRocketCache[tank].g_iHumanAmmo = iGetSettingValue(apply, bHuman, g_esRocketPlayer[tank].g_iHumanAmmo, g_esRocketAbility[iType].g_iHumanAmmo, 1); - g_esRocketCache[tank].g_iHumanCooldown = iGetSettingValue(apply, bHuman, g_esRocketPlayer[tank].g_iHumanCooldown, g_esRocketAbility[iType].g_iHumanCooldown, 1); - g_esRocketCache[tank].g_iHumanRangeCooldown = iGetSettingValue(apply, bHuman, g_esRocketPlayer[tank].g_iHumanRangeCooldown, g_esRocketAbility[iType].g_iHumanRangeCooldown, 1); - g_esRocketCache[tank].g_flOpenAreasOnly = flGetSettingValue(apply, bHuman, g_esRocketPlayer[tank].g_flOpenAreasOnly, g_esRocketAbility[iType].g_flOpenAreasOnly, 1); - g_esRocketCache[tank].g_iRequiresHumans = iGetSettingValue(apply, bHuman, g_esRocketPlayer[tank].g_iRequiresHumans, g_esRocketAbility[iType].g_iRequiresHumans, 1); - g_esRocketCache[tank].g_iRocketAbility = iGetSettingValue(apply, bHuman, g_esRocketPlayer[tank].g_iRocketAbility, g_esRocketAbility[iType].g_iRocketAbility, 1); - g_esRocketCache[tank].g_iRocketBody = iGetSettingValue(apply, bHuman, g_esRocketPlayer[tank].g_iRocketBody, g_esRocketAbility[iType].g_iRocketBody, 1); - g_esRocketCache[tank].g_iRocketCooldown = iGetSettingValue(apply, bHuman, g_esRocketPlayer[tank].g_iRocketCooldown, g_esRocketAbility[iType].g_iRocketCooldown, 1); - g_esRocketCache[tank].g_iRocketEffect = iGetSettingValue(apply, bHuman, g_esRocketPlayer[tank].g_iRocketEffect, g_esRocketAbility[iType].g_iRocketEffect, 1); - g_esRocketCache[tank].g_iRocketHit = iGetSettingValue(apply, bHuman, g_esRocketPlayer[tank].g_iRocketHit, g_esRocketAbility[iType].g_iRocketHit, 1); - g_esRocketCache[tank].g_iRocketHitMode = iGetSettingValue(apply, bHuman, g_esRocketPlayer[tank].g_iRocketHitMode, g_esRocketAbility[iType].g_iRocketHitMode, 1); - g_esRocketCache[tank].g_iRocketMessage = iGetSettingValue(apply, bHuman, g_esRocketPlayer[tank].g_iRocketMessage, g_esRocketAbility[iType].g_iRocketMessage, 1); - g_esRocketCache[tank].g_iRocketMode = iGetSettingValue(apply, bHuman, g_esRocketPlayer[tank].g_iRocketMode, g_esRocketAbility[iType].g_iRocketMode, 1); - g_esRocketCache[tank].g_iRocketRangeCooldown = iGetSettingValue(apply, bHuman, g_esRocketPlayer[tank].g_iRocketRangeCooldown, g_esRocketAbility[iType].g_iRocketRangeCooldown, 1); - g_esRocketCache[tank].g_iRocketSight = iGetSettingValue(apply, bHuman, g_esRocketPlayer[tank].g_iRocketSight, g_esRocketAbility[iType].g_iRocketSight, 1); - } -} - -#if defined MT_ABILITIES_MAIN2 -void vRocketCopyStats(int oldTank, int newTank) -#else -public void MT_OnCopyStats(int oldTank, int newTank) -#endif -{ - vRocketCopyStats2(oldTank, newTank); - - if (oldTank != newTank) - { - vRemoveRocket(oldTank); - } -} - -#if !defined MT_ABILITIES_MAIN2 -public void MT_OnPluginUpdate() -{ - MT_ReloadPlugin(null); -} -#endif - -#if defined MT_ABILITIES_MAIN2 -void vRocketPluginEnd() -#else -public void MT_OnPluginEnd() -#endif -{ - for (int iSurvivor = 1; iSurvivor <= MaxClients; iSurvivor++) - { - if (bIsSurvivor(iSurvivor, MT_CHECK_INGAME|MT_CHECK_ALIVE) && g_esRocketPlayer[iSurvivor].g_bAffected) - { - SetEntityGravity(iSurvivor, 1.0); - } - } -} - -#if defined MT_ABILITIES_MAIN2 -void vRocketEventFired(Event event, const char[] name) -#else -public void MT_OnEventFired(Event event, const char[] name, bool dontBroadcast) -#endif -{ - if (StrEqual(name, "bot_player_replace")) - { - int iBotId = event.GetInt("bot"), iBot = GetClientOfUserId(iBotId), - iTankId = event.GetInt("player"), iTank = GetClientOfUserId(iTankId); - if (bIsValidClient(iBot) && bIsInfected(iTank)) - { - vRocketCopyStats2(iBot, iTank); - vRemoveRocket(iBot); - } - } - else if (StrEqual(name, "mission_lost") || StrEqual(name, "round_start") || StrEqual(name, "round_end")) - { - vRocketReset(); - } - else if (StrEqual(name, "player_bot_replace")) - { - int iTankId = event.GetInt("player"), iTank = GetClientOfUserId(iTankId), - iBotId = event.GetInt("bot"), iBot = GetClientOfUserId(iBotId); - if (bIsValidClient(iTank) && bIsInfected(iBot)) - { - vRocketCopyStats2(iTank, iBot); - vRemoveRocket(iTank); - } - } - else if (StrEqual(name, "player_death") || StrEqual(name, "player_spawn")) - { - int iTankId = event.GetInt("userid"), iTank = GetClientOfUserId(iTankId); - if (MT_IsTankSupported(iTank, MT_CHECK_INDEX|MT_CHECK_INGAME)) - { - vRemoveRocket(iTank); - } - } - else if (StrEqual(name, "player_now_it")) - { - bool bExploded = event.GetBool("exploded"); - int iSurvivorId = event.GetInt("userid"), iSurvivor = GetClientOfUserId(iSurvivorId), - iBoomerId = event.GetInt("attacker"), iBoomer = GetClientOfUserId(iBoomerId); - if (bIsBoomer(iBoomer) && bIsSurvivor(iSurvivor) && !bExploded) - { - vRocketHit(iSurvivor, iBoomer, GetRandomFloat(0.1, 100.0), g_esRocketCache[iBoomer].g_flRocketChance, g_esRocketCache[iBoomer].g_iRocketHit, MT_MESSAGE_RANGE, MT_ATTACK_RANGE); - } - } -} - -#if defined MT_ABILITIES_MAIN2 -void vRocketPlayerEventKilled(int victim, int attacker) -#else -public void MT_OnPlayerEventKilled(int victim, int attacker) -#endif -{ - if (bIsSurvivor(victim, MT_CHECK_INDEX|MT_CHECK_INGAME) && MT_IsTankSupported(attacker, MT_CHECK_INDEX|MT_CHECK_INGAME) && MT_IsCustomTankSupported(attacker) && g_esRocketCache[attacker].g_iRocketAbility == 1 && g_esRocketCache[attacker].g_iRocketBody == 1) - { - g_iRocketDeathModelOwner = GetClientUserId(victim); - } -} - -#if defined MT_ABILITIES_MAIN2 -void vRocketAbilityActivated(int tank) -#else -public void MT_OnAbilityActivated(int tank) -#endif -{ - if (MT_IsTankSupported(tank, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_FAKECLIENT) && ((!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esRocketAbility[g_esRocketPlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esRocketPlayer[tank].g_iAccessFlags)) || g_esRocketCache[tank].g_iHumanAbility == 0)) - { - return; - } - - if (MT_IsTankSupported(tank) && (!bIsInfected(tank, MT_CHECK_FAKECLIENT) || g_esRocketCache[tank].g_iHumanAbility != 1) && MT_IsCustomTankSupported(tank) && g_esRocketCache[tank].g_iRocketAbility == 1 && g_esRocketCache[tank].g_iComboAbility == 0) - { - vRocketAbility(tank, GetRandomFloat(0.1, 100.0)); - } -} - -#if defined MT_ABILITIES_MAIN2 -void vRocketButtonPressed(int tank, int button) -#else -public void MT_OnButtonPressed(int tank, int button) -#endif -{ - if (MT_IsTankSupported(tank, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_ALIVE|MT_CHECK_FAKECLIENT) && MT_IsCustomTankSupported(tank)) - { - if (bIsAreaNarrow(tank, g_esRocketCache[tank].g_flOpenAreasOnly) || bIsAreaWide(tank, g_esRocketCache[tank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esRocketPlayer[tank].g_iTankType, tank) || (g_esRocketCache[tank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esRocketCache[tank].g_iRequiresHumans) || (!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esRocketAbility[g_esRocketPlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esRocketPlayer[tank].g_iAccessFlags))) - { - return; - } - - if ((button & MT_SUB_KEY) && g_esRocketCache[tank].g_iRocketAbility == 1 && g_esRocketCache[tank].g_iHumanAbility == 1) - { - int iTime = GetTime(); - - switch (g_esRocketPlayer[tank].g_iRangeCooldown == -1 || g_esRocketPlayer[tank].g_iRangeCooldown <= iTime) - { - case true: vRocketAbility(tank, GetRandomFloat(0.1, 100.0)); - case false: MT_PrintToChat(tank, "%s %t", MT_TAG3, "RocketHuman3", (g_esRocketPlayer[tank].g_iRangeCooldown - iTime)); - } - } - } -} - -#if defined MT_ABILITIES_MAIN2 -void vRocketChangeType(int tank, int oldType) -#else -public void MT_OnChangeType(int tank, int oldType, int newType, bool revert) -#endif -{ - if (oldType <= 0) - { - return; - } - - vRemoveRocket(tank); -} - -void vRocket(int tank, int survivor, int enabled, int messages, int pos = -1) -{ - float flDelay = (pos != -1) ? 0.1 : g_esRocketCache[tank].g_flRocketDelay; - if (flDelay > 0.0) - { - DataPack dpRocketLaunch; - CreateDataTimer(flDelay, tTimerRocketLaunch, dpRocketLaunch, TIMER_FLAG_NO_MAPCHANGE); - dpRocketLaunch.WriteCell(GetClientUserId(survivor)); - dpRocketLaunch.WriteCell(GetClientUserId(tank)); - dpRocketLaunch.WriteCell(g_esRocketPlayer[tank].g_iTankType); - dpRocketLaunch.WriteCell(enabled); - - DataPack dpRocketDetonate; - CreateDataTimer((flDelay + 1.5), tTimerRocketDetonate, dpRocketDetonate, TIMER_FLAG_NO_MAPCHANGE); - dpRocketDetonate.WriteCell(GetClientUserId(survivor)); - dpRocketDetonate.WriteCell(GetClientUserId(tank)); - dpRocketDetonate.WriteCell(g_esRocketPlayer[tank].g_iTankType); - dpRocketDetonate.WriteCell(enabled); - dpRocketDetonate.WriteCell(messages); - } -} - -void vRocketAbility(int tank, float random, int pos = -1) -{ - if (bIsAreaNarrow(tank, g_esRocketCache[tank].g_flOpenAreasOnly) || bIsAreaWide(tank, g_esRocketCache[tank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esRocketPlayer[tank].g_iTankType, tank) || (g_esRocketCache[tank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esRocketCache[tank].g_iRequiresHumans) || (!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esRocketAbility[g_esRocketPlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esRocketPlayer[tank].g_iAccessFlags))) - { - return; - } - - if (!bIsInfected(tank, MT_CHECK_FAKECLIENT) || (g_esRocketPlayer[tank].g_iAmmoCount < g_esRocketCache[tank].g_iHumanAmmo && g_esRocketCache[tank].g_iHumanAmmo > 0)) - { - g_esRocketPlayer[tank].g_bFailed = false; - g_esRocketPlayer[tank].g_bNoAmmo = false; - - float flTankPos[3], flSurvivorPos[3]; - GetClientAbsOrigin(tank, flTankPos); - float flRange = (pos != -1) ? MT_GetCombinationSetting(tank, 9, pos) : g_esRocketCache[tank].g_flRocketRange, - flChance = (pos != -1) ? MT_GetCombinationSetting(tank, 10, pos) : g_esRocketCache[tank].g_flRocketRangeChance; - int iSurvivorCount = 0; - for (int iSurvivor = 1; iSurvivor <= MaxClients; iSurvivor++) - { - if (bIsSurvivor(iSurvivor, MT_CHECK_INGAME|MT_CHECK_ALIVE) && !MT_IsAdminImmune(iSurvivor, tank) && !bIsAdminImmune(iSurvivor, g_esRocketPlayer[tank].g_iTankType, g_esRocketAbility[g_esRocketPlayer[tank].g_iTankTypeRecorded].g_iImmunityFlags, g_esRocketPlayer[iSurvivor].g_iImmunityFlags)) - { - GetClientAbsOrigin(iSurvivor, flSurvivorPos); - if (GetVectorDistance(flTankPos, flSurvivorPos) <= flRange && bIsVisibleToPlayer(tank, iSurvivor, g_esRocketCache[tank].g_iRocketSight, .range = flRange)) - { - vRocketHit(iSurvivor, tank, random, flChance, g_esRocketCache[tank].g_iRocketAbility, MT_MESSAGE_RANGE, MT_ATTACK_RANGE, pos); - - iSurvivorCount++; - } - } - } - - if (iSurvivorCount == 0) - { - if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esRocketCache[tank].g_iHumanAbility == 1) - { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "RocketHuman4"); - } - } - } - else if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esRocketCache[tank].g_iHumanAbility == 1) - { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "RocketAmmo"); - } -} - -void vRocketHit(int survivor, int tank, float random, float chance, int enabled, int messages, int flags, int pos = -1) -{ - if (bIsAreaNarrow(tank, g_esRocketCache[tank].g_flOpenAreasOnly) || bIsAreaWide(tank, g_esRocketCache[tank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esRocketPlayer[tank].g_iTankType, tank) || (g_esRocketCache[tank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esRocketCache[tank].g_iRequiresHumans) || (!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esRocketAbility[g_esRocketPlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esRocketPlayer[tank].g_iAccessFlags)) || MT_IsAdminImmune(survivor, tank) || bIsAdminImmune(survivor, g_esRocketPlayer[tank].g_iTankType, g_esRocketAbility[g_esRocketPlayer[tank].g_iTankTypeRecorded].g_iImmunityFlags, g_esRocketPlayer[survivor].g_iImmunityFlags)) - { - return; - } - - int iTime = GetTime(); - if (((flags & MT_ATTACK_RANGE) && g_esRocketPlayer[tank].g_iRangeCooldown != -1 && g_esRocketPlayer[tank].g_iRangeCooldown >= iTime) || (((flags & MT_ATTACK_CLAW) || (flags & MT_ATTACK_MELEE)) && g_esRocketPlayer[tank].g_iCooldown != -1 && g_esRocketPlayer[tank].g_iCooldown >= iTime)) - { - return; - } - - if (enabled == 1 && bIsSurvivor(survivor) && !MT_DoesSurvivorHaveRewardType(survivor, MT_REWARD_GODMODE)) - { - if (!bIsInfected(tank, MT_CHECK_FAKECLIENT) || (flags & MT_ATTACK_CLAW) || (flags & MT_ATTACK_MELEE) || (g_esRocketPlayer[tank].g_iAmmoCount < g_esRocketCache[tank].g_iHumanAmmo && g_esRocketCache[tank].g_iHumanAmmo > 0)) - { - if (random <= chance && !g_esRocketPlayer[survivor].g_bAffected) - { - if ((messages & MT_MESSAGE_MELEE) && !bIsVisibleToPlayer(tank, survivor, g_esRocketCache[tank].g_iRocketSight, .range = 100.0)) - { - return; - } - - int iFlame = CreateEntityByName("env_steam"); - if (bIsValidEntity(iFlame)) - { - g_esRocketPlayer[survivor].g_bAffected = true; - g_esRocketPlayer[survivor].g_iOwner = tank; - - int iCooldown = -1; - if ((flags & MT_ATTACK_RANGE) && (g_esRocketPlayer[tank].g_iRangeCooldown == -1 || g_esRocketPlayer[tank].g_iRangeCooldown <= iTime)) - { - if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esRocketCache[tank].g_iHumanAbility == 1) - { - g_esRocketPlayer[tank].g_iAmmoCount++; - - MT_PrintToChat(tank, "%s %t", MT_TAG3, "RocketHuman", g_esRocketPlayer[tank].g_iAmmoCount, g_esRocketCache[tank].g_iHumanAmmo); - } - - iCooldown = (pos != -1) ? RoundToNearest(MT_GetCombinationSetting(tank, 11, pos)) : g_esRocketCache[tank].g_iRocketRangeCooldown; - iCooldown = (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esRocketCache[tank].g_iHumanAbility == 1 && g_esRocketPlayer[tank].g_iAmmoCount < g_esRocketCache[tank].g_iHumanAmmo && g_esRocketCache[tank].g_iHumanAmmo > 0) ? g_esRocketCache[tank].g_iHumanRangeCooldown : iCooldown; - g_esRocketPlayer[tank].g_iRangeCooldown = (iTime + iCooldown); - if (g_esRocketPlayer[tank].g_iRangeCooldown != -1 && g_esRocketPlayer[tank].g_iRangeCooldown >= iTime) - { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "RocketHuman5", (g_esRocketPlayer[tank].g_iRangeCooldown - iTime)); - } - } - else if (((flags & MT_ATTACK_CLAW) || (flags & MT_ATTACK_MELEE)) && (g_esRocketPlayer[tank].g_iCooldown == -1 || g_esRocketPlayer[tank].g_iCooldown <= iTime)) - { - iCooldown = (pos != -1) ? RoundToNearest(MT_GetCombinationSetting(tank, 2, pos)) : g_esRocketCache[tank].g_iRocketCooldown; - iCooldown = (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esRocketCache[tank].g_iHumanAbility == 1) ? g_esRocketCache[tank].g_iHumanCooldown : iCooldown; - g_esRocketPlayer[tank].g_iCooldown = (iTime + iCooldown); - if (g_esRocketPlayer[tank].g_iCooldown != -1 && g_esRocketPlayer[tank].g_iCooldown >= iTime) - { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "RocketHuman5", (g_esRocketPlayer[tank].g_iCooldown - iTime)); - } - } - - float flPos[3], flAngles[3]; - GetEntPropVector(survivor, Prop_Data, "m_vecOrigin", flPos); - flPos[2] += 30.0; - flAngles[0] = 90.0; - flAngles[1] = 0.0; - flAngles[2] = 0.0; - - DispatchKeyValueInt(iFlame, "spawnflags", 1); - DispatchKeyValueInt(iFlame, "Type", 0); - DispatchKeyValueInt(iFlame, "InitialState", 1); - DispatchKeyValueInt(iFlame, "Spreadspeed", 10); - DispatchKeyValueInt(iFlame, "Speed", 800); - DispatchKeyValueInt(iFlame, "Startsize", 10); - DispatchKeyValueInt(iFlame, "EndSize", 250); - DispatchKeyValueInt(iFlame, "Rate", 15); - DispatchKeyValueInt(iFlame, "JetLength", 400); - - SetEntityRenderColor(iFlame, 180, 70, 10, 180); - TeleportEntity(iFlame, flPos, flAngles); - DispatchSpawn(iFlame); - vSetEntityParent(iFlame, survivor); - - iFlame = EntIndexToEntRef(iFlame); - vDeleteEntity(iFlame, (3.0 + g_esRocketCache[tank].g_flRocketCountdown)); - - vScreenEffect(survivor, tank, g_esRocketCache[tank].g_iRocketEffect, flags); - EmitSoundToAll(SOUND_FIRE, survivor); - - switch (g_esRocketCache[tank].g_flRocketCountdown > 0.0) - { - case true: - { - DataPack dpRocket; - CreateDataTimer(g_esRocketCache[tank].g_flRocketCountdown, tTimerRocket, dpRocket, TIMER_FLAG_NO_MAPCHANGE); - dpRocket.WriteCell(GetClientUserId(survivor)); - dpRocket.WriteCell(GetClientUserId(tank)); - dpRocket.WriteCell(enabled); - dpRocket.WriteCell(messages); - dpRocket.WriteCell(pos); - } - case false: vRocket(tank, survivor, enabled, messages, pos); - } - } - } - else if ((flags & MT_ATTACK_RANGE) && (g_esRocketPlayer[tank].g_iRangeCooldown == -1 || g_esRocketPlayer[tank].g_iRangeCooldown <= iTime)) - { - if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esRocketCache[tank].g_iHumanAbility == 1 && !g_esRocketPlayer[tank].g_bFailed) - { - g_esRocketPlayer[tank].g_bFailed = true; - - MT_PrintToChat(tank, "%s %t", MT_TAG3, "RocketHuman2"); - } - } - } - else if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esRocketCache[tank].g_iHumanAbility == 1 && !g_esRocketPlayer[tank].g_bNoAmmo) - { - g_esRocketPlayer[tank].g_bNoAmmo = true; - - MT_PrintToChat(tank, "%s %t", MT_TAG3, "RocketAmmo"); - } - } -} - -void vRocketCopyStats2(int oldTank, int newTank) -{ - g_esRocketPlayer[newTank].g_iAmmoCount = g_esRocketPlayer[oldTank].g_iAmmoCount; - g_esRocketPlayer[newTank].g_iCooldown = g_esRocketPlayer[oldTank].g_iCooldown; - g_esRocketPlayer[newTank].g_iRangeCooldown = g_esRocketPlayer[oldTank].g_iRangeCooldown; -} - -void vRemoveRocket(int tank) -{ - for (int iSurvivor = 1; iSurvivor <= MaxClients; iSurvivor++) - { - if (bIsSurvivor(iSurvivor, MT_CHECK_INGAME|MT_CHECK_ALIVE) && g_esRocketPlayer[iSurvivor].g_bAffected && g_esRocketPlayer[iSurvivor].g_iOwner == tank) - { - g_esRocketPlayer[iSurvivor].g_bAffected = false; - g_esRocketPlayer[iSurvivor].g_iOwner = -1; - } - } - - vRocketReset3(tank); -} - -void vRocketReset() -{ - for (int iPlayer = 1; iPlayer <= MaxClients; iPlayer++) - { - if (bIsValidClient(iPlayer, MT_CHECK_INGAME)) - { - vRocketReset3(iPlayer); - - g_esRocketPlayer[iPlayer].g_iOwner = -1; - } - } -} - -void vRocketReset2(int survivor) -{ - g_esRocketPlayer[survivor].g_bAffected = false; - g_esRocketPlayer[survivor].g_iOwner = -1; - - SetEntityGravity(survivor, 1.0); -} - -void vRocketReset3(int tank) -{ - g_esRocketPlayer[tank].g_bAffected = false; - g_esRocketPlayer[tank].g_bFailed = false; - g_esRocketPlayer[tank].g_bNoAmmo = false; - g_esRocketPlayer[tank].g_iAmmoCount = 0; - g_esRocketPlayer[tank].g_iCooldown = -1; - g_esRocketPlayer[tank].g_iRangeCooldown = -1; -} - -void tTimerRocket(Handle timer, DataPack pack) -{ - pack.Reset(); - - int iSurvivor = GetClientOfUserId(pack.ReadCell()); - if (!MT_IsCorePluginEnabled() || !bIsSurvivor(iSurvivor)) - { - g_esRocketPlayer[iSurvivor].g_bAffected = false; - g_esRocketPlayer[iSurvivor].g_iOwner = -1; - - return; - } - - int iTank = GetClientOfUserId(pack.ReadCell()), iRocketEnabled = pack.ReadCell(); - if (!MT_IsTankSupported(iTank) || bIsAreaNarrow(iTank, g_esRocketCache[iTank].g_flOpenAreasOnly) || bIsAreaWide(iTank, g_esRocketCache[iTank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esRocketPlayer[iTank].g_iTankType, iTank) || (g_esRocketCache[iTank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esRocketCache[iTank].g_iRequiresHumans) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esRocketAbility[g_esRocketPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esRocketPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esRocketPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || MT_IsAdminImmune(iSurvivor, iTank) || bIsAdminImmune(iSurvivor, g_esRocketPlayer[iTank].g_iTankType, g_esRocketAbility[g_esRocketPlayer[iTank].g_iTankTypeRecorded].g_iImmunityFlags, g_esRocketPlayer[iSurvivor].g_iImmunityFlags) || iRocketEnabled == 0 || !g_esRocketPlayer[iSurvivor].g_bAffected || MT_DoesSurvivorHaveRewardType(iSurvivor, MT_REWARD_GODMODE)) - { - vRocketReset2(iSurvivor); - - return; - } - - int iMessage = pack.ReadCell(), iPos = pack.ReadCell(); - vRocket(iTank, iSurvivor, iRocketEnabled, iMessage, iPos); -} - -void tTimerRocketCombo(Handle timer, DataPack pack) -{ - pack.Reset(); - - int iTank = GetClientOfUserId(pack.ReadCell()); - if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esRocketAbility[g_esRocketPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esRocketPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esRocketPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esRocketCache[iTank].g_iRocketAbility == 0) - { - return; - } - - float flRandom = pack.ReadFloat(); - int iPos = pack.ReadCell(); - vRocketAbility(iTank, flRandom, iPos); -} - -void tTimerRocketCombo2(Handle timer, DataPack pack) -{ - pack.Reset(); - - int iSurvivor = GetClientOfUserId(pack.ReadCell()); - if (!bIsSurvivor(iSurvivor)) - { - return; - } - - int iTank = GetClientOfUserId(pack.ReadCell()); - if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esRocketAbility[g_esRocketPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esRocketPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esRocketPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esRocketCache[iTank].g_iRocketHit == 0) - { - return; - } - - float flRandom = pack.ReadFloat(), flChance = pack.ReadFloat(); - int iPos = pack.ReadCell(); - char sClassname[32]; - pack.ReadString(sClassname, sizeof sClassname); - if ((g_esRocketCache[iTank].g_iRocketHitMode == 0 || g_esRocketCache[iTank].g_iRocketHitMode == 1) && (bIsSpecialInfected(iTank) || StrEqual(sClassname[7], "tank_claw") || StrEqual(sClassname, "tank_rock"))) - { - vRocketHit(iSurvivor, iTank, flRandom, flChance, g_esRocketCache[iTank].g_iRocketHit, MT_MESSAGE_MELEE, MT_ATTACK_CLAW, iPos); - } - else if ((g_esRocketCache[iTank].g_iRocketHitMode == 0 || g_esRocketCache[iTank].g_iRocketHitMode == 2) && StrEqual(sClassname[7], "melee")) - { - vRocketHit(iSurvivor, iTank, flRandom, flChance, g_esRocketCache[iTank].g_iRocketHit, MT_MESSAGE_MELEE, MT_ATTACK_MELEE, iPos); - } -} - -void tTimerRocketLaunch(Handle timer, DataPack pack) -{ - pack.Reset(); - - int iSurvivor = GetClientOfUserId(pack.ReadCell()); - if (!MT_IsCorePluginEnabled() || !bIsSurvivor(iSurvivor)) - { - g_esRocketPlayer[iSurvivor].g_bAffected = false; - g_esRocketPlayer[iSurvivor].g_iOwner = -1; - - return; - } - - int iTank = GetClientOfUserId(pack.ReadCell()), iType = pack.ReadCell(), iRocketEnabled = pack.ReadCell(); - if (!MT_IsTankSupported(iTank) || bIsAreaNarrow(iTank, g_esRocketCache[iTank].g_flOpenAreasOnly) || bIsAreaWide(iTank, g_esRocketCache[iTank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esRocketPlayer[iTank].g_iTankType, iTank) || (g_esRocketCache[iTank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esRocketCache[iTank].g_iRequiresHumans) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esRocketAbility[g_esRocketPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esRocketPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esRocketPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || iType != g_esRocketPlayer[iTank].g_iTankType || MT_IsAdminImmune(iSurvivor, iTank) || bIsAdminImmune(iSurvivor, g_esRocketPlayer[iTank].g_iTankType, g_esRocketAbility[g_esRocketPlayer[iTank].g_iTankTypeRecorded].g_iImmunityFlags, g_esRocketPlayer[iSurvivor].g_iImmunityFlags) || iRocketEnabled == 0 || !g_esRocketPlayer[iSurvivor].g_bAffected || MT_DoesSurvivorHaveRewardType(iSurvivor, MT_REWARD_GODMODE)) - { - vRocketReset2(iSurvivor); - - return; - } - - float flVelocity[3]; - flVelocity[0] = 0.0; - flVelocity[1] = 0.0; - flVelocity[2] = 800.0; - - EmitSoundToAll(SOUND_EXPLOSION, iSurvivor); - EmitSoundToAll(SOUND_LAUNCH, iSurvivor); - - TeleportEntity(iSurvivor, .velocity = flVelocity); - SetEntityGravity(iSurvivor, 0.1); -} - -void tTimerRocketDetonate(Handle timer, DataPack pack) -{ - pack.Reset(); - - int iSurvivor = GetClientOfUserId(pack.ReadCell()); - if (!MT_IsCorePluginEnabled() || !bIsSurvivor(iSurvivor)) - { - g_esRocketPlayer[iSurvivor].g_bAffected = false; - g_esRocketPlayer[iSurvivor].g_iOwner = -1; - - return; - } - - int iTank = GetClientOfUserId(pack.ReadCell()), iType = pack.ReadCell(), iRocketEnabled = pack.ReadCell(); - if (!MT_IsTankSupported(iTank) || bIsAreaNarrow(iTank, g_esRocketCache[iTank].g_flOpenAreasOnly) || bIsAreaWide(iTank, g_esRocketCache[iTank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esRocketPlayer[iTank].g_iTankType, iTank) || (g_esRocketCache[iTank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esRocketCache[iTank].g_iRequiresHumans) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esRocketAbility[g_esRocketPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esRocketPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esRocketPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || iType != g_esRocketPlayer[iTank].g_iTankType || MT_IsAdminImmune(iSurvivor, iTank) || bIsAdminImmune(iSurvivor, g_esRocketPlayer[iTank].g_iTankType, g_esRocketAbility[g_esRocketPlayer[iTank].g_iTankTypeRecorded].g_iImmunityFlags, g_esRocketPlayer[iSurvivor].g_iImmunityFlags) || iRocketEnabled == 0 || !g_esRocketPlayer[iSurvivor].g_bAffected || MT_DoesSurvivorHaveRewardType(iSurvivor, MT_REWARD_GODMODE)) - { - vRocketReset2(iSurvivor); - - return; - } - - g_esRocketPlayer[iSurvivor].g_bAffected = false; - g_esRocketPlayer[iSurvivor].g_iOwner = -1; - - float flPos[3]; - GetClientAbsOrigin(iSurvivor, flPos); - TE_SetupExplosion(flPos, g_iRocketSprite, 10.0, 1, 0, 600, 5000); - TE_SendToAll(); - SetEntityGravity(iSurvivor, 1.0); - - if (g_esRocketCache[iTank].g_flRocketCountdown <= 0.0 || !bIsAreaNarrow(iSurvivor)) - { - switch (g_esRocketCache[iTank].g_iRocketMode) - { - case 0, 3: - { - switch (MT_GetRandomInt(1, 2)) - { - case 1: - { - SetEntProp(iSurvivor, Prop_Send, "m_isIncapacitated", 1); - SetEntPropFloat(iSurvivor, Prop_Send, "m_healthBuffer", 1.0); - vDamagePlayer(iSurvivor, iTank, float(GetEntProp(iSurvivor, Prop_Data, "m_iHealth")), "128"); - } - case 2: vDamagePlayer(iSurvivor, iTank, float(GetEntProp(iSurvivor, Prop_Data, "m_iHealth")), "128"); - } - } - case 1: - { - SetEntProp(iSurvivor, Prop_Send, "m_isIncapacitated", 1); - SetEntPropFloat(iSurvivor, Prop_Send, "m_healthBuffer", 1.0); - vDamagePlayer(iSurvivor, iTank, float(GetEntProp(iSurvivor, Prop_Data, "m_iHealth")), "128"); - } - case 2: vDamagePlayer(iSurvivor, iTank, float(GetEntProp(iSurvivor, Prop_Data, "m_iHealth")), "128"); - } - - int iMessage = pack.ReadCell(); - if (g_esRocketCache[iTank].g_iRocketMessage & iMessage) - { - char sTankName[64]; - MT_GetTankName(iTank, sTankName); - MT_PrintToChatAll("%s %t", MT_TAG2, "Rocket", sTankName, iSurvivor); - MT_LogMessage(MT_LOG_ABILITY, "%s %T", MT_TAG, "Rocket", LANG_SERVER, sTankName, iSurvivor); - } - } -} \ No newline at end of file diff --git a/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_shake.sp b/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_shake.sp deleted file mode 100644 index a0280c331f..0000000000 --- a/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_shake.sp +++ /dev/null @@ -1,1367 +0,0 @@ -/** - * Mutant Tanks: a L4D/L4D2 SourceMod Plugin - * Copyright (C) 2024 Alfred "Psyk0tik" Llagas - * - * 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 . - **/ - -#define MT_SHAKE_COMPILE_METHOD 0 // 0: packaged, 1: standalone - -#if !defined MT_ABILITIES_MAIN2 - #if MT_SHAKE_COMPILE_METHOD == 1 - #include - #include - #else - #error This file must be inside "scripting/mutant_tanks/abilities2" while compiling "mt_abilities2.sp" to include its content. - #endif -public Plugin myinfo = -{ - name = "[MT] Shake Ability", - author = MT_AUTHOR, - description = "The Mutant Tank shakes the survivors' screens.", - version = MT_VERSION, - url = MT_URL -}; - -bool g_bDedicated, g_bLateLoad, g_bSecondGame; - -public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max) -{ - switch (GetEngineVersion()) - { - case Engine_Left4Dead: g_bSecondGame = false; - case Engine_Left4Dead2: g_bSecondGame = true; - default: - { - strcopy(error, err_max, "\"[MT] Shake Ability\" only supports Left 4 Dead 1 & 2."); - - return APLRes_SilentFailure; - } - } - - g_bDedicated = IsDedicatedServer(); - g_bLateLoad = late; - - return APLRes_Success; -} - -#define SOUND_SMASH1 "player/tank/hit/hulk_punch_1.wav" -#define SOUND_SMASH2 "player/charger/hit/charger_smash_02.wav" // Only available in L4D2 -#else - #if MT_SHAKE_COMPILE_METHOD == 1 - #error This file must be compiled as a standalone plugin. - #endif -#endif - -#define MT_SHAKE_SECTION "shakeability" -#define MT_SHAKE_SECTION2 "shake ability" -#define MT_SHAKE_SECTION3 "shake_ability" -#define MT_SHAKE_SECTION4 "shake" - -#define MT_MENU_SHAKE "Shake Ability" - -enum struct esShakePlayer -{ - bool g_bAffected; - bool g_bFailed; - bool g_bNoAmmo; - - float g_flCloseAreasOnly; - float g_flOpenAreasOnly; - float g_flShakeChance; - float g_flShakeDeathChance; - float g_flShakeDeathRange; - float g_flShakeInterval; - float g_flShakeRange; - float g_flShakeRangeChance; - - int g_iAccessFlags; - int g_iAmmoCount; - int g_iComboAbility; - int g_iCooldown; - int g_iHumanAbility; - int g_iHumanAmmo; - int g_iHumanCooldown; - int g_iHumanRangeCooldown; - int g_iImmunityFlags; - int g_iOwner; - int g_iRangeCooldown; - int g_iRequiresHumans; - int g_iShakeAbility; - int g_iShakeCooldown; - int g_iShakeDeath; - int g_iShakeDuration; - int g_iShakeEffect; - int g_iShakeHit; - int g_iShakeHitMode; - int g_iShakeMessage; - int g_iShakeRangeCooldown; - int g_iShakeSight; - int g_iTankType; - int g_iTankTypeRecorded; -} - -esShakePlayer g_esShakePlayer[MAXPLAYERS + 1]; - -enum struct esShakeTeammate -{ - float g_flCloseAreasOnly; - float g_flOpenAreasOnly; - float g_flShakeChance; - float g_flShakeDeathChance; - float g_flShakeDeathRange; - float g_flShakeInterval; - float g_flShakeRange; - float g_flShakeRangeChance; - - int g_iComboAbility; - int g_iHumanAbility; - int g_iHumanAmmo; - int g_iHumanCooldown; - int g_iHumanRangeCooldown; - int g_iRequiresHumans; - int g_iShakeAbility; - int g_iShakeCooldown; - int g_iShakeDeath; - int g_iShakeDuration; - int g_iShakeEffect; - int g_iShakeHit; - int g_iShakeHitMode; - int g_iShakeMessage; - int g_iShakeRangeCooldown; - int g_iShakeSight; -} - -esShakeTeammate g_esShakeTeammate[MAXPLAYERS + 1]; - -enum struct esShakeAbility -{ - float g_flCloseAreasOnly; - float g_flOpenAreasOnly; - float g_flShakeChance; - float g_flShakeDeathChance; - float g_flShakeDeathRange; - float g_flShakeInterval; - float g_flShakeRange; - float g_flShakeRangeChance; - - int g_iAccessFlags; - int g_iComboAbility; - int g_iHumanAbility; - int g_iHumanAmmo; - int g_iHumanCooldown; - int g_iHumanRangeCooldown; - int g_iImmunityFlags; - int g_iRequiresHumans; - int g_iShakeAbility; - int g_iShakeCooldown; - int g_iShakeDeath; - int g_iShakeDuration; - int g_iShakeEffect; - int g_iShakeHit; - int g_iShakeHitMode; - int g_iShakeMessage; - int g_iShakeRangeCooldown; - int g_iShakeSight; -} - -esShakeAbility g_esShakeAbility[MT_MAXTYPES + 1]; - -enum struct esShakeSpecial -{ - float g_flCloseAreasOnly; - float g_flOpenAreasOnly; - float g_flShakeChance; - float g_flShakeDeathChance; - float g_flShakeDeathRange; - float g_flShakeInterval; - float g_flShakeRange; - float g_flShakeRangeChance; - - int g_iComboAbility; - int g_iHumanAbility; - int g_iHumanAmmo; - int g_iHumanCooldown; - int g_iHumanRangeCooldown; - int g_iRequiresHumans; - int g_iShakeAbility; - int g_iShakeCooldown; - int g_iShakeDeath; - int g_iShakeDuration; - int g_iShakeEffect; - int g_iShakeHit; - int g_iShakeHitMode; - int g_iShakeMessage; - int g_iShakeRangeCooldown; - int g_iShakeSight; -} - -esShakeSpecial g_esShakeSpecial[MT_MAXTYPES + 1]; - -enum struct esShakeCache -{ - float g_flCloseAreasOnly; - float g_flOpenAreasOnly; - float g_flShakeChance; - float g_flShakeDeathChance; - float g_flShakeDeathRange; - float g_flShakeInterval; - float g_flShakeRange; - float g_flShakeRangeChance; - - int g_iComboAbility; - int g_iHumanAbility; - int g_iHumanAmmo; - int g_iHumanCooldown; - int g_iHumanRangeCooldown; - int g_iRequiresHumans; - int g_iShakeAbility; - int g_iShakeCooldown; - int g_iShakeDeath; - int g_iShakeDuration; - int g_iShakeEffect; - int g_iShakeHit; - int g_iShakeHitMode; - int g_iShakeMessage; - int g_iShakeRangeCooldown; - int g_iShakeSight; -} - -esShakeCache g_esShakeCache[MAXPLAYERS + 1]; - -#if !defined MT_ABILITIES_MAIN2 -public void OnPluginStart() -{ - LoadTranslations("common.phrases"); - LoadTranslations("mutant_tanks.phrases"); - LoadTranslations("mutant_tanks_names.phrases"); - - RegConsoleCmd("sm_mt_shake", cmdShakeInfo, "View information about the Shake ability."); - - if (g_bLateLoad) - { - for (int iPlayer = 1; iPlayer <= MaxClients; iPlayer++) - { - if (bIsValidClient(iPlayer, MT_CHECK_INGAME)) - { - OnClientPutInServer(iPlayer); - } - } - - g_bLateLoad = false; - } -} -#endif - -#if defined MT_ABILITIES_MAIN2 -void vShakeMapStart() -#else -public void OnMapStart() -#endif -{ - PrecacheSound((g_bSecondGame ? SOUND_SMASH2 : SOUND_SMASH1), true); - - vShakeReset(); -} - -#if defined MT_ABILITIES_MAIN2 -void vShakeClientPutInServer(int client) -#else -public void OnClientPutInServer(int client) -#endif -{ - SDKHook(client, SDKHook_OnTakeDamage, OnShakeTakeDamage); - vShakeReset3(client); -} - -#if defined MT_ABILITIES_MAIN2 -void vShakeClientDisconnect_Post(int client) -#else -public void OnClientDisconnect_Post(int client) -#endif -{ - vShakeReset3(client); -} - -#if defined MT_ABILITIES_MAIN2 -void vShakeMapEnd() -#else -public void OnMapEnd() -#endif -{ - vShakeReset(); -} - -#if !defined MT_ABILITIES_MAIN2 -Action cmdShakeInfo(int client, int args) -{ - client = iGetListenServerHost(client, g_bDedicated); - - if (!MT_IsCorePluginEnabled()) - { - MT_ReplyToCommand(client, "%s %t", MT_TAG5, "PluginDisabled"); - - return Plugin_Handled; - } - - if (!bIsValidClient(client, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_FAKECLIENT)) - { - MT_ReplyToCommand(client, "%s %t", MT_TAG, "Command is in-game only"); - - return Plugin_Handled; - } - - switch (IsVoteInProgress()) - { - case true: MT_ReplyToCommand(client, "%s %t", MT_TAG2, "Vote in Progress"); - case false: vShakeMenu(client, MT_SHAKE_SECTION4, 0); - } - - return Plugin_Handled; -} -#endif - -void vShakeMenu(int client, const char[] name, int item) -{ - if (StrContains(MT_SHAKE_SECTION4, name, false) == -1) - { - return; - } - - Menu mAbilityMenu = new Menu(iShakeMenuHandler, MENU_ACTIONS_DEFAULT|MenuAction_Display|MenuAction_DisplayItem); - mAbilityMenu.SetTitle("Shake Ability Information"); - mAbilityMenu.AddItem("Status", "Status"); - mAbilityMenu.AddItem("Ammunition", "Ammunition"); - mAbilityMenu.AddItem("Buttons", "Buttons"); - mAbilityMenu.AddItem("Cooldown", "Cooldown"); - mAbilityMenu.AddItem("Details", "Details"); - mAbilityMenu.AddItem("Duration", "Duration"); - mAbilityMenu.AddItem("Human Support", "Human Support"); - mAbilityMenu.AddItem("Range Cooldown", "Range Cooldown"); - mAbilityMenu.DisplayAt(client, item, MENU_TIME_FOREVER); -} - -int iShakeMenuHandler(Menu menu, MenuAction action, int param1, int param2) -{ - switch (action) - { - case MenuAction_End: delete menu; - case MenuAction_Select: - { - switch (param2) - { - case 0: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esShakeCache[param1].g_iShakeAbility == 0) ? "AbilityStatus1" : "AbilityStatus2"); - case 1: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityAmmo", (g_esShakeCache[param1].g_iHumanAmmo - g_esShakePlayer[param1].g_iAmmoCount), g_esShakeCache[param1].g_iHumanAmmo); - case 2: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtons2"); - case 3: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityCooldown", ((g_esShakeCache[param1].g_iHumanAbility == 1) ? g_esShakeCache[param1].g_iHumanCooldown : g_esShakeCache[param1].g_iShakeCooldown)); - case 4: MT_PrintToChat(param1, "%s %t", MT_TAG3, "ShakeDetails"); - case 5: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityDuration2", g_esShakeCache[param1].g_iShakeDuration); - case 6: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esShakeCache[param1].g_iHumanAbility == 0) ? "AbilityHumanSupport1" : "AbilityHumanSupport2"); - case 7: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityRangeCooldown", ((g_esShakeCache[param1].g_iHumanAbility == 1) ? g_esShakeCache[param1].g_iHumanRangeCooldown : g_esShakeCache[param1].g_iShakeRangeCooldown)); - } - - if (bIsValidClient(param1, MT_CHECK_INGAME)) - { - vShakeMenu(param1, MT_SHAKE_SECTION4, menu.Selection); - } - } - case MenuAction_Display: - { - char sMenuTitle[PLATFORM_MAX_PATH]; - Panel pShake = view_as(param2); - FormatEx(sMenuTitle, sizeof sMenuTitle, "%T", "ShakeMenu", param1); - pShake.SetTitle(sMenuTitle); - } - case MenuAction_DisplayItem: - { - if (param2 >= 0) - { - char sMenuOption[PLATFORM_MAX_PATH]; - - switch (param2) - { - case 0: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Status", param1); - case 1: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Ammunition", param1); - case 2: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Buttons", param1); - case 3: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Cooldown", param1); - case 4: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Details", param1); - case 5: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Duration", param1); - case 6: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "HumanSupport", param1); - case 7: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "RangeCooldown", param1); - } - - return RedrawMenuItem(sMenuOption); - } - } - } - - return 0; -} - -#if defined MT_ABILITIES_MAIN2 -void vShakeDisplayMenu(Menu menu) -#else -public void MT_OnDisplayMenu(Menu menu) -#endif -{ - menu.AddItem(MT_MENU_SHAKE, MT_MENU_SHAKE); -} - -#if defined MT_ABILITIES_MAIN2 -void vShakeMenuItemSelected(int client, const char[] info) -#else -public void MT_OnMenuItemSelected(int client, const char[] info) -#endif -{ - if (StrEqual(info, MT_MENU_SHAKE, false)) - { - vShakeMenu(client, MT_SHAKE_SECTION4, 0); - } -} - -#if defined MT_ABILITIES_MAIN2 -void vShakeMenuItemDisplayed(int client, const char[] info, char[] buffer, int size) -#else -public void MT_OnMenuItemDisplayed(int client, const char[] info, char[] buffer, int size) -#endif -{ - if (StrEqual(info, MT_MENU_SHAKE, false)) - { - FormatEx(buffer, size, "%T", "ShakeMenu2", client); - } -} - -Action OnShakeTakeDamage(int victim, int &attacker, int &inflictor, float &damage, int &damagetype) -{ - if (MT_IsCorePluginEnabled() && bIsValidClient(victim, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_ALIVE) && damage > 0.0) - { - char sClassname[32]; - if (bIsValidEntity(inflictor)) - { - GetEntityClassname(inflictor, sClassname, sizeof sClassname); - } - - if (MT_IsTankSupported(attacker) && MT_IsCustomTankSupported(attacker) && (g_esShakeCache[attacker].g_iShakeHitMode == 0 || g_esShakeCache[attacker].g_iShakeHitMode == 1) && bIsHumanSurvivor(victim) && g_esShakeCache[attacker].g_iComboAbility == 0) - { - if ((!MT_HasAdminAccess(attacker) && !bHasAdminAccess(attacker, g_esShakeAbility[g_esShakePlayer[attacker].g_iTankTypeRecorded].g_iAccessFlags, g_esShakePlayer[attacker].g_iAccessFlags)) || MT_IsAdminImmune(victim, attacker) || bIsAdminImmune(victim, g_esShakePlayer[attacker].g_iTankType, g_esShakeAbility[g_esShakePlayer[attacker].g_iTankTypeRecorded].g_iImmunityFlags, g_esShakePlayer[victim].g_iImmunityFlags)) - { - return Plugin_Continue; - } - - bool bCaught = bIsSurvivorCaught(victim); - if ((bIsSpecialInfected(attacker) && (bCaught || (!bCaught && (damagetype & DMG_CLUB)) || (bIsSpitter(attacker) && StrEqual(sClassname, "insect_swarm")))) || StrEqual(sClassname[7], "tank_claw") || StrEqual(sClassname, "tank_rock")) - { - vShakeHit(victim, attacker, GetRandomFloat(0.1, 100.0), g_esShakeCache[attacker].g_flShakeChance, g_esShakeCache[attacker].g_iShakeHit, MT_MESSAGE_MELEE, MT_ATTACK_CLAW); - } - } - else if (MT_IsTankSupported(victim) && MT_IsCustomTankSupported(victim) && (g_esShakeCache[victim].g_iShakeHitMode == 0 || g_esShakeCache[victim].g_iShakeHitMode == 2) && bIsHumanSurvivor(attacker) && g_esShakeCache[victim].g_iComboAbility == 0) - { - if ((!MT_HasAdminAccess(victim) && !bHasAdminAccess(victim, g_esShakeAbility[g_esShakePlayer[victim].g_iTankTypeRecorded].g_iAccessFlags, g_esShakePlayer[victim].g_iAccessFlags)) || MT_IsAdminImmune(attacker, victim) || bIsAdminImmune(attacker, g_esShakePlayer[victim].g_iTankType, g_esShakeAbility[g_esShakePlayer[victim].g_iTankTypeRecorded].g_iImmunityFlags, g_esShakePlayer[attacker].g_iImmunityFlags)) - { - return Plugin_Continue; - } - - if (StrEqual(sClassname[7], "melee")) - { - vShakeHit(attacker, victim, GetRandomFloat(0.1, 100.0), g_esShakeCache[victim].g_flShakeChance, g_esShakeCache[victim].g_iShakeHit, MT_MESSAGE_MELEE, MT_ATTACK_MELEE); - } - } - } - - return Plugin_Continue; -} - -#if defined MT_ABILITIES_MAIN2 -void vShakePluginCheck(ArrayList list) -#else -public void MT_OnPluginCheck(ArrayList list) -#endif -{ - list.PushString(MT_MENU_SHAKE); -} - -#if defined MT_ABILITIES_MAIN2 -void vShakeAbilityCheck(ArrayList list, ArrayList list2, ArrayList list3, ArrayList list4) -#else -public void MT_OnAbilityCheck(ArrayList list, ArrayList list2, ArrayList list3, ArrayList list4) -#endif -{ - list.PushString(MT_SHAKE_SECTION); - list2.PushString(MT_SHAKE_SECTION2); - list3.PushString(MT_SHAKE_SECTION3); - list4.PushString(MT_SHAKE_SECTION4); -} - -#if defined MT_ABILITIES_MAIN2 -void vShakeCombineAbilities(int tank, int type, const float random, const char[] combo, int survivor, const char[] classname) -#else -public void MT_OnCombineAbilities(int tank, int type, const float random, const char[] combo, int survivor, int weapon, const char[] classname) -#endif -{ - if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esShakeCache[tank].g_iHumanAbility != 2) - { - return; - } - - char sCombo[320], sSet[4][32]; - FormatEx(sCombo, sizeof sCombo, ",%s,", combo); - FormatEx(sSet[0], sizeof sSet[], ",%s,", MT_SHAKE_SECTION); - FormatEx(sSet[1], sizeof sSet[], ",%s,", MT_SHAKE_SECTION2); - FormatEx(sSet[2], sizeof sSet[], ",%s,", MT_SHAKE_SECTION3); - FormatEx(sSet[3], sizeof sSet[], ",%s,", MT_SHAKE_SECTION4); - if (g_esShakeCache[tank].g_iComboAbility == 1 && (StrContains(sCombo, sSet[0], false) != -1 || StrContains(sCombo, sSet[1], false) != -1 || StrContains(sCombo, sSet[2], false) != -1 || StrContains(sCombo, sSet[3], false) != -1)) - { - char sAbilities[320], sSubset[10][32]; - strcopy(sAbilities, sizeof sAbilities, combo); - ExplodeString(sAbilities, ",", sSubset, sizeof sSubset, sizeof sSubset[]); - - float flChance = 0.0, flDelay = 0.0; - for (int iPos = 0; iPos < (sizeof sSubset); iPos++) - { - if (StrEqual(sSubset[iPos], MT_SHAKE_SECTION, false) || StrEqual(sSubset[iPos], MT_SHAKE_SECTION2, false) || StrEqual(sSubset[iPos], MT_SHAKE_SECTION3, false) || StrEqual(sSubset[iPos], MT_SHAKE_SECTION4, false)) - { - flDelay = MT_GetCombinationSetting(tank, 4, iPos); - - switch (type) - { - case MT_COMBO_MAINRANGE: - { - if (g_esShakeCache[tank].g_iShakeAbility == 1) - { - switch (flDelay) - { - case 0.0: vShakeAbility(tank, random, iPos); - default: - { - DataPack dpCombo; - CreateDataTimer(flDelay, tTimerShakeCombo, dpCombo, TIMER_FLAG_NO_MAPCHANGE); - dpCombo.WriteCell(GetClientUserId(tank)); - dpCombo.WriteFloat(random); - dpCombo.WriteCell(iPos); - } - } - } - } - case MT_COMBO_MELEEHIT: - { - flChance = MT_GetCombinationSetting(tank, 1, iPos); - - switch (flDelay) - { - case 0.0: - { - if ((g_esShakeCache[tank].g_iShakeHitMode == 0 || g_esShakeCache[tank].g_iShakeHitMode == 1) && (StrEqual(classname[7], "tank_claw") || StrEqual(classname, "tank_rock"))) - { - vShakeHit(survivor, tank, random, flChance, g_esShakeCache[tank].g_iShakeHit, MT_MESSAGE_MELEE, MT_ATTACK_CLAW, iPos); - } - else if ((g_esShakeCache[tank].g_iShakeHitMode == 0 || g_esShakeCache[tank].g_iShakeHitMode == 2) && StrEqual(classname[7], "melee")) - { - vShakeHit(survivor, tank, random, flChance, g_esShakeCache[tank].g_iShakeHit, MT_MESSAGE_MELEE, MT_ATTACK_MELEE, iPos); - } - } - default: - { - DataPack dpCombo; - CreateDataTimer(flDelay, tTimerShakeCombo2, dpCombo, TIMER_FLAG_NO_MAPCHANGE); - dpCombo.WriteCell(GetClientUserId(survivor)); - dpCombo.WriteCell(GetClientUserId(tank)); - dpCombo.WriteFloat(random); - dpCombo.WriteFloat(flChance); - dpCombo.WriteCell(iPos); - dpCombo.WriteString(classname); - } - } - } - case MT_COMBO_POSTSPAWN: vShakeRange(tank, 0, 1, random, iPos); - case MT_COMBO_UPONDEATH: vShakeRange(tank, 0, 0, random, iPos); - } - - break; - } - } - } -} - -#if defined MT_ABILITIES_MAIN2 -void vShakeConfigsLoad(int mode) -#else -public void MT_OnConfigsLoad(int mode) -#endif -{ - switch (mode) - { - case 1: - { - for (int iIndex = MT_GetMinType(); iIndex <= MT_GetMaxType(); iIndex++) - { - g_esShakeAbility[iIndex].g_iAccessFlags = 0; - g_esShakeAbility[iIndex].g_iImmunityFlags = 0; - g_esShakeAbility[iIndex].g_flCloseAreasOnly = 0.0; - g_esShakeAbility[iIndex].g_iComboAbility = 0; - g_esShakeAbility[iIndex].g_iHumanAbility = 0; - g_esShakeAbility[iIndex].g_iHumanAmmo = 5; - g_esShakeAbility[iIndex].g_iHumanCooldown = 0; - g_esShakeAbility[iIndex].g_iHumanRangeCooldown = 0; - g_esShakeAbility[iIndex].g_flOpenAreasOnly = 0.0; - g_esShakeAbility[iIndex].g_iRequiresHumans = 1; - g_esShakeAbility[iIndex].g_iShakeAbility = 0; - g_esShakeAbility[iIndex].g_iShakeEffect = 0; - g_esShakeAbility[iIndex].g_iShakeMessage = 0; - g_esShakeAbility[iIndex].g_flShakeChance = 33.3; - g_esShakeAbility[iIndex].g_iShakeCooldown = 0; - g_esShakeAbility[iIndex].g_iShakeDeath = 0; - g_esShakeAbility[iIndex].g_flShakeDeathChance = 33.3; - g_esShakeAbility[iIndex].g_flShakeDeathRange = 200.0; - g_esShakeAbility[iIndex].g_iShakeDuration = 5; - g_esShakeAbility[iIndex].g_iShakeHit = 0; - g_esShakeAbility[iIndex].g_iShakeHitMode = 0; - g_esShakeAbility[iIndex].g_flShakeInterval = 1.0; - g_esShakeAbility[iIndex].g_flShakeRange = 150.0; - g_esShakeAbility[iIndex].g_flShakeRangeChance = 15.0; - g_esShakeAbility[iIndex].g_iShakeRangeCooldown = 0; - g_esShakeAbility[iIndex].g_iShakeSight = 0; - - g_esShakeSpecial[iIndex].g_flCloseAreasOnly = -1.0; - g_esShakeSpecial[iIndex].g_iComboAbility = -1; - g_esShakeSpecial[iIndex].g_iHumanAbility = -1; - g_esShakeSpecial[iIndex].g_iHumanAmmo = -1; - g_esShakeSpecial[iIndex].g_iHumanCooldown = -1; - g_esShakeSpecial[iIndex].g_iHumanRangeCooldown = -1; - g_esShakeSpecial[iIndex].g_flOpenAreasOnly = -1.0; - g_esShakeSpecial[iIndex].g_iRequiresHumans = -1; - g_esShakeSpecial[iIndex].g_iShakeAbility = -1; - g_esShakeSpecial[iIndex].g_iShakeEffect = -1; - g_esShakeSpecial[iIndex].g_iShakeMessage = -1; - g_esShakeSpecial[iIndex].g_flShakeChance = -1.0; - g_esShakeSpecial[iIndex].g_iShakeCooldown = -1; - g_esShakeSpecial[iIndex].g_iShakeDeath = -1; - g_esShakeSpecial[iIndex].g_flShakeDeathChance = -1.0; - g_esShakeSpecial[iIndex].g_flShakeDeathRange = -1.0; - g_esShakeSpecial[iIndex].g_iShakeDuration = -1; - g_esShakeSpecial[iIndex].g_iShakeHit = -1; - g_esShakeSpecial[iIndex].g_iShakeHitMode = -1; - g_esShakeSpecial[iIndex].g_flShakeInterval = -1.0; - g_esShakeSpecial[iIndex].g_flShakeRange = -1.0; - g_esShakeSpecial[iIndex].g_flShakeRangeChance = -1.0; - g_esShakeSpecial[iIndex].g_iShakeRangeCooldown = -1; - g_esShakeSpecial[iIndex].g_iShakeSight = -1; - } - } - case 3: - { - for (int iPlayer = 1; iPlayer <= MaxClients; iPlayer++) - { - g_esShakePlayer[iPlayer].g_iAccessFlags = -1; - g_esShakePlayer[iPlayer].g_iImmunityFlags = -1; - g_esShakePlayer[iPlayer].g_flCloseAreasOnly = -1.0; - g_esShakePlayer[iPlayer].g_iComboAbility = -1; - g_esShakePlayer[iPlayer].g_iHumanAbility = -1; - g_esShakePlayer[iPlayer].g_iHumanAmmo = -1; - g_esShakePlayer[iPlayer].g_iHumanCooldown = -1; - g_esShakePlayer[iPlayer].g_iHumanRangeCooldown = -1; - g_esShakePlayer[iPlayer].g_flOpenAreasOnly = -1.0; - g_esShakePlayer[iPlayer].g_iRequiresHumans = -1; - g_esShakePlayer[iPlayer].g_iShakeAbility = -1; - g_esShakePlayer[iPlayer].g_iShakeEffect = -1; - g_esShakePlayer[iPlayer].g_iShakeMessage = -1; - g_esShakePlayer[iPlayer].g_flShakeChance = -1.0; - g_esShakePlayer[iPlayer].g_iShakeCooldown = -1; - g_esShakePlayer[iPlayer].g_iShakeDeath = -1; - g_esShakePlayer[iPlayer].g_flShakeDeathChance = -1.0; - g_esShakePlayer[iPlayer].g_flShakeDeathRange = -1.0; - g_esShakePlayer[iPlayer].g_iShakeDuration = -1; - g_esShakePlayer[iPlayer].g_iShakeHit = -1; - g_esShakePlayer[iPlayer].g_iShakeHitMode = -1; - g_esShakePlayer[iPlayer].g_flShakeInterval = -1.0; - g_esShakePlayer[iPlayer].g_flShakeRange = -1.0; - g_esShakePlayer[iPlayer].g_flShakeRangeChance = -1.0; - g_esShakePlayer[iPlayer].g_iShakeRangeCooldown = -1; - g_esShakePlayer[iPlayer].g_iShakeSight = -1; - - g_esShakeTeammate[iPlayer].g_flCloseAreasOnly = -1.0; - g_esShakeTeammate[iPlayer].g_iComboAbility = -1; - g_esShakeTeammate[iPlayer].g_iHumanAbility = -1; - g_esShakeTeammate[iPlayer].g_iHumanAmmo = -1; - g_esShakeTeammate[iPlayer].g_iHumanCooldown = -1; - g_esShakeTeammate[iPlayer].g_iHumanRangeCooldown = -1; - g_esShakeTeammate[iPlayer].g_flOpenAreasOnly = -1.0; - g_esShakeTeammate[iPlayer].g_iRequiresHumans = -1; - g_esShakeTeammate[iPlayer].g_iShakeAbility = -1; - g_esShakeTeammate[iPlayer].g_iShakeEffect = -1; - g_esShakeTeammate[iPlayer].g_iShakeMessage = -1; - g_esShakeTeammate[iPlayer].g_flShakeChance = -1.0; - g_esShakeTeammate[iPlayer].g_iShakeCooldown = -1; - g_esShakeTeammate[iPlayer].g_iShakeDeath = -1; - g_esShakeTeammate[iPlayer].g_flShakeDeathChance = -1.0; - g_esShakeTeammate[iPlayer].g_flShakeDeathRange = -1.0; - g_esShakeTeammate[iPlayer].g_iShakeDuration = -1; - g_esShakeTeammate[iPlayer].g_iShakeHit = -1; - g_esShakeTeammate[iPlayer].g_iShakeHitMode = -1; - g_esShakeTeammate[iPlayer].g_flShakeInterval = -1.0; - g_esShakeTeammate[iPlayer].g_flShakeRange = -1.0; - g_esShakeTeammate[iPlayer].g_flShakeRangeChance = -1.0; - g_esShakeTeammate[iPlayer].g_iShakeRangeCooldown = -1; - g_esShakeTeammate[iPlayer].g_iShakeSight = -1; - } - } - } -} - -#if defined MT_ABILITIES_MAIN2 -void vShakeConfigsLoaded(const char[] subsection, const char[] key, const char[] value, int type, int admin, int mode, bool special, const char[] specsection) -#else -public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const char[] value, int type, int admin, int mode, bool special, const char[] specsection) -#endif -{ - if ((mode == -1 || mode == 3) && bIsValidClient(admin)) - { - if (special && specsection[0] != '\0') - { - g_esShakeTeammate[admin].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esShakeTeammate[admin].g_flCloseAreasOnly, value, -1.0, 99999.0); - g_esShakeTeammate[admin].g_iComboAbility = iGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "ComboAbility", "Combo Ability", "Combo_Ability", "combo", g_esShakeTeammate[admin].g_iComboAbility, value, -1, 1); - g_esShakeTeammate[admin].g_iHumanAbility = iGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esShakeTeammate[admin].g_iHumanAbility, value, -1, 2); - g_esShakeTeammate[admin].g_iHumanAmmo = iGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esShakeTeammate[admin].g_iHumanAmmo, value, -1, 99999); - g_esShakeTeammate[admin].g_iHumanCooldown = iGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esShakeTeammate[admin].g_iHumanCooldown, value, -1, 99999); - g_esShakeTeammate[admin].g_iHumanRangeCooldown = iGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "HumanRangeCooldown", "Human Range Cooldown", "Human_Range_Cooldown", "hrangecooldown", g_esShakeTeammate[admin].g_iHumanRangeCooldown, value, -1, 99999); - g_esShakeTeammate[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esShakeTeammate[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); - g_esShakeTeammate[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esShakeTeammate[admin].g_iRequiresHumans, value, -1, 32); - g_esShakeTeammate[admin].g_iShakeAbility = iGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esShakeTeammate[admin].g_iShakeAbility, value, -1, 1); - g_esShakeTeammate[admin].g_iShakeEffect = iGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "AbilityEffect", "Ability Effect", "Ability_Effect", "effect", g_esShakeTeammate[admin].g_iShakeEffect, value, -1, 7); - g_esShakeTeammate[admin].g_iShakeMessage = iGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esShakeTeammate[admin].g_iShakeMessage, value, -1, 3); - g_esShakeTeammate[admin].g_iShakeSight = iGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "AbilitySight", "Ability Sight", "Ability_Sight", "sight", g_esShakeTeammate[admin].g_iShakeSight, value, -1, 5); - g_esShakeTeammate[admin].g_flShakeChance = flGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "ShakeChance", "Shake Chance", "Shake_Chance", "chance", g_esShakeTeammate[admin].g_flShakeChance, value, -1.0, 100.0); - g_esShakeTeammate[admin].g_iShakeCooldown = iGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "ShakeCooldown", "Shake Cooldown", "Shake_Cooldown", "cooldown", g_esShakeTeammate[admin].g_iShakeCooldown, value, -1, 99999); - g_esShakeTeammate[admin].g_iShakeDeath = iGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "ShakeDeath", "Shake Death", "Shake_Death", "death", g_esShakeTeammate[admin].g_iShakeDeath, value, -1, 3); - g_esShakeTeammate[admin].g_flShakeDeathChance = flGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "ShakeDeathChance", "Shake Death Chance", "Shake_Death_Chance", "deathchance", g_esShakeTeammate[admin].g_flShakeDeathChance, value, -1.0, 100.0); - g_esShakeTeammate[admin].g_flShakeDeathRange = flGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "ShakeDeathRange", "Shake Death Range", "Shake_Death_Range", "deathrange", g_esShakeTeammate[admin].g_flShakeDeathRange, value, -1.0, 99999.0); - g_esShakeTeammate[admin].g_iShakeDuration = iGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "ShakeDuration", "Shake Duration", "Shake_Duration", "duration", g_esShakeTeammate[admin].g_iShakeDuration, value, -1, 99999); - g_esShakeTeammate[admin].g_iShakeHit = iGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "ShakeHit", "Shake Hit", "Shake_Hit", "hit", g_esShakeTeammate[admin].g_iShakeHit, value, -1, 1); - g_esShakeTeammate[admin].g_iShakeHitMode = iGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "ShakeHitMode", "Shake Hit Mode", "Shake_Hit_Mode", "hitmode", g_esShakeTeammate[admin].g_iShakeHitMode, value, -1, 2); - g_esShakeTeammate[admin].g_flShakeInterval = flGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "ShakeInterval", "Shake Interval", "Shake_Interval", "interval", g_esShakeTeammate[admin].g_flShakeInterval, value, -1.0, 99999.0); - g_esShakeTeammate[admin].g_flShakeRange = flGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "ShakeRange", "Shake Range", "Shake_Range", "range", g_esShakeTeammate[admin].g_flShakeRange, value, -1.0, 99999.0); - g_esShakeTeammate[admin].g_flShakeRangeChance = flGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "ShakeRangeChance", "Shake Range Chance", "Shake_Range_Chance", "rangechance", g_esShakeTeammate[admin].g_flShakeRangeChance, value, -1.0, 100.0); - g_esShakeTeammate[admin].g_iShakeRangeCooldown = iGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "ShakeRangeCooldown", "Shake Range Cooldown", "Shake_Range_Cooldown", "rangecooldown", g_esShakeTeammate[admin].g_iShakeRangeCooldown, value, -1, 99999); - } - else - { - g_esShakePlayer[admin].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esShakePlayer[admin].g_flCloseAreasOnly, value, -1.0, 99999.0); - g_esShakePlayer[admin].g_iComboAbility = iGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "ComboAbility", "Combo Ability", "Combo_Ability", "combo", g_esShakePlayer[admin].g_iComboAbility, value, -1, 1); - g_esShakePlayer[admin].g_iHumanAbility = iGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esShakePlayer[admin].g_iHumanAbility, value, -1, 2); - g_esShakePlayer[admin].g_iHumanAmmo = iGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esShakePlayer[admin].g_iHumanAmmo, value, -1, 99999); - g_esShakePlayer[admin].g_iHumanCooldown = iGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esShakePlayer[admin].g_iHumanCooldown, value, -1, 99999); - g_esShakePlayer[admin].g_iHumanRangeCooldown = iGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "HumanRangeCooldown", "Human Range Cooldown", "Human_Range_Cooldown", "hrangecooldown", g_esShakePlayer[admin].g_iHumanRangeCooldown, value, -1, 99999); - g_esShakePlayer[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esShakePlayer[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); - g_esShakePlayer[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esShakePlayer[admin].g_iRequiresHumans, value, -1, 32); - g_esShakePlayer[admin].g_iShakeAbility = iGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esShakePlayer[admin].g_iShakeAbility, value, -1, 1); - g_esShakePlayer[admin].g_iShakeEffect = iGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "AbilityEffect", "Ability Effect", "Ability_Effect", "effect", g_esShakePlayer[admin].g_iShakeEffect, value, -1, 7); - g_esShakePlayer[admin].g_iShakeMessage = iGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esShakePlayer[admin].g_iShakeMessage, value, -1, 3); - g_esShakePlayer[admin].g_iShakeSight = iGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "AbilitySight", "Ability Sight", "Ability_Sight", "sight", g_esShakePlayer[admin].g_iShakeSight, value, -1, 5); - g_esShakePlayer[admin].g_flShakeChance = flGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "ShakeChance", "Shake Chance", "Shake_Chance", "chance", g_esShakePlayer[admin].g_flShakeChance, value, -1.0, 100.0); - g_esShakePlayer[admin].g_iShakeCooldown = iGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "ShakeCooldown", "Shake Cooldown", "Shake_Cooldown", "cooldown", g_esShakePlayer[admin].g_iShakeCooldown, value, -1, 99999); - g_esShakePlayer[admin].g_iShakeDeath = iGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "ShakeDeath", "Shake Death", "Shake_Death", "death", g_esShakePlayer[admin].g_iShakeDeath, value, -1, 3); - g_esShakePlayer[admin].g_flShakeDeathChance = flGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "ShakeDeathChance", "Shake Death Chance", "Shake_Death_Chance", "deathchance", g_esShakePlayer[admin].g_flShakeDeathChance, value, -1.0, 100.0); - g_esShakePlayer[admin].g_flShakeDeathRange = flGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "ShakeDeathRange", "Shake Death Range", "Shake_Death_Range", "deathrange", g_esShakePlayer[admin].g_flShakeDeathRange, value, -1.0, 99999.0); - g_esShakePlayer[admin].g_iShakeDuration = iGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "ShakeDuration", "Shake Duration", "Shake_Duration", "duration", g_esShakePlayer[admin].g_iShakeDuration, value, -1, 99999); - g_esShakePlayer[admin].g_iShakeHit = iGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "ShakeHit", "Shake Hit", "Shake_Hit", "hit", g_esShakePlayer[admin].g_iShakeHit, value, -1, 1); - g_esShakePlayer[admin].g_iShakeHitMode = iGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "ShakeHitMode", "Shake Hit Mode", "Shake_Hit_Mode", "hitmode", g_esShakePlayer[admin].g_iShakeHitMode, value, -1, 2); - g_esShakePlayer[admin].g_flShakeInterval = flGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "ShakeInterval", "Shake Interval", "Shake_Interval", "interval", g_esShakePlayer[admin].g_flShakeInterval, value, -1.0, 99999.0); - g_esShakePlayer[admin].g_flShakeRange = flGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "ShakeRange", "Shake Range", "Shake_Range", "range", g_esShakePlayer[admin].g_flShakeRange, value, -1.0, 99999.0); - g_esShakePlayer[admin].g_flShakeRangeChance = flGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "ShakeRangeChance", "Shake Range Chance", "Shake_Range_Chance", "rangechance", g_esShakePlayer[admin].g_flShakeRangeChance, value, -1.0, 100.0); - g_esShakePlayer[admin].g_iShakeRangeCooldown = iGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "ShakeRangeCooldown", "Shake Range Cooldown", "Shake_Range_Cooldown", "rangecooldown", g_esShakePlayer[admin].g_iShakeRangeCooldown, value, -1, 99999); - g_esShakePlayer[admin].g_iAccessFlags = iGetAdminFlagsValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "AccessFlags", "Access Flags", "Access_Flags", "access", value); - g_esShakePlayer[admin].g_iImmunityFlags = iGetAdminFlagsValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "ImmunityFlags", "Immunity Flags", "Immunity_Flags", "immunity", value); - } - } - - if (mode < 3 && type > 0) - { - if (special && specsection[0] != '\0') - { - g_esShakeSpecial[type].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esShakeSpecial[type].g_flCloseAreasOnly, value, -1.0, 99999.0); - g_esShakeSpecial[type].g_iComboAbility = iGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "ComboAbility", "Combo Ability", "Combo_Ability", "combo", g_esShakeSpecial[type].g_iComboAbility, value, -1, 1); - g_esShakeSpecial[type].g_iHumanAbility = iGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esShakeSpecial[type].g_iHumanAbility, value, -1, 2); - g_esShakeSpecial[type].g_iHumanAmmo = iGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esShakeSpecial[type].g_iHumanAmmo, value, -1, 99999); - g_esShakeSpecial[type].g_iHumanCooldown = iGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esShakeSpecial[type].g_iHumanCooldown, value, -1, 99999); - g_esShakeSpecial[type].g_iHumanRangeCooldown = iGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "HumanRangeCooldown", "Human Range Cooldown", "Human_Range_Cooldown", "hrangecooldown", g_esShakeSpecial[type].g_iHumanRangeCooldown, value, -1, 99999); - g_esShakeSpecial[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esShakeSpecial[type].g_flOpenAreasOnly, value, -1.0, 99999.0); - g_esShakeSpecial[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esShakeSpecial[type].g_iRequiresHumans, value, -1, 32); - g_esShakeSpecial[type].g_iShakeAbility = iGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esShakeSpecial[type].g_iShakeAbility, value, -1, 1); - g_esShakeSpecial[type].g_iShakeEffect = iGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "AbilityEffect", "Ability Effect", "Ability_Effect", "effect", g_esShakeSpecial[type].g_iShakeEffect, value, -1, 7); - g_esShakeSpecial[type].g_iShakeMessage = iGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esShakeSpecial[type].g_iShakeMessage, value, -1, 3); - g_esShakeSpecial[type].g_iShakeSight = iGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "AbilitySight", "Ability Sight", "Ability_Sight", "sight", g_esShakeSpecial[type].g_iShakeSight, value, -1, 5); - g_esShakeSpecial[type].g_flShakeChance = flGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "ShakeChance", "Shake Chance", "Shake_Chance", "chance", g_esShakeSpecial[type].g_flShakeChance, value, -1.0, 100.0); - g_esShakeSpecial[type].g_iShakeDeath = iGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "ShakeDeath", "Shake Death", "Shake_Death", "death", g_esShakeSpecial[type].g_iShakeDeath, value, -1, 3); - g_esShakeSpecial[type].g_iShakeCooldown = iGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "ShakeCooldown", "Shake Cooldown", "Shake_Cooldown", "cooldown", g_esShakeSpecial[type].g_iShakeCooldown, value, -1, 99999); - g_esShakeSpecial[type].g_flShakeDeathChance = flGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "ShakeDeathChance", "Shake Death Chance", "Shake_Death_Chance", "deathchance", g_esShakeSpecial[type].g_flShakeDeathChance, value, -1.0, 100.0); - g_esShakeSpecial[type].g_flShakeDeathRange = flGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "ShakeDeathRange", "Shake Death Range", "Shake_Death_Range", "deathrange", g_esShakeSpecial[type].g_flShakeDeathRange, value, -1.0, 99999.0); - g_esShakeSpecial[type].g_iShakeDuration = iGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "ShakeDuration", "Shake Duration", "Shake_Duration", "duration", g_esShakeSpecial[type].g_iShakeDuration, value, -1, 99999); - g_esShakeSpecial[type].g_iShakeHit = iGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "ShakeHit", "Shake Hit", "Shake_Hit", "hit", g_esShakeSpecial[type].g_iShakeHit, value, -1, 1); - g_esShakeSpecial[type].g_iShakeHitMode = iGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "ShakeHitMode", "Shake Hit Mode", "Shake_Hit_Mode", "hitmode", g_esShakeSpecial[type].g_iShakeHitMode, value, -1, 2); - g_esShakeSpecial[type].g_flShakeInterval = flGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "ShakeInterval", "Shake Interval", "Shake_Interval", "interval", g_esShakeSpecial[type].g_flShakeInterval, value, -1.0, 99999.0); - g_esShakeSpecial[type].g_flShakeRange = flGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "ShakeRange", "Shake Range", "Shake_Range", "range", g_esShakeSpecial[type].g_flShakeRange, value, -1.0, 99999.0); - g_esShakeSpecial[type].g_flShakeRangeChance = flGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "ShakeRangeChance", "Shake Range Chance", "Shake_Range_Chance", "rangechance", g_esShakeSpecial[type].g_flShakeRangeChance, value, -1.0, 100.0); - g_esShakeSpecial[type].g_iShakeRangeCooldown = iGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "ShakeRangeCooldown", "Shake Range Cooldown", "Shake_Range_Cooldown", "rangecooldown", g_esShakeSpecial[type].g_iShakeRangeCooldown, value, -1, 99999); - } - else - { - g_esShakeAbility[type].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esShakeAbility[type].g_flCloseAreasOnly, value, -1.0, 99999.0); - g_esShakeAbility[type].g_iComboAbility = iGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "ComboAbility", "Combo Ability", "Combo_Ability", "combo", g_esShakeAbility[type].g_iComboAbility, value, -1, 1); - g_esShakeAbility[type].g_iHumanAbility = iGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esShakeAbility[type].g_iHumanAbility, value, -1, 2); - g_esShakeAbility[type].g_iHumanAmmo = iGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esShakeAbility[type].g_iHumanAmmo, value, -1, 99999); - g_esShakeAbility[type].g_iHumanCooldown = iGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esShakeAbility[type].g_iHumanCooldown, value, -1, 99999); - g_esShakeAbility[type].g_iHumanRangeCooldown = iGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "HumanRangeCooldown", "Human Range Cooldown", "Human_Range_Cooldown", "hrangecooldown", g_esShakeAbility[type].g_iHumanRangeCooldown, value, -1, 99999); - g_esShakeAbility[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esShakeAbility[type].g_flOpenAreasOnly, value, -1.0, 99999.0); - g_esShakeAbility[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esShakeAbility[type].g_iRequiresHumans, value, -1, 32); - g_esShakeAbility[type].g_iShakeAbility = iGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esShakeAbility[type].g_iShakeAbility, value, -1, 1); - g_esShakeAbility[type].g_iShakeEffect = iGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "AbilityEffect", "Ability Effect", "Ability_Effect", "effect", g_esShakeAbility[type].g_iShakeEffect, value, -1, 7); - g_esShakeAbility[type].g_iShakeMessage = iGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esShakeAbility[type].g_iShakeMessage, value, -1, 3); - g_esShakeAbility[type].g_iShakeSight = iGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "AbilitySight", "Ability Sight", "Ability_Sight", "sight", g_esShakeAbility[type].g_iShakeSight, value, -1, 5); - g_esShakeAbility[type].g_flShakeChance = flGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "ShakeChance", "Shake Chance", "Shake_Chance", "chance", g_esShakeAbility[type].g_flShakeChance, value, -1.0, 100.0); - g_esShakeAbility[type].g_iShakeDeath = iGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "ShakeDeath", "Shake Death", "Shake_Death", "death", g_esShakeAbility[type].g_iShakeDeath, value, -1, 3); - g_esShakeAbility[type].g_iShakeCooldown = iGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "ShakeCooldown", "Shake Cooldown", "Shake_Cooldown", "cooldown", g_esShakeAbility[type].g_iShakeCooldown, value, -1, 99999); - g_esShakeAbility[type].g_flShakeDeathChance = flGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "ShakeDeathChance", "Shake Death Chance", "Shake_Death_Chance", "deathchance", g_esShakeAbility[type].g_flShakeDeathChance, value, -1.0, 100.0); - g_esShakeAbility[type].g_flShakeDeathRange = flGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "ShakeDeathRange", "Shake Death Range", "Shake_Death_Range", "deathrange", g_esShakeAbility[type].g_flShakeDeathRange, value, -1.0, 99999.0); - g_esShakeAbility[type].g_iShakeDuration = iGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "ShakeDuration", "Shake Duration", "Shake_Duration", "duration", g_esShakeAbility[type].g_iShakeDuration, value, -1, 99999); - g_esShakeAbility[type].g_iShakeHit = iGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "ShakeHit", "Shake Hit", "Shake_Hit", "hit", g_esShakeAbility[type].g_iShakeHit, value, -1, 1); - g_esShakeAbility[type].g_iShakeHitMode = iGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "ShakeHitMode", "Shake Hit Mode", "Shake_Hit_Mode", "hitmode", g_esShakeAbility[type].g_iShakeHitMode, value, -1, 2); - g_esShakeAbility[type].g_flShakeInterval = flGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "ShakeInterval", "Shake Interval", "Shake_Interval", "interval", g_esShakeAbility[type].g_flShakeInterval, value, -1.0, 99999.0); - g_esShakeAbility[type].g_flShakeRange = flGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "ShakeRange", "Shake Range", "Shake_Range", "range", g_esShakeAbility[type].g_flShakeRange, value, -1.0, 99999.0); - g_esShakeAbility[type].g_flShakeRangeChance = flGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "ShakeRangeChance", "Shake Range Chance", "Shake_Range_Chance", "rangechance", g_esShakeAbility[type].g_flShakeRangeChance, value, -1.0, 100.0); - g_esShakeAbility[type].g_iShakeRangeCooldown = iGetKeyValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "ShakeRangeCooldown", "Shake Range Cooldown", "Shake_Range_Cooldown", "rangecooldown", g_esShakeAbility[type].g_iShakeRangeCooldown, value, -1, 99999); - g_esShakeAbility[type].g_iAccessFlags = iGetAdminFlagsValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "AccessFlags", "Access Flags", "Access_Flags", "access", value); - g_esShakeAbility[type].g_iImmunityFlags = iGetAdminFlagsValue(subsection, MT_SHAKE_SECTION, MT_SHAKE_SECTION2, MT_SHAKE_SECTION3, MT_SHAKE_SECTION4, key, "ImmunityFlags", "Immunity Flags", "Immunity_Flags", "immunity", value); - } - } -} - -#if defined MT_ABILITIES_MAIN2 -void vShakeSettingsCached(int tank, bool apply, int type) -#else -public void MT_OnSettingsCached(int tank, bool apply, int type) -#endif -{ - bool bHuman = bIsValidClient(tank, MT_CHECK_FAKECLIENT); - g_esShakePlayer[tank].g_iTankTypeRecorded = apply ? MT_GetRecordedTankType(tank, type) : 0; - g_esShakePlayer[tank].g_iTankType = apply ? type : 0; - int iType = g_esShakePlayer[tank].g_iTankTypeRecorded; - - if (bIsSpecialInfected(tank, MT_CHECK_INDEX|MT_CHECK_INGAME)) - { - g_esShakeCache[tank].g_flCloseAreasOnly = flGetSubSettingValue(apply, bHuman, g_esShakeTeammate[tank].g_flCloseAreasOnly, g_esShakePlayer[tank].g_flCloseAreasOnly, g_esShakeSpecial[iType].g_flCloseAreasOnly, g_esShakeAbility[iType].g_flCloseAreasOnly, 1); - g_esShakeCache[tank].g_iComboAbility = iGetSubSettingValue(apply, bHuman, g_esShakeTeammate[tank].g_iComboAbility, g_esShakePlayer[tank].g_iComboAbility, g_esShakeSpecial[iType].g_iComboAbility, g_esShakeAbility[iType].g_iComboAbility, 1); - g_esShakeCache[tank].g_flShakeChance = flGetSubSettingValue(apply, bHuman, g_esShakeTeammate[tank].g_flShakeChance, g_esShakePlayer[tank].g_flShakeChance, g_esShakeSpecial[iType].g_flShakeChance, g_esShakeAbility[iType].g_flShakeChance, 1); - g_esShakeCache[tank].g_flShakeDeathChance = flGetSubSettingValue(apply, bHuman, g_esShakeTeammate[tank].g_flShakeDeathChance, g_esShakePlayer[tank].g_flShakeDeathChance, g_esShakeSpecial[iType].g_flShakeDeathChance, g_esShakeAbility[iType].g_flShakeDeathChance, 1); - g_esShakeCache[tank].g_flShakeDeathRange = flGetSubSettingValue(apply, bHuman, g_esShakeTeammate[tank].g_flShakeDeathRange, g_esShakePlayer[tank].g_flShakeDeathRange, g_esShakeSpecial[iType].g_flShakeDeathRange, g_esShakeAbility[iType].g_flShakeDeathRange, 1); - g_esShakeCache[tank].g_flShakeInterval = flGetSubSettingValue(apply, bHuman, g_esShakeTeammate[tank].g_flShakeInterval, g_esShakePlayer[tank].g_flShakeInterval, g_esShakeSpecial[iType].g_flShakeInterval, g_esShakeAbility[iType].g_flShakeInterval, 1); - g_esShakeCache[tank].g_flShakeRange = flGetSubSettingValue(apply, bHuman, g_esShakeTeammate[tank].g_flShakeRange, g_esShakePlayer[tank].g_flShakeRange, g_esShakeSpecial[iType].g_flShakeRange, g_esShakeAbility[iType].g_flShakeRange, 1); - g_esShakeCache[tank].g_flShakeRangeChance = flGetSubSettingValue(apply, bHuman, g_esShakeTeammate[tank].g_flShakeRangeChance, g_esShakePlayer[tank].g_flShakeRangeChance, g_esShakeSpecial[iType].g_flShakeRangeChance, g_esShakeAbility[iType].g_flShakeRangeChance, 1); - g_esShakeCache[tank].g_iHumanAbility = iGetSubSettingValue(apply, bHuman, g_esShakeTeammate[tank].g_iHumanAbility, g_esShakePlayer[tank].g_iHumanAbility, g_esShakeSpecial[iType].g_iHumanAbility, g_esShakeAbility[iType].g_iHumanAbility, 1); - g_esShakeCache[tank].g_iHumanAmmo = iGetSubSettingValue(apply, bHuman, g_esShakeTeammate[tank].g_iHumanAmmo, g_esShakePlayer[tank].g_iHumanAmmo, g_esShakeSpecial[iType].g_iHumanAmmo, g_esShakeAbility[iType].g_iHumanAmmo, 1); - g_esShakeCache[tank].g_iHumanCooldown = iGetSubSettingValue(apply, bHuman, g_esShakeTeammate[tank].g_iHumanCooldown, g_esShakePlayer[tank].g_iHumanCooldown, g_esShakeSpecial[iType].g_iHumanCooldown, g_esShakeAbility[iType].g_iHumanCooldown, 1); - g_esShakeCache[tank].g_iHumanRangeCooldown = iGetSubSettingValue(apply, bHuman, g_esShakeTeammate[tank].g_iHumanRangeCooldown, g_esShakePlayer[tank].g_iHumanRangeCooldown, g_esShakeSpecial[iType].g_iHumanRangeCooldown, g_esShakeAbility[iType].g_iHumanRangeCooldown, 1); - g_esShakeCache[tank].g_flOpenAreasOnly = flGetSubSettingValue(apply, bHuman, g_esShakeTeammate[tank].g_flOpenAreasOnly, g_esShakePlayer[tank].g_flOpenAreasOnly, g_esShakeSpecial[iType].g_flOpenAreasOnly, g_esShakeAbility[iType].g_flOpenAreasOnly, 1); - g_esShakeCache[tank].g_iRequiresHumans = iGetSubSettingValue(apply, bHuman, g_esShakeTeammate[tank].g_iRequiresHumans, g_esShakePlayer[tank].g_iRequiresHumans, g_esShakeSpecial[iType].g_iRequiresHumans, g_esShakeAbility[iType].g_iRequiresHumans, 1); - g_esShakeCache[tank].g_iShakeAbility = iGetSubSettingValue(apply, bHuman, g_esShakeTeammate[tank].g_iShakeAbility, g_esShakePlayer[tank].g_iShakeAbility, g_esShakeSpecial[iType].g_iShakeAbility, g_esShakeAbility[iType].g_iShakeAbility, 1); - g_esShakeCache[tank].g_iShakeCooldown = iGetSubSettingValue(apply, bHuman, g_esShakeTeammate[tank].g_iShakeCooldown, g_esShakePlayer[tank].g_iShakeCooldown, g_esShakeSpecial[iType].g_iShakeCooldown, g_esShakeAbility[iType].g_iShakeCooldown, 1); - g_esShakeCache[tank].g_iShakeDeath = iGetSubSettingValue(apply, bHuman, g_esShakeTeammate[tank].g_iShakeDeath, g_esShakePlayer[tank].g_iShakeDeath, g_esShakeSpecial[iType].g_iShakeDeath, g_esShakeAbility[iType].g_iShakeDeath, 1); - g_esShakeCache[tank].g_iShakeDuration = iGetSubSettingValue(apply, bHuman, g_esShakeTeammate[tank].g_iShakeDuration, g_esShakePlayer[tank].g_iShakeDuration, g_esShakeSpecial[iType].g_iShakeDuration, g_esShakeAbility[iType].g_iShakeDuration, 1); - g_esShakeCache[tank].g_iShakeEffect = iGetSubSettingValue(apply, bHuman, g_esShakeTeammate[tank].g_iShakeEffect, g_esShakePlayer[tank].g_iShakeEffect, g_esShakeSpecial[iType].g_iShakeEffect, g_esShakeAbility[iType].g_iShakeEffect, 1); - g_esShakeCache[tank].g_iShakeHit = iGetSubSettingValue(apply, bHuman, g_esShakeTeammate[tank].g_iShakeHit, g_esShakePlayer[tank].g_iShakeHit, g_esShakeSpecial[iType].g_iShakeHit, g_esShakeAbility[iType].g_iShakeHit, 1); - g_esShakeCache[tank].g_iShakeHitMode = iGetSubSettingValue(apply, bHuman, g_esShakeTeammate[tank].g_iShakeHitMode, g_esShakePlayer[tank].g_iShakeHitMode, g_esShakeSpecial[iType].g_iShakeHitMode, g_esShakeAbility[iType].g_iShakeHitMode, 1); - g_esShakeCache[tank].g_iShakeMessage = iGetSubSettingValue(apply, bHuman, g_esShakeTeammate[tank].g_iShakeMessage, g_esShakePlayer[tank].g_iShakeMessage, g_esShakeSpecial[iType].g_iShakeMessage, g_esShakeAbility[iType].g_iShakeMessage, 1); - g_esShakeCache[tank].g_iShakeRangeCooldown = iGetSubSettingValue(apply, bHuman, g_esShakeTeammate[tank].g_iShakeRangeCooldown, g_esShakePlayer[tank].g_iShakeRangeCooldown, g_esShakeSpecial[iType].g_iShakeRangeCooldown, g_esShakeAbility[iType].g_iShakeRangeCooldown, 1); - g_esShakeCache[tank].g_iShakeSight = iGetSubSettingValue(apply, bHuman, g_esShakeTeammate[tank].g_iShakeSight, g_esShakePlayer[tank].g_iShakeSight, g_esShakeSpecial[iType].g_iShakeSight, g_esShakeAbility[iType].g_iShakeSight, 1); - } - else - { - g_esShakeCache[tank].g_flCloseAreasOnly = flGetSettingValue(apply, bHuman, g_esShakePlayer[tank].g_flCloseAreasOnly, g_esShakeAbility[iType].g_flCloseAreasOnly, 1); - g_esShakeCache[tank].g_iComboAbility = iGetSettingValue(apply, bHuman, g_esShakePlayer[tank].g_iComboAbility, g_esShakeAbility[iType].g_iComboAbility, 1); - g_esShakeCache[tank].g_flShakeChance = flGetSettingValue(apply, bHuman, g_esShakePlayer[tank].g_flShakeChance, g_esShakeAbility[iType].g_flShakeChance, 1); - g_esShakeCache[tank].g_flShakeDeathChance = flGetSettingValue(apply, bHuman, g_esShakePlayer[tank].g_flShakeDeathChance, g_esShakeAbility[iType].g_flShakeDeathChance, 1); - g_esShakeCache[tank].g_flShakeDeathRange = flGetSettingValue(apply, bHuman, g_esShakePlayer[tank].g_flShakeDeathRange, g_esShakeAbility[iType].g_flShakeDeathRange, 1); - g_esShakeCache[tank].g_flShakeInterval = flGetSettingValue(apply, bHuman, g_esShakePlayer[tank].g_flShakeInterval, g_esShakeAbility[iType].g_flShakeInterval, 1); - g_esShakeCache[tank].g_flShakeRange = flGetSettingValue(apply, bHuman, g_esShakePlayer[tank].g_flShakeRange, g_esShakeAbility[iType].g_flShakeRange, 1); - g_esShakeCache[tank].g_flShakeRangeChance = flGetSettingValue(apply, bHuman, g_esShakePlayer[tank].g_flShakeRangeChance, g_esShakeAbility[iType].g_flShakeRangeChance, 1); - g_esShakeCache[tank].g_iHumanAbility = iGetSettingValue(apply, bHuman, g_esShakePlayer[tank].g_iHumanAbility, g_esShakeAbility[iType].g_iHumanAbility, 1); - g_esShakeCache[tank].g_iHumanAmmo = iGetSettingValue(apply, bHuman, g_esShakePlayer[tank].g_iHumanAmmo, g_esShakeAbility[iType].g_iHumanAmmo, 1); - g_esShakeCache[tank].g_iHumanCooldown = iGetSettingValue(apply, bHuman, g_esShakePlayer[tank].g_iHumanCooldown, g_esShakeAbility[iType].g_iHumanCooldown, 1); - g_esShakeCache[tank].g_iHumanRangeCooldown = iGetSettingValue(apply, bHuman, g_esShakePlayer[tank].g_iHumanRangeCooldown, g_esShakeAbility[iType].g_iHumanRangeCooldown, 1); - g_esShakeCache[tank].g_flOpenAreasOnly = flGetSettingValue(apply, bHuman, g_esShakePlayer[tank].g_flOpenAreasOnly, g_esShakeAbility[iType].g_flOpenAreasOnly, 1); - g_esShakeCache[tank].g_iRequiresHumans = iGetSettingValue(apply, bHuman, g_esShakePlayer[tank].g_iRequiresHumans, g_esShakeAbility[iType].g_iRequiresHumans, 1); - g_esShakeCache[tank].g_iShakeAbility = iGetSettingValue(apply, bHuman, g_esShakePlayer[tank].g_iShakeAbility, g_esShakeAbility[iType].g_iShakeAbility, 1); - g_esShakeCache[tank].g_iShakeCooldown = iGetSettingValue(apply, bHuman, g_esShakePlayer[tank].g_iShakeCooldown, g_esShakeAbility[iType].g_iShakeCooldown, 1); - g_esShakeCache[tank].g_iShakeDeath = iGetSettingValue(apply, bHuman, g_esShakePlayer[tank].g_iShakeDeath, g_esShakeAbility[iType].g_iShakeDeath, 1); - g_esShakeCache[tank].g_iShakeDuration = iGetSettingValue(apply, bHuman, g_esShakePlayer[tank].g_iShakeDuration, g_esShakeAbility[iType].g_iShakeDuration, 1); - g_esShakeCache[tank].g_iShakeEffect = iGetSettingValue(apply, bHuman, g_esShakePlayer[tank].g_iShakeEffect, g_esShakeAbility[iType].g_iShakeEffect, 1); - g_esShakeCache[tank].g_iShakeHit = iGetSettingValue(apply, bHuman, g_esShakePlayer[tank].g_iShakeHit, g_esShakeAbility[iType].g_iShakeHit, 1); - g_esShakeCache[tank].g_iShakeHitMode = iGetSettingValue(apply, bHuman, g_esShakePlayer[tank].g_iShakeHitMode, g_esShakeAbility[iType].g_iShakeHitMode, 1); - g_esShakeCache[tank].g_iShakeMessage = iGetSettingValue(apply, bHuman, g_esShakePlayer[tank].g_iShakeMessage, g_esShakeAbility[iType].g_iShakeMessage, 1); - g_esShakeCache[tank].g_iShakeRangeCooldown = iGetSettingValue(apply, bHuman, g_esShakePlayer[tank].g_iShakeRangeCooldown, g_esShakeAbility[iType].g_iShakeRangeCooldown, 1); - g_esShakeCache[tank].g_iShakeSight = iGetSettingValue(apply, bHuman, g_esShakePlayer[tank].g_iShakeSight, g_esShakeAbility[iType].g_iShakeSight, 1); - } -} - -#if defined MT_ABILITIES_MAIN2 -void vShakeCopyStats(int oldTank, int newTank) -#else -public void MT_OnCopyStats(int oldTank, int newTank) -#endif -{ - vShakeCopyStats2(oldTank, newTank); - - if (oldTank != newTank) - { - vRemoveShake(oldTank); - } -} - -#if !defined MT_ABILITIES_MAIN2 -public void MT_OnPluginUpdate() -{ - MT_ReloadPlugin(null); -} -#endif - -#if defined MT_ABILITIES_MAIN2 -void vShakeEventFired(Event event, const char[] name) -#else -public void MT_OnEventFired(Event event, const char[] name, bool dontBroadcast) -#endif -{ - if (StrEqual(name, "bot_player_replace")) - { - int iBotId = event.GetInt("bot"), iBot = GetClientOfUserId(iBotId), - iTankId = event.GetInt("player"), iTank = GetClientOfUserId(iTankId); - if (bIsValidClient(iBot) && bIsInfected(iTank)) - { - vShakeCopyStats2(iBot, iTank); - vRemoveShake(iBot); - } - } - else if (StrEqual(name, "mission_lost") || StrEqual(name, "round_start") || StrEqual(name, "round_end")) - { - vShakeReset(); - } - else if (StrEqual(name, "player_bot_replace")) - { - int iTankId = event.GetInt("player"), iTank = GetClientOfUserId(iTankId), - iBotId = event.GetInt("bot"), iBot = GetClientOfUserId(iBotId); - if (bIsValidClient(iTank) && bIsInfected(iBot)) - { - vShakeCopyStats2(iTank, iBot); - vRemoveShake(iTank); - } - } - else if (StrEqual(name, "player_death")) - { - int iTankId = event.GetInt("userid"), iTank = GetClientOfUserId(iTankId); - if (MT_IsTankSupported(iTank, MT_CHECK_INDEX|MT_CHECK_INGAME)) - { - vShakeRange(iTank, 1, 0, GetRandomFloat(0.1, 100.0)); - vRemoveShake(iTank); - } - } - else if (StrEqual(name, "player_now_it")) - { - bool bExploded = event.GetBool("exploded"); - int iSurvivorId = event.GetInt("userid"), iSurvivor = GetClientOfUserId(iSurvivorId), - iBoomerId = event.GetInt("attacker"), iBoomer = GetClientOfUserId(iBoomerId); - if (bIsBoomer(iBoomer) && bIsSurvivor(iSurvivor) && !bExploded) - { - vShakeHit(iSurvivor, iBoomer, GetRandomFloat(0.1, 100.0), g_esShakeCache[iBoomer].g_flShakeChance, g_esShakeCache[iBoomer].g_iShakeHit, MT_MESSAGE_RANGE, MT_ATTACK_RANGE); - } - } - else if (StrEqual(name, "player_spawn")) - { - int iTankId = event.GetInt("userid"), iTank = GetClientOfUserId(iTankId); - if (MT_IsTankSupported(iTank, MT_CHECK_INDEX|MT_CHECK_INGAME)) - { - vShakeRange(iTank, 1, 1, GetRandomFloat(0.1, 100.0)); - vRemoveShake(iTank); - } - } -} - -#if defined MT_ABILITIES_MAIN2 -void vShakeAbilityActivated(int tank) -#else -public void MT_OnAbilityActivated(int tank) -#endif -{ - if (MT_IsTankSupported(tank, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_FAKECLIENT) && ((!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esShakeAbility[g_esShakePlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esShakePlayer[tank].g_iAccessFlags)) || g_esShakeCache[tank].g_iHumanAbility == 0)) - { - return; - } - - if (MT_IsTankSupported(tank) && (!bIsInfected(tank, MT_CHECK_FAKECLIENT) || g_esShakeCache[tank].g_iHumanAbility != 1) && MT_IsCustomTankSupported(tank) && g_esShakeCache[tank].g_iShakeAbility == 1 && g_esShakeCache[tank].g_iComboAbility == 0) - { - vShakeAbility(tank, GetRandomFloat(0.1, 100.0)); - } -} - -#if defined MT_ABILITIES_MAIN2 -void vShakeButtonPressed(int tank, int button) -#else -public void MT_OnButtonPressed(int tank, int button) -#endif -{ - if (MT_IsTankSupported(tank, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_ALIVE|MT_CHECK_FAKECLIENT) && MT_IsCustomTankSupported(tank)) - { - if (bIsAreaNarrow(tank, g_esShakeCache[tank].g_flOpenAreasOnly) || bIsAreaWide(tank, g_esShakeCache[tank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esShakePlayer[tank].g_iTankType, tank) || (g_esShakeCache[tank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esShakeCache[tank].g_iRequiresHumans) || (!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esShakeAbility[g_esShakePlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esShakePlayer[tank].g_iAccessFlags))) - { - return; - } - - if ((button & MT_SUB_KEY) && g_esShakeCache[tank].g_iShakeAbility == 1 && g_esShakeCache[tank].g_iHumanAbility == 1) - { - int iTime = GetTime(); - - switch (g_esShakePlayer[tank].g_iRangeCooldown == -1 || g_esShakePlayer[tank].g_iRangeCooldown <= iTime) - { - case true: vShakeAbility(tank, GetRandomFloat(0.1, 100.0)); - case false: MT_PrintToChat(tank, "%s %t", MT_TAG3, "ShakeHuman3", (g_esShakePlayer[tank].g_iRangeCooldown - iTime)); - } - } - } -} - -#if defined MT_ABILITIES_MAIN2 -void vShakeChangeType(int tank, int oldType) -#else -public void MT_OnChangeType(int tank, int oldType, int newType, bool revert) -#endif -{ - if (oldType <= 0) - { - return; - } - - vRemoveShake(tank); -} - -#if defined MT_ABILITIES_MAIN2 -void vShakePostTankSpawn(int tank) -#else -public void MT_OnPostTankSpawn(int tank) -#endif -{ - vShakeRange(tank, 1, 1, GetRandomFloat(0.1, 100.0)); -} - -void vShakeAbility(int tank, float random, int pos = -1) -{ - if (bIsAreaNarrow(tank, g_esShakeCache[tank].g_flOpenAreasOnly) || bIsAreaWide(tank, g_esShakeCache[tank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esShakePlayer[tank].g_iTankType, tank) || (g_esShakeCache[tank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esShakeCache[tank].g_iRequiresHumans) || (!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esShakeAbility[g_esShakePlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esShakePlayer[tank].g_iAccessFlags))) - { - return; - } - - if (!bIsInfected(tank, MT_CHECK_FAKECLIENT) || (g_esShakePlayer[tank].g_iAmmoCount < g_esShakeCache[tank].g_iHumanAmmo && g_esShakeCache[tank].g_iHumanAmmo > 0)) - { - g_esShakePlayer[tank].g_bFailed = false; - g_esShakePlayer[tank].g_bNoAmmo = false; - - float flTankPos[3], flSurvivorPos[3]; - GetClientAbsOrigin(tank, flTankPos); - float flRange = (pos != -1) ? MT_GetCombinationSetting(tank, 9, pos) : g_esShakeCache[tank].g_flShakeRange, - flChance = (pos != -1) ? MT_GetCombinationSetting(tank, 10, pos) : g_esShakeCache[tank].g_flShakeRangeChance; - int iSurvivorCount = 0; - for (int iSurvivor = 1; iSurvivor <= MaxClients; iSurvivor++) - { - if (bIsHumanSurvivor(iSurvivor, MT_CHECK_INGAME|MT_CHECK_ALIVE) && !MT_IsAdminImmune(iSurvivor, tank) && !bIsAdminImmune(iSurvivor, g_esShakePlayer[tank].g_iTankType, g_esShakeAbility[g_esShakePlayer[tank].g_iTankTypeRecorded].g_iImmunityFlags, g_esShakePlayer[iSurvivor].g_iImmunityFlags)) - { - GetClientAbsOrigin(iSurvivor, flSurvivorPos); - if (GetVectorDistance(flTankPos, flSurvivorPos) <= flRange && bIsVisibleToPlayer(tank, iSurvivor, g_esShakeCache[tank].g_iShakeSight, .range = flRange)) - { - vShakeHit(iSurvivor, tank, random, flChance, g_esShakeCache[tank].g_iShakeAbility, MT_MESSAGE_RANGE, MT_ATTACK_RANGE, pos); - - iSurvivorCount++; - } - } - } - - if (iSurvivorCount == 0) - { - if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esShakeCache[tank].g_iHumanAbility == 1) - { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "ShakeHuman4"); - } - } - } - else if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esShakeCache[tank].g_iHumanAbility == 1) - { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "ShakeAmmo"); - } -} - -void vShakeHit(int survivor, int tank, float random, float chance, int enabled, int messages, int flags, int pos = -1) -{ - if (bIsAreaNarrow(tank, g_esShakeCache[tank].g_flOpenAreasOnly) || bIsAreaWide(tank, g_esShakeCache[tank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esShakePlayer[tank].g_iTankType, tank) || (g_esShakeCache[tank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esShakeCache[tank].g_iRequiresHumans) || (!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esShakeAbility[g_esShakePlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esShakePlayer[tank].g_iAccessFlags)) || MT_IsAdminImmune(survivor, tank) || bIsAdminImmune(survivor, g_esShakePlayer[tank].g_iTankType, g_esShakeAbility[g_esShakePlayer[tank].g_iTankTypeRecorded].g_iImmunityFlags, g_esShakePlayer[survivor].g_iImmunityFlags)) - { - return; - } - - int iTime = GetTime(); - if (((flags & MT_ATTACK_RANGE) && g_esShakePlayer[tank].g_iRangeCooldown != -1 && g_esShakePlayer[tank].g_iRangeCooldown >= iTime) || (((flags & MT_ATTACK_CLAW) || (flags & MT_ATTACK_MELEE)) && g_esShakePlayer[tank].g_iCooldown != -1 && g_esShakePlayer[tank].g_iCooldown >= iTime)) - { - return; - } - - if (enabled == 1 && bIsSurvivor(survivor)) - { - if (!bIsInfected(tank, MT_CHECK_FAKECLIENT) || (flags & MT_ATTACK_CLAW) || (flags & MT_ATTACK_MELEE) || (g_esShakePlayer[tank].g_iAmmoCount < g_esShakeCache[tank].g_iHumanAmmo && g_esShakeCache[tank].g_iHumanAmmo > 0)) - { - if (random <= chance && !g_esShakePlayer[survivor].g_bAffected) - { - if ((messages & MT_MESSAGE_MELEE) && !bIsVisibleToPlayer(tank, survivor, g_esShakeCache[tank].g_iShakeSight, .range = 100.0)) - { - return; - } - - g_esShakePlayer[survivor].g_bAffected = true; - g_esShakePlayer[survivor].g_iOwner = tank; - - int iCooldown = -1; - if ((flags & MT_ATTACK_RANGE) && (g_esShakePlayer[tank].g_iRangeCooldown == -1 || g_esShakePlayer[tank].g_iRangeCooldown <= iTime)) - { - if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esShakeCache[tank].g_iHumanAbility == 1) - { - g_esShakePlayer[tank].g_iAmmoCount++; - - MT_PrintToChat(tank, "%s %t", MT_TAG3, "ShakeHuman", g_esShakePlayer[tank].g_iAmmoCount, g_esShakeCache[tank].g_iHumanAmmo); - } - - iCooldown = (pos != -1) ? RoundToNearest(MT_GetCombinationSetting(tank, 11, pos)) : g_esShakeCache[tank].g_iShakeRangeCooldown; - iCooldown = (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esShakeCache[tank].g_iHumanAbility == 1 && g_esShakePlayer[tank].g_iAmmoCount < g_esShakeCache[tank].g_iHumanAmmo && g_esShakeCache[tank].g_iHumanAmmo > 0) ? g_esShakeCache[tank].g_iHumanRangeCooldown : iCooldown; - g_esShakePlayer[tank].g_iRangeCooldown = (iTime + iCooldown); - if (g_esShakePlayer[tank].g_iRangeCooldown != -1 && g_esShakePlayer[tank].g_iRangeCooldown >= iTime) - { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "ShakeHuman5", (g_esShakePlayer[tank].g_iRangeCooldown - iTime)); - } - } - else if (((flags & MT_ATTACK_CLAW) || (flags & MT_ATTACK_MELEE)) && (g_esShakePlayer[tank].g_iCooldown == -1 || g_esShakePlayer[tank].g_iCooldown <= iTime)) - { - iCooldown = (pos != -1) ? RoundToNearest(MT_GetCombinationSetting(tank, 2, pos)) : g_esShakeCache[tank].g_iShakeCooldown; - iCooldown = (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esShakeCache[tank].g_iHumanAbility == 1) ? g_esShakeCache[tank].g_iHumanCooldown : iCooldown; - g_esShakePlayer[tank].g_iCooldown = (iTime + iCooldown); - if (g_esShakePlayer[tank].g_iCooldown != -1 && g_esShakePlayer[tank].g_iCooldown >= iTime) - { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "ShakeHuman5", (g_esShakePlayer[tank].g_iCooldown - iTime)); - } - } - - float flInterval = (pos != -1) ? MT_GetCombinationSetting(tank, 6, pos) : g_esShakeCache[tank].g_flShakeInterval; - if (flInterval > 0.0) - { - DataPack dpShake; - CreateDataTimer(flInterval, tTimerShake, dpShake, TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); - dpShake.WriteCell(GetClientUserId(survivor)); - dpShake.WriteCell(GetClientUserId(tank)); - dpShake.WriteCell(g_esShakePlayer[tank].g_iTankType); - dpShake.WriteCell(messages); - dpShake.WriteCell(enabled); - dpShake.WriteCell(pos); - dpShake.WriteCell(iTime); - } - - vScreenEffect(survivor, tank, g_esShakeCache[tank].g_iShakeEffect, flags); - EmitSoundToClient(survivor, (g_bSecondGame ? SOUND_SMASH2 : SOUND_SMASH1)); - - if (g_esShakeCache[tank].g_iShakeMessage & messages) - { - char sTankName[64]; - MT_GetTankName(tank, sTankName); - MT_PrintToChatAll("%s %t", MT_TAG2, "Shake", sTankName, survivor); - MT_LogMessage(MT_LOG_ABILITY, "%s %T", MT_TAG, "Shake", LANG_SERVER, sTankName, survivor); - } - } - else if ((flags & MT_ATTACK_RANGE) && (g_esShakePlayer[tank].g_iRangeCooldown == -1 || g_esShakePlayer[tank].g_iRangeCooldown <= iTime)) - { - if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esShakeCache[tank].g_iHumanAbility == 1 && !g_esShakePlayer[tank].g_bFailed) - { - g_esShakePlayer[tank].g_bFailed = true; - - MT_PrintToChat(tank, "%s %t", MT_TAG3, "ShakeHuman2"); - } - } - } - else if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esShakeCache[tank].g_iHumanAbility == 1 && !g_esShakePlayer[tank].g_bNoAmmo) - { - g_esShakePlayer[tank].g_bNoAmmo = true; - - MT_PrintToChat(tank, "%s %t", MT_TAG3, "ShakeAmmo"); - } - } -} - -void vShakeRange(int tank, int value, int bit, float random, int pos = -1) -{ - float flChance = (pos != -1) ? MT_GetCombinationSetting(tank, 13, pos) : g_esShakeCache[tank].g_flShakeDeathChance; - if (MT_IsTankSupported(tank, MT_CHECK_INDEX|MT_CHECK_INGAME) && MT_IsCustomTankSupported(tank) && (g_esShakeCache[tank].g_iShakeDeath & (1 << bit)) && random <= flChance) - { - if (g_esShakeCache[tank].g_iComboAbility == value || bIsAreaNarrow(tank, g_esShakeCache[tank].g_flOpenAreasOnly) || bIsAreaWide(tank, g_esShakeCache[tank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esShakePlayer[tank].g_iTankType, tank) || (g_esShakeCache[tank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esShakeCache[tank].g_iRequiresHumans) || (bIsInfected(tank, MT_CHECK_FAKECLIENT) && ((!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esShakeAbility[g_esShakePlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esShakePlayer[tank].g_iAccessFlags)) || g_esShakeCache[tank].g_iHumanAbility == 0))) - { - return; - } - - float flTankPos[3], flSurvivorPos[3]; - GetClientAbsOrigin(tank, flTankPos); - float flRange = (pos != -1) ? MT_GetCombinationSetting(tank, 12, pos) : g_esShakeCache[tank].g_flShakeDeathRange; - for (int iSurvivor = 1; iSurvivor <= MaxClients; iSurvivor++) - { - if (bIsSurvivor(iSurvivor, MT_CHECK_INGAME|MT_CHECK_ALIVE) && !MT_IsAdminImmune(iSurvivor, tank) && !bIsAdminImmune(iSurvivor, g_esShakePlayer[tank].g_iTankType, g_esShakeAbility[g_esShakePlayer[tank].g_iTankTypeRecorded].g_iImmunityFlags, g_esShakePlayer[iSurvivor].g_iImmunityFlags)) - { - GetClientAbsOrigin(iSurvivor, flSurvivorPos); - if (GetVectorDistance(flTankPos, flSurvivorPos) <= flRange && bIsVisibleToPlayer(tank, iSurvivor, g_esShakeCache[tank].g_iShakeSight, .range = flRange)) - { - vShakePlayerScreen(tank, 2.0); - } - } - } - } -} - -void vShakeCopyStats2(int oldTank, int newTank) -{ - g_esShakePlayer[newTank].g_iAmmoCount = g_esShakePlayer[oldTank].g_iAmmoCount; - g_esShakePlayer[newTank].g_iCooldown = g_esShakePlayer[oldTank].g_iCooldown; - g_esShakePlayer[newTank].g_iRangeCooldown = g_esShakePlayer[oldTank].g_iRangeCooldown; -} - -void vRemoveShake(int tank) -{ - for (int iSurvivor = 1; iSurvivor <= MaxClients; iSurvivor++) - { - if (bIsHumanSurvivor(iSurvivor, MT_CHECK_INGAME|MT_CHECK_ALIVE) && g_esShakePlayer[iSurvivor].g_bAffected && g_esShakePlayer[iSurvivor].g_iOwner == tank) - { - g_esShakePlayer[iSurvivor].g_bAffected = false; - g_esShakePlayer[iSurvivor].g_iOwner = -1; - } - } - - vShakeReset3(tank); -} - -void vShakeReset() -{ - for (int iPlayer = 1; iPlayer <= MaxClients; iPlayer++) - { - if (bIsValidClient(iPlayer, MT_CHECK_INGAME)) - { - vShakeReset3(iPlayer); - - g_esShakePlayer[iPlayer].g_iOwner = -1; - } - } -} - -void vShakeReset2(int survivor, int tank, int messages) -{ - g_esShakePlayer[survivor].g_bAffected = false; - g_esShakePlayer[survivor].g_iOwner = -1; - - if (g_esShakeCache[tank].g_iShakeMessage & messages) - { - MT_PrintToChatAll("%s %t", MT_TAG2, "Shake2", survivor); - MT_LogMessage(MT_LOG_ABILITY, "%s %T", MT_TAG, "Shake2", LANG_SERVER, survivor); - } -} - -void vShakeReset3(int tank) -{ - g_esShakePlayer[tank].g_bAffected = false; - g_esShakePlayer[tank].g_bFailed = false; - g_esShakePlayer[tank].g_bNoAmmo = false; - g_esShakePlayer[tank].g_iAmmoCount = 0; - g_esShakePlayer[tank].g_iCooldown = -1; - g_esShakePlayer[tank].g_iRangeCooldown = -1; -} - -void tTimerShakeCombo(Handle timer, DataPack pack) -{ - pack.Reset(); - - int iTank = GetClientOfUserId(pack.ReadCell()); - if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esShakeAbility[g_esShakePlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esShakePlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esShakePlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esShakeCache[iTank].g_iShakeAbility == 0) - { - return; - } - - float flRandom = pack.ReadFloat(); - int iPos = pack.ReadCell(); - vShakeAbility(iTank, flRandom, iPos); -} - -void tTimerShakeCombo2(Handle timer, DataPack pack) -{ - pack.Reset(); - - int iSurvivor = GetClientOfUserId(pack.ReadCell()); - if (!bIsSurvivor(iSurvivor) || g_esShakePlayer[iSurvivor].g_bAffected) - { - return; - } - - int iTank = GetClientOfUserId(pack.ReadCell()); - if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esShakeAbility[g_esShakePlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esShakePlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esShakePlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esShakeCache[iTank].g_iShakeHit == 0) - { - return; - } - - float flRandom = pack.ReadFloat(), flChance = pack.ReadFloat(); - int iPos = pack.ReadCell(); - char sClassname[32]; - pack.ReadString(sClassname, sizeof sClassname); - if ((g_esShakeCache[iTank].g_iShakeHitMode == 0 || g_esShakeCache[iTank].g_iShakeHitMode == 1) && (bIsSpecialInfected(iTank) || StrEqual(sClassname[7], "tank_claw") || StrEqual(sClassname, "tank_rock"))) - { - vShakeHit(iSurvivor, iTank, flRandom, flChance, g_esShakeCache[iTank].g_iShakeHit, MT_MESSAGE_MELEE, MT_ATTACK_CLAW, iPos); - } - else if ((g_esShakeCache[iTank].g_iShakeHitMode == 0 || g_esShakeCache[iTank].g_iShakeHitMode == 2) && StrEqual(sClassname[7], "melee")) - { - vShakeHit(iSurvivor, iTank, flRandom, flChance, g_esShakeCache[iTank].g_iShakeHit, MT_MESSAGE_MELEE, MT_ATTACK_MELEE, iPos); - } -} - -Action tTimerShake(Handle timer, DataPack pack) -{ - pack.Reset(); - - int iSurvivor = GetClientOfUserId(pack.ReadCell()); - if (!MT_IsCorePluginEnabled() || !bIsHumanSurvivor(iSurvivor)) - { - g_esShakePlayer[iSurvivor].g_bAffected = false; - g_esShakePlayer[iSurvivor].g_iOwner = -1; - - return Plugin_Stop; - } - - int iTank = GetClientOfUserId(pack.ReadCell()), iType = pack.ReadCell(), iMessage = pack.ReadCell(); - if (!MT_IsTankSupported(iTank) || bIsAreaNarrow(iTank, g_esShakeCache[iTank].g_flOpenAreasOnly) || bIsAreaWide(iTank, g_esShakeCache[iTank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esShakePlayer[iTank].g_iTankType, iTank) || (g_esShakeCache[iTank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esShakeCache[iTank].g_iRequiresHumans) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esShakeAbility[g_esShakePlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esShakePlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esShakePlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || iType != g_esShakePlayer[iTank].g_iTankType || MT_IsAdminImmune(iSurvivor, iTank) || bIsAdminImmune(iSurvivor, g_esShakePlayer[iTank].g_iTankType, g_esShakeAbility[g_esShakePlayer[iTank].g_iTankTypeRecorded].g_iImmunityFlags, g_esShakePlayer[iSurvivor].g_iImmunityFlags) || !g_esShakePlayer[iSurvivor].g_bAffected) - { - vShakeReset2(iSurvivor, iTank, iMessage); - - return Plugin_Stop; - } - - int iShakeEnabled = pack.ReadCell(), iPos = pack.ReadCell(), - iDuration = (iPos != -1) ? RoundToNearest(MT_GetCombinationSetting(iTank, 5, iPos)) : g_esShakeCache[iTank].g_iShakeDuration, - iTime = pack.ReadCell(); - if (iShakeEnabled == 0 || (iTime + iDuration) <= GetTime()) - { - vShakeReset2(iSurvivor, iTank, iMessage); - - return Plugin_Stop; - } - - if (!bIsVisibleToPlayer(iSurvivor, iTank, g_esShakeCache[iTank].g_iShakeSight)) - { - return Plugin_Continue; - } - - vShakePlayerScreen(iSurvivor); - - return Plugin_Continue; -} \ No newline at end of file diff --git a/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_shield.sp b/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_shield.sp index 0091d30393..bc073af5c9 100644 --- a/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_shield.sp +++ b/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_shield.sp @@ -1,6 +1,6 @@ /** - * Mutant Tanks: a L4D/L4D2 SourceMod Plugin - * Copyright (C) 2024 Alfred "Psyk0tik" Llagas + * Mutant Tanks: A L4D/L4D2 SourceMod Plugin + * Copyright (C) 2017-2025 Alfred "Psyk0tik" Llagas * * 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. * @@ -29,6 +29,8 @@ public Plugin myinfo = bool g_bDedicated, g_bLateLoad, g_bSecondGame; +int g_iGraphicsLevel; + public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max) { switch (GetEngineVersion()) @@ -412,7 +414,15 @@ int iShieldMenuHandler(Menu menu, MenuAction action, int param1, int param2) case 0: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esShieldCache[param1].g_iShieldAbility == 0) ? "AbilityStatus1" : "AbilityStatus2"); case 1: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityAmmo", (g_esShieldCache[param1].g_iHumanAmmo - g_esShieldPlayer[param1].g_iAmmoCount), g_esShieldCache[param1].g_iHumanAmmo); case 2: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtons"); - case 3: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esShieldCache[param1].g_iHumanMode == 0) ? "AbilityButtonMode1" : "AbilityButtonMode2"); + case 3: + { + switch (g_esShieldCache[param1].g_iHumanMode) + { + case 0: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtonMode1"); + case 1: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtonMode2"); + case 2: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtonMode3"); + } + } case 4: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityCooldown", ((g_esShieldCache[param1].g_iHumanAbility == 1) ? g_esShieldCache[param1].g_iHumanCooldown : g_esShieldCache[param1].g_iShieldCooldown)); case 5: MT_PrintToChat(param1, "%s %t", MT_TAG3, "ShieldDetails"); case 6: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityDuration2", ((g_esShieldCache[param1].g_iHumanAbility == 1) ? g_esShieldCache[param1].g_iHumanDuration : g_esShieldCache[param1].g_iShieldDuration)); @@ -508,7 +518,7 @@ public void OnGameFrame() { char sClassname[32], sHealthBar[51], sSet[2][2], sTankName[64]; float flPercentage = 0.0; - int iTarget = 0; + int iCount = 0, iTarget = 0; for (int iPlayer = 1; iPlayer <= MaxClients; iPlayer++) { if (bIsValidClient(iPlayer, MT_CHECK_INGAME|MT_CHECK_ALIVE|MT_CHECK_FAKECLIENT)) @@ -527,12 +537,12 @@ public void OnGameFrame() ReplaceString(g_esShieldCache[iTarget].g_sShieldHealthChars, sizeof esShieldCache::g_sShieldHealthChars, " ", ""); ExplodeString(g_esShieldCache[iTarget].g_sShieldHealthChars, ",", sSet, sizeof sSet, sizeof sSet[]); - for (int iCount = 0; iCount < ((g_esShieldPlayer[iTarget].g_flHealth / g_esShieldCache[iTarget].g_flShieldHealth) * (sizeof sHealthBar - 1)) && iCount < (sizeof sHealthBar - 1); iCount++) + for (iCount = 0; iCount < ((g_esShieldPlayer[iTarget].g_flHealth / g_esShieldCache[iTarget].g_flShieldHealth) * (sizeof sHealthBar - 1)) && iCount < (sizeof sHealthBar - 1); iCount++) { StrCat(sHealthBar, sizeof sHealthBar, sSet[0]); } - for (int iCount = 0; iCount < (sizeof sHealthBar - 1); iCount++) + for (; iCount < (sizeof sHealthBar - 1); iCount++) { StrCat(sHealthBar, sizeof sHealthBar, sSet[1]); } @@ -587,7 +597,7 @@ void vShieldPlayerRunCmd(int client) public Action OnPlayerRunCmd(int client, int &buttons, int &impulse, float vel[3], float angles[3], int &weapon) #endif { - if (!MT_IsTankSupported(client) || (bIsInfected(client, MT_CHECK_FAKECLIENT) && g_esShieldCache[client].g_iHumanMode == 1) || (g_esShieldPlayer[client].g_iDuration == -1 && g_esShieldPlayer[client].g_iCooldown2 == -1)) + if (!MT_IsTankSupported(client) || (bIsInfected(client, MT_CHECK_FAKECLIENT) && g_esShieldCache[client].g_iHumanMode > 0) || (g_esShieldPlayer[client].g_iDuration == -1 && g_esShieldPlayer[client].g_iCooldown2 == -1)) { #if defined MT_ABILITIES_MAIN2 return; @@ -946,7 +956,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esShieldTeammate[admin].g_iHumanAmmo = iGetKeyValue(subsection, MT_SHIELD_SECTION, MT_SHIELD_SECTION2, MT_SHIELD_SECTION3, MT_SHIELD_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esShieldTeammate[admin].g_iHumanAmmo, value, -1, 99999); g_esShieldTeammate[admin].g_iHumanCooldown = iGetKeyValue(subsection, MT_SHIELD_SECTION, MT_SHIELD_SECTION2, MT_SHIELD_SECTION3, MT_SHIELD_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esShieldTeammate[admin].g_iHumanCooldown, value, -1, 99999); g_esShieldTeammate[admin].g_iHumanDuration = iGetKeyValue(subsection, MT_SHIELD_SECTION, MT_SHIELD_SECTION2, MT_SHIELD_SECTION3, MT_SHIELD_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esShieldTeammate[admin].g_iHumanDuration, value, -1, 99999); - g_esShieldTeammate[admin].g_iHumanMode = iGetKeyValue(subsection, MT_SHIELD_SECTION, MT_SHIELD_SECTION2, MT_SHIELD_SECTION3, MT_SHIELD_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esShieldTeammate[admin].g_iHumanMode, value, -1, 1); + g_esShieldTeammate[admin].g_iHumanMode = iGetKeyValue(subsection, MT_SHIELD_SECTION, MT_SHIELD_SECTION2, MT_SHIELD_SECTION3, MT_SHIELD_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esShieldTeammate[admin].g_iHumanMode, value, -1, 2); g_esShieldTeammate[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_SHIELD_SECTION, MT_SHIELD_SECTION2, MT_SHIELD_SECTION3, MT_SHIELD_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esShieldTeammate[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); g_esShieldTeammate[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_SHIELD_SECTION, MT_SHIELD_SECTION2, MT_SHIELD_SECTION3, MT_SHIELD_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esShieldTeammate[admin].g_iRequiresHumans, value, -1, 32); g_esShieldTeammate[admin].g_iShieldAbility = iGetKeyValue(subsection, MT_SHIELD_SECTION, MT_SHIELD_SECTION2, MT_SHIELD_SECTION3, MT_SHIELD_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esShieldTeammate[admin].g_iShieldAbility, value, -1, 1); @@ -973,7 +983,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esShieldPlayer[admin].g_iHumanAmmo = iGetKeyValue(subsection, MT_SHIELD_SECTION, MT_SHIELD_SECTION2, MT_SHIELD_SECTION3, MT_SHIELD_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esShieldPlayer[admin].g_iHumanAmmo, value, -1, 99999); g_esShieldPlayer[admin].g_iHumanCooldown = iGetKeyValue(subsection, MT_SHIELD_SECTION, MT_SHIELD_SECTION2, MT_SHIELD_SECTION3, MT_SHIELD_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esShieldPlayer[admin].g_iHumanCooldown, value, -1, 99999); g_esShieldPlayer[admin].g_iHumanDuration = iGetKeyValue(subsection, MT_SHIELD_SECTION, MT_SHIELD_SECTION2, MT_SHIELD_SECTION3, MT_SHIELD_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esShieldPlayer[admin].g_iHumanDuration, value, -1, 99999); - g_esShieldPlayer[admin].g_iHumanMode = iGetKeyValue(subsection, MT_SHIELD_SECTION, MT_SHIELD_SECTION2, MT_SHIELD_SECTION3, MT_SHIELD_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esShieldPlayer[admin].g_iHumanMode, value, -1, 1); + g_esShieldPlayer[admin].g_iHumanMode = iGetKeyValue(subsection, MT_SHIELD_SECTION, MT_SHIELD_SECTION2, MT_SHIELD_SECTION3, MT_SHIELD_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esShieldPlayer[admin].g_iHumanMode, value, -1, 2); g_esShieldPlayer[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_SHIELD_SECTION, MT_SHIELD_SECTION2, MT_SHIELD_SECTION3, MT_SHIELD_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esShieldPlayer[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); g_esShieldPlayer[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_SHIELD_SECTION, MT_SHIELD_SECTION2, MT_SHIELD_SECTION3, MT_SHIELD_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esShieldPlayer[admin].g_iRequiresHumans, value, -1, 32); g_esShieldPlayer[admin].g_iShieldAbility = iGetKeyValue(subsection, MT_SHIELD_SECTION, MT_SHIELD_SECTION2, MT_SHIELD_SECTION3, MT_SHIELD_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esShieldPlayer[admin].g_iShieldAbility, value, -1, 1); @@ -1031,7 +1041,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esShieldSpecial[type].g_iHumanAmmo = iGetKeyValue(subsection, MT_SHIELD_SECTION, MT_SHIELD_SECTION2, MT_SHIELD_SECTION3, MT_SHIELD_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esShieldSpecial[type].g_iHumanAmmo, value, -1, 99999); g_esShieldSpecial[type].g_iHumanCooldown = iGetKeyValue(subsection, MT_SHIELD_SECTION, MT_SHIELD_SECTION2, MT_SHIELD_SECTION3, MT_SHIELD_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esShieldSpecial[type].g_iHumanCooldown, value, -1, 99999); g_esShieldSpecial[type].g_iHumanDuration = iGetKeyValue(subsection, MT_SHIELD_SECTION, MT_SHIELD_SECTION2, MT_SHIELD_SECTION3, MT_SHIELD_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esShieldSpecial[type].g_iHumanDuration, value, -1, 99999); - g_esShieldSpecial[type].g_iHumanMode = iGetKeyValue(subsection, MT_SHIELD_SECTION, MT_SHIELD_SECTION2, MT_SHIELD_SECTION3, MT_SHIELD_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esShieldSpecial[type].g_iHumanMode, value, -1, 1); + g_esShieldSpecial[type].g_iHumanMode = iGetKeyValue(subsection, MT_SHIELD_SECTION, MT_SHIELD_SECTION2, MT_SHIELD_SECTION3, MT_SHIELD_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esShieldSpecial[type].g_iHumanMode, value, -1, 2); g_esShieldSpecial[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_SHIELD_SECTION, MT_SHIELD_SECTION2, MT_SHIELD_SECTION3, MT_SHIELD_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esShieldSpecial[type].g_flOpenAreasOnly, value, -1.0, 99999.0); g_esShieldSpecial[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_SHIELD_SECTION, MT_SHIELD_SECTION2, MT_SHIELD_SECTION3, MT_SHIELD_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esShieldSpecial[type].g_iRequiresHumans, value, -1, 32); g_esShieldSpecial[type].g_iShieldAbility = iGetKeyValue(subsection, MT_SHIELD_SECTION, MT_SHIELD_SECTION2, MT_SHIELD_SECTION3, MT_SHIELD_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esShieldSpecial[type].g_iShieldAbility, value, -1, 1); @@ -1058,7 +1068,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esShieldAbility[type].g_iHumanAmmo = iGetKeyValue(subsection, MT_SHIELD_SECTION, MT_SHIELD_SECTION2, MT_SHIELD_SECTION3, MT_SHIELD_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esShieldAbility[type].g_iHumanAmmo, value, -1, 99999); g_esShieldAbility[type].g_iHumanCooldown = iGetKeyValue(subsection, MT_SHIELD_SECTION, MT_SHIELD_SECTION2, MT_SHIELD_SECTION3, MT_SHIELD_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esShieldAbility[type].g_iHumanCooldown, value, -1, 99999); g_esShieldAbility[type].g_iHumanDuration = iGetKeyValue(subsection, MT_SHIELD_SECTION, MT_SHIELD_SECTION2, MT_SHIELD_SECTION3, MT_SHIELD_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esShieldAbility[type].g_iHumanDuration, value, -1, 99999); - g_esShieldAbility[type].g_iHumanMode = iGetKeyValue(subsection, MT_SHIELD_SECTION, MT_SHIELD_SECTION2, MT_SHIELD_SECTION3, MT_SHIELD_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esShieldAbility[type].g_iHumanMode, value, -1, 1); + g_esShieldAbility[type].g_iHumanMode = iGetKeyValue(subsection, MT_SHIELD_SECTION, MT_SHIELD_SECTION2, MT_SHIELD_SECTION3, MT_SHIELD_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esShieldAbility[type].g_iHumanMode, value, -1, 2); g_esShieldAbility[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_SHIELD_SECTION, MT_SHIELD_SECTION2, MT_SHIELD_SECTION3, MT_SHIELD_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esShieldAbility[type].g_flOpenAreasOnly, value, -1.0, 99999.0); g_esShieldAbility[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_SHIELD_SECTION, MT_SHIELD_SECTION2, MT_SHIELD_SECTION3, MT_SHIELD_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esShieldAbility[type].g_iRequiresHumans, value, -1, 32); g_esShieldAbility[type].g_iShieldAbility = iGetKeyValue(subsection, MT_SHIELD_SECTION, MT_SHIELD_SECTION2, MT_SHIELD_SECTION3, MT_SHIELD_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esShieldAbility[type].g_iShieldAbility, value, -1, 1); @@ -1117,7 +1127,9 @@ public void MT_OnSettingsCached(int tank, bool apply, int type) g_esShieldPlayer[tank].g_iTankTypeRecorded = apply ? MT_GetRecordedTankType(tank, type) : 0; g_esShieldPlayer[tank].g_iTankType = apply ? type : 0; int iType = g_esShieldPlayer[tank].g_iTankTypeRecorded; - +#if !defined MT_ABILITIES_MAIN2 + g_iGraphicsLevel = MT_GetGraphicsLevel(); +#endif if (bInfected) { g_esShieldCache[tank].g_flCloseAreasOnly = flGetSubSettingValue(apply, bHuman, g_esShieldTeammate[tank].g_flCloseAreasOnly, g_esShieldPlayer[tank].g_flCloseAreasOnly, g_esShieldSpecial[iType].g_flCloseAreasOnly, g_esShieldAbility[iType].g_flCloseAreasOnly, 1); @@ -1322,10 +1334,10 @@ public void MT_OnButtonPressed(int tank, int button) if ((button & MT_MAIN_KEY) && g_esShieldCache[tank].g_iShieldAbility == 1 && g_esShieldCache[tank].g_iHumanAbility == 1) { - int iTime = GetTime(); + int iHumanMode = g_esShieldCache[tank].g_iHumanMode, iTime = GetTime(); bool bRecharging = g_esShieldPlayer[tank].g_iCooldown != -1 && g_esShieldPlayer[tank].g_iCooldown >= iTime; - switch (g_esShieldCache[tank].g_iHumanMode) + switch (iHumanMode) { case 0: { @@ -1342,26 +1354,37 @@ public void MT_OnButtonPressed(int tank, int button) MT_PrintToChat(tank, "%s %t", MT_TAG3, "ShieldHuman4", (g_esShieldPlayer[tank].g_iCooldown - iTime)); } } - case 1: + case 1, 2: { - if (g_esShieldPlayer[tank].g_iAmmoCount < g_esShieldCache[tank].g_iHumanAmmo && g_esShieldCache[tank].g_iHumanAmmo > 0) + if ((iHumanMode == 2 && g_esShieldPlayer[tank].g_bActivated) || (g_esShieldPlayer[tank].g_iAmmoCount < g_esShieldCache[tank].g_iHumanAmmo && g_esShieldCache[tank].g_iHumanAmmo > 0)) { if (!g_esShieldPlayer[tank].g_bActivated && !bRecharging) { g_esShieldPlayer[tank].g_bActivated = true; g_esShieldPlayer[tank].g_iAmmoCount++; - g_esShieldPlayer[tank].g_iShield = CreateEntityByName("prop_dynamic"); - if (bIsValidEntity(g_esShieldPlayer[tank].g_iShield)) + if (g_iGraphicsLevel > 1) { - vShield(tank); + g_esShieldPlayer[tank].g_iShield = CreateEntityByName("prop_dynamic"); + if (bIsValidEntity(g_esShieldPlayer[tank].g_iShield)) + { + vShield(tank); + } } MT_PrintToChat(tank, "%s %t", MT_TAG3, "ShieldHuman", g_esShieldPlayer[tank].g_iAmmoCount, g_esShieldCache[tank].g_iHumanAmmo); } else if (g_esShieldPlayer[tank].g_bActivated) { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "ShieldHuman3"); + switch (iHumanMode) + { + case 1: MT_PrintToChat(tank, "%s %t", MT_TAG3, "ShieldHuman3"); + case 2: + { + vRemoveShield(tank); + vShieldReset3(tank); + } + } } else if (bRecharging) { @@ -1436,7 +1459,7 @@ public void MT_OnRockThrow(int tank, int rock) void vSetShieldGlow(int entity, int color, bool flashing, int min, int max, int type) { - if (!g_bSecondGame) + if (!g_bSecondGame || g_iGraphicsLevel <= 1) { return; } @@ -1464,7 +1487,7 @@ void vShield(int tank) DispatchSpawn(g_esShieldPlayer[tank].g_iShield); vSetEntityParent(g_esShieldPlayer[tank].g_iShield, tank, true); - switch (StrEqual(g_esShieldCache[tank].g_sShieldColor, "rainbow", false)) + switch (StrEqual(g_esShieldCache[tank].g_sShieldColor, "rainbow", false) && g_iGraphicsLevel > 2) { case true: { @@ -1486,7 +1509,7 @@ void vShield(int tank) int iGlowColor[4]; MT_GetTankColors(tank, 2, iGlowColor[0], iGlowColor[1], iGlowColor[2], iGlowColor[3]); - switch (iGlowColor[0] == -2 && iGlowColor[1] == -2 && iGlowColor[2] == -2) + switch (iGlowColor[0] == -2 && iGlowColor[1] == -2 && iGlowColor[2] == -2 && g_iGraphicsLevel > 2) { case true: { @@ -1521,34 +1544,38 @@ void vShieldAbility(int tank, bool shield) { if (GetRandomFloat(0.1, 100.0) <= g_esShieldCache[tank].g_flShieldChance) { - g_esShieldPlayer[tank].g_iShield = CreateEntityByName("prop_dynamic"); - if (bIsValidEntity(g_esShieldPlayer[tank].g_iShield)) + if (g_iGraphicsLevel > 1) { - g_esShieldPlayer[tank].g_bActivated = true; - g_esShieldPlayer[tank].g_flHealth = g_esShieldCache[tank].g_flShieldHealth; - g_esShieldPlayer[tank].g_iCooldown2 = -1; - - vShield(tank); - ExtinguishEntity(tank); - - if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esShieldCache[tank].g_iHumanAbility == 1) + g_esShieldPlayer[tank].g_iShield = CreateEntityByName("prop_dynamic"); + if (bIsValidEntity(g_esShieldPlayer[tank].g_iShield)) { - int iPos = g_esShieldAbility[g_esShieldPlayer[tank].g_iTankTypeRecorded].g_iComboPosition, iDuration = (iPos != -1) ? RoundToNearest(MT_GetCombinationSetting(tank, 5, iPos)) : g_esShieldCache[tank].g_iShieldDuration; - iDuration = (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esShieldCache[tank].g_iHumanAbility == 1) ? g_esShieldCache[tank].g_iHumanDuration : iDuration; - g_esShieldPlayer[tank].g_iAmmoCount++; - g_esShieldPlayer[tank].g_iDuration = (iTime + iDuration); + g_esShieldPlayer[tank].g_bActivated = true; + g_esShieldPlayer[tank].g_flHealth = g_esShieldCache[tank].g_flShieldHealth; + g_esShieldPlayer[tank].g_iCooldown2 = -1; - vExternalView(tank, 1.5); - MT_PrintToChat(tank, "%s %t", MT_TAG3, "ShieldHuman", g_esShieldPlayer[tank].g_iAmmoCount, g_esShieldCache[tank].g_iHumanAmmo); + vShield(tank); } + } - if (g_esShieldCache[tank].g_iShieldMessage == 1) - { - char sTankName[64]; - MT_GetTankName(tank, sTankName); - MT_PrintToChatAll("%s %t", MT_TAG2, "Shield", sTankName); - MT_LogMessage(MT_LOG_ABILITY, "%s %T", MT_TAG, "Shield", LANG_SERVER, sTankName); - } + if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esShieldCache[tank].g_iHumanAbility == 1 && g_esShieldPlayer[tank].g_bActivated) + { + int iPos = g_esShieldAbility[g_esShieldPlayer[tank].g_iTankTypeRecorded].g_iComboPosition, iDuration = (iPos != -1) ? RoundToNearest(MT_GetCombinationSetting(tank, 5, iPos)) : g_esShieldCache[tank].g_iShieldDuration; + iDuration = (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esShieldCache[tank].g_iHumanAbility == 1) ? g_esShieldCache[tank].g_iHumanDuration : iDuration; + g_esShieldPlayer[tank].g_iAmmoCount++; + g_esShieldPlayer[tank].g_iDuration = (iTime + iDuration); + + vExternalView(tank, 1.5); + MT_PrintToChat(tank, "%s %t", MT_TAG3, "ShieldHuman", g_esShieldPlayer[tank].g_iAmmoCount, g_esShieldCache[tank].g_iHumanAmmo); + } + + ExtinguishEntity(tank); + + if (g_esShieldCache[tank].g_iShieldMessage == 1) + { + char sTankName[64]; + MT_GetTankName(tank, sTankName); + MT_PrintToChatAll("%s %t", MT_TAG2, "Shield", sTankName); + MT_LogMessage(MT_LOG_ABILITY, "%s %T", MT_TAG, "Shield", LANG_SERVER, sTankName); } } else if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esShieldCache[tank].g_iHumanAbility == 1) @@ -1592,7 +1619,7 @@ void vShieldAbility(int tank, bool shield) void OnShieldPreThinkPost(int tank) { - if (!MT_IsTankSupported(tank) || !MT_IsCustomTankSupported(tank) || !g_esShieldPlayer[tank].g_bRainbowColor) + if (!MT_IsTankSupported(tank) || !MT_IsCustomTankSupported(tank) || !g_esShieldPlayer[tank].g_bRainbowColor || g_iGraphicsLevel <= 2) { g_esShieldPlayer[tank].g_bRainbowColor = false; @@ -1716,15 +1743,17 @@ void vShieldReset3(int tank) } } -void tTimerShieldCombo(Handle timer, int userid) +Action tTimerShieldCombo(Handle timer, int userid) { int iTank = GetClientOfUserId(userid); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esShieldAbility[g_esShieldPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esShieldPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esShieldPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esShieldCache[iTank].g_iShieldAbility == 0 || g_esShieldPlayer[iTank].g_bActivated) { - return; + return Plugin_Stop; } vShieldAbility(iTank, true); + + return Plugin_Continue; } Action tTimerShieldThrow(Handle timer, DataPack pack) diff --git a/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_shove.sp b/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_shove.sp index 7c6a1a95f6..679cbfee2a 100644 --- a/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_shove.sp +++ b/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_shove.sp @@ -1,6 +1,6 @@ /** - * Mutant Tanks: a L4D/L4D2 SourceMod Plugin - * Copyright (C) 2024 Alfred "Psyk0tik" Llagas + * Mutant Tanks: A L4D/L4D2 SourceMod Plugin + * Copyright (C) 2017-2025 Alfred "Psyk0tik" Llagas * * 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. * @@ -1270,35 +1270,37 @@ void vShoveReset3(int tank) g_esShovePlayer[tank].g_iRangeCooldown = -1; } -void tTimerShoveCombo(Handle timer, DataPack pack) +Action tTimerShoveCombo(Handle timer, DataPack pack) { pack.Reset(); int iTank = GetClientOfUserId(pack.ReadCell()); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esShoveAbility[g_esShovePlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esShovePlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esShovePlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esShoveCache[iTank].g_iShoveAbility == 0) { - return; + return Plugin_Stop; } float flRandom = pack.ReadFloat(); int iPos = pack.ReadCell(); vShoveAbility(iTank, flRandom, iPos); + + return Plugin_Continue; } -void tTimerShoveCombo2(Handle timer, DataPack pack) +Action tTimerShoveCombo2(Handle timer, DataPack pack) { pack.Reset(); int iSurvivor = GetClientOfUserId(pack.ReadCell()); if (!bIsSurvivor(iSurvivor) || g_esShovePlayer[iSurvivor].g_bAffected) { - return; + return Plugin_Stop; } int iTank = GetClientOfUserId(pack.ReadCell()); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esShoveAbility[g_esShovePlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esShovePlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esShovePlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esShoveCache[iTank].g_iShoveHit == 0) { - return; + return Plugin_Stop; } float flRandom = pack.ReadFloat(), flChance = pack.ReadFloat(); @@ -1313,6 +1315,8 @@ void tTimerShoveCombo2(Handle timer, DataPack pack) { vShoveHit(iSurvivor, iTank, flRandom, flChance, g_esShoveCache[iTank].g_iShoveHit, MT_MESSAGE_MELEE, MT_ATTACK_MELEE, iPos); } + + return Plugin_Continue; } Action tTimerShove(Handle timer, DataPack pack) diff --git a/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_slow.sp b/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_slow.sp index 55af8d9054..8b414841ba 100644 --- a/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_slow.sp +++ b/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_slow.sp @@ -1,6 +1,6 @@ /** - * Mutant Tanks: a L4D/L4D2 SourceMod Plugin - * Copyright (C) 2024 Alfred "Psyk0tik" Llagas + * Mutant Tanks: A L4D/L4D2 SourceMod Plugin + * Copyright (C) 2017-2025 Alfred "Psyk0tik" Llagas * * 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. * @@ -1270,35 +1270,37 @@ void vStopSlow(int survivor, bool all = true) } } -void tTimerSlowCombo(Handle timer, DataPack pack) +Action tTimerSlowCombo(Handle timer, DataPack pack) { pack.Reset(); int iTank = GetClientOfUserId(pack.ReadCell()); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esSlowAbility[g_esSlowPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esSlowPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esSlowPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esSlowCache[iTank].g_iSlowAbility == 0) { - return; + return Plugin_Stop; } float flRandom = pack.ReadFloat(); int iPos = pack.ReadCell(); vSlowAbility(iTank, flRandom, iPos); + + return Plugin_Continue; } -void tTimerSlowCombo2(Handle timer, DataPack pack) +Action tTimerSlowCombo2(Handle timer, DataPack pack) { pack.Reset(); int iSurvivor = GetClientOfUserId(pack.ReadCell()); if (!bIsSurvivor(iSurvivor) || g_esSlowPlayer[iSurvivor].g_bAffected) { - return; + return Plugin_Stop; } int iTank = GetClientOfUserId(pack.ReadCell()); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esSlowAbility[g_esSlowPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esSlowPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esSlowPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esSlowCache[iTank].g_iSlowHit == 0) { - return; + return Plugin_Stop; } float flRandom = pack.ReadFloat(), flChance = pack.ReadFloat(); @@ -1313,6 +1315,8 @@ void tTimerSlowCombo2(Handle timer, DataPack pack) { vSlowHit(iSurvivor, iTank, flRandom, flChance, g_esSlowCache[iTank].g_iSlowHit, MT_MESSAGE_MELEE, MT_ATTACK_MELEE, iPos); } + + return Plugin_Continue; } Action tTimerStopSlow(Handle timer, DataPack pack) diff --git a/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_smash.sp b/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_smash.sp index 5743562ccf..4806e9cef6 100644 --- a/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_smash.sp +++ b/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_smash.sp @@ -1,6 +1,6 @@ /** - * Mutant Tanks: a L4D/L4D2 SourceMod Plugin - * Copyright (C) 2024 Alfred "Psyk0tik" Llagas + * Mutant Tanks: A L4D/L4D2 SourceMod Plugin + * Copyright (C) 2017-2025 Alfred "Psyk0tik" Llagas * * 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. * @@ -22,13 +22,15 @@ public Plugin myinfo = { name = "[MT] Smash Ability", author = MT_AUTHOR, - description = "The Mutant Tank smashes survivors to death.", + description = "The Mutant Tank sends survivors into space, smashes survivors to death, smites survivors, and kills itself along with a survivor victim.", version = MT_VERSION, url = MT_URL }; bool g_bDedicated, g_bLateLoad, g_bSecondGame; +int g_iGraphicsLevel; + public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max) { switch (GetEngineVersion()) @@ -51,10 +53,16 @@ public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max #define PARTICLE_BLOOD "boomer_explode_D" +#define SOUND_EXPLOSION "ambient/explosions/explode_2.wav" +#define SOUND_FIRE "weapons/molotov/fire_ignite_1.wav" #define SOUND_GROWL1 "player/tank/voice/growl/hulk_growl_1.wav" // Only available in L4D1 #define SOUND_GROWL2 "player/tank/voice/growl/tank_climb_01.wav" // Only available in L4D2 +#define SOUND_LAUNCH "player/boomer/explode/explo_medium_14.wav" #define SOUND_SMASH1 "player/tank/hit/hulk_punch_1.wav" #define SOUND_SMASH2 "player/charger/hit/charger_smash_02.wav" // Only available in L4D2 + +#define SPRITE_FIRE "sprites/sprite_fire01.vmt" +#define SPRITE_GLOW "sprites/glow01.vmt" #else #if MT_SMASH_COMPILE_METHOD == 1 #error This file must be compiled as a standalone plugin. @@ -66,10 +74,15 @@ public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max #define MT_SMASH_SECTION3 "smash_ability" #define MT_SMASH_SECTION4 "smash" +#define MT_SMASH_POUND (1 << 0) // pound +#define MT_SMASH_ROCKET (1 << 1) // rocket +#define MT_SMASH_SMITE (1 << 2) // smite + #define MT_MENU_SMASH "Smash Ability" enum struct esSmashPlayer { + bool g_bAffected; bool g_bFailed; bool g_bNoAmmo; @@ -77,6 +90,8 @@ enum struct esSmashPlayer float g_flDamage; float g_flOpenAreasOnly; float g_flSmashChance; + float g_flSmashCountdown; + float g_flSmashDelay; float g_flSmashMeter; float g_flSmashRange; float g_flSmashRangeChance; @@ -90,6 +105,7 @@ enum struct esSmashPlayer int g_iHumanCooldown; int g_iHumanRangeCooldown; int g_iImmunityFlags; + int g_iOwner; int g_iRangeCooldown; int g_iRequiresHumans; int g_iSmashAbility; @@ -101,7 +117,9 @@ enum struct esSmashPlayer int g_iSmashMessage; int g_iSmashMode; int g_iSmashRangeCooldown; + int g_iSmashRemove; int g_iSmashSight; + int g_iSmashType; int g_iTankType; int g_iTankTypeRecorded; } @@ -113,6 +131,8 @@ enum struct esSmashTeammate float g_flCloseAreasOnly; float g_flOpenAreasOnly; float g_flSmashChance; + float g_flSmashCountdown; + float g_flSmashDelay; float g_flSmashMeter; float g_flSmashRange; float g_flSmashRangeChance; @@ -132,7 +152,9 @@ enum struct esSmashTeammate int g_iSmashMessage; int g_iSmashMode; int g_iSmashRangeCooldown; + int g_iSmashRemove; int g_iSmashSight; + int g_iSmashType; } esSmashTeammate g_esSmashTeammate[MAXPLAYERS + 1]; @@ -142,6 +164,8 @@ enum struct esSmashAbility float g_flCloseAreasOnly; float g_flOpenAreasOnly; float g_flSmashChance; + float g_flSmashCountdown; + float g_flSmashDelay; float g_flSmashMeter; float g_flSmashRange; float g_flSmashRangeChance; @@ -163,7 +187,9 @@ enum struct esSmashAbility int g_iSmashMessage; int g_iSmashMode; int g_iSmashRangeCooldown; + int g_iSmashRemove; int g_iSmashSight; + int g_iSmashType; } esSmashAbility g_esSmashAbility[MT_MAXTYPES + 1]; @@ -173,6 +199,8 @@ enum struct esSmashSpecial float g_flCloseAreasOnly; float g_flOpenAreasOnly; float g_flSmashChance; + float g_flSmashCountdown; + float g_flSmashDelay; float g_flSmashMeter; float g_flSmashRange; float g_flSmashRangeChance; @@ -192,7 +220,9 @@ enum struct esSmashSpecial int g_iSmashMessage; int g_iSmashMode; int g_iSmashRangeCooldown; + int g_iSmashRemove; int g_iSmashSight; + int g_iSmashType; } esSmashSpecial g_esSmashSpecial[MT_MAXTYPES + 1]; @@ -202,6 +232,8 @@ enum struct esSmashCache float g_flCloseAreasOnly; float g_flOpenAreasOnly; float g_flSmashChance; + float g_flSmashCountdown; + float g_flSmashDelay; float g_flSmashMeter; float g_flSmashRange; float g_flSmashRangeChance; @@ -221,12 +253,14 @@ enum struct esSmashCache int g_iSmashMessage; int g_iSmashMode; int g_iSmashRangeCooldown; + int g_iSmashRemove; int g_iSmashSight; + int g_iSmashType; } esSmashCache g_esSmashCache[MAXPLAYERS + 1]; -int g_iSmashDeathModelOwner = 0; +int g_iSmashDeathModelOwner = 0, g_iRocketSprite, g_iSmiteSprite = -1; #if !defined MT_ABILITIES_MAIN2 public void OnPluginStart() @@ -269,6 +303,12 @@ public void OnMapStart() PrecacheSound(SOUND_SMASH1, true); } + g_iRocketSprite = PrecacheModel(SPRITE_FIRE, true); + g_iSmiteSprite = PrecacheModel(SPRITE_GLOW, true); + + PrecacheSound(SOUND_FIRE, true); + PrecacheSound(SOUND_LAUNCH, true); + vSmashReset(); } @@ -279,7 +319,7 @@ public void OnClientPutInServer(int client) #endif { SDKHook(client, SDKHook_OnTakeDamage, OnSmashTakeDamage); - vRemoveSmash(client); + vSmashReset3(client); } #if defined MT_ABILITIES_MAIN2 @@ -288,7 +328,7 @@ void vSmashClientDisconnect_Post(int client) public void OnClientDisconnect_Post(int client) #endif { - vRemoveSmash(client); + vSmashReset3(client); } #if defined MT_ABILITIES_MAIN2 @@ -653,14 +693,18 @@ public void MT_OnConfigsLoad(int mode) g_esSmashAbility[iIndex].g_iSmashBody = 1; g_esSmashAbility[iIndex].g_flSmashChance = 33.3; g_esSmashAbility[iIndex].g_iSmashCooldown = 0; + g_esSmashAbility[iIndex].g_flSmashCountdown = 0.0; + g_esSmashAbility[iIndex].g_flSmashDelay = 1.0; g_esSmashAbility[iIndex].g_iSmashHit = 0; g_esSmashAbility[iIndex].g_iSmashHitMode = 0; g_esSmashAbility[iIndex].g_flSmashMeter = 0.0; - g_esSmashAbility[iIndex].g_iSmashMode = 1; + g_esSmashAbility[iIndex].g_iSmashMode = 0; g_esSmashAbility[iIndex].g_flSmashRange = 150.0; g_esSmashAbility[iIndex].g_flSmashRangeChance = 15.0; g_esSmashAbility[iIndex].g_iSmashRangeCooldown = 0; + g_esSmashAbility[iIndex].g_iSmashRemove = 0; g_esSmashAbility[iIndex].g_iSmashSight = 0; + g_esSmashAbility[iIndex].g_iSmashType = 1; g_esSmashSpecial[iIndex].g_flCloseAreasOnly = -1.0; g_esSmashSpecial[iIndex].g_iComboAbility = -1; @@ -676,6 +720,8 @@ public void MT_OnConfigsLoad(int mode) g_esSmashSpecial[iIndex].g_iSmashBody = -1; g_esSmashSpecial[iIndex].g_flSmashChance = -1.0; g_esSmashSpecial[iIndex].g_iSmashCooldown = -1; + g_esSmashSpecial[iIndex].g_flSmashCountdown = 0.0; + g_esSmashSpecial[iIndex].g_flSmashDelay = -1.0; g_esSmashSpecial[iIndex].g_iSmashHit = -1; g_esSmashSpecial[iIndex].g_iSmashHitMode = -1; g_esSmashSpecial[iIndex].g_flSmashMeter = -1.0; @@ -683,7 +729,9 @@ public void MT_OnConfigsLoad(int mode) g_esSmashSpecial[iIndex].g_flSmashRange = -1.0; g_esSmashSpecial[iIndex].g_flSmashRangeChance = -1.0; g_esSmashSpecial[iIndex].g_iSmashRangeCooldown = -1; + g_esSmashSpecial[iIndex].g_iSmashRemove = -1; g_esSmashSpecial[iIndex].g_iSmashSight = -1; + g_esSmashSpecial[iIndex].g_iSmashType = -1; } } case 3: @@ -706,6 +754,8 @@ public void MT_OnConfigsLoad(int mode) g_esSmashPlayer[iPlayer].g_iSmashBody = -1; g_esSmashPlayer[iPlayer].g_flSmashChance = -1.0; g_esSmashPlayer[iPlayer].g_iSmashCooldown = -1; + g_esSmashPlayer[iPlayer].g_flSmashCountdown = 0.0; + g_esSmashPlayer[iPlayer].g_flSmashDelay = -1.0; g_esSmashPlayer[iPlayer].g_iSmashHit = -1; g_esSmashPlayer[iPlayer].g_iSmashHitMode = -1; g_esSmashPlayer[iPlayer].g_flSmashMeter = -1.0; @@ -713,7 +763,9 @@ public void MT_OnConfigsLoad(int mode) g_esSmashPlayer[iPlayer].g_flSmashRange = -1.0; g_esSmashPlayer[iPlayer].g_flSmashRangeChance = -1.0; g_esSmashPlayer[iPlayer].g_iSmashRangeCooldown = -1; + g_esSmashPlayer[iPlayer].g_iSmashRemove = -1; g_esSmashPlayer[iPlayer].g_iSmashSight = -1; + g_esSmashPlayer[iPlayer].g_iSmashType = -1; g_esSmashTeammate[iPlayer].g_flCloseAreasOnly = -1.0; g_esSmashTeammate[iPlayer].g_iComboAbility = -1; @@ -729,6 +781,8 @@ public void MT_OnConfigsLoad(int mode) g_esSmashTeammate[iPlayer].g_iSmashBody = -1; g_esSmashTeammate[iPlayer].g_flSmashChance = -1.0; g_esSmashTeammate[iPlayer].g_iSmashCooldown = -1; + g_esSmashTeammate[iPlayer].g_flSmashCountdown = 0.0; + g_esSmashTeammate[iPlayer].g_flSmashDelay = -1.0; g_esSmashTeammate[iPlayer].g_iSmashHit = -1; g_esSmashTeammate[iPlayer].g_iSmashHitMode = -1; g_esSmashTeammate[iPlayer].g_flSmashMeter = -1.0; @@ -736,7 +790,9 @@ public void MT_OnConfigsLoad(int mode) g_esSmashTeammate[iPlayer].g_flSmashRange = -1.0; g_esSmashTeammate[iPlayer].g_flSmashRangeChance = -1.0; g_esSmashTeammate[iPlayer].g_iSmashRangeCooldown = -1; + g_esSmashTeammate[iPlayer].g_iSmashRemove = -1; g_esSmashTeammate[iPlayer].g_iSmashSight = -1; + g_esSmashTeammate[iPlayer].g_iSmashType = -1; } } } @@ -767,13 +823,17 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esSmashTeammate[admin].g_iSmashBody = iGetKeyValue(subsection, MT_SMASH_SECTION, MT_SMASH_SECTION2, MT_SMASH_SECTION3, MT_SMASH_SECTION4, key, "SmashBody", "Smash Body", "Smash_Body", "body", g_esSmashTeammate[admin].g_iSmashBody, value, -1, 1); g_esSmashTeammate[admin].g_flSmashChance = flGetKeyValue(subsection, MT_SMASH_SECTION, MT_SMASH_SECTION2, MT_SMASH_SECTION3, MT_SMASH_SECTION4, key, "SmashChance", "Smash Chance", "Smash_Chance", "chance", g_esSmashTeammate[admin].g_flSmashChance, value, -1.0, 100.0); g_esSmashTeammate[admin].g_iSmashCooldown = iGetKeyValue(subsection, MT_SMASH_SECTION, MT_SMASH_SECTION2, MT_SMASH_SECTION3, MT_SMASH_SECTION4, key, "SmashCooldown", "Smash Cooldown", "Smash_Cooldown", "cooldown", g_esSmashTeammate[admin].g_iSmashCooldown, value, -1, 99999); + g_esSmashTeammate[admin].g_flSmashCountdown = flGetKeyValue(subsection, MT_SMASH_SECTION, MT_SMASH_SECTION2, MT_SMASH_SECTION3, MT_SMASH_SECTION4, key, "SmashCountdown", "Smash Countdown", "Smash_Countdown", "countdown", g_esSmashTeammate[admin].g_flSmashCountdown, value, -1.0, 99999.0); + g_esSmashTeammate[admin].g_flSmashDelay = flGetKeyValue(subsection, MT_SMASH_SECTION, MT_SMASH_SECTION2, MT_SMASH_SECTION3, MT_SMASH_SECTION4, key, "SmashDelay", "Smash Delay", "Smash_Delay", "delay", g_esSmashTeammate[admin].g_flSmashDelay, value, -1.0, 99999.0); g_esSmashTeammate[admin].g_iSmashHit = iGetKeyValue(subsection, MT_SMASH_SECTION, MT_SMASH_SECTION2, MT_SMASH_SECTION3, MT_SMASH_SECTION4, key, "SmashHit", "Smash Hit", "Smash_Hit", "hit", g_esSmashTeammate[admin].g_iSmashHit, value, -1, 1); g_esSmashTeammate[admin].g_iSmashHitMode = iGetKeyValue(subsection, MT_SMASH_SECTION, MT_SMASH_SECTION2, MT_SMASH_SECTION3, MT_SMASH_SECTION4, key, "SmashHitMode", "Smash Hit Mode", "Smash_Hit_Mode", "hitmode", g_esSmashTeammate[admin].g_iSmashHitMode, value, -1, 2); g_esSmashTeammate[admin].g_flSmashMeter = flGetKeyValue(subsection, MT_SMASH_SECTION, MT_SMASH_SECTION2, MT_SMASH_SECTION3, MT_SMASH_SECTION4, key, "SmashMeter", "Smash Meter", "Smash_Meter", "meter", g_esSmashTeammate[admin].g_flSmashMeter, value, -1.0, 99999.0); - g_esSmashTeammate[admin].g_iSmashMode = iGetKeyValue(subsection, MT_SMASH_SECTION, MT_SMASH_SECTION2, MT_SMASH_SECTION3, MT_SMASH_SECTION4, key, "SmashMode", "Smash Mode", "Smash_Mode", "mode", g_esSmashTeammate[admin].g_iSmashMode, value, -1, 3); + g_esSmashTeammate[admin].g_iSmashMode = iGetKeyValue(subsection, MT_SMASH_SECTION, MT_SMASH_SECTION2, MT_SMASH_SECTION3, MT_SMASH_SECTION4, key, "SmashMode", "Smash Mode", "Smash_Mode", "mode", g_esSmashTeammate[admin].g_iSmashMode, value, -1, 7); g_esSmashTeammate[admin].g_flSmashRange = flGetKeyValue(subsection, MT_SMASH_SECTION, MT_SMASH_SECTION2, MT_SMASH_SECTION3, MT_SMASH_SECTION4, key, "SmashRange", "Smash Range", "Smash_Range", "range", g_esSmashTeammate[admin].g_flSmashRange, value, -1.0, 99999.0); g_esSmashTeammate[admin].g_flSmashRangeChance = flGetKeyValue(subsection, MT_SMASH_SECTION, MT_SMASH_SECTION2, MT_SMASH_SECTION3, MT_SMASH_SECTION4, key, "SmashRangeChance", "Smash Range Chance", "Smash_Range_Chance", "rangechance", g_esSmashTeammate[admin].g_flSmashRangeChance, value, -1.0, 100.0); g_esSmashTeammate[admin].g_iSmashRangeCooldown = iGetKeyValue(subsection, MT_SMASH_SECTION, MT_SMASH_SECTION2, MT_SMASH_SECTION3, MT_SMASH_SECTION4, key, "SmashRangeCooldown", "Smash Range Cooldown", "Smash_Range_Cooldown", "rangecooldown", g_esSmashTeammate[admin].g_iSmashRangeCooldown, value, -1, 99999); + g_esSmashTeammate[admin].g_iSmashRemove = iGetKeyValue(subsection, MT_SMASH_SECTION, MT_SMASH_SECTION2, MT_SMASH_SECTION3, MT_SMASH_SECTION4, key, "SmashRemove", "Smash Remove", "Smash_Remove", "remove", g_esSmashTeammate[admin].g_iSmashRemove, value, -1, 1); + g_esSmashTeammate[admin].g_iSmashType = iGetKeyValue(subsection, MT_SMASH_SECTION, MT_SMASH_SECTION2, MT_SMASH_SECTION3, MT_SMASH_SECTION4, key, "SmashType", "Smash Type", "Smash_Type", "type", g_esSmashTeammate[admin].g_iSmashType, value, -1, 3); } else { @@ -792,13 +852,17 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esSmashPlayer[admin].g_iSmashBody = iGetKeyValue(subsection, MT_SMASH_SECTION, MT_SMASH_SECTION2, MT_SMASH_SECTION3, MT_SMASH_SECTION4, key, "SmashBody", "Smash Body", "Smash_Body", "body", g_esSmashPlayer[admin].g_iSmashBody, value, -1, 1); g_esSmashPlayer[admin].g_flSmashChance = flGetKeyValue(subsection, MT_SMASH_SECTION, MT_SMASH_SECTION2, MT_SMASH_SECTION3, MT_SMASH_SECTION4, key, "SmashChance", "Smash Chance", "Smash_Chance", "chance", g_esSmashPlayer[admin].g_flSmashChance, value, -1.0, 100.0); g_esSmashPlayer[admin].g_iSmashCooldown = iGetKeyValue(subsection, MT_SMASH_SECTION, MT_SMASH_SECTION2, MT_SMASH_SECTION3, MT_SMASH_SECTION4, key, "SmashCooldown", "Smash Cooldown", "Smash_Cooldown", "cooldown", g_esSmashPlayer[admin].g_iSmashCooldown, value, -1, 99999); + g_esSmashPlayer[admin].g_flSmashCountdown = flGetKeyValue(subsection, MT_SMASH_SECTION, MT_SMASH_SECTION2, MT_SMASH_SECTION3, MT_SMASH_SECTION4, key, "SmashCountdown", "Smash Countdown", "Smash_Countdown", "countdown", g_esSmashPlayer[admin].g_flSmashCountdown, value, -1.0, 99999.0); + g_esSmashPlayer[admin].g_flSmashDelay = flGetKeyValue(subsection, MT_SMASH_SECTION, MT_SMASH_SECTION2, MT_SMASH_SECTION3, MT_SMASH_SECTION4, key, "SmashDelay", "Smash Delay", "Smash_Delay", "delay", g_esSmashPlayer[admin].g_flSmashDelay, value, -1.0, 99999.0); g_esSmashPlayer[admin].g_iSmashHit = iGetKeyValue(subsection, MT_SMASH_SECTION, MT_SMASH_SECTION2, MT_SMASH_SECTION3, MT_SMASH_SECTION4, key, "SmashHit", "Smash Hit", "Smash_Hit", "hit", g_esSmashPlayer[admin].g_iSmashHit, value, -1, 1); g_esSmashPlayer[admin].g_iSmashHitMode = iGetKeyValue(subsection, MT_SMASH_SECTION, MT_SMASH_SECTION2, MT_SMASH_SECTION3, MT_SMASH_SECTION4, key, "SmashHitMode", "Smash Hit Mode", "Smash_Hit_Mode", "hitmode", g_esSmashPlayer[admin].g_iSmashHitMode, value, -1, 2); g_esSmashPlayer[admin].g_flSmashMeter = flGetKeyValue(subsection, MT_SMASH_SECTION, MT_SMASH_SECTION2, MT_SMASH_SECTION3, MT_SMASH_SECTION4, key, "SmashMeter", "Smash Meter", "Smash_Meter", "meter", g_esSmashPlayer[admin].g_flSmashMeter, value, -1.0, 99999.0); - g_esSmashPlayer[admin].g_iSmashMode = iGetKeyValue(subsection, MT_SMASH_SECTION, MT_SMASH_SECTION2, MT_SMASH_SECTION3, MT_SMASH_SECTION4, key, "SmashMode", "Smash Mode", "Smash_Mode", "mode", g_esSmashPlayer[admin].g_iSmashMode, value, -1, 3); + g_esSmashPlayer[admin].g_iSmashMode = iGetKeyValue(subsection, MT_SMASH_SECTION, MT_SMASH_SECTION2, MT_SMASH_SECTION3, MT_SMASH_SECTION4, key, "SmashMode", "Smash Mode", "Smash_Mode", "mode", g_esSmashPlayer[admin].g_iSmashMode, value, -1, 7); g_esSmashPlayer[admin].g_flSmashRange = flGetKeyValue(subsection, MT_SMASH_SECTION, MT_SMASH_SECTION2, MT_SMASH_SECTION3, MT_SMASH_SECTION4, key, "SmashRange", "Smash Range", "Smash_Range", "range", g_esSmashPlayer[admin].g_flSmashRange, value, -1.0, 99999.0); g_esSmashPlayer[admin].g_flSmashRangeChance = flGetKeyValue(subsection, MT_SMASH_SECTION, MT_SMASH_SECTION2, MT_SMASH_SECTION3, MT_SMASH_SECTION4, key, "SmashRangeChance", "Smash Range Chance", "Smash_Range_Chance", "rangechance", g_esSmashPlayer[admin].g_flSmashRangeChance, value, -1.0, 100.0); g_esSmashPlayer[admin].g_iSmashRangeCooldown = iGetKeyValue(subsection, MT_SMASH_SECTION, MT_SMASH_SECTION2, MT_SMASH_SECTION3, MT_SMASH_SECTION4, key, "SmashRangeCooldown", "Smash Range Cooldown", "Smash_Range_Cooldown", "rangecooldown", g_esSmashPlayer[admin].g_iSmashRangeCooldown, value, -1, 99999); + g_esSmashPlayer[admin].g_iSmashRemove = iGetKeyValue(subsection, MT_SMASH_SECTION, MT_SMASH_SECTION2, MT_SMASH_SECTION3, MT_SMASH_SECTION4, key, "SmashRemove", "Smash Remove", "Smash_Remove", "remove", g_esSmashPlayer[admin].g_iSmashRemove, value, -1, 1); + g_esSmashPlayer[admin].g_iSmashType = iGetKeyValue(subsection, MT_SMASH_SECTION, MT_SMASH_SECTION2, MT_SMASH_SECTION3, MT_SMASH_SECTION4, key, "SmashType", "Smash Type", "Smash_Type", "type", g_esSmashPlayer[admin].g_iSmashType, value, -1, 3); g_esSmashPlayer[admin].g_iAccessFlags = iGetAdminFlagsValue(subsection, MT_SMASH_SECTION, MT_SMASH_SECTION2, MT_SMASH_SECTION3, MT_SMASH_SECTION4, key, "AccessFlags", "Access Flags", "Access_Flags", "access", value); g_esSmashPlayer[admin].g_iImmunityFlags = iGetAdminFlagsValue(subsection, MT_SMASH_SECTION, MT_SMASH_SECTION2, MT_SMASH_SECTION3, MT_SMASH_SECTION4, key, "ImmunityFlags", "Immunity Flags", "Immunity_Flags", "immunity", value); } @@ -823,13 +887,17 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esSmashSpecial[type].g_iSmashBody = iGetKeyValue(subsection, MT_SMASH_SECTION, MT_SMASH_SECTION2, MT_SMASH_SECTION3, MT_SMASH_SECTION4, key, "SmashBody", "Smash Body", "Smash_Body", "body", g_esSmashSpecial[type].g_iSmashBody, value, -1, 1); g_esSmashSpecial[type].g_flSmashChance = flGetKeyValue(subsection, MT_SMASH_SECTION, MT_SMASH_SECTION2, MT_SMASH_SECTION3, MT_SMASH_SECTION4, key, "SmashChance", "Smash Chance", "Smash_Chance", "chance", g_esSmashSpecial[type].g_flSmashChance, value, -1.0, 100.0); g_esSmashSpecial[type].g_iSmashCooldown = iGetKeyValue(subsection, MT_SMASH_SECTION, MT_SMASH_SECTION2, MT_SMASH_SECTION3, MT_SMASH_SECTION4, key, "SmashCooldown", "Smash Cooldown", "Smash_Cooldown", "cooldown", g_esSmashSpecial[type].g_iSmashCooldown, value, -1, 99999); + g_esSmashSpecial[type].g_flSmashCountdown = flGetKeyValue(subsection, MT_SMASH_SECTION, MT_SMASH_SECTION2, MT_SMASH_SECTION3, MT_SMASH_SECTION4, key, "SmashCountdown", "Smash Countdown", "Smash_Countdown", "countdown", g_esSmashSpecial[type].g_flSmashCountdown, value, -1.0, 99999.0); + g_esSmashSpecial[type].g_flSmashDelay = flGetKeyValue(subsection, MT_SMASH_SECTION, MT_SMASH_SECTION2, MT_SMASH_SECTION3, MT_SMASH_SECTION4, key, "SmashDelay", "Smash Delay", "Smash_Delay", "delay", g_esSmashSpecial[type].g_flSmashDelay, value, -1.0, 99999.0); g_esSmashSpecial[type].g_iSmashHit = iGetKeyValue(subsection, MT_SMASH_SECTION, MT_SMASH_SECTION2, MT_SMASH_SECTION3, MT_SMASH_SECTION4, key, "SmashHit", "Smash Hit", "Smash_Hit", "hit", g_esSmashSpecial[type].g_iSmashHit, value, -1, 1); g_esSmashSpecial[type].g_iSmashHitMode = iGetKeyValue(subsection, MT_SMASH_SECTION, MT_SMASH_SECTION2, MT_SMASH_SECTION3, MT_SMASH_SECTION4, key, "SmashHitMode", "Smash Hit Mode", "Smash_Hit_Mode", "hitmode", g_esSmashSpecial[type].g_iSmashHitMode, value, -1, 2); g_esSmashSpecial[type].g_flSmashMeter = flGetKeyValue(subsection, MT_SMASH_SECTION, MT_SMASH_SECTION2, MT_SMASH_SECTION3, MT_SMASH_SECTION4, key, "SmashMeter", "Smash Meter", "Smash_Meter", "meter", g_esSmashSpecial[type].g_flSmashMeter, value, -1.0, 99999.0); - g_esSmashSpecial[type].g_iSmashMode = iGetKeyValue(subsection, MT_SMASH_SECTION, MT_SMASH_SECTION2, MT_SMASH_SECTION3, MT_SMASH_SECTION4, key, "SmashMode", "Smash Mode", "Smash_Mode", "mode", g_esSmashSpecial[type].g_iSmashMode, value, -1, 3); + g_esSmashSpecial[type].g_iSmashMode = iGetKeyValue(subsection, MT_SMASH_SECTION, MT_SMASH_SECTION2, MT_SMASH_SECTION3, MT_SMASH_SECTION4, key, "SmashMode", "Smash Mode", "Smash_Mode", "mode", g_esSmashSpecial[type].g_iSmashMode, value, -1, 7); g_esSmashSpecial[type].g_flSmashRange = flGetKeyValue(subsection, MT_SMASH_SECTION, MT_SMASH_SECTION2, MT_SMASH_SECTION3, MT_SMASH_SECTION4, key, "SmashRange", "Smash Range", "Smash_Range", "range", g_esSmashSpecial[type].g_flSmashRange, value, -1.0, 99999.0); g_esSmashSpecial[type].g_flSmashRangeChance = flGetKeyValue(subsection, MT_SMASH_SECTION, MT_SMASH_SECTION2, MT_SMASH_SECTION3, MT_SMASH_SECTION4, key, "SmashRangeChance", "Smash Range Chance", "Smash_Range_Chance", "rangechance", g_esSmashSpecial[type].g_flSmashRangeChance, value, -1.0, 100.0); g_esSmashSpecial[type].g_iSmashRangeCooldown = iGetKeyValue(subsection, MT_SMASH_SECTION, MT_SMASH_SECTION2, MT_SMASH_SECTION3, MT_SMASH_SECTION4, key, "SmashRangeCooldown", "Smash Range Cooldown", "Smash_Range_Cooldown", "rangecooldown", g_esSmashSpecial[type].g_iSmashRangeCooldown, value, -1, 99999); + g_esSmashSpecial[type].g_iSmashRemove = iGetKeyValue(subsection, MT_SMASH_SECTION, MT_SMASH_SECTION2, MT_SMASH_SECTION3, MT_SMASH_SECTION4, key, "SmashRemove", "Smash Remove", "Smash_Remove", "remove", g_esSmashSpecial[type].g_iSmashRemove, value, -1, 1); + g_esSmashSpecial[type].g_iSmashType = iGetKeyValue(subsection, MT_SMASH_SECTION, MT_SMASH_SECTION2, MT_SMASH_SECTION3, MT_SMASH_SECTION4, key, "SmashType", "Smash Type", "Smash_Type", "type", g_esSmashSpecial[type].g_iSmashType, value, -1, 3); } else { @@ -848,13 +916,17 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esSmashAbility[type].g_iSmashBody = iGetKeyValue(subsection, MT_SMASH_SECTION, MT_SMASH_SECTION2, MT_SMASH_SECTION3, MT_SMASH_SECTION4, key, "SmashBody", "Smash Body", "Smash_Body", "body", g_esSmashAbility[type].g_iSmashBody, value, -1, 1); g_esSmashAbility[type].g_flSmashChance = flGetKeyValue(subsection, MT_SMASH_SECTION, MT_SMASH_SECTION2, MT_SMASH_SECTION3, MT_SMASH_SECTION4, key, "SmashChance", "Smash Chance", "Smash_Chance", "chance", g_esSmashAbility[type].g_flSmashChance, value, -1.0, 100.0); g_esSmashAbility[type].g_iSmashCooldown = iGetKeyValue(subsection, MT_SMASH_SECTION, MT_SMASH_SECTION2, MT_SMASH_SECTION3, MT_SMASH_SECTION4, key, "SmashCooldown", "Smash Cooldown", "Smash_Cooldown", "cooldown", g_esSmashAbility[type].g_iSmashCooldown, value, -1, 99999); + g_esSmashAbility[type].g_flSmashCountdown = flGetKeyValue(subsection, MT_SMASH_SECTION, MT_SMASH_SECTION2, MT_SMASH_SECTION3, MT_SMASH_SECTION4, key, "SmashCountdown", "Smash Countdown", "Smash_Countdown", "countdown", g_esSmashAbility[type].g_flSmashCountdown, value, -1.0, 99999.0); + g_esSmashAbility[type].g_flSmashDelay = flGetKeyValue(subsection, MT_SMASH_SECTION, MT_SMASH_SECTION2, MT_SMASH_SECTION3, MT_SMASH_SECTION4, key, "SmashDelay", "Smash Delay", "Smash_Delay", "delay", g_esSmashAbility[type].g_flSmashDelay, value, -1.0, 99999.0); g_esSmashAbility[type].g_iSmashHit = iGetKeyValue(subsection, MT_SMASH_SECTION, MT_SMASH_SECTION2, MT_SMASH_SECTION3, MT_SMASH_SECTION4, key, "SmashHit", "Smash Hit", "Smash_Hit", "hit", g_esSmashAbility[type].g_iSmashHit, value, -1, 1); g_esSmashAbility[type].g_iSmashHitMode = iGetKeyValue(subsection, MT_SMASH_SECTION, MT_SMASH_SECTION2, MT_SMASH_SECTION3, MT_SMASH_SECTION4, key, "SmashHitMode", "Smash Hit Mode", "Smash_Hit_Mode", "hitmode", g_esSmashAbility[type].g_iSmashHitMode, value, -1, 2); g_esSmashAbility[type].g_flSmashMeter = flGetKeyValue(subsection, MT_SMASH_SECTION, MT_SMASH_SECTION2, MT_SMASH_SECTION3, MT_SMASH_SECTION4, key, "SmashMeter", "Smash Meter", "Smash_Meter", "meter", g_esSmashAbility[type].g_flSmashMeter, value, -1.0, 99999.0); - g_esSmashAbility[type].g_iSmashMode = iGetKeyValue(subsection, MT_SMASH_SECTION, MT_SMASH_SECTION2, MT_SMASH_SECTION3, MT_SMASH_SECTION4, key, "SmashMode", "Smash Mode", "Smash_Mode", "mode", g_esSmashAbility[type].g_iSmashMode, value, -1, 3); + g_esSmashAbility[type].g_iSmashMode = iGetKeyValue(subsection, MT_SMASH_SECTION, MT_SMASH_SECTION2, MT_SMASH_SECTION3, MT_SMASH_SECTION4, key, "SmashMode", "Smash Mode", "Smash_Mode", "mode", g_esSmashAbility[type].g_iSmashMode, value, -1, 7); g_esSmashAbility[type].g_flSmashRange = flGetKeyValue(subsection, MT_SMASH_SECTION, MT_SMASH_SECTION2, MT_SMASH_SECTION3, MT_SMASH_SECTION4, key, "SmashRange", "Smash Range", "Smash_Range", "range", g_esSmashAbility[type].g_flSmashRange, value, -1.0, 99999.0); g_esSmashAbility[type].g_flSmashRangeChance = flGetKeyValue(subsection, MT_SMASH_SECTION, MT_SMASH_SECTION2, MT_SMASH_SECTION3, MT_SMASH_SECTION4, key, "SmashRangeChance", "Smash Range Chance", "Smash_Range_Chance", "rangechance", g_esSmashAbility[type].g_flSmashRangeChance, value, -1.0, 100.0); g_esSmashAbility[type].g_iSmashRangeCooldown = iGetKeyValue(subsection, MT_SMASH_SECTION, MT_SMASH_SECTION2, MT_SMASH_SECTION3, MT_SMASH_SECTION4, key, "SmashRangeCooldown", "Smash Range Cooldown", "Smash_Range_Cooldown", "rangecooldown", g_esSmashAbility[type].g_iSmashRangeCooldown, value, -1, 99999); + g_esSmashAbility[type].g_iSmashRemove = iGetKeyValue(subsection, MT_SMASH_SECTION, MT_SMASH_SECTION2, MT_SMASH_SECTION3, MT_SMASH_SECTION4, key, "SmashRemove", "Smash Remove", "Smash_Remove", "remove", g_esSmashAbility[type].g_iSmashRemove, value, -1, 1); + g_esSmashAbility[type].g_iSmashType = iGetKeyValue(subsection, MT_SMASH_SECTION, MT_SMASH_SECTION2, MT_SMASH_SECTION3, MT_SMASH_SECTION4, key, "SmashType", "Smash Type", "Smash_Type", "type", g_esSmashAbility[type].g_iSmashType, value, -1, 3); g_esSmashAbility[type].g_iAccessFlags = iGetAdminFlagsValue(subsection, MT_SMASH_SECTION, MT_SMASH_SECTION2, MT_SMASH_SECTION3, MT_SMASH_SECTION4, key, "AccessFlags", "Access Flags", "Access_Flags", "access", value); g_esSmashAbility[type].g_iImmunityFlags = iGetAdminFlagsValue(subsection, MT_SMASH_SECTION, MT_SMASH_SECTION2, MT_SMASH_SECTION3, MT_SMASH_SECTION4, key, "ImmunityFlags", "Immunity Flags", "Immunity_Flags", "immunity", value); } @@ -871,12 +943,16 @@ public void MT_OnSettingsCached(int tank, bool apply, int type) g_esSmashPlayer[tank].g_iTankTypeRecorded = apply ? MT_GetRecordedTankType(tank, type) : 0; g_esSmashPlayer[tank].g_iTankType = apply ? type : 0; int iType = g_esSmashPlayer[tank].g_iTankTypeRecorded; - +#if !defined MT_ABILITIES_MAIN2 + g_iGraphicsLevel = MT_GetGraphicsLevel(); +#endif if (bIsSpecialInfected(tank, MT_CHECK_INDEX|MT_CHECK_INGAME)) { g_esSmashCache[tank].g_flCloseAreasOnly = flGetSubSettingValue(apply, bHuman, g_esSmashTeammate[tank].g_flCloseAreasOnly, g_esSmashPlayer[tank].g_flCloseAreasOnly, g_esSmashSpecial[iType].g_flCloseAreasOnly, g_esSmashAbility[iType].g_flCloseAreasOnly, 1); g_esSmashCache[tank].g_iComboAbility = iGetSubSettingValue(apply, bHuman, g_esSmashTeammate[tank].g_iComboAbility, g_esSmashPlayer[tank].g_iComboAbility, g_esSmashSpecial[iType].g_iComboAbility, g_esSmashAbility[iType].g_iComboAbility, 1); g_esSmashCache[tank].g_flSmashChance = flGetSubSettingValue(apply, bHuman, g_esSmashTeammate[tank].g_flSmashChance, g_esSmashPlayer[tank].g_flSmashChance, g_esSmashSpecial[iType].g_flSmashChance, g_esSmashAbility[iType].g_flSmashChance, 1); + g_esSmashCache[tank].g_flSmashCountdown = flGetSubSettingValue(apply, bHuman, g_esSmashTeammate[tank].g_flSmashCountdown, g_esSmashPlayer[tank].g_flSmashCountdown, g_esSmashSpecial[iType].g_flSmashCountdown, g_esSmashAbility[iType].g_flSmashCountdown, 1); + g_esSmashCache[tank].g_flSmashDelay = flGetSubSettingValue(apply, bHuman, g_esSmashTeammate[tank].g_flSmashDelay, g_esSmashPlayer[tank].g_flSmashDelay, g_esSmashSpecial[iType].g_flSmashDelay, g_esSmashAbility[iType].g_flSmashDelay, 1); g_esSmashCache[tank].g_flSmashMeter = flGetSubSettingValue(apply, bHuman, g_esSmashTeammate[tank].g_flSmashMeter, g_esSmashPlayer[tank].g_flSmashMeter, g_esSmashSpecial[iType].g_flSmashMeter, g_esSmashAbility[iType].g_flSmashMeter, 1); g_esSmashCache[tank].g_flSmashRange = flGetSubSettingValue(apply, bHuman, g_esSmashTeammate[tank].g_flSmashRange, g_esSmashPlayer[tank].g_flSmashRange, g_esSmashSpecial[iType].g_flSmashRange, g_esSmashAbility[iType].g_flSmashRange, 1); g_esSmashCache[tank].g_flSmashRangeChance = flGetSubSettingValue(apply, bHuman, g_esSmashTeammate[tank].g_flSmashRangeChance, g_esSmashPlayer[tank].g_flSmashRangeChance, g_esSmashSpecial[iType].g_flSmashRangeChance, g_esSmashAbility[iType].g_flSmashRangeChance, 1); @@ -895,13 +971,17 @@ public void MT_OnSettingsCached(int tank, bool apply, int type) g_esSmashCache[tank].g_iSmashMessage = iGetSubSettingValue(apply, bHuman, g_esSmashTeammate[tank].g_iSmashMessage, g_esSmashPlayer[tank].g_iSmashMessage, g_esSmashSpecial[iType].g_iSmashMessage, g_esSmashAbility[iType].g_iSmashMessage, 1); g_esSmashCache[tank].g_iSmashMode = iGetSubSettingValue(apply, bHuman, g_esSmashTeammate[tank].g_iSmashMode, g_esSmashPlayer[tank].g_iSmashMode, g_esSmashSpecial[iType].g_iSmashMode, g_esSmashAbility[iType].g_iSmashMode, 1); g_esSmashCache[tank].g_iSmashRangeCooldown = iGetSubSettingValue(apply, bHuman, g_esSmashTeammate[tank].g_iSmashRangeCooldown, g_esSmashPlayer[tank].g_iSmashRangeCooldown, g_esSmashSpecial[iType].g_iSmashRangeCooldown, g_esSmashAbility[iType].g_iSmashRangeCooldown, 1); + g_esSmashCache[tank].g_iSmashRemove = iGetSubSettingValue(apply, bHuman, g_esSmashTeammate[tank].g_iSmashRemove, g_esSmashPlayer[tank].g_iSmashRemove, g_esSmashSpecial[iType].g_iSmashRemove, g_esSmashAbility[iType].g_iSmashRemove, 1); g_esSmashCache[tank].g_iSmashSight = iGetSubSettingValue(apply, bHuman, g_esSmashTeammate[tank].g_iSmashSight, g_esSmashPlayer[tank].g_iSmashSight, g_esSmashSpecial[iType].g_iSmashSight, g_esSmashAbility[iType].g_iSmashSight, 1); + g_esSmashCache[tank].g_iSmashType = iGetSubSettingValue(apply, bHuman, g_esSmashTeammate[tank].g_iSmashType, g_esSmashPlayer[tank].g_iSmashType, g_esSmashSpecial[iType].g_iSmashType, g_esSmashAbility[iType].g_iSmashType, 1); } else { g_esSmashCache[tank].g_flCloseAreasOnly = flGetSettingValue(apply, bHuman, g_esSmashPlayer[tank].g_flCloseAreasOnly, g_esSmashAbility[iType].g_flCloseAreasOnly, 1); g_esSmashCache[tank].g_iComboAbility = iGetSettingValue(apply, bHuman, g_esSmashPlayer[tank].g_iComboAbility, g_esSmashAbility[iType].g_iComboAbility, 1); g_esSmashCache[tank].g_flSmashChance = flGetSettingValue(apply, bHuman, g_esSmashPlayer[tank].g_flSmashChance, g_esSmashAbility[iType].g_flSmashChance, 1); + g_esSmashCache[tank].g_flSmashCountdown = flGetSettingValue(apply, bHuman, g_esSmashPlayer[tank].g_flSmashCountdown, g_esSmashAbility[iType].g_flSmashCountdown, 1); + g_esSmashCache[tank].g_flSmashDelay = flGetSettingValue(apply, bHuman, g_esSmashPlayer[tank].g_flSmashDelay, g_esSmashAbility[iType].g_flSmashDelay, 1); g_esSmashCache[tank].g_flSmashMeter = flGetSettingValue(apply, bHuman, g_esSmashPlayer[tank].g_flSmashMeter, g_esSmashAbility[iType].g_flSmashMeter, 1); g_esSmashCache[tank].g_flSmashRange = flGetSettingValue(apply, bHuman, g_esSmashPlayer[tank].g_flSmashRange, g_esSmashAbility[iType].g_flSmashRange, 1); g_esSmashCache[tank].g_flSmashRangeChance = flGetSettingValue(apply, bHuman, g_esSmashPlayer[tank].g_flSmashRangeChance, g_esSmashAbility[iType].g_flSmashRangeChance, 1); @@ -920,7 +1000,9 @@ public void MT_OnSettingsCached(int tank, bool apply, int type) g_esSmashCache[tank].g_iSmashMessage = iGetSettingValue(apply, bHuman, g_esSmashPlayer[tank].g_iSmashMessage, g_esSmashAbility[iType].g_iSmashMessage, 1); g_esSmashCache[tank].g_iSmashMode = iGetSettingValue(apply, bHuman, g_esSmashPlayer[tank].g_iSmashMode, g_esSmashAbility[iType].g_iSmashMode, 1); g_esSmashCache[tank].g_iSmashRangeCooldown = iGetSettingValue(apply, bHuman, g_esSmashPlayer[tank].g_iSmashRangeCooldown, g_esSmashAbility[iType].g_iSmashRangeCooldown, 1); + g_esSmashCache[tank].g_iSmashRemove = iGetSettingValue(apply, bHuman, g_esSmashPlayer[tank].g_iSmashRemove, g_esSmashAbility[iType].g_iSmashRemove, 1); g_esSmashCache[tank].g_iSmashSight = iGetSettingValue(apply, bHuman, g_esSmashPlayer[tank].g_iSmashSight, g_esSmashAbility[iType].g_iSmashSight, 1); + g_esSmashCache[tank].g_iSmashType = iGetSettingValue(apply, bHuman, g_esSmashPlayer[tank].g_iSmashType, g_esSmashAbility[iType].g_iSmashType, 1); } } @@ -945,6 +1027,21 @@ public void MT_OnPluginUpdate() } #endif +#if defined MT_ABILITIES_MAIN2 +void vSmashPluginEnd() +#else +public void MT_OnPluginEnd() +#endif +{ + for (int iSurvivor = 1; iSurvivor <= MaxClients; iSurvivor++) + { + if (bIsSurvivor(iSurvivor, MT_CHECK_INGAME|MT_CHECK_ALIVE) && g_esSmashPlayer[iSurvivor].g_bAffected) + { + SetEntityGravity(iSurvivor, 1.0); + } + } +} + #if defined MT_ABILITIES_MAIN2 void vSmashEventFired(Event event, const char[] name) #else @@ -1064,28 +1161,94 @@ public void MT_OnChangeType(int tank, int oldType, int newType, bool revert) vRemoveSmash(tank); } -void vSmash(int survivor, int tank) +void vSmash(int tank, int survivor) { - if (bIsAreaNarrow(tank, g_esSmashCache[tank].g_flOpenAreasOnly) || bIsAreaWide(tank, g_esSmashCache[tank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esSmashPlayer[tank].g_iTankType, tank) || (g_esSmashCache[tank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esSmashCache[tank].g_iRequiresHumans) || (!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esSmashAbility[g_esSmashPlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esSmashPlayer[tank].g_iAccessFlags)) || MT_IsAdminImmune(survivor, tank) || bIsAdminImmune(survivor, g_esSmashPlayer[tank].g_iTankType, g_esSmashAbility[g_esSmashPlayer[tank].g_iTankTypeRecorded].g_iImmunityFlags, g_esSmashPlayer[survivor].g_iImmunityFlags)) - { - return; - } - - switch (g_bSecondGame) + switch (g_esSmashCache[tank].g_iSmashType) { - case true: + case 0, 3: { - EmitSoundToAll(SOUND_SMASH2, survivor); - EmitSoundToAll(SOUND_GROWL2, tank); + switch (MT_GetRandomInt(1, 2)) + { + case 1: + { + SetEntProp(survivor, Prop_Send, "m_isIncapacitated", 1); + SetEntPropFloat(survivor, Prop_Send, "m_healthBuffer", 1.0); + vDamagePlayer(survivor, tank, float(GetEntProp(survivor, Prop_Data, "m_iHealth")), "128"); + } + case 2: vDamagePlayer(survivor, tank, float(GetEntProp(survivor, Prop_Data, "m_iHealth")), "128"); + } } - case false: + case 1: { - EmitSoundToAll(SOUND_SMASH1, survivor); - EmitSoundToAll(SOUND_GROWL1, tank); + SetEntProp(survivor, Prop_Send, "m_isIncapacitated", 1); + SetEntPropFloat(survivor, Prop_Send, "m_healthBuffer", 1.0); + vDamagePlayer(survivor, tank, float(GetEntProp(survivor, Prop_Data, "m_iHealth")), "128"); } + case 2: vDamagePlayer(survivor, tank, float(GetEntProp(survivor, Prop_Data, "m_iHealth")), "128"); } +} - vAttachParticle(survivor, PARTICLE_BLOOD, 0.1); +void vSmashRocket(int tank, int survivor, int enabled, int messages, int pos = -1) +{ + float flDelay = (pos != -1) ? 0.1 : g_esSmashCache[tank].g_flSmashDelay; + if (flDelay > 0.0) + { + DataPack dpSmashLaunch; + CreateDataTimer(flDelay, tTimerSmashLaunch, dpSmashLaunch, TIMER_FLAG_NO_MAPCHANGE); + dpSmashLaunch.WriteCell(GetClientUserId(survivor)); + dpSmashLaunch.WriteCell(GetClientUserId(tank)); + dpSmashLaunch.WriteCell(g_esSmashPlayer[tank].g_iTankType); + dpSmashLaunch.WriteCell(enabled); + + DataPack dpSmashDetonate; + CreateDataTimer((flDelay + 1.5), tTimerSmashDetonate, dpSmashDetonate, TIMER_FLAG_NO_MAPCHANGE); + dpSmashDetonate.WriteCell(GetClientUserId(survivor)); + dpSmashDetonate.WriteCell(GetClientUserId(tank)); + dpSmashDetonate.WriteCell(g_esSmashPlayer[tank].g_iTankType); + dpSmashDetonate.WriteCell(enabled); + dpSmashDetonate.WriteCell(messages); + } +} + +void vSmashSmite(int tank, int survivor, int messages, int flags) +{ + vSmashSmite2(survivor); + vScreenEffect(survivor, tank, g_esSmashCache[tank].g_iSmashEffect, flags); + vSmash(tank, survivor); + + if (g_esSmashCache[tank].g_iSmashMessage & messages) + { + char sTankName[64]; + MT_GetTankName(tank, sTankName); + MT_PrintToChatAll("%s %t", MT_TAG2, "Smash4", sTankName, survivor); + MT_LogMessage(MT_LOG_ABILITY, "%s %T", MT_TAG, "Smash4", LANG_SERVER, sTankName, survivor); + } +} + +void vSmashSmite2(int survivor) +{ + float flPos[3], flStartPos[3]; + int iColor[4] = {255, 255, 255, 255}; + + GetClientAbsOrigin(survivor, flPos); + flPos[2] -= 26.0; + flStartPos[0] = (flPos[0] + MT_GetRandomFloat(-500.0, 500.0)); + flStartPos[1] = (flPos[1] + MT_GetRandomFloat(-500.0, 500.0)); + flStartPos[2] = (flPos[2] + 800.0); + + if (g_iGraphicsLevel > 2) + { + TE_SetupBeamPoints(flStartPos, flPos, g_iSmiteSprite, 0, 0, 0, 0.2, 20.0, 10.0, 0, 1.0, iColor, 3); + TE_SendToAll(); + + TE_SetupSparks(flPos, view_as({0.0, 0.0, 0.0}), 5000, 1000); + TE_SendToAll(); + + TE_SetupEnergySplash(flPos, view_as({0.0, 0.0, 0.0}), false); + TE_SendToAll(); + } + + EmitAmbientSound(SOUND_EXPLOSION, flStartPos, survivor, SNDLEVEL_RAIDSIREN); } void vSmashAbility(int tank, float random, int pos = -1) @@ -1188,39 +1351,126 @@ void vSmashHit(int survivor, int tank, float random, float chance, int enabled, } } - vSmash(survivor, tank); - vScreenEffect(survivor, tank, g_esSmashCache[tank].g_iSmashEffect, flags); + if (g_esSmashCache[tank].g_iSmashMode & MT_SMASH_POUND) + { + if (g_iGraphicsLevel > 2) + { + vAttachParticle(survivor, PARTICLE_BLOOD, 0.1); + vAttachParticle(tank, PARTICLE_BLOOD, 0.1); + } + + switch (g_bSecondGame) + { + case true: + { + EmitSoundToAll(SOUND_SMASH2, survivor); + EmitSoundToAll(SOUND_GROWL2, tank); + } + case false: + { + EmitSoundToAll(SOUND_SMASH1, survivor); + EmitSoundToAll(SOUND_GROWL1, tank); + } + } - switch (g_esSmashCache[tank].g_iSmashMode) + vSmash(tank, survivor); + } + + if (g_esSmashCache[tank].g_iSmashMode & MT_SMASH_ROCKET) { - case 0, 3: + int iFlame = CreateEntityByName("env_steam"); + if (bIsValidEntity(iFlame)) { - switch (MT_GetRandomInt(1, 2)) + float flPos[3], flAngles[3]; + GetEntPropVector(survivor, Prop_Data, "m_vecOrigin", flPos); + flPos[2] += 30.0; + flAngles[0] = 90.0; + flAngles[1] = 0.0; + flAngles[2] = 0.0; + + DispatchKeyValueInt(iFlame, "spawnflags", 1); + DispatchKeyValueInt(iFlame, "Type", 0); + DispatchKeyValueInt(iFlame, "InitialState", 1); + DispatchKeyValueInt(iFlame, "Spreadspeed", 10); + DispatchKeyValueInt(iFlame, "Speed", 800); + DispatchKeyValueInt(iFlame, "Startsize", 10); + DispatchKeyValueInt(iFlame, "EndSize", 250); + DispatchKeyValueInt(iFlame, "Rate", 15); + DispatchKeyValueInt(iFlame, "JetLength", 400); + + SetEntityRenderColor(iFlame, 180, 70, 10, 180); + TeleportEntity(iFlame, flPos, flAngles); + DispatchSpawn(iFlame); + vSetEntityParent(iFlame, survivor); + + iFlame = EntIndexToEntRef(iFlame); + vDeleteEntity(iFlame, (3.0 + g_esSmashCache[tank].g_flSmashCountdown)); + + vScreenEffect(survivor, tank, g_esSmashCache[tank].g_iSmashEffect, flags); + EmitSoundToAll(SOUND_FIRE, survivor); + + switch (g_esSmashCache[tank].g_flSmashCountdown > 0.0) { - case 1: + case true: { - SetEntProp(survivor, Prop_Send, "m_isIncapacitated", 1); - SetEntPropFloat(survivor, Prop_Send, "m_healthBuffer", 1.0); - vDamagePlayer(survivor, tank, float(GetEntProp(survivor, Prop_Data, "m_iHealth")), "128"); + DataPack dpSmash; + CreateDataTimer(g_esSmashCache[tank].g_flSmashCountdown, tTimerSmash, dpSmash, TIMER_FLAG_NO_MAPCHANGE); + dpSmash.WriteCell(GetClientUserId(survivor)); + dpSmash.WriteCell(GetClientUserId(tank)); + dpSmash.WriteCell(enabled); + dpSmash.WriteCell(messages); + dpSmash.WriteCell(pos); } - case 2: vDamagePlayer(survivor, tank, float(GetEntProp(survivor, Prop_Data, "m_iHealth")), "128"); + case false: vSmashRocket(tank, survivor, enabled, messages, pos); } } - case 1: + } + + if (g_esSmashCache[tank].g_iSmashMode & MT_SMASH_SMITE) + { + if (g_esSmashCache[tank].g_flSmashCountdown > 0.0) { - SetEntProp(survivor, Prop_Send, "m_isIncapacitated", 1); - SetEntPropFloat(survivor, Prop_Send, "m_healthBuffer", 1.0); - vDamagePlayer(survivor, tank, float(GetEntProp(survivor, Prop_Data, "m_iHealth")), "128"); + g_esSmashPlayer[survivor].g_bAffected = true; + g_esSmashPlayer[survivor].g_iOwner = tank; + + DataPack dpSmash; + CreateDataTimer(g_esSmashCache[tank].g_flSmashCountdown, tTimerSmash2, dpSmash, TIMER_FLAG_NO_MAPCHANGE); + dpSmash.WriteCell(GetClientUserId(survivor)); + dpSmash.WriteCell(GetClientUserId(tank)); + dpSmash.WriteCell(messages); + dpSmash.WriteCell(flags); + } + else + { + vSmashSmite(tank, survivor, messages, flags); } - case 2: vDamagePlayer(survivor, tank, float(GetEntProp(survivor, Prop_Data, "m_iHealth")), "128"); } + if (g_esSmashCache[tank].g_iSmashRemove == 1) + { + SDKHooks_TakeDamage(tank, survivor, survivor, float(GetEntProp(tank, Prop_Data, "m_iHealth")), DMG_CLUB); + } + + vScreenEffect(survivor, tank, g_esSmashCache[tank].g_iSmashEffect, flags); + if (g_esSmashCache[tank].g_iSmashMessage & messages) { char sTankName[64]; MT_GetTankName(tank, sTankName); - MT_PrintToChatAll("%s %t", MT_TAG2, "Smash", sTankName, survivor); - MT_LogMessage(MT_LOG_ABILITY, "%s %T", MT_TAG, "Smash", LANG_SERVER, sTankName, survivor); + + switch (!!g_esSmashCache[tank].g_iSmashRemove) + { + case true: + { + MT_PrintToChatAll("%s %t", MT_TAG2, "Smash2", sTankName, survivor); + MT_LogMessage(MT_LOG_ABILITY, "%s %T", MT_TAG, "Smash2", LANG_SERVER, sTankName, survivor); + } + case false: + { + MT_PrintToChatAll("%s %t", MT_TAG2, "Smash", sTankName, survivor); + MT_LogMessage(MT_LOG_ABILITY, "%s %T", MT_TAG, "Smash", LANG_SERVER, sTankName, survivor); + } + } } } } @@ -1253,6 +1503,42 @@ void vSmashCopyStats2(int oldTank, int newTank) void vRemoveSmash(int tank) { + for (int iSurvivor = 1; iSurvivor <= MaxClients; iSurvivor++) + { + if (bIsSurvivor(iSurvivor, MT_CHECK_INGAME) && g_esSmashPlayer[iSurvivor].g_bAffected && g_esSmashPlayer[iSurvivor].g_iOwner == tank) + { + g_esSmashPlayer[iSurvivor].g_bAffected = false; + g_esSmashPlayer[iSurvivor].g_iOwner = -1; + } + } + + vSmashReset3(tank); +} + +void vSmashReset() +{ + for (int iPlayer = 1; iPlayer <= MaxClients; iPlayer++) + { + if (bIsValidClient(iPlayer, MT_CHECK_INGAME)) + { + vSmashReset3(iPlayer); + + g_esSmashPlayer[iPlayer].g_iOwner = -1; + } + } +} + +void vSmashReset2(int survivor) +{ + g_esSmashPlayer[survivor].g_bAffected = false; + g_esSmashPlayer[survivor].g_iOwner = -1; + + SetEntityGravity(survivor, 1.0); +} + +void vSmashReset3(int tank) +{ + g_esSmashPlayer[tank].g_bAffected = false; g_esSmashPlayer[tank].g_bFailed = false; g_esSmashPlayer[tank].g_bNoAmmo = false; g_esSmashPlayer[tank].g_flDamage = 0.0; @@ -1261,46 +1547,95 @@ void vRemoveSmash(int tank) g_esSmashPlayer[tank].g_iRangeCooldown = -1; } -void vSmashReset() +Action tTimerSmash(Handle timer, DataPack pack) { - for (int iPlayer = 1; iPlayer <= MaxClients; iPlayer++) + pack.Reset(); + + int iSurvivor = GetClientOfUserId(pack.ReadCell()); + if (!MT_IsCorePluginEnabled() || !bIsSurvivor(iSurvivor)) { - if (bIsValidClient(iPlayer, MT_CHECK_INGAME)) - { - vRemoveSmash(iPlayer); - } + g_esSmashPlayer[iSurvivor].g_bAffected = false; + g_esSmashPlayer[iSurvivor].g_iOwner = -1; + + return Plugin_Stop; + } + + int iTank = GetClientOfUserId(pack.ReadCell()), iSmashEnabled = pack.ReadCell(); + if (!MT_IsTankSupported(iTank) || bIsAreaNarrow(iTank, g_esSmashCache[iTank].g_flOpenAreasOnly) || bIsAreaWide(iTank, g_esSmashCache[iTank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esSmashPlayer[iTank].g_iTankType, iTank) || (g_esSmashCache[iTank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esSmashCache[iTank].g_iRequiresHumans) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esSmashAbility[g_esSmashPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esSmashPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esSmashPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || MT_IsAdminImmune(iSurvivor, iTank) || bIsAdminImmune(iSurvivor, g_esSmashPlayer[iTank].g_iTankType, g_esSmashAbility[g_esSmashPlayer[iTank].g_iTankTypeRecorded].g_iImmunityFlags, g_esSmashPlayer[iSurvivor].g_iImmunityFlags) || iSmashEnabled == 0 || !g_esSmashPlayer[iSurvivor].g_bAffected || MT_DoesSurvivorHaveRewardType(iSurvivor, MT_REWARD_GODMODE)) + { + vSmashReset2(iSurvivor); + + return Plugin_Stop; } + + int iMessage = pack.ReadCell(), iPos = pack.ReadCell(); + vSmashRocket(iTank, iSurvivor, iSmashEnabled, iMessage, iPos); + + return Plugin_Continue; } -void tTimerSmashCombo(Handle timer, DataPack pack) +Action tTimerSmash2(Handle timer, DataPack pack) +{ + pack.Reset(); + + int iSurvivor = GetClientOfUserId(pack.ReadCell()); + if (!MT_IsCorePluginEnabled() || !bIsSurvivor(iSurvivor)) + { + g_esSmashPlayer[iSurvivor].g_bAffected = false; + g_esSmashPlayer[iSurvivor].g_iOwner = -1; + + return Plugin_Stop; + } + + int iTank = GetClientOfUserId(pack.ReadCell()); + if (!MT_IsTankSupported(iTank) || !MT_IsCustomTankSupported(iTank)) + { + g_esSmashPlayer[iSurvivor].g_bAffected = false; + g_esSmashPlayer[iSurvivor].g_iOwner = -1; + + return Plugin_Stop; + } + + int iMessage = pack.ReadCell(), iFlags = pack.ReadCell(); + g_esSmashPlayer[iSurvivor].g_bAffected = false; + g_esSmashPlayer[iSurvivor].g_iOwner = -1; + + vSmashSmite(iTank, iSurvivor, iMessage, iFlags); + + return Plugin_Continue; +} + +Action tTimerSmashCombo(Handle timer, DataPack pack) { pack.Reset(); int iTank = GetClientOfUserId(pack.ReadCell()); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esSmashAbility[g_esSmashPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esSmashPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esSmashPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esSmashCache[iTank].g_iSmashAbility == 0) { - return; + return Plugin_Stop; } float flRandom = pack.ReadFloat(); int iPos = pack.ReadCell(); vSmashAbility(iTank, flRandom, iPos); + + return Plugin_Continue; } -void tTimerSmashCombo2(Handle timer, DataPack pack) +Action tTimerSmashCombo2(Handle timer, DataPack pack) { pack.Reset(); int iSurvivor = GetClientOfUserId(pack.ReadCell()); if (!bIsSurvivor(iSurvivor)) { - return; + return Plugin_Stop; } int iTank = GetClientOfUserId(pack.ReadCell()); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esSmashAbility[g_esSmashPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esSmashPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esSmashPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esSmashCache[iTank].g_iSmashHit == 0) { - return; + return Plugin_Stop; } float flRandom = pack.ReadFloat(), flChance = pack.ReadFloat(); @@ -1315,4 +1650,92 @@ void tTimerSmashCombo2(Handle timer, DataPack pack) { vSmashHit(iSurvivor, iTank, flRandom, flChance, g_esSmashCache[iTank].g_iSmashHit, MT_MESSAGE_MELEE, MT_ATTACK_MELEE, iPos); } + + return Plugin_Continue; +} + +Action tTimerSmashLaunch(Handle timer, DataPack pack) +{ + pack.Reset(); + + int iSurvivor = GetClientOfUserId(pack.ReadCell()); + if (!MT_IsCorePluginEnabled() || !bIsSurvivor(iSurvivor)) + { + g_esSmashPlayer[iSurvivor].g_bAffected = false; + g_esSmashPlayer[iSurvivor].g_iOwner = -1; + + return Plugin_Stop; + } + + int iTank = GetClientOfUserId(pack.ReadCell()), iType = pack.ReadCell(), iSmashEnabled = pack.ReadCell(); + if (!MT_IsTankSupported(iTank) || bIsAreaNarrow(iTank, g_esSmashCache[iTank].g_flOpenAreasOnly) || bIsAreaWide(iTank, g_esSmashCache[iTank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esSmashPlayer[iTank].g_iTankType, iTank) || (g_esSmashCache[iTank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esSmashCache[iTank].g_iRequiresHumans) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esSmashAbility[g_esSmashPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esSmashPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esSmashPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || iType != g_esSmashPlayer[iTank].g_iTankType || MT_IsAdminImmune(iSurvivor, iTank) || bIsAdminImmune(iSurvivor, g_esSmashPlayer[iTank].g_iTankType, g_esSmashAbility[g_esSmashPlayer[iTank].g_iTankTypeRecorded].g_iImmunityFlags, g_esSmashPlayer[iSurvivor].g_iImmunityFlags) || iSmashEnabled == 0 || !g_esSmashPlayer[iSurvivor].g_bAffected || MT_DoesSurvivorHaveRewardType(iSurvivor, MT_REWARD_GODMODE)) + { + vSmashReset2(iSurvivor); + + return Plugin_Stop; + } + + float flVelocity[3]; + flVelocity[0] = 0.0; + flVelocity[1] = 0.0; + flVelocity[2] = 800.0; + + EmitSoundToAll(SOUND_EXPLOSION, iSurvivor); + EmitSoundToAll(SOUND_LAUNCH, iSurvivor); + + TeleportEntity(iSurvivor, .velocity = flVelocity); + SetEntityGravity(iSurvivor, 0.1); + + return Plugin_Continue; +} + +Action tTimerSmashDetonate(Handle timer, DataPack pack) +{ + pack.Reset(); + + int iSurvivor = GetClientOfUserId(pack.ReadCell()); + if (!MT_IsCorePluginEnabled() || !bIsSurvivor(iSurvivor)) + { + g_esSmashPlayer[iSurvivor].g_bAffected = false; + g_esSmashPlayer[iSurvivor].g_iOwner = -1; + + return Plugin_Stop; + } + + int iTank = GetClientOfUserId(pack.ReadCell()), iType = pack.ReadCell(), iSmashEnabled = pack.ReadCell(); + if (!MT_IsTankSupported(iTank) || bIsAreaNarrow(iTank, g_esSmashCache[iTank].g_flOpenAreasOnly) || bIsAreaWide(iTank, g_esSmashCache[iTank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esSmashPlayer[iTank].g_iTankType, iTank) || (g_esSmashCache[iTank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esSmashCache[iTank].g_iRequiresHumans) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esSmashAbility[g_esSmashPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esSmashPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esSmashPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || iType != g_esSmashPlayer[iTank].g_iTankType || MT_IsAdminImmune(iSurvivor, iTank) || bIsAdminImmune(iSurvivor, g_esSmashPlayer[iTank].g_iTankType, g_esSmashAbility[g_esSmashPlayer[iTank].g_iTankTypeRecorded].g_iImmunityFlags, g_esSmashPlayer[iSurvivor].g_iImmunityFlags) || iSmashEnabled == 0 || !g_esSmashPlayer[iSurvivor].g_bAffected || MT_DoesSurvivorHaveRewardType(iSurvivor, MT_REWARD_GODMODE)) + { + vSmashReset2(iSurvivor); + + return Plugin_Stop; + } + + g_esSmashPlayer[iSurvivor].g_bAffected = false; + g_esSmashPlayer[iSurvivor].g_iOwner = -1; + + SetEntityGravity(iSurvivor, 1.0); + + if (g_iGraphicsLevel > 2) + { + float flPos[3]; + GetClientAbsOrigin(iSurvivor, flPos); + TE_SetupExplosion(flPos, g_iRocketSprite, 10.0, 1, 0, 600, 5000); + TE_SendToAll(); + } + + if (g_esSmashCache[iTank].g_flSmashCountdown <= 0.0 || !bIsAreaNarrow(iSurvivor)) + { + vSmash(iTank, iSurvivor); + + int iMessage = pack.ReadCell(); + if (g_esSmashCache[iTank].g_iSmashMessage & iMessage) + { + char sTankName[64]; + MT_GetTankName(iTank, sTankName); + MT_PrintToChatAll("%s %t", MT_TAG2, "Smash3", sTankName, iSurvivor); + MT_LogMessage(MT_LOG_ABILITY, "%s %T", MT_TAG, "Smash3", LANG_SERVER, sTankName, iSurvivor); + } + } + + return Plugin_Continue; } \ No newline at end of file diff --git a/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_smite.sp b/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_smite.sp deleted file mode 100644 index af550ba0fd..0000000000 --- a/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_smite.sp +++ /dev/null @@ -1,1363 +0,0 @@ -/** - * Mutant Tanks: a L4D/L4D2 SourceMod Plugin - * Copyright (C) 2024 Alfred "Psyk0tik" Llagas - * - * 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 . - **/ - -#define MT_SMITE_COMPILE_METHOD 0 // 0: packaged, 1: standalone - -#if !defined MT_ABILITIES_MAIN2 - #if MT_SMITE_COMPILE_METHOD == 1 - #include - #include - #else - #error This file must be inside "scripting/mutant_tanks/abilities2" while compiling "mt_abilities2.sp" to include its content. - #endif -public Plugin myinfo = -{ - name = "[MT] Smite Ability", - author = MT_AUTHOR, - description = "The Mutant Tank smites survivors.", - version = MT_VERSION, - url = MT_URL -}; - -bool g_bDedicated, g_bLateLoad; - -public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max) -{ - EngineVersion evEngine = GetEngineVersion(); - if (evEngine != Engine_Left4Dead && evEngine != Engine_Left4Dead2) - { - strcopy(error, err_max, "\"[MT] Smite Ability\" only supports Left 4 Dead 1 & 2."); - - return APLRes_SilentFailure; - } - - g_bDedicated = IsDedicatedServer(); - g_bLateLoad = late; - - return APLRes_Success; -} - -#define SOUND_EXPLOSION "ambient/explosions/explode_2.wav" - -#define SPRITE_GLOW "sprites/glow01.vmt" -#else - #if MT_SMITE_COMPILE_METHOD == 1 - #error This file must be compiled as a standalone plugin. - #endif -#endif - -#define MT_SMITE_SECTION "smiteability" -#define MT_SMITE_SECTION2 "smite ability" -#define MT_SMITE_SECTION3 "smite_ability" -#define MT_SMITE_SECTION4 "smite" - -#define MT_MENU_SMITE "Smite Ability" - -enum struct esSmitePlayer -{ - bool g_bAffected; - bool g_bFailed; - bool g_bNoAmmo; - - float g_flCloseAreasOnly; - float g_flOpenAreasOnly; - float g_flSmiteChance; - float g_flSmiteCountdown; - float g_flSmiteRange; - float g_flSmiteRangeChance; - - int g_iAccessFlags; - int g_iAmmoCount; - int g_iComboAbility; - int g_iCooldown; - int g_iHumanAbility; - int g_iHumanAmmo; - int g_iHumanCooldown; - int g_iHumanRangeCooldown; - int g_iImmunityFlags; - int g_iOwner; - int g_iRangeCooldown; - int g_iRequiresHumans; - int g_iSmiteAbility; - int g_iSmiteBody; - int g_iSmiteCooldown; - int g_iSmiteEffect; - int g_iSmiteHit; - int g_iSmiteHitMode; - int g_iSmiteMessage; - int g_iSmiteMode; - int g_iSmiteRangeCooldown; - int g_iSmiteSight; - int g_iTankType; - int g_iTankTypeRecorded; -} - -esSmitePlayer g_esSmitePlayer[MAXPLAYERS + 1]; - -enum struct esSmiteTeammate -{ - float g_flCloseAreasOnly; - float g_flOpenAreasOnly; - float g_flSmiteChance; - float g_flSmiteCountdown; - float g_flSmiteRange; - float g_flSmiteRangeChance; - - int g_iComboAbility; - int g_iHumanAbility; - int g_iHumanAmmo; - int g_iHumanCooldown; - int g_iHumanRangeCooldown; - int g_iRequiresHumans; - int g_iSmiteAbility; - int g_iSmiteBody; - int g_iSmiteCooldown; - int g_iSmiteEffect; - int g_iSmiteHit; - int g_iSmiteHitMode; - int g_iSmiteMessage; - int g_iSmiteMode; - int g_iSmiteRangeCooldown; - int g_iSmiteSight; -} - -esSmiteTeammate g_esSmiteTeammate[MAXPLAYERS + 1]; - -enum struct esSmiteAbility -{ - float g_flCloseAreasOnly; - float g_flOpenAreasOnly; - float g_flSmiteChance; - float g_flSmiteCountdown; - float g_flSmiteRange; - float g_flSmiteRangeChance; - - int g_iAccessFlags; - int g_iComboAbility; - int g_iHumanAbility; - int g_iHumanAmmo; - int g_iHumanCooldown; - int g_iHumanRangeCooldown; - int g_iImmunityFlags; - int g_iRequiresHumans; - int g_iSmiteAbility; - int g_iSmiteBody; - int g_iSmiteCooldown; - int g_iSmiteEffect; - int g_iSmiteHit; - int g_iSmiteHitMode; - int g_iSmiteMessage; - int g_iSmiteMode; - int g_iSmiteRangeCooldown; - int g_iSmiteSight; -} - -esSmiteAbility g_esSmiteAbility[MT_MAXTYPES + 1]; - -enum struct esSmiteSpecial -{ - float g_flCloseAreasOnly; - float g_flOpenAreasOnly; - float g_flSmiteChance; - float g_flSmiteCountdown; - float g_flSmiteRange; - float g_flSmiteRangeChance; - - int g_iComboAbility; - int g_iHumanAbility; - int g_iHumanAmmo; - int g_iHumanCooldown; - int g_iHumanRangeCooldown; - int g_iRequiresHumans; - int g_iSmiteAbility; - int g_iSmiteBody; - int g_iSmiteCooldown; - int g_iSmiteEffect; - int g_iSmiteHit; - int g_iSmiteHitMode; - int g_iSmiteMessage; - int g_iSmiteMode; - int g_iSmiteRangeCooldown; - int g_iSmiteSight; -} - -esSmiteSpecial g_esSmiteSpecial[MT_MAXTYPES + 1]; - -enum struct esSmiteCache -{ - float g_flCloseAreasOnly; - float g_flOpenAreasOnly; - float g_flSmiteChance; - float g_flSmiteCountdown; - float g_flSmiteRange; - float g_flSmiteRangeChance; - - int g_iComboAbility; - int g_iHumanAbility; - int g_iHumanAmmo; - int g_iHumanCooldown; - int g_iHumanRangeCooldown; - int g_iRequiresHumans; - int g_iSmiteAbility; - int g_iSmiteBody; - int g_iSmiteCooldown; - int g_iSmiteEffect; - int g_iSmiteHit; - int g_iSmiteHitMode; - int g_iSmiteMessage; - int g_iSmiteMode; - int g_iSmiteRangeCooldown; - int g_iSmiteSight; -} - -esSmiteCache g_esSmiteCache[MAXPLAYERS + 1]; - -int g_iSmiteDeathModelOwner = 0, g_iSmiteSprite = -1; - -#if !defined MT_ABILITIES_MAIN2 -public void OnPluginStart() -{ - LoadTranslations("common.phrases"); - LoadTranslations("mutant_tanks.phrases"); - LoadTranslations("mutant_tanks_names.phrases"); - - RegConsoleCmd("sm_mt_smite", cmdSmiteInfo, "View information about the Smite ability."); - - if (g_bLateLoad) - { - for (int iPlayer = 1; iPlayer <= MaxClients; iPlayer++) - { - if (bIsValidClient(iPlayer, MT_CHECK_INGAME)) - { - OnClientPutInServer(iPlayer); - } - } - - g_bLateLoad = false; - } -} -#endif - -#if defined MT_ABILITIES_MAIN2 -void vSmiteMapStart() -#else -public void OnMapStart() -#endif -{ - g_iSmiteSprite = PrecacheModel(SPRITE_GLOW, true); - - vSmiteReset(); -} - -#if defined MT_ABILITIES_MAIN2 -void vSmiteClientPutInServer(int client) -#else -public void OnClientPutInServer(int client) -#endif -{ - SDKHook(client, SDKHook_OnTakeDamage, OnSmiteTakeDamage); - vSmiteReset2(client); -} - -#if defined MT_ABILITIES_MAIN2 -void vSmiteClientDisconnect_Post(int client) -#else -public void OnClientDisconnect_Post(int client) -#endif -{ - vSmiteReset2(client); -} - -#if defined MT_ABILITIES_MAIN2 -void vSmiteMapEnd() -#else -public void OnMapEnd() -#endif -{ - vSmiteReset(); -} - -#if !defined MT_ABILITIES_MAIN2 -Action cmdSmiteInfo(int client, int args) -{ - client = iGetListenServerHost(client, g_bDedicated); - - if (!MT_IsCorePluginEnabled()) - { - MT_ReplyToCommand(client, "%s %t", MT_TAG5, "PluginDisabled"); - - return Plugin_Handled; - } - - if (!bIsValidClient(client, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_FAKECLIENT)) - { - MT_ReplyToCommand(client, "%s %t", MT_TAG, "Command is in-game only"); - - return Plugin_Handled; - } - - switch (IsVoteInProgress()) - { - case true: MT_ReplyToCommand(client, "%s %t", MT_TAG2, "Vote in Progress"); - case false: vSmiteMenu(client, MT_SMITE_SECTION4, 0); - } - - return Plugin_Handled; -} -#endif - -void vSmiteMenu(int client, const char[] name, int item) -{ - if (StrContains(MT_SMITE_SECTION4, name, false) == -1) - { - return; - } - - Menu mAbilityMenu = new Menu(iSmiteMenuHandler, MENU_ACTIONS_DEFAULT|MenuAction_Display|MenuAction_DisplayItem); - mAbilityMenu.SetTitle("Smite Ability Information"); - mAbilityMenu.AddItem("Status", "Status"); - mAbilityMenu.AddItem("Ammunition", "Ammunition"); - mAbilityMenu.AddItem("Buttons", "Buttons"); - mAbilityMenu.AddItem("Cooldown", "Cooldown"); - mAbilityMenu.AddItem("Details", "Details"); - mAbilityMenu.AddItem("Human Support", "Human Support"); - mAbilityMenu.AddItem("Range Cooldown", "Range Cooldown"); - mAbilityMenu.DisplayAt(client, item, MENU_TIME_FOREVER); -} - -int iSmiteMenuHandler(Menu menu, MenuAction action, int param1, int param2) -{ - switch (action) - { - case MenuAction_End: delete menu; - case MenuAction_Select: - { - switch (param2) - { - case 0: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esSmiteCache[param1].g_iSmiteAbility == 0) ? "AbilityStatus1" : "AbilityStatus2"); - case 1: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityAmmo", (g_esSmiteCache[param1].g_iHumanAmmo - g_esSmitePlayer[param1].g_iAmmoCount), g_esSmiteCache[param1].g_iHumanAmmo); - case 2: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtons2"); - case 3: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityCooldown", ((g_esSmiteCache[param1].g_iHumanAbility == 1) ? g_esSmiteCache[param1].g_iHumanCooldown : g_esSmiteCache[param1].g_iSmiteCooldown)); - case 4: MT_PrintToChat(param1, "%s %t", MT_TAG3, "SmiteDetails"); - case 5: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esSmiteCache[param1].g_iHumanAbility == 0) ? "AbilityHumanSupport1" : "AbilityHumanSupport2"); - case 6: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityRangeCooldown", ((g_esSmiteCache[param1].g_iHumanAbility == 1) ? g_esSmiteCache[param1].g_iHumanRangeCooldown : g_esSmiteCache[param1].g_iSmiteRangeCooldown)); - } - - if (bIsValidClient(param1, MT_CHECK_INGAME)) - { - vSmiteMenu(param1, MT_SMITE_SECTION4, menu.Selection); - } - } - case MenuAction_Display: - { - char sMenuTitle[PLATFORM_MAX_PATH]; - Panel pSmite = view_as(param2); - FormatEx(sMenuTitle, sizeof sMenuTitle, "%T", "SmiteMenu", param1); - pSmite.SetTitle(sMenuTitle); - } - case MenuAction_DisplayItem: - { - if (param2 >= 0) - { - char sMenuOption[PLATFORM_MAX_PATH]; - - switch (param2) - { - case 0: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Status", param1); - case 1: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Ammunition", param1); - case 2: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Buttons", param1); - case 3: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Cooldown", param1); - case 4: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Details", param1); - case 5: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "HumanSupport", param1); - case 6: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "RangeCooldown", param1); - } - - return RedrawMenuItem(sMenuOption); - } - } - } - - return 0; -} - -#if defined MT_ABILITIES_MAIN2 -void vSmiteDisplayMenu(Menu menu) -#else -public void MT_OnDisplayMenu(Menu menu) -#endif -{ - menu.AddItem(MT_MENU_SMITE, MT_MENU_SMITE); -} - -#if defined MT_ABILITIES_MAIN2 -void vSmiteMenuItemSelected(int client, const char[] info) -#else -public void MT_OnMenuItemSelected(int client, const char[] info) -#endif -{ - if (StrEqual(info, MT_MENU_SMITE, false)) - { - vSmiteMenu(client, MT_SMITE_SECTION4, 0); - } -} - -#if defined MT_ABILITIES_MAIN2 -void vSmiteMenuItemDisplayed(int client, const char[] info, char[] buffer, int size) -#else -public void MT_OnMenuItemDisplayed(int client, const char[] info, char[] buffer, int size) -#endif -{ - if (StrEqual(info, MT_MENU_SMITE, false)) - { - FormatEx(buffer, size, "%T", "SmiteMenu2", client); - } -} - -#if defined MT_ABILITIES_MAIN2 -void vSmiteEntityCreated(int entity, const char[] classname) -#else -public void OnEntityCreated(int entity, const char[] classname) -#endif -{ - if (bIsValidEntity(entity) && StrEqual(classname, "survivor_death_model")) - { - int iOwner = GetClientOfUserId(g_iSmiteDeathModelOwner); - if (bIsValidClient(iOwner)) - { - SDKHook(entity, SDKHook_SpawnPost, OnSmiteModelSpawnPost); - } - - g_iSmiteDeathModelOwner = 0; - } -} - -void OnSmiteModelSpawnPost(int model) -{ - g_iSmiteDeathModelOwner = 0; - - SDKUnhook(model, SDKHook_SpawnPost, OnSmiteModelSpawnPost); - - if (!bIsValidEntity(model)) - { - return; - } - - RemoveEntity(model); -} - -Action OnSmiteTakeDamage(int victim, int &attacker, int &inflictor, float &damage, int &damagetype) -{ - if (MT_IsCorePluginEnabled() && bIsValidClient(victim, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_ALIVE) && damage > 0.0) - { - char sClassname[32]; - if (bIsValidEntity(inflictor)) - { - GetEntityClassname(inflictor, sClassname, sizeof sClassname); - } - - if (MT_IsTankSupported(attacker) && MT_IsCustomTankSupported(attacker) && (g_esSmiteCache[attacker].g_iSmiteHitMode == 0 || g_esSmiteCache[attacker].g_iSmiteHitMode == 1) && bIsSurvivor(victim) && g_esSmiteCache[attacker].g_iComboAbility == 0) - { - if ((!MT_HasAdminAccess(attacker) && !bHasAdminAccess(attacker, g_esSmiteAbility[g_esSmitePlayer[attacker].g_iTankTypeRecorded].g_iAccessFlags, g_esSmitePlayer[attacker].g_iAccessFlags)) || MT_IsAdminImmune(victim, attacker) || bIsAdminImmune(victim, g_esSmitePlayer[attacker].g_iTankType, g_esSmiteAbility[g_esSmitePlayer[attacker].g_iTankTypeRecorded].g_iImmunityFlags, g_esSmitePlayer[victim].g_iImmunityFlags)) - { - return Plugin_Continue; - } - - bool bCaught = bIsSurvivorCaught(victim); - if ((bIsSpecialInfected(attacker) && (bCaught || (!bCaught && (damagetype & DMG_CLUB)) || (bIsSpitter(attacker) && StrEqual(sClassname, "insect_swarm")))) || StrEqual(sClassname[7], "tank_claw") || StrEqual(sClassname, "tank_rock")) - { - vSmiteHit(victim, attacker, GetRandomFloat(0.1, 100.0), g_esSmiteCache[attacker].g_flSmiteChance, g_esSmiteCache[attacker].g_iSmiteHit, MT_MESSAGE_MELEE, MT_ATTACK_CLAW); - } - } - else if (MT_IsTankSupported(victim) && MT_IsCustomTankSupported(victim) && (g_esSmiteCache[victim].g_iSmiteHitMode == 0 || g_esSmiteCache[victim].g_iSmiteHitMode == 2) && bIsSurvivor(attacker) && g_esSmiteCache[victim].g_iComboAbility == 0) - { - if ((!MT_HasAdminAccess(victim) && !bHasAdminAccess(victim, g_esSmiteAbility[g_esSmitePlayer[victim].g_iTankTypeRecorded].g_iAccessFlags, g_esSmitePlayer[victim].g_iAccessFlags)) || MT_IsAdminImmune(attacker, victim) || bIsAdminImmune(attacker, g_esSmitePlayer[victim].g_iTankType, g_esSmiteAbility[g_esSmitePlayer[victim].g_iTankTypeRecorded].g_iImmunityFlags, g_esSmitePlayer[attacker].g_iImmunityFlags)) - { - return Plugin_Continue; - } - - if (StrEqual(sClassname[7], "melee")) - { - vSmiteHit(attacker, victim, GetRandomFloat(0.1, 100.0), g_esSmiteCache[victim].g_flSmiteChance, g_esSmiteCache[victim].g_iSmiteHit, MT_MESSAGE_MELEE, MT_ATTACK_MELEE); - } - } - } - - return Plugin_Continue; -} - -#if defined MT_ABILITIES_MAIN2 -void vSmitePluginCheck(ArrayList list) -#else -public void MT_OnPluginCheck(ArrayList list) -#endif -{ - list.PushString(MT_MENU_SMITE); -} - -#if defined MT_ABILITIES_MAIN2 -void vSmiteAbilityCheck(ArrayList list, ArrayList list2, ArrayList list3, ArrayList list4) -#else -public void MT_OnAbilityCheck(ArrayList list, ArrayList list2, ArrayList list3, ArrayList list4) -#endif -{ - list.PushString(MT_SMITE_SECTION); - list2.PushString(MT_SMITE_SECTION2); - list3.PushString(MT_SMITE_SECTION3); - list4.PushString(MT_SMITE_SECTION4); -} - -#if defined MT_ABILITIES_MAIN2 -void vSmiteCombineAbilities(int tank, int type, const float random, const char[] combo, int survivor, const char[] classname) -#else -public void MT_OnCombineAbilities(int tank, int type, const float random, const char[] combo, int survivor, int weapon, const char[] classname) -#endif -{ - if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esSmiteCache[tank].g_iHumanAbility != 2) - { - return; - } - - char sCombo[320], sSet[4][32]; - FormatEx(sCombo, sizeof sCombo, ",%s,", combo); - FormatEx(sSet[0], sizeof sSet[], ",%s,", MT_SMITE_SECTION); - FormatEx(sSet[1], sizeof sSet[], ",%s,", MT_SMITE_SECTION2); - FormatEx(sSet[2], sizeof sSet[], ",%s,", MT_SMITE_SECTION3); - FormatEx(sSet[3], sizeof sSet[], ",%s,", MT_SMITE_SECTION4); - if (g_esSmiteCache[tank].g_iComboAbility == 1 && (StrContains(sCombo, sSet[0], false) != -1 || StrContains(sCombo, sSet[1], false) != -1 || StrContains(sCombo, sSet[2], false) != -1 || StrContains(sCombo, sSet[3], false) != -1)) - { - char sAbilities[320], sSubset[10][32]; - strcopy(sAbilities, sizeof sAbilities, combo); - ExplodeString(sAbilities, ",", sSubset, sizeof sSubset, sizeof sSubset[]); - - float flChance = 0.0, flDelay = 0.0; - for (int iPos = 0; iPos < (sizeof sSubset); iPos++) - { - if (StrEqual(sSubset[iPos], MT_SMITE_SECTION, false) || StrEqual(sSubset[iPos], MT_SMITE_SECTION2, false) || StrEqual(sSubset[iPos], MT_SMITE_SECTION3, false) || StrEqual(sSubset[iPos], MT_SMITE_SECTION4, false)) - { - flDelay = MT_GetCombinationSetting(tank, 4, iPos); - - switch (type) - { - case MT_COMBO_MAINRANGE: - { - if (g_esSmiteCache[tank].g_iSmiteAbility == 1) - { - switch (flDelay) - { - case 0.0: vSmiteAbility(tank, random, iPos); - default: - { - DataPack dpCombo; - CreateDataTimer(flDelay, tTimerSmiteCombo, dpCombo, TIMER_FLAG_NO_MAPCHANGE); - dpCombo.WriteCell(GetClientUserId(tank)); - dpCombo.WriteFloat(random); - dpCombo.WriteCell(iPos); - } - } - } - } - case MT_COMBO_MELEEHIT: - { - flChance = MT_GetCombinationSetting(tank, 1, iPos); - - switch (flDelay) - { - case 0.0: - { - if ((g_esSmiteCache[tank].g_iSmiteHitMode == 0 || g_esSmiteCache[tank].g_iSmiteHitMode == 1) && (StrEqual(classname[7], "tank_claw") || StrEqual(classname, "tank_rock"))) - { - vSmiteHit(survivor, tank, random, flChance, g_esSmiteCache[tank].g_iSmiteHit, MT_MESSAGE_MELEE, MT_ATTACK_CLAW, iPos); - } - else if ((g_esSmiteCache[tank].g_iSmiteHitMode == 0 || g_esSmiteCache[tank].g_iSmiteHitMode == 2) && StrEqual(classname[7], "melee")) - { - vSmiteHit(survivor, tank, random, flChance, g_esSmiteCache[tank].g_iSmiteHit, MT_MESSAGE_MELEE, MT_ATTACK_MELEE, iPos); - } - } - default: - { - DataPack dpCombo; - CreateDataTimer(flDelay, tTimerSmiteCombo2, dpCombo, TIMER_FLAG_NO_MAPCHANGE); - dpCombo.WriteCell(GetClientUserId(survivor)); - dpCombo.WriteCell(GetClientUserId(tank)); - dpCombo.WriteFloat(random); - dpCombo.WriteFloat(flChance); - dpCombo.WriteCell(iPos); - dpCombo.WriteString(classname); - } - } - } - } - - break; - } - } - } -} - -#if defined MT_ABILITIES_MAIN2 -void vSmiteConfigsLoad(int mode) -#else -public void MT_OnConfigsLoad(int mode) -#endif -{ - switch (mode) - { - case 1: - { - for (int iIndex = MT_GetMinType(); iIndex <= MT_GetMaxType(); iIndex++) - { - g_esSmiteAbility[iIndex].g_iAccessFlags = 0; - g_esSmiteAbility[iIndex].g_iImmunityFlags = 0; - g_esSmiteAbility[iIndex].g_flCloseAreasOnly = 0.0; - g_esSmiteAbility[iIndex].g_iComboAbility = 0; - g_esSmiteAbility[iIndex].g_iHumanAbility = 0; - g_esSmiteAbility[iIndex].g_iHumanAmmo = 5; - g_esSmiteAbility[iIndex].g_iHumanCooldown = 0; - g_esSmiteAbility[iIndex].g_iHumanRangeCooldown = 0; - g_esSmiteAbility[iIndex].g_flOpenAreasOnly = 0.0; - g_esSmiteAbility[iIndex].g_iRequiresHumans = 0; - g_esSmiteAbility[iIndex].g_iSmiteAbility = 0; - g_esSmiteAbility[iIndex].g_iSmiteEffect = 0; - g_esSmiteAbility[iIndex].g_iSmiteMessage = 0; - g_esSmiteAbility[iIndex].g_iSmiteBody = 1; - g_esSmiteAbility[iIndex].g_flSmiteChance = 33.3; - g_esSmiteAbility[iIndex].g_iSmiteCooldown = 0; - g_esSmiteAbility[iIndex].g_flSmiteCountdown = 0.0; - g_esSmiteAbility[iIndex].g_iSmiteHit = 0; - g_esSmiteAbility[iIndex].g_iSmiteHitMode = 0; - g_esSmiteAbility[iIndex].g_iSmiteMode = 1; - g_esSmiteAbility[iIndex].g_flSmiteRange = 150.0; - g_esSmiteAbility[iIndex].g_flSmiteRangeChance = 15.0; - g_esSmiteAbility[iIndex].g_iSmiteRangeCooldown = 0; - g_esSmiteAbility[iIndex].g_iSmiteSight = 0; - - g_esSmiteSpecial[iIndex].g_flCloseAreasOnly = -1.0; - g_esSmiteSpecial[iIndex].g_iComboAbility = -1; - g_esSmiteSpecial[iIndex].g_iHumanAbility = -1; - g_esSmiteSpecial[iIndex].g_iHumanAmmo = -1; - g_esSmiteSpecial[iIndex].g_iHumanCooldown = -1; - g_esSmiteSpecial[iIndex].g_iHumanRangeCooldown = -1; - g_esSmiteSpecial[iIndex].g_flOpenAreasOnly = -1.0; - g_esSmiteSpecial[iIndex].g_iRequiresHumans = -1; - g_esSmiteSpecial[iIndex].g_iSmiteAbility = -1; - g_esSmiteSpecial[iIndex].g_iSmiteEffect = -1; - g_esSmiteSpecial[iIndex].g_iSmiteMessage = -1; - g_esSmiteSpecial[iIndex].g_iSmiteBody = -1; - g_esSmiteSpecial[iIndex].g_flSmiteChance = -1.0; - g_esSmiteSpecial[iIndex].g_iSmiteCooldown = -1; - g_esSmiteSpecial[iIndex].g_flSmiteCountdown = -1.0; - g_esSmiteSpecial[iIndex].g_iSmiteHit = -1; - g_esSmiteSpecial[iIndex].g_iSmiteHitMode = -1; - g_esSmiteSpecial[iIndex].g_iSmiteMode = -1; - g_esSmiteSpecial[iIndex].g_flSmiteRange = -1.0; - g_esSmiteSpecial[iIndex].g_flSmiteRangeChance = -1.0; - g_esSmiteSpecial[iIndex].g_iSmiteRangeCooldown = -1; - g_esSmiteSpecial[iIndex].g_iSmiteSight = -1; - } - } - case 3: - { - for (int iPlayer = 1; iPlayer <= MaxClients; iPlayer++) - { - g_esSmitePlayer[iPlayer].g_iAccessFlags = -1; - g_esSmitePlayer[iPlayer].g_iImmunityFlags = -1; - g_esSmitePlayer[iPlayer].g_flCloseAreasOnly = -1.0; - g_esSmitePlayer[iPlayer].g_iComboAbility = -1; - g_esSmitePlayer[iPlayer].g_iHumanAbility = -1; - g_esSmitePlayer[iPlayer].g_iHumanAmmo = -1; - g_esSmitePlayer[iPlayer].g_iHumanCooldown = -1; - g_esSmitePlayer[iPlayer].g_iHumanRangeCooldown = -1; - g_esSmitePlayer[iPlayer].g_flOpenAreasOnly = -1.0; - g_esSmitePlayer[iPlayer].g_iRequiresHumans = -1; - g_esSmitePlayer[iPlayer].g_iSmiteAbility = -1; - g_esSmitePlayer[iPlayer].g_iSmiteEffect = -1; - g_esSmitePlayer[iPlayer].g_iSmiteMessage = -1; - g_esSmitePlayer[iPlayer].g_iSmiteBody = -1; - g_esSmitePlayer[iPlayer].g_flSmiteChance = -1.0; - g_esSmitePlayer[iPlayer].g_iSmiteCooldown = -1; - g_esSmitePlayer[iPlayer].g_flSmiteCountdown = -1.0; - g_esSmitePlayer[iPlayer].g_iSmiteHit = -1; - g_esSmitePlayer[iPlayer].g_iSmiteHitMode = -1; - g_esSmitePlayer[iPlayer].g_iSmiteMode = -1; - g_esSmitePlayer[iPlayer].g_flSmiteRange = -1.0; - g_esSmitePlayer[iPlayer].g_flSmiteRangeChance = -1.0; - g_esSmitePlayer[iPlayer].g_iSmiteRangeCooldown = -1; - g_esSmitePlayer[iPlayer].g_iSmiteSight = -1; - - g_esSmiteTeammate[iPlayer].g_flCloseAreasOnly = -1.0; - g_esSmiteTeammate[iPlayer].g_iComboAbility = -1; - g_esSmiteTeammate[iPlayer].g_iHumanAbility = -1; - g_esSmiteTeammate[iPlayer].g_iHumanAmmo = -1; - g_esSmiteTeammate[iPlayer].g_iHumanCooldown = -1; - g_esSmiteTeammate[iPlayer].g_iHumanRangeCooldown = -1; - g_esSmiteTeammate[iPlayer].g_flOpenAreasOnly = -1.0; - g_esSmiteTeammate[iPlayer].g_iRequiresHumans = -1; - g_esSmiteTeammate[iPlayer].g_iSmiteAbility = -1; - g_esSmiteTeammate[iPlayer].g_iSmiteEffect = -1; - g_esSmiteTeammate[iPlayer].g_iSmiteMessage = -1; - g_esSmiteTeammate[iPlayer].g_iSmiteBody = -1; - g_esSmiteTeammate[iPlayer].g_flSmiteChance = -1.0; - g_esSmiteTeammate[iPlayer].g_iSmiteCooldown = -1; - g_esSmiteTeammate[iPlayer].g_flSmiteCountdown = -1.0; - g_esSmiteTeammate[iPlayer].g_iSmiteHit = -1; - g_esSmiteTeammate[iPlayer].g_iSmiteHitMode = -1; - g_esSmiteTeammate[iPlayer].g_iSmiteMode = -1; - g_esSmiteTeammate[iPlayer].g_flSmiteRange = -1.0; - g_esSmiteTeammate[iPlayer].g_flSmiteRangeChance = -1.0; - g_esSmiteTeammate[iPlayer].g_iSmiteRangeCooldown = -1; - g_esSmiteTeammate[iPlayer].g_iSmiteSight = -1; - } - } - } -} - -#if defined MT_ABILITIES_MAIN2 -void vSmiteConfigsLoaded(const char[] subsection, const char[] key, const char[] value, int type, int admin, int mode, bool special, const char[] specsection) -#else -public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const char[] value, int type, int admin, int mode, bool special, const char[] specsection) -#endif -{ - if ((mode == -1 || mode == 3) && bIsValidClient(admin)) - { - if (special && specsection[0] != '\0') - { - g_esSmiteTeammate[admin].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esSmiteTeammate[admin].g_flCloseAreasOnly, value, -1.0, 99999.0); - g_esSmiteTeammate[admin].g_iComboAbility = iGetKeyValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "ComboAbility", "Combo Ability", "Combo_Ability", "combo", g_esSmiteTeammate[admin].g_iComboAbility, value, -1, 1); - g_esSmiteTeammate[admin].g_iHumanAbility = iGetKeyValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esSmiteTeammate[admin].g_iHumanAbility, value, -1, 2); - g_esSmiteTeammate[admin].g_iHumanAmmo = iGetKeyValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esSmiteTeammate[admin].g_iHumanAmmo, value, -1, 99999); - g_esSmiteTeammate[admin].g_iHumanCooldown = iGetKeyValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esSmiteTeammate[admin].g_iHumanCooldown, value, -1, 99999); - g_esSmiteTeammate[admin].g_iHumanRangeCooldown = iGetKeyValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "HumanRangeCooldown", "Human Range Cooldown", "Human_Range_Cooldown", "hrangecooldown", g_esSmiteTeammate[admin].g_iHumanRangeCooldown, value, -1, 99999); - g_esSmiteTeammate[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esSmiteTeammate[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); - g_esSmiteTeammate[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esSmiteTeammate[admin].g_iRequiresHumans, value, -1, 32); - g_esSmiteTeammate[admin].g_iSmiteAbility = iGetKeyValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esSmiteTeammate[admin].g_iSmiteAbility, value, -1, 1); - g_esSmiteTeammate[admin].g_iSmiteEffect = iGetKeyValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "AbilityEffect", "Ability Effect", "Ability_Effect", "effect", g_esSmiteTeammate[admin].g_iSmiteEffect, value, -1, 7); - g_esSmiteTeammate[admin].g_iSmiteMessage = iGetKeyValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esSmiteTeammate[admin].g_iSmiteMessage, value, -1, 3); - g_esSmiteTeammate[admin].g_iSmiteSight = iGetKeyValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "AbilitySight", "Ability Sight", "Ability_Sight", "sight", g_esSmiteTeammate[admin].g_iSmiteSight, value, -1, 5); - g_esSmiteTeammate[admin].g_iSmiteBody = iGetKeyValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "SmiteBody", "Smite Body", "Smite_Body", "body", g_esSmiteTeammate[admin].g_iSmiteBody, value, -1, 1); - g_esSmiteTeammate[admin].g_flSmiteChance = flGetKeyValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "SmiteChance", "Smite Chance", "Smite_Chance", "chance", g_esSmiteTeammate[admin].g_flSmiteChance, value, -1.0, 100.0); - g_esSmiteTeammate[admin].g_iSmiteCooldown = iGetKeyValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "SmiteCooldown", "Smite Cooldown", "Smite_Cooldown", "cooldown", g_esSmiteTeammate[admin].g_iSmiteCooldown, value, -1, 99999); - g_esSmiteTeammate[admin].g_flSmiteCountdown = flGetKeyValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "SmiteCountdown", "Smite Countdown", "Smite_Countdown", "countdown", g_esSmiteTeammate[admin].g_flSmiteCountdown, value, -1.0, 99999.0); - g_esSmiteTeammate[admin].g_iSmiteHit = iGetKeyValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "SmiteHit", "Smite Hit", "Smite_Hit", "hit", g_esSmiteTeammate[admin].g_iSmiteHit, value, -1, 1); - g_esSmiteTeammate[admin].g_iSmiteHitMode = iGetKeyValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "SmiteHitMode", "Smite Hit Mode", "Smite_Hit_Mode", "hitmode", g_esSmiteTeammate[admin].g_iSmiteHitMode, value, -1, 2); - g_esSmiteTeammate[admin].g_iSmiteMode = iGetKeyValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "SmiteMode", "Smite Mode", "Smite_Mode", "mode", g_esSmiteTeammate[admin].g_iSmiteMode, value, -1, 3); - g_esSmiteTeammate[admin].g_flSmiteRange = flGetKeyValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "SmiteRange", "Smite Range", "Smite_Range", "range", g_esSmiteTeammate[admin].g_flSmiteRange, value, -1.0, 99999.0); - g_esSmiteTeammate[admin].g_flSmiteRangeChance = flGetKeyValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "SmiteRangeChance", "Smite Range Chance", "Smite_Range_Chance", "rangechance", g_esSmiteTeammate[admin].g_flSmiteRangeChance, value, -1.0, 100.0); - g_esSmiteTeammate[admin].g_iSmiteRangeCooldown = iGetKeyValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "SmiteRangeCooldown", "Smite Range Cooldown", "Smite_Range_Cooldown", "rangecooldown", g_esSmiteTeammate[admin].g_iSmiteRangeCooldown, value, -1, 99999); - } - else - { - g_esSmitePlayer[admin].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esSmitePlayer[admin].g_flCloseAreasOnly, value, -1.0, 99999.0); - g_esSmitePlayer[admin].g_iComboAbility = iGetKeyValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "ComboAbility", "Combo Ability", "Combo_Ability", "combo", g_esSmitePlayer[admin].g_iComboAbility, value, -1, 1); - g_esSmitePlayer[admin].g_iHumanAbility = iGetKeyValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esSmitePlayer[admin].g_iHumanAbility, value, -1, 2); - g_esSmitePlayer[admin].g_iHumanAmmo = iGetKeyValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esSmitePlayer[admin].g_iHumanAmmo, value, -1, 99999); - g_esSmitePlayer[admin].g_iHumanCooldown = iGetKeyValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esSmitePlayer[admin].g_iHumanCooldown, value, -1, 99999); - g_esSmitePlayer[admin].g_iHumanRangeCooldown = iGetKeyValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "HumanRangeCooldown", "Human Range Cooldown", "Human_Range_Cooldown", "hrangecooldown", g_esSmitePlayer[admin].g_iHumanRangeCooldown, value, -1, 99999); - g_esSmitePlayer[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esSmitePlayer[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); - g_esSmitePlayer[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esSmitePlayer[admin].g_iRequiresHumans, value, -1, 32); - g_esSmitePlayer[admin].g_iSmiteAbility = iGetKeyValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esSmitePlayer[admin].g_iSmiteAbility, value, -1, 1); - g_esSmitePlayer[admin].g_iSmiteEffect = iGetKeyValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "AbilityEffect", "Ability Effect", "Ability_Effect", "effect", g_esSmitePlayer[admin].g_iSmiteEffect, value, -1, 7); - g_esSmitePlayer[admin].g_iSmiteMessage = iGetKeyValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esSmitePlayer[admin].g_iSmiteMessage, value, -1, 3); - g_esSmitePlayer[admin].g_iSmiteSight = iGetKeyValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "AbilitySight", "Ability Sight", "Ability_Sight", "sight", g_esSmitePlayer[admin].g_iSmiteSight, value, -1, 5); - g_esSmitePlayer[admin].g_iSmiteBody = iGetKeyValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "SmiteBody", "Smite Body", "Smite_Body", "body", g_esSmitePlayer[admin].g_iSmiteBody, value, -1, 1); - g_esSmitePlayer[admin].g_flSmiteChance = flGetKeyValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "SmiteChance", "Smite Chance", "Smite_Chance", "chance", g_esSmitePlayer[admin].g_flSmiteChance, value, -1.0, 100.0); - g_esSmitePlayer[admin].g_iSmiteCooldown = iGetKeyValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "SmiteCooldown", "Smite Cooldown", "Smite_Cooldown", "cooldown", g_esSmitePlayer[admin].g_iSmiteCooldown, value, -1, 99999); - g_esSmitePlayer[admin].g_flSmiteCountdown = flGetKeyValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "SmiteCountdown", "Smite Countdown", "Smite_Countdown", "countdown", g_esSmitePlayer[admin].g_flSmiteCountdown, value, -1.0, 99999.0); - g_esSmitePlayer[admin].g_iSmiteHit = iGetKeyValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "SmiteHit", "Smite Hit", "Smite_Hit", "hit", g_esSmitePlayer[admin].g_iSmiteHit, value, -1, 1); - g_esSmitePlayer[admin].g_iSmiteHitMode = iGetKeyValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "SmiteHitMode", "Smite Hit Mode", "Smite_Hit_Mode", "hitmode", g_esSmitePlayer[admin].g_iSmiteHitMode, value, -1, 2); - g_esSmitePlayer[admin].g_iSmiteMode = iGetKeyValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "SmiteMode", "Smite Mode", "Smite_Mode", "mode", g_esSmitePlayer[admin].g_iSmiteMode, value, -1, 3); - g_esSmitePlayer[admin].g_flSmiteRange = flGetKeyValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "SmiteRange", "Smite Range", "Smite_Range", "range", g_esSmitePlayer[admin].g_flSmiteRange, value, -1.0, 99999.0); - g_esSmitePlayer[admin].g_flSmiteRangeChance = flGetKeyValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "SmiteRangeChance", "Smite Range Chance", "Smite_Range_Chance", "rangechance", g_esSmitePlayer[admin].g_flSmiteRangeChance, value, -1.0, 100.0); - g_esSmitePlayer[admin].g_iSmiteRangeCooldown = iGetKeyValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "SmiteRangeCooldown", "Smite Range Cooldown", "Smite_Range_Cooldown", "rangecooldown", g_esSmitePlayer[admin].g_iSmiteRangeCooldown, value, -1, 99999); - g_esSmitePlayer[admin].g_iAccessFlags = iGetAdminFlagsValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "AccessFlags", "Access Flags", "Access_Flags", "access", value); - g_esSmitePlayer[admin].g_iImmunityFlags = iGetAdminFlagsValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "ImmunityFlags", "Immunity Flags", "Immunity_Flags", "immunity", value); - } - } - - if (mode < 3 && type > 0) - { - if (special && specsection[0] != '\0') - { - g_esSmiteSpecial[type].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esSmiteSpecial[type].g_flCloseAreasOnly, value, -1.0, 99999.0); - g_esSmiteSpecial[type].g_iComboAbility = iGetKeyValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "ComboAbility", "Combo Ability", "Combo_Ability", "combo", g_esSmiteSpecial[type].g_iComboAbility, value, -1, 1); - g_esSmiteSpecial[type].g_iHumanAbility = iGetKeyValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esSmiteSpecial[type].g_iHumanAbility, value, -1, 2); - g_esSmiteSpecial[type].g_iHumanAmmo = iGetKeyValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esSmiteSpecial[type].g_iHumanAmmo, value, -1, 99999); - g_esSmiteSpecial[type].g_iHumanCooldown = iGetKeyValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esSmiteSpecial[type].g_iHumanCooldown, value, -1, 99999); - g_esSmiteSpecial[type].g_iHumanRangeCooldown = iGetKeyValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "HumanRangeCooldown", "Human Range Cooldown", "Human_Range_Cooldown", "hrangecooldown", g_esSmiteSpecial[type].g_iHumanRangeCooldown, value, -1, 99999); - g_esSmiteSpecial[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esSmiteSpecial[type].g_flOpenAreasOnly, value, -1.0, 99999.0); - g_esSmiteSpecial[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esSmiteSpecial[type].g_iRequiresHumans, value, -1, 32); - g_esSmiteSpecial[type].g_iSmiteAbility = iGetKeyValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esSmiteSpecial[type].g_iSmiteAbility, value, -1, 1); - g_esSmiteSpecial[type].g_iSmiteEffect = iGetKeyValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "AbilityEffect", "Ability Effect", "Ability_Effect", "effect", g_esSmiteSpecial[type].g_iSmiteEffect, value, -1, 7); - g_esSmiteSpecial[type].g_iSmiteMessage = iGetKeyValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esSmiteSpecial[type].g_iSmiteMessage, value, -1, 3); - g_esSmiteSpecial[type].g_iSmiteSight = iGetKeyValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "AbilitySight", "Ability Sight", "Ability_Sight", "sight", g_esSmiteSpecial[type].g_iSmiteSight, value, -1, 5); - g_esSmiteSpecial[type].g_iSmiteBody = iGetKeyValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "SmiteBody", "Smite Body", "Smite_Body", "body", g_esSmiteSpecial[type].g_iSmiteBody, value, -1, 1); - g_esSmiteSpecial[type].g_flSmiteChance = flGetKeyValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "SmiteChance", "Smite Chance", "Smite_Chance", "chance", g_esSmiteSpecial[type].g_flSmiteChance, value, -1.0, 100.0); - g_esSmiteSpecial[type].g_iSmiteCooldown = iGetKeyValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "SmiteCooldown", "Smite Cooldown", "Smite_Cooldown", "cooldown", g_esSmiteSpecial[type].g_iSmiteCooldown, value, -1, 99999); - g_esSmiteSpecial[type].g_flSmiteCountdown = flGetKeyValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "SmiteCountdown", "Smite Countdown", "Smite_Countdown", "countdown", g_esSmiteSpecial[type].g_flSmiteCountdown, value, -1.0, 99999.0); - g_esSmiteSpecial[type].g_iSmiteHit = iGetKeyValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "SmiteHit", "Smite Hit", "Smite_Hit", "hit", g_esSmiteSpecial[type].g_iSmiteHit, value, -1, 1); - g_esSmiteSpecial[type].g_iSmiteHitMode = iGetKeyValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "SmiteHitMode", "Smite Hit Mode", "Smite_Hit_Mode", "hitmode", g_esSmiteSpecial[type].g_iSmiteHitMode, value, -1, 2); - g_esSmiteSpecial[type].g_iSmiteMode = iGetKeyValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "SmiteMode", "Smite Mode", "Smite_Mode", "mode", g_esSmiteSpecial[type].g_iSmiteMode, value, -1, 3); - g_esSmiteSpecial[type].g_flSmiteRange = flGetKeyValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "SmiteRange", "Smite Range", "Smite_Range", "range", g_esSmiteSpecial[type].g_flSmiteRange, value, -1.0, 99999.0); - g_esSmiteSpecial[type].g_flSmiteRangeChance = flGetKeyValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "SmiteRangeChance", "Smite Range Chance", "Smite_Range_Chance", "rangechance", g_esSmiteSpecial[type].g_flSmiteRangeChance, value, -1.0, 100.0); - g_esSmiteSpecial[type].g_iSmiteRangeCooldown = iGetKeyValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "SmiteRangeCooldown", "Smite Range Cooldown", "Smite_Range_Cooldown", "rangecooldown", g_esSmiteSpecial[type].g_iSmiteRangeCooldown, value, -1, 99999); - } - else - { - g_esSmiteAbility[type].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esSmiteAbility[type].g_flCloseAreasOnly, value, -1.0, 99999.0); - g_esSmiteAbility[type].g_iComboAbility = iGetKeyValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "ComboAbility", "Combo Ability", "Combo_Ability", "combo", g_esSmiteAbility[type].g_iComboAbility, value, -1, 1); - g_esSmiteAbility[type].g_iHumanAbility = iGetKeyValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esSmiteAbility[type].g_iHumanAbility, value, -1, 2); - g_esSmiteAbility[type].g_iHumanAmmo = iGetKeyValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esSmiteAbility[type].g_iHumanAmmo, value, -1, 99999); - g_esSmiteAbility[type].g_iHumanCooldown = iGetKeyValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esSmiteAbility[type].g_iHumanCooldown, value, -1, 99999); - g_esSmiteAbility[type].g_iHumanRangeCooldown = iGetKeyValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "HumanRangeCooldown", "Human Range Cooldown", "Human_Range_Cooldown", "hrangecooldown", g_esSmiteAbility[type].g_iHumanRangeCooldown, value, -1, 99999); - g_esSmiteAbility[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esSmiteAbility[type].g_flOpenAreasOnly, value, -1.0, 99999.0); - g_esSmiteAbility[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esSmiteAbility[type].g_iRequiresHumans, value, -1, 32); - g_esSmiteAbility[type].g_iSmiteAbility = iGetKeyValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esSmiteAbility[type].g_iSmiteAbility, value, -1, 1); - g_esSmiteAbility[type].g_iSmiteEffect = iGetKeyValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "AbilityEffect", "Ability Effect", "Ability_Effect", "effect", g_esSmiteAbility[type].g_iSmiteEffect, value, -1, 7); - g_esSmiteAbility[type].g_iSmiteMessage = iGetKeyValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esSmiteAbility[type].g_iSmiteMessage, value, -1, 3); - g_esSmiteAbility[type].g_iSmiteSight = iGetKeyValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "AbilitySight", "Ability Sight", "Ability_Sight", "sight", g_esSmiteAbility[type].g_iSmiteSight, value, -1, 5); - g_esSmiteAbility[type].g_iSmiteBody = iGetKeyValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "SmiteBody", "Smite Body", "Smite_Body", "body", g_esSmiteAbility[type].g_iSmiteBody, value, -1, 1); - g_esSmiteAbility[type].g_flSmiteChance = flGetKeyValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "SmiteChance", "Smite Chance", "Smite_Chance", "chance", g_esSmiteAbility[type].g_flSmiteChance, value, -1.0, 100.0); - g_esSmiteAbility[type].g_iSmiteCooldown = iGetKeyValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "SmiteCooldown", "Smite Cooldown", "Smite_Cooldown", "cooldown", g_esSmiteAbility[type].g_iSmiteCooldown, value, -1, 99999); - g_esSmiteAbility[type].g_flSmiteCountdown = flGetKeyValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "SmiteCountdown", "Smite Countdown", "Smite_Countdown", "countdown", g_esSmiteAbility[type].g_flSmiteCountdown, value, -1.0, 99999.0); - g_esSmiteAbility[type].g_iSmiteHit = iGetKeyValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "SmiteHit", "Smite Hit", "Smite_Hit", "hit", g_esSmiteAbility[type].g_iSmiteHit, value, -1, 1); - g_esSmiteAbility[type].g_iSmiteHitMode = iGetKeyValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "SmiteHitMode", "Smite Hit Mode", "Smite_Hit_Mode", "hitmode", g_esSmiteAbility[type].g_iSmiteHitMode, value, -1, 2); - g_esSmiteAbility[type].g_iSmiteMode = iGetKeyValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "SmiteMode", "Smite Mode", "Smite_Mode", "mode", g_esSmiteAbility[type].g_iSmiteMode, value, -1, 3); - g_esSmiteAbility[type].g_flSmiteRange = flGetKeyValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "SmiteRange", "Smite Range", "Smite_Range", "range", g_esSmiteAbility[type].g_flSmiteRange, value, -1.0, 99999.0); - g_esSmiteAbility[type].g_flSmiteRangeChance = flGetKeyValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "SmiteRangeChance", "Smite Range Chance", "Smite_Range_Chance", "rangechance", g_esSmiteAbility[type].g_flSmiteRangeChance, value, -1.0, 100.0); - g_esSmiteAbility[type].g_iSmiteRangeCooldown = iGetKeyValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "SmiteRangeCooldown", "Smite Range Cooldown", "Smite_Range_Cooldown", "rangecooldown", g_esSmiteAbility[type].g_iSmiteRangeCooldown, value, -1, 99999); - g_esSmiteAbility[type].g_iAccessFlags = iGetAdminFlagsValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "AccessFlags", "Access Flags", "Access_Flags", "access", value); - g_esSmiteAbility[type].g_iImmunityFlags = iGetAdminFlagsValue(subsection, MT_SMITE_SECTION, MT_SMITE_SECTION2, MT_SMITE_SECTION3, MT_SMITE_SECTION4, key, "ImmunityFlags", "Immunity Flags", "Immunity_Flags", "immunity", value); - } - } -} - -#if defined MT_ABILITIES_MAIN2 -void vSmiteSettingsCached(int tank, bool apply, int type) -#else -public void MT_OnSettingsCached(int tank, bool apply, int type) -#endif -{ - bool bHuman = bIsValidClient(tank, MT_CHECK_FAKECLIENT); - g_esSmitePlayer[tank].g_iTankTypeRecorded = apply ? MT_GetRecordedTankType(tank, type) : 0; - g_esSmitePlayer[tank].g_iTankType = apply ? type : 0; - int iType = g_esSmitePlayer[tank].g_iTankTypeRecorded; - - if (bIsSpecialInfected(tank, MT_CHECK_INDEX|MT_CHECK_INGAME)) - { - g_esSmiteCache[tank].g_flCloseAreasOnly = flGetSubSettingValue(apply, bHuman, g_esSmiteTeammate[tank].g_flCloseAreasOnly, g_esSmitePlayer[tank].g_flCloseAreasOnly, g_esSmiteSpecial[iType].g_flCloseAreasOnly, g_esSmiteAbility[iType].g_flCloseAreasOnly, 1); - g_esSmiteCache[tank].g_iComboAbility = iGetSubSettingValue(apply, bHuman, g_esSmiteTeammate[tank].g_iComboAbility, g_esSmitePlayer[tank].g_iComboAbility, g_esSmiteSpecial[iType].g_iComboAbility, g_esSmiteAbility[iType].g_iComboAbility, 1); - g_esSmiteCache[tank].g_flSmiteChance = flGetSubSettingValue(apply, bHuman, g_esSmiteTeammate[tank].g_flSmiteChance, g_esSmitePlayer[tank].g_flSmiteChance, g_esSmiteSpecial[iType].g_flSmiteChance, g_esSmiteAbility[iType].g_flSmiteChance, 1); - g_esSmiteCache[tank].g_flSmiteCountdown = flGetSubSettingValue(apply, bHuman, g_esSmiteTeammate[tank].g_flSmiteCountdown, g_esSmitePlayer[tank].g_flSmiteCountdown, g_esSmiteSpecial[iType].g_flSmiteCountdown, g_esSmiteAbility[iType].g_flSmiteCountdown, 1); - g_esSmiteCache[tank].g_flSmiteRange = flGetSubSettingValue(apply, bHuman, g_esSmiteTeammate[tank].g_flSmiteRange, g_esSmitePlayer[tank].g_flSmiteRange, g_esSmiteSpecial[iType].g_flSmiteRange, g_esSmiteAbility[iType].g_flSmiteRange, 1); - g_esSmiteCache[tank].g_flSmiteRangeChance = flGetSubSettingValue(apply, bHuman, g_esSmiteTeammate[tank].g_flSmiteRangeChance, g_esSmitePlayer[tank].g_flSmiteRangeChance, g_esSmiteSpecial[iType].g_flSmiteRangeChance, g_esSmiteAbility[iType].g_flSmiteRangeChance, 1); - g_esSmiteCache[tank].g_iHumanAbility = iGetSubSettingValue(apply, bHuman, g_esSmiteTeammate[tank].g_iHumanAbility, g_esSmitePlayer[tank].g_iHumanAbility, g_esSmiteSpecial[iType].g_iHumanAbility, g_esSmiteAbility[iType].g_iHumanAbility, 1); - g_esSmiteCache[tank].g_iHumanAmmo = iGetSubSettingValue(apply, bHuman, g_esSmiteTeammate[tank].g_iHumanAmmo, g_esSmitePlayer[tank].g_iHumanAmmo, g_esSmiteSpecial[iType].g_iHumanAmmo, g_esSmiteAbility[iType].g_iHumanAmmo, 1); - g_esSmiteCache[tank].g_iHumanCooldown = iGetSubSettingValue(apply, bHuman, g_esSmiteTeammate[tank].g_iHumanCooldown, g_esSmitePlayer[tank].g_iHumanCooldown, g_esSmiteSpecial[iType].g_iHumanCooldown, g_esSmiteAbility[iType].g_iHumanCooldown, 1); - g_esSmiteCache[tank].g_iHumanRangeCooldown = iGetSubSettingValue(apply, bHuman, g_esSmiteTeammate[tank].g_iHumanRangeCooldown, g_esSmitePlayer[tank].g_iHumanRangeCooldown, g_esSmiteSpecial[iType].g_iHumanRangeCooldown, g_esSmiteAbility[iType].g_iHumanRangeCooldown, 1); - g_esSmiteCache[tank].g_flOpenAreasOnly = flGetSubSettingValue(apply, bHuman, g_esSmiteTeammate[tank].g_flOpenAreasOnly, g_esSmitePlayer[tank].g_flOpenAreasOnly, g_esSmiteSpecial[iType].g_flOpenAreasOnly, g_esSmiteAbility[iType].g_flOpenAreasOnly, 1); - g_esSmiteCache[tank].g_iRequiresHumans = iGetSubSettingValue(apply, bHuman, g_esSmiteTeammate[tank].g_iRequiresHumans, g_esSmitePlayer[tank].g_iRequiresHumans, g_esSmiteSpecial[iType].g_iRequiresHumans, g_esSmiteAbility[iType].g_iRequiresHumans, 1); - g_esSmiteCache[tank].g_iSmiteAbility = iGetSubSettingValue(apply, bHuman, g_esSmiteTeammate[tank].g_iSmiteAbility, g_esSmitePlayer[tank].g_iSmiteAbility, g_esSmiteSpecial[iType].g_iSmiteAbility, g_esSmiteAbility[iType].g_iSmiteAbility, 1); - g_esSmiteCache[tank].g_iSmiteBody = iGetSubSettingValue(apply, bHuman, g_esSmiteTeammate[tank].g_iSmiteBody, g_esSmitePlayer[tank].g_iSmiteBody, g_esSmiteSpecial[iType].g_iSmiteBody, g_esSmiteAbility[iType].g_iSmiteBody, 1); - g_esSmiteCache[tank].g_iSmiteCooldown = iGetSubSettingValue(apply, bHuman, g_esSmiteTeammate[tank].g_iSmiteCooldown, g_esSmitePlayer[tank].g_iSmiteCooldown, g_esSmiteSpecial[iType].g_iSmiteCooldown, g_esSmiteAbility[iType].g_iSmiteCooldown, 1); - g_esSmiteCache[tank].g_iSmiteEffect = iGetSubSettingValue(apply, bHuman, g_esSmiteTeammate[tank].g_iSmiteEffect, g_esSmitePlayer[tank].g_iSmiteEffect, g_esSmiteSpecial[iType].g_iSmiteEffect, g_esSmiteAbility[iType].g_iSmiteEffect, 1); - g_esSmiteCache[tank].g_iSmiteHit = iGetSubSettingValue(apply, bHuman, g_esSmiteTeammate[tank].g_iSmiteHit, g_esSmitePlayer[tank].g_iSmiteHit, g_esSmiteSpecial[iType].g_iSmiteHit, g_esSmiteAbility[iType].g_iSmiteHit, 1); - g_esSmiteCache[tank].g_iSmiteHitMode = iGetSubSettingValue(apply, bHuman, g_esSmiteTeammate[tank].g_iSmiteHitMode, g_esSmitePlayer[tank].g_iSmiteHitMode, g_esSmiteSpecial[iType].g_iSmiteHitMode, g_esSmiteAbility[iType].g_iSmiteHitMode, 1); - g_esSmiteCache[tank].g_iSmiteMessage = iGetSubSettingValue(apply, bHuman, g_esSmiteTeammate[tank].g_iSmiteMessage, g_esSmitePlayer[tank].g_iSmiteMessage, g_esSmiteSpecial[iType].g_iSmiteMessage, g_esSmiteAbility[iType].g_iSmiteMessage, 1); - g_esSmiteCache[tank].g_iSmiteMode = iGetSubSettingValue(apply, bHuman, g_esSmiteTeammate[tank].g_iSmiteMode, g_esSmitePlayer[tank].g_iSmiteMode, g_esSmiteSpecial[iType].g_iSmiteMode, g_esSmiteAbility[iType].g_iSmiteMode, 1); - g_esSmiteCache[tank].g_iSmiteRangeCooldown = iGetSubSettingValue(apply, bHuman, g_esSmiteTeammate[tank].g_iSmiteRangeCooldown, g_esSmitePlayer[tank].g_iSmiteRangeCooldown, g_esSmiteSpecial[iType].g_iSmiteRangeCooldown, g_esSmiteAbility[iType].g_iSmiteRangeCooldown, 1); - g_esSmiteCache[tank].g_iSmiteSight = iGetSubSettingValue(apply, bHuman, g_esSmiteTeammate[tank].g_iSmiteSight, g_esSmitePlayer[tank].g_iSmiteSight, g_esSmiteSpecial[iType].g_iSmiteSight, g_esSmiteAbility[iType].g_iSmiteSight, 1); - } - else - { - g_esSmiteCache[tank].g_flCloseAreasOnly = flGetSettingValue(apply, bHuman, g_esSmitePlayer[tank].g_flCloseAreasOnly, g_esSmiteAbility[iType].g_flCloseAreasOnly, 1); - g_esSmiteCache[tank].g_iComboAbility = iGetSettingValue(apply, bHuman, g_esSmitePlayer[tank].g_iComboAbility, g_esSmiteAbility[iType].g_iComboAbility, 1); - g_esSmiteCache[tank].g_flSmiteChance = flGetSettingValue(apply, bHuman, g_esSmitePlayer[tank].g_flSmiteChance, g_esSmiteAbility[iType].g_flSmiteChance, 1); - g_esSmiteCache[tank].g_flSmiteCountdown = flGetSettingValue(apply, bHuman, g_esSmitePlayer[tank].g_flSmiteCountdown, g_esSmiteAbility[iType].g_flSmiteCountdown, 1); - g_esSmiteCache[tank].g_flSmiteRange = flGetSettingValue(apply, bHuman, g_esSmitePlayer[tank].g_flSmiteRange, g_esSmiteAbility[iType].g_flSmiteRange, 1); - g_esSmiteCache[tank].g_flSmiteRangeChance = flGetSettingValue(apply, bHuman, g_esSmitePlayer[tank].g_flSmiteRangeChance, g_esSmiteAbility[iType].g_flSmiteRangeChance, 1); - g_esSmiteCache[tank].g_iHumanAbility = iGetSettingValue(apply, bHuman, g_esSmitePlayer[tank].g_iHumanAbility, g_esSmiteAbility[iType].g_iHumanAbility, 1); - g_esSmiteCache[tank].g_iHumanAmmo = iGetSettingValue(apply, bHuman, g_esSmitePlayer[tank].g_iHumanAmmo, g_esSmiteAbility[iType].g_iHumanAmmo, 1); - g_esSmiteCache[tank].g_iHumanCooldown = iGetSettingValue(apply, bHuman, g_esSmitePlayer[tank].g_iHumanCooldown, g_esSmiteAbility[iType].g_iHumanCooldown, 1); - g_esSmiteCache[tank].g_iHumanRangeCooldown = iGetSettingValue(apply, bHuman, g_esSmitePlayer[tank].g_iHumanRangeCooldown, g_esSmiteAbility[iType].g_iHumanRangeCooldown, 1); - g_esSmiteCache[tank].g_flOpenAreasOnly = flGetSettingValue(apply, bHuman, g_esSmitePlayer[tank].g_flOpenAreasOnly, g_esSmiteAbility[iType].g_flOpenAreasOnly, 1); - g_esSmiteCache[tank].g_iRequiresHumans = iGetSettingValue(apply, bHuman, g_esSmitePlayer[tank].g_iRequiresHumans, g_esSmiteAbility[iType].g_iRequiresHumans, 1); - g_esSmiteCache[tank].g_iSmiteAbility = iGetSettingValue(apply, bHuman, g_esSmitePlayer[tank].g_iSmiteAbility, g_esSmiteAbility[iType].g_iSmiteAbility, 1); - g_esSmiteCache[tank].g_iSmiteBody = iGetSettingValue(apply, bHuman, g_esSmitePlayer[tank].g_iSmiteBody, g_esSmiteAbility[iType].g_iSmiteBody, 1); - g_esSmiteCache[tank].g_iSmiteCooldown = iGetSettingValue(apply, bHuman, g_esSmitePlayer[tank].g_iSmiteCooldown, g_esSmiteAbility[iType].g_iSmiteCooldown, 1); - g_esSmiteCache[tank].g_iSmiteEffect = iGetSettingValue(apply, bHuman, g_esSmitePlayer[tank].g_iSmiteEffect, g_esSmiteAbility[iType].g_iSmiteEffect, 1); - g_esSmiteCache[tank].g_iSmiteHit = iGetSettingValue(apply, bHuman, g_esSmitePlayer[tank].g_iSmiteHit, g_esSmiteAbility[iType].g_iSmiteHit, 1); - g_esSmiteCache[tank].g_iSmiteHitMode = iGetSettingValue(apply, bHuman, g_esSmitePlayer[tank].g_iSmiteHitMode, g_esSmiteAbility[iType].g_iSmiteHitMode, 1); - g_esSmiteCache[tank].g_iSmiteMessage = iGetSettingValue(apply, bHuman, g_esSmitePlayer[tank].g_iSmiteMessage, g_esSmiteAbility[iType].g_iSmiteMessage, 1); - g_esSmiteCache[tank].g_iSmiteMode = iGetSettingValue(apply, bHuman, g_esSmitePlayer[tank].g_iSmiteMode, g_esSmiteAbility[iType].g_iSmiteMode, 1); - g_esSmiteCache[tank].g_iSmiteRangeCooldown = iGetSettingValue(apply, bHuman, g_esSmitePlayer[tank].g_iSmiteRangeCooldown, g_esSmiteAbility[iType].g_iSmiteRangeCooldown, 1); - g_esSmiteCache[tank].g_iSmiteSight = iGetSettingValue(apply, bHuman, g_esSmitePlayer[tank].g_iSmiteSight, g_esSmiteAbility[iType].g_iSmiteSight, 1); - } -} - -#if defined MT_ABILITIES_MAIN2 -void vSmiteCopyStats(int oldTank, int newTank) -#else -public void MT_OnCopyStats(int oldTank, int newTank) -#endif -{ - vSmiteCopyStats2(oldTank, newTank); - - if (oldTank != newTank) - { - vRemoveSmite(oldTank); - } -} - -#if !defined MT_ABILITIES_MAIN2 -public void MT_OnPluginUpdate() -{ - MT_ReloadPlugin(null); -} -#endif - -#if defined MT_ABILITIES_MAIN2 -void vSmiteEventFired(Event event, const char[] name) -#else -public void MT_OnEventFired(Event event, const char[] name, bool dontBroadcast) -#endif -{ - if (StrEqual(name, "bot_player_replace")) - { - int iBotId = event.GetInt("bot"), iBot = GetClientOfUserId(iBotId), - iTankId = event.GetInt("player"), iTank = GetClientOfUserId(iTankId); - if (bIsValidClient(iBot) && bIsInfected(iTank)) - { - vSmiteCopyStats2(iBot, iTank); - vRemoveSmite(iBot); - } - } - else if (StrEqual(name, "heal_success")) - { - int iSurvivorId = event.GetInt("subject"), iSurvivor = GetClientOfUserId(iSurvivorId); - if (bIsSurvivor(iSurvivor)) - { - g_esSmitePlayer[iSurvivor].g_bAffected = false; - g_esSmitePlayer[iSurvivor].g_iOwner = -1; - } - } - else if (StrEqual(name, "player_bot_replace")) - { - int iTankId = event.GetInt("player"), iTank = GetClientOfUserId(iTankId), - iBotId = event.GetInt("bot"), iBot = GetClientOfUserId(iBotId); - if (bIsValidClient(iTank) && bIsInfected(iBot)) - { - vSmiteCopyStats2(iTank, iBot); - vRemoveSmite(iTank); - } - } - else if (StrEqual(name, "player_death") || StrEqual(name, "player_spawn")) - { - int iTankId = event.GetInt("userid"), iTank = GetClientOfUserId(iTankId); - if (MT_IsTankSupported(iTank, MT_CHECK_INDEX|MT_CHECK_INGAME)) - { - vRemoveSmite(iTank); - } - } - else if (StrEqual(name, "player_now_it")) - { - bool bExploded = event.GetBool("exploded"); - int iSurvivorId = event.GetInt("userid"), iSurvivor = GetClientOfUserId(iSurvivorId), - iBoomerId = event.GetInt("attacker"), iBoomer = GetClientOfUserId(iBoomerId); - if (bIsBoomer(iBoomer) && bIsSurvivor(iSurvivor) && !bExploded) - { - vSmiteHit(iSurvivor, iBoomer, GetRandomFloat(0.1, 100.0), g_esSmiteCache[iBoomer].g_flSmiteChance, g_esSmiteCache[iBoomer].g_iSmiteHit, MT_MESSAGE_RANGE, MT_ATTACK_RANGE); - } - } - else if (StrEqual(name, "mission_lost") || StrEqual(name, "round_start") || StrEqual(name, "round_end")) - { - vSmiteReset(); - } -} - -#if defined MT_ABILITIES_MAIN2 -void vSmitePlayerEventKilled(int victim, int attacker) -#else -public void MT_OnPlayerEventKilled(int victim, int attacker) -#endif -{ - if (bIsSurvivor(victim, MT_CHECK_INDEX|MT_CHECK_INGAME) && MT_IsTankSupported(attacker, MT_CHECK_INDEX|MT_CHECK_INGAME) && MT_IsCustomTankSupported(attacker) && g_esSmiteCache[attacker].g_iSmiteAbility == 1 && g_esSmiteCache[attacker].g_iSmiteBody == 1) - { - g_iSmiteDeathModelOwner = GetClientUserId(victim); - } -} - -#if defined MT_ABILITIES_MAIN2 -void vSmiteAbilityActivated(int tank) -#else -public void MT_OnAbilityActivated(int tank) -#endif -{ - if (MT_IsTankSupported(tank, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_FAKECLIENT) && ((!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esSmiteAbility[g_esSmitePlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esSmitePlayer[tank].g_iAccessFlags)) || g_esSmiteCache[tank].g_iHumanAbility == 0)) - { - return; - } - - if (MT_IsTankSupported(tank) && (!bIsInfected(tank, MT_CHECK_FAKECLIENT) || g_esSmiteCache[tank].g_iHumanAbility != 1) && MT_IsCustomTankSupported(tank) && g_esSmiteCache[tank].g_iSmiteAbility == 1 && g_esSmiteCache[tank].g_iComboAbility == 0) - { - vSmiteAbility(tank, GetRandomFloat(0.1, 100.0)); - } -} - -#if defined MT_ABILITIES_MAIN2 -void vSmiteButtonPressed(int tank, int button) -#else -public void MT_OnButtonPressed(int tank, int button) -#endif -{ - if (MT_IsTankSupported(tank, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_ALIVE|MT_CHECK_FAKECLIENT) && MT_IsCustomTankSupported(tank)) - { - if (bIsAreaNarrow(tank, g_esSmiteCache[tank].g_flOpenAreasOnly) || bIsAreaWide(tank, g_esSmiteCache[tank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esSmitePlayer[tank].g_iTankType, tank) || (g_esSmiteCache[tank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esSmiteCache[tank].g_iRequiresHumans) || (!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esSmiteAbility[g_esSmitePlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esSmitePlayer[tank].g_iAccessFlags))) - { - return; - } - - if ((button & MT_SUB_KEY) && g_esSmiteCache[tank].g_iSmiteAbility == 1 && g_esSmiteCache[tank].g_iHumanAbility == 1) - { - int iTime = GetTime(); - - switch (g_esSmitePlayer[tank].g_iRangeCooldown == -1 || g_esSmitePlayer[tank].g_iRangeCooldown <= iTime) - { - case true: vSmiteAbility(tank, GetRandomFloat(0.1, 100.0)); - case false: MT_PrintToChat(tank, "%s %t", MT_TAG3, "SmiteHuman3", (g_esSmitePlayer[tank].g_iRangeCooldown - iTime)); - } - } - } -} - -#if defined MT_ABILITIES_MAIN2 -void vSmiteChangeType(int tank, int oldType) -#else -public void MT_OnChangeType(int tank, int oldType, int newType, bool revert) -#endif -{ - if (oldType <= 0) - { - return; - } - - vRemoveSmite(tank); -} - -void vSmite(int tank, int survivor, int messages, int flags) -{ - vSmite2(survivor); - vScreenEffect(survivor, tank, g_esSmiteCache[tank].g_iSmiteEffect, flags); - - switch (g_esSmiteCache[tank].g_iSmiteMode) - { - case 0, 3: - { - switch (MT_GetRandomInt(1, 2)) - { - case 1: - { - SetEntProp(survivor, Prop_Send, "m_isIncapacitated", 1); - SetEntPropFloat(survivor, Prop_Send, "m_healthBuffer", 1.0); - vDamagePlayer(survivor, tank, float(GetEntProp(survivor, Prop_Data, "m_iHealth")), "128"); - } - case 2: vDamagePlayer(survivor, tank, float(GetEntProp(survivor, Prop_Data, "m_iHealth")), "128"); - } - } - case 1: - { - SetEntProp(survivor, Prop_Send, "m_isIncapacitated", 1); - SetEntPropFloat(survivor, Prop_Send, "m_healthBuffer", 1.0); - vDamagePlayer(survivor, tank, float(GetEntProp(survivor, Prop_Data, "m_iHealth")), "128"); - } - case 2: vDamagePlayer(survivor, tank, float(GetEntProp(survivor, Prop_Data, "m_iHealth")), "128"); - } - - if (g_esSmiteCache[tank].g_iSmiteMessage & messages) - { - char sTankName[64]; - MT_GetTankName(tank, sTankName); - MT_PrintToChatAll("%s %t", MT_TAG2, "Smite", sTankName, survivor); - MT_LogMessage(MT_LOG_ABILITY, "%s %T", MT_TAG, "Smite", LANG_SERVER, sTankName, survivor); - } -} - -void vSmite2(int survivor) -{ - float flPos[3], flStartPos[3]; - int iColor[4] = {255, 255, 255, 255}; - - GetClientAbsOrigin(survivor, flPos); - flPos[2] -= 26.0; - flStartPos[0] = (flPos[0] + MT_GetRandomFloat(-500.0, 500.0)); - flStartPos[1] = (flPos[1] + MT_GetRandomFloat(-500.0, 500.0)); - flStartPos[2] = (flPos[2] + 800.0); - - TE_SetupBeamPoints(flStartPos, flPos, g_iSmiteSprite, 0, 0, 0, 0.2, 20.0, 10.0, 0, 1.0, iColor, 3); - TE_SendToAll(); - - TE_SetupSparks(flPos, view_as({0.0, 0.0, 0.0}), 5000, 1000); - TE_SendToAll(); - - TE_SetupEnergySplash(flPos, view_as({0.0, 0.0, 0.0}), false); - TE_SendToAll(); - - EmitAmbientSound(SOUND_EXPLOSION, flStartPos, survivor, SNDLEVEL_RAIDSIREN); -} - -void vSmiteAbility(int tank, float random, int pos = -1) -{ - if (bIsAreaNarrow(tank, g_esSmiteCache[tank].g_flOpenAreasOnly) || bIsAreaWide(tank, g_esSmiteCache[tank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esSmitePlayer[tank].g_iTankType, tank) || (g_esSmiteCache[tank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esSmiteCache[tank].g_iRequiresHumans) || (!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esSmiteAbility[g_esSmitePlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esSmitePlayer[tank].g_iAccessFlags))) - { - return; - } - - if (!bIsInfected(tank, MT_CHECK_FAKECLIENT) || (g_esSmitePlayer[tank].g_iAmmoCount < g_esSmiteCache[tank].g_iHumanAmmo && g_esSmiteCache[tank].g_iHumanAmmo > 0)) - { - g_esSmitePlayer[tank].g_bFailed = false; - g_esSmitePlayer[tank].g_bNoAmmo = false; - - float flTankPos[3], flSurvivorPos[3]; - GetClientAbsOrigin(tank, flTankPos); - float flRange = (pos != -1) ? MT_GetCombinationSetting(tank, 9, pos) : g_esSmiteCache[tank].g_flSmiteRange, - flChance = (pos != -1) ? MT_GetCombinationSetting(tank, 10, pos) : g_esSmiteCache[tank].g_flSmiteRangeChance; - int iSurvivorCount = 0; - for (int iSurvivor = 1; iSurvivor <= MaxClients; iSurvivor++) - { - if (bIsSurvivor(iSurvivor, MT_CHECK_INGAME|MT_CHECK_ALIVE) && !MT_IsAdminImmune(iSurvivor, tank) && !bIsAdminImmune(iSurvivor, g_esSmitePlayer[tank].g_iTankType, g_esSmiteAbility[g_esSmitePlayer[tank].g_iTankTypeRecorded].g_iImmunityFlags, g_esSmitePlayer[iSurvivor].g_iImmunityFlags)) - { - GetClientAbsOrigin(iSurvivor, flSurvivorPos); - if (GetVectorDistance(flTankPos, flSurvivorPos) <= flRange && bIsVisibleToPlayer(tank, iSurvivor, g_esSmiteCache[tank].g_iSmiteSight, .range = flRange)) - { - vSmiteHit(iSurvivor, tank, random, flChance, g_esSmiteCache[tank].g_iSmiteAbility, MT_MESSAGE_RANGE, MT_ATTACK_RANGE, pos); - - iSurvivorCount++; - } - } - } - - if (iSurvivorCount == 0) - { - if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esSmiteCache[tank].g_iHumanAbility == 1) - { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "SmiteHuman4"); - } - } - } - else if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esSmiteCache[tank].g_iHumanAbility == 1) - { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "SmiteAmmo"); - } -} - -void vSmiteHit(int survivor, int tank, float random, float chance, int enabled, int messages, int flags, int pos = -1) -{ - if (bIsAreaNarrow(tank, g_esSmiteCache[tank].g_flOpenAreasOnly) || bIsAreaWide(tank, g_esSmiteCache[tank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esSmitePlayer[tank].g_iTankType, tank) || (g_esSmiteCache[tank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esSmiteCache[tank].g_iRequiresHumans) || (!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esSmiteAbility[g_esSmitePlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esSmitePlayer[tank].g_iAccessFlags)) || MT_IsAdminImmune(survivor, tank) || bIsAdminImmune(survivor, g_esSmitePlayer[tank].g_iTankType, g_esSmiteAbility[g_esSmitePlayer[tank].g_iTankTypeRecorded].g_iImmunityFlags, g_esSmitePlayer[survivor].g_iImmunityFlags)) - { - return; - } - - int iTime = GetTime(); - if (((flags & MT_ATTACK_RANGE) && g_esSmitePlayer[tank].g_iRangeCooldown != -1 && g_esSmitePlayer[tank].g_iRangeCooldown >= iTime) || (((flags & MT_ATTACK_CLAW) || (flags & MT_ATTACK_MELEE)) && g_esSmitePlayer[tank].g_iCooldown != -1 && g_esSmitePlayer[tank].g_iCooldown >= iTime)) - { - return; - } - - if (enabled == 1 && bIsSurvivor(survivor) && !MT_DoesSurvivorHaveRewardType(survivor, MT_REWARD_GODMODE)) - { - if (!bIsInfected(tank, MT_CHECK_FAKECLIENT) || (flags & MT_ATTACK_CLAW) || (flags & MT_ATTACK_MELEE) || (g_esSmitePlayer[tank].g_iAmmoCount < g_esSmiteCache[tank].g_iHumanAmmo && g_esSmiteCache[tank].g_iHumanAmmo > 0)) - { - if (random <= chance) - { - if ((messages & MT_MESSAGE_MELEE) && !bIsVisibleToPlayer(tank, survivor, g_esSmiteCache[tank].g_iSmiteSight, .range = 100.0)) - { - return; - } - - int iCooldown = -1; - if ((flags & MT_ATTACK_RANGE) && (g_esSmitePlayer[tank].g_iRangeCooldown == -1 || g_esSmitePlayer[tank].g_iRangeCooldown <= iTime)) - { - if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esSmiteCache[tank].g_iHumanAbility == 1) - { - g_esSmitePlayer[tank].g_iAmmoCount++; - - MT_PrintToChat(tank, "%s %t", MT_TAG3, "SmiteHuman", g_esSmitePlayer[tank].g_iAmmoCount, g_esSmiteCache[tank].g_iHumanAmmo); - } - - iCooldown = (pos != -1) ? RoundToNearest(MT_GetCombinationSetting(tank, 11, pos)) : g_esSmiteCache[tank].g_iSmiteRangeCooldown; - iCooldown = (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esSmiteCache[tank].g_iHumanAbility == 1 && g_esSmitePlayer[tank].g_iAmmoCount < g_esSmiteCache[tank].g_iHumanAmmo && g_esSmiteCache[tank].g_iHumanAmmo > 0) ? g_esSmiteCache[tank].g_iHumanRangeCooldown : iCooldown; - g_esSmitePlayer[tank].g_iRangeCooldown = (iTime + iCooldown); - if (g_esSmitePlayer[tank].g_iRangeCooldown != -1 && g_esSmitePlayer[tank].g_iRangeCooldown >= iTime) - { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "SmiteHuman5", (g_esSmitePlayer[tank].g_iRangeCooldown - iTime)); - } - } - else if (((flags & MT_ATTACK_CLAW) || (flags & MT_ATTACK_MELEE)) && (g_esSmitePlayer[tank].g_iCooldown == -1 || g_esSmitePlayer[tank].g_iCooldown <= iTime)) - { - iCooldown = (pos != -1) ? RoundToNearest(MT_GetCombinationSetting(tank, 2, pos)) : g_esSmiteCache[tank].g_iSmiteCooldown; - iCooldown = (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esSmiteCache[tank].g_iHumanAbility == 1) ? g_esSmiteCache[tank].g_iHumanCooldown : iCooldown; - g_esSmitePlayer[tank].g_iCooldown = (iTime + iCooldown); - if (g_esSmitePlayer[tank].g_iCooldown != -1 && g_esSmitePlayer[tank].g_iCooldown >= iTime) - { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "SmiteHuman5", (g_esSmitePlayer[tank].g_iCooldown - iTime)); - } - } - - if (g_esSmiteCache[tank].g_flSmiteCountdown > 0.0) - { - g_esSmitePlayer[survivor].g_bAffected = true; - g_esSmitePlayer[survivor].g_iOwner = tank; - - DataPack dpSmite; - CreateDataTimer(g_esSmiteCache[tank].g_flSmiteCountdown, tTimerSmite, dpSmite, TIMER_FLAG_NO_MAPCHANGE); - dpSmite.WriteCell(GetClientUserId(survivor)); - dpSmite.WriteCell(GetClientUserId(tank)); - dpSmite.WriteCell(messages); - dpSmite.WriteCell(flags); - } - else - { - vSmite(tank, survivor, messages, flags); - } - } - else if ((flags & MT_ATTACK_RANGE) && (g_esSmitePlayer[tank].g_iRangeCooldown == -1 || g_esSmitePlayer[tank].g_iRangeCooldown <= iTime)) - { - if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esSmiteCache[tank].g_iHumanAbility == 1 && !g_esSmitePlayer[tank].g_bFailed) - { - g_esSmitePlayer[tank].g_bFailed = true; - - MT_PrintToChat(tank, "%s %t", MT_TAG3, "SmiteHuman2"); - } - } - } - else if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esSmiteCache[tank].g_iHumanAbility == 1 && !g_esSmitePlayer[tank].g_bNoAmmo) - { - g_esSmitePlayer[tank].g_bNoAmmo = true; - - MT_PrintToChat(tank, "%s %t", MT_TAG3, "SmiteAmmo"); - } - } -} - -void vSmiteCopyStats2(int oldTank, int newTank) -{ - g_esSmitePlayer[newTank].g_iAmmoCount = g_esSmitePlayer[oldTank].g_iAmmoCount; - g_esSmitePlayer[newTank].g_iCooldown = g_esSmitePlayer[oldTank].g_iCooldown; - g_esSmitePlayer[newTank].g_iRangeCooldown = g_esSmitePlayer[oldTank].g_iRangeCooldown; -} - -void vRemoveSmite(int tank) -{ - for (int iSurvivor = 1; iSurvivor <= MaxClients; iSurvivor++) - { - if (bIsSurvivor(iSurvivor, MT_CHECK_INGAME) && g_esSmitePlayer[iSurvivor].g_bAffected && g_esSmitePlayer[iSurvivor].g_iOwner == tank) - { - g_esSmitePlayer[iSurvivor].g_bAffected = false; - g_esSmitePlayer[iSurvivor].g_iOwner = -1; - } - } - - vSmiteReset2(tank); -} - -void vSmiteReset() -{ - for (int iPlayer = 1; iPlayer <= MaxClients; iPlayer++) - { - if (bIsValidClient(iPlayer, MT_CHECK_INGAME)) - { - vSmiteReset2(iPlayer); - - g_esSmitePlayer[iPlayer].g_iOwner = -1; - } - } -} - -void vSmiteReset2(int tank) -{ - g_esSmitePlayer[tank].g_bFailed = false; - g_esSmitePlayer[tank].g_bNoAmmo = false; - g_esSmitePlayer[tank].g_iAmmoCount = 0; - g_esSmitePlayer[tank].g_iCooldown = -1; - g_esSmitePlayer[tank].g_iRangeCooldown = -1; -} - -void tTimerSmite(Handle timer, DataPack pack) -{ - pack.Reset(); - - int iSurvivor = GetClientOfUserId(pack.ReadCell()); - if (!MT_IsCorePluginEnabled() || !bIsSurvivor(iSurvivor)) - { - g_esSmitePlayer[iSurvivor].g_bAffected = false; - g_esSmitePlayer[iSurvivor].g_iOwner = -1; - - return; - } - - int iTank = GetClientOfUserId(pack.ReadCell()); - if (!MT_IsTankSupported(iTank) || !MT_IsCustomTankSupported(iTank)) - { - g_esSmitePlayer[iSurvivor].g_bAffected = false; - g_esSmitePlayer[iSurvivor].g_iOwner = -1; - - return; - } - - int iMessage = pack.ReadCell(), iFlags = pack.ReadCell(); - g_esSmitePlayer[iSurvivor].g_bAffected = false; - g_esSmitePlayer[iSurvivor].g_iOwner = -1; - - vSmite(iTank, iSurvivor, iMessage, iFlags); -} - -void tTimerSmiteCombo(Handle timer, DataPack pack) -{ - pack.Reset(); - - int iTank = GetClientOfUserId(pack.ReadCell()); - if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esSmiteAbility[g_esSmitePlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esSmitePlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esSmitePlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esSmiteCache[iTank].g_iSmiteAbility == 0) - { - return; - } - - float flRandom = pack.ReadFloat(); - int iPos = pack.ReadCell(); - vSmiteAbility(iTank, flRandom, iPos); -} - -void tTimerSmiteCombo2(Handle timer, DataPack pack) -{ - pack.Reset(); - - int iSurvivor = GetClientOfUserId(pack.ReadCell()); - if (!bIsSurvivor(iSurvivor)) - { - return; - } - - int iTank = GetClientOfUserId(pack.ReadCell()); - if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esSmiteAbility[g_esSmitePlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esSmitePlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esSmitePlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esSmiteCache[iTank].g_iSmiteHit == 0) - { - return; - } - - float flRandom = pack.ReadFloat(), flChance = pack.ReadFloat(); - int iPos = pack.ReadCell(); - char sClassname[32]; - pack.ReadString(sClassname, sizeof sClassname); - if ((g_esSmiteCache[iTank].g_iSmiteHitMode == 0 || g_esSmiteCache[iTank].g_iSmiteHitMode == 1) && (bIsSpecialInfected(iTank) || StrEqual(sClassname[7], "tank_claw") || StrEqual(sClassname, "tank_rock"))) - { - vSmiteHit(iSurvivor, iTank, flRandom, flChance, g_esSmiteCache[iTank].g_iSmiteHit, MT_MESSAGE_MELEE, MT_ATTACK_CLAW, iPos); - } - else if ((g_esSmiteCache[iTank].g_iSmiteHitMode == 0 || g_esSmiteCache[iTank].g_iSmiteHitMode == 2) && StrEqual(sClassname[7], "melee")) - { - vSmiteHit(iSurvivor, iTank, flRandom, flChance, g_esSmiteCache[iTank].g_iSmiteHit, MT_MESSAGE_MELEE, MT_ATTACK_MELEE, iPos); - } -} \ No newline at end of file diff --git a/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_spam.sp b/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_spam.sp deleted file mode 100644 index b98c81f93a..0000000000 --- a/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_spam.sp +++ /dev/null @@ -1,1119 +0,0 @@ -/** - * Mutant Tanks: a L4D/L4D2 SourceMod Plugin - * Copyright (C) 2024 Alfred "Psyk0tik" Llagas - * - * 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 . - **/ - -#define MT_SPAM_COMPILE_METHOD 0 // 0: packaged, 1: standalone - -#if !defined MT_ABILITIES_MAIN2 - #if MT_SPAM_COMPILE_METHOD == 1 - #include - #include - #else - #error This file must be inside "scripting/mutant_tanks/abilities2" while compiling "mt_abilities2.sp" to include its content. - #endif -public Plugin myinfo = -{ - name = "[MT] Spam Ability", - author = MT_AUTHOR, - description = "The Mutant Tank spams rocks at survivors.", - version = MT_VERSION, - url = MT_URL -}; - -bool g_bDedicated; - -public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max) -{ - EngineVersion evEngine = GetEngineVersion(); - if (evEngine != Engine_Left4Dead && evEngine != Engine_Left4Dead2) - { - strcopy(error, err_max, "\"[MT] Spam Ability\" only supports Left 4 Dead 1 & 2."); - - return APLRes_SilentFailure; - } - - g_bDedicated = IsDedicatedServer(); - - return APLRes_Success; -} -#else - #if MT_SPAM_COMPILE_METHOD == 1 - #error This file must be compiled as a standalone plugin. - #endif -#endif - -#define MT_SPAM_SECTION "spamability" -#define MT_SPAM_SECTION2 "spam ability" -#define MT_SPAM_SECTION3 "spam_ability" -#define MT_SPAM_SECTION4 "spam" - -#define MT_MENU_SPAM "Spam Ability" - -enum struct esSpamPlayer -{ - bool g_bActivated; - - float g_flCloseAreasOnly; - float g_flOpenAreasOnly; - float g_flSpamChance; - float g_flSpamInterval; - - int g_iAccessFlags; - int g_iAmmoCount; - int g_iComboAbility; - int g_iCooldown; - int g_iHumanAbility; - int g_iHumanAmmo; - int g_iHumanCooldown; - int g_iHumanDuration; - int g_iHumanMode; - int g_iImmunityFlags; - int g_iLauncher; - int g_iRequiresHumans; - int g_iSpamAbility; - int g_iSpamCooldown; - int g_iSpamDamage; - int g_iSpamDuration; - int g_iSpamMessage; - int g_iTankType; - int g_iTankTypeRecorded; -} - -esSpamPlayer g_esSpamPlayer[MAXPLAYERS + 1]; - -enum struct esSpamTeammate -{ - float g_flCloseAreasOnly; - float g_flOpenAreasOnly; - float g_flSpamChance; - float g_flSpamInterval; - - int g_iComboAbility; - int g_iHumanAbility; - int g_iHumanAmmo; - int g_iHumanCooldown; - int g_iHumanDuration; - int g_iHumanMode; - int g_iRequiresHumans; - int g_iSpamAbility; - int g_iSpamCooldown; - int g_iSpamDamage; - int g_iSpamDuration; - int g_iSpamMessage; -} - -esSpamTeammate g_esSpamTeammate[MAXPLAYERS + 1]; - -enum struct esSpamAbility -{ - float g_flCloseAreasOnly; - float g_flOpenAreasOnly; - float g_flSpamChance; - float g_flSpamInterval; - - int g_iAccessFlags; - int g_iComboAbility; - int g_iComboPosition; - int g_iHumanAbility; - int g_iHumanAmmo; - int g_iHumanCooldown; - int g_iHumanDuration; - int g_iHumanMode; - int g_iImmunityFlags; - int g_iRequiresHumans; - int g_iSpamAbility; - int g_iSpamCooldown; - int g_iSpamDamage; - int g_iSpamDuration; - int g_iSpamMessage; -} - -esSpamAbility g_esSpamAbility[MT_MAXTYPES + 1]; - -enum struct esSpamSpecial -{ - float g_flCloseAreasOnly; - float g_flOpenAreasOnly; - float g_flSpamChance; - float g_flSpamInterval; - - int g_iComboAbility; - int g_iHumanAbility; - int g_iHumanAmmo; - int g_iHumanCooldown; - int g_iHumanDuration; - int g_iHumanMode; - int g_iRequiresHumans; - int g_iSpamAbility; - int g_iSpamCooldown; - int g_iSpamDamage; - int g_iSpamDuration; - int g_iSpamMessage; -} - -esSpamSpecial g_esSpamSpecial[MT_MAXTYPES + 1]; - -enum struct esSpamCache -{ - float g_flCloseAreasOnly; - float g_flOpenAreasOnly; - float g_flSpamChance; - float g_flSpamInterval; - - int g_iComboAbility; - int g_iHumanAbility; - int g_iHumanAmmo; - int g_iHumanCooldown; - int g_iHumanDuration; - int g_iHumanMode; - int g_iRequiresHumans; - int g_iSpamAbility; - int g_iSpamCooldown; - int g_iSpamDamage; - int g_iSpamDuration; - int g_iSpamMessage; -} - -esSpamCache g_esSpamCache[MAXPLAYERS + 1]; - -#if !defined MT_ABILITIES_MAIN2 -public void OnPluginStart() -{ - LoadTranslations("common.phrases"); - LoadTranslations("mutant_tanks.phrases"); - LoadTranslations("mutant_tanks_names.phrases"); - - RegConsoleCmd("sm_mt_spam", cmdSpamInfo, "View information about the Spam ability."); -} -#endif - -#if defined MT_ABILITIES_MAIN2 -void vSpamMapStart() -#else -public void OnMapStart() -#endif -{ - vSpamReset(); -} - -#if defined MT_ABILITIES_MAIN2 -void vSpamClientPutInServer(int client) -#else -public void OnClientPutInServer(int client) -#endif -{ - SDKHook(client, SDKHook_OnTakeDamage, OnSpamTakeDamage); - vRemoveSpam(client); -} - -#if defined MT_ABILITIES_MAIN2 -void vSpamClientDisconnect_Post(int client) -#else -public void OnClientDisconnect_Post(int client) -#endif -{ - vRemoveSpam(client); -} - -#if defined MT_ABILITIES_MAIN2 -void vSpamMapEnd() -#else -public void OnMapEnd() -#endif -{ - vSpamReset(); -} - -#if !defined MT_ABILITIES_MAIN2 -Action cmdSpamInfo(int client, int args) -{ - client = iGetListenServerHost(client, g_bDedicated); - - if (!MT_IsCorePluginEnabled()) - { - MT_ReplyToCommand(client, "%s %t", MT_TAG5, "PluginDisabled"); - - return Plugin_Handled; - } - - if (!bIsValidClient(client, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_FAKECLIENT)) - { - MT_ReplyToCommand(client, "%s %t", MT_TAG, "Command is in-game only"); - - return Plugin_Handled; - } - - switch (IsVoteInProgress()) - { - case true: MT_ReplyToCommand(client, "%s %t", MT_TAG2, "Vote in Progress"); - case false: vSpamMenu(client, MT_SPAM_SECTION4, 0); - } - - return Plugin_Handled; -} -#endif - -void vSpamMenu(int client, const char[] name, int item) -{ - if (StrContains(MT_SPAM_SECTION4, name, false) == -1) - { - return; - } - - Menu mAbilityMenu = new Menu(iSpamMenuHandler, MENU_ACTIONS_DEFAULT|MenuAction_Display|MenuAction_DisplayItem); - mAbilityMenu.SetTitle("Spam Ability Information"); - mAbilityMenu.AddItem("Status", "Status"); - mAbilityMenu.AddItem("Ammunition", "Ammunition"); - mAbilityMenu.AddItem("Buttons", "Buttons"); - mAbilityMenu.AddItem("Button Mode", "Button Mode"); - mAbilityMenu.AddItem("Cooldown", "Cooldown"); - mAbilityMenu.AddItem("Details", "Details"); - mAbilityMenu.AddItem("Duration", "Duration"); - mAbilityMenu.AddItem("Human Support", "Human Support"); - mAbilityMenu.DisplayAt(client, item, MENU_TIME_FOREVER); -} - -int iSpamMenuHandler(Menu menu, MenuAction action, int param1, int param2) -{ - switch (action) - { - case MenuAction_End: delete menu; - case MenuAction_Select: - { - switch (param2) - { - case 0: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esSpamCache[param1].g_iSpamAbility == 0) ? "AbilityStatus1" : "AbilityStatus2"); - case 1: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityAmmo", (g_esSpamCache[param1].g_iHumanAmmo - g_esSpamPlayer[param1].g_iAmmoCount), g_esSpamCache[param1].g_iHumanAmmo); - case 2: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtons"); - case 3: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esSpamCache[param1].g_iHumanMode == 0) ? "AbilityButtonMode1" : "AbilityButtonMode2"); - case 4: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityCooldown", ((g_esSpamCache[param1].g_iHumanAbility == 1) ? g_esSpamCache[param1].g_iHumanCooldown : g_esSpamCache[param1].g_iSpamCooldown)); - case 5: MT_PrintToChat(param1, "%s %t", MT_TAG3, "SpamDetails"); - case 6: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityDuration2", ((g_esSpamCache[param1].g_iHumanAbility == 1) ? g_esSpamCache[param1].g_iHumanDuration : g_esSpamCache[param1].g_iSpamDuration)); - case 7: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esSpamCache[param1].g_iHumanAbility == 0) ? "AbilityHumanSupport1" : "AbilityHumanSupport2"); - } - - if (bIsValidClient(param1, MT_CHECK_INGAME)) - { - vSpamMenu(param1, MT_SPAM_SECTION4, menu.Selection); - } - } - case MenuAction_Display: - { - char sMenuTitle[PLATFORM_MAX_PATH]; - Panel pSpam = view_as(param2); - FormatEx(sMenuTitle, sizeof sMenuTitle, "%T", "SpamMenu", param1); - pSpam.SetTitle(sMenuTitle); - } - case MenuAction_DisplayItem: - { - if (param2 >= 0) - { - char sMenuOption[PLATFORM_MAX_PATH]; - - switch (param2) - { - case 0: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Status", param1); - case 1: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Ammunition", param1); - case 2: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Buttons", param1); - case 3: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "ButtonMode", param1); - case 4: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Cooldown", param1); - case 5: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Details", param1); - case 6: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Duration", param1); - case 7: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "HumanSupport", param1); - } - - return RedrawMenuItem(sMenuOption); - } - } - } - - return 0; -} - -#if defined MT_ABILITIES_MAIN2 -void vSpamDisplayMenu(Menu menu) -#else -public void MT_OnDisplayMenu(Menu menu) -#endif -{ - menu.AddItem(MT_MENU_SPAM, MT_MENU_SPAM); -} - -#if defined MT_ABILITIES_MAIN2 -void vSpamMenuItemSelected(int client, const char[] info) -#else -public void MT_OnMenuItemSelected(int client, const char[] info) -#endif -{ - if (StrEqual(info, MT_MENU_SPAM, false)) - { - vSpamMenu(client, MT_SPAM_SECTION4, 0); - } -} - -#if defined MT_ABILITIES_MAIN2 -void vSpamMenuItemDisplayed(int client, const char[] info, char[] buffer, int size) -#else -public void MT_OnMenuItemDisplayed(int client, const char[] info, char[] buffer, int size) -#endif -{ - if (StrEqual(info, MT_MENU_SPAM, false)) - { - FormatEx(buffer, size, "%T", "SpamMenu2", client); - } -} - -Action OnSpamTakeDamage(int victim, int &attacker, int &inflictor, float &damage, int &damagetype) -{ - if (MT_IsCorePluginEnabled() && bIsValidClient(victim, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_ALIVE) && damage > 0.0) - { - char sClassname[32]; - if (bIsValidEntity(inflictor)) - { - GetEntityClassname(inflictor, sClassname, sizeof sClassname); - } - - if (StrEqual(sClassname, "tank_rock")) - { - int iLauncher = GetEntPropEnt(inflictor, Prop_Data, "m_hOwnerEntity"), - iThrower = GetEntPropEnt(inflictor, Prop_Data, "m_hThrower"); - if (bIsValidEntity(iLauncher) && bIsInfected(iThrower, MT_CHECK_INDEX|MT_CHECK_INGAME)) - { - int iTank = GetEntPropEnt(iLauncher, Prop_Data, "m_hOwnerEntity"); - if (iThrower == iTank && MT_IsTankSupported(iTank) && MT_IsCustomTankSupported(iTank) && g_esSpamCache[iTank].g_iSpamAbility == 1 && g_esSpamPlayer[iTank].g_iLauncher != INVALID_ENT_REFERENCE && iLauncher == EntRefToEntIndex(g_esSpamPlayer[iTank].g_iLauncher) && (MT_HasAdminAccess(iTank) || bHasAdminAccess(iTank, g_esSpamAbility[g_esSpamPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esSpamPlayer[iTank].g_iAccessFlags))) - { - if (bIsInfected(victim) || (bIsSurvivor(victim) && (MT_IsAdminImmune(victim, iTank) || bIsAdminImmune(victim, g_esSpamPlayer[iTank].g_iTankType, g_esSpamAbility[g_esSpamPlayer[iTank].g_iTankTypeRecorded].g_iImmunityFlags, g_esSpamPlayer[victim].g_iImmunityFlags)))) - { - return Plugin_Handled; - } - - int iPos = g_esSpamAbility[g_esSpamPlayer[iTank].g_iTankTypeRecorded].g_iComboPosition; - float flDamage = (iPos != -1) ? MT_GetCombinationSetting(iTank, 3, iPos) : float(g_esSpamCache[iTank].g_iSpamDamage); - damage = MT_GetScaledDamage(flDamage); - - return Plugin_Changed; - } - } - } - } - - return Plugin_Continue; -} - -#if defined MT_ABILITIES_MAIN2 -void vSpamPluginCheck(ArrayList list) -#else -public void MT_OnPluginCheck(ArrayList list) -#endif -{ - list.PushString(MT_MENU_SPAM); -} - -#if defined MT_ABILITIES_MAIN2 -void vSpamAbilityCheck(ArrayList list, ArrayList list2, ArrayList list3, ArrayList list4) -#else -public void MT_OnAbilityCheck(ArrayList list, ArrayList list2, ArrayList list3, ArrayList list4) -#endif -{ - list.PushString(MT_SPAM_SECTION); - list2.PushString(MT_SPAM_SECTION2); - list3.PushString(MT_SPAM_SECTION3); - list4.PushString(MT_SPAM_SECTION4); -} - -#if defined MT_ABILITIES_MAIN2 -void vSpamCombineAbilities(int tank, int type, const float random, const char[] combo) -#else -public void MT_OnCombineAbilities(int tank, int type, const float random, const char[] combo, int survivor, int weapon, const char[] classname) -#endif -{ - if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esSpamCache[tank].g_iHumanAbility != 2) - { - g_esSpamAbility[g_esSpamPlayer[tank].g_iTankTypeRecorded].g_iComboPosition = -1; - - return; - } - - g_esSpamAbility[g_esSpamPlayer[tank].g_iTankTypeRecorded].g_iComboPosition = -1; - - char sCombo[320], sSet[4][32]; - FormatEx(sCombo, sizeof sCombo, ",%s,", combo); - FormatEx(sSet[0], sizeof sSet[], ",%s,", MT_SPAM_SECTION); - FormatEx(sSet[1], sizeof sSet[], ",%s,", MT_SPAM_SECTION2); - FormatEx(sSet[2], sizeof sSet[], ",%s,", MT_SPAM_SECTION3); - FormatEx(sSet[3], sizeof sSet[], ",%s,", MT_SPAM_SECTION4); - if (StrContains(sCombo, sSet[0], false) != -1 || StrContains(sCombo, sSet[1], false) != -1 || StrContains(sCombo, sSet[2], false) != -1 || StrContains(sCombo, sSet[3], false) != -1) - { - if (type == MT_COMBO_MAINRANGE && g_esSpamCache[tank].g_iSpamAbility == 1 && g_esSpamCache[tank].g_iComboAbility == 1 && !g_esSpamPlayer[tank].g_bActivated) - { - char sAbilities[320], sSubset[10][32]; - strcopy(sAbilities, sizeof sAbilities, combo); - ExplodeString(sAbilities, ",", sSubset, sizeof sSubset, sizeof sSubset[]); - - float flDelay = 0.0; - for (int iPos = 0; iPos < (sizeof sSubset); iPos++) - { - if (StrEqual(sSubset[iPos], MT_SPAM_SECTION, false) || StrEqual(sSubset[iPos], MT_SPAM_SECTION2, false) || StrEqual(sSubset[iPos], MT_SPAM_SECTION3, false) || StrEqual(sSubset[iPos], MT_SPAM_SECTION4, false)) - { - g_esSpamAbility[g_esSpamPlayer[tank].g_iTankTypeRecorded].g_iComboPosition = iPos; - - if (random <= MT_GetCombinationSetting(tank, 1, iPos)) - { - flDelay = MT_GetCombinationSetting(tank, 4, iPos); - - switch (flDelay) - { - case 0.0: vSpam(tank, iPos); - default: - { - DataPack dpCombo; - CreateDataTimer(flDelay, tTimerSpamCombo, dpCombo, TIMER_FLAG_NO_MAPCHANGE); - dpCombo.WriteCell(GetClientUserId(tank)); - dpCombo.WriteCell(iPos); - } - } - } - - break; - } - } - } - } -} - -#if defined MT_ABILITIES_MAIN2 -void vSpamConfigsLoad(int mode) -#else -public void MT_OnConfigsLoad(int mode) -#endif -{ - switch (mode) - { - case 1: - { - for (int iIndex = MT_GetMinType(); iIndex <= MT_GetMaxType(); iIndex++) - { - g_esSpamAbility[iIndex].g_iAccessFlags = 0; - g_esSpamAbility[iIndex].g_iImmunityFlags = 0; - g_esSpamAbility[iIndex].g_flCloseAreasOnly = 0.0; - g_esSpamAbility[iIndex].g_iComboAbility = 0; - g_esSpamAbility[iIndex].g_iComboPosition = -1; - g_esSpamAbility[iIndex].g_iHumanAbility = 0; - g_esSpamAbility[iIndex].g_iHumanAmmo = 5; - g_esSpamAbility[iIndex].g_iHumanCooldown = 0; - g_esSpamAbility[iIndex].g_iHumanDuration = 5; - g_esSpamAbility[iIndex].g_iHumanMode = 1; - g_esSpamAbility[iIndex].g_flOpenAreasOnly = 0.0; - g_esSpamAbility[iIndex].g_iRequiresHumans = 0; - g_esSpamAbility[iIndex].g_iSpamAbility = 0; - g_esSpamAbility[iIndex].g_iSpamMessage = 0; - g_esSpamAbility[iIndex].g_flSpamChance = 33.3; - g_esSpamAbility[iIndex].g_iSpamCooldown = 0; - g_esSpamAbility[iIndex].g_iSpamDamage = 5; - g_esSpamAbility[iIndex].g_iSpamDuration = 5; - g_esSpamAbility[iIndex].g_flSpamInterval = 0.5; - - g_esSpamSpecial[iIndex].g_flCloseAreasOnly = -1.0; - g_esSpamSpecial[iIndex].g_iComboAbility = -1; - g_esSpamSpecial[iIndex].g_iHumanAbility = -1; - g_esSpamSpecial[iIndex].g_iHumanAmmo = -1; - g_esSpamSpecial[iIndex].g_iHumanCooldown = -1; - g_esSpamSpecial[iIndex].g_iHumanDuration = -1; - g_esSpamSpecial[iIndex].g_iHumanMode = -1; - g_esSpamSpecial[iIndex].g_flOpenAreasOnly = -1.0; - g_esSpamSpecial[iIndex].g_iRequiresHumans = -1; - g_esSpamSpecial[iIndex].g_iSpamAbility = -1; - g_esSpamSpecial[iIndex].g_iSpamMessage = -1; - g_esSpamSpecial[iIndex].g_flSpamChance = -1.0; - g_esSpamSpecial[iIndex].g_iSpamCooldown = -1; - g_esSpamSpecial[iIndex].g_iSpamDamage = -1; - g_esSpamSpecial[iIndex].g_iSpamDuration = -1; - g_esSpamSpecial[iIndex].g_flSpamInterval = -1.0; - } - } - case 3: - { - for (int iPlayer = 1; iPlayer <= MaxClients; iPlayer++) - { - g_esSpamPlayer[iPlayer].g_iAccessFlags = -1; - g_esSpamPlayer[iPlayer].g_iImmunityFlags = -1; - g_esSpamPlayer[iPlayer].g_flCloseAreasOnly = -1.0; - g_esSpamPlayer[iPlayer].g_iComboAbility = -1; - g_esSpamPlayer[iPlayer].g_iHumanAbility = -1; - g_esSpamPlayer[iPlayer].g_iHumanAmmo = -1; - g_esSpamPlayer[iPlayer].g_iHumanCooldown = -1; - g_esSpamPlayer[iPlayer].g_iHumanDuration = -1; - g_esSpamPlayer[iPlayer].g_iHumanMode = -1; - g_esSpamPlayer[iPlayer].g_flOpenAreasOnly = -1.0; - g_esSpamPlayer[iPlayer].g_iRequiresHumans = -1; - g_esSpamPlayer[iPlayer].g_iSpamAbility = -1; - g_esSpamPlayer[iPlayer].g_iSpamMessage = -1; - g_esSpamPlayer[iPlayer].g_flSpamChance = -1.0; - g_esSpamPlayer[iPlayer].g_iSpamCooldown = -1; - g_esSpamPlayer[iPlayer].g_iSpamDamage = -1; - g_esSpamPlayer[iPlayer].g_iSpamDuration = -1; - g_esSpamPlayer[iPlayer].g_flSpamInterval = -1.0; - - g_esSpamTeammate[iPlayer].g_flCloseAreasOnly = -1.0; - g_esSpamTeammate[iPlayer].g_iComboAbility = -1; - g_esSpamTeammate[iPlayer].g_iHumanAbility = -1; - g_esSpamTeammate[iPlayer].g_iHumanAmmo = -1; - g_esSpamTeammate[iPlayer].g_iHumanCooldown = -1; - g_esSpamTeammate[iPlayer].g_iHumanDuration = -1; - g_esSpamTeammate[iPlayer].g_iHumanMode = -1; - g_esSpamTeammate[iPlayer].g_flOpenAreasOnly = -1.0; - g_esSpamTeammate[iPlayer].g_iRequiresHumans = -1; - g_esSpamTeammate[iPlayer].g_iSpamAbility = -1; - g_esSpamTeammate[iPlayer].g_iSpamMessage = -1; - g_esSpamTeammate[iPlayer].g_flSpamChance = -1.0; - g_esSpamTeammate[iPlayer].g_iSpamCooldown = -1; - g_esSpamTeammate[iPlayer].g_iSpamDamage = -1; - g_esSpamTeammate[iPlayer].g_iSpamDuration = -1; - g_esSpamTeammate[iPlayer].g_flSpamInterval = -1.0; - } - } - } -} - -#if defined MT_ABILITIES_MAIN2 -void vSpamConfigsLoaded(const char[] subsection, const char[] key, const char[] value, int type, int admin, int mode, bool special, const char[] specsection) -#else -public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const char[] value, int type, int admin, int mode, bool special, const char[] specsection) -#endif -{ - if ((mode == -1 || mode == 3) && bIsValidClient(admin)) - { - if (special && specsection[0] != '\0') - { - g_esSpamTeammate[admin].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_SPAM_SECTION, MT_SPAM_SECTION2, MT_SPAM_SECTION3, MT_SPAM_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esSpamTeammate[admin].g_flCloseAreasOnly, value, -1.0, 99999.0); - g_esSpamTeammate[admin].g_iComboAbility = iGetKeyValue(subsection, MT_SPAM_SECTION, MT_SPAM_SECTION2, MT_SPAM_SECTION3, MT_SPAM_SECTION4, key, "ComboAbility", "Combo Ability", "Combo_Ability", "combo", g_esSpamTeammate[admin].g_iComboAbility, value, -1, 1); - g_esSpamTeammate[admin].g_iHumanAbility = iGetKeyValue(subsection, MT_SPAM_SECTION, MT_SPAM_SECTION2, MT_SPAM_SECTION3, MT_SPAM_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esSpamTeammate[admin].g_iHumanAbility, value, -1, 2); - g_esSpamTeammate[admin].g_iHumanAmmo = iGetKeyValue(subsection, MT_SPAM_SECTION, MT_SPAM_SECTION2, MT_SPAM_SECTION3, MT_SPAM_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esSpamTeammate[admin].g_iHumanAmmo, value, -1, 99999); - g_esSpamTeammate[admin].g_iHumanCooldown = iGetKeyValue(subsection, MT_SPAM_SECTION, MT_SPAM_SECTION2, MT_SPAM_SECTION3, MT_SPAM_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esSpamTeammate[admin].g_iHumanCooldown, value, -1, 99999); - g_esSpamTeammate[admin].g_iHumanDuration = iGetKeyValue(subsection, MT_SPAM_SECTION, MT_SPAM_SECTION2, MT_SPAM_SECTION3, MT_SPAM_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esSpamTeammate[admin].g_iHumanDuration, value, -1, 99999); - g_esSpamTeammate[admin].g_iHumanMode = iGetKeyValue(subsection, MT_SPAM_SECTION, MT_SPAM_SECTION2, MT_SPAM_SECTION3, MT_SPAM_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esSpamTeammate[admin].g_iHumanMode, value, -1, 1); - g_esSpamTeammate[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_SPAM_SECTION, MT_SPAM_SECTION2, MT_SPAM_SECTION3, MT_SPAM_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esSpamTeammate[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); - g_esSpamTeammate[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_SPAM_SECTION, MT_SPAM_SECTION2, MT_SPAM_SECTION3, MT_SPAM_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esSpamTeammate[admin].g_iRequiresHumans, value, -1, 32); - g_esSpamTeammate[admin].g_iSpamAbility = iGetKeyValue(subsection, MT_SPAM_SECTION, MT_SPAM_SECTION2, MT_SPAM_SECTION3, MT_SPAM_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esSpamTeammate[admin].g_iSpamAbility, value, -1, 1); - g_esSpamTeammate[admin].g_iSpamMessage = iGetKeyValue(subsection, MT_SPAM_SECTION, MT_SPAM_SECTION2, MT_SPAM_SECTION3, MT_SPAM_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esSpamTeammate[admin].g_iSpamMessage, value, -1, 1); - g_esSpamTeammate[admin].g_flSpamChance = flGetKeyValue(subsection, MT_SPAM_SECTION, MT_SPAM_SECTION2, MT_SPAM_SECTION3, MT_SPAM_SECTION4, key, "SpamChance", "Spam Chance", "Spam_Chance", "chance", g_esSpamTeammate[admin].g_flSpamChance, value, -1.0, 100.0); - g_esSpamTeammate[admin].g_iSpamCooldown = iGetKeyValue(subsection, MT_SPAM_SECTION, MT_SPAM_SECTION2, MT_SPAM_SECTION3, MT_SPAM_SECTION4, key, "SpamCooldown", "Spam Cooldown", "Spam_Cooldown", "cooldown", g_esSpamTeammate[admin].g_iSpamCooldown, value, -1, 99999); - g_esSpamTeammate[admin].g_iSpamDamage = iGetKeyValue(subsection, MT_SPAM_SECTION, MT_SPAM_SECTION2, MT_SPAM_SECTION3, MT_SPAM_SECTION4, key, "SpamDamage", "Spam Damage", "Spam_Damage", "damage", g_esSpamTeammate[admin].g_iSpamDamage, value, -1, 99999); - g_esSpamTeammate[admin].g_iSpamDuration = iGetKeyValue(subsection, MT_SPAM_SECTION, MT_SPAM_SECTION2, MT_SPAM_SECTION3, MT_SPAM_SECTION4, key, "SpamDuration", "Spam Duration", "Spam_Duration", "duration", g_esSpamTeammate[admin].g_iSpamDuration, value, -1, 99999); - g_esSpamTeammate[admin].g_flSpamInterval = flGetKeyValue(subsection, MT_SPAM_SECTION, MT_SPAM_SECTION2, MT_SPAM_SECTION3, MT_SPAM_SECTION4, key, "SpamInterval", "Spam Interval", "Spam_Interval", "interval", g_esSpamTeammate[admin].g_flSpamInterval, value, -1.0, 1.0); - } - else - { - g_esSpamPlayer[admin].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_SPAM_SECTION, MT_SPAM_SECTION2, MT_SPAM_SECTION3, MT_SPAM_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esSpamPlayer[admin].g_flCloseAreasOnly, value, -1.0, 99999.0); - g_esSpamPlayer[admin].g_iComboAbility = iGetKeyValue(subsection, MT_SPAM_SECTION, MT_SPAM_SECTION2, MT_SPAM_SECTION3, MT_SPAM_SECTION4, key, "ComboAbility", "Combo Ability", "Combo_Ability", "combo", g_esSpamPlayer[admin].g_iComboAbility, value, -1, 1); - g_esSpamPlayer[admin].g_iHumanAbility = iGetKeyValue(subsection, MT_SPAM_SECTION, MT_SPAM_SECTION2, MT_SPAM_SECTION3, MT_SPAM_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esSpamPlayer[admin].g_iHumanAbility, value, -1, 2); - g_esSpamPlayer[admin].g_iHumanAmmo = iGetKeyValue(subsection, MT_SPAM_SECTION, MT_SPAM_SECTION2, MT_SPAM_SECTION3, MT_SPAM_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esSpamPlayer[admin].g_iHumanAmmo, value, -1, 99999); - g_esSpamPlayer[admin].g_iHumanCooldown = iGetKeyValue(subsection, MT_SPAM_SECTION, MT_SPAM_SECTION2, MT_SPAM_SECTION3, MT_SPAM_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esSpamPlayer[admin].g_iHumanCooldown, value, -1, 99999); - g_esSpamPlayer[admin].g_iHumanDuration = iGetKeyValue(subsection, MT_SPAM_SECTION, MT_SPAM_SECTION2, MT_SPAM_SECTION3, MT_SPAM_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esSpamPlayer[admin].g_iHumanDuration, value, -1, 99999); - g_esSpamPlayer[admin].g_iHumanMode = iGetKeyValue(subsection, MT_SPAM_SECTION, MT_SPAM_SECTION2, MT_SPAM_SECTION3, MT_SPAM_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esSpamPlayer[admin].g_iHumanMode, value, -1, 1); - g_esSpamPlayer[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_SPAM_SECTION, MT_SPAM_SECTION2, MT_SPAM_SECTION3, MT_SPAM_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esSpamPlayer[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); - g_esSpamPlayer[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_SPAM_SECTION, MT_SPAM_SECTION2, MT_SPAM_SECTION3, MT_SPAM_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esSpamPlayer[admin].g_iRequiresHumans, value, -1, 32); - g_esSpamPlayer[admin].g_iSpamAbility = iGetKeyValue(subsection, MT_SPAM_SECTION, MT_SPAM_SECTION2, MT_SPAM_SECTION3, MT_SPAM_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esSpamPlayer[admin].g_iSpamAbility, value, -1, 1); - g_esSpamPlayer[admin].g_iSpamMessage = iGetKeyValue(subsection, MT_SPAM_SECTION, MT_SPAM_SECTION2, MT_SPAM_SECTION3, MT_SPAM_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esSpamPlayer[admin].g_iSpamMessage, value, -1, 1); - g_esSpamPlayer[admin].g_flSpamChance = flGetKeyValue(subsection, MT_SPAM_SECTION, MT_SPAM_SECTION2, MT_SPAM_SECTION3, MT_SPAM_SECTION4, key, "SpamChance", "Spam Chance", "Spam_Chance", "chance", g_esSpamPlayer[admin].g_flSpamChance, value, -1.0, 100.0); - g_esSpamPlayer[admin].g_iSpamCooldown = iGetKeyValue(subsection, MT_SPAM_SECTION, MT_SPAM_SECTION2, MT_SPAM_SECTION3, MT_SPAM_SECTION4, key, "SpamCooldown", "Spam Cooldown", "Spam_Cooldown", "cooldown", g_esSpamPlayer[admin].g_iSpamCooldown, value, -1, 99999); - g_esSpamPlayer[admin].g_iSpamDamage = iGetKeyValue(subsection, MT_SPAM_SECTION, MT_SPAM_SECTION2, MT_SPAM_SECTION3, MT_SPAM_SECTION4, key, "SpamDamage", "Spam Damage", "Spam_Damage", "damage", g_esSpamPlayer[admin].g_iSpamDamage, value, -1, 99999); - g_esSpamPlayer[admin].g_iSpamDuration = iGetKeyValue(subsection, MT_SPAM_SECTION, MT_SPAM_SECTION2, MT_SPAM_SECTION3, MT_SPAM_SECTION4, key, "SpamDuration", "Spam Duration", "Spam_Duration", "duration", g_esSpamPlayer[admin].g_iSpamDuration, value, -1, 99999); - g_esSpamPlayer[admin].g_flSpamInterval = flGetKeyValue(subsection, MT_SPAM_SECTION, MT_SPAM_SECTION2, MT_SPAM_SECTION3, MT_SPAM_SECTION4, key, "SpamInterval", "Spam Interval", "Spam_Interval", "interval", g_esSpamPlayer[admin].g_flSpamInterval, value, -1.0, 1.0); - g_esSpamPlayer[admin].g_iAccessFlags = iGetAdminFlagsValue(subsection, MT_SPAM_SECTION, MT_SPAM_SECTION2, MT_SPAM_SECTION3, MT_SPAM_SECTION4, key, "AccessFlags", "Access Flags", "Access_Flags", "access", value); - g_esSpamPlayer[admin].g_iImmunityFlags = iGetAdminFlagsValue(subsection, MT_SPAM_SECTION, MT_SPAM_SECTION2, MT_SPAM_SECTION3, MT_SPAM_SECTION4, key, "ImmunityFlags", "Immunity Flags", "Immunity_Flags", "immunity", value); - } - } - - if (mode < 3 && type > 0) - { - if (special && specsection[0] != '\0') - { - g_esSpamSpecial[type].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_SPAM_SECTION, MT_SPAM_SECTION2, MT_SPAM_SECTION3, MT_SPAM_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esSpamSpecial[type].g_flCloseAreasOnly, value, -1.0, 99999.0); - g_esSpamSpecial[type].g_iComboAbility = iGetKeyValue(subsection, MT_SPAM_SECTION, MT_SPAM_SECTION2, MT_SPAM_SECTION3, MT_SPAM_SECTION4, key, "ComboAbility", "Combo Ability", "Combo_Ability", "combo", g_esSpamSpecial[type].g_iComboAbility, value, -1, 1); - g_esSpamSpecial[type].g_iHumanAbility = iGetKeyValue(subsection, MT_SPAM_SECTION, MT_SPAM_SECTION2, MT_SPAM_SECTION3, MT_SPAM_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esSpamSpecial[type].g_iHumanAbility, value, -1, 2); - g_esSpamSpecial[type].g_iHumanAmmo = iGetKeyValue(subsection, MT_SPAM_SECTION, MT_SPAM_SECTION2, MT_SPAM_SECTION3, MT_SPAM_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esSpamSpecial[type].g_iHumanAmmo, value, -1, 99999); - g_esSpamSpecial[type].g_iHumanCooldown = iGetKeyValue(subsection, MT_SPAM_SECTION, MT_SPAM_SECTION2, MT_SPAM_SECTION3, MT_SPAM_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esSpamSpecial[type].g_iHumanCooldown, value, -1, 99999); - g_esSpamSpecial[type].g_iHumanDuration = iGetKeyValue(subsection, MT_SPAM_SECTION, MT_SPAM_SECTION2, MT_SPAM_SECTION3, MT_SPAM_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esSpamSpecial[type].g_iHumanDuration, value, -1, 99999); - g_esSpamSpecial[type].g_iHumanMode = iGetKeyValue(subsection, MT_SPAM_SECTION, MT_SPAM_SECTION2, MT_SPAM_SECTION3, MT_SPAM_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esSpamSpecial[type].g_iHumanMode, value, -1, 1); - g_esSpamSpecial[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_SPAM_SECTION, MT_SPAM_SECTION2, MT_SPAM_SECTION3, MT_SPAM_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esSpamSpecial[type].g_flOpenAreasOnly, value, -1.0, 99999.0); - g_esSpamSpecial[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_SPAM_SECTION, MT_SPAM_SECTION2, MT_SPAM_SECTION3, MT_SPAM_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esSpamSpecial[type].g_iRequiresHumans, value, -1, 32); - g_esSpamSpecial[type].g_iSpamAbility = iGetKeyValue(subsection, MT_SPAM_SECTION, MT_SPAM_SECTION2, MT_SPAM_SECTION3, MT_SPAM_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esSpamSpecial[type].g_iSpamAbility, value, -1, 1); - g_esSpamSpecial[type].g_iSpamMessage = iGetKeyValue(subsection, MT_SPAM_SECTION, MT_SPAM_SECTION2, MT_SPAM_SECTION3, MT_SPAM_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esSpamSpecial[type].g_iSpamMessage, value, -1, 1); - g_esSpamSpecial[type].g_flSpamChance = flGetKeyValue(subsection, MT_SPAM_SECTION, MT_SPAM_SECTION2, MT_SPAM_SECTION3, MT_SPAM_SECTION4, key, "SpamChance", "Spam Chance", "Spam_Chance", "chance", g_esSpamSpecial[type].g_flSpamChance, value, -1.0, 100.0); - g_esSpamSpecial[type].g_iSpamCooldown = iGetKeyValue(subsection, MT_SPAM_SECTION, MT_SPAM_SECTION2, MT_SPAM_SECTION3, MT_SPAM_SECTION4, key, "SpamCooldown", "Spam Cooldown", "Spam_Cooldown", "cooldown", g_esSpamSpecial[type].g_iSpamCooldown, value, -1, 99999); - g_esSpamSpecial[type].g_iSpamDamage = iGetKeyValue(subsection, MT_SPAM_SECTION, MT_SPAM_SECTION2, MT_SPAM_SECTION3, MT_SPAM_SECTION4, key, "SpamDamage", "Spam Damage", "Spam_Damage", "damage", g_esSpamSpecial[type].g_iSpamDamage, value, -1, 99999); - g_esSpamSpecial[type].g_iSpamDuration = iGetKeyValue(subsection, MT_SPAM_SECTION, MT_SPAM_SECTION2, MT_SPAM_SECTION3, MT_SPAM_SECTION4, key, "SpamDuration", "Spam Duration", "Spam_Duration", "duration", g_esSpamSpecial[type].g_iSpamDuration, value, -1, 99999); - g_esSpamSpecial[type].g_flSpamInterval = flGetKeyValue(subsection, MT_SPAM_SECTION, MT_SPAM_SECTION2, MT_SPAM_SECTION3, MT_SPAM_SECTION4, key, "SpamInterval", "Spam Interval", "Spam_Interval", "interval", g_esSpamSpecial[type].g_flSpamInterval, value, -1.0, 1.0); - } - else - { - g_esSpamAbility[type].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_SPAM_SECTION, MT_SPAM_SECTION2, MT_SPAM_SECTION3, MT_SPAM_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esSpamAbility[type].g_flCloseAreasOnly, value, -1.0, 99999.0); - g_esSpamAbility[type].g_iComboAbility = iGetKeyValue(subsection, MT_SPAM_SECTION, MT_SPAM_SECTION2, MT_SPAM_SECTION3, MT_SPAM_SECTION4, key, "ComboAbility", "Combo Ability", "Combo_Ability", "combo", g_esSpamAbility[type].g_iComboAbility, value, -1, 1); - g_esSpamAbility[type].g_iHumanAbility = iGetKeyValue(subsection, MT_SPAM_SECTION, MT_SPAM_SECTION2, MT_SPAM_SECTION3, MT_SPAM_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esSpamAbility[type].g_iHumanAbility, value, -1, 2); - g_esSpamAbility[type].g_iHumanAmmo = iGetKeyValue(subsection, MT_SPAM_SECTION, MT_SPAM_SECTION2, MT_SPAM_SECTION3, MT_SPAM_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esSpamAbility[type].g_iHumanAmmo, value, -1, 99999); - g_esSpamAbility[type].g_iHumanCooldown = iGetKeyValue(subsection, MT_SPAM_SECTION, MT_SPAM_SECTION2, MT_SPAM_SECTION3, MT_SPAM_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esSpamAbility[type].g_iHumanCooldown, value, -1, 99999); - g_esSpamAbility[type].g_iHumanDuration = iGetKeyValue(subsection, MT_SPAM_SECTION, MT_SPAM_SECTION2, MT_SPAM_SECTION3, MT_SPAM_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esSpamAbility[type].g_iHumanDuration, value, -1, 99999); - g_esSpamAbility[type].g_iHumanMode = iGetKeyValue(subsection, MT_SPAM_SECTION, MT_SPAM_SECTION2, MT_SPAM_SECTION3, MT_SPAM_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esSpamAbility[type].g_iHumanMode, value, -1, 1); - g_esSpamAbility[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_SPAM_SECTION, MT_SPAM_SECTION2, MT_SPAM_SECTION3, MT_SPAM_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esSpamAbility[type].g_flOpenAreasOnly, value, -1.0, 99999.0); - g_esSpamAbility[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_SPAM_SECTION, MT_SPAM_SECTION2, MT_SPAM_SECTION3, MT_SPAM_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esSpamAbility[type].g_iRequiresHumans, value, -1, 32); - g_esSpamAbility[type].g_iSpamAbility = iGetKeyValue(subsection, MT_SPAM_SECTION, MT_SPAM_SECTION2, MT_SPAM_SECTION3, MT_SPAM_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esSpamAbility[type].g_iSpamAbility, value, -1, 1); - g_esSpamAbility[type].g_iSpamMessage = iGetKeyValue(subsection, MT_SPAM_SECTION, MT_SPAM_SECTION2, MT_SPAM_SECTION3, MT_SPAM_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esSpamAbility[type].g_iSpamMessage, value, -1, 1); - g_esSpamAbility[type].g_flSpamChance = flGetKeyValue(subsection, MT_SPAM_SECTION, MT_SPAM_SECTION2, MT_SPAM_SECTION3, MT_SPAM_SECTION4, key, "SpamChance", "Spam Chance", "Spam_Chance", "chance", g_esSpamAbility[type].g_flSpamChance, value, -1.0, 100.0); - g_esSpamAbility[type].g_iSpamCooldown = iGetKeyValue(subsection, MT_SPAM_SECTION, MT_SPAM_SECTION2, MT_SPAM_SECTION3, MT_SPAM_SECTION4, key, "SpamCooldown", "Spam Cooldown", "Spam_Cooldown", "cooldown", g_esSpamAbility[type].g_iSpamCooldown, value, -1, 99999); - g_esSpamAbility[type].g_iSpamDamage = iGetKeyValue(subsection, MT_SPAM_SECTION, MT_SPAM_SECTION2, MT_SPAM_SECTION3, MT_SPAM_SECTION4, key, "SpamDamage", "Spam Damage", "Spam_Damage", "damage", g_esSpamAbility[type].g_iSpamDamage, value, -1, 99999); - g_esSpamAbility[type].g_iSpamDuration = iGetKeyValue(subsection, MT_SPAM_SECTION, MT_SPAM_SECTION2, MT_SPAM_SECTION3, MT_SPAM_SECTION4, key, "SpamDuration", "Spam Duration", "Spam_Duration", "duration", g_esSpamAbility[type].g_iSpamDuration, value, -1, 99999); - g_esSpamAbility[type].g_flSpamInterval = flGetKeyValue(subsection, MT_SPAM_SECTION, MT_SPAM_SECTION2, MT_SPAM_SECTION3, MT_SPAM_SECTION4, key, "SpamInterval", "Spam Interval", "Spam_Interval", "interval", g_esSpamAbility[type].g_flSpamInterval, value, -1.0, 1.0); - g_esSpamAbility[type].g_iAccessFlags = iGetAdminFlagsValue(subsection, MT_SPAM_SECTION, MT_SPAM_SECTION2, MT_SPAM_SECTION3, MT_SPAM_SECTION4, key, "AccessFlags", "Access Flags", "Access_Flags", "access", value); - g_esSpamAbility[type].g_iImmunityFlags = iGetAdminFlagsValue(subsection, MT_SPAM_SECTION, MT_SPAM_SECTION2, MT_SPAM_SECTION3, MT_SPAM_SECTION4, key, "ImmunityFlags", "Immunity Flags", "Immunity_Flags", "immunity", value); - } - } -} - -#if defined MT_ABILITIES_MAIN2 -void vSpamSettingsCached(int tank, bool apply, int type) -#else -public void MT_OnSettingsCached(int tank, bool apply, int type) -#endif -{ - bool bHuman = bIsValidClient(tank, MT_CHECK_FAKECLIENT); - g_esSpamPlayer[tank].g_iTankTypeRecorded = apply ? MT_GetRecordedTankType(tank, type) : 0; - g_esSpamPlayer[tank].g_iTankType = apply ? type : 0; - int iType = g_esSpamPlayer[tank].g_iTankTypeRecorded; - - if (bIsSpecialInfected(tank, MT_CHECK_INDEX|MT_CHECK_INGAME)) - { - g_esSpamCache[tank].g_flCloseAreasOnly = flGetSubSettingValue(apply, bHuman, g_esSpamTeammate[tank].g_flCloseAreasOnly, g_esSpamPlayer[tank].g_flCloseAreasOnly, g_esSpamSpecial[iType].g_flCloseAreasOnly, g_esSpamAbility[iType].g_flCloseAreasOnly, 1); - g_esSpamCache[tank].g_iComboAbility = iGetSubSettingValue(apply, bHuman, g_esSpamTeammate[tank].g_iComboAbility, g_esSpamPlayer[tank].g_iComboAbility, g_esSpamSpecial[iType].g_iComboAbility, g_esSpamAbility[iType].g_iComboAbility, 1); - g_esSpamCache[tank].g_flSpamChance = flGetSubSettingValue(apply, bHuman, g_esSpamTeammate[tank].g_flSpamChance, g_esSpamPlayer[tank].g_flSpamChance, g_esSpamSpecial[iType].g_flSpamChance, g_esSpamAbility[iType].g_flSpamChance, 1); - g_esSpamCache[tank].g_flSpamInterval = flGetSubSettingValue(apply, bHuman, g_esSpamTeammate[tank].g_flSpamInterval, g_esSpamPlayer[tank].g_flSpamInterval, g_esSpamSpecial[iType].g_flSpamInterval, g_esSpamAbility[iType].g_flSpamInterval, 1); - g_esSpamCache[tank].g_iHumanAbility = iGetSubSettingValue(apply, bHuman, g_esSpamTeammate[tank].g_iHumanAbility, g_esSpamPlayer[tank].g_iHumanAbility, g_esSpamSpecial[iType].g_iHumanAbility, g_esSpamAbility[iType].g_iHumanAbility, 1); - g_esSpamCache[tank].g_iHumanAmmo = iGetSubSettingValue(apply, bHuman, g_esSpamTeammate[tank].g_iHumanAmmo, g_esSpamPlayer[tank].g_iHumanAmmo, g_esSpamSpecial[iType].g_iHumanAmmo, g_esSpamAbility[iType].g_iHumanAmmo, 1); - g_esSpamCache[tank].g_iHumanCooldown = iGetSubSettingValue(apply, bHuman, g_esSpamTeammate[tank].g_iHumanCooldown, g_esSpamPlayer[tank].g_iHumanCooldown, g_esSpamSpecial[iType].g_iHumanCooldown, g_esSpamAbility[iType].g_iHumanCooldown, 1); - g_esSpamCache[tank].g_iHumanDuration = iGetSubSettingValue(apply, bHuman, g_esSpamTeammate[tank].g_iHumanDuration, g_esSpamPlayer[tank].g_iHumanDuration, g_esSpamSpecial[iType].g_iHumanDuration, g_esSpamAbility[iType].g_iHumanDuration, 1); - g_esSpamCache[tank].g_iHumanMode = iGetSubSettingValue(apply, bHuman, g_esSpamTeammate[tank].g_iHumanMode, g_esSpamPlayer[tank].g_iHumanMode, g_esSpamSpecial[iType].g_iHumanMode, g_esSpamAbility[iType].g_iHumanMode, 1); - g_esSpamCache[tank].g_flOpenAreasOnly = flGetSubSettingValue(apply, bHuman, g_esSpamTeammate[tank].g_flOpenAreasOnly, g_esSpamPlayer[tank].g_flOpenAreasOnly, g_esSpamSpecial[iType].g_flOpenAreasOnly, g_esSpamAbility[iType].g_flOpenAreasOnly, 1); - g_esSpamCache[tank].g_iRequiresHumans = iGetSubSettingValue(apply, bHuman, g_esSpamTeammate[tank].g_iRequiresHumans, g_esSpamPlayer[tank].g_iRequiresHumans, g_esSpamSpecial[iType].g_iRequiresHumans, g_esSpamAbility[iType].g_iRequiresHumans, 1); - g_esSpamCache[tank].g_iSpamAbility = iGetSubSettingValue(apply, bHuman, g_esSpamTeammate[tank].g_iSpamAbility, g_esSpamPlayer[tank].g_iSpamAbility, g_esSpamSpecial[iType].g_iSpamAbility, g_esSpamAbility[iType].g_iSpamAbility, 1); - g_esSpamCache[tank].g_iSpamCooldown = iGetSubSettingValue(apply, bHuman, g_esSpamTeammate[tank].g_iSpamCooldown, g_esSpamPlayer[tank].g_iSpamCooldown, g_esSpamSpecial[iType].g_iSpamCooldown, g_esSpamAbility[iType].g_iSpamCooldown, 1); - g_esSpamCache[tank].g_iSpamDamage = iGetSubSettingValue(apply, bHuman, g_esSpamTeammate[tank].g_iSpamDamage, g_esSpamPlayer[tank].g_iSpamDamage, g_esSpamSpecial[iType].g_iSpamDamage, g_esSpamAbility[iType].g_iSpamDamage, 1); - g_esSpamCache[tank].g_iSpamDuration = iGetSubSettingValue(apply, bHuman, g_esSpamTeammate[tank].g_iSpamDuration, g_esSpamPlayer[tank].g_iSpamDuration, g_esSpamSpecial[iType].g_iSpamDuration, g_esSpamAbility[iType].g_iSpamDuration, 1); - g_esSpamCache[tank].g_iSpamMessage = iGetSubSettingValue(apply, bHuman, g_esSpamTeammate[tank].g_iSpamMessage, g_esSpamPlayer[tank].g_iSpamMessage, g_esSpamSpecial[iType].g_iSpamMessage, g_esSpamAbility[iType].g_iSpamMessage, 1); - } - else - { - g_esSpamCache[tank].g_flCloseAreasOnly = flGetSettingValue(apply, bHuman, g_esSpamPlayer[tank].g_flCloseAreasOnly, g_esSpamAbility[iType].g_flCloseAreasOnly, 1); - g_esSpamCache[tank].g_iComboAbility = iGetSettingValue(apply, bHuman, g_esSpamPlayer[tank].g_iComboAbility, g_esSpamAbility[iType].g_iComboAbility, 1); - g_esSpamCache[tank].g_flSpamChance = flGetSettingValue(apply, bHuman, g_esSpamPlayer[tank].g_flSpamChance, g_esSpamAbility[iType].g_flSpamChance, 1); - g_esSpamCache[tank].g_flSpamInterval = flGetSettingValue(apply, bHuman, g_esSpamPlayer[tank].g_flSpamInterval, g_esSpamAbility[iType].g_flSpamInterval, 1); - g_esSpamCache[tank].g_iHumanAbility = iGetSettingValue(apply, bHuman, g_esSpamPlayer[tank].g_iHumanAbility, g_esSpamAbility[iType].g_iHumanAbility, 1); - g_esSpamCache[tank].g_iHumanAmmo = iGetSettingValue(apply, bHuman, g_esSpamPlayer[tank].g_iHumanAmmo, g_esSpamAbility[iType].g_iHumanAmmo, 1); - g_esSpamCache[tank].g_iHumanCooldown = iGetSettingValue(apply, bHuman, g_esSpamPlayer[tank].g_iHumanCooldown, g_esSpamAbility[iType].g_iHumanCooldown, 1); - g_esSpamCache[tank].g_iHumanDuration = iGetSettingValue(apply, bHuman, g_esSpamPlayer[tank].g_iHumanDuration, g_esSpamAbility[iType].g_iHumanDuration, 1); - g_esSpamCache[tank].g_iHumanMode = iGetSettingValue(apply, bHuman, g_esSpamPlayer[tank].g_iHumanMode, g_esSpamAbility[iType].g_iHumanMode, 1); - g_esSpamCache[tank].g_flOpenAreasOnly = flGetSettingValue(apply, bHuman, g_esSpamPlayer[tank].g_flOpenAreasOnly, g_esSpamAbility[iType].g_flOpenAreasOnly, 1); - g_esSpamCache[tank].g_iRequiresHumans = iGetSettingValue(apply, bHuman, g_esSpamPlayer[tank].g_iRequiresHumans, g_esSpamAbility[iType].g_iRequiresHumans, 1); - g_esSpamCache[tank].g_iSpamAbility = iGetSettingValue(apply, bHuman, g_esSpamPlayer[tank].g_iSpamAbility, g_esSpamAbility[iType].g_iSpamAbility, 1); - g_esSpamCache[tank].g_iSpamCooldown = iGetSettingValue(apply, bHuman, g_esSpamPlayer[tank].g_iSpamCooldown, g_esSpamAbility[iType].g_iSpamCooldown, 1); - g_esSpamCache[tank].g_iSpamDamage = iGetSettingValue(apply, bHuman, g_esSpamPlayer[tank].g_iSpamDamage, g_esSpamAbility[iType].g_iSpamDamage, 1); - g_esSpamCache[tank].g_iSpamDuration = iGetSettingValue(apply, bHuman, g_esSpamPlayer[tank].g_iSpamDuration, g_esSpamAbility[iType].g_iSpamDuration, 1); - g_esSpamCache[tank].g_iSpamMessage = iGetSettingValue(apply, bHuman, g_esSpamPlayer[tank].g_iSpamMessage, g_esSpamAbility[iType].g_iSpamMessage, 1); - } -} - -#if defined MT_ABILITIES_MAIN2 -void vSpamCopyStats(int oldTank, int newTank) -#else -public void MT_OnCopyStats(int oldTank, int newTank) -#endif -{ - vSpamCopyStats2(oldTank, newTank); - - if (oldTank != newTank) - { - vRemoveSpam(oldTank); - } -} - -#if !defined MT_ABILITIES_MAIN2 -public void MT_OnPluginUpdate() -{ - MT_ReloadPlugin(null); -} -#endif - -#if defined MT_ABILITIES_MAIN2 -void vSpamEventFired(Event event, const char[] name) -#else -public void MT_OnEventFired(Event event, const char[] name, bool dontBroadcast) -#endif -{ - if (StrEqual(name, "bot_player_replace")) - { - int iBotId = event.GetInt("bot"), iBot = GetClientOfUserId(iBotId), - iTankId = event.GetInt("player"), iTank = GetClientOfUserId(iTankId); - if (bIsValidClient(iBot) && bIsInfected(iTank)) - { - vSpamCopyStats2(iBot, iTank); - vRemoveSpam(iBot); - } - } - else if (StrEqual(name, "mission_lost") || StrEqual(name, "round_start") || StrEqual(name, "round_end")) - { - vSpamReset(); - } - else if (StrEqual(name, "player_bot_replace")) - { - int iTankId = event.GetInt("player"), iTank = GetClientOfUserId(iTankId), - iBotId = event.GetInt("bot"), iBot = GetClientOfUserId(iBotId); - if (bIsValidClient(iTank) && bIsInfected(iBot)) - { - vSpamCopyStats2(iTank, iBot); - vRemoveSpam(iTank); - } - } - else if (StrEqual(name, "player_death") || StrEqual(name, "player_spawn")) - { - int iTankId = event.GetInt("userid"), iTank = GetClientOfUserId(iTankId); - if (MT_IsTankSupported(iTank, MT_CHECK_INDEX|MT_CHECK_INGAME)) - { - vRemoveSpam(iTank); - } - } -} - -#if defined MT_ABILITIES_MAIN2 -void vSpamAbilityActivated(int tank) -#else -public void MT_OnAbilityActivated(int tank) -#endif -{ - if (MT_IsTankSupported(tank, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_FAKECLIENT) && ((!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esSpamAbility[g_esSpamPlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esSpamPlayer[tank].g_iAccessFlags)) || g_esSpamCache[tank].g_iHumanAbility == 0)) - { - return; - } - - if (MT_IsTankSupported(tank) && (!bIsInfected(tank, MT_CHECK_FAKECLIENT) || g_esSpamCache[tank].g_iHumanAbility != 1) && MT_IsCustomTankSupported(tank) && g_esSpamCache[tank].g_iSpamAbility == 1 && g_esSpamCache[tank].g_iComboAbility == 0 && !g_esSpamPlayer[tank].g_bActivated) - { - vSpamAbility(tank); - } -} - -#if defined MT_ABILITIES_MAIN2 -void vSpamButtonPressed(int tank, int button) -#else -public void MT_OnButtonPressed(int tank, int button) -#endif -{ - if (MT_IsTankSupported(tank, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_ALIVE|MT_CHECK_FAKECLIENT) && MT_IsCustomTankSupported(tank)) - { - if (bIsAreaNarrow(tank, g_esSpamCache[tank].g_flOpenAreasOnly) || bIsAreaWide(tank, g_esSpamCache[tank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esSpamPlayer[tank].g_iTankType, tank) || (g_esSpamCache[tank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esSpamCache[tank].g_iRequiresHumans) || (!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esSpamAbility[g_esSpamPlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esSpamPlayer[tank].g_iAccessFlags))) - { - return; - } - - if ((button & MT_MAIN_KEY) && g_esSpamCache[tank].g_iSpamAbility == 1 && g_esSpamCache[tank].g_iHumanAbility == 1) - { - int iTime = GetTime(); - bool bRecharging = g_esSpamPlayer[tank].g_iCooldown != -1 && g_esSpamPlayer[tank].g_iCooldown >= iTime; - - switch (g_esSpamCache[tank].g_iHumanMode) - { - case 0: - { - if (!g_esSpamPlayer[tank].g_bActivated && !bRecharging) - { - vSpamAbility(tank); - } - else if (g_esSpamPlayer[tank].g_bActivated) - { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "SpamHuman3"); - } - else if (bRecharging) - { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "SpamHuman4", (g_esSpamPlayer[tank].g_iCooldown - iTime)); - } - } - case 1: - { - if (g_esSpamPlayer[tank].g_iAmmoCount < g_esSpamCache[tank].g_iHumanAmmo && g_esSpamCache[tank].g_iHumanAmmo > 0) - { - if (!g_esSpamPlayer[tank].g_bActivated && !bRecharging) - { - g_esSpamPlayer[tank].g_bActivated = true; - g_esSpamPlayer[tank].g_iAmmoCount++; - - vSpam2(tank); - MT_PrintToChat(tank, "%s %t", MT_TAG3, "SpamHuman", g_esSpamPlayer[tank].g_iAmmoCount, g_esSpamCache[tank].g_iHumanAmmo); - } - else if (g_esSpamPlayer[tank].g_bActivated) - { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "SpamHuman3"); - } - else if (bRecharging) - { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "SpamHuman4", (g_esSpamPlayer[tank].g_iCooldown - iTime)); - } - } - else - { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "SpamAmmo"); - } - } - } - } - } -} - -#if defined MT_ABILITIES_MAIN2 -void vSpamButtonReleased(int tank, int button) -#else -public void MT_OnButtonReleased(int tank, int button) -#endif -{ - if (MT_IsTankSupported(tank, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_ALIVE|MT_CHECK_FAKECLIENT) && g_esSpamCache[tank].g_iHumanAbility == 1) - { - if ((button & MT_MAIN_KEY) && g_esSpamCache[tank].g_iHumanMode == 1 && g_esSpamPlayer[tank].g_bActivated && (g_esSpamPlayer[tank].g_iCooldown == -1 || g_esSpamPlayer[tank].g_iCooldown <= GetTime())) - { - vSpamReset2(tank); - vSpamReset3(tank); - } - } -} - -#if defined MT_ABILITIES_MAIN2 -void vSpamChangeType(int tank, int oldType) -#else -public void MT_OnChangeType(int tank, int oldType, int newType, bool revert) -#endif -{ - if (oldType <= 0) - { - return; - } - - vRemoveSpam(tank); -} - -void vSpam(int tank, int pos = -1) -{ - if (g_esSpamPlayer[tank].g_iCooldown != -1 && g_esSpamPlayer[tank].g_iCooldown >= GetTime()) - { - return; - } - - g_esSpamPlayer[tank].g_bActivated = true; - - vSpam2(tank, pos); - - if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esSpamCache[tank].g_iHumanAbility == 1) - { - g_esSpamPlayer[tank].g_iAmmoCount++; - - MT_PrintToChat(tank, "%s %t", MT_TAG3, "SpamHuman", g_esSpamPlayer[tank].g_iAmmoCount, g_esSpamCache[tank].g_iHumanAmmo); - } - - if (g_esSpamCache[tank].g_iSpamMessage == 1) - { - char sTankName[64]; - MT_GetTankName(tank, sTankName); - MT_PrintToChatAll("%s %t", MT_TAG2, "Spam", sTankName); - MT_LogMessage(MT_LOG_ABILITY, "%s %T", MT_TAG, "Spam", LANG_SERVER, sTankName); - } -} - -void vSpam2(int tank, int pos = -1) -{ - if (bIsAreaNarrow(tank, g_esSpamCache[tank].g_flOpenAreasOnly) || bIsAreaWide(tank, g_esSpamCache[tank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esSpamPlayer[tank].g_iTankType, tank) || (g_esSpamCache[tank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esSpamCache[tank].g_iRequiresHumans) || (!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esSpamAbility[g_esSpamPlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esSpamPlayer[tank].g_iAccessFlags))) - { - return; - } - - char sDamage[11]; - float flDamage = (pos != -1) ? MT_GetCombinationSetting(tank, 3, pos) : float(g_esSpamCache[tank].g_iSpamDamage); - IntToString(RoundToNearest(MT_GetScaledDamage(flDamage)), sDamage, sizeof sDamage); - - float flPos[3], flAngles[3]; - GetClientEyePosition(tank, flPos); - GetClientEyeAngles(tank, flAngles); - - int iLauncher = CreateEntityByName("env_rock_launcher"); - if (bIsValidEntity(iLauncher)) - { - SetEntPropEnt(iLauncher, Prop_Data, "m_hOwnerEntity", tank); - TeleportEntity(iLauncher, flPos, flAngles); - DispatchSpawn(iLauncher); - DispatchKeyValue(iLauncher, "rockdamageoverride", sDamage); - iLauncher = EntIndexToEntRef(iLauncher); - g_esSpamPlayer[tank].g_iLauncher = iLauncher; - } - - float flInterval = (pos != -1) ? MT_GetCombinationSetting(tank, 6, pos) : g_esSpamCache[tank].g_flSpamInterval; - if (flInterval > 0.0) - { - DataPack dpSpam; - CreateDataTimer(flInterval, tTimerSpam, dpSpam, TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); - dpSpam.WriteCell(iLauncher); - dpSpam.WriteCell(GetClientUserId(tank)); - dpSpam.WriteCell(g_esSpamPlayer[tank].g_iTankType); - dpSpam.WriteCell(GetTime()); - dpSpam.WriteCell(pos); - } -} - -void vSpamAbility(int tank) -{ - if ((g_esSpamPlayer[tank].g_iCooldown != -1 && g_esSpamPlayer[tank].g_iCooldown >= GetTime()) || bIsAreaNarrow(tank, g_esSpamCache[tank].g_flOpenAreasOnly) || bIsAreaWide(tank, g_esSpamCache[tank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esSpamPlayer[tank].g_iTankType, tank) || (g_esSpamCache[tank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esSpamCache[tank].g_iRequiresHumans) || (!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esSpamAbility[g_esSpamPlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esSpamPlayer[tank].g_iAccessFlags))) - { - return; - } - - if (!bIsInfected(tank, MT_CHECK_FAKECLIENT) || (g_esSpamPlayer[tank].g_iAmmoCount < g_esSpamCache[tank].g_iHumanAmmo && g_esSpamCache[tank].g_iHumanAmmo > 0)) - { - if (GetRandomFloat(0.1, 100.0) <= g_esSpamCache[tank].g_flSpamChance) - { - vSpam(tank); - } - else if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esSpamCache[tank].g_iHumanAbility == 1) - { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "SpamHuman2"); - } - } - else if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esSpamCache[tank].g_iHumanAbility == 1) - { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "SpamAmmo"); - } -} - -void vSpamCopyStats2(int oldTank, int newTank) -{ - g_esSpamPlayer[newTank].g_iAmmoCount = g_esSpamPlayer[oldTank].g_iAmmoCount; - g_esSpamPlayer[newTank].g_iCooldown = g_esSpamPlayer[oldTank].g_iCooldown; -} - -void vRemoveSpamLauncher(int tank) -{ - if (bIsValidEntRef(g_esSpamPlayer[tank].g_iLauncher)) - { - g_esSpamPlayer[tank].g_iLauncher = EntRefToEntIndex(g_esSpamPlayer[tank].g_iLauncher); - if (bIsValidEntity(g_esSpamPlayer[tank].g_iLauncher)) - { - RemoveEntity(g_esSpamPlayer[tank].g_iLauncher); - } - } - - g_esSpamPlayer[tank].g_iLauncher = INVALID_ENT_REFERENCE; -} - -void vRemoveSpam(int tank) -{ - vRemoveSpamLauncher(tank); - - g_esSpamPlayer[tank].g_bActivated = false; - g_esSpamPlayer[tank].g_iAmmoCount = 0; - g_esSpamPlayer[tank].g_iCooldown = -1; -} - -void vSpamReset() -{ - for (int iPlayer = 1; iPlayer <= MaxClients; iPlayer++) - { - if (bIsValidClient(iPlayer, MT_CHECK_INGAME)) - { - vRemoveSpam(iPlayer); - } - } -} - -void vSpamReset2(int tank) -{ - vRemoveSpamLauncher(tank); - - g_esSpamPlayer[tank].g_bActivated = false; - - if (g_esSpamCache[tank].g_iSpamMessage == 1) - { - char sTankName[64]; - MT_GetTankName(tank, sTankName); - MT_PrintToChatAll("%s %t", MT_TAG2, "Spam2", sTankName); - MT_LogMessage(MT_LOG_ABILITY, "%s %T", MT_TAG, "Spam2", LANG_SERVER, sTankName); - } -} - -void vSpamReset3(int tank) -{ - int iTime = GetTime(), iPos = g_esSpamAbility[g_esSpamPlayer[tank].g_iTankTypeRecorded].g_iComboPosition, iCooldown = (iPos != -1) ? RoundToNearest(MT_GetCombinationSetting(tank, 2, iPos)) : g_esSpamCache[tank].g_iSpamCooldown; - iCooldown = (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esSpamCache[tank].g_iHumanAbility == 1 && g_esSpamCache[tank].g_iHumanMode == 0 && g_esSpamPlayer[tank].g_iAmmoCount < g_esSpamCache[tank].g_iHumanAmmo && g_esSpamCache[tank].g_iHumanAmmo > 0) ? g_esSpamCache[tank].g_iHumanCooldown : iCooldown; - g_esSpamPlayer[tank].g_iCooldown = (iTime + iCooldown); - if (g_esSpamPlayer[tank].g_iCooldown != -1 && g_esSpamPlayer[tank].g_iCooldown >= iTime) - { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "SpamHuman5", (g_esSpamPlayer[tank].g_iCooldown - iTime)); - } -} - -void tTimerSpamCombo(Handle timer, DataPack pack) -{ - pack.Reset(); - - int iTank = GetClientOfUserId(pack.ReadCell()); - if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esSpamAbility[g_esSpamPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esSpamPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esSpamPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esSpamCache[iTank].g_iSpamAbility == 0 || g_esSpamPlayer[iTank].g_bActivated) - { - return; - } - - int iPos = pack.ReadCell(); - vSpam(iTank, iPos); -} - -Action tTimerSpam(Handle timer, DataPack pack) -{ - pack.Reset(); - - int iLauncher = EntRefToEntIndex(pack.ReadCell()), iTank = GetClientOfUserId(pack.ReadCell()); - if (iLauncher == INVALID_ENT_REFERENCE || !bIsValidEntity(iLauncher)) - { - g_esSpamPlayer[iTank].g_bActivated = false; - - return Plugin_Stop; - } - - int iType = pack.ReadCell(); - if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || bIsAreaNarrow(iTank, g_esSpamCache[iTank].g_flOpenAreasOnly) || bIsAreaWide(iTank, g_esSpamCache[iTank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esSpamPlayer[iTank].g_iTankType, iTank) || (g_esSpamCache[iTank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esSpamCache[iTank].g_iRequiresHumans) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esSpamAbility[g_esSpamPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esSpamPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esSpamPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || iType != g_esSpamPlayer[iTank].g_iTankType || g_esSpamCache[iTank].g_iSpamAbility == 0 || !g_esSpamPlayer[iTank].g_bActivated) - { - vSpamReset2(iTank); - - return Plugin_Stop; - } - - bool bHuman = bIsInfected(iTank, MT_CHECK_FAKECLIENT); - int iTime = pack.ReadCell(), iCurrentTime = GetTime(), iPos = pack.ReadCell(), - iDuration = (iPos != -1) ? RoundToNearest(MT_GetCombinationSetting(iTank, 5, iPos)) : g_esSpamCache[iTank].g_iSpamDuration; - iDuration = (bHuman && g_esSpamCache[iTank].g_iHumanAbility == 1) ? g_esSpamCache[iTank].g_iHumanDuration : iDuration; - if (iDuration > 0 && (!bHuman || (bHuman && g_esSpamCache[iTank].g_iHumanAbility == 1 && g_esSpamCache[iTank].g_iHumanMode == 0)) && (iTime + iDuration) < iCurrentTime) - { - vSpamReset2(iTank); - vSpamReset3(iTank); - - return Plugin_Stop; - } - - float flPos[3], flAngles[3]; - GetClientEyePosition(iTank, flPos); - GetClientEyeAngles(iTank, flAngles); - flPos[2] += 80.0; - - if (bIsValidEntity(iLauncher)) - { - TeleportEntity(iLauncher, flPos, flAngles); - AcceptEntityInput(iLauncher, "LaunchRock"); - } - - return Plugin_Continue; -} \ No newline at end of file diff --git a/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_splash.sp b/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_splash.sp deleted file mode 100644 index 5b3929c6ae..0000000000 --- a/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_splash.sp +++ /dev/null @@ -1,1075 +0,0 @@ -/** - * Mutant Tanks: a L4D/L4D2 SourceMod Plugin - * Copyright (C) 2024 Alfred "Psyk0tik" Llagas - * - * 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 . - **/ - -#define MT_SPLASH_COMPILE_METHOD 0 // 0: packaged, 1: standalone - -#if !defined MT_ABILITIES_MAIN2 - #if MT_SPLASH_COMPILE_METHOD == 1 - #include - #include - #else - #error This file must be inside "scripting/mutant_tanks/abilities2" while compiling "mt_abilities2.sp" to include its content. - #endif -public Plugin myinfo = -{ - name = "[MT] Splash Ability", - author = MT_AUTHOR, - description = "The Mutant Tank constantly deals splash damage to nearby survivors.", - version = MT_VERSION, - url = MT_URL -}; - -bool g_bDedicated; - -public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max) -{ - EngineVersion evEngine = GetEngineVersion(); - if (evEngine != Engine_Left4Dead && evEngine != Engine_Left4Dead2) - { - strcopy(error, err_max, "\"[MT] Splash Ability\" only supports Left 4 Dead 1 & 2."); - - return APLRes_SilentFailure; - } - - g_bDedicated = IsDedicatedServer(); - - return APLRes_Success; -} - -#define PARTICLE_BLOOD "boomer_explode_D" -#else - #if MT_SPLASH_COMPILE_METHOD == 1 - #error This file must be compiled as a standalone plugin. - #endif -#endif - -#define MT_SPLASH_SECTION "splashability" -#define MT_SPLASH_SECTION2 "splash ability" -#define MT_SPLASH_SECTION3 "splash_ability" -#define MT_SPLASH_SECTION4 "splash" - -#define MT_MENU_SPLASH "Splash Ability" - -enum struct esSplashPlayer -{ - bool g_bActivated; - - float g_flCloseAreasOnly; - float g_flOpenAreasOnly; - float g_flSplashChance; - float g_flSplashDamage; - float g_flSplashInterval; - float g_flSplashRange; - - int g_iAccessFlags; - int g_iAmmoCount; - int g_iComboAbility; - int g_iCooldown; - int g_iHumanAbility; - int g_iHumanAmmo; - int g_iHumanCooldown; - int g_iHumanDuration; - int g_iHumanMode; - int g_iImmunityFlags; - int g_iRequiresHumans; - int g_iSplashAbility; - int g_iSplashCooldown; - int g_iSplashDuration; - int g_iSplashMessage; - int g_iSplashSight; - int g_iTankType; - int g_iTankTypeRecorded; -} - -esSplashPlayer g_esSplashPlayer[MAXPLAYERS + 1]; - -enum struct esSplashTeammate -{ - float g_flCloseAreasOnly; - float g_flOpenAreasOnly; - float g_flSplashChance; - float g_flSplashDamage; - float g_flSplashInterval; - float g_flSplashRange; - - int g_iComboAbility; - int g_iHumanAbility; - int g_iHumanAmmo; - int g_iHumanCooldown; - int g_iHumanDuration; - int g_iHumanMode; - int g_iRequiresHumans; - int g_iSplashAbility; - int g_iSplashCooldown; - int g_iSplashDuration; - int g_iSplashMessage; - int g_iSplashSight; -} - -esSplashTeammate g_esSplashTeammate[MAXPLAYERS + 1]; - -enum struct esSplashAbility -{ - float g_flCloseAreasOnly; - float g_flOpenAreasOnly; - float g_flSplashChance; - float g_flSplashDamage; - float g_flSplashInterval; - float g_flSplashRange; - - int g_iAccessFlags; - int g_iComboAbility; - int g_iComboPosition; - int g_iHumanAbility; - int g_iHumanAmmo; - int g_iHumanCooldown; - int g_iHumanDuration; - int g_iHumanMode; - int g_iImmunityFlags; - int g_iRequiresHumans; - int g_iSplashAbility; - int g_iSplashCooldown; - int g_iSplashDuration; - int g_iSplashMessage; - int g_iSplashSight; -} - -esSplashAbility g_esSplashAbility[MT_MAXTYPES + 1]; - -enum struct esSplashSpecial -{ - float g_flCloseAreasOnly; - float g_flOpenAreasOnly; - float g_flSplashChance; - float g_flSplashDamage; - float g_flSplashInterval; - float g_flSplashRange; - - int g_iComboAbility; - int g_iHumanAbility; - int g_iHumanAmmo; - int g_iHumanCooldown; - int g_iHumanDuration; - int g_iHumanMode; - int g_iRequiresHumans; - int g_iSplashAbility; - int g_iSplashCooldown; - int g_iSplashDuration; - int g_iSplashMessage; - int g_iSplashSight; -} - -esSplashSpecial g_esSplashSpecial[MT_MAXTYPES + 1]; - -enum struct esSplashCache -{ - float g_flCloseAreasOnly; - float g_flOpenAreasOnly; - float g_flSplashChance; - float g_flSplashDamage; - float g_flSplashInterval; - float g_flSplashRange; - - int g_iComboAbility; - int g_iHumanAbility; - int g_iHumanAmmo; - int g_iHumanCooldown; - int g_iHumanDuration; - int g_iHumanMode; - int g_iRequiresHumans; - int g_iSplashAbility; - int g_iSplashCooldown; - int g_iSplashDuration; - int g_iSplashMessage; - int g_iSplashSight; -} - -esSplashCache g_esSplashCache[MAXPLAYERS + 1]; - -#if !defined MT_ABILITIES_MAIN2 -public void OnPluginStart() -{ - LoadTranslations("common.phrases"); - LoadTranslations("mutant_tanks.phrases"); - LoadTranslations("mutant_tanks_names.phrases"); - - RegConsoleCmd("sm_mt_splash", cmdSplashInfo, "View information about the Splash ability."); -} -#endif - -#if defined MT_ABILITIES_MAIN2 -void vSplashMapStart() -#else -public void OnMapStart() -#endif -{ - vSplashReset(); -} - -#if defined MT_ABILITIES_MAIN2 -void vSplashClientPutInServer(int client) -#else -public void OnClientPutInServer(int client) -#endif -{ - vRemoveSplash(client); -} - -#if defined MT_ABILITIES_MAIN2 -void vSplashClientDisconnect_Post(int client) -#else -public void OnClientDisconnect_Post(int client) -#endif -{ - vRemoveSplash(client); -} - -#if defined MT_ABILITIES_MAIN2 -void vSplashMapEnd() -#else -public void OnMapEnd() -#endif -{ - vSplashReset(); -} - -#if !defined MT_ABILITIES_MAIN2 -Action cmdSplashInfo(int client, int args) -{ - client = iGetListenServerHost(client, g_bDedicated); - - if (!MT_IsCorePluginEnabled()) - { - MT_ReplyToCommand(client, "%s %t", MT_TAG5, "PluginDisabled"); - - return Plugin_Handled; - } - - if (!bIsValidClient(client, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_FAKECLIENT)) - { - MT_ReplyToCommand(client, "%s %t", MT_TAG, "Command is in-game only"); - - return Plugin_Handled; - } - - switch (IsVoteInProgress()) - { - case true: MT_ReplyToCommand(client, "%s %t", MT_TAG2, "Vote in Progress"); - case false: vSplashMenu(client, MT_SPLASH_SECTION4, 0); - } - - return Plugin_Handled; -} -#endif - -void vSplashMenu(int client, const char[] name, int item) -{ - if (StrContains(MT_SPLASH_SECTION4, name, false) == -1) - { - return; - } - - Menu mAbilityMenu = new Menu(iSplashMenuHandler, MENU_ACTIONS_DEFAULT|MenuAction_Display|MenuAction_DisplayItem); - mAbilityMenu.SetTitle("Splash Ability Information"); - mAbilityMenu.AddItem("Status", "Status"); - mAbilityMenu.AddItem("Ammunition", "Ammunition"); - mAbilityMenu.AddItem("Buttons", "Buttons"); - mAbilityMenu.AddItem("Button Mode", "Button Mode"); - mAbilityMenu.AddItem("Cooldown", "Cooldown"); - mAbilityMenu.AddItem("Details", "Details"); - mAbilityMenu.AddItem("Duration", "Duration"); - mAbilityMenu.AddItem("Human Support", "Human Support"); - mAbilityMenu.DisplayAt(client, item, MENU_TIME_FOREVER); -} - -int iSplashMenuHandler(Menu menu, MenuAction action, int param1, int param2) -{ - switch (action) - { - case MenuAction_End: delete menu; - case MenuAction_Select: - { - switch (param2) - { - case 0: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esSplashCache[param1].g_iSplashAbility == 0) ? "AbilityStatus1" : "AbilityStatus2"); - case 1: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityAmmo", (g_esSplashCache[param1].g_iHumanAmmo - g_esSplashPlayer[param1].g_iAmmoCount), g_esSplashCache[param1].g_iHumanAmmo); - case 2: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtons"); - case 3: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esSplashCache[param1].g_iHumanMode == 0) ? "AbilityButtonMode1" : "AbilityButtonMode2"); - case 4: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityCooldown", ((g_esSplashCache[param1].g_iHumanAbility == 1) ? g_esSplashCache[param1].g_iHumanCooldown : g_esSplashCache[param1].g_iSplashCooldown)); - case 5: MT_PrintToChat(param1, "%s %t", MT_TAG3, "SplashDetails"); - case 6: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityDuration2", ((g_esSplashCache[param1].g_iHumanAbility == 1) ? g_esSplashCache[param1].g_iHumanDuration : g_esSplashCache[param1].g_iSplashDuration)); - case 7: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esSplashCache[param1].g_iHumanAbility == 0) ? "AbilityHumanSupport1" : "AbilityHumanSupport2"); - } - - if (bIsValidClient(param1, MT_CHECK_INGAME)) - { - vSplashMenu(param1, MT_SPLASH_SECTION4, menu.Selection); - } - } - case MenuAction_Display: - { - char sMenuTitle[PLATFORM_MAX_PATH]; - Panel pSplash = view_as(param2); - FormatEx(sMenuTitle, sizeof sMenuTitle, "%T", "SplashMenu", param1); - pSplash.SetTitle(sMenuTitle); - } - case MenuAction_DisplayItem: - { - if (param2 >= 0) - { - char sMenuOption[PLATFORM_MAX_PATH]; - - switch (param2) - { - case 0: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Status", param1); - case 1: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Ammunition", param1); - case 2: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Buttons", param1); - case 3: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "ButtonMode", param1); - case 4: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Cooldown", param1); - case 5: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Details", param1); - case 6: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Duration", param1); - case 7: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "HumanSupport", param1); - } - - return RedrawMenuItem(sMenuOption); - } - } - } - - return 0; -} - -#if defined MT_ABILITIES_MAIN2 -void vSplashDisplayMenu(Menu menu) -#else -public void MT_OnDisplayMenu(Menu menu) -#endif -{ - menu.AddItem(MT_MENU_SPLASH, MT_MENU_SPLASH); -} - -#if defined MT_ABILITIES_MAIN2 -void vSplashMenuItemSelected(int client, const char[] info) -#else -public void MT_OnMenuItemSelected(int client, const char[] info) -#endif -{ - if (StrEqual(info, MT_MENU_SPLASH, false)) - { - vSplashMenu(client, MT_SPLASH_SECTION4, 0); - } -} - -#if defined MT_ABILITIES_MAIN2 -void vSplashMenuItemDisplayed(int client, const char[] info, char[] buffer, int size) -#else -public void MT_OnMenuItemDisplayed(int client, const char[] info, char[] buffer, int size) -#endif -{ - if (StrEqual(info, MT_MENU_SPLASH, false)) - { - FormatEx(buffer, size, "%T", "SplashMenu2", client); - } -} - -#if defined MT_ABILITIES_MAIN2 -void vSplashPluginCheck(ArrayList list) -#else -public void MT_OnPluginCheck(ArrayList list) -#endif -{ - list.PushString(MT_MENU_SPLASH); -} - -#if defined MT_ABILITIES_MAIN2 -void vSplashAbilityCheck(ArrayList list, ArrayList list2, ArrayList list3, ArrayList list4) -#else -public void MT_OnAbilityCheck(ArrayList list, ArrayList list2, ArrayList list3, ArrayList list4) -#endif -{ - list.PushString(MT_SPLASH_SECTION); - list2.PushString(MT_SPLASH_SECTION2); - list3.PushString(MT_SPLASH_SECTION3); - list4.PushString(MT_SPLASH_SECTION4); -} - -#if defined MT_ABILITIES_MAIN2 -void vSplashCombineAbilities(int tank, int type, const float random, const char[] combo) -#else -public void MT_OnCombineAbilities(int tank, int type, const float random, const char[] combo, int survivor, int weapon, const char[] classname) -#endif -{ - if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esSplashCache[tank].g_iHumanAbility != 2) - { - g_esSplashAbility[g_esSplashPlayer[tank].g_iTankTypeRecorded].g_iComboPosition = -1; - - return; - } - - g_esSplashAbility[g_esSplashPlayer[tank].g_iTankTypeRecorded].g_iComboPosition = -1; - - char sCombo[320], sSet[4][32]; - FormatEx(sCombo, sizeof sCombo, ",%s,", combo); - FormatEx(sSet[0], sizeof sSet[], ",%s,", MT_SPLASH_SECTION); - FormatEx(sSet[1], sizeof sSet[], ",%s,", MT_SPLASH_SECTION2); - FormatEx(sSet[2], sizeof sSet[], ",%s,", MT_SPLASH_SECTION3); - FormatEx(sSet[3], sizeof sSet[], ",%s,", MT_SPLASH_SECTION4); - if (StrContains(sCombo, sSet[0], false) != -1 || StrContains(sCombo, sSet[1], false) != -1 || StrContains(sCombo, sSet[2], false) != -1 || StrContains(sCombo, sSet[3], false) != -1) - { - if (type == MT_COMBO_MAINRANGE && g_esSplashCache[tank].g_iSplashAbility == 1 && g_esSplashCache[tank].g_iComboAbility == 1 && !g_esSplashPlayer[tank].g_bActivated) - { - char sAbilities[320], sSubset[10][32]; - strcopy(sAbilities, sizeof sAbilities, combo); - ExplodeString(sAbilities, ",", sSubset, sizeof sSubset, sizeof sSubset[]); - - float flDelay = 0.0; - for (int iPos = 0; iPos < (sizeof sSubset); iPos++) - { - if (StrEqual(sSubset[iPos], MT_SPLASH_SECTION, false) || StrEqual(sSubset[iPos], MT_SPLASH_SECTION2, false) || StrEqual(sSubset[iPos], MT_SPLASH_SECTION3, false) || StrEqual(sSubset[iPos], MT_SPLASH_SECTION4, false)) - { - g_esSplashAbility[g_esSplashPlayer[tank].g_iTankTypeRecorded].g_iComboPosition = iPos; - - if (random <= MT_GetCombinationSetting(tank, 1, iPos)) - { - flDelay = MT_GetCombinationSetting(tank, 4, iPos); - - switch (flDelay) - { - case 0.0: vSplash(tank, iPos); - default: - { - DataPack dpCombo; - CreateDataTimer(flDelay, tTimerSplashCombo, dpCombo, TIMER_FLAG_NO_MAPCHANGE); - dpCombo.WriteCell(GetClientUserId(tank)); - dpCombo.WriteCell(iPos); - } - } - } - - break; - } - } - } - } -} - -#if defined MT_ABILITIES_MAIN2 -void vSplashConfigsLoad(int mode) -#else -public void MT_OnConfigsLoad(int mode) -#endif -{ - switch (mode) - { - case 1: - { - for (int iIndex = MT_GetMinType(); iIndex <= MT_GetMaxType(); iIndex++) - { - g_esSplashAbility[iIndex].g_iAccessFlags = 0; - g_esSplashAbility[iIndex].g_iImmunityFlags = 0; - g_esSplashAbility[iIndex].g_flCloseAreasOnly = 0.0; - g_esSplashAbility[iIndex].g_iComboAbility = 0; - g_esSplashAbility[iIndex].g_iComboPosition = -1; - g_esSplashAbility[iIndex].g_iHumanAbility = 0; - g_esSplashAbility[iIndex].g_iHumanAmmo = 5; - g_esSplashAbility[iIndex].g_iHumanCooldown = 0; - g_esSplashAbility[iIndex].g_iHumanDuration = 5; - g_esSplashAbility[iIndex].g_iHumanMode = 1; - g_esSplashAbility[iIndex].g_flOpenAreasOnly = 0.0; - g_esSplashAbility[iIndex].g_iRequiresHumans = 0; - g_esSplashAbility[iIndex].g_iSplashAbility = 0; - g_esSplashAbility[iIndex].g_iSplashMessage = 0; - g_esSplashAbility[iIndex].g_flSplashChance = 33.3; - g_esSplashAbility[iIndex].g_iSplashCooldown = 0; - g_esSplashAbility[iIndex].g_flSplashDamage = 5.0; - g_esSplashAbility[iIndex].g_iSplashDuration = 0; - g_esSplashAbility[iIndex].g_flSplashInterval = 5.0; - g_esSplashAbility[iIndex].g_flSplashRange = 500.0; - g_esSplashAbility[iIndex].g_iSplashSight = 0; - - g_esSplashSpecial[iIndex].g_flCloseAreasOnly = -1.0; - g_esSplashSpecial[iIndex].g_iComboAbility = -1; - g_esSplashSpecial[iIndex].g_iHumanAbility = -1; - g_esSplashSpecial[iIndex].g_iHumanAmmo = -1; - g_esSplashSpecial[iIndex].g_iHumanCooldown = -1; - g_esSplashSpecial[iIndex].g_iHumanDuration = -1; - g_esSplashSpecial[iIndex].g_iHumanMode = -1; - g_esSplashSpecial[iIndex].g_flOpenAreasOnly = -1.0; - g_esSplashSpecial[iIndex].g_iRequiresHumans = -1; - g_esSplashSpecial[iIndex].g_iSplashAbility = -1; - g_esSplashSpecial[iIndex].g_iSplashMessage = -1; - g_esSplashSpecial[iIndex].g_flSplashChance = -1.0; - g_esSplashSpecial[iIndex].g_iSplashCooldown = -1; - g_esSplashSpecial[iIndex].g_flSplashDamage = -1.0; - g_esSplashSpecial[iIndex].g_iSplashDuration = -1; - g_esSplashSpecial[iIndex].g_flSplashInterval = -1.0; - g_esSplashSpecial[iIndex].g_flSplashRange = -1.0; - g_esSplashSpecial[iIndex].g_iSplashSight = -1; - } - } - case 3: - { - for (int iPlayer = 1; iPlayer <= MaxClients; iPlayer++) - { - g_esSplashPlayer[iPlayer].g_iAccessFlags = -1; - g_esSplashPlayer[iPlayer].g_iImmunityFlags = -1; - g_esSplashPlayer[iPlayer].g_flCloseAreasOnly = -1.0; - g_esSplashPlayer[iPlayer].g_iComboAbility = -1; - g_esSplashPlayer[iPlayer].g_iHumanAbility = -1; - g_esSplashPlayer[iPlayer].g_iHumanAmmo = -1; - g_esSplashPlayer[iPlayer].g_iHumanCooldown = -1; - g_esSplashPlayer[iPlayer].g_iHumanDuration = -1; - g_esSplashPlayer[iPlayer].g_iHumanMode = -1; - g_esSplashPlayer[iPlayer].g_flOpenAreasOnly = -1.0; - g_esSplashPlayer[iPlayer].g_iRequiresHumans = -1; - g_esSplashPlayer[iPlayer].g_iSplashAbility = -1; - g_esSplashPlayer[iPlayer].g_iSplashMessage = -1; - g_esSplashPlayer[iPlayer].g_flSplashChance = -1.0; - g_esSplashPlayer[iPlayer].g_iSplashCooldown = -1; - g_esSplashPlayer[iPlayer].g_flSplashDamage = -1.0; - g_esSplashPlayer[iPlayer].g_iSplashDuration = -1; - g_esSplashPlayer[iPlayer].g_flSplashInterval = -1.0; - g_esSplashPlayer[iPlayer].g_flSplashRange = -1.0; - g_esSplashPlayer[iPlayer].g_iSplashSight = -1; - - g_esSplashTeammate[iPlayer].g_flCloseAreasOnly = -1.0; - g_esSplashTeammate[iPlayer].g_iComboAbility = -1; - g_esSplashTeammate[iPlayer].g_iHumanAbility = -1; - g_esSplashTeammate[iPlayer].g_iHumanAmmo = -1; - g_esSplashTeammate[iPlayer].g_iHumanCooldown = -1; - g_esSplashTeammate[iPlayer].g_iHumanDuration = -1; - g_esSplashTeammate[iPlayer].g_iHumanMode = -1; - g_esSplashTeammate[iPlayer].g_flOpenAreasOnly = -1.0; - g_esSplashTeammate[iPlayer].g_iRequiresHumans = -1; - g_esSplashTeammate[iPlayer].g_iSplashAbility = -1; - g_esSplashTeammate[iPlayer].g_iSplashMessage = -1; - g_esSplashTeammate[iPlayer].g_flSplashChance = -1.0; - g_esSplashTeammate[iPlayer].g_iSplashCooldown = -1; - g_esSplashTeammate[iPlayer].g_flSplashDamage = -1.0; - g_esSplashTeammate[iPlayer].g_iSplashDuration = -1; - g_esSplashTeammate[iPlayer].g_flSplashInterval = -1.0; - g_esSplashTeammate[iPlayer].g_flSplashRange = -1.0; - g_esSplashTeammate[iPlayer].g_iSplashSight = -1; - } - } - } -} - -#if defined MT_ABILITIES_MAIN2 -void vSplashConfigsLoaded(const char[] subsection, const char[] key, const char[] value, int type, int admin, int mode, bool special, const char[] specsection) -#else -public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const char[] value, int type, int admin, int mode, bool special, const char[] specsection) -#endif -{ - if ((mode == -1 || mode == 3) && bIsValidClient(admin)) - { - if (special && specsection[0] != '\0') - { - g_esSplashTeammate[admin].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_SPLASH_SECTION, MT_SPLASH_SECTION2, MT_SPLASH_SECTION3, MT_SPLASH_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esSplashTeammate[admin].g_flCloseAreasOnly, value, -1.0, 99999.0); - g_esSplashTeammate[admin].g_iComboAbility = iGetKeyValue(subsection, MT_SPLASH_SECTION, MT_SPLASH_SECTION2, MT_SPLASH_SECTION3, MT_SPLASH_SECTION4, key, "ComboAbility", "Combo Ability", "Combo_Ability", "combo", g_esSplashTeammate[admin].g_iComboAbility, value, -1, 1); - g_esSplashTeammate[admin].g_iHumanAbility = iGetKeyValue(subsection, MT_SPLASH_SECTION, MT_SPLASH_SECTION2, MT_SPLASH_SECTION3, MT_SPLASH_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esSplashTeammate[admin].g_iHumanAbility, value, -1, 2); - g_esSplashTeammate[admin].g_iHumanAmmo = iGetKeyValue(subsection, MT_SPLASH_SECTION, MT_SPLASH_SECTION2, MT_SPLASH_SECTION3, MT_SPLASH_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esSplashTeammate[admin].g_iHumanAmmo, value, -1, 99999); - g_esSplashTeammate[admin].g_iHumanCooldown = iGetKeyValue(subsection, MT_SPLASH_SECTION, MT_SPLASH_SECTION2, MT_SPLASH_SECTION3, MT_SPLASH_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esSplashTeammate[admin].g_iHumanCooldown, value, -1, 99999); - g_esSplashTeammate[admin].g_iHumanDuration = iGetKeyValue(subsection, MT_SPLASH_SECTION, MT_SPLASH_SECTION2, MT_SPLASH_SECTION3, MT_SPLASH_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esSplashTeammate[admin].g_iHumanDuration, value, -1, 99999); - g_esSplashTeammate[admin].g_iHumanMode = iGetKeyValue(subsection, MT_SPLASH_SECTION, MT_SPLASH_SECTION2, MT_SPLASH_SECTION3, MT_SPLASH_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esSplashTeammate[admin].g_iHumanMode, value, -1, 1); - g_esSplashTeammate[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_SPLASH_SECTION, MT_SPLASH_SECTION2, MT_SPLASH_SECTION3, MT_SPLASH_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esSplashTeammate[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); - g_esSplashTeammate[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_SPLASH_SECTION, MT_SPLASH_SECTION2, MT_SPLASH_SECTION3, MT_SPLASH_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esSplashTeammate[admin].g_iRequiresHumans, value, -1, 32); - g_esSplashTeammate[admin].g_iSplashAbility = iGetKeyValue(subsection, MT_SPLASH_SECTION, MT_SPLASH_SECTION2, MT_SPLASH_SECTION3, MT_SPLASH_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esSplashTeammate[admin].g_iSplashAbility, value, -1, 1); - g_esSplashTeammate[admin].g_iSplashMessage = iGetKeyValue(subsection, MT_SPLASH_SECTION, MT_SPLASH_SECTION2, MT_SPLASH_SECTION3, MT_SPLASH_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esSplashTeammate[admin].g_iSplashMessage, value, -1, 1); - g_esSplashTeammate[admin].g_iSplashSight = iGetKeyValue(subsection, MT_SPLASH_SECTION, MT_SPLASH_SECTION2, MT_SPLASH_SECTION3, MT_SPLASH_SECTION4, key, "AbilitySight", "Ability Sight", "Ability_Sight", "sight", g_esSplashTeammate[admin].g_iSplashSight, value, -1, 5); - g_esSplashTeammate[admin].g_flSplashChance = flGetKeyValue(subsection, MT_SPLASH_SECTION, MT_SPLASH_SECTION2, MT_SPLASH_SECTION3, MT_SPLASH_SECTION4, key, "SplashChance", "Splash Chance", "Splash_Chance", "chance", g_esSplashTeammate[admin].g_flSplashChance, value, -1.0, 100.0); - g_esSplashTeammate[admin].g_iSplashCooldown = iGetKeyValue(subsection, MT_SPLASH_SECTION, MT_SPLASH_SECTION2, MT_SPLASH_SECTION3, MT_SPLASH_SECTION4, key, "SplashCooldown", "Splash Cooldown", "Splash_Cooldown", "cooldown", g_esSplashTeammate[admin].g_iSplashCooldown, value, -1, 99999); - g_esSplashTeammate[admin].g_flSplashDamage = flGetKeyValue(subsection, MT_SPLASH_SECTION, MT_SPLASH_SECTION2, MT_SPLASH_SECTION3, MT_SPLASH_SECTION4, key, "SplashDamage", "Splash Damage", "Splash_Damage", "damage", g_esSplashTeammate[admin].g_flSplashDamage, value, -1.0, 99999.0); - g_esSplashTeammate[admin].g_iSplashDuration = iGetKeyValue(subsection, MT_SPLASH_SECTION, MT_SPLASH_SECTION2, MT_SPLASH_SECTION3, MT_SPLASH_SECTION4, key, "SplashDuration", "Splash Duration", "Splash_Duration", "duration", g_esSplashTeammate[admin].g_iSplashDuration, value, -1, 99999); - g_esSplashTeammate[admin].g_flSplashInterval = flGetKeyValue(subsection, MT_SPLASH_SECTION, MT_SPLASH_SECTION2, MT_SPLASH_SECTION3, MT_SPLASH_SECTION4, key, "SplashInterval", "Splash Interval", "Splash_Interval", "interval", g_esSplashTeammate[admin].g_flSplashInterval, value, -1.0, 99999.0); - g_esSplashTeammate[admin].g_flSplashRange = flGetKeyValue(subsection, MT_SPLASH_SECTION, MT_SPLASH_SECTION2, MT_SPLASH_SECTION3, MT_SPLASH_SECTION4, key, "SplashRange", "Splash Range", "Splash_Range", "range", g_esSplashTeammate[admin].g_flSplashRange, value, -1.0, 99999.0); - } - else - { - g_esSplashPlayer[admin].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_SPLASH_SECTION, MT_SPLASH_SECTION2, MT_SPLASH_SECTION3, MT_SPLASH_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esSplashPlayer[admin].g_flCloseAreasOnly, value, -1.0, 99999.0); - g_esSplashPlayer[admin].g_iComboAbility = iGetKeyValue(subsection, MT_SPLASH_SECTION, MT_SPLASH_SECTION2, MT_SPLASH_SECTION3, MT_SPLASH_SECTION4, key, "ComboAbility", "Combo Ability", "Combo_Ability", "combo", g_esSplashPlayer[admin].g_iComboAbility, value, -1, 1); - g_esSplashPlayer[admin].g_iHumanAbility = iGetKeyValue(subsection, MT_SPLASH_SECTION, MT_SPLASH_SECTION2, MT_SPLASH_SECTION3, MT_SPLASH_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esSplashPlayer[admin].g_iHumanAbility, value, -1, 2); - g_esSplashPlayer[admin].g_iHumanAmmo = iGetKeyValue(subsection, MT_SPLASH_SECTION, MT_SPLASH_SECTION2, MT_SPLASH_SECTION3, MT_SPLASH_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esSplashPlayer[admin].g_iHumanAmmo, value, -1, 99999); - g_esSplashPlayer[admin].g_iHumanCooldown = iGetKeyValue(subsection, MT_SPLASH_SECTION, MT_SPLASH_SECTION2, MT_SPLASH_SECTION3, MT_SPLASH_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esSplashPlayer[admin].g_iHumanCooldown, value, -1, 99999); - g_esSplashPlayer[admin].g_iHumanDuration = iGetKeyValue(subsection, MT_SPLASH_SECTION, MT_SPLASH_SECTION2, MT_SPLASH_SECTION3, MT_SPLASH_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esSplashPlayer[admin].g_iHumanDuration, value, -1, 99999); - g_esSplashPlayer[admin].g_iHumanMode = iGetKeyValue(subsection, MT_SPLASH_SECTION, MT_SPLASH_SECTION2, MT_SPLASH_SECTION3, MT_SPLASH_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esSplashPlayer[admin].g_iHumanMode, value, -1, 1); - g_esSplashPlayer[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_SPLASH_SECTION, MT_SPLASH_SECTION2, MT_SPLASH_SECTION3, MT_SPLASH_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esSplashPlayer[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); - g_esSplashPlayer[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_SPLASH_SECTION, MT_SPLASH_SECTION2, MT_SPLASH_SECTION3, MT_SPLASH_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esSplashPlayer[admin].g_iRequiresHumans, value, -1, 32); - g_esSplashPlayer[admin].g_iSplashAbility = iGetKeyValue(subsection, MT_SPLASH_SECTION, MT_SPLASH_SECTION2, MT_SPLASH_SECTION3, MT_SPLASH_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esSplashPlayer[admin].g_iSplashAbility, value, -1, 1); - g_esSplashPlayer[admin].g_iSplashMessage = iGetKeyValue(subsection, MT_SPLASH_SECTION, MT_SPLASH_SECTION2, MT_SPLASH_SECTION3, MT_SPLASH_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esSplashPlayer[admin].g_iSplashMessage, value, -1, 1); - g_esSplashPlayer[admin].g_iSplashSight = iGetKeyValue(subsection, MT_SPLASH_SECTION, MT_SPLASH_SECTION2, MT_SPLASH_SECTION3, MT_SPLASH_SECTION4, key, "AbilitySight", "Ability Sight", "Ability_Sight", "sight", g_esSplashPlayer[admin].g_iSplashSight, value, -1, 5); - g_esSplashPlayer[admin].g_flSplashChance = flGetKeyValue(subsection, MT_SPLASH_SECTION, MT_SPLASH_SECTION2, MT_SPLASH_SECTION3, MT_SPLASH_SECTION4, key, "SplashChance", "Splash Chance", "Splash_Chance", "chance", g_esSplashPlayer[admin].g_flSplashChance, value, -1.0, 100.0); - g_esSplashPlayer[admin].g_iSplashCooldown = iGetKeyValue(subsection, MT_SPLASH_SECTION, MT_SPLASH_SECTION2, MT_SPLASH_SECTION3, MT_SPLASH_SECTION4, key, "SplashCooldown", "Splash Cooldown", "Splash_Cooldown", "cooldown", g_esSplashPlayer[admin].g_iSplashCooldown, value, -1, 99999); - g_esSplashPlayer[admin].g_flSplashDamage = flGetKeyValue(subsection, MT_SPLASH_SECTION, MT_SPLASH_SECTION2, MT_SPLASH_SECTION3, MT_SPLASH_SECTION4, key, "SplashDamage", "Splash Damage", "Splash_Damage", "damage", g_esSplashPlayer[admin].g_flSplashDamage, value, -1.0, 99999.0); - g_esSplashPlayer[admin].g_iSplashDuration = iGetKeyValue(subsection, MT_SPLASH_SECTION, MT_SPLASH_SECTION2, MT_SPLASH_SECTION3, MT_SPLASH_SECTION4, key, "SplashDuration", "Splash Duration", "Splash_Duration", "duration", g_esSplashPlayer[admin].g_iSplashDuration, value, -1, 99999); - g_esSplashPlayer[admin].g_flSplashInterval = flGetKeyValue(subsection, MT_SPLASH_SECTION, MT_SPLASH_SECTION2, MT_SPLASH_SECTION3, MT_SPLASH_SECTION4, key, "SplashInterval", "Splash Interval", "Splash_Interval", "interval", g_esSplashPlayer[admin].g_flSplashInterval, value, -1.0, 99999.0); - g_esSplashPlayer[admin].g_flSplashRange = flGetKeyValue(subsection, MT_SPLASH_SECTION, MT_SPLASH_SECTION2, MT_SPLASH_SECTION3, MT_SPLASH_SECTION4, key, "SplashRange", "Splash Range", "Splash_Range", "range", g_esSplashPlayer[admin].g_flSplashRange, value, -1.0, 99999.0); - g_esSplashPlayer[admin].g_iAccessFlags = iGetAdminFlagsValue(subsection, MT_SPLASH_SECTION, MT_SPLASH_SECTION2, MT_SPLASH_SECTION3, MT_SPLASH_SECTION4, key, "AccessFlags", "Access Flags", "Access_Flags", "access", value); - g_esSplashPlayer[admin].g_iImmunityFlags = iGetAdminFlagsValue(subsection, MT_SPLASH_SECTION, MT_SPLASH_SECTION2, MT_SPLASH_SECTION3, MT_SPLASH_SECTION4, key, "ImmunityFlags", "Immunity Flags", "Immunity_Flags", "immunity", value); - } - } - - if (mode < 3 && type > 0) - { - if (special && specsection[0] != '\0') - { - g_esSplashSpecial[type].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_SPLASH_SECTION, MT_SPLASH_SECTION2, MT_SPLASH_SECTION3, MT_SPLASH_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esSplashSpecial[type].g_flCloseAreasOnly, value, -1.0, 99999.0); - g_esSplashSpecial[type].g_iComboAbility = iGetKeyValue(subsection, MT_SPLASH_SECTION, MT_SPLASH_SECTION2, MT_SPLASH_SECTION3, MT_SPLASH_SECTION4, key, "ComboAbility", "Combo Ability", "Combo_Ability", "combo", g_esSplashSpecial[type].g_iComboAbility, value, -1, 1); - g_esSplashSpecial[type].g_iHumanAbility = iGetKeyValue(subsection, MT_SPLASH_SECTION, MT_SPLASH_SECTION2, MT_SPLASH_SECTION3, MT_SPLASH_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esSplashSpecial[type].g_iHumanAbility, value, -1, 2); - g_esSplashSpecial[type].g_iHumanAmmo = iGetKeyValue(subsection, MT_SPLASH_SECTION, MT_SPLASH_SECTION2, MT_SPLASH_SECTION3, MT_SPLASH_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esSplashSpecial[type].g_iHumanAmmo, value, -1, 99999); - g_esSplashSpecial[type].g_iHumanCooldown = iGetKeyValue(subsection, MT_SPLASH_SECTION, MT_SPLASH_SECTION2, MT_SPLASH_SECTION3, MT_SPLASH_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esSplashSpecial[type].g_iHumanCooldown, value, -1, 99999); - g_esSplashSpecial[type].g_iHumanDuration = iGetKeyValue(subsection, MT_SPLASH_SECTION, MT_SPLASH_SECTION2, MT_SPLASH_SECTION3, MT_SPLASH_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esSplashSpecial[type].g_iHumanDuration, value, -1, 99999); - g_esSplashSpecial[type].g_iHumanMode = iGetKeyValue(subsection, MT_SPLASH_SECTION, MT_SPLASH_SECTION2, MT_SPLASH_SECTION3, MT_SPLASH_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esSplashSpecial[type].g_iHumanMode, value, -1, 1); - g_esSplashSpecial[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_SPLASH_SECTION, MT_SPLASH_SECTION2, MT_SPLASH_SECTION3, MT_SPLASH_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esSplashSpecial[type].g_flOpenAreasOnly, value, -1.0, 99999.0); - g_esSplashSpecial[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_SPLASH_SECTION, MT_SPLASH_SECTION2, MT_SPLASH_SECTION3, MT_SPLASH_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esSplashSpecial[type].g_iRequiresHumans, value, -1, 32); - g_esSplashSpecial[type].g_iSplashAbility = iGetKeyValue(subsection, MT_SPLASH_SECTION, MT_SPLASH_SECTION2, MT_SPLASH_SECTION3, MT_SPLASH_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esSplashSpecial[type].g_iSplashAbility, value, -1, 1); - g_esSplashSpecial[type].g_iSplashMessage = iGetKeyValue(subsection, MT_SPLASH_SECTION, MT_SPLASH_SECTION2, MT_SPLASH_SECTION3, MT_SPLASH_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esSplashSpecial[type].g_iSplashMessage, value, -1, 1); - g_esSplashSpecial[type].g_iSplashSight = iGetKeyValue(subsection, MT_SPLASH_SECTION, MT_SPLASH_SECTION2, MT_SPLASH_SECTION3, MT_SPLASH_SECTION4, key, "AbilitySight", "Ability Sight", "Ability_Sight", "sight", g_esSplashSpecial[type].g_iSplashSight, value, -1, 5); - g_esSplashSpecial[type].g_flSplashChance = flGetKeyValue(subsection, MT_SPLASH_SECTION, MT_SPLASH_SECTION2, MT_SPLASH_SECTION3, MT_SPLASH_SECTION4, key, "SplashChance", "Splash Chance", "Splash_Chance", "chance", g_esSplashSpecial[type].g_flSplashChance, value, -1.0, 100.0); - g_esSplashSpecial[type].g_iSplashCooldown = iGetKeyValue(subsection, MT_SPLASH_SECTION, MT_SPLASH_SECTION2, MT_SPLASH_SECTION3, MT_SPLASH_SECTION4, key, "SplashCooldown", "Splash Cooldown", "Splash_Cooldown", "cooldown", g_esSplashSpecial[type].g_iSplashCooldown, value, -1, 99999); - g_esSplashSpecial[type].g_flSplashDamage = flGetKeyValue(subsection, MT_SPLASH_SECTION, MT_SPLASH_SECTION2, MT_SPLASH_SECTION3, MT_SPLASH_SECTION4, key, "SplashDamage", "Splash Damage", "Splash_Damage", "damage", g_esSplashSpecial[type].g_flSplashDamage, value, -1.0, 99999.0); - g_esSplashSpecial[type].g_iSplashDuration = iGetKeyValue(subsection, MT_SPLASH_SECTION, MT_SPLASH_SECTION2, MT_SPLASH_SECTION3, MT_SPLASH_SECTION4, key, "SplashDuration", "Splash Duration", "Splash_Duration", "duration", g_esSplashSpecial[type].g_iSplashDuration, value, -1, 99999); - g_esSplashSpecial[type].g_flSplashInterval = flGetKeyValue(subsection, MT_SPLASH_SECTION, MT_SPLASH_SECTION2, MT_SPLASH_SECTION3, MT_SPLASH_SECTION4, key, "SplashInterval", "Splash Interval", "Splash_Interval", "interval", g_esSplashSpecial[type].g_flSplashInterval, value, -1.0, 99999.0); - g_esSplashSpecial[type].g_flSplashRange = flGetKeyValue(subsection, MT_SPLASH_SECTION, MT_SPLASH_SECTION2, MT_SPLASH_SECTION3, MT_SPLASH_SECTION4, key, "SplashRange", "Splash Range", "Splash_Range", "range", g_esSplashSpecial[type].g_flSplashRange, value, -1.0, 99999.0); - } - else - { - g_esSplashAbility[type].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_SPLASH_SECTION, MT_SPLASH_SECTION2, MT_SPLASH_SECTION3, MT_SPLASH_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esSplashAbility[type].g_flCloseAreasOnly, value, -1.0, 99999.0); - g_esSplashAbility[type].g_iComboAbility = iGetKeyValue(subsection, MT_SPLASH_SECTION, MT_SPLASH_SECTION2, MT_SPLASH_SECTION3, MT_SPLASH_SECTION4, key, "ComboAbility", "Combo Ability", "Combo_Ability", "combo", g_esSplashAbility[type].g_iComboAbility, value, -1, 1); - g_esSplashAbility[type].g_iHumanAbility = iGetKeyValue(subsection, MT_SPLASH_SECTION, MT_SPLASH_SECTION2, MT_SPLASH_SECTION3, MT_SPLASH_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esSplashAbility[type].g_iHumanAbility, value, -1, 2); - g_esSplashAbility[type].g_iHumanAmmo = iGetKeyValue(subsection, MT_SPLASH_SECTION, MT_SPLASH_SECTION2, MT_SPLASH_SECTION3, MT_SPLASH_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esSplashAbility[type].g_iHumanAmmo, value, -1, 99999); - g_esSplashAbility[type].g_iHumanCooldown = iGetKeyValue(subsection, MT_SPLASH_SECTION, MT_SPLASH_SECTION2, MT_SPLASH_SECTION3, MT_SPLASH_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esSplashAbility[type].g_iHumanCooldown, value, -1, 99999); - g_esSplashAbility[type].g_iHumanDuration = iGetKeyValue(subsection, MT_SPLASH_SECTION, MT_SPLASH_SECTION2, MT_SPLASH_SECTION3, MT_SPLASH_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esSplashAbility[type].g_iHumanDuration, value, -1, 99999); - g_esSplashAbility[type].g_iHumanMode = iGetKeyValue(subsection, MT_SPLASH_SECTION, MT_SPLASH_SECTION2, MT_SPLASH_SECTION3, MT_SPLASH_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esSplashAbility[type].g_iHumanMode, value, -1, 1); - g_esSplashAbility[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_SPLASH_SECTION, MT_SPLASH_SECTION2, MT_SPLASH_SECTION3, MT_SPLASH_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esSplashAbility[type].g_flOpenAreasOnly, value, -1.0, 99999.0); - g_esSplashAbility[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_SPLASH_SECTION, MT_SPLASH_SECTION2, MT_SPLASH_SECTION3, MT_SPLASH_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esSplashAbility[type].g_iRequiresHumans, value, -1, 32); - g_esSplashAbility[type].g_iSplashAbility = iGetKeyValue(subsection, MT_SPLASH_SECTION, MT_SPLASH_SECTION2, MT_SPLASH_SECTION3, MT_SPLASH_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esSplashAbility[type].g_iSplashAbility, value, -1, 1); - g_esSplashAbility[type].g_iSplashMessage = iGetKeyValue(subsection, MT_SPLASH_SECTION, MT_SPLASH_SECTION2, MT_SPLASH_SECTION3, MT_SPLASH_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esSplashAbility[type].g_iSplashMessage, value, -1, 1); - g_esSplashAbility[type].g_iSplashSight = iGetKeyValue(subsection, MT_SPLASH_SECTION, MT_SPLASH_SECTION2, MT_SPLASH_SECTION3, MT_SPLASH_SECTION4, key, "AbilitySight", "Ability Sight", "Ability_Sight", "sight", g_esSplashAbility[type].g_iSplashSight, value, -1, 5); - g_esSplashAbility[type].g_flSplashChance = flGetKeyValue(subsection, MT_SPLASH_SECTION, MT_SPLASH_SECTION2, MT_SPLASH_SECTION3, MT_SPLASH_SECTION4, key, "SplashChance", "Splash Chance", "Splash_Chance", "chance", g_esSplashAbility[type].g_flSplashChance, value, -1.0, 100.0); - g_esSplashAbility[type].g_iSplashCooldown = iGetKeyValue(subsection, MT_SPLASH_SECTION, MT_SPLASH_SECTION2, MT_SPLASH_SECTION3, MT_SPLASH_SECTION4, key, "SplashCooldown", "Splash Cooldown", "Splash_Cooldown", "cooldown", g_esSplashAbility[type].g_iSplashCooldown, value, -1, 99999); - g_esSplashAbility[type].g_flSplashDamage = flGetKeyValue(subsection, MT_SPLASH_SECTION, MT_SPLASH_SECTION2, MT_SPLASH_SECTION3, MT_SPLASH_SECTION4, key, "SplashDamage", "Splash Damage", "Splash_Damage", "damage", g_esSplashAbility[type].g_flSplashDamage, value, -1.0, 99999.0); - g_esSplashAbility[type].g_iSplashDuration = iGetKeyValue(subsection, MT_SPLASH_SECTION, MT_SPLASH_SECTION2, MT_SPLASH_SECTION3, MT_SPLASH_SECTION4, key, "SplashDuration", "Splash Duration", "Splash_Duration", "duration", g_esSplashAbility[type].g_iSplashDuration, value, -1, 99999); - g_esSplashAbility[type].g_flSplashInterval = flGetKeyValue(subsection, MT_SPLASH_SECTION, MT_SPLASH_SECTION2, MT_SPLASH_SECTION3, MT_SPLASH_SECTION4, key, "SplashInterval", "Splash Interval", "Splash_Interval", "interval", g_esSplashAbility[type].g_flSplashInterval, value, -1.0, 99999.0); - g_esSplashAbility[type].g_flSplashRange = flGetKeyValue(subsection, MT_SPLASH_SECTION, MT_SPLASH_SECTION2, MT_SPLASH_SECTION3, MT_SPLASH_SECTION4, key, "SplashRange", "Splash Range", "Splash_Range", "range", g_esSplashAbility[type].g_flSplashRange, value, -1.0, 99999.0); - g_esSplashAbility[type].g_iAccessFlags = iGetAdminFlagsValue(subsection, MT_SPLASH_SECTION, MT_SPLASH_SECTION2, MT_SPLASH_SECTION3, MT_SPLASH_SECTION4, key, "AccessFlags", "Access Flags", "Access_Flags", "access", value); - g_esSplashAbility[type].g_iImmunityFlags = iGetAdminFlagsValue(subsection, MT_SPLASH_SECTION, MT_SPLASH_SECTION2, MT_SPLASH_SECTION3, MT_SPLASH_SECTION4, key, "ImmunityFlags", "Immunity Flags", "Immunity_Flags", "immunity", value); - } - } -} - -#if defined MT_ABILITIES_MAIN2 -void vSplashSettingsCached(int tank, bool apply, int type) -#else -public void MT_OnSettingsCached(int tank, bool apply, int type) -#endif -{ - bool bHuman = bIsValidClient(tank, MT_CHECK_FAKECLIENT); - g_esSplashPlayer[tank].g_iTankTypeRecorded = apply ? MT_GetRecordedTankType(tank, type) : 0; - g_esSplashPlayer[tank].g_iTankType = apply ? type : 0; - int iType = g_esSplashPlayer[tank].g_iTankTypeRecorded; - - if (bIsSpecialInfected(tank, MT_CHECK_INDEX|MT_CHECK_INGAME)) - { - g_esSplashCache[tank].g_flCloseAreasOnly = flGetSubSettingValue(apply, bHuman, g_esSplashTeammate[tank].g_flCloseAreasOnly, g_esSplashPlayer[tank].g_flCloseAreasOnly, g_esSplashSpecial[iType].g_flCloseAreasOnly, g_esSplashAbility[iType].g_flCloseAreasOnly, 1); - g_esSplashCache[tank].g_iComboAbility = iGetSubSettingValue(apply, bHuman, g_esSplashTeammate[tank].g_iComboAbility, g_esSplashPlayer[tank].g_iComboAbility, g_esSplashSpecial[iType].g_iComboAbility, g_esSplashAbility[iType].g_iComboAbility, 1); - g_esSplashCache[tank].g_flSplashChance = flGetSubSettingValue(apply, bHuman, g_esSplashTeammate[tank].g_flSplashChance, g_esSplashPlayer[tank].g_flSplashChance, g_esSplashSpecial[iType].g_flSplashChance, g_esSplashAbility[iType].g_flSplashChance, 1); - g_esSplashCache[tank].g_flSplashDamage = flGetSubSettingValue(apply, bHuman, g_esSplashTeammate[tank].g_flSplashDamage, g_esSplashPlayer[tank].g_flSplashDamage, g_esSplashSpecial[iType].g_flSplashDamage, g_esSplashAbility[iType].g_flSplashDamage, 1); - g_esSplashCache[tank].g_flSplashInterval = flGetSubSettingValue(apply, bHuman, g_esSplashTeammate[tank].g_flSplashInterval, g_esSplashPlayer[tank].g_flSplashInterval, g_esSplashSpecial[iType].g_flSplashInterval, g_esSplashAbility[iType].g_flSplashInterval, 1); - g_esSplashCache[tank].g_flSplashRange = flGetSubSettingValue(apply, bHuman, g_esSplashTeammate[tank].g_flSplashRange, g_esSplashPlayer[tank].g_flSplashRange, g_esSplashSpecial[iType].g_flSplashRange, g_esSplashAbility[iType].g_flSplashRange, 1); - g_esSplashCache[tank].g_iHumanAbility = iGetSubSettingValue(apply, bHuman, g_esSplashTeammate[tank].g_iHumanAbility, g_esSplashPlayer[tank].g_iHumanAbility, g_esSplashSpecial[iType].g_iHumanAbility, g_esSplashAbility[iType].g_iHumanAbility, 1); - g_esSplashCache[tank].g_iHumanAmmo = iGetSubSettingValue(apply, bHuman, g_esSplashTeammate[tank].g_iHumanAmmo, g_esSplashPlayer[tank].g_iHumanAmmo, g_esSplashSpecial[iType].g_iHumanAmmo, g_esSplashAbility[iType].g_iHumanAmmo, 1); - g_esSplashCache[tank].g_iHumanCooldown = iGetSubSettingValue(apply, bHuman, g_esSplashTeammate[tank].g_iHumanCooldown, g_esSplashPlayer[tank].g_iHumanCooldown, g_esSplashSpecial[iType].g_iHumanCooldown, g_esSplashAbility[iType].g_iHumanCooldown, 1); - g_esSplashCache[tank].g_iHumanDuration = iGetSubSettingValue(apply, bHuman, g_esSplashTeammate[tank].g_iHumanDuration, g_esSplashPlayer[tank].g_iHumanDuration, g_esSplashSpecial[iType].g_iHumanDuration, g_esSplashAbility[iType].g_iHumanDuration, 1); - g_esSplashCache[tank].g_iHumanMode = iGetSubSettingValue(apply, bHuman, g_esSplashTeammate[tank].g_iHumanMode, g_esSplashPlayer[tank].g_iHumanMode, g_esSplashSpecial[iType].g_iHumanMode, g_esSplashAbility[iType].g_iHumanMode, 1); - g_esSplashCache[tank].g_flOpenAreasOnly = flGetSubSettingValue(apply, bHuman, g_esSplashTeammate[tank].g_flOpenAreasOnly, g_esSplashPlayer[tank].g_flOpenAreasOnly, g_esSplashSpecial[iType].g_flOpenAreasOnly, g_esSplashAbility[iType].g_flOpenAreasOnly, 1); - g_esSplashCache[tank].g_iRequiresHumans = iGetSubSettingValue(apply, bHuman, g_esSplashTeammate[tank].g_iRequiresHumans, g_esSplashPlayer[tank].g_iRequiresHumans, g_esSplashSpecial[iType].g_iRequiresHumans, g_esSplashAbility[iType].g_iRequiresHumans, 1); - g_esSplashCache[tank].g_iSplashAbility = iGetSubSettingValue(apply, bHuman, g_esSplashTeammate[tank].g_iSplashAbility, g_esSplashPlayer[tank].g_iSplashAbility, g_esSplashSpecial[iType].g_iSplashAbility, g_esSplashAbility[iType].g_iSplashAbility, 1); - g_esSplashCache[tank].g_iSplashCooldown = iGetSubSettingValue(apply, bHuman, g_esSplashTeammate[tank].g_iSplashCooldown, g_esSplashPlayer[tank].g_iSplashCooldown, g_esSplashSpecial[iType].g_iSplashCooldown, g_esSplashAbility[iType].g_iSplashCooldown, 1); - g_esSplashCache[tank].g_iSplashDuration = iGetSubSettingValue(apply, bHuman, g_esSplashTeammate[tank].g_iSplashDuration, g_esSplashPlayer[tank].g_iSplashDuration, g_esSplashSpecial[iType].g_iSplashDuration, g_esSplashAbility[iType].g_iSplashDuration, 1); - g_esSplashCache[tank].g_iSplashMessage = iGetSubSettingValue(apply, bHuman, g_esSplashTeammate[tank].g_iSplashMessage, g_esSplashPlayer[tank].g_iSplashMessage, g_esSplashSpecial[iType].g_iSplashMessage, g_esSplashAbility[iType].g_iSplashMessage, 1); - g_esSplashCache[tank].g_iSplashSight = iGetSubSettingValue(apply, bHuman, g_esSplashTeammate[tank].g_iSplashSight, g_esSplashPlayer[tank].g_iSplashSight, g_esSplashSpecial[iType].g_iSplashSight, g_esSplashAbility[iType].g_iSplashSight, 1); - } - else - { - g_esSplashCache[tank].g_flCloseAreasOnly = flGetSettingValue(apply, bHuman, g_esSplashPlayer[tank].g_flCloseAreasOnly, g_esSplashAbility[iType].g_flCloseAreasOnly, 1); - g_esSplashCache[tank].g_iComboAbility = iGetSettingValue(apply, bHuman, g_esSplashPlayer[tank].g_iComboAbility, g_esSplashAbility[iType].g_iComboAbility, 1); - g_esSplashCache[tank].g_flSplashChance = flGetSettingValue(apply, bHuman, g_esSplashPlayer[tank].g_flSplashChance, g_esSplashAbility[iType].g_flSplashChance, 1); - g_esSplashCache[tank].g_flSplashDamage = flGetSettingValue(apply, bHuman, g_esSplashPlayer[tank].g_flSplashDamage, g_esSplashAbility[iType].g_flSplashDamage, 1); - g_esSplashCache[tank].g_flSplashInterval = flGetSettingValue(apply, bHuman, g_esSplashPlayer[tank].g_flSplashInterval, g_esSplashAbility[iType].g_flSplashInterval, 1); - g_esSplashCache[tank].g_flSplashRange = flGetSettingValue(apply, bHuman, g_esSplashPlayer[tank].g_flSplashRange, g_esSplashAbility[iType].g_flSplashRange, 1); - g_esSplashCache[tank].g_iHumanAbility = iGetSettingValue(apply, bHuman, g_esSplashPlayer[tank].g_iHumanAbility, g_esSplashAbility[iType].g_iHumanAbility, 1); - g_esSplashCache[tank].g_iHumanAmmo = iGetSettingValue(apply, bHuman, g_esSplashPlayer[tank].g_iHumanAmmo, g_esSplashAbility[iType].g_iHumanAmmo, 1); - g_esSplashCache[tank].g_iHumanCooldown = iGetSettingValue(apply, bHuman, g_esSplashPlayer[tank].g_iHumanCooldown, g_esSplashAbility[iType].g_iHumanCooldown, 1); - g_esSplashCache[tank].g_iHumanDuration = iGetSettingValue(apply, bHuman, g_esSplashPlayer[tank].g_iHumanDuration, g_esSplashAbility[iType].g_iHumanDuration, 1); - g_esSplashCache[tank].g_iHumanMode = iGetSettingValue(apply, bHuman, g_esSplashPlayer[tank].g_iHumanMode, g_esSplashAbility[iType].g_iHumanMode, 1); - g_esSplashCache[tank].g_flOpenAreasOnly = flGetSettingValue(apply, bHuman, g_esSplashPlayer[tank].g_flOpenAreasOnly, g_esSplashAbility[iType].g_flOpenAreasOnly, 1); - g_esSplashCache[tank].g_iRequiresHumans = iGetSettingValue(apply, bHuman, g_esSplashPlayer[tank].g_iRequiresHumans, g_esSplashAbility[iType].g_iRequiresHumans, 1); - g_esSplashCache[tank].g_iSplashAbility = iGetSettingValue(apply, bHuman, g_esSplashPlayer[tank].g_iSplashAbility, g_esSplashAbility[iType].g_iSplashAbility, 1); - g_esSplashCache[tank].g_iSplashCooldown = iGetSettingValue(apply, bHuman, g_esSplashPlayer[tank].g_iSplashCooldown, g_esSplashAbility[iType].g_iSplashCooldown, 1); - g_esSplashCache[tank].g_iSplashDuration = iGetSettingValue(apply, bHuman, g_esSplashPlayer[tank].g_iSplashDuration, g_esSplashAbility[iType].g_iSplashDuration, 1); - g_esSplashCache[tank].g_iSplashMessage = iGetSettingValue(apply, bHuman, g_esSplashPlayer[tank].g_iSplashMessage, g_esSplashAbility[iType].g_iSplashMessage, 1); - g_esSplashCache[tank].g_iSplashSight = iGetSettingValue(apply, bHuman, g_esSplashPlayer[tank].g_iSplashSight, g_esSplashAbility[iType].g_iSplashSight, 1); - } -} - -#if defined MT_ABILITIES_MAIN2 -void vSplashCopyStats(int oldTank, int newTank) -#else -public void MT_OnCopyStats(int oldTank, int newTank) -#endif -{ - vSplashCopyStats2(oldTank, newTank); - - if (oldTank != newTank) - { - vRemoveSplash(oldTank); - } -} - -#if !defined MT_ABILITIES_MAIN2 -public void MT_OnPluginUpdate() -{ - MT_ReloadPlugin(null); -} -#endif - -#if defined MT_ABILITIES_MAIN2 -void vSplashEventFired(Event event, const char[] name) -#else -public void MT_OnEventFired(Event event, const char[] name, bool dontBroadcast) -#endif -{ - if (StrEqual(name, "bot_player_replace")) - { - int iBotId = event.GetInt("bot"), iBot = GetClientOfUserId(iBotId), - iTankId = event.GetInt("player"), iTank = GetClientOfUserId(iTankId); - if (bIsValidClient(iBot) && bIsInfected(iTank)) - { - vSplashCopyStats2(iBot, iTank); - vRemoveSplash(iBot); - } - } - else if (StrEqual(name, "mission_lost") || StrEqual(name, "round_start") || StrEqual(name, "round_end")) - { - vSplashReset(); - } - else if (StrEqual(name, "player_bot_replace")) - { - int iTankId = event.GetInt("player"), iTank = GetClientOfUserId(iTankId), - iBotId = event.GetInt("bot"), iBot = GetClientOfUserId(iBotId); - if (bIsValidClient(iTank) && bIsInfected(iBot)) - { - vSplashCopyStats2(iTank, iBot); - vRemoveSplash(iTank); - } - } - else if (StrEqual(name, "player_death") || StrEqual(name, "player_spawn")) - { - int iTankId = event.GetInt("userid"), iTank = GetClientOfUserId(iTankId); - if (MT_IsTankSupported(iTank, MT_CHECK_INDEX|MT_CHECK_INGAME)) - { - vRemoveSplash(iTank); - } - } -} - -#if defined MT_ABILITIES_MAIN2 -void vSplashAbilityActivated(int tank) -#else -public void MT_OnAbilityActivated(int tank) -#endif -{ - if (MT_IsTankSupported(tank, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_FAKECLIENT) && ((!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esSplashAbility[g_esSplashPlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esSplashPlayer[tank].g_iAccessFlags)) || g_esSplashCache[tank].g_iHumanAbility == 0)) - { - return; - } - - if (MT_IsTankSupported(tank) && (!bIsInfected(tank, MT_CHECK_FAKECLIENT) || g_esSplashCache[tank].g_iHumanAbility != 1) && MT_IsCustomTankSupported(tank) && g_esSplashCache[tank].g_iSplashAbility == 1 && g_esSplashCache[tank].g_iComboAbility == 0 && !g_esSplashPlayer[tank].g_bActivated) - { - vSplashAbility(tank); - } -} - -#if defined MT_ABILITIES_MAIN2 -void vSplashButtonPressed(int tank, int button) -#else -public void MT_OnButtonPressed(int tank, int button) -#endif -{ - if (MT_IsTankSupported(tank, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_ALIVE|MT_CHECK_FAKECLIENT) && MT_IsCustomTankSupported(tank)) - { - if (bIsAreaNarrow(tank, g_esSplashCache[tank].g_flOpenAreasOnly) || bIsAreaWide(tank, g_esSplashCache[tank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esSplashPlayer[tank].g_iTankType, tank) || (g_esSplashCache[tank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esSplashCache[tank].g_iRequiresHumans) || (!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esSplashAbility[g_esSplashPlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esSplashPlayer[tank].g_iAccessFlags))) - { - return; - } - - if ((button & MT_MAIN_KEY) && g_esSplashCache[tank].g_iSplashAbility == 1 && g_esSplashCache[tank].g_iHumanAbility == 1) - { - int iTime = GetTime(); - bool bRecharging = g_esSplashPlayer[tank].g_iCooldown != -1 && g_esSplashPlayer[tank].g_iCooldown >= iTime; - - switch (g_esSplashCache[tank].g_iHumanMode) - { - case 0: - { - if (!g_esSplashPlayer[tank].g_bActivated && !bRecharging) - { - vSplashAbility(tank); - } - else if (g_esSplashPlayer[tank].g_bActivated) - { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "SplashHuman3"); - } - else if (bRecharging) - { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "SplashHuman4", (g_esSplashPlayer[tank].g_iCooldown - iTime)); - } - } - case 1: - { - if (g_esSplashPlayer[tank].g_iAmmoCount < g_esSplashCache[tank].g_iHumanAmmo && g_esSplashCache[tank].g_iHumanAmmo > 0) - { - if (!g_esSplashPlayer[tank].g_bActivated && !bRecharging) - { - g_esSplashPlayer[tank].g_bActivated = true; - g_esSplashPlayer[tank].g_iAmmoCount++; - - vSplash2(tank); - MT_PrintToChat(tank, "%s %t", MT_TAG3, "SplashHuman", g_esSplashPlayer[tank].g_iAmmoCount, g_esSplashCache[tank].g_iHumanAmmo); - } - else if (g_esSplashPlayer[tank].g_bActivated) - { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "SplashHuman3"); - } - else if (bRecharging) - { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "SplashHuman4", (g_esSplashPlayer[tank].g_iCooldown - iTime)); - } - } - else - { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "SplashAmmo"); - } - } - } - } - } -} - -#if defined MT_ABILITIES_MAIN2 -void vSplashButtonReleased(int tank, int button) -#else -public void MT_OnButtonReleased(int tank, int button) -#endif -{ - if (MT_IsTankSupported(tank, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_ALIVE|MT_CHECK_FAKECLIENT) && g_esSplashCache[tank].g_iHumanAbility == 1) - { - if ((button & MT_MAIN_KEY) && g_esSplashCache[tank].g_iHumanMode == 1 && g_esSplashPlayer[tank].g_bActivated && (g_esSplashPlayer[tank].g_iCooldown == -1 || g_esSplashPlayer[tank].g_iCooldown <= GetTime())) - { - vSplashReset2(tank); - vSplashReset3(tank); - } - } -} - -#if defined MT_ABILITIES_MAIN2 -void vSplashChangeType(int tank, int oldType) -#else -public void MT_OnChangeType(int tank, int oldType, int newType, bool revert) -#endif -{ - if (oldType <= 0) - { - return; - } - - vRemoveSplash(tank); -} - -void vSplash(int tank, int pos = -1) -{ - if (g_esSplashPlayer[tank].g_iCooldown != -1 && g_esSplashPlayer[tank].g_iCooldown >= GetTime()) - { - return; - } - - g_esSplashPlayer[tank].g_bActivated = true; - - vSplash2(tank, pos); - - if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esSplashCache[tank].g_iHumanAbility == 1) - { - g_esSplashPlayer[tank].g_iAmmoCount++; - - MT_PrintToChat(tank, "%s %t", MT_TAG3, "SplashHuman", g_esSplashPlayer[tank].g_iAmmoCount, g_esSplashCache[tank].g_iHumanAmmo); - } - - if (g_esSplashCache[tank].g_iSplashMessage == 1) - { - char sTankName[64]; - MT_GetTankName(tank, sTankName); - MT_PrintToChatAll("%s %t", MT_TAG2, "Splash", sTankName); - MT_LogMessage(MT_LOG_ABILITY, "%s %T", MT_TAG, "Splash", LANG_SERVER, sTankName); - } -} - -void vSplash2(int tank, int pos = -1) -{ - if (bIsAreaNarrow(tank, g_esSplashCache[tank].g_flOpenAreasOnly) || bIsAreaWide(tank, g_esSplashCache[tank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esSplashPlayer[tank].g_iTankType, tank) || (g_esSplashCache[tank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esSplashCache[tank].g_iRequiresHumans) || (!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esSplashAbility[g_esSplashPlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esSplashPlayer[tank].g_iAccessFlags))) - { - return; - } - - float flInterval = (pos != -1) ? MT_GetCombinationSetting(tank, 6, pos) : g_esSplashCache[tank].g_flSplashInterval; - if (flInterval > 0.0) - { - DataPack dpSplash; - CreateDataTimer(flInterval, tTimerSplash, dpSplash, TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); - dpSplash.WriteCell(GetClientUserId(tank)); - dpSplash.WriteCell(g_esSplashPlayer[tank].g_iTankType); - dpSplash.WriteCell(GetTime()); - dpSplash.WriteCell(pos); - } -} - -void vSplashAbility(int tank) -{ - if ((g_esSplashPlayer[tank].g_iCooldown != -1 && g_esSplashPlayer[tank].g_iCooldown >= GetTime()) || bIsAreaNarrow(tank, g_esSplashCache[tank].g_flOpenAreasOnly) || bIsAreaWide(tank, g_esSplashCache[tank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esSplashPlayer[tank].g_iTankType, tank) || (g_esSplashCache[tank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esSplashCache[tank].g_iRequiresHumans) || (!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esSplashAbility[g_esSplashPlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esSplashPlayer[tank].g_iAccessFlags))) - { - return; - } - - if (!bIsInfected(tank, MT_CHECK_FAKECLIENT) || (g_esSplashPlayer[tank].g_iAmmoCount < g_esSplashCache[tank].g_iHumanAmmo && g_esSplashCache[tank].g_iHumanAmmo > 0)) - { - if (GetRandomFloat(0.1, 100.0) <= g_esSplashCache[tank].g_flSplashChance) - { - vSplash(tank); - } - else if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esSplashCache[tank].g_iHumanAbility == 1) - { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "SplashHuman2"); - } - } - else if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esSplashCache[tank].g_iHumanAbility == 1) - { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "SplashAmmo"); - } -} - -void vSplashCopyStats2(int oldTank, int newTank) -{ - g_esSplashPlayer[newTank].g_iAmmoCount = g_esSplashPlayer[oldTank].g_iAmmoCount; - g_esSplashPlayer[newTank].g_iCooldown = g_esSplashPlayer[oldTank].g_iCooldown; -} - -void vRemoveSplash(int tank) -{ - g_esSplashPlayer[tank].g_bActivated = false; - g_esSplashPlayer[tank].g_iAmmoCount = 0; - g_esSplashPlayer[tank].g_iCooldown = -1; -} - -void vSplashReset() -{ - for (int iPlayer = 1; iPlayer <= MaxClients; iPlayer++) - { - if (bIsValidClient(iPlayer, MT_CHECK_INGAME)) - { - vRemoveSplash(iPlayer); - } - } -} - -void vSplashReset2(int tank) -{ - g_esSplashPlayer[tank].g_bActivated = false; - - if (g_esSplashCache[tank].g_iSplashMessage == 1) - { - char sTankName[64]; - MT_GetTankName(tank, sTankName); - MT_PrintToChatAll("%s %t", MT_TAG2, "Splash2", sTankName); - MT_LogMessage(MT_LOG_ABILITY, "%s %T", MT_TAG, "Splash2", LANG_SERVER, sTankName); - } -} - -void vSplashReset3(int tank) -{ - int iTime = GetTime(), iPos = g_esSplashAbility[g_esSplashPlayer[tank].g_iTankTypeRecorded].g_iComboPosition, iCooldown = (iPos != -1) ? RoundToNearest(MT_GetCombinationSetting(tank, 2, iPos)) : g_esSplashCache[tank].g_iSplashCooldown; - iCooldown = (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esSplashCache[tank].g_iHumanAbility == 1 && g_esSplashCache[tank].g_iHumanMode == 0 && g_esSplashPlayer[tank].g_iAmmoCount < g_esSplashCache[tank].g_iHumanAmmo && g_esSplashCache[tank].g_iHumanAmmo > 0) ? g_esSplashCache[tank].g_iHumanCooldown : iCooldown; - g_esSplashPlayer[tank].g_iCooldown = (iTime + iCooldown); - if (g_esSplashPlayer[tank].g_iCooldown != -1 && g_esSplashPlayer[tank].g_iCooldown >= iTime) - { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "SplashHuman5", (g_esSplashPlayer[tank].g_iCooldown - iTime)); - } -} - -void tTimerSplashCombo(Handle timer, DataPack pack) -{ - pack.Reset(); - - int iTank = GetClientOfUserId(pack.ReadCell()); - if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esSplashAbility[g_esSplashPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esSplashPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esSplashPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esSplashCache[iTank].g_iSplashAbility == 0 || g_esSplashPlayer[iTank].g_bActivated) - { - return; - } - - int iPos = pack.ReadCell(); - vSplash(iTank, iPos); -} - -Action tTimerSplash(Handle timer, DataPack pack) -{ - pack.Reset(); - - int iTank = GetClientOfUserId(pack.ReadCell()), iType = pack.ReadCell(); - if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || bIsAreaNarrow(iTank, g_esSplashCache[iTank].g_flOpenAreasOnly) || bIsAreaWide(iTank, g_esSplashCache[iTank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esSplashPlayer[iTank].g_iTankType, iTank) || (g_esSplashCache[iTank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esSplashCache[iTank].g_iRequiresHumans) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esSplashAbility[g_esSplashPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esSplashPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esSplashPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || iType != g_esSplashPlayer[iTank].g_iTankType || g_esSplashCache[iTank].g_iSplashAbility == 0 || !g_esSplashPlayer[iTank].g_bActivated) - { - vSplashReset2(iTank); - - return Plugin_Stop; - } - - bool bHuman = bIsInfected(iTank, MT_CHECK_FAKECLIENT); - int iTime = pack.ReadCell(), iCurrentTime = GetTime(), iPos = pack.ReadCell(), - iDuration = (iPos != -1) ? RoundToNearest(MT_GetCombinationSetting(iTank, 5, iPos)) : g_esSplashCache[iTank].g_iSplashDuration; - iDuration = (bHuman && g_esSplashCache[iTank].g_iHumanAbility == 1) ? g_esSplashCache[iTank].g_iHumanDuration : iDuration; - if (iDuration > 0 && (!bHuman || (bHuman && g_esSplashCache[iTank].g_iHumanAbility == 1 && g_esSplashCache[iTank].g_iHumanMode == 0)) && (iTime + iDuration) < iCurrentTime && (g_esSplashPlayer[iTank].g_iCooldown == -1 || g_esSplashPlayer[iTank].g_iCooldown < iCurrentTime)) - { - vSplashReset2(iTank); - vSplashReset3(iTank); - - return Plugin_Stop; - } - - float flTankPos[3], flSurvivorPos[3]; - GetClientAbsOrigin(iTank, flTankPos); - float flDamage = (iPos != -1) ? MT_GetCombinationSetting(iTank, 3, iPos) : g_esSplashCache[iTank].g_flSplashDamage, - flRange = (iPos != -1) ? MT_GetCombinationSetting(iTank, 9, iPos) : g_esSplashCache[iTank].g_flSplashRange; - if (flDamage > 0.0) - { - for (int iSurvivor = 1; iSurvivor <= MaxClients; iSurvivor++) - { - if (bIsSurvivor(iSurvivor, MT_CHECK_INGAME|MT_CHECK_ALIVE) && !MT_IsAdminImmune(iSurvivor, iTank) && !bIsAdminImmune(iSurvivor, g_esSplashPlayer[iTank].g_iTankType, g_esSplashAbility[g_esSplashPlayer[iTank].g_iTankTypeRecorded].g_iImmunityFlags, g_esSplashPlayer[iSurvivor].g_iImmunityFlags)) - { - GetClientAbsOrigin(iSurvivor, flSurvivorPos); - if (GetVectorDistance(flTankPos, flSurvivorPos) <= flRange && bIsVisibleToPlayer(iTank, iSurvivor, g_esSplashCache[iTank].g_iSplashSight, .range = flRange)) - { - vDamagePlayer(iSurvivor, iTank, MT_GetScaledDamage(flDamage), "65536"); - vAttachParticle(iSurvivor, PARTICLE_BLOOD, 0.1); - } - } - } - } - - return Plugin_Continue; -} \ No newline at end of file diff --git a/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_splatter.sp b/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_splatter.sp deleted file mode 100644 index c0b7c00d72..0000000000 --- a/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_splatter.sp +++ /dev/null @@ -1,1327 +0,0 @@ -/** - * Mutant Tanks: a L4D/L4D2 SourceMod Plugin - * Copyright (C) 2024 Alfred "Psyk0tik" Llagas - * - * 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 . - **/ - -#define MT_SPLATTER_COMPILE_METHOD 0 // 0: packaged, 1: standalone - -#if !defined MT_ABILITIES_MAIN2 - #if MT_SPLATTER_COMPILE_METHOD == 1 - #include - #include - #else - #error This file must be inside "scripting/mutant_tanks/abilities2" while compiling "mt_abilities2.sp" to include its content. - #endif -public Plugin myinfo = -{ - name = "[MT] Splatter Ability", - author = MT_AUTHOR, - description = "The Mutant Tank splatters the survivors' screens.", - version = MT_VERSION, - url = MT_URL -}; - -bool g_bDedicated, g_bLateLoad, g_bSecondGame; - -public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max) -{ - switch (GetEngineVersion()) - { - case Engine_Left4Dead: g_bSecondGame = false; - case Engine_Left4Dead2: g_bSecondGame = true; - default: - { - strcopy(error, err_max, "\"[MT] Splatter Ability\" only supports Left 4 Dead 1 & 2."); - - return APLRes_SilentFailure; - } - } - - g_bDedicated = IsDedicatedServer(); - g_bLateLoad = late; - - return APLRes_Success; -} -#else - #if MT_SPLATTER_COMPILE_METHOD == 1 - #error This file must be compiled as a standalone plugin. - #endif -#endif - -#define MT_SPLATTER_SECTION "splatterability" -#define MT_SPLATTER_SECTION2 "splatter ability" -#define MT_SPLATTER_SECTION3 "splatter_ability" -#define MT_SPLATTER_SECTION4 "splatter" - -#define MT_MENU_SPLATTER "Splatter Ability" - -char g_sParticles[][] = -{ - "screen_adrenaline", - "screen_adrenaline_b", - "screen_hurt", - "screen_hurt_b", - "screen_blood_splatter", - "screen_blood_splatter_a", - "screen_blood_splatter_b", - "screen_blood_splatter_melee_b", - "screen_blood_splatter_melee", - "screen_blood_splatter_melee_blunt", - "smoker_screen_effect", - "smoker_screen_effect_b", - "screen_mud_splatter", - "screen_mud_splatter_a", - "screen_bashed", - "screen_bashed_b", - "screen_bashed_d", - "burning_character_screen", - "storm_lightning_screenglow" -}; - -enum struct esSplatterPlayer -{ - bool g_bAffected; - bool g_bFailed; - bool g_bNoAmmo; - - float g_flCloseAreasOnly; - float g_flOpenAreasOnly; - float g_flSplatterChance; - float g_flSplatterInterval; - float g_flSplatterRange; - float g_flSplatterRangeChance; - - int g_iAccessFlags; - int g_iAmmoCount; - int g_iComboAbility; - int g_iCooldown; - int g_iHumanAbility; - int g_iHumanAmmo; - int g_iHumanCooldown; - int g_iHumanRangeCooldown; - int g_iImmunityFlags; - int g_iOwner; - int g_iRangeCooldown; - int g_iRequiresHumans; - int g_iSplatterAbility; - int g_iSplatterCooldown; - int g_iSplatterDuration; - int g_iSplatterEffect; - int g_iSplatterHit; - int g_iSplatterHitMode; - int g_iSplatterMessage; - int g_iSplatterRangeCooldown; - int g_iSplatterSight; - int g_iSplatterType; - int g_iTankType; - int g_iTankTypeRecorded; -} - -esSplatterPlayer g_esSplatterPlayer[MAXPLAYERS + 1]; - -enum struct esSplatterTeammate -{ - float g_flCloseAreasOnly; - float g_flOpenAreasOnly; - float g_flSplatterChance; - float g_flSplatterInterval; - float g_flSplatterRange; - float g_flSplatterRangeChance; - - int g_iComboAbility; - int g_iHumanAbility; - int g_iHumanAmmo; - int g_iHumanCooldown; - int g_iHumanRangeCooldown; - int g_iRequiresHumans; - int g_iSplatterAbility; - int g_iSplatterCooldown; - int g_iSplatterDuration; - int g_iSplatterEffect; - int g_iSplatterHit; - int g_iSplatterHitMode; - int g_iSplatterMessage; - int g_iSplatterRangeCooldown; - int g_iSplatterSight; - int g_iSplatterType; -} - -esSplatterTeammate g_esSplatterTeammate[MAXPLAYERS + 1]; - -enum struct esSplatterAbility -{ - float g_flCloseAreasOnly; - float g_flOpenAreasOnly; - float g_flSplatterChance; - float g_flSplatterInterval; - float g_flSplatterRange; - float g_flSplatterRangeChance; - - int g_iAccessFlags; - int g_iComboAbility; - int g_iHumanAbility; - int g_iHumanAmmo; - int g_iHumanCooldown; - int g_iHumanRangeCooldown; - int g_iImmunityFlags; - int g_iRequiresHumans; - int g_iSplatterAbility; - int g_iSplatterCooldown; - int g_iSplatterDuration; - int g_iSplatterEffect; - int g_iSplatterHit; - int g_iSplatterHitMode; - int g_iSplatterMessage; - int g_iSplatterRangeCooldown; - int g_iSplatterSight; - int g_iSplatterType; -} - -esSplatterAbility g_esSplatterAbility[MT_MAXTYPES + 1]; - -enum struct esSplatterSpecial -{ - float g_flCloseAreasOnly; - float g_flOpenAreasOnly; - float g_flSplatterChance; - float g_flSplatterInterval; - float g_flSplatterRange; - float g_flSplatterRangeChance; - - int g_iComboAbility; - int g_iHumanAbility; - int g_iHumanAmmo; - int g_iHumanCooldown; - int g_iHumanRangeCooldown; - int g_iRequiresHumans; - int g_iSplatterAbility; - int g_iSplatterCooldown; - int g_iSplatterDuration; - int g_iSplatterEffect; - int g_iSplatterHit; - int g_iSplatterHitMode; - int g_iSplatterMessage; - int g_iSplatterRangeCooldown; - int g_iSplatterSight; - int g_iSplatterType; -} - -esSplatterSpecial g_esSplatterSpecial[MT_MAXTYPES + 1]; - -enum struct esSplatterCache -{ - float g_flCloseAreasOnly; - float g_flOpenAreasOnly; - float g_flSplatterChance; - float g_flSplatterInterval; - float g_flSplatterRange; - float g_flSplatterRangeChance; - - int g_iComboAbility; - int g_iHumanAbility; - int g_iHumanAmmo; - int g_iHumanCooldown; - int g_iHumanRangeCooldown; - int g_iRequiresHumans; - int g_iSplatterAbility; - int g_iSplatterCooldown; - int g_iSplatterDuration; - int g_iSplatterEffect; - int g_iSplatterHit; - int g_iSplatterHitMode; - int g_iSplatterMessage; - int g_iSplatterRangeCooldown; - int g_iSplatterSight; - int g_iSplatterType; -} - -esSplatterCache g_esSplatterCache[MAXPLAYERS + 1]; - -#if !defined MT_ABILITIES_MAIN2 -public void OnPluginStart() -{ - LoadTranslations("common.phrases"); - LoadTranslations("mutant_tanks.phrases"); - LoadTranslations("mutant_tanks_names.phrases"); - - RegConsoleCmd("sm_mt_splatter", cmdSplatterInfo, "View information about the Splatter ability."); - - if (g_bLateLoad) - { - for (int iPlayer = 1; iPlayer <= MaxClients; iPlayer++) - { - if (bIsValidClient(iPlayer, MT_CHECK_INGAME)) - { - OnClientPutInServer(iPlayer); - } - } - - g_bLateLoad = false; - } -} -#endif - -#if defined MT_ABILITIES_MAIN2 -void vSplatterMapStart() -#else -public void OnMapStart() -#endif -{ - if (g_bSecondGame) - { - for (int iPos = 0; iPos < (sizeof g_sParticles); iPos++) - { - iPrecacheParticle(g_sParticles[iPos]); - } - } - - vSplatterReset(); -} - -#if defined MT_ABILITIES_MAIN2 -void vSplatterClientPutInServer(int client) -#else -public void OnClientPutInServer(int client) -#endif -{ - SDKHook(client, SDKHook_OnTakeDamage, OnSplatterTakeDamage); - vRemoveSplatter(client); -} - -#if defined MT_ABILITIES_MAIN2 -void vSplatterClientDisconnect_Post(int client) -#else -public void OnClientDisconnect_Post(int client) -#endif -{ - vRemoveSplatter(client); -} - -#if defined MT_ABILITIES_MAIN2 -void vSplatterMapEnd() -#else -public void OnMapEnd() -#endif -{ - vSplatterReset(); -} - -#if !defined MT_ABILITIES_MAIN2 -Action cmdSplatterInfo(int client, int args) -{ - client = iGetListenServerHost(client, g_bDedicated); - - if (!MT_IsCorePluginEnabled()) - { - MT_ReplyToCommand(client, "%s %t", MT_TAG5, "PluginDisabled"); - - return Plugin_Handled; - } - - if (!bIsValidClient(client, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_FAKECLIENT)) - { - MT_ReplyToCommand(client, "%s %t", MT_TAG, "Command is in-game only"); - - return Plugin_Handled; - } - - switch (IsVoteInProgress()) - { - case true: MT_ReplyToCommand(client, "%s %t", MT_TAG2, "Vote in Progress"); - case false: vSplatterMenu(client, MT_SPLATTER_SECTION4, 0); - } - - return Plugin_Handled; -} -#endif - -void vSplatterMenu(int client, const char[] name, int item) -{ - if (StrContains(MT_SPLATTER_SECTION4, name, false) == -1) - { - return; - } - - Menu mAbilityMenu = new Menu(iSplatterMenuHandler, MENU_ACTIONS_DEFAULT|MenuAction_Display|MenuAction_DisplayItem); - mAbilityMenu.SetTitle("Splatter Ability Information"); - mAbilityMenu.AddItem("Status", "Status"); - mAbilityMenu.AddItem("Ammunition", "Ammunition"); - mAbilityMenu.AddItem("Buttons", "Buttons"); - mAbilityMenu.AddItem("Cooldown", "Cooldown"); - mAbilityMenu.AddItem("Details", "Details"); - mAbilityMenu.AddItem("Duration", "Duration"); - mAbilityMenu.AddItem("Human Support", "Human Support"); - mAbilityMenu.AddItem("Range Cooldown", "Range Cooldown"); - mAbilityMenu.DisplayAt(client, item, MENU_TIME_FOREVER); -} - -int iSplatterMenuHandler(Menu menu, MenuAction action, int param1, int param2) -{ - switch (action) - { - case MenuAction_End: delete menu; - case MenuAction_Select: - { - switch (param2) - { - case 0: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esSplatterCache[param1].g_iSplatterAbility == 0) ? "AbilityStatus1" : "AbilityStatus2"); - case 1: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityAmmo", (g_esSplatterCache[param1].g_iHumanAmmo - g_esSplatterPlayer[param1].g_iAmmoCount), g_esSplatterCache[param1].g_iHumanAmmo); - case 2: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtons2"); - case 3: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityCooldown", ((g_esSplatterCache[param1].g_iHumanAbility == 1) ? g_esSplatterCache[param1].g_iHumanCooldown : g_esSplatterCache[param1].g_iSplatterCooldown)); - case 4: MT_PrintToChat(param1, "%s %t", MT_TAG3, "SplatterDetails"); - case 5: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityDuration2", g_esSplatterCache[param1].g_iSplatterDuration); - case 6: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esSplatterCache[param1].g_iHumanAbility == 0) ? "AbilityHumanSupport1" : "AbilityHumanSupport2"); - case 7: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityRangeCooldown", ((g_esSplatterCache[param1].g_iHumanAbility == 1) ? g_esSplatterCache[param1].g_iHumanRangeCooldown : g_esSplatterCache[param1].g_iSplatterRangeCooldown)); - } - - if (bIsValidClient(param1, MT_CHECK_INGAME)) - { - vSplatterMenu(param1, MT_SPLATTER_SECTION4, menu.Selection); - } - } - case MenuAction_Display: - { - char sMenuTitle[PLATFORM_MAX_PATH]; - Panel pSplatter = view_as(param2); - FormatEx(sMenuTitle, sizeof sMenuTitle, "%T", "SplatterMenu", param1); - pSplatter.SetTitle(sMenuTitle); - } - case MenuAction_DisplayItem: - { - if (param2 >= 0) - { - char sMenuOption[PLATFORM_MAX_PATH]; - - switch (param2) - { - case 0: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Status", param1); - case 1: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Ammunition", param1); - case 2: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Buttons", param1); - case 3: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Cooldown", param1); - case 4: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Details", param1); - case 5: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Duration", param1); - case 6: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "HumanSupport", param1); - case 7: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "RangeCooldown", param1); - } - - return RedrawMenuItem(sMenuOption); - } - } - } - - return 0; -} - -#if defined MT_ABILITIES_MAIN2 -void vSplatterDisplayMenu(Menu menu) -#else -public void MT_OnDisplayMenu(Menu menu) -#endif -{ - menu.AddItem(MT_MENU_SPLATTER, MT_MENU_SPLATTER); -} - -#if defined MT_ABILITIES_MAIN2 -void vSplatterMenuItemSelected(int client, const char[] info) -#else -public void MT_OnMenuItemSelected(int client, const char[] info) -#endif -{ - if (StrEqual(info, MT_MENU_SPLATTER, false)) - { - vSplatterMenu(client, MT_SPLATTER_SECTION4, 0); - } -} - -#if defined MT_ABILITIES_MAIN2 -void vSplatterMenuItemDisplayed(int client, const char[] info, char[] buffer, int size) -#else -public void MT_OnMenuItemDisplayed(int client, const char[] info, char[] buffer, int size) -#endif -{ - if (StrEqual(info, MT_MENU_SPLATTER, false)) - { - FormatEx(buffer, size, "%T", "SplatterMenu2", client); - } -} - -Action OnSplatterTakeDamage(int victim, int &attacker, int &inflictor, float &damage, int &damagetype) -{ - if (MT_IsCorePluginEnabled() && bIsValidClient(victim, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_ALIVE) && damage > 0.0) - { - char sClassname[32]; - if (bIsValidEntity(inflictor)) - { - GetEntityClassname(inflictor, sClassname, sizeof sClassname); - } - - if (MT_IsTankSupported(attacker) && MT_IsCustomTankSupported(attacker) && (g_esSplatterCache[attacker].g_iSplatterHitMode == 0 || g_esSplatterCache[attacker].g_iSplatterHitMode == 1) && bIsHumanSurvivor(victim) && g_esSplatterCache[attacker].g_iComboAbility == 0) - { - if ((!MT_HasAdminAccess(attacker) && !bHasAdminAccess(attacker, g_esSplatterAbility[g_esSplatterPlayer[attacker].g_iTankTypeRecorded].g_iAccessFlags, g_esSplatterPlayer[attacker].g_iAccessFlags)) || MT_IsAdminImmune(victim, attacker) || bIsAdminImmune(victim, g_esSplatterPlayer[attacker].g_iTankType, g_esSplatterAbility[g_esSplatterPlayer[attacker].g_iTankTypeRecorded].g_iImmunityFlags, g_esSplatterPlayer[victim].g_iImmunityFlags)) - { - return Plugin_Continue; - } - - bool bCaught = bIsSurvivorCaught(victim); - if ((bIsSpecialInfected(attacker) && (bCaught || (!bCaught && (damagetype & DMG_CLUB)) || (bIsSpitter(attacker) && StrEqual(sClassname, "insect_swarm")))) || StrEqual(sClassname[7], "tank_claw") || StrEqual(sClassname, "tank_rock")) - { - vSplatterHit(victim, attacker, GetRandomFloat(0.1, 100.0), g_esSplatterCache[attacker].g_flSplatterChance, g_esSplatterCache[attacker].g_iSplatterHit, MT_MESSAGE_MELEE, MT_ATTACK_CLAW); - } - } - else if (MT_IsTankSupported(victim) && MT_IsCustomTankSupported(victim) && (g_esSplatterCache[victim].g_iSplatterHitMode == 0 || g_esSplatterCache[victim].g_iSplatterHitMode == 2) && bIsHumanSurvivor(attacker) && g_esSplatterCache[victim].g_iComboAbility == 0) - { - if ((!MT_HasAdminAccess(victim) && !bHasAdminAccess(victim, g_esSplatterAbility[g_esSplatterPlayer[victim].g_iTankTypeRecorded].g_iAccessFlags, g_esSplatterPlayer[victim].g_iAccessFlags)) || MT_IsAdminImmune(attacker, victim) || bIsAdminImmune(attacker, g_esSplatterPlayer[victim].g_iTankType, g_esSplatterAbility[g_esSplatterPlayer[victim].g_iTankTypeRecorded].g_iImmunityFlags, g_esSplatterPlayer[attacker].g_iImmunityFlags)) - { - return Plugin_Continue; - } - - if (StrEqual(sClassname[7], "melee")) - { - vSplatterHit(attacker, victim, GetRandomFloat(0.1, 100.0), g_esSplatterCache[victim].g_flSplatterChance, g_esSplatterCache[victim].g_iSplatterHit, MT_MESSAGE_MELEE, MT_ATTACK_MELEE); - } - } - } - - return Plugin_Continue; -} - -#if defined MT_ABILITIES_MAIN2 -void vSplatterPluginCheck(ArrayList list) -#else -public void MT_OnPluginCheck(ArrayList list) -#endif -{ - list.PushString(MT_MENU_SPLATTER); -} - -#if defined MT_ABILITIES_MAIN2 -void vSplatterAbilityCheck(ArrayList list, ArrayList list2, ArrayList list3, ArrayList list4) -#else -public void MT_OnAbilityCheck(ArrayList list, ArrayList list2, ArrayList list3, ArrayList list4) -#endif -{ - list.PushString(MT_SPLATTER_SECTION); - list2.PushString(MT_SPLATTER_SECTION2); - list3.PushString(MT_SPLATTER_SECTION3); - list4.PushString(MT_SPLATTER_SECTION4); -} - -#if defined MT_ABILITIES_MAIN2 -void vSplatterCombineAbilities(int tank, int type, const float random, const char[] combo, int survivor, const char[] classname) -#else -public void MT_OnCombineAbilities(int tank, int type, const float random, const char[] combo, int survivor, int weapon, const char[] classname) -#endif -{ - if (!g_bSecondGame || (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esSplatterCache[tank].g_iHumanAbility != 2)) - { - return; - } - - char sCombo[320], sSet[4][32]; - FormatEx(sCombo, sizeof sCombo, ",%s,", combo); - FormatEx(sSet[0], sizeof sSet[], ",%s,", MT_SPLATTER_SECTION); - FormatEx(sSet[1], sizeof sSet[], ",%s,", MT_SPLATTER_SECTION2); - FormatEx(sSet[2], sizeof sSet[], ",%s,", MT_SPLATTER_SECTION3); - FormatEx(sSet[3], sizeof sSet[], ",%s,", MT_SPLATTER_SECTION4); - if (StrContains(sCombo, sSet[0], false) != -1 || StrContains(sCombo, sSet[1], false) != -1 || StrContains(sCombo, sSet[2], false) != -1 || StrContains(sCombo, sSet[3], false) != -1) - { - char sAbilities[320], sSubset[10][32]; - strcopy(sAbilities, sizeof sAbilities, combo); - ExplodeString(sAbilities, ",", sSubset, sizeof sSubset, sizeof sSubset[]); - - float flChance = 0.0, flDelay = 0.0; - for (int iPos = 0; iPos < (sizeof sSubset); iPos++) - { - if (StrEqual(sSubset[iPos], MT_SPLATTER_SECTION, false) || StrEqual(sSubset[iPos], MT_SPLATTER_SECTION2, false) || StrEqual(sSubset[iPos], MT_SPLATTER_SECTION3, false) || StrEqual(sSubset[iPos], MT_SPLATTER_SECTION4, false)) - { - flDelay = MT_GetCombinationSetting(tank, 4, iPos); - - switch (type) - { - case MT_COMBO_MAINRANGE: - { - if (g_esSplatterCache[tank].g_iSplatterAbility == 1) - { - switch (flDelay) - { - case 0.0: vSplatterAbility(tank, random, iPos); - default: - { - DataPack dpCombo; - CreateDataTimer(flDelay, tTimerSplatterCombo, dpCombo, TIMER_FLAG_NO_MAPCHANGE); - dpCombo.WriteCell(GetClientUserId(tank)); - dpCombo.WriteFloat(random); - dpCombo.WriteCell(iPos); - } - } - } - } - case MT_COMBO_MELEEHIT: - { - flChance = MT_GetCombinationSetting(tank, 1, iPos); - - switch (flDelay) - { - case 0.0: - { - if ((g_esSplatterCache[tank].g_iSplatterHitMode == 0 || g_esSplatterCache[tank].g_iSplatterHitMode == 1) && (StrEqual(classname[7], "tank_claw") || StrEqual(classname, "tank_rock"))) - { - vSplatterHit(survivor, tank, random, flChance, g_esSplatterCache[tank].g_iSplatterHit, MT_MESSAGE_MELEE, MT_ATTACK_CLAW, iPos); - } - else if ((g_esSplatterCache[tank].g_iSplatterHitMode == 0 || g_esSplatterCache[tank].g_iSplatterHitMode == 2) && StrEqual(classname[7], "melee")) - { - vSplatterHit(survivor, tank, random, flChance, g_esSplatterCache[tank].g_iSplatterHit, MT_MESSAGE_MELEE, MT_ATTACK_MELEE, iPos); - } - } - default: - { - DataPack dpCombo; - CreateDataTimer(flDelay, tTimerSplatterCombo2, dpCombo, TIMER_FLAG_NO_MAPCHANGE); - dpCombo.WriteCell(GetClientUserId(survivor)); - dpCombo.WriteCell(GetClientUserId(tank)); - dpCombo.WriteFloat(random); - dpCombo.WriteFloat(flChance); - dpCombo.WriteCell(iPos); - dpCombo.WriteString(classname); - } - } - } - } - - break; - } - } - } -} - -#if defined MT_ABILITIES_MAIN2 -void vSplatterConfigsLoad(int mode) -#else -public void MT_OnConfigsLoad(int mode) -#endif -{ - switch (mode) - { - case 1: - { - for (int iIndex = MT_GetMinType(); iIndex <= MT_GetMaxType(); iIndex++) - { - g_esSplatterAbility[iIndex].g_iAccessFlags = 0; - g_esSplatterAbility[iIndex].g_iImmunityFlags = 0; - g_esSplatterAbility[iIndex].g_flCloseAreasOnly = 0.0; - g_esSplatterAbility[iIndex].g_iComboAbility = 0; - g_esSplatterAbility[iIndex].g_iHumanAbility = 0; - g_esSplatterAbility[iIndex].g_iHumanAmmo = 5; - g_esSplatterAbility[iIndex].g_iHumanCooldown = 0; - g_esSplatterAbility[iIndex].g_iHumanRangeCooldown = 0; - g_esSplatterAbility[iIndex].g_flOpenAreasOnly = 0.0; - g_esSplatterAbility[iIndex].g_iRequiresHumans = 1; - g_esSplatterAbility[iIndex].g_iSplatterAbility = 0; - g_esSplatterAbility[iIndex].g_iSplatterEffect = 0; - g_esSplatterAbility[iIndex].g_iSplatterMessage = 0; - g_esSplatterAbility[iIndex].g_flSplatterChance = 33.3; - g_esSplatterAbility[iIndex].g_iSplatterCooldown = 0; - g_esSplatterAbility[iIndex].g_iSplatterDuration = 5; - g_esSplatterAbility[iIndex].g_iSplatterHit = 0; - g_esSplatterAbility[iIndex].g_iSplatterHitMode = 0; - g_esSplatterAbility[iIndex].g_flSplatterInterval = 1.0; - g_esSplatterAbility[iIndex].g_flSplatterRange = 150.0; - g_esSplatterAbility[iIndex].g_flSplatterRangeChance = 15.0; - g_esSplatterAbility[iIndex].g_iSplatterRangeCooldown = 0; - g_esSplatterAbility[iIndex].g_iSplatterSight = 0; - g_esSplatterAbility[iIndex].g_iSplatterType = 0; - - g_esSplatterSpecial[iIndex].g_flCloseAreasOnly = -1.0; - g_esSplatterSpecial[iIndex].g_iComboAbility = -1; - g_esSplatterSpecial[iIndex].g_iHumanAbility = -1; - g_esSplatterSpecial[iIndex].g_iHumanAmmo = -1; - g_esSplatterSpecial[iIndex].g_iHumanCooldown = -1; - g_esSplatterSpecial[iIndex].g_iHumanRangeCooldown = -1; - g_esSplatterSpecial[iIndex].g_flOpenAreasOnly = -1.0; - g_esSplatterSpecial[iIndex].g_iRequiresHumans = -1; - g_esSplatterSpecial[iIndex].g_iSplatterAbility = -1; - g_esSplatterSpecial[iIndex].g_iSplatterEffect = -1; - g_esSplatterSpecial[iIndex].g_iSplatterMessage = -1; - g_esSplatterSpecial[iIndex].g_flSplatterChance = -1.0; - g_esSplatterSpecial[iIndex].g_iSplatterCooldown = -1; - g_esSplatterSpecial[iIndex].g_iSplatterDuration = -1; - g_esSplatterSpecial[iIndex].g_iSplatterHit = -1; - g_esSplatterSpecial[iIndex].g_iSplatterHitMode = -1; - g_esSplatterSpecial[iIndex].g_flSplatterInterval = -1.0; - g_esSplatterSpecial[iIndex].g_flSplatterRange = -1.0; - g_esSplatterSpecial[iIndex].g_flSplatterRangeChance = -1.0; - g_esSplatterSpecial[iIndex].g_iSplatterRangeCooldown = -1; - g_esSplatterSpecial[iIndex].g_iSplatterSight = -1; - g_esSplatterSpecial[iIndex].g_iSplatterType = -1; - } - } - case 3: - { - for (int iPlayer = 1; iPlayer <= MaxClients; iPlayer++) - { - g_esSplatterPlayer[iPlayer].g_iAccessFlags = -1; - g_esSplatterPlayer[iPlayer].g_iImmunityFlags = -1; - g_esSplatterPlayer[iPlayer].g_flCloseAreasOnly = -1.0; - g_esSplatterPlayer[iPlayer].g_iComboAbility = -1; - g_esSplatterPlayer[iPlayer].g_iHumanAbility = -1; - g_esSplatterPlayer[iPlayer].g_iHumanAmmo = -1; - g_esSplatterPlayer[iPlayer].g_iHumanCooldown = -1; - g_esSplatterPlayer[iPlayer].g_iHumanRangeCooldown = -1; - g_esSplatterPlayer[iPlayer].g_flOpenAreasOnly = -1.0; - g_esSplatterPlayer[iPlayer].g_iRequiresHumans = -1; - g_esSplatterPlayer[iPlayer].g_iSplatterAbility = -1; - g_esSplatterPlayer[iPlayer].g_iSplatterEffect = -1; - g_esSplatterPlayer[iPlayer].g_iSplatterMessage = -1; - g_esSplatterPlayer[iPlayer].g_flSplatterChance = -1.0; - g_esSplatterPlayer[iPlayer].g_iSplatterCooldown = -1; - g_esSplatterPlayer[iPlayer].g_iSplatterDuration = -1; - g_esSplatterPlayer[iPlayer].g_iSplatterHit = -1; - g_esSplatterPlayer[iPlayer].g_iSplatterHitMode = -1; - g_esSplatterPlayer[iPlayer].g_flSplatterInterval = -1.0; - g_esSplatterPlayer[iPlayer].g_flSplatterRange = -1.0; - g_esSplatterPlayer[iPlayer].g_flSplatterRangeChance = -1.0; - g_esSplatterPlayer[iPlayer].g_iSplatterRangeCooldown = -1; - g_esSplatterPlayer[iPlayer].g_iSplatterSight = -1; - g_esSplatterPlayer[iPlayer].g_iSplatterType = -1; - - g_esSplatterTeammate[iPlayer].g_flCloseAreasOnly = -1.0; - g_esSplatterTeammate[iPlayer].g_iComboAbility = -1; - g_esSplatterTeammate[iPlayer].g_iHumanAbility = -1; - g_esSplatterTeammate[iPlayer].g_iHumanAmmo = -1; - g_esSplatterTeammate[iPlayer].g_iHumanCooldown = -1; - g_esSplatterTeammate[iPlayer].g_iHumanRangeCooldown = -1; - g_esSplatterTeammate[iPlayer].g_flOpenAreasOnly = -1.0; - g_esSplatterTeammate[iPlayer].g_iRequiresHumans = -1; - g_esSplatterTeammate[iPlayer].g_iSplatterAbility = -1; - g_esSplatterTeammate[iPlayer].g_iSplatterEffect = -1; - g_esSplatterTeammate[iPlayer].g_iSplatterMessage = -1; - g_esSplatterTeammate[iPlayer].g_flSplatterChance = -1.0; - g_esSplatterTeammate[iPlayer].g_iSplatterCooldown = -1; - g_esSplatterTeammate[iPlayer].g_iSplatterDuration = -1; - g_esSplatterTeammate[iPlayer].g_iSplatterHit = -1; - g_esSplatterTeammate[iPlayer].g_iSplatterHitMode = -1; - g_esSplatterTeammate[iPlayer].g_flSplatterInterval = -1.0; - g_esSplatterTeammate[iPlayer].g_flSplatterRange = -1.0; - g_esSplatterTeammate[iPlayer].g_flSplatterRangeChance = -1.0; - g_esSplatterTeammate[iPlayer].g_iSplatterRangeCooldown = -1; - g_esSplatterTeammate[iPlayer].g_iSplatterSight = -1; - g_esSplatterTeammate[iPlayer].g_iSplatterType = -1; - } - } - } -} - -#if defined MT_ABILITIES_MAIN2 -void vSplatterConfigsLoaded(const char[] subsection, const char[] key, const char[] value, int type, int admin, int mode, bool special, const char[] specsection) -#else -public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const char[] value, int type, int admin, int mode, bool special, const char[] specsection) -#endif -{ - if ((mode == -1 || mode == 3) && bIsValidClient(admin)) - { - if (special && specsection[0] != '\0') - { - g_esSplatterTeammate[admin].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esSplatterTeammate[admin].g_flCloseAreasOnly, value, -1.0, 99999.0); - g_esSplatterTeammate[admin].g_iComboAbility = iGetKeyValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "ComboAbility", "Combo Ability", "Combo_Ability", "combo", g_esSplatterTeammate[admin].g_iComboAbility, value, -1, 1); - g_esSplatterTeammate[admin].g_iHumanAbility = iGetKeyValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esSplatterTeammate[admin].g_iHumanAbility, value, -1, 2); - g_esSplatterTeammate[admin].g_iHumanAmmo = iGetKeyValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esSplatterTeammate[admin].g_iHumanAmmo, value, -1, 99999); - g_esSplatterTeammate[admin].g_iHumanCooldown = iGetKeyValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esSplatterTeammate[admin].g_iHumanCooldown, value, -1, 99999); - g_esSplatterTeammate[admin].g_iHumanRangeCooldown = iGetKeyValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "HumanRangeCooldown", "Human Range Cooldown", "Human_Range_Cooldown", "hrangecooldown", g_esSplatterTeammate[admin].g_iHumanRangeCooldown, value, -1, 99999); - g_esSplatterTeammate[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esSplatterTeammate[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); - g_esSplatterTeammate[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esSplatterTeammate[admin].g_iRequiresHumans, value, -1, 32); - g_esSplatterTeammate[admin].g_iSplatterAbility = iGetKeyValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esSplatterTeammate[admin].g_iSplatterAbility, value, -1, 3); - g_esSplatterTeammate[admin].g_iSplatterEffect = iGetKeyValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "AbilityEffect", "Ability Effect", "Ability_Effect", "effect", g_esSplatterTeammate[admin].g_iSplatterEffect, value, -1, 7); - g_esSplatterTeammate[admin].g_iSplatterMessage = iGetKeyValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esSplatterTeammate[admin].g_iSplatterMessage, value, -1, 1); - g_esSplatterTeammate[admin].g_iSplatterSight = iGetKeyValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "AbilitySight", "Ability Sight", "Ability_Sight", "sight", g_esSplatterTeammate[admin].g_iSplatterSight, value, -1, 5); - g_esSplatterTeammate[admin].g_flSplatterChance = flGetKeyValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "SplatterChance", "Splatter Chance", "Splatter_Chance", "chance", g_esSplatterTeammate[admin].g_flSplatterChance, value, -1.0, 100.0); - g_esSplatterTeammate[admin].g_iSplatterCooldown = iGetKeyValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "SplatterCooldown", "Splatter Cooldown", "Splatter_Cooldown", "cooldown", g_esSplatterTeammate[admin].g_iSplatterCooldown, value, -1, 99999); - g_esSplatterTeammate[admin].g_iSplatterDuration = iGetKeyValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "SplatterDuration", "Splatter Duration", "Splatter_Duration", "duration", g_esSplatterTeammate[admin].g_iSplatterDuration, value, -1, 99999); - g_esSplatterTeammate[admin].g_iSplatterHit = iGetKeyValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "SplatterHit", "Splatter Hit", "Splatter_Hit", "hit", g_esSplatterTeammate[admin].g_iSplatterHit, value, -1, 1); - g_esSplatterTeammate[admin].g_iSplatterHitMode = iGetKeyValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "SplatterHitMode", "Splatter Hit Mode", "Splatter_Hit_Mode", "hitmode", g_esSplatterTeammate[admin].g_iSplatterHitMode, value, -1, 2); - g_esSplatterTeammate[admin].g_flSplatterInterval = flGetKeyValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "SplatterInterval", "Splatter Interval", "Splatter_Interval", "interval", g_esSplatterTeammate[admin].g_flSplatterInterval, value, -1.0, 99999.0); - g_esSplatterTeammate[admin].g_flSplatterRange = flGetKeyValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "SplatterRange", "Splatter Range", "Splatter_Range", "range", g_esSplatterTeammate[admin].g_flSplatterRange, value, -1.0, 99999.0); - g_esSplatterTeammate[admin].g_flSplatterRangeChance = flGetKeyValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "SplatterRangeChance", "Splatter Range Chance", "Splatter_Range_Chance", "rangechance", g_esSplatterTeammate[admin].g_flSplatterRangeChance, value, -1.0, 100.0); - g_esSplatterTeammate[admin].g_iSplatterRangeCooldown = iGetKeyValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "SplatterRangeCooldown", "Splatter Range Cooldown", "Splatter_Range_Cooldown", "rangecooldown", g_esSplatterTeammate[admin].g_iSplatterRangeCooldown, value, -1, 99999); - g_esSplatterTeammate[admin].g_iSplatterType = iGetKeyValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "SplatterType", "Splatter Type", "Splatter_Type", "type", g_esSplatterTeammate[admin].g_iSplatterType, value, -1, sizeof g_sParticles); - } - else - { - g_esSplatterPlayer[admin].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esSplatterPlayer[admin].g_flCloseAreasOnly, value, -1.0, 99999.0); - g_esSplatterPlayer[admin].g_iComboAbility = iGetKeyValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "ComboAbility", "Combo Ability", "Combo_Ability", "combo", g_esSplatterPlayer[admin].g_iComboAbility, value, -1, 1); - g_esSplatterPlayer[admin].g_iHumanAbility = iGetKeyValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esSplatterPlayer[admin].g_iHumanAbility, value, -1, 2); - g_esSplatterPlayer[admin].g_iHumanAmmo = iGetKeyValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esSplatterPlayer[admin].g_iHumanAmmo, value, -1, 99999); - g_esSplatterPlayer[admin].g_iHumanCooldown = iGetKeyValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esSplatterPlayer[admin].g_iHumanCooldown, value, -1, 99999); - g_esSplatterPlayer[admin].g_iHumanRangeCooldown = iGetKeyValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "HumanRangeCooldown", "Human Range Cooldown", "Human_Range_Cooldown", "hrangecooldown", g_esSplatterPlayer[admin].g_iHumanRangeCooldown, value, -1, 99999); - g_esSplatterPlayer[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esSplatterPlayer[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); - g_esSplatterPlayer[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esSplatterPlayer[admin].g_iRequiresHumans, value, -1, 32); - g_esSplatterPlayer[admin].g_iSplatterAbility = iGetKeyValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esSplatterPlayer[admin].g_iSplatterAbility, value, -1, 3); - g_esSplatterPlayer[admin].g_iSplatterEffect = iGetKeyValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "AbilityEffect", "Ability Effect", "Ability_Effect", "effect", g_esSplatterPlayer[admin].g_iSplatterEffect, value, -1, 7); - g_esSplatterPlayer[admin].g_iSplatterMessage = iGetKeyValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esSplatterPlayer[admin].g_iSplatterMessage, value, -1, 1); - g_esSplatterPlayer[admin].g_iSplatterSight = iGetKeyValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "AbilitySight", "Ability Sight", "Ability_Sight", "sight", g_esSplatterPlayer[admin].g_iSplatterSight, value, -1, 5); - g_esSplatterPlayer[admin].g_flSplatterChance = flGetKeyValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "SplatterChance", "Splatter Chance", "Splatter_Chance", "chance", g_esSplatterPlayer[admin].g_flSplatterChance, value, -1.0, 100.0); - g_esSplatterPlayer[admin].g_iSplatterCooldown = iGetKeyValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "SplatterCooldown", "Splatter Cooldown", "Splatter_Cooldown", "cooldown", g_esSplatterPlayer[admin].g_iSplatterCooldown, value, -1, 99999); - g_esSplatterPlayer[admin].g_iSplatterDuration = iGetKeyValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "SplatterDuration", "Splatter Duration", "Splatter_Duration", "duration", g_esSplatterPlayer[admin].g_iSplatterDuration, value, -1, 99999); - g_esSplatterPlayer[admin].g_iSplatterHit = iGetKeyValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "SplatterHit", "Splatter Hit", "Splatter_Hit", "hit", g_esSplatterPlayer[admin].g_iSplatterHit, value, -1, 1); - g_esSplatterPlayer[admin].g_iSplatterHitMode = iGetKeyValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "SplatterHitMode", "Splatter Hit Mode", "Splatter_Hit_Mode", "hitmode", g_esSplatterPlayer[admin].g_iSplatterHitMode, value, -1, 2); - g_esSplatterPlayer[admin].g_flSplatterInterval = flGetKeyValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "SplatterInterval", "Splatter Interval", "Splatter_Interval", "interval", g_esSplatterPlayer[admin].g_flSplatterInterval, value, -1.0, 99999.0); - g_esSplatterPlayer[admin].g_flSplatterRange = flGetKeyValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "SplatterRange", "Splatter Range", "Splatter_Range", "range", g_esSplatterPlayer[admin].g_flSplatterRange, value, -1.0, 99999.0); - g_esSplatterPlayer[admin].g_flSplatterRangeChance = flGetKeyValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "SplatterRangeChance", "Splatter Range Chance", "Splatter_Range_Chance", "rangechance", g_esSplatterPlayer[admin].g_flSplatterRangeChance, value, -1.0, 100.0); - g_esSplatterPlayer[admin].g_iSplatterRangeCooldown = iGetKeyValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "SplatterRangeCooldown", "Splatter Range Cooldown", "Splatter_Range_Cooldown", "rangecooldown", g_esSplatterPlayer[admin].g_iSplatterRangeCooldown, value, -1, 99999); - g_esSplatterPlayer[admin].g_iSplatterType = iGetKeyValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "SplatterType", "Splatter Type", "Splatter_Type", "type", g_esSplatterPlayer[admin].g_iSplatterType, value, -1, sizeof g_sParticles); - g_esSplatterPlayer[admin].g_iAccessFlags = iGetAdminFlagsValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "AccessFlags", "Access Flags", "Access_Flags", "access", value); - g_esSplatterPlayer[admin].g_iImmunityFlags = iGetAdminFlagsValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "ImmunityFlags", "Immunity Flags", "Immunity_Flags", "immunity", value); - } - } - - if (mode < 3 && type > 0) - { - if (special && specsection[0] != '\0') - { - g_esSplatterSpecial[type].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esSplatterSpecial[type].g_flCloseAreasOnly, value, -1.0, 99999.0); - g_esSplatterSpecial[type].g_iComboAbility = iGetKeyValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "ComboAbility", "Combo Ability", "Combo_Ability", "combo", g_esSplatterSpecial[type].g_iComboAbility, value, -1, 1); - g_esSplatterSpecial[type].g_iHumanAbility = iGetKeyValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esSplatterSpecial[type].g_iHumanAbility, value, -1, 2); - g_esSplatterSpecial[type].g_iHumanAmmo = iGetKeyValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esSplatterSpecial[type].g_iHumanAmmo, value, -1, 99999); - g_esSplatterSpecial[type].g_iHumanCooldown = iGetKeyValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esSplatterSpecial[type].g_iHumanCooldown, value, -1, 99999); - g_esSplatterSpecial[type].g_iHumanRangeCooldown = iGetKeyValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "HumanRangeCooldown", "Human Range Cooldown", "Human_Range_Cooldown", "hrangecooldown", g_esSplatterSpecial[type].g_iHumanRangeCooldown, value, -1, 99999); - g_esSplatterSpecial[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esSplatterSpecial[type].g_flOpenAreasOnly, value, -1.0, 99999.0); - g_esSplatterSpecial[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esSplatterSpecial[type].g_iRequiresHumans, value, -1, 32); - g_esSplatterSpecial[type].g_iSplatterAbility = iGetKeyValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esSplatterSpecial[type].g_iSplatterAbility, value, -1, 3); - g_esSplatterSpecial[type].g_iSplatterEffect = iGetKeyValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "AbilityEffect", "Ability Effect", "Ability_Effect", "effect", g_esSplatterSpecial[type].g_iSplatterEffect, value, -1, 7); - g_esSplatterSpecial[type].g_iSplatterMessage = iGetKeyValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esSplatterSpecial[type].g_iSplatterMessage, value, -1, 1); - g_esSplatterSpecial[type].g_iSplatterSight = iGetKeyValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "AbilitySight", "Ability Sight", "Ability_Sight", "sight", g_esSplatterSpecial[type].g_iSplatterSight, value, -1, 5); - g_esSplatterSpecial[type].g_flSplatterChance = flGetKeyValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "SplatterChance", "Splatter Chance", "Splatter_Chance", "chance", g_esSplatterSpecial[type].g_flSplatterChance, value, -1.0, 100.0); - g_esSplatterSpecial[type].g_iSplatterCooldown = iGetKeyValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "SplatterCooldown", "Splatter Cooldown", "Splatter_Cooldown", "cooldown", g_esSplatterSpecial[type].g_iSplatterCooldown, value, -1, 99999); - g_esSplatterSpecial[type].g_iSplatterDuration = iGetKeyValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "SplatterDuration", "Splatter Duration", "Splatter_Duration", "duration", g_esSplatterSpecial[type].g_iSplatterDuration, value, -1, 99999); - g_esSplatterSpecial[type].g_iSplatterHit = iGetKeyValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "SplatterHit", "Splatter Hit", "Splatter_Hit", "hit", g_esSplatterSpecial[type].g_iSplatterHit, value, -1, 1); - g_esSplatterSpecial[type].g_iSplatterHitMode = iGetKeyValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "SplatterHitMode", "Splatter Hit Mode", "Splatter_Hit_Mode", "hitmode", g_esSplatterSpecial[type].g_iSplatterHitMode, value, -1, 2); - g_esSplatterSpecial[type].g_flSplatterInterval = flGetKeyValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "SplatterInterval", "Splatter Interval", "Splatter_Interval", "interval", g_esSplatterSpecial[type].g_flSplatterInterval, value, -1.0, 99999.0); - g_esSplatterSpecial[type].g_flSplatterRange = flGetKeyValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "SplatterRange", "Splatter Range", "Splatter_Range", "range", g_esSplatterSpecial[type].g_flSplatterRange, value, -1.0, 99999.0); - g_esSplatterSpecial[type].g_flSplatterRangeChance = flGetKeyValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "SplatterRangeChance", "Splatter Range Chance", "Splatter_Range_Chance", "rangechance", g_esSplatterSpecial[type].g_flSplatterRangeChance, value, -1.0, 100.0); - g_esSplatterSpecial[type].g_iSplatterRangeCooldown = iGetKeyValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "SplatterRangeCooldown", "Splatter Range Cooldown", "Splatter_Range_Cooldown", "rangecooldown", g_esSplatterSpecial[type].g_iSplatterRangeCooldown, value, -1, 99999); - g_esSplatterSpecial[type].g_iSplatterType = iGetKeyValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "SplatterType", "Splatter Type", "Splatter_Type", "type", g_esSplatterSpecial[type].g_iSplatterType, value, -1, sizeof g_sParticles); - } - else - { - g_esSplatterAbility[type].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esSplatterAbility[type].g_flCloseAreasOnly, value, -1.0, 99999.0); - g_esSplatterAbility[type].g_iComboAbility = iGetKeyValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "ComboAbility", "Combo Ability", "Combo_Ability", "combo", g_esSplatterAbility[type].g_iComboAbility, value, -1, 1); - g_esSplatterAbility[type].g_iHumanAbility = iGetKeyValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esSplatterAbility[type].g_iHumanAbility, value, -1, 2); - g_esSplatterAbility[type].g_iHumanAmmo = iGetKeyValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esSplatterAbility[type].g_iHumanAmmo, value, -1, 99999); - g_esSplatterAbility[type].g_iHumanCooldown = iGetKeyValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esSplatterAbility[type].g_iHumanCooldown, value, -1, 99999); - g_esSplatterAbility[type].g_iHumanRangeCooldown = iGetKeyValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "HumanRangeCooldown", "Human Range Cooldown", "Human_Range_Cooldown", "hrangecooldown", g_esSplatterAbility[type].g_iHumanRangeCooldown, value, -1, 99999); - g_esSplatterAbility[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esSplatterAbility[type].g_flOpenAreasOnly, value, -1.0, 99999.0); - g_esSplatterAbility[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esSplatterAbility[type].g_iRequiresHumans, value, -1, 32); - g_esSplatterAbility[type].g_iSplatterAbility = iGetKeyValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esSplatterAbility[type].g_iSplatterAbility, value, -1, 3); - g_esSplatterAbility[type].g_iSplatterEffect = iGetKeyValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "AbilityEffect", "Ability Effect", "Ability_Effect", "effect", g_esSplatterAbility[type].g_iSplatterEffect, value, -1, 7); - g_esSplatterAbility[type].g_iSplatterMessage = iGetKeyValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esSplatterAbility[type].g_iSplatterMessage, value, -1, 1); - g_esSplatterAbility[type].g_iSplatterSight = iGetKeyValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "AbilitySight", "Ability Sight", "Ability_Sight", "sight", g_esSplatterAbility[type].g_iSplatterSight, value, -1, 5); - g_esSplatterAbility[type].g_flSplatterChance = flGetKeyValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "SplatterChance", "Splatter Chance", "Splatter_Chance", "chance", g_esSplatterAbility[type].g_flSplatterChance, value, -1.0, 100.0); - g_esSplatterAbility[type].g_iSplatterCooldown = iGetKeyValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "SplatterCooldown", "Splatter Cooldown", "Splatter_Cooldown", "cooldown", g_esSplatterAbility[type].g_iSplatterCooldown, value, -1, 99999); - g_esSplatterAbility[type].g_iSplatterDuration = iGetKeyValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "SplatterDuration", "Splatter Duration", "Splatter_Duration", "duration", g_esSplatterAbility[type].g_iSplatterDuration, value, -1, 99999); - g_esSplatterAbility[type].g_iSplatterHit = iGetKeyValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "SplatterHit", "Splatter Hit", "Splatter_Hit", "hit", g_esSplatterAbility[type].g_iSplatterHit, value, -1, 1); - g_esSplatterAbility[type].g_iSplatterHitMode = iGetKeyValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "SplatterHitMode", "Splatter Hit Mode", "Splatter_Hit_Mode", "hitmode", g_esSplatterAbility[type].g_iSplatterHitMode, value, -1, 2); - g_esSplatterAbility[type].g_flSplatterInterval = flGetKeyValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "SplatterInterval", "Splatter Interval", "Splatter_Interval", "interval", g_esSplatterAbility[type].g_flSplatterInterval, value, -1.0, 99999.0); - g_esSplatterAbility[type].g_flSplatterRange = flGetKeyValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "SplatterRange", "Splatter Range", "Splatter_Range", "range", g_esSplatterAbility[type].g_flSplatterRange, value, -1.0, 99999.0); - g_esSplatterAbility[type].g_flSplatterRangeChance = flGetKeyValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "SplatterRangeChance", "Splatter Range Chance", "Splatter_Range_Chance", "rangechance", g_esSplatterAbility[type].g_flSplatterRangeChance, value, -1.0, 100.0); - g_esSplatterAbility[type].g_iSplatterRangeCooldown = iGetKeyValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "SplatterRangeCooldown", "Splatter Range Cooldown", "Splatter_Range_Cooldown", "rangecooldown", g_esSplatterAbility[type].g_iSplatterRangeCooldown, value, -1, 99999); - g_esSplatterAbility[type].g_iSplatterType = iGetKeyValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "SplatterType", "Splatter Type", "Splatter_Type", "type", g_esSplatterAbility[type].g_iSplatterType, value, -1, sizeof g_sParticles); - g_esSplatterAbility[type].g_iAccessFlags = iGetAdminFlagsValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "AccessFlags", "Access Flags", "Access_Flags", "access", value); - g_esSplatterAbility[type].g_iImmunityFlags = iGetAdminFlagsValue(subsection, MT_SPLATTER_SECTION, MT_SPLATTER_SECTION2, MT_SPLATTER_SECTION3, MT_SPLATTER_SECTION4, key, "ImmunityFlags", "Immunity Flags", "Immunity_Flags", "immunity", value); - } - } -} - -#if defined MT_ABILITIES_MAIN2 -void vSplatterSettingsCached(int tank, bool apply, int type) -#else -public void MT_OnSettingsCached(int tank, bool apply, int type) -#endif -{ - bool bHuman = bIsValidClient(tank, MT_CHECK_FAKECLIENT); - g_esSplatterPlayer[tank].g_iTankTypeRecorded = apply ? MT_GetRecordedTankType(tank, type) : 0; - g_esSplatterPlayer[tank].g_iTankType = apply ? type : 0; - int iType = g_esSplatterPlayer[tank].g_iTankTypeRecorded; - - if (bIsSpecialInfected(tank, MT_CHECK_INDEX|MT_CHECK_INGAME)) - { - g_esSplatterCache[tank].g_flCloseAreasOnly = flGetSubSettingValue(apply, bHuman, g_esSplatterTeammate[tank].g_flCloseAreasOnly, g_esSplatterPlayer[tank].g_flCloseAreasOnly, g_esSplatterSpecial[iType].g_flCloseAreasOnly, g_esSplatterAbility[iType].g_flCloseAreasOnly, 1); - g_esSplatterCache[tank].g_iComboAbility = iGetSubSettingValue(apply, bHuman, g_esSplatterTeammate[tank].g_iComboAbility, g_esSplatterPlayer[tank].g_iComboAbility, g_esSplatterSpecial[iType].g_iComboAbility, g_esSplatterAbility[iType].g_iComboAbility, 1); - g_esSplatterCache[tank].g_flSplatterChance = flGetSubSettingValue(apply, bHuman, g_esSplatterTeammate[tank].g_flSplatterChance, g_esSplatterPlayer[tank].g_flSplatterChance, g_esSplatterSpecial[iType].g_flSplatterChance, g_esSplatterAbility[iType].g_flSplatterChance, 1); - g_esSplatterCache[tank].g_flSplatterInterval = flGetSubSettingValue(apply, bHuman, g_esSplatterTeammate[tank].g_flSplatterInterval, g_esSplatterPlayer[tank].g_flSplatterInterval, g_esSplatterSpecial[iType].g_flSplatterInterval, g_esSplatterAbility[iType].g_flSplatterInterval, 1); - g_esSplatterCache[tank].g_flSplatterRange = flGetSubSettingValue(apply, bHuman, g_esSplatterTeammate[tank].g_flSplatterRange, g_esSplatterPlayer[tank].g_flSplatterRange, g_esSplatterSpecial[iType].g_flSplatterRange, g_esSplatterAbility[iType].g_flSplatterRange, 1); - g_esSplatterCache[tank].g_flSplatterRangeChance = flGetSubSettingValue(apply, bHuman, g_esSplatterTeammate[tank].g_flSplatterRangeChance, g_esSplatterPlayer[tank].g_flSplatterRangeChance, g_esSplatterSpecial[iType].g_flSplatterRangeChance, g_esSplatterAbility[iType].g_flSplatterRangeChance, 1); - g_esSplatterCache[tank].g_iHumanAbility = iGetSubSettingValue(apply, bHuman, g_esSplatterTeammate[tank].g_iHumanAbility, g_esSplatterPlayer[tank].g_iHumanAbility, g_esSplatterSpecial[iType].g_iHumanAbility, g_esSplatterAbility[iType].g_iHumanAbility, 1); - g_esSplatterCache[tank].g_iHumanAmmo = iGetSubSettingValue(apply, bHuman, g_esSplatterTeammate[tank].g_iHumanAmmo, g_esSplatterPlayer[tank].g_iHumanAmmo, g_esSplatterSpecial[iType].g_iHumanAmmo, g_esSplatterAbility[iType].g_iHumanAmmo, 1); - g_esSplatterCache[tank].g_iHumanCooldown = iGetSubSettingValue(apply, bHuman, g_esSplatterTeammate[tank].g_iHumanCooldown, g_esSplatterPlayer[tank].g_iHumanCooldown, g_esSplatterSpecial[iType].g_iHumanCooldown, g_esSplatterAbility[iType].g_iHumanCooldown, 1); - g_esSplatterCache[tank].g_iHumanRangeCooldown = iGetSubSettingValue(apply, bHuman, g_esSplatterTeammate[tank].g_iHumanRangeCooldown, g_esSplatterPlayer[tank].g_iHumanRangeCooldown, g_esSplatterSpecial[iType].g_iHumanRangeCooldown, g_esSplatterAbility[iType].g_iHumanRangeCooldown, 1); - g_esSplatterCache[tank].g_flOpenAreasOnly = flGetSubSettingValue(apply, bHuman, g_esSplatterTeammate[tank].g_flOpenAreasOnly, g_esSplatterPlayer[tank].g_flOpenAreasOnly, g_esSplatterSpecial[iType].g_flOpenAreasOnly, g_esSplatterAbility[iType].g_flOpenAreasOnly, 1); - g_esSplatterCache[tank].g_iRequiresHumans = iGetSubSettingValue(apply, bHuman, g_esSplatterTeammate[tank].g_iRequiresHumans, g_esSplatterPlayer[tank].g_iRequiresHumans, g_esSplatterSpecial[iType].g_iRequiresHumans, g_esSplatterAbility[iType].g_iRequiresHumans, 1); - g_esSplatterCache[tank].g_iSplatterAbility = iGetSubSettingValue(apply, bHuman, g_esSplatterTeammate[tank].g_iSplatterAbility, g_esSplatterPlayer[tank].g_iSplatterAbility, g_esSplatterSpecial[iType].g_iSplatterAbility, g_esSplatterAbility[iType].g_iSplatterAbility, 1); - g_esSplatterCache[tank].g_iSplatterCooldown = iGetSubSettingValue(apply, bHuman, g_esSplatterTeammate[tank].g_iSplatterCooldown, g_esSplatterPlayer[tank].g_iSplatterCooldown, g_esSplatterSpecial[iType].g_iSplatterCooldown, g_esSplatterAbility[iType].g_iSplatterCooldown, 1); - g_esSplatterCache[tank].g_iSplatterDuration = iGetSubSettingValue(apply, bHuman, g_esSplatterTeammate[tank].g_iSplatterDuration, g_esSplatterPlayer[tank].g_iSplatterDuration, g_esSplatterSpecial[iType].g_iSplatterDuration, g_esSplatterAbility[iType].g_iSplatterDuration, 1); - g_esSplatterCache[tank].g_iSplatterEffect = iGetSubSettingValue(apply, bHuman, g_esSplatterTeammate[tank].g_iSplatterEffect, g_esSplatterPlayer[tank].g_iSplatterEffect, g_esSplatterSpecial[iType].g_iSplatterEffect, g_esSplatterAbility[iType].g_iSplatterEffect, 1); - g_esSplatterCache[tank].g_iSplatterHit = iGetSubSettingValue(apply, bHuman, g_esSplatterTeammate[tank].g_iSplatterHit, g_esSplatterPlayer[tank].g_iSplatterHit, g_esSplatterSpecial[iType].g_iSplatterHit, g_esSplatterAbility[iType].g_iSplatterHit, 1); - g_esSplatterCache[tank].g_iSplatterHitMode = iGetSubSettingValue(apply, bHuman, g_esSplatterTeammate[tank].g_iSplatterHitMode, g_esSplatterPlayer[tank].g_iSplatterHitMode, g_esSplatterSpecial[iType].g_iSplatterHitMode, g_esSplatterAbility[iType].g_iSplatterHitMode, 1); - g_esSplatterCache[tank].g_iSplatterMessage = iGetSubSettingValue(apply, bHuman, g_esSplatterTeammate[tank].g_iSplatterMessage, g_esSplatterPlayer[tank].g_iSplatterMessage, g_esSplatterSpecial[iType].g_iSplatterMessage, g_esSplatterAbility[iType].g_iSplatterMessage, 1); - g_esSplatterCache[tank].g_iSplatterRangeCooldown = iGetSubSettingValue(apply, bHuman, g_esSplatterTeammate[tank].g_iSplatterRangeCooldown, g_esSplatterPlayer[tank].g_iSplatterRangeCooldown, g_esSplatterSpecial[iType].g_iSplatterRangeCooldown, g_esSplatterAbility[iType].g_iSplatterRangeCooldown, 1); - g_esSplatterCache[tank].g_iSplatterSight = iGetSubSettingValue(apply, bHuman, g_esSplatterTeammate[tank].g_iSplatterSight, g_esSplatterPlayer[tank].g_iSplatterSight, g_esSplatterSpecial[iType].g_iSplatterSight, g_esSplatterAbility[iType].g_iSplatterSight, 1); - g_esSplatterCache[tank].g_iSplatterType = iGetSubSettingValue(apply, bHuman, g_esSplatterTeammate[tank].g_iSplatterType, g_esSplatterPlayer[tank].g_iSplatterType, g_esSplatterSpecial[iType].g_iSplatterType, g_esSplatterAbility[iType].g_iSplatterType, 1); - } - else - { - g_esSplatterCache[tank].g_flCloseAreasOnly = flGetSettingValue(apply, bHuman, g_esSplatterPlayer[tank].g_flCloseAreasOnly, g_esSplatterAbility[iType].g_flCloseAreasOnly, 1); - g_esSplatterCache[tank].g_iComboAbility = iGetSettingValue(apply, bHuman, g_esSplatterPlayer[tank].g_iComboAbility, g_esSplatterAbility[iType].g_iComboAbility, 1); - g_esSplatterCache[tank].g_flSplatterChance = flGetSettingValue(apply, bHuman, g_esSplatterPlayer[tank].g_flSplatterChance, g_esSplatterAbility[iType].g_flSplatterChance, 1); - g_esSplatterCache[tank].g_flSplatterInterval = flGetSettingValue(apply, bHuman, g_esSplatterPlayer[tank].g_flSplatterInterval, g_esSplatterAbility[iType].g_flSplatterInterval, 1); - g_esSplatterCache[tank].g_flSplatterRange = flGetSettingValue(apply, bHuman, g_esSplatterPlayer[tank].g_flSplatterRange, g_esSplatterAbility[iType].g_flSplatterRange, 1); - g_esSplatterCache[tank].g_flSplatterRangeChance = flGetSettingValue(apply, bHuman, g_esSplatterPlayer[tank].g_flSplatterRangeChance, g_esSplatterAbility[iType].g_flSplatterRangeChance, 1); - g_esSplatterCache[tank].g_iHumanAbility = iGetSettingValue(apply, bHuman, g_esSplatterPlayer[tank].g_iHumanAbility, g_esSplatterAbility[iType].g_iHumanAbility, 1); - g_esSplatterCache[tank].g_iHumanAmmo = iGetSettingValue(apply, bHuman, g_esSplatterPlayer[tank].g_iHumanAmmo, g_esSplatterAbility[iType].g_iHumanAmmo, 1); - g_esSplatterCache[tank].g_iHumanCooldown = iGetSettingValue(apply, bHuman, g_esSplatterPlayer[tank].g_iHumanCooldown, g_esSplatterAbility[iType].g_iHumanCooldown, 1); - g_esSplatterCache[tank].g_iHumanRangeCooldown = iGetSettingValue(apply, bHuman, g_esSplatterPlayer[tank].g_iHumanRangeCooldown, g_esSplatterAbility[iType].g_iHumanRangeCooldown, 1); - g_esSplatterCache[tank].g_flOpenAreasOnly = flGetSettingValue(apply, bHuman, g_esSplatterPlayer[tank].g_flOpenAreasOnly, g_esSplatterAbility[iType].g_flOpenAreasOnly, 1); - g_esSplatterCache[tank].g_iRequiresHumans = iGetSettingValue(apply, bHuman, g_esSplatterPlayer[tank].g_iRequiresHumans, g_esSplatterAbility[iType].g_iRequiresHumans, 1); - g_esSplatterCache[tank].g_iSplatterAbility = iGetSettingValue(apply, bHuman, g_esSplatterPlayer[tank].g_iSplatterAbility, g_esSplatterAbility[iType].g_iSplatterAbility, 1); - g_esSplatterCache[tank].g_iSplatterCooldown = iGetSettingValue(apply, bHuman, g_esSplatterPlayer[tank].g_iSplatterCooldown, g_esSplatterAbility[iType].g_iSplatterCooldown, 1); - g_esSplatterCache[tank].g_iSplatterDuration = iGetSettingValue(apply, bHuman, g_esSplatterPlayer[tank].g_iSplatterDuration, g_esSplatterAbility[iType].g_iSplatterDuration, 1); - g_esSplatterCache[tank].g_iSplatterEffect = iGetSettingValue(apply, bHuman, g_esSplatterPlayer[tank].g_iSplatterEffect, g_esSplatterAbility[iType].g_iSplatterEffect, 1); - g_esSplatterCache[tank].g_iSplatterHit = iGetSettingValue(apply, bHuman, g_esSplatterPlayer[tank].g_iSplatterHit, g_esSplatterAbility[iType].g_iSplatterHit, 1); - g_esSplatterCache[tank].g_iSplatterHitMode = iGetSettingValue(apply, bHuman, g_esSplatterPlayer[tank].g_iSplatterHitMode, g_esSplatterAbility[iType].g_iSplatterHitMode, 1); - g_esSplatterCache[tank].g_iSplatterMessage = iGetSettingValue(apply, bHuman, g_esSplatterPlayer[tank].g_iSplatterMessage, g_esSplatterAbility[iType].g_iSplatterMessage, 1); - g_esSplatterCache[tank].g_iSplatterRangeCooldown = iGetSettingValue(apply, bHuman, g_esSplatterPlayer[tank].g_iSplatterRangeCooldown, g_esSplatterAbility[iType].g_iSplatterRangeCooldown, 1); - g_esSplatterCache[tank].g_iSplatterSight = iGetSettingValue(apply, bHuman, g_esSplatterPlayer[tank].g_iSplatterSight, g_esSplatterAbility[iType].g_iSplatterSight, 1); - g_esSplatterCache[tank].g_iSplatterType = iGetSettingValue(apply, bHuman, g_esSplatterPlayer[tank].g_iSplatterType, g_esSplatterAbility[iType].g_iSplatterType, 1); - } -} - -#if defined MT_ABILITIES_MAIN2 -void vSplatterCopyStats(int oldTank, int newTank) -#else -public void MT_OnCopyStats(int oldTank, int newTank) -#endif -{ - vSplatterCopyStats2(oldTank, newTank); - - if (oldTank != newTank) - { - vRemoveSplatter(oldTank); - } -} - -#if !defined MT_ABILITIES_MAIN2 -public void MT_OnPluginUpdate() -{ - MT_ReloadPlugin(null); -} -#endif - -#if defined MT_ABILITIES_MAIN2 -void vSplatterEventFired(Event event, const char[] name) -#else -public void MT_OnEventFired(Event event, const char[] name, bool dontBroadcast) -#endif -{ - if (StrEqual(name, "bot_player_replace")) - { - int iBotId = event.GetInt("bot"), iBot = GetClientOfUserId(iBotId), - iTankId = event.GetInt("player"), iTank = GetClientOfUserId(iTankId); - if (bIsValidClient(iBot) && bIsInfected(iTank)) - { - vSplatterCopyStats2(iBot, iTank); - vRemoveSplatter(iBot); - } - } - else if (StrEqual(name, "mission_lost") || StrEqual(name, "round_start") || StrEqual(name, "round_end")) - { - vSplatterReset(); - } - else if (StrEqual(name, "player_bot_replace")) - { - int iTankId = event.GetInt("player"), iTank = GetClientOfUserId(iTankId), - iBotId = event.GetInt("bot"), iBot = GetClientOfUserId(iBotId); - if (bIsValidClient(iTank) && bIsInfected(iBot)) - { - vSplatterCopyStats2(iTank, iBot); - vRemoveSplatter(iTank); - } - } - else if (StrEqual(name, "player_death") || StrEqual(name, "player_spawn")) - { - int iPlayerId = event.GetInt("userid"), iPlayer = GetClientOfUserId(iPlayerId); - if (MT_IsTankSupported(iPlayer, MT_CHECK_INDEX|MT_CHECK_INGAME)) - { - vRemoveSplatter(iPlayer); - } - else if (bIsHumanSurvivor(iPlayer, MT_CHECK_INDEX|MT_CHECK_INGAME)) - { - vStopSplatter(iPlayer); - } - } -} - -#if defined MT_ABILITIES_MAIN2 -void vSplatterAbilityActivated(int tank) -#else -public void MT_OnAbilityActivated(int tank) -#endif -{ - if (!g_bSecondGame || (MT_IsTankSupported(tank, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_FAKECLIENT) && ((!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esSplatterAbility[g_esSplatterPlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esSplatterPlayer[tank].g_iAccessFlags)) || g_esSplatterCache[tank].g_iHumanAbility == 0))) - { - return; - } - - if (MT_IsTankSupported(tank) && (!bIsInfected(tank, MT_CHECK_FAKECLIENT) || g_esSplatterCache[tank].g_iHumanAbility != 1) && MT_IsCustomTankSupported(tank) && g_esSplatterCache[tank].g_iSplatterAbility == 1 && g_esSplatterCache[tank].g_iComboAbility == 0) - { - vSplatterAbility(tank, GetRandomFloat(0.1, 100.0)); - } -} - -#if defined MT_ABILITIES_MAIN2 -void vSplatterButtonPressed(int tank, int button) -#else -public void MT_OnButtonPressed(int tank, int button) -#endif -{ - if (MT_IsTankSupported(tank, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_ALIVE|MT_CHECK_FAKECLIENT) && MT_IsCustomTankSupported(tank)) - { - if (!g_bSecondGame || bIsAreaNarrow(tank, g_esSplatterCache[tank].g_flOpenAreasOnly) || bIsAreaWide(tank, g_esSplatterCache[tank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esSplatterPlayer[tank].g_iTankType, tank) || (g_esSplatterCache[tank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esSplatterCache[tank].g_iRequiresHumans) || (!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esSplatterAbility[g_esSplatterPlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esSplatterPlayer[tank].g_iAccessFlags))) - { - return; - } - - if ((button & MT_SUB_KEY) && g_esSplatterCache[tank].g_iSplatterAbility == 1 && g_esSplatterCache[tank].g_iHumanAbility == 1) - { - int iTime = GetTime(); - - switch (g_esSplatterPlayer[tank].g_iRangeCooldown == -1 || g_esSplatterPlayer[tank].g_iRangeCooldown <= iTime) - { - case true: vSplatterAbility(tank, GetRandomFloat(0.1, 100.0)); - case false: MT_PrintToChat(tank, "%s %t", MT_TAG3, "SplatterHuman3", (g_esSplatterPlayer[tank].g_iRangeCooldown - iTime)); - } - } - } -} - -#if defined MT_ABILITIES_MAIN2 -void vSplatterChangeType(int tank, int oldType) -#else -public void MT_OnChangeType(int tank, int oldType, int newType, bool revert) -#endif -{ - if (oldType <= 0) - { - return; - } - - vRemoveSplatter(tank); -} - -void vSplatterAbility(int tank, float random, int pos = -1) -{ - if (!g_bSecondGame || bIsAreaNarrow(tank, g_esSplatterCache[tank].g_flOpenAreasOnly) || bIsAreaWide(tank, g_esSplatterCache[tank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esSplatterPlayer[tank].g_iTankType, tank) || (g_esSplatterCache[tank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esSplatterCache[tank].g_iRequiresHumans) || (!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esSplatterAbility[g_esSplatterPlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esSplatterPlayer[tank].g_iAccessFlags))) - { - return; - } - - if (!bIsInfected(tank, MT_CHECK_FAKECLIENT) || (g_esSplatterPlayer[tank].g_iAmmoCount < g_esSplatterCache[tank].g_iHumanAmmo && g_esSplatterCache[tank].g_iHumanAmmo > 0)) - { - g_esSplatterPlayer[tank].g_bFailed = false; - g_esSplatterPlayer[tank].g_bNoAmmo = false; - - float flTankPos[3], flSurvivorPos[3]; - GetClientAbsOrigin(tank, flTankPos); - float flRange = (pos != -1) ? MT_GetCombinationSetting(tank, 9, pos) : g_esSplatterCache[tank].g_flSplatterRange, - flChance = (pos != -1) ? MT_GetCombinationSetting(tank, 10, pos) : g_esSplatterCache[tank].g_flSplatterRangeChance; - int iSurvivorCount = 0; - for (int iSurvivor = 1; iSurvivor <= MaxClients; iSurvivor++) - { - if (bIsHumanSurvivor(iSurvivor, MT_CHECK_INGAME|MT_CHECK_ALIVE) && !MT_IsAdminImmune(iSurvivor, tank) && !bIsAdminImmune(iSurvivor, g_esSplatterPlayer[tank].g_iTankType, g_esSplatterAbility[g_esSplatterPlayer[tank].g_iTankTypeRecorded].g_iImmunityFlags, g_esSplatterPlayer[iSurvivor].g_iImmunityFlags)) - { - GetClientAbsOrigin(iSurvivor, flSurvivorPos); - if (GetVectorDistance(flTankPos, flSurvivorPos) <= flRange && bIsVisibleToPlayer(tank, iSurvivor, g_esSplatterCache[tank].g_iSplatterSight, .range = flRange)) - { - vSplatterHit(iSurvivor, tank, random, flChance, g_esSplatterCache[tank].g_iSplatterAbility, MT_MESSAGE_RANGE, MT_ATTACK_RANGE, pos); - - iSurvivorCount++; - } - } - } - - if (iSurvivorCount == 0) - { - if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esSplatterCache[tank].g_iHumanAbility == 1) - { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "SplatterHuman4"); - } - } - } - else if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esSplatterCache[tank].g_iHumanAbility == 1) - { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "SplatterAmmo"); - } -} - -void vSplatterHit(int survivor, int tank, float random, float chance, int enabled, int messages, int flags, int pos = -1) -{ - if (!g_bSecondGame || bIsAreaNarrow(tank, g_esSplatterCache[tank].g_flOpenAreasOnly) || bIsAreaWide(tank, g_esSplatterCache[tank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esSplatterPlayer[tank].g_iTankType, tank) || (g_esSplatterCache[tank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esSplatterCache[tank].g_iRequiresHumans) || (!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esSplatterAbility[g_esSplatterPlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esSplatterPlayer[tank].g_iAccessFlags)) || MT_IsAdminImmune(survivor, tank) || bIsAdminImmune(survivor, g_esSplatterPlayer[tank].g_iTankType, g_esSplatterAbility[g_esSplatterPlayer[tank].g_iTankTypeRecorded].g_iImmunityFlags, g_esSplatterPlayer[survivor].g_iImmunityFlags)) - { - return; - } - - int iTime = GetTime(); - if (((flags & MT_ATTACK_RANGE) && g_esSplatterPlayer[tank].g_iRangeCooldown != -1 && g_esSplatterPlayer[tank].g_iRangeCooldown >= iTime) || (((flags & MT_ATTACK_CLAW) || (flags & MT_ATTACK_MELEE)) && g_esSplatterPlayer[tank].g_iCooldown != -1 && g_esSplatterPlayer[tank].g_iCooldown >= iTime)) - { - return; - } - - if (enabled == 1 && bIsHumanSurvivor(survivor)) - { - if (!bIsInfected(tank, MT_CHECK_FAKECLIENT) || (flags & MT_ATTACK_CLAW) || (flags & MT_ATTACK_MELEE) || (g_esSplatterPlayer[tank].g_iAmmoCount < g_esSplatterCache[tank].g_iHumanAmmo && g_esSplatterCache[tank].g_iHumanAmmo > 0)) - { - if (random <= chance && !g_esSplatterPlayer[survivor].g_bAffected) - { - if ((messages & MT_MESSAGE_MELEE) && !bIsVisibleToPlayer(tank, survivor, g_esSplatterCache[tank].g_iSplatterSight, .range = 100.0)) - { - return; - } - - g_esSplatterPlayer[survivor].g_bAffected = true; - g_esSplatterPlayer[survivor].g_iOwner = tank; - - int iCooldown = -1; - if ((flags & MT_ATTACK_RANGE) && (g_esSplatterPlayer[tank].g_iRangeCooldown == -1 || g_esSplatterPlayer[tank].g_iRangeCooldown <= iTime)) - { - if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esSplatterCache[tank].g_iHumanAbility == 1) - { - g_esSplatterPlayer[tank].g_iAmmoCount++; - - MT_PrintToChat(tank, "%s %t", MT_TAG3, "SplatterHuman", g_esSplatterPlayer[tank].g_iAmmoCount, g_esSplatterCache[tank].g_iHumanAmmo); - } - - iCooldown = (pos != -1) ? RoundToNearest(MT_GetCombinationSetting(tank, 11, pos)) : g_esSplatterCache[tank].g_iSplatterRangeCooldown; - iCooldown = (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esSplatterCache[tank].g_iHumanAbility == 1 && g_esSplatterPlayer[tank].g_iAmmoCount < g_esSplatterCache[tank].g_iHumanAmmo && g_esSplatterCache[tank].g_iHumanAmmo > 0) ? g_esSplatterCache[tank].g_iHumanRangeCooldown : iCooldown; - g_esSplatterPlayer[tank].g_iRangeCooldown = (iTime + iCooldown); - if (g_esSplatterPlayer[tank].g_iRangeCooldown != -1 && g_esSplatterPlayer[tank].g_iRangeCooldown >= iTime) - { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "SplatterHuman5", (g_esSplatterPlayer[tank].g_iRangeCooldown - iTime)); - } - } - else if (((flags & MT_ATTACK_CLAW) || (flags & MT_ATTACK_MELEE)) && (g_esSplatterPlayer[tank].g_iCooldown == -1 || g_esSplatterPlayer[tank].g_iCooldown <= iTime)) - { - iCooldown = (pos != -1) ? RoundToNearest(MT_GetCombinationSetting(tank, 2, pos)) : g_esSplatterCache[tank].g_iSplatterCooldown; - iCooldown = (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esSplatterCache[tank].g_iHumanAbility == 1) ? g_esSplatterCache[tank].g_iHumanCooldown : iCooldown; - g_esSplatterPlayer[tank].g_iCooldown = (iTime + iCooldown); - if (g_esSplatterPlayer[tank].g_iCooldown != -1 && g_esSplatterPlayer[tank].g_iCooldown >= iTime) - { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "SplatterHuman5", (g_esSplatterPlayer[tank].g_iCooldown - iTime)); - } - } - - float flInterval = (pos != -1) ? MT_GetCombinationSetting(tank, 6, pos) : g_esSplatterCache[tank].g_flSplatterInterval; - if (flInterval > 0.0) - { - DataPack dpSplatter; - CreateDataTimer(flInterval, tTimerSplatter, dpSplatter, TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); - dpSplatter.WriteCell(GetClientUserId(survivor)); - dpSplatter.WriteCell(GetClientUserId(tank)); - dpSplatter.WriteCell(g_esSplatterPlayer[tank].g_iTankType); - dpSplatter.WriteCell(messages); - dpSplatter.WriteCell(enabled); - dpSplatter.WriteCell(pos); - dpSplatter.WriteCell(iTime); - dpSplatter.WriteFloat(flInterval); - } - - vScreenEffect(survivor, tank, g_esSplatterCache[tank].g_iSplatterEffect, flags); - - if (g_esSplatterCache[tank].g_iSplatterMessage & messages) - { - char sTankName[64]; - MT_GetTankName(tank, sTankName); - MT_PrintToChatAll("%s %t", MT_TAG2, "Splatter", sTankName, survivor); - MT_LogMessage(MT_LOG_ABILITY, "%s %T", MT_TAG, "Splatter", LANG_SERVER, sTankName, survivor); - } - } - else if ((flags & MT_ATTACK_RANGE) && (g_esSplatterPlayer[tank].g_iRangeCooldown == -1 || g_esSplatterPlayer[tank].g_iRangeCooldown <= iTime)) - { - if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esSplatterCache[tank].g_iHumanAbility == 1 && !g_esSplatterPlayer[tank].g_bFailed) - { - g_esSplatterPlayer[tank].g_bFailed = true; - - MT_PrintToChat(tank, "%s %t", MT_TAG3, "SplatterHuman2"); - } - } - } - else if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esSplatterCache[tank].g_iHumanAbility == 1 && !g_esSplatterPlayer[tank].g_bNoAmmo) - { - g_esSplatterPlayer[tank].g_bNoAmmo = true; - - MT_PrintToChat(tank, "%s %t", MT_TAG3, "SplatterAmmo"); - } - } -} - -void vSplatterCopyStats2(int oldTank, int newTank) -{ - g_esSplatterPlayer[newTank].g_iAmmoCount = g_esSplatterPlayer[oldTank].g_iAmmoCount; - g_esSplatterPlayer[newTank].g_iCooldown = g_esSplatterPlayer[oldTank].g_iCooldown; - g_esSplatterPlayer[newTank].g_iRangeCooldown = g_esSplatterPlayer[oldTank].g_iRangeCooldown; -} - -void vRemoveSplatter(int tank) -{ - for (int iSurvivor = 1; iSurvivor <= MaxClients; iSurvivor++) - { - if (bIsSurvivor(iSurvivor, MT_CHECK_INGAME|MT_CHECK_ALIVE) && g_esSplatterPlayer[iSurvivor].g_bAffected && g_esSplatterPlayer[iSurvivor].g_iOwner == tank) - { - g_esSplatterPlayer[iSurvivor].g_bAffected = false; - g_esSplatterPlayer[iSurvivor].g_iOwner = -1; - - vStopSplatter(iSurvivor); - } - } - - vSplatterReset3(tank); -} - -void vSplatterReset() -{ - for (int iPlayer = 1; iPlayer <= MaxClients; iPlayer++) - { - if (bIsValidClient(iPlayer, MT_CHECK_INGAME)) - { - vSplatterReset3(iPlayer); - } - } -} - -void vSplatterReset2(int survivor, int tank, int messages) -{ - g_esSplatterPlayer[survivor].g_bAffected = false; - g_esSplatterPlayer[survivor].g_iOwner = -1; - - vStopSplatter(survivor); - - if (g_esSplatterCache[tank].g_iSplatterMessage & messages) - { - MT_PrintToChatAll("%s %t", MT_TAG2, "Splatter2", survivor); - MT_LogMessage(MT_LOG_ABILITY, "%s %T", MT_TAG, "Splatter2", LANG_SERVER, survivor); - } -} - -void vSplatterReset3(int tank) -{ - g_esSplatterPlayer[tank].g_bAffected = false; - g_esSplatterPlayer[tank].g_bFailed = false; - g_esSplatterPlayer[tank].g_bNoAmmo = false; - g_esSplatterPlayer[tank].g_iAmmoCount = 0; - g_esSplatterPlayer[tank].g_iCooldown = -1; - g_esSplatterPlayer[tank].g_iRangeCooldown = -1; -} - -void vStopSplatter(int survivor) -{ - MT_TE_SetupStopAllParticles(survivor); - TE_SendToClient(survivor); -} - -void tTimerSplatterCombo(Handle timer, DataPack pack) -{ - pack.Reset(); - - int iTank = GetClientOfUserId(pack.ReadCell()); - if (!g_bSecondGame || !MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esSplatterAbility[g_esSplatterPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esSplatterPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esSplatterPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esSplatterCache[iTank].g_iSplatterAbility == 0) - { - return; - } - - float flRandom = pack.ReadFloat(); - int iPos = pack.ReadCell(); - vSplatterAbility(iTank, flRandom, iPos); -} - -void tTimerSplatterCombo2(Handle timer, DataPack pack) -{ - pack.Reset(); - - int iSurvivor = GetClientOfUserId(pack.ReadCell()); - if (!g_bSecondGame || !bIsHumanSurvivor(iSurvivor) || g_esSplatterPlayer[iSurvivor].g_bAffected) - { - return; - } - - int iTank = GetClientOfUserId(pack.ReadCell()); - if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esSplatterAbility[g_esSplatterPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esSplatterPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esSplatterPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esSplatterCache[iTank].g_iSplatterHit == 0) - { - return; - } - - float flRandom = pack.ReadFloat(), flChance = pack.ReadFloat(); - int iPos = pack.ReadCell(); - char sClassname[32]; - pack.ReadString(sClassname, sizeof sClassname); - if ((g_esSplatterCache[iTank].g_iSplatterHitMode == 0 || g_esSplatterCache[iTank].g_iSplatterHitMode == 1) && (bIsSpecialInfected(iTank) || StrEqual(sClassname[7], "tank_claw") || StrEqual(sClassname, "tank_rock"))) - { - vSplatterHit(iSurvivor, iTank, flRandom, flChance, g_esSplatterCache[iTank].g_iSplatterHit, MT_MESSAGE_MELEE, MT_ATTACK_CLAW, iPos); - } - else if ((g_esSplatterCache[iTank].g_iSplatterHitMode == 0 || g_esSplatterCache[iTank].g_iSplatterHitMode == 2) && StrEqual(sClassname[7], "melee")) - { - vSplatterHit(iSurvivor, iTank, flRandom, flChance, g_esSplatterCache[iTank].g_iSplatterHit, MT_MESSAGE_MELEE, MT_ATTACK_MELEE, iPos); - } -} - -Action tTimerSplatter(Handle timer, DataPack pack) -{ - pack.Reset(); - - int iSurvivor = GetClientOfUserId(pack.ReadCell()); - if (!g_bSecondGame || !MT_IsCorePluginEnabled() || !bIsHumanSurvivor(iSurvivor)) - { - g_esSplatterPlayer[iSurvivor].g_bAffected = false; - g_esSplatterPlayer[iSurvivor].g_iOwner = -1; - - return Plugin_Stop; - } - - int iTank = GetClientOfUserId(pack.ReadCell()), iType = pack.ReadCell(), iMessage = pack.ReadCell(); - if (!MT_IsTankSupported(iTank) || bIsAreaNarrow(iTank, g_esSplatterCache[iTank].g_flOpenAreasOnly) || bIsAreaWide(iTank, g_esSplatterCache[iTank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esSplatterPlayer[iTank].g_iTankType, iTank) || (g_esSplatterCache[iTank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esSplatterCache[iTank].g_iRequiresHumans) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esSplatterAbility[g_esSplatterPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esSplatterPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esSplatterPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || iType != g_esSplatterPlayer[iTank].g_iTankType || MT_IsAdminImmune(iSurvivor, iTank) || bIsAdminImmune(iSurvivor, g_esSplatterPlayer[iTank].g_iTankType, g_esSplatterAbility[g_esSplatterPlayer[iTank].g_iTankTypeRecorded].g_iImmunityFlags, g_esSplatterPlayer[iSurvivor].g_iImmunityFlags) || !g_esSplatterPlayer[iSurvivor].g_bAffected || MT_DoesSurvivorHaveRewardType(iSurvivor, MT_REWARD_GODMODE)) - { - vSplatterReset2(iSurvivor, iTank, iMessage); - - return Plugin_Stop; - } - - int iSplatterEnabled = pack.ReadCell(), iPos = pack.ReadCell(), - iDuration = (iPos != -1) ? RoundToNearest(MT_GetCombinationSetting(iTank, 5, iPos)) : g_esSplatterCache[iTank].g_iSplatterDuration, - iTime = pack.ReadCell(); - if (iSplatterEnabled == 0 || (iTime + iDuration) <= GetTime() || !g_esSplatterPlayer[iSurvivor].g_bAffected) - { - vSplatterReset2(iSurvivor, iTank, iMessage); - - return Plugin_Stop; - } - - int iIndex = (g_esSplatterCache[iTank].g_iSplatterType > 0) ? (g_esSplatterCache[iTank].g_iSplatterType - 1) : MT_GetRandomInt(0, (sizeof g_sParticles - 1)), - iParticle = MT_GetParticleIndex(g_sParticles[iIndex]); - if (iParticle == INVALID_STRING_INDEX) - { - vSplatterReset2(iSurvivor, iTank, iMessage); - - return Plugin_Stop; - } - - if (!bIsVisibleToPlayer(iSurvivor, iTank, g_esSplatterCache[iTank].g_iSplatterSight)) - { - return Plugin_Continue; - } - - MT_TE_SetupParticleAttachment(iParticle, 1, iSurvivor, true); - TE_SendToClient(iSurvivor); - - return Plugin_Continue; -} \ No newline at end of file diff --git a/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_throw.sp b/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_throw.sp index aee5a3e763..19e3082b14 100644 --- a/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_throw.sp +++ b/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_throw.sp @@ -1,6 +1,6 @@ /** - * Mutant Tanks: a L4D/L4D2 SourceMod Plugin - * Copyright (C) 2024 Alfred "Psyk0tik" Llagas + * Mutant Tanks: A L4D/L4D2 SourceMod Plugin + * Copyright (C) 2017-2025 Alfred "Psyk0tik" Llagas * * 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. * @@ -70,6 +70,14 @@ public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max #define MT_MENU_THROW "Throw Ability" +enum struct esThrowGeneral +{ + int g_iCar[2048]; + int g_iCarOwner[2048]; +} + +esThrowGeneral g_esThrowGeneral; + enum struct esThrowPlayer { bool g_bActivated; @@ -77,6 +85,7 @@ enum struct esThrowPlayer float g_flCloseAreasOnly; float g_flOpenAreasOnly; + float g_flThrowCarDamage; float g_flThrowCarLifetime; float g_flThrowChance; float g_flThrowInfectedLifetime; @@ -113,6 +122,7 @@ enum struct esThrowTeammate { float g_flCloseAreasOnly; float g_flOpenAreasOnly; + float g_flThrowCarDamage; float g_flThrowCarLifetime; float g_flThrowChance; float g_flThrowInfectedLifetime; @@ -142,6 +152,7 @@ enum struct esThrowAbility { float g_flCloseAreasOnly; float g_flOpenAreasOnly; + float g_flThrowCarDamage; float g_flThrowCarLifetime; float g_flThrowChance; float g_flThrowInfectedLifetime; @@ -174,6 +185,7 @@ enum struct esThrowSpecial { float g_flCloseAreasOnly; float g_flOpenAreasOnly; + float g_flThrowCarDamage; float g_flThrowCarLifetime; float g_flThrowChance; float g_flThrowInfectedLifetime; @@ -203,6 +215,7 @@ enum struct esThrowCache { float g_flCloseAreasOnly; float g_flOpenAreasOnly; + float g_flThrowCarDamage; float g_flThrowCarLifetime; float g_flThrowChance; float g_flThrowInfectedLifetime; @@ -433,10 +446,45 @@ public void MT_OnMenuItemDisplayed(int client, const char[] info, char[] buffer, } } +#if defined MT_ABILITIES_MAIN2 +void vThrowEntityDestroyed(int entity) +#else +public void OnEntityDestroyed(int entity) +#endif +{ + if (bIsValidEntity(entity)) + { + g_esThrowGeneral.g_iCar[entity] = INVALID_ENT_REFERENCE; + g_esThrowGeneral.g_iCarOwner[entity] = -1; + } +} + Action OnThrowTakeDamage(int victim, int &attacker, int &inflictor, float &damage, int &damagetype) { - if (MT_IsCorePluginEnabled() && bIsSurvivor(victim) && !bIsSurvivorDisabled(victim) && damage > 0.0) + if (MT_IsCorePluginEnabled() && bIsSurvivor(victim) && damage > 0.0) { + if (bIsValidEntity(inflictor)) + { + int iCar = EntRefToEntIndex(g_esThrowGeneral.g_iCar[inflictor]); + if (iCar > MaxClients && iCar == inflictor) + { + int iTank = g_esThrowGeneral.g_iCarOwner[iCar]; + if (MT_IsTankSupported(iTank) && MT_IsCustomTankSupported(iTank)) + { + if ((!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esThrowAbility[g_esThrowPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esThrowPlayer[iTank].g_iAccessFlags)) || MT_IsAdminImmune(victim, iTank) || bIsAdminImmune(victim, g_esThrowPlayer[iTank].g_iTankType, g_esThrowAbility[g_esThrowPlayer[iTank].g_iTankTypeRecorded].g_iImmunityFlags, g_esThrowPlayer[victim].g_iImmunityFlags)) + { + return Plugin_Handled; + } + + int iPos = g_esThrowAbility[g_esThrowPlayer[iTank].g_iTankTypeRecorded].g_iComboPosition; + float flDamage = (iPos != -1) ? MT_GetCombinationSetting(iTank, 3, iPos) : g_esThrowCache[iTank].g_flThrowCarDamage; + damage = MT_GetScaledDamage(flDamage); + + return (damage > 0.0) ? Plugin_Changed : Plugin_Handled; + } + } + } + if (bIsInfected(attacker) && g_esThrowPlayer[attacker].g_bThrown) { int iTank = g_esThrowPlayer[attacker].g_iOwner; @@ -572,6 +620,7 @@ public void MT_OnConfigsLoad(int mode) g_esThrowAbility[iIndex].g_iRequiresHumans = 0; g_esThrowAbility[iIndex].g_iThrowAbility = 0; g_esThrowAbility[iIndex].g_iThrowMessage = 0; + g_esThrowAbility[iIndex].g_flThrowCarDamage = 5.0; g_esThrowAbility[iIndex].g_flThrowCarLifetime = 10.0; g_esThrowAbility[iIndex].g_iThrowCarOptions = 0; g_esThrowAbility[iIndex].g_iThrowCarOwner = 1; @@ -595,6 +644,7 @@ public void MT_OnConfigsLoad(int mode) g_esThrowSpecial[iIndex].g_iRequiresHumans = -1; g_esThrowSpecial[iIndex].g_iThrowAbility = -1; g_esThrowSpecial[iIndex].g_iThrowMessage = -1; + g_esThrowSpecial[iIndex].g_flThrowCarDamage = -1.0; g_esThrowSpecial[iIndex].g_flThrowCarLifetime = -1.0; g_esThrowSpecial[iIndex].g_iThrowCarOptions = -1; g_esThrowSpecial[iIndex].g_iThrowCarOwner = -1; @@ -625,6 +675,7 @@ public void MT_OnConfigsLoad(int mode) g_esThrowPlayer[iPlayer].g_iRequiresHumans = -1; g_esThrowPlayer[iPlayer].g_iThrowAbility = -1; g_esThrowPlayer[iPlayer].g_iThrowMessage = -1; + g_esThrowPlayer[iPlayer].g_flThrowCarDamage = -1.0; g_esThrowPlayer[iPlayer].g_flThrowCarLifetime = -1.0; g_esThrowPlayer[iPlayer].g_iThrowCarOptions = -1; g_esThrowPlayer[iPlayer].g_iThrowCarOwner = -1; @@ -648,6 +699,7 @@ public void MT_OnConfigsLoad(int mode) g_esThrowTeammate[iPlayer].g_iRequiresHumans = -1; g_esThrowTeammate[iPlayer].g_iThrowAbility = -1; g_esThrowTeammate[iPlayer].g_iThrowMessage = -1; + g_esThrowTeammate[iPlayer].g_flThrowCarDamage = -1.0; g_esThrowTeammate[iPlayer].g_flThrowCarLifetime = -1.0; g_esThrowTeammate[iPlayer].g_iThrowCarOptions = -1; g_esThrowTeammate[iPlayer].g_iThrowCarOwner = -1; @@ -685,6 +737,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esThrowTeammate[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_THROW_SECTION, MT_THROW_SECTION2, MT_THROW_SECTION3, MT_THROW_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esThrowTeammate[admin].g_iRequiresHumans, value, -1, 32); g_esThrowTeammate[admin].g_iThrowAbility = iGetKeyValue(subsection, MT_THROW_SECTION, MT_THROW_SECTION2, MT_THROW_SECTION3, MT_THROW_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esThrowTeammate[admin].g_iThrowAbility, value, -1, 15); g_esThrowTeammate[admin].g_iThrowMessage = iGetKeyValue(subsection, MT_THROW_SECTION, MT_THROW_SECTION2, MT_THROW_SECTION3, MT_THROW_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esThrowTeammate[admin].g_iThrowMessage, value, -1, 15); + g_esThrowTeammate[admin].g_flThrowCarDamage = flGetKeyValue(subsection, MT_THROW_SECTION, MT_THROW_SECTION2, MT_THROW_SECTION3, MT_THROW_SECTION4, key, "ThrowCarDamage", "Throw Car Damage", "Throw_Car_Damage", "cardamage", g_esThrowTeammate[admin].g_flThrowCarDamage, value, -1.0, 99999.0); g_esThrowTeammate[admin].g_flThrowCarLifetime = flGetKeyValue(subsection, MT_THROW_SECTION, MT_THROW_SECTION2, MT_THROW_SECTION3, MT_THROW_SECTION4, key, "ThrowCarLifetime", "Throw Car Lifetime", "Throw_Car_Lifetime", "carlifetime", g_esThrowTeammate[admin].g_flThrowCarLifetime, value, -1.0, 99999.0); g_esThrowTeammate[admin].g_iThrowCarOptions = iGetKeyValue(subsection, MT_THROW_SECTION, MT_THROW_SECTION2, MT_THROW_SECTION3, MT_THROW_SECTION4, key, "ThrowCarOptions", "Throw Car Options", "Throw_Car_Options", "caroptions", g_esThrowTeammate[admin].g_iThrowCarOptions, value, -1, 7); g_esThrowTeammate[admin].g_iThrowCarOwner = iGetKeyValue(subsection, MT_THROW_SECTION, MT_THROW_SECTION2, MT_THROW_SECTION3, MT_THROW_SECTION4, key, "ThrowCarOwner", "Throw Car Owner", "Throw_Car_Owner", "carowner", g_esThrowTeammate[admin].g_iThrowCarOwner, value, -1, 1); @@ -710,6 +763,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esThrowPlayer[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_THROW_SECTION, MT_THROW_SECTION2, MT_THROW_SECTION3, MT_THROW_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esThrowPlayer[admin].g_iRequiresHumans, value, -1, 32); g_esThrowPlayer[admin].g_iThrowAbility = iGetKeyValue(subsection, MT_THROW_SECTION, MT_THROW_SECTION2, MT_THROW_SECTION3, MT_THROW_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esThrowPlayer[admin].g_iThrowAbility, value, -1, 15); g_esThrowPlayer[admin].g_iThrowMessage = iGetKeyValue(subsection, MT_THROW_SECTION, MT_THROW_SECTION2, MT_THROW_SECTION3, MT_THROW_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esThrowPlayer[admin].g_iThrowMessage, value, -1, 15); + g_esThrowPlayer[admin].g_flThrowCarDamage = flGetKeyValue(subsection, MT_THROW_SECTION, MT_THROW_SECTION2, MT_THROW_SECTION3, MT_THROW_SECTION4, key, "ThrowCarDamage", "Throw Car Damage", "Throw_Car_Damage", "cardamage", g_esThrowPlayer[admin].g_flThrowCarDamage, value, -1.0, 99999.0); g_esThrowPlayer[admin].g_flThrowCarLifetime = flGetKeyValue(subsection, MT_THROW_SECTION, MT_THROW_SECTION2, MT_THROW_SECTION3, MT_THROW_SECTION4, key, "ThrowCarLifetime", "Throw Car Lifetime", "Throw_Car_Lifetime", "carlifetime", g_esThrowPlayer[admin].g_flThrowCarLifetime, value, -1.0, 99999.0); g_esThrowPlayer[admin].g_iThrowCarOptions = iGetKeyValue(subsection, MT_THROW_SECTION, MT_THROW_SECTION2, MT_THROW_SECTION3, MT_THROW_SECTION4, key, "ThrowCarOptions", "Throw Car Options", "Throw_Car_Options", "caroptions", g_esThrowPlayer[admin].g_iThrowCarOptions, value, -1, 7); g_esThrowPlayer[admin].g_iThrowCarOwner = iGetKeyValue(subsection, MT_THROW_SECTION, MT_THROW_SECTION2, MT_THROW_SECTION3, MT_THROW_SECTION4, key, "ThrowCarOwner", "Throw Car Owner", "Throw_Car_Owner", "carowner", g_esThrowPlayer[admin].g_iThrowCarOwner, value, -1, 1); @@ -741,6 +795,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esThrowSpecial[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_THROW_SECTION, MT_THROW_SECTION2, MT_THROW_SECTION3, MT_THROW_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esThrowSpecial[type].g_iRequiresHumans, value, -1, 32); g_esThrowSpecial[type].g_iThrowAbility = iGetKeyValue(subsection, MT_THROW_SECTION, MT_THROW_SECTION2, MT_THROW_SECTION3, MT_THROW_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esThrowSpecial[type].g_iThrowAbility, value, -1, 15); g_esThrowSpecial[type].g_iThrowMessage = iGetKeyValue(subsection, MT_THROW_SECTION, MT_THROW_SECTION2, MT_THROW_SECTION3, MT_THROW_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esThrowSpecial[type].g_iThrowMessage, value, -1, 15); + g_esThrowSpecial[type].g_flThrowCarDamage = flGetKeyValue(subsection, MT_THROW_SECTION, MT_THROW_SECTION2, MT_THROW_SECTION3, MT_THROW_SECTION4, key, "ThrowCarDamage", "Throw Car Damage", "Throw_Car_Damage", "cardamage", g_esThrowSpecial[type].g_flThrowCarDamage, value, -1.0, 99999.0); g_esThrowSpecial[type].g_flThrowCarLifetime = flGetKeyValue(subsection, MT_THROW_SECTION, MT_THROW_SECTION2, MT_THROW_SECTION3, MT_THROW_SECTION4, key, "ThrowCarLifetime", "Throw Car Lifetime", "Throw_Car_Lifetime", "carlifetime", g_esThrowSpecial[type].g_flThrowCarLifetime, value, -1.0, 99999.0); g_esThrowSpecial[type].g_iThrowCarOptions = iGetKeyValue(subsection, MT_THROW_SECTION, MT_THROW_SECTION2, MT_THROW_SECTION3, MT_THROW_SECTION4, key, "ThrowCarOptions", "Throw Car Options", "Throw_Car_Options", "caroptions", g_esThrowSpecial[type].g_iThrowCarOptions, value, -1, 7); g_esThrowSpecial[type].g_iThrowCarOwner = iGetKeyValue(subsection, MT_THROW_SECTION, MT_THROW_SECTION2, MT_THROW_SECTION3, MT_THROW_SECTION4, key, "ThrowCarOwner", "Throw Car Owner", "Throw_Car_Owner", "carowner", g_esThrowSpecial[type].g_iThrowCarOwner, value, -1, 1); @@ -766,6 +821,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esThrowAbility[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_THROW_SECTION, MT_THROW_SECTION2, MT_THROW_SECTION3, MT_THROW_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esThrowAbility[type].g_iRequiresHumans, value, -1, 32); g_esThrowAbility[type].g_iThrowAbility = iGetKeyValue(subsection, MT_THROW_SECTION, MT_THROW_SECTION2, MT_THROW_SECTION3, MT_THROW_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esThrowAbility[type].g_iThrowAbility, value, -1, 15); g_esThrowAbility[type].g_iThrowMessage = iGetKeyValue(subsection, MT_THROW_SECTION, MT_THROW_SECTION2, MT_THROW_SECTION3, MT_THROW_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esThrowAbility[type].g_iThrowMessage, value, -1, 15); + g_esThrowAbility[type].g_flThrowCarDamage = flGetKeyValue(subsection, MT_THROW_SECTION, MT_THROW_SECTION2, MT_THROW_SECTION3, MT_THROW_SECTION4, key, "ThrowCarDamage", "Throw Car Damage", "Throw_Car_Damage", "cardamage", g_esThrowAbility[type].g_flThrowCarDamage, value, -1.0, 99999.0); g_esThrowAbility[type].g_flThrowCarLifetime = flGetKeyValue(subsection, MT_THROW_SECTION, MT_THROW_SECTION2, MT_THROW_SECTION3, MT_THROW_SECTION4, key, "ThrowCarLifetime", "Throw Car Lifetime", "Throw_Car_Lifetime", "carlifetime", g_esThrowAbility[type].g_flThrowCarLifetime, value, -1.0, 99999.0); g_esThrowAbility[type].g_iThrowCarOptions = iGetKeyValue(subsection, MT_THROW_SECTION, MT_THROW_SECTION2, MT_THROW_SECTION3, MT_THROW_SECTION4, key, "ThrowCarOptions", "Throw Car Options", "Throw_Car_Options", "caroptions", g_esThrowAbility[type].g_iThrowCarOptions, value, -1, 7); g_esThrowAbility[type].g_iThrowCarOwner = iGetKeyValue(subsection, MT_THROW_SECTION, MT_THROW_SECTION2, MT_THROW_SECTION3, MT_THROW_SECTION4, key, "ThrowCarOwner", "Throw Car Owner", "Throw_Car_Owner", "carowner", g_esThrowAbility[type].g_iThrowCarOwner, value, -1, 1); @@ -800,6 +856,7 @@ public void MT_OnSettingsCached(int tank, bool apply, int type) { g_esThrowCache[tank].g_flCloseAreasOnly = flGetSubSettingValue(apply, bHuman, g_esThrowTeammate[tank].g_flCloseAreasOnly, g_esThrowPlayer[tank].g_flCloseAreasOnly, g_esThrowSpecial[iType].g_flCloseAreasOnly, g_esThrowAbility[iType].g_flCloseAreasOnly, 1); g_esThrowCache[tank].g_iComboAbility = iGetSubSettingValue(apply, bHuman, g_esThrowTeammate[tank].g_iComboAbility, g_esThrowPlayer[tank].g_iComboAbility, g_esThrowSpecial[iType].g_iComboAbility, g_esThrowAbility[iType].g_iComboAbility, 1); + g_esThrowCache[tank].g_flThrowCarDamage = flGetSubSettingValue(apply, bHuman, g_esThrowTeammate[tank].g_flThrowCarDamage, g_esThrowPlayer[tank].g_flThrowCarDamage, g_esThrowSpecial[iType].g_flThrowCarDamage, g_esThrowAbility[iType].g_flThrowCarDamage, 1); g_esThrowCache[tank].g_flThrowCarLifetime = flGetSubSettingValue(apply, bHuman, g_esThrowTeammate[tank].g_flThrowCarLifetime, g_esThrowPlayer[tank].g_flThrowCarLifetime, g_esThrowSpecial[iType].g_flThrowCarLifetime, g_esThrowAbility[iType].g_flThrowCarLifetime, 1); g_esThrowCache[tank].g_flThrowChance = flGetSubSettingValue(apply, bHuman, g_esThrowTeammate[tank].g_flThrowChance, g_esThrowPlayer[tank].g_flThrowChance, g_esThrowSpecial[iType].g_flThrowChance, g_esThrowAbility[iType].g_flThrowChance, 1); g_esThrowCache[tank].g_flThrowInfectedLifetime = flGetSubSettingValue(apply, bHuman, g_esThrowTeammate[tank].g_flThrowInfectedLifetime, g_esThrowPlayer[tank].g_flThrowInfectedLifetime, g_esThrowSpecial[iType].g_flThrowInfectedLifetime, g_esThrowAbility[iType].g_flThrowInfectedLifetime, 1); @@ -825,6 +882,7 @@ public void MT_OnSettingsCached(int tank, bool apply, int type) { g_esThrowCache[tank].g_flCloseAreasOnly = flGetSettingValue(apply, bHuman, g_esThrowPlayer[tank].g_flCloseAreasOnly, g_esThrowAbility[iType].g_flCloseAreasOnly, 1); g_esThrowCache[tank].g_iComboAbility = iGetSettingValue(apply, bHuman, g_esThrowPlayer[tank].g_iComboAbility, g_esThrowAbility[iType].g_iComboAbility, 1); + g_esThrowCache[tank].g_flThrowCarDamage = flGetSettingValue(apply, bHuman, g_esThrowPlayer[tank].g_flThrowCarDamage, g_esThrowAbility[iType].g_flThrowCarDamage, 1); g_esThrowCache[tank].g_flThrowCarLifetime = flGetSettingValue(apply, bHuman, g_esThrowPlayer[tank].g_flThrowCarLifetime, g_esThrowAbility[iType].g_flThrowCarLifetime, 1); g_esThrowCache[tank].g_flThrowChance = flGetSettingValue(apply, bHuman, g_esThrowPlayer[tank].g_flThrowChance, g_esThrowAbility[iType].g_flThrowChance, 1); g_esThrowCache[tank].g_flThrowInfectedLifetime = flGetSettingValue(apply, bHuman, g_esThrowPlayer[tank].g_flThrowInfectedLifetime, g_esThrowAbility[iType].g_flThrowInfectedLifetime, 1); @@ -1124,26 +1182,30 @@ int iGetThrownWitchCount(int tank) return iWitchCount; } -void tTimerThrowKillInfected(Handle timer, int userid) +Action tTimerThrowKillInfected(Handle timer, int userid) { int iSpecial = GetClientOfUserId(userid); if (!bIsInfected(iSpecial) || !g_esThrowPlayer[iSpecial].g_bThrown) { - return; + return Plugin_Stop; } ForcePlayerSuicide(iSpecial); + + return Plugin_Continue; } -void tTimerThrowKillWitch(Handle timer, int ref) +Action tTimerThrowKillWitch(Handle timer, int ref) { int iWitch = EntRefToEntIndex(ref); if (iWitch == INVALID_ENT_REFERENCE || !bIsValidEntity(iWitch) || !bIsWitch(iWitch)) { - return; + return Plugin_Stop; } RemoveEntity(iWitch); + + return Plugin_Continue; } Action tTimerThrow(Handle timer, DataPack pack) @@ -1248,6 +1310,8 @@ Action tTimerThrow(Handle timer, DataPack pack) TeleportEntity(iCar, .velocity = flVelocity); SDKHook(iCar, SDKHook_StartTouch, OnThrowStartTouch); + g_esThrowGeneral.g_iCar[iCar] = EntIndexToEntRef(iCar); + g_esThrowGeneral.g_iCarOwner[iCar] = GetClientUserId(iTank); iCar = EntIndexToEntRef(iCar); vDeleteEntity(iCar, g_esThrowCache[iTank].g_flThrowCarLifetime); @@ -1291,24 +1355,24 @@ Action tTimerThrow(Handle timer, DataPack pack) switch (iOption) { - case 1: vCheatCommand(iTank, (g_bSecondGame ? "z_spawn_old" : "z_spawn"), "smoker"); - case 2: vCheatCommand(iTank, (g_bSecondGame ? "z_spawn_old" : "z_spawn"), "boomer"); - case 4: vCheatCommand(iTank, (g_bSecondGame ? "z_spawn_old" : "z_spawn"), "hunter"); - case 8: vCheatCommand(iTank, (g_bSecondGame ? "z_spawn_old" : "z_spawn"), (g_bSecondGame ? "spitter" : "boomer")); - case 16: vCheatCommand(iTank, (g_bSecondGame ? "z_spawn_old" : "z_spawn"), (g_bSecondGame ? "jockey" : "hunter")); - case 32: vCheatCommand(iTank, (g_bSecondGame ? "z_spawn_old" : "z_spawn"), (g_bSecondGame ? "charger" : "smoker")); - case 64: vCheatCommand(iTank, (g_bSecondGame ? "z_spawn_old" : "z_spawn"), "tank"); + case 1: vCheatCommand(iTank, (g_bSecondGame ? "z_spawn_old" : "z_spawn"), "tank"); + case 2: vCheatCommand(iTank, (g_bSecondGame ? "z_spawn_old" : "z_spawn"), "smoker"); + case 4: vCheatCommand(iTank, (g_bSecondGame ? "z_spawn_old" : "z_spawn"), "boomer"); + case 8: vCheatCommand(iTank, (g_bSecondGame ? "z_spawn_old" : "z_spawn"), "hunter"); + case 16: vCheatCommand(iTank, (g_bSecondGame ? "z_spawn_old" : "z_spawn"), (g_bSecondGame ? "spitter" : "boomer")); + case 32: vCheatCommand(iTank, (g_bSecondGame ? "z_spawn_old" : "z_spawn"), (g_bSecondGame ? "jockey" : "hunter")); + case 64: vCheatCommand(iTank, (g_bSecondGame ? "z_spawn_old" : "z_spawn"), (g_bSecondGame ? "charger" : "smoker")); default: { switch (MT_GetRandomInt(1, (sizeof iOptions))) { - case 1: vCheatCommand(iTank, (g_bSecondGame ? "z_spawn_old" : "z_spawn"), "smoker"); - case 2: vCheatCommand(iTank, (g_bSecondGame ? "z_spawn_old" : "z_spawn"), "boomer"); - case 3: vCheatCommand(iTank, (g_bSecondGame ? "z_spawn_old" : "z_spawn"), "hunter"); - case 4: vCheatCommand(iTank, (g_bSecondGame ? "z_spawn_old" : "z_spawn"), (g_bSecondGame ? "spitter" : "boomer")); - case 5: vCheatCommand(iTank, (g_bSecondGame ? "z_spawn_old" : "z_spawn"), (g_bSecondGame ? "jockey" : "hunter")); - case 6: vCheatCommand(iTank, (g_bSecondGame ? "z_spawn_old" : "z_spawn"), (g_bSecondGame ? "charger" : "smoker")); - case 7: vCheatCommand(iTank, (g_bSecondGame ? "z_spawn_old" : "z_spawn"), "tank"); + case 1: vCheatCommand(iTank, (g_bSecondGame ? "z_spawn_old" : "z_spawn"), "tank"); + case 2: vCheatCommand(iTank, (g_bSecondGame ? "z_spawn_old" : "z_spawn"), "smoker"); + case 3: vCheatCommand(iTank, (g_bSecondGame ? "z_spawn_old" : "z_spawn"), "boomer"); + case 4: vCheatCommand(iTank, (g_bSecondGame ? "z_spawn_old" : "z_spawn"), "hunter"); + case 5: vCheatCommand(iTank, (g_bSecondGame ? "z_spawn_old" : "z_spawn"), (g_bSecondGame ? "spitter" : "boomer")); + case 6: vCheatCommand(iTank, (g_bSecondGame ? "z_spawn_old" : "z_spawn"), (g_bSecondGame ? "jockey" : "hunter")); + case 7: vCheatCommand(iTank, (g_bSecondGame ? "z_spawn_old" : "z_spawn"), (g_bSecondGame ? "charger" : "smoker")); } } } diff --git a/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_track.sp b/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_track.sp index 8678283edb..af844432b0 100644 --- a/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_track.sp +++ b/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_track.sp @@ -1,6 +1,6 @@ /** - * Mutant Tanks: a L4D/L4D2 SourceMod Plugin - * Copyright (C) 2024 Alfred "Psyk0tik" Llagas + * Mutant Tanks: A L4D/L4D2 SourceMod Plugin + * Copyright (C) 2017-2025 Alfred "Psyk0tik" Llagas * * 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. * @@ -29,6 +29,8 @@ public Plugin myinfo = bool g_bDedicated, g_bSecondGame; +int g_iGraphicsLevel; + public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max) { switch (GetEngineVersion()) @@ -608,7 +610,9 @@ public void MT_OnSettingsCached(int tank, bool apply, int type) g_esTrackPlayer[tank].g_iTankTypeRecorded = apply ? MT_GetRecordedTankType(tank, type) : 0; g_esTrackPlayer[tank].g_iTankType = apply ? type : 0; int iType = g_esTrackPlayer[tank].g_iTankTypeRecorded; - +#if !defined MT_ABILITIES_MAIN2 + g_iGraphicsLevel = MT_GetGraphicsLevel(); +#endif if (bIsSpecialInfected(tank, MT_CHECK_INDEX|MT_CHECK_INGAME)) { g_esTrackCache[tank].g_flCloseAreasOnly = flGetSubSettingValue(apply, bHuman, g_esTrackTeammate[tank].g_flCloseAreasOnly, g_esTrackPlayer[tank].g_flCloseAreasOnly, g_esTrackSpecial[iType].g_flCloseAreasOnly, g_esTrackAbility[iType].g_flCloseAreasOnly, 1); @@ -791,7 +795,7 @@ public void MT_OnRockThrow(int tank, int rock) void vSetTrackGlow(int rock, int color, bool flashing, int min, int max, int type) { - if (!g_bSecondGame) + if (!g_bSecondGame || g_iGraphicsLevel <= 1) { return; } @@ -1096,7 +1100,7 @@ void vTrackThink(int rock) int iGlowColor[4]; MT_GetTankColors(iTank, 2, iGlowColor[0], iGlowColor[1], iGlowColor[2], iGlowColor[3]); - switch (iGlowColor[0] == -2 && iGlowColor[1] == -2 && iGlowColor[2] == -2) + switch (iGlowColor[0] == -2 && iGlowColor[1] == -2 && iGlowColor[2] == -2 && g_iGraphicsLevel > 2) { case true: { @@ -1117,7 +1121,7 @@ void vTrackThink(int rock) void OnTrackPreThinkPost(int tank) { - if (!g_bSecondGame || !MT_IsTankSupported(tank) || !MT_IsCustomTankSupported(tank) || !g_esTrackPlayer[tank].g_bRainbowColor) + if (!g_bSecondGame || !MT_IsTankSupported(tank) || !MT_IsCustomTankSupported(tank) || !g_esTrackPlayer[tank].g_bRainbowColor || g_iGraphicsLevel <= 2) { g_esTrackPlayer[tank].g_bRainbowColor = false; @@ -1223,14 +1227,14 @@ int iGetRockTarget(float pos[3], float angles[3], int tank) return iTarget; } -void tTimerTrack(Handle timer, DataPack pack) +Action tTimerTrack(Handle timer, DataPack pack) { pack.Reset(); int iRock = EntRefToEntIndex(pack.ReadCell()); if (!MT_IsCorePluginEnabled() || iRock == INVALID_ENT_REFERENCE || !bIsValidEntity(iRock)) { - return; + return Plugin_Stop; } int iTank = GetClientOfUserId(pack.ReadCell()), iType = pack.ReadCell(); @@ -1238,7 +1242,7 @@ void tTimerTrack(Handle timer, DataPack pack) { g_esTrackPlayer[iTank].g_bActivated = false; - return; + return Plugin_Stop; } SDKUnhook(iRock, SDKHook_Think, OnTrackThink); @@ -1257,4 +1261,6 @@ void tTimerTrack(Handle timer, DataPack pack) MT_PrintToChat(iTank, "%s %t", MT_TAG3, "TrackHuman4", (g_esTrackPlayer[iTank].g_iCooldown - iTime)); } } + + return Plugin_Continue; } \ No newline at end of file diff --git a/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_ultimate.sp b/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_ultimate.sp index 9241f6116d..98668a388d 100644 --- a/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_ultimate.sp +++ b/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_ultimate.sp @@ -1,6 +1,6 @@ /** - * Mutant Tanks: a L4D/L4D2 SourceMod Plugin - * Copyright (C) 2024 Alfred "Psyk0tik" Llagas + * Mutant Tanks: A L4D/L4D2 SourceMod Plugin + * Copyright (C) 2017-2025 Alfred "Psyk0tik" Llagas * * 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. * @@ -29,6 +29,8 @@ public Plugin myinfo = bool g_bDedicated, g_bLateLoad, g_bSecondGame; +int g_iGraphicsLevel; + public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max) { switch (GetEngineVersion()) @@ -815,7 +817,9 @@ public void MT_OnSettingsCached(int tank, bool apply, int type) g_esUltimatePlayer[tank].g_iTankTypeRecorded = apply ? MT_GetRecordedTankType(tank, type) : 0; g_esUltimatePlayer[tank].g_iTankType = apply ? type : 0; int iType = g_esUltimatePlayer[tank].g_iTankTypeRecorded; - +#if !defined MT_ABILITIES_MAIN2 + g_iGraphicsLevel = MT_GetGraphicsLevel(); +#endif if (bIsSpecialInfected(tank, MT_CHECK_INDEX|MT_CHECK_INGAME)) { g_esUltimateCache[tank].g_flCloseAreasOnly = flGetSubSettingValue(apply, bHuman, g_esUltimateTeammate[tank].g_flCloseAreasOnly, g_esUltimatePlayer[tank].g_flCloseAreasOnly, g_esUltimateSpecial[iType].g_flCloseAreasOnly, g_esUltimateAbility[iType].g_flCloseAreasOnly, 1); @@ -1022,8 +1026,12 @@ void vUltimate(int tank, int pos = -1) g_esUltimatePlayer[tank].g_flDamage = 0.0; g_esUltimatePlayer[tank].g_iDuration = (iTime + iDuration); + if (g_iGraphicsLevel > 2) + { + vAttachParticle(tank, PARTICLE_ELECTRICITY, 2.0, 30.0); + } + ExtinguishEntity(tank); - vAttachParticle(tank, PARTICLE_ELECTRICITY, 2.0, 30.0); EmitSoundToAll(SOUND_CHARGE, tank); EmitSoundToAll(SOUND_EXPLOSION, tank); @@ -1126,16 +1134,18 @@ void vUltimateReset() } } -void tTimerUltimateCombo(Handle timer, DataPack pack) +Action tTimerUltimateCombo(Handle timer, DataPack pack) { pack.Reset(); int iTank = GetClientOfUserId(pack.ReadCell()); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esUltimateAbility[g_esUltimatePlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esUltimatePlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esUltimatePlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esUltimateCache[iTank].g_iUltimateAbility == 0 || g_esUltimatePlayer[iTank].g_bActivated) { - return; + return Plugin_Stop; } int iPos = pack.ReadCell(); vUltimate(iTank, iPos); + + return Plugin_Continue; } \ No newline at end of file diff --git a/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_undead.sp b/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_undead.sp index 1a4025e1eb..d5e1147b64 100644 --- a/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_undead.sp +++ b/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_undead.sp @@ -1,6 +1,6 @@ /** - * Mutant Tanks: a L4D/L4D2 SourceMod Plugin - * Copyright (C) 2024 Alfred "Psyk0tik" Llagas + * Mutant Tanks: A L4D/L4D2 SourceMod Plugin + * Copyright (C) 2017-2025 Alfred "Psyk0tik" Llagas * * 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. * @@ -885,13 +885,15 @@ void vUndeadReset() } } -void tTimerUndeadCombo(Handle timer, int userid) +Action tTimerUndeadCombo(Handle timer, int userid) { int iTank = GetClientOfUserId(userid); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esUndeadAbility[g_esUndeadPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esUndeadPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esUndeadPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esUndeadCache[iTank].g_iUndeadAbility == 0 || g_esUndeadPlayer[iTank].g_bActivated) { - return; + return Plugin_Stop; } vUndead(iTank); + + return Plugin_Continue; } \ No newline at end of file diff --git a/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_vampire.sp b/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_vampire.sp deleted file mode 100644 index 55bd8e87ff..0000000000 --- a/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_vampire.sp +++ /dev/null @@ -1,563 +0,0 @@ -/** - * Mutant Tanks: a L4D/L4D2 SourceMod Plugin - * Copyright (C) 2024 Alfred "Psyk0tik" Llagas - * - * 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 . - **/ - -#define MT_VAMPIRE_COMPILE_METHOD 0 // 0: packaged, 1: standalone - -#if !defined MT_ABILITIES_MAIN2 - #if MT_VAMPIRE_COMPILE_METHOD == 1 - #include - #include - #else - #error This file must be inside "scripting/mutant_tanks/abilities2" while compiling "mt_abilities2.sp" to include its content. - #endif -public Plugin myinfo = -{ - name = "[MT] Vampire Ability", - author = MT_AUTHOR, - description = "The Mutant Tank gains health from hurting survivors.", - version = MT_VERSION, - url = MT_URL -}; - -bool g_bDedicated, g_bLateLoad; - -public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max) -{ - EngineVersion evEngine = GetEngineVersion(); - if (evEngine != Engine_Left4Dead && evEngine != Engine_Left4Dead2) - { - strcopy(error, err_max, "\"[MT] Vampire Ability\" only supports Left 4 Dead 1 & 2."); - - return APLRes_SilentFailure; - } - - g_bDedicated = IsDedicatedServer(); - g_bLateLoad = late; - - return APLRes_Success; -} -#else - #if MT_VAMPIRE_COMPILE_METHOD == 1 - #error This file must be compiled as a standalone plugin. - #endif -#endif - -#define MT_VAMPIRE_SECTION "vampireability" -#define MT_VAMPIRE_SECTION2 "vampire ability" -#define MT_VAMPIRE_SECTION3 "vampire_ability" -#define MT_VAMPIRE_SECTION4 "vampire" - -#define MT_MENU_VAMPIRE "Vampire Ability" - -enum struct esVampirePlayer -{ - float g_flCloseAreasOnly; - float g_flOpenAreasOnly; - float g_flVampireChance; - float g_flVampireHealthMultiplier; - - int g_iAccessFlags; - int g_iHumanAbility; - int g_iImmunityFlags; - int g_iRequiresHumans; - int g_iTankType; - int g_iTankTypeRecorded; - int g_iVampireAbility; - int g_iVampireEffect; - int g_iVampireHealth; - int g_iVampireMessage; -} - -esVampirePlayer g_esVampirePlayer[MAXPLAYERS + 1]; - -enum struct esVampireTeammate -{ - float g_flCloseAreasOnly; - float g_flOpenAreasOnly; - float g_flVampireChance; - float g_flVampireHealthMultiplier; - - int g_iHumanAbility; - int g_iRequiresHumans; - int g_iVampireAbility; - int g_iVampireEffect; - int g_iVampireHealth; - int g_iVampireMessage; -} - -esVampireTeammate g_esVampireTeammate[MAXPLAYERS + 1]; - -enum struct esVampireAbility -{ - float g_flCloseAreasOnly; - float g_flOpenAreasOnly; - float g_flVampireChance; - float g_flVampireHealthMultiplier; - - int g_iAccessFlags; - int g_iHumanAbility; - int g_iImmunityFlags; - int g_iRequiresHumans; - int g_iVampireAbility; - int g_iVampireEffect; - int g_iVampireHealth; - int g_iVampireMessage; -} - -esVampireAbility g_esVampireAbility[MT_MAXTYPES + 1]; - -enum struct esVampireSpecial -{ - float g_flCloseAreasOnly; - float g_flOpenAreasOnly; - float g_flVampireChance; - float g_flVampireHealthMultiplier; - - int g_iHumanAbility; - int g_iRequiresHumans; - int g_iVampireAbility; - int g_iVampireEffect; - int g_iVampireHealth; - int g_iVampireMessage; -} - -esVampireSpecial g_esVampireSpecial[MT_MAXTYPES + 1]; - -enum struct esVampireCache -{ - float g_flCloseAreasOnly; - float g_flOpenAreasOnly; - float g_flVampireChance; - float g_flVampireHealthMultiplier; - - int g_iHumanAbility; - int g_iRequiresHumans; - int g_iVampireAbility; - int g_iVampireEffect; - int g_iVampireHealth; - int g_iVampireMessage; -} - -esVampireCache g_esVampireCache[MAXPLAYERS + 1]; - -#if !defined MT_ABILITIES_MAIN2 -public void OnPluginStart() -{ - LoadTranslations("common.phrases"); - LoadTranslations("mutant_tanks.phrases"); - LoadTranslations("mutant_tanks_names.phrases"); - - RegConsoleCmd("sm_mt_vampire", cmdVampireInfo, "View information about the Vampire ability."); - - if (g_bLateLoad) - { - for (int iPlayer = 1; iPlayer <= MaxClients; iPlayer++) - { - if (bIsValidClient(iPlayer, MT_CHECK_INGAME)) - { - OnClientPutInServer(iPlayer); - } - } - - g_bLateLoad = false; - } -} -#endif - -#if defined MT_ABILITIES_MAIN2 -void vVampireClientPutInServer(int client) -#else -public void OnClientPutInServer(int client) -#endif -{ - SDKHook(client, SDKHook_OnTakeDamage, OnVampireTakeDamage); -} - -#if !defined MT_ABILITIES_MAIN2 -Action cmdVampireInfo(int client, int args) -{ - client = iGetListenServerHost(client, g_bDedicated); - - if (!MT_IsCorePluginEnabled()) - { - MT_ReplyToCommand(client, "%s %t", MT_TAG5, "PluginDisabled"); - - return Plugin_Handled; - } - - if (!bIsValidClient(client, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_FAKECLIENT)) - { - MT_ReplyToCommand(client, "%s %t", MT_TAG, "Command is in-game only"); - - return Plugin_Handled; - } - - switch (IsVoteInProgress()) - { - case true: MT_ReplyToCommand(client, "%s %t", MT_TAG2, "Vote in Progress"); - case false: vVampireMenu(client, MT_VAMPIRE_SECTION4, 0); - } - - return Plugin_Handled; -} -#endif - -void vVampireMenu(int client, const char[] name, int item) -{ - if (StrContains(MT_VAMPIRE_SECTION4, name, false) == -1) - { - return; - } - - Menu mAbilityMenu = new Menu(iVampireMenuHandler, MENU_ACTIONS_DEFAULT|MenuAction_Display|MenuAction_DisplayItem); - mAbilityMenu.SetTitle("Vampire Ability Information"); - mAbilityMenu.AddItem("Status", "Status"); - mAbilityMenu.AddItem("Details", "Details"); - mAbilityMenu.AddItem("Human Support", "Human Support"); - mAbilityMenu.DisplayAt(client, item, MENU_TIME_FOREVER); -} - -int iVampireMenuHandler(Menu menu, MenuAction action, int param1, int param2) -{ - switch (action) - { - case MenuAction_End: delete menu; - case MenuAction_Select: - { - switch (param2) - { - case 0: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esVampireCache[param1].g_iVampireAbility == 0) ? "AbilityStatus1" : "AbilityStatus2"); - case 1: MT_PrintToChat(param1, "%s %t", MT_TAG3, "VampireDetails"); - case 2: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esVampireCache[param1].g_iHumanAbility == 0) ? "AbilityHumanSupport1" : "AbilityHumanSupport2"); - } - - if (bIsValidClient(param1, MT_CHECK_INGAME)) - { - vVampireMenu(param1, MT_VAMPIRE_SECTION4, menu.Selection); - } - } - case MenuAction_Display: - { - char sMenuTitle[PLATFORM_MAX_PATH]; - Panel pVampire = view_as(param2); - FormatEx(sMenuTitle, sizeof sMenuTitle, "%T", "VampireMenu", param1); - pVampire.SetTitle(sMenuTitle); - } - case MenuAction_DisplayItem: - { - if (param2 >= 0) - { - char sMenuOption[PLATFORM_MAX_PATH]; - - switch (param2) - { - case 0: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Status", param1); - case 1: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Details", param1); - case 2: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "HumanSupport", param1); - } - - return RedrawMenuItem(sMenuOption); - } - } - } - - return 0; -} - -#if defined MT_ABILITIES_MAIN2 -void vVampireDisplayMenu(Menu menu) -#else -public void MT_OnDisplayMenu(Menu menu) -#endif -{ - menu.AddItem(MT_MENU_VAMPIRE, MT_MENU_VAMPIRE); -} - -#if defined MT_ABILITIES_MAIN2 -void vVampireMenuItemSelected(int client, const char[] info) -#else -public void MT_OnMenuItemSelected(int client, const char[] info) -#endif -{ - if (StrEqual(info, MT_MENU_VAMPIRE, false)) - { - vVampireMenu(client, MT_VAMPIRE_SECTION4, 0); - } -} - -#if defined MT_ABILITIES_MAIN2 -void vVampireMenuItemDisplayed(int client, const char[] info, char[] buffer, int size) -#else -public void MT_OnMenuItemDisplayed(int client, const char[] info, char[] buffer, int size) -#endif -{ - if (StrEqual(info, MT_MENU_VAMPIRE, false)) - { - FormatEx(buffer, size, "%T", "VampireMenu2", client); - } -} - -Action OnVampireTakeDamage(int victim, int &attacker, int &inflictor, float &damage, int &damagetype) -{ - if (MT_IsCorePluginEnabled() && bIsValidClient(victim, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_ALIVE) && damage > 0.0) - { - char sClassname[32]; - if (bIsValidEntity(inflictor)) - { - GetEntityClassname(inflictor, sClassname, sizeof sClassname); - } - - bool bCaught = bIsSurvivorCaught(victim); - if ((bIsSpecialInfected(attacker) && (bCaught || (!bCaught && (damagetype & DMG_CLUB)) || (bIsSpitter(attacker) && StrEqual(sClassname, "insect_swarm")))) || StrEqual(sClassname[7], "tank_claw") || StrEqual(sClassname, "tank_rock")) - { - if (MT_IsTankSupported(attacker) && MT_IsCustomTankSupported(attacker) && !bIsPlayerIncapacitated(attacker) && g_esVampireCache[attacker].g_iVampireAbility == 1 && GetRandomFloat(0.1, 100.0) <= g_esVampireCache[attacker].g_flVampireChance && bIsSurvivor(victim)) - { - if (bIsAreaNarrow(attacker, g_esVampireCache[attacker].g_flOpenAreasOnly) || bIsAreaWide(attacker, g_esVampireCache[attacker].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esVampirePlayer[attacker].g_iTankType, attacker) || (g_esVampireCache[attacker].g_iRequiresHumans > 0 && iGetHumanCount() < g_esVampireCache[attacker].g_iRequiresHumans) || (!MT_HasAdminAccess(attacker) && !bHasAdminAccess(attacker, g_esVampireAbility[g_esVampirePlayer[attacker].g_iTankTypeRecorded].g_iAccessFlags, g_esVampirePlayer[attacker].g_iAccessFlags)) || MT_IsAdminImmune(victim, attacker) || bIsAdminImmune(victim, g_esVampirePlayer[attacker].g_iTankType, g_esVampireAbility[g_esVampirePlayer[attacker].g_iTankTypeRecorded].g_iImmunityFlags, g_esVampirePlayer[victim].g_iImmunityFlags)) - { - return Plugin_Continue; - } - - if (!bIsInfected(attacker, MT_CHECK_FAKECLIENT) || g_esVampireCache[attacker].g_iHumanAbility == 1) - { - float flHealth = (g_esVampireCache[attacker].g_iVampireHealth > 0) ? float(g_esVampireCache[attacker].g_iVampireHealth) : damage; - flHealth *= g_esVampireCache[attacker].g_flVampireHealthMultiplier; - int iDamage = RoundToNearest(flHealth), - iHealth = GetEntProp(attacker, Prop_Data, "m_iHealth"), - iMaxHealth = MT_TankMaxHealth(attacker, 1), - iNewHealth = (iHealth + iDamage), - iLeftover = (iNewHealth > MT_MAXHEALTH) ? (iDamage - MT_MAXHEALTH) : iNewHealth, - iFinalHealth = iClamp(iNewHealth, 1, MT_MAXHEALTH), - iTotalHealth = (iNewHealth > MT_MAXHEALTH) ? iLeftover : iDamage; - MT_TankMaxHealth(attacker, 3, (iMaxHealth + iTotalHealth)); - SetEntProp(attacker, Prop_Data, "m_iHealth", iFinalHealth); - vScreenEffect(victim, attacker, g_esVampireCache[attacker].g_iVampireEffect, MT_ATTACK_CLAW); - - if (g_esVampireCache[attacker].g_iVampireMessage == 1) - { - char sTankName[64]; - MT_GetTankName(attacker, sTankName); - MT_PrintToChatAll("%s %t", MT_TAG2, "Vampire", sTankName, victim); - MT_LogMessage(MT_LOG_ABILITY, "%s %T", MT_TAG, "Vampire", LANG_SERVER, sTankName, victim); - } - } - } - } - } - - return Plugin_Continue; -} - -#if defined MT_ABILITIES_MAIN2 -void vVampirePluginCheck(ArrayList list) -#else -public void MT_OnPluginCheck(ArrayList list) -#endif -{ - list.PushString(MT_MENU_VAMPIRE); -} - -#if defined MT_ABILITIES_MAIN2 -void vVampireAbilityCheck(ArrayList list, ArrayList list2, ArrayList list3, ArrayList list4) -#else -public void MT_OnAbilityCheck(ArrayList list, ArrayList list2, ArrayList list3, ArrayList list4) -#endif -{ - list.PushString(MT_VAMPIRE_SECTION); - list2.PushString(MT_VAMPIRE_SECTION2); - list3.PushString(MT_VAMPIRE_SECTION3); - list4.PushString(MT_VAMPIRE_SECTION4); -} - -#if defined MT_ABILITIES_MAIN2 -void vVampireConfigsLoad(int mode) -#else -public void MT_OnConfigsLoad(int mode) -#endif -{ - switch (mode) - { - case 1: - { - for (int iIndex = MT_GetMinType(); iIndex <= MT_GetMaxType(); iIndex++) - { - g_esVampireAbility[iIndex].g_iAccessFlags = 0; - g_esVampireAbility[iIndex].g_iImmunityFlags = 0; - g_esVampireAbility[iIndex].g_flCloseAreasOnly = 0.0; - g_esVampireAbility[iIndex].g_iHumanAbility = 0; - g_esVampireAbility[iIndex].g_flOpenAreasOnly = 0.0; - g_esVampireAbility[iIndex].g_iRequiresHumans = 0; - g_esVampireAbility[iIndex].g_iVampireAbility = 0; - g_esVampireAbility[iIndex].g_iVampireEffect = 0; - g_esVampireAbility[iIndex].g_iVampireHealth = 0; - g_esVampireAbility[iIndex].g_iVampireMessage = 0; - g_esVampireAbility[iIndex].g_flVampireChance = 33.3; - g_esVampireAbility[iIndex].g_flVampireHealthMultiplier = 1.0; - - g_esVampireSpecial[iIndex].g_flCloseAreasOnly = -1.0; - g_esVampireSpecial[iIndex].g_iHumanAbility = -1; - g_esVampireSpecial[iIndex].g_flOpenAreasOnly = -1.0; - g_esVampireSpecial[iIndex].g_iRequiresHumans = -1; - g_esVampireSpecial[iIndex].g_iVampireAbility = -1; - g_esVampireSpecial[iIndex].g_iVampireEffect = -1; - g_esVampireSpecial[iIndex].g_iVampireHealth = -1; - g_esVampireSpecial[iIndex].g_iVampireMessage = -1; - g_esVampireSpecial[iIndex].g_flVampireChance = -1.0; - g_esVampireSpecial[iIndex].g_flVampireHealthMultiplier = -1.0; - } - } - case 3: - { - for (int iPlayer = 1; iPlayer <= MaxClients; iPlayer++) - { - g_esVampirePlayer[iPlayer].g_iAccessFlags = -1; - g_esVampirePlayer[iPlayer].g_iImmunityFlags = -1; - g_esVampirePlayer[iPlayer].g_flCloseAreasOnly = -1.0; - g_esVampirePlayer[iPlayer].g_iHumanAbility = -1; - g_esVampirePlayer[iPlayer].g_flOpenAreasOnly = -1.0; - g_esVampirePlayer[iPlayer].g_iRequiresHumans = -1; - g_esVampirePlayer[iPlayer].g_iVampireAbility = -1; - g_esVampirePlayer[iPlayer].g_iVampireEffect = -1; - g_esVampirePlayer[iPlayer].g_iVampireHealth = -1; - g_esVampirePlayer[iPlayer].g_iVampireMessage = -1; - g_esVampirePlayer[iPlayer].g_flVampireChance = -1.0; - g_esVampirePlayer[iPlayer].g_flVampireHealthMultiplier = -1.0; - - g_esVampireTeammate[iPlayer].g_flCloseAreasOnly = -1.0; - g_esVampireTeammate[iPlayer].g_iHumanAbility = -1; - g_esVampireTeammate[iPlayer].g_flOpenAreasOnly = -1.0; - g_esVampireTeammate[iPlayer].g_iRequiresHumans = -1; - g_esVampireTeammate[iPlayer].g_iVampireAbility = -1; - g_esVampireTeammate[iPlayer].g_iVampireEffect = -1; - g_esVampireTeammate[iPlayer].g_iVampireHealth = -1; - g_esVampireTeammate[iPlayer].g_iVampireMessage = -1; - g_esVampireTeammate[iPlayer].g_flVampireChance = -1.0; - g_esVampireTeammate[iPlayer].g_flVampireHealthMultiplier = -1.0; - } - } - } -} - -#if defined MT_ABILITIES_MAIN2 -void vVampireConfigsLoaded(const char[] subsection, const char[] key, const char[] value, int type, int admin, int mode, bool special, const char[] specsection) -#else -public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const char[] value, int type, int admin, int mode, bool special, const char[] specsection) -#endif -{ - if ((mode == -1 || mode == 3) && bIsValidClient(admin)) - { - if (special && specsection[0] != '\0') - { - g_esVampireTeammate[admin].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_VAMPIRE_SECTION, MT_VAMPIRE_SECTION2, MT_VAMPIRE_SECTION3, MT_VAMPIRE_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esVampireTeammate[admin].g_flCloseAreasOnly, value, -1.0, 99999.0); - g_esVampireTeammate[admin].g_iHumanAbility = iGetKeyValue(subsection, MT_VAMPIRE_SECTION, MT_VAMPIRE_SECTION2, MT_VAMPIRE_SECTION3, MT_VAMPIRE_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esVampireTeammate[admin].g_iHumanAbility, value, -1, 1); - g_esVampireTeammate[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_VAMPIRE_SECTION, MT_VAMPIRE_SECTION2, MT_VAMPIRE_SECTION3, MT_VAMPIRE_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esVampireTeammate[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); - g_esVampireTeammate[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_VAMPIRE_SECTION, MT_VAMPIRE_SECTION2, MT_VAMPIRE_SECTION3, MT_VAMPIRE_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esVampireTeammate[admin].g_iRequiresHumans, value, -1, 32); - g_esVampireTeammate[admin].g_iVampireAbility = iGetKeyValue(subsection, MT_VAMPIRE_SECTION, MT_VAMPIRE_SECTION2, MT_VAMPIRE_SECTION3, MT_VAMPIRE_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esVampireTeammate[admin].g_iVampireAbility, value, -1, 1); - g_esVampireTeammate[admin].g_iVampireEffect = iGetKeyValue(subsection, MT_VAMPIRE_SECTION, MT_VAMPIRE_SECTION2, MT_VAMPIRE_SECTION3, MT_VAMPIRE_SECTION4, key, "AbilityEffect", "Ability Effect", "Ability_Effect", "effect", g_esVampireTeammate[admin].g_iVampireEffect, value, -1, 1); - g_esVampireTeammate[admin].g_iVampireHealth = iGetKeyValue(subsection, MT_VAMPIRE_SECTION, MT_VAMPIRE_SECTION2, MT_VAMPIRE_SECTION3, MT_VAMPIRE_SECTION4, key, "VampireHealth", "Vampire Health", "Vampire_Health", "health", g_esVampireTeammate[admin].g_iVampireHealth, value, -1, MT_MAXHEALTH); - g_esVampireTeammate[admin].g_iVampireMessage = iGetKeyValue(subsection, MT_VAMPIRE_SECTION, MT_VAMPIRE_SECTION2, MT_VAMPIRE_SECTION3, MT_VAMPIRE_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esVampireTeammate[admin].g_iVampireMessage, value, -1, 1); - g_esVampireTeammate[admin].g_flVampireChance = flGetKeyValue(subsection, MT_VAMPIRE_SECTION, MT_VAMPIRE_SECTION2, MT_VAMPIRE_SECTION3, MT_VAMPIRE_SECTION4, key, "VampireChance", "Vampire Chance", "Vampire_Chance", "chance", g_esVampireTeammate[admin].g_flVampireChance, value, -1.0, 100.0); - g_esVampireTeammate[admin].g_flVampireHealthMultiplier = flGetKeyValue(subsection, MT_VAMPIRE_SECTION, MT_VAMPIRE_SECTION2, MT_VAMPIRE_SECTION3, MT_VAMPIRE_SECTION4, key, "VampireHealthMultiplier", "Vampire Health Multiplier", "Vampire_Health_Multiplier", "hpmulti", g_esVampireTeammate[admin].g_flVampireHealthMultiplier, value, -1.0, 99999.0); - } - else - { - g_esVampirePlayer[admin].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_VAMPIRE_SECTION, MT_VAMPIRE_SECTION2, MT_VAMPIRE_SECTION3, MT_VAMPIRE_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esVampirePlayer[admin].g_flCloseAreasOnly, value, -1.0, 99999.0); - g_esVampirePlayer[admin].g_iHumanAbility = iGetKeyValue(subsection, MT_VAMPIRE_SECTION, MT_VAMPIRE_SECTION2, MT_VAMPIRE_SECTION3, MT_VAMPIRE_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esVampirePlayer[admin].g_iHumanAbility, value, -1, 1); - g_esVampirePlayer[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_VAMPIRE_SECTION, MT_VAMPIRE_SECTION2, MT_VAMPIRE_SECTION3, MT_VAMPIRE_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esVampirePlayer[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); - g_esVampirePlayer[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_VAMPIRE_SECTION, MT_VAMPIRE_SECTION2, MT_VAMPIRE_SECTION3, MT_VAMPIRE_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esVampirePlayer[admin].g_iRequiresHumans, value, -1, 32); - g_esVampirePlayer[admin].g_iVampireAbility = iGetKeyValue(subsection, MT_VAMPIRE_SECTION, MT_VAMPIRE_SECTION2, MT_VAMPIRE_SECTION3, MT_VAMPIRE_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esVampirePlayer[admin].g_iVampireAbility, value, -1, 1); - g_esVampirePlayer[admin].g_iVampireEffect = iGetKeyValue(subsection, MT_VAMPIRE_SECTION, MT_VAMPIRE_SECTION2, MT_VAMPIRE_SECTION3, MT_VAMPIRE_SECTION4, key, "AbilityEffect", "Ability Effect", "Ability_Effect", "effect", g_esVampirePlayer[admin].g_iVampireEffect, value, -1, 1); - g_esVampirePlayer[admin].g_iVampireHealth = iGetKeyValue(subsection, MT_VAMPIRE_SECTION, MT_VAMPIRE_SECTION2, MT_VAMPIRE_SECTION3, MT_VAMPIRE_SECTION4, key, "VampireHealth", "Vampire Health", "Vampire_Health", "health", g_esVampirePlayer[admin].g_iVampireHealth, value, -1, MT_MAXHEALTH); - g_esVampirePlayer[admin].g_iVampireMessage = iGetKeyValue(subsection, MT_VAMPIRE_SECTION, MT_VAMPIRE_SECTION2, MT_VAMPIRE_SECTION3, MT_VAMPIRE_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esVampirePlayer[admin].g_iVampireMessage, value, -1, 1); - g_esVampirePlayer[admin].g_flVampireChance = flGetKeyValue(subsection, MT_VAMPIRE_SECTION, MT_VAMPIRE_SECTION2, MT_VAMPIRE_SECTION3, MT_VAMPIRE_SECTION4, key, "VampireChance", "Vampire Chance", "Vampire_Chance", "chance", g_esVampirePlayer[admin].g_flVampireChance, value, -1.0, 100.0); - g_esVampirePlayer[admin].g_flVampireHealthMultiplier = flGetKeyValue(subsection, MT_VAMPIRE_SECTION, MT_VAMPIRE_SECTION2, MT_VAMPIRE_SECTION3, MT_VAMPIRE_SECTION4, key, "VampireHealthMultiplier", "Vampire Health Multiplier", "Vampire_Health_Multiplier", "hpmulti", g_esVampirePlayer[admin].g_flVampireHealthMultiplier, value, -1.0, 99999.0); - g_esVampirePlayer[admin].g_iAccessFlags = iGetAdminFlagsValue(subsection, MT_VAMPIRE_SECTION, MT_VAMPIRE_SECTION2, MT_VAMPIRE_SECTION3, MT_VAMPIRE_SECTION4, key, "AccessFlags", "Access Flags", "Access_Flags", "access", value); - g_esVampirePlayer[admin].g_iImmunityFlags = iGetAdminFlagsValue(subsection, MT_VAMPIRE_SECTION, MT_VAMPIRE_SECTION2, MT_VAMPIRE_SECTION3, MT_VAMPIRE_SECTION4, key, "ImmunityFlags", "Immunity Flags", "Immunity_Flags", "immunity", value); - } - } - - if (mode < 3 && type > 0) - { - if (special && specsection[0] != '\0') - { - g_esVampireSpecial[type].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_VAMPIRE_SECTION, MT_VAMPIRE_SECTION2, MT_VAMPIRE_SECTION3, MT_VAMPIRE_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esVampireSpecial[type].g_flCloseAreasOnly, value, -1.0, 99999.0); - g_esVampireSpecial[type].g_iHumanAbility = iGetKeyValue(subsection, MT_VAMPIRE_SECTION, MT_VAMPIRE_SECTION2, MT_VAMPIRE_SECTION3, MT_VAMPIRE_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esVampireSpecial[type].g_iHumanAbility, value, -1, 1); - g_esVampireSpecial[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_VAMPIRE_SECTION, MT_VAMPIRE_SECTION2, MT_VAMPIRE_SECTION3, MT_VAMPIRE_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esVampireSpecial[type].g_flOpenAreasOnly, value, -1.0, 99999.0); - g_esVampireSpecial[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_VAMPIRE_SECTION, MT_VAMPIRE_SECTION2, MT_VAMPIRE_SECTION3, MT_VAMPIRE_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esVampireSpecial[type].g_iRequiresHumans, value, -1, 32); - g_esVampireSpecial[type].g_iVampireAbility = iGetKeyValue(subsection, MT_VAMPIRE_SECTION, MT_VAMPIRE_SECTION2, MT_VAMPIRE_SECTION3, MT_VAMPIRE_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esVampireSpecial[type].g_iVampireAbility, value, -1, 1); - g_esVampireSpecial[type].g_iVampireEffect = iGetKeyValue(subsection, MT_VAMPIRE_SECTION, MT_VAMPIRE_SECTION2, MT_VAMPIRE_SECTION3, MT_VAMPIRE_SECTION4, key, "AbilityEffect", "Ability Effect", "Ability_Effect", "effect", g_esVampireSpecial[type].g_iVampireEffect, value, -1, 1); - g_esVampireSpecial[type].g_iVampireHealth = iGetKeyValue(subsection, MT_VAMPIRE_SECTION, MT_VAMPIRE_SECTION2, MT_VAMPIRE_SECTION3, MT_VAMPIRE_SECTION4, key, "VampireHealth", "Vampire Health", "Vampire_Health", "health", g_esVampireSpecial[type].g_iVampireHealth, value, -1, MT_MAXHEALTH); - g_esVampireSpecial[type].g_iVampireMessage = iGetKeyValue(subsection, MT_VAMPIRE_SECTION, MT_VAMPIRE_SECTION2, MT_VAMPIRE_SECTION3, MT_VAMPIRE_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esVampireSpecial[type].g_iVampireMessage, value, -1, 1); - g_esVampireSpecial[type].g_flVampireChance = flGetKeyValue(subsection, MT_VAMPIRE_SECTION, MT_VAMPIRE_SECTION2, MT_VAMPIRE_SECTION3, MT_VAMPIRE_SECTION4, key, "VampireChance", "Vampire Chance", "Vampire_Chance", "chance", g_esVampireSpecial[type].g_flVampireChance, value, -1.0, 100.0); - g_esVampireSpecial[type].g_flVampireHealthMultiplier = flGetKeyValue(subsection, MT_VAMPIRE_SECTION, MT_VAMPIRE_SECTION2, MT_VAMPIRE_SECTION3, MT_VAMPIRE_SECTION4, key, "VampireHealthMultiplier", "Vampire Health Multiplier", "Vampire_Health_Multiplier", "hpmulti", g_esVampireSpecial[type].g_flVampireHealthMultiplier, value, -1.0, 99999.0); - } - else - { - g_esVampireAbility[type].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_VAMPIRE_SECTION, MT_VAMPIRE_SECTION2, MT_VAMPIRE_SECTION3, MT_VAMPIRE_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esVampireAbility[type].g_flCloseAreasOnly, value, -1.0, 99999.0); - g_esVampireAbility[type].g_iHumanAbility = iGetKeyValue(subsection, MT_VAMPIRE_SECTION, MT_VAMPIRE_SECTION2, MT_VAMPIRE_SECTION3, MT_VAMPIRE_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esVampireAbility[type].g_iHumanAbility, value, -1, 1); - g_esVampireAbility[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_VAMPIRE_SECTION, MT_VAMPIRE_SECTION2, MT_VAMPIRE_SECTION3, MT_VAMPIRE_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esVampireAbility[type].g_flOpenAreasOnly, value, -1.0, 99999.0); - g_esVampireAbility[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_VAMPIRE_SECTION, MT_VAMPIRE_SECTION2, MT_VAMPIRE_SECTION3, MT_VAMPIRE_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esVampireAbility[type].g_iRequiresHumans, value, -1, 32); - g_esVampireAbility[type].g_iVampireAbility = iGetKeyValue(subsection, MT_VAMPIRE_SECTION, MT_VAMPIRE_SECTION2, MT_VAMPIRE_SECTION3, MT_VAMPIRE_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esVampireAbility[type].g_iVampireAbility, value, -1, 1); - g_esVampireAbility[type].g_iVampireEffect = iGetKeyValue(subsection, MT_VAMPIRE_SECTION, MT_VAMPIRE_SECTION2, MT_VAMPIRE_SECTION3, MT_VAMPIRE_SECTION4, key, "AbilityEffect", "Ability Effect", "Ability_Effect", "effect", g_esVampireAbility[type].g_iVampireEffect, value, -1, 1); - g_esVampireAbility[type].g_iVampireHealth = iGetKeyValue(subsection, MT_VAMPIRE_SECTION, MT_VAMPIRE_SECTION2, MT_VAMPIRE_SECTION3, MT_VAMPIRE_SECTION4, key, "VampireHealth", "Vampire Health", "Vampire_Health", "health", g_esVampireAbility[type].g_iVampireHealth, value, -1, MT_MAXHEALTH); - g_esVampireAbility[type].g_iVampireMessage = iGetKeyValue(subsection, MT_VAMPIRE_SECTION, MT_VAMPIRE_SECTION2, MT_VAMPIRE_SECTION3, MT_VAMPIRE_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esVampireAbility[type].g_iVampireMessage, value, -1, 1); - g_esVampireAbility[type].g_flVampireChance = flGetKeyValue(subsection, MT_VAMPIRE_SECTION, MT_VAMPIRE_SECTION2, MT_VAMPIRE_SECTION3, MT_VAMPIRE_SECTION4, key, "VampireChance", "Vampire Chance", "Vampire_Chance", "chance", g_esVampireAbility[type].g_flVampireChance, value, -1.0, 100.0); - g_esVampireAbility[type].g_flVampireHealthMultiplier = flGetKeyValue(subsection, MT_VAMPIRE_SECTION, MT_VAMPIRE_SECTION2, MT_VAMPIRE_SECTION3, MT_VAMPIRE_SECTION4, key, "VampireHealthMultiplier", "Vampire Health Multiplier", "Vampire_Health_Multiplier", "hpmulti", g_esVampireAbility[type].g_flVampireHealthMultiplier, value, -1.0, 99999.0); - g_esVampireAbility[type].g_iAccessFlags = iGetAdminFlagsValue(subsection, MT_VAMPIRE_SECTION, MT_VAMPIRE_SECTION2, MT_VAMPIRE_SECTION3, MT_VAMPIRE_SECTION4, key, "AccessFlags", "Access Flags", "Access_Flags", "access", value); - g_esVampireAbility[type].g_iImmunityFlags = iGetAdminFlagsValue(subsection, MT_VAMPIRE_SECTION, MT_VAMPIRE_SECTION2, MT_VAMPIRE_SECTION3, MT_VAMPIRE_SECTION4, key, "ImmunityFlags", "Immunity Flags", "Immunity_Flags", "immunity", value); - } - } -} - -#if defined MT_ABILITIES_MAIN2 -void vVampireSettingsCached(int tank, bool apply, int type) -#else -public void MT_OnSettingsCached(int tank, bool apply, int type) -#endif -{ - bool bHuman = bIsValidClient(tank, MT_CHECK_FAKECLIENT); - g_esVampirePlayer[tank].g_iTankTypeRecorded = apply ? MT_GetRecordedTankType(tank, type) : 0; - g_esVampirePlayer[tank].g_iTankType = apply ? type : 0; - int iType = g_esVampirePlayer[tank].g_iTankTypeRecorded; - - if (bIsSpecialInfected(tank, MT_CHECK_INDEX|MT_CHECK_INGAME)) - { - g_esVampireCache[tank].g_flCloseAreasOnly = flGetSubSettingValue(apply, bHuman, g_esVampireTeammate[tank].g_flCloseAreasOnly, g_esVampirePlayer[tank].g_flCloseAreasOnly, g_esVampireSpecial[iType].g_flCloseAreasOnly, g_esVampireAbility[iType].g_flCloseAreasOnly, 1); - g_esVampireCache[tank].g_flVampireChance = flGetSubSettingValue(apply, bHuman, g_esVampireTeammate[tank].g_flVampireChance, g_esVampirePlayer[tank].g_flVampireChance, g_esVampireSpecial[iType].g_flVampireChance, g_esVampireAbility[iType].g_flVampireChance, 1); - g_esVampireCache[tank].g_flVampireHealthMultiplier = flGetSubSettingValue(apply, bHuman, g_esVampireTeammate[tank].g_flVampireHealthMultiplier, g_esVampirePlayer[tank].g_flVampireHealthMultiplier, g_esVampireSpecial[iType].g_flVampireHealthMultiplier, g_esVampireAbility[iType].g_flVampireHealthMultiplier, 1); - g_esVampireCache[tank].g_iHumanAbility = iGetSubSettingValue(apply, bHuman, g_esVampireTeammate[tank].g_iHumanAbility, g_esVampirePlayer[tank].g_iHumanAbility, g_esVampireSpecial[iType].g_iHumanAbility, g_esVampireAbility[iType].g_iHumanAbility, 1); - g_esVampireCache[tank].g_flOpenAreasOnly = flGetSubSettingValue(apply, bHuman, g_esVampireTeammate[tank].g_flOpenAreasOnly, g_esVampirePlayer[tank].g_flOpenAreasOnly, g_esVampireSpecial[iType].g_flOpenAreasOnly, g_esVampireAbility[iType].g_flOpenAreasOnly, 1); - g_esVampireCache[tank].g_iRequiresHumans = iGetSubSettingValue(apply, bHuman, g_esVampireTeammate[tank].g_iRequiresHumans, g_esVampirePlayer[tank].g_iRequiresHumans, g_esVampireSpecial[iType].g_iRequiresHumans, g_esVampireAbility[iType].g_iRequiresHumans, 1); - g_esVampireCache[tank].g_iVampireAbility = iGetSubSettingValue(apply, bHuman, g_esVampireTeammate[tank].g_iVampireAbility, g_esVampirePlayer[tank].g_iVampireAbility, g_esVampireSpecial[iType].g_iVampireAbility, g_esVampireAbility[iType].g_iVampireAbility, 1); - g_esVampireCache[tank].g_iVampireEffect = iGetSubSettingValue(apply, bHuman, g_esVampireTeammate[tank].g_iVampireEffect, g_esVampirePlayer[tank].g_iVampireEffect, g_esVampireSpecial[iType].g_iVampireEffect, g_esVampireAbility[iType].g_iVampireEffect, 1); - g_esVampireCache[tank].g_iVampireHealth = iGetSubSettingValue(apply, bHuman, g_esVampireTeammate[tank].g_iVampireHealth, g_esVampirePlayer[tank].g_iVampireHealth, g_esVampireSpecial[iType].g_iVampireHealth, g_esVampireAbility[iType].g_iVampireHealth, 1); - g_esVampireCache[tank].g_iVampireMessage = iGetSubSettingValue(apply, bHuman, g_esVampireTeammate[tank].g_iVampireMessage, g_esVampirePlayer[tank].g_iVampireMessage, g_esVampireSpecial[iType].g_iVampireMessage, g_esVampireAbility[iType].g_iVampireMessage, 1); - } - else - { - g_esVampireCache[tank].g_flCloseAreasOnly = flGetSettingValue(apply, bHuman, g_esVampirePlayer[tank].g_flCloseAreasOnly, g_esVampireAbility[iType].g_flCloseAreasOnly, 1); - g_esVampireCache[tank].g_flVampireChance = flGetSettingValue(apply, bHuman, g_esVampirePlayer[tank].g_flVampireChance, g_esVampireAbility[iType].g_flVampireChance, 1); - g_esVampireCache[tank].g_flVampireHealthMultiplier = flGetSettingValue(apply, bHuman, g_esVampirePlayer[tank].g_flVampireHealthMultiplier, g_esVampireAbility[iType].g_flVampireHealthMultiplier, 1); - g_esVampireCache[tank].g_iHumanAbility = iGetSettingValue(apply, bHuman, g_esVampirePlayer[tank].g_iHumanAbility, g_esVampireAbility[iType].g_iHumanAbility, 1); - g_esVampireCache[tank].g_flOpenAreasOnly = flGetSettingValue(apply, bHuman, g_esVampirePlayer[tank].g_flOpenAreasOnly, g_esVampireAbility[iType].g_flOpenAreasOnly, 1); - g_esVampireCache[tank].g_iRequiresHumans = iGetSettingValue(apply, bHuman, g_esVampirePlayer[tank].g_iRequiresHumans, g_esVampireAbility[iType].g_iRequiresHumans, 1); - g_esVampireCache[tank].g_iVampireAbility = iGetSettingValue(apply, bHuman, g_esVampirePlayer[tank].g_iVampireAbility, g_esVampireAbility[iType].g_iVampireAbility, 1); - g_esVampireCache[tank].g_iVampireEffect = iGetSettingValue(apply, bHuman, g_esVampirePlayer[tank].g_iVampireEffect, g_esVampireAbility[iType].g_iVampireEffect, 1); - g_esVampireCache[tank].g_iVampireHealth = iGetSettingValue(apply, bHuman, g_esVampirePlayer[tank].g_iVampireHealth, g_esVampireAbility[iType].g_iVampireHealth, 1); - g_esVampireCache[tank].g_iVampireMessage = iGetSettingValue(apply, bHuman, g_esVampirePlayer[tank].g_iVampireMessage, g_esVampireAbility[iType].g_iVampireMessage, 1); - } -} - -#if !defined MT_ABILITIES_MAIN2 -public void MT_OnPluginUpdate() -{ - MT_ReloadPlugin(null); -} -#endif \ No newline at end of file diff --git a/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_vision.sp b/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_vision.sp index bc36e0838f..c0f47d0059 100644 --- a/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_vision.sp +++ b/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_vision.sp @@ -1,6 +1,6 @@ /** - * Mutant Tanks: a L4D/L4D2 SourceMod Plugin - * Copyright (C) 2024 Alfred "Psyk0tik" Llagas + * Mutant Tanks: A L4D/L4D2 SourceMod Plugin + * Copyright (C) 2017-2025 Alfred "Psyk0tik" Llagas * * 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. * @@ -22,21 +22,27 @@ public Plugin myinfo = { name = "[MT] Vision Ability", author = MT_AUTHOR, - description = "The Mutant Tank changes the survivors' field of view.", + description = "The Mutant Tank blinds survivors, shakes the survivors' screens, splatters the survivors' screens, and changes the survivors' field of view.", version = MT_VERSION, url = MT_URL }; -bool g_bDedicated, g_bLateLoad; +bool g_bDedicated, g_bLateLoad, g_bSecondGame; + +int g_iGraphicsLevel; public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max) { - EngineVersion evEngine = GetEngineVersion(); - if (evEngine != Engine_Left4Dead && evEngine != Engine_Left4Dead2) + switch (GetEngineVersion()) { - strcopy(error, err_max, "\"[MT] Vision Ability\" only supports Left 4 Dead 1 & 2."); + case Engine_Left4Dead: g_bSecondGame = false; + case Engine_Left4Dead2: g_bSecondGame = true; + default: + { + strcopy(error, err_max, "\"[MT] Vision Ability\" only supports Left 4 Dead 1 & 2."); - return APLRes_SilentFailure; + return APLRes_SilentFailure; + } } g_bDedicated = IsDedicatedServer(); @@ -44,6 +50,13 @@ public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max return APLRes_Success; } + +#define PARTICLE_BASHED "screen_bashed" + +#define SOUND_GROAN1 "ambient/random_amb_sfx/metalscrapeverb08.wav" +#define SOUND_GROAN2 "ambient/random_amb_sounds/randbridgegroan_03.wav" // Only available in L4D2 +#define SOUND_SMASH1 "player/tank/hit/hulk_punch_1.wav" +#define SOUND_SMASH2 "player/charger/hit/charger_smash_02.wav" // Only available in L4D2 #else #if MT_VISION_COMPILE_METHOD == 1 #error This file must be compiled as a standalone plugin. @@ -55,22 +68,69 @@ public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max #define MT_VISION_SECTION3 "vision_ability" #define MT_VISION_SECTION4 "vision" +#define MT_VISION_BLIND (1 << 0) // blind +#define MT_VISION_FLASHBANG (1 << 1) // flashbang +#define MT_VISION_SHAKE (1 << 2) // shake +#define MT_VISION_SPLATTER (1 << 3) // splatter +#define MT_VISION_VIEW (1 << 4) // view + #define MT_MENU_VISION "Vision Ability" +char g_sParticles[][] = +{ + "screen_adrenaline", + "screen_adrenaline_b", + "screen_hurt", + "screen_hurt_b", + "screen_blood_splatter", + "screen_blood_splatter_a", + "screen_blood_splatter_b", + "screen_blood_splatter_melee_b", + "screen_blood_splatter_melee", + "screen_blood_splatter_melee_blunt", + "smoker_screen_effect", + "smoker_screen_effect_b", + "screen_mud_splatter", + "screen_mud_splatter_a", + "screen_bashed", + "screen_bashed_b", + "screen_bashed_d", + "burning_character_screen", + "storm_lightning_screenglow" +}; + enum struct esVisionPlayer { bool g_bAffected; bool g_bFailed; bool g_bNoAmmo; - float g_flCloseAreasOnly; - float g_flOpenAreasOnly; float g_flVisionChance; + float g_flVisionDeathChance; + float g_flVisionDeathRange; + float g_flVisionDuration; + float g_flVisionInterval; float g_flVisionRange; float g_flVisionRangeChance; + float g_flCloseAreasOnly; + float g_flOpenAreasOnly; int g_iAccessFlags; int g_iAmmoCount; + int g_iVisionAbility; + int g_iVisionCooldown; + int g_iVisionDeath; + int g_iVisionEffect; + int g_iVisionFOV; + int g_iVisionHit; + int g_iVisionHitMode; + int g_iVisionIntensity; + int g_iVisionMessage; + int g_iVisionMode; + int g_iVisionRangeCooldown; + int g_iVisionSight; + int g_iVisionStagger; + int g_iVisionType; int g_iComboAbility; int g_iCooldown; int g_iHumanAbility; @@ -83,137 +143,168 @@ enum struct esVisionPlayer int g_iRequiresHumans; int g_iTankType; int g_iTankTypeRecorded; - int g_iVisionAbility; - int g_iVisionCooldown; - int g_iVisionDuration; - int g_iVisionEffect; - int g_iVisionFOV; - int g_iVisionHit; - int g_iVisionHitMode; - int g_iVisionMessage; - int g_iVisionRangeCooldown; - int g_iVisionSight; } esVisionPlayer g_esVisionPlayer[MAXPLAYERS + 1]; enum struct esVisionTeammate { - float g_flCloseAreasOnly; - float g_flOpenAreasOnly; float g_flVisionChance; + float g_flVisionDeathChance; + float g_flVisionDeathRange; + float g_flVisionDuration; + float g_flVisionInterval; float g_flVisionRange; float g_flVisionRangeChance; + float g_flCloseAreasOnly; + float g_flOpenAreasOnly; - int g_iComboAbility; - int g_iHumanAbility; - int g_iHumanAmmo; - int g_iHumanCooldown; - int g_iHumanRangeCooldown; - int g_iRequiresHumans; int g_iVisionAbility; int g_iVisionCooldown; - int g_iVisionDuration; + int g_iVisionDeath; int g_iVisionEffect; int g_iVisionFOV; int g_iVisionHit; int g_iVisionHitMode; + int g_iVisionIntensity; int g_iVisionMessage; + int g_iVisionMode; int g_iVisionRangeCooldown; int g_iVisionSight; + int g_iVisionStagger; + int g_iVisionType; + int g_iComboAbility; + int g_iHumanAbility; + int g_iHumanAmmo; + int g_iHumanCooldown; + int g_iHumanRangeCooldown; + int g_iRequiresHumans; } esVisionTeammate g_esVisionTeammate[MAXPLAYERS + 1]; enum struct esVisionAbility { - float g_flCloseAreasOnly; - float g_flOpenAreasOnly; float g_flVisionChance; + float g_flVisionDeathChance; + float g_flVisionDeathRange; + float g_flVisionDuration; + float g_flVisionInterval; float g_flVisionRange; float g_flVisionRangeChance; + float g_flCloseAreasOnly; + float g_flOpenAreasOnly; int g_iAccessFlags; - int g_iComboAbility; - int g_iHumanAbility; - int g_iHumanAmmo; - int g_iHumanCooldown; - int g_iHumanRangeCooldown; - int g_iImmunityFlags; - int g_iRequiresHumans; int g_iVisionAbility; int g_iVisionCooldown; - int g_iVisionDuration; + int g_iVisionDeath; int g_iVisionEffect; int g_iVisionFOV; int g_iVisionHit; int g_iVisionHitMode; + int g_iVisionIntensity; int g_iVisionMessage; + int g_iVisionMode; int g_iVisionRangeCooldown; int g_iVisionSight; + int g_iVisionStagger; + int g_iVisionType; + int g_iComboAbility; + int g_iHumanAbility; + int g_iHumanAmmo; + int g_iHumanCooldown; + int g_iHumanRangeCooldown; + int g_iImmunityFlags; + int g_iRequiresHumans; } esVisionAbility g_esVisionAbility[MT_MAXTYPES + 1]; enum struct esVisionSpecial { - float g_flCloseAreasOnly; - float g_flOpenAreasOnly; float g_flVisionChance; + float g_flVisionDeathChance; + float g_flVisionDeathRange; + float g_flVisionDuration; + float g_flVisionInterval; float g_flVisionRange; float g_flVisionRangeChance; + float g_flCloseAreasOnly; + float g_flOpenAreasOnly; - int g_iComboAbility; - int g_iHumanAbility; - int g_iHumanAmmo; - int g_iHumanCooldown; - int g_iHumanRangeCooldown; - int g_iRequiresHumans; int g_iVisionAbility; int g_iVisionCooldown; - int g_iVisionDuration; + int g_iVisionDeath; int g_iVisionEffect; int g_iVisionFOV; int g_iVisionHit; int g_iVisionHitMode; + int g_iVisionIntensity; int g_iVisionMessage; + int g_iVisionMode; int g_iVisionRangeCooldown; int g_iVisionSight; + int g_iVisionStagger; + int g_iVisionType; + int g_iComboAbility; + int g_iHumanAbility; + int g_iHumanAmmo; + int g_iHumanCooldown; + int g_iHumanRangeCooldown; + int g_iRequiresHumans; } esVisionSpecial g_esVisionSpecial[MT_MAXTYPES + 1]; enum struct esVisionCache { - float g_flCloseAreasOnly; - float g_flOpenAreasOnly; float g_flVisionChance; + float g_flVisionDeathChance; + float g_flVisionDeathRange; + float g_flVisionDuration; + float g_flVisionInterval; float g_flVisionRange; float g_flVisionRangeChance; + float g_flCloseAreasOnly; + float g_flOpenAreasOnly; - int g_iComboAbility; - int g_iHumanAbility; - int g_iHumanAmmo; - int g_iHumanCooldown; - int g_iHumanRangeCooldown; - int g_iRequiresHumans; int g_iVisionAbility; int g_iVisionCooldown; - int g_iVisionDuration; + int g_iVisionDeath; int g_iVisionEffect; int g_iVisionFOV; int g_iVisionHit; int g_iVisionHitMode; + int g_iVisionIntensity; int g_iVisionMessage; + int g_iVisionMode; int g_iVisionRangeCooldown; int g_iVisionSight; + int g_iVisionStagger; + int g_iVisionType; + int g_iComboAbility; + int g_iHumanAbility; + int g_iHumanAmmo; + int g_iHumanCooldown; + int g_iHumanRangeCooldown; + int g_iRequiresHumans; } esVisionCache g_esVisionCache[MAXPLAYERS + 1]; -#if !defined MT_ABILITIES_MAIN2 +int g_iBashedParticle = -1; + +UserMsg g_umVisionFade; + +#if defined MT_ABILITIES_MAIN2 +void vVisionPluginStart() +#else public void OnPluginStart() +#endif { + g_umVisionFade = GetUserMessageId("Fade"); +#if !defined MT_ABILITIES_MAIN2 LoadTranslations("common.phrases"); LoadTranslations("mutant_tanks.phrases"); LoadTranslations("mutant_tanks_names.phrases"); @@ -232,8 +323,8 @@ public void OnPluginStart() g_bLateLoad = false; } -} #endif +} #if defined MT_ABILITIES_MAIN2 void vVisionMapStart() @@ -241,6 +332,27 @@ void vVisionMapStart() public void OnMapStart() #endif { + g_iBashedParticle = iPrecacheParticle(PARTICLE_BASHED); + + switch (g_bSecondGame) + { + case true: + { + for (int iPos = 0; iPos < (sizeof g_sParticles); iPos++) + { + iPrecacheParticle(g_sParticles[iPos]); + } + + PrecacheSound(SOUND_GROAN2, true); + PrecacheSound(SOUND_SMASH2, true); + } + case false: + { + PrecacheSound(SOUND_GROAN1, true); + PrecacheSound(SOUND_SMASH1, true); + } + } + vVisionReset(); } @@ -335,7 +447,7 @@ int iVisionMenuHandler(Menu menu, MenuAction action, int param1, int param2) case 2: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtons2"); case 3: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityCooldown", ((g_esVisionCache[param1].g_iHumanAbility == 1) ? g_esVisionCache[param1].g_iHumanCooldown : g_esVisionCache[param1].g_iVisionCooldown)); case 4: MT_PrintToChat(param1, "%s %t", MT_TAG3, "VisionDetails"); - case 5: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityDuration2", g_esVisionCache[param1].g_iVisionDuration); + case 5: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityDuration", g_esVisionCache[param1].g_flVisionDuration); case 6: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esVisionCache[param1].g_iHumanAbility == 0) ? "AbilityHumanSupport1" : "AbilityHumanSupport2"); case 7: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityRangeCooldown", ((g_esVisionCache[param1].g_iHumanAbility == 1) ? g_esVisionCache[param1].g_iHumanRangeCooldown : g_esVisionCache[param1].g_iVisionRangeCooldown)); } @@ -421,7 +533,7 @@ Action OnVisionTakeDamage(int victim, int &attacker, int &inflictor, float &dama GetEntityClassname(inflictor, sClassname, sizeof sClassname); } - if (MT_IsTankSupported(attacker) && MT_IsCustomTankSupported(attacker) && (g_esVisionCache[attacker].g_iVisionHitMode == 0 || g_esVisionCache[attacker].g_iVisionHitMode == 1) && bIsHumanSurvivor(victim) && g_esVisionCache[attacker].g_iComboAbility == 0) + if (MT_IsTankSupported(attacker) && MT_IsCustomTankSupported(attacker) && (g_esVisionCache[attacker].g_iVisionHitMode == 0 || g_esVisionCache[attacker].g_iVisionHitMode == 1) && bIsSurvivor(victim) && g_esVisionCache[attacker].g_iComboAbility == 0) { if ((!MT_HasAdminAccess(attacker) && !bHasAdminAccess(attacker, g_esVisionAbility[g_esVisionPlayer[attacker].g_iTankTypeRecorded].g_iAccessFlags, g_esVisionPlayer[attacker].g_iAccessFlags)) || MT_IsAdminImmune(victim, attacker) || bIsAdminImmune(victim, g_esVisionPlayer[attacker].g_iTankType, g_esVisionAbility[g_esVisionPlayer[attacker].g_iTankTypeRecorded].g_iImmunityFlags, g_esVisionPlayer[victim].g_iImmunityFlags)) { @@ -434,7 +546,7 @@ Action OnVisionTakeDamage(int victim, int &attacker, int &inflictor, float &dama vVisionHit(victim, attacker, GetRandomFloat(0.1, 100.0), g_esVisionCache[attacker].g_flVisionChance, g_esVisionCache[attacker].g_iVisionHit, MT_MESSAGE_MELEE, MT_ATTACK_CLAW); } } - else if (MT_IsTankSupported(victim) && MT_IsCustomTankSupported(victim) && (g_esVisionCache[victim].g_iVisionHitMode == 0 || g_esVisionCache[victim].g_iVisionHitMode == 2) && bIsHumanSurvivor(attacker) && g_esVisionCache[victim].g_iComboAbility == 0) + else if (MT_IsTankSupported(victim) && MT_IsCustomTankSupported(victim) && (g_esVisionCache[victim].g_iVisionHitMode == 0 || g_esVisionCache[victim].g_iVisionHitMode == 2) && bIsSurvivor(attacker) && g_esVisionCache[victim].g_iComboAbility == 0) { if ((!MT_HasAdminAccess(victim) && !bHasAdminAccess(victim, g_esVisionAbility[g_esVisionPlayer[victim].g_iTankTypeRecorded].g_iAccessFlags, g_esVisionPlayer[victim].g_iAccessFlags)) || MT_IsAdminImmune(attacker, victim) || bIsAdminImmune(attacker, g_esVisionPlayer[victim].g_iTankType, g_esVisionAbility[g_esVisionPlayer[victim].g_iTankTypeRecorded].g_iImmunityFlags, g_esVisionPlayer[attacker].g_iImmunityFlags)) { @@ -552,6 +664,8 @@ public void MT_OnCombineAbilities(int tank, int type, const float random, const } } } + case MT_COMBO_POSTSPAWN: vVisionRange(tank, 0, 1, random, iPos); + case MT_COMBO_UPONDEATH: vVisionRange(tank, 0, 0, random, iPos); } break; @@ -587,14 +701,22 @@ public void MT_OnConfigsLoad(int mode) g_esVisionAbility[iIndex].g_iVisionMessage = 0; g_esVisionAbility[iIndex].g_flVisionChance = 33.3; g_esVisionAbility[iIndex].g_iVisionCooldown = 0; - g_esVisionAbility[iIndex].g_iVisionDuration = 5; + g_esVisionAbility[iIndex].g_iVisionDeath = 0; + g_esVisionAbility[iIndex].g_flVisionDeathChance = 33.3; + g_esVisionAbility[iIndex].g_flVisionDeathRange = 200.0; + g_esVisionAbility[iIndex].g_flVisionDuration = 5.0; g_esVisionAbility[iIndex].g_iVisionFOV = 160; g_esVisionAbility[iIndex].g_iVisionHit = 0; g_esVisionAbility[iIndex].g_iVisionHitMode = 0; + g_esVisionAbility[iIndex].g_iVisionIntensity = 255; + g_esVisionAbility[iIndex].g_flVisionInterval = 1.0; + g_esVisionAbility[iIndex].g_iVisionMode = 0; g_esVisionAbility[iIndex].g_flVisionRange = 150.0; g_esVisionAbility[iIndex].g_flVisionRangeChance = 15.0; g_esVisionAbility[iIndex].g_iVisionRangeCooldown = 0; g_esVisionAbility[iIndex].g_iVisionSight = 0; + g_esVisionAbility[iIndex].g_iVisionStagger = 3; + g_esVisionAbility[iIndex].g_iVisionType = 0; g_esVisionSpecial[iIndex].g_flCloseAreasOnly = -1.0; g_esVisionSpecial[iIndex].g_iComboAbility = -1; @@ -609,14 +731,22 @@ public void MT_OnConfigsLoad(int mode) g_esVisionSpecial[iIndex].g_iVisionMessage = -1; g_esVisionSpecial[iIndex].g_flVisionChance = -1.0; g_esVisionSpecial[iIndex].g_iVisionCooldown = -1; - g_esVisionSpecial[iIndex].g_iVisionDuration = -1; + g_esVisionSpecial[iIndex].g_iVisionDeath = -1; + g_esVisionSpecial[iIndex].g_flVisionDeathChance = -1.0; + g_esVisionSpecial[iIndex].g_flVisionDeathRange = -1.0; + g_esVisionSpecial[iIndex].g_flVisionDuration = -1.0; g_esVisionSpecial[iIndex].g_iVisionFOV = -1; g_esVisionSpecial[iIndex].g_iVisionHit = -1; g_esVisionSpecial[iIndex].g_iVisionHitMode = -1; + g_esVisionSpecial[iIndex].g_iVisionIntensity = -1; + g_esVisionSpecial[iIndex].g_flVisionInterval = -1.0; + g_esVisionSpecial[iIndex].g_iVisionMode = -1; g_esVisionSpecial[iIndex].g_flVisionRange = -1.0; g_esVisionSpecial[iIndex].g_flVisionRangeChance = -1.0; g_esVisionSpecial[iIndex].g_iVisionRangeCooldown = -1; g_esVisionSpecial[iIndex].g_iVisionSight = -1; + g_esVisionSpecial[iIndex].g_iVisionStagger = -1; + g_esVisionSpecial[iIndex].g_iVisionType = -1; } } case 3: @@ -638,14 +768,22 @@ public void MT_OnConfigsLoad(int mode) g_esVisionPlayer[iPlayer].g_iVisionMessage = -1; g_esVisionPlayer[iPlayer].g_flVisionChance = -1.0; g_esVisionPlayer[iPlayer].g_iVisionCooldown = -1; - g_esVisionPlayer[iPlayer].g_iVisionDuration = -1; + g_esVisionPlayer[iPlayer].g_iVisionDeath = -1; + g_esVisionPlayer[iPlayer].g_flVisionDeathChance = -1.0; + g_esVisionPlayer[iPlayer].g_flVisionDeathRange = -1.0; + g_esVisionPlayer[iPlayer].g_flVisionDuration = -1.0; g_esVisionPlayer[iPlayer].g_iVisionFOV = -1; g_esVisionPlayer[iPlayer].g_iVisionHit = -1; g_esVisionPlayer[iPlayer].g_iVisionHitMode = -1; + g_esVisionPlayer[iPlayer].g_iVisionIntensity = -1; + g_esVisionPlayer[iPlayer].g_flVisionInterval = -1.0; + g_esVisionPlayer[iPlayer].g_iVisionMode = -1; g_esVisionPlayer[iPlayer].g_flVisionRange = -1.0; g_esVisionPlayer[iPlayer].g_flVisionRangeChance = -1.0; g_esVisionPlayer[iPlayer].g_iVisionRangeCooldown = -1; g_esVisionPlayer[iPlayer].g_iVisionSight = -1; + g_esVisionPlayer[iPlayer].g_iVisionStagger = -1; + g_esVisionPlayer[iPlayer].g_iVisionType = -1; g_esVisionTeammate[iPlayer].g_flCloseAreasOnly = -1.0; g_esVisionTeammate[iPlayer].g_iComboAbility = -1; @@ -660,14 +798,22 @@ public void MT_OnConfigsLoad(int mode) g_esVisionTeammate[iPlayer].g_iVisionMessage = -1; g_esVisionTeammate[iPlayer].g_flVisionChance = -1.0; g_esVisionTeammate[iPlayer].g_iVisionCooldown = -1; - g_esVisionTeammate[iPlayer].g_iVisionDuration = -1; + g_esVisionTeammate[iPlayer].g_iVisionDeath = -1; + g_esVisionTeammate[iPlayer].g_flVisionDeathChance = -1.0; + g_esVisionTeammate[iPlayer].g_flVisionDeathRange = -1.0; + g_esVisionTeammate[iPlayer].g_flVisionDuration = -1.0; g_esVisionTeammate[iPlayer].g_iVisionFOV = -1; g_esVisionTeammate[iPlayer].g_iVisionHit = -1; g_esVisionTeammate[iPlayer].g_iVisionHitMode = -1; + g_esVisionTeammate[iPlayer].g_iVisionIntensity = -1; + g_esVisionTeammate[iPlayer].g_flVisionInterval = -1.0; + g_esVisionTeammate[iPlayer].g_iVisionMode = -1; g_esVisionTeammate[iPlayer].g_flVisionRange = -1.0; g_esVisionTeammate[iPlayer].g_flVisionRangeChance = -1.0; g_esVisionTeammate[iPlayer].g_iVisionRangeCooldown = -1; g_esVisionTeammate[iPlayer].g_iVisionSight = -1; + g_esVisionTeammate[iPlayer].g_iVisionStagger = -1; + g_esVisionTeammate[iPlayer].g_iVisionType = -1; } } } @@ -697,13 +843,21 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esVisionTeammate[admin].g_iVisionSight = iGetKeyValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "AbilitySight", "Ability Sight", "Ability_Sight", "sight", g_esVisionTeammate[admin].g_iVisionSight, value, -1, 5); g_esVisionTeammate[admin].g_flVisionChance = flGetKeyValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "VisionChance", "Vision Chance", "Vision_Chance", "chance", g_esVisionTeammate[admin].g_flVisionChance, value, -1.0, 100.0); g_esVisionTeammate[admin].g_iVisionCooldown = iGetKeyValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "VisionCooldown", "Vision Cooldown", "Vision_Cooldown", "cooldown", g_esVisionTeammate[admin].g_iVisionCooldown, value, -1, 99999); - g_esVisionTeammate[admin].g_iVisionDuration = iGetKeyValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "VisionDuration", "Vision Duration", "Vision_Duration", "duration", g_esVisionTeammate[admin].g_iVisionDuration, value, -1, 99999); + g_esVisionTeammate[admin].g_iVisionDeath = iGetKeyValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "VisionDeath", "Vision Death", "Vision_Death", "death", g_esVisionTeammate[admin].g_iVisionDeath, value, -1, 3); + g_esVisionTeammate[admin].g_flVisionDeathChance = flGetKeyValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "VisionDeathChance", "Vision Death Chance", "Vision_Death_Chance", "deathchance", g_esVisionTeammate[admin].g_flVisionDeathChance, value, -1.0, 100.0); + g_esVisionTeammate[admin].g_flVisionDeathRange = flGetKeyValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "VisionDeathRange", "Vision Death Range", "Vision_Death_Range", "deathrange", g_esVisionTeammate[admin].g_flVisionDeathRange, value, -1.0, 99999.0); + g_esVisionTeammate[admin].g_flVisionDuration = flGetKeyValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "VisionDuration", "Vision Duration", "Vision_Duration", "duration", g_esVisionTeammate[admin].g_flVisionDuration, value, -1.0, 99999.0); g_esVisionTeammate[admin].g_iVisionFOV = iGetKeyValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "VisionFOV", "Vision FOV", "Vision_FOV", "fov", g_esVisionTeammate[admin].g_iVisionFOV, value, -1, 160); g_esVisionTeammate[admin].g_iVisionHit = iGetKeyValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "VisionHit", "Vision Hit", "Vision_Hit", "hit", g_esVisionTeammate[admin].g_iVisionHit, value, -1, 1); g_esVisionTeammate[admin].g_iVisionHitMode = iGetKeyValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "VisionHitMode", "Vision Hit Mode", "Vision_Hit_Mode", "hitmode", g_esVisionTeammate[admin].g_iVisionHitMode, value, -1, 2); + g_esVisionTeammate[admin].g_iVisionIntensity = iGetKeyValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "VisionIntensity", "Vision Intensity", "Vision_Intensity", "intensity", g_esVisionTeammate[admin].g_iVisionIntensity, value, -1, 255); + g_esVisionTeammate[admin].g_flVisionInterval = flGetKeyValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "VisionInterval", "Vision Interval", "Vision_Interval", "interval", g_esVisionTeammate[admin].g_flVisionInterval, value, -1.0, 99999.0); + g_esVisionTeammate[admin].g_iVisionMode = iGetKeyValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "VisionMode", "Vision Mode", "Vision_Mode", "mode", g_esVisionTeammate[admin].g_iVisionMode, value, -1, 31); g_esVisionTeammate[admin].g_flVisionRange = flGetKeyValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "VisionRange", "Vision Range", "Vision_Range", "range", g_esVisionTeammate[admin].g_flVisionRange, value, -1.0, 99999.0); g_esVisionTeammate[admin].g_flVisionRangeChance = flGetKeyValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "VisionRangeChance", "Vision Range Chance", "Vision_Range_Chance", "rangechance", g_esVisionTeammate[admin].g_flVisionRangeChance, value, -1.0, 100.0); g_esVisionTeammate[admin].g_iVisionRangeCooldown = iGetKeyValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "VisionRangeCooldown", "Vision Range Cooldown", "Vision_Range_Cooldown", "rangecooldown", g_esVisionTeammate[admin].g_iVisionRangeCooldown, value, -1, 99999); + g_esVisionTeammate[admin].g_iVisionStagger = iGetKeyValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "VisionStagger", "Vision Stagger", "Vision_Stagger", "stagger", g_esVisionTeammate[admin].g_iVisionStagger, value, -1, 3); + g_esVisionTeammate[admin].g_iVisionType = iGetKeyValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "VisionType", "Vision Type", "Vision_Type", "type", g_esVisionTeammate[admin].g_iVisionType, value, -1, sizeof g_sParticles); } else { @@ -721,13 +875,21 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esVisionPlayer[admin].g_iVisionSight = iGetKeyValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "AbilitySight", "Ability Sight", "Ability_Sight", "sight", g_esVisionPlayer[admin].g_iVisionSight, value, -1, 5); g_esVisionPlayer[admin].g_flVisionChance = flGetKeyValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "VisionChance", "Vision Chance", "Vision_Chance", "chance", g_esVisionPlayer[admin].g_flVisionChance, value, -1.0, 100.0); g_esVisionPlayer[admin].g_iVisionCooldown = iGetKeyValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "VisionCooldown", "Vision Cooldown", "Vision_Cooldown", "cooldown", g_esVisionPlayer[admin].g_iVisionCooldown, value, -1, 99999); - g_esVisionPlayer[admin].g_iVisionDuration = iGetKeyValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "VisionDuration", "Vision Duration", "Vision_Duration", "duration", g_esVisionPlayer[admin].g_iVisionDuration, value, -1, 99999); + g_esVisionPlayer[admin].g_iVisionDeath = iGetKeyValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "VisionDeath", "Vision Death", "Vision_Death", "death", g_esVisionPlayer[admin].g_iVisionDeath, value, -1, 3); + g_esVisionPlayer[admin].g_flVisionDeathChance = flGetKeyValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "VisionDeathChance", "Vision Death Chance", "Vision_Death_Chance", "deathchance", g_esVisionPlayer[admin].g_flVisionDeathChance, value, -1.0, 100.0); + g_esVisionPlayer[admin].g_flVisionDeathRange = flGetKeyValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "VisionDeathRange", "Vision Death Range", "Vision_Death_Range", "deathrange", g_esVisionPlayer[admin].g_flVisionDeathRange, value, -1.0, 99999.0); + g_esVisionPlayer[admin].g_flVisionDuration = flGetKeyValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "VisionDuration", "Vision Duration", "Vision_Duration", "duration", g_esVisionPlayer[admin].g_flVisionDuration, value, -1.0, 99999.0); g_esVisionPlayer[admin].g_iVisionFOV = iGetKeyValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "VisionFOV", "Vision FOV", "Vision_FOV", "fov", g_esVisionPlayer[admin].g_iVisionFOV, value, -1, 160); g_esVisionPlayer[admin].g_iVisionHit = iGetKeyValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "VisionHit", "Vision Hit", "Vision_Hit", "hit", g_esVisionPlayer[admin].g_iVisionHit, value, -1, 1); g_esVisionPlayer[admin].g_iVisionHitMode = iGetKeyValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "VisionHitMode", "Vision Hit Mode", "Vision_Hit_Mode", "hitmode", g_esVisionPlayer[admin].g_iVisionHitMode, value, -1, 2); + g_esVisionPlayer[admin].g_iVisionIntensity = iGetKeyValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "VisionIntensity", "Vision Intensity", "Vision_Intensity", "intensity", g_esVisionPlayer[admin].g_iVisionIntensity, value, -1, 255); + g_esVisionPlayer[admin].g_flVisionInterval = flGetKeyValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "VisionInterval", "Vision Interval", "Vision_Interval", "interval", g_esVisionPlayer[admin].g_flVisionInterval, value, -1.0, 99999.0); + g_esVisionPlayer[admin].g_iVisionMode = iGetKeyValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "VisionMode", "Vision Mode", "Vision_Mode", "mode", g_esVisionPlayer[admin].g_iVisionMode, value, -1, 31); g_esVisionPlayer[admin].g_flVisionRange = flGetKeyValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "VisionRange", "Vision Range", "Vision_Range", "range", g_esVisionPlayer[admin].g_flVisionRange, value, -1.0, 99999.0); g_esVisionPlayer[admin].g_flVisionRangeChance = flGetKeyValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "VisionRangeChance", "Vision Range Chance", "Vision_Range_Chance", "rangechance", g_esVisionPlayer[admin].g_flVisionRangeChance, value, -1.0, 100.0); g_esVisionPlayer[admin].g_iVisionRangeCooldown = iGetKeyValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "VisionRangeCooldown", "Vision Range Cooldown", "Vision_Range_Cooldown", "rangecooldown", g_esVisionPlayer[admin].g_iVisionRangeCooldown, value, -1, 99999); + g_esVisionPlayer[admin].g_iVisionStagger = iGetKeyValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "VisionStagger", "Vision Stagger", "Vision_Stagger", "stagger", g_esVisionPlayer[admin].g_iVisionStagger, value, -1, 3); + g_esVisionPlayer[admin].g_iVisionType = iGetKeyValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "VisionType", "Vision Type", "Vision_Type", "type", g_esVisionPlayer[admin].g_iVisionType, value, -1, sizeof g_sParticles); g_esVisionPlayer[admin].g_iAccessFlags = iGetAdminFlagsValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "AccessFlags", "Access Flags", "Access_Flags", "access", value); g_esVisionPlayer[admin].g_iImmunityFlags = iGetAdminFlagsValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "ImmunityFlags", "Immunity Flags", "Immunity_Flags", "immunity", value); } @@ -737,7 +899,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const { if (special && specsection[0] != '\0') { - g_esVisionSpecial[type].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esVisionSpecial[type].g_flCloseAreasOnly, value, -1.0, 99999.0); + g_esVisionSpecial[type].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "openareas", g_esVisionSpecial[type].g_flCloseAreasOnly, value, -1.0, 99999.0); g_esVisionSpecial[type].g_iComboAbility = iGetKeyValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "ComboAbility", "Combo Ability", "Combo_Ability", "combo", g_esVisionSpecial[type].g_iComboAbility, value, -1, 1); g_esVisionSpecial[type].g_iHumanAbility = iGetKeyValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esVisionSpecial[type].g_iHumanAbility, value, -1, 2); g_esVisionSpecial[type].g_iHumanAmmo = iGetKeyValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esVisionSpecial[type].g_iHumanAmmo, value, -1, 99999); @@ -751,17 +913,25 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esVisionSpecial[type].g_iVisionSight = iGetKeyValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "AbilitySight", "Ability Sight", "Ability_Sight", "sight", g_esVisionSpecial[type].g_iVisionSight, value, -1, 5); g_esVisionSpecial[type].g_flVisionChance = flGetKeyValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "VisionChance", "Vision Chance", "Vision_Chance", "chance", g_esVisionSpecial[type].g_flVisionChance, value, -1.0, 100.0); g_esVisionSpecial[type].g_iVisionCooldown = iGetKeyValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "VisionCooldown", "Vision Cooldown", "Vision_Cooldown", "cooldown", g_esVisionSpecial[type].g_iVisionCooldown, value, -1, 99999); - g_esVisionSpecial[type].g_iVisionDuration = iGetKeyValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "VisionDuration", "Vision Duration", "Vision_Duration", "duration", g_esVisionSpecial[type].g_iVisionDuration, value, -1, 99999); + g_esVisionSpecial[type].g_iVisionDeath = iGetKeyValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "VisionDeath", "Vision Death", "Vision_Death", "death", g_esVisionSpecial[type].g_iVisionDeath, value, -1, 3); + g_esVisionSpecial[type].g_flVisionDeathChance = flGetKeyValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "VisionDeathChance", "Vision Death Chance", "Vision_Death_Chance", "deathchance", g_esVisionSpecial[type].g_flVisionDeathChance, value, -1.0, 100.0); + g_esVisionSpecial[type].g_flVisionDeathRange = flGetKeyValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "VisionDeathRange", "Vision Death Range", "Vision_Death_Range", "deathrange", g_esVisionSpecial[type].g_flVisionDeathRange, value, -1.0, 99999.0); + g_esVisionSpecial[type].g_flVisionDuration = flGetKeyValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "VisionDuration", "Vision Duration", "Vision_Duration", "duration", g_esVisionSpecial[type].g_flVisionDuration, value, -1.0, 99999.0); g_esVisionSpecial[type].g_iVisionFOV = iGetKeyValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "VisionFOV", "Vision FOV", "Vision_FOV", "fov", g_esVisionSpecial[type].g_iVisionFOV, value, -1, 160); g_esVisionSpecial[type].g_iVisionHit = iGetKeyValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "VisionHit", "Vision Hit", "Vision_Hit", "hit", g_esVisionSpecial[type].g_iVisionHit, value, -1, 1); g_esVisionSpecial[type].g_iVisionHitMode = iGetKeyValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "VisionHitMode", "Vision Hit Mode", "Vision_Hit_Mode", "hitmode", g_esVisionSpecial[type].g_iVisionHitMode, value, -1, 2); + g_esVisionSpecial[type].g_iVisionIntensity = iGetKeyValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "VisionIntensity", "Vision Intensity", "Vision_Intensity", "intensity", g_esVisionSpecial[type].g_iVisionIntensity, value, -1, 255); + g_esVisionSpecial[type].g_flVisionInterval = flGetKeyValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "VisionInterval", "Vision Interval", "Vision_Interval", "interval", g_esVisionSpecial[type].g_flVisionInterval, value, -1.0, 99999.0); + g_esVisionSpecial[type].g_iVisionMode = iGetKeyValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "VisionMode", "Vision Mode", "Vision_Mode", "mode", g_esVisionSpecial[type].g_iVisionMode, value, -1, 31); g_esVisionSpecial[type].g_flVisionRange = flGetKeyValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "VisionRange", "Vision Range", "Vision_Range", "range", g_esVisionSpecial[type].g_flVisionRange, value, -1.0, 99999.0); g_esVisionSpecial[type].g_flVisionRangeChance = flGetKeyValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "VisionRangeChance", "Vision Range Chance", "Vision_Range_Chance", "rangechance", g_esVisionSpecial[type].g_flVisionRangeChance, value, -1.0, 100.0); g_esVisionSpecial[type].g_iVisionRangeCooldown = iGetKeyValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "VisionRangeCooldown", "Vision Range Cooldown", "Vision_Range_Cooldown", "rangecooldown", g_esVisionSpecial[type].g_iVisionRangeCooldown, value, -1, 99999); + g_esVisionSpecial[type].g_iVisionStagger = iGetKeyValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "VisionStagger", "Vision Stagger", "Vision_Stagger", "stagger", g_esVisionSpecial[type].g_iVisionStagger, value, -1, 3); + g_esVisionSpecial[type].g_iVisionType = iGetKeyValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "VisionType", "Vision Type", "Vision_Type", "type", g_esVisionSpecial[type].g_iVisionType, value, -1, sizeof g_sParticles); } else { - g_esVisionAbility[type].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esVisionAbility[type].g_flCloseAreasOnly, value, -1.0, 99999.0); + g_esVisionAbility[type].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "openareas", g_esVisionAbility[type].g_flCloseAreasOnly, value, -1.0, 99999.0); g_esVisionAbility[type].g_iComboAbility = iGetKeyValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "ComboAbility", "Combo Ability", "Combo_Ability", "combo", g_esVisionAbility[type].g_iComboAbility, value, -1, 1); g_esVisionAbility[type].g_iHumanAbility = iGetKeyValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esVisionAbility[type].g_iHumanAbility, value, -1, 2); g_esVisionAbility[type].g_iHumanAmmo = iGetKeyValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esVisionAbility[type].g_iHumanAmmo, value, -1, 99999); @@ -775,13 +945,21 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esVisionAbility[type].g_iVisionSight = iGetKeyValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "AbilitySight", "Ability Sight", "Ability_Sight", "sight", g_esVisionAbility[type].g_iVisionSight, value, -1, 5); g_esVisionAbility[type].g_flVisionChance = flGetKeyValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "VisionChance", "Vision Chance", "Vision_Chance", "chance", g_esVisionAbility[type].g_flVisionChance, value, -1.0, 100.0); g_esVisionAbility[type].g_iVisionCooldown = iGetKeyValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "VisionCooldown", "Vision Cooldown", "Vision_Cooldown", "cooldown", g_esVisionAbility[type].g_iVisionCooldown, value, -1, 99999); - g_esVisionAbility[type].g_iVisionDuration = iGetKeyValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "VisionDuration", "Vision Duration", "Vision_Duration", "duration", g_esVisionAbility[type].g_iVisionDuration, value, -1, 99999); + g_esVisionAbility[type].g_iVisionDeath = iGetKeyValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "VisionDeath", "Vision Death", "Vision_Death", "death", g_esVisionAbility[type].g_iVisionDeath, value, -1, 3); + g_esVisionAbility[type].g_flVisionDeathChance = flGetKeyValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "VisionDeathChance", "Vision Death Chance", "Vision_Death_Chance", "deathchance", g_esVisionAbility[type].g_flVisionDeathChance, value, -1.0, 100.0); + g_esVisionAbility[type].g_flVisionDeathRange = flGetKeyValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "VisionDeathRange", "Vision Death Range", "Vision_Death_Range", "deathrange", g_esVisionAbility[type].g_flVisionDeathRange, value, -1.0, 99999.0); + g_esVisionAbility[type].g_flVisionDuration = flGetKeyValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "VisionDuration", "Vision Duration", "Vision_Duration", "duration", g_esVisionAbility[type].g_flVisionDuration, value, -1.0, 99999.0); g_esVisionAbility[type].g_iVisionFOV = iGetKeyValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "VisionFOV", "Vision FOV", "Vision_FOV", "fov", g_esVisionAbility[type].g_iVisionFOV, value, -1, 160); g_esVisionAbility[type].g_iVisionHit = iGetKeyValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "VisionHit", "Vision Hit", "Vision_Hit", "hit", g_esVisionAbility[type].g_iVisionHit, value, -1, 1); g_esVisionAbility[type].g_iVisionHitMode = iGetKeyValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "VisionHitMode", "Vision Hit Mode", "Vision_Hit_Mode", "hitmode", g_esVisionAbility[type].g_iVisionHitMode, value, -1, 2); + g_esVisionAbility[type].g_iVisionIntensity = iGetKeyValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "VisionIntensity", "Vision Intensity", "Vision_Intensity", "intensity", g_esVisionAbility[type].g_iVisionIntensity, value, -1, 255); + g_esVisionAbility[type].g_flVisionInterval = flGetKeyValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "VisionInterval", "Vision Interval", "Vision_Interval", "interval", g_esVisionAbility[type].g_flVisionInterval, value, -1.0, 99999.0); + g_esVisionAbility[type].g_iVisionMode = iGetKeyValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "VisionMode", "Vision Mode", "Vision_Mode", "mode", g_esVisionAbility[type].g_iVisionMode, value, -1, 31); g_esVisionAbility[type].g_flVisionRange = flGetKeyValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "VisionRange", "Vision Range", "Vision_Range", "range", g_esVisionAbility[type].g_flVisionRange, value, -1.0, 99999.0); g_esVisionAbility[type].g_flVisionRangeChance = flGetKeyValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "VisionRangeChance", "Vision Range Chance", "Vision_Range_Chance", "rangechance", g_esVisionAbility[type].g_flVisionRangeChance, value, -1.0, 100.0); g_esVisionAbility[type].g_iVisionRangeCooldown = iGetKeyValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "VisionRangeCooldown", "Vision Range Cooldown", "Vision_Range_Cooldown", "rangecooldown", g_esVisionAbility[type].g_iVisionRangeCooldown, value, -1, 99999); + g_esVisionAbility[type].g_iVisionStagger = iGetKeyValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "VisionStagger", "Vision Stagger", "Vision_Stagger", "stagger", g_esVisionAbility[type].g_iVisionStagger, value, -1, 3); + g_esVisionAbility[type].g_iVisionType = iGetKeyValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "VisionType", "Vision Type", "Vision_Type", "type", g_esVisionAbility[type].g_iVisionType, value, -1, sizeof g_sParticles); g_esVisionAbility[type].g_iAccessFlags = iGetAdminFlagsValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "AccessFlags", "Access Flags", "Access_Flags", "access", value); g_esVisionAbility[type].g_iImmunityFlags = iGetAdminFlagsValue(subsection, MT_VISION_SECTION, MT_VISION_SECTION2, MT_VISION_SECTION3, MT_VISION_SECTION4, key, "ImmunityFlags", "Immunity Flags", "Immunity_Flags", "immunity", value); } @@ -798,54 +976,72 @@ public void MT_OnSettingsCached(int tank, bool apply, int type) g_esVisionPlayer[tank].g_iTankTypeRecorded = apply ? MT_GetRecordedTankType(tank, type) : 0; g_esVisionPlayer[tank].g_iTankType = apply ? type : 0; int iType = g_esVisionPlayer[tank].g_iTankTypeRecorded; - +#if !defined MT_ABILITIES_MAIN2 + g_iGraphicsLevel = MT_GetGraphicsLevel(); +#endif if (bIsSpecialInfected(tank, MT_CHECK_INDEX|MT_CHECK_INGAME)) { - g_esVisionCache[tank].g_flCloseAreasOnly = flGetSubSettingValue(apply, bHuman, g_esVisionTeammate[tank].g_flCloseAreasOnly, g_esVisionPlayer[tank].g_flCloseAreasOnly, g_esVisionSpecial[iType].g_flCloseAreasOnly, g_esVisionAbility[iType].g_flCloseAreasOnly, 1); - g_esVisionCache[tank].g_iComboAbility = iGetSubSettingValue(apply, bHuman, g_esVisionTeammate[tank].g_iComboAbility, g_esVisionPlayer[tank].g_iComboAbility, g_esVisionSpecial[iType].g_iComboAbility, g_esVisionAbility[iType].g_iComboAbility, 1); g_esVisionCache[tank].g_flVisionChance = flGetSubSettingValue(apply, bHuman, g_esVisionTeammate[tank].g_flVisionChance, g_esVisionPlayer[tank].g_flVisionChance, g_esVisionSpecial[iType].g_flVisionChance, g_esVisionAbility[iType].g_flVisionChance, 1); + g_esVisionCache[tank].g_flVisionDeathChance = flGetSubSettingValue(apply, bHuman, g_esVisionTeammate[tank].g_flVisionDeathChance, g_esVisionPlayer[tank].g_flVisionDeathChance, g_esVisionSpecial[iType].g_flVisionDeathChance, g_esVisionAbility[iType].g_flVisionDeathChance, 1); + g_esVisionCache[tank].g_flVisionDeathRange = flGetSubSettingValue(apply, bHuman, g_esVisionTeammate[tank].g_flVisionDeathRange, g_esVisionPlayer[tank].g_flVisionDeathRange, g_esVisionSpecial[iType].g_flVisionDeathRange, g_esVisionAbility[iType].g_flVisionDeathRange, 1); + g_esVisionCache[tank].g_flVisionDuration = flGetSubSettingValue(apply, bHuman, g_esVisionTeammate[tank].g_flVisionDuration, g_esVisionPlayer[tank].g_flVisionDuration, g_esVisionSpecial[iType].g_flVisionDuration, g_esVisionAbility[iType].g_flVisionDuration, 1); + g_esVisionCache[tank].g_flVisionInterval = flGetSubSettingValue(apply, bHuman, g_esVisionTeammate[tank].g_flVisionInterval, g_esVisionPlayer[tank].g_flVisionInterval, g_esVisionSpecial[iType].g_flVisionInterval, g_esVisionAbility[iType].g_flVisionInterval, 1); g_esVisionCache[tank].g_flVisionRange = flGetSubSettingValue(apply, bHuman, g_esVisionTeammate[tank].g_flVisionRange, g_esVisionPlayer[tank].g_flVisionRange, g_esVisionSpecial[iType].g_flVisionRange, g_esVisionAbility[iType].g_flVisionRange, 1); g_esVisionCache[tank].g_flVisionRangeChance = flGetSubSettingValue(apply, bHuman, g_esVisionTeammate[tank].g_flVisionRangeChance, g_esVisionPlayer[tank].g_flVisionRangeChance, g_esVisionSpecial[iType].g_flVisionRangeChance, g_esVisionAbility[iType].g_flVisionRangeChance, 1); - g_esVisionCache[tank].g_iHumanAbility = iGetSubSettingValue(apply, bHuman, g_esVisionTeammate[tank].g_iHumanAbility, g_esVisionPlayer[tank].g_iHumanAbility, g_esVisionSpecial[iType].g_iHumanAbility, g_esVisionAbility[iType].g_iHumanAbility, 1); - g_esVisionCache[tank].g_iHumanAmmo = iGetSubSettingValue(apply, bHuman, g_esVisionTeammate[tank].g_iHumanAmmo, g_esVisionPlayer[tank].g_iHumanAmmo, g_esVisionSpecial[iType].g_iHumanAmmo, g_esVisionAbility[iType].g_iHumanAmmo, 1); - g_esVisionCache[tank].g_iHumanCooldown = iGetSubSettingValue(apply, bHuman, g_esVisionTeammate[tank].g_iHumanCooldown, g_esVisionPlayer[tank].g_iHumanCooldown, g_esVisionSpecial[iType].g_iHumanCooldown, g_esVisionAbility[iType].g_iHumanCooldown, 1); - g_esVisionCache[tank].g_iHumanRangeCooldown = iGetSubSettingValue(apply, bHuman, g_esVisionTeammate[tank].g_iHumanRangeCooldown, g_esVisionPlayer[tank].g_iHumanRangeCooldown, g_esVisionSpecial[iType].g_iHumanRangeCooldown, g_esVisionAbility[iType].g_iHumanRangeCooldown, 1); - g_esVisionCache[tank].g_flOpenAreasOnly = flGetSubSettingValue(apply, bHuman, g_esVisionTeammate[tank].g_flOpenAreasOnly, g_esVisionPlayer[tank].g_flOpenAreasOnly, g_esVisionSpecial[iType].g_flOpenAreasOnly, g_esVisionAbility[iType].g_flOpenAreasOnly, 1); - g_esVisionCache[tank].g_iRequiresHumans = iGetSubSettingValue(apply, bHuman, g_esVisionTeammate[tank].g_iRequiresHumans, g_esVisionPlayer[tank].g_iRequiresHumans, g_esVisionSpecial[iType].g_iRequiresHumans, g_esVisionAbility[iType].g_iRequiresHumans, 1); g_esVisionCache[tank].g_iVisionAbility = iGetSubSettingValue(apply, bHuman, g_esVisionTeammate[tank].g_iVisionAbility, g_esVisionPlayer[tank].g_iVisionAbility, g_esVisionSpecial[iType].g_iVisionAbility, g_esVisionAbility[iType].g_iVisionAbility, 1); - g_esVisionCache[tank].g_iVisionDuration = iGetSubSettingValue(apply, bHuman, g_esVisionTeammate[tank].g_iVisionDuration, g_esVisionPlayer[tank].g_iVisionDuration, g_esVisionSpecial[iType].g_iVisionDuration, g_esVisionAbility[iType].g_iVisionDuration, 1); g_esVisionCache[tank].g_iVisionCooldown = iGetSubSettingValue(apply, bHuman, g_esVisionTeammate[tank].g_iVisionCooldown, g_esVisionPlayer[tank].g_iVisionCooldown, g_esVisionSpecial[iType].g_iVisionCooldown, g_esVisionAbility[iType].g_iVisionCooldown, 1); + g_esVisionCache[tank].g_iVisionDeath = iGetSubSettingValue(apply, bHuman, g_esVisionTeammate[tank].g_iVisionDeath, g_esVisionPlayer[tank].g_iVisionDeath, g_esVisionSpecial[iType].g_iVisionDeath, g_esVisionAbility[iType].g_iVisionDeath, 1); g_esVisionCache[tank].g_iVisionEffect = iGetSubSettingValue(apply, bHuman, g_esVisionTeammate[tank].g_iVisionEffect, g_esVisionPlayer[tank].g_iVisionEffect, g_esVisionSpecial[iType].g_iVisionEffect, g_esVisionAbility[iType].g_iVisionEffect, 1); g_esVisionCache[tank].g_iVisionFOV = iGetSubSettingValue(apply, bHuman, g_esVisionTeammate[tank].g_iVisionFOV, g_esVisionPlayer[tank].g_iVisionFOV, g_esVisionSpecial[iType].g_iVisionFOV, g_esVisionAbility[iType].g_iVisionFOV, 1); g_esVisionCache[tank].g_iVisionHit = iGetSubSettingValue(apply, bHuman, g_esVisionTeammate[tank].g_iVisionHit, g_esVisionPlayer[tank].g_iVisionHit, g_esVisionSpecial[iType].g_iVisionHit, g_esVisionAbility[iType].g_iVisionHit, 1); g_esVisionCache[tank].g_iVisionHitMode = iGetSubSettingValue(apply, bHuman, g_esVisionTeammate[tank].g_iVisionHitMode, g_esVisionPlayer[tank].g_iVisionHitMode, g_esVisionSpecial[iType].g_iVisionHitMode, g_esVisionAbility[iType].g_iVisionHitMode, 1); + g_esVisionCache[tank].g_iVisionIntensity = iGetSubSettingValue(apply, bHuman, g_esVisionTeammate[tank].g_iVisionIntensity, g_esVisionPlayer[tank].g_iVisionIntensity, g_esVisionSpecial[iType].g_iVisionIntensity, g_esVisionAbility[iType].g_iVisionIntensity, 1); g_esVisionCache[tank].g_iVisionMessage = iGetSubSettingValue(apply, bHuman, g_esVisionTeammate[tank].g_iVisionMessage, g_esVisionPlayer[tank].g_iVisionMessage, g_esVisionSpecial[iType].g_iVisionMessage, g_esVisionAbility[iType].g_iVisionMessage, 1); + g_esVisionCache[tank].g_iVisionMode = iGetSubSettingValue(apply, bHuman, g_esVisionTeammate[tank].g_iVisionMode, g_esVisionPlayer[tank].g_iVisionMode, g_esVisionSpecial[iType].g_iVisionMode, g_esVisionAbility[iType].g_iVisionMode, 1); g_esVisionCache[tank].g_iVisionRangeCooldown = iGetSubSettingValue(apply, bHuman, g_esVisionTeammate[tank].g_iVisionRangeCooldown, g_esVisionPlayer[tank].g_iVisionRangeCooldown, g_esVisionSpecial[iType].g_iVisionRangeCooldown, g_esVisionAbility[iType].g_iVisionRangeCooldown, 1); g_esVisionCache[tank].g_iVisionSight = iGetSubSettingValue(apply, bHuman, g_esVisionTeammate[tank].g_iVisionSight, g_esVisionPlayer[tank].g_iVisionSight, g_esVisionSpecial[iType].g_iVisionSight, g_esVisionAbility[iType].g_iVisionSight, 1); + g_esVisionCache[tank].g_iVisionStagger = iGetSubSettingValue(apply, bHuman, g_esVisionTeammate[tank].g_iVisionStagger, g_esVisionPlayer[tank].g_iVisionStagger, g_esVisionSpecial[iType].g_iVisionStagger, g_esVisionAbility[iType].g_iVisionStagger, 1); + g_esVisionCache[tank].g_iVisionType = iGetSubSettingValue(apply, bHuman, g_esVisionTeammate[tank].g_iVisionType, g_esVisionPlayer[tank].g_iVisionType, g_esVisionSpecial[iType].g_iVisionType, g_esVisionAbility[iType].g_iVisionType, 1); + g_esVisionCache[tank].g_flCloseAreasOnly = flGetSubSettingValue(apply, bHuman, g_esVisionTeammate[tank].g_flCloseAreasOnly, g_esVisionPlayer[tank].g_flCloseAreasOnly, g_esVisionSpecial[iType].g_flCloseAreasOnly, g_esVisionAbility[iType].g_flCloseAreasOnly, 1); + g_esVisionCache[tank].g_iComboAbility = iGetSubSettingValue(apply, bHuman, g_esVisionTeammate[tank].g_iComboAbility, g_esVisionPlayer[tank].g_iComboAbility, g_esVisionSpecial[iType].g_iComboAbility, g_esVisionAbility[iType].g_iComboAbility, 1); + g_esVisionCache[tank].g_iHumanAbility = iGetSubSettingValue(apply, bHuman, g_esVisionTeammate[tank].g_iHumanAbility, g_esVisionPlayer[tank].g_iHumanAbility, g_esVisionSpecial[iType].g_iHumanAbility, g_esVisionAbility[iType].g_iHumanAbility, 1); + g_esVisionCache[tank].g_iHumanAmmo = iGetSubSettingValue(apply, bHuman, g_esVisionTeammate[tank].g_iHumanAmmo, g_esVisionPlayer[tank].g_iHumanAmmo, g_esVisionSpecial[iType].g_iHumanAmmo, g_esVisionAbility[iType].g_iHumanAmmo, 1); + g_esVisionCache[tank].g_iHumanCooldown = iGetSubSettingValue(apply, bHuman, g_esVisionTeammate[tank].g_iHumanCooldown, g_esVisionPlayer[tank].g_iHumanCooldown, g_esVisionSpecial[iType].g_iHumanCooldown, g_esVisionAbility[iType].g_iHumanCooldown, 1); + g_esVisionCache[tank].g_iHumanRangeCooldown = iGetSubSettingValue(apply, bHuman, g_esVisionTeammate[tank].g_iHumanRangeCooldown, g_esVisionPlayer[tank].g_iHumanRangeCooldown, g_esVisionSpecial[iType].g_iHumanRangeCooldown, g_esVisionAbility[iType].g_iHumanRangeCooldown, 1); + g_esVisionCache[tank].g_flOpenAreasOnly = flGetSubSettingValue(apply, bHuman, g_esVisionTeammate[tank].g_flOpenAreasOnly, g_esVisionPlayer[tank].g_flOpenAreasOnly, g_esVisionSpecial[iType].g_flOpenAreasOnly, g_esVisionAbility[iType].g_flOpenAreasOnly, 1); + g_esVisionCache[tank].g_iRequiresHumans = iGetSubSettingValue(apply, bHuman, g_esVisionTeammate[tank].g_iRequiresHumans, g_esVisionPlayer[tank].g_iRequiresHumans, g_esVisionSpecial[iType].g_iRequiresHumans, g_esVisionAbility[iType].g_iRequiresHumans, 1); } else { - g_esVisionCache[tank].g_flCloseAreasOnly = flGetSettingValue(apply, bHuman, g_esVisionPlayer[tank].g_flCloseAreasOnly, g_esVisionAbility[iType].g_flCloseAreasOnly, 1); - g_esVisionCache[tank].g_iComboAbility = iGetSettingValue(apply, bHuman, g_esVisionPlayer[tank].g_iComboAbility, g_esVisionAbility[iType].g_iComboAbility, 1); g_esVisionCache[tank].g_flVisionChance = flGetSettingValue(apply, bHuman, g_esVisionPlayer[tank].g_flVisionChance, g_esVisionAbility[iType].g_flVisionChance, 1); + g_esVisionCache[tank].g_flVisionDeathChance = flGetSettingValue(apply, bHuman, g_esVisionPlayer[tank].g_flVisionDeathChance, g_esVisionAbility[iType].g_flVisionDeathChance, 1); + g_esVisionCache[tank].g_flVisionDeathRange = flGetSettingValue(apply, bHuman, g_esVisionPlayer[tank].g_flVisionDeathRange, g_esVisionAbility[iType].g_flVisionDeathRange, 1); + g_esVisionCache[tank].g_flVisionDuration = flGetSettingValue(apply, bHuman, g_esVisionPlayer[tank].g_flVisionDuration, g_esVisionAbility[iType].g_flVisionDuration, 1); + g_esVisionCache[tank].g_flVisionInterval = flGetSettingValue(apply, bHuman, g_esVisionPlayer[tank].g_flVisionInterval, g_esVisionAbility[iType].g_flVisionInterval, 1); g_esVisionCache[tank].g_flVisionRange = flGetSettingValue(apply, bHuman, g_esVisionPlayer[tank].g_flVisionRange, g_esVisionAbility[iType].g_flVisionRange, 1); g_esVisionCache[tank].g_flVisionRangeChance = flGetSettingValue(apply, bHuman, g_esVisionPlayer[tank].g_flVisionRangeChance, g_esVisionAbility[iType].g_flVisionRangeChance, 1); - g_esVisionCache[tank].g_iHumanAbility = iGetSettingValue(apply, bHuman, g_esVisionPlayer[tank].g_iHumanAbility, g_esVisionAbility[iType].g_iHumanAbility, 1); - g_esVisionCache[tank].g_iHumanAmmo = iGetSettingValue(apply, bHuman, g_esVisionPlayer[tank].g_iHumanAmmo, g_esVisionAbility[iType].g_iHumanAmmo, 1); - g_esVisionCache[tank].g_iHumanCooldown = iGetSettingValue(apply, bHuman, g_esVisionPlayer[tank].g_iHumanCooldown, g_esVisionAbility[iType].g_iHumanCooldown, 1); - g_esVisionCache[tank].g_iHumanRangeCooldown = iGetSettingValue(apply, bHuman, g_esVisionPlayer[tank].g_iHumanRangeCooldown, g_esVisionAbility[iType].g_iHumanRangeCooldown, 1); - g_esVisionCache[tank].g_flOpenAreasOnly = flGetSettingValue(apply, bHuman, g_esVisionPlayer[tank].g_flOpenAreasOnly, g_esVisionAbility[iType].g_flOpenAreasOnly, 1); - g_esVisionCache[tank].g_iRequiresHumans = iGetSettingValue(apply, bHuman, g_esVisionPlayer[tank].g_iRequiresHumans, g_esVisionAbility[iType].g_iRequiresHumans, 1); g_esVisionCache[tank].g_iVisionAbility = iGetSettingValue(apply, bHuman, g_esVisionPlayer[tank].g_iVisionAbility, g_esVisionAbility[iType].g_iVisionAbility, 1); - g_esVisionCache[tank].g_iVisionDuration = iGetSettingValue(apply, bHuman, g_esVisionPlayer[tank].g_iVisionDuration, g_esVisionAbility[iType].g_iVisionDuration, 1); g_esVisionCache[tank].g_iVisionCooldown = iGetSettingValue(apply, bHuman, g_esVisionPlayer[tank].g_iVisionCooldown, g_esVisionAbility[iType].g_iVisionCooldown, 1); + g_esVisionCache[tank].g_iVisionDeath = iGetSettingValue(apply, bHuman, g_esVisionPlayer[tank].g_iVisionDeath, g_esVisionAbility[iType].g_iVisionDeath, 1); g_esVisionCache[tank].g_iVisionEffect = iGetSettingValue(apply, bHuman, g_esVisionPlayer[tank].g_iVisionEffect, g_esVisionAbility[iType].g_iVisionEffect, 1); g_esVisionCache[tank].g_iVisionFOV = iGetSettingValue(apply, bHuman, g_esVisionPlayer[tank].g_iVisionFOV, g_esVisionAbility[iType].g_iVisionFOV, 1); g_esVisionCache[tank].g_iVisionHit = iGetSettingValue(apply, bHuman, g_esVisionPlayer[tank].g_iVisionHit, g_esVisionAbility[iType].g_iVisionHit, 1); g_esVisionCache[tank].g_iVisionHitMode = iGetSettingValue(apply, bHuman, g_esVisionPlayer[tank].g_iVisionHitMode, g_esVisionAbility[iType].g_iVisionHitMode, 1); + g_esVisionCache[tank].g_iVisionIntensity = iGetSettingValue(apply, bHuman, g_esVisionPlayer[tank].g_iVisionIntensity, g_esVisionAbility[iType].g_iVisionIntensity, 1); g_esVisionCache[tank].g_iVisionMessage = iGetSettingValue(apply, bHuman, g_esVisionPlayer[tank].g_iVisionMessage, g_esVisionAbility[iType].g_iVisionMessage, 1); + g_esVisionCache[tank].g_iVisionMode = iGetSettingValue(apply, bHuman, g_esVisionPlayer[tank].g_iVisionMode, g_esVisionAbility[iType].g_iVisionMode, 1); g_esVisionCache[tank].g_iVisionRangeCooldown = iGetSettingValue(apply, bHuman, g_esVisionPlayer[tank].g_iVisionRangeCooldown, g_esVisionAbility[iType].g_iVisionRangeCooldown, 1); g_esVisionCache[tank].g_iVisionSight = iGetSettingValue(apply, bHuman, g_esVisionPlayer[tank].g_iVisionSight, g_esVisionAbility[iType].g_iVisionSight, 1); + g_esVisionCache[tank].g_iVisionStagger = iGetSettingValue(apply, bHuman, g_esVisionPlayer[tank].g_iVisionStagger, g_esVisionAbility[iType].g_iVisionStagger, 1); + g_esVisionCache[tank].g_iVisionType = iGetSettingValue(apply, bHuman, g_esVisionPlayer[tank].g_iVisionType, g_esVisionAbility[iType].g_iVisionType, 1); + g_esVisionCache[tank].g_flCloseAreasOnly = flGetSettingValue(apply, bHuman, g_esVisionPlayer[tank].g_flCloseAreasOnly, g_esVisionAbility[iType].g_flCloseAreasOnly, 1); + g_esVisionCache[tank].g_iComboAbility = iGetSettingValue(apply, bHuman, g_esVisionPlayer[tank].g_iComboAbility, g_esVisionAbility[iType].g_iComboAbility, 1); + g_esVisionCache[tank].g_iHumanAbility = iGetSettingValue(apply, bHuman, g_esVisionPlayer[tank].g_iHumanAbility, g_esVisionAbility[iType].g_iHumanAbility, 1); + g_esVisionCache[tank].g_iHumanAmmo = iGetSettingValue(apply, bHuman, g_esVisionPlayer[tank].g_iHumanAmmo, g_esVisionAbility[iType].g_iHumanAmmo, 1); + g_esVisionCache[tank].g_iHumanCooldown = iGetSettingValue(apply, bHuman, g_esVisionPlayer[tank].g_iHumanCooldown, g_esVisionAbility[iType].g_iHumanCooldown, 1); + g_esVisionCache[tank].g_iHumanRangeCooldown = iGetSettingValue(apply, bHuman, g_esVisionPlayer[tank].g_iHumanRangeCooldown, g_esVisionAbility[iType].g_iHumanRangeCooldown, 1); + g_esVisionCache[tank].g_flOpenAreasOnly = flGetSettingValue(apply, bHuman, g_esVisionPlayer[tank].g_flOpenAreasOnly, g_esVisionAbility[iType].g_flOpenAreasOnly, 1); + g_esVisionCache[tank].g_iRequiresHumans = iGetSettingValue(apply, bHuman, g_esVisionPlayer[tank].g_iRequiresHumans, g_esVisionAbility[iType].g_iRequiresHumans, 1); } } @@ -876,12 +1072,16 @@ void vVisionPluginEnd() public void MT_OnPluginEnd() #endif { - for (int iSurvivor = 1; iSurvivor <= MaxClients; iSurvivor++) + for (int iPlayer = 1; iPlayer <= MaxClients; iPlayer++) { - if (bIsHumanSurvivor(iSurvivor, MT_CHECK_INGAME|MT_CHECK_ALIVE) && g_esVisionPlayer[iSurvivor].g_bAffected) + if (bIsInfected(iPlayer, MT_CHECK_INGAME|MT_CHECK_ALIVE)) + { + vRemoveVision(iPlayer); + } + else if (bIsHumanSurvivor(iPlayer, MT_CHECK_INGAME|MT_CHECK_ALIVE) && g_esVisionPlayer[iPlayer].g_bAffected) { - SetEntProp(iSurvivor, Prop_Send, "m_iFOV", 90); - SetEntProp(iSurvivor, Prop_Send, "m_iDefaultFOV", 90); + SetEntProp(iPlayer, Prop_Send, "m_iFOV", 90); + SetEntProp(iPlayer, Prop_Send, "m_iDefaultFOV", 90); } } } @@ -916,12 +1116,18 @@ public void MT_OnEventFired(Event event, const char[] name, bool dontBroadcast) vRemoveVision(iTank); } } - else if (StrEqual(name, "player_death") || StrEqual(name, "player_spawn")) + else if (StrEqual(name, "player_death")) { - int iTankId = event.GetInt("userid"), iTank = GetClientOfUserId(iTankId); - if (MT_IsTankSupported(iTank, MT_CHECK_INDEX|MT_CHECK_INGAME)) + int iPlayerId = event.GetInt("userid"), iPlayer = GetClientOfUserId(iPlayerId); + if (MT_IsTankSupported(iPlayer, MT_CHECK_INDEX|MT_CHECK_INGAME)) { - vRemoveVision(iTank); + vVisionRange(iPlayer, 1, 0, GetRandomFloat(0.1, 100.0)); + vRemoveVision(iPlayer); + } + else if (bIsHumanSurvivor(iPlayer, MT_CHECK_INDEX|MT_CHECK_INGAME)) + { + vVision(iPlayer, 0); + vStopVision(iPlayer); } } else if (StrEqual(name, "player_now_it")) @@ -934,6 +1140,20 @@ public void MT_OnEventFired(Event event, const char[] name, bool dontBroadcast) vVisionHit(iSurvivor, iBoomer, GetRandomFloat(0.1, 100.0), g_esVisionCache[iBoomer].g_flVisionChance, g_esVisionCache[iBoomer].g_iVisionHit, MT_MESSAGE_RANGE, MT_ATTACK_RANGE); } } + else if (StrEqual(name, "player_spawn")) + { + int iPlayerId = event.GetInt("userid"), iPlayer = GetClientOfUserId(iPlayerId); + if (MT_IsTankSupported(iPlayer, MT_CHECK_INDEX|MT_CHECK_INGAME)) + { + vVisionRange(iPlayer, 1, 1, GetRandomFloat(0.1, 100.0)); + vRemoveVision(iPlayer); + } + else if (bIsHumanSurvivor(iPlayer, MT_CHECK_INDEX|MT_CHECK_INGAME)) + { + vVision(iPlayer, 0); + vStopVision(iPlayer); + } + } } #if defined MT_ABILITIES_MAIN2 @@ -993,6 +1213,68 @@ public void MT_OnChangeType(int tank, int oldType, int newType, bool revert) vRemoveVision(tank); } +#if defined MT_ABILITIES_MAIN2 +void vVisionPostTankSpawn(int tank) +#else +public void MT_OnPostTankSpawn(int tank) +#endif +{ + vVisionRange(tank, 1, 1, GetRandomFloat(0.1, 100.0)); +} + +void vVision(int survivor, int intensity) +{ + int iTargets[1], iFlags = (intensity == 0) ? (MT_FADE_IN|MT_FADE_PURGE) : (MT_FADE_OUT|MT_FADE_STAYOUT), iColor[4] = {0, 0, 0, 0}; + iTargets[0] = survivor; + iColor[3] = intensity; + + Handle hMessage = StartMessageEx(g_umVisionFade, iTargets, 1); + if (hMessage != null) + { + BfWrite bfWrite = UserMessageToBfWrite(hMessage); + bfWrite.WriteShort(1536); + bfWrite.WriteShort(1536); + bfWrite.WriteShort(iFlags); + + for (int iPos = 0; iPos < (sizeof iColor); iPos++) + { + bfWrite.WriteByte(iColor[iPos]); + } + + EndMessage(); + } +} + +void vVision2(int survivor, int red = 255, int green = 255, int blue = 255, int alpha = 255) +{ + if (g_iGraphicsLevel > 0) + { + int iTargets[2]; + iTargets[0] = survivor; + + Handle hMessage = StartMessageEx(g_umVisionFade, iTargets, 1); + if (hMessage != null) + { + BfWrite bfWrite = UserMessageToBfWrite(hMessage); + bfWrite.WriteShort(3000); + bfWrite.WriteShort(100); + bfWrite.WriteShort(MT_FADE_IN); + bfWrite.WriteByte(red); + bfWrite.WriteByte(green); + bfWrite.WriteByte(blue); + bfWrite.WriteByte(alpha); + + EndMessage(); + } + } + + if (g_iGraphicsLevel > 2) + { + MT_TE_CreateParticle(.particle = g_iBashedParticle, .all = false); + TE_SendToClient(survivor); + } +} + void vVisionAbility(int tank, float random, int pos = -1) { if (bIsAreaNarrow(tank, g_esVisionCache[tank].g_flOpenAreasOnly) || bIsAreaWide(tank, g_esVisionCache[tank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esVisionPlayer[tank].g_iTankType, tank) || (g_esVisionCache[tank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esVisionCache[tank].g_iRequiresHumans) || (!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esVisionAbility[g_esVisionPlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esVisionPlayer[tank].g_iAccessFlags))) @@ -1012,7 +1294,7 @@ void vVisionAbility(int tank, float random, int pos = -1) int iSurvivorCount = 0; for (int iSurvivor = 1; iSurvivor <= MaxClients; iSurvivor++) { - if (bIsHumanSurvivor(iSurvivor, MT_CHECK_INGAME|MT_CHECK_ALIVE) && !MT_IsAdminImmune(iSurvivor, tank) && !bIsAdminImmune(iSurvivor, g_esVisionPlayer[tank].g_iTankType, g_esVisionAbility[g_esVisionPlayer[tank].g_iTankTypeRecorded].g_iImmunityFlags, g_esVisionPlayer[iSurvivor].g_iImmunityFlags)) + if (bIsSurvivor(iSurvivor, MT_CHECK_INGAME|MT_CHECK_ALIVE) && !MT_IsAdminImmune(iSurvivor, tank) && !bIsAdminImmune(iSurvivor, g_esVisionPlayer[tank].g_iTankType, g_esVisionAbility[g_esVisionPlayer[tank].g_iTankTypeRecorded].g_iImmunityFlags, g_esVisionPlayer[iSurvivor].g_iImmunityFlags)) { GetClientAbsOrigin(iSurvivor, flSurvivorPos); if (GetVectorDistance(flTankPos, flSurvivorPos) <= flRange && bIsVisibleToPlayer(tank, iSurvivor, g_esVisionCache[tank].g_iVisionSight, .range = flRange)) @@ -1051,7 +1333,7 @@ void vVisionHit(int survivor, int tank, float random, float chance, int enabled, return; } - if (enabled == 1 && bIsSurvivor(survivor) && !bIsSurvivorHanging(survivor) && !MT_DoesSurvivorHaveRewardType(survivor, MT_REWARD_GODMODE)) + if (enabled == 1 && bIsSurvivor(survivor)) { if (!bIsInfected(tank, MT_CHECK_FAKECLIENT) || (flags & MT_ATTACK_CLAW) || (flags & MT_ATTACK_MELEE) || (g_esVisionPlayer[tank].g_iAmmoCount < g_esVisionCache[tank].g_iHumanAmmo && g_esVisionCache[tank].g_iHumanAmmo > 0)) { @@ -1094,24 +1376,133 @@ void vVisionHit(int survivor, int tank, float random, float chance, int enabled, } } - DataPack dpVision; - CreateDataTimer(0.1, tTimerVision, dpVision, TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); - dpVision.WriteCell(GetClientUserId(survivor)); - dpVision.WriteCell(GetClientUserId(tank)); - dpVision.WriteCell(g_esVisionPlayer[tank].g_iTankType); - dpVision.WriteCell(messages); - dpVision.WriteCell(enabled); - dpVision.WriteCell(pos); - dpVision.WriteCell(iTime); + bool bHuman = bIsValidClient(survivor, MT_CHECK_FAKECLIENT); + if ((g_esVisionCache[tank].g_iVisionMode & MT_VISION_BLIND) && bHuman) + { + int iSurvivorId = GetClientUserId(survivor), iTankId = GetClientUserId(tank); + DataPack dpVision; + CreateDataTimer(1.0, tTimerVision, dpVision, TIMER_FLAG_NO_MAPCHANGE); + dpVision.WriteCell(iSurvivorId); + dpVision.WriteCell(iTankId); + dpVision.WriteCell(g_esVisionPlayer[tank].g_iTankType); + dpVision.WriteCell(enabled); + + float flDuration = (pos != -1) ? MT_GetCombinationSetting(tank, 5, pos) : g_esVisionCache[tank].g_flVisionDuration; + if (flDuration > 0.0) + { + DataPack dpStopVision; + CreateDataTimer(0.1, tTimerStopVision, dpStopVision, TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); + dpStopVision.WriteCell(iSurvivorId); + dpStopVision.WriteCell(iTankId); + dpStopVision.WriteFloat(GetGameTime()); + dpStopVision.WriteFloat(flDuration + 1.0); + dpStopVision.WriteCell(messages); + } - vScreenEffect(survivor, tank, g_esVisionCache[tank].g_iVisionEffect, flags); + switch (g_bSecondGame) + { + case true: EmitSoundToAll(SOUND_GROAN2, survivor); + case false: EmitSoundToAll(SOUND_GROAN1, survivor); + } + } + + if (g_esVisionCache[tank].g_iVisionMode & MT_VISION_FLASHBANG) + { + g_esVisionPlayer[survivor].g_bAffected = false; + g_esVisionPlayer[survivor].g_iOwner = -1; + + vVision2(survivor, .alpha = 240); + vShakePlayerScreen(survivor); + MT_DeafenPlayer(survivor); + + int iStagger = g_esVisionCache[tank].g_iVisionStagger; + if (iStagger > 0) + { + float flTankOrigin[3]; + GetClientAbsOrigin(tank, flTankOrigin); + if (iStagger == 1 || iStagger == 3) + { + MT_StaggerPlayer(survivor, tank, flTankOrigin); + } + + if (iStagger == 2 || iStagger == 3) + { + float flSurvivorOrigin[3], flDirection[3]; + GetClientAbsOrigin(survivor, flSurvivorOrigin); + MakeVectorFromPoints(flSurvivorOrigin, flTankOrigin, flDirection); + NormalizeVector(flDirection, flDirection); + MT_ShoveBySurvivor(tank, survivor, flDirection); + SetEntPropFloat(tank, Prop_Send, "m_flVelocityModifier", 0.4); + } + } + } + else if (!(g_esVisionCache[tank].g_iVisionMode & MT_VISION_FLASHBANG)) + { + vScreenEffect(survivor, tank, g_esVisionCache[tank].g_iVisionEffect, flags); + } + + if ((g_esVisionCache[tank].g_iVisionMode & MT_VISION_SHAKE) && bHuman) + { + EmitSoundToClient(survivor, (g_bSecondGame ? SOUND_SMASH2 : SOUND_SMASH1)); + } + + if (((g_esVisionCache[tank].g_iVisionMode & MT_VISION_SHAKE) || (g_esVisionCache[tank].g_iVisionMode & MT_VISION_SPLATTER)) && bHuman) + { + float flInterval = (pos != -1) ? MT_GetCombinationSetting(tank, 6, pos) : g_esVisionCache[tank].g_flVisionInterval; + if (flInterval > 0.0) + { + DataPack dpVision; + CreateDataTimer(flInterval, tTimerVision2, dpVision, TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); + dpVision.WriteCell(GetClientUserId(survivor)); + dpVision.WriteCell(GetClientUserId(tank)); + dpVision.WriteCell(g_esVisionPlayer[tank].g_iTankType); + dpVision.WriteCell(messages); + dpVision.WriteCell(enabled); + dpVision.WriteCell(pos); + dpVision.WriteCell(iTime); + } + } + + if ((g_esVisionCache[tank].g_iVisionMode & MT_VISION_VIEW) && bHuman) + { + DataPack dpVision; + CreateDataTimer(0.1, tTimerVision2, dpVision, TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); + dpVision.WriteCell(GetClientUserId(survivor)); + dpVision.WriteCell(GetClientUserId(tank)); + dpVision.WriteCell(g_esVisionPlayer[tank].g_iTankType); + dpVision.WriteCell(messages); + dpVision.WriteCell(enabled); + dpVision.WriteCell(pos); + dpVision.WriteCell(iTime); + } if (g_esVisionCache[tank].g_iVisionMessage & messages) { char sTankName[64]; MT_GetTankName(tank, sTankName); - MT_PrintToChatAll("%s %t", MT_TAG2, "Vision", sTankName, survivor, g_esVisionCache[tank].g_iVisionFOV); - MT_LogMessage(MT_LOG_ABILITY, "%s %T", MT_TAG, "Vision", LANG_SERVER, sTankName, survivor, g_esVisionCache[tank].g_iVisionFOV); + if (((g_esVisionCache[tank].g_iVisionMode & MT_VISION_BLIND) && bHuman) || (g_esVisionCache[tank].g_iVisionMode & MT_VISION_FLASHBANG)) + { + MT_PrintToChatAll("%s %t", MT_TAG2, "Vision", sTankName, survivor); + MT_LogMessage(MT_LOG_ABILITY, "%s %T", MT_TAG, "Vision", LANG_SERVER, sTankName, survivor); + } + + if ((g_esVisionCache[tank].g_iVisionMode & MT_VISION_SHAKE) && bHuman) + { + MT_PrintToChatAll("%s %t", MT_TAG2, "Vision3", sTankName, survivor); + MT_LogMessage(MT_LOG_ABILITY, "%s %T", MT_TAG, "Vision3", LANG_SERVER, sTankName, survivor); + } + + if ((g_esVisionCache[tank].g_iVisionMode & MT_VISION_SPLATTER) && bHuman) + { + MT_PrintToChatAll("%s %t", MT_TAG2, "Vision5", sTankName, survivor); + MT_LogMessage(MT_LOG_ABILITY, "%s %T", MT_TAG, "Vision5", LANG_SERVER, sTankName, survivor); + } + + if ((g_esVisionCache[tank].g_iVisionMode & MT_VISION_VIEW) && bHuman) + { + MT_PrintToChatAll("%s %t", MT_TAG2, "Vision7", sTankName, survivor, g_esVisionCache[tank].g_iVisionFOV); + MT_LogMessage(MT_LOG_ABILITY, "%s %T", MT_TAG, "Vision7", LANG_SERVER, sTankName, survivor, g_esVisionCache[tank].g_iVisionFOV); + } } } else if ((flags & MT_ATTACK_RANGE) && (g_esVisionPlayer[tank].g_iRangeCooldown == -1 || g_esVisionPlayer[tank].g_iRangeCooldown <= iTime)) @@ -1133,6 +1524,33 @@ void vVisionHit(int survivor, int tank, float random, float chance, int enabled, } } +void vVisionRange(int tank, int value, int bit, float random, int pos = -1) +{ + float flChance = (pos != -1) ? MT_GetCombinationSetting(tank, 13, pos) : g_esVisionCache[tank].g_flVisionDeathChance; + if (MT_IsTankSupported(tank, MT_CHECK_INDEX|MT_CHECK_INGAME) && MT_IsCustomTankSupported(tank) && (g_esVisionCache[tank].g_iVisionDeath & (1 << bit)) && random <= flChance) + { + if (g_esVisionCache[tank].g_iComboAbility == value || bIsAreaNarrow(tank, g_esVisionCache[tank].g_flOpenAreasOnly) || bIsAreaWide(tank, g_esVisionCache[tank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esVisionPlayer[tank].g_iTankType, tank) || (g_esVisionCache[tank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esVisionCache[tank].g_iRequiresHumans) || (bIsInfected(tank, MT_CHECK_FAKECLIENT) && ((!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esVisionAbility[g_esVisionPlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esVisionPlayer[tank].g_iAccessFlags)) || g_esVisionCache[tank].g_iHumanAbility == 0))) + { + return; + } + + float flTankPos[3], flSurvivorPos[3]; + GetClientAbsOrigin(tank, flTankPos); + float flRange = (pos != -1) ? MT_GetCombinationSetting(tank, 12, pos) : g_esVisionCache[tank].g_flVisionDeathRange; + for (int iSurvivor = 1; iSurvivor <= MaxClients; iSurvivor++) + { + if (bIsSurvivor(iSurvivor, MT_CHECK_INGAME|MT_CHECK_ALIVE) && !MT_IsAdminImmune(iSurvivor, tank) && !bIsAdminImmune(iSurvivor, g_esVisionPlayer[tank].g_iTankType, g_esVisionAbility[g_esVisionPlayer[tank].g_iTankTypeRecorded].g_iImmunityFlags, g_esVisionPlayer[iSurvivor].g_iImmunityFlags)) + { + GetClientAbsOrigin(iSurvivor, flSurvivorPos); + if (GetVectorDistance(flTankPos, flSurvivorPos) <= flRange && bIsVisibleToPlayer(tank, iSurvivor, g_esVisionCache[tank].g_iVisionSight, .range = flRange)) + { + vShakePlayerScreen(tank, 2.0); + } + } + } + } +} + void vVisionCopyStats2(int oldTank, int newTank) { g_esVisionPlayer[newTank].g_iAmmoCount = g_esVisionPlayer[oldTank].g_iAmmoCount; @@ -1144,10 +1562,13 @@ void vRemoveVision(int tank) { for (int iSurvivor = 1; iSurvivor <= MaxClients; iSurvivor++) { - if (bIsHumanSurvivor(iSurvivor, MT_CHECK_INGAME|MT_CHECK_ALIVE) && g_esVisionPlayer[iSurvivor].g_bAffected && g_esVisionPlayer[iSurvivor].g_iOwner == tank) + if (bIsSurvivor(iSurvivor, MT_CHECK_INGAME|MT_CHECK_ALIVE) && g_esVisionPlayer[iSurvivor].g_bAffected && g_esVisionPlayer[iSurvivor].g_iOwner == tank) { g_esVisionPlayer[iSurvivor].g_bAffected = false; g_esVisionPlayer[iSurvivor].g_iOwner = -1; + + vVision(iSurvivor, 0); + vStopVision(iSurvivor); } } @@ -1172,13 +1593,36 @@ void vVisionReset2(int survivor, int tank, int messages) g_esVisionPlayer[survivor].g_bAffected = false; g_esVisionPlayer[survivor].g_iOwner = -1; + vVision(survivor, 0); + vStopVision(survivor); SetEntProp(survivor, Prop_Send, "m_iFOV", 90); SetEntProp(survivor, Prop_Send, "m_iDefaultFOV", 90); if (g_esVisionCache[tank].g_iVisionMessage & messages) { - MT_PrintToChatAll("%s %t", MT_TAG2, "Vision2", survivor, 90); - MT_LogMessage(MT_LOG_ABILITY, "%s %T", MT_TAG, "Vision2", LANG_SERVER, survivor, 90); + if ((g_esVisionCache[tank].g_iVisionMode & MT_VISION_BLIND) || (g_esVisionCache[tank].g_iVisionMode & MT_VISION_FLASHBANG)) + { + MT_PrintToChatAll("%s %t", MT_TAG2, "Vision2", survivor); + MT_LogMessage(MT_LOG_ABILITY, "%s %T", MT_TAG, "Vision2", LANG_SERVER, survivor); + } + + if (g_esVisionCache[tank].g_iVisionMode & MT_VISION_SHAKE) + { + MT_PrintToChatAll("%s %t", MT_TAG2, "Vision4", survivor); + MT_LogMessage(MT_LOG_ABILITY, "%s %T", MT_TAG, "Vision4", LANG_SERVER, survivor); + } + + if (g_esVisionCache[tank].g_iVisionMode & MT_VISION_SPLATTER) + { + MT_PrintToChatAll("%s %t", MT_TAG2, "Vision6", survivor); + MT_LogMessage(MT_LOG_ABILITY, "%s %T", MT_TAG, "Vision6", LANG_SERVER, survivor); + } + + if (g_esVisionCache[tank].g_iVisionMode & MT_VISION_VIEW) + { + MT_PrintToChatAll("%s %t", MT_TAG2, "Vision8", survivor, 90); + MT_LogMessage(MT_LOG_ABILITY, "%s %T", MT_TAG, "Vision8", LANG_SERVER, survivor, 90); + } } } @@ -1192,35 +1636,135 @@ void vVisionReset3(int tank) g_esVisionPlayer[tank].g_iRangeCooldown = -1; } -void tTimerVisionCombo(Handle timer, DataPack pack) +void vStopVision(int survivor) +{ + MT_TE_SetupStopAllParticles(survivor); + TE_SendToClient(survivor); +} + +Action tTimerVision(Handle timer, DataPack pack) +{ + pack.Reset(); + + int iSurvivor = GetClientOfUserId(pack.ReadCell()); + if (!MT_IsCorePluginEnabled() || !bIsHumanSurvivor(iSurvivor) || !g_esVisionPlayer[iSurvivor].g_bAffected) + { + g_esVisionPlayer[iSurvivor].g_bAffected = false; + g_esVisionPlayer[iSurvivor].g_iOwner = -1; + + return Plugin_Stop; + } + + int iTank = GetClientOfUserId(pack.ReadCell()), + iType = pack.ReadCell(), + iVisionEnabled = pack.ReadCell(); + if (!MT_IsTankSupported(iTank) || bIsAreaNarrow(iTank, g_esVisionCache[iTank].g_flOpenAreasOnly) || bIsAreaWide(iTank, g_esVisionCache[iTank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esVisionPlayer[iTank].g_iTankType, iTank) || (g_esVisionCache[iTank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esVisionCache[iTank].g_iRequiresHumans) || !MT_HasAdminAccess(iTank) || !bHasAdminAccess(iTank, g_esVisionAbility[g_esVisionPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esVisionPlayer[iTank].g_iAccessFlags) || !MT_IsTypeEnabled(g_esVisionPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || iType != g_esVisionPlayer[iTank].g_iTankType || MT_IsAdminImmune(iSurvivor, iTank) || bIsAdminImmune(iSurvivor, g_esVisionPlayer[iTank].g_iTankType, g_esVisionAbility[g_esVisionPlayer[iTank].g_iTankTypeRecorded].g_iImmunityFlags, g_esVisionPlayer[iSurvivor].g_iImmunityFlags) || iVisionEnabled == 0) + { + g_esVisionPlayer[iSurvivor].g_bAffected = false; + g_esVisionPlayer[iSurvivor].g_iOwner = -1; + + vVision(iSurvivor, 0); + + return Plugin_Stop; + } + + vVision(iSurvivor, g_esVisionCache[iTank].g_iVisionIntensity); + + return Plugin_Continue; +} + +Action tTimerVision2(Handle timer, DataPack pack) +{ + pack.Reset(); + + int iSurvivor = GetClientOfUserId(pack.ReadCell()); + if (!MT_IsCorePluginEnabled() || !bIsHumanSurvivor(iSurvivor)) + { + g_esVisionPlayer[iSurvivor].g_bAffected = false; + g_esVisionPlayer[iSurvivor].g_iOwner = -1; + + return Plugin_Stop; + } + + int iTank = GetClientOfUserId(pack.ReadCell()), iType = pack.ReadCell(), iMessage = pack.ReadCell(); + if (!MT_IsTankSupported(iTank) || bIsAreaNarrow(iTank, g_esVisionCache[iTank].g_flOpenAreasOnly) || bIsAreaWide(iTank, g_esVisionCache[iTank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esVisionPlayer[iTank].g_iTankType, iTank) || (g_esVisionCache[iTank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esVisionCache[iTank].g_iRequiresHumans) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esVisionAbility[g_esVisionPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esVisionPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esVisionPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || iType != g_esVisionPlayer[iTank].g_iTankType || MT_IsAdminImmune(iSurvivor, iTank) || bIsAdminImmune(iSurvivor, g_esVisionPlayer[iTank].g_iTankType, g_esVisionAbility[g_esVisionPlayer[iTank].g_iTankTypeRecorded].g_iImmunityFlags, g_esVisionPlayer[iSurvivor].g_iImmunityFlags) || !g_esVisionPlayer[iSurvivor].g_bAffected) + { + vVisionReset2(iSurvivor, iTank, iMessage); + + return Plugin_Stop; + } + + int iVisionEnabled = pack.ReadCell(), iPos = pack.ReadCell(), + iDuration = (iPos != -1) ? RoundToNearest(MT_GetCombinationSetting(iTank, 5, iPos)) : RoundToNearest(g_esVisionCache[iTank].g_flVisionDuration), + iTime = pack.ReadCell(); + if (iVisionEnabled == 0 || (iTime + iDuration) <= GetTime()) + { + vVisionReset2(iSurvivor, iTank, iMessage); + + return Plugin_Stop; + } + + if (!bIsVisibleToPlayer(iSurvivor, iTank, g_esVisionCache[iTank].g_iVisionSight)) + { + return Plugin_Continue; + } + + if (g_esVisionCache[iTank].g_iVisionMode & MT_VISION_SHAKE) + { + vShakePlayerScreen(iSurvivor); + } + + if ((g_esVisionCache[iTank].g_iVisionMode & MT_VISION_SPLATTER) && g_iGraphicsLevel > 2) + { + int iIndex = (g_esVisionCache[iTank].g_iVisionType > 0) ? (g_esVisionCache[iTank].g_iVisionType - 1) : MT_GetRandomInt(0, (sizeof g_sParticles - 1)), + iParticle = MT_GetParticleIndex(g_sParticles[iIndex]); + if (iParticle != INVALID_STRING_INDEX) + { + MT_TE_SetupParticleAttachment(iParticle, 1, iSurvivor, true); + TE_SendToClient(iSurvivor); + } + } + + if (g_esVisionCache[iTank].g_iVisionMode & MT_VISION_VIEW) + { + SetEntProp(iSurvivor, Prop_Send, "m_iFOV", g_esVisionCache[iTank].g_iVisionFOV); + SetEntProp(iSurvivor, Prop_Send, "m_iDefaultFOV", g_esVisionCache[iTank].g_iVisionFOV); + } + + return Plugin_Continue; +} + +Action tTimerVisionCombo(Handle timer, DataPack pack) { pack.Reset(); int iTank = GetClientOfUserId(pack.ReadCell()); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esVisionAbility[g_esVisionPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esVisionPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esVisionPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esVisionCache[iTank].g_iVisionAbility == 0) { - return; + return Plugin_Stop; } float flRandom = pack.ReadFloat(); int iPos = pack.ReadCell(); vVisionAbility(iTank, flRandom, iPos); + + return Plugin_Continue; } -void tTimerVisionCombo2(Handle timer, DataPack pack) +Action tTimerVisionCombo2(Handle timer, DataPack pack) { pack.Reset(); int iSurvivor = GetClientOfUserId(pack.ReadCell()); - if (!bIsSurvivor(iSurvivor) || g_esVisionPlayer[iSurvivor].g_bAffected) + if (!bIsHumanSurvivor(iSurvivor) || g_esVisionPlayer[iSurvivor].g_bAffected) { - return; + return Plugin_Stop; } int iTank = GetClientOfUserId(pack.ReadCell()); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esVisionAbility[g_esVisionPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esVisionPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esVisionPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esVisionCache[iTank].g_iVisionHit == 0) { - return; + return Plugin_Stop; } float flRandom = pack.ReadFloat(), flChance = pack.ReadFloat(); @@ -1235,14 +1779,16 @@ void tTimerVisionCombo2(Handle timer, DataPack pack) { vVisionHit(iSurvivor, iTank, flRandom, flChance, g_esVisionCache[iTank].g_iVisionHit, MT_MESSAGE_MELEE, MT_ATTACK_MELEE, iPos); } + + return Plugin_Continue; } -Action tTimerVision(Handle timer, DataPack pack) +Action tTimerStopVision(Handle timer, DataPack pack) { pack.Reset(); int iSurvivor = GetClientOfUserId(pack.ReadCell()); - if (!MT_IsCorePluginEnabled() || !bIsHumanSurvivor(iSurvivor)) + if (!bIsHumanSurvivor(iSurvivor)) { g_esVisionPlayer[iSurvivor].g_bAffected = false; g_esVisionPlayer[iSurvivor].g_iOwner = -1; @@ -1250,31 +1796,28 @@ Action tTimerVision(Handle timer, DataPack pack) return Plugin_Stop; } - int iTank = GetClientOfUserId(pack.ReadCell()), iType = pack.ReadCell(), iMessage = pack.ReadCell(); - if (!MT_IsTankSupported(iTank) || bIsAreaNarrow(iTank, g_esVisionCache[iTank].g_flOpenAreasOnly) || bIsAreaWide(iTank, g_esVisionCache[iTank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esVisionPlayer[iTank].g_iTankType, iTank) || (g_esVisionCache[iTank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esVisionCache[iTank].g_iRequiresHumans) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esVisionAbility[g_esVisionPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esVisionPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esVisionPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || iType != g_esVisionPlayer[iTank].g_iTankType || MT_IsAdminImmune(iSurvivor, iTank) || bIsAdminImmune(iSurvivor, g_esVisionPlayer[iTank].g_iTankType, g_esVisionAbility[g_esVisionPlayer[iTank].g_iTankTypeRecorded].g_iImmunityFlags, g_esVisionPlayer[iSurvivor].g_iImmunityFlags) || !g_esVisionPlayer[iSurvivor].g_bAffected || MT_DoesSurvivorHaveRewardType(iSurvivor, MT_REWARD_GODMODE)) + int iTank = GetClientOfUserId(pack.ReadCell()); + float flCurrentTime = pack.ReadFloat(), flDuration = pack.ReadFloat(); + int iMessage = pack.ReadCell(); + if (!MT_IsTankSupported(iTank) || !MT_IsCustomTankSupported(iTank) || !g_esVisionPlayer[iSurvivor].g_bAffected) { vVisionReset2(iSurvivor, iTank, iMessage); return Plugin_Stop; } - int iVisionEnabled = pack.ReadCell(), iPos = pack.ReadCell(), - iDuration = (iPos != -1) ? RoundToNearest(MT_GetCombinationSetting(iTank, 5, iPos)) : g_esVisionCache[iTank].g_iVisionDuration, - iTime = pack.ReadCell(); - if (iVisionEnabled == 0 || (iTime + iDuration) <= GetTime()) + if ((flCurrentTime + flDuration) < GetGameTime()) { vVisionReset2(iSurvivor, iTank, iMessage); return Plugin_Stop; } - if (!bIsVisibleToPlayer(iSurvivor, iTank, g_esVisionCache[iTank].g_iVisionSight)) + switch (bIsVisibleToPlayer(iTank, iSurvivor, g_esVisionCache[iTank].g_iVisionSight)) { - return Plugin_Continue; + case true: vVision(iSurvivor, g_esVisionCache[iTank].g_iVisionIntensity); + case false: vVision(iSurvivor, 0); } - SetEntProp(iSurvivor, Prop_Send, "m_iFOV", g_esVisionCache[iTank].g_iVisionFOV); - SetEntProp(iSurvivor, Prop_Send, "m_iDefaultFOV", g_esVisionCache[iTank].g_iVisionFOV); - return Plugin_Continue; } \ No newline at end of file diff --git a/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_warp.sp b/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_warp.sp index a901370660..616af80a35 100644 --- a/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_warp.sp +++ b/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_warp.sp @@ -1,6 +1,6 @@ /** - * Mutant Tanks: a L4D/L4D2 SourceMod Plugin - * Copyright (C) 2024 Alfred "Psyk0tik" Llagas + * Mutant Tanks: A L4D/L4D2 SourceMod Plugin + * Copyright (C) 2017-2025 Alfred "Psyk0tik" Llagas * * 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. * @@ -29,6 +29,8 @@ public Plugin myinfo = bool g_bDedicated, g_bLateLoad; +int g_iGraphicsLevel; + public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max) { EngineVersion evEngine = GetEngineVersion(); @@ -456,7 +458,15 @@ int iWarpMenuHandler(Menu menu, MenuAction action, int param1, int param2) MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtons"); MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtons2"); } - case 3: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esWarpCache[param1].g_iHumanMode == 0) ? "AbilityButtonMode1" : "AbilityButtonMode2"); + case 3: + { + switch (g_esWarpCache[param1].g_iHumanMode) + { + case 0: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtonMode1"); + case 1: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtonMode2"); + case 2: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtonMode3"); + } + } case 4: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityCooldown", ((g_esWarpCache[param1].g_iHumanAbility == 1) ? g_esWarpCache[param1].g_iHumanCooldown : g_esWarpCache[param1].g_iWarpCooldown)); case 5: MT_PrintToChat(param1, "%s %t", MT_TAG3, "WarpDetails"); case 6: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityDuration2", ((g_esWarpCache[param1].g_iHumanAbility == 1) ? g_esWarpCache[param1].g_iHumanDuration : g_esWarpCache[param1].g_iWarpDuration)); @@ -872,7 +882,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esWarpTeammate[admin].g_iHumanAmmo = iGetKeyValue(subsection, MT_WARP_SECTION, MT_WARP_SECTION2, MT_WARP_SECTION3, MT_WARP_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esWarpTeammate[admin].g_iHumanAmmo, value, -1, 99999); g_esWarpTeammate[admin].g_iHumanCooldown = iGetKeyValue(subsection, MT_WARP_SECTION, MT_WARP_SECTION2, MT_WARP_SECTION3, MT_WARP_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esWarpTeammate[admin].g_iHumanCooldown, value, -1, 99999); g_esWarpTeammate[admin].g_iHumanDuration = iGetKeyValue(subsection, MT_WARP_SECTION, MT_WARP_SECTION2, MT_WARP_SECTION3, MT_WARP_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esWarpTeammate[admin].g_iHumanDuration, value, -1, 99999); - g_esWarpTeammate[admin].g_iHumanMode = iGetKeyValue(subsection, MT_WARP_SECTION, MT_WARP_SECTION2, MT_WARP_SECTION3, MT_WARP_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esWarpTeammate[admin].g_iHumanMode, value, -1, 1); + g_esWarpTeammate[admin].g_iHumanMode = iGetKeyValue(subsection, MT_WARP_SECTION, MT_WARP_SECTION2, MT_WARP_SECTION3, MT_WARP_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esWarpTeammate[admin].g_iHumanMode, value, -1, 2); g_esWarpTeammate[admin].g_iHumanRangeCooldown = iGetKeyValue(subsection, MT_WARP_SECTION, MT_WARP_SECTION2, MT_WARP_SECTION3, MT_WARP_SECTION4, key, "HumanRangeCooldown", "Human Range Cooldown", "Human_Range_Cooldown", "hrangecooldown", g_esWarpTeammate[admin].g_iHumanRangeCooldown, value, -1, 99999); g_esWarpTeammate[admin].g_iHumanRockCooldown = iGetKeyValue(subsection, MT_WARP_SECTION, MT_WARP_SECTION2, MT_WARP_SECTION3, MT_WARP_SECTION4, key, "HumanRockCooldown", "Human Rock Cooldown", "Human_Rock_Cooldown", "hrockcooldown", g_esWarpTeammate[admin].g_iHumanRockCooldown, value, -1, 99999); g_esWarpTeammate[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_WARP_SECTION, MT_WARP_SECTION2, MT_WARP_SECTION3, MT_WARP_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esWarpTeammate[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); @@ -903,7 +913,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esWarpPlayer[admin].g_iHumanAmmo = iGetKeyValue(subsection, MT_WARP_SECTION, MT_WARP_SECTION2, MT_WARP_SECTION3, MT_WARP_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esWarpPlayer[admin].g_iHumanAmmo, value, -1, 99999); g_esWarpPlayer[admin].g_iHumanCooldown = iGetKeyValue(subsection, MT_WARP_SECTION, MT_WARP_SECTION2, MT_WARP_SECTION3, MT_WARP_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esWarpPlayer[admin].g_iHumanCooldown, value, -1, 99999); g_esWarpPlayer[admin].g_iHumanDuration = iGetKeyValue(subsection, MT_WARP_SECTION, MT_WARP_SECTION2, MT_WARP_SECTION3, MT_WARP_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esWarpPlayer[admin].g_iHumanDuration, value, -1, 99999); - g_esWarpPlayer[admin].g_iHumanMode = iGetKeyValue(subsection, MT_WARP_SECTION, MT_WARP_SECTION2, MT_WARP_SECTION3, MT_WARP_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esWarpPlayer[admin].g_iHumanMode, value, -1, 1); + g_esWarpPlayer[admin].g_iHumanMode = iGetKeyValue(subsection, MT_WARP_SECTION, MT_WARP_SECTION2, MT_WARP_SECTION3, MT_WARP_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esWarpPlayer[admin].g_iHumanMode, value, -1, 2); g_esWarpPlayer[admin].g_iHumanRangeCooldown = iGetKeyValue(subsection, MT_WARP_SECTION, MT_WARP_SECTION2, MT_WARP_SECTION3, MT_WARP_SECTION4, key, "HumanRangeCooldown", "Human Range Cooldown", "Human_Range_Cooldown", "hrangecooldown", g_esWarpPlayer[admin].g_iHumanRangeCooldown, value, -1, 99999); g_esWarpPlayer[admin].g_iHumanRockCooldown = iGetKeyValue(subsection, MT_WARP_SECTION, MT_WARP_SECTION2, MT_WARP_SECTION3, MT_WARP_SECTION4, key, "HumanRockCooldown", "Human Rock Cooldown", "Human_Rock_Cooldown", "hrockcooldown", g_esWarpPlayer[admin].g_iHumanRockCooldown, value, -1, 99999); g_esWarpPlayer[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_WARP_SECTION, MT_WARP_SECTION2, MT_WARP_SECTION3, MT_WARP_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esWarpPlayer[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); @@ -940,7 +950,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esWarpSpecial[type].g_iHumanAmmo = iGetKeyValue(subsection, MT_WARP_SECTION, MT_WARP_SECTION2, MT_WARP_SECTION3, MT_WARP_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esWarpSpecial[type].g_iHumanAmmo, value, -1, 99999); g_esWarpSpecial[type].g_iHumanCooldown = iGetKeyValue(subsection, MT_WARP_SECTION, MT_WARP_SECTION2, MT_WARP_SECTION3, MT_WARP_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esWarpSpecial[type].g_iHumanCooldown, value, -1, 99999); g_esWarpSpecial[type].g_iHumanDuration = iGetKeyValue(subsection, MT_WARP_SECTION, MT_WARP_SECTION2, MT_WARP_SECTION3, MT_WARP_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esWarpSpecial[type].g_iHumanDuration, value, -1, 99999); - g_esWarpSpecial[type].g_iHumanMode = iGetKeyValue(subsection, MT_WARP_SECTION, MT_WARP_SECTION2, MT_WARP_SECTION3, MT_WARP_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esWarpSpecial[type].g_iHumanMode, value, -1, 1); + g_esWarpSpecial[type].g_iHumanMode = iGetKeyValue(subsection, MT_WARP_SECTION, MT_WARP_SECTION2, MT_WARP_SECTION3, MT_WARP_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esWarpSpecial[type].g_iHumanMode, value, -1, 2); g_esWarpSpecial[type].g_iHumanRangeCooldown = iGetKeyValue(subsection, MT_WARP_SECTION, MT_WARP_SECTION2, MT_WARP_SECTION3, MT_WARP_SECTION4, key, "HumanRangeCooldown", "Human Range Cooldown", "Human_Range_Cooldown", "hrangecooldown", g_esWarpSpecial[type].g_iHumanRangeCooldown, value, -1, 99999); g_esWarpSpecial[type].g_iHumanRockCooldown = iGetKeyValue(subsection, MT_WARP_SECTION, MT_WARP_SECTION2, MT_WARP_SECTION3, MT_WARP_SECTION4, key, "HumanRockCooldown", "Human Rock Cooldown", "Human_Rock_Cooldown", "hrockcooldown", g_esWarpSpecial[type].g_iHumanRockCooldown, value, -1, 99999); g_esWarpSpecial[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_WARP_SECTION, MT_WARP_SECTION2, MT_WARP_SECTION3, MT_WARP_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esWarpSpecial[type].g_flOpenAreasOnly, value, -1.0, 99999.0); @@ -971,7 +981,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esWarpAbility[type].g_iHumanAmmo = iGetKeyValue(subsection, MT_WARP_SECTION, MT_WARP_SECTION2, MT_WARP_SECTION3, MT_WARP_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esWarpAbility[type].g_iHumanAmmo, value, -1, 99999); g_esWarpAbility[type].g_iHumanCooldown = iGetKeyValue(subsection, MT_WARP_SECTION, MT_WARP_SECTION2, MT_WARP_SECTION3, MT_WARP_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esWarpAbility[type].g_iHumanCooldown, value, -1, 99999); g_esWarpAbility[type].g_iHumanDuration = iGetKeyValue(subsection, MT_WARP_SECTION, MT_WARP_SECTION2, MT_WARP_SECTION3, MT_WARP_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esWarpAbility[type].g_iHumanDuration, value, -1, 99999); - g_esWarpAbility[type].g_iHumanMode = iGetKeyValue(subsection, MT_WARP_SECTION, MT_WARP_SECTION2, MT_WARP_SECTION3, MT_WARP_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esWarpAbility[type].g_iHumanMode, value, -1, 1); + g_esWarpAbility[type].g_iHumanMode = iGetKeyValue(subsection, MT_WARP_SECTION, MT_WARP_SECTION2, MT_WARP_SECTION3, MT_WARP_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esWarpAbility[type].g_iHumanMode, value, -1, 2); g_esWarpAbility[type].g_iHumanRangeCooldown = iGetKeyValue(subsection, MT_WARP_SECTION, MT_WARP_SECTION2, MT_WARP_SECTION3, MT_WARP_SECTION4, key, "HumanRangeCooldown", "Human Range Cooldown", "Human_Range_Cooldown", "hrangecooldown", g_esWarpAbility[type].g_iHumanRangeCooldown, value, -1, 99999); g_esWarpAbility[type].g_iHumanRockCooldown = iGetKeyValue(subsection, MT_WARP_SECTION, MT_WARP_SECTION2, MT_WARP_SECTION3, MT_WARP_SECTION4, key, "HumanRockCooldown", "Human Rock Cooldown", "Human_Rock_Cooldown", "hrockcooldown", g_esWarpAbility[type].g_iHumanRockCooldown, value, -1, 99999); g_esWarpAbility[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_WARP_SECTION, MT_WARP_SECTION2, MT_WARP_SECTION3, MT_WARP_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esWarpAbility[type].g_flOpenAreasOnly, value, -1.0, 99999.0); @@ -1010,7 +1020,9 @@ public void MT_OnSettingsCached(int tank, bool apply, int type) g_esWarpPlayer[tank].g_iTankTypeRecorded = apply ? MT_GetRecordedTankType(tank, type) : 0; g_esWarpPlayer[tank].g_iTankType = apply ? type : 0; int iType = g_esWarpPlayer[tank].g_iTankTypeRecorded; - +#if !defined MT_ABILITIES_MAIN2 + g_iGraphicsLevel = MT_GetGraphicsLevel(); +#endif if (bIsSpecialInfected(tank, MT_CHECK_INDEX|MT_CHECK_INGAME)) { g_esWarpCache[tank].g_flCloseAreasOnly = flGetSubSettingValue(apply, bHuman, g_esWarpTeammate[tank].g_flCloseAreasOnly, g_esWarpPlayer[tank].g_flCloseAreasOnly, g_esWarpSpecial[iType].g_flCloseAreasOnly, g_esWarpAbility[iType].g_flCloseAreasOnly, 1); @@ -1223,8 +1235,9 @@ public void MT_OnButtonPressed(int tank, int button) if ((button & MT_MAIN_KEY) && (g_esWarpCache[tank].g_iWarpAbility == 2 || g_esWarpCache[tank].g_iWarpAbility == 3) && g_esWarpCache[tank].g_iHumanAbility == 1) { bool bRecharging = g_esWarpPlayer[tank].g_iCooldown != -1 && g_esWarpPlayer[tank].g_iCooldown >= iTime; + int iHumanMode = g_esWarpCache[tank].g_iHumanMode; - switch (g_esWarpCache[tank].g_iHumanMode) + switch (iHumanMode) { case 0: { @@ -1241,9 +1254,9 @@ public void MT_OnButtonPressed(int tank, int button) MT_PrintToChat(tank, "%s %t", MT_TAG3, "WarpHuman5", (g_esWarpPlayer[tank].g_iCooldown - iTime)); } } - case 1: + case 1, 2: { - if (g_esWarpPlayer[tank].g_iAmmoCount < g_esWarpCache[tank].g_iHumanAmmo && g_esWarpCache[tank].g_iHumanAmmo > 0) + if ((iHumanMode == 2 && g_esWarpPlayer[tank].g_bActivated) || (g_esWarpPlayer[tank].g_iAmmoCount < g_esWarpCache[tank].g_iHumanAmmo && g_esWarpCache[tank].g_iHumanAmmo > 0)) { if (!g_esWarpPlayer[tank].g_bActivated && !bRecharging) { @@ -1255,7 +1268,11 @@ public void MT_OnButtonPressed(int tank, int button) } else if (g_esWarpPlayer[tank].g_bActivated) { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "WarpHuman4"); + switch (iHumanMode) + { + case 1: MT_PrintToChat(tank, "%s %t", MT_TAG3, "WarpHuman4"); + case 2: vWarpReset2(tank); + } } else if (bRecharging) { @@ -1400,9 +1417,13 @@ void vWarp2(int tank, int other) TeleportEntity(tank, flTempOrigin, flTempAngles, view_as({0.0, 0.0, 0.0})); vFixPlayerPosition(tank); - vAttachParticle(iVictim, PARTICLE_ELECTRICITY, 1.0); EmitSoundToAll(SOUND_ELECTRICITY, iVictim); + if (g_iGraphicsLevel > 2) + { + vAttachParticle(iVictim, PARTICLE_ELECTRICITY, 1.0); + } + if (bIsPlayerStuck(iVictim)) { if (bSurvivor) @@ -1426,9 +1447,13 @@ void vWarp2(int tank, int other) TeleportEntity(other, flTankOrigin, flTankAngles, view_as({0.0, 0.0, 0.0})); vFixPlayerPosition(other); - vAttachParticle(other, PARTICLE_ELECTRICITY, 1.0); EmitSoundToAll(SOUND_ELECTRICITY2, other); + if (g_iGraphicsLevel > 2) + { + vAttachParticle(other, PARTICLE_ELECTRICITY, 1.0); + } + if (bIsPlayerStuck(other)) { if (bSurvivor) @@ -1658,7 +1683,11 @@ void vWarpRange(int tank) return; } - vAttachParticle(tank, PARTICLE_ELECTRICITY, 1.0); + if (g_iGraphicsLevel > 2) + { + vAttachParticle(tank, PARTICLE_ELECTRICITY, 1.0); + } + EmitSoundToAll(SOUND_ELECTRICITY, tank); } } @@ -1721,9 +1750,13 @@ void vWarpRockBreak2(int tank, int rock, float random, int pos = -1) TeleportEntity(tank, flRockPos, flRockAngles, view_as({0.0, 0.0, 0.0})); vFixPlayerPosition(tank); - vAttachParticle(iVictim, PARTICLE_ELECTRICITY, 1.0); EmitSoundToAll(SOUND_ELECTRICITY, iVictim); + if (g_iGraphicsLevel > 2) + { + vAttachParticle(iVictim, PARTICLE_ELECTRICITY, 1.0); + } + if (bIsPlayerStuck(iVictim)) { if (bIsSurvivor(iVictim)) @@ -1821,49 +1854,53 @@ bool bIsSurvivorInsideSaferoom(int survivor) return false; } -void tTimerWarpCombo(Handle timer, DataPack pack) +Action tTimerWarpCombo(Handle timer, DataPack pack) { pack.Reset(); int iTank = GetClientOfUserId(pack.ReadCell()); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esWarpAbility[g_esWarpPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esWarpPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esWarpPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esWarpCache[iTank].g_iWarpAbility == 0 || g_esWarpCache[iTank].g_iWarpAbility == 2) { - return; + return Plugin_Stop; } float flRandom = pack.ReadFloat(); int iPos = pack.ReadCell(); vWarpAbility(iTank, true, flRandom, iPos); + + return Plugin_Continue; } -void tTimerWarpCombo2(Handle timer, DataPack pack) +Action tTimerWarpCombo2(Handle timer, DataPack pack) { pack.Reset(); int iTank = GetClientOfUserId(pack.ReadCell()); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esWarpAbility[g_esWarpPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esWarpPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esWarpPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esWarpCache[iTank].g_iWarpAbility == 0 || g_esWarpCache[iTank].g_iWarpAbility == 1) { - return; + return Plugin_Stop; } int iPos = pack.ReadCell(); vWarpAbility(iTank, false, .pos = iPos); + + return Plugin_Continue; } -void tTimerWarpCombo3(Handle timer, DataPack pack) +Action tTimerWarpCombo3(Handle timer, DataPack pack) { pack.Reset(); int iSurvivor = GetClientOfUserId(pack.ReadCell()); if (!bIsSurvivor(iSurvivor)) { - return; + return Plugin_Stop; } int iTank = GetClientOfUserId(pack.ReadCell()); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esWarpAbility[g_esWarpPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esWarpPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esWarpPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esWarpCache[iTank].g_iWarpHit == 0) { - return; + return Plugin_Stop; } float flRandom = pack.ReadFloat(), flChance = pack.ReadFloat(); @@ -1878,6 +1915,8 @@ void tTimerWarpCombo3(Handle timer, DataPack pack) { vWarpHit(iSurvivor, iTank, flRandom, flChance, g_esWarpCache[iTank].g_iWarpHit, MT_MESSAGE_MELEE, MT_ATTACK_MELEE, iPos); } + + return Plugin_Continue; } Action tTimerWarp(Handle timer, DataPack pack) diff --git a/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_whirl.sp b/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_whirl.sp index 748b28aff5..dd20789ce0 100644 --- a/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_whirl.sp +++ b/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_whirl.sp @@ -1,6 +1,6 @@ /** - * Mutant Tanks: a L4D/L4D2 SourceMod Plugin - * Copyright (C) 2024 Alfred "Psyk0tik" Llagas + * Mutant Tanks: A L4D/L4D2 SourceMod Plugin + * Copyright (C) 2017-2025 Alfred "Psyk0tik" Llagas * * 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. * @@ -1260,35 +1260,37 @@ void vStopWhirl(int survivor, int camera) RemoveEntity(camera); } -void tTimerWhirlCombo(Handle timer, DataPack pack) +Action tTimerWhirlCombo(Handle timer, DataPack pack) { pack.Reset(); int iTank = GetClientOfUserId(pack.ReadCell()); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esWhirlAbility[g_esWhirlPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esWhirlPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esWhirlPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esWhirlCache[iTank].g_iWhirlAbility == 0) { - return; + return Plugin_Stop; } float flRandom = pack.ReadFloat(); int iPos = pack.ReadCell(); vWhirlAbility(iTank, flRandom, iPos); + + return Plugin_Continue; } -void tTimerWhirlCombo2(Handle timer, DataPack pack) +Action tTimerWhirlCombo2(Handle timer, DataPack pack) { pack.Reset(); int iSurvivor = GetClientOfUserId(pack.ReadCell()); if (!bIsSurvivor(iSurvivor) || g_esWhirlPlayer[iSurvivor].g_bAffected) { - return; + return Plugin_Stop; } int iTank = GetClientOfUserId(pack.ReadCell()); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esWhirlAbility[g_esWhirlPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esWhirlPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esWhirlPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esWhirlCache[iTank].g_iWhirlHit == 0) { - return; + return Plugin_Stop; } float flRandom = pack.ReadFloat(), flChance = pack.ReadFloat(); @@ -1303,6 +1305,8 @@ void tTimerWhirlCombo2(Handle timer, DataPack pack) { vWhirlHit(iSurvivor, iTank, flRandom, flChance, g_esWhirlCache[iTank].g_iWhirlHit, MT_MESSAGE_MELEE, MT_ATTACK_MELEE, iPos); } + + return Plugin_Continue; } Action tTimerWhirl(Handle timer, DataPack pack) diff --git a/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_witch.sp b/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_witch.sp index a03536d93b..a41d7d14fa 100644 --- a/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_witch.sp +++ b/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_witch.sp @@ -1,6 +1,6 @@ /** - * Mutant Tanks: a L4D/L4D2 SourceMod Plugin - * Copyright (C) 2024 Alfred "Psyk0tik" Llagas + * Mutant Tanks: A L4D/L4D2 SourceMod Plugin + * Copyright (C) 2017-2025 Alfred "Psyk0tik" Llagas * * 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. * @@ -1012,27 +1012,31 @@ void vWitchReset() } } -void tTimerWitchCombo(Handle timer, DataPack pack) +Action tTimerWitchCombo(Handle timer, DataPack pack) { pack.Reset(); int iTank = GetClientOfUserId(pack.ReadCell()); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esWitchAbility[g_esWitchPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esWitchPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esWitchPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esWitchCache[iTank].g_iWitchAbility == 0) { - return; + return Plugin_Stop; } int iPos = pack.ReadCell(); vWitch(iTank, iPos); + + return Plugin_Continue; } -void tTimerWitchKillWitch(Handle timer, int ref) +Action tTimerWitchKillWitch(Handle timer, int ref) { int iWitch = EntRefToEntIndex(ref); if (iWitch == INVALID_ENT_REFERENCE || !bIsValidEntity(iWitch) || !bIsWitch(iWitch)) { - return; + return Plugin_Stop; } RemoveEntity(iWitch); + + return Plugin_Continue; } \ No newline at end of file diff --git a/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_xiphos.sp b/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_xiphos.sp deleted file mode 100644 index 1b3302de90..0000000000 --- a/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_xiphos.sp +++ /dev/null @@ -1,598 +0,0 @@ -/** - * Mutant Tanks: a L4D/L4D2 SourceMod Plugin - * Copyright (C) 2024 Alfred "Psyk0tik" Llagas - * - * 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 . - **/ - -#define MT_XIPHOS_COMPILE_METHOD 0 // 0: packaged, 1: standalone - -#if !defined MT_ABILITIES_MAIN2 - #if MT_XIPHOS_COMPILE_METHOD == 1 - #include - #include - #else - #error This file must be inside "scripting/mutant_tanks/abilities2" while compiling "mt_abilities2.sp" to include its content. - #endif -public Plugin myinfo = -{ - name = "[MT] Xiphos Ability", - author = MT_AUTHOR, - description = "The Mutant Tank can steal health from survivors and vice-versa.", - version = MT_VERSION, - url = MT_URL -}; - -bool g_bDedicated, g_bLateLoad; - -public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max) -{ - EngineVersion evEngine = GetEngineVersion(); - if (evEngine != Engine_Left4Dead && evEngine != Engine_Left4Dead2) - { - strcopy(error, err_max, "\"[MT] Xiphos Ability\" only supports Left 4 Dead 1 & 2."); - - return APLRes_SilentFailure; - } - - g_bDedicated = IsDedicatedServer(); - g_bLateLoad = late; - - return APLRes_Success; -} -#else - #if MT_XIPHOS_COMPILE_METHOD == 1 - #error This file must be compiled as a standalone plugin. - #endif -#endif - -#define MT_XIPHOS_SECTION "xiphosability" -#define MT_XIPHOS_SECTION2 "xiphos ability" -#define MT_XIPHOS_SECTION3 "xiphos_ability" -#define MT_XIPHOS_SECTION4 "xiphos" - -#define MT_XIPHOS_TANK (1 << 0) // tank xiphos -#define MT_XIPHOS_SURVIVOR (1 << 1) // survivor xiphos - -#define MT_MENU_XIPHOS "Xiphos Ability" - -enum struct esXiphosPlayer -{ - float g_flCloseAreasOnly; - float g_flOpenAreasOnly; - float g_flXiphosChance; - - int g_iAccessFlags; - int g_iHumanAbility; - int g_iImmunityFlags; - int g_iRequiresHumans; - int g_iTankType; - int g_iTankTypeRecorded; - int g_iXiphosAbility; - int g_iXiphosEffect; - int g_iXiphosMaxHealth; - int g_iXiphosMessage; -} - -esXiphosPlayer g_esXiphosPlayer[MAXPLAYERS + 1]; - -enum struct esXiphosTeammate -{ - float g_flCloseAreasOnly; - float g_flOpenAreasOnly; - float g_flXiphosChance; - - int g_iHumanAbility; - int g_iRequiresHumans; - int g_iXiphosAbility; - int g_iXiphosEffect; - int g_iXiphosMaxHealth; - int g_iXiphosMessage; -} - -esXiphosTeammate g_esXiphosTeammate[MAXPLAYERS + 1]; - -enum struct esXiphosAbility -{ - float g_flCloseAreasOnly; - float g_flOpenAreasOnly; - float g_flXiphosChance; - - int g_iAccessFlags; - int g_iHumanAbility; - int g_iImmunityFlags; - int g_iRequiresHumans; - int g_iXiphosAbility; - int g_iXiphosEffect; - int g_iXiphosMaxHealth; - int g_iXiphosMessage; -} - -esXiphosAbility g_esXiphosAbility[MT_MAXTYPES + 1]; - -enum struct esXiphosSpecial -{ - float g_flCloseAreasOnly; - float g_flOpenAreasOnly; - float g_flXiphosChance; - - int g_iHumanAbility; - int g_iRequiresHumans; - int g_iXiphosAbility; - int g_iXiphosEffect; - int g_iXiphosMaxHealth; - int g_iXiphosMessage; -} - -esXiphosSpecial g_esXiphosSpecial[MT_MAXTYPES + 1]; - -enum struct esXiphosCache -{ - float g_flCloseAreasOnly; - float g_flOpenAreasOnly; - float g_flXiphosChance; - - int g_iHumanAbility; - int g_iRequiresHumans; - int g_iXiphosAbility; - int g_iXiphosEffect; - int g_iXiphosMaxHealth; - int g_iXiphosMessage; -} - -esXiphosCache g_esXiphosCache[MAXPLAYERS + 1]; - -#if !defined MT_ABILITIES_MAIN2 -public void OnPluginStart() -{ - LoadTranslations("common.phrases"); - LoadTranslations("mutant_tanks.phrases"); - LoadTranslations("mutant_tanks_names.phrases"); - - RegConsoleCmd("sm_mt_xiphos", cmdXiphosInfo, "View information about the Xiphos ability."); - - if (g_bLateLoad) - { - for (int iPlayer = 1; iPlayer <= MaxClients; iPlayer++) - { - if (bIsValidClient(iPlayer, MT_CHECK_INGAME)) - { - OnClientPutInServer(iPlayer); - } - } - - g_bLateLoad = false; - } -} -#endif - -#if defined MT_ABILITIES_MAIN2 -void vXiphosClientPutInServer(int client) -#else -public void OnClientPutInServer(int client) -#endif -{ - SDKHook(client, SDKHook_OnTakeDamage, OnXiphosTakeDamage); -} - -#if !defined MT_ABILITIES_MAIN2 -Action cmdXiphosInfo(int client, int args) -{ - client = iGetListenServerHost(client, g_bDedicated); - - if (!MT_IsCorePluginEnabled()) - { - MT_ReplyToCommand(client, "%s %t", MT_TAG5, "PluginDisabled"); - - return Plugin_Handled; - } - - if (!bIsValidClient(client, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_FAKECLIENT)) - { - MT_ReplyToCommand(client, "%s %t", MT_TAG, "Command is in-game only"); - - return Plugin_Handled; - } - - switch (IsVoteInProgress()) - { - case true: MT_ReplyToCommand(client, "%s %t", MT_TAG2, "Vote in Progress"); - case false: vXiphosMenu(client, MT_XIPHOS_SECTION4, 0); - } - - return Plugin_Handled; -} -#endif - -void vXiphosMenu(int client, const char[] name, int item) -{ - if (StrContains(MT_XIPHOS_SECTION4, name, false) == -1) - { - return; - } - - Menu mAbilityMenu = new Menu(iXiphosMenuHandler, MENU_ACTIONS_DEFAULT|MenuAction_Display|MenuAction_DisplayItem); - mAbilityMenu.SetTitle("Xiphos Ability Information"); - mAbilityMenu.AddItem("Status", "Status"); - mAbilityMenu.AddItem("Details", "Details"); - mAbilityMenu.AddItem("Human Support", "Human Support"); - mAbilityMenu.DisplayAt(client, item, MENU_TIME_FOREVER); -} - -int iXiphosMenuHandler(Menu menu, MenuAction action, int param1, int param2) -{ - switch (action) - { - case MenuAction_End: delete menu; - case MenuAction_Select: - { - switch (param2) - { - case 0: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esXiphosCache[param1].g_iXiphosAbility == 0) ? "AbilityStatus1" : "AbilityStatus2"); - case 1: MT_PrintToChat(param1, "%s %t", MT_TAG3, "XiphosDetails"); - case 2: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esXiphosCache[param1].g_iHumanAbility == 0) ? "AbilityHumanSupport1" : "AbilityHumanSupport2"); - } - - if (bIsValidClient(param1, MT_CHECK_INGAME)) - { - vXiphosMenu(param1, MT_XIPHOS_SECTION4, menu.Selection); - } - } - case MenuAction_Display: - { - char sMenuTitle[PLATFORM_MAX_PATH]; - Panel pXiphos = view_as(param2); - FormatEx(sMenuTitle, sizeof sMenuTitle, "%T", "XiphosMenu", param1); - pXiphos.SetTitle(sMenuTitle); - } - case MenuAction_DisplayItem: - { - if (param2 >= 0) - { - char sMenuOption[PLATFORM_MAX_PATH]; - - switch (param2) - { - case 0: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Status", param1); - case 1: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Details", param1); - case 2: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "HumanSupport", param1); - } - - return RedrawMenuItem(sMenuOption); - } - } - } - - return 0; -} - -#if defined MT_ABILITIES_MAIN2 -void vXiphosDisplayMenu(Menu menu) -#else -public void MT_OnDisplayMenu(Menu menu) -#endif -{ - menu.AddItem(MT_MENU_XIPHOS, MT_MENU_XIPHOS); -} - -#if defined MT_ABILITIES_MAIN2 -void vXiphosMenuItemSelected(int client, const char[] info) -#else -public void MT_OnMenuItemSelected(int client, const char[] info) -#endif -{ - if (StrEqual(info, MT_MENU_XIPHOS, false)) - { - vXiphosMenu(client, MT_XIPHOS_SECTION4, 0); - } -} - -#if defined MT_ABILITIES_MAIN2 -void vXiphosMenuItemDisplayed(int client, const char[] info, char[] buffer, int size) -#else -public void MT_OnMenuItemDisplayed(int client, const char[] info, char[] buffer, int size) -#endif -{ - if (StrEqual(info, MT_MENU_XIPHOS, false)) - { - FormatEx(buffer, size, "%T", "XiphosMenu2", client); - } -} - -Action OnXiphosTakeDamage(int victim, int &attacker, int &inflictor, float &damage, int &damagetype) -{ - if (MT_IsCorePluginEnabled() && bIsValidClient(victim, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_ALIVE) && damage > 0.0) - { - if (MT_IsTankSupported(attacker) && MT_IsCustomTankSupported(attacker) && !bIsPlayerIncapacitated(attacker) && g_esXiphosCache[attacker].g_iXiphosAbility == 1 && GetRandomFloat(0.1, 100.0) <= g_esXiphosCache[attacker].g_flXiphosChance && bIsSurvivor(victim) && !bIsSurvivorDisabled(victim)) - { - if (bIsAreaNarrow(attacker, g_esXiphosCache[attacker].g_flOpenAreasOnly) || bIsAreaWide(attacker, g_esXiphosCache[attacker].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esXiphosPlayer[attacker].g_iTankType, attacker) || (g_esXiphosCache[attacker].g_iRequiresHumans > 0 && iGetHumanCount() < g_esXiphosCache[attacker].g_iRequiresHumans) || (!MT_HasAdminAccess(attacker) && !bHasAdminAccess(attacker, g_esXiphosAbility[g_esXiphosPlayer[attacker].g_iTankTypeRecorded].g_iAccessFlags, g_esXiphosPlayer[attacker].g_iAccessFlags)) || MT_IsAdminImmune(victim, attacker) || bIsAdminImmune(victim, g_esXiphosPlayer[attacker].g_iTankType, g_esXiphosAbility[g_esXiphosPlayer[attacker].g_iTankTypeRecorded].g_iImmunityFlags, g_esXiphosPlayer[victim].g_iImmunityFlags)) - { - return Plugin_Continue; - } - - char sClassname[32]; - GetEntityClassname(inflictor, sClassname, sizeof sClassname); - if ((!bIsInfected(attacker, MT_CHECK_FAKECLIENT) || g_esXiphosCache[attacker].g_iHumanAbility == 1) && (StrEqual(sClassname[7], "tank_claw") || StrEqual(sClassname, "tank_rock"))) - { - vXiphos(attacker, victim, damage, true); - vScreenEffect(victim, attacker, g_esXiphosCache[attacker].g_iXiphosEffect, MT_ATTACK_CLAW); - } - } - else if (MT_IsTankSupported(victim) && MT_IsCustomTankSupported(victim) && !bIsPlayerIncapacitated(victim) && g_esXiphosCache[victim].g_iXiphosAbility == 1 && GetRandomFloat(0.1, 100.0) <= g_esXiphosCache[victim].g_flXiphosChance && bIsSurvivor(attacker) && !bIsSurvivorDisabled(attacker)) - { - if (bIsAreaNarrow(victim, g_esXiphosCache[victim].g_flOpenAreasOnly) || bIsAreaWide(victim, g_esXiphosCache[victim].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esXiphosPlayer[victim].g_iTankType, victim) || (g_esXiphosCache[victim].g_iRequiresHumans > 0 && iGetHumanCount() < g_esXiphosCache[victim].g_iRequiresHumans) || (!MT_HasAdminAccess(victim) && !bHasAdminAccess(victim, g_esXiphosAbility[g_esXiphosPlayer[victim].g_iTankTypeRecorded].g_iAccessFlags, g_esXiphosPlayer[victim].g_iAccessFlags)) || MT_IsAdminImmune(attacker, victim) || bIsAdminImmune(attacker, g_esXiphosPlayer[victim].g_iTankType, g_esXiphosAbility[g_esXiphosPlayer[victim].g_iTankTypeRecorded].g_iImmunityFlags, g_esXiphosPlayer[attacker].g_iImmunityFlags)) - { - return Plugin_Continue; - } - - if (!bIsInfected(victim, MT_CHECK_FAKECLIENT) || g_esXiphosCache[victim].g_iHumanAbility == 1) - { - if (damagetype & DMG_BULLET) - { - damage /= 20.0; - } - else if ((damagetype & DMG_BLAST) || (damagetype & DMG_BLAST_SURFACE) || (damagetype & DMG_AIRBOAT) || (damagetype & DMG_PLASMA)) - { - damage /= 20.0; - } - else if ((damagetype & DMG_BURN) || (damagetype & DMG_DIRECT)) - { - damage /= 200.0; - } - else if ((damagetype & DMG_CRUSH) && bIsValidEntity(inflictor) && HasEntProp(inflictor, Prop_Send, "m_isCarryable")) - { - damage /= 20.0; - } - else if ((damagetype & DMG_SLASH) || (damagetype & DMG_CLUB)) - { - damage /= 200.0; - } - - vXiphos(attacker, victim, damage, false); - } - } - } - - return Plugin_Continue; -} - -#if defined MT_ABILITIES_MAIN2 -void vXiphosPluginCheck(ArrayList list) -#else -public void MT_OnPluginCheck(ArrayList list) -#endif -{ - list.PushString(MT_MENU_XIPHOS); -} - -#if defined MT_ABILITIES_MAIN2 -void vXiphosAbilityCheck(ArrayList list, ArrayList list2, ArrayList list3, ArrayList list4) -#else -public void MT_OnAbilityCheck(ArrayList list, ArrayList list2, ArrayList list3, ArrayList list4) -#endif -{ - list.PushString(MT_XIPHOS_SECTION); - list2.PushString(MT_XIPHOS_SECTION2); - list3.PushString(MT_XIPHOS_SECTION3); - list4.PushString(MT_XIPHOS_SECTION4); -} - -#if defined MT_ABILITIES_MAIN2 -void vXiphosConfigsLoad(int mode) -#else -public void MT_OnConfigsLoad(int mode) -#endif -{ - switch (mode) - { - case 1: - { - for (int iIndex = MT_GetMinType(); iIndex <= MT_GetMaxType(); iIndex++) - { - g_esXiphosAbility[iIndex].g_iAccessFlags = 0; - g_esXiphosAbility[iIndex].g_iImmunityFlags = 0; - g_esXiphosAbility[iIndex].g_flCloseAreasOnly = 0.0; - g_esXiphosAbility[iIndex].g_iHumanAbility = 0; - g_esXiphosAbility[iIndex].g_flOpenAreasOnly = 0.0; - g_esXiphosAbility[iIndex].g_iRequiresHumans = 0; - g_esXiphosAbility[iIndex].g_iXiphosAbility = 0; - g_esXiphosAbility[iIndex].g_iXiphosEffect = 0; - g_esXiphosAbility[iIndex].g_iXiphosMessage = 0; - g_esXiphosAbility[iIndex].g_flXiphosChance = 33.3; - g_esXiphosAbility[iIndex].g_iXiphosMaxHealth = 100; - - g_esXiphosSpecial[iIndex].g_flCloseAreasOnly = -1.0; - g_esXiphosSpecial[iIndex].g_iHumanAbility = -1; - g_esXiphosSpecial[iIndex].g_flOpenAreasOnly = -1.0; - g_esXiphosSpecial[iIndex].g_iRequiresHumans = -1; - g_esXiphosSpecial[iIndex].g_iXiphosAbility = -1; - g_esXiphosSpecial[iIndex].g_iXiphosEffect = -1; - g_esXiphosSpecial[iIndex].g_iXiphosMessage = -1; - g_esXiphosSpecial[iIndex].g_flXiphosChance = -1.0; - g_esXiphosSpecial[iIndex].g_iXiphosMaxHealth = -1; - } - } - case 3: - { - for (int iPlayer = 1; iPlayer <= MaxClients; iPlayer++) - { - g_esXiphosPlayer[iPlayer].g_iAccessFlags = -1; - g_esXiphosPlayer[iPlayer].g_iImmunityFlags = -1; - g_esXiphosPlayer[iPlayer].g_flCloseAreasOnly = -1.0; - g_esXiphosPlayer[iPlayer].g_iHumanAbility = -1; - g_esXiphosPlayer[iPlayer].g_flOpenAreasOnly = -1.0; - g_esXiphosPlayer[iPlayer].g_iRequiresHumans = -1; - g_esXiphosPlayer[iPlayer].g_iXiphosAbility = -1; - g_esXiphosPlayer[iPlayer].g_iXiphosEffect = -1; - g_esXiphosPlayer[iPlayer].g_iXiphosMessage = -1; - g_esXiphosPlayer[iPlayer].g_flXiphosChance = -1.0; - g_esXiphosPlayer[iPlayer].g_iXiphosMaxHealth = -1; - - g_esXiphosTeammate[iPlayer].g_flCloseAreasOnly = -1.0; - g_esXiphosTeammate[iPlayer].g_iHumanAbility = -1; - g_esXiphosTeammate[iPlayer].g_flOpenAreasOnly = -1.0; - g_esXiphosTeammate[iPlayer].g_iRequiresHumans = -1; - g_esXiphosTeammate[iPlayer].g_iXiphosAbility = -1; - g_esXiphosTeammate[iPlayer].g_iXiphosEffect = -1; - g_esXiphosTeammate[iPlayer].g_iXiphosMessage = -1; - g_esXiphosTeammate[iPlayer].g_flXiphosChance = -1.0; - g_esXiphosTeammate[iPlayer].g_iXiphosMaxHealth = -1; - } - } - } -} - -#if defined MT_ABILITIES_MAIN2 -void vXiphosConfigsLoaded(const char[] subsection, const char[] key, const char[] value, int type, int admin, int mode, bool special, const char[] specsection) -#else -public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const char[] value, int type, int admin, int mode, bool special, const char[] specsection) -#endif -{ - if ((mode == -1 || mode == 3) && bIsValidClient(admin)) - { - if (special && specsection[0] != '\0') - { - g_esXiphosTeammate[admin].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_XIPHOS_SECTION, MT_XIPHOS_SECTION2, MT_XIPHOS_SECTION3, MT_XIPHOS_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esXiphosTeammate[admin].g_flCloseAreasOnly, value, -1.0, 99999.0); - g_esXiphosTeammate[admin].g_iHumanAbility = iGetKeyValue(subsection, MT_XIPHOS_SECTION, MT_XIPHOS_SECTION2, MT_XIPHOS_SECTION3, MT_XIPHOS_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esXiphosTeammate[admin].g_iHumanAbility, value, -1, 1); - g_esXiphosTeammate[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_XIPHOS_SECTION, MT_XIPHOS_SECTION2, MT_XIPHOS_SECTION3, MT_XIPHOS_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esXiphosTeammate[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); - g_esXiphosTeammate[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_XIPHOS_SECTION, MT_XIPHOS_SECTION2, MT_XIPHOS_SECTION3, MT_XIPHOS_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esXiphosTeammate[admin].g_iRequiresHumans, value, -1, 32); - g_esXiphosTeammate[admin].g_iXiphosAbility = iGetKeyValue(subsection, MT_XIPHOS_SECTION, MT_XIPHOS_SECTION2, MT_XIPHOS_SECTION3, MT_XIPHOS_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esXiphosTeammate[admin].g_iXiphosAbility, value, -1, 1); - g_esXiphosTeammate[admin].g_iXiphosEffect = iGetKeyValue(subsection, MT_XIPHOS_SECTION, MT_XIPHOS_SECTION2, MT_XIPHOS_SECTION3, MT_XIPHOS_SECTION4, key, "AbilityEffect", "Ability Effect", "Ability_Effect", "effect", g_esXiphosTeammate[admin].g_iXiphosEffect, value, -1, 1); - g_esXiphosTeammate[admin].g_iXiphosMessage = iGetKeyValue(subsection, MT_XIPHOS_SECTION, MT_XIPHOS_SECTION2, MT_XIPHOS_SECTION3, MT_XIPHOS_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esXiphosTeammate[admin].g_iXiphosMessage, value, -1, 3); - g_esXiphosTeammate[admin].g_flXiphosChance = flGetKeyValue(subsection, MT_XIPHOS_SECTION, MT_XIPHOS_SECTION2, MT_XIPHOS_SECTION3, MT_XIPHOS_SECTION4, key, "XiphosChance", "Xiphos Chance", "Xiphos_Chance", "chance", g_esXiphosTeammate[admin].g_flXiphosChance, value, -1.0, 100.0); - g_esXiphosTeammate[admin].g_iXiphosMaxHealth = iGetKeyValue(subsection, MT_XIPHOS_SECTION, MT_XIPHOS_SECTION2, MT_XIPHOS_SECTION3, MT_XIPHOS_SECTION4, key, "XiphosMaxHealth", "Xiphos Max Health", "Xiphos_Max_Health", "maxhealth", g_esXiphosTeammate[admin].g_iXiphosMaxHealth, value, -1, MT_MAXHEALTH); - } - else - { - g_esXiphosPlayer[admin].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_XIPHOS_SECTION, MT_XIPHOS_SECTION2, MT_XIPHOS_SECTION3, MT_XIPHOS_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esXiphosPlayer[admin].g_flCloseAreasOnly, value, -1.0, 99999.0); - g_esXiphosPlayer[admin].g_iHumanAbility = iGetKeyValue(subsection, MT_XIPHOS_SECTION, MT_XIPHOS_SECTION2, MT_XIPHOS_SECTION3, MT_XIPHOS_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esXiphosPlayer[admin].g_iHumanAbility, value, -1, 1); - g_esXiphosPlayer[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_XIPHOS_SECTION, MT_XIPHOS_SECTION2, MT_XIPHOS_SECTION3, MT_XIPHOS_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esXiphosPlayer[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); - g_esXiphosPlayer[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_XIPHOS_SECTION, MT_XIPHOS_SECTION2, MT_XIPHOS_SECTION3, MT_XIPHOS_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esXiphosPlayer[admin].g_iRequiresHumans, value, -1, 32); - g_esXiphosPlayer[admin].g_iXiphosAbility = iGetKeyValue(subsection, MT_XIPHOS_SECTION, MT_XIPHOS_SECTION2, MT_XIPHOS_SECTION3, MT_XIPHOS_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esXiphosPlayer[admin].g_iXiphosAbility, value, -1, 1); - g_esXiphosPlayer[admin].g_iXiphosEffect = iGetKeyValue(subsection, MT_XIPHOS_SECTION, MT_XIPHOS_SECTION2, MT_XIPHOS_SECTION3, MT_XIPHOS_SECTION4, key, "AbilityEffect", "Ability Effect", "Ability_Effect", "effect", g_esXiphosPlayer[admin].g_iXiphosEffect, value, -1, 1); - g_esXiphosPlayer[admin].g_iXiphosMessage = iGetKeyValue(subsection, MT_XIPHOS_SECTION, MT_XIPHOS_SECTION2, MT_XIPHOS_SECTION3, MT_XIPHOS_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esXiphosPlayer[admin].g_iXiphosMessage, value, -1, 3); - g_esXiphosPlayer[admin].g_flXiphosChance = flGetKeyValue(subsection, MT_XIPHOS_SECTION, MT_XIPHOS_SECTION2, MT_XIPHOS_SECTION3, MT_XIPHOS_SECTION4, key, "XiphosChance", "Xiphos Chance", "Xiphos_Chance", "chance", g_esXiphosPlayer[admin].g_flXiphosChance, value, -1.0, 100.0); - g_esXiphosPlayer[admin].g_iXiphosMaxHealth = iGetKeyValue(subsection, MT_XIPHOS_SECTION, MT_XIPHOS_SECTION2, MT_XIPHOS_SECTION3, MT_XIPHOS_SECTION4, key, "XiphosMaxHealth", "Xiphos Max Health", "Xiphos_Max_Health", "maxhealth", g_esXiphosPlayer[admin].g_iXiphosMaxHealth, value, -1, MT_MAXHEALTH); - g_esXiphosPlayer[admin].g_iAccessFlags = iGetAdminFlagsValue(subsection, MT_XIPHOS_SECTION, MT_XIPHOS_SECTION2, MT_XIPHOS_SECTION3, MT_XIPHOS_SECTION4, key, "AccessFlags", "Access Flags", "Access_Flags", "access", value); - g_esXiphosPlayer[admin].g_iImmunityFlags = iGetAdminFlagsValue(subsection, MT_XIPHOS_SECTION, MT_XIPHOS_SECTION2, MT_XIPHOS_SECTION3, MT_XIPHOS_SECTION4, key, "ImmunityFlags", "Immunity Flags", "Immunity_Flags", "immunity", value); - } - } - - if (mode < 3 && type > 0) - { - if (special && specsection[0] != '\0') - { - g_esXiphosSpecial[type].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_XIPHOS_SECTION, MT_XIPHOS_SECTION2, MT_XIPHOS_SECTION3, MT_XIPHOS_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esXiphosSpecial[type].g_flCloseAreasOnly, value, -1.0, 99999.0); - g_esXiphosSpecial[type].g_iHumanAbility = iGetKeyValue(subsection, MT_XIPHOS_SECTION, MT_XIPHOS_SECTION2, MT_XIPHOS_SECTION3, MT_XIPHOS_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esXiphosSpecial[type].g_iHumanAbility, value, -1, 1); - g_esXiphosSpecial[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_XIPHOS_SECTION, MT_XIPHOS_SECTION2, MT_XIPHOS_SECTION3, MT_XIPHOS_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esXiphosSpecial[type].g_flOpenAreasOnly, value, -1.0, 99999.0); - g_esXiphosSpecial[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_XIPHOS_SECTION, MT_XIPHOS_SECTION2, MT_XIPHOS_SECTION3, MT_XIPHOS_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esXiphosSpecial[type].g_iRequiresHumans, value, -1, 32); - g_esXiphosSpecial[type].g_iXiphosAbility = iGetKeyValue(subsection, MT_XIPHOS_SECTION, MT_XIPHOS_SECTION2, MT_XIPHOS_SECTION3, MT_XIPHOS_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esXiphosSpecial[type].g_iXiphosAbility, value, -1, 1); - g_esXiphosSpecial[type].g_iXiphosEffect = iGetKeyValue(subsection, MT_XIPHOS_SECTION, MT_XIPHOS_SECTION2, MT_XIPHOS_SECTION3, MT_XIPHOS_SECTION4, key, "AbilityEffect", "Ability Effect", "Ability_Effect", "effect", g_esXiphosSpecial[type].g_iXiphosEffect, value, -1, 1); - g_esXiphosSpecial[type].g_iXiphosMessage = iGetKeyValue(subsection, MT_XIPHOS_SECTION, MT_XIPHOS_SECTION2, MT_XIPHOS_SECTION3, MT_XIPHOS_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esXiphosSpecial[type].g_iXiphosMessage, value, -1, 3); - g_esXiphosSpecial[type].g_flXiphosChance = flGetKeyValue(subsection, MT_XIPHOS_SECTION, MT_XIPHOS_SECTION2, MT_XIPHOS_SECTION3, MT_XIPHOS_SECTION4, key, "XiphosChance", "Xiphos Chance", "Xiphos_Chance", "chance", g_esXiphosSpecial[type].g_flXiphosChance, value, -1.0, 100.0); - g_esXiphosSpecial[type].g_iXiphosMaxHealth = iGetKeyValue(subsection, MT_XIPHOS_SECTION, MT_XIPHOS_SECTION2, MT_XIPHOS_SECTION3, MT_XIPHOS_SECTION4, key, "XiphosMaxHealth", "Xiphos Max Health", "Xiphos_Max_Health", "maxhealth", g_esXiphosSpecial[type].g_iXiphosMaxHealth, value, -1, MT_MAXHEALTH); - } - else - { - g_esXiphosAbility[type].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_XIPHOS_SECTION, MT_XIPHOS_SECTION2, MT_XIPHOS_SECTION3, MT_XIPHOS_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esXiphosAbility[type].g_flCloseAreasOnly, value, -1.0, 99999.0); - g_esXiphosAbility[type].g_iHumanAbility = iGetKeyValue(subsection, MT_XIPHOS_SECTION, MT_XIPHOS_SECTION2, MT_XIPHOS_SECTION3, MT_XIPHOS_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esXiphosAbility[type].g_iHumanAbility, value, -1, 1); - g_esXiphosAbility[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_XIPHOS_SECTION, MT_XIPHOS_SECTION2, MT_XIPHOS_SECTION3, MT_XIPHOS_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esXiphosAbility[type].g_flOpenAreasOnly, value, -1.0, 99999.0); - g_esXiphosAbility[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_XIPHOS_SECTION, MT_XIPHOS_SECTION2, MT_XIPHOS_SECTION3, MT_XIPHOS_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esXiphosAbility[type].g_iRequiresHumans, value, -1, 32); - g_esXiphosAbility[type].g_iXiphosAbility = iGetKeyValue(subsection, MT_XIPHOS_SECTION, MT_XIPHOS_SECTION2, MT_XIPHOS_SECTION3, MT_XIPHOS_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esXiphosAbility[type].g_iXiphosAbility, value, -1, 1); - g_esXiphosAbility[type].g_iXiphosEffect = iGetKeyValue(subsection, MT_XIPHOS_SECTION, MT_XIPHOS_SECTION2, MT_XIPHOS_SECTION3, MT_XIPHOS_SECTION4, key, "AbilityEffect", "Ability Effect", "Ability_Effect", "effect", g_esXiphosAbility[type].g_iXiphosEffect, value, -1, 1); - g_esXiphosAbility[type].g_iXiphosMessage = iGetKeyValue(subsection, MT_XIPHOS_SECTION, MT_XIPHOS_SECTION2, MT_XIPHOS_SECTION3, MT_XIPHOS_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esXiphosAbility[type].g_iXiphosMessage, value, -1, 3); - g_esXiphosAbility[type].g_flXiphosChance = flGetKeyValue(subsection, MT_XIPHOS_SECTION, MT_XIPHOS_SECTION2, MT_XIPHOS_SECTION3, MT_XIPHOS_SECTION4, key, "XiphosChance", "Xiphos Chance", "Xiphos_Chance", "chance", g_esXiphosAbility[type].g_flXiphosChance, value, -1.0, 100.0); - g_esXiphosAbility[type].g_iXiphosMaxHealth = iGetKeyValue(subsection, MT_XIPHOS_SECTION, MT_XIPHOS_SECTION2, MT_XIPHOS_SECTION3, MT_XIPHOS_SECTION4, key, "XiphosMaxHealth", "Xiphos Max Health", "Xiphos_Max_Health", "maxhealth", g_esXiphosAbility[type].g_iXiphosMaxHealth, value, -1, MT_MAXHEALTH); - g_esXiphosAbility[type].g_iAccessFlags = iGetAdminFlagsValue(subsection, MT_XIPHOS_SECTION, MT_XIPHOS_SECTION2, MT_XIPHOS_SECTION3, MT_XIPHOS_SECTION4, key, "AccessFlags", "Access Flags", "Access_Flags", "access", value); - g_esXiphosAbility[type].g_iImmunityFlags = iGetAdminFlagsValue(subsection, MT_XIPHOS_SECTION, MT_XIPHOS_SECTION2, MT_XIPHOS_SECTION3, MT_XIPHOS_SECTION4, key, "ImmunityFlags", "Immunity Flags", "Immunity_Flags", "immunity", value); - } - } -} - -#if defined MT_ABILITIES_MAIN2 -void vXiphosSettingsCached(int tank, bool apply, int type) -#else -public void MT_OnSettingsCached(int tank, bool apply, int type) -#endif -{ - bool bHuman = bIsValidClient(tank, MT_CHECK_FAKECLIENT); - g_esXiphosPlayer[tank].g_iTankTypeRecorded = apply ? MT_GetRecordedTankType(tank, type) : 0; - g_esXiphosPlayer[tank].g_iTankType = apply ? type : 0; - int iType = g_esXiphosPlayer[tank].g_iTankTypeRecorded; - - if (bIsSpecialInfected(tank, MT_CHECK_INDEX|MT_CHECK_INGAME)) - { - g_esXiphosCache[tank].g_flCloseAreasOnly = flGetSubSettingValue(apply, bHuman, g_esXiphosTeammate[tank].g_flCloseAreasOnly, g_esXiphosPlayer[tank].g_flCloseAreasOnly, g_esXiphosSpecial[iType].g_flCloseAreasOnly, g_esXiphosAbility[iType].g_flCloseAreasOnly, 1); - g_esXiphosCache[tank].g_flXiphosChance = flGetSubSettingValue(apply, bHuman, g_esXiphosTeammate[tank].g_flXiphosChance, g_esXiphosPlayer[tank].g_flXiphosChance, g_esXiphosSpecial[iType].g_flXiphosChance, g_esXiphosAbility[iType].g_flXiphosChance, 1); - g_esXiphosCache[tank].g_iHumanAbility = iGetSubSettingValue(apply, bHuman, g_esXiphosTeammate[tank].g_iHumanAbility, g_esXiphosPlayer[tank].g_iHumanAbility, g_esXiphosSpecial[iType].g_iHumanAbility, g_esXiphosAbility[iType].g_iHumanAbility, 1); - g_esXiphosCache[tank].g_flOpenAreasOnly = flGetSubSettingValue(apply, bHuman, g_esXiphosTeammate[tank].g_flOpenAreasOnly, g_esXiphosPlayer[tank].g_flOpenAreasOnly, g_esXiphosSpecial[iType].g_flOpenAreasOnly, g_esXiphosAbility[iType].g_flOpenAreasOnly, 1); - g_esXiphosCache[tank].g_iRequiresHumans = iGetSubSettingValue(apply, bHuman, g_esXiphosTeammate[tank].g_iRequiresHumans, g_esXiphosPlayer[tank].g_iRequiresHumans, g_esXiphosSpecial[iType].g_iRequiresHumans, g_esXiphosAbility[iType].g_iRequiresHumans, 1); - g_esXiphosCache[tank].g_iXiphosAbility = iGetSubSettingValue(apply, bHuman, g_esXiphosTeammate[tank].g_iXiphosAbility, g_esXiphosPlayer[tank].g_iXiphosAbility, g_esXiphosSpecial[iType].g_iXiphosAbility, g_esXiphosAbility[iType].g_iXiphosAbility, 1); - g_esXiphosCache[tank].g_iXiphosEffect = iGetSubSettingValue(apply, bHuman, g_esXiphosTeammate[tank].g_iXiphosEffect, g_esXiphosPlayer[tank].g_iXiphosEffect, g_esXiphosSpecial[iType].g_iXiphosEffect, g_esXiphosAbility[iType].g_iXiphosEffect, 1); - g_esXiphosCache[tank].g_iXiphosMaxHealth = iGetSubSettingValue(apply, bHuman, g_esXiphosTeammate[tank].g_iXiphosMaxHealth, g_esXiphosPlayer[tank].g_iXiphosMaxHealth, g_esXiphosSpecial[iType].g_iXiphosMaxHealth, g_esXiphosAbility[iType].g_iXiphosMaxHealth, 1); - g_esXiphosCache[tank].g_iXiphosMessage = iGetSubSettingValue(apply, bHuman, g_esXiphosTeammate[tank].g_iXiphosMessage, g_esXiphosPlayer[tank].g_iXiphosMessage, g_esXiphosSpecial[iType].g_iXiphosMessage, g_esXiphosAbility[iType].g_iXiphosMessage, 1); - } - else - { - g_esXiphosCache[tank].g_flCloseAreasOnly = flGetSettingValue(apply, bHuman, g_esXiphosPlayer[tank].g_flCloseAreasOnly, g_esXiphosAbility[iType].g_flCloseAreasOnly, 1); - g_esXiphosCache[tank].g_flXiphosChance = flGetSettingValue(apply, bHuman, g_esXiphosPlayer[tank].g_flXiphosChance, g_esXiphosAbility[iType].g_flXiphosChance, 1); - g_esXiphosCache[tank].g_iHumanAbility = iGetSettingValue(apply, bHuman, g_esXiphosPlayer[tank].g_iHumanAbility, g_esXiphosAbility[iType].g_iHumanAbility, 1); - g_esXiphosCache[tank].g_flOpenAreasOnly = flGetSettingValue(apply, bHuman, g_esXiphosPlayer[tank].g_flOpenAreasOnly, g_esXiphosAbility[iType].g_flOpenAreasOnly, 1); - g_esXiphosCache[tank].g_iRequiresHumans = iGetSettingValue(apply, bHuman, g_esXiphosPlayer[tank].g_iRequiresHumans, g_esXiphosAbility[iType].g_iRequiresHumans, 1); - g_esXiphosCache[tank].g_iXiphosAbility = iGetSettingValue(apply, bHuman, g_esXiphosPlayer[tank].g_iXiphosAbility, g_esXiphosAbility[iType].g_iXiphosAbility, 1); - g_esXiphosCache[tank].g_iXiphosEffect = iGetSettingValue(apply, bHuman, g_esXiphosPlayer[tank].g_iXiphosEffect, g_esXiphosAbility[iType].g_iXiphosEffect, 1); - g_esXiphosCache[tank].g_iXiphosMaxHealth = iGetSettingValue(apply, bHuman, g_esXiphosPlayer[tank].g_iXiphosMaxHealth, g_esXiphosAbility[iType].g_iXiphosMaxHealth, 1); - g_esXiphosCache[tank].g_iXiphosMessage = iGetSettingValue(apply, bHuman, g_esXiphosPlayer[tank].g_iXiphosMessage, g_esXiphosAbility[iType].g_iXiphosMessage, 1); - } -} - -#if !defined MT_ABILITIES_MAIN2 -public void MT_OnPluginUpdate() -{ - MT_ReloadPlugin(null); -} -#endif - -void vXiphos(int attacker, int victim, float damage, bool tank) -{ - int iTank = tank ? attacker : victim, - iDamage = (damage < 1.0) ? 1 : RoundToNearest(damage), - iHealth = GetEntProp(attacker, Prop_Data, "m_iHealth"), - iMaxHealth = tank ? MT_MAXHEALTH : g_esXiphosCache[iTank].g_iXiphosMaxHealth, - iNewHealth = (iHealth + iDamage), iLeftover = 0, iFinalHealth = 0, iTotalHealth = 0; - iMaxHealth = (!tank && g_esXiphosCache[iTank].g_iXiphosMaxHealth == 0) ? GetEntProp(attacker, Prop_Data, "m_iMaxHealth") : iMaxHealth; - iLeftover = (iNewHealth > iMaxHealth) ? (iNewHealth - iMaxHealth) : iNewHealth; - iFinalHealth = iClamp(iNewHealth, 1, iMaxHealth); - iTotalHealth = (iNewHealth > iMaxHealth) ? iLeftover : iDamage; - SetEntProp(attacker, Prop_Data, "m_iHealth", iFinalHealth); - - if (tank) - { - MT_TankMaxHealth(attacker, 3, (MT_TankMaxHealth(attacker, 1) + iTotalHealth)); - } - - int iFlag = tank ? MT_XIPHOS_TANK : MT_XIPHOS_SURVIVOR; - if (g_esXiphosCache[iTank].g_iXiphosMessage & iFlag) - { - char sTankName[64]; - MT_GetTankName(iTank, sTankName); - - switch (tank) - { - case true: - { - MT_PrintToChatAll("%s %t", MT_TAG2, "Xiphos", sTankName, victim); - MT_LogMessage(MT_LOG_ABILITY, "%s %T", MT_TAG, "Xiphos", LANG_SERVER, sTankName, victim); - } - case false: - { - MT_PrintToChatAll("%s %t", MT_TAG2, "Xiphos2", attacker, sTankName); - MT_LogMessage(MT_LOG_ABILITY, "%s %T", MT_TAG, "Xiphos2", LANG_SERVER, attacker, sTankName); - } - } - } -} \ No newline at end of file diff --git a/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_yell.sp b/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_yell.sp index 621b575192..efc0d579d8 100644 --- a/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_yell.sp +++ b/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_yell.sp @@ -1,6 +1,6 @@ /** - * Mutant Tanks: a L4D/L4D2 SourceMod Plugin - * Copyright (C) 2024 Alfred "Psyk0tik" Llagas + * Mutant Tanks: A L4D/L4D2 SourceMod Plugin + * Copyright (C) 2017-2025 Alfred "Psyk0tik" Llagas * * 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. * @@ -29,6 +29,8 @@ public Plugin myinfo = bool g_bDedicated, g_bSecondGame; +int g_iGraphicsLevel; + public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max) { switch (GetEngineVersion()) @@ -374,7 +376,15 @@ int iYellMenuHandler(Menu menu, MenuAction action, int param1, int param2) case 0: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esYellCache[param1].g_iYellAbility == 0) ? "AbilityStatus1" : "AbilityStatus2"); case 1: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityAmmo", (g_esYellCache[param1].g_iHumanAmmo - g_esYellPlayer[param1].g_iAmmoCount), g_esYellCache[param1].g_iHumanAmmo); case 2: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtons"); - case 3: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esYellCache[param1].g_iHumanMode == 0) ? "AbilityButtonMode1" : "AbilityButtonMode2"); + case 3: + { + switch (g_esYellCache[param1].g_iHumanMode) + { + case 0: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtonMode1"); + case 1: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtonMode2"); + case 2: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtonMode3"); + } + } case 4: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityCooldown", ((g_esYellCache[param1].g_iHumanAbility == 1) ? g_esYellCache[param1].g_iHumanCooldown : g_esYellCache[param1].g_iYellCooldown)); case 5: MT_PrintToChat(param1, "%s %t", MT_TAG3, "YellDetails"); case 6: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityDuration2", ((g_esYellCache[param1].g_iHumanAbility == 1) ? g_esYellCache[param1].g_iHumanDuration : g_esYellCache[param1].g_iYellDuration)); @@ -659,7 +669,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esYellTeammate[admin].g_iHumanAmmo = iGetKeyValue(subsection, MT_YELL_SECTION, MT_YELL_SECTION2, MT_YELL_SECTION3, MT_YELL_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esYellTeammate[admin].g_iHumanAmmo, value, -1, 99999); g_esYellTeammate[admin].g_iHumanCooldown = iGetKeyValue(subsection, MT_YELL_SECTION, MT_YELL_SECTION2, MT_YELL_SECTION3, MT_YELL_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esYellTeammate[admin].g_iHumanCooldown, value, -1, 99999); g_esYellTeammate[admin].g_iHumanDuration = iGetKeyValue(subsection, MT_YELL_SECTION, MT_YELL_SECTION2, MT_YELL_SECTION3, MT_YELL_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esYellTeammate[admin].g_iHumanDuration, value, -1, 99999); - g_esYellTeammate[admin].g_iHumanMode = iGetKeyValue(subsection, MT_YELL_SECTION, MT_YELL_SECTION2, MT_YELL_SECTION3, MT_YELL_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esYellTeammate[admin].g_iHumanMode, value, -1, 1); + g_esYellTeammate[admin].g_iHumanMode = iGetKeyValue(subsection, MT_YELL_SECTION, MT_YELL_SECTION2, MT_YELL_SECTION3, MT_YELL_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esYellTeammate[admin].g_iHumanMode, value, -1, 2); g_esYellTeammate[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_YELL_SECTION, MT_YELL_SECTION2, MT_YELL_SECTION3, MT_YELL_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esYellTeammate[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); g_esYellTeammate[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_YELL_SECTION, MT_YELL_SECTION2, MT_YELL_SECTION3, MT_YELL_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esYellTeammate[admin].g_iRequiresHumans, value, -1, 32); g_esYellTeammate[admin].g_iYellAbility = iGetKeyValue(subsection, MT_YELL_SECTION, MT_YELL_SECTION2, MT_YELL_SECTION3, MT_YELL_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esYellTeammate[admin].g_iYellAbility, value, -1, 1); @@ -682,7 +692,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esYellPlayer[admin].g_iHumanAmmo = iGetKeyValue(subsection, MT_YELL_SECTION, MT_YELL_SECTION2, MT_YELL_SECTION3, MT_YELL_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esYellPlayer[admin].g_iHumanAmmo, value, -1, 99999); g_esYellPlayer[admin].g_iHumanCooldown = iGetKeyValue(subsection, MT_YELL_SECTION, MT_YELL_SECTION2, MT_YELL_SECTION3, MT_YELL_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esYellPlayer[admin].g_iHumanCooldown, value, -1, 99999); g_esYellPlayer[admin].g_iHumanDuration = iGetKeyValue(subsection, MT_YELL_SECTION, MT_YELL_SECTION2, MT_YELL_SECTION3, MT_YELL_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esYellPlayer[admin].g_iHumanDuration, value, -1, 99999); - g_esYellPlayer[admin].g_iHumanMode = iGetKeyValue(subsection, MT_YELL_SECTION, MT_YELL_SECTION2, MT_YELL_SECTION3, MT_YELL_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esYellPlayer[admin].g_iHumanMode, value, -1, 1); + g_esYellPlayer[admin].g_iHumanMode = iGetKeyValue(subsection, MT_YELL_SECTION, MT_YELL_SECTION2, MT_YELL_SECTION3, MT_YELL_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esYellPlayer[admin].g_iHumanMode, value, -1, 2); g_esYellPlayer[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_YELL_SECTION, MT_YELL_SECTION2, MT_YELL_SECTION3, MT_YELL_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esYellPlayer[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); g_esYellPlayer[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_YELL_SECTION, MT_YELL_SECTION2, MT_YELL_SECTION3, MT_YELL_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esYellPlayer[admin].g_iRequiresHumans, value, -1, 32); g_esYellPlayer[admin].g_iYellAbility = iGetKeyValue(subsection, MT_YELL_SECTION, MT_YELL_SECTION2, MT_YELL_SECTION3, MT_YELL_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esYellPlayer[admin].g_iYellAbility, value, -1, 1); @@ -711,7 +721,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esYellSpecial[type].g_iHumanAmmo = iGetKeyValue(subsection, MT_YELL_SECTION, MT_YELL_SECTION2, MT_YELL_SECTION3, MT_YELL_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esYellSpecial[type].g_iHumanAmmo, value, -1, 99999); g_esYellSpecial[type].g_iHumanCooldown = iGetKeyValue(subsection, MT_YELL_SECTION, MT_YELL_SECTION2, MT_YELL_SECTION3, MT_YELL_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esYellSpecial[type].g_iHumanCooldown, value, -1, 99999); g_esYellSpecial[type].g_iHumanDuration = iGetKeyValue(subsection, MT_YELL_SECTION, MT_YELL_SECTION2, MT_YELL_SECTION3, MT_YELL_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esYellSpecial[type].g_iHumanDuration, value, -1, 99999); - g_esYellSpecial[type].g_iHumanMode = iGetKeyValue(subsection, MT_YELL_SECTION, MT_YELL_SECTION2, MT_YELL_SECTION3, MT_YELL_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esYellSpecial[type].g_iHumanMode, value, -1, 1); + g_esYellSpecial[type].g_iHumanMode = iGetKeyValue(subsection, MT_YELL_SECTION, MT_YELL_SECTION2, MT_YELL_SECTION3, MT_YELL_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esYellSpecial[type].g_iHumanMode, value, -1, 2); g_esYellSpecial[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_YELL_SECTION, MT_YELL_SECTION2, MT_YELL_SECTION3, MT_YELL_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esYellSpecial[type].g_flOpenAreasOnly, value, -1.0, 99999.0); g_esYellSpecial[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_YELL_SECTION, MT_YELL_SECTION2, MT_YELL_SECTION3, MT_YELL_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esYellSpecial[type].g_iRequiresHumans, value, -1, 32); g_esYellSpecial[type].g_iYellAbility = iGetKeyValue(subsection, MT_YELL_SECTION, MT_YELL_SECTION2, MT_YELL_SECTION3, MT_YELL_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esYellSpecial[type].g_iYellAbility, value, -1, 1); @@ -734,7 +744,7 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const g_esYellAbility[type].g_iHumanAmmo = iGetKeyValue(subsection, MT_YELL_SECTION, MT_YELL_SECTION2, MT_YELL_SECTION3, MT_YELL_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esYellAbility[type].g_iHumanAmmo, value, -1, 99999); g_esYellAbility[type].g_iHumanCooldown = iGetKeyValue(subsection, MT_YELL_SECTION, MT_YELL_SECTION2, MT_YELL_SECTION3, MT_YELL_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esYellAbility[type].g_iHumanCooldown, value, -1, 99999); g_esYellAbility[type].g_iHumanDuration = iGetKeyValue(subsection, MT_YELL_SECTION, MT_YELL_SECTION2, MT_YELL_SECTION3, MT_YELL_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esYellAbility[type].g_iHumanDuration, value, -1, 99999); - g_esYellAbility[type].g_iHumanMode = iGetKeyValue(subsection, MT_YELL_SECTION, MT_YELL_SECTION2, MT_YELL_SECTION3, MT_YELL_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esYellAbility[type].g_iHumanMode, value, -1, 1); + g_esYellAbility[type].g_iHumanMode = iGetKeyValue(subsection, MT_YELL_SECTION, MT_YELL_SECTION2, MT_YELL_SECTION3, MT_YELL_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esYellAbility[type].g_iHumanMode, value, -1, 2); g_esYellAbility[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_YELL_SECTION, MT_YELL_SECTION2, MT_YELL_SECTION3, MT_YELL_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esYellAbility[type].g_flOpenAreasOnly, value, -1.0, 99999.0); g_esYellAbility[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_YELL_SECTION, MT_YELL_SECTION2, MT_YELL_SECTION3, MT_YELL_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esYellAbility[type].g_iRequiresHumans, value, -1, 32); g_esYellAbility[type].g_iYellAbility = iGetKeyValue(subsection, MT_YELL_SECTION, MT_YELL_SECTION2, MT_YELL_SECTION3, MT_YELL_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esYellAbility[type].g_iYellAbility, value, -1, 1); @@ -764,7 +774,9 @@ public void MT_OnSettingsCached(int tank, bool apply, int type) g_esYellPlayer[tank].g_iTankTypeRecorded = apply ? MT_GetRecordedTankType(tank, type) : 0; g_esYellPlayer[tank].g_iTankType = apply ? type : 0; int iType = g_esYellPlayer[tank].g_iTankTypeRecorded; - +#if !defined MT_ABILITIES_MAIN2 + g_iGraphicsLevel = MT_GetGraphicsLevel(); +#endif if (bIsSpecialInfected(tank, MT_CHECK_INDEX|MT_CHECK_INGAME)) { g_esYellCache[tank].g_flCloseAreasOnly = flGetSubSettingValue(apply, bHuman, g_esYellTeammate[tank].g_flCloseAreasOnly, g_esYellPlayer[tank].g_flCloseAreasOnly, g_esYellSpecial[iType].g_flCloseAreasOnly, g_esYellAbility[iType].g_flCloseAreasOnly, 1); @@ -906,10 +918,10 @@ public void MT_OnButtonPressed(int tank, int button) if ((button & MT_MAIN_KEY) && g_esYellCache[tank].g_iYellAbility == 1 && g_esYellCache[tank].g_iHumanAbility == 1) { - int iTime = GetTime(); + int iHumanMode = g_esYellCache[tank].g_iHumanMode, iTime = GetTime(); bool bRecharging = g_esYellPlayer[tank].g_iCooldown != -1 && g_esYellPlayer[tank].g_iCooldown >= iTime; - switch (g_esYellCache[tank].g_iHumanMode) + switch (iHumanMode) { case 0: { @@ -926,9 +938,9 @@ public void MT_OnButtonPressed(int tank, int button) MT_PrintToChat(tank, "%s %t", MT_TAG3, "YellHuman4", (g_esYellPlayer[tank].g_iCooldown - iTime)); } } - case 1: + case 1, 2: { - if (g_esYellPlayer[tank].g_iAmmoCount < g_esYellCache[tank].g_iHumanAmmo && g_esYellCache[tank].g_iHumanAmmo > 0) + if ((iHumanMode == 2 && g_esYellPlayer[tank].g_bActivated) || (g_esYellPlayer[tank].g_iAmmoCount < g_esYellCache[tank].g_iHumanAmmo && g_esYellCache[tank].g_iHumanAmmo > 0)) { if (!g_esYellPlayer[tank].g_bActivated && !bRecharging) { @@ -940,7 +952,15 @@ public void MT_OnButtonPressed(int tank, int button) } else if (g_esYellPlayer[tank].g_bActivated) { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "YellHuman3"); + switch (iHumanMode) + { + case 1: MT_PrintToChat(tank, "%s %t", MT_TAG3, "YellHuman3"); + case 2: + { + vYellReset2(tank); + vYellReset3(tank); + } + } } else if (bRecharging) { @@ -1100,18 +1120,20 @@ void vYellReset3(int tank) } } -void tTimerYellCombo(Handle timer, DataPack pack) +Action tTimerYellCombo(Handle timer, DataPack pack) { pack.Reset(); int iTank = GetClientOfUserId(pack.ReadCell()); if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esYellAbility[g_esYellPlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esYellPlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esYellPlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esYellCache[iTank].g_iYellAbility == 0 || g_esYellPlayer[iTank].g_bActivated) { - return; + return Plugin_Stop; } int iPos = pack.ReadCell(); vYell(iTank, iPos); + + return Plugin_Continue; } Action tTimerYell(Handle timer, DataPack pack) @@ -1183,8 +1205,11 @@ Action tTimerYell(Handle timer, DataPack pack) } } - TE_SetupBeamRingPoint(flTankPos, 10.0, (flRange * 2.0), g_iBeamSprite, g_iHaloSprite, 0, 50, 1.0, 88.0, 3.0, iBeamColor, 1000, 0); - TE_SendToAll(); + if (g_iGraphicsLevel > 2) + { + TE_SetupBeamRingPoint(flTankPos, 10.0, (flRange * 2.0), g_iBeamSprite, g_iHaloSprite, 0, 50, 1.0, 88.0, 3.0, iBeamColor, 1000, 0); + TE_SendToAll(); + } return Plugin_Continue; } \ No newline at end of file diff --git a/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_zombie.sp b/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_zombie.sp deleted file mode 100644 index c53807a9c3..0000000000 --- a/addons/sourcemod/scripting/mutant_tanks/abilities2/mt_zombie.sp +++ /dev/null @@ -1,1186 +0,0 @@ -/** - * Mutant Tanks: a L4D/L4D2 SourceMod Plugin - * Copyright (C) 2024 Alfred "Psyk0tik" Llagas - * - * 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 . - **/ - -#define MT_ZOMBIE_COMPILE_METHOD 0 // 0: packaged, 1: standalone - -#if !defined MT_ABILITIES_MAIN2 - #if MT_ZOMBIE_COMPILE_METHOD == 1 - #include - #include - #else - #error This file must be inside "scripting/mutant_tanks/abilities2" while compiling "mt_abilities2.sp" to include its content. - #endif -public Plugin myinfo = -{ - name = "[MT] Zombie Ability", - author = MT_AUTHOR, - description = "The Mutant Tank spawns zombies.", - version = MT_VERSION, - url = MT_URL -}; - -bool g_bDedicated, g_bSecondGame; - -public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max) -{ - switch (GetEngineVersion()) - { - case Engine_Left4Dead: g_bSecondGame = false; - case Engine_Left4Dead2: g_bSecondGame = true; - default: - { - strcopy(error, err_max, "\"[MT] Zombie Ability\" only supports Left 4 Dead 1 & 2."); - - return APLRes_SilentFailure; - } - } - - g_bDedicated = IsDedicatedServer(); - - return APLRes_Success; -} - -#define MODEL_CEDA "models/infected/common_male_ceda.mdl" -#define MODEL_CLOWN "models/infected/common_male_clown.mdl" -#define MODEL_FALLEN "models/infected/common_male_fallen_survivor.mdl" -#define MODEL_JIMMY "models/infected/common_male_jimmy.mdl" -#define MODEL_MUDMAN "models/infected/common_male_mud.mdl" -#define MODEL_RIOTCOP "models/infected/common_male_riot.mdl" -#define MODEL_ROADCREW "models/infected/common_male_roadcrew.mdl" -#else - #if MT_ZOMBIE_COMPILE_METHOD == 1 - #error This file must be compiled as a standalone plugin. - #endif -#endif - -#define MT_ZOMBIE_SECTION "zombieability" -#define MT_ZOMBIE_SECTION2 "zombie ability" -#define MT_ZOMBIE_SECTION3 "zombie_ability" -#define MT_ZOMBIE_SECTION4 "zombie" - -#define MT_MENU_ZOMBIE "Zombie Ability" - -enum struct esZombiePlayer -{ - bool g_bActivated; - - float g_flCloseAreasOnly; - float g_flOpenAreasOnly; - float g_flZombieChance; - float g_flZombieInterval; - - int g_iAccessFlags; - int g_iAmmoCount; - int g_iComboAbility; - int g_iCooldown; - int g_iHumanAbility; - int g_iHumanAmmo; - int g_iHumanCooldown; - int g_iHumanDuration; - int g_iHumanMode; - int g_iRequiresHumans; - int g_iTankType; - int g_iTankTypeRecorded; - int g_iZombieAbility; - int g_iZombieAmount; - int g_iZombieCooldown; - int g_iZombieDuration; - int g_iZombieMessage; - int g_iZombieMode; - int g_iZombieType; -} - -esZombiePlayer g_esZombiePlayer[MAXPLAYERS + 1]; - -enum struct esZombieTeammate -{ - float g_flCloseAreasOnly; - float g_flOpenAreasOnly; - float g_flZombieChance; - float g_flZombieInterval; - - int g_iComboAbility; - int g_iHumanAbility; - int g_iHumanAmmo; - int g_iHumanCooldown; - int g_iHumanDuration; - int g_iHumanMode; - int g_iRequiresHumans; - int g_iZombieAbility; - int g_iZombieAmount; - int g_iZombieCooldown; - int g_iZombieDuration; - int g_iZombieMessage; - int g_iZombieMode; - int g_iZombieType; -} - -esZombieTeammate g_esZombieTeammate[MAXPLAYERS + 1]; - -enum struct esZombieAbility -{ - float g_flCloseAreasOnly; - float g_flOpenAreasOnly; - float g_flZombieChance; - float g_flZombieInterval; - - int g_iAccessFlags; - int g_iComboAbility; - int g_iComboPosition; - int g_iHumanAbility; - int g_iHumanAmmo; - int g_iHumanCooldown; - int g_iHumanDuration; - int g_iHumanMode; - int g_iRequiresHumans; - int g_iZombieAbility; - int g_iZombieAmount; - int g_iZombieCooldown; - int g_iZombieDuration; - int g_iZombieMessage; - int g_iZombieMode; - int g_iZombieType; -} - -esZombieAbility g_esZombieAbility[MT_MAXTYPES + 1]; - -enum struct esZombieSpecial -{ - float g_flCloseAreasOnly; - float g_flOpenAreasOnly; - float g_flZombieChance; - float g_flZombieInterval; - - int g_iComboAbility; - int g_iHumanAbility; - int g_iHumanAmmo; - int g_iHumanCooldown; - int g_iHumanDuration; - int g_iHumanMode; - int g_iRequiresHumans; - int g_iZombieAbility; - int g_iZombieAmount; - int g_iZombieCooldown; - int g_iZombieDuration; - int g_iZombieMessage; - int g_iZombieMode; - int g_iZombieType; -} - -esZombieSpecial g_esZombieSpecial[MT_MAXTYPES + 1]; - -enum struct esZombieCache -{ - float g_flCloseAreasOnly; - float g_flOpenAreasOnly; - float g_flZombieChance; - float g_flZombieInterval; - - int g_iComboAbility; - int g_iHumanAbility; - int g_iHumanAmmo; - int g_iHumanCooldown; - int g_iHumanDuration; - int g_iHumanMode; - int g_iRequiresHumans; - int g_iZombieAbility; - int g_iZombieAmount; - int g_iZombieCooldown; - int g_iZombieDuration; - int g_iZombieMessage; - int g_iZombieMode; - int g_iZombieType; -} - -esZombieCache g_esZombieCache[MAXPLAYERS + 1]; - -#if !defined MT_ABILITIES_MAIN2 -public void OnPluginStart() -{ - LoadTranslations("common.phrases"); - LoadTranslations("mutant_tanks.phrases"); - LoadTranslations("mutant_tanks_names.phrases"); - - RegConsoleCmd("sm_mt_zombie", cmdZombieInfo, "View information about the Zombie ability."); -} -#endif - -#if defined MT_ABILITIES_MAIN2 -void vZombieMapStart() -#else -public void OnMapStart() -#endif -{ - PrecacheModel(MODEL_CEDA, true); - PrecacheModel(MODEL_CLOWN, true); - PrecacheModel(MODEL_FALLEN, true); - PrecacheModel(MODEL_JIMMY, true); - PrecacheModel(MODEL_MUDMAN, true); - PrecacheModel(MODEL_RIOTCOP, true); - PrecacheModel(MODEL_ROADCREW, true); - - vZombieReset(); -} - -#if defined MT_ABILITIES_MAIN2 -void vZombieClientPutInServer(int client) -#else -public void OnClientPutInServer(int client) -#endif -{ - vRemoveZombie(client); -} - -#if defined MT_ABILITIES_MAIN2 -void vZombieClientDisconnect_Post(int client) -#else -public void OnClientDisconnect_Post(int client) -#endif -{ - vRemoveZombie(client); -} - -#if defined MT_ABILITIES_MAIN2 -void vZombieMapEnd() -#else -public void OnMapEnd() -#endif -{ - vZombieReset(); -} - -#if !defined MT_ABILITIES_MAIN2 -Action cmdZombieInfo(int client, int args) -{ - client = iGetListenServerHost(client, g_bDedicated); - - if (!MT_IsCorePluginEnabled()) - { - MT_ReplyToCommand(client, "%s %t", MT_TAG5, "PluginDisabled"); - - return Plugin_Handled; - } - - if (!bIsValidClient(client, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_FAKECLIENT)) - { - MT_ReplyToCommand(client, "%s %t", MT_TAG, "Command is in-game only"); - - return Plugin_Handled; - } - - switch (IsVoteInProgress()) - { - case true: MT_ReplyToCommand(client, "%s %t", MT_TAG2, "Vote in Progress"); - case false: vZombieMenu(client, MT_ZOMBIE_SECTION4, 0); - } - - return Plugin_Handled; -} -#endif - -void vZombieMenu(int client, const char[] name, int item) -{ - if (StrContains(MT_ZOMBIE_SECTION4, name, false) == -1) - { - return; - } - - Menu mAbilityMenu = new Menu(iZombieMenuHandler, MENU_ACTIONS_DEFAULT|MenuAction_Display|MenuAction_DisplayItem); - mAbilityMenu.SetTitle("Zombie Ability Information"); - mAbilityMenu.AddItem("Status", "Status"); - mAbilityMenu.AddItem("Ammunition", "Ammunition"); - mAbilityMenu.AddItem("Buttons", "Buttons"); - mAbilityMenu.AddItem("Button Mode", "Button Mode"); - mAbilityMenu.AddItem("Cooldown", "Cooldown"); - mAbilityMenu.AddItem("Details", "Details"); - mAbilityMenu.AddItem("Duration", "Duration"); - mAbilityMenu.AddItem("Human Support", "Human Support"); - mAbilityMenu.DisplayAt(client, item, MENU_TIME_FOREVER); -} - -int iZombieMenuHandler(Menu menu, MenuAction action, int param1, int param2) -{ - switch (action) - { - case MenuAction_End: delete menu; - case MenuAction_Select: - { - switch (param2) - { - case 0: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esZombieCache[param1].g_iZombieAbility == 0) ? "AbilityStatus1" : "AbilityStatus2"); - case 1: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityAmmo", (g_esZombieCache[param1].g_iHumanAmmo - g_esZombiePlayer[param1].g_iAmmoCount), g_esZombieCache[param1].g_iHumanAmmo); - case 2: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityButtons"); - case 3: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esZombieCache[param1].g_iHumanMode == 0) ? "AbilityButtonMode1" : "AbilityButtonMode2"); - case 4: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityCooldown", ((g_esZombieCache[param1].g_iHumanAbility == 1) ? g_esZombieCache[param1].g_iHumanCooldown : g_esZombieCache[param1].g_iZombieCooldown)); - case 5: MT_PrintToChat(param1, "%s %t", MT_TAG3, "ZombieDetails"); - case 6: MT_PrintToChat(param1, "%s %t", MT_TAG3, "AbilityDuration2", ((g_esZombieCache[param1].g_iHumanAbility == 1) ? g_esZombieCache[param1].g_iHumanDuration : g_esZombieCache[param1].g_iZombieDuration)); - case 7: MT_PrintToChat(param1, "%s %t", MT_TAG3, (g_esZombieCache[param1].g_iHumanAbility == 0) ? "AbilityHumanSupport1" : "AbilityHumanSupport2"); - } - - if (bIsValidClient(param1, MT_CHECK_INGAME)) - { - vZombieMenu(param1, MT_ZOMBIE_SECTION4, menu.Selection); - } - } - case MenuAction_Display: - { - char sMenuTitle[PLATFORM_MAX_PATH]; - Panel pZombie = view_as(param2); - FormatEx(sMenuTitle, sizeof sMenuTitle, "%T", "ZombieMenu", param1); - pZombie.SetTitle(sMenuTitle); - } - case MenuAction_DisplayItem: - { - if (param2 >= 0) - { - char sMenuOption[PLATFORM_MAX_PATH]; - - switch (param2) - { - case 0: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Status", param1); - case 1: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Ammunition", param1); - case 2: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Buttons", param1); - case 3: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "ButtonMode", param1); - case 4: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Cooldown", param1); - case 5: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Details", param1); - case 6: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "Duration", param1); - case 7: FormatEx(sMenuOption, sizeof sMenuOption, "%T", "HumanSupport", param1); - } - - return RedrawMenuItem(sMenuOption); - } - } - } - - return 0; -} - -#if defined MT_ABILITIES_MAIN2 -void vZombieDisplayMenu(Menu menu) -#else -public void MT_OnDisplayMenu(Menu menu) -#endif -{ - menu.AddItem(MT_MENU_ZOMBIE, MT_MENU_ZOMBIE); -} - -#if defined MT_ABILITIES_MAIN2 -void vZombieMenuItemSelected(int client, const char[] info) -#else -public void MT_OnMenuItemSelected(int client, const char[] info) -#endif -{ - if (StrEqual(info, MT_MENU_ZOMBIE, false)) - { - vZombieMenu(client, MT_ZOMBIE_SECTION4, 0); - } -} - -#if defined MT_ABILITIES_MAIN2 -void vZombieMenuItemDisplayed(int client, const char[] info, char[] buffer, int size) -#else -public void MT_OnMenuItemDisplayed(int client, const char[] info, char[] buffer, int size) -#endif -{ - if (StrEqual(info, MT_MENU_ZOMBIE, false)) - { - FormatEx(buffer, size, "%T", "ZombieMenu2", client); - } -} - -#if defined MT_ABILITIES_MAIN2 -void vZombiePluginCheck(ArrayList list) -#else -public void MT_OnPluginCheck(ArrayList list) -#endif -{ - list.PushString(MT_MENU_ZOMBIE); -} - -#if defined MT_ABILITIES_MAIN2 -void vZombieAbilityCheck(ArrayList list, ArrayList list2, ArrayList list3, ArrayList list4) -#else -public void MT_OnAbilityCheck(ArrayList list, ArrayList list2, ArrayList list3, ArrayList list4) -#endif -{ - list.PushString(MT_ZOMBIE_SECTION); - list2.PushString(MT_ZOMBIE_SECTION2); - list3.PushString(MT_ZOMBIE_SECTION3); - list4.PushString(MT_ZOMBIE_SECTION4); -} - -#if defined MT_ABILITIES_MAIN2 -void vZombieCombineAbilities(int tank, int type, const float random, const char[] combo) -#else -public void MT_OnCombineAbilities(int tank, int type, const float random, const char[] combo, int survivor, int weapon, const char[] classname) -#endif -{ - if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esZombieCache[tank].g_iHumanAbility != 2) - { - g_esZombieAbility[g_esZombiePlayer[tank].g_iTankTypeRecorded].g_iComboPosition = -1; - - return; - } - - g_esZombieAbility[g_esZombiePlayer[tank].g_iTankTypeRecorded].g_iComboPosition = -1; - - char sCombo[320], sSet[4][32]; - FormatEx(sCombo, sizeof sCombo, ",%s,", combo); - FormatEx(sSet[0], sizeof sSet[], ",%s,", MT_ZOMBIE_SECTION); - FormatEx(sSet[1], sizeof sSet[], ",%s,", MT_ZOMBIE_SECTION2); - FormatEx(sSet[2], sizeof sSet[], ",%s,", MT_ZOMBIE_SECTION3); - FormatEx(sSet[3], sizeof sSet[], ",%s,", MT_ZOMBIE_SECTION4); - if (StrContains(sCombo, sSet[0], false) != -1 || StrContains(sCombo, sSet[1], false) != -1 || StrContains(sCombo, sSet[2], false) != -1 || StrContains(sCombo, sSet[3], false) != -1) - { - if (type == MT_COMBO_MAINRANGE && g_esZombieCache[tank].g_iZombieAbility == 1 && g_esZombieCache[tank].g_iComboAbility == 1 && !g_esZombiePlayer[tank].g_bActivated) - { - char sAbilities[320], sSubset[10][32]; - strcopy(sAbilities, sizeof sAbilities, combo); - ExplodeString(sAbilities, ",", sSubset, sizeof sSubset, sizeof sSubset[]); - - float flDelay = 0.0; - for (int iPos = 0; iPos < (sizeof sSubset); iPos++) - { - if (StrEqual(sSubset[iPos], MT_ZOMBIE_SECTION, false) || StrEqual(sSubset[iPos], MT_ZOMBIE_SECTION2, false) || StrEqual(sSubset[iPos], MT_ZOMBIE_SECTION3, false) || StrEqual(sSubset[iPos], MT_ZOMBIE_SECTION4, false)) - { - g_esZombieAbility[g_esZombiePlayer[tank].g_iTankTypeRecorded].g_iComboPosition = iPos; - - if (random <= MT_GetCombinationSetting(tank, 1, iPos)) - { - flDelay = MT_GetCombinationSetting(tank, 4, iPos); - - switch (flDelay) - { - case 0.0: vZombie(tank, iPos); - default: - { - DataPack dpCombo; - CreateDataTimer(flDelay, tTimerZombieCombo, dpCombo, TIMER_FLAG_NO_MAPCHANGE); - dpCombo.WriteCell(GetClientUserId(tank)); - dpCombo.WriteCell(iPos); - } - } - } - - break; - } - } - } - } -} - -#if defined MT_ABILITIES_MAIN2 -void vZombieConfigsLoad(int mode) -#else -public void MT_OnConfigsLoad(int mode) -#endif -{ - switch (mode) - { - case 1: - { - for (int iIndex = MT_GetMinType(); iIndex <= MT_GetMaxType(); iIndex++) - { - g_esZombieAbility[iIndex].g_iAccessFlags = 0; - g_esZombieAbility[iIndex].g_flCloseAreasOnly = 0.0; - g_esZombieAbility[iIndex].g_iComboAbility = 0; - g_esZombieAbility[iIndex].g_iComboPosition = -1; - g_esZombieAbility[iIndex].g_iHumanAbility = 0; - g_esZombieAbility[iIndex].g_iHumanAmmo = 5; - g_esZombieAbility[iIndex].g_iHumanCooldown = 0; - g_esZombieAbility[iIndex].g_iHumanDuration = 5; - g_esZombieAbility[iIndex].g_iHumanMode = 1; - g_esZombieAbility[iIndex].g_flOpenAreasOnly = 0.0; - g_esZombieAbility[iIndex].g_iRequiresHumans = 0; - g_esZombieAbility[iIndex].g_iZombieAbility = 0; - g_esZombieAbility[iIndex].g_iZombieMessage = 0; - g_esZombieAbility[iIndex].g_iZombieAmount = 10; - g_esZombieAbility[iIndex].g_flZombieChance = 33.3; - g_esZombieAbility[iIndex].g_iZombieCooldown = 0; - g_esZombieAbility[iIndex].g_iZombieDuration = 0; - g_esZombieAbility[iIndex].g_flZombieInterval = 5.0; - g_esZombieAbility[iIndex].g_iZombieMode = 0; - g_esZombieAbility[iIndex].g_iZombieType = 0; - - g_esZombieSpecial[iIndex].g_iComboAbility = -1; - g_esZombieSpecial[iIndex].g_iHumanAbility = -1; - g_esZombieSpecial[iIndex].g_iHumanAmmo = -1; - g_esZombieSpecial[iIndex].g_iHumanCooldown = -1; - g_esZombieSpecial[iIndex].g_iHumanDuration = -1; - g_esZombieSpecial[iIndex].g_iHumanMode = -1; - g_esZombieSpecial[iIndex].g_flOpenAreasOnly = -1.0; - g_esZombieSpecial[iIndex].g_iRequiresHumans = -1; - g_esZombieSpecial[iIndex].g_iZombieAbility = -1; - g_esZombieSpecial[iIndex].g_iZombieMessage = -1; - g_esZombieSpecial[iIndex].g_iZombieAmount = -1; - g_esZombieSpecial[iIndex].g_flZombieChance = -1.0; - g_esZombieSpecial[iIndex].g_iZombieCooldown = -1; - g_esZombieSpecial[iIndex].g_iZombieDuration = -1; - g_esZombieSpecial[iIndex].g_flZombieInterval = -1.0; - g_esZombieSpecial[iIndex].g_iZombieMode = -1; - g_esZombieSpecial[iIndex].g_iZombieType = -1; - } - } - case 3: - { - for (int iPlayer = 1; iPlayer <= MaxClients; iPlayer++) - { - g_esZombiePlayer[iPlayer].g_iAccessFlags = -1; - g_esZombiePlayer[iPlayer].g_flCloseAreasOnly = -1.0; - g_esZombiePlayer[iPlayer].g_iComboAbility = -1; - g_esZombiePlayer[iPlayer].g_iHumanAbility = -1; - g_esZombiePlayer[iPlayer].g_iHumanAmmo = -1; - g_esZombiePlayer[iPlayer].g_iHumanCooldown = -1; - g_esZombiePlayer[iPlayer].g_iHumanDuration = -1; - g_esZombiePlayer[iPlayer].g_iHumanMode = -1; - g_esZombiePlayer[iPlayer].g_flOpenAreasOnly = -1.0; - g_esZombiePlayer[iPlayer].g_iRequiresHumans = -1; - g_esZombiePlayer[iPlayer].g_iZombieAbility = -1; - g_esZombiePlayer[iPlayer].g_iZombieMessage = -1; - g_esZombiePlayer[iPlayer].g_iZombieAmount = -1; - g_esZombiePlayer[iPlayer].g_flZombieChance = -1.0; - g_esZombiePlayer[iPlayer].g_iZombieCooldown = -1; - g_esZombiePlayer[iPlayer].g_iZombieDuration = -1; - g_esZombiePlayer[iPlayer].g_flZombieInterval = -1.0; - g_esZombiePlayer[iPlayer].g_iZombieMode = -1; - g_esZombiePlayer[iPlayer].g_iZombieType = -1; - - g_esZombieTeammate[iPlayer].g_iComboAbility = -1; - g_esZombieTeammate[iPlayer].g_iHumanAbility = -1; - g_esZombieTeammate[iPlayer].g_iHumanAmmo = -1; - g_esZombieTeammate[iPlayer].g_iHumanCooldown = -1; - g_esZombieTeammate[iPlayer].g_iHumanDuration = -1; - g_esZombieTeammate[iPlayer].g_iHumanMode = -1; - g_esZombieTeammate[iPlayer].g_flOpenAreasOnly = -1.0; - g_esZombieTeammate[iPlayer].g_iRequiresHumans = -1; - g_esZombieTeammate[iPlayer].g_iZombieAbility = -1; - g_esZombieTeammate[iPlayer].g_iZombieMessage = -1; - g_esZombieTeammate[iPlayer].g_iZombieAmount = -1; - g_esZombieTeammate[iPlayer].g_flZombieChance = -1.0; - g_esZombieTeammate[iPlayer].g_iZombieCooldown = -1; - g_esZombieTeammate[iPlayer].g_iZombieDuration = -1; - g_esZombieTeammate[iPlayer].g_flZombieInterval = -1.0; - g_esZombieTeammate[iPlayer].g_iZombieMode = -1; - g_esZombieTeammate[iPlayer].g_iZombieType = -1; - } - } - } -} - -#if defined MT_ABILITIES_MAIN2 -void vZombieConfigsLoaded(const char[] subsection, const char[] key, const char[] value, int type, int admin, int mode, bool special, const char[] specsection) -#else -public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const char[] value, int type, int admin, int mode, bool special, const char[] specsection) -#endif -{ - if ((mode == -1 || mode == 3) && bIsValidClient(admin)) - { - if (special && specsection[0] != '\0') - { - g_esZombieTeammate[admin].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_ZOMBIE_SECTION, MT_ZOMBIE_SECTION2, MT_ZOMBIE_SECTION3, MT_ZOMBIE_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esZombieTeammate[admin].g_flCloseAreasOnly, value, -1.0, 99999.0); - g_esZombieTeammate[admin].g_iComboAbility = iGetKeyValue(subsection, MT_ZOMBIE_SECTION, MT_ZOMBIE_SECTION2, MT_ZOMBIE_SECTION3, MT_ZOMBIE_SECTION4, key, "ComboAbility", "Combo Ability", "Combo_Ability", "combo", g_esZombieTeammate[admin].g_iComboAbility, value, -1, 1); - g_esZombieTeammate[admin].g_iHumanAbility = iGetKeyValue(subsection, MT_ZOMBIE_SECTION, MT_ZOMBIE_SECTION2, MT_ZOMBIE_SECTION3, MT_ZOMBIE_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esZombieTeammate[admin].g_iHumanAbility, value, -1, 2); - g_esZombieTeammate[admin].g_iHumanAmmo = iGetKeyValue(subsection, MT_ZOMBIE_SECTION, MT_ZOMBIE_SECTION2, MT_ZOMBIE_SECTION3, MT_ZOMBIE_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esZombieTeammate[admin].g_iHumanAmmo, value, -1, 99999); - g_esZombieTeammate[admin].g_iHumanCooldown = iGetKeyValue(subsection, MT_ZOMBIE_SECTION, MT_ZOMBIE_SECTION2, MT_ZOMBIE_SECTION3, MT_ZOMBIE_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esZombieTeammate[admin].g_iHumanCooldown, value, -1, 99999); - g_esZombieTeammate[admin].g_iHumanDuration = iGetKeyValue(subsection, MT_ZOMBIE_SECTION, MT_ZOMBIE_SECTION2, MT_ZOMBIE_SECTION3, MT_ZOMBIE_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esZombieTeammate[admin].g_iHumanDuration, value, -1, 99999); - g_esZombieTeammate[admin].g_iHumanMode = iGetKeyValue(subsection, MT_ZOMBIE_SECTION, MT_ZOMBIE_SECTION2, MT_ZOMBIE_SECTION3, MT_ZOMBIE_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esZombieTeammate[admin].g_iHumanMode, value, -1, 1); - g_esZombieTeammate[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_ZOMBIE_SECTION, MT_ZOMBIE_SECTION2, MT_ZOMBIE_SECTION3, MT_ZOMBIE_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esZombieTeammate[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); - g_esZombieTeammate[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_ZOMBIE_SECTION, MT_ZOMBIE_SECTION2, MT_ZOMBIE_SECTION3, MT_ZOMBIE_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esZombieTeammate[admin].g_iRequiresHumans, value, -1, 32); - g_esZombieTeammate[admin].g_iZombieAbility = iGetKeyValue(subsection, MT_ZOMBIE_SECTION, MT_ZOMBIE_SECTION2, MT_ZOMBIE_SECTION3, MT_ZOMBIE_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esZombieTeammate[admin].g_iZombieAbility, value, -1, 1); - g_esZombieTeammate[admin].g_iZombieMessage = iGetKeyValue(subsection, MT_ZOMBIE_SECTION, MT_ZOMBIE_SECTION2, MT_ZOMBIE_SECTION3, MT_ZOMBIE_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esZombieTeammate[admin].g_iZombieMessage, value, -1, 1); - g_esZombieTeammate[admin].g_iZombieAmount = iGetKeyValue(subsection, MT_ZOMBIE_SECTION, MT_ZOMBIE_SECTION2, MT_ZOMBIE_SECTION3, MT_ZOMBIE_SECTION4, key, "ZombieAmount", "Zombie Amount", "Zombie_Amount", "amount", g_esZombieTeammate[admin].g_iZombieAmount, value, -1, 100); - g_esZombieTeammate[admin].g_flZombieChance = flGetKeyValue(subsection, MT_ZOMBIE_SECTION, MT_ZOMBIE_SECTION2, MT_ZOMBIE_SECTION3, MT_ZOMBIE_SECTION4, key, "ZombieChance", "Zombie Chance", "Zombie_Chance", "chance", g_esZombieTeammate[admin].g_flZombieChance, value, -1.0, 100.0); - g_esZombieTeammate[admin].g_iZombieCooldown = iGetKeyValue(subsection, MT_ZOMBIE_SECTION, MT_ZOMBIE_SECTION2, MT_ZOMBIE_SECTION3, MT_ZOMBIE_SECTION4, key, "ZombieCooldown", "Zombie Cooldown", "Zombie_Cooldown", "cooldown", g_esZombieTeammate[admin].g_iZombieCooldown, value, -1, 99999); - g_esZombieTeammate[admin].g_iZombieDuration = iGetKeyValue(subsection, MT_ZOMBIE_SECTION, MT_ZOMBIE_SECTION2, MT_ZOMBIE_SECTION3, MT_ZOMBIE_SECTION4, key, "ZombieDuration", "Zombie Duration", "Zombie_Duration", "duration", g_esZombieTeammate[admin].g_iZombieDuration, value, -1, 99999); - g_esZombieTeammate[admin].g_flZombieInterval = flGetKeyValue(subsection, MT_ZOMBIE_SECTION, MT_ZOMBIE_SECTION2, MT_ZOMBIE_SECTION3, MT_ZOMBIE_SECTION4, key, "ZombieInterval", "Zombie Interval", "Zombie_Interval", "interval", g_esZombieTeammate[admin].g_flZombieInterval, value, -1.0, 99999.0); - g_esZombieTeammate[admin].g_iZombieMode = iGetKeyValue(subsection, MT_ZOMBIE_SECTION, MT_ZOMBIE_SECTION2, MT_ZOMBIE_SECTION3, MT_ZOMBIE_SECTION4, key, "ZombieMode", "Zombie Mode", "Zombie_Mode", "mode", g_esZombieTeammate[admin].g_iZombieMode, value, -1, 2); - g_esZombieTeammate[admin].g_iZombieType = iGetKeyValue(subsection, MT_ZOMBIE_SECTION, MT_ZOMBIE_SECTION2, MT_ZOMBIE_SECTION3, MT_ZOMBIE_SECTION4, key, "ZombieType", "Zombie Type", "Zombie_Type", "type", g_esZombieTeammate[admin].g_iZombieType, value, -1, 127); - } - else - { - g_esZombiePlayer[admin].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_ZOMBIE_SECTION, MT_ZOMBIE_SECTION2, MT_ZOMBIE_SECTION3, MT_ZOMBIE_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esZombiePlayer[admin].g_flCloseAreasOnly, value, -1.0, 99999.0); - g_esZombiePlayer[admin].g_iComboAbility = iGetKeyValue(subsection, MT_ZOMBIE_SECTION, MT_ZOMBIE_SECTION2, MT_ZOMBIE_SECTION3, MT_ZOMBIE_SECTION4, key, "ComboAbility", "Combo Ability", "Combo_Ability", "combo", g_esZombiePlayer[admin].g_iComboAbility, value, -1, 1); - g_esZombiePlayer[admin].g_iHumanAbility = iGetKeyValue(subsection, MT_ZOMBIE_SECTION, MT_ZOMBIE_SECTION2, MT_ZOMBIE_SECTION3, MT_ZOMBIE_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esZombiePlayer[admin].g_iHumanAbility, value, -1, 2); - g_esZombiePlayer[admin].g_iHumanAmmo = iGetKeyValue(subsection, MT_ZOMBIE_SECTION, MT_ZOMBIE_SECTION2, MT_ZOMBIE_SECTION3, MT_ZOMBIE_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esZombiePlayer[admin].g_iHumanAmmo, value, -1, 99999); - g_esZombiePlayer[admin].g_iHumanCooldown = iGetKeyValue(subsection, MT_ZOMBIE_SECTION, MT_ZOMBIE_SECTION2, MT_ZOMBIE_SECTION3, MT_ZOMBIE_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esZombiePlayer[admin].g_iHumanCooldown, value, -1, 99999); - g_esZombiePlayer[admin].g_iHumanDuration = iGetKeyValue(subsection, MT_ZOMBIE_SECTION, MT_ZOMBIE_SECTION2, MT_ZOMBIE_SECTION3, MT_ZOMBIE_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esZombiePlayer[admin].g_iHumanDuration, value, -1, 99999); - g_esZombiePlayer[admin].g_iHumanMode = iGetKeyValue(subsection, MT_ZOMBIE_SECTION, MT_ZOMBIE_SECTION2, MT_ZOMBIE_SECTION3, MT_ZOMBIE_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esZombiePlayer[admin].g_iHumanMode, value, -1, 1); - g_esZombiePlayer[admin].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_ZOMBIE_SECTION, MT_ZOMBIE_SECTION2, MT_ZOMBIE_SECTION3, MT_ZOMBIE_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esZombiePlayer[admin].g_flOpenAreasOnly, value, -1.0, 99999.0); - g_esZombiePlayer[admin].g_iRequiresHumans = iGetKeyValue(subsection, MT_ZOMBIE_SECTION, MT_ZOMBIE_SECTION2, MT_ZOMBIE_SECTION3, MT_ZOMBIE_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esZombiePlayer[admin].g_iRequiresHumans, value, -1, 32); - g_esZombiePlayer[admin].g_iZombieAbility = iGetKeyValue(subsection, MT_ZOMBIE_SECTION, MT_ZOMBIE_SECTION2, MT_ZOMBIE_SECTION3, MT_ZOMBIE_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esZombiePlayer[admin].g_iZombieAbility, value, -1, 1); - g_esZombiePlayer[admin].g_iZombieMessage = iGetKeyValue(subsection, MT_ZOMBIE_SECTION, MT_ZOMBIE_SECTION2, MT_ZOMBIE_SECTION3, MT_ZOMBIE_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esZombiePlayer[admin].g_iZombieMessage, value, -1, 1); - g_esZombiePlayer[admin].g_iZombieAmount = iGetKeyValue(subsection, MT_ZOMBIE_SECTION, MT_ZOMBIE_SECTION2, MT_ZOMBIE_SECTION3, MT_ZOMBIE_SECTION4, key, "ZombieAmount", "Zombie Amount", "Zombie_Amount", "amount", g_esZombiePlayer[admin].g_iZombieAmount, value, -1, 100); - g_esZombiePlayer[admin].g_flZombieChance = flGetKeyValue(subsection, MT_ZOMBIE_SECTION, MT_ZOMBIE_SECTION2, MT_ZOMBIE_SECTION3, MT_ZOMBIE_SECTION4, key, "ZombieChance", "Zombie Chance", "Zombie_Chance", "chance", g_esZombiePlayer[admin].g_flZombieChance, value, -1.0, 100.0); - g_esZombiePlayer[admin].g_iZombieCooldown = iGetKeyValue(subsection, MT_ZOMBIE_SECTION, MT_ZOMBIE_SECTION2, MT_ZOMBIE_SECTION3, MT_ZOMBIE_SECTION4, key, "ZombieCooldown", "Zombie Cooldown", "Zombie_Cooldown", "cooldown", g_esZombiePlayer[admin].g_iZombieCooldown, value, -1, 99999); - g_esZombiePlayer[admin].g_iZombieDuration = iGetKeyValue(subsection, MT_ZOMBIE_SECTION, MT_ZOMBIE_SECTION2, MT_ZOMBIE_SECTION3, MT_ZOMBIE_SECTION4, key, "ZombieDuration", "Zombie Duration", "Zombie_Duration", "duration", g_esZombiePlayer[admin].g_iZombieDuration, value, -1, 99999); - g_esZombiePlayer[admin].g_flZombieInterval = flGetKeyValue(subsection, MT_ZOMBIE_SECTION, MT_ZOMBIE_SECTION2, MT_ZOMBIE_SECTION3, MT_ZOMBIE_SECTION4, key, "ZombieInterval", "Zombie Interval", "Zombie_Interval", "interval", g_esZombiePlayer[admin].g_flZombieInterval, value, -1.0, 99999.0); - g_esZombiePlayer[admin].g_iZombieMode = iGetKeyValue(subsection, MT_ZOMBIE_SECTION, MT_ZOMBIE_SECTION2, MT_ZOMBIE_SECTION3, MT_ZOMBIE_SECTION4, key, "ZombieMode", "Zombie Mode", "Zombie_Mode", "mode", g_esZombiePlayer[admin].g_iZombieMode, value, -1, 2); - g_esZombiePlayer[admin].g_iZombieType = iGetKeyValue(subsection, MT_ZOMBIE_SECTION, MT_ZOMBIE_SECTION2, MT_ZOMBIE_SECTION3, MT_ZOMBIE_SECTION4, key, "ZombieType", "Zombie Type", "Zombie_Type", "type", g_esZombiePlayer[admin].g_iZombieType, value, -1, 127); - g_esZombiePlayer[admin].g_iAccessFlags = iGetAdminFlagsValue(subsection, MT_ZOMBIE_SECTION, MT_ZOMBIE_SECTION2, MT_ZOMBIE_SECTION3, MT_ZOMBIE_SECTION4, key, "AccessFlags", "Access Flags", "Access_Flags", "access", value); - } - } - - if (mode < 3 && type > 0) - { - if (special && specsection[0] != '\0') - { - g_esZombieSpecial[type].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_ZOMBIE_SECTION, MT_ZOMBIE_SECTION2, MT_ZOMBIE_SECTION3, MT_ZOMBIE_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esZombieSpecial[type].g_flCloseAreasOnly, value, -1.0, 99999.0); - g_esZombieSpecial[type].g_iComboAbility = iGetKeyValue(subsection, MT_ZOMBIE_SECTION, MT_ZOMBIE_SECTION2, MT_ZOMBIE_SECTION3, MT_ZOMBIE_SECTION4, key, "ComboAbility", "Combo Ability", "Combo_Ability", "combo", g_esZombieSpecial[type].g_iComboAbility, value, -1, 1); - g_esZombieSpecial[type].g_iHumanAbility = iGetKeyValue(subsection, MT_ZOMBIE_SECTION, MT_ZOMBIE_SECTION2, MT_ZOMBIE_SECTION3, MT_ZOMBIE_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esZombieSpecial[type].g_iHumanAbility, value, -1, 2); - g_esZombieSpecial[type].g_iHumanAmmo = iGetKeyValue(subsection, MT_ZOMBIE_SECTION, MT_ZOMBIE_SECTION2, MT_ZOMBIE_SECTION3, MT_ZOMBIE_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esZombieSpecial[type].g_iHumanAmmo, value, -1, 99999); - g_esZombieSpecial[type].g_iHumanCooldown = iGetKeyValue(subsection, MT_ZOMBIE_SECTION, MT_ZOMBIE_SECTION2, MT_ZOMBIE_SECTION3, MT_ZOMBIE_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esZombieSpecial[type].g_iHumanCooldown, value, -1, 99999); - g_esZombieSpecial[type].g_iHumanDuration = iGetKeyValue(subsection, MT_ZOMBIE_SECTION, MT_ZOMBIE_SECTION2, MT_ZOMBIE_SECTION3, MT_ZOMBIE_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esZombieSpecial[type].g_iHumanDuration, value, -1, 99999); - g_esZombieSpecial[type].g_iHumanMode = iGetKeyValue(subsection, MT_ZOMBIE_SECTION, MT_ZOMBIE_SECTION2, MT_ZOMBIE_SECTION3, MT_ZOMBIE_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esZombieSpecial[type].g_iHumanMode, value, -1, 1); - g_esZombieSpecial[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_ZOMBIE_SECTION, MT_ZOMBIE_SECTION2, MT_ZOMBIE_SECTION3, MT_ZOMBIE_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esZombieSpecial[type].g_flOpenAreasOnly, value, -1.0, 99999.0); - g_esZombieSpecial[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_ZOMBIE_SECTION, MT_ZOMBIE_SECTION2, MT_ZOMBIE_SECTION3, MT_ZOMBIE_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esZombieSpecial[type].g_iRequiresHumans, value, -1, 32); - g_esZombieSpecial[type].g_iZombieAbility = iGetKeyValue(subsection, MT_ZOMBIE_SECTION, MT_ZOMBIE_SECTION2, MT_ZOMBIE_SECTION3, MT_ZOMBIE_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esZombieSpecial[type].g_iZombieAbility, value, -1, 1); - g_esZombieSpecial[type].g_iZombieMessage = iGetKeyValue(subsection, MT_ZOMBIE_SECTION, MT_ZOMBIE_SECTION2, MT_ZOMBIE_SECTION3, MT_ZOMBIE_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esZombieSpecial[type].g_iZombieMessage, value, -1, 1); - g_esZombieSpecial[type].g_iZombieAmount = iGetKeyValue(subsection, MT_ZOMBIE_SECTION, MT_ZOMBIE_SECTION2, MT_ZOMBIE_SECTION3, MT_ZOMBIE_SECTION4, key, "ZombieAmount", "Zombie Amount", "Zombie_Amount", "amount", g_esZombieSpecial[type].g_iZombieAmount, value, -1, 100); - g_esZombieSpecial[type].g_flZombieChance = flGetKeyValue(subsection, MT_ZOMBIE_SECTION, MT_ZOMBIE_SECTION2, MT_ZOMBIE_SECTION3, MT_ZOMBIE_SECTION4, key, "ZombieChance", "Zombie Chance", "Zombie_Chance", "chance", g_esZombieSpecial[type].g_flZombieChance, value, -1.0, 100.0); - g_esZombieSpecial[type].g_iZombieCooldown = iGetKeyValue(subsection, MT_ZOMBIE_SECTION, MT_ZOMBIE_SECTION2, MT_ZOMBIE_SECTION3, MT_ZOMBIE_SECTION4, key, "ZombieCooldown", "Zombie Cooldown", "Zombie_Cooldown", "cooldown", g_esZombieSpecial[type].g_iZombieCooldown, value, -1, 99999); - g_esZombieSpecial[type].g_iZombieDuration = iGetKeyValue(subsection, MT_ZOMBIE_SECTION, MT_ZOMBIE_SECTION2, MT_ZOMBIE_SECTION3, MT_ZOMBIE_SECTION4, key, "ZombieDuration", "Zombie Duration", "Zombie_Duration", "duration", g_esZombieSpecial[type].g_iZombieDuration, value, -1, 99999); - g_esZombieSpecial[type].g_flZombieInterval = flGetKeyValue(subsection, MT_ZOMBIE_SECTION, MT_ZOMBIE_SECTION2, MT_ZOMBIE_SECTION3, MT_ZOMBIE_SECTION4, key, "ZombieInterval", "Zombie Interval", "Zombie_Interval", "interval", g_esZombieSpecial[type].g_flZombieInterval, value, -1.0, 99999.0); - g_esZombieSpecial[type].g_iZombieMode = iGetKeyValue(subsection, MT_ZOMBIE_SECTION, MT_ZOMBIE_SECTION2, MT_ZOMBIE_SECTION3, MT_ZOMBIE_SECTION4, key, "ZombieMode", "Zombie Mode", "Zombie_Mode", "mode", g_esZombieSpecial[type].g_iZombieMode, value, -1, 2); - g_esZombieSpecial[type].g_iZombieType = iGetKeyValue(subsection, MT_ZOMBIE_SECTION, MT_ZOMBIE_SECTION2, MT_ZOMBIE_SECTION3, MT_ZOMBIE_SECTION4, key, "ZombieType", "Zombie Type", "Zombie_Type", "type", g_esZombieSpecial[type].g_iZombieType, value, -1, 127); - } - else - { - g_esZombieAbility[type].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_ZOMBIE_SECTION, MT_ZOMBIE_SECTION2, MT_ZOMBIE_SECTION3, MT_ZOMBIE_SECTION4, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esZombieAbility[type].g_flCloseAreasOnly, value, -1.0, 99999.0); - g_esZombieAbility[type].g_iComboAbility = iGetKeyValue(subsection, MT_ZOMBIE_SECTION, MT_ZOMBIE_SECTION2, MT_ZOMBIE_SECTION3, MT_ZOMBIE_SECTION4, key, "ComboAbility", "Combo Ability", "Combo_Ability", "combo", g_esZombieAbility[type].g_iComboAbility, value, -1, 1); - g_esZombieAbility[type].g_iHumanAbility = iGetKeyValue(subsection, MT_ZOMBIE_SECTION, MT_ZOMBIE_SECTION2, MT_ZOMBIE_SECTION3, MT_ZOMBIE_SECTION4, key, "HumanAbility", "Human Ability", "Human_Ability", "human", g_esZombieAbility[type].g_iHumanAbility, value, -1, 2); - g_esZombieAbility[type].g_iHumanAmmo = iGetKeyValue(subsection, MT_ZOMBIE_SECTION, MT_ZOMBIE_SECTION2, MT_ZOMBIE_SECTION3, MT_ZOMBIE_SECTION4, key, "HumanAmmo", "Human Ammo", "Human_Ammo", "hammo", g_esZombieAbility[type].g_iHumanAmmo, value, -1, 99999); - g_esZombieAbility[type].g_iHumanCooldown = iGetKeyValue(subsection, MT_ZOMBIE_SECTION, MT_ZOMBIE_SECTION2, MT_ZOMBIE_SECTION3, MT_ZOMBIE_SECTION4, key, "HumanCooldown", "Human Cooldown", "Human_Cooldown", "hcooldown", g_esZombieAbility[type].g_iHumanCooldown, value, -1, 99999); - g_esZombieAbility[type].g_iHumanDuration = iGetKeyValue(subsection, MT_ZOMBIE_SECTION, MT_ZOMBIE_SECTION2, MT_ZOMBIE_SECTION3, MT_ZOMBIE_SECTION4, key, "HumanDuration", "Human Duration", "Human_Duration", "hduration", g_esZombieAbility[type].g_iHumanDuration, value, -1, 99999); - g_esZombieAbility[type].g_iHumanMode = iGetKeyValue(subsection, MT_ZOMBIE_SECTION, MT_ZOMBIE_SECTION2, MT_ZOMBIE_SECTION3, MT_ZOMBIE_SECTION4, key, "HumanMode", "Human Mode", "Human_Mode", "hmode", g_esZombieAbility[type].g_iHumanMode, value, -1, 1); - g_esZombieAbility[type].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_ZOMBIE_SECTION, MT_ZOMBIE_SECTION2, MT_ZOMBIE_SECTION3, MT_ZOMBIE_SECTION4, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esZombieAbility[type].g_flOpenAreasOnly, value, -1.0, 99999.0); - g_esZombieAbility[type].g_iRequiresHumans = iGetKeyValue(subsection, MT_ZOMBIE_SECTION, MT_ZOMBIE_SECTION2, MT_ZOMBIE_SECTION3, MT_ZOMBIE_SECTION4, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esZombieAbility[type].g_iRequiresHumans, value, -1, 32); - g_esZombieAbility[type].g_iZombieAbility = iGetKeyValue(subsection, MT_ZOMBIE_SECTION, MT_ZOMBIE_SECTION2, MT_ZOMBIE_SECTION3, MT_ZOMBIE_SECTION4, key, "AbilityEnabled", "Ability Enabled", "Ability_Enabled", "aenabled", g_esZombieAbility[type].g_iZombieAbility, value, -1, 1); - g_esZombieAbility[type].g_iZombieMessage = iGetKeyValue(subsection, MT_ZOMBIE_SECTION, MT_ZOMBIE_SECTION2, MT_ZOMBIE_SECTION3, MT_ZOMBIE_SECTION4, key, "AbilityMessage", "Ability Message", "Ability_Message", "message", g_esZombieAbility[type].g_iZombieMessage, value, -1, 1); - g_esZombieAbility[type].g_iZombieAmount = iGetKeyValue(subsection, MT_ZOMBIE_SECTION, MT_ZOMBIE_SECTION2, MT_ZOMBIE_SECTION3, MT_ZOMBIE_SECTION4, key, "ZombieAmount", "Zombie Amount", "Zombie_Amount", "amount", g_esZombieAbility[type].g_iZombieAmount, value, -1, 100); - g_esZombieAbility[type].g_flZombieChance = flGetKeyValue(subsection, MT_ZOMBIE_SECTION, MT_ZOMBIE_SECTION2, MT_ZOMBIE_SECTION3, MT_ZOMBIE_SECTION4, key, "ZombieChance", "Zombie Chance", "Zombie_Chance", "chance", g_esZombieAbility[type].g_flZombieChance, value, -1.0, 100.0); - g_esZombieAbility[type].g_iZombieCooldown = iGetKeyValue(subsection, MT_ZOMBIE_SECTION, MT_ZOMBIE_SECTION2, MT_ZOMBIE_SECTION3, MT_ZOMBIE_SECTION4, key, "ZombieCooldown", "Zombie Cooldown", "Zombie_Cooldown", "cooldown", g_esZombieAbility[type].g_iZombieCooldown, value, -1, 99999); - g_esZombieAbility[type].g_iZombieDuration = iGetKeyValue(subsection, MT_ZOMBIE_SECTION, MT_ZOMBIE_SECTION2, MT_ZOMBIE_SECTION3, MT_ZOMBIE_SECTION4, key, "ZombieDuration", "Zombie Duration", "Zombie_Duration", "duration", g_esZombieAbility[type].g_iZombieDuration, value, -1, 99999); - g_esZombieAbility[type].g_flZombieInterval = flGetKeyValue(subsection, MT_ZOMBIE_SECTION, MT_ZOMBIE_SECTION2, MT_ZOMBIE_SECTION3, MT_ZOMBIE_SECTION4, key, "ZombieInterval", "Zombie Interval", "Zombie_Interval", "interval", g_esZombieAbility[type].g_flZombieInterval, value, -1.0, 99999.0); - g_esZombieAbility[type].g_iZombieMode = iGetKeyValue(subsection, MT_ZOMBIE_SECTION, MT_ZOMBIE_SECTION2, MT_ZOMBIE_SECTION3, MT_ZOMBIE_SECTION4, key, "ZombieMode", "Zombie Mode", "Zombie_Mode", "mode", g_esZombieAbility[type].g_iZombieMode, value, -1, 2); - g_esZombieAbility[type].g_iZombieType = iGetKeyValue(subsection, MT_ZOMBIE_SECTION, MT_ZOMBIE_SECTION2, MT_ZOMBIE_SECTION3, MT_ZOMBIE_SECTION4, key, "ZombieType", "Zombie Type", "Zombie_Type", "type", g_esZombieAbility[type].g_iZombieType, value, -1, 127); - g_esZombieAbility[type].g_iAccessFlags = iGetAdminFlagsValue(subsection, MT_ZOMBIE_SECTION, MT_ZOMBIE_SECTION2, MT_ZOMBIE_SECTION3, MT_ZOMBIE_SECTION4, key, "AccessFlags", "Access Flags", "Access_Flags", "access", value); - } - } -} - -#if defined MT_ABILITIES_MAIN2 -void vZombieSettingsCached(int tank, bool apply, int type) -#else -public void MT_OnSettingsCached(int tank, bool apply, int type) -#endif -{ - bool bHuman = bIsValidClient(tank, MT_CHECK_FAKECLIENT); - g_esZombiePlayer[tank].g_iTankTypeRecorded = apply ? MT_GetRecordedTankType(tank, type) : 0; - g_esZombiePlayer[tank].g_iTankType = apply ? type : 0; - int iType = g_esZombiePlayer[tank].g_iTankTypeRecorded; - - if (bIsSpecialInfected(tank, MT_CHECK_INDEX|MT_CHECK_INGAME)) - { - g_esZombieCache[tank].g_flCloseAreasOnly = flGetSubSettingValue(apply, bHuman, g_esZombieTeammate[tank].g_flCloseAreasOnly, g_esZombiePlayer[tank].g_flCloseAreasOnly, g_esZombieSpecial[iType].g_flCloseAreasOnly, g_esZombieAbility[iType].g_flCloseAreasOnly, 1); - g_esZombieCache[tank].g_iComboAbility = iGetSubSettingValue(apply, bHuman, g_esZombieTeammate[tank].g_iComboAbility, g_esZombiePlayer[tank].g_iComboAbility, g_esZombieSpecial[iType].g_iComboAbility, g_esZombieAbility[iType].g_iComboAbility, 1); - g_esZombieCache[tank].g_flZombieChance = flGetSubSettingValue(apply, bHuman, g_esZombieTeammate[tank].g_flZombieChance, g_esZombiePlayer[tank].g_flZombieChance, g_esZombieSpecial[iType].g_flZombieChance, g_esZombieAbility[iType].g_flZombieChance, 1); - g_esZombieCache[tank].g_flZombieInterval = flGetSubSettingValue(apply, bHuman, g_esZombieTeammate[tank].g_flZombieInterval, g_esZombiePlayer[tank].g_flZombieInterval, g_esZombieSpecial[iType].g_flZombieInterval, g_esZombieAbility[iType].g_flZombieInterval, 1); - g_esZombieCache[tank].g_iHumanAbility = iGetSubSettingValue(apply, bHuman, g_esZombieTeammate[tank].g_iHumanAbility, g_esZombiePlayer[tank].g_iHumanAbility, g_esZombieSpecial[iType].g_iHumanAbility, g_esZombieAbility[iType].g_iHumanAbility, 1); - g_esZombieCache[tank].g_iHumanAmmo = iGetSubSettingValue(apply, bHuman, g_esZombieTeammate[tank].g_iHumanAmmo, g_esZombiePlayer[tank].g_iHumanAmmo, g_esZombieSpecial[iType].g_iHumanAmmo, g_esZombieAbility[iType].g_iHumanAmmo, 1); - g_esZombieCache[tank].g_iHumanCooldown = iGetSubSettingValue(apply, bHuman, g_esZombieTeammate[tank].g_iHumanCooldown, g_esZombiePlayer[tank].g_iHumanCooldown, g_esZombieSpecial[iType].g_iHumanCooldown, g_esZombieAbility[iType].g_iHumanCooldown, 1); - g_esZombieCache[tank].g_iHumanDuration = iGetSubSettingValue(apply, bHuman, g_esZombieTeammate[tank].g_iHumanDuration, g_esZombiePlayer[tank].g_iHumanDuration, g_esZombieSpecial[iType].g_iHumanDuration, g_esZombieAbility[iType].g_iHumanDuration, 1); - g_esZombieCache[tank].g_iHumanMode = iGetSubSettingValue(apply, bHuman, g_esZombieTeammate[tank].g_iHumanMode, g_esZombiePlayer[tank].g_iHumanMode, g_esZombieSpecial[iType].g_iHumanMode, g_esZombieAbility[iType].g_iHumanMode, 1); - g_esZombieCache[tank].g_flOpenAreasOnly = flGetSubSettingValue(apply, bHuman, g_esZombieTeammate[tank].g_flOpenAreasOnly, g_esZombiePlayer[tank].g_flOpenAreasOnly, g_esZombieSpecial[iType].g_flOpenAreasOnly, g_esZombieAbility[iType].g_flOpenAreasOnly, 1); - g_esZombieCache[tank].g_iRequiresHumans = iGetSubSettingValue(apply, bHuman, g_esZombieTeammate[tank].g_iRequiresHumans, g_esZombiePlayer[tank].g_iRequiresHumans, g_esZombieSpecial[iType].g_iRequiresHumans, g_esZombieAbility[iType].g_iRequiresHumans, 1); - g_esZombieCache[tank].g_iZombieAbility = iGetSubSettingValue(apply, bHuman, g_esZombieTeammate[tank].g_iZombieAbility, g_esZombiePlayer[tank].g_iZombieAbility, g_esZombieSpecial[iType].g_iZombieAbility, g_esZombieAbility[iType].g_iZombieAbility, 1); - g_esZombieCache[tank].g_iZombieAmount = iGetSubSettingValue(apply, bHuman, g_esZombieTeammate[tank].g_iZombieAmount, g_esZombiePlayer[tank].g_iZombieAmount, g_esZombieSpecial[iType].g_iZombieAmount, g_esZombieAbility[iType].g_iZombieAmount, 1); - g_esZombieCache[tank].g_iZombieCooldown = iGetSubSettingValue(apply, bHuman, g_esZombieTeammate[tank].g_iZombieCooldown, g_esZombiePlayer[tank].g_iZombieCooldown, g_esZombieSpecial[iType].g_iZombieCooldown, g_esZombieAbility[iType].g_iZombieCooldown, 1); - g_esZombieCache[tank].g_iZombieDuration = iGetSubSettingValue(apply, bHuman, g_esZombieTeammate[tank].g_iZombieDuration, g_esZombiePlayer[tank].g_iZombieDuration, g_esZombieSpecial[iType].g_iZombieDuration, g_esZombieAbility[iType].g_iZombieDuration, 1); - g_esZombieCache[tank].g_iZombieMessage = iGetSubSettingValue(apply, bHuman, g_esZombieTeammate[tank].g_iZombieMessage, g_esZombiePlayer[tank].g_iZombieMessage, g_esZombieSpecial[iType].g_iZombieMessage, g_esZombieAbility[iType].g_iZombieMessage, 1); - g_esZombieCache[tank].g_iZombieMode = iGetSubSettingValue(apply, bHuman, g_esZombieTeammate[tank].g_iZombieMode, g_esZombiePlayer[tank].g_iZombieMode, g_esZombieSpecial[iType].g_iZombieMode, g_esZombieAbility[iType].g_iZombieMode, 1); - g_esZombieCache[tank].g_iZombieType = iGetSubSettingValue(apply, bHuman, g_esZombieTeammate[tank].g_iZombieType, g_esZombiePlayer[tank].g_iZombieType, g_esZombieSpecial[iType].g_iZombieType, g_esZombieAbility[iType].g_iZombieType, 1); - } - else - { - g_esZombieCache[tank].g_flCloseAreasOnly = flGetSettingValue(apply, bHuman, g_esZombiePlayer[tank].g_flCloseAreasOnly, g_esZombieAbility[iType].g_flCloseAreasOnly, 1); - g_esZombieCache[tank].g_iComboAbility = iGetSettingValue(apply, bHuman, g_esZombiePlayer[tank].g_iComboAbility, g_esZombieAbility[iType].g_iComboAbility, 1); - g_esZombieCache[tank].g_flZombieChance = flGetSettingValue(apply, bHuman, g_esZombiePlayer[tank].g_flZombieChance, g_esZombieAbility[iType].g_flZombieChance, 1); - g_esZombieCache[tank].g_flZombieInterval = flGetSettingValue(apply, bHuman, g_esZombiePlayer[tank].g_flZombieInterval, g_esZombieAbility[iType].g_flZombieInterval, 1); - g_esZombieCache[tank].g_iHumanAbility = iGetSettingValue(apply, bHuman, g_esZombiePlayer[tank].g_iHumanAbility, g_esZombieAbility[iType].g_iHumanAbility, 1); - g_esZombieCache[tank].g_iHumanAmmo = iGetSettingValue(apply, bHuman, g_esZombiePlayer[tank].g_iHumanAmmo, g_esZombieAbility[iType].g_iHumanAmmo, 1); - g_esZombieCache[tank].g_iHumanCooldown = iGetSettingValue(apply, bHuman, g_esZombiePlayer[tank].g_iHumanCooldown, g_esZombieAbility[iType].g_iHumanCooldown, 1); - g_esZombieCache[tank].g_iHumanDuration = iGetSettingValue(apply, bHuman, g_esZombiePlayer[tank].g_iHumanDuration, g_esZombieAbility[iType].g_iHumanDuration, 1); - g_esZombieCache[tank].g_iHumanMode = iGetSettingValue(apply, bHuman, g_esZombiePlayer[tank].g_iHumanMode, g_esZombieAbility[iType].g_iHumanMode, 1); - g_esZombieCache[tank].g_flOpenAreasOnly = flGetSettingValue(apply, bHuman, g_esZombiePlayer[tank].g_flOpenAreasOnly, g_esZombieAbility[iType].g_flOpenAreasOnly, 1); - g_esZombieCache[tank].g_iRequiresHumans = iGetSettingValue(apply, bHuman, g_esZombiePlayer[tank].g_iRequiresHumans, g_esZombieAbility[iType].g_iRequiresHumans, 1); - g_esZombieCache[tank].g_iZombieAbility = iGetSettingValue(apply, bHuman, g_esZombiePlayer[tank].g_iZombieAbility, g_esZombieAbility[iType].g_iZombieAbility, 1); - g_esZombieCache[tank].g_iZombieAmount = iGetSettingValue(apply, bHuman, g_esZombiePlayer[tank].g_iZombieAmount, g_esZombieAbility[iType].g_iZombieAmount, 1); - g_esZombieCache[tank].g_iZombieCooldown = iGetSettingValue(apply, bHuman, g_esZombiePlayer[tank].g_iZombieCooldown, g_esZombieAbility[iType].g_iZombieCooldown, 1); - g_esZombieCache[tank].g_iZombieDuration = iGetSettingValue(apply, bHuman, g_esZombiePlayer[tank].g_iZombieDuration, g_esZombieAbility[iType].g_iZombieDuration, 1); - g_esZombieCache[tank].g_iZombieMessage = iGetSettingValue(apply, bHuman, g_esZombiePlayer[tank].g_iZombieMessage, g_esZombieAbility[iType].g_iZombieMessage, 1); - g_esZombieCache[tank].g_iZombieMode = iGetSettingValue(apply, bHuman, g_esZombiePlayer[tank].g_iZombieMode, g_esZombieAbility[iType].g_iZombieMode, 1); - g_esZombieCache[tank].g_iZombieType = iGetSettingValue(apply, bHuman, g_esZombiePlayer[tank].g_iZombieType, g_esZombieAbility[iType].g_iZombieType, 1); - } -} - -#if defined MT_ABILITIES_MAIN2 -void vZombieCopyStats(int oldTank, int newTank) -#else -public void MT_OnCopyStats(int oldTank, int newTank) -#endif -{ - vZombieCopyStats2(oldTank, newTank); - - if (oldTank != newTank) - { - vRemoveZombie(oldTank); - } -} - -#if !defined MT_ABILITIES_MAIN2 -public void MT_OnPluginUpdate() -{ - MT_ReloadPlugin(null); -} -#endif - -#if defined MT_ABILITIES_MAIN2 -void vZombieEventFired(Event event, const char[] name) -#else -public void MT_OnEventFired(Event event, const char[] name, bool dontBroadcast) -#endif -{ - if (StrEqual(name, "bot_player_replace")) - { - int iBotId = event.GetInt("bot"), iBot = GetClientOfUserId(iBotId), - iTankId = event.GetInt("player"), iTank = GetClientOfUserId(iTankId); - if (bIsValidClient(iBot) && bIsInfected(iTank)) - { - vZombieCopyStats2(iBot, iTank); - vRemoveZombie(iBot); - } - } - else if (StrEqual(name, "mission_lost") || StrEqual(name, "round_start") || StrEqual(name, "round_end")) - { - vZombieReset(); - } - else if (StrEqual(name, "player_bot_replace")) - { - int iTankId = event.GetInt("player"), iTank = GetClientOfUserId(iTankId), - iBotId = event.GetInt("bot"), iBot = GetClientOfUserId(iBotId); - if (bIsValidClient(iTank) && bIsInfected(iBot)) - { - vZombieCopyStats2(iTank, iBot); - vRemoveZombie(iTank); - } - } - else if (StrEqual(name, "player_death") || StrEqual(name, "player_spawn")) - { - int iTankId = event.GetInt("userid"), iTank = GetClientOfUserId(iTankId); - if (MT_IsTankSupported(iTank, MT_CHECK_INDEX|MT_CHECK_INGAME)) - { - vZombieRange(iTank); - vRemoveZombie(iTank); - } - } -} - -#if defined MT_ABILITIES_MAIN2 -void vZombieAbilityActivated(int tank) -#else -public void MT_OnAbilityActivated(int tank) -#endif -{ - if (MT_IsTankSupported(tank, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_FAKECLIENT) && ((!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esZombieAbility[g_esZombiePlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esZombiePlayer[tank].g_iAccessFlags)) || g_esZombieCache[tank].g_iHumanAbility == 0)) - { - return; - } - - if (MT_IsTankSupported(tank) && (!bIsInfected(tank, MT_CHECK_FAKECLIENT) || g_esZombieCache[tank].g_iHumanAbility != 1) && MT_IsCustomTankSupported(tank) && g_esZombieCache[tank].g_iZombieAbility == 1 && g_esZombieCache[tank].g_iComboAbility == 0 && !g_esZombiePlayer[tank].g_bActivated) - { - vZombieAbility(tank); - } -} - -#if defined MT_ABILITIES_MAIN2 -void vZombieButtonPressed(int tank, int button) -#else -public void MT_OnButtonPressed(int tank, int button) -#endif -{ - if (MT_IsTankSupported(tank, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_ALIVE|MT_CHECK_FAKECLIENT) && MT_IsCustomTankSupported(tank)) - { - if (bIsAreaNarrow(tank, g_esZombieCache[tank].g_flOpenAreasOnly) || bIsAreaWide(tank, g_esZombieCache[tank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esZombiePlayer[tank].g_iTankType, tank) || (g_esZombieCache[tank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esZombieCache[tank].g_iRequiresHumans) || (!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esZombieAbility[g_esZombiePlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esZombiePlayer[tank].g_iAccessFlags))) - { - return; - } - - if ((button & MT_MAIN_KEY) && g_esZombieCache[tank].g_iZombieAbility == 1 && g_esZombieCache[tank].g_iHumanAbility == 1) - { - int iTime = GetTime(); - bool bRecharging = g_esZombiePlayer[tank].g_iCooldown != -1 && g_esZombiePlayer[tank].g_iCooldown >= iTime; - - switch (g_esZombieCache[tank].g_iHumanMode) - { - case 0: - { - if (!g_esZombiePlayer[tank].g_bActivated && !bRecharging) - { - vZombieAbility(tank); - } - else if (g_esZombiePlayer[tank].g_bActivated) - { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "ZombieHuman3"); - } - else if (bRecharging) - { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "ZombieHuman4", (g_esZombiePlayer[tank].g_iCooldown - iTime)); - } - } - case 1: - { - if (g_esZombiePlayer[tank].g_iAmmoCount < g_esZombieCache[tank].g_iHumanAmmo && g_esZombieCache[tank].g_iHumanAmmo > 0) - { - if (!g_esZombiePlayer[tank].g_bActivated && !bRecharging) - { - g_esZombiePlayer[tank].g_bActivated = true; - g_esZombiePlayer[tank].g_iAmmoCount++; - - vZombie2(tank); - MT_PrintToChat(tank, "%s %t", MT_TAG3, "ZombieHuman", g_esZombiePlayer[tank].g_iAmmoCount, g_esZombieCache[tank].g_iHumanAmmo); - } - else if (g_esZombiePlayer[tank].g_bActivated) - { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "ZombieHuman3"); - } - else if (bRecharging) - { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "ZombieHuman4", (g_esZombiePlayer[tank].g_iCooldown - iTime)); - } - } - else - { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "ZombieAmmo"); - } - } - } - } - } -} - -#if defined MT_ABILITIES_MAIN2 -void vZombieButtonReleased(int tank, int button) -#else -public void MT_OnButtonReleased(int tank, int button) -#endif -{ - if (MT_IsTankSupported(tank, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_ALIVE|MT_CHECK_FAKECLIENT) && g_esZombieCache[tank].g_iHumanAbility == 1) - { - if ((button & MT_MAIN_KEY) && g_esZombieCache[tank].g_iHumanMode == 1 && g_esZombiePlayer[tank].g_bActivated && (g_esZombiePlayer[tank].g_iCooldown == -1 || g_esZombiePlayer[tank].g_iCooldown <= GetTime())) - { - vZombieReset2(tank); - } - } -} - -#if defined MT_ABILITIES_MAIN2 -void vZombieChangeType(int tank, int oldType) -#else -public void MT_OnChangeType(int tank, int oldType, int newType, bool revert) -#endif -{ - if (oldType <= 0) - { - return; - } - - vRemoveZombie(tank); -} - -#if defined MT_ABILITIES_MAIN2 -void vZombiePostTankSpawn(int tank) -#else -public void MT_OnPostTankSpawn(int tank) -#endif -{ - vZombieRange(tank); -} - -void vSpawnUncommon(int tank, const char[] model) -{ - int iCommon = CreateEntityByName("infected"); - if (bIsValidEntity(iCommon)) - { - SetEntityModel(iCommon, model); - SetEntProp(iCommon, Prop_Data, "m_nNextThinkTick", (RoundToNearest(GetGameTime() / GetTickInterval()) + 5)); - DispatchSpawn(iCommon); - ActivateEntity(iCommon); - - float flOrigin[3], flAngles[3]; - GetClientAbsOrigin(tank, flOrigin); - GetClientEyeAngles(tank, flAngles); - - flOrigin[0] += (50.0 * (Cosine(DegToRad(flAngles[1])))); - flOrigin[1] += (50.0 * (Sine(DegToRad(flAngles[1])))); - flOrigin[2] += 5.0; - - TeleportEntity(iCommon, flOrigin); - } -} - -void vSpawnZombie(int tank, bool uncommon) -{ - switch (uncommon) - { - case true: - { - if (g_bSecondGame) - { - int iTypeCount = 0, iTypes[7], iFlag = 0; - for (int iBit = 0; iBit < (sizeof iTypes); iBit++) - { - iFlag = (1 << iBit); - if (!(g_esZombieCache[tank].g_iZombieType & iFlag)) - { - continue; - } - - iTypes[iTypeCount] = iFlag; - iTypeCount++; - } - - int iType = (iTypeCount > 0) ? iTypes[MT_GetRandomInt(0, (iTypeCount - 1))] : iTypes[0]; - - switch (iType) - { - case 1: vSpawnUncommon(tank, MODEL_CEDA); - case 2: vSpawnUncommon(tank, MODEL_JIMMY); - case 4: vSpawnUncommon(tank, MODEL_FALLEN); - case 8: vSpawnUncommon(tank, MODEL_CLOWN); - case 16: vSpawnUncommon(tank, MODEL_MUDMAN); - case 32: vSpawnUncommon(tank, MODEL_ROADCREW); - case 64: vSpawnUncommon(tank, MODEL_RIOTCOP); - default: - { - switch (MT_GetRandomInt(1, (sizeof iTypes))) - { - case 1: vSpawnUncommon(tank, MODEL_CEDA); - case 2: vSpawnUncommon(tank, MODEL_JIMMY); - case 3: vSpawnUncommon(tank, MODEL_FALLEN); - case 4: vSpawnUncommon(tank, MODEL_CLOWN); - case 5: vSpawnUncommon(tank, MODEL_MUDMAN); - case 6: vSpawnUncommon(tank, MODEL_ROADCREW); - case 7: vSpawnUncommon(tank, MODEL_RIOTCOP); - } - } - } - } - else - { - vSpawnZombie(tank, false); - } - } - case false: - { - if (bIsValidClient(tank)) - { - vCheatCommand(tank, g_bSecondGame ? "z_spawn_old" : "z_spawn", "zombie area"); - } - } - } -} - -void vZombie(int tank, int pos = -1) -{ - if (g_esZombiePlayer[tank].g_iCooldown != -1 && g_esZombiePlayer[tank].g_iCooldown >= GetTime()) - { - return; - } - - g_esZombiePlayer[tank].g_bActivated = true; - vZombie2(tank, pos); - - if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esZombieCache[tank].g_iHumanAbility == 1) - { - g_esZombiePlayer[tank].g_iAmmoCount++; - - MT_PrintToChat(tank, "%s %t", MT_TAG3, "ZombieHuman", g_esZombiePlayer[tank].g_iAmmoCount, g_esZombieCache[tank].g_iHumanAmmo); - } - - if (g_esZombieCache[tank].g_iZombieMessage == 1) - { - char sTankName[64]; - MT_GetTankName(tank, sTankName); - MT_PrintToChatAll("%s %t", MT_TAG2, "Zombie", sTankName); - MT_LogMessage(MT_LOG_ABILITY, "%s %T", MT_TAG, "Zombie", LANG_SERVER, sTankName); - } -} - -void vZombie2(int tank, int pos = -1) -{ - if (bIsAreaNarrow(tank, g_esZombieCache[tank].g_flOpenAreasOnly) || bIsAreaWide(tank, g_esZombieCache[tank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esZombiePlayer[tank].g_iTankType, tank) || (g_esZombieCache[tank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esZombieCache[tank].g_iRequiresHumans) || (!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esZombieAbility[g_esZombiePlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esZombiePlayer[tank].g_iAccessFlags))) - { - return; - } - - float flInterval = (pos != -1) ? MT_GetCombinationSetting(tank, 6, pos) : g_esZombieCache[tank].g_flZombieInterval; - if (flInterval > 0.0) - { - DataPack dpZombie; - CreateDataTimer(flInterval, tTimerZombie, dpZombie, TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); - dpZombie.WriteCell(GetClientUserId(tank)); - dpZombie.WriteCell(g_esZombiePlayer[tank].g_iTankType); - dpZombie.WriteCell(GetTime()); - dpZombie.WriteCell(pos); - } -} - -void vZombie3(int tank) -{ - if (bIsAreaNarrow(tank, g_esZombieCache[tank].g_flOpenAreasOnly) || bIsAreaWide(tank, g_esZombieCache[tank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esZombiePlayer[tank].g_iTankType, tank) || (g_esZombieCache[tank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esZombieCache[tank].g_iRequiresHumans) || (!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esZombieAbility[g_esZombiePlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esZombiePlayer[tank].g_iAccessFlags))) - { - return; - } - - for (int iZombie = 1; iZombie <= g_esZombieCache[tank].g_iZombieAmount; iZombie++) - { - switch (g_esZombieCache[tank].g_iZombieMode) - { - case 0: vSpawnZombie(tank, (MT_GetRandomInt(1, 2) == 2)); - case 1: vSpawnZombie(tank, false); - case 2: vSpawnZombie(tank, true); - } - } -} - -void vZombieAbility(int tank) -{ - if ((g_esZombiePlayer[tank].g_iCooldown != -1 && g_esZombiePlayer[tank].g_iCooldown >= GetTime()) || bIsAreaNarrow(tank, g_esZombieCache[tank].g_flOpenAreasOnly) || bIsAreaWide(tank, g_esZombieCache[tank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esZombiePlayer[tank].g_iTankType, tank) || (g_esZombieCache[tank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esZombieCache[tank].g_iRequiresHumans) || (!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esZombieAbility[g_esZombiePlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esZombiePlayer[tank].g_iAccessFlags))) - { - return; - } - - if (!bIsInfected(tank, MT_CHECK_FAKECLIENT) || (g_esZombiePlayer[tank].g_iAmmoCount < g_esZombieCache[tank].g_iHumanAmmo && g_esZombieCache[tank].g_iHumanAmmo > 0)) - { - if (GetRandomFloat(0.1, 100.0) <= g_esZombieCache[tank].g_flZombieChance) - { - vZombie(tank); - } - else if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esZombieCache[tank].g_iHumanAbility == 1) - { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "ZombieHuman2"); - } - } - else if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esZombieCache[tank].g_iHumanAbility == 1) - { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "ZombieAmmo"); - } -} - -void vZombieRange(int tank) -{ - if (MT_IsTankSupported(tank, MT_CHECK_INDEX|MT_CHECK_INGAME) && MT_IsCustomTankSupported(tank) && g_esZombieCache[tank].g_iZombieAbility == 1 && GetRandomFloat(0.1, 100.0) <= g_esZombieCache[tank].g_flZombieChance) - { - if (bIsAreaNarrow(tank, g_esZombieCache[tank].g_flOpenAreasOnly) || bIsAreaWide(tank, g_esZombieCache[tank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esZombiePlayer[tank].g_iTankType, tank) || (g_esZombieCache[tank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esZombieCache[tank].g_iRequiresHumans) || (bIsInfected(tank, MT_CHECK_FAKECLIENT) && ((!MT_HasAdminAccess(tank) && !bHasAdminAccess(tank, g_esZombieAbility[g_esZombiePlayer[tank].g_iTankTypeRecorded].g_iAccessFlags, g_esZombiePlayer[tank].g_iAccessFlags)) || g_esZombieCache[tank].g_iHumanAbility == 0))) - { - return; - } - - vZombie3(tank); - } -} - -void vZombieCopyStats2(int oldTank, int newTank) -{ - g_esZombiePlayer[newTank].g_iAmmoCount = g_esZombiePlayer[oldTank].g_iAmmoCount; - g_esZombiePlayer[newTank].g_iCooldown = g_esZombiePlayer[oldTank].g_iCooldown; -} - -void vRemoveZombie(int tank) -{ - g_esZombiePlayer[tank].g_bActivated = false; - g_esZombiePlayer[tank].g_iAmmoCount = 0; - g_esZombiePlayer[tank].g_iCooldown = -1; -} - -void vZombieReset() -{ - for (int iPlayer = 1; iPlayer <= MaxClients; iPlayer++) - { - if (bIsValidClient(iPlayer, MT_CHECK_INGAME)) - { - vRemoveZombie(iPlayer); - } - } -} - -void vZombieReset2(int tank) -{ - g_esZombiePlayer[tank].g_bActivated = false; - - int iTime = GetTime(), iPos = g_esZombieAbility[g_esZombiePlayer[tank].g_iTankTypeRecorded].g_iComboPosition, iCooldown = (iPos != -1) ? RoundToNearest(MT_GetCombinationSetting(tank, 2, iPos)) : g_esZombieCache[tank].g_iZombieCooldown; - iCooldown = (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esZombieCache[tank].g_iHumanAbility == 1 && g_esZombiePlayer[tank].g_iAmmoCount < g_esZombieCache[tank].g_iHumanAmmo && g_esZombieCache[tank].g_iHumanAmmo > 0) ? g_esZombieCache[tank].g_iHumanCooldown : iCooldown; - g_esZombiePlayer[tank].g_iCooldown = (iTime + iCooldown); - if (g_esZombiePlayer[tank].g_iCooldown != -1 && g_esZombiePlayer[tank].g_iCooldown >= iTime) - { - MT_PrintToChat(tank, "%s %t", MT_TAG3, "ZombieHuman5", (g_esZombiePlayer[tank].g_iCooldown - iTime)); - } -} - -void tTimerZombieCombo(Handle timer, DataPack pack) -{ - pack.Reset(); - - int iTank = GetClientOfUserId(pack.ReadCell()); - if (!MT_IsCorePluginEnabled() || !MT_IsTankSupported(iTank) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esZombieAbility[g_esZombiePlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esZombiePlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esZombiePlayer[iTank].g_iTankType, iTank) || !MT_IsCustomTankSupported(iTank) || g_esZombieCache[iTank].g_iZombieAbility == 0 || g_esZombiePlayer[iTank].g_bActivated) - { - return; - } - - int iPos = pack.ReadCell(); - vZombie(iTank, iPos); -} - -Action tTimerZombie(Handle timer, DataPack pack) -{ - pack.Reset(); - - int iTank = GetClientOfUserId(pack.ReadCell()), iType = pack.ReadCell(); - if (!MT_IsTankSupported(iTank) || bIsAreaNarrow(iTank, g_esZombieCache[iTank].g_flOpenAreasOnly) || bIsAreaWide(iTank, g_esZombieCache[iTank].g_flCloseAreasOnly) || MT_DoesTypeRequireHumans(g_esZombiePlayer[iTank].g_iTankType, iTank) || (g_esZombieCache[iTank].g_iRequiresHumans > 0 && iGetHumanCount() < g_esZombieCache[iTank].g_iRequiresHumans) || (!MT_HasAdminAccess(iTank) && !bHasAdminAccess(iTank, g_esZombieAbility[g_esZombiePlayer[iTank].g_iTankTypeRecorded].g_iAccessFlags, g_esZombiePlayer[iTank].g_iAccessFlags)) || !MT_IsTypeEnabled(g_esZombiePlayer[iTank].g_iTankType, iTank) || !MT_IsCorePluginEnabled() || !MT_IsCustomTankSupported(iTank) || iType != g_esZombiePlayer[iTank].g_iTankType || g_esZombieCache[iTank].g_iZombieAbility == 0 || !g_esZombiePlayer[iTank].g_bActivated) - { - g_esZombiePlayer[iTank].g_bActivated = false; - - return Plugin_Stop; - } - - bool bHuman = bIsInfected(iTank, MT_CHECK_FAKECLIENT); - int iTime = pack.ReadCell(), iCurrentTime = GetTime(), iPos = pack.ReadCell(), - iDuration = (iPos != -1) ? RoundToNearest(MT_GetCombinationSetting(iTank, 5, iPos)) : g_esZombieCache[iTank].g_iZombieDuration; - iDuration = (bHuman && g_esZombieCache[iTank].g_iHumanAbility == 1) ? g_esZombieCache[iTank].g_iHumanDuration : iDuration; - if (iDuration > 0 && (!bHuman || (bHuman && g_esZombieCache[iTank].g_iHumanAbility == 1 && g_esZombieCache[iTank].g_iHumanMode == 0)) && (iTime + iDuration) < iCurrentTime && (g_esZombiePlayer[iTank].g_iCooldown == -1 || g_esZombiePlayer[iTank].g_iCooldown < iCurrentTime)) - { - vZombieReset2(iTank); - - return Plugin_Stop; - } - - vZombie3(iTank); - - if (g_esZombieCache[iTank].g_iZombieMessage == 1) - { - char sTankName[64]; - MT_GetTankName(iTank, sTankName); - MT_PrintToChatAll("%s %t", MT_TAG2, "Zombie2", sTankName); - MT_LogMessage(MT_LOG_ABILITY, "%s %T", MT_TAG, "Zombie2", LANG_SERVER, sTankName); - } - - return Plugin_Continue; -} \ No newline at end of file diff --git a/addons/sourcemod/scripting/mutant_tanks/mt_abilities.sp b/addons/sourcemod/scripting/mutant_tanks/mt_abilities.sp index 74dabadcf2..165289650e 100644 --- a/addons/sourcemod/scripting/mutant_tanks/mt_abilities.sp +++ b/addons/sourcemod/scripting/mutant_tanks/mt_abilities.sp @@ -1,6 +1,6 @@ /** - * Mutant Tanks: a L4D/L4D2 SourceMod Plugin - * Copyright (C) 2024 Alfred "Psyk0tik" Llagas + * Mutant Tanks: A L4D/L4D2 SourceMod Plugin + * Copyright (C) 2017-2025 Alfred "Psyk0tik" Llagas * * 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. * @@ -10,7 +10,7 @@ **/ #define MT_ABILITIES_MAIN -#define MT_ABILITIES_GROUP 3 // 0: NONE, 1: Only include first half (1-20), 2: Only include second half (21-39), 3: ALL +#define MT_ABILITIES_GROUP 3 // 0: NONE, 1: Only include first half (1-15), 2: Only include second half (16-31), 3: ALL #define MT_ABILITIES_COMPILER_MESSAGE 1 // 0: NONE, 1: Display warning messages about excluded abilities, 2: Display error messages about excluded abilities #include @@ -47,11 +47,9 @@ public Plugin myinfo = #define MODEL_TIRES "models/props_vehicles/tire001c_car.mdl" #define MODEL_TREE_TRUNK "models/props_foliage/tree_trunk.mdl" -#define PARTICLE_BASHED "screen_bashed" #define PARTICLE_BLOOD "boomer_explode_D" #define PARTICLE_ELECTRICITY "electrical_arc_01_system" #define PARTICLE_ELECTRICITY2 "electrical_arc_01_parent" -#define PARTICLE_LIGHTNING "storm_lightning_01" #define PARTICLE_SMOKE "smoker_smokecloud" #define SOUND_ATTACK "player/pz/voice/attack/zombiedog_attack2.wav" @@ -65,17 +63,11 @@ public Plugin myinfo = #define SOUND_ELECTRICITY2 "ambient/energy/zap7.wav" #define SOUND_EXPLODE1 "weapons/hegrenade/explode4.wav" #define SOUND_EXPLODE2 "weapons/grenade_launcher/grenadefire/grenade_launcher_explode_1.wav" // Only available in L4D2 -#define SOUND_GROAN2 "ambient/random_amb_sounds/randbridgegroan_03.wav" // Only available in L4D2 -#define SOUND_GROAN1 "ambient/random_amb_sfx/metalscrapeverb08.wav" -#define SOUND_GROWL1 "player/tank/voice/growl/hulk_growl_1.wav" // Only available in L4D1 -#define SOUND_GROWL2 "player/tank/voice/growl/tank_climb_01.wav" // Only available in L4D2 #define SOUND_HEARTBEAT "player/heartbeatloop.wav" #define SOUND_HIT "animation/van_inside_hit_wall.wav" #define SOUND_METAL "physics/metal/metal_solid_impact_hard5.wav" #define SOUND_PAIN1 "player/tank/voice/pain/tank_fire_04.wav" #define SOUND_PAIN2 "player/tank/voice/pain/tank_fire_08.wav" // Only available in L4D2 -#define SOUND_SMASH1 "player/tank/hit/hulk_punch_1.wav" -#define SOUND_SMASH2 "player/charger/hit/charger_smash_02.wav" // Only available in L4D2 #define SPRITE_EXPLODE "sprites/zerogxplode.spr" #define SPRITE_LASER "sprites/laser.vmt" @@ -83,13 +75,14 @@ public Plugin myinfo = bool g_bDedicated, g_bLaggedMovementInstalled, g_bLateLoad, g_bSecondGame; +int g_iGraphicsLevel; + #undef REQUIRE_PLUGIN #if MT_ABILITIES_GROUP == 1 || MT_ABILITIES_GROUP == 3 #tryinclude "mutant_tanks/abilities/mt_absorb.sp" #tryinclude "mutant_tanks/abilities/mt_acid.sp" #tryinclude "mutant_tanks/abilities/mt_aimless.sp" #tryinclude "mutant_tanks/abilities/mt_ammo.sp" - #tryinclude "mutant_tanks/abilities/mt_blind.sp" #tryinclude "mutant_tanks/abilities/mt_bomb.sp" #tryinclude "mutant_tanks/abilities/mt_bury.sp" #tryinclude "mutant_tanks/abilities/mt_car.sp" @@ -101,31 +94,24 @@ bool g_bDedicated, g_bLaggedMovementInstalled, g_bLateLoad, g_bSecondGame; #tryinclude "mutant_tanks/abilities/mt_drunk.sp" #tryinclude "mutant_tanks/abilities/mt_electric.sp" #tryinclude "mutant_tanks/abilities/mt_enforce.sp" +#endif +#if MT_ABILITIES_GROUP == 2 || MT_ABILITIES_GROUP == 3 #tryinclude "mutant_tanks/abilities/mt_fast.sp" #tryinclude "mutant_tanks/abilities/mt_fire.sp" #tryinclude "mutant_tanks/abilities/mt_fling.sp" #tryinclude "mutant_tanks/abilities/mt_fly.sp" -#endif -#if MT_ABILITIES_GROUP == 2 || MT_ABILITIES_GROUP == 3 #tryinclude "mutant_tanks/abilities/mt_fragile.sp" #tryinclude "mutant_tanks/abilities/mt_ghost.sp" #tryinclude "mutant_tanks/abilities/mt_god.sp" #tryinclude "mutant_tanks/abilities/mt_gravity.sp" #tryinclude "mutant_tanks/abilities/mt_gunner.sp" #tryinclude "mutant_tanks/abilities/mt_heal.sp" - #tryinclude "mutant_tanks/abilities/mt_hit.sp" #tryinclude "mutant_tanks/abilities/mt_hurt.sp" #tryinclude "mutant_tanks/abilities/mt_hypno.sp" #tryinclude "mutant_tanks/abilities/mt_ice.sp" #tryinclude "mutant_tanks/abilities/mt_idle.sp" #tryinclude "mutant_tanks/abilities/mt_invert.sp" - #tryinclude "mutant_tanks/abilities/mt_item.sp" #tryinclude "mutant_tanks/abilities/mt_jump.sp" - #tryinclude "mutant_tanks/abilities/mt_kamikaze.sp" - #tryinclude "mutant_tanks/abilities/mt_lag.sp" - #tryinclude "mutant_tanks/abilities/mt_laser.sp" - #tryinclude "mutant_tanks/abilities/mt_leech.sp" - #tryinclude "mutant_tanks/abilities/mt_lightning.sp" #endif #define REQUIRE_PLUGIN @@ -142,9 +128,6 @@ bool g_bDedicated, g_bLaggedMovementInstalled, g_bLateLoad, g_bSecondGame; #if !defined MT_MENU_AMMO #warning The "Ammo" (mt_ammo.sp) ability is missing from the "scripting/mutant_tanks/abilities" folder. #endif - #if !defined MT_MENU_BLIND - #warning The "Blind" (mt_blind.sp) ability is missing from the "scripting/mutant_tanks/abilities" folder. - #endif #if !defined MT_MENU_BOMB #warning The "Bomb" (mt_bomb.sp) ability is missing from the "scripting/mutant_tanks/abilities" folder. #endif @@ -208,9 +191,6 @@ bool g_bDedicated, g_bLaggedMovementInstalled, g_bLateLoad, g_bSecondGame; #if !defined MT_MENU_HEAL #warning The "Heal" (mt_heal.sp) ability is missing from the "scripting/mutant_tanks/abilities" folder. #endif - #if !defined MT_MENU_HIT - #warning The "Hit" (mt_hit.sp) ability is missing from the "scripting/mutant_tanks/abilities" folder. - #endif #if !defined MT_MENU_HURT #warning The "Hurt" (mt_hurt.sp) ability is missing from the "scripting/mutant_tanks/abilities" folder. #endif @@ -226,27 +206,9 @@ bool g_bDedicated, g_bLaggedMovementInstalled, g_bLateLoad, g_bSecondGame; #if !defined MT_MENU_INVERT #warning The "Invert" (mt_invert.sp) ability is missing from the "scripting/mutant_tanks/abilities" folder. #endif - #if !defined MT_MENU_ITEM - #warning The "Item" (mt_item.sp) ability is missing from the "scripting/mutant_tanks/abilities" folder. - #endif #if !defined MT_MENU_JUMP #warning The "Jump" (mt_jump.sp) ability is missing from the "scripting/mutant_tanks/abilities" folder. #endif - #if !defined MT_MENU_KAMIKAZE - #warning The "Kamikaze" (mt_kamikaze.sp) ability is missing from the "scripting/mutant_tanks/abilities" folder. - #endif - #if !defined MT_MENU_LAG - #warning The "Lag" (mt_lag.sp) ability is missing from the "scripting/mutant_tanks/abilities" folder. - #endif - #if !defined MT_MENU_LASER - #warning The "Laser" (mt_laser.sp) ability is missing from the "scripting/mutant_tanks/abilities" folder. - #endif - #if !defined MT_MENU_LEECH - #warning The "Leech" (mt_leech.sp) ability is missing from the "scripting/mutant_tanks/abilities" folder. - #endif - #if !defined MT_MENU_LIGHTNING - #warning The "Lightning" (mt_lightning.sp) ability is missing from the "scripting/mutant_tanks/abilities" folder. - #endif #endif #if MT_ABILITIES_COMPILER_MESSAGE == 2 #if !defined MT_MENU_ABSORB @@ -261,9 +223,6 @@ bool g_bDedicated, g_bLaggedMovementInstalled, g_bLateLoad, g_bSecondGame; #if !defined MT_MENU_AMMO #error The "Ammo" (mt_ammo.sp) ability is missing from the "scripting/mutant_tanks/abilities" folder. #endif - #if !defined MT_MENU_BLIND - #error The "Blind" (mt_blind.sp) ability is missing from the "scripting/mutant_tanks/abilities" folder. - #endif #if !defined MT_MENU_BOMB #error The "Bomb" (mt_bomb.sp) ability is missing from the "scripting/mutant_tanks/abilities" folder. #endif @@ -327,9 +286,6 @@ bool g_bDedicated, g_bLaggedMovementInstalled, g_bLateLoad, g_bSecondGame; #if !defined MT_MENU_HEAL #error The "Heal" (mt_heal.sp) ability is missing from the "scripting/mutant_tanks/abilities" folder. #endif - #if !defined MT_MENU_HIT - #error The "Hit" (mt_hit.sp) ability is missing from the "scripting/mutant_tanks/abilities" folder. - #endif #if !defined MT_MENU_HURT #error The "Hurt" (mt_hurt.sp) ability is missing from the "scripting/mutant_tanks/abilities" folder. #endif @@ -345,27 +301,9 @@ bool g_bDedicated, g_bLaggedMovementInstalled, g_bLateLoad, g_bSecondGame; #if !defined MT_MENU_INVERT #error The "Invert" (mt_invert.sp) ability is missing from the "scripting/mutant_tanks/abilities" folder. #endif - #if !defined MT_MENU_ITEM - #error The "Item" (mt_item.sp) ability is missing from the "scripting/mutant_tanks/abilities" folder. - #endif #if !defined MT_MENU_JUMP #error The "Jump" (mt_jump.sp) ability is missing from the "scripting/mutant_tanks/abilities" folder. #endif - #if !defined MT_MENU_KAMIKAZE - #error The "Kamikaze" (mt_kamikaze.sp) ability is missing from the "scripting/mutant_tanks/abilities" folder. - #endif - #if !defined MT_MENU_LAG - #error The "Lag" (mt_lag.sp) ability is missing from the "scripting/mutant_tanks/abilities" folder. - #endif - #if !defined MT_MENU_LASER - #error The "Laser" (mt_laser.sp) ability is missing from the "scripting/mutant_tanks/abilities" folder. - #endif - #if !defined MT_MENU_LEECH - #error The "Leech" (mt_leech.sp) ability is missing from the "scripting/mutant_tanks/abilities" folder. - #endif - #if !defined MT_MENU_LIGHTNING - #error The "Lightning" (mt_lightning.sp) ability is missing from the "scripting/mutant_tanks/abilities" folder. - #endif #endif /** @@ -469,7 +407,7 @@ public void OnPluginStart() LoadTranslations("mutant_tanks.phrases"); LoadTranslations("mutant_tanks_names.phrases"); - RegConsoleCmd("sm_mt_ability", cmdAbilityInfo, "View information about each ability (A-L)."); + RegConsoleCmd("sm_mt_ability", cmdAbilityInfo, "View information about each ability (A-J)."); vAbilitySetup(0); @@ -524,11 +462,18 @@ public void MT_OnPluginUpdate() public void OnEntityCreated(int entity, const char[] classname) { -#if defined MT_MENU_ITEM - vItemEntityCreated(entity, classname); +#if defined MT_MENU_DROP + vDropEntityCreated(entity, classname); +#endif +} + +public void OnEntityDestroyed(int entity) +{ +#if defined MT_MENU_CAR + vCarEntityDestroyed(entity); #endif -#if defined MT_MENU_KAMIKAZE - vKamikazeEntityCreated(entity, classname); +#if defined MT_MENU_DROP + vDropEntityDestroyed(entity); #endif } @@ -590,9 +535,6 @@ public void MT_OnDisplayMenu(Menu menu) #if defined MT_MENU_AMMO vAmmoDisplayMenu(menu); #endif -#if defined MT_MENU_BLIND - vBlindDisplayMenu(menu); -#endif #if defined MT_MENU_BOMB vBombDisplayMenu(menu); #endif @@ -656,9 +598,6 @@ public void MT_OnDisplayMenu(Menu menu) #if defined MT_MENU_HEAL vHealDisplayMenu(menu); #endif -#if defined MT_MENU_HIT - vHitDisplayMenu(menu); -#endif #if defined MT_MENU_HURT vHurtDisplayMenu(menu); #endif @@ -674,27 +613,9 @@ public void MT_OnDisplayMenu(Menu menu) #if defined MT_MENU_INVERT vInvertDisplayMenu(menu); #endif -#if defined MT_MENU_ITEM - vItemDisplayMenu(menu); -#endif #if defined MT_MENU_JUMP vJumpDisplayMenu(menu); #endif -#if defined MT_MENU_KAMIKAZE - vKamikazeDisplayMenu(menu); -#endif -#if defined MT_MENU_LAG - vLagDisplayMenu(menu); -#endif -#if defined MT_MENU_LASER - vLaserDisplayMenu(menu); -#endif -#if defined MT_MENU_LEECH - vLeechDisplayMenu(menu); -#endif -#if defined MT_MENU_LIGHTNING - vLightningDisplayMenu(menu); -#endif } public void MT_OnMenuItemSelected(int client, const char[] info) @@ -711,9 +632,6 @@ public void MT_OnMenuItemSelected(int client, const char[] info) #if defined MT_MENU_AMMO vAmmoMenuItemSelected(client, info); #endif -#if defined MT_MENU_BLIND - vBlindMenuItemSelected(client, info); -#endif #if defined MT_MENU_BOMB vBombMenuItemSelected(client, info); #endif @@ -777,9 +695,6 @@ public void MT_OnMenuItemSelected(int client, const char[] info) #if defined MT_MENU_HEAL vHealMenuItemSelected(client, info); #endif -#if defined MT_MENU_HIT - vHitMenuItemSelected(client, info); -#endif #if defined MT_MENU_HURT vHurtMenuItemSelected(client, info); #endif @@ -795,27 +710,9 @@ public void MT_OnMenuItemSelected(int client, const char[] info) #if defined MT_MENU_INVERT vInvertMenuItemSelected(client, info); #endif -#if defined MT_MENU_ITEM - vItemMenuItemSelected(client, info); -#endif #if defined MT_MENU_JUMP vJumpMenuItemSelected(client, info); #endif -#if defined MT_MENU_KAMIKAZE - vKamikazeMenuItemSelected(client, info); -#endif -#if defined MT_MENU_LAG - vLagMenuItemSelected(client, info); -#endif -#if defined MT_MENU_LASER - vLaserMenuItemSelected(client, info); -#endif -#if defined MT_MENU_LEECH - vLeechMenuItemSelected(client, info); -#endif -#if defined MT_MENU_LIGHTNING - vLightningMenuItemSelected(client, info); -#endif } public void MT_OnMenuItemDisplayed(int client, const char[] info, char[] buffer, int size) @@ -832,9 +729,6 @@ public void MT_OnMenuItemDisplayed(int client, const char[] info, char[] buffer, #if defined MT_MENU_AMMO vAmmoMenuItemDisplayed(client, info, buffer, size); #endif -#if defined MT_MENU_BLIND - vBlindMenuItemDisplayed(client, info, buffer, size); -#endif #if defined MT_MENU_BOMB vBombMenuItemDisplayed(client, info, buffer, size); #endif @@ -898,9 +792,6 @@ public void MT_OnMenuItemDisplayed(int client, const char[] info, char[] buffer, #if defined MT_MENU_HEAL vHealMenuItemDisplayed(client, info, buffer, size); #endif -#if defined MT_MENU_HIT - vHitMenuItemDisplayed(client, info, buffer, size); -#endif #if defined MT_MENU_HURT vHurtMenuItemDisplayed(client, info, buffer, size); #endif @@ -916,27 +807,9 @@ public void MT_OnMenuItemDisplayed(int client, const char[] info, char[] buffer, #if defined MT_MENU_INVERT vInvertMenuItemDisplayed(client, info, buffer, size); #endif -#if defined MT_MENU_ITEM - vItemMenuItemDisplayed(client, info, buffer, size); -#endif #if defined MT_MENU_JUMP vJumpMenuItemDisplayed(client, info, buffer, size); #endif -#if defined MT_MENU_KAMIKAZE - vKamikazeMenuItemDisplayed(client, info, buffer, size); -#endif -#if defined MT_MENU_LAG - vLagMenuItemDisplayed(client, info, buffer, size); -#endif -#if defined MT_MENU_LASER - vLaserMenuItemDisplayed(client, info, buffer, size); -#endif -#if defined MT_MENU_LEECH - vLeechMenuItemDisplayed(client, info, buffer, size); -#endif -#if defined MT_MENU_LIGHTNING - vLightningMenuItemDisplayed(client, info, buffer, size); -#endif } public Action OnPlayerRunCmd(int client, int &buttons, int &impulse, float vel[3], float angles[3], int &weapon) @@ -1015,9 +888,6 @@ public void MT_OnPluginCheck(ArrayList list) #if defined MT_MENU_AMMO vAmmoPluginCheck(list); #endif -#if defined MT_MENU_BLIND - vBlindPluginCheck(list); -#endif #if defined MT_MENU_BOMB vBombPluginCheck(list); #endif @@ -1081,9 +951,6 @@ public void MT_OnPluginCheck(ArrayList list) #if defined MT_MENU_HEAL vHealPluginCheck(list); #endif -#if defined MT_MENU_HIT - vHitPluginCheck(list); -#endif #if defined MT_MENU_HURT vHurtPluginCheck(list); #endif @@ -1099,27 +966,9 @@ public void MT_OnPluginCheck(ArrayList list) #if defined MT_MENU_INVERT vInvertPluginCheck(list); #endif -#if defined MT_MENU_ITEM - vItemPluginCheck(list); -#endif #if defined MT_MENU_JUMP vJumpPluginCheck(list); #endif -#if defined MT_MENU_KAMIKAZE - vKamikazePluginCheck(list); -#endif -#if defined MT_MENU_LAG - vLagPluginCheck(list); -#endif -#if defined MT_MENU_LASER - vLaserPluginCheck(list); -#endif -#if defined MT_MENU_LEECH - vLeechPluginCheck(list); -#endif -#if defined MT_MENU_LIGHTNING - vLightningPluginCheck(list); -#endif } public void MT_OnAbilityCheck(ArrayList list, ArrayList list2, ArrayList list3, ArrayList list4) @@ -1136,9 +985,6 @@ public void MT_OnAbilityCheck(ArrayList list, ArrayList list2, ArrayList list3, #if defined MT_MENU_AMMO vAmmoAbilityCheck(list, list2, list3, list4); #endif -#if defined MT_MENU_BLIND - vBlindAbilityCheck(list, list2, list3, list4); -#endif #if defined MT_MENU_BOMB vBombAbilityCheck(list, list2, list3, list4); #endif @@ -1202,9 +1048,6 @@ public void MT_OnAbilityCheck(ArrayList list, ArrayList list2, ArrayList list3, #if defined MT_MENU_HEAL vHealAbilityCheck(list, list2, list3, list4); #endif -#if defined MT_MENU_HIT - vHitAbilityCheck(list, list2, list3, list4); -#endif #if defined MT_MENU_HURT vHurtAbilityCheck(list, list2, list3, list4); #endif @@ -1220,27 +1063,9 @@ public void MT_OnAbilityCheck(ArrayList list, ArrayList list2, ArrayList list3, #if defined MT_MENU_INVERT vInvertAbilityCheck(list, list2, list3, list4); #endif -#if defined MT_MENU_ITEM - vItemAbilityCheck(list, list2, list3, list4); -#endif #if defined MT_MENU_JUMP vJumpAbilityCheck(list, list2, list3, list4); #endif -#if defined MT_MENU_KAMIKAZE - vKamikazeAbilityCheck(list, list2, list3, list4); -#endif -#if defined MT_MENU_LAG - vLagAbilityCheck(list, list2, list3, list4); -#endif -#if defined MT_MENU_LASER - vLaserAbilityCheck(list, list2, list3, list4); -#endif -#if defined MT_MENU_LEECH - vLeechAbilityCheck(list, list2, list3, list4); -#endif -#if defined MT_MENU_LIGHTNING - vLightningAbilityCheck(list, list2, list3, list4); -#endif } public void MT_OnCombineAbilities(int tank, int type, const float random, const char[] combo, int survivor, int weapon, const char[] classname) @@ -1257,9 +1082,6 @@ public void MT_OnCombineAbilities(int tank, int type, const float random, const #if defined MT_MENU_AMMO vAmmoCombineAbilities(tank, type, random, combo, survivor, classname); #endif -#if defined MT_MENU_BLIND - vBlindCombineAbilities(tank, type, random, combo, survivor, classname); -#endif #if defined MT_MENU_BOMB vBombCombineAbilities(tank, type, random, combo, survivor, weapon, classname); #endif @@ -1338,27 +1160,9 @@ public void MT_OnCombineAbilities(int tank, int type, const float random, const #if defined MT_MENU_INVERT vInvertCombineAbilities(tank, type, random, combo, survivor, classname); #endif -#if defined MT_MENU_ITEM - vItemCombineAbilities(tank, type, random, combo); -#endif #if defined MT_MENU_JUMP vJumpCombineAbilities(tank, type, random, combo, survivor, classname); #endif -#if defined MT_MENU_KAMIKAZE - vKamikazeCombineAbilities(tank, type, random, combo, survivor, classname); -#endif -#if defined MT_MENU_LAG - vLagCombineAbilities(tank, type, random, combo, survivor, classname); -#endif -#if defined MT_MENU_LASER - vLaserCombineAbilities(tank, type, random, combo); -#endif -#if defined MT_MENU_LEECH - vLeechCombineAbilities(tank, type, random, combo, survivor, classname); -#endif -#if defined MT_MENU_LIGHTNING - vLightningCombineAbilities(tank, type, random, combo); -#endif } public void MT_OnConfigsLoad(int mode) @@ -1375,9 +1179,6 @@ public void MT_OnConfigsLoad(int mode) #if defined MT_MENU_AMMO vAmmoConfigsLoad(mode); #endif -#if defined MT_MENU_BLIND - vBlindConfigsLoad(mode); -#endif #if defined MT_MENU_BOMB vBombConfigsLoad(mode); #endif @@ -1441,9 +1242,6 @@ public void MT_OnConfigsLoad(int mode) #if defined MT_MENU_HEAL vHealConfigsLoad(mode); #endif -#if defined MT_MENU_HIT - vHitConfigsLoad(mode); -#endif #if defined MT_MENU_HURT vHurtConfigsLoad(mode); #endif @@ -1459,27 +1257,9 @@ public void MT_OnConfigsLoad(int mode) #if defined MT_MENU_INVERT vInvertConfigsLoad(mode); #endif -#if defined MT_MENU_ITEM - vItemConfigsLoad(mode); -#endif #if defined MT_MENU_JUMP vJumpConfigsLoad(mode); #endif -#if defined MT_MENU_KAMIKAZE - vKamikazeConfigsLoad(mode); -#endif -#if defined MT_MENU_LAG - vLagConfigsLoad(mode); -#endif -#if defined MT_MENU_LASER - vLaserConfigsLoad(mode); -#endif -#if defined MT_MENU_LEECH - vLeechConfigsLoad(mode); -#endif -#if defined MT_MENU_LIGHTNING - vLightningConfigsLoad(mode); -#endif } public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const char[] value, int type, int admin, int mode, bool special, const char[] specsection) @@ -1496,9 +1276,6 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const #if defined MT_MENU_AMMO vAmmoConfigsLoaded(subsection, key, value, type, admin, mode, special, specsection); #endif -#if defined MT_MENU_BLIND - vBlindConfigsLoaded(subsection, key, value, type, admin, mode, special, specsection); -#endif #if defined MT_MENU_BOMB vBombConfigsLoaded(subsection, key, value, type, admin, mode, special, specsection); #endif @@ -1562,9 +1339,6 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const #if defined MT_MENU_HEAL vHealConfigsLoaded(subsection, key, value, type, admin, mode, special, specsection); #endif -#if defined MT_MENU_HIT - vHitConfigsLoaded(subsection, key, value, type, admin, mode, special, specsection); -#endif #if defined MT_MENU_HURT vHurtConfigsLoaded(subsection, key, value, type, admin, mode, special, specsection); #endif @@ -1580,31 +1354,14 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const #if defined MT_MENU_INVERT vInvertConfigsLoaded(subsection, key, value, type, admin, mode, special, specsection); #endif -#if defined MT_MENU_ITEM - vItemConfigsLoaded(subsection, key, value, type, admin, mode, special, specsection); -#endif #if defined MT_MENU_JUMP vJumpConfigsLoaded(subsection, key, value, type, admin, mode, special, specsection); #endif -#if defined MT_MENU_KAMIKAZE - vKamikazeConfigsLoaded(subsection, key, value, type, admin, mode, special, specsection); -#endif -#if defined MT_MENU_LAG - vLagConfigsLoaded(subsection, key, value, type, admin, mode, special, specsection); -#endif -#if defined MT_MENU_LASER - vLaserConfigsLoaded(subsection, key, value, type, admin, mode, special, specsection); -#endif -#if defined MT_MENU_LEECH - vLeechConfigsLoaded(subsection, key, value, type, admin, mode, special, specsection); -#endif -#if defined MT_MENU_LIGHTNING - vLightningConfigsLoaded(subsection, key, value, type, admin, mode, special, specsection); -#endif } public void MT_OnSettingsCached(int tank, bool apply, int type) { + g_iGraphicsLevel = MT_GetGraphicsLevel(); #if defined MT_MENU_ABSORB vAbsorbSettingsCached(tank, apply, type); #endif @@ -1617,9 +1374,6 @@ public void MT_OnSettingsCached(int tank, bool apply, int type) #if defined MT_MENU_AMMO vAmmoSettingsCached(tank, apply, type); #endif -#if defined MT_MENU_BLIND - vBlindSettingsCached(tank, apply, type); -#endif #if defined MT_MENU_BOMB vBombSettingsCached(tank, apply, type); #endif @@ -1683,9 +1437,6 @@ public void MT_OnSettingsCached(int tank, bool apply, int type) #if defined MT_MENU_HEAL vHealSettingsCached(tank, apply, type); #endif -#if defined MT_MENU_HIT - vHitSettingsCached(tank, apply, type); -#endif #if defined MT_MENU_HURT vHurtSettingsCached(tank, apply, type); #endif @@ -1701,27 +1452,9 @@ public void MT_OnSettingsCached(int tank, bool apply, int type) #if defined MT_MENU_INVERT vInvertSettingsCached(tank, apply, type); #endif -#if defined MT_MENU_ITEM - vItemSettingsCached(tank, apply, type); -#endif #if defined MT_MENU_JUMP vJumpSettingsCached(tank, apply, type); #endif -#if defined MT_MENU_KAMIKAZE - vKamikazeSettingsCached(tank, apply, type); -#endif -#if defined MT_MENU_LAG - vLagSettingsCached(tank, apply, type); -#endif -#if defined MT_MENU_LASER - vLaserSettingsCached(tank, apply, type); -#endif -#if defined MT_MENU_LEECH - vLeechSettingsCached(tank, apply, type); -#endif -#if defined MT_MENU_LIGHTNING - vLightningSettingsCached(tank, apply, type); -#endif } public void MT_OnCopyStats(int oldTank, int newTank) @@ -1738,9 +1471,6 @@ public void MT_OnCopyStats(int oldTank, int newTank) #if defined MT_MENU_AMMO vAmmoCopyStats(oldTank, newTank); #endif -#if defined MT_MENU_BLIND - vBlindCopyStats(oldTank, newTank); -#endif #if defined MT_MENU_BOMB vBombCopyStats(oldTank, newTank); #endif @@ -1819,27 +1549,9 @@ public void MT_OnCopyStats(int oldTank, int newTank) #if defined MT_MENU_INVERT vInvertCopyStats(oldTank, newTank); #endif -#if defined MT_MENU_ITEM - vItemCopyStats(oldTank, newTank); -#endif #if defined MT_MENU_JUMP vJumpCopyStats(oldTank, newTank); #endif -#if defined MT_MENU_KAMIKAZE - vKamikazeCopyStats(oldTank, newTank); -#endif -#if defined MT_MENU_LAG - vLagCopyStats(oldTank, newTank); -#endif -#if defined MT_MENU_LASER - vLaserCopyStats(oldTank, newTank); -#endif -#if defined MT_MENU_LEECH - vLeechCopyStats(oldTank, newTank); -#endif -#if defined MT_MENU_LIGHTNING - vLightningCopyStats(oldTank, newTank); -#endif } public void MT_OnHookEvent(bool hooked) @@ -1866,9 +1578,6 @@ public void MT_OnEventFired(Event event, const char[] name, bool dontBroadcast) #if defined MT_MENU_AMMO vAmmoEventFired(event, name); #endif -#if defined MT_MENU_BLIND - vBlindEventFired(event, name); -#endif #if defined MT_MENU_BOMB vBombEventFired(event, name); #endif @@ -1947,27 +1656,9 @@ public void MT_OnEventFired(Event event, const char[] name, bool dontBroadcast) #if defined MT_MENU_INVERT vInvertEventFired(event, name); #endif -#if defined MT_MENU_ITEM - vItemEventFired(event, name); -#endif #if defined MT_MENU_JUMP vJumpEventFired(event, name); #endif -#if defined MT_MENU_KAMIKAZE - vKamikazeEventFired(event, name); -#endif -#if defined MT_MENU_LAG - vLagEventFired(event, name); -#endif -#if defined MT_MENU_LASER - vLaserEventFired(event, name); -#endif -#if defined MT_MENU_LEECH - vLeechEventFired(event, name); -#endif -#if defined MT_MENU_LIGHTNING - vLightningEventFired(event, name); -#endif } public void MT_OnAbilityActivated(int tank) @@ -1989,9 +1680,6 @@ public void MT_OnButtonPressed(int tank, int button) #if defined MT_MENU_AMMO vAmmoButtonPressed(tank, button); #endif -#if defined MT_MENU_BLIND - vBlindButtonPressed(tank, button); -#endif #if defined MT_MENU_BOMB vBombButtonPressed(tank, button); #endif @@ -2070,27 +1758,9 @@ public void MT_OnButtonPressed(int tank, int button) #if defined MT_MENU_INVERT vInvertButtonPressed(tank, button); #endif -#if defined MT_MENU_ITEM - vItemButtonPressed(tank, button); -#endif #if defined MT_MENU_JUMP vJumpButtonPressed(tank, button); #endif -#if defined MT_MENU_KAMIKAZE - vKamikazeButtonPressed(tank, button); -#endif -#if defined MT_MENU_LAG - vLagButtonPressed(tank, button); -#endif -#if defined MT_MENU_LASER - vLaserButtonPressed(tank, button); -#endif -#if defined MT_MENU_LEECH - vLeechButtonPressed(tank, button); -#endif -#if defined MT_MENU_LIGHTNING - vLightningButtonPressed(tank, button); -#endif } public void MT_OnButtonReleased(int tank, int button) @@ -2131,12 +1801,6 @@ public void MT_OnButtonReleased(int tank, int button) #if defined MT_MENU_JUMP vJumpButtonReleased(tank, button); #endif -#if defined MT_MENU_LASER - vLaserButtonReleased(tank, button); -#endif -#if defined MT_MENU_LIGHTNING - vLightningButtonReleased(tank, button); -#endif } public void MT_OnChangeType(int tank, int oldType, int newType, bool revert) @@ -2153,9 +1817,6 @@ public void MT_OnChangeType(int tank, int oldType, int newType, bool revert) #if defined MT_MENU_AMMO vAmmoChangeType(tank, oldType); #endif -#if defined MT_MENU_BLIND - vBlindChangeType(tank, oldType); -#endif #if defined MT_MENU_BOMB vBombChangeType(tank, oldType); #endif @@ -2234,27 +1895,9 @@ public void MT_OnChangeType(int tank, int oldType, int newType, bool revert) #if defined MT_MENU_INVERT vInvertChangeType(tank, oldType); #endif -#if defined MT_MENU_ITEM - vItemChangeType(tank, oldType); -#endif #if defined MT_MENU_JUMP vJumpChangeType(tank, oldType); #endif -#if defined MT_MENU_KAMIKAZE - vKamikazeChangeType(tank, oldType); -#endif -#if defined MT_MENU_LAG - vLagChangeType(tank, oldType); -#endif -#if defined MT_MENU_LASER - vLaserChangeType(tank, oldType); -#endif -#if defined MT_MENU_LEECH - vLeechChangeType(tank, oldType); -#endif -#if defined MT_MENU_LIGHTNING - vLightningChangeType(tank, oldType); -#endif } public void MT_OnPostTankSpawn(int tank) @@ -2275,11 +1918,8 @@ public Action MT_OnFatalFalling(int survivor) public void MT_OnPlayerEventKilled(int victim, int attacker) { -#if defined MT_MENU_ITEM - vItemPlayerEventKilled(victim, attacker); -#endif -#if defined MT_MENU_KAMIKAZE - vKamikazePlayerEventKilled(victim, attacker); +#if defined MT_MENU_DROP + vDropPlayerEventKilled(victim, attacker); #endif } @@ -2363,9 +2003,6 @@ void vAbilityMenu(int client, const char[] name) #if defined MT_MENU_AMMO vAmmoMenu(client, name, 0); #endif -#if defined MT_MENU_BLIND - vBlindMenu(client, name, 0); -#endif #if defined MT_MENU_BOMB vBombMenu(client, name, 0); #endif @@ -2429,9 +2066,6 @@ void vAbilityMenu(int client, const char[] name) #if defined MT_MENU_HEAL vHealMenu(client, name, 0); #endif -#if defined MT_MENU_HIT - vHitMenu(client, name, 0); -#endif #if defined MT_MENU_HURT vHurtMenu(client, name, 0); #endif @@ -2447,26 +2081,8 @@ void vAbilityMenu(int client, const char[] name) #if defined MT_MENU_INVERT vInvertMenu(client, name, 0); #endif -#if defined MT_MENU_ITEM - vItemMenu(client, name, 0); -#endif #if defined MT_MENU_JUMP vJumpMenu(client, name, 0); -#endif -#if defined MT_MENU_KAMIKAZE - vKamikazeMenu(client, name, 0); -#endif -#if defined MT_MENU_LAG - vLagMenu(client, name, 0); -#endif -#if defined MT_MENU_LASER - vLaserMenu(client, name, 0); -#endif -#if defined MT_MENU_LEECH - vLeechMenu(client, name, 0); -#endif -#if defined MT_MENU_LIGHTNING - vLightningMenu(client, name, 0); #endif bool bLog = false; if (bLog) @@ -2510,14 +2126,6 @@ void vAbilityPlayer(int type, int client) case 3: vAmmoAbilityActivated(client); } #endif -#if defined MT_MENU_BLIND - switch (type) - { - case 0: vBlindClientPutInServer(client); - case 2: vBlindClientDisconnect_Post(client); - case 3: vBlindAbilityActivated(client); - } -#endif #if defined MT_MENU_BOMB switch (type) { @@ -2692,12 +2300,6 @@ void vAbilityPlayer(int type, int client) case 3: vHealAbilityActivated(client); } #endif -#if defined MT_MENU_HIT - if (type == 0) - { - vHitClientPutInServer(client); - } -#endif #if defined MT_MENU_HURT switch (type) { @@ -2739,14 +2341,6 @@ void vAbilityPlayer(int type, int client) case 3: vInvertAbilityActivated(client); } #endif -#if defined MT_MENU_ITEM - switch (type) - { - case 0: vItemClientPutInServer(client); - case 2: vItemClientDisconnect_Post(client); - case 3: vItemAbilityActivated(client); - } -#endif #if defined MT_MENU_JUMP switch (type) { @@ -2754,46 +2348,6 @@ void vAbilityPlayer(int type, int client) case 2: vJumpClientDisconnect_Post(client); case 3: vJumpAbilityActivated(client); } -#endif -#if defined MT_MENU_KAMIKAZE - switch (type) - { - case 0: vKamikazeClientPutInServer(client); - case 2: vKamikazeClientDisconnect_Post(client); - case 3: vKamikazeAbilityActivated(client); - } -#endif -#if defined MT_MENU_LAG - switch (type) - { - case 0: vLagClientPutInServer(client); - case 2: vLagClientDisconnect_Post(client); - case 3: vLagAbilityActivated(client); - } -#endif -#if defined MT_MENU_LASER - switch (type) - { - case 0: vLaserClientPutInServer(client); - case 2: vLaserClientDisconnect_Post(client); - case 3: vLaserAbilityActivated(client); - } -#endif -#if defined MT_MENU_LEECH - switch (type) - { - case 0: vLeechClientPutInServer(client); - case 2: vLeechClientDisconnect_Post(client); - case 3: vLeechAbilityActivated(client); - } -#endif -#if defined MT_MENU_LIGHTNING - switch (type) - { - case 0: vLightningClientPutInServer(client); - case 2: vLightningClientDisconnect_Post(client); - case 3: vLightningAbilityActivated(client); - } #endif bool bLog = false; if (bLog) @@ -2832,15 +2386,6 @@ void vAbilitySetup(int type) case 2: vAmmoMapEnd(); } #endif -#if defined MT_MENU_BLIND - switch (type) - { - case 0: vBlindPluginStart(); - case 1: vBlindMapStart(); - case 2: vBlindMapEnd(); - case 3: vBlindPluginEnd(); - } -#endif #if defined MT_MENU_BOMB switch (type) { @@ -3038,54 +2583,12 @@ void vAbilitySetup(int type) case 2: vInvertMapEnd(); } #endif -#if defined MT_MENU_ITEM - switch (type) - { - case 1: vItemMapStart(); - case 2: vItemMapEnd(); - } -#endif #if defined MT_MENU_JUMP switch (type) { case 1: vJumpMapStart(); case 2: vJumpMapEnd(); } -#endif -#if defined MT_MENU_KAMIKAZE - switch (type) - { - case 1: vKamikazeMapStart(); - case 2: vKamikazeMapEnd(); - } -#endif -#if defined MT_MENU_LAG - switch (type) - { - case 1: vLagMapStart(); - case 2: vLagMapEnd(); - } -#endif -#if defined MT_MENU_LASER - switch (type) - { - case 1: vLaserMapStart(); - case 2: vLaserMapEnd(); - } -#endif -#if defined MT_MENU_LEECH - switch (type) - { - case 1: vLeechMapStart(); - case 2: vLeechMapEnd(); - } -#endif -#if defined MT_MENU_LIGHTNING - switch (type) - { - case 1: vLightningMapStart(); - case 2: vLightningMapEnd(); - } #endif bool bLog = false; if (bLog) diff --git a/addons/sourcemod/scripting/mutant_tanks/mt_abilities2.sp b/addons/sourcemod/scripting/mutant_tanks/mt_abilities2.sp index 0827ddc797..b08a7c944f 100644 --- a/addons/sourcemod/scripting/mutant_tanks/mt_abilities2.sp +++ b/addons/sourcemod/scripting/mutant_tanks/mt_abilities2.sp @@ -1,6 +1,6 @@ /** - * Mutant Tanks: a L4D/L4D2 SourceMod Plugin - * Copyright (C) 2024 Alfred "Psyk0tik" Llagas + * Mutant Tanks: A L4D/L4D2 SourceMod Plugin + * Copyright (C) 2017-2025 Alfred "Psyk0tik" Llagas * * 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. * @@ -10,7 +10,7 @@ **/ #define MT_ABILITIES_MAIN2 -#define MT_ABILITIES_GROUP2 3 // 0: NONE, 1: Only include first half (1-20), 2: Only include second half (21-39), 3: ALL +#define MT_ABILITIES_GROUP2 3 // 0: NONE, 1: Only include first half (1-15), 2: Only include second half (16-31), 3: ALL #define MT_ABILITIES_COMPILER_MESSAGE2 1 // 0: NONE, 1: Display warning messages about excluded abilities, 2: Display error messages about excluded abilities #include @@ -45,8 +45,10 @@ public Plugin myinfo = #define MODEL_ROADCREW "models/infected/common_male_roadcrew.mdl" #define MODEL_SHIELD "models/props_unique/airport/atlas_break_ball.mdl" +#define PARTICLE_BASHED "screen_bashed" #define PARTICLE_BLOOD "boomer_explode_D" #define PARTICLE_ELECTRICITY "electrical_arc_01_system" +#define PARTICLE_LIGHTNING "storm_lightning_01" #define PARTICLE_VOMIT "boomer_vomit" #define SOUND_CHARGE "items/suitchargeok1.wav" @@ -55,6 +57,8 @@ public Plugin myinfo = #define SOUND_ELECTRICITY2 "ambient/energy/zap7.wav" #define SOUND_EXPLOSION "ambient/explosions/explode_2.wav" #define SOUND_FIRE "weapons/molotov/fire_ignite_1.wav" +#define SOUND_GROAN1 "ambient/random_amb_sfx/metalscrapeverb08.wav" +#define SOUND_GROAN2 "ambient/random_amb_sounds/randbridgegroan_03.wav" // Only available in L4D2 #define SOUND_GROWL1 "player/tank/voice/growl/hulk_growl_1.wav" // Only available in L4D1 #define SOUND_GROWL2 "player/tank/voice/growl/tank_climb_01.wav" // Only available in L4D2 #define SOUND_LAUNCH "player/boomer/explode/explo_medium_14.wav" @@ -71,53 +75,56 @@ public Plugin myinfo = bool g_bDedicated, g_bLaggedMovementInstalled, g_bLateLoad, g_bSecondGame; +int g_iGraphicsLevel; + #undef REQUIRE_PLUGIN #if MT_ABILITIES_GROUP2 == 1 || MT_ABILITIES_GROUP2 == 3 + #tryinclude "mutant_tanks/abilities2/mt_lag.sp" + #tryinclude "mutant_tanks/abilities2/mt_laser.sp" + #tryinclude "mutant_tanks/abilities2/mt_lightning.sp" #tryinclude "mutant_tanks/abilities2/mt_medic.sp" #tryinclude "mutant_tanks/abilities2/mt_meteor.sp" #tryinclude "mutant_tanks/abilities2/mt_minion.sp" - #tryinclude "mutant_tanks/abilities2/mt_necro.sp" #tryinclude "mutant_tanks/abilities2/mt_nullify.sp" #tryinclude "mutant_tanks/abilities2/mt_omni.sp" #tryinclude "mutant_tanks/abilities2/mt_panic.sp" - #tryinclude "mutant_tanks/abilities2/mt_pimp.sp" #tryinclude "mutant_tanks/abilities2/mt_puke.sp" #tryinclude "mutant_tanks/abilities2/mt_pyro.sp" #tryinclude "mutant_tanks/abilities2/mt_quiet.sp" #tryinclude "mutant_tanks/abilities2/mt_recall.sp" #tryinclude "mutant_tanks/abilities2/mt_recoil.sp" #tryinclude "mutant_tanks/abilities2/mt_regen.sp" +#endif +#if MT_ABILITIES_GROUP2 == 2 || MT_ABILITIES_GROUP2 == 3 #tryinclude "mutant_tanks/abilities2/mt_respawn.sp" #tryinclude "mutant_tanks/abilities2/mt_restart.sp" #tryinclude "mutant_tanks/abilities2/mt_rock.sp" - #tryinclude "mutant_tanks/abilities2/mt_rocket.sp" - #tryinclude "mutant_tanks/abilities2/mt_shake.sp" #tryinclude "mutant_tanks/abilities2/mt_shield.sp" -#endif -#if MT_ABILITIES_GROUP2 == 2 || MT_ABILITIES_GROUP2 == 3 #tryinclude "mutant_tanks/abilities2/mt_shove.sp" #tryinclude "mutant_tanks/abilities2/mt_slow.sp" #tryinclude "mutant_tanks/abilities2/mt_smash.sp" - #tryinclude "mutant_tanks/abilities2/mt_smite.sp" - #tryinclude "mutant_tanks/abilities2/mt_spam.sp" - #tryinclude "mutant_tanks/abilities2/mt_splash.sp" - #tryinclude "mutant_tanks/abilities2/mt_splatter.sp" #tryinclude "mutant_tanks/abilities2/mt_throw.sp" #tryinclude "mutant_tanks/abilities2/mt_track.sp" #tryinclude "mutant_tanks/abilities2/mt_ultimate.sp" #tryinclude "mutant_tanks/abilities2/mt_undead.sp" - #tryinclude "mutant_tanks/abilities2/mt_vampire.sp" #tryinclude "mutant_tanks/abilities2/mt_vision.sp" #tryinclude "mutant_tanks/abilities2/mt_warp.sp" #tryinclude "mutant_tanks/abilities2/mt_whirl.sp" #tryinclude "mutant_tanks/abilities2/mt_witch.sp" - #tryinclude "mutant_tanks/abilities2/mt_xiphos.sp" #tryinclude "mutant_tanks/abilities2/mt_yell.sp" - #tryinclude "mutant_tanks/abilities2/mt_zombie.sp" #endif #define REQUIRE_PLUGIN #if MT_ABILITIES_COMPILER_MESSAGE2 == 1 + #if !defined MT_MENU_LAG + #warning The "Lag" (mt_lag.sp) ability is missing from the "scripting/mutant_tanks/abilities2" folder. + #endif + #if !defined MT_MENU_LASER + #warning The "Laser" (mt_laser.sp) ability is missing from the "scripting/mutant_tanks/abilities2" folder. + #endif + #if !defined MT_MENU_LIGHTNING + #warning The "Lightning" (mt_lightning.sp) ability is missing from the "scripting/mutant_tanks/abilities2" folder. + #endif #if !defined MT_MENU_MEDIC #warning The "Medic" (mt_medic.sp) ability is missing from the "scripting/mutant_tanks/abilities2" folder. #endif @@ -127,9 +134,6 @@ bool g_bDedicated, g_bLaggedMovementInstalled, g_bLateLoad, g_bSecondGame; #if !defined MT_MENU_MINION #warning The "Minion" (mt_minion.sp) ability is missing from the "scripting/mutant_tanks/abilities2" folder. #endif - #if !defined MT_MENU_NECRO - #warning The "Necro" (mt_necro.sp) ability is missing from the "scripting/mutant_tanks/abilities2" folder. - #endif #if !defined MT_MENU_NULLIFY #warning The "Nullify" (mt_nullify.sp) ability is missing from the "scripting/mutant_tanks/abilities2" folder. #endif @@ -139,9 +143,6 @@ bool g_bDedicated, g_bLaggedMovementInstalled, g_bLateLoad, g_bSecondGame; #if !defined MT_MENU_PANIC #warning The "Panic" (mt_panic.sp) ability is missing from the "scripting/mutant_tanks/abilities2" folder. #endif - #if !defined MT_MENU_PIMP - #warning The "Pimp" (mt_pimp.sp) ability is missing from the "scripting/mutant_tanks/abilities2" folder. - #endif #if !defined MT_MENU_PUKE #warning The "Puke" (mt_puke.sp) ability is missing from the "scripting/mutant_tanks/abilities2" folder. #endif @@ -169,12 +170,6 @@ bool g_bDedicated, g_bLaggedMovementInstalled, g_bLateLoad, g_bSecondGame; #if !defined MT_MENU_ROCK #warning The "Rock" (mt_rock.sp) ability is missing from the "scripting/mutant_tanks/abilities2" folder. #endif - #if !defined MT_MENU_ROCKET - #warning The "Rocket" (mt_rocket.sp) ability is missing from the "scripting/mutant_tanks/abilities2" folder. - #endif - #if !defined MT_MENU_SHAKE - #warning The "Shake" (mt_shake.sp) ability is missing from the "scripting/mutant_tanks/abilities2" folder. - #endif #if !defined MT_MENU_SHIELD #warning The "Shield" (mt_shield.sp) ability is missing from the "scripting/mutant_tanks/abilities2" folder. #endif @@ -187,18 +182,6 @@ bool g_bDedicated, g_bLaggedMovementInstalled, g_bLateLoad, g_bSecondGame; #if !defined MT_MENU_SMASH #warning The "Smash" (mt_smash.sp) ability is missing from the "scripting/mutant_tanks/abilities2" folder. #endif - #if !defined MT_MENU_SMITE - #warning The "Smite" (mt_smite.sp) ability is missing from the "scripting/mutant_tanks/abilities2" folder. - #endif - #if !defined MT_MENU_SPAM - #warning The "Spam" (mt_spam.sp) ability is missing from the "scripting/mutant_tanks/abilities2" folder. - #endif - #if !defined MT_MENU_SPLASH - #warning The "Splash" (mt_splash.sp) ability is missing from the "scripting/mutant_tanks/abilities2" folder. - #endif - #if !defined MT_MENU_SPLATTER - #warning The "Splatter" (mt_splatter.sp) ability is missing from the "scripting/mutant_tanks/abilities2" folder. - #endif #if !defined MT_MENU_THROW #warning The "Throw" (mt_throw.sp) ability is missing from the "scripting/mutant_tanks/abilities2" folder. #endif @@ -211,9 +194,6 @@ bool g_bDedicated, g_bLaggedMovementInstalled, g_bLateLoad, g_bSecondGame; #if !defined MT_MENU_UNDEAD #warning The "Undead" (mt_undead.sp) ability is missing from the "scripting/mutant_tanks/abilities2" folder. #endif - #if !defined MT_MENU_VAMPIRE - #warning The "Vampire" (mt_vampire.sp) ability is missing from the "scripting/mutant_tanks/abilities2" folder. - #endif #if !defined MT_MENU_VISION #warning The "Vision" (mt_vision.sp) ability is missing from the "scripting/mutant_tanks/abilities2" folder. #endif @@ -226,17 +206,20 @@ bool g_bDedicated, g_bLaggedMovementInstalled, g_bLateLoad, g_bSecondGame; #if !defined MT_MENU_WITCH #warning The "Witch" (mt_witch.sp) ability is missing from the "scripting/mutant_tanks/abilities2" folder. #endif - #if !defined MT_MENU_XIPHOS - #warning The "Xiphos" (mt_xiphos.sp) ability is missing from the "scripting/mutant_tanks/abilities2" folder. - #endif #if !defined MT_MENU_YELL #warning The "Yell" (mt_yell.sp) ability is missing from the "scripting/mutant_tanks/abilities2" folder. #endif - #if !defined MT_MENU_ZOMBIE - #warning The "Zombie" (mt_zombie.sp) ability is missing from the "scripting/mutant_tanks/abilities2" folder. - #endif #endif #if MT_ABILITIES_COMPILER_MESSAGE2 == 2 + #if !defined MT_MENU_LAG + #error The "Lag" (mt_lag.sp) ability is missing from the "scripting/mutant_tanks/abilities2" folder. + #endif + #if !defined MT_MENU_LASER + #error The "Laser" (mt_laser.sp) ability is missing from the "scripting/mutant_tanks/abilities2" folder. + #endif + #if !defined MT_MENU_LIGHTNING + #error The "Lightning" (mt_lightning.sp) ability is missing from the "scripting/mutant_tanks/abilities2" folder. + #endif #if !defined MT_MENU_MEDIC #error The "Medic" (mt_medic.sp) ability is missing from the "scripting/mutant_tanks/abilities2" folder. #endif @@ -246,9 +229,6 @@ bool g_bDedicated, g_bLaggedMovementInstalled, g_bLateLoad, g_bSecondGame; #if !defined MT_MENU_MINION #error The "Minion" (mt_minion.sp) ability is missing from the "scripting/mutant_tanks/abilities2" folder. #endif - #if !defined MT_MENU_NECRO - #error The "Necro" (mt_necro.sp) ability is missing from the "scripting/mutant_tanks/abilities2" folder. - #endif #if !defined MT_MENU_NULLIFY #error The "Nullify" (mt_nullify.sp) ability is missing from the "scripting/mutant_tanks/abilities2" folder. #endif @@ -258,9 +238,6 @@ bool g_bDedicated, g_bLaggedMovementInstalled, g_bLateLoad, g_bSecondGame; #if !defined MT_MENU_PANIC #error The "Panic" (mt_panic.sp) ability is missing from the "scripting/mutant_tanks/abilities2" folder. #endif - #if !defined MT_MENU_PIMP - #error The "Pimp" (mt_pimp.sp) ability is missing from the "scripting/mutant_tanks/abilities2" folder. - #endif #if !defined MT_MENU_PUKE #error The "Puke" (mt_puke.sp) ability is missing from the "scripting/mutant_tanks/abilities2" folder. #endif @@ -288,12 +265,6 @@ bool g_bDedicated, g_bLaggedMovementInstalled, g_bLateLoad, g_bSecondGame; #if !defined MT_MENU_ROCK #error The "Rock" (mt_rock.sp) ability is missing from the "scripting/mutant_tanks/abilities2" folder. #endif - #if !defined MT_MENU_ROCKET - #error The "Rocket" (mt_rocket.sp) ability is missing from the "scripting/mutant_tanks/abilities2" folder. - #endif - #if !defined MT_MENU_SHAKE - #error The "Shake" (mt_shake.sp) ability is missing from the "scripting/mutant_tanks/abilities2" folder. - #endif #if !defined MT_MENU_SHIELD #error The "Shield" (mt_shield.sp) ability is missing from the "scripting/mutant_tanks/abilities2" folder. #endif @@ -306,18 +277,6 @@ bool g_bDedicated, g_bLaggedMovementInstalled, g_bLateLoad, g_bSecondGame; #if !defined MT_MENU_SMASH #error The "Smash" (mt_smash.sp) ability is missing from the "scripting/mutant_tanks/abilities2" folder. #endif - #if !defined MT_MENU_SMITE - #error The "Smite" (mt_smite.sp) ability is missing from the "scripting/mutant_tanks/abilities2" folder. - #endif - #if !defined MT_MENU_SPAM - #error The "Spam" (mt_spam.sp) ability is missing from the "scripting/mutant_tanks/abilities2" folder. - #endif - #if !defined MT_MENU_SPLASH - #error The "Splash" (mt_splash.sp) ability is missing from the "scripting/mutant_tanks/abilities2" folder. - #endif - #if !defined MT_MENU_SPLATTER - #error The "Splatter" (mt_splatter.sp) ability is missing from the "scripting/mutant_tanks/abilities2" folder. - #endif #if !defined MT_MENU_THROW #error The "Throw" (mt_throw.sp) ability is missing from the "scripting/mutant_tanks/abilities2" folder. #endif @@ -330,9 +289,6 @@ bool g_bDedicated, g_bLaggedMovementInstalled, g_bLateLoad, g_bSecondGame; #if !defined MT_MENU_UNDEAD #error The "Undead" (mt_undead.sp) ability is missing from the "scripting/mutant_tanks/abilities2" folder. #endif - #if !defined MT_MENU_VAMPIRE - #error The "Vampire" (mt_vampire.sp) ability is missing from the "scripting/mutant_tanks/abilities2" folder. - #endif #if !defined MT_MENU_VISION #error The "Vision" (mt_vision.sp) ability is missing from the "scripting/mutant_tanks/abilities2" folder. #endif @@ -345,15 +301,9 @@ bool g_bDedicated, g_bLaggedMovementInstalled, g_bLateLoad, g_bSecondGame; #if !defined MT_MENU_WITCH #error The "Witch" (mt_witch.sp) ability is missing from the "scripting/mutant_tanks/abilities2" folder. #endif - #if !defined MT_MENU_XIPHOS - #error The "Xiphos" (mt_xiphos.sp) ability is missing from the "scripting/mutant_tanks/abilities2" folder. - #endif #if !defined MT_MENU_YELL #error The "Yell" (mt_yell.sp) ability is missing from the "scripting/mutant_tanks/abilities2" folder. #endif - #if !defined MT_MENU_ZOMBIE - #error The "Zombie" (mt_zombie.sp) ability is missing from the "scripting/mutant_tanks/abilities2" folder. - #endif #endif /** @@ -425,7 +375,7 @@ public void OnPluginStart() LoadTranslations("mutant_tanks.phrases"); LoadTranslations("mutant_tanks_names.phrases"); - RegConsoleCmd("sm_mt_ability2", cmdAbilityInfo2, "View information about each ability (M-Z)."); + RegConsoleCmd("sm_mt_ability2", cmdAbilityInfo2, "View information about each ability (L-Z)."); vAbilitySetup(0); @@ -485,17 +435,18 @@ public void OnEntityCreated(int entity, const char[] classname) #if defined MT_MENU_METEOR vMeteorEntityCreated(entity, classname); #endif -#if defined MT_MENU_ROCKET - vRocketEntityCreated(entity, classname); -#endif #if defined MT_MENU_SHIELD vShieldEntityCreated(entity, classname); #endif #if defined MT_MENU_SMASH vSmashEntityCreated(entity, classname); #endif -#if defined MT_MENU_SMITE - vSmiteEntityCreated(entity, classname); +} + +public void OnEntityDestroyed(int entity) +{ +#if defined MT_MENU_THROW + vThrowEntityDestroyed(entity); #endif } @@ -545,6 +496,15 @@ Action cmdAbilityInfo2(int client, int args) public void MT_OnDisplayMenu(Menu menu) { +#if defined MT_MENU_LAG + vLagDisplayMenu(menu); +#endif +#if defined MT_MENU_LASER + vLaserDisplayMenu(menu); +#endif +#if defined MT_MENU_LIGHTNING + vLightningDisplayMenu(menu); +#endif #if defined MT_MENU_MEDIC vMedicDisplayMenu(menu); #endif @@ -554,9 +514,6 @@ public void MT_OnDisplayMenu(Menu menu) #if defined MT_MENU_MINION vMinionDisplayMenu(menu); #endif -#if defined MT_MENU_NECRO - vNecroDisplayMenu(menu); -#endif #if defined MT_MENU_NULLIFY vNullifyDisplayMenu(menu); #endif @@ -566,9 +523,6 @@ public void MT_OnDisplayMenu(Menu menu) #if defined MT_MENU_PANIC vPanicDisplayMenu(menu); #endif -#if defined MT_MENU_PIMP - vPimpDisplayMenu(menu); -#endif #if defined MT_MENU_PUKE vPukeDisplayMenu(menu); #endif @@ -596,12 +550,6 @@ public void MT_OnDisplayMenu(Menu menu) #if defined MT_MENU_ROCK vRockDisplayMenu(menu); #endif -#if defined MT_MENU_ROCKET - vRocketDisplayMenu(menu); -#endif -#if defined MT_MENU_SHAKE - vShakeDisplayMenu(menu); -#endif #if defined MT_MENU_SHIELD vShieldDisplayMenu(menu); #endif @@ -614,18 +562,6 @@ public void MT_OnDisplayMenu(Menu menu) #if defined MT_MENU_SMASH vSmashDisplayMenu(menu); #endif -#if defined MT_MENU_SMITE - vSmiteDisplayMenu(menu); -#endif -#if defined MT_MENU_SPAM - vSpamDisplayMenu(menu); -#endif -#if defined MT_MENU_SPLASH - vSplashDisplayMenu(menu); -#endif -#if defined MT_MENU_SPLATTER - vSplatterDisplayMenu(menu); -#endif #if defined MT_MENU_THROW vThrowDisplayMenu(menu); #endif @@ -638,9 +574,6 @@ public void MT_OnDisplayMenu(Menu menu) #if defined MT_MENU_UNDEAD vUndeadDisplayMenu(menu); #endif -#if defined MT_MENU_VAMPIRE - vVampireDisplayMenu(menu); -#endif #if defined MT_MENU_VISION vVisionDisplayMenu(menu); #endif @@ -653,19 +586,22 @@ public void MT_OnDisplayMenu(Menu menu) #if defined MT_MENU_WITCH vWitchDisplayMenu(menu); #endif -#if defined MT_MENU_XIPHOS - vXiphosDisplayMenu(menu); -#endif #if defined MT_MENU_YELL vYellDisplayMenu(menu); #endif -#if defined MT_MENU_ZOMBIE - vZombieDisplayMenu(menu); -#endif } public void MT_OnMenuItemSelected(int client, const char[] info) { +#if defined MT_MENU_LAG + vLagMenuItemSelected(client, info); +#endif +#if defined MT_MENU_LASER + vLaserMenuItemSelected(client, info); +#endif +#if defined MT_MENU_LIGHTNING + vLightningMenuItemSelected(client, info); +#endif #if defined MT_MENU_MEDIC vMedicMenuItemSelected(client, info); #endif @@ -675,9 +611,6 @@ public void MT_OnMenuItemSelected(int client, const char[] info) #if defined MT_MENU_MINION vMinionMenuItemSelected(client, info); #endif -#if defined MT_MENU_NECRO - vNecroMenuItemSelected(client, info); -#endif #if defined MT_MENU_NULLIFY vNullifyMenuItemSelected(client, info); #endif @@ -687,9 +620,6 @@ public void MT_OnMenuItemSelected(int client, const char[] info) #if defined MT_MENU_PANIC vPanicMenuItemSelected(client, info); #endif -#if defined MT_MENU_PIMP - vPimpMenuItemSelected(client, info); -#endif #if defined MT_MENU_PUKE vPukeMenuItemSelected(client, info); #endif @@ -717,12 +647,6 @@ public void MT_OnMenuItemSelected(int client, const char[] info) #if defined MT_MENU_ROCK vRockMenuItemSelected(client, info); #endif -#if defined MT_MENU_ROCKET - vRocketMenuItemSelected(client, info); -#endif -#if defined MT_MENU_SHAKE - vShakeMenuItemSelected(client, info); -#endif #if defined MT_MENU_SHIELD vShieldMenuItemSelected(client, info); #endif @@ -735,18 +659,6 @@ public void MT_OnMenuItemSelected(int client, const char[] info) #if defined MT_MENU_SMASH vSmashMenuItemSelected(client, info); #endif -#if defined MT_MENU_SMITE - vSmiteMenuItemSelected(client, info); -#endif -#if defined MT_MENU_SPAM - vSpamMenuItemSelected(client, info); -#endif -#if defined MT_MENU_SPLASH - vSplashMenuItemSelected(client, info); -#endif -#if defined MT_MENU_SPLATTER - vSplatterMenuItemSelected(client, info); -#endif #if defined MT_MENU_THROW vThrowMenuItemSelected(client, info); #endif @@ -759,9 +671,6 @@ public void MT_OnMenuItemSelected(int client, const char[] info) #if defined MT_MENU_UNDEAD vUndeadMenuItemSelected(client, info); #endif -#if defined MT_MENU_VAMPIRE - vVampireMenuItemSelected(client, info); -#endif #if defined MT_MENU_VISION vVisionMenuItemSelected(client, info); #endif @@ -774,19 +683,22 @@ public void MT_OnMenuItemSelected(int client, const char[] info) #if defined MT_MENU_WITCH vWitchMenuItemSelected(client, info); #endif -#if defined MT_MENU_XIPHOS - vXiphosMenuItemSelected(client, info); -#endif #if defined MT_MENU_YELL vYellMenuItemSelected(client, info); #endif -#if defined MT_MENU_ZOMBIE - vZombieMenuItemSelected(client, info); -#endif } public void MT_OnMenuItemDisplayed(int client, const char[] info, char[] buffer, int size) { +#if defined MT_MENU_LAG + vLagMenuItemDisplayed(client, info, buffer, size); +#endif +#if defined MT_MENU_LASER + vLaserMenuItemDisplayed(client, info, buffer, size); +#endif +#if defined MT_MENU_LIGHTNING + vLightningMenuItemDisplayed(client, info, buffer, size); +#endif #if defined MT_MENU_MEDIC vMedicMenuItemDisplayed(client, info, buffer, size); #endif @@ -796,9 +708,6 @@ public void MT_OnMenuItemDisplayed(int client, const char[] info, char[] buffer, #if defined MT_MENU_MINION vMinionMenuItemDisplayed(client, info, buffer, size); #endif -#if defined MT_MENU_NECRO - vNecroMenuItemDisplayed(client, info, buffer, size); -#endif #if defined MT_MENU_NULLIFY vNullifyMenuItemDisplayed(client, info, buffer, size); #endif @@ -808,9 +717,6 @@ public void MT_OnMenuItemDisplayed(int client, const char[] info, char[] buffer, #if defined MT_MENU_PANIC vPanicMenuItemDisplayed(client, info, buffer, size); #endif -#if defined MT_MENU_PIMP - vPimpMenuItemDisplayed(client, info, buffer, size); -#endif #if defined MT_MENU_PUKE vPukeMenuItemDisplayed(client, info, buffer, size); #endif @@ -838,12 +744,6 @@ public void MT_OnMenuItemDisplayed(int client, const char[] info, char[] buffer, #if defined MT_MENU_ROCK vRockMenuItemDisplayed(client, info, buffer, size); #endif -#if defined MT_MENU_ROCKET - vRocketMenuItemDisplayed(client, info, buffer, size); -#endif -#if defined MT_MENU_SHAKE - vShakeMenuItemDisplayed(client, info, buffer, size); -#endif #if defined MT_MENU_SHIELD vShieldMenuItemDisplayed(client, info, buffer, size); #endif @@ -856,18 +756,6 @@ public void MT_OnMenuItemDisplayed(int client, const char[] info, char[] buffer, #if defined MT_MENU_SMASH vSmashMenuItemDisplayed(client, info, buffer, size); #endif -#if defined MT_MENU_SMITE - vSmiteMenuItemDisplayed(client, info, buffer, size); -#endif -#if defined MT_MENU_SPAM - vSpamMenuItemDisplayed(client, info, buffer, size); -#endif -#if defined MT_MENU_SPLASH - vSplashMenuItemDisplayed(client, info, buffer, size); -#endif -#if defined MT_MENU_SPLATTER - vSplatterMenuItemDisplayed(client, info, buffer, size); -#endif #if defined MT_MENU_THROW vThrowMenuItemDisplayed(client, info, buffer, size); #endif @@ -880,9 +768,6 @@ public void MT_OnMenuItemDisplayed(int client, const char[] info, char[] buffer, #if defined MT_MENU_UNDEAD vUndeadMenuItemDisplayed(client, info, buffer, size); #endif -#if defined MT_MENU_VAMPIRE - vVampireMenuItemDisplayed(client, info, buffer, size); -#endif #if defined MT_MENU_VISION vVisionMenuItemDisplayed(client, info, buffer, size); #endif @@ -895,15 +780,9 @@ public void MT_OnMenuItemDisplayed(int client, const char[] info, char[] buffer, #if defined MT_MENU_WITCH vWitchMenuItemDisplayed(client, info, buffer, size); #endif -#if defined MT_MENU_XIPHOS - vXiphosMenuItemDisplayed(client, info, buffer, size); -#endif #if defined MT_MENU_YELL vYellMenuItemDisplayed(client, info, buffer, size); #endif -#if defined MT_MENU_ZOMBIE - vZombieMenuItemDisplayed(client, info, buffer, size); -#endif } public Action OnPlayerRunCmd(int client, int &buttons, int &impulse, float vel[3], float angles[3], int &weapon) @@ -912,9 +791,6 @@ public Action OnPlayerRunCmd(int client, int &buttons, int &impulse, float vel[3 { return Plugin_Continue; } -#if defined MT_MENU_NECRO - vNecroPlayerRunCmd(client); -#endif #if defined MT_MENU_OMNI vOmniPlayerRunCmd(client); #endif @@ -924,6 +800,9 @@ public Action OnPlayerRunCmd(int client, int &buttons, int &impulse, float vel[3 #if defined MT_MENU_RECALL vRecallPlayerRunCmd(client, buttons); #endif +#if defined MT_MENU_PYRO + vRespawnPlayerRunCmd(client); +#endif #if defined MT_MENU_SHIELD vShieldPlayerRunCmd(client); #endif @@ -935,6 +814,15 @@ public Action OnPlayerRunCmd(int client, int &buttons, int &impulse, float vel[3 public void MT_OnPluginCheck(ArrayList list) { +#if defined MT_MENU_LAG + vLagPluginCheck(list); +#endif +#if defined MT_MENU_LASER + vLaserPluginCheck(list); +#endif +#if defined MT_MENU_LIGHTNING + vLightningPluginCheck(list); +#endif #if defined MT_MENU_MEDIC vMedicPluginCheck(list); #endif @@ -944,9 +832,6 @@ public void MT_OnPluginCheck(ArrayList list) #if defined MT_MENU_MINION vMinionPluginCheck(list); #endif -#if defined MT_MENU_NECRO - vNecroPluginCheck(list); -#endif #if defined MT_MENU_NULLIFY vNullifyPluginCheck(list); #endif @@ -956,9 +841,6 @@ public void MT_OnPluginCheck(ArrayList list) #if defined MT_MENU_PANIC vPanicPluginCheck(list); #endif -#if defined MT_MENU_PIMP - vPimpPluginCheck(list); -#endif #if defined MT_MENU_PUKE vPukePluginCheck(list); #endif @@ -986,12 +868,6 @@ public void MT_OnPluginCheck(ArrayList list) #if defined MT_MENU_ROCK vRockPluginCheck(list); #endif -#if defined MT_MENU_ROCKET - vRocketPluginCheck(list); -#endif -#if defined MT_MENU_SHAKE - vShakePluginCheck(list); -#endif #if defined MT_MENU_SHIELD vShieldPluginCheck(list); #endif @@ -1004,18 +880,6 @@ public void MT_OnPluginCheck(ArrayList list) #if defined MT_MENU_SMASH vSmashPluginCheck(list); #endif -#if defined MT_MENU_SMITE - vSmitePluginCheck(list); -#endif -#if defined MT_MENU_SPAM - vSpamPluginCheck(list); -#endif -#if defined MT_MENU_SPLASH - vSplashPluginCheck(list); -#endif -#if defined MT_MENU_SPLATTER - vSplatterPluginCheck(list); -#endif #if defined MT_MENU_THROW vThrowPluginCheck(list); #endif @@ -1028,9 +892,6 @@ public void MT_OnPluginCheck(ArrayList list) #if defined MT_MENU_UNDEAD vUndeadPluginCheck(list); #endif -#if defined MT_MENU_VAMPIRE - vVampirePluginCheck(list); -#endif #if defined MT_MENU_VISION vVisionPluginCheck(list); #endif @@ -1043,19 +904,22 @@ public void MT_OnPluginCheck(ArrayList list) #if defined MT_MENU_WITCH vWitchPluginCheck(list); #endif -#if defined MT_MENU_XIPHOS - vXiphosPluginCheck(list); -#endif #if defined MT_MENU_YELL vYellPluginCheck(list); #endif -#if defined MT_MENU_ZOMBIE - vZombiePluginCheck(list); -#endif } public void MT_OnAbilityCheck(ArrayList list, ArrayList list2, ArrayList list3, ArrayList list4) { +#if defined MT_MENU_LAG + vLagAbilityCheck(list, list2, list3, list4); +#endif +#if defined MT_MENU_LASER + vLaserAbilityCheck(list, list2, list3, list4); +#endif +#if defined MT_MENU_LIGHTNING + vLightningAbilityCheck(list, list2, list3, list4); +#endif #if defined MT_MENU_MEDIC vMedicAbilityCheck(list, list2, list3, list4); #endif @@ -1065,9 +929,6 @@ public void MT_OnAbilityCheck(ArrayList list, ArrayList list2, ArrayList list3, #if defined MT_MENU_MINION vMinionAbilityCheck(list, list2, list3, list4); #endif -#if defined MT_MENU_NECRO - vNecroAbilityCheck(list, list2, list3, list4); -#endif #if defined MT_MENU_NULLIFY vNullifyAbilityCheck(list, list2, list3, list4); #endif @@ -1077,9 +938,6 @@ public void MT_OnAbilityCheck(ArrayList list, ArrayList list2, ArrayList list3, #if defined MT_MENU_PANIC vPanicAbilityCheck(list, list2, list3, list4); #endif -#if defined MT_MENU_PIMP - vPimpAbilityCheck(list, list2, list3, list4); -#endif #if defined MT_MENU_PUKE vPukeAbilityCheck(list, list2, list3, list4); #endif @@ -1107,12 +965,6 @@ public void MT_OnAbilityCheck(ArrayList list, ArrayList list2, ArrayList list3, #if defined MT_MENU_ROCK vRockAbilityCheck(list, list2, list3, list4); #endif -#if defined MT_MENU_ROCKET - vRocketAbilityCheck(list, list2, list3, list4); -#endif -#if defined MT_MENU_SHAKE - vShakeAbilityCheck(list, list2, list3, list4); -#endif #if defined MT_MENU_SHIELD vShieldAbilityCheck(list, list2, list3, list4); #endif @@ -1125,18 +977,6 @@ public void MT_OnAbilityCheck(ArrayList list, ArrayList list2, ArrayList list3, #if defined MT_MENU_SMASH vSmashAbilityCheck(list, list2, list3, list4); #endif -#if defined MT_MENU_SMITE - vSmiteAbilityCheck(list, list2, list3, list4); -#endif -#if defined MT_MENU_SPAM - vSpamAbilityCheck(list, list2, list3, list4); -#endif -#if defined MT_MENU_SPLASH - vSplashAbilityCheck(list, list2, list3, list4); -#endif -#if defined MT_MENU_SPLATTER - vSplatterAbilityCheck(list, list2, list3, list4); -#endif #if defined MT_MENU_THROW vThrowAbilityCheck(list, list2, list3, list4); #endif @@ -1149,9 +989,6 @@ public void MT_OnAbilityCheck(ArrayList list, ArrayList list2, ArrayList list3, #if defined MT_MENU_UNDEAD vUndeadAbilityCheck(list, list2, list3, list4); #endif -#if defined MT_MENU_VAMPIRE - vVampireAbilityCheck(list, list2, list3, list4); -#endif #if defined MT_MENU_VISION vVisionAbilityCheck(list, list2, list3, list4); #endif @@ -1164,19 +1001,22 @@ public void MT_OnAbilityCheck(ArrayList list, ArrayList list2, ArrayList list3, #if defined MT_MENU_WITCH vWitchAbilityCheck(list, list2, list3, list4); #endif -#if defined MT_MENU_XIPHOS - vXiphosAbilityCheck(list, list2, list3, list4); -#endif #if defined MT_MENU_YELL vYellAbilityCheck(list, list2, list3, list4); #endif -#if defined MT_MENU_ZOMBIE - vZombieAbilityCheck(list, list2, list3, list4); -#endif } public void MT_OnCombineAbilities(int tank, int type, const float random, const char[] combo, int survivor, int weapon, const char[] classname) { +#if defined MT_MENU_LAG + vLagCombineAbilities(tank, type, random, combo, survivor, classname); +#endif +#if defined MT_MENU_LASER + vLaserCombineAbilities(tank, type, random, combo); +#endif +#if defined MT_MENU_LIGHTNING + vLightningCombineAbilities(tank, type, random, combo); +#endif #if defined MT_MENU_MEDIC vMedicCombineAbilities(tank, type, random, combo, weapon); #endif @@ -1186,9 +1026,6 @@ public void MT_OnCombineAbilities(int tank, int type, const float random, const #if defined MT_MENU_MINION vMinionCombineAbilities(tank, type, random, combo); #endif -#if defined MT_MENU_NECRO - vNecroCombineAbilities(tank, type, random, combo); -#endif #if defined MT_MENU_NULLIFY vNullifyCombineAbilities(tank, type, random, combo, survivor, classname); #endif @@ -1198,9 +1035,6 @@ public void MT_OnCombineAbilities(int tank, int type, const float random, const #if defined MT_MENU_PANIC vPanicCombineAbilities(tank, type, random, combo); #endif -#if defined MT_MENU_PIMP - vPimpCombineAbilities(tank, type, random, combo, survivor, classname); -#endif #if defined MT_MENU_PUKE vPukeCombineAbilities(tank, type, random, combo, survivor, classname); #endif @@ -1225,12 +1059,6 @@ public void MT_OnCombineAbilities(int tank, int type, const float random, const #if defined MT_MENU_ROCK vRockCombineAbilities(tank, type, random, combo); #endif -#if defined MT_MENU_ROCKET - vRocketCombineAbilities(tank, type, random, combo, survivor, classname); -#endif -#if defined MT_MENU_SHAKE - vShakeCombineAbilities(tank, type, random, combo, survivor, classname); -#endif #if defined MT_MENU_SHIELD vShieldCombineAbilities(tank, type, random, combo); #endif @@ -1243,18 +1071,6 @@ public void MT_OnCombineAbilities(int tank, int type, const float random, const #if defined MT_MENU_SMASH vSmashCombineAbilities(tank, type, random, combo, survivor, classname); #endif -#if defined MT_MENU_SMITE - vSmiteCombineAbilities(tank, type, random, combo, survivor, classname); -#endif -#if defined MT_MENU_SPAM - vSpamCombineAbilities(tank, type, random, combo); -#endif -#if defined MT_MENU_SPLASH - vSplashCombineAbilities(tank, type, random, combo); -#endif -#if defined MT_MENU_SPLATTER - vSplatterCombineAbilities(tank, type, random, combo, survivor, classname); -#endif #if defined MT_MENU_THROW vThrowCombineAbilities(tank, type, random, combo, weapon); #endif @@ -1282,13 +1098,19 @@ public void MT_OnCombineAbilities(int tank, int type, const float random, const #if defined MT_MENU_YELL vYellCombineAbilities(tank, type, random, combo); #endif -#if defined MT_MENU_ZOMBIE - vZombieCombineAbilities(tank, type, random, combo); -#endif } public void MT_OnConfigsLoad(int mode) { +#if defined MT_MENU_LAG + vLagConfigsLoad(mode); +#endif +#if defined MT_MENU_LASER + vLaserConfigsLoad(mode); +#endif +#if defined MT_MENU_LIGHTNING + vLightningConfigsLoad(mode); +#endif #if defined MT_MENU_MEDIC vMedicConfigsLoad(mode); #endif @@ -1298,9 +1120,6 @@ public void MT_OnConfigsLoad(int mode) #if defined MT_MENU_MINION vMinionConfigsLoad(mode); #endif -#if defined MT_MENU_NECRO - vNecroConfigsLoad(mode); -#endif #if defined MT_MENU_NULLIFY vNullifyConfigsLoad(mode); #endif @@ -1310,9 +1129,6 @@ public void MT_OnConfigsLoad(int mode) #if defined MT_MENU_PANIC vPanicConfigsLoad(mode); #endif -#if defined MT_MENU_PIMP - vPimpConfigsLoad(mode); -#endif #if defined MT_MENU_PUKE vPukeConfigsLoad(mode); #endif @@ -1340,12 +1156,6 @@ public void MT_OnConfigsLoad(int mode) #if defined MT_MENU_ROCK vRockConfigsLoad(mode); #endif -#if defined MT_MENU_ROCKET - vRocketConfigsLoad(mode); -#endif -#if defined MT_MENU_SHAKE - vShakeConfigsLoad(mode); -#endif #if defined MT_MENU_SHIELD vShieldConfigsLoad(mode); #endif @@ -1358,18 +1168,6 @@ public void MT_OnConfigsLoad(int mode) #if defined MT_MENU_SMASH vSmashConfigsLoad(mode); #endif -#if defined MT_MENU_SMITE - vSmiteConfigsLoad(mode); -#endif -#if defined MT_MENU_SPAM - vSpamConfigsLoad(mode); -#endif -#if defined MT_MENU_SPLASH - vSplashConfigsLoad(mode); -#endif -#if defined MT_MENU_SPLATTER - vSplatterConfigsLoad(mode); -#endif #if defined MT_MENU_THROW vThrowConfigsLoad(mode); #endif @@ -1382,9 +1180,6 @@ public void MT_OnConfigsLoad(int mode) #if defined MT_MENU_UNDEAD vUndeadConfigsLoad(mode); #endif -#if defined MT_MENU_VAMPIRE - vVampireConfigsLoad(mode); -#endif #if defined MT_MENU_VISION vVisionConfigsLoad(mode); #endif @@ -1397,19 +1192,22 @@ public void MT_OnConfigsLoad(int mode) #if defined MT_MENU_WITCH vWitchConfigsLoad(mode); #endif -#if defined MT_MENU_XIPHOS - vXiphosConfigsLoad(mode); -#endif #if defined MT_MENU_YELL vYellConfigsLoad(mode); #endif -#if defined MT_MENU_ZOMBIE - vZombieConfigsLoad(mode); -#endif } public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const char[] value, int type, int admin, int mode, bool special, const char[] specsection) { +#if defined MT_MENU_LAG + vLagConfigsLoaded(subsection, key, value, type, admin, mode, special, specsection); +#endif +#if defined MT_MENU_LASER + vLaserConfigsLoaded(subsection, key, value, type, admin, mode, special, specsection); +#endif +#if defined MT_MENU_LIGHTNING + vLightningConfigsLoaded(subsection, key, value, type, admin, mode, special, specsection); +#endif #if defined MT_MENU_MEDIC vMedicConfigsLoaded(subsection, key, value, type, admin, mode, special, specsection); #endif @@ -1419,9 +1217,6 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const #if defined MT_MENU_MINION vMinionConfigsLoaded(subsection, key, value, type, admin, mode, special, specsection); #endif -#if defined MT_MENU_NECRO - vNecroConfigsLoaded(subsection, key, value, type, admin, mode, special, specsection); -#endif #if defined MT_MENU_NULLIFY vNullifyConfigsLoaded(subsection, key, value, type, admin, mode, special, specsection); #endif @@ -1431,9 +1226,6 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const #if defined MT_MENU_PANIC vPanicConfigsLoaded(subsection, key, value, type, admin, mode, special, specsection); #endif -#if defined MT_MENU_PIMP - vPimpConfigsLoaded(subsection, key, value, type, admin, mode, special, specsection); -#endif #if defined MT_MENU_PUKE vPukeConfigsLoaded(subsection, key, value, type, admin, mode, special, specsection); #endif @@ -1461,12 +1253,6 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const #if defined MT_MENU_ROCK vRockConfigsLoaded(subsection, key, value, type, admin, mode, special, specsection); #endif -#if defined MT_MENU_ROCKET - vRocketConfigsLoaded(subsection, key, value, type, admin, mode, special, specsection); -#endif -#if defined MT_MENU_SHAKE - vShakeConfigsLoaded(subsection, key, value, type, admin, mode, special, specsection); -#endif #if defined MT_MENU_SHIELD vShieldConfigsLoaded(subsection, key, value, type, admin, mode, special, specsection); #endif @@ -1479,18 +1265,6 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const #if defined MT_MENU_SMASH vSmashConfigsLoaded(subsection, key, value, type, admin, mode, special, specsection); #endif -#if defined MT_MENU_SMITE - vSmiteConfigsLoaded(subsection, key, value, type, admin, mode, special, specsection); -#endif -#if defined MT_MENU_SPAM - vSpamConfigsLoaded(subsection, key, value, type, admin, mode, special, specsection); -#endif -#if defined MT_MENU_SPLASH - vSplashConfigsLoaded(subsection, key, value, type, admin, mode, special, specsection); -#endif -#if defined MT_MENU_SPLATTER - vSplatterConfigsLoaded(subsection, key, value, type, admin, mode, special, specsection); -#endif #if defined MT_MENU_THROW vThrowConfigsLoaded(subsection, key, value, type, admin, mode, special, specsection); #endif @@ -1503,9 +1277,6 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const #if defined MT_MENU_UNDEAD vUndeadConfigsLoaded(subsection, key, value, type, admin, mode, special, specsection); #endif -#if defined MT_MENU_VAMPIRE - vVampireConfigsLoaded(subsection, key, value, type, admin, mode, special, specsection); -#endif #if defined MT_MENU_VISION vVisionConfigsLoaded(subsection, key, value, type, admin, mode, special, specsection); #endif @@ -1518,19 +1289,23 @@ public void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const #if defined MT_MENU_WITCH vWitchConfigsLoaded(subsection, key, value, type, admin, mode, special, specsection); #endif -#if defined MT_MENU_XIPHOS - vXiphosConfigsLoaded(subsection, key, value, type, admin, mode, special, specsection); -#endif #if defined MT_MENU_YELL vYellConfigsLoaded(subsection, key, value, type, admin, mode, special, specsection); #endif -#if defined MT_MENU_ZOMBIE - vZombieConfigsLoaded(subsection, key, value, type, admin, mode, special, specsection); -#endif } public void MT_OnSettingsCached(int tank, bool apply, int type) { + g_iGraphicsLevel = MT_GetGraphicsLevel(); +#if defined MT_MENU_LAG + vLagSettingsCached(tank, apply, type); +#endif +#if defined MT_MENU_LASER + vLaserSettingsCached(tank, apply, type); +#endif +#if defined MT_MENU_LIGHTNING + vLightningSettingsCached(tank, apply, type); +#endif #if defined MT_MENU_MEDIC vMedicSettingsCached(tank, apply, type); #endif @@ -1540,9 +1315,6 @@ public void MT_OnSettingsCached(int tank, bool apply, int type) #if defined MT_MENU_MINION vMinionSettingsCached(tank, apply, type); #endif -#if defined MT_MENU_NECRO - vNecroSettingsCached(tank, apply, type); -#endif #if defined MT_MENU_NULLIFY vNullifySettingsCached(tank, apply, type); #endif @@ -1552,9 +1324,6 @@ public void MT_OnSettingsCached(int tank, bool apply, int type) #if defined MT_MENU_PANIC vPanicSettingsCached(tank, apply, type); #endif -#if defined MT_MENU_PIMP - vPimpSettingsCached(tank, apply, type); -#endif #if defined MT_MENU_PUKE vPukeSettingsCached(tank, apply, type); #endif @@ -1582,12 +1351,6 @@ public void MT_OnSettingsCached(int tank, bool apply, int type) #if defined MT_MENU_ROCK vRockSettingsCached(tank, apply, type); #endif -#if defined MT_MENU_ROCKET - vRocketSettingsCached(tank, apply, type); -#endif -#if defined MT_MENU_SHAKE - vShakeSettingsCached(tank, apply, type); -#endif #if defined MT_MENU_SHIELD vShieldSettingsCached(tank, apply, type); #endif @@ -1600,18 +1363,6 @@ public void MT_OnSettingsCached(int tank, bool apply, int type) #if defined MT_MENU_SMASH vSmashSettingsCached(tank, apply, type); #endif -#if defined MT_MENU_SMITE - vSmiteSettingsCached(tank, apply, type); -#endif -#if defined MT_MENU_SPAM - vSpamSettingsCached(tank, apply, type); -#endif -#if defined MT_MENU_SPLASH - vSplashSettingsCached(tank, apply, type); -#endif -#if defined MT_MENU_SPLATTER - vSplatterSettingsCached(tank, apply, type); -#endif #if defined MT_MENU_THROW vThrowSettingsCached(tank, apply, type); #endif @@ -1624,9 +1375,6 @@ public void MT_OnSettingsCached(int tank, bool apply, int type) #if defined MT_MENU_UNDEAD vUndeadSettingsCached(tank, apply, type); #endif -#if defined MT_MENU_VAMPIRE - vVampireSettingsCached(tank, apply, type); -#endif #if defined MT_MENU_VISION vVisionSettingsCached(tank, apply, type); #endif @@ -1639,19 +1387,22 @@ public void MT_OnSettingsCached(int tank, bool apply, int type) #if defined MT_MENU_WITCH vWitchSettingsCached(tank, apply, type); #endif -#if defined MT_MENU_XIPHOS - vXiphosSettingsCached(tank, apply, type); -#endif #if defined MT_MENU_YELL vYellSettingsCached(tank, apply, type); #endif -#if defined MT_MENU_ZOMBIE - vZombieSettingsCached(tank, apply, type); -#endif } public void MT_OnCopyStats(int oldTank, int newTank) { +#if defined MT_MENU_LAG + vLagCopyStats(oldTank, newTank); +#endif +#if defined MT_MENU_LASER + vLaserCopyStats(oldTank, newTank); +#endif +#if defined MT_MENU_LIGHTNING + vLightningCopyStats(oldTank, newTank); +#endif #if defined MT_MENU_MEDIC vMedicCopyStats(oldTank, newTank); #endif @@ -1661,9 +1412,6 @@ public void MT_OnCopyStats(int oldTank, int newTank) #if defined MT_MENU_MINION vMinionCopyStats(oldTank, newTank); #endif -#if defined MT_MENU_NECRO - vNecroCopyStats(oldTank, newTank); -#endif #if defined MT_MENU_NULLIFY vNullifyCopyStats(oldTank, newTank); #endif @@ -1673,9 +1421,6 @@ public void MT_OnCopyStats(int oldTank, int newTank) #if defined MT_MENU_PANIC vPanicCopyStats(oldTank, newTank); #endif -#if defined MT_MENU_PIMP - vPimpCopyStats(oldTank, newTank); -#endif #if defined MT_MENU_PUKE vPukeCopyStats(oldTank, newTank); #endif @@ -1703,12 +1448,6 @@ public void MT_OnCopyStats(int oldTank, int newTank) #if defined MT_MENU_ROCK vRockCopyStats(oldTank, newTank); #endif -#if defined MT_MENU_ROCKET - vRocketCopyStats(oldTank, newTank); -#endif -#if defined MT_MENU_SHAKE - vShakeCopyStats(oldTank, newTank); -#endif #if defined MT_MENU_SHIELD vShieldCopyStats(oldTank, newTank); #endif @@ -1721,18 +1460,6 @@ public void MT_OnCopyStats(int oldTank, int newTank) #if defined MT_MENU_SMASH vSmashCopyStats(oldTank, newTank); #endif -#if defined MT_MENU_SMITE - vSmiteCopyStats(oldTank, newTank); -#endif -#if defined MT_MENU_SPAM - vSpamCopyStats(oldTank, newTank); -#endif -#if defined MT_MENU_SPLASH - vSplashCopyStats(oldTank, newTank); -#endif -#if defined MT_MENU_SPLATTER - vSplatterCopyStats(oldTank, newTank); -#endif #if defined MT_MENU_THROW vThrowCopyStats(oldTank, newTank); #endif @@ -1760,9 +1487,6 @@ public void MT_OnCopyStats(int oldTank, int newTank) #if defined MT_MENU_YELL vYellCopyStats(oldTank, newTank); #endif -#if defined MT_MENU_ZOMBIE - vZombieCopyStats(oldTank, newTank); -#endif } public void MT_OnHookEvent(bool hooked) @@ -1777,6 +1501,15 @@ public void MT_OnHookEvent(bool hooked) public void MT_OnEventFired(Event event, const char[] name, bool dontBroadcast) { +#if defined MT_MENU_LAG + vLagEventFired(event, name); +#endif +#if defined MT_MENU_LASER + vLaserEventFired(event, name); +#endif +#if defined MT_MENU_LIGHTNING + vLightningEventFired(event, name); +#endif #if defined MT_MENU_MEDIC vMedicEventFired(event, name); #endif @@ -1786,9 +1519,6 @@ public void MT_OnEventFired(Event event, const char[] name, bool dontBroadcast) #if defined MT_MENU_MINION vMinionEventFired(event, name); #endif -#if defined MT_MENU_NECRO - vNecroEventFired(event, name); -#endif #if defined MT_MENU_NULLIFY vNullifyEventFired(event, name); #endif @@ -1798,9 +1528,6 @@ public void MT_OnEventFired(Event event, const char[] name, bool dontBroadcast) #if defined MT_MENU_PANIC vPanicEventFired(event, name); #endif -#if defined MT_MENU_PIMP - vPimpEventFired(event, name); -#endif #if defined MT_MENU_PUKE vPukeEventFired(event, name); #endif @@ -1828,12 +1555,6 @@ public void MT_OnEventFired(Event event, const char[] name, bool dontBroadcast) #if defined MT_MENU_ROCK vRockEventFired(event, name); #endif -#if defined MT_MENU_ROCKET - vRocketEventFired(event, name); -#endif -#if defined MT_MENU_SHAKE - vShakeEventFired(event, name); -#endif #if defined MT_MENU_SHIELD vShieldEventFired(event, name); #endif @@ -1846,18 +1567,6 @@ public void MT_OnEventFired(Event event, const char[] name, bool dontBroadcast) #if defined MT_MENU_SMASH vSmashEventFired(event, name); #endif -#if defined MT_MENU_SMITE - vSmiteEventFired(event, name); -#endif -#if defined MT_MENU_SPAM - vSpamEventFired(event, name); -#endif -#if defined MT_MENU_SPLASH - vSplashEventFired(event, name); -#endif -#if defined MT_MENU_SPLATTER - vSplatterEventFired(event, name); -#endif #if defined MT_MENU_THROW vThrowEventFired(event, name); #endif @@ -1885,9 +1594,6 @@ public void MT_OnEventFired(Event event, const char[] name, bool dontBroadcast) #if defined MT_MENU_YELL vYellEventFired(event, name); #endif -#if defined MT_MENU_ZOMBIE - vZombieEventFired(event, name); -#endif } public void MT_OnAbilityActivated(int tank) @@ -1897,6 +1603,15 @@ public void MT_OnAbilityActivated(int tank) public void MT_OnButtonPressed(int tank, int button) { +#if defined MT_MENU_LAG + vLagButtonPressed(tank, button); +#endif +#if defined MT_MENU_LASER + vLaserButtonPressed(tank, button); +#endif +#if defined MT_MENU_LIGHTNING + vLightningButtonPressed(tank, button); +#endif #if defined MT_MENU_MEDIC vMedicButtonPressed(tank, button); #endif @@ -1906,9 +1621,6 @@ public void MT_OnButtonPressed(int tank, int button) #if defined MT_MENU_MINION vMinionButtonPressed(tank, button); #endif -#if defined MT_MENU_NECRO - vNecroButtonPressed(tank, button); -#endif #if defined MT_MENU_NULLIFY vNullifyButtonPressed(tank, button); #endif @@ -1918,9 +1630,6 @@ public void MT_OnButtonPressed(int tank, int button) #if defined MT_MENU_PANIC vPanicButtonPressed(tank, button); #endif -#if defined MT_MENU_PIMP - vPimpButtonPressed(tank, button); -#endif #if defined MT_MENU_PUKE vPukeButtonPressed(tank, button); #endif @@ -1948,12 +1657,6 @@ public void MT_OnButtonPressed(int tank, int button) #if defined MT_MENU_ROCK vRockButtonPressed(tank, button); #endif -#if defined MT_MENU_ROCKET - vRocketButtonPressed(tank, button); -#endif -#if defined MT_MENU_SHAKE - vShakeButtonPressed(tank, button); -#endif #if defined MT_MENU_SHIELD vShieldButtonPressed(tank, button); #endif @@ -1966,18 +1669,6 @@ public void MT_OnButtonPressed(int tank, int button) #if defined MT_MENU_SMASH vSmashButtonPressed(tank, button); #endif -#if defined MT_MENU_SMITE - vSmiteButtonPressed(tank, button); -#endif -#if defined MT_MENU_SPAM - vSpamButtonPressed(tank, button); -#endif -#if defined MT_MENU_SPLASH - vSplashButtonPressed(tank, button); -#endif -#if defined MT_MENU_SPLATTER - vSplatterButtonPressed(tank, button); -#endif #if defined MT_MENU_THROW vThrowButtonPressed(tank, button); #endif @@ -2005,22 +1696,22 @@ public void MT_OnButtonPressed(int tank, int button) #if defined MT_MENU_YELL vYellButtonPressed(tank, button); #endif -#if defined MT_MENU_ZOMBIE - vZombieButtonPressed(tank, button); -#endif } public void MT_OnButtonReleased(int tank, int button) { +#if defined MT_MENU_LASER + vLaserButtonReleased(tank, button); +#endif +#if defined MT_MENU_LIGHTNING + vLightningButtonReleased(tank, button); +#endif #if defined MT_MENU_MEDIC vMedicButtonReleased(tank, button); #endif #if defined MT_MENU_METEOR vMeteorButtonReleased(tank, button); #endif -#if defined MT_MENU_NECRO - vNecroButtonReleased(tank, button); -#endif #if defined MT_MENU_OMNI vOmniButtonReleased(tank, button); #endif @@ -2033,31 +1724,34 @@ public void MT_OnButtonReleased(int tank, int button) #if defined MT_MENU_REGEN vRegenButtonReleased(tank, button); #endif +#if defined MT_MENU_PANIC + vRespawnButtonReleased(tank, button); +#endif #if defined MT_MENU_ROCK vRockButtonReleased(tank, button); #endif #if defined MT_MENU_SHIELD vShieldButtonReleased(tank, button); #endif -#if defined MT_MENU_SPAM - vSpamButtonReleased(tank, button); -#endif -#if defined MT_MENU_SPLASH - vSplashButtonReleased(tank, button); -#endif #if defined MT_MENU_WARP vWarpButtonReleased(tank, button); #endif #if defined MT_MENU_YELL vYellButtonReleased(tank, button); #endif -#if defined MT_MENU_ZOMBIE - vZombieButtonReleased(tank, button); -#endif } public void MT_OnChangeType(int tank, int oldType, int newType, bool revert) { +#if defined MT_MENU_LAG + vLagChangeType(tank, oldType); +#endif +#if defined MT_MENU_LASER + vLaserChangeType(tank, oldType); +#endif +#if defined MT_MENU_LIGHTNING + vLightningChangeType(tank, oldType); +#endif #if defined MT_MENU_MEDIC vMedicChangeType(tank, oldType); #endif @@ -2067,18 +1761,12 @@ public void MT_OnChangeType(int tank, int oldType, int newType, bool revert) #if defined MT_MENU_MINION vMinionChangeType(tank, oldType); #endif -#if defined MT_MENU_NECRO - vNecroChangeType(tank, oldType); -#endif #if defined MT_MENU_NULLIFY vNullifyChangeType(tank, oldType); #endif #if defined MT_MENU_PANIC vPanicChangeType(tank, oldType); #endif -#if defined MT_MENU_PIMP - vPimpChangeType(tank, oldType); -#endif #if defined MT_MENU_PUKE vPukeChangeType(tank, oldType); #endif @@ -2106,12 +1794,6 @@ public void MT_OnChangeType(int tank, int oldType, int newType, bool revert) #if defined MT_MENU_ROCK vRockChangeType(tank, oldType); #endif -#if defined MT_MENU_ROCKET - vRocketChangeType(tank, oldType); -#endif -#if defined MT_MENU_SHAKE - vShakeChangeType(tank, oldType); -#endif #if defined MT_MENU_SHIELD vShieldChangeType(tank, oldType); #endif @@ -2124,18 +1806,6 @@ public void MT_OnChangeType(int tank, int oldType, int newType, bool revert) #if defined MT_MENU_SMASH vSmashChangeType(tank, oldType); #endif -#if defined MT_MENU_SMITE - vSmiteChangeType(tank, oldType); -#endif -#if defined MT_MENU_SPAM - vSpamChangeType(tank, oldType); -#endif -#if defined MT_MENU_SPLASH - vSplashChangeType(tank, oldType); -#endif -#if defined MT_MENU_SPLATTER - vSplatterChangeType(tank, oldType); -#endif #if defined MT_MENU_THROW vThrowChangeType(tank, oldType); #endif @@ -2163,9 +1833,6 @@ public void MT_OnChangeType(int tank, int oldType, int newType, bool revert) #if defined MT_MENU_YELL vYellChangeType(tank, oldType); #endif -#if defined MT_MENU_ZOMBIE - vZombieChangeType(tank, oldType); -#endif } public void MT_OnPostTankSpawn(int tank) @@ -2183,24 +1850,15 @@ public Action MT_OnFatalFalling(int survivor) public void MT_OnPlayerEventKilled(int victim, int attacker) { -#if defined MT_MENU_NECRO - vNecroPlayerEventKilled(victim); -#endif #if defined MT_MENU_RECALL vRecallPlayerEventKilled(victim); #endif #if defined MT_MENU_RESPAWN vRespawnPlayerEventKilled(victim); #endif -#if defined MT_MENU_ROCKET - vRocketPlayerEventKilled(victim, attacker); -#endif #if defined MT_MENU_SMASH vSmashPlayerEventKilled(victim, attacker); #endif -#if defined MT_MENU_SMITE - vSmitePlayerEventKilled(victim, attacker); -#endif #if defined MT_MENU_WARP vWarpPlayerEventKilled(victim); #endif @@ -2279,6 +1937,15 @@ public void MT_OnRockBreak(int tank, int rock) void vAbilityMenu(int client, const char[] name) { +#if defined MT_MENU_LAG + vLagMenu(client, name, 0); +#endif +#if defined MT_MENU_LASER + vLaserMenu(client, name, 0); +#endif +#if defined MT_MENU_LIGHTNING + vLightningMenu(client, name, 0); +#endif #if defined MT_MENU_MEDIC vMedicMenu(client, name, 0); #endif @@ -2288,9 +1955,6 @@ void vAbilityMenu(int client, const char[] name) #if defined MT_MENU_MINION vMinionMenu(client, name, 0); #endif -#if defined MT_MENU_NECRO - vNecroMenu(client, name, 0); -#endif #if defined MT_MENU_NULLIFY vNullifyMenu(client, name, 0); #endif @@ -2300,9 +1964,6 @@ void vAbilityMenu(int client, const char[] name) #if defined MT_MENU_PANIC vPanicMenu(client, name, 0); #endif -#if defined MT_MENU_PIMP - vPimpMenu(client, name, 0); -#endif #if defined MT_MENU_PUKE vPukeMenu(client, name, 0); #endif @@ -2330,12 +1991,6 @@ void vAbilityMenu(int client, const char[] name) #if defined MT_MENU_ROCK vRockMenu(client, name, 0); #endif -#if defined MT_MENU_ROCKET - vRocketMenu(client, name, 0); -#endif -#if defined MT_MENU_SHAKE - vShakeMenu(client, name, 0); -#endif #if defined MT_MENU_SHIELD vShieldMenu(client, name, 0); #endif @@ -2348,18 +2003,6 @@ void vAbilityMenu(int client, const char[] name) #if defined MT_MENU_SMASH vSmashMenu(client, name, 0); #endif -#if defined MT_MENU_SMITE - vSmiteMenu(client, name, 0); -#endif -#if defined MT_MENU_SPAM - vSpamMenu(client, name, 0); -#endif -#if defined MT_MENU_SPLASH - vSplashMenu(client, name, 0); -#endif -#if defined MT_MENU_SPLATTER - vSplatterMenu(client, name, 0); -#endif #if defined MT_MENU_THROW vThrowMenu(client, name, 0); #endif @@ -2372,9 +2015,6 @@ void vAbilityMenu(int client, const char[] name) #if defined MT_MENU_UNDEAD vUndeadMenu(client, name, 0); #endif -#if defined MT_MENU_VAMPIRE - vVampireMenu(client, name, 0); -#endif #if defined MT_MENU_VISION vVisionMenu(client, name, 0); #endif @@ -2387,14 +2027,8 @@ void vAbilityMenu(int client, const char[] name) #if defined MT_MENU_WITCH vWitchMenu(client, name, 0); #endif -#if defined MT_MENU_XIPHOS - vXiphosMenu(client, name, 0); -#endif #if defined MT_MENU_YELL vYellMenu(client, name, 0); -#endif -#if defined MT_MENU_ZOMBIE - vZombieMenu(client, name, 0); #endif bool bLog = false; if (bLog) @@ -2405,6 +2039,30 @@ void vAbilityMenu(int client, const char[] name) void vAbilityPlayer(int type, int client) { +#if defined MT_MENU_LAG + switch (type) + { + case 0: vLagClientPutInServer(client); + case 2: vLagClientDisconnect_Post(client); + case 3: vLagAbilityActivated(client); + } +#endif +#if defined MT_MENU_LASER + switch (type) + { + case 0: vLaserClientPutInServer(client); + case 2: vLaserClientDisconnect_Post(client); + case 3: vLaserAbilityActivated(client); + } +#endif +#if defined MT_MENU_LIGHTNING + switch (type) + { + case 0: vLightningClientPutInServer(client); + case 2: vLightningClientDisconnect_Post(client); + case 3: vLightningAbilityActivated(client); + } +#endif #if defined MT_MENU_MEDIC switch (type) { @@ -2430,14 +2088,6 @@ void vAbilityPlayer(int type, int client) case 3: vMinionAbilityActivated(client); } #endif -#if defined MT_MENU_NECRO - switch (type) - { - case 0: vNecroClientPutInServer(client); - case 2: vNecroClientDisconnect_Post(client); - case 3: vNecroAbilityActivated(client); - } -#endif #if defined MT_MENU_NULLIFY switch (type) { @@ -2464,14 +2114,6 @@ void vAbilityPlayer(int type, int client) case 4: vPanicPostTankSpawn(client); } #endif -#if defined MT_MENU_PIMP - switch (type) - { - case 0: vPimpClientPutInServer(client); - case 2: vPimpClientDisconnect_Post(client); - case 3: vPimpAbilityActivated(client); - } -#endif #if defined MT_MENU_PUKE switch (type) { @@ -2527,6 +2169,7 @@ void vAbilityPlayer(int type, int client) { case 0: vRespawnClientPutInServer(client); case 2: vRespawnClientDisconnect_Post(client); + case 3: vRespawnAbilityActivated(client); } #endif #if defined MT_MENU_RESTART @@ -2545,23 +2188,6 @@ void vAbilityPlayer(int type, int client) case 3: vRockAbilityActivated(client); } #endif -#if defined MT_MENU_ROCKET - switch (type) - { - case 0: vRocketClientPutInServer(client); - case 2: vRocketClientDisconnect_Post(client); - case 3: vRocketAbilityActivated(client); - } -#endif -#if defined MT_MENU_SHAKE - switch (type) - { - case 0: vShakeClientPutInServer(client); - case 2: vShakeClientDisconnect_Post(client); - case 3: vShakeAbilityActivated(client); - case 4: vShakePostTankSpawn(client); - } -#endif #if defined MT_MENU_SHIELD switch (type) { @@ -2595,38 +2221,6 @@ void vAbilityPlayer(int type, int client) case 3: vSmashAbilityActivated(client); } #endif -#if defined MT_MENU_SMITE - switch (type) - { - case 0: vSmiteClientPutInServer(client); - case 2: vSmiteClientDisconnect_Post(client); - case 3: vSmiteAbilityActivated(client); - } -#endif -#if defined MT_MENU_SPAM - switch (type) - { - case 0: vSpamClientPutInServer(client); - case 2: vSpamClientDisconnect_Post(client); - case 3: vSpamAbilityActivated(client); - } -#endif -#if defined MT_MENU_SPLASH - switch (type) - { - case 0: vSplashClientPutInServer(client); - case 2: vSplashClientDisconnect_Post(client); - case 3: vSplashAbilityActivated(client); - } -#endif -#if defined MT_MENU_SPLATTER - switch (type) - { - case 0: vSplatterClientPutInServer(client); - case 2: vSplatterClientDisconnect_Post(client); - case 3: vSplatterAbilityActivated(client); - } -#endif #if defined MT_MENU_THROW switch (type) { @@ -2657,18 +2251,13 @@ void vAbilityPlayer(int type, int client) case 3: vUndeadAbilityActivated(client); } #endif -#if defined MT_MENU_VAMPIRE - if (type == 0) - { - vVampireClientPutInServer(client); - } -#endif #if defined MT_MENU_VISION switch (type) { case 0: vVisionClientPutInServer(client); case 2: vVisionClientDisconnect_Post(client); case 3: vVisionAbilityActivated(client); + case 4: vVisionPostTankSpawn(client); } #endif #if defined MT_MENU_WARP @@ -2697,12 +2286,6 @@ void vAbilityPlayer(int type, int client) case 4: vWitchPostTankSpawn(client); } #endif -#if defined MT_MENU_XIPHOS - if (type == 0) - { - vXiphosClientPutInServer(client); - } -#endif #if defined MT_MENU_YELL switch (type) { @@ -2710,15 +2293,6 @@ void vAbilityPlayer(int type, int client) case 2: vYellClientDisconnect_Post(client); case 3: vYellAbilityActivated(client); } -#endif -#if defined MT_MENU_ZOMBIE - switch (type) - { - case 0: vZombieClientPutInServer(client); - case 2: vZombieClientDisconnect_Post(client); - case 3: vZombieAbilityActivated(client); - case 4: vZombiePostTankSpawn(client); - } #endif bool bLog = false; if (bLog) @@ -2729,6 +2303,27 @@ void vAbilityPlayer(int type, int client) void vAbilitySetup(int type) { +#if defined MT_MENU_LAG + switch (type) + { + case 1: vLagMapStart(); + case 2: vLagMapEnd(); + } +#endif +#if defined MT_MENU_LASER + switch (type) + { + case 1: vLaserMapStart(); + case 2: vLaserMapEnd(); + } +#endif +#if defined MT_MENU_LIGHTNING + switch (type) + { + case 1: vLightningMapStart(); + case 2: vLightningMapEnd(); + } +#endif #if defined MT_MENU_MEDIC switch (type) { @@ -2751,13 +2346,6 @@ void vAbilitySetup(int type) case 3: vMinionPluginEnd(); } #endif -#if defined MT_MENU_NECRO - switch (type) - { - case 1: vNecroMapStart(); - case 2: vNecroMapEnd(); - } -#endif #if defined MT_MENU_NULLIFY switch (type) { @@ -2779,13 +2367,6 @@ void vAbilitySetup(int type) case 2: vPanicMapEnd(); } #endif -#if defined MT_MENU_PIMP - switch (type) - { - case 1: vPimpMapStart(); - case 2: vPimpMapEnd(); - } -#endif #if defined MT_MENU_PUKE switch (type) { @@ -2850,21 +2431,6 @@ void vAbilitySetup(int type) case 2: vRockMapEnd(); } #endif -#if defined MT_MENU_ROCKET - switch (type) - { - case 1: vRocketMapStart(); - case 2: vRocketMapEnd(); - case 3: vRocketPluginEnd(); - } -#endif -#if defined MT_MENU_SHAKE - switch (type) - { - case 1: vShakeMapStart(); - case 2: vShakeMapEnd(); - } -#endif #if defined MT_MENU_SHIELD switch (type) { @@ -2894,34 +2460,7 @@ void vAbilitySetup(int type) { case 1: vSmashMapStart(); case 2: vSmashMapEnd(); - } -#endif -#if defined MT_MENU_SMITE - switch (type) - { - case 1: vSmiteMapStart(); - case 2: vSmiteMapEnd(); - } -#endif -#if defined MT_MENU_SPAM - switch (type) - { - case 1: vSpamMapStart(); - case 2: vSpamMapEnd(); - } -#endif -#if defined MT_MENU_SPLASH - switch (type) - { - case 1: vSplashMapStart(); - case 2: vSplashMapEnd(); - } -#endif -#if defined MT_MENU_SPLATTER - switch (type) - { - case 1: vSplatterMapStart(); - case 2: vSplatterMapEnd(); + case 3: vSmashPluginEnd(); } #endif #if defined MT_MENU_THROW @@ -2958,6 +2497,7 @@ void vAbilitySetup(int type) #if defined MT_MENU_VISION switch (type) { + case 0: vVisionPluginStart(); case 1: vVisionMapStart(); case 2: vVisionMapEnd(); case 3: vVisionPluginEnd(); @@ -2991,13 +2531,6 @@ void vAbilitySetup(int type) case 1: vYellMapStart(); case 2: vYellMapEnd(); } -#endif -#if defined MT_MENU_ZOMBIE - switch (type) - { - case 1: vZombieMapStart(); - case 2: vZombieMapEnd(); - } #endif bool bLog = false; if (bLog) diff --git a/addons/sourcemod/scripting/mutant_tanks/mutant_tanks.sp b/addons/sourcemod/scripting/mutant_tanks/mutant_tanks.sp index 3be7d4b336..ac6a8e3cd6 100644 --- a/addons/sourcemod/scripting/mutant_tanks/mutant_tanks.sp +++ b/addons/sourcemod/scripting/mutant_tanks/mutant_tanks.sp @@ -1,6 +1,6 @@ /** - * Mutant Tanks: a L4D/L4D2 SourceMod Plugin - * Copyright (C) 2024 Alfred "Psyk0tik" Llagas + * Mutant Tanks: A L4D/L4D2 SourceMod Plugin + * Copyright (C) 2017-2025 Alfred "Psyk0tik" Llagas * * 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. * @@ -95,6 +95,9 @@ public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max #define MODEL_GASCAN "models/props_junk/gascan001a.mdl" #define MODEL_OXYGENTANK "models/props_equipment/oxygentank01.mdl" #define MODEL_PROPANETANK "models/props_junk/propanecanister001a.mdl" +#define MODEL_SHIELD "models/props_unique/airport/atlas_break_ball.mdl" +#define MODEL_TIRES "models/props_vehicles/tire001c_car.mdl" +#define MODEL_TREE_TRUNK "models/props_foliage/tree_trunk.mdl" #define MODEL_TANK_MAIN "models/infected/hulk.mdl" #define MODEL_TANK_DLC "models/infected/hulk_dlc3.mdl" #define MODEL_TANK_L4D1 "models/infected/hulk_l4d1.mdl" // Only available in L4D2 @@ -105,8 +108,6 @@ public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max #define MODEL_BOOMETTE "models/infected/boomette.mdl" // Only available in L4D2 #define MODEL_HUNTER_MAIN "models/infected/hunter.mdl" #define MODEL_HUNTER_L4D1 "models/infected/hunter_l4d1.mdl" // Only available in L4D2 -#define MODEL_TIRES "models/props_vehicles/tire001c_car.mdl" -#define MODEL_TREE_TRUNK "models/props_foliage/tree_trunk.mdl" #define MODEL_WITCH "models/infected/witch.mdl" #define MODEL_WITCHBRIDE "models/infected/witch_bride.mdl" // Only available in L4D2 @@ -127,8 +128,10 @@ public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max #define SOUND_DAMAGE2 "player/damage2.wav" #define SOUND_DEATH "ui/pickup_scifi37.wav" #define SOUND_ELECTRICITY "items/suitchargeok1.wav" +#define SOUND_EMPTY "weapons/clipempty_rifle.wav" +#define SOUND_EXPLOSION "animation/van_inside_debris.wav" // Only used in L4D1 #define SOUND_EXPLOSION2 "weapons/grenade_launcher/grenadefire/grenade_launcher_explode_2.wav" // Only available in L4D2 -#define SOUND_EXPLOSION1 "animation/van_inside_debris.wav" // Only used in L4D1 +#define SOUND_EXPLOSION3 "weapons/grenade_launcher/grenadefire/grenade_launcher_fire_1.wav" // Only available in L4D2 #define SOUND_HEARTBEAT "player/heartbeatloop.wav" #define SOUND_LADYKILLER "ui/alert_clink.wav" #define SOUND_METAL "physics/metal/metal_solid_impact_hard5.wav" @@ -204,14 +207,27 @@ public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max #define MT_CONFIG_PATH_PLAYERCOUNT "playercount_configs/" #define MT_CONFIG_PATH_SURVIVORCOUNT "survivorcount_configs/" +#define MT_CONFIG_SECTION_NICK "Nick" +#define MT_CONFIG_SECTION_ROCHELLE "Rochelle" +#define MT_CONFIG_SECTION_ELLIS "Ellis" +#define MT_CONFIG_SECTION_COACH "Coach" +#define MT_CONFIG_SECTION_BILL "Bill" +#define MT_CONFIG_SECTION_ZOEY "Zoey" +#define MT_CONFIG_SECTION_FRANCIS "Francis" +#define MT_CONFIG_SECTION_LOUIS "Louis" +#define MT_CONFIG_SECTION_WEAPON "weapon_" + #define MT_CONFIG_SECTION_SMOKER "Smoker" #define MT_CONFIG_SECTION_BOOMER "Boomer" #define MT_CONFIG_SECTION_HUNTER "Hunter" #define MT_CONFIG_SECTION_SPITTER "Spitter" #define MT_CONFIG_SECTION_JOCKEY "Jockey" #define MT_CONFIG_SECTION_CHARGER "Charger" +#define MT_CONFIG_SECTION_WITCH "Witch" +#define MT_CONFIG_SECTION_COMMON "Common" #define MT_CONFIG_SECTION_SPECIAL "Special" #define MT_CONFIG_SECTION_SPECIAL2 "spec" +#define MT_CONFIG_SECTION_MOB "Mob" #define MT_CONFIG_SECTION_INFECTED "Infected" #define MT_CONFIG_SECTION_INFECTED2 "inf" @@ -233,13 +249,18 @@ public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max #define MT_CONFIG_SECTION_GENERAL "General" #define MT_CONFIG_SECTION_ANNOUNCE "Announcements" #define MT_CONFIG_SECTION_ANNOUNCE2 "announce" +#define MT_CONFIG_SECTION_CLASSES "Classes" #define MT_CONFIG_SECTION_COLORS "Colors" +#define MT_CONFIG_SECTION_PUNISH "Punishment" +#define MT_CONFIG_SECTION_PUNISH2 "punish" #define MT_CONFIG_SECTION_REWARDS "Rewards" +#define MT_CONFIG_SECTION_SURVIVORS "Survivors" #define MT_CONFIG_SECTION_COMP "Competitive" #define MT_CONFIG_SECTION_COMP2 "comp" #define MT_CONFIG_SECTION_DIFF "Difficulty" #define MT_CONFIG_SECTION_DIFF2 "diff" #define MT_CONFIG_SECTION_HEALTH "Health" +#define MT_CONFIG_SECTION_SIZE "Size" #define MT_CONFIG_SECTION_HUMAN "HumanSupport" #define MT_CONFIG_SECTION_HUMAN2 "Human Support" #define MT_CONFIG_SECTION_HUMAN3 "Human_Support" @@ -257,8 +278,8 @@ public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max #define MT_CONFIG_SECTION_SPAWN "Spawn" #define MT_CONFIG_SECTION_BOSS "Boss" #define MT_CONFIG_SECTION_COMBO "Combo" -#define MT_CONFIG_SECTION_PROTECTION "Protection" -#define MT_CONFIG_SECTION_PROTECTION2 "protect" +#define MT_CONFIG_SECTION_PROTECT "Protection" +#define MT_CONFIG_SECTION_PROTECT2 "protect" #define MT_CONFIG_SECTION_RANDOM "Random" #define MT_CONFIG_SECTION_TRANSFORM "Transform" #define MT_CONFIG_SECTION_ADMIN "Administration" @@ -310,6 +331,8 @@ public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max #define MT_GAMEDATA "mutant_tanks" #define MT_GAMEDATA_TEMP "mutant_tanks_temp" +#define MT_GRENADE_CHANCE 10.0 // chance to launch grenade + #define MT_INFAMMO_PRIMARY (1 << 0) // primary weapon #define MT_INFAMMO_SECONDARY (1 << 1) // secondary weapon #define MT_INFAMMO_THROWABLE (1 << 2) // throwable @@ -347,6 +370,9 @@ public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max #define MT_MENUFLAG_UNSPAWNABLE (1 << 6) // unspawnable types #define MT_MENUFLAG_COMPETITIVE (1 << 7) // competitive types +#define MT_MOBVARIANT_WITCH (1 << 0) // witch +#define MT_MOBVARIANT_COMMON (1 << 1) // common infected + #define MT_PARTICLE_BLOOD (1 << 0) // blood particle #define MT_PARTICLE_ELECTRICITY (1 << 1) // electric particle #define MT_PARTICLE_FIRE (1 << 2) // fire particle @@ -375,6 +401,13 @@ public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max #define MT_PROP_FLASHLIGHT (1 << 7) // flashlight prop #define MT_PROP_CROWN (1 << 8) // crown prop +#define MT_PUNISH_ALIVE (1 << 0) // alive/healthy survivors +#define MT_PUNISH_INCAPS (1 << 1) // incapacitated/hanging survivors +#define MT_PUNISH_ACTIONS (1 << 2) // survivors doing actions +#define MT_PUNISH_IDLE (1 << 3) // idle/afk survivors +#define MT_PUNISH_PINNED (1 << 4) // pinned/caught survivors +#define MT_PUNISH_INJURED (1 << 5) // injured/black and white survivors + #define MT_ROCK_BLOOD (1 << 0) // blood particle #define MT_ROCK_ELECTRICITY (1 << 1) // electric particle #define MT_ROCK_FIRE (1 << 2) // fire particle @@ -404,6 +437,16 @@ public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max #define MT_SPECINF_JOCKEY (1 << 4) // jockey #define MT_SPECINF_CHARGER (1 << 5) // charger +#define MT_SURVINF_COMMON (1 << 0) // common infected +#define MT_SURVINF_SMOKER (1 << 1) // smoker +#define MT_SURVINF_BOOMER (1 << 2) // boomer +#define MT_SURVINF_HUNTER (1 << 3) // hunter +#define MT_SURVINF_SPITTER (1 << 4) // spitter +#define MT_SURVINF_JOCKEY (1 << 5) // jockey +#define MT_SURVINF_CHARGER (1 << 6) // charger +#define MT_SURVINF_WITCH (1 << 7) // witch +#define MT_SURVINF_TANK (1 << 8) // tank + #define MT_UPDATE_URL "https://raw.githubusercontent.com/Psykotikism/Mutant_Tanks/master/addons/sourcemod/mutant_tanks_updater.txt" #define MT_USEFUL_REFILL (1 << 0) // useful refill reward @@ -424,6 +467,20 @@ public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max #define MT_WATER_WAIST 2 // waist in water #define MT_WATER_HEAD 3 // head in water +#define MT_WITCHFILTER_COMMON (1 << 0) // common infected +#define MT_WITCHFILTER_SMOKER (1 << 1) // smoker +#define MT_WITCHFILTER_BOOMER (1 << 2) // boomer +#define MT_WITCHFILTER_HUNTER (1 << 3) // hunter +#define MT_WITCHFILTER_SPITTER (1 << 4) // spitter +#define MT_WITCHFILTER_JOCKEY (1 << 5) // jockey +#define MT_WITCHFILTER_CHARGER (1 << 6) // charger +#define MT_WITCHFILTER_TANK (1 << 7) // tank +#define MT_WITCHFILTER_SURVIVORS (1 << 8) // survivors + +#define MT_WITCHTRIGGER_STARTLED (1 << 0) // startled +#define MT_WITCHTRIGGER_KILLED (1 << 1) // killed +#define MT_WITCHTRIGGER_CROWNED (1 << 2) // crowned + enum ConfigState { ConfigState_None, // no section yet @@ -452,8 +509,10 @@ enum struct esGeneral Address g_adOriginalVerticalPunch; ArrayList g_alAbilitySections[4]; + ArrayList g_alClassKeys[2]; ArrayList g_alColorKeys[2]; - ArrayList g_alCompTypes; + ArrayList g_alCompTypes[2]; + ArrayList g_alElevators; ArrayList g_alFilePaths; ArrayList g_alPlugins; ArrayList g_alSections; @@ -478,6 +537,7 @@ enum struct esGeneral bool g_bPluginEnabled; bool g_bRecycleTypes; bool g_bRecycleTypes2; + bool g_bRoundEnded; bool g_bRushCooldown; bool g_bRushCoop; bool g_bRushCountdown; @@ -492,6 +552,7 @@ enum struct esGeneral bool g_bUsedParser; bool g_bWitchKilled[2048]; + char g_sArmorCharacters[4]; char g_sBodyColorVisual[64]; char g_sBodyColorVisual2[64]; char g_sBodyColorVisual3[64]; @@ -539,10 +600,12 @@ enum struct esGeneral char g_sScreenColorVisual3[64]; char g_sScreenColorVisual4[64]; char g_sSection[PLATFORM_MAX_PATH]; + char g_sShieldCharacters[4]; ConfigState g_csState; ConfigState g_csState2; + ConVar g_cvMTAdrenalineDuration; ConVar g_cvMTAmmoPackUseDuration; ConVar g_cvMTAssaultRifleAmmo; ConVar g_cvMTAutoShotgunAmmo; @@ -565,6 +628,7 @@ enum struct esGeneral ConVar g_cvMTGasCanUseDuration; ConVar g_cvMTGhostSpeed; ConVar g_cvMTGhostTravelDistance; + ConVar g_cvMTGraphicsLevel; ConVar g_cvMTGrenadeLauncherAmmo; ConVar g_cvMTGunSwingInterval; ConVar g_cvMTGunVerticalPunch; @@ -572,6 +636,7 @@ enum struct esGeneral ConVar g_cvMTListenSupport; ConVar g_cvMTMeleeRange; ConVar g_cvMTPainPillsDecayRate; + ConVar g_cvMTPainPillsHealthValue; ConVar g_cvMTPhysicsPushScale; ConVar g_cvMTPipeBombDuration; ConVar g_cvMTPluginEnabled; @@ -672,8 +737,10 @@ enum struct esGeneral DynamicHook g_dhWeaponShootPositionHook; float g_flActionDurationReward[4]; + float g_flAdrenalineTimeReward[4]; float g_flArmorDuration; - float g_flArmorResistance; + float g_flArmorPercentage; + float g_flArmorResistance[2]; float g_flAttackBoostReward[4]; float g_flAttackInterval; float g_flBurnDuration; @@ -696,42 +763,75 @@ enum struct esGeneral float g_flDefaultTankThrowForce; float g_flDefaultUpgradePackUseDuration; float g_flDifficultyDamage[4]; + float g_flDopamineRadiusReward[4]; float g_flExtrasDelay; float g_flFinaleCooldown; + float g_flFireRateReward[4]; float g_flForceSpawn; + float g_flGrenadeLauncherReward[4]; float g_flHealPercentMultiplier; float g_flHealPercentReward[4]; + float g_flHealthcareRadiusReward[4]; + float g_flHeartbeatReward[4]; float g_flHittableDamage; + float g_flHollowpointAmmoReward[4]; float g_flIdleCheck; float g_flIncapDamageMultiplier; + float g_flInfectedChance; + float g_flInfectedScaleMax; + float g_flInfectedScaleMin; + float g_flJockeyChance; + float g_flJockeyScaleMax; + float g_flJockeyScaleMin; float g_flJumpHeightReward[4]; float g_flKillCountdown; + float g_flLadyKillerReward[4]; float g_flLoopingVoicelineInterval[4]; + float g_flLuckyBulletReward[4]; float g_flMeleeHitValue; + float g_flMotivationRadiusReward[4]; + float g_flPassiveDelay; + float g_flPassiveInterval; + float g_flOverdoseRadiusReward[4]; float g_flPipeBombDurationReward[4]; float g_flPunchForce; float g_flPunchResistanceReward[4]; float g_flPunchThrow; + float g_flPunishDistance[2]; + float g_flPunisherLifetime[2]; float g_flRapidPistolReward[4]; float g_flRefillPercentReward[4]; float g_flRegularDelay; float g_flRegularInterval; + float g_flReloadRateReward[4]; float g_flRewardChance[4]; float g_flRewardDuration[4]; float g_flRewardPercentage[4]; float g_flRockDamage; float g_flRunSpeed; float g_flShieldDuration; + float g_flShieldPercentage; + float g_flShieldRate; float g_flShieldResistance; + float g_flShockwaveRadiusReward[4]; float g_flShoveDamageReward[4]; float g_flShoveRateReward[4]; + float g_flSledgehammerRoundsReward[4]; float g_flSpawnInterval; float g_flSpeedBoostReward[4]; float g_flStickyDelay[2048]; + float g_flSupplierReward[4]; float g_flSurvivalDelay; + float g_flSwingRateReward[4]; + float g_flTankChance; float g_flThrowForce; float g_flThrowInterval; float g_flTickInterval; + float g_flWarningDistance[2]; + float g_flWitchChance; + float g_flWitchScaleMax; + float g_flWitchScaleMin; + float g_flZedTime[2]; GameData g_gdMutantTanks; @@ -762,6 +862,7 @@ enum struct esGeneral GlobalForward g_gfRockBreakForward; GlobalForward g_gfRockThrowForward; GlobalForward g_gfSettingsCachedForward; + GlobalForward g_gfToggleSurvivorPassiveForward; GlobalForward g_gfTypeChosenForward; #if defined _updater_included GlobalForward g_gfPluginUpdateForward; @@ -772,6 +873,7 @@ enum struct esGeneral Handle g_hSDKCreateForPlayer; Handle g_hSDKDeafen; Handle g_hSDKFirstContainedResponder; + Handle g_hSDKGetLastKnownArea; Handle g_hSDKGetMaxClip1; Handle g_hSDKGetMissionFirstMap; Handle g_hSDKGetMissionInfo; @@ -792,6 +894,7 @@ enum struct esGeneral Handle g_hSDKIsVersusMode; Handle g_hSDKITExpired; Handle g_hSDKKeyValuesGetString; + Handle g_hSDKLaunchGrenade; Handle g_hSDKLeaveStasis; Handle g_hSDKMaterializeFromGhost; Handle g_hSDKPipeBombProjectileCreate; @@ -812,6 +915,7 @@ enum struct esGeneral int g_iAccessFlags; int g_iAmmoBoostReward[4]; + int g_iAmmoRefillReward[4]; int g_iAmmoRegenReward[4]; int g_iAnnounceArrival; int g_iAnnounceDeath; @@ -820,9 +924,11 @@ enum struct esGeneral int g_iArrivalSound; int g_iAttackerOffset; int g_iAutoAggravate; + int g_iAutoHop; int g_iAutoUpdate; int g_iBaseHealth; int g_iBlazeHealthReward[4]; + int g_iBloodDonorReward[4]; int g_iBulletFix; int g_iBulletImmunity; int g_iBunnyHopReward[4]; @@ -831,6 +937,7 @@ enum struct esGeneral int g_iChosenType; int g_iCleanKillsReward[4]; int g_iClusterBombsReward[4]; + int g_iCommonHealth[2048]; int g_iCommonLimit; int g_iConfigCreate; int g_iConfigEnable; @@ -850,27 +957,31 @@ enum struct esGeneral int g_iDetourCount; int g_iDisplayHealth; int g_iDisplayHealthType; + int g_iEternalFlamesReward[4]; int g_iExplosiveImmunity; int g_iExtraHealth; + int g_iFastRecoveryReward[4]; int g_iFileTimeOld[8]; int g_iFileTimeNew[8]; int g_iFinaleAmount; + int g_iFinaleCheck; int g_iFinaleMaxTypes[11]; int g_iFinaleMinTypes[11]; int g_iFinaleMode; int g_iFinalesOnly; int g_iFinaleWave[11]; int g_iFireImmunity; + int g_iFlowOffset; int g_iFootstepShake; int g_iFriendlyFireReward[4]; int g_iGameModeTypes; int g_iGhostBulletsReward[4]; + int g_iGraphicsLevel; int g_iGroundPound; int g_iHardcoreMode; int g_iHealthKills; int g_iHealthRegenReward[4]; int g_iHittableImmunity; - int g_iHollowpointAmmoReward[4]; int g_iHumanCooldown; int g_iHumanMultiplierMode; int g_iIdleCheckMode; @@ -880,15 +991,17 @@ enum struct esGeneral int g_iIgnoreLevel4; int g_iIgnoreLevel5; int g_iImmunityFlags; - int g_iInextinguishableFireReward[4]; - int g_iInfectedHealth[2048]; + int g_iIncapsRequired; + int g_iInfectedDamage; + int g_iInfectedHealth; int g_iInfiniteAmmoReward[4]; int g_iIntangibleBody; int g_iIntentionOffset; + int g_iJockeyDamage; + int g_iJockeyHealth; int g_iKickBots; int g_iKillMessage; int g_iLadderActionsReward[4]; - int g_iLadyKillerReward[4]; int g_iLaserSightReward[4]; int g_iLauncher; int g_iLifeLeechReward[4]; @@ -898,6 +1011,7 @@ enum struct esGeneral int g_iLogMessages; int g_iMasterControl; int g_iMaxType; + int g_iMaxWeapons; int g_iMedicalCutsReward[4]; int g_iMeleeHitMode; int g_iMeleeImmunity; @@ -908,14 +1022,21 @@ enum struct esGeneral int g_iMinType; int g_iMinimumHumans; int g_iMultiplyHealth; + int g_iOverhealthReward[4]; + int g_iOwnerID[2048]; + int g_iOwnerID2[2048]; int g_iParserViewer; int g_iParticleEffectVisual[4]; + int g_iPassiveHealth; int g_iPatchCount; int g_iPlatformType; int g_iPlayerCount[3]; int g_iPluginEnabled; int g_iPrefsNotify[4]; int g_iPrioritizeThrows; + int g_iPunishBots[2]; + int g_iPunishEnabled[2]; + int g_iPunisherTypes[2]; int g_iRecoilDampenerReward[4]; int g_iRegenBurstsReward[4]; int g_iRegularAmount; @@ -933,6 +1054,7 @@ enum struct esGeneral int g_iRewardEnabled[4]; int g_iRewardNotify[4]; int g_iRewardVisual[4]; + int g_iRiotGearReward[4]; int g_iRockSound; int g_iRushCooldownTick; int g_iRushCoopTick; @@ -941,6 +1063,7 @@ enum struct esGeneral int g_iRushTypes; int g_iRushLimit; int g_iRushSpawnTick; + int g_iSafetyBubbleReward[4]; int g_iScaleDamage; int g_iSection; int g_iShareRewards[4]; @@ -948,7 +1071,6 @@ enum struct esGeneral int g_iSignatureCount; int g_iSkipIncap; int g_iSkipTaunt; - int g_iSledgehammerRoundsReward[4]; int g_iSpawnLimit; int g_iSpawnEnabled; int g_iSpawnMode; @@ -961,11 +1083,14 @@ enum struct esGeneral int g_iStickyGrenadesReward[4]; int g_iSurvivalBlock; int g_iSurvivorIncaps; + int g_iSurvivorsRequired; + int g_iSurvivorTypes; int g_iSweepFist; int g_iSyringeDartsReward[4]; int g_iTankCount; int g_iTankEnabled; int g_iTankModel; + int g_iTankNote; int g_iTankWave; int g_iTeamID[2048]; int g_iTeamID2[2048]; @@ -980,6 +1105,10 @@ enum struct esGeneral int g_iVocalizeDeath; int g_iVoicePitchVisual[4]; int g_iVomitImmunity; + int g_iWarningInterval[2]; + int g_iWarningLimit[2]; + int g_iWitchDamage; + int g_iWitchHealth; StringMap g_smCvars; #if defined _adminmenu_included @@ -993,9 +1122,11 @@ esGeneral g_esGeneral; enum struct esSpecific { + bool g_bInfected[MT_MAXTYPES + 1]; bool g_bRecycleTypes[7]; bool g_bRecycleTypes2[7]; + char g_sArmorCharacters[4]; char g_sBodyColorVisual[64]; char g_sBodyColorVisual2[64]; char g_sBodyColorVisual3[64]; @@ -1025,10 +1156,13 @@ enum struct esSpecific char g_sScreenColorVisual2[64]; char g_sScreenColorVisual3[64]; char g_sScreenColorVisual4[64]; + char g_sShieldCharacters[4]; float g_flActionDurationReward[4]; + float g_flAdrenalineTimeReward[4]; float g_flArmorDuration; - float g_flArmorResistance; + float g_flArmorPercentage; + float g_flArmorResistance[2]; float g_flAttackBoostReward[4]; float g_flAttackInterval; float g_flBurnDuration; @@ -1036,38 +1170,61 @@ enum struct esSpecific float g_flClawDamage; float g_flDamageBoostReward[4]; float g_flDamageResistanceReward[4]; + float g_flDopamineRadiusReward[4]; + float g_flFireRateReward[4]; + float g_flGrenadeLauncherReward[4]; float g_flHealPercentMultiplier; float g_flHealPercentReward[4]; + float g_flHealthcareRadiusReward[4]; + float g_flHeartbeatReward[4]; float g_flHittableDamage; + float g_flHollowpointAmmoReward[4]; float g_flIncapDamageMultiplier; float g_flJumpHeightReward[4]; + float g_flLadyKillerReward[4]; float g_flLoopingVoicelineInterval[4]; + float g_flLuckyBulletReward[4]; float g_flMeleeHitValue; + float g_flMotivationRadiusReward[4]; + float g_flOverdoseRadiusReward[4]; + float g_flPassiveDelay; + float g_flPassiveInterval; float g_flPinDamage; float g_flPipeBombDurationReward[4]; float g_flPunchResistanceReward[4]; float g_flRapidPistolReward[4]; float g_flRefillPercentReward[4]; + float g_flReloadRateReward[4]; float g_flRewardChance[4]; float g_flRewardDuration[4]; float g_flRewardPercentage[4]; float g_flRunSpeed; float g_flShieldDuration; + float g_flShieldPercentage; + float g_flShieldRate; float g_flShieldResistance; + float g_flShockwaveRadiusReward[4]; float g_flShoveDamageReward[4]; float g_flShoveRateReward[4]; + float g_flSledgehammerRoundsReward[4]; + float g_flSpecialChance; float g_flSpecialInterval; float g_flSpeedBoostReward[4]; + float g_flSupplierReward[4]; + float g_flSwingRateReward[4]; int g_iAmmoBoostReward[4]; + int g_iAmmoRefillReward[4]; int g_iAmmoRegenReward[4]; int g_iAnnounceArrival; int g_iAnnounceDeath; int g_iAnnounceKill; int g_iArrivalMessage; int g_iArrivalSound; + int g_iAutoHop; int g_iBaseHealth[7]; int g_iBlazeHealthReward[4]; + int g_iBloodDonorReward[4]; int g_iBulletImmunity; int g_iBunnyHopReward[4]; int g_iBurstDoorsReward[4]; @@ -1080,8 +1237,10 @@ enum struct esSpecific int g_iDeathSound; int g_iDisplayHealth; int g_iDisplayHealthType; + int g_iEternalFlamesReward[4]; int g_iExplosiveImmunity; int g_iExtraHealth[7]; + int g_iFastRecoveryReward[4]; int g_iFinalesOnly; int g_iFireImmunity; int g_iFriendlyFireReward[4]; @@ -1089,15 +1248,12 @@ enum struct esSpecific int g_iGhostBulletsReward[4]; int g_iHealthRegenReward[4]; int g_iHittableImmunity; - int g_iHollowpointAmmoReward[4]; int g_iHumanCooldown; int g_iHumanMultiplierMode; - int g_iInextinguishableFireReward[4]; int g_iInfiniteAmmoReward[4]; int g_iIntangibleBody; int g_iKillMessage; int g_iLadderActionsReward[4]; - int g_iLadyKillerReward[4]; int g_iLaserSightReward[4]; int g_iLifeLeechReward[4]; int g_iMaxType; @@ -1109,7 +1265,9 @@ enum struct esSpecific int g_iMinimumHumans; int g_iMinType; int g_iMultiplyHealth; + int g_iOverhealthReward[4]; int g_iParticleEffectVisual[4]; + int g_iPassiveHealth; int g_iPrefsNotify[4]; int g_iRecoilDampenerReward[4]; int g_iRegenBurstsReward[4]; @@ -1121,14 +1279,16 @@ enum struct esSpecific int g_iRewardEnabled[4]; int g_iRewardNotify[4]; int g_iRewardVisual[4]; + int g_iRiotGearReward[4]; + int g_iSafetyBubbleReward[4]; int g_iShareRewards[4]; int g_iShovePenaltyReward[4]; - int g_iSledgehammerRoundsReward[4]; int g_iSpawnEnabled; int g_iSpawnMode; int g_iSpawnProtection; int g_iSpecialAmmoReward[4]; int g_iSpecialModel; + int g_iSpecialNote; int g_iSpecialTypes; int g_iStackLimits[8]; int g_iStackRewards[4]; @@ -1145,6 +1305,129 @@ enum struct esSpecific esSpecific g_esSpecific; +enum struct esMob +{ + char g_sHealthCharacters[4]; + + float g_flBioMassMeter; + float g_flCommonBioChance; + float g_flCommonChance; + float g_flCommonCheck; + float g_flCommonDamagePoints; + float g_flCommonDeathPoints; + float g_flCommonGoal; + float g_flWitchChance; + float g_flWitchMutateChance; + float g_flWitchRange; + + Handle g_hBioMassTimer; + + int g_iCommonFilter; + int g_iCommonVariant; + int g_iDisplayHealth; + int g_iDisplayHealthType; + int g_iMobVariants; + int g_iWitchFilter; + int g_iWitchMode; + int g_iWitchTypes; +} + +esMob g_esMob; + +enum struct esHuman +{ + char g_sCarrierAttackVoicelines[1280]; + char g_sCarrierBaitVoicelines[1280]; + char g_sItemPassive[320]; + + float g_flActionDurationPassive; + float g_flAdrenalineTimePassive; + float g_flAttackBoostPassive; + float g_flCarrierChance; + float g_flCarrierDamageMultiplier; + float g_flCarrierDelay; + float g_flCarrierHealthMultiplier; + float g_flCarrierVoiceChance; + float g_flCarrierVoiceInterval; + float g_flDamageBoostPassive; + float g_flDamageResistancePassive; + float g_flDopamineRadiusPassive; + float g_flFireRatePassive; + float g_flGrenadeLauncherPassive; + float g_flHealPercentPassive; + float g_flHealthcareRadiusPassive; + float g_flHeartbeatPassive; + float g_flHollowpointAmmoPassive; + float g_flJumpHeightPassive; + float g_flLadyKillerPassive; + float g_flLuckyBulletPassive; + float g_flMotivationRadiusPassive; + float g_flOverdoseRadiusPassive; + float g_flPipeBombDurationPassive; + float g_flPunchResistancePassive; + float g_flRapidPistolPassive; + float g_flRefillPercentPassive; + float g_flReloadRatePassive; + float g_flShockwaveRadiusPassive; + float g_flShoveDamagePassive; + float g_flShoveRatePassive; + float g_flSledgehammerRoundsPassive; + float g_flSpeedBoostPassive; + float g_flSupplierPassive; + float g_flSwingRatePassive; + + int g_iAmmoBoostPassive; + int g_iAmmoRefillPassive; + int g_iAmmoRegenPassive; + int g_iBlazeHealthPassive; + int g_iBloodDonorPassive; + int g_iBunnyHopPassive; + int g_iBurstDoorsPassive; + int g_iCarrierBody; + int g_iCarrierBots; + int g_iCarrierCleanse; + int g_iCarrierEnabled; + int g_iCarrierFilter; + int g_iCarrierInfection; + int g_iCarrierMaxType; + int g_iCarrierMinType; + int g_iCarrierMix; + int g_iCarrierMode; + int g_iCarrierTeleport; + int g_iCarrierVoice; + int g_iCleanKillsPassive; + int g_iClusterBombsPassive; + int g_iEternalFlamesPassive; + int g_iFastRecoveryPassive; + int g_iFriendlyFirePassive; + int g_iGhostBulletsPassive; + int g_iHealthRegenPassive; + int g_iInfiniteAmmoPassive; + int g_iLadderActionsPassive; + int g_iLaserSightPassive; + int g_iLifeLeechPassive; + int g_iMedicalCutsPassive; + int g_iMeleeRangePassive; + int g_iMidairDashesPassive; + int g_iOverhealthPassive; + int g_iPassiveBots; + int g_iPassiveEnabled; + int g_iPassiveNotify; + int g_iRecoilDampenerPassive; + int g_iRegenBurstsPassive; + int g_iRespawnLoadoutPassive; + int g_iReviveHealthPassive; + int g_iRiotGearPassive; + int g_iSafetyBubblePassive; + int g_iShovePenaltyPassive; + int g_iSpecialAmmoPassive; + int g_iStickyGrenadesPassive; + int g_iSyringeDartsPassive; + int g_iThornsPassive; +} + +esHuman g_esHuman; + enum struct esAdmin { int g_iAccessFlags[MAXPLAYERS + 1]; @@ -1164,18 +1447,29 @@ enum struct esDeveloper char g_sDevSkinColor[64]; float g_flDevActionDuration; + float g_flDevAdrenalineTime; float g_flDevAttackBoost; float g_flDevDamageBoost; float g_flDevDamageResistance; + float g_flDevDopamineRadius; + float g_flDevFireRate; + float g_flDevGrenadeLauncher; float g_flDevHealPercent; + float g_flDevHealthcareRadius; float g_flDevJumpHeight; + float g_flDevLadyKiller; + float g_flDevMotivationRadius; + float g_flDevOverdoseRadius; float g_flDevPipeBombDuration; float g_flDevPunchResistance; float g_flDevRapidPistol; + float g_flDevReloadRate; float g_flDevRewardDuration; + float g_flDevShockwaveRadius; float g_flDevShoveDamage; float g_flDevShoveRate; float g_flDevSpeedBoost; + float g_flDevSwingRate; int g_iDevAccess; int g_iDevAmmoRegen; @@ -1193,6 +1487,7 @@ enum struct esDeveloper int g_iDevParticle; int g_iDevRegenBursts; int g_iDevReviveHealth; + int g_iDevPassiveTypes; int g_iDevRewardTypes; int g_iDevSpecialAmmo; int g_iDevSyringeDarts; @@ -1220,16 +1515,21 @@ enum struct esPlayer bool g_bFalling; bool g_bFallTracked; bool g_bFatalFalling; + bool g_bFinalFall; bool g_bFire; bool g_bFirstSpawn; bool g_bIce; bool g_bIgnoreCmd; bool g_bInitialRound; bool g_bKeepCurrentType; + bool g_bLadyKiller; bool g_bLastLife[2]; bool g_bMeteor; bool g_bMutantMenu; + bool g_bPassive; bool g_bProtected[2]; + bool g_bPunished; + bool g_bPunisher; bool g_bRainbowColor; bool g_bRandomized; bool g_bReleasedJump; @@ -1251,6 +1551,7 @@ enum struct esPlayer #if defined _actions_included char g_sActionName[32]; #endif + char g_sArmorCharacters[4]; char g_sBodyColor[64]; char g_sBodyColorVisual[64]; char g_sBodyColorVisual2[64]; @@ -1294,6 +1595,7 @@ enum struct esPlayer char g_sScreenColorVisual2[64]; char g_sScreenColorVisual3[64]; char g_sScreenColorVisual4[64]; + char g_sShieldCharacters[4]; char g_sSkinColor[64]; char g_sSteamID32[64]; char g_sSteam3ID[64]; @@ -1302,6 +1604,7 @@ enum struct esPlayer char g_sStoredPills[32]; char g_sTankName[33]; char g_sTireColor[64]; + char g_sWeaponCurrent[32]; char g_sWeaponPrimary[32]; char g_sWeaponSecondary[32]; char g_sWeaponThrowable[32]; @@ -1310,11 +1613,15 @@ enum struct esPlayer float g_flActionDuration; float g_flActionDurationReward[4]; + float g_flAdrenalineTime; + float g_flAdrenalineTimeReward[4]; float g_flArmorDuration; - float g_flArmorResistance; + float g_flArmorPercentage; + float g_flArmorResistance[2]; float g_flAttackBoost; float g_flAttackBoostReward[4]; float g_flAttackInterval; + float g_flBodyChance[7]; float g_flBurnDuration; float g_flBurntSkin; float g_flClawDamage; @@ -1336,19 +1643,47 @@ enum struct esPlayer float g_flDamageBoostReward[4]; float g_flDamageResistance; float g_flDamageResistanceReward[4]; + float g_flDopamineRadius; + float g_flDopamineRadiusReward[4]; + float g_flFireRate; + float g_flFireRateReward[4]; + float g_flGrenadeLauncher; + float g_flGrenadeLauncherReward[4]; float g_flHealPercent; float g_flHealPercentMultiplier; float g_flHealPercentReward[4]; + float g_flHealthcareRadius; + float g_flHealthcareRadiusReward[4]; + float g_flHeartbeat; + float g_flHeartbeatCooldown; + float g_flHeartbeatReward[4]; float g_flHittableDamage; + float g_flHollowpointAmmo; + float g_flHollowpointAmmoReward[4]; float g_flIncapDamageMultiplier; float g_flJumpHeight; float g_flJumpHeightReward[4]; + float g_flLadyKiller; + float g_flLadyKillerReward[4]; float g_flLastAttackTime; + float g_flLastClickTime; + float g_flLastFlow; + float g_flLastGrenadeTime; float g_flLastJumpTime; + float g_flLastPosition[3]; float g_flLastPushTime; + float g_flLastWarning; float g_flLastWeaponShotPosition[3]; float g_flLoopingVoicelineInterval[4]; + float g_flLuckyBullet; + float g_flLuckyBulletReward[4]; float g_flMeleeHitValue; + float g_flMotivationRadius; + float g_flMotivationRadiusReward[4]; + float g_flOverdoseRadius; + float g_flOverdoseRadiusReward[4]; + float g_flPassiveDelay; + float g_flPassiveInterval; float g_flPipeBombDuration; float g_flPipeBombDurationReward[4]; float g_flPreFallZ; @@ -1363,21 +1698,35 @@ enum struct esPlayer float g_flRapidPistolReward[4]; float g_flRefillPercent; float g_flRefillPercentReward[4]; + float g_flReloadRate; + float g_flReloadRateReward[4]; float g_flRewardChance[4]; float g_flRewardDuration[4]; float g_flRewardPercentage[4]; float g_flRewardTime[8]; + float g_flRockChance[4]; float g_flRockDamage; float g_flRunSpeed; float g_flShieldDuration; + float g_flShieldPercentage; + float g_flShieldRate; float g_flShieldResistance; + float g_flShockwaveRadius; + float g_flShockwaveRadiusReward[4]; float g_flShoveDamage; float g_flShoveDamageReward[4]; float g_flShoveRate; float g_flShoveRateReward[4]; + float g_flSledgehammerRounds; + float g_flSledgehammerRoundsReward[4]; float g_flSpeedBoost; float g_flSpeedBoostReward[4]; float g_flStaggerTime; + float g_flSupplier; + float g_flSupplierCooldown; + float g_flSupplierReward[4]; + float g_flSwingRate; + float g_flSwingRateReward[4]; float g_flThrowForce; float g_flThrowInterval; float g_flTransformDelay; @@ -1385,11 +1734,14 @@ enum struct esPlayer float g_flVisualTime[7]; Handle g_hHudTimer; + Handle g_hPassiveTimer[2]; Handle g_hProtectionTimer[2]; int g_iAccessFlags; int g_iAmmoBoost; int g_iAmmoBoostReward[4]; + int g_iAmmoRefill; + int g_iAmmoRefillReward[4]; int g_iAmmoRegen; int g_iAmmoRegenReward[4]; int g_iAnnounceArrival; @@ -1397,9 +1749,12 @@ enum struct esPlayer int g_iAnnounceKill; int g_iArrivalMessage; int g_iArrivalSound; + int g_iAutoHop; int g_iBaseHealth; int g_iBlazeHealth; int g_iBlazeHealthReward[4]; + int g_iBloodDonor; + int g_iBloodDonorReward[4]; int g_iBlur; int g_iBodyEffects; int g_iBossEffects; @@ -1407,6 +1762,7 @@ enum struct esPlayer int g_iBossStageCount; int g_iBossStages; int g_iBossType[4]; + int g_iBubble; int g_iBulletImmunity; int g_iBunnyHop; int g_iBunnyHopReward[4]; @@ -1431,9 +1787,13 @@ enum struct esPlayer int g_iDisplayHealth; int g_iDisplayHealthType; int g_iEffect[2]; + int g_iEternalFlames; + int g_iEternalFlamesReward[4]; int g_iExplosiveImmunity; int g_iExtraHealth; int g_iFallPasses; + int g_iFastRecovery; + int g_iFastRecoveryReward[4]; int g_iFavoriteType; int g_iFireImmunity; int g_iFlame[2]; @@ -1456,15 +1816,11 @@ enum struct esPlayer int g_iHealthRegen; int g_iHealthRegenReward[4]; int g_iHittableImmunity; - int g_iHollowpointAmmo; - int g_iHollowpointAmmoReward[4]; int g_iHudPanelPage; int g_iHudPanelPages; int g_iHumanMultiplierMode; int g_iImmunityFlags; int g_iIncapCount; - int g_iInextinguishableFire; - int g_iInextinguishableFireReward[4]; int g_iInfectedType; int g_iInfiniteAmmo; int g_iInfiniteAmmoReward[4]; @@ -1473,9 +1829,6 @@ enum struct esPlayer int g_iKillMessage; int g_iLadderActions; int g_iLadderActionsReward[4]; - int g_iLadyKillerCount; - int g_iLadyKillerLimit; - int g_iLadyKillerReward[4]; int g_iLaserSight; int g_iLaserSightReward[4]; int g_iLastButtons; @@ -1501,10 +1854,13 @@ enum struct esPlayer int g_iMultiplyHealth; int g_iNotify; int g_iOldTankType; + int g_iOverhealth; + int g_iOverhealthReward[4]; int g_iOzTank[2]; int g_iOzTankColor[4]; int g_iParticleEffect; int g_iParticleEffectVisual[4]; + int g_iPassiveHealth; int g_iPersonalType; int g_iPrefsAccess; int g_iPrefsNotify[4]; @@ -1531,6 +1887,8 @@ enum struct esPlayer int g_iRewardTypes; int g_iRewardVisual[4]; int g_iRewardVisuals; + int g_iRiotGear; + int g_iRiotGearReward[4]; int g_iRock[20]; int g_iRockColor[4]; int g_iRockCount; @@ -1541,6 +1899,8 @@ enum struct esPlayer int g_iRushDespawnCount; int g_iRushDespawningTick; int g_iRushWaitingTick; + int g_iSafetyBubble; + int g_iSafetyBubbleReward[4]; int g_iScreenColorVisual[4]; int g_iShareRewards[4]; int g_iShovePenalty; @@ -1548,8 +1908,6 @@ enum struct esPlayer int g_iSkinColor[4]; int g_iSkipIncap; int g_iSkipTaunt; - int g_iSledgehammerRounds; - int g_iSledgehammerRoundsReward[4]; int g_iSpawnProtection; int g_iSpawnType; int g_iSpecialAmmo; @@ -1595,6 +1953,7 @@ esPlayer g_esPlayer[MAXPLAYERS + 1]; enum struct esTeammate { + char g_sArmorCharacters[4]; char g_sBodyColorVisual[64]; char g_sBodyColorVisual2[64]; char g_sBodyColorVisual3[64]; @@ -1631,15 +1990,19 @@ enum struct esTeammate char g_sScreenColorVisual2[64]; char g_sScreenColorVisual3[64]; char g_sScreenColorVisual4[64]; + char g_sShieldCharacters[4]; char g_sSkinColor[64]; char g_sSmokerName[33]; char g_sSpitterName[33]; float g_flActionDurationReward[4]; + float g_flAdrenalineTimeReward[4]; float g_flArmorDuration; - float g_flArmorResistance; + float g_flArmorPercentage; + float g_flArmorResistance[2]; float g_flAttackBoostReward[4]; float g_flAttackInterval; + float g_flBodyChance[7]; float g_flBurnDuration; float g_flBurntSkin; float g_flClawDamage; @@ -1659,13 +2022,25 @@ enum struct esTeammate float g_flComboTypeChance[7]; float g_flDamageBoostReward[4]; float g_flDamageResistanceReward[4]; + float g_flDopamineRadiusReward[4]; + float g_flFireRateReward[4]; + float g_flGrenadeLauncherReward[4]; float g_flHealPercentMultiplier; float g_flHealPercentReward[4]; + float g_flHealthcareRadiusReward[4]; + float g_flHeartbeatReward[4]; float g_flHittableDamage; + float g_flHollowpointAmmoReward[4]; float g_flIncapDamageMultiplier; float g_flJumpHeightReward[4]; + float g_flLadyKillerReward[4]; float g_flLoopingVoicelineInterval[4]; + float g_flLuckyBulletReward[4]; float g_flMeleeHitValue; + float g_flMotivationRadiusReward[4]; + float g_flOverdoseRadiusReward[4]; + float g_flPassiveDelay; + float g_flPassiveInterval; float g_flPinDamage; float g_flPipeBombDurationReward[4]; float g_flPunchResistanceReward[4]; @@ -1673,28 +2048,39 @@ enum struct esTeammate float g_flRandomInterval; float g_flRapidPistolReward[4]; float g_flRefillPercentReward[4]; + float g_flReloadRateReward[4]; float g_flRewardChance[4]; float g_flRewardDuration[4]; float g_flRewardPercentage[4]; + float g_flRockChance[4]; float g_flRunSpeed; float g_flShieldDuration; + float g_flShieldPercentage; + float g_flShieldRate; float g_flShieldResistance; + float g_flShockwaveRadiusReward[4]; float g_flShoveDamageReward[4]; float g_flShoveRateReward[4]; + float g_flSledgehammerRoundsReward[4]; float g_flSpecialInterval; float g_flSpeedBoostReward[4]; + float g_flSupplierReward[4]; + float g_flSwingRateReward[4]; float g_flTransformDelay; float g_flTransformDuration; int g_iAmmoBoostReward[4]; + int g_iAmmoRefillReward[4]; int g_iAmmoRegenReward[4]; int g_iAnnounceArrival; int g_iAnnounceDeath; int g_iAnnounceKill; int g_iArrivalMessage; int g_iArrivalSound; + int g_iAutoHop; int g_iBaseHealth[7]; int g_iBlazeHealthReward[4]; + int g_iBloodDonorReward[4]; int g_iBodyEffects; int g_iBossEffects; int g_iBossHealth[4]; @@ -1714,8 +2100,10 @@ enum struct esTeammate int g_iDeathSound; int g_iDisplayHealth; int g_iDisplayHealthType; + int g_iEternalFlamesReward[4]; int g_iExplosiveImmunity; int g_iExtraHealth[7]; + int g_iFastRecoveryReward[4]; int g_iFireImmunity; int g_iFriendlyFireReward[4]; int g_iGhostBulletsReward[4]; @@ -1727,14 +2115,11 @@ enum struct esTeammate int g_iGlowType; int g_iHealthRegenReward[4]; int g_iHittableImmunity; - int g_iHollowpointAmmoReward[4]; int g_iHumanMultiplierMode; - int g_iInextinguishableFireReward[4]; int g_iInfiniteAmmoReward[4]; int g_iIntangibleBody; int g_iKillMessage; int g_iLadderActionsReward[4]; - int g_iLadyKillerReward[4]; int g_iLaserSightReward[4]; int g_iLifeLeechReward[4]; int g_iMedicalCutsReward[4]; @@ -1744,7 +2129,9 @@ enum struct esTeammate int g_iMidairDashesReward[4]; int g_iMinimumHumans; int g_iMultiplyHealth; + int g_iOverhealthReward[4]; int g_iParticleEffectVisual[4]; + int g_iPassiveHealth; int g_iPersonalType[7]; int g_iPrefsNotify[4]; int g_iRandomSpecial; @@ -1757,14 +2144,15 @@ enum struct esTeammate int g_iRewardEnabled[4]; int g_iRewardNotify[4]; int g_iRewardVisual[4]; + int g_iRiotGearReward[4]; int g_iRockColor[4]; int g_iRockEffects; int g_iRockModel; + int g_iSafetyBubbleReward[4]; int g_iScreenColorVisual[4]; int g_iShareRewards[4]; int g_iShovePenaltyReward[4]; int g_iSkinColor[4]; - int g_iSledgehammerRoundsReward[4]; int g_iSpawnProtection; int g_iSpawnType; int g_iSpecialAmmoReward[4]; @@ -1786,6 +2174,149 @@ enum struct esTeammate esTeammate g_esTeammate[MAXPLAYERS + 1]; +enum struct esInfected +{ + bool g_bBlood; + bool g_bElectric; + bool g_bFire; + bool g_bIce; + bool g_bMeteor; + bool g_bRainbowColor; + bool g_bSmoke; + bool g_bSpit; + + int g_iDamageTaken; + int g_iDeathModelOwner; + int g_iTankType; +} + +esInfected g_esInfected[2048]; + +enum struct esShooter +{ + bool g_bDeathModel; + bool g_bInfected[MT_MAXTYPES + 1]; + bool g_bMixTypes; + bool g_bProduced; + bool g_bSurvivor; + + char g_sCarrierAttackVoicelines[1280]; + char g_sCarrierBaitVoicelines[1280]; + char g_sItemPassive[320]; + char g_sLastWeapon[32]; + char g_sSurvivorName[33]; + + float g_flActionDurationPassive; + float g_flAdrenalineTimePassive; + float g_flAttackBoostPassive; + float g_flCarrierChance; + float g_flCarrierDamageMultiplier; + float g_flCarrierDelay; + float g_flCarrierHealthMultiplier; + float g_flCarrierVoiceChance; + float g_flCarrierVoiceInterval; + float g_flDamageBoostPassive; + float g_flDamageMultiplier; + float g_flDamageResistancePassive; + float g_flDeathModelDelay; + float g_flDopamineRadiusPassive; + float g_flFireRatePassive; + float g_flGrenadeLauncherPassive; + float g_flHealPercentPassive; + float g_flHealthcareRadiusPassive; + float g_flHealthMultiplier; + float g_flHeartbeatPassive; + float g_flHollowpointAmmoPassive; + float g_flJumpHeightPassive; + float g_flLadyKillerPassive; + float g_flLuckyBulletPassive; + float g_flMotivationRadiusPassive; + float g_flOverdoseRadiusPassive; + float g_flPipeBombDurationPassive; + float g_flPunchResistancePassive; + float g_flRapidPistolPassive; + float g_flRefillPercentPassive; + float g_flReloadRatePassive; + float g_flShockwaveRadiusPassive; + float g_flShoveDamagePassive; + float g_flShoveRatePassive; + float g_flSledgehammerRoundsPassive; + float g_flSpeedBoostPassive; + float g_flSupplierPassive; + float g_flSwingRatePassive; + + Handle g_hCharacterTimer; + + int g_iAmmoBoostPassive; + int g_iAmmoRefillPassive; + int g_iAmmoRegenPassive; + int g_iBlazeHealthPassive; + int g_iBloodDonorPassive; + int g_iBunnyHopPassive; + int g_iBurstDoorsPassive; + int g_iCarrierBody; + int g_iCarrierBots; + int g_iCarrierCleanse; + int g_iCarrierEnabled; + int g_iCarrierFilter; + int g_iCarrierInfection; + int g_iCarrierMaxType; + int g_iCarrierMinType; + int g_iCarrierMix; + int g_iCarrierMode; + int g_iCarrierTeleport; + int g_iCarrierVoice; + int g_iCharacter; + int g_iCharacterType[2]; + int g_iCleanKillsPassive; + int g_iClusterBombsPassive; + int g_iDeathModel; + int g_iEternalFlamesPassive; + int g_iFastRecoveryPassive; + int g_iFirstSpecial; + int g_iFirstType; + int g_iFriendlyFirePassive; + int g_iGhostBulletsPassive; + int g_iHealthRegenPassive; + int g_iInfiniteAmmoPassive; + int g_iKillerSpecial; + int g_iKillerType; + int g_iLadderActionsPassive; + int g_iLaserSightPassive; + int g_iLastSpecial; + int g_iLastType; + int g_iLeastDamage; + int g_iLeastSpecial; + int g_iLeastType; + int g_iLifeLeechPassive; + int g_iMedicalCutsPassive; + int g_iMeleeRangePassive; + int g_iMidairDashesPassive; + int g_iMostDamage; + int g_iMostSpecial; + int g_iMostType; + int g_iNotify; + int g_iOverhealthPassive; + int g_iPassiveBots; + int g_iPassiveEnabled; + int g_iPassiveNotify; + int g_iPassiveTypes; + int g_iRecoilDampenerPassive; + int g_iRegenBurstsPassive; + int g_iRespawnLoadoutPassive; + int g_iReviveHealthPassive; + int g_iRiotGearPassive; + int g_iSafetyBubblePassive; + int g_iShovePenaltyPassive; + int g_iSpecialAmmoPassive; + int g_iStickyGrenadesPassive; + int g_iSyringeDartsPassive; + int g_iThornsPassive; + int g_iTotalPassives; +} + +esShooter g_esShooter[MAXPLAYERS + 1]; + enum struct esTank { bool g_bDuplicateType[2]; @@ -1793,6 +2324,7 @@ enum struct esTank bool g_bTypeCycled; bool g_bTypeCycled2; + char g_sArmorCharacters[4]; char g_sBodyColorVisual[64]; char g_sBodyColorVisual2[64]; char g_sBodyColorVisual3[64]; @@ -1829,15 +2361,20 @@ enum struct esTank char g_sScreenColorVisual2[64]; char g_sScreenColorVisual3[64]; char g_sScreenColorVisual4[64]; + char g_sShieldCharacters[4]; char g_sSkinColor[64]; + char g_sTankClass[65]; char g_sTankName[33]; char g_sTireColor[64]; float g_flActionDurationReward[4]; + float g_flAdrenalineTimeReward[4]; float g_flArmorDuration; - float g_flArmorResistance; + float g_flArmorPercentage; + float g_flArmorResistance[2]; float g_flAttackBoostReward[4]; float g_flAttackInterval; + float g_flBodyChance[7]; float g_flBurnDuration; float g_flBurntSkin; float g_flClawDamage; @@ -1858,14 +2395,26 @@ enum struct esTank float g_flComboTypeChance[7]; float g_flDamageBoostReward[4]; float g_flDamageResistanceReward[4]; + float g_flDopamineRadiusReward[4]; + float g_flFireRateReward[4]; + float g_flGrenadeLauncherReward[4]; float g_flHealPercentMultiplier; float g_flHealPercentReward[4]; + float g_flHealthcareRadiusReward[4]; + float g_flHeartbeatReward[4]; float g_flHittableDamage; + float g_flHollowpointAmmoReward[4]; float g_flIncapDamageMultiplier; float g_flJumpHeightReward[4]; + float g_flLadyKillerReward[4]; float g_flLoopingVoicelineInterval[4]; + float g_flLuckyBulletReward[4]; float g_flMeleeHitValue; + float g_flMotivationRadiusReward[4]; float g_flOpenAreasOnly; + float g_flOverdoseRadiusReward[4]; + float g_flPassiveDelay; + float g_flPassiveInterval; float g_flPipeBombDurationReward[4]; float g_flPropsChance[9]; float g_flPunchForce; @@ -1875,16 +2424,24 @@ enum struct esTank float g_flRandomInterval; float g_flRapidPistolReward[4]; float g_flRefillPercentReward[4]; + float g_flReloadRateReward[4]; float g_flRewardChance[4]; float g_flRewardDuration[4]; float g_flRewardPercentage[4]; + float g_flRockChance[4]; float g_flRockDamage; float g_flRunSpeed; float g_flShieldDuration; + float g_flShieldPercentage; + float g_flShieldRate; float g_flShieldResistance; + float g_flShockwaveRadiusReward[4]; float g_flShoveDamageReward[4]; float g_flShoveRateReward[4]; + float g_flSledgehammerRoundsReward[4]; float g_flSpeedBoostReward[4]; + float g_flSupplierReward[4]; + float g_flSwingRateReward[4]; float g_flTankChance; float g_flThrowForce; float g_flThrowInterval; @@ -1894,6 +2451,7 @@ enum struct esTank int g_iAbilityCount; int g_iAccessFlags; int g_iAmmoBoostReward[4]; + int g_iAmmoRefillReward[4]; int g_iAmmoRegenReward[4]; int g_iAnnounceArrival; int g_iAnnounceDeath; @@ -1901,8 +2459,10 @@ enum struct esTank int g_iArrivalMessage; int g_iArrivalSound; int g_iAutoAggravate; + int g_iAutoHop; int g_iBaseHealth; int g_iBlazeHealthReward[4]; + int g_iBloodDonorReward[4]; int g_iBodyEffects; int g_iBossBaseType; int g_iBossEffects; @@ -1926,8 +2486,10 @@ enum struct esTank int g_iDeathSound; int g_iDisplayHealth; int g_iDisplayHealthType; + int g_iEternalFlamesReward[4]; int g_iExplosiveImmunity; int g_iExtraHealth; + int g_iFastRecoveryReward[4]; int g_iFinaleTank; int g_iFireImmunity; int g_iFlameColor[4]; @@ -1945,16 +2507,13 @@ enum struct esTank int g_iGroundPound; int g_iHealthRegenReward[4]; int g_iHittableImmunity; - int g_iHollowpointAmmoReward[4]; int g_iHumanMultiplierMode; int g_iHumanSupport; int g_iImmunityFlags; - int g_iInextinguishableFireReward[4]; int g_iInfiniteAmmoReward[4]; int g_iIntangibleBody; int g_iKillMessage; int g_iLadderActionsReward[4]; - int g_iLadyKillerReward[4]; int g_iLaserSightReward[4]; int g_iLifeLeechReward[4]; int g_iLightColor[4]; @@ -1967,8 +2526,10 @@ enum struct esTank int g_iMidairDashesReward[4]; int g_iMinimumHumans; int g_iMultiplyHealth; + int g_iOverhealthReward[4]; int g_iOzTankColor[4]; int g_iParticleEffectVisual[4]; + int g_iPassiveHealth; int g_iPrefsNotify[4]; int g_iPrioritizeThrows; int g_iPropsAttached; @@ -1986,16 +2547,17 @@ enum struct esTank int g_iRewardEnabled[4]; int g_iRewardNotify[4]; int g_iRewardVisual[4]; + int g_iRiotGearReward[4]; int g_iRockColor[4]; int g_iRockEffects; int g_iRockModel; int g_iRockSound; + int g_iSafetyBubbleReward[4]; int g_iShareRewards[4]; int g_iShovePenaltyReward[4]; int g_iSkinColor[4]; int g_iSkipIncap; int g_iSkipTaunt; - int g_iSledgehammerRoundsReward[4]; int g_iSpawnEnabled; int g_iSpawnProtection; int g_iSpawnType; @@ -2028,11 +2590,14 @@ enum struct esSpecial bool g_bTypeCycled[7]; bool g_bTypeCycled2[7]; + char g_sArmorCharacters[4]; char g_sBodyColorVisual[64]; char g_sBodyColorVisual2[64]; char g_sBodyColorVisual3[64]; char g_sBodyColorVisual4[64]; + char g_sBoomerClass[65]; char g_sBoomerName[33]; + char g_sChargerClass[65]; char g_sChargerName[33]; char g_sComboSet[320]; char g_sFallVoicelineReward[64]; @@ -2041,11 +2606,13 @@ enum struct esSpecial char g_sFallVoicelineReward4[64]; char g_sGlowColor[64]; char g_sHealthCharacters[4]; + char g_sHunterClass[65]; char g_sHunterName[33]; char g_sItemReward[320]; char g_sItemReward2[320]; char g_sItemReward3[320]; char g_sItemReward4[320]; + char g_sJockeyClass[65]; char g_sJockeyName[33]; char g_sLightColorVisual[64]; char g_sLightColorVisual2[64]; @@ -2064,15 +2631,21 @@ enum struct esSpecial char g_sScreenColorVisual2[64]; char g_sScreenColorVisual3[64]; char g_sScreenColorVisual4[64]; + char g_sShieldCharacters[4]; char g_sSkinColor[64]; + char g_sSmokerClass[65]; char g_sSmokerName[33]; + char g_sSpitterClass[65]; char g_sSpitterName[33]; float g_flActionDurationReward[4]; + float g_flAdrenalineTimeReward[4]; float g_flArmorDuration; - float g_flArmorResistance; + float g_flArmorPercentage; + float g_flArmorResistance[2]; float g_flAttackBoostReward[4]; float g_flAttackInterval; + float g_flBodyChance[7]; float g_flBurnDuration; float g_flBurntSkin; float g_flClawDamage; @@ -2093,14 +2666,26 @@ enum struct esSpecial float g_flComboTypeChance[7]; float g_flDamageBoostReward[4]; float g_flDamageResistanceReward[4]; + float g_flDopamineRadiusReward[4]; + float g_flFireRateReward[4]; + float g_flGrenadeLauncherReward[4]; float g_flHealPercentMultiplier; float g_flHealPercentReward[4]; + float g_flHealthcareRadiusReward[4]; + float g_flHeartbeatReward[4]; float g_flHittableDamage; + float g_flHollowpointAmmoReward[4]; float g_flIncapDamageMultiplier; float g_flJumpHeightReward[4]; + float g_flLadyKillerReward[4]; float g_flLoopingVoicelineInterval[4]; + float g_flLuckyBulletReward[4]; float g_flMeleeHitValue; + float g_flMotivationRadiusReward[4]; float g_flOpenAreasOnly; + float g_flOverdoseRadiusReward[4]; + float g_flPassiveDelay; + float g_flPassiveInterval; float g_flPinDamage; float g_flPipeBombDurationReward[4]; float g_flPunchResistanceReward[4]; @@ -2108,29 +2693,40 @@ enum struct esSpecial float g_flRandomInterval; float g_flRapidPistolReward[4]; float g_flRefillPercentReward[4]; + float g_flReloadRateReward[4]; float g_flRewardChance[4]; float g_flRewardDuration[4]; float g_flRewardPercentage[4]; + float g_flRockChance[4]; float g_flRunSpeed; float g_flShieldDuration; + float g_flShieldPercentage; + float g_flShieldRate; float g_flShieldResistance; + float g_flShockwaveRadiusReward[4]; float g_flShoveDamageReward[4]; float g_flShoveRateReward[4]; + float g_flSledgehammerRoundsReward[4]; float g_flSpecialChance; float g_flSpecialInterval; float g_flSpeedBoostReward[4]; + float g_flSupplierReward[4]; + float g_flSwingRateReward[4]; float g_flTransformDelay; float g_flTransformDuration; int g_iAmmoBoostReward[4]; + int g_iAmmoRefillReward[4]; int g_iAmmoRegenReward[4]; int g_iAnnounceArrival; int g_iAnnounceDeath; int g_iAnnounceKill; int g_iArrivalMessage; int g_iArrivalSound; + int g_iAutoHop; int g_iBaseHealth[7]; int g_iBlazeHealthReward[4]; + int g_iBloodDonorReward[4]; int g_iBodyEffects; int g_iBossBaseType; int g_iBossEffects; @@ -2152,8 +2748,10 @@ enum struct esSpecial int g_iDeathSound; int g_iDisplayHealth; int g_iDisplayHealthType; + int g_iEternalFlamesReward[4]; int g_iExplosiveImmunity; int g_iExtraHealth[7]; + int g_iFastRecoveryReward[4]; int g_iFinaleSpecial; int g_iFireImmunity; int g_iFriendlyFireReward[4]; @@ -2167,15 +2765,12 @@ enum struct esSpecial int g_iGlowType; int g_iHealthRegenReward[4]; int g_iHittableImmunity; - int g_iHollowpointAmmoReward[4]; int g_iHumanMultiplierMode; int g_iHumanSupport; - int g_iInextinguishableFireReward[4]; int g_iInfiniteAmmoReward[4]; int g_iIntangibleBody; int g_iKillMessage; int g_iLadderActionsReward[4]; - int g_iLadyKillerReward[4]; int g_iLaserSightReward[4]; int g_iLifeLeechReward[4]; int g_iMedicalCutsReward[4]; @@ -2186,7 +2781,9 @@ enum struct esSpecial int g_iMidairDashesReward[4]; int g_iMinimumHumans; int g_iMultiplyHealth; + int g_iOverhealthReward[4]; int g_iParticleEffectVisual[4]; + int g_iPassiveHealth; int g_iPrefsNotify[4]; int g_iRandomSpecial; int g_iRecoilDampenerReward[4]; @@ -2199,13 +2796,14 @@ enum struct esSpecial int g_iRewardEnabled[4]; int g_iRewardNotify[4]; int g_iRewardVisual[4]; + int g_iRiotGearReward[4]; int g_iRockColor[4]; int g_iRockEffects; int g_iRockModel; + int g_iSafetyBubbleReward[4]; int g_iShareRewards[4]; int g_iShovePenaltyReward[4]; int g_iSkinColor[4]; - int g_iSledgehammerRoundsReward[4]; int g_iSpawnEnabled; int g_iSpawnProtection; int g_iSpawnType; @@ -2230,8 +2828,219 @@ enum struct esSpecial esSpecial g_esSpecial[MT_MAXTYPES + 1]; -enum struct esCache +enum struct esHorde +{ + char g_sCommonName[33]; + char g_sGlowColor[64]; + char g_sHealthCharacters[4]; + char g_sSkinColor[64]; + char g_sWitchName[33]; + + float g_flBodyChance[7]; + float g_flCommonBioChance; + float g_flCommonChance; + float g_flCommonDamagePoints; + float g_flCommonDeathPoints; + float g_flCommonGoal; + float g_flWitchChance; + float g_flWitchMutateChance; + float g_flWitchRange; + + int g_iBodyEffects; + int g_iCommonVariant; + int g_iDisplayHealth; + int g_iDisplayHealthType; + int g_iGlowColor[3]; + int g_iGlowEnabled; + int g_iGlowFlashing; + int g_iGlowMaxRange; + int g_iGlowMinRange; + int g_iGlowType; + int g_iMobVariants; + int g_iSkinColor[4]; + int g_iWitchFilter; + int g_iWitchMode; + int g_iWitchTypes; +} + +esHorde g_esHorde[MT_MAXTYPES + 1]; + +enum struct esSurvivor +{ + char g_sCarrierAttackVoicelines[1280]; + char g_sCarrierBaitVoicelines[1280]; + char g_sItemPassive[320]; + + float g_flActionDurationPassive; + float g_flAdrenalineTimePassive; + float g_flAttackBoostPassive; + float g_flCarrierChance; + float g_flCarrierDamageMultiplier; + float g_flCarrierDelay; + float g_flCarrierHealthMultiplier; + float g_flCarrierVoiceChance; + float g_flCarrierVoiceInterval; + float g_flDamageBoostPassive; + float g_flDamageResistancePassive; + float g_flDopamineRadiusPassive; + float g_flFireRatePassive; + float g_flGrenadeLauncherPassive; + float g_flHealPercentPassive; + float g_flHealthcareRadiusPassive; + float g_flHeartbeatPassive; + float g_flHollowpointAmmoPassive; + float g_flJumpHeightPassive; + float g_flLadyKillerPassive; + float g_flLuckyBulletPassive; + float g_flMotivationRadiusPassive; + float g_flOverdoseRadiusPassive; + float g_flPipeBombDurationPassive; + float g_flPunchResistancePassive; + float g_flRapidPistolPassive; + float g_flRefillPercentPassive; + float g_flReloadRatePassive; + float g_flShockwaveRadiusPassive; + float g_flShoveDamagePassive; + float g_flShoveRatePassive; + float g_flSledgehammerRoundsPassive; + float g_flSpeedBoostPassive; + float g_flSupplierPassive; + float g_flSwingRatePassive; + + int g_iAmmoBoostPassive; + int g_iAmmoRefillPassive; + int g_iAmmoRegenPassive; + int g_iBlazeHealthPassive; + int g_iBloodDonorPassive; + int g_iBunnyHopPassive; + int g_iBurstDoorsPassive; + int g_iCarrierBody; + int g_iCarrierBots; + int g_iCarrierCleanse; + int g_iCarrierEnabled; + int g_iCarrierFilter; + int g_iCarrierInfection; + int g_iCarrierMaxType; + int g_iCarrierMinType; + int g_iCarrierMix; + int g_iCarrierMode; + int g_iCarrierTeleport; + int g_iCarrierVoice; + int g_iCleanKillsPassive; + int g_iClusterBombsPassive; + int g_iEternalFlamesPassive; + int g_iFastRecoveryPassive; + int g_iFriendlyFirePassive; + int g_iGhostBulletsPassive; + int g_iHealthRegenPassive; + int g_iInfiniteAmmoPassive; + int g_iLadderActionsPassive; + int g_iLaserSightPassive; + int g_iLifeLeechPassive; + int g_iMedicalCutsPassive; + int g_iMeleeRangePassive; + int g_iMidairDashesPassive; + int g_iOverhealthPassive; + int g_iPassiveBots; + int g_iPassiveEnabled; + int g_iPassiveNotify; + int g_iRecoilDampenerPassive; + int g_iRegenBurstsPassive; + int g_iRespawnLoadoutPassive; + int g_iReviveHealthPassive; + int g_iRiotGearPassive; + int g_iSafetyBubblePassive; + int g_iShovePenaltyPassive; + int g_iSpecialAmmoPassive; + int g_iStickyGrenadesPassive; + int g_iSyringeDartsPassive; + int g_iThornsPassive; +} + +esSurvivor g_esSurvivor[MT_MAXSURVIVORS + 1]; +#if defined _WeaponHandling_included +enum struct esWeapon +{ + char g_sItemPassive[320]; + char g_sWeaponName[320]; + + float g_flActionDurationPassive; + float g_flAdrenalineTimePassive; + float g_flAttackBoostPassive; + float g_flDamageBoostPassive; + float g_flDamageResistancePassive; + float g_flDopamineRadiusPassive; + float g_flFireRatePassive; + float g_flGrenadeLauncherPassive; + float g_flHealPercentPassive; + float g_flHealthcareRadiusPassive; + float g_flHeartbeatPassive; + float g_flHollowpointAmmoPassive; + float g_flJumpHeightPassive; + float g_flLadyKillerPassive; + float g_flLuckyBulletPassive; + float g_flMotivationRadiusPassive; + float g_flOverdoseRadiusPassive; + float g_flPipeBombDurationPassive; + float g_flPunchResistancePassive; + float g_flRapidPistolPassive; + float g_flRefillPercentPassive; + float g_flReloadRatePassive; + float g_flShockwaveRadiusPassive; + float g_flShoveDamagePassive; + float g_flShoveRatePassive; + float g_flSledgehammerRoundsPassive; + float g_flSpeedBoostPassive; + float g_flSupplierPassive; + float g_flSwingRatePassive; + + int g_iAmmoBoostPassive; + int g_iAmmoRefillPassive; + int g_iAmmoRegenPassive; + int g_iBlazeHealthPassive; + int g_iBloodDonorPassive; + int g_iBunnyHopPassive; + int g_iBurstDoorsPassive; + int g_iCleanKillsPassive; + int g_iClusterBombsPassive; + int g_iEternalFlamesPassive; + int g_iFastRecoveryPassive; + int g_iFriendlyFirePassive; + int g_iGhostBulletsPassive; + int g_iHealthRegenPassive; + int g_iInfiniteAmmoPassive; + int g_iLadderActionsPassive; + int g_iLaserSightPassive; + int g_iLifeLeechPassive; + int g_iMedicalCutsPassive; + int g_iMeleeRangePassive; + int g_iMidairDashesPassive; + int g_iOverhealthPassive; + int g_iPassiveBots; + int g_iPassiveEnabled; + int g_iPassiveNotify; + int g_iPassiveTypes; + int g_iRecoilDampenerPassive; + int g_iRegenBurstsPassive; + int g_iRespawnLoadoutPassive; + int g_iReviveHealthPassive; + int g_iRiotGearPassive; + int g_iSafetyBubblePassive; + int g_iShovePenaltyPassive; + int g_iSpecialAmmoPassive; + int g_iStackPassives; + int g_iStickyGrenadesPassive; + int g_iSyringeDartsPassive; + int g_iThornsPassive; + int g_iWeaponCharacter; + int g_iWeaponIndex; +} + +esWeapon g_esWeapon[MT_MAXTYPES + 1]; +#endif +enum struct esTankCache { + char g_sArmorCharacters[4]; char g_sBodyColorVisual[64]; char g_sBodyColorVisual2[64]; char g_sBodyColorVisual3[64]; @@ -2272,6 +3081,7 @@ enum struct esCache char g_sScreenColorVisual2[64]; char g_sScreenColorVisual3[64]; char g_sScreenColorVisual4[64]; + char g_sShieldCharacters[4]; char g_sSkinColor[64]; char g_sSmokerName[33]; char g_sSpitterName[33]; @@ -2279,10 +3089,13 @@ enum struct esCache char g_sTireColor[64]; float g_flActionDurationReward[4]; + float g_flAdrenalineTimeReward[4]; float g_flArmorDuration; - float g_flArmorResistance; + float g_flArmorPercentage; + float g_flArmorResistance[2]; float g_flAttackBoostReward[4]; float g_flAttackInterval; + float g_flBodyChance[7]; float g_flBurnDuration; float g_flBurntSkin; float g_flClawDamage; @@ -2302,13 +3115,25 @@ enum struct esCache float g_flComboTypeChance[7]; float g_flDamageBoostReward[4]; float g_flDamageResistanceReward[4]; + float g_flDopamineRadiusReward[4]; + float g_flFireRateReward[4]; + float g_flGrenadeLauncherReward[4]; float g_flHealPercentMultiplier; float g_flHealPercentReward[4]; + float g_flHealthcareRadiusReward[4]; + float g_flHeartbeatReward[4]; float g_flHittableDamage; + float g_flHollowpointAmmoReward[4]; float g_flIncapDamageMultiplier; float g_flJumpHeightReward[4]; + float g_flLadyKillerReward[4]; float g_flLoopingVoicelineInterval[4]; + float g_flLuckyBulletReward[4]; float g_flMeleeHitValue; + float g_flMotivationRadiusReward[4]; + float g_flOverdoseRadiusReward[4]; + float g_flPassiveDelay; + float g_flPassiveInterval; float g_flPinDamage; float g_flPipeBombDurationReward[4]; float g_flPropsChance[9]; @@ -2319,23 +3144,32 @@ enum struct esCache float g_flRandomInterval; float g_flRapidPistolReward[4]; float g_flRefillPercentReward[4]; + float g_flReloadRateReward[4]; float g_flRewardChance[4]; float g_flRewardDuration[4]; float g_flRewardPercentage[4]; + float g_flRockChance[4]; float g_flRockDamage; float g_flRunSpeed; float g_flShieldDuration; + float g_flShieldPercentage; + float g_flShieldRate; float g_flShieldResistance; + float g_flShockwaveRadiusReward[4]; float g_flShoveDamageReward[4]; float g_flShoveRateReward[4]; + float g_flSledgehammerRoundsReward[4]; float g_flSpeedBoostReward[4]; float g_flSpecialInterval; + float g_flSupplierReward[4]; + float g_flSwingRateReward[4]; float g_flThrowForce; float g_flThrowInterval; float g_flTransformDelay; float g_flTransformDuration; int g_iAmmoBoostReward[4]; + int g_iAmmoRefillReward[4]; int g_iAmmoRegenReward[4]; int g_iAnnounceArrival; int g_iAnnounceDeath; @@ -2343,8 +3177,10 @@ enum struct esCache int g_iArrivalMessage; int g_iArrivalSound; int g_iAutoAggravate; + int g_iAutoHop; int g_iBaseHealth; int g_iBlazeHealthReward[4]; + int g_iBloodDonorReward[4]; int g_iBodyEffects; int g_iBossEffects; int g_iBossHealth[4]; @@ -2366,8 +3202,10 @@ enum struct esCache int g_iDeathSound; int g_iDisplayHealth; int g_iDisplayHealthType; + int g_iEternalFlamesReward[4]; int g_iExplosiveImmunity; int g_iExtraHealth; + int g_iFastRecoveryReward[4]; int g_iFireImmunity; int g_iFlameColor[4]; int g_iFlashlightColor[4]; @@ -2383,14 +3221,11 @@ enum struct esCache int g_iGroundPound; int g_iHealthRegenReward[4]; int g_iHittableImmunity; - int g_iHollowpointAmmoReward[4]; int g_iHumanMultiplierMode; - int g_iInextinguishableFireReward[4]; int g_iInfiniteAmmoReward[4]; int g_iIntangibleBody; int g_iKillMessage; int g_iLadderActionsReward[4]; - int g_iLadyKillerReward[4]; int g_iLaserSightReward[4]; int g_iLifeLeechReward[4]; int g_iLightColor[4]; @@ -2402,8 +3237,10 @@ enum struct esCache int g_iMidairDashesReward[4]; int g_iMinimumHumans; int g_iMultiplyHealth; + int g_iOverhealthReward[4]; int g_iOzTankColor[4]; int g_iParticleEffectVisual[4]; + int g_iPassiveHealth; int g_iPrefsNotify[4]; int g_iPrioritizeThrows; int g_iPropsAttached; @@ -2419,16 +3256,17 @@ enum struct esCache int g_iRewardEnabled[4]; int g_iRewardNotify[4]; int g_iRewardVisual[4]; + int g_iRiotGearReward[4]; int g_iRockColor[4]; int g_iRockEffects; int g_iRockModel; int g_iRockSound; + int g_iSafetyBubbleReward[4]; int g_iShareRewards[4]; int g_iShovePenaltyReward[4]; int g_iSkinColor[4]; int g_iSkipIncap; int g_iSkipTaunt; - int g_iSledgehammerRoundsReward[4]; int g_iSpawnEnabled; int g_iSpawnProtection; int g_iSpawnType; @@ -2456,7 +3294,131 @@ enum struct esCache int g_iVomitImmunity; } -esCache g_esCache[MAXPLAYERS + 1]; +esTankCache g_esTankCache[MAXPLAYERS + 1]; + +enum struct esInfectedCache +{ + char g_sGlowColor[64]; + char g_sHealthCharacters[4]; + char g_sSkinColor[64]; + + float g_flBodyChance[7]; + float g_flCommonDamagePoints; + float g_flCommonDeathPoints; + float g_flWitchMutateChance; + float g_flWitchRange; + + int g_iBodyEffects; + int g_iDisplayHealth; + int g_iDisplayHealthType; + int g_iGlowColor[3]; + int g_iGlowEnabled; + int g_iGlowFlashing; + int g_iGlowMaxRange; + int g_iGlowMinRange; + int g_iGlowType; + int g_iMobVariants; + int g_iSkinColor[4]; + int g_iWitchFilter; + int g_iWitchMode; + int g_iWitchTypes; +} + +esInfectedCache g_esInfectedCache[2048]; + +enum struct esSurvivorCache +{ + char g_sCarrierAttackVoicelines[1280]; + char g_sCarrierBaitVoicelines[1280]; + char g_sItemPassive[320]; + + float g_flActionDurationPassive; + float g_flAdrenalineTimePassive; + float g_flAttackBoostPassive; + float g_flCarrierChance; + float g_flCarrierDamageMultiplier; + float g_flCarrierDelay; + float g_flCarrierHealthMultiplier; + float g_flCarrierVoiceChance; + float g_flCarrierVoiceInterval; + float g_flDamageBoostPassive; + float g_flDamageResistancePassive; + float g_flDopamineRadiusPassive; + float g_flFireRatePassive; + float g_flGrenadeLauncherPassive; + float g_flHealPercentPassive; + float g_flHealthcareRadiusPassive; + float g_flHeartbeatPassive; + float g_flHollowpointAmmoPassive; + float g_flJumpHeightPassive; + float g_flLadyKillerPassive; + float g_flLuckyBulletPassive; + float g_flMotivationRadiusPassive; + float g_flOverdoseRadiusPassive; + float g_flPipeBombDurationPassive; + float g_flPunchResistancePassive; + float g_flRapidPistolPassive; + float g_flRefillPercentPassive; + float g_flReloadRatePassive; + float g_flShockwaveRadiusPassive; + float g_flShoveDamagePassive; + float g_flShoveRatePassive; + float g_flSledgehammerRoundsPassive; + float g_flSpeedBoostPassive; + float g_flSupplierPassive; + float g_flSwingRatePassive; + + int g_iAmmoBoostPassive; + int g_iAmmoRefillPassive; + int g_iAmmoRegenPassive; + int g_iBlazeHealthPassive; + int g_iBloodDonorPassive; + int g_iBunnyHopPassive; + int g_iBurstDoorsPassive; + int g_iCarrierBody; + int g_iCarrierBots; + int g_iCarrierCleanse; + int g_iCarrierEnabled; + int g_iCarrierFilter; + int g_iCarrierInfection; + int g_iCarrierMaxType; + int g_iCarrierMinType; + int g_iCarrierMix; + int g_iCarrierMode; + int g_iCarrierTeleport; + int g_iCarrierVoice; + int g_iCleanKillsPassive; + int g_iClusterBombsPassive; + int g_iEternalFlamesPassive; + int g_iFastRecoveryPassive; + int g_iFriendlyFirePassive; + int g_iGhostBulletsPassive; + int g_iHealthRegenPassive; + int g_iInfiniteAmmoPassive; + int g_iLadderActionsPassive; + int g_iLaserSightPassive; + int g_iLifeLeechPassive; + int g_iMedicalCutsPassive; + int g_iMeleeRangePassive; + int g_iMidairDashesPassive; + int g_iOverhealthPassive; + int g_iPassiveBots; + int g_iPassiveEnabled; + int g_iPassiveNotify; + int g_iRecoilDampenerPassive; + int g_iRegenBurstsPassive; + int g_iRespawnLoadoutPassive; + int g_iReviveHealthPassive; + int g_iRiotGearPassive; + int g_iSafetyBubblePassive; + int g_iShovePenaltyPassive; + int g_iSpecialAmmoPassive; + int g_iStickyGrenadesPassive; + int g_iSyringeDartsPassive; + int g_iThornsPassive; +} + +esSurvivorCache g_esSurvivorCache[MAXPLAYERS + 1]; enum struct esDetour { @@ -2519,7 +3481,11 @@ enum struct esSignature esSignature g_esSignature[MT_SIGNATURE_LIMIT]; -char g_sSpecialNames[][] = +char g_sMobNames[][] = +{ + "Witch", + "Common" +}, g_sSpecialNames[][] = { "Special", "Smoker", @@ -2528,6 +3494,25 @@ char g_sSpecialNames[][] = "Spitter", "Jockey", "Charger" +}, g_sSurvivorNames[][] = +{ + "Nick", + "Rochelle", + "Coach", + "Ellis", + "Bill", + "Zoey", + "Francis", + "Louis" +}, g_sUncommonModels[][] = +{ + "models/infected/common_male_ceda.mdl", + "models/infected/common_male_clown.mdl", + "models/infected/common_male_fallen_survivor.mdl", + "models/infected/common_male_jimmy.mdl", + "models/infected/common_male_mud.mdl", + "models/infected/common_male_riot.mdl", + "models/infected/common_male_roadcrew.mdl" }; int g_iBossBeamSprite = -1, g_iBossHaloSprite = -1; @@ -2581,6 +3566,8 @@ public void OnAllPluginsLoaded() public void OnPluginStart() { g_esGeneral.g_smCvars = new StringMap(); + g_esGeneral.g_alElevators = new ArrayList(); + g_esMob.g_flBioMassMeter = 0.0; char sDate[32]; FormatTime(sDate, sizeof sDate, "%Y-%m-%d", GetTime()); @@ -2641,17 +3628,23 @@ public void OnMapStart() g_iBossBeamSprite = PrecacheModel(SPRITE_LASERBEAM, true); g_iBossHaloSprite = PrecacheModel(SPRITE_GLOW, true); + for (int iPos = 0; iPos < (sizeof g_sUncommonModels); iPos++) + { + PrecacheModel(g_sUncommonModels[iPos], true); + } + PrecacheModel(MODEL_CONCRETE_CHUNK, true); PrecacheModel(MODEL_GASCAN, true); PrecacheModel(MODEL_OXYGENTANK, true); PrecacheModel(MODEL_PROPANETANK, true); + PrecacheModel(MODEL_SHIELD, true); + PrecacheModel(MODEL_TIRES, true); + PrecacheModel(MODEL_TREE_TRUNK, true); PrecacheModel(MODEL_TANK_MAIN, true); PrecacheModel(MODEL_TANK_DLC, true); PrecacheModel(MODEL_SMOKER_MAIN, true); PrecacheModel(MODEL_BOOMER_MAIN, true); PrecacheModel(MODEL_HUNTER_MAIN, true); - PrecacheModel(MODEL_TIRES, true); - PrecacheModel(MODEL_TREE_TRUNK, true); PrecacheModel(MODEL_WITCH, true); PrecacheModel(SPRITE_EXPLODE, true); PrecacheModel(SPRITE_LASER, true); @@ -2678,13 +3671,14 @@ public void OnMapStart() PrecacheModel(MODEL_WITCHBRIDE, true); PrecacheSound(SOUND_EXPLOSION2, true); + PrecacheSound(SOUND_EXPLOSION3, true); PrecacheSound(SOUND_SPIT, true); iPrecacheParticle(PARTICLE_GORE); iPrecacheParticle(PARTICLE_SPIT); iPrecacheParticle(PARTICLE_SPIT2); } - case false: PrecacheSound(SOUND_EXPLOSION1, true); + case false: PrecacheSound(SOUND_EXPLOSION, true); } PrecacheSound(SOUND_ACHIEVEMENT, true); @@ -2692,6 +3686,7 @@ public void OnMapStart() PrecacheSound(SOUND_DAMAGE2, true); PrecacheSound(SOUND_DEATH, true); PrecacheSound(SOUND_ELECTRICITY, true); + PrecacheSound(SOUND_EMPTY, true); PrecacheSound(SOUND_HEARTBEAT, true); PrecacheSound(SOUND_METAL, true); PrecacheSound(SOUND_NULL, true); @@ -2699,7 +3694,6 @@ public void OnMapStart() PrecacheSound(SOUND_THROWN, true); vResetPlugin(); - vResetLadyKiller(false); vToggleLogging(1); AddNormalSoundHook(BlockSoundHook); @@ -2723,7 +3717,8 @@ public void OnClientPutInServer(int client) g_esGeneral.g_dhWeaponShootPositionHook.HookEntity(Hook_Post, client, mreWeaponShootPositionPost); vResetTank2(client); - vCacheSettings(client); + vCacheTankSettings(client); + vCacheSurvivorSettings(client); vResetCore(client); vRemoveLaserSight(client); } @@ -2796,9 +3791,10 @@ public void OnConfigsExecuted() vResetTimers(); vToggleTankRushConVars(); + CreateTimer(1.0, tTimerPunishSurvivors, .flags = TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); CreateTimer(0.1, tTimerRefreshRewards, .flags = TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); - CreateTimer(g_esGeneral.g_flConfigDelay, tTimerReloadConfigs, .flags = TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); CreateTimer(1.0, tTimerRegenerateAmmoHealth, .flags = TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); + CreateTimer(g_esGeneral.g_flConfigDelay, tTimerReloadConfigs, .flags = TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); CreateTimer(1.0, tTimerTankRushUpdate, .flags = TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); if (g_esGeneral.g_cvMTSurvivorUpgrades != null) @@ -2809,6 +3805,7 @@ public void OnConfigsExecuted() public void OnMapEnd() { + vResetElevatorsList(); vResetPlugin(); vToggleLogging(0); @@ -2819,6 +3816,7 @@ public void OnPluginEnd() { vRemoveCommandListeners(); vMultiTargetFilters(false); + vClearElevatorsList(); vClearSectionList(); vRemovePermanentPatches(); vTogglePlugin(false); @@ -2848,6 +3846,8 @@ public void OnEntityCreated(int entity, const char[] classname) if (g_esGeneral.g_bPluginEnabled && bIsValidEntity(entity)) { g_esGeneral.g_bWitchKilled[entity] = false; + g_esGeneral.g_iOwnerID[entity] = 0; + g_esGeneral.g_iOwnerID2[entity] = 0; g_esGeneral.g_iTeamID[entity] = 0; g_esGeneral.g_iTeamID2[entity] = 0; @@ -2887,26 +3887,42 @@ public void OnEntityDestroyed(int entity) GetEntityClassname(entity, sClassname, sizeof sClassname); if (StrEqual(sClassname, "infected") || StrEqual(sClassname, "witch")) { - SDKUnhook(entity, SDKHook_OnTakeDamage, OnInfectedTakeDamage); - SDKUnhook(entity, SDKHook_OnTakeDamage, OnPlayerTakeDamage); - SDKUnhook(entity, SDKHook_OnTakeDamagePost, OnPlayerTakeDamagePost); + vResetInfected(entity); + } + else if (StrEqual(sClassname, "grenade_launcher_projectile")) + { + int iOwner = g_esGeneral.g_iOwnerID[entity]; + if (iOwner > 0 && g_esPlayer[iOwner].g_bLadyKiller) + { + g_esPlayer[iOwner].g_bLadyKiller = false; + } + } + else if (StrEqual(sClassname, "survivor_death_model")) + { + int iOwner = GetClientOfUserId(g_esInfected[entity].g_iDeathModelOwner); + if (bIsValidClient(iOwner, MT_CHECK_INDEX)) + { + g_esShooter[iOwner].g_iDeathModel = INVALID_ENT_REFERENCE; + } + + g_esInfected[entity].g_iDeathModelOwner = 0; } } } public void OnGameFrame() { - if (!g_esGeneral.g_bPluginEnabled) + if (!g_esGeneral.g_bPluginEnabled || g_esGeneral.g_bFinaleEnded || g_esGeneral.g_bRoundEnded) { return; } #if defined _actions_included bool bDeveloper = false, bSpectator = false; #endif - bool bHuman = false; - char sHealthBar[51], sHumanTag[128], sSet[2][2], sTankName[64]; - float flPercentage = 0.0; - int iTarget = 0, iHealth = 0, iMaxHealth = 0, iTotalHealth = 0; + bool bHuman = false, bWitch = false; + char sFinalName[64], sHealthBar[51], sHumanTag[128], sName[33], sSet[2][2], sSet2[2][2], sSet3[2][2], sTankName[64], sTypeName[10]; + float flArmorPercentage = 0.0, flHealthPercentage = 0.0, flHealthPercentage2 = 0.0, flShieldPercentage = 0.0; + int iCount = 0, iTarget = 0, iHealth = 0, iMaxHealth = 0, iTotalHealth = 0, iType = 0; for (int iPlayer = 1; iPlayer <= MaxClients; iPlayer++) { #if defined _actions_included @@ -2917,7 +3933,7 @@ public void OnGameFrame() if (bIsValidClient(iPlayer, MT_CHECK_INGAME|MT_CHECK_FAKECLIENT)) #endif { - iTarget = GetClientAimTarget(iPlayer); + iTarget = GetClientAimTarget(iPlayer, false); if (bIsInfected(iTarget)) { #if defined _actions_included @@ -2935,59 +3951,204 @@ public void OnGameFrame() iHealth = bIsPlayerIncapacitated(iTarget) ? 0 : GetEntProp(iTarget, Prop_Data, "m_iHealth"); iMaxHealth = GetEntProp(iTarget, Prop_Data, "m_iMaxHealth"); iTotalHealth = (iHealth > iMaxHealth) ? iHealth : iMaxHealth; - flPercentage = ((float(iHealth) / float(iTotalHealth)) * 100.0); + flArmorPercentage = ((1.0 - g_esTankCache[iTarget].g_flArmorPercentage) * ((sizeof sHealthBar) - 1)); + flHealthPercentage = ((float(iHealth) / float(iTotalHealth)) * 100.0); + flHealthPercentage2 = ((float(iHealth) / float(iTotalHealth)) * ((sizeof sHealthBar) - 1)); + flShieldPercentage = ((1.0 - g_esTankCache[iTarget].g_flArmorPercentage - g_esTankCache[iTarget].g_flShieldPercentage) * ((sizeof sHealthBar) - 1)); - ReplaceString(g_esCache[iTarget].g_sHealthCharacters, sizeof esCache::g_sHealthCharacters, " ", ""); - ExplodeString(g_esCache[iTarget].g_sHealthCharacters, ",", sSet, sizeof sSet, sizeof sSet[]); + ReplaceString(g_esTankCache[iTarget].g_sArmorCharacters, sizeof esTankCache::g_sArmorCharacters, " ", ""); + ExplodeString(g_esTankCache[iTarget].g_sArmorCharacters, ",", sSet, sizeof sSet, sizeof sSet[]); + ReplaceString(g_esTankCache[iTarget].g_sShieldCharacters, sizeof esTankCache::g_sShieldCharacters, " ", ""); + ExplodeString(g_esTankCache[iTarget].g_sShieldCharacters, ",", sSet2, sizeof sSet2, sizeof sSet2[]); + ReplaceString(g_esTankCache[iTarget].g_sHealthCharacters, sizeof esTankCache::g_sHealthCharacters, " ", ""); + ExplodeString(g_esTankCache[iTarget].g_sHealthCharacters, ",", sSet3, sizeof sSet3, sizeof sSet3[]); - for (int iCount = 0; iCount < (float(iHealth) / float(iTotalHealth)) * ((sizeof sHealthBar) - 1) && iCount < ((sizeof sHealthBar) - 1); iCount++) + for (iCount = 0; iCount < flHealthPercentage2 && iCount < ((sizeof sHealthBar) - 1); iCount++) { - StrCat(sHealthBar, sizeof sHealthBar, sSet[0]); + switch (g_esTankCache[iTarget].g_flArmorPercentage > 0.0 && flArmorPercentage <= iCount < flHealthPercentage2) + { + case true: StrCat(sHealthBar, sizeof sHealthBar, sSet[0]); + case false: + { + switch (g_esTankCache[iTarget].g_flShieldPercentage > 0.0 && flShieldPercentage <= iCount < flHealthPercentage2) + { + case true: StrCat(sHealthBar, sizeof sHealthBar, sSet2[0]); + case false: StrCat(sHealthBar, sizeof sHealthBar, sSet3[0]); + } + } + } } - for (int iCount = 0; iCount < ((sizeof sHealthBar) - 1); iCount++) + for (; iCount < ((sizeof sHealthBar) - 1); iCount++) { - StrCat(sHealthBar, sizeof sHealthBar, sSet[1]); + switch (g_esTankCache[iTarget].g_flArmorPercentage > 0.0 && flArmorPercentage <= iCount) + { + case true: StrCat(sHealthBar, sizeof sHealthBar, sSet[1]); + case false: + { + switch (g_esTankCache[iTarget].g_flShieldPercentage > 0.0 && flShieldPercentage <= iCount) + { + case true: StrCat(sHealthBar, sizeof sHealthBar, sSet2[1]); + case false: StrCat(sHealthBar, sizeof sHealthBar, sSet3[1]); + } + } + } } bHuman = bIsValidClient(iTarget, MT_CHECK_FAKECLIENT); FormatEx(sHumanTag, sizeof sHumanTag, "%T", "HumanTag", iPlayer); - vGetTranslatedName(sTankName, sizeof sTankName, iTarget); - switch (g_esCache[iTarget].g_iDisplayHealthType) + switch (g_esShooter[iTarget].g_bSurvivor) + { + case true: FormatEx(sFinalName, sizeof sFinalName, "%s", g_esShooter[iTarget].g_sSurvivorName); + case false: + { + vGetTankTranslatedName(sTankName, sizeof sTankName, iTarget, .survivor = g_esShooter[iTarget].g_bSurvivor, .character = g_esShooter[iTarget].g_iCharacter); + FormatEx(sFinalName, sizeof sFinalName, "%t", sTankName); + } + } + + switch (g_esTankCache[iTarget].g_iDisplayHealthType) { case 1: { - switch (g_esCache[iTarget].g_iDisplayHealth) + switch (g_esTankCache[iTarget].g_iDisplayHealth) { - case 1: PrintHintText(iPlayer, "%t %s", sTankName, (bHuman ? sHumanTag : "")); + case 1: PrintHintText(iPlayer, "%s %s", sFinalName, (bHuman ? sHumanTag : "")); case 2: PrintHintText(iPlayer, "%i HP", iHealth); - case 3: PrintHintText(iPlayer, "%i/%i HP (%.0f%s)", iHealth, iTotalHealth, flPercentage, "%%"); + case 3: PrintHintText(iPlayer, "%i/%i HP (%.0f%s)", iHealth, iTotalHealth, flHealthPercentage, "%%"); case 4: PrintHintText(iPlayer, "HP: |-<%s>-|", sHealthBar); - case 5: PrintHintText(iPlayer, "%t %s (%i HP)", sTankName, (bHuman ? sHumanTag : ""), iHealth); - case 6: PrintHintText(iPlayer, "%t %s [%i/%i HP (%.0f%s)]", sTankName, (bHuman ? sHumanTag : ""), iHealth, iTotalHealth, flPercentage, "%%"); - case 7: PrintHintText(iPlayer, "%t %s\nHP: |-<%s>-|", sTankName, (bHuman ? sHumanTag : ""), sHealthBar); + case 5: PrintHintText(iPlayer, "%s %s (%i HP)", sFinalName, (bHuman ? sHumanTag : ""), iHealth); + case 6: PrintHintText(iPlayer, "%s %s [%i/%i HP (%.0f%s)]", sFinalName, (bHuman ? sHumanTag : ""), iHealth, iTotalHealth, flHealthPercentage, "%%"); + case 7: PrintHintText(iPlayer, "%s %s\nHP: |-<%s>-|", sFinalName, (bHuman ? sHumanTag : ""), sHealthBar); case 8: PrintHintText(iPlayer, "%i HP\nHP: |-<%s>-|", iHealth, sHealthBar); - case 9: PrintHintText(iPlayer, "%i/%i HP (%.0f%s)\nHP: |-<%s>-|", iHealth, iTotalHealth, flPercentage, "%%", sHealthBar); - case 10: PrintHintText(iPlayer, "%t %s (%i HP)\nHP: |-<%s>-|", sTankName, (bHuman ? sHumanTag : ""), iHealth, sHealthBar); - case 11: PrintHintText(iPlayer, "%t %s [%i/%i HP (%.0f%s)]\nHP: |-<%s>-|", sTankName, (bHuman ? sHumanTag : ""), iHealth, iTotalHealth, flPercentage, "%%", sHealthBar); + case 9: PrintHintText(iPlayer, "%i/%i HP (%.0f%s)\nHP: |-<%s>-|", iHealth, iTotalHealth, flHealthPercentage, "%%", sHealthBar); + case 10: PrintHintText(iPlayer, "%s %s (%i HP)\nHP: |-<%s>-|", sFinalName, (bHuman ? sHumanTag : ""), iHealth, sHealthBar); + case 11: PrintHintText(iPlayer, "%s %s [%i/%i HP (%.0f%s)]\nHP: |-<%s>-|", sFinalName, (bHuman ? sHumanTag : ""), iHealth, iTotalHealth, flHealthPercentage, "%%", sHealthBar); } } case 2: { - switch (g_esCache[iTarget].g_iDisplayHealth) + switch (g_esTankCache[iTarget].g_iDisplayHealth) { - case 1: PrintCenterText(iPlayer, "%t %s", sTankName, (bHuman ? sHumanTag : "")); + case 1: PrintCenterText(iPlayer, "%s %s", sFinalName, (bHuman ? sHumanTag : "")); case 2: PrintCenterText(iPlayer, "%i HP", iHealth); - case 3: PrintCenterText(iPlayer, "%i/%i HP (%.0f%s)", iHealth, iTotalHealth, flPercentage, "%%"); + case 3: PrintCenterText(iPlayer, "%i/%i HP (%.0f%s)", iHealth, iTotalHealth, flHealthPercentage, "%%"); case 4: PrintCenterText(iPlayer, "HP: |-<%s>-|", sHealthBar); - case 5: PrintCenterText(iPlayer, "%t %s (%i HP)", sTankName, (bHuman ? sHumanTag : ""), iHealth); - case 6: PrintCenterText(iPlayer, "%t %s [%i/%i HP (%.0f%s)]", sTankName, (bHuman ? sHumanTag : ""), iHealth, iTotalHealth, flPercentage, "%%"); - case 7: PrintCenterText(iPlayer, "%t %s\nHP: |-<%s>-|", sTankName, (bHuman ? sHumanTag : ""), sHealthBar); + case 5: PrintCenterText(iPlayer, "%s %s (%i HP)", sFinalName, (bHuman ? sHumanTag : ""), iHealth); + case 6: PrintCenterText(iPlayer, "%s %s [%i/%i HP (%.0f%s)]", sFinalName, (bHuman ? sHumanTag : ""), iHealth, iTotalHealth, flHealthPercentage, "%%"); + case 7: PrintCenterText(iPlayer, "%s %s\nHP: |-<%s>-|", sFinalName, (bHuman ? sHumanTag : ""), sHealthBar); case 8: PrintCenterText(iPlayer, "%i HP\nHP: |-<%s>-|", iHealth, sHealthBar); - case 9: PrintCenterText(iPlayer, "%i/%i HP (%.0f%s)\nHP: |-<%s>-|", iHealth, iTotalHealth, flPercentage, "%%", sHealthBar); - case 10: PrintCenterText(iPlayer, "%t %s (%i HP)\nHP: |-<%s>-|", sTankName, (bHuman ? sHumanTag : ""), iHealth, sHealthBar); - case 11: PrintCenterText(iPlayer, "%t %s [%i/%i HP (%.0f%s)]\nHP: |-<%s>-|", sTankName, (bHuman ? sHumanTag : ""), iHealth, iTotalHealth, flPercentage, "%%", sHealthBar); + case 9: PrintCenterText(iPlayer, "%i/%i HP (%.0f%s)\nHP: |-<%s>-|", iHealth, iTotalHealth, flHealthPercentage, "%%", sHealthBar); + case 10: PrintCenterText(iPlayer, "%s %s (%i HP)\nHP: |-<%s>-|", sFinalName, (bHuman ? sHumanTag : ""), iHealth, sHealthBar); + case 11: PrintCenterText(iPlayer, "%s %s [%i/%i HP (%.0f%s)]\nHP: |-<%s>-|", sFinalName, (bHuman ? sHumanTag : ""), iHealth, iTotalHealth, flHealthPercentage, "%%", sHealthBar); + } + } + } + } + else if (bIsValidEntity(iTarget)) + { + if (bIsHumanSurvivor(iPlayer, MT_CHECK_INGAME|MT_CHECK_ALIVE) && !bIsVisibleToPlayer(iPlayer)) + { + continue; + } + + sName[0] = '\0'; + bWitch = bIsWitch(iTarget); + iType = g_esTank[g_esInfected[iTarget].g_iTankType].g_iRealType[0]; + if (bIsCommonInfected(iTarget) || bWitch) + { + sHealthBar[0] = '\0'; + iHealth = GetEntProp(iTarget, Prop_Data, "m_iHealth"); + iHealth = (iHealth <= 0) ? 0 : iHealth; + iMaxHealth = GetEntProp(iTarget, Prop_Data, "m_iMaxHealth"); + iTotalHealth = (iHealth > iMaxHealth) ? iHealth : iMaxHealth; + flHealthPercentage = ((float(iHealth) / float(iTotalHealth)) * 100.0); + + ReplaceString(g_esInfectedCache[iTarget].g_sHealthCharacters, sizeof esTankCache::g_sHealthCharacters, " ", ""); + ExplodeString(g_esInfectedCache[iTarget].g_sHealthCharacters, ",", sSet, sizeof sSet, sizeof sSet[]); + + for (iCount = 0; iCount < ((float(iHealth) / float(iTotalHealth)) * ((sizeof sHealthBar) - 1)) && iCount < ((sizeof sHealthBar) - 1); iCount++) + { + StrCat(sHealthBar, sizeof sHealthBar, sSet[0]); + } + + for (; iCount < ((sizeof sHealthBar) - 1); iCount++) + { + StrCat(sHealthBar, sizeof sHealthBar, sSet[1]); + } + + switch (bWitch) + { + case true: + { + FormatEx(sTypeName, sizeof sTypeName, g_sMobNames[0]); + FormatEx(sName, sizeof sName, g_esHorde[iType].g_sWitchName); + } + case false: + { + FormatEx(sTypeName, sizeof sTypeName, g_sMobNames[1]); + FormatEx(sName, sizeof sName, g_esHorde[iType].g_sCommonName); + } + } + + FormatEx(sTankName, sizeof sTankName, "%s #%i Name", sTypeName, iType); + + if (sTankName[0] != '\0' && !TranslationPhraseExists(sTankName)) + { + FormatEx(sTankName, sizeof sTankName, "%s Name", sName); + } + + if (sTankName[0] != '\0' && !TranslationPhraseExists(sTankName)) + { + FormatEx(sTankName, sizeof sTankName, "%s #%i", sTypeName, iType); + } + + if (sTankName[0] != '\0' && !TranslationPhraseExists(sTankName)) + { + strcopy(sTankName, sizeof sTankName, sName); + } + + if (sTankName[0] == '\0' || !TranslationPhraseExists(sTankName)) + { + FormatEx(sTankName, sizeof sTankName, "NoName%s", sTypeName); + } + + switch (g_esInfectedCache[iTarget].g_iDisplayHealthType) + { + case 1: + { + switch (g_esInfectedCache[iTarget].g_iDisplayHealth) + { + case 1: PrintHintText(iPlayer, "%t", sTankName); + case 2: PrintHintText(iPlayer, "%i HP", iHealth); + case 3: PrintHintText(iPlayer, "%i/%i HP (%.0f%s)", iHealth, iTotalHealth, flHealthPercentage, "%%"); + case 4: PrintHintText(iPlayer, "HP: |-<%s>-|", sHealthBar); + case 5: PrintHintText(iPlayer, "%t (%i HP)", sTankName, iHealth); + case 6: PrintHintText(iPlayer, "%t [%i/%i HP (%.0f%s)]", sTankName, iHealth, iTotalHealth, flHealthPercentage, "%%"); + case 7: PrintHintText(iPlayer, "%t\nHP: |-<%s>-|", sTankName, sHealthBar); + case 8: PrintHintText(iPlayer, "%i HP\nHP: |-<%s>-|", iHealth, sHealthBar); + case 9: PrintHintText(iPlayer, "%i/%i HP (%.0f%s)\nHP: |-<%s>-|", iHealth, iTotalHealth, flHealthPercentage, "%%", sHealthBar); + case 10: PrintHintText(iPlayer, "%t (%i HP)\nHP: |-<%s>-|", sTankName, iHealth, sHealthBar); + case 11: PrintHintText(iPlayer, "%t [%i/%i HP (%.0f%s)]\nHP: |-<%s>-|", sTankName, iHealth, iTotalHealth, flHealthPercentage, "%%", sHealthBar); + } + } + case 2: + { + switch (g_esInfectedCache[iTarget].g_iDisplayHealth) + { + case 1: PrintCenterText(iPlayer, "%t", sTankName); + case 2: PrintCenterText(iPlayer, "%i HP", iHealth); + case 3: PrintCenterText(iPlayer, "%i/%i HP (%.0f%s)", iHealth, iTotalHealth, flHealthPercentage, "%%"); + case 4: PrintCenterText(iPlayer, "HP: |-<%s>-|", sHealthBar); + case 5: PrintCenterText(iPlayer, "%t (%i HP)", sTankName, iHealth); + case 6: PrintCenterText(iPlayer, "%t [%i/%i HP (%.0f%s)]", sTankName, iHealth, iTotalHealth, flHealthPercentage, "%%"); + case 7: PrintCenterText(iPlayer, "%t\nHP: |-<%s>-|", sTankName, sHealthBar); + case 8: PrintCenterText(iPlayer, "%i HP\nHP: |-<%s>-|", iHealth, sHealthBar); + case 9: PrintCenterText(iPlayer, "%i/%i HP (%.0f%s)\nHP: |-<%s>-|", iHealth, iTotalHealth, flHealthPercentage, "%%", sHealthBar); + case 10: PrintCenterText(iPlayer, "%t (%i HP)\nHP: |-<%s>-|", sTankName, iHealth, sHealthBar); + case 11: PrintCenterText(iPlayer, "%t [%i/%i HP (%.0f%s)]\nHP: |-<%s>-|", sTankName, iHealth, iTotalHealth, flHealthPercentage, "%%", sHealthBar); + } } } } @@ -3003,6 +4164,7 @@ public Action OnPlayerRunCmd(int client, int &buttons, int &impulse, float vel[3 return Plugin_Continue; } + Action aResult = Plugin_Continue; if (bIsSurvivor(client, MT_CHECK_INDEX|MT_CHECK_INGAME)) { if (bIsValidClient(client, MT_CHECK_ALIVE)) @@ -3011,50 +4173,14 @@ public Action OnPlayerRunCmd(int client, int &buttons, int &impulse, float vel[3 SDKCall(g_esGeneral.g_hSDKWeaponShootPosition, client, g_esPlayer[client].g_flLastWeaponShotPosition); g_esGeneral.g_bIgnoreWeaponShotPosition = false; - bool bDeveloper = bIsDeveloper(client, 5), bDeveloper2 = bIsDeveloper(client, 6); - if ((bDeveloper || bDeveloper2 || (g_esPlayer[client].g_iRewardTypes & MT_REWARD_SPEEDBOOST)) && (buttons & IN_JUMP)) + bool bDeveloper = bIsDeveloper(client, 0), bDeveloper2 = bIsDeveloper(client, 5), bDeveloper3 = bIsDeveloper(client, 6), bDeveloper4 = bIsDeveloper(client, 11); + if ((bDeveloper4 || (((g_esShooter[client].g_iTotalPassives & MT_PASSIVE_GODMODE) || (g_esPlayer[client].g_iRewardTypes & MT_REWARD_GODMODE)) && g_esPlayer[client].g_iSafetyBubble == 1)) && (buttons & IN_JUMP)) { - if (bIsEntityGrounded(client) && !bIsSurvivorDisabled(client) && !bIsSurvivorCaught(client)) - { - if (bDeveloper || bDeveloper2 || g_esPlayer[client].g_iBunnyHop == 1) - { - float flHeight = (bDeveloper && g_esDeveloper[client].g_flDevJumpHeight > g_esPlayer[client].g_flJumpHeight) ? g_esDeveloper[client].g_flDevJumpHeight : g_esPlayer[client].g_flJumpHeight; - flHeight = (!bDeveloper && bDeveloper2 && flHeight <= 0.0) ? MT_JUMP_DEFAULTHEIGHT : flHeight; - if (flHeight > 0.0) - { - vPushPlayer(client, {-90.0, 0.0, 0.0}, ((flHeight + 100.0) * 2.0)); - } - - float flAngles[3]; - GetClientEyeAngles(client, flAngles); - flAngles[0] = 0.0; - if (buttons & IN_BACK) - { - flAngles[1] += 180.0; - } - - if (buttons & IN_MOVELEFT) - { - flAngles[1] += 90.0; - } - - if (buttons & IN_MOVERIGHT) - { - flAngles[1] += -90.0; - } - - vPushPlayer(client, flAngles, MT_JUMP_FORWARDBOOST); - } - } - - if (bDeveloper) - { - vReviveSurvivor(client); - vSaveCaughtSurvivor(client); - } + vReviveSurvivor(client); + vSaveCaughtSurvivor(client); } - if ((bDeveloper || (g_esPlayer[client].g_iRewardTypes & MT_REWARD_SPEEDBOOST)) && g_esPlayer[client].g_iMidairDashesCount > 0) + if ((bDeveloper2 || (g_esShooter[client].g_iTotalPassives & MT_PASSIVE_SPEEDBOOST) || (g_esPlayer[client].g_iRewardTypes & MT_REWARD_SPEEDBOOST)) && g_esPlayer[client].g_iMidairDashesCount > 0) { if (!(buttons & IN_JUMP) && !g_esPlayer[client].g_bReleasedJump) { @@ -3067,16 +4193,83 @@ public Action OnPlayerRunCmd(int client, int &buttons, int &impulse, float vel[3 } } - if ((bDeveloper2 || ((g_esPlayer[client].g_iRewardTypes & MT_REWARD_ATTACKBOOST) && g_esPlayer[client].g_iShovePenalty == 1)) && (buttons & IN_ATTACK2)) + if ((bDeveloper3 || (((g_esShooter[client].g_iTotalPassives & MT_PASSIVE_ATTACKBOOST) || (g_esPlayer[client].g_iRewardTypes & MT_REWARD_ATTACKBOOST)) && g_esPlayer[client].g_iShovePenalty == 1)) && (buttons & IN_ATTACK2)) { SetEntProp(client, Prop_Send, "m_iShovePenalty", 0, 1); } - if (bIsDeveloper(client, 7) || (g_esPlayer[client].g_iRewardTypes & MT_REWARD_INFAMMO)) + if (bDeveloper || bIsDeveloper(client, 7) || (g_esShooter[client].g_iTotalPassives & MT_PASSIVE_INFAMMO) || (g_esPlayer[client].g_iRewardTypes & MT_REWARD_INFAMMO)) { vRefillGunAmmo(client, true); } + if (g_esGeneral.g_hSDKLaunchGrenade != null && (bDeveloper || (((g_esShooter[client].g_iTotalPassives & MT_PASSIVE_DAMAGEBOOST) || (g_esPlayer[client].g_iRewardTypes & MT_REWARD_DAMAGEBOOST)) && g_esPlayer[client].g_flLadyKiller > 0.0) || (((g_esShooter[client].g_iTotalPassives & MT_PASSIVE_AMMO) || (g_esPlayer[client].g_iRewardTypes & MT_REWARD_AMMO)) && g_esPlayer[client].g_flGrenadeLauncher > 0.0)) && !bIsSurvivorDisabled(client)) + { + int iTarget = GetClientAimTarget(client, false); + if (!bIsValidClient(client, MT_CHECK_FAKECLIENT) && bIsVisibleToPlayer(client) && (bIsInfected(iTarget) || (bIsWitch(iTarget) && g_esPlayer[client].g_flLadyKiller > 0.0)) && GetRandomFloat(0.1, 100.0) <= MT_GRENADE_CHANCE) + { + if (!(buttons & IN_USE)) + { + buttons |= IN_USE; + } + + if (!(buttons & IN_ZOOM)) + { + buttons |= IN_ZOOM; + } + } + + if ((buttons & IN_USE) && (buttons & IN_ZOOM)) + { + int iActiveWeapon = iGetSurvivorActiveWeapon(client); + if (bIsValidEntity(iActiveWeapon)) + { + int iAmmoType = GetEntProp(iActiveWeapon, Prop_Send, "m_iPrimaryAmmoType"); + if (iAmmoType > 0) + { + float flPortion = (bDeveloper && g_esDeveloper[client].g_flDevGrenadeLauncher > g_esPlayer[client].g_flGrenadeLauncher) ? g_esDeveloper[client].g_flDevGrenadeLauncher : g_esPlayer[client].g_flGrenadeLauncher, + flPortion2 = (bDeveloper && g_esDeveloper[client].g_flDevLadyKiller > g_esPlayer[client].g_flLadyKiller) ? g_esDeveloper[client].g_flDevLadyKiller : g_esPlayer[client].g_flLadyKiller, + flFinalPortion = (((flPortion > flPortion2) ? flPortion : flPortion2) / 100.0), flCurrentTime = GetGameTime(); + + int iAmmo = GetEntProp(client, Prop_Send, "m_iAmmo", .element = iAmmoType), iMaxAmmo = iGetMaxAmmo(client, 0, iActiveWeapon, true), iPortion = RoundToCeil(iMaxAmmo * flFinalPortion); + if (iAmmo >= iPortion) + { + float flCooldown = (bDeveloper ? 3.5 : 5.0); + if (g_esPlayer[client].g_flLastGrenadeTime > (flCurrentTime + flCooldown)) + { + g_esPlayer[client].g_flLastGrenadeTime = 0.0; + } + + if (g_esPlayer[client].g_flLastGrenadeTime <= flCurrentTime) + { + g_esPlayer[client].g_bLadyKiller = (flPortion2 > 0.0); + + SDKCall(g_esGeneral.g_hSDKLaunchGrenade, iActiveWeapon, client); + EmitSoundToAll(SOUND_EXPLOSION3, iActiveWeapon); + + float flRecoil[3]; + GetEntPropVector(client, Prop_Data, "m_vecPunchAngle", flRecoil); + flRecoil[0] -= 9.5; + SetEntPropVector(client, Prop_Data, "m_vecPunchAngle", flRecoil); + + g_esPlayer[client].g_flLastGrenadeTime = (flCurrentTime + flCooldown); + SetEntPropFloat(iActiveWeapon, Prop_Send, "m_flNextPrimaryAttack", (flCurrentTime + 0.5)); + + iAmmo -= iPortion; + iAmmo = iClamp(iAmmo, 0); + SetEntProp(client, Prop_Send, "m_iAmmo", iAmmo, .element = iAmmoType); + } + } + else if (g_esPlayer[client].g_flLastClickTime <= flCurrentTime) + { + g_esPlayer[client].g_flLastClickTime = (flCurrentTime + 1.5); + EmitSoundToClient(client, SOUND_EMPTY); + } + } + } + } + } + if (!bIsEntityGrounded(client)) { float flVelocity[3]; @@ -3114,7 +4307,7 @@ public Action OnPlayerRunCmd(int client, int &buttons, int &impulse, float vel[3 } else if (bIsInfected(client)) { - if (bIsInfectedSupported(client, MT_CHECK_FAKECLIENT)) + if (bIsSpecialSupported(client, MT_CHECK_FAKECLIENT)) { int iButton = 0; for (int iBit = 0; iBit < 26; iBit++) @@ -3148,8 +4341,7 @@ public Action OnPlayerRunCmd(int client, int &buttons, int &impulse, float vel[3 if (bGhost && (buttons & IN_ATTACK) && (g_esGeneral.g_bRushCooldown || g_esGeneral.g_bRushEnded || g_esPlayer[client].g_bRushWaiting)) { buttons &= ~IN_ATTACK; - - return Plugin_Changed; + aResult = Plugin_Changed; } else if (!bGhost && (buttons & IN_SPEED) && g_esPlayer[client].g_iRushDespawnCount < 3) { @@ -3157,15 +4349,68 @@ public Action OnPlayerRunCmd(int client, int &buttons, int &impulse, float vel[3 } } - if (bIsTank(client) && (buttons & IN_ATTACK) && !(buttons & IN_ATTACK2) && GetRandomFloat(0.1, 100.0) <= g_esCache[client].g_flPunchThrow) + if (bIsTank(client) && (buttons & IN_ATTACK) && !(buttons & IN_ATTACK2) && GetRandomFloat(0.1, 100.0) <= g_esTankCache[client].g_flPunchThrow) { buttons |= IN_ATTACK2; + aResult = Plugin_Changed; + } + } + + if (bIsValidClient(client)) + { + if (bIsEntityGrounded(client)) + { + bool bDeveloper = bIsDeveloper(client, 5), bDeveloper2 = bIsDeveloper(client, 6), bInfected = (bIsInfected(client) && g_esTankCache[client].g_iAutoHop == 1), bSurvivor = (bIsSurvivor(client) && !bIsSurvivorDisabled(client) && !bIsSurvivorCaught(client) && (bDeveloper || bDeveloper2 || (((g_esShooter[client].g_iTotalPassives & MT_PASSIVE_SPEEDBOOST) || (g_esPlayer[client].g_iRewardTypes & MT_REWARD_SPEEDBOOST)) && g_esPlayer[client].g_iBunnyHop == 1))); + if (bSurvivor || bInfected) + { + if (bInfected && !bIsValidClient(client, MT_CHECK_FAKECLIENT) && !(buttons & IN_JUMP)) + { + buttons |= IN_JUMP; + } - return Plugin_Changed; + if (buttons & IN_JUMP) + { + buttons |= IN_DUCK; + + float flHeight = (bDeveloper && g_esDeveloper[client].g_flDevJumpHeight > g_esPlayer[client].g_flJumpHeight) ? g_esDeveloper[client].g_flDevJumpHeight : g_esPlayer[client].g_flJumpHeight; + flHeight = ((!bDeveloper && bDeveloper2) || flHeight <= 0.0 || bInfected) ? MT_JUMP_DEFAULTHEIGHT : flHeight; + if (flHeight > 0.0) + { + vPushPlayer(client, {-90.0, 0.0, 0.0}, ((flHeight + 100.0) * 2.0)); + } + + float flAngles[3]; + GetClientEyeAngles(client, flAngles); + flAngles[0] = 0.0; + if (buttons & IN_BACK) + { + flAngles[1] += 180.0; + } + + if (buttons & IN_MOVELEFT) + { + flAngles[1] += 90.0; + } + + if (buttons & IN_MOVERIGHT) + { + flAngles[1] += -90.0; + } + + vPushPlayer(client, flAngles, MT_JUMP_FORWARDBOOST); + } + } + } + + if (GetEntityMoveType(client) & MOVETYPE_LADDER) + { + buttons &= ~IN_JUMP; + buttons &= ~IN_DUCK; + aResult = Plugin_Changed; } } - return Plugin_Continue; + return aResult; } /** @@ -3177,8 +4422,6 @@ void vInitialReset(int client) g_esPlayer[client].g_bBlindTank = false; g_esPlayer[client].g_iHudPanelPage = 0; g_esPlayer[client].g_iHudPanelPages = 0; - g_esPlayer[client].g_iLadyKillerCount = 0; - g_esPlayer[client].g_iLadyKillerLimit = 0; g_esPlayer[client].g_iPersonalType = 0; for (int iSpecType = 0; iSpecType < (sizeof g_sSpecialNames); iSpecType++) @@ -3208,7 +4451,7 @@ void vLateLoad() #if defined _clientprefs_included if (bIsValidClient(iPlayer, MT_CHECK_FAKECLIENT) && AreClientCookiesCached(iPlayer)) { - OnClientCookiesCached(iPlayer); + OnClientCookiesTankCached(iPlayer); } #endif if (bIsInfected(iPlayer, MT_CHECK_ALIVE)) @@ -3258,7 +4501,8 @@ void vPluginStatus() if (bIsCompetitiveModeRound(0)) { - g_esGeneral.g_alCompTypes = new ArrayList(); + g_esGeneral.g_alCompTypes[0] = new ArrayList(); + g_esGeneral.g_alCompTypes[1] = new ArrayList(); } } else if (g_esGeneral.g_bPluginEnabled && !bPluginAllowed) @@ -3280,6 +4524,7 @@ void vResetCore(int client) g_esPlayer[client].g_bLastLife[0] = false; g_esPlayer[client].g_bLastLife[1] = false; g_esPlayer[client].g_bMutantMenu = false; + g_esPlayer[client].g_bPunisher = false; g_esPlayer[client].g_bRushGhost = false; g_esPlayer[client].g_bRushWaiting = false; g_esPlayer[client].g_bRushDespawning = false; @@ -3302,6 +4547,7 @@ void vResetCore(int client) vResetTankDamage(client); delete g_esPlayer[client].g_hHudTimer; + delete g_esShooter[client].g_hCharacterTimer; } void vResetPlugin() @@ -3311,6 +4557,7 @@ void vResetPlugin() vResetRound(); vClearAbilityList(); + vClearClassKeysList(); vClearColorKeysList(); vClearCompTypesList(); vClearPluginList(); @@ -3353,6 +4600,7 @@ void vResetRound() delete g_esGeneral.g_hRegularWavesTimer; delete g_esGeneral.g_hSurvivalTimer; delete g_esGeneral.g_hTankWaveTimer; + delete g_esMob.g_hBioMassTimer; } void vTogglePlugin(bool toggle) @@ -3475,6 +4723,7 @@ void vRegisterForwards() g_esGeneral.g_gfRockBreakForward = new GlobalForward("MT_OnRockBreak", ET_Ignore, Param_Cell, Param_Cell); g_esGeneral.g_gfRockThrowForward = new GlobalForward("MT_OnRockThrow", ET_Ignore, Param_Cell, Param_Cell); g_esGeneral.g_gfSettingsCachedForward = new GlobalForward("MT_OnSettingsCached", ET_Ignore, Param_Cell, Param_Cell, Param_Cell); + g_esGeneral.g_gfToggleSurvivorPassiveForward = new GlobalForward("MT_OnToggleSurvivorPassive", ET_Event, Param_Cell, Param_CellByRef, Param_Cell, Param_Cell, Param_Cell); g_esGeneral.g_gfTypeChosenForward = new GlobalForward("MT_OnTypeChosen", ET_Event, Param_CellByRef, Param_Cell); #if defined _updater_included g_esGeneral.g_gfPluginUpdateForward = new GlobalForward("MT_OnPluginUpdate", ET_Ignore); @@ -3486,6 +4735,7 @@ void vRegisterNatives() CreateNative("MT_CanTypeSpawn", aNative_CanTypeSpawn); CreateNative("MT_DeafenPlayer", aNative_DeafenPlayer); CreateNative("MT_DetonateTankRock", aNative_DetonateTankRock); + CreateNative("MT_DoesSurvivorHavePassiveType", aNative_DoesSurvivorHavePassiveType); CreateNative("MT_DoesSurvivorHaveRewardType", aNative_DoesSurvivorHaveRewardType); CreateNative("MT_DoesTypeRequireHumans", aNative_DoesTypeRequireHumans); CreateNative("MT_GetAccessFlags", aNative_GetAccessFlags); @@ -3494,6 +4744,7 @@ void vRegisterNatives() CreateNative("MT_GetCurrentFinaleWave", aNative_GetCurrentFinaleWave); CreateNative("MT_GetGlowRange", aNative_GetGlowRange); CreateNative("MT_GetGlowType", aNative_GetGlowType); + CreateNative("MT_GetGraphicsLevel", aNative_GetGraphicsLevel); CreateNative("MT_GetImmunityFlags", aNative_GetImmunityFlags); CreateNative("MT_GetMaxType", aNative_GetMaxType); CreateNative("MT_GetMinType", aNative_GetMinType); @@ -3537,7 +4788,7 @@ any aNative_CanTypeSpawn(Handle plugin, int numParams) { int iType = iClamp(GetNativeCell(1), 1, MT_MAXTYPES), iSpecType = iClamp(GetNativeCell(2), 1, 8); iType = g_esTank[iType].g_iRecordedType[0]; - return bIsSpawnEnabled(iType, iSpecType) && bCanTypeSpawn(iType, iSpecType) && bIsRightGame(iType, iSpecType); + return (bIsSpawnEnabled(iType, iSpecType) && bCanTypeSpawn(iType, iSpecType) && bIsRightGame(iType, iSpecType)); } any aNative_DeafenPlayer(Handle plugin, int numParams) @@ -3562,50 +4813,110 @@ any aNative_DetonateTankRock(Handle plugin, int numParams) return 0; } -any aNative_DoesSurvivorHaveRewardType(Handle plugin, int numParams) +any aNative_DoesSurvivorHavePassiveType(Handle plugin, int numParams) { int iSurvivor = GetNativeCell(1), iType = GetNativeCell(2); if (bIsSurvivor(iSurvivor) && iType > 0) { - if (iType & MT_REWARD_HEALTH) + if (iType & MT_PASSIVE_HEALTH) { - return bIsDeveloper(iSurvivor, 6) || bIsDeveloper(iSurvivor, 7) || !!(g_esPlayer[iSurvivor].g_iRewardTypes & iType); + return (bIsDeveloper(iSurvivor, 6) || bIsDeveloper(iSurvivor, 7) || !!(g_esShooter[iSurvivor].g_iTotalPassives & iType)); } - else if (iType & MT_REWARD_SPEEDBOOST) + else if (iType & MT_PASSIVE_SPEEDBOOST) { - return bIsDeveloper(iSurvivor, 5) || !!(g_esPlayer[iSurvivor].g_iRewardTypes & iType); + return (bIsDeveloper(iSurvivor, 5) || !!(g_esShooter[iSurvivor].g_iTotalPassives & iType)); } - else if (iType & MT_REWARD_DAMAGEBOOST) + else if (iType & MT_PASSIVE_DAMAGEBOOST) { - return bIsDeveloper(iSurvivor, 4) || !!(g_esPlayer[iSurvivor].g_iRewardTypes & iType); + return (bIsDeveloper(iSurvivor, 4) || !!(g_esShooter[iSurvivor].g_iTotalPassives & iType)); } - else if (iType & MT_REWARD_ATTACKBOOST) + else if (iType & MT_PASSIVE_ATTACKBOOST) { - return bIsDeveloper(iSurvivor, 6) || !!(g_esPlayer[iSurvivor].g_iRewardTypes & iType); + return (bIsDeveloper(iSurvivor, 6) || !!(g_esShooter[iSurvivor].g_iTotalPassives & iType)); } - else if (iType & MT_REWARD_AMMO) + else if (iType & MT_PASSIVE_AMMO) { - return bIsDeveloper(iSurvivor, 4) || bIsDeveloper(iSurvivor, 6) || !!(g_esPlayer[iSurvivor].g_iRewardTypes & iType); + return (bIsDeveloper(iSurvivor, 4) || bIsDeveloper(iSurvivor, 6) || !!(g_esShooter[iSurvivor].g_iTotalPassives & iType)); } - else if (iType & MT_REWARD_ITEM) + else if (iType & MT_PASSIVE_ITEM) { - return !!(g_esPlayer[iSurvivor].g_iRewardTypes & iType); + return !!(g_esShooter[iSurvivor].g_iTotalPassives & iType); } - else if (iType & MT_REWARD_GODMODE) + else if (iType & MT_PASSIVE_GODMODE) { - return bIsDeveloper(iSurvivor, 11) || !!(g_esPlayer[iSurvivor].g_iRewardTypes & iType); + return (bIsDeveloper(iSurvivor, 11) || !!(g_esShooter[iSurvivor].g_iTotalPassives & iType)); } - else if (iType & MT_REWARD_REFILL) + else if (iType & MT_PASSIVE_REFILL) { - return !!(g_esPlayer[iSurvivor].g_iRewardTypes & iType); + return !!(g_esShooter[iSurvivor].g_iTotalPassives & iType); } - else if (iType & MT_REWARD_RESPAWN) + else if (iType & MT_PASSIVE_RESPAWN) { - return bIsDeveloper(iSurvivor, 10) || !!(g_esPlayer[iSurvivor].g_iRewardTypes & iType); + return (bIsDeveloper(iSurvivor, 10) || !!(g_esShooter[iSurvivor].g_iTotalPassives & iType)); + } + else if (iType & MT_PASSIVE_INFAMMO) + { + return (bIsDeveloper(iSurvivor, 0) || bIsDeveloper(iSurvivor, 7) || !!(g_esShooter[iSurvivor].g_iTotalPassives & iType)); + } + else + { + for (int iBit = 10; iBit <= 21; iBit++) + { + if (iType & (1 << iBit) && bIsDeveloper(iSurvivor, (iBit - 10))) + { + return true; + } + } + } + } + + return false; +} + +any aNative_DoesSurvivorHaveRewardType(Handle plugin, int numParams) +{ + int iSurvivor = GetNativeCell(1), iType = GetNativeCell(2); + if (bIsSurvivor(iSurvivor) && iType > 0) + { + if (iType & MT_REWARD_HEALTH) + { + return (bIsDeveloper(iSurvivor, 6) || bIsDeveloper(iSurvivor, 7) || !!(g_esPlayer[iSurvivor].g_iRewardTypes & iType)); + } + else if (iType & MT_REWARD_SPEEDBOOST) + { + return (bIsDeveloper(iSurvivor, 5) || !!(g_esPlayer[iSurvivor].g_iRewardTypes & iType)); + } + else if (iType & MT_REWARD_DAMAGEBOOST) + { + return (bIsDeveloper(iSurvivor, 4) || !!(g_esPlayer[iSurvivor].g_iRewardTypes & iType)); + } + else if (iType & MT_REWARD_ATTACKBOOST) + { + return (bIsDeveloper(iSurvivor, 6) || !!(g_esPlayer[iSurvivor].g_iRewardTypes & iType)); + } + else if (iType & MT_REWARD_AMMO) + { + return (bIsDeveloper(iSurvivor, 4) || bIsDeveloper(iSurvivor, 6) || !!(g_esPlayer[iSurvivor].g_iRewardTypes & iType)); + } + else if (iType & MT_REWARD_ITEM) + { + return !!(g_esPlayer[iSurvivor].g_iRewardTypes & iType); + } + else if (iType & MT_REWARD_GODMODE) + { + return (bIsDeveloper(iSurvivor, 11) || !!(g_esPlayer[iSurvivor].g_iRewardTypes & iType)); + } + else if (iType & MT_REWARD_REFILL) + { + return !!(g_esPlayer[iSurvivor].g_iRewardTypes & iType); + } + else if (iType & MT_REWARD_RESPAWN) + { + return (bIsDeveloper(iSurvivor, 10) || !!(g_esPlayer[iSurvivor].g_iRewardTypes & iType)); } else if (iType & MT_REWARD_INFAMMO) { - return bIsDeveloper(iSurvivor, 7) || !!(g_esPlayer[iSurvivor].g_iRewardTypes & iType); + return (bIsDeveloper(iSurvivor, 7) || !!(g_esPlayer[iSurvivor].g_iRewardTypes & iType)); } else { @@ -3637,8 +4948,8 @@ any aNative_GetAccessFlags(Handle plugin, int numParams) { case 1: return g_esGeneral.g_iAccessFlags; case 2: return g_esTank[iType].g_iAccessFlags; - case 3: return bIsValidClient(iAdmin, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_FAKECLIENT) ? g_esPlayer[iAdmin].g_iAccessFlags : 0; - case 4: return bIsValidClient(iAdmin, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_FAKECLIENT) ? g_esAdmin[iType].g_iAccessFlags[iAdmin] : 0; + case 3: return (bIsValidClient(iAdmin, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_FAKECLIENT) ? g_esPlayer[iAdmin].g_iAccessFlags : 0); + case 4: return (bIsValidClient(iAdmin, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_FAKECLIENT) ? g_esAdmin[iType].g_iAccessFlags[iAdmin] : 0); } return 0; @@ -3647,26 +4958,26 @@ any aNative_GetAccessFlags(Handle plugin, int numParams) any aNative_GetCombinationSetting(Handle plugin, int numParams) { int iTank = GetNativeCell(1), iType = iClamp(GetNativeCell(2), 1, 16), iPos = iClamp(GetNativeCell(3), 0, 9); - if (bIsInfectedSupported(iTank, MT_CHECK_INDEX|MT_CHECK_INGAME)) + if (bIsSpecialSupported(iTank, MT_CHECK_INDEX|MT_CHECK_INGAME)) { switch (iType) { - case 1: return g_esCache[iTank].g_flComboChance[iPos]; - case 2: return float(g_esCache[iTank].g_iComboCooldown[iPos]); - case 3: return g_esCache[iTank].g_flComboDamage[iPos]; - case 4: return g_esCache[iTank].g_flComboDelay[iPos]; - case 5: return g_esCache[iTank].g_flComboDuration[iPos]; - case 6: return g_esCache[iTank].g_flComboInterval[iPos]; - case 7: return g_esCache[iTank].g_flComboMinRadius[iPos]; - case 8: return g_esCache[iTank].g_flComboMaxRadius[iPos]; - case 9: return g_esCache[iTank].g_flComboRange[iPos]; - case 10: return g_esCache[iTank].g_flComboRangeChance[iPos]; - case 11: return float(g_esCache[iTank].g_iComboRangeCooldown[iPos]); - case 12: return g_esCache[iTank].g_flComboDeathChance[iPos]; - case 13: return g_esCache[iTank].g_flComboDeathRange[iPos]; - case 14: return g_esCache[iTank].g_flComboRockChance[iPos]; - case 15: return float(g_esCache[iTank].g_iComboRockCooldown[iPos]); - case 16: return g_esCache[iTank].g_flComboSpeed[iPos]; + case 1: return g_esTankCache[iTank].g_flComboChance[iPos]; + case 2: return float(g_esTankCache[iTank].g_iComboCooldown[iPos]); + case 3: return g_esTankCache[iTank].g_flComboDamage[iPos]; + case 4: return g_esTankCache[iTank].g_flComboDelay[iPos]; + case 5: return g_esTankCache[iTank].g_flComboDuration[iPos]; + case 6: return g_esTankCache[iTank].g_flComboInterval[iPos]; + case 7: return g_esTankCache[iTank].g_flComboMinRadius[iPos]; + case 8: return g_esTankCache[iTank].g_flComboMaxRadius[iPos]; + case 9: return g_esTankCache[iTank].g_flComboRange[iPos]; + case 10: return g_esTankCache[iTank].g_flComboRangeChance[iPos]; + case 11: return float(g_esTankCache[iTank].g_iComboRangeCooldown[iPos]); + case 12: return g_esTankCache[iTank].g_flComboDeathChance[iPos]; + case 13: return g_esTankCache[iTank].g_flComboDeathRange[iPos]; + case 14: return g_esTankCache[iTank].g_flComboRockChance[iPos]; + case 15: return float(g_esTankCache[iTank].g_iComboRockCooldown[iPos]); + case 16: return g_esTankCache[iTank].g_flComboSpeed[iPos]; } } @@ -3693,12 +5004,12 @@ any aNative_GetGlowRange(Handle plugin, int numParams) { int iTank = GetNativeCell(1); bool bMode = GetNativeCell(2); - if (bIsInfectedSupported(iTank, MT_CHECK_INDEX|MT_CHECK_INGAME)) + if (bIsSpecialSupported(iTank, MT_CHECK_INDEX|MT_CHECK_INGAME)) { switch (bMode) { - case true: return g_esCache[iTank].g_iGlowMaxRange; - case false: return g_esCache[iTank].g_iGlowMinRange; + case true: return g_esTankCache[iTank].g_iGlowMaxRange; + case false: return g_esTankCache[iTank].g_iGlowMinRange; } } @@ -3708,7 +5019,12 @@ any aNative_GetGlowRange(Handle plugin, int numParams) any aNative_GetGlowType(Handle plugin, int numParams) { int iTank = GetNativeCell(1); - return bIsInfectedSupported(iTank, MT_CHECK_INDEX|MT_CHECK_INGAME) ? g_esCache[iTank].g_iGlowType : 0; + return (bIsSpecialSupported(iTank, MT_CHECK_INDEX|MT_CHECK_INGAME) ? g_esTankCache[iTank].g_iGlowType : 0); +} + +any aNative_GetGraphicsLevel(Handle plugin, int numParams) +{ + return ((g_esGeneral.g_iGraphicsLevel > 0) ? g_esGeneral.g_iGraphicsLevel : g_esGeneral.g_cvMTGraphicsLevel.IntValue); } any aNative_GetImmunityFlags(Handle plugin, int numParams) @@ -3720,8 +5036,8 @@ any aNative_GetImmunityFlags(Handle plugin, int numParams) { case 1: return g_esGeneral.g_iImmunityFlags; case 2: return g_esTank[iType].g_iImmunityFlags; - case 3: return bIsValidClient(iAdmin, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_FAKECLIENT) ? g_esPlayer[iAdmin].g_iImmunityFlags : 0; - case 4: return bIsValidClient(iAdmin, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_FAKECLIENT) ? g_esAdmin[iType].g_iImmunityFlags[iAdmin] : 0; + case 3: return (bIsValidClient(iAdmin, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_FAKECLIENT) ? g_esPlayer[iAdmin].g_iImmunityFlags : 0); + case 4: return (bIsValidClient(iAdmin, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_FAKECLIENT) ? g_esAdmin[iType].g_iImmunityFlags[iAdmin] : 0); } return 0; @@ -3740,29 +5056,29 @@ any aNative_GetMinType(Handle plugin, int numParams) any aNative_GetPropColors(Handle plugin, int numParams) { int iTank = GetNativeCell(1), iType = iClamp(GetNativeCell(2), 1, 8); - if (bIsInfectedSupported(iTank, MT_CHECK_INDEX|MT_CHECK_INGAME)) + if (bIsSpecialSupported(iTank, MT_CHECK_INDEX|MT_CHECK_INGAME)) { bool bRainbow[6] = {false, false, false, false, false, false}; - bRainbow[0] = StrEqual(g_esCache[iTank].g_sOzTankColor, "rainbow", false); - bRainbow[1] = StrEqual(g_esCache[iTank].g_sFlameColor, "rainbow", false); - bRainbow[2] = StrEqual(g_esCache[iTank].g_sRockColor, "rainbow", false); - bRainbow[3] = StrEqual(g_esCache[iTank].g_sTireColor, "rainbow", false); - bRainbow[4] = StrEqual(g_esCache[iTank].g_sPropTankColor, "rainbow", false); - bRainbow[5] = StrEqual(g_esCache[iTank].g_sFlashlightColor, "rainbow", false); - - int iColor[4]; + bRainbow[0] = StrEqual(g_esTankCache[iTank].g_sOzTankColor, "rainbow", false); + bRainbow[1] = StrEqual(g_esTankCache[iTank].g_sFlameColor, "rainbow", false); + bRainbow[2] = StrEqual(g_esTankCache[iTank].g_sRockColor, "rainbow", false); + bRainbow[3] = StrEqual(g_esTankCache[iTank].g_sTireColor, "rainbow", false); + bRainbow[4] = StrEqual(g_esTankCache[iTank].g_sPropTankColor, "rainbow", false); + bRainbow[5] = StrEqual(g_esTankCache[iTank].g_sFlashlightColor, "rainbow", false); + + int iColor[4] = {0, 0, 0, 0}; for (int iPos = 0; iPos < (sizeof iColor); iPos++) { switch (iType) { - case 1: iGetRandomColor(g_esCache[iTank].g_iLightColor[iPos]); - case 2: iColor[iPos] = bRainbow[iType - 2] ? -2 : iGetRandomColor(g_esCache[iTank].g_iOzTankColor[iPos]); - case 3: iColor[iPos] = bRainbow[iType - 2] ? -2 : iGetRandomColor(g_esCache[iTank].g_iFlameColor[iPos]); - case 4: iColor[iPos] = bRainbow[iType - 2] ? -2 : iGetRandomColor(g_esCache[iTank].g_iRockColor[iPos]); - case 5: iColor[iPos] = bRainbow[iType - 2] ? -2 : iGetRandomColor(g_esCache[iTank].g_iTireColor[iPos]); - case 6: iColor[iPos] = bRainbow[iType - 2] ? -2 : iGetRandomColor(g_esCache[iTank].g_iPropTankColor[iPos]); - case 7: iColor[iPos] = bRainbow[iType - 2] ? -2 : iGetRandomColor(g_esCache[iTank].g_iFlashlightColor[iPos]); - case 8: iGetRandomColor(g_esCache[iTank].g_iCrownColor[iPos]); + case 1: iGetRandomColor(g_esTankCache[iTank].g_iLightColor[iPos]); + case 2: iColor[iPos] = bRainbow[iType - 2] ? -2 : iGetRandomColor(g_esTankCache[iTank].g_iOzTankColor[iPos]); + case 3: iColor[iPos] = bRainbow[iType - 2] ? -2 : iGetRandomColor(g_esTankCache[iTank].g_iFlameColor[iPos]); + case 4: iColor[iPos] = bRainbow[iType - 2] ? -2 : iGetRandomColor(g_esTankCache[iTank].g_iRockColor[iPos]); + case 5: iColor[iPos] = bRainbow[iType - 2] ? -2 : iGetRandomColor(g_esTankCache[iTank].g_iTireColor[iPos]); + case 6: iColor[iPos] = bRainbow[iType - 2] ? -2 : iGetRandomColor(g_esTankCache[iTank].g_iPropTankColor[iPos]); + case 7: iColor[iPos] = bRainbow[iType - 2] ? -2 : iGetRandomColor(g_esTankCache[iTank].g_iFlashlightColor[iPos]); + case 8: iGetRandomColor(g_esTankCache[iTank].g_iCrownColor[iPos]); } SetNativeCellRef((iPos + 3), iColor[iPos]); @@ -3776,7 +5092,7 @@ any aNative_GetRecordedTankType(Handle plugin, int numParams) { int iTank = GetNativeCell(1), iType = GetNativeCell(2); iType = (iType > 0) ? g_esTank[iType].g_iRecordedType[0] : g_esPlayer[iTank].g_iTankType; - return bIsInfectedSupported(iTank, MT_CHECK_INDEX|MT_CHECK_INGAME) ? iType : 0; + return (bIsSpecialSupported(iTank, MT_CHECK_INDEX|MT_CHECK_INGAME) ? iType : 0); } any aNative_GetRunSpeed(Handle plugin, int numParams) @@ -3784,7 +5100,7 @@ any aNative_GetRunSpeed(Handle plugin, int numParams) int iTank = GetNativeCell(1); if (bIsInfected(iTank)) { - return (g_esCache[iTank].g_flRunSpeed > 0.0) ? g_esCache[iTank].g_flRunSpeed : 1.0; + return ((g_esTankCache[iTank].g_flRunSpeed > 0.0) ? g_esTankCache[iTank].g_flRunSpeed : 1.0); } return 0.0; @@ -3800,30 +5116,31 @@ any aNative_GetSpawnType(Handle plugin, int numParams) int iTank = GetNativeCell(1), iType = GetNativeCell(2), iSpecType = GetNativeCell(3); iType = g_esTank[iType].g_iRecordedType[0]; int iSetting = (iSpecType > 0 && iSpecType != 8) ? iGetSettingValue(true, true, g_esSpecial[iType].g_iSpawnType, g_esTank[iType].g_iSpawnType, 1) : g_esTank[iType].g_iSpawnType, - iSpawnType = (iType > 0) ? iSetting : g_esCache[iTank].g_iSpawnType; - return bIsInfectedSupported(iTank, MT_CHECK_INDEX|MT_CHECK_INGAME) ? iSpawnType : 0; + iSpawnType = (iType > 0) ? iSetting : g_esTankCache[iTank].g_iSpawnType; + + return (bIsSpecialSupported(iTank, MT_CHECK_INDEX|MT_CHECK_INGAME) ? iSpawnType : 0); } any aNative_GetTankColors(Handle plugin, int numParams) { int iTank = GetNativeCell(1), iType = iClamp(GetNativeCell(2), 1, 2); - if (bIsInfectedSupported(iTank, MT_CHECK_INDEX|MT_CHECK_INGAME)) + if (bIsSpecialSupported(iTank, MT_CHECK_INDEX|MT_CHECK_INGAME)) { bool bRainbow[2] = {false, false}; - bRainbow[0] = StrEqual(g_esCache[iTank].g_sSkinColor, "rainbow", false); - bRainbow[1] = StrEqual(g_esCache[iTank].g_sGlowColor, "rainbow", false); + bRainbow[0] = StrEqual(g_esTankCache[iTank].g_sSkinColor, "rainbow", false); + bRainbow[1] = StrEqual(g_esTankCache[iTank].g_sGlowColor, "rainbow", false); - int iColor[4]; + int iColor[4] = {0, 0, 0, 0}; for (int iPos = 0; iPos < (sizeof iColor); iPos++) { switch (iType) { - case 1: iColor[iPos] = bRainbow[iType - 1] ? -2 : iGetRandomColor(g_esCache[iTank].g_iSkinColor[iPos]); + case 1: iColor[iPos] = (bRainbow[iType - 1] ? -2 : iGetRandomColor(g_esTankCache[iTank].g_iSkinColor[iPos])); case 2: { - if (iPos < (sizeof esCache::g_iGlowColor)) + if (iPos < (sizeof esTankCache::g_iGlowColor)) { - iColor[iPos] = bRainbow[iType - 1] ? -2 : iGetRandomColor(g_esCache[iTank].g_iGlowColor[iPos]); + iColor[iPos] = (bRainbow[iType - 1] ? -2 : iGetRandomColor(g_esTankCache[iTank].g_iGlowColor[iPos])); } } } @@ -3838,10 +5155,10 @@ any aNative_GetTankColors(Handle plugin, int numParams) any aNative_GetTankName(Handle plugin, int numParams) { int iTank = GetNativeCell(1); - if (bIsInfectedSupported(iTank, MT_CHECK_INDEX|MT_CHECK_INGAME)) + if (bIsSpecialSupported(iTank, MT_CHECK_INDEX|MT_CHECK_INGAME)) { char sTankName[64]; - vGetTranslatedName(sTankName, sizeof sTankName, iTank); + vGetTankTranslatedName(sTankName, sizeof sTankName, iTank); SetNativeString(2, sTankName, sizeof sTankName); } @@ -3852,20 +5169,20 @@ any aNative_GetTankType(Handle plugin, int numParams) { int iTank = GetNativeCell(1), iType = GetNativeCell(2); iType = (iType > 0) ? iType : g_esPlayer[iTank].g_iTankType; - return bIsInfectedSupported(iTank, MT_CHECK_INDEX|MT_CHECK_INGAME) ? g_esTank[iType].g_iRealType[0] : 0; + return (bIsSpecialSupported(iTank, MT_CHECK_INDEX|MT_CHECK_INGAME) ? g_esTank[iType].g_iRealType[0] : 0); } any aNative_HasAdminAccess(Handle plugin, int numParams) { int iAdmin = GetNativeCell(1); - return bIsInfectedSupported(iAdmin, MT_CHECK_INDEX|MT_CHECK_INGAME) && bHasCoreAdminAccess(iAdmin); + return (bIsSpecialSupported(iAdmin, MT_CHECK_INDEX|MT_CHECK_INGAME) && bHasCoreAdminAccess(iAdmin)); } any aNative_HasChanceToSpawn(Handle plugin, int numParams) { int iType = iClamp(GetNativeCell(1), 1, MT_MAXTYPES), iTank = GetNativeCell(2); iType = g_esTank[iType].g_iRecordedType[0]; - return flGetTypeChance(iTank, iType) > 0.0; + return (flGetTypeChance(iTank, iType) > 0.0); } any aNative_HideEntity(Handle plugin, int numParams) @@ -3887,7 +5204,7 @@ any aNative_HideEntity(Handle plugin, int numParams) any aNative_IsAdminImmune(Handle plugin, int numParams) { int iSurvivor = GetNativeCell(1), iTank = GetNativeCell(2); - return bIsHumanSurvivor(iSurvivor) && bIsInfectedSupported(iTank, MT_CHECK_INDEX|MT_CHECK_INGAME) && bIsCoreAdminImmune(iSurvivor, iTank); + return (bIsHumanSurvivor(iSurvivor) && bIsSpecialSupported(iTank, MT_CHECK_INDEX|MT_CHECK_INGAME) && bIsCoreAdminImmune(iSurvivor, iTank)); } any aNative_IsCorePluginEnabled(Handle plugin, int numParams) @@ -3898,45 +5215,45 @@ any aNative_IsCorePluginEnabled(Handle plugin, int numParams) any aNative_IsCustomTankSupported(Handle plugin, int numParams) { int iTank = GetNativeCell(1); - return bIsInfectedSupported(iTank, MT_CHECK_INDEX|MT_CHECK_INGAME) && bIsCustomTankSupported(iTank); + return (bIsSpecialSupported(iTank, MT_CHECK_INDEX|MT_CHECK_INGAME) && bIsCustomTankSupported(iTank)); } any aNative_IsFinaleType(Handle plugin, int numParams) { int iType = iClamp(GetNativeCell(1), 1, MT_MAXTYPES), iTank = GetNativeCell(2); iType = g_esTank[iType].g_iRecordedType[0]; - return iGetFinaleType(iType, g_esPlayer[iTank].g_iInfectedType) == 1; + return (iGetFinaleType(iType, g_esPlayer[iTank].g_iInfectedType) == 1); } any aNative_IsGlowEnabled(Handle plugin, int numParams) { int iTank = GetNativeCell(1); - return bIsInfectedSupported(iTank, MT_CHECK_INDEX|MT_CHECK_INGAME) && g_esCache[iTank].g_iGlowEnabled == 1; + return (bIsSpecialSupported(iTank, MT_CHECK_INDEX|MT_CHECK_INGAME) && g_esTankCache[iTank].g_iGlowEnabled == 1); } any aNative_IsGlowFlashing(Handle plugin, int numParams) { int iTank = GetNativeCell(1); - return bIsInfectedSupported(iTank, MT_CHECK_INDEX|MT_CHECK_INGAME) && g_esCache[iTank].g_iGlowFlashing == 1; + return (bIsSpecialSupported(iTank, MT_CHECK_INDEX|MT_CHECK_INGAME) && g_esTankCache[iTank].g_iGlowFlashing == 1); } any aNative_IsNonFinaleType(Handle plugin, int numParams) { int iType = iClamp(GetNativeCell(1), 1, MT_MAXTYPES), iTank = GetNativeCell(2); iType = g_esTank[iType].g_iRecordedType[0]; - return iGetFinaleType(iType, g_esPlayer[iTank].g_iInfectedType) == 2; + return (iGetFinaleType(iType, g_esPlayer[iTank].g_iInfectedType) == 2); } any aNative_IsTankIdle(Handle plugin, int numParams) { int iTank = GetNativeCell(1), iType = iClamp(GetNativeCell(2), 0, 2); - return bIsInfected(iTank) && bIsInfectedIdle(iTank, iType); + return (bIsInfected(iTank) && bIsInfectedIdle(iTank, iType)); } any aNative_IsTankSupported(Handle plugin, int numParams) { int iTank = GetNativeCell(1); - return bIsInfected(iTank, MT_CHECK_INDEX|MT_CHECK_INGAME) && bIsInfectedSupported(iTank, GetNativeCell(2)); + return (bIsInfected(iTank, MT_CHECK_INDEX|MT_CHECK_INGAME) && bIsSpecialSupported(iTank, GetNativeCell(2))); } any aNative_IsTypeEnabled(Handle plugin, int numParams) @@ -3944,7 +5261,7 @@ any aNative_IsTypeEnabled(Handle plugin, int numParams) int iType = iClamp(GetNativeCell(1), 1, MT_MAXTYPES), iTank = GetNativeCell(2); iType = g_esTank[iType].g_iRecordedType[0]; bool bCheck = bIsTank(iTank) ? bIsTankEnabled(iType) : (bIsInfectedEnabled(iTank) || bIsSpecialEnabled(iType)); - return bCheck && bIsTypeAvailable(iType, iTank); + return (bCheck && bIsTypeAvailable(iType, iTank)); } any aNative_LogMessage(Handle plugin, int numParams) @@ -3996,7 +5313,7 @@ any aNative_SetTankType(Handle plugin, int numParams) g_esPlayer[iTank].g_iOldTankType = g_esPlayer[iTank].g_iTankType; g_esPlayer[iTank].g_iTankType = iType; - vCacheSettings(iTank); + vCacheTankSettings(iTank); } } } @@ -4019,10 +5336,11 @@ any aNative_ShoveBySurvivor(Handle plugin, int numParams) any aNative_SpawnTank(Handle plugin, int numParams) { - int iTank = GetNativeCell(1), iType = iClamp(GetNativeCell(2), 1, MT_MAXTYPES); + int iTank = GetNativeCell(1), iType = iClamp(GetNativeCell(2), 1, MT_MAXTYPES), iSpecType = GetNativeCell(3); if (bIsInfected(iTank, MT_CHECK_INDEX|MT_CHECK_INGAME)) { - vQueueTank(iTank, g_esPlayer[iTank].g_iInfectedType, iType, .log = false); + iSpecType = (iSpecType > 0) ? iClamp(iSpecType, 1, 8) : g_esPlayer[iTank].g_iInfectedType; + vQueueTank(iTank, iSpecType, iType, .log = false); } return 0; @@ -4099,7 +5417,7 @@ any aNative_VomitPlayer(Handle plugin, int numParams) **/ #if defined _clientprefs_included -public void OnClientCookiesCached(int client) +public void OnClientCookiesTankCached(int client) { char sColor[16]; for (int iPos = 0; iPos < (sizeof esGeneral::g_ckMTAdmin); iPos++) @@ -4270,6 +5588,11 @@ Action cmdMTCommandListener(int client, const char[] command, int argc) { g_esPlayer[client].g_bLastLife[0] = false; g_esPlayer[client].g_iReviveCount = 0; + + if (g_esSurvivorCache[client].g_iCarrierCleanse == 1) + { + vRemoveInfection(client); + } } } @@ -4444,7 +5767,7 @@ Action cmdMTConfig(int client, int args) char sSection[PLATFORM_MAX_PATH]; GetCmdArg(1, sSection, sizeof sSection); - switch (!strncmp(sSection, "Plugin", 6, false) || !strncmp(sSection, MT_CONFIG_SECTION_SETTINGS4, strlen(MT_CONFIG_SECTION_SETTINGS4), false) || !strncmp(sSection, "STEAM_", 6, false) || (!strncmp(sSection, "[U:", 3) && sSection[strlen(sSection) - 1] == ']') || StrEqual(sSection, "all", false) || FindCharInString(sSection, ',') != -1 || FindCharInString(sSection, '-') != -1) + switch (!strncmp(sSection, "Plugin", 6, false) || !strncmp(sSection, MT_CONFIG_SECTION_SETTINGS4, strlen(MT_CONFIG_SECTION_SETTINGS4), false) || !strncmp(sSection, "Surv", 4, false) || !strncmp(sSection, "STEAM_", 6, false) || (!strncmp(sSection, "[U:", 3) && sSection[strlen(sSection) - 1] == ']') || StrEqual(sSection, "all", false) || FindCharInString(sSection, ',') != -1 || FindCharInString(sSection, '-') != -1) { case true: g_esGeneral.g_sSection = sSection; case false: @@ -4778,7 +6101,7 @@ Action cmdTank(int client, int args) GetCmdArg(0, sCmd, sizeof sCmd); GetCmdArg(1, sType, sizeof sType); - int iType = iClamp(StringToInt(sType), -1, g_esGeneral.g_iMaxType), iLimit = StrEqual(sType, "mt_dev_access", false) ? MT_DEV_MAXLEVEL : 32, iAmount = iClamp(GetCmdArgInt(2), 1, iLimit), iMode = iClamp(GetCmdArgInt(3), 0, 1), iBlind = iClamp(GetCmdArgInt(4), 0, 1); + int iType = iClamp(StringToInt(sType), -1, g_esGeneral.g_iMaxType), iLimit = (StrEqual(sType, "mt_dev_access", false) ? MT_DEV_MAXLEVEL : 32), iAmount = iClamp(GetCmdArgInt(2), 1, iLimit), iMode = iClamp(GetCmdArgInt(3), 0, 1), iBlind = iClamp(GetCmdArgInt(4), 0, 1); if ((IsCharNumeric(sType[0]) && (iType < -1 || iType > g_esGeneral.g_iMaxType)) || iAmount > iLimit || iMode < 0 || iMode > 1 || iBlind < 0 || iBlind > 1 || args > 4) { MT_ReplyToCommand(client, "%s %t", MT_TAG2, "CommandUsage", sCmd, -1, g_esGeneral.g_iMaxType); @@ -4792,7 +6115,7 @@ Action cmdTank(int client, int args) if (!bIsTankEnabled(iRealType) || !bIsMenuEnabled(iRealType, iSpecType) || !bIsTypeAvailable(iRealType, client) || bAreHumansRequired(iRealType, iSpecType) || !bCanTypeSpawn(iRealType, iSpecType) || !bIsRightGame(iRealType, iSpecType) || !bHasCoreAdminAccess(client, iRealType)) { char sTankName[64]; - vGetTranslatedName(sTankName, sizeof sTankName, .type = iType, .specType = iSpecType); + vGetTankTranslatedName(sTankName, sizeof sTankName, .type = iType, .specType = iSpecType); MT_ReplyToCommand(client, "%s %t", MT_TAG5, "DisabledType", sTankName, iRealType, iType); return Plugin_Handled; @@ -4840,7 +6163,7 @@ Action cmdSmoker(int client, int args) GetCmdArg(0, sCmd, sizeof sCmd); GetCmdArg(1, sType, sizeof sType); - int iMaxType = iGetMaxType(iSpecType), iType = iClamp(StringToInt(sType), -1, iMaxType), iLimit = StrEqual(sType, "mt_dev_access", false) ? MT_DEV_MAXLEVEL : 32, iAmount = iClamp(GetCmdArgInt(2), 1, iLimit), iMode = iClamp(GetCmdArgInt(3), 0, 1), iBlind = iClamp(GetCmdArgInt(4), 0, 1); + int iMaxType = iGetMaxType(iSpecType), iType = iClamp(StringToInt(sType), -1, iMaxType), iLimit = (StrEqual(sType, "mt_dev_access", false) ? MT_DEV_MAXLEVEL : 32), iAmount = iClamp(GetCmdArgInt(2), 1, iLimit), iMode = iClamp(GetCmdArgInt(3), 0, 1), iBlind = iClamp(GetCmdArgInt(4), 0, 1); if ((IsCharNumeric(sType[0]) && (iType < -1 || iType > iMaxType)) || iAmount > iLimit || iMode < 0 || iMode > 1 || iBlind < 0 || iBlind > 1 || args > 4) { MT_ReplyToCommand(client, "%s %t", MT_TAG2, "CommandUsage", sCmd, -1, iMaxType); @@ -4854,7 +6177,7 @@ Action cmdSmoker(int client, int args) if (!bIsSmokerEnabled(iRealType) || !bIsMenuEnabled(iRealType, iSpecType) || !bIsTypeAvailable(iRealType, client) || bAreHumansRequired(iRealType, iSpecType) || !bCanTypeSpawn(iRealType, iSpecType) || !bIsRightGame(iRealType, iSpecType) || !bHasCoreAdminAccess(client, iRealType)) { char sSmokerName[64]; - vGetTranslatedName(sSmokerName, sizeof sSmokerName, .type = iType, .specType = iSpecType); + vGetTankTranslatedName(sSmokerName, sizeof sSmokerName, .type = iType, .specType = iSpecType); MT_ReplyToCommand(client, "%s %t", MT_TAG5, "DisabledTypeSmoker", sSmokerName, iRealType, iType); return Plugin_Handled; @@ -4902,7 +6225,7 @@ Action cmdBoomer(int client, int args) GetCmdArg(0, sCmd, sizeof sCmd); GetCmdArg(1, sType, sizeof sType); - int iMaxType = iGetMaxType(iSpecType), iType = iClamp(StringToInt(sType), -1, iMaxType), iLimit = StrEqual(sType, "mt_dev_access", false) ? MT_DEV_MAXLEVEL : 32, iAmount = iClamp(GetCmdArgInt(2), 1, iLimit), iMode = iClamp(GetCmdArgInt(3), 0, 1), iBlind = iClamp(GetCmdArgInt(4), 0, 1); + int iMaxType = iGetMaxType(iSpecType), iType = iClamp(StringToInt(sType), -1, iMaxType), iLimit = (StrEqual(sType, "mt_dev_access", false) ? MT_DEV_MAXLEVEL : 32), iAmount = iClamp(GetCmdArgInt(2), 1, iLimit), iMode = iClamp(GetCmdArgInt(3), 0, 1), iBlind = iClamp(GetCmdArgInt(4), 0, 1); if ((IsCharNumeric(sType[0]) && (iType < -1 || iType > iMaxType)) || iAmount > iLimit || iMode < 0 || iMode > 1 || iBlind < 0 || iBlind > 1 || args > 4) { MT_ReplyToCommand(client, "%s %t", MT_TAG2, "CommandUsage", sCmd, -1, iMaxType); @@ -4916,7 +6239,7 @@ Action cmdBoomer(int client, int args) if (!bIsBoomerEnabled(iRealType) || !bIsMenuEnabled(iRealType, iSpecType) || !bIsTypeAvailable(iRealType, client) || bAreHumansRequired(iRealType, iSpecType) || !bCanTypeSpawn(iRealType, iSpecType) || !bIsRightGame(iRealType, iSpecType) || !bHasCoreAdminAccess(client, iRealType)) { char sBoomerName[64]; - vGetTranslatedName(sBoomerName, sizeof sBoomerName, .type = iType, .specType = iSpecType); + vGetTankTranslatedName(sBoomerName, sizeof sBoomerName, .type = iType, .specType = iSpecType); MT_ReplyToCommand(client, "%s %t", MT_TAG5, "DisabledTypeBoomer", sBoomerName, iRealType, iType); return Plugin_Handled; @@ -4964,7 +6287,7 @@ Action cmdHunter(int client, int args) GetCmdArg(0, sCmd, sizeof sCmd); GetCmdArg(1, sType, sizeof sType); - int iMaxType = iGetMaxType(iSpecType), iType = iClamp(StringToInt(sType), -1, iMaxType), iLimit = StrEqual(sType, "mt_dev_access", false) ? MT_DEV_MAXLEVEL : 32, iAmount = iClamp(GetCmdArgInt(2), 1, iLimit), iMode = iClamp(GetCmdArgInt(3), 0, 1), iBlind = iClamp(GetCmdArgInt(4), 0, 1); + int iMaxType = iGetMaxType(iSpecType), iType = iClamp(StringToInt(sType), -1, iMaxType), iLimit = (StrEqual(sType, "mt_dev_access", false) ? MT_DEV_MAXLEVEL : 32), iAmount = iClamp(GetCmdArgInt(2), 1, iLimit), iMode = iClamp(GetCmdArgInt(3), 0, 1), iBlind = iClamp(GetCmdArgInt(4), 0, 1); if ((IsCharNumeric(sType[0]) && (iType < -1 || iType > iMaxType)) || iAmount > iLimit || iMode < 0 || iMode > 1 || iBlind < 0 || iBlind > 1 || args > 4) { MT_ReplyToCommand(client, "%s %t", MT_TAG2, "CommandUsage", sCmd, -1, iMaxType); @@ -4978,7 +6301,7 @@ Action cmdHunter(int client, int args) if (!bIsHunterEnabled(iRealType) || !bIsMenuEnabled(iRealType, iSpecType) || !bIsTypeAvailable(iRealType, client) || bAreHumansRequired(iRealType, iSpecType) || !bCanTypeSpawn(iRealType, iSpecType) || !bIsRightGame(iRealType, iSpecType) || !bHasCoreAdminAccess(client, iRealType)) { char sHunterName[64]; - vGetTranslatedName(sHunterName, sizeof sHunterName, .type = iType, .specType = iSpecType); + vGetTankTranslatedName(sHunterName, sizeof sHunterName, .type = iType, .specType = iSpecType); MT_ReplyToCommand(client, "%s %t", MT_TAG5, "DisabledTypeHunter", sHunterName, iRealType, iType); return Plugin_Handled; @@ -5007,7 +6330,7 @@ Action cmdSpitter(int client, int args) return Plugin_Handled; } - int iSpecType = g_bSecondGame ? 4 : 2; + int iSpecType = (g_bSecondGame ? 4 : 2); if (args < 1) { switch (IsVoteInProgress()) @@ -5026,7 +6349,7 @@ Action cmdSpitter(int client, int args) GetCmdArg(0, sCmd, sizeof sCmd); GetCmdArg(1, sType, sizeof sType); - int iMaxType = iGetMaxType(iSpecType), iType = iClamp(StringToInt(sType), -1, iMaxType), iLimit = StrEqual(sType, "mt_dev_access", false) ? MT_DEV_MAXLEVEL : 32, iAmount = iClamp(GetCmdArgInt(2), 1, iLimit), iMode = iClamp(GetCmdArgInt(3), 0, 1), iBlind = iClamp(GetCmdArgInt(4), 0, 1); + int iMaxType = iGetMaxType(iSpecType), iType = iClamp(StringToInt(sType), -1, iMaxType), iLimit = (StrEqual(sType, "mt_dev_access", false) ? MT_DEV_MAXLEVEL : 32), iAmount = iClamp(GetCmdArgInt(2), 1, iLimit), iMode = iClamp(GetCmdArgInt(3), 0, 1), iBlind = iClamp(GetCmdArgInt(4), 0, 1); if ((IsCharNumeric(sType[0]) && (iType < -1 || iType > iMaxType)) || iAmount > iLimit || iMode < 0 || iMode > 1 || iBlind < 0 || iBlind > 1 || args > 4) { MT_ReplyToCommand(client, "%s %t", MT_TAG2, "CommandUsage", sCmd, -1, iMaxType); @@ -5040,7 +6363,7 @@ Action cmdSpitter(int client, int args) if (!bIsSpitterEnabled(iRealType) || !bIsMenuEnabled(iRealType, iSpecType) || !bIsTypeAvailable(iRealType, client) || bAreHumansRequired(iRealType, iSpecType) || !bCanTypeSpawn(iRealType, iSpecType) || !bIsRightGame(iRealType, iSpecType) || !bHasCoreAdminAccess(client, iRealType)) { char sSpitterName[64]; - vGetTranslatedName(sSpitterName, sizeof sSpitterName, .type = iType, .specType = iSpecType); + vGetTankTranslatedName(sSpitterName, sizeof sSpitterName, .type = iType, .specType = iSpecType); MT_ReplyToCommand(client, "%s %t", MT_TAG5, "DisabledTypeSpitter", sSpitterName, iRealType, iType); return Plugin_Handled; @@ -5069,7 +6392,7 @@ Action cmdJockey(int client, int args) return Plugin_Handled; } - int iSpecType = g_bSecondGame ? 5 : 3; + int iSpecType = (g_bSecondGame ? 5 : 3); if (args < 1) { switch (IsVoteInProgress()) @@ -5088,7 +6411,7 @@ Action cmdJockey(int client, int args) GetCmdArg(0, sCmd, sizeof sCmd); GetCmdArg(1, sType, sizeof sType); - int iMaxType = iGetMaxType(iSpecType), iType = iClamp(StringToInt(sType), -1, iMaxType), iLimit = StrEqual(sType, "mt_dev_access", false) ? MT_DEV_MAXLEVEL : 32, iAmount = iClamp(GetCmdArgInt(2), 1, iLimit), iMode = iClamp(GetCmdArgInt(3), 0, 1), iBlind = iClamp(GetCmdArgInt(4), 0, 1); + int iMaxType = iGetMaxType(iSpecType), iType = iClamp(StringToInt(sType), -1, iMaxType), iLimit = (StrEqual(sType, "mt_dev_access", false) ? MT_DEV_MAXLEVEL : 32), iAmount = iClamp(GetCmdArgInt(2), 1, iLimit), iMode = iClamp(GetCmdArgInt(3), 0, 1), iBlind = iClamp(GetCmdArgInt(4), 0, 1); if ((IsCharNumeric(sType[0]) && (iType < -1 || iType > iMaxType)) || iAmount > iLimit || iMode < 0 || iMode > 1 || iBlind < 0 || iBlind > 1 || args > 4) { MT_ReplyToCommand(client, "%s %t", MT_TAG2, "CommandUsage", sCmd, -1, iMaxType); @@ -5102,7 +6425,7 @@ Action cmdJockey(int client, int args) if (!bIsJockeyEnabled(iRealType) || !bIsMenuEnabled(iRealType, iSpecType) || !bIsTypeAvailable(iRealType, client) || bAreHumansRequired(iRealType, iSpecType) || !bCanTypeSpawn(iRealType, iSpecType) || !bIsRightGame(iRealType, iSpecType) || !bHasCoreAdminAccess(client, iRealType)) { char sJockeyName[64]; - vGetTranslatedName(sJockeyName, sizeof sJockeyName, .type = iType, .specType = iSpecType); + vGetTankTranslatedName(sJockeyName, sizeof sJockeyName, .type = iType, .specType = iSpecType); MT_ReplyToCommand(client, "%s %t", MT_TAG5, "DisabledTypeJockey", sJockeyName, iRealType, iType); return Plugin_Handled; @@ -5131,7 +6454,7 @@ Action cmdCharger(int client, int args) return Plugin_Handled; } - int iSpecType = g_bSecondGame ? 6 : 1; + int iSpecType = (g_bSecondGame ? 6 : 1); if (args < 1) { switch (IsVoteInProgress()) @@ -5150,7 +6473,7 @@ Action cmdCharger(int client, int args) GetCmdArg(0, sCmd, sizeof sCmd); GetCmdArg(1, sType, sizeof sType); - int iMaxType = iGetMaxType(iSpecType), iType = iClamp(StringToInt(sType), -1, iMaxType), iLimit = StrEqual(sType, "mt_dev_access", false) ? MT_DEV_MAXLEVEL : 32, iAmount = iClamp(GetCmdArgInt(2), 1, iLimit), iMode = iClamp(GetCmdArgInt(3), 0, 1), iBlind = iClamp(GetCmdArgInt(4), 0, 1); + int iMaxType = iGetMaxType(iSpecType), iType = iClamp(StringToInt(sType), -1, iMaxType), iLimit = (StrEqual(sType, "mt_dev_access", false) ? MT_DEV_MAXLEVEL : 32), iAmount = iClamp(GetCmdArgInt(2), 1, iLimit), iMode = iClamp(GetCmdArgInt(3), 0, 1), iBlind = iClamp(GetCmdArgInt(4), 0, 1); if ((IsCharNumeric(sType[0]) && (iType < -1 || iType > iMaxType)) || iAmount > iLimit || iMode < 0 || iMode > 1 || iBlind < 0 || iBlind > 1 || args > 4) { MT_ReplyToCommand(client, "%s %t", MT_TAG2, "CommandUsage", sCmd, -1, iMaxType); @@ -5164,7 +6487,7 @@ Action cmdCharger(int client, int args) if (!bIsChargerEnabled(iRealType) || !bIsMenuEnabled(iRealType, iSpecType) || !bIsTypeAvailable(iRealType, client) || bAreHumansRequired(iRealType, iSpecType) || !bCanTypeSpawn(iRealType, iSpecType) || !bIsRightGame(iRealType, iSpecType) || !bHasCoreAdminAccess(client, iRealType)) { char sChargerName[64]; - vGetTranslatedName(sChargerName, sizeof sChargerName, .type = iType, .specType = iSpecType); + vGetTankTranslatedName(sChargerName, sizeof sChargerName, .type = iType, .specType = iSpecType); MT_ReplyToCommand(client, "%s %t", MT_TAG5, "DisabledTypeCharger", sChargerName, iRealType, iType); return Plugin_Handled; @@ -5218,7 +6541,7 @@ Action cmdMutantTank(int client, int args) GetCmdArg(0, sCmd, sizeof sCmd); GetCmdArg(1, sType, sizeof sType); - int iType = iClamp(StringToInt(sType), -1, g_esGeneral.g_iMaxType), iLimit = StrEqual(sType, "mt_dev_access", false) ? MT_DEV_MAXLEVEL : 32, iAmount = iClamp(GetCmdArgInt(2), 1, iLimit), iMode = iClamp(GetCmdArgInt(3), 0, 1), iBlind = iClamp(GetCmdArgInt(4), 0, 1); + int iType = iClamp(StringToInt(sType), -1, g_esGeneral.g_iMaxType), iLimit = (StrEqual(sType, "mt_dev_access", false) ? MT_DEV_MAXLEVEL : 32), iAmount = iClamp(GetCmdArgInt(2), 1, iLimit), iMode = iClamp(GetCmdArgInt(3), 0, 1), iBlind = iClamp(GetCmdArgInt(4), 0, 1); if ((IsCharNumeric(sType[0]) && (iType < -1 || iType > g_esGeneral.g_iMaxType)) || iAmount > iLimit || iMode < 0 || iMode > 1 || iBlind < 0 || iBlind > 1 || args > 4) { MT_ReplyToCommand(client, "%s %t", MT_TAG2, "CommandUsage", sCmd, -1, g_esGeneral.g_iMaxType); @@ -5232,7 +6555,7 @@ Action cmdMutantTank(int client, int args) if (!bIsTankEnabled(iRealType) || !bIsMenuEnabled(iRealType, iSpecType) || !bIsTypeAvailable(iRealType, client) || bAreHumansRequired(iRealType, iSpecType) || !bCanTypeSpawn(iRealType, iSpecType) || !bIsRightGame(iRealType, iSpecType) || !bHasCoreAdminAccess(client, iRealType)) { char sTankName[64]; - vGetTranslatedName(sTankName, sizeof sTankName, .type = iType, .specType = iSpecType); + vGetTankTranslatedName(sTankName, sizeof sTankName, .type = iType, .specType = iSpecType); MT_ReplyToCommand(client, "%s %t", MT_TAG5, "DisabledType", sTankName, iRealType, iType); return Plugin_Handled; @@ -5286,7 +6609,7 @@ Action cmdMutantSmoker(int client, int args) GetCmdArg(0, sCmd, sizeof sCmd); GetCmdArg(1, sType, sizeof sType); - int iMaxType = iGetMaxType(iSpecType), iType = iClamp(StringToInt(sType), -1, iMaxType), iLimit = StrEqual(sType, "mt_dev_access", false) ? MT_DEV_MAXLEVEL : 32, iAmount = iClamp(GetCmdArgInt(2), 1, iLimit), iMode = iClamp(GetCmdArgInt(3), 0, 1), iBlind = iClamp(GetCmdArgInt(4), 0, 1); + int iMaxType = iGetMaxType(iSpecType), iType = iClamp(StringToInt(sType), -1, iMaxType), iLimit = (StrEqual(sType, "mt_dev_access", false) ? MT_DEV_MAXLEVEL : 32), iAmount = iClamp(GetCmdArgInt(2), 1, iLimit), iMode = iClamp(GetCmdArgInt(3), 0, 1), iBlind = iClamp(GetCmdArgInt(4), 0, 1); if ((IsCharNumeric(sType[0]) && (iType < -1 || iType > iMaxType)) || iAmount > iLimit || iMode < 0 || iMode > 1 || iBlind < 0 || iBlind > 1 || args > 4) { MT_ReplyToCommand(client, "%s %t", MT_TAG2, "CommandUsage", sCmd, -1, iMaxType); @@ -5300,7 +6623,7 @@ Action cmdMutantSmoker(int client, int args) if (!bIsSmokerEnabled(iRealType) || !bIsMenuEnabled(iRealType, iSpecType) || !bIsTypeAvailable(iRealType, client) || bAreHumansRequired(iRealType, iSpecType) || !bCanTypeSpawn(iRealType, iSpecType) || !bIsRightGame(iRealType, iSpecType) || !bHasCoreAdminAccess(client, iRealType)) { char sSmokerName[64]; - vGetTranslatedName(sSmokerName, sizeof sSmokerName, .type = iType, .specType = iSpecType); + vGetTankTranslatedName(sSmokerName, sizeof sSmokerName, .type = iType, .specType = iSpecType); MT_ReplyToCommand(client, "%s %t", MT_TAG5, "DisabledTypeSmoker", sSmokerName, iRealType, iType); return Plugin_Handled; @@ -5354,7 +6677,7 @@ Action cmdMutantBoomer(int client, int args) GetCmdArg(0, sCmd, sizeof sCmd); GetCmdArg(1, sType, sizeof sType); - int iMaxType = iGetMaxType(iSpecType), iType = iClamp(StringToInt(sType), -1, iMaxType), iLimit = StrEqual(sType, "mt_dev_access", false) ? MT_DEV_MAXLEVEL : 32, iAmount = iClamp(GetCmdArgInt(2), 1, iLimit), iMode = iClamp(GetCmdArgInt(3), 0, 1), iBlind = iClamp(GetCmdArgInt(4), 0, 1); + int iMaxType = iGetMaxType(iSpecType), iType = iClamp(StringToInt(sType), -1, iMaxType), iLimit = (StrEqual(sType, "mt_dev_access", false) ? MT_DEV_MAXLEVEL : 32), iAmount = iClamp(GetCmdArgInt(2), 1, iLimit), iMode = iClamp(GetCmdArgInt(3), 0, 1), iBlind = iClamp(GetCmdArgInt(4), 0, 1); if ((IsCharNumeric(sType[0]) && (iType < -1 || iType > iMaxType)) || iAmount > iLimit || iMode < 0 || iMode > 1 || iBlind < 0 || iBlind > 1 || args > 4) { MT_ReplyToCommand(client, "%s %t", MT_TAG2, "CommandUsage", sCmd, -1, iMaxType); @@ -5368,7 +6691,7 @@ Action cmdMutantBoomer(int client, int args) if (!bIsBoomerEnabled(iRealType) || !bIsMenuEnabled(iRealType, iSpecType) || !bIsTypeAvailable(iRealType, client) || bAreHumansRequired(iRealType, iSpecType) || !bCanTypeSpawn(iRealType, iSpecType) || !bIsRightGame(iRealType, iSpecType) || !bHasCoreAdminAccess(client, iRealType)) { char sBoomerName[64]; - vGetTranslatedName(sBoomerName, sizeof sBoomerName, .type = iType, .specType = iSpecType); + vGetTankTranslatedName(sBoomerName, sizeof sBoomerName, .type = iType, .specType = iSpecType); MT_ReplyToCommand(client, "%s %t", MT_TAG5, "DisabledTypeBoomer", sBoomerName, iRealType, iType); return Plugin_Handled; @@ -5422,7 +6745,7 @@ Action cmdMutantHunter(int client, int args) GetCmdArg(0, sCmd, sizeof sCmd); GetCmdArg(1, sType, sizeof sType); - int iMaxType = iGetMaxType(iSpecType), iType = iClamp(StringToInt(sType), -1, iMaxType), iLimit = StrEqual(sType, "mt_dev_access", false) ? MT_DEV_MAXLEVEL : 32, iAmount = iClamp(GetCmdArgInt(2), 1, iLimit), iMode = iClamp(GetCmdArgInt(3), 0, 1), iBlind = iClamp(GetCmdArgInt(4), 0, 1); + int iMaxType = iGetMaxType(iSpecType), iType = iClamp(StringToInt(sType), -1, iMaxType), iLimit = (StrEqual(sType, "mt_dev_access", false) ? MT_DEV_MAXLEVEL : 32), iAmount = iClamp(GetCmdArgInt(2), 1, iLimit), iMode = iClamp(GetCmdArgInt(3), 0, 1), iBlind = iClamp(GetCmdArgInt(4), 0, 1); if ((IsCharNumeric(sType[0]) && (iType < -1 || iType > iMaxType)) || iAmount > iLimit || iMode < 0 || iMode > 1 || iBlind < 0 || iBlind > 1 || args > 4) { MT_ReplyToCommand(client, "%s %t", MT_TAG2, "CommandUsage", sCmd, -1, iMaxType); @@ -5436,7 +6759,7 @@ Action cmdMutantHunter(int client, int args) if (!bIsHunterEnabled(iRealType) || !bIsMenuEnabled(iRealType, iSpecType) || !bIsTypeAvailable(iRealType, client) || bAreHumansRequired(iRealType, iSpecType) || !bCanTypeSpawn(iRealType, iSpecType) || !bIsRightGame(iRealType, iSpecType) || !bHasCoreAdminAccess(client, iRealType)) { char sHunterName[64]; - vGetTranslatedName(sHunterName, sizeof sHunterName, .type = iType, .specType = iSpecType); + vGetTankTranslatedName(sHunterName, sizeof sHunterName, .type = iType, .specType = iSpecType); MT_ReplyToCommand(client, "%s %t", MT_TAG5, "DisabledTypeHunter", sHunterName, iRealType, iType); return Plugin_Handled; @@ -5474,7 +6797,7 @@ Action cmdMutantSpitter(int client, int args) return Plugin_Handled; } - int iSpecType = g_bSecondGame ? 4 : 2; + int iSpecType = (g_bSecondGame ? 4 : 2); if (args < 1 || !bIsSpitter(client)) { switch (IsVoteInProgress()) @@ -5490,7 +6813,7 @@ Action cmdMutantSpitter(int client, int args) GetCmdArg(0, sCmd, sizeof sCmd); GetCmdArg(1, sType, sizeof sType); - int iMaxType = iGetMaxType(iSpecType), iType = iClamp(StringToInt(sType), -1, iMaxType), iLimit = StrEqual(sType, "mt_dev_access", false) ? MT_DEV_MAXLEVEL : 32, iAmount = iClamp(GetCmdArgInt(2), 1, iLimit), iMode = iClamp(GetCmdArgInt(3), 0, 1), iBlind = iClamp(GetCmdArgInt(4), 0, 1); + int iMaxType = iGetMaxType(iSpecType), iType = iClamp(StringToInt(sType), -1, iMaxType), iLimit = (StrEqual(sType, "mt_dev_access", false) ? MT_DEV_MAXLEVEL : 32), iAmount = iClamp(GetCmdArgInt(2), 1, iLimit), iMode = iClamp(GetCmdArgInt(3), 0, 1), iBlind = iClamp(GetCmdArgInt(4), 0, 1); if ((IsCharNumeric(sType[0]) && (iType < -1 || iType > iMaxType)) || iAmount > iLimit || iMode < 0 || iMode > 1 || iBlind < 0 || iBlind > 1 || args > 4) { MT_ReplyToCommand(client, "%s %t", MT_TAG2, "CommandUsage", sCmd, -1, iMaxType); @@ -5504,7 +6827,7 @@ Action cmdMutantSpitter(int client, int args) if (!bIsSpitterEnabled(iRealType) || !bIsMenuEnabled(iRealType, iSpecType) || !bIsTypeAvailable(iRealType, client) || bAreHumansRequired(iRealType, iSpecType) || !bCanTypeSpawn(iRealType, iSpecType) || !bIsRightGame(iRealType, iSpecType) || !bHasCoreAdminAccess(client, iRealType)) { char sSpitterName[64]; - vGetTranslatedName(sSpitterName, sizeof sSpitterName, .type = iType, .specType = iSpecType); + vGetTankTranslatedName(sSpitterName, sizeof sSpitterName, .type = iType, .specType = iSpecType); MT_ReplyToCommand(client, "%s %t", MT_TAG5, "DisabledTypeSpitter", sSpitterName, iRealType, iType); return Plugin_Handled; @@ -5542,7 +6865,7 @@ Action cmdMutantJockey(int client, int args) return Plugin_Handled; } - int iSpecType = g_bSecondGame ? 5 : 3; + int iSpecType = (g_bSecondGame ? 5 : 3); if (args < 1 || !bIsJockey(client)) { switch (IsVoteInProgress()) @@ -5558,7 +6881,7 @@ Action cmdMutantJockey(int client, int args) GetCmdArg(0, sCmd, sizeof sCmd); GetCmdArg(1, sType, sizeof sType); - int iMaxType = iGetMaxType(iSpecType), iType = iClamp(StringToInt(sType), -1, iMaxType), iLimit = StrEqual(sType, "mt_dev_access", false) ? MT_DEV_MAXLEVEL : 32, iAmount = iClamp(GetCmdArgInt(2), 1, iLimit), iMode = iClamp(GetCmdArgInt(3), 0, 1), iBlind = iClamp(GetCmdArgInt(4), 0, 1); + int iMaxType = iGetMaxType(iSpecType), iType = iClamp(StringToInt(sType), -1, iMaxType), iLimit = (StrEqual(sType, "mt_dev_access", false) ? MT_DEV_MAXLEVEL : 32), iAmount = iClamp(GetCmdArgInt(2), 1, iLimit), iMode = iClamp(GetCmdArgInt(3), 0, 1), iBlind = iClamp(GetCmdArgInt(4), 0, 1); if ((IsCharNumeric(sType[0]) && (iType < -1 || iType > iMaxType)) || iAmount > iLimit || iMode < 0 || iMode > 1 || iBlind < 0 || iBlind > 1 || args > 4) { MT_ReplyToCommand(client, "%s %t", MT_TAG2, "CommandUsage", sCmd, -1, iMaxType); @@ -5572,7 +6895,7 @@ Action cmdMutantJockey(int client, int args) if (!bIsJockeyEnabled(iRealType) || !bIsMenuEnabled(iRealType, iSpecType) || !bIsTypeAvailable(iRealType, client) || bAreHumansRequired(iRealType, iSpecType) || !bCanTypeSpawn(iRealType, iSpecType) || !bIsRightGame(iRealType, iSpecType) || !bHasCoreAdminAccess(client, iRealType)) { char sJockeyName[64]; - vGetTranslatedName(sJockeyName, sizeof sJockeyName, .type = iType, .specType = iSpecType); + vGetTankTranslatedName(sJockeyName, sizeof sJockeyName, .type = iType, .specType = iSpecType); MT_ReplyToCommand(client, "%s %t", MT_TAG5, "DisabledTypeJockey", sJockeyName, iRealType, iType); return Plugin_Handled; @@ -5610,7 +6933,7 @@ Action cmdMutantCharger(int client, int args) return Plugin_Handled; } - int iSpecType = g_bSecondGame ? 6 : 1; + int iSpecType = (g_bSecondGame ? 6 : 1); if (args < 1 || !bIsCharger(client)) { switch (IsVoteInProgress()) @@ -5626,7 +6949,7 @@ Action cmdMutantCharger(int client, int args) GetCmdArg(0, sCmd, sizeof sCmd); GetCmdArg(1, sType, sizeof sType); - int iMaxType = iGetMaxType(iSpecType), iType = iClamp(StringToInt(sType), -1, iMaxType), iLimit = StrEqual(sType, "mt_dev_access", false) ? MT_DEV_MAXLEVEL : 32, iAmount = iClamp(GetCmdArgInt(2), 1, iLimit), iMode = iClamp(GetCmdArgInt(3), 0, 1), iBlind = iClamp(GetCmdArgInt(4), 0, 1); + int iMaxType = iGetMaxType(iSpecType), iType = iClamp(StringToInt(sType), -1, iMaxType), iLimit = (StrEqual(sType, "mt_dev_access", false) ? MT_DEV_MAXLEVEL : 32), iAmount = iClamp(GetCmdArgInt(2), 1, iLimit), iMode = iClamp(GetCmdArgInt(3), 0, 1), iBlind = iClamp(GetCmdArgInt(4), 0, 1); if ((IsCharNumeric(sType[0]) && (iType < -1 || iType > iMaxType)) || iAmount > iLimit || iMode < 0 || iMode > 1 || iBlind < 0 || iBlind > 1 || args > 4) { MT_ReplyToCommand(client, "%s %t", MT_TAG2, "CommandUsage", sCmd, -1, iMaxType); @@ -5640,7 +6963,7 @@ Action cmdMutantCharger(int client, int args) if (!bIsChargerEnabled(iRealType) || !bIsMenuEnabled(iRealType, iSpecType) || !bIsTypeAvailable(iRealType, client) || bAreHumansRequired(iRealType, iSpecType) || !bCanTypeSpawn(iRealType, iSpecType) || !bIsRightGame(iRealType, iSpecType) || !bHasCoreAdminAccess(client, iRealType)) { char sChargerName[64]; - vGetTranslatedName(sChargerName, sizeof sChargerName, .type = iType, .specType = iSpecType); + vGetTankTranslatedName(sChargerName, sizeof sChargerName, .type = iType, .specType = iSpecType); MT_ReplyToCommand(client, "%s %t", MT_TAG5, "DisabledTypeCharger", sChargerName, iRealType, iType); return Plugin_Handled; @@ -5686,6 +7009,7 @@ void vRegisterConVars() vSetupConVar(g_esGeneral.g_cvMTDisabledGameModes, "mt_disabledgamemodes", "", "Disable Mutant Tanks in these game modes.\nSeparate by commas.\nEmpty: None\nNot empty: Disabled only in these game modes.", FCVAR_NOTIFY); vSetupConVar(g_esGeneral.g_cvMTEnabledGameModes, "mt_enabledgamemodes", "", "Enable Mutant Tanks in these game modes.\nSeparate by commas.\nEmpty: All\nNot empty: Enabled only in these game modes.", FCVAR_NOTIFY); vSetupConVar(g_esGeneral.g_cvMTGameModeTypes, "mt_gamemodetypes", "0", "Enable Mutant Tanks in these game mode types.\n0 OR 15: All game mode types.\n1: Co-Op modes only.\n2: Versus modes only.\n4: Survival modes only.\n8: Scavenge modes only. (Only available in Left 4 Dead 2.)", FCVAR_NOTIFY, true, 0.0, true, 15.0); + vSetupConVar(g_esGeneral.g_cvMTGraphicsLevel, "mt_graphicslevel", "3", "Sets the graphics level of the plugin to help with server performance.\n0: OFF\n1: Low\n2: Medium\n3: High", FCVAR_NOTIFY, true, 0.0, true, 3.0); vSetupConVar(g_esGeneral.g_cvMTListenSupport, "mt_listensupport", (g_bDedicated ? "0" : "1"), "Enable Mutant Tanks on listen servers.\n0: OFF\n1: ON", FCVAR_NOTIFY, true, 0.0, true, 1.0); vSetupConVar(g_esGeneral.g_cvMTPluginEnabled, "mt_pluginenabled", "1", "Enable Mutant Tanks.\n0: OFF\n1: ON", FCVAR_NOTIFY, true, 0.0, true, 1.0); AutoExecConfig_CreateConVar("mt_pluginversion", MT_VERSION, "Mutant Tanks Version", FCVAR_DONTRECORD|FCVAR_NOTIFY|FCVAR_REPLICATED|FCVAR_SPONLY); @@ -5697,6 +7021,7 @@ void vRegisterConVars() vSetupConVar(g_esGeneral.g_cvMTDisabledGameModes, "mt_disabledgamemodes", "", "Disable Mutant Tanks in these game modes.\nSeparate by commas.\nEmpty: None\nNot empty: Disabled only in these game modes.", FCVAR_NOTIFY); vSetupConVar(g_esGeneral.g_cvMTEnabledGameModes, "mt_enabledgamemodes", "", "Enable Mutant Tanks in these game modes.\nSeparate by commas.\nEmpty: All\nNot empty: Enabled only in these game modes.", FCVAR_NOTIFY); vSetupConVar(g_esGeneral.g_cvMTGameModeTypes, "mt_gamemodetypes", "0", "Enable Mutant Tanks in these game mode types.\n0 OR 15: All game mode types.\n1: Co-Op modes only.\n2: Versus modes only.\n4: Survival modes only.\n8: Scavenge modes only. (Only available in Left 4 Dead 2.)", FCVAR_NOTIFY, true, 0.0, true, 15.0); + vSetupConVar(g_esGeneral.g_cvMTGraphicsLevel, "mt_graphicslevel", "3", "Sets the graphics level of the plugin to help with server performance.\n0: OFF\n1: Low\n2: Medium\n3: High", FCVAR_NOTIFY, true, 0.0, true, 3.0); vSetupConVar(g_esGeneral.g_cvMTListenSupport, "mt_listensupport", (g_bDedicated ? "0" : "1"), "Enable Mutant Tanks on listen servers.\n0: OFF\n1: ON", FCVAR_NOTIFY, true, 0.0, true, 1.0); vSetupConVar(g_esGeneral.g_cvMTPluginEnabled, "mt_pluginenabled", "1", "Enable Mutant Tanks.\n0: OFF\n1: ON", FCVAR_NOTIFY, true, 0.0, true, 1.0); CreateConVar("mt_pluginversion", MT_VERSION, "Mutant Tanks Version", FCVAR_DONTRECORD|FCVAR_NOTIFY|FCVAR_REPLICATED|FCVAR_SPONLY); @@ -5704,7 +7029,7 @@ void vRegisterConVars() #endif g_esGeneral.g_cvMTAssaultRifleAmmo = FindConVar("ammo_assaultrifle_max"); - g_esGeneral.g_cvMTAutoShotgunAmmo = g_bSecondGame ? FindConVar("ammo_autoshotgun_max") : FindConVar("ammo_buckshot_max"); + g_esGeneral.g_cvMTAutoShotgunAmmo = (g_bSecondGame ? FindConVar("ammo_autoshotgun_max") : FindConVar("ammo_buckshot_max")); g_esGeneral.g_cvMTBlind = FindConVar("nb_blind"); g_esGeneral.g_cvMTCommonLimit = FindConVar("z_common_limit"); g_esGeneral.g_cvMTDifficulty = FindConVar("z_difficulty"); @@ -5720,8 +7045,9 @@ void vRegisterConVars() g_esGeneral.g_cvMTGunSwingInterval = FindConVar("z_gun_swing_interval"); g_esGeneral.g_cvMTGunVerticalPunch = FindConVar("z_gun_vertical_punch"); g_esGeneral.g_cvMTPainPillsDecayRate = FindConVar("pain_pills_decay_rate"); + g_esGeneral.g_cvMTPainPillsHealthValue = FindConVar("pain_pills_health_value"); g_esGeneral.g_cvMTPipeBombDuration = FindConVar("pipe_bomb_timer_duration"); - g_esGeneral.g_cvMTShotgunAmmo = g_bSecondGame ? FindConVar("ammo_shotgun_max") : FindConVar("ammo_buckshot_max"); + g_esGeneral.g_cvMTShotgunAmmo = (g_bSecondGame ? FindConVar("ammo_shotgun_max") : FindConVar("ammo_buckshot_max")); g_esGeneral.g_cvMTSMGAmmo = FindConVar("ammo_smg_max"); g_esGeneral.g_cvMTSniperRifleAmmo = FindConVar("ammo_sniperrifle_max"); g_esGeneral.g_cvMTSurvivorMaxIncapCount = FindConVar("survivor_max_incapacitated_count"); @@ -5733,6 +7059,7 @@ void vRegisterConVars() if (g_bSecondGame) { + g_esGeneral.g_cvMTAdrenalineDuration = FindConVar("adrenaline_duration"); g_esGeneral.g_cvMTAmmoPackUseDuration = FindConVar("ammo_pack_use_duration"); g_esGeneral.g_cvMTColaBottlesUseDuration = FindConVar("cola_bottles_use_duration"); g_esGeneral.g_cvMTDefibrillatorUseDuration = FindConVar("defibrillator_use_duration"); @@ -5880,8 +7207,8 @@ void vSetHealPercentCvar(bool reset, int survivor = 0) } else { - bool bDeveloper = bIsDeveloper(survivor, 6); - if (bDeveloper || (g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_HEALTH)) + bool bDeveloper = bIsDeveloper(survivor, 8); + if (bDeveloper || (g_esShooter[survivor].g_iTotalPassives & MT_PASSIVE_HEALTH) || (g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_HEALTH)) { float flPercent = (bDeveloper && g_esDeveloper[survivor].g_flDevHealPercent > g_esPlayer[survivor].g_flHealPercent) ? g_esDeveloper[survivor].g_flDevHealPercent : g_esPlayer[survivor].g_flHealPercent; if (flPercent > 0.0) @@ -5896,7 +7223,7 @@ void vSetHealPercentCvar(bool reset, int survivor = 0) void vSetReviveDurationCvar(int survivor) { bool bDeveloper = bIsDeveloper(survivor, 6); - if (bDeveloper || (g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_ATTACKBOOST)) + if (bDeveloper || (((g_esShooter[survivor].g_iTotalPassives & MT_PASSIVE_ATTACKBOOST) || (g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_ATTACKBOOST)) && g_esPlayer[survivor].g_flActionDuration > 0.0)) { float flDuration = (bDeveloper && g_esDeveloper[survivor].g_flDevActionDuration > g_esPlayer[survivor].g_flActionDuration) ? g_esDeveloper[survivor].g_flDevActionDuration : g_esPlayer[survivor].g_flActionDuration; if (flDuration > 0.0) @@ -5992,7 +7319,7 @@ void vUpdateCvar(ConVar convar, const char[] oldValue, const char[] newValue) for (int iPlayer = 1; iPlayer <= MaxClients; iPlayer++) { - if (bIsHumanSurvivor(iPlayer) && (bIsDeveloper(iPlayer, 4) || ((g_esPlayer[iPlayer].g_iRewardTypes & MT_REWARD_DAMAGEBOOST) && g_esPlayer[iPlayer].g_iRecoilDampener == 1))) + if (bIsHumanSurvivor(iPlayer) && (bIsDeveloper(iPlayer, 4) || (((g_esShooter[iPlayer].g_iTotalPassives & MT_PASSIVE_DAMAGEBOOST) || (g_esPlayer[iPlayer].g_iRewardTypes & MT_REWARD_DAMAGEBOOST)) && g_esPlayer[iPlayer].g_iRecoilDampener == 1))) { vToggleWeaponVerticalPunch(iPlayer, true); } @@ -6303,7 +7630,7 @@ void vConfigMenu(int admin, int item = 0) g_esGeneral.g_alSections.GetString(iPos, sSection, sizeof sSection); if (sSection[0] != '\0') { - switch (!strncmp(sSection, "Plugin", 6, false) || !strncmp(sSection, MT_CONFIG_SECTION_SETTINGS4, strlen(MT_CONFIG_SECTION_SETTINGS4), false) || !strncmp(sSection, "STEAM_", 6, false) || (!strncmp(sSection, "[U:", 3) && sSection[strlen(sSection) - 1] == ']') || StrEqual(sSection, "all", false) || FindCharInString(sSection, ',') != -1 || FindCharInString(sSection, '-') != -1) + switch (!strncmp(sSection, "Plugin", 6, false) || !strncmp(sSection, "Surv", 4, false) || !strncmp(sSection, MT_CONFIG_SECTION_SETTINGS4, strlen(MT_CONFIG_SECTION_SETTINGS4), false) || !strncmp(sSection, "STEAM_", 6, false) || (!strncmp(sSection, "[U:", 3) && sSection[strlen(sSection) - 1] == ']') || StrEqual(sSection, "all", false) || FindCharInString(sSection, ',') != -1 || FindCharInString(sSection, '-') != -1) { case true: mConfigMenu.AddItem(sSection, sSection); case false: @@ -6363,7 +7690,7 @@ int iConfigMenuHandler(Menu menu, MenuAction action, int param1, int param2) char sInfo[PLATFORM_MAX_PATH]; menu.GetItem(param2, sInfo, sizeof sInfo); - switch (!strncmp(sInfo, "Plugin", 6, false) || !strncmp(sInfo, MT_CONFIG_SECTION_SETTINGS4, strlen(MT_CONFIG_SECTION_SETTINGS4), false) || !strncmp(sInfo, "STEAM_", 6, false) || (!strncmp(sInfo, "[U:", 3) && sInfo[strlen(sInfo) - 1] == ']') || StrEqual(sInfo, "all", false) || FindCharInString(sInfo, ',') != -1 || FindCharInString(sInfo, '-') != -1) + switch (!strncmp(sInfo, "Plugin", 6, false) || !strncmp(sInfo, "Surv", 4, false) || !strncmp(sInfo, MT_CONFIG_SECTION_SETTINGS4, strlen(MT_CONFIG_SECTION_SETTINGS4), false) || !strncmp(sInfo, "STEAM_", 6, false) || (!strncmp(sInfo, "[U:", 3) && sInfo[strlen(sInfo) - 1] == ']') || StrEqual(sInfo, "all", false) || FindCharInString(sInfo, ',') != -1 || FindCharInString(sInfo, '-') != -1) { case true: g_esGeneral.g_sSection = sInfo; case false: @@ -6437,6 +7764,12 @@ void vDeveloperPanel(int developer, int page = 0) FormatEx(sDisplay, sizeof sDisplay, "Action Duration: %.2f second(s)", g_esDeveloper[developer].g_flDevActionDuration); pDevPanel.DrawText(sDisplay); + if (g_bSecondGame) + { + FormatEx(sDisplay, sizeof sDisplay, "Adrenaline Time: %.2f second(s)", g_esDeveloper[developer].g_flDevAdrenalineTime); + pDevPanel.DrawText(sDisplay); + } + FormatEx(sDisplay, sizeof sDisplay, "Ammo Regen: %i Bullet/s", g_esDeveloper[developer].g_iDevAmmoRegen); pDevPanel.DrawText(sDisplay); #if defined _WeaponHandling_included @@ -6449,20 +7782,30 @@ void vDeveloperPanel(int developer, int page = 0) FormatEx(sDisplay, sizeof sDisplay, "Cluster Bomb(s): %i (Max: 5)", g_esDeveloper[developer].g_iDevClusterBombs); pDevPanel.DrawText(sDisplay); - - flValue = g_esDeveloper[developer].g_flDevDamageBoost; - FormatEx(sDisplay, sizeof sDisplay, "Damage Boost: +%.2f%% (%.2f)", ((flValue * 100.0) - 100.0), flValue); - pDevPanel.DrawText(sDisplay); } case 1: { + flValue = g_esDeveloper[developer].g_flDevDamageBoost; + FormatEx(sDisplay, sizeof sDisplay, "Damage Boost: +%.2f%% (%.2f)", ((flValue * 100.0) - 100.0), flValue); + pDevPanel.DrawText(sDisplay); + flValue = g_esDeveloper[developer].g_flDevDamageResistance; FormatEx(sDisplay, sizeof sDisplay, "Damage Resistance: %.2f%% (%.2f)", ((flValue * 100.0) - 100.0), flValue); pDevPanel.DrawText(sDisplay); + if (g_bSecondGame) + { + FormatEx(sDisplay, sizeof sDisplay, "Dopamine Radius: %.2f%%", g_esDeveloper[developer].g_flDevDopamineRadius); + pDevPanel.DrawText(sDisplay); + } + FormatEx(sDisplay, sizeof sDisplay, "Fall Scream Voiceline: %s", g_esDeveloper[developer].g_sDevFallVoiceline); pDevPanel.DrawText(sDisplay); - +#if defined _WeaponHandling_included + flValue = g_esDeveloper[developer].g_flDevFireRate; + FormatEx(sDisplay, sizeof sDisplay, "Fire Rate: +%.2f%% (%.2f)", ((flValue * 100.0) - 100.0), flValue); + pDevPanel.DrawText(sDisplay); +#endif FormatEx(sDisplay, sizeof sDisplay, "Flashlight Color: %s", g_esDeveloper[developer].g_sDevFlashlight); pDevPanel.DrawText(sDisplay); @@ -6471,42 +7814,65 @@ void vDeveloperPanel(int developer, int page = 0) FormatEx(sDisplay, sizeof sDisplay, "Glow Outline: %s", g_esDeveloper[developer].g_sDevGlowOutline); pDevPanel.DrawText(sDisplay); } + } + case 2: + { + FormatEx(sDisplay, sizeof sDisplay, "Grenade Launcher: %.2f%%", g_esDeveloper[developer].g_flDevGrenadeLauncher); + pDevPanel.DrawText(sDisplay); flValue = g_esDeveloper[developer].g_flDevHealPercent; FormatEx(sDisplay, sizeof sDisplay, "Heal Percentage: %.2f%% (%.2f)", flValue, (flValue / 100.0)); pDevPanel.DrawText(sDisplay); + FormatEx(sDisplay, sizeof sDisplay, "Healthcare Radius: %.2f%%", g_esDeveloper[developer].g_flDevHealthcareRadius); + pDevPanel.DrawText(sDisplay); + FormatEx(sDisplay, sizeof sDisplay, "Health Regen: %i HP/s", g_esDeveloper[developer].g_iDevHealthRegen); pDevPanel.DrawText(sDisplay); FormatEx(sDisplay, sizeof sDisplay, "Infinite Ammo Slots: %i (0: OFF, 31: ALL)", g_esDeveloper[developer].g_iDevInfiniteAmmo); pDevPanel.DrawText(sDisplay); - } - case 2: - { + FormatEx(sDisplay, sizeof sDisplay, "Jump Height: %.2f HMU (Dashes: %i)", g_esDeveloper[developer].g_flDevJumpHeight, g_esDeveloper[developer].g_iDevMidairDashes); pDevPanel.DrawText(sDisplay); + FormatEx(sDisplay, sizeof sDisplay, "Lady Killer: %.2f%%", g_esDeveloper[developer].g_flDevLadyKiller); + pDevPanel.DrawText(sDisplay); + } + case 3: + { FormatEx(sDisplay, sizeof sDisplay, "Life Leech: %i HP/Hit", g_esDeveloper[developer].g_iDevLifeLeech); pDevPanel.DrawText(sDisplay); FormatEx(sDisplay, sizeof sDisplay, "Loadout: %s", g_esDeveloper[developer].g_sDevLoadout); pDevPanel.DrawText(sDisplay); - FormatEx(sDisplay, sizeof sDisplay, "Medical Cuts: %i HPS", g_esDeveloper[developer].g_iDevMedicalCuts); - pDevPanel.DrawText(sDisplay); + if (g_bSecondGame) + { + FormatEx(sDisplay, sizeof sDisplay, "Medical Cuts: %i HPS", g_esDeveloper[developer].g_iDevMedicalCuts); + pDevPanel.DrawText(sDisplay); + + FormatEx(sDisplay, sizeof sDisplay, "Melee Range: %i HMU", g_esDeveloper[developer].g_iDevMeleeRange); + pDevPanel.DrawText(sDisplay); + } - FormatEx(sDisplay, sizeof sDisplay, "Melee Range: %i HMU", g_esDeveloper[developer].g_iDevMeleeRange); + FormatEx(sDisplay, sizeof sDisplay, "Motivation Radius: %.2f%%", g_esDeveloper[developer].g_flDevMotivationRadius); pDevPanel.DrawText(sDisplay); - FormatEx(sDisplay, sizeof sDisplay, "Overhealth: ~%i HP", g_esDeveloper[developer].g_iDevOverhealth); + FormatEx(sDisplay, sizeof sDisplay, "Overdose Radius: %.2f%%", g_esDeveloper[developer].g_flDevOverdoseRadius); pDevPanel.DrawText(sDisplay); - FormatEx(sDisplay, sizeof sDisplay, "Particle Effect(s): %i", g_esDeveloper[developer].g_iDevParticle); + FormatEx(sDisplay, sizeof sDisplay, "Overhealth: ~%i HP", g_esDeveloper[developer].g_iDevOverhealth); pDevPanel.DrawText(sDisplay); } - case 3: + case 4: { + FormatEx(sDisplay, sizeof sDisplay, "Particle Effect(s): %i", g_esDeveloper[developer].g_iDevParticle); + pDevPanel.DrawText(sDisplay); + + FormatEx(sDisplay, sizeof sDisplay, "Passive Type(s): %i", g_esDeveloper[developer].g_iDevPassiveTypes); + pDevPanel.DrawText(sDisplay); + FormatEx(sDisplay, sizeof sDisplay, "Pipe Bomb Duration: %.2f", g_esDeveloper[developer].g_flDevPipeBombDuration); pDevPanel.DrawText(sDisplay); @@ -6519,7 +7885,14 @@ void vDeveloperPanel(int developer, int page = 0) FormatEx(sDisplay, sizeof sDisplay, "Regen Bursts: %i HPS", g_esDeveloper[developer].g_iDevRegenBursts); pDevPanel.DrawText(sDisplay); - +#if defined _WeaponHandling_included + flValue = g_esDeveloper[developer].g_flDevReloadRate; + FormatEx(sDisplay, sizeof sDisplay, "Reload Rate: +%.2f%% (%.2f)", ((flValue * 100.0) - 100.0), flValue); + pDevPanel.DrawText(sDisplay); +#endif + } + case 5: + { FormatEx(sDisplay, sizeof sDisplay, "Revive Health: %i HP", g_esDeveloper[developer].g_iDevReviveHealth); pDevPanel.DrawText(sDisplay); @@ -6528,9 +7901,13 @@ void vDeveloperPanel(int developer, int page = 0) FormatEx(sDisplay, sizeof sDisplay, "Reward Type(s): %i", g_esDeveloper[developer].g_iDevRewardTypes); pDevPanel.DrawText(sDisplay); - } - case 4: - { + + if (g_bSecondGame) + { + FormatEx(sDisplay, sizeof sDisplay, "Shockwave Radius: %.2f%%", g_esDeveloper[developer].g_flDevShockwaveRadius); + pDevPanel.DrawText(sDisplay); + } + flValue = g_esDeveloper[developer].g_flDevShoveDamage; FormatEx(sDisplay, sizeof sDisplay, "Shove Damage: %.2f%% (%.2f)", (flValue * 100.0), flValue); pDevPanel.DrawText(sDisplay); @@ -6544,14 +7921,20 @@ void vDeveloperPanel(int developer, int page = 0) FormatEx(sDisplay, sizeof sDisplay, "Special Ammo Type(s): %i (1: Incendiary, 2: Explosive, 3: Random)", g_esDeveloper[developer].g_iDevSpecialAmmo); pDevPanel.DrawText(sDisplay); } - + } + case 6: + { flValue = g_esDeveloper[developer].g_flDevSpeedBoost; FormatEx(sDisplay, sizeof sDisplay, "Speed Boost: x%.2f%% (%.2f)", ((flValue * 100.0) - 100.0), flValue); pDevPanel.DrawText(sDisplay); FormatEx(sDisplay, sizeof sDisplay, "Survivor Skin Color: %s", g_esDeveloper[developer].g_sDevSkinColor); pDevPanel.DrawText(sDisplay); - +#if defined _WeaponHandling_included + flValue = g_esDeveloper[developer].g_flDevSwingRate; + FormatEx(sDisplay, sizeof sDisplay, "Swing Rate: +%.2f%% (%.2f)", ((flValue * 100.0) - 100.0), flValue); + pDevPanel.DrawText(sDisplay); +#endif FormatEx(sDisplay, sizeof sDisplay, "Syringe Darts: %i HPS", g_esDeveloper[developer].g_iDevSyringeDarts); pDevPanel.DrawText(sDisplay); @@ -6622,40 +8005,52 @@ void vListDeveloperCodes(int developer) MT_ReplyToCommand(developer, "%s Developer Perk Keywords:", MT_TAG5); MT_ReplyToCommand(developer, "%s Access Level:{mint} access{default} /{mint} dev{default} /{mint} level{default} ({olive}Min: 0{default},{olive} Max: 4095{default})", MT_TAG2); MT_ReplyToCommand(developer, "%s Action Duration:{mint} action{default} /{mint} actdur", MT_TAG2); + MT_ReplyToCommand(developer, "%s Adrenaline Time:{mint} adrenaline{default} /{mint} shot", MT_TAG2); MT_ReplyToCommand(developer, "%s Ammo Regen:{mint} ammoregen{default} /{mint} regenammo", MT_TAG2); MT_ReplyToCommand(developer, "%s Attack Boost:{mint} attack", MT_TAG2); MT_ReplyToCommand(developer, "%s Blaze Health:{mint} blazehp{default} /{mint} firehp", MT_TAG2); - MT_ReplyToCommand(developer, "%s Cluster Bomb(s):{mint} cluster{default} /{mint} grenade{default} (Max:{olive} 5{default})", MT_TAG2); + MT_ReplyToCommand(developer, "%s Cluster Bomb(s):{mint} cluster{default} /{mint} bomb{default} (Max:{olive} 5{default})", MT_TAG2); MT_ReplyToCommand(developer, "%s Damage Boost:{mint} dmgboost{default} /{mint} damageboost", MT_TAG2); MT_ReplyToCommand(developer, "%s Damage Resistance:{mint} dmgres{default} /{mint} damageres", MT_TAG2); + MT_ReplyToCommand(developer, "%s Dopamine Radius:{mint} dopamine{default} /{mint} rush", MT_TAG2); MT_ReplyToCommand(developer, "%s Fall Scream Voiceline:{mint} fall{default} /{mint} scream", MT_TAG2); + MT_ReplyToCommand(developer, "%s Fire Rate:{mint} firerate{default} /{mint} frate", MT_TAG2); MT_ReplyToCommand(developer, "%s Flashlight Color:{mint} light{default} /{mint} flash", MT_TAG2); MT_ReplyToCommand(developer, "%s Glow Outline:{mint} glow{default} /{mint} outline", MT_TAG2); + MT_ReplyToCommand(developer, "%s Grenade Launcher:{mint} grenade{default} /{mint} launcher", MT_TAG2); MT_ReplyToCommand(developer, "%s Heal Percentage:{mint} healper{default} /{mint} hppercent", MT_TAG2); + MT_ReplyToCommand(developer, "%s Healthcare Radius:{mint} healthcare{default} /{mint} hpcare{default} /{mint} medkit", MT_TAG2); MT_ReplyToCommand(developer, "%s Health Regen:{mint} hpregen{default} /{mint} regenhp", MT_TAG2); MT_ReplyToCommand(developer, "%s Tank HUD:{mint} hud", MT_TAG2); MT_ReplyToCommand(developer, "%s Infinite Ammo Slots:{mint} infammo{default} /{mint} infinite{default} ({olive}0: OFF{default},{olive} 31: ALL{default})", MT_TAG2); MT_ReplyToCommand(developer, "%s Jump Height:{mint} jump{default} /{mint} height", MT_TAG2); + MT_ReplyToCommand(developer, "%s Lady Killer:{mint} lady{default} /{mint} killer", MT_TAG2); MT_ReplyToCommand(developer, "%s Life Leech:{mint} leech{default} /{mint} life", MT_TAG2); MT_ReplyToCommand(developer, "%s Loadout:{mint} loadout{default} /{mint} weapon", MT_TAG2); MT_ReplyToCommand(developer, "%s Medical Cuts:{mint} medic{default} /{mint} medcuts /{mint} meleehp", MT_TAG2); - MT_ReplyToCommand(developer, "%s Melee Range:{mint} long{default} /{mint} range", MT_TAG2); + MT_ReplyToCommand(developer, "%s Melee Range:{mint} longmelee{default} /{mint} range", MT_TAG2); MT_ReplyToCommand(developer, "%s Midair Dashes:{mint} midair{default} /{mint} dash", MT_TAG2); + MT_ReplyToCommand(developer, "%s Motivation Radius:{mint} motiv", MT_TAG2); + MT_ReplyToCommand(developer, "%s Overdose Radius:{mint} overdose{default} /{mint} pills", MT_TAG2); MT_ReplyToCommand(developer, "%s Overhealth:{mint} overheal{default} /{mint} extrahp", MT_TAG2); MT_ReplyToCommand(developer, "%s Particle Effect(s):{mint} effect{default} /{mint} particle", MT_TAG2); - MT_ReplyToCommand(developer, "%s Pipe Bomb Duration:{mint} pipe{default} /{mint} bomb{default} /{mint} pipedur", MT_TAG2); + MT_ReplyToCommand(developer, "%s Passive Type(s):{mint} pstypes{default} /{mint} passtypes", MT_TAG2); + MT_ReplyToCommand(developer, "%s Pipe Bomb Duration:{mint} pipe{default} /{mint} pipedur", MT_TAG2); MT_ReplyToCommand(developer, "%s Punch Resistance:{mint} punch{default} /{mint} punchres", MT_TAG2); MT_ReplyToCommand(developer, "%s Rapid Pistol Fire Rate:{mint} rapid{default} /{mint} pistol{default} /{mint} aprate", MT_TAG2); - MT_ReplyToCommand(developer, "%s Regen Bursts:{mint} bursthp{default} /{mint} regburst /{mint} blasthp", MT_TAG2); + MT_ReplyToCommand(developer, "%s Regen Bursts:{mint} bursthp{default} /{mint} regbursts /{mint} blasthp", MT_TAG2); + MT_ReplyToCommand(developer, "%s Reload Rate:{mint} reload{default} /{mint} relrate", MT_TAG2); MT_ReplyToCommand(developer, "%s Revive Health:{mint} revivehp{default} /{mint} hprevive", MT_TAG2); MT_ReplyToCommand(developer, "%s Reward Duration:{mint} rdur{default} /{mint} rewarddur", MT_TAG2); MT_ReplyToCommand(developer, "%s Reward Type(s):{mint} rtypes{default} /{mint} rewardtypes", MT_TAG2); + MT_ReplyToCommand(developer, "%s Shockwave Radius:{mint} defib{default} /{mint} shock", MT_TAG2); MT_ReplyToCommand(developer, "%s Shove Damage:{mint} sdmg{default} /{mint} shovedmg", MT_TAG2); MT_ReplyToCommand(developer, "%s Shove Rate:{mint} srate{default} /{mint} shoverate", MT_TAG2); MT_ReplyToCommand(developer, "%s Stuck:{mint} stuck{default} /{mint} repos", MT_TAG2); MT_ReplyToCommand(developer, "%s Special Ammo Type(s):{mint} specammo{default} /{mint} special{default} ({olive}1: Incendiary{default},{olive} 2: Explosive{default},{olive} 3: Random{default})", MT_TAG2); MT_ReplyToCommand(developer, "%s Speed Boost:{mint} speed{default} /{mint} run{default} /{mint} move", MT_TAG2); MT_ReplyToCommand(developer, "%s Survivor Skin Color:{mint} survskin{default} /{mint} color", MT_TAG2); + MT_ReplyToCommand(developer, "%s Swing Rate:{mint} swing{default} /{mint} swrate", MT_TAG2); MT_ReplyToCommand(developer, "%s Syringe Darts:{mint} syringe{default} /{mint} dart /{mint} bullethp", MT_TAG2); MT_ReplyToCommand(developer, "%s Voice Pitch:{mint} voice{default} /{mint} pitch", MT_TAG2); MT_ReplyToCommand(developer, "%s Weapon Skin:{mint} wepskin{default} /{mint} skin", MT_TAG2); @@ -6787,7 +8182,7 @@ void vHudPanel(int developer, int page = 0) { bHuman = bIsValidClient(iTank, MT_CHECK_FAKECLIENT); iType = g_esPlayer[iTank].g_iTankType; - vGetTranslatedName(sTankName, sizeof sTankName, iTank); + vGetTankTranslatedName(sTankName, sizeof sTankName, iTank, .survivor = g_esShooter[iTank].g_bSurvivor, .character = g_esShooter[iTank].g_iCharacter); SetGlobalTransTarget(developer); FormatEx(sRealName, sizeof sRealName, "%T", "MTItem", developer, sTankName, iType, g_esTank[iType].g_iRealType[0]); @@ -7318,7 +8713,7 @@ void vTankMenu(int admin, bool adminmenu = false, int item = 0) continue; } - vGetTranslatedName(sTankName, sizeof sTankName, .type = iIndex, .specType = iSpecType); + vGetTankTranslatedName(sTankName, sizeof sTankName, .type = iIndex, .specType = iSpecType); SetGlobalTransTarget(admin); FormatEx(sMenuItem, sizeof sMenuItem, "%T", "MTItem", admin, sTankName, iType, iIndex); IntToString(iIndex, sIndex, sizeof sIndex); @@ -7365,7 +8760,7 @@ void vSmokerMenu(int admin, bool adminmenu = false, int item = 0) continue; } - vGetTranslatedName(sSmokerName, sizeof sSmokerName, .type = iIndex, .specType = iSpecType); + vGetTankTranslatedName(sSmokerName, sizeof sSmokerName, .type = iIndex, .specType = iSpecType); SetGlobalTransTarget(admin); FormatEx(sMenuItem, sizeof sMenuItem, "%T", "MTItemSmoker", admin, sSmokerName, iType, iIndex); IntToString(iIndex, sIndex, sizeof sIndex); @@ -7412,7 +8807,7 @@ void vBoomerMenu(int admin, bool adminmenu = false, int item = 0) continue; } - vGetTranslatedName(sBoomerName, sizeof sBoomerName, .type = iIndex, .specType = iSpecType); + vGetTankTranslatedName(sBoomerName, sizeof sBoomerName, .type = iIndex, .specType = iSpecType); SetGlobalTransTarget(admin); FormatEx(sMenuItem, sizeof sMenuItem, "%T", "MTItemBoomer", admin, sBoomerName, iType, iIndex); IntToString(iIndex, sIndex, sizeof sIndex); @@ -7459,7 +8854,7 @@ void vHunterMenu(int admin, bool adminmenu = false, int item = 0) continue; } - vGetTranslatedName(sHunterName, sizeof sHunterName, .type = iIndex, .specType = iSpecType); + vGetTankTranslatedName(sHunterName, sizeof sHunterName, .type = iIndex, .specType = iSpecType); SetGlobalTransTarget(admin); FormatEx(sMenuItem, sizeof sMenuItem, "%T", "MTItemHunter", admin, sHunterName, iType, iIndex); IntToString(iIndex, sIndex, sizeof sIndex); @@ -7506,7 +8901,7 @@ void vSpitterMenu(int admin, bool adminmenu = false, int item = 0) continue; } - vGetTranslatedName(sSpitterName, sizeof sSpitterName, .type = iIndex, .specType = iSpecType); + vGetTankTranslatedName(sSpitterName, sizeof sSpitterName, .type = iIndex, .specType = iSpecType); SetGlobalTransTarget(admin); FormatEx(sMenuItem, sizeof sMenuItem, "%T", "MTItemSpitter", admin, sSpitterName, iType, iIndex); IntToString(iIndex, sIndex, sizeof sIndex); @@ -7553,7 +8948,7 @@ void vJockeyMenu(int admin, bool adminmenu = false, int item = 0) continue; } - vGetTranslatedName(sJockeyName, sizeof sJockeyName, .type = iIndex, .specType = iSpecType); + vGetTankTranslatedName(sJockeyName, sizeof sJockeyName, .type = iIndex, .specType = iSpecType); SetGlobalTransTarget(admin); FormatEx(sMenuItem, sizeof sMenuItem, "%T", "MTItemJockey", admin, sJockeyName, iType, iIndex); IntToString(iIndex, sIndex, sizeof sIndex); @@ -7600,7 +8995,7 @@ void vChargerMenu(int admin, bool adminmenu = false, int item = 0) continue; } - vGetTranslatedName(sChargerName, sizeof sChargerName, .type = iIndex, .specType = iSpecType); + vGetTankTranslatedName(sChargerName, sizeof sChargerName, .type = iIndex, .specType = iSpecType); SetGlobalTransTarget(admin); FormatEx(sMenuItem, sizeof sMenuItem, "%T", "MTItemCharger", admin, sChargerName, iType, iIndex); IntToString(iIndex, sIndex, sizeof sIndex); @@ -8020,6 +9415,22 @@ void vEventHandler(Event event, const char[] name, bool dontBroadcast) vSetTankThrowInterval(iSpecial); } } + else if (StrEqual(name, "adrenaline_used")) + { + int iSurvivorId = event.GetInt("userid"), iSurvivor = GetClientOfUserId(iSurvivorId); + if (bIsSurvivor(iSurvivor)) + { + bool bDeveloper = bIsDeveloper(iSurvivor, 8); + if (bDeveloper || (g_esShooter[iSurvivor].g_iTotalPassives & MT_PASSIVE_HEALTH) || (g_esPlayer[iSurvivor].g_iRewardTypes & MT_REWARD_HEALTH)) + { + float flRadius = (bDeveloper && g_esDeveloper[iSurvivor].g_flDevDopamineRadius > g_esPlayer[iSurvivor].g_flDopamineRadius) ? g_esDeveloper[iSurvivor].g_flDevDopamineRadius : g_esPlayer[iSurvivor].g_flDopamineRadius; + if (flRadius > 0.0) + { + vSetupProximityReward(iSurvivor, iSurvivor, flRadius, 3, {255, 100, 100, 150}); + } + } + } + } else if (StrEqual(name, "bot_player_replace")) { int iBotId = event.GetInt("bot"), iBot = GetClientOfUserId(iBotId), @@ -8034,6 +9445,8 @@ void vEventHandler(Event event, const char[] name, bool dontBroadcast) { vRemoveSurvivorEffects(iBot); vSetupDeveloper(iPlayer, .usual = true); + vCopyInfectionStats(iBot, iPlayer); + vRemoveInfection(iBot); vCopySurvivorStats(iBot, iPlayer); vResetSurvivorStats(iBot, false); vToggleSurvivorEffects(iPlayer); @@ -8044,9 +9457,10 @@ void vEventHandler(Event event, const char[] name, bool dontBroadcast) { int iSpecialId = event.GetInt("userid"), iSpecial = GetClientOfUserId(iSpecialId), iSurvivorId = event.GetInt("victim"), iSurvivor = GetClientOfUserId(iSurvivorId); - if (bIsSpecialInfected(iSpecial) && bIsSurvivor(iSurvivor) && (bIsDeveloper(iSurvivor, 11) || (g_esPlayer[iSurvivor].g_iRewardTypes & MT_REWARD_GODMODE))) + if (bIsSpecialInfected(iSpecial) && bIsSurvivor(iSurvivor) && (bIsDeveloper(iSurvivor, 11) || (((g_esShooter[iSurvivor].g_iTotalPassives & MT_PASSIVE_GODMODE) || (g_esPlayer[iSurvivor].g_iRewardTypes & MT_REWARD_GODMODE)) && g_esPlayer[iSurvivor].g_iSafetyBubble == 1))) { vSaveCaughtSurvivor(iSurvivor, iSpecial); + EmitSoundToAll(SOUND_METAL, iSurvivor); } } else if (StrEqual(name, "create_panic_event")) @@ -8059,6 +9473,35 @@ void vEventHandler(Event event, const char[] name, bool dontBroadcast) g_esGeneral.g_hSurvivalTimer = CreateTimer(g_esGeneral.g_flSurvivalDelay, tTimerDelaySurvival); } } + else if (StrEqual(name, "dead_survivor_visible")) + { + int iSurvivorId = event.GetInt("deadplayer"), iSurvivor = GetClientOfUserId(iSurvivorId), + iBody = event.GetInt("subject"); + if (bIsValidClient(iSurvivor) && bIsValidEntity(iBody) && g_esShooter[iSurvivor].g_bDeathModel) + { + g_esInfected[iBody].g_iDeathModelOwner = GetClientUserId(iSurvivor); + g_esShooter[iSurvivor].g_iDeathModel = EntIndexToEntRef(iBody); + CreateTimer(g_esShooter[iSurvivor].g_flDeathModelDelay, tTimerHideDeathModel, g_esShooter[iSurvivor].g_iDeathModel, TIMER_FLAG_NO_MAPCHANGE); + g_esShooter[iSurvivor].g_flDeathModelDelay = 0.0; + } + } + else if (StrEqual(name, "defibrillator_used")) + { + int iSurvivorId = event.GetInt("userid"), iSurvivor = GetClientOfUserId(iSurvivorId), + iTargetId = event.GetInt("subject"), iTarget = GetClientOfUserId(iTargetId); + if (bIsSurvivor(iSurvivor) && bIsValidClient(iTarget)) + { + bool bDeveloper = bIsDeveloper(iSurvivor, 8); + if (bDeveloper || (g_esShooter[iSurvivor].g_iTotalPassives & MT_PASSIVE_HEALTH) || (g_esPlayer[iSurvivor].g_iRewardTypes & MT_REWARD_HEALTH)) + { + float flRadius = (bDeveloper && g_esDeveloper[iSurvivor].g_flDevShockwaveRadius > g_esPlayer[iSurvivor].g_flShockwaveRadius) ? g_esDeveloper[iSurvivor].g_flDevShockwaveRadius : g_esPlayer[iSurvivor].g_flShockwaveRadius; + if (flRadius > 0.0) + { + vSetupProximityReward(iSurvivor, iTarget, flRadius, 2, {80, 175, 255, 150}, MT_CHECK_INGAME); + } + } + } + } else if (StrEqual(name, "entity_shoved")) { int iSurvivorId = event.GetInt("attacker"), iSurvivor = GetClientOfUserId(iSurvivorId), @@ -8066,7 +9509,7 @@ void vEventHandler(Event event, const char[] name, bool dontBroadcast) if (bIsWitch(iWitch) && bIsSurvivor(iSurvivor)) { bool bDeveloper = bIsDeveloper(iSurvivor, 9); - if (bDeveloper || (g_esPlayer[iSurvivor].g_iRewardTypes & MT_REWARD_ATTACKBOOST)) + if (bDeveloper || (((g_esShooter[iSurvivor].g_iTotalPassives & MT_PASSIVE_ATTACKBOOST) || (g_esPlayer[iSurvivor].g_iRewardTypes & MT_REWARD_ATTACKBOOST)) && g_esPlayer[iSurvivor].g_flShoveDamage > 0.0)) { float flMultiplier = (bDeveloper && g_esDeveloper[iSurvivor].g_flDevShoveDamage > g_esPlayer[iSurvivor].g_flShoveDamage) ? g_esDeveloper[iSurvivor].g_flDevShoveDamage : g_esPlayer[iSurvivor].g_flShoveDamage; if (flMultiplier > 0.0) @@ -8085,6 +9528,7 @@ void vEventHandler(Event event, const char[] name, bool dontBroadcast) else if (StrEqual(name, "finale_vehicle_leaving")) { g_esGeneral.g_bFinaleEnded = true; + g_esGeneral.g_bRoundEnded = true; g_esGeneral.g_iTankWave = 4; vExecuteFinaleConfigs(name); @@ -8098,12 +9542,13 @@ void vEventHandler(Event event, const char[] name, bool dontBroadcast) vExecuteFinaleConfigs(name); g_esGeneral.g_iTankWave = 1; - g_esGeneral.g_bRushCountdown = g_esGeneral.g_iRushTypes > 0; + g_esGeneral.g_bRushCountdown = (g_esGeneral.g_iRushTypes > 0); } else if (StrEqual(name, "finale_win")) { + g_esMob.g_flBioMassMeter = MT_GetRandomFloat(0.0, 10000.0); + vExecuteFinaleConfigs(name); - vResetLadyKiller(true); } else if (StrEqual(name, "ghost_spawn_time")) { @@ -8121,7 +9566,7 @@ void vEventHandler(Event event, const char[] name, bool dontBroadcast) if (bIsSurvivor(iSurvivor)) { bool bDeveloper = bIsDeveloper(iSurvivor, 5) || bIsDeveloper(iSurvivor, 7); - if (bDeveloper || (g_esPlayer[iSurvivor].g_iRewardTypes & MT_REWARD_AMMO)) + if (bDeveloper || (g_esShooter[iSurvivor].g_iTotalPassives & MT_PASSIVE_AMMO) || (g_esPlayer[iSurvivor].g_iRewardTypes & MT_REWARD_AMMO)) { int iLimit = (bDeveloper && g_esDeveloper[iSurvivor].g_iDevClusterBombs > g_esPlayer[iSurvivor].g_iClusterBombs) ? g_esDeveloper[iSurvivor].g_iDevClusterBombs : g_esPlayer[iSurvivor].g_iClusterBombs; if (g_esGeneral.g_hSDKPipeBombProjectileCreate != null && iLimit > 0 && g_esPlayer[iSurvivor].g_iGrenadeCount < iLimit) @@ -8167,37 +9612,62 @@ void vEventHandler(Event event, const char[] name, bool dontBroadcast) } else if (StrEqual(name, "heal_success")) { - int iSurvivorId = event.GetInt("subject"), iSurvivor = GetClientOfUserId(iSurvivorId); - if (bIsSurvivor(iSurvivor)) + int iSurvivorId = event.GetInt("userid"), iSurvivor = GetClientOfUserId(iSurvivorId), + iTargetId = event.GetInt("subject"), iTarget = GetClientOfUserId(iTargetId); + if (bIsSurvivor(iSurvivor) && bIsSurvivor(iTarget)) { + bool bDeveloper = bIsDeveloper(iSurvivor, 8); + if (bDeveloper || (g_esShooter[iSurvivor].g_iTotalPassives & MT_PASSIVE_HEALTH) || (g_esPlayer[iSurvivor].g_iRewardTypes & MT_REWARD_HEALTH)) + { + float flRadius = (bDeveloper && g_esDeveloper[iSurvivor].g_flDevHealthcareRadius > g_esPlayer[iSurvivor].g_flHealthcareRadius) ? g_esDeveloper[iSurvivor].g_flDevHealthcareRadius : g_esPlayer[iSurvivor].g_flHealthcareRadius, + flRadius2 = (bDeveloper && g_esDeveloper[iTarget].g_flDevHealthcareRadius > g_esPlayer[iTarget].g_flHealthcareRadius) ? g_esDeveloper[iTarget].g_flDevHealthcareRadius : g_esPlayer[iTarget].g_flHealthcareRadius, + flFinalRadius = (flRadius > 0.0) ? flRadius : flRadius2; + + if (flFinalRadius > 0.0) + { + vSetupProximityReward(iSurvivor, iTarget, flFinalRadius, 1, {0, 255, 0, 150}); + } + } + g_esPlayer[iSurvivor].g_bLastLife[0] = false; g_esPlayer[iSurvivor].g_iReviveCount = 0; + if (g_esSurvivorCache[iSurvivor].g_iCarrierCleanse == 1) + { + vRemoveInfection(iSurvivor); + } + if (g_esGeneral.g_iRushTypes > 0 && g_esPlayer[iSurvivor].g_bLastLife[1]) { - vSetSurvivorLastLife(iSurvivor); + vSetSurvivorLastLife(iSurvivor, g_esGeneral.g_cvMTSurvivorMaxIncapCount.IntValue, false); } } } else if (StrEqual(name, "infected_hurt")) { int iSurvivorId = event.GetInt("attacker"), iSurvivor = GetClientOfUserId(iSurvivorId), - iWitch = event.GetInt("entityid"), iDamageType = event.GetInt("type"); - if (bIsSurvivor(iSurvivor) && bIsWitch(iWitch) && !g_esGeneral.g_bWitchKilled[iWitch]) + iInfected = event.GetInt("entityid"), iDamage = event.GetInt("amount"), + iDamageType = event.GetInt("type"); + + if (bIsSurvivor(iSurvivor) && iDamage > 0) { - bool bDeveloper = bIsDeveloper(iSurvivor, 11); - if (bDeveloper || (g_esPlayer[iSurvivor].g_iLadyKillerCount < g_esPlayer[iSurvivor].g_iLadyKillerLimit)) - { - g_esGeneral.g_bWitchKilled[iWitch] = true; + vSetupProcReward(iSurvivor); - SDKHooks_TakeDamage(iWitch, iSurvivor, iSurvivor, float(GetEntProp(iWitch, Prop_Data, "m_iHealth")), iDamageType); - EmitSoundToClient(iSurvivor, SOUND_LADYKILLER, iSurvivor, SNDCHAN_AUTO, SNDLEVEL_NORMAL); + if (bIsCommonInfectedSupported(iInfected)) + { + g_esInfected[iInfected].g_iDamageTaken += iDamage; + } - if (!bDeveloper) + if (bIsWitch(iInfected) && !g_esGeneral.g_bWitchKilled[iInfected] && (iDamageType & DMG_BLAST)) + { + bool bDeveloper = bIsDeveloper(iSurvivor, 11); + if (bDeveloper || g_esPlayer[iSurvivor].g_bLadyKiller) { - g_esPlayer[iSurvivor].g_iLadyKillerCount++; + g_esGeneral.g_bWitchKilled[iInfected] = true; + g_esPlayer[iSurvivor].g_bLadyKiller = false; - MT_PrintToChat(iSurvivor, "%s %t", MT_TAG2, "RewardLadyKiller2", (g_esPlayer[iSurvivor].g_iLadyKillerLimit - g_esPlayer[iSurvivor].g_iLadyKillerCount)); + SDKHooks_TakeDamage(iInfected, iSurvivor, iSurvivor, float(GetEntProp(iInfected, Prop_Data, "m_iHealth")), iDamageType); + EmitSoundToClient(iSurvivor, SOUND_LADYKILLER, iSurvivor, SNDCHAN_AUTO, SNDLEVEL_NORMAL); } } } @@ -8219,8 +9689,26 @@ void vEventHandler(Event event, const char[] name, bool dontBroadcast) } else if (StrEqual(name, "mission_lost")) { + g_esGeneral.g_bRoundEnded = true; + vResetRound(); } + else if (StrEqual(name, "pills_used")) + { + int iSurvivorId = event.GetInt("subject"), iSurvivor = GetClientOfUserId(iSurvivorId); + if (bIsSurvivor(iSurvivor)) + { + bool bDeveloper = bIsDeveloper(iSurvivor, 8); + if (bDeveloper || (g_esShooter[iSurvivor].g_iTotalPassives & MT_PASSIVE_HEALTH) || (g_esPlayer[iSurvivor].g_iRewardTypes & MT_REWARD_HEALTH)) + { + float flRadius = (bDeveloper && g_esDeveloper[iSurvivor].g_flDevOverdoseRadius > g_esPlayer[iSurvivor].g_flOverdoseRadius) ? g_esDeveloper[iSurvivor].g_flDevOverdoseRadius : g_esPlayer[iSurvivor].g_flOverdoseRadius; + if (flRadius > 0.0) + { + vSetupProximityReward(iSurvivor, iSurvivor, flRadius, 4, {255, 225, 100, 150}); + } + } + } + } else if (StrEqual(name, "player_bot_replace")) { int iPlayerId = event.GetInt("player"), iPlayer = GetClientOfUserId(iPlayerId), @@ -8235,6 +9723,8 @@ void vEventHandler(Event event, const char[] name, bool dontBroadcast) { vRemoveSurvivorEffects(iPlayer); vSetupDeveloper(iPlayer, false); + vCopyInfectionStats(iPlayer, iBot); + vRemoveInfection(iPlayer); vCopySurvivorStats(iPlayer, iBot); vResetSurvivorStats(iPlayer, false); vToggleSurvivorEffects(iBot); @@ -8251,7 +9741,9 @@ void vEventHandler(Event event, const char[] name, bool dontBroadcast) else if (StrEqual(name, "player_death")) { int iVictimId = event.GetInt("userid"), iVictim = GetClientOfUserId(iVictimId), - iAttackerId = event.GetInt("attacker"), iAttacker = GetClientOfUserId(iAttackerId); + iAttackerId = event.GetInt("attacker"), iAttacker = GetClientOfUserId(iAttackerId), + iVictimEntity = event.GetInt("entityid"); + if (bIsInfected(iVictim, MT_CHECK_INDEX|MT_CHECK_INGAME)) { g_esPlayer[iVictim].g_bDied = true; @@ -8300,7 +9792,7 @@ void vEventHandler(Event event, const char[] name, bool dontBroadcast) if (g_esPlayer[iRecipient].g_bLastLife[1]) { - vSetSurvivorLastLife(iRecipient); + vSetSurvivorLastLife(iRecipient, g_esGeneral.g_cvMTSurvivorMaxIncapCount.IntValue, false); } } else @@ -8317,20 +9809,20 @@ void vEventHandler(Event event, const char[] name, bool dontBroadcast) if (g_esPlayer[iVictim].g_iTankType > 0) { - if (g_esCache[iVictim].g_iDeathRevert == 1) + if (g_esTankCache[iVictim].g_iDeathRevert == 1) { int iType = g_esPlayer[iVictim].g_iTankType; vSetTankColor(iVictim, .revert = true); g_esPlayer[iVictim].g_iTankType = iType; } - vResetTank(iVictim, (g_esCache[iVictim].g_iDeathRevert == 1)); + vResetTank(iVictim, (g_esTankCache[iVictim].g_iDeathRevert == 1)); } int iCount = iGetTankCount(true); if (iCount <= 0) { - vResetTimers(); + vResetRegularWavesTimer(false); } } else if (bIsSurvivor(iVictim, MT_CHECK_INDEX|MT_CHECK_INGAME)) @@ -8347,14 +9839,14 @@ void vEventHandler(Event event, const char[] name, bool dontBroadcast) { g_esPlayer[iAttacker].g_iKillCount++; - if (g_esCache[iAttacker].g_iAnnounceKill == 1) + if (g_esTankCache[iAttacker].g_iAnnounceKill == 1) { - int iOption = iGetMessageType(g_esCache[iAttacker].g_iKillMessage); + int iOption = iGetMessageType(g_esTankCache[iAttacker].g_iKillMessage); if (iOption > 0) { char sPhrase[32], sTankName[64]; FormatEx(sPhrase, sizeof sPhrase, "Kill%i", iOption); - vGetTranslatedName(sTankName, sizeof sTankName, iAttacker); + vGetTankTranslatedName(sTankName, sizeof sTankName, iAttacker, .survivor = g_esShooter[iAttacker].g_bSurvivor, .character = g_esShooter[iAttacker].g_iCharacter); MT_PrintToChatAll("%s %t", MT_TAG2, sPhrase, sTankName, iVictim); vLogMessage(MT_LOG_LIFE, _, "%s %T", MT_TAG, sPhrase, LANG_SERVER, sTankName, iVictim); } @@ -8363,6 +9855,20 @@ void vEventHandler(Event event, const char[] name, bool dontBroadcast) vRemoveSurvivorEffects(iVictim, true); } + else if (bIsCommonInfectedSupported(iVictimEntity)) + { + if (g_esInfectedCache[iVictimEntity].g_flCommonDeathPoints > 0.0) + { + g_esMob.g_flBioMassMeter += g_esInfectedCache[iVictimEntity].g_flCommonDeathPoints; + g_esMob.g_flBioMassMeter = flClamp(g_esMob.g_flBioMassMeter, 0.0, float(MT_MAXHEALTH)); + } + + if (g_esInfectedCache[iVictimEntity].g_flCommonDamagePoints >= float(g_esInfected[iVictimEntity].g_iDamageTaken) > 0.0) + { + g_esMob.g_flBioMassMeter += g_esInfectedCache[iVictimEntity].g_flCommonDamagePoints; + g_esMob.g_flBioMassMeter = flClamp(g_esMob.g_flBioMassMeter, 0.0, float(MT_MAXHEALTH)); + } + } } else if (StrEqual(name, "player_first_spawn")) { @@ -8375,10 +9881,85 @@ void vEventHandler(Event event, const char[] name, bool dontBroadcast) else if (StrEqual(name, "player_hurt")) { int iVictimId = event.GetInt("userid"), iVictim = GetClientOfUserId(iVictimId), - iAttackerId = event.GetInt("attacker"), iAttacker = GetClientOfUserId(iAttackerId); + iAttackerId = event.GetInt("attacker"), iAttacker = GetClientOfUserId(iAttackerId), + iAttackerEntity = event.GetInt("attackerentid"), iDamage = event.GetInt("dmg_health"); + if (bIsInfected(iVictim) && !bIsPlayerIncapacitated(iVictim) && bIsSurvivor(iAttacker)) { - g_esPlayer[iAttacker].g_iTankDamage[iVictim] += event.GetInt("dmg_health"); + g_esPlayer[iAttacker].g_iTankDamage[iVictim] += iDamage; + + vSetupProcReward(iAttacker); + } + else if (bIsSurvivor(iVictim) && iDamage > 0) + { + bool bHuman = bIsValidClient(iVictim, MT_CHECK_FAKECLIENT); + int iEnabled = (bHuman ? g_esSurvivorCache[iVictim].g_iCarrierEnabled : g_esSurvivorCache[iVictim].g_iCarrierBots), + iInfection = g_esSurvivorCache[iVictim].g_iCarrierInfection; + + if (iEnabled > 0) + { + if (bIsInfected(iAttacker, MT_CHECK_INDEX|MT_CHECK_INGAME) && !bIsMutationUnpredictable(iAttacker) && g_esTank[g_esInfected[iAttacker].g_iTankType].g_iSpawnType <= 0) + { + int iBit = g_esPlayer[iAttacker].g_iInfectedType; + if (iInfection > 0 && !(iInfection & (1 << iBit))) + { + return; + } + + g_esShooter[iVictim].g_bInfected[g_esPlayer[iAttacker].g_iTankType] = true; + g_esShooter[iVictim].g_iLastSpecial = g_esPlayer[iAttacker].g_iInfectedType; + g_esShooter[iVictim].g_iLastType = g_esPlayer[iAttacker].g_iTankType; + + if (g_esShooter[iVictim].g_iFirstSpecial <= 0) + { + g_esShooter[iVictim].g_iFirstSpecial = g_esPlayer[iAttacker].g_iInfectedType; + } + + if (g_esShooter[iVictim].g_iFirstType <= 0) + { + g_esShooter[iVictim].g_iFirstType = g_esPlayer[iAttacker].g_iTankType; + } + + if (g_esShooter[iVictim].g_iMostDamage <= 0 || iDamage > g_esShooter[iVictim].g_iMostDamage) + { + g_esShooter[iVictim].g_iMostDamage = iDamage; + g_esShooter[iVictim].g_iMostSpecial = g_esPlayer[iAttacker].g_iInfectedType; + g_esShooter[iVictim].g_iMostType = g_esPlayer[iAttacker].g_iTankType; + } + + if (g_esShooter[iVictim].g_iLeastDamage <= 0 || iDamage < g_esShooter[iVictim].g_iLeastDamage) + { + g_esShooter[iVictim].g_iLeastDamage = iDamage; + g_esShooter[iVictim].g_iLeastSpecial = g_esPlayer[iAttacker].g_iInfectedType; + g_esShooter[iVictim].g_iLeastType = g_esPlayer[iAttacker].g_iTankType; + } + } + else if (bIsValidEntity(iAttackerEntity) && g_esTank[g_esInfected[iAttackerEntity].g_iTankType].g_iSpawnType <= 0) + { + if ((bIsCommonInfected(iAttackerEntity) && (iInfection == 0 || (iInfection & MT_SURVINF_COMMON))) || (bIsWitch(iAttackerEntity) && (iInfection == 0 || (iInfection & MT_SURVINF_WITCH)))) + { + g_esShooter[iVictim].g_bInfected[g_esInfected[iAttackerEntity].g_iTankType] = true; + g_esShooter[iVictim].g_iLastType = g_esInfected[iAttackerEntity].g_iTankType; + + if (g_esShooter[iVictim].g_iFirstType <= 0) + { + g_esShooter[iVictim].g_iFirstType = g_esInfected[iAttackerEntity].g_iTankType; + } + + if (g_esShooter[iVictim].g_iMostDamage <= 0 || iDamage > g_esShooter[iVictim].g_iMostDamage) + { + g_esShooter[iVictim].g_iMostDamage = iDamage; + g_esShooter[iVictim].g_iMostType = g_esInfected[iAttackerEntity].g_iTankType; + } + + if (g_esShooter[iVictim].g_iLeastDamage <= 0 || iDamage < g_esShooter[iVictim].g_iLeastDamage) + { + g_esShooter[iVictim].g_iLeastDamage = iDamage; + g_esShooter[iVictim].g_iLeastType = g_esInfected[iAttackerEntity].g_iTankType; + } + } + } + } } } else if (StrEqual(name, "player_incapacitated")) @@ -8440,7 +10021,7 @@ void vEventHandler(Event event, const char[] name, bool dontBroadcast) if ((bIsTank(iSpecial) || bIsCharger(iSpecial)) && bIsSurvivor(iSurvivor)) { bool bDeveloper = bIsDeveloper(iSurvivor, 9); - if (bDeveloper || (g_esPlayer[iSurvivor].g_iRewardTypes & MT_REWARD_ATTACKBOOST)) + if (bDeveloper || (((g_esShooter[iSurvivor].g_iTotalPassives & MT_PASSIVE_ATTACKBOOST) || (g_esPlayer[iSurvivor].g_iRewardTypes & MT_REWARD_ATTACKBOOST)) && g_esPlayer[iSurvivor].g_flShoveDamage > 0.0)) { float flMultiplier = (bDeveloper && g_esDeveloper[iSurvivor].g_flDevShoveDamage > g_esPlayer[iSurvivor].g_flShoveDamage) ? g_esDeveloper[iSurvivor].g_flDevShoveDamage : g_esPlayer[iSurvivor].g_flShoveDamage; if (flMultiplier > 0.0) @@ -8458,7 +10039,9 @@ void vEventHandler(Event event, const char[] name, bool dontBroadcast) bool bBlind = g_esGeneral.g_bBlindType; int iType = g_esGeneral.g_iChosenType; + g_esPlayer[iPlayer].g_bFinalFall = false; g_esPlayer[iPlayer].g_iInfectedType = iGetInfectedType(iPlayer); + if (g_esPlayer[iPlayer].g_iInfectedType > 0) { SDKUnhook(iPlayer, SDKHook_PostThinkPost, OnTankPostThinkPost); @@ -8492,21 +10075,38 @@ void vEventHandler(Event event, const char[] name, bool dontBroadcast) } else if (StrEqual(name, "revive_success")) { - int iSurvivorId = event.GetInt("subject"), iSurvivor = GetClientOfUserId(iSurvivorId); - if (bIsSurvivor(iSurvivor)) + int iSurvivorId = event.GetInt("userid"), iSurvivor = GetClientOfUserId(iSurvivorId), + iTargetId = event.GetInt("subject"), iTarget = GetClientOfUserId(iTargetId); + if (bIsSurvivor(iSurvivor) && bIsSurvivor(iTarget)) { - g_esPlayer[iSurvivor].g_bLastLife[0] = event.GetBool("lastlife"); - g_esPlayer[iSurvivor].g_iReviveCount++; - g_esPlayer[iSurvivor].g_iReviver = 0; + bool bDeveloper = bIsDeveloper(iSurvivor, 8); + if (bDeveloper || (g_esShooter[iSurvivor].g_iTotalPassives & MT_PASSIVE_HEALTH) || (g_esPlayer[iSurvivor].g_iRewardTypes & MT_REWARD_HEALTH)) + { + float flRadius = (bDeveloper && g_esDeveloper[iSurvivor].g_flDevMotivationRadius > g_esPlayer[iSurvivor].g_flMotivationRadius) ? g_esDeveloper[iSurvivor].g_flDevMotivationRadius : g_esPlayer[iSurvivor].g_flMotivationRadius, + flRadius2 = (bDeveloper && g_esDeveloper[iTarget].g_flDevMotivationRadius > g_esPlayer[iTarget].g_flMotivationRadius) ? g_esDeveloper[iTarget].g_flDevMotivationRadius : g_esPlayer[iTarget].g_flMotivationRadius, + flFinalRadius = (flRadius > 0.0) ? flRadius : flRadius2; - if (g_esGeneral.g_iRushTypes > 0 && g_esPlayer[iSurvivor].g_bLastLife[1]) + if (flFinalRadius > 0.0) + { + vSetupProximityReward(iSurvivor, iTarget, flFinalRadius, 7, {175, 100, 255, 150}); + } + } + + g_esPlayer[iTarget].g_bLastLife[0] = event.GetBool("lastlife"); + g_esPlayer[iTarget].g_iReviveCount++; + g_esPlayer[iTarget].g_iReviver = 0; + + if (g_esGeneral.g_iRushTypes > 0 && g_esPlayer[iTarget].g_bLastLife[1]) { - vSetSurvivorLastLife(iSurvivor); + vSetSurvivorLastLife(iTarget, g_esGeneral.g_cvMTSurvivorMaxIncapCount.IntValue, false); } } } else if (StrEqual(name, "round_end")) { + g_esGeneral.g_bRoundEnded = true; + + vResetElevatorsList(); vResetRound(); if (g_esGeneral.g_iRushTypes > 0) @@ -8520,11 +10120,25 @@ void vEventHandler(Event event, const char[] name, bool dontBroadcast) else if (StrEqual(name, "round_start")) { g_esGeneral.g_bNextRound = !!GameRules_GetProp("m_bInSecondHalfOfRound"); + g_esGeneral.g_bRoundEnded = false; + + vResetElevatorsList(); + + if (g_esGeneral.g_alElevators != null) + { + int iElevator = -1; + while ((iElevator = FindEntityByClassname(iElevator, "func_elevator")) != INVALID_ENT_REFERENCE) + { + g_esGeneral.g_alElevators.Push(EntIndexToEntRef(iElevator)); + } + } vResetRound(); } else if (StrEqual(name, "round_start_pre_entity")) { + g_esGeneral.g_bRoundEnded = false; + if (g_esGeneral.g_iRushTypes > 0) { vRespawnInfectedPlayers(false); @@ -8534,25 +10148,43 @@ void vEventHandler(Event event, const char[] name, bool dontBroadcast) { int iSurvivorId = event.GetInt("userid"), iSurvivor = GetClientOfUserId(iSurvivorId), iWeapon = event.GetInt("weapon"); - if (bIsSurvivor(iSurvivor) && (bIsDeveloper(iSurvivor, 6) || (g_esPlayer[iSurvivor].g_iRewardTypes & MT_REWARD_ATTACKBOOST)) && (iWeapon == 15 || iWeapon == 23)) + if (bIsSurvivor(iSurvivor) && (bIsDeveloper(iSurvivor, 6) || (g_esShooter[iSurvivor].g_iTotalPassives & MT_PASSIVE_ATTACKBOOST) || (g_esPlayer[iSurvivor].g_iRewardTypes & MT_REWARD_ATTACKBOOST)) && (iWeapon == 15 || iWeapon == 23)) { SDKHook(iSurvivor, SDKHook_WeaponCanSwitchTo, OnWeaponCanSwitchTo); } } else if (StrEqual(name, "witch_harasser_set")) { - int iHarasserId = event.GetInt("userid"), iHarasser = GetClientOfUserId(iHarasserId); + int iHarasserId = event.GetInt("userid"), iHarasser = GetClientOfUserId(iHarasserId), + iWitch = event.GetInt("witchid"); + if (bIsSurvivor(iHarasser, MT_CHECK_INDEX|MT_CHECK_INGAME) && bIsWitchSupported(iWitch)) + { + vMutateWitch(iWitch, MT_WITCHTRIGGER_STARTLED); + } + for (int iSurvivor = 1; iSurvivor <= MaxClients; iSurvivor++) { - if (bIsSurvivor(iSurvivor) && g_esPlayer[iSurvivor].g_iLadyKillerLimit > 0 && iSurvivor != iHarasser) + if (bIsSurvivor(iSurvivor) && g_esPlayer[iSurvivor].g_flLadyKiller > 0.0) { - MT_PrintToChat(iSurvivor, "%s %t", MT_TAG2, "RewardLadyKiller2", (g_esPlayer[iSurvivor].g_iLadyKillerLimit - g_esPlayer[iSurvivor].g_iLadyKillerCount)); + vSetupLadyKillerReminder(iSurvivor, (g_esPlayer[iSurvivor].g_flLadyKiller / 100.0), true); } } } else if (StrEqual(name, "witch_killed")) { - int iWitch = event.GetInt("witchid"); + bool bCrowned = event.GetBool("oneshot"); + int iAttackerId = event.GetInt("userid"), iAttacker = GetClientOfUserId(iAttackerId), + iWitch = event.GetInt("witchid"); + + if (bIsSurvivor(iAttacker, MT_CHECK_INDEX|MT_CHECK_INGAME) && bIsWitchSupported(iWitch)) + { + switch (bCrowned) + { + case true: vMutateWitch(iWitch, MT_WITCHTRIGGER_CROWNED); + case false: vMutateWitch(iWitch, MT_WITCHTRIGGER_KILLED); + } + } + g_esGeneral.g_bWitchKilled[iWitch] = false; } @@ -8566,13 +10198,13 @@ void vEventHandler(Event event, const char[] name, bool dontBroadcast) void vHookEvents(bool hook) { - static bool bHooked, bCheck[43]; + static bool bHooked, bCheck[47]; if (hook && !bHooked) { bHooked = true; bCheck[0] = HookEventEx("ability_use", vEventHandler); - bCheck[1] = HookEventEx("bot_player_replace", vEventHandler); + bCheck[1] = HookEventEx("bot_player_replace", vEventHandler, EventHookMode_Pre); bCheck[2] = HookEventEx("choke_start", vEventHandler); bCheck[3] = HookEventEx("create_panic_event", vEventHandler); bCheck[4] = HookEventEx("entity_shoved", vEventHandler); @@ -8586,37 +10218,41 @@ void vHookEvents(bool hook) bCheck[12] = HookEventEx("finale_win", vEventHandler); bCheck[13] = HookEventEx("ghost_spawn_time", vEventHandler); bCheck[14] = HookEventEx("grenade_bounce", vEventHandler); - bCheck[15] = HookEventEx("heal_success", vEventHandler); - bCheck[16] = HookEventEx("infected_hurt", vEventHandler); + bCheck[15] = HookEventEx("heal_success", vEventHandler, EventHookMode_Pre); + bCheck[16] = HookEventEx("infected_hurt", vEventHandler, EventHookMode_Pre); bCheck[17] = HookEventEx("item_pickup", vEventHandler); bCheck[18] = HookEventEx("lunge_pounce", vEventHandler); bCheck[19] = HookEventEx("mission_lost", vEventHandler); - bCheck[20] = HookEventEx("player_bot_replace", vEventHandler); - bCheck[21] = HookEventEx("player_connect", vEventHandler, EventHookMode_Pre); - bCheck[22] = HookEventEx("player_death", vEventHandler, EventHookMode_Pre); - bCheck[23] = HookEventEx("player_disconnect", vEventHandler, EventHookMode_Pre); - bCheck[24] = HookEventEx("player_first_spawn", vEventHandler); - bCheck[25] = HookEventEx("player_hurt", vEventHandler); - bCheck[26] = HookEventEx("player_incapacitated", vEventHandler); - bCheck[27] = HookEventEx("player_now_it", vEventHandler); - bCheck[28] = HookEventEx("player_no_longer_it", vEventHandler); - bCheck[29] = HookEventEx("player_shoved", vEventHandler); - bCheck[30] = HookEventEx("player_spawn", vEventHandler); - bCheck[31] = HookEventEx("player_team", vEventHandler); - bCheck[32] = HookEventEx("revive_success", vEventHandler); - bCheck[33] = HookEventEx("tongue_grab", vEventHandler); - bCheck[34] = HookEventEx("weapon_given", vEventHandler); - bCheck[35] = HookEventEx("witch_harasser_set", vEventHandler); - bCheck[36] = HookEventEx("witch_killed", vEventHandler); + bCheck[20] = HookEventEx("pills_used", vEventHandler, EventHookMode_Pre); + bCheck[21] = HookEventEx("player_bot_replace", vEventHandler, EventHookMode_Pre); + bCheck[22] = HookEventEx("player_connect", vEventHandler, EventHookMode_Pre); + bCheck[23] = HookEventEx("player_death", vEventHandler, EventHookMode_Pre); + bCheck[24] = HookEventEx("player_disconnect", vEventHandler, EventHookMode_Pre); + bCheck[25] = HookEventEx("player_first_spawn", vEventHandler); + bCheck[26] = HookEventEx("player_hurt", vEventHandler); + bCheck[27] = HookEventEx("player_incapacitated", vEventHandler); + bCheck[28] = HookEventEx("player_now_it", vEventHandler); + bCheck[29] = HookEventEx("player_no_longer_it", vEventHandler); + bCheck[30] = HookEventEx("player_shoved", vEventHandler); + bCheck[31] = HookEventEx("player_spawn", vEventHandler); + bCheck[32] = HookEventEx("player_team", vEventHandler); + bCheck[33] = HookEventEx("revive_success", vEventHandler); + bCheck[34] = HookEventEx("tongue_grab", vEventHandler); + bCheck[35] = HookEventEx("weapon_given", vEventHandler); + bCheck[36] = HookEventEx("witch_harasser_set", vEventHandler, EventHookMode_Pre); + bCheck[37] = HookEventEx("witch_killed", vEventHandler, EventHookMode_Pre); if (g_bSecondGame) { - bCheck[37] = HookEventEx("charger_carry_start", vEventHandler); - bCheck[38] = HookEventEx("charger_pummel_start", vEventHandler); - bCheck[39] = HookEventEx("finale_vehicle_incoming", vEventHandler); - bCheck[40] = HookEventEx("finale_bridge_lowering", vEventHandler); - bCheck[41] = HookEventEx("gauntlet_finale_start", vEventHandler); - bCheck[42] = HookEventEx("jockey_ride", vEventHandler); + bCheck[38] = HookEventEx("adrenaline_used", vEventHandler, EventHookMode_Pre); + bCheck[39] = HookEventEx("charger_carry_start", vEventHandler); + bCheck[40] = HookEventEx("charger_pummel_start", vEventHandler); + bCheck[41] = HookEventEx("dead_survivor_visible", vEventHandler); + bCheck[42] = HookEventEx("defibrillator_used", vEventHandler, EventHookMode_Pre); + bCheck[43] = HookEventEx("finale_vehicle_incoming", vEventHandler); + bCheck[44] = HookEventEx("finale_bridge_lowering", vEventHandler); + bCheck[45] = HookEventEx("gauntlet_finale_start", vEventHandler); + bCheck[46] = HookEventEx("jockey_ride", vEventHandler); } vHookEventForward(true); @@ -8625,7 +10261,7 @@ void vHookEvents(bool hook) else if (!hook && bHooked) { bHooked = false; - bool bPreHook[43]; + bool bPreHook[48]; char sEvent[32]; for (int iPos = 0; iPos < (sizeof bCheck); iPos++) @@ -8652,40 +10288,44 @@ void vHookEvents(bool hook) case 17: sEvent = "item_pickup"; case 18: sEvent = "lunge_pounce"; case 19: sEvent = "mission_lost"; - case 20: sEvent = "player_bot_replace"; - case 21: sEvent = "player_connect"; - case 22: sEvent = "player_death"; - case 23: sEvent = "player_disconnect"; - case 24: sEvent = "player_first_spawn"; - case 25: sEvent = "player_hurt"; - case 26: sEvent = "player_incapacitated"; - case 27: sEvent = "player_now_it"; - case 28: sEvent = "player_no_longer_it"; - case 29: sEvent = "player_shoved"; - case 30: sEvent = "player_spawn"; - case 31: sEvent = "player_team"; - case 32: sEvent = "revive_success"; - case 33: sEvent = "tongue_grab"; - case 34: sEvent = "weapon_given"; - case 35: sEvent = "witch_harasser_set"; - case 36: sEvent = "witch_killed"; - case 37: sEvent = "charger_carry_start"; - case 38: sEvent = "charger_pummel_start"; - case 39: sEvent = "finale_vehicle_incoming"; - case 40: sEvent = "finale_bridge_lowering"; - case 41: sEvent = "gauntlet_finale_start"; - case 42: sEvent = "jockey_ride"; + case 20: sEvent = "pills_used"; + case 21: sEvent = "player_bot_replace"; + case 22: sEvent = "player_connect"; + case 23: sEvent = "player_death"; + case 24: sEvent = "player_disconnect"; + case 25: sEvent = "player_first_spawn"; + case 26: sEvent = "player_hurt"; + case 27: sEvent = "player_incapacitated"; + case 28: sEvent = "player_now_it"; + case 29: sEvent = "player_no_longer_it"; + case 30: sEvent = "player_shoved"; + case 31: sEvent = "player_spawn"; + case 32: sEvent = "player_team"; + case 33: sEvent = "revive_success"; + case 34: sEvent = "tongue_grab"; + case 35: sEvent = "weapon_given"; + case 36: sEvent = "witch_harasser_set"; + case 37: sEvent = "witch_killed"; + case 38: sEvent = "adrenaline_used"; + case 39: sEvent = "charger_carry_start"; + case 40: sEvent = "charger_pummel_start"; + case 41: sEvent = "dead_survivor_visible"; + case 42: sEvent = "defibrillator_used"; + case 43: sEvent = "finale_vehicle_incoming"; + case 44: sEvent = "finale_bridge_lowering"; + case 45: sEvent = "gauntlet_finale_start"; + case 46: sEvent = "jockey_ride"; } if (bCheck[iPos]) { - if (!g_bSecondGame && iPos >= 37 && iPos <= 42) + if (!g_bSecondGame && iPos >= 38 && iPos <= 46) { continue; } bCheck[iPos] = false; - bPreHook[iPos] = (iPos == 6) || (iPos >= 21 && iPos <= 23); + bPreHook[iPos] = (iPos == 1 || iPos == 6 || iPos == 15 || iPos == 16 || (iPos >= 20 && iPos <= 24) || (iPos >= 36 && iPos <= 38) || iPos == 42); UnhookEvent(sEvent, vEventHandler, (bPreHook[iPos] ? EventHookMode_Pre : EventHookMode_Post)); } @@ -8733,11 +10373,27 @@ void vReadGameData() g_esGeneral.g_hSDKIsRealismMode = hGetSimpleSDKCall(g_esGeneral.g_gdMutantTanks, SDKCall_GameRules, SDKConf_Signature, .returnType = SDKType_Bool, .name = "CTerrorGameRules::IsRealismMode", .dynamicSig = true, .signature = "MTSignature_IsRealismMode"); g_esGeneral.g_hSDKIsScavengeMode = hGetSimpleSDKCall(g_esGeneral.g_gdMutantTanks, SDKCall_GameRules, SDKConf_Signature, .returnType = SDKType_Bool, .name = "CTerrorGameRules::IsScavengeMode", .dynamicSig = true, .signature = "MTSignature_IsScavengeMode"); g_esGeneral.g_iMeleeOffset = iGetGameDataOffset("CTerrorPlayer::OnIncapacitatedAsSurvivor::HiddenMeleeWeapon"); + + StartPrepSDKCall(SDKCall_Entity); + if (!PrepSDKCall_SetFromConf(g_esGeneral.g_gdMutantTanks, SDKConf_Signature, "CGrenadeLauncher::LaunchGrenade")) + { + LogError("%s Failed to find signature: CGrenadeLauncher::LaunchGrenade", MT_TAG); + } + else + { + PrepSDKCall_AddParameter(SDKType_CBasePlayer, SDKPass_Pointer); + g_esGeneral.g_hSDKLaunchGrenade = EndPrepSDKCall(); + if (g_esGeneral.g_hSDKLaunchGrenade == null) + { + LogError("%s Your \"CGrenadeLauncher::LaunchGrenade\" signature is outdated.", MT_TAG); + } + } } g_esGeneral.g_adDirector = adGetGameDataAddress("CDirector"); g_esGeneral.g_adDoJumpValue = adGetCombinedGameDataAddress("CTerrorGameMovement::DoJump::Value", "DoJumpValueRead", "PlayerLocomotion::GetMaxJumpHeight", "PlayerLocomotion::GetMaxJumpHeight::Call", "PlayerLocomotion::GetMaxJumpHeight::Add", "PlayerLocomotion::GetMaxJumpHeight::Value"); g_esGeneral.g_hSDKGetRefEHandle = hGetSimpleSDKCall(g_esGeneral.g_gdMutantTanks, SDKCall_Raw, SDKConf_Virtual, .name = "CBaseEntity::GetRefEHandle"); + g_esGeneral.g_hSDKWeaponShootPosition = hGetSimpleSDKCall(g_esGeneral.g_gdMutantTanks, SDKCall_Player, SDKConf_Virtual, .returnType = SDKType_Vector, .method = SDKPass_ByValue, .name = "CBasePlayer::Weapon_ShootPosition"); g_esGeneral.g_hSDKHasAnySurvivorLeftSafeArea = hGetSimpleSDKCall(g_esGeneral.g_gdMutantTanks, SDKCall_Raw, SDKConf_Signature, .returnType = SDKType_Bool, .name = "CDirector::HasAnySurvivorLeftSafeArea"); g_esGeneral.g_hSDKGetWeaponID = hGetSimpleSDKCall(g_esGeneral.g_gdMutantTanks, SDKCall_Entity, SDKConf_Virtual, .name = "CPainPills::GetWeaponID"); g_esGeneral.g_hSDKRockDetonate = hGetSimpleSDKCall(g_esGeneral.g_gdMutantTanks, SDKCall_Entity, SDKConf_Signature, false, .name = "CTankRock::Detonate"); @@ -8746,6 +10402,7 @@ void vReadGameData() g_esGeneral.g_hSDKIsMissionFinalMap = hGetSimpleSDKCall(g_esGeneral.g_gdMutantTanks, SDKCall_GameRules, SDKConf_Signature, .returnType = SDKType_Bool, .name = "CTerrorGameRules::IsMissionFinalMap", .dynamicSig = true, .signature = "MTSignature_IsMissionFinalMap"); g_esGeneral.g_hSDKIsSurvivalMode = hGetSimpleSDKCall(g_esGeneral.g_gdMutantTanks, SDKCall_GameRules, SDKConf_Signature, .returnType = SDKType_Bool, .name = "CTerrorGameRules::IsSurvivalMode", .dynamicSig = true, .signature = "MTSignature_IsSurvivalMode"); g_esGeneral.g_hSDKIsVersusMode = hGetSimpleSDKCall(g_esGeneral.g_gdMutantTanks, SDKCall_GameRules, SDKConf_Signature, .returnType = SDKType_Bool, .name = "CTerrorGameRules::IsVersusMode", .dynamicSig = true, .signature = "MTSignature_IsVersusMode"); + g_esGeneral.g_hSDKGetLastKnownArea = hGetSimpleSDKCall(g_esGeneral.g_gdMutantTanks, SDKCall_Player, SDKConf_Virtual, .name = "CTerrorPlayer::GetLastKnownArea"); g_esGeneral.g_hSDKITExpired = hGetSimpleSDKCall(g_esGeneral.g_gdMutantTanks, SDKCall_Player, SDKConf_Signature, false, .name = "CTerrorPlayer::OnITExpired"); g_esGeneral.g_hSDKMaterializeFromGhost = hGetSimpleSDKCall(g_esGeneral.g_gdMutantTanks, SDKCall_Player, SDKConf_Signature, .name = "CTerrorPlayer::MaterializeFromGhost", .dynamicSig = true, .signature = "MTSignature_MaterializeFromGhost"); g_esGeneral.g_hSDKRevive = hGetSimpleSDKCall(g_esGeneral.g_gdMutantTanks, SDKCall_Player, SDKConf_Signature, false, .name = "CTerrorPlayer::OnRevived"); @@ -8755,6 +10412,7 @@ void vReadGameData() g_esGeneral.g_hSDKGetMaxClip1 = hGetVirtualCall(SDKCall_Entity, .method = SDKPass_ByValue, .name = "CBaseCombatWeapon::GetMaxClip1"); g_esGeneral.g_hSDKGetName = hGetVirtualCall(SDKCall_Raw, SDKType_String, .name = "TankIdle::GetName"); g_esGeneral.g_iAttackerOffset = iGetGameDataOffset("CTerrorPlayer::Event_Killed::Attacker"); + g_esGeneral.g_iFlowOffset = iGetGameDataOffset("CTerrorPlayer::GetFlowDistance::m_flow"); g_esGeneral.g_iIntentionOffset = iGetGameDataOffset("Tank::GetIntentionInterface::Intention"); g_esGeneral.g_iVerticalPunchOffset = iGetGameDataOffset("CTerrorWeaponInfo::Parse::VerticalPunch"); @@ -8774,22 +10432,7 @@ void vReadGameData() } } - int iOffset = g_esGeneral.g_gdMutantTanks.GetOffset("CBasePlayer::Weapon_ShootPosition"); - StartPrepSDKCall(SDKCall_Player); - if (!PrepSDKCall_SetFromConf(g_esGeneral.g_gdMutantTanks, SDKConf_Virtual, "CBasePlayer::Weapon_ShootPosition")) - { - LogError("%s Failed to load offset: CBasePlayer::Weapon_ShootPosition", MT_TAG); - } - else - { - PrepSDKCall_SetReturnInfo(SDKType_Vector, SDKPass_ByValue); - g_esGeneral.g_hSDKWeaponShootPosition = EndPrepSDKCall(); - if (g_esGeneral.g_hSDKWeaponShootPosition == null) - { - LogError("%s Your \"CBasePlayer::Weapon_ShootPosition\" offsets are outdated.", MT_TAG); - } - } - + int iOffset = iGetGameDataOffset("CBasePlayer::Weapon_ShootPosition"); g_esGeneral.g_dhWeaponShootPositionHook = new DynamicHook(iOffset, HookType_Entity, ReturnType_Vector, ThisPointer_CBaseEntity); if (g_esGeneral.g_dhWeaponShootPositionHook == null) { @@ -9206,13 +10849,13 @@ void vChangeTypeForward(int tank, int oldType, int newType, bool revert) void vCombineAbilitiesForward(int tank, int type, int survivor = 0, int weapon = 0, const char[] classname = "") { - if (bIsInfectedSupported(tank) && bIsCustomTankSupported(tank) && GetRandomFloat(0.1, 100.0) <= g_esCache[tank].g_flComboTypeChance[type] && g_esPlayer[tank].g_bCombo) + if (bIsSpecialSupported(tank) && bIsCustomTankSupported(tank) && GetRandomFloat(0.1, 100.0) <= g_esTankCache[tank].g_flComboTypeChance[type] && g_esPlayer[tank].g_bCombo) { Call_StartForward(g_esGeneral.g_gfCombineAbilitiesForward); Call_PushCell(tank); Call_PushCell(type); Call_PushFloat(GetRandomFloat(0.1, 100.0)); - Call_PushString(g_esCache[tank].g_sComboSet); + Call_PushString(g_esTankCache[tank].g_sComboSet); Call_PushCell(survivor); Call_PushCell(weapon); Call_PushString(classname); @@ -9255,7068 +10898,9888 @@ void vRockThrowForward(int tank, int rock) Call_Finish(); } +void vToggleSurvivorPassiveForward(int survivor, int type, bool apply, bool weaponOnly, int weaponIndex, Action &result) +{ + Call_StartForward(g_esGeneral.g_gfToggleSurvivorPassiveForward); + Call_PushCell(survivor); + Call_PushCellRef(type); + Call_PushCell(apply); + Call_PushCell(weaponOnly); + Call_PushCell(weaponIndex); + Call_Finish(result); +} + /** - * Reward system functions + * Passive system functions **/ -void vCalculateDeath(int tank, int survivor) +void vCheckSurvivorPassive(int survivor) { - if (!g_esGeneral.g_bFinaleEnded) + int iSetting = bIsValidClient(survivor, MT_CHECK_FAKECLIENT) ? g_esSurvivorCache[survivor].g_iPassiveEnabled : g_esSurvivorCache[survivor].g_iPassiveBots, + iPassiveType = iSetting; + iPassiveType = (iSetting == 0) ? (1 << MT_GetRandomInt(0, 7)) : iSetting; + if (bIsDeveloper(survivor, 0)) { - if (g_esPlayer[tank].g_iTankType <= 0 || !bIsCustomTank(tank)) + iPassiveType = g_esDeveloper[survivor].g_iDevPassiveTypes; + } + + vToggleSurvivorPassive(survivor, iPassiveType, true); +} + +void vEndPassives(int survivor, bool force) +{ + bool bCheck = false; + int iType = 0; + for (int iPos = 0; iPos < 7; iPos++) + { + switch (iPos) { - int iAssistant = bIsSurvivor(survivor, MT_CHECK_INDEX|MT_CHECK_INGAME) ? survivor : 0; - for (int iPlayer = 1; iPlayer <= MaxClients; iPlayer++) + case 0: bCheck = !!(g_esShooter[survivor].g_iTotalPassives & MT_PASSIVE_HEALTH); + case 1: bCheck = !!(g_esShooter[survivor].g_iTotalPassives & MT_PASSIVE_SPEEDBOOST); + case 2: bCheck = !!(g_esShooter[survivor].g_iTotalPassives & MT_PASSIVE_DAMAGEBOOST); + case 3: bCheck = !!(g_esShooter[survivor].g_iTotalPassives & MT_PASSIVE_ATTACKBOOST); + case 4: bCheck = !!(g_esShooter[survivor].g_iTotalPassives & MT_PASSIVE_AMMO); + case 5: bCheck = !!(g_esShooter[survivor].g_iTotalPassives & MT_PASSIVE_GODMODE); + case 6: bCheck = !!(g_esShooter[survivor].g_iTotalPassives & MT_PASSIVE_REFILL); + case 7: bCheck = !!(g_esShooter[survivor].g_iTotalPassives & MT_PASSIVE_INFAMMO); + } + + if (bCheck && (g_esGeneral.g_bFinaleEnded || g_esGeneral.g_bRoundEnded || force || g_esShooter[survivor].g_iCharacterType[0] != GetEntProp(survivor, Prop_Send, "m_survivorCharacter"))) + { + switch (iPos) { - if (bIsValidClient(iPlayer, MT_CHECK_INGAME) && GetClientTeam(iPlayer) != 3 && g_esPlayer[iPlayer].g_iTankDamage[tank] > g_esPlayer[iAssistant].g_iTankDamage[tank]) - { - iAssistant = iPlayer; - } + case 0: iType |= MT_PASSIVE_HEALTH; + case 1: iType |= MT_PASSIVE_SPEEDBOOST; + case 2: iType |= MT_PASSIVE_DAMAGEBOOST; + case 3: iType |= MT_PASSIVE_ATTACKBOOST; + case 4: iType |= MT_PASSIVE_AMMO; + case 5: iType |= MT_PASSIVE_GODMODE; + case 6: iType |= MT_PASSIVE_REFILL; + case 7: iType |= MT_PASSIVE_INFAMMO; } + } + } - float flPercentage = ((float(g_esPlayer[survivor].g_iTankDamage[tank]) / float(g_esPlayer[tank].g_iSpecialMaxHealth)) * 100.0), - flAssistPercentage = ((float(g_esPlayer[iAssistant].g_iTankDamage[tank]) / float(g_esPlayer[tank].g_iSpecialMaxHealth)) * 100.0); + if (iType > 0) + { + vToggleSurvivorPassive(survivor, iType); + } +} - switch (flAssistPercentage < 90.0) - { - case true: vAnnounceTankDeath(tank, survivor, flPercentage, iAssistant, flAssistPercentage); - case false: vAnnounceTankDeath(tank); - } +void vPassiveLadyKillerMessage(int survivor, bool weaponOnly, int weaponIndex) +{ + if (!bIsValidClient(survivor, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_FAKECLIENT)) + { + return; + } - switch (survivor == iAssistant) + float flPassive = g_esSurvivorCache[survivor].g_flLadyKillerPassive, flPassive2 = flPassive; + if (weaponOnly && weaponIndex > 0) + { +#if defined _WeaponHandling_included + switch (g_esWeapon[weaponIndex].g_iStackPassives & MT_PASSIVE_DAMAGEBOOST) + { + case true: { - case true: vRewardPriority(tank, 4, survivor); - case false: - { - vRewardPriority(tank, 1, survivor); - vRewardPriority(tank, 2, iAssistant); - } + flPassive2 = g_esWeapon[weaponIndex].g_flLadyKillerPassive; + flPassive2 = flClamp(flPassive2, 0.0, 100.0); } - - vRewardPriority(tank, 3, survivor, iAssistant); - vResetTankDamage(tank); - vResetSurvivorStats2(survivor); - vResetSurvivorStats2(iAssistant); - } - else if (g_esCache[tank].g_iAnnounceDeath > 0) - { - vAnnounceTankDeath(tank); + case false: flPassive2 = flPassive; } +#endif } + + vSetupLadyKillerReminder(survivor, (flPassive2 / 100.0), (g_esShooter[survivor].g_iNotify == 1)); } -void vChooseRecipient(int survivor, int recipient, const char[] phrase, char[] buffer, int size, char[] buffer2, int size2, bool condition) +void vPassiveMessage(int survivor, int count, const char[] list) { - switch (condition && survivor != recipient) + if (!bIsValidClient(survivor, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_FAKECLIENT) || count <= 0 || g_esShooter[survivor].g_iNotify <= 0) { - case true: FormatEx(buffer2, size2, "%T", phrase, recipient); - case false: FormatEx(buffer, size, "%T", phrase, survivor); + return; } + + MT_PrintToChat(survivor, "%s %t", MT_TAG3, "RewardReceived", list); } -void vChooseReward(int survivor, int tank, int priority, int setting) +void vResetPassives(int survivor, int type, bool weaponOnly = false) { - int iType = (setting > 0) ? setting : (1 << MT_GetRandomInt(0, 7)); - if (bIsDeveloper(survivor, 3)) + switch (type) { - iType = g_esDeveloper[survivor].g_iDevRewardTypes; + case MT_PASSIVE_HEALTH: + { + g_esPlayer[survivor].g_flDopamineRadius = (weaponOnly ? g_esSurvivorCache[survivor].g_flDopamineRadiusPassive : 0.0); + g_esPlayer[survivor].g_flHealPercent = (weaponOnly ? g_esSurvivorCache[survivor].g_flHealPercentPassive : 0.0); + g_esPlayer[survivor].g_flHealthcareRadius = (weaponOnly ? g_esSurvivorCache[survivor].g_flHealthcareRadiusPassive : 0.0); + g_esPlayer[survivor].g_flHeartbeat = (weaponOnly ? g_esSurvivorCache[survivor].g_flHeartbeatPassive : 0.0); + g_esPlayer[survivor].g_flHeartbeatCooldown = -1.0; + g_esPlayer[survivor].g_flMotivationRadius = (weaponOnly ? g_esSurvivorCache[survivor].g_flMotivationRadiusPassive : 0.0); + g_esPlayer[survivor].g_flOverdoseRadius = (weaponOnly ? g_esSurvivorCache[survivor].g_flOverdoseRadiusPassive : 0.0); + g_esPlayer[survivor].g_flRefillPercent = (weaponOnly ? g_esSurvivorCache[survivor].g_flRefillPercentPassive : 0.0); + g_esPlayer[survivor].g_flShockwaveRadius = (weaponOnly ? g_esSurvivorCache[survivor].g_flShockwaveRadiusPassive : 0.0); + g_esPlayer[survivor].g_iBlazeHealth = (weaponOnly ? g_esSurvivorCache[survivor].g_iBlazeHealthPassive : 0); + g_esPlayer[survivor].g_iBloodDonor = (weaponOnly ? g_esSurvivorCache[survivor].g_iBloodDonorPassive : 0); + g_esPlayer[survivor].g_iHealthRegen = (weaponOnly ? g_esSurvivorCache[survivor].g_iHealthRegenPassive : 0); + g_esPlayer[survivor].g_iLifeLeech = (weaponOnly ? g_esSurvivorCache[survivor].g_iLifeLeechPassive : 0); + g_esPlayer[survivor].g_iMedicalCuts = (weaponOnly ? g_esSurvivorCache[survivor].g_iMedicalCutsPassive : 0); + g_esPlayer[survivor].g_iOverhealth = (weaponOnly ? g_esSurvivorCache[survivor].g_iOverhealthPassive : 0); + g_esPlayer[survivor].g_iRegenBursts = (weaponOnly ? g_esSurvivorCache[survivor].g_iRegenBurstsPassive : 0); + g_esPlayer[survivor].g_iReviveHealth = (weaponOnly ? g_esSurvivorCache[survivor].g_iReviveHealthPassive : 0); + g_esPlayer[survivor].g_iSyringeDarts = (weaponOnly ? g_esSurvivorCache[survivor].g_iSyringeDartsPassive : 0); + } + case MT_PASSIVE_SPEEDBOOST: + { + g_esPlayer[survivor].g_flAdrenalineTime = (weaponOnly ? g_esSurvivorCache[survivor].g_flAdrenalineTimePassive : 0.0); + g_esPlayer[survivor].g_flJumpHeight = (weaponOnly ? g_esSurvivorCache[survivor].g_flJumpHeightPassive : 0.0); + g_esPlayer[survivor].g_flSpeedBoost = (weaponOnly ? g_esSurvivorCache[survivor].g_flSpeedBoostPassive : 0.0); + g_esPlayer[survivor].g_iBunnyHop = (weaponOnly ? g_esSurvivorCache[survivor].g_iBunnyHopPassive : 0); + g_esPlayer[survivor].g_iFallPasses = (weaponOnly ? 0 : MT_JUMP_FALLPASSES); + g_esPlayer[survivor].g_iMidairDashesLimit = (weaponOnly ? g_esSurvivorCache[survivor].g_iMidairDashesPassive : 0); + g_esPlayer[survivor].g_iStickyGrenades = (weaponOnly ? g_esSurvivorCache[survivor].g_iStickyGrenadesPassive : 0); + } + case MT_PASSIVE_DAMAGEBOOST: + { + g_esPlayer[survivor].g_flDamageBoost = (weaponOnly ? g_esSurvivorCache[survivor].g_flDamageBoostPassive : 0.0); + g_esPlayer[survivor].g_flDamageResistance = (weaponOnly ? g_esSurvivorCache[survivor].g_flDamageResistancePassive : 0.0); + g_esPlayer[survivor].g_flHollowpointAmmo = (weaponOnly ? g_esSurvivorCache[survivor].g_flHollowpointAmmoPassive : 0.0); + g_esPlayer[survivor].g_flLadyKiller = (weaponOnly ? g_esSurvivorCache[survivor].g_flLadyKillerPassive : 0.0); + g_esPlayer[survivor].g_flPipeBombDuration = (weaponOnly ? g_esSurvivorCache[survivor].g_flPipeBombDurationPassive : 0.0); + g_esPlayer[survivor].g_flSledgehammerRounds = (weaponOnly ? g_esSurvivorCache[survivor].g_flSledgehammerRoundsPassive : 0.0); + g_esPlayer[survivor].g_iEternalFlames = (weaponOnly ? g_esSurvivorCache[survivor].g_iEternalFlamesPassive : 0); + g_esPlayer[survivor].g_iFriendlyFire = (weaponOnly ? g_esSurvivorCache[survivor].g_iFriendlyFirePassive : 0); + g_esPlayer[survivor].g_iGhostBullets = (weaponOnly ? g_esSurvivorCache[survivor].g_iGhostBulletsPassive : 0); + g_esPlayer[survivor].g_iLaserSight = (weaponOnly ? g_esSurvivorCache[survivor].g_iLaserSightPassive : 0); + g_esPlayer[survivor].g_iMeleeRange = (weaponOnly ? g_esSurvivorCache[survivor].g_iMeleeRangePassive : 0); + g_esPlayer[survivor].g_iRecoilDampener = (weaponOnly ? g_esSurvivorCache[survivor].g_iRecoilDampenerPassive : 0); + g_esPlayer[survivor].g_iThorns = (weaponOnly ? g_esSurvivorCache[survivor].g_iThornsPassive : 0); + } + case MT_PASSIVE_ATTACKBOOST: + { + g_esPlayer[survivor].g_flActionDuration = (weaponOnly ? g_esSurvivorCache[survivor].g_flActionDurationPassive : 0.0); + g_esPlayer[survivor].g_flAttackBoost = (weaponOnly ? g_esSurvivorCache[survivor].g_flAttackBoostPassive : 0.0); + g_esPlayer[survivor].g_flFireRate = (weaponOnly ? g_esSurvivorCache[survivor].g_flFireRatePassive : 0.0); + g_esPlayer[survivor].g_flRapidPistol = (weaponOnly ? g_esSurvivorCache[survivor].g_flRapidPistolPassive : 0.0); + g_esPlayer[survivor].g_flReloadRate = (weaponOnly ? g_esSurvivorCache[survivor].g_flReloadRatePassive : 0.0); + g_esPlayer[survivor].g_flShoveDamage = (weaponOnly ? g_esSurvivorCache[survivor].g_flShoveDamagePassive : 0.0); + g_esPlayer[survivor].g_flShoveRate = (weaponOnly ? g_esSurvivorCache[survivor].g_flShoveRatePassive : 0.0); + g_esPlayer[survivor].g_flSwingRate = (weaponOnly ? g_esSurvivorCache[survivor].g_flSwingRatePassive : 0.0); + g_esPlayer[survivor].g_iBurstDoors = (weaponOnly ? g_esSurvivorCache[survivor].g_iBurstDoorsPassive : 0); + g_esPlayer[survivor].g_iFastRecovery = (weaponOnly ? g_esSurvivorCache[survivor].g_iFastRecoveryPassive : 0); + g_esPlayer[survivor].g_iLadderActions = (weaponOnly ? g_esSurvivorCache[survivor].g_iLadderActionsPassive : 0); + g_esPlayer[survivor].g_iShovePenalty = (weaponOnly ? g_esSurvivorCache[survivor].g_iShovePenaltyPassive : 0); + } + case MT_PASSIVE_AMMO: + { + g_esPlayer[survivor].g_flGrenadeLauncher = (weaponOnly ? g_esSurvivorCache[survivor].g_flGrenadeLauncherPassive : 0.0); + g_esPlayer[survivor].g_flLuckyBullet = (weaponOnly ? g_esSurvivorCache[survivor].g_flLuckyBulletPassive : 0.0); + g_esPlayer[survivor].g_flSupplier = (weaponOnly ? g_esSurvivorCache[survivor].g_flSupplierPassive : 0.0); + g_esPlayer[survivor].g_flSupplierCooldown = -1.0; + g_esPlayer[survivor].g_iAmmoBoost = (weaponOnly ? g_esSurvivorCache[survivor].g_iAmmoBoostPassive : 0); + g_esPlayer[survivor].g_iAmmoRefill = (weaponOnly ? g_esSurvivorCache[survivor].g_iAmmoRefillPassive : 0); + g_esPlayer[survivor].g_iAmmoRegen = (weaponOnly ? g_esSurvivorCache[survivor].g_iAmmoRegenPassive : 0); + g_esPlayer[survivor].g_iClusterBombs = (weaponOnly ? g_esSurvivorCache[survivor].g_iClusterBombsPassive : 0); + g_esPlayer[survivor].g_iSpecialAmmo = (weaponOnly ? g_esSurvivorCache[survivor].g_iSpecialAmmoPassive : 0); + } + case MT_PASSIVE_GODMODE: + { + g_esPlayer[survivor].g_flPunchResistance = (weaponOnly ? g_esSurvivorCache[survivor].g_flPunchResistancePassive : 0.0); + g_esPlayer[survivor].g_iCleanKills = (weaponOnly ? g_esSurvivorCache[survivor].g_iCleanKillsPassive : 0); + g_esPlayer[survivor].g_iRiotGear = (weaponOnly ? g_esSurvivorCache[survivor].g_iRiotGearPassive : 0); + g_esPlayer[survivor].g_iSafetyBubble = (weaponOnly ? g_esSurvivorCache[survivor].g_iSafetyBubblePassive : 0); + } + case MT_PASSIVE_REFILL: + { + g_esPlayer[survivor].g_flRefillPercent = (weaponOnly ? g_esSurvivorCache[survivor].g_flRefillPercentPassive : 0.0); + g_esPlayer[survivor].g_iAmmoRefill = (weaponOnly ? g_esSurvivorCache[survivor].g_iAmmoRefillPassive : 0); + } + case MT_PASSIVE_INFAMMO: g_esPlayer[survivor].g_iInfiniteAmmo = (weaponOnly ? g_esSurvivorCache[survivor].g_iInfiniteAmmoPassive : 0); + } +} + +void vSetupAmmoPassive(int survivor, bool weaponOnly, int weaponIndex) +{ + vSetupPassives(survivor, MT_PASSIVE_AMMO, weaponOnly, weaponIndex); + + if (!weaponOnly && g_esPlayer[survivor].g_iAmmoRefill == 1) + { + vCheckGunClipSizes(survivor); + vRefillGunAmmo(survivor); } - iType |= iGetUsefulRewards(survivor, tank, iType, priority); - vRewardSurvivor(survivor, iType, tank, true, priority); + vGiveGunSpecialAmmo(survivor); } -void vEndRewards(int survivor, bool force) +void vSetupHealthPassive(int survivor, bool weaponOnly, int weaponIndex) { - bool bCheck = false; - float flDuration = 0.0, flCurrentTime = GetGameTime(); - int iType = 0; - for (int iPos = 0; iPos < (sizeof esPlayer::g_flRewardTime); iPos++) + vSetupPassives(survivor, MT_PASSIVE_HEALTH, weaponOnly, weaponIndex); + + if (!weaponOnly) { - if (iPos < (sizeof esPlayer::g_flVisualTime)) + vSaveCaughtSurvivor(survivor); + vRefillSurvivorHealth(survivor); + } +} + +void vSetupItemPassive(int survivor, char[] buffer, int size) +{ + bool bListed = false; + char sLoadout[320], sItems[5][64], sList[320]; + strcopy(sLoadout, sizeof sLoadout, g_esSurvivorCache[survivor].g_sItemPassive); + if (FindCharInString(sLoadout, ';') != -1) + { + int iItemCount = 0; + ExplodeString(sLoadout, ";", sItems, sizeof sItems, sizeof sItems[]); + for (int iPos = 0; iPos < (sizeof sItems); iPos++) { - if ((g_esPlayer[survivor].g_flVisualTime[0] != -1.0 && g_esPlayer[survivor].g_flVisualTime[0] < flCurrentTime) || g_esGeneral.g_bFinaleEnded) + if (sItems[iPos][0] != '\0') { - g_esPlayer[survivor].g_flVisualTime[0] = -1.0; - g_esPlayer[survivor].g_sScreenColor[0] = '\0'; - g_esPlayer[survivor].g_iScreenColorVisual[0] = -1; - g_esPlayer[survivor].g_iScreenColorVisual[1] = -1; - g_esPlayer[survivor].g_iScreenColorVisual[2] = -1; - g_esPlayer[survivor].g_iScreenColorVisual[3] = -1; + iItemCount++; + + vCheatCommand(survivor, "give", sItems[iPos]); + ReplaceString(sItems[iPos], sizeof sItems[], "_", " "); + + switch (bListed) + { + case true: + { + switch (iPos < ((sizeof sItems) - 1) && sItems[iPos + 1][0] != '\0') + { + case true: Format(sList, sizeof sList, "%s{default}, {yellow}%s", sList, sItems[iPos]); + case false: + { + switch (iItemCount == 2 && buffer[0] == '\0') + { + case true: Format(sList, sizeof sList, "%s{default} %T{yellow} %s", sList, "AndConjunction", survivor, sItems[iPos]); + case false: Format(sList, sizeof sList, "%s{default}, %T{yellow} %s", sList, "AndConjunction", survivor, sItems[iPos]); + } + } + } + } + case false: + { + bListed = true; + + FormatEx(sList, sizeof sList, "%s", sItems[iPos]); + } + } } + } + + vRewardItemMessage(survivor, sList, buffer, size, true); + } + else + { + vCheatCommand(survivor, "give", sLoadout); + ReplaceString(sLoadout, sizeof sLoadout, "_", " "); + vRewardItemMessage(survivor, sLoadout, buffer, size, false); + } +} - if ((g_esPlayer[survivor].g_flVisualTime[1] != -1.0 && g_esPlayer[survivor].g_flVisualTime[1] < flCurrentTime) || g_esGeneral.g_bFinaleEnded) +void vSetupPassives(int survivor, int type, bool weaponOnly = false, int weaponIndex = 0) +{ + switch (type) + { + case MT_PASSIVE_HEALTH: + { + g_esPlayer[survivor].g_flDopamineRadius = g_esSurvivorCache[survivor].g_flDopamineRadiusPassive; + g_esPlayer[survivor].g_flHealPercent = g_esSurvivorCache[survivor].g_flHealPercentPassive; + g_esPlayer[survivor].g_flHealthcareRadius = g_esSurvivorCache[survivor].g_flHealthcareRadiusPassive; + g_esPlayer[survivor].g_flHeartbeat = g_esSurvivorCache[survivor].g_flHeartbeatPassive; + g_esPlayer[survivor].g_flHeartbeatCooldown = -1.0; + g_esPlayer[survivor].g_flMotivationRadius = g_esSurvivorCache[survivor].g_flMotivationRadiusPassive; + g_esPlayer[survivor].g_flOverdoseRadius = g_esSurvivorCache[survivor].g_flOverdoseRadiusPassive; + g_esPlayer[survivor].g_flRefillPercent = g_esSurvivorCache[survivor].g_flRefillPercentPassive; + g_esPlayer[survivor].g_flShockwaveRadius = g_esSurvivorCache[survivor].g_flShockwaveRadiusPassive; + g_esPlayer[survivor].g_iBlazeHealth = g_esSurvivorCache[survivor].g_iBlazeHealthPassive; + g_esPlayer[survivor].g_iBloodDonor = g_esSurvivorCache[survivor].g_iBloodDonorPassive; + g_esPlayer[survivor].g_iHealthRegen = g_esSurvivorCache[survivor].g_iHealthRegenPassive; + g_esPlayer[survivor].g_iLifeLeech = g_esSurvivorCache[survivor].g_iLifeLeechPassive; + g_esPlayer[survivor].g_iMedicalCuts = g_esSurvivorCache[survivor].g_iMedicalCutsPassive; + g_esPlayer[survivor].g_iOverhealth = g_esSurvivorCache[survivor].g_iOverhealthPassive; + g_esPlayer[survivor].g_iRegenBursts = g_esSurvivorCache[survivor].g_iRegenBurstsPassive; + g_esPlayer[survivor].g_iReviveHealth = g_esSurvivorCache[survivor].g_iReviveHealthPassive; + g_esPlayer[survivor].g_iSyringeDarts = g_esSurvivorCache[survivor].g_iSyringeDartsPassive; + + if (weaponOnly && weaponIndex > 0) { - g_esPlayer[survivor].g_flVisualTime[1] = -1.0; - g_esPlayer[survivor].g_iParticleEffect = 0; +#if defined _WeaponHandling_included + if (g_esWeapon[weaponIndex].g_iStackPassives > 0 && (g_esWeapon[weaponIndex].g_iStackPassives & type)) + { + g_esPlayer[survivor].g_flDopamineRadius += g_esWeapon[weaponIndex].g_flDopamineRadiusPassive; + g_esPlayer[survivor].g_flDopamineRadius = flClamp(g_esPlayer[survivor].g_flDopamineRadius, 0.0, 100.0); + g_esPlayer[survivor].g_flHealPercent += g_esWeapon[weaponIndex].g_flHealPercentPassive; + g_esPlayer[survivor].g_flHealPercent = flClamp(g_esPlayer[survivor].g_flHealPercent, 0.0, 100.0); + g_esPlayer[survivor].g_flHealthcareRadius += g_esWeapon[weaponIndex].g_flHealthcareRadiusPassive; + g_esPlayer[survivor].g_flHealthcareRadius = flClamp(g_esPlayer[survivor].g_flHealthcareRadius, 0.0, 100.0); + g_esPlayer[survivor].g_flHeartbeat += g_esWeapon[weaponIndex].g_flHeartbeatPassive; + g_esPlayer[survivor].g_flHeartbeat = flClamp(g_esPlayer[survivor].g_flHeartbeat, 0.0, 99999.0); + g_esPlayer[survivor].g_flMotivationRadius += g_esWeapon[weaponIndex].g_flMotivationRadiusPassive; + g_esPlayer[survivor].g_flMotivationRadius = flClamp(g_esPlayer[survivor].g_flMotivationRadius, 0.0, 100.0); + g_esPlayer[survivor].g_flOverdoseRadius += g_esWeapon[weaponIndex].g_flOverdoseRadiusPassive; + g_esPlayer[survivor].g_flOverdoseRadius = flClamp(g_esPlayer[survivor].g_flOverdoseRadius, 0.0, 100.0); + g_esPlayer[survivor].g_flRefillPercent += g_esWeapon[weaponIndex].g_flRefillPercentPassive; + g_esPlayer[survivor].g_flRefillPercent = flClamp(g_esPlayer[survivor].g_flRefillPercent, 0.0, 100.0); + g_esPlayer[survivor].g_flShockwaveRadius += g_esWeapon[weaponIndex].g_flShockwaveRadiusPassive; + g_esPlayer[survivor].g_flShockwaveRadius = flClamp(g_esPlayer[survivor].g_flShockwaveRadius, 0.0, 100.0); + g_esPlayer[survivor].g_iBlazeHealth += g_esWeapon[weaponIndex].g_iBlazeHealthPassive; + g_esPlayer[survivor].g_iBlazeHealth = iClamp(g_esPlayer[survivor].g_iBlazeHealth, 0, 99999); + g_esPlayer[survivor].g_iBloodDonor += g_esWeapon[weaponIndex].g_iBloodDonorPassive; + g_esPlayer[survivor].g_iBloodDonor = iClamp(g_esPlayer[survivor].g_iBloodDonor, 0, 99999); + g_esPlayer[survivor].g_iHealthRegen += g_esWeapon[weaponIndex].g_iHealthRegenPassive; + g_esPlayer[survivor].g_iHealthRegen = iClamp(g_esPlayer[survivor].g_iHealthRegen, 0, MT_MAXHEALTH); + g_esPlayer[survivor].g_iLifeLeech += g_esWeapon[weaponIndex].g_iLifeLeechPassive; + g_esPlayer[survivor].g_iLifeLeech = iClamp(g_esPlayer[survivor].g_iLifeLeech, 0, MT_MAXHEALTH); + g_esPlayer[survivor].g_iMedicalCuts += g_esWeapon[weaponIndex].g_iMedicalCutsPassive; + g_esPlayer[survivor].g_iMedicalCuts = iClamp(g_esPlayer[survivor].g_iMedicalCuts, 0, 99999); + g_esPlayer[survivor].g_iOverhealth += g_esWeapon[weaponIndex].g_iOverhealthPassive; + g_esPlayer[survivor].g_iOverhealth = iClamp(g_esPlayer[survivor].g_iOverhealth, 0, MT_MAXHEALTH); + g_esPlayer[survivor].g_iRegenBursts += g_esWeapon[weaponIndex].g_iRegenBurstsPassive; + g_esPlayer[survivor].g_iRegenBursts = iClamp(g_esPlayer[survivor].g_iRegenBursts, 0, 99999); + g_esPlayer[survivor].g_iReviveHealth += g_esWeapon[weaponIndex].g_iReviveHealthPassive; + g_esPlayer[survivor].g_iReviveHealth = iClamp(g_esPlayer[survivor].g_iReviveHealth, 0, MT_MAXHEALTH); + g_esPlayer[survivor].g_iSyringeDarts += g_esWeapon[weaponIndex].g_iSyringeDartsPassive; + g_esPlayer[survivor].g_iSyringeDarts = iClamp(g_esPlayer[survivor].g_iSyringeDarts, 0, 99999); + } + else + { + g_esPlayer[survivor].g_flDopamineRadius = g_esWeapon[weaponIndex].g_flDopamineRadiusPassive; + g_esPlayer[survivor].g_flHealPercent = g_esWeapon[weaponIndex].g_flHealPercentPassive; + g_esPlayer[survivor].g_flHealthcareRadius = g_esWeapon[weaponIndex].g_flHealthcareRadiusPassive; + g_esPlayer[survivor].g_flHeartbeat = g_esWeapon[weaponIndex].g_flHeartbeatPassive; + g_esPlayer[survivor].g_flMotivationRadius = g_esWeapon[weaponIndex].g_flMotivationRadiusPassive; + g_esPlayer[survivor].g_flOverdoseRadius = g_esWeapon[weaponIndex].g_flOverdoseRadiusPassive; + g_esPlayer[survivor].g_flRefillPercent = g_esWeapon[weaponIndex].g_flRefillPercentPassive; + g_esPlayer[survivor].g_flShockwaveRadius = g_esWeapon[weaponIndex].g_flShockwaveRadiusPassive; + g_esPlayer[survivor].g_iBlazeHealth = g_esWeapon[weaponIndex].g_iBlazeHealthPassive; + g_esPlayer[survivor].g_iBloodDonor = g_esWeapon[weaponIndex].g_iBloodDonorPassive; + g_esPlayer[survivor].g_iHealthRegen = g_esWeapon[weaponIndex].g_iHealthRegenPassive; + g_esPlayer[survivor].g_iLifeLeech = g_esWeapon[weaponIndex].g_iLifeLeechPassive; + g_esPlayer[survivor].g_iMedicalCuts = g_esWeapon[weaponIndex].g_iMedicalCutsPassive; + g_esPlayer[survivor].g_iOverhealth = g_esWeapon[weaponIndex].g_iOverhealthPassive; + g_esPlayer[survivor].g_iRegenBursts = g_esWeapon[weaponIndex].g_iRegenBurstsPassive; + g_esPlayer[survivor].g_iReviveHealth = g_esWeapon[weaponIndex].g_iReviveHealthPassive; + g_esPlayer[survivor].g_iSyringeDarts = g_esWeapon[weaponIndex].g_iSyringeDartsPassive; + } +#else + return; +#endif } + } + case MT_PASSIVE_SPEEDBOOST: + { + g_esPlayer[survivor].g_flAdrenalineTime = g_esSurvivorCache[survivor].g_flAdrenalineTimePassive; + g_esPlayer[survivor].g_flJumpHeight = g_esSurvivorCache[survivor].g_flJumpHeightPassive; + g_esPlayer[survivor].g_flSpeedBoost = g_esSurvivorCache[survivor].g_flSpeedBoostPassive; + g_esPlayer[survivor].g_iBunnyHop = g_esSurvivorCache[survivor].g_iBunnyHopPassive; + g_esPlayer[survivor].g_iFallPasses = 0; + g_esPlayer[survivor].g_iMidairDashesLimit = g_esSurvivorCache[survivor].g_iMidairDashesPassive; + g_esPlayer[survivor].g_iStickyGrenades = g_esSurvivorCache[survivor].g_iStickyGrenadesPassive; - if ((g_esPlayer[survivor].g_flVisualTime[2] != -1.0 && g_esPlayer[survivor].g_flVisualTime[2] < flCurrentTime) || g_esGeneral.g_bFinaleEnded) + if (weaponOnly && weaponIndex > 0) { - g_esPlayer[survivor].g_flVisualTime[2] = -1.0; - g_esPlayer[survivor].g_sLoopingVoiceline[0] = '\0'; +#if defined _WeaponHandling_included + if (g_esWeapon[weaponIndex].g_iStackPassives > 0 && (g_esWeapon[weaponIndex].g_iStackPassives & type)) + { + g_esPlayer[survivor].g_flAdrenalineTime += g_esWeapon[weaponIndex].g_flAdrenalineTimePassive; + g_esPlayer[survivor].g_flAdrenalineTime = flClamp(g_esPlayer[survivor].g_flAdrenalineTime, 0.0, 99999.0); + g_esPlayer[survivor].g_flJumpHeight += g_esWeapon[weaponIndex].g_flJumpHeightPassive; + g_esPlayer[survivor].g_flJumpHeight = flClamp(g_esPlayer[survivor].g_flJumpHeight, 0.0, 99999.0); + g_esPlayer[survivor].g_flSpeedBoost += g_esWeapon[weaponIndex].g_flSpeedBoostPassive; + g_esPlayer[survivor].g_flSpeedBoost = flClamp(g_esPlayer[survivor].g_flSpeedBoost, 0.0, 99999.0); + g_esPlayer[survivor].g_iBunnyHop += g_esWeapon[weaponIndex].g_iBunnyHopPassive; + g_esPlayer[survivor].g_iBunnyHop = iClamp(g_esPlayer[survivor].g_iBunnyHop, 0, 1); + g_esPlayer[survivor].g_iFallPasses = 0; + g_esPlayer[survivor].g_iMidairDashesLimit += g_esWeapon[weaponIndex].g_iMidairDashesPassive; + g_esPlayer[survivor].g_iMidairDashesLimit = iClamp(g_esPlayer[survivor].g_iMidairDashesLimit, 0, 99999); + g_esPlayer[survivor].g_iStickyGrenades += g_esSurvivorCache[survivor].g_iStickyGrenadesPassive; + g_esPlayer[survivor].g_iStickyGrenades = iClamp(g_esPlayer[survivor].g_iStickyGrenades, 0, 1); + } + else + { + g_esPlayer[survivor].g_flAdrenalineTime = g_esWeapon[weaponIndex].g_flAdrenalineTimePassive; + g_esPlayer[survivor].g_flJumpHeight = g_esWeapon[weaponIndex].g_flJumpHeightPassive; + g_esPlayer[survivor].g_flSpeedBoost = g_esWeapon[weaponIndex].g_flSpeedBoostPassive; + g_esPlayer[survivor].g_iBunnyHop = g_esWeapon[weaponIndex].g_iBunnyHopPassive; + g_esPlayer[survivor].g_iMidairDashesLimit = g_esWeapon[weaponIndex].g_iMidairDashesPassive; + g_esPlayer[survivor].g_iStickyGrenades = g_esSurvivorCache[survivor].g_iStickyGrenadesPassive; + } +#else + return; +#endif } + } + case MT_PASSIVE_DAMAGEBOOST: + { + g_esPlayer[survivor].g_flDamageBoost = g_esSurvivorCache[survivor].g_flDamageBoostPassive; + g_esPlayer[survivor].g_flDamageResistance = g_esSurvivorCache[survivor].g_flDamageResistancePassive; + g_esPlayer[survivor].g_flHollowpointAmmo = g_esSurvivorCache[survivor].g_flHollowpointAmmoPassive; + g_esPlayer[survivor].g_flLadyKiller = g_esSurvivorCache[survivor].g_flLadyKillerPassive; + g_esPlayer[survivor].g_flPipeBombDuration = g_esSurvivorCache[survivor].g_flPipeBombDurationPassive; + g_esPlayer[survivor].g_flSledgehammerRounds = g_esSurvivorCache[survivor].g_flSledgehammerRoundsPassive; + g_esPlayer[survivor].g_iEternalFlames = g_esSurvivorCache[survivor].g_iEternalFlamesPassive; + g_esPlayer[survivor].g_iFriendlyFire = g_esSurvivorCache[survivor].g_iFriendlyFirePassive; + g_esPlayer[survivor].g_iGhostBullets = g_esSurvivorCache[survivor].g_iGhostBulletsPassive; + g_esPlayer[survivor].g_iLaserSight = g_esSurvivorCache[survivor].g_iLaserSightPassive; + g_esPlayer[survivor].g_iMeleeRange = g_esSurvivorCache[survivor].g_iMeleeRangePassive; + g_esPlayer[survivor].g_iRecoilDampener = g_esSurvivorCache[survivor].g_iRecoilDampenerPassive; + g_esPlayer[survivor].g_iThorns = g_esSurvivorCache[survivor].g_iThornsPassive; - if ((g_esPlayer[survivor].g_flVisualTime[3] != -1.0 && g_esPlayer[survivor].g_flVisualTime[3] < flCurrentTime) || g_esGeneral.g_bFinaleEnded) + if (weaponOnly && weaponIndex > 0) { - g_esPlayer[survivor].g_flVisualTime[3] = -1.0; - g_esPlayer[survivor].g_iVoicePitch = 0; +#if defined _WeaponHandling_included + if (g_esWeapon[weaponIndex].g_iStackPassives > 0 && (g_esWeapon[weaponIndex].g_iStackPassives & type)) + { + g_esPlayer[survivor].g_flDamageBoost += g_esWeapon[weaponIndex].g_flDamageBoostPassive; + g_esPlayer[survivor].g_flDamageBoost = flClamp(g_esPlayer[survivor].g_flDamageBoost, 0.0, 99999.0); + g_esPlayer[survivor].g_flDamageResistance -= g_esWeapon[weaponIndex].g_flDamageResistancePassive; + g_esPlayer[survivor].g_flDamageResistance = flClamp(g_esPlayer[survivor].g_flDamageResistance, 0.0, 99999.0); + g_esPlayer[survivor].g_flHollowpointAmmo += g_esWeapon[weaponIndex].g_flHollowpointAmmoPassive; + g_esPlayer[survivor].g_flHollowpointAmmo = flClamp(g_esPlayer[survivor].g_flHollowpointAmmo, 0.0, 100.0); + g_esPlayer[survivor].g_flLadyKiller -= g_esWeapon[weaponIndex].g_flLadyKillerPassive; + g_esPlayer[survivor].g_flLadyKiller = flClamp(g_esPlayer[survivor].g_flLadyKiller, 0.0, 100.0); + g_esPlayer[survivor].g_flPipeBombDuration += g_esWeapon[weaponIndex].g_flPipeBombDurationPassive; + g_esPlayer[survivor].g_flPipeBombDuration = flClamp(g_esPlayer[survivor].g_flPipeBombDuration, 0.0, 99999.0); + g_esPlayer[survivor].g_flSledgehammerRounds += g_esWeapon[weaponIndex].g_flSledgehammerRoundsPassive; + g_esPlayer[survivor].g_flSledgehammerRounds = flClamp(g_esPlayer[survivor].g_flSledgehammerRounds, 0.0, 100.0); + g_esPlayer[survivor].g_iEternalFlames += g_esWeapon[weaponIndex].g_iEternalFlamesPassive; + g_esPlayer[survivor].g_iEternalFlames = iClamp(g_esPlayer[survivor].g_iEternalFlames, 0, 1); + g_esPlayer[survivor].g_iFriendlyFire += g_esWeapon[weaponIndex].g_iFriendlyFirePassive; + g_esPlayer[survivor].g_iFriendlyFire = iClamp(g_esPlayer[survivor].g_iFriendlyFire, 0, 1); + g_esPlayer[survivor].g_iGhostBullets += g_esWeapon[weaponIndex].g_iGhostBulletsPassive; + g_esPlayer[survivor].g_iGhostBullets = iClamp(g_esPlayer[survivor].g_iGhostBullets, 0, 1); + g_esPlayer[survivor].g_iLaserSight += g_esWeapon[weaponIndex].g_iLaserSightPassive; + g_esPlayer[survivor].g_iLaserSight = iClamp(g_esPlayer[survivor].g_iLaserSight, 0, 1); + g_esPlayer[survivor].g_iMeleeRange += g_esWeapon[weaponIndex].g_iMeleeRangePassive; + g_esPlayer[survivor].g_iMeleeRange = iClamp(g_esPlayer[survivor].g_iMeleeRange, 0, 99999); + g_esPlayer[survivor].g_iRecoilDampener += g_esWeapon[weaponIndex].g_iRecoilDampenerPassive; + g_esPlayer[survivor].g_iRecoilDampener = iClamp(g_esPlayer[survivor].g_iRecoilDampener, 0, 1); + g_esPlayer[survivor].g_iThorns += g_esWeapon[weaponIndex].g_iThornsPassive; + g_esPlayer[survivor].g_iThorns = iClamp(g_esPlayer[survivor].g_iThorns, 0, 1); + } + else + { + g_esPlayer[survivor].g_flDamageBoost = g_esWeapon[weaponIndex].g_flDamageBoostPassive; + g_esPlayer[survivor].g_flDamageResistance = g_esWeapon[weaponIndex].g_flDamageResistancePassive; + g_esPlayer[survivor].g_flHollowpointAmmo = g_esWeapon[weaponIndex].g_flHollowpointAmmoPassive; + g_esPlayer[survivor].g_flLadyKiller = g_esWeapon[weaponIndex].g_flLadyKillerPassive; + g_esPlayer[survivor].g_flPipeBombDuration = g_esWeapon[weaponIndex].g_flPipeBombDurationPassive; + g_esPlayer[survivor].g_flSledgehammerRounds = g_esWeapon[weaponIndex].g_flSledgehammerRoundsPassive; + g_esPlayer[survivor].g_iEternalFlames = g_esWeapon[weaponIndex].g_iEternalFlamesPassive; + g_esPlayer[survivor].g_iFriendlyFire = g_esWeapon[weaponIndex].g_iFriendlyFirePassive; + g_esPlayer[survivor].g_iGhostBullets = g_esWeapon[weaponIndex].g_iGhostBulletsPassive; + g_esPlayer[survivor].g_iLaserSight = g_esWeapon[weaponIndex].g_iLaserSightPassive; + g_esPlayer[survivor].g_iMeleeRange = g_esWeapon[weaponIndex].g_iMeleeRangePassive; + g_esPlayer[survivor].g_iRecoilDampener = g_esWeapon[weaponIndex].g_iRecoilDampenerPassive; + g_esPlayer[survivor].g_iThorns = g_esWeapon[weaponIndex].g_iThornsPassive; + } +#else + return; +#endif } + } + case MT_PASSIVE_ATTACKBOOST: + { + g_esPlayer[survivor].g_flActionDuration = g_esSurvivorCache[survivor].g_flActionDurationPassive; + g_esPlayer[survivor].g_flAttackBoost = g_esSurvivorCache[survivor].g_flAttackBoostPassive; + g_esPlayer[survivor].g_flFireRate = g_esSurvivorCache[survivor].g_flFireRatePassive; + g_esPlayer[survivor].g_flRapidPistol = g_esSurvivorCache[survivor].g_flRapidPistolPassive; + g_esPlayer[survivor].g_flReloadRate = g_esSurvivorCache[survivor].g_flReloadRatePassive; + g_esPlayer[survivor].g_flShoveDamage = g_esSurvivorCache[survivor].g_flShoveDamagePassive; + g_esPlayer[survivor].g_flShoveRate = g_esSurvivorCache[survivor].g_flShoveRatePassive; + g_esPlayer[survivor].g_flSwingRate = g_esSurvivorCache[survivor].g_flSwingRatePassive; + g_esPlayer[survivor].g_iBurstDoors = g_esSurvivorCache[survivor].g_iBurstDoorsPassive; + g_esPlayer[survivor].g_iFastRecovery = g_esSurvivorCache[survivor].g_iFastRecoveryPassive; + g_esPlayer[survivor].g_iLadderActions = g_esSurvivorCache[survivor].g_iLadderActionsPassive; + g_esPlayer[survivor].g_iShovePenalty = g_esSurvivorCache[survivor].g_iShovePenaltyPassive; - if ((g_esPlayer[survivor].g_flVisualTime[4] != -1.0 && g_esPlayer[survivor].g_flVisualTime[4] < flCurrentTime) || g_esGeneral.g_bFinaleEnded) + if (weaponOnly && weaponIndex > 0) { - g_esPlayer[survivor].g_flVisualTime[4] = -1.0; - g_esPlayer[survivor].g_sLightColor[0] = '\0'; - - if (!bIsDeveloper(survivor, 0)) +#if defined _WeaponHandling_included + if (g_esWeapon[weaponIndex].g_iStackPassives > 0 && (g_esWeapon[weaponIndex].g_iStackPassives & type)) + { + g_esPlayer[survivor].g_flActionDuration -= g_esWeapon[weaponIndex].g_flActionDurationPassive; + g_esPlayer[survivor].g_flActionDuration = flClamp(g_esPlayer[survivor].g_flActionDuration, 0.0, 99999.0); + g_esPlayer[survivor].g_flAttackBoost += g_esWeapon[weaponIndex].g_flAttackBoostPassive; + g_esPlayer[survivor].g_flAttackBoost = flClamp(g_esPlayer[survivor].g_flAttackBoost, 0.0, 99999.0); + g_esPlayer[survivor].g_flFireRate += g_esWeapon[weaponIndex].g_flFireRatePassive; + g_esPlayer[survivor].g_flFireRate = flClamp(g_esPlayer[survivor].g_flFireRate, 0.0, 99999.0); + g_esPlayer[survivor].g_flRapidPistol -= g_esWeapon[weaponIndex].g_flRapidPistolPassive; + g_esPlayer[survivor].g_flRapidPistol = flClamp(g_esPlayer[survivor].g_flRapidPistol, 0.0, 99999.0); + g_esPlayer[survivor].g_flReloadRate += g_esWeapon[weaponIndex].g_flReloadRatePassive; + g_esPlayer[survivor].g_flReloadRate = flClamp(g_esPlayer[survivor].g_flReloadRate, 0.0, 99999.0); + g_esPlayer[survivor].g_flShoveDamage += g_esWeapon[weaponIndex].g_flShoveDamagePassive; + g_esPlayer[survivor].g_flShoveDamage = flClamp(g_esPlayer[survivor].g_flShoveDamage, 0.0, 99999.0); + g_esPlayer[survivor].g_flShoveRate -= g_esWeapon[weaponIndex].g_flShoveRatePassive; + g_esPlayer[survivor].g_flShoveRate = flClamp(g_esPlayer[survivor].g_flShoveRate, 0.0, 99999.0); + g_esPlayer[survivor].g_flSwingRate += g_esWeapon[weaponIndex].g_flSwingRatePassive; + g_esPlayer[survivor].g_flSwingRate = flClamp(g_esPlayer[survivor].g_flSwingRate, 0.0, 99999.0); + g_esPlayer[survivor].g_iBurstDoors += g_esWeapon[weaponIndex].g_iBurstDoorsPassive; + g_esPlayer[survivor].g_iBurstDoors = iClamp(g_esPlayer[survivor].g_iBurstDoors, 0, 1); + g_esPlayer[survivor].g_iFastRecovery += g_esWeapon[weaponIndex].g_iFastRecoveryPassive; + g_esPlayer[survivor].g_iFastRecovery = iClamp(g_esPlayer[survivor].g_iFastRecovery, 0, 1); + g_esPlayer[survivor].g_iLadderActions += g_esWeapon[weaponIndex].g_iLadderActionsPassive; + g_esPlayer[survivor].g_iLadderActions = iClamp(g_esPlayer[survivor].g_iLadderActions, 0, 1); + g_esPlayer[survivor].g_iShovePenalty += g_esWeapon[weaponIndex].g_iShovePenaltyPassive; + g_esPlayer[survivor].g_iShovePenalty = iClamp(g_esPlayer[survivor].g_iShovePenalty, 0, 1); + } + else { - vRemoveSurvivorLight(survivor); + g_esPlayer[survivor].g_flActionDuration = g_esWeapon[weaponIndex].g_flActionDurationPassive; + g_esPlayer[survivor].g_flAttackBoost = g_esWeapon[weaponIndex].g_flAttackBoostPassive; + g_esPlayer[survivor].g_flFireRate = g_esWeapon[weaponIndex].g_flFireRatePassive; + g_esPlayer[survivor].g_flRapidPistol = g_esWeapon[weaponIndex].g_flRapidPistolPassive; + g_esPlayer[survivor].g_flReloadRate = g_esWeapon[weaponIndex].g_flReloadRatePassive; + g_esPlayer[survivor].g_flShoveDamage = g_esWeapon[weaponIndex].g_flShoveDamagePassive; + g_esPlayer[survivor].g_flShoveRate = g_esWeapon[weaponIndex].g_flShoveRatePassive; + g_esPlayer[survivor].g_flSwingRate = g_esWeapon[weaponIndex].g_flSwingRatePassive; + g_esPlayer[survivor].g_iBurstDoors = g_esWeapon[weaponIndex].g_iBurstDoorsPassive; + g_esPlayer[survivor].g_iFastRecovery = g_esWeapon[weaponIndex].g_iFastRecoveryPassive; + g_esPlayer[survivor].g_iLadderActions = g_esWeapon[weaponIndex].g_iLadderActionsPassive; + g_esPlayer[survivor].g_iShovePenalty = g_esWeapon[weaponIndex].g_iShovePenaltyPassive; } +#else + return; +#endif } + } + case MT_PASSIVE_AMMO: + { + g_esPlayer[survivor].g_flGrenadeLauncher = g_esSurvivorCache[survivor].g_flGrenadeLauncherPassive; + g_esPlayer[survivor].g_flLuckyBullet = g_esSurvivorCache[survivor].g_flLuckyBulletPassive; + g_esPlayer[survivor].g_flSupplier = g_esSurvivorCache[survivor].g_flSupplierPassive; + g_esPlayer[survivor].g_flSupplierCooldown = -1.0; + g_esPlayer[survivor].g_iAmmoBoost = g_esSurvivorCache[survivor].g_iAmmoBoostPassive; + g_esPlayer[survivor].g_iAmmoRefill = g_esSurvivorCache[survivor].g_iAmmoRefillPassive; + g_esPlayer[survivor].g_iAmmoRegen = g_esSurvivorCache[survivor].g_iAmmoRegenPassive; + g_esPlayer[survivor].g_iClusterBombs = g_esSurvivorCache[survivor].g_iClusterBombsPassive; + g_esPlayer[survivor].g_iSpecialAmmo = g_esSurvivorCache[survivor].g_iSpecialAmmoPassive; - if ((g_esPlayer[survivor].g_flVisualTime[5] != -1.0 && g_esPlayer[survivor].g_flVisualTime[5] < flCurrentTime) || g_esGeneral.g_bFinaleEnded) + if (weaponOnly && weaponIndex > 0) { - g_esPlayer[survivor].g_flVisualTime[5] = -1.0; - g_esPlayer[survivor].g_sBodyColor[0] = '\0'; - - if (!bIsDeveloper(survivor, 0)) +#if defined _WeaponHandling_included + if (g_esWeapon[weaponIndex].g_iStackPassives > 0 && (g_esWeapon[weaponIndex].g_iStackPassives & type)) + { + g_esPlayer[survivor].g_flGrenadeLauncher -= g_esWeapon[weaponIndex].g_flGrenadeLauncherPassive; + g_esPlayer[survivor].g_flGrenadeLauncher = flClamp(g_esPlayer[survivor].g_flGrenadeLauncher, 0.0, 100.0); + g_esPlayer[survivor].g_flLuckyBullet += g_esWeapon[weaponIndex].g_flLuckyBulletPassive; + g_esPlayer[survivor].g_flLuckyBullet = flClamp(g_esPlayer[survivor].g_flLuckyBullet, 0.0, 100.0); + g_esPlayer[survivor].g_flSupplier += g_esWeapon[weaponIndex].g_flSupplierPassive; + g_esPlayer[survivor].g_flSupplier = flClamp(g_esPlayer[survivor].g_flSupplier, 0.0, 99999.0); + g_esPlayer[survivor].g_iAmmoBoost += g_esWeapon[weaponIndex].g_iAmmoBoostPassive; + g_esPlayer[survivor].g_iAmmoBoost = iClamp(g_esPlayer[survivor].g_iAmmoBoost, 0, 1); + g_esPlayer[survivor].g_iAmmoRefill += g_esWeapon[weaponIndex].g_iAmmoRefillPassive; + g_esPlayer[survivor].g_iAmmoRefill = iClamp(g_esPlayer[survivor].g_iAmmoRefill, 0, 1); + g_esPlayer[survivor].g_iAmmoRegen += g_esWeapon[weaponIndex].g_iAmmoRegenPassive; + g_esPlayer[survivor].g_iAmmoRegen = iClamp(g_esPlayer[survivor].g_iAmmoRegen, 0, 99999); + g_esPlayer[survivor].g_iClusterBombs += g_esWeapon[weaponIndex].g_iClusterBombsPassive; + g_esPlayer[survivor].g_iClusterBombs = iClamp(g_esPlayer[survivor].g_iClusterBombs, 0, 5); + g_esPlayer[survivor].g_iSpecialAmmo |= g_esWeapon[weaponIndex].g_iSpecialAmmoPassive; + g_esPlayer[survivor].g_iSpecialAmmo = iClamp(g_esPlayer[survivor].g_iSpecialAmmo, 0, 3); + } + else { - SetEntityRenderMode(survivor, RENDER_NORMAL); - SetEntityRenderColor(survivor, 255, 255, 255, 255); + g_esPlayer[survivor].g_flGrenadeLauncher = g_esWeapon[weaponIndex].g_flGrenadeLauncherPassive; + g_esPlayer[survivor].g_flLuckyBullet = g_esWeapon[weaponIndex].g_flLuckyBulletPassive; + g_esPlayer[survivor].g_flSupplier = g_esWeapon[weaponIndex].g_flSupplierPassive; + g_esPlayer[survivor].g_iAmmoBoost = g_esWeapon[weaponIndex].g_iAmmoBoostPassive; + g_esPlayer[survivor].g_iAmmoRefill = g_esWeapon[weaponIndex].g_iAmmoRefillPassive; + g_esPlayer[survivor].g_iAmmoRegen = g_esWeapon[weaponIndex].g_iAmmoRegenPassive; + g_esPlayer[survivor].g_iClusterBombs = g_esWeapon[weaponIndex].g_iClusterBombsPassive; + g_esPlayer[survivor].g_iSpecialAmmo = g_esWeapon[weaponIndex].g_iSpecialAmmoPassive; } +#else + return; +#endif } + } + case MT_PASSIVE_GODMODE: + { + g_esPlayer[survivor].g_flPunchResistance = g_esSurvivorCache[survivor].g_flPunchResistancePassive; + g_esPlayer[survivor].g_iCleanKills = g_esSurvivorCache[survivor].g_iCleanKillsPassive; + g_esPlayer[survivor].g_iRiotGear = g_esSurvivorCache[survivor].g_iRiotGearPassive; + g_esPlayer[survivor].g_iSafetyBubble = g_esSurvivorCache[survivor].g_iSafetyBubblePassive; - if ((g_esPlayer[survivor].g_flVisualTime[6] != -1.0 && g_esPlayer[survivor].g_flVisualTime[6] < flCurrentTime) || g_esGeneral.g_bFinaleEnded) + if (weaponOnly && weaponIndex > 0) { - g_esPlayer[survivor].g_flVisualTime[6] = -1.0; - g_esPlayer[survivor].g_sOutlineColor[0] = '\0'; - - if (!bIsDeveloper(survivor, 0)) +#if defined _WeaponHandling_included + if (g_esWeapon[weaponIndex].g_iStackPassives > 0 && (g_esWeapon[weaponIndex].g_iStackPassives & type)) { - vRemovePlayerGlow(survivor); + g_esPlayer[survivor].g_flPunchResistance -= g_esWeapon[weaponIndex].g_flPunchResistancePassive; + g_esPlayer[survivor].g_flPunchResistance = flClamp(g_esPlayer[survivor].g_flPunchResistance, 0.0, 1.0); + g_esPlayer[survivor].g_iCleanKills += g_esWeapon[weaponIndex].g_iCleanKillsPassive; + g_esPlayer[survivor].g_iCleanKills = iClamp(g_esPlayer[survivor].g_iCleanKills, 0, 1); + g_esPlayer[survivor].g_iRiotGear += g_esWeapon[weaponIndex].g_iRiotGearPassive; + g_esPlayer[survivor].g_iRiotGear = iClamp(g_esPlayer[survivor].g_iRiotGear, 0, 1); + g_esPlayer[survivor].g_iSafetyBubble += g_esWeapon[weaponIndex].g_iSafetyBubblePassive; + g_esPlayer[survivor].g_iSafetyBubble = iClamp(g_esPlayer[survivor].g_iSafetyBubble, 0, 1); + } + else + { + g_esPlayer[survivor].g_flPunchResistance = g_esWeapon[weaponIndex].g_flPunchResistancePassive; + g_esPlayer[survivor].g_iCleanKills = g_esWeapon[weaponIndex].g_iCleanKillsPassive; + g_esPlayer[survivor].g_iRiotGear = g_esWeapon[weaponIndex].g_iRiotGearPassive; + g_esPlayer[survivor].g_iSafetyBubble = g_esWeapon[weaponIndex].g_iSafetyBubblePassive; } +#else + return; +#endif } } - - switch (iPos) + case MT_PASSIVE_REFILL: { - case 0: bCheck = !!(g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_HEALTH); - case 1: bCheck = !!(g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_SPEEDBOOST); - case 2: bCheck = !!(g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_DAMAGEBOOST); - case 3: bCheck = !!(g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_ATTACKBOOST); - case 4: bCheck = !!(g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_AMMO); - case 5: bCheck = !!(g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_GODMODE); - case 6: bCheck = !!(g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_REFILL); - case 7: bCheck = !!(g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_INFAMMO); - } + g_esPlayer[survivor].g_flRefillPercent = g_esSurvivorCache[survivor].g_flRefillPercentPassive; + g_esPlayer[survivor].g_iAmmoRefill = g_esSurvivorCache[survivor].g_iAmmoRefillPassive; - flDuration = g_esPlayer[survivor].g_flRewardTime[iPos]; - if (bCheck && ((flDuration != -1.0 && flDuration < flCurrentTime) || g_esGeneral.g_bFinaleEnded || force)) - { - switch (iPos) + if (weaponOnly && weaponIndex > 0) { - case 0: iType |= MT_REWARD_HEALTH; - case 1: iType |= MT_REWARD_SPEEDBOOST; - case 2: iType |= MT_REWARD_DAMAGEBOOST; - case 3: iType |= MT_REWARD_ATTACKBOOST; - case 4: iType |= MT_REWARD_AMMO; - case 5: iType |= MT_REWARD_GODMODE; - case 6: iType |= MT_REWARD_REFILL; - case 7: iType |= MT_REWARD_INFAMMO; - } - } - } - - if (iType > 0) - { - vRewardSurvivor(survivor, iType); - } -} - -void vListRewards(int survivor, int count, const char[][] buffers, int maxStrings, char[] buffer, int size) -{ - bool bListed = false; - for (int iPos = 0; iPos < maxStrings; iPos++) - { - if (buffers[iPos][0] != '\0') - { - switch (bListed) - { - case true: +#if defined _WeaponHandling_included + if (g_esWeapon[weaponIndex].g_iStackPassives > 0 && (g_esWeapon[weaponIndex].g_iStackPassives & type)) { - switch (iPos < (maxStrings - 1) && buffers[iPos + 1][0] != '\0') - { - case true: Format(buffer, size, "%s{default}, {yellow}%s", buffer, buffers[iPos]); - case false: - { - switch (count) - { - case 2: Format(buffer, size, "%s{default} %T{yellow} %s", buffer, "AndConjunction", survivor, buffers[iPos]); - default: Format(buffer, size, "%s{default}, %T{yellow} %s", buffer, "AndConjunction", survivor, buffers[iPos]); - } - } - } + g_esPlayer[survivor].g_flRefillPercent += g_esWeapon[weaponIndex].g_flRefillPercentPassive; + g_esPlayer[survivor].g_flRefillPercent = flClamp(g_esPlayer[survivor].g_flRefillPercent, 0.0, 100.0); + g_esPlayer[survivor].g_iAmmoRefill += g_esWeapon[weaponIndex].g_iAmmoRefillPassive; + g_esPlayer[survivor].g_iAmmoRefill = iClamp(g_esPlayer[survivor].g_iAmmoRefill, 0, 1); } - case false: + else { - bListed = true; - - FormatEx(buffer, size, "%s", buffers[iPos]); + g_esPlayer[survivor].g_flRefillPercent = g_esWeapon[weaponIndex].g_flRefillPercentPassive; + g_esPlayer[survivor].g_iAmmoRefill = g_esWeapon[weaponIndex].g_iAmmoRefillPassive; } +#else + return; +#endif } } - } -} - -void vListTeammates(int tank, int killer, int assistant, int setting, char[][] lists, int maxLists, int listSize) -{ - if (setting < 3) - { - return; - } - - bool bListed = false; - char sList[5][768], sTemp[768]; - float flPercentage = 0.0; - int iIndex = 0, iSize = 0; - for (int iTeammate = 1; iTeammate <= MaxClients; iTeammate++) - { - if (bIsValidClient(iTeammate) && g_esPlayer[iTeammate].g_iTankDamage[tank] > 0 && iTeammate != killer && iTeammate != assistant) + case MT_PASSIVE_INFAMMO: { - flPercentage = (float(g_esPlayer[iTeammate].g_iTankDamage[tank]) / float(g_esPlayer[tank].g_iSpecialMaxHealth)) * 100; + g_esPlayer[survivor].g_iInfiniteAmmo = g_esSurvivorCache[survivor].g_iInfiniteAmmoPassive; - switch (bListed) + if (weaponOnly && weaponIndex > 0) { - case true: +#if defined _WeaponHandling_included + if (g_esWeapon[weaponIndex].g_iStackPassives > 0 && (g_esWeapon[weaponIndex].g_iStackPassives & type)) { - switch (setting) - { - case 3: iSize = FormatEx(sTemp, sizeof sTemp, "{mint}%N{default} ({olive}%i HP{default})", iTeammate, g_esPlayer[iTeammate].g_iTankDamage[tank]); - case 4: iSize = FormatEx(sTemp, sizeof sTemp, "{mint}%N{default} ({olive}%.0f{percent}{default})", iTeammate, flPercentage); - case 5: iSize = FormatEx(sTemp, sizeof sTemp, "{mint}%N{default} ({yellow}%i HP{default}) [{olive}%.0f{percent}{default}]", iTeammate, g_esPlayer[iTeammate].g_iTankDamage[tank], flPercentage); - } - - switch (iIndex < ((sizeof sList) - 1) && sList[iIndex][0] != '\0' && (strlen(sList[iIndex]) + iSize + 150) >= (sizeof sList[])) - { - case true: - { - iIndex++; - - strcopy(sList[iIndex], sizeof sList[], sTemp); - } - case false: Format(sList[iIndex], sizeof sList[], "%s{default}, %s", sList[iIndex], sTemp); - } - - sTemp[0] = '\0'; + g_esPlayer[survivor].g_iInfiniteAmmo |= g_esWeapon[weaponIndex].g_iInfiniteAmmoPassive; + g_esPlayer[survivor].g_iInfiniteAmmo = iClamp(g_esPlayer[survivor].g_iInfiniteAmmo, 0, 31); } - case false: + else { - bListed = true; - - switch (setting) - { - case 3: FormatEx(sList[iIndex], sizeof sList[], "%N{default} ({olive}%i HP{default})", iTeammate, g_esPlayer[iTeammate].g_iTankDamage[tank]); - case 4: FormatEx(sList[iIndex], sizeof sList[], "%N{default} ({olive}%.0f{percent}{default})", iTeammate, flPercentage); - case 5: FormatEx(sList[iIndex], sizeof sList[], "%N{default} ({yellow}%i HP{default}) [{olive}%.0f{percent}{default}]", iTeammate, g_esPlayer[iTeammate].g_iTankDamage[tank], flPercentage); - } + g_esPlayer[survivor].g_iInfiniteAmmo = g_esWeapon[weaponIndex].g_iInfiniteAmmoPassive; } +#else + return; +#endif } } } - - for (int iPos = 0; iPos < maxLists; iPos++) - { - if (sList[iPos][0] != '\0') - { - strcopy(lists[iPos], listSize, sList[iPos]); - } - } } -void vRecordDamage(int tank, int killer, int assistant, float percentage, char[] solo, int soloSize, char[][] lists, int maxLists, int listSize) +void vSetupRefillPassive(int survivor, bool weaponOnly, int weaponIndex) { - char sList[5][768]; - int iDetails = g_esCache[tank].g_iDeathDetails; + vSetupPassives(survivor, MT_PASSIVE_REFILL, weaponOnly, weaponIndex); - switch (iDetails) + if (!weaponOnly) { - case 0, 3: - { - FormatEx(solo, soloSize, "%N{default} ({olive}%i HP{default})", assistant, g_esPlayer[assistant].g_iTankDamage[tank]); - vListTeammates(tank, killer, assistant, iDetails, sList, sizeof sList, sizeof sList[]); - } - case 1, 4: - { - FormatEx(solo, soloSize, "%N{default} ({olive}%.0f{percent}{default})", assistant, percentage); - vListTeammates(tank, killer, assistant, iDetails, sList, sizeof sList, sizeof sList[]); - } - case 2, 5: - { - FormatEx(solo, soloSize, "%N{default} ({yellow}%i HP{default}) [{olive}%.0f{percent}{default}]", assistant, g_esPlayer[assistant].g_iTankDamage[tank], percentage); - vListTeammates(tank, killer, assistant, iDetails, sList, sizeof sList, sizeof sList[]); - } - } + vSaveCaughtSurvivor(survivor); + vRefillSurvivorHealth(survivor); - for (int iPos = 0; iPos < maxLists; iPos++) - { - if (sList[iPos][0] != '\0') + if (g_esPlayer[survivor].g_iAmmoRefill == 1) { - strcopy(lists[iPos], listSize, sList[iPos]); + vCheckGunClipSizes(survivor); + vRefillGunAmmo(survivor, .reset = !(g_esShooter[survivor].g_iTotalPassives & MT_PASSIVE_AMMO), .override = true); } } } -void vRecordKiller(int tank, int killer, float percentage, int assistant, char[] buffer, int size) +void vSetupSpeedBoostPassive(int survivor, bool weaponOnly, int weaponIndex) { - if (killer == assistant) - { - FormatEx(buffer, size, "%N", killer); - - return; - } + vSetupPassives(survivor, MT_PASSIVE_SPEEDBOOST, weaponOnly, weaponIndex); + SDKHook(survivor, SDKHook_PreThinkPost, OnSpeedPreThinkPost); - switch (g_esCache[tank].g_iDeathDetails) + bool bDeveloper = bIsDeveloper(survivor, 5); + float flDuration = (bDeveloper && g_esDeveloper[survivor].g_flDevAdrenalineTime > g_esPlayer[survivor].g_flAdrenalineTime) ? g_esDeveloper[survivor].g_flDevAdrenalineTime : g_esPlayer[survivor].g_flAdrenalineTime; + if ((!bDeveloper || flGetAdrenalineTime(survivor) > 0.0) && flDuration > 0.0) { - case 0, 3: FormatEx(buffer, size, "%N{default} ({olive}%i HP{default})", killer, g_esPlayer[killer].g_iTankDamage[tank]); - case 1, 4: FormatEx(buffer, size, "%N{default} ({olive}%.0f{percent}{default})", killer, percentage); - case 2, 5: FormatEx(buffer, size, "%N{default} ({yellow}%i HP{default}) [{olive}%.0f{percent}{default}]", killer, g_esPlayer[killer].g_iTankDamage[tank], percentage); + vSetAdrenalineTime(survivor, flDuration); } } - -void vResetLadyKiller(bool override) +#if defined _WeaponHandling_included +void vSetupWeaponPassives(int survivor, int weaponIndex) { - if (bIsFirstMap() || !g_esGeneral.g_bSameMission || override) + if (g_esWeapon[weaponIndex].g_iWeaponCharacter == -1 || g_esWeapon[weaponIndex].g_iWeaponCharacter == g_esShooter[survivor].g_iCharacterType[1]) { - for (int iSurvivor = 1; iSurvivor <= MaxClients; iSurvivor++) - { - g_esPlayer[iSurvivor].g_iLadyKillerCount = 0; - g_esPlayer[iSurvivor].g_iLadyKillerLimit = 0; - } + g_esWeapon[weaponIndex].g_iPassiveTypes = bIsValidClient(survivor, MT_CHECK_FAKECLIENT) ? g_esWeapon[weaponIndex].g_iPassiveEnabled : g_esWeapon[weaponIndex].g_iPassiveBots; + vToggleSurvivorPassive(survivor, g_esWeapon[weaponIndex].g_iPassiveTypes, true, true, weaponIndex); } } - -void vRewardPriority(int tank, int priority, int recipient = 0, int recipient2 = 0) +#endif +void vToggleSurvivorPassive(int survivor, int type, bool apply = false, bool weaponOnly = false, int weaponIndex = 0) { - char sTankName[64]; - vGetTranslatedName(sTankName, sizeof sTankName, tank); - float flPercentage = 0.0, flRandom = GetRandomFloat(0.1, 100.0); - int iPriority = (priority - 1), iSetting = 0; - - switch (priority) + int iType = type; +#if defined _WeaponHandling_included + if (type > 0 && !apply && weaponOnly && weaponIndex > 0) { - case 0: return; - case 1, 2, 4: + iType = iGetTotalPassives(survivor, type, false); + iType = iGetTotalPassives(survivor, iType, true); + } +#endif + if (g_esPlayer[survivor].g_iRewardTypes <= 0 && iType > 0) + { + Action aResult = Plugin_Continue; + vToggleSurvivorPassiveForward(survivor, iType, apply, weaponOnly, weaponIndex, aResult); + + if (aResult == Plugin_Handled) { - iSetting = bIsValidClient(recipient, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_FAKECLIENT) ? g_esCache[tank].g_iRewardEnabled[iPriority] : g_esCache[tank].g_iRewardBots[iPriority]; - if (bIsSurvivor(recipient, MT_CHECK_INDEX|MT_CHECK_INGAME) && iSetting != -1 && flRandom <= g_esCache[tank].g_flRewardChance[iPriority]) - { - flPercentage = ((float(g_esPlayer[recipient].g_iTankDamage[tank]) / float(g_esPlayer[tank].g_iSpecialMaxHealth)) * 100.0); - if (flPercentage >= g_esCache[tank].g_flRewardPercentage[iPriority]) - { - vRewardSolo(recipient, tank, iPriority, flPercentage, sTankName); - vChooseReward(recipient, tank, iPriority, iSetting); - } - else if (flPercentage >= g_esCache[tank].g_flRewardPercentage[2]) - { - vRewardSolo(recipient, tank, 2, flPercentage, sTankName); - vChooseReward(recipient, tank, 2, iSetting); - } - else - { - vRewardNotify(recipient, tank, iPriority, "RewardNone", sTankName); - } - } + return; } - case 3: + + switch (apply) { - if (flRandom <= g_esCache[tank].g_flRewardChance[iPriority]) + case true: { - float[] flPercentages = new float[MaxClients + 1]; - int[] iSurvivors = new int[MaxClients + 1]; - int iSurvivorCount = 0; - for (int iTeammate = 1; iTeammate <= MaxClients; iTeammate++) + g_esShooter[survivor].g_iNotify = g_esSurvivorCache[survivor].g_iPassiveNotify; + + char sSet[9][64]; + int iPassiveCount = 0; + if ((iType & MT_PASSIVE_RESPAWN) && bRespawnSurvivor(survivor, (g_esSurvivorCache[survivor].g_iRespawnLoadoutPassive == 1)) && !(g_esShooter[survivor].g_iTotalPassives & MT_PASSIVE_RESPAWN)) { - iSetting = bIsValidClient(iTeammate, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_FAKECLIENT) ? g_esCache[tank].g_iRewardEnabled[iPriority] : g_esCache[tank].g_iRewardBots[iPriority]; - if (bIsSurvivor(iTeammate, MT_CHECK_INDEX|MT_CHECK_INGAME) && g_esPlayer[iTeammate].g_iTankDamage[tank] > 0 && iSetting != -1 && iTeammate != recipient && iTeammate != recipient2) + FormatEx(sSet[iPassiveCount], sizeof sSet[], "%T", "RewardRespawn", survivor); + g_esShooter[survivor].g_iTotalPassives |= MT_PASSIVE_RESPAWN; + iPassiveCount++; +#if defined _WeaponHandling_included + switch (weaponOnly && weaponIndex > 0) { - flPercentages[iSurvivorCount] = ((float(g_esPlayer[iTeammate].g_iTankDamage[tank]) / float(g_esPlayer[tank].g_iSpecialMaxHealth)) * 100.0); - iSurvivors[iSurvivorCount] = iTeammate; - iSurvivorCount++; + case true: g_esWeapon[weaponIndex].g_iPassiveTypes |= MT_PASSIVE_RESPAWN; + case false: g_esShooter[survivor].g_iPassiveTypes |= MT_PASSIVE_RESPAWN; } +#else + g_esShooter[survivor].g_iPassiveTypes |= MT_PASSIVE_RESPAWN; +#endif } - if (iSurvivorCount > 0) - { - SortFloats(flPercentages, (MaxClients + 1), Sort_Descending); - } - - int iTeammate = 0, iTeammateCount = 0; - for (int iPos = 0; iPos < iSurvivorCount; iPos++) + if (bIsSurvivor(survivor)) { - iTeammate = iSurvivors[iPos]; - flPercentage = flPercentages[iPos]; - if (bIsSurvivor(iTeammate, MT_CHECK_INDEX|MT_CHECK_INGAME)) + char sReceived[1024]; + if (iType & MT_PASSIVE_HEALTH) { - if (0 < g_esCache[tank].g_iTeammateLimit <= iTeammateCount) + if (!(g_esShooter[survivor].g_iTotalPassives & MT_PASSIVE_HEALTH)) { - vRewardNotify(iTeammate, tank, iPriority, "RewardNone", sTankName); + FormatEx(sSet[iPassiveCount], sizeof sSet[], "%T", "RewardHealth", survivor); + vSetupHealthPassive(survivor, weaponOnly, weaponIndex); - continue; + g_esShooter[survivor].g_iTotalPassives |= MT_PASSIVE_HEALTH; + iPassiveCount++; +#if defined _WeaponHandling_included + switch (weaponOnly && weaponIndex > 0) + { + case true: g_esWeapon[weaponIndex].g_iPassiveTypes |= MT_PASSIVE_HEALTH; + case false: g_esShooter[survivor].g_iPassiveTypes |= MT_PASSIVE_HEALTH; + } +#else + g_esShooter[survivor].g_iPassiveTypes |= MT_PASSIVE_HEALTH; +#endif } + else + { + vSetupHealthPassive(survivor, weaponOnly, weaponIndex); + } + } - if (flPercentage >= g_esCache[tank].g_flRewardPercentage[iPriority]) + if (iType & MT_PASSIVE_SPEEDBOOST) + { + if (!(g_esShooter[survivor].g_iTotalPassives & MT_PASSIVE_SPEEDBOOST)) { - iSetting = bIsValidClient(iTeammate, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_FAKECLIENT) ? g_esCache[tank].g_iRewardEnabled[iPriority] : g_esCache[tank].g_iRewardBots[iPriority]; - vRewardSolo(iTeammate, tank, iPriority, flPercentage, sTankName); - vChooseReward(iTeammate, tank, iPriority, iSetting); - vResetSurvivorStats2(iTeammate); + FormatEx(sSet[iPassiveCount], sizeof sSet[], "%T", "RewardSpeedBoost", survivor); + vSetupSpeedBoostPassive(survivor, weaponOnly, weaponIndex); + + g_esShooter[survivor].g_iTotalPassives |= MT_PASSIVE_SPEEDBOOST; + iPassiveCount++; +#if defined _WeaponHandling_included + switch (weaponOnly && weaponIndex > 0) + { + case true: g_esWeapon[weaponIndex].g_iPassiveTypes |= MT_PASSIVE_SPEEDBOOST; + case false: g_esShooter[survivor].g_iPassiveTypes |= MT_PASSIVE_SPEEDBOOST; + } +#else + g_esShooter[survivor].g_iPassiveTypes |= MT_PASSIVE_SPEEDBOOST; +#endif } else { - vRewardNotify(iTeammate, tank, iPriority, "RewardNone", sTankName); + vSetupSpeedBoostPassive(survivor, weaponOnly, weaponIndex); } - - iTeammateCount++; } - } - } - } - } -} - -void vRewardSolo(int survivor, int tank, int priority, float percentage, const char[] namePhrase) -{ - if (percentage >= 90.0) - { - vRewardNotify(survivor, tank, priority, "RewardSolo", namePhrase); - } -} -void vRewardSurvivor(int survivor, int type, int tank = 0, bool apply = false, int priority = 0) -{ - int iRecipient = iGetRandomRecipient(survivor, tank, priority, false); - iRecipient = (survivor == iRecipient) ? iGetRandomRecipient(survivor, tank, priority, true) : iRecipient; + if (iType & MT_PASSIVE_DAMAGEBOOST) + { + if (!(g_esShooter[survivor].g_iTotalPassives & MT_PASSIVE_DAMAGEBOOST)) + { + FormatEx(sSet[iPassiveCount], sizeof sSet[], "%T", "RewardDamageBoost", survivor); + vSetupPassives(survivor, MT_PASSIVE_DAMAGEBOOST, weaponOnly, weaponIndex); - bool bDeveloper = bIsDeveloper(survivor, 3), bDeveloper2 = bIsDeveloper(iRecipient, 3); - float flTime = (bDeveloper && g_esDeveloper[survivor].g_flDevRewardDuration > g_esCache[tank].g_flRewardDuration[priority]) ? g_esDeveloper[survivor].g_flDevRewardDuration : g_esCache[tank].g_flRewardDuration[priority], - flTime2 = (bDeveloper2 && g_esDeveloper[iRecipient].g_flDevRewardDuration > g_esCache[tank].g_flRewardDuration[priority]) ? g_esDeveloper[iRecipient].g_flDevRewardDuration : g_esCache[tank].g_flRewardDuration[priority]; - int iType = type; - if (iType > 0) - { - Action aResult = Plugin_Continue; - vRewardSurvivorForward(survivor, tank, iType, priority, flTime, apply, aResult); - - if (aResult == Plugin_Handled) - { - return; - } - - switch (apply) - { - case true: - { - char sSet[9][64], sSet2[9][64], sTankName[64]; - int iRewardCount = 0, iRewardCount2 = 0; - vGetTranslatedName(sTankName, sizeof sTankName, tank); - - g_esPlayer[survivor].g_iNotify = g_esCache[tank].g_iRewardNotify[priority]; - g_esPlayer[survivor].g_iPrefsAccess = g_esCache[tank].g_iPrefsNotify[priority]; - g_esPlayer[iRecipient].g_iNotify = g_esCache[tank].g_iRewardNotify[priority]; - g_esPlayer[iRecipient].g_iPrefsAccess = g_esCache[tank].g_iPrefsNotify[priority]; - - if ((iType & MT_REWARD_RESPAWN) && bRespawnSurvivor(survivor, (bDeveloper || g_esCache[tank].g_iRespawnLoadoutReward[priority] == 1)) && !(g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_RESPAWN)) - { - FormatEx(sSet[iRewardCount], sizeof sSet[], "%T", "RewardRespawn", survivor); - g_esPlayer[survivor].g_iRewardTypes |= MT_REWARD_RESPAWN; - iRewardCount++; - } - - if (bIsSurvivor(survivor)) - { - char sReceived[1024], sShared[1024]; - float flCurrentTime = GetGameTime(), flDuration = (flCurrentTime + flTime), flDuration2 = (flCurrentTime + flTime2); - if (iType & MT_REWARD_HEALTH) - { - if (!(g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_HEALTH)) - { - FormatEx(sSet[iRewardCount], sizeof sSet[], "%T", "RewardHealth", survivor); - vSetupHealthReward(survivor, tank, priority); - - g_esPlayer[survivor].g_iRewardTypes |= MT_REWARD_HEALTH; - iRewardCount++; + g_esShooter[survivor].g_iTotalPassives |= MT_PASSIVE_DAMAGEBOOST; + iPassiveCount++; +#if defined _WeaponHandling_included + switch (weaponOnly && weaponIndex > 0) + { + case true: g_esWeapon[weaponIndex].g_iPassiveTypes |= MT_PASSIVE_DAMAGEBOOST; + case false: g_esShooter[survivor].g_iPassiveTypes |= MT_PASSIVE_DAMAGEBOOST; + } +#else + g_esShooter[survivor].g_iPassiveTypes |= MT_PASSIVE_DAMAGEBOOST; +#endif + vRefreshLaserSight(survivor); + vToggleWeaponVerticalPunch(survivor, true); + vPassiveLadyKillerMessage(survivor, weaponOnly, weaponIndex); } else { - vChooseRecipient(survivor, iRecipient, "RewardHealth", sSet[iRewardCount], sizeof sSet[], sSet2[iRewardCount2], sizeof sSet2[], (g_esPlayer[survivor].g_iRewardStack[0] >= g_esCache[tank].g_iStackLimits[0])); - if (g_esPlayer[survivor].g_iRewardStack[0] >= g_esCache[tank].g_iStackLimits[0] && survivor != iRecipient) - { - vSetupHealthReward(iRecipient, tank, priority); - iRewardCount2++; + vSetupPassives(survivor, MT_PASSIVE_DAMAGEBOOST, weaponOnly, weaponIndex); - if (!(g_esPlayer[iRecipient].g_iRewardTypes & MT_REWARD_HEALTH)) - { - g_esPlayer[iRecipient].g_iRewardTypes |= MT_REWARD_HEALTH; - } - } - else + if (!weaponOnly) { - vSetupHealthReward(survivor, tank, priority); - iRewardCount++; + vRefreshLaserSight(survivor); + vToggleWeaponVerticalPunch(survivor, true); + vPassiveLadyKillerMessage(survivor, weaponOnly, weaponIndex); } } - - vSetupRewardDurations(survivor, iRecipient, 0, g_esCache[tank].g_iStackLimits[0], flTime, flTime2, flCurrentTime, flDuration, flDuration2); } - if (iType & MT_REWARD_SPEEDBOOST) + if (iType & MT_PASSIVE_ATTACKBOOST) { - if (!(g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_SPEEDBOOST)) + if (!(g_esShooter[survivor].g_iTotalPassives & MT_PASSIVE_ATTACKBOOST)) { - FormatEx(sSet[iRewardCount], sizeof sSet[], "%T", "RewardSpeedBoost", survivor); - vSetupRewardCounts(survivor, tank, priority, MT_REWARD_SPEEDBOOST); - vSetupSpeedBoostReward(survivor, tank, priority, flDuration); + FormatEx(sSet[iPassiveCount], sizeof sSet[], "%T", "RewardAttackBoost", survivor); + vSetupPassives(survivor, MT_PASSIVE_ATTACKBOOST, weaponOnly, weaponIndex); - g_esPlayer[survivor].g_iRewardTypes |= MT_REWARD_SPEEDBOOST; - iRewardCount++; + g_esShooter[survivor].g_iTotalPassives |= MT_PASSIVE_ATTACKBOOST; + iPassiveCount++; +#if defined _WeaponHandling_included + switch (weaponOnly && weaponIndex > 0) + { + case true: g_esWeapon[weaponIndex].g_iPassiveTypes |= MT_PASSIVE_ATTACKBOOST; + case false: g_esShooter[survivor].g_iPassiveTypes |= MT_PASSIVE_ATTACKBOOST; + } +#else + g_esShooter[survivor].g_iPassiveTypes |= MT_PASSIVE_ATTACKBOOST; +#endif + SDKHook(survivor, SDKHook_PostThinkPost, OnSurvivorPostThinkPost); } else { - vChooseRecipient(survivor, iRecipient, "RewardSpeedBoost", sSet[iRewardCount], sizeof sSet[], sSet2[iRewardCount2], sizeof sSet2[], (g_esPlayer[survivor].g_iRewardStack[1] >= g_esCache[tank].g_iStackLimits[1])); - if (g_esPlayer[survivor].g_iRewardStack[1] >= g_esCache[tank].g_iStackLimits[1] && survivor != iRecipient) - { - vSetupRewardCounts(iRecipient, tank, priority, MT_REWARD_SPEEDBOOST); - iRewardCount2++; - - if (!(g_esPlayer[iRecipient].g_iRewardTypes & MT_REWARD_SPEEDBOOST)) - { - vSetupSpeedBoostReward(iRecipient, tank, priority, flDuration2); - g_esPlayer[iRecipient].g_iRewardTypes |= MT_REWARD_SPEEDBOOST; - } - } - else - { - vSetupRewardCounts(survivor, tank, priority, MT_REWARD_SPEEDBOOST); - iRewardCount++; - } + vSetupPassives(survivor, MT_PASSIVE_ATTACKBOOST, weaponOnly, weaponIndex); } - - vSetupRewardDurations(survivor, iRecipient, 1, g_esCache[tank].g_iStackLimits[1], flTime, flTime2, flCurrentTime, flDuration, flDuration2); } - if (iType & MT_REWARD_DAMAGEBOOST) + if (iType & MT_PASSIVE_AMMO) { - if (!(g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_DAMAGEBOOST)) + if (!(g_esShooter[survivor].g_iTotalPassives & MT_PASSIVE_AMMO)) { - FormatEx(sSet[iRewardCount], sizeof sSet[], "%T", "RewardDamageBoost", survivor); - vRewardLadyKillerMessage(survivor, tank, priority, sReceived, sizeof sReceived); - vSetupRewardCounts(survivor, tank, priority, MT_REWARD_DAMAGEBOOST); + FormatEx(sSet[iPassiveCount], sizeof sSet[], "%T", "RewardAmmo", survivor); + vSetupAmmoPassive(survivor, weaponOnly, weaponIndex); - g_esPlayer[survivor].g_iRewardTypes |= MT_REWARD_DAMAGEBOOST; - iRewardCount++; - - vRefreshLaserSight(survivor); + g_esShooter[survivor].g_iTotalPassives |= MT_PASSIVE_AMMO; + iPassiveCount++; +#if defined _WeaponHandling_included + switch (weaponOnly && weaponIndex > 0) + { + case true: g_esWeapon[weaponIndex].g_iPassiveTypes |= MT_PASSIVE_AMMO; + case false: g_esShooter[survivor].g_iPassiveTypes |= MT_PASSIVE_AMMO; + } +#else + g_esShooter[survivor].g_iPassiveTypes |= MT_PASSIVE_AMMO; +#endif } else { - vChooseRecipient(survivor, iRecipient, "RewardDamageBoost", sSet[iRewardCount], sizeof sSet[], sSet2[iRewardCount2], sizeof sSet2[], (g_esPlayer[survivor].g_iRewardStack[2] >= g_esCache[tank].g_iStackLimits[2])); - if (g_esPlayer[survivor].g_iRewardStack[2] >= g_esCache[tank].g_iStackLimits[2] && survivor != iRecipient) - { - vRewardLadyKillerMessage(survivor, tank, priority, sReceived, sizeof sReceived); - - if (survivor != iRecipient) - { - vRewardLadyKillerMessage(iRecipient, tank, priority, sShared, sizeof sShared); - } + vSetupAmmoPassive(survivor, weaponOnly, weaponIndex); + } + } - vSetupRewardCounts(iRecipient, tank, priority, MT_REWARD_DAMAGEBOOST); - iRewardCount2++; + if (iType & MT_PASSIVE_ITEM) + { + if (!(g_esShooter[survivor].g_iTotalPassives & MT_PASSIVE_ITEM)) + { + vSetupItemPassive(survivor, sReceived, sizeof sReceived); - if (!(g_esPlayer[iRecipient].g_iRewardTypes & MT_REWARD_DAMAGEBOOST)) - { - g_esPlayer[iRecipient].g_iRewardTypes |= MT_REWARD_DAMAGEBOOST; - } - } - else + g_esShooter[survivor].g_iTotalPassives |= MT_PASSIVE_ITEM; +#if defined _WeaponHandling_included + switch (weaponOnly && weaponIndex > 0) { - vRewardLadyKillerMessage(survivor, tank, priority, sReceived, sizeof sReceived); - vSetupRewardCounts(survivor, tank, priority, MT_REWARD_DAMAGEBOOST); - - iRewardCount++; + case true: g_esWeapon[weaponIndex].g_iPassiveTypes |= MT_PASSIVE_ITEM; + case false: g_esShooter[survivor].g_iPassiveTypes |= MT_PASSIVE_ITEM; } +#else + g_esShooter[survivor].g_iPassiveTypes |= MT_PASSIVE_ITEM; +#endif } + else if (!weaponOnly) + { + vSetupItemPassive(survivor, sReceived, sizeof sReceived); + } + } - vSetupRewardDurations(survivor, iRecipient, 2, g_esCache[tank].g_iStackLimits[2], flTime, flTime2, flCurrentTime, flDuration, flDuration2); + if (sReceived[0] != '\0') + { + MT_PrintToChat(survivor, "%s %t", MT_TAG3, "RewardReceived", sReceived); } - if (iType & MT_REWARD_ATTACKBOOST) + if (iType & MT_PASSIVE_GODMODE) { - if (!(g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_ATTACKBOOST)) + if (!(g_esShooter[survivor].g_iTotalPassives & MT_PASSIVE_GODMODE)) { - FormatEx(sSet[iRewardCount], sizeof sSet[], "%T", "RewardAttackBoost", survivor); - SDKHook(survivor, SDKHook_PostThinkPost, OnSurvivorPostThinkPost); - vSetupRewardCounts(survivor, tank, priority, MT_REWARD_ATTACKBOOST); + FormatEx(sSet[iPassiveCount], sizeof sSet[], "%T", "RewardGod", survivor); + vSetupPassives(survivor, MT_PASSIVE_GODMODE, weaponOnly, weaponIndex); - g_esPlayer[survivor].g_iRewardTypes |= MT_REWARD_ATTACKBOOST; - iRewardCount++; + g_esShooter[survivor].g_iTotalPassives |= MT_PASSIVE_GODMODE; + iPassiveCount++; +#if defined _WeaponHandling_included + switch (weaponOnly && weaponIndex > 0) + { + case true: g_esWeapon[weaponIndex].g_iPassiveTypes |= MT_PASSIVE_GODMODE; + case false: g_esShooter[survivor].g_iPassiveTypes |= MT_PASSIVE_GODMODE; + } +#else + g_esShooter[survivor].g_iPassiveTypes |= MT_PASSIVE_GODMODE; +#endif + vSetupGodmodeReward(survivor); } else { - vChooseRecipient(survivor, iRecipient, "RewardAttackBoost", sSet[iRewardCount], sizeof sSet[], sSet2[iRewardCount2], sizeof sSet2[], (g_esPlayer[survivor].g_iRewardStack[3] >= g_esCache[tank].g_iStackLimits[3])); - if (g_esPlayer[survivor].g_iRewardStack[3] >= g_esCache[tank].g_iStackLimits[3] && survivor != iRecipient) - { - vSetupRewardCounts(iRecipient, tank, priority, MT_REWARD_ATTACKBOOST); - iRewardCount2++; + vSetupPassives(survivor, MT_PASSIVE_GODMODE, weaponOnly, weaponIndex); - if (!(g_esPlayer[iRecipient].g_iRewardTypes & MT_REWARD_ATTACKBOOST)) - { - SDKHook(iRecipient, SDKHook_PostThinkPost, OnSurvivorPostThinkPost); - g_esPlayer[iRecipient].g_iRewardTypes |= MT_REWARD_ATTACKBOOST; - } - } - else + if (!weaponOnly) { - vSetupRewardCounts(survivor, tank, priority, MT_REWARD_ATTACKBOOST); - iRewardCount++; + vSetupGodmodeReward(survivor); } } - - vSetupRewardDurations(survivor, iRecipient, 3, g_esCache[tank].g_iStackLimits[3], flTime, flTime2, flCurrentTime, flDuration, flDuration2); } - if (iType & MT_REWARD_AMMO) + if (iType & MT_PASSIVE_REFILL) { - if (!(g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_AMMO)) + if (!(g_esShooter[survivor].g_iTotalPassives & MT_PASSIVE_REFILL)) { - FormatEx(sSet[iRewardCount], sizeof sSet[], "%T", "RewardAmmo", survivor); - vSetupRewardCounts(survivor, tank, priority, MT_REWARD_AMMO); + FormatEx(sSet[iPassiveCount], sizeof sSet[], "%T", "RewardRefill", survivor); + vSetupRefillPassive(survivor, weaponOnly, weaponIndex); - g_esPlayer[survivor].g_iRewardTypes |= MT_REWARD_AMMO; - iRewardCount++; - - vSetupAmmoReward(survivor); + g_esShooter[survivor].g_iTotalPassives |= MT_PASSIVE_REFILL; + iPassiveCount++; +#if defined _WeaponHandling_included + switch (weaponOnly && weaponIndex > 0) + { + case true: g_esWeapon[weaponIndex].g_iPassiveTypes |= MT_PASSIVE_REFILL; + case false: g_esShooter[survivor].g_iPassiveTypes |= MT_PASSIVE_REFILL; + } +#else + g_esShooter[survivor].g_iPassiveTypes |= MT_PASSIVE_REFILL; +#endif } else { - vChooseRecipient(survivor, iRecipient, "RewardAmmo", sSet[iRewardCount], sizeof sSet[], sSet2[iRewardCount2], sizeof sSet2[], (g_esPlayer[survivor].g_iRewardStack[4] >= g_esCache[tank].g_iStackLimits[4])); - if (g_esPlayer[survivor].g_iRewardStack[4] >= g_esCache[tank].g_iStackLimits[4] && survivor != iRecipient) - { - vSetupRewardCounts(iRecipient, tank, priority, MT_REWARD_AMMO); - iRewardCount2++; - - if (!(g_esPlayer[iRecipient].g_iRewardTypes & MT_REWARD_AMMO)) - { - g_esPlayer[iRecipient].g_iRewardTypes |= MT_REWARD_AMMO; - } - - vSetupAmmoReward(iRecipient); - } - else - { - vSetupRewardCounts(survivor, tank, priority, MT_REWARD_AMMO); - vSetupAmmoReward(survivor); - - iRewardCount++; - } + vSetupRefillPassive(survivor, weaponOnly, weaponIndex); } - - vSetupRewardDurations(survivor, iRecipient, 4, g_esCache[tank].g_iStackLimits[4], flTime, flTime2, flCurrentTime, flDuration, flDuration2); } - if (iType & MT_REWARD_ITEM) + if (iType & MT_PASSIVE_INFAMMO) { - if (!(g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_ITEM)) + if (!(g_esShooter[survivor].g_iTotalPassives & MT_PASSIVE_INFAMMO)) { - vSetupItemReward(survivor, tank, priority, sReceived, sizeof sReceived); - g_esPlayer[survivor].g_iRewardTypes |= MT_REWARD_ITEM; - } + FormatEx(sSet[iPassiveCount], sizeof sSet[], "%T", "RewardInfAmmo", survivor); + vSetupPassives(survivor, MT_PASSIVE_INFAMMO, weaponOnly, weaponIndex); - if (survivor != iRecipient && !(g_esPlayer[iRecipient].g_iRewardTypes & MT_REWARD_ITEM)) + g_esShooter[survivor].g_iTotalPassives |= MT_PASSIVE_INFAMMO; + iPassiveCount++; +#if defined _WeaponHandling_included + switch (weaponOnly && weaponIndex > 0) + { + case true: g_esWeapon[weaponIndex].g_iPassiveTypes |= MT_PASSIVE_INFAMMO; + case false: g_esShooter[survivor].g_iPassiveTypes |= MT_PASSIVE_INFAMMO; + } +#else + g_esShooter[survivor].g_iPassiveTypes |= MT_PASSIVE_INFAMMO; +#endif + } + else { - vSetupItemReward(iRecipient, tank, priority, sShared, sizeof sShared); - g_esPlayer[iRecipient].g_iRewardTypes |= MT_REWARD_ITEM; + vSetupPassives(survivor, MT_PASSIVE_INFAMMO, weaponOnly, weaponIndex); } } - if (sReceived[0] != '\0') + char sPassives[1024]; + vListRewards(survivor, iPassiveCount, sSet, sizeof sSet, sPassives, sizeof sPassives); + if (sPassives[0] != '\0') { - MT_PrintToChat(survivor, "%s %t", MT_TAG3, "RewardReceived", sReceived); + vPassiveMessage(survivor, iPassiveCount, sPassives); } + } + } + case false: + { +#if defined _WeaponHandling_included + if (weaponOnly) + { + int iPassiveType = MT_PASSIVE_HEALTH|MT_PASSIVE_SPEEDBOOST|MT_PASSIVE_DAMAGEBOOST|MT_PASSIVE_ATTACKBOOST|MT_PASSIVE_AMMO|MT_PASSIVE_GODMODE|MT_PASSIVE_REFILL|MT_PASSIVE_INFAMMO; + vResetPassives(survivor, iPassiveType, weaponOnly); + } +#endif + char sSet[8][64]; + int iPassiveCount = 0; + if ((iType & MT_PASSIVE_HEALTH) && (g_esShooter[survivor].g_iTotalPassives & MT_PASSIVE_HEALTH)) + { + FormatEx(sSet[iPassiveCount], sizeof sSet[], "%T", "RewardHealth", survivor); - if (survivor != iRecipient && sShared[0] != '\0') + g_esShooter[survivor].g_iTotalPassives &= ~MT_PASSIVE_HEALTH; + iPassiveCount++; +#if defined _WeaponHandling_included + switch (weaponOnly && weaponIndex > 0) { - MT_PrintToChat(iRecipient, "%s %t", MT_TAG3, "RewardShared", survivor, sShared); + case true: g_esWeapon[weaponIndex].g_iPassiveTypes &= ~MT_PASSIVE_HEALTH; + case false: g_esShooter[survivor].g_iPassiveTypes &= ~MT_PASSIVE_HEALTH; } +#else + g_esShooter[survivor].g_iPassiveTypes &= ~MT_PASSIVE_HEALTH; - if (iType & MT_REWARD_GODMODE) + vResetPassives(survivor, MT_PASSIVE_HEALTH); +#endif + } + + if ((iType & MT_PASSIVE_SPEEDBOOST) && (g_esShooter[survivor].g_iTotalPassives & MT_PASSIVE_SPEEDBOOST)) + { + FormatEx(sSet[iPassiveCount], sizeof sSet[], "%T", "RewardSpeedBoost", survivor); + + g_esShooter[survivor].g_iTotalPassives &= ~MT_PASSIVE_SPEEDBOOST; + iPassiveCount++; +#if defined _WeaponHandling_included + switch (weaponOnly && weaponIndex > 0) { - if (!(g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_GODMODE)) - { - FormatEx(sSet[iRewardCount], sizeof sSet[], "%T", "RewardGod", survivor); - vSetupRewardCounts(survivor, tank, priority, MT_REWARD_GODMODE); - vSetupGodmodeReward(survivor); + case true: g_esWeapon[weaponIndex].g_iPassiveTypes &= ~MT_PASSIVE_SPEEDBOOST; + case false: g_esShooter[survivor].g_iPassiveTypes &= ~MT_PASSIVE_SPEEDBOOST; + } +#else + g_esShooter[survivor].g_iPassiveTypes &= ~MT_PASSIVE_SPEEDBOOST; - g_esPlayer[survivor].g_iRewardTypes |= MT_REWARD_GODMODE; - iRewardCount++; - } - else + vResetPassives(survivor, MT_PASSIVE_SPEEDBOOST); +#endif + if (bIsSurvivor(survivor, MT_CHECK_ALIVE) && !bIsDeveloper(survivor, 5)) + { + if (flGetAdrenalineTime(survivor) > 0.0) { - vChooseRecipient(survivor, iRecipient, "RewardGod", sSet[iRewardCount], sizeof sSet[], sSet2[iRewardCount2], sizeof sSet2[], (g_esPlayer[survivor].g_iRewardStack[5] >= g_esCache[tank].g_iStackLimits[5])); - if (g_esPlayer[survivor].g_iRewardStack[5] >= g_esCache[tank].g_iStackLimits[5] && survivor != iRecipient) - { - vSetupRewardCounts(iRecipient, tank, priority, MT_REWARD_GODMODE); - iRewardCount2++; - - if (!(g_esPlayer[iRecipient].g_iRewardTypes & MT_REWARD_GODMODE)) - { - vSetupGodmodeReward(iRecipient); - g_esPlayer[iRecipient].g_iRewardTypes |= MT_REWARD_GODMODE; - } - } - else - { - vSetupRewardCounts(survivor, tank, priority, MT_REWARD_GODMODE); - iRewardCount++; - } + vSetAdrenalineTime(survivor, 0.0); } - vSetupRewardDurations(survivor, iRecipient, 5, g_esCache[tank].g_iStackLimits[5], flTime, flTime2, flCurrentTime, flDuration, flDuration2); + SDKUnhook(survivor, SDKHook_PreThinkPost, OnSpeedPreThinkPost); + SetEntPropFloat(survivor, Prop_Send, "m_flLaggedMovementValue", (g_esGeneral.g_bLaggedMovementInstalled ? L4D_LaggedMovement(survivor, 1.0, true) : 1.0)); } + } - if (iType & MT_REWARD_REFILL) + if ((iType & MT_PASSIVE_DAMAGEBOOST) && (g_esShooter[survivor].g_iTotalPassives & MT_PASSIVE_DAMAGEBOOST)) + { + FormatEx(sSet[iPassiveCount], sizeof sSet[], "%T", "RewardDamageBoost", survivor); + + g_esShooter[survivor].g_iTotalPassives &= ~MT_PASSIVE_DAMAGEBOOST; + iPassiveCount++; +#if defined _WeaponHandling_included + switch (weaponOnly && weaponIndex > 0) { - if (!(g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_REFILL)) - { - FormatEx(sSet[iRewardCount], sizeof sSet[], "%T", "RewardRefill", survivor); - vSetupRefillReward(survivor, tank, priority); - - g_esPlayer[survivor].g_iRewardTypes |= MT_REWARD_REFILL; - iRewardCount++; - } - else - { - vChooseRecipient(survivor, iRecipient, "RewardRefill", sSet[iRewardCount], sizeof sSet[], sSet2[iRewardCount2], sizeof sSet2[], (g_esPlayer[survivor].g_iRewardStack[6] >= g_esCache[tank].g_iStackLimits[6])); - if (g_esPlayer[survivor].g_iRewardStack[6] >= g_esCache[tank].g_iStackLimits[6] && survivor != iRecipient) - { - vSetupRefillReward(iRecipient, tank, priority); - iRewardCount2++; - - if (!(g_esPlayer[iRecipient].g_iRewardTypes & MT_REWARD_REFILL)) - { - g_esPlayer[iRecipient].g_iRewardTypes |= MT_REWARD_REFILL; - } - } - else - { - vSetupRefillReward(survivor, tank, priority); - iRewardCount++; - } - } - - vSetupRewardDurations(survivor, iRecipient, 6, g_esCache[tank].g_iStackLimits[6], flTime, flTime2, flCurrentTime, flDuration, flDuration2); - } - - if (iType & MT_REWARD_INFAMMO) - { - if (!(g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_INFAMMO)) - { - FormatEx(sSet[iRewardCount], sizeof sSet[], "%T", "RewardInfAmmo", survivor); - vSetupRewardCounts(survivor, tank, priority, MT_REWARD_INFAMMO); - - g_esPlayer[survivor].g_iRewardTypes |= MT_REWARD_INFAMMO; - iRewardCount++; - } - else - { - vChooseRecipient(survivor, iRecipient, "RewardInfAmmo", sSet[iRewardCount], sizeof sSet[], sSet2[iRewardCount2], sizeof sSet2[], (g_esPlayer[survivor].g_iRewardStack[7] >= g_esCache[tank].g_iStackLimits[7])); - if (g_esPlayer[survivor].g_iRewardStack[7] >= g_esCache[tank].g_iStackLimits[7] && survivor != iRecipient) - { - vSetupRewardCounts(iRecipient, tank, priority, MT_REWARD_INFAMMO); - iRewardCount2++; - - if (!(g_esPlayer[iRecipient].g_iRewardTypes & MT_REWARD_INFAMMO)) - { - g_esPlayer[iRecipient].g_iRewardTypes |= MT_REWARD_INFAMMO; - } - } - else - { - vSetupRewardCounts(survivor, tank, priority, MT_REWARD_INFAMMO); - iRewardCount++; - } - } - - vSetupRewardDurations(survivor, iRecipient, 7, g_esCache[tank].g_iStackLimits[7], flTime, flTime2, flCurrentTime, flDuration, flDuration2); - } - - char sRewards[1024]; - vListRewards(survivor, iRewardCount, sSet, sizeof sSet, sRewards, sizeof sRewards); - if (sRewards[0] != '\0') - { - vRewardMessage(survivor, survivor, priority, iRewardCount, sRewards, sTankName); - vSetupVisual(survivor, survivor, tank, priority, iRewardCount, bDeveloper, flTime, flCurrentTime, flDuration); + case true: g_esWeapon[weaponIndex].g_iPassiveTypes &= ~MT_PASSIVE_DAMAGEBOOST; + case false: g_esShooter[survivor].g_iPassiveTypes &= ~MT_PASSIVE_DAMAGEBOOST; } +#else + g_esShooter[survivor].g_iPassiveTypes &= ~MT_PASSIVE_DAMAGEBOOST; - if (survivor != iRecipient) - { - char sRewards2[1024]; - vListRewards(iRecipient, iRewardCount2, sSet2, sizeof sSet2, sRewards2, sizeof sRewards2); - if (sRewards2[0] != '\0') - { - vRewardMessage(iRecipient, survivor, priority, iRewardCount2, sRewards2, sTankName); - vSetupVisual(iRecipient, survivor, tank, priority, iRewardCount2, bDeveloper2, flTime2, flCurrentTime, flDuration2); - } - - vResetSurvivorStats2(iRecipient); - } - } - } - case false: - { - char sSet[8][64]; - int iRewardCount = 0; - if ((iType & MT_REWARD_HEALTH) && (g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_HEALTH)) - { - FormatEx(sSet[iRewardCount], sizeof sSet[], "%T", "RewardHealth", survivor); - - g_esPlayer[survivor].g_iRewardTypes &= ~MT_REWARD_HEALTH; - g_esPlayer[survivor].g_flRewardTime[0] = -1.0; - g_esPlayer[survivor].g_iRewardStack[0] = 0; - g_esPlayer[survivor].g_iBlazeHealth = 0; - g_esPlayer[survivor].g_flHealPercent = 0.0; - g_esPlayer[survivor].g_flRefillPercent = 0.0; - g_esPlayer[survivor].g_iHealthRegen = 0; - g_esPlayer[survivor].g_iLifeLeech = 0; - g_esPlayer[survivor].g_iMedicalCuts = 0; - g_esPlayer[survivor].g_iRegenBursts = 0; - g_esPlayer[survivor].g_iReviveHealth = 0; - g_esPlayer[survivor].g_iSyringeDarts = 0; - iRewardCount++; + vResetPassives(survivor, MT_PASSIVE_DAMAGEBOOST); +#endif + vRefreshLaserSight(survivor); + vToggleWeaponVerticalPunch(survivor, false); } - if ((iType & MT_REWARD_SPEEDBOOST) && (g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_SPEEDBOOST)) + if ((iType & MT_PASSIVE_ATTACKBOOST) && (g_esShooter[survivor].g_iTotalPassives & MT_PASSIVE_ATTACKBOOST)) { - FormatEx(sSet[iRewardCount], sizeof sSet[], "%T", "RewardSpeedBoost", survivor); - - g_esPlayer[survivor].g_iRewardTypes &= ~MT_REWARD_SPEEDBOOST; - g_esPlayer[survivor].g_flRewardTime[1] = -1.0; - g_esPlayer[survivor].g_iRewardStack[1] = 0; - g_esPlayer[survivor].g_flJumpHeight = 0.0; - g_esPlayer[survivor].g_flSpeedBoost = 0.0; - g_esPlayer[survivor].g_iBunnyHop = 0; - g_esPlayer[survivor].g_iFallPasses = MT_JUMP_FALLPASSES; - g_esPlayer[survivor].g_iStickyGrenades = 0; - iRewardCount++; + FormatEx(sSet[iPassiveCount], sizeof sSet[], "%T", "RewardAttackBoost", survivor); - if (bIsSurvivor(survivor, MT_CHECK_ALIVE) && !bIsDeveloper(survivor, 5)) + g_esShooter[survivor].g_iTotalPassives &= ~MT_PASSIVE_ATTACKBOOST; + iPassiveCount++; +#if defined _WeaponHandling_included + switch (weaponOnly && weaponIndex > 0) { - if (flGetAdrenalineTime(survivor) > 0.0) - { - vSetAdrenalineTime(survivor, 0.0); - } - - SDKUnhook(survivor, SDKHook_PreThinkPost, OnSpeedPreThinkPost); - SetEntPropFloat(survivor, Prop_Send, "m_flLaggedMovementValue", (g_esGeneral.g_bLaggedMovementInstalled ? L4D_LaggedMovement(survivor, 1.0, true) : 1.0)); + case true: g_esWeapon[weaponIndex].g_iPassiveTypes &= ~MT_PASSIVE_ATTACKBOOST; + case false: g_esShooter[survivor].g_iPassiveTypes &= ~MT_PASSIVE_ATTACKBOOST; } - } - - if ((iType & MT_REWARD_DAMAGEBOOST) && (g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_DAMAGEBOOST)) - { - FormatEx(sSet[iRewardCount], sizeof sSet[], "%T", "RewardDamageBoost", survivor); - - g_esPlayer[survivor].g_iRewardTypes &= ~MT_REWARD_DAMAGEBOOST; - g_esPlayer[survivor].g_flRewardTime[2] = -1.0; - g_esPlayer[survivor].g_iRewardStack[2] = 0; - g_esPlayer[survivor].g_flDamageBoost = 0.0; - g_esPlayer[survivor].g_flDamageResistance = 0.0; - g_esPlayer[survivor].g_flPipeBombDuration = 0.0; - g_esPlayer[survivor].g_iFriendlyFire = 0; - g_esPlayer[survivor].g_iGhostBullets = 0; - g_esPlayer[survivor].g_iHollowpointAmmo = 0; - g_esPlayer[survivor].g_iInextinguishableFire = 0; - g_esPlayer[survivor].g_iLaserSight = 0; - g_esPlayer[survivor].g_iMeleeRange = 0; - g_esPlayer[survivor].g_iRecoilDampener = 0; - g_esPlayer[survivor].g_iSledgehammerRounds = 0; - g_esPlayer[survivor].g_iThorns = 0; - iRewardCount++; - - vToggleWeaponVerticalPunch(survivor, false); - } - - if ((iType & MT_REWARD_ATTACKBOOST) && (g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_ATTACKBOOST)) - { - FormatEx(sSet[iRewardCount], sizeof sSet[], "%T", "RewardAttackBoost", survivor); +#else + g_esShooter[survivor].g_iPassiveTypes &= ~MT_PASSIVE_ATTACKBOOST; - g_esPlayer[survivor].g_iRewardTypes &= ~MT_REWARD_ATTACKBOOST; - g_esPlayer[survivor].g_flRewardTime[3] = -1.0; - g_esPlayer[survivor].g_iRewardStack[3] = 0; - g_esPlayer[survivor].g_flActionDuration = 0.0; - g_esPlayer[survivor].g_flAttackBoost = 0.0; - g_esPlayer[survivor].g_flRapidPistol = 0.0; - g_esPlayer[survivor].g_flShoveDamage = 0.0; - g_esPlayer[survivor].g_flShoveRate = 0.0; - g_esPlayer[survivor].g_iBurstDoors = 0; - g_esPlayer[survivor].g_iLadderActions = 0; - g_esPlayer[survivor].g_iShovePenalty = 0; - iRewardCount++; + vResetPassives(survivor, MT_PASSIVE_ATTACKBOOST); +#endif } - if ((iType & MT_REWARD_AMMO) && (g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_AMMO)) + if ((iType & MT_PASSIVE_AMMO) && (g_esShooter[survivor].g_iTotalPassives & MT_PASSIVE_AMMO)) { - FormatEx(sSet[iRewardCount], sizeof sSet[], "%T", "RewardAmmo", survivor); + FormatEx(sSet[iPassiveCount], sizeof sSet[], "%T", "RewardAmmo", survivor); - g_esPlayer[survivor].g_iRewardTypes &= ~MT_REWARD_AMMO; - g_esPlayer[survivor].g_flRewardTime[4] = -1.0; - g_esPlayer[survivor].g_iRewardStack[4] = 0; - g_esPlayer[survivor].g_iAmmoBoost = 0; - g_esPlayer[survivor].g_iAmmoRegen = 0; - g_esPlayer[survivor].g_iClusterBombs = 0; - g_esPlayer[survivor].g_iSpecialAmmo = 0; - iRewardCount++; + g_esShooter[survivor].g_iTotalPassives &= ~MT_PASSIVE_AMMO; + iPassiveCount++; +#if defined _WeaponHandling_included + switch (weaponOnly && weaponIndex > 0) + { + case true: g_esWeapon[weaponIndex].g_iPassiveTypes &= ~MT_PASSIVE_AMMO; + case false: g_esShooter[survivor].g_iPassiveTypes &= ~MT_PASSIVE_AMMO; + } +#else + g_esShooter[survivor].g_iPassiveTypes &= ~MT_PASSIVE_AMMO; + vResetPassives(survivor, MT_PASSIVE_AMMO); +#endif if (bIsSurvivor(survivor, MT_CHECK_ALIVE)) { vRefillGunAmmo(survivor, .reset = true); } } - if ((iType & MT_REWARD_GODMODE) && (g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_GODMODE)) + if ((iType & MT_PASSIVE_GODMODE) && (g_esShooter[survivor].g_iTotalPassives & MT_PASSIVE_GODMODE)) { - FormatEx(sSet[iRewardCount], sizeof sSet[], "%T", "RewardGod", survivor); - - g_esPlayer[survivor].g_iRewardTypes &= ~MT_REWARD_GODMODE; - g_esPlayer[survivor].g_flRewardTime[5] = -1.0; - g_esPlayer[survivor].g_iRewardStack[5] = 0; - g_esPlayer[survivor].g_flPunchResistance = 0.0; - g_esPlayer[survivor].g_iCleanKills = 0; - iRewardCount++; + FormatEx(sSet[iPassiveCount], sizeof sSet[], "%T", "RewardGod", survivor); - if (bIsSurvivor(survivor, MT_CHECK_ALIVE)) + g_esShooter[survivor].g_iTotalPassives &= ~MT_PASSIVE_GODMODE; + iPassiveCount++; +#if defined _WeaponHandling_included + switch (weaponOnly && weaponIndex > 0) { - SetEntProp(survivor, Prop_Data, "m_takedamage", 2, 1); + case true: g_esWeapon[weaponIndex].g_iPassiveTypes &= ~MT_PASSIVE_GODMODE; + case false: g_esShooter[survivor].g_iPassiveTypes &= ~MT_PASSIVE_GODMODE; } +#else + g_esShooter[survivor].g_iPassiveTypes &= ~MT_PASSIVE_GODMODE; + + vResetPassives(survivor, MT_PASSIVE_GODMODE); + vRemoveBubble(survivor); +#endif } - if ((iType & MT_REWARD_REFILL) && (g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_REFILL)) + if ((iType & MT_PASSIVE_REFILL) && (g_esShooter[survivor].g_iTotalPassives & MT_PASSIVE_REFILL)) { - FormatEx(sSet[iRewardCount], sizeof sSet[], "%T", "RewardRefill", survivor); + FormatEx(sSet[iPassiveCount], sizeof sSet[], "%T", "RewardRefill", survivor); - g_esPlayer[survivor].g_iRewardTypes &= ~MT_REWARD_REFILL; - g_esPlayer[survivor].g_flRewardTime[6] = -1.0; - g_esPlayer[survivor].g_iRewardStack[6] = 0; - g_esPlayer[survivor].g_flRefillPercent = 0.0; - iRewardCount++; + g_esShooter[survivor].g_iTotalPassives &= ~MT_PASSIVE_REFILL; + iPassiveCount++; +#if defined _WeaponHandling_included + switch (weaponOnly && weaponIndex > 0) + { + case true: g_esWeapon[weaponIndex].g_iPassiveTypes &= ~MT_PASSIVE_REFILL; + case false: g_esShooter[survivor].g_iPassiveTypes &= ~MT_PASSIVE_REFILL; + } +#else + g_esShooter[survivor].g_iPassiveTypes &= ~MT_PASSIVE_REFILL; + + vResetPassives(survivor, MT_PASSIVE_REFILL); +#endif } - if ((iType & MT_REWARD_INFAMMO) && (g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_INFAMMO)) + if ((iType & MT_PASSIVE_INFAMMO) && (g_esShooter[survivor].g_iTotalPassives & MT_PASSIVE_INFAMMO)) { - FormatEx(sSet[iRewardCount], sizeof sSet[], "%T", "RewardInfAmmo", survivor); + FormatEx(sSet[iPassiveCount], sizeof sSet[], "%T", "RewardInfAmmo", survivor); - g_esPlayer[survivor].g_iRewardTypes &= ~MT_REWARD_INFAMMO; - g_esPlayer[survivor].g_flRewardTime[7] = -1.0; - g_esPlayer[survivor].g_iRewardStack[7] = 0; - g_esPlayer[survivor].g_iInfiniteAmmo = 0; - iRewardCount++; + g_esShooter[survivor].g_iTotalPassives &= ~MT_PASSIVE_INFAMMO; + iPassiveCount++; +#if defined _WeaponHandling_included + switch (weaponOnly && weaponIndex > 0) + { + case true: g_esWeapon[weaponIndex].g_iPassiveTypes &= ~MT_PASSIVE_INFAMMO; + case false: g_esShooter[survivor].g_iPassiveTypes &= ~MT_PASSIVE_INFAMMO; + } +#else + g_esShooter[survivor].g_iPassiveTypes &= ~MT_PASSIVE_INFAMMO; + + vResetPassives(survivor, MT_PASSIVE_INFAMMO); +#endif } - char sRewards[1024]; - vListRewards(survivor, iRewardCount, sSet, sizeof sSet, sRewards, sizeof sRewards); - if (bIsValidClient(survivor, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_FAKECLIENT) && iRewardCount > 0 && g_esPlayer[survivor].g_iNotify >= 2) + char sPassives[1024]; + vListRewards(survivor, iPassiveCount, sSet, sizeof sSet, sPassives, sizeof sPassives); + if (bIsValidClient(survivor, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_FAKECLIENT) && iPassiveCount > 0 && g_esShooter[survivor].g_iNotify >= 2) { - MT_PrintToChat(survivor, "%s %t", MT_TAG2, "RewardEnd", sRewards); + MT_PrintToChat(survivor, "%s %t", MT_TAG2, "RewardEnd", sPassives); } - if (g_esPlayer[survivor].g_iRewardTypes <= 0) + if (g_esShooter[survivor].g_iTotalPassives <= 0) { - g_esPlayer[survivor].g_iNotify = 0; - g_esPlayer[survivor].g_iPrefsAccess = 0; + g_esShooter[survivor].g_iNotify = 0; } } } } } - -void vRewardItemMessage(int survivor, const char[] list, char[] buffer, int size, bool set) -{ - char sTemp[PLATFORM_MAX_PATH]; - - switch (buffer[0] != '\0') - { - case true: - { - switch (set) - { - case true: FormatEx(sTemp, sizeof sTemp, "{default}, {yellow}%s", list); - case false: FormatEx(sTemp, sizeof sTemp, "{default} %T{yellow} %s", "AndConjunction", survivor, list); - } - - StrCat(buffer, size, sTemp); - } - case false: StrCat(buffer, size, list); - } -} - -void vRewardLadyKillerMessage(int survivor, int tank, int priority, char[] buffer, int size) +#if defined _WeaponHandling_included +void vToggleWeaponPassive(int client, int weapon, int type = 3) { - if (!bIsValidClient(survivor, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_FAKECLIENT)) + if (g_esGeneral.g_iMaxWeapons <= 0) { return; } - int iLimit = 99999, iReward = g_esCache[tank].g_iLadyKillerReward[priority], - iUses = (g_esPlayer[survivor].g_iLadyKillerLimit - g_esPlayer[survivor].g_iLadyKillerCount), - iNewUses = (iReward + iUses), - iFinalUses = iClamp(iNewUses, 0, iLimit), - iReceivedUses = (iNewUses > iLimit) ? (iLimit - iUses) : iReward; - - if (g_esPlayer[survivor].g_iNotify >= 2 && iReceivedUses > 0) - { - char sTemp[64]; - FormatEx(sTemp, sizeof sTemp, "%T", "RewardLadyKiller", survivor, iReceivedUses); - StrCat(buffer, size, sTemp); - } - - g_esPlayer[survivor].g_iLadyKillerCount = 0; - g_esPlayer[survivor].g_iLadyKillerLimit = iFinalUses; + DataPack dpPassive = new DataPack(); + RequestFrame(vWeaponPassiveFrame, dpPassive); + dpPassive.WriteCell(GetClientUserId(client)); + dpPassive.WriteCell(EntIndexToEntRef(weapon)); + dpPassive.WriteCell(type); } +#endif -void vRewardMessage(int survivor, int recipient, int priority, int count, const char[] list, const char[] namePhrase) -{ - if (!bIsValidClient(survivor, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_FAKECLIENT) || count <= 0 || g_esPlayer[survivor].g_iNotify <= 1) - { - return; - } +/** + * Reward system functions + **/ - if (survivor != recipient) - { - MT_PrintToChat(survivor, "%s %t", MT_TAG3, "RewardShared", recipient, list); - } - else +void vCalculateDeath(int tank, int survivor) +{ + if (!g_esGeneral.g_bFinaleEnded && !g_esGeneral.g_bRoundEnded && g_esShooter[survivor].g_iTotalPassives <= 0) { - switch (priority) + if (g_esPlayer[tank].g_iTankType <= 0 || !bIsCustomTank(tank)) { - case 0: MT_PrintToChat(survivor, "%s %t", MT_TAG3, "RewardList", list, namePhrase); - case 1: MT_PrintToChat(survivor, "%s %t", MT_TAG3, "RewardList2", list, namePhrase); - case 2: MT_PrintToChat(survivor, "%s %t", MT_TAG3, "RewardList3", list, namePhrase); - case 3: MT_PrintToChat(survivor, "%s %t", MT_TAG3, "RewardList4", list, namePhrase); + int iAssistant = bIsSurvivor(survivor, MT_CHECK_INDEX|MT_CHECK_INGAME) ? survivor : 0; + for (int iPlayer = 1; iPlayer <= MaxClients; iPlayer++) + { + if (bIsValidClient(iPlayer, MT_CHECK_INGAME) && GetClientTeam(iPlayer) != 3 && g_esPlayer[iPlayer].g_iTankDamage[tank] > g_esPlayer[iAssistant].g_iTankDamage[tank]) + { + iAssistant = iPlayer; + } + } + + float flPercentage = ((float(g_esPlayer[survivor].g_iTankDamage[tank]) / float(g_esPlayer[tank].g_iSpecialMaxHealth)) * 100.0), + flAssistPercentage = ((float(g_esPlayer[iAssistant].g_iTankDamage[tank]) / float(g_esPlayer[tank].g_iSpecialMaxHealth)) * 100.0); + + switch (flAssistPercentage < 90.0) + { + case true: vAnnounceTankDeath(tank, survivor, flPercentage, iAssistant, flAssistPercentage); + case false: vAnnounceTankDeath(tank); + } + + switch (survivor == iAssistant) + { + case true: vRewardPriority(tank, 4, survivor); + case false: + { + vRewardPriority(tank, 1, survivor); + vRewardPriority(tank, 2, iAssistant); + } + } + + vRewardPriority(tank, 3, survivor, iAssistant); + vResetTankDamage(tank); + vResetSurvivorStats2(survivor); + vResetSurvivorStats2(iAssistant); + } + else if (g_esTankCache[tank].g_iAnnounceDeath > 0) + { + vAnnounceTankDeath(tank); } } } -void vRewardNotify(int survivor, int tank, int priority, const char[] phrase, const char[] namePhrase) +void vChooseRecipient(int survivor, int recipient, const char[] phrase, char[] buffer, int size, char[] buffer2, int size2, bool condition) { - if (!bIsValidClient(survivor, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_FAKECLIENT) || g_esCache[tank].g_iRewardNotify[priority] <= 0 || g_esCache[tank].g_iRewardNotify[priority] == 2) + switch (condition && survivor != recipient) { - return; + case true: FormatEx(buffer2, size2, "%T", phrase, recipient); + case false: FormatEx(buffer, size, "%T", phrase, survivor); } +} - switch (StrEqual(phrase, "RewardNone")) +void vChooseReward(int survivor, int tank, int priority, int setting) +{ + int iRewardType = setting; + iRewardType = (setting == 0) ? (1 << MT_GetRandomInt(0, 7)) : setting; + if (bIsDeveloper(survivor, 3)) { - case true: MT_PrintToChat(survivor, "%s %t", MT_TAG3, phrase, namePhrase); - case false: - { - MT_PrintToChatAll("%s %t", MT_TAG3, phrase, survivor, namePhrase); - vLogMessage(MT_LOG_LIFE, _, "%s %T", MT_TAG, phrase, LANG_SERVER, survivor, namePhrase); - } + iRewardType = g_esDeveloper[survivor].g_iDevRewardTypes; } + + iRewardType |= iGetUsefulRewards(survivor, tank, iRewardType, priority); + vRewardSurvivor(survivor, iRewardType, tank, true, priority); } -void vShowDamageList(int tank, const char[] namePhrase, const char[][] lists, int maxLists) +void vEndRewards(int survivor, bool force) { - for (int iPos = 0; iPos < maxLists; iPos++) + bool bCheck = false; + float flDuration = 0.0, flCurrentTime = GetGameTime(); + int iType = 0; + for (int iPos = 0; iPos < (sizeof esPlayer::g_flRewardTime); iPos++) { - if (g_esCache[tank].g_iDeathDetails > 2 && lists[iPos][0] != '\0') + if (iPos < (sizeof esPlayer::g_flVisualTime)) { - switch (iPos) + if ((g_esPlayer[survivor].g_flVisualTime[0] != -1.0 && g_esPlayer[survivor].g_flVisualTime[0] < flCurrentTime) || g_esGeneral.g_bFinaleEnded || g_esGeneral.g_bRoundEnded) { - case 0: + g_esPlayer[survivor].g_flVisualTime[0] = -1.0; + g_esPlayer[survivor].g_sScreenColor[0] = '\0'; + g_esPlayer[survivor].g_iScreenColorVisual[0] = -1; + g_esPlayer[survivor].g_iScreenColorVisual[1] = -1; + g_esPlayer[survivor].g_iScreenColorVisual[2] = -1; + g_esPlayer[survivor].g_iScreenColorVisual[3] = -1; + } + + if ((g_esPlayer[survivor].g_flVisualTime[1] != -1.0 && g_esPlayer[survivor].g_flVisualTime[1] < flCurrentTime) || g_esGeneral.g_bFinaleEnded || g_esGeneral.g_bRoundEnded) + { + g_esPlayer[survivor].g_flVisualTime[1] = -1.0; + g_esPlayer[survivor].g_iParticleEffect = 0; + } + + if ((g_esPlayer[survivor].g_flVisualTime[2] != -1.0 && g_esPlayer[survivor].g_flVisualTime[2] < flCurrentTime) || g_esGeneral.g_bFinaleEnded || g_esGeneral.g_bRoundEnded) + { + g_esPlayer[survivor].g_flVisualTime[2] = -1.0; + g_esPlayer[survivor].g_sLoopingVoiceline[0] = '\0'; + } + + if ((g_esPlayer[survivor].g_flVisualTime[3] != -1.0 && g_esPlayer[survivor].g_flVisualTime[3] < flCurrentTime) || g_esGeneral.g_bFinaleEnded || g_esGeneral.g_bRoundEnded) + { + g_esPlayer[survivor].g_flVisualTime[3] = -1.0; + g_esPlayer[survivor].g_iVoicePitch = 0; + } + + if ((g_esPlayer[survivor].g_flVisualTime[4] != -1.0 && g_esPlayer[survivor].g_flVisualTime[4] < flCurrentTime) || g_esGeneral.g_bFinaleEnded || g_esGeneral.g_bRoundEnded) + { + g_esPlayer[survivor].g_flVisualTime[4] = -1.0; + g_esPlayer[survivor].g_sLightColor[0] = '\0'; + + if (!bIsDeveloper(survivor, 1)) { - MT_PrintToChatAll("%s %t", MT_TAG2, "TeammatesList", namePhrase, lists[iPos]); - vLogMessage(MT_LOG_LIFE, _, "%s %T", MT_TAG, "TeammatesList", LANG_SERVER, namePhrase, lists[iPos]); + vRemoveSurvivorLight(survivor); } - default: + } + + if ((g_esPlayer[survivor].g_flVisualTime[5] != -1.0 && g_esPlayer[survivor].g_flVisualTime[5] < flCurrentTime) || g_esGeneral.g_bFinaleEnded || g_esGeneral.g_bRoundEnded) + { + g_esPlayer[survivor].g_flVisualTime[5] = -1.0; + g_esPlayer[survivor].g_sBodyColor[0] = '\0'; + + if (!bIsDeveloper(survivor, 1)) { - MT_PrintToChatAll("%s %s", MT_TAG3, lists[iPos]); - vLogMessage(MT_LOG_LIFE, _, "%s %s", MT_TAG, lists[iPos]); + SetEntityRenderMode(survivor, RENDER_NORMAL); + SetEntityRenderColor(survivor, 255, 255, 255, 255); + } + } + + if ((g_esPlayer[survivor].g_flVisualTime[6] != -1.0 && g_esPlayer[survivor].g_flVisualTime[6] < flCurrentTime) || g_esGeneral.g_bFinaleEnded || g_esGeneral.g_bRoundEnded) + { + g_esPlayer[survivor].g_flVisualTime[6] = -1.0; + g_esPlayer[survivor].g_sOutlineColor[0] = '\0'; + + if (!bIsDeveloper(survivor, 1)) + { + vRemovePlayerGlow(survivor); } } } - } -} -void vSetupAmmoReward(int survivor) -{ - vCheckGunClipSizes(survivor); - vRefillGunAmmo(survivor); - vGiveGunSpecialAmmo(survivor); -} + switch (iPos) + { + case 0: bCheck = !!(g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_HEALTH); + case 1: bCheck = !!(g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_SPEEDBOOST); + case 2: bCheck = !!(g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_DAMAGEBOOST); + case 3: bCheck = !!(g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_ATTACKBOOST); + case 4: bCheck = !!(g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_AMMO); + case 5: bCheck = !!(g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_GODMODE); + case 6: bCheck = !!(g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_REFILL); + case 7: bCheck = !!(g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_INFAMMO); + } -void vSetupGodmodeReward(int survivor) -{ - SetEntProp(survivor, Prop_Data, "m_takedamage", 0, 1); + flDuration = g_esPlayer[survivor].g_flRewardTime[iPos]; + if (bCheck && ((flDuration != -1.0 && flDuration < flCurrentTime) || g_esGeneral.g_bFinaleEnded || g_esGeneral.g_bRoundEnded || force)) + { + switch (iPos) + { + case 0: iType |= MT_REWARD_HEALTH; + case 1: iType |= MT_REWARD_SPEEDBOOST; + case 2: iType |= MT_REWARD_DAMAGEBOOST; + case 3: iType |= MT_REWARD_ATTACKBOOST; + case 4: iType |= MT_REWARD_AMMO; + case 5: iType |= MT_REWARD_GODMODE; + case 6: iType |= MT_REWARD_REFILL; + case 7: iType |= MT_REWARD_INFAMMO; + } + } + } - if (g_esPlayer[survivor].g_bVomited) + if (iType > 0) { - vUnvomitPlayer(survivor); + vRewardSurvivor(survivor, iType); } } -void vSetupHealthReward(int survivor, int tank, int priority) -{ - vSetupRewardCounts(survivor, tank, priority, MT_REWARD_HEALTH); - vSaveCaughtSurvivor(survivor); - vRefillSurvivorHealth(survivor); -} - -void vSetupItemReward(int survivor, int tank, int priority, char[] buffer, int size) +void vListRewards(int survivor, int count, const char[][] buffers, int maxStrings, char[] buffer, int size) { bool bListed = false; - char sLoadout[320], sItems[5][64], sList[320]; - - switch (priority) - { - case 0: strcopy(sLoadout, sizeof sLoadout, g_esCache[tank].g_sItemReward); - case 1: strcopy(sLoadout, sizeof sLoadout, g_esCache[tank].g_sItemReward2); - case 2: strcopy(sLoadout, sizeof sLoadout, g_esCache[tank].g_sItemReward3); - case 3: strcopy(sLoadout, sizeof sLoadout, g_esCache[tank].g_sItemReward4); - } - - if (FindCharInString(sLoadout, ';') != -1) + for (int iPos = 0; iPos < maxStrings; iPos++) { - int iItemCount = 0; - ExplodeString(sLoadout, ";", sItems, sizeof sItems, sizeof sItems[]); - for (int iPos = 0; iPos < (sizeof sItems); iPos++) + if (buffers[iPos][0] != '\0') { - if (sItems[iPos][0] != '\0') + switch (bListed) { - iItemCount++; - - vCheatCommand(survivor, "give", sItems[iPos]); - ReplaceString(sItems[iPos], sizeof sItems[], "_", " "); - - switch (bListed) + case true: { - case true: + switch (iPos < (maxStrings - 1) && buffers[iPos + 1][0] != '\0') { - switch (iPos < ((sizeof sItems) - 1) && sItems[iPos + 1][0] != '\0') + case true: Format(buffer, size, "%s{default}, {yellow}%s", buffer, buffers[iPos]); + case false: { - case true: Format(sList, sizeof sList, "%s{default}, {yellow}%s", sList, sItems[iPos]); - case false: + switch (count) { - switch (iItemCount == 2 && buffer[0] == '\0') - { - case true: Format(sList, sizeof sList, "%s{default} %T{yellow} %s", sList, "AndConjunction", survivor, sItems[iPos]); - case false: Format(sList, sizeof sList, "%s{default}, %T{yellow} %s", sList, "AndConjunction", survivor, sItems[iPos]); - } + case 2: Format(buffer, size, "%s{default} %T{yellow} %s", buffer, "AndConjunction", survivor, buffers[iPos]); + default: Format(buffer, size, "%s{default}, %T{yellow} %s", buffer, "AndConjunction", survivor, buffers[iPos]); } } } - case false: - { - bListed = true; + } + case false: + { + bListed = true; - FormatEx(sList, sizeof sList, "%s", sItems[iPos]); - } + FormatEx(buffer, size, "%s", buffers[iPos]); } } } - - vRewardItemMessage(survivor, sList, buffer, size, true); - } - else - { - vCheatCommand(survivor, "give", sLoadout); - ReplaceString(sLoadout, sizeof sLoadout, "_", " "); - vRewardItemMessage(survivor, sLoadout, buffer, size, false); } } -void vSetupRefillReward(int survivor, int tank, int priority) +void vListTeammates(int tank, int killer, int assistant, int setting, char[][] lists, int maxLists, int listSize) { - vSetupRewardCounts(survivor, tank, priority, MT_REWARD_REFILL); - vSaveCaughtSurvivor(survivor); - vCheckGunClipSizes(survivor); - vRefillGunAmmo(survivor, .reset = !(g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_AMMO), .override = true); - vRefillSurvivorHealth(survivor); -} + if (setting < 3) + { + return; + } -void vSetupRewardCounts(int survivor, int tank, int priority, int type) -{ - switch (type) + bool bListed = false; + char sList[5][768], sTemp[768]; + float flPercentage = 0.0; + int iIndex = 0, iSize = 0; + for (int iTeammate = 1; iTeammate <= MaxClients; iTeammate++) { - case MT_REWARD_HEALTH: + if (bIsValidClient(iTeammate) && g_esPlayer[iTeammate].g_iTankDamage[tank] > 0 && iTeammate != killer && iTeammate != assistant) { - if (!(g_esPlayer[survivor].g_iRewardTypes & type)) - { - g_esPlayer[survivor].g_flHealPercent = g_esCache[tank].g_flHealPercentReward[priority]; - g_esPlayer[survivor].g_flRefillPercent = g_esCache[tank].g_flRefillPercentReward[priority]; - g_esPlayer[survivor].g_iBlazeHealth = g_esCache[tank].g_iBlazeHealthReward[priority]; - g_esPlayer[survivor].g_iHealthRegen = g_esCache[tank].g_iHealthRegenReward[priority]; - g_esPlayer[survivor].g_iLifeLeech = g_esCache[tank].g_iLifeLeechReward[priority]; - g_esPlayer[survivor].g_iMedicalCuts = g_esCache[tank].g_iMedicalCutsReward[priority]; - g_esPlayer[survivor].g_iRegenBursts = g_esCache[tank].g_iRegenBurstsReward[priority]; - g_esPlayer[survivor].g_iReviveHealth = g_esCache[tank].g_iReviveHealthReward[priority]; - g_esPlayer[survivor].g_iSyringeDarts = g_esCache[tank].g_iSyringeDartsReward[priority]; - } - else if ((g_esCache[tank].g_iStackRewards[priority] & type) && (g_esPlayer[survivor].g_iRewardTypes & type) && g_esCache[tank].g_iStackLimits[0] > 0 && g_esPlayer[survivor].g_iRewardStack[0] < g_esCache[tank].g_iStackLimits[0]) - { - g_esPlayer[survivor].g_flHealPercent += g_esCache[tank].g_flHealPercentReward[priority] / 2.0; - g_esPlayer[survivor].g_flHealPercent = flClamp(g_esPlayer[survivor].g_flHealPercent, 1.0, 100.0); - g_esPlayer[survivor].g_flRefillPercent += g_esCache[tank].g_flRefillPercentReward[priority] / 2.0; - g_esPlayer[survivor].g_flRefillPercent = flClamp(g_esPlayer[survivor].g_flRefillPercent, 1.0, 100.0); - g_esPlayer[survivor].g_iBlazeHealth = g_esCache[tank].g_iBlazeHealthReward[priority]; - g_esPlayer[survivor].g_iHealthRegen += g_esCache[tank].g_iHealthRegenReward[priority]; - g_esPlayer[survivor].g_iHealthRegen = iClamp(g_esPlayer[survivor].g_iHealthRegen, 0, MT_MAXHEALTH); - g_esPlayer[survivor].g_iLifeLeech += g_esCache[tank].g_iLifeLeechReward[priority]; - g_esPlayer[survivor].g_iLifeLeech = iClamp(g_esPlayer[survivor].g_iLifeLeech, 0, MT_MAXHEALTH); - g_esPlayer[survivor].g_iMedicalCuts = g_esCache[tank].g_iMedicalCutsReward[priority]; - g_esPlayer[survivor].g_iRegenBursts = g_esCache[tank].g_iRegenBurstsReward[priority]; - g_esPlayer[survivor].g_iReviveHealth += g_esCache[tank].g_iReviveHealthReward[priority]; - g_esPlayer[survivor].g_iReviveHealth = iClamp(g_esPlayer[survivor].g_iReviveHealth, 0, MT_MAXHEALTH); - g_esPlayer[survivor].g_iSyringeDarts = g_esCache[tank].g_iSyringeDartsReward[priority]; - g_esPlayer[survivor].g_iRewardStack[0]++; - } - } - case MT_REWARD_SPEEDBOOST: - { - if (!(g_esPlayer[survivor].g_iRewardTypes & type)) - { - g_esPlayer[survivor].g_flJumpHeight = g_esCache[tank].g_flJumpHeightReward[priority]; - g_esPlayer[survivor].g_flSpeedBoost = g_esCache[tank].g_flSpeedBoostReward[priority]; - g_esPlayer[survivor].g_iBunnyHop = g_esCache[tank].g_iBunnyHopReward[priority]; - g_esPlayer[survivor].g_iFallPasses = 0; - g_esPlayer[survivor].g_iMidairDashesLimit = g_esCache[tank].g_iMidairDashesReward[priority]; - g_esPlayer[survivor].g_iStickyGrenades = g_esCache[tank].g_iStickyGrenadesReward[priority]; - } - else if ((g_esCache[tank].g_iStackRewards[priority] & type) && (g_esPlayer[survivor].g_iRewardTypes & type) && g_esCache[tank].g_iStackLimits[1] > 0 && g_esPlayer[survivor].g_iRewardStack[1] < g_esCache[tank].g_iStackLimits[1]) - { - g_esPlayer[survivor].g_flJumpHeight += g_esCache[tank].g_flJumpHeightReward[priority]; - g_esPlayer[survivor].g_flJumpHeight = flClamp(g_esPlayer[survivor].g_flJumpHeight, 0.1); - g_esPlayer[survivor].g_flSpeedBoost += g_esCache[tank].g_flSpeedBoostReward[priority]; - g_esPlayer[survivor].g_flSpeedBoost = flClamp(g_esPlayer[survivor].g_flSpeedBoost, 0.1); - g_esPlayer[survivor].g_iBunnyHop = g_esCache[tank].g_iBunnyHopReward[priority]; - g_esPlayer[survivor].g_iFallPasses = 0; - g_esPlayer[survivor].g_iMidairDashesLimit += g_esCache[tank].g_iMidairDashesReward[priority]; - g_esPlayer[survivor].g_iMidairDashesLimit += iClamp(g_esPlayer[survivor].g_iMidairDashesLimit); - g_esPlayer[survivor].g_iStickyGrenades = g_esCache[tank].g_iStickyGrenadesReward[priority]; - g_esPlayer[survivor].g_iRewardStack[1]++; - } - } - case MT_REWARD_DAMAGEBOOST: - { - if (!(g_esPlayer[survivor].g_iRewardTypes & type)) - { - g_esPlayer[survivor].g_flDamageBoost = g_esCache[tank].g_flDamageBoostReward[priority]; - g_esPlayer[survivor].g_flDamageResistance = g_esCache[tank].g_flDamageResistanceReward[priority]; - g_esPlayer[survivor].g_flPipeBombDuration = g_esCache[tank].g_flPipeBombDurationReward[priority]; - g_esPlayer[survivor].g_iFriendlyFire = g_esCache[tank].g_iFriendlyFireReward[priority]; - g_esPlayer[survivor].g_iGhostBullets = g_esCache[tank].g_iGhostBulletsReward[priority]; - g_esPlayer[survivor].g_iHollowpointAmmo = g_esCache[tank].g_iHollowpointAmmoReward[priority]; - g_esPlayer[survivor].g_iInextinguishableFire = g_esCache[tank].g_iInextinguishableFireReward[priority]; - g_esPlayer[survivor].g_iLaserSight = g_esCache[tank].g_iLaserSightReward[priority]; - g_esPlayer[survivor].g_iMeleeRange = g_esCache[tank].g_iMeleeRangeReward[priority]; - g_esPlayer[survivor].g_iRecoilDampener = g_esCache[tank].g_iRecoilDampenerReward[priority]; - g_esPlayer[survivor].g_iSledgehammerRounds = g_esCache[tank].g_iSledgehammerRoundsReward[priority]; - g_esPlayer[survivor].g_iThorns = g_esCache[tank].g_iThornsReward[priority]; - - vToggleWeaponVerticalPunch(survivor, true); - } - else if ((g_esCache[tank].g_iStackRewards[priority] & type) && (g_esPlayer[survivor].g_iRewardTypes & type) && g_esCache[tank].g_iStackLimits[2] > 0 && g_esPlayer[survivor].g_iRewardStack[2] < g_esCache[tank].g_iStackLimits[2]) - { - g_esPlayer[survivor].g_flDamageBoost += g_esCache[tank].g_flDamageBoostReward[priority]; - g_esPlayer[survivor].g_flDamageBoost = flClamp(g_esPlayer[survivor].g_flDamageBoost, 0.1); - g_esPlayer[survivor].g_flDamageResistance -= g_esCache[tank].g_flDamageResistanceReward[priority] / 2.0; - g_esPlayer[survivor].g_flDamageResistance = flClamp(g_esPlayer[survivor].g_flDamageResistance, 0.1, 1.0); - g_esPlayer[survivor].g_flPipeBombDuration += g_esCache[tank].g_flPipeBombDurationReward[priority]; - g_esPlayer[survivor].g_flPipeBombDuration = flClamp(g_esPlayer[survivor].g_flPipeBombDuration); - g_esPlayer[survivor].g_iFriendlyFire = g_esCache[tank].g_iFriendlyFireReward[priority]; - g_esPlayer[survivor].g_iGhostBullets = g_esCache[tank].g_iGhostBulletsReward[priority]; - g_esPlayer[survivor].g_iHollowpointAmmo = g_esCache[tank].g_iHollowpointAmmoReward[priority]; - g_esPlayer[survivor].g_iInextinguishableFire = g_esCache[tank].g_iInextinguishableFireReward[priority]; - g_esPlayer[survivor].g_iLaserSight = g_esCache[tank].g_iLaserSightReward[priority]; - g_esPlayer[survivor].g_iMeleeRange += g_esCache[tank].g_iMeleeRangeReward[priority]; - g_esPlayer[survivor].g_iMeleeRange = iClamp(g_esPlayer[survivor].g_iMeleeRange); - g_esPlayer[survivor].g_iRecoilDampener = g_esCache[tank].g_iRecoilDampenerReward[priority]; - g_esPlayer[survivor].g_iSledgehammerRounds = g_esCache[tank].g_iSledgehammerRoundsReward[priority]; - g_esPlayer[survivor].g_iThorns = g_esCache[tank].g_iThornsReward[priority]; - g_esPlayer[survivor].g_iRewardStack[2]++; + flPercentage = (float(g_esPlayer[iTeammate].g_iTankDamage[tank]) / float(g_esPlayer[tank].g_iSpecialMaxHealth)) * 100; - vToggleWeaponVerticalPunch(survivor, true); - } - } - case MT_REWARD_ATTACKBOOST: - { - if (!(g_esPlayer[survivor].g_iRewardTypes & type)) + switch (bListed) { - g_esPlayer[survivor].g_flActionDuration = g_esCache[tank].g_flActionDurationReward[priority]; - g_esPlayer[survivor].g_flAttackBoost = g_esCache[tank].g_flAttackBoostReward[priority]; - g_esPlayer[survivor].g_iBurstDoors = g_esCache[tank].g_iBurstDoorsReward[priority]; - g_esPlayer[survivor].g_iLadderActions = g_esCache[tank].g_iLadderActionsReward[priority]; - g_esPlayer[survivor].g_flRapidPistol = g_esCache[tank].g_flRapidPistolReward[priority]; - g_esPlayer[survivor].g_flShoveDamage = g_esCache[tank].g_flShoveDamageReward[priority]; - g_esPlayer[survivor].g_flShoveRate = g_esCache[tank].g_flShoveRateReward[priority]; - g_esPlayer[survivor].g_iShovePenalty = g_esCache[tank].g_iShovePenaltyReward[priority]; - } - else if ((g_esCache[tank].g_iStackRewards[priority] & type) && (g_esPlayer[survivor].g_iRewardTypes & type) && g_esCache[tank].g_iStackLimits[3] > 0 && g_esPlayer[survivor].g_iRewardStack[3] < g_esCache[tank].g_iStackLimits[3]) - { - g_esPlayer[survivor].g_flActionDuration -= g_esCache[tank].g_flActionDurationReward[priority] / 2.0; - g_esPlayer[survivor].g_flActionDuration = flClamp(g_esPlayer[survivor].g_flActionDuration, 0.1); - g_esPlayer[survivor].g_flAttackBoost += g_esCache[tank].g_flAttackBoostReward[priority]; - g_esPlayer[survivor].g_flAttackBoost = flClamp(g_esPlayer[survivor].g_flAttackBoost, 0.1); - g_esPlayer[survivor].g_iBurstDoors = g_esCache[tank].g_iBurstDoorsReward[priority]; - g_esPlayer[survivor].g_iLadderActions = g_esCache[tank].g_iLadderActionsReward[priority]; - g_esPlayer[survivor].g_flRapidPistol -= g_esCache[tank].g_flRapidPistolReward[priority] / 2.0; - g_esPlayer[survivor].g_flRapidPistol = flClamp(g_esPlayer[survivor].g_flRapidPistol, 0.01, 1.0); - g_esPlayer[survivor].g_flShoveDamage += g_esCache[tank].g_flShoveDamageReward[priority]; - g_esPlayer[survivor].g_flShoveDamage = flClamp(g_esPlayer[survivor].g_flShoveDamage, 0.1); - g_esPlayer[survivor].g_flShoveRate -= g_esCache[tank].g_flShoveRateReward[priority] / 2.0; - g_esPlayer[survivor].g_flShoveRate = flClamp(g_esPlayer[survivor].g_flShoveRate, 0.1); - g_esPlayer[survivor].g_iShovePenalty = g_esCache[tank].g_iShovePenaltyReward[priority]; - g_esPlayer[survivor].g_iRewardStack[3]++; + case true: + { + switch (setting) + { + case 3: iSize = FormatEx(sTemp, sizeof sTemp, "{mint}%N{default} ({olive}%i HP{default})", iTeammate, g_esPlayer[iTeammate].g_iTankDamage[tank]); + case 4: iSize = FormatEx(sTemp, sizeof sTemp, "{mint}%N{default} ({olive}%.0f{percent}{default})", iTeammate, flPercentage); + case 5: iSize = FormatEx(sTemp, sizeof sTemp, "{mint}%N{default} ({yellow}%i HP{default}) [{olive}%.0f{percent}{default}]", iTeammate, g_esPlayer[iTeammate].g_iTankDamage[tank], flPercentage); + } + + switch (iIndex < ((sizeof sList) - 1) && sList[iIndex][0] != '\0' && (strlen(sList[iIndex]) + iSize + 150) >= (sizeof sList[])) + { + case true: + { + iIndex++; + + strcopy(sList[iIndex], sizeof sList[], sTemp); + } + case false: Format(sList[iIndex], sizeof sList[], "%s{default}, %s", sList[iIndex], sTemp); + } + + sTemp[0] = '\0'; + } + case false: + { + bListed = true; + + switch (setting) + { + case 3: FormatEx(sList[iIndex], sizeof sList[], "%N{default} ({olive}%i HP{default})", iTeammate, g_esPlayer[iTeammate].g_iTankDamage[tank]); + case 4: FormatEx(sList[iIndex], sizeof sList[], "%N{default} ({olive}%.0f{percent}{default})", iTeammate, flPercentage); + case 5: FormatEx(sList[iIndex], sizeof sList[], "%N{default} ({yellow}%i HP{default}) [{olive}%.0f{percent}{default}]", iTeammate, g_esPlayer[iTeammate].g_iTankDamage[tank], flPercentage); + } + } } } - case MT_REWARD_AMMO: + } + + for (int iPos = 0; iPos < maxLists; iPos++) + { + if (sList[iPos][0] != '\0') { - if (!(g_esPlayer[survivor].g_iRewardTypes & type)) - { - g_esPlayer[survivor].g_iAmmoBoost = g_esCache[tank].g_iAmmoBoostReward[priority]; - g_esPlayer[survivor].g_iAmmoRegen = g_esCache[tank].g_iAmmoRegenReward[priority]; - g_esPlayer[survivor].g_iClusterBombs = g_esCache[tank].g_iClusterBombsReward[priority]; - g_esPlayer[survivor].g_iSpecialAmmo = g_esCache[tank].g_iSpecialAmmoReward[priority]; - } - else if ((g_esCache[tank].g_iStackRewards[priority] & type) && (g_esPlayer[survivor].g_iRewardTypes & type) && g_esCache[tank].g_iStackLimits[4] > 0 && g_esPlayer[survivor].g_iRewardStack[4] < g_esCache[tank].g_iStackLimits[4]) - { - g_esPlayer[survivor].g_iAmmoBoost = g_esCache[tank].g_iAmmoBoostReward[priority]; - g_esPlayer[survivor].g_iAmmoRegen += g_esCache[tank].g_iAmmoRegenReward[priority]; - g_esPlayer[survivor].g_iAmmoRegen = iClamp(g_esPlayer[survivor].g_iAmmoRegen); - g_esPlayer[survivor].g_iClusterBombs += g_esCache[tank].g_iClusterBombsReward[priority]; - g_esPlayer[survivor].g_iClusterBombs += iClamp(g_esPlayer[survivor].g_iClusterBombs); - g_esPlayer[survivor].g_iSpecialAmmo |= g_esCache[tank].g_iSpecialAmmoReward[priority]; - g_esPlayer[survivor].g_iSpecialAmmo = iClamp(g_esPlayer[survivor].g_iSpecialAmmo, 0, 3); - g_esPlayer[survivor].g_iRewardStack[4]++; - } + strcopy(lists[iPos], listSize, sList[iPos]); } - case MT_REWARD_GODMODE: + } +} + +void vRecordDamage(int tank, int killer, int assistant, float percentage, char[] solo, int soloSize, char[][] lists, int maxLists, int listSize) +{ + char sList[5][768]; + int iDetails = g_esTankCache[tank].g_iDeathDetails; + + switch (iDetails) + { + case 0, 3: { - if (!(g_esPlayer[survivor].g_iRewardTypes & type)) - { - g_esPlayer[survivor].g_flPunchResistance = g_esCache[tank].g_flPunchResistanceReward[priority]; - g_esPlayer[survivor].g_iCleanKills = g_esCache[tank].g_iCleanKillsReward[priority]; - } - else if ((g_esCache[tank].g_iStackRewards[priority] & type) && (g_esPlayer[survivor].g_iRewardTypes & type) && g_esCache[tank].g_iStackLimits[5] > 0 && g_esPlayer[survivor].g_iRewardStack[5] < g_esCache[tank].g_iStackLimits[5]) - { - g_esPlayer[survivor].g_flPunchResistance -= g_esCache[tank].g_flPunchResistanceReward[priority] / 2.0; - g_esPlayer[survivor].g_flPunchResistance = flClamp(g_esPlayer[survivor].g_flPunchResistance, 0.1, 1.0); - g_esPlayer[survivor].g_iCleanKills = g_esCache[tank].g_iCleanKillsReward[priority]; - g_esPlayer[survivor].g_iRewardStack[5]++; - } + FormatEx(solo, soloSize, "%N{default} ({olive}%i HP{default})", assistant, g_esPlayer[assistant].g_iTankDamage[tank]); + vListTeammates(tank, killer, assistant, iDetails, sList, sizeof sList, sizeof sList[]); } - case MT_REWARD_REFILL: + case 1, 4: { - if (!(g_esPlayer[survivor].g_iRewardTypes & type)) - { - g_esPlayer[survivor].g_flHealPercent = g_esCache[tank].g_flHealPercentReward[priority]; - g_esPlayer[survivor].g_flRefillPercent = g_esCache[tank].g_flRefillPercentReward[priority]; - } - else if ((g_esCache[tank].g_iStackRewards[priority] & type) && (g_esPlayer[survivor].g_iRewardTypes & type) && g_esCache[tank].g_iStackLimits[6] > 0 && g_esPlayer[survivor].g_iRewardStack[6] < g_esCache[tank].g_iStackLimits[6]) - { - g_esPlayer[survivor].g_flRefillPercent += g_esCache[tank].g_flRefillPercentReward[priority] / 2.0; - g_esPlayer[survivor].g_flRefillPercent = flClamp(g_esPlayer[survivor].g_flRefillPercent, 0.0, 100.0); - } + FormatEx(solo, soloSize, "%N{default} ({olive}%.0f{percent}{default})", assistant, percentage); + vListTeammates(tank, killer, assistant, iDetails, sList, sizeof sList, sizeof sList[]); } - case MT_REWARD_INFAMMO: + case 2, 5: { - if (!(g_esPlayer[survivor].g_iRewardTypes & type)) - { - g_esPlayer[survivor].g_iInfiniteAmmo = g_esCache[tank].g_iInfiniteAmmoReward[priority]; - } - else if ((g_esCache[tank].g_iStackRewards[priority] & type) && (g_esPlayer[survivor].g_iRewardTypes & type) && g_esCache[tank].g_iStackLimits[7] > 0 && g_esPlayer[survivor].g_iRewardStack[7] < g_esCache[tank].g_iStackLimits[7]) - { - g_esPlayer[survivor].g_iInfiniteAmmo |= g_esCache[tank].g_iInfiniteAmmoReward[priority]; - g_esPlayer[survivor].g_iInfiniteAmmo = iClamp(g_esPlayer[survivor].g_iInfiniteAmmo, 0, 31); - g_esPlayer[survivor].g_iRewardStack[7]++; - } + FormatEx(solo, soloSize, "%N{default} ({yellow}%i HP{default}) [{olive}%.0f{percent}{default}]", assistant, g_esPlayer[assistant].g_iTankDamage[tank], percentage); + vListTeammates(tank, killer, assistant, iDetails, sList, sizeof sList, sizeof sList[]); } } -} -void vSetupRewardDuration(int survivor, int pos, float time, float current, float duration) -{ - if (g_esPlayer[survivor].g_flRewardTime[pos] == -1.0 || (time > (g_esPlayer[survivor].g_flRewardTime[pos] - current))) + for (int iPos = 0; iPos < maxLists; iPos++) { - g_esPlayer[survivor].g_flRewardTime[pos] = duration; + if (sList[iPos][0] != '\0') + { + strcopy(lists[iPos], listSize, sList[iPos]); + } } } -void vSetupRewardDurations(int survivor, int recipient, int pos, int limit, float time, float time2, float current, float duration, float duration2) +void vRecordKiller(int tank, int killer, float percentage, int assistant, char[] buffer, int size) { - vSetupRewardDuration(survivor, pos, time, current, duration); - - if (g_esPlayer[survivor].g_iRewardStack[pos] >= limit && survivor != recipient) + if (killer == assistant) { - vSetupRewardDuration(recipient, pos, time2, current, duration2); - } -} - -void vSetupSpeedBoostReward(int survivor, int tank, int priority, float duration) -{ - SDKHook(survivor, SDKHook_PreThinkPost, OnSpeedPreThinkPost); + FormatEx(buffer, size, "%N", killer); - if (!bIsDeveloper(survivor, 5) || flGetAdrenalineTime(survivor) > 0.0) - { - vSetAdrenalineTime(survivor, duration); + return; } - switch (priority) + switch (g_esTankCache[tank].g_iDeathDetails) { - case 0: strcopy(g_esPlayer[survivor].g_sFallVoiceline, sizeof esPlayer::g_sFallVoiceline, g_esCache[tank].g_sFallVoicelineReward); - case 1: strcopy(g_esPlayer[survivor].g_sFallVoiceline, sizeof esPlayer::g_sFallVoiceline, g_esCache[tank].g_sFallVoicelineReward2); - case 2: strcopy(g_esPlayer[survivor].g_sFallVoiceline, sizeof esPlayer::g_sFallVoiceline, g_esCache[tank].g_sFallVoicelineReward3); - case 3: strcopy(g_esPlayer[survivor].g_sFallVoiceline, sizeof esPlayer::g_sFallVoiceline, g_esCache[tank].g_sFallVoicelineReward4); + case 0, 3: FormatEx(buffer, size, "%N{default} ({olive}%i HP{default})", killer, g_esPlayer[killer].g_iTankDamage[tank]); + case 1, 4: FormatEx(buffer, size, "%N{default} ({olive}%.0f{percent}{default})", killer, percentage); + case 2, 5: FormatEx(buffer, size, "%N{default} ({yellow}%i HP{default}) [{olive}%.0f{percent}{default}]", killer, g_esPlayer[killer].g_iTankDamage[tank], percentage); } } -void vSetupVisual(int survivor, int recipient, int tank, int priority, int count, bool dev, float time, float current, float duration) +void vRewardPriority(int tank, int priority, int recipient = 0, int recipient2 = 0) { - if (survivor != recipient && (g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_REFILL) && count == 1) - { - return; - } + char sTankName[64]; + vGetTankTranslatedName(sTankName, sizeof sTankName, tank, .survivor = g_esShooter[tank].g_bSurvivor, .character = g_esShooter[tank].g_iCharacter); + float flPercentage = 0.0, flRandom = GetRandomFloat(0.1, 100.0); + int iPriority = (priority - 1), iSetting = 0; - int iVisual = g_esCache[tank].g_iRewardVisual[priority]; - if (iVisual > 0) + switch (priority) { -#if defined _clientprefs_included - switch (g_esPlayer[survivor].g_iPrefsAccess) - { - case 0: vDefaultCookieSettings(survivor); - case 1: - { - if (AreClientCookiesCached(survivor)) - { - OnClientCookiesCached(survivor); - } - } - } -#else - vDefaultCookieSettings(survivor); -#endif - bool bIgnore = bIsDeveloper(survivor, 0); - if (dev || (iVisual & MT_VISUAL_SCREEN)) + case 0: return; + case 1, 2, 4: { - if (g_esPlayer[survivor].g_flVisualTime[0] == -1.0 || (time > (g_esPlayer[survivor].g_flVisualTime[0] - current))) + iSetting = bIsValidClient(recipient, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_FAKECLIENT) ? g_esTankCache[tank].g_iRewardEnabled[iPriority] : g_esTankCache[tank].g_iRewardBots[iPriority]; + if (bIsSurvivor(recipient, MT_CHECK_INDEX|MT_CHECK_INGAME) && iSetting != -1 && flRandom <= g_esTankCache[tank].g_flRewardChance[iPriority]) { - switch (priority) + flPercentage = ((float(g_esPlayer[recipient].g_iTankDamage[tank]) / float(g_esPlayer[tank].g_iSpecialMaxHealth)) * 100.0); + if (flPercentage >= g_esTankCache[tank].g_flRewardPercentage[iPriority]) { - case 0: strcopy(g_esPlayer[survivor].g_sScreenColor, sizeof esPlayer::g_sScreenColor, g_esCache[tank].g_sScreenColorVisual); - case 1: strcopy(g_esPlayer[survivor].g_sScreenColor, sizeof esPlayer::g_sScreenColor, g_esCache[tank].g_sScreenColorVisual2); - case 2: strcopy(g_esPlayer[survivor].g_sScreenColor, sizeof esPlayer::g_sScreenColor, g_esCache[tank].g_sScreenColorVisual3); - case 3: strcopy(g_esPlayer[survivor].g_sScreenColor, sizeof esPlayer::g_sScreenColor, g_esCache[tank].g_sScreenColorVisual4); + vRewardSolo(recipient, tank, iPriority, flPercentage, sTankName); + vChooseReward(recipient, tank, iPriority, iSetting); } - - char sDelimiter[2]; - sDelimiter = (FindCharInString(g_esPlayer[survivor].g_sScreenColor, ';') != -1) ? ";" : ","; - vSetSurvivorScreen(survivor, g_esPlayer[survivor].g_sScreenColor, sDelimiter); - - if (g_esPlayer[survivor].g_flVisualTime[0] == -1.0) + else if (flPercentage >= g_esTankCache[tank].g_flRewardPercentage[2]) { - CreateTimer(2.0, tTimerScreenEffect, GetClientUserId(survivor), TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); + vRewardSolo(recipient, tank, 2, flPercentage, sTankName); + vChooseReward(recipient, tank, 2, iSetting); } - - if (time > (g_esPlayer[survivor].g_flVisualTime[0] - current)) + else { - g_esPlayer[survivor].g_flVisualTime[0] = duration; + vRewardNotify(recipient, tank, iPriority, "RewardNone", sTankName); } } } - - if (dev || (iVisual & MT_VISUAL_PARTICLE)) + case 3: { - if (g_esPlayer[survivor].g_flVisualTime[1] == -1.0 || (time > (g_esPlayer[survivor].g_flVisualTime[1] - current))) + if (flRandom <= g_esTankCache[tank].g_flRewardChance[iPriority]) { - int iEffect = g_esCache[tank].g_iParticleEffectVisual[priority]; - if (iEffect > 0 && g_esPlayer[survivor].g_iParticleEffect != iEffect) + float[] flPercentages = new float[MaxClients + 1]; + int[] iSurvivors = new int[MaxClients + 1]; + int iSurvivorCount = 0; + for (int iTeammate = 1; iTeammate <= MaxClients; iTeammate++) { - g_esPlayer[survivor].g_iParticleEffect = iEffect; + iSetting = bIsValidClient(iTeammate, MT_CHECK_INGAME|MT_CHECK_FAKECLIENT) ? g_esTankCache[tank].g_iRewardEnabled[iPriority] : g_esTankCache[tank].g_iRewardBots[iPriority]; + if (bIsSurvivor(iTeammate, MT_CHECK_INDEX|MT_CHECK_INGAME) && g_esPlayer[iTeammate].g_iTankDamage[tank] > 0 && iSetting != -1 && iTeammate != recipient && iTeammate != recipient2) + { + flPercentages[iSurvivorCount] = ((float(g_esPlayer[iTeammate].g_iTankDamage[tank]) / float(g_esPlayer[tank].g_iSpecialMaxHealth)) * 100.0); + iSurvivors[iSurvivorCount] = iTeammate; + iSurvivorCount++; + } } - if (g_esPlayer[survivor].g_flVisualTime[1] == -1.0) + if (iSurvivorCount > 0) { - CreateTimer(0.75, tTimerParticleVisual, GetClientUserId(survivor), TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); + SortFloats(flPercentages, (MaxClients + 1), Sort_Descending); } - if (time > (g_esPlayer[survivor].g_flVisualTime[1] - current)) + int iTeammate = 0, iTeammateCount = 0; + for (int iPos = 0; iPos < iSurvivorCount; iPos++) { - g_esPlayer[survivor].g_flVisualTime[1] = duration; - } - } - } + iTeammate = iSurvivors[iPos]; + flPercentage = flPercentages[iPos]; + if (bIsSurvivor(iTeammate, MT_CHECK_INDEX|MT_CHECK_INGAME)) + { + if (0 < g_esTankCache[tank].g_iTeammateLimit <= iTeammateCount) + { + vRewardNotify(iTeammate, tank, iPriority, "RewardNone", sTankName); - if (dev || (iVisual & MT_VISUAL_VOICELINE)) - { - if (g_esPlayer[survivor].g_flVisualTime[2] == -1.0 || (time > (g_esPlayer[survivor].g_flVisualTime[2] - current))) - { - switch (priority) - { - case 0: strcopy(g_esPlayer[survivor].g_sLoopingVoiceline, sizeof esPlayer::g_sLoopingVoiceline, g_esCache[tank].g_sLoopingVoicelineVisual); - case 1: strcopy(g_esPlayer[survivor].g_sLoopingVoiceline, sizeof esPlayer::g_sLoopingVoiceline, g_esCache[tank].g_sLoopingVoicelineVisual2); - case 2: strcopy(g_esPlayer[survivor].g_sLoopingVoiceline, sizeof esPlayer::g_sLoopingVoiceline, g_esCache[tank].g_sLoopingVoicelineVisual3); - case 3: strcopy(g_esPlayer[survivor].g_sLoopingVoiceline, sizeof esPlayer::g_sLoopingVoiceline, g_esCache[tank].g_sLoopingVoicelineVisual4); - } + continue; + } - if (g_esPlayer[survivor].g_flVisualTime[2] == -1.0) - { - CreateTimer(g_esCache[tank].g_flLoopingVoicelineInterval[priority], tTimerLoopVoiceline, GetClientUserId(survivor), TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); - } + if (flPercentage >= g_esTankCache[tank].g_flRewardPercentage[iPriority]) + { + iSetting = bIsValidClient(iTeammate, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_FAKECLIENT) ? g_esTankCache[tank].g_iRewardEnabled[iPriority] : g_esTankCache[tank].g_iRewardBots[iPriority]; + vRewardSolo(iTeammate, tank, iPriority, flPercentage, sTankName); + vChooseReward(iTeammate, tank, iPriority, iSetting); + vResetSurvivorStats2(iTeammate); + } + else + { + vRewardNotify(iTeammate, tank, iPriority, "RewardNone", sTankName); + } - if (time > (g_esPlayer[survivor].g_flVisualTime[2] - current)) - { - g_esPlayer[survivor].g_flVisualTime[2] = duration; + iTeammateCount++; + } } } } + } +} - if (dev || (iVisual & MT_VISUAL_VOICEPITCH)) - { - if (g_esPlayer[survivor].g_flVisualTime[3] == -1.0 || (time > (g_esPlayer[survivor].g_flVisualTime[3] - current))) - { - int iPitch = g_esCache[tank].g_iVoicePitchVisual[priority]; - if (iPitch > 0 && g_esPlayer[survivor].g_iVoicePitch != iPitch) - { - g_esPlayer[survivor].g_iVoicePitch = iPitch; - } - - if (time > (g_esPlayer[survivor].g_flVisualTime[3] - current)) - { - g_esPlayer[survivor].g_flVisualTime[3] = duration; - } - } - } +void vRewardSolo(int survivor, int tank, int priority, float percentage, const char[] namePhrase) +{ + if (percentage >= 90.0) + { + vRewardNotify(survivor, tank, priority, "RewardSolo", namePhrase); + } +} - if (dev || (iVisual & MT_VISUAL_LIGHT)) - { - if (g_esPlayer[survivor].g_flVisualTime[4] == -1.0 || (time > (g_esPlayer[survivor].g_flVisualTime[4] - current))) - { - switch (priority) - { - case 0: strcopy(g_esPlayer[survivor].g_sLightColor, sizeof esPlayer::g_sLightColor, g_esCache[tank].g_sLightColorVisual); - case 1: strcopy(g_esPlayer[survivor].g_sLightColor, sizeof esPlayer::g_sLightColor, g_esCache[tank].g_sLightColorVisual2); - case 2: strcopy(g_esPlayer[survivor].g_sLightColor, sizeof esPlayer::g_sLightColor, g_esCache[tank].g_sLightColorVisual3); - case 3: strcopy(g_esPlayer[survivor].g_sLightColor, sizeof esPlayer::g_sLightColor, g_esCache[tank].g_sLightColorVisual4); - } +void vRewardSurvivor(int survivor, int type, int tank = 0, bool apply = false, int priority = 0) +{ + int iRecipient = iGetRandomRecipient(survivor, tank, priority, false); + iRecipient = (survivor == iRecipient) ? iGetRandomRecipient(survivor, tank, priority, true) : iRecipient; - if (!bIgnore || g_esDeveloper[survivor].g_sDevFlashlight[0] == '\0') - { - char sDelimiter[2]; - sDelimiter = (FindCharInString(g_esPlayer[survivor].g_sLightColor, ';') != -1) ? ";" : ","; - vSetSurvivorLight(survivor, g_esPlayer[survivor].g_sLightColor, g_esPlayer[survivor].g_bApplyVisuals[4], sDelimiter, true); - } + bool bDeveloper = bIsDeveloper(survivor, 3), bDeveloper2 = bIsDeveloper(iRecipient, 3); + float flTime = (bDeveloper && g_esDeveloper[survivor].g_flDevRewardDuration > g_esTankCache[tank].g_flRewardDuration[priority]) ? g_esDeveloper[survivor].g_flDevRewardDuration : g_esTankCache[tank].g_flRewardDuration[priority], + flTime2 = (bDeveloper2 && g_esDeveloper[iRecipient].g_flDevRewardDuration > g_esTankCache[tank].g_flRewardDuration[priority]) ? g_esDeveloper[iRecipient].g_flDevRewardDuration : g_esTankCache[tank].g_flRewardDuration[priority]; + int iType = type; + if (iType > 0) + { + Action aResult = Plugin_Continue; + vRewardSurvivorForward(survivor, tank, iType, priority, flTime, apply, aResult); - if (time > (g_esPlayer[survivor].g_flVisualTime[4] - current)) - { - g_esPlayer[survivor].g_flVisualTime[4] = duration; - } - } + if (aResult == Plugin_Handled) + { + return; } - if (dev || (iVisual & MT_VISUAL_BODY)) + switch (apply) { - if (g_esPlayer[survivor].g_flVisualTime[5] == -1.0 || (time > (g_esPlayer[survivor].g_flVisualTime[5] - current))) + case true: { - switch (priority) - { - case 0: strcopy(g_esPlayer[survivor].g_sBodyColor, sizeof esPlayer::g_sBodyColor, g_esCache[tank].g_sBodyColorVisual); - case 1: strcopy(g_esPlayer[survivor].g_sBodyColor, sizeof esPlayer::g_sBodyColor, g_esCache[tank].g_sBodyColorVisual2); - case 2: strcopy(g_esPlayer[survivor].g_sBodyColor, sizeof esPlayer::g_sBodyColor, g_esCache[tank].g_sBodyColorVisual3); - case 3: strcopy(g_esPlayer[survivor].g_sBodyColor, sizeof esPlayer::g_sBodyColor, g_esCache[tank].g_sBodyColorVisual4); - } + g_esPlayer[survivor].g_iNotify = g_esTankCache[tank].g_iRewardNotify[priority]; + g_esPlayer[survivor].g_iPrefsAccess = g_esTankCache[tank].g_iPrefsNotify[priority]; + g_esPlayer[iRecipient].g_iNotify = g_esTankCache[tank].g_iRewardNotify[priority]; + g_esPlayer[iRecipient].g_iPrefsAccess = g_esTankCache[tank].g_iPrefsNotify[priority]; - if (!bIgnore || g_esDeveloper[survivor].g_sDevSkinColor[0] == '\0') - { - char sDelimiter[2]; - sDelimiter = (FindCharInString(g_esPlayer[survivor].g_sBodyColor, ';') != -1) ? ";" : ","; - vSetSurvivorColor(survivor, g_esPlayer[survivor].g_sBodyColor, g_esPlayer[survivor].g_bApplyVisuals[5], sDelimiter, true); - } + char sSet[9][64], sSet2[9][64], sTankName[64]; + int iRewardCount = 0, iRewardCount2 = 0; + vGetTankTranslatedName(sTankName, sizeof sTankName, tank, .survivor = g_esShooter[tank].g_bSurvivor, .character = g_esShooter[tank].g_iCharacter); - if (time > (g_esPlayer[survivor].g_flVisualTime[5] - current)) + if ((iType & MT_REWARD_RESPAWN) && bRespawnSurvivor(survivor, (bDeveloper || g_esTankCache[tank].g_iRespawnLoadoutReward[priority] == 1)) && !(g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_RESPAWN)) { - g_esPlayer[survivor].g_flVisualTime[5] = duration; + FormatEx(sSet[iRewardCount], sizeof sSet[], "%T", "RewardRespawn", survivor); + g_esPlayer[survivor].g_iRewardTypes |= MT_REWARD_RESPAWN; + iRewardCount++; } - } - } - if (g_bSecondGame && (dev || (iVisual & MT_VISUAL_GLOW))) - { - if (g_esPlayer[survivor].g_flVisualTime[6] == -1.0 || (time > (g_esPlayer[survivor].g_flVisualTime[6] - current))) - { - switch (priority) + if (bIsSurvivor(survivor)) { - case 0: strcopy(g_esPlayer[survivor].g_sOutlineColor, sizeof esPlayer::g_sOutlineColor, g_esCache[tank].g_sOutlineColorVisual); - case 1: strcopy(g_esPlayer[survivor].g_sOutlineColor, sizeof esPlayer::g_sOutlineColor, g_esCache[tank].g_sOutlineColorVisual2); - case 2: strcopy(g_esPlayer[survivor].g_sOutlineColor, sizeof esPlayer::g_sOutlineColor, g_esCache[tank].g_sOutlineColorVisual3); - case 3: strcopy(g_esPlayer[survivor].g_sOutlineColor, sizeof esPlayer::g_sOutlineColor, g_esCache[tank].g_sOutlineColorVisual4); - } + char sReceived[1024], sShared[1024]; + float flCurrentTime = GetGameTime(), flDuration = (flCurrentTime + flTime), flDuration2 = (flCurrentTime + flTime2); + if (iType & MT_REWARD_HEALTH) + { + if (!(g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_HEALTH)) + { + FormatEx(sSet[iRewardCount], sizeof sSet[], "%T", "RewardHealth", survivor); + vSetupHealthReward(survivor, tank, priority); - if (!bIgnore || g_esDeveloper[survivor].g_sDevGlowOutline[0] == '\0') - { - char sDelimiter[2]; - sDelimiter = (FindCharInString(g_esPlayer[survivor].g_sOutlineColor, ';') != -1) ? ";" : ","; - vSetSurvivorOutline(survivor, g_esPlayer[survivor].g_sOutlineColor, g_esPlayer[survivor].g_bApplyVisuals[6], sDelimiter, true); - } + g_esPlayer[survivor].g_iRewardTypes |= MT_REWARD_HEALTH; + iRewardCount++; + } + else + { + vChooseRecipient(survivor, iRecipient, "RewardHealth", sSet[iRewardCount], sizeof sSet[], sSet2[iRewardCount2], sizeof sSet2[], (g_esPlayer[survivor].g_iRewardStack[0] >= g_esTankCache[tank].g_iStackLimits[0])); + if (g_esPlayer[survivor].g_iRewardStack[0] >= g_esTankCache[tank].g_iStackLimits[0] && survivor != iRecipient) + { + vSetupHealthReward(iRecipient, tank, priority); + iRewardCount2++; - if (time > (g_esPlayer[survivor].g_flVisualTime[6] - current)) - { - g_esPlayer[survivor].g_flVisualTime[6] = duration; - } - } - } + if (!(g_esPlayer[iRecipient].g_iRewardTypes & MT_REWARD_HEALTH)) + { + g_esPlayer[iRecipient].g_iRewardTypes |= MT_REWARD_HEALTH; + } + } + else + { + vSetupHealthReward(survivor, tank, priority); + iRewardCount++; + } + } - if (g_esPlayer[survivor].g_iPrefsAccess == 1) - { - MT_PrintToChat(survivor, "%s %t", MT_TAG2, "MTPrefsInfo"); - } - } + vSetupRewardDurations(survivor, iRecipient, 0, g_esTankCache[tank].g_iStackLimits[0], flTime, flTime2, flCurrentTime, flDuration, flDuration2); + } - int iEffect = g_esCache[tank].g_iRewardEffect[priority]; - if (iEffect > 0) - { - if ((dev || (iEffect & MT_EFFECT_TROPHY)) && g_esPlayer[survivor].g_iEffect[0] == INVALID_ENT_REFERENCE) - { - g_esPlayer[survivor].g_iEffect[0] = EntIndexToEntRef(iCreateParticle(survivor, PARTICLE_ACHIEVED, view_as({0.0, 0.0, 50.0}), NULL_VECTOR, 1.5, 1.5)); - } + if (iType & MT_REWARD_SPEEDBOOST) + { + if (!(g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_SPEEDBOOST)) + { + FormatEx(sSet[iRewardCount], sizeof sSet[], "%T", "RewardSpeedBoost", survivor); + vSetupRewardCounts(survivor, tank, priority, MT_REWARD_SPEEDBOOST); + vSetupSpeedBoostReward(survivor, tank, priority); - if ((dev || (iEffect & MT_EFFECT_FIREWORKS)) && g_esPlayer[survivor].g_iEffect[1] == INVALID_ENT_REFERENCE) - { - g_esPlayer[survivor].g_iEffect[1] = EntIndexToEntRef(iCreateParticle(survivor, PARTICLE_FIREWORK, view_as({0.0, 0.0, 50.0}), NULL_VECTOR, 2.0, 1.5)); - } + g_esPlayer[survivor].g_iRewardTypes |= MT_REWARD_SPEEDBOOST; + iRewardCount++; + } + else + { + vChooseRecipient(survivor, iRecipient, "RewardSpeedBoost", sSet[iRewardCount], sizeof sSet[], sSet2[iRewardCount2], sizeof sSet2[], (g_esPlayer[survivor].g_iRewardStack[1] >= g_esTankCache[tank].g_iStackLimits[1])); + if (g_esPlayer[survivor].g_iRewardStack[1] >= g_esTankCache[tank].g_iStackLimits[1] && survivor != iRecipient) + { + vSetupRewardCounts(iRecipient, tank, priority, MT_REWARD_SPEEDBOOST); + iRewardCount2++; - if (dev || (iEffect & MT_EFFECT_SOUND)) - { - EmitSoundToAll(SOUND_ACHIEVEMENT, survivor, SNDCHAN_AUTO, SNDLEVEL_NORMAL, SND_NOFLAGS, SNDVOL_NORMAL, SNDPITCH_NORMAL, -1, NULL_VECTOR, NULL_VECTOR, true, 0.0); - } + if (!(g_esPlayer[iRecipient].g_iRewardTypes & MT_REWARD_SPEEDBOOST)) + { + vSetupSpeedBoostReward(iRecipient, tank, priority); + g_esPlayer[iRecipient].g_iRewardTypes |= MT_REWARD_SPEEDBOOST; + } + } + else + { + vSetupRewardCounts(survivor, tank, priority, MT_REWARD_SPEEDBOOST); + iRewardCount++; + } + } - if (dev || (iEffect & MT_EFFECT_THIRDPERSON)) - { - vExternalView(survivor, 1.5); - } - } -} + vSetupRewardDurations(survivor, iRecipient, 1, g_esTankCache[tank].g_iStackLimits[1], flTime, flTime2, flCurrentTime, flDuration, flDuration2); + } -/** - * Player functions - **/ + if (iType & MT_REWARD_DAMAGEBOOST) + { + if (!(g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_DAMAGEBOOST)) + { + FormatEx(sSet[iRewardCount], sizeof sSet[], "%T", "RewardDamageBoost", survivor); + vSetupRewardCounts(survivor, tank, priority, MT_REWARD_DAMAGEBOOST); + vRewardLadyKillerMessage(survivor, tank, priority); -void vRemovePlayerDamage(int victim, int damagetype) -{ - if (damagetype & DMG_BURN) - { - ExtinguishEntity(victim); - } + g_esPlayer[survivor].g_iRewardTypes |= MT_REWARD_DAMAGEBOOST; + iRewardCount++; - vSetWounds(victim); -} + vRefreshLaserSight(survivor); + vToggleWeaponVerticalPunch(survivor, true); + } + else + { + vChooseRecipient(survivor, iRecipient, "RewardDamageBoost", sSet[iRewardCount], sizeof sSet[], sSet2[iRewardCount2], sizeof sSet2[], (g_esPlayer[survivor].g_iRewardStack[2] >= g_esTankCache[tank].g_iStackLimits[2])); + if (g_esPlayer[survivor].g_iRewardStack[2] >= g_esTankCache[tank].g_iStackLimits[2] && survivor != iRecipient) + { + vSetupRewardCounts(iRecipient, tank, priority, MT_REWARD_DAMAGEBOOST); + vRewardLadyKillerMessage(survivor, tank, priority); -void vRemovePlayerGlow(int player) -{ - if (!g_bSecondGame || !bIsValidClient(player)) - { - return; - } + if (survivor != iRecipient) + { + vRewardLadyKillerMessage(iRecipient, tank, priority); + } - SetEntProp(player, Prop_Send, "m_glowColorOverride", 0); - SetEntProp(player, Prop_Send, "m_bFlashing", 0); - SetEntProp(player, Prop_Send, "m_iGlowType", 0); -} + iRewardCount2++; -void vResetPlayerStatus(int player) -{ - vResetTank(player); - vResetTank2(player); - vResetCore(player); - vRemoveSurvivorEffects(player); - vCacheSettings(player); -} + if (!(g_esPlayer[iRecipient].g_iRewardTypes & MT_REWARD_DAMAGEBOOST)) + { + g_esPlayer[iRecipient].g_iRewardTypes |= MT_REWARD_DAMAGEBOOST; + } + } + else + { + vSetupRewardCounts(survivor, tank, priority, MT_REWARD_DAMAGEBOOST); + vRewardLadyKillerMessage(survivor, tank, priority); -void vResetTankDamage(int tank) -{ - for (int iSurvivor = 1; iSurvivor <= MaxClients; iSurvivor++) - { - g_esPlayer[iSurvivor].g_iTankDamage[tank] = 0; - } -} + iRewardCount++; + } + } -void vRestorePlayerGlow(int client) -{ - if (bIsInfected(client) && !bIsPlayerIncapacitated(client)) - { - vSetTankGlow(client); - } - else if (bIsSurvivor(client) && g_bSecondGame) - { - switch (bIsDeveloper(client, 0)) - { - case true: vSetSurvivorOutline(client, g_esDeveloper[client].g_sDevGlowOutline, .delimiter = ","); - case false: vToggleSurvivorEffects(client, .type = 6); - } - } -} + vSetupRewardDurations(survivor, iRecipient, 2, g_esTankCache[tank].g_iStackLimits[2], flTime, flTime2, flCurrentTime, flDuration, flDuration2); + } -/** - * Survivor functions - **/ + if (iType & MT_REWARD_ATTACKBOOST) + { + if (!(g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_ATTACKBOOST)) + { + FormatEx(sSet[iRewardCount], sizeof sSet[], "%T", "RewardAttackBoost", survivor); + vSetupRewardCounts(survivor, tank, priority, MT_REWARD_ATTACKBOOST); + SDKHook(survivor, SDKHook_PostThinkPost, OnSurvivorPostThinkPost); -void vAddSurvivorHealth(int survivor) + g_esPlayer[survivor].g_iRewardTypes |= MT_REWARD_ATTACKBOOST; + iRewardCount++; + } + else + { + vChooseRecipient(survivor, iRecipient, "RewardAttackBoost", sSet[iRewardCount], sizeof sSet[], sSet2[iRewardCount2], sizeof sSet2[], (g_esPlayer[survivor].g_iRewardStack[3] >= g_esTankCache[tank].g_iStackLimits[3])); + if (g_esPlayer[survivor].g_iRewardStack[3] >= g_esTankCache[tank].g_iStackLimits[3] && survivor != iRecipient) + { + vSetupRewardCounts(iRecipient, tank, priority, MT_REWARD_ATTACKBOOST); + iRewardCount2++; + + if (!(g_esPlayer[iRecipient].g_iRewardTypes & MT_REWARD_ATTACKBOOST)) + { + SDKHook(iRecipient, SDKHook_PostThinkPost, OnSurvivorPostThinkPost); + g_esPlayer[iRecipient].g_iRewardTypes |= MT_REWARD_ATTACKBOOST; + } + } + else + { + vSetupRewardCounts(survivor, tank, priority, MT_REWARD_ATTACKBOOST); + iRewardCount++; + } + } + + vSetupRewardDurations(survivor, iRecipient, 3, g_esTankCache[tank].g_iStackLimits[3], flTime, flTime2, flCurrentTime, flDuration, flDuration2); + } + + if (iType & MT_REWARD_AMMO) + { + if (!(g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_AMMO)) + { + FormatEx(sSet[iRewardCount], sizeof sSet[], "%T", "RewardAmmo", survivor); + vSetupRewardCounts(survivor, tank, priority, MT_REWARD_AMMO); + + g_esPlayer[survivor].g_iRewardTypes |= MT_REWARD_AMMO; + iRewardCount++; + + vSetupAmmoReward(survivor); + } + else + { + vChooseRecipient(survivor, iRecipient, "RewardAmmo", sSet[iRewardCount], sizeof sSet[], sSet2[iRewardCount2], sizeof sSet2[], (g_esPlayer[survivor].g_iRewardStack[4] >= g_esTankCache[tank].g_iStackLimits[4])); + if (g_esPlayer[survivor].g_iRewardStack[4] >= g_esTankCache[tank].g_iStackLimits[4] && survivor != iRecipient) + { + vSetupRewardCounts(iRecipient, tank, priority, MT_REWARD_AMMO); + iRewardCount2++; + + if (!(g_esPlayer[iRecipient].g_iRewardTypes & MT_REWARD_AMMO)) + { + g_esPlayer[iRecipient].g_iRewardTypes |= MT_REWARD_AMMO; + } + + vSetupAmmoReward(iRecipient); + } + else + { + vSetupRewardCounts(survivor, tank, priority, MT_REWARD_AMMO); + vSetupAmmoReward(survivor); + + iRewardCount++; + } + } + + vSetupRewardDurations(survivor, iRecipient, 4, g_esTankCache[tank].g_iStackLimits[4], flTime, flTime2, flCurrentTime, flDuration, flDuration2); + } + + if (iType & MT_REWARD_ITEM) + { + if (!(g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_ITEM)) + { + vSetupItemReward(survivor, tank, priority, sReceived, sizeof sReceived); + g_esPlayer[survivor].g_iRewardTypes |= MT_REWARD_ITEM; + } + + if (survivor != iRecipient && !(g_esPlayer[iRecipient].g_iRewardTypes & MT_REWARD_ITEM)) + { + vSetupItemReward(iRecipient, tank, priority, sShared, sizeof sShared); + g_esPlayer[iRecipient].g_iRewardTypes |= MT_REWARD_ITEM; + } + } + + if (sReceived[0] != '\0') + { + MT_PrintToChat(survivor, "%s %t", MT_TAG3, "RewardReceived", sReceived); + } + + if (survivor != iRecipient && sShared[0] != '\0') + { + MT_PrintToChat(iRecipient, "%s %t", MT_TAG3, "RewardShared", survivor, sShared); + } + + if (iType & MT_REWARD_GODMODE) + { + if (!(g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_GODMODE)) + { + FormatEx(sSet[iRewardCount], sizeof sSet[], "%T", "RewardGod", survivor); + vSetupRewardCounts(survivor, tank, priority, MT_REWARD_GODMODE); + vSetupGodmodeReward(survivor); + + g_esPlayer[survivor].g_iRewardTypes |= MT_REWARD_GODMODE; + iRewardCount++; + } + else + { + vChooseRecipient(survivor, iRecipient, "RewardGod", sSet[iRewardCount], sizeof sSet[], sSet2[iRewardCount2], sizeof sSet2[], (g_esPlayer[survivor].g_iRewardStack[5] >= g_esTankCache[tank].g_iStackLimits[5])); + if (g_esPlayer[survivor].g_iRewardStack[5] >= g_esTankCache[tank].g_iStackLimits[5] && survivor != iRecipient) + { + vSetupRewardCounts(iRecipient, tank, priority, MT_REWARD_GODMODE); + iRewardCount2++; + + if (!(g_esPlayer[iRecipient].g_iRewardTypes & MT_REWARD_GODMODE)) + { + vSetupGodmodeReward(iRecipient); + g_esPlayer[iRecipient].g_iRewardTypes |= MT_REWARD_GODMODE; + } + } + else + { + vSetupRewardCounts(survivor, tank, priority, MT_REWARD_GODMODE); + iRewardCount++; + } + } + + vSetupRewardDurations(survivor, iRecipient, 5, g_esTankCache[tank].g_iStackLimits[5], flTime, flTime2, flCurrentTime, flDuration, flDuration2); + } + + if (iType & MT_REWARD_REFILL) + { + if (!(g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_REFILL)) + { + FormatEx(sSet[iRewardCount], sizeof sSet[], "%T", "RewardRefill", survivor); + vSetupRefillReward(survivor, tank, priority); + + g_esPlayer[survivor].g_iRewardTypes |= MT_REWARD_REFILL; + iRewardCount++; + } + else + { + vChooseRecipient(survivor, iRecipient, "RewardRefill", sSet[iRewardCount], sizeof sSet[], sSet2[iRewardCount2], sizeof sSet2[], (g_esPlayer[survivor].g_iRewardStack[6] >= g_esTankCache[tank].g_iStackLimits[6])); + if (g_esPlayer[survivor].g_iRewardStack[6] >= g_esTankCache[tank].g_iStackLimits[6] && survivor != iRecipient) + { + vSetupRefillReward(iRecipient, tank, priority); + iRewardCount2++; + + if (!(g_esPlayer[iRecipient].g_iRewardTypes & MT_REWARD_REFILL)) + { + g_esPlayer[iRecipient].g_iRewardTypes |= MT_REWARD_REFILL; + } + } + else + { + vSetupRefillReward(survivor, tank, priority); + iRewardCount++; + } + } + + vSetupRewardDurations(survivor, iRecipient, 6, g_esTankCache[tank].g_iStackLimits[6], flTime, flTime2, flCurrentTime, flDuration, flDuration2); + } + + if (iType & MT_REWARD_INFAMMO) + { + if (!(g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_INFAMMO)) + { + FormatEx(sSet[iRewardCount], sizeof sSet[], "%T", "RewardInfAmmo", survivor); + vSetupRewardCounts(survivor, tank, priority, MT_REWARD_INFAMMO); + + g_esPlayer[survivor].g_iRewardTypes |= MT_REWARD_INFAMMO; + iRewardCount++; + } + else + { + vChooseRecipient(survivor, iRecipient, "RewardInfAmmo", sSet[iRewardCount], sizeof sSet[], sSet2[iRewardCount2], sizeof sSet2[], (g_esPlayer[survivor].g_iRewardStack[7] >= g_esTankCache[tank].g_iStackLimits[7])); + if (g_esPlayer[survivor].g_iRewardStack[7] >= g_esTankCache[tank].g_iStackLimits[7] && survivor != iRecipient) + { + vSetupRewardCounts(iRecipient, tank, priority, MT_REWARD_INFAMMO); + iRewardCount2++; + + if (!(g_esPlayer[iRecipient].g_iRewardTypes & MT_REWARD_INFAMMO)) + { + g_esPlayer[iRecipient].g_iRewardTypes |= MT_REWARD_INFAMMO; + } + } + else + { + vSetupRewardCounts(survivor, tank, priority, MT_REWARD_INFAMMO); + iRewardCount++; + } + } + + vSetupRewardDurations(survivor, iRecipient, 7, g_esTankCache[tank].g_iStackLimits[7], flTime, flTime2, flCurrentTime, flDuration, flDuration2); + } + + char sRewards[1024]; + vListRewards(survivor, iRewardCount, sSet, sizeof sSet, sRewards, sizeof sRewards); + if (sRewards[0] != '\0') + { + vRewardMessage(survivor, survivor, priority, iRewardCount, sRewards, sTankName); + vSetupVisual(survivor, survivor, tank, priority, iRewardCount, bDeveloper, flTime, flCurrentTime, flDuration); + } + + if (survivor != iRecipient) + { + char sRewards2[1024]; + vListRewards(iRecipient, iRewardCount2, sSet2, sizeof sSet2, sRewards2, sizeof sRewards2); + if (sRewards2[0] != '\0') + { + vRewardMessage(iRecipient, survivor, priority, iRewardCount2, sRewards2, sTankName); + vSetupVisual(iRecipient, survivor, tank, priority, iRewardCount2, bDeveloper2, flTime2, flCurrentTime, flDuration2); + } + + vResetSurvivorStats2(iRecipient); + } + } + } + case false: + { + char sSet[8][64]; + int iRewardCount = 0; + if ((iType & MT_REWARD_HEALTH) && (g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_HEALTH)) + { + FormatEx(sSet[iRewardCount], sizeof sSet[], "%T", "RewardHealth", survivor); + + g_esPlayer[survivor].g_iRewardTypes &= ~MT_REWARD_HEALTH; + g_esPlayer[survivor].g_flRewardTime[0] = -1.0; + g_esPlayer[survivor].g_iRewardStack[0] = 0; + g_esPlayer[survivor].g_iBlazeHealth = 0; + g_esPlayer[survivor].g_iBloodDonor = 0; + g_esPlayer[survivor].g_flDopamineRadius = 0.0; + g_esPlayer[survivor].g_flHealPercent = 0.0; + g_esPlayer[survivor].g_flHealthcareRadius = 0.0; + g_esPlayer[survivor].g_iHealthRegen = 0; + g_esPlayer[survivor].g_flHeartbeat = 0.0; + g_esPlayer[survivor].g_flHeartbeatCooldown = -1.0; + g_esPlayer[survivor].g_iLifeLeech = 0; + g_esPlayer[survivor].g_iMedicalCuts = 0; + g_esPlayer[survivor].g_flMotivationRadius = 0.0; + g_esPlayer[survivor].g_flOverdoseRadius = 0.0; + g_esPlayer[survivor].g_iOverhealth = 0; + g_esPlayer[survivor].g_iRegenBursts = 0; + g_esPlayer[survivor].g_iReviveHealth = 0; + g_esPlayer[survivor].g_flShockwaveRadius = 0.0; + g_esPlayer[survivor].g_iSyringeDarts = 0; + iRewardCount++; + } + + if ((iType & MT_REWARD_SPEEDBOOST) && (g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_SPEEDBOOST)) + { + FormatEx(sSet[iRewardCount], sizeof sSet[], "%T", "RewardSpeedBoost", survivor); + + g_esPlayer[survivor].g_iRewardTypes &= ~MT_REWARD_SPEEDBOOST; + g_esPlayer[survivor].g_flRewardTime[1] = -1.0; + g_esPlayer[survivor].g_iRewardStack[1] = 0; + g_esPlayer[survivor].g_flAdrenalineTime = 0.0; + g_esPlayer[survivor].g_flJumpHeight = 0.0; + g_esPlayer[survivor].g_flSpeedBoost = 0.0; + g_esPlayer[survivor].g_iBunnyHop = 0; + g_esPlayer[survivor].g_iFallPasses = MT_JUMP_FALLPASSES; + g_esPlayer[survivor].g_iStickyGrenades = 0; + iRewardCount++; + + if (bIsSurvivor(survivor, MT_CHECK_ALIVE) && !bIsDeveloper(survivor, 5)) + { + if (flGetAdrenalineTime(survivor) > 0.0) + { + vSetAdrenalineTime(survivor, 0.0); + } + + SDKUnhook(survivor, SDKHook_PreThinkPost, OnSpeedPreThinkPost); + SetEntPropFloat(survivor, Prop_Send, "m_flLaggedMovementValue", (g_esGeneral.g_bLaggedMovementInstalled ? L4D_LaggedMovement(survivor, 1.0, true) : 1.0)); + } + } + + if ((iType & MT_REWARD_DAMAGEBOOST) && (g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_DAMAGEBOOST)) + { + FormatEx(sSet[iRewardCount], sizeof sSet[], "%T", "RewardDamageBoost", survivor); + + g_esPlayer[survivor].g_iRewardTypes &= ~MT_REWARD_DAMAGEBOOST; + g_esPlayer[survivor].g_flRewardTime[2] = -1.0; + g_esPlayer[survivor].g_iRewardStack[2] = 0; + g_esPlayer[survivor].g_flDamageBoost = 0.0; + g_esPlayer[survivor].g_flDamageResistance = 0.0; + g_esPlayer[survivor].g_flHollowpointAmmo = 0.0; + g_esPlayer[survivor].g_flLadyKiller = 0.0; + g_esPlayer[survivor].g_flPipeBombDuration = 0.0; + g_esPlayer[survivor].g_flSledgehammerRounds = 0.0; + g_esPlayer[survivor].g_iEternalFlames = 0; + g_esPlayer[survivor].g_iFriendlyFire = 0; + g_esPlayer[survivor].g_iGhostBullets = 0; + g_esPlayer[survivor].g_iLaserSight = 0; + g_esPlayer[survivor].g_iMeleeRange = 0; + g_esPlayer[survivor].g_iRecoilDampener = 0; + g_esPlayer[survivor].g_iThorns = 0; + iRewardCount++; + + vRefreshLaserSight(survivor); + vToggleWeaponVerticalPunch(survivor, false); + } + + if ((iType & MT_REWARD_ATTACKBOOST) && (g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_ATTACKBOOST)) + { + FormatEx(sSet[iRewardCount], sizeof sSet[], "%T", "RewardAttackBoost", survivor); + + g_esPlayer[survivor].g_iRewardTypes &= ~MT_REWARD_ATTACKBOOST; + g_esPlayer[survivor].g_flRewardTime[3] = -1.0; + g_esPlayer[survivor].g_iRewardStack[3] = 0; + g_esPlayer[survivor].g_flActionDuration = 0.0; + g_esPlayer[survivor].g_flAttackBoost = 0.0; + g_esPlayer[survivor].g_flFireRate = 0.0; + g_esPlayer[survivor].g_flRapidPistol = 0.0; + g_esPlayer[survivor].g_flReloadRate = 0.0; + g_esPlayer[survivor].g_flShoveDamage = 0.0; + g_esPlayer[survivor].g_flShoveRate = 0.0; + g_esPlayer[survivor].g_flSwingRate = 0.0; + g_esPlayer[survivor].g_iBurstDoors = 0; + g_esPlayer[survivor].g_iFastRecovery = 0; + g_esPlayer[survivor].g_iLadderActions = 0; + g_esPlayer[survivor].g_iShovePenalty = 0; + iRewardCount++; + } + + if ((iType & MT_REWARD_AMMO) && (g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_AMMO)) + { + FormatEx(sSet[iRewardCount], sizeof sSet[], "%T", "RewardAmmo", survivor); + + g_esPlayer[survivor].g_iRewardTypes &= ~MT_REWARD_AMMO; + g_esPlayer[survivor].g_flRewardTime[4] = -1.0; + g_esPlayer[survivor].g_iRewardStack[4] = 0; + g_esPlayer[survivor].g_flGrenadeLauncher = 0.0; + g_esPlayer[survivor].g_flLuckyBullet = 0.0; + g_esPlayer[survivor].g_flSupplier = 0.0; + g_esPlayer[survivor].g_flSupplierCooldown = -1.0; + g_esPlayer[survivor].g_iAmmoBoost = 0; + g_esPlayer[survivor].g_iAmmoRefill = 0; + g_esPlayer[survivor].g_iAmmoRegen = 0; + g_esPlayer[survivor].g_iClusterBombs = 0; + g_esPlayer[survivor].g_iSpecialAmmo = 0; + iRewardCount++; + + if (bIsSurvivor(survivor, MT_CHECK_ALIVE)) + { + vRefillGunAmmo(survivor, .reset = true); + } + } + + if ((iType & MT_REWARD_GODMODE) && (g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_GODMODE)) + { + FormatEx(sSet[iRewardCount], sizeof sSet[], "%T", "RewardGod", survivor); + + g_esPlayer[survivor].g_iRewardTypes &= ~MT_REWARD_GODMODE; + g_esPlayer[survivor].g_flRewardTime[5] = -1.0; + g_esPlayer[survivor].g_iRewardStack[5] = 0; + g_esPlayer[survivor].g_flPunchResistance = 0.0; + g_esPlayer[survivor].g_iCleanKills = 0; + g_esPlayer[survivor].g_iRiotGear = 0; + g_esPlayer[survivor].g_iSafetyBubble = 0; + iRewardCount++; + + vRemoveBubble(survivor); + } + + if ((iType & MT_REWARD_REFILL) && (g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_REFILL)) + { + FormatEx(sSet[iRewardCount], sizeof sSet[], "%T", "RewardRefill", survivor); + + g_esPlayer[survivor].g_iRewardTypes &= ~MT_REWARD_REFILL; + g_esPlayer[survivor].g_flRewardTime[6] = -1.0; + g_esPlayer[survivor].g_iRewardStack[6] = 0; + g_esPlayer[survivor].g_iAmmoRefill = 0; + g_esPlayer[survivor].g_flRefillPercent = 0.0; + iRewardCount++; + } + + if ((iType & MT_REWARD_INFAMMO) && (g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_INFAMMO)) + { + FormatEx(sSet[iRewardCount], sizeof sSet[], "%T", "RewardInfAmmo", survivor); + + g_esPlayer[survivor].g_iRewardTypes &= ~MT_REWARD_INFAMMO; + g_esPlayer[survivor].g_flRewardTime[7] = -1.0; + g_esPlayer[survivor].g_iRewardStack[7] = 0; + g_esPlayer[survivor].g_iInfiniteAmmo = 0; + iRewardCount++; + } + + char sRewards[1024]; + vListRewards(survivor, iRewardCount, sSet, sizeof sSet, sRewards, sizeof sRewards); + if (bIsValidClient(survivor, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_FAKECLIENT) && iRewardCount > 0 && g_esPlayer[survivor].g_iNotify >= 2) + { + MT_PrintToChat(survivor, "%s %t", MT_TAG2, "RewardEnd", sRewards); + } + + if (g_esPlayer[survivor].g_iRewardTypes <= 0) + { + g_esPlayer[survivor].g_iNotify = 0; + g_esPlayer[survivor].g_iPrefsAccess = 0; + } + } + } + } +} + +void vRewardItemMessage(int survivor, const char[] list, char[] buffer, int size, bool set) +{ + char sTemp[PLATFORM_MAX_PATH]; + + switch (buffer[0] != '\0') + { + case true: + { + switch (set) + { + case true: FormatEx(sTemp, sizeof sTemp, "{default}, {yellow}%s", list); + case false: FormatEx(sTemp, sizeof sTemp, "{default} %T{yellow} %s", "AndConjunction", survivor, list); + } + + StrCat(buffer, size, sTemp); + } + case false: StrCat(buffer, size, list); + } +} + +void vRewardLadyKillerMessage(int survivor, int tank, int priority) +{ + if (!bIsValidClient(survivor, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_FAKECLIENT)) + { + return; + } + + float flReward = g_esTankCache[tank].g_flLadyKillerReward[priority]; + vSetupLadyKillerReminder(survivor, (flReward / 100.0), (g_esPlayer[survivor].g_iNotify >= 2)); +} + +void vRewardMessage(int survivor, int recipient, int priority, int count, const char[] list, const char[] namePhrase) +{ + if (!bIsValidClient(survivor, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_FAKECLIENT) || count <= 0 || g_esPlayer[survivor].g_iNotify <= 1) + { + return; + } + + if (survivor != recipient) + { + MT_PrintToChat(survivor, "%s %t", MT_TAG3, "RewardShared", recipient, list); + } + else + { + switch (priority) + { + case 0: MT_PrintToChat(survivor, "%s %t", MT_TAG3, "RewardList", list, namePhrase); + case 1: MT_PrintToChat(survivor, "%s %t", MT_TAG3, "RewardList2", list, namePhrase); + case 2: MT_PrintToChat(survivor, "%s %t", MT_TAG3, "RewardList3", list, namePhrase); + case 3: MT_PrintToChat(survivor, "%s %t", MT_TAG3, "RewardList4", list, namePhrase); + } + } +} + +void vRewardNotify(int survivor, int tank, int priority, const char[] phrase, const char[] namePhrase) +{ + if (!bIsValidClient(survivor, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_FAKECLIENT) || g_esTankCache[tank].g_iRewardNotify[priority] <= 0 || g_esTankCache[tank].g_iRewardNotify[priority] == 2) + { + return; + } + + switch (StrEqual(phrase, "RewardNone")) + { + case true: MT_PrintToChat(survivor, "%s %t", MT_TAG3, phrase, namePhrase); + case false: + { + MT_PrintToChatAll("%s %t", MT_TAG3, phrase, survivor, namePhrase); + vLogMessage(MT_LOG_LIFE, _, "%s %T", MT_TAG, phrase, LANG_SERVER, survivor, namePhrase); + } + } +} + +void vShowDamageList(int tank, const char[] namePhrase, const char[][] lists, int maxLists) +{ + for (int iPos = 0; iPos < maxLists; iPos++) + { + if (g_esTankCache[tank].g_iDeathDetails > 2 && lists[iPos][0] != '\0') + { + switch (iPos) + { + case 0: + { + MT_PrintToChatAll("%s %t", MT_TAG2, "TeammatesList", namePhrase, lists[iPos]); + vLogMessage(MT_LOG_LIFE, _, "%s %T", MT_TAG, "TeammatesList", LANG_SERVER, namePhrase, lists[iPos]); + } + default: + { + MT_PrintToChatAll("%s %s", MT_TAG3, lists[iPos]); + vLogMessage(MT_LOG_LIFE, _, "%s %s", MT_TAG, lists[iPos]); + } + } + } + } +} + +void vSetupAmmoReward(int survivor) +{ + if (g_esPlayer[survivor].g_iAmmoRefill == 1) + { + vCheckGunClipSizes(survivor); + vRefillGunAmmo(survivor); + } + + vGiveGunSpecialAmmo(survivor); +} + +void vSetupGodmodeReward(int survivor) +{ + if (g_esPlayer[survivor].g_iSafetyBubble == 1) + { + if (g_esPlayer[survivor].g_bVomited) + { + vUnvomitPlayer(survivor); + } + + if ((g_esGeneral.g_iGraphicsLevel > 1 || g_esGeneral.g_cvMTGraphicsLevel.IntValue > 1) && g_esPlayer[survivor].g_iBubble == INVALID_ENT_REFERENCE) + { + g_esPlayer[survivor].g_iBubble = CreateEntityByName("prop_dynamic"); + if (bIsValidEntity(g_esPlayer[survivor].g_iBubble)) + { + float flOrigin[3]; + GetClientAbsOrigin(survivor, flOrigin); + flOrigin[2] -= 120.0; + + SetEntityModel(g_esPlayer[survivor].g_iBubble, MODEL_SHIELD); + DispatchKeyValueVector(g_esPlayer[survivor].g_iBubble, "origin", flOrigin); + DispatchSpawn(g_esPlayer[survivor].g_iBubble); + vSetEntityParent(g_esPlayer[survivor].g_iBubble, survivor, true); + + SetEntityRenderMode(g_esPlayer[survivor].g_iBubble, RENDER_TRANSTEXTURE); + SetEntityRenderColor(g_esPlayer[survivor].g_iBubble, 50, 50, 50, 50); + + SetEntProp(g_esPlayer[survivor].g_iBubble, Prop_Send, "m_CollisionGroup", 1); + SDKHook(g_esPlayer[survivor].g_iBubble, SDKHook_SetTransmit, OnPropSetTransmit); + g_esPlayer[survivor].g_iBubble = EntIndexToEntRef(g_esPlayer[survivor].g_iBubble); + } + } + } +} + +void vSetupHealthReward(int survivor, int tank, int priority) +{ + vSetupRewardCounts(survivor, tank, priority, MT_REWARD_HEALTH); + vSaveCaughtSurvivor(survivor); + vRefillSurvivorHealth(survivor); +} + +void vSetupItemReward(int survivor, int tank, int priority, char[] buffer, int size) +{ + bool bListed = false; + char sLoadout[320], sItems[5][64], sList[320]; + + switch (priority) + { + case 0: strcopy(sLoadout, sizeof sLoadout, g_esTankCache[tank].g_sItemReward); + case 1: strcopy(sLoadout, sizeof sLoadout, g_esTankCache[tank].g_sItemReward2); + case 2: strcopy(sLoadout, sizeof sLoadout, g_esTankCache[tank].g_sItemReward3); + case 3: strcopy(sLoadout, sizeof sLoadout, g_esTankCache[tank].g_sItemReward4); + } + + if (FindCharInString(sLoadout, ';') != -1) + { + int iItemCount = 0; + ExplodeString(sLoadout, ";", sItems, sizeof sItems, sizeof sItems[]); + for (int iPos = 0; iPos < (sizeof sItems); iPos++) + { + if (sItems[iPos][0] != '\0') + { + iItemCount++; + + vCheatCommand(survivor, "give", sItems[iPos]); + ReplaceString(sItems[iPos], sizeof sItems[], "_", " "); + + switch (bListed) + { + case true: + { + switch (iPos < ((sizeof sItems) - 1) && sItems[iPos + 1][0] != '\0') + { + case true: Format(sList, sizeof sList, "%s{default}, {yellow}%s", sList, sItems[iPos]); + case false: + { + switch (iItemCount == 2 && buffer[0] == '\0') + { + case true: Format(sList, sizeof sList, "%s{default} %T{yellow} %s", sList, "AndConjunction", survivor, sItems[iPos]); + case false: Format(sList, sizeof sList, "%s{default}, %T{yellow} %s", sList, "AndConjunction", survivor, sItems[iPos]); + } + } + } + } + case false: + { + bListed = true; + + FormatEx(sList, sizeof sList, "%s", sItems[iPos]); + } + } + } + } + + vRewardItemMessage(survivor, sList, buffer, size, true); + } + else + { + vCheatCommand(survivor, "give", sLoadout); + ReplaceString(sLoadout, sizeof sLoadout, "_", " "); + vRewardItemMessage(survivor, sLoadout, buffer, size, false); + } +} + +void vSetupLadyKillerReminder(int survivor, float portion, bool check) +{ + int iSlot = GetPlayerWeaponSlot(survivor, 0); + if (iSlot > MaxClients) + { + int iAmmoType = GetEntProp(iSlot, Prop_Send, "m_iPrimaryAmmoType"); + if (iAmmoType > 0) + { + int iAmmo = GetEntProp(survivor, Prop_Send, "m_iAmmo", .element = iAmmoType), + iMaxAmmo = iGetMaxAmmo(survivor, 0, iSlot, true), iPortion = RoundToCeil(iMaxAmmo * portion); + + if (check && portion > 0.0) + { + MT_PrintToChat(survivor, "%s %t", MT_TAG2, "RewardLadyKiller", RoundToFloor(float(iAmmo) / float(iPortion))); + } + } + } +} + +void vSetupProcReward(int survivor) +{ + bool bDeveloper = bIsDeveloper(survivor, 10); + float flCurrentTime = GetGameTime(); + if (bDeveloper || (((g_esShooter[survivor].g_iTotalPassives & MT_PASSIVE_HEALTH) || (g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_HEALTH)) && g_esPlayer[survivor].g_flHeartbeat > 0.0)) + { + if (g_esPlayer[survivor].g_flHeartbeatCooldown == -1.0 || g_esPlayer[survivor].g_flHeartbeatCooldown <= flCurrentTime) + { + g_esPlayer[survivor].g_flHeartbeatCooldown = (flCurrentTime + g_esPlayer[survivor].g_flHeartbeat); + + vSetupProximityReward(survivor, survivor, 250.0, 5, {0, 255, 0, 150}); + } + } + + if (bDeveloper || (((g_esShooter[survivor].g_iTotalPassives & MT_PASSIVE_AMMO) || (g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_AMMO)) && g_esPlayer[survivor].g_flSupplier > 0.0)) + { + if (g_esPlayer[survivor].g_flSupplierCooldown == -1.0 || g_esPlayer[survivor].g_flSupplierCooldown <= flCurrentTime) + { + g_esPlayer[survivor].g_flSupplierCooldown = (flCurrentTime + g_esPlayer[survivor].g_flSupplier); + + vSetupProximityReward(survivor, survivor, 250.0, 6, {255, 150, 0, 150}); + } + } +} + +void vSetupProximityReward(int survivor, int target, float radius, int type, int color[4], int flags = MT_CHECK_INGAME|MT_CHECK_ALIVE) +{ + bool bShow = false; + float flSurvivorPos[3], flSurvivorPos2[3]; + GetClientAbsOrigin(survivor, flSurvivorPos); + for (int iTeammate = 1; iTeammate <= MaxClients; iTeammate++) + { + if (bIsSurvivor(iTeammate, flags) && bIsVisibleToPlayer(target, iTeammate, 1, .range = radius)) + { + if ((survivor == target && iTeammate == survivor) || (type == 2 && bIsValidClient(iTeammate, MT_CHECK_ALIVE)) || (3 <= type <= 5 && bIsSurvivorDisabled(iTeammate)) || (type != 5 && type != 6 && iTeammate == target)) + { + continue; + } + + switch (type == 2 && !g_esPlayer[iTeammate].g_bFinalFall) + { + case true: vCopyVector(g_esPlayer[iTeammate].g_flLastPosition, flSurvivorPos2); + case false: GetClientAbsOrigin(iTeammate, flSurvivorPos2); + } + + if (GetVectorDistance(flSurvivorPos, flSurvivorPos2) <= radius) + { + bShow = true; + + switch (type) + { + case 1: + { + int iHealth = GetEntProp(iTeammate, Prop_Data, "m_iHealth"), iMaxHealth = GetEntProp(iTeammate, Prop_Data, "m_iMaxHealth"), + iNewHealth = (iHealth + RoundToFloor(float(iMaxHealth - iHealth) * (g_esGeneral.g_cvMTFirstAidHealPercent.FloatValue * 0.5))), + iFinalHealth = ((iNewHealth > iMaxHealth) ? iMaxHealth : iNewHealth); + + vCheatCommand(iTeammate, "give", "health"); + SetEntProp(iTeammate, Prop_Data, "m_iHealth", iFinalHealth); + vSetTempHealth(iTeammate, 0.0); + } + case 2: + { + bRespawnSurvivor(iTeammate, false, target); + vSetSurvivorLastLife(iTeammate, g_esGeneral.g_cvMTSurvivorMaxIncapCount.IntValue, true, float(g_esGeneral.g_cvMTSurvivorReviveHealth.IntValue)); + } + case 3: vSetAdrenalineTime(iTeammate, (g_esGeneral.g_cvMTAdrenalineDuration.FloatValue * 0.5)); + case 4: + { + float flTemphealth = flGetTempHealth(iTeammate, g_esGeneral.g_cvMTPainPillsDecayRate.FloatValue), + flMaxHealth = float(GetEntProp(iTeammate, Prop_Data, "m_iMaxHealth")), + flNewHealth = (flTemphealth + (float(g_esGeneral.g_cvMTPainPillsHealthValue.IntValue) * 0.5)), + flFinalHealth = ((flNewHealth > flMaxHealth) ? flMaxHealth : flNewHealth); + + vSetTempHealth(iTeammate, flFinalHealth); + + int iHealth = GetEntProp(iTeammate, Prop_Data, "m_iHealth"), iMaxHealth = RoundToNearest(flMaxHealth), + iFinalHealth = ((iHealth > iMaxHealth) ? iMaxHealth : iHealth); + + SetEntProp(iTeammate, Prop_Data, "m_iHealth", iFinalHealth); + } + case 5: + { + int iHealth = GetEntProp(iTeammate, Prop_Data, "m_iHealth"), iMaxHealth = GetEntProp(iTeammate, Prop_Data, "m_iMaxHealth"), + iNewHealth = (iHealth + 5), iFinalHealth = ((iNewHealth > iMaxHealth) ? iMaxHealth : iNewHealth); + + SetEntProp(iTeammate, Prop_Data, "m_iHealth", iFinalHealth); + } + case 6: + { + int iWeapon = GetPlayerWeaponSlot(iTeammate, 0); + if (iWeapon > MaxClients) + { + int iAmmoOffset = iGetWeaponOffset(iWeapon), iAmmo = GetEntProp(iTeammate, Prop_Send, "m_iAmmo", .element = iAmmoOffset), + iMaxAmmo = iGetMaxAmmo(iTeammate, 0, iWeapon, true); + + vRefillGunMagazine(iTeammate, iWeapon, false, false, (iAmmo + RoundToCeil(iMaxAmmo * 0.05))); + } + } + case 7: vReviveSurvivor(iTeammate); + } + } + } + } + + if (bShow && (g_esGeneral.g_iGraphicsLevel > 2 || g_esGeneral.g_cvMTGraphicsLevel.IntValue > 2)) + { + TE_SetupBeamRingPoint(flSurvivorPos, 10.0, (radius * 2.0), g_iBossBeamSprite, g_iBossHaloSprite, 0, 0, 1.0, 3.0, 0.0, color, 1000, 0); + TE_SendToAll(); + } +} + +void vSetupRefillReward(int survivor, int tank, int priority) +{ + vSetupRewardCounts(survivor, tank, priority, MT_REWARD_REFILL); + vSaveCaughtSurvivor(survivor); + vCheckGunClipSizes(survivor); + vRefillSurvivorHealth(survivor); + + if (g_esPlayer[survivor].g_iAmmoRefill == 1) + { + vRefillGunAmmo(survivor, .reset = !(g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_AMMO), .override = true); + } +} + +void vSetupRewardCounts(int survivor, int tank, int priority, int type) +{ + switch (type) + { + case MT_REWARD_HEALTH: + { + if (!(g_esPlayer[survivor].g_iRewardTypes & type)) + { + g_esPlayer[survivor].g_flDopamineRadius = g_esTankCache[tank].g_flDopamineRadiusReward[priority]; + g_esPlayer[survivor].g_flHealPercent = g_esTankCache[tank].g_flHealPercentReward[priority]; + g_esPlayer[survivor].g_flHealthcareRadius = g_esTankCache[tank].g_flHealthcareRadiusReward[priority]; + g_esPlayer[survivor].g_flHeartbeat = g_esTankCache[tank].g_flHeartbeatReward[priority]; + g_esPlayer[survivor].g_flHeartbeatCooldown = -1.0; + g_esPlayer[survivor].g_flMotivationRadius = g_esTankCache[tank].g_flMotivationRadiusReward[priority]; + g_esPlayer[survivor].g_flOverdoseRadius = g_esTankCache[tank].g_flOverdoseRadiusReward[priority]; + g_esPlayer[survivor].g_flRefillPercent = g_esTankCache[tank].g_flRefillPercentReward[priority]; + g_esPlayer[survivor].g_flShockwaveRadius = g_esTankCache[tank].g_flShockwaveRadiusReward[priority]; + g_esPlayer[survivor].g_iBlazeHealth = g_esTankCache[tank].g_iBlazeHealthReward[priority]; + g_esPlayer[survivor].g_iBloodDonor = g_esTankCache[tank].g_iBloodDonorReward[priority]; + g_esPlayer[survivor].g_iHealthRegen = g_esTankCache[tank].g_iHealthRegenReward[priority]; + g_esPlayer[survivor].g_iLifeLeech = g_esTankCache[tank].g_iLifeLeechReward[priority]; + g_esPlayer[survivor].g_iMedicalCuts = g_esTankCache[tank].g_iMedicalCutsReward[priority]; + g_esPlayer[survivor].g_iOverhealth = g_esTankCache[tank].g_iOverhealthReward[priority]; + g_esPlayer[survivor].g_iRegenBursts = g_esTankCache[tank].g_iRegenBurstsReward[priority]; + g_esPlayer[survivor].g_iReviveHealth = g_esTankCache[tank].g_iReviveHealthReward[priority]; + g_esPlayer[survivor].g_iSyringeDarts = g_esTankCache[tank].g_iSyringeDartsReward[priority]; + } + else if ((g_esTankCache[tank].g_iStackRewards[priority] & type) && (g_esPlayer[survivor].g_iRewardTypes & type) && g_esTankCache[tank].g_iStackLimits[0] > 0 && g_esPlayer[survivor].g_iRewardStack[0] < g_esTankCache[tank].g_iStackLimits[0]) + { + g_esPlayer[survivor].g_flDopamineRadius += g_esTankCache[tank].g_flDopamineRadiusReward[priority]; + g_esPlayer[survivor].g_flDopamineRadius = flClamp(g_esPlayer[survivor].g_flDopamineRadius, 0.0, 99999.0); + g_esPlayer[survivor].g_flHealPercent += g_esTankCache[tank].g_flHealPercentReward[priority] / 2.0; + g_esPlayer[survivor].g_flHealPercent = flClamp(g_esPlayer[survivor].g_flHealPercent, 0.0, 100.0); + g_esPlayer[survivor].g_flHealthcareRadius += g_esTankCache[tank].g_flHealthcareRadiusReward[priority]; + g_esPlayer[survivor].g_flHealthcareRadius = flClamp(g_esPlayer[survivor].g_flHealthcareRadius, 0.0, 99999.0); + g_esPlayer[survivor].g_flHeartbeat -= g_esTankCache[tank].g_flHeartbeatReward[priority] / 2.0; + g_esPlayer[survivor].g_flHeartbeat = flClamp(g_esPlayer[survivor].g_flHeartbeat, 0.0, 99999.0); + g_esPlayer[survivor].g_flMotivationRadius += g_esTankCache[tank].g_flMotivationRadiusReward[priority]; + g_esPlayer[survivor].g_flMotivationRadius = flClamp(g_esPlayer[survivor].g_flMotivationRadius, 0.0, 99999.0); + g_esPlayer[survivor].g_flOverdoseRadius += g_esTankCache[tank].g_flOverdoseRadiusReward[priority]; + g_esPlayer[survivor].g_flOverdoseRadius = flClamp(g_esPlayer[survivor].g_flOverdoseRadius, 0.0, 99999.0); + g_esPlayer[survivor].g_flRefillPercent += g_esTankCache[tank].g_flRefillPercentReward[priority] / 2.0; + g_esPlayer[survivor].g_flRefillPercent = flClamp(g_esPlayer[survivor].g_flRefillPercent, 0.0, 100.0); + g_esPlayer[survivor].g_flShockwaveRadius += g_esTankCache[tank].g_flShockwaveRadiusReward[priority]; + g_esPlayer[survivor].g_flShockwaveRadius = flClamp(g_esPlayer[survivor].g_flShockwaveRadius, 0.0, 99999.0); + g_esPlayer[survivor].g_iBlazeHealth += g_esTankCache[tank].g_iBlazeHealthReward[priority]; + g_esPlayer[survivor].g_iBlazeHealth = iClamp(g_esPlayer[survivor].g_iBlazeHealth, 0, MT_MAXHEALTH); + g_esPlayer[survivor].g_iBloodDonor += g_esTankCache[tank].g_iBloodDonorReward[priority]; + g_esPlayer[survivor].g_iBloodDonor = iClamp(g_esPlayer[survivor].g_iBloodDonor, 0, MT_MAXHEALTH); + g_esPlayer[survivor].g_iHealthRegen += g_esTankCache[tank].g_iHealthRegenReward[priority]; + g_esPlayer[survivor].g_iHealthRegen = iClamp(g_esPlayer[survivor].g_iHealthRegen, 0, MT_MAXHEALTH); + g_esPlayer[survivor].g_iLifeLeech += g_esTankCache[tank].g_iLifeLeechReward[priority]; + g_esPlayer[survivor].g_iLifeLeech = iClamp(g_esPlayer[survivor].g_iLifeLeech, 0, MT_MAXHEALTH); + g_esPlayer[survivor].g_iMedicalCuts += g_esTankCache[tank].g_iMedicalCutsReward[priority]; + g_esPlayer[survivor].g_iMedicalCuts = iClamp(g_esPlayer[survivor].g_iMedicalCuts, 0, MT_MAXHEALTH); + g_esPlayer[survivor].g_iOverhealth += g_esTankCache[tank].g_iOverhealthReward[priority]; + g_esPlayer[survivor].g_iOverhealth = iClamp(g_esPlayer[survivor].g_iOverhealth, 0, MT_MAXHEALTH); + g_esPlayer[survivor].g_iRegenBursts += g_esTankCache[tank].g_iRegenBurstsReward[priority]; + g_esPlayer[survivor].g_iRegenBursts = iClamp(g_esPlayer[survivor].g_iRegenBursts, 0, MT_MAXHEALTH); + g_esPlayer[survivor].g_iReviveHealth += g_esTankCache[tank].g_iReviveHealthReward[priority]; + g_esPlayer[survivor].g_iReviveHealth = iClamp(g_esPlayer[survivor].g_iReviveHealth, 0, MT_MAXHEALTH); + g_esPlayer[survivor].g_iSyringeDarts += g_esTankCache[tank].g_iSyringeDartsReward[priority]; + g_esPlayer[survivor].g_iSyringeDarts = iClamp(g_esPlayer[survivor].g_iSyringeDarts, 0, MT_MAXHEALTH); + g_esPlayer[survivor].g_iRewardStack[0]++; + } + } + case MT_REWARD_SPEEDBOOST: + { + if (!(g_esPlayer[survivor].g_iRewardTypes & type)) + { + g_esPlayer[survivor].g_flAdrenalineTime = g_esTankCache[tank].g_flAdrenalineTimeReward[priority]; + g_esPlayer[survivor].g_flJumpHeight = g_esTankCache[tank].g_flJumpHeightReward[priority]; + g_esPlayer[survivor].g_flSpeedBoost = g_esTankCache[tank].g_flSpeedBoostReward[priority]; + g_esPlayer[survivor].g_iBunnyHop = g_esTankCache[tank].g_iBunnyHopReward[priority]; + g_esPlayer[survivor].g_iFallPasses = 0; + g_esPlayer[survivor].g_iMidairDashesLimit = g_esTankCache[tank].g_iMidairDashesReward[priority]; + g_esPlayer[survivor].g_iStickyGrenades = g_esTankCache[tank].g_iStickyGrenadesReward[priority]; + } + else if ((g_esTankCache[tank].g_iStackRewards[priority] & type) && (g_esPlayer[survivor].g_iRewardTypes & type) && g_esTankCache[tank].g_iStackLimits[1] > 0 && g_esPlayer[survivor].g_iRewardStack[1] < g_esTankCache[tank].g_iStackLimits[1]) + { + g_esPlayer[survivor].g_flAdrenalineTime += g_esTankCache[tank].g_flAdrenalineTimeReward[priority]; + g_esPlayer[survivor].g_flAdrenalineTime = flClamp(g_esPlayer[survivor].g_flAdrenalineTime, 0.0, 99999.0); + g_esPlayer[survivor].g_flJumpHeight += g_esTankCache[tank].g_flJumpHeightReward[priority]; + g_esPlayer[survivor].g_flJumpHeight = flClamp(g_esPlayer[survivor].g_flJumpHeight, 0.0, 99999.0); + g_esPlayer[survivor].g_flSpeedBoost += g_esTankCache[tank].g_flSpeedBoostReward[priority]; + g_esPlayer[survivor].g_flSpeedBoost = flClamp(g_esPlayer[survivor].g_flSpeedBoost, 0.0, 99999.0); + g_esPlayer[survivor].g_iBunnyHop = g_esTankCache[tank].g_iBunnyHopReward[priority]; + g_esPlayer[survivor].g_iFallPasses = 0; + g_esPlayer[survivor].g_iMidairDashesLimit += g_esTankCache[tank].g_iMidairDashesReward[priority]; + g_esPlayer[survivor].g_iMidairDashesLimit = iClamp(g_esPlayer[survivor].g_iMidairDashesLimit); + g_esPlayer[survivor].g_iStickyGrenades = g_esTankCache[tank].g_iStickyGrenadesReward[priority]; + g_esPlayer[survivor].g_iRewardStack[1]++; + } + } + case MT_REWARD_DAMAGEBOOST: + { + if (!(g_esPlayer[survivor].g_iRewardTypes & type)) + { + g_esPlayer[survivor].g_flDamageBoost = g_esTankCache[tank].g_flDamageBoostReward[priority]; + g_esPlayer[survivor].g_flDamageResistance = g_esTankCache[tank].g_flDamageResistanceReward[priority]; + g_esPlayer[survivor].g_flHollowpointAmmo = g_esTankCache[tank].g_flHollowpointAmmoReward[priority]; + g_esPlayer[survivor].g_flLadyKiller = g_esTankCache[tank].g_flLadyKillerReward[priority]; + g_esPlayer[survivor].g_flPipeBombDuration = g_esTankCache[tank].g_flPipeBombDurationReward[priority]; + g_esPlayer[survivor].g_flSledgehammerRounds = g_esTankCache[tank].g_flSledgehammerRoundsReward[priority]; + g_esPlayer[survivor].g_iEternalFlames = g_esTankCache[tank].g_iEternalFlamesReward[priority]; + g_esPlayer[survivor].g_iFriendlyFire = g_esTankCache[tank].g_iFriendlyFireReward[priority]; + g_esPlayer[survivor].g_iGhostBullets = g_esTankCache[tank].g_iGhostBulletsReward[priority]; + g_esPlayer[survivor].g_iLaserSight = g_esTankCache[tank].g_iLaserSightReward[priority]; + g_esPlayer[survivor].g_iMeleeRange = g_esTankCache[tank].g_iMeleeRangeReward[priority]; + g_esPlayer[survivor].g_iRecoilDampener = g_esTankCache[tank].g_iRecoilDampenerReward[priority]; + g_esPlayer[survivor].g_iThorns = g_esTankCache[tank].g_iThornsReward[priority]; + } + else if ((g_esTankCache[tank].g_iStackRewards[priority] & type) && (g_esPlayer[survivor].g_iRewardTypes & type) && g_esTankCache[tank].g_iStackLimits[2] > 0 && g_esPlayer[survivor].g_iRewardStack[2] < g_esTankCache[tank].g_iStackLimits[2]) + { + g_esPlayer[survivor].g_flDamageBoost += g_esTankCache[tank].g_flDamageBoostReward[priority]; + g_esPlayer[survivor].g_flDamageBoost = flClamp(g_esPlayer[survivor].g_flDamageBoost, 0.0, 99999.0); + g_esPlayer[survivor].g_flDamageResistance -= g_esTankCache[tank].g_flDamageResistanceReward[priority] / 2.0; + g_esPlayer[survivor].g_flDamageResistance = flClamp(g_esPlayer[survivor].g_flDamageResistance, 0.0, 1.0); + g_esPlayer[survivor].g_flHollowpointAmmo += g_esTankCache[tank].g_flHollowpointAmmoReward[priority]; + g_esPlayer[survivor].g_flHollowpointAmmo = flClamp(g_esPlayer[survivor].g_flHollowpointAmmo, 0.0, 100.0); + g_esPlayer[survivor].g_flLadyKiller -= g_esTankCache[tank].g_flLadyKillerReward[priority]; + g_esPlayer[survivor].g_flLadyKiller = flClamp(g_esPlayer[survivor].g_flLadyKiller); + g_esPlayer[survivor].g_flPipeBombDuration += g_esTankCache[tank].g_flPipeBombDurationReward[priority]; + g_esPlayer[survivor].g_flPipeBombDuration = flClamp(g_esPlayer[survivor].g_flPipeBombDuration); + g_esPlayer[survivor].g_flSledgehammerRounds += g_esTankCache[tank].g_flSledgehammerRoundsReward[priority]; + g_esPlayer[survivor].g_flSledgehammerRounds = flClamp(g_esPlayer[survivor].g_flSledgehammerRounds, 0.0, 100.0); + g_esPlayer[survivor].g_iEternalFlames = g_esTankCache[tank].g_iEternalFlamesReward[priority]; + g_esPlayer[survivor].g_iFriendlyFire = g_esTankCache[tank].g_iFriendlyFireReward[priority]; + g_esPlayer[survivor].g_iGhostBullets = g_esTankCache[tank].g_iGhostBulletsReward[priority]; + g_esPlayer[survivor].g_iLaserSight = g_esTankCache[tank].g_iLaserSightReward[priority]; + g_esPlayer[survivor].g_iMeleeRange += g_esTankCache[tank].g_iMeleeRangeReward[priority]; + g_esPlayer[survivor].g_iMeleeRange = iClamp(g_esPlayer[survivor].g_iMeleeRange); + g_esPlayer[survivor].g_iRecoilDampener = g_esTankCache[tank].g_iRecoilDampenerReward[priority]; + g_esPlayer[survivor].g_iThorns = g_esTankCache[tank].g_iThornsReward[priority]; + g_esPlayer[survivor].g_iRewardStack[2]++; + } + } + case MT_REWARD_ATTACKBOOST: + { + if (!(g_esPlayer[survivor].g_iRewardTypes & type)) + { + g_esPlayer[survivor].g_flActionDuration = g_esTankCache[tank].g_flActionDurationReward[priority]; + g_esPlayer[survivor].g_flAttackBoost = g_esTankCache[tank].g_flAttackBoostReward[priority]; + g_esPlayer[survivor].g_flFireRate = g_esTankCache[tank].g_flFireRateReward[priority]; + g_esPlayer[survivor].g_flRapidPistol = g_esTankCache[tank].g_flRapidPistolReward[priority]; + g_esPlayer[survivor].g_flReloadRate = g_esTankCache[tank].g_flReloadRateReward[priority]; + g_esPlayer[survivor].g_flShoveDamage = g_esTankCache[tank].g_flShoveDamageReward[priority]; + g_esPlayer[survivor].g_flShoveRate = g_esTankCache[tank].g_flShoveRateReward[priority]; + g_esPlayer[survivor].g_flSwingRate = g_esTankCache[tank].g_flSwingRateReward[priority]; + g_esPlayer[survivor].g_iBurstDoors = g_esTankCache[tank].g_iBurstDoorsReward[priority]; + g_esPlayer[survivor].g_iFastRecovery = g_esTankCache[tank].g_iFastRecoveryReward[priority]; + g_esPlayer[survivor].g_iLadderActions = g_esTankCache[tank].g_iLadderActionsReward[priority]; + g_esPlayer[survivor].g_iShovePenalty = g_esTankCache[tank].g_iShovePenaltyReward[priority]; + } + else if ((g_esTankCache[tank].g_iStackRewards[priority] & type) && (g_esPlayer[survivor].g_iRewardTypes & type) && g_esTankCache[tank].g_iStackLimits[3] > 0 && g_esPlayer[survivor].g_iRewardStack[3] < g_esTankCache[tank].g_iStackLimits[3]) + { + g_esPlayer[survivor].g_flActionDuration -= g_esTankCache[tank].g_flActionDurationReward[priority] / 2.0; + g_esPlayer[survivor].g_flActionDuration = flClamp(g_esPlayer[survivor].g_flActionDuration, 0.0, 99999.0); + g_esPlayer[survivor].g_flAttackBoost += g_esTankCache[tank].g_flAttackBoostReward[priority]; + g_esPlayer[survivor].g_flAttackBoost = flClamp(g_esPlayer[survivor].g_flAttackBoost, 0.0, 99999.0); + g_esPlayer[survivor].g_flFireRate += g_esTankCache[tank].g_flFireRateReward[priority]; + g_esPlayer[survivor].g_flFireRate = flClamp(g_esPlayer[survivor].g_flFireRate, 0.0, 99999.0); + g_esPlayer[survivor].g_flRapidPistol -= g_esTankCache[tank].g_flRapidPistolReward[priority] / 2.0; + g_esPlayer[survivor].g_flRapidPistol = flClamp(g_esPlayer[survivor].g_flRapidPistol, 0.0, 1.0); + g_esPlayer[survivor].g_flReloadRate += g_esTankCache[tank].g_flReloadRateReward[priority]; + g_esPlayer[survivor].g_flReloadRate = flClamp(g_esPlayer[survivor].g_flReloadRate, 0.0, 99999.0); + g_esPlayer[survivor].g_flShoveDamage += g_esTankCache[tank].g_flShoveDamageReward[priority]; + g_esPlayer[survivor].g_flShoveDamage = flClamp(g_esPlayer[survivor].g_flShoveDamage, 0.0, 99999.0); + g_esPlayer[survivor].g_flShoveRate -= g_esTankCache[tank].g_flShoveRateReward[priority] / 2.0; + g_esPlayer[survivor].g_flShoveRate = flClamp(g_esPlayer[survivor].g_flShoveRate, 0.0, 99999.0); + g_esPlayer[survivor].g_flSwingRate += g_esTankCache[tank].g_flSwingRateReward[priority]; + g_esPlayer[survivor].g_flSwingRate = flClamp(g_esPlayer[survivor].g_flSwingRate, 0.0, 99999.0); + g_esPlayer[survivor].g_iBurstDoors = g_esTankCache[tank].g_iBurstDoorsReward[priority]; + g_esPlayer[survivor].g_iFastRecovery = g_esTankCache[tank].g_iFastRecoveryReward[priority]; + g_esPlayer[survivor].g_iLadderActions = g_esTankCache[tank].g_iLadderActionsReward[priority]; + g_esPlayer[survivor].g_iShovePenalty = g_esTankCache[tank].g_iShovePenaltyReward[priority]; + g_esPlayer[survivor].g_iRewardStack[3]++; + } + } + case MT_REWARD_AMMO: + { + if (!(g_esPlayer[survivor].g_iRewardTypes & type)) + { + g_esPlayer[survivor].g_flGrenadeLauncher = g_esTankCache[tank].g_flGrenadeLauncherReward[priority]; + g_esPlayer[survivor].g_flLuckyBullet = g_esTankCache[tank].g_flLuckyBulletReward[priority]; + g_esPlayer[survivor].g_flSupplier = g_esTankCache[tank].g_flSupplierReward[priority]; + g_esPlayer[survivor].g_flSupplierCooldown = -1.0; + g_esPlayer[survivor].g_iAmmoBoost = g_esTankCache[tank].g_iAmmoBoostReward[priority]; + g_esPlayer[survivor].g_iAmmoRefill = g_esTankCache[tank].g_iAmmoRefillReward[priority]; + g_esPlayer[survivor].g_iAmmoRegen = g_esTankCache[tank].g_iAmmoRegenReward[priority]; + g_esPlayer[survivor].g_iClusterBombs = g_esTankCache[tank].g_iClusterBombsReward[priority]; + g_esPlayer[survivor].g_iSpecialAmmo = g_esTankCache[tank].g_iSpecialAmmoReward[priority]; + } + else if ((g_esTankCache[tank].g_iStackRewards[priority] & type) && (g_esPlayer[survivor].g_iRewardTypes & type) && g_esTankCache[tank].g_iStackLimits[4] > 0 && g_esPlayer[survivor].g_iRewardStack[4] < g_esTankCache[tank].g_iStackLimits[4]) + { + g_esPlayer[survivor].g_flGrenadeLauncher -= g_esTankCache[tank].g_flGrenadeLauncherReward[priority]; + g_esPlayer[survivor].g_flGrenadeLauncher = flClamp(g_esPlayer[survivor].g_flGrenadeLauncher, 0.0, 100.0); + g_esPlayer[survivor].g_flLuckyBullet += g_esTankCache[tank].g_flLuckyBulletReward[priority]; + g_esPlayer[survivor].g_flLuckyBullet = flClamp(g_esPlayer[survivor].g_flLuckyBullet, 0.0, 100.0); + g_esPlayer[survivor].g_flSupplier += g_esTankCache[tank].g_flSupplierReward[priority]; + g_esPlayer[survivor].g_flSupplier = flClamp(g_esPlayer[survivor].g_flSupplier, 0.0, 99999.0); + g_esPlayer[survivor].g_iAmmoBoost = g_esTankCache[tank].g_iAmmoBoostReward[priority]; + g_esPlayer[survivor].g_iAmmoRefill = g_esTankCache[tank].g_iAmmoRefillReward[priority]; + g_esPlayer[survivor].g_iAmmoRegen += g_esTankCache[tank].g_iAmmoRegenReward[priority]; + g_esPlayer[survivor].g_iAmmoRegen = iClamp(g_esPlayer[survivor].g_iAmmoRegen, 0, 99999); + g_esPlayer[survivor].g_iClusterBombs += g_esTankCache[tank].g_iClusterBombsReward[priority]; + g_esPlayer[survivor].g_iClusterBombs = iClamp(g_esPlayer[survivor].g_iClusterBombs, 0, 5); + g_esPlayer[survivor].g_iSpecialAmmo |= g_esTankCache[tank].g_iSpecialAmmoReward[priority]; + g_esPlayer[survivor].g_iSpecialAmmo = iClamp(g_esPlayer[survivor].g_iSpecialAmmo, 0, 3); + g_esPlayer[survivor].g_iRewardStack[4]++; + } + } + case MT_REWARD_GODMODE: + { + if (!(g_esPlayer[survivor].g_iRewardTypes & type)) + { + g_esPlayer[survivor].g_flPunchResistance = g_esTankCache[tank].g_flPunchResistanceReward[priority]; + g_esPlayer[survivor].g_iCleanKills = g_esTankCache[tank].g_iCleanKillsReward[priority]; + g_esPlayer[survivor].g_iRiotGear = g_esTankCache[tank].g_iRiotGearReward[priority]; + g_esPlayer[survivor].g_iSafetyBubble = g_esTankCache[tank].g_iSafetyBubbleReward[priority]; + } + else if ((g_esTankCache[tank].g_iStackRewards[priority] & type) && (g_esPlayer[survivor].g_iRewardTypes & type) && g_esTankCache[tank].g_iStackLimits[5] > 0 && g_esPlayer[survivor].g_iRewardStack[5] < g_esTankCache[tank].g_iStackLimits[5]) + { + g_esPlayer[survivor].g_flPunchResistance -= g_esTankCache[tank].g_flPunchResistanceReward[priority] / 2.0; + g_esPlayer[survivor].g_flPunchResistance = flClamp(g_esPlayer[survivor].g_flPunchResistance, 0.0, 1.0); + g_esPlayer[survivor].g_iCleanKills = g_esTankCache[tank].g_iCleanKillsReward[priority]; + g_esPlayer[survivor].g_iRiotGear = g_esTankCache[tank].g_iRiotGearReward[priority]; + g_esPlayer[survivor].g_iSafetyBubble = g_esTankCache[tank].g_iSafetyBubbleReward[priority]; + g_esPlayer[survivor].g_iRewardStack[5]++; + } + } + case MT_REWARD_REFILL: + { + if (!(g_esPlayer[survivor].g_iRewardTypes & type)) + { + g_esPlayer[survivor].g_flRefillPercent = g_esTankCache[tank].g_flRefillPercentReward[priority]; + g_esPlayer[survivor].g_iAmmoRefill = g_esTankCache[tank].g_iAmmoRefillReward[priority]; + } + else if ((g_esTankCache[tank].g_iStackRewards[priority] & type) && (g_esPlayer[survivor].g_iRewardTypes & type) && g_esTankCache[tank].g_iStackLimits[6] > 0 && g_esPlayer[survivor].g_iRewardStack[6] < g_esTankCache[tank].g_iStackLimits[6]) + { + g_esPlayer[survivor].g_flRefillPercent += g_esTankCache[tank].g_flRefillPercentReward[priority] / 2.0; + g_esPlayer[survivor].g_flRefillPercent = flClamp(g_esPlayer[survivor].g_flRefillPercent, 0.0, 100.0); + g_esPlayer[survivor].g_iAmmoRefill = g_esTankCache[tank].g_iAmmoRefillReward[priority]; + } + } + case MT_REWARD_INFAMMO: + { + if (!(g_esPlayer[survivor].g_iRewardTypes & type)) + { + g_esPlayer[survivor].g_iInfiniteAmmo = g_esTankCache[tank].g_iInfiniteAmmoReward[priority]; + } + else if ((g_esTankCache[tank].g_iStackRewards[priority] & type) && (g_esPlayer[survivor].g_iRewardTypes & type) && g_esTankCache[tank].g_iStackLimits[7] > 0 && g_esPlayer[survivor].g_iRewardStack[7] < g_esTankCache[tank].g_iStackLimits[7]) + { + g_esPlayer[survivor].g_iInfiniteAmmo |= g_esTankCache[tank].g_iInfiniteAmmoReward[priority]; + g_esPlayer[survivor].g_iInfiniteAmmo = iClamp(g_esPlayer[survivor].g_iInfiniteAmmo, 0, 31); + g_esPlayer[survivor].g_iRewardStack[7]++; + } + } + } +} + +void vSetupRewardDuration(int survivor, int pos, float time, float current, float duration) +{ + if (g_esPlayer[survivor].g_flRewardTime[pos] == -1.0 || (time > (g_esPlayer[survivor].g_flRewardTime[pos] - current))) + { + g_esPlayer[survivor].g_flRewardTime[pos] = duration; + } +} + +void vSetupRewardDurations(int survivor, int recipient, int pos, int limit, float time, float time2, float current, float duration, float duration2) +{ + vSetupRewardDuration(survivor, pos, time, current, duration); + + if (g_esPlayer[survivor].g_iRewardStack[pos] >= limit && survivor != recipient) + { + vSetupRewardDuration(recipient, pos, time2, current, duration2); + } +} + +void vSetupSpeedBoostReward(int survivor, int tank, int priority) +{ + SDKHook(survivor, SDKHook_PreThinkPost, OnSpeedPreThinkPost); + + bool bDeveloper = bIsDeveloper(survivor, 5); + float flDuration = (bDeveloper && g_esDeveloper[survivor].g_flDevAdrenalineTime > g_esPlayer[survivor].g_flAdrenalineTime) ? g_esDeveloper[survivor].g_flDevAdrenalineTime : g_esPlayer[survivor].g_flAdrenalineTime; + if ((!bDeveloper || flGetAdrenalineTime(survivor) > 0.0) && flDuration > 0.0) + { + vSetAdrenalineTime(survivor, flDuration); + } + + switch (priority) + { + case 0: strcopy(g_esPlayer[survivor].g_sFallVoiceline, sizeof esPlayer::g_sFallVoiceline, g_esTankCache[tank].g_sFallVoicelineReward); + case 1: strcopy(g_esPlayer[survivor].g_sFallVoiceline, sizeof esPlayer::g_sFallVoiceline, g_esTankCache[tank].g_sFallVoicelineReward2); + case 2: strcopy(g_esPlayer[survivor].g_sFallVoiceline, sizeof esPlayer::g_sFallVoiceline, g_esTankCache[tank].g_sFallVoicelineReward3); + case 3: strcopy(g_esPlayer[survivor].g_sFallVoiceline, sizeof esPlayer::g_sFallVoiceline, g_esTankCache[tank].g_sFallVoicelineReward4); + } +} + +void vSetupVisual(int survivor, int recipient, int tank, int priority, int count, bool dev, float time, float current, float duration) +{ + if ((g_esGeneral.g_iGraphicsLevel <= 0 && g_esGeneral.g_cvMTGraphicsLevel.IntValue <= 0) || (survivor != recipient && (g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_REFILL) && count == 1)) + { + return; + } + + int iVisual = g_esTankCache[tank].g_iRewardVisual[priority]; + if (iVisual > 0) + { +#if defined _clientprefs_included + switch (g_esPlayer[survivor].g_iPrefsAccess) + { + case 0: vDefaultCookieSettings(survivor); + case 1: + { + if (AreClientCookiesCached(survivor)) + { + OnClientCookiesTankCached(survivor); + } + } + } +#else + vDefaultCookieSettings(survivor); +#endif + bool bIgnore = bIsDeveloper(survivor, 1); + if ((dev || (iVisual & MT_VISUAL_SCREEN)) && (g_esGeneral.g_iGraphicsLevel > 0 || g_esGeneral.g_cvMTGraphicsLevel.IntValue > 0)) + { + if (g_esPlayer[survivor].g_flVisualTime[0] == -1.0 || (time > (g_esPlayer[survivor].g_flVisualTime[0] - current))) + { + switch (priority) + { + case 0: strcopy(g_esPlayer[survivor].g_sScreenColor, sizeof esPlayer::g_sScreenColor, g_esTankCache[tank].g_sScreenColorVisual); + case 1: strcopy(g_esPlayer[survivor].g_sScreenColor, sizeof esPlayer::g_sScreenColor, g_esTankCache[tank].g_sScreenColorVisual2); + case 2: strcopy(g_esPlayer[survivor].g_sScreenColor, sizeof esPlayer::g_sScreenColor, g_esTankCache[tank].g_sScreenColorVisual3); + case 3: strcopy(g_esPlayer[survivor].g_sScreenColor, sizeof esPlayer::g_sScreenColor, g_esTankCache[tank].g_sScreenColorVisual4); + } + + char sDelimiter[2]; + sDelimiter = (FindCharInString(g_esPlayer[survivor].g_sScreenColor, ';') != -1) ? ";" : ","; + vSetSurvivorScreen(survivor, g_esPlayer[survivor].g_sScreenColor, sDelimiter); + + if (g_esPlayer[survivor].g_flVisualTime[0] == -1.0) + { + CreateTimer(2.0, tTimerScreenEffect, GetClientUserId(survivor), TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); + } + + if (time > (g_esPlayer[survivor].g_flVisualTime[0] - current)) + { + g_esPlayer[survivor].g_flVisualTime[0] = duration; + } + } + } + + if (dev || (iVisual & MT_VISUAL_PARTICLE) && (g_esGeneral.g_iGraphicsLevel > 2 || g_esGeneral.g_cvMTGraphicsLevel.IntValue > 2)) + { + if (g_esPlayer[survivor].g_flVisualTime[1] == -1.0 || (time > (g_esPlayer[survivor].g_flVisualTime[1] - current))) + { + int iEffect = g_esTankCache[tank].g_iParticleEffectVisual[priority]; + if (iEffect > 0 && g_esPlayer[survivor].g_iParticleEffect != iEffect) + { + g_esPlayer[survivor].g_iParticleEffect = iEffect; + } + + if (g_esPlayer[survivor].g_flVisualTime[1] == -1.0) + { + CreateTimer(0.75, tTimerParticleVisual, GetClientUserId(survivor), TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); + } + + if (time > (g_esPlayer[survivor].g_flVisualTime[1] - current)) + { + g_esPlayer[survivor].g_flVisualTime[1] = duration; + } + } + } + + if (dev || (iVisual & MT_VISUAL_VOICELINE)) + { + if (g_esPlayer[survivor].g_flVisualTime[2] == -1.0 || (time > (g_esPlayer[survivor].g_flVisualTime[2] - current))) + { + switch (priority) + { + case 0: strcopy(g_esPlayer[survivor].g_sLoopingVoiceline, sizeof esPlayer::g_sLoopingVoiceline, g_esTankCache[tank].g_sLoopingVoicelineVisual); + case 1: strcopy(g_esPlayer[survivor].g_sLoopingVoiceline, sizeof esPlayer::g_sLoopingVoiceline, g_esTankCache[tank].g_sLoopingVoicelineVisual2); + case 2: strcopy(g_esPlayer[survivor].g_sLoopingVoiceline, sizeof esPlayer::g_sLoopingVoiceline, g_esTankCache[tank].g_sLoopingVoicelineVisual3); + case 3: strcopy(g_esPlayer[survivor].g_sLoopingVoiceline, sizeof esPlayer::g_sLoopingVoiceline, g_esTankCache[tank].g_sLoopingVoicelineVisual4); + } + + if (g_esPlayer[survivor].g_flVisualTime[2] == -1.0) + { + CreateTimer(g_esTankCache[tank].g_flLoopingVoicelineInterval[priority], tTimerLoopVoiceline, GetClientUserId(survivor), TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); + } + + if (time > (g_esPlayer[survivor].g_flVisualTime[2] - current)) + { + g_esPlayer[survivor].g_flVisualTime[2] = duration; + } + } + } + + if (dev || (iVisual & MT_VISUAL_VOICEPITCH)) + { + if (g_esPlayer[survivor].g_flVisualTime[3] == -1.0 || (time > (g_esPlayer[survivor].g_flVisualTime[3] - current))) + { + int iPitch = g_esTankCache[tank].g_iVoicePitchVisual[priority]; + if (iPitch > 0 && g_esPlayer[survivor].g_iVoicePitch != iPitch) + { + g_esPlayer[survivor].g_iVoicePitch = iPitch; + } + + if (time > (g_esPlayer[survivor].g_flVisualTime[3] - current)) + { + g_esPlayer[survivor].g_flVisualTime[3] = duration; + } + } + } + + if (dev || (iVisual & MT_VISUAL_LIGHT) && (g_esGeneral.g_iGraphicsLevel > 1 || g_esGeneral.g_cvMTGraphicsLevel.IntValue > 1)) + { + if (g_esPlayer[survivor].g_flVisualTime[4] == -1.0 || (time > (g_esPlayer[survivor].g_flVisualTime[4] - current))) + { + switch (priority) + { + case 0: strcopy(g_esPlayer[survivor].g_sLightColor, sizeof esPlayer::g_sLightColor, g_esTankCache[tank].g_sLightColorVisual); + case 1: strcopy(g_esPlayer[survivor].g_sLightColor, sizeof esPlayer::g_sLightColor, g_esTankCache[tank].g_sLightColorVisual2); + case 2: strcopy(g_esPlayer[survivor].g_sLightColor, sizeof esPlayer::g_sLightColor, g_esTankCache[tank].g_sLightColorVisual3); + case 3: strcopy(g_esPlayer[survivor].g_sLightColor, sizeof esPlayer::g_sLightColor, g_esTankCache[tank].g_sLightColorVisual4); + } + + if (!bIgnore || g_esDeveloper[survivor].g_sDevFlashlight[0] == '\0') + { + char sDelimiter[2]; + sDelimiter = (FindCharInString(g_esPlayer[survivor].g_sLightColor, ';') != -1) ? ";" : ","; + vSetSurvivorLight(survivor, g_esPlayer[survivor].g_sLightColor, g_esPlayer[survivor].g_bApplyVisuals[4], sDelimiter, true); + } + + if (time > (g_esPlayer[survivor].g_flVisualTime[4] - current)) + { + g_esPlayer[survivor].g_flVisualTime[4] = duration; + } + } + } + + if (dev || (iVisual & MT_VISUAL_BODY) && (g_esGeneral.g_iGraphicsLevel > 0 || g_esGeneral.g_cvMTGraphicsLevel.IntValue > 0)) + { + if (g_esPlayer[survivor].g_flVisualTime[5] == -1.0 || (time > (g_esPlayer[survivor].g_flVisualTime[5] - current))) + { + switch (priority) + { + case 0: strcopy(g_esPlayer[survivor].g_sBodyColor, sizeof esPlayer::g_sBodyColor, g_esTankCache[tank].g_sBodyColorVisual); + case 1: strcopy(g_esPlayer[survivor].g_sBodyColor, sizeof esPlayer::g_sBodyColor, g_esTankCache[tank].g_sBodyColorVisual2); + case 2: strcopy(g_esPlayer[survivor].g_sBodyColor, sizeof esPlayer::g_sBodyColor, g_esTankCache[tank].g_sBodyColorVisual3); + case 3: strcopy(g_esPlayer[survivor].g_sBodyColor, sizeof esPlayer::g_sBodyColor, g_esTankCache[tank].g_sBodyColorVisual4); + } + + if (!bIgnore || g_esDeveloper[survivor].g_sDevSkinColor[0] == '\0') + { + char sDelimiter[2]; + sDelimiter = (FindCharInString(g_esPlayer[survivor].g_sBodyColor, ';') != -1) ? ";" : ","; + vSetSurvivorColor(survivor, g_esPlayer[survivor].g_sBodyColor, g_esPlayer[survivor].g_bApplyVisuals[5], sDelimiter, true); + } + + if (time > (g_esPlayer[survivor].g_flVisualTime[5] - current)) + { + g_esPlayer[survivor].g_flVisualTime[5] = duration; + } + } + } + + if (g_bSecondGame && (dev || (iVisual & MT_VISUAL_GLOW)) && (g_esGeneral.g_iGraphicsLevel > 1 || g_esGeneral.g_cvMTGraphicsLevel.IntValue > 1)) + { + if (g_esPlayer[survivor].g_flVisualTime[6] == -1.0 || (time > (g_esPlayer[survivor].g_flVisualTime[6] - current))) + { + switch (priority) + { + case 0: strcopy(g_esPlayer[survivor].g_sOutlineColor, sizeof esPlayer::g_sOutlineColor, g_esTankCache[tank].g_sOutlineColorVisual); + case 1: strcopy(g_esPlayer[survivor].g_sOutlineColor, sizeof esPlayer::g_sOutlineColor, g_esTankCache[tank].g_sOutlineColorVisual2); + case 2: strcopy(g_esPlayer[survivor].g_sOutlineColor, sizeof esPlayer::g_sOutlineColor, g_esTankCache[tank].g_sOutlineColorVisual3); + case 3: strcopy(g_esPlayer[survivor].g_sOutlineColor, sizeof esPlayer::g_sOutlineColor, g_esTankCache[tank].g_sOutlineColorVisual4); + } + + if (!bIgnore || g_esDeveloper[survivor].g_sDevGlowOutline[0] == '\0') + { + char sDelimiter[2]; + sDelimiter = (FindCharInString(g_esPlayer[survivor].g_sOutlineColor, ';') != -1) ? ";" : ","; + vSetSurvivorOutline(survivor, g_esPlayer[survivor].g_sOutlineColor, g_esPlayer[survivor].g_bApplyVisuals[6], sDelimiter, true); + } + + if (time > (g_esPlayer[survivor].g_flVisualTime[6] - current)) + { + g_esPlayer[survivor].g_flVisualTime[6] = duration; + } + } + } + + if (g_esPlayer[survivor].g_iPrefsAccess == 1) + { + MT_PrintToChat(survivor, "%s %t", MT_TAG2, "MTPrefsInfo"); + } + } + + int iEffect = g_esTankCache[tank].g_iRewardEffect[priority]; + if (iEffect > 0) + { + if ((dev || (iEffect & MT_EFFECT_TROPHY)) && g_esPlayer[survivor].g_iEffect[0] == INVALID_ENT_REFERENCE) + { + g_esPlayer[survivor].g_iEffect[0] = EntIndexToEntRef(iCreateParticle(survivor, PARTICLE_ACHIEVED, view_as({0.0, 0.0, 50.0}), NULL_VECTOR, 1.5, 1.5)); + } + + if ((dev || (iEffect & MT_EFFECT_FIREWORKS)) && g_esPlayer[survivor].g_iEffect[1] == INVALID_ENT_REFERENCE) + { + g_esPlayer[survivor].g_iEffect[1] = EntIndexToEntRef(iCreateParticle(survivor, PARTICLE_FIREWORK, view_as({0.0, 0.0, 50.0}), NULL_VECTOR, 2.0, 1.5)); + } + + if (dev || (iEffect & MT_EFFECT_SOUND)) + { + EmitSoundToAll(SOUND_ACHIEVEMENT, survivor, SNDCHAN_AUTO, SNDLEVEL_NORMAL, SND_NOFLAGS, SNDVOL_NORMAL, SNDPITCH_NORMAL, -1, NULL_VECTOR, NULL_VECTOR, true, 0.0); + } + + if (dev || (iEffect & MT_EFFECT_THIRDPERSON)) + { + vExternalView(survivor, 1.5); + } + } +} + +/** + * Infected functions + **/ + +void vInfectedSpawn(int infected) +{ + DataPack dpInfectedSpawn = new DataPack(); + dpInfectedSpawn.WriteCell(EntIndexToEntRef(infected)); + RequestFrame(vInfectedSpawnFrame, dpInfectedSpawn); +} + +void vInfectedSpawnFrame(DataPack pack) +{ + pack.Reset(); + int iInfected = EntRefToEntIndex(pack.ReadCell()); + delete pack; + + vCacheInfectedSettings(iInfected); + + if (bIsMobSupported(iInfected)) + { + if (g_esGeneral.g_iGraphicsLevel > 1 || g_esGeneral.g_cvMTGraphicsLevel.IntValue > 1) + { + switch (StrEqual(g_esInfectedCache[iInfected].g_sGlowColor, "rainbow", false) && (g_esGeneral.g_iGraphicsLevel > 2 || g_esGeneral.g_cvMTGraphicsLevel.IntValue > 2)) + { + case true: + { + if (!g_esInfected[iInfected].g_bRainbowColor) + { + g_esInfected[iInfected].g_bRainbowColor = SDKHookEx(iInfected, SDKHook_PreThinkPost, OnInfectedRainbowPreThinkPost); + } + } + case false: vSetInfectedGlow(iInfected); + } + } + + vSetupInfectedParticleEffects(iInfected); + } +} + +void vMutateInfected(int infected, int type = 0) +{ + if (bCanTypeSpawn(.specType = 8)) + { + bool bCommon = bIsCommonInfected(infected), bWitch = bIsWitch(infected), bVersus = bIsCompetitiveModeRound(2); + int iType = 0; + if (type == 0 && g_esInfected[infected].g_iTankType <= 0) + { + if (bWitch) + { + if (bVersus) + { + iType = g_esGeneral.g_alCompTypes[1].Get(0); + g_esGeneral.g_alCompTypes[1].Erase(0); + + vSetInfectedColor(infected, iType); + } + else + { + switch (g_esGeneral.g_bFinalMap) + { + case true: iType = (g_esGeneral.g_iFinaleMode == 1) ? iChooseMutantInfected(infected, g_esGeneral.g_iFinaleMinTypes[g_esGeneral.g_iTankWave], g_esGeneral.g_iFinaleMaxTypes[g_esGeneral.g_iTankWave]) : iChooseMutantInfected(infected); + case false: iType = (g_esGeneral.g_iRegularMode == 1 && g_esGeneral.g_iRegularWave == 1) ? iChooseMutantInfected(infected, g_esGeneral.g_iRegularMinType, g_esGeneral.g_iRegularMaxType) : iChooseMutantInfected(infected); + } + } + } + else if (bCommon) + { + iChooseMutantInfected(infected); + } + } + else if (type != -1) + { + if (bWitch) + { + switch (bVersus) + { + case true: + { + iType = g_esGeneral.g_alCompTypes[1].Get(0); + g_esGeneral.g_alCompTypes[1].Erase(0); + + vSetInfectedColor(infected, iType); + } + case false: + { + iType = (type > 0) ? type : g_esInfected[infected].g_iTankType; + + vSetInfectedColor(infected, iType, true); + } + } + } + else if (bCommon) + { + iType = (type > 0) ? type : g_esInfected[infected].g_iTankType; + + vSetInfectedColor(infected, iType); + } + } + + switch (g_esInfected[infected].g_iTankType > 0) + { + case true: vInfectedSpawn(infected); + case false: vCacheInfectedSettings(infected); + } + } +} + +void vMutateWitch(int witch, int flag) +{ + int iOwner = GetEntPropEnt(witch, Prop_Data, "m_hOwnerEntity"); + if (bIsValidClient(iOwner) && g_esInfectedCache[witch].g_iWitchMode == 0) + { + return; + } + + float flRange = g_esInfectedCache[witch].g_flWitchRange; + int iTypes = g_esInfectedCache[witch].g_iWitchTypes; + if (flRange > 0.0 && (iTypes == 0 || (iTypes & flag)) && GetRandomFloat(0.1, 100.0) <= g_esInfectedCache[witch].g_flWitchMutateChance) + { + int iFilter = g_esInfectedCache[witch].g_iWitchFilter; + if (iFilter >= 0) + { + bool bShow = false; + float flWitchPos[3], flTargetPos[3]; + GetEntPropVector(witch, Prop_Data, "m_vecOrigin", flWitchPos); + for (int iPlayer = 1; iPlayer <= MaxClients; iPlayer++) + { + if (bIsValidClient(iPlayer, MT_CHECK_INGAME|MT_CHECK_ALIVE)) + { + GetClientAbsOrigin(iPlayer, flTargetPos); + if (GetVectorDistance(flWitchPos, flTargetPos) <= flRange) + { + switch (bIsSurvivor(iPlayer, MT_CHECK_INGAME|MT_CHECK_ALIVE) && (iFilter == 0 || (iFilter & MT_WITCHFILTER_SURVIVORS))) + { + case true: SDKHooks_TakeDamage(iPlayer, witch, witch, 1.0, DMG_SLASH); + case false: + { + if ((bIsSmoker(iPlayer, MT_CHECK_INGAME|MT_CHECK_ALIVE) && (iFilter & MT_WITCHFILTER_SMOKER)) || (bIsBoomer(iPlayer, MT_CHECK_INGAME|MT_CHECK_ALIVE) && (iFilter & MT_WITCHFILTER_BOOMER)) || (bIsHunter(iPlayer, MT_CHECK_INGAME|MT_CHECK_ALIVE) && (iFilter & MT_WITCHFILTER_HUNTER)) + || (bIsSpitter(iPlayer, MT_CHECK_INGAME|MT_CHECK_ALIVE) && (iFilter & MT_WITCHFILTER_SPITTER)) || (bIsJockey(iPlayer, MT_CHECK_INGAME|MT_CHECK_ALIVE) && (iFilter & MT_WITCHFILTER_JOCKEY)) || (bIsCharger(iPlayer, MT_CHECK_INGAME|MT_CHECK_ALIVE) && (iFilter & MT_WITCHFILTER_CHARGER)) + || (bIsTank(iPlayer, MT_CHECK_INGAME|MT_CHECK_ALIVE) && (iFilter & MT_WITCHFILTER_TANK)) || (bIsInfected(iPlayer, MT_CHECK_INGAME|MT_CHECK_ALIVE) && iFilter == 0)) + { + bShow = true; + + vMutateTank(iPlayer, g_esPlayer[iPlayer].g_iInfectedType, g_esInfected[witch].g_iTankType, false); + } + } + } + } + } + } + + if (iFilter == 0 || (iFilter & MT_WITCHFILTER_COMMON)) + { + int iCommon = (MaxClients + 1); + while ((iCommon = FindEntityByClassname(iCommon, "infected")) != INVALID_ENT_REFERENCE) + { + GetEntPropVector(iCommon, Prop_Data, "m_vecOrigin", flTargetPos); + if (bIsValidEntity(iCommon) && GetVectorDistance(flWitchPos, flTargetPos) <= flRange) + { + bShow = true; + + vMutateInfected(iCommon, g_esInfected[witch].g_iTankType); + } + } + } + + if (bShow) + { + bool bRainbow[2] = {false, false}; + bRainbow[0] = StrEqual(g_esInfectedCache[witch].g_sSkinColor, "rainbow", false); + bRainbow[1] = StrEqual(g_esInfectedCache[witch].g_sGlowColor, "rainbow", false); + + int iColor[4] = {0, 0, 0, 50}, iType = MT_GetRandomInt(1, 2); + for (int iPos = 0; iPos < ((sizeof iColor) - 1); iPos++) + { + switch (iType) + { + case 1: iColor[iPos] = (bRainbow[iType - 1] ? -2 : iGetRandomColor(g_esInfectedCache[witch].g_iSkinColor[iPos])); + case 2: iColor[iPos] = (bRainbow[iType - 1] ? -2 : iGetRandomColor(g_esInfectedCache[witch].g_iGlowColor[iPos])); + } + } + + flWitchPos[2] += 20.0; + TE_SetupBeamRingPoint(flWitchPos, 10.0, (flRange * 2.0), g_iBossBeamSprite, g_iBossHaloSprite, 0, 50, (flRange / 500.0), 88.0, 3.0, iColor, 1500, 0); + TE_SendToAll(); + } + } + } +} + +void vRemoveInfectedGlow(int entity) +{ + if (!g_bSecondGame || !bIsValidEntity(entity)) + { + return; + } + + SetEntProp(entity, Prop_Send, "m_glowColorOverride", 0); + SetEntProp(entity, Prop_Send, "m_bFlashing", 0); + SetEntProp(entity, Prop_Send, "m_iGlowType", 0); +} + +void vResetInfected(int infected) +{ + g_esInfected[infected].g_bBlood = false; + g_esInfected[infected].g_bElectric = false; + g_esInfected[infected].g_bFire = false; + g_esInfected[infected].g_bIce = false; + g_esInfected[infected].g_bMeteor = false; + g_esInfected[infected].g_bRainbowColor = false; + g_esInfected[infected].g_bSmoke = false; + g_esInfected[infected].g_bSpit = false; + g_esInfected[infected].g_iDamageTaken = 0; + g_esInfected[infected].g_iTankType = 0; +} + +void vSetInfectedColor(int infected, int type = 0, bool store = false) +{ + if (type == -1) + { + return; + } + + if (store && bIsCompetitiveModeRound(1)) + { + g_esGeneral.g_alCompTypes[1].Push(type); + } + + g_esInfected[infected].g_iTankType = type; + + vCacheInfectedSettings(infected); + vRemoveInfectedGlow(infected); + vSetInfectedRainbowColor(infected); +} + +void vSetInfectedGlow(int infected) +{ + if (!g_bSecondGame || g_esInfectedCache[infected].g_iGlowEnabled <= 1 || (g_esGeneral.g_iGraphicsLevel <= 1 && g_esGeneral.g_cvMTGraphicsLevel.IntValue <= 1)) + { + return; + } + + SetEntProp(infected, Prop_Send, "m_glowColorOverride", iGetRGBColor(iGetRandomColor(g_esInfectedCache[infected].g_iGlowColor[0]), iGetRandomColor(g_esInfectedCache[infected].g_iGlowColor[1]), iGetRandomColor(g_esInfectedCache[infected].g_iGlowColor[2]))); + SetEntProp(infected, Prop_Send, "m_bFlashing", g_esInfectedCache[infected].g_iGlowFlashing); + SetEntProp(infected, Prop_Send, "m_nGlowRangeMin", g_esInfectedCache[infected].g_iGlowMinRange); + SetEntProp(infected, Prop_Send, "m_nGlowRange", g_esInfectedCache[infected].g_iGlowMaxRange); + SetEntProp(infected, Prop_Send, "m_iGlowType", ((g_esInfectedCache[infected].g_iGlowType <= 0) ? 2 : 3)); +} + +void vSetInfectedRainbowColor(int infected) +{ + if ((g_bSecondGame && bIsCommonInfected(infected)) || (g_esGeneral.g_iGraphicsLevel <= 0 && g_esGeneral.g_cvMTGraphicsLevel.IntValue <= 0)) + { + return; + } + + switch (StrEqual(g_esInfectedCache[infected].g_sSkinColor, "rainbow", false) && (g_esGeneral.g_iGraphicsLevel > 2 || g_esGeneral.g_cvMTGraphicsLevel.IntValue > 2)) + { + case true: + { + if (!g_esInfected[infected].g_bRainbowColor) + { + g_esInfected[infected].g_bRainbowColor = SDKHookEx(infected, SDKHook_PreThinkPost, OnInfectedRainbowPreThinkPost); + } + } + case false: + { + SetEntityRenderMode(infected, RENDER_NORMAL); + SetEntityRenderColor(infected, iGetRandomColor(g_esInfectedCache[infected].g_iSkinColor[0]), iGetRandomColor(g_esInfectedCache[infected].g_iSkinColor[1]), iGetRandomColor(g_esInfectedCache[infected].g_iSkinColor[2]), iGetRandomColor(g_esInfectedCache[infected].g_iSkinColor[3])); + } + } +} + +void vSetupInfectedParticleEffects(int infected) +{ + if (bIsMobSupported(infected) && g_esInfectedCache[infected].g_iBodyEffects > 0 && (g_esGeneral.g_iGraphicsLevel > 2 || g_esGeneral.g_cvMTGraphicsLevel.IntValue > 2)) + { + if ((g_esInfectedCache[infected].g_iBodyEffects & MT_PARTICLE_BLOOD) && GetRandomFloat(0.1, 100.0) <= g_esInfectedCache[infected].g_flBodyChance[0] && !g_esInfected[infected].g_bBlood) + { + g_esInfected[infected].g_bBlood = true; + + CreateTimer(0.75, tTimerBloodEffect2, EntIndexToEntRef(infected), TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); + } + + if ((g_esInfectedCache[infected].g_iBodyEffects & MT_PARTICLE_ELECTRICITY) && GetRandomFloat(0.1, 100.0) <= g_esInfectedCache[infected].g_flBodyChance[1] && !g_esInfected[infected].g_bElectric) + { + g_esInfected[infected].g_bElectric = true; + + CreateTimer(0.75, tTimerElectricEffect2, EntIndexToEntRef(infected), TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); + } + + if ((g_esInfectedCache[infected].g_iBodyEffects & MT_PARTICLE_FIRE) && GetRandomFloat(0.1, 100.0) <= g_esInfectedCache[infected].g_flBodyChance[2] && !g_esInfected[infected].g_bFire) + { + g_esInfected[infected].g_bFire = true; + + CreateTimer(0.75, tTimerFireEffect2, EntIndexToEntRef(infected), TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); + } + + if ((g_esInfectedCache[infected].g_iBodyEffects & MT_PARTICLE_ICE) && GetRandomFloat(0.1, 100.0) <= g_esInfectedCache[infected].g_flBodyChance[3] && !g_esInfected[infected].g_bIce) + { + g_esInfected[infected].g_bIce = true; + + CreateTimer(2.0, tTimerIceEffect2, EntIndexToEntRef(infected), TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); + } + + if ((g_esInfectedCache[infected].g_iBodyEffects & MT_PARTICLE_METEOR) && GetRandomFloat(0.1, 100.0) <= g_esInfectedCache[infected].g_flBodyChance[4] && !g_esInfected[infected].g_bMeteor) + { + g_esInfected[infected].g_bMeteor = true; + + CreateTimer(6.0, tTimerMeteorEffect2, EntIndexToEntRef(infected), TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); + } + + if ((g_esInfectedCache[infected].g_iBodyEffects & MT_PARTICLE_SMOKE) && GetRandomFloat(0.1, 100.0) <= g_esInfectedCache[infected].g_flBodyChance[5] && !g_esInfected[infected].g_bSmoke) + { + g_esInfected[infected].g_bSmoke = true; + + CreateTimer(1.5, tTimerSmokeEffect2, EntIndexToEntRef(infected), TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); + } + + if (g_bSecondGame && (g_esInfectedCache[infected].g_iBodyEffects & MT_PARTICLE_SPIT) && GetRandomFloat(0.1, 100.0) <= g_esInfectedCache[infected].g_flBodyChance[6] && !g_esInfected[infected].g_bSpit) + { + g_esInfected[infected].g_bSpit = true; + + CreateTimer(2.0, tTimerSpitEffect2, EntIndexToEntRef(infected), TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); + } + } +} + +/** + * Player functions + **/ + +void vRemovePlayerDamage(int victim, int damagetype) +{ + if (damagetype & DMG_BURN) + { + ExtinguishEntity(victim); + } + + vSetWounds(victim); +} + +void vRemovePlayerGlow(int player) +{ + if (!g_bSecondGame || !bIsValidClient(player)) + { + return; + } + + SetEntProp(player, Prop_Send, "m_glowColorOverride", 0); + SetEntProp(player, Prop_Send, "m_bFlashing", 0); + SetEntProp(player, Prop_Send, "m_iGlowType", 0); +} + +void vResetPlayerStatus(int player) +{ + vResetTank(player); + vResetTank2(player); + vResetCore(player); + vRemoveSurvivorEffects(player); + vCacheTankSettings(player); + vCacheSurvivorSettings(player); +} + +void vResetTankDamage(int tank) +{ + for (int iSurvivor = 1; iSurvivor <= MaxClients; iSurvivor++) + { + g_esPlayer[iSurvivor].g_iTankDamage[tank] = 0; + } +} + +void vRestorePlayerGlow(int client) +{ + if (bIsInfected(client) && !bIsPlayerIncapacitated(client)) + { + vSetTankGlow(client); + } + else if (bIsSurvivor(client) && g_bSecondGame) + { + switch (bIsDeveloper(client, 1)) + { + case true: vSetSurvivorOutline(client, g_esDeveloper[client].g_sDevGlowOutline, .delimiter = ","); + case false: vToggleSurvivorEffects(client, .type = 6); + } + } +} + +/** + * Survivor functions + **/ + +void vAddSurvivorHealth(int survivor) +{ + float flPercentage = (g_esPlayer[survivor].g_flRefillPercent / 100.0); + if (flPercentage > 0.0) + { + int iHealth = GetEntProp(survivor, Prop_Data, "m_iHealth"), iMaxHealth = GetEntProp(survivor, Prop_Data, "m_iMaxHealth"), + iExtraHealth = RoundToNearest(iMaxHealth * flPercentage), iFinalHealth = iClamp((iHealth + iExtraHealth), 0, iMaxHealth); + + vCheatCommand(survivor, "give", "health"); + SetEntProp(survivor, Prop_Data, "m_iHealth", iFinalHealth); + } +} + +void vCheckGunClipSizes(int survivor) +{ + if (g_esGeneral.g_hSDKGetMaxClip1 != null) + { + int iSlot = GetPlayerWeaponSlot(survivor, 0); + if (iSlot > MaxClients) + { + g_esPlayer[survivor].g_iMaxClip[0] = SDKCall(g_esGeneral.g_hSDKGetMaxClip1, iSlot); + } + + iSlot = GetPlayerWeaponSlot(survivor, 1); + if (iSlot > MaxClients) + { + char sWeapon[32]; + GetEntityClassname(iSlot, sWeapon, sizeof sWeapon); + if (!strncmp(sWeapon[7], "pistol", 6) || StrEqual(sWeapon[7], "chainsaw")) + { + g_esPlayer[survivor].g_iMaxClip[1] = SDKCall(g_esGeneral.g_hSDKGetMaxClip1, iSlot); + } + } + } +} + +void vCopyBioMassStats(int special) +{ + for (int iIndex = 0; iIndex <= MT_MAXTYPES; iIndex++) + { + g_esShooter[special].g_bInfected[iIndex] = g_esSpecific.g_bInfected[iIndex]; + } +} + +void vCopyInfectionStats(int survivor, int special) +{ + for (int iIndex = 0; iIndex <= MT_MAXTYPES; iIndex++) + { + g_esShooter[special].g_bInfected[iIndex] = g_esShooter[survivor].g_bInfected[iIndex]; + } + + g_esShooter[special].g_bDeathModel = g_esShooter[survivor].g_bDeathModel; + g_esShooter[special].g_bMixTypes = g_esShooter[survivor].g_bMixTypes; + g_esShooter[special].g_bProduced = g_esShooter[survivor].g_bProduced; + g_esShooter[special].g_bSurvivor = g_esShooter[survivor].g_bSurvivor; + g_esShooter[special].g_flDamageMultiplier = g_esShooter[survivor].g_flDamageMultiplier; + g_esShooter[special].g_flDeathModelDelay = g_esShooter[survivor].g_flDeathModelDelay; + g_esShooter[special].g_flHealthMultiplier = g_esShooter[survivor].g_flHealthMultiplier; + g_esShooter[special].g_iCharacter = g_esShooter[survivor].g_iCharacter; + g_esShooter[special].g_iDeathModel = g_esShooter[survivor].g_iDeathModel; + g_esShooter[special].g_iFirstSpecial = g_esShooter[survivor].g_iFirstSpecial; + g_esShooter[special].g_iFirstType = g_esShooter[survivor].g_iFirstType; + g_esShooter[special].g_iKillerSpecial = g_esShooter[survivor].g_iKillerSpecial; + g_esShooter[special].g_iKillerType = g_esShooter[survivor].g_iKillerType; + g_esShooter[special].g_iLastSpecial = g_esShooter[survivor].g_iLastSpecial; + g_esShooter[special].g_iLastType = g_esShooter[survivor].g_iLastType; + g_esShooter[special].g_iLeastDamage = g_esShooter[survivor].g_iLeastDamage; + g_esShooter[special].g_iLeastSpecial = g_esShooter[survivor].g_iLeastSpecial; + g_esShooter[special].g_iLeastType = g_esShooter[survivor].g_iLeastType; + g_esShooter[special].g_iMostDamage = g_esShooter[survivor].g_iMostDamage; + g_esShooter[special].g_iMostSpecial = g_esShooter[survivor].g_iMostSpecial; + g_esShooter[special].g_iMostType = g_esShooter[survivor].g_iMostType; + g_esShooter[special].g_sSurvivorName = g_esShooter[survivor].g_sSurvivorName; +} + +void vCopySurvivorStats(int oldSurvivor, int newSurvivor) +{ + g_esPlayer[newSurvivor].g_bFallDamage = g_esPlayer[oldSurvivor].g_bFallDamage; + g_esPlayer[newSurvivor].g_bFalling = g_esPlayer[oldSurvivor].g_bFalling; + g_esPlayer[newSurvivor].g_bFallTracked = g_esPlayer[oldSurvivor].g_bFallTracked; + g_esPlayer[newSurvivor].g_bFatalFalling = g_esPlayer[oldSurvivor].g_bFatalFalling; + g_esPlayer[newSurvivor].g_bFinalFall = g_esPlayer[oldSurvivor].g_bFinalFall; + g_esPlayer[newSurvivor].g_bLadyKiller = g_esPlayer[oldSurvivor].g_bLadyKiller; + g_esPlayer[newSurvivor].g_bPunished = g_esPlayer[oldSurvivor].g_bPunished; + g_esPlayer[newSurvivor].g_bReleasedJump = g_esPlayer[oldSurvivor].g_bReleasedJump; + g_esPlayer[newSurvivor].g_bSetup = g_esPlayer[oldSurvivor].g_bSetup; + g_esPlayer[newSurvivor].g_bVomited = g_esPlayer[oldSurvivor].g_bVomited; + g_esPlayer[newSurvivor].g_sLoopingVoiceline = g_esPlayer[oldSurvivor].g_sLoopingVoiceline; + g_esPlayer[newSurvivor].g_flActionDuration = g_esPlayer[oldSurvivor].g_flActionDuration; + g_esPlayer[newSurvivor].g_flAdrenalineTime = g_esPlayer[oldSurvivor].g_flAdrenalineTime; + g_esPlayer[newSurvivor].g_flAttackBoost = g_esPlayer[oldSurvivor].g_flAttackBoost; + g_esPlayer[newSurvivor].g_flDamageBoost = g_esPlayer[oldSurvivor].g_flDamageBoost; + g_esPlayer[newSurvivor].g_flDamageResistance = g_esPlayer[oldSurvivor].g_flDamageResistance; + g_esPlayer[newSurvivor].g_flDopamineRadius = g_esPlayer[oldSurvivor].g_flDopamineRadius; + g_esPlayer[newSurvivor].g_flFireRate = g_esPlayer[oldSurvivor].g_flFireRate; + g_esPlayer[newSurvivor].g_flGrenadeLauncher = g_esPlayer[oldSurvivor].g_flGrenadeLauncher; + g_esPlayer[newSurvivor].g_flHealPercent = g_esPlayer[oldSurvivor].g_flHealPercent; + g_esPlayer[newSurvivor].g_flHealthcareRadius = g_esPlayer[oldSurvivor].g_flHealthcareRadius; + g_esPlayer[newSurvivor].g_flHeartbeat = g_esPlayer[oldSurvivor].g_flHeartbeat; + g_esPlayer[newSurvivor].g_flHeartbeatCooldown = g_esPlayer[oldSurvivor].g_flHeartbeatCooldown; + g_esPlayer[newSurvivor].g_flHollowpointAmmo = g_esPlayer[oldSurvivor].g_flHollowpointAmmo; + g_esPlayer[newSurvivor].g_flJumpHeight = g_esPlayer[oldSurvivor].g_flJumpHeight; + g_esPlayer[newSurvivor].g_flLadyKiller = g_esPlayer[oldSurvivor].g_flLadyKiller; + g_esPlayer[newSurvivor].g_flLastClickTime = g_esPlayer[oldSurvivor].g_flLastClickTime; + g_esPlayer[newSurvivor].g_flLastFlow = g_esPlayer[oldSurvivor].g_flLastFlow; + g_esPlayer[newSurvivor].g_flLastGrenadeTime = g_esPlayer[oldSurvivor].g_flLastGrenadeTime; + g_esPlayer[newSurvivor].g_flLastJumpTime = g_esPlayer[oldSurvivor].g_flLastJumpTime; + g_esPlayer[newSurvivor].g_flLastPushTime = g_esPlayer[oldSurvivor].g_flLastPushTime; + g_esPlayer[newSurvivor].g_flLastWarning = g_esPlayer[oldSurvivor].g_flLastWarning; + g_esPlayer[newSurvivor].g_flLuckyBullet = g_esPlayer[oldSurvivor].g_flLuckyBullet; + g_esPlayer[newSurvivor].g_flMotivationRadius = g_esPlayer[oldSurvivor].g_flMotivationRadius; + g_esPlayer[newSurvivor].g_flOverdoseRadius = g_esPlayer[oldSurvivor].g_flOverdoseRadius; + g_esPlayer[newSurvivor].g_flPipeBombDuration = g_esPlayer[oldSurvivor].g_flPipeBombDuration; + g_esPlayer[newSurvivor].g_flPunchResistance = g_esPlayer[oldSurvivor].g_flPunchResistance; + g_esPlayer[newSurvivor].g_flPreFallZ = g_esPlayer[oldSurvivor].g_flPreFallZ; + g_esPlayer[newSurvivor].g_flRapidPistol = g_esPlayer[oldSurvivor].g_flRapidPistol; + g_esPlayer[newSurvivor].g_flRefillPercent = g_esPlayer[oldSurvivor].g_flRefillPercent; + g_esPlayer[newSurvivor].g_flReloadRate = g_esPlayer[oldSurvivor].g_flReloadRate; + g_esPlayer[newSurvivor].g_flShockwaveRadius = g_esPlayer[oldSurvivor].g_flShockwaveRadius; + g_esPlayer[newSurvivor].g_flShoveDamage = g_esPlayer[oldSurvivor].g_flShoveDamage; + g_esPlayer[newSurvivor].g_flShoveRate = g_esPlayer[oldSurvivor].g_flShoveRate; + g_esPlayer[newSurvivor].g_flSledgehammerRounds = g_esPlayer[oldSurvivor].g_flSledgehammerRounds; + g_esPlayer[newSurvivor].g_flSpeedBoost = g_esPlayer[oldSurvivor].g_flSpeedBoost; + g_esPlayer[newSurvivor].g_flSupplier = g_esPlayer[oldSurvivor].g_flSupplier; + g_esPlayer[newSurvivor].g_flSupplierCooldown = g_esPlayer[oldSurvivor].g_flSupplierCooldown; + g_esPlayer[newSurvivor].g_flSwingRate = g_esPlayer[oldSurvivor].g_flSwingRate; + g_esPlayer[newSurvivor].g_iAmmoBoost = g_esPlayer[oldSurvivor].g_iAmmoBoost; + g_esPlayer[newSurvivor].g_iAmmoRefill = g_esPlayer[oldSurvivor].g_iAmmoRefill; + g_esPlayer[newSurvivor].g_iAmmoRegen = g_esPlayer[oldSurvivor].g_iAmmoRegen; + g_esPlayer[newSurvivor].g_iBlazeHealth = g_esPlayer[oldSurvivor].g_iBlazeHealth; + g_esPlayer[newSurvivor].g_iBloodDonor = g_esPlayer[oldSurvivor].g_iBloodDonor; + g_esPlayer[newSurvivor].g_iBunnyHop = g_esPlayer[oldSurvivor].g_iBunnyHop; + g_esPlayer[newSurvivor].g_iBurstDoors = g_esPlayer[oldSurvivor].g_iBurstDoors; + g_esPlayer[newSurvivor].g_iCleanKills = g_esPlayer[oldSurvivor].g_iCleanKills; + g_esPlayer[newSurvivor].g_iClusterBombs = g_esPlayer[oldSurvivor].g_iClusterBombs; + g_esPlayer[newSurvivor].g_iEternalFlames = g_esPlayer[oldSurvivor].g_iEternalFlames; + g_esPlayer[newSurvivor].g_iFallPasses = g_esPlayer[oldSurvivor].g_iFallPasses; + g_esPlayer[newSurvivor].g_iFastRecovery = g_esPlayer[oldSurvivor].g_iFastRecovery; + g_esPlayer[newSurvivor].g_iFriendlyFire = g_esPlayer[oldSurvivor].g_iFriendlyFire; + g_esPlayer[newSurvivor].g_iGhostBullets = g_esPlayer[oldSurvivor].g_iGhostBullets; + g_esPlayer[newSurvivor].g_iHealthRegen = g_esPlayer[oldSurvivor].g_iHealthRegen; + g_esPlayer[newSurvivor].g_iInfiniteAmmo = g_esPlayer[oldSurvivor].g_iInfiniteAmmo; + g_esPlayer[newSurvivor].g_iLadderActions = g_esPlayer[oldSurvivor].g_iLadderActions; + g_esPlayer[newSurvivor].g_iLaserSight = g_esPlayer[oldSurvivor].g_iLaserSight; + g_esPlayer[newSurvivor].g_iLifeLeech = g_esPlayer[oldSurvivor].g_iLifeLeech; + g_esPlayer[newSurvivor].g_iMedicalCuts = g_esPlayer[oldSurvivor].g_iMedicalCuts; + g_esPlayer[newSurvivor].g_iMeleeRange = g_esPlayer[oldSurvivor].g_iMeleeRange; + g_esPlayer[newSurvivor].g_iMidairDashesLimit = g_esPlayer[oldSurvivor].g_iMidairDashesLimit; + g_esPlayer[newSurvivor].g_iNotify = g_esPlayer[oldSurvivor].g_iNotify; + g_esPlayer[newSurvivor].g_iOverhealth = g_esPlayer[oldSurvivor].g_iOverhealth; + g_esPlayer[newSurvivor].g_iPrefsAccess = g_esPlayer[oldSurvivor].g_iPrefsAccess; + g_esPlayer[newSurvivor].g_iParticleEffect = g_esPlayer[oldSurvivor].g_iParticleEffect; + g_esPlayer[newSurvivor].g_iRecoilDampener = g_esPlayer[oldSurvivor].g_iRecoilDampener; + g_esPlayer[newSurvivor].g_iRegenBursts = g_esPlayer[oldSurvivor].g_iRegenBursts; + g_esPlayer[newSurvivor].g_iReviveHealth = g_esPlayer[oldSurvivor].g_iReviveHealth; + g_esPlayer[newSurvivor].g_iRewardTypes = g_esPlayer[oldSurvivor].g_iRewardTypes; + g_esPlayer[newSurvivor].g_iRiotGear = g_esPlayer[oldSurvivor].g_iRiotGear; + g_esPlayer[newSurvivor].g_iSafetyBubble = g_esPlayer[oldSurvivor].g_iSafetyBubble; + g_esPlayer[newSurvivor].g_iShovePenalty = g_esPlayer[oldSurvivor].g_iShovePenalty; + g_esPlayer[newSurvivor].g_iSpecialAmmo = g_esPlayer[oldSurvivor].g_iSpecialAmmo; + g_esPlayer[newSurvivor].g_iStickyGrenades = g_esPlayer[oldSurvivor].g_iStickyGrenades; + g_esPlayer[newSurvivor].g_iSyringeDarts = g_esPlayer[oldSurvivor].g_iSyringeDarts; + g_esPlayer[newSurvivor].g_iThorns = g_esPlayer[oldSurvivor].g_iThorns; + g_esPlayer[newSurvivor].g_iVoicePitch = g_esPlayer[oldSurvivor].g_iVoicePitch; + g_esPlayer[newSurvivor].g_sBodyColor = g_esPlayer[oldSurvivor].g_sBodyColor; + g_esPlayer[newSurvivor].g_sLightColor = g_esPlayer[oldSurvivor].g_sLightColor; + g_esPlayer[newSurvivor].g_sOutlineColor = g_esPlayer[oldSurvivor].g_sOutlineColor; + g_esPlayer[newSurvivor].g_sScreenColor = g_esPlayer[oldSurvivor].g_sScreenColor; + g_esShooter[newSurvivor].g_iCharacterType[0] = g_esShooter[oldSurvivor].g_iCharacterType[0]; + g_esShooter[newSurvivor].g_iNotify = g_esShooter[oldSurvivor].g_iNotify; + g_esShooter[newSurvivor].g_iPassiveTypes = g_esShooter[oldSurvivor].g_iPassiveTypes; + g_esShooter[newSurvivor].g_iTotalPassives = g_esShooter[oldSurvivor].g_iTotalPassives; + + for (int iPos = 0; iPos < (sizeof esPlayer::g_flRewardTime); iPos++) + { + g_esPlayer[newSurvivor].g_flRewardTime[iPos] = g_esPlayer[oldSurvivor].g_flRewardTime[iPos]; + g_esPlayer[newSurvivor].g_iRewardStack[iPos] = g_esPlayer[oldSurvivor].g_iRewardStack[iPos]; + + if (iPos < (sizeof esPlayer::g_flVisualTime)) + { + g_esPlayer[newSurvivor].g_flVisualTime[iPos] = g_esPlayer[oldSurvivor].g_flVisualTime[iPos]; + } + + if (iPos < (sizeof esPlayer::g_iScreenColorVisual)) + { + g_esPlayer[newSurvivor].g_iScreenColorVisual[iPos] = g_esPlayer[oldSurvivor].g_iScreenColorVisual[iPos]; + } + } + + for (int iTank = 1; iTank <= MaxClients; iTank++) + { + g_esPlayer[newSurvivor].g_iTankDamage[iTank] = g_esPlayer[oldSurvivor].g_iTankDamage[iTank]; + } + + if (g_esPlayer[oldSurvivor].g_bRainbowColor) + { + g_esPlayer[oldSurvivor].g_bRainbowColor = false; + g_esPlayer[newSurvivor].g_bRainbowColor = SDKHookEx(newSurvivor, SDKHook_PreThinkPost, OnTankRainbowPreThinkPost); + } +} + +void vGiveGunSpecialAmmo(int survivor) +{ + int iType = ((bIsDeveloper(survivor, 7) || bIsDeveloper(survivor, 11)) && g_esDeveloper[survivor].g_iDevSpecialAmmo > g_esPlayer[survivor].g_iSpecialAmmo) ? g_esDeveloper[survivor].g_iDevSpecialAmmo : g_esPlayer[survivor].g_iSpecialAmmo; + if (g_bSecondGame && iType > 0) + { + int iSlot = GetPlayerWeaponSlot(survivor, 0); + if (iSlot > MaxClients) + { + int iAmmoType = GetEntProp(iSlot, Prop_Send, "m_iPrimaryAmmoType"); + if (iAmmoType != MT_L4D2_AMMOTYPE_RIFLE_M60 && iAmmoType != MT_L4D2_AMMOTYPE_GRENADE_LAUNCHER) + { + int iUpgrades = GetEntProp(iSlot, Prop_Send, "m_upgradeBitVec"); + + switch (iType) + { + case 1: iUpgrades = (iUpgrades & MT_UPGRADE_LASERSIGHT) ? MT_UPGRADE_LASERSIGHT|MT_UPGRADE_INCENDIARY : MT_UPGRADE_INCENDIARY; + case 2: iUpgrades = (iUpgrades & MT_UPGRADE_LASERSIGHT) ? MT_UPGRADE_LASERSIGHT|MT_UPGRADE_EXPLOSIVE : MT_UPGRADE_EXPLOSIVE; + case 3: + { + int iSpecialAmmo = (MT_GetRandomInt(1, 2) == 2) ? MT_UPGRADE_INCENDIARY : MT_UPGRADE_EXPLOSIVE; + iUpgrades = (iUpgrades & MT_UPGRADE_LASERSIGHT) ? MT_UPGRADE_LASERSIGHT|iSpecialAmmo : iSpecialAmmo; + } + } + + SetEntProp(iSlot, Prop_Send, "m_upgradeBitVec", iUpgrades); + SetEntProp(iSlot, Prop_Send, "m_nUpgradedPrimaryAmmoLoaded", GetEntProp(iSlot, Prop_Send, "m_iClip1")); + } + } + } +} + +void vGiveSurvivorRandomMeleeWeapon(int survivor, bool specific, const char[] name = "") +{ + if (specific) + { + vCheatCommand(survivor, "give", ((name[0] != '\0') ? name : "machete")); + + if (GetPlayerWeaponSlot(survivor, 1) > MaxClients) + { + return; + } + + vGiveSurvivorRandomMeleeWeapon(survivor, false); + } + else + { + char sName[32]; + for (int iType = 1; iType < 13; iType++) + { + if (GetPlayerWeaponSlot(survivor, 1) > MaxClients) + { + break; + } + + switch (iType) + { + case 1: sName = "machete"; + case 2: sName = "katana"; + case 3: sName = "fireaxe"; + case 4: sName = "shovel"; + case 5: sName = "baseball_bat"; + case 6: sName = "cricket_bat"; + case 7: sName = "golfclub"; + case 8: sName = "electric_guitar"; + case 9: sName = "frying_pan"; + case 10: sName = "tonfa"; + case 11: sName = "crowbar"; + case 12: sName = "knife"; + case 13: sName = "pitchfork"; + } + + vCheatCommand(survivor, "give", sName); + } + } +} + +void vGiveSurvivorWeapons(int survivor) +{ + int iSlot = 0; + if (g_esPlayer[survivor].g_sWeaponPrimary[0] != '\0') + { + vCheatCommand(survivor, "give", g_esPlayer[survivor].g_sWeaponPrimary); + + iSlot = GetPlayerWeaponSlot(survivor, 0); + if (iSlot > MaxClients) + { + SetEntProp(iSlot, Prop_Send, "m_iClip1", g_esPlayer[survivor].g_iWeaponInfo[0]); + SetEntProp(survivor, Prop_Send, "m_iAmmo", g_esPlayer[survivor].g_iWeaponInfo[1], .element = iGetWeaponOffset(iSlot)); + + if (g_bSecondGame) + { + if (g_esPlayer[survivor].g_iWeaponInfo[2] > 0) + { + SetEntProp(iSlot, Prop_Send, "m_upgradeBitVec", g_esPlayer[survivor].g_iWeaponInfo[2]); + } + + if (g_esPlayer[survivor].g_iWeaponInfo[3] > 0) + { + SetEntProp(iSlot, Prop_Send, "m_nUpgradedPrimaryAmmoLoaded", g_esPlayer[survivor].g_iWeaponInfo[3]); + } + } + } + } + + if (g_esPlayer[survivor].g_sWeaponSecondary[0] != '\0') + { + switch (g_esPlayer[survivor].g_bDualWielding) + { + case true: + { + vCheatCommand(survivor, "give", "weapon_pistol"); + vCheatCommand(survivor, "give", "weapon_pistol"); + } + case false: vCheatCommand(survivor, "give", g_esPlayer[survivor].g_sWeaponSecondary); + } + + iSlot = GetPlayerWeaponSlot(survivor, 1); + if (iSlot > MaxClients && g_esPlayer[survivor].g_iWeaponInfo2 != -1) + { + SetEntProp(iSlot, Prop_Send, "m_iClip1", g_esPlayer[survivor].g_iWeaponInfo2); + } + } + + if (g_esPlayer[survivor].g_sWeaponThrowable[0] != '\0') + { + vCheatCommand(survivor, "give", g_esPlayer[survivor].g_sWeaponThrowable); + } + + if (g_esPlayer[survivor].g_sWeaponMedkit[0] != '\0') + { + vCheatCommand(survivor, "give", g_esPlayer[survivor].g_sWeaponMedkit); + } + + if (g_esPlayer[survivor].g_sWeaponPills[0] != '\0') + { + vCheatCommand(survivor, "give", g_esPlayer[survivor].g_sWeaponPills); + } + + for (int iPos = 0; iPos < (sizeof esPlayer::g_iWeaponInfo); iPos++) + { + g_esPlayer[survivor].g_iWeaponInfo[iPos] = 0; + } + + g_esPlayer[survivor].g_iWeaponInfo2 = -1; + g_esPlayer[survivor].g_sWeaponPrimary[0] = '\0'; + g_esPlayer[survivor].g_sWeaponSecondary[0] = '\0'; + g_esPlayer[survivor].g_sWeaponThrowable[0] = '\0'; + g_esPlayer[survivor].g_sWeaponMedkit[0] = '\0'; + g_esPlayer[survivor].g_sWeaponPills[0] = '\0'; +} + +void vRefillGunAmmo(int survivor, bool all = false, bool reset = false, bool override = false) +{ + int iSetting = (bIsDeveloper(survivor, 7) && g_esDeveloper[survivor].g_iDevInfiniteAmmo > g_esPlayer[survivor].g_iInfiniteAmmo) ? g_esDeveloper[survivor].g_iDevInfiniteAmmo : g_esPlayer[survivor].g_iInfiniteAmmo; + iSetting = (all ? iSetting : 0); + + int iSlot = 0; + if (!all || (iSetting > 0 && (iSetting & MT_INFAMMO_PRIMARY))) + { + iSlot = GetPlayerWeaponSlot(survivor, 0); + if (iSlot > MaxClients) + { + int iMaxClip = (reset ? iGetMaxAmmo(survivor, 0, iSlot, false, true) : g_esPlayer[survivor].g_iMaxClip[0]); + if (override || !reset || (reset && GetEntProp(iSlot, Prop_Send, "m_iClip1") >= iMaxClip)) + { + SetEntProp(iSlot, Prop_Send, "m_iClip1", iMaxClip); + + if (g_bSecondGame && bHasSpecialAmmo(iSlot, 0)) + { + SetEntProp(iSlot, Prop_Send, "m_nUpgradedPrimaryAmmoLoaded", iMaxClip); + } + } + + vRefillGunMagazine(survivor, iSlot, reset, override); + } + } + + if (!all || (iSetting > 0 && (iSetting & MT_INFAMMO_SECONDARY))) + { + iSlot = GetPlayerWeaponSlot(survivor, 1); + if (iSlot > MaxClients) + { + char sWeapon[32]; + GetEntityClassname(iSlot, sWeapon, sizeof sWeapon); + if ((!strncmp(sWeapon[7], "pistol", 6) || StrEqual(sWeapon[7], "chainsaw")) && (override || !reset || (reset && GetEntProp(iSlot, Prop_Send, "m_iClip1") >= g_esPlayer[survivor].g_iMaxClip[1]))) + { + SetEntProp(iSlot, Prop_Send, "m_iClip1", g_esPlayer[survivor].g_iMaxClip[1]); + } + } + } + + if (all && iSetting > 0) + { + iSlot = GetPlayerWeaponSlot(survivor, 2); + if (!bIsValidEntity(iSlot) && (iSetting & MT_INFAMMO_THROWABLE)) + { + vCheatCommand(survivor, "give", g_esPlayer[survivor].g_sStoredThrowable); + } + + iSlot = GetPlayerWeaponSlot(survivor, 3); + if (!bIsValidEntity(iSlot) && (iSetting & MT_INFAMMO_MEDKIT)) + { + vCheatCommand(survivor, "give", g_esPlayer[survivor].g_sStoredMedkit); + } + + iSlot = GetPlayerWeaponSlot(survivor, 4); + if (!bIsValidEntity(iSlot) && (iSetting & MT_INFAMMO_PILLS)) + { + vCheatCommand(survivor, "give", g_esPlayer[survivor].g_sStoredPills); + } + } +} + +void vRefillGunMagazine(int survivor, int weapon, bool reset, bool override, int amount = 0) +{ + int iAmmoOffset = iGetWeaponOffset(weapon), iAmmo = GetEntProp(survivor, Prop_Send, "m_iAmmo", .element = iAmmoOffset), + iMaxAmmo = iGetMaxAmmo(survivor, 0, weapon, true, reset), iNewAmmo = 0; + + switch (amount) + { + case 0: + { + switch (override || !reset) + { + case true: iNewAmmo = iMaxAmmo; + case false: iNewAmmo = (iAmmo > iMaxAmmo) ? iMaxAmmo : iNewAmmo; + } + } + default: iNewAmmo = (amount > iMaxAmmo) ? iMaxAmmo : amount; + } + + if (iNewAmmo > 0) + { + SetEntProp(survivor, Prop_Send, "m_iAmmo", iNewAmmo, .element = iAmmoOffset); + } +} + +void vRefillSurvivorHealth(int survivor) +{ + if (bIsSurvivorDisabled(survivor) || GetEntProp(survivor, Prop_Data, "m_iHealth") < GetEntProp(survivor, Prop_Data, "m_iMaxHealth")) + { + int iMode = GetEntProp(survivor, Prop_Data, "m_takedamage", 1); + if (iMode != 2) + { + SetEntProp(survivor, Prop_Data, "m_takedamage", 2, 1); + vAddSurvivorHealth(survivor); + SetEntProp(survivor, Prop_Data, "m_takedamage", iMode, 1); + } + else + { + vAddSurvivorHealth(survivor); + } + } +} + +void vRefreshLaserSight(int survivor) +{ + if (g_esPlayer[survivor].g_bCustomLaser || bIsDeveloper(survivor, 3) || (((g_esShooter[survivor].g_iTotalPassives & MT_PASSIVE_DAMAGEBOOST) || (g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_DAMAGEBOOST)) && g_esPlayer[survivor].g_iLaserSight == 1)) + { + if (!g_bSecondGame) + { + int iUpgrades = GetEntProp(survivor, Prop_Send, "m_upgradeBitVec"), iBit = (iUpgrades & ~(1 << 17)); + if (iUpgrades != iBit) + { + SetEntProp(survivor, Prop_Send, "m_upgradeBitVec", iBit, 4); + } + } + + vSetupLaserSight(survivor, true); + } + else if (g_esPlayer[survivor].g_bCustomLaser && g_esDeveloper[survivor].g_iDevAccess == 0 && g_esPlayer[survivor].g_iLaserSight <= 0) + { + if (!g_bSecondGame) + { + SetEntProp(survivor, Prop_Send, "m_upgradeBitVec", 0, 4); + } + + vSetupLaserSight(survivor, false); + } +} + +void vRemoveBioMass() +{ + for (int iIndex = 0; iIndex <= MT_MAXTYPES; iIndex++) + { + g_esSpecific.g_bInfected[iIndex] = false; + } +} + +void vRemoveBubble(int survivor) +{ + if (bIsValidEntRef(g_esPlayer[survivor].g_iBubble)) + { + g_esPlayer[survivor].g_iBubble = EntRefToEntIndex(g_esPlayer[survivor].g_iBubble); + if (bIsValidEntity(g_esPlayer[survivor].g_iBubble)) + { + SDKUnhook(g_esPlayer[survivor].g_iBubble, SDKHook_SetTransmit, OnPropSetTransmit); + RemoveEntity(g_esPlayer[survivor].g_iBubble); + } + } + + g_esPlayer[survivor].g_iBubble = INVALID_ENT_REFERENCE; +} + +void vRemoveInfection(int survivor) +{ + for (int iIndex = 0; iIndex <= MT_MAXTYPES; iIndex++) + { + g_esShooter[survivor].g_bInfected[iIndex] = false; + } + + g_esShooter[survivor].g_bDeathModel = false; + g_esShooter[survivor].g_bMixTypes = false; + g_esShooter[survivor].g_bProduced = false; + g_esShooter[survivor].g_bSurvivor = false; + g_esShooter[survivor].g_flDamageMultiplier = 0.0; + g_esShooter[survivor].g_flDeathModelDelay = 0.0; + g_esShooter[survivor].g_flHealthMultiplier = 0.0; + g_esShooter[survivor].g_iCharacter = -1; + g_esShooter[survivor].g_iDeathModel = INVALID_ENT_REFERENCE; + g_esShooter[survivor].g_iFirstSpecial = -1; + g_esShooter[survivor].g_iFirstType = 0; + g_esShooter[survivor].g_iKillerSpecial = -1; + g_esShooter[survivor].g_iKillerType = 0; + g_esShooter[survivor].g_iLastSpecial = -1; + g_esShooter[survivor].g_iLastType = 0; + g_esShooter[survivor].g_iLeastDamage = 0; + g_esShooter[survivor].g_iLeastSpecial = -1; + g_esShooter[survivor].g_iLeastType = 0; + g_esShooter[survivor].g_iMostDamage = 0; + g_esShooter[survivor].g_iMostSpecial = -1; + g_esShooter[survivor].g_iMostType = 0; + g_esShooter[survivor].g_sSurvivorName[0] = '\0'; +} + +void vRemoveLaserSight(int survivor) +{ + if (!g_bSecondGame) + { + SetEntProp(survivor, Prop_Send, "m_upgradeBitVec", 0, 4); + } + + vSetupLaserSight(survivor, false); +} + +void vRemoveSurvivorEffects(int survivor, bool body = false) +{ + int iEffect = -1; + for (int iPos = 0; iPos < (sizeof esPlayer::g_iEffect); iPos++) + { + iEffect = g_esPlayer[survivor].g_iEffect[iPos]; + if (bIsValidEntRef(iEffect)) + { + RemoveEntity(iEffect); + } + + g_esPlayer[survivor].g_iEffect[iPos] = INVALID_ENT_REFERENCE; + } + + if (body || bIsValidClient(survivor)) + { + vRemovePlayerGlow(survivor); + vRemoveSurvivorLight(survivor); + SetEntityRenderMode(survivor, RENDER_NORMAL); + SetEntityRenderColor(survivor, 255, 255, 255, 255); + } + + vRemoveBubble(survivor); + SDKUnhook(survivor, SDKHook_PostThinkPost, OnTankPostThinkPost); +} + +void vRemoveSurvivorLight(int survivor) +{ + if (bIsValidEntRef(g_esPlayer[survivor].g_iFlashlight)) + { + int iProp = EntRefToEntIndex(g_esPlayer[survivor].g_iFlashlight); + if (bIsValidEntity(iProp)) + { + RemoveEntity(iProp); + } + + g_esPlayer[survivor].g_iFlashlight = INVALID_ENT_REFERENCE; + } +} + +void vResetSurvivorStats(int survivor, bool all) +{ + g_esDeveloper[survivor].g_bDevVisual = false; + g_esPlayer[survivor].g_bFallDamage = false; + g_esPlayer[survivor].g_bFalling = false; + g_esPlayer[survivor].g_bFallTracked = false; + g_esPlayer[survivor].g_bFatalFalling = false; + g_esPlayer[survivor].g_bLadyKiller = false; + g_esPlayer[survivor].g_bPunished = false; + g_esPlayer[survivor].g_bRainbowColor = false; + g_esPlayer[survivor].g_bReleasedJump = false; + g_esPlayer[survivor].g_bVomited = false; + g_esPlayer[survivor].g_sLoopingVoiceline[0] = '\0'; + g_esPlayer[survivor].g_flActionDuration = 0.0; + g_esPlayer[survivor].g_flAdrenalineTime = 0.0; + g_esPlayer[survivor].g_flAttackBoost = 0.0; + g_esPlayer[survivor].g_flDamageBoost = 0.0; + g_esPlayer[survivor].g_flDamageResistance = 0.0; + g_esPlayer[survivor].g_flDopamineRadius = 0.0; + g_esPlayer[survivor].g_flFireRate = 0.0; + g_esPlayer[survivor].g_flGrenadeLauncher = 0.0; + g_esPlayer[survivor].g_flHealPercent = 0.0; + g_esPlayer[survivor].g_flHealthcareRadius = 0.0; + g_esPlayer[survivor].g_flHeartbeat = 0.0; + g_esPlayer[survivor].g_flHeartbeatCooldown = -1.0; + g_esPlayer[survivor].g_flHollowpointAmmo = 0.0; + g_esPlayer[survivor].g_flJumpHeight = 0.0; + g_esPlayer[survivor].g_flLadyKiller = 0.0; + g_esPlayer[survivor].g_flLastClickTime = 0.0; + g_esPlayer[survivor].g_flLastFlow = 0.0; + g_esPlayer[survivor].g_flLastGrenadeTime = 0.0; + g_esPlayer[survivor].g_flLastJumpTime = 0.0; + g_esPlayer[survivor].g_flLastPushTime = 0.0; + g_esPlayer[survivor].g_flLastWarning = 0.0; + g_esPlayer[survivor].g_flLuckyBullet = 0.0; + g_esPlayer[survivor].g_flMotivationRadius = 0.0; + g_esPlayer[survivor].g_flOverdoseRadius = 0.0; + g_esPlayer[survivor].g_flPipeBombDuration = 0.0; + g_esPlayer[survivor].g_flPunchResistance = 0.0; + g_esPlayer[survivor].g_flPreFallZ = 0.0; + g_esPlayer[survivor].g_flRefillPercent = 0.0; + g_esPlayer[survivor].g_flReloadRate = 0.0; + g_esPlayer[survivor].g_flShockwaveRadius = 0.0; + g_esPlayer[survivor].g_flShoveDamage = 0.0; + g_esPlayer[survivor].g_flShoveRate = 0.0; + g_esPlayer[survivor].g_flSledgehammerRounds = 0.0; + g_esPlayer[survivor].g_flSpeedBoost = 0.0; + g_esPlayer[survivor].g_flSupplier = 0.0; + g_esPlayer[survivor].g_flSupplierCooldown = -1.0; + g_esPlayer[survivor].g_flSwingRate = 0.0; + g_esPlayer[survivor].g_iAmmoBoost = 0; + g_esPlayer[survivor].g_iAmmoRefill = 0; + g_esPlayer[survivor].g_iAmmoRegen = 0; + g_esPlayer[survivor].g_iBlazeHealth = 0; + g_esPlayer[survivor].g_iBloodDonor = 0; + g_esPlayer[survivor].g_iBunnyHop = 0; + g_esPlayer[survivor].g_iBurstDoors = 0; + g_esPlayer[survivor].g_iCleanKills = 0; + g_esPlayer[survivor].g_iClusterBombs = 0; + g_esPlayer[survivor].g_iEternalFlames = 0; + g_esPlayer[survivor].g_iFallPasses = 0; + g_esPlayer[survivor].g_iFastRecovery = 0; + g_esPlayer[survivor].g_iFriendlyFire = 0; + g_esPlayer[survivor].g_iGhostBullets = 0; + g_esPlayer[survivor].g_iHealthRegen = 0; + g_esPlayer[survivor].g_iInfiniteAmmo = 0; + g_esPlayer[survivor].g_iLadderActions = 0; + g_esPlayer[survivor].g_iLaserSight = 0; + g_esPlayer[survivor].g_iLifeLeech = 0; + g_esPlayer[survivor].g_iMedicalCuts = 0; + g_esPlayer[survivor].g_iMeleeRange = 0; + g_esPlayer[survivor].g_iMidairDashesLimit = 0; + g_esPlayer[survivor].g_iNotify = 0; + g_esPlayer[survivor].g_iOverhealth = 0; + g_esPlayer[survivor].g_iPrefsAccess = 0; + g_esPlayer[survivor].g_iParticleEffect = 0; + g_esPlayer[survivor].g_iRecoilDampener = 0; + g_esPlayer[survivor].g_iRegenBursts = 0; + g_esPlayer[survivor].g_iReviveHealth = 0; + g_esPlayer[survivor].g_iRewardTypes = 0; + g_esPlayer[survivor].g_iRiotGear = 0; + g_esPlayer[survivor].g_iSafetyBubble = 0; + g_esPlayer[survivor].g_iShovePenalty = 0; + g_esPlayer[survivor].g_iSpecialAmmo = 0; + g_esPlayer[survivor].g_iStickyGrenades = 0; + g_esPlayer[survivor].g_iSyringeDarts = 0; + g_esPlayer[survivor].g_iThorns = 0; + g_esPlayer[survivor].g_iVoicePitch = 0; + g_esPlayer[survivor].g_sBodyColor[0] = '\0'; + g_esPlayer[survivor].g_sLightColor[0] = '\0'; + g_esPlayer[survivor].g_sOutlineColor[0] = '\0'; + g_esPlayer[survivor].g_sScreenColor[0] = '\0'; + g_esShooter[survivor].g_iCharacterType[0] = -1; + g_esShooter[survivor].g_iNotify = 0; + g_esShooter[survivor].g_iPassiveTypes = 0; + g_esShooter[survivor].g_iTotalPassives = 0; + + if (all) + { + g_esPlayer[survivor].g_bSetup = false; + g_esShooter[survivor].g_iCharacterType[1] = -1; + } + + for (int iPos = 0; iPos < (sizeof esPlayer::g_flRewardTime); iPos++) + { + g_esPlayer[survivor].g_flRewardTime[iPos] = -1.0; + g_esPlayer[survivor].g_iRewardStack[iPos] = 0; + + if (iPos < (sizeof esPlayer::g_flVisualTime)) + { + g_esPlayer[survivor].g_flVisualTime[iPos] = -1.0; + } + + if (iPos < (sizeof esPlayer::g_iScreenColorVisual)) + { + g_esPlayer[survivor].g_iScreenColorVisual[iPos] = -1; + } + } +} + +void vResetSurvivorStats2(int survivor) +{ + for (int iBit = 5; iBit < 9; iBit++) + { + if (iBit != 6) + { + if (g_esShooter[survivor].g_iPassiveTypes & (1 << iBit)) + { + g_esShooter[survivor].g_iPassiveTypes &= ~(1 << iBit); + } + + if (g_esShooter[survivor].g_iTotalPassives & (1 << iBit)) + { + g_esShooter[survivor].g_iTotalPassives &= ~(1 << iBit); + } + + if (g_esPlayer[survivor].g_iRewardTypes & (1 << iBit)) + { + g_esPlayer[survivor].g_iRewardTypes &= ~(1 << iBit); + } + } + } +} + +void vRespawnSurvivor(int survivor) +{ + static int iIndex = -1; + if (iIndex == -1) + { + iIndex = iGetPatchIndex("MTPatch_RespawnStats"); + } + + if (iIndex != -1) + { + vInstallPatch(iIndex); + } + + if (g_esGeneral.g_hSDKRoundRespawn != null) + { + SDKCall(g_esGeneral.g_hSDKRoundRespawn, survivor); + } + + if (iIndex != -1) + { + vRemovePatch(iIndex); + } +} + +void vReviveSurvivor(int survivor) +{ + if (!bIsSurvivorDisabled(survivor)) + { + return; + } + + if (g_esGeneral.g_hSDKRevive != null) + { + SDKCall(g_esGeneral.g_hSDKRevive, survivor); + StopSound(survivor, SNDCHAN_STATIC, SOUND_HEARTBEAT); + } +} + +void vSaveCaughtSurvivor(int survivor, int special = 0) +{ + int iSpecial = special; + iSpecial = (iSpecial <= 0) ? GetEntPropEnt(survivor, Prop_Send, "m_pounceAttacker") : iSpecial; + iSpecial = (iSpecial <= 0) ? GetEntPropEnt(survivor, Prop_Send, "m_tongueOwner") : iSpecial; + + if (g_bSecondGame) + { + iSpecial = (iSpecial <= 0) ? GetEntPropEnt(survivor, Prop_Send, "m_pummelAttacker") : iSpecial; + iSpecial = (iSpecial <= 0) ? GetEntPropEnt(survivor, Prop_Send, "m_carryAttacker") : iSpecial; + iSpecial = (iSpecial <= 0) ? GetEntPropEnt(survivor, Prop_Send, "m_jockeyAttacker") : iSpecial; + } + + if (bIsSpecialInfected(iSpecial)) + { + SDKHooks_TakeDamage(iSpecial, survivor, survivor, float(GetEntProp(iSpecial, Prop_Data, "m_iHealth")), DMG_CLUB); + } +} + +void vSaveSurvivorWeapons(int survivor) +{ + char sWeapon[32]; + g_esPlayer[survivor].g_iWeaponInfo2 = -1; + int iSlot = GetPlayerWeaponSlot(survivor, 0); + if (iSlot > MaxClients) + { + GetEntityClassname(iSlot, sWeapon, sizeof sWeapon); + strcopy(g_esPlayer[survivor].g_sWeaponPrimary, sizeof esPlayer::g_sWeaponPrimary, sWeapon); + + g_esPlayer[survivor].g_iWeaponInfo[0] = GetEntProp(iSlot, Prop_Send, "m_iClip1"); + g_esPlayer[survivor].g_iWeaponInfo[1] = GetEntProp(survivor, Prop_Send, "m_iAmmo", .element = iGetWeaponOffset(iSlot)); + + if (g_bSecondGame) + { + g_esPlayer[survivor].g_iWeaponInfo[2] = GetEntProp(iSlot, Prop_Send, "m_upgradeBitVec"); + g_esPlayer[survivor].g_iWeaponInfo[3] = GetEntProp(iSlot, Prop_Send, "m_nUpgradedPrimaryAmmoLoaded"); + } + } + + iSlot = 0; + if (g_bSecondGame) + { + if (bIsSurvivorDisabled(survivor) && g_esGeneral.g_iMeleeOffset != -1) + { + int iMelee = GetEntDataEnt2(survivor, g_esGeneral.g_iMeleeOffset); + + switch (bIsValidEntity(iMelee)) + { + case true: iSlot = iMelee; + case false: iSlot = GetPlayerWeaponSlot(survivor, 1); + } + } + else + { + iSlot = GetPlayerWeaponSlot(survivor, 1); + } + } + else + { + iSlot = GetPlayerWeaponSlot(survivor, 1); + } + + if (iSlot > MaxClients) + { + GetEntityClassname(iSlot, sWeapon, sizeof sWeapon); + if (StrEqual(sWeapon[7], "melee")) + { + GetEntPropString(iSlot, Prop_Data, "m_strMapSetScriptName", sWeapon, sizeof sWeapon); + } + + strcopy(g_esPlayer[survivor].g_sWeaponSecondary, sizeof esPlayer::g_sWeaponSecondary, sWeapon); + if (!strncmp(sWeapon[7], "pistol", 6) || StrEqual(sWeapon[7], "chainsaw")) + { + g_esPlayer[survivor].g_iWeaponInfo2 = GetEntProp(iSlot, Prop_Send, "m_iClip1"); + } + + g_esPlayer[survivor].g_bDualWielding = !strncmp(sWeapon[7], "pistol", 6) && GetEntProp(iSlot, Prop_Send, "m_isDualWielding") > 0; + } + + iSlot = GetPlayerWeaponSlot(survivor, 2); + if (iSlot > MaxClients) + { + GetEntityClassname(iSlot, sWeapon, sizeof sWeapon); + strcopy(g_esPlayer[survivor].g_sWeaponThrowable, sizeof esPlayer::g_sWeaponThrowable, sWeapon); + } + + iSlot = GetPlayerWeaponSlot(survivor, 3); + if (iSlot > MaxClients) + { + GetEntityClassname(iSlot, sWeapon, sizeof sWeapon); + strcopy(g_esPlayer[survivor].g_sWeaponMedkit, sizeof esPlayer::g_sWeaponMedkit, sWeapon); + } + + iSlot = GetPlayerWeaponSlot(survivor, 4); + if (iSlot > MaxClients) + { + GetEntityClassname(iSlot, sWeapon, sizeof sWeapon); + strcopy(g_esPlayer[survivor].g_sWeaponPills, sizeof esPlayer::g_sWeaponPills, sWeapon); + } +} + +void vSetSurvivorColor(int survivor, const char[] colors, bool apply = true, const char[] delimiter = ";", bool save = false) +{ + if ((g_esGeneral.g_iGraphicsLevel <= 0 && g_esGeneral.g_cvMTGraphicsLevel.IntValue <= 0) || (!save && !bIsDeveloper(survivor, 1))) + { + return; + } + + char sColor[64]; + strcopy(sColor, sizeof sColor, colors); + if (StrEqual(sColor, "rainbow", false) && (g_esGeneral.g_iGraphicsLevel > 2 || g_esGeneral.g_cvMTGraphicsLevel.IntValue > 2)) + { + if (!g_esPlayer[survivor].g_bRainbowColor) + { + g_esPlayer[survivor].g_bRainbowColor = SDKHookEx(survivor, SDKHook_PreThinkPost, OnTankRainbowPreThinkPost); + } + + return; + } + + char sValue[4][4]; + vGetConfigColors(sColor, sizeof sColor, colors); + ExplodeString(sColor, delimiter, sValue, sizeof sValue, sizeof sValue[]); + + int iColor[4] = {0, 0, 0, 0}; + for (int iPos = 0; iPos < (sizeof sValue); iPos++) + { + if (sValue[iPos][0] != '\0') + { + iColor[iPos] = iGetRandomColor(StringToInt(sValue[iPos])); + } + } + + switch (apply) + { + case true: + { + switch (iColor[3] < 255) + { + case true: SetEntityRenderMode(survivor, RENDER_TRANSCOLOR); + case false: SetEntityRenderMode(survivor, RENDER_NORMAL); + } + + SetEntityRenderColor(survivor, iColor[0], iColor[1], iColor[2], iColor[3]); + } + case false: + { + SetEntityRenderMode(survivor, RENDER_NORMAL); + SetEntityRenderColor(survivor, 255, 255, 255, 255); + } + } +} + +void vSetSurvivorEffects(int survivor, int effects) +{ + if (g_esGeneral.g_iGraphicsLevel <= 2 && g_esGeneral.g_cvMTGraphicsLevel.IntValue <= 2) + { + return; + } + + if (effects & MT_ROCK_BLOOD) + { + vAttachParticle(survivor, PARTICLE_BLOOD, 0.75, 30.0); + } + + if (effects & MT_ROCK_ELECTRICITY) + { + switch (bIsValidClient(survivor, MT_CHECK_FAKECLIENT)) + { + case true: vAttachParticle(survivor, PARTICLE_ELECTRICITY, 0.75, 30.0); + case false: + { + for (int iCount = 1; iCount < 4; iCount++) + { + vAttachParticle(survivor, PARTICLE_ELECTRICITY, 0.75, (1.0 * float(iCount * 15))); + } + } + } + } + + if (effects & MT_ROCK_FIRE) + { + vAttachParticle(survivor, PARTICLE_FIRE, 0.75); + } + + if (effects & MT_ROCK_SPIT) + { + switch (g_bSecondGame) + { + case true: vAttachParticle(survivor, PARTICLE_SPIT, 0.75, 30.0); + case false: vAttachParticle(survivor, PARTICLE_BLOOD, 0.75, 30.0); + } + } +} + +void vSetSurvivorGlow(int survivor, int red, int green, int blue) { - float flPercentage = (g_esPlayer[survivor].g_flRefillPercent / 100.0); - if (flPercentage > 0.0) + if (!g_bSecondGame || (g_esGeneral.g_iGraphicsLevel <= 1 && g_esGeneral.g_cvMTGraphicsLevel.IntValue <= 1)) { - int iHealth = GetEntProp(survivor, Prop_Data, "m_iHealth"), iMaxHealth = GetEntProp(survivor, Prop_Data, "m_iMaxHealth"), - iExtraHealth = RoundToNearest(iMaxHealth * flPercentage), iFinalHealth = iClamp((iHealth + iExtraHealth), 0, iMaxHealth); + return; + } - vCheatCommand(survivor, "give", "health"); - SetEntProp(survivor, Prop_Data, "m_iHealth", iFinalHealth); + SetEntProp(survivor, Prop_Send, "m_glowColorOverride", iGetRGBColor(red, green, blue)); + SetEntProp(survivor, Prop_Send, "m_bFlashing", 0); + SetEntProp(survivor, Prop_Send, "m_nGlowRangeMin", 0); + SetEntProp(survivor, Prop_Send, "m_nGlowRange", 99999); + SetEntProp(survivor, Prop_Send, "m_iGlowType", 3); +} + +void vSetSurvivorFlashlight(int survivor, int colors[4]) +{ + if (g_esGeneral.g_iGraphicsLevel <= 1 && g_esGeneral.g_cvMTGraphicsLevel.IntValue <= 1) + { + return; + } + + if (!bIsValidEntRef(g_esPlayer[survivor].g_iFlashlight)) + { + float flOrigin[3], flAngles[3]; + GetEntPropVector(survivor, Prop_Data, "m_vecOrigin", flOrigin); + GetEntPropVector(survivor, Prop_Data, "m_angRotation", flAngles); + vFlashlightProp(survivor, flOrigin, flAngles, colors); + } + else + { + int iProp = EntRefToEntIndex(g_esPlayer[survivor].g_iFlashlight); + if (bIsValidEntity(iProp)) + { + char sColor[16]; + FormatEx(sColor, sizeof sColor, "%i %i %i %i", iGetRandomColor(colors[0]), iGetRandomColor(colors[1]), iGetRandomColor(colors[2]), iGetRandomColor(colors[3])); + DispatchKeyValue(g_esPlayer[survivor].g_iFlashlight, "_light", sColor); + } } } -void vCheckGunClipSizes(int survivor) +void vSetSurvivorLight(int survivor, const char[] colors, bool apply = true, const char[] delimiter = ";", bool save = false) { - if (g_esGeneral.g_hSDKGetMaxClip1 != null) + if ((g_esGeneral.g_iGraphicsLevel <= 1 && g_esGeneral.g_cvMTGraphicsLevel.IntValue <= 1) || (!save && !bIsDeveloper(survivor, 1))) { - int iSlot = GetPlayerWeaponSlot(survivor, 0); - if (iSlot > MaxClients) + return; + } + + char sColor[64]; + strcopy(sColor, sizeof sColor, colors); + if (StrEqual(sColor, "rainbow", false) && (g_esGeneral.g_iGraphicsLevel > 2 || g_esGeneral.g_cvMTGraphicsLevel.IntValue > 2)) + { + if (!g_esPlayer[survivor].g_bRainbowColor) { - g_esPlayer[survivor].g_iMaxClip[0] = SDKCall(g_esGeneral.g_hSDKGetMaxClip1, iSlot); + g_esPlayer[survivor].g_bRainbowColor = SDKHookEx(survivor, SDKHook_PreThinkPost, OnTankRainbowPreThinkPost); } - iSlot = GetPlayerWeaponSlot(survivor, 1); - if (iSlot > MaxClients) + return; + } + + char sValue[4][4]; + vGetConfigColors(sColor, sizeof sColor, colors); + ExplodeString(sColor, delimiter, sValue, sizeof sValue, sizeof sValue[]); + + int iColor[4] = {0, 0, 0, 0}; + for (int iPos = 0; iPos < (sizeof sValue); iPos++) + { + if (sValue[iPos][0] != '\0') { - char sWeapon[32]; - GetEntityClassname(iSlot, sWeapon, sizeof sWeapon); - if (!strncmp(sWeapon[7], "pistol", 6) || StrEqual(sWeapon[7], "chainsaw")) - { - g_esPlayer[survivor].g_iMaxClip[1] = SDKCall(g_esGeneral.g_hSDKGetMaxClip1, iSlot); - } + iColor[iPos] = iGetRandomColor(StringToInt(sValue[iPos])); } } + + switch (apply) + { + case true: vSetSurvivorFlashlight(survivor, iColor); + case false: vRemoveSurvivorLight(survivor); + } } -void vCopySurvivorStats(int oldSurvivor, int newSurvivor) +void vSetSurvivorOutline(int survivor, const char[] colors, bool apply = true, const char[] delimiter = ";", bool save = false) { - g_esPlayer[newSurvivor].g_bFallDamage = g_esPlayer[oldSurvivor].g_bFallDamage; - g_esPlayer[newSurvivor].g_bFalling = g_esPlayer[oldSurvivor].g_bFalling; - g_esPlayer[newSurvivor].g_bFallTracked = g_esPlayer[oldSurvivor].g_bFallTracked; - g_esPlayer[newSurvivor].g_bFatalFalling = g_esPlayer[oldSurvivor].g_bFatalFalling; - g_esPlayer[newSurvivor].g_bReleasedJump = g_esPlayer[oldSurvivor].g_bReleasedJump; - g_esPlayer[newSurvivor].g_bSetup = g_esPlayer[oldSurvivor].g_bSetup; - g_esPlayer[newSurvivor].g_bVomited = g_esPlayer[oldSurvivor].g_bVomited; - g_esPlayer[newSurvivor].g_sLoopingVoiceline = g_esPlayer[oldSurvivor].g_sLoopingVoiceline; - g_esPlayer[newSurvivor].g_flActionDuration = g_esPlayer[oldSurvivor].g_flActionDuration; - g_esPlayer[newSurvivor].g_flAttackBoost = g_esPlayer[oldSurvivor].g_flAttackBoost; - g_esPlayer[newSurvivor].g_flDamageBoost = g_esPlayer[oldSurvivor].g_flDamageBoost; - g_esPlayer[newSurvivor].g_flDamageResistance = g_esPlayer[oldSurvivor].g_flDamageResistance; - g_esPlayer[newSurvivor].g_flHealPercent = g_esPlayer[oldSurvivor].g_flHealPercent; - g_esPlayer[newSurvivor].g_flJumpHeight = g_esPlayer[oldSurvivor].g_flJumpHeight; - g_esPlayer[newSurvivor].g_flLastJumpTime = g_esPlayer[oldSurvivor].g_flLastJumpTime; - g_esPlayer[newSurvivor].g_flLastPushTime = g_esPlayer[oldSurvivor].g_flLastPushTime; - g_esPlayer[newSurvivor].g_flPipeBombDuration = g_esPlayer[oldSurvivor].g_flPipeBombDuration; - g_esPlayer[newSurvivor].g_flPreFallZ = g_esPlayer[oldSurvivor].g_flPreFallZ; - g_esPlayer[newSurvivor].g_flRefillPercent = g_esPlayer[oldSurvivor].g_flRefillPercent; - g_esPlayer[newSurvivor].g_flShoveDamage = g_esPlayer[oldSurvivor].g_flShoveDamage; - g_esPlayer[newSurvivor].g_flShoveRate = g_esPlayer[oldSurvivor].g_flShoveRate; - g_esPlayer[newSurvivor].g_flSpeedBoost = g_esPlayer[oldSurvivor].g_flSpeedBoost; - g_esPlayer[newSurvivor].g_iAmmoBoost = g_esPlayer[oldSurvivor].g_iAmmoBoost; - g_esPlayer[newSurvivor].g_iAmmoRegen = g_esPlayer[oldSurvivor].g_iAmmoRegen; - g_esPlayer[newSurvivor].g_iBlazeHealth = g_esPlayer[oldSurvivor].g_iBlazeHealth; - g_esPlayer[newSurvivor].g_iBunnyHop = g_esPlayer[oldSurvivor].g_iBunnyHop; - g_esPlayer[newSurvivor].g_iBurstDoors = g_esPlayer[oldSurvivor].g_iBurstDoors; - g_esPlayer[newSurvivor].g_iCleanKills = g_esPlayer[oldSurvivor].g_iCleanKills; - g_esPlayer[newSurvivor].g_iClusterBombs = g_esPlayer[oldSurvivor].g_iClusterBombs; - g_esPlayer[newSurvivor].g_iFallPasses = g_esPlayer[oldSurvivor].g_iFallPasses; - g_esPlayer[newSurvivor].g_iFriendlyFire = g_esPlayer[oldSurvivor].g_iFriendlyFire; - g_esPlayer[newSurvivor].g_iGhostBullets = g_esPlayer[oldSurvivor].g_iGhostBullets; - g_esPlayer[newSurvivor].g_iHealthRegen = g_esPlayer[oldSurvivor].g_iHealthRegen; - g_esPlayer[newSurvivor].g_iHollowpointAmmo = g_esPlayer[oldSurvivor].g_iHollowpointAmmo; - g_esPlayer[newSurvivor].g_iInextinguishableFire = g_esPlayer[oldSurvivor].g_iInextinguishableFire; - g_esPlayer[newSurvivor].g_iInfiniteAmmo = g_esPlayer[oldSurvivor].g_iInfiniteAmmo; - g_esPlayer[newSurvivor].g_iLadderActions = g_esPlayer[oldSurvivor].g_iLadderActions; - g_esPlayer[newSurvivor].g_iLaserSight = g_esPlayer[oldSurvivor].g_iLaserSight; - g_esPlayer[newSurvivor].g_iLifeLeech = g_esPlayer[oldSurvivor].g_iLifeLeech; - g_esPlayer[newSurvivor].g_iMedicalCuts = g_esPlayer[oldSurvivor].g_iMedicalCuts; - g_esPlayer[newSurvivor].g_iMeleeRange = g_esPlayer[oldSurvivor].g_iMeleeRange; - g_esPlayer[newSurvivor].g_iMidairDashesLimit = g_esPlayer[oldSurvivor].g_iMidairDashesLimit; - g_esPlayer[newSurvivor].g_iNotify = g_esPlayer[oldSurvivor].g_iNotify; - g_esPlayer[newSurvivor].g_iPrefsAccess = g_esPlayer[oldSurvivor].g_iPrefsAccess; - g_esPlayer[newSurvivor].g_iParticleEffect = g_esPlayer[oldSurvivor].g_iParticleEffect; - g_esPlayer[newSurvivor].g_iRecoilDampener = g_esPlayer[oldSurvivor].g_iRecoilDampener; - g_esPlayer[newSurvivor].g_iRegenBursts = g_esPlayer[oldSurvivor].g_iRegenBursts; - g_esPlayer[newSurvivor].g_iReviveHealth = g_esPlayer[oldSurvivor].g_iReviveHealth; - g_esPlayer[newSurvivor].g_iRewardTypes = g_esPlayer[oldSurvivor].g_iRewardTypes; - g_esPlayer[newSurvivor].g_iShovePenalty = g_esPlayer[oldSurvivor].g_iShovePenalty; - g_esPlayer[newSurvivor].g_iSledgehammerRounds = g_esPlayer[oldSurvivor].g_iSledgehammerRounds; - g_esPlayer[newSurvivor].g_iSpecialAmmo = g_esPlayer[oldSurvivor].g_iSpecialAmmo; - g_esPlayer[newSurvivor].g_iStickyGrenades = g_esPlayer[oldSurvivor].g_iStickyGrenades; - g_esPlayer[newSurvivor].g_iSyringeDarts = g_esPlayer[oldSurvivor].g_iSyringeDarts; - g_esPlayer[newSurvivor].g_iThorns = g_esPlayer[oldSurvivor].g_iThorns; - g_esPlayer[newSurvivor].g_iVoicePitch = g_esPlayer[oldSurvivor].g_iVoicePitch; - g_esPlayer[newSurvivor].g_sBodyColor = g_esPlayer[oldSurvivor].g_sBodyColor; - g_esPlayer[newSurvivor].g_sLightColor = g_esPlayer[oldSurvivor].g_sLightColor; - g_esPlayer[newSurvivor].g_sOutlineColor = g_esPlayer[oldSurvivor].g_sOutlineColor; - g_esPlayer[newSurvivor].g_sScreenColor = g_esPlayer[oldSurvivor].g_sScreenColor; - - for (int iPos = 0; iPos < (sizeof esPlayer::g_flRewardTime); iPos++) + if (!g_bSecondGame || (g_esGeneral.g_iGraphicsLevel <= 1 && g_esGeneral.g_cvMTGraphicsLevel.IntValue <= 1) || (!save && !bIsDeveloper(survivor, 1))) { - g_esPlayer[newSurvivor].g_flRewardTime[iPos] = g_esPlayer[oldSurvivor].g_flRewardTime[iPos]; - g_esPlayer[newSurvivor].g_iRewardStack[iPos] = g_esPlayer[oldSurvivor].g_iRewardStack[iPos]; + return; + } - if (iPos < (sizeof esPlayer::g_flVisualTime)) + char sColor[64]; + strcopy(sColor, sizeof sColor, colors); + if (StrEqual(sColor, "rainbow", false) && (g_esGeneral.g_iGraphicsLevel > 2 || g_esGeneral.g_cvMTGraphicsLevel.IntValue > 2)) + { + if (!g_esPlayer[survivor].g_bRainbowColor) { - g_esPlayer[newSurvivor].g_flVisualTime[iPos] = g_esPlayer[oldSurvivor].g_flVisualTime[iPos]; + g_esPlayer[survivor].g_bRainbowColor = SDKHookEx(survivor, SDKHook_PreThinkPost, OnTankRainbowPreThinkPost); } - if (iPos < (sizeof esPlayer::g_iScreenColorVisual)) + return; + } + + char sValue[3][4]; + vGetConfigColors(sColor, sizeof sColor, colors); + ExplodeString(sColor, delimiter, sValue, sizeof sValue, sizeof sValue[]); + + int iColor[3]; + for (int iPos = 0; iPos < (sizeof sValue); iPos++) + { + if (sValue[iPos][0] != '\0') { - g_esPlayer[newSurvivor].g_iScreenColorVisual[iPos] = g_esPlayer[oldSurvivor].g_iScreenColorVisual[iPos]; + iColor[iPos] = iGetRandomColor(StringToInt(sValue[iPos])); } } - for (int iTank = 1; iTank <= MaxClients; iTank++) + switch (apply) { - g_esPlayer[newSurvivor].g_iTankDamage[iTank] = g_esPlayer[oldSurvivor].g_iTankDamage[iTank]; + case true: vSetSurvivorGlow(survivor, iColor[0], iColor[1], iColor[2]); + case false: vRemovePlayerGlow(survivor); } +} - if (g_esPlayer[oldSurvivor].g_bRainbowColor) +void vSetSurvivorParticle(int survivor) +{ + if (!g_esDeveloper[survivor].g_bDevVisual && (g_esGeneral.g_iGraphicsLevel > 2 || g_esGeneral.g_cvMTGraphicsLevel.IntValue > 2)) { - g_esPlayer[oldSurvivor].g_bRainbowColor = false; - g_esPlayer[newSurvivor].g_bRainbowColor = SDKHookEx(newSurvivor, SDKHook_PreThinkPost, OnRainbowPreThinkPost); + g_esDeveloper[survivor].g_bDevVisual = true; + + CreateTimer(0.75, tTimerDevParticle, GetClientUserId(survivor), TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); } } -void vGiveGunSpecialAmmo(int survivor) +void vSetSurvivorScreen(int survivor, const char[] colors, const char[] delimiter = ";") { - int iType = ((bIsDeveloper(survivor, 7) || bIsDeveloper(survivor, 11)) && g_esDeveloper[survivor].g_iDevSpecialAmmo > g_esPlayer[survivor].g_iSpecialAmmo) ? g_esDeveloper[survivor].g_iDevSpecialAmmo : g_esPlayer[survivor].g_iSpecialAmmo; - if (g_bSecondGame && iType > 0) + if (g_esGeneral.g_iGraphicsLevel <= 0 && g_esGeneral.g_cvMTGraphicsLevel.IntValue <= 0) { - int iSlot = GetPlayerWeaponSlot(survivor, 0); - if (iSlot > MaxClients) + return; + } + + char sColor[64]; + strcopy(sColor, sizeof sColor, colors); + if (StrEqual(sColor, "rainbow", false) && (g_esGeneral.g_iGraphicsLevel > 2 || g_esGeneral.g_cvMTGraphicsLevel.IntValue > 2)) + { + if (!g_esPlayer[survivor].g_bRainbowColor) { - int iAmmoType = GetEntProp(iSlot, Prop_Send, "m_iPrimaryAmmoType"); - if (iAmmoType != MT_L4D2_AMMOTYPE_RIFLE_M60 && iAmmoType != MT_L4D2_AMMOTYPE_GRENADE_LAUNCHER) - { - int iUpgrades = GetEntProp(iSlot, Prop_Send, "m_upgradeBitVec"); + g_esPlayer[survivor].g_bRainbowColor = SDKHookEx(survivor, SDKHook_PreThinkPost, OnTankRainbowPreThinkPost); + } - switch (iType) - { - case 1: iUpgrades = (iUpgrades & MT_UPGRADE_LASERSIGHT) ? MT_UPGRADE_LASERSIGHT|MT_UPGRADE_INCENDIARY : MT_UPGRADE_INCENDIARY; - case 2: iUpgrades = (iUpgrades & MT_UPGRADE_LASERSIGHT) ? MT_UPGRADE_LASERSIGHT|MT_UPGRADE_EXPLOSIVE : MT_UPGRADE_EXPLOSIVE; - case 3: - { - int iSpecialAmmo = (MT_GetRandomInt(1, 2) == 2) ? MT_UPGRADE_INCENDIARY : MT_UPGRADE_EXPLOSIVE; - iUpgrades = (iUpgrades & MT_UPGRADE_LASERSIGHT) ? MT_UPGRADE_LASERSIGHT|iSpecialAmmo : iSpecialAmmo; - } - } + return; + } - SetEntProp(iSlot, Prop_Send, "m_upgradeBitVec", iUpgrades); - SetEntProp(iSlot, Prop_Send, "m_nUpgradedPrimaryAmmoLoaded", GetEntProp(iSlot, Prop_Send, "m_iClip1")); + char sValue[4][4]; + ExplodeString(sColor, delimiter, sValue, sizeof sValue, sizeof sValue[]); + for (int iPos = 0; iPos < (sizeof sValue); iPos++) + { + if (sValue[iPos][0] != '\0') + { + g_esPlayer[survivor].g_iScreenColorVisual[iPos] = iGetRandomColor(StringToInt(sValue[iPos])); + } + } +} + +void vSetSurvivorWeaponSkin(int developer) +{ + if (g_esGeneral.g_iGraphicsLevel <= 0 && g_esGeneral.g_cvMTGraphicsLevel.IntValue <= 0) + { + return; + } + + int iActiveWeapon = iGetSurvivorActiveWeapon(developer); + if (bIsValidEntity(iActiveWeapon)) + { + int iSkin = iClamp(g_esDeveloper[developer].g_iDevWeaponSkin, -1, iGetMaxWeaponSkins(developer)); + if (iSkin != -1 && iSkin != GetEntProp(iActiveWeapon, Prop_Send, "m_nSkin")) + { + SetEntProp(iActiveWeapon, Prop_Send, "m_nSkin", iSkin); + + int iViewWeapon = GetEntPropEnt(developer, Prop_Send, "m_hViewModel"); + if (bIsValidEntity(iViewWeapon)) + { + SetEntProp(iViewWeapon, Prop_Send, "m_nSkin", iSkin); } } } } -void vGiveSurvivorRandomMeleeWeapon(int survivor, bool specific, const char[] name = "") +void vSetupAdmin(int admin, const char[] keyword, const char[] value) { - if (specific) + if ((StrContains(keyword, "effect", false) != -1 || StrContains(keyword, "particle", false) != -1) && (g_esGeneral.g_iGraphicsLevel > 2 || g_esGeneral.g_cvMTGraphicsLevel.IntValue > 2)) { - vCheatCommand(survivor, "give", ((name[0] != '\0') ? name : "machete")); + g_esDeveloper[admin].g_iDevParticle = iClamp(StringToInt(value), 0, 15); - if (GetPlayerWeaponSlot(survivor, 1) > MaxClients) + switch (StringToInt(value) == 0) { - return; + case true: g_esDeveloper[admin].g_bDevVisual = false; + case false: vSetSurvivorParticle(admin); } - - vGiveSurvivorRandomMeleeWeapon(survivor, false); +#if defined _clientprefs_included + g_esGeneral.g_ckMTAdmin[1].Set(admin, value); +#endif } - else + else if ((StrContains(keyword, "glow", false) != -1 || StrContains(keyword, "outline", false) != -1) && (g_esGeneral.g_iGraphicsLevel > 1 || g_esGeneral.g_cvMTGraphicsLevel.IntValue > 1)) { - char sName[32]; - for (int iType = 1; iType < 13; iType++) + switch (StrEqual(value, "0")) { - if (GetPlayerWeaponSlot(survivor, 1) > MaxClients) + case true: { - break; - } + g_esDeveloper[admin].g_sDevGlowOutline[0] = '\0'; - switch (iType) + vToggleSurvivorEffects(admin, true, 6); + } + case false: { - case 1: sName = "machete"; - case 2: sName = "katana"; - case 3: sName = "fireaxe"; - case 4: sName = "shovel"; - case 5: sName = "baseball_bat"; - case 6: sName = "cricket_bat"; - case 7: sName = "golfclub"; - case 8: sName = "electric_guitar"; - case 9: sName = "frying_pan"; - case 10: sName = "tonfa"; - case 11: sName = "crowbar"; - case 12: sName = "knife"; - case 13: sName = "pitchfork"; + strcopy(g_esDeveloper[admin].g_sDevGlowOutline, sizeof esDeveloper::g_sDevGlowOutline, value); + vSetSurvivorOutline(admin, g_esDeveloper[admin].g_sDevGlowOutline, .delimiter = ","); } - - vCheatCommand(survivor, "give", sName); } +#if defined _clientprefs_included + g_esGeneral.g_ckMTAdmin[2].Set(admin, value); +#endif } -} - -void vGiveSurvivorWeapons(int survivor) -{ - int iSlot = 0; - if (g_esPlayer[survivor].g_sWeaponPrimary[0] != '\0') + else if ((StrContains(keyword, "light", false) != -1 || StrContains(keyword, "flash", false) != -1) && (g_esGeneral.g_iGraphicsLevel > 1 || g_esGeneral.g_cvMTGraphicsLevel.IntValue > 1)) { - vCheatCommand(survivor, "give", g_esPlayer[survivor].g_sWeaponPrimary); - - iSlot = GetPlayerWeaponSlot(survivor, 0); - if (iSlot > MaxClients) + switch (StrEqual(value, "0")) { - SetEntProp(iSlot, Prop_Send, "m_iClip1", g_esPlayer[survivor].g_iWeaponInfo[0]); - SetEntProp(survivor, Prop_Send, "m_iAmmo", g_esPlayer[survivor].g_iWeaponInfo[1], .element = iGetWeaponOffset(iSlot)); - - if (g_bSecondGame) + case true: { - if (g_esPlayer[survivor].g_iWeaponInfo[2] > 0) - { - SetEntProp(iSlot, Prop_Send, "m_upgradeBitVec", g_esPlayer[survivor].g_iWeaponInfo[2]); - } + g_esDeveloper[admin].g_sDevFlashlight[0] = '\0'; - if (g_esPlayer[survivor].g_iWeaponInfo[3] > 0) - { - SetEntProp(iSlot, Prop_Send, "m_nUpgradedPrimaryAmmoLoaded", g_esPlayer[survivor].g_iWeaponInfo[3]); - } + vToggleSurvivorEffects(admin, true, 4); + } + case false: + { + strcopy(g_esDeveloper[admin].g_sDevFlashlight, sizeof esDeveloper::g_sDevFlashlight, value); + vSetSurvivorLight(admin, g_esDeveloper[admin].g_sDevFlashlight, .delimiter = ","); } } +#if defined _clientprefs_included + g_esGeneral.g_ckMTAdmin[3].Set(admin, value); +#endif } - - if (g_esPlayer[survivor].g_sWeaponSecondary[0] != '\0') + else if ((StrContains(keyword, "skin", false) != -1 || StrContains(keyword, "color", false) != -1) && (g_esGeneral.g_iGraphicsLevel > 0 || g_esGeneral.g_cvMTGraphicsLevel.IntValue > 0)) { - switch (g_esPlayer[survivor].g_bDualWielding) + switch (StrEqual(value, "0")) { case true: { - vCheatCommand(survivor, "give", "weapon_pistol"); - vCheatCommand(survivor, "give", "weapon_pistol"); - } - case false: vCheatCommand(survivor, "give", g_esPlayer[survivor].g_sWeaponSecondary); - } + g_esDeveloper[admin].g_sDevSkinColor[0] = '\0'; - iSlot = GetPlayerWeaponSlot(survivor, 1); - if (iSlot > MaxClients && g_esPlayer[survivor].g_iWeaponInfo2 != -1) - { - SetEntProp(iSlot, Prop_Send, "m_iClip1", g_esPlayer[survivor].g_iWeaponInfo2); + vToggleSurvivorEffects(admin, true, 5); + } + case false: + { + strcopy(g_esDeveloper[admin].g_sDevSkinColor, sizeof esDeveloper::g_sDevSkinColor, value); + vSetSurvivorColor(admin, g_esDeveloper[admin].g_sDevSkinColor, .delimiter = ","); + } } +#if defined _clientprefs_included + g_esGeneral.g_ckMTAdmin[4].Set(admin, value); +#endif } - - if (g_esPlayer[survivor].g_sWeaponThrowable[0] != '\0') - { - vCheatCommand(survivor, "give", g_esPlayer[survivor].g_sWeaponThrowable); - } - - if (g_esPlayer[survivor].g_sWeaponMedkit[0] != '\0') - { - vCheatCommand(survivor, "give", g_esPlayer[survivor].g_sWeaponMedkit); - } - - if (g_esPlayer[survivor].g_sWeaponPills[0] != '\0') - { - vCheatCommand(survivor, "give", g_esPlayer[survivor].g_sWeaponPills); - } - - for (int iPos = 0; iPos < (sizeof esPlayer::g_iWeaponInfo); iPos++) + else if (StrContains(keyword, "voice", false) != -1 || StrContains(keyword, "pitch", false) != -1) { - g_esPlayer[survivor].g_iWeaponInfo[iPos] = 0; + g_esDeveloper[admin].g_iDevVoicePitch = iClamp(StringToInt(value), 0, 255); +#if defined _clientprefs_included + g_esGeneral.g_ckMTAdmin[5].Set(admin, value); +#endif } - g_esPlayer[survivor].g_iWeaponInfo2 = -1; - g_esPlayer[survivor].g_sWeaponPrimary[0] = '\0'; - g_esPlayer[survivor].g_sWeaponSecondary[0] = '\0'; - g_esPlayer[survivor].g_sWeaponThrowable[0] = '\0'; - g_esPlayer[survivor].g_sWeaponMedkit[0] = '\0'; - g_esPlayer[survivor].g_sWeaponPills[0] = '\0'; + vAdminPanel(admin); } -void vRefillGunAmmo(int survivor, bool all = false, bool reset = false, bool override = false) +void vSetupDeveloper(int developer, bool setup = true, bool usual = false) { - int iSetting = (bIsDeveloper(survivor, 7) && g_esDeveloper[survivor].g_iDevInfiniteAmmo > g_esPlayer[survivor].g_iInfiniteAmmo) ? g_esDeveloper[survivor].g_iDevInfiniteAmmo : g_esPlayer[survivor].g_iInfiniteAmmo; - iSetting = all ? iSetting : 0; + Action aResult = Plugin_Continue; + vRewardSurvivorForward(developer, 0, g_esDeveloper[developer].g_iDevRewardTypes, 0, g_esDeveloper[developer].g_flDevRewardDuration, setup, aResult); + vToggleSurvivorPassiveForward(developer, g_esDeveloper[developer].g_iDevPassiveTypes, setup, false, -1, aResult); - int iSlot = 0; - if (!all || (iSetting > 0 && (iSetting & MT_INFAMMO_PRIMARY))) + if (setup) { - iSlot = GetPlayerWeaponSlot(survivor, 0); - if (iSlot > MaxClients) + if (bIsSurvivor(developer)) { - int iMaxClip = reset ? iGetMaxAmmo(survivor, 0, iSlot, false, true) : g_esPlayer[survivor].g_iMaxClip[0]; - if (override || !reset || (reset && GetEntProp(iSlot, Prop_Send, "m_iClip1") >= iMaxClip)) + vSetupLoadout(developer, usual); + vRefreshLaserSight(developer); + vGiveGunSpecialAmmo(developer); + vCheckGunClipSizes(developer); + + if (bIsDeveloper(developer, 1)) { - SetEntProp(iSlot, Prop_Send, "m_iClip1", iMaxClip); + vSetSurvivorLight(developer, g_esDeveloper[developer].g_sDevFlashlight, .delimiter = ","); + vSetSurvivorOutline(developer, g_esDeveloper[developer].g_sDevGlowOutline, .delimiter = ","); + vSetSurvivorColor(developer, g_esDeveloper[developer].g_sDevSkinColor, .delimiter = ","); + vSetSurvivorParticle(developer); + } + else if (g_esDeveloper[developer].g_bDevVisual) + { + g_esDeveloper[developer].g_bDevVisual = false; - if (g_bSecondGame) + vToggleSurvivorEffects(developer); + } + + bool bDeveloper = (bIsDeveloper(developer, 4) || (((g_esShooter[developer].g_iTotalPassives & MT_PASSIVE_DAMAGEBOOST) || (g_esPlayer[developer].g_iRewardTypes & MT_REWARD_DAMAGEBOOST)) && g_esPlayer[developer].g_iRecoilDampener == 1)); + vToggleWeaponVerticalPunch(developer, bDeveloper); + + bDeveloper = bIsDeveloper(developer, 5); + + switch (bDeveloper || (((g_esShooter[developer].g_iTotalPassives & MT_PASSIVE_SPEEDBOOST) || (g_esPlayer[developer].g_iRewardTypes & MT_REWARD_SPEEDBOOST)) && g_esPlayer[developer].g_flSpeedBoost > 0.0)) + { + case true: SDKHook(developer, SDKHook_PreThinkPost, OnSpeedPreThinkPost); + case false: { - int iUpgrades = GetEntProp(iSlot, Prop_Send, "m_upgradeBitVec"); - if ((iUpgrades & MT_UPGRADE_INCENDIARY) || (iUpgrades & MT_UPGRADE_EXPLOSIVE)) - { - SetEntProp(iSlot, Prop_Send, "m_nUpgradedPrimaryAmmoLoaded", iMaxClip); - } + SDKUnhook(developer, SDKHook_PreThinkPost, OnSpeedPreThinkPost); + SetEntPropFloat(developer, Prop_Send, "m_flLaggedMovementValue", (g_esGeneral.g_bLaggedMovementInstalled ? L4D_LaggedMovement(developer, 1.0, true) : 1.0)); } } - vRefillGunMagazine(survivor, iSlot, reset, override); - } - } - - if (!all || (iSetting > 0 && (iSetting & MT_INFAMMO_SECONDARY))) - { - iSlot = GetPlayerWeaponSlot(survivor, 1); - if (iSlot > MaxClients) - { - char sWeapon[32]; - GetEntityClassname(iSlot, sWeapon, sizeof sWeapon); - if ((!strncmp(sWeapon[7], "pistol", 6) || StrEqual(sWeapon[7], "chainsaw")) && (override || !reset || (reset && GetEntProp(iSlot, Prop_Send, "m_iClip1") >= g_esPlayer[survivor].g_iMaxClip[1]))) + switch (bDeveloper || (((g_esShooter[developer].g_iTotalPassives & MT_PASSIVE_SPEEDBOOST) || (g_esPlayer[developer].g_iRewardTypes & MT_REWARD_SPEEDBOOST)) && g_esPlayer[developer].g_flAdrenalineTime > 0.0)) { - SetEntProp(iSlot, Prop_Send, "m_iClip1", g_esPlayer[survivor].g_iMaxClip[1]); + case true: + { + float flDuration = (bDeveloper && g_esDeveloper[developer].g_flDevAdrenalineTime > g_esPlayer[developer].g_flAdrenalineTime) ? g_esDeveloper[developer].g_flDevAdrenalineTime : g_esPlayer[developer].g_flAdrenalineTime; + vSetAdrenalineTime(developer, flDuration); + } + case false: vSetAdrenalineTime(developer, 0.0); } - } - } - if (all && iSetting > 0) - { - iSlot = GetPlayerWeaponSlot(survivor, 2); - if (!bIsValidEntity(iSlot) && (iSetting & MT_INFAMMO_THROWABLE)) - { - vCheatCommand(survivor, "give", g_esPlayer[survivor].g_sStoredThrowable); - } + switch (bIsDeveloper(developer, 6) || (((g_esShooter[developer].g_iTotalPassives & MT_PASSIVE_ATTACKBOOST) || (g_esPlayer[developer].g_iRewardTypes & MT_REWARD_ATTACKBOOST)) && g_esPlayer[developer].g_iFastRecovery == 1)) + { + case true: SDKHook(developer, SDKHook_PostThinkPost, OnSurvivorPostThinkPost); + case false: SDKUnhook(developer, SDKHook_PostThinkPost, OnSurvivorPostThinkPost); + } - iSlot = GetPlayerWeaponSlot(survivor, 3); - if (!bIsValidEntity(iSlot) && (iSetting & MT_INFAMMO_MEDKIT)) - { - vCheatCommand(survivor, "give", g_esPlayer[survivor].g_sStoredMedkit); - } + if (bIsDeveloper(developer, 11) || (((g_esShooter[developer].g_iTotalPassives & MT_PASSIVE_GODMODE) || (g_esPlayer[developer].g_iRewardTypes & MT_REWARD_GODMODE)) && g_esPlayer[developer].g_iSafetyBubble == 1)) + { + if (g_esPlayer[developer].g_bVomited) + { + vUnvomitPlayer(developer); + } - iSlot = GetPlayerWeaponSlot(survivor, 4); - if (!bIsValidEntity(iSlot) && (iSetting & MT_INFAMMO_PILLS)) - { - vCheatCommand(survivor, "give", g_esPlayer[survivor].g_sStoredPills); + vSaveCaughtSurvivor(developer); + } } } -} - -void vRefillGunMagazine(int survivor, int weapon, bool reset, bool override) -{ - int iAmmoOffset = iGetWeaponOffset(weapon), iNewAmmo = 0; - - switch (override || !reset) + else if (bIsValidClient(developer)) { - case true: iNewAmmo = iGetMaxAmmo(survivor, 0, weapon, true, reset); - case false: + vToggleWeaponVerticalPunch(developer, false); + SDKUnhook(developer, SDKHook_PreThinkPost, OnSpeedPreThinkPost); + SDKUnhook(developer, SDKHook_PostThinkPost, OnSurvivorPostThinkPost); + + if (bIsValidClient(developer, MT_CHECK_ALIVE)) { - int iMaxAmmo = iGetMaxAmmo(survivor, 0, weapon, true, reset); - if (GetEntProp(survivor, Prop_Send, "m_iAmmo", .element = iAmmoOffset) > iMaxAmmo) + if (g_esDeveloper[developer].g_bDevVisual) { - iNewAmmo = iMaxAmmo; + vToggleSurvivorEffects(developer); } - } - } - - if (iNewAmmo > 0) - { - SetEntProp(survivor, Prop_Send, "m_iAmmo", iNewAmmo, .element = iAmmoOffset); - } -} -void vRefillSurvivorHealth(int survivor) -{ - if (bIsSurvivorDisabled(survivor) || GetEntProp(survivor, Prop_Data, "m_iHealth") < GetEntProp(survivor, Prop_Data, "m_iMaxHealth")) - { - int iMode = GetEntProp(survivor, Prop_Data, "m_takedamage", 1); - if (iMode != 2) - { - SetEntProp(survivor, Prop_Data, "m_takedamage", 2, 1); - vAddSurvivorHealth(survivor); - SetEntProp(survivor, Prop_Data, "m_takedamage", iMode, 1); - } - else - { - vAddSurvivorHealth(survivor); - } + if (!(g_esShooter[developer].g_iTotalPassives & MT_PASSIVE_SPEEDBOOST) && !(g_esPlayer[developer].g_iRewardTypes & MT_REWARD_SPEEDBOOST)) + { + vSetAdrenalineTime(developer, 0.0); + SetEntPropFloat(developer, Prop_Send, "m_flLaggedMovementValue", (g_esGeneral.g_bLaggedMovementInstalled ? L4D_LaggedMovement(developer, 1.0, true) : 1.0)); + } - g_esPlayer[survivor].g_bLastLife[0] = false; - g_esPlayer[survivor].g_iReviveCount = 0; - } -} + vCheckGunClipSizes(developer); -void vRefreshLaserSight(int survivor) -{ - if (g_esPlayer[survivor].g_bCustomLaser || bIsDeveloper(survivor, 3) || ((g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_DAMAGEBOOST) && g_esPlayer[survivor].g_iLaserSight == 1)) - { - if (!g_bSecondGame) - { - int iUpgrades = GetEntProp(survivor, Prop_Send, "m_upgradeBitVec"), iBit = (iUpgrades & ~(1 << 17)); - if (iUpgrades != iBit) + if (!(g_esShooter[developer].g_iTotalPassives & MT_PASSIVE_AMMO) && !(g_esPlayer[developer].g_iRewardTypes & MT_REWARD_AMMO)) { - SetEntProp(survivor, Prop_Send, "m_upgradeBitVec", iBit, 4); + vRefillGunAmmo(developer, .reset = true); } } - vSetupLaserSight(survivor, true); - } -} - -void vRemoveLaserSight(int survivor) -{ - if (!g_bSecondGame) - { - SetEntProp(survivor, Prop_Send, "m_upgradeBitVec", 0, 4); + g_esDeveloper[developer].g_bDevVisual = false; } - - vSetupLaserSight(survivor, false); } -void vRemoveSurvivorEffects(int survivor, bool body = false) +void vSetupGuest(int guest, const char[] keyword, const char[] code, const char[] section = "", const char[] subsection = "", const char[] specsection = "", const char[] key = "", const char[] value = "") { - int iEffect = -1; - for (int iPos = 0; iPos < (sizeof esPlayer::g_iEffect); iPos++) + bool bPanel = false; + if (StrContains(keyword, "access", false) != -1 || StrContains(keyword, "dev", false) != -1 || StrContains(keyword, "level", false) != -1) { - iEffect = g_esPlayer[survivor].g_iEffect[iPos]; - if (bIsValidEntRef(iEffect)) - { - RemoveEntity(iEffect); - } + bPanel = true; + g_esDeveloper[guest].g_iDevAccess = iClamp(StringToInt(code), 0, MT_DEV_MAXLEVEL); - g_esPlayer[survivor].g_iEffect[iPos] = INVALID_ENT_REFERENCE; + vSetupDeveloper(guest, (g_esDeveloper[guest].g_iDevAccess > 0), true); } - - if (body || bIsValidClient(survivor)) + else if (StrContains(keyword, "action", false) != -1 || StrContains(keyword, "actdur", false) != -1) { - vRemovePlayerGlow(survivor); - vRemoveSurvivorLight(survivor); - SetEntityRenderMode(survivor, RENDER_NORMAL); - SetEntityRenderColor(survivor, 255, 255, 255, 255); + bPanel = true; + g_esDeveloper[guest].g_flDevActionDuration = flClamp(StringToFloat(code)); } - - SDKUnhook(survivor, SDKHook_PostThinkPost, OnTankPostThinkPost); -} - -void vRemoveSurvivorLight(int survivor) -{ - if (bIsValidEntRef(g_esPlayer[survivor].g_iFlashlight)) + else if (StrContains(keyword, "adrenaline", false) != -1 || StrContains(keyword, "shot", false) != -1) { - int iProp = EntRefToEntIndex(g_esPlayer[survivor].g_iFlashlight); - if (bIsValidEntity(iProp)) - { - RemoveEntity(iProp); - } + bPanel = true; + g_esDeveloper[guest].g_flDevAdrenalineTime = flClamp(StringToFloat(code)); - g_esPlayer[survivor].g_iFlashlight = INVALID_ENT_REFERENCE; + vSetAdrenalineTime(guest, g_esDeveloper[guest].g_flDevAdrenalineTime); } -} - -void vResetSurvivorStats(int survivor, bool all) -{ - g_esDeveloper[survivor].g_bDevVisual = false; - g_esPlayer[survivor].g_bFallDamage = false; - g_esPlayer[survivor].g_bFalling = false; - g_esPlayer[survivor].g_bFallTracked = false; - g_esPlayer[survivor].g_bFatalFalling = false; - g_esPlayer[survivor].g_bRainbowColor = false; - g_esPlayer[survivor].g_bReleasedJump = false; - g_esPlayer[survivor].g_bVomited = false; - g_esPlayer[survivor].g_sLoopingVoiceline[0] = '\0'; - g_esPlayer[survivor].g_flActionDuration = 0.0; - g_esPlayer[survivor].g_flAttackBoost = 0.0; - g_esPlayer[survivor].g_flDamageBoost = 0.0; - g_esPlayer[survivor].g_flDamageResistance = 0.0; - g_esPlayer[survivor].g_flHealPercent = 0.0; - g_esPlayer[survivor].g_flJumpHeight = 0.0; - g_esPlayer[survivor].g_flLastJumpTime = 0.0; - g_esPlayer[survivor].g_flLastPushTime = 0.0; - g_esPlayer[survivor].g_flPipeBombDuration = 0.0; - g_esPlayer[survivor].g_flPreFallZ = 0.0; - g_esPlayer[survivor].g_flRefillPercent = 0.0; - g_esPlayer[survivor].g_flShoveDamage = 0.0; - g_esPlayer[survivor].g_flShoveRate = 0.0; - g_esPlayer[survivor].g_flSpeedBoost = 0.0; - g_esPlayer[survivor].g_iAmmoBoost = 0; - g_esPlayer[survivor].g_iAmmoRegen = 0; - g_esPlayer[survivor].g_iBlazeHealth = 0; - g_esPlayer[survivor].g_iBunnyHop = 0; - g_esPlayer[survivor].g_iBurstDoors = 0; - g_esPlayer[survivor].g_iCleanKills = 0; - g_esPlayer[survivor].g_iClusterBombs = 0; - g_esPlayer[survivor].g_iFallPasses = 0; - g_esPlayer[survivor].g_iFriendlyFire = 0; - g_esPlayer[survivor].g_iGhostBullets = 0; - g_esPlayer[survivor].g_iHealthRegen = 0; - g_esPlayer[survivor].g_iHollowpointAmmo = 0; - g_esPlayer[survivor].g_iInextinguishableFire = 0; - g_esPlayer[survivor].g_iInfiniteAmmo = 0; - g_esPlayer[survivor].g_iLadderActions = 0; - g_esPlayer[survivor].g_iLaserSight = 0; - g_esPlayer[survivor].g_iLifeLeech = 0; - g_esPlayer[survivor].g_iMedicalCuts = 0; - g_esPlayer[survivor].g_iMeleeRange = 0; - g_esPlayer[survivor].g_iMidairDashesLimit = 0; - g_esPlayer[survivor].g_iNotify = 0; - g_esPlayer[survivor].g_iPrefsAccess = 0; - g_esPlayer[survivor].g_iParticleEffect = 0; - g_esPlayer[survivor].g_iRecoilDampener = 0; - g_esPlayer[survivor].g_iRegenBursts = 0; - g_esPlayer[survivor].g_iReviveHealth = 0; - g_esPlayer[survivor].g_iRewardTypes = 0; - g_esPlayer[survivor].g_iShovePenalty = 0; - g_esPlayer[survivor].g_iSledgehammerRounds = 0; - g_esPlayer[survivor].g_iSpecialAmmo = 0; - g_esPlayer[survivor].g_iStickyGrenades = 0; - g_esPlayer[survivor].g_iSyringeDarts = 0; - g_esPlayer[survivor].g_iThorns = 0; - g_esPlayer[survivor].g_iVoicePitch = 0; - g_esPlayer[survivor].g_sBodyColor[0] = '\0'; - g_esPlayer[survivor].g_sLightColor[0] = '\0'; - g_esPlayer[survivor].g_sOutlineColor[0] = '\0'; - g_esPlayer[survivor].g_sScreenColor[0] = '\0'; - - if (all) + else if (StrContains(keyword, "ammoregen", false) != -1 || StrContains(keyword, "regenammo", false) != -1) { - g_esPlayer[survivor].g_bSetup = false; + bPanel = true; + g_esDeveloper[guest].g_iDevAmmoRegen = iClamp(StringToInt(code)); } - - for (int iPos = 0; iPos < (sizeof esPlayer::g_flRewardTime); iPos++) + else if (StrContains(keyword, "attack", false) != -1) { - g_esPlayer[survivor].g_flRewardTime[iPos] = -1.0; - g_esPlayer[survivor].g_iRewardStack[iPos] = 0; - - if (iPos < (sizeof esPlayer::g_flVisualTime)) - { - g_esPlayer[survivor].g_flVisualTime[iPos] = -1.0; - } - - if (iPos < (sizeof esPlayer::g_iScreenColorVisual)) - { - g_esPlayer[survivor].g_iScreenColorVisual[iPos] = -1; - } + bPanel = true; + g_esDeveloper[guest].g_flDevAttackBoost = flClamp(StringToFloat(code)); } -} - -void vResetSurvivorStats2(int survivor) -{ - if (g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_REFILL) + else if (StrContains(keyword, "blazehp", false) != -1 || StrContains(keyword, "firehp", false) != -1) { - g_esPlayer[survivor].g_iRewardTypes &= ~MT_REWARD_REFILL; + bPanel = true; + g_esDeveloper[guest].g_iDevBlazeHealth = iClamp(StringToInt(code), MT_MAX_HEALTH_REDUCTION, MT_MAXHEALTH); } - - if (g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_ITEM) + else if (StrContains(keyword, "cluster", false) != -1 || StrContains(keyword, "bomb", false) != -1) { - g_esPlayer[survivor].g_iRewardTypes &= ~MT_REWARD_ITEM; + bPanel = true; + g_esDeveloper[guest].g_iDevClusterBombs = iClamp(StringToInt(code), 0, 5); } - - if (g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_RESPAWN) + else if (StrContains(keyword, "dmgboost", false) != -1 || StrContains(keyword, "damageboost", false) != -1) { - g_esPlayer[survivor].g_iRewardTypes &= ~MT_REWARD_RESPAWN; + bPanel = true; + g_esDeveloper[guest].g_flDevDamageBoost = flClamp(StringToFloat(code)); } -} - -void vRespawnSurvivor(int survivor) -{ - static int iIndex = -1; - if (iIndex == -1) + else if (StrContains(keyword, "dmgres", false) != -1 || StrContains(keyword, "damageres", false) != -1) { - iIndex = iGetPatchIndex("MTPatch_RespawnStats"); + bPanel = true; + g_esDeveloper[guest].g_flDevDamageResistance = flClamp(StringToFloat(code), 0.0, 0.99); } - - if (iIndex != -1) + else if (StrContains(keyword, "defib", false) != -1 || StrContains(keyword, "shock", false) != -1) { - vInstallPatch(iIndex); + bPanel = true; + g_esDeveloper[guest].g_flDevShockwaveRadius = flClamp(StringToFloat(code), 0.0, 99999.0); } - - if (g_esGeneral.g_hSDKRoundRespawn != null) + else if (StrContains(keyword, "dopamine", false) != -1 || StrContains(keyword, "rush", false) != -1) { - SDKCall(g_esGeneral.g_hSDKRoundRespawn, survivor); + bPanel = true; + g_esDeveloper[guest].g_flDevDopamineRadius = flClamp(StringToFloat(code), 0.0, 99999.0); } - - if (iIndex != -1) + else if (StrContains(keyword, "effect", false) != -1 || StrContains(keyword, "particle", false) != -1) { - vRemovePatch(iIndex); + bPanel = true; + g_esDeveloper[guest].g_iDevParticle = iClamp(StringToInt(code), 0, 15); } -} + else if (StrContains(keyword, "fall", false) != -1 || StrContains(keyword, "scream", false) != -1) + { + bPanel = true; -void vReviveSurvivor(int survivor) -{ - if (!bIsSurvivorDisabled(survivor)) + strcopy(g_esDeveloper[guest].g_sDevFallVoiceline, sizeof esDeveloper::g_sDevFallVoiceline, code); + } + else if (StrContains(keyword, "firerate", false) != -1 || StrContains(keyword, "frate", false) != -1) { - return; + bPanel = true; + g_esDeveloper[guest].g_flDevFireRate = flClamp(StringToFloat(code)); } + else if (StrContains(keyword, "glow", false) != -1 || StrContains(keyword, "outline", false) != -1) + { + bPanel = true; - if (g_esGeneral.g_hSDKRevive != null) + strcopy(g_esDeveloper[guest].g_sDevGlowOutline, sizeof esDeveloper::g_sDevGlowOutline, code); + vSetSurvivorOutline(guest, g_esDeveloper[guest].g_sDevGlowOutline, .delimiter = ","); + } + else if (StrContains(keyword, "grenade", false) != -1 || StrContains(keyword, "launcher", false) != -1) { - SDKCall(g_esGeneral.g_hSDKRevive, survivor); - StopSound(survivor, SNDCHAN_STATIC, SOUND_HEARTBEAT); + bPanel = true; + g_esDeveloper[guest].g_flDevGrenadeLauncher = flClamp(StringToFloat(code), 0.0, 100.0); } -} - -void vSaveCaughtSurvivor(int survivor, int special = 0) -{ - int iSpecial = special; - iSpecial = (iSpecial <= 0) ? GetEntPropEnt(survivor, Prop_Send, "m_pounceAttacker") : iSpecial; - iSpecial = (iSpecial <= 0) ? GetEntPropEnt(survivor, Prop_Send, "m_tongueOwner") : iSpecial; - if (g_bSecondGame) + else if (StrContains(keyword, "healper", false) != -1 || StrContains(keyword, "hppercent", false) != -1) { - iSpecial = (iSpecial <= 0) ? GetEntPropEnt(survivor, Prop_Send, "m_pummelAttacker") : iSpecial; - iSpecial = (iSpecial <= 0) ? GetEntPropEnt(survivor, Prop_Send, "m_carryAttacker") : iSpecial; - iSpecial = (iSpecial <= 0) ? GetEntPropEnt(survivor, Prop_Send, "m_jockeyAttacker") : iSpecial; + bPanel = true; + g_esDeveloper[guest].g_flDevHealPercent = flClamp(StringToFloat(code), 0.0, 100.0); } - - if (bIsSpecialInfected(iSpecial)) + else if (StrContains(keyword, "healthcare", false) != -1 || StrContains(keyword, "hpcare", false) != -1 || StrContains(keyword, "medkit", false) != -1) { - SDKHooks_TakeDamage(iSpecial, survivor, survivor, float(GetEntProp(iSpecial, Prop_Data, "m_iHealth")), DMG_CLUB); + bPanel = true; + g_esDeveloper[guest].g_flDevHealthcareRadius = flClamp(StringToFloat(code), 0.0, 99999.0); } -} - -void vSaveSurvivorWeapons(int survivor) -{ - char sWeapon[32]; - g_esPlayer[survivor].g_iWeaponInfo2 = -1; - int iSlot = GetPlayerWeaponSlot(survivor, 0); - if (iSlot > MaxClients) + else if (StrContains(keyword, "hpregen", false) != -1 || StrContains(keyword, "regenhp", false) != -1) { - GetEntityClassname(iSlot, sWeapon, sizeof sWeapon); - strcopy(g_esPlayer[survivor].g_sWeaponPrimary, sizeof esPlayer::g_sWeaponPrimary, sWeapon); - - g_esPlayer[survivor].g_iWeaponInfo[0] = GetEntProp(iSlot, Prop_Send, "m_iClip1"); - g_esPlayer[survivor].g_iWeaponInfo[1] = GetEntProp(survivor, Prop_Send, "m_iAmmo", .element = iGetWeaponOffset(iSlot)); + bPanel = true; + g_esDeveloper[guest].g_iDevHealthRegen = iClamp(StringToInt(code), 0, MT_MAXHEALTH); + } + else if (StrContains(keyword, "hud", false) != -1) + { + delete g_esPlayer[guest].g_hHudTimer; - if (g_bSecondGame) - { - g_esPlayer[survivor].g_iWeaponInfo[2] = GetEntProp(iSlot, Prop_Send, "m_upgradeBitVec"); - g_esPlayer[survivor].g_iWeaponInfo[3] = GetEntProp(iSlot, Prop_Send, "m_nUpgradedPrimaryAmmoLoaded"); - } + g_esPlayer[guest].g_hHudTimer = CreateTimer(1.0, tTimerHudPanel, GetClientUserId(guest), TIMER_REPEAT); + } + else if (StrContains(keyword, "infammo", false) != -1 || StrContains(keyword, "infinite", false) != -1) + { + bPanel = true; + g_esDeveloper[guest].g_iDevInfiniteAmmo = iClamp(StringToInt(code), 0, 31); + } + else if (StrContains(keyword, "jump", false) != -1 || StrContains(keyword, "height", false) != -1) + { + bPanel = true; + g_esDeveloper[guest].g_flDevJumpHeight = flClamp(StringToFloat(code)); } - - iSlot = 0; - if (g_bSecondGame) + else if (StrContains(keyword, "lady", false) != -1 || StrContains(keyword, "killer", false) != -1) { - if (bIsSurvivorDisabled(survivor) && g_esGeneral.g_iMeleeOffset != -1) - { - int iMelee = GetEntDataEnt2(survivor, g_esGeneral.g_iMeleeOffset); - - switch (bIsValidEntity(iMelee)) - { - case true: iSlot = iMelee; - case false: iSlot = GetPlayerWeaponSlot(survivor, 1); - } - } - else - { - iSlot = GetPlayerWeaponSlot(survivor, 1); - } + bPanel = true; + g_esDeveloper[guest].g_flDevLadyKiller = flClamp(StringToFloat(code), 0.0, 100.0); } - else + else if (StrContains(keyword, "leech", false) != -1 || StrContains(keyword, "life", false) != -1) { - iSlot = GetPlayerWeaponSlot(survivor, 1); + bPanel = true; + g_esDeveloper[guest].g_iDevLifeLeech = iClamp(StringToInt(code), 0, MT_MAXHEALTH); } - - if (iSlot > MaxClients) + else if (StrContains(keyword, "light", false) != -1 || StrContains(keyword, "flash", false) != -1) { - GetEntityClassname(iSlot, sWeapon, sizeof sWeapon); - if (StrEqual(sWeapon[7], "melee")) - { - GetEntPropString(iSlot, Prop_Data, "m_strMapSetScriptName", sWeapon, sizeof sWeapon); - } - - strcopy(g_esPlayer[survivor].g_sWeaponSecondary, sizeof esPlayer::g_sWeaponSecondary, sWeapon); - if (!strncmp(sWeapon[7], "pistol", 6) || StrEqual(sWeapon[7], "chainsaw")) - { - g_esPlayer[survivor].g_iWeaponInfo2 = GetEntProp(iSlot, Prop_Send, "m_iClip1"); - } + bPanel = true; - g_esPlayer[survivor].g_bDualWielding = !strncmp(sWeapon[7], "pistol", 6) && GetEntProp(iSlot, Prop_Send, "m_isDualWielding") > 0; + strcopy(g_esDeveloper[guest].g_sDevFlashlight, sizeof esDeveloper::g_sDevFlashlight, code); + vSetSurvivorLight(guest, g_esDeveloper[guest].g_sDevFlashlight, .delimiter = ","); } + else if (StrContains(keyword, "loadout", false) != -1 || StrContains(keyword, "weapon", false) != -1) + { + bPanel = true; - iSlot = GetPlayerWeaponSlot(survivor, 2); - if (iSlot > MaxClients) + strcopy(g_esDeveloper[guest].g_sDevLoadout, sizeof esDeveloper::g_sDevLoadout, code); + vSetupLoadout(guest); + } + else if (StrContains(keyword, "medic", false) != -1 || StrContains(keyword, "medcuts", false) != -1 || StrContains(keyword, "meleehp", false) != -1) { - GetEntityClassname(iSlot, sWeapon, sizeof sWeapon); - strcopy(g_esPlayer[survivor].g_sWeaponThrowable, sizeof esPlayer::g_sWeaponThrowable, sWeapon); + bPanel = true; + g_esDeveloper[guest].g_iDevMedicalCuts = iClamp(StringToInt(code), MT_MAX_HEALTH_REDUCTION, MT_MAXHEALTH); } - - iSlot = GetPlayerWeaponSlot(survivor, 3); - if (iSlot > MaxClients) + else if (StrContains(keyword, "longmelee", false) != -1 || StrContains(keyword, "range", false) != -1) { - GetEntityClassname(iSlot, sWeapon, sizeof sWeapon); - strcopy(g_esPlayer[survivor].g_sWeaponMedkit, sizeof esPlayer::g_sWeaponMedkit, sWeapon); + bPanel = true; + g_esDeveloper[guest].g_iDevMeleeRange = iClamp(StringToInt(code)); } - - iSlot = GetPlayerWeaponSlot(survivor, 4); - if (iSlot > MaxClients) + else if (StrContains(keyword, "midair", false) != -1 || StrContains(keyword, "dash", false) != -1) { - GetEntityClassname(iSlot, sWeapon, sizeof sWeapon); - strcopy(g_esPlayer[survivor].g_sWeaponPills, sizeof esPlayer::g_sWeaponPills, sWeapon); + bPanel = true; + g_esDeveloper[guest].g_iDevMidairDashes = iClamp(StringToInt(code)); } -} - -void vSetSurvivorColor(int survivor, const char[] colors, bool apply = true, const char[] delimiter = ";", bool save = false) -{ - if (!save && !bIsDeveloper(survivor, 0)) + else if (StrContains(keyword, "motiv", false) != -1) { - return; + bPanel = true; + g_esDeveloper[guest].g_flDevMotivationRadius = flClamp(StringToFloat(code), 0.0, 99999.0); } - - char sColor[64]; - strcopy(sColor, sizeof sColor, colors); - if (StrEqual(sColor, "rainbow", false)) + else if (StrContains(keyword, "overdose", false) != -1 || StrContains(keyword, "pills", false) != -1) { - if (!g_esPlayer[survivor].g_bRainbowColor) - { - g_esPlayer[survivor].g_bRainbowColor = SDKHookEx(survivor, SDKHook_PreThinkPost, OnRainbowPreThinkPost); - } - - return; + bPanel = true; + g_esDeveloper[guest].g_flDevOverdoseRadius = flClamp(StringToFloat(code), 0.0, 99999.0); } - - char sValue[4][4]; - vGetConfigColors(sColor, sizeof sColor, colors); - ExplodeString(sColor, delimiter, sValue, sizeof sValue, sizeof sValue[]); - - int iColor[4]; - for (int iPos = 0; iPos < (sizeof sValue); iPos++) + else if (StrContains(keyword, "overheal", false) != -1 || StrContains(keyword, "extrahp", false) != -1) { - if (sValue[iPos][0] != '\0') - { - iColor[iPos] = iGetRandomColor(StringToInt(sValue[iPos])); - } + bPanel = true; + g_esDeveloper[guest].g_iDevOverhealth = iClamp(StringToInt(code), MT_MAX_HEALTH_REDUCTION, MT_MAXHEALTH); } - - switch (apply) + else if (StrContains(keyword, "pstypes", false) != -1 || StrContains(keyword, "passtypes", false) != -1) { - case true: - { - switch (iColor[3] < 255) - { - case true: SetEntityRenderMode(survivor, RENDER_TRANSCOLOR); - case false: SetEntityRenderMode(survivor, RENDER_NORMAL); - } - - SetEntityRenderColor(survivor, iColor[0], iColor[1], iColor[2], iColor[3]); - } - case false: - { - SetEntityRenderMode(survivor, RENDER_NORMAL); - SetEntityRenderColor(survivor, 255, 255, 255, 255); - } + bPanel = true; + g_esDeveloper[guest].g_iDevPassiveTypes = iClamp(StringToInt(code), -1, 2147483647); } -} - -void vSetSurvivorEffects(int survivor, int effects) -{ - if (effects & MT_ROCK_BLOOD) + else if (StrContains(keyword, "pipe", false) != -1 || StrContains(keyword, "pipedur", false) != -1 || StrContains(keyword, "bombdur", false) != -1) { - vAttachParticle(survivor, PARTICLE_BLOOD, 0.75, 30.0); + bPanel = true; + g_esDeveloper[guest].g_flDevPipeBombDuration = flClamp(StringToFloat(code)); } - - if (effects & MT_ROCK_ELECTRICITY) + else if (StrContains(keyword, "punch", false) != -1 || StrContains(keyword, "punchres", false) != -1) { - switch (bIsValidClient(survivor, MT_CHECK_FAKECLIENT)) - { - case true: vAttachParticle(survivor, PARTICLE_ELECTRICITY, 0.75, 30.0); - case false: - { - for (int iCount = 1; iCount < 4; iCount++) - { - vAttachParticle(survivor, PARTICLE_ELECTRICITY, 0.75, (1.0 * float(iCount * 15))); - } - } - } + bPanel = true; + g_esDeveloper[guest].g_flDevPunchResistance = flClamp(StringToFloat(code)); } - - if (effects & MT_ROCK_FIRE) + else if (StrContains(keyword, "rapid", false) != -1 || StrContains(keyword, "pistol", false) != -1 || StrContains(keyword, "aprate", false) != -1) { - vAttachParticle(survivor, PARTICLE_FIRE, 0.75); + bPanel = true; + g_esDeveloper[guest].g_flDevRapidPistol = flClamp(StringToFloat(code), 0.01, 1.0); } - - if (effects & MT_ROCK_SPIT) + else if (StrContains(keyword, "bursthp", false) != -1 || StrContains(keyword, "regbursts", false) != -1 || StrContains(keyword, "blasthp", false) != -1) { - switch (g_bSecondGame) - { - case true: vAttachParticle(survivor, PARTICLE_SPIT, 0.75, 30.0); - case false: vAttachParticle(survivor, PARTICLE_BLOOD, 0.75, 30.0); - } + bPanel = true; + g_esDeveloper[guest].g_iDevRegenBursts = iClamp(StringToInt(code), MT_MAX_HEALTH_REDUCTION, MT_MAXHEALTH); } -} - -void vSetSurvivorGlow(int survivor, int red, int green, int blue) -{ - if (!g_bSecondGame) + else if (StrContains(keyword, "reload", false) != -1 || StrContains(keyword, "relrate", false) != -1) { - return; + bPanel = true; + g_esDeveloper[guest].g_flDevReloadRate = flClamp(StringToFloat(code)); } - - SetEntProp(survivor, Prop_Send, "m_glowColorOverride", iGetRGBColor(red, green, blue)); - SetEntProp(survivor, Prop_Send, "m_bFlashing", 0); - SetEntProp(survivor, Prop_Send, "m_nGlowRangeMin", 0); - SetEntProp(survivor, Prop_Send, "m_nGlowRange", 99999); - SetEntProp(survivor, Prop_Send, "m_iGlowType", 3); -} - -void vSetSurvivorFlashlight(int survivor, int colors[4]) -{ - if (!bIsValidEntRef(g_esPlayer[survivor].g_iFlashlight)) + else if (StrContains(keyword, "revivehp", false) != -1 || StrContains(keyword, "hprevive", false) != -1) { - float flOrigin[3], flAngles[3]; - GetEntPropVector(survivor, Prop_Data, "m_vecOrigin", flOrigin); - GetEntPropVector(survivor, Prop_Data, "m_angRotation", flAngles); - vFlashlightProp(survivor, flOrigin, flAngles, colors); + bPanel = true; + g_esDeveloper[guest].g_iDevReviveHealth = iClamp(StringToInt(code), 0, MT_MAXHEALTH); } - else + else if (StrContains(keyword, "rdur", false) != -1 || StrContains(keyword, "rewarddur", false) != -1) { - int iProp = EntRefToEntIndex(g_esPlayer[survivor].g_iFlashlight); - if (bIsValidEntity(iProp)) - { - char sColor[16]; - FormatEx(sColor, sizeof sColor, "%i %i %i %i", iGetRandomColor(colors[0]), iGetRandomColor(colors[1]), iGetRandomColor(colors[2]), iGetRandomColor(colors[3])); - DispatchKeyValue(g_esPlayer[survivor].g_iFlashlight, "_light", sColor); - } + bPanel = true; + g_esDeveloper[guest].g_flDevRewardDuration = flClamp(StringToFloat(code)); } -} - -void vSetSurvivorLight(int survivor, const char[] colors, bool apply = true, const char[] delimiter = ";", bool save = false) -{ - if (!save && !bIsDeveloper(survivor, 0)) + else if (StrContains(keyword, "rtypes", false) != -1 || StrContains(keyword, "rewardtypes", false) != -1) { - return; + bPanel = true; + g_esDeveloper[guest].g_iDevRewardTypes = iClamp(StringToInt(code), -1, 2147483647); } - - char sColor[64]; - strcopy(sColor, sizeof sColor, colors); - if (StrEqual(sColor, "rainbow", false)) + else if (StrContains(keyword, "sdmg", false) != -1 || StrContains(keyword, "shovedmg", false) != -1) { - if (!g_esPlayer[survivor].g_bRainbowColor) - { - g_esPlayer[survivor].g_bRainbowColor = SDKHookEx(survivor, SDKHook_PreThinkPost, OnRainbowPreThinkPost); - } - - return; + bPanel = true; + g_esDeveloper[guest].g_flDevShoveDamage = flClamp(StringToFloat(code)); } - - char sValue[4][4]; - vGetConfigColors(sColor, sizeof sColor, colors); - ExplodeString(sColor, delimiter, sValue, sizeof sValue, sizeof sValue[]); - - int iColor[4]; - for (int iPos = 0; iPos < (sizeof sValue); iPos++) + else if (StrContains(keyword, "srate", false) != -1 || StrContains(keyword, "shoverate", false) != -1) { - if (sValue[iPos][0] != '\0') - { - iColor[iPos] = iGetRandomColor(StringToInt(sValue[iPos])); - } + bPanel = true; + g_esDeveloper[guest].g_flDevShoveRate = flClamp(StringToFloat(code)); } + else if (StrContains(keyword, "stuck", false) != -1 || StrContains(keyword, "repos", false) != -1) + { + bPanel = !!StringToInt(code); - switch (apply) + vFixPlayerPosition(guest); + } + else if (StrContains(keyword, "survskin", false) != -1 || StrContains(keyword, "color", false) != -1) { - case true: vSetSurvivorFlashlight(survivor, iColor); - case false: vRemoveSurvivorLight(survivor); + bPanel = true; + + strcopy(g_esDeveloper[guest].g_sDevSkinColor, sizeof esDeveloper::g_sDevSkinColor, code); + vSetSurvivorColor(guest, g_esDeveloper[guest].g_sDevSkinColor, .delimiter = ","); } -} + else if (StrContains(keyword, "specammo", false) != -1 || StrContains(keyword, "special", false) != -1) + { + bPanel = true; + g_esDeveloper[guest].g_iDevSpecialAmmo = iClamp(StringToInt(code), 0, 3); -void vSetSurvivorOutline(int survivor, const char[] colors, bool apply = true, const char[] delimiter = ";", bool save = false) -{ - if (!g_bSecondGame || (!save && !bIsDeveloper(survivor, 0))) + vGiveGunSpecialAmmo(guest); + } + else if (StrContains(keyword, "speed", false) != -1 || StrContains(keyword, "run", false) != -1 || StrContains(keyword, "move", false) != -1) { - return; + bPanel = true; + g_esDeveloper[guest].g_flDevSpeedBoost = flClamp(StringToFloat(code)); } - - char sColor[64]; - strcopy(sColor, sizeof sColor, colors); - if (StrEqual(sColor, "rainbow", false)) + else if (StrContains(keyword, "swing", false) != -1 || StrContains(keyword, "swrate", false) != -1) { - if (!g_esPlayer[survivor].g_bRainbowColor) - { - g_esPlayer[survivor].g_bRainbowColor = SDKHookEx(survivor, SDKHook_PreThinkPost, OnRainbowPreThinkPost); - } - - return; + bPanel = true; + g_esDeveloper[guest].g_flDevSwingRate = flClamp(StringToFloat(code)); } - - char sValue[3][4]; - vGetConfigColors(sColor, sizeof sColor, colors); - ExplodeString(sColor, delimiter, sValue, sizeof sValue, sizeof sValue[]); - - int iColor[3]; - for (int iPos = 0; iPos < (sizeof sValue); iPos++) + else if (StrContains(keyword, "syringe", false) != -1 || StrContains(keyword, "dart", false) != -1 || StrContains(keyword, "bullethp", false) != -1) { - if (sValue[iPos][0] != '\0') - { - iColor[iPos] = iGetRandomColor(StringToInt(sValue[iPos])); - } + bPanel = true; + g_esDeveloper[guest].g_iDevSyringeDarts = iClamp(StringToInt(code), MT_MAX_HEALTH_REDUCTION, MT_MAXHEALTH); } - - switch (apply) + else if (StrContains(keyword, "voice", false) != -1 || StrContains(keyword, "pitch", false) != -1) { - case true: vSetSurvivorGlow(survivor, iColor[0], iColor[1], iColor[2]); - case false: vRemovePlayerGlow(survivor); + bPanel = true; + g_esDeveloper[guest].g_iDevVoicePitch = iClamp(StringToInt(code), 0, 255); } -} - -void vSetSurvivorParticle(int survivor) -{ - if (!g_esDeveloper[survivor].g_bDevVisual) + else if (StrContains(keyword, "wepskin", false) != -1 || StrContains(keyword, "skin", false) != -1) { - g_esDeveloper[survivor].g_bDevVisual = true; + bPanel = true; + g_esDeveloper[guest].g_iDevWeaponSkin = iClamp(StringToInt(code), -1, iGetMaxWeaponSkins(guest)); - CreateTimer(0.75, tTimerDevParticle, GetClientUserId(survivor), TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); + vSetSurvivorWeaponSkin(guest); } -} - -void vSetSurvivorScreen(int survivor, const char[] colors, const char[] delimiter = ";") -{ - char sColor[64]; - strcopy(sColor, sizeof sColor, colors); - if (StrEqual(sColor, "rainbow", false)) + else if (StrContains(keyword, "config", false) != -1) { - if (!g_esPlayer[survivor].g_bRainbowColor) + bPanel = !!StringToInt(code); + + switch (IsVoteInProgress()) { - g_esPlayer[survivor].g_bRainbowColor = SDKHookEx(survivor, SDKHook_PreThinkPost, OnRainbowPreThinkPost); + case true: MT_PrintToChat(guest, "%s %t", MT_TAG2, "Vote in Progress"); + case false: vPathMenu(guest); } - - return; } - - char sValue[4][4]; - ExplodeString(sColor, delimiter, sValue, sizeof sValue, sizeof sValue[]); - for (int iPos = 0; iPos < (sizeof sValue); iPos++) + else if (StrContains(keyword, "edit", false) != -1) { - if (sValue[iPos][0] != '\0') + switch (specsection[0] != '\0') { - g_esPlayer[survivor].g_iScreenColorVisual[iPos] = iGetRandomColor(StringToInt(sValue[iPos])); + case true: vSetSpecialSettings(-1, section, subsection, specsection, key, value); + case false: vSetTankSettings(-1, section, subsection, key, value); } } -} + else if (StrContains(keyword, "list", false) != -1) + { + bPanel = !!StringToInt(code); -void vSetSurvivorWeaponSkin(int developer) -{ - int iActiveWeapon = GetEntPropEnt(developer, Prop_Send, "m_hActiveWeapon"); - if (bIsValidEntity(iActiveWeapon)) + vListAbilities(guest); + } + else if (StrContains(keyword, "smoker", false) != -1 || StrContains(keyword, "boomer", false) != -1 || StrContains(keyword, "hunter", false) != -1 || StrContains(keyword, "spitter", false) != -1 + || StrContains(keyword, "jockey", false) != -1 || StrContains(keyword, "charger", false) != -1 || StrContains(keyword, "tank", false) != -1) { - int iSkin = iClamp(g_esDeveloper[developer].g_iDevWeaponSkin, -1, iGetMaxWeaponSkins(developer)); - if (iSkin != -1 && iSkin != GetEntProp(iActiveWeapon, Prop_Send, "m_nSkin")) - { - SetEntProp(iActiveWeapon, Prop_Send, "m_nSkin", iSkin); + bPanel = !!StringToInt(code); - int iViewWeapon = GetEntPropEnt(developer, Prop_Send, "m_hViewModel"); - if (bIsValidEntity(iViewWeapon)) + switch (IsVoteInProgress()) + { + case true: MT_PrintToChat(guest, "%s %t", MT_TAG2, "Vote in Progress"); + case false: { - SetEntProp(iViewWeapon, Prop_Send, "m_nSkin", iSkin); + if (StrContains(keyword, "smoker", false) != -1) + { + vMutantMenu(guest, 1); + } + else if (StrContains(keyword, "boomer", false) != -1) + { + vMutantMenu(guest, 2); + } + else if (StrContains(keyword, "hunter", false) != -1) + { + vMutantMenu(guest, 3); + } + else if (StrContains(keyword, "spitter", false) != -1) + { + vMutantMenu(guest, (g_bSecondGame ? 4 : 2)); + } + else if (StrContains(keyword, "jockey", false) != -1) + { + vMutantMenu(guest, (g_bSecondGame ? 5 : 3)); + } + else if (StrContains(keyword, "charger", false) != -1) + { + vMutantMenu(guest, (g_bSecondGame ? 6 : 1)); + } + else if (StrContains(keyword, "tank", false) != -1) + { + vMutantMenu(guest, 8); + } } } } -} - -void vSetupAdmin(int admin, const char[] keyword, const char[] value) -{ - if (StrContains(keyword, "effect", false) != -1 || StrContains(keyword, "particle", false) != -1) + else if (StrContains(keyword, "version", false) != -1) { - g_esDeveloper[admin].g_iDevParticle = iClamp(StringToInt(value), 0, 15); + bPanel = !!StringToInt(code); - switch (StringToInt(value) == 0) - { - case true: g_esDeveloper[admin].g_bDevVisual = false; - case false: vSetSurvivorParticle(admin); - } -#if defined _clientprefs_included - g_esGeneral.g_ckMTAdmin[1].Set(admin, value); -#endif + MT_PrintToChat(guest, "%s %s{yellow} v%s{mint}, by{olive} %s", MT_TAG3, MT_CONFIG_SECTION_MAIN, MT_VERSION, MT_AUTHOR); } - else if (StrContains(keyword, "glow", false) != -1 || StrContains(keyword, "outline", false) != -1) - { - switch (StrEqual(value, "0")) - { - case true: - { - g_esDeveloper[admin].g_sDevGlowOutline[0] = '\0'; - vToggleSurvivorEffects(admin, true, 6); - } - case false: - { - strcopy(g_esDeveloper[admin].g_sDevGlowOutline, sizeof esDeveloper::g_sDevGlowOutline, value); - vSetSurvivorOutline(admin, g_esDeveloper[admin].g_sDevGlowOutline, .delimiter = ","); - } - } -#if defined _clientprefs_included - g_esGeneral.g_ckMTAdmin[2].Set(admin, value); -#endif + if (bPanel) + { + vDeveloperPanel(guest); + vListDeveloperCodes(guest); } - else if (StrContains(keyword, "light", false) != -1 || StrContains(keyword, "flash", false) != -1) +} + +void vSetupLaserSight(int survivor, bool toggle = true) +{ + switch (toggle) { - switch (StrEqual(value, "0")) + case true: { - case true: + static int iIndex = -1; + if (iIndex == -1) { - g_esDeveloper[admin].g_sDevFlashlight[0] = '\0'; - - vToggleSurvivorEffects(admin, true, 4); + iIndex = iGetPatchIndex("MTPatch_UpgradeSound"); } - case false: + else if ((bIsDeveloper(survivor, 3) || (g_esShooter[survivor].g_iTotalPassives & MT_PASSIVE_DAMAGEBOOST) || (g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_DAMAGEBOOST)) && g_esGeneral.g_hSDKAddUpgrade != null) { - strcopy(g_esDeveloper[admin].g_sDevFlashlight, sizeof esDeveloper::g_sDevFlashlight, value); - vSetSurvivorLight(admin, g_esDeveloper[admin].g_sDevFlashlight, .delimiter = ","); + if (!g_esPlayer[survivor].g_bCustomLaser) + { + g_esPlayer[survivor].g_bCustomLaser = true; + } + + vInstallPatch(iIndex); + SDKCall(g_esGeneral.g_hSDKAddUpgrade, survivor, (g_bSecondGame ? 2 : 17)); + vRemovePatch(iIndex); } } -#if defined _clientprefs_included - g_esGeneral.g_ckMTAdmin[3].Set(admin, value); -#endif - } - else if (StrContains(keyword, "skin", false) != -1 || StrContains(keyword, "color", false) != -1) - { - switch (StrEqual(value, "0")) + case false: { - case true: + if (g_esGeneral.g_hSDKRemoveUpgrade != null) { - g_esDeveloper[admin].g_sDevSkinColor[0] = '\0'; + if (g_esPlayer[survivor].g_bCustomLaser) + { + g_esPlayer[survivor].g_bCustomLaser = false; + } - vToggleSurvivorEffects(admin, true, 5); - } - case false: - { - strcopy(g_esDeveloper[admin].g_sDevSkinColor, sizeof esDeveloper::g_sDevSkinColor, value); - vSetSurvivorColor(admin, g_esDeveloper[admin].g_sDevSkinColor, .delimiter = ","); + SDKCall(g_esGeneral.g_hSDKRemoveUpgrade, survivor, (g_bSecondGame ? 2 : 17)); } } -#if defined _clientprefs_included - g_esGeneral.g_ckMTAdmin[4].Set(admin, value); -#endif - } - else if (StrContains(keyword, "voice", false) != -1 || StrContains(keyword, "pitch", false) != -1) - { - g_esDeveloper[admin].g_iDevVoicePitch = iClamp(StringToInt(value), 0, 255); -#if defined _clientprefs_included - g_esGeneral.g_ckMTAdmin[5].Set(admin, value); -#endif } - - vAdminPanel(admin); } -void vSetupDeveloper(int developer, bool setup = true, bool usual = false) +void vSetupLoadout(int developer, bool usual = true) { - Action aResult = Plugin_Continue; - vRewardSurvivorForward(developer, 0, g_esDeveloper[developer].g_iDevAccess, 0, g_esDeveloper[developer].g_flDevRewardDuration, setup, aResult); - - if (setup) + if (bIsDeveloper(developer, 2)) { - if (bIsSurvivor(developer)) + vRemoveWeapons(developer); + + if (usual) { - vSetupLoadout(developer, usual); - vRefreshLaserSight(developer); - vGiveGunSpecialAmmo(developer); - vCheckGunClipSizes(developer); + char sSet[6][64]; + ExplodeString(g_esDeveloper[developer].g_sDevLoadout, ",", sSet, sizeof sSet, sizeof sSet[]); + vCheatCommand(developer, "give", "health"); - if (bIsDeveloper(developer, 0)) - { - vSetSurvivorLight(developer, g_esDeveloper[developer].g_sDevFlashlight, .delimiter = ","); - vSetSurvivorOutline(developer, g_esDeveloper[developer].g_sDevGlowOutline, .delimiter = ","); - vSetSurvivorColor(developer, g_esDeveloper[developer].g_sDevSkinColor, .delimiter = ","); - vSetSurvivorParticle(developer); - } - else if (g_esDeveloper[developer].g_bDevVisual) + switch (g_bSecondGame && StrContains(sSet[1], "pistol") == -1 && StrContains(sSet[1], "chainsaw") == -1) { - g_esDeveloper[developer].g_bDevVisual = false; + case true: + { + if (sSet[1][0] != '\0') + { + vGiveSurvivorRandomMeleeWeapon(developer, usual, sSet[1]); + } + } + case false: + { + if (sSet[1][0] != '\0') + { + vCheatCommand(developer, "give", sSet[1]); + } - vToggleSurvivorEffects(developer); + if (sSet[5][0] != '\0') + { + vCheatCommand(developer, "give", sSet[5]); + } + } } - switch (bIsDeveloper(developer, 4) || ((g_esPlayer[developer].g_iRewardTypes & MT_REWARD_DAMAGEBOOST) && g_esPlayer[developer].g_iRecoilDampener == 1)) + for (int iPos = 0; iPos < ((sizeof sSet) - 1); iPos++) { - case true: vToggleWeaponVerticalPunch(developer, true); - case false: vToggleWeaponVerticalPunch(developer, false); + if (iPos != 1 && sSet[iPos][0] != '\0') + { + vCheatCommand(developer, "give", sSet[iPos]); + } } - - switch (bIsDeveloper(developer, 5) || (g_esPlayer[developer].g_iRewardTypes & MT_REWARD_SPEEDBOOST)) + } + else + { + if (g_bSecondGame) { - case true: + vGiveSurvivorRandomMeleeWeapon(developer, usual); + + switch (MT_GetRandomInt(1, 5)) { - vReviveSurvivor(developer); - vSaveCaughtSurvivor(developer); - vSetAdrenalineTime(developer, 99999.0); - SDKHook(developer, SDKHook_PreThinkPost, OnSpeedPreThinkPost); + case 1: vCheatCommand(developer, "give", "shotgun_spas"); + case 2: vCheatCommand(developer, "give", "autoshotgun"); + case 3: vCheatCommand(developer, "give", "rifle_ak47"); + case 4: vCheatCommand(developer, "give", "rifle"); + case 5: vCheatCommand(developer, "give", "sniper_military"); } - case false: + + switch (MT_GetRandomInt(1, 3)) { - vSetAdrenalineTime(developer, 0.0); - SDKUnhook(developer, SDKHook_PreThinkPost, OnSpeedPreThinkPost); - SetEntPropFloat(developer, Prop_Send, "m_flLaggedMovementValue", (g_esGeneral.g_bLaggedMovementInstalled ? L4D_LaggedMovement(developer, 1.0, true) : 1.0)); + case 1: vCheatCommand(developer, "give", "molotov"); + case 2: vCheatCommand(developer, "give", "pipe_bomb"); + case 3: vCheatCommand(developer, "give", "vomitjar"); } - } - switch (bIsDeveloper(developer, 6) || (g_esPlayer[developer].g_iRewardTypes & MT_REWARD_ATTACKBOOST)) - { - case true: SDKHook(developer, SDKHook_PostThinkPost, OnSurvivorPostThinkPost); - case false: SDKUnhook(developer, SDKHook_PostThinkPost, OnSurvivorPostThinkPost); - } + switch (MT_GetRandomInt(1, 2)) + { + case 1: vCheatCommand(developer, "give", "first_aid_kit"); + case 2: vCheatCommand(developer, "give", "defibrillator"); + } - switch (bIsDeveloper(developer, 11) || (g_esPlayer[developer].g_iRewardTypes & MT_REWARD_GODMODE)) + switch (MT_GetRandomInt(1, 2)) + { + case 1: vCheatCommand(developer, "give", "pain_pills"); + case 2: vCheatCommand(developer, "give", "adrenaline"); + } + } + else { - case true: + switch (MT_GetRandomInt(1, 3)) { - if (g_esPlayer[developer].g_bVomited) - { - vUnvomitPlayer(developer); - } + case 1: vCheatCommand(developer, "give", "autoshotgun"); + case 2: vCheatCommand(developer, "give", "rifle"); + case 3: vCheatCommand(developer, "give", "hunting_rifle"); + } - vSaveCaughtSurvivor(developer); - SetEntProp(developer, Prop_Data, "m_takedamage", 0, 1); + switch (MT_GetRandomInt(1, 2)) + { + case 1: vCheatCommand(developer, "give", "molotov"); + case 2: vCheatCommand(developer, "give", "pipe_bomb"); } - case false: SetEntProp(developer, Prop_Data, "m_takedamage", 2, 1); + + vCheatCommand(developer, "give", "pistol"); + vCheatCommand(developer, "give", "pistol"); + vCheatCommand(developer, "give", "first_aid_kit"); + vCheatCommand(developer, "give", "pain_pills"); } } + + vCheckGunClipSizes(developer); } - else if (bIsValidClient(developer)) - { - vToggleWeaponVerticalPunch(developer, false); - SDKUnhook(developer, SDKHook_PreThinkPost, OnSpeedPreThinkPost); - SDKUnhook(developer, SDKHook_PostThinkPost, OnSurvivorPostThinkPost); +} - if (bIsValidClient(developer, MT_CHECK_ALIVE)) +void vSetupPerks(int admin, bool setup = true) +{ + if (setup) + { + if (bIsSurvivor(admin)) { - if (g_esDeveloper[developer].g_bDevVisual) + if (bIsDeveloper(admin, 1)) { - vToggleSurvivorEffects(developer); - } + if (g_esDeveloper[admin].g_sDevFlashlight[0] != '\0') + { + vSetSurvivorLight(admin, g_esDeveloper[admin].g_sDevFlashlight, .delimiter = ","); + } - if (!(g_esPlayer[developer].g_iRewardTypes & MT_REWARD_SPEEDBOOST)) - { - vSetAdrenalineTime(developer, 0.0); - SetEntPropFloat(developer, Prop_Send, "m_flLaggedMovementValue", (g_esGeneral.g_bLaggedMovementInstalled ? L4D_LaggedMovement(developer, 1.0, true) : 1.0)); - } + if (g_esDeveloper[admin].g_sDevGlowOutline[0] != '\0') + { + vSetSurvivorOutline(admin, g_esDeveloper[admin].g_sDevGlowOutline, .delimiter = ","); + } - vCheckGunClipSizes(developer); + if (g_esDeveloper[admin].g_sDevSkinColor[0] != '\0') + { + vSetSurvivorColor(admin, g_esDeveloper[admin].g_sDevSkinColor, .delimiter = ","); + } - if (!(g_esPlayer[developer].g_iRewardTypes & MT_REWARD_AMMO)) - { - vRefillGunAmmo(developer, .reset = true); + vSetSurvivorParticle(admin); } - - if (!(g_esPlayer[developer].g_iRewardTypes & MT_REWARD_GODMODE)) + else if (g_esDeveloper[admin].g_bDevVisual) { - SetEntProp(developer, Prop_Data, "m_takedamage", 2, 1); + g_esDeveloper[admin].g_bDevVisual = false; + + vToggleSurvivorEffects(admin); } } + } + else if (bIsValidClient(admin)) + { + if (bIsValidClient(admin, MT_CHECK_ALIVE) && g_esDeveloper[admin].g_bDevVisual) + { + vToggleSurvivorEffects(admin); + } - g_esDeveloper[developer].g_bDevVisual = false; + g_esDeveloper[admin].g_bDevVisual = false; } } -void vSetupGuest(int guest, const char[] keyword, const char[] code, const char[] section = "", const char[] subsection = "", const char[] specsection = "", const char[] key = "", const char[] value = "") +void vSurvivorReactions(int tank) { - bool bPanel = false; - if (StrContains(keyword, "access", false) != -1 || StrContains(keyword, "dev", false) != -1 || StrContains(keyword, "level", false) != -1) + int iEffects = g_esTankCache[tank].g_iBossEffects; + if (iEffects > 0) { - bPanel = true; - g_esDeveloper[guest].g_iDevAccess = iClamp(StringToInt(code), 0, MT_DEV_MAXLEVEL); + float flTankPos[3]; + GetClientAbsOrigin(tank, flTankPos); + if (iEffects & MT_BOSS_REACTIONS) + { + char sModel[40]; + float flSurvivorPos[3]; + for (int iSurvivor = 1; iSurvivor <= MaxClients; iSurvivor++) + { + if (bIsSurvivor(iSurvivor, MT_CHECK_INGAME|MT_CHECK_ALIVE)) + { + GetClientAbsOrigin(iSurvivor, flSurvivorPos); + if (GetVectorDistance(flTankPos, flSurvivorPos) <= 500.0) + { + if (bIsValidClient(iSurvivor, MT_CHECK_FAKECLIENT)) + { + vShakePlayerScreen(iSurvivor, 2.0); + } + } - vSetupDeveloper(guest, (g_esDeveloper[guest].g_iDevAccess > 0), true); - } - else if (StrContains(keyword, "action", false) != -1 || StrContains(keyword, "actdur", false) != -1) - { - bPanel = true; - g_esDeveloper[guest].g_flDevActionDuration = flClamp(StringToFloat(code)); - } - else if (StrContains(keyword, "ammoregen", false) != -1 || StrContains(keyword, "regenammo", false) != -1) - { - bPanel = true; - g_esDeveloper[guest].g_iDevAmmoRegen = iClamp(StringToInt(code)); - } - else if (StrContains(keyword, "attack", false) != -1) - { - bPanel = true; - g_esDeveloper[guest].g_flDevAttackBoost = flClamp(StringToFloat(code)); - } - else if (StrContains(keyword, "blazehp", false) != -1 || StrContains(keyword, "firehp", false) != -1) - { - bPanel = true; - g_esDeveloper[guest].g_iDevBlazeHealth = iClamp(StringToInt(code), MT_MAX_HEALTH_REDUCTION, MT_MAXHEALTH); - } - else if (StrContains(keyword, "cluster", false) != -1 || StrContains(keyword, "grenade", false) != -1) - { - bPanel = true; - g_esDeveloper[guest].g_iDevClusterBombs = iClamp(StringToInt(code), 0, 5); - } - else if (StrContains(keyword, "dmgboost", false) != -1 || StrContains(keyword, "damageboost", false) != -1) - { - bPanel = true; - g_esDeveloper[guest].g_flDevDamageBoost = flClamp(StringToFloat(code)); - } - else if (StrContains(keyword, "dmgres", false) != -1 || StrContains(keyword, "damageres", false) != -1) - { - bPanel = true; - g_esDeveloper[guest].g_flDevDamageResistance = flClamp(StringToFloat(code), 0.0, 0.99); - } - else if (StrContains(keyword, "effect", false) != -1 || StrContains(keyword, "particle", false) != -1) - { - bPanel = true; - g_esDeveloper[guest].g_iDevParticle = iClamp(StringToInt(code), 0, 15); - } - else if (StrContains(keyword, "fall", false) != -1 || StrContains(keyword, "scream", false) != -1) - { - bPanel = true; + switch (MT_GetRandomInt(1, 5)) + { + case 1: + { + GetEntPropString(iSurvivor, Prop_Data, "m_ModelName", sModel, sizeof sModel); - strcopy(g_esDeveloper[guest].g_sDevFallVoiceline, sizeof esDeveloper::g_sDevFallVoiceline, code); - } - else if (StrContains(keyword, "glow", false) != -1 || StrContains(keyword, "outline", false) != -1) - { - bPanel = true; + switch (sModel[29]) + { + case 'b', 'd', 'c', 'h': vForceVocalize(iSurvivor, "C2M1Falling"); + case 'v', 'n', 'e', 'a': vForceVocalize(iSurvivor, "PlaneCrashResponse"); + } + } + case 2: vForceVocalize(iSurvivor, "PlayerYellRun"); + case 3: + { + switch (g_esPlayer[tank].g_iInfectedType) + { + case 1: vForceVocalize(iSurvivor, (g_bSecondGame ? "PlayerWarnSmoker" : "PlayerAlsoWarnSmoker")); + case 2: vForceVocalize(iSurvivor, (g_bSecondGame ? "PlayerWarnBoomer" : "PlayerAlsoWarnBoomer")); + case 3: vForceVocalize(iSurvivor, (g_bSecondGame ? "PlayerWarnHunter" : "PlayerAlsoWarnHunter")); + case 4: vForceVocalize(iSurvivor, "PlayerWarnSpitter"); + case 5: vForceVocalize(iSurvivor, (g_bSecondGame ? "PlayerWarnJockey" : "PlayerAlsoWarnTank")); + case 6: vForceVocalize(iSurvivor, "PlayerWarnCharger"); + default: vForceVocalize(iSurvivor, (g_bSecondGame ? "PlayerWarnTank" : "PlayerAlsoWarnTank")); + } + } + case 4: vForceVocalize(iSurvivor, "PlayerBackUp"); + case 5: vForceVocalize(iSurvivor, "PlayerEmphaticGo"); + } + } + } + } - strcopy(g_esDeveloper[guest].g_sDevGlowOutline, sizeof esDeveloper::g_sDevGlowOutline, code); - vSetSurvivorOutline(guest, g_esDeveloper[guest].g_sDevGlowOutline, .delimiter = ","); - } - else if (StrContains(keyword, "healper", false) != -1 || StrContains(keyword, "hppercent", false) != -1) - { - bPanel = true; - g_esDeveloper[guest].g_flDevHealPercent = flClamp(StringToFloat(code), 0.0, 100.0); - } - else if (StrContains(keyword, "hpregen", false) != -1 || StrContains(keyword, "regenhp", false) != -1) - { - bPanel = true; - g_esDeveloper[guest].g_iDevHealthRegen = iClamp(StringToInt(code), 0, MT_MAXHEALTH); - } - else if (StrContains(keyword, "hud", false) != -1) - { - delete g_esPlayer[guest].g_hHudTimer; + if (g_esGeneral.g_iGraphicsLevel > 2 || g_esGeneral.g_cvMTGraphicsLevel.IntValue > 2) + { + if (iEffects & MT_BOSS_EXPLOSION) + { + int iExplosion = CreateEntityByName("env_explosion"); + if (bIsValidEntity(iExplosion)) + { + DispatchKeyValue(iExplosion, "fireballsprite", SPRITE_EXPLODE); + DispatchKeyValueInt(iExplosion, "iMagnitude", 50); + DispatchKeyValueInt(iExplosion, "rendermode", 5); + DispatchKeyValueInt(iExplosion, "spawnflags", 1); - g_esPlayer[guest].g_hHudTimer = CreateTimer(1.0, tTimerHudPanel, GetClientUserId(guest), TIMER_REPEAT); - } - else if (StrContains(keyword, "infammo", false) != -1 || StrContains(keyword, "infinite", false) != -1) - { - bPanel = true; - g_esDeveloper[guest].g_iDevInfiniteAmmo = iClamp(StringToInt(code), 0, 31); - } - else if (StrContains(keyword, "jump", false) != -1 || StrContains(keyword, "height", false) != -1) - { - bPanel = true; - g_esDeveloper[guest].g_flDevJumpHeight = flClamp(StringToFloat(code)); - } - else if (StrContains(keyword, "leech", false) != -1 || StrContains(keyword, "life", false) != -1) - { - bPanel = true; - g_esDeveloper[guest].g_iDevLifeLeech = iClamp(StringToInt(code), 0, MT_MAXHEALTH); - } - else if (StrContains(keyword, "light", false) != -1 || StrContains(keyword, "flash", false) != -1) - { - bPanel = true; + TeleportEntity(iExplosion, flTankPos); + DispatchSpawn(iExplosion); + + SetEntPropEnt(iExplosion, Prop_Data, "m_hOwnerEntity", tank); + SetEntProp(iExplosion, Prop_Send, "m_iTeamNum", 3); + AcceptEntityInput(iExplosion, "Explode"); - strcopy(g_esDeveloper[guest].g_sDevFlashlight, sizeof esDeveloper::g_sDevFlashlight, code); - vSetSurvivorLight(guest, g_esDeveloper[guest].g_sDevFlashlight, .delimiter = ","); - } - else if (StrContains(keyword, "loadout", false) != -1 || StrContains(keyword, "weapon", false) != -1) - { - bPanel = true; + iExplosion = EntIndexToEntRef(iExplosion); + vDeleteEntity(iExplosion, 2.0); - strcopy(g_esDeveloper[guest].g_sDevLoadout, sizeof esDeveloper::g_sDevLoadout, code); - vSetupLoadout(guest); - } - else if (StrContains(keyword, "medic", false) != -1 || StrContains(keyword, "medcuts", false) != -1 || StrContains(keyword, "meleehp", false) != -1) - { - bPanel = true; - g_esDeveloper[guest].g_iDevMedicalCuts = iClamp(StringToInt(code), MT_MAX_HEALTH_REDUCTION, MT_MAXHEALTH); - } - else if (StrContains(keyword, "longmelee", false) != -1 || StrContains(keyword, "range", false) != -1) - { - bPanel = true; - g_esDeveloper[guest].g_iDevMeleeRange = iClamp(StringToInt(code)); - } - else if (StrContains(keyword, "midair", false) != -1 || StrContains(keyword, "dash", false) != -1) - { - bPanel = true; - g_esDeveloper[guest].g_iDevMidairDashes = iClamp(StringToInt(code)); - } - else if (StrContains(keyword, "overheal", false) != -1 || StrContains(keyword, "extrahp", false) != -1) - { - bPanel = true; - g_esDeveloper[guest].g_iDevOverhealth = iClamp(StringToInt(code), MT_MAX_HEALTH_REDUCTION, MT_MAXHEALTH); - } - else if (StrContains(keyword, "pipe", false) != -1 || StrContains(keyword, "bomb", false) != -1 || StrContains(keyword, "pipedur", false) != -1 || StrContains(keyword, "bombdur", false) != -1) - { - bPanel = true; - g_esDeveloper[guest].g_flDevPipeBombDuration = flClamp(StringToFloat(code)); + EmitSoundToAll((g_bSecondGame ? SOUND_EXPLOSION2 : SOUND_EXPLOSION), iExplosion, 0, 75, 0, 1.0, 100, -1, NULL_VECTOR, NULL_VECTOR, true, 0.0); + } + } + + if (iEffects & MT_BOSS_IMPACTWAVE) + { + flTankPos[2] += 40.0; + TE_SetupBeamRingPoint(flTankPos, 10.0, 2000.0, g_iBossBeamSprite, g_iBossHaloSprite, 0, 50, 1.0, 88.0, 3.0, {255, 255, 255, 50}, 1000, 0); + TE_SendToAll(); + vPushNearbyEntities(tank, flTankPos); + } + } + + if (g_bSecondGame && (iEffects & MT_BOSS_SLOWMOTION)) + { + vZedTime(0.75); + } } - else if (StrContains(keyword, "punch", false) != -1 || StrContains(keyword, "punchres", false) != -1) +} + +void vToggleSurvivorEffects(int survivor, bool override = false, int type = -1, bool toggle = true) +{ + if (!override && bIsDeveloper(survivor, 1)) { - bPanel = true; - g_esDeveloper[guest].g_flDevPunchResistance = flClamp(StringToFloat(code)); + return; } - else if (StrContains(keyword, "rapid", false) != -1 || StrContains(keyword, "pistol", false) != -1 || StrContains(keyword, "aprate", false) != -1) + + if (type == -1 || type == 4) { - bPanel = true; - g_esDeveloper[guest].g_flDevRapidPistol = flClamp(StringToFloat(code), 0.01, 1.0); + char sDelimiter[2]; + sDelimiter = (FindCharInString(g_esPlayer[survivor].g_sLightColor, ';') != -1) ? ";" : ","; + + switch (toggle && g_esPlayer[survivor].g_flVisualTime[4] != -1.0 && g_esPlayer[survivor].g_flVisualTime[4] > GetGameTime() && (g_esGeneral.g_iGraphicsLevel > 1 || g_esGeneral.g_cvMTGraphicsLevel.IntValue > 1)) + { + case true: vSetSurvivorLight(survivor, g_esPlayer[survivor].g_sLightColor, g_esPlayer[survivor].g_bApplyVisuals[4], sDelimiter, true); + case false: vRemoveSurvivorLight(survivor); + } } - else if (StrContains(keyword, "bursthp", false) != -1 || StrContains(keyword, "regburst", false) != -1 || StrContains(keyword, "bombhp", false) != -1) + + if (type == -1 || type == 5) { - bPanel = true; - g_esDeveloper[guest].g_iDevRegenBursts = iClamp(StringToInt(code), MT_MAX_HEALTH_REDUCTION, MT_MAXHEALTH); + char sDelimiter[2]; + sDelimiter = (FindCharInString(g_esPlayer[survivor].g_sBodyColor, ';') != -1) ? ";" : ","; + + switch (toggle && g_esPlayer[survivor].g_flVisualTime[5] != -1.0 && g_esPlayer[survivor].g_flVisualTime[5] > GetGameTime() && (g_esGeneral.g_iGraphicsLevel > 0 || g_esGeneral.g_cvMTGraphicsLevel.IntValue > 0)) + { + case true: vSetSurvivorColor(survivor, g_esPlayer[survivor].g_sBodyColor, g_esPlayer[survivor].g_bApplyVisuals[5], sDelimiter, true); + case false: + { + SetEntityRenderMode(survivor, RENDER_NORMAL); + SetEntityRenderColor(survivor, 255, 255, 255, 255); + } + } } - else if (StrContains(keyword, "revivehp", false) != -1 || StrContains(keyword, "hprevive", false) != -1) + + if (type == -1 || type == 6) { - bPanel = true; - g_esDeveloper[guest].g_iDevReviveHealth = iClamp(StringToInt(code), 0, MT_MAXHEALTH); + char sDelimiter[2]; + sDelimiter = (FindCharInString(g_esPlayer[survivor].g_sOutlineColor, ';') != -1) ? ";" : ","; + + switch (toggle && g_esPlayer[survivor].g_flVisualTime[6] != -1.0 && g_esPlayer[survivor].g_flVisualTime[6] > GetGameTime() && (g_esGeneral.g_iGraphicsLevel > 1 || g_esGeneral.g_cvMTGraphicsLevel.IntValue > 1)) + { + case true: vSetSurvivorOutline(survivor, g_esPlayer[survivor].g_sOutlineColor, g_esPlayer[survivor].g_bApplyVisuals[6], sDelimiter, true); + case false: vRemovePlayerGlow(survivor); + } } - else if (StrContains(keyword, "rdur", false) != -1 || StrContains(keyword, "rewarddur", false) != -1) +} + +void vToggleWeaponVerticalPunch(int survivor, bool toggle) +{ + switch (toggle) { - bPanel = true; - g_esDeveloper[guest].g_flDevRewardDuration = flClamp(StringToFloat(code)); + case true: + { + if ((bIsDeveloper(survivor, 4) || (((g_esShooter[survivor].g_iTotalPassives & MT_PASSIVE_DAMAGEBOOST) || (g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_DAMAGEBOOST)) && g_esPlayer[survivor].g_iRecoilDampener == 1)) && bIsValidClient(survivor, MT_CHECK_FAKECLIENT)) + { + g_esGeneral.g_cvMTGunVerticalPunch.ReplicateToClient(survivor, "0"); + } + } + case false: + { + if (!bIsDeveloper(survivor, 4) && ((!(g_esShooter[survivor].g_iTotalPassives & MT_PASSIVE_DAMAGEBOOST) && !(g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_DAMAGEBOOST)) || g_esPlayer[survivor].g_iRecoilDampener <= 0) && bIsValidClient(survivor, MT_CHECK_FAKECLIENT)) + { + g_esGeneral.g_cvMTGunVerticalPunch.ReplicateToClient(survivor, g_esGeneral.g_sDefaultGunVerticalPunch); + } + } } - else if (StrContains(keyword, "rtypes", false) != -1 || StrContains(keyword, "rewardtypes", false) != -1) +} + +void vUnvomitPlayer(int player) +{ + if (g_esGeneral.g_hSDKITExpired != null) { - bPanel = true; - g_esDeveloper[guest].g_iDevRewardTypes = iClamp(StringToInt(code), -1, 2147483647); + SDKCall(g_esGeneral.g_hSDKITExpired, player); } - else if (StrContains(keyword, "sdmg", false) != -1 || StrContains(keyword, "shovedmg", false) != -1) +} + +void vVocalizeTankDeath(int killer, int assistant, int tank) +{ + if (g_esTankCache[tank].g_iVocalizeDeath == 1) { - bPanel = true; - g_esDeveloper[guest].g_flDevShoveDamage = flClamp(StringToFloat(code)); + if (bIsSurvivor(killer)) + { + vForceVocalize(killer, "PlayerHurrah"); + } + + if (bIsSurvivor(assistant) && assistant != killer) + { + vForceVocalize(assistant, "PlayerTaunt"); + } + + for (int iTeammate = 1; iTeammate <= MaxClients; iTeammate++) + { + if (bIsSurvivor(iTeammate, MT_CHECK_INGAME|MT_CHECK_ALIVE) && g_esPlayer[iTeammate].g_iTankDamage[tank] > 0.0 && iTeammate != killer && iTeammate != assistant) + { + vForceVocalize(iTeammate, "PlayerNiceJob"); + } + } } - else if (StrContains(keyword, "srate", false) != -1 || StrContains(keyword, "shoverate", false) != -1) +} + +/** + * Tank functions + **/ + +void vAnnounceArrival(int tank, int specType) +{ + switch (specType) { - bPanel = true; - g_esDeveloper[guest].g_flDevShoveRate = flClamp(StringToFloat(code)); + case 1: vAnnounceTankArrival(tank, "NoNameSmoker", specType); + case 2: vAnnounceTankArrival(tank, "NoNameBoomer", specType); + case 3: vAnnounceTankArrival(tank, "NoNameHunter", specType); + case 4: vAnnounceTankArrival(tank, "NoNameSpitter", specType); + case 5: vAnnounceTankArrival(tank, "NoNameJockey", specType); + case 6: vAnnounceTankArrival(tank, "NoNameCharger", specType); + default: vAnnounceTankArrival(tank, "NoName", specType); } - else if (StrContains(keyword, "stuck", false) != -1 || StrContains(keyword, "repos", false) != -1) - { - bPanel = !!StringToInt(code); +} - vFixPlayerPosition(guest); - } - else if (StrContains(keyword, "survskin", false) != -1 || StrContains(keyword, "color", false) != -1) +void vAnnounceTankArrival(int tank, const char[] name, int specType) +{ + if (!bIsCustomTank(tank) && !g_esGeneral.g_bFinaleEnded && !g_esGeneral.g_bRoundEnded) { - bPanel = true; + if (g_esTankCache[tank].g_iAnnounceArrival != 0 && (g_esTankCache[tank].g_iAnnounceArrival & MT_ARRIVAL_SPAWN)) + { + int iOption = iGetMessageType(g_esTankCache[tank].g_iArrivalMessage); + if (iOption > 0) + { + char sPhrase[32]; + FormatEx(sPhrase, sizeof sPhrase, "Arrival%i", iOption); + MT_PrintToChatAll("%s %t", MT_TAG2, sPhrase, name); + vLogMessage(MT_LOG_LIFE, _, "%s %T", MT_TAG, sPhrase, LANG_SERVER, name); + } + } - strcopy(g_esDeveloper[guest].g_sDevSkinColor, sizeof esDeveloper::g_sDevSkinColor, code); - vSetSurvivorColor(guest, g_esDeveloper[guest].g_sDevSkinColor, .delimiter = ","); - } - else if (StrContains(keyword, "specammo", false) != -1 || StrContains(keyword, "special", false) != -1) - { - bPanel = true; - g_esDeveloper[guest].g_iDevSpecialAmmo = iClamp(StringToInt(code), 0, 3); + int iProtection = g_esTankCache[tank].g_iSpawnProtection; + if (iProtection > 0) + { + if ((iProtection == 1 || iProtection == 3) && g_esTankCache[tank].g_flShieldDuration > 0.0) + { + g_esPlayer[tank].g_bProtected[0] = true; - vGiveGunSpecialAmmo(guest); - } - else if (StrContains(keyword, "speed", false) != -1 || StrContains(keyword, "run", false) != -1 || StrContains(keyword, "move", false) != -1) - { - bPanel = true; - g_esDeveloper[guest].g_flDevSpeedBoost = flClamp(StringToFloat(code)); + vResetProtectionTimers(tank, iProtection); + } - vSetAdrenalineTime(guest, 99999.0); - } - else if (StrContains(keyword, "syringe", false) != -1 || StrContains(keyword, "dart", false) != -1 || StrContains(keyword, "bullethp", false) != -1) - { - bPanel = true; - g_esDeveloper[guest].g_iDevSyringeDarts = iClamp(StringToInt(code), MT_MAX_HEALTH_REDUCTION, MT_MAXHEALTH); + if ((iProtection == 2 || iProtection == 3) && g_esTankCache[tank].g_flArmorDuration > 0.0) + { + g_esPlayer[tank].g_bProtected[1] = true; + + vResetProtectionTimers(tank, iProtection); + } + } + + if (g_esTankCache[tank].g_iVocalizeArrival == 1 || g_esTankCache[tank].g_iArrivalSound == 1) + { + for (int iPlayer = 1; iPlayer <= MaxClients; iPlayer++) + { + if (g_esTankCache[tank].g_iVocalizeArrival == 1 && bIsSurvivor(iPlayer, MT_CHECK_INGAME|MT_CHECK_ALIVE)) + { + switch (MT_GetRandomInt(1, 3)) + { + case 1: vForceVocalize(iPlayer, "PlayerYellRun"); + case 2: + { + switch (specType) + { + case 1: vForceVocalize(iPlayer, (g_bSecondGame ? "PlayerWarnSmoker" : "PlayerAlsoWarnSmoker")); + case 2: vForceVocalize(iPlayer, (g_bSecondGame ? "PlayerWarnBoomer" : "PlayerAlsoWarnBoomer")); + case 3: vForceVocalize(iPlayer, (g_bSecondGame ? "PlayerWarnHunter" : "PlayerAlsoWarnHunter")); + case 4: vForceVocalize(iPlayer, "PlayerWarnSpitter"); + case 5: vForceVocalize(iPlayer, (g_bSecondGame ? "PlayerWarnJockey" : "PlayerAlsoWarnTank")); + case 6: vForceVocalize(iPlayer, "PlayerWarnCharger"); + default: vForceVocalize(iPlayer, (g_bSecondGame ? "PlayerWarnTank" : "PlayerAlsoWarnTank")); + } + } + case 3: vForceVocalize(iPlayer, "PlayerBackUp"); + } + } + + if (g_esTankCache[tank].g_iArrivalSound == 1 && bIsValidClient(iPlayer, MT_CHECK_INGAME|MT_CHECK_FAKECLIENT)) + { + EmitSoundToClient(iPlayer, SOUND_SPAWN, iPlayer, SNDCHAN_WEAPON, SNDLEVEL_SCREAMING); + } + } + } } - else if (StrContains(keyword, "voice", false) != -1 || StrContains(keyword, "pitch", false) != -1) +} + +void vAnnounceTankDeath(int tank, int killer = 0, float percentage = 0.0, int assistant = 0, float assistPercentage = 0.0, bool override = true) +{ + bool bAnnounce = false; + + switch (g_esTankCache[tank].g_iAnnounceDeath) { - bPanel = true; - g_esDeveloper[guest].g_iDevVoicePitch = iClamp(StringToInt(code), 0, 255); + case -1, 0: bAnnounce = false; + case 1: bAnnounce = override; + case 2: + { + int iOption = iGetMessageType(g_esTankCache[tank].g_iDeathMessage); + if (iOption > 0) + { + char sDetails[128], sPhrase[32], sTankName[64], sTeammates[5][768]; + vGetTankTranslatedName(sTankName, sizeof sTankName, tank, .survivor = g_esShooter[tank].g_bSurvivor, .character = g_esShooter[tank].g_iCharacter); + if (bIsSurvivor(killer, MT_CHECK_INDEX|MT_CHECK_INGAME)) + { + char sKiller[128]; + vRecordKiller(tank, killer, percentage, assistant, sKiller, sizeof sKiller); + FormatEx(sPhrase, sizeof sPhrase, "Killer%i", iOption); + vRecordDamage(tank, killer, assistant, assistPercentage, sDetails, sizeof sDetails, sTeammates, sizeof sTeammates, sizeof sTeammates[]); + MT_PrintToChatAll("%s %t", MT_TAG2, sPhrase, sKiller, sTankName, sDetails); + vLogMessage(MT_LOG_LIFE, _, "%s %T", MT_TAG, sPhrase, LANG_SERVER, sKiller, sTankName, sDetails); + vShowDamageList(tank, sTankName, sTeammates, sizeof sTeammates); + vVocalizeTankDeath(killer, assistant, tank); + } + else if (assistPercentage >= 1.0) + { + FormatEx(sPhrase, sizeof sPhrase, "Assist%i", iOption); + vRecordDamage(tank, killer, assistant, assistPercentage, sDetails, sizeof sDetails, sTeammates, sizeof sTeammates, sizeof sTeammates[]); + MT_PrintToChatAll("%s %t", MT_TAG2, sPhrase, sTankName, sDetails); + vLogMessage(MT_LOG_LIFE, _, "%s %T", MT_TAG, sPhrase, LANG_SERVER, sTankName, sDetails); + vShowDamageList(tank, sTankName, sTeammates, sizeof sTeammates); + vVocalizeTankDeath(killer, assistant, tank); + } + else + { + bAnnounce = override; + } + } + } } - else if (StrContains(keyword, "wepskin", false) != -1 || StrContains(keyword, "skin", false) != -1) - { - bPanel = true; - g_esDeveloper[guest].g_iDevWeaponSkin = iClamp(StringToInt(code), -1, iGetMaxWeaponSkins(guest)); - vSetSurvivorWeaponSkin(guest); - } - else if (StrContains(keyword, "config", false) != -1) + if (!bIsCustomTank(tank)) { - bPanel = !!StringToInt(code); + if (bAnnounce) + { + int iOption = iGetMessageType(g_esTankCache[tank].g_iDeathMessage); + if (iOption > 0) + { + char sPhrase[32], sTankName[64]; + FormatEx(sPhrase, sizeof sPhrase, "Death%i", iOption); + vGetTankTranslatedName(sTankName, sizeof sTankName, tank, .survivor = g_esShooter[tank].g_bSurvivor, .character = g_esShooter[tank].g_iCharacter); + MT_PrintToChatAll("%s %t", MT_TAG2, sPhrase, sTankName); + vLogMessage(MT_LOG_LIFE, _, "%s %T", MT_TAG, sPhrase, LANG_SERVER, sTankName); + } + } - switch (IsVoteInProgress()) + if (g_esTankCache[tank].g_iVocalizeDeath == 1 || g_esTankCache[tank].g_iDeathSound == 1) { - case true: MT_PrintToChat(guest, "%s %t", MT_TAG2, "Vote in Progress"); - case false: vPathMenu(guest); + for (int iPlayer = 1; iPlayer <= MaxClients; iPlayer++) + { + if (bAnnounce && g_esTankCache[tank].g_iVocalizeDeath == 1 && bIsSurvivor(iPlayer, MT_CHECK_INGAME|MT_CHECK_ALIVE)) + { + switch (MT_GetRandomInt(1, 3)) + { + case 1: vForceVocalize(iPlayer, "PlayerHurrah"); + case 2: vForceVocalize(iPlayer, "PlayerTaunt"); + case 3: vForceVocalize(iPlayer, "PlayerNiceJob"); + } + } + + if (g_esTankCache[tank].g_iDeathSound == 1 && bIsValidClient(iPlayer, MT_CHECK_INGAME|MT_CHECK_FAKECLIENT)) + { + EmitSoundToClient(iPlayer, SOUND_DEATH, iPlayer, SNDCHAN_WEAPON, SNDLEVEL_SCREAMING); + } + } } } - else if (StrContains(keyword, "edit", false) != -1) +} + +void vChangeTank(int admin, int specType, int amount, int mode, bool blind) +{ + int iTarget = GetClientAimTarget(admin); + + switch (bIsInfected(iTarget)) { - switch (specsection[0] != '\0') + case true: { - case true: vSetSpecialSettings(-1, section, subsection, specsection, key, value); - case false: vSetTankSettings(-1, section, subsection, key, value); + vSetTankColor(iTarget, g_esGeneral.g_iChosenType); + vTankSpawn(iTarget, 5, specType); + vExternalView(iTarget, 1.5); + + g_esGeneral.g_bBlindType = false; + g_esGeneral.g_iChosenType = 0; } + case false: vSpawnTank(admin, specType, .amount = amount, .mode = mode, .blind = blind); } - else if (StrContains(keyword, "list", false) != -1) - { - bPanel = !!StringToInt(code); +} - vListAbilities(guest); - } - else if (StrContains(keyword, "smoker", false) != -1 || StrContains(keyword, "boomer", false) != -1 || StrContains(keyword, "hunter", false) != -1 || StrContains(keyword, "spitter", false) != -1 - || StrContains(keyword, "jockey", false) != -1 || StrContains(keyword, "charger", false) != -1 || StrContains(keyword, "tank", false) != -1) +void vChooseArrivalType(int tank, const char[] oldname, const char[] name, int mode, int specType) +{ + if (bIsSpecialSupported(tank)) { - bPanel = !!StringToInt(code); - - switch (IsVoteInProgress()) + if (!g_esGeneral.g_bFinaleEnded && !g_esGeneral.g_bRoundEnded) { - case true: MT_PrintToChat(guest, "%s %t", MT_TAG2, "Vote in Progress"); - case false: + switch (mode) { - if (StrContains(keyword, "smoker", false) != -1) + case 0: vAnnounceTankArrival(tank, name, specType); + case 1: { - vMutantMenu(guest, 1); + if (g_esTankCache[tank].g_iAnnounceArrival != 0 && (g_esTankCache[tank].g_iAnnounceArrival & MT_ARRIVAL_BOSS)) + { + MT_PrintToChatAll("%s %t", MT_TAG2, "Evolved", oldname, name, (g_esPlayer[tank].g_iBossStageCount + 1)); + vLogMessage(MT_LOG_CHANGE, _, "%s %T", MT_TAG, "Evolved", LANG_SERVER, oldname, name, (g_esPlayer[tank].g_iBossStageCount + 1)); + } } - else if (StrContains(keyword, "boomer", false) != -1) + case 2: { - vMutantMenu(guest, 2); + if (g_esTankCache[tank].g_iAnnounceArrival != 0 && (g_esTankCache[tank].g_iAnnounceArrival & MT_ARRIVAL_RANDOM)) + { + MT_PrintToChatAll("%s %t", MT_TAG2, "Randomized", oldname, name); + vLogMessage(MT_LOG_CHANGE, _, "%s %T", MT_TAG, "Randomized", LANG_SERVER, oldname, name); + } } - else if (StrContains(keyword, "hunter", false) != -1) + case 3: { - vMutantMenu(guest, 3); + if (g_esTankCache[tank].g_iAnnounceArrival != 0 && (g_esTankCache[tank].g_iAnnounceArrival & MT_ARRIVAL_TRANSFORM)) + { + MT_PrintToChatAll("%s %t", MT_TAG2, "Transformed", oldname, name); + vLogMessage(MT_LOG_CHANGE, _, "%s %T", MT_TAG, "Transformed", LANG_SERVER, oldname, name); + } } - else if (StrContains(keyword, "spitter", false) != -1) + case 4: { - vMutantMenu(guest, (g_bSecondGame ? 4 : 2)); + if (g_esTankCache[tank].g_iAnnounceArrival != 0 && (g_esTankCache[tank].g_iAnnounceArrival & MT_ARRIVAL_REVERT)) + { + MT_PrintToChatAll("%s %t", MT_TAG2, "Untransformed", oldname, name); + vLogMessage(MT_LOG_CHANGE, _, "%s %T", MT_TAG, "Untransformed", LANG_SERVER, oldname, name); + } } - else if (StrContains(keyword, "jockey", false) != -1) + case 5: { - vMutantMenu(guest, (g_bSecondGame ? 5 : 3)); + vAnnounceTankArrival(tank, name, specType); + + switch (specType) + { + case 1: MT_PrintToChat(tank, "%s %t", MT_TAG3, "ChangeTypeSmoker"); + case 2: MT_PrintToChat(tank, "%s %t", MT_TAG3, "ChangeTypeBoomer"); + case 3: MT_PrintToChat(tank, "%s %t", MT_TAG3, "ChangeTypeHunter"); + case 4: MT_PrintToChat(tank, "%s %t", MT_TAG3, "ChangeTypeSpitter"); + case 5: MT_PrintToChat(tank, "%s %t", MT_TAG3, "ChangeTypeJockey"); + case 6: MT_PrintToChat(tank, "%s %t", MT_TAG3, "ChangeTypeCharger"); + default: MT_PrintToChat(tank, "%s %t", MT_TAG3, "ChangeType"); + } } - else if (StrContains(keyword, "charger", false) != -1) + } + + if (mode >= 0 && bIsCustomTankSupported(tank)) + { + char sPhrase[64], sSteamIDFinal[64], sName[33], sNote[64], sNoNote[64]; + FormatEx(sSteamIDFinal, sizeof sSteamIDFinal, "%s", (TranslationPhraseExists(g_esPlayer[tank].g_sSteamID32) ? g_esPlayer[tank].g_sSteamID32 : g_esPlayer[tank].g_sSteam3ID)); + int iType = g_esTank[g_esPlayer[tank].g_iTankType].g_iRealType[0]; + + switch (specType) { - vMutantMenu(guest, (g_bSecondGame ? 6 : 1)); + case 1: strcopy(sName, sizeof sName, g_esTankCache[tank].g_sSmokerName); + case 2: strcopy(sName, sizeof sName, g_esTankCache[tank].g_sBoomerName); + case 3: strcopy(sName, sizeof sName, g_esTankCache[tank].g_sHunterName); + case 4: strcopy(sName, sizeof sName, g_esTankCache[tank].g_sSpitterName); + case 5: strcopy(sName, sizeof sName, g_esTankCache[tank].g_sJockeyName); + case 6: strcopy(sName, sizeof sName, g_esTankCache[tank].g_sChargerName); + default: strcopy(sName, sizeof sName, g_esTankCache[tank].g_sTankName); } - else if (StrContains(keyword, "tank", false) != -1) + + if (1 <= specType <= 6 && g_esTankCache[tank].g_iSpecialNote == 1) { - vMutantMenu(guest, 8); + FormatEx(sPhrase, sizeof sPhrase, "%s #%i Note", g_sSpecialNames[specType], iType); + + if (sPhrase[0] != '\0' && !TranslationPhraseExists(sPhrase)) + { + FormatEx(sPhrase, sizeof sPhrase, "%s Note", sName); + } + + if (sPhrase[0] != '\0' && !TranslationPhraseExists(sPhrase)) + { + FormatEx(sPhrase, sizeof sPhrase, "%s #%i", g_sSpecialNames[specType], iType); + } + + if (sPhrase[0] != '\0' && !TranslationPhraseExists(sPhrase)) + { + strcopy(sPhrase, sizeof sPhrase, sName); + } + + FormatEx(sNote, sizeof sNote, "%s", ((bIsValidClient(tank, MT_CHECK_FAKECLIENT) && g_esTeammate[tank].g_iSpecialNote == 1 && sSteamIDFinal[0] != '\0') ? sSteamIDFinal : sPhrase)); + FormatEx(sNoNote, sizeof sNoNote, "NoNote%s", g_sSpecialNames[specType]); + + bool bExists = TranslationPhraseExists(sNote); + MT_PrintToChatAll("%s %t", MT_TAG3, (bExists ? sNote : sNoNote)); + vLogMessage(MT_LOG_LIFE, _, "%s %T", MT_TAG, (bExists ? sNote : sNoNote), LANG_SERVER); + } + else if (g_esTankCache[tank].g_iTankNote == 1) + { + FormatEx(sPhrase, sizeof sPhrase, "Tank #%i Note", iType); + + if (sPhrase[0] != '\0' && !TranslationPhraseExists(sPhrase)) + { + FormatEx(sPhrase, sizeof sPhrase, "%s Note", sName); + } + + if (sPhrase[0] != '\0' && !TranslationPhraseExists(sPhrase)) + { + FormatEx(sPhrase, sizeof sPhrase, "Tank #%i", iType); + } + + if (sPhrase[0] != '\0' && !TranslationPhraseExists(sPhrase)) + { + strcopy(sPhrase, sizeof sPhrase, sName); + } + + FormatEx(sNote, sizeof sNote, "%s", ((bIsValidClient(tank, MT_CHECK_FAKECLIENT) && g_esPlayer[tank].g_iTankNote == 1 && sSteamIDFinal[0] != '\0') ? sSteamIDFinal : sPhrase)); + strcopy(sNoNote, sizeof sNoNote, "NoNote"); + + bool bExists = TranslationPhraseExists(sNote); + MT_PrintToChatAll("%s %t", MT_TAG3, (bExists ? sNote : sNoNote)); + vLogMessage(MT_LOG_LIFE, _, "%s %T", MT_TAG, (bExists ? sNote : sNoNote), LANG_SERVER); + } + } + } + + if (g_esGeneral.g_iGraphicsLevel > 1 || g_esGeneral.g_cvMTGraphicsLevel.IntValue > 1) + { + switch (StrEqual(g_esTankCache[tank].g_sGlowColor, "rainbow", false) && (g_esGeneral.g_iGraphicsLevel > 2 || g_esGeneral.g_cvMTGraphicsLevel.IntValue > 2)) + { + case true: + { + if (!g_esPlayer[tank].g_bRainbowColor) + { + g_esPlayer[tank].g_bRainbowColor = SDKHookEx(tank, SDKHook_PreThinkPost, OnTankRainbowPreThinkPost); + } } + case false: vSetTankGlow(tank); } } } - else if (StrContains(keyword, "version", false) != -1) +} + +void vColorLight(int light, int red, int green, int blue, int alpha) +{ + char sColor[12]; + IntToString(alpha, sColor, sizeof sColor); + DispatchKeyValue(light, "renderamt", sColor); + + FormatEx(sColor, sizeof sColor, "%i %i %i", red, green, blue); + DispatchKeyValue(light, "rendercolor", sColor); +} + +void vCopyTankStats(int tank, int newtank) +{ + SetEntProp(newtank, Prop_Data, "m_iMaxHealth", GetEntProp(tank, Prop_Data, "m_iMaxHealth")); + + g_esPlayer[newtank].g_bArtificial = g_esPlayer[tank].g_bArtificial; + g_esPlayer[newtank].g_bBlood = g_esPlayer[tank].g_bBlood; + g_esPlayer[newtank].g_bBlur = g_esPlayer[tank].g_bBlur; + g_esPlayer[newtank].g_bBoss = g_esPlayer[tank].g_bBoss; + g_esPlayer[newtank].g_bCombo = g_esPlayer[tank].g_bCombo; + g_esPlayer[newtank].g_bElectric = g_esPlayer[tank].g_bElectric; + g_esPlayer[newtank].g_bFire = g_esPlayer[tank].g_bFire; + g_esPlayer[newtank].g_bFirstSpawn = g_esPlayer[tank].g_bFirstSpawn; + g_esPlayer[newtank].g_bIce = g_esPlayer[tank].g_bIce; + g_esPlayer[newtank].g_bKeepCurrentType = g_esPlayer[tank].g_bKeepCurrentType; + g_esPlayer[newtank].g_bMeteor = g_esPlayer[tank].g_bMeteor; + g_esPlayer[newtank].g_bPassive = g_esPlayer[tank].g_bPassive; + g_esPlayer[newtank].g_bProtected[0] = g_esPlayer[tank].g_bProtected[0]; + g_esPlayer[newtank].g_bProtected[1] = g_esPlayer[tank].g_bProtected[1]; + g_esPlayer[newtank].g_bRandomized = g_esPlayer[tank].g_bRandomized; + g_esPlayer[newtank].g_bSmoke = g_esPlayer[tank].g_bSmoke; + g_esPlayer[newtank].g_bSpit = g_esPlayer[tank].g_bSpit; + g_esPlayer[newtank].g_bTransformed = g_esPlayer[tank].g_bTransformed; + g_esPlayer[newtank].g_flLastAttackTime = g_esPlayer[tank].g_flLastAttackTime; + g_esPlayer[newtank].g_iBossStageCount = g_esPlayer[tank].g_iBossStageCount; + g_esPlayer[newtank].g_iClawCount = g_esPlayer[tank].g_iClawCount; + g_esPlayer[newtank].g_iClawDamage = g_esPlayer[tank].g_iClawDamage; + g_esPlayer[newtank].g_iCooldown = g_esPlayer[tank].g_iCooldown; + g_esPlayer[newtank].g_iIncapCount = g_esPlayer[tank].g_iIncapCount; + g_esPlayer[newtank].g_iInfectedType = g_esPlayer[tank].g_iInfectedType; + g_esPlayer[newtank].g_iKillCount = g_esPlayer[tank].g_iKillCount; + g_esPlayer[newtank].g_iMiscCount = g_esPlayer[tank].g_iMiscCount; + g_esPlayer[newtank].g_iMiscDamage = g_esPlayer[tank].g_iMiscDamage; + g_esPlayer[newtank].g_iOldTankType = g_esPlayer[tank].g_iOldTankType; + g_esPlayer[newtank].g_iPropCount = g_esPlayer[tank].g_iPropCount; + g_esPlayer[newtank].g_iPropDamage = g_esPlayer[tank].g_iPropDamage; + g_esPlayer[newtank].g_iRockCount = g_esPlayer[tank].g_iRockCount; + g_esPlayer[newtank].g_iRockDamage = g_esPlayer[tank].g_iRockDamage; + g_esPlayer[newtank].g_iSurvivorDamage = g_esPlayer[tank].g_iSurvivorDamage; + g_esPlayer[newtank].g_iSpecialMaxHealth = g_esPlayer[tank].g_iSpecialMaxHealth; + g_esPlayer[newtank].g_iTankType = g_esPlayer[tank].g_iTankType; + + for (int iSurvivor = 1; iSurvivor <= MaxClients; iSurvivor++) + { + g_esPlayer[iSurvivor].g_iTankDamage[newtank] = g_esPlayer[iSurvivor].g_iTankDamage[tank]; + } + + if (bIsValidClient(newtank, MT_CHECK_FAKECLIENT) && g_esGeneral.g_iSpawnMode != 2) { - bPanel = !!StringToInt(code); + vMutantMenu(newtank, g_esPlayer[newtank].g_iInfectedType); + } - MT_PrintToChat(guest, "%s %s{yellow} v%s{mint}, by{olive} %s", MT_TAG3, MT_CONFIG_SECTION_MAIN, MT_VERSION, MT_AUTHOR); + delete g_esPlayer[tank].g_hPassiveTimer[0]; + delete g_esPlayer[tank].g_hPassiveTimer[1]; + delete g_esPlayer[tank].g_hProtectionTimer[0]; + delete g_esPlayer[tank].g_hProtectionTimer[1]; + + if (g_esPlayer[newtank].g_bPassive) + { + CreateTimer(3.0, tTimerResetPassiveDelay, GetClientUserId(newtank), TIMER_FLAG_NO_MAPCHANGE); } - if (bPanel) + if (g_esPlayer[newtank].g_bProtected[0]) { - vDeveloperPanel(guest); - vListDeveloperCodes(guest); + vResetProtectionTimers(tank, 1); + } + + if (g_esPlayer[newtank].g_bProtected[1]) + { + vResetProtectionTimers(tank, 2); } + + Call_StartForward(g_esGeneral.g_gfCopyStatsForward); + Call_PushCell(tank); + Call_PushCell(newtank); + Call_Finish(); } -void vSetupLaserSight(int survivor, bool toggle = true) +void vEvolveBoss(int tank, int limit, int stages, int type, int stage) { - switch (toggle) + if (stages >= stage && g_esPlayer[tank].g_iBossStageCount < stage) { - case true: + int iHealth = GetEntProp(tank, Prop_Data, "m_iHealth"); + if (iHealth <= limit) { - static int iIndex = -1; - if (iIndex == -1) + for (int iPos = 0; iPos < (sizeof esTankCache::g_iBossType); iPos++) { - iIndex = iGetPatchIndex("MTPatch_UpgradeSound"); - } - else if ((bIsDeveloper(survivor, 3) || (g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_DAMAGEBOOST)) && g_esGeneral.g_hSDKAddUpgrade != null) - { - if (!g_esPlayer[survivor].g_bCustomLaser) + if (g_esTankCache[tank].g_iBossType[iPos] == g_esPlayer[tank].g_iTankType && iPos >= (stage - 1)) { - g_esPlayer[survivor].g_bCustomLaser = true; - } + g_esPlayer[tank].g_iBossStageCount = (iPos + 1); - vInstallPatch(iIndex); - SDKCall(g_esGeneral.g_hSDKAddUpgrade, survivor, (g_bSecondGame ? 2 : 17)); - vRemovePatch(iIndex); - } - } - case false: - { - if (g_esGeneral.g_hSDKRemoveUpgrade != null) - { - if (g_esPlayer[survivor].g_bCustomLaser) - { - g_esPlayer[survivor].g_bCustomLaser = false; + return; } + } - SDKCall(g_esGeneral.g_hSDKRemoveUpgrade, survivor, (g_bSecondGame ? 2 : 17)); + g_esPlayer[tank].g_iBossStageCount = stage; + + int iType = g_esTank[type].g_iRecordedType[0]; + if (g_esPlayer[tank].g_iTankType == iType) + { + return; } + + vResetTankSpeed(tank); + vSurvivorReactions(tank); + vSetTankColor(tank, iType, false); + vTankSpawn(tank, 1); + + int iNewHealth = (GetEntProp(tank, Prop_Data, "m_iMaxHealth") + limit), + iLeftover = (iNewHealth - iHealth), + iLeftover2 = (iLeftover > MT_MAXHEALTH) ? (iLeftover - MT_MAXHEALTH) : iLeftover, + iFinalHealth = (iNewHealth > MT_MAXHEALTH) ? MT_MAXHEALTH : iNewHealth; + + g_esPlayer[tank].g_iSpecialMaxHealth += (iLeftover > MT_MAXHEALTH) ? iLeftover2 : iLeftover; + SetEntProp(tank, Prop_Data, "m_iHealth", iFinalHealth); + SetEntProp(tank, Prop_Data, "m_iMaxHealth", iFinalHealth); } } } -void vSetupLoadout(int developer, bool usual = true) +void vFlashlightProp(int player, float origin[3], float angles[3], int colors[4]) { - if (bIsDeveloper(developer, 2)) + g_esPlayer[player].g_iFlashlight = CreateEntityByName("light_dynamic"); + if (bIsValidEntity(g_esPlayer[player].g_iFlashlight)) { - vRemoveWeapons(developer); + char sColor[16]; + FormatEx(sColor, sizeof sColor, "%i %i %i %i", iGetRandomColor(colors[0]), iGetRandomColor(colors[1]), iGetRandomColor(colors[2]), iGetRandomColor(colors[3])); + DispatchKeyValue(g_esPlayer[player].g_iFlashlight, "_light", sColor); - if (usual) - { - char sSet[6][64]; - ExplodeString(g_esDeveloper[developer].g_sDevLoadout, ",", sSet, sizeof sSet, sizeof sSet[]); - vCheatCommand(developer, "give", "health"); + DispatchKeyValueInt(g_esPlayer[player].g_iFlashlight, "inner_cone", 0); + DispatchKeyValueInt(g_esPlayer[player].g_iFlashlight, "cone", 80); + DispatchKeyValueInt(g_esPlayer[player].g_iFlashlight, "brightness", 1); + DispatchKeyValueFloat(g_esPlayer[player].g_iFlashlight, "spotlight_radius", 240.0); + DispatchKeyValueFloat(g_esPlayer[player].g_iFlashlight, "distance", 255.0); + DispatchKeyValueInt(g_esPlayer[player].g_iFlashlight, "pitch", -90); + DispatchKeyValueInt(g_esPlayer[player].g_iFlashlight, "style", 5); - switch (g_bSecondGame && StrContains(sSet[1], "pistol") == -1 && StrContains(sSet[1], "chainsaw") == -1) - { - case true: - { - if (sSet[1][0] != '\0') - { - vGiveSurvivorRandomMeleeWeapon(developer, usual, sSet[1]); - } - } - case false: - { - if (sSet[1][0] != '\0') - { - vCheatCommand(developer, "give", sSet[1]); - } + float flOrigin[3], flAngles[3], flForward[3]; + GetClientEyePosition(player, origin); + GetClientEyeAngles(player, angles); + GetClientEyeAngles(player, flAngles); - if (sSet[5][0] != '\0') - { - vCheatCommand(developer, "give", sSet[5]); - } - } - } + flAngles[0] = 0.0; + flAngles[2] = 0.0; + GetAngleVectors(flAngles, flForward, NULL_VECTOR, NULL_VECTOR); + ScaleVector(flForward, -50.0); - for (int iPos = 0; iPos < ((sizeof sSet) - 1); iPos++) - { - if (iPos != 1 && sSet[iPos][0] != '\0') - { - vCheatCommand(developer, "give", sSet[iPos]); - } - } - } - else + flForward[2] = 0.0; + AddVectors(origin, flForward, flOrigin); + + angles[0] += 90.0; + flOrigin[2] -= 120.0; + AcceptEntityInput(g_esPlayer[player].g_iFlashlight, "TurnOn"); + TeleportEntity(g_esPlayer[player].g_iFlashlight, flOrigin, angles); + DispatchSpawn(g_esPlayer[player].g_iFlashlight); + vSetEntityParent(g_esPlayer[player].g_iFlashlight, player, true); + + if (bIsTank(player)) { - if (g_bSecondGame) - { - vGiveSurvivorRandomMeleeWeapon(developer, usual); + SDKHook(g_esPlayer[player].g_iFlashlight, SDKHook_SetTransmit, OnPropSetTransmit); + } - switch (MT_GetRandomInt(1, 5)) - { - case 1: vCheatCommand(developer, "give", "shotgun_spas"); - case 2: vCheatCommand(developer, "give", "autoshotgun"); - case 3: vCheatCommand(developer, "give", "rifle_ak47"); - case 4: vCheatCommand(developer, "give", "rifle"); - case 5: vCheatCommand(developer, "give", "sniper_military"); - } + g_esPlayer[player].g_iFlashlight = EntIndexToEntRef(g_esPlayer[player].g_iFlashlight); + } +} - switch (MT_GetRandomInt(1, 3)) - { - case 1: vCheatCommand(developer, "give", "molotov"); - case 2: vCheatCommand(developer, "give", "pipe_bomb"); - case 3: vCheatCommand(developer, "give", "vomitjar"); - } +void vKnockbackTank(int tank, int survivor) +{ + if ((bIsDeveloper(survivor, 9) || ((g_esShooter[survivor].g_iTotalPassives & MT_PASSIVE_DAMAGEBOOST) || (g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_DAMAGEBOOST))) && !bIsPlayerIncapacitated(tank) && GetRandomFloat(0.1, 100.0) <= flGetPelletChance(survivor, g_esPlayer[survivor].g_flSledgehammerRounds)) + { + vPerformKnockback(tank, survivor); + } +} - switch (MT_GetRandomInt(1, 2)) - { - case 1: vCheatCommand(developer, "give", "first_aid_kit"); - case 2: vCheatCommand(developer, "give", "defibrillator"); - } +void vLifeLeech(int survivor, int type, int damagetype = 0, int tank = 0) +{ + if (!bIsSurvivor(survivor) || bIsSurvivorDisabled(survivor) || (bIsInfected(tank) && (bIsPlayerIncapacitated(tank) || bIsCustomTank(tank))) || (damagetype != 0 && !(damagetype & DMG_CLUB) && !(damagetype & DMG_SLASH))) + { + return; + } - switch (MT_GetRandomInt(1, 2)) - { - case 1: vCheatCommand(developer, "give", "pain_pills"); - case 2: vCheatCommand(developer, "give", "adrenaline"); - } - } - else - { - switch (MT_GetRandomInt(1, 3)) - { - case 1: vCheatCommand(developer, "give", "autoshotgun"); - case 2: vCheatCommand(developer, "give", "rifle"); - case 3: vCheatCommand(developer, "give", "hunting_rifle"); - } + bool bDeveloper = bIsDeveloper(survivor, type); + int iLeech = 0; - switch (MT_GetRandomInt(1, 2)) - { - case 1: vCheatCommand(developer, "give", "molotov"); - case 2: vCheatCommand(developer, "give", "pipe_bomb"); - } + switch (type) + { + case 5: iLeech = (bDeveloper && g_esDeveloper[survivor].g_iDevLifeLeech > g_esPlayer[survivor].g_iLifeLeech) ? g_esDeveloper[survivor].g_iDevLifeLeech : g_esPlayer[survivor].g_iLifeLeech; + case 7: iLeech = (bDeveloper && g_esDeveloper[survivor].g_iDevHealthRegen > g_esPlayer[survivor].g_iHealthRegen) ? g_esDeveloper[survivor].g_iDevHealthRegen : g_esPlayer[survivor].g_iHealthRegen; + default: return; + } - vCheatCommand(developer, "give", "pistol"); - vCheatCommand(developer, "give", "pistol"); - vCheatCommand(developer, "give", "first_aid_kit"); - vCheatCommand(developer, "give", "pain_pills"); - } + if ((!bDeveloper && !(g_esShooter[survivor].g_iTotalPassives & MT_PASSIVE_HEALTH) && (!(g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_HEALTH) || g_esPlayer[survivor].g_flRewardTime[0] == -1.0)) || iLeech <= 0) + { + return; + } + + vRegenSurvivorHealth(survivor, survivor, iLeech); +} + +void vLightProp(int tank, int light, float origin[3], float angles[3]) +{ + g_esPlayer[tank].g_iLight[light] = CreateEntityByName("beam_spotlight"); + if (bIsValidEntity(g_esPlayer[tank].g_iLight[light])) + { + if (light < 3) + { + char sTargetName[64]; + FormatEx(sTargetName, sizeof sTargetName, "mutant_tank_light_%i_%i_%i", tank, g_esPlayer[tank].g_iTankType, light); + DispatchKeyValue(g_esPlayer[tank].g_iLight[light], "targetname", sTargetName); + + DispatchKeyValueVector(g_esPlayer[tank].g_iLight[light], "origin", origin); + DispatchKeyValueVector(g_esPlayer[tank].g_iLight[light], "angles", angles); + DispatchKeyValueInt(g_esPlayer[tank].g_iLight[light], "fadescale", 1); + DispatchKeyValueInt(g_esPlayer[tank].g_iLight[light], "fademindist", -1); + + vColorLight(g_esPlayer[tank].g_iLight[light], iGetRandomColor(g_esTankCache[tank].g_iLightColor[0]), iGetRandomColor(g_esTankCache[tank].g_iLightColor[1]), iGetRandomColor(g_esTankCache[tank].g_iLightColor[2]), iGetRandomColor(g_esTankCache[tank].g_iLightColor[3])); + } + else + { + DispatchKeyValueInt(g_esPlayer[tank].g_iLight[light], "haloscale", 100); + vColorLight(g_esPlayer[tank].g_iLight[light], iGetRandomColor(g_esTankCache[tank].g_iCrownColor[0]), iGetRandomColor(g_esTankCache[tank].g_iCrownColor[1]), iGetRandomColor(g_esTankCache[tank].g_iCrownColor[2]), iGetRandomColor(g_esTankCache[tank].g_iCrownColor[3])); } - vCheckGunClipSizes(developer); - } -} + DispatchKeyValueInt(g_esPlayer[tank].g_iLight[light], "spotlightwidth", 10); + DispatchKeyValueInt(g_esPlayer[tank].g_iLight[light], "spotlightlength", 50); + DispatchKeyValueInt(g_esPlayer[tank].g_iLight[light], "spawnflags", 3); + DispatchKeyValueInt(g_esPlayer[tank].g_iLight[light], "maxspeed", 100); + DispatchKeyValueFloat(g_esPlayer[tank].g_iLight[light], "HDRColorScale", 0.7); -void vSetupPerks(int admin, bool setup = true) -{ - if (setup) - { - if (bIsSurvivor(admin)) + float flOrigin[3] = {0.0, 0.0, 70.0}, flAngles[3] = {-45.0, 0.0, 0.0}; + if (light < 3) { - if (bIsDeveloper(admin, 0)) + char sParentName[64], sTargetName[64]; + FormatEx(sTargetName, sizeof sTargetName, "mutant_tank_%i_%i_%i", tank, g_esPlayer[tank].g_iTankType, light); + DispatchKeyValue(tank, "targetname", sTargetName); + GetEntPropString(tank, Prop_Data, "m_iName", sParentName, sizeof sParentName); + DispatchKeyValue(g_esPlayer[tank].g_iLight[light], "parentname", sParentName); + + SetVariantString(sParentName); + AcceptEntityInput(g_esPlayer[tank].g_iLight[light], "SetParent", g_esPlayer[tank].g_iLight[light], g_esPlayer[tank].g_iLight[light]); + SetEntPropEnt(g_esPlayer[tank].g_iLight[light], Prop_Data, "m_hOwnerEntity", tank); + + switch (light) { - if (g_esDeveloper[admin].g_sDevFlashlight[0] != '\0') + case 0: { - vSetSurvivorLight(admin, g_esDeveloper[admin].g_sDevFlashlight, .delimiter = ","); + SetVariantString("mouth"); + vSetVector(angles, -90.0, 0.0, 0.0); } - - if (g_esDeveloper[admin].g_sDevGlowOutline[0] != '\0') + case 1: { - vSetSurvivorOutline(admin, g_esDeveloper[admin].g_sDevGlowOutline, .delimiter = ","); + SetVariantString("rhand"); + vSetVector(angles, 90.0, 0.0, 0.0); } - - if (g_esDeveloper[admin].g_sDevSkinColor[0] != '\0') + case 2: { - vSetSurvivorColor(admin, g_esDeveloper[admin].g_sDevSkinColor, .delimiter = ","); + SetVariantString("lhand"); + vSetVector(angles, -90.0, 0.0, 0.0); } - - vSetSurvivorParticle(admin); } - else if (g_esDeveloper[admin].g_bDevVisual) - { - g_esDeveloper[admin].g_bDevVisual = false; - vToggleSurvivorEffects(admin); + AcceptEntityInput(g_esPlayer[tank].g_iLight[light], "SetParentAttachment"); + } + else + { + vSetEntityParent(g_esPlayer[tank].g_iLight[light], tank, true); + + switch (light) + { + case 3: flAngles[1] = 60.0; + case 4: flAngles[1] = 120.0; + case 5: flAngles[1] = 180.0; + case 6: flAngles[1] = 240.0; + case 7: flAngles[1] = 300.0; + case 8: flAngles[1] = 360.0; } } - } - else if (bIsValidClient(admin)) - { - if (bIsValidClient(admin, MT_CHECK_ALIVE) && g_esDeveloper[admin].g_bDevVisual) + + AcceptEntityInput(g_esPlayer[tank].g_iLight[light], "Enable"); + AcceptEntityInput(g_esPlayer[tank].g_iLight[light], "DisableCollision"); + AcceptEntityInput(g_esPlayer[tank].g_iLight[light], "TurnOn"); + + switch (light) { - vToggleSurvivorEffects(admin); + case 0, 1, 2: TeleportEntity(g_esPlayer[tank].g_iLight[light], .angles = angles); + case 3, 4, 5, 6, 7, 8: TeleportEntity(g_esPlayer[tank].g_iLight[light], flOrigin, flAngles); } - g_esDeveloper[admin].g_bDevVisual = false; + DispatchSpawn(g_esPlayer[tank].g_iLight[light]); + SDKHook(g_esPlayer[tank].g_iLight[light], SDKHook_SetTransmit, OnPropSetTransmit); + g_esPlayer[tank].g_iLight[light] = EntIndexToEntRef(g_esPlayer[tank].g_iLight[light]); } } -void vSurvivorReactions(int tank) +void vMutateTank(int tank, int specType, int type, bool blind) { - int iEffects = g_esCache[tank].g_iBossEffects; - if (iEffects > 0) + if (bCanTypeSpawn(.specType = specType)) { - float flTankPos[3]; - GetClientAbsOrigin(tank, flTankPos); - if (iEffects & MT_BOSS_REACTIONS) + g_esPlayer[tank].g_bBlindTank = blind; + bool bSpecial = bIsSpecialInfected(tank), bTank = bIsTank(tank), bVersus = bIsCompetitiveModeRound(2); + int iType = 0; + if (type == 0 && g_esPlayer[tank].g_iTankType <= 0) { - char sModel[40]; - float flSurvivorPos[3]; - for (int iSurvivor = 1; iSurvivor <= MaxClients; iSurvivor++) + if (bTank) { - if (bIsSurvivor(iSurvivor, MT_CHECK_INGAME|MT_CHECK_ALIVE)) + if (bVersus) { - GetClientAbsOrigin(iSurvivor, flSurvivorPos); - if (GetVectorDistance(flTankPos, flSurvivorPos) <= 500.0) + iType = g_esGeneral.g_alCompTypes[0].Get(0); + g_esGeneral.g_alCompTypes[0].Erase(0); + + vSetTankColor(tank, iType, false); + } + else + { + switch (g_esGeneral.g_bFinalMap) { - if (bIsValidClient(iSurvivor, MT_CHECK_FAKECLIENT)) - { - vShakePlayerScreen(iSurvivor, 2.0); - } + case true: iType = (g_esGeneral.g_iFinaleMode == 1) ? iChooseMutantTank(tank, 1, g_esGeneral.g_iFinaleMinTypes[g_esGeneral.g_iTankWave], g_esGeneral.g_iFinaleMaxTypes[g_esGeneral.g_iTankWave]) : iChooseMutantTank(tank, 1); + case false: iType = (g_esGeneral.g_iRegularMode == 1 && g_esGeneral.g_iRegularWave == 1) ? iChooseMutantTank(tank, 1, g_esGeneral.g_iRegularMinType, g_esGeneral.g_iRegularMaxType) : iChooseMutantTank(tank, 1); } + } - switch (MT_GetRandomInt(1, 5)) - { - case 1: - { - GetEntPropString(iSurvivor, Prop_Data, "m_ModelName", sModel, sizeof sModel); + if (!g_esGeneral.g_bForceSpawned) + { + DataPack dpCountCheck; + CreateDataTimer(g_esGeneral.g_flExtrasDelay, tTimerTankCountCheck, dpCountCheck, TIMER_FLAG_NO_MAPCHANGE); + dpCountCheck.WriteCell(GetClientUserId(tank)); - switch (sModel[29]) - { - case 'b', 'd', 'c', 'h': vForceVocalize(iSurvivor, "C2M1Falling"); - case 'v', 'n', 'e', 'a': vForceVocalize(iSurvivor, "PlaneCrashResponse"); - } - } - case 2: vForceVocalize(iSurvivor, "PlayerYellRun"); - case 3: + switch (g_esGeneral.g_bFinalMap) + { + case true: { - switch (g_esPlayer[tank].g_iInfectedType) + switch (g_esGeneral.g_iFinaleAmount) { - case 1: vForceVocalize(iSurvivor, (g_bSecondGame ? "PlayerWarnSmoker" : "PlayerAlsoWarnSmoker")); - case 2: vForceVocalize(iSurvivor, (g_bSecondGame ? "PlayerWarnBoomer" : "PlayerAlsoWarnBoomer")); - case 3: vForceVocalize(iSurvivor, (g_bSecondGame ? "PlayerWarnHunter" : "PlayerAlsoWarnHunter")); - case 4: vForceVocalize(iSurvivor, "PlayerWarnSpitter"); - case 5: vForceVocalize(iSurvivor, (g_bSecondGame ? "PlayerWarnJockey" : "PlayerAlsoWarnTank")); - case 6: vForceVocalize(iSurvivor, "PlayerWarnCharger"); - default: vForceVocalize(iSurvivor, (g_bSecondGame ? "PlayerWarnTank" : "PlayerAlsoWarnTank")); + case -1, 0: dpCountCheck.WriteCell(g_esGeneral.g_iFinaleWave[g_esGeneral.g_iTankWave]); + default: dpCountCheck.WriteCell(g_esGeneral.g_iFinaleAmount); } } - case 4: vForceVocalize(iSurvivor, "PlayerBackUp"); - case 5: vForceVocalize(iSurvivor, "PlayerEmphaticGo"); + case false: dpCountCheck.WriteCell(g_esGeneral.g_iRegularAmount); } } } + else if (bSpecial) + { + iChooseMutantTank(tank, 1); + } } - - if (iEffects & MT_BOSS_EXPLOSION) + else if (type != -1) { - int iExplosion = CreateEntityByName("env_explosion"); - if (bIsValidEntity(iExplosion)) + if (bTank) { - DispatchKeyValue(iExplosion, "fireballsprite", SPRITE_EXPLODE); - DispatchKeyValueInt(iExplosion, "iMagnitude", 50); - DispatchKeyValueInt(iExplosion, "rendermode", 5); - DispatchKeyValueInt(iExplosion, "spawnflags", 1); - - TeleportEntity(iExplosion, flTankPos); - DispatchSpawn(iExplosion); - - SetEntPropEnt(iExplosion, Prop_Data, "m_hOwnerEntity", tank); - SetEntProp(iExplosion, Prop_Send, "m_iTeamNum", 3); - AcceptEntityInput(iExplosion, "Explode"); + switch (!bVersus || (bIsTank(tank, MT_CHECK_FAKECLIENT) && g_esPlayer[tank].g_iPersonalType == type)) + { + case true: + { + iType = (type > 0) ? type : g_esPlayer[tank].g_iTankType; + g_esPlayer[tank].g_iPersonalType = 0; - iExplosion = EntIndexToEntRef(iExplosion); - vDeleteEntity(iExplosion, 2.0); + vSetTankColor(tank, iType, false, .store = true); + } + case false: + { + iType = g_esGeneral.g_alCompTypes[0].Get(0); + g_esGeneral.g_alCompTypes[0].Erase(0); - EmitSoundToAll((g_bSecondGame ? SOUND_EXPLOSION2 : SOUND_EXPLOSION1), iExplosion, 0, 75, 0, 1.0, 100, -1, NULL_VECTOR, NULL_VECTOR, true, 0.0); + vSetTankColor(tank, iType, false); + } + } } - } - - if (iEffects & MT_BOSS_IMPACTWAVE) - { - flTankPos[2] += 40.0; - TE_SetupBeamRingPoint(flTankPos, 10.0, 2000.0, g_iBossBeamSprite, g_iBossHaloSprite, 0, 50, 1.0, 88.0, 3.0, {255, 255, 255, 50}, 1000, 0); - TE_SendToAll(); - vPushNearbyEntities(tank, flTankPos); - } - - if (g_bSecondGame && (iEffects & MT_BOSS_SLOWMOTION)) - { - int iTimescale = CreateEntityByName("func_timescale"); - if (bIsValidEntity(iTimescale)) + else if (bSpecial) { - DispatchKeyValueFloat(iTimescale, "desiredTimescale", 0.2); - DispatchKeyValueFloat(iTimescale, "acceleration", 2.0); - DispatchKeyValueFloat(iTimescale, "minBlendRate", 1.0); - DispatchKeyValueFloat(iTimescale, "blendDeltaMultiplier", 2.0); - - DispatchSpawn(iTimescale); - AcceptEntityInput(iTimescale, "Start"); + iType = (type > 0) ? type : g_esPlayer[tank].g_iTankType; + for (int iSpecType = 0; iSpecType < (sizeof g_sSpecialNames); iSpecType++) + { + g_esTeammate[tank].g_iPersonalType[iSpecType] = 0; + } - CreateTimer(0.75, tTimerRemoveTimescale, EntIndexToEntRef(iTimescale), TIMER_FLAG_NO_MAPCHANGE); + vSetTankColor(tank, iType, false); } } - } -} - -void vToggleSurvivorEffects(int survivor, bool override = false, int type = -1, bool toggle = true) -{ - if (!override && bIsDeveloper(survivor, 0)) - { - return; - } - - if (type == -1 || type == 4) - { - char sDelimiter[2]; - sDelimiter = (FindCharInString(g_esPlayer[survivor].g_sLightColor, ';') != -1) ? ";" : ","; - switch (toggle && g_esPlayer[survivor].g_flVisualTime[4] != -1.0 && g_esPlayer[survivor].g_flVisualTime[4] > GetGameTime()) + if (g_esPlayer[tank].g_iTankType > 0) { - case true: vSetSurvivorLight(survivor, g_esPlayer[survivor].g_sLightColor, g_esPlayer[survivor].g_bApplyVisuals[4], sDelimiter, true); - case false: vRemoveSurvivorLight(survivor); - } - } - - if (type == -1 || type == 5) - { - char sDelimiter[2]; - sDelimiter = (FindCharInString(g_esPlayer[survivor].g_sBodyColor, ';') != -1) ? ";" : ","; + vTankSpawn(tank, .specType = specType); + CreateTimer(0.1, tTimerCheckTankView, GetClientUserId(tank), TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); + CreateTimer(1.0, tTimerTankUpdate, GetClientUserId(tank), TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); - switch (toggle && g_esPlayer[survivor].g_flVisualTime[5] != -1.0 && g_esPlayer[survivor].g_flVisualTime[5] > GetGameTime()) - { - case true: vSetSurvivorColor(survivor, g_esPlayer[survivor].g_sBodyColor, g_esPlayer[survivor].g_bApplyVisuals[5], sDelimiter, true); - case false: + if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esPlayer[tank].g_iFavoriteType > 0 && iType != g_esPlayer[tank].g_iFavoriteType && g_esGeneral.g_iSpawnMode == 2) { - SetEntityRenderMode(survivor, RENDER_NORMAL); - SetEntityRenderColor(survivor, 255, 255, 255, 255); + vFavoriteMenu(tank, specType); } } - } + else + { + vCacheTankSettings(tank); + vSetTankModel(tank); + vSetTankHealth(tank); + vResetTankSpeed(tank, false); + vSetTankThrowInterval(tank); + SDKHook(tank, SDKHook_PostThinkPost, OnTankPostThinkPost); - if (type == -1 || type == 6) - { - char sDelimiter[2]; - sDelimiter = (FindCharInString(g_esPlayer[survivor].g_sOutlineColor, ';') != -1) ? ";" : ","; + DataPack dpAnnounce; + CreateDataTimer(0.1, tTimerAnnounce2, dpAnnounce, TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); + dpAnnounce.WriteCell(GetClientUserId(tank)); + dpAnnounce.WriteCell(specType); - switch (toggle && g_esPlayer[survivor].g_flVisualTime[6] != -1.0 && g_esPlayer[survivor].g_flVisualTime[6] > GetGameTime()) - { - case true: vSetSurvivorOutline(survivor, g_esPlayer[survivor].g_sOutlineColor, g_esPlayer[survivor].g_bApplyVisuals[6], sDelimiter, true); - case false: vRemovePlayerGlow(survivor); + g_esPlayer[tank].g_flLastAttackTime = GetGameTime(); + g_esPlayer[tank].g_iSpecialMaxHealth = GetEntProp(tank, Prop_Data, "m_iMaxHealth"); + g_esGeneral.g_iTankCount += (bTank ? 1 : 0); + g_esGeneral.g_iSpecialCount += (bSpecial ? 1 : 0); } } -} -void vToggleWeaponVerticalPunch(int survivor, bool toggle) -{ - switch (toggle) - { - case true: - { - if ((bIsDeveloper(survivor, 4) || ((g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_DAMAGEBOOST) && g_esPlayer[survivor].g_iRecoilDampener == 1)) && bIsValidClient(survivor, MT_CHECK_FAKECLIENT)) - { - g_esGeneral.g_cvMTGunVerticalPunch.ReplicateToClient(survivor, "0"); - } - } - case false: - { - if (!bIsDeveloper(survivor, 4) && (!(g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_DAMAGEBOOST) || g_esPlayer[survivor].g_iRecoilDampener <= 0) && bIsValidClient(survivor, MT_CHECK_FAKECLIENT)) - { - g_esGeneral.g_cvMTGunVerticalPunch.ReplicateToClient(survivor, g_esGeneral.g_sDefaultGunVerticalPunch); - } - } + float flVelocity[3]; + GetEntPropVector(tank, Prop_Data, "m_vecVelocity", flVelocity); + if (flVelocity[0] == 0.0 && flVelocity[1] == 0.0 && flVelocity[2] == 0.0) + { + vFixPlayerPosition(tank); } + + g_esGeneral.g_bBlindType = false; + g_esGeneral.g_bForceSpawned = false; + g_esGeneral.g_iChosenType = 0; } -void vUnvomitPlayer(int player) +void vNullifyNudge(int survivor) { - if (g_esGeneral.g_hSDKITExpired != null) + if (!bIsSurvivor(survivor) || bIsSurvivor(survivor, MT_CHECK_FAKECLIENT) || bIsSurvivorDisabled(survivor)) { - SDKCall(g_esGeneral.g_hSDKITExpired, player); + return; } -} -void vVocalizeTankDeath(int killer, int assistant, int tank) -{ - if (g_esCache[tank].g_iVocalizeDeath == 1) + if (bIsDeveloper(survivor, 4) || bIsDeveloper(survivor, 11) || (((g_esShooter[survivor].g_iTotalPassives & MT_PASSIVE_GODMODE) || (g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_GODMODE)) && g_esPlayer[survivor].g_iRiotGear == 1)) { - if (bIsSurvivor(killer)) - { - vForceVocalize(killer, "PlayerHurrah"); - } - - if (bIsSurvivor(assistant) && assistant != killer) + float flCurrentTime = GetGameTime(); + if (GetEntPropFloat(survivor, Prop_Send, "m_noAvoidanceTimer", 1) > (flCurrentTime + 2.0)) { - vForceVocalize(assistant, "PlayerTaunt"); + return; } - for (int iTeammate = 1; iTeammate <= MaxClients; iTeammate++) - { - if (bIsSurvivor(iTeammate, MT_CHECK_INGAME|MT_CHECK_ALIVE) && g_esPlayer[iTeammate].g_iTankDamage[tank] > 0.0 && iTeammate != killer && iTeammate != assistant) - { - vForceVocalize(iTeammate, "PlayerNiceJob"); - } - } + SetEntPropFloat(survivor, Prop_Send, "m_noAvoidanceTimer", (flCurrentTime + 2.0), 1); } } -/** - * Tank functions - **/ - -void vAnnounceArrival(int tank, int specType) +void vPerformKnockback(int special, int survivor) { - switch (specType) + if (g_esGeneral.g_hSDKShovedBySurvivor != null) { - case 1: vAnnounceTankArrival(tank, "NoNameSmoker", specType); - case 2: vAnnounceTankArrival(tank, "NoNameBoomer", specType); - case 3: vAnnounceTankArrival(tank, "NoNameHunter", specType); - case 4: vAnnounceTankArrival(tank, "NoNameSpitter", specType); - case 5: vAnnounceTankArrival(tank, "NoNameJockey", specType); - case 6: vAnnounceTankArrival(tank, "NoNameCharger", specType); - default: vAnnounceTankArrival(tank, "NoName", specType); + float flTankOrigin[3], flSurvivorOrigin[3], flDirection[3]; + GetClientAbsOrigin(survivor, flSurvivorOrigin); + GetClientAbsOrigin(special, flTankOrigin); + MakeVectorFromPoints(flSurvivorOrigin, flTankOrigin, flDirection); + NormalizeVector(flDirection, flDirection); + SDKCall(g_esGeneral.g_hSDKShovedBySurvivor, special, survivor, flDirection); } + + SetEntPropFloat(special, Prop_Send, "m_flVelocityModifier", 0.4); } -void vAnnounceTankArrival(int tank, const char[] name, int specType) +void vPunishSurvivor(int survivor, bool human, int type) { - if (!bIsCustomTank(tank) && !g_esGeneral.g_bFinaleEnded) + if (!g_esPlayer[survivor].g_bPunished) { - if (g_esCache[tank].g_iAnnounceArrival != 0 && (g_esCache[tank].g_iAnnounceArrival & MT_ARRIVAL_SPAWN)) - { - int iOption = iGetMessageType(g_esCache[tank].g_iArrivalMessage); - if (iOption > 0) - { - char sPhrase[32]; - FormatEx(sPhrase, sizeof sPhrase, "Arrival%i", iOption); - MT_PrintToChatAll("%s %t", MT_TAG2, sPhrase, name); - vLogMessage(MT_LOG_LIFE, _, "%s %T", MT_TAG, sPhrase, LANG_SERVER, name); - } - } + g_esPlayer[survivor].g_bPunished = true; - int iProtection = g_esCache[tank].g_iSpawnProtection; - if (iProtection > 0) + int iChosenType = (human ? g_esGeneral.g_iPunishEnabled[type] : g_esGeneral.g_iPunishBots[type]), iSpecial = iSpawnNearbySpecial(survivor, g_esGeneral.g_iPunisherTypes[type], iChosenType, false); + if (bIsInfected(iSpecial)) { - if ((iProtection == 1 || iProtection == 3) && g_esCache[tank].g_flShieldDuration > 0.0) - { - g_esPlayer[tank].g_bProtected[0] = true; - - vResetProtectionTimers(tank, iProtection); - } + g_esPlayer[iSpecial].g_bPunisher = true; - if ((iProtection == 2 || iProtection == 3) && g_esCache[tank].g_flArmorDuration > 0.0) + if (g_esGeneral.g_flPunisherLifetime[type] > 0.0) { - g_esPlayer[tank].g_bProtected[1] = true; - - vResetProtectionTimers(tank, iProtection); + DataPack dpPunish; + CreateDataTimer(g_esGeneral.g_flPunisherLifetime[type], tTimerRemovePunisher, dpPunish, TIMER_FLAG_NO_MAPCHANGE); + dpPunish.WriteCell(GetClientUserId(survivor)); + dpPunish.WriteCell(GetClientUserId(iSpecial)); } - } - - if (g_esCache[tank].g_iVocalizeArrival == 1 || g_esCache[tank].g_iArrivalSound == 1) - { - for (int iPlayer = 1; iPlayer <= MaxClients; iPlayer++) - { - if (g_esCache[tank].g_iVocalizeArrival == 1 && bIsSurvivor(iPlayer, MT_CHECK_INGAME|MT_CHECK_ALIVE)) - { - switch (MT_GetRandomInt(1, 3)) - { - case 1: vForceVocalize(iPlayer, "PlayerYellRun"); - case 2: - { - switch (specType) - { - case 1: vForceVocalize(iPlayer, (g_bSecondGame ? "PlayerWarnSmoker" : "PlayerAlsoWarnSmoker")); - case 2: vForceVocalize(iPlayer, (g_bSecondGame ? "PlayerWarnBoomer" : "PlayerAlsoWarnBoomer")); - case 3: vForceVocalize(iPlayer, (g_bSecondGame ? "PlayerWarnHunter" : "PlayerAlsoWarnHunter")); - case 4: vForceVocalize(iPlayer, "PlayerWarnSpitter"); - case 5: vForceVocalize(iPlayer, (g_bSecondGame ? "PlayerWarnJockey" : "PlayerAlsoWarnTank")); - case 6: vForceVocalize(iPlayer, "PlayerWarnCharger"); - default: vForceVocalize(iPlayer, (g_bSecondGame ? "PlayerWarnTank" : "PlayerAlsoWarnTank")); - } - } - case 3: vForceVocalize(iPlayer, "PlayerBackUp"); - } - } - if (g_esCache[tank].g_iArrivalSound == 1 && bIsValidClient(iPlayer, MT_CHECK_INGAME|MT_CHECK_FAKECLIENT)) - { - EmitSoundToClient(iPlayer, SOUND_SPAWN, iPlayer, SNDCHAN_WEAPON, SNDLEVEL_SCREAMING); - } - } + vZedTime(g_esGeneral.g_flZedTime[type]); } } } -void vAnnounceTankDeath(int tank, int killer = 0, float percentage = 0.0, int assistant = 0, float assistPercentage = 0.0, bool override = true) +void vQueueTank(int admin, int specType, int type, bool mode = true, bool log = true, bool custom = false) { - bool bAnnounce = false; + char sType[5]; + IntToString(type, sType, sizeof sType); - switch (g_esCache[tank].g_iAnnounceDeath) + switch (custom) { - case -1, 0: bAnnounce = false; - case 1: bAnnounce = override; - case 2: - { - int iOption = iGetMessageType(g_esCache[tank].g_iDeathMessage); - if (iOption > 0) - { - char sDetails[128], sPhrase[32], sTankName[64], sTeammates[5][768]; - vGetTranslatedName(sTankName, sizeof sTankName, tank); - if (bIsSurvivor(killer, MT_CHECK_INDEX|MT_CHECK_INGAME)) - { - char sKiller[128]; - vRecordKiller(tank, killer, percentage, assistant, sKiller, sizeof sKiller); - FormatEx(sPhrase, sizeof sPhrase, "Killer%i", iOption); - vRecordDamage(tank, killer, assistant, assistPercentage, sDetails, sizeof sDetails, sTeammates, sizeof sTeammates, sizeof sTeammates[]); - MT_PrintToChatAll("%s %t", MT_TAG2, sPhrase, sKiller, sTankName, sDetails); - vLogMessage(MT_LOG_LIFE, _, "%s %T", MT_TAG, sPhrase, LANG_SERVER, sKiller, sTankName, sDetails); - vShowDamageList(tank, sTankName, sTeammates, sizeof sTeammates); - vVocalizeTankDeath(killer, assistant, tank); - } - else if (assistPercentage >= 1.0) - { - FormatEx(sPhrase, sizeof sPhrase, "Assist%i", iOption); - vRecordDamage(tank, killer, assistant, assistPercentage, sDetails, sizeof sDetails, sTeammates, sizeof sTeammates, sizeof sTeammates[]); - MT_PrintToChatAll("%s %t", MT_TAG2, sPhrase, sTankName, sDetails); - vLogMessage(MT_LOG_LIFE, _, "%s %T", MT_TAG, sPhrase, LANG_SERVER, sTankName, sDetails); - vShowDamageList(tank, sTankName, sTeammates, sizeof sTeammates); - vVocalizeTankDeath(killer, assistant, tank); - } - else - { - bAnnounce = override; - } - } - } + case true: vSetupTankCustomSpawn(admin, specType, sType, log); + case false: vSetupTankSpawn(admin, specType, sType, mode, log); } +} - if (!bIsCustomTank(tank)) +void vRegenSurvivorHealth(int survivor, int healer, int extra) +{ + if (survivor != healer) { - if (bAnnounce) - { - int iOption = iGetMessageType(g_esCache[tank].g_iDeathMessage); - if (iOption > 0) - { - char sPhrase[32], sTankName[64]; - FormatEx(sPhrase, sizeof sPhrase, "Death%i", iOption); - vGetTranslatedName(sTankName, sizeof sTankName, tank); - MT_PrintToChatAll("%s %t", MT_TAG2, sPhrase, sTankName); - vLogMessage(MT_LOG_LIFE, _, "%s %T", MT_TAG, sPhrase, LANG_SERVER, sTankName); - } - } - - if (g_esCache[tank].g_iVocalizeDeath == 1 || g_esCache[tank].g_iDeathSound == 1) + int iBlood = GetEntProp(healer, Prop_Data, "m_iHealth"), iDonor = (g_esPlayer[survivor].g_iBloodDonor > 0) ? g_esPlayer[survivor].g_iBloodDonor : g_esPlayer[healer].g_iBloodDonor; + if (iDonor > 0) { - for (int iPlayer = 1; iPlayer <= MaxClients; iPlayer++) + switch ((iDonor >= iBlood) || bIsSurvivorDisabled(healer)) { - if (bAnnounce && g_esCache[tank].g_iVocalizeDeath == 1 && bIsSurvivor(iPlayer, MT_CHECK_INGAME|MT_CHECK_ALIVE)) - { - switch (MT_GetRandomInt(1, 3)) - { - case 1: vForceVocalize(iPlayer, "PlayerHurrah"); - case 2: vForceVocalize(iPlayer, "PlayerTaunt"); - case 3: vForceVocalize(iPlayer, "PlayerNiceJob"); - } - } - - if (g_esCache[tank].g_iDeathSound == 1 && bIsValidClient(iPlayer, MT_CHECK_INGAME|MT_CHECK_FAKECLIENT)) - { - EmitSoundToClient(iPlayer, SOUND_DEATH, iPlayer, SNDCHAN_WEAPON, SNDLEVEL_SCREAMING); - } + case true: return; + case false: SetEntProp(healer, Prop_Data, "m_iHealth", (iBlood - iDonor)); } } } -} -void vChangeTank(int admin, int specType, int amount, int mode, bool blind) -{ - int iTarget = GetClientAimTarget(admin); + bool bDeveloper = bIsDeveloper(healer, 3); + float flTempHealth = flGetTempHealth(survivor, g_esGeneral.g_cvMTPainPillsDecayRate.FloatValue); + int iHealth = GetEntProp(survivor, Prop_Data, "m_iHealth"), iOverhealth = (bDeveloper && g_esDeveloper[healer].g_iDevOverhealth > 0) ? g_esDeveloper[healer].g_iDevOverhealth : g_esPlayer[healer].g_iOverhealth, + iMaxHealth = (iOverhealth > 0) ? iOverhealth : GetEntProp(survivor, Prop_Data, "m_iMaxHealth"); - switch (bIsInfected(iTarget)) + if (!bDeveloper && (g_esPlayer[survivor].g_iReviveCount > 0 || g_esPlayer[survivor].g_bLastLife[0])) { - case true: + switch ((flTempHealth + extra) > iMaxHealth) { - vSetTankColor(iTarget, g_esGeneral.g_iChosenType); - vTankSpawn(iTarget, 5, specType); - vExternalView(iTarget, 1.5); - - g_esGeneral.g_bBlindType = false; - g_esGeneral.g_iChosenType = 0; + case true: vSetTempHealth(survivor, float(iMaxHealth)); + case false: vSetTempHealth(survivor, (flTempHealth + extra)); } - case false: vSpawnTank(admin, specType, .amount = amount, .mode = mode, .blind = blind); } -} - -void vChooseArrivalType(int tank, const char[] oldname, const char[] name, int mode, int specType) -{ - if (bIsInfectedSupported(tank)) + else { - if (!g_esGeneral.g_bFinaleEnded) + switch ((iHealth + extra) > iMaxHealth) { - switch (mode) - { - case 0: vAnnounceTankArrival(tank, name, specType); - case 1: - { - if (g_esCache[tank].g_iAnnounceArrival != 0 && (g_esCache[tank].g_iAnnounceArrival & MT_ARRIVAL_BOSS)) - { - MT_PrintToChatAll("%s %t", MT_TAG2, "Evolved", oldname, name, (g_esPlayer[tank].g_iBossStageCount + 1)); - vLogMessage(MT_LOG_CHANGE, _, "%s %T", MT_TAG, "Evolved", LANG_SERVER, oldname, name, (g_esPlayer[tank].g_iBossStageCount + 1)); - } - } - case 2: - { - if (g_esCache[tank].g_iAnnounceArrival != 0 && (g_esCache[tank].g_iAnnounceArrival & MT_ARRIVAL_RANDOM)) - { - MT_PrintToChatAll("%s %t", MT_TAG2, "Randomized", oldname, name); - vLogMessage(MT_LOG_CHANGE, _, "%s %T", MT_TAG, "Randomized", LANG_SERVER, oldname, name); - } - } - case 3: - { - if (g_esCache[tank].g_iAnnounceArrival != 0 && (g_esCache[tank].g_iAnnounceArrival & MT_ARRIVAL_TRANSFORM)) - { - MT_PrintToChatAll("%s %t", MT_TAG2, "Transformed", oldname, name); - vLogMessage(MT_LOG_CHANGE, _, "%s %T", MT_TAG, "Transformed", LANG_SERVER, oldname, name); - } - } - case 4: - { - if (g_esCache[tank].g_iAnnounceArrival != 0 && (g_esCache[tank].g_iAnnounceArrival & MT_ARRIVAL_REVERT)) - { - MT_PrintToChatAll("%s %t", MT_TAG2, "Untransformed", oldname, name); - vLogMessage(MT_LOG_CHANGE, _, "%s %T", MT_TAG, "Untransformed", LANG_SERVER, oldname, name); - } - } - case 5: - { - vAnnounceTankArrival(tank, name, specType); - - switch (specType) - { - case 1: MT_PrintToChat(tank, "%s %t", MT_TAG3, "ChangeTypeSmoker"); - case 2: MT_PrintToChat(tank, "%s %t", MT_TAG3, "ChangeTypeBoomer"); - case 3: MT_PrintToChat(tank, "%s %t", MT_TAG3, "ChangeTypeHunter"); - case 4: MT_PrintToChat(tank, "%s %t", MT_TAG3, "ChangeTypeSpitter"); - case 5: MT_PrintToChat(tank, "%s %t", MT_TAG3, "ChangeTypeJockey"); - case 6: MT_PrintToChat(tank, "%s %t", MT_TAG3, "ChangeTypeCharger"); - default: MT_PrintToChat(tank, "%s %t", MT_TAG3, "ChangeType"); - } - } - } + case true: SetEntProp(survivor, Prop_Data, "m_iHealth", iMaxHealth); + case false: SetEntProp(survivor, Prop_Data, "m_iHealth", (iHealth + extra)); + } - if (mode >= 0 && bIsCustomTankSupported(tank)) - { - char sPhrase[64], sSteamIDFinal[64], sName[33], sNote[64], sNoNote[64]; - FormatEx(sSteamIDFinal, sizeof sSteamIDFinal, "%s", (TranslationPhraseExists(g_esPlayer[tank].g_sSteamID32) ? g_esPlayer[tank].g_sSteamID32 : g_esPlayer[tank].g_sSteam3ID)); - int iType = g_esTank[g_esPlayer[tank].g_iTankType].g_iRealType[0]; + float flHealth = flTempHealth - extra; + vSetTempHealth(survivor, ((flHealth < 0.0) ? 0.0 : flHealth)); + } - switch (specType) - { - case 1: strcopy(sName, sizeof sName, g_esCache[tank].g_sSmokerName); - case 2: strcopy(sName, sizeof sName, g_esCache[tank].g_sBoomerName); - case 3: strcopy(sName, sizeof sName, g_esCache[tank].g_sHunterName); - case 4: strcopy(sName, sizeof sName, g_esCache[tank].g_sSpitterName); - case 5: strcopy(sName, sizeof sName, g_esCache[tank].g_sJockeyName); - case 6: strcopy(sName, sizeof sName, g_esCache[tank].g_sChargerName); - default: strcopy(sName, sizeof sName, g_esCache[tank].g_sTankName); - } + if ((iHealth + flGetTempHealth(survivor, g_esGeneral.g_cvMTPainPillsDecayRate.FloatValue)) > iMaxHealth) + { + vSetTempHealth(survivor, float(iMaxHealth - iHealth)); + } +} - if (1 <= specType <= 6 && g_esCache[tank].g_iSpecialNote == 1) - { - FormatEx(sPhrase, sizeof sPhrase, "%s #%i Note", g_sSpecialNames[specType], iType); +void vRegularSpawn(int specType = 0) +{ + int iPlayer = iGetRandomPlayer(); + if (bIsValidClient(iPlayer)) + { + char sCommand[32]; + FormatEx(sCommand, sizeof sCommand, "z_spawn%s", (g_bSecondGame ? "_old" : "")); - if (sPhrase[0] != '\0' && !TranslationPhraseExists(sPhrase)) - { - FormatEx(sPhrase, sizeof sPhrase, "%s Note", sName); - } + switch (specType) + { + case 1: vCheatCommand(iPlayer, sCommand, "smoker auto"); + case 2: vCheatCommand(iPlayer, sCommand, "boomer auto"); + case 3: vCheatCommand(iPlayer, sCommand, "hunter auto"); + case 4: vCheatCommand(iPlayer, sCommand, "spitter auto"); + case 5: vCheatCommand(iPlayer, sCommand, "jockey auto"); + case 6: vCheatCommand(iPlayer, sCommand, "charger auto"); + default: vCheatCommand(iPlayer, sCommand, "tank auto"); + } + } +} - if (sPhrase[0] != '\0' && !TranslationPhraseExists(sPhrase)) - { - FormatEx(sPhrase, sizeof sPhrase, "%s #%i", g_sSpecialNames[specType], iType); - } +void vRemoveTankProps(int tank, bool revert = true) +{ + if (bIsValidEntRef(g_esPlayer[tank].g_iBlur)) + { + g_esPlayer[tank].g_iBlur = EntRefToEntIndex(g_esPlayer[tank].g_iBlur); + if (bIsValidEntity(g_esPlayer[tank].g_iBlur)) + { + SDKUnhook(g_esPlayer[tank].g_iBlur, SDKHook_SetTransmit, OnPropSetTransmit); + RemoveEntity(g_esPlayer[tank].g_iBlur); + } + } - if (sPhrase[0] != '\0' && !TranslationPhraseExists(sPhrase)) - { - strcopy(sPhrase, sizeof sPhrase, sName); - } + g_esPlayer[tank].g_iBlur = INVALID_ENT_REFERENCE; - FormatEx(sNote, sizeof sNote, "%s", ((bIsValidClient(tank, MT_CHECK_FAKECLIENT) && g_esTeammate[tank].g_iSpecialNote == 1 && sSteamIDFinal[0] != '\0') ? sSteamIDFinal : sPhrase)); - FormatEx(sNoNote, sizeof sNoNote, "NoNote%s", g_sSpecialNames[specType]); + for (int iLight = 0; iLight < (sizeof esPlayer::g_iLight); iLight++) + { + if (bIsValidEntRef(g_esPlayer[tank].g_iLight[iLight])) + { + g_esPlayer[tank].g_iLight[iLight] = EntRefToEntIndex(g_esPlayer[tank].g_iLight[iLight]); + if (bIsValidEntity(g_esPlayer[tank].g_iLight[iLight])) + { + SDKUnhook(g_esPlayer[tank].g_iLight[iLight], SDKHook_SetTransmit, OnPropSetTransmit); + RemoveEntity(g_esPlayer[tank].g_iLight[iLight]); + } + } - bool bExists = TranslationPhraseExists(sNote); - MT_PrintToChatAll("%s %t", MT_TAG3, (bExists ? sNote : sNoNote)); - vLogMessage(MT_LOG_LIFE, _, "%s %T", MT_TAG, (bExists ? sNote : sNoNote), LANG_SERVER); - } - else if (g_esCache[tank].g_iTankNote == 1) - { - FormatEx(sPhrase, sizeof sPhrase, "Tank #%i Note", iType); + g_esPlayer[tank].g_iLight[iLight] = INVALID_ENT_REFERENCE; + } - if (sPhrase[0] != '\0' && !TranslationPhraseExists(sPhrase)) - { - FormatEx(sPhrase, sizeof sPhrase, "%s Note", sName); - } + for (int iOzTank = 0; iOzTank < (sizeof esPlayer::g_iFlame); iOzTank++) + { + if (bIsValidEntRef(g_esPlayer[tank].g_iFlame[iOzTank])) + { + g_esPlayer[tank].g_iFlame[iOzTank] = EntRefToEntIndex(g_esPlayer[tank].g_iFlame[iOzTank]); + if (bIsValidEntity(g_esPlayer[tank].g_iFlame[iOzTank])) + { + SDKUnhook(g_esPlayer[tank].g_iFlame[iOzTank], SDKHook_SetTransmit, OnPropSetTransmit); + RemoveEntity(g_esPlayer[tank].g_iFlame[iOzTank]); + } + } - if (sPhrase[0] != '\0' && !TranslationPhraseExists(sPhrase)) - { - FormatEx(sPhrase, sizeof sPhrase, "Tank #%i", iType); - } + g_esPlayer[tank].g_iFlame[iOzTank] = INVALID_ENT_REFERENCE; - if (sPhrase[0] != '\0' && !TranslationPhraseExists(sPhrase)) - { - strcopy(sPhrase, sizeof sPhrase, sName); - } + if (bIsValidEntRef(g_esPlayer[tank].g_iOzTank[iOzTank])) + { + g_esPlayer[tank].g_iOzTank[iOzTank] = EntRefToEntIndex(g_esPlayer[tank].g_iOzTank[iOzTank]); + if (bIsValidEntity(g_esPlayer[tank].g_iOzTank[iOzTank])) + { + SDKUnhook(g_esPlayer[tank].g_iOzTank[iOzTank], SDKHook_SetTransmit, OnPropSetTransmit); + RemoveEntity(g_esPlayer[tank].g_iOzTank[iOzTank]); + } + } - FormatEx(sNote, sizeof sNote, "%s", ((bIsValidClient(tank, MT_CHECK_FAKECLIENT) && (g_esPlayer[tank].g_iTankNote == 1) && sSteamIDFinal[0] != '\0') ? sSteamIDFinal : sPhrase)); - strcopy(sNoNote, sizeof sNoNote, "NoNote"); + g_esPlayer[tank].g_iOzTank[iOzTank] = INVALID_ENT_REFERENCE; + } - bool bExists = TranslationPhraseExists(sNote); - MT_PrintToChatAll("%s %t", MT_TAG3, (bExists ? sNote : sNoNote)); - vLogMessage(MT_LOG_LIFE, _, "%s %T", MT_TAG, (bExists ? sNote : sNoNote), LANG_SERVER); - } + for (int iRock = 0; iRock < (sizeof esPlayer::g_iRock); iRock++) + { + if (bIsValidEntRef(g_esPlayer[tank].g_iRock[iRock])) + { + g_esPlayer[tank].g_iRock[iRock] = EntRefToEntIndex(g_esPlayer[tank].g_iRock[iRock]); + if (bIsValidEntity(g_esPlayer[tank].g_iRock[iRock])) + { + SDKUnhook(g_esPlayer[tank].g_iRock[iRock], SDKHook_SetTransmit, OnPropSetTransmit); + RemoveEntity(g_esPlayer[tank].g_iRock[iRock]); } } - switch (StrEqual(g_esCache[tank].g_sGlowColor, "rainbow", false)) + g_esPlayer[tank].g_iRock[iRock] = INVALID_ENT_REFERENCE; + } + + for (int iTire = 0; iTire < (sizeof esPlayer::g_iTire); iTire++) + { + if (bIsValidEntRef(g_esPlayer[tank].g_iTire[iTire])) { - case true: + g_esPlayer[tank].g_iTire[iTire] = EntRefToEntIndex(g_esPlayer[tank].g_iTire[iTire]); + if (bIsValidEntity(g_esPlayer[tank].g_iTire[iTire])) { - if (!g_esPlayer[tank].g_bRainbowColor) - { - g_esPlayer[tank].g_bRainbowColor = SDKHookEx(tank, SDKHook_PreThinkPost, OnRainbowPreThinkPost); - } + SDKUnhook(g_esPlayer[tank].g_iTire[iTire], SDKHook_SetTransmit, OnPropSetTransmit); + RemoveEntity(g_esPlayer[tank].g_iTire[iTire]); } - case false: vSetTankGlow(tank); } + + g_esPlayer[tank].g_iTire[iTire] = INVALID_ENT_REFERENCE; + } + + if (bIsValidEntRef(g_esPlayer[tank].g_iPropaneTank)) + { + g_esPlayer[tank].g_iPropaneTank = EntRefToEntIndex(g_esPlayer[tank].g_iPropaneTank); + if (bIsValidEntity(g_esPlayer[tank].g_iPropaneTank)) + { + SDKUnhook(g_esPlayer[tank].g_iPropaneTank, SDKHook_SetTransmit, OnPropSetTransmit); + RemoveEntity(g_esPlayer[tank].g_iPropaneTank); + } + } + + g_esPlayer[tank].g_iPropaneTank = INVALID_ENT_REFERENCE; + + if (bIsValidEntRef(g_esPlayer[tank].g_iFlashlight)) + { + g_esPlayer[tank].g_iFlashlight = EntRefToEntIndex(g_esPlayer[tank].g_iFlashlight); + if (bIsValidEntity(g_esPlayer[tank].g_iFlashlight)) + { + SDKUnhook(g_esPlayer[tank].g_iFlashlight, SDKHook_SetTransmit, OnPropSetTransmit); + RemoveEntity(g_esPlayer[tank].g_iFlashlight); + } + } + + g_esPlayer[tank].g_iFlashlight = INVALID_ENT_REFERENCE; + vRemovePlayerGlow(tank); + + if (revert) + { + SetEntityRenderMode(tank, RENDER_NORMAL); + SetEntityRenderColor(tank, 255, 255, 255, 255); } } -void vColorLight(int light, int red, int green, int blue, int alpha) +void vResetTank(int tank, bool revert = true) { - char sColor[12]; - IntToString(alpha, sColor, sizeof sColor); - DispatchKeyValue(light, "renderamt", sColor); - - FormatEx(sColor, sizeof sColor, "%i %i %i", red, green, blue); - DispatchKeyValue(light, "rendercolor", sColor); + vRemoveTankProps(tank, revert); + vResetTankSpeed(tank); + vSpawnModes(tank, false); } -void vCopyTankStats(int tank, int newtank) +void vResetTank2(int tank, bool full = true) { - SetEntProp(newtank, Prop_Data, "m_iMaxHealth", GetEntProp(tank, Prop_Data, "m_iMaxHealth")); + g_esPlayer[tank].g_bArtificial = false; + g_esPlayer[tank].g_bBlood = false; + g_esPlayer[tank].g_bBlur = false; + g_esPlayer[tank].g_bElectric = false; + g_esPlayer[tank].g_bFire = false; + g_esPlayer[tank].g_bFirstSpawn = false; + g_esPlayer[tank].g_bIce = false; + g_esPlayer[tank].g_bKeepCurrentType = false; + g_esPlayer[tank].g_bMeteor = false; + g_esPlayer[tank].g_bPassive = false; + g_esPlayer[tank].g_bProtected[0] = false; + g_esPlayer[tank].g_bProtected[1] = false; + g_esPlayer[tank].g_bReplaceSelf = false; + g_esPlayer[tank].g_bSmoke = false; + g_esPlayer[tank].g_bSpit = false; + g_esPlayer[tank].g_flLastAttackTime = 0.0; + g_esPlayer[tank].g_iBossStageCount = 0; + g_esPlayer[tank].g_iClawCount = 0; + g_esPlayer[tank].g_iClawDamage = 0; + g_esPlayer[tank].g_iCooldown = -1; + g_esPlayer[tank].g_iIncapCount = 0; + g_esPlayer[tank].g_iKillCount = 0; + g_esPlayer[tank].g_iMiscCount = 0; + g_esPlayer[tank].g_iMiscDamage = 0; + g_esPlayer[tank].g_iOldTankType = 0; + g_esPlayer[tank].g_iPropCount = 0; + g_esPlayer[tank].g_iPropDamage = 0; + g_esPlayer[tank].g_iRockCount = 0; + g_esPlayer[tank].g_iRockDamage = 0; + g_esPlayer[tank].g_iSurvivorDamage = 0; + g_esPlayer[tank].g_iTankType = 0; - g_esPlayer[newtank].g_bArtificial = g_esPlayer[tank].g_bArtificial; - g_esPlayer[newtank].g_bBlood = g_esPlayer[tank].g_bBlood; - g_esPlayer[newtank].g_bBlur = g_esPlayer[tank].g_bBlur; - g_esPlayer[newtank].g_bBoss = g_esPlayer[tank].g_bBoss; - g_esPlayer[newtank].g_bCombo = g_esPlayer[tank].g_bCombo; - g_esPlayer[newtank].g_bElectric = g_esPlayer[tank].g_bElectric; - g_esPlayer[newtank].g_bFire = g_esPlayer[tank].g_bFire; - g_esPlayer[newtank].g_bFirstSpawn = g_esPlayer[tank].g_bFirstSpawn; - g_esPlayer[newtank].g_bIce = g_esPlayer[tank].g_bIce; - g_esPlayer[newtank].g_bKeepCurrentType = g_esPlayer[tank].g_bKeepCurrentType; - g_esPlayer[newtank].g_bMeteor = g_esPlayer[tank].g_bMeteor; - g_esPlayer[newtank].g_bProtected[0] = g_esPlayer[tank].g_bProtected[0]; - g_esPlayer[newtank].g_bProtected[1] = g_esPlayer[tank].g_bProtected[1]; - g_esPlayer[newtank].g_bRandomized = g_esPlayer[tank].g_bRandomized; - g_esPlayer[newtank].g_bSmoke = g_esPlayer[tank].g_bSmoke; - g_esPlayer[newtank].g_bSpit = g_esPlayer[tank].g_bSpit; - g_esPlayer[newtank].g_bTransformed = g_esPlayer[tank].g_bTransformed; - g_esPlayer[newtank].g_flLastAttackTime = g_esPlayer[tank].g_flLastAttackTime; - g_esPlayer[newtank].g_iBossStageCount = g_esPlayer[tank].g_iBossStageCount; - g_esPlayer[newtank].g_iClawCount = g_esPlayer[tank].g_iClawCount; - g_esPlayer[newtank].g_iClawDamage = g_esPlayer[tank].g_iClawDamage; - g_esPlayer[newtank].g_iCooldown = g_esPlayer[tank].g_iCooldown; - g_esPlayer[newtank].g_iIncapCount = g_esPlayer[tank].g_iIncapCount; - g_esPlayer[newtank].g_iInfectedType = g_esPlayer[tank].g_iInfectedType; - g_esPlayer[newtank].g_iKillCount = g_esPlayer[tank].g_iKillCount; - g_esPlayer[newtank].g_iMiscCount = g_esPlayer[tank].g_iMiscCount; - g_esPlayer[newtank].g_iMiscDamage = g_esPlayer[tank].g_iMiscDamage; - g_esPlayer[newtank].g_iOldTankType = g_esPlayer[tank].g_iOldTankType; - g_esPlayer[newtank].g_iPropCount = g_esPlayer[tank].g_iPropCount; - g_esPlayer[newtank].g_iPropDamage = g_esPlayer[tank].g_iPropDamage; - g_esPlayer[newtank].g_iRockCount = g_esPlayer[tank].g_iRockCount; - g_esPlayer[newtank].g_iRockDamage = g_esPlayer[tank].g_iRockDamage; - g_esPlayer[newtank].g_iSurvivorDamage = g_esPlayer[tank].g_iSurvivorDamage; - g_esPlayer[newtank].g_iSpecialMaxHealth = g_esPlayer[tank].g_iSpecialMaxHealth; - g_esPlayer[newtank].g_iTankType = g_esPlayer[tank].g_iTankType; + for (int iPos = 0; iPos < (sizeof esPlayer::g_iThrownRock); iPos++) + { + g_esPlayer[tank].g_iThrownRock[iPos] = INVALID_ENT_REFERENCE; + } + + if (full) + { + vRemoveInfection(tank); + vResetSurvivorStats(tank, full); + } + + delete g_esPlayer[tank].g_hPassiveTimer[0]; + delete g_esPlayer[tank].g_hPassiveTimer[1]; + delete g_esPlayer[tank].g_hProtectionTimer[0]; + delete g_esPlayer[tank].g_hProtectionTimer[1]; +} + +void vResetTank3(int tank) +{ + ExtinguishEntity(tank); + EmitSoundToAll(SOUND_ELECTRICITY, tank); + vResetTankSpeed(tank); + vRemovePlayerGlow(tank); - for (int iSurvivor = 1; iSurvivor <= MaxClients; iSurvivor++) + if (g_esGeneral.g_iGraphicsLevel > 2 || g_esGeneral.g_cvMTGraphicsLevel.IntValue > 2) { - g_esPlayer[iSurvivor].g_iTankDamage[newtank] = g_esPlayer[iSurvivor].g_iTankDamage[tank]; + vAttachParticle(tank, PARTICLE_ELECTRICITY, 2.0, 30.0); } +} - if (bIsValidClient(newtank, MT_CHECK_FAKECLIENT) && g_esGeneral.g_iSpawnMode != 2) +void vResetTankSpeed(int tank, bool reset = true) +{ + if (bIsValidClient(tank, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_ALIVE)) { - vMutantMenu(newtank, g_esPlayer[newtank].g_iInfectedType); + switch (reset || g_esTankCache[tank].g_flRunSpeed <= 0.0) + { + case true: SetEntPropFloat(tank, Prop_Send, "m_flLaggedMovementValue", (g_esGeneral.g_bLaggedMovementInstalled ? L4D_LaggedMovement(tank, 1.0, true) : 1.0)); + case false: SetEntPropFloat(tank, Prop_Send, "m_flLaggedMovementValue", (g_esGeneral.g_bLaggedMovementInstalled ? L4D_LaggedMovement(tank, g_esTankCache[tank].g_flRunSpeed) : g_esTankCache[tank].g_flRunSpeed)); + } } +} - delete g_esPlayer[tank].g_hProtectionTimer[0]; - delete g_esPlayer[tank].g_hProtectionTimer[1]; +void vSetRockEffects(int tank, int rock) +{ + if (g_esTankCache[tank].g_iRockEffects > 0 && (g_esGeneral.g_iGraphicsLevel > 2 || g_esGeneral.g_cvMTGraphicsLevel.IntValue > 2)) + { + DataPack dpRockEffects; + CreateDataTimer(0.75, tTimerRockEffects, dpRockEffects, TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); + dpRockEffects.WriteCell(EntIndexToEntRef(rock)); + dpRockEffects.WriteCell(GetClientUserId(tank)); + } +} - if (g_esPlayer[newtank].g_bProtected[0]) +void vSetRockModel(int tank, int rock) +{ + switch (g_esTankCache[tank].g_iRockModel) { - vResetProtectionTimers(tank, 1); + case -1, 0: SetEntityModel(rock, MODEL_CONCRETE_CHUNK); + case 1: SetEntityModel(rock, MODEL_TREE_TRUNK); + case 2: SetEntityModel(rock, ((MT_GetRandomInt(0, 1) == 0) ? MODEL_CONCRETE_CHUNK : MODEL_TREE_TRUNK)); } +} - if (g_esPlayer[newtank].g_bProtected[1]) +void vSetRockColor(int tank, int rock) +{ + if (g_esGeneral.g_iGraphicsLevel <= 0 && g_esGeneral.g_cvMTGraphicsLevel.IntValue <= 0) { - vResetProtectionTimers(tank, 2); + return; } - Call_StartForward(g_esGeneral.g_gfCopyStatsForward); - Call_PushCell(tank); - Call_PushCell(newtank); - Call_Finish(); + switch (StrEqual(g_esTankCache[tank].g_sRockColor, "rainbow", false) && (g_esGeneral.g_iGraphicsLevel > 2 || g_esGeneral.g_cvMTGraphicsLevel.IntValue > 2)) + { + case true: + { + g_esPlayer[tank].g_iThrownRock[rock] = EntIndexToEntRef(rock); + + if (!g_esPlayer[tank].g_bRainbowColor) + { + g_esPlayer[tank].g_bRainbowColor = SDKHookEx(tank, SDKHook_PreThinkPost, OnTankRainbowPreThinkPost); + } + } + case false: SetEntityRenderColor(rock, iGetRandomColor(g_esTankCache[tank].g_iRockColor[0]), iGetRandomColor(g_esTankCache[tank].g_iRockColor[1]), iGetRandomColor(g_esTankCache[tank].g_iRockColor[2]), iGetRandomColor(g_esTankCache[tank].g_iRockColor[3])); + } } -void vEvolveBoss(int tank, int limit, int stages, int type, int stage) +void vSetSpecialModel(int special, bool main) { - if (stages >= stage && g_esPlayer[tank].g_iBossStageCount < stage) + switch (main) { - int iHealth = GetEntProp(tank, Prop_Data, "m_iHealth"); - if (iHealth <= limit) + case true: { - for (int iPos = 0; iPos < (sizeof esCache::g_iBossType); iPos++) + switch (g_esPlayer[special].g_iInfectedType) { - if (g_esCache[tank].g_iBossType[iPos] == g_esPlayer[tank].g_iTankType && iPos >= (stage - 1)) - { - g_esPlayer[tank].g_iBossStageCount = (iPos + 1); - - return; - } + case 1: SetEntityModel(special, MODEL_SMOKER_MAIN); + case 2: SetEntityModel(special, (!!MT_GetRandomInt(0, 1) ? MODEL_BOOMER_MAIN : MODEL_BOOMETTE)); + case 3: SetEntityModel(special, MODEL_HUNTER_MAIN); } - - g_esPlayer[tank].g_iBossStageCount = stage; - - int iType = g_esTank[type].g_iRecordedType[0]; - if (g_esPlayer[tank].g_iTankType == iType) + } + case false: + { + switch (g_esPlayer[special].g_iInfectedType) { - return; + case 1: SetEntityModel(special, (g_bSecondGame ? MODEL_SMOKER_L4D1 : MODEL_SMOKER_MAIN)); + case 2: SetEntityModel(special, (g_bSecondGame ? MODEL_BOOMER_L4D1 : MODEL_BOOMER_MAIN)); + case 3: SetEntityModel(special, (g_bSecondGame ? MODEL_HUNTER_L4D1 : MODEL_HUNTER_MAIN)); } - - vResetTankSpeed(tank); - vSurvivorReactions(tank); - vSetTankColor(tank, iType, false); - vTankSpawn(tank, 1); - - int iNewHealth = (GetEntProp(tank, Prop_Data, "m_iMaxHealth") + limit), - iLeftover = (iNewHealth - iHealth), - iLeftover2 = (iLeftover > MT_MAXHEALTH) ? (iLeftover - MT_MAXHEALTH) : iLeftover, - iFinalHealth = (iNewHealth > MT_MAXHEALTH) ? MT_MAXHEALTH : iNewHealth; - - g_esPlayer[tank].g_iSpecialMaxHealth += (iLeftover > MT_MAXHEALTH) ? iLeftover2 : iLeftover; - SetEntProp(tank, Prop_Data, "m_iHealth", iFinalHealth); - SetEntProp(tank, Prop_Data, "m_iMaxHealth", iFinalHealth); } } } -void vFlashlightProp(int player, float origin[3], float angles[3], int colors[4]) +void vSetTankColor(int tank, int type = 0, bool change = true, bool revert = false, bool store = false) { - g_esPlayer[player].g_iFlashlight = CreateEntityByName("light_dynamic"); - if (bIsValidEntity(g_esPlayer[player].g_iFlashlight)) + if (type == -1) { - char sColor[16]; - FormatEx(sColor, sizeof sColor, "%i %i %i %i", iGetRandomColor(colors[0]), iGetRandomColor(colors[1]), iGetRandomColor(colors[2]), iGetRandomColor(colors[3])); - DispatchKeyValue(g_esPlayer[player].g_iFlashlight, "_light", sColor); + return; + } - DispatchKeyValueInt(g_esPlayer[player].g_iFlashlight, "inner_cone", 0); - DispatchKeyValueInt(g_esPlayer[player].g_iFlashlight, "cone", 80); - DispatchKeyValueInt(g_esPlayer[player].g_iFlashlight, "brightness", 1); - DispatchKeyValueFloat(g_esPlayer[player].g_iFlashlight, "spotlight_radius", 240.0); - DispatchKeyValueFloat(g_esPlayer[player].g_iFlashlight, "distance", 255.0); - DispatchKeyValueInt(g_esPlayer[player].g_iFlashlight, "pitch", -90); - DispatchKeyValueInt(g_esPlayer[player].g_iFlashlight, "style", 5); + if (g_esPlayer[tank].g_iTankType > 0) + { + if (change) + { + vResetTank3(tank); + } - float flOrigin[3], flAngles[3], flForward[3]; - GetClientEyePosition(player, origin); - GetClientEyeAngles(player, angles); - GetClientEyeAngles(player, flAngles); + if (type == 0) + { + vRemoveTankProps(tank); + vChangeTypeForward(tank, g_esPlayer[tank].g_iTankType, type, revert); - flAngles[0] = 0.0; - flAngles[2] = 0.0; - GetAngleVectors(flAngles, flForward, NULL_VECTOR, NULL_VECTOR); - ScaleVector(flForward, -50.0); + g_esPlayer[tank].g_iTankType = 0; - flForward[2] = 0.0; - AddVectors(origin, flForward, flOrigin); + return; + } + else if (g_esPlayer[tank].g_iTankType == type && !g_esPlayer[tank].g_bReplaceSelf && !g_esPlayer[tank].g_bKeepCurrentType) + { + g_esPlayer[tank].g_iTankType = 0; - angles[0] += 90.0; - flOrigin[2] -= 120.0; - AcceptEntityInput(g_esPlayer[player].g_iFlashlight, "TurnOn"); - TeleportEntity(g_esPlayer[player].g_iFlashlight, flOrigin, angles); - DispatchSpawn(g_esPlayer[player].g_iFlashlight); - vSetEntityParent(g_esPlayer[player].g_iFlashlight, player, true); + vRemoveTankProps(tank); + vChangeTypeForward(tank, type, g_esPlayer[tank].g_iTankType, revert); - if (bIsTank(player)) + return; + } + else if (type > 0) { - SDKHook(g_esPlayer[player].g_iFlashlight, SDKHook_SetTransmit, OnPropSetTransmit); + g_esPlayer[tank].g_iOldTankType = g_esPlayer[tank].g_iTankType; } - - g_esPlayer[player].g_iFlashlight = EntIndexToEntRef(g_esPlayer[player].g_iFlashlight); } -} -void vKnockbackTank(int tank, int survivor, int damagetype) -{ - float flResult = ((damagetype & DMG_BULLET) || (damagetype & DMG_BUCKSHOT)) ? 1.0 : 10.0; - if ((bIsDeveloper(survivor, 9) || ((g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_DAMAGEBOOST) && g_esPlayer[survivor].g_iSledgehammerRounds == 1)) && !bIsPlayerIncapacitated(tank) && MT_GetRandomFloat(0.0, 100.0) <= flResult) + if (store && bIsCompetitiveModeRound(1)) { - vPerformKnockback(tank, survivor); + g_esGeneral.g_alCompTypes[0].Push(type); } -} -void vLifeLeech(int survivor, int type, int damagetype = 0, int tank = 0) -{ - if (!bIsSurvivor(survivor) || bIsSurvivorDisabled(survivor) || (bIsInfected(tank) && (bIsPlayerIncapacitated(tank) || bIsCustomTank(tank))) || (damagetype != 0 && !(damagetype & DMG_CLUB) && !(damagetype & DMG_SLASH))) - { - return; - } + g_esPlayer[tank].g_bReplaceSelf = false; + g_esPlayer[tank].g_iTankType = type; - bool bDeveloper = bIsDeveloper(survivor, type); - int iLeech = 0; + vRemoveTankProps(tank); + vChangeTypeForward(tank, g_esPlayer[tank].g_iOldTankType, g_esPlayer[tank].g_iTankType, revert); - switch (type) + switch ((g_esShooter[tank].g_bSurvivor && g_esShooter[tank].g_bMixTypes) || g_esShooter[tank].g_bProduced) { - case 5: iLeech = (bDeveloper && g_esDeveloper[survivor].g_iDevLifeLeech > g_esPlayer[survivor].g_iLifeLeech) ? g_esDeveloper[survivor].g_iDevLifeLeech : g_esPlayer[survivor].g_iLifeLeech; - case 7: iLeech = (bDeveloper && g_esDeveloper[survivor].g_iDevHealthRegen > g_esPlayer[survivor].g_iHealthRegen) ? g_esDeveloper[survivor].g_iDevHealthRegen : g_esPlayer[survivor].g_iHealthRegen; - default: return; - } + case true: + { + int iTypeCount = 0, iTankTypes[MT_MAXTYPES + 1]; + for (int iIndex = 0; iIndex <= MT_MAXTYPES; iIndex++) + { + if (g_esShooter[tank].g_bInfected[iIndex]) + { + iTankTypes[iTypeCount + 1] = iIndex; + iTypeCount++; + } + } - if ((!bDeveloper && (!(g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_HEALTH) || g_esPlayer[survivor].g_flRewardTime[0] == -1.0)) || iLeech <= 0) - { - return; + if (iTypeCount > 0) + { + int iChosenType = iTankTypes[MT_GetRandomInt(1, iTypeCount)]; + g_esShooter[tank].g_bInfected[iChosenType] = false; + g_esPlayer[tank].g_iTankType = iChosenType; + + vCacheTankSettings(tank, iChosenType, .visualsOnly = true); + } + } + case false: vCacheTankSettings(tank); } - vRegenSurvivorHealth(survivor, survivor, iLeech); + vSetTankModel(tank); + vRemovePlayerGlow(tank); + vSetTankRainbowColor(tank); } -void vLightProp(int tank, int light, float origin[3], float angles[3]) +void vSetTankGlow(int tank) { - g_esPlayer[tank].g_iLight[light] = CreateEntityByName("beam_spotlight"); - if (bIsValidEntity(g_esPlayer[tank].g_iLight[light])) + if (!g_bSecondGame || g_esTankCache[tank].g_iGlowEnabled <= 1 || (g_esGeneral.g_iGraphicsLevel <= 1 && g_esGeneral.g_cvMTGraphicsLevel.IntValue <= 1)) { - if (light < 3) - { - char sTargetName[64]; - FormatEx(sTargetName, sizeof sTargetName, "mutant_tank_light_%i_%i_%i", tank, g_esPlayer[tank].g_iTankType, light); - DispatchKeyValue(g_esPlayer[tank].g_iLight[light], "targetname", sTargetName); - - DispatchKeyValueVector(g_esPlayer[tank].g_iLight[light], "origin", origin); - DispatchKeyValueVector(g_esPlayer[tank].g_iLight[light], "angles", angles); - DispatchKeyValueInt(g_esPlayer[tank].g_iLight[light], "fadescale", 1); - DispatchKeyValueInt(g_esPlayer[tank].g_iLight[light], "fademindist", -1); + return; + } - vColorLight(g_esPlayer[tank].g_iLight[light], iGetRandomColor(g_esCache[tank].g_iLightColor[0]), iGetRandomColor(g_esCache[tank].g_iLightColor[1]), iGetRandomColor(g_esCache[tank].g_iLightColor[2]), iGetRandomColor(g_esCache[tank].g_iLightColor[3])); - } - else - { - DispatchKeyValueInt(g_esPlayer[tank].g_iLight[light], "haloscale", 100); - vColorLight(g_esPlayer[tank].g_iLight[light], iGetRandomColor(g_esCache[tank].g_iCrownColor[0]), iGetRandomColor(g_esCache[tank].g_iCrownColor[1]), iGetRandomColor(g_esCache[tank].g_iCrownColor[2]), iGetRandomColor(g_esCache[tank].g_iCrownColor[3])); - } + SetEntProp(tank, Prop_Send, "m_glowColorOverride", iGetRGBColor(iGetRandomColor(g_esTankCache[tank].g_iGlowColor[0]), iGetRandomColor(g_esTankCache[tank].g_iGlowColor[1]), iGetRandomColor(g_esTankCache[tank].g_iGlowColor[2]))); + SetEntProp(tank, Prop_Send, "m_bFlashing", g_esTankCache[tank].g_iGlowFlashing); + SetEntProp(tank, Prop_Send, "m_nGlowRangeMin", g_esTankCache[tank].g_iGlowMinRange); + SetEntProp(tank, Prop_Send, "m_nGlowRange", g_esTankCache[tank].g_iGlowMaxRange); + SetEntProp(tank, Prop_Send, "m_iGlowType", ((bIsInfectedIdle(tank) || g_esTankCache[tank].g_iGlowType <= 0) ? 2 : 3)); +} - DispatchKeyValueInt(g_esPlayer[tank].g_iLight[light], "spotlightwidth", 10); - DispatchKeyValueInt(g_esPlayer[tank].g_iLight[light], "spotlightlength", 50); - DispatchKeyValueInt(g_esPlayer[tank].g_iLight[light], "spawnflags", 3); - DispatchKeyValueInt(g_esPlayer[tank].g_iLight[light], "maxspeed", 100); - DispatchKeyValueFloat(g_esPlayer[tank].g_iLight[light], "HDRColorScale", 0.7); +void vSetTankHealth(int tank, bool initial = true) +{ + int iHumanCount = iGetHumanCount(), iSpawnHealth = (g_esTankCache[tank].g_iBaseHealth > 0) ? g_esTankCache[tank].g_iBaseHealth : GetEntProp(tank, Prop_Data, "m_iHealth"); + float flMultiplier = (g_esTankCache[tank].g_iHumanMultiplierMode == 1) ? g_esTankCache[tank].g_flHealPercentMultiplier : (iHumanCount * g_esTankCache[tank].g_flHealPercentMultiplier); + int iExtraHealth = (iSpawnHealth + g_esTankCache[tank].g_iExtraHealth), + iExtraHealthBoost = (iHumanCount >= g_esTankCache[tank].g_iMinimumHumans) ? (RoundToNearest(iSpawnHealth * flMultiplier) + g_esTankCache[tank].g_iExtraHealth) : iExtraHealth, + iExtraHealthBoost2 = (iHumanCount >= g_esTankCache[tank].g_iMinimumHumans) ? (iSpawnHealth + RoundToNearest(flMultiplier * g_esTankCache[tank].g_iExtraHealth)) : iExtraHealth, + iExtraHealthBoost3 = (iHumanCount >= g_esTankCache[tank].g_iMinimumHumans) ? RoundToNearest(flMultiplier * (iSpawnHealth + g_esTankCache[tank].g_iExtraHealth)) : iExtraHealth, + iNoBoost = (iExtraHealth > MT_MAXHEALTH) ? MT_MAXHEALTH : iExtraHealth, + iBoost = (iExtraHealthBoost > MT_MAXHEALTH) ? MT_MAXHEALTH : iExtraHealthBoost, + iBoost2 = (iExtraHealthBoost2 > MT_MAXHEALTH) ? MT_MAXHEALTH : iExtraHealthBoost2, + iBoost3 = (iExtraHealthBoost3 > MT_MAXHEALTH) ? MT_MAXHEALTH : iExtraHealthBoost3, + iNegaNoBoost = (iExtraHealth < iSpawnHealth) ? 1 : iExtraHealth, + iNegaBoost = (iExtraHealthBoost < iSpawnHealth) ? 1 : iExtraHealthBoost, + iNegaBoost2 = (iExtraHealthBoost2 < iSpawnHealth) ? 1 : iExtraHealthBoost2, + iNegaBoost3 = (iExtraHealthBoost3 < iSpawnHealth) ? 1 : iExtraHealthBoost3, + iFinalNoHealth = (iExtraHealth >= 0) ? iNoBoost : iNegaNoBoost, + iFinalHealth = (iExtraHealth >= 0) ? iBoost : iNegaBoost, + iFinalHealth2 = (iExtraHealth >= 0) ? iBoost2 : iNegaBoost2, + iFinalHealth3 = (iExtraHealth >= 0) ? iBoost3 : iNegaBoost3, + iTotalHealth = iFinalNoHealth, + iHealth = GetEntProp(tank, Prop_Data, "m_iHealth"), + iMaxHealth = GetEntProp(tank, Prop_Data, "m_iMaxHealth"); - float flOrigin[3] = {0.0, 0.0, 70.0}, flAngles[3] = {-45.0, 0.0, 0.0}; - if (light < 3) - { - char sParentName[64], sTargetName[64]; - FormatEx(sTargetName, sizeof sTargetName, "mutant_tank_%i_%i_%i", tank, g_esPlayer[tank].g_iTankType, light); - DispatchKeyValue(tank, "targetname", sTargetName); - GetEntPropString(tank, Prop_Data, "m_iName", sParentName, sizeof sParentName); - DispatchKeyValue(g_esPlayer[tank].g_iLight[light], "parentname", sParentName); + switch (g_esTankCache[tank].g_iMultiplyHealth) + { + case 1: iTotalHealth = iFinalHealth; + case 2: iTotalHealth = iFinalHealth2; + case 3: iTotalHealth = iFinalHealth3; + } - SetVariantString(sParentName); - AcceptEntityInput(g_esPlayer[tank].g_iLight[light], "SetParent", g_esPlayer[tank].g_iLight[light], g_esPlayer[tank].g_iLight[light]); - SetEntPropEnt(g_esPlayer[tank].g_iLight[light], Prop_Data, "m_hOwnerEntity", tank); + float flPercentage = 1.0; + if (!initial && iHealth != iMaxHealth) + { + flPercentage = float(iHealth) / float(iMaxHealth); + } - switch (light) - { - case 0: - { - SetVariantString("mouth"); - vSetVector(angles, -90.0, 0.0, 0.0); - } - case 1: - { - SetVariantString("rhand"); - vSetVector(angles, 90.0, 0.0, 0.0); - } - case 2: - { - SetVariantString("lhand"); - vSetVector(angles, -90.0, 0.0, 0.0); - } - } + SetEntProp(tank, Prop_Data, "m_iHealth", RoundToNearest(iTotalHealth * flPercentage)); + SetEntProp(tank, Prop_Data, "m_iMaxHealth", iTotalHealth); - AcceptEntityInput(g_esPlayer[tank].g_iLight[light], "SetParentAttachment"); - } - else - { - vSetEntityParent(g_esPlayer[tank].g_iLight[light], tank, true); + if (g_esTankCache[tank].g_iIntangibleBody == 1) + { + SetEntProp(tank, Prop_Send, "m_CollisionGroup", 2); + } - switch (light) + if (g_bSecondGame && bIsJockey(tank) && GetRandomFloat(0.1, 100.0) <= g_esGeneral.g_flJockeyChance) + { + float flScale = MT_GetRandomFloat(g_esGeneral.g_flJockeyScaleMin, g_esGeneral.g_flJockeyScaleMax); + if (0.0 < flScale <= 10.0) + { + if (g_esGeneral.g_iJockeyHealth == 1) { - case 3: flAngles[1] = 60.0; - case 4: flAngles[1] = 120.0; - case 5: flAngles[1] = 180.0; - case 6: flAngles[1] = 240.0; - case 7: flAngles[1] = 300.0; - case 8: flAngles[1] = 360.0; + iFinalHealth = RoundToCeil(float(GetEntProp(tank, Prop_Data, "m_iHealth")) * flScale); + SetEntProp(tank, Prop_Data, "m_iHealth", iFinalHealth); + SetEntProp(tank, Prop_Data, "m_iMaxHealth", iFinalHealth); } - } - - AcceptEntityInput(g_esPlayer[tank].g_iLight[light], "Enable"); - AcceptEntityInput(g_esPlayer[tank].g_iLight[light], "DisableCollision"); - AcceptEntityInput(g_esPlayer[tank].g_iLight[light], "TurnOn"); - switch (light) - { - case 0, 1, 2: TeleportEntity(g_esPlayer[tank].g_iLight[light], .angles = angles); - case 3, 4, 5, 6, 7, 8: TeleportEntity(g_esPlayer[tank].g_iLight[light], flOrigin, flAngles); + SetEntPropFloat(tank, Prop_Data, "m_flModelScale", flScale); } + } - DispatchSpawn(g_esPlayer[tank].g_iLight[light]); - SDKHook(g_esPlayer[tank].g_iLight[light], SDKHook_SetTransmit, OnPropSetTransmit); - g_esPlayer[tank].g_iLight[light] = EntIndexToEntRef(g_esPlayer[tank].g_iLight[light]); + flMultiplier = g_esShooter[tank].g_flHealthMultiplier; + if (g_esShooter[tank].g_bSurvivor && flMultiplier > 0.0) + { + iFinalHealth = RoundToCeil(float(GetEntProp(tank, Prop_Data, "m_iHealth")) * flMultiplier); + SetEntProp(tank, Prop_Data, "m_iHealth", iFinalHealth); + SetEntProp(tank, Prop_Data, "m_iMaxHealth", iFinalHealth); } } -void vMutateTank(int tank, int specType, int type, bool blind) +void vSetTankModel(int tank) { - if (bCanTypeSpawn(.specType = specType)) + if (bIsTank(tank) && g_esTankCache[tank].g_iTankModel > 0) { - g_esPlayer[tank].g_bBlindTank = blind; - bool bSpecial = bIsSpecialInfected(tank), bTank = bIsTank(tank), bVersus = bIsCompetitiveModeRound(2); - int iType = 0; - if (type == 0 && g_esPlayer[tank].g_iTankType <= 0) + int iModelCount = 0, iModels[3], iFlag = 0; + for (int iBit = 0; iBit < (sizeof iModels); iBit++) { - if (bTank) - { - if (bVersus) - { - iType = g_esGeneral.g_alCompTypes.Get(0); - g_esGeneral.g_alCompTypes.Erase(0); - - vSetTankColor(tank, iType, false); - } - else - { - switch (g_esGeneral.g_bFinalMap) - { - case true: iType = (g_esGeneral.g_iFinaleMode == 1) ? iChooseInfected(tank, 1, g_esGeneral.g_iFinaleMinTypes[g_esGeneral.g_iTankWave], g_esGeneral.g_iFinaleMaxTypes[g_esGeneral.g_iTankWave]) : iChooseInfected(tank, 1); - case false: iType = (g_esGeneral.g_iRegularMode == 1 && g_esGeneral.g_iRegularWave == 1) ? iChooseInfected(tank, 1, g_esGeneral.g_iRegularMinType, g_esGeneral.g_iRegularMaxType) : iChooseInfected(tank, 1); - } - } - - if (!g_esGeneral.g_bForceSpawned) - { - DataPack dpCountCheck; - CreateDataTimer(g_esGeneral.g_flExtrasDelay, tTimerTankCountCheck, dpCountCheck, TIMER_FLAG_NO_MAPCHANGE); - dpCountCheck.WriteCell(GetClientUserId(tank)); - - switch (g_esGeneral.g_bFinalMap) - { - case true: - { - switch (g_esGeneral.g_iFinaleAmount) - { - case -1, 0: dpCountCheck.WriteCell(g_esGeneral.g_iFinaleWave[g_esGeneral.g_iTankWave]); - default: dpCountCheck.WriteCell(g_esGeneral.g_iFinaleAmount); - } - } - case false: dpCountCheck.WriteCell(g_esGeneral.g_iRegularAmount); - } - } - } - else if (bSpecial) + iFlag = (1 << iBit); + if (!(g_esTankCache[tank].g_iTankModel & iFlag)) { - iChooseInfected(tank, 1); + continue; } + + iModels[iModelCount] = iFlag; + iModelCount++; } - else if (type != -1) + + switch (iModelCount > 0) { - if (bTank) + case true: { - switch (!bVersus || (bIsTank(tank, MT_CHECK_FAKECLIENT) && g_esPlayer[tank].g_iPersonalType == type)) + switch (iModels[MT_GetRandomInt(0, (iModelCount - 1))]) { - case true: - { - iType = (type > 0) ? type : g_esPlayer[tank].g_iTankType; - g_esPlayer[tank].g_iPersonalType = 0; - - vSetTankColor(tank, iType, false, .store = true); - } - case false: + case 1: SetEntityModel(tank, MODEL_TANK_MAIN); + case 2: SetEntityModel(tank, MODEL_TANK_DLC); + case 4: SetEntityModel(tank, (g_bSecondGame ? MODEL_TANK_L4D1 : MODEL_TANK_MAIN)); + default: { - iType = g_esGeneral.g_alCompTypes.Get(0); - g_esGeneral.g_alCompTypes.Erase(0); - - vSetTankColor(tank, iType, false); + switch (MT_GetRandomInt(1, (sizeof iModels))) + { + case 1: SetEntityModel(tank, MODEL_TANK_MAIN); + case 2: SetEntityModel(tank, MODEL_TANK_DLC); + case 3: SetEntityModel(tank, (g_bSecondGame ? MODEL_TANK_L4D1 : MODEL_TANK_MAIN)); + } } } } - else if (bSpecial) + case false: { - iType = (type > 0) ? type : g_esPlayer[tank].g_iTankType; - for (int iSpecType = 0; iSpecType < (sizeof g_sSpecialNames); iSpecType++) + switch (MT_GetRandomInt(1, (sizeof iModels))) { - g_esTeammate[tank].g_iPersonalType[iSpecType] = 0; + case 1: SetEntityModel(tank, MODEL_TANK_MAIN); + case 2: SetEntityModel(tank, MODEL_TANK_DLC); + case 3: SetEntityModel(tank, (g_bSecondGame ? MODEL_TANK_L4D1 : MODEL_TANK_MAIN)); } - - vSetTankColor(tank, iType, false); } } - - if (g_esPlayer[tank].g_iTankType > 0) + } + else if (bIsSpecialInfected(tank) && g_esTankCache[tank].g_iSpecialModel > 0) + { + int iModelCount = 0, iModels[3], iFlag = 0; + for (int iBit = 0; iBit < (sizeof iModels); iBit++) { - vTankSpawn(tank, .specType = specType); - CreateTimer(0.1, tTimerCheckTankView, GetClientUserId(tank), TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); - CreateTimer(1.0, tTimerTankUpdate, GetClientUserId(tank), TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); - - if (bIsInfected(tank, MT_CHECK_FAKECLIENT) && g_esPlayer[tank].g_iFavoriteType > 0 && iType != g_esPlayer[tank].g_iFavoriteType && g_esGeneral.g_iSpawnMode == 2) + iFlag = (1 << iBit); + if (!(g_esTankCache[tank].g_iSpecialModel & iFlag)) { - vFavoriteMenu(tank, specType); + continue; } - } - else - { - vCacheSettings(tank); - vSetTankModel(tank); - vSetTankHealth(tank); - vResetTankSpeed(tank, false); - vSetTankThrowInterval(tank); - SDKHook(tank, SDKHook_PostThinkPost, OnTankPostThinkPost); - DataPack dpAnnounce; - CreateDataTimer(0.1, tTimerAnnounce2, dpAnnounce, TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); - dpAnnounce.WriteCell(GetClientUserId(tank)); - dpAnnounce.WriteCell(specType); - - g_esPlayer[tank].g_flLastAttackTime = GetGameTime(); - g_esPlayer[tank].g_iSpecialMaxHealth = GetEntProp(tank, Prop_Data, "m_iMaxHealth"); + iModels[iModelCount] = iFlag; + iModelCount++; + } - if (bTank) + switch (iModelCount > 0) + { + case true: { - g_esGeneral.g_iTankCount++; + switch (iModels[MT_GetRandomInt(0, (iModelCount - 1))]) + { + case 1: vSetSpecialModel(tank, true); + case 2: vSetSpecialModel(tank, false); + default: + { + switch (MT_GetRandomInt(1, (sizeof iModels))) + { + case 1: vSetSpecialModel(tank, true); + case 2: vSetSpecialModel(tank, false); + } + } + } } - else if (bSpecial) + case false: { - g_esGeneral.g_iSpecialCount++; + switch (MT_GetRandomInt(1, (sizeof iModels))) + { + case 1: vSetSpecialModel(tank, true); + case 2: vSetSpecialModel(tank, false); + } } } } - float flVelocity[3]; - GetEntPropVector(tank, Prop_Data, "m_vecVelocity", flVelocity); - if (flVelocity[0] == 0.0 && flVelocity[1] == 0.0 && flVelocity[2] == 0.0) - { - vFixPlayerPosition(tank); - } - - g_esGeneral.g_bBlindType = false; - g_esGeneral.g_bForceSpawned = false; - g_esGeneral.g_iChosenType = 0; -} - -void vNullifyNudge(int survivor) -{ - if (!bIsSurvivor(survivor) || bIsSurvivor(survivor, MT_CHECK_FAKECLIENT) || bIsSurvivorDisabled(survivor)) + if (g_esTankCache[tank].g_flBurntSkin >= 0.01) { - return; + SetEntPropFloat(tank, Prop_Send, "m_burnPercent", g_esTankCache[tank].g_flBurntSkin); } - - if (bIsDeveloper(survivor, 4) || bIsDeveloper(survivor, 11) || (g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_GODMODE)) + else if (g_esTankCache[tank].g_flBurntSkin == 0.0) { - float flCurrentTime = GetGameTime(); - if (GetEntPropFloat(survivor, Prop_Send, "m_noAvoidanceTimer", 1) > (flCurrentTime + 2.0)) - { - return; - } - - SetEntPropFloat(survivor, Prop_Send, "m_noAvoidanceTimer", (flCurrentTime + 2.0), 1); + SetEntPropFloat(tank, Prop_Send, "m_burnPercent", MT_GetRandomFloat(0.01, 1.0)); } } -void vParticleEffects(int tank) +void vSetTankName(int tank, const char[] oldname, const char[] name, int mode, int specType) { - if (bIsInfectedSupported(tank) && g_esCache[tank].g_iBodyEffects > 0) + if (bIsSpecialSupported(tank)) { - if ((g_esCache[tank].g_iBodyEffects & MT_PARTICLE_BLOOD) && !g_esPlayer[tank].g_bBlood) - { - g_esPlayer[tank].g_bBlood = true; - - CreateTimer(0.75, tTimerBloodEffect, GetClientUserId(tank), TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); - } - - if ((g_esCache[tank].g_iBodyEffects & MT_PARTICLE_ELECTRICITY) && !g_esPlayer[tank].g_bElectric) + if (!bIsInfected(tank, MT_CHECK_FAKECLIENT)) { - g_esPlayer[tank].g_bElectric = true; + char sName[33]; + if (g_esShooter[tank].g_bSurvivor) + { + if (g_esShooter[tank].g_sSurvivorName[0] == '\0') + { + int iCharacter = (g_bSecondGame ? g_esShooter[tank].g_iCharacter : (g_esShooter[tank].g_iCharacter + 4)); + strcopy(g_esShooter[tank].g_sSurvivorName, sizeof esShooter::g_sSurvivorName, g_sSurvivorNames[iCharacter]); + } - CreateTimer(0.75, tTimerElectricEffect, GetClientUserId(tank), TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); - } + strcopy(sName, sizeof sName, g_esShooter[tank].g_sSurvivorName); + } + else + { + switch (specType) + { + case 1: + { + if (g_esTankCache[tank].g_sSmokerName[0] == '\0') + { + strcopy(g_esTankCache[tank].g_sSmokerName, sizeof esTankCache::g_sSmokerName, g_sSpecialNames[specType]); + } - if ((g_esCache[tank].g_iBodyEffects & MT_PARTICLE_FIRE) && !g_esPlayer[tank].g_bFire) - { - g_esPlayer[tank].g_bFire = true; + strcopy(sName, sizeof sName, g_esTankCache[tank].g_sSmokerName); + } + case 2: + { + if (g_esTankCache[tank].g_sBoomerName[0] == '\0') + { + strcopy(g_esTankCache[tank].g_sBoomerName, sizeof esTankCache::g_sBoomerName, g_sSpecialNames[specType]); + } - CreateTimer(0.75, tTimerFireEffect, GetClientUserId(tank), TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); - } + strcopy(sName, sizeof sName, g_esTankCache[tank].g_sBoomerName); + } + case 3: + { + if (g_esTankCache[tank].g_sHunterName[0] == '\0') + { + strcopy(g_esTankCache[tank].g_sHunterName, sizeof esTankCache::g_sHunterName, g_sSpecialNames[specType]); + } - if ((g_esCache[tank].g_iBodyEffects & MT_PARTICLE_ICE) && !g_esPlayer[tank].g_bIce) - { - g_esPlayer[tank].g_bIce = true; + strcopy(sName, sizeof sName, g_esTankCache[tank].g_sHunterName); + } + case 4: + { + if (g_esTankCache[tank].g_sSpitterName[0] == '\0') + { + strcopy(g_esTankCache[tank].g_sSpitterName, sizeof esTankCache::g_sSpitterName, g_sSpecialNames[specType]); + } - CreateTimer(2.0, tTimerIceEffect, GetClientUserId(tank), TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); - } + strcopy(sName, sizeof sName, g_esTankCache[tank].g_sSpitterName); + } + case 5: + { + if (g_esTankCache[tank].g_sJockeyName[0] == '\0') + { + strcopy(g_esTankCache[tank].g_sJockeyName, sizeof esTankCache::g_sJockeyName, g_sSpecialNames[specType]); + } - if ((g_esCache[tank].g_iBodyEffects & MT_PARTICLE_METEOR) && !g_esPlayer[tank].g_bMeteor) - { - g_esPlayer[tank].g_bMeteor = true; + strcopy(sName, sizeof sName, g_esTankCache[tank].g_sJockeyName); + } + case 6: + { + if (g_esTankCache[tank].g_sChargerName[0] == '\0') + { + strcopy(g_esTankCache[tank].g_sChargerName, sizeof esTankCache::g_sChargerName, g_sSpecialNames[specType]); + } - CreateTimer(6.0, tTimerMeteorEffect, GetClientUserId(tank), TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); - } + strcopy(sName, sizeof sName, g_esTankCache[tank].g_sChargerName); + } + default: + { + if (g_esTankCache[tank].g_sTankName[0] == '\0') + { + g_esTankCache[tank].g_sTankName = "Tank"; + } - if ((g_esCache[tank].g_iBodyEffects & MT_PARTICLE_SMOKE) && !g_esPlayer[tank].g_bSmoke) - { - g_esPlayer[tank].g_bSmoke = true; + strcopy(sName, sizeof sName, g_esTankCache[tank].g_sTankName); + } + } + } - CreateTimer(1.5, tTimerSmokeEffect, GetClientUserId(tank), TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); + g_esGeneral.g_bHideNameChange = true; + SetClientName(tank, sName); + g_esGeneral.g_bHideNameChange = false; } - if (g_bSecondGame && (g_esCache[tank].g_iBodyEffects & MT_PARTICLE_SPIT) && !g_esPlayer[tank].g_bSpit) + switch (mode == 0 || mode == 5) { - g_esPlayer[tank].g_bSpit = true; - - CreateTimer(2.0, tTimerSpitEffect, GetClientUserId(tank), TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); + case true: + { + DataPack dpAnnounce; + CreateDataTimer(0.1, tTimerAnnounce, dpAnnounce, TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); + dpAnnounce.WriteCell(GetClientUserId(tank)); + dpAnnounce.WriteString(oldname); + dpAnnounce.WriteString(name); + dpAnnounce.WriteCell(mode); + dpAnnounce.WriteCell(specType); + } + case false: vChooseArrivalType(tank, oldname, name, mode, specType); } } } -void vPerformKnockback(int special, int survivor) +void vSetTankProps(int tank) { - if (g_esGeneral.g_hSDKShovedBySurvivor != null) + if (bIsTankSupported(tank) && (g_esGeneral.g_iGraphicsLevel > 1 || g_esGeneral.g_cvMTGraphicsLevel.IntValue > 1)) { - float flTankOrigin[3], flSurvivorOrigin[3], flDirection[3]; - GetClientAbsOrigin(survivor, flSurvivorOrigin); - GetClientAbsOrigin(special, flTankOrigin); - MakeVectorFromPoints(flSurvivorOrigin, flTankOrigin, flDirection); - NormalizeVector(flDirection, flDirection); - SDKCall(g_esGeneral.g_hSDKShovedBySurvivor, special, survivor, flDirection); - } + if (GetRandomFloat(0.1, 100.0) <= g_esTankCache[tank].g_flPropsChance[0] && (g_esTankCache[tank].g_iPropsAttached & MT_PROP_BLUR) && !g_esPlayer[tank].g_bBlur) + { + float flTankPos[3], flTankAngles[3]; + GetClientAbsOrigin(tank, flTankPos); + GetClientAbsAngles(tank, flTankAngles); - SetEntPropFloat(special, Prop_Send, "m_flVelocityModifier", 0.4); -} + g_esPlayer[tank].g_iBlur = CreateEntityByName("prop_dynamic"); + if (bIsValidEntity(g_esPlayer[tank].g_iBlur)) + { + g_esPlayer[tank].g_bBlur = true; -void vQueueTank(int admin, int specType, int type, bool mode = true, bool log = true) -{ - char sType[5]; - IntToString(type, sType, sizeof sType); - vSetupTankSpawn(admin, specType, sType, mode, log); -} + char sModel[32]; + GetEntPropString(tank, Prop_Data, "m_ModelName", sModel, sizeof sModel); -void vRegenSurvivorHealth(int survivor, int healer, int extra) -{ - bool bDeveloper = bIsDeveloper(healer); - float flTempHealth = flGetTempHealth(survivor, g_esGeneral.g_cvMTPainPillsDecayRate.FloatValue); - int iHealth = GetEntProp(survivor, Prop_Data, "m_iHealth"), iMaxHealth = GetEntProp(survivor, Prop_Data, "m_iMaxHealth"); - iMaxHealth = (bDeveloper && g_esDeveloper[healer].g_iDevOverhealth > iMaxHealth) ? g_esDeveloper[healer].g_iDevOverhealth : iMaxHealth; + switch (sModel[21]) + { + case 'm': SetEntityModel(g_esPlayer[tank].g_iBlur, MODEL_TANK_MAIN); + case 'd': SetEntityModel(g_esPlayer[tank].g_iBlur, MODEL_TANK_DLC); + case 'l': SetEntityModel(g_esPlayer[tank].g_iBlur, MODEL_TANK_L4D1); + } - if (!bDeveloper && (g_esPlayer[survivor].g_iReviveCount > 0 || g_esPlayer[survivor].g_bLastLife[0])) - { - switch ((flTempHealth + extra) > iMaxHealth) - { - case true: vSetTempHealth(survivor, float(iMaxHealth)); - case false: vSetTempHealth(survivor, (flTempHealth + extra)); - } - } - else - { - switch ((iHealth + extra) > iMaxHealth) - { - case true: SetEntProp(survivor, Prop_Data, "m_iHealth", iMaxHealth); - case false: SetEntProp(survivor, Prop_Data, "m_iHealth", (iHealth + extra)); - } + switch (StrEqual(g_esTankCache[tank].g_sSkinColor, "rainbow", false) && (g_esGeneral.g_iGraphicsLevel > 2 || g_esGeneral.g_cvMTGraphicsLevel.IntValue > 2)) + { + case true: + { + if (!g_esPlayer[tank].g_bRainbowColor) + { + g_esPlayer[tank].g_bRainbowColor = SDKHookEx(tank, SDKHook_PreThinkPost, OnTankRainbowPreThinkPost); + } + } + case false: + { + int iColor[4] = {0, 0, 0, 0}; + GetEntityRenderColor(tank, iColor[0], iColor[1], iColor[2], iColor[3]); + SetEntityRenderColor(g_esPlayer[tank].g_iBlur, iColor[0], iColor[1], iColor[2], 150); + } + } - float flHealth = flTempHealth - extra; - vSetTempHealth(survivor, ((flHealth < 0.0) ? 0.0 : flHealth)); - } + SetEntPropEnt(g_esPlayer[tank].g_iBlur, Prop_Data, "m_hOwnerEntity", tank); - if ((iHealth + flGetTempHealth(survivor, g_esGeneral.g_cvMTPainPillsDecayRate.FloatValue)) > iMaxHealth) - { - vSetTempHealth(survivor, float(iMaxHealth - iHealth)); - } -} + TeleportEntity(g_esPlayer[tank].g_iBlur, flTankPos, flTankAngles); + DispatchSpawn(g_esPlayer[tank].g_iBlur); -void vRegularSpawn(int specType = 0) -{ - int iPlayer = iGetRandomPlayer(); - if (bIsValidClient(iPlayer)) - { - char sCommand[32]; - FormatEx(sCommand, sizeof sCommand, "z_spawn%s", (g_bSecondGame ? "_old" : "")); + AcceptEntityInput(g_esPlayer[tank].g_iBlur, "DisableCollision"); + SetEntProp(g_esPlayer[tank].g_iBlur, Prop_Send, "m_nSequence", GetEntProp(tank, Prop_Send, "m_nSequence")); + SetEntPropFloat(g_esPlayer[tank].g_iBlur, Prop_Send, "m_flPlaybackRate", 5.0); - switch (specType) - { - case 1: vCheatCommand(iPlayer, sCommand, "smoker auto"); - case 2: vCheatCommand(iPlayer, sCommand, "boomer auto"); - case 3: vCheatCommand(iPlayer, sCommand, "hunter auto"); - case 4: vCheatCommand(iPlayer, sCommand, "spitter auto"); - case 5: vCheatCommand(iPlayer, sCommand, "jockey auto"); - case 6: vCheatCommand(iPlayer, sCommand, "charger auto"); - default: vCheatCommand(iPlayer, sCommand, "tank auto"); - } - } -} + SDKHook(g_esPlayer[tank].g_iBlur, SDKHook_SetTransmit, OnPropSetTransmit); + g_esPlayer[tank].g_iBlur = EntIndexToEntRef(g_esPlayer[tank].g_iBlur); -void vRemoveTankProps(int tank, bool revert = true) -{ - if (bIsValidEntRef(g_esPlayer[tank].g_iBlur)) - { - g_esPlayer[tank].g_iBlur = EntRefToEntIndex(g_esPlayer[tank].g_iBlur); - if (bIsValidEntity(g_esPlayer[tank].g_iBlur)) - { - SDKUnhook(g_esPlayer[tank].g_iBlur, SDKHook_SetTransmit, OnPropSetTransmit); - RemoveEntity(g_esPlayer[tank].g_iBlur); + CreateTimer(0.1, tTimerBlurEffect, GetClientUserId(tank), TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); + } } - } - g_esPlayer[tank].g_iBlur = INVALID_ENT_REFERENCE; + bool bValid = false; + float flOrigin[3], flAngles[3]; + GetEntPropVector(tank, Prop_Data, "m_vecOrigin", flOrigin); + GetEntPropVector(tank, Prop_Data, "m_angRotation", flAngles); - for (int iLight = 0; iLight < (sizeof esPlayer::g_iLight); iLight++) - { - if (bIsValidEntRef(g_esPlayer[tank].g_iLight[iLight])) + float flChance = GetRandomFloat(0.1, 100.0), flValue = 0.0; + int iFlag = 0, iType = 0; + for (int iLight = 0; iLight < (sizeof esPlayer::g_iLight); iLight++) { - g_esPlayer[tank].g_iLight[iLight] = EntRefToEntIndex(g_esPlayer[tank].g_iLight[iLight]); - if (bIsValidEntity(g_esPlayer[tank].g_iLight[iLight])) + bValid = bIsValidEntRef(g_esPlayer[tank].g_iLight[iLight]); + flValue = ((iLight < 3) ? GetRandomFloat(0.1, 100.0) : flChance); + iFlag = ((iLight < 3) ? MT_PROP_LIGHT : MT_PROP_CROWN); + iType = ((iLight < 3) ? 1 : 8); + if (!bValid && flValue <= g_esTankCache[tank].g_flPropsChance[iType] && (g_esTankCache[tank].g_iPropsAttached & iFlag)) { - SDKUnhook(g_esPlayer[tank].g_iLight[iLight], SDKHook_SetTransmit, OnPropSetTransmit); - RemoveEntity(g_esPlayer[tank].g_iLight[iLight]); + vLightProp(tank, iLight, flOrigin, flAngles); } - } - - g_esPlayer[tank].g_iLight[iLight] = INVALID_ENT_REFERENCE; - } - - for (int iOzTank = 0; iOzTank < (sizeof esPlayer::g_iFlame); iOzTank++) - { - if (bIsValidEntRef(g_esPlayer[tank].g_iFlame[iOzTank])) - { - g_esPlayer[tank].g_iFlame[iOzTank] = EntRefToEntIndex(g_esPlayer[tank].g_iFlame[iOzTank]); - if (bIsValidEntity(g_esPlayer[tank].g_iFlame[iOzTank])) + else if (bValid) { - SDKUnhook(g_esPlayer[tank].g_iFlame[iOzTank], SDKHook_SetTransmit, OnPropSetTransmit); - RemoveEntity(g_esPlayer[tank].g_iFlame[iOzTank]); + g_esPlayer[tank].g_iLight[iLight] = EntRefToEntIndex(g_esPlayer[tank].g_iLight[iLight]); + if (bIsValidEntity(g_esPlayer[tank].g_iLight[iLight])) + { + SDKUnhook(g_esPlayer[tank].g_iLight[iLight], SDKHook_SetTransmit, OnPropSetTransmit); + RemoveEntity(g_esPlayer[tank].g_iLight[iLight]); + } + + g_esPlayer[tank].g_iLight[iLight] = INVALID_ENT_REFERENCE; + if (g_esTankCache[tank].g_iPropsAttached & iFlag) + { + vLightProp(tank, iLight, flOrigin, flAngles); + } } } - g_esPlayer[tank].g_iFlame[iOzTank] = INVALID_ENT_REFERENCE; + GetEntPropVector(tank, Prop_Data, "m_vecOrigin", flOrigin); + GetEntPropVector(tank, Prop_Data, "m_angRotation", flAngles); - if (bIsValidEntRef(g_esPlayer[tank].g_iOzTank[iOzTank])) + float flOrigin2[3], flAngles2[3] = {0.0, 0.0, 90.0}; + for (int iOzTank = 0; iOzTank < (sizeof esPlayer::g_iOzTank); iOzTank++) { - g_esPlayer[tank].g_iOzTank[iOzTank] = EntRefToEntIndex(g_esPlayer[tank].g_iOzTank[iOzTank]); - if (bIsValidEntity(g_esPlayer[tank].g_iOzTank[iOzTank])) + bValid = bIsValidEntRef(g_esPlayer[tank].g_iOzTank[iOzTank]); + if (!bValid && GetRandomFloat(0.1, 100.0) <= g_esTankCache[tank].g_flPropsChance[2] && (g_esTankCache[tank].g_iPropsAttached & MT_PROP_OXYGENTANK)) { - SDKUnhook(g_esPlayer[tank].g_iOzTank[iOzTank], SDKHook_SetTransmit, OnPropSetTransmit); - RemoveEntity(g_esPlayer[tank].g_iOzTank[iOzTank]); - } - } + g_esPlayer[tank].g_iOzTank[iOzTank] = CreateEntityByName("prop_dynamic_override"); + if (bIsValidEntity(g_esPlayer[tank].g_iOzTank[iOzTank])) + { + SetEntityModel(g_esPlayer[tank].g_iOzTank[iOzTank], MODEL_OXYGENTANK); + SetEntityRenderColor(g_esPlayer[tank].g_iOzTank[iOzTank], iGetRandomColor(g_esTankCache[tank].g_iOzTankColor[0]), iGetRandomColor(g_esTankCache[tank].g_iOzTankColor[1]), iGetRandomColor(g_esTankCache[tank].g_iOzTankColor[2]), iGetRandomColor(g_esTankCache[tank].g_iOzTankColor[3])); + + DispatchKeyValueVector(g_esPlayer[tank].g_iOzTank[iOzTank], "origin", flOrigin); + DispatchKeyValueVector(g_esPlayer[tank].g_iOzTank[iOzTank], "angles", flAngles); + vSetEntityParent(g_esPlayer[tank].g_iOzTank[iOzTank], tank, true); + + switch (iOzTank) + { + case 0: + { + SetVariantString("rfoot"); + vSetVector(flOrigin2, 0.0, 30.0, 8.0); + } + case 1: + { + SetVariantString("lfoot"); + vSetVector(flOrigin2, 0.0, 30.0, -8.0); + } + } + + AcceptEntityInput(g_esPlayer[tank].g_iOzTank[iOzTank], "SetParentAttachment"); + AcceptEntityInput(g_esPlayer[tank].g_iOzTank[iOzTank], "Enable"); + AcceptEntityInput(g_esPlayer[tank].g_iOzTank[iOzTank], "DisableCollision"); + TeleportEntity(g_esPlayer[tank].g_iOzTank[iOzTank], flOrigin2, flAngles2); + DispatchSpawn(g_esPlayer[tank].g_iOzTank[iOzTank]); + + SDKHook(g_esPlayer[tank].g_iOzTank[iOzTank], SDKHook_SetTransmit, OnPropSetTransmit); + g_esPlayer[tank].g_iOzTank[iOzTank] = EntIndexToEntRef(g_esPlayer[tank].g_iOzTank[iOzTank]); + + if (!bIsValidEntRef(g_esPlayer[tank].g_iFlame[iOzTank]) && GetRandomFloat(0.1, 100.0) <= g_esTankCache[tank].g_flPropsChance[3] && (g_esTankCache[tank].g_iPropsAttached & MT_PROP_FLAME)) + { + g_esPlayer[tank].g_iFlame[iOzTank] = CreateEntityByName("env_steam"); + if (bIsValidEntity(g_esPlayer[tank].g_iFlame[iOzTank])) + { + SetEntityRenderColor(g_esPlayer[tank].g_iFlame[iOzTank], iGetRandomColor(g_esTankCache[tank].g_iFlameColor[0]), iGetRandomColor(g_esTankCache[tank].g_iFlameColor[1]), iGetRandomColor(g_esTankCache[tank].g_iFlameColor[2]), iGetRandomColor(g_esTankCache[tank].g_iFlameColor[3])); + + DispatchKeyValueVector(g_esPlayer[tank].g_iFlame[iOzTank], "origin", flOrigin); + vSetEntityParent(g_esPlayer[tank].g_iFlame[iOzTank], g_esPlayer[tank].g_iOzTank[iOzTank], true); + + DispatchKeyValueInt(g_esPlayer[tank].g_iFlame[iOzTank], "spawnflags", 1); + DispatchKeyValueInt(g_esPlayer[tank].g_iFlame[iOzTank], "Type", 0); + DispatchKeyValueInt(g_esPlayer[tank].g_iFlame[iOzTank], "InitialState", 1); + DispatchKeyValueInt(g_esPlayer[tank].g_iFlame[iOzTank], "Spreadspeed", 1); + DispatchKeyValueInt(g_esPlayer[tank].g_iFlame[iOzTank], "Speed", 250); + DispatchKeyValueInt(g_esPlayer[tank].g_iFlame[iOzTank], "Startsize", 6); + DispatchKeyValueInt(g_esPlayer[tank].g_iFlame[iOzTank], "EndSize", 8); + DispatchKeyValueInt(g_esPlayer[tank].g_iFlame[iOzTank], "Rate", 555); + DispatchKeyValueInt(g_esPlayer[tank].g_iFlame[iOzTank], "JetLength", 40); - g_esPlayer[tank].g_iOzTank[iOzTank] = INVALID_ENT_REFERENCE; - } + float flOrigin3[3] = {-2.0, 0.0, 28.0}, flAngles3[3] = {-90.0, 0.0, -90.0}; + AcceptEntityInput(g_esPlayer[tank].g_iFlame[iOzTank], "TurnOn"); + TeleportEntity(g_esPlayer[tank].g_iFlame[iOzTank], flOrigin3, flAngles3); + DispatchSpawn(g_esPlayer[tank].g_iFlame[iOzTank]); - for (int iRock = 0; iRock < (sizeof esPlayer::g_iRock); iRock++) - { - if (bIsValidEntRef(g_esPlayer[tank].g_iRock[iRock])) - { - g_esPlayer[tank].g_iRock[iRock] = EntRefToEntIndex(g_esPlayer[tank].g_iRock[iRock]); - if (bIsValidEntity(g_esPlayer[tank].g_iRock[iRock])) - { - SDKUnhook(g_esPlayer[tank].g_iRock[iRock], SDKHook_SetTransmit, OnPropSetTransmit); - RemoveEntity(g_esPlayer[tank].g_iRock[iRock]); + SDKHook(g_esPlayer[tank].g_iFlame[iOzTank], SDKHook_SetTransmit, OnPropSetTransmit); + g_esPlayer[tank].g_iFlame[iOzTank] = EntIndexToEntRef(g_esPlayer[tank].g_iFlame[iOzTank]); + } + } + } } - } + else if (bValid) + { + g_esPlayer[tank].g_iOzTank[iOzTank] = EntRefToEntIndex(g_esPlayer[tank].g_iOzTank[iOzTank]); + if (bIsValidEntity(g_esPlayer[tank].g_iOzTank[iOzTank]) && (g_esTankCache[tank].g_iPropsAttached & MT_PROP_OXYGENTANK)) + { + SetEntityRenderColor(g_esPlayer[tank].g_iOzTank[iOzTank], iGetRandomColor(g_esTankCache[tank].g_iOzTankColor[0]), iGetRandomColor(g_esTankCache[tank].g_iOzTankColor[1]), iGetRandomColor(g_esTankCache[tank].g_iOzTankColor[2]), iGetRandomColor(g_esTankCache[tank].g_iOzTankColor[3])); + } + else + { + if (bIsValidEntity(g_esPlayer[tank].g_iOzTank[iOzTank])) + { + SDKUnhook(g_esPlayer[tank].g_iOzTank[iOzTank], SDKHook_SetTransmit, OnPropSetTransmit); + RemoveEntity(g_esPlayer[tank].g_iOzTank[iOzTank]); + } - g_esPlayer[tank].g_iRock[iRock] = INVALID_ENT_REFERENCE; - } + g_esPlayer[tank].g_iOzTank[iOzTank] = INVALID_ENT_REFERENCE; + } - for (int iTire = 0; iTire < (sizeof esPlayer::g_iTire); iTire++) - { - if (bIsValidEntRef(g_esPlayer[tank].g_iTire[iTire])) - { - g_esPlayer[tank].g_iTire[iTire] = EntRefToEntIndex(g_esPlayer[tank].g_iTire[iTire]); - if (bIsValidEntity(g_esPlayer[tank].g_iTire[iTire])) - { - SDKUnhook(g_esPlayer[tank].g_iTire[iTire], SDKHook_SetTransmit, OnPropSetTransmit); - RemoveEntity(g_esPlayer[tank].g_iTire[iTire]); + if (bIsValidEntRef(g_esPlayer[tank].g_iFlame[iOzTank])) + { + g_esPlayer[tank].g_iFlame[iOzTank] = EntRefToEntIndex(g_esPlayer[tank].g_iFlame[iOzTank]); + if (bIsValidEntity(g_esPlayer[tank].g_iFlame[iOzTank]) && (g_esTankCache[tank].g_iPropsAttached & MT_PROP_FLAME)) + { + SetEntityRenderColor(g_esPlayer[tank].g_iFlame[iOzTank], iGetRandomColor(g_esTankCache[tank].g_iFlameColor[0]), iGetRandomColor(g_esTankCache[tank].g_iFlameColor[1]), iGetRandomColor(g_esTankCache[tank].g_iFlameColor[2]), iGetRandomColor(g_esTankCache[tank].g_iFlameColor[3])); + } + else + { + if (bIsValidEntity(g_esPlayer[tank].g_iFlame[iOzTank])) + { + SDKUnhook(g_esPlayer[tank].g_iFlame[iOzTank], SDKHook_SetTransmit, OnPropSetTransmit); + RemoveEntity(g_esPlayer[tank].g_iFlame[iOzTank]); + } + + g_esPlayer[tank].g_iFlame[iOzTank] = INVALID_ENT_REFERENCE; + } + } } } - g_esPlayer[tank].g_iTire[iTire] = INVALID_ENT_REFERENCE; - } + GetEntPropVector(tank, Prop_Data, "m_vecOrigin", flOrigin); + GetEntPropVector(tank, Prop_Data, "m_angRotation", flAngles); - if (bIsValidEntRef(g_esPlayer[tank].g_iPropaneTank)) - { - g_esPlayer[tank].g_iPropaneTank = EntRefToEntIndex(g_esPlayer[tank].g_iPropaneTank); - if (bIsValidEntity(g_esPlayer[tank].g_iPropaneTank)) + for (int iRock = 0; iRock < (sizeof esPlayer::g_iRock); iRock++) { - SDKUnhook(g_esPlayer[tank].g_iPropaneTank, SDKHook_SetTransmit, OnPropSetTransmit); - RemoveEntity(g_esPlayer[tank].g_iPropaneTank); - } - } - - g_esPlayer[tank].g_iPropaneTank = INVALID_ENT_REFERENCE; + bValid = bIsValidEntRef(g_esPlayer[tank].g_iRock[iRock]); + if (!bValid && GetRandomFloat(0.1, 100.0) <= g_esTankCache[tank].g_flPropsChance[4] && (g_esTankCache[tank].g_iPropsAttached & MT_PROP_ROCK)) + { + g_esPlayer[tank].g_iRock[iRock] = CreateEntityByName("prop_dynamic_override"); + if (bIsValidEntity(g_esPlayer[tank].g_iRock[iRock])) + { + SetEntityRenderColor(g_esPlayer[tank].g_iRock[iRock], iGetRandomColor(g_esTankCache[tank].g_iRockColor[0]), iGetRandomColor(g_esTankCache[tank].g_iRockColor[1]), iGetRandomColor(g_esTankCache[tank].g_iRockColor[2]), iGetRandomColor(g_esTankCache[tank].g_iRockColor[3])); + vSetRockModel(tank, g_esPlayer[tank].g_iRock[iRock]); - if (bIsValidEntRef(g_esPlayer[tank].g_iFlashlight)) - { - g_esPlayer[tank].g_iFlashlight = EntRefToEntIndex(g_esPlayer[tank].g_iFlashlight); - if (bIsValidEntity(g_esPlayer[tank].g_iFlashlight)) - { - SDKUnhook(g_esPlayer[tank].g_iFlashlight, SDKHook_SetTransmit, OnPropSetTransmit); - RemoveEntity(g_esPlayer[tank].g_iFlashlight); - } - } + DispatchKeyValueVector(g_esPlayer[tank].g_iRock[iRock], "origin", flOrigin); + DispatchKeyValueVector(g_esPlayer[tank].g_iRock[iRock], "angles", flAngles); + vSetEntityParent(g_esPlayer[tank].g_iRock[iRock], tank, true); - g_esPlayer[tank].g_iFlashlight = INVALID_ENT_REFERENCE; - vRemovePlayerGlow(tank); + switch (iRock) + { + case 0, 4, 8, 12, 16: SetVariantString("rshoulder"); + case 1, 5, 9, 13, 17: SetVariantString("lshoulder"); + case 2, 6, 10, 14, 18: SetVariantString("relbow"); + case 3, 7, 11, 15, 19: SetVariantString("lelbow"); + } - if (revert) - { - SetEntityRenderMode(tank, RENDER_NORMAL); - SetEntityRenderColor(tank, 255, 255, 255, 255); - } -} + AcceptEntityInput(g_esPlayer[tank].g_iRock[iRock], "SetParentAttachment"); + AcceptEntityInput(g_esPlayer[tank].g_iRock[iRock], "Enable"); + AcceptEntityInput(g_esPlayer[tank].g_iRock[iRock], "DisableCollision"); -void vResetTank(int tank, bool revert = true) -{ - vRemoveTankProps(tank, revert); - vResetTankSpeed(tank); - vSpawnModes(tank, false); -} + if (g_bSecondGame) + { + switch (iRock) + { + case 0, 1, 4, 5, 8, 9, 12, 13, 16, 17: SetEntPropFloat(g_esPlayer[tank].g_iRock[iRock], Prop_Data, "m_flModelScale", 0.4); + case 2, 3, 6, 7, 10, 11, 14, 15, 18, 19: SetEntPropFloat(g_esPlayer[tank].g_iRock[iRock], Prop_Data, "m_flModelScale", 0.5); + } + } -void vResetTank2(int tank, bool full = true) -{ - g_esPlayer[tank].g_bArtificial = false; - g_esPlayer[tank].g_bBlood = false; - g_esPlayer[tank].g_bBlur = false; - g_esPlayer[tank].g_bElectric = false; - g_esPlayer[tank].g_bFire = false; - g_esPlayer[tank].g_bFirstSpawn = false; - g_esPlayer[tank].g_bIce = false; - g_esPlayer[tank].g_bKeepCurrentType = false; - g_esPlayer[tank].g_bMeteor = false; - g_esPlayer[tank].g_bProtected[0] = false; - g_esPlayer[tank].g_bProtected[1] = false; - g_esPlayer[tank].g_bReplaceSelf = false; - g_esPlayer[tank].g_bSmoke = false; - g_esPlayer[tank].g_bSpit = false; - g_esPlayer[tank].g_flLastAttackTime = 0.0; - g_esPlayer[tank].g_iBossStageCount = 0; - g_esPlayer[tank].g_iClawCount = 0; - g_esPlayer[tank].g_iClawDamage = 0; - g_esPlayer[tank].g_iCooldown = -1; - g_esPlayer[tank].g_iIncapCount = 0; - g_esPlayer[tank].g_iKillCount = 0; - g_esPlayer[tank].g_iMiscCount = 0; - g_esPlayer[tank].g_iMiscDamage = 0; - g_esPlayer[tank].g_iOldTankType = 0; - g_esPlayer[tank].g_iPropCount = 0; - g_esPlayer[tank].g_iPropDamage = 0; - g_esPlayer[tank].g_iRockCount = 0; - g_esPlayer[tank].g_iRockDamage = 0; - g_esPlayer[tank].g_iSurvivorDamage = 0; - g_esPlayer[tank].g_iTankType = 0; + flAngles[0] += MT_GetRandomFloat(-90.0, 90.0); + flAngles[1] += MT_GetRandomFloat(-90.0, 90.0); + flAngles[2] += MT_GetRandomFloat(-90.0, 90.0); - for (int iPos = 0; iPos < (sizeof esPlayer::g_iThrownRock); iPos++) - { - g_esPlayer[tank].g_iThrownRock[iPos] = INVALID_ENT_REFERENCE; - } + TeleportEntity(g_esPlayer[tank].g_iRock[iRock], .angles = flAngles); + DispatchSpawn(g_esPlayer[tank].g_iRock[iRock]); - if (full) - { - vResetSurvivorStats(tank, true); - } + SDKHook(g_esPlayer[tank].g_iRock[iRock], SDKHook_SetTransmit, OnPropSetTransmit); + g_esPlayer[tank].g_iRock[iRock] = EntIndexToEntRef(g_esPlayer[tank].g_iRock[iRock]); + } + } + else if (bValid) + { + g_esPlayer[tank].g_iRock[iRock] = EntRefToEntIndex(g_esPlayer[tank].g_iRock[iRock]); + if (bIsValidEntity(g_esPlayer[tank].g_iRock[iRock]) && (g_esTankCache[tank].g_iPropsAttached & MT_PROP_ROCK)) + { + SetEntityRenderColor(g_esPlayer[tank].g_iRock[iRock], iGetRandomColor(g_esTankCache[tank].g_iRockColor[0]), iGetRandomColor(g_esTankCache[tank].g_iRockColor[1]), iGetRandomColor(g_esTankCache[tank].g_iRockColor[2]), iGetRandomColor(g_esTankCache[tank].g_iRockColor[3])); + vSetRockModel(tank, g_esPlayer[tank].g_iRock[iRock]); + } + else + { + if (bIsValidEntity(g_esPlayer[tank].g_iRock[iRock])) + { + SDKUnhook(g_esPlayer[tank].g_iRock[iRock], SDKHook_SetTransmit, OnPropSetTransmit); + RemoveEntity(g_esPlayer[tank].g_iRock[iRock]); + } - delete g_esPlayer[tank].g_hProtectionTimer[0]; - delete g_esPlayer[tank].g_hProtectionTimer[1]; -} + g_esPlayer[tank].g_iRock[iRock] = INVALID_ENT_REFERENCE; + } + } + } -void vResetTank3(int tank) -{ - ExtinguishEntity(tank); - EmitSoundToAll(SOUND_ELECTRICITY, tank); - vAttachParticle(tank, PARTICLE_ELECTRICITY, 2.0, 30.0); - vResetTankSpeed(tank); - vRemovePlayerGlow(tank); -} + GetEntPropVector(tank, Prop_Data, "m_vecOrigin", flOrigin); + GetEntPropVector(tank, Prop_Data, "m_angRotation", flAngles); + flAngles[0] += 90.0; -void vResetTankSpeed(int tank, bool mode = true) -{ - if (bIsValidClient(tank, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_ALIVE)) - { - switch (mode || g_esCache[tank].g_flRunSpeed <= 0.0) + for (int iTire = 0; iTire < (sizeof esPlayer::g_iTire); iTire++) { - case true: SetEntPropFloat(tank, Prop_Send, "m_flLaggedMovementValue", (g_esGeneral.g_bLaggedMovementInstalled ? L4D_LaggedMovement(tank, 1.0, true) : 1.0)); - case false: SetEntPropFloat(tank, Prop_Send, "m_flLaggedMovementValue", (g_esGeneral.g_bLaggedMovementInstalled ? L4D_LaggedMovement(tank, g_esCache[tank].g_flRunSpeed) : g_esCache[tank].g_flRunSpeed)); - } - } -} + bValid = bIsValidEntRef(g_esPlayer[tank].g_iTire[iTire]); + if (!bValid && GetRandomFloat(0.1, 100.0) <= g_esTankCache[tank].g_flPropsChance[5] && (g_esTankCache[tank].g_iPropsAttached & MT_PROP_TIRE)) + { + g_esPlayer[tank].g_iTire[iTire] = CreateEntityByName("prop_dynamic_override"); + if (bIsValidEntity(g_esPlayer[tank].g_iTire[iTire])) + { + SetEntityModel(g_esPlayer[tank].g_iTire[iTire], MODEL_TIRES); + SetEntityRenderColor(g_esPlayer[tank].g_iTire[iTire], iGetRandomColor(g_esTankCache[tank].g_iTireColor[0]), iGetRandomColor(g_esTankCache[tank].g_iTireColor[1]), iGetRandomColor(g_esTankCache[tank].g_iTireColor[2]), iGetRandomColor(g_esTankCache[tank].g_iTireColor[3])); -void vSetRockEffects(int tank, int rock) -{ - if (g_esCache[tank].g_iRockEffects > 0) - { - DataPack dpRockEffects; - CreateDataTimer(0.75, tTimerRockEffects, dpRockEffects, TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); - dpRockEffects.WriteCell(EntIndexToEntRef(rock)); - dpRockEffects.WriteCell(GetClientUserId(tank)); - } -} + DispatchKeyValueVector(g_esPlayer[tank].g_iTire[iTire], "origin", flOrigin); + DispatchKeyValueVector(g_esPlayer[tank].g_iTire[iTire], "angles", flAngles); + vSetEntityParent(g_esPlayer[tank].g_iTire[iTire], tank, true); -void vSetRockModel(int tank, int rock) -{ - switch (g_esCache[tank].g_iRockModel) - { - case -1, 0: SetEntityModel(rock, MODEL_CONCRETE_CHUNK); - case 1: SetEntityModel(rock, MODEL_TREE_TRUNK); - case 2: SetEntityModel(rock, ((MT_GetRandomInt(0, 1) == 0) ? MODEL_CONCRETE_CHUNK : MODEL_TREE_TRUNK)); - } -} + switch (iTire) + { + case 0: SetVariantString("rfoot"); + case 1: SetVariantString("lfoot"); + } + + AcceptEntityInput(g_esPlayer[tank].g_iTire[iTire], "SetParentAttachment"); + AcceptEntityInput(g_esPlayer[tank].g_iTire[iTire], "Enable"); + AcceptEntityInput(g_esPlayer[tank].g_iTire[iTire], "DisableCollision"); -void vSetRockColor(int tank, int rock) -{ - switch (StrEqual(g_esCache[tank].g_sRockColor, "rainbow", false)) - { - case true: - { - g_esPlayer[tank].g_iThrownRock[rock] = EntIndexToEntRef(rock); + if (g_bSecondGame) + { + SetEntPropFloat(g_esPlayer[tank].g_iTire[iTire], Prop_Data, "m_flModelScale", 1.5); + } - if (!g_esPlayer[tank].g_bRainbowColor) + TeleportEntity(g_esPlayer[tank].g_iTire[iTire], .angles = flAngles); + DispatchSpawn(g_esPlayer[tank].g_iTire[iTire]); + + SDKHook(g_esPlayer[tank].g_iTire[iTire], SDKHook_SetTransmit, OnPropSetTransmit); + g_esPlayer[tank].g_iTire[iTire] = EntIndexToEntRef(g_esPlayer[tank].g_iTire[iTire]); + } + } + else if (bValid) { - g_esPlayer[tank].g_bRainbowColor = SDKHookEx(tank, SDKHook_PreThinkPost, OnRainbowPreThinkPost); + g_esPlayer[tank].g_iTire[iTire] = EntRefToEntIndex(g_esPlayer[tank].g_iTire[iTire]); + if (bIsValidEntity(g_esPlayer[tank].g_iTire[iTire]) && (g_esTankCache[tank].g_iPropsAttached & MT_PROP_TIRE)) + { + SetEntityRenderColor(g_esPlayer[tank].g_iTire[iTire], iGetRandomColor(g_esTankCache[tank].g_iTireColor[0]), iGetRandomColor(g_esTankCache[tank].g_iTireColor[1]), iGetRandomColor(g_esTankCache[tank].g_iTireColor[2]), iGetRandomColor(g_esTankCache[tank].g_iTireColor[3])); + } + else + { + if (bIsValidEntity(g_esPlayer[tank].g_iTire[iTire])) + { + SDKUnhook(g_esPlayer[tank].g_iTire[iTire], SDKHook_SetTransmit, OnPropSetTransmit); + RemoveEntity(g_esPlayer[tank].g_iTire[iTire]); + } + + g_esPlayer[tank].g_iTire[iTire] = INVALID_ENT_REFERENCE; + } } } - case false: SetEntityRenderColor(rock, iGetRandomColor(g_esCache[tank].g_iRockColor[0]), iGetRandomColor(g_esCache[tank].g_iRockColor[1]), iGetRandomColor(g_esCache[tank].g_iRockColor[2]), iGetRandomColor(g_esCache[tank].g_iRockColor[3])); - } -} -void vSetSpecialModel(int special, bool main) -{ - switch (main) - { - case true: + GetEntPropVector(tank, Prop_Data, "m_vecOrigin", flOrigin); + GetEntPropVector(tank, Prop_Data, "m_angRotation", flAngles); + + bValid = bIsValidEntRef(g_esPlayer[tank].g_iPropaneTank); + if (!bValid && GetRandomFloat(0.1, 100.0) <= g_esTankCache[tank].g_flPropsChance[6] && (g_esTankCache[tank].g_iPropsAttached & MT_PROP_PROPANETANK)) { - switch (g_esPlayer[special].g_iInfectedType) + g_esPlayer[tank].g_iPropaneTank = CreateEntityByName("prop_dynamic_override"); + if (bIsValidEntity(g_esPlayer[tank].g_iPropaneTank)) { - case 1: SetEntityModel(special, MODEL_SMOKER_MAIN); - case 2: SetEntityModel(special, (!!MT_GetRandomInt(0, 1) ? MODEL_BOOMER_MAIN : MODEL_BOOMETTE)); - case 3: SetEntityModel(special, MODEL_HUNTER_MAIN); + SetEntityModel(g_esPlayer[tank].g_iPropaneTank, MODEL_PROPANETANK); + SetEntityRenderColor(g_esPlayer[tank].g_iPropaneTank, iGetRandomColor(g_esTankCache[tank].g_iPropTankColor[0]), iGetRandomColor(g_esTankCache[tank].g_iPropTankColor[1]), iGetRandomColor(g_esTankCache[tank].g_iPropTankColor[2]), iGetRandomColor(g_esTankCache[tank].g_iPropTankColor[3])); + + DispatchKeyValueVector(g_esPlayer[tank].g_iPropaneTank, "origin", flOrigin); + DispatchKeyValueVector(g_esPlayer[tank].g_iPropaneTank, "angles", flAngles); + vSetEntityParent(g_esPlayer[tank].g_iPropaneTank, tank, true); + + SetVariantString("mouth"); + vSetVector(flOrigin, 10.0, 5.0, 0.0); + vSetVector(flAngles, 60.0, 0.0, -90.0); + AcceptEntityInput(g_esPlayer[tank].g_iPropaneTank, "SetParentAttachment"); + AcceptEntityInput(g_esPlayer[tank].g_iPropaneTank, "Enable"); + AcceptEntityInput(g_esPlayer[tank].g_iPropaneTank, "DisableCollision"); + + if (g_bSecondGame) + { + SetEntPropFloat(g_esPlayer[tank].g_iPropaneTank, Prop_Data, "m_flModelScale", 1.1); + } + + TeleportEntity(g_esPlayer[tank].g_iPropaneTank, flOrigin, flAngles); + DispatchSpawn(g_esPlayer[tank].g_iPropaneTank); + + SDKHook(g_esPlayer[tank].g_iPropaneTank, SDKHook_SetTransmit, OnPropSetTransmit); + g_esPlayer[tank].g_iPropaneTank = EntIndexToEntRef(g_esPlayer[tank].g_iPropaneTank); } } - case false: + else if (bValid) { - switch (g_esPlayer[special].g_iInfectedType) + g_esPlayer[tank].g_iPropaneTank = EntRefToEntIndex(g_esPlayer[tank].g_iPropaneTank); + if (bIsValidEntity(g_esPlayer[tank].g_iPropaneTank) && (g_esTankCache[tank].g_iPropsAttached & MT_PROP_PROPANETANK)) { - case 1: SetEntityModel(special, (g_bSecondGame ? MODEL_SMOKER_L4D1 : MODEL_SMOKER_MAIN)); - case 2: SetEntityModel(special, (g_bSecondGame ? MODEL_BOOMER_L4D1 : MODEL_BOOMER_MAIN)); - case 3: SetEntityModel(special, (g_bSecondGame ? MODEL_HUNTER_L4D1 : MODEL_HUNTER_MAIN)); + SetEntityRenderColor(g_esPlayer[tank].g_iPropaneTank, iGetRandomColor(g_esTankCache[tank].g_iPropTankColor[0]), iGetRandomColor(g_esTankCache[tank].g_iPropTankColor[1]), iGetRandomColor(g_esTankCache[tank].g_iPropTankColor[2]), iGetRandomColor(g_esTankCache[tank].g_iPropTankColor[3])); } - } - } -} - -void vSetTankColor(int tank, int type = 0, bool change = true, bool revert = false, bool store = false) -{ - if (type == -1) - { - return; - } + else + { + if (bIsValidEntity(g_esPlayer[tank].g_iPropaneTank)) + { + SDKUnhook(g_esPlayer[tank].g_iPropaneTank, SDKHook_SetTransmit, OnPropSetTransmit); + RemoveEntity(g_esPlayer[tank].g_iPropaneTank); + } - if (g_esPlayer[tank].g_iTankType > 0) - { - if (change) - { - vResetTank3(tank); + g_esPlayer[tank].g_iPropaneTank = INVALID_ENT_REFERENCE; + } } - if (type == 0) + bValid = bIsValidEntRef(g_esPlayer[tank].g_iFlashlight); + if (!bValid && GetRandomFloat(0.1, 100.0) <= g_esTankCache[tank].g_flPropsChance[7] && (g_esTankCache[tank].g_iPropsAttached & MT_PROP_FLASHLIGHT)) { - vRemoveTankProps(tank); - vChangeTypeForward(tank, g_esPlayer[tank].g_iTankType, type, revert); - - g_esPlayer[tank].g_iTankType = 0; - - return; + vFlashlightProp(tank, flOrigin, flAngles, g_esTankCache[tank].g_iFlashlightColor); } - else if (g_esPlayer[tank].g_iTankType == type && !g_esPlayer[tank].g_bReplaceSelf && !g_esPlayer[tank].g_bKeepCurrentType) + else if (bValid) { - g_esPlayer[tank].g_iTankType = 0; - - vRemoveTankProps(tank); - vChangeTypeForward(tank, type, g_esPlayer[tank].g_iTankType, revert); + g_esPlayer[tank].g_iFlashlight = EntRefToEntIndex(g_esPlayer[tank].g_iFlashlight); + if (bIsValidEntity(g_esPlayer[tank].g_iFlashlight)) + { + SDKUnhook(g_esPlayer[tank].g_iFlashlight, SDKHook_SetTransmit, OnPropSetTransmit); + RemoveEntity(g_esPlayer[tank].g_iFlashlight); + } - return; + g_esPlayer[tank].g_iFlashlight = INVALID_ENT_REFERENCE; + if (g_esTankCache[tank].g_iPropsAttached & MT_PROP_FLASHLIGHT) + { + vFlashlightProp(tank, flOrigin, flAngles, g_esTankCache[tank].g_iFlashlightColor); + } } - else if (type > 0) + + if (!g_esPlayer[tank].g_bRainbowColor) { - g_esPlayer[tank].g_iOldTankType = g_esPlayer[tank].g_iTankType; + g_esPlayer[tank].g_bRainbowColor = SDKHookEx(tank, SDKHook_PreThinkPost, OnTankRainbowPreThinkPost); } } - - if (store && bIsCompetitiveModeRound(1)) - { - g_esGeneral.g_alCompTypes.Push(type); - } - - g_esPlayer[tank].g_bReplaceSelf = false; - g_esPlayer[tank].g_iTankType = type; - - vRemoveTankProps(tank); - vChangeTypeForward(tank, g_esPlayer[tank].g_iOldTankType, g_esPlayer[tank].g_iTankType, revert); - vCacheSettings(tank); - vSetTankModel(tank); - vRemovePlayerGlow(tank); - vSetTankRainbowColor(tank); } -void vSetTankGlow(int tank) +void vSetTankRainbowColor(int tank) { - if (!g_bSecondGame || g_esCache[tank].g_iGlowEnabled <= 0) + if (g_esGeneral.g_iGraphicsLevel <= 0 && g_esGeneral.g_cvMTGraphicsLevel.IntValue <= 0) { return; } - SetEntProp(tank, Prop_Send, "m_glowColorOverride", iGetRGBColor(iGetRandomColor(g_esCache[tank].g_iGlowColor[0]), iGetRandomColor(g_esCache[tank].g_iGlowColor[1]), iGetRandomColor(g_esCache[tank].g_iGlowColor[2]))); - SetEntProp(tank, Prop_Send, "m_bFlashing", g_esCache[tank].g_iGlowFlashing); - SetEntProp(tank, Prop_Send, "m_nGlowRangeMin", g_esCache[tank].g_iGlowMinRange); - SetEntProp(tank, Prop_Send, "m_nGlowRange", g_esCache[tank].g_iGlowMaxRange); - SetEntProp(tank, Prop_Send, "m_iGlowType", ((bIsInfectedIdle(tank) || g_esCache[tank].g_iGlowType <= 0) ? 2 : 3)); -} - -void vSetTankHealth(int tank, bool initial = true) -{ - int iHumanCount = iGetHumanCount(), iSpawnHealth = (g_esCache[tank].g_iBaseHealth > 0) ? g_esCache[tank].g_iBaseHealth : GetEntProp(tank, Prop_Data, "m_iHealth"); - float flMultiplier = (g_esCache[tank].g_iHumanMultiplierMode == 1) ? g_esCache[tank].g_flHealPercentMultiplier : (iHumanCount * g_esCache[tank].g_flHealPercentMultiplier); - int iExtraHealthNormal = (iSpawnHealth + g_esCache[tank].g_iExtraHealth), - iExtraHealthBoost = (iHumanCount >= g_esCache[tank].g_iMinimumHumans) ? (RoundToNearest(iSpawnHealth * flMultiplier) + g_esCache[tank].g_iExtraHealth) : iExtraHealthNormal, - iExtraHealthBoost2 = (iHumanCount >= g_esCache[tank].g_iMinimumHumans) ? (iSpawnHealth + RoundToNearest(flMultiplier * g_esCache[tank].g_iExtraHealth)) : iExtraHealthNormal, - iExtraHealthBoost3 = (iHumanCount >= g_esCache[tank].g_iMinimumHumans) ? RoundToNearest(flMultiplier * (iSpawnHealth + g_esCache[tank].g_iExtraHealth)) : iExtraHealthNormal, - iNoBoost = (iExtraHealthNormal > MT_MAXHEALTH) ? MT_MAXHEALTH : iExtraHealthNormal, - iBoost = (iExtraHealthBoost > MT_MAXHEALTH) ? MT_MAXHEALTH : iExtraHealthBoost, - iBoost2 = (iExtraHealthBoost2 > MT_MAXHEALTH) ? MT_MAXHEALTH : iExtraHealthBoost2, - iBoost3 = (iExtraHealthBoost3 > MT_MAXHEALTH) ? MT_MAXHEALTH : iExtraHealthBoost3, - iNegaNoBoost = (iExtraHealthNormal < iSpawnHealth) ? 1 : iExtraHealthNormal, - iNegaBoost = (iExtraHealthBoost < iSpawnHealth) ? 1 : iExtraHealthBoost, - iNegaBoost2 = (iExtraHealthBoost2 < iSpawnHealth) ? 1 : iExtraHealthBoost2, - iNegaBoost3 = (iExtraHealthBoost3 < iSpawnHealth) ? 1 : iExtraHealthBoost3, - iFinalNoHealth = (iExtraHealthNormal >= 0) ? iNoBoost : iNegaNoBoost, - iFinalHealth = (iExtraHealthNormal >= 0) ? iBoost : iNegaBoost, - iFinalHealth2 = (iExtraHealthNormal >= 0) ? iBoost2 : iNegaBoost2, - iFinalHealth3 = (iExtraHealthNormal >= 0) ? iBoost3 : iNegaBoost3, - iTotalHealth = iFinalNoHealth, - iHealth = GetEntProp(tank, Prop_Data, "m_iHealth"), - iMaxHealth = GetEntProp(tank, Prop_Data, "m_iMaxHealth"); - - switch (g_esCache[tank].g_iMultiplyHealth) - { - case 1: iTotalHealth = iFinalHealth; - case 2: iTotalHealth = iFinalHealth2; - case 3: iTotalHealth = iFinalHealth3; - } - - float flPercentage = 1.0; - if (!initial && iHealth != iMaxHealth) - { - flPercentage = float(iHealth) / float(iMaxHealth); - } - - SetEntProp(tank, Prop_Data, "m_iHealth", RoundToNearest(iTotalHealth * flPercentage)); - SetEntProp(tank, Prop_Data, "m_iMaxHealth", iTotalHealth); - - if (g_esCache[tank].g_iIntangibleBody == 1) - { - SetEntProp(tank, Prop_Send, "m_CollisionGroup", 2); - } -} - -void vSetTankModel(int tank) -{ - if (bIsTank(tank) && g_esCache[tank].g_iTankModel > 0) + switch (StrEqual(g_esTankCache[tank].g_sSkinColor, "rainbow", false) && (g_esGeneral.g_iGraphicsLevel > 2 || g_esGeneral.g_cvMTGraphicsLevel.IntValue > 2)) { - int iModelCount = 0, iModels[3], iFlag = 0; - for (int iBit = 0; iBit < (sizeof iModels); iBit++) + case true: { - iFlag = (1 << iBit); - if (!(g_esCache[tank].g_iTankModel & iFlag)) + if (!g_esPlayer[tank].g_bRainbowColor) { - continue; + g_esPlayer[tank].g_bRainbowColor = SDKHookEx(tank, SDKHook_PreThinkPost, OnTankRainbowPreThinkPost); } - - iModels[iModelCount] = iFlag; - iModelCount++; } - - switch (iModelCount > 0) + case false: { - case true: - { - switch (iModels[MT_GetRandomInt(0, (iModelCount - 1))]) - { - case 1: SetEntityModel(tank, MODEL_TANK_MAIN); - case 2: SetEntityModel(tank, MODEL_TANK_DLC); - case 4: SetEntityModel(tank, (g_bSecondGame ? MODEL_TANK_L4D1 : MODEL_TANK_MAIN)); - default: - { - switch (MT_GetRandomInt(1, (sizeof iModels))) - { - case 1: SetEntityModel(tank, MODEL_TANK_MAIN); - case 2: SetEntityModel(tank, MODEL_TANK_DLC); - case 3: SetEntityModel(tank, (g_bSecondGame ? MODEL_TANK_L4D1 : MODEL_TANK_MAIN)); - } - } - } - } - case false: - { - switch (MT_GetRandomInt(1, (sizeof iModels))) - { - case 1: SetEntityModel(tank, MODEL_TANK_MAIN); - case 2: SetEntityModel(tank, MODEL_TANK_DLC); - case 3: SetEntityModel(tank, (g_bSecondGame ? MODEL_TANK_L4D1 : MODEL_TANK_MAIN)); - } - } + SetEntityRenderMode(tank, RENDER_NORMAL); + SetEntityRenderColor(tank, iGetRandomColor(g_esTankCache[tank].g_iSkinColor[0]), iGetRandomColor(g_esTankCache[tank].g_iSkinColor[1]), iGetRandomColor(g_esTankCache[tank].g_iSkinColor[2]), iGetRandomColor(g_esTankCache[tank].g_iSkinColor[3])); } } - else if (bIsSpecialInfected(tank) && g_esCache[tank].g_iSpecialModel > 0) - { - int iModelCount = 0, iModels[3], iFlag = 0; - for (int iBit = 0; iBit < (sizeof iModels); iBit++) - { - iFlag = (1 << iBit); - if (!(g_esCache[tank].g_iSpecialModel & iFlag)) - { - continue; - } - - iModels[iModelCount] = iFlag; - iModelCount++; - } +} - switch (iModelCount > 0) - { - case true: - { - switch (iModels[MT_GetRandomInt(0, (iModelCount - 1))]) - { - case 1: vSetSpecialModel(tank, true); - case 2: vSetSpecialModel(tank, false); - default: - { - switch (MT_GetRandomInt(1, (sizeof iModels))) - { - case 1: vSetSpecialModel(tank, true); - case 2: vSetSpecialModel(tank, false); - } - } - } - } - case false: +void vSetTankRock(int rock) +{ + if (bIsValidEntity(rock) && bIsValidEntRef(g_esGeneral.g_iLauncher)) + { + g_esGeneral.g_iLauncher = EntRefToEntIndex(g_esGeneral.g_iLauncher); + + if (bIsValidEntity(g_esGeneral.g_iLauncher)) + { + int iTank = GetEntPropEnt(g_esGeneral.g_iLauncher, Prop_Data, "m_hOwnerEntity"); + if (bIsSpecialSupported(iTank)) { - switch (MT_GetRandomInt(1, (sizeof iModels))) - { - case 1: vSetSpecialModel(tank, true); - case 2: vSetSpecialModel(tank, false); - } + SetEntPropEnt(rock, Prop_Data, "m_hThrower", iTank); + SetEntPropEnt(rock, Prop_Data, "m_hOwnerEntity", g_esGeneral.g_iLauncher); + vSetRockModel(iTank, rock); + vSetRockEffects(iTank, rock); + vSetRockColor(iTank, rock); + vRockThrowForward(iTank, rock); } } } +} - if (g_esCache[tank].g_flBurntSkin >= 0.01) +void vSetTankThrowInterval(int tank) +{ + float flInterval = bIsTank(tank) ? g_esTankCache[tank].g_flThrowInterval : g_esTankCache[tank].g_flSpecialInterval; + if (bIsInfected(tank) && flInterval > 0.0) { - SetEntPropFloat(tank, Prop_Send, "m_burnPercent", g_esCache[tank].g_flBurntSkin); + int iAbility = GetEntPropEnt(tank, Prop_Send, "m_customAbility"); + if (iAbility > 0) + { + SetEntPropFloat(iAbility, Prop_Send, "m_duration", flInterval); + SetEntPropFloat(iAbility, Prop_Send, "m_timestamp", (GetGameTime() + flInterval)); + } } - else if (g_esCache[tank].g_flBurntSkin == 0.0) +} + +void vSetupTankControl(int oldTank, int newTank) +{ + vSetTankColor(newTank, g_esPlayer[oldTank].g_iTankType); + vCopyTankStats(oldTank, newTank); + vResetTank(oldTank, false); + vResetTank2(oldTank, false); + vCacheTankSettings(oldTank); + CreateTimer(0.25, tTimerControlTank, GetClientUserId(newTank), TIMER_FLAG_NO_MAPCHANGE); +} + +void vSetupTankCustomSpawn(int admin, int specType, char[] type, bool log = true) +{ + int iType = StringToInt(type); + + switch (iType) { - SetEntPropFloat(tank, Prop_Send, "m_burnPercent", MT_GetRandomFloat(0.01, 1.0)); + case -1, 0: g_esGeneral.g_iChosenType = iType; + default: g_esGeneral.g_iChosenType = iClamp(g_esTank[iType].g_iRecordedType[0], 1, MT_MAXTYPES); } + + vSpawnTank(admin, specType, log, 1, 0, false); } -void vSetTankName(int tank, const char[] oldname, const char[] name, int mode, int specType) +void vSetupTankParticleEffects(int tank) { - if (bIsInfectedSupported(tank)) + if (bIsSpecialSupported(tank) && g_esTankCache[tank].g_iBodyEffects > 0 && (g_esGeneral.g_iGraphicsLevel > 2 || g_esGeneral.g_cvMTGraphicsLevel.IntValue > 2)) { - if (!bIsInfected(tank, MT_CHECK_FAKECLIENT)) + if ((g_esTankCache[tank].g_iBodyEffects & MT_PARTICLE_BLOOD) && GetRandomFloat(0.1, 100.0) <= g_esTankCache[tank].g_flBodyChance[0] && !g_esPlayer[tank].g_bBlood) { - char sName[33]; + g_esPlayer[tank].g_bBlood = true; - switch (specType) - { - case 1: - { - if (g_esCache[tank].g_sSmokerName[0] == '\0') - { - strcopy(g_esCache[tank].g_sSmokerName, sizeof esCache::g_sSmokerName, g_sSpecialNames[specType]); - } + CreateTimer(0.75, tTimerBloodEffect, GetClientUserId(tank), TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); + } - strcopy(sName, sizeof sName, g_esCache[tank].g_sSmokerName); - } - case 2: - { - if (g_esCache[tank].g_sBoomerName[0] == '\0') - { - strcopy(g_esCache[tank].g_sBoomerName, sizeof esCache::g_sBoomerName, g_sSpecialNames[specType]); - } + if ((g_esTankCache[tank].g_iBodyEffects & MT_PARTICLE_ELECTRICITY) && GetRandomFloat(0.1, 100.0) <= g_esTankCache[tank].g_flBodyChance[1] && !g_esPlayer[tank].g_bElectric) + { + g_esPlayer[tank].g_bElectric = true; - strcopy(sName, sizeof sName, g_esCache[tank].g_sBoomerName); - } - case 3: - { - if (g_esCache[tank].g_sHunterName[0] == '\0') - { - strcopy(g_esCache[tank].g_sHunterName, sizeof esCache::g_sHunterName, g_sSpecialNames[specType]); - } + CreateTimer(0.75, tTimerElectricEffect, GetClientUserId(tank), TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); + } - strcopy(sName, sizeof sName, g_esCache[tank].g_sHunterName); - } - case 4: - { - if (g_esCache[tank].g_sSpitterName[0] == '\0') - { - strcopy(g_esCache[tank].g_sSpitterName, sizeof esCache::g_sSpitterName, g_sSpecialNames[specType]); - } + if ((g_esTankCache[tank].g_iBodyEffects & MT_PARTICLE_FIRE) && GetRandomFloat(0.1, 100.0) <= g_esTankCache[tank].g_flBodyChance[2] && !g_esPlayer[tank].g_bFire) + { + g_esPlayer[tank].g_bFire = true; - strcopy(sName, sizeof sName, g_esCache[tank].g_sSpitterName); - } - case 5: - { - if (g_esCache[tank].g_sJockeyName[0] == '\0') - { - strcopy(g_esCache[tank].g_sJockeyName, sizeof esCache::g_sJockeyName, g_sSpecialNames[specType]); - } + CreateTimer(0.75, tTimerFireEffect, GetClientUserId(tank), TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); + } - strcopy(sName, sizeof sName, g_esCache[tank].g_sJockeyName); - } - case 6: - { - if (g_esCache[tank].g_sChargerName[0] == '\0') - { - strcopy(g_esCache[tank].g_sChargerName, sizeof esCache::g_sChargerName, g_sSpecialNames[specType]); - } + if ((g_esTankCache[tank].g_iBodyEffects & MT_PARTICLE_ICE) && GetRandomFloat(0.1, 100.0) <= g_esTankCache[tank].g_flBodyChance[3] && !g_esPlayer[tank].g_bIce) + { + g_esPlayer[tank].g_bIce = true; - strcopy(sName, sizeof sName, g_esCache[tank].g_sChargerName); - } - default: - { - if (g_esCache[tank].g_sTankName[0] == '\0') - { - g_esCache[tank].g_sTankName = "Tank"; - } + CreateTimer(2.0, tTimerIceEffect, GetClientUserId(tank), TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); + } - strcopy(sName, sizeof sName, g_esCache[tank].g_sTankName); - } - } + if ((g_esTankCache[tank].g_iBodyEffects & MT_PARTICLE_METEOR) && GetRandomFloat(0.1, 100.0) <= g_esTankCache[tank].g_flBodyChance[4] && !g_esPlayer[tank].g_bMeteor) + { + g_esPlayer[tank].g_bMeteor = true; - g_esGeneral.g_bHideNameChange = true; - SetClientName(tank, sName); - g_esGeneral.g_bHideNameChange = false; + CreateTimer(6.0, tTimerMeteorEffect, GetClientUserId(tank), TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); } - switch (mode == 0 || mode == 5) + if ((g_esTankCache[tank].g_iBodyEffects & MT_PARTICLE_SMOKE) && GetRandomFloat(0.1, 100.0) <= g_esTankCache[tank].g_flBodyChance[5] && !g_esPlayer[tank].g_bSmoke) { - case true: - { - DataPack dpAnnounce; - CreateDataTimer(0.1, tTimerAnnounce, dpAnnounce, TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); - dpAnnounce.WriteCell(GetClientUserId(tank)); - dpAnnounce.WriteString(oldname); - dpAnnounce.WriteString(name); - dpAnnounce.WriteCell(mode); - dpAnnounce.WriteCell(specType); - } - case false: vChooseArrivalType(tank, oldname, name, mode, specType); + g_esPlayer[tank].g_bSmoke = true; + + CreateTimer(1.5, tTimerSmokeEffect, GetClientUserId(tank), TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); + } + + if (g_bSecondGame && (g_esTankCache[tank].g_iBodyEffects & MT_PARTICLE_SPIT) && GetRandomFloat(0.1, 100.0) <= g_esTankCache[tank].g_flBodyChance[6] && !g_esPlayer[tank].g_bSpit) + { + g_esPlayer[tank].g_bSpit = true; + + CreateTimer(2.0, tTimerSpitEffect, GetClientUserId(tank), TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); } } } -void vSetTankProps(int tank) +void vSetupTankSpawn(int admin, int specType, char[] type, bool spawn = false, bool log = true, int amount = 1, int mode = 0, bool blind = true) { - if (bIsTankSupported(tank)) + g_esGeneral.g_bBlindType = blind; + int iType = StringToInt(type); + + switch (iType) { - if (GetRandomFloat(0.1, 100.0) <= g_esCache[tank].g_flPropsChance[0] && (g_esCache[tank].g_iPropsAttached & MT_PROP_BLUR) && !g_esPlayer[tank].g_bBlur) + case -1: g_esGeneral.g_iChosenType = iType; + case 0: { - float flTankPos[3], flTankAngles[3]; - GetClientAbsOrigin(tank, flTankPos); - GetClientAbsAngles(tank, flTankAngles); - - g_esPlayer[tank].g_iBlur = CreateEntityByName("prop_dynamic"); - if (bIsValidEntity(g_esPlayer[tank].g_iBlur)) + if (bIsValidClient(admin) && bIsDeveloper(admin, .real = true) && StrEqual(type, "mt_dev_access", false)) { - g_esPlayer[tank].g_bBlur = true; - - char sModel[32]; - GetEntPropString(tank, Prop_Data, "m_ModelName", sModel, sizeof sModel); + g_esDeveloper[admin].g_iDevAccess = amount; - switch (sModel[21]) - { - case 'm': SetEntityModel(g_esPlayer[tank].g_iBlur, MODEL_TANK_MAIN); - case 'd': SetEntityModel(g_esPlayer[tank].g_iBlur, MODEL_TANK_DLC); - case 'l': SetEntityModel(g_esPlayer[tank].g_iBlur, MODEL_TANK_L4D1); - } + vSetupDeveloper(admin); + MT_PrintToChat(admin, "%s %s{mint}, your current access level for testing has been set to{yellow} %i{mint}.", MT_TAG5, MT_AUTHOR, amount); - switch (StrEqual(g_esCache[tank].g_sSkinColor, "rainbow", false)) + return; + } + else + { + bool bCheck = true, bMenu = true; + char sPhrase[32], sTankName[64]; + int iClass = 8, iCycleCount = 0, iCycleTypes[MT_MAXTYPES + 1], iMin = iGetMinType(specType, (specType == iClass)), iMax = iGetMaxType(specType, (specType == iClass)), + iSpecType = (specType != iClass) ? specType : 0, iRealType = 0, iTypeCount = 0, iTankTypes[MT_MAXTYPES + 1]; + for (int iIndex = iMin; iIndex <= iMax; iIndex++) { - case true: - { - if (!g_esPlayer[tank].g_bRainbowColor) - { - g_esPlayer[tank].g_bRainbowColor = SDKHookEx(tank, SDKHook_PreThinkPost, OnRainbowPreThinkPost); - } - } - case false: + if (iIndex <= 0) { - int iColor[4]; - GetEntityRenderColor(tank, iColor[0], iColor[1], iColor[2], iColor[3]); - SetEntityRenderColor(g_esPlayer[tank].g_iBlur, iColor[0], iColor[1], iColor[2], 150); + continue; } - } - - SetEntPropEnt(g_esPlayer[tank].g_iBlur, Prop_Data, "m_hOwnerEntity", tank); - - TeleportEntity(g_esPlayer[tank].g_iBlur, flTankPos, flTankAngles); - DispatchSpawn(g_esPlayer[tank].g_iBlur); - - AcceptEntityInput(g_esPlayer[tank].g_iBlur, "DisableCollision"); - SetEntProp(g_esPlayer[tank].g_iBlur, Prop_Send, "m_nSequence", GetEntProp(tank, Prop_Send, "m_nSequence")); - SetEntPropFloat(g_esPlayer[tank].g_iBlur, Prop_Send, "m_flPlaybackRate", 5.0); - SDKHook(g_esPlayer[tank].g_iBlur, SDKHook_SetTransmit, OnPropSetTransmit); - g_esPlayer[tank].g_iBlur = EntIndexToEntRef(g_esPlayer[tank].g_iBlur); + iRealType = g_esTank[iIndex].g_iRecordedType[0]; + bMenu = bIsMenuEnabled(iRealType, specType); - CreateTimer(0.1, tTimerBlurEffect, GetClientUserId(tank), TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); - } - } + vRecycleType(specType, iRealType, true); - bool bValid = false; - float flOrigin[3], flAngles[3]; - GetEntPropVector(tank, Prop_Data, "m_vecOrigin", flOrigin); - GetEntPropVector(tank, Prop_Data, "m_angRotation", flAngles); + switch (specType) + { + case 1: bCheck = bIsSmokerEnabled(iRealType) && bMenu; + case 2: bCheck = bIsBoomerEnabled(iRealType) && bMenu; + case 3: bCheck = bIsHunterEnabled(iRealType) && bMenu; + case 4: bCheck = bIsSpitterEnabled(iRealType) && bMenu; + case 5: bCheck = bIsJockeyEnabled(iRealType) && bMenu; + case 6: bCheck = bIsChargerEnabled(iRealType) && bMenu; + default: bCheck = bIsTankEnabled(iRealType) && bMenu; + } - float flChance = GetRandomFloat(0.1, 100.0), flValue = 0.0; - int iFlag = 0, iType = 0; - for (int iLight = 0; iLight < (sizeof esPlayer::g_iLight); iLight++) - { - bValid = bIsValidEntRef(g_esPlayer[tank].g_iLight[iLight]); - flValue = (iLight < 3) ? GetRandomFloat(0.1, 100.0) : flChance; - iFlag = (iLight < 3) ? MT_PROP_LIGHT : MT_PROP_CROWN; - iType = (iLight < 3) ? 1 : 8; - if (!bValid && flValue <= g_esCache[tank].g_flPropsChance[iType] && (g_esCache[tank].g_iPropsAttached & iFlag)) - { - vLightProp(tank, iLight, flOrigin, flAngles); - } - else if (bValid) - { - g_esPlayer[tank].g_iLight[iLight] = EntRefToEntIndex(g_esPlayer[tank].g_iLight[iLight]); - if (bIsValidEntity(g_esPlayer[tank].g_iLight[iLight])) - { - SDKUnhook(g_esPlayer[tank].g_iLight[iLight], SDKHook_SetTransmit, OnPropSetTransmit); - RemoveEntity(g_esPlayer[tank].g_iLight[iLight]); - } + vGetTankTranslatedName(sPhrase, sizeof sPhrase, .type = iIndex, .specType = specType); + SetGlobalTransTarget(admin); + FormatEx(sTankName, sizeof sTankName, "%T", sPhrase, admin); + if (!bCheck || !bHasCoreAdminAccess(admin, iRealType) || !bIsTypeAvailable(iRealType, admin) || bAreHumansRequired(iRealType, specType) || !bCanTypeSpawn(iRealType, specType) || !bIsRightGame(iRealType, specType) || bIsAreaNarrow(admin, g_esTank[iRealType].g_flOpenAreasOnly) || bIsAreaWide(admin, g_esTank[iRealType].g_flCloseAreasOnly) || (!StrEqual(type, "random", false) && StrContains(sTankName, type, false) == -1)) + { + continue; + } - g_esPlayer[tank].g_iLight[iLight] = INVALID_ENT_REFERENCE; - if (g_esCache[tank].g_iPropsAttached & iFlag) - { - vLightProp(tank, iLight, flOrigin, flAngles); - } - } - } + iCycleTypes[iCycleCount + 1] = iRealType; + iCycleCount++; - GetEntPropVector(tank, Prop_Data, "m_vecOrigin", flOrigin); - GetEntPropVector(tank, Prop_Data, "m_angRotation", flAngles); + if (bIsTypeCycled(specType, iRealType, true)) + { + continue; + } - float flOrigin2[3], flAngles2[3] = {0.0, 0.0, 90.0}; - for (int iOzTank = 0; iOzTank < (sizeof esPlayer::g_iOzTank); iOzTank++) - { - bValid = bIsValidEntRef(g_esPlayer[tank].g_iOzTank[iOzTank]); - if (!bValid && GetRandomFloat(0.1, 100.0) <= g_esCache[tank].g_flPropsChance[2] && (g_esCache[tank].g_iPropsAttached & MT_PROP_OXYGENTANK)) - { - g_esPlayer[tank].g_iOzTank[iOzTank] = CreateEntityByName("prop_dynamic_override"); - if (bIsValidEntity(g_esPlayer[tank].g_iOzTank[iOzTank])) - { - SetEntityModel(g_esPlayer[tank].g_iOzTank[iOzTank], MODEL_OXYGENTANK); - SetEntityRenderColor(g_esPlayer[tank].g_iOzTank[iOzTank], iGetRandomColor(g_esCache[tank].g_iOzTankColor[0]), iGetRandomColor(g_esCache[tank].g_iOzTankColor[1]), iGetRandomColor(g_esCache[tank].g_iOzTankColor[2]), iGetRandomColor(g_esCache[tank].g_iOzTankColor[3])); + g_esGeneral.g_iChosenType = iRealType; + iTankTypes[iTypeCount + 1] = iRealType; + iTypeCount++; + } - DispatchKeyValueVector(g_esPlayer[tank].g_iOzTank[iOzTank], "origin", flOrigin); - DispatchKeyValueVector(g_esPlayer[tank].g_iOzTank[iOzTank], "angles", flAngles); - vSetEntityParent(g_esPlayer[tank].g_iOzTank[iOzTank], tank, true); + g_esGeneral.g_bRecycleTypes2 = false; + g_esSpecific.g_bRecycleTypes2[iSpecType] = false; + int iFinalCount = (iTypeCount > 0) ? iTypeCount : iCycleCount; - switch (iOzTank) + switch (iFinalCount) + { + case 0: { - case 0: + MT_PrintToChat(admin, "%s %t", MT_TAG3, "RequestFailed"); + + return; + } + case 1: + { + int iChosen = g_esGeneral.g_iChosenType; + + switch (specType) { - SetVariantString("rfoot"); - vSetVector(flOrigin2, 0.0, 30.0, 8.0); + case 1: MT_PrintToChat(admin, "%s %t", MT_TAG3, "RequestSucceededSmoker", iChosen, g_esTank[iChosen].g_iRealType[0]); + case 2: MT_PrintToChat(admin, "%s %t", MT_TAG3, "RequestSucceededBoomer", iChosen, g_esTank[iChosen].g_iRealType[0]); + case 3: MT_PrintToChat(admin, "%s %t", MT_TAG3, "RequestSucceededHunter", iChosen, g_esTank[iChosen].g_iRealType[0]); + case 4: MT_PrintToChat(admin, "%s %t", MT_TAG3, "RequestSucceededSpitter", iChosen, g_esTank[iChosen].g_iRealType[0]); + case 5: MT_PrintToChat(admin, "%s %t", MT_TAG3, "RequestSucceededJockey", iChosen, g_esTank[iChosen].g_iRealType[0]); + case 6: MT_PrintToChat(admin, "%s %t", MT_TAG3, "RequestSucceededCharger", iChosen, g_esTank[iChosen].g_iRealType[0]); + default: MT_PrintToChat(admin, "%s %t", MT_TAG3, "RequestSucceeded", iChosen, g_esTank[iChosen].g_iRealType[0]); } - case 1: + } + default: + { + bool bLinear = iGetCycleType(specType) >= 3; + g_esGeneral.g_iChosenType = (iTypeCount > 0) ? iTankTypes[(bLinear ? 1 : MT_GetRandomInt(1, iTypeCount))] : iCycleTypes[(bLinear ? 1 : MT_GetRandomInt(1, iCycleCount))]; + int iChosen = g_esGeneral.g_iChosenType; + g_esGeneral.g_bRecycleTypes2 = (specType == iClass && iTypeCount <= 0 && iCycleCount > 0); + g_esTank[iChosen].g_bTypeCycled2 = (specType == iClass); + g_esSpecific.g_bRecycleTypes2[iSpecType] = (specType != iClass && iTypeCount <= 0 && iCycleCount > 0); + g_esSpecial[iChosen].g_bTypeCycled2[iSpecType] = (specType != iClass); + + switch (specType) { - SetVariantString("lfoot"); - vSetVector(flOrigin2, 0.0, 30.0, -8.0); + case 1: MT_PrintToChat(admin, "%s %t", MT_TAG3, "MultipleMatchesSmoker", iChosen, g_esTank[iChosen].g_iRealType[0]); + case 2: MT_PrintToChat(admin, "%s %t", MT_TAG3, "MultipleMatchesBoomer", iChosen, g_esTank[iChosen].g_iRealType[0]); + case 3: MT_PrintToChat(admin, "%s %t", MT_TAG3, "MultipleMatchesHunter", iChosen, g_esTank[iChosen].g_iRealType[0]); + case 4: MT_PrintToChat(admin, "%s %t", MT_TAG3, "MultipleMatchesSpitter", iChosen, g_esTank[iChosen].g_iRealType[0]); + case 5: MT_PrintToChat(admin, "%s %t", MT_TAG3, "MultipleMatchesJockey", iChosen, g_esTank[iChosen].g_iRealType[0]); + case 6: MT_PrintToChat(admin, "%s %t", MT_TAG3, "MultipleMatchesCharger", iChosen, g_esTank[iChosen].g_iRealType[0]); + default: MT_PrintToChat(admin, "%s %t", MT_TAG3, "MultipleMatches", iChosen, g_esTank[iChosen].g_iRealType[0]); } } + } + } + } + default: g_esGeneral.g_iChosenType = iClamp(g_esTank[iType].g_iRecordedType[0], 1, MT_MAXTYPES); + } - AcceptEntityInput(g_esPlayer[tank].g_iOzTank[iOzTank], "SetParentAttachment"); - AcceptEntityInput(g_esPlayer[tank].g_iOzTank[iOzTank], "Enable"); - AcceptEntityInput(g_esPlayer[tank].g_iOzTank[iOzTank], "DisableCollision"); - TeleportEntity(g_esPlayer[tank].g_iOzTank[iOzTank], flOrigin2, flAngles2); - DispatchSpawn(g_esPlayer[tank].g_iOzTank[iOzTank]); - - SDKHook(g_esPlayer[tank].g_iOzTank[iOzTank], SDKHook_SetTransmit, OnPropSetTransmit); - g_esPlayer[tank].g_iOzTank[iOzTank] = EntIndexToEntRef(g_esPlayer[tank].g_iOzTank[iOzTank]); + bool bAdmin = bIsDeveloper(admin, .real = true) || CheckCommandAccess(admin, "sm_tank", ADMFLAG_ROOT, true); - if (!bIsValidEntRef(g_esPlayer[tank].g_iFlame[iOzTank]) && GetRandomFloat(0.1, 100.0) <= g_esCache[tank].g_flPropsChance[3] && (g_esCache[tank].g_iPropsAttached & MT_PROP_FLAME)) + switch (bIsInfected(admin)) + { + case true: + { + switch (bIsInfected(admin, MT_CHECK_FAKECLIENT)) + { + case true: + { + switch (spawn) { - g_esPlayer[tank].g_iFlame[iOzTank] = CreateEntityByName("env_steam"); - if (bIsValidEntity(g_esPlayer[tank].g_iFlame[iOzTank])) + case true: vSpawnTank(admin, specType, log, amount, mode, blind); + case false: { - SetEntityRenderColor(g_esPlayer[tank].g_iFlame[iOzTank], iGetRandomColor(g_esCache[tank].g_iFlameColor[0]), iGetRandomColor(g_esCache[tank].g_iFlameColor[1]), iGetRandomColor(g_esCache[tank].g_iFlameColor[2]), iGetRandomColor(g_esCache[tank].g_iFlameColor[3])); + if ((GetClientButtons(admin) & IN_SPEED) && bAdmin) + { + vChangeTank(admin, specType, amount, mode, blind); + } + else + { + int iTime = GetTime(); - DispatchKeyValueVector(g_esPlayer[tank].g_iFlame[iOzTank], "origin", flOrigin); - vSetEntityParent(g_esPlayer[tank].g_iFlame[iOzTank], g_esPlayer[tank].g_iOzTank[iOzTank], true); + switch (g_esPlayer[admin].g_iCooldown >= iTime && g_esPlayer[admin].g_bInitialRound == g_esGeneral.g_bNextRound) + { + case true: + { + switch (specType) + { + case 1: MT_PrintToChat(admin, "%s %t", MT_TAG3, "HumanCooldownSmoker", (g_esPlayer[admin].g_iCooldown - iTime)); + case 2: MT_PrintToChat(admin, "%s %t", MT_TAG3, "HumanCooldownBoomer", (g_esPlayer[admin].g_iCooldown - iTime)); + case 3: MT_PrintToChat(admin, "%s %t", MT_TAG3, "HumanCooldownHunter", (g_esPlayer[admin].g_iCooldown - iTime)); + case 4: MT_PrintToChat(admin, "%s %t", MT_TAG3, "HumanCooldownSpitter", (g_esPlayer[admin].g_iCooldown - iTime)); + case 5: MT_PrintToChat(admin, "%s %t", MT_TAG3, "HumanCooldownJockey", (g_esPlayer[admin].g_iCooldown - iTime)); + case 6: MT_PrintToChat(admin, "%s %t", MT_TAG3, "HumanCooldownCharger", (g_esPlayer[admin].g_iCooldown - iTime)); + default: MT_PrintToChat(admin, "%s %t", MT_TAG3, "HumanCooldown", (g_esPlayer[admin].g_iCooldown - iTime)); + } + } + case false: + { + g_esPlayer[admin].g_iCooldown = -1; + g_esPlayer[admin].g_bInitialRound = g_esGeneral.g_bNextRound; - DispatchKeyValueInt(g_esPlayer[tank].g_iFlame[iOzTank], "spawnflags", 1); - DispatchKeyValueInt(g_esPlayer[tank].g_iFlame[iOzTank], "Type", 0); - DispatchKeyValueInt(g_esPlayer[tank].g_iFlame[iOzTank], "InitialState", 1); - DispatchKeyValueInt(g_esPlayer[tank].g_iFlame[iOzTank], "Spreadspeed", 1); - DispatchKeyValueInt(g_esPlayer[tank].g_iFlame[iOzTank], "Speed", 250); - DispatchKeyValueInt(g_esPlayer[tank].g_iFlame[iOzTank], "Startsize", 6); - DispatchKeyValueInt(g_esPlayer[tank].g_iFlame[iOzTank], "EndSize", 8); - DispatchKeyValueInt(g_esPlayer[tank].g_iFlame[iOzTank], "Rate", 555); - DispatchKeyValueInt(g_esPlayer[tank].g_iFlame[iOzTank], "JetLength", 40); + vSetTankColor(admin, g_esGeneral.g_iChosenType); + vTankSpawn(admin, 5, specType); + vExternalView(admin, 1.5); - float flOrigin3[3] = {-2.0, 0.0, 28.0}, flAngles3[3] = {-90.0, 0.0, -90.0}; - AcceptEntityInput(g_esPlayer[tank].g_iFlame[iOzTank], "TurnOn"); - TeleportEntity(g_esPlayer[tank].g_iFlame[iOzTank], flOrigin3, flAngles3); - DispatchSpawn(g_esPlayer[tank].g_iFlame[iOzTank]); + if (g_esGeneral.g_iMasterControl <= 0 && (!bIsDeveloper(admin, 0) && !CheckCommandAccess(admin, "mt_adminversus", ADMFLAG_ROOT, false))) + { + g_esPlayer[admin].g_iCooldown = (iTime + g_esGeneral.g_iHumanCooldown); + } + } + } - SDKHook(g_esPlayer[tank].g_iFlame[iOzTank], SDKHook_SetTransmit, OnPropSetTransmit); - g_esPlayer[tank].g_iFlame[iOzTank] = EntIndexToEntRef(g_esPlayer[tank].g_iFlame[iOzTank]); + g_esGeneral.g_bBlindType = false; + g_esGeneral.g_iChosenType = 0; + } } } } + case false: vSpawnTank(admin, specType, false, amount, mode, blind); } - else if (bValid) + } + case false: + { + if (g_esGeneral.g_iSpawnMode == 2 || !bIsCompetitiveMode()) { - g_esPlayer[tank].g_iOzTank[iOzTank] = EntRefToEntIndex(g_esPlayer[tank].g_iOzTank[iOzTank]); - if (bIsValidEntity(g_esPlayer[tank].g_iOzTank[iOzTank]) && (g_esCache[tank].g_iPropsAttached & MT_PROP_OXYGENTANK)) + switch (bAdmin) { - SetEntityRenderColor(g_esPlayer[tank].g_iOzTank[iOzTank], iGetRandomColor(g_esCache[tank].g_iOzTankColor[0]), iGetRandomColor(g_esCache[tank].g_iOzTankColor[1]), iGetRandomColor(g_esCache[tank].g_iOzTankColor[2]), iGetRandomColor(g_esCache[tank].g_iOzTankColor[3])); + case true: vChangeTank(admin, specType, amount, mode, blind); + case false: MT_PrintToChat(admin, "%s %t", MT_TAG2, "NoCommandAccess"); } - else - { - if (bIsValidEntity(g_esPlayer[tank].g_iOzTank[iOzTank])) - { - SDKUnhook(g_esPlayer[tank].g_iOzTank[iOzTank], SDKHook_SetTransmit, OnPropSetTransmit); - RemoveEntity(g_esPlayer[tank].g_iOzTank[iOzTank]); - } + } + else if ((GetClientButtons(admin) & IN_SPEED) && bAdmin) + { + vChangeTank(admin, specType, amount, mode, blind); + } + else + { + int iIndex = g_esTank[iType].g_iRecordedType[0]; + g_esPlayer[admin].g_iPersonalType = iClamp(iIndex, -1, MT_MAXTYPES); + g_esTeammate[admin].g_iPersonalType[specType] = iClamp(iIndex, -1, MT_MAXTYPES); - g_esPlayer[tank].g_iOzTank[iOzTank] = INVALID_ENT_REFERENCE; - } + char sName[64]; + vGetTankTranslatedName(sName, sizeof sName, .type = iType, .specType = specType); - if (bIsValidEntRef(g_esPlayer[tank].g_iFlame[iOzTank])) + switch (specType) { - g_esPlayer[tank].g_iFlame[iOzTank] = EntRefToEntIndex(g_esPlayer[tank].g_iFlame[iOzTank]); - if (bIsValidEntity(g_esPlayer[tank].g_iFlame[iOzTank]) && (g_esCache[tank].g_iPropsAttached & MT_PROP_FLAME)) - { - SetEntityRenderColor(g_esPlayer[tank].g_iFlame[iOzTank], iGetRandomColor(g_esCache[tank].g_iFlameColor[0]), iGetRandomColor(g_esCache[tank].g_iFlameColor[1]), iGetRandomColor(g_esCache[tank].g_iFlameColor[2]), iGetRandomColor(g_esCache[tank].g_iFlameColor[3])); - } - else - { - if (bIsValidEntity(g_esPlayer[tank].g_iFlame[iOzTank])) - { - SDKUnhook(g_esPlayer[tank].g_iFlame[iOzTank], SDKHook_SetTransmit, OnPropSetTransmit); - RemoveEntity(g_esPlayer[tank].g_iFlame[iOzTank]); - } - - g_esPlayer[tank].g_iFlame[iOzTank] = INVALID_ENT_REFERENCE; - } + case 1: MT_PrintToChat(admin, "%s %t", MT_TAG2, "PersonalTypeSmoker", sName, iIndex, iType); + case 2: MT_PrintToChat(admin, "%s %t", MT_TAG2, "PersonalTypeBoomer", sName, iIndex, iType); + case 3: MT_PrintToChat(admin, "%s %t", MT_TAG2, "PersonalTypeHunter", sName, iIndex, iType); + case 4: MT_PrintToChat(admin, "%s %t", MT_TAG2, "PersonalTypeSpitter", sName, iIndex, iType); + case 5: MT_PrintToChat(admin, "%s %t", MT_TAG2, "PersonalTypeJockey", sName, iIndex, iType); + case 6: MT_PrintToChat(admin, "%s %t", MT_TAG2, "PersonalTypeCharger", sName, iIndex, iType); + default: MT_PrintToChat(admin, "%s %t", MT_TAG2, "PersonalType", sName, iIndex, iType); } } } + } +} - GetEntPropVector(tank, Prop_Data, "m_vecOrigin", flOrigin); - GetEntPropVector(tank, Prop_Data, "m_angRotation", flAngles); - - for (int iRock = 0; iRock < (sizeof esPlayer::g_iRock); iRock++) +void vSpawnMessages(int tank, int specType) +{ + if (bIsSpecialSupported(tank, MT_CHECK_FAKECLIENT) && bIsHumanSupported(tank, specType) && bHasCoreAdminAccess(tank)) + { + switch (specType) { - bValid = bIsValidEntRef(g_esPlayer[tank].g_iRock[iRock]); - if (!bValid && GetRandomFloat(0.1, 100.0) <= g_esCache[tank].g_flPropsChance[4] && (g_esCache[tank].g_iPropsAttached & MT_PROP_ROCK)) - { - g_esPlayer[tank].g_iRock[iRock] = CreateEntityByName("prop_dynamic_override"); - if (bIsValidEntity(g_esPlayer[tank].g_iRock[iRock])) - { - SetEntityRenderColor(g_esPlayer[tank].g_iRock[iRock], iGetRandomColor(g_esCache[tank].g_iRockColor[0]), iGetRandomColor(g_esCache[tank].g_iRockColor[1]), iGetRandomColor(g_esCache[tank].g_iRockColor[2]), iGetRandomColor(g_esCache[tank].g_iRockColor[3])); - vSetRockModel(tank, g_esPlayer[tank].g_iRock[iRock]); - - DispatchKeyValueVector(g_esPlayer[tank].g_iRock[iRock], "origin", flOrigin); - DispatchKeyValueVector(g_esPlayer[tank].g_iRock[iRock], "angles", flAngles); - vSetEntityParent(g_esPlayer[tank].g_iRock[iRock], tank, true); + case 1: MT_PrintToChat(tank, "%s %t", MT_TAG3, "SpawnMessageSmoker"); + case 2: MT_PrintToChat(tank, "%s %t", MT_TAG3, "SpawnMessageBoomer"); + case 3: MT_PrintToChat(tank, "%s %t", MT_TAG3, "SpawnMessageHunter"); + case 4: MT_PrintToChat(tank, "%s %t", MT_TAG3, "SpawnMessageSpitter"); + case 5: MT_PrintToChat(tank, "%s %t", MT_TAG3, "SpawnMessageJockey"); + case 6: MT_PrintToChat(tank, "%s %t", MT_TAG3, "SpawnMessageCharger"); + default: MT_PrintToChat(tank, "%s %t", MT_TAG3, "SpawnMessage"); + } - switch (iRock) - { - case 0, 4, 8, 12, 16: SetVariantString("rshoulder"); - case 1, 5, 9, 13, 17: SetVariantString("lshoulder"); - case 2, 6, 10, 14, 18: SetVariantString("relbow"); - case 3, 7, 11, 15, 19: SetVariantString("lelbow"); - } + MT_PrintToChat(tank, "%s %t", MT_TAG2, "AbilityButtons"); + MT_PrintToChat(tank, "%s %t", MT_TAG2, "AbilityButtons2"); + MT_PrintToChat(tank, "%s %t", MT_TAG2, "AbilityButtons3"); + MT_PrintToChat(tank, "%s %t", MT_TAG2, "AbilityButtons4"); + } +} - AcceptEntityInput(g_esPlayer[tank].g_iRock[iRock], "SetParentAttachment"); - AcceptEntityInput(g_esPlayer[tank].g_iRock[iRock], "Enable"); - AcceptEntityInput(g_esPlayer[tank].g_iRock[iRock], "DisableCollision"); +void vSpawnModes(int tank, bool status) +{ + g_esPlayer[tank].g_bBoss = status; + g_esPlayer[tank].g_bCombo = status; + g_esPlayer[tank].g_bRandomized = status; + g_esPlayer[tank].g_bTransformed = status; +} - if (g_bSecondGame) - { - switch (iRock) - { - case 0, 1, 4, 5, 8, 9, 12, 13, 16, 17: SetEntPropFloat(g_esPlayer[tank].g_iRock[iRock], Prop_Data, "m_flModelScale", 0.4); - case 2, 3, 6, 7, 10, 11, 14, 15, 18, 19: SetEntPropFloat(g_esPlayer[tank].g_iRock[iRock], Prop_Data, "m_flModelScale", 0.5); - } - } +void vSpawnTank(int admin, int specType, bool log = true, int amount, int mode, bool blind) +{ + char sCommand[32], sParameter[32]; + FormatEx(sCommand, sizeof sCommand, "z_spawn%s", (g_bSecondGame ? "_old" : "")); - flAngles[0] += MT_GetRandomFloat(-90.0, 90.0); - flAngles[1] += MT_GetRandomFloat(-90.0, 90.0); - flAngles[2] += MT_GetRandomFloat(-90.0, 90.0); + switch (specType) + { + case 1: FormatEx(sParameter, sizeof sParameter, "smoker%s", ((mode == 0) ? "" : " auto")); + case 2: FormatEx(sParameter, sizeof sParameter, "boomer%s", ((mode == 0) ? "" : " auto")); + case 3: FormatEx(sParameter, sizeof sParameter, "hunter%s", ((mode == 0) ? "" : " auto")); + case 4: FormatEx(sParameter, sizeof sParameter, "spitter%s", ((mode == 0) ? "" : " auto")); + case 5: FormatEx(sParameter, sizeof sParameter, "jockey%s", ((mode == 0) ? "" : " auto")); + case 6: FormatEx(sParameter, sizeof sParameter, "charger%s", ((mode == 0) ? "" : " auto")); + default: FormatEx(sParameter, sizeof sParameter, "tank%s", ((mode == 0) ? "" : " auto")); + } - TeleportEntity(g_esPlayer[tank].g_iRock[iRock], .angles = flAngles); - DispatchSpawn(g_esPlayer[tank].g_iRock[iRock]); + int iType = g_esGeneral.g_iChosenType; + g_esGeneral.g_bForceSpawned = true; - SDKHook(g_esPlayer[tank].g_iRock[iRock], SDKHook_SetTransmit, OnPropSetTransmit); - g_esPlayer[tank].g_iRock[iRock] = EntIndexToEntRef(g_esPlayer[tank].g_iRock[iRock]); - } - } - else if (bValid) + switch (amount) + { + case 1: vCheatCommand(admin, sCommand, sParameter); + default: + { + for (int iAmount = 0; iAmount <= amount; iAmount++) { - g_esPlayer[tank].g_iRock[iRock] = EntRefToEntIndex(g_esPlayer[tank].g_iRock[iRock]); - if (bIsValidEntity(g_esPlayer[tank].g_iRock[iRock]) && (g_esCache[tank].g_iPropsAttached & MT_PROP_ROCK)) - { - SetEntityRenderColor(g_esPlayer[tank].g_iRock[iRock], iGetRandomColor(g_esCache[tank].g_iRockColor[0]), iGetRandomColor(g_esCache[tank].g_iRockColor[1]), iGetRandomColor(g_esCache[tank].g_iRockColor[2]), iGetRandomColor(g_esCache[tank].g_iRockColor[3])); - vSetRockModel(tank, g_esPlayer[tank].g_iRock[iRock]); - } - else + if (iAmount < amount) { - if (bIsValidEntity(g_esPlayer[tank].g_iRock[iRock])) + if (bIsValidClient(admin)) { - SDKUnhook(g_esPlayer[tank].g_iRock[iRock], SDKHook_SetTransmit, OnPropSetTransmit); - RemoveEntity(g_esPlayer[tank].g_iRock[iRock]); - } + vCheatCommand(admin, sCommand, sParameter); - g_esPlayer[tank].g_iRock[iRock] = INVALID_ENT_REFERENCE; + g_esGeneral.g_bBlindType = blind; + g_esGeneral.g_bForceSpawned = true; + g_esGeneral.g_iChosenType = iType; + } + } + else if (iAmount == amount) + { + g_esGeneral.g_bBlindType = false; + g_esGeneral.g_iChosenType = 0; } } } + } - GetEntPropVector(tank, Prop_Data, "m_vecOrigin", flOrigin); - GetEntPropVector(tank, Prop_Data, "m_angRotation", flAngles); - flAngles[0] += 90.0; + if (log) + { + char sName[33]; - for (int iTire = 0; iTire < (sizeof esPlayer::g_iTire); iTire++) + switch (iType) { - bValid = bIsValidEntRef(g_esPlayer[tank].g_iTire[iTire]); - if (!bValid && GetRandomFloat(0.1, 100.0) <= g_esCache[tank].g_flPropsChance[5] && (g_esCache[tank].g_iPropsAttached & MT_PROP_TIRE)) + case -1: { - g_esPlayer[tank].g_iTire[iTire] = CreateEntityByName("prop_dynamic_override"); - if (bIsValidEntity(g_esPlayer[tank].g_iTire[iTire])) + switch (specType) { - SetEntityModel(g_esPlayer[tank].g_iTire[iTire], MODEL_TIRES); - SetEntityRenderColor(g_esPlayer[tank].g_iTire[iTire], iGetRandomColor(g_esCache[tank].g_iTireColor[0]), iGetRandomColor(g_esCache[tank].g_iTireColor[1]), iGetRandomColor(g_esCache[tank].g_iTireColor[2]), iGetRandomColor(g_esCache[tank].g_iTireColor[3])); - - DispatchKeyValueVector(g_esPlayer[tank].g_iTire[iTire], "origin", flOrigin); - DispatchKeyValueVector(g_esPlayer[tank].g_iTire[iTire], "angles", flAngles); - vSetEntityParent(g_esPlayer[tank].g_iTire[iTire], tank, true); - - switch (iTire) - { - case 0: SetVariantString("rfoot"); - case 1: SetVariantString("lfoot"); - } - - AcceptEntityInput(g_esPlayer[tank].g_iTire[iTire], "SetParentAttachment"); - AcceptEntityInput(g_esPlayer[tank].g_iTire[iTire], "Enable"); - AcceptEntityInput(g_esPlayer[tank].g_iTire[iTire], "DisableCollision"); - - if (g_bSecondGame) - { - SetEntPropFloat(g_esPlayer[tank].g_iTire[iTire], Prop_Data, "m_flModelScale", 1.5); - } - - TeleportEntity(g_esPlayer[tank].g_iTire[iTire], .angles = flAngles); - DispatchSpawn(g_esPlayer[tank].g_iTire[iTire]); - - SDKHook(g_esPlayer[tank].g_iTire[iTire], SDKHook_SetTransmit, OnPropSetTransmit); - g_esPlayer[tank].g_iTire[iTire] = EntIndexToEntRef(g_esPlayer[tank].g_iTire[iTire]); + case 1, 2, 3, 4, 5, 6: FormatEx(sName, sizeof sName, g_sSpecialNames[specType]); + default: FormatEx(sName, sizeof sName, "Tank"); } } - else if (bValid) + default: { - g_esPlayer[tank].g_iTire[iTire] = EntRefToEntIndex(g_esPlayer[tank].g_iTire[iTire]); - if (bIsValidEntity(g_esPlayer[tank].g_iTire[iTire]) && (g_esCache[tank].g_iPropsAttached & MT_PROP_TIRE)) - { - SetEntityRenderColor(g_esPlayer[tank].g_iTire[iTire], iGetRandomColor(g_esCache[tank].g_iTireColor[0]), iGetRandomColor(g_esCache[tank].g_iTireColor[1]), iGetRandomColor(g_esCache[tank].g_iTireColor[2]), iGetRandomColor(g_esCache[tank].g_iTireColor[3])); - } - else + switch (specType) { - if (bIsValidEntity(g_esPlayer[tank].g_iTire[iTire])) - { - SDKUnhook(g_esPlayer[tank].g_iTire[iTire], SDKHook_SetTransmit, OnPropSetTransmit); - RemoveEntity(g_esPlayer[tank].g_iTire[iTire]); - } - - g_esPlayer[tank].g_iTire[iTire] = INVALID_ENT_REFERENCE; + case 1: strcopy(sName, sizeof sName, g_esSpecial[iType].g_sSmokerName); + case 2: strcopy(sName, sizeof sName, g_esSpecial[iType].g_sBoomerName); + case 3: strcopy(sName, sizeof sName, g_esSpecial[iType].g_sHunterName); + case 4: strcopy(sName, sizeof sName, g_esSpecial[iType].g_sSpitterName); + case 5: strcopy(sName, sizeof sName, g_esSpecial[iType].g_sJockeyName); + case 6: strcopy(sName, sizeof sName, g_esSpecial[iType].g_sChargerName); + default: strcopy(sName, sizeof sName, g_esTank[iType].g_sTankName); } } } - GetEntPropVector(tank, Prop_Data, "m_vecOrigin", flOrigin); - GetEntPropVector(tank, Prop_Data, "m_angRotation", flAngles); + vLogCommand(admin, MT_CMD_SPAWN, "%s %N:{default} Spawned{mint} %i{olive} %s%s{default}.", MT_TAG5, admin, amount, sName, ((amount > 1) ? "s" : "")); + vLogMessage(MT_LOG_SERVER, _, "%s %N: Spawned %i %s%s.", MT_TAG, admin, amount, sName, ((amount > 1) ? "s" : "")); + } +} - bValid = bIsValidEntRef(g_esPlayer[tank].g_iPropaneTank); - if (!bValid && GetRandomFloat(0.1, 100.0) <= g_esCache[tank].g_flPropsChance[6] && (g_esCache[tank].g_iPropsAttached & MT_PROP_PROPANETANK)) - { - g_esPlayer[tank].g_iPropaneTank = CreateEntityByName("prop_dynamic_override"); - if (bIsValidEntity(g_esPlayer[tank].g_iPropaneTank)) - { - SetEntityModel(g_esPlayer[tank].g_iPropaneTank, MODEL_PROPANETANK); - SetEntityRenderColor(g_esPlayer[tank].g_iPropaneTank, iGetRandomColor(g_esCache[tank].g_iPropTankColor[0]), iGetRandomColor(g_esCache[tank].g_iPropTankColor[1]), iGetRandomColor(g_esCache[tank].g_iPropTankColor[2]), iGetRandomColor(g_esCache[tank].g_iPropTankColor[3])); +void vTankSpawn(int tank, int mode = 0, int specType = 0) +{ + int iSpecType = (specType <= 0) ? g_esPlayer[tank].g_iInfectedType : specType; + DataPack dpTankSpawn = new DataPack(); + dpTankSpawn.WriteCell(GetClientUserId(tank)); + dpTankSpawn.WriteCell(mode); + dpTankSpawn.WriteCell(iSpecType); + RequestFrame(vTankSpawnFrame, dpTankSpawn); +} - DispatchKeyValueVector(g_esPlayer[tank].g_iPropaneTank, "origin", flOrigin); - DispatchKeyValueVector(g_esPlayer[tank].g_iPropaneTank, "angles", flAngles); - vSetEntityParent(g_esPlayer[tank].g_iPropaneTank, tank, true); +void vZedTime(float duration) +{ + if (duration > 0.0) + { + int iTimescale = CreateEntityByName("func_timescale"); + if (bIsValidEntity(iTimescale)) + { + DispatchKeyValueFloat(iTimescale, "desiredTimescale", 0.2); + DispatchKeyValueFloat(iTimescale, "acceleration", 2.0); + DispatchKeyValueFloat(iTimescale, "minBlendRate", 1.0); + DispatchKeyValueFloat(iTimescale, "blendDeltaMultiplier", 2.0); - SetVariantString("mouth"); - vSetVector(flOrigin, 10.0, 5.0, 0.0); - vSetVector(flAngles, 60.0, 0.0, -90.0); - AcceptEntityInput(g_esPlayer[tank].g_iPropaneTank, "SetParentAttachment"); - AcceptEntityInput(g_esPlayer[tank].g_iPropaneTank, "Enable"); - AcceptEntityInput(g_esPlayer[tank].g_iPropaneTank, "DisableCollision"); + DispatchSpawn(iTimescale); + AcceptEntityInput(iTimescale, "Start"); - if (g_bSecondGame) - { - SetEntPropFloat(g_esPlayer[tank].g_iPropaneTank, Prop_Data, "m_flModelScale", 1.1); - } + CreateTimer(duration, tTimerRemoveTimescale, EntIndexToEntRef(iTimescale), TIMER_FLAG_NO_MAPCHANGE); + } + } +} - TeleportEntity(g_esPlayer[tank].g_iPropaneTank, flOrigin, flAngles); - DispatchSpawn(g_esPlayer[tank].g_iPropaneTank); +/** + * Config settings functions + **/ - SDKHook(g_esPlayer[tank].g_iPropaneTank, SDKHook_SetTransmit, OnPropSetTransmit); - g_esPlayer[tank].g_iPropaneTank = EntIndexToEntRef(g_esPlayer[tank].g_iPropaneTank); - } - } - else if (bValid) +void vCacheInfectedSettings(int infected, int type = -1) +{ + bool bCommon = bIsCommonInfected(infected), bWitch = bIsWitch(infected); + int iType = (type != -1) ? type : g_esInfected[infected].g_iTankType; + if (bCommon || bWitch) + { + g_esInfectedCache[infected].g_iMobVariants = iGetSettingValue(true, true, g_esHorde[iType].g_iMobVariants, g_esMob.g_iMobVariants, 1); + if ((bCommon && (g_esInfectedCache[infected].g_iMobVariants & MT_MOBVARIANT_COMMON)) || (bWitch && (g_esInfectedCache[infected].g_iMobVariants & MT_MOBVARIANT_WITCH))) { - g_esPlayer[tank].g_iPropaneTank = EntRefToEntIndex(g_esPlayer[tank].g_iPropaneTank); - if (bIsValidEntity(g_esPlayer[tank].g_iPropaneTank) && (g_esCache[tank].g_iPropsAttached & MT_PROP_PROPANETANK)) + if (bWitch) { - SetEntityRenderColor(g_esPlayer[tank].g_iPropaneTank, iGetRandomColor(g_esCache[tank].g_iPropTankColor[0]), iGetRandomColor(g_esCache[tank].g_iPropTankColor[1]), iGetRandomColor(g_esCache[tank].g_iPropTankColor[2]), iGetRandomColor(g_esCache[tank].g_iPropTankColor[3])); + g_esInfectedCache[infected].g_flWitchMutateChance = flGetSettingValue(true, true, g_esHorde[iType].g_flWitchMutateChance, g_esMob.g_flWitchMutateChance, 1); + g_esInfectedCache[infected].g_flWitchRange = flGetSettingValue(true, true, g_esHorde[iType].g_flWitchRange, g_esMob.g_flWitchRange, 1); + g_esInfectedCache[infected].g_iWitchFilter = iGetSettingValue(true, true, g_esHorde[iType].g_iWitchFilter, g_esMob.g_iWitchFilter, 1); + g_esInfectedCache[infected].g_iWitchMode = iGetSettingValue(true, true, g_esHorde[iType].g_iWitchMode, g_esMob.g_iWitchMode, 1); + g_esInfectedCache[infected].g_iWitchTypes = iGetSettingValue(true, true, g_esHorde[iType].g_iWitchTypes, g_esMob.g_iWitchTypes, 1); } - else + else if (bCommon) { - if (bIsValidEntity(g_esPlayer[tank].g_iPropaneTank)) + g_esInfectedCache[infected].g_flCommonDamagePoints = flGetSettingValue(true, true, g_esHorde[iType].g_flCommonDamagePoints, g_esMob.g_flCommonDamagePoints, 1); + g_esInfectedCache[infected].g_flCommonDeathPoints = flGetSettingValue(true, true, g_esHorde[iType].g_flCommonDeathPoints, g_esMob.g_flCommonDeathPoints, 1); + } + + g_esInfectedCache[infected].g_iBodyEffects = iGetSettingValue(true, true, g_esHorde[iType].g_iBodyEffects, g_esTank[iType].g_iBodyEffects, 1); + g_esInfectedCache[infected].g_iDisplayHealth = iGetSubSettingValue(true, true, g_esHorde[iType].g_iDisplayHealth, g_esTank[iType].g_iDisplayHealth, g_esMob.g_iDisplayHealth, g_esGeneral.g_iDisplayHealth, 1); + g_esInfectedCache[infected].g_iDisplayHealthType = iGetSubSettingValue(true, true, g_esHorde[iType].g_iDisplayHealthType, g_esTank[iType].g_iDisplayHealthType, g_esMob.g_iDisplayHealthType, g_esGeneral.g_iDisplayHealthType, 1); + g_esInfectedCache[infected].g_iGlowEnabled = iGetSettingValue(true, true, g_esHorde[iType].g_iGlowEnabled, g_esTank[iType].g_iGlowEnabled, 1); + g_esInfectedCache[infected].g_iGlowFlashing = iGetSettingValue(true, true, g_esHorde[iType].g_iGlowFlashing, g_esTank[iType].g_iGlowFlashing, 1); + g_esInfectedCache[infected].g_iGlowMaxRange = iGetSettingValue(true, true, g_esHorde[iType].g_iGlowMaxRange, g_esTank[iType].g_iGlowMaxRange, 1); + g_esInfectedCache[infected].g_iGlowMinRange = iGetSettingValue(true, true, g_esHorde[iType].g_iGlowMinRange, g_esTank[iType].g_iGlowMinRange, 1); + g_esInfectedCache[infected].g_iGlowType = iGetSettingValue(true, true, g_esHorde[iType].g_iGlowType, g_esTank[iType].g_iGlowType, 1); + + vGetSettingValue(true, true, g_esInfectedCache[infected].g_sGlowColor, sizeof esInfectedCache::g_sGlowColor, g_esHorde[iType].g_sGlowColor, g_esTank[iType].g_sGlowColor); + vGetSubSettingValue(true, true, g_esInfectedCache[infected].g_sHealthCharacters, sizeof esInfectedCache::g_sHealthCharacters, g_esHorde[iType].g_sHealthCharacters, g_esTank[iType].g_sHealthCharacters, g_esMob.g_sHealthCharacters, g_esGeneral.g_sHealthCharacters); + vGetSettingValue(true, true, g_esInfectedCache[infected].g_sSkinColor, sizeof esInfectedCache::g_sSkinColor, g_esHorde[iType].g_sSkinColor, g_esTank[iType].g_sSkinColor); + + for (int iPos = 0; iPos < (sizeof esInfectedCache::g_flBodyChance); iPos++) + { + g_esInfectedCache[infected].g_flBodyChance[iPos] = flGetSettingValue(true, true, g_esHorde[iType].g_flBodyChance[iPos], g_esTank[iType].g_flBodyChance[iPos], 1); + + if (iPos < (sizeof esInfectedCache::g_iSkinColor)) { - SDKUnhook(g_esPlayer[tank].g_iPropaneTank, SDKHook_SetTransmit, OnPropSetTransmit); - RemoveEntity(g_esPlayer[tank].g_iPropaneTank); + g_esInfectedCache[infected].g_iSkinColor[iPos] = iGetSettingValue(true, true, g_esHorde[iType].g_iSkinColor[iPos], g_esTank[iType].g_iSkinColor[iPos], 1); } - g_esPlayer[tank].g_iPropaneTank = INVALID_ENT_REFERENCE; + if (iPos < (sizeof esInfectedCache::g_iGlowColor)) + { + g_esInfectedCache[infected].g_iGlowColor[iPos] = iGetSettingValue(true, true, g_esHorde[iType].g_iGlowColor[iPos], g_esTank[iType].g_iGlowColor[iPos], 1); + } } } - - bValid = bIsValidEntRef(g_esPlayer[tank].g_iFlashlight); - if (!bValid && GetRandomFloat(0.1, 100.0) <= g_esCache[tank].g_flPropsChance[7] && (g_esCache[tank].g_iPropsAttached & MT_PROP_FLASHLIGHT)) - { - vFlashlightProp(tank, flOrigin, flAngles, g_esCache[tank].g_iFlashlightColor); - } - else if (bValid) + else { - g_esPlayer[tank].g_iFlashlight = EntRefToEntIndex(g_esPlayer[tank].g_iFlashlight); - if (bIsValidEntity(g_esPlayer[tank].g_iFlashlight)) + if (bWitch) { - SDKUnhook(g_esPlayer[tank].g_iFlashlight, SDKHook_SetTransmit, OnPropSetTransmit); - RemoveEntity(g_esPlayer[tank].g_iFlashlight); + g_esInfectedCache[infected].g_flWitchMutateChance = 0.0; + g_esInfectedCache[infected].g_flWitchRange = 0.0; + g_esInfectedCache[infected].g_iWitchFilter = 0; + g_esInfectedCache[infected].g_iWitchMode = 0; + g_esInfectedCache[infected].g_iWitchTypes = 0; } - - g_esPlayer[tank].g_iFlashlight = INVALID_ENT_REFERENCE; - if (g_esCache[tank].g_iPropsAttached & MT_PROP_FLASHLIGHT) + else if (bCommon) { - vFlashlightProp(tank, flOrigin, flAngles, g_esCache[tank].g_iFlashlightColor); + g_esInfectedCache[infected].g_flCommonDamagePoints = 0.0; + g_esInfectedCache[infected].g_flCommonDeathPoints = 0.0; } - } - if (!g_esPlayer[tank].g_bRainbowColor) - { - g_esPlayer[tank].g_bRainbowColor = SDKHookEx(tank, SDKHook_PreThinkPost, OnRainbowPreThinkPost); - } - } -} + g_esInfectedCache[infected].g_sGlowColor[0] = '\0'; + g_esInfectedCache[infected].g_sHealthCharacters[0] = '\0'; + g_esInfectedCache[infected].g_sSkinColor[0] = '\0'; + g_esInfectedCache[infected].g_iBodyEffects = 0; + g_esInfectedCache[infected].g_iDisplayHealth = 0; + g_esInfectedCache[infected].g_iDisplayHealthType = 0; + g_esInfectedCache[infected].g_iGlowEnabled = 0; + g_esInfectedCache[infected].g_iGlowFlashing = 0; + g_esInfectedCache[infected].g_iGlowMaxRange = 0; + g_esInfectedCache[infected].g_iGlowMinRange = 0; + g_esInfectedCache[infected].g_iGlowType = 0; -void vSetTankRainbowColor(int tank) -{ - switch (StrEqual(g_esCache[tank].g_sSkinColor, "rainbow", false)) - { - case true: - { - if (!g_esPlayer[tank].g_bRainbowColor) + for (int iPos = 0; iPos < (sizeof esInfectedCache::g_flBodyChance); iPos++) { - g_esPlayer[tank].g_bRainbowColor = SDKHookEx(tank, SDKHook_PreThinkPost, OnRainbowPreThinkPost); - } - } - case false: - { - SetEntityRenderMode(tank, RENDER_NORMAL); - SetEntityRenderColor(tank, iGetRandomColor(g_esCache[tank].g_iSkinColor[0]), iGetRandomColor(g_esCache[tank].g_iSkinColor[1]), iGetRandomColor(g_esCache[tank].g_iSkinColor[2]), iGetRandomColor(g_esCache[tank].g_iSkinColor[3])); - } - } -} + g_esInfectedCache[infected].g_flBodyChance[iPos] = 0.0; -void vSetTankRock(int rock) -{ - if (bIsValidEntity(rock) && bIsValidEntRef(g_esGeneral.g_iLauncher)) - { - g_esGeneral.g_iLauncher = EntRefToEntIndex(g_esGeneral.g_iLauncher); + if (iPos < (sizeof esInfectedCache::g_iSkinColor)) + { + g_esInfectedCache[infected].g_iSkinColor[iPos] = 255; + } - if (bIsValidEntity(g_esGeneral.g_iLauncher)) - { - int iTank = GetEntPropEnt(g_esGeneral.g_iLauncher, Prop_Data, "m_hOwnerEntity"); - if (bIsInfectedSupported(iTank)) - { - SetEntPropEnt(rock, Prop_Data, "m_hThrower", iTank); - SetEntPropEnt(rock, Prop_Data, "m_hOwnerEntity", g_esGeneral.g_iLauncher); - vSetRockModel(iTank, rock); - vSetRockEffects(iTank, rock); - vSetRockColor(iTank, rock); - vRockThrowForward(iTank, rock); + if (iPos < (sizeof esInfectedCache::g_iGlowColor)) + { + g_esInfectedCache[infected].g_iGlowColor[iPos] = 255; + } } } } } -void vSetTankThrowInterval(int tank) -{ - float flInterval = bIsTank(tank) ? g_esCache[tank].g_flThrowInterval : g_esCache[tank].g_flSpecialInterval; - if (bIsInfected(tank) && flInterval > 0.0) - { - int iAbility = GetEntPropEnt(tank, Prop_Send, "m_customAbility"); - if (iAbility > 0) - { - SetEntPropFloat(iAbility, Prop_Send, "m_duration", flInterval); - SetEntPropFloat(iAbility, Prop_Send, "m_timestamp", (GetGameTime() + flInterval)); - } - } -} - -void vSetupTankControl(int oldTank, int newTank) +void vCacheTankSettings(int tank, int type = -1, bool abilitiesOnly = false, bool visualsOnly = false) { - vSetTankColor(newTank, g_esPlayer[oldTank].g_iTankType); - vCopyTankStats(oldTank, newTank); - vResetTank(oldTank, false); - vResetTank2(oldTank, false); - vCacheSettings(oldTank); - CreateTimer(0.25, tTimerControlTank, GetClientUserId(newTank), TIMER_FLAG_NO_MAPCHANGE); -} + bool bAccess = bIsValidClient(tank) && bHasCoreAdminAccess(tank), bHuman = bIsValidClient(tank, MT_CHECK_FAKECLIENT); + int iType = (type != -1) ? type : g_esPlayer[tank].g_iTankType; + if (!abilitiesOnly) + { + if (bIsSpecialInfected(tank, MT_CHECK_INDEX|MT_CHECK_INGAME)) + { + int iSpecType = g_esPlayer[tank].g_iInfectedType - 1; + g_esTankCache[tank].g_iSpecialTypes = iGetSettingValue(bAccess, true, g_esSpecial[iType].g_iSpecialTypes, g_esSpecific.g_iSpecialTypes, 1); + if (g_esTankCache[tank].g_iSpecialTypes > 0 && g_esTankCache[tank].g_iSpecialTypes & (1 << iSpecType)) + { + if (!visualsOnly) + { + g_esTankCache[tank].g_flArmorDuration = flGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_flArmorDuration, g_esTank[iType].g_flArmorDuration, g_esSpecific.g_flArmorDuration, g_esGeneral.g_flArmorDuration, 1); + g_esTankCache[tank].g_flArmorDuration = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flArmorDuration, g_esPlayer[tank].g_flArmorDuration, g_esTankCache[tank].g_flArmorDuration, g_esTankCache[tank].g_flArmorDuration, 1); + g_esTankCache[tank].g_flArmorPercentage = flGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_flArmorPercentage, g_esTank[iType].g_flArmorPercentage, g_esSpecific.g_flArmorPercentage, g_esGeneral.g_flArmorPercentage, 1); + g_esTankCache[tank].g_flArmorPercentage = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flArmorPercentage, g_esPlayer[tank].g_flArmorPercentage, g_esTankCache[tank].g_flArmorPercentage, g_esTankCache[tank].g_flArmorPercentage, 1); + g_esTankCache[tank].g_flArmorResistance[0] = flGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_flArmorResistance[0], g_esTank[iType].g_flArmorResistance[0], g_esSpecific.g_flArmorResistance[0], g_esGeneral.g_flArmorResistance[0], 1); + g_esTankCache[tank].g_flArmorResistance[0] = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flArmorResistance[0], g_esPlayer[tank].g_flArmorResistance[0], g_esTankCache[tank].g_flArmorResistance[0], g_esTankCache[tank].g_flArmorResistance[0], 1); + g_esTankCache[tank].g_flArmorResistance[1] = flGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_flArmorResistance[1], g_esTank[iType].g_flArmorResistance[1], g_esSpecific.g_flArmorResistance[1], g_esGeneral.g_flArmorResistance[1], 1); + g_esTankCache[tank].g_flArmorResistance[1] = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flArmorResistance[1], g_esPlayer[tank].g_flArmorResistance[1], g_esTankCache[tank].g_flArmorResistance[1], g_esTankCache[tank].g_flArmorResistance[1], 1); + g_esTankCache[tank].g_flAttackInterval = flGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_flAttackInterval, g_esTank[iType].g_flAttackInterval, g_esSpecific.g_flAttackInterval, g_esGeneral.g_flAttackInterval, 1); + g_esTankCache[tank].g_flAttackInterval = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flAttackInterval, g_esPlayer[tank].g_flAttackInterval, g_esTankCache[tank].g_flAttackInterval, g_esTankCache[tank].g_flAttackInterval, 1); + g_esTankCache[tank].g_flBurnDuration = flGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_flBurnDuration, g_esTank[iType].g_flBurnDuration, g_esSpecific.g_flBurnDuration, g_esGeneral.g_flBurnDuration, 1); + g_esTankCache[tank].g_flBurnDuration = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flBurnDuration, g_esPlayer[tank].g_flBurnDuration, g_esTankCache[tank].g_flBurnDuration, g_esTankCache[tank].g_flBurnDuration, 1); + g_esTankCache[tank].g_flBurntSkin = flGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_flBurntSkin, g_esTank[iType].g_flBurntSkin, g_esSpecific.g_flBurntSkin, g_esGeneral.g_flBurntSkin, 1, -1.0); + g_esTankCache[tank].g_flBurntSkin = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flBurntSkin, g_esPlayer[tank].g_flBurntSkin, g_esTankCache[tank].g_flBurntSkin, g_esTankCache[tank].g_flBurntSkin, 1, -1.0); + g_esTankCache[tank].g_flClawDamage = flGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_flClawDamage, g_esTank[iType].g_flClawDamage, g_esSpecific.g_flClawDamage, g_esGeneral.g_flClawDamage, 1, -1.0); + g_esTankCache[tank].g_flClawDamage = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flClawDamage, g_esPlayer[tank].g_flClawDamage, g_esTankCache[tank].g_flClawDamage, g_esTankCache[tank].g_flClawDamage, 1, -1.0); + g_esTankCache[tank].g_flHealPercentMultiplier = flGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_flHealPercentMultiplier, g_esTank[iType].g_flHealPercentMultiplier, g_esSpecific.g_flHealPercentMultiplier, g_esGeneral.g_flHealPercentMultiplier, 1); + g_esTankCache[tank].g_flHealPercentMultiplier = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flHealPercentMultiplier, g_esPlayer[tank].g_flHealPercentMultiplier, g_esTankCache[tank].g_flHealPercentMultiplier, g_esTankCache[tank].g_flHealPercentMultiplier, 1); + g_esTankCache[tank].g_flHittableDamage = flGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_flHittableDamage, g_esTank[iType].g_flHittableDamage, g_esSpecific.g_flHittableDamage, g_esGeneral.g_flHittableDamage, 1, -1.0); + g_esTankCache[tank].g_flHittableDamage = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flHittableDamage, g_esPlayer[tank].g_flHittableDamage, g_esTankCache[tank].g_flHittableDamage, g_esTankCache[tank].g_flHittableDamage, 1, -1.0); + g_esTankCache[tank].g_flIncapDamageMultiplier = flGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_flIncapDamageMultiplier, g_esTank[iType].g_flIncapDamageMultiplier, g_esSpecific.g_flIncapDamageMultiplier, g_esGeneral.g_flIncapDamageMultiplier, 1); + g_esTankCache[tank].g_flIncapDamageMultiplier = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flIncapDamageMultiplier, g_esPlayer[tank].g_flIncapDamageMultiplier, g_esTankCache[tank].g_flIncapDamageMultiplier, g_esTankCache[tank].g_flIncapDamageMultiplier, 1); + g_esTankCache[tank].g_flMeleeHitValue = flGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_flMeleeHitValue, g_esTank[iType].g_flMeleeHitValue, g_esSpecific.g_flMeleeHitValue, g_esGeneral.g_flMeleeHitValue, 1); + g_esTankCache[tank].g_flMeleeHitValue = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flMeleeHitValue, g_esPlayer[tank].g_flMeleeHitValue, g_esTankCache[tank].g_flMeleeHitValue, g_esTankCache[tank].g_flMeleeHitValue, 1); + g_esTankCache[tank].g_flPassiveDelay = flGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_flPassiveDelay, g_esTank[iType].g_flPassiveDelay, g_esSpecific.g_flPassiveDelay, g_esGeneral.g_flPassiveDelay, 1); + g_esTankCache[tank].g_flPassiveDelay = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flPassiveDelay, g_esPlayer[tank].g_flPassiveDelay, g_esTankCache[tank].g_flPassiveDelay, g_esTankCache[tank].g_flPassiveDelay, 1); + g_esTankCache[tank].g_flPassiveInterval = flGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_flPassiveInterval, g_esTank[iType].g_flPassiveInterval, g_esSpecific.g_flPassiveInterval, g_esGeneral.g_flPassiveInterval, 1); + g_esTankCache[tank].g_flPassiveInterval = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flPassiveInterval, g_esPlayer[tank].g_flPassiveInterval, g_esTankCache[tank].g_flPassiveInterval, g_esTankCache[tank].g_flPassiveInterval, 1); + g_esTankCache[tank].g_flPinDamage = flGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_flPinDamage, g_esTank[iType].g_flRockDamage, g_esSpecific.g_flPinDamage, g_esGeneral.g_flRockDamage, 1, -1.0); + g_esTankCache[tank].g_flPinDamage = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flPinDamage, g_esPlayer[tank].g_flRockDamage, g_esTankCache[tank].g_flPinDamage, g_esTankCache[tank].g_flPinDamage, 1, -1.0); + g_esTankCache[tank].g_flRandomDuration = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flRandomDuration, g_esPlayer[tank].g_flRandomDuration, g_esSpecial[iType].g_flRandomDuration, g_esTank[iType].g_flRandomDuration, 1); + g_esTankCache[tank].g_flRandomInterval = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flRandomInterval, g_esPlayer[tank].g_flRandomInterval, g_esSpecial[iType].g_flRandomInterval, g_esTank[iType].g_flRandomInterval, 1); + g_esTankCache[tank].g_flRunSpeed = flGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_flRunSpeed, g_esTank[iType].g_flRunSpeed, g_esSpecific.g_flRunSpeed, g_esGeneral.g_flRunSpeed, 1); + g_esTankCache[tank].g_flRunSpeed = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flRunSpeed, g_esPlayer[tank].g_flRunSpeed, g_esTankCache[tank].g_flRunSpeed, g_esTankCache[tank].g_flRunSpeed, 1); + g_esTankCache[tank].g_flShieldDuration = flGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_flShieldDuration, g_esTank[iType].g_flShieldDuration, g_esSpecific.g_flShieldDuration, g_esGeneral.g_flShieldDuration, 1); + g_esTankCache[tank].g_flShieldDuration = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flShieldDuration, g_esPlayer[tank].g_flShieldDuration, g_esTankCache[tank].g_flShieldDuration, g_esTankCache[tank].g_flShieldDuration, 1); + g_esTankCache[tank].g_flShieldPercentage = flGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_flShieldPercentage, g_esTank[iType].g_flShieldPercentage, g_esSpecific.g_flShieldPercentage, g_esGeneral.g_flShieldPercentage, 1); + g_esTankCache[tank].g_flShieldPercentage = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flShieldPercentage, g_esPlayer[tank].g_flShieldPercentage, g_esTankCache[tank].g_flShieldPercentage, g_esTankCache[tank].g_flShieldPercentage, 1); + g_esTankCache[tank].g_flShieldRate = flGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_flShieldRate, g_esTank[iType].g_flShieldRate, g_esSpecific.g_flShieldRate, g_esGeneral.g_flShieldRate, 1); + g_esTankCache[tank].g_flShieldRate = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flShieldRate, g_esPlayer[tank].g_flShieldRate, g_esTankCache[tank].g_flShieldRate, g_esTankCache[tank].g_flShieldRate, 1); + g_esTankCache[tank].g_flShieldResistance = flGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_flShieldResistance, g_esTank[iType].g_flShieldResistance, g_esSpecific.g_flShieldResistance, g_esGeneral.g_flShieldResistance, 1); + g_esTankCache[tank].g_flShieldResistance = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flShieldResistance, g_esPlayer[tank].g_flShieldResistance, g_esTankCache[tank].g_flShieldResistance, g_esTankCache[tank].g_flShieldResistance, 1); + g_esTankCache[tank].g_flSpecialInterval = flGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_flSpecialInterval, g_esTank[iType].g_flThrowInterval, g_esSpecific.g_flSpecialInterval, g_esGeneral.g_flThrowInterval, 1); + g_esTankCache[tank].g_flSpecialInterval = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flSpecialInterval, g_esPlayer[tank].g_flThrowInterval, g_esTankCache[tank].g_flSpecialInterval, g_esTankCache[tank].g_flSpecialInterval, 1); + g_esTankCache[tank].g_flTransformDelay = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flTransformDelay, g_esPlayer[tank].g_flTransformDelay, g_esSpecial[iType].g_flTransformDelay, g_esTank[iType].g_flTransformDelay, 1); + g_esTankCache[tank].g_flTransformDuration = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flTransformDuration, g_esPlayer[tank].g_flTransformDuration, g_esSpecial[iType].g_flTransformDuration, g_esTank[iType].g_flTransformDuration, 1); + g_esTankCache[tank].g_iAnnounceArrival = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iAnnounceArrival, g_esTank[iType].g_iAnnounceArrival, g_esSpecific.g_iAnnounceArrival, g_esGeneral.g_iAnnounceArrival, 1); + g_esTankCache[tank].g_iAnnounceArrival = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iAnnounceArrival, g_esPlayer[tank].g_iAnnounceArrival, g_esTankCache[tank].g_iAnnounceArrival, g_esTankCache[tank].g_iAnnounceArrival, 1); + g_esTankCache[tank].g_iAnnounceDeath = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iAnnounceDeath, g_esTank[iType].g_iAnnounceDeath, g_esSpecific.g_iAnnounceDeath, g_esGeneral.g_iAnnounceDeath, 1); + g_esTankCache[tank].g_iAnnounceDeath = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iAnnounceDeath, g_esPlayer[tank].g_iAnnounceDeath, g_esTankCache[tank].g_iAnnounceDeath, g_esTankCache[tank].g_iAnnounceDeath, 1); + g_esTankCache[tank].g_iAnnounceKill = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iAnnounceKill, g_esTank[iType].g_iAnnounceKill, g_esSpecific.g_iAnnounceKill, g_esGeneral.g_iAnnounceKill, 1); + g_esTankCache[tank].g_iAnnounceKill = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iAnnounceKill, g_esPlayer[tank].g_iAnnounceKill, g_esTankCache[tank].g_iAnnounceKill, g_esTankCache[tank].g_iAnnounceKill, 1); + g_esTankCache[tank].g_iArrivalMessage = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iArrivalMessage, g_esTank[iType].g_iArrivalMessage, g_esSpecific.g_iArrivalMessage, g_esGeneral.g_iArrivalMessage, 1); + g_esTankCache[tank].g_iArrivalMessage = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iArrivalMessage, g_esPlayer[tank].g_iArrivalMessage, g_esTankCache[tank].g_iArrivalMessage, g_esTankCache[tank].g_iArrivalMessage, 1); + g_esTankCache[tank].g_iArrivalSound = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iArrivalSound, g_esTank[iType].g_iArrivalSound, g_esSpecific.g_iArrivalSound, g_esGeneral.g_iArrivalSound, 1); + g_esTankCache[tank].g_iArrivalSound = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iArrivalSound, g_esPlayer[tank].g_iArrivalSound, g_esTankCache[tank].g_iArrivalSound, g_esTankCache[tank].g_iArrivalSound, 1); + g_esTankCache[tank].g_iAutoHop = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iAutoHop, g_esTank[iType].g_iAutoHop, g_esSpecific.g_iAutoHop, g_esGeneral.g_iAutoHop, 1); + g_esTankCache[tank].g_iAutoHop = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iAutoHop, g_esPlayer[tank].g_iAutoHop, g_esTankCache[tank].g_iAutoHop, g_esTankCache[tank].g_iAutoHop, 1); + g_esTankCache[tank].g_iBaseHealth = iGetSubSettingValue(bAccess, true, g_esTank[iType].g_iBaseHealth, g_esSpecific.g_iBaseHealth[0], g_esSpecific.g_iBaseHealth[iSpecType + 1], g_esGeneral.g_iBaseHealth, 1); + g_esTankCache[tank].g_iBaseHealth = iGetSubSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iBaseHealth, g_esSpecial[iType].g_iBaseHealth[0], g_esSpecial[iType].g_iBaseHealth[iSpecType + 1], g_esTankCache[tank].g_iBaseHealth, 1); + g_esTankCache[tank].g_iBaseHealth = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iBaseHealth[0], g_esTeammate[tank].g_iBaseHealth[iSpecType + 1], g_esTankCache[tank].g_iBaseHealth, g_esTankCache[tank].g_iBaseHealth, 1); + g_esTankCache[tank].g_iBossEffects = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iBossEffects, g_esPlayer[tank].g_iBossEffects, g_esSpecial[iType].g_iBossEffects, g_esTank[iType].g_iBossEffects, 1); + g_esTankCache[tank].g_iBossStages = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iBossStages, g_esPlayer[tank].g_iBossStages, g_esSpecial[iType].g_iBossStages, g_esTank[iType].g_iBossStages, 1); + g_esTankCache[tank].g_iBulletImmunity = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iBulletImmunity, g_esTank[iType].g_iBulletImmunity, g_esSpecific.g_iBulletImmunity, g_esGeneral.g_iBulletImmunity, 1); + g_esTankCache[tank].g_iBulletImmunity = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iBulletImmunity, g_esPlayer[tank].g_iBulletImmunity, g_esTankCache[tank].g_iBulletImmunity, g_esTankCache[tank].g_iBulletImmunity, 1); + g_esTankCache[tank].g_iDeathDetails = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iDeathDetails, g_esTank[iType].g_iDeathDetails, g_esSpecific.g_iDeathDetails, g_esGeneral.g_iDeathDetails, 1); + g_esTankCache[tank].g_iDeathDetails = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iDeathDetails, g_esPlayer[tank].g_iDeathDetails, g_esTankCache[tank].g_iDeathDetails, g_esTankCache[tank].g_iDeathDetails, 1); + g_esTankCache[tank].g_iDeathMessage = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iDeathMessage, g_esTank[iType].g_iDeathMessage, g_esSpecific.g_iDeathMessage, g_esGeneral.g_iDeathMessage, 1); + g_esTankCache[tank].g_iDeathMessage = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iDeathMessage, g_esPlayer[tank].g_iDeathMessage, g_esTankCache[tank].g_iDeathMessage, g_esTankCache[tank].g_iDeathMessage, 1); + g_esTankCache[tank].g_iDeathRevert = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iDeathRevert, g_esTank[iType].g_iDeathRevert, g_esSpecific.g_iDeathRevert, g_esGeneral.g_iDeathRevert, 1); + g_esTankCache[tank].g_iDeathRevert = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iDeathRevert, g_esPlayer[tank].g_iDeathRevert, g_esTankCache[tank].g_iDeathRevert, g_esTankCache[tank].g_iDeathRevert, 1); + g_esTankCache[tank].g_iDeathSound = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iDeathSound, g_esTank[iType].g_iDeathSound, g_esSpecific.g_iDeathSound, g_esGeneral.g_iDeathSound, 1); + g_esTankCache[tank].g_iDeathSound = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iDeathSound, g_esPlayer[tank].g_iDeathSound, g_esTankCache[tank].g_iDeathSound, g_esTankCache[tank].g_iDeathSound, 1); + g_esTankCache[tank].g_iDisplayHealth = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iDisplayHealth, g_esTank[iType].g_iDisplayHealth, g_esSpecific.g_iDisplayHealth, g_esGeneral.g_iDisplayHealth, 1); + g_esTankCache[tank].g_iDisplayHealth = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iDisplayHealth, g_esPlayer[tank].g_iDisplayHealth, g_esTankCache[tank].g_iDisplayHealth, g_esTankCache[tank].g_iDisplayHealth, 1); + g_esTankCache[tank].g_iDisplayHealthType = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iDisplayHealthType, g_esTank[iType].g_iDisplayHealthType, g_esSpecific.g_iDisplayHealthType, g_esGeneral.g_iDisplayHealthType, 1); + g_esTankCache[tank].g_iDisplayHealthType = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iDisplayHealthType, g_esPlayer[tank].g_iDisplayHealthType, g_esTankCache[tank].g_iDisplayHealthType, g_esTankCache[tank].g_iDisplayHealthType, 1); + g_esTankCache[tank].g_iExplosiveImmunity = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iExplosiveImmunity, g_esTank[iType].g_iExplosiveImmunity, g_esSpecific.g_iExplosiveImmunity, g_esGeneral.g_iExplosiveImmunity, 1); + g_esTankCache[tank].g_iExplosiveImmunity = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iExplosiveImmunity, g_esPlayer[tank].g_iExplosiveImmunity, g_esTankCache[tank].g_iExplosiveImmunity, g_esTankCache[tank].g_iExplosiveImmunity, 1); + g_esTankCache[tank].g_iExtraHealth = iGetSubSettingValue(bAccess, true, g_esTank[iType].g_iExtraHealth, g_esSpecific.g_iExtraHealth[0], g_esSpecific.g_iExtraHealth[iSpecType + 1], g_esGeneral.g_iExtraHealth, 2, -1); + g_esTankCache[tank].g_iExtraHealth = iGetSubSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iExtraHealth, g_esSpecial[iType].g_iExtraHealth[0], g_esSpecial[iType].g_iExtraHealth[iSpecType + 1], g_esTankCache[tank].g_iExtraHealth, 2, -1); + g_esTankCache[tank].g_iExtraHealth = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iExtraHealth[0], g_esTeammate[tank].g_iExtraHealth[iSpecType + 1], g_esTankCache[tank].g_iExtraHealth, g_esTankCache[tank].g_iExtraHealth, 2, -1); + g_esTankCache[tank].g_iFireImmunity = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iFireImmunity, g_esTank[iType].g_iFireImmunity, g_esSpecific.g_iFireImmunity, g_esGeneral.g_iFireImmunity, 1); + g_esTankCache[tank].g_iFireImmunity = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iFireImmunity, g_esPlayer[tank].g_iFireImmunity, g_esTankCache[tank].g_iFireImmunity, g_esTankCache[tank].g_iFireImmunity, 1); + g_esTankCache[tank].g_iHittableImmunity = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iHittableImmunity, g_esTank[iType].g_iHittableImmunity, g_esSpecific.g_iHittableImmunity, g_esGeneral.g_iHittableImmunity, 1); + g_esTankCache[tank].g_iHittableImmunity = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iHittableImmunity, g_esPlayer[tank].g_iHittableImmunity, g_esTankCache[tank].g_iHittableImmunity, g_esTankCache[tank].g_iHittableImmunity, 1); + g_esTankCache[tank].g_iHumanMultiplierMode = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iHumanMultiplierMode, g_esTank[iType].g_iHumanMultiplierMode, g_esSpecific.g_iHumanMultiplierMode, g_esGeneral.g_iHumanMultiplierMode, 1); + g_esTankCache[tank].g_iHumanMultiplierMode = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iHumanMultiplierMode, g_esPlayer[tank].g_iHumanMultiplierMode, g_esTankCache[tank].g_iHumanMultiplierMode, g_esTankCache[tank].g_iHumanMultiplierMode, 1); + g_esTankCache[tank].g_iIntangibleBody = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iIntangibleBody, g_esTank[iType].g_iIntangibleBody, g_esSpecific.g_iIntangibleBody, g_esGeneral.g_iIntangibleBody, 1); + g_esTankCache[tank].g_iIntangibleBody = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iIntangibleBody, g_esPlayer[tank].g_iIntangibleBody, g_esTankCache[tank].g_iIntangibleBody, g_esTankCache[tank].g_iIntangibleBody, 1); + g_esTankCache[tank].g_iKillMessage = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iKillMessage, g_esTank[iType].g_iKillMessage, g_esSpecific.g_iKillMessage, g_esGeneral.g_iKillMessage, 1); + g_esTankCache[tank].g_iKillMessage = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iKillMessage, g_esPlayer[tank].g_iKillMessage, g_esTankCache[tank].g_iKillMessage, g_esTankCache[tank].g_iKillMessage, 1); + g_esTankCache[tank].g_iMeleeHitMode = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iMeleeHitMode, g_esTank[iType].g_iMeleeHitMode, g_esSpecific.g_iMeleeHitMode, g_esGeneral.g_iMeleeHitMode, 1); + g_esTankCache[tank].g_iMeleeHitMode = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iMeleeHitMode, g_esPlayer[tank].g_iMeleeHitMode, g_esTankCache[tank].g_iMeleeHitMode, g_esTankCache[tank].g_iMeleeHitMode, 1); + g_esTankCache[tank].g_iMeleeImmunity = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iMeleeImmunity, g_esTank[iType].g_iMeleeImmunity, g_esSpecific.g_iMeleeImmunity, g_esGeneral.g_iMeleeImmunity, 1); + g_esTankCache[tank].g_iMeleeImmunity = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iMeleeImmunity, g_esPlayer[tank].g_iMeleeImmunity, g_esTankCache[tank].g_iMeleeImmunity, g_esTankCache[tank].g_iMeleeImmunity, 1); + g_esTankCache[tank].g_iMinimumHumans = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iMinimumHumans, g_esTank[iType].g_iMinimumHumans, g_esSpecific.g_iMinimumHumans, g_esGeneral.g_iMinimumHumans, 1); + g_esTankCache[tank].g_iMinimumHumans = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iMinimumHumans, g_esPlayer[tank].g_iMinimumHumans, g_esTankCache[tank].g_iMinimumHumans, g_esTankCache[tank].g_iMinimumHumans, 1); + g_esTankCache[tank].g_iMultiplyHealth = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iMultiplyHealth, g_esTank[iType].g_iMultiplyHealth, g_esSpecific.g_iMultiplyHealth, g_esGeneral.g_iMultiplyHealth, 1); + g_esTankCache[tank].g_iMultiplyHealth = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iMultiplyHealth, g_esPlayer[tank].g_iMultiplyHealth, g_esTankCache[tank].g_iMultiplyHealth, g_esTankCache[tank].g_iMultiplyHealth, 1); + g_esTankCache[tank].g_iPassiveHealth = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iPassiveHealth, g_esTank[iType].g_iPassiveHealth, g_esSpecific.g_iPassiveHealth, g_esGeneral.g_iPassiveHealth, 2, -1); + g_esTankCache[tank].g_iPassiveHealth = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iPassiveHealth, g_esPlayer[tank].g_iPassiveHealth, g_esTankCache[tank].g_iPassiveHealth, g_esTankCache[tank].g_iPassiveHealth, 2, -1); + g_esTankCache[tank].g_iRandomSpecial = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iRandomSpecial, g_esPlayer[tank].g_iRandomTank, g_esSpecial[iType].g_iRandomSpecial, g_esTank[iType].g_iRandomTank, 1); + g_esTankCache[tank].g_iSpawnProtection = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iSpawnProtection, g_esTank[iType].g_iSpawnProtection, g_esSpecific.g_iSpawnProtection, g_esGeneral.g_iSpawnProtection, 1); + g_esTankCache[tank].g_iSpawnProtection = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iSpawnProtection, g_esPlayer[tank].g_iSpawnProtection, g_esTankCache[tank].g_iSpawnProtection, g_esTankCache[tank].g_iSpawnProtection, 1); + g_esTankCache[tank].g_iSpawnType = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iSpawnType, g_esPlayer[tank].g_iSpawnType, g_esSpecial[iType].g_iSpawnType, g_esTank[iType].g_iSpawnType, 1); + g_esTankCache[tank].g_iSpecialNote = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iSpecialNote, g_esTank[iType].g_iTankNote, g_esSpecific.g_iSpecialNote, g_esGeneral.g_iTankNote, 1); + g_esTankCache[tank].g_iSpecialNote = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iSpecialNote, g_esPlayer[tank].g_iTankNote, g_esTankCache[tank].g_iSpecialNote, g_esTankCache[tank].g_iTankNote, 1); + g_esTankCache[tank].g_iThrowRock = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iThrowRock, g_esTank[iType].g_iThrowRock, g_esSpecific.g_iThrowRock, g_esGeneral.g_iThrowRock, 1); + g_esTankCache[tank].g_iThrowRock = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iThrowRock, g_esPlayer[tank].g_iThrowRock, g_esTankCache[tank].g_iThrowRock, g_esTankCache[tank].g_iThrowRock, 1); + g_esTankCache[tank].g_iVocalizeArrival = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iVocalizeArrival, g_esTank[iType].g_iVocalizeArrival, g_esSpecific.g_iVocalizeArrival, g_esGeneral.g_iVocalizeArrival, 1); + g_esTankCache[tank].g_iVocalizeArrival = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iVocalizeArrival, g_esPlayer[tank].g_iVocalizeArrival, g_esTankCache[tank].g_iVocalizeArrival, g_esTankCache[tank].g_iVocalizeArrival, 1); + g_esTankCache[tank].g_iVocalizeDeath = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iVocalizeDeath, g_esTank[iType].g_iVocalizeDeath, g_esSpecific.g_iVocalizeDeath, g_esGeneral.g_iVocalizeDeath, 1); + g_esTankCache[tank].g_iVocalizeDeath = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iVocalizeDeath, g_esPlayer[tank].g_iVocalizeDeath, g_esTankCache[tank].g_iVocalizeDeath, g_esTankCache[tank].g_iVocalizeDeath, 1); + g_esTankCache[tank].g_iVomitImmunity = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iVomitImmunity, g_esTank[iType].g_iVomitImmunity, g_esSpecific.g_iVomitImmunity, g_esGeneral.g_iVomitImmunity, 1); + g_esTankCache[tank].g_iVomitImmunity = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iVomitImmunity, g_esPlayer[tank].g_iVomitImmunity, g_esTankCache[tank].g_iVomitImmunity, g_esTankCache[tank].g_iVomitImmunity, 1); + + vGetSubSettingValue(bAccess, true, g_esTankCache[tank].g_sArmorCharacters, sizeof esTankCache::g_sArmorCharacters, g_esSpecial[iType].g_sArmorCharacters, g_esTank[iType].g_sArmorCharacters, g_esSpecific.g_sArmorCharacters, g_esGeneral.g_sArmorCharacters); + vGetSubSettingValue(bAccess, bHuman, g_esTankCache[tank].g_sArmorCharacters, sizeof esTankCache::g_sArmorCharacters, g_esTeammate[tank].g_sArmorCharacters, g_esPlayer[tank].g_sArmorCharacters, g_esTankCache[tank].g_sArmorCharacters, g_esTankCache[tank].g_sArmorCharacters); + vGetSubSettingValue(bAccess, true, g_esTankCache[tank].g_sBodyColorVisual, sizeof esTankCache::g_sBodyColorVisual, g_esSpecial[iType].g_sBodyColorVisual, g_esTank[iType].g_sBodyColorVisual, g_esSpecific.g_sBodyColorVisual, g_esGeneral.g_sBodyColorVisual); + vGetSubSettingValue(bAccess, bHuman, g_esTankCache[tank].g_sBodyColorVisual, sizeof esTankCache::g_sBodyColorVisual, g_esTeammate[tank].g_sBodyColorVisual, g_esPlayer[tank].g_sBodyColorVisual, g_esTankCache[tank].g_sBodyColorVisual, g_esTankCache[tank].g_sBodyColorVisual); + vGetSubSettingValue(bAccess, true, g_esTankCache[tank].g_sBodyColorVisual2, sizeof esTankCache::g_sBodyColorVisual2, g_esSpecial[iType].g_sBodyColorVisual2, g_esTank[iType].g_sBodyColorVisual2, g_esSpecific.g_sBodyColorVisual2, g_esGeneral.g_sBodyColorVisual2); + vGetSubSettingValue(bAccess, bHuman, g_esTankCache[tank].g_sBodyColorVisual2, sizeof esTankCache::g_sBodyColorVisual2, g_esTeammate[tank].g_sBodyColorVisual2, g_esPlayer[tank].g_sBodyColorVisual2, g_esTankCache[tank].g_sBodyColorVisual2, g_esTankCache[tank].g_sBodyColorVisual2); + vGetSubSettingValue(bAccess, true, g_esTankCache[tank].g_sBodyColorVisual3, sizeof esTankCache::g_sBodyColorVisual3, g_esSpecial[iType].g_sBodyColorVisual3, g_esTank[iType].g_sBodyColorVisual3, g_esSpecific.g_sBodyColorVisual3, g_esGeneral.g_sBodyColorVisual3); + vGetSubSettingValue(bAccess, bHuman, g_esTankCache[tank].g_sBodyColorVisual3, sizeof esTankCache::g_sBodyColorVisual3, g_esTeammate[tank].g_sBodyColorVisual3, g_esPlayer[tank].g_sBodyColorVisual3, g_esTankCache[tank].g_sBodyColorVisual3, g_esTankCache[tank].g_sBodyColorVisual3); + vGetSubSettingValue(bAccess, true, g_esTankCache[tank].g_sBodyColorVisual4, sizeof esTankCache::g_sBodyColorVisual4, g_esSpecial[iType].g_sBodyColorVisual4, g_esTank[iType].g_sBodyColorVisual4, g_esSpecific.g_sBodyColorVisual4, g_esGeneral.g_sBodyColorVisual4); + vGetSubSettingValue(bAccess, bHuman, g_esTankCache[tank].g_sBodyColorVisual4, sizeof esTankCache::g_sBodyColorVisual4, g_esTeammate[tank].g_sBodyColorVisual4, g_esPlayer[tank].g_sBodyColorVisual4, g_esTankCache[tank].g_sBodyColorVisual4, g_esTankCache[tank].g_sBodyColorVisual4); + vGetSubSettingValue(bAccess, bHuman, g_esTankCache[tank].g_sComboSet, sizeof esTankCache::g_sComboSet, g_esTeammate[tank].g_sComboSet, g_esPlayer[tank].g_sComboSet, g_esSpecial[iType].g_sComboSet, g_esTank[iType].g_sComboSet); + vGetSubSettingValue(bAccess, true, g_esTankCache[tank].g_sFallVoicelineReward, sizeof esTankCache::g_sFallVoicelineReward, g_esSpecial[iType].g_sFallVoicelineReward, g_esTank[iType].g_sFallVoicelineReward, g_esSpecific.g_sFallVoicelineReward, g_esGeneral.g_sFallVoicelineReward); + vGetSubSettingValue(bAccess, bHuman, g_esTankCache[tank].g_sFallVoicelineReward, sizeof esTankCache::g_sFallVoicelineReward, g_esTeammate[tank].g_sFallVoicelineReward, g_esPlayer[tank].g_sFallVoicelineReward, g_esTankCache[tank].g_sFallVoicelineReward, g_esTankCache[tank].g_sFallVoicelineReward); + vGetSubSettingValue(bAccess, true, g_esTankCache[tank].g_sFallVoicelineReward2, sizeof esTankCache::g_sFallVoicelineReward2, g_esSpecial[iType].g_sFallVoicelineReward2, g_esTank[iType].g_sFallVoicelineReward2, g_esSpecific.g_sFallVoicelineReward2, g_esGeneral.g_sFallVoicelineReward2); + vGetSubSettingValue(bAccess, bHuman, g_esTankCache[tank].g_sFallVoicelineReward2, sizeof esTankCache::g_sFallVoicelineReward2, g_esTeammate[tank].g_sFallVoicelineReward2, g_esPlayer[tank].g_sFallVoicelineReward2, g_esTankCache[tank].g_sFallVoicelineReward2, g_esTankCache[tank].g_sFallVoicelineReward2); + vGetSubSettingValue(bAccess, true, g_esTankCache[tank].g_sFallVoicelineReward3, sizeof esTankCache::g_sFallVoicelineReward3, g_esSpecial[iType].g_sFallVoicelineReward3, g_esTank[iType].g_sFallVoicelineReward3, g_esSpecific.g_sFallVoicelineReward3, g_esGeneral.g_sFallVoicelineReward3); + vGetSubSettingValue(bAccess, bHuman, g_esTankCache[tank].g_sFallVoicelineReward3, sizeof esTankCache::g_sFallVoicelineReward3, g_esTeammate[tank].g_sFallVoicelineReward3, g_esPlayer[tank].g_sFallVoicelineReward3, g_esTankCache[tank].g_sFallVoicelineReward3, g_esTankCache[tank].g_sFallVoicelineReward3); + vGetSubSettingValue(bAccess, true, g_esTankCache[tank].g_sFallVoicelineReward4, sizeof esTankCache::g_sFallVoicelineReward4, g_esSpecial[iType].g_sFallVoicelineReward4, g_esTank[iType].g_sFallVoicelineReward4, g_esSpecific.g_sFallVoicelineReward4, g_esGeneral.g_sFallVoicelineReward4); + vGetSubSettingValue(bAccess, bHuman, g_esTankCache[tank].g_sFallVoicelineReward4, sizeof esTankCache::g_sFallVoicelineReward4, g_esTeammate[tank].g_sFallVoicelineReward4, g_esPlayer[tank].g_sFallVoicelineReward4, g_esTankCache[tank].g_sFallVoicelineReward4, g_esTankCache[tank].g_sFallVoicelineReward4); + vGetSubSettingValue(bAccess, true, g_esTankCache[tank].g_sHealthCharacters, sizeof esTankCache::g_sHealthCharacters, g_esSpecial[iType].g_sHealthCharacters, g_esTank[iType].g_sHealthCharacters, g_esSpecific.g_sHealthCharacters, g_esGeneral.g_sHealthCharacters); + vGetSubSettingValue(bAccess, bHuman, g_esTankCache[tank].g_sHealthCharacters, sizeof esTankCache::g_sHealthCharacters, g_esTeammate[tank].g_sHealthCharacters, g_esPlayer[tank].g_sHealthCharacters, g_esTankCache[tank].g_sHealthCharacters, g_esTankCache[tank].g_sHealthCharacters); + vGetSubSettingValue(bAccess, true, g_esTankCache[tank].g_sItemReward, sizeof esTankCache::g_sItemReward, g_esSpecial[iType].g_sItemReward, g_esTank[iType].g_sItemReward, g_esSpecific.g_sItemReward, g_esGeneral.g_sItemReward); + vGetSubSettingValue(bAccess, bHuman, g_esTankCache[tank].g_sItemReward, sizeof esTankCache::g_sItemReward, g_esTeammate[tank].g_sItemReward, g_esPlayer[tank].g_sItemReward, g_esTankCache[tank].g_sItemReward, g_esTankCache[tank].g_sItemReward); + vGetSubSettingValue(bAccess, true, g_esTankCache[tank].g_sItemReward2, sizeof esTankCache::g_sItemReward2, g_esSpecial[iType].g_sItemReward2, g_esTank[iType].g_sItemReward2, g_esSpecific.g_sItemReward2, g_esGeneral.g_sItemReward2); + vGetSubSettingValue(bAccess, bHuman, g_esTankCache[tank].g_sItemReward2, sizeof esTankCache::g_sItemReward2, g_esTeammate[tank].g_sItemReward2, g_esPlayer[tank].g_sItemReward2, g_esTankCache[tank].g_sItemReward2, g_esTankCache[tank].g_sItemReward2); + vGetSubSettingValue(bAccess, true, g_esTankCache[tank].g_sItemReward3, sizeof esTankCache::g_sItemReward3, g_esSpecial[iType].g_sItemReward3, g_esTank[iType].g_sItemReward3, g_esSpecific.g_sItemReward3, g_esGeneral.g_sItemReward3); + vGetSubSettingValue(bAccess, bHuman, g_esTankCache[tank].g_sItemReward3, sizeof esTankCache::g_sItemReward3, g_esTeammate[tank].g_sItemReward3, g_esPlayer[tank].g_sItemReward3, g_esTankCache[tank].g_sItemReward3, g_esTankCache[tank].g_sItemReward3); + vGetSubSettingValue(bAccess, true, g_esTankCache[tank].g_sItemReward4, sizeof esTankCache::g_sItemReward4, g_esSpecial[iType].g_sItemReward4, g_esTank[iType].g_sItemReward4, g_esSpecific.g_sItemReward4, g_esGeneral.g_sItemReward4); + vGetSubSettingValue(bAccess, bHuman, g_esTankCache[tank].g_sItemReward4, sizeof esTankCache::g_sItemReward4, g_esTeammate[tank].g_sItemReward4, g_esPlayer[tank].g_sItemReward4, g_esTankCache[tank].g_sItemReward4, g_esTankCache[tank].g_sItemReward4); + vGetSubSettingValue(bAccess, true, g_esTankCache[tank].g_sLightColorVisual, sizeof esTankCache::g_sLightColorVisual, g_esSpecial[iType].g_sLightColorVisual, g_esTank[iType].g_sLightColorVisual, g_esSpecific.g_sLightColorVisual, g_esGeneral.g_sLightColorVisual); + vGetSubSettingValue(bAccess, bHuman, g_esTankCache[tank].g_sLightColorVisual, sizeof esTankCache::g_sLightColorVisual, g_esTeammate[tank].g_sLightColorVisual, g_esPlayer[tank].g_sLightColorVisual, g_esTankCache[tank].g_sLightColorVisual, g_esTankCache[tank].g_sLightColorVisual); + vGetSubSettingValue(bAccess, true, g_esTankCache[tank].g_sLightColorVisual2, sizeof esTankCache::g_sLightColorVisual2, g_esSpecial[iType].g_sLightColorVisual2, g_esTank[iType].g_sLightColorVisual2, g_esSpecific.g_sLightColorVisual2, g_esGeneral.g_sLightColorVisual2); + vGetSubSettingValue(bAccess, bHuman, g_esTankCache[tank].g_sLightColorVisual2, sizeof esTankCache::g_sLightColorVisual2, g_esTeammate[tank].g_sLightColorVisual2, g_esPlayer[tank].g_sLightColorVisual2, g_esTankCache[tank].g_sLightColorVisual2, g_esTankCache[tank].g_sLightColorVisual2); + vGetSubSettingValue(bAccess, true, g_esTankCache[tank].g_sLightColorVisual3, sizeof esTankCache::g_sLightColorVisual3, g_esSpecial[iType].g_sLightColorVisual3, g_esTank[iType].g_sLightColorVisual3, g_esSpecific.g_sLightColorVisual3, g_esGeneral.g_sLightColorVisual3); + vGetSubSettingValue(bAccess, bHuman, g_esTankCache[tank].g_sLightColorVisual3, sizeof esTankCache::g_sLightColorVisual3, g_esTeammate[tank].g_sLightColorVisual3, g_esPlayer[tank].g_sLightColorVisual3, g_esTankCache[tank].g_sLightColorVisual3, g_esTankCache[tank].g_sLightColorVisual3); + vGetSubSettingValue(bAccess, true, g_esTankCache[tank].g_sLightColorVisual4, sizeof esTankCache::g_sLightColorVisual4, g_esSpecial[iType].g_sLightColorVisual4, g_esTank[iType].g_sLightColorVisual4, g_esSpecific.g_sLightColorVisual4, g_esGeneral.g_sLightColorVisual4); + vGetSubSettingValue(bAccess, bHuman, g_esTankCache[tank].g_sLightColorVisual4, sizeof esTankCache::g_sLightColorVisual4, g_esTeammate[tank].g_sLightColorVisual4, g_esPlayer[tank].g_sLightColorVisual4, g_esTankCache[tank].g_sLightColorVisual4, g_esTankCache[tank].g_sLightColorVisual4); + vGetSubSettingValue(bAccess, true, g_esTankCache[tank].g_sLoopingVoicelineVisual, sizeof esTankCache::g_sLoopingVoicelineVisual, g_esSpecial[iType].g_sLoopingVoicelineVisual, g_esTank[iType].g_sLoopingVoicelineVisual, g_esSpecific.g_sLoopingVoicelineVisual, g_esGeneral.g_sLoopingVoicelineVisual); + vGetSubSettingValue(bAccess, bHuman, g_esTankCache[tank].g_sLoopingVoicelineVisual, sizeof esTankCache::g_sLoopingVoicelineVisual, g_esTeammate[tank].g_sLoopingVoicelineVisual, g_esPlayer[tank].g_sLoopingVoicelineVisual, g_esTankCache[tank].g_sLoopingVoicelineVisual, g_esTankCache[tank].g_sLoopingVoicelineVisual); + vGetSubSettingValue(bAccess, true, g_esTankCache[tank].g_sLoopingVoicelineVisual2, sizeof esTankCache::g_sLoopingVoicelineVisual2, g_esSpecial[iType].g_sLoopingVoicelineVisual2, g_esTank[iType].g_sLoopingVoicelineVisual2, g_esSpecific.g_sLoopingVoicelineVisual2, g_esGeneral.g_sLoopingVoicelineVisual2); + vGetSubSettingValue(bAccess, bHuman, g_esTankCache[tank].g_sLoopingVoicelineVisual2, sizeof esTankCache::g_sLoopingVoicelineVisual2, g_esTeammate[tank].g_sLoopingVoicelineVisual2, g_esPlayer[tank].g_sLoopingVoicelineVisual2, g_esTankCache[tank].g_sLoopingVoicelineVisual2, g_esTankCache[tank].g_sLoopingVoicelineVisual2); + vGetSubSettingValue(bAccess, true, g_esTankCache[tank].g_sLoopingVoicelineVisual3, sizeof esTankCache::g_sLoopingVoicelineVisual3, g_esSpecial[iType].g_sLoopingVoicelineVisual3, g_esTank[iType].g_sLoopingVoicelineVisual3, g_esSpecific.g_sLoopingVoicelineVisual3, g_esGeneral.g_sLoopingVoicelineVisual3); + vGetSubSettingValue(bAccess, bHuman, g_esTankCache[tank].g_sLoopingVoicelineVisual3, sizeof esTankCache::g_sLoopingVoicelineVisual3, g_esTeammate[tank].g_sLoopingVoicelineVisual3, g_esPlayer[tank].g_sLoopingVoicelineVisual3, g_esTankCache[tank].g_sLoopingVoicelineVisual3, g_esTankCache[tank].g_sLoopingVoicelineVisual3); + vGetSubSettingValue(bAccess, true, g_esTankCache[tank].g_sLoopingVoicelineVisual4, sizeof esTankCache::g_sLoopingVoicelineVisual4, g_esSpecial[iType].g_sLoopingVoicelineVisual4, g_esTank[iType].g_sLoopingVoicelineVisual4, g_esSpecific.g_sLoopingVoicelineVisual4, g_esGeneral.g_sLoopingVoicelineVisual4); + vGetSubSettingValue(bAccess, bHuman, g_esTankCache[tank].g_sLoopingVoicelineVisual4, sizeof esTankCache::g_sLoopingVoicelineVisual4, g_esTeammate[tank].g_sLoopingVoicelineVisual4, g_esPlayer[tank].g_sLoopingVoicelineVisual4, g_esTankCache[tank].g_sLoopingVoicelineVisual4, g_esTankCache[tank].g_sLoopingVoicelineVisual4); + vGetSubSettingValue(bAccess, true, g_esTankCache[tank].g_sOutlineColorVisual, sizeof esTankCache::g_sOutlineColorVisual, g_esSpecial[iType].g_sOutlineColorVisual, g_esTank[iType].g_sOutlineColorVisual, g_esSpecific.g_sOutlineColorVisual, g_esGeneral.g_sOutlineColorVisual); + vGetSubSettingValue(bAccess, bHuman, g_esTankCache[tank].g_sOutlineColorVisual, sizeof esTankCache::g_sOutlineColorVisual, g_esTeammate[tank].g_sOutlineColorVisual, g_esPlayer[tank].g_sOutlineColorVisual, g_esTankCache[tank].g_sOutlineColorVisual, g_esTankCache[tank].g_sOutlineColorVisual); + vGetSubSettingValue(bAccess, true, g_esTankCache[tank].g_sOutlineColorVisual2, sizeof esTankCache::g_sOutlineColorVisual2, g_esSpecial[iType].g_sOutlineColorVisual2, g_esTank[iType].g_sOutlineColorVisual2, g_esSpecific.g_sOutlineColorVisual2, g_esGeneral.g_sOutlineColorVisual2); + vGetSubSettingValue(bAccess, bHuman, g_esTankCache[tank].g_sOutlineColorVisual2, sizeof esTankCache::g_sOutlineColorVisual2, g_esTeammate[tank].g_sOutlineColorVisual2, g_esPlayer[tank].g_sOutlineColorVisual2, g_esTankCache[tank].g_sOutlineColorVisual2, g_esTankCache[tank].g_sOutlineColorVisual2); + vGetSubSettingValue(bAccess, true, g_esTankCache[tank].g_sOutlineColorVisual3, sizeof esTankCache::g_sOutlineColorVisual3, g_esSpecial[iType].g_sOutlineColorVisual3, g_esTank[iType].g_sOutlineColorVisual3, g_esSpecific.g_sOutlineColorVisual3, g_esGeneral.g_sOutlineColorVisual3); + vGetSubSettingValue(bAccess, bHuman, g_esTankCache[tank].g_sOutlineColorVisual3, sizeof esTankCache::g_sOutlineColorVisual3, g_esTeammate[tank].g_sOutlineColorVisual3, g_esPlayer[tank].g_sOutlineColorVisual3, g_esTankCache[tank].g_sOutlineColorVisual3, g_esTankCache[tank].g_sOutlineColorVisual3); + vGetSubSettingValue(bAccess, true, g_esTankCache[tank].g_sOutlineColorVisual4, sizeof esTankCache::g_sOutlineColorVisual4, g_esSpecial[iType].g_sOutlineColorVisual4, g_esTank[iType].g_sOutlineColorVisual4, g_esSpecific.g_sOutlineColorVisual4, g_esGeneral.g_sOutlineColorVisual4); + vGetSubSettingValue(bAccess, bHuman, g_esTankCache[tank].g_sOutlineColorVisual4, sizeof esTankCache::g_sOutlineColorVisual4, g_esTeammate[tank].g_sOutlineColorVisual4, g_esPlayer[tank].g_sOutlineColorVisual4, g_esTankCache[tank].g_sOutlineColorVisual4, g_esTankCache[tank].g_sOutlineColorVisual4); + vGetSubSettingValue(bAccess, true, g_esTankCache[tank].g_sScreenColorVisual, sizeof esTankCache::g_sScreenColorVisual, g_esSpecial[iType].g_sScreenColorVisual, g_esTank[iType].g_sScreenColorVisual, g_esSpecific.g_sScreenColorVisual, g_esGeneral.g_sScreenColorVisual); + vGetSubSettingValue(bAccess, bHuman, g_esTankCache[tank].g_sScreenColorVisual, sizeof esTankCache::g_sScreenColorVisual, g_esTeammate[tank].g_sScreenColorVisual, g_esPlayer[tank].g_sScreenColorVisual, g_esTankCache[tank].g_sScreenColorVisual, g_esTankCache[tank].g_sScreenColorVisual); + vGetSubSettingValue(bAccess, true, g_esTankCache[tank].g_sScreenColorVisual2, sizeof esTankCache::g_sScreenColorVisual2, g_esSpecial[iType].g_sScreenColorVisual2, g_esTank[iType].g_sScreenColorVisual2, g_esSpecific.g_sScreenColorVisual2, g_esGeneral.g_sScreenColorVisual2); + vGetSubSettingValue(bAccess, bHuman, g_esTankCache[tank].g_sScreenColorVisual2, sizeof esTankCache::g_sScreenColorVisual2, g_esTeammate[tank].g_sScreenColorVisual2, g_esPlayer[tank].g_sScreenColorVisual2, g_esTankCache[tank].g_sScreenColorVisual2, g_esTankCache[tank].g_sScreenColorVisual2); + vGetSubSettingValue(bAccess, true, g_esTankCache[tank].g_sScreenColorVisual3, sizeof esTankCache::g_sScreenColorVisual3, g_esSpecial[iType].g_sScreenColorVisual3, g_esTank[iType].g_sScreenColorVisual3, g_esSpecific.g_sScreenColorVisual3, g_esGeneral.g_sScreenColorVisual3); + vGetSubSettingValue(bAccess, bHuman, g_esTankCache[tank].g_sScreenColorVisual3, sizeof esTankCache::g_sScreenColorVisual3, g_esTeammate[tank].g_sScreenColorVisual3, g_esPlayer[tank].g_sScreenColorVisual3, g_esTankCache[tank].g_sScreenColorVisual3, g_esTankCache[tank].g_sScreenColorVisual3); + vGetSubSettingValue(bAccess, true, g_esTankCache[tank].g_sScreenColorVisual4, sizeof esTankCache::g_sScreenColorVisual4, g_esSpecial[iType].g_sScreenColorVisual4, g_esTank[iType].g_sScreenColorVisual4, g_esSpecific.g_sScreenColorVisual4, g_esGeneral.g_sScreenColorVisual4); + vGetSubSettingValue(bAccess, bHuman, g_esTankCache[tank].g_sScreenColorVisual4, sizeof esTankCache::g_sScreenColorVisual4, g_esTeammate[tank].g_sScreenColorVisual4, g_esPlayer[tank].g_sScreenColorVisual4, g_esTankCache[tank].g_sScreenColorVisual4, g_esTankCache[tank].g_sScreenColorVisual4); + vGetSubSettingValue(bAccess, true, g_esTankCache[tank].g_sShieldCharacters, sizeof esTankCache::g_sShieldCharacters, g_esSpecial[iType].g_sShieldCharacters, g_esTank[iType].g_sShieldCharacters, g_esSpecific.g_sShieldCharacters, g_esGeneral.g_sShieldCharacters); + vGetSubSettingValue(bAccess, bHuman, g_esTankCache[tank].g_sShieldCharacters, sizeof esTankCache::g_sShieldCharacters, g_esTeammate[tank].g_sShieldCharacters, g_esPlayer[tank].g_sShieldCharacters, g_esTankCache[tank].g_sShieldCharacters, g_esTankCache[tank].g_sShieldCharacters); + vGetSettingValue(bAccess, bHuman, g_esTankCache[tank].g_sSmokerName, sizeof esTankCache::g_sSmokerName, g_esTeammate[tank].g_sSmokerName, g_esSpecial[iType].g_sSmokerName); + vGetSettingValue(bAccess, bHuman, g_esTankCache[tank].g_sBoomerName, sizeof esTankCache::g_sBoomerName, g_esTeammate[tank].g_sBoomerName, g_esSpecial[iType].g_sBoomerName); + vGetSettingValue(bAccess, bHuman, g_esTankCache[tank].g_sHunterName, sizeof esTankCache::g_sHunterName, g_esTeammate[tank].g_sHunterName, g_esSpecial[iType].g_sHunterName); + vGetSettingValue(bAccess, bHuman, g_esTankCache[tank].g_sSpitterName, sizeof esTankCache::g_sSpitterName, g_esTeammate[tank].g_sSpitterName, g_esSpecial[iType].g_sSpitterName); + vGetSettingValue(bAccess, bHuman, g_esTankCache[tank].g_sJockeyName, sizeof esTankCache::g_sJockeyName, g_esTeammate[tank].g_sJockeyName, g_esSpecial[iType].g_sJockeyName); + vGetSettingValue(bAccess, bHuman, g_esTankCache[tank].g_sChargerName, sizeof esTankCache::g_sChargerName, g_esTeammate[tank].g_sChargerName, g_esSpecial[iType].g_sChargerName); + + for (int iPos = 0; iPos < (sizeof esTankCache::g_iTransformType); iPos++) + { + g_esTankCache[tank].g_iTransformType[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iTransformType[iPos], g_esPlayer[tank].g_iTransformType[iPos], g_esSpecial[iType].g_iTransformType[iPos], g_esTank[iType].g_iTransformType[iPos], 1); -void vSetupTankSpawn(int admin, int specType, char[] type, bool spawn = false, bool log = true, int amount = 1, int mode = 0, bool blind = true) -{ - g_esGeneral.g_bBlindType = blind; - int iType = StringToInt(type); + if (iPos < (sizeof esTankCache::g_iRewardEnabled)) + { + g_esTankCache[tank].g_flActionDurationReward[iPos] = flGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_flActionDurationReward[iPos], g_esTank[iType].g_flActionDurationReward[iPos], g_esSpecific.g_flActionDurationReward[iPos], g_esGeneral.g_flActionDurationReward[iPos], 1); + g_esTankCache[tank].g_flActionDurationReward[iPos] = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flActionDurationReward[iPos], g_esPlayer[tank].g_flActionDurationReward[iPos], g_esTankCache[tank].g_flActionDurationReward[iPos], g_esTankCache[tank].g_flActionDurationReward[iPos], 1); + g_esTankCache[tank].g_flAdrenalineTimeReward[iPos] = flGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_flAdrenalineTimeReward[iPos], g_esTank[iType].g_flAdrenalineTimeReward[iPos], g_esSpecific.g_flAdrenalineTimeReward[iPos], g_esGeneral.g_flAdrenalineTimeReward[iPos], 1); + g_esTankCache[tank].g_flAdrenalineTimeReward[iPos] = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flAdrenalineTimeReward[iPos], g_esPlayer[tank].g_flAdrenalineTimeReward[iPos], g_esTankCache[tank].g_flAdrenalineTimeReward[iPos], g_esTankCache[tank].g_flAdrenalineTimeReward[iPos], 1); + g_esTankCache[tank].g_iAmmoBoostReward[iPos] = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iAmmoBoostReward[iPos], g_esTank[iType].g_iAmmoBoostReward[iPos], g_esSpecific.g_iAmmoBoostReward[iPos], g_esGeneral.g_iAmmoBoostReward[iPos], 1); + g_esTankCache[tank].g_iAmmoBoostReward[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iAmmoBoostReward[iPos], g_esPlayer[tank].g_iAmmoBoostReward[iPos], g_esTankCache[tank].g_iAmmoBoostReward[iPos], g_esTankCache[tank].g_iAmmoBoostReward[iPos], 1); + g_esTankCache[tank].g_iAmmoRefillReward[iPos] = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iAmmoRefillReward[iPos], g_esTank[iType].g_iAmmoRefillReward[iPos], g_esSpecific.g_iAmmoRefillReward[iPos], g_esGeneral.g_iAmmoRefillReward[iPos], 1); + g_esTankCache[tank].g_iAmmoRefillReward[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iAmmoRefillReward[iPos], g_esPlayer[tank].g_iAmmoRefillReward[iPos], g_esTankCache[tank].g_iAmmoRefillReward[iPos], g_esTankCache[tank].g_iAmmoRefillReward[iPos], 1); + g_esTankCache[tank].g_iAmmoRegenReward[iPos] = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iAmmoRegenReward[iPos], g_esTank[iType].g_iAmmoRegenReward[iPos], g_esSpecific.g_iAmmoRegenReward[iPos], g_esGeneral.g_iAmmoRegenReward[iPos], 1); + g_esTankCache[tank].g_iAmmoRegenReward[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iAmmoRegenReward[iPos], g_esPlayer[tank].g_iAmmoRegenReward[iPos], g_esTankCache[tank].g_iAmmoRegenReward[iPos], g_esTankCache[tank].g_iAmmoRegenReward[iPos], 1); + g_esTankCache[tank].g_flAttackBoostReward[iPos] = flGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_flAttackBoostReward[iPos], g_esTank[iType].g_flAttackBoostReward[iPos], g_esSpecific.g_flAttackBoostReward[iPos], g_esGeneral.g_flAttackBoostReward[iPos], 1); + g_esTankCache[tank].g_flAttackBoostReward[iPos] = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flAttackBoostReward[iPos], g_esPlayer[tank].g_flAttackBoostReward[iPos], g_esTankCache[tank].g_flAttackBoostReward[iPos], g_esTankCache[tank].g_flAttackBoostReward[iPos], 1); + g_esTankCache[tank].g_iBlazeHealthReward[iPos] = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iBlazeHealthReward[iPos], g_esTank[iType].g_iBlazeHealthReward[iPos], g_esSpecific.g_iBlazeHealthReward[iPos], g_esGeneral.g_iBlazeHealthReward[iPos], 1); + g_esTankCache[tank].g_iBlazeHealthReward[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iBlazeHealthReward[iPos], g_esPlayer[tank].g_iBlazeHealthReward[iPos], g_esTankCache[tank].g_iBlazeHealthReward[iPos], g_esTankCache[tank].g_iBlazeHealthReward[iPos], 1); + g_esTankCache[tank].g_iBloodDonorReward[iPos] = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iBloodDonorReward[iPos], g_esTank[iType].g_iBloodDonorReward[iPos], g_esSpecific.g_iBloodDonorReward[iPos], g_esGeneral.g_iBloodDonorReward[iPos], 1); + g_esTankCache[tank].g_iBloodDonorReward[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iBloodDonorReward[iPos], g_esPlayer[tank].g_iBloodDonorReward[iPos], g_esTankCache[tank].g_iBloodDonorReward[iPos], g_esTankCache[tank].g_iBloodDonorReward[iPos], 1); + g_esTankCache[tank].g_iBunnyHopReward[iPos] = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iBunnyHopReward[iPos], g_esTank[iType].g_iBunnyHopReward[iPos], g_esSpecific.g_iBunnyHopReward[iPos], g_esGeneral.g_iBunnyHopReward[iPos], 1); + g_esTankCache[tank].g_iBunnyHopReward[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iBunnyHopReward[iPos], g_esPlayer[tank].g_iBunnyHopReward[iPos], g_esTankCache[tank].g_iBunnyHopReward[iPos], g_esTankCache[tank].g_iBunnyHopReward[iPos], 1); + g_esTankCache[tank].g_iBurstDoorsReward[iPos] = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iBurstDoorsReward[iPos], g_esTank[iType].g_iBurstDoorsReward[iPos], g_esSpecific.g_iBurstDoorsReward[iPos], g_esGeneral.g_iBurstDoorsReward[iPos], 1); + g_esTankCache[tank].g_iBurstDoorsReward[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iBurstDoorsReward[iPos], g_esPlayer[tank].g_iBurstDoorsReward[iPos], g_esTankCache[tank].g_iBurstDoorsReward[iPos], g_esTankCache[tank].g_iBurstDoorsReward[iPos], 1); + g_esTankCache[tank].g_iCleanKillsReward[iPos] = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iCleanKillsReward[iPos], g_esTank[iType].g_iCleanKillsReward[iPos], g_esSpecific.g_iCleanKillsReward[iPos], g_esGeneral.g_iCleanKillsReward[iPos], 1); + g_esTankCache[tank].g_iCleanKillsReward[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iCleanKillsReward[iPos], g_esPlayer[tank].g_iCleanKillsReward[iPos], g_esTankCache[tank].g_iCleanKillsReward[iPos], g_esTankCache[tank].g_iCleanKillsReward[iPos], 1); + g_esTankCache[tank].g_iClusterBombsReward[iPos] = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iClusterBombsReward[iPos], g_esTank[iType].g_iClusterBombsReward[iPos], g_esSpecific.g_iClusterBombsReward[iPos], g_esGeneral.g_iClusterBombsReward[iPos], 1); + g_esTankCache[tank].g_iClusterBombsReward[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iClusterBombsReward[iPos], g_esPlayer[tank].g_iClusterBombsReward[iPos], g_esTankCache[tank].g_iClusterBombsReward[iPos], g_esTankCache[tank].g_iClusterBombsReward[iPos], 1); + g_esTankCache[tank].g_flDamageBoostReward[iPos] = flGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_flDamageBoostReward[iPos], g_esTank[iType].g_flDamageBoostReward[iPos], g_esSpecific.g_flDamageBoostReward[iPos], g_esGeneral.g_flDamageBoostReward[iPos], 1); + g_esTankCache[tank].g_flDamageBoostReward[iPos] = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flDamageBoostReward[iPos], g_esPlayer[tank].g_flDamageBoostReward[iPos], g_esTankCache[tank].g_flDamageBoostReward[iPos], g_esTankCache[tank].g_flDamageBoostReward[iPos], 1); + g_esTankCache[tank].g_flDamageResistanceReward[iPos] = flGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_flDamageResistanceReward[iPos], g_esTank[iType].g_flDamageResistanceReward[iPos], g_esSpecific.g_flDamageResistanceReward[iPos], g_esGeneral.g_flDamageResistanceReward[iPos], 1); + g_esTankCache[tank].g_flDamageResistanceReward[iPos] = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flDamageResistanceReward[iPos], g_esPlayer[tank].g_flDamageResistanceReward[iPos], g_esTankCache[tank].g_flDamageResistanceReward[iPos], g_esTankCache[tank].g_flDamageResistanceReward[iPos], 1); + g_esTankCache[tank].g_flDopamineRadiusReward[iPos] = flGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_flDopamineRadiusReward[iPos], g_esTank[iType].g_flDopamineRadiusReward[iPos], g_esSpecific.g_flDopamineRadiusReward[iPos], g_esGeneral.g_flDopamineRadiusReward[iPos], 1); + g_esTankCache[tank].g_flDopamineRadiusReward[iPos] = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flDopamineRadiusReward[iPos], g_esPlayer[tank].g_flDopamineRadiusReward[iPos], g_esTankCache[tank].g_flDopamineRadiusReward[iPos], g_esTankCache[tank].g_flDopamineRadiusReward[iPos], 1); + g_esTankCache[tank].g_iEternalFlamesReward[iPos] = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iEternalFlamesReward[iPos], g_esTank[iType].g_iEternalFlamesReward[iPos], g_esSpecific.g_iEternalFlamesReward[iPos], g_esGeneral.g_iEternalFlamesReward[iPos], 1); + g_esTankCache[tank].g_iEternalFlamesReward[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iEternalFlamesReward[iPos], g_esPlayer[tank].g_iEternalFlamesReward[iPos], g_esTankCache[tank].g_iEternalFlamesReward[iPos], g_esTankCache[tank].g_iEternalFlamesReward[iPos], 1); + g_esTankCache[tank].g_iFastRecoveryReward[iPos] = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iFastRecoveryReward[iPos], g_esTank[iType].g_iFastRecoveryReward[iPos], g_esSpecific.g_iFastRecoveryReward[iPos], g_esGeneral.g_iFastRecoveryReward[iPos], 1); + g_esTankCache[tank].g_iFastRecoveryReward[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iFastRecoveryReward[iPos], g_esPlayer[tank].g_iFastRecoveryReward[iPos], g_esTankCache[tank].g_iFastRecoveryReward[iPos], g_esTankCache[tank].g_iFastRecoveryReward[iPos], 1); + g_esTankCache[tank].g_flFireRateReward[iPos] = flGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_flFireRateReward[iPos], g_esTank[iType].g_flFireRateReward[iPos], g_esSpecific.g_flFireRateReward[iPos], g_esGeneral.g_flFireRateReward[iPos], 1); + g_esTankCache[tank].g_flFireRateReward[iPos] = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flFireRateReward[iPos], g_esPlayer[tank].g_flFireRateReward[iPos], g_esTankCache[tank].g_flFireRateReward[iPos], g_esTankCache[tank].g_flFireRateReward[iPos], 1); + g_esTankCache[tank].g_iFriendlyFireReward[iPos] = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iFriendlyFireReward[iPos], g_esTank[iType].g_iFriendlyFireReward[iPos], g_esSpecific.g_iFriendlyFireReward[iPos], g_esGeneral.g_iFriendlyFireReward[iPos], 1); + g_esTankCache[tank].g_iFriendlyFireReward[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iFriendlyFireReward[iPos], g_esPlayer[tank].g_iFriendlyFireReward[iPos], g_esTankCache[tank].g_iFriendlyFireReward[iPos], g_esTankCache[tank].g_iFriendlyFireReward[iPos], 1); + g_esTankCache[tank].g_iGhostBulletsReward[iPos] = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iGhostBulletsReward[iPos], g_esTank[iType].g_iGhostBulletsReward[iPos], g_esSpecific.g_iGhostBulletsReward[iPos], g_esGeneral.g_iGhostBulletsReward[iPos], 1); + g_esTankCache[tank].g_iGhostBulletsReward[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iGhostBulletsReward[iPos], g_esPlayer[tank].g_iGhostBulletsReward[iPos], g_esTankCache[tank].g_iGhostBulletsReward[iPos], g_esTankCache[tank].g_iGhostBulletsReward[iPos], 1); + g_esTankCache[tank].g_flGrenadeLauncherReward[iPos] = flGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_flGrenadeLauncherReward[iPos], g_esTank[iType].g_flGrenadeLauncherReward[iPos], g_esSpecific.g_flGrenadeLauncherReward[iPos], g_esGeneral.g_flGrenadeLauncherReward[iPos], 1); + g_esTankCache[tank].g_flGrenadeLauncherReward[iPos] = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flGrenadeLauncherReward[iPos], g_esPlayer[tank].g_flGrenadeLauncherReward[iPos], g_esTankCache[tank].g_flGrenadeLauncherReward[iPos], g_esTankCache[tank].g_flGrenadeLauncherReward[iPos], 1); + g_esTankCache[tank].g_flHealPercentReward[iPos] = flGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_flHealPercentReward[iPos], g_esTank[iType].g_flHealPercentReward[iPos], g_esSpecific.g_flHealPercentReward[iPos], g_esGeneral.g_flHealPercentReward[iPos], 1); + g_esTankCache[tank].g_flHealPercentReward[iPos] = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flHealPercentReward[iPos], g_esPlayer[tank].g_flHealPercentReward[iPos], g_esTankCache[tank].g_flHealPercentReward[iPos], g_esTankCache[tank].g_flHealPercentReward[iPos], 1); + g_esTankCache[tank].g_flHealthcareRadiusReward[iPos] = flGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_flHealthcareRadiusReward[iPos], g_esTank[iType].g_flHealthcareRadiusReward[iPos], g_esSpecific.g_flHealthcareRadiusReward[iPos], g_esGeneral.g_flHealthcareRadiusReward[iPos], 1); + g_esTankCache[tank].g_flHealthcareRadiusReward[iPos] = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flHealthcareRadiusReward[iPos], g_esPlayer[tank].g_flHealthcareRadiusReward[iPos], g_esTankCache[tank].g_flHealthcareRadiusReward[iPos], g_esTankCache[tank].g_flHealthcareRadiusReward[iPos], 1); + g_esTankCache[tank].g_iHealthRegenReward[iPos] = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iHealthRegenReward[iPos], g_esTank[iType].g_iHealthRegenReward[iPos], g_esSpecific.g_iHealthRegenReward[iPos], g_esGeneral.g_iHealthRegenReward[iPos], 1); + g_esTankCache[tank].g_iHealthRegenReward[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iHealthRegenReward[iPos], g_esPlayer[tank].g_iHealthRegenReward[iPos], g_esTankCache[tank].g_iHealthRegenReward[iPos], g_esTankCache[tank].g_iHealthRegenReward[iPos], 1); + g_esTankCache[tank].g_flHeartbeatReward[iPos] = flGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_flHeartbeatReward[iPos], g_esTank[iType].g_flHeartbeatReward[iPos], g_esSpecific.g_flHeartbeatReward[iPos], g_esGeneral.g_flHeartbeatReward[iPos], 1); + g_esTankCache[tank].g_flHeartbeatReward[iPos] = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flHeartbeatReward[iPos], g_esPlayer[tank].g_flHeartbeatReward[iPos], g_esTankCache[tank].g_flHeartbeatReward[iPos], g_esTankCache[tank].g_flHeartbeatReward[iPos], 1); + g_esTankCache[tank].g_flHollowpointAmmoReward[iPos] = flGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_flHollowpointAmmoReward[iPos], g_esTank[iType].g_flHollowpointAmmoReward[iPos], g_esSpecific.g_flHollowpointAmmoReward[iPos], g_esGeneral.g_flHollowpointAmmoReward[iPos], 1); + g_esTankCache[tank].g_flHollowpointAmmoReward[iPos] = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flHollowpointAmmoReward[iPos], g_esPlayer[tank].g_flHollowpointAmmoReward[iPos], g_esTankCache[tank].g_flHollowpointAmmoReward[iPos], g_esTankCache[tank].g_flHollowpointAmmoReward[iPos], 1); + g_esTankCache[tank].g_flJumpHeightReward[iPos] = flGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_flJumpHeightReward[iPos], g_esTank[iType].g_flJumpHeightReward[iPos], g_esSpecific.g_flJumpHeightReward[iPos], g_esGeneral.g_flJumpHeightReward[iPos], 1); + g_esTankCache[tank].g_flJumpHeightReward[iPos] = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flJumpHeightReward[iPos], g_esPlayer[tank].g_flJumpHeightReward[iPos], g_esTankCache[tank].g_flJumpHeightReward[iPos], g_esTankCache[tank].g_flJumpHeightReward[iPos], 1); + g_esTankCache[tank].g_iInfiniteAmmoReward[iPos] = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iInfiniteAmmoReward[iPos], g_esTank[iType].g_iInfiniteAmmoReward[iPos], g_esSpecific.g_iInfiniteAmmoReward[iPos], g_esGeneral.g_iInfiniteAmmoReward[iPos], 1); + g_esTankCache[tank].g_iInfiniteAmmoReward[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iInfiniteAmmoReward[iPos], g_esPlayer[tank].g_iInfiniteAmmoReward[iPos], g_esTankCache[tank].g_iInfiniteAmmoReward[iPos], g_esTankCache[tank].g_iInfiniteAmmoReward[iPos], 1); + g_esTankCache[tank].g_iLadderActionsReward[iPos] = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iLadderActionsReward[iPos], g_esTank[iType].g_iLadderActionsReward[iPos], g_esSpecific.g_iLadderActionsReward[iPos], g_esGeneral.g_iLadderActionsReward[iPos], 1); + g_esTankCache[tank].g_iLadderActionsReward[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iLadderActionsReward[iPos], g_esPlayer[tank].g_iLadderActionsReward[iPos], g_esTankCache[tank].g_iLadderActionsReward[iPos], g_esTankCache[tank].g_iLadderActionsReward[iPos], 1); + g_esTankCache[tank].g_flLadyKillerReward[iPos] = flGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_flLadyKillerReward[iPos], g_esTank[iType].g_flLadyKillerReward[iPos], g_esSpecific.g_flLadyKillerReward[iPos], g_esGeneral.g_flLadyKillerReward[iPos], 1); + g_esTankCache[tank].g_flLadyKillerReward[iPos] = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flLadyKillerReward[iPos], g_esPlayer[tank].g_flLadyKillerReward[iPos], g_esTankCache[tank].g_flLadyKillerReward[iPos], g_esTankCache[tank].g_flLadyKillerReward[iPos], 1); + g_esTankCache[tank].g_iLaserSightReward[iPos] = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iLaserSightReward[iPos], g_esTank[iType].g_iLaserSightReward[iPos], g_esSpecific.g_iLaserSightReward[iPos], g_esGeneral.g_iLaserSightReward[iPos], 1); + g_esTankCache[tank].g_iLaserSightReward[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iLaserSightReward[iPos], g_esPlayer[tank].g_iLaserSightReward[iPos], g_esTankCache[tank].g_iLaserSightReward[iPos], g_esTankCache[tank].g_iLaserSightReward[iPos], 1); + g_esTankCache[tank].g_iLifeLeechReward[iPos] = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iLifeLeechReward[iPos], g_esTank[iType].g_iLifeLeechReward[iPos], g_esSpecific.g_iLifeLeechReward[iPos], g_esGeneral.g_iLifeLeechReward[iPos], 1); + g_esTankCache[tank].g_iLifeLeechReward[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iLifeLeechReward[iPos], g_esPlayer[tank].g_iLifeLeechReward[iPos], g_esTankCache[tank].g_iLifeLeechReward[iPos], g_esTankCache[tank].g_iLifeLeechReward[iPos], 1); + g_esTankCache[tank].g_flLoopingVoicelineInterval[iPos] = flGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_flLoopingVoicelineInterval[iPos], g_esTank[iType].g_flLoopingVoicelineInterval[iPos], g_esSpecific.g_flLoopingVoicelineInterval[iPos], g_esGeneral.g_flLoopingVoicelineInterval[iPos], 1); + g_esTankCache[tank].g_flLoopingVoicelineInterval[iPos] = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flLoopingVoicelineInterval[iPos], g_esPlayer[tank].g_flLoopingVoicelineInterval[iPos], g_esTankCache[tank].g_flLoopingVoicelineInterval[iPos], g_esTankCache[tank].g_flLoopingVoicelineInterval[iPos], 1); + g_esTankCache[tank].g_flLuckyBulletReward[iPos] = flGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_flLuckyBulletReward[iPos], g_esTank[iType].g_flLuckyBulletReward[iPos], g_esSpecific.g_flLuckyBulletReward[iPos], g_esGeneral.g_flLuckyBulletReward[iPos], 1); + g_esTankCache[tank].g_flLuckyBulletReward[iPos] = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flLuckyBulletReward[iPos], g_esPlayer[tank].g_flLuckyBulletReward[iPos], g_esTankCache[tank].g_flLuckyBulletReward[iPos], g_esTankCache[tank].g_flLuckyBulletReward[iPos], 1); + g_esTankCache[tank].g_iMedicalCutsReward[iPos] = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iMedicalCutsReward[iPos], g_esTank[iType].g_iMedicalCutsReward[iPos], g_esSpecific.g_iMedicalCutsReward[iPos], g_esGeneral.g_iMedicalCutsReward[iPos], 1); + g_esTankCache[tank].g_iMedicalCutsReward[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iMedicalCutsReward[iPos], g_esPlayer[tank].g_iMedicalCutsReward[iPos], g_esTankCache[tank].g_iMedicalCutsReward[iPos], g_esTankCache[tank].g_iMedicalCutsReward[iPos], 1); + g_esTankCache[tank].g_iMeleeRangeReward[iPos] = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iMeleeRangeReward[iPos], g_esTank[iType].g_iMeleeRangeReward[iPos], g_esSpecific.g_iMeleeRangeReward[iPos], g_esGeneral.g_iMeleeRangeReward[iPos], 1); + g_esTankCache[tank].g_iMeleeRangeReward[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iMeleeRangeReward[iPos], g_esPlayer[tank].g_iMeleeRangeReward[iPos], g_esTankCache[tank].g_iMeleeRangeReward[iPos], g_esTankCache[tank].g_iMeleeRangeReward[iPos], 1); + g_esTankCache[tank].g_iMidairDashesReward[iPos] = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iMidairDashesReward[iPos], g_esTank[iType].g_iMidairDashesReward[iPos], g_esSpecific.g_iMidairDashesReward[iPos], g_esGeneral.g_iMidairDashesReward[iPos], 1); + g_esTankCache[tank].g_iMidairDashesReward[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iMidairDashesReward[iPos], g_esPlayer[tank].g_iMidairDashesReward[iPos], g_esTankCache[tank].g_iMidairDashesReward[iPos], g_esTankCache[tank].g_iMidairDashesReward[iPos], 1); + g_esTankCache[tank].g_flMotivationRadiusReward[iPos] = flGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_flMotivationRadiusReward[iPos], g_esTank[iType].g_flMotivationRadiusReward[iPos], g_esSpecific.g_flMotivationRadiusReward[iPos], g_esGeneral.g_flMotivationRadiusReward[iPos], 1); + g_esTankCache[tank].g_flMotivationRadiusReward[iPos] = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flMotivationRadiusReward[iPos], g_esPlayer[tank].g_flMotivationRadiusReward[iPos], g_esTankCache[tank].g_flMotivationRadiusReward[iPos], g_esTankCache[tank].g_flMotivationRadiusReward[iPos], 1); + g_esTankCache[tank].g_flOverdoseRadiusReward[iPos] = flGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_flOverdoseRadiusReward[iPos], g_esTank[iType].g_flOverdoseRadiusReward[iPos], g_esSpecific.g_flOverdoseRadiusReward[iPos], g_esGeneral.g_flOverdoseRadiusReward[iPos], 1); + g_esTankCache[tank].g_flOverdoseRadiusReward[iPos] = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flOverdoseRadiusReward[iPos], g_esPlayer[tank].g_flOverdoseRadiusReward[iPos], g_esTankCache[tank].g_flOverdoseRadiusReward[iPos], g_esTankCache[tank].g_flOverdoseRadiusReward[iPos], 1); + g_esTankCache[tank].g_iOverhealthReward[iPos] = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iOverhealthReward[iPos], g_esTank[iType].g_iOverhealthReward[iPos], g_esSpecific.g_iOverhealthReward[iPos], g_esGeneral.g_iOverhealthReward[iPos], 1); + g_esTankCache[tank].g_iOverhealthReward[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iOverhealthReward[iPos], g_esPlayer[tank].g_iOverhealthReward[iPos], g_esTankCache[tank].g_iOverhealthReward[iPos], g_esTankCache[tank].g_iOverhealthReward[iPos], 1); + g_esTankCache[tank].g_iParticleEffectVisual[iPos] = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iParticleEffectVisual[iPos], g_esTank[iType].g_iParticleEffectVisual[iPos], g_esSpecific.g_iParticleEffectVisual[iPos], g_esGeneral.g_iParticleEffectVisual[iPos], 1); + g_esTankCache[tank].g_iParticleEffectVisual[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iParticleEffectVisual[iPos], g_esPlayer[tank].g_iParticleEffectVisual[iPos], g_esTankCache[tank].g_iParticleEffectVisual[iPos], g_esTankCache[tank].g_iParticleEffectVisual[iPos], 1); + g_esTankCache[tank].g_flPipeBombDurationReward[iPos] = flGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_flPipeBombDurationReward[iPos], g_esTank[iType].g_flPipeBombDurationReward[iPos], g_esSpecific.g_flPipeBombDurationReward[iPos], g_esGeneral.g_flPipeBombDurationReward[iPos], 1); + g_esTankCache[tank].g_flPipeBombDurationReward[iPos] = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flPipeBombDurationReward[iPos], g_esPlayer[tank].g_flPipeBombDurationReward[iPos], g_esTankCache[tank].g_flPipeBombDurationReward[iPos], g_esTankCache[tank].g_flPipeBombDurationReward[iPos], 1); + g_esTankCache[tank].g_iPrefsNotify[iPos] = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iPrefsNotify[iPos], g_esTank[iType].g_iPrefsNotify[iPos], g_esSpecific.g_iPrefsNotify[iPos], g_esGeneral.g_iPrefsNotify[iPos], 1); + g_esTankCache[tank].g_iPrefsNotify[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iPrefsNotify[iPos], g_esPlayer[tank].g_iPrefsNotify[iPos], g_esTankCache[tank].g_iPrefsNotify[iPos], g_esTankCache[tank].g_iPrefsNotify[iPos], 1); + g_esTankCache[tank].g_flPunchResistanceReward[iPos] = flGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_flPunchResistanceReward[iPos], g_esTank[iType].g_flPunchResistanceReward[iPos], g_esSpecific.g_flPunchResistanceReward[iPos], g_esGeneral.g_flPunchResistanceReward[iPos], 1); + g_esTankCache[tank].g_flPunchResistanceReward[iPos] = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flPunchResistanceReward[iPos], g_esPlayer[tank].g_flPunchResistanceReward[iPos], g_esTankCache[tank].g_flPunchResistanceReward[iPos], g_esTankCache[tank].g_flPunchResistanceReward[iPos], 1); + g_esTankCache[tank].g_flRapidPistolReward[iPos] = flGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_flRapidPistolReward[iPos], g_esTank[iType].g_flRapidPistolReward[iPos], g_esSpecific.g_flRapidPistolReward[iPos], g_esGeneral.g_flRapidPistolReward[iPos], 1); + g_esTankCache[tank].g_flRapidPistolReward[iPos] = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flRapidPistolReward[iPos], g_esPlayer[tank].g_flRapidPistolReward[iPos], g_esTankCache[tank].g_flRapidPistolReward[iPos], g_esTankCache[tank].g_flRapidPistolReward[iPos], 1); + g_esTankCache[tank].g_iRecoilDampenerReward[iPos] = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iRecoilDampenerReward[iPos], g_esTank[iType].g_iRecoilDampenerReward[iPos], g_esSpecific.g_iRecoilDampenerReward[iPos], g_esGeneral.g_iRecoilDampenerReward[iPos], 1); + g_esTankCache[tank].g_iRecoilDampenerReward[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iRecoilDampenerReward[iPos], g_esPlayer[tank].g_iRecoilDampenerReward[iPos], g_esTankCache[tank].g_iRecoilDampenerReward[iPos], g_esTankCache[tank].g_iRecoilDampenerReward[iPos], 1); + g_esTankCache[tank].g_flRefillPercentReward[iPos] = flGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_flRefillPercentReward[iPos], g_esTank[iType].g_flRefillPercentReward[iPos], g_esSpecific.g_flRefillPercentReward[iPos], g_esGeneral.g_flRefillPercentReward[iPos], 1); + g_esTankCache[tank].g_flRefillPercentReward[iPos] = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flRefillPercentReward[iPos], g_esPlayer[tank].g_flRefillPercentReward[iPos], g_esTankCache[tank].g_flRefillPercentReward[iPos], g_esTankCache[tank].g_flRefillPercentReward[iPos], 1); + g_esTankCache[tank].g_iRegenBurstsReward[iPos] = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iRegenBurstsReward[iPos], g_esTank[iType].g_iRegenBurstsReward[iPos], g_esSpecific.g_iRegenBurstsReward[iPos], g_esGeneral.g_iRegenBurstsReward[iPos], 1); + g_esTankCache[tank].g_iRegenBurstsReward[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iRegenBurstsReward[iPos], g_esPlayer[tank].g_iRegenBurstsReward[iPos], g_esTankCache[tank].g_iRegenBurstsReward[iPos], g_esTankCache[tank].g_iRegenBurstsReward[iPos], 1); + g_esTankCache[tank].g_flReloadRateReward[iPos] = flGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_flReloadRateReward[iPos], g_esTank[iType].g_flReloadRateReward[iPos], g_esSpecific.g_flReloadRateReward[iPos], g_esGeneral.g_flReloadRateReward[iPos], 1); + g_esTankCache[tank].g_flReloadRateReward[iPos] = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flReloadRateReward[iPos], g_esPlayer[tank].g_flReloadRateReward[iPos], g_esTankCache[tank].g_flReloadRateReward[iPos], g_esTankCache[tank].g_flReloadRateReward[iPos], 1); + g_esTankCache[tank].g_iRespawnLoadoutReward[iPos] = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iRespawnLoadoutReward[iPos], g_esTank[iType].g_iRespawnLoadoutReward[iPos], g_esSpecific.g_iRespawnLoadoutReward[iPos], g_esGeneral.g_iRespawnLoadoutReward[iPos], 1); + g_esTankCache[tank].g_iRespawnLoadoutReward[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iRespawnLoadoutReward[iPos], g_esPlayer[tank].g_iRespawnLoadoutReward[iPos], g_esTankCache[tank].g_iRespawnLoadoutReward[iPos], g_esTankCache[tank].g_iRespawnLoadoutReward[iPos], 1); + g_esTankCache[tank].g_iReviveHealthReward[iPos] = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iReviveHealthReward[iPos], g_esTank[iType].g_iReviveHealthReward[iPos], g_esSpecific.g_iReviveHealthReward[iPos], g_esGeneral.g_iReviveHealthReward[iPos], 1); + g_esTankCache[tank].g_iReviveHealthReward[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iReviveHealthReward[iPos], g_esPlayer[tank].g_iReviveHealthReward[iPos], g_esTankCache[tank].g_iReviveHealthReward[iPos], g_esTankCache[tank].g_iReviveHealthReward[iPos], 1); + g_esTankCache[tank].g_iRewardBots[iPos] = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iRewardBots[iPos], g_esTank[iType].g_iRewardBots[iPos], g_esSpecific.g_iRewardBots[iPos], g_esGeneral.g_iRewardBots[iPos], 1, -1); + g_esTankCache[tank].g_iRewardBots[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iRewardBots[iPos], g_esPlayer[tank].g_iRewardBots[iPos], g_esTankCache[tank].g_iRewardBots[iPos], g_esTankCache[tank].g_iRewardBots[iPos], 1, -1); + g_esTankCache[tank].g_flRewardChance[iPos] = flGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_flRewardChance[iPos], g_esTank[iType].g_flRewardChance[iPos], g_esSpecific.g_flRewardChance[iPos], g_esGeneral.g_flRewardChance[iPos], 1); + g_esTankCache[tank].g_flRewardChance[iPos] = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flRewardChance[iPos], g_esPlayer[tank].g_flRewardChance[iPos], g_esTankCache[tank].g_flRewardChance[iPos], g_esTankCache[tank].g_flRewardChance[iPos], 1); + g_esTankCache[tank].g_flRewardDuration[iPos] = flGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_flRewardDuration[iPos], g_esTank[iType].g_flRewardDuration[iPos], g_esSpecific.g_flRewardDuration[iPos], g_esGeneral.g_flRewardDuration[iPos], 1); + g_esTankCache[tank].g_flRewardDuration[iPos] = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flRewardDuration[iPos], g_esPlayer[tank].g_flRewardDuration[iPos], g_esTankCache[tank].g_flRewardDuration[iPos], g_esTankCache[tank].g_flRewardDuration[iPos], 1); + g_esTankCache[tank].g_iRewardEffect[iPos] = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iRewardEffect[iPos], g_esTank[iType].g_iRewardEffect[iPos], g_esSpecific.g_iRewardEffect[iPos], g_esGeneral.g_iRewardEffect[iPos], 1); + g_esTankCache[tank].g_iRewardEffect[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iRewardEffect[iPos], g_esPlayer[tank].g_iRewardEffect[iPos], g_esTankCache[tank].g_iRewardEffect[iPos], g_esTankCache[tank].g_iRewardEffect[iPos], 1); + g_esTankCache[tank].g_iRewardEnabled[iPos] = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iRewardEnabled[iPos], g_esTank[iType].g_iRewardEnabled[iPos], g_esSpecific.g_iRewardEnabled[iPos], g_esGeneral.g_iRewardEnabled[iPos], 1, -1); + g_esTankCache[tank].g_iRewardEnabled[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iRewardEnabled[iPos], g_esPlayer[tank].g_iRewardEnabled[iPos], g_esTankCache[tank].g_iRewardEnabled[iPos], g_esTankCache[tank].g_iRewardEnabled[iPos], 1, -1); + g_esTankCache[tank].g_iRewardNotify[iPos] = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iRewardNotify[iPos], g_esTank[iType].g_iRewardNotify[iPos], g_esSpecific.g_iRewardNotify[iPos], g_esGeneral.g_iRewardNotify[iPos], 1); + g_esTankCache[tank].g_iRewardNotify[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iRewardNotify[iPos], g_esPlayer[tank].g_iRewardNotify[iPos], g_esTankCache[tank].g_iRewardNotify[iPos], g_esTankCache[tank].g_iRewardNotify[iPos], 1); + g_esTankCache[tank].g_flRewardPercentage[iPos] = flGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_flRewardPercentage[iPos], g_esTank[iType].g_flRewardPercentage[iPos], g_esSpecific.g_flRewardPercentage[iPos], g_esGeneral.g_flRewardPercentage[iPos], 1); + g_esTankCache[tank].g_flRewardPercentage[iPos] = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flRewardPercentage[iPos], g_esPlayer[tank].g_flRewardPercentage[iPos], g_esTankCache[tank].g_flRewardPercentage[iPos], g_esTankCache[tank].g_flRewardPercentage[iPos], 1); + g_esTankCache[tank].g_iRewardVisual[iPos] = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iRewardVisual[iPos], g_esTank[iType].g_iRewardVisual[iPos], g_esSpecific.g_iRewardVisual[iPos], g_esGeneral.g_iRewardVisual[iPos], 1); + g_esTankCache[tank].g_iRewardVisual[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iRewardVisual[iPos], g_esPlayer[tank].g_iRewardVisual[iPos], g_esTankCache[tank].g_iRewardVisual[iPos], g_esTankCache[tank].g_iRewardVisual[iPos], 1); + g_esTankCache[tank].g_iRiotGearReward[iPos] = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iRiotGearReward[iPos], g_esTank[iType].g_iRiotGearReward[iPos], g_esSpecific.g_iRiotGearReward[iPos], g_esGeneral.g_iRiotGearReward[iPos], 1); + g_esTankCache[tank].g_iRiotGearReward[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iRiotGearReward[iPos], g_esPlayer[tank].g_iRiotGearReward[iPos], g_esTankCache[tank].g_iRiotGearReward[iPos], g_esTankCache[tank].g_iRiotGearReward[iPos], 1); + g_esTankCache[tank].g_iSafetyBubbleReward[iPos] = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iSafetyBubbleReward[iPos], g_esTank[iType].g_iSafetyBubbleReward[iPos], g_esSpecific.g_iSafetyBubbleReward[iPos], g_esGeneral.g_iSafetyBubbleReward[iPos], 1); + g_esTankCache[tank].g_iSafetyBubbleReward[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iSafetyBubbleReward[iPos], g_esPlayer[tank].g_iSafetyBubbleReward[iPos], g_esTankCache[tank].g_iSafetyBubbleReward[iPos], g_esTankCache[tank].g_iSafetyBubbleReward[iPos], 1); + g_esTankCache[tank].g_iShareRewards[iPos] = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iShareRewards[iPos], g_esTank[iType].g_iShareRewards[iPos], g_esSpecific.g_iShareRewards[iPos], g_esGeneral.g_iShareRewards[iPos], 1); + g_esTankCache[tank].g_iShareRewards[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iShareRewards[iPos], g_esPlayer[tank].g_iShareRewards[iPos], g_esTankCache[tank].g_iShareRewards[iPos], g_esTankCache[tank].g_iShareRewards[iPos], 1); + g_esTankCache[tank].g_flShockwaveRadiusReward[iPos] = flGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_flShockwaveRadiusReward[iPos], g_esTank[iType].g_flShockwaveRadiusReward[iPos], g_esSpecific.g_flShockwaveRadiusReward[iPos], g_esGeneral.g_flShockwaveRadiusReward[iPos], 1); + g_esTankCache[tank].g_flShockwaveRadiusReward[iPos] = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flShockwaveRadiusReward[iPos], g_esPlayer[tank].g_flShockwaveRadiusReward[iPos], g_esTankCache[tank].g_flShockwaveRadiusReward[iPos], g_esTankCache[tank].g_flShockwaveRadiusReward[iPos], 1); + g_esTankCache[tank].g_flShoveDamageReward[iPos] = flGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_flShoveDamageReward[iPos], g_esTank[iType].g_flShoveDamageReward[iPos], g_esSpecific.g_flShoveDamageReward[iPos], g_esGeneral.g_flShoveDamageReward[iPos], 1); + g_esTankCache[tank].g_flShoveDamageReward[iPos] = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flShoveDamageReward[iPos], g_esPlayer[tank].g_flShoveDamageReward[iPos], g_esTankCache[tank].g_flShoveDamageReward[iPos], g_esTankCache[tank].g_flShoveDamageReward[iPos], 1); + g_esTankCache[tank].g_iShovePenaltyReward[iPos] = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iShovePenaltyReward[iPos], g_esTank[iType].g_iShovePenaltyReward[iPos], g_esSpecific.g_iShovePenaltyReward[iPos], g_esGeneral.g_iShovePenaltyReward[iPos], 1); + g_esTankCache[tank].g_iShovePenaltyReward[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iShovePenaltyReward[iPos], g_esPlayer[tank].g_iShovePenaltyReward[iPos], g_esTankCache[tank].g_iShovePenaltyReward[iPos], g_esTankCache[tank].g_iShovePenaltyReward[iPos], 1); + g_esTankCache[tank].g_flShoveRateReward[iPos] = flGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_flShoveRateReward[iPos], g_esTank[iType].g_flShoveRateReward[iPos], g_esSpecific.g_flShoveRateReward[iPos], g_esGeneral.g_flShoveRateReward[iPos], 1); + g_esTankCache[tank].g_flShoveRateReward[iPos] = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flShoveRateReward[iPos], g_esPlayer[tank].g_flShoveRateReward[iPos], g_esTankCache[tank].g_flShoveRateReward[iPos], g_esTankCache[tank].g_flShoveRateReward[iPos], 1); + g_esTankCache[tank].g_flSledgehammerRoundsReward[iPos] = flGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_flSledgehammerRoundsReward[iPos], g_esTank[iType].g_flSledgehammerRoundsReward[iPos], g_esSpecific.g_flSledgehammerRoundsReward[iPos], g_esGeneral.g_flSledgehammerRoundsReward[iPos], 1); + g_esTankCache[tank].g_flSledgehammerRoundsReward[iPos] = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flSledgehammerRoundsReward[iPos], g_esPlayer[tank].g_flSledgehammerRoundsReward[iPos], g_esTankCache[tank].g_flSledgehammerRoundsReward[iPos], g_esTankCache[tank].g_flSledgehammerRoundsReward[iPos], 1); + g_esTankCache[tank].g_iSpecialAmmoReward[iPos] = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iSpecialAmmoReward[iPos], g_esTank[iType].g_iSpecialAmmoReward[iPos], g_esSpecific.g_iSpecialAmmoReward[iPos], g_esGeneral.g_iSpecialAmmoReward[iPos], 1); + g_esTankCache[tank].g_iSpecialAmmoReward[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iSpecialAmmoReward[iPos], g_esPlayer[tank].g_iSpecialAmmoReward[iPos], g_esTankCache[tank].g_iSpecialAmmoReward[iPos], g_esTankCache[tank].g_iSpecialAmmoReward[iPos], 1); + g_esTankCache[tank].g_flSpeedBoostReward[iPos] = flGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_flSpeedBoostReward[iPos], g_esTank[iType].g_flSpeedBoostReward[iPos], g_esSpecific.g_flSpeedBoostReward[iPos], g_esGeneral.g_flSpeedBoostReward[iPos], 1); + g_esTankCache[tank].g_flSpeedBoostReward[iPos] = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flSpeedBoostReward[iPos], g_esPlayer[tank].g_flSpeedBoostReward[iPos], g_esTankCache[tank].g_flSpeedBoostReward[iPos], g_esTankCache[tank].g_flSpeedBoostReward[iPos], 1); + g_esTankCache[tank].g_iStackRewards[iPos] = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iStackRewards[iPos], g_esTank[iType].g_iStackRewards[iPos], g_esSpecific.g_iStackRewards[iPos], g_esGeneral.g_iStackRewards[iPos], 1); + g_esTankCache[tank].g_iStackRewards[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iStackRewards[iPos], g_esPlayer[tank].g_iStackRewards[iPos], g_esTankCache[tank].g_iStackRewards[iPos], g_esTankCache[tank].g_iStackRewards[iPos], 1); + g_esTankCache[tank].g_iStickyGrenadesReward[iPos] = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iStickyGrenadesReward[iPos], g_esTank[iType].g_iStickyGrenadesReward[iPos], g_esSpecific.g_iStickyGrenadesReward[iPos], g_esGeneral.g_iStickyGrenadesReward[iPos], 1); + g_esTankCache[tank].g_iStickyGrenadesReward[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iStickyGrenadesReward[iPos], g_esPlayer[tank].g_iStickyGrenadesReward[iPos], g_esTankCache[tank].g_iStickyGrenadesReward[iPos], g_esTankCache[tank].g_iStickyGrenadesReward[iPos], 1); + g_esTankCache[tank].g_flSupplierReward[iPos] = flGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_flSupplierReward[iPos], g_esTank[iType].g_flSupplierReward[iPos], g_esSpecific.g_flSupplierReward[iPos], g_esGeneral.g_flSupplierReward[iPos], 1); + g_esTankCache[tank].g_flSupplierReward[iPos] = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flSupplierReward[iPos], g_esPlayer[tank].g_flSupplierReward[iPos], g_esTankCache[tank].g_flSupplierReward[iPos], g_esTankCache[tank].g_flSupplierReward[iPos], 1); + g_esTankCache[tank].g_flSwingRateReward[iPos] = flGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_flSwingRateReward[iPos], g_esTank[iType].g_flSwingRateReward[iPos], g_esSpecific.g_flSwingRateReward[iPos], g_esGeneral.g_flSwingRateReward[iPos], 1); + g_esTankCache[tank].g_flSwingRateReward[iPos] = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flSwingRateReward[iPos], g_esPlayer[tank].g_flSwingRateReward[iPos], g_esTankCache[tank].g_flSwingRateReward[iPos], g_esTankCache[tank].g_flSwingRateReward[iPos], 1); + g_esTankCache[tank].g_iSyringeDartsReward[iPos] = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iSyringeDartsReward[iPos], g_esTank[iType].g_iSyringeDartsReward[iPos], g_esSpecific.g_iSyringeDartsReward[iPos], g_esGeneral.g_iSyringeDartsReward[iPos], 1); + g_esTankCache[tank].g_iSyringeDartsReward[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iSyringeDartsReward[iPos], g_esPlayer[tank].g_iSyringeDartsReward[iPos], g_esTankCache[tank].g_iSyringeDartsReward[iPos], g_esTankCache[tank].g_iSyringeDartsReward[iPos], 1); + g_esTankCache[tank].g_iThornsReward[iPos] = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iThornsReward[iPos], g_esTank[iType].g_iThornsReward[iPos], g_esSpecific.g_iThornsReward[iPos], g_esGeneral.g_iThornsReward[iPos], 1); + g_esTankCache[tank].g_iThornsReward[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iThornsReward[iPos], g_esPlayer[tank].g_iThornsReward[iPos], g_esTankCache[tank].g_iThornsReward[iPos], g_esTankCache[tank].g_iThornsReward[iPos], 1); + g_esTankCache[tank].g_iUsefulRewards[iPos] = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iUsefulRewards[iPos], g_esTank[iType].g_iUsefulRewards[iPos], g_esSpecific.g_iUsefulRewards[iPos], g_esGeneral.g_iUsefulRewards[iPos], 1); + g_esTankCache[tank].g_iUsefulRewards[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iUsefulRewards[iPos], g_esPlayer[tank].g_iUsefulRewards[iPos], g_esTankCache[tank].g_iUsefulRewards[iPos], g_esTankCache[tank].g_iUsefulRewards[iPos], 1); + g_esTankCache[tank].g_iVoicePitchVisual[iPos] = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iVoicePitchVisual[iPos], g_esTank[iType].g_iVoicePitchVisual[iPos], g_esSpecific.g_iVoicePitchVisual[iPos], g_esGeneral.g_iVoicePitchVisual[iPos], 1); + g_esTankCache[tank].g_iVoicePitchVisual[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iVoicePitchVisual[iPos], g_esPlayer[tank].g_iVoicePitchVisual[iPos], g_esTankCache[tank].g_iVoicePitchVisual[iPos], g_esTankCache[tank].g_iVoicePitchVisual[iPos], 1); + } - switch (iType) - { - case -1: g_esGeneral.g_iChosenType = iType; - case 0: - { - if (bIsValidClient(admin) && bIsDeveloper(admin, .real = true) && StrEqual(type, "mt_dev_access", false)) - { - g_esDeveloper[admin].g_iDevAccess = amount; + if (iPos < (sizeof esTankCache::g_iStackLimits)) + { + g_esTankCache[tank].g_iStackLimits[iPos] = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iStackLimits[iPos], g_esTank[iType].g_iStackLimits[iPos], g_esSpecific.g_iStackLimits[iPos], g_esGeneral.g_iStackLimits[iPos], 1); + g_esTankCache[tank].g_iStackLimits[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iStackLimits[iPos], g_esPlayer[tank].g_iStackLimits[iPos], g_esTankCache[tank].g_iStackLimits[iPos], g_esTankCache[tank].g_iStackLimits[iPos], 1); + } - vSetupDeveloper(admin); - MT_PrintToChat(admin, "%s %s{mint}, your current access level for testing has been set to{yellow} %i{mint}.", MT_TAG5, MT_AUTHOR, amount); + if (iPos < (sizeof esTankCache::g_flComboChance)) + { + g_esTankCache[tank].g_flComboChance[iPos] = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flComboChance[iPos], g_esPlayer[tank].g_flComboChance[iPos], g_esSpecial[iType].g_flComboChance[iPos], g_esTank[iType].g_flComboChance[iPos], 1); + g_esTankCache[tank].g_iComboCooldown[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iComboCooldown[iPos], g_esPlayer[tank].g_iComboCooldown[iPos], g_esSpecial[iType].g_iComboCooldown[iPos], g_esTank[iType].g_iComboCooldown[iPos], 1); + g_esTankCache[tank].g_flComboDamage[iPos] = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flComboDamage[iPos], g_esPlayer[tank].g_flComboDamage[iPos], g_esSpecial[iType].g_flComboDamage[iPos], g_esTank[iType].g_flComboDamage[iPos], 1); + g_esTankCache[tank].g_flComboDeathChance[iPos] = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flComboDeathChance[iPos], g_esPlayer[tank].g_flComboDeathChance[iPos], g_esSpecial[iType].g_flComboDeathChance[iPos], g_esTank[iType].g_flComboDeathChance[iPos], 1); + g_esTankCache[tank].g_flComboDeathRange[iPos] = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flComboDeathRange[iPos], g_esPlayer[tank].g_flComboDeathRange[iPos], g_esSpecial[iType].g_flComboDeathRange[iPos], g_esTank[iType].g_flComboDeathRange[iPos], 1); + g_esTankCache[tank].g_flComboDelay[iPos] = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flComboDelay[iPos], g_esPlayer[tank].g_flComboDelay[iPos], g_esSpecial[iType].g_flComboDelay[iPos], g_esTank[iType].g_flComboDelay[iPos], 1); + g_esTankCache[tank].g_flComboDuration[iPos] = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flComboDuration[iPos], g_esPlayer[tank].g_flComboDuration[iPos], g_esSpecial[iType].g_flComboDuration[iPos], g_esTank[iType].g_flComboDuration[iPos], 1); + g_esTankCache[tank].g_flComboInterval[iPos] = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flComboInterval[iPos], g_esPlayer[tank].g_flComboInterval[iPos], g_esSpecial[iType].g_flComboInterval[iPos], g_esTank[iType].g_flComboInterval[iPos], 1); + g_esTankCache[tank].g_flComboMinRadius[iPos] = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flComboMinRadius[iPos], g_esPlayer[tank].g_flComboMinRadius[iPos], g_esSpecial[iType].g_flComboMinRadius[iPos], g_esTank[iType].g_flComboMinRadius[iPos], 2, 1.0); + g_esTankCache[tank].g_flComboMaxRadius[iPos] = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flComboMaxRadius[iPos], g_esPlayer[tank].g_flComboMaxRadius[iPos], g_esSpecial[iType].g_flComboMaxRadius[iPos], g_esTank[iType].g_flComboMaxRadius[iPos], 2, -1.0); + g_esTankCache[tank].g_flComboRange[iPos] = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flComboRange[iPos], g_esPlayer[tank].g_flComboRange[iPos], g_esSpecial[iType].g_flComboRange[iPos], g_esTank[iType].g_flComboRange[iPos], 1); + g_esTankCache[tank].g_flComboRangeChance[iPos] = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flComboRangeChance[iPos], g_esPlayer[tank].g_flComboRangeChance[iPos], g_esSpecial[iType].g_flComboRangeChance[iPos], g_esTank[iType].g_flComboRangeChance[iPos], 1); + g_esTankCache[tank].g_iComboRangeCooldown[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iComboRangeCooldown[iPos], g_esPlayer[tank].g_iComboRangeCooldown[iPos], g_esSpecial[iType].g_iComboRangeCooldown[iPos], g_esTank[iType].g_iComboRangeCooldown[iPos], 1); + g_esTankCache[tank].g_flComboRockChance[iPos] = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flComboRockChance[iPos], g_esPlayer[tank].g_flComboRockChance[iPos], g_esSpecial[iType].g_flComboRockChance[iPos], g_esTank[iType].g_flComboRockChance[iPos], 1); + g_esTankCache[tank].g_iComboRockCooldown[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iComboRockCooldown[iPos], g_esPlayer[tank].g_iComboRockCooldown[iPos], g_esSpecial[iType].g_iComboRockCooldown[iPos], g_esTank[iType].g_iComboRockCooldown[iPos], 1); + g_esTankCache[tank].g_flComboSpeed[iPos] = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flComboSpeed[iPos], g_esPlayer[tank].g_flComboSpeed[iPos], g_esSpecial[iType].g_flComboSpeed[iPos], g_esTank[iType].g_flComboSpeed[iPos], 1); + } - return; - } - else - { - bool bCheck = true, bMenu = true; - char sPhrase[32], sTankName[64]; - int iClass = 8, iCycleCount = 0, iCycleTypes[MT_MAXTYPES + 1], iMin = iGetMinType(specType, (specType == iClass)), iMax = iGetMaxType(specType, (specType == iClass)), - iSpecType = (specType != iClass) ? specType : 0, iRealType = 0, iTypeCount = 0, iTankTypes[MT_MAXTYPES + 1]; - for (int iIndex = iMin; iIndex <= iMax; iIndex++) - { - if (iIndex <= 0) - { - continue; + if (iPos < (sizeof esTankCache::g_flComboTypeChance)) + { + g_esTankCache[tank].g_flComboTypeChance[iPos] = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flComboTypeChance[iPos], g_esPlayer[tank].g_flComboTypeChance[iPos], g_esSpecial[iType].g_flComboTypeChance[iPos], g_esTank[iType].g_flComboTypeChance[iPos], 1); + } + + if (iPos < (sizeof esTankCache::g_iSkinColor)) + { + g_esTankCache[tank].g_iBossHealth[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iBossHealth[iPos], g_esPlayer[tank].g_iBossHealth[iPos], g_esSpecial[iType].g_iBossHealth[iPos], g_esTank[iType].g_iBossHealth[iPos], 1); + g_esTankCache[tank].g_iBossType[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iBossType[iPos], g_esPlayer[tank].g_iBossType[iPos], g_esSpecial[iType].g_iBossType[iPos], g_esTank[iType].g_iBossType[iPos], 1); + } } + } - iRealType = g_esTank[iIndex].g_iRecordedType[0]; - bMenu = bIsMenuEnabled(iRealType, specType); + g_esTankCache[tank].g_iBodyEffects = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iBodyEffects, g_esPlayer[tank].g_iBodyEffects, g_esSpecial[iType].g_iBodyEffects, g_esTank[iType].g_iBodyEffects, 1); + g_esTankCache[tank].g_iGlowEnabled = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iGlowEnabled, g_esPlayer[tank].g_iGlowEnabled, g_esSpecial[iType].g_iGlowEnabled, g_esTank[iType].g_iGlowEnabled, 1); + g_esTankCache[tank].g_iGlowFlashing = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iGlowFlashing, g_esPlayer[tank].g_iGlowFlashing, g_esSpecial[iType].g_iGlowFlashing, g_esTank[iType].g_iGlowFlashing, 1); + g_esTankCache[tank].g_iGlowMaxRange = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iGlowMaxRange, g_esPlayer[tank].g_iGlowMaxRange, g_esSpecial[iType].g_iGlowMaxRange, g_esTank[iType].g_iGlowMaxRange, 1); + g_esTankCache[tank].g_iGlowMinRange = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iGlowMinRange, g_esPlayer[tank].g_iGlowMinRange, g_esSpecial[iType].g_iGlowMinRange, g_esTank[iType].g_iGlowMinRange, 1); + g_esTankCache[tank].g_iGlowType = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iGlowType, g_esPlayer[tank].g_iGlowType, g_esSpecial[iType].g_iGlowType, g_esTank[iType].g_iGlowType, 1); + g_esTankCache[tank].g_iRockEffects = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iRockEffects, g_esPlayer[tank].g_iRockEffects, g_esSpecial[iType].g_iRockEffects, g_esTank[iType].g_iRockEffects, 1); + g_esTankCache[tank].g_iRockModel = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iRockModel, g_esPlayer[tank].g_iRockModel, g_esSpecial[iType].g_iRockModel, g_esTank[iType].g_iRockModel, 1); + g_esTankCache[tank].g_iSpecialModel = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iSpecialModel, g_esTank[iType].g_iTankModel, g_esSpecific.g_iSpecialModel, g_esGeneral.g_iTankModel, 1); + g_esTankCache[tank].g_iSpecialModel = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iSpecialModel, g_esPlayer[tank].g_iTankModel, g_esTankCache[tank].g_iSpecialModel, g_esTankCache[tank].g_iSpecialModel, 1); - vRecycleType(specType, iRealType, true); + vGetSubSettingValue(bAccess, bHuman, g_esTankCache[tank].g_sGlowColor, sizeof esTankCache::g_sGlowColor, g_esTeammate[tank].g_sGlowColor, g_esPlayer[tank].g_sGlowColor, g_esSpecial[iType].g_sGlowColor, g_esTank[iType].g_sGlowColor); + vGetSubSettingValue(bAccess, bHuman, g_esTankCache[tank].g_sRockColor, sizeof esTankCache::g_sRockColor, g_esTeammate[tank].g_sRockColor, g_esPlayer[tank].g_sRockColor, g_esSpecial[iType].g_sRockColor, g_esTank[iType].g_sRockColor); + vGetSubSettingValue(bAccess, bHuman, g_esTankCache[tank].g_sSkinColor, sizeof esTankCache::g_sSkinColor, g_esTeammate[tank].g_sSkinColor, g_esPlayer[tank].g_sSkinColor, g_esSpecial[iType].g_sSkinColor, g_esTank[iType].g_sSkinColor); - switch (specType) - { - case 1: bCheck = bIsSmokerEnabled(iRealType) && bMenu; - case 2: bCheck = bIsBoomerEnabled(iRealType) && bMenu; - case 3: bCheck = bIsHunterEnabled(iRealType) && bMenu; - case 4: bCheck = bIsSpitterEnabled(iRealType) && bMenu; - case 5: bCheck = bIsJockeyEnabled(iRealType) && bMenu; - case 6: bCheck = bIsChargerEnabled(iRealType) && bMenu; - default: bCheck = bIsTankEnabled(iRealType) && bMenu; - } + for (int iPos = 0; iPos < (sizeof esTankCache::g_flBodyChance); iPos++) + { + g_esTankCache[tank].g_flBodyChance[iPos] = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flBodyChance[iPos], g_esPlayer[tank].g_flBodyChance[iPos], g_esSpecial[iType].g_flBodyChance[iPos], g_esTank[iType].g_flBodyChance[iPos], 1); - vGetTranslatedName(sPhrase, sizeof sPhrase, .type = iIndex, .specType = specType); - SetGlobalTransTarget(admin); - FormatEx(sTankName, sizeof sTankName, "%T", sPhrase, admin); - if (!bCheck || !bHasCoreAdminAccess(admin, iRealType) || !bIsTypeAvailable(iRealType, admin) || bAreHumansRequired(iRealType, specType) || !bCanTypeSpawn(iRealType, specType) || !bIsRightGame(iRealType, specType) || bIsAreaNarrow(admin, g_esTank[iRealType].g_flOpenAreasOnly) || bIsAreaWide(admin, g_esTank[iRealType].g_flCloseAreasOnly) || (!StrEqual(type, "random", false) && StrContains(sTankName, type, false) == -1)) + if (iPos < (sizeof esTankCache::g_iSkinColor)) { - continue; + g_esTankCache[tank].g_flRockChance[iPos] = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flRockChance[iPos], g_esPlayer[tank].g_flRockChance[iPos], g_esSpecial[iType].g_flRockChance[iPos], g_esTank[iType].g_flRockChance[iPos], 1); + g_esTankCache[tank].g_iSkinColor[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iSkinColor[iPos], g_esPlayer[tank].g_iSkinColor[iPos], g_esSpecial[iType].g_iSkinColor[iPos], g_esTank[iType].g_iSkinColor[iPos], 1); + g_esTankCache[tank].g_iRockColor[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iRockColor[iPos], g_esPlayer[tank].g_iRockColor[iPos], g_esSpecial[iType].g_iRockColor[iPos], g_esTank[iType].g_iRockColor[iPos], 1); } - iCycleTypes[iCycleCount + 1] = iRealType; - iCycleCount++; - - if (bIsTypeCycled(specType, iRealType, true)) + if (iPos < (sizeof esTankCache::g_iGlowColor)) { - continue; + g_esTankCache[tank].g_iGlowColor[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iGlowColor[iPos], g_esPlayer[tank].g_iGlowColor[iPos], g_esSpecial[iType].g_iGlowColor[iPos], g_esTank[iType].g_iGlowColor[iPos], 1); } - - g_esGeneral.g_iChosenType = iRealType; - iTankTypes[iTypeCount + 1] = iRealType; - iTypeCount++; } + } + else + { + if (!visualsOnly) + { + g_esTankCache[tank].g_sArmorCharacters[0] = '\0'; + g_esTankCache[tank].g_sBodyColorVisual[0] = '\0'; + g_esTankCache[tank].g_sBodyColorVisual2[0] = '\0'; + g_esTankCache[tank].g_sBodyColorVisual3[0] = '\0'; + g_esTankCache[tank].g_sBodyColorVisual4[0] = '\0'; + g_esTankCache[tank].g_sComboSet[0] = '\0'; + g_esTankCache[tank].g_sFallVoicelineReward[0] = '\0'; + g_esTankCache[tank].g_sFallVoicelineReward2[0] = '\0'; + g_esTankCache[tank].g_sFallVoicelineReward3[0] = '\0'; + g_esTankCache[tank].g_sFallVoicelineReward4[0] = '\0'; + g_esTankCache[tank].g_sHealthCharacters[0] = '\0'; + g_esTankCache[tank].g_sItemReward[0] = '\0'; + g_esTankCache[tank].g_sLightColorVisual[0] = '\0'; + g_esTankCache[tank].g_sLightColorVisual2[0] = '\0'; + g_esTankCache[tank].g_sLightColorVisual3[0] = '\0'; + g_esTankCache[tank].g_sLightColorVisual4[0] = '\0'; + g_esTankCache[tank].g_sLoopingVoicelineVisual[0] = '\0'; + g_esTankCache[tank].g_sLoopingVoicelineVisual2[0] = '\0'; + g_esTankCache[tank].g_sLoopingVoicelineVisual3[0] = '\0'; + g_esTankCache[tank].g_sLoopingVoicelineVisual4[0] = '\0'; + g_esTankCache[tank].g_sOutlineColorVisual[0] = '\0'; + g_esTankCache[tank].g_sOutlineColorVisual2[0] = '\0'; + g_esTankCache[tank].g_sOutlineColorVisual3[0] = '\0'; + g_esTankCache[tank].g_sOutlineColorVisual4[0] = '\0'; + g_esTankCache[tank].g_sScreenColorVisual[0] = '\0'; + g_esTankCache[tank].g_sScreenColorVisual2[0] = '\0'; + g_esTankCache[tank].g_sScreenColorVisual3[0] = '\0'; + g_esTankCache[tank].g_sScreenColorVisual4[0] = '\0'; + g_esTankCache[tank].g_sShieldCharacters[0] = '\0'; + g_esTankCache[tank].g_sSmokerName[0] = '\0'; + g_esTankCache[tank].g_sBoomerName[0] = '\0'; + g_esTankCache[tank].g_sHunterName[0] = '\0'; + g_esTankCache[tank].g_sSpitterName[0] = '\0'; + g_esTankCache[tank].g_sJockeyName[0] = '\0'; + g_esTankCache[tank].g_sChargerName[0] = '\0'; + g_esTankCache[tank].g_flArmorDuration = 0.0; + g_esTankCache[tank].g_flArmorPercentage = 0.0; + g_esTankCache[tank].g_flArmorResistance[0] = 0.0; + g_esTankCache[tank].g_flArmorResistance[1] = 0.0; + g_esTankCache[tank].g_flAttackInterval = 0.0; + g_esTankCache[tank].g_flBurnDuration = 0.0; + g_esTankCache[tank].g_flBurntSkin = -1.0; + g_esTankCache[tank].g_flClawDamage = -1.0; + g_esTankCache[tank].g_flHealPercentMultiplier = 1.0; + g_esTankCache[tank].g_flHittableDamage = -1.0; + g_esTankCache[tank].g_flIncapDamageMultiplier = 1.0; + g_esTankCache[tank].g_flMeleeHitValue = 0.0; + g_esTankCache[tank].g_flPassiveDelay = 0.0; + g_esTankCache[tank].g_flPassiveInterval = 0.0; + g_esTankCache[tank].g_flPinDamage = -1.0; + g_esTankCache[tank].g_flRandomDuration = 0.0; + g_esTankCache[tank].g_flRunSpeed = 0.0; + g_esTankCache[tank].g_flShieldDuration = 0.0; + g_esTankCache[tank].g_flShieldPercentage = 0.0; + g_esTankCache[tank].g_flShieldRate = 0.0; + g_esTankCache[tank].g_flShieldResistance = 0.0; + g_esTankCache[tank].g_flSpecialInterval = 0.0; + g_esTankCache[tank].g_flTransformDelay = 0.0; + g_esTankCache[tank].g_flTransformDuration = 0.0; + g_esTankCache[tank].g_iAnnounceArrival = 0; + g_esTankCache[tank].g_iAnnounceDeath = 0; + g_esTankCache[tank].g_iAnnounceKill = 0; + g_esTankCache[tank].g_iArrivalMessage = 0; + g_esTankCache[tank].g_iArrivalSound = 0; + g_esTankCache[tank].g_iAutoHop = 0; + g_esTankCache[tank].g_iBaseHealth = 0; + g_esTankCache[tank].g_iBossEffects = 0; + g_esTankCache[tank].g_iBossStages = 0; + g_esTankCache[tank].g_iBulletImmunity = 0; + g_esTankCache[tank].g_iDeathDetails = 0; + g_esTankCache[tank].g_iDeathMessage = 0; + g_esTankCache[tank].g_iDeathRevert = 0; + g_esTankCache[tank].g_iDeathSound = 0; + g_esTankCache[tank].g_iDisplayHealth = 0; + g_esTankCache[tank].g_iDisplayHealthType = 0; + g_esTankCache[tank].g_iExplosiveImmunity = 0; + g_esTankCache[tank].g_iExtraHealth = 0; + g_esTankCache[tank].g_iFireImmunity = 0; + g_esTankCache[tank].g_iHittableImmunity = 0; + g_esTankCache[tank].g_iHumanMultiplierMode = 0; + g_esTankCache[tank].g_iIntangibleBody = 0; + g_esTankCache[tank].g_iKillMessage = 0; + g_esTankCache[tank].g_iMeleeHitMode = 0; + g_esTankCache[tank].g_iMeleeImmunity = 0; + g_esTankCache[tank].g_iMinimumHumans = 0; + g_esTankCache[tank].g_iMultiplyHealth = 0; + g_esTankCache[tank].g_iPassiveHealth = 0; + g_esTankCache[tank].g_iRandomSpecial = 0; + g_esTankCache[tank].g_iSpawnProtection = 0; + g_esTankCache[tank].g_iSpawnType = 0; + g_esTankCache[tank].g_iSpecialNote = 0; + g_esTankCache[tank].g_iThrowRock = 0; + g_esTankCache[tank].g_iVocalizeArrival = 0; + g_esTankCache[tank].g_iVocalizeDeath = 0; + g_esTankCache[tank].g_iVomitImmunity = 0; + + for (int iPos = 0; iPos < (sizeof esTankCache::g_iTransformType); iPos++) + { + g_esTankCache[tank].g_iTransformType[iPos] = 0; - g_esGeneral.g_bRecycleTypes2 = false; - g_esSpecific.g_bRecycleTypes2[iSpecType] = false; - int iFinalCount = (iTypeCount > 0) ? iTypeCount : iCycleCount; + if (iPos < (sizeof esTankCache::g_iRewardEnabled)) + { + g_esTankCache[tank].g_flActionDurationReward[iPos] = 0.0; + g_esTankCache[tank].g_flAdrenalineTimeReward[iPos] = 0.0; + g_esTankCache[tank].g_iAmmoBoostReward[iPos] = 0; + g_esTankCache[tank].g_iAmmoRefillReward[iPos] = 0; + g_esTankCache[tank].g_iAmmoRegenReward[iPos] = 0; + g_esTankCache[tank].g_flAttackBoostReward[iPos] = 0.0; + g_esTankCache[tank].g_iBlazeHealthReward[iPos] = 0; + g_esTankCache[tank].g_iBloodDonorReward[iPos] = 0; + g_esTankCache[tank].g_iBunnyHopReward[iPos] = 0; + g_esTankCache[tank].g_iBurstDoorsReward[iPos] = 0; + g_esTankCache[tank].g_iCleanKillsReward[iPos] = 0; + g_esTankCache[tank].g_iClusterBombsReward[iPos] = 0; + g_esTankCache[tank].g_flDamageBoostReward[iPos] = 0.0; + g_esTankCache[tank].g_flDamageResistanceReward[iPos] = 0.0; + g_esTankCache[tank].g_flDopamineRadiusReward[iPos] = 0.0; + g_esTankCache[tank].g_iEternalFlamesReward[iPos] = 0; + g_esTankCache[tank].g_iFastRecoveryReward[iPos] = 0; + g_esTankCache[tank].g_flFireRateReward[iPos] = 0.0; + g_esTankCache[tank].g_iFriendlyFireReward[iPos] = 0; + g_esTankCache[tank].g_iGhostBulletsReward[iPos] = 0; + g_esTankCache[tank].g_flGrenadeLauncherReward[iPos] = 0.0; + g_esTankCache[tank].g_flHealPercentReward[iPos] = 0.0; + g_esTankCache[tank].g_flHealthcareRadiusReward[iPos] = 0.0; + g_esTankCache[tank].g_iHealthRegenReward[iPos] = 0; + g_esTankCache[tank].g_flHeartbeatReward[iPos] = 0.0; + g_esTankCache[tank].g_flHollowpointAmmoReward[iPos] = 0.0; + g_esTankCache[tank].g_flJumpHeightReward[iPos] = 0.0; + g_esTankCache[tank].g_iInfiniteAmmoReward[iPos] = 0; + g_esTankCache[tank].g_iLadderActionsReward[iPos] = 0; + g_esTankCache[tank].g_flLadyKillerReward[iPos] = 0.0; + g_esTankCache[tank].g_iLaserSightReward[iPos] = 0; + g_esTankCache[tank].g_iLifeLeechReward[iPos] = 0; + g_esTankCache[tank].g_flLoopingVoicelineInterval[iPos] = 0.0; + g_esTankCache[tank].g_flLuckyBulletReward[iPos] = 0.0; + g_esTankCache[tank].g_iMedicalCutsReward[iPos] = 0; + g_esTankCache[tank].g_iMeleeRangeReward[iPos] = 0; + g_esTankCache[tank].g_iMidairDashesReward[iPos] = 0; + g_esTankCache[tank].g_flMotivationRadiusReward[iPos] = 0.0; + g_esTankCache[tank].g_flOverdoseRadiusReward[iPos] = 0.0; + g_esTankCache[tank].g_iOverhealthReward[iPos] = 0; + g_esTankCache[tank].g_iParticleEffectVisual[iPos] = 0; + g_esTankCache[tank].g_flPipeBombDurationReward[iPos] = 0.0; + g_esTankCache[tank].g_iPrefsNotify[iPos] = 0; + g_esTankCache[tank].g_flPunchResistanceReward[iPos] = 0.0; + g_esTankCache[tank].g_flRapidPistolReward[iPos] = 0.0; + g_esTankCache[tank].g_iRecoilDampenerReward[iPos] = 0; + g_esTankCache[tank].g_flRefillPercentReward[iPos] = 0.0; + g_esTankCache[tank].g_iRegenBurstsReward[iPos] = 0; + g_esTankCache[tank].g_flReloadRateReward[iPos] = 0.0; + g_esTankCache[tank].g_iRespawnLoadoutReward[iPos] = 0; + g_esTankCache[tank].g_iReviveHealthReward[iPos] = 0; + g_esTankCache[tank].g_iRewardBots[iPos] = -1; + g_esTankCache[tank].g_flRewardChance[iPos] = 0.0; + g_esTankCache[tank].g_flRewardDuration[iPos] = 0.0; + g_esTankCache[tank].g_iRewardEffect[iPos] = 0; + g_esTankCache[tank].g_iRewardEnabled[iPos] = -1; + g_esTankCache[tank].g_iRewardNotify[iPos] = 0; + g_esTankCache[tank].g_flRewardPercentage[iPos] = 0.0; + g_esTankCache[tank].g_iRewardVisual[iPos] = 0; + g_esTankCache[tank].g_iRiotGearReward[iPos] = 0; + g_esTankCache[tank].g_iSafetyBubbleReward[iPos] = 0; + g_esTankCache[tank].g_iShareRewards[iPos] = 0; + g_esTankCache[tank].g_flShockwaveRadiusReward[iPos] = 0.0; + g_esTankCache[tank].g_flShoveDamageReward[iPos] = 0.0; + g_esTankCache[tank].g_iShovePenaltyReward[iPos] = 0; + g_esTankCache[tank].g_flShoveRateReward[iPos] = 0.0; + g_esTankCache[tank].g_flSledgehammerRoundsReward[iPos] = 0.0; + g_esTankCache[tank].g_iSpecialAmmoReward[iPos] = 0; + g_esTankCache[tank].g_flSpeedBoostReward[iPos] = 0.0; + g_esTankCache[tank].g_iStackRewards[iPos] = 0; + g_esTankCache[tank].g_iStickyGrenadesReward[iPos] = 0; + g_esTankCache[tank].g_flSupplierReward[iPos] = 0.0; + g_esTankCache[tank].g_flSwingRateReward[iPos] = 0.0; + g_esTankCache[tank].g_iSyringeDartsReward[iPos] = 0; + g_esTankCache[tank].g_iThornsReward[iPos] = 0; + g_esTankCache[tank].g_iUsefulRewards[iPos] = 0; + g_esTankCache[tank].g_iVoicePitchVisual[iPos] = 0; + } - switch (iFinalCount) - { - case 0: - { - MT_PrintToChat(admin, "%s %t", MT_TAG3, "RequestFailed"); + if (iPos < (sizeof esTankCache::g_iStackLimits)) + { + g_esTankCache[tank].g_iStackLimits[iPos] = 0; + } - return; - } - case 1: - { - int iChosen = g_esGeneral.g_iChosenType; + if (iPos < (sizeof esTankCache::g_flComboChance)) + { + g_esTankCache[tank].g_flComboChance[iPos] = 0.0; + g_esTankCache[tank].g_iComboCooldown[iPos] = 0; + g_esTankCache[tank].g_flComboDamage[iPos] = 0.0; + g_esTankCache[tank].g_flComboDeathChance[iPos] = 0.0; + g_esTankCache[tank].g_flComboDeathRange[iPos] = 0.0; + g_esTankCache[tank].g_flComboDelay[iPos] = 0.0; + g_esTankCache[tank].g_flComboDuration[iPos] = 0.0; + g_esTankCache[tank].g_flComboInterval[iPos] = 0.0; + g_esTankCache[tank].g_flComboMinRadius[iPos] = 0.0; + g_esTankCache[tank].g_flComboMaxRadius[iPos] = 0.0; + g_esTankCache[tank].g_flComboRange[iPos] = 0.0; + g_esTankCache[tank].g_flComboRangeChance[iPos] = 0.0; + g_esTankCache[tank].g_iComboRangeCooldown[iPos] = 0; + g_esTankCache[tank].g_flComboRockChance[iPos] = 0.0; + g_esTankCache[tank].g_iComboRockCooldown[iPos] = 0; + g_esTankCache[tank].g_flComboSpeed[iPos] = 0.0; + } - switch (specType) + if (iPos < (sizeof esTankCache::g_flComboTypeChance)) { - case 1: MT_PrintToChat(admin, "%s %t", MT_TAG3, "RequestSucceededSmoker", iChosen, g_esTank[iChosen].g_iRealType[0]); - case 2: MT_PrintToChat(admin, "%s %t", MT_TAG3, "RequestSucceededBoomer", iChosen, g_esTank[iChosen].g_iRealType[0]); - case 3: MT_PrintToChat(admin, "%s %t", MT_TAG3, "RequestSucceededHunter", iChosen, g_esTank[iChosen].g_iRealType[0]); - case 4: MT_PrintToChat(admin, "%s %t", MT_TAG3, "RequestSucceededSpitter", iChosen, g_esTank[iChosen].g_iRealType[0]); - case 5: MT_PrintToChat(admin, "%s %t", MT_TAG3, "RequestSucceededJockey", iChosen, g_esTank[iChosen].g_iRealType[0]); - case 6: MT_PrintToChat(admin, "%s %t", MT_TAG3, "RequestSucceededCharger", iChosen, g_esTank[iChosen].g_iRealType[0]); - default: MT_PrintToChat(admin, "%s %t", MT_TAG3, "RequestSucceeded", iChosen, g_esTank[iChosen].g_iRealType[0]); + g_esTankCache[tank].g_flComboTypeChance[iPos] = 0.0; } - } - default: - { - bool bLinear = iGetCycleType(specType) >= 3; - g_esGeneral.g_iChosenType = (iTypeCount > 0) ? iTankTypes[bLinear ? 1 : MT_GetRandomInt(1, iTypeCount)] : iCycleTypes[bLinear ? 1 : MT_GetRandomInt(1, iCycleCount)]; - int iChosen = g_esGeneral.g_iChosenType; - g_esGeneral.g_bRecycleTypes2 = specType == iClass && iTypeCount <= 0 && iCycleCount > 0; - g_esTank[iChosen].g_bTypeCycled2 = specType == iClass; - g_esSpecific.g_bRecycleTypes2[iSpecType] = specType != iClass && iTypeCount <= 0 && iCycleCount > 0; - g_esSpecial[iChosen].g_bTypeCycled2[iSpecType] = specType != iClass; - switch (specType) + if (iPos < (sizeof esTankCache::g_iSkinColor)) { - case 1: MT_PrintToChat(admin, "%s %t", MT_TAG3, "MultipleMatchesSmoker", iChosen, g_esTank[iChosen].g_iRealType[0]); - case 2: MT_PrintToChat(admin, "%s %t", MT_TAG3, "MultipleMatchesBoomer", iChosen, g_esTank[iChosen].g_iRealType[0]); - case 3: MT_PrintToChat(admin, "%s %t", MT_TAG3, "MultipleMatchesHunter", iChosen, g_esTank[iChosen].g_iRealType[0]); - case 4: MT_PrintToChat(admin, "%s %t", MT_TAG3, "MultipleMatchesSpitter", iChosen, g_esTank[iChosen].g_iRealType[0]); - case 5: MT_PrintToChat(admin, "%s %t", MT_TAG3, "MultipleMatchesJockey", iChosen, g_esTank[iChosen].g_iRealType[0]); - case 6: MT_PrintToChat(admin, "%s %t", MT_TAG3, "MultipleMatchesCharger", iChosen, g_esTank[iChosen].g_iRealType[0]); - default: MT_PrintToChat(admin, "%s %t", MT_TAG3, "MultipleMatches", iChosen, g_esTank[iChosen].g_iRealType[0]); + g_esTankCache[tank].g_iBossHealth[iPos] = 0; + g_esTankCache[tank].g_iBossType[iPos] = 0; } } } - } - } - default: g_esGeneral.g_iChosenType = iClamp(g_esTank[iType].g_iRecordedType[0], 1, MT_MAXTYPES); - } - bool bAdmin = bIsDeveloper(admin, .real = true) || CheckCommandAccess(admin, "sm_tank", ADMFLAG_ROOT, true); + g_esTankCache[tank].g_sGlowColor[0] = '\0'; + g_esTankCache[tank].g_sRockColor[0] = '\0'; + g_esTankCache[tank].g_sSkinColor[0] = '\0'; + g_esTankCache[tank].g_iBodyEffects = 0; + g_esTankCache[tank].g_iGlowEnabled = 0; + g_esTankCache[tank].g_iGlowFlashing = 0; + g_esTankCache[tank].g_iGlowMaxRange = 0; + g_esTankCache[tank].g_iGlowMinRange = 0; + g_esTankCache[tank].g_iGlowType = 0; + g_esTankCache[tank].g_iRockEffects = 0; + g_esTankCache[tank].g_iRockModel = 0; + g_esTankCache[tank].g_iSpecialModel = 0; - switch (bIsInfected(admin)) - { - case true: - { - switch (bIsInfected(admin, MT_CHECK_FAKECLIENT)) - { - case true: + for (int iPos = 0; iPos < (sizeof esTankCache::g_flBodyChance); iPos++) { - switch (spawn) + g_esTankCache[tank].g_flBodyChance[iPos] = 0.0; + + if (iPos < (sizeof esTankCache::g_iSkinColor)) { - case true: vSpawnTank(admin, specType, log, amount, mode, blind); - case false: + g_esTankCache[tank].g_flRockChance[iPos] = 0.0; + g_esTankCache[tank].g_iSkinColor[iPos] = 255; + g_esTankCache[tank].g_iRockColor[iPos] = 255; + } + + if (iPos < (sizeof esTankCache::g_iGlowColor)) + { + g_esTankCache[tank].g_iGlowColor[iPos] = 255; + } + } + } + } + else + { + g_esTankCache[tank].g_iTankEnabled = iGetSettingValue(bAccess, true, g_esTank[iType].g_iTankEnabled, g_esGeneral.g_iTankEnabled, 1); + if (g_esTankCache[tank].g_iTankEnabled == 1) + { + if (!visualsOnly) + { + g_esTankCache[tank].g_flArmorDuration = flGetSettingValue(bAccess, true, g_esTank[iType].g_flArmorDuration, g_esGeneral.g_flArmorDuration, 1); + g_esTankCache[tank].g_flArmorDuration = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flArmorDuration, g_esTankCache[tank].g_flArmorDuration, 1); + g_esTankCache[tank].g_flArmorPercentage = flGetSettingValue(bAccess, true, g_esTank[iType].g_flArmorPercentage, g_esGeneral.g_flArmorPercentage, 1); + g_esTankCache[tank].g_flArmorPercentage = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flArmorPercentage, g_esTankCache[tank].g_flArmorPercentage, 1); + g_esTankCache[tank].g_flArmorResistance[0] = flGetSettingValue(bAccess, true, g_esTank[iType].g_flArmorResistance[0], g_esGeneral.g_flArmorResistance[0], 1); + g_esTankCache[tank].g_flArmorResistance[0] = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flArmorResistance[0], g_esTankCache[tank].g_flArmorResistance[0], 1); + g_esTankCache[tank].g_flArmorResistance[1] = flGetSettingValue(bAccess, true, g_esTank[iType].g_flArmorResistance[1], g_esGeneral.g_flArmorResistance[1], 1); + g_esTankCache[tank].g_flArmorResistance[1] = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flArmorResistance[1], g_esTankCache[tank].g_flArmorResistance[1], 1); + g_esTankCache[tank].g_flAttackInterval = flGetSettingValue(bAccess, true, g_esTank[iType].g_flAttackInterval, g_esGeneral.g_flAttackInterval, 1); + g_esTankCache[tank].g_flAttackInterval = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flAttackInterval, g_esTankCache[tank].g_flAttackInterval, 1); + g_esTankCache[tank].g_flBurnDuration = flGetSettingValue(bAccess, true, g_esTank[iType].g_flBurnDuration, g_esGeneral.g_flBurnDuration, 1); + g_esTankCache[tank].g_flBurnDuration = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flBurnDuration, g_esTankCache[tank].g_flBurnDuration, 1); + g_esTankCache[tank].g_flBurntSkin = flGetSettingValue(bAccess, true, g_esTank[iType].g_flBurntSkin, g_esGeneral.g_flBurntSkin, 1, -1.0); + g_esTankCache[tank].g_flBurntSkin = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flBurntSkin, g_esTankCache[tank].g_flBurntSkin, 1, -1.0); + g_esTankCache[tank].g_flClawDamage = flGetSettingValue(bAccess, true, g_esTank[iType].g_flClawDamage, g_esGeneral.g_flClawDamage, 1, -1.0); + g_esTankCache[tank].g_flClawDamage = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flClawDamage, g_esTankCache[tank].g_flClawDamage, 1, -1.0); + g_esTankCache[tank].g_flHealPercentMultiplier = flGetSettingValue(bAccess, true, g_esTank[iType].g_flHealPercentMultiplier, g_esGeneral.g_flHealPercentMultiplier, 1); + g_esTankCache[tank].g_flHealPercentMultiplier = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flHealPercentMultiplier, g_esTankCache[tank].g_flHealPercentMultiplier, 1); + g_esTankCache[tank].g_flHittableDamage = flGetSettingValue(bAccess, true, g_esTank[iType].g_flHittableDamage, g_esGeneral.g_flHittableDamage, 1, -1.0); + g_esTankCache[tank].g_flHittableDamage = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flHittableDamage, g_esTankCache[tank].g_flHittableDamage, 1, -1.0); + g_esTankCache[tank].g_flIncapDamageMultiplier = flGetSettingValue(bAccess, true, g_esTank[iType].g_flIncapDamageMultiplier, g_esGeneral.g_flIncapDamageMultiplier, 1); + g_esTankCache[tank].g_flIncapDamageMultiplier = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flIncapDamageMultiplier, g_esTankCache[tank].g_flIncapDamageMultiplier, 1); + g_esTankCache[tank].g_flMeleeHitValue = flGetSettingValue(bAccess, true, g_esTank[iType].g_flMeleeHitValue, g_esGeneral.g_flMeleeHitValue, 1); + g_esTankCache[tank].g_flMeleeHitValue = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flMeleeHitValue, g_esTankCache[tank].g_flMeleeHitValue, 1); + g_esTankCache[tank].g_flPassiveDelay = flGetSettingValue(bAccess, true, g_esTank[iType].g_flPassiveDelay, g_esGeneral.g_flPassiveDelay, 1); + g_esTankCache[tank].g_flPassiveDelay = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flPassiveDelay, g_esTankCache[tank].g_flPassiveDelay, 1); + g_esTankCache[tank].g_flPassiveInterval = flGetSettingValue(bAccess, true, g_esTank[iType].g_flPassiveInterval, g_esGeneral.g_flPassiveInterval, 1); + g_esTankCache[tank].g_flPassiveInterval = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flPassiveInterval, g_esTankCache[tank].g_flPassiveInterval, 1); + g_esTankCache[tank].g_flPunchForce = flGetSettingValue(bAccess, true, g_esTank[iType].g_flPunchForce, g_esGeneral.g_flPunchForce, 1, -1.0); + g_esTankCache[tank].g_flPunchForce = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flPunchForce, g_esTankCache[tank].g_flPunchForce, 1, -1.0); + g_esTankCache[tank].g_flPunchThrow = flGetSettingValue(bAccess, true, g_esTank[iType].g_flPunchThrow, g_esGeneral.g_flPunchThrow, 1); + g_esTankCache[tank].g_flPunchThrow = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flPunchThrow, g_esTankCache[tank].g_flPunchThrow, 1); + g_esTankCache[tank].g_flRandomDuration = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flRandomDuration, g_esTank[iType].g_flRandomDuration, 1); + g_esTankCache[tank].g_flRandomInterval = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flRandomInterval, g_esTank[iType].g_flRandomInterval, 1); + g_esTankCache[tank].g_flRockDamage = flGetSettingValue(bAccess, true, g_esTank[iType].g_flRockDamage, g_esGeneral.g_flRockDamage, 1, -1.0); + g_esTankCache[tank].g_flRockDamage = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flRockDamage, g_esTankCache[tank].g_flRockDamage, 1, -1.0); + g_esTankCache[tank].g_flRunSpeed = flGetSettingValue(bAccess, true, g_esTank[iType].g_flRunSpeed, g_esGeneral.g_flRunSpeed, 1); + g_esTankCache[tank].g_flRunSpeed = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flRunSpeed, g_esTankCache[tank].g_flRunSpeed, 1); + g_esTankCache[tank].g_flShieldDuration = flGetSettingValue(bAccess, true, g_esTank[iType].g_flShieldDuration, g_esGeneral.g_flShieldDuration, 1); + g_esTankCache[tank].g_flShieldDuration = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flShieldDuration, g_esTankCache[tank].g_flShieldDuration, 1); + g_esTankCache[tank].g_flShieldPercentage = flGetSettingValue(bAccess, true, g_esTank[iType].g_flShieldPercentage, g_esGeneral.g_flShieldPercentage, 1); + g_esTankCache[tank].g_flShieldPercentage = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flShieldPercentage, g_esTankCache[tank].g_flShieldPercentage, 1); + g_esTankCache[tank].g_flShieldRate = flGetSettingValue(bAccess, true, g_esTank[iType].g_flShieldRate, g_esGeneral.g_flShieldRate, 1); + g_esTankCache[tank].g_flShieldRate = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flShieldRate, g_esTankCache[tank].g_flShieldRate, 1); + g_esTankCache[tank].g_flShieldResistance = flGetSettingValue(bAccess, true, g_esTank[iType].g_flShieldResistance, g_esGeneral.g_flShieldResistance, 1); + g_esTankCache[tank].g_flShieldResistance = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flShieldResistance, g_esTankCache[tank].g_flShieldResistance, 1); + g_esTankCache[tank].g_flThrowForce = flGetSettingValue(bAccess, true, g_esTank[iType].g_flThrowForce, g_esGeneral.g_flThrowForce, 1); + g_esTankCache[tank].g_flThrowForce = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flThrowForce, g_esTankCache[tank].g_flThrowForce, 1); + g_esTankCache[tank].g_flThrowInterval = flGetSettingValue(bAccess, true, g_esTank[iType].g_flThrowInterval, g_esGeneral.g_flThrowInterval, 1); + g_esTankCache[tank].g_flThrowInterval = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flThrowInterval, g_esTankCache[tank].g_flThrowInterval, 1); + g_esTankCache[tank].g_flTransformDelay = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flTransformDelay, g_esTank[iType].g_flTransformDelay, 1); + g_esTankCache[tank].g_flTransformDuration = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flTransformDuration, g_esTank[iType].g_flTransformDuration, 1); + g_esTankCache[tank].g_iAnnounceArrival = iGetSettingValue(bAccess, true, g_esTank[iType].g_iAnnounceArrival, g_esGeneral.g_iAnnounceArrival, 1); + g_esTankCache[tank].g_iAnnounceArrival = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iAnnounceArrival, g_esTankCache[tank].g_iAnnounceArrival, 1); + g_esTankCache[tank].g_iAnnounceDeath = iGetSettingValue(bAccess, true, g_esTank[iType].g_iAnnounceDeath, g_esGeneral.g_iAnnounceDeath, 1); + g_esTankCache[tank].g_iAnnounceDeath = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iAnnounceDeath, g_esTankCache[tank].g_iAnnounceDeath, 1); + g_esTankCache[tank].g_iAnnounceKill = iGetSettingValue(bAccess, true, g_esTank[iType].g_iAnnounceKill, g_esGeneral.g_iAnnounceKill, 1); + g_esTankCache[tank].g_iAnnounceKill = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iAnnounceKill, g_esTankCache[tank].g_iAnnounceKill, 1); + g_esTankCache[tank].g_iArrivalMessage = iGetSettingValue(bAccess, true, g_esTank[iType].g_iArrivalMessage, g_esGeneral.g_iArrivalMessage, 1); + g_esTankCache[tank].g_iArrivalMessage = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iArrivalMessage, g_esTankCache[tank].g_iArrivalMessage, 1); + g_esTankCache[tank].g_iArrivalSound = iGetSettingValue(bAccess, true, g_esTank[iType].g_iArrivalSound, g_esGeneral.g_iArrivalSound, 1); + g_esTankCache[tank].g_iArrivalSound = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iArrivalSound, g_esTankCache[tank].g_iArrivalSound, 1); + g_esTankCache[tank].g_iAutoAggravate = iGetSettingValue(bAccess, true, g_esTank[iType].g_iAutoAggravate, g_esGeneral.g_iAutoAggravate, 1); + g_esTankCache[tank].g_iAutoHop = iGetSettingValue(bAccess, true, g_esTank[iType].g_iAutoHop, g_esGeneral.g_iAutoHop, 1); + g_esTankCache[tank].g_iAutoHop = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iAutoHop, g_esTankCache[tank].g_iAutoHop, 1); + g_esTankCache[tank].g_iBaseHealth = iGetSettingValue(bAccess, true, g_esTank[iType].g_iBaseHealth, g_esGeneral.g_iBaseHealth, 1); + g_esTankCache[tank].g_iBaseHealth = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iBaseHealth, g_esTankCache[tank].g_iBaseHealth, 1); + g_esTankCache[tank].g_iBossEffects = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iBossEffects, g_esTank[iType].g_iBossEffects, 1); + g_esTankCache[tank].g_iBossStages = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iBossStages, g_esTank[iType].g_iBossStages, 1); + g_esTankCache[tank].g_iBulletImmunity = iGetSettingValue(bAccess, true, g_esTank[iType].g_iBulletImmunity, g_esGeneral.g_iBulletImmunity, 1); + g_esTankCache[tank].g_iBulletImmunity = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iBulletImmunity, g_esTankCache[tank].g_iBulletImmunity, 1); + g_esTankCache[tank].g_iCheckAbilities = iGetSettingValue(bAccess, true, g_esTank[iType].g_iCheckAbilities, g_esGeneral.g_iCheckAbilities, 1); + g_esTankCache[tank].g_iCheckAbilities = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iCheckAbilities, g_esTankCache[tank].g_iCheckAbilities, 1); + g_esTankCache[tank].g_iDeathDetails = iGetSettingValue(bAccess, true, g_esTank[iType].g_iDeathDetails, g_esGeneral.g_iDeathDetails, 1); + g_esTankCache[tank].g_iDeathDetails = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iDeathDetails, g_esTankCache[tank].g_iDeathDetails, 1); + g_esTankCache[tank].g_iDeathMessage = iGetSettingValue(bAccess, true, g_esTank[iType].g_iDeathMessage, g_esGeneral.g_iDeathMessage, 1); + g_esTankCache[tank].g_iDeathMessage = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iDeathMessage, g_esTankCache[tank].g_iDeathMessage, 1); + g_esTankCache[tank].g_iDeathRevert = iGetSettingValue(bAccess, true, g_esTank[iType].g_iDeathRevert, g_esGeneral.g_iDeathRevert, 1); + g_esTankCache[tank].g_iDeathRevert = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iDeathRevert, g_esTankCache[tank].g_iDeathRevert, 1); + g_esTankCache[tank].g_iDeathSound = iGetSettingValue(bAccess, true, g_esTank[iType].g_iDeathSound, g_esGeneral.g_iDeathSound, 1); + g_esTankCache[tank].g_iDeathSound = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iDeathSound, g_esTankCache[tank].g_iDeathSound, 1); + g_esTankCache[tank].g_iDisplayHealth = iGetSettingValue(bAccess, true, g_esTank[iType].g_iDisplayHealth, g_esGeneral.g_iDisplayHealth, 1); + g_esTankCache[tank].g_iDisplayHealth = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iDisplayHealth, g_esTankCache[tank].g_iDisplayHealth, 1); + g_esTankCache[tank].g_iDisplayHealthType = iGetSettingValue(bAccess, true, g_esTank[iType].g_iDisplayHealthType, g_esGeneral.g_iDisplayHealthType, 1); + g_esTankCache[tank].g_iDisplayHealthType = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iDisplayHealthType, g_esTankCache[tank].g_iDisplayHealthType, 1); + g_esTankCache[tank].g_iExplosiveImmunity = iGetSettingValue(bAccess, true, g_esTank[iType].g_iExplosiveImmunity, g_esGeneral.g_iExplosiveImmunity, 1); + g_esTankCache[tank].g_iExplosiveImmunity = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iExplosiveImmunity, g_esTankCache[tank].g_iExplosiveImmunity, 1); + g_esTankCache[tank].g_iExtraHealth = iGetSettingValue(bAccess, true, g_esTank[iType].g_iExtraHealth, g_esGeneral.g_iExtraHealth, 2, -1); + g_esTankCache[tank].g_iExtraHealth = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iExtraHealth, g_esTankCache[tank].g_iExtraHealth, 2, -1); + g_esTankCache[tank].g_iFireImmunity = iGetSettingValue(bAccess, true, g_esTank[iType].g_iFireImmunity, g_esGeneral.g_iFireImmunity, 1); + g_esTankCache[tank].g_iFireImmunity = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iFireImmunity, g_esTankCache[tank].g_iFireImmunity, 1); + g_esTankCache[tank].g_iFootstepShake = iGetSettingValue(bAccess, true, g_esTank[iType].g_iFootstepShake, g_esGeneral.g_iFootstepShake, 1); + g_esTankCache[tank].g_iFootstepShake = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iFootstepShake, g_esTankCache[tank].g_iFootstepShake, 1); + g_esTankCache[tank].g_iGroundPound = iGetSettingValue(bAccess, true, g_esTank[iType].g_iGroundPound, g_esGeneral.g_iGroundPound, 1); + g_esTankCache[tank].g_iGroundPound = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iGroundPound, g_esTankCache[tank].g_iGroundPound, 1); + g_esTankCache[tank].g_iHittableImmunity = iGetSettingValue(bAccess, true, g_esTank[iType].g_iHittableImmunity, g_esGeneral.g_iHittableImmunity, 1); + g_esTankCache[tank].g_iHittableImmunity = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iHittableImmunity, g_esTankCache[tank].g_iHittableImmunity, 1); + g_esTankCache[tank].g_iHumanMultiplierMode = iGetSettingValue(bAccess, true, g_esTank[iType].g_iHumanMultiplierMode, g_esGeneral.g_iHumanMultiplierMode, 1); + g_esTankCache[tank].g_iHumanMultiplierMode = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iHumanMultiplierMode, g_esTankCache[tank].g_iHumanMultiplierMode, 1); + g_esTankCache[tank].g_iIntangibleBody = iGetSettingValue(bAccess, true, g_esTank[iType].g_iIntangibleBody, g_esGeneral.g_iIntangibleBody, 1); + g_esTankCache[tank].g_iIntangibleBody = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iIntangibleBody, g_esTankCache[tank].g_iIntangibleBody, 1); + g_esTankCache[tank].g_iKillMessage = iGetSettingValue(bAccess, true, g_esTank[iType].g_iKillMessage, g_esGeneral.g_iKillMessage, 1); + g_esTankCache[tank].g_iKillMessage = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iKillMessage, g_esTankCache[tank].g_iKillMessage, 1); + g_esTankCache[tank].g_iMeleeHitMode = iGetSettingValue(bAccess, true, g_esTank[iType].g_iMeleeHitMode, g_esGeneral.g_iMeleeHitMode, 1); + g_esTankCache[tank].g_iMeleeHitMode = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iMeleeHitMode, g_esTankCache[tank].g_iMeleeHitMode, 1); + g_esTankCache[tank].g_iMeleeImmunity = iGetSettingValue(bAccess, true, g_esTank[iType].g_iMeleeImmunity, g_esGeneral.g_iMeleeImmunity, 1); + g_esTankCache[tank].g_iMeleeImmunity = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iMeleeImmunity, g_esTankCache[tank].g_iMeleeImmunity, 1); + g_esTankCache[tank].g_iMinimumHumans = iGetSettingValue(bAccess, true, g_esTank[iType].g_iMinimumHumans, g_esGeneral.g_iMinimumHumans, 1); + g_esTankCache[tank].g_iMinimumHumans = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iMinimumHumans, g_esTankCache[tank].g_iMinimumHumans, 1); + g_esTankCache[tank].g_iMultiplyHealth = iGetSettingValue(bAccess, true, g_esTank[iType].g_iMultiplyHealth, g_esGeneral.g_iMultiplyHealth, 1); + g_esTankCache[tank].g_iMultiplyHealth = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iMultiplyHealth, g_esTankCache[tank].g_iMultiplyHealth, 1); + g_esTankCache[tank].g_iPassiveHealth = iGetSettingValue(bAccess, true, g_esTank[iType].g_iPassiveHealth, g_esGeneral.g_iPassiveHealth, 2, -1); + g_esTankCache[tank].g_iPassiveHealth = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iPassiveHealth, g_esTankCache[tank].g_iPassiveHealth, 2, -1); + g_esTankCache[tank].g_iPrioritizeThrows = iGetSettingValue(bAccess, true, g_esTank[iType].g_iPrioritizeThrows, g_esGeneral.g_iPrioritizeThrows, 1); + g_esTankCache[tank].g_iRandomTank = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iRandomTank, g_esTank[iType].g_iRandomTank, 1); + g_esTankCache[tank].g_iRockSound = iGetSettingValue(bAccess, true, g_esTank[iType].g_iRockSound, g_esGeneral.g_iRockSound, 1); + g_esTankCache[tank].g_iRockSound = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iRockSound, g_esTankCache[tank].g_iRockSound, 1); + g_esTankCache[tank].g_iSkipIncap = iGetSettingValue(bAccess, true, g_esTank[iType].g_iSkipIncap, g_esGeneral.g_iSkipIncap, 1); + g_esTankCache[tank].g_iSkipIncap = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iSkipIncap, g_esTankCache[tank].g_iSkipIncap, 1); + g_esTankCache[tank].g_iSkipTaunt = iGetSettingValue(bAccess, true, g_esTank[iType].g_iSkipTaunt, g_esGeneral.g_iSkipTaunt, 1); + g_esTankCache[tank].g_iSkipTaunt = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iSkipTaunt, g_esTankCache[tank].g_iSkipTaunt, 1); + g_esTankCache[tank].g_iSpawnProtection = iGetSettingValue(bAccess, true, g_esTank[iType].g_iSpawnProtection, g_esGeneral.g_iSpawnProtection, 1); + g_esTankCache[tank].g_iSpawnProtection = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iSpawnProtection, g_esTankCache[tank].g_iSpawnProtection, 1); + g_esTankCache[tank].g_iSpawnType = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iSpawnType, g_esTank[iType].g_iSpawnType, 1); + g_esTankCache[tank].g_iSweepFist = iGetSettingValue(bAccess, true, g_esTank[iType].g_iSweepFist, g_esGeneral.g_iSweepFist, 1); + g_esTankCache[tank].g_iSweepFist = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iSweepFist, g_esTankCache[tank].g_iSweepFist, 1); + g_esTankCache[tank].g_iTankNote = iGetSettingValue(bAccess, true, g_esTank[iType].g_iTankNote, g_esGeneral.g_iTankNote, 1); + g_esTankCache[tank].g_iTankNote = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iTankNote, g_esTankCache[tank].g_iTankNote, 1); + g_esTankCache[tank].g_iTeammateLimit = iGetSettingValue(bAccess, true, g_esTank[iType].g_iTeammateLimit, g_esGeneral.g_iTeammateLimit, 1); + g_esTankCache[tank].g_iTeammateLimit = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iTeammateLimit, g_esTankCache[tank].g_iTeammateLimit, 1); + g_esTankCache[tank].g_iThrowRock = iGetSettingValue(bAccess, true, g_esTank[iType].g_iThrowRock, g_esGeneral.g_iThrowRock, 1); + g_esTankCache[tank].g_iThrowRock = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iThrowRock, g_esTankCache[tank].g_iThrowRock, 1); + g_esTankCache[tank].g_iVocalizeArrival = iGetSettingValue(bAccess, true, g_esTank[iType].g_iVocalizeArrival, g_esGeneral.g_iVocalizeArrival, 1); + g_esTankCache[tank].g_iVocalizeArrival = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iVocalizeArrival, g_esTankCache[tank].g_iVocalizeArrival, 1); + g_esTankCache[tank].g_iVocalizeDeath = iGetSettingValue(bAccess, true, g_esTank[iType].g_iVocalizeDeath, g_esGeneral.g_iVocalizeDeath, 1); + g_esTankCache[tank].g_iVocalizeDeath = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iVocalizeDeath, g_esTankCache[tank].g_iVocalizeDeath, 1); + g_esTankCache[tank].g_iVomitImmunity = iGetSettingValue(bAccess, true, g_esTank[iType].g_iVomitImmunity, g_esGeneral.g_iVomitImmunity, 1); + g_esTankCache[tank].g_iVomitImmunity = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iVomitImmunity, g_esTankCache[tank].g_iVomitImmunity, 1); + + vGetSettingValue(bAccess, true, g_esTankCache[tank].g_sArmorCharacters, sizeof esTankCache::g_sArmorCharacters, g_esTank[iType].g_sArmorCharacters, g_esGeneral.g_sArmorCharacters); + vGetSettingValue(bAccess, bHuman, g_esTankCache[tank].g_sArmorCharacters, sizeof esTankCache::g_sArmorCharacters, g_esPlayer[tank].g_sArmorCharacters, g_esTankCache[tank].g_sArmorCharacters); + vGetSettingValue(bAccess, true, g_esTankCache[tank].g_sBodyColorVisual, sizeof esTankCache::g_sBodyColorVisual, g_esTank[iType].g_sBodyColorVisual, g_esGeneral.g_sBodyColorVisual); + vGetSettingValue(bAccess, bHuman, g_esTankCache[tank].g_sBodyColorVisual, sizeof esTankCache::g_sBodyColorVisual, g_esPlayer[tank].g_sBodyColorVisual, g_esTankCache[tank].g_sBodyColorVisual); + vGetSettingValue(bAccess, true, g_esTankCache[tank].g_sBodyColorVisual2, sizeof esTankCache::g_sBodyColorVisual2, g_esTank[iType].g_sBodyColorVisual2, g_esGeneral.g_sBodyColorVisual2); + vGetSettingValue(bAccess, bHuman, g_esTankCache[tank].g_sBodyColorVisual2, sizeof esTankCache::g_sBodyColorVisual2, g_esPlayer[tank].g_sBodyColorVisual2, g_esTankCache[tank].g_sBodyColorVisual2); + vGetSettingValue(bAccess, true, g_esTankCache[tank].g_sBodyColorVisual3, sizeof esTankCache::g_sBodyColorVisual3, g_esTank[iType].g_sBodyColorVisual3, g_esGeneral.g_sBodyColorVisual3); + vGetSettingValue(bAccess, bHuman, g_esTankCache[tank].g_sBodyColorVisual3, sizeof esTankCache::g_sBodyColorVisual3, g_esPlayer[tank].g_sBodyColorVisual3, g_esTankCache[tank].g_sBodyColorVisual3); + vGetSettingValue(bAccess, true, g_esTankCache[tank].g_sBodyColorVisual4, sizeof esTankCache::g_sBodyColorVisual4, g_esTank[iType].g_sBodyColorVisual4, g_esGeneral.g_sBodyColorVisual4); + vGetSettingValue(bAccess, bHuman, g_esTankCache[tank].g_sBodyColorVisual4, sizeof esTankCache::g_sBodyColorVisual4, g_esPlayer[tank].g_sBodyColorVisual4, g_esTankCache[tank].g_sBodyColorVisual4); + vGetSettingValue(bAccess, bHuman, g_esTankCache[tank].g_sComboSet, sizeof esTankCache::g_sComboSet, g_esPlayer[tank].g_sComboSet, g_esTank[iType].g_sComboSet); + vGetSettingValue(bAccess, true, g_esTankCache[tank].g_sFallVoicelineReward, sizeof esTankCache::g_sFallVoicelineReward, g_esTank[iType].g_sFallVoicelineReward, g_esGeneral.g_sFallVoicelineReward); + vGetSettingValue(bAccess, bHuman, g_esTankCache[tank].g_sFallVoicelineReward, sizeof esTankCache::g_sFallVoicelineReward, g_esPlayer[tank].g_sFallVoicelineReward, g_esTankCache[tank].g_sFallVoicelineReward); + vGetSettingValue(bAccess, true, g_esTankCache[tank].g_sFallVoicelineReward2, sizeof esTankCache::g_sFallVoicelineReward2, g_esTank[iType].g_sFallVoicelineReward2, g_esGeneral.g_sFallVoicelineReward2); + vGetSettingValue(bAccess, bHuman, g_esTankCache[tank].g_sFallVoicelineReward2, sizeof esTankCache::g_sFallVoicelineReward2, g_esPlayer[tank].g_sFallVoicelineReward2, g_esTankCache[tank].g_sFallVoicelineReward2); + vGetSettingValue(bAccess, true, g_esTankCache[tank].g_sFallVoicelineReward3, sizeof esTankCache::g_sFallVoicelineReward3, g_esTank[iType].g_sFallVoicelineReward3, g_esGeneral.g_sFallVoicelineReward3); + vGetSettingValue(bAccess, bHuman, g_esTankCache[tank].g_sFallVoicelineReward3, sizeof esTankCache::g_sFallVoicelineReward3, g_esPlayer[tank].g_sFallVoicelineReward3, g_esTankCache[tank].g_sFallVoicelineReward3); + vGetSettingValue(bAccess, true, g_esTankCache[tank].g_sFallVoicelineReward4, sizeof esTankCache::g_sFallVoicelineReward4, g_esTank[iType].g_sFallVoicelineReward4, g_esGeneral.g_sFallVoicelineReward4); + vGetSettingValue(bAccess, bHuman, g_esTankCache[tank].g_sFallVoicelineReward4, sizeof esTankCache::g_sFallVoicelineReward4, g_esPlayer[tank].g_sFallVoicelineReward4, g_esTankCache[tank].g_sFallVoicelineReward4); + vGetSettingValue(bAccess, true, g_esTankCache[tank].g_sHealthCharacters, sizeof esTankCache::g_sHealthCharacters, g_esTank[iType].g_sHealthCharacters, g_esGeneral.g_sHealthCharacters); + vGetSettingValue(bAccess, bHuman, g_esTankCache[tank].g_sHealthCharacters, sizeof esTankCache::g_sHealthCharacters, g_esPlayer[tank].g_sHealthCharacters, g_esTankCache[tank].g_sHealthCharacters); + vGetSettingValue(bAccess, true, g_esTankCache[tank].g_sItemReward, sizeof esTankCache::g_sItemReward, g_esTank[iType].g_sItemReward, g_esGeneral.g_sItemReward); + vGetSettingValue(bAccess, bHuman, g_esTankCache[tank].g_sItemReward, sizeof esTankCache::g_sItemReward, g_esPlayer[tank].g_sItemReward, g_esTankCache[tank].g_sItemReward); + vGetSettingValue(bAccess, true, g_esTankCache[tank].g_sItemReward2, sizeof esTankCache::g_sItemReward2, g_esTank[iType].g_sItemReward2, g_esGeneral.g_sItemReward2); + vGetSettingValue(bAccess, bHuman, g_esTankCache[tank].g_sItemReward2, sizeof esTankCache::g_sItemReward2, g_esPlayer[tank].g_sItemReward2, g_esTankCache[tank].g_sItemReward2); + vGetSettingValue(bAccess, true, g_esTankCache[tank].g_sItemReward3, sizeof esTankCache::g_sItemReward3, g_esTank[iType].g_sItemReward3, g_esGeneral.g_sItemReward3); + vGetSettingValue(bAccess, bHuman, g_esTankCache[tank].g_sItemReward3, sizeof esTankCache::g_sItemReward3, g_esPlayer[tank].g_sItemReward3, g_esTankCache[tank].g_sItemReward3); + vGetSettingValue(bAccess, true, g_esTankCache[tank].g_sItemReward4, sizeof esTankCache::g_sItemReward4, g_esTank[iType].g_sItemReward4, g_esGeneral.g_sItemReward4); + vGetSettingValue(bAccess, bHuman, g_esTankCache[tank].g_sItemReward4, sizeof esTankCache::g_sItemReward4, g_esPlayer[tank].g_sItemReward4, g_esTankCache[tank].g_sItemReward4); + vGetSettingValue(bAccess, true, g_esTankCache[tank].g_sLightColorVisual, sizeof esTankCache::g_sLightColorVisual, g_esTank[iType].g_sLightColorVisual, g_esGeneral.g_sLightColorVisual); + vGetSettingValue(bAccess, bHuman, g_esTankCache[tank].g_sLightColorVisual, sizeof esTankCache::g_sLightColorVisual, g_esPlayer[tank].g_sLightColorVisual, g_esTankCache[tank].g_sLightColorVisual); + vGetSettingValue(bAccess, true, g_esTankCache[tank].g_sLightColorVisual2, sizeof esTankCache::g_sLightColorVisual2, g_esTank[iType].g_sLightColorVisual2, g_esGeneral.g_sLightColorVisual2); + vGetSettingValue(bAccess, bHuman, g_esTankCache[tank].g_sLightColorVisual2, sizeof esTankCache::g_sLightColorVisual2, g_esPlayer[tank].g_sLightColorVisual2, g_esTankCache[tank].g_sLightColorVisual2); + vGetSettingValue(bAccess, true, g_esTankCache[tank].g_sLightColorVisual3, sizeof esTankCache::g_sLightColorVisual3, g_esTank[iType].g_sLightColorVisual3, g_esGeneral.g_sLightColorVisual3); + vGetSettingValue(bAccess, bHuman, g_esTankCache[tank].g_sLightColorVisual3, sizeof esTankCache::g_sLightColorVisual3, g_esPlayer[tank].g_sLightColorVisual3, g_esTankCache[tank].g_sLightColorVisual3); + vGetSettingValue(bAccess, true, g_esTankCache[tank].g_sLightColorVisual4, sizeof esTankCache::g_sLightColorVisual4, g_esTank[iType].g_sLightColorVisual4, g_esGeneral.g_sLightColorVisual4); + vGetSettingValue(bAccess, bHuman, g_esTankCache[tank].g_sLightColorVisual4, sizeof esTankCache::g_sLightColorVisual4, g_esPlayer[tank].g_sLightColorVisual4, g_esTankCache[tank].g_sLightColorVisual4); + vGetSettingValue(bAccess, true, g_esTankCache[tank].g_sLoopingVoicelineVisual, sizeof esTankCache::g_sLoopingVoicelineVisual, g_esTank[iType].g_sLoopingVoicelineVisual, g_esGeneral.g_sLoopingVoicelineVisual); + vGetSettingValue(bAccess, bHuman, g_esTankCache[tank].g_sLoopingVoicelineVisual, sizeof esTankCache::g_sLoopingVoicelineVisual, g_esPlayer[tank].g_sLoopingVoicelineVisual, g_esTankCache[tank].g_sLoopingVoicelineVisual); + vGetSettingValue(bAccess, true, g_esTankCache[tank].g_sLoopingVoicelineVisual2, sizeof esTankCache::g_sLoopingVoicelineVisual2, g_esTank[iType].g_sLoopingVoicelineVisual2, g_esGeneral.g_sLoopingVoicelineVisual2); + vGetSettingValue(bAccess, bHuman, g_esTankCache[tank].g_sLoopingVoicelineVisual2, sizeof esTankCache::g_sLoopingVoicelineVisual2, g_esPlayer[tank].g_sLoopingVoicelineVisual2, g_esTankCache[tank].g_sLoopingVoicelineVisual2); + vGetSettingValue(bAccess, true, g_esTankCache[tank].g_sLoopingVoicelineVisual3, sizeof esTankCache::g_sLoopingVoicelineVisual3, g_esTank[iType].g_sLoopingVoicelineVisual3, g_esGeneral.g_sLoopingVoicelineVisual3); + vGetSettingValue(bAccess, bHuman, g_esTankCache[tank].g_sLoopingVoicelineVisual3, sizeof esTankCache::g_sLoopingVoicelineVisual3, g_esPlayer[tank].g_sLoopingVoicelineVisual3, g_esTankCache[tank].g_sLoopingVoicelineVisual3); + vGetSettingValue(bAccess, true, g_esTankCache[tank].g_sLoopingVoicelineVisual4, sizeof esTankCache::g_sLoopingVoicelineVisual4, g_esTank[iType].g_sLoopingVoicelineVisual4, g_esGeneral.g_sLoopingVoicelineVisual4); + vGetSettingValue(bAccess, bHuman, g_esTankCache[tank].g_sLoopingVoicelineVisual4, sizeof esTankCache::g_sLoopingVoicelineVisual4, g_esPlayer[tank].g_sLoopingVoicelineVisual4, g_esTankCache[tank].g_sLoopingVoicelineVisual4); + vGetSettingValue(bAccess, true, g_esTankCache[tank].g_sOutlineColorVisual, sizeof esTankCache::g_sOutlineColorVisual, g_esTank[iType].g_sOutlineColorVisual, g_esGeneral.g_sOutlineColorVisual); + vGetSettingValue(bAccess, bHuman, g_esTankCache[tank].g_sOutlineColorVisual, sizeof esTankCache::g_sOutlineColorVisual, g_esPlayer[tank].g_sOutlineColorVisual, g_esTankCache[tank].g_sOutlineColorVisual); + vGetSettingValue(bAccess, true, g_esTankCache[tank].g_sOutlineColorVisual2, sizeof esTankCache::g_sOutlineColorVisual2, g_esTank[iType].g_sOutlineColorVisual2, g_esGeneral.g_sOutlineColorVisual2); + vGetSettingValue(bAccess, bHuman, g_esTankCache[tank].g_sOutlineColorVisual2, sizeof esTankCache::g_sOutlineColorVisual2, g_esPlayer[tank].g_sOutlineColorVisual2, g_esTankCache[tank].g_sOutlineColorVisual2); + vGetSettingValue(bAccess, true, g_esTankCache[tank].g_sOutlineColorVisual3, sizeof esTankCache::g_sOutlineColorVisual3, g_esTank[iType].g_sOutlineColorVisual3, g_esGeneral.g_sOutlineColorVisual3); + vGetSettingValue(bAccess, bHuman, g_esTankCache[tank].g_sOutlineColorVisual3, sizeof esTankCache::g_sOutlineColorVisual3, g_esPlayer[tank].g_sOutlineColorVisual3, g_esTankCache[tank].g_sOutlineColorVisual3); + vGetSettingValue(bAccess, true, g_esTankCache[tank].g_sOutlineColorVisual4, sizeof esTankCache::g_sOutlineColorVisual4, g_esTank[iType].g_sOutlineColorVisual4, g_esGeneral.g_sOutlineColorVisual4); + vGetSettingValue(bAccess, bHuman, g_esTankCache[tank].g_sOutlineColorVisual4, sizeof esTankCache::g_sOutlineColorVisual4, g_esPlayer[tank].g_sOutlineColorVisual4, g_esTankCache[tank].g_sOutlineColorVisual4); + vGetSettingValue(bAccess, true, g_esTankCache[tank].g_sScreenColorVisual, sizeof esTankCache::g_sScreenColorVisual, g_esTank[iType].g_sScreenColorVisual, g_esGeneral.g_sScreenColorVisual); + vGetSettingValue(bAccess, bHuman, g_esTankCache[tank].g_sScreenColorVisual, sizeof esTankCache::g_sScreenColorVisual, g_esPlayer[tank].g_sScreenColorVisual, g_esTankCache[tank].g_sScreenColorVisual); + vGetSettingValue(bAccess, true, g_esTankCache[tank].g_sScreenColorVisual2, sizeof esTankCache::g_sScreenColorVisual2, g_esTank[iType].g_sScreenColorVisual2, g_esGeneral.g_sScreenColorVisual2); + vGetSettingValue(bAccess, bHuman, g_esTankCache[tank].g_sScreenColorVisual2, sizeof esTankCache::g_sScreenColorVisual2, g_esPlayer[tank].g_sScreenColorVisual2, g_esTankCache[tank].g_sScreenColorVisual2); + vGetSettingValue(bAccess, true, g_esTankCache[tank].g_sScreenColorVisual3, sizeof esTankCache::g_sScreenColorVisual3, g_esTank[iType].g_sScreenColorVisual3, g_esGeneral.g_sScreenColorVisual3); + vGetSettingValue(bAccess, bHuman, g_esTankCache[tank].g_sScreenColorVisual3, sizeof esTankCache::g_sScreenColorVisual3, g_esPlayer[tank].g_sScreenColorVisual3, g_esTankCache[tank].g_sScreenColorVisual3); + vGetSettingValue(bAccess, true, g_esTankCache[tank].g_sScreenColorVisual4, sizeof esTankCache::g_sScreenColorVisual4, g_esTank[iType].g_sScreenColorVisual4, g_esGeneral.g_sScreenColorVisual4); + vGetSettingValue(bAccess, bHuman, g_esTankCache[tank].g_sScreenColorVisual4, sizeof esTankCache::g_sScreenColorVisual4, g_esPlayer[tank].g_sScreenColorVisual4, g_esTankCache[tank].g_sScreenColorVisual4); + vGetSettingValue(bAccess, true, g_esTankCache[tank].g_sShieldCharacters, sizeof esTankCache::g_sShieldCharacters, g_esTank[iType].g_sShieldCharacters, g_esGeneral.g_sShieldCharacters); + vGetSettingValue(bAccess, bHuman, g_esTankCache[tank].g_sShieldCharacters, sizeof esTankCache::g_sShieldCharacters, g_esPlayer[tank].g_sShieldCharacters, g_esTankCache[tank].g_sShieldCharacters); + vGetSettingValue(bAccess, bHuman, g_esTankCache[tank].g_sTankName, sizeof esTankCache::g_sTankName, g_esPlayer[tank].g_sTankName, g_esTank[iType].g_sTankName); + + for (int iPos = 0; iPos < (sizeof esTankCache::g_iTransformType); iPos++) + { + g_esTankCache[tank].g_iTransformType[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iTransformType[iPos], g_esTank[iType].g_iTransformType[iPos], 1); + + if (iPos < (sizeof esTankCache::g_iRewardEnabled)) { - if ((GetClientButtons(admin) & IN_SPEED) && bAdmin) - { - vChangeTank(admin, specType, amount, mode, blind); - } - else - { - int iTime = GetTime(); + g_esTankCache[tank].g_flActionDurationReward[iPos] = flGetSettingValue(bAccess, true, g_esTank[iType].g_flActionDurationReward[iPos], g_esGeneral.g_flActionDurationReward[iPos], 1); + g_esTankCache[tank].g_flActionDurationReward[iPos] = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flActionDurationReward[iPos], g_esTankCache[tank].g_flActionDurationReward[iPos], 1); + g_esTankCache[tank].g_flAdrenalineTimeReward[iPos] = flGetSettingValue(bAccess, true, g_esTank[iType].g_flAdrenalineTimeReward[iPos], g_esGeneral.g_flAdrenalineTimeReward[iPos], 1); + g_esTankCache[tank].g_flAdrenalineTimeReward[iPos] = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flAdrenalineTimeReward[iPos], g_esTankCache[tank].g_flAdrenalineTimeReward[iPos], 1); + g_esTankCache[tank].g_iAmmoBoostReward[iPos] = iGetSettingValue(bAccess, true, g_esTank[iType].g_iAmmoBoostReward[iPos], g_esGeneral.g_iAmmoBoostReward[iPos], 1); + g_esTankCache[tank].g_iAmmoBoostReward[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iAmmoBoostReward[iPos], g_esTankCache[tank].g_iAmmoBoostReward[iPos], 1); + g_esTankCache[tank].g_iAmmoRefillReward[iPos] = iGetSettingValue(bAccess, true, g_esTank[iType].g_iAmmoRefillReward[iPos], g_esGeneral.g_iAmmoRefillReward[iPos], 1); + g_esTankCache[tank].g_iAmmoRefillReward[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iAmmoRefillReward[iPos], g_esTankCache[tank].g_iAmmoRefillReward[iPos], 1); + g_esTankCache[tank].g_iAmmoRegenReward[iPos] = iGetSettingValue(bAccess, true, g_esTank[iType].g_iAmmoRegenReward[iPos], g_esGeneral.g_iAmmoRegenReward[iPos], 1); + g_esTankCache[tank].g_iAmmoRegenReward[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iAmmoRegenReward[iPos], g_esTankCache[tank].g_iAmmoRegenReward[iPos], 1); + g_esTankCache[tank].g_flAttackBoostReward[iPos] = flGetSettingValue(bAccess, true, g_esTank[iType].g_flAttackBoostReward[iPos], g_esGeneral.g_flAttackBoostReward[iPos], 1); + g_esTankCache[tank].g_flAttackBoostReward[iPos] = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flAttackBoostReward[iPos], g_esTankCache[tank].g_flAttackBoostReward[iPos], 1); + g_esTankCache[tank].g_iBlazeHealthReward[iPos] = iGetSettingValue(bAccess, true, g_esTank[iType].g_iBlazeHealthReward[iPos], g_esGeneral.g_iBlazeHealthReward[iPos], 1); + g_esTankCache[tank].g_iBlazeHealthReward[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iBlazeHealthReward[iPos], g_esTankCache[tank].g_iBlazeHealthReward[iPos], 1); + g_esTankCache[tank].g_iBloodDonorReward[iPos] = iGetSettingValue(bAccess, true, g_esTank[iType].g_iBloodDonorReward[iPos], g_esGeneral.g_iBloodDonorReward[iPos], 1); + g_esTankCache[tank].g_iBloodDonorReward[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iBloodDonorReward[iPos], g_esTankCache[tank].g_iBloodDonorReward[iPos], 1); + g_esTankCache[tank].g_iBunnyHopReward[iPos] = iGetSettingValue(bAccess, true, g_esTank[iType].g_iBunnyHopReward[iPos], g_esGeneral.g_iBunnyHopReward[iPos], 1); + g_esTankCache[tank].g_iBunnyHopReward[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iBunnyHopReward[iPos], g_esTankCache[tank].g_iBunnyHopReward[iPos], 1); + g_esTankCache[tank].g_iBurstDoorsReward[iPos] = iGetSettingValue(bAccess, true, g_esTank[iType].g_iBurstDoorsReward[iPos], g_esGeneral.g_iBurstDoorsReward[iPos], 1); + g_esTankCache[tank].g_iBurstDoorsReward[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iBurstDoorsReward[iPos], g_esTankCache[tank].g_iBurstDoorsReward[iPos], 1); + g_esTankCache[tank].g_iCleanKillsReward[iPos] = iGetSettingValue(bAccess, true, g_esTank[iType].g_iCleanKillsReward[iPos], g_esGeneral.g_iCleanKillsReward[iPos], 1); + g_esTankCache[tank].g_iCleanKillsReward[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iCleanKillsReward[iPos], g_esTankCache[tank].g_iCleanKillsReward[iPos], 1); + g_esTankCache[tank].g_iClusterBombsReward[iPos] = iGetSettingValue(bAccess, true, g_esTank[iType].g_iClusterBombsReward[iPos], g_esGeneral.g_iClusterBombsReward[iPos], 1); + g_esTankCache[tank].g_iClusterBombsReward[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iClusterBombsReward[iPos], g_esTankCache[tank].g_iClusterBombsReward[iPos], 1); + g_esTankCache[tank].g_flDamageBoostReward[iPos] = flGetSettingValue(bAccess, true, g_esTank[iType].g_flDamageBoostReward[iPos], g_esGeneral.g_flDamageBoostReward[iPos], 1); + g_esTankCache[tank].g_flDamageBoostReward[iPos] = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flDamageBoostReward[iPos], g_esTankCache[tank].g_flDamageBoostReward[iPos], 1); + g_esTankCache[tank].g_flDamageResistanceReward[iPos] = flGetSettingValue(bAccess, true, g_esTank[iType].g_flDamageResistanceReward[iPos], g_esGeneral.g_flDamageResistanceReward[iPos], 1); + g_esTankCache[tank].g_flDamageResistanceReward[iPos] = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flDamageResistanceReward[iPos], g_esTankCache[tank].g_flDamageResistanceReward[iPos], 1); + g_esTankCache[tank].g_flDopamineRadiusReward[iPos] = flGetSettingValue(bAccess, true, g_esTank[iType].g_flDopamineRadiusReward[iPos], g_esGeneral.g_flDopamineRadiusReward[iPos], 1); + g_esTankCache[tank].g_flDopamineRadiusReward[iPos] = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flDopamineRadiusReward[iPos], g_esTankCache[tank].g_flDopamineRadiusReward[iPos], 1); + g_esTankCache[tank].g_iEternalFlamesReward[iPos] = iGetSettingValue(bAccess, true, g_esTank[iType].g_iEternalFlamesReward[iPos], g_esGeneral.g_iEternalFlamesReward[iPos], 1); + g_esTankCache[tank].g_iEternalFlamesReward[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iEternalFlamesReward[iPos], g_esTankCache[tank].g_iEternalFlamesReward[iPos], 1); + g_esTankCache[tank].g_iFastRecoveryReward[iPos] = iGetSettingValue(bAccess, true, g_esTank[iType].g_iFastRecoveryReward[iPos], g_esGeneral.g_iFastRecoveryReward[iPos], 1); + g_esTankCache[tank].g_iFastRecoveryReward[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iFastRecoveryReward[iPos], g_esTankCache[tank].g_iFastRecoveryReward[iPos], 1); + g_esTankCache[tank].g_flFireRateReward[iPos] = flGetSettingValue(bAccess, true, g_esTank[iType].g_flFireRateReward[iPos], g_esGeneral.g_flFireRateReward[iPos], 1); + g_esTankCache[tank].g_flFireRateReward[iPos] = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flFireRateReward[iPos], g_esTankCache[tank].g_flFireRateReward[iPos], 1); + g_esTankCache[tank].g_iFriendlyFireReward[iPos] = iGetSettingValue(bAccess, true, g_esTank[iType].g_iFriendlyFireReward[iPos], g_esGeneral.g_iFriendlyFireReward[iPos], 1); + g_esTankCache[tank].g_iFriendlyFireReward[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iFriendlyFireReward[iPos], g_esTankCache[tank].g_iFriendlyFireReward[iPos], 1); + g_esTankCache[tank].g_iGhostBulletsReward[iPos] = iGetSettingValue(bAccess, true, g_esTank[iType].g_iGhostBulletsReward[iPos], g_esGeneral.g_iGhostBulletsReward[iPos], 1); + g_esTankCache[tank].g_iGhostBulletsReward[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iGhostBulletsReward[iPos], g_esTankCache[tank].g_iGhostBulletsReward[iPos], 1); + g_esTankCache[tank].g_flGrenadeLauncherReward[iPos] = flGetSettingValue(bAccess, true, g_esTank[iType].g_flGrenadeLauncherReward[iPos], g_esGeneral.g_flGrenadeLauncherReward[iPos], 1); + g_esTankCache[tank].g_flGrenadeLauncherReward[iPos] = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flGrenadeLauncherReward[iPos], g_esTankCache[tank].g_flGrenadeLauncherReward[iPos], 1); + g_esTankCache[tank].g_flHealPercentReward[iPos] = flGetSettingValue(bAccess, true, g_esTank[iType].g_flHealPercentReward[iPos], g_esGeneral.g_flHealPercentReward[iPos], 1); + g_esTankCache[tank].g_flHealPercentReward[iPos] = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flHealPercentReward[iPos], g_esTankCache[tank].g_flHealPercentReward[iPos], 1); + g_esTankCache[tank].g_flHealthcareRadiusReward[iPos] = flGetSettingValue(bAccess, true, g_esTank[iType].g_flHealthcareRadiusReward[iPos], g_esGeneral.g_flHealthcareRadiusReward[iPos], 1); + g_esTankCache[tank].g_flHealthcareRadiusReward[iPos] = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flHealthcareRadiusReward[iPos], g_esTankCache[tank].g_flHealthcareRadiusReward[iPos], 1); + g_esTankCache[tank].g_iHealthRegenReward[iPos] = iGetSettingValue(bAccess, true, g_esTank[iType].g_iHealthRegenReward[iPos], g_esGeneral.g_iHealthRegenReward[iPos], 1); + g_esTankCache[tank].g_iHealthRegenReward[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iHealthRegenReward[iPos], g_esTankCache[tank].g_iHealthRegenReward[iPos], 1); + g_esTankCache[tank].g_flHeartbeatReward[iPos] = flGetSettingValue(bAccess, true, g_esTank[iType].g_flHeartbeatReward[iPos], g_esGeneral.g_flHeartbeatReward[iPos], 1); + g_esTankCache[tank].g_flHeartbeatReward[iPos] = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flHeartbeatReward[iPos], g_esTankCache[tank].g_flHeartbeatReward[iPos], 1); + g_esTankCache[tank].g_flHollowpointAmmoReward[iPos] = flGetSettingValue(bAccess, true, g_esTank[iType].g_flHollowpointAmmoReward[iPos], g_esGeneral.g_flHollowpointAmmoReward[iPos], 1); + g_esTankCache[tank].g_flHollowpointAmmoReward[iPos] = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flHollowpointAmmoReward[iPos], g_esTankCache[tank].g_flHollowpointAmmoReward[iPos], 1); + g_esTankCache[tank].g_flJumpHeightReward[iPos] = flGetSettingValue(bAccess, true, g_esTank[iType].g_flJumpHeightReward[iPos], g_esGeneral.g_flJumpHeightReward[iPos], 1); + g_esTankCache[tank].g_flJumpHeightReward[iPos] = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flJumpHeightReward[iPos], g_esTankCache[tank].g_flJumpHeightReward[iPos], 1); + g_esTankCache[tank].g_iInfiniteAmmoReward[iPos] = iGetSettingValue(bAccess, true, g_esTank[iType].g_iInfiniteAmmoReward[iPos], g_esGeneral.g_iInfiniteAmmoReward[iPos], 1); + g_esTankCache[tank].g_iInfiniteAmmoReward[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iInfiniteAmmoReward[iPos], g_esTankCache[tank].g_iInfiniteAmmoReward[iPos], 1); + g_esTankCache[tank].g_iLadderActionsReward[iPos] = iGetSettingValue(bAccess, true, g_esTank[iType].g_iLadderActionsReward[iPos], g_esGeneral.g_iLadderActionsReward[iPos], 1); + g_esTankCache[tank].g_iLadderActionsReward[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iLadderActionsReward[iPos], g_esTankCache[tank].g_iLadderActionsReward[iPos], 1); + g_esTankCache[tank].g_flLadyKillerReward[iPos] = flGetSettingValue(bAccess, true, g_esTank[iType].g_flLadyKillerReward[iPos], g_esGeneral.g_flLadyKillerReward[iPos], 1); + g_esTankCache[tank].g_flLadyKillerReward[iPos] = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flLadyKillerReward[iPos], g_esTankCache[tank].g_flLadyKillerReward[iPos], 1); + g_esTankCache[tank].g_iLaserSightReward[iPos] = iGetSettingValue(bAccess, true, g_esTank[iType].g_iLaserSightReward[iPos], g_esGeneral.g_iLaserSightReward[iPos], 1); + g_esTankCache[tank].g_iLaserSightReward[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iLaserSightReward[iPos], g_esTankCache[tank].g_iLaserSightReward[iPos], 1); + g_esTankCache[tank].g_iLifeLeechReward[iPos] = iGetSettingValue(bAccess, true, g_esTank[iType].g_iLifeLeechReward[iPos], g_esGeneral.g_iLifeLeechReward[iPos], 1); + g_esTankCache[tank].g_iLifeLeechReward[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iLifeLeechReward[iPos], g_esTankCache[tank].g_iLifeLeechReward[iPos], 1); + g_esTankCache[tank].g_flLoopingVoicelineInterval[iPos] = flGetSettingValue(bAccess, true, g_esTank[iType].g_flLoopingVoicelineInterval[iPos], g_esGeneral.g_flLoopingVoicelineInterval[iPos], 1); + g_esTankCache[tank].g_flLoopingVoicelineInterval[iPos] = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flLoopingVoicelineInterval[iPos], g_esTankCache[tank].g_flLoopingVoicelineInterval[iPos], 1); + g_esTankCache[tank].g_flLuckyBulletReward[iPos] = flGetSettingValue(bAccess, true, g_esTank[iType].g_flLuckyBulletReward[iPos], g_esGeneral.g_flLuckyBulletReward[iPos], 1); + g_esTankCache[tank].g_flLuckyBulletReward[iPos] = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flLuckyBulletReward[iPos], g_esTankCache[tank].g_flLuckyBulletReward[iPos], 1); + g_esTankCache[tank].g_iMedicalCutsReward[iPos] = iGetSettingValue(bAccess, true, g_esTank[iType].g_iMedicalCutsReward[iPos], g_esGeneral.g_iMedicalCutsReward[iPos], 1); + g_esTankCache[tank].g_iMedicalCutsReward[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iMedicalCutsReward[iPos], g_esTankCache[tank].g_iMedicalCutsReward[iPos], 1); + g_esTankCache[tank].g_iMeleeRangeReward[iPos] = iGetSettingValue(bAccess, true, g_esTank[iType].g_iMeleeRangeReward[iPos], g_esGeneral.g_iMeleeRangeReward[iPos], 1); + g_esTankCache[tank].g_iMeleeRangeReward[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iMeleeRangeReward[iPos], g_esTankCache[tank].g_iMeleeRangeReward[iPos], 1); + g_esTankCache[tank].g_iMidairDashesReward[iPos] = iGetSettingValue(bAccess, true, g_esTank[iType].g_iMidairDashesReward[iPos], g_esGeneral.g_iMidairDashesReward[iPos], 1); + g_esTankCache[tank].g_iMidairDashesReward[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iMidairDashesReward[iPos], g_esTankCache[tank].g_iMidairDashesReward[iPos], 1); + g_esTankCache[tank].g_flMotivationRadiusReward[iPos] = flGetSettingValue(bAccess, true, g_esTank[iType].g_flMotivationRadiusReward[iPos], g_esGeneral.g_flMotivationRadiusReward[iPos], 1); + g_esTankCache[tank].g_flMotivationRadiusReward[iPos] = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flMotivationRadiusReward[iPos], g_esTankCache[tank].g_flMotivationRadiusReward[iPos], 1); + g_esTankCache[tank].g_flOverdoseRadiusReward[iPos] = flGetSettingValue(bAccess, true, g_esTank[iType].g_flOverdoseRadiusReward[iPos], g_esGeneral.g_flOverdoseRadiusReward[iPos], 1); + g_esTankCache[tank].g_flOverdoseRadiusReward[iPos] = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flOverdoseRadiusReward[iPos], g_esTankCache[tank].g_flOverdoseRadiusReward[iPos], 1); + g_esTankCache[tank].g_iOverhealthReward[iPos] = iGetSettingValue(bAccess, true, g_esTank[iType].g_iOverhealthReward[iPos], g_esGeneral.g_iOverhealthReward[iPos], 1); + g_esTankCache[tank].g_iOverhealthReward[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iOverhealthReward[iPos], g_esTankCache[tank].g_iOverhealthReward[iPos], 1); + g_esTankCache[tank].g_iParticleEffectVisual[iPos] = iGetSettingValue(bAccess, true, g_esTank[iType].g_iParticleEffectVisual[iPos], g_esGeneral.g_iParticleEffectVisual[iPos], 1); + g_esTankCache[tank].g_iParticleEffectVisual[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iParticleEffectVisual[iPos], g_esTankCache[tank].g_iParticleEffectVisual[iPos], 1); + g_esTankCache[tank].g_flPipeBombDurationReward[iPos] = flGetSettingValue(bAccess, true, g_esTank[iType].g_flPipeBombDurationReward[iPos], g_esGeneral.g_flPipeBombDurationReward[iPos], 1); + g_esTankCache[tank].g_flPipeBombDurationReward[iPos] = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flPipeBombDurationReward[iPos], g_esTankCache[tank].g_flPipeBombDurationReward[iPos], 1); + g_esTankCache[tank].g_iPrefsNotify[iPos] = iGetSettingValue(bAccess, true, g_esTank[iType].g_iPrefsNotify[iPos], g_esGeneral.g_iPrefsNotify[iPos], 1); + g_esTankCache[tank].g_iPrefsNotify[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iPrefsNotify[iPos], g_esTankCache[tank].g_iPrefsNotify[iPos], 1); + g_esTankCache[tank].g_flPunchResistanceReward[iPos] = flGetSettingValue(bAccess, true, g_esTank[iType].g_flPunchResistanceReward[iPos], g_esGeneral.g_flPunchResistanceReward[iPos], 1); + g_esTankCache[tank].g_flPunchResistanceReward[iPos] = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flPunchResistanceReward[iPos], g_esTankCache[tank].g_flPunchResistanceReward[iPos], 1); + g_esTankCache[tank].g_flRapidPistolReward[iPos] = flGetSettingValue(bAccess, true, g_esTank[iType].g_flRapidPistolReward[iPos], g_esGeneral.g_flRapidPistolReward[iPos], 1); + g_esTankCache[tank].g_flRapidPistolReward[iPos] = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flRapidPistolReward[iPos], g_esTankCache[tank].g_flRapidPistolReward[iPos], 1); + g_esTankCache[tank].g_iRecoilDampenerReward[iPos] = iGetSettingValue(bAccess, true, g_esTank[iType].g_iRecoilDampenerReward[iPos], g_esGeneral.g_iRecoilDampenerReward[iPos], 1); + g_esTankCache[tank].g_iRecoilDampenerReward[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iRecoilDampenerReward[iPos], g_esTankCache[tank].g_iRecoilDampenerReward[iPos], 1); + g_esTankCache[tank].g_flRefillPercentReward[iPos] = flGetSettingValue(bAccess, true, g_esTank[iType].g_flRefillPercentReward[iPos], g_esGeneral.g_flRefillPercentReward[iPos], 1); + g_esTankCache[tank].g_flRefillPercentReward[iPos] = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flRefillPercentReward[iPos], g_esTankCache[tank].g_flRefillPercentReward[iPos], 1); + g_esTankCache[tank].g_iRegenBurstsReward[iPos] = iGetSettingValue(bAccess, true, g_esTank[iType].g_iRegenBurstsReward[iPos], g_esGeneral.g_iRegenBurstsReward[iPos], 1); + g_esTankCache[tank].g_iRegenBurstsReward[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iRegenBurstsReward[iPos], g_esTankCache[tank].g_iRegenBurstsReward[iPos], 1); + g_esTankCache[tank].g_flReloadRateReward[iPos] = flGetSettingValue(bAccess, true, g_esTank[iType].g_flReloadRateReward[iPos], g_esGeneral.g_flReloadRateReward[iPos], 1); + g_esTankCache[tank].g_flReloadRateReward[iPos] = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flReloadRateReward[iPos], g_esTankCache[tank].g_flReloadRateReward[iPos], 1); + g_esTankCache[tank].g_iRespawnLoadoutReward[iPos] = iGetSettingValue(bAccess, true, g_esTank[iType].g_iRespawnLoadoutReward[iPos], g_esGeneral.g_iRespawnLoadoutReward[iPos], 1); + g_esTankCache[tank].g_iRespawnLoadoutReward[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iRespawnLoadoutReward[iPos], g_esTankCache[tank].g_iRespawnLoadoutReward[iPos], 1); + g_esTankCache[tank].g_iReviveHealthReward[iPos] = iGetSettingValue(bAccess, true, g_esTank[iType].g_iReviveHealthReward[iPos], g_esGeneral.g_iReviveHealthReward[iPos], 1); + g_esTankCache[tank].g_iReviveHealthReward[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iReviveHealthReward[iPos], g_esTankCache[tank].g_iReviveHealthReward[iPos], 1); + g_esTankCache[tank].g_iRewardBots[iPos] = iGetSettingValue(bAccess, true, g_esTank[iType].g_iRewardBots[iPos], g_esGeneral.g_iRewardBots[iPos], 1, -1); + g_esTankCache[tank].g_iRewardBots[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iRewardBots[iPos], g_esTankCache[tank].g_iRewardBots[iPos], 1, -1); + g_esTankCache[tank].g_flRewardChance[iPos] = flGetSettingValue(bAccess, true, g_esTank[iType].g_flRewardChance[iPos], g_esGeneral.g_flRewardChance[iPos], 1); + g_esTankCache[tank].g_flRewardChance[iPos] = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flRewardChance[iPos], g_esTankCache[tank].g_flRewardChance[iPos], 1); + g_esTankCache[tank].g_flRewardDuration[iPos] = flGetSettingValue(bAccess, true, g_esTank[iType].g_flRewardDuration[iPos], g_esGeneral.g_flRewardDuration[iPos], 1); + g_esTankCache[tank].g_flRewardDuration[iPos] = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flRewardDuration[iPos], g_esTankCache[tank].g_flRewardDuration[iPos], 1); + g_esTankCache[tank].g_iRewardEffect[iPos] = iGetSettingValue(bAccess, true, g_esTank[iType].g_iRewardEffect[iPos], g_esGeneral.g_iRewardEffect[iPos], 1); + g_esTankCache[tank].g_iRewardEffect[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iRewardEffect[iPos], g_esTankCache[tank].g_iRewardEffect[iPos], 1); + g_esTankCache[tank].g_iRewardEnabled[iPos] = iGetSettingValue(bAccess, true, g_esTank[iType].g_iRewardEnabled[iPos], g_esGeneral.g_iRewardEnabled[iPos], 1, -1); + g_esTankCache[tank].g_iRewardEnabled[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iRewardEnabled[iPos], g_esTankCache[tank].g_iRewardEnabled[iPos], 1, -1); + g_esTankCache[tank].g_iRewardNotify[iPos] = iGetSettingValue(bAccess, true, g_esTank[iType].g_iRewardNotify[iPos], g_esGeneral.g_iRewardNotify[iPos], 1); + g_esTankCache[tank].g_iRewardNotify[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iRewardNotify[iPos], g_esTankCache[tank].g_iRewardNotify[iPos], 1); + g_esTankCache[tank].g_flRewardPercentage[iPos] = flGetSettingValue(bAccess, true, g_esTank[iType].g_flRewardPercentage[iPos], g_esGeneral.g_flRewardPercentage[iPos], 1); + g_esTankCache[tank].g_flRewardPercentage[iPos] = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flRewardPercentage[iPos], g_esTankCache[tank].g_flRewardPercentage[iPos], 1); + g_esTankCache[tank].g_iRewardVisual[iPos] = iGetSettingValue(bAccess, true, g_esTank[iType].g_iRewardVisual[iPos], g_esGeneral.g_iRewardVisual[iPos], 1); + g_esTankCache[tank].g_iRewardVisual[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iRewardVisual[iPos], g_esTankCache[tank].g_iRewardVisual[iPos], 1); + g_esTankCache[tank].g_iRiotGearReward[iPos] = iGetSettingValue(bAccess, true, g_esTank[iType].g_iRiotGearReward[iPos], g_esGeneral.g_iRiotGearReward[iPos], 1); + g_esTankCache[tank].g_iRiotGearReward[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iRiotGearReward[iPos], g_esTankCache[tank].g_iRiotGearReward[iPos], 1); + g_esTankCache[tank].g_iSafetyBubbleReward[iPos] = iGetSettingValue(bAccess, true, g_esTank[iType].g_iSafetyBubbleReward[iPos], g_esGeneral.g_iSafetyBubbleReward[iPos], 1); + g_esTankCache[tank].g_iSafetyBubbleReward[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iSafetyBubbleReward[iPos], g_esTankCache[tank].g_iSafetyBubbleReward[iPos], 1); + g_esTankCache[tank].g_iShareRewards[iPos] = iGetSettingValue(bAccess, true, g_esTank[iType].g_iShareRewards[iPos], g_esGeneral.g_iShareRewards[iPos], 1); + g_esTankCache[tank].g_iShareRewards[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iShareRewards[iPos], g_esTankCache[tank].g_iShareRewards[iPos], 1); + g_esTankCache[tank].g_flShockwaveRadiusReward[iPos] = flGetSettingValue(bAccess, true, g_esTank[iType].g_flShockwaveRadiusReward[iPos], g_esGeneral.g_flShockwaveRadiusReward[iPos], 1); + g_esTankCache[tank].g_flShockwaveRadiusReward[iPos] = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flShockwaveRadiusReward[iPos], g_esTankCache[tank].g_flShockwaveRadiusReward[iPos], 1); + g_esTankCache[tank].g_flShoveDamageReward[iPos] = flGetSettingValue(bAccess, true, g_esTank[iType].g_flShoveDamageReward[iPos], g_esGeneral.g_flShoveDamageReward[iPos], 1); + g_esTankCache[tank].g_flShoveDamageReward[iPos] = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flShoveDamageReward[iPos], g_esTankCache[tank].g_flShoveDamageReward[iPos], 1); + g_esTankCache[tank].g_iShovePenaltyReward[iPos] = iGetSettingValue(bAccess, true, g_esTank[iType].g_iShovePenaltyReward[iPos], g_esGeneral.g_iShovePenaltyReward[iPos], 1); + g_esTankCache[tank].g_iShovePenaltyReward[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iShovePenaltyReward[iPos], g_esTankCache[tank].g_iShovePenaltyReward[iPos], 1); + g_esTankCache[tank].g_flShoveRateReward[iPos] = flGetSettingValue(bAccess, true, g_esTank[iType].g_flShoveRateReward[iPos], g_esGeneral.g_flShoveRateReward[iPos], 1); + g_esTankCache[tank].g_flShoveRateReward[iPos] = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flShoveRateReward[iPos], g_esTankCache[tank].g_flShoveRateReward[iPos], 1); + g_esTankCache[tank].g_flSledgehammerRoundsReward[iPos] = flGetSettingValue(bAccess, true, g_esTank[iType].g_flSledgehammerRoundsReward[iPos], g_esGeneral.g_flSledgehammerRoundsReward[iPos], 1); + g_esTankCache[tank].g_flSledgehammerRoundsReward[iPos] = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flSledgehammerRoundsReward[iPos], g_esTankCache[tank].g_flSledgehammerRoundsReward[iPos], 1); + g_esTankCache[tank].g_iSpecialAmmoReward[iPos] = iGetSettingValue(bAccess, true, g_esTank[iType].g_iSpecialAmmoReward[iPos], g_esGeneral.g_iSpecialAmmoReward[iPos], 1); + g_esTankCache[tank].g_iSpecialAmmoReward[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iSpecialAmmoReward[iPos], g_esTankCache[tank].g_iSpecialAmmoReward[iPos], 1); + g_esTankCache[tank].g_flSpeedBoostReward[iPos] = flGetSettingValue(bAccess, true, g_esTank[iType].g_flSpeedBoostReward[iPos], g_esGeneral.g_flSpeedBoostReward[iPos], 1); + g_esTankCache[tank].g_flSpeedBoostReward[iPos] = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flSpeedBoostReward[iPos], g_esTankCache[tank].g_flSpeedBoostReward[iPos], 1); + g_esTankCache[tank].g_iStackRewards[iPos] = iGetSettingValue(bAccess, true, g_esTank[iType].g_iStackRewards[iPos], g_esGeneral.g_iStackRewards[iPos], 1); + g_esTankCache[tank].g_iStackRewards[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iStackRewards[iPos], g_esTankCache[tank].g_iStackRewards[iPos], 1); + g_esTankCache[tank].g_iStickyGrenadesReward[iPos] = iGetSettingValue(bAccess, true, g_esTank[iType].g_iStickyGrenadesReward[iPos], g_esGeneral.g_iStickyGrenadesReward[iPos], 1); + g_esTankCache[tank].g_iStickyGrenadesReward[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iStickyGrenadesReward[iPos], g_esTankCache[tank].g_iStickyGrenadesReward[iPos], 1); + g_esTankCache[tank].g_flSupplierReward[iPos] = flGetSettingValue(bAccess, true, g_esTank[iType].g_flSupplierReward[iPos], g_esGeneral.g_flSupplierReward[iPos], 1); + g_esTankCache[tank].g_flSupplierReward[iPos] = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flSupplierReward[iPos], g_esTankCache[tank].g_flSupplierReward[iPos], 1); + g_esTankCache[tank].g_flSwingRateReward[iPos] = flGetSettingValue(bAccess, true, g_esTank[iType].g_flSwingRateReward[iPos], g_esGeneral.g_flSwingRateReward[iPos], 1); + g_esTankCache[tank].g_flSwingRateReward[iPos] = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flSwingRateReward[iPos], g_esTankCache[tank].g_flSwingRateReward[iPos], 1); + g_esTankCache[tank].g_iSyringeDartsReward[iPos] = iGetSettingValue(bAccess, true, g_esTank[iType].g_iSyringeDartsReward[iPos], g_esGeneral.g_iSyringeDartsReward[iPos], 1); + g_esTankCache[tank].g_iSyringeDartsReward[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iSyringeDartsReward[iPos], g_esTankCache[tank].g_iSyringeDartsReward[iPos], 1); + g_esTankCache[tank].g_iThornsReward[iPos] = iGetSettingValue(bAccess, true, g_esTank[iType].g_iThornsReward[iPos], g_esGeneral.g_iThornsReward[iPos], 1); + g_esTankCache[tank].g_iThornsReward[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iThornsReward[iPos], g_esTankCache[tank].g_iThornsReward[iPos], 1); + g_esTankCache[tank].g_iUsefulRewards[iPos] = iGetSettingValue(bAccess, true, g_esTank[iType].g_iUsefulRewards[iPos], g_esGeneral.g_iUsefulRewards[iPos], 1); + g_esTankCache[tank].g_iUsefulRewards[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iUsefulRewards[iPos], g_esTankCache[tank].g_iUsefulRewards[iPos], 1); + g_esTankCache[tank].g_iVoicePitchVisual[iPos] = iGetSettingValue(bAccess, true, g_esTank[iType].g_iVoicePitchVisual[iPos], g_esGeneral.g_iVoicePitchVisual[iPos], 1); + g_esTankCache[tank].g_iVoicePitchVisual[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iVoicePitchVisual[iPos], g_esTankCache[tank].g_iVoicePitchVisual[iPos], 1); + } - switch (g_esPlayer[admin].g_iCooldown >= iTime && g_esPlayer[admin].g_bInitialRound == g_esGeneral.g_bNextRound) - { - case true: - { - switch (specType) - { - case 1: MT_PrintToChat(admin, "%s %t", MT_TAG3, "HumanCooldownSmoker", (g_esPlayer[admin].g_iCooldown - iTime)); - case 2: MT_PrintToChat(admin, "%s %t", MT_TAG3, "HumanCooldownBoomer", (g_esPlayer[admin].g_iCooldown - iTime)); - case 3: MT_PrintToChat(admin, "%s %t", MT_TAG3, "HumanCooldownHunter", (g_esPlayer[admin].g_iCooldown - iTime)); - case 4: MT_PrintToChat(admin, "%s %t", MT_TAG3, "HumanCooldownSpitter", (g_esPlayer[admin].g_iCooldown - iTime)); - case 5: MT_PrintToChat(admin, "%s %t", MT_TAG3, "HumanCooldownJockey", (g_esPlayer[admin].g_iCooldown - iTime)); - case 6: MT_PrintToChat(admin, "%s %t", MT_TAG3, "HumanCooldownCharger", (g_esPlayer[admin].g_iCooldown - iTime)); - default: MT_PrintToChat(admin, "%s %t", MT_TAG3, "HumanCooldown", (g_esPlayer[admin].g_iCooldown - iTime)); - } - } - case false: - { - g_esPlayer[admin].g_iCooldown = -1; - g_esPlayer[admin].g_bInitialRound = g_esGeneral.g_bNextRound; + if (iPos < (sizeof esTankCache::g_iStackLimits)) + { + g_esTankCache[tank].g_iStackLimits[iPos] = iGetSettingValue(bAccess, true, g_esTank[iType].g_iStackLimits[iPos], g_esGeneral.g_iStackLimits[iPos], 1); + g_esTankCache[tank].g_iStackLimits[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iStackLimits[iPos], g_esTankCache[tank].g_iStackLimits[iPos], 1); + } - vSetTankColor(admin, g_esGeneral.g_iChosenType); - vTankSpawn(admin, 5, specType); - vExternalView(admin, 1.5); + if (iPos < (sizeof esTankCache::g_flComboChance)) + { + g_esTankCache[tank].g_flComboChance[iPos] = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flComboChance[iPos], g_esTank[iType].g_flComboChance[iPos], 1); + g_esTankCache[tank].g_iComboCooldown[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iComboCooldown[iPos], g_esTank[iType].g_iComboCooldown[iPos], 1); + g_esTankCache[tank].g_flComboDamage[iPos] = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flComboDamage[iPos], g_esTank[iType].g_flComboDamage[iPos], 1); + g_esTankCache[tank].g_flComboDeathChance[iPos] = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flComboDeathChance[iPos], g_esTank[iType].g_flComboDeathChance[iPos], 1); + g_esTankCache[tank].g_flComboDeathRange[iPos] = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flComboDeathRange[iPos], g_esTank[iType].g_flComboDeathRange[iPos], 1); + g_esTankCache[tank].g_flComboDelay[iPos] = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flComboDelay[iPos], g_esTank[iType].g_flComboDelay[iPos], 1); + g_esTankCache[tank].g_flComboDuration[iPos] = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flComboDuration[iPos], g_esTank[iType].g_flComboDuration[iPos], 1); + g_esTankCache[tank].g_flComboInterval[iPos] = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flComboInterval[iPos], g_esTank[iType].g_flComboInterval[iPos], 1); + g_esTankCache[tank].g_flComboMinRadius[iPos] = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flComboMinRadius[iPos], g_esTank[iType].g_flComboMinRadius[iPos], 2, 1.0); + g_esTankCache[tank].g_flComboMaxRadius[iPos] = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flComboMaxRadius[iPos], g_esTank[iType].g_flComboMaxRadius[iPos], 2, -1.0); + g_esTankCache[tank].g_flComboRange[iPos] = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flComboRange[iPos], g_esTank[iType].g_flComboRange[iPos], 1); + g_esTankCache[tank].g_flComboRangeChance[iPos] = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flComboRangeChance[iPos], g_esTank[iType].g_flComboRangeChance[iPos], 1); + g_esTankCache[tank].g_iComboRangeCooldown[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iComboRangeCooldown[iPos], g_esTank[iType].g_iComboRangeCooldown[iPos], 1); + g_esTankCache[tank].g_flComboRockChance[iPos] = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flComboRockChance[iPos], g_esTank[iType].g_flComboRockChance[iPos], 1); + g_esTankCache[tank].g_iComboRockCooldown[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iComboRockCooldown[iPos], g_esTank[iType].g_iComboRockCooldown[iPos], 1); + g_esTankCache[tank].g_flComboSpeed[iPos] = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flComboSpeed[iPos], g_esTank[iType].g_flComboSpeed[iPos], 1); + } - if (g_esGeneral.g_iMasterControl <= 0 && (!bIsDeveloper(admin, 0) && !CheckCommandAccess(admin, "mt_adminversus", ADMFLAG_ROOT, false))) - { - g_esPlayer[admin].g_iCooldown = (iTime + g_esGeneral.g_iHumanCooldown); - } - } - } + if (iPos < (sizeof esTankCache::g_flComboTypeChance)) + { + g_esTankCache[tank].g_flComboTypeChance[iPos] = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flComboTypeChance[iPos], g_esTank[iType].g_flComboTypeChance[iPos], 1); + } - g_esGeneral.g_bBlindType = false; - g_esGeneral.g_iChosenType = 0; - } + if (iPos < (sizeof esTankCache::g_iSkinColor)) + { + g_esTankCache[tank].g_iBossHealth[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iBossHealth[iPos], g_esTank[iType].g_iBossHealth[iPos], 1); + g_esTankCache[tank].g_iBossType[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iBossType[iPos], g_esTank[iType].g_iBossType[iPos], 1); } } } - case false: vSpawnTank(admin, specType, false, amount, mode, blind); - } - } - case false: - { - if (g_esGeneral.g_iSpawnMode == 2 || !bIsCompetitiveMode()) - { - switch (bAdmin) - { - case true: vChangeTank(admin, specType, amount, mode, blind); - case false: MT_PrintToChat(admin, "%s %t", MT_TAG2, "NoCommandAccess"); + + g_esTankCache[tank].g_iBodyEffects = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iBodyEffects, g_esTank[iType].g_iBodyEffects, 1); + g_esTankCache[tank].g_iGlowEnabled = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iGlowEnabled, g_esTank[iType].g_iGlowEnabled, 1); + g_esTankCache[tank].g_iGlowFlashing = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iGlowFlashing, g_esTank[iType].g_iGlowFlashing, 1); + g_esTankCache[tank].g_iGlowMaxRange = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iGlowMaxRange, g_esTank[iType].g_iGlowMaxRange, 1); + g_esTankCache[tank].g_iGlowMinRange = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iGlowMinRange, g_esTank[iType].g_iGlowMinRange, 1); + g_esTankCache[tank].g_iGlowType = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iGlowType, g_esTank[iType].g_iGlowType, 1); + g_esTankCache[tank].g_iPropsAttached = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iPropsAttached, g_esTank[iType].g_iPropsAttached, 1); + g_esTankCache[tank].g_iRockEffects = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iRockEffects, g_esTank[iType].g_iRockEffects, 1); + g_esTankCache[tank].g_iRockModel = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iRockModel, g_esTank[iType].g_iRockModel, 1); + g_esTankCache[tank].g_iTankModel = iGetSettingValue(bAccess, true, g_esTank[iType].g_iTankModel, g_esGeneral.g_iTankModel, 1); + g_esTankCache[tank].g_iTankModel = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iTankModel, g_esTankCache[tank].g_iTankModel, 1); + + vGetSettingValue(bAccess, bHuman, g_esTankCache[tank].g_sFlameColor, sizeof esTankCache::g_sFlameColor, g_esPlayer[tank].g_sFlameColor, g_esTank[iType].g_sFlameColor); + vGetSettingValue(bAccess, bHuman, g_esTankCache[tank].g_sFlashlightColor, sizeof esTankCache::g_sFlashlightColor, g_esPlayer[tank].g_sFlashlightColor, g_esTank[iType].g_sFlashlightColor); + vGetSettingValue(bAccess, bHuman, g_esTankCache[tank].g_sGlowColor, sizeof esTankCache::g_sGlowColor, g_esPlayer[tank].g_sGlowColor, g_esTank[iType].g_sGlowColor); + vGetSettingValue(bAccess, bHuman, g_esTankCache[tank].g_sOzTankColor, sizeof esTankCache::g_sOzTankColor, g_esPlayer[tank].g_sOzTankColor, g_esTank[iType].g_sOzTankColor); + vGetSettingValue(bAccess, bHuman, g_esTankCache[tank].g_sPropTankColor, sizeof esTankCache::g_sPropTankColor, g_esPlayer[tank].g_sPropTankColor, g_esTank[iType].g_sPropTankColor); + vGetSettingValue(bAccess, bHuman, g_esTankCache[tank].g_sRockColor, sizeof esTankCache::g_sRockColor, g_esPlayer[tank].g_sRockColor, g_esTank[iType].g_sRockColor); + vGetSettingValue(bAccess, bHuman, g_esTankCache[tank].g_sSkinColor, sizeof esTankCache::g_sSkinColor, g_esPlayer[tank].g_sSkinColor, g_esTank[iType].g_sSkinColor); + vGetSettingValue(bAccess, bHuman, g_esTankCache[tank].g_sTireColor, sizeof esTankCache::g_sTireColor, g_esPlayer[tank].g_sTireColor, g_esTank[iType].g_sTireColor); + + for (int iPos = 0; iPos < (sizeof esTankCache::g_flPropsChance); iPos++) + { + if (iPos < (sizeof esTankCache::g_flPropsChance)) + { + g_esTankCache[tank].g_flPropsChance[iPos] = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flPropsChance[iPos], g_esTank[iType].g_flPropsChance[iPos], 1); + } + + if (iPos < (sizeof esTankCache::g_flBodyChance)) + { + g_esTankCache[tank].g_flBodyChance[iPos] = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flBodyChance[iPos], g_esTank[iType].g_flBodyChance[iPos], 1); + } + + if (iPos < (sizeof esTankCache::g_iSkinColor)) + { + g_esTankCache[tank].g_flRockChance[iPos] = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flRockChance[iPos], g_esTank[iType].g_flRockChance[iPos], 1); + g_esTankCache[tank].g_iSkinColor[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iSkinColor[iPos], g_esTank[iType].g_iSkinColor[iPos], 1); + g_esTankCache[tank].g_iLightColor[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iLightColor[iPos], g_esTank[iType].g_iLightColor[iPos], 1); + g_esTankCache[tank].g_iOzTankColor[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iOzTankColor[iPos], g_esTank[iType].g_iOzTankColor[iPos], 1); + g_esTankCache[tank].g_iFlameColor[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iFlameColor[iPos], g_esTank[iType].g_iFlameColor[iPos], 1); + g_esTankCache[tank].g_iRockColor[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iRockColor[iPos], g_esTank[iType].g_iRockColor[iPos], 1); + g_esTankCache[tank].g_iTireColor[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iTireColor[iPos], g_esTank[iType].g_iTireColor[iPos], 1); + g_esTankCache[tank].g_iPropTankColor[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iPropTankColor[iPos], g_esTank[iType].g_iPropTankColor[iPos], 1); + g_esTankCache[tank].g_iFlashlightColor[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iFlashlightColor[iPos], g_esTank[iType].g_iFlashlightColor[iPos], 1); + g_esTankCache[tank].g_iCrownColor[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iCrownColor[iPos], g_esTank[iType].g_iCrownColor[iPos], 1); + } + + if (iPos < (sizeof esTankCache::g_iGlowColor)) + { + g_esTankCache[tank].g_iGlowColor[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iGlowColor[iPos], g_esTank[iType].g_iGlowColor[iPos], 1); + } } } - else if ((GetClientButtons(admin) & IN_SPEED) && bAdmin) - { - vChangeTank(admin, specType, amount, mode, blind); - } else { - int iIndex = g_esTank[iType].g_iRecordedType[0]; - g_esPlayer[admin].g_iPersonalType = iClamp(iIndex, -1, MT_MAXTYPES); - g_esTeammate[admin].g_iPersonalType[specType] = iClamp(iIndex, -1, MT_MAXTYPES); + if (!visualsOnly) + { + g_esTankCache[tank].g_sArmorCharacters[0] = '\0'; + g_esTankCache[tank].g_sBodyColorVisual[0] = '\0'; + g_esTankCache[tank].g_sBodyColorVisual2[0] = '\0'; + g_esTankCache[tank].g_sBodyColorVisual3[0] = '\0'; + g_esTankCache[tank].g_sBodyColorVisual4[0] = '\0'; + g_esTankCache[tank].g_sComboSet[0] = '\0'; + g_esTankCache[tank].g_sFallVoicelineReward[0] = '\0'; + g_esTankCache[tank].g_sFallVoicelineReward2[0] = '\0'; + g_esTankCache[tank].g_sFallVoicelineReward3[0] = '\0'; + g_esTankCache[tank].g_sFallVoicelineReward4[0] = '\0'; + g_esTankCache[tank].g_sHealthCharacters[0] = '\0'; + g_esTankCache[tank].g_sItemReward[0] = '\0'; + g_esTankCache[tank].g_sLightColorVisual[0] = '\0'; + g_esTankCache[tank].g_sLightColorVisual2[0] = '\0'; + g_esTankCache[tank].g_sLightColorVisual3[0] = '\0'; + g_esTankCache[tank].g_sLightColorVisual4[0] = '\0'; + g_esTankCache[tank].g_sLoopingVoicelineVisual[0] = '\0'; + g_esTankCache[tank].g_sLoopingVoicelineVisual2[0] = '\0'; + g_esTankCache[tank].g_sLoopingVoicelineVisual3[0] = '\0'; + g_esTankCache[tank].g_sLoopingVoicelineVisual4[0] = '\0'; + g_esTankCache[tank].g_sOutlineColorVisual[0] = '\0'; + g_esTankCache[tank].g_sOutlineColorVisual2[0] = '\0'; + g_esTankCache[tank].g_sOutlineColorVisual3[0] = '\0'; + g_esTankCache[tank].g_sOutlineColorVisual4[0] = '\0'; + g_esTankCache[tank].g_sScreenColorVisual[0] = '\0'; + g_esTankCache[tank].g_sScreenColorVisual2[0] = '\0'; + g_esTankCache[tank].g_sScreenColorVisual3[0] = '\0'; + g_esTankCache[tank].g_sScreenColorVisual4[0] = '\0'; + g_esTankCache[tank].g_sShieldCharacters[0] = '\0'; + g_esTankCache[tank].g_sTankName[0] = '\0'; + g_esTankCache[tank].g_flArmorDuration = 0.0; + g_esTankCache[tank].g_flArmorPercentage = 0.0; + g_esTankCache[tank].g_flArmorResistance[0] = 0.0; + g_esTankCache[tank].g_flArmorResistance[1] = 0.0; + g_esTankCache[tank].g_flAttackInterval = 0.0; + g_esTankCache[tank].g_flBurnDuration = 0.0; + g_esTankCache[tank].g_flBurntSkin = -1.0; + g_esTankCache[tank].g_flClawDamage = -1.0; + g_esTankCache[tank].g_flHealPercentMultiplier = 1.0; + g_esTankCache[tank].g_flHittableDamage = -1.0; + g_esTankCache[tank].g_flIncapDamageMultiplier = 1.0; + g_esTankCache[tank].g_flMeleeHitValue = 0.0; + g_esTankCache[tank].g_flPassiveDelay = 0.0; + g_esTankCache[tank].g_flPassiveInterval = 0.0; + g_esTankCache[tank].g_flPunchForce = -1.0; + g_esTankCache[tank].g_flPunchThrow = 0.0; + g_esTankCache[tank].g_flRandomDuration = 0.0; + g_esTankCache[tank].g_flRandomInterval = 0.0; + g_esTankCache[tank].g_flRockDamage = -1.0; + g_esTankCache[tank].g_flRunSpeed = 0.0; + g_esTankCache[tank].g_flShieldDuration = 0.0; + g_esTankCache[tank].g_flShieldPercentage = 0.0; + g_esTankCache[tank].g_flShieldRate = 0.0; + g_esTankCache[tank].g_flShieldResistance = 0.0; + g_esTankCache[tank].g_flThrowForce = 0.0; + g_esTankCache[tank].g_flThrowInterval = 0.0; + g_esTankCache[tank].g_flTransformDelay = 0.0; + g_esTankCache[tank].g_flTransformDuration = 0.0; + g_esTankCache[tank].g_iAnnounceArrival = 0; + g_esTankCache[tank].g_iAnnounceDeath = 0; + g_esTankCache[tank].g_iAnnounceKill = 0; + g_esTankCache[tank].g_iArrivalMessage = 0; + g_esTankCache[tank].g_iArrivalSound = 0; + g_esTankCache[tank].g_iAutoAggravate = 0; + g_esTankCache[tank].g_iAutoHop = 0; + g_esTankCache[tank].g_iBaseHealth = 0; + g_esTankCache[tank].g_iBossEffects = 0; + g_esTankCache[tank].g_iBossStages = 0; + g_esTankCache[tank].g_iBulletImmunity = 0; + g_esTankCache[tank].g_iCheckAbilities = 0; + g_esTankCache[tank].g_iDeathDetails = 0; + g_esTankCache[tank].g_iDeathMessage = 0; + g_esTankCache[tank].g_iDeathRevert = 0; + g_esTankCache[tank].g_iDeathSound = 0; + g_esTankCache[tank].g_iDisplayHealth = 0; + g_esTankCache[tank].g_iDisplayHealthType = 0; + g_esTankCache[tank].g_iExplosiveImmunity = 0; + g_esTankCache[tank].g_iExtraHealth = 0; + g_esTankCache[tank].g_iFireImmunity = 0; + g_esTankCache[tank].g_iFootstepShake = 1; + g_esTankCache[tank].g_iGroundPound = 0; + g_esTankCache[tank].g_iHittableImmunity = 0; + g_esTankCache[tank].g_iHumanMultiplierMode = 0; + g_esTankCache[tank].g_iIntangibleBody = 0; + g_esTankCache[tank].g_iKillMessage = 0; + g_esTankCache[tank].g_iMeleeHitMode = 0; + g_esTankCache[tank].g_iMeleeImmunity = 0; + g_esTankCache[tank].g_iMinimumHumans = 0; + g_esTankCache[tank].g_iMultiplyHealth = 0; + g_esTankCache[tank].g_iPassiveHealth = 0; + g_esTankCache[tank].g_iPrioritizeThrows = 0; + g_esTankCache[tank].g_iRandomTank = 0; + g_esTankCache[tank].g_iRockSound = 0; + g_esTankCache[tank].g_iSkipIncap = 0; + g_esTankCache[tank].g_iSkipTaunt = 0; + g_esTankCache[tank].g_iSpawnProtection = 0; + g_esTankCache[tank].g_iSpawnType = 0; + g_esTankCache[tank].g_iSweepFist = 0; + g_esTankCache[tank].g_iTankNote = 0; + g_esTankCache[tank].g_iTeammateLimit = 0; + g_esTankCache[tank].g_iThrowRock = 0; + g_esTankCache[tank].g_iVocalizeArrival = 0; + g_esTankCache[tank].g_iVocalizeDeath = 0; + g_esTankCache[tank].g_iVomitImmunity = 0; + + for (int iPos = 0; iPos < (sizeof esTankCache::g_iTransformType); iPos++) + { + g_esTankCache[tank].g_iTransformType[iPos] = 0; - char sName[64]; - vGetTranslatedName(sName, sizeof sName, .type = iType, .specType = specType); + if (iPos < (sizeof esTankCache::g_iRewardEnabled)) + { + g_esTankCache[tank].g_flActionDurationReward[iPos] = 0.0; + g_esTankCache[tank].g_flAdrenalineTimeReward[iPos] = 0.0; + g_esTankCache[tank].g_iAmmoBoostReward[iPos] = 0; + g_esTankCache[tank].g_iAmmoRefillReward[iPos] = 0; + g_esTankCache[tank].g_iAmmoRegenReward[iPos] = 0; + g_esTankCache[tank].g_flAttackBoostReward[iPos] = 0.0; + g_esTankCache[tank].g_iBlazeHealthReward[iPos] = 0; + g_esTankCache[tank].g_iBloodDonorReward[iPos] = 0; + g_esTankCache[tank].g_iBunnyHopReward[iPos] = 0; + g_esTankCache[tank].g_iBurstDoorsReward[iPos] = 0; + g_esTankCache[tank].g_iCleanKillsReward[iPos] = 0; + g_esTankCache[tank].g_iClusterBombsReward[iPos] = 0; + g_esTankCache[tank].g_flDamageBoostReward[iPos] = 0.0; + g_esTankCache[tank].g_flDamageResistanceReward[iPos] = 0.0; + g_esTankCache[tank].g_flDopamineRadiusReward[iPos] = 0.0; + g_esTankCache[tank].g_iEternalFlamesReward[iPos] = 0; + g_esTankCache[tank].g_iFastRecoveryReward[iPos] = 0; + g_esTankCache[tank].g_flFireRateReward[iPos] = 0.0; + g_esTankCache[tank].g_iFriendlyFireReward[iPos] = 0; + g_esTankCache[tank].g_iGhostBulletsReward[iPos] = 0; + g_esTankCache[tank].g_flGrenadeLauncherReward[iPos] = 0.0; + g_esTankCache[tank].g_flHealPercentReward[iPos] = 0.0; + g_esTankCache[tank].g_flHealthcareRadiusReward[iPos] = 0.0; + g_esTankCache[tank].g_iHealthRegenReward[iPos] = 0; + g_esTankCache[tank].g_flHeartbeatReward[iPos] = 0.0; + g_esTankCache[tank].g_flHollowpointAmmoReward[iPos] = 0.0; + g_esTankCache[tank].g_flJumpHeightReward[iPos] = 0.0; + g_esTankCache[tank].g_iInfiniteAmmoReward[iPos] = 0; + g_esTankCache[tank].g_iLadderActionsReward[iPos] = 0; + g_esTankCache[tank].g_flLadyKillerReward[iPos] = 0.0; + g_esTankCache[tank].g_iLaserSightReward[iPos] = 0; + g_esTankCache[tank].g_iLifeLeechReward[iPos] = 0; + g_esTankCache[tank].g_flLoopingVoicelineInterval[iPos] = 0.0; + g_esTankCache[tank].g_flLuckyBulletReward[iPos] = 0.0; + g_esTankCache[tank].g_iMedicalCutsReward[iPos] = 0; + g_esTankCache[tank].g_iMeleeRangeReward[iPos] = 0; + g_esTankCache[tank].g_iMidairDashesReward[iPos] = 0; + g_esTankCache[tank].g_flMotivationRadiusReward[iPos] = 0.0; + g_esTankCache[tank].g_flOverdoseRadiusReward[iPos] = 0.0; + g_esTankCache[tank].g_iOverhealthReward[iPos] = 0; + g_esTankCache[tank].g_iParticleEffectVisual[iPos] = 0; + g_esTankCache[tank].g_flPipeBombDurationReward[iPos] = 0.0; + g_esTankCache[tank].g_iPrefsNotify[iPos] = 0; + g_esTankCache[tank].g_flPunchResistanceReward[iPos] = 0.0; + g_esTankCache[tank].g_flRapidPistolReward[iPos] = 0.0; + g_esTankCache[tank].g_iRecoilDampenerReward[iPos] = 0; + g_esTankCache[tank].g_flRefillPercentReward[iPos] = 0.0; + g_esTankCache[tank].g_iRegenBurstsReward[iPos] = 0; + g_esTankCache[tank].g_flReloadRateReward[iPos] = 0.0; + g_esTankCache[tank].g_iRespawnLoadoutReward[iPos] = 0; + g_esTankCache[tank].g_iReviveHealthReward[iPos] = 0; + g_esTankCache[tank].g_iRewardBots[iPos] = -1; + g_esTankCache[tank].g_flRewardChance[iPos] = 0.0; + g_esTankCache[tank].g_flRewardDuration[iPos] = 0.0; + g_esTankCache[tank].g_iRewardEffect[iPos] = 0; + g_esTankCache[tank].g_iRewardEnabled[iPos] = -1; + g_esTankCache[tank].g_iRewardNotify[iPos] = 0; + g_esTankCache[tank].g_flRewardPercentage[iPos] = 0.0; + g_esTankCache[tank].g_iRewardVisual[iPos] = 0; + g_esTankCache[tank].g_iRiotGearReward[iPos] = 0; + g_esTankCache[tank].g_iSafetyBubbleReward[iPos] = 0; + g_esTankCache[tank].g_iShareRewards[iPos] = 0; + g_esTankCache[tank].g_flShockwaveRadiusReward[iPos] = 0.0; + g_esTankCache[tank].g_flShoveDamageReward[iPos] = 0.0; + g_esTankCache[tank].g_iShovePenaltyReward[iPos] = 0; + g_esTankCache[tank].g_flShoveRateReward[iPos] = 0.0; + g_esTankCache[tank].g_flSledgehammerRoundsReward[iPos] = 0.0; + g_esTankCache[tank].g_iSpecialAmmoReward[iPos] = 0; + g_esTankCache[tank].g_flSpeedBoostReward[iPos] = 0.0; + g_esTankCache[tank].g_iStackRewards[iPos] = 0; + g_esTankCache[tank].g_iStickyGrenadesReward[iPos] = 0; + g_esTankCache[tank].g_flSupplierReward[iPos] = 0.0; + g_esTankCache[tank].g_flSwingRateReward[iPos] = 0.0; + g_esTankCache[tank].g_iSyringeDartsReward[iPos] = 0; + g_esTankCache[tank].g_iThornsReward[iPos] = 0; + g_esTankCache[tank].g_iUsefulRewards[iPos] = 0; + g_esTankCache[tank].g_iVoicePitchVisual[iPos] = 0; + } - switch (specType) - { - case 1: MT_PrintToChat(admin, "%s %t", MT_TAG2, "PersonalTypeSmoker", sName, iIndex, iType); - case 2: MT_PrintToChat(admin, "%s %t", MT_TAG2, "PersonalTypeBoomer", sName, iIndex, iType); - case 3: MT_PrintToChat(admin, "%s %t", MT_TAG2, "PersonalTypeHunter", sName, iIndex, iType); - case 4: MT_PrintToChat(admin, "%s %t", MT_TAG2, "PersonalTypeSpitter", sName, iIndex, iType); - case 5: MT_PrintToChat(admin, "%s %t", MT_TAG2, "PersonalTypeJockey", sName, iIndex, iType); - case 6: MT_PrintToChat(admin, "%s %t", MT_TAG2, "PersonalTypeCharger", sName, iIndex, iType); - default: MT_PrintToChat(admin, "%s %t", MT_TAG2, "PersonalType", sName, iIndex, iType); - } - } - } - } -} + if (iPos < (sizeof esTankCache::g_iStackLimits)) + { + g_esTankCache[tank].g_iStackLimits[iPos] = 0; + } -void vSpawnMessages(int tank, int specType) -{ - if (bIsInfectedSupported(tank, MT_CHECK_FAKECLIENT) && bIsHumanSupported(tank, specType) && bHasCoreAdminAccess(tank)) - { - switch (specType) - { - case 1: MT_PrintToChat(tank, "%s %t", MT_TAG3, "SpawnMessageSmoker"); - case 2: MT_PrintToChat(tank, "%s %t", MT_TAG3, "SpawnMessageBoomer"); - case 3: MT_PrintToChat(tank, "%s %t", MT_TAG3, "SpawnMessageHunter"); - case 4: MT_PrintToChat(tank, "%s %t", MT_TAG3, "SpawnMessageSpitter"); - case 5: MT_PrintToChat(tank, "%s %t", MT_TAG3, "SpawnMessageJockey"); - case 6: MT_PrintToChat(tank, "%s %t", MT_TAG3, "SpawnMessageCharger"); - default: MT_PrintToChat(tank, "%s %t", MT_TAG3, "SpawnMessage"); - } + if (iPos < (sizeof esTankCache::g_flComboChance)) + { + g_esTankCache[tank].g_flComboChance[iPos] = 0.0; + g_esTankCache[tank].g_iComboCooldown[iPos] = 0; + g_esTankCache[tank].g_flComboDamage[iPos] = 0.0; + g_esTankCache[tank].g_flComboDeathChance[iPos] = 0.0; + g_esTankCache[tank].g_flComboDeathRange[iPos] = 0.0; + g_esTankCache[tank].g_flComboDelay[iPos] = 0.0; + g_esTankCache[tank].g_flComboDuration[iPos] = 0.0; + g_esTankCache[tank].g_flComboInterval[iPos] = 0.0; + g_esTankCache[tank].g_flComboMinRadius[iPos] = 0.0; + g_esTankCache[tank].g_flComboMaxRadius[iPos] = 0.0; + g_esTankCache[tank].g_flComboRange[iPos] = 0.0; + g_esTankCache[tank].g_flComboRangeChance[iPos] = 0.0; + g_esTankCache[tank].g_iComboRangeCooldown[iPos] = 0; + g_esTankCache[tank].g_flComboRockChance[iPos] = 0.0; + g_esTankCache[tank].g_iComboRockCooldown[iPos] = 0; + g_esTankCache[tank].g_flComboSpeed[iPos] = 0.0; + } - MT_PrintToChat(tank, "%s %t", MT_TAG2, "AbilityButtons"); - MT_PrintToChat(tank, "%s %t", MT_TAG2, "AbilityButtons2"); - MT_PrintToChat(tank, "%s %t", MT_TAG2, "AbilityButtons3"); - MT_PrintToChat(tank, "%s %t", MT_TAG2, "AbilityButtons4"); - } -} + if (iPos < (sizeof esTankCache::g_flComboTypeChance)) + { + g_esTankCache[tank].g_flComboTypeChance[iPos] = 0.0; + } -void vSpawnModes(int tank, bool status) -{ - g_esPlayer[tank].g_bBoss = status; - g_esPlayer[tank].g_bCombo = status; - g_esPlayer[tank].g_bRandomized = status; - g_esPlayer[tank].g_bTransformed = status; -} + if (iPos < (sizeof esTankCache::g_flPropsChance)) + { + g_esTankCache[tank].g_flPropsChance[iPos] = 0.0; + } -void vSpawnTank(int admin, int specType, bool log = true, int amount, int mode, bool blind) -{ - char sCommand[32], sParameter[32]; - FormatEx(sCommand, sizeof sCommand, "z_spawn%s", (g_bSecondGame ? "_old" : "")); + if (iPos < (sizeof esTankCache::g_flBodyChance)) + { + g_esTankCache[tank].g_flBodyChance[iPos] = 0.0; + } - switch (specType) - { - case 1: FormatEx(sParameter, sizeof sParameter, "smoker%s", ((mode == 0) ? "" : " auto")); - case 2: FormatEx(sParameter, sizeof sParameter, "boomer%s", ((mode == 0) ? "" : " auto")); - case 3: FormatEx(sParameter, sizeof sParameter, "hunter%s", ((mode == 0) ? "" : " auto")); - case 4: FormatEx(sParameter, sizeof sParameter, "spitter%s", ((mode == 0) ? "" : " auto")); - case 5: FormatEx(sParameter, sizeof sParameter, "jockey%s", ((mode == 0) ? "" : " auto")); - case 6: FormatEx(sParameter, sizeof sParameter, "charger%s", ((mode == 0) ? "" : " auto")); - default: FormatEx(sParameter, sizeof sParameter, "tank%s", ((mode == 0) ? "" : " auto")); - } + if (iPos < (sizeof esTankCache::g_iSkinColor)) + { + g_esTankCache[tank].g_flRockChance[iPos] = 0.0; + g_esTankCache[tank].g_iBossHealth[iPos] = 0; + g_esTankCache[tank].g_iBossType[iPos] = 0; + } + } + } - int iType = g_esGeneral.g_iChosenType; - g_esGeneral.g_bForceSpawned = true; + g_esTankCache[tank].g_sFlameColor[0] = '\0'; + g_esTankCache[tank].g_sFlashlightColor[0] = '\0'; + g_esTankCache[tank].g_sGlowColor[0] = '\0'; + g_esTankCache[tank].g_sOzTankColor[0] = '\0'; + g_esTankCache[tank].g_sPropTankColor[0] = '\0'; + g_esTankCache[tank].g_sRockColor[0] = '\0'; + g_esTankCache[tank].g_sSkinColor[0] = '\0'; + g_esTankCache[tank].g_sTireColor[0] = '\0'; + g_esTankCache[tank].g_iBodyEffects = 0; + g_esTankCache[tank].g_iGlowEnabled = 0; + g_esTankCache[tank].g_iGlowFlashing = 0; + g_esTankCache[tank].g_iGlowMaxRange = 0; + g_esTankCache[tank].g_iGlowMinRange = 0; + g_esTankCache[tank].g_iGlowType = 0; + g_esTankCache[tank].g_iPropsAttached = 0; + g_esTankCache[tank].g_iRockEffects = 0; + g_esTankCache[tank].g_iRockModel = 0; + g_esTankCache[tank].g_iTankModel = 0; + + for (int iPos = 0; iPos < (sizeof esTankCache::g_flPropsChance); iPos++) + { + if (iPos < (sizeof esTankCache::g_flPropsChance)) + { + g_esTankCache[tank].g_flPropsChance[iPos] = 0.0; + } - switch (amount) - { - case 1: vCheatCommand(admin, sCommand, sParameter); - default: - { - for (int iAmount = 0; iAmount <= amount; iAmount++) - { - if (iAmount < amount) - { - if (bIsValidClient(admin)) + if (iPos < (sizeof esTankCache::g_flBodyChance)) { - vCheatCommand(admin, sCommand, sParameter); + g_esTankCache[tank].g_flBodyChance[iPos] = 0.0; + } - g_esGeneral.g_bBlindType = blind; - g_esGeneral.g_bForceSpawned = true; - g_esGeneral.g_iChosenType = iType; + if (iPos < (sizeof esTankCache::g_iSkinColor)) + { + g_esTankCache[tank].g_flRockChance[iPos] = 0.0; + g_esTankCache[tank].g_iSkinColor[iPos] = 255; + g_esTankCache[tank].g_iLightColor[iPos] = 255; + g_esTankCache[tank].g_iOzTankColor[iPos] = 255; + g_esTankCache[tank].g_iFlameColor[iPos] = 255; + g_esTankCache[tank].g_iRockColor[iPos] = 255; + g_esTankCache[tank].g_iTireColor[iPos] = 255; + g_esTankCache[tank].g_iPropTankColor[iPos] = 255; + g_esTankCache[tank].g_iFlashlightColor[iPos] = 255; + g_esTankCache[tank].g_iCrownColor[iPos] = 255; + } + + if (iPos < (sizeof esTankCache::g_iGlowColor)) + { + g_esTankCache[tank].g_iGlowColor[iPos] = 255; } } - else if (iAmount == amount) - { - g_esGeneral.g_bBlindType = false; - g_esGeneral.g_iChosenType = 0; - } + } } } - if (log) + if (!visualsOnly) { - char sName[33]; - - switch (iType) - { - case -1: - { - switch (specType) - { - case 1, 2, 3, 4, 5, 6: FormatEx(sName, sizeof sName, g_sSpecialNames[specType]); - default: FormatEx(sName, sizeof sName, "Tank"); - } - } - default: - { - switch (specType) - { - case 1: strcopy(sName, sizeof sName, g_esSpecial[iType].g_sSmokerName); - case 2: strcopy(sName, sizeof sName, g_esSpecial[iType].g_sBoomerName); - case 3: strcopy(sName, sizeof sName, g_esSpecial[iType].g_sHunterName); - case 4: strcopy(sName, sizeof sName, g_esSpecial[iType].g_sSpitterName); - case 5: strcopy(sName, sizeof sName, g_esSpecial[iType].g_sJockeyName); - case 6: strcopy(sName, sizeof sName, g_esSpecial[iType].g_sChargerName); - default: strcopy(sName, sizeof sName, g_esTank[iType].g_sTankName); - } - } - } - vLogCommand(admin, MT_CMD_SPAWN, "%s %N:{default} Spawned{mint} %i{olive} %s%s{default}.", MT_TAG5, admin, amount, sName, ((amount > 1) ? "s" : "")); - vLogMessage(MT_LOG_SERVER, _, "%s %N: Spawned %i %s%s.", MT_TAG, admin, amount, sName, ((amount > 1) ? "s" : "")); + Call_StartForward(g_esGeneral.g_gfSettingsCachedForward); + Call_PushCell(tank); + Call_PushCell(bAccess); + Call_PushCell(g_esTank[iType].g_iRealType[0]); + Call_Finish(); } } -void vTankSpawn(int tank, int mode = 0, int specType = 0) -{ - int iSpecType = (specType <= 0) ? g_esPlayer[tank].g_iInfectedType : specType; - DataPack dpTankSpawn = new DataPack(); - dpTankSpawn.WriteCell(GetClientUserId(tank)); - dpTankSpawn.WriteCell(mode); - dpTankSpawn.WriteCell(iSpecType); - RequestFrame(vTankSpawnFrame, dpTankSpawn); -} - -/** - * Config settings functions - **/ - -void vCacheSettings(int tank) -{ - bool bAccess = bIsValidClient(tank) && bHasCoreAdminAccess(tank), bHuman = bIsValidClient(tank, MT_CHECK_FAKECLIENT); - int iType = g_esPlayer[tank].g_iTankType; - - if (bIsSpecialInfected(tank, MT_CHECK_INDEX|MT_CHECK_INGAME)) - { - int iSpecType = g_esPlayer[tank].g_iInfectedType - 1; - g_esCache[tank].g_iSpecialTypes = iGetSettingValue(bAccess, true, g_esSpecial[iType].g_iSpecialTypes, g_esSpecific.g_iSpecialTypes, 1); - if (g_esCache[tank].g_iSpecialTypes > 0 && g_esCache[tank].g_iSpecialTypes & (1 << iSpecType)) - { - g_esCache[tank].g_flArmorDuration = flGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_flArmorDuration, g_esTank[iType].g_flArmorDuration, g_esSpecific.g_flArmorDuration, g_esGeneral.g_flArmorDuration, 1); - g_esCache[tank].g_flArmorDuration = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flArmorDuration, g_esPlayer[tank].g_flArmorDuration, g_esCache[tank].g_flArmorDuration, g_esCache[tank].g_flArmorDuration, 1); - g_esCache[tank].g_flArmorResistance = flGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_flArmorResistance, g_esTank[iType].g_flArmorResistance, g_esSpecific.g_flArmorResistance, g_esGeneral.g_flArmorResistance, 1); - g_esCache[tank].g_flArmorResistance = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flArmorResistance, g_esPlayer[tank].g_flArmorResistance, g_esCache[tank].g_flArmorResistance, g_esCache[tank].g_flArmorResistance, 1); - g_esCache[tank].g_flAttackInterval = flGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_flAttackInterval, g_esTank[iType].g_flAttackInterval, g_esSpecific.g_flAttackInterval, g_esGeneral.g_flAttackInterval, 1); - g_esCache[tank].g_flAttackInterval = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flAttackInterval, g_esPlayer[tank].g_flAttackInterval, g_esCache[tank].g_flAttackInterval, g_esCache[tank].g_flAttackInterval, 1); - g_esCache[tank].g_flBurnDuration = flGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_flBurnDuration, g_esTank[iType].g_flBurnDuration, g_esSpecific.g_flBurnDuration, g_esGeneral.g_flBurnDuration, 1); - g_esCache[tank].g_flBurnDuration = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flBurnDuration, g_esPlayer[tank].g_flBurnDuration, g_esCache[tank].g_flBurnDuration, g_esCache[tank].g_flBurnDuration, 1); - g_esCache[tank].g_flBurntSkin = flGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_flBurntSkin, g_esTank[iType].g_flBurntSkin, g_esSpecific.g_flBurntSkin, g_esGeneral.g_flBurntSkin, 1, -1.0); - g_esCache[tank].g_flBurntSkin = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flBurntSkin, g_esPlayer[tank].g_flBurntSkin, g_esCache[tank].g_flBurntSkin, g_esCache[tank].g_flBurntSkin, 1, -1.0); - g_esCache[tank].g_flClawDamage = flGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_flClawDamage, g_esTank[iType].g_flClawDamage, g_esSpecific.g_flClawDamage, g_esGeneral.g_flClawDamage, 1, -1.0); - g_esCache[tank].g_flClawDamage = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flClawDamage, g_esPlayer[tank].g_flClawDamage, g_esCache[tank].g_flClawDamage, g_esCache[tank].g_flClawDamage, 1, -1.0); - g_esCache[tank].g_flHealPercentMultiplier = flGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_flHealPercentMultiplier, g_esTank[iType].g_flHealPercentMultiplier, g_esSpecific.g_flHealPercentMultiplier, g_esGeneral.g_flHealPercentMultiplier, 1); - g_esCache[tank].g_flHealPercentMultiplier = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flHealPercentMultiplier, g_esPlayer[tank].g_flHealPercentMultiplier, g_esCache[tank].g_flHealPercentMultiplier, g_esCache[tank].g_flHealPercentMultiplier, 1); - g_esCache[tank].g_flHittableDamage = flGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_flHittableDamage, g_esTank[iType].g_flHittableDamage, g_esSpecific.g_flHittableDamage, g_esGeneral.g_flHittableDamage, 1, -1.0); - g_esCache[tank].g_flHittableDamage = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flHittableDamage, g_esPlayer[tank].g_flHittableDamage, g_esCache[tank].g_flHittableDamage, g_esCache[tank].g_flHittableDamage, 1, -1.0); - g_esCache[tank].g_flIncapDamageMultiplier = flGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_flIncapDamageMultiplier, g_esTank[iType].g_flIncapDamageMultiplier, g_esSpecific.g_flIncapDamageMultiplier, g_esGeneral.g_flIncapDamageMultiplier, 1); - g_esCache[tank].g_flIncapDamageMultiplier = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flIncapDamageMultiplier, g_esPlayer[tank].g_flIncapDamageMultiplier, g_esCache[tank].g_flIncapDamageMultiplier, g_esCache[tank].g_flIncapDamageMultiplier, 1); - g_esCache[tank].g_flMeleeHitValue = flGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_flMeleeHitValue, g_esTank[iType].g_flMeleeHitValue, g_esSpecific.g_flMeleeHitValue, g_esGeneral.g_flMeleeHitValue, 1); - g_esCache[tank].g_flMeleeHitValue = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flMeleeHitValue, g_esPlayer[tank].g_flMeleeHitValue, g_esCache[tank].g_flMeleeHitValue, g_esCache[tank].g_flMeleeHitValue, 1); - g_esCache[tank].g_flPinDamage = flGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_flPinDamage, g_esTank[iType].g_flRockDamage, g_esSpecific.g_flPinDamage, g_esGeneral.g_flRockDamage, 1, -1.0); - g_esCache[tank].g_flPinDamage = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flPinDamage, g_esPlayer[tank].g_flRockDamage, g_esCache[tank].g_flPinDamage, g_esCache[tank].g_flPinDamage, 1, -1.0); - g_esCache[tank].g_flRandomDuration = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flRandomDuration, g_esPlayer[tank].g_flRandomDuration, g_esSpecial[iType].g_flRandomDuration, g_esTank[iType].g_flRandomDuration, 1); - g_esCache[tank].g_flRandomInterval = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flRandomInterval, g_esPlayer[tank].g_flRandomInterval, g_esSpecial[iType].g_flRandomInterval, g_esTank[iType].g_flRandomInterval, 1); - g_esCache[tank].g_flRunSpeed = flGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_flRunSpeed, g_esTank[iType].g_flRunSpeed, g_esSpecific.g_flRunSpeed, g_esGeneral.g_flRunSpeed, 1); - g_esCache[tank].g_flRunSpeed = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flRunSpeed, g_esPlayer[tank].g_flRunSpeed, g_esCache[tank].g_flRunSpeed, g_esCache[tank].g_flRunSpeed, 1); - g_esCache[tank].g_flShieldDuration = flGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_flShieldDuration, g_esTank[iType].g_flShieldDuration, g_esSpecific.g_flShieldDuration, g_esGeneral.g_flShieldDuration, 1); - g_esCache[tank].g_flShieldDuration = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flShieldDuration, g_esPlayer[tank].g_flShieldDuration, g_esCache[tank].g_flShieldDuration, g_esCache[tank].g_flShieldDuration, 1); - g_esCache[tank].g_flShieldResistance = flGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_flShieldResistance, g_esTank[iType].g_flShieldResistance, g_esSpecific.g_flShieldResistance, g_esGeneral.g_flShieldResistance, 1); - g_esCache[tank].g_flShieldResistance = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flShieldResistance, g_esPlayer[tank].g_flShieldResistance, g_esCache[tank].g_flShieldResistance, g_esCache[tank].g_flShieldResistance, 1); - g_esCache[tank].g_flSpecialInterval = flGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_flSpecialInterval, g_esTank[iType].g_flThrowInterval, g_esSpecific.g_flSpecialInterval, g_esGeneral.g_flThrowInterval, 1); - g_esCache[tank].g_flSpecialInterval = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flSpecialInterval, g_esPlayer[tank].g_flThrowInterval, g_esCache[tank].g_flSpecialInterval, g_esCache[tank].g_flSpecialInterval, 1); - g_esCache[tank].g_flTransformDelay = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flTransformDelay, g_esPlayer[tank].g_flTransformDelay, g_esSpecial[iType].g_flTransformDelay, g_esTank[iType].g_flTransformDelay, 1); - g_esCache[tank].g_flTransformDuration = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flTransformDuration, g_esPlayer[tank].g_flTransformDuration, g_esSpecial[iType].g_flTransformDuration, g_esTank[iType].g_flTransformDuration, 1); - g_esCache[tank].g_iAnnounceArrival = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iAnnounceArrival, g_esTank[iType].g_iAnnounceArrival, g_esSpecific.g_iAnnounceArrival, g_esGeneral.g_iAnnounceArrival, 1); - g_esCache[tank].g_iAnnounceArrival = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iAnnounceArrival, g_esPlayer[tank].g_iAnnounceArrival, g_esCache[tank].g_iAnnounceArrival, g_esCache[tank].g_iAnnounceArrival, 1); - g_esCache[tank].g_iAnnounceDeath = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iAnnounceDeath, g_esTank[iType].g_iAnnounceDeath, g_esSpecific.g_iAnnounceDeath, g_esGeneral.g_iAnnounceDeath, 1); - g_esCache[tank].g_iAnnounceDeath = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iAnnounceDeath, g_esPlayer[tank].g_iAnnounceDeath, g_esCache[tank].g_iAnnounceDeath, g_esCache[tank].g_iAnnounceDeath, 1); - g_esCache[tank].g_iAnnounceKill = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iAnnounceKill, g_esTank[iType].g_iAnnounceKill, g_esSpecific.g_iAnnounceKill, g_esGeneral.g_iAnnounceKill, 1); - g_esCache[tank].g_iAnnounceKill = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iAnnounceKill, g_esPlayer[tank].g_iAnnounceKill, g_esCache[tank].g_iAnnounceKill, g_esCache[tank].g_iAnnounceKill, 1); - g_esCache[tank].g_iArrivalMessage = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iArrivalMessage, g_esTank[iType].g_iArrivalMessage, g_esSpecific.g_iArrivalMessage, g_esGeneral.g_iArrivalMessage, 1); - g_esCache[tank].g_iArrivalMessage = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iArrivalMessage, g_esPlayer[tank].g_iArrivalMessage, g_esCache[tank].g_iArrivalMessage, g_esCache[tank].g_iArrivalMessage, 1); - g_esCache[tank].g_iArrivalSound = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iArrivalSound, g_esTank[iType].g_iArrivalSound, g_esSpecific.g_iArrivalSound, g_esGeneral.g_iArrivalSound, 1); - g_esCache[tank].g_iArrivalSound = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iArrivalSound, g_esPlayer[tank].g_iArrivalSound, g_esCache[tank].g_iArrivalSound, g_esCache[tank].g_iArrivalSound, 1); - g_esCache[tank].g_iBaseHealth = iGetSubSettingValue(bAccess, true, g_esTank[iType].g_iBaseHealth, g_esSpecific.g_iBaseHealth[0], g_esSpecific.g_iBaseHealth[iSpecType + 1], g_esGeneral.g_iBaseHealth, 1); - g_esCache[tank].g_iBaseHealth = iGetSubSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iBaseHealth, g_esSpecial[iType].g_iBaseHealth[0], g_esSpecial[iType].g_iBaseHealth[iSpecType + 1], g_esCache[tank].g_iBaseHealth, 1); - g_esCache[tank].g_iBaseHealth = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iBaseHealth[0], g_esTeammate[tank].g_iBaseHealth[iSpecType + 1], g_esCache[tank].g_iBaseHealth, g_esCache[tank].g_iBaseHealth, 1); - g_esCache[tank].g_iBodyEffects = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iBodyEffects, g_esPlayer[tank].g_iBodyEffects, g_esSpecial[iType].g_iBodyEffects, g_esTank[iType].g_iBodyEffects, 1); - g_esCache[tank].g_iBossEffects = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iBossEffects, g_esPlayer[tank].g_iBossEffects, g_esSpecial[iType].g_iBossEffects, g_esTank[iType].g_iBossEffects, 1); - g_esCache[tank].g_iBossStages = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iBossStages, g_esPlayer[tank].g_iBossStages, g_esSpecial[iType].g_iBossStages, g_esTank[iType].g_iBossStages, 1); - g_esCache[tank].g_iBulletImmunity = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iBulletImmunity, g_esTank[iType].g_iBulletImmunity, g_esSpecific.g_iBulletImmunity, g_esGeneral.g_iBulletImmunity, 1); - g_esCache[tank].g_iBulletImmunity = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iBulletImmunity, g_esPlayer[tank].g_iBulletImmunity, g_esCache[tank].g_iBulletImmunity, g_esCache[tank].g_iBulletImmunity, 1); - g_esCache[tank].g_iDeathDetails = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iDeathDetails, g_esTank[iType].g_iDeathDetails, g_esSpecific.g_iDeathDetails, g_esGeneral.g_iDeathDetails, 1); - g_esCache[tank].g_iDeathDetails = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iDeathDetails, g_esPlayer[tank].g_iDeathDetails, g_esCache[tank].g_iDeathDetails, g_esCache[tank].g_iDeathDetails, 1); - g_esCache[tank].g_iDeathMessage = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iDeathMessage, g_esTank[iType].g_iDeathMessage, g_esSpecific.g_iDeathMessage, g_esGeneral.g_iDeathMessage, 1); - g_esCache[tank].g_iDeathMessage = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iDeathMessage, g_esPlayer[tank].g_iDeathMessage, g_esCache[tank].g_iDeathMessage, g_esCache[tank].g_iDeathMessage, 1); - g_esCache[tank].g_iDeathRevert = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iDeathRevert, g_esTank[iType].g_iDeathRevert, g_esSpecific.g_iDeathRevert, g_esGeneral.g_iDeathRevert, 1); - g_esCache[tank].g_iDeathRevert = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iDeathRevert, g_esPlayer[tank].g_iDeathRevert, g_esCache[tank].g_iDeathRevert, g_esCache[tank].g_iDeathRevert, 1); - g_esCache[tank].g_iDeathSound = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iDeathSound, g_esTank[iType].g_iDeathSound, g_esSpecific.g_iDeathSound, g_esGeneral.g_iDeathSound, 1); - g_esCache[tank].g_iDeathSound = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iDeathSound, g_esPlayer[tank].g_iDeathSound, g_esCache[tank].g_iDeathSound, g_esCache[tank].g_iDeathSound, 1); - g_esCache[tank].g_iDisplayHealth = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iDisplayHealth, g_esTank[iType].g_iDisplayHealth, g_esSpecific.g_iDisplayHealth, g_esGeneral.g_iDisplayHealth, 1); - g_esCache[tank].g_iDisplayHealth = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iDisplayHealth, g_esPlayer[tank].g_iDisplayHealth, g_esCache[tank].g_iDisplayHealth, g_esCache[tank].g_iDisplayHealth, 1); - g_esCache[tank].g_iDisplayHealthType = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iDisplayHealthType, g_esTank[iType].g_iDisplayHealthType, g_esSpecific.g_iDisplayHealthType, g_esGeneral.g_iDisplayHealthType, 1); - g_esCache[tank].g_iDisplayHealthType = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iDisplayHealthType, g_esPlayer[tank].g_iDisplayHealthType, g_esCache[tank].g_iDisplayHealthType, g_esCache[tank].g_iDisplayHealthType, 1); - g_esCache[tank].g_iExplosiveImmunity = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iExplosiveImmunity, g_esTank[iType].g_iExplosiveImmunity, g_esSpecific.g_iExplosiveImmunity, g_esGeneral.g_iExplosiveImmunity, 1); - g_esCache[tank].g_iExplosiveImmunity = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iExplosiveImmunity, g_esPlayer[tank].g_iExplosiveImmunity, g_esCache[tank].g_iExplosiveImmunity, g_esCache[tank].g_iExplosiveImmunity, 1); - g_esCache[tank].g_iExtraHealth = iGetSubSettingValue(bAccess, true, g_esTank[iType].g_iExtraHealth, g_esSpecific.g_iExtraHealth[0], g_esSpecific.g_iExtraHealth[iSpecType + 1], g_esGeneral.g_iExtraHealth, 2, -1); - g_esCache[tank].g_iExtraHealth = iGetSubSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iExtraHealth, g_esSpecial[iType].g_iExtraHealth[0], g_esSpecial[iType].g_iExtraHealth[iSpecType + 1], g_esCache[tank].g_iExtraHealth, 2, -1); - g_esCache[tank].g_iExtraHealth = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iExtraHealth[0], g_esTeammate[tank].g_iExtraHealth[iSpecType + 1], g_esCache[tank].g_iExtraHealth, g_esCache[tank].g_iExtraHealth, 2, -1); - g_esCache[tank].g_iFireImmunity = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iFireImmunity, g_esTank[iType].g_iFireImmunity, g_esSpecific.g_iFireImmunity, g_esGeneral.g_iFireImmunity, 1); - g_esCache[tank].g_iFireImmunity = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iFireImmunity, g_esPlayer[tank].g_iFireImmunity, g_esCache[tank].g_iFireImmunity, g_esCache[tank].g_iFireImmunity, 1); - g_esCache[tank].g_iGlowEnabled = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iGlowEnabled, g_esPlayer[tank].g_iGlowEnabled, g_esSpecial[iType].g_iGlowEnabled, g_esTank[iType].g_iGlowEnabled, 1); - g_esCache[tank].g_iGlowFlashing = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iGlowFlashing, g_esPlayer[tank].g_iGlowFlashing, g_esSpecial[iType].g_iGlowFlashing, g_esTank[iType].g_iGlowFlashing, 1); - g_esCache[tank].g_iGlowMaxRange = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iGlowMaxRange, g_esPlayer[tank].g_iGlowMaxRange, g_esSpecial[iType].g_iGlowMaxRange, g_esTank[iType].g_iGlowMaxRange, 1); - g_esCache[tank].g_iGlowMinRange = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iGlowMinRange, g_esPlayer[tank].g_iGlowMinRange, g_esSpecial[iType].g_iGlowMinRange, g_esTank[iType].g_iGlowMinRange, 1); - g_esCache[tank].g_iGlowType = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iGlowType, g_esPlayer[tank].g_iGlowType, g_esSpecial[iType].g_iGlowType, g_esTank[iType].g_iGlowType, 1); - g_esCache[tank].g_iHittableImmunity = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iHittableImmunity, g_esTank[iType].g_iHittableImmunity, g_esSpecific.g_iHittableImmunity, g_esGeneral.g_iHittableImmunity, 1); - g_esCache[tank].g_iHittableImmunity = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iHittableImmunity, g_esPlayer[tank].g_iHittableImmunity, g_esCache[tank].g_iHittableImmunity, g_esCache[tank].g_iHittableImmunity, 1); - g_esCache[tank].g_iHumanMultiplierMode = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iHumanMultiplierMode, g_esTank[iType].g_iHumanMultiplierMode, g_esSpecific.g_iHumanMultiplierMode, g_esGeneral.g_iHumanMultiplierMode, 1); - g_esCache[tank].g_iHumanMultiplierMode = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iHumanMultiplierMode, g_esPlayer[tank].g_iHumanMultiplierMode, g_esCache[tank].g_iHumanMultiplierMode, g_esCache[tank].g_iHumanMultiplierMode, 1); - g_esCache[tank].g_iIntangibleBody = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iIntangibleBody, g_esTank[iType].g_iIntangibleBody, g_esSpecific.g_iIntangibleBody, g_esGeneral.g_iIntangibleBody, 1); - g_esCache[tank].g_iIntangibleBody = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iIntangibleBody, g_esPlayer[tank].g_iIntangibleBody, g_esCache[tank].g_iIntangibleBody, g_esCache[tank].g_iIntangibleBody, 1); - g_esCache[tank].g_iKillMessage = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iKillMessage, g_esTank[iType].g_iKillMessage, g_esSpecific.g_iKillMessage, g_esGeneral.g_iKillMessage, 1); - g_esCache[tank].g_iKillMessage = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iKillMessage, g_esPlayer[tank].g_iKillMessage, g_esCache[tank].g_iKillMessage, g_esCache[tank].g_iKillMessage, 1); - g_esCache[tank].g_iMeleeHitMode = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iMeleeHitMode, g_esTank[iType].g_iMeleeHitMode, g_esSpecific.g_iMeleeHitMode, g_esGeneral.g_iMeleeHitMode, 1); - g_esCache[tank].g_iMeleeHitMode = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iMeleeHitMode, g_esPlayer[tank].g_iMeleeHitMode, g_esCache[tank].g_iMeleeHitMode, g_esCache[tank].g_iMeleeHitMode, 1); - g_esCache[tank].g_iMeleeImmunity = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iMeleeImmunity, g_esTank[iType].g_iMeleeImmunity, g_esSpecific.g_iMeleeImmunity, g_esGeneral.g_iMeleeImmunity, 1); - g_esCache[tank].g_iMeleeImmunity = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iMeleeImmunity, g_esPlayer[tank].g_iMeleeImmunity, g_esCache[tank].g_iMeleeImmunity, g_esCache[tank].g_iMeleeImmunity, 1); - g_esCache[tank].g_iMinimumHumans = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iMinimumHumans, g_esTank[iType].g_iMinimumHumans, g_esSpecific.g_iMinimumHumans, g_esGeneral.g_iMinimumHumans, 1); - g_esCache[tank].g_iMinimumHumans = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iMinimumHumans, g_esPlayer[tank].g_iMinimumHumans, g_esCache[tank].g_iMinimumHumans, g_esCache[tank].g_iMinimumHumans, 1); - g_esCache[tank].g_iMultiplyHealth = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iMultiplyHealth, g_esTank[iType].g_iMultiplyHealth, g_esSpecific.g_iMultiplyHealth, g_esGeneral.g_iMultiplyHealth, 1); - g_esCache[tank].g_iMultiplyHealth = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iMultiplyHealth, g_esPlayer[tank].g_iMultiplyHealth, g_esCache[tank].g_iMultiplyHealth, g_esCache[tank].g_iMultiplyHealth, 1); - g_esCache[tank].g_iRandomSpecial = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iRandomSpecial, g_esPlayer[tank].g_iRandomTank, g_esSpecial[iType].g_iRandomSpecial, g_esTank[iType].g_iRandomTank, 1); - g_esCache[tank].g_iRockEffects = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iRockEffects, g_esPlayer[tank].g_iRockEffects, g_esSpecial[iType].g_iRockEffects, g_esTank[iType].g_iRockEffects, 1); - g_esCache[tank].g_iRockModel = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iRockModel, g_esPlayer[tank].g_iRockModel, g_esSpecial[iType].g_iRockModel, g_esTank[iType].g_iRockModel, 1); - g_esCache[tank].g_iSpawnProtection = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iSpawnProtection, g_esTank[iType].g_iSpawnProtection, g_esSpecific.g_iSpawnProtection, g_esGeneral.g_iSpawnProtection, 1); - g_esCache[tank].g_iSpawnProtection = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iSpawnProtection, g_esPlayer[tank].g_iSpawnProtection, g_esCache[tank].g_iSpawnProtection, g_esCache[tank].g_iSpawnProtection, 1); - g_esCache[tank].g_iSpawnType = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iSpawnType, g_esPlayer[tank].g_iSpawnType, g_esSpecial[iType].g_iSpawnType, g_esTank[iType].g_iSpawnType, 1); - g_esCache[tank].g_iSpecialModel = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iSpecialModel, g_esTank[iType].g_iTankModel, g_esSpecific.g_iSpecialModel, g_esGeneral.g_iTankModel, 1); - g_esCache[tank].g_iSpecialModel = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iSpecialModel, g_esPlayer[tank].g_iTankModel, g_esCache[tank].g_iSpecialModel, g_esCache[tank].g_iSpecialModel, 1); - g_esCache[tank].g_iSpecialNote = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iSpecialNote, g_esPlayer[tank].g_iTankNote, g_esSpecial[iType].g_iSpecialNote, g_esTank[iType].g_iTankNote, 1); - g_esCache[tank].g_iThrowRock = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iThrowRock, g_esTank[iType].g_iThrowRock, g_esSpecific.g_iThrowRock, g_esGeneral.g_iThrowRock, 1); - g_esCache[tank].g_iThrowRock = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iThrowRock, g_esPlayer[tank].g_iThrowRock, g_esCache[tank].g_iThrowRock, g_esCache[tank].g_iThrowRock, 1); - g_esCache[tank].g_iVocalizeArrival = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iVocalizeArrival, g_esTank[iType].g_iVocalizeArrival, g_esSpecific.g_iVocalizeArrival, g_esGeneral.g_iVocalizeArrival, 1); - g_esCache[tank].g_iVocalizeArrival = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iVocalizeArrival, g_esPlayer[tank].g_iVocalizeArrival, g_esCache[tank].g_iVocalizeArrival, g_esCache[tank].g_iVocalizeArrival, 1); - g_esCache[tank].g_iVocalizeDeath = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iVocalizeDeath, g_esTank[iType].g_iVocalizeDeath, g_esSpecific.g_iVocalizeDeath, g_esGeneral.g_iVocalizeDeath, 1); - g_esCache[tank].g_iVocalizeDeath = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iVocalizeDeath, g_esPlayer[tank].g_iVocalizeDeath, g_esCache[tank].g_iVocalizeDeath, g_esCache[tank].g_iVocalizeDeath, 1); - g_esCache[tank].g_iVomitImmunity = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iVomitImmunity, g_esTank[iType].g_iVomitImmunity, g_esSpecific.g_iVomitImmunity, g_esGeneral.g_iVomitImmunity, 1); - g_esCache[tank].g_iVomitImmunity = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iVomitImmunity, g_esPlayer[tank].g_iVomitImmunity, g_esCache[tank].g_iVomitImmunity, g_esCache[tank].g_iVomitImmunity, 1); - - vGetSubSettingValue(bAccess, true, g_esCache[tank].g_sBodyColorVisual, sizeof esCache::g_sBodyColorVisual, g_esSpecial[iType].g_sBodyColorVisual, g_esTank[iType].g_sBodyColorVisual, g_esSpecific.g_sBodyColorVisual, g_esGeneral.g_sBodyColorVisual); - vGetSubSettingValue(bAccess, bHuman, g_esCache[tank].g_sBodyColorVisual, sizeof esCache::g_sBodyColorVisual, g_esTeammate[tank].g_sBodyColorVisual, g_esPlayer[tank].g_sBodyColorVisual, g_esCache[tank].g_sBodyColorVisual, g_esCache[tank].g_sBodyColorVisual); - vGetSubSettingValue(bAccess, true, g_esCache[tank].g_sBodyColorVisual2, sizeof esCache::g_sBodyColorVisual2, g_esSpecial[iType].g_sBodyColorVisual2, g_esTank[iType].g_sBodyColorVisual2, g_esSpecific.g_sBodyColorVisual2, g_esGeneral.g_sBodyColorVisual2); - vGetSubSettingValue(bAccess, bHuman, g_esCache[tank].g_sBodyColorVisual2, sizeof esCache::g_sBodyColorVisual2, g_esTeammate[tank].g_sBodyColorVisual2, g_esPlayer[tank].g_sBodyColorVisual2, g_esCache[tank].g_sBodyColorVisual2, g_esCache[tank].g_sBodyColorVisual2); - vGetSubSettingValue(bAccess, true, g_esCache[tank].g_sBodyColorVisual3, sizeof esCache::g_sBodyColorVisual3, g_esSpecial[iType].g_sBodyColorVisual3, g_esTank[iType].g_sBodyColorVisual3, g_esSpecific.g_sBodyColorVisual3, g_esGeneral.g_sBodyColorVisual3); - vGetSubSettingValue(bAccess, bHuman, g_esCache[tank].g_sBodyColorVisual3, sizeof esCache::g_sBodyColorVisual3, g_esTeammate[tank].g_sBodyColorVisual3, g_esPlayer[tank].g_sBodyColorVisual3, g_esCache[tank].g_sBodyColorVisual3, g_esCache[tank].g_sBodyColorVisual3); - vGetSubSettingValue(bAccess, true, g_esCache[tank].g_sBodyColorVisual4, sizeof esCache::g_sBodyColorVisual4, g_esSpecial[iType].g_sBodyColorVisual4, g_esTank[iType].g_sBodyColorVisual4, g_esSpecific.g_sBodyColorVisual4, g_esGeneral.g_sBodyColorVisual4); - vGetSubSettingValue(bAccess, bHuman, g_esCache[tank].g_sBodyColorVisual4, sizeof esCache::g_sBodyColorVisual4, g_esTeammate[tank].g_sBodyColorVisual4, g_esPlayer[tank].g_sBodyColorVisual4, g_esCache[tank].g_sBodyColorVisual4, g_esCache[tank].g_sBodyColorVisual4); - vGetSubSettingValue(bAccess, bHuman, g_esCache[tank].g_sComboSet, sizeof esCache::g_sComboSet, g_esTeammate[tank].g_sComboSet, g_esPlayer[tank].g_sComboSet, g_esSpecial[iType].g_sComboSet, g_esTank[iType].g_sComboSet); - vGetSubSettingValue(bAccess, true, g_esCache[tank].g_sFallVoicelineReward, sizeof esCache::g_sFallVoicelineReward, g_esSpecial[iType].g_sFallVoicelineReward, g_esTank[iType].g_sFallVoicelineReward, g_esSpecific.g_sFallVoicelineReward, g_esGeneral.g_sFallVoicelineReward); - vGetSubSettingValue(bAccess, bHuman, g_esCache[tank].g_sFallVoicelineReward, sizeof esCache::g_sFallVoicelineReward, g_esTeammate[tank].g_sFallVoicelineReward, g_esPlayer[tank].g_sFallVoicelineReward, g_esCache[tank].g_sFallVoicelineReward, g_esCache[tank].g_sFallVoicelineReward); - vGetSubSettingValue(bAccess, true, g_esCache[tank].g_sFallVoicelineReward2, sizeof esCache::g_sFallVoicelineReward2, g_esSpecial[iType].g_sFallVoicelineReward2, g_esTank[iType].g_sFallVoicelineReward2, g_esSpecific.g_sFallVoicelineReward2, g_esGeneral.g_sFallVoicelineReward2); - vGetSubSettingValue(bAccess, bHuman, g_esCache[tank].g_sFallVoicelineReward2, sizeof esCache::g_sFallVoicelineReward2, g_esTeammate[tank].g_sFallVoicelineReward2, g_esPlayer[tank].g_sFallVoicelineReward2, g_esCache[tank].g_sFallVoicelineReward2, g_esCache[tank].g_sFallVoicelineReward2); - vGetSubSettingValue(bAccess, true, g_esCache[tank].g_sFallVoicelineReward3, sizeof esCache::g_sFallVoicelineReward3, g_esSpecial[iType].g_sFallVoicelineReward3, g_esTank[iType].g_sFallVoicelineReward3, g_esSpecific.g_sFallVoicelineReward3, g_esGeneral.g_sFallVoicelineReward3); - vGetSubSettingValue(bAccess, bHuman, g_esCache[tank].g_sFallVoicelineReward3, sizeof esCache::g_sFallVoicelineReward3, g_esTeammate[tank].g_sFallVoicelineReward3, g_esPlayer[tank].g_sFallVoicelineReward3, g_esCache[tank].g_sFallVoicelineReward3, g_esCache[tank].g_sFallVoicelineReward3); - vGetSubSettingValue(bAccess, true, g_esCache[tank].g_sFallVoicelineReward4, sizeof esCache::g_sFallVoicelineReward4, g_esSpecial[iType].g_sFallVoicelineReward4, g_esTank[iType].g_sFallVoicelineReward4, g_esSpecific.g_sFallVoicelineReward4, g_esGeneral.g_sFallVoicelineReward4); - vGetSubSettingValue(bAccess, bHuman, g_esCache[tank].g_sFallVoicelineReward4, sizeof esCache::g_sFallVoicelineReward4, g_esTeammate[tank].g_sFallVoicelineReward4, g_esPlayer[tank].g_sFallVoicelineReward4, g_esCache[tank].g_sFallVoicelineReward4, g_esCache[tank].g_sFallVoicelineReward4); - vGetSubSettingValue(bAccess, bHuman, g_esCache[tank].g_sGlowColor, sizeof esCache::g_sGlowColor, g_esTeammate[tank].g_sGlowColor, g_esPlayer[tank].g_sGlowColor, g_esSpecial[iType].g_sGlowColor, g_esTank[iType].g_sGlowColor); - vGetSubSettingValue(bAccess, true, g_esCache[tank].g_sHealthCharacters, sizeof esCache::g_sHealthCharacters, g_esSpecial[iType].g_sHealthCharacters, g_esTank[iType].g_sHealthCharacters, g_esSpecific.g_sHealthCharacters, g_esGeneral.g_sHealthCharacters); - vGetSubSettingValue(bAccess, bHuman, g_esCache[tank].g_sHealthCharacters, sizeof esCache::g_sHealthCharacters, g_esTeammate[tank].g_sHealthCharacters, g_esPlayer[tank].g_sHealthCharacters, g_esCache[tank].g_sHealthCharacters, g_esCache[tank].g_sHealthCharacters); - vGetSubSettingValue(bAccess, true, g_esCache[tank].g_sItemReward, sizeof esCache::g_sItemReward, g_esSpecial[iType].g_sItemReward, g_esTank[iType].g_sItemReward, g_esSpecific.g_sItemReward, g_esGeneral.g_sItemReward); - vGetSubSettingValue(bAccess, bHuman, g_esCache[tank].g_sItemReward, sizeof esCache::g_sItemReward, g_esTeammate[tank].g_sItemReward, g_esPlayer[tank].g_sItemReward, g_esCache[tank].g_sItemReward, g_esCache[tank].g_sItemReward); - vGetSubSettingValue(bAccess, true, g_esCache[tank].g_sItemReward2, sizeof esCache::g_sItemReward2, g_esSpecial[iType].g_sItemReward2, g_esTank[iType].g_sItemReward2, g_esSpecific.g_sItemReward2, g_esGeneral.g_sItemReward2); - vGetSubSettingValue(bAccess, bHuman, g_esCache[tank].g_sItemReward2, sizeof esCache::g_sItemReward2, g_esTeammate[tank].g_sItemReward2, g_esPlayer[tank].g_sItemReward2, g_esCache[tank].g_sItemReward2, g_esCache[tank].g_sItemReward2); - vGetSubSettingValue(bAccess, true, g_esCache[tank].g_sItemReward3, sizeof esCache::g_sItemReward3, g_esSpecial[iType].g_sItemReward3, g_esTank[iType].g_sItemReward3, g_esSpecific.g_sItemReward3, g_esGeneral.g_sItemReward3); - vGetSubSettingValue(bAccess, bHuman, g_esCache[tank].g_sItemReward3, sizeof esCache::g_sItemReward3, g_esTeammate[tank].g_sItemReward3, g_esPlayer[tank].g_sItemReward3, g_esCache[tank].g_sItemReward3, g_esCache[tank].g_sItemReward3); - vGetSubSettingValue(bAccess, true, g_esCache[tank].g_sItemReward4, sizeof esCache::g_sItemReward4, g_esSpecial[iType].g_sItemReward4, g_esTank[iType].g_sItemReward4, g_esSpecific.g_sItemReward4, g_esGeneral.g_sItemReward4); - vGetSubSettingValue(bAccess, bHuman, g_esCache[tank].g_sItemReward4, sizeof esCache::g_sItemReward4, g_esTeammate[tank].g_sItemReward4, g_esPlayer[tank].g_sItemReward4, g_esCache[tank].g_sItemReward4, g_esCache[tank].g_sItemReward4); - vGetSubSettingValue(bAccess, true, g_esCache[tank].g_sLightColorVisual, sizeof esCache::g_sLightColorVisual, g_esSpecial[iType].g_sLightColorVisual, g_esTank[iType].g_sLightColorVisual, g_esSpecific.g_sLightColorVisual, g_esGeneral.g_sLightColorVisual); - vGetSubSettingValue(bAccess, bHuman, g_esCache[tank].g_sLightColorVisual, sizeof esCache::g_sLightColorVisual, g_esTeammate[tank].g_sLightColorVisual, g_esPlayer[tank].g_sLightColorVisual, g_esCache[tank].g_sLightColorVisual, g_esCache[tank].g_sLightColorVisual); - vGetSubSettingValue(bAccess, true, g_esCache[tank].g_sLightColorVisual2, sizeof esCache::g_sLightColorVisual2, g_esSpecial[iType].g_sLightColorVisual2, g_esTank[iType].g_sLightColorVisual2, g_esSpecific.g_sLightColorVisual2, g_esGeneral.g_sLightColorVisual2); - vGetSubSettingValue(bAccess, bHuman, g_esCache[tank].g_sLightColorVisual2, sizeof esCache::g_sLightColorVisual2, g_esTeammate[tank].g_sLightColorVisual2, g_esPlayer[tank].g_sLightColorVisual2, g_esCache[tank].g_sLightColorVisual2, g_esCache[tank].g_sLightColorVisual2); - vGetSubSettingValue(bAccess, true, g_esCache[tank].g_sLightColorVisual3, sizeof esCache::g_sLightColorVisual3, g_esSpecial[iType].g_sLightColorVisual3, g_esTank[iType].g_sLightColorVisual3, g_esSpecific.g_sLightColorVisual3, g_esGeneral.g_sLightColorVisual3); - vGetSubSettingValue(bAccess, bHuman, g_esCache[tank].g_sLightColorVisual3, sizeof esCache::g_sLightColorVisual3, g_esTeammate[tank].g_sLightColorVisual3, g_esPlayer[tank].g_sLightColorVisual3, g_esCache[tank].g_sLightColorVisual3, g_esCache[tank].g_sLightColorVisual3); - vGetSubSettingValue(bAccess, true, g_esCache[tank].g_sLightColorVisual4, sizeof esCache::g_sLightColorVisual4, g_esSpecial[iType].g_sLightColorVisual4, g_esTank[iType].g_sLightColorVisual4, g_esSpecific.g_sLightColorVisual4, g_esGeneral.g_sLightColorVisual4); - vGetSubSettingValue(bAccess, bHuman, g_esCache[tank].g_sLightColorVisual4, sizeof esCache::g_sLightColorVisual4, g_esTeammate[tank].g_sLightColorVisual4, g_esPlayer[tank].g_sLightColorVisual4, g_esCache[tank].g_sLightColorVisual4, g_esCache[tank].g_sLightColorVisual4); - vGetSubSettingValue(bAccess, true, g_esCache[tank].g_sLoopingVoicelineVisual, sizeof esCache::g_sLoopingVoicelineVisual, g_esSpecial[iType].g_sLoopingVoicelineVisual, g_esTank[iType].g_sLoopingVoicelineVisual, g_esSpecific.g_sLoopingVoicelineVisual, g_esGeneral.g_sLoopingVoicelineVisual); - vGetSubSettingValue(bAccess, bHuman, g_esCache[tank].g_sLoopingVoicelineVisual, sizeof esCache::g_sLoopingVoicelineVisual, g_esTeammate[tank].g_sLoopingVoicelineVisual, g_esPlayer[tank].g_sLoopingVoicelineVisual, g_esCache[tank].g_sLoopingVoicelineVisual, g_esCache[tank].g_sLoopingVoicelineVisual); - vGetSubSettingValue(bAccess, true, g_esCache[tank].g_sLoopingVoicelineVisual2, sizeof esCache::g_sLoopingVoicelineVisual2, g_esSpecial[iType].g_sLoopingVoicelineVisual2, g_esTank[iType].g_sLoopingVoicelineVisual2, g_esSpecific.g_sLoopingVoicelineVisual2, g_esGeneral.g_sLoopingVoicelineVisual2); - vGetSubSettingValue(bAccess, bHuman, g_esCache[tank].g_sLoopingVoicelineVisual2, sizeof esCache::g_sLoopingVoicelineVisual2, g_esTeammate[tank].g_sLoopingVoicelineVisual2, g_esPlayer[tank].g_sLoopingVoicelineVisual2, g_esCache[tank].g_sLoopingVoicelineVisual2, g_esCache[tank].g_sLoopingVoicelineVisual2); - vGetSubSettingValue(bAccess, true, g_esCache[tank].g_sLoopingVoicelineVisual3, sizeof esCache::g_sLoopingVoicelineVisual3, g_esSpecial[iType].g_sLoopingVoicelineVisual3, g_esTank[iType].g_sLoopingVoicelineVisual3, g_esSpecific.g_sLoopingVoicelineVisual3, g_esGeneral.g_sLoopingVoicelineVisual3); - vGetSubSettingValue(bAccess, bHuman, g_esCache[tank].g_sLoopingVoicelineVisual3, sizeof esCache::g_sLoopingVoicelineVisual3, g_esTeammate[tank].g_sLoopingVoicelineVisual3, g_esPlayer[tank].g_sLoopingVoicelineVisual3, g_esCache[tank].g_sLoopingVoicelineVisual3, g_esCache[tank].g_sLoopingVoicelineVisual3); - vGetSubSettingValue(bAccess, true, g_esCache[tank].g_sLoopingVoicelineVisual4, sizeof esCache::g_sLoopingVoicelineVisual4, g_esSpecial[iType].g_sLoopingVoicelineVisual4, g_esTank[iType].g_sLoopingVoicelineVisual4, g_esSpecific.g_sLoopingVoicelineVisual4, g_esGeneral.g_sLoopingVoicelineVisual4); - vGetSubSettingValue(bAccess, bHuman, g_esCache[tank].g_sLoopingVoicelineVisual4, sizeof esCache::g_sLoopingVoicelineVisual4, g_esTeammate[tank].g_sLoopingVoicelineVisual4, g_esPlayer[tank].g_sLoopingVoicelineVisual4, g_esCache[tank].g_sLoopingVoicelineVisual4, g_esCache[tank].g_sLoopingVoicelineVisual4); - vGetSubSettingValue(bAccess, true, g_esCache[tank].g_sOutlineColorVisual, sizeof esCache::g_sOutlineColorVisual, g_esSpecial[iType].g_sOutlineColorVisual, g_esTank[iType].g_sOutlineColorVisual, g_esSpecific.g_sOutlineColorVisual, g_esGeneral.g_sOutlineColorVisual); - vGetSubSettingValue(bAccess, bHuman, g_esCache[tank].g_sOutlineColorVisual, sizeof esCache::g_sOutlineColorVisual, g_esTeammate[tank].g_sOutlineColorVisual, g_esPlayer[tank].g_sOutlineColorVisual, g_esCache[tank].g_sOutlineColorVisual, g_esCache[tank].g_sOutlineColorVisual); - vGetSubSettingValue(bAccess, true, g_esCache[tank].g_sOutlineColorVisual2, sizeof esCache::g_sOutlineColorVisual2, g_esSpecial[iType].g_sOutlineColorVisual2, g_esTank[iType].g_sOutlineColorVisual2, g_esSpecific.g_sOutlineColorVisual2, g_esGeneral.g_sOutlineColorVisual2); - vGetSubSettingValue(bAccess, bHuman, g_esCache[tank].g_sOutlineColorVisual2, sizeof esCache::g_sOutlineColorVisual2, g_esTeammate[tank].g_sOutlineColorVisual2, g_esPlayer[tank].g_sOutlineColorVisual2, g_esCache[tank].g_sOutlineColorVisual2, g_esCache[tank].g_sOutlineColorVisual2); - vGetSubSettingValue(bAccess, true, g_esCache[tank].g_sOutlineColorVisual3, sizeof esCache::g_sOutlineColorVisual3, g_esSpecial[iType].g_sOutlineColorVisual3, g_esTank[iType].g_sOutlineColorVisual3, g_esSpecific.g_sOutlineColorVisual3, g_esGeneral.g_sOutlineColorVisual3); - vGetSubSettingValue(bAccess, bHuman, g_esCache[tank].g_sOutlineColorVisual3, sizeof esCache::g_sOutlineColorVisual3, g_esTeammate[tank].g_sOutlineColorVisual3, g_esPlayer[tank].g_sOutlineColorVisual3, g_esCache[tank].g_sOutlineColorVisual3, g_esCache[tank].g_sOutlineColorVisual3); - vGetSubSettingValue(bAccess, true, g_esCache[tank].g_sOutlineColorVisual4, sizeof esCache::g_sOutlineColorVisual4, g_esSpecial[iType].g_sOutlineColorVisual4, g_esTank[iType].g_sOutlineColorVisual4, g_esSpecific.g_sOutlineColorVisual4, g_esGeneral.g_sOutlineColorVisual4); - vGetSubSettingValue(bAccess, bHuman, g_esCache[tank].g_sOutlineColorVisual4, sizeof esCache::g_sOutlineColorVisual4, g_esTeammate[tank].g_sOutlineColorVisual4, g_esPlayer[tank].g_sOutlineColorVisual4, g_esCache[tank].g_sOutlineColorVisual4, g_esCache[tank].g_sOutlineColorVisual4); - vGetSubSettingValue(bAccess, bHuman, g_esCache[tank].g_sRockColor, sizeof esCache::g_sRockColor, g_esTeammate[tank].g_sRockColor, g_esPlayer[tank].g_sRockColor, g_esSpecial[iType].g_sRockColor, g_esTank[iType].g_sRockColor); - vGetSubSettingValue(bAccess, true, g_esCache[tank].g_sScreenColorVisual, sizeof esCache::g_sScreenColorVisual, g_esSpecial[iType].g_sScreenColorVisual, g_esTank[iType].g_sScreenColorVisual, g_esSpecific.g_sScreenColorVisual, g_esGeneral.g_sScreenColorVisual); - vGetSubSettingValue(bAccess, bHuman, g_esCache[tank].g_sScreenColorVisual, sizeof esCache::g_sScreenColorVisual, g_esTeammate[tank].g_sScreenColorVisual, g_esPlayer[tank].g_sScreenColorVisual, g_esCache[tank].g_sScreenColorVisual, g_esCache[tank].g_sScreenColorVisual); - vGetSubSettingValue(bAccess, true, g_esCache[tank].g_sScreenColorVisual2, sizeof esCache::g_sScreenColorVisual2, g_esSpecial[iType].g_sScreenColorVisual2, g_esTank[iType].g_sScreenColorVisual2, g_esSpecific.g_sScreenColorVisual2, g_esGeneral.g_sScreenColorVisual2); - vGetSubSettingValue(bAccess, bHuman, g_esCache[tank].g_sScreenColorVisual2, sizeof esCache::g_sScreenColorVisual2, g_esTeammate[tank].g_sScreenColorVisual2, g_esPlayer[tank].g_sScreenColorVisual2, g_esCache[tank].g_sScreenColorVisual2, g_esCache[tank].g_sScreenColorVisual2); - vGetSubSettingValue(bAccess, true, g_esCache[tank].g_sScreenColorVisual3, sizeof esCache::g_sScreenColorVisual3, g_esSpecial[iType].g_sScreenColorVisual3, g_esTank[iType].g_sScreenColorVisual3, g_esSpecific.g_sScreenColorVisual3, g_esGeneral.g_sScreenColorVisual3); - vGetSubSettingValue(bAccess, bHuman, g_esCache[tank].g_sScreenColorVisual3, sizeof esCache::g_sScreenColorVisual3, g_esTeammate[tank].g_sScreenColorVisual3, g_esPlayer[tank].g_sScreenColorVisual3, g_esCache[tank].g_sScreenColorVisual3, g_esCache[tank].g_sScreenColorVisual3); - vGetSubSettingValue(bAccess, true, g_esCache[tank].g_sScreenColorVisual4, sizeof esCache::g_sScreenColorVisual4, g_esSpecial[iType].g_sScreenColorVisual4, g_esTank[iType].g_sScreenColorVisual4, g_esSpecific.g_sScreenColorVisual4, g_esGeneral.g_sScreenColorVisual4); - vGetSubSettingValue(bAccess, bHuman, g_esCache[tank].g_sScreenColorVisual4, sizeof esCache::g_sScreenColorVisual4, g_esTeammate[tank].g_sScreenColorVisual4, g_esPlayer[tank].g_sScreenColorVisual4, g_esCache[tank].g_sScreenColorVisual4, g_esCache[tank].g_sScreenColorVisual4); - vGetSubSettingValue(bAccess, bHuman, g_esCache[tank].g_sSkinColor, sizeof esCache::g_sSkinColor, g_esTeammate[tank].g_sSkinColor, g_esPlayer[tank].g_sSkinColor, g_esSpecial[iType].g_sSkinColor, g_esTank[iType].g_sSkinColor); - vGetSettingValue(bAccess, bHuman, g_esCache[tank].g_sSmokerName, sizeof esCache::g_sSmokerName, g_esTeammate[tank].g_sSmokerName, g_esSpecial[iType].g_sSmokerName); - vGetSettingValue(bAccess, bHuman, g_esCache[tank].g_sBoomerName, sizeof esCache::g_sBoomerName, g_esTeammate[tank].g_sBoomerName, g_esSpecial[iType].g_sBoomerName); - vGetSettingValue(bAccess, bHuman, g_esCache[tank].g_sHunterName, sizeof esCache::g_sHunterName, g_esTeammate[tank].g_sHunterName, g_esSpecial[iType].g_sHunterName); - vGetSettingValue(bAccess, bHuman, g_esCache[tank].g_sSpitterName, sizeof esCache::g_sSpitterName, g_esTeammate[tank].g_sSpitterName, g_esSpecial[iType].g_sSpitterName); - vGetSettingValue(bAccess, bHuman, g_esCache[tank].g_sJockeyName, sizeof esCache::g_sJockeyName, g_esTeammate[tank].g_sJockeyName, g_esSpecial[iType].g_sJockeyName); - vGetSettingValue(bAccess, bHuman, g_esCache[tank].g_sChargerName, sizeof esCache::g_sChargerName, g_esTeammate[tank].g_sChargerName, g_esSpecial[iType].g_sChargerName); - - for (int iPos = 0; iPos < (sizeof esCache::g_iTransformType); iPos++) - { - g_esCache[tank].g_iTransformType[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iTransformType[iPos], g_esPlayer[tank].g_iTransformType[iPos], g_esSpecial[iType].g_iTransformType[iPos], g_esTank[iType].g_iTransformType[iPos], 1); - - if (iPos < (sizeof esCache::g_iRewardEnabled)) - { - g_esCache[tank].g_flActionDurationReward[iPos] = flGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_flActionDurationReward[iPos], g_esTank[iType].g_flActionDurationReward[iPos], g_esSpecific.g_flActionDurationReward[iPos], g_esGeneral.g_flActionDurationReward[iPos], 1); - g_esCache[tank].g_flActionDurationReward[iPos] = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flActionDurationReward[iPos], g_esPlayer[tank].g_flActionDurationReward[iPos], g_esCache[tank].g_flActionDurationReward[iPos], g_esCache[tank].g_flActionDurationReward[iPos], 1); - g_esCache[tank].g_iAmmoBoostReward[iPos] = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iAmmoBoostReward[iPos], g_esTank[iType].g_iAmmoBoostReward[iPos], g_esSpecific.g_iAmmoBoostReward[iPos], g_esGeneral.g_iAmmoBoostReward[iPos], 1); - g_esCache[tank].g_iAmmoBoostReward[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iAmmoBoostReward[iPos], g_esPlayer[tank].g_iAmmoBoostReward[iPos], g_esCache[tank].g_iAmmoBoostReward[iPos], g_esCache[tank].g_iAmmoBoostReward[iPos], 1); - g_esCache[tank].g_iAmmoRegenReward[iPos] = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iAmmoRegenReward[iPos], g_esTank[iType].g_iAmmoRegenReward[iPos], g_esSpecific.g_iAmmoRegenReward[iPos], g_esGeneral.g_iAmmoRegenReward[iPos], 1); - g_esCache[tank].g_iAmmoRegenReward[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iAmmoRegenReward[iPos], g_esPlayer[tank].g_iAmmoRegenReward[iPos], g_esCache[tank].g_iAmmoRegenReward[iPos], g_esCache[tank].g_iAmmoRegenReward[iPos], 1); - g_esCache[tank].g_flAttackBoostReward[iPos] = flGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_flAttackBoostReward[iPos], g_esTank[iType].g_flAttackBoostReward[iPos], g_esSpecific.g_flAttackBoostReward[iPos], g_esGeneral.g_flAttackBoostReward[iPos], 1); - g_esCache[tank].g_flAttackBoostReward[iPos] = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flAttackBoostReward[iPos], g_esPlayer[tank].g_flAttackBoostReward[iPos], g_esCache[tank].g_flAttackBoostReward[iPos], g_esCache[tank].g_flAttackBoostReward[iPos], 1); - g_esCache[tank].g_iBlazeHealthReward[iPos] = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iBlazeHealthReward[iPos], g_esTank[iType].g_iBlazeHealthReward[iPos], g_esSpecific.g_iBlazeHealthReward[iPos], g_esGeneral.g_iBlazeHealthReward[iPos], 1); - g_esCache[tank].g_iBlazeHealthReward[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iBlazeHealthReward[iPos], g_esPlayer[tank].g_iBlazeHealthReward[iPos], g_esCache[tank].g_iBlazeHealthReward[iPos], g_esCache[tank].g_iBlazeHealthReward[iPos], 1); - g_esCache[tank].g_iBunnyHopReward[iPos] = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iBunnyHopReward[iPos], g_esTank[iType].g_iBunnyHopReward[iPos], g_esSpecific.g_iBunnyHopReward[iPos], g_esGeneral.g_iBunnyHopReward[iPos], 1); - g_esCache[tank].g_iBunnyHopReward[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iBunnyHopReward[iPos], g_esPlayer[tank].g_iBunnyHopReward[iPos], g_esCache[tank].g_iBunnyHopReward[iPos], g_esCache[tank].g_iBunnyHopReward[iPos], 1); - g_esCache[tank].g_iBurstDoorsReward[iPos] = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iBurstDoorsReward[iPos], g_esTank[iType].g_iBurstDoorsReward[iPos], g_esSpecific.g_iBurstDoorsReward[iPos], g_esGeneral.g_iBurstDoorsReward[iPos], 1); - g_esCache[tank].g_iBurstDoorsReward[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iBurstDoorsReward[iPos], g_esPlayer[tank].g_iBurstDoorsReward[iPos], g_esCache[tank].g_iBurstDoorsReward[iPos], g_esCache[tank].g_iBurstDoorsReward[iPos], 1); - g_esCache[tank].g_iCleanKillsReward[iPos] = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iCleanKillsReward[iPos], g_esTank[iType].g_iCleanKillsReward[iPos], g_esSpecific.g_iCleanKillsReward[iPos], g_esGeneral.g_iCleanKillsReward[iPos], 1); - g_esCache[tank].g_iCleanKillsReward[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iCleanKillsReward[iPos], g_esPlayer[tank].g_iCleanKillsReward[iPos], g_esCache[tank].g_iCleanKillsReward[iPos], g_esCache[tank].g_iCleanKillsReward[iPos], 1); - g_esCache[tank].g_iClusterBombsReward[iPos] = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iClusterBombsReward[iPos], g_esTank[iType].g_iClusterBombsReward[iPos], g_esSpecific.g_iClusterBombsReward[iPos], g_esGeneral.g_iClusterBombsReward[iPos], 1); - g_esCache[tank].g_iClusterBombsReward[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iClusterBombsReward[iPos], g_esPlayer[tank].g_iClusterBombsReward[iPos], g_esCache[tank].g_iClusterBombsReward[iPos], g_esCache[tank].g_iClusterBombsReward[iPos], 1); - g_esCache[tank].g_flDamageBoostReward[iPos] = flGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_flDamageBoostReward[iPos], g_esTank[iType].g_flDamageBoostReward[iPos], g_esSpecific.g_flDamageBoostReward[iPos], g_esGeneral.g_flDamageBoostReward[iPos], 1); - g_esCache[tank].g_flDamageBoostReward[iPos] = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flDamageBoostReward[iPos], g_esPlayer[tank].g_flDamageBoostReward[iPos], g_esCache[tank].g_flDamageBoostReward[iPos], g_esCache[tank].g_flDamageBoostReward[iPos], 1); - g_esCache[tank].g_flDamageResistanceReward[iPos] = flGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_flDamageResistanceReward[iPos], g_esTank[iType].g_flDamageResistanceReward[iPos], g_esSpecific.g_flDamageResistanceReward[iPos], g_esGeneral.g_flDamageResistanceReward[iPos], 1); - g_esCache[tank].g_flDamageResistanceReward[iPos] = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flDamageResistanceReward[iPos], g_esPlayer[tank].g_flDamageResistanceReward[iPos], g_esCache[tank].g_flDamageResistanceReward[iPos], g_esCache[tank].g_flDamageResistanceReward[iPos], 1); - g_esCache[tank].g_iFriendlyFireReward[iPos] = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iFriendlyFireReward[iPos], g_esTank[iType].g_iFriendlyFireReward[iPos], g_esSpecific.g_iFriendlyFireReward[iPos], g_esGeneral.g_iFriendlyFireReward[iPos], 1); - g_esCache[tank].g_iFriendlyFireReward[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iFriendlyFireReward[iPos], g_esPlayer[tank].g_iFriendlyFireReward[iPos], g_esCache[tank].g_iFriendlyFireReward[iPos], g_esCache[tank].g_iFriendlyFireReward[iPos], 1); - g_esCache[tank].g_iGhostBulletsReward[iPos] = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iGhostBulletsReward[iPos], g_esTank[iType].g_iGhostBulletsReward[iPos], g_esSpecific.g_iGhostBulletsReward[iPos], g_esGeneral.g_iGhostBulletsReward[iPos], 1); - g_esCache[tank].g_iGhostBulletsReward[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iGhostBulletsReward[iPos], g_esPlayer[tank].g_iGhostBulletsReward[iPos], g_esCache[tank].g_iGhostBulletsReward[iPos], g_esCache[tank].g_iGhostBulletsReward[iPos], 1); - g_esCache[tank].g_flHealPercentReward[iPos] = flGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_flHealPercentReward[iPos], g_esTank[iType].g_flHealPercentReward[iPos], g_esSpecific.g_flHealPercentReward[iPos], g_esGeneral.g_flHealPercentReward[iPos], 1); - g_esCache[tank].g_flHealPercentReward[iPos] = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flHealPercentReward[iPos], g_esPlayer[tank].g_flHealPercentReward[iPos], g_esCache[tank].g_flHealPercentReward[iPos], g_esCache[tank].g_flHealPercentReward[iPos], 1); - g_esCache[tank].g_iHealthRegenReward[iPos] = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iHealthRegenReward[iPos], g_esTank[iType].g_iHealthRegenReward[iPos], g_esSpecific.g_iHealthRegenReward[iPos], g_esGeneral.g_iHealthRegenReward[iPos], 1); - g_esCache[tank].g_iHealthRegenReward[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iHealthRegenReward[iPos], g_esPlayer[tank].g_iHealthRegenReward[iPos], g_esCache[tank].g_iHealthRegenReward[iPos], g_esCache[tank].g_iHealthRegenReward[iPos], 1); - g_esCache[tank].g_iHollowpointAmmoReward[iPos] = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iHollowpointAmmoReward[iPos], g_esTank[iType].g_iHollowpointAmmoReward[iPos], g_esSpecific.g_iHollowpointAmmoReward[iPos], g_esGeneral.g_iHollowpointAmmoReward[iPos], 1); - g_esCache[tank].g_iHollowpointAmmoReward[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iHollowpointAmmoReward[iPos], g_esPlayer[tank].g_iHollowpointAmmoReward[iPos], g_esCache[tank].g_iHollowpointAmmoReward[iPos], g_esCache[tank].g_iHollowpointAmmoReward[iPos], 1); - g_esCache[tank].g_flJumpHeightReward[iPos] = flGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_flJumpHeightReward[iPos], g_esTank[iType].g_flJumpHeightReward[iPos], g_esSpecific.g_flJumpHeightReward[iPos], g_esGeneral.g_flJumpHeightReward[iPos], 1); - g_esCache[tank].g_flJumpHeightReward[iPos] = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flJumpHeightReward[iPos], g_esPlayer[tank].g_flJumpHeightReward[iPos], g_esCache[tank].g_flJumpHeightReward[iPos], g_esCache[tank].g_flJumpHeightReward[iPos], 1); - g_esCache[tank].g_iInextinguishableFireReward[iPos] = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iInextinguishableFireReward[iPos], g_esTank[iType].g_iInextinguishableFireReward[iPos], g_esSpecific.g_iInextinguishableFireReward[iPos], g_esGeneral.g_iInextinguishableFireReward[iPos], 1); - g_esCache[tank].g_iInextinguishableFireReward[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iInextinguishableFireReward[iPos], g_esPlayer[tank].g_iInextinguishableFireReward[iPos], g_esCache[tank].g_iInextinguishableFireReward[iPos], g_esCache[tank].g_iInextinguishableFireReward[iPos], 1); - g_esCache[tank].g_iInfiniteAmmoReward[iPos] = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iInfiniteAmmoReward[iPos], g_esTank[iType].g_iInfiniteAmmoReward[iPos], g_esSpecific.g_iInfiniteAmmoReward[iPos], g_esGeneral.g_iInfiniteAmmoReward[iPos], 1); - g_esCache[tank].g_iInfiniteAmmoReward[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iInfiniteAmmoReward[iPos], g_esPlayer[tank].g_iInfiniteAmmoReward[iPos], g_esCache[tank].g_iInfiniteAmmoReward[iPos], g_esCache[tank].g_iInfiniteAmmoReward[iPos], 1); - g_esCache[tank].g_iLadderActionsReward[iPos] = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iLadderActionsReward[iPos], g_esTank[iType].g_iLadderActionsReward[iPos], g_esSpecific.g_iLadderActionsReward[iPos], g_esGeneral.g_iLadderActionsReward[iPos], 1); - g_esCache[tank].g_iLadderActionsReward[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iLadderActionsReward[iPos], g_esPlayer[tank].g_iLadderActionsReward[iPos], g_esCache[tank].g_iLadderActionsReward[iPos], g_esCache[tank].g_iLadderActionsReward[iPos], 1); - g_esCache[tank].g_iLadyKillerReward[iPos] = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iLadyKillerReward[iPos], g_esTank[iType].g_iLadyKillerReward[iPos], g_esSpecific.g_iLadyKillerReward[iPos], g_esGeneral.g_iLadyKillerReward[iPos], 1); - g_esCache[tank].g_iLadyKillerReward[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iLadyKillerReward[iPos], g_esPlayer[tank].g_iLadyKillerReward[iPos], g_esCache[tank].g_iLadyKillerReward[iPos], g_esCache[tank].g_iLadyKillerReward[iPos], 1); - g_esCache[tank].g_iLaserSightReward[iPos] = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iLaserSightReward[iPos], g_esTank[iType].g_iLaserSightReward[iPos], g_esSpecific.g_iLaserSightReward[iPos], g_esGeneral.g_iLaserSightReward[iPos], 1); - g_esCache[tank].g_iLaserSightReward[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iLaserSightReward[iPos], g_esPlayer[tank].g_iLaserSightReward[iPos], g_esCache[tank].g_iLaserSightReward[iPos], g_esCache[tank].g_iLaserSightReward[iPos], 1); - g_esCache[tank].g_iLifeLeechReward[iPos] = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iLifeLeechReward[iPos], g_esTank[iType].g_iLifeLeechReward[iPos], g_esSpecific.g_iLifeLeechReward[iPos], g_esGeneral.g_iLifeLeechReward[iPos], 1); - g_esCache[tank].g_iLifeLeechReward[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iLifeLeechReward[iPos], g_esPlayer[tank].g_iLifeLeechReward[iPos], g_esCache[tank].g_iLifeLeechReward[iPos], g_esCache[tank].g_iLifeLeechReward[iPos], 1); - g_esCache[tank].g_flLoopingVoicelineInterval[iPos] = flGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_flLoopingVoicelineInterval[iPos], g_esTank[iType].g_flLoopingVoicelineInterval[iPos], g_esSpecific.g_flLoopingVoicelineInterval[iPos], g_esGeneral.g_flLoopingVoicelineInterval[iPos], 1); - g_esCache[tank].g_flLoopingVoicelineInterval[iPos] = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flLoopingVoicelineInterval[iPos], g_esPlayer[tank].g_flLoopingVoicelineInterval[iPos], g_esCache[tank].g_flLoopingVoicelineInterval[iPos], g_esCache[tank].g_flLoopingVoicelineInterval[iPos], 1); - g_esCache[tank].g_iMedicalCutsReward[iPos] = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iMedicalCutsReward[iPos], g_esTank[iType].g_iMedicalCutsReward[iPos], g_esSpecific.g_iMedicalCutsReward[iPos], g_esGeneral.g_iMedicalCutsReward[iPos], 1); - g_esCache[tank].g_iMedicalCutsReward[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iMedicalCutsReward[iPos], g_esPlayer[tank].g_iMedicalCutsReward[iPos], g_esCache[tank].g_iMedicalCutsReward[iPos], g_esCache[tank].g_iMedicalCutsReward[iPos], 1); - g_esCache[tank].g_iMeleeRangeReward[iPos] = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iMeleeRangeReward[iPos], g_esTank[iType].g_iMeleeRangeReward[iPos], g_esSpecific.g_iMeleeRangeReward[iPos], g_esGeneral.g_iMeleeRangeReward[iPos], 1); - g_esCache[tank].g_iMeleeRangeReward[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iMeleeRangeReward[iPos], g_esPlayer[tank].g_iMeleeRangeReward[iPos], g_esCache[tank].g_iMeleeRangeReward[iPos], g_esCache[tank].g_iMeleeRangeReward[iPos], 1); - g_esCache[tank].g_iMidairDashesReward[iPos] = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iMidairDashesReward[iPos], g_esTank[iType].g_iMidairDashesReward[iPos], g_esSpecific.g_iMidairDashesReward[iPos], g_esGeneral.g_iMidairDashesReward[iPos], 1); - g_esCache[tank].g_iMidairDashesReward[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iMidairDashesReward[iPos], g_esPlayer[tank].g_iMidairDashesReward[iPos], g_esCache[tank].g_iMidairDashesReward[iPos], g_esCache[tank].g_iMidairDashesReward[iPos], 1); - g_esCache[tank].g_iParticleEffectVisual[iPos] = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iParticleEffectVisual[iPos], g_esTank[iType].g_iParticleEffectVisual[iPos], g_esSpecific.g_iParticleEffectVisual[iPos], g_esGeneral.g_iParticleEffectVisual[iPos], 1); - g_esCache[tank].g_iParticleEffectVisual[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iParticleEffectVisual[iPos], g_esPlayer[tank].g_iParticleEffectVisual[iPos], g_esCache[tank].g_iParticleEffectVisual[iPos], g_esCache[tank].g_iParticleEffectVisual[iPos], 1); - g_esCache[tank].g_flPipeBombDurationReward[iPos] = flGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_flPipeBombDurationReward[iPos], g_esTank[iType].g_flPipeBombDurationReward[iPos], g_esSpecific.g_flPipeBombDurationReward[iPos], g_esGeneral.g_flPipeBombDurationReward[iPos], 1); - g_esCache[tank].g_flPipeBombDurationReward[iPos] = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flPipeBombDurationReward[iPos], g_esPlayer[tank].g_flPipeBombDurationReward[iPos], g_esCache[tank].g_flPipeBombDurationReward[iPos], g_esCache[tank].g_flPipeBombDurationReward[iPos], 1); - g_esCache[tank].g_iPrefsNotify[iPos] = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iPrefsNotify[iPos], g_esTank[iType].g_iPrefsNotify[iPos], g_esSpecific.g_iPrefsNotify[iPos], g_esGeneral.g_iPrefsNotify[iPos], 1); - g_esCache[tank].g_iPrefsNotify[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iPrefsNotify[iPos], g_esPlayer[tank].g_iPrefsNotify[iPos], g_esCache[tank].g_iPrefsNotify[iPos], g_esCache[tank].g_iPrefsNotify[iPos], 1); - g_esCache[tank].g_flPunchResistanceReward[iPos] = flGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_flPunchResistanceReward[iPos], g_esTank[iType].g_flPunchResistanceReward[iPos], g_esSpecific.g_flPunchResistanceReward[iPos], g_esGeneral.g_flPunchResistanceReward[iPos], 1); - g_esCache[tank].g_flPunchResistanceReward[iPos] = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flPunchResistanceReward[iPos], g_esPlayer[tank].g_flPunchResistanceReward[iPos], g_esCache[tank].g_flPunchResistanceReward[iPos], g_esCache[tank].g_flPunchResistanceReward[iPos], 1); - g_esCache[tank].g_flRapidPistolReward[iPos] = flGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_flRapidPistolReward[iPos], g_esTank[iType].g_flRapidPistolReward[iPos], g_esSpecific.g_flRapidPistolReward[iPos], g_esGeneral.g_flRapidPistolReward[iPos], 1); - g_esCache[tank].g_flRapidPistolReward[iPos] = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flRapidPistolReward[iPos], g_esPlayer[tank].g_flRapidPistolReward[iPos], g_esCache[tank].g_flRapidPistolReward[iPos], g_esCache[tank].g_flRapidPistolReward[iPos], 1); - g_esCache[tank].g_iRecoilDampenerReward[iPos] = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iRecoilDampenerReward[iPos], g_esTank[iType].g_iRecoilDampenerReward[iPos], g_esSpecific.g_iRecoilDampenerReward[iPos], g_esGeneral.g_iRecoilDampenerReward[iPos], 1); - g_esCache[tank].g_iRecoilDampenerReward[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iRecoilDampenerReward[iPos], g_esPlayer[tank].g_iRecoilDampenerReward[iPos], g_esCache[tank].g_iRecoilDampenerReward[iPos], g_esCache[tank].g_iRecoilDampenerReward[iPos], 1); - g_esCache[tank].g_flRefillPercentReward[iPos] = flGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_flRefillPercentReward[iPos], g_esTank[iType].g_flRefillPercentReward[iPos], g_esSpecific.g_flRefillPercentReward[iPos], g_esGeneral.g_flRefillPercentReward[iPos], 1); - g_esCache[tank].g_flRefillPercentReward[iPos] = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flRefillPercentReward[iPos], g_esPlayer[tank].g_flRefillPercentReward[iPos], g_esCache[tank].g_flRefillPercentReward[iPos], g_esCache[tank].g_flRefillPercentReward[iPos], 1); - g_esCache[tank].g_iRegenBurstsReward[iPos] = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iRegenBurstsReward[iPos], g_esTank[iType].g_iRegenBurstsReward[iPos], g_esSpecific.g_iRegenBurstsReward[iPos], g_esGeneral.g_iRegenBurstsReward[iPos], 1); - g_esCache[tank].g_iRegenBurstsReward[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iRegenBurstsReward[iPos], g_esPlayer[tank].g_iRegenBurstsReward[iPos], g_esCache[tank].g_iRegenBurstsReward[iPos], g_esCache[tank].g_iRegenBurstsReward[iPos], 1); - g_esCache[tank].g_iRespawnLoadoutReward[iPos] = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iRespawnLoadoutReward[iPos], g_esTank[iType].g_iRespawnLoadoutReward[iPos], g_esSpecific.g_iRespawnLoadoutReward[iPos], g_esGeneral.g_iRespawnLoadoutReward[iPos], 1); - g_esCache[tank].g_iRespawnLoadoutReward[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iRespawnLoadoutReward[iPos], g_esPlayer[tank].g_iRespawnLoadoutReward[iPos], g_esCache[tank].g_iRespawnLoadoutReward[iPos], g_esCache[tank].g_iRespawnLoadoutReward[iPos], 1); - g_esCache[tank].g_iReviveHealthReward[iPos] = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iReviveHealthReward[iPos], g_esTank[iType].g_iReviveHealthReward[iPos], g_esSpecific.g_iReviveHealthReward[iPos], g_esGeneral.g_iReviveHealthReward[iPos], 1); - g_esCache[tank].g_iReviveHealthReward[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iReviveHealthReward[iPos], g_esPlayer[tank].g_iReviveHealthReward[iPos], g_esCache[tank].g_iReviveHealthReward[iPos], g_esCache[tank].g_iReviveHealthReward[iPos], 1); - g_esCache[tank].g_iRewardBots[iPos] = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iRewardBots[iPos], g_esTank[iType].g_iRewardBots[iPos], g_esSpecific.g_iRewardBots[iPos], g_esGeneral.g_iRewardBots[iPos], 1, -1); - g_esCache[tank].g_iRewardBots[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iRewardBots[iPos], g_esPlayer[tank].g_iRewardBots[iPos], g_esCache[tank].g_iRewardBots[iPos], g_esCache[tank].g_iRewardBots[iPos], 1, -1); - g_esCache[tank].g_flRewardChance[iPos] = flGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_flRewardChance[iPos], g_esTank[iType].g_flRewardChance[iPos], g_esSpecific.g_flRewardChance[iPos], g_esGeneral.g_flRewardChance[iPos], 1); - g_esCache[tank].g_flRewardChance[iPos] = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flRewardChance[iPos], g_esPlayer[tank].g_flRewardChance[iPos], g_esCache[tank].g_flRewardChance[iPos], g_esCache[tank].g_flRewardChance[iPos], 1); - g_esCache[tank].g_flRewardDuration[iPos] = flGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_flRewardDuration[iPos], g_esTank[iType].g_flRewardDuration[iPos], g_esSpecific.g_flRewardDuration[iPos], g_esGeneral.g_flRewardDuration[iPos], 1); - g_esCache[tank].g_flRewardDuration[iPos] = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flRewardDuration[iPos], g_esPlayer[tank].g_flRewardDuration[iPos], g_esCache[tank].g_flRewardDuration[iPos], g_esCache[tank].g_flRewardDuration[iPos], 1); - g_esCache[tank].g_iRewardEffect[iPos] = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iRewardEffect[iPos], g_esTank[iType].g_iRewardEffect[iPos], g_esSpecific.g_iRewardEffect[iPos], g_esGeneral.g_iRewardEffect[iPos], 1); - g_esCache[tank].g_iRewardEffect[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iRewardEffect[iPos], g_esPlayer[tank].g_iRewardEffect[iPos], g_esCache[tank].g_iRewardEffect[iPos], g_esCache[tank].g_iRewardEffect[iPos], 1); - g_esCache[tank].g_iRewardEnabled[iPos] = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iRewardEnabled[iPos], g_esTank[iType].g_iRewardEnabled[iPos], g_esSpecific.g_iRewardEnabled[iPos], g_esGeneral.g_iRewardEnabled[iPos], 1, -1); - g_esCache[tank].g_iRewardEnabled[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iRewardEnabled[iPos], g_esPlayer[tank].g_iRewardEnabled[iPos], g_esCache[tank].g_iRewardEnabled[iPos], g_esCache[tank].g_iRewardEnabled[iPos], 1, -1); - g_esCache[tank].g_iRewardNotify[iPos] = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iRewardNotify[iPos], g_esTank[iType].g_iRewardNotify[iPos], g_esSpecific.g_iRewardNotify[iPos], g_esGeneral.g_iRewardNotify[iPos], 1); - g_esCache[tank].g_iRewardNotify[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iRewardNotify[iPos], g_esPlayer[tank].g_iRewardNotify[iPos], g_esCache[tank].g_iRewardNotify[iPos], g_esCache[tank].g_iRewardNotify[iPos], 1); - g_esCache[tank].g_flRewardPercentage[iPos] = flGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_flRewardPercentage[iPos], g_esTank[iType].g_flRewardPercentage[iPos], g_esSpecific.g_flRewardPercentage[iPos], g_esGeneral.g_flRewardPercentage[iPos], 1); - g_esCache[tank].g_flRewardPercentage[iPos] = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flRewardPercentage[iPos], g_esPlayer[tank].g_flRewardPercentage[iPos], g_esCache[tank].g_flRewardPercentage[iPos], g_esCache[tank].g_flRewardPercentage[iPos], 1); - g_esCache[tank].g_iRewardVisual[iPos] = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iRewardVisual[iPos], g_esTank[iType].g_iRewardVisual[iPos], g_esSpecific.g_iRewardVisual[iPos], g_esGeneral.g_iRewardVisual[iPos], 1); - g_esCache[tank].g_iRewardVisual[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iRewardVisual[iPos], g_esPlayer[tank].g_iRewardVisual[iPos], g_esCache[tank].g_iRewardVisual[iPos], g_esCache[tank].g_iRewardVisual[iPos], 1); - g_esCache[tank].g_iShareRewards[iPos] = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iShareRewards[iPos], g_esTank[iType].g_iShareRewards[iPos], g_esSpecific.g_iShareRewards[iPos], g_esGeneral.g_iShareRewards[iPos], 1); - g_esCache[tank].g_iShareRewards[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iShareRewards[iPos], g_esPlayer[tank].g_iShareRewards[iPos], g_esCache[tank].g_iShareRewards[iPos], g_esCache[tank].g_iShareRewards[iPos], 1); - g_esCache[tank].g_flShoveDamageReward[iPos] = flGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_flShoveDamageReward[iPos], g_esTank[iType].g_flShoveDamageReward[iPos], g_esSpecific.g_flShoveDamageReward[iPos], g_esGeneral.g_flShoveDamageReward[iPos], 1); - g_esCache[tank].g_flShoveDamageReward[iPos] = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flShoveDamageReward[iPos], g_esPlayer[tank].g_flShoveDamageReward[iPos], g_esCache[tank].g_flShoveDamageReward[iPos], g_esCache[tank].g_flShoveDamageReward[iPos], 1); - g_esCache[tank].g_iShovePenaltyReward[iPos] = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iShovePenaltyReward[iPos], g_esTank[iType].g_iShovePenaltyReward[iPos], g_esSpecific.g_iShovePenaltyReward[iPos], g_esGeneral.g_iShovePenaltyReward[iPos], 1); - g_esCache[tank].g_iShovePenaltyReward[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iShovePenaltyReward[iPos], g_esPlayer[tank].g_iShovePenaltyReward[iPos], g_esCache[tank].g_iShovePenaltyReward[iPos], g_esCache[tank].g_iShovePenaltyReward[iPos], 1); - g_esCache[tank].g_flShoveRateReward[iPos] = flGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_flShoveRateReward[iPos], g_esTank[iType].g_flShoveRateReward[iPos], g_esSpecific.g_flShoveRateReward[iPos], g_esGeneral.g_flShoveRateReward[iPos], 1); - g_esCache[tank].g_flShoveRateReward[iPos] = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flShoveRateReward[iPos], g_esPlayer[tank].g_flShoveRateReward[iPos], g_esCache[tank].g_flShoveRateReward[iPos], g_esCache[tank].g_flShoveRateReward[iPos], 1); - g_esCache[tank].g_iSledgehammerRoundsReward[iPos] = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iSledgehammerRoundsReward[iPos], g_esTank[iType].g_iSledgehammerRoundsReward[iPos], g_esSpecific.g_iSledgehammerRoundsReward[iPos], g_esGeneral.g_iSledgehammerRoundsReward[iPos], 1); - g_esCache[tank].g_iSledgehammerRoundsReward[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iSledgehammerRoundsReward[iPos], g_esPlayer[tank].g_iSledgehammerRoundsReward[iPos], g_esCache[tank].g_iSledgehammerRoundsReward[iPos], g_esCache[tank].g_iSledgehammerRoundsReward[iPos], 1); - g_esCache[tank].g_iSpecialAmmoReward[iPos] = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iSpecialAmmoReward[iPos], g_esTank[iType].g_iSpecialAmmoReward[iPos], g_esSpecific.g_iSpecialAmmoReward[iPos], g_esGeneral.g_iSpecialAmmoReward[iPos], 1); - g_esCache[tank].g_iSpecialAmmoReward[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iSpecialAmmoReward[iPos], g_esPlayer[tank].g_iSpecialAmmoReward[iPos], g_esCache[tank].g_iSpecialAmmoReward[iPos], g_esCache[tank].g_iSpecialAmmoReward[iPos], 1); - g_esCache[tank].g_flSpeedBoostReward[iPos] = flGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_flSpeedBoostReward[iPos], g_esTank[iType].g_flSpeedBoostReward[iPos], g_esSpecific.g_flSpeedBoostReward[iPos], g_esGeneral.g_flSpeedBoostReward[iPos], 1); - g_esCache[tank].g_flSpeedBoostReward[iPos] = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flSpeedBoostReward[iPos], g_esPlayer[tank].g_flSpeedBoostReward[iPos], g_esCache[tank].g_flSpeedBoostReward[iPos], g_esCache[tank].g_flSpeedBoostReward[iPos], 1); - g_esCache[tank].g_iStackRewards[iPos] = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iStackRewards[iPos], g_esTank[iType].g_iStackRewards[iPos], g_esSpecific.g_iStackRewards[iPos], g_esGeneral.g_iStackRewards[iPos], 1); - g_esCache[tank].g_iStackRewards[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iStackRewards[iPos], g_esPlayer[tank].g_iStackRewards[iPos], g_esCache[tank].g_iStackRewards[iPos], g_esCache[tank].g_iStackRewards[iPos], 1); - g_esCache[tank].g_iStickyGrenadesReward[iPos] = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iStickyGrenadesReward[iPos], g_esTank[iType].g_iStickyGrenadesReward[iPos], g_esSpecific.g_iStickyGrenadesReward[iPos], g_esGeneral.g_iStickyGrenadesReward[iPos], 1); - g_esCache[tank].g_iStickyGrenadesReward[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iStickyGrenadesReward[iPos], g_esPlayer[tank].g_iStickyGrenadesReward[iPos], g_esCache[tank].g_iStickyGrenadesReward[iPos], g_esCache[tank].g_iStickyGrenadesReward[iPos], 1); - g_esCache[tank].g_iSyringeDartsReward[iPos] = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iSyringeDartsReward[iPos], g_esTank[iType].g_iSyringeDartsReward[iPos], g_esSpecific.g_iSyringeDartsReward[iPos], g_esGeneral.g_iSyringeDartsReward[iPos], 1); - g_esCache[tank].g_iSyringeDartsReward[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iSyringeDartsReward[iPos], g_esPlayer[tank].g_iSyringeDartsReward[iPos], g_esCache[tank].g_iSyringeDartsReward[iPos], g_esCache[tank].g_iSyringeDartsReward[iPos], 1); - g_esCache[tank].g_iThornsReward[iPos] = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iThornsReward[iPos], g_esTank[iType].g_iThornsReward[iPos], g_esSpecific.g_iThornsReward[iPos], g_esGeneral.g_iThornsReward[iPos], 1); - g_esCache[tank].g_iThornsReward[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iThornsReward[iPos], g_esPlayer[tank].g_iThornsReward[iPos], g_esCache[tank].g_iThornsReward[iPos], g_esCache[tank].g_iThornsReward[iPos], 1); - g_esCache[tank].g_iUsefulRewards[iPos] = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iUsefulRewards[iPos], g_esTank[iType].g_iUsefulRewards[iPos], g_esSpecific.g_iUsefulRewards[iPos], g_esGeneral.g_iUsefulRewards[iPos], 1); - g_esCache[tank].g_iUsefulRewards[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iUsefulRewards[iPos], g_esPlayer[tank].g_iUsefulRewards[iPos], g_esCache[tank].g_iUsefulRewards[iPos], g_esCache[tank].g_iUsefulRewards[iPos], 1); - g_esCache[tank].g_iVoicePitchVisual[iPos] = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iVoicePitchVisual[iPos], g_esTank[iType].g_iVoicePitchVisual[iPos], g_esSpecific.g_iVoicePitchVisual[iPos], g_esGeneral.g_iVoicePitchVisual[iPos], 1); - g_esCache[tank].g_iVoicePitchVisual[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iVoicePitchVisual[iPos], g_esPlayer[tank].g_iVoicePitchVisual[iPos], g_esCache[tank].g_iVoicePitchVisual[iPos], g_esCache[tank].g_iVoicePitchVisual[iPos], 1); - } - - if (iPos < (sizeof esCache::g_iStackLimits)) - { - g_esCache[tank].g_iStackLimits[iPos] = iGetSubSettingValue(bAccess, true, g_esSpecial[iType].g_iStackLimits[iPos], g_esTank[iType].g_iStackLimits[iPos], g_esSpecific.g_iStackLimits[iPos], g_esGeneral.g_iStackLimits[iPos], 1); - g_esCache[tank].g_iStackLimits[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iStackLimits[iPos], g_esPlayer[tank].g_iStackLimits[iPos], g_esCache[tank].g_iStackLimits[iPos], g_esCache[tank].g_iStackLimits[iPos], 1); - } - - if (iPos < (sizeof esCache::g_flComboChance)) - { - g_esCache[tank].g_flComboChance[iPos] = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flComboChance[iPos], g_esPlayer[tank].g_flComboChance[iPos], g_esSpecial[iType].g_flComboChance[iPos], g_esTank[iType].g_flComboChance[iPos], 1); - g_esCache[tank].g_iComboCooldown[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iComboCooldown[iPos], g_esPlayer[tank].g_iComboCooldown[iPos], g_esSpecial[iType].g_iComboCooldown[iPos], g_esTank[iType].g_iComboCooldown[iPos], 1); - g_esCache[tank].g_flComboDamage[iPos] = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flComboDamage[iPos], g_esPlayer[tank].g_flComboDamage[iPos], g_esSpecial[iType].g_flComboDamage[iPos], g_esTank[iType].g_flComboDamage[iPos], 1); - g_esCache[tank].g_flComboDeathChance[iPos] = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flComboDeathChance[iPos], g_esPlayer[tank].g_flComboDeathChance[iPos], g_esSpecial[iType].g_flComboDeathChance[iPos], g_esTank[iType].g_flComboDeathChance[iPos], 1); - g_esCache[tank].g_flComboDeathRange[iPos] = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flComboDeathRange[iPos], g_esPlayer[tank].g_flComboDeathRange[iPos], g_esSpecial[iType].g_flComboDeathRange[iPos], g_esTank[iType].g_flComboDeathRange[iPos], 1); - g_esCache[tank].g_flComboDelay[iPos] = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flComboDelay[iPos], g_esPlayer[tank].g_flComboDelay[iPos], g_esSpecial[iType].g_flComboDelay[iPos], g_esTank[iType].g_flComboDelay[iPos], 1); - g_esCache[tank].g_flComboDuration[iPos] = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flComboDuration[iPos], g_esPlayer[tank].g_flComboDuration[iPos], g_esSpecial[iType].g_flComboDuration[iPos], g_esTank[iType].g_flComboDuration[iPos], 1); - g_esCache[tank].g_flComboInterval[iPos] = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flComboInterval[iPos], g_esPlayer[tank].g_flComboInterval[iPos], g_esSpecial[iType].g_flComboInterval[iPos], g_esTank[iType].g_flComboInterval[iPos], 1); - g_esCache[tank].g_flComboMinRadius[iPos] = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flComboMinRadius[iPos], g_esPlayer[tank].g_flComboMinRadius[iPos], g_esSpecial[iType].g_flComboMinRadius[iPos], g_esTank[iType].g_flComboMinRadius[iPos], 2, 1.0); - g_esCache[tank].g_flComboMaxRadius[iPos] = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flComboMaxRadius[iPos], g_esPlayer[tank].g_flComboMaxRadius[iPos], g_esSpecial[iType].g_flComboMaxRadius[iPos], g_esTank[iType].g_flComboMaxRadius[iPos], 2, -1.0); - g_esCache[tank].g_flComboRange[iPos] = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flComboRange[iPos], g_esPlayer[tank].g_flComboRange[iPos], g_esSpecial[iType].g_flComboRange[iPos], g_esTank[iType].g_flComboRange[iPos], 1); - g_esCache[tank].g_flComboRangeChance[iPos] = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flComboRangeChance[iPos], g_esPlayer[tank].g_flComboRangeChance[iPos], g_esSpecial[iType].g_flComboRangeChance[iPos], g_esTank[iType].g_flComboRangeChance[iPos], 1); - g_esCache[tank].g_iComboRangeCooldown[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iComboRangeCooldown[iPos], g_esPlayer[tank].g_iComboRangeCooldown[iPos], g_esSpecial[iType].g_iComboRangeCooldown[iPos], g_esTank[iType].g_iComboRangeCooldown[iPos], 1); - g_esCache[tank].g_flComboRockChance[iPos] = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flComboRockChance[iPos], g_esPlayer[tank].g_flComboRockChance[iPos], g_esSpecial[iType].g_flComboRockChance[iPos], g_esTank[iType].g_flComboRockChance[iPos], 1); - g_esCache[tank].g_iComboRockCooldown[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iComboRockCooldown[iPos], g_esPlayer[tank].g_iComboRockCooldown[iPos], g_esSpecial[iType].g_iComboRockCooldown[iPos], g_esTank[iType].g_iComboRockCooldown[iPos], 1); - g_esCache[tank].g_flComboSpeed[iPos] = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flComboSpeed[iPos], g_esPlayer[tank].g_flComboSpeed[iPos], g_esSpecial[iType].g_flComboSpeed[iPos], g_esTank[iType].g_flComboSpeed[iPos], 1); - } - - if (iPos < (sizeof esCache::g_flComboTypeChance)) - { - g_esCache[tank].g_flComboTypeChance[iPos] = flGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_flComboTypeChance[iPos], g_esPlayer[tank].g_flComboTypeChance[iPos], g_esSpecial[iType].g_flComboTypeChance[iPos], g_esTank[iType].g_flComboTypeChance[iPos], 1); - } - - if (iPos < (sizeof esCache::g_iSkinColor)) - { - g_esCache[tank].g_iSkinColor[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iSkinColor[iPos], g_esPlayer[tank].g_iSkinColor[iPos], g_esSpecial[iType].g_iSkinColor[iPos], g_esTank[iType].g_iSkinColor[iPos], 1); - g_esCache[tank].g_iBossHealth[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iBossHealth[iPos], g_esPlayer[tank].g_iBossHealth[iPos], g_esSpecial[iType].g_iBossHealth[iPos], g_esTank[iType].g_iBossHealth[iPos], 1); - g_esCache[tank].g_iBossType[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iBossType[iPos], g_esPlayer[tank].g_iBossType[iPos], g_esSpecial[iType].g_iBossType[iPos], g_esTank[iType].g_iBossType[iPos], 1); - g_esCache[tank].g_iRockColor[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iRockColor[iPos], g_esPlayer[tank].g_iRockColor[iPos], g_esSpecial[iType].g_iRockColor[iPos], g_esTank[iType].g_iRockColor[iPos], 1); - } - - if (iPos < (sizeof esCache::g_iGlowColor)) - { - g_esCache[tank].g_iGlowColor[iPos] = iGetSubSettingValue(bAccess, bHuman, g_esTeammate[tank].g_iGlowColor[iPos], g_esPlayer[tank].g_iGlowColor[iPos], g_esSpecial[iType].g_iGlowColor[iPos], g_esTank[iType].g_iGlowColor[iPos], 1); - } - } +void vCacheSurvivorSettings(int survivor) +{ + bool bValid = bIsValidClient(survivor), bHuman = bIsValidClient(survivor, MT_CHECK_FAKECLIENT); + int iType = g_esShooter[survivor].g_iCharacterType[0]; + + if (bIsSurvivor(survivor, MT_CHECK_INDEX|MT_CHECK_INGAME) && iType >= 0) + { + g_esSurvivorCache[survivor].g_iCarrierBots = iGetSettingValue(bValid, true, g_esSurvivor[iType].g_iCarrierBots, g_esHuman.g_iCarrierBots, 1); + g_esSurvivorCache[survivor].g_iCarrierBots = iGetSettingValue(bValid, bHuman, g_esShooter[survivor].g_iCarrierBots, g_esSurvivorCache[survivor].g_iCarrierBots, 1); + g_esSurvivorCache[survivor].g_iCarrierEnabled = iGetSettingValue(bValid, true, g_esSurvivor[iType].g_iCarrierEnabled, g_esHuman.g_iCarrierEnabled, 1); + g_esSurvivorCache[survivor].g_iCarrierEnabled = iGetSettingValue(bValid, bHuman, g_esShooter[survivor].g_iCarrierEnabled, g_esSurvivorCache[survivor].g_iCarrierEnabled, 1); + + int iEnabled = (bHuman ? g_esSurvivorCache[survivor].g_iCarrierEnabled : g_esSurvivorCache[survivor].g_iCarrierBots); + if (iEnabled > 0) + { + g_esSurvivorCache[survivor].g_flCarrierChance = flGetSettingValue(bValid, true, g_esSurvivor[iType].g_flCarrierChance, g_esHuman.g_flCarrierChance, 1); + g_esSurvivorCache[survivor].g_flCarrierChance = flGetSettingValue(bValid, bHuman, g_esShooter[survivor].g_flCarrierChance, g_esSurvivorCache[survivor].g_flCarrierChance, 1); + g_esSurvivorCache[survivor].g_flCarrierDamageMultiplier = flGetSettingValue(bValid, true, g_esSurvivor[iType].g_flCarrierDamageMultiplier, g_esHuman.g_flCarrierDamageMultiplier, 1); + g_esSurvivorCache[survivor].g_flCarrierDamageMultiplier = flGetSettingValue(bValid, bHuman, g_esShooter[survivor].g_flCarrierDamageMultiplier, g_esSurvivorCache[survivor].g_flCarrierDamageMultiplier, 1); + g_esSurvivorCache[survivor].g_flCarrierDelay = flGetSettingValue(bValid, true, g_esSurvivor[iType].g_flCarrierDelay, g_esHuman.g_flCarrierDelay, 1); + g_esSurvivorCache[survivor].g_flCarrierDelay = flGetSettingValue(bValid, bHuman, g_esShooter[survivor].g_flCarrierDelay, g_esSurvivorCache[survivor].g_flCarrierDelay, 1); + g_esSurvivorCache[survivor].g_flCarrierHealthMultiplier = flGetSettingValue(bValid, true, g_esSurvivor[iType].g_flCarrierHealthMultiplier, g_esHuman.g_flCarrierHealthMultiplier, 1); + g_esSurvivorCache[survivor].g_flCarrierHealthMultiplier = flGetSettingValue(bValid, bHuman, g_esShooter[survivor].g_flCarrierHealthMultiplier, g_esSurvivorCache[survivor].g_flCarrierHealthMultiplier, 1); + g_esSurvivorCache[survivor].g_flCarrierVoiceChance = flGetSettingValue(bValid, true, g_esSurvivor[iType].g_flCarrierVoiceChance, g_esHuman.g_flCarrierVoiceChance, 1); + g_esSurvivorCache[survivor].g_flCarrierVoiceChance = flGetSettingValue(bValid, bHuman, g_esShooter[survivor].g_flCarrierVoiceChance, g_esSurvivorCache[survivor].g_flCarrierVoiceChance, 1); + g_esSurvivorCache[survivor].g_flCarrierVoiceInterval = flGetSettingValue(bValid, true, g_esSurvivor[iType].g_flCarrierVoiceInterval, g_esHuman.g_flCarrierVoiceInterval, 1); + g_esSurvivorCache[survivor].g_flCarrierVoiceInterval = flGetSettingValue(bValid, bHuman, g_esShooter[survivor].g_flCarrierVoiceInterval, g_esSurvivorCache[survivor].g_flCarrierVoiceInterval, 1); + g_esSurvivorCache[survivor].g_iCarrierBody = iGetSettingValue(bValid, true, g_esSurvivor[iType].g_iCarrierBody, g_esHuman.g_iCarrierBody, 1); + g_esSurvivorCache[survivor].g_iCarrierBody = iGetSettingValue(bValid, bHuman, g_esShooter[survivor].g_iCarrierBody, g_esSurvivorCache[survivor].g_iCarrierBody, 1); + g_esSurvivorCache[survivor].g_iCarrierCleanse = iGetSettingValue(bValid, true, g_esSurvivor[iType].g_iCarrierCleanse, g_esHuman.g_iCarrierCleanse, 1); + g_esSurvivorCache[survivor].g_iCarrierCleanse = iGetSettingValue(bValid, bHuman, g_esShooter[survivor].g_iCarrierCleanse, g_esSurvivorCache[survivor].g_iCarrierCleanse, 1); + g_esSurvivorCache[survivor].g_iCarrierFilter = iGetSettingValue(bValid, true, g_esSurvivor[iType].g_iCarrierFilter, g_esHuman.g_iCarrierFilter, 1); + g_esSurvivorCache[survivor].g_iCarrierFilter = iGetSettingValue(bValid, bHuman, g_esShooter[survivor].g_iCarrierFilter, g_esSurvivorCache[survivor].g_iCarrierFilter, 1); + g_esSurvivorCache[survivor].g_iCarrierInfection = iGetSettingValue(bValid, true, g_esSurvivor[iType].g_iCarrierInfection, g_esHuman.g_iCarrierInfection, 1); + g_esSurvivorCache[survivor].g_iCarrierInfection = iGetSettingValue(bValid, bHuman, g_esShooter[survivor].g_iCarrierInfection, g_esSurvivorCache[survivor].g_iCarrierInfection, 1); + g_esSurvivorCache[survivor].g_iCarrierMaxType = iGetSettingValue(bValid, true, g_esSurvivor[iType].g_iCarrierMaxType, g_esHuman.g_iCarrierMaxType, 1); + g_esSurvivorCache[survivor].g_iCarrierMaxType = iGetSettingValue(bValid, bHuman, g_esShooter[survivor].g_iCarrierMaxType, g_esSurvivorCache[survivor].g_iCarrierMaxType, 1); + g_esSurvivorCache[survivor].g_iCarrierMinType = iGetSettingValue(bValid, true, g_esSurvivor[iType].g_iCarrierMinType, g_esHuman.g_iCarrierMinType, 1); + g_esSurvivorCache[survivor].g_iCarrierMinType = iGetSettingValue(bValid, bHuman, g_esShooter[survivor].g_iCarrierMinType, g_esSurvivorCache[survivor].g_iCarrierMinType, 1); + g_esSurvivorCache[survivor].g_iCarrierMix = iGetSettingValue(bValid, true, g_esSurvivor[iType].g_iCarrierMix, g_esHuman.g_iCarrierMix, 1); + g_esSurvivorCache[survivor].g_iCarrierMix = iGetSettingValue(bValid, bHuman, g_esShooter[survivor].g_iCarrierMix, g_esSurvivorCache[survivor].g_iCarrierMix, 1); + g_esSurvivorCache[survivor].g_iCarrierMode = iGetSettingValue(bValid, true, g_esSurvivor[iType].g_iCarrierMode, g_esHuman.g_iCarrierMode, 1); + g_esSurvivorCache[survivor].g_iCarrierMode = iGetSettingValue(bValid, bHuman, g_esShooter[survivor].g_iCarrierMode, g_esSurvivorCache[survivor].g_iCarrierMode, 1); + g_esSurvivorCache[survivor].g_iCarrierTeleport = iGetSettingValue(bValid, true, g_esSurvivor[iType].g_iCarrierTeleport, g_esHuman.g_iCarrierTeleport, 1); + g_esSurvivorCache[survivor].g_iCarrierTeleport = iGetSettingValue(bValid, bHuman, g_esShooter[survivor].g_iCarrierTeleport, g_esSurvivorCache[survivor].g_iCarrierTeleport, 1); + g_esSurvivorCache[survivor].g_iCarrierVoice = iGetSettingValue(bValid, true, g_esSurvivor[iType].g_iCarrierVoice, g_esHuman.g_iCarrierVoice, 1); + g_esSurvivorCache[survivor].g_iCarrierVoice = iGetSettingValue(bValid, bHuman, g_esShooter[survivor].g_iCarrierVoice, g_esSurvivorCache[survivor].g_iCarrierVoice, 1); + + vGetSettingValue(bValid, true, g_esSurvivorCache[survivor].g_sCarrierAttackVoicelines, sizeof esSurvivorCache::g_sCarrierAttackVoicelines, g_esSurvivor[iType].g_sCarrierAttackVoicelines, g_esHuman.g_sCarrierAttackVoicelines); + vGetSettingValue(bValid, bHuman, g_esSurvivorCache[survivor].g_sCarrierAttackVoicelines, sizeof esSurvivorCache::g_sCarrierAttackVoicelines, g_esShooter[survivor].g_sCarrierAttackVoicelines, g_esSurvivorCache[survivor].g_sCarrierAttackVoicelines); + vGetSettingValue(bValid, true, g_esSurvivorCache[survivor].g_sCarrierBaitVoicelines, sizeof esSurvivorCache::g_sCarrierBaitVoicelines, g_esSurvivor[iType].g_sCarrierBaitVoicelines, g_esHuman.g_sCarrierBaitVoicelines); + vGetSettingValue(bValid, bHuman, g_esSurvivorCache[survivor].g_sCarrierBaitVoicelines, sizeof esSurvivorCache::g_sCarrierBaitVoicelines, g_esShooter[survivor].g_sCarrierBaitVoicelines, g_esSurvivorCache[survivor].g_sCarrierBaitVoicelines); } else { - g_esCache[tank].g_sBodyColorVisual[0] = '\0'; - g_esCache[tank].g_sBodyColorVisual2[0] = '\0'; - g_esCache[tank].g_sBodyColorVisual3[0] = '\0'; - g_esCache[tank].g_sBodyColorVisual4[0] = '\0'; - g_esCache[tank].g_sComboSet[0] = '\0'; - g_esCache[tank].g_sFallVoicelineReward[0] = '\0'; - g_esCache[tank].g_sFallVoicelineReward2[0] = '\0'; - g_esCache[tank].g_sFallVoicelineReward3[0] = '\0'; - g_esCache[tank].g_sFallVoicelineReward4[0] = '\0'; - g_esCache[tank].g_sGlowColor[0] = '\0'; - g_esCache[tank].g_sHealthCharacters[0] = '\0'; - g_esCache[tank].g_sItemReward[0] = '\0'; - g_esCache[tank].g_sLightColorVisual[0] = '\0'; - g_esCache[tank].g_sLightColorVisual2[0] = '\0'; - g_esCache[tank].g_sLightColorVisual3[0] = '\0'; - g_esCache[tank].g_sLightColorVisual4[0] = '\0'; - g_esCache[tank].g_sLoopingVoicelineVisual[0] = '\0'; - g_esCache[tank].g_sLoopingVoicelineVisual2[0] = '\0'; - g_esCache[tank].g_sLoopingVoicelineVisual3[0] = '\0'; - g_esCache[tank].g_sLoopingVoicelineVisual4[0] = '\0'; - g_esCache[tank].g_sOutlineColorVisual[0] = '\0'; - g_esCache[tank].g_sOutlineColorVisual2[0] = '\0'; - g_esCache[tank].g_sOutlineColorVisual3[0] = '\0'; - g_esCache[tank].g_sOutlineColorVisual4[0] = '\0'; - g_esCache[tank].g_sRockColor[0] = '\0'; - g_esCache[tank].g_sScreenColorVisual[0] = '\0'; - g_esCache[tank].g_sScreenColorVisual2[0] = '\0'; - g_esCache[tank].g_sScreenColorVisual3[0] = '\0'; - g_esCache[tank].g_sScreenColorVisual4[0] = '\0'; - g_esCache[tank].g_sSkinColor[0] = '\0'; - g_esCache[tank].g_sSmokerName[0] = '\0'; - g_esCache[tank].g_sBoomerName[0] = '\0'; - g_esCache[tank].g_sHunterName[0] = '\0'; - g_esCache[tank].g_sSpitterName[0] = '\0'; - g_esCache[tank].g_sJockeyName[0] = '\0'; - g_esCache[tank].g_sChargerName[0] = '\0'; - g_esCache[tank].g_flArmorDuration = 0.0; - g_esCache[tank].g_flArmorResistance = 0.0; - g_esCache[tank].g_flAttackInterval = 0.0; - g_esCache[tank].g_flBurnDuration = 0.0; - g_esCache[tank].g_flBurntSkin = -1.0; - g_esCache[tank].g_flClawDamage = -1.0; - g_esCache[tank].g_flHealPercentMultiplier = 1.0; - g_esCache[tank].g_flHittableDamage = -1.0; - g_esCache[tank].g_flIncapDamageMultiplier = 1.0; - g_esCache[tank].g_flMeleeHitValue = 0.0; - g_esCache[tank].g_flPinDamage = -1.0; - g_esCache[tank].g_flRandomDuration = 0.0; - g_esCache[tank].g_flRunSpeed = 0.0; - g_esCache[tank].g_flShieldDuration = 0.0; - g_esCache[tank].g_flShieldResistance = 0.0; - g_esCache[tank].g_flSpecialInterval = 0.0; - g_esCache[tank].g_flTransformDelay = 0.0; - g_esCache[tank].g_flTransformDuration = 0.0; - g_esCache[tank].g_iAnnounceArrival = 0; - g_esCache[tank].g_iAnnounceDeath = 0; - g_esCache[tank].g_iAnnounceKill = 0; - g_esCache[tank].g_iArrivalMessage = 0; - g_esCache[tank].g_iArrivalSound = 0; - g_esCache[tank].g_iBaseHealth = 0; - g_esCache[tank].g_iBodyEffects = 0; - g_esCache[tank].g_iBossEffects = 0; - g_esCache[tank].g_iBossStages = 0; - g_esCache[tank].g_iBulletImmunity = 0; - g_esCache[tank].g_iDeathDetails = 0; - g_esCache[tank].g_iDeathMessage = 0; - g_esCache[tank].g_iDeathRevert = 0; - g_esCache[tank].g_iDeathSound = 0; - g_esCache[tank].g_iDisplayHealth = 0; - g_esCache[tank].g_iDisplayHealthType = 0; - g_esCache[tank].g_iExplosiveImmunity = 0; - g_esCache[tank].g_iExtraHealth = 0; - g_esCache[tank].g_iFireImmunity = 0; - g_esCache[tank].g_iGlowEnabled = 0; - g_esCache[tank].g_iGlowFlashing = 0; - g_esCache[tank].g_iGlowMaxRange = 0; - g_esCache[tank].g_iGlowMinRange = 0; - g_esCache[tank].g_iGlowType = 0; - g_esCache[tank].g_iHittableImmunity = 0; - g_esCache[tank].g_iHumanMultiplierMode = 0; - g_esCache[tank].g_iIntangibleBody = 0; - g_esCache[tank].g_iKillMessage = 0; - g_esCache[tank].g_iMeleeHitMode = 0; - g_esCache[tank].g_iMeleeImmunity = 0; - g_esCache[tank].g_iMinimumHumans = 0; - g_esCache[tank].g_iMultiplyHealth = 0; - g_esCache[tank].g_iRandomSpecial = 0; - g_esCache[tank].g_iRockEffects = 0; - g_esCache[tank].g_iRockModel = 0; - g_esCache[tank].g_iSpawnProtection = 0; - g_esCache[tank].g_iSpawnType = 0; - g_esCache[tank].g_iSpecialModel = 0; - g_esCache[tank].g_iSpecialNote = 0; - g_esCache[tank].g_iThrowRock = 0; - g_esCache[tank].g_iVocalizeArrival = 0; - g_esCache[tank].g_iVocalizeDeath = 0; - g_esCache[tank].g_iVomitImmunity = 0; - - for (int iPos = 0; iPos < (sizeof esCache::g_iTransformType); iPos++) - { - g_esCache[tank].g_iTransformType[iPos] = 0; - - if (iPos < (sizeof esCache::g_iRewardEnabled)) - { - g_esCache[tank].g_flActionDurationReward[iPos] = 0.0; - g_esCache[tank].g_iAmmoBoostReward[iPos] = 0; - g_esCache[tank].g_iAmmoRegenReward[iPos] = 0; - g_esCache[tank].g_flAttackBoostReward[iPos] = 0.0; - g_esCache[tank].g_iBlazeHealthReward[iPos] = 0; - g_esCache[tank].g_iBunnyHopReward[iPos] = 0; - g_esCache[tank].g_iBurstDoorsReward[iPos] = 0; - g_esCache[tank].g_iCleanKillsReward[iPos] = 0; - g_esCache[tank].g_iClusterBombsReward[iPos] = 0; - g_esCache[tank].g_flDamageBoostReward[iPos] = 0.0; - g_esCache[tank].g_flDamageResistanceReward[iPos] = 0.0; - g_esCache[tank].g_iFriendlyFireReward[iPos] = 0; - g_esCache[tank].g_iGhostBulletsReward[iPos] = 0; - g_esCache[tank].g_flHealPercentReward[iPos] = 0.0; - g_esCache[tank].g_iHealthRegenReward[iPos] = 0; - g_esCache[tank].g_iHollowpointAmmoReward[iPos] = 0; - g_esCache[tank].g_flJumpHeightReward[iPos] = 0.0; - g_esCache[tank].g_iInextinguishableFireReward[iPos] = 0; - g_esCache[tank].g_iInfiniteAmmoReward[iPos] = 0; - g_esCache[tank].g_iLadderActionsReward[iPos] = 0; - g_esCache[tank].g_iLadyKillerReward[iPos] = 0; - g_esCache[tank].g_iLaserSightReward[iPos] = 0; - g_esCache[tank].g_iLifeLeechReward[iPos] = 0; - g_esCache[tank].g_flLoopingVoicelineInterval[iPos] = 0.0; - g_esCache[tank].g_iMedicalCutsReward[iPos] = 0; - g_esCache[tank].g_iMeleeRangeReward[iPos] = 0; - g_esCache[tank].g_iMidairDashesReward[iPos] = 0; - g_esCache[tank].g_iParticleEffectVisual[iPos] = 0; - g_esCache[tank].g_flPipeBombDurationReward[iPos] = 0.0; - g_esCache[tank].g_iPrefsNotify[iPos] = 0; - g_esCache[tank].g_flPunchResistanceReward[iPos] = 0.0; - g_esCache[tank].g_flRapidPistolReward[iPos] = 0.0; - g_esCache[tank].g_iRecoilDampenerReward[iPos] = 0; - g_esCache[tank].g_flRefillPercentReward[iPos] = 0.0; - g_esCache[tank].g_iRegenBurstsReward[iPos] = 0; - g_esCache[tank].g_iRespawnLoadoutReward[iPos] = 0; - g_esCache[tank].g_iReviveHealthReward[iPos] = 0; - g_esCache[tank].g_iRewardBots[iPos] = -1; - g_esCache[tank].g_flRewardChance[iPos] = 0.0; - g_esCache[tank].g_flRewardDuration[iPos] = 0.0; - g_esCache[tank].g_iRewardEffect[iPos] = 0; - g_esCache[tank].g_iRewardEnabled[iPos] = -1; - g_esCache[tank].g_iRewardNotify[iPos] = 0; - g_esCache[tank].g_flRewardPercentage[iPos] = 0.0; - g_esCache[tank].g_iRewardVisual[iPos] = 0; - g_esCache[tank].g_iShareRewards[iPos] = 0; - g_esCache[tank].g_flShoveDamageReward[iPos] = 0.0; - g_esCache[tank].g_iShovePenaltyReward[iPos] = 0; - g_esCache[tank].g_flShoveRateReward[iPos] = 0.0; - g_esCache[tank].g_iSledgehammerRoundsReward[iPos] = 0; - g_esCache[tank].g_iSpecialAmmoReward[iPos] = 0; - g_esCache[tank].g_flSpeedBoostReward[iPos] = 0.0; - g_esCache[tank].g_iStackRewards[iPos] = 0; - g_esCache[tank].g_iStickyGrenadesReward[iPos] = 0; - g_esCache[tank].g_iSyringeDartsReward[iPos] = 0; - g_esCache[tank].g_iThornsReward[iPos] = 0; - g_esCache[tank].g_iUsefulRewards[iPos] = 0; - g_esCache[tank].g_iVoicePitchVisual[iPos] = 0; - } - - if (iPos < (sizeof esCache::g_iStackLimits)) - { - g_esCache[tank].g_iStackLimits[iPos] = 0; - } - - if (iPos < (sizeof esCache::g_flComboChance)) - { - g_esCache[tank].g_flComboChance[iPos] = 0.0; - g_esCache[tank].g_iComboCooldown[iPos] = 0; - g_esCache[tank].g_flComboDamage[iPos] = 0.0; - g_esCache[tank].g_flComboDeathChance[iPos] = 0.0; - g_esCache[tank].g_flComboDeathRange[iPos] = 0.0; - g_esCache[tank].g_flComboDelay[iPos] = 0.0; - g_esCache[tank].g_flComboDuration[iPos] = 0.0; - g_esCache[tank].g_flComboInterval[iPos] = 0.0; - g_esCache[tank].g_flComboMinRadius[iPos] = 0.0; - g_esCache[tank].g_flComboMaxRadius[iPos] = 0.0; - g_esCache[tank].g_flComboRange[iPos] = 0.0; - g_esCache[tank].g_flComboRangeChance[iPos] = 0.0; - g_esCache[tank].g_iComboRangeCooldown[iPos] = 0; - g_esCache[tank].g_flComboRockChance[iPos] = 0.0; - g_esCache[tank].g_iComboRockCooldown[iPos] = 0; - g_esCache[tank].g_flComboSpeed[iPos] = 0.0; - } - - if (iPos < (sizeof esCache::g_flComboTypeChance)) - { - g_esCache[tank].g_flComboTypeChance[iPos] = 0.0; - } - - if (iPos < (sizeof esCache::g_iSkinColor)) - { - g_esCache[tank].g_iSkinColor[iPos] = 255; - g_esCache[tank].g_iBossHealth[iPos] = 0; - g_esCache[tank].g_iBossType[iPos] = 0; - g_esCache[tank].g_iRockColor[iPos] = 255; - } - - if (iPos < (sizeof esCache::g_iGlowColor)) - { - g_esCache[tank].g_iGlowColor[iPos] = 255; - } - } - } - } - else - { - g_esCache[tank].g_iTankEnabled = iGetSettingValue(bAccess, true, g_esTank[iType].g_iTankEnabled, g_esGeneral.g_iTankEnabled, 1); - if (g_esCache[tank].g_iTankEnabled == 1) - { - g_esCache[tank].g_flArmorDuration = flGetSettingValue(bAccess, true, g_esTank[iType].g_flArmorDuration, g_esGeneral.g_flArmorDuration, 1); - g_esCache[tank].g_flArmorDuration = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flArmorDuration, g_esCache[tank].g_flArmorDuration, 1); - g_esCache[tank].g_flArmorResistance = flGetSettingValue(bAccess, true, g_esTank[iType].g_flArmorResistance, g_esGeneral.g_flArmorResistance, 1); - g_esCache[tank].g_flArmorResistance = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flArmorResistance, g_esCache[tank].g_flArmorResistance, 1); - g_esCache[tank].g_flAttackInterval = flGetSettingValue(bAccess, true, g_esTank[iType].g_flAttackInterval, g_esGeneral.g_flAttackInterval, 1); - g_esCache[tank].g_flAttackInterval = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flAttackInterval, g_esCache[tank].g_flAttackInterval, 1); - g_esCache[tank].g_flBurnDuration = flGetSettingValue(bAccess, true, g_esTank[iType].g_flBurnDuration, g_esGeneral.g_flBurnDuration, 1); - g_esCache[tank].g_flBurnDuration = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flBurnDuration, g_esCache[tank].g_flBurnDuration, 1); - g_esCache[tank].g_flBurntSkin = flGetSettingValue(bAccess, true, g_esTank[iType].g_flBurntSkin, g_esGeneral.g_flBurntSkin, 1, -1.0); - g_esCache[tank].g_flBurntSkin = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flBurntSkin, g_esCache[tank].g_flBurntSkin, 1, -1.0); - g_esCache[tank].g_flClawDamage = flGetSettingValue(bAccess, true, g_esTank[iType].g_flClawDamage, g_esGeneral.g_flClawDamage, 1, -1.0); - g_esCache[tank].g_flClawDamage = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flClawDamage, g_esCache[tank].g_flClawDamage, 1, -1.0); - g_esCache[tank].g_flHealPercentMultiplier = flGetSettingValue(bAccess, true, g_esTank[iType].g_flHealPercentMultiplier, g_esGeneral.g_flHealPercentMultiplier, 1); - g_esCache[tank].g_flHealPercentMultiplier = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flHealPercentMultiplier, g_esCache[tank].g_flHealPercentMultiplier, 1); - g_esCache[tank].g_flHittableDamage = flGetSettingValue(bAccess, true, g_esTank[iType].g_flHittableDamage, g_esGeneral.g_flHittableDamage, 1, -1.0); - g_esCache[tank].g_flHittableDamage = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flHittableDamage, g_esCache[tank].g_flHittableDamage, 1, -1.0); - g_esCache[tank].g_flIncapDamageMultiplier = flGetSettingValue(bAccess, true, g_esTank[iType].g_flIncapDamageMultiplier, g_esGeneral.g_flIncapDamageMultiplier, 1); - g_esCache[tank].g_flIncapDamageMultiplier = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flIncapDamageMultiplier, g_esCache[tank].g_flIncapDamageMultiplier, 1); - g_esCache[tank].g_flMeleeHitValue = flGetSettingValue(bAccess, true, g_esTank[iType].g_flMeleeHitValue, g_esGeneral.g_flMeleeHitValue, 1); - g_esCache[tank].g_flMeleeHitValue = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flMeleeHitValue, g_esCache[tank].g_flMeleeHitValue, 1); - g_esCache[tank].g_flPunchForce = flGetSettingValue(bAccess, true, g_esTank[iType].g_flPunchForce, g_esGeneral.g_flPunchForce, 1, -1.0); - g_esCache[tank].g_flPunchForce = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flPunchForce, g_esCache[tank].g_flPunchForce, 1, -1.0); - g_esCache[tank].g_flPunchThrow = flGetSettingValue(bAccess, true, g_esTank[iType].g_flPunchThrow, g_esGeneral.g_flPunchThrow, 1); - g_esCache[tank].g_flPunchThrow = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flPunchThrow, g_esCache[tank].g_flPunchThrow, 1); - g_esCache[tank].g_flRandomDuration = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flRandomDuration, g_esTank[iType].g_flRandomDuration, 1); - g_esCache[tank].g_flRandomInterval = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flRandomInterval, g_esTank[iType].g_flRandomInterval, 1); - g_esCache[tank].g_flRockDamage = flGetSettingValue(bAccess, true, g_esTank[iType].g_flRockDamage, g_esGeneral.g_flRockDamage, 1, -1.0); - g_esCache[tank].g_flRockDamage = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flRockDamage, g_esCache[tank].g_flRockDamage, 1, -1.0); - g_esCache[tank].g_flRunSpeed = flGetSettingValue(bAccess, true, g_esTank[iType].g_flRunSpeed, g_esGeneral.g_flRunSpeed, 1); - g_esCache[tank].g_flRunSpeed = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flRunSpeed, g_esCache[tank].g_flRunSpeed, 1); - g_esCache[tank].g_flShieldDuration = flGetSettingValue(bAccess, true, g_esTank[iType].g_flShieldDuration, g_esGeneral.g_flShieldDuration, 1); - g_esCache[tank].g_flShieldDuration = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flShieldDuration, g_esCache[tank].g_flShieldDuration, 1); - g_esCache[tank].g_flShieldResistance = flGetSettingValue(bAccess, true, g_esTank[iType].g_flShieldResistance, g_esGeneral.g_flShieldResistance, 1); - g_esCache[tank].g_flShieldResistance = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flShieldResistance, g_esCache[tank].g_flShieldResistance, 1); - g_esCache[tank].g_flThrowForce = flGetSettingValue(bAccess, true, g_esTank[iType].g_flThrowForce, g_esGeneral.g_flThrowForce, 1); - g_esCache[tank].g_flThrowForce = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flThrowForce, g_esCache[tank].g_flThrowForce, 1); - g_esCache[tank].g_flThrowInterval = flGetSettingValue(bAccess, true, g_esTank[iType].g_flThrowInterval, g_esGeneral.g_flThrowInterval, 1); - g_esCache[tank].g_flThrowInterval = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flThrowInterval, g_esCache[tank].g_flThrowInterval, 1); - g_esCache[tank].g_flTransformDelay = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flTransformDelay, g_esTank[iType].g_flTransformDelay, 1); - g_esCache[tank].g_flTransformDuration = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flTransformDuration, g_esTank[iType].g_flTransformDuration, 1); - g_esCache[tank].g_iAnnounceArrival = iGetSettingValue(bAccess, true, g_esTank[iType].g_iAnnounceArrival, g_esGeneral.g_iAnnounceArrival, 1); - g_esCache[tank].g_iAnnounceArrival = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iAnnounceArrival, g_esCache[tank].g_iAnnounceArrival, 1); - g_esCache[tank].g_iAnnounceDeath = iGetSettingValue(bAccess, true, g_esTank[iType].g_iAnnounceDeath, g_esGeneral.g_iAnnounceDeath, 1); - g_esCache[tank].g_iAnnounceDeath = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iAnnounceDeath, g_esCache[tank].g_iAnnounceDeath, 1); - g_esCache[tank].g_iAnnounceKill = iGetSettingValue(bAccess, true, g_esTank[iType].g_iAnnounceKill, g_esGeneral.g_iAnnounceKill, 1); - g_esCache[tank].g_iAnnounceKill = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iAnnounceKill, g_esCache[tank].g_iAnnounceKill, 1); - g_esCache[tank].g_iArrivalMessage = iGetSettingValue(bAccess, true, g_esTank[iType].g_iArrivalMessage, g_esGeneral.g_iArrivalMessage, 1); - g_esCache[tank].g_iArrivalMessage = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iArrivalMessage, g_esCache[tank].g_iArrivalMessage, 1); - g_esCache[tank].g_iArrivalSound = iGetSettingValue(bAccess, true, g_esTank[iType].g_iArrivalSound, g_esGeneral.g_iArrivalSound, 1); - g_esCache[tank].g_iArrivalSound = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iArrivalSound, g_esCache[tank].g_iArrivalSound, 1); - g_esCache[tank].g_iAutoAggravate = iGetSettingValue(bAccess, true, g_esTank[iType].g_iAutoAggravate, g_esGeneral.g_iAutoAggravate, 1); - g_esCache[tank].g_iBaseHealth = iGetSettingValue(bAccess, true, g_esTank[iType].g_iBaseHealth, g_esGeneral.g_iBaseHealth, 1); - g_esCache[tank].g_iBaseHealth = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iBaseHealth, g_esCache[tank].g_iBaseHealth, 1); - g_esCache[tank].g_iBodyEffects = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iBodyEffects, g_esTank[iType].g_iBodyEffects, 1); - g_esCache[tank].g_iBossEffects = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iBossEffects, g_esTank[iType].g_iBossEffects, 1); - g_esCache[tank].g_iBossStages = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iBossStages, g_esTank[iType].g_iBossStages, 1); - g_esCache[tank].g_iBulletImmunity = iGetSettingValue(bAccess, true, g_esTank[iType].g_iBulletImmunity, g_esGeneral.g_iBulletImmunity, 1); - g_esCache[tank].g_iBulletImmunity = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iBulletImmunity, g_esCache[tank].g_iBulletImmunity, 1); - g_esCache[tank].g_iCheckAbilities = iGetSettingValue(bAccess, true, g_esTank[iType].g_iCheckAbilities, g_esGeneral.g_iCheckAbilities, 1); - g_esCache[tank].g_iCheckAbilities = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iCheckAbilities, g_esCache[tank].g_iCheckAbilities, 1); - g_esCache[tank].g_iDeathDetails = iGetSettingValue(bAccess, true, g_esTank[iType].g_iDeathDetails, g_esGeneral.g_iDeathDetails, 1); - g_esCache[tank].g_iDeathDetails = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iDeathDetails, g_esCache[tank].g_iDeathDetails, 1); - g_esCache[tank].g_iDeathMessage = iGetSettingValue(bAccess, true, g_esTank[iType].g_iDeathMessage, g_esGeneral.g_iDeathMessage, 1); - g_esCache[tank].g_iDeathMessage = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iDeathMessage, g_esCache[tank].g_iDeathMessage, 1); - g_esCache[tank].g_iDeathRevert = iGetSettingValue(bAccess, true, g_esTank[iType].g_iDeathRevert, g_esGeneral.g_iDeathRevert, 1); - g_esCache[tank].g_iDeathRevert = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iDeathRevert, g_esCache[tank].g_iDeathRevert, 1); - g_esCache[tank].g_iDeathSound = iGetSettingValue(bAccess, true, g_esTank[iType].g_iDeathSound, g_esGeneral.g_iDeathSound, 1); - g_esCache[tank].g_iDeathSound = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iDeathSound, g_esCache[tank].g_iDeathSound, 1); - g_esCache[tank].g_iDisplayHealth = iGetSettingValue(bAccess, true, g_esTank[iType].g_iDisplayHealth, g_esGeneral.g_iDisplayHealth, 1); - g_esCache[tank].g_iDisplayHealth = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iDisplayHealth, g_esCache[tank].g_iDisplayHealth, 1); - g_esCache[tank].g_iDisplayHealthType = iGetSettingValue(bAccess, true, g_esTank[iType].g_iDisplayHealthType, g_esGeneral.g_iDisplayHealthType, 1); - g_esCache[tank].g_iDisplayHealthType = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iDisplayHealthType, g_esCache[tank].g_iDisplayHealthType, 1); - g_esCache[tank].g_iExplosiveImmunity = iGetSettingValue(bAccess, true, g_esTank[iType].g_iExplosiveImmunity, g_esGeneral.g_iExplosiveImmunity, 1); - g_esCache[tank].g_iExplosiveImmunity = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iExplosiveImmunity, g_esCache[tank].g_iExplosiveImmunity, 1); - g_esCache[tank].g_iExtraHealth = iGetSettingValue(bAccess, true, g_esTank[iType].g_iExtraHealth, g_esGeneral.g_iExtraHealth, 2, -1); - g_esCache[tank].g_iExtraHealth = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iExtraHealth, g_esCache[tank].g_iExtraHealth, 2, -1); - g_esCache[tank].g_iFireImmunity = iGetSettingValue(bAccess, true, g_esTank[iType].g_iFireImmunity, g_esGeneral.g_iFireImmunity, 1); - g_esCache[tank].g_iFireImmunity = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iFireImmunity, g_esCache[tank].g_iFireImmunity, 1); - g_esCache[tank].g_iFootstepShake = iGetSettingValue(bAccess, true, g_esTank[iType].g_iFootstepShake, g_esGeneral.g_iFootstepShake, 1); - g_esCache[tank].g_iFootstepShake = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iFootstepShake, g_esCache[tank].g_iFootstepShake, 1); - g_esCache[tank].g_iGlowEnabled = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iGlowEnabled, g_esTank[iType].g_iGlowEnabled, 1); - g_esCache[tank].g_iGlowFlashing = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iGlowFlashing, g_esTank[iType].g_iGlowFlashing, 1); - g_esCache[tank].g_iGlowMaxRange = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iGlowMaxRange, g_esTank[iType].g_iGlowMaxRange, 1); - g_esCache[tank].g_iGlowMinRange = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iGlowMinRange, g_esTank[iType].g_iGlowMinRange, 1); - g_esCache[tank].g_iGlowType = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iGlowType, g_esTank[iType].g_iGlowType, 1); - g_esCache[tank].g_iGroundPound = iGetSettingValue(bAccess, true, g_esTank[iType].g_iGroundPound, g_esGeneral.g_iGroundPound, 1); - g_esCache[tank].g_iGroundPound = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iGroundPound, g_esCache[tank].g_iGroundPound, 1); - g_esCache[tank].g_iHittableImmunity = iGetSettingValue(bAccess, true, g_esTank[iType].g_iHittableImmunity, g_esGeneral.g_iHittableImmunity, 1); - g_esCache[tank].g_iHittableImmunity = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iHittableImmunity, g_esCache[tank].g_iHittableImmunity, 1); - g_esCache[tank].g_iHumanMultiplierMode = iGetSettingValue(bAccess, true, g_esTank[iType].g_iHumanMultiplierMode, g_esGeneral.g_iHumanMultiplierMode, 1); - g_esCache[tank].g_iHumanMultiplierMode = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iHumanMultiplierMode, g_esCache[tank].g_iHumanMultiplierMode, 1); - g_esCache[tank].g_iIntangibleBody = iGetSettingValue(bAccess, true, g_esTank[iType].g_iIntangibleBody, g_esGeneral.g_iIntangibleBody, 1); - g_esCache[tank].g_iIntangibleBody = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iIntangibleBody, g_esCache[tank].g_iIntangibleBody, 1); - g_esCache[tank].g_iKillMessage = iGetSettingValue(bAccess, true, g_esTank[iType].g_iKillMessage, g_esGeneral.g_iKillMessage, 1); - g_esCache[tank].g_iKillMessage = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iKillMessage, g_esCache[tank].g_iKillMessage, 1); - g_esCache[tank].g_iMeleeHitMode = iGetSettingValue(bAccess, true, g_esTank[iType].g_iMeleeHitMode, g_esGeneral.g_iMeleeHitMode, 1); - g_esCache[tank].g_iMeleeHitMode = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iMeleeHitMode, g_esCache[tank].g_iMeleeHitMode, 1); - g_esCache[tank].g_iMeleeImmunity = iGetSettingValue(bAccess, true, g_esTank[iType].g_iMeleeImmunity, g_esGeneral.g_iMeleeImmunity, 1); - g_esCache[tank].g_iMeleeImmunity = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iMeleeImmunity, g_esCache[tank].g_iMeleeImmunity, 1); - g_esCache[tank].g_iMinimumHumans = iGetSettingValue(bAccess, true, g_esTank[iType].g_iMinimumHumans, g_esGeneral.g_iMinimumHumans, 1); - g_esCache[tank].g_iMinimumHumans = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iMinimumHumans, g_esCache[tank].g_iMinimumHumans, 1); - g_esCache[tank].g_iMultiplyHealth = iGetSettingValue(bAccess, true, g_esTank[iType].g_iMultiplyHealth, g_esGeneral.g_iMultiplyHealth, 1); - g_esCache[tank].g_iMultiplyHealth = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iMultiplyHealth, g_esCache[tank].g_iMultiplyHealth, 1); - g_esCache[tank].g_iPrioritizeThrows = iGetSettingValue(bAccess, true, g_esTank[iType].g_iPrioritizeThrows, g_esGeneral.g_iPrioritizeThrows, 1); - g_esCache[tank].g_iPropsAttached = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iPropsAttached, g_esTank[iType].g_iPropsAttached, 1); - g_esCache[tank].g_iRandomTank = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iRandomTank, g_esTank[iType].g_iRandomTank, 1); - g_esCache[tank].g_iRockEffects = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iRockEffects, g_esTank[iType].g_iRockEffects, 1); - g_esCache[tank].g_iRockModel = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iRockModel, g_esTank[iType].g_iRockModel, 1); - g_esCache[tank].g_iRockSound = iGetSettingValue(bAccess, true, g_esTank[iType].g_iRockSound, g_esGeneral.g_iRockSound, 1); - g_esCache[tank].g_iRockSound = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iRockSound, g_esCache[tank].g_iRockSound, 1); - g_esCache[tank].g_iSkipIncap = iGetSettingValue(bAccess, true, g_esTank[iType].g_iSkipIncap, g_esGeneral.g_iSkipIncap, 1); - g_esCache[tank].g_iSkipIncap = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iSkipIncap, g_esCache[tank].g_iSkipIncap, 1); - g_esCache[tank].g_iSkipTaunt = iGetSettingValue(bAccess, true, g_esTank[iType].g_iSkipTaunt, g_esGeneral.g_iSkipTaunt, 1); - g_esCache[tank].g_iSkipTaunt = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iSkipTaunt, g_esCache[tank].g_iSkipTaunt, 1); - g_esCache[tank].g_iSpawnProtection = iGetSettingValue(bAccess, true, g_esTank[iType].g_iSpawnProtection, g_esGeneral.g_iSpawnProtection, 1); - g_esCache[tank].g_iSpawnProtection = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iSpawnProtection, g_esCache[tank].g_iSpawnProtection, 1); - g_esCache[tank].g_iSpawnType = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iSpawnType, g_esTank[iType].g_iSpawnType, 1); - g_esCache[tank].g_iSweepFist = iGetSettingValue(bAccess, true, g_esTank[iType].g_iSweepFist, g_esGeneral.g_iSweepFist, 1); - g_esCache[tank].g_iSweepFist = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iSweepFist, g_esCache[tank].g_iSweepFist, 1); - g_esCache[tank].g_iTankModel = iGetSettingValue(bAccess, true, g_esTank[iType].g_iTankModel, g_esGeneral.g_iTankModel, 1); - g_esCache[tank].g_iTankModel = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iTankModel, g_esCache[tank].g_iTankModel, 1); - g_esCache[tank].g_iTankNote = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iTankNote, g_esTank[iType].g_iTankNote, 1); - g_esCache[tank].g_iTeammateLimit = iGetSettingValue(bAccess, true, g_esTank[iType].g_iTeammateLimit, g_esGeneral.g_iTeammateLimit, 1); - g_esCache[tank].g_iTeammateLimit = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iTeammateLimit, g_esCache[tank].g_iTeammateLimit, 1); - g_esCache[tank].g_iThrowRock = iGetSettingValue(bAccess, true, g_esTank[iType].g_iThrowRock, g_esGeneral.g_iThrowRock, 1); - g_esCache[tank].g_iThrowRock = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iThrowRock, g_esCache[tank].g_iThrowRock, 1); - g_esCache[tank].g_iVocalizeArrival = iGetSettingValue(bAccess, true, g_esTank[iType].g_iVocalizeArrival, g_esGeneral.g_iVocalizeArrival, 1); - g_esCache[tank].g_iVocalizeArrival = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iVocalizeArrival, g_esCache[tank].g_iVocalizeArrival, 1); - g_esCache[tank].g_iVocalizeDeath = iGetSettingValue(bAccess, true, g_esTank[iType].g_iVocalizeDeath, g_esGeneral.g_iVocalizeDeath, 1); - g_esCache[tank].g_iVocalizeDeath = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iVocalizeDeath, g_esCache[tank].g_iVocalizeDeath, 1); - g_esCache[tank].g_iVomitImmunity = iGetSettingValue(bAccess, true, g_esTank[iType].g_iVomitImmunity, g_esGeneral.g_iVomitImmunity, 1); - g_esCache[tank].g_iVomitImmunity = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iVomitImmunity, g_esCache[tank].g_iVomitImmunity, 1); - - vGetSettingValue(bAccess, true, g_esCache[tank].g_sBodyColorVisual, sizeof esCache::g_sBodyColorVisual, g_esTank[iType].g_sBodyColorVisual, g_esGeneral.g_sBodyColorVisual); - vGetSettingValue(bAccess, bHuman, g_esCache[tank].g_sBodyColorVisual, sizeof esCache::g_sBodyColorVisual, g_esPlayer[tank].g_sBodyColorVisual, g_esCache[tank].g_sBodyColorVisual); - vGetSettingValue(bAccess, true, g_esCache[tank].g_sBodyColorVisual2, sizeof esCache::g_sBodyColorVisual2, g_esTank[iType].g_sBodyColorVisual2, g_esGeneral.g_sBodyColorVisual2); - vGetSettingValue(bAccess, bHuman, g_esCache[tank].g_sBodyColorVisual2, sizeof esCache::g_sBodyColorVisual2, g_esPlayer[tank].g_sBodyColorVisual2, g_esCache[tank].g_sBodyColorVisual2); - vGetSettingValue(bAccess, true, g_esCache[tank].g_sBodyColorVisual3, sizeof esCache::g_sBodyColorVisual3, g_esTank[iType].g_sBodyColorVisual3, g_esGeneral.g_sBodyColorVisual3); - vGetSettingValue(bAccess, bHuman, g_esCache[tank].g_sBodyColorVisual3, sizeof esCache::g_sBodyColorVisual3, g_esPlayer[tank].g_sBodyColorVisual3, g_esCache[tank].g_sBodyColorVisual3); - vGetSettingValue(bAccess, true, g_esCache[tank].g_sBodyColorVisual4, sizeof esCache::g_sBodyColorVisual4, g_esTank[iType].g_sBodyColorVisual4, g_esGeneral.g_sBodyColorVisual4); - vGetSettingValue(bAccess, bHuman, g_esCache[tank].g_sBodyColorVisual4, sizeof esCache::g_sBodyColorVisual4, g_esPlayer[tank].g_sBodyColorVisual4, g_esCache[tank].g_sBodyColorVisual4); - vGetSettingValue(bAccess, bHuman, g_esCache[tank].g_sComboSet, sizeof esCache::g_sComboSet, g_esPlayer[tank].g_sComboSet, g_esTank[iType].g_sComboSet); - vGetSettingValue(bAccess, true, g_esCache[tank].g_sFallVoicelineReward, sizeof esCache::g_sFallVoicelineReward, g_esTank[iType].g_sFallVoicelineReward, g_esGeneral.g_sFallVoicelineReward); - vGetSettingValue(bAccess, bHuman, g_esCache[tank].g_sFallVoicelineReward, sizeof esCache::g_sFallVoicelineReward, g_esPlayer[tank].g_sFallVoicelineReward, g_esCache[tank].g_sFallVoicelineReward); - vGetSettingValue(bAccess, true, g_esCache[tank].g_sFallVoicelineReward2, sizeof esCache::g_sFallVoicelineReward2, g_esTank[iType].g_sFallVoicelineReward2, g_esGeneral.g_sFallVoicelineReward2); - vGetSettingValue(bAccess, bHuman, g_esCache[tank].g_sFallVoicelineReward2, sizeof esCache::g_sFallVoicelineReward2, g_esPlayer[tank].g_sFallVoicelineReward2, g_esCache[tank].g_sFallVoicelineReward2); - vGetSettingValue(bAccess, true, g_esCache[tank].g_sFallVoicelineReward3, sizeof esCache::g_sFallVoicelineReward3, g_esTank[iType].g_sFallVoicelineReward3, g_esGeneral.g_sFallVoicelineReward3); - vGetSettingValue(bAccess, bHuman, g_esCache[tank].g_sFallVoicelineReward3, sizeof esCache::g_sFallVoicelineReward3, g_esPlayer[tank].g_sFallVoicelineReward3, g_esCache[tank].g_sFallVoicelineReward3); - vGetSettingValue(bAccess, true, g_esCache[tank].g_sFallVoicelineReward4, sizeof esCache::g_sFallVoicelineReward4, g_esTank[iType].g_sFallVoicelineReward4, g_esGeneral.g_sFallVoicelineReward4); - vGetSettingValue(bAccess, bHuman, g_esCache[tank].g_sFallVoicelineReward4, sizeof esCache::g_sFallVoicelineReward4, g_esPlayer[tank].g_sFallVoicelineReward4, g_esCache[tank].g_sFallVoicelineReward4); - vGetSettingValue(bAccess, bHuman, g_esCache[tank].g_sFlameColor, sizeof esCache::g_sFlameColor, g_esPlayer[tank].g_sFlameColor, g_esTank[iType].g_sFlameColor); - vGetSettingValue(bAccess, bHuman, g_esCache[tank].g_sFlashlightColor, sizeof esCache::g_sFlashlightColor, g_esPlayer[tank].g_sFlashlightColor, g_esTank[iType].g_sFlashlightColor); - vGetSettingValue(bAccess, bHuman, g_esCache[tank].g_sGlowColor, sizeof esCache::g_sGlowColor, g_esPlayer[tank].g_sGlowColor, g_esTank[iType].g_sGlowColor); - vGetSettingValue(bAccess, true, g_esCache[tank].g_sHealthCharacters, sizeof esCache::g_sHealthCharacters, g_esTank[iType].g_sHealthCharacters, g_esGeneral.g_sHealthCharacters); - vGetSettingValue(bAccess, bHuman, g_esCache[tank].g_sHealthCharacters, sizeof esCache::g_sHealthCharacters, g_esPlayer[tank].g_sHealthCharacters, g_esCache[tank].g_sHealthCharacters); - vGetSettingValue(bAccess, true, g_esCache[tank].g_sItemReward, sizeof esCache::g_sItemReward, g_esTank[iType].g_sItemReward, g_esGeneral.g_sItemReward); - vGetSettingValue(bAccess, bHuman, g_esCache[tank].g_sItemReward, sizeof esCache::g_sItemReward, g_esPlayer[tank].g_sItemReward, g_esCache[tank].g_sItemReward); - vGetSettingValue(bAccess, true, g_esCache[tank].g_sItemReward2, sizeof esCache::g_sItemReward2, g_esTank[iType].g_sItemReward2, g_esGeneral.g_sItemReward2); - vGetSettingValue(bAccess, bHuman, g_esCache[tank].g_sItemReward2, sizeof esCache::g_sItemReward2, g_esPlayer[tank].g_sItemReward2, g_esCache[tank].g_sItemReward2); - vGetSettingValue(bAccess, true, g_esCache[tank].g_sItemReward3, sizeof esCache::g_sItemReward3, g_esTank[iType].g_sItemReward3, g_esGeneral.g_sItemReward3); - vGetSettingValue(bAccess, bHuman, g_esCache[tank].g_sItemReward3, sizeof esCache::g_sItemReward3, g_esPlayer[tank].g_sItemReward3, g_esCache[tank].g_sItemReward3); - vGetSettingValue(bAccess, true, g_esCache[tank].g_sItemReward4, sizeof esCache::g_sItemReward4, g_esTank[iType].g_sItemReward4, g_esGeneral.g_sItemReward4); - vGetSettingValue(bAccess, bHuman, g_esCache[tank].g_sItemReward4, sizeof esCache::g_sItemReward4, g_esPlayer[tank].g_sItemReward4, g_esCache[tank].g_sItemReward4); - vGetSettingValue(bAccess, true, g_esCache[tank].g_sLightColorVisual, sizeof esCache::g_sLightColorVisual, g_esTank[iType].g_sLightColorVisual, g_esGeneral.g_sLightColorVisual); - vGetSettingValue(bAccess, bHuman, g_esCache[tank].g_sLightColorVisual, sizeof esCache::g_sLightColorVisual, g_esPlayer[tank].g_sLightColorVisual, g_esCache[tank].g_sLightColorVisual); - vGetSettingValue(bAccess, true, g_esCache[tank].g_sLightColorVisual2, sizeof esCache::g_sLightColorVisual2, g_esTank[iType].g_sLightColorVisual2, g_esGeneral.g_sLightColorVisual2); - vGetSettingValue(bAccess, bHuman, g_esCache[tank].g_sLightColorVisual2, sizeof esCache::g_sLightColorVisual2, g_esPlayer[tank].g_sLightColorVisual2, g_esCache[tank].g_sLightColorVisual2); - vGetSettingValue(bAccess, true, g_esCache[tank].g_sLightColorVisual3, sizeof esCache::g_sLightColorVisual3, g_esTank[iType].g_sLightColorVisual3, g_esGeneral.g_sLightColorVisual3); - vGetSettingValue(bAccess, bHuman, g_esCache[tank].g_sLightColorVisual3, sizeof esCache::g_sLightColorVisual3, g_esPlayer[tank].g_sLightColorVisual3, g_esCache[tank].g_sLightColorVisual3); - vGetSettingValue(bAccess, true, g_esCache[tank].g_sLightColorVisual4, sizeof esCache::g_sLightColorVisual4, g_esTank[iType].g_sLightColorVisual4, g_esGeneral.g_sLightColorVisual4); - vGetSettingValue(bAccess, bHuman, g_esCache[tank].g_sLightColorVisual4, sizeof esCache::g_sLightColorVisual4, g_esPlayer[tank].g_sLightColorVisual4, g_esCache[tank].g_sLightColorVisual4); - vGetSettingValue(bAccess, true, g_esCache[tank].g_sLoopingVoicelineVisual, sizeof esCache::g_sLoopingVoicelineVisual, g_esTank[iType].g_sLoopingVoicelineVisual, g_esGeneral.g_sLoopingVoicelineVisual); - vGetSettingValue(bAccess, bHuman, g_esCache[tank].g_sLoopingVoicelineVisual, sizeof esCache::g_sLoopingVoicelineVisual, g_esPlayer[tank].g_sLoopingVoicelineVisual, g_esCache[tank].g_sLoopingVoicelineVisual); - vGetSettingValue(bAccess, true, g_esCache[tank].g_sLoopingVoicelineVisual2, sizeof esCache::g_sLoopingVoicelineVisual2, g_esTank[iType].g_sLoopingVoicelineVisual2, g_esGeneral.g_sLoopingVoicelineVisual2); - vGetSettingValue(bAccess, bHuman, g_esCache[tank].g_sLoopingVoicelineVisual2, sizeof esCache::g_sLoopingVoicelineVisual2, g_esPlayer[tank].g_sLoopingVoicelineVisual2, g_esCache[tank].g_sLoopingVoicelineVisual2); - vGetSettingValue(bAccess, true, g_esCache[tank].g_sLoopingVoicelineVisual3, sizeof esCache::g_sLoopingVoicelineVisual3, g_esTank[iType].g_sLoopingVoicelineVisual3, g_esGeneral.g_sLoopingVoicelineVisual3); - vGetSettingValue(bAccess, bHuman, g_esCache[tank].g_sLoopingVoicelineVisual3, sizeof esCache::g_sLoopingVoicelineVisual3, g_esPlayer[tank].g_sLoopingVoicelineVisual3, g_esCache[tank].g_sLoopingVoicelineVisual3); - vGetSettingValue(bAccess, true, g_esCache[tank].g_sLoopingVoicelineVisual4, sizeof esCache::g_sLoopingVoicelineVisual4, g_esTank[iType].g_sLoopingVoicelineVisual4, g_esGeneral.g_sLoopingVoicelineVisual4); - vGetSettingValue(bAccess, bHuman, g_esCache[tank].g_sLoopingVoicelineVisual4, sizeof esCache::g_sLoopingVoicelineVisual4, g_esPlayer[tank].g_sLoopingVoicelineVisual4, g_esCache[tank].g_sLoopingVoicelineVisual4); - vGetSettingValue(bAccess, true, g_esCache[tank].g_sOutlineColorVisual, sizeof esCache::g_sOutlineColorVisual, g_esTank[iType].g_sOutlineColorVisual, g_esGeneral.g_sOutlineColorVisual); - vGetSettingValue(bAccess, bHuman, g_esCache[tank].g_sOutlineColorVisual, sizeof esCache::g_sOutlineColorVisual, g_esPlayer[tank].g_sOutlineColorVisual, g_esCache[tank].g_sOutlineColorVisual); - vGetSettingValue(bAccess, true, g_esCache[tank].g_sOutlineColorVisual2, sizeof esCache::g_sOutlineColorVisual2, g_esTank[iType].g_sOutlineColorVisual2, g_esGeneral.g_sOutlineColorVisual2); - vGetSettingValue(bAccess, bHuman, g_esCache[tank].g_sOutlineColorVisual2, sizeof esCache::g_sOutlineColorVisual2, g_esPlayer[tank].g_sOutlineColorVisual2, g_esCache[tank].g_sOutlineColorVisual2); - vGetSettingValue(bAccess, true, g_esCache[tank].g_sOutlineColorVisual3, sizeof esCache::g_sOutlineColorVisual3, g_esTank[iType].g_sOutlineColorVisual3, g_esGeneral.g_sOutlineColorVisual3); - vGetSettingValue(bAccess, bHuman, g_esCache[tank].g_sOutlineColorVisual3, sizeof esCache::g_sOutlineColorVisual3, g_esPlayer[tank].g_sOutlineColorVisual3, g_esCache[tank].g_sOutlineColorVisual3); - vGetSettingValue(bAccess, true, g_esCache[tank].g_sOutlineColorVisual4, sizeof esCache::g_sOutlineColorVisual4, g_esTank[iType].g_sOutlineColorVisual4, g_esGeneral.g_sOutlineColorVisual4); - vGetSettingValue(bAccess, bHuman, g_esCache[tank].g_sOutlineColorVisual4, sizeof esCache::g_sOutlineColorVisual4, g_esPlayer[tank].g_sOutlineColorVisual4, g_esCache[tank].g_sOutlineColorVisual4); - vGetSettingValue(bAccess, bHuman, g_esCache[tank].g_sOzTankColor, sizeof esCache::g_sOzTankColor, g_esPlayer[tank].g_sOzTankColor, g_esTank[iType].g_sOzTankColor); - vGetSettingValue(bAccess, bHuman, g_esCache[tank].g_sPropTankColor, sizeof esCache::g_sPropTankColor, g_esPlayer[tank].g_sPropTankColor, g_esTank[iType].g_sPropTankColor); - vGetSettingValue(bAccess, bHuman, g_esCache[tank].g_sRockColor, sizeof esCache::g_sRockColor, g_esPlayer[tank].g_sRockColor, g_esTank[iType].g_sRockColor); - vGetSettingValue(bAccess, true, g_esCache[tank].g_sScreenColorVisual, sizeof esCache::g_sScreenColorVisual, g_esTank[iType].g_sScreenColorVisual, g_esGeneral.g_sScreenColorVisual); - vGetSettingValue(bAccess, bHuman, g_esCache[tank].g_sScreenColorVisual, sizeof esCache::g_sScreenColorVisual, g_esPlayer[tank].g_sScreenColorVisual, g_esCache[tank].g_sScreenColorVisual); - vGetSettingValue(bAccess, true, g_esCache[tank].g_sScreenColorVisual2, sizeof esCache::g_sScreenColorVisual2, g_esTank[iType].g_sScreenColorVisual2, g_esGeneral.g_sScreenColorVisual2); - vGetSettingValue(bAccess, bHuman, g_esCache[tank].g_sScreenColorVisual2, sizeof esCache::g_sScreenColorVisual2, g_esPlayer[tank].g_sScreenColorVisual2, g_esCache[tank].g_sScreenColorVisual2); - vGetSettingValue(bAccess, true, g_esCache[tank].g_sScreenColorVisual3, sizeof esCache::g_sScreenColorVisual3, g_esTank[iType].g_sScreenColorVisual3, g_esGeneral.g_sScreenColorVisual3); - vGetSettingValue(bAccess, bHuman, g_esCache[tank].g_sScreenColorVisual3, sizeof esCache::g_sScreenColorVisual3, g_esPlayer[tank].g_sScreenColorVisual3, g_esCache[tank].g_sScreenColorVisual3); - vGetSettingValue(bAccess, true, g_esCache[tank].g_sScreenColorVisual4, sizeof esCache::g_sScreenColorVisual4, g_esTank[iType].g_sScreenColorVisual4, g_esGeneral.g_sScreenColorVisual4); - vGetSettingValue(bAccess, bHuman, g_esCache[tank].g_sScreenColorVisual4, sizeof esCache::g_sScreenColorVisual4, g_esPlayer[tank].g_sScreenColorVisual4, g_esCache[tank].g_sScreenColorVisual4); - vGetSettingValue(bAccess, bHuman, g_esCache[tank].g_sSkinColor, sizeof esCache::g_sSkinColor, g_esPlayer[tank].g_sSkinColor, g_esTank[iType].g_sSkinColor); - vGetSettingValue(bAccess, bHuman, g_esCache[tank].g_sTankName, sizeof esCache::g_sTankName, g_esPlayer[tank].g_sTankName, g_esTank[iType].g_sTankName); - vGetSettingValue(bAccess, bHuman, g_esCache[tank].g_sTireColor, sizeof esCache::g_sTireColor, g_esPlayer[tank].g_sTireColor, g_esTank[iType].g_sTireColor); - - for (int iPos = 0; iPos < (sizeof esCache::g_iTransformType); iPos++) - { - g_esCache[tank].g_iTransformType[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iTransformType[iPos], g_esTank[iType].g_iTransformType[iPos], 1); - - if (iPos < (sizeof esCache::g_iRewardEnabled)) - { - g_esCache[tank].g_flActionDurationReward[iPos] = flGetSettingValue(bAccess, true, g_esTank[iType].g_flActionDurationReward[iPos], g_esGeneral.g_flActionDurationReward[iPos], 1); - g_esCache[tank].g_flActionDurationReward[iPos] = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flActionDurationReward[iPos], g_esCache[tank].g_flActionDurationReward[iPos], 1); - g_esCache[tank].g_iAmmoBoostReward[iPos] = iGetSettingValue(bAccess, true, g_esTank[iType].g_iAmmoBoostReward[iPos], g_esGeneral.g_iAmmoBoostReward[iPos], 1); - g_esCache[tank].g_iAmmoBoostReward[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iAmmoBoostReward[iPos], g_esCache[tank].g_iAmmoBoostReward[iPos], 1); - g_esCache[tank].g_iAmmoRegenReward[iPos] = iGetSettingValue(bAccess, true, g_esTank[iType].g_iAmmoRegenReward[iPos], g_esGeneral.g_iAmmoRegenReward[iPos], 1); - g_esCache[tank].g_iAmmoRegenReward[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iAmmoRegenReward[iPos], g_esCache[tank].g_iAmmoRegenReward[iPos], 1); - g_esCache[tank].g_flAttackBoostReward[iPos] = flGetSettingValue(bAccess, true, g_esTank[iType].g_flAttackBoostReward[iPos], g_esGeneral.g_flAttackBoostReward[iPos], 1); - g_esCache[tank].g_flAttackBoostReward[iPos] = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flAttackBoostReward[iPos], g_esCache[tank].g_flAttackBoostReward[iPos], 1); - g_esCache[tank].g_iBlazeHealthReward[iPos] = iGetSettingValue(bAccess, true, g_esTank[iType].g_iBlazeHealthReward[iPos], g_esGeneral.g_iBlazeHealthReward[iPos], 1); - g_esCache[tank].g_iBlazeHealthReward[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iBlazeHealthReward[iPos], g_esCache[tank].g_iBlazeHealthReward[iPos], 1); - g_esCache[tank].g_iBunnyHopReward[iPos] = iGetSettingValue(bAccess, true, g_esTank[iType].g_iBunnyHopReward[iPos], g_esGeneral.g_iBunnyHopReward[iPos], 1); - g_esCache[tank].g_iBunnyHopReward[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iBunnyHopReward[iPos], g_esCache[tank].g_iBunnyHopReward[iPos], 1); - g_esCache[tank].g_iBurstDoorsReward[iPos] = iGetSettingValue(bAccess, true, g_esTank[iType].g_iBurstDoorsReward[iPos], g_esGeneral.g_iBurstDoorsReward[iPos], 1); - g_esCache[tank].g_iBurstDoorsReward[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iBurstDoorsReward[iPos], g_esCache[tank].g_iBurstDoorsReward[iPos], 1); - g_esCache[tank].g_iCleanKillsReward[iPos] = iGetSettingValue(bAccess, true, g_esTank[iType].g_iCleanKillsReward[iPos], g_esGeneral.g_iCleanKillsReward[iPos], 1); - g_esCache[tank].g_iCleanKillsReward[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iCleanKillsReward[iPos], g_esCache[tank].g_iCleanKillsReward[iPos], 1); - g_esCache[tank].g_iClusterBombsReward[iPos] = iGetSettingValue(bAccess, true, g_esTank[iType].g_iClusterBombsReward[iPos], g_esGeneral.g_iClusterBombsReward[iPos], 1); - g_esCache[tank].g_iClusterBombsReward[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iClusterBombsReward[iPos], g_esCache[tank].g_iClusterBombsReward[iPos], 1); - g_esCache[tank].g_flDamageBoostReward[iPos] = flGetSettingValue(bAccess, true, g_esTank[iType].g_flDamageBoostReward[iPos], g_esGeneral.g_flDamageBoostReward[iPos], 1); - g_esCache[tank].g_flDamageBoostReward[iPos] = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flDamageBoostReward[iPos], g_esCache[tank].g_flDamageBoostReward[iPos], 1); - g_esCache[tank].g_flDamageResistanceReward[iPos] = flGetSettingValue(bAccess, true, g_esTank[iType].g_flDamageResistanceReward[iPos], g_esGeneral.g_flDamageResistanceReward[iPos], 1); - g_esCache[tank].g_flDamageResistanceReward[iPos] = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flDamageResistanceReward[iPos], g_esCache[tank].g_flDamageResistanceReward[iPos], 1); - g_esCache[tank].g_iFriendlyFireReward[iPos] = iGetSettingValue(bAccess, true, g_esTank[iType].g_iFriendlyFireReward[iPos], g_esGeneral.g_iFriendlyFireReward[iPos], 1); - g_esCache[tank].g_iFriendlyFireReward[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iFriendlyFireReward[iPos], g_esCache[tank].g_iFriendlyFireReward[iPos], 1); - g_esCache[tank].g_iGhostBulletsReward[iPos] = iGetSettingValue(bAccess, true, g_esTank[iType].g_iGhostBulletsReward[iPos], g_esGeneral.g_iGhostBulletsReward[iPos], 1); - g_esCache[tank].g_iGhostBulletsReward[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iGhostBulletsReward[iPos], g_esCache[tank].g_iGhostBulletsReward[iPos], 1); - g_esCache[tank].g_flHealPercentReward[iPos] = flGetSettingValue(bAccess, true, g_esTank[iType].g_flHealPercentReward[iPos], g_esGeneral.g_flHealPercentReward[iPos], 1); - g_esCache[tank].g_flHealPercentReward[iPos] = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flHealPercentReward[iPos], g_esCache[tank].g_flHealPercentReward[iPos], 1); - g_esCache[tank].g_iHealthRegenReward[iPos] = iGetSettingValue(bAccess, true, g_esTank[iType].g_iHealthRegenReward[iPos], g_esGeneral.g_iHealthRegenReward[iPos], 1); - g_esCache[tank].g_iHealthRegenReward[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iHealthRegenReward[iPos], g_esCache[tank].g_iHealthRegenReward[iPos], 1); - g_esCache[tank].g_iHollowpointAmmoReward[iPos] = iGetSettingValue(bAccess, true, g_esTank[iType].g_iHollowpointAmmoReward[iPos], g_esGeneral.g_iHollowpointAmmoReward[iPos], 1); - g_esCache[tank].g_iHollowpointAmmoReward[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iHollowpointAmmoReward[iPos], g_esCache[tank].g_iHollowpointAmmoReward[iPos], 1); - g_esCache[tank].g_flJumpHeightReward[iPos] = flGetSettingValue(bAccess, true, g_esTank[iType].g_flJumpHeightReward[iPos], g_esGeneral.g_flJumpHeightReward[iPos], 1); - g_esCache[tank].g_flJumpHeightReward[iPos] = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flJumpHeightReward[iPos], g_esCache[tank].g_flJumpHeightReward[iPos], 1); - g_esCache[tank].g_iInextinguishableFireReward[iPos] = iGetSettingValue(bAccess, true, g_esTank[iType].g_iInextinguishableFireReward[iPos], g_esGeneral.g_iInextinguishableFireReward[iPos], 1); - g_esCache[tank].g_iInextinguishableFireReward[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iInextinguishableFireReward[iPos], g_esCache[tank].g_iInextinguishableFireReward[iPos], 1); - g_esCache[tank].g_iInfiniteAmmoReward[iPos] = iGetSettingValue(bAccess, true, g_esTank[iType].g_iInfiniteAmmoReward[iPos], g_esGeneral.g_iInfiniteAmmoReward[iPos], 1); - g_esCache[tank].g_iInfiniteAmmoReward[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iInfiniteAmmoReward[iPos], g_esCache[tank].g_iInfiniteAmmoReward[iPos], 1); - g_esCache[tank].g_iLadderActionsReward[iPos] = iGetSettingValue(bAccess, true, g_esTank[iType].g_iLadderActionsReward[iPos], g_esGeneral.g_iLadderActionsReward[iPos], 1); - g_esCache[tank].g_iLadderActionsReward[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iLadderActionsReward[iPos], g_esCache[tank].g_iLadderActionsReward[iPos], 1); - g_esCache[tank].g_iLadyKillerReward[iPos] = iGetSettingValue(bAccess, true, g_esTank[iType].g_iLadyKillerReward[iPos], g_esGeneral.g_iLadyKillerReward[iPos], 1); - g_esCache[tank].g_iLadyKillerReward[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iLadyKillerReward[iPos], g_esCache[tank].g_iLadyKillerReward[iPos], 1); - g_esCache[tank].g_iLaserSightReward[iPos] = iGetSettingValue(bAccess, true, g_esTank[iType].g_iLaserSightReward[iPos], g_esGeneral.g_iLaserSightReward[iPos], 1); - g_esCache[tank].g_iLaserSightReward[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iLaserSightReward[iPos], g_esCache[tank].g_iLaserSightReward[iPos], 1); - g_esCache[tank].g_iLifeLeechReward[iPos] = iGetSettingValue(bAccess, true, g_esTank[iType].g_iLifeLeechReward[iPos], g_esGeneral.g_iLifeLeechReward[iPos], 1); - g_esCache[tank].g_iLifeLeechReward[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iLifeLeechReward[iPos], g_esCache[tank].g_iLifeLeechReward[iPos], 1); - g_esCache[tank].g_flLoopingVoicelineInterval[iPos] = flGetSettingValue(bAccess, true, g_esTank[iType].g_flLoopingVoicelineInterval[iPos], g_esGeneral.g_flLoopingVoicelineInterval[iPos], 1); - g_esCache[tank].g_flLoopingVoicelineInterval[iPos] = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flLoopingVoicelineInterval[iPos], g_esCache[tank].g_flLoopingVoicelineInterval[iPos], 1); - g_esCache[tank].g_iMedicalCutsReward[iPos] = iGetSettingValue(bAccess, true, g_esTank[iType].g_iMedicalCutsReward[iPos], g_esGeneral.g_iMedicalCutsReward[iPos], 1); - g_esCache[tank].g_iMedicalCutsReward[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iMedicalCutsReward[iPos], g_esCache[tank].g_iMedicalCutsReward[iPos], 1); - g_esCache[tank].g_iMeleeRangeReward[iPos] = iGetSettingValue(bAccess, true, g_esTank[iType].g_iMeleeRangeReward[iPos], g_esGeneral.g_iMeleeRangeReward[iPos], 1); - g_esCache[tank].g_iMeleeRangeReward[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iMeleeRangeReward[iPos], g_esCache[tank].g_iMeleeRangeReward[iPos], 1); - g_esCache[tank].g_iMidairDashesReward[iPos] = iGetSettingValue(bAccess, true, g_esTank[iType].g_iMidairDashesReward[iPos], g_esGeneral.g_iMidairDashesReward[iPos], 1); - g_esCache[tank].g_iMidairDashesReward[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iMidairDashesReward[iPos], g_esCache[tank].g_iMidairDashesReward[iPos], 1); - g_esCache[tank].g_iParticleEffectVisual[iPos] = iGetSettingValue(bAccess, true, g_esTank[iType].g_iParticleEffectVisual[iPos], g_esGeneral.g_iParticleEffectVisual[iPos], 1); - g_esCache[tank].g_iParticleEffectVisual[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iParticleEffectVisual[iPos], g_esCache[tank].g_iParticleEffectVisual[iPos], 1); - g_esCache[tank].g_flPipeBombDurationReward[iPos] = flGetSettingValue(bAccess, true, g_esTank[iType].g_flPipeBombDurationReward[iPos], g_esGeneral.g_flPipeBombDurationReward[iPos], 1); - g_esCache[tank].g_flPipeBombDurationReward[iPos] = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flPipeBombDurationReward[iPos], g_esCache[tank].g_flPipeBombDurationReward[iPos], 1); - g_esCache[tank].g_iPrefsNotify[iPos] = iGetSettingValue(bAccess, true, g_esTank[iType].g_iPrefsNotify[iPos], g_esGeneral.g_iPrefsNotify[iPos], 1); - g_esCache[tank].g_iPrefsNotify[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iPrefsNotify[iPos], g_esCache[tank].g_iPrefsNotify[iPos], 1); - g_esCache[tank].g_flPunchResistanceReward[iPos] = flGetSettingValue(bAccess, true, g_esTank[iType].g_flPunchResistanceReward[iPos], g_esGeneral.g_flPunchResistanceReward[iPos], 1); - g_esCache[tank].g_flPunchResistanceReward[iPos] = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flPunchResistanceReward[iPos], g_esCache[tank].g_flPunchResistanceReward[iPos], 1); - g_esCache[tank].g_flRapidPistolReward[iPos] = flGetSettingValue(bAccess, true, g_esTank[iType].g_flRapidPistolReward[iPos], g_esGeneral.g_flRapidPistolReward[iPos], 1); - g_esCache[tank].g_flRapidPistolReward[iPos] = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flRapidPistolReward[iPos], g_esCache[tank].g_flRapidPistolReward[iPos], 1); - g_esCache[tank].g_iRecoilDampenerReward[iPos] = iGetSettingValue(bAccess, true, g_esTank[iType].g_iRecoilDampenerReward[iPos], g_esGeneral.g_iRecoilDampenerReward[iPos], 1); - g_esCache[tank].g_iRecoilDampenerReward[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iRecoilDampenerReward[iPos], g_esCache[tank].g_iRecoilDampenerReward[iPos], 1); - g_esCache[tank].g_flRefillPercentReward[iPos] = flGetSettingValue(bAccess, true, g_esTank[iType].g_flRefillPercentReward[iPos], g_esGeneral.g_flRefillPercentReward[iPos], 1); - g_esCache[tank].g_flRefillPercentReward[iPos] = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flRefillPercentReward[iPos], g_esCache[tank].g_flRefillPercentReward[iPos], 1); - g_esCache[tank].g_iRegenBurstsReward[iPos] = iGetSettingValue(bAccess, true, g_esTank[iType].g_iRegenBurstsReward[iPos], g_esGeneral.g_iRegenBurstsReward[iPos], 1); - g_esCache[tank].g_iRegenBurstsReward[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iRegenBurstsReward[iPos], g_esCache[tank].g_iRegenBurstsReward[iPos], 1); - g_esCache[tank].g_iRespawnLoadoutReward[iPos] = iGetSettingValue(bAccess, true, g_esTank[iType].g_iRespawnLoadoutReward[iPos], g_esGeneral.g_iRespawnLoadoutReward[iPos], 1); - g_esCache[tank].g_iRespawnLoadoutReward[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iRespawnLoadoutReward[iPos], g_esCache[tank].g_iRespawnLoadoutReward[iPos], 1); - g_esCache[tank].g_iReviveHealthReward[iPos] = iGetSettingValue(bAccess, true, g_esTank[iType].g_iReviveHealthReward[iPos], g_esGeneral.g_iReviveHealthReward[iPos], 1); - g_esCache[tank].g_iReviveHealthReward[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iReviveHealthReward[iPos], g_esCache[tank].g_iReviveHealthReward[iPos], 1); - g_esCache[tank].g_iRewardBots[iPos] = iGetSettingValue(bAccess, true, g_esTank[iType].g_iRewardBots[iPos], g_esGeneral.g_iRewardBots[iPos], 1, -1); - g_esCache[tank].g_iRewardBots[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iRewardBots[iPos], g_esCache[tank].g_iRewardBots[iPos], 1, -1); - g_esCache[tank].g_flRewardChance[iPos] = flGetSettingValue(bAccess, true, g_esTank[iType].g_flRewardChance[iPos], g_esGeneral.g_flRewardChance[iPos], 1); - g_esCache[tank].g_flRewardChance[iPos] = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flRewardChance[iPos], g_esCache[tank].g_flRewardChance[iPos], 1); - g_esCache[tank].g_flRewardDuration[iPos] = flGetSettingValue(bAccess, true, g_esTank[iType].g_flRewardDuration[iPos], g_esGeneral.g_flRewardDuration[iPos], 1); - g_esCache[tank].g_flRewardDuration[iPos] = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flRewardDuration[iPos], g_esCache[tank].g_flRewardDuration[iPos], 1); - g_esCache[tank].g_iRewardEffect[iPos] = iGetSettingValue(bAccess, true, g_esTank[iType].g_iRewardEffect[iPos], g_esGeneral.g_iRewardEffect[iPos], 1); - g_esCache[tank].g_iRewardEffect[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iRewardEffect[iPos], g_esCache[tank].g_iRewardEffect[iPos], 1); - g_esCache[tank].g_iRewardEnabled[iPos] = iGetSettingValue(bAccess, true, g_esTank[iType].g_iRewardEnabled[iPos], g_esGeneral.g_iRewardEnabled[iPos], 1, -1); - g_esCache[tank].g_iRewardEnabled[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iRewardEnabled[iPos], g_esCache[tank].g_iRewardEnabled[iPos], 1, -1); - g_esCache[tank].g_iRewardNotify[iPos] = iGetSettingValue(bAccess, true, g_esTank[iType].g_iRewardNotify[iPos], g_esGeneral.g_iRewardNotify[iPos], 1); - g_esCache[tank].g_iRewardNotify[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iRewardNotify[iPos], g_esCache[tank].g_iRewardNotify[iPos], 1); - g_esCache[tank].g_flRewardPercentage[iPos] = flGetSettingValue(bAccess, true, g_esTank[iType].g_flRewardPercentage[iPos], g_esGeneral.g_flRewardPercentage[iPos], 1); - g_esCache[tank].g_flRewardPercentage[iPos] = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flRewardPercentage[iPos], g_esCache[tank].g_flRewardPercentage[iPos], 1); - g_esCache[tank].g_iRewardVisual[iPos] = iGetSettingValue(bAccess, true, g_esTank[iType].g_iRewardVisual[iPos], g_esGeneral.g_iRewardVisual[iPos], 1); - g_esCache[tank].g_iRewardVisual[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iRewardVisual[iPos], g_esCache[tank].g_iRewardVisual[iPos], 1); - g_esCache[tank].g_iShareRewards[iPos] = iGetSettingValue(bAccess, true, g_esTank[iType].g_iShareRewards[iPos], g_esGeneral.g_iShareRewards[iPos], 1); - g_esCache[tank].g_iShareRewards[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iShareRewards[iPos], g_esCache[tank].g_iShareRewards[iPos], 1); - g_esCache[tank].g_flShoveDamageReward[iPos] = flGetSettingValue(bAccess, true, g_esTank[iType].g_flShoveDamageReward[iPos], g_esGeneral.g_flShoveDamageReward[iPos], 1); - g_esCache[tank].g_flShoveDamageReward[iPos] = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flShoveDamageReward[iPos], g_esCache[tank].g_flShoveDamageReward[iPos], 1); - g_esCache[tank].g_iShovePenaltyReward[iPos] = iGetSettingValue(bAccess, true, g_esTank[iType].g_iShovePenaltyReward[iPos], g_esGeneral.g_iShovePenaltyReward[iPos], 1); - g_esCache[tank].g_iShovePenaltyReward[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iShovePenaltyReward[iPos], g_esCache[tank].g_iShovePenaltyReward[iPos], 1); - g_esCache[tank].g_flShoveRateReward[iPos] = flGetSettingValue(bAccess, true, g_esTank[iType].g_flShoveRateReward[iPos], g_esGeneral.g_flShoveRateReward[iPos], 1); - g_esCache[tank].g_flShoveRateReward[iPos] = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flShoveRateReward[iPos], g_esCache[tank].g_flShoveRateReward[iPos], 1); - g_esCache[tank].g_iSledgehammerRoundsReward[iPos] = iGetSettingValue(bAccess, true, g_esTank[iType].g_iSledgehammerRoundsReward[iPos], g_esGeneral.g_iSledgehammerRoundsReward[iPos], 1); - g_esCache[tank].g_iSledgehammerRoundsReward[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iSledgehammerRoundsReward[iPos], g_esCache[tank].g_iSledgehammerRoundsReward[iPos], 1); - g_esCache[tank].g_iSpecialAmmoReward[iPos] = iGetSettingValue(bAccess, true, g_esTank[iType].g_iSpecialAmmoReward[iPos], g_esGeneral.g_iSpecialAmmoReward[iPos], 1); - g_esCache[tank].g_iSpecialAmmoReward[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iSpecialAmmoReward[iPos], g_esCache[tank].g_iSpecialAmmoReward[iPos], 1); - g_esCache[tank].g_flSpeedBoostReward[iPos] = flGetSettingValue(bAccess, true, g_esTank[iType].g_flSpeedBoostReward[iPos], g_esGeneral.g_flSpeedBoostReward[iPos], 1); - g_esCache[tank].g_flSpeedBoostReward[iPos] = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flSpeedBoostReward[iPos], g_esCache[tank].g_flSpeedBoostReward[iPos], 1); - g_esCache[tank].g_iStackRewards[iPos] = iGetSettingValue(bAccess, true, g_esTank[iType].g_iStackRewards[iPos], g_esGeneral.g_iStackRewards[iPos], 1); - g_esCache[tank].g_iStackRewards[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iStackRewards[iPos], g_esCache[tank].g_iStackRewards[iPos], 1); - g_esCache[tank].g_iStickyGrenadesReward[iPos] = iGetSettingValue(bAccess, true, g_esTank[iType].g_iStickyGrenadesReward[iPos], g_esGeneral.g_iStickyGrenadesReward[iPos], 1); - g_esCache[tank].g_iStickyGrenadesReward[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iStickyGrenadesReward[iPos], g_esCache[tank].g_iStickyGrenadesReward[iPos], 1); - g_esCache[tank].g_iSyringeDartsReward[iPos] = iGetSettingValue(bAccess, true, g_esTank[iType].g_iSyringeDartsReward[iPos], g_esGeneral.g_iSyringeDartsReward[iPos], 1); - g_esCache[tank].g_iSyringeDartsReward[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iSyringeDartsReward[iPos], g_esCache[tank].g_iSyringeDartsReward[iPos], 1); - g_esCache[tank].g_iThornsReward[iPos] = iGetSettingValue(bAccess, true, g_esTank[iType].g_iThornsReward[iPos], g_esGeneral.g_iThornsReward[iPos], 1); - g_esCache[tank].g_iThornsReward[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iThornsReward[iPos], g_esCache[tank].g_iThornsReward[iPos], 1); - g_esCache[tank].g_iUsefulRewards[iPos] = iGetSettingValue(bAccess, true, g_esTank[iType].g_iUsefulRewards[iPos], g_esGeneral.g_iUsefulRewards[iPos], 1); - g_esCache[tank].g_iUsefulRewards[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iUsefulRewards[iPos], g_esCache[tank].g_iUsefulRewards[iPos], 1); - g_esCache[tank].g_iVoicePitchVisual[iPos] = iGetSettingValue(bAccess, true, g_esTank[iType].g_iVoicePitchVisual[iPos], g_esGeneral.g_iVoicePitchVisual[iPos], 1); - g_esCache[tank].g_iVoicePitchVisual[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iVoicePitchVisual[iPos], g_esCache[tank].g_iVoicePitchVisual[iPos], 1); - } - - if (iPos < (sizeof esCache::g_iStackLimits)) - { - g_esCache[tank].g_iStackLimits[iPos] = iGetSettingValue(bAccess, true, g_esTank[iType].g_iStackLimits[iPos], g_esGeneral.g_iStackLimits[iPos], 1); - g_esCache[tank].g_iStackLimits[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iStackLimits[iPos], g_esCache[tank].g_iStackLimits[iPos], 1); - } - - if (iPos < (sizeof esCache::g_flComboChance)) - { - g_esCache[tank].g_flComboChance[iPos] = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flComboChance[iPos], g_esTank[iType].g_flComboChance[iPos], 1); - g_esCache[tank].g_iComboCooldown[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iComboCooldown[iPos], g_esTank[iType].g_iComboCooldown[iPos], 1); - g_esCache[tank].g_flComboDamage[iPos] = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flComboDamage[iPos], g_esTank[iType].g_flComboDamage[iPos], 1); - g_esCache[tank].g_flComboDeathChance[iPos] = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flComboDeathChance[iPos], g_esTank[iType].g_flComboDeathChance[iPos], 1); - g_esCache[tank].g_flComboDeathRange[iPos] = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flComboDeathRange[iPos], g_esTank[iType].g_flComboDeathRange[iPos], 1); - g_esCache[tank].g_flComboDelay[iPos] = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flComboDelay[iPos], g_esTank[iType].g_flComboDelay[iPos], 1); - g_esCache[tank].g_flComboDuration[iPos] = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flComboDuration[iPos], g_esTank[iType].g_flComboDuration[iPos], 1); - g_esCache[tank].g_flComboInterval[iPos] = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flComboInterval[iPos], g_esTank[iType].g_flComboInterval[iPos], 1); - g_esCache[tank].g_flComboMinRadius[iPos] = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flComboMinRadius[iPos], g_esTank[iType].g_flComboMinRadius[iPos], 2, 1.0); - g_esCache[tank].g_flComboMaxRadius[iPos] = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flComboMaxRadius[iPos], g_esTank[iType].g_flComboMaxRadius[iPos], 2, -1.0); - g_esCache[tank].g_flComboRange[iPos] = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flComboRange[iPos], g_esTank[iType].g_flComboRange[iPos], 1); - g_esCache[tank].g_flComboRangeChance[iPos] = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flComboRangeChance[iPos], g_esTank[iType].g_flComboRangeChance[iPos], 1); - g_esCache[tank].g_iComboRangeCooldown[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iComboRangeCooldown[iPos], g_esTank[iType].g_iComboRangeCooldown[iPos], 1); - g_esCache[tank].g_flComboRockChance[iPos] = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flComboRockChance[iPos], g_esTank[iType].g_flComboRockChance[iPos], 1); - g_esCache[tank].g_iComboRockCooldown[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iComboRockCooldown[iPos], g_esTank[iType].g_iComboRockCooldown[iPos], 1); - g_esCache[tank].g_flComboSpeed[iPos] = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flComboSpeed[iPos], g_esTank[iType].g_flComboSpeed[iPos], 1); - } - - if (iPos < (sizeof esCache::g_flComboTypeChance)) - { - g_esCache[tank].g_flComboTypeChance[iPos] = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flComboTypeChance[iPos], g_esTank[iType].g_flComboTypeChance[iPos], 1); - } - - if (iPos < (sizeof esCache::g_flPropsChance)) - { - g_esCache[tank].g_flPropsChance[iPos] = flGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_flPropsChance[iPos], g_esTank[iType].g_flPropsChance[iPos], 1); - } - - if (iPos < (sizeof esCache::g_iSkinColor)) - { - g_esCache[tank].g_iSkinColor[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iSkinColor[iPos], g_esTank[iType].g_iSkinColor[iPos], 1); - g_esCache[tank].g_iBossHealth[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iBossHealth[iPos], g_esTank[iType].g_iBossHealth[iPos], 1); - g_esCache[tank].g_iBossType[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iBossType[iPos], g_esTank[iType].g_iBossType[iPos], 1); - g_esCache[tank].g_iLightColor[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iLightColor[iPos], g_esTank[iType].g_iLightColor[iPos], 1); - g_esCache[tank].g_iOzTankColor[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iOzTankColor[iPos], g_esTank[iType].g_iOzTankColor[iPos], 1); - g_esCache[tank].g_iFlameColor[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iFlameColor[iPos], g_esTank[iType].g_iFlameColor[iPos], 1); - g_esCache[tank].g_iRockColor[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iRockColor[iPos], g_esTank[iType].g_iRockColor[iPos], 1); - g_esCache[tank].g_iTireColor[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iTireColor[iPos], g_esTank[iType].g_iTireColor[iPos], 1); - g_esCache[tank].g_iPropTankColor[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iPropTankColor[iPos], g_esTank[iType].g_iPropTankColor[iPos], 1); - g_esCache[tank].g_iFlashlightColor[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iFlashlightColor[iPos], g_esTank[iType].g_iFlashlightColor[iPos], 1); - g_esCache[tank].g_iCrownColor[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iCrownColor[iPos], g_esTank[iType].g_iCrownColor[iPos], 1); - } - - if (iPos < (sizeof esCache::g_iGlowColor)) - { - g_esCache[tank].g_iGlowColor[iPos] = iGetSettingValue(bAccess, bHuman, g_esPlayer[tank].g_iGlowColor[iPos], g_esTank[iType].g_iGlowColor[iPos], 1); - } - } + g_esSurvivorCache[survivor].g_sCarrierAttackVoicelines[0] = '\0'; + g_esSurvivorCache[survivor].g_sCarrierBaitVoicelines[0] = '\0'; + g_esSurvivorCache[survivor].g_flCarrierChance = 0.0; + g_esSurvivorCache[survivor].g_flCarrierDamageMultiplier = 0.0; + g_esSurvivorCache[survivor].g_flCarrierDelay = 0.0; + g_esSurvivorCache[survivor].g_flCarrierHealthMultiplier = 0.0; + g_esSurvivorCache[survivor].g_flCarrierVoiceChance = 0.0; + g_esSurvivorCache[survivor].g_flCarrierVoiceInterval = 0.0; + g_esSurvivorCache[survivor].g_iCarrierEnabled = 0; + g_esSurvivorCache[survivor].g_iCarrierBody = 0; + g_esSurvivorCache[survivor].g_iCarrierBots = 0; + g_esSurvivorCache[survivor].g_iCarrierCleanse = 0; + g_esSurvivorCache[survivor].g_iCarrierFilter = 0; + g_esSurvivorCache[survivor].g_iCarrierInfection = 0; + g_esSurvivorCache[survivor].g_iCarrierMaxType = 0; + g_esSurvivorCache[survivor].g_iCarrierMinType = 0; + g_esSurvivorCache[survivor].g_iCarrierMix = 0; + g_esSurvivorCache[survivor].g_iCarrierMode = 0; + g_esSurvivorCache[survivor].g_iCarrierTeleport = 0; + g_esSurvivorCache[survivor].g_iCarrierVoice = 0; + } + + g_esSurvivorCache[survivor].g_iPassiveBots = iGetSettingValue(bValid, true, g_esSurvivor[iType].g_iPassiveBots, g_esHuman.g_iPassiveBots, 1, -1); + g_esSurvivorCache[survivor].g_iPassiveBots = iGetSettingValue(bValid, bHuman, g_esShooter[survivor].g_iPassiveBots, g_esSurvivorCache[survivor].g_iPassiveBots, 1, -1); + g_esSurvivorCache[survivor].g_iPassiveEnabled = iGetSettingValue(bValid, true, g_esSurvivor[iType].g_iPassiveEnabled, g_esHuman.g_iPassiveEnabled, 1, -1); + g_esSurvivorCache[survivor].g_iPassiveEnabled = iGetSettingValue(bValid, bHuman, g_esShooter[survivor].g_iPassiveEnabled, g_esSurvivorCache[survivor].g_iPassiveEnabled, 1, -1); + + iEnabled = (bHuman ? g_esSurvivorCache[survivor].g_iPassiveEnabled : g_esSurvivorCache[survivor].g_iPassiveBots); + if (iEnabled >= 0) + { + g_esSurvivorCache[survivor].g_flActionDurationPassive = flGetSettingValue(bValid, true, g_esSurvivor[iType].g_flActionDurationPassive, g_esHuman.g_flActionDurationPassive, 1); + g_esSurvivorCache[survivor].g_flActionDurationPassive = flGetSettingValue(bValid, bHuman, g_esShooter[survivor].g_flActionDurationPassive, g_esSurvivorCache[survivor].g_flActionDurationPassive, 1); + g_esSurvivorCache[survivor].g_flAdrenalineTimePassive = flGetSettingValue(bValid, true, g_esSurvivor[iType].g_flAdrenalineTimePassive, g_esHuman.g_flAdrenalineTimePassive, 1); + g_esSurvivorCache[survivor].g_flAdrenalineTimePassive = flGetSettingValue(bValid, bHuman, g_esShooter[survivor].g_flAdrenalineTimePassive, g_esSurvivorCache[survivor].g_flAdrenalineTimePassive, 1); + g_esSurvivorCache[survivor].g_flAttackBoostPassive = flGetSettingValue(bValid, true, g_esSurvivor[iType].g_flAttackBoostPassive, g_esHuman.g_flAttackBoostPassive, 1); + g_esSurvivorCache[survivor].g_flAttackBoostPassive = flGetSettingValue(bValid, bHuman, g_esShooter[survivor].g_flAttackBoostPassive, g_esSurvivorCache[survivor].g_flAttackBoostPassive, 1); + g_esSurvivorCache[survivor].g_flDamageBoostPassive = flGetSettingValue(bValid, true, g_esSurvivor[iType].g_flDamageBoostPassive, g_esHuman.g_flDamageBoostPassive, 1); + g_esSurvivorCache[survivor].g_flDamageBoostPassive = flGetSettingValue(bValid, bHuman, g_esShooter[survivor].g_flDamageBoostPassive, g_esSurvivorCache[survivor].g_flDamageBoostPassive, 1); + g_esSurvivorCache[survivor].g_flDamageResistancePassive = flGetSettingValue(bValid, true, g_esSurvivor[iType].g_flDamageResistancePassive, g_esHuman.g_flDamageResistancePassive, 1); + g_esSurvivorCache[survivor].g_flDamageResistancePassive = flGetSettingValue(bValid, bHuman, g_esShooter[survivor].g_flDamageResistancePassive, g_esSurvivorCache[survivor].g_flDamageResistancePassive, 1); + g_esSurvivorCache[survivor].g_flDopamineRadiusPassive = flGetSettingValue(bValid, true, g_esSurvivor[iType].g_flDopamineRadiusPassive, g_esHuman.g_flDopamineRadiusPassive, 1); + g_esSurvivorCache[survivor].g_flDopamineRadiusPassive = flGetSettingValue(bValid, bHuman, g_esShooter[survivor].g_flDopamineRadiusPassive, g_esSurvivorCache[survivor].g_flDopamineRadiusPassive, 1); + g_esSurvivorCache[survivor].g_flFireRatePassive = flGetSettingValue(bValid, true, g_esSurvivor[iType].g_flFireRatePassive, g_esHuman.g_flFireRatePassive, 1); + g_esSurvivorCache[survivor].g_flFireRatePassive = flGetSettingValue(bValid, bHuman, g_esShooter[survivor].g_flFireRatePassive, g_esSurvivorCache[survivor].g_flFireRatePassive, 1); + g_esSurvivorCache[survivor].g_flGrenadeLauncherPassive = flGetSettingValue(bValid, true, g_esSurvivor[iType].g_flGrenadeLauncherPassive, g_esHuman.g_flGrenadeLauncherPassive, 1); + g_esSurvivorCache[survivor].g_flGrenadeLauncherPassive = flGetSettingValue(bValid, bHuman, g_esShooter[survivor].g_flGrenadeLauncherPassive, g_esSurvivorCache[survivor].g_flGrenadeLauncherPassive, 1); + g_esSurvivorCache[survivor].g_flHealPercentPassive = flGetSettingValue(bValid, true, g_esSurvivor[iType].g_flHealPercentPassive, g_esHuman.g_flHealPercentPassive, 1); + g_esSurvivorCache[survivor].g_flHealPercentPassive = flGetSettingValue(bValid, bHuman, g_esShooter[survivor].g_flHealPercentPassive, g_esSurvivorCache[survivor].g_flHealPercentPassive, 1); + g_esSurvivorCache[survivor].g_flHealthcareRadiusPassive = flGetSettingValue(bValid, true, g_esSurvivor[iType].g_flHealthcareRadiusPassive, g_esHuman.g_flHealthcareRadiusPassive, 1); + g_esSurvivorCache[survivor].g_flHealthcareRadiusPassive = flGetSettingValue(bValid, bHuman, g_esShooter[survivor].g_flHealthcareRadiusPassive, g_esSurvivorCache[survivor].g_flHealthcareRadiusPassive, 1); + g_esSurvivorCache[survivor].g_flHeartbeatPassive = flGetSettingValue(bValid, true, g_esSurvivor[iType].g_flHeartbeatPassive, g_esHuman.g_flHeartbeatPassive, 1); + g_esSurvivorCache[survivor].g_flHeartbeatPassive = flGetSettingValue(bValid, bHuman, g_esShooter[survivor].g_flHeartbeatPassive, g_esSurvivorCache[survivor].g_flHeartbeatPassive, 1); + g_esSurvivorCache[survivor].g_flJumpHeightPassive = flGetSettingValue(bValid, true, g_esSurvivor[iType].g_flJumpHeightPassive, g_esHuman.g_flJumpHeightPassive, 1); + g_esSurvivorCache[survivor].g_flJumpHeightPassive = flGetSettingValue(bValid, bHuman, g_esShooter[survivor].g_flJumpHeightPassive, g_esSurvivorCache[survivor].g_flJumpHeightPassive, 1); + g_esSurvivorCache[survivor].g_flLadyKillerPassive = flGetSettingValue(bValid, true, g_esSurvivor[iType].g_flLadyKillerPassive, g_esHuman.g_flLadyKillerPassive, 1); + g_esSurvivorCache[survivor].g_flLadyKillerPassive = flGetSettingValue(bValid, bHuman, g_esShooter[survivor].g_flLadyKillerPassive, g_esSurvivorCache[survivor].g_flLadyKillerPassive, 1); + g_esSurvivorCache[survivor].g_flLuckyBulletPassive = flGetSettingValue(bValid, true, g_esSurvivor[iType].g_flLuckyBulletPassive, g_esHuman.g_flLuckyBulletPassive, 1); + g_esSurvivorCache[survivor].g_flLuckyBulletPassive = flGetSettingValue(bValid, bHuman, g_esShooter[survivor].g_flLuckyBulletPassive, g_esSurvivorCache[survivor].g_flLuckyBulletPassive, 1); + g_esSurvivorCache[survivor].g_flMotivationRadiusPassive = flGetSettingValue(bValid, true, g_esSurvivor[iType].g_flMotivationRadiusPassive, g_esHuman.g_flMotivationRadiusPassive, 1); + g_esSurvivorCache[survivor].g_flMotivationRadiusPassive = flGetSettingValue(bValid, bHuman, g_esShooter[survivor].g_flMotivationRadiusPassive, g_esSurvivorCache[survivor].g_flMotivationRadiusPassive, 1); + g_esSurvivorCache[survivor].g_flOverdoseRadiusPassive = flGetSettingValue(bValid, true, g_esSurvivor[iType].g_flOverdoseRadiusPassive, g_esHuman.g_flOverdoseRadiusPassive, 1); + g_esSurvivorCache[survivor].g_flOverdoseRadiusPassive = flGetSettingValue(bValid, bHuman, g_esShooter[survivor].g_flOverdoseRadiusPassive, g_esSurvivorCache[survivor].g_flOverdoseRadiusPassive, 1); + g_esSurvivorCache[survivor].g_flPipeBombDurationPassive = flGetSettingValue(bValid, true, g_esSurvivor[iType].g_flPipeBombDurationPassive, g_esHuman.g_flPipeBombDurationPassive, 1); + g_esSurvivorCache[survivor].g_flPipeBombDurationPassive = flGetSettingValue(bValid, bHuman, g_esShooter[survivor].g_flPipeBombDurationPassive, g_esSurvivorCache[survivor].g_flPipeBombDurationPassive, 1); + g_esSurvivorCache[survivor].g_flPunchResistancePassive = flGetSettingValue(bValid, true, g_esSurvivor[iType].g_flPunchResistancePassive, g_esHuman.g_flPunchResistancePassive, 1); + g_esSurvivorCache[survivor].g_flPunchResistancePassive = flGetSettingValue(bValid, bHuman, g_esShooter[survivor].g_flPunchResistancePassive, g_esSurvivorCache[survivor].g_flPunchResistancePassive, 1); + g_esSurvivorCache[survivor].g_flRapidPistolPassive = flGetSettingValue(bValid, true, g_esSurvivor[iType].g_flRapidPistolPassive, g_esHuman.g_flRapidPistolPassive, 1); + g_esSurvivorCache[survivor].g_flRapidPistolPassive = flGetSettingValue(bValid, bHuman, g_esShooter[survivor].g_flRapidPistolPassive, g_esSurvivorCache[survivor].g_flRapidPistolPassive, 1); + g_esSurvivorCache[survivor].g_flRefillPercentPassive = flGetSettingValue(bValid, true, g_esSurvivor[iType].g_flRefillPercentPassive, g_esHuman.g_flRefillPercentPassive, 1); + g_esSurvivorCache[survivor].g_flRefillPercentPassive = flGetSettingValue(bValid, bHuman, g_esShooter[survivor].g_flRefillPercentPassive, g_esSurvivorCache[survivor].g_flRefillPercentPassive, 1); + g_esSurvivorCache[survivor].g_flReloadRatePassive = flGetSettingValue(bValid, true, g_esSurvivor[iType].g_flReloadRatePassive, g_esHuman.g_flReloadRatePassive, 1); + g_esSurvivorCache[survivor].g_flReloadRatePassive = flGetSettingValue(bValid, bHuman, g_esShooter[survivor].g_flReloadRatePassive, g_esSurvivorCache[survivor].g_flReloadRatePassive, 1); + g_esSurvivorCache[survivor].g_flShockwaveRadiusPassive = flGetSettingValue(bValid, true, g_esSurvivor[iType].g_flShockwaveRadiusPassive, g_esHuman.g_flShockwaveRadiusPassive, 1); + g_esSurvivorCache[survivor].g_flShockwaveRadiusPassive = flGetSettingValue(bValid, bHuman, g_esShooter[survivor].g_flShockwaveRadiusPassive, g_esSurvivorCache[survivor].g_flShockwaveRadiusPassive, 1); + g_esSurvivorCache[survivor].g_flShoveDamagePassive = flGetSettingValue(bValid, true, g_esSurvivor[iType].g_flShoveDamagePassive, g_esHuman.g_flShoveDamagePassive, 1); + g_esSurvivorCache[survivor].g_flShoveDamagePassive = flGetSettingValue(bValid, bHuman, g_esShooter[survivor].g_flShoveDamagePassive, g_esSurvivorCache[survivor].g_flShoveDamagePassive, 1); + g_esSurvivorCache[survivor].g_flShoveRatePassive = flGetSettingValue(bValid, true, g_esSurvivor[iType].g_flShoveRatePassive, g_esHuman.g_flShoveRatePassive, 1); + g_esSurvivorCache[survivor].g_flShoveRatePassive = flGetSettingValue(bValid, bHuman, g_esShooter[survivor].g_flShoveRatePassive, g_esSurvivorCache[survivor].g_flShoveRatePassive, 1); + g_esSurvivorCache[survivor].g_flSledgehammerRoundsPassive = flGetSettingValue(bValid, true, g_esSurvivor[iType].g_flSledgehammerRoundsPassive, g_esHuman.g_flSledgehammerRoundsPassive, 1); + g_esSurvivorCache[survivor].g_flSledgehammerRoundsPassive = flGetSettingValue(bValid, bHuman, g_esShooter[survivor].g_flSledgehammerRoundsPassive, g_esSurvivorCache[survivor].g_flSledgehammerRoundsPassive, 1); + g_esSurvivorCache[survivor].g_flSpeedBoostPassive = flGetSettingValue(bValid, true, g_esSurvivor[iType].g_flSpeedBoostPassive, g_esHuman.g_flSpeedBoostPassive, 1); + g_esSurvivorCache[survivor].g_flSpeedBoostPassive = flGetSettingValue(bValid, bHuman, g_esShooter[survivor].g_flSpeedBoostPassive, g_esSurvivorCache[survivor].g_flSpeedBoostPassive, 1); + g_esSurvivorCache[survivor].g_flSupplierPassive = flGetSettingValue(bValid, true, g_esSurvivor[iType].g_flSupplierPassive, g_esHuman.g_flSupplierPassive, 1); + g_esSurvivorCache[survivor].g_flSupplierPassive = flGetSettingValue(bValid, bHuman, g_esShooter[survivor].g_flSupplierPassive, g_esSurvivorCache[survivor].g_flSupplierPassive, 1); + g_esSurvivorCache[survivor].g_flSwingRatePassive = flGetSettingValue(bValid, true, g_esSurvivor[iType].g_flSwingRatePassive, g_esHuman.g_flSwingRatePassive, 1); + g_esSurvivorCache[survivor].g_flSwingRatePassive = flGetSettingValue(bValid, bHuman, g_esShooter[survivor].g_flSwingRatePassive, g_esSurvivorCache[survivor].g_flSwingRatePassive, 1); + g_esSurvivorCache[survivor].g_iAmmoBoostPassive = iGetSettingValue(bValid, true, g_esSurvivor[iType].g_iAmmoBoostPassive, g_esHuman.g_iAmmoBoostPassive, 1); + g_esSurvivorCache[survivor].g_iAmmoBoostPassive = iGetSettingValue(bValid, bHuman, g_esShooter[survivor].g_iAmmoBoostPassive, g_esSurvivorCache[survivor].g_iAmmoBoostPassive, 1); + g_esSurvivorCache[survivor].g_iAmmoRefillPassive = iGetSettingValue(bValid, true, g_esSurvivor[iType].g_iAmmoRefillPassive, g_esHuman.g_iAmmoRefillPassive, 1); + g_esSurvivorCache[survivor].g_iAmmoRefillPassive = iGetSettingValue(bValid, bHuman, g_esShooter[survivor].g_iAmmoRefillPassive, g_esSurvivorCache[survivor].g_iAmmoRefillPassive, 1); + g_esSurvivorCache[survivor].g_iAmmoRegenPassive = iGetSettingValue(bValid, true, g_esSurvivor[iType].g_iAmmoRegenPassive, g_esHuman.g_iAmmoRegenPassive, 1); + g_esSurvivorCache[survivor].g_iAmmoRegenPassive = iGetSettingValue(bValid, bHuman, g_esShooter[survivor].g_iAmmoRegenPassive, g_esSurvivorCache[survivor].g_iAmmoRegenPassive, 1); + g_esSurvivorCache[survivor].g_iBlazeHealthPassive = iGetSettingValue(bValid, true, g_esSurvivor[iType].g_iBlazeHealthPassive, g_esHuman.g_iBlazeHealthPassive, 1); + g_esSurvivorCache[survivor].g_iBlazeHealthPassive = iGetSettingValue(bValid, bHuman, g_esShooter[survivor].g_iBlazeHealthPassive, g_esSurvivorCache[survivor].g_iBlazeHealthPassive, 1); + g_esSurvivorCache[survivor].g_iBloodDonorPassive = iGetSettingValue(bValid, true, g_esSurvivor[iType].g_iBloodDonorPassive, g_esHuman.g_iBloodDonorPassive, 1); + g_esSurvivorCache[survivor].g_iBloodDonorPassive = iGetSettingValue(bValid, bHuman, g_esShooter[survivor].g_iBloodDonorPassive, g_esSurvivorCache[survivor].g_iBloodDonorPassive, 1); + g_esSurvivorCache[survivor].g_iBunnyHopPassive = iGetSettingValue(bValid, true, g_esSurvivor[iType].g_iBunnyHopPassive, g_esHuman.g_iBunnyHopPassive, 1); + g_esSurvivorCache[survivor].g_iBunnyHopPassive = iGetSettingValue(bValid, bHuman, g_esShooter[survivor].g_iBunnyHopPassive, g_esSurvivorCache[survivor].g_iBunnyHopPassive, 1); + g_esSurvivorCache[survivor].g_iBurstDoorsPassive = iGetSettingValue(bValid, true, g_esSurvivor[iType].g_iBurstDoorsPassive, g_esHuman.g_iBurstDoorsPassive, 1); + g_esSurvivorCache[survivor].g_iBurstDoorsPassive = iGetSettingValue(bValid, bHuman, g_esShooter[survivor].g_iBurstDoorsPassive, g_esSurvivorCache[survivor].g_iBurstDoorsPassive, 1); + g_esSurvivorCache[survivor].g_iCleanKillsPassive = iGetSettingValue(bValid, true, g_esSurvivor[iType].g_iCleanKillsPassive, g_esHuman.g_iCleanKillsPassive, 1); + g_esSurvivorCache[survivor].g_iCleanKillsPassive = iGetSettingValue(bValid, bHuman, g_esShooter[survivor].g_iCleanKillsPassive, g_esSurvivorCache[survivor].g_iCleanKillsPassive, 1); + g_esSurvivorCache[survivor].g_iClusterBombsPassive = iGetSettingValue(bValid, true, g_esSurvivor[iType].g_iClusterBombsPassive, g_esHuman.g_iClusterBombsPassive, 1); + g_esSurvivorCache[survivor].g_iClusterBombsPassive = iGetSettingValue(bValid, bHuman, g_esShooter[survivor].g_iClusterBombsPassive, g_esSurvivorCache[survivor].g_iClusterBombsPassive, 1); + g_esSurvivorCache[survivor].g_iEternalFlamesPassive = iGetSettingValue(bValid, true, g_esSurvivor[iType].g_iEternalFlamesPassive, g_esHuman.g_iEternalFlamesPassive, 1); + g_esSurvivorCache[survivor].g_iEternalFlamesPassive = iGetSettingValue(bValid, bHuman, g_esShooter[survivor].g_iEternalFlamesPassive, g_esSurvivorCache[survivor].g_iEternalFlamesPassive, 1); + g_esSurvivorCache[survivor].g_iFastRecoveryPassive = iGetSettingValue(bValid, true, g_esSurvivor[iType].g_iFastRecoveryPassive, g_esHuman.g_iFastRecoveryPassive, 1); + g_esSurvivorCache[survivor].g_iFastRecoveryPassive = iGetSettingValue(bValid, bHuman, g_esShooter[survivor].g_iFastRecoveryPassive, g_esSurvivorCache[survivor].g_iFastRecoveryPassive, 1); + g_esSurvivorCache[survivor].g_iFriendlyFirePassive = iGetSettingValue(bValid, true, g_esSurvivor[iType].g_iFriendlyFirePassive, g_esHuman.g_iFriendlyFirePassive, 1); + g_esSurvivorCache[survivor].g_iFriendlyFirePassive = iGetSettingValue(bValid, bHuman, g_esShooter[survivor].g_iFriendlyFirePassive, g_esSurvivorCache[survivor].g_iFriendlyFirePassive, 1); + g_esSurvivorCache[survivor].g_iGhostBulletsPassive = iGetSettingValue(bValid, true, g_esSurvivor[iType].g_iGhostBulletsPassive, g_esHuman.g_iGhostBulletsPassive, 1); + g_esSurvivorCache[survivor].g_iGhostBulletsPassive = iGetSettingValue(bValid, bHuman, g_esShooter[survivor].g_iGhostBulletsPassive, g_esSurvivorCache[survivor].g_iGhostBulletsPassive, 1); + g_esSurvivorCache[survivor].g_iHealthRegenPassive = iGetSettingValue(bValid, true, g_esSurvivor[iType].g_iHealthRegenPassive, g_esHuman.g_iHealthRegenPassive, 1); + g_esSurvivorCache[survivor].g_iHealthRegenPassive = iGetSettingValue(bValid, bHuman, g_esShooter[survivor].g_iHealthRegenPassive, g_esSurvivorCache[survivor].g_iHealthRegenPassive, 1); + g_esSurvivorCache[survivor].g_flHollowpointAmmoPassive = flGetSettingValue(bValid, true, g_esSurvivor[iType].g_flHollowpointAmmoPassive, g_esHuman.g_flHollowpointAmmoPassive, 1); + g_esSurvivorCache[survivor].g_flHollowpointAmmoPassive = flGetSettingValue(bValid, bHuman, g_esShooter[survivor].g_flHollowpointAmmoPassive, g_esSurvivorCache[survivor].g_flHollowpointAmmoPassive, 1); + g_esSurvivorCache[survivor].g_iInfiniteAmmoPassive = iGetSettingValue(bValid, true, g_esSurvivor[iType].g_iInfiniteAmmoPassive, g_esHuman.g_iInfiniteAmmoPassive, 1); + g_esSurvivorCache[survivor].g_iInfiniteAmmoPassive = iGetSettingValue(bValid, bHuman, g_esShooter[survivor].g_iInfiniteAmmoPassive, g_esSurvivorCache[survivor].g_iInfiniteAmmoPassive, 1); + g_esSurvivorCache[survivor].g_iLadderActionsPassive = iGetSettingValue(bValid, true, g_esSurvivor[iType].g_iLadderActionsPassive, g_esHuman.g_iLadderActionsPassive, 1); + g_esSurvivorCache[survivor].g_iLadderActionsPassive = iGetSettingValue(bValid, bHuman, g_esShooter[survivor].g_iLadderActionsPassive, g_esSurvivorCache[survivor].g_iLadderActionsPassive, 1); + g_esSurvivorCache[survivor].g_iLaserSightPassive = iGetSettingValue(bValid, true, g_esSurvivor[iType].g_iLaserSightPassive, g_esHuman.g_iLaserSightPassive, 1); + g_esSurvivorCache[survivor].g_iLaserSightPassive = iGetSettingValue(bValid, bHuman, g_esShooter[survivor].g_iLaserSightPassive, g_esSurvivorCache[survivor].g_iLaserSightPassive, 1); + g_esSurvivorCache[survivor].g_iLifeLeechPassive = iGetSettingValue(bValid, true, g_esSurvivor[iType].g_iLifeLeechPassive, g_esHuman.g_iLifeLeechPassive, 1); + g_esSurvivorCache[survivor].g_iLifeLeechPassive = iGetSettingValue(bValid, bHuman, g_esShooter[survivor].g_iLifeLeechPassive, g_esSurvivorCache[survivor].g_iLifeLeechPassive, 1); + g_esSurvivorCache[survivor].g_iMedicalCutsPassive = iGetSettingValue(bValid, true, g_esSurvivor[iType].g_iMedicalCutsPassive, g_esHuman.g_iMedicalCutsPassive, 1); + g_esSurvivorCache[survivor].g_iMedicalCutsPassive = iGetSettingValue(bValid, bHuman, g_esShooter[survivor].g_iMedicalCutsPassive, g_esSurvivorCache[survivor].g_iMedicalCutsPassive, 1); + g_esSurvivorCache[survivor].g_iMeleeRangePassive = iGetSettingValue(bValid, true, g_esSurvivor[iType].g_iMeleeRangePassive, g_esHuman.g_iMeleeRangePassive, 1); + g_esSurvivorCache[survivor].g_iMeleeRangePassive = iGetSettingValue(bValid, bHuman, g_esShooter[survivor].g_iMeleeRangePassive, g_esSurvivorCache[survivor].g_iMeleeRangePassive, 1); + g_esSurvivorCache[survivor].g_iMidairDashesPassive = iGetSettingValue(bValid, true, g_esSurvivor[iType].g_iMidairDashesPassive, g_esHuman.g_iMidairDashesPassive, 1); + g_esSurvivorCache[survivor].g_iMidairDashesPassive = iGetSettingValue(bValid, bHuman, g_esShooter[survivor].g_iMidairDashesPassive, g_esSurvivorCache[survivor].g_iMidairDashesPassive, 1); + g_esSurvivorCache[survivor].g_iOverhealthPassive = iGetSettingValue(bValid, true, g_esSurvivor[iType].g_iOverhealthPassive, g_esHuman.g_iOverhealthPassive, 1); + g_esSurvivorCache[survivor].g_iOverhealthPassive = iGetSettingValue(bValid, bHuman, g_esShooter[survivor].g_iOverhealthPassive, g_esSurvivorCache[survivor].g_iOverhealthPassive, 1); + g_esSurvivorCache[survivor].g_iPassiveNotify = iGetSettingValue(bValid, true, g_esSurvivor[iType].g_iPassiveNotify, g_esHuman.g_iPassiveNotify, 1); + g_esSurvivorCache[survivor].g_iPassiveNotify = iGetSettingValue(bValid, bHuman, g_esShooter[survivor].g_iPassiveNotify, g_esSurvivorCache[survivor].g_iPassiveNotify, 1); + g_esSurvivorCache[survivor].g_iRecoilDampenerPassive = iGetSettingValue(bValid, true, g_esSurvivor[iType].g_iRecoilDampenerPassive, g_esHuman.g_iRecoilDampenerPassive, 1); + g_esSurvivorCache[survivor].g_iRecoilDampenerPassive = iGetSettingValue(bValid, bHuman, g_esShooter[survivor].g_iRecoilDampenerPassive, g_esSurvivorCache[survivor].g_iRecoilDampenerPassive, 1); + g_esSurvivorCache[survivor].g_iRegenBurstsPassive = iGetSettingValue(bValid, true, g_esSurvivor[iType].g_iRegenBurstsPassive, g_esHuman.g_iRegenBurstsPassive, 1); + g_esSurvivorCache[survivor].g_iRegenBurstsPassive = iGetSettingValue(bValid, bHuman, g_esShooter[survivor].g_iRegenBurstsPassive, g_esSurvivorCache[survivor].g_iRegenBurstsPassive, 1); + g_esSurvivorCache[survivor].g_iRespawnLoadoutPassive = iGetSettingValue(bValid, true, g_esSurvivor[iType].g_iRespawnLoadoutPassive, g_esHuman.g_iRespawnLoadoutPassive, 1); + g_esSurvivorCache[survivor].g_iRespawnLoadoutPassive = iGetSettingValue(bValid, bHuman, g_esShooter[survivor].g_iRespawnLoadoutPassive, g_esSurvivorCache[survivor].g_iRespawnLoadoutPassive, 1); + g_esSurvivorCache[survivor].g_iReviveHealthPassive = iGetSettingValue(bValid, true, g_esSurvivor[iType].g_iReviveHealthPassive, g_esHuman.g_iReviveHealthPassive, 1); + g_esSurvivorCache[survivor].g_iReviveHealthPassive = iGetSettingValue(bValid, bHuman, g_esShooter[survivor].g_iReviveHealthPassive, g_esSurvivorCache[survivor].g_iReviveHealthPassive, 1); + g_esSurvivorCache[survivor].g_iRiotGearPassive = iGetSettingValue(bValid, true, g_esSurvivor[iType].g_iRiotGearPassive, g_esHuman.g_iRiotGearPassive, 1); + g_esSurvivorCache[survivor].g_iRiotGearPassive = iGetSettingValue(bValid, bHuman, g_esShooter[survivor].g_iRiotGearPassive, g_esSurvivorCache[survivor].g_iRiotGearPassive, 1); + g_esSurvivorCache[survivor].g_iSafetyBubblePassive = iGetSettingValue(bValid, true, g_esSurvivor[iType].g_iSafetyBubblePassive, g_esHuman.g_iSafetyBubblePassive, 1); + g_esSurvivorCache[survivor].g_iSafetyBubblePassive = iGetSettingValue(bValid, bHuman, g_esShooter[survivor].g_iSafetyBubblePassive, g_esSurvivorCache[survivor].g_iSafetyBubblePassive, 1); + g_esSurvivorCache[survivor].g_iShovePenaltyPassive = iGetSettingValue(bValid, true, g_esSurvivor[iType].g_iShovePenaltyPassive, g_esHuman.g_iShovePenaltyPassive, 1); + g_esSurvivorCache[survivor].g_iShovePenaltyPassive = iGetSettingValue(bValid, bHuman, g_esShooter[survivor].g_iShovePenaltyPassive, g_esSurvivorCache[survivor].g_iShovePenaltyPassive, 1); + g_esSurvivorCache[survivor].g_iSpecialAmmoPassive = iGetSettingValue(bValid, true, g_esSurvivor[iType].g_iSpecialAmmoPassive, g_esHuman.g_iSpecialAmmoPassive, 1); + g_esSurvivorCache[survivor].g_iSpecialAmmoPassive = iGetSettingValue(bValid, bHuman, g_esShooter[survivor].g_iSpecialAmmoPassive, g_esSurvivorCache[survivor].g_iSpecialAmmoPassive, 1); + g_esSurvivorCache[survivor].g_iStickyGrenadesPassive = iGetSettingValue(bValid, true, g_esSurvivor[iType].g_iStickyGrenadesPassive, g_esHuman.g_iStickyGrenadesPassive, 1); + g_esSurvivorCache[survivor].g_iStickyGrenadesPassive = iGetSettingValue(bValid, bHuman, g_esShooter[survivor].g_iStickyGrenadesPassive, g_esSurvivorCache[survivor].g_iStickyGrenadesPassive, 1); + g_esSurvivorCache[survivor].g_iSyringeDartsPassive = iGetSettingValue(bValid, true, g_esSurvivor[iType].g_iSyringeDartsPassive, g_esHuman.g_iSyringeDartsPassive, 1); + g_esSurvivorCache[survivor].g_iSyringeDartsPassive = iGetSettingValue(bValid, bHuman, g_esShooter[survivor].g_iSyringeDartsPassive, g_esSurvivorCache[survivor].g_iSyringeDartsPassive, 1); + g_esSurvivorCache[survivor].g_iThornsPassive = iGetSettingValue(bValid, true, g_esSurvivor[iType].g_iThornsPassive, g_esHuman.g_iThornsPassive, 1); + g_esSurvivorCache[survivor].g_iThornsPassive = iGetSettingValue(bValid, bHuman, g_esShooter[survivor].g_iThornsPassive, g_esSurvivorCache[survivor].g_iThornsPassive, 1); + + vGetSettingValue(bValid, true, g_esSurvivorCache[survivor].g_sItemPassive, sizeof esSurvivorCache::g_sItemPassive, g_esSurvivor[iType].g_sItemPassive, g_esHuman.g_sItemPassive); + vGetSettingValue(bValid, bHuman, g_esSurvivorCache[survivor].g_sItemPassive, sizeof esSurvivorCache::g_sItemPassive, g_esShooter[survivor].g_sItemPassive, g_esSurvivorCache[survivor].g_sItemPassive); } else { - g_esCache[tank].g_sBodyColorVisual[0] = '\0'; - g_esCache[tank].g_sBodyColorVisual2[0] = '\0'; - g_esCache[tank].g_sBodyColorVisual3[0] = '\0'; - g_esCache[tank].g_sBodyColorVisual4[0] = '\0'; - g_esCache[tank].g_sComboSet[0] = '\0'; - g_esCache[tank].g_sFallVoicelineReward[0] = '\0'; - g_esCache[tank].g_sFallVoicelineReward2[0] = '\0'; - g_esCache[tank].g_sFallVoicelineReward3[0] = '\0'; - g_esCache[tank].g_sFallVoicelineReward4[0] = '\0'; - g_esCache[tank].g_sFlameColor[0] = '\0'; - g_esCache[tank].g_sFlashlightColor[0] = '\0'; - g_esCache[tank].g_sGlowColor[0] = '\0'; - g_esCache[tank].g_sHealthCharacters[0] = '\0'; - g_esCache[tank].g_sItemReward[0] = '\0'; - g_esCache[tank].g_sLightColorVisual[0] = '\0'; - g_esCache[tank].g_sLightColorVisual2[0] = '\0'; - g_esCache[tank].g_sLightColorVisual3[0] = '\0'; - g_esCache[tank].g_sLightColorVisual4[0] = '\0'; - g_esCache[tank].g_sLoopingVoicelineVisual[0] = '\0'; - g_esCache[tank].g_sLoopingVoicelineVisual2[0] = '\0'; - g_esCache[tank].g_sLoopingVoicelineVisual3[0] = '\0'; - g_esCache[tank].g_sLoopingVoicelineVisual4[0] = '\0'; - g_esCache[tank].g_sOutlineColorVisual[0] = '\0'; - g_esCache[tank].g_sOutlineColorVisual2[0] = '\0'; - g_esCache[tank].g_sOutlineColorVisual3[0] = '\0'; - g_esCache[tank].g_sOutlineColorVisual4[0] = '\0'; - g_esCache[tank].g_sOzTankColor[0] = '\0'; - g_esCache[tank].g_sPropTankColor[0] = '\0'; - g_esCache[tank].g_sRockColor[0] = '\0'; - g_esCache[tank].g_sScreenColorVisual[0] = '\0'; - g_esCache[tank].g_sScreenColorVisual2[0] = '\0'; - g_esCache[tank].g_sScreenColorVisual3[0] = '\0'; - g_esCache[tank].g_sScreenColorVisual4[0] = '\0'; - g_esCache[tank].g_sSkinColor[0] = '\0'; - g_esCache[tank].g_sTankName[0] = '\0'; - g_esCache[tank].g_sTireColor[0] = '\0'; - g_esCache[tank].g_flArmorDuration = 0.0; - g_esCache[tank].g_flArmorResistance = 0.0; - g_esCache[tank].g_flAttackInterval = 0.0; - g_esCache[tank].g_flBurnDuration = 0.0; - g_esCache[tank].g_flBurntSkin = -1.0; - g_esCache[tank].g_flClawDamage = -1.0; - g_esCache[tank].g_flHealPercentMultiplier = 1.0; - g_esCache[tank].g_flHittableDamage = -1.0; - g_esCache[tank].g_flIncapDamageMultiplier = 1.0; - g_esCache[tank].g_flMeleeHitValue = 0.0; - g_esCache[tank].g_flPunchForce = -1.0; - g_esCache[tank].g_flPunchThrow = 0.0; - g_esCache[tank].g_flRandomDuration = 0.0; - g_esCache[tank].g_flRandomInterval = 0.0; - g_esCache[tank].g_flRockDamage = -1.0; - g_esCache[tank].g_flRunSpeed = 0.0; - g_esCache[tank].g_flShieldDuration = 0.0; - g_esCache[tank].g_flShieldResistance = 0.0; - g_esCache[tank].g_flThrowForce = 0.0; - g_esCache[tank].g_flThrowInterval = 0.0; - g_esCache[tank].g_flTransformDelay = 0.0; - g_esCache[tank].g_flTransformDuration = 0.0; - g_esCache[tank].g_iAnnounceArrival = 0; - g_esCache[tank].g_iAnnounceDeath = 0; - g_esCache[tank].g_iAnnounceKill = 0; - g_esCache[tank].g_iArrivalMessage = 0; - g_esCache[tank].g_iArrivalSound = 0; - g_esCache[tank].g_iAutoAggravate = 0; - g_esCache[tank].g_iBaseHealth = 0; - g_esCache[tank].g_iBodyEffects = 0; - g_esCache[tank].g_iBossEffects = 0; - g_esCache[tank].g_iBossStages = 0; - g_esCache[tank].g_iBulletImmunity = 0; - g_esCache[tank].g_iCheckAbilities = 0; - g_esCache[tank].g_iDeathDetails = 0; - g_esCache[tank].g_iDeathMessage = 0; - g_esCache[tank].g_iDeathRevert = 0; - g_esCache[tank].g_iDeathSound = 0; - g_esCache[tank].g_iDisplayHealth = 0; - g_esCache[tank].g_iDisplayHealthType = 0; - g_esCache[tank].g_iExplosiveImmunity = 0; - g_esCache[tank].g_iExtraHealth = 0; - g_esCache[tank].g_iFireImmunity = 0; - g_esCache[tank].g_iFootstepShake = 1; - g_esCache[tank].g_iGlowEnabled = 0; - g_esCache[tank].g_iGlowFlashing = 0; - g_esCache[tank].g_iGlowMaxRange = 0; - g_esCache[tank].g_iGlowMinRange = 0; - g_esCache[tank].g_iGlowType = 0; - g_esCache[tank].g_iGroundPound = 0; - g_esCache[tank].g_iHittableImmunity = 0; - g_esCache[tank].g_iHumanMultiplierMode = 0; - g_esCache[tank].g_iIntangibleBody = 0; - g_esCache[tank].g_iKillMessage = 0; - g_esCache[tank].g_iMeleeHitMode = 0; - g_esCache[tank].g_iMeleeImmunity = 0; - g_esCache[tank].g_iMinimumHumans = 0; - g_esCache[tank].g_iMultiplyHealth = 0; - g_esCache[tank].g_iPrioritizeThrows = 0; - g_esCache[tank].g_iPropsAttached = 0; - g_esCache[tank].g_iRandomTank = 0; - g_esCache[tank].g_iRockEffects = 0; - g_esCache[tank].g_iRockModel = 0; - g_esCache[tank].g_iRockSound = 0; - g_esCache[tank].g_iSkipIncap = 0; - g_esCache[tank].g_iSkipTaunt = 0; - g_esCache[tank].g_iSpawnProtection = 0; - g_esCache[tank].g_iSpawnType = 0; - g_esCache[tank].g_iSweepFist = 0; - g_esCache[tank].g_iTankModel = 0; - g_esCache[tank].g_iTankNote = 0; - g_esCache[tank].g_iTeammateLimit = 0; - g_esCache[tank].g_iThrowRock = 0; - g_esCache[tank].g_iVocalizeArrival = 0; - g_esCache[tank].g_iVocalizeDeath = 0; - g_esCache[tank].g_iVomitImmunity = 0; - - for (int iPos = 0; iPos < (sizeof esCache::g_iTransformType); iPos++) - { - g_esCache[tank].g_iTransformType[iPos] = 0; - - if (iPos < (sizeof esCache::g_iRewardEnabled)) - { - g_esCache[tank].g_flActionDurationReward[iPos] = 0.0; - g_esCache[tank].g_iAmmoBoostReward[iPos] = 0; - g_esCache[tank].g_iAmmoRegenReward[iPos] = 0; - g_esCache[tank].g_flAttackBoostReward[iPos] = 0.0; - g_esCache[tank].g_iBlazeHealthReward[iPos] = 0; - g_esCache[tank].g_iBunnyHopReward[iPos] = 0; - g_esCache[tank].g_iBurstDoorsReward[iPos] = 0; - g_esCache[tank].g_iCleanKillsReward[iPos] = 0; - g_esCache[tank].g_iClusterBombsReward[iPos] = 0; - g_esCache[tank].g_flDamageBoostReward[iPos] = 0.0; - g_esCache[tank].g_flDamageResistanceReward[iPos] = 0.0; - g_esCache[tank].g_iFriendlyFireReward[iPos] = 0; - g_esCache[tank].g_iGhostBulletsReward[iPos] = 0; - g_esCache[tank].g_flHealPercentReward[iPos] = 0.0; - g_esCache[tank].g_iHealthRegenReward[iPos] = 0; - g_esCache[tank].g_iHollowpointAmmoReward[iPos] = 0; - g_esCache[tank].g_flJumpHeightReward[iPos] = 0.0; - g_esCache[tank].g_iInextinguishableFireReward[iPos] = 0; - g_esCache[tank].g_iInfiniteAmmoReward[iPos] = 0; - g_esCache[tank].g_iLadderActionsReward[iPos] = 0; - g_esCache[tank].g_iLadyKillerReward[iPos] = 0; - g_esCache[tank].g_iLaserSightReward[iPos] = 0; - g_esCache[tank].g_iLifeLeechReward[iPos] = 0; - g_esCache[tank].g_flLoopingVoicelineInterval[iPos] = 0.0; - g_esCache[tank].g_iMedicalCutsReward[iPos] = 0; - g_esCache[tank].g_iMeleeRangeReward[iPos] = 0; - g_esCache[tank].g_iMidairDashesReward[iPos] = 0; - g_esCache[tank].g_iParticleEffectVisual[iPos] = 0; - g_esCache[tank].g_flPipeBombDurationReward[iPos] = 0.0; - g_esCache[tank].g_iPrefsNotify[iPos] = 0; - g_esCache[tank].g_flPunchResistanceReward[iPos] = 0.0; - g_esCache[tank].g_flRapidPistolReward[iPos] = 0.0; - g_esCache[tank].g_iRecoilDampenerReward[iPos] = 0; - g_esCache[tank].g_flRefillPercentReward[iPos] = 0.0; - g_esCache[tank].g_iRegenBurstsReward[iPos] = 0; - g_esCache[tank].g_iRespawnLoadoutReward[iPos] = 0; - g_esCache[tank].g_iReviveHealthReward[iPos] = 0; - g_esCache[tank].g_iRewardBots[iPos] = -1; - g_esCache[tank].g_flRewardChance[iPos] = 0.0; - g_esCache[tank].g_flRewardDuration[iPos] = 0.0; - g_esCache[tank].g_iRewardEffect[iPos] = 0; - g_esCache[tank].g_iRewardEnabled[iPos] = -1; - g_esCache[tank].g_iRewardNotify[iPos] = 0; - g_esCache[tank].g_flRewardPercentage[iPos] = 0.0; - g_esCache[tank].g_iRewardVisual[iPos] = 0; - g_esCache[tank].g_iShareRewards[iPos] = 0; - g_esCache[tank].g_flShoveDamageReward[iPos] = 0.0; - g_esCache[tank].g_iShovePenaltyReward[iPos] = 0; - g_esCache[tank].g_flShoveRateReward[iPos] = 0.0; - g_esCache[tank].g_iSledgehammerRoundsReward[iPos] = 0; - g_esCache[tank].g_iSpecialAmmoReward[iPos] = 0; - g_esCache[tank].g_flSpeedBoostReward[iPos] = 0.0; - g_esCache[tank].g_iStackRewards[iPos] = 0; - g_esCache[tank].g_iStickyGrenadesReward[iPos] = 0; - g_esCache[tank].g_iSyringeDartsReward[iPos] = 0; - g_esCache[tank].g_iThornsReward[iPos] = 0; - g_esCache[tank].g_iUsefulRewards[iPos] = 0; - g_esCache[tank].g_iVoicePitchVisual[iPos] = 0; - } - - if (iPos < (sizeof esCache::g_iStackLimits)) - { - g_esCache[tank].g_iStackLimits[iPos] = 0; - } - - if (iPos < (sizeof esCache::g_flComboChance)) - { - g_esCache[tank].g_flComboChance[iPos] = 0.0; - g_esCache[tank].g_iComboCooldown[iPos] = 0; - g_esCache[tank].g_flComboDamage[iPos] = 0.0; - g_esCache[tank].g_flComboDeathChance[iPos] = 0.0; - g_esCache[tank].g_flComboDeathRange[iPos] = 0.0; - g_esCache[tank].g_flComboDelay[iPos] = 0.0; - g_esCache[tank].g_flComboDuration[iPos] = 0.0; - g_esCache[tank].g_flComboInterval[iPos] = 0.0; - g_esCache[tank].g_flComboMinRadius[iPos] = 0.0; - g_esCache[tank].g_flComboMaxRadius[iPos] = 0.0; - g_esCache[tank].g_flComboRange[iPos] = 0.0; - g_esCache[tank].g_flComboRangeChance[iPos] = 0.0; - g_esCache[tank].g_iComboRangeCooldown[iPos] = 0; - g_esCache[tank].g_flComboRockChance[iPos] = 0.0; - g_esCache[tank].g_iComboRockCooldown[iPos] = 0; - g_esCache[tank].g_flComboSpeed[iPos] = 0.0; - } - - if (iPos < (sizeof esCache::g_flComboTypeChance)) - { - g_esCache[tank].g_flComboTypeChance[iPos] = 0.0; - } - - if (iPos < (sizeof esCache::g_flPropsChance)) - { - g_esCache[tank].g_flPropsChance[iPos] = 0.0; - } - - if (iPos < (sizeof esCache::g_iSkinColor)) - { - g_esCache[tank].g_iSkinColor[iPos] = 255; - g_esCache[tank].g_iBossHealth[iPos] = 0; - g_esCache[tank].g_iBossType[iPos] = 0; - g_esCache[tank].g_iLightColor[iPos] = 255; - g_esCache[tank].g_iOzTankColor[iPos] = 255; - g_esCache[tank].g_iFlameColor[iPos] = 255; - g_esCache[tank].g_iRockColor[iPos] = 255; - g_esCache[tank].g_iTireColor[iPos] = 255; - g_esCache[tank].g_iPropTankColor[iPos] = 255; - g_esCache[tank].g_iFlashlightColor[iPos] = 255; - g_esCache[tank].g_iCrownColor[iPos] = 255; - } - - if (iPos < (sizeof esCache::g_iGlowColor)) - { - g_esCache[tank].g_iGlowColor[iPos] = 255; - } - } + g_esSurvivorCache[survivor].g_sItemPassive[0] = '\0'; + g_esSurvivorCache[survivor].g_flActionDurationPassive = 0.0; + g_esSurvivorCache[survivor].g_flAdrenalineTimePassive = 0.0; + g_esSurvivorCache[survivor].g_flAttackBoostPassive = 0.0; + g_esSurvivorCache[survivor].g_flDamageBoostPassive = 0.0; + g_esSurvivorCache[survivor].g_flDamageResistancePassive = 0.0; + g_esSurvivorCache[survivor].g_flDopamineRadiusPassive = 0.0; + g_esSurvivorCache[survivor].g_flFireRatePassive = 0.0; + g_esSurvivorCache[survivor].g_flGrenadeLauncherPassive = 0.0; + g_esSurvivorCache[survivor].g_flHealPercentPassive = 0.0; + g_esSurvivorCache[survivor].g_flHealthcareRadiusPassive = 0.0; + g_esSurvivorCache[survivor].g_flHeartbeatPassive = 0.0; + g_esSurvivorCache[survivor].g_flHollowpointAmmoPassive = 0.0; + g_esSurvivorCache[survivor].g_flJumpHeightPassive = 0.0; + g_esSurvivorCache[survivor].g_flLadyKillerPassive = 0.0; + g_esSurvivorCache[survivor].g_flLuckyBulletPassive = 0.0; + g_esSurvivorCache[survivor].g_flMotivationRadiusPassive = 0.0; + g_esSurvivorCache[survivor].g_flOverdoseRadiusPassive = 0.0; + g_esSurvivorCache[survivor].g_flPipeBombDurationPassive = 0.0; + g_esSurvivorCache[survivor].g_flPunchResistancePassive = 0.0; + g_esSurvivorCache[survivor].g_flRapidPistolPassive = 0.0; + g_esSurvivorCache[survivor].g_flRefillPercentPassive = 0.0; + g_esSurvivorCache[survivor].g_flReloadRatePassive = 0.0; + g_esSurvivorCache[survivor].g_flShockwaveRadiusPassive = 0.0; + g_esSurvivorCache[survivor].g_flShoveDamagePassive = 0.0; + g_esSurvivorCache[survivor].g_flShoveRatePassive = 0.0; + g_esSurvivorCache[survivor].g_flSledgehammerRoundsPassive = 0.0; + g_esSurvivorCache[survivor].g_flSpeedBoostPassive = 0.0; + g_esSurvivorCache[survivor].g_flSupplierPassive = 0.0; + g_esSurvivorCache[survivor].g_flSwingRatePassive = 0.0; + g_esSurvivorCache[survivor].g_iAmmoBoostPassive = 0; + g_esSurvivorCache[survivor].g_iAmmoRefillPassive = 0; + g_esSurvivorCache[survivor].g_iAmmoRegenPassive = 0; + g_esSurvivorCache[survivor].g_iBlazeHealthPassive = 0; + g_esSurvivorCache[survivor].g_iBloodDonorPassive = 0; + g_esSurvivorCache[survivor].g_iBunnyHopPassive = 0; + g_esSurvivorCache[survivor].g_iBurstDoorsPassive = 0; + g_esSurvivorCache[survivor].g_iCleanKillsPassive = 0; + g_esSurvivorCache[survivor].g_iClusterBombsPassive = 0; + g_esSurvivorCache[survivor].g_iEternalFlamesPassive = 0; + g_esSurvivorCache[survivor].g_iFastRecoveryPassive = 0; + g_esSurvivorCache[survivor].g_iFriendlyFirePassive = 0; + g_esSurvivorCache[survivor].g_iGhostBulletsPassive = 0; + g_esSurvivorCache[survivor].g_iHealthRegenPassive = 0; + g_esSurvivorCache[survivor].g_iInfiniteAmmoPassive = 0; + g_esSurvivorCache[survivor].g_iLadderActionsPassive = 0; + g_esSurvivorCache[survivor].g_iLaserSightPassive = 0; + g_esSurvivorCache[survivor].g_iLifeLeechPassive = 0; + g_esSurvivorCache[survivor].g_iMedicalCutsPassive = 0; + g_esSurvivorCache[survivor].g_iMeleeRangePassive = 0; + g_esSurvivorCache[survivor].g_iMidairDashesPassive = 0; + g_esSurvivorCache[survivor].g_iOverhealthPassive = 0; + g_esSurvivorCache[survivor].g_iPassiveNotify = 0; + g_esSurvivorCache[survivor].g_iRecoilDampenerPassive = 0; + g_esSurvivorCache[survivor].g_iRegenBurstsPassive = 0; + g_esSurvivorCache[survivor].g_iRespawnLoadoutPassive = 0; + g_esSurvivorCache[survivor].g_iReviveHealthPassive = 0; + g_esSurvivorCache[survivor].g_iRiotGearPassive = 0; + g_esSurvivorCache[survivor].g_iSafetyBubblePassive = 0; + g_esSurvivorCache[survivor].g_iShovePenaltyPassive = 0; + g_esSurvivorCache[survivor].g_iSpecialAmmoPassive = 0; + g_esSurvivorCache[survivor].g_iStickyGrenadesPassive = 0; + g_esSurvivorCache[survivor].g_iSyringeDartsPassive = 0; + g_esSurvivorCache[survivor].g_iThornsPassive = 0; } } Call_StartForward(g_esGeneral.g_gfSettingsCachedForward); - Call_PushCell(tank); - Call_PushCell(bAccess); - Call_PushCell(g_esTank[iType].g_iRealType[0]); + Call_PushCell(survivor); + Call_PushCell(bValid); + Call_PushCell(0); Call_Finish(); } @@ -16486,21 +20949,32 @@ void vDeveloperSettings(int developer) g_esDeveloper[developer].g_sDevFallVoiceline = "PlayerLaugh"; g_esDeveloper[developer].g_sDevFlashlight = "rainbow"; g_esDeveloper[developer].g_sDevGlowOutline = "rainbow"; - g_esDeveloper[developer].g_sDevLoadout = g_bSecondGame ? "shotgun_spas,machete,molotov,first_aid_kit,pain_pills" : "autoshotgun,pistol,molotov,first_aid_kit,pain_pills,pistol"; + g_esDeveloper[developer].g_sDevLoadout = (g_bSecondGame ? "shotgun_spas,machete,molotov,first_aid_kit,pain_pills" : "autoshotgun,pistol,molotov,first_aid_kit,pain_pills,pistol"); g_esDeveloper[developer].g_sDevSkinColor = "rainbow"; g_esDeveloper[developer].g_flDevActionDuration = 2.0; + g_esDeveloper[developer].g_flDevAdrenalineTime = 99999.0; g_esDeveloper[developer].g_flDevAttackBoost = 1.25; g_esDeveloper[developer].g_flDevDamageBoost = 1.75; g_esDeveloper[developer].g_flDevDamageResistance = 0.5; + g_esDeveloper[developer].g_flDevDopamineRadius = 150.0; + g_esDeveloper[developer].g_flDevFireRate = 1.25; + g_esDeveloper[developer].g_flDevGrenadeLauncher = 10.0; g_esDeveloper[developer].g_flDevHealPercent = 100.0; + g_esDeveloper[developer].g_flDevHealthcareRadius = 150.0; g_esDeveloper[developer].g_flDevJumpHeight = 100.0; + g_esDeveloper[developer].g_flDevLadyKiller = 25.0; + g_esDeveloper[developer].g_flDevMotivationRadius = 150.0; + g_esDeveloper[developer].g_flDevOverdoseRadius = 150.0; g_esDeveloper[developer].g_flDevPipeBombDuration = 10.0; g_esDeveloper[developer].g_flDevPunchResistance = 0.0; g_esDeveloper[developer].g_flDevRapidPistol = 0.130; + g_esDeveloper[developer].g_flDevReloadRate = 1.25; g_esDeveloper[developer].g_flDevRewardDuration = 60.0; + g_esDeveloper[developer].g_flDevShockwaveRadius = 150.0; g_esDeveloper[developer].g_flDevShoveDamage = 0.025; g_esDeveloper[developer].g_flDevShoveRate = 0.4; g_esDeveloper[developer].g_flDevSpeedBoost = 1.25; + g_esDeveloper[developer].g_flDevSwingRate = 1.25; g_esDeveloper[developer].g_iDevAccess = 0; g_esDeveloper[developer].g_iDevAmmoRegen = 1; g_esDeveloper[developer].g_iDevBlazeHealth = 10; @@ -16511,12 +20985,13 @@ void vDeveloperSettings(int developer) g_esDeveloper[developer].g_iDevMedicalCuts = 10; g_esDeveloper[developer].g_iDevMeleeRange = 150; g_esDeveloper[developer].g_iDevMidairDashes = 2; - g_esDeveloper[developer].g_iDevOverhealth = 300; + g_esDeveloper[developer].g_iDevOverhealth = 200; g_esDeveloper[developer].g_iDevPanelPage = 0; g_esDeveloper[developer].g_iDevPanelPages = 4; g_esDeveloper[developer].g_iDevParticle = MT_ROCK_FIRE; g_esDeveloper[developer].g_iDevRegenBursts = 10; g_esDeveloper[developer].g_iDevReviveHealth = 100; + g_esDeveloper[developer].g_iDevPassiveTypes = MT_PASSIVE_INFAMMO; g_esDeveloper[developer].g_iDevRewardTypes = MT_REWARD_HEALTH|MT_REWARD_AMMO|MT_REWARD_REFILL|MT_REWARD_ATTACKBOOST|MT_REWARD_DAMAGEBOOST|MT_REWARD_SPEEDBOOST|MT_REWARD_GODMODE|MT_REWARD_ITEM|MT_REWARD_RESPAWN|MT_REWARD_INFAMMO; g_esDeveloper[developer].g_iDevSpecialAmmo = 0; g_esDeveloper[developer].g_iDevSyringeDarts = 10; @@ -16533,23 +21008,532 @@ void vExecuteFinaleConfigs(const char[] filename) char sFinaleConfig[PLATFORM_MAX_PATH]; if (bIsFinaleConfigFound(filename, sFinaleConfig, sizeof sFinaleConfig)) { - vCustomConfig(sFinaleConfig); + vCustomConfig(sFinaleConfig); + } + } +} + +void vReadAdminSettings(int admin, int type, const char[] key, const char[] value) +{ + int iIndex = g_esTank[type].g_iRecordedType[1]; + if (0 <= iIndex <= MT_MAXTYPES) + { + if (StrEqual(key, "AccessFlags", false) || StrEqual(key, "Access Flags", false) || StrEqual(key, "Access_Flags", false) || StrEqual(key, "access", false)) + { + g_esAdmin[iIndex].g_iAccessFlags[admin] = ReadFlagString(value); + } + else if (StrEqual(key, "ImmunityFlags", false) || StrEqual(key, "Immunity Flags", false) || StrEqual(key, "Immunity_Flags", false) || StrEqual(key, "immunity", false)) + { + g_esAdmin[iIndex].g_iImmunityFlags[admin] = ReadFlagString(value); + } + } +} + +void vReadPlayerSettings(int player, const char[] subsection, const char[] key, const char[] value) +{ + g_esPlayer[player].g_iTankNote = iGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "TankNote", "Tank Note", "Tank_Note", "note", g_esPlayer[player].g_iTankNote, value, -1, 1); + g_esPlayer[player].g_iTankModel = iGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "TankModel", "Tank Model", "Tank_Model", "model", g_esPlayer[player].g_iTankModel, value, -1, 7); + g_esPlayer[player].g_flBurnDuration = flGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "BurnDuration", "Burn Duration", "Burn_Duration", "burndur", g_esPlayer[player].g_flBurnDuration, value, -1.0, 99999.0); + g_esPlayer[player].g_flBurntSkin = flGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "BurntSkin", "Burnt Skin", "Burnt_Skin", "burnt", g_esPlayer[player].g_flBurntSkin, value, -2.0, 1.0); + g_esPlayer[player].g_iCheckAbilities = iGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "CheckAbilities", "Check Abilities", "Check_Abilities", "check", g_esPlayer[player].g_iCheckAbilities, value, -1, 1); + g_esPlayer[player].g_iDeathRevert = iGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "DeathRevert", "Death Revert", "Death_Revert", "revert", g_esPlayer[player].g_iDeathRevert, value, -1, 1); + g_esPlayer[player].g_iAnnounceArrival = iGetKeyValue(subsection, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE2, key, "AnnounceArrival", "Announce Arrival", "Announce_Arrival", "arrival", g_esPlayer[player].g_iAnnounceArrival, value, -1, 31); + g_esPlayer[player].g_iAnnounceDeath = iGetKeyValue(subsection, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE2, key, "AnnounceDeath", "Announce Death", "Announce_Death", "death", g_esPlayer[player].g_iAnnounceDeath, value, -1, 2); + g_esPlayer[player].g_iAnnounceKill = iGetKeyValue(subsection, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE2, key, "AnnounceKill", "Announce Kill", "Announce_Kill", "kill", g_esPlayer[player].g_iAnnounceKill, value, -1, 1); + g_esPlayer[player].g_iArrivalMessage = iGetKeyValue(subsection, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE2, key, "ArrivalMessage", "Arrival Message", "Arrival_Message", "arrivalmsg", g_esPlayer[player].g_iArrivalMessage, value, -1, 1023); + g_esPlayer[player].g_iArrivalSound = iGetKeyValue(subsection, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE2, key, "ArrivalSound", "Arrival Sound", "Arrival_Sound", "arrivalsnd", g_esPlayer[player].g_iArrivalSound, value, -1, 1); + g_esPlayer[player].g_iDeathDetails = iGetKeyValue(subsection, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE2, key, "DeathDetails", "Death Details", "Death_Details", "deathdets", g_esPlayer[player].g_iDeathDetails, value, -1, 5); + g_esPlayer[player].g_iDeathMessage = iGetKeyValue(subsection, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE2, key, "DeathMessage", "Death Message", "Death_Message", "deathmsg", g_esPlayer[player].g_iDeathMessage, value, -1, 1023); + g_esPlayer[player].g_iDeathSound = iGetKeyValue(subsection, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE2, key, "DeathSound", "Death Sound", "Death_Sound", "deathsnd", g_esPlayer[player].g_iDeathSound, value, -1, 1); + g_esPlayer[player].g_iKillMessage = iGetKeyValue(subsection, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE2, key, "KillMessage", "Kill Message", "Kill_Message", "killmsg", g_esPlayer[player].g_iKillMessage, value, -1, 1023); + g_esPlayer[player].g_iVocalizeArrival = iGetKeyValue(subsection, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE2, key, "VocalizeArrival", "Vocalize Arrival", "Vocalize_Arrival", "arrivalvoc", g_esPlayer[player].g_iVocalizeArrival, value, -1, 1); + g_esPlayer[player].g_iVocalizeDeath = iGetKeyValue(subsection, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE2, key, "VocalizeDeath", "Vocalize Death", "Vocalize_Death", "deathvoc", g_esPlayer[player].g_iVocalizeDeath, value, -1, 1); + g_esPlayer[player].g_iTeammateLimit = iGetKeyValue(subsection, MT_CONFIG_SECTION_REWARDS, MT_CONFIG_SECTION_REWARDS, MT_CONFIG_SECTION_REWARDS, MT_CONFIG_SECTION_REWARDS, key, "TeammateLimit", "Teammate Limit", "Teammate_Limit", "teamlimit", g_esPlayer[player].g_iTeammateLimit, value, -1, 32); + g_esShooter[player].g_flCarrierChance = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "CarrierChance", "Carrier Chance", "Carrier_Chance", "cachance", g_esShooter[player].g_flCarrierChance, value, -1.0, 100.0); + g_esShooter[player].g_flCarrierDamageMultiplier = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "CarrierDamageMultiplier", "Carrier Damage Multiplier", "Carrier_Damage_Multiplier", "cadmgmulti", g_esShooter[player].g_flCarrierDamageMultiplier, value, -1.0, 99999.0); + g_esShooter[player].g_flCarrierDelay = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "CarrierDelay", "Carrier Delay", "Carrier_Delay", "cadelay", g_esShooter[player].g_flCarrierDelay, value, -1.0, 99999.0); + g_esShooter[player].g_flCarrierHealthMultiplier = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "CarrierHealthMultiplier", "Carrier Health Multiplier", "Carrier_Health_Multiplier", "cahpmulti", g_esShooter[player].g_flCarrierHealthMultiplier, value, -1.0, 99999.0); + g_esShooter[player].g_flCarrierVoiceChance = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "CarrierVoiceChance", "Carrier Voice Chance", "Carrier_Voice_Chance", "cavoicechance", g_esShooter[player].g_flCarrierVoiceChance, value, -1.0, 100.0); + g_esShooter[player].g_flCarrierVoiceInterval = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "CarrierVoiceInterval", "Carrier Voice Interval", "Carrier_Voice_Interval", "cavoiceint", g_esShooter[player].g_flCarrierVoiceInterval, value, -1.0, 99999.0); + g_esShooter[player].g_iCarrierEnabled = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "CarrierEnabled", "Carrier Enabled", "Carrier_Enabled", "caenabled", g_esShooter[player].g_iCarrierEnabled, value, -1, 1); + g_esShooter[player].g_iCarrierBots = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "CarrierBots", "Carrier Bots", "Carrier_Bots", "cabots", g_esShooter[player].g_iCarrierBots, value, -1, 1); + g_esShooter[player].g_iCarrierBody = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "CarrierBody", "Carrier Body", "Carrier_Body", "cabody", g_esShooter[player].g_iCarrierBody, value, -1, 1); + g_esShooter[player].g_iCarrierCleanse = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "CarrierCleanse", "Carrier Cleanse", "Carrier_Cleanse", "cacleanse", g_esShooter[player].g_iCarrierCleanse, value, -1, 1); + g_esShooter[player].g_iCarrierFilter = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "CarrierFilter", "Carrier Filter", "Carrier_Filter", "cafilter", g_esShooter[player].g_iCarrierFilter, value, -1, 127); + g_esShooter[player].g_iCarrierInfection = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "CarrierInfection", "Carrier Infection", "Carrier_Infection", "cainfect", g_esShooter[player].g_iCarrierInfection, value, -1, 511); + g_esShooter[player].g_iCarrierMix = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "CarrierMix", "Carrier Mix", "Carrier_Mix", "camix", g_esShooter[player].g_iCarrierMix, value, -1, 1); + g_esShooter[player].g_iCarrierMode = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "CarrierMode", "Carrier Mode", "Carrier_Mode", "camode", g_esShooter[player].g_iCarrierMode, value, -1, 6); + g_esShooter[player].g_iCarrierTeleport = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "CarrierTeleport", "Carrier Teleport", "Carrier_Teleport", "cateleport", g_esShooter[player].g_iCarrierTeleport, value, -1, 1); + g_esShooter[player].g_iCarrierVoice = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "CarrierVoice", "Carrier Voice", "Carrier_Voice", "cavoice", g_esShooter[player].g_iCarrierVoice, value, -1, 1); + g_esShooter[player].g_flActionDurationPassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "ActionDurationPassive", "Action Duration Passive", "Action_Duration_Passive", "actionduration", g_esShooter[player].g_flActionDurationPassive, value, -1.0, 99999.0); + g_esShooter[player].g_flAdrenalineTimePassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "AdrenalineTimePassive", "Adrenaline Time Passive", "Adrenaline_Time_Passive", "adrenaline", g_esShooter[player].g_flAdrenalineTimePassive, value, -1.0, 99999.0); + g_esShooter[player].g_flAttackBoostPassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "AttackBoostPassive", "Attack Boost Passive", "Attack_Boost_Passive", "attackboost", g_esShooter[player].g_flAttackBoostPassive, value, -1.0, 99999.0); + g_esShooter[player].g_flDamageBoostPassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "DamageBoostPassive", "Damage Boost Passive", "Damage_Boost_Passive", "dmgboost", g_esShooter[player].g_flDamageBoostPassive, value, -1.0, 99999.0); + g_esShooter[player].g_flDamageResistancePassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "DamageResistancePassive", "Damage Resistance Passive", "Damage_Resistance_Passive", "dmgres", g_esShooter[player].g_flDamageResistancePassive, value, -1.0, 99999.0); + g_esShooter[player].g_flDopamineRadiusPassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "DopamineRadiusPassive", "Dopamine Radius Passive", "Dopamine_Radius_Passive", "dopamine", g_esShooter[player].g_flDopamineRadiusPassive, value, -1.0, 99999.0); + g_esShooter[player].g_flFireRatePassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "FireRatePassive", "Fire Rate Passive", "Fire_Rate_Passive", "firerate", g_esShooter[player].g_flFireRatePassive, value, -1.0, 99999.0); + g_esShooter[player].g_flGrenadeLauncherPassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "GrenadeLauncherPassive", "Grenade Launcher Passive", "Grenade_Launcher_Passive", "grenade", g_esShooter[player].g_flGrenadeLauncherPassive, value, -1.0, 100.0); + g_esShooter[player].g_flHealPercentPassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "HealPercentPassive", "Heal Percent Passive", "Heal_Percent_Passive", "healpercent", g_esShooter[player].g_flHealPercentPassive, value, -1.0, 100.0); + g_esShooter[player].g_flHealthcareRadiusPassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "HealthcareRadiusPassive", "Healthcare Radius Passive", "Healthcare_Radius_Passive", "healthcare", g_esShooter[player].g_flHealthcareRadiusPassive, value, -1.0, 99999.0); + g_esShooter[player].g_flHeartbeatPassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "HearbeatPassive", "Hearbeat Passive", "Hearbeat_Passive", "hearbeat", g_esShooter[player].g_flHeartbeatPassive, value, -1.0, 99999.0); + g_esShooter[player].g_flHollowpointAmmoPassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "HollowpointAmmoPassive", "Hollowpoint Ammo Passive", "Hollowpoint_Ammo_Passive", "hollowpoint", g_esShooter[player].g_flHollowpointAmmoPassive, value, -1.0, 100.0); + g_esShooter[player].g_flJumpHeightPassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "JumpHeightPassive", "Jump Height Passive", "Jump_Height_Passive", "jumpheight", g_esShooter[player].g_flJumpHeightPassive, value, -1.0, 99999.0); + g_esShooter[player].g_flLadyKillerPassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "LadyKillerPassive", "Lady Killer Passive", "Lady_Killer_Passive", "ladykiller", g_esShooter[player].g_flLadyKillerPassive, value, -1.0, 100.0); + g_esShooter[player].g_flLuckyBulletPassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "LuckyBulletPassive", "Lucky Bullet Passive", "Lucky_Bullet_Passive", "luckybullet", g_esShooter[player].g_flLuckyBulletPassive, value, -1.0, 100.0); + g_esShooter[player].g_flMotivationRadiusPassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "MotivationRadiusPassive", "Motivation Radius Passive", "Motivation_Radius_Passive", "motivation", g_esShooter[player].g_flMotivationRadiusPassive, value, -1.0, 99999.0); + g_esShooter[player].g_flOverdoseRadiusPassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "OverdoseRadiusPassive", "Overdose Radius Passive", "Overdose_Radius_Passive", "overdose", g_esShooter[player].g_flOverdoseRadiusPassive, value, -1.0, 99999.0); + g_esShooter[player].g_flPipeBombDurationPassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "PipebombDurationPassive", "Pipebomb Duration Passive", "Pipebomb_Duration_Passive", "pipeduration", g_esShooter[player].g_flPipeBombDurationPassive, value, -1.0, 99999.0); + g_esShooter[player].g_flPunchResistancePassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "PunchResistancePassive", "Punch Resistance Passive", "Punch_Resistance_Passive", "punchres", g_esShooter[player].g_flPunchResistancePassive, value, -1.0, 99999.0); + g_esShooter[player].g_flRapidPistolPassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "RapidPistolPassive", "Rapid Pistol Passive", "Rapid_Pistol_Passive", "rapidpistol", g_esShooter[player].g_flRapidPistolPassive, value, -1.0, 1.0); + g_esShooter[player].g_flRefillPercentPassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "RefillPercentPassive", "Refill Percent Passive", "Refill_Percent_Passive", "refillpercent", g_esShooter[player].g_flRefillPercentPassive, value, -1.0, 100.0); + g_esShooter[player].g_flReloadRatePassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "ReloadRatePassive", "Reload Rate Passive", "Reload_Rate_Passive", "reloadrate", g_esShooter[player].g_flReloadRatePassive, value, -1.0, 99999.0); + g_esShooter[player].g_flShockwaveRadiusPassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "ShockwaveRadiusPassive", "Shockwave Radius Passive", "Shockwave_Radius_Passive", "shockwave", g_esShooter[player].g_flShockwaveRadiusPassive, value, -1.0, 99999.0); + g_esShooter[player].g_flShoveDamagePassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "ShoveDamagePassive", "Shove Damage Passive", "Shove_Damage_Passive", "shovedmg", g_esShooter[player].g_flShoveDamagePassive, value, -1.0, 99999.0); + g_esShooter[player].g_flShoveRatePassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "ShoveRatePassive", "Shove Rate Passive", "Shove_Rate_Passive", "shoverate", g_esShooter[player].g_flShoveRatePassive, value, -1.0, 99999.0); + g_esShooter[player].g_flSledgehammerRoundsPassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "SledgehammerRoundsPassive", "Sledgehammer Rounds Passive", "Sledgehammer_Rounds_Passive", "sledgehammer", g_esShooter[player].g_flSledgehammerRoundsPassive, value, -1.0, 100.0); + g_esShooter[player].g_flSpeedBoostPassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "SpeedBoostPassive", "Speed Boost Passive", "Speed_Boost_Passive", "speedboost", g_esShooter[player].g_flSpeedBoostPassive, value, -1.0, 99999.0); + g_esShooter[player].g_flSupplierPassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "SupplierPassive", "Supplier Passive", "Supplier_Passive", "supplier", g_esShooter[player].g_flSupplierPassive, value, -1.0, 99999.0); + g_esShooter[player].g_flSwingRatePassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "SwingRatePassive", "Swing Rate Passive", "Swing_Rate_Passive", "swingrate", g_esShooter[player].g_flSwingRatePassive, value, -1.0, 99999.0); + g_esShooter[player].g_iPassiveEnabled = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "PassiveEnabled", "Passive Enabled", "Passive_Enabled", "psenabled", g_esShooter[player].g_iPassiveEnabled, value, -2, 2147483647); + g_esShooter[player].g_iPassiveBots = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "PassiveBots", "Passive Bots", "Passive_Bots", "psbots", g_esShooter[player].g_iPassiveBots, value, -2, 2147483647); + g_esShooter[player].g_iPassiveNotify = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "PassiveNotify", "Passive Notify", "Passive_Notify", "psnotify", g_esShooter[player].g_iPassiveNotify, value, -1, 1); + g_esShooter[player].g_iAmmoBoostPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "AmmoBoostPassive", "Ammo Boost Passive", "Ammo_Boost_Passive", "ammoboost", g_esShooter[player].g_iAmmoBoostPassive, value, -1, 1); + g_esShooter[player].g_iAmmoRefillPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "AmmoRefillPassive", "Ammo Refill Passive", "Ammo_Refill_Passive", "ammorefill", g_esShooter[player].g_iAmmoRefillPassive, value, -1, 1); + g_esShooter[player].g_iAmmoRegenPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "AmmoRegenPassive", "Ammo Regen Passive", "Ammo_Regen_Passive", "ammoregen", g_esShooter[player].g_iAmmoRegenPassive, value, -1, 99999); + g_esShooter[player].g_iBlazeHealthPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "BlazeHealthPassive", "Blaze Health Passive", "Blaze_Health_Passive", "blaze", g_esShooter[player].g_iBlazeHealthPassive, value, -1, MT_MAXHEALTH); + g_esShooter[player].g_iBloodDonorPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "BloodDonorPassive", "Blood Donor Passive", "Blood_Donor_Passive", "donor", g_esShooter[player].g_iBloodDonorPassive, value, -1, MT_MAXHEALTH); + g_esShooter[player].g_iBunnyHopPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "BunnyHopPassive", "Bunny Hop Passive", "Bunny_Hop_Passive", "bhop", g_esShooter[player].g_iBunnyHopPassive, value, -1, 1); + g_esShooter[player].g_iBurstDoorsPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "BurstDoorsPassive", "Burst Doors Passive", "Burst_Doors_Passive", "burstdoors", g_esShooter[player].g_iBurstDoorsPassive, value, -1, 1); + g_esShooter[player].g_iCleanKillsPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "CleanKillsPassive", "Clean Kills Passive", "Clean_Kills_Passive", "cleankills", g_esShooter[player].g_iCleanKillsPassive, value, -1, 1); + g_esShooter[player].g_iClusterBombsPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "ClusterBombsPassive", "Cluster Bombs Passive", "Cluster_Bombs_Passive", "cluster", g_esShooter[player].g_iClusterBombsPassive, value, -1, 5); + g_esShooter[player].g_iEternalFlamesPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "EternalFlamesPassive", "Eternal Flames Passive", "Eternal_Flames_Passive", "eternal", g_esShooter[player].g_iEternalFlamesPassive, value, -1, 1); + g_esShooter[player].g_iFastRecoveryPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "FastRecoveryPassive", "Fast Recovery Passive", "Fast_Recovery_Passive", "fastrecovery", g_esShooter[player].g_iFastRecoveryPassive, value, -1, 1); + g_esShooter[player].g_iFriendlyFirePassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "FriendlyFirePassive", "Friendly Fire Passive", "Friendly_Fire_Passive", "friendlyfire", g_esShooter[player].g_iFriendlyFirePassive, value, -1, 1); + g_esShooter[player].g_iGhostBulletsPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "GhostBulletsPassive", "Ghost Bullets Passive", "Ghost_Bullets_Passive", "ghost", g_esShooter[player].g_iGhostBulletsPassive, value, -1, 1); + g_esShooter[player].g_iHealthRegenPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "HealthRegenPassive", "Health Regen Passive", "Health_Regen_Passive", "hpregen", g_esShooter[player].g_iHealthRegenPassive, value, -1, MT_MAXHEALTH); + g_esShooter[player].g_iInfiniteAmmoPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "InfiniteAmmoPassive", "Infinite Ammo Passive", "Infinite_Ammo_Passive", "infammo", g_esShooter[player].g_iInfiniteAmmoPassive, value, -1, 31); + g_esShooter[player].g_iLadderActionsPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "LadderActionsPassive", "Ladder Actions Passive", "Ladder_Action_Passive", "ladderacts", g_esShooter[player].g_iLadderActionsPassive, value, -1, 1); + g_esShooter[player].g_iLaserSightPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "LaserSightPassive", "Laser Sight Passive", "Laser_Sight_Passive", "lasersight", g_esShooter[player].g_iLaserSightPassive, value, -1, 1); + g_esShooter[player].g_iLifeLeechPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "LifeLeechPassive", "Life Leech Passive", "Life_Leech_Passive", "lifeleech", g_esShooter[player].g_iLifeLeechPassive, value, -1, MT_MAXHEALTH); + g_esShooter[player].g_iMedicalCutsPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "MedicalCutsPassive", "Medical Cuts Passive", "Medical_Cuts_Passive", "medcuts", g_esShooter[player].g_iMedicalCutsPassive, value, -1, MT_MAXHEALTH); + g_esShooter[player].g_iMeleeRangePassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "MeleeRangePassive", "Melee Range Passive", "Melee_Range_Passive", "meleerange", g_esShooter[player].g_iMeleeRangePassive, value, -1, 99999); + g_esShooter[player].g_iMidairDashesPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "MidairDashesPassive", "Midair Dashes Passive", "Midair_Dashes_Passive", "middash", g_esShooter[player].g_iMidairDashesPassive, value, -1, 99999); + g_esShooter[player].g_iOverhealthPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "OverhealthPassive", "Overhealth Passive", "Overhealth_Passive", "overhealth", g_esShooter[player].g_iOverhealthPassive, value, -1, MT_MAXHEALTH); + g_esShooter[player].g_iRecoilDampenerPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "RecoilDampenerPassive", "Recoil Dampener Passive", "Recoil_Dampener_Passive", "recoil", g_esShooter[player].g_iRecoilDampenerPassive, value, -1, 1); + g_esShooter[player].g_iRegenBurstsPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "RegenBurstsPassive", "Regen Bursts Passive", "Regen_Bursts_Passive", "regbursts", g_esShooter[player].g_iRegenBurstsPassive, value, -1, MT_MAXHEALTH); + g_esShooter[player].g_iRespawnLoadoutPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "RespawnLoadoutPassive", "Respawn Loadout Passive", "Respawn_Loadout_Passive", "resloadout", g_esShooter[player].g_iRespawnLoadoutPassive, value, -1, 1); + g_esShooter[player].g_iReviveHealthPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "ReviveHealthPassive", "Revive Health Passive", "Revive_Health_Passive", "revivehp", g_esShooter[player].g_iReviveHealthPassive, value, -1, MT_MAXHEALTH); + g_esShooter[player].g_iRiotGearPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "RiotGearPassive", "Riot Gear Passive", "Riot_Gear_Passive", "riotgear", g_esShooter[player].g_iRiotGearPassive, value, -1, 1); + g_esShooter[player].g_iSafetyBubblePassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "SafetyBubblePassive", "Safety Bubble Passive", "Safety_Bubble_Passive", "safetybubble", g_esShooter[player].g_iSafetyBubblePassive, value, -1, 1); + g_esShooter[player].g_iShovePenaltyPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "ShovePenaltyPassive", "Shove Penalty Passive", "Shove_Penalty_Passive", "shovepenalty", g_esShooter[player].g_iShovePenaltyPassive, value, -1, 1); + g_esShooter[player].g_iSpecialAmmoPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "SpecialAmmoPassive", "Special Ammo Passive", "Special_Ammo_Passive", "specammo", g_esShooter[player].g_iSpecialAmmoPassive, value, -1, 3); + g_esShooter[player].g_iStickyGrenadesPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "StickyGrenadesPassive", "Sticky Grenades Passive", "Sticky_Grenades_Passive", "sticky", g_esShooter[player].g_iStickyGrenadesPassive, value, -1, 1); + g_esShooter[player].g_iSyringeDartsPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "SyringeDartsPassive", "Syringe Darts Passive", "Syringe_Darts_Passive", "syringe", g_esShooter[player].g_iSyringeDartsPassive, value, -1, MT_MAXHEALTH); + g_esShooter[player].g_iThornsPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "ThornsPassive", "Thorns Passive", "Thorns_Passive", "thorns", g_esShooter[player].g_iThornsPassive, value, -1, 1); + g_esPlayer[player].g_iGlowEnabled = iGetKeyValue(subsection, MT_CONFIG_SECTION_GLOW, MT_CONFIG_SECTION_GLOW, MT_CONFIG_SECTION_GLOW, MT_CONFIG_SECTION_GLOW, key, "GlowEnabled", "Glow Enabled", "Glow_Enabled", "genabled", g_esPlayer[player].g_iGlowEnabled, value, -1, 1); + g_esPlayer[player].g_iGlowFlashing = iGetKeyValue(subsection, MT_CONFIG_SECTION_GLOW, MT_CONFIG_SECTION_GLOW, MT_CONFIG_SECTION_GLOW, MT_CONFIG_SECTION_GLOW, key, "GlowFlashing", "Glow Flashing", "Glow_Flashing", "flashing", g_esPlayer[player].g_iGlowFlashing, value, -1, 1); + g_esPlayer[player].g_iGlowType = iGetKeyValue(subsection, MT_CONFIG_SECTION_GLOW, MT_CONFIG_SECTION_GLOW, MT_CONFIG_SECTION_GLOW, MT_CONFIG_SECTION_GLOW, key, "GlowType", "Glow Type", "Glow_Type", "type", g_esPlayer[player].g_iGlowType, value, -1, 1); + g_esPlayer[player].g_iBaseHealth = iGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "BaseHealth", "Base Health", "Base_Health", "basehp", g_esPlayer[player].g_iBaseHealth, value, -1, MT_MAXHEALTH); + g_esPlayer[player].g_flArmorPercentage = flGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "ArmorPercentage", "Armor Percentage", "Armor_Percentage", "armorpercent", g_esPlayer[player].g_flArmorPercentage, value, -1.0, 1.0); + g_esPlayer[player].g_flArmorResistance[0] = flGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "ArmorResistance", "Armor Resistance", "Armor_Resistance", "armorres", g_esPlayer[player].g_flArmorResistance[0], value, -1.0, 1.0); + g_esPlayer[player].g_flShieldPercentage = flGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "ShieldPercentage", "Shield Percentage", "Shield_Percentage", "shieldpercent", g_esPlayer[player].g_flShieldPercentage, value, -1.0, 1.0); + g_esPlayer[player].g_flShieldRate = flGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "ShieldRate", "Shield Rate", "Shield_Rate", "shieldrate", g_esPlayer[player].g_flShieldRate, value, -1.0, 1.0); + g_esPlayer[player].g_flPassiveDelay = flGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "PassiveDelay", "Passive Delay", "Passive_Delay", "passdelay", g_esPlayer[player].g_flPassiveDelay, value, -1.0, 99999.0); + g_esPlayer[player].g_iPassiveHealth = iGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "PassiveHealth", "Passive Health", "Passive_Health", "passhp", g_esPlayer[player].g_iPassiveHealth, value, MT_MAX_HEALTH_REDUCTION, MT_MAXHEALTH); + g_esPlayer[player].g_flPassiveInterval = flGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "PassiveInterval", "Passive Interval", "Passive_Interval", "passint", g_esPlayer[player].g_flPassiveInterval, value, -1.0, 99999.0); + g_esPlayer[player].g_iDisplayHealth = iGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "DisplayHealth", "Display Health", "Display_Health", "displayhp", g_esPlayer[player].g_iDisplayHealth, value, -1, 11); + g_esPlayer[player].g_iDisplayHealthType = iGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "DisplayHealthType", "Display Health Type", "Display_Health_Type", "displaytype", g_esPlayer[player].g_iDisplayHealthType, value, -1, 2); + g_esPlayer[player].g_iExtraHealth = iGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "ExtraHealth", "Extra Health", "Extra_Health", "extrahp", g_esPlayer[player].g_iExtraHealth, value, MT_MAX_HEALTH_REDUCTION, MT_MAXHEALTH); + g_esPlayer[player].g_flHealPercentMultiplier = flGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "HealthPercentageMultiplier", "Health Percentage Multiplier", "Health_Percentage_Multiplier", "hpmulti", g_esPlayer[player].g_flHealPercentMultiplier, value, -1.0, 99999.0); + g_esPlayer[player].g_iHumanMultiplierMode = iGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "HumanMultiplierMode", "Human Multiplier Mode", "Human_Multiplier_Mode", "humanmultimode", g_esPlayer[player].g_iHumanMultiplierMode, value, -1, 1); + g_esPlayer[player].g_iMinimumHumans = iGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "MinimumHumans", "Minimum Humans", "Minimum_Humans", "minhumans", g_esPlayer[player].g_iMinimumHumans, value, -1, 32); + g_esPlayer[player].g_iMultiplyHealth = iGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "MultiplyHealth", "Multiply Health", "Multiply_Health", "multihp", g_esPlayer[player].g_iMultiplyHealth, value, -1, 3); + g_esPlayer[player].g_iSpawnProtection = iGetKeyValue(subsection, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT2, key, "SpawnProtection", "Spawn Protection", "Spawn_Protection", "protect", g_esPlayer[player].g_iSpawnProtection, value, -1, 4); + g_esPlayer[player].g_flArmorDuration = flGetKeyValue(subsection, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT2, key, "ArmorDuration", "Armor Duration", "Armor_Duration", "armorduration", g_esPlayer[player].g_flArmorDuration, value, -1.0, 99999.0); + g_esPlayer[player].g_flArmorResistance[1] = flGetKeyValue(subsection, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT2, key, "ArmorResistance", "Armor Resistance", "Armor_Resistance", "armorres", g_esPlayer[player].g_flArmorResistance[1], value, -1.0, 1.0); + g_esPlayer[player].g_flShieldDuration = flGetKeyValue(subsection, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT2, key, "ShieldDuration", "Shield Duration", "Shield_Duration", "shieldduration", g_esPlayer[player].g_flShieldDuration, value, -1.0, 99999.0); + g_esPlayer[player].g_flShieldResistance = flGetKeyValue(subsection, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT2, key, "ShieldResistance", "Shield Resistance", "Shield_Resistance", "shieldres", g_esPlayer[player].g_flShieldResistance, value, -1.0, 1.0); + g_esPlayer[player].g_iBossEffects = iGetKeyValue(subsection, MT_CONFIG_SECTION_BOSS, MT_CONFIG_SECTION_BOSS, MT_CONFIG_SECTION_BOSS, MT_CONFIG_SECTION_BOSS, key, "BossEffects", "Boss Effects", "Boss_Effects", "bosseffects", g_esPlayer[player].g_iBossEffects, value, -1, 15); + g_esPlayer[player].g_iBossStages = iGetKeyValue(subsection, MT_CONFIG_SECTION_BOSS, MT_CONFIG_SECTION_BOSS, MT_CONFIG_SECTION_BOSS, MT_CONFIG_SECTION_BOSS, key, "BossStages", "Boss Stages", "Boss_Stages", "bossstages", g_esPlayer[player].g_iBossStages, value, -1, 4); + g_esPlayer[player].g_iRandomTank = iGetKeyValue(subsection, MT_CONFIG_SECTION_RANDOM, MT_CONFIG_SECTION_RANDOM, MT_CONFIG_SECTION_RANDOM, MT_CONFIG_SECTION_RANDOM, key, "RandomTank", "Random Tank", "Random_Tank", "random", g_esPlayer[player].g_iRandomTank, value, -1, 1); + g_esPlayer[player].g_flRandomDuration = flGetKeyValue(subsection, MT_CONFIG_SECTION_RANDOM, MT_CONFIG_SECTION_RANDOM, MT_CONFIG_SECTION_RANDOM, MT_CONFIG_SECTION_RANDOM, key, "RandomDuration", "Random Duration", "Random_Duration", "randduration", g_esPlayer[player].g_flRandomDuration, value, -1.0, 99999.0); + g_esPlayer[player].g_flRandomInterval = flGetKeyValue(subsection, MT_CONFIG_SECTION_RANDOM, MT_CONFIG_SECTION_RANDOM, MT_CONFIG_SECTION_RANDOM, MT_CONFIG_SECTION_RANDOM, key, "RandomInterval", "Random Interval", "Random_Interval", "randinterval", g_esPlayer[player].g_flRandomInterval, value, -1.0, 99999.0); + g_esPlayer[player].g_flTransformDelay = flGetKeyValue(subsection, MT_CONFIG_SECTION_TRANSFORM, MT_CONFIG_SECTION_TRANSFORM, MT_CONFIG_SECTION_TRANSFORM, MT_CONFIG_SECTION_TRANSFORM, key, "TransformDelay", "Transform Delay", "Transform_Delay", "transdelay", g_esPlayer[player].g_flTransformDelay, value, -1.0, 99999.0); + g_esPlayer[player].g_flTransformDuration = flGetKeyValue(subsection, MT_CONFIG_SECTION_TRANSFORM, MT_CONFIG_SECTION_TRANSFORM, MT_CONFIG_SECTION_TRANSFORM, MT_CONFIG_SECTION_TRANSFORM, key, "TransformDuration", "Transform Duration", "Transform_Duration", "transduration", g_esPlayer[player].g_flTransformDuration, value, -1.0, 99999.0); + g_esPlayer[player].g_iSpawnType = iGetKeyValue(subsection, MT_CONFIG_SECTION_SPAWN, MT_CONFIG_SECTION_SPAWN, MT_CONFIG_SECTION_SPAWN, MT_CONFIG_SECTION_SPAWN, key, "SpawnType", "Spawn Type", "Spawn_Type", "spawntype", g_esPlayer[player].g_iSpawnType, value, -1, 3); + g_esPlayer[player].g_iRockModel = iGetKeyValue(subsection, MT_CONFIG_SECTION_PROPS, MT_CONFIG_SECTION_PROPS, MT_CONFIG_SECTION_PROPS, MT_CONFIG_SECTION_PROPS, key, "RockModel", "Rock Model", "Rock_Model", "rockmodel", g_esPlayer[player].g_iRockModel, value, -1, 2); + g_esPlayer[player].g_iPropsAttached = iGetKeyValue(subsection, MT_CONFIG_SECTION_PROPS, MT_CONFIG_SECTION_PROPS, MT_CONFIG_SECTION_PROPS, MT_CONFIG_SECTION_PROPS, key, "PropsAttached", "Props Attached", "Props_Attached", "attached", g_esPlayer[player].g_iPropsAttached, value, -1, 511); + g_esPlayer[player].g_iBodyEffects = iGetKeyValue(subsection, MT_CONFIG_SECTION_PARTICLES, MT_CONFIG_SECTION_PARTICLES, MT_CONFIG_SECTION_PARTICLES, MT_CONFIG_SECTION_PARTICLES, key, "BodyEffects", "Body Effects", "Body_Effects", "body", g_esPlayer[player].g_iBodyEffects, value, -1, 127); + g_esPlayer[player].g_iRockEffects = iGetKeyValue(subsection, MT_CONFIG_SECTION_PARTICLES, MT_CONFIG_SECTION_PARTICLES, MT_CONFIG_SECTION_PARTICLES, MT_CONFIG_SECTION_PARTICLES, key, "RockEffects", "Rock Effects", "Rock_Effects", "rock", g_esPlayer[player].g_iRockEffects, value, -1, 15); + g_esPlayer[player].g_flAttackInterval = flGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "AttackInterval", "Attack Interval", "Attack_Interval", "attack", g_esPlayer[player].g_flAttackInterval, value, -1.0, 99999.0); + g_esPlayer[player].g_iAutoHop = iGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "BunnyHop", "Bunny Hop", "Bunny_Hop", "bhop", g_esPlayer[player].g_iAutoHop, value, -1, 1); + g_esPlayer[player].g_flClawDamage = flGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "ClawDamage", "Claw Damage", "Claw_Damage", "claw", g_esPlayer[player].g_flClawDamage, value, -2.0, 99999.0); + g_esPlayer[player].g_iFootstepShake = iGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "FootstepShake", "Footstep Shake", "Footstep_Shake", "shake", g_esPlayer[player].g_iFootstepShake, value, -1, 1); + g_esPlayer[player].g_iGroundPound = iGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "GroundPound", "Ground Pound", "Ground_Pound", "pound", g_esPlayer[player].g_iGroundPound, value, -1, 1); + g_esPlayer[player].g_flHittableDamage = flGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "HittableDamage", "Hittable Damage", "Hittable_Damage", "hittable", g_esPlayer[player].g_flHittableDamage, value, -2.0, 99999.0); + g_esPlayer[player].g_flIncapDamageMultiplier = flGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "IncapDamageMultiplier", "Incap Damage Multiplier", "Incap_Damage_Multiplier", "incapdmgmulti", g_esPlayer[player].g_flIncapDamageMultiplier, value, -1.0, 99999.0); + g_esPlayer[player].g_iIntangibleBody = iGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "IntangibleBody", "Intangible Body", "Intangible_Body", "intangible", g_esPlayer[player].g_iIntangibleBody, value, -1, 1); + g_esPlayer[player].g_iMeleeHitMode = iGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "MeleeHitMode", "Melee Hit Mode", "Melee_Hit_Mode", "meleehit", g_esPlayer[player].g_iMeleeHitMode, value, -1, 2); + g_esPlayer[player].g_flMeleeHitValue = flGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "MeleeHitValue", "Melee Hit Value", "Melee_Hit_Value", "meleevalue", g_esPlayer[player].g_flMeleeHitValue, value, -1.0, 99999.0); + g_esPlayer[player].g_flPunchForce = flGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "PunchForce", "Punch Force", "Punch_Force", "punchforce", g_esPlayer[player].g_flPunchForce, value, -2.0, 99999.0); + g_esPlayer[player].g_flPunchThrow = flGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "PunchThrow", "Punch Throw", "Punch_Throw", "punchthrow", g_esPlayer[player].g_flPunchThrow, value, -1.0, 100.0); + g_esPlayer[player].g_flRockDamage = flGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "RockDamage", "Rock Damage", "Rock_Damage", "rockdmg", g_esPlayer[player].g_flRockDamage, value, -2.0, 99999.0); + g_esPlayer[player].g_iRockSound = iGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "RockSound", "Rock Sound", "Rock_Sound", "rocksnd", g_esPlayer[player].g_iRockSound, value, -1, 1); + g_esPlayer[player].g_flRunSpeed = flGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "RunSpeed", "Run Speed", "Run_Speed", "speed", g_esPlayer[player].g_flRunSpeed, value, -1.0, 99.0); + g_esPlayer[player].g_iSkipIncap = iGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "SkipIncap", "Skip Incap", "Skip_Incap", "incap", g_esPlayer[player].g_iSkipIncap, value, -1, 1); + g_esPlayer[player].g_iSkipTaunt = iGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "SkipTaunt", "Skip Taunt", "Skip_Taunt", "taunt", g_esPlayer[player].g_iSkipTaunt, value, -1, 1); + g_esPlayer[player].g_iSweepFist = iGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "SweepFist", "Sweep Fist", "Sweep_Fist", "sweep", g_esPlayer[player].g_iSweepFist, value, -1, 1); + g_esPlayer[player].g_flThrowForce = flGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "ThrowForce", "Throw Force", "Throw_Force", "throwforce", g_esPlayer[player].g_flThrowForce, value, -1.0, 99999.0); + g_esPlayer[player].g_flThrowInterval = flGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "ThrowInterval", "Throw Interval", "Throw_Interval", "throwint", g_esPlayer[player].g_flThrowInterval, value, -1.0, 99999.0); + g_esPlayer[player].g_iThrowRock = iGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "ThrowRock", "Throw Rock", "Throw_Rock", "throwrock", g_esPlayer[player].g_iThrowRock, value, -1, 1); + g_esPlayer[player].g_iBulletImmunity = iGetKeyValue(subsection, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE2, key, "BulletImmunity", "Bullet Immunity", "Bullet_Immunity", "bullet", g_esPlayer[player].g_iBulletImmunity, value, -1, 1); + g_esPlayer[player].g_iExplosiveImmunity = iGetKeyValue(subsection, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE2, key, "ExplosiveImmunity", "Explosive Immunity", "Explosive_Immunity", "explosive", g_esPlayer[player].g_iExplosiveImmunity, value, -1, 1); + g_esPlayer[player].g_iFireImmunity = iGetKeyValue(subsection, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE2, key, "FireImmunity", "Fire Immunity", "Fire_Immunity", "fire", g_esPlayer[player].g_iFireImmunity, value, -1, 1); + g_esPlayer[player].g_iHittableImmunity = iGetKeyValue(subsection, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE2, key, "HittableImmunity", "Hittable Immunity", "Hittable_Immunity", "hittable", g_esPlayer[player].g_iHittableImmunity, value, -1, 1); + g_esPlayer[player].g_iMeleeImmunity = iGetKeyValue(subsection, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE2, key, "MeleeImmunity", "Melee Immunity", "Melee_Immunity", "melee", g_esPlayer[player].g_iMeleeImmunity, value, -1, 1); + g_esPlayer[player].g_iVomitImmunity = iGetKeyValue(subsection, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE2, key, "VomitImmunity", "Vomit Immunity", "Vomit_Immunity", "vomit", g_esPlayer[player].g_iVomitImmunity, value, -1, 1); + g_esPlayer[player].g_iFavoriteType = iGetKeyValue(subsection, MT_CONFIG_SECTION_ADMIN, MT_CONFIG_SECTION_ADMIN, MT_CONFIG_SECTION_ADMIN, MT_CONFIG_SECTION_ADMIN2, key, "FavoriteType", "Favorite Type", "Favorite_Type", "favorite", g_esPlayer[player].g_iFavoriteType, value, -1, g_esGeneral.g_iMaxType); + g_esPlayer[player].g_iAccessFlags = iGetAdminFlagsValue(subsection, MT_CONFIG_SECTION_ADMIN, MT_CONFIG_SECTION_ADMIN, MT_CONFIG_SECTION_ADMIN, MT_CONFIG_SECTION_ADMIN2, key, "AccessFlags", "Access Flags", "Access_Flags", "access", value); + g_esPlayer[player].g_iImmunityFlags = iGetAdminFlagsValue(subsection, MT_CONFIG_SECTION_ADMIN, MT_CONFIG_SECTION_ADMIN, MT_CONFIG_SECTION_ADMIN, MT_CONFIG_SECTION_ADMIN2, key, "ImmunityFlags", "Immunity Flags", "Immunity_Flags", "immunity", value); + + vGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "CarrierAttackVoicelines", "Carrier Attack Voicelines", "Carrier_Attack_Voicelines", "caattacklines", g_esShooter[player].g_sCarrierAttackVoicelines, sizeof esShooter::g_sCarrierAttackVoicelines, value); + vGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "CarrierBaitVoicelines", "Carrier Bait Voicelines", "Carrier_Bait_Voicelines", "cabaitlines", g_esShooter[player].g_sCarrierBaitVoicelines, sizeof esShooter::g_sCarrierBaitVoicelines, value); + vGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "ItemPassive", "Item Passive", "Item_Passive", "item", g_esShooter[player].g_sItemPassive, sizeof esShooter::g_sItemPassive, value); + vGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "ArmorCharacters", "Armor Characters", "Armor_Characters", "armorchars", g_esPlayer[player].g_sArmorCharacters, sizeof esPlayer::g_sArmorCharacters, value); + vGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "HealthCharacters", "Health Characters", "Health_Characters", "hpchars", g_esPlayer[player].g_sHealthCharacters, sizeof esPlayer::g_sHealthCharacters, value); + vGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "ShieldCharacters", "Shield Characters", "Shield_Characters", "shieldchars", g_esPlayer[player].g_sShieldCharacters, sizeof esPlayer::g_sShieldCharacters, value); + vGetKeyValue(subsection, MT_CONFIG_SECTION_COMBO, MT_CONFIG_SECTION_COMBO, MT_CONFIG_SECTION_COMBO, MT_CONFIG_SECTION_COMBO, key, "ComboSet", "Combo Set", "Combo_Set", "set", g_esPlayer[player].g_sComboSet, sizeof esPlayer::g_sComboSet, value); + + if (StrEqual(subsection, MT_CONFIG_SECTION_GENERAL, false)) + { + if (StrEqual(key, "SkinColor", false) || StrEqual(key, "Skin Color", false) || StrEqual(key, "Skin_Color", false) || StrEqual(key, "skin", false)) + { + char sValue[64], sSet[4][4]; + vGetConfigColors(sValue, sizeof sValue, value); + strcopy(g_esPlayer[player].g_sSkinColor, sizeof esPlayer::g_sSkinColor, value); + ReplaceString(sValue, sizeof sValue, " ", ""); + ExplodeString(sValue, ",", sSet, sizeof sSet, sizeof sSet[]); + for (int iPos = 0; iPos < (sizeof esPlayer::g_iSkinColor); iPos++) + { + g_esPlayer[player].g_iSkinColor[iPos] = (sSet[iPos][0] != '\0' && StringToInt(sSet[iPos]) >= 0) ? iClamp(StringToInt(sSet[iPos]), 0, 255) : -1; + } + } + else + { + vGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "TankName", "Tank Name", "Tank_Name", "name", g_esPlayer[player].g_sTankName, sizeof esPlayer::g_sTankName, value); + } + } + else if (StrEqual(subsection, MT_CONFIG_SECTION_REWARDS, false)) + { + char sValue[2560], sSet[8][320]; + strcopy(sValue, sizeof sValue, value); + ReplaceString(sValue, sizeof sValue, " ", ""); + ExplodeString(sValue, ",", sSet, sizeof sSet, sizeof sSet[]); + for (int iPos = 0; iPos < (sizeof esPlayer::g_iStackLimits); iPos++) + { + if (iPos < (sizeof esPlayer::g_iRewardEnabled)) + { + g_esPlayer[player].g_flRewardChance[iPos] = flGetClampedValue(key, "RewardChance", "Reward Chance", "Reward_Chance", "chance", g_esPlayer[player].g_flRewardChance[iPos], sSet[iPos], -1.0, 100.0); + g_esPlayer[player].g_flRewardDuration[iPos] = flGetClampedValue(key, "RewardDuration", "Reward Duration", "Reward_Duration", "duration", g_esPlayer[player].g_flRewardDuration[iPos], sSet[iPos], -1.0, 99999.0); + g_esPlayer[player].g_flRewardPercentage[iPos] = flGetClampedValue(key, "RewardPercentage", "Reward Percentage", "Reward_Percentage", "percent", g_esPlayer[player].g_flRewardPercentage[iPos], sSet[iPos], -1.0, 100.0); + g_esPlayer[player].g_flActionDurationReward[iPos] = flGetClampedValue(key, "ActionDurationReward", "Action Duration Reward", "Action_Duration_Reward", "actionduration", g_esPlayer[player].g_flActionDurationReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esPlayer[player].g_flAdrenalineTimeReward[iPos] = flGetClampedValue(key, "AdrenalineTimeReward", "Adrenaline Time Reward", "Adrenaline_Time_Reward", "adrenaline", g_esPlayer[player].g_flAdrenalineTimeReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esPlayer[player].g_flAttackBoostReward[iPos] = flGetClampedValue(key, "AttackBoostReward", "Attack Boost Reward", "Attack_Boost_Reward", "attackboost", g_esPlayer[player].g_flAttackBoostReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esPlayer[player].g_flDamageBoostReward[iPos] = flGetClampedValue(key, "DamageBoostReward", "Damage Boost Reward", "Damage_Boost_Reward", "dmgboost", g_esPlayer[player].g_flDamageBoostReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esPlayer[player].g_flDamageResistanceReward[iPos] = flGetClampedValue(key, "DamageResistanceReward", "Damage Resistance Reward", "Damage_Resistance_Reward", "dmgres", g_esPlayer[player].g_flDamageResistanceReward[iPos], sSet[iPos], -1.0, 1.0); + g_esPlayer[player].g_flDopamineRadiusReward[iPos] = flGetClampedValue(key, "DopamineRadiusReward", "Dopamine Radius Reward", "Dopamine_Radius_Reward", "dopamine", g_esPlayer[player].g_flDopamineRadiusReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esPlayer[player].g_flFireRateReward[iPos] = flGetClampedValue(key, "FireRateReward", "Fire Rate Reward", "Fire_Rate_Reward", "firerate", g_esPlayer[player].g_flFireRateReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esPlayer[player].g_flGrenadeLauncherReward[iPos] = flGetClampedValue(key, "GrenadeLauncherReward", "Grenade Launcher Reward", "Grenade_Launcher_Reward", "grenade", g_esPlayer[player].g_flGrenadeLauncherReward[iPos], sSet[iPos], -1.0, 100.0); + g_esPlayer[player].g_flHealPercentReward[iPos] = flGetClampedValue(key, "HealPercentReward", "Heal Percent Reward", "Heal_Percent_Reward", "healpercent", g_esPlayer[player].g_flHealPercentReward[iPos], sSet[iPos], -1.0, 100.0); + g_esPlayer[player].g_flHealthcareRadiusReward[iPos] = flGetClampedValue(key, "HealthcareRadiusReward", "Healthcare Radius Reward", "Healthcare_Radius_Reward", "healthcare", g_esPlayer[player].g_flHealthcareRadiusReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esPlayer[player].g_flHeartbeatReward[iPos] = flGetClampedValue(key, "HeartbeatReward", "Heartbeat Reward", "Heartbeat_Reward", "heartbeat", g_esPlayer[player].g_flHeartbeatReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esPlayer[player].g_flHollowpointAmmoReward[iPos] = flGetClampedValue(key, "HollowpointAmmoReward", "Hollowpoint Ammo Reward", "Hollowpoint_Ammo_Reward", "hollowpoint", g_esPlayer[player].g_flHollowpointAmmoReward[iPos], sSet[iPos], -1.0, 100.0); + g_esPlayer[player].g_flJumpHeightReward[iPos] = flGetClampedValue(key, "JumpHeightReward", "Jump Height Reward", "Jump_Height_Reward", "jumpheight", g_esPlayer[player].g_flJumpHeightReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esPlayer[player].g_flLadyKillerReward[iPos] = flGetClampedValue(key, "LadyKillerReward", "Lady Killer Reward", "Lady_Killer_Reward", "ladykiller", g_esPlayer[player].g_flLadyKillerReward[iPos], sSet[iPos], -1.0, 100.0); + g_esPlayer[player].g_flLoopingVoicelineInterval[iPos] = flGetClampedValue(key, "LoopingVoicelineInterval", "Looping Voiceline Interval", "Looping_Voiceline_Interval", "loopinterval", g_esPlayer[player].g_flLoopingVoicelineInterval[iPos], sSet[iPos], -1.0, 99999.0); + g_esPlayer[player].g_flLuckyBulletReward[iPos] = flGetClampedValue(key, "LuckyBulletReward", "Lucky Bullet Reward", "Lucky_Bullet_Reward", "luckybullet", g_esPlayer[player].g_flLuckyBulletReward[iPos], sSet[iPos], -1.0, 100.0); + g_esPlayer[player].g_flMotivationRadiusReward[iPos] = flGetClampedValue(key, "MotivationRadiusReward", "Motivation Radius Reward", "Motivation_Radius_Reward", "motivation", g_esPlayer[player].g_flMotivationRadiusReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esPlayer[player].g_flOverdoseRadiusReward[iPos] = flGetClampedValue(key, "OverdoseRadiusReward", "Overdose Radius Reward", "Overdose_Radius_Reward", "overdose", g_esPlayer[player].g_flOverdoseRadiusReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esPlayer[player].g_flPipeBombDurationReward[iPos] = flGetClampedValue(key, "PipebombDurationReward", "Pipebomb Duration Reward", "Pipebomb_Duration_Reward", "pipeduration", g_esPlayer[player].g_flPipeBombDurationReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esPlayer[player].g_flPunchResistanceReward[iPos] = flGetClampedValue(key, "PunchResistanceReward", "Punch Resistance Reward", "Punch_Resistance_Reward", "punchres", g_esPlayer[player].g_flPunchResistanceReward[iPos], sSet[iPos], -1.0, 1.0); + g_esPlayer[player].g_flRapidPistolReward[iPos] = flGetClampedValue(key, "RapidPistolReward", "Rapid Pistol Reward", "Rapid_Pistol_Reward", "rapidpistol", g_esPlayer[player].g_flRapidPistolReward[iPos], sSet[iPos], -1.0, 1.0); + g_esPlayer[player].g_flRefillPercentReward[iPos] = flGetClampedValue(key, "RefillPercentReward", "Refill Percent Reward", "Refill_Percent_Reward", "refillpercent", g_esPlayer[player].g_flRefillPercentReward[iPos], sSet[iPos], -1.0, 100.0); + g_esPlayer[player].g_flReloadRateReward[iPos] = flGetClampedValue(key, "ReloadRateReward", "Reload Rate Reward", "Reload_Rate_Reward", "reloadrate", g_esPlayer[player].g_flReloadRateReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esPlayer[player].g_flShockwaveRadiusReward[iPos] = flGetClampedValue(key, "ShockwaveRadiusReward", "Shockwave Radius Reward", "Shockwave_Radius_Reward", "shockwave", g_esPlayer[player].g_flShockwaveRadiusReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esPlayer[player].g_flShoveDamageReward[iPos] = flGetClampedValue(key, "ShoveDamageReward", "Shove Damage Reward", "Shove_Damage_Reward", "shovedmg", g_esPlayer[player].g_flShoveDamageReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esPlayer[player].g_flShoveRateReward[iPos] = flGetClampedValue(key, "ShoveRateReward", "Shove Rate Reward", "Shove_Rate_Reward", "shoverate", g_esPlayer[player].g_flShoveRateReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esPlayer[player].g_flSledgehammerRoundsReward[iPos] = flGetClampedValue(key, "SledgehammerRoundsReward", "Sledgehammer Rounds Reward", "Sledgehammer_Rounds_Reward", "sledgehammer", g_esPlayer[player].g_flSledgehammerRoundsReward[iPos], sSet[iPos], -1.0, 100.0); + g_esPlayer[player].g_flSpeedBoostReward[iPos] = flGetClampedValue(key, "SpeedBoostReward", "Speed Boost Reward", "Speed_Boost_Reward", "speedboost", g_esPlayer[player].g_flSpeedBoostReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esPlayer[player].g_flSupplierReward[iPos] = flGetClampedValue(key, "SupplierPassive", "Supplier Passive", "Supplier_Passive", "supplier", g_esPlayer[player].g_flSupplierReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esPlayer[player].g_flSwingRateReward[iPos] = flGetClampedValue(key, "SwingRateReward", "Swing Rate Reward", "Swing_Rate_Reward", "swingrate", g_esPlayer[player].g_flSwingRateReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esPlayer[player].g_iRewardEnabled[iPos] = iGetClampedValue(key, "RewardEnabled", "Reward Enabled", "Reward_Enabled", "renabled", g_esPlayer[player].g_iRewardEnabled[iPos], sSet[iPos], -2, 2147483647); + g_esPlayer[player].g_iRewardBots[iPos] = iGetClampedValue(key, "RewardBots", "Reward Bots", "Reward_Bots", "rbots", g_esPlayer[player].g_iRewardBots[iPos], sSet[iPos], -2, 2147483647); + g_esPlayer[player].g_iRewardEffect[iPos] = iGetClampedValue(key, "RewardEffect", "Reward Effect", "Reward_Effect", "effect", g_esPlayer[player].g_iRewardEffect[iPos], sSet[iPos], -1, 15); + g_esPlayer[player].g_iRewardNotify[iPos] = iGetClampedValue(key, "RewardNotify", "Reward Notify", "Reward_Notify", "rnotify", g_esPlayer[player].g_iRewardNotify[iPos], sSet[iPos], -1, 3); + g_esPlayer[player].g_iRewardVisual[iPos] = iGetClampedValue(key, "RewardVisual", "Reward Visual", "Reward_Visual", "visual", g_esPlayer[player].g_iRewardVisual[iPos], sSet[iPos], -1, 127); + g_esPlayer[player].g_iAmmoBoostReward[iPos] = iGetClampedValue(key, "AmmoBoostReward", "Ammo Boost Reward", "Ammo_Boost_Reward", "ammoboost", g_esPlayer[player].g_iAmmoBoostReward[iPos], sSet[iPos], -1, 1); + g_esPlayer[player].g_iAmmoRefillReward[iPos] = iGetClampedValue(key, "AmmoRefillReward", "Ammo Refill Reward", "Ammo_Refill_Reward", "ammorefill", g_esPlayer[player].g_iAmmoRefillReward[iPos], sSet[iPos], -1, 1); + g_esPlayer[player].g_iAmmoRegenReward[iPos] = iGetClampedValue(key, "AmmoRegenReward", "Ammo Regen Reward", "Ammo_Regen_Reward", "ammoregen", g_esPlayer[player].g_iAmmoRegenReward[iPos], sSet[iPos], -1, 99999); + g_esPlayer[player].g_iBlazeHealthReward[iPos] = iGetClampedValue(key, "BlazeHealthReward", "Blaze Health Reward", "Blaze_Health_Reward", "blaze", g_esPlayer[player].g_iBlazeHealthReward[iPos], sSet[iPos], -1, MT_MAXHEALTH); + g_esPlayer[player].g_iBloodDonorReward[iPos] = iGetClampedValue(key, "BloodDonorReward", "Blood Donor Reward", "Blood_Donor_Reward", "donor", g_esPlayer[player].g_iBloodDonorReward[iPos], sSet[iPos], -1, MT_MAXHEALTH); + g_esPlayer[player].g_iBunnyHopReward[iPos] = iGetClampedValue(key, "BunnyHopReward", "Bunny Hop Reward", "Bunny_Hop_Reward", "bhop", g_esPlayer[player].g_iBunnyHopReward[iPos], sSet[iPos], -1, 1); + g_esPlayer[player].g_iBurstDoorsReward[iPos] = iGetClampedValue(key, "BurstDoorsReward", "Burst Doors Reward", "Burst_Doors_Reward", "burstdoors", g_esPlayer[player].g_iBurstDoorsReward[iPos], sSet[iPos], -1, 1); + g_esPlayer[player].g_iCleanKillsReward[iPos] = iGetClampedValue(key, "CleanKillsReward", "Clean Kills Reward", "Clean_Kills_Reward", "cleankills", g_esPlayer[player].g_iCleanKillsReward[iPos], sSet[iPos], -1, 1); + g_esPlayer[player].g_iClusterBombsReward[iPos] = iGetClampedValue(key, "ClusterBombsReward", "Cluster Bombs Reward", "Cluster_Bombs_Reward", "cluster", g_esPlayer[player].g_iClusterBombsReward[iPos], sSet[iPos], -1, 5); + g_esPlayer[player].g_iEternalFlamesReward[iPos] = iGetClampedValue(key, "EternalFlamesReward", "Eternal Flames Reward", "Eternal_Flames_Reward", "eternal", g_esPlayer[player].g_iEternalFlamesReward[iPos], sSet[iPos], -1, 1); + g_esPlayer[player].g_iFastRecoveryReward[iPos] = iGetClampedValue(key, "FastRecoveryReward", "Fast Recovery Reward", "Fast_Recovery_Reward", "fastrecovery", g_esPlayer[player].g_iFastRecoveryReward[iPos], sSet[iPos], -1, 1); + g_esPlayer[player].g_iFriendlyFireReward[iPos] = iGetClampedValue(key, "FriendlyFireReward", "Friendly Fire Reward", "Friendly_Fire_Reward", "friendlyfire", g_esPlayer[player].g_iFriendlyFireReward[iPos], sSet[iPos], -1, 1); + g_esPlayer[player].g_iGhostBulletsReward[iPos] = iGetClampedValue(key, "GhostBulletsReward", "Ghost Bullets Reward", "Ghost_Bullets_Reward", "ghost", g_esPlayer[player].g_iGhostBulletsReward[iPos], sSet[iPos], -1, 1); + g_esPlayer[player].g_iHealthRegenReward[iPos] = iGetClampedValue(key, "HealthRegenReward", "Health Regen Reward", "Health_Regen_Reward", "hpregen", g_esPlayer[player].g_iHealthRegenReward[iPos], sSet[iPos], -1, MT_MAXHEALTH); + g_esPlayer[player].g_iInfiniteAmmoReward[iPos] = iGetClampedValue(key, "InfiniteAmmoReward", "Infinite Ammo Reward", "Infinite_Ammo_Reward", "infammo", g_esPlayer[player].g_iInfiniteAmmoReward[iPos], sSet[iPos], -1, 31); + g_esPlayer[player].g_iLadderActionsReward[iPos] = iGetClampedValue(key, "LadderActionsReward", "Ladder Actions Reward", "Ladder_Action_Reward", "ladderacts", g_esPlayer[player].g_iLadderActionsReward[iPos], sSet[iPos], -1, 1); + g_esPlayer[player].g_iLaserSightReward[iPos] = iGetClampedValue(key, "LaserSightReward", "Laser Sight Reward", "Laser_Sight_Reward", "lasersight", g_esPlayer[player].g_iLaserSightReward[iPos], sSet[iPos], -1, 1); + g_esPlayer[player].g_iLifeLeechReward[iPos] = iGetClampedValue(key, "LifeLeechReward", "Life Leech Reward", "Life_Leech_Reward", "lifeleech", g_esPlayer[player].g_iLifeLeechReward[iPos], sSet[iPos], -1, MT_MAXHEALTH); + g_esPlayer[player].g_iMedicalCutsReward[iPos] = iGetClampedValue(key, "MedicalCutsReward", "Medical Cuts Reward", "Medical_Cuts_Reward", "medcuts", g_esPlayer[player].g_iMedicalCutsReward[iPos], sSet[iPos], -1, MT_MAXHEALTH); + g_esPlayer[player].g_iMeleeRangeReward[iPos] = iGetClampedValue(key, "MeleeRangeReward", "Melee Range Reward", "Melee_Range_Reward", "meleerange", g_esPlayer[player].g_iMeleeRangeReward[iPos], sSet[iPos], -1, 99999); + g_esPlayer[player].g_iMidairDashesReward[iPos] = iGetClampedValue(key, "MidairDashesReward", "Midair Dashes Reward", "Midair_Dashes_Reward", "middash", g_esPlayer[player].g_iMidairDashesReward[iPos], sSet[iPos], -1, 99999); + g_esPlayer[player].g_iOverhealthReward[iPos] = iGetClampedValue(key, "OverhealthReward", "Overhealth Reward", "Overhealth_Reward", "overhealth", g_esPlayer[player].g_iOverhealthReward[iPos], sSet[iPos], -1, MT_MAXHEALTH); + g_esPlayer[player].g_iParticleEffectVisual[iPos] = iGetClampedValue(key, "ParticleEffectVisual", "Particle Effect Visual", "Particle_Effect_Visual", "particle", g_esPlayer[player].g_iParticleEffectVisual[iPos], sSet[iPos], -1, 15); + g_esPlayer[player].g_iPrefsNotify[iPos] = iGetClampedValue(key, "PrefsNotify", "Prefs Notify", "Prefs_Notify", "pnotify", g_esPlayer[player].g_iPrefsNotify[iPos], sSet[iPos], -1, 1); + g_esPlayer[player].g_iRecoilDampenerReward[iPos] = iGetClampedValue(key, "RecoilDampenerReward", "Recoil Dampener Reward", "Recoil_Dampener_Reward", "recoil", g_esPlayer[player].g_iRecoilDampenerReward[iPos], sSet[iPos], -1, 1); + g_esPlayer[player].g_iRegenBurstsReward[iPos] = iGetClampedValue(key, "RegenBurstsReward", "Regen Bursts Reward", "Regen_Bursts_Reward", "regbursts", g_esPlayer[player].g_iRegenBurstsReward[iPos], sSet[iPos], -1, MT_MAXHEALTH); + g_esPlayer[player].g_iRespawnLoadoutReward[iPos] = iGetClampedValue(key, "RespawnLoadoutReward", "Respawn Loadout Reward", "Respawn_Loadout_Reward", "resloadout", g_esPlayer[player].g_iRespawnLoadoutReward[iPos], sSet[iPos], -1, 1); + g_esPlayer[player].g_iReviveHealthReward[iPos] = iGetClampedValue(key, "ReviveHealthReward", "Revive Health Reward", "Revive_Health_Reward", "revivehp", g_esPlayer[player].g_iReviveHealthReward[iPos], sSet[iPos], -1, MT_MAXHEALTH); + g_esPlayer[player].g_iRiotGearReward[iPos] = iGetClampedValue(key, "RiotGearReward", "Riot Gear Reward", "Riot_Gear_Reward", "riotgear", g_esPlayer[player].g_iRiotGearReward[iPos], sSet[iPos], -1, 1); + g_esPlayer[player].g_iSafetyBubbleReward[iPos] = iGetClampedValue(key, "SafetyBubbleReward", "Safety Bubble Reward", "Safety_Bubble_Reward", "safetybubble", g_esPlayer[player].g_iSafetyBubbleReward[iPos], sSet[iPos], -1, 1); + g_esPlayer[player].g_iShareRewards[iPos] = iGetClampedValue(key, "ShareRewards", "Share Rewards", "Share_Rewards", "share", g_esPlayer[player].g_iShareRewards[iPos], sSet[iPos], -1, 3); + g_esPlayer[player].g_iShovePenaltyReward[iPos] = iGetClampedValue(key, "ShovePenaltyReward", "Shove Penalty Reward", "Shove_Penalty_Reward", "shovepenalty", g_esPlayer[player].g_iShovePenaltyReward[iPos], sSet[iPos], -1, 1); + g_esPlayer[player].g_iSpecialAmmoReward[iPos] = iGetClampedValue(key, "SpecialAmmoReward", "Special Ammo Reward", "Special_Ammo_Reward", "specammo", g_esPlayer[player].g_iSpecialAmmoReward[iPos], sSet[iPos], -1, 3); + g_esPlayer[player].g_iStackRewards[iPos] = iGetClampedValue(key, "StackRewards", "Stack Rewards", "Stack_Rewards", "rstack", g_esPlayer[player].g_iStackRewards[iPos], sSet[iPos], -1, 2147483647); + g_esPlayer[player].g_iStickyGrenadesReward[iPos] = iGetClampedValue(key, "StickyGrenadesReward", "Sticky Grenades Reward", "Sticky_Grenades_Reward", "sticky", g_esPlayer[player].g_iStickyGrenadesReward[iPos], sSet[iPos], -1, 1); + g_esPlayer[player].g_iSyringeDartsReward[iPos] = iGetClampedValue(key, "SyringeDartsReward", "Syringe Darts Reward", "Syringe_Darts_Reward", "syringe", g_esPlayer[player].g_iSyringeDartsReward[iPos], sSet[iPos], -1, MT_MAXHEALTH); + g_esPlayer[player].g_iThornsReward[iPos] = iGetClampedValue(key, "ThornsReward", "Thorns Reward", "Thorns_Reward", "thorns", g_esPlayer[player].g_iThornsReward[iPos], sSet[iPos], -1, 1); + g_esPlayer[player].g_iUsefulRewards[iPos] = iGetClampedValue(key, "UsefulRewards", "Useful Rewards", "Useful_Rewards", "useful", g_esPlayer[player].g_iUsefulRewards[iPos], sSet[iPos], -1, 15); + g_esPlayer[player].g_iVoicePitchVisual[iPos] = iGetClampedValue(key, "VoicePitchVisual", "Voice Pitch Visual", "Voice_Pitch_Visual", "voicepitch", g_esPlayer[player].g_iVoicePitchVisual[iPos], sSet[iPos], -1, 255); + + vGetConfigColors(sValue, sizeof sValue, sSet[iPos], ';'); + vGetStringValue(key, "BodyColorVisual", "Body Color Visual", "Body_Color_Visual", "bodycolor", iPos, g_esPlayer[player].g_sBodyColorVisual, sizeof esPlayer::g_sBodyColorVisual, g_esPlayer[player].g_sBodyColorVisual2, sizeof esPlayer::g_sBodyColorVisual2, g_esPlayer[player].g_sBodyColorVisual3, sizeof esPlayer::g_sBodyColorVisual3, g_esPlayer[player].g_sBodyColorVisual4, sizeof esPlayer::g_sBodyColorVisual4, sValue); + vGetStringValue(key, "FallVoicelineReward", "Fall Voiceline Reward", "Fall_Voiceline_Reward", "fallvoice", iPos, g_esPlayer[player].g_sFallVoicelineReward, sizeof esPlayer::g_sFallVoicelineReward, g_esPlayer[player].g_sFallVoicelineReward2, sizeof esPlayer::g_sFallVoicelineReward2, g_esPlayer[player].g_sFallVoicelineReward3, sizeof esPlayer::g_sFallVoicelineReward3, g_esPlayer[player].g_sFallVoicelineReward4, sizeof esPlayer::g_sFallVoicelineReward4, sSet[iPos]); + vGetStringValue(key, "GlowColorVisual", "Glow Color Visual", "Glow_Color_Visual", "glowcolor", iPos, g_esPlayer[player].g_sOutlineColorVisual, sizeof esPlayer::g_sOutlineColorVisual, g_esPlayer[player].g_sOutlineColorVisual2, sizeof esPlayer::g_sOutlineColorVisual2, g_esPlayer[player].g_sOutlineColorVisual3, sizeof esPlayer::g_sOutlineColorVisual3, g_esPlayer[player].g_sOutlineColorVisual4, sizeof esPlayer::g_sOutlineColorVisual4, sValue); + vGetStringValue(key, "ItemReward", "Item Reward", "Item_Reward", "item", iPos, g_esPlayer[player].g_sItemReward, sizeof esPlayer::g_sItemReward, g_esPlayer[player].g_sItemReward2, sizeof esPlayer::g_sItemReward2, g_esPlayer[player].g_sItemReward3, sizeof esPlayer::g_sItemReward3, g_esPlayer[player].g_sItemReward4, sizeof esPlayer::g_sItemReward4, sSet[iPos]); + vGetStringValue(key, "LightColorVisual", "Light Color Visual", "Light_Color_Visual", "lightcolor", iPos, g_esPlayer[player].g_sLightColorVisual, sizeof esPlayer::g_sLightColorVisual, g_esPlayer[player].g_sLightColorVisual2, sizeof esPlayer::g_sLightColorVisual2, g_esPlayer[player].g_sLightColorVisual3, sizeof esPlayer::g_sLightColorVisual3, g_esPlayer[player].g_sLightColorVisual4, sizeof esPlayer::g_sLightColorVisual4, sValue); + vGetStringValue(key, "LoopingVoicelineVisual", "Looping Voiceline Visual", "Looping_Voiceline_Visual", "loopvoice", iPos, g_esPlayer[player].g_sLoopingVoicelineVisual, sizeof esPlayer::g_sLoopingVoicelineVisual, g_esPlayer[player].g_sLoopingVoicelineVisual2, sizeof esPlayer::g_sLoopingVoicelineVisual2, g_esPlayer[player].g_sLoopingVoicelineVisual3, sizeof esPlayer::g_sLoopingVoicelineVisual3, g_esPlayer[player].g_sLoopingVoicelineVisual4, sizeof esPlayer::g_sLoopingVoicelineVisual4, sSet[iPos]); + vGetStringValue(key, "ScreenColorVisual", "Screen Color Visual", "Screen_Color_Visual", "screencolor", iPos, g_esPlayer[player].g_sScreenColorVisual, sizeof esPlayer::g_sScreenColorVisual, g_esPlayer[player].g_sScreenColorVisual2, sizeof esPlayer::g_sScreenColorVisual2, g_esPlayer[player].g_sScreenColorVisual3, sizeof esPlayer::g_sScreenColorVisual3, g_esPlayer[player].g_sScreenColorVisual4, sizeof esPlayer::g_sScreenColorVisual4, sValue); + } + + g_esPlayer[player].g_iStackLimits[iPos] = iGetClampedValue(key, "StackLimits", "Stack Limits", "Stack_Limits", "limits", g_esPlayer[player].g_iStackLimits[iPos], sSet[iPos], -1, 99999); + } + } + else if (StrEqual(subsection, MT_CONFIG_SECTION_SURVIVORS, false)) + { + if (StrEqual(key, "CarrierType", false) || StrEqual(key, "Carrier Type", false) || StrEqual(key, "Carrier_Type", false) || StrEqual(key, "catype", false)) + { + char sValue[10], sRange[2][5]; + strcopy(sValue, sizeof sValue, value); + ReplaceString(sValue, sizeof sValue, " ", ""); + ExplodeString(sValue, "-", sRange, sizeof sRange, sizeof sRange[]); + + g_esShooter[player].g_iCarrierMinType = (sRange[0][0] != '\0') ? iClamp(StringToInt(sRange[0]), -1, MT_MAXTYPES) : g_esShooter[player].g_iCarrierMinType; + g_esShooter[player].g_iCarrierMaxType = (sRange[1][0] != '\0') ? iClamp(StringToInt(sRange[1]), -1, MT_MAXTYPES) : g_esShooter[player].g_iCarrierMaxType; + } + } + else if (StrEqual(subsection, MT_CONFIG_SECTION_GLOW, false)) + { + if (StrEqual(key, "GlowColor", false) || StrEqual(key, "Glow Color", false) || StrEqual(key, "Glow_Color", false)) + { + char sValue[64], sSet[3][4]; + vGetConfigColors(sValue, sizeof sValue, value); + strcopy(g_esPlayer[player].g_sGlowColor, sizeof esPlayer::g_sGlowColor, value); + ReplaceString(sValue, sizeof sValue, " ", ""); + ExplodeString(sValue, ",", sSet, sizeof sSet, sizeof sSet[]); + for (int iPos = 0; iPos < (sizeof esPlayer::g_iGlowColor); iPos++) + { + g_esPlayer[player].g_iGlowColor[iPos] = (sSet[iPos][0] != '\0' && StringToInt(sSet[iPos]) >= 0) ? iClamp(StringToInt(sSet[iPos]), 0, 255) : -1; + } + } + else if (StrEqual(key, "GlowRange", false) || StrEqual(key, "Glow Range", false) || StrEqual(key, "Glow_Range", false)) + { + char sValue[14], sRange[2][7]; + strcopy(sValue, sizeof sValue, value); + ReplaceString(sValue, sizeof sValue, " ", ""); + ExplodeString(sValue, "-", sRange, sizeof sRange, sizeof sRange[]); + + g_esPlayer[player].g_iGlowMinRange = (sRange[0][0] != '\0') ? iClamp(StringToInt(sRange[0]), -1, 99999) : g_esPlayer[player].g_iGlowMinRange; + g_esPlayer[player].g_iGlowMaxRange = (sRange[1][0] != '\0') ? iClamp(StringToInt(sRange[1]), -1, 99999) : g_esPlayer[player].g_iGlowMaxRange; + } + } + else if (StrEqual(subsection, MT_CONFIG_SECTION_BOSS, false)) + { + char sValue[44], sSet[4][11]; + strcopy(sValue, sizeof sValue, value); + ReplaceString(sValue, sizeof sValue, " ", ""); + ExplodeString(sValue, ",", sSet, sizeof sSet, sizeof sSet[]); + for (int iPos = 0; iPos < (sizeof esPlayer::g_iBossHealth); iPos++) + { + g_esPlayer[player].g_iBossHealth[iPos] = iGetClampedValue(key, "BossHealthStages", "Boss Health Stages", "Boss_Health_Stages", "bosshpstages", g_esPlayer[player].g_iBossHealth[iPos], sSet[iPos], -1, MT_MAXHEALTH); + g_esPlayer[player].g_iBossType[iPos] = iGetClampedValue(key, "BossTypes", "Boss Types", "Boss_Types", "bosstypes", g_esPlayer[player].g_iBossType[iPos], sSet[iPos], -1, MT_MAXTYPES); + } + } + else if (StrEqual(subsection, MT_CONFIG_SECTION_COMBO, false)) + { + if (StrEqual(key, "ComboTypeChance", false) || StrEqual(key, "Combo Type Chance", false) || StrEqual(key, "Combo_Type_Chance", false) || StrEqual(key, "typechance", false)) + { + char sValue[42], sSet[7][6]; + strcopy(sValue, sizeof sValue, value); + ReplaceString(sValue, sizeof sValue, " ", ""); + ExplodeString(sValue, ",", sSet, sizeof sSet, sizeof sSet[]); + for (int iPos = 0; iPos < (sizeof esPlayer::g_flComboTypeChance); iPos++) + { + g_esPlayer[player].g_flComboTypeChance[iPos] = (sSet[iPos][0] != '\0') ? flClamp(StringToFloat(sSet[iPos]), -1.0, 100.0) : g_esPlayer[player].g_flComboTypeChance[iPos]; + } + } + else + { + char sValue[140], sSet[10][14]; + strcopy(sValue, sizeof sValue, value); + ReplaceString(sValue, sizeof sValue, " ", ""); + ExplodeString(sValue, ",", sSet, sizeof sSet, sizeof sSet[]); + for (int iPos = 0; iPos < (sizeof esPlayer::g_flComboChance); iPos++) + { + if (StrEqual(key, "ComboRadius", false) || StrEqual(key, "Combo Radius", false) || StrEqual(key, "Combo_Radius", false) || StrEqual(key, "radius", false)) + { + char sRange[2][7], sSubset[14]; + strcopy(sSubset, sizeof sSubset, sSet[iPos]); + ReplaceString(sSubset, sizeof sSubset, " ", ""); + ExplodeString(sSubset, ";", sRange, sizeof sRange, sizeof sRange[]); + + g_esPlayer[player].g_flComboMinRadius[iPos] = (sRange[0][0] != '\0') ? flClamp(StringToFloat(sRange[0]), -200.0, 1.0) : g_esPlayer[player].g_flComboMinRadius[iPos]; + g_esPlayer[player].g_flComboMaxRadius[iPos] = (sRange[1][0] != '\0') ? flClamp(StringToFloat(sRange[1]), -1.0, 200.0) : g_esPlayer[player].g_flComboMaxRadius[iPos]; + } + else + { + g_esPlayer[player].g_flComboChance[iPos] = flGetClampedValue(key, "ComboChance", "Combo Chance", "Combo_Chance", "chance", g_esPlayer[player].g_flComboChance[iPos], sSet[iPos], -1.0, 100.0); + g_esPlayer[player].g_iComboCooldown[iPos] = iGetClampedValue(key, "ComboCooldown", "Combo Cooldown", "Combo_Cooldown", "cooldown", g_esPlayer[player].g_iComboCooldown[iPos], sSet[iPos], -1, 99999); + g_esPlayer[player].g_flComboDamage[iPos] = flGetClampedValue(key, "ComboDamage", "Combo Damage", "Combo_Damage", "damage", g_esPlayer[player].g_flComboDamage[iPos], sSet[iPos], -1.0, 99999.0); + g_esPlayer[player].g_flComboDeathChance[iPos] = flGetClampedValue(key, "ComboDeathChance", "Combo Death Chance", "Combo_Death_Chance", "deathchance", g_esPlayer[player].g_flComboDeathChance[iPos], sSet[iPos], -1.0, 100.0); + g_esPlayer[player].g_flComboDeathRange[iPos] = flGetClampedValue(key, "ComboDeathRange", "Combo Death Range", "Combo_Death_Range", "deathrange", g_esPlayer[player].g_flComboDeathRange[iPos], sSet[iPos], -1.0, 99999.0); + g_esPlayer[player].g_flComboDelay[iPos] = flGetClampedValue(key, "ComboDelay", "Combo Delay", "Combo_Delay", "delay", g_esPlayer[player].g_flComboDelay[iPos], sSet[iPos], -1.0, 99999.0); + g_esPlayer[player].g_flComboDuration[iPos] = flGetClampedValue(key, "ComboDuration", "Combo Duration", "Combo_Duration", "duration", g_esPlayer[player].g_flComboDuration[iPos], sSet[iPos], -1.0, 99999.0); + g_esPlayer[player].g_flComboInterval[iPos] = flGetClampedValue(key, "ComboInterval", "Combo Interval", "Combo_Interval", "interval", g_esPlayer[player].g_flComboInterval[iPos], sSet[iPos], -1.0, 99999.0); + g_esPlayer[player].g_flComboRange[iPos] = flGetClampedValue(key, "ComboRange", "Combo Range", "Combo_Range", "range", g_esPlayer[player].g_flComboRange[iPos], sSet[iPos], -1.0, 99999.0); + g_esPlayer[player].g_flComboRangeChance[iPos] = flGetClampedValue(key, "ComboRangeChance", "Combo Range Chance", "Combo_Range_Chance", "rangechance", g_esPlayer[player].g_flComboRangeChance[iPos], sSet[iPos], -1.0, 100.0); + g_esPlayer[player].g_iComboRangeCooldown[iPos] = iGetClampedValue(key, "ComboRangeCooldown", "Combo Range Cooldown", "Combo_Range_Cooldown", "rangecooldown", g_esPlayer[player].g_iComboRangeCooldown[iPos], sSet[iPos], -1, 99999); + g_esPlayer[player].g_flComboRockChance[iPos] = flGetClampedValue(key, "ComboRockChance", "Combo Rock Chance", "Combo_Rock_Chance", "rockchance", g_esPlayer[player].g_flComboRockChance[iPos], sSet[iPos], -1.0, 100.0); + g_esPlayer[player].g_iComboRockCooldown[iPos] = iGetClampedValue(key, "ComboRockCooldown", "Combo Rock Cooldown", "Combo_Rock_Cooldown", "rockcooldown", g_esPlayer[player].g_iComboRockCooldown[iPos], sSet[iPos], -1, 99999); + g_esPlayer[player].g_flComboSpeed[iPos] = flGetClampedValue(key, "ComboSpeed", "Combo Speed", "Combo_Speed", "speed", g_esPlayer[player].g_flComboSpeed[iPos], sSet[iPos], -1.0, 99999.0); + } + } + } + } + else if (StrEqual(subsection, MT_CONFIG_SECTION_TRANSFORM, false)) + { + if (StrEqual(key, "TransformTypes", false) || StrEqual(key, "Transform Types", false) || StrEqual(key, "Transform_Types", false) || StrEqual(key, "transtypes", false)) + { + char sValue[50], sSet[10][5]; + strcopy(sValue, sizeof sValue, value); + ReplaceString(sValue, sizeof sValue, " ", ""); + ExplodeString(sValue, ",", sSet, sizeof sSet, sizeof sSet[]); + for (int iPos = 0; iPos < (sizeof esPlayer::g_iTransformType); iPos++) + { + g_esPlayer[player].g_iTransformType[iPos] = (sSet[iPos][0] != '\0') ? iClamp(StringToInt(sSet[iPos]), -1, MT_MAXTYPES) : g_esPlayer[player].g_iTransformType[iPos]; + } + } + } + else if (StrEqual(subsection, MT_CONFIG_SECTION_PROPS, false)) + { + if (StrEqual(key, "PropsChance", false) || StrEqual(key, "Props Chance", false) || StrEqual(key, "Props_Chance", false) || StrEqual(key, "chance", false)) + { + char sValue[54], sSet[9][6]; + strcopy(sValue, sizeof sValue, value); + ReplaceString(sValue, sizeof sValue, " ", ""); + ExplodeString(sValue, ",", sSet, sizeof sSet, sizeof sSet[]); + for (int iPos = 0; iPos < (sizeof esPlayer::g_flPropsChance); iPos++) + { + g_esPlayer[player].g_flPropsChance[iPos] = (sSet[iPos][0] != '\0') ? flClamp(StringToFloat(sSet[iPos]), -1.0, 100.0) : g_esPlayer[player].g_flPropsChance[iPos]; + } + } + else + { + char sValue[64], sSet[4][4]; + vGetConfigColors(sValue, sizeof sValue, value); + vSaveConfigColors(key, "OxygenTankColor", "Oxygen Tank Color", "Oxygen_Tank_Color", "oxygen", g_esPlayer[player].g_sOzTankColor, sizeof esPlayer::g_sOzTankColor, value); + vSaveConfigColors(key, "FlameColor", "Flame Color", "Flame_Color", "flame", g_esPlayer[player].g_sFlameColor, sizeof esPlayer::g_sFlameColor, value); + vSaveConfigColors(key, "RockColor", "Rock Color", "Rock_Color", "rock", g_esPlayer[player].g_sRockColor, sizeof esPlayer::g_sRockColor, value); + vSaveConfigColors(key, "TireColor", "Tire Color", "Tire_Color", "tire", g_esPlayer[player].g_sTireColor, sizeof esPlayer::g_sTireColor, value); + vSaveConfigColors(key, "PropaneTankColor", "Propane Tank Color", "Propane_Tank_Color", "propane", g_esPlayer[player].g_sPropTankColor, sizeof esPlayer::g_sPropTankColor, value); + vSaveConfigColors(key, "FlashlightColor", "Flashlight Color", "Flashlight_Color", "flashlight", g_esPlayer[player].g_sFlashlightColor, sizeof esPlayer::g_sFlashlightColor, value); + ReplaceString(sValue, sizeof sValue, " ", ""); + ExplodeString(sValue, ",", sSet, sizeof sSet, sizeof sSet[]); + + for (int iPos = 0; iPos < (sizeof esPlayer::g_iLightColor); iPos++) + { + g_esPlayer[player].g_iLightColor[iPos] = iGetClampedValue(key, "LightColor", "Light Color", "Light_Color", "light", g_esPlayer[player].g_iLightColor[iPos], sSet[iPos], -1, 255); + g_esPlayer[player].g_iOzTankColor[iPos] = iGetClampedValue(key, "OxygenTankColor", "Oxygen Tank Color", "Oxygen_Tank_Color", "oxygen", g_esPlayer[player].g_iOzTankColor[iPos], sSet[iPos], -1, 255); + g_esPlayer[player].g_iFlameColor[iPos] = iGetClampedValue(key, "FlameColor", "Flame Color", "Flame_Color", "flame", g_esPlayer[player].g_iFlameColor[iPos], sSet[iPos], -1, 255); + g_esPlayer[player].g_iRockColor[iPos] = iGetClampedValue(key, "RockColor", "Rock Color", "Rock_Color", "rock", g_esPlayer[player].g_iRockColor[iPos], sSet[iPos], -1, 255); + g_esPlayer[player].g_iTireColor[iPos] = iGetClampedValue(key, "TireColor", "Tire Color", "Tire_Color", "tire", g_esPlayer[player].g_iTireColor[iPos], sSet[iPos], -1, 255); + g_esPlayer[player].g_iPropTankColor[iPos] = iGetClampedValue(key, "PropaneTankColor", "Propane Tank Color", "Propane_Tank_Color", "propane", g_esPlayer[player].g_iPropTankColor[iPos], sSet[iPos], -1, 255); + g_esPlayer[player].g_iFlashlightColor[iPos] = iGetClampedValue(key, "FlashlightColor", "Flashlight Color", "Flashlight_Color", "flashlight", g_esPlayer[player].g_iFlashlightColor[iPos], sSet[iPos], -1, 255); + g_esPlayer[player].g_iCrownColor[iPos] = iGetClampedValue(key, "CrownColor", "Crown Color", "Crown_Color", "crown", g_esPlayer[player].g_iCrownColor[iPos], sSet[iPos], -1, 255); + } + } + } + else if (StrEqual(subsection, MT_CONFIG_SECTION_PARTICLES, false)) + { + if (StrEqual(key, "BodyChance", false) || StrEqual(key, "Body Chance", false) || StrEqual(key, "Body_Chance", false) || StrEqual(key, "bchance", false)) + { + char sValue[42], sSet[7][6]; + strcopy(sValue, sizeof sValue, value); + ReplaceString(sValue, sizeof sValue, " ", ""); + ExplodeString(sValue, ",", sSet, sizeof sSet, sizeof sSet[]); + for (int iPos = 0; iPos < (sizeof esPlayer::g_flBodyChance); iPos++) + { + g_esPlayer[player].g_flBodyChance[iPos] = (sSet[iPos][0] != '\0') ? flClamp(StringToFloat(sSet[iPos]), -1.0, 100.0) : g_esPlayer[player].g_flBodyChance[iPos]; + } + } + else if (StrEqual(key, "RockChance", false) || StrEqual(key, "Rock Chance", false) || StrEqual(key, "Rock_Chance", false) || StrEqual(key, "rchance", false)) + { + char sValue[24], sSet[4][6]; + strcopy(sValue, sizeof sValue, value); + ReplaceString(sValue, sizeof sValue, " ", ""); + ExplodeString(sValue, ",", sSet, sizeof sSet, sizeof sSet[]); + for (int iPos = 0; iPos < (sizeof esPlayer::g_flRockChance); iPos++) + { + g_esPlayer[player].g_flRockChance[iPos] = (sSet[iPos][0] != '\0') ? flClamp(StringToFloat(sSet[iPos]), -1.0, 100.0) : g_esPlayer[player].g_flRockChance[iPos]; + } } } -} - -void vReadAdminSettings(int admin, int type, const char[] key, const char[] value) -{ - int iIndex = g_esTank[type].g_iRecordedType[1]; - if (0 <= iIndex <= MT_MAXTYPES) + else if (!strncmp(subsection, "Tank", 4, false) || subsection[0] == '#' || IsCharNumeric(subsection[0]) || StrEqual(subsection, "all", false) || FindCharInString(subsection, ',') != -1 || FindCharInString(subsection, '-') != -1) { - if (StrEqual(key, "AccessFlags", false) || StrEqual(key, "Access Flags", false) || StrEqual(key, "Access_Flags", false) || StrEqual(key, "access", false)) + int iStartPos = 0, iIndex = 0, iRealType = 0; + if (!strncmp(subsection, "Tank", 4, false) || subsection[0] == '#') { - g_esAdmin[iIndex].g_iAccessFlags[admin] = ReadFlagString(value); + iStartPos = iGetConfigSectionNumber(subsection, strlen(subsection)), iIndex = StringToInt(subsection[iStartPos]); + vReadAdminSettings(player, iIndex, key, value); } - else if (StrEqual(key, "ImmunityFlags", false) || StrEqual(key, "Immunity Flags", false) || StrEqual(key, "Immunity_Flags", false) || StrEqual(key, "immunity", false)) + else if (IsCharNumeric(subsection[0]) || StrEqual(subsection, "all", false) || FindCharInString(subsection, ',') != -1 || FindCharInString(subsection, '-') != -1) { - g_esAdmin[iIndex].g_iImmunityFlags[admin] = ReadFlagString(value); + if (IsCharNumeric(subsection[0]) && FindCharInString(subsection, ',') == -1 && FindCharInString(subsection, '-') == -1) + { + iIndex = StringToInt(subsection); + vReadAdminSettings(player, iIndex, key, value); + } + else if (StrEqual(subsection, "all", false) || FindCharInString(subsection, ',') != -1 || FindCharInString(subsection, '-') != -1) + { + for (iIndex = g_esGeneral.g_iMinType; iIndex <= g_esGeneral.g_iMaxType; iIndex++) + { + if (iIndex <= 0) + { + continue; + } + + iRealType = iFindSectionType(subsection, iIndex); + if (iIndex == iRealType || StrEqual(subsection, "all", false)) + { + vReadAdminSettings(player, iIndex, key, value); + } + } + } } } } @@ -16559,480 +21543,920 @@ void vReadSpecialSettings(int type, int mode, const char[] subsection, const cha int iIndex = g_esTank[type].g_iRecordedType[0]; if (0 <= iIndex <= MT_MAXTYPES) { - g_esSpecial[iIndex].g_iSpecialTypes = iGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "SpecialTypes", "Special Types", "Special_Types", "spectypes", g_esSpecial[iIndex].g_iSpecialTypes, value, -1, 63); - g_esSpecial[iIndex].g_iSpecialTypes = (g_esSpecial[iIndex].g_iSpecialTypes > 0) ? iGetSpecialTypes(g_esSpecial[iIndex].g_iSpecialTypes, specsection) : 0; - g_esSpecial[iIndex].g_iGameType = iGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "GameType", "Game Type", "Game_Type", "game", g_esSpecial[iIndex].g_iGameType, value, -1, 2); - g_esSpecial[iIndex].g_flSpecialChance = flGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "SpecialChance", "Special Chance", "Special_Chance", "chance", g_esSpecial[iIndex].g_flSpecialChance, value, -1.0, 100.0); - g_esSpecial[iIndex].g_iSpecialModel = iGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "SpecialModel", "Special Model", "Special_Model", "model", g_esSpecial[iIndex].g_iSpecialModel, value, -1, 3); - g_esSpecial[iIndex].g_flBurnDuration = flGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "BurnDuration", "Burn Duration", "Burn_Duration", "burndur", g_esSpecial[iIndex].g_flBurnDuration, value, -1.0, 99999.0); - g_esSpecial[iIndex].g_flBurntSkin = flGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "BurntSkin", "Burnt Skin", "Burnt_Skin", "burnt", g_esSpecial[iIndex].g_flBurntSkin, value, -2.0, 1.0); - g_esSpecial[iIndex].g_iSpecialNote = iGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "SpecialNote", "Special Note", "Special_Note", "note", g_esSpecial[iIndex].g_iSpecialNote, value, -1, 1); - g_esSpecial[iIndex].g_iSpawnEnabled = iGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "SpawnEnabled", "Spawn Enabled", "Spawn_Enabled", "spawn", g_esSpecial[iIndex].g_iSpawnEnabled, value, -1, 1); - g_esSpecial[iIndex].g_iMenuEnabled = iGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "MenuEnabled", "Menu Enabled", "Menu_Enabled", "menu", g_esSpecial[iIndex].g_iMenuEnabled, value, -1, 1); - g_esSpecial[iIndex].g_iDeathRevert = iGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "DeathRevert", "Death Revert", "Death_Revert", "revert", g_esSpecial[iIndex].g_iDeathRevert, value, -1, 1); - g_esSpecial[iIndex].g_iRequiresHumans = iGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esSpecial[iIndex].g_iRequiresHumans, value, -1, 32); - g_esSpecial[iIndex].g_iAnnounceArrival = iGetKeyValue(subsection, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE2, key, "AnnounceArrival", "Announce Arrival", "Announce_Arrival", "arrival", g_esSpecial[iIndex].g_iAnnounceArrival, value, -1, 31); - g_esSpecial[iIndex].g_iAnnounceDeath = iGetKeyValue(subsection, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE2, key, "AnnounceDeath", "Announce Death", "Announce_Death", "death", g_esSpecial[iIndex].g_iAnnounceDeath, value, -1, 2); - g_esSpecial[iIndex].g_iAnnounceKill = iGetKeyValue(subsection, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE2, key, "AnnounceKill", "Announce Kill", "Announce_Kill", "kill", g_esSpecial[iIndex].g_iAnnounceKill, value, -1, 1); - g_esSpecial[iIndex].g_iArrivalMessage = iGetKeyValue(subsection, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE2, key, "ArrivalMessage", "Arrival Message", "Arrival_Message", "arrivalmsg", g_esSpecial[iIndex].g_iArrivalMessage, value, -1, 1023); - g_esSpecial[iIndex].g_iArrivalSound = iGetKeyValue(subsection, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE2, key, "ArrivalSound", "Arrival Sound", "Arrival_Sound", "arrivalsnd", g_esSpecial[iIndex].g_iArrivalSound, value, -1, 1); - g_esSpecial[iIndex].g_iDeathDetails = iGetKeyValue(subsection, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE2, key, "DeathDetails", "Death Details", "Death_Details", "deathdets", g_esSpecial[iIndex].g_iDeathDetails, value, -1, 5); - g_esSpecial[iIndex].g_iDeathMessage = iGetKeyValue(subsection, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE2, key, "DeathMessage", "Death Message", "Death_Message", "deathmsg", g_esSpecial[iIndex].g_iDeathMessage, value, -1, 1023); - g_esSpecial[iIndex].g_iDeathSound = iGetKeyValue(subsection, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE2, key, "DeathSound", "Death Sound", "Death_Sound", "deathsnd", g_esSpecial[iIndex].g_iDeathSound, value, -1, 1); - g_esSpecial[iIndex].g_iKillMessage = iGetKeyValue(subsection, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE2, key, "KillMessage", "Kill Message", "Kill_Message", "killmsg", g_esSpecial[iIndex].g_iKillMessage, value, -1, 1023); - g_esSpecial[iIndex].g_iVocalizeArrival = iGetKeyValue(subsection, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE2, key, "VocalizeArrival", "Vocalize Arrival", "Vocalize_Arrival", "arrivalvoc", g_esSpecial[iIndex].g_iVocalizeArrival, value, -1, 1); - g_esSpecial[iIndex].g_iVocalizeDeath = iGetKeyValue(subsection, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE2, key, "VocalizeDeath", "Vocalize Death", "Vocalize_Death", "deathvoc", g_esSpecial[iIndex].g_iVocalizeDeath, value, -1, 1); - g_esSpecial[iIndex].g_iGlowEnabled = iGetKeyValue(subsection, MT_CONFIG_SECTION_GLOW, MT_CONFIG_SECTION_GLOW, MT_CONFIG_SECTION_GLOW, MT_CONFIG_SECTION_GLOW, key, "GlowEnabled", "Glow Enabled", "Glow_Enabled", "genabled", g_esSpecial[iIndex].g_iGlowEnabled, value, -1, 1); - g_esSpecial[iIndex].g_iGlowFlashing = iGetKeyValue(subsection, MT_CONFIG_SECTION_GLOW, MT_CONFIG_SECTION_GLOW, MT_CONFIG_SECTION_GLOW, MT_CONFIG_SECTION_GLOW, key, "GlowFlashing", "Glow Flashing", "Glow_Flashing", "flashing", g_esSpecial[iIndex].g_iGlowFlashing, value, -1, 1); - g_esSpecial[iIndex].g_iGlowType = iGetKeyValue(subsection, MT_CONFIG_SECTION_GLOW, MT_CONFIG_SECTION_GLOW, MT_CONFIG_SECTION_GLOW, MT_CONFIG_SECTION_GLOW, key, "GlowType", "Glow Type", "Glow_Type", "type", g_esSpecial[iIndex].g_iGlowType, value, -1, 1); - g_esSpecial[iIndex].g_iDisplayHealth = iGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "DisplayHealth", "Display Health", "Display_Health", "displayhp", g_esSpecial[iIndex].g_iDisplayHealth, value, -1, 11); - g_esSpecial[iIndex].g_iDisplayHealthType = iGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "DisplayHealthType", "Display Health Type", "Display_Health_Type", "displaytype", g_esSpecial[iIndex].g_iDisplayHealthType, value, -1, 2); - g_esSpecial[iIndex].g_flHealPercentMultiplier = flGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "HealthPercentageMultiplier", "Health Percentage Multiplier", "Health_Percentage_Multiplier", "hpmulti", g_esSpecial[iIndex].g_flHealPercentMultiplier, value, -1.0, 99999.0); - g_esSpecial[iIndex].g_iHumanMultiplierMode = iGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "HumanMultiplierMode", "Human Multiplier Mode", "Human_Multiplier_Mode", "humanmultimode", g_esSpecial[iIndex].g_iHumanMultiplierMode, value, -1, 1); - g_esSpecial[iIndex].g_iMinimumHumans = iGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "MinimumHumans", "Minimum Humans", "Minimum_Humans", "minhumans", g_esSpecial[iIndex].g_iMinimumHumans, value, -1, 32); - g_esSpecial[iIndex].g_iMultiplyHealth = iGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "MultiplyHealth", "Multiply Health", "Multiply_Health", "multihp", g_esSpecial[iIndex].g_iMultiplyHealth, value, -1, 3); - g_esSpecial[iIndex].g_iSpawnProtection = iGetKeyValue(subsection, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION2, key, "SpawnProtection", "Spawn Protection", "Spawn_Protection", "protect", g_esSpecial[iIndex].g_iSpawnProtection, value, -1, 3); - g_esSpecial[iIndex].g_flArmorDuration = flGetKeyValue(subsection, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION2, key, "ArmorDuration", "Armor Duration", "Armor_Duration", "armorduration", g_esSpecial[iIndex].g_flArmorDuration, value, -1.0, 99999.0); - g_esSpecial[iIndex].g_flArmorResistance = flGetKeyValue(subsection, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION2, key, "ArmorResistance", "Armor Resistance", "Armor_Resistance", "armorres", g_esSpecial[iIndex].g_flArmorResistance, value, -1.0, 1.0); - g_esSpecial[iIndex].g_flShieldDuration = flGetKeyValue(subsection, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION2, key, "ShieldDuration", "Shield Duration", "Shield_Duration", "shieldduration", g_esSpecial[iIndex].g_flShieldDuration, value, -1.0, 99999.0); - g_esSpecial[iIndex].g_flShieldResistance = flGetKeyValue(subsection, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION2, key, "ShieldResistance", "Shield Resistance", "Shield_Resistance", "shieldres", g_esSpecial[iIndex].g_flShieldResistance, value, -1.0, 1.0); - g_esSpecial[iIndex].g_iHumanSupport = iGetKeyValue(subsection, MT_CONFIG_SECTION_HUMAN, MT_CONFIG_SECTION_HUMAN2, MT_CONFIG_SECTION_HUMAN3, MT_CONFIG_SECTION_HUMAN4, key, MT_CONFIG_SECTION_HUMAN, MT_CONFIG_SECTION_HUMAN2, MT_CONFIG_SECTION_HUMAN3, MT_CONFIG_SECTION_HUMAN4, g_esSpecial[iIndex].g_iHumanSupport, value, -1, 2); - g_esSpecial[iIndex].g_iTypeLimit = iGetKeyValue(subsection, MT_CONFIG_SECTION_SPAWN, MT_CONFIG_SECTION_SPAWN, MT_CONFIG_SECTION_SPAWN, MT_CONFIG_SECTION_SPAWN, key, "TypeLimit", "Type Limit", "Type_Limit", "typelimit", g_esSpecial[iIndex].g_iTypeLimit, value, -1, 32); - g_esSpecial[iIndex].g_iFinaleSpecial = iGetKeyValue(subsection, MT_CONFIG_SECTION_SPAWN, MT_CONFIG_SECTION_SPAWN, MT_CONFIG_SECTION_SPAWN, MT_CONFIG_SECTION_SPAWN, key, "FinaleSpecial", "Finale Special", "Finale_Special", "finale", g_esSpecial[iIndex].g_iFinaleSpecial, value, -1, 4); - g_esSpecial[iIndex].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_CONFIG_SECTION_SPAWN, MT_CONFIG_SECTION_SPAWN, MT_CONFIG_SECTION_SPAWN, MT_CONFIG_SECTION_SPAWN, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esSpecial[iIndex].g_flCloseAreasOnly, value, -1.0, 99999.0); - g_esSpecial[iIndex].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_CONFIG_SECTION_SPAWN, MT_CONFIG_SECTION_SPAWN, MT_CONFIG_SECTION_SPAWN, MT_CONFIG_SECTION_SPAWN, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esSpecial[iIndex].g_flOpenAreasOnly, value, -1.0, 99999.0); - g_esSpecial[iIndex].g_iBossBaseType = iGetKeyValue(subsection, MT_CONFIG_SECTION_BOSS, MT_CONFIG_SECTION_BOSS, MT_CONFIG_SECTION_BOSS, MT_CONFIG_SECTION_BOSS, key, "BossBaseType", "Boss Base Type", "Boss_Base_Type", "bossbase", g_esSpecial[iIndex].g_iBossBaseType, value, -1, MT_MAXTYPES); - g_esSpecial[iIndex].g_iBossEffects = iGetKeyValue(subsection, MT_CONFIG_SECTION_BOSS, MT_CONFIG_SECTION_BOSS, MT_CONFIG_SECTION_BOSS, MT_CONFIG_SECTION_BOSS, key, "BossEffects", "Boss Effects", "Boss_Effects", "bosseffects", g_esSpecial[iIndex].g_iBossEffects, value, -1, 15); - g_esSpecial[iIndex].g_iBossLimit = iGetKeyValue(subsection, MT_CONFIG_SECTION_BOSS, MT_CONFIG_SECTION_BOSS, MT_CONFIG_SECTION_BOSS, MT_CONFIG_SECTION_BOSS, key, "BossLimit", "Boss Limit", "Boss_Limit", "bosslimit", g_esSpecial[iIndex].g_iBossLimit, value, -1, 32); - g_esSpecial[iIndex].g_iBossStages = iGetKeyValue(subsection, MT_CONFIG_SECTION_BOSS, MT_CONFIG_SECTION_BOSS, MT_CONFIG_SECTION_BOSS, MT_CONFIG_SECTION_BOSS, key, "BossStages", "Boss Stages", "Boss_Stages", "bossstages", g_esSpecial[iIndex].g_iBossStages, value, -1, 4); - g_esSpecial[iIndex].g_iRandomSpecial = iGetKeyValue(subsection, MT_CONFIG_SECTION_RANDOM, MT_CONFIG_SECTION_RANDOM, MT_CONFIG_SECTION_RANDOM, MT_CONFIG_SECTION_RANDOM, key, "RandomSpecial", "Random Special", "Random_Special", "random", g_esSpecial[iIndex].g_iRandomSpecial, value, -1, 1); - g_esSpecial[iIndex].g_flRandomDuration = flGetKeyValue(subsection, MT_CONFIG_SECTION_RANDOM, MT_CONFIG_SECTION_RANDOM, MT_CONFIG_SECTION_RANDOM, MT_CONFIG_SECTION_RANDOM, key, "RandomDuration", "Random Duration", "Random_Duration", "randduration", g_esSpecial[iIndex].g_flRandomDuration, value, -1.0, 99999.0); - g_esSpecial[iIndex].g_flRandomInterval = flGetKeyValue(subsection, MT_CONFIG_SECTION_RANDOM, MT_CONFIG_SECTION_RANDOM, MT_CONFIG_SECTION_RANDOM, MT_CONFIG_SECTION_RANDOM, key, "RandomInterval", "Random Interval", "Random_Interval", "randinterval", g_esSpecial[iIndex].g_flRandomInterval, value, -1.0, 99999.0); - g_esSpecial[iIndex].g_flTransformDelay = flGetKeyValue(subsection, MT_CONFIG_SECTION_TRANSFORM, MT_CONFIG_SECTION_TRANSFORM, MT_CONFIG_SECTION_TRANSFORM, MT_CONFIG_SECTION_TRANSFORM, key, "TransformDelay", "Transform Delay", "Transform_Delay", "transdelay", g_esSpecial[iIndex].g_flTransformDelay, value, -1.0, 99999.0); - g_esSpecial[iIndex].g_flTransformDuration = flGetKeyValue(subsection, MT_CONFIG_SECTION_TRANSFORM, MT_CONFIG_SECTION_TRANSFORM, MT_CONFIG_SECTION_TRANSFORM, MT_CONFIG_SECTION_TRANSFORM, key, "TransformDuration", "Transform Duration", "Transform_Duration", "transduration", g_esSpecial[iIndex].g_flTransformDuration, value, -1.0, 99999.0); - g_esSpecial[iIndex].g_iSpawnType = iGetKeyValue(subsection, MT_CONFIG_SECTION_SPAWN, MT_CONFIG_SECTION_SPAWN, MT_CONFIG_SECTION_SPAWN, MT_CONFIG_SECTION_SPAWN, key, "SpawnType", "Spawn Type", "Spawn_Type", "spawntype", g_esSpecial[iIndex].g_iSpawnType, value, -1, 4); - g_esSpecial[iIndex].g_iRockModel = iGetKeyValue(subsection, MT_CONFIG_SECTION_PROPS, MT_CONFIG_SECTION_PROPS, MT_CONFIG_SECTION_PROPS, MT_CONFIG_SECTION_PROPS, key, "RockModel", "Rock Model", "Rock_Model", "rockmodel", g_esSpecial[iIndex].g_iRockModel, value, -1, 2); - g_esSpecial[iIndex].g_iBodyEffects = iGetKeyValue(subsection, MT_CONFIG_SECTION_PARTICLES, MT_CONFIG_SECTION_PARTICLES, MT_CONFIG_SECTION_PARTICLES, MT_CONFIG_SECTION_PARTICLES, key, "BodyEffects", "Body Effects", "Body_Effects", "body", g_esSpecial[iIndex].g_iBodyEffects, value, -1, 127); - g_esSpecial[iIndex].g_iRockEffects = iGetKeyValue(subsection, MT_CONFIG_SECTION_PARTICLES, MT_CONFIG_SECTION_PARTICLES, MT_CONFIG_SECTION_PARTICLES, MT_CONFIG_SECTION_PARTICLES, key, "RockEffects", "Rock Effects", "Rock_Effects", "rock", g_esSpecial[iIndex].g_iRockEffects, value, -1, 15); - g_esSpecial[iIndex].g_flAttackInterval = flGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "AttackInterval", "Attack Interval", "Attack_Interval", "attack", g_esSpecial[iIndex].g_flAttackInterval, value, -1.0, 99999.0); - g_esSpecial[iIndex].g_flClawDamage = flGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "ClawDamage", "Claw Damage", "Claw_Damage", "claw", g_esSpecial[iIndex].g_flClawDamage, value, -2.0, 99999.0); - g_esSpecial[iIndex].g_flHittableDamage = flGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "HittableDamage", "Hittable Damage", "Hittable_Damage", "hittable", g_esSpecial[iIndex].g_flHittableDamage, value, -2.0, 99999.0); - g_esSpecial[iIndex].g_flIncapDamageMultiplier = flGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "IncapDamageMultiplier", "Incap Damage Multiplier", "Incap_Damage_Multiplier", "incapdmgmulti", g_esSpecial[iIndex].g_flIncapDamageMultiplier, value, -1.0, 99999.0); - g_esSpecial[iIndex].g_iIntangibleBody = iGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "IntangibleBody", "Intangible Body", "Intangible_Body", "intangible", g_esSpecial[iIndex].g_iIntangibleBody, value, -1, 1); - g_esSpecial[iIndex].g_iMeleeHitMode = iGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "MeleeHitMode", "Melee Hit Mode", "Melee_Hit_Mode", "meleehit", g_esSpecial[iIndex].g_iMeleeHitMode, value, -1, 2); - g_esSpecial[iIndex].g_flMeleeHitValue = flGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "MeleeHitValue", "Melee Hit Value", "Melee_Hit_Value", "meleevalue", g_esSpecial[iIndex].g_flMeleeHitValue, value, -1.0, 99999.0); - g_esSpecial[iIndex].g_flPinDamage = flGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "PinDamage", "Pin Damage", "Pin_Damage", "pindmg", g_esSpecial[iIndex].g_flPinDamage, value, -2.0, 99999.0); - g_esSpecial[iIndex].g_flRunSpeed = flGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "RunSpeed", "Run Speed", "Run_Speed", "speed", g_esSpecial[iIndex].g_flRunSpeed, value, -1.0, 99.0); - g_esSpecial[iIndex].g_flSpecialInterval = flGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "SpecialInterval", "Special Interval", "Special_Interval", "specint", g_esSpecial[iIndex].g_flSpecialInterval, value, -1.0, 99999.0); - g_esSpecial[iIndex].g_iThrowRock = iGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "ThrowRock", "Throw Rock", "Throw_Rock", "throwrock", g_esSpecial[iIndex].g_iThrowRock, value, -1, 1); - g_esSpecial[iIndex].g_iBulletImmunity = iGetKeyValue(subsection, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE2, key, "BulletImmunity", "Bullet Immunity", "Bullet_Immunity", "bullet", g_esSpecial[iIndex].g_iBulletImmunity, value, -1, 1); - g_esSpecial[iIndex].g_iExplosiveImmunity = iGetKeyValue(subsection, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE2, key, "ExplosiveImmunity", "Explosive Immunity", "Explosive_Immunity", "explosive", g_esSpecial[iIndex].g_iExplosiveImmunity, value, -1, 1); - g_esSpecial[iIndex].g_iFireImmunity = iGetKeyValue(subsection, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE2, key, "FireImmunity", "Fire Immunity", "Fire_Immunity", "fire", g_esSpecial[iIndex].g_iFireImmunity, value, -1, 1); - g_esSpecial[iIndex].g_iHittableImmunity = iGetKeyValue(subsection, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE2, key, "HittableImmunity", "Hittable Immunity", "Hittable_Immunity", "hittable", g_esSpecial[iIndex].g_iHittableImmunity, value, -1, 1); - g_esSpecial[iIndex].g_iMeleeImmunity = iGetKeyValue(subsection, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE2, key, "MeleeImmunity", "Melee Immunity", "Melee_Immunity", "melee", g_esSpecial[iIndex].g_iMeleeImmunity, value, -1, 1); - g_esSpecial[iIndex].g_iVomitImmunity = iGetKeyValue(subsection, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE2, key, "VomitImmunity", "Vomit Immunity", "Vomit_Immunity", "vomit", g_esSpecial[iIndex].g_iVomitImmunity, value, -1, 1); - - vGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "HealthCharacters", "Health Characters", "Health_Characters", "hpchars", g_esSpecial[iIndex].g_sHealthCharacters, sizeof esSpecial::g_sHealthCharacters, value); - vGetKeyValue(subsection, MT_CONFIG_SECTION_COMBO, MT_CONFIG_SECTION_COMBO, MT_CONFIG_SECTION_COMBO, MT_CONFIG_SECTION_COMBO, key, "ComboSet", "Combo Set", "Combo_Set", "set", g_esSpecial[iIndex].g_sComboSet, sizeof esSpecial::g_sComboSet, value); + if (StrContains(specsection, MT_CONFIG_SECTION_SMOKER, false) != -1 || StrContains(specsection, MT_CONFIG_SECTION_BOOMER, false) != -1 || StrContains(specsection, MT_CONFIG_SECTION_HUNTER, false) != -1 || StrContains(specsection, MT_CONFIG_SECTION_SPITTER, false) != -1 || StrContains(specsection, MT_CONFIG_SECTION_JOCKEY, false) != -1 + || StrContains(specsection, MT_CONFIG_SECTION_CHARGER, false) != -1 || StrEqual(specsection, MT_CONFIG_SECTION_SPECIAL, false) || StrContains(specsection, MT_CONFIG_SECTION_SPECIAL2, false) != -1 || StrEqual(specsection, MT_CONFIG_SECTION_INFECTED, false) || StrContains(specsection, MT_CONFIG_SECTION_INFECTED2, false) != -1) + { + g_esSpecial[iIndex].g_iSpecialTypes = iGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "SpecialTypes", "Special Types", "Special_Types", "spectypes", g_esSpecial[iIndex].g_iSpecialTypes, value, -1, 63); + g_esSpecial[iIndex].g_iSpecialTypes = (g_esSpecial[iIndex].g_iSpecialTypes > 0) ? iGetSpecialTypes(g_esSpecial[iIndex].g_iSpecialTypes, specsection) : 0; + g_esSpecial[iIndex].g_iGameType = iGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "GameType", "Game Type", "Game_Type", "game", g_esSpecial[iIndex].g_iGameType, value, -1, 2); + g_esSpecial[iIndex].g_flSpecialChance = flGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "SpecialChance", "Special Chance", "Special_Chance", "chance", g_esSpecial[iIndex].g_flSpecialChance, value, -1.0, 100.0); + g_esSpecial[iIndex].g_iSpecialNote = iGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "SpecialNote", "Special Note", "Special_Note", "note", g_esSpecial[iIndex].g_iSpecialNote, value, -1, 1); + g_esSpecial[iIndex].g_iSpecialModel = iGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "SpecialModel", "Special Model", "Special_Model", "model", g_esSpecial[iIndex].g_iSpecialModel, value, -1, 3); + g_esSpecial[iIndex].g_flBurnDuration = flGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "BurnDuration", "Burn Duration", "Burn_Duration", "burndur", g_esSpecial[iIndex].g_flBurnDuration, value, -1.0, 99999.0); + g_esSpecial[iIndex].g_flBurntSkin = flGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "BurntSkin", "Burnt Skin", "Burnt_Skin", "burnt", g_esSpecial[iIndex].g_flBurntSkin, value, -2.0, 1.0); + g_esSpecial[iIndex].g_iSpawnEnabled = iGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "SpawnEnabled", "Spawn Enabled", "Spawn_Enabled", "spawn", g_esSpecial[iIndex].g_iSpawnEnabled, value, -1, 1); + g_esSpecial[iIndex].g_iMenuEnabled = iGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "MenuEnabled", "Menu Enabled", "Menu_Enabled", "menu", g_esSpecial[iIndex].g_iMenuEnabled, value, -1, 1); + g_esSpecial[iIndex].g_iDeathRevert = iGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "DeathRevert", "Death Revert", "Death_Revert", "revert", g_esSpecial[iIndex].g_iDeathRevert, value, -1, 1); + g_esSpecial[iIndex].g_iRequiresHumans = iGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esSpecial[iIndex].g_iRequiresHumans, value, -1, 32); + g_esSpecial[iIndex].g_iAnnounceArrival = iGetKeyValue(subsection, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE2, key, "AnnounceArrival", "Announce Arrival", "Announce_Arrival", "arrival", g_esSpecial[iIndex].g_iAnnounceArrival, value, -1, 31); + g_esSpecial[iIndex].g_iAnnounceDeath = iGetKeyValue(subsection, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE2, key, "AnnounceDeath", "Announce Death", "Announce_Death", "death", g_esSpecial[iIndex].g_iAnnounceDeath, value, -1, 2); + g_esSpecial[iIndex].g_iAnnounceKill = iGetKeyValue(subsection, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE2, key, "AnnounceKill", "Announce Kill", "Announce_Kill", "kill", g_esSpecial[iIndex].g_iAnnounceKill, value, -1, 1); + g_esSpecial[iIndex].g_iArrivalMessage = iGetKeyValue(subsection, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE2, key, "ArrivalMessage", "Arrival Message", "Arrival_Message", "arrivalmsg", g_esSpecial[iIndex].g_iArrivalMessage, value, -1, 1023); + g_esSpecial[iIndex].g_iArrivalSound = iGetKeyValue(subsection, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE2, key, "ArrivalSound", "Arrival Sound", "Arrival_Sound", "arrivalsnd", g_esSpecial[iIndex].g_iArrivalSound, value, -1, 1); + g_esSpecial[iIndex].g_iDeathDetails = iGetKeyValue(subsection, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE2, key, "DeathDetails", "Death Details", "Death_Details", "deathdets", g_esSpecial[iIndex].g_iDeathDetails, value, -1, 5); + g_esSpecial[iIndex].g_iDeathMessage = iGetKeyValue(subsection, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE2, key, "DeathMessage", "Death Message", "Death_Message", "deathmsg", g_esSpecial[iIndex].g_iDeathMessage, value, -1, 1023); + g_esSpecial[iIndex].g_iDeathSound = iGetKeyValue(subsection, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE2, key, "DeathSound", "Death Sound", "Death_Sound", "deathsnd", g_esSpecial[iIndex].g_iDeathSound, value, -1, 1); + g_esSpecial[iIndex].g_iKillMessage = iGetKeyValue(subsection, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE2, key, "KillMessage", "Kill Message", "Kill_Message", "killmsg", g_esSpecial[iIndex].g_iKillMessage, value, -1, 1023); + g_esSpecial[iIndex].g_iVocalizeArrival = iGetKeyValue(subsection, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE2, key, "VocalizeArrival", "Vocalize Arrival", "Vocalize_Arrival", "arrivalvoc", g_esSpecial[iIndex].g_iVocalizeArrival, value, -1, 1); + g_esSpecial[iIndex].g_iVocalizeDeath = iGetKeyValue(subsection, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE2, key, "VocalizeDeath", "Vocalize Death", "Vocalize_Death", "deathvoc", g_esSpecial[iIndex].g_iVocalizeDeath, value, -1, 1); + g_esSpecial[iIndex].g_iGlowEnabled = iGetKeyValue(subsection, MT_CONFIG_SECTION_GLOW, MT_CONFIG_SECTION_GLOW, MT_CONFIG_SECTION_GLOW, MT_CONFIG_SECTION_GLOW, key, "GlowEnabled", "Glow Enabled", "Glow_Enabled", "genabled", g_esSpecial[iIndex].g_iGlowEnabled, value, -1, 1); + g_esSpecial[iIndex].g_iGlowFlashing = iGetKeyValue(subsection, MT_CONFIG_SECTION_GLOW, MT_CONFIG_SECTION_GLOW, MT_CONFIG_SECTION_GLOW, MT_CONFIG_SECTION_GLOW, key, "GlowFlashing", "Glow Flashing", "Glow_Flashing", "flashing", g_esSpecial[iIndex].g_iGlowFlashing, value, -1, 1); + g_esSpecial[iIndex].g_iGlowType = iGetKeyValue(subsection, MT_CONFIG_SECTION_GLOW, MT_CONFIG_SECTION_GLOW, MT_CONFIG_SECTION_GLOW, MT_CONFIG_SECTION_GLOW, key, "GlowType", "Glow Type", "Glow_Type", "type", g_esSpecial[iIndex].g_iGlowType, value, -1, 1); + g_esSpecial[iIndex].g_flArmorPercentage = flGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "ArmorPercentage", "Armor Percentage", "Armor_Percentage", "armorpercent", g_esSpecial[iIndex].g_flArmorPercentage, value, -1.0, 1.0); + g_esSpecial[iIndex].g_flArmorResistance[0] = flGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "ArmorResistance", "Armor Resistance", "Armor_Resistance", "armorres", g_esSpecial[iIndex].g_flArmorResistance[0], value, -1.0, 1.0); + g_esSpecial[iIndex].g_flShieldPercentage = flGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "ShieldPercentage", "Shield Percentage", "Shield_Percentage", "shieldpercent", g_esSpecial[iIndex].g_flShieldPercentage, value, -1.0, 1.0); + g_esSpecial[iIndex].g_flShieldRate = flGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "ShieldRate", "Shield Rate", "Shield_Rate", "shieldrate", g_esSpecial[iIndex].g_flShieldRate, value, -1.0, 1.0); + g_esSpecial[iIndex].g_flPassiveDelay = flGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "PassiveDelay", "Passive Delay", "Passive_Delay", "passdelay", g_esSpecial[iIndex].g_flPassiveDelay, value, -1.0, 99999.0); + g_esSpecial[iIndex].g_iPassiveHealth = iGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "PassiveHealth", "Passive Health", "Passive_Health", "passhp", g_esSpecial[iIndex].g_iPassiveHealth, value, MT_MAX_HEALTH_REDUCTION, MT_MAXHEALTH); + g_esSpecial[iIndex].g_flPassiveInterval = flGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "PassiveInterval", "Passive Interval", "Passive_Interval", "passint", g_esSpecial[iIndex].g_flPassiveInterval, value, -1.0, 99999.0); + g_esSpecial[iIndex].g_iDisplayHealth = iGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "DisplayHealth", "Display Health", "Display_Health", "displayhp", g_esSpecial[iIndex].g_iDisplayHealth, value, -1, 11); + g_esSpecial[iIndex].g_iDisplayHealthType = iGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "DisplayHealthType", "Display Health Type", "Display_Health_Type", "displaytype", g_esSpecial[iIndex].g_iDisplayHealthType, value, -1, 2); + g_esSpecial[iIndex].g_flHealPercentMultiplier = flGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "HealthPercentageMultiplier", "Health Percentage Multiplier", "Health_Percentage_Multiplier", "hpmulti", g_esSpecial[iIndex].g_flHealPercentMultiplier, value, -1.0, 99999.0); + g_esSpecial[iIndex].g_iHumanMultiplierMode = iGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "HumanMultiplierMode", "Human Multiplier Mode", "Human_Multiplier_Mode", "humanmultimode", g_esSpecial[iIndex].g_iHumanMultiplierMode, value, -1, 1); + g_esSpecial[iIndex].g_iMinimumHumans = iGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "MinimumHumans", "Minimum Humans", "Minimum_Humans", "minhumans", g_esSpecial[iIndex].g_iMinimumHumans, value, -1, 32); + g_esSpecial[iIndex].g_iMultiplyHealth = iGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "MultiplyHealth", "Multiply Health", "Multiply_Health", "multihp", g_esSpecial[iIndex].g_iMultiplyHealth, value, -1, 3); + g_esSpecial[iIndex].g_iSpawnProtection = iGetKeyValue(subsection, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT2, key, "SpawnProtection", "Spawn Protection", "Spawn_Protection", "protect", g_esSpecial[iIndex].g_iSpawnProtection, value, -1, 3); + g_esSpecial[iIndex].g_flArmorDuration = flGetKeyValue(subsection, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT2, key, "ArmorDuration", "Armor Duration", "Armor_Duration", "armorduration", g_esSpecial[iIndex].g_flArmorDuration, value, -1.0, 99999.0); + g_esSpecial[iIndex].g_flArmorResistance[1] = flGetKeyValue(subsection, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT2, key, "ArmorResistance", "Armor Resistance", "Armor_Resistance", "armorres", g_esSpecial[iIndex].g_flArmorResistance[1], value, -1.0, 1.0); + g_esSpecial[iIndex].g_flShieldDuration = flGetKeyValue(subsection, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT2, key, "ShieldDuration", "Shield Duration", "Shield_Duration", "shieldduration", g_esSpecial[iIndex].g_flShieldDuration, value, -1.0, 99999.0); + g_esSpecial[iIndex].g_flShieldResistance = flGetKeyValue(subsection, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT2, key, "ShieldResistance", "Shield Resistance", "Shield_Resistance", "shieldres", g_esSpecial[iIndex].g_flShieldResistance, value, -1.0, 1.0); + g_esSpecial[iIndex].g_iHumanSupport = iGetKeyValue(subsection, MT_CONFIG_SECTION_HUMAN, MT_CONFIG_SECTION_HUMAN2, MT_CONFIG_SECTION_HUMAN3, MT_CONFIG_SECTION_HUMAN4, key, MT_CONFIG_SECTION_HUMAN, MT_CONFIG_SECTION_HUMAN2, MT_CONFIG_SECTION_HUMAN3, MT_CONFIG_SECTION_HUMAN4, g_esSpecial[iIndex].g_iHumanSupport, value, -1, 2); + g_esSpecial[iIndex].g_iTypeLimit = iGetKeyValue(subsection, MT_CONFIG_SECTION_SPAWN, MT_CONFIG_SECTION_SPAWN, MT_CONFIG_SECTION_SPAWN, MT_CONFIG_SECTION_SPAWN, key, "TypeLimit", "Type Limit", "Type_Limit", "typelimit", g_esSpecial[iIndex].g_iTypeLimit, value, -1, 32); + g_esSpecial[iIndex].g_iFinaleSpecial = iGetKeyValue(subsection, MT_CONFIG_SECTION_SPAWN, MT_CONFIG_SECTION_SPAWN, MT_CONFIG_SECTION_SPAWN, MT_CONFIG_SECTION_SPAWN, key, "FinaleSpecial", "Finale Special", "Finale_Special", "finale", g_esSpecial[iIndex].g_iFinaleSpecial, value, -1, 4); + g_esSpecial[iIndex].g_flCloseAreasOnly = flGetKeyValue(subsection, MT_CONFIG_SECTION_SPAWN, MT_CONFIG_SECTION_SPAWN, MT_CONFIG_SECTION_SPAWN, MT_CONFIG_SECTION_SPAWN, key, "CloseAreasOnly", "Close Areas Only", "Close_Areas_Only", "closeareas", g_esSpecial[iIndex].g_flCloseAreasOnly, value, -1.0, 99999.0); + g_esSpecial[iIndex].g_flOpenAreasOnly = flGetKeyValue(subsection, MT_CONFIG_SECTION_SPAWN, MT_CONFIG_SECTION_SPAWN, MT_CONFIG_SECTION_SPAWN, MT_CONFIG_SECTION_SPAWN, key, "OpenAreasOnly", "Open Areas Only", "Open_Areas_Only", "openareas", g_esSpecial[iIndex].g_flOpenAreasOnly, value, -1.0, 99999.0); + g_esSpecial[iIndex].g_iBossBaseType = iGetKeyValue(subsection, MT_CONFIG_SECTION_BOSS, MT_CONFIG_SECTION_BOSS, MT_CONFIG_SECTION_BOSS, MT_CONFIG_SECTION_BOSS, key, "BossBaseType", "Boss Base Type", "Boss_Base_Type", "bossbase", g_esSpecial[iIndex].g_iBossBaseType, value, -1, MT_MAXTYPES); + g_esSpecial[iIndex].g_iBossEffects = iGetKeyValue(subsection, MT_CONFIG_SECTION_BOSS, MT_CONFIG_SECTION_BOSS, MT_CONFIG_SECTION_BOSS, MT_CONFIG_SECTION_BOSS, key, "BossEffects", "Boss Effects", "Boss_Effects", "bosseffects", g_esSpecial[iIndex].g_iBossEffects, value, -1, 15); + g_esSpecial[iIndex].g_iBossLimit = iGetKeyValue(subsection, MT_CONFIG_SECTION_BOSS, MT_CONFIG_SECTION_BOSS, MT_CONFIG_SECTION_BOSS, MT_CONFIG_SECTION_BOSS, key, "BossLimit", "Boss Limit", "Boss_Limit", "bosslimit", g_esSpecial[iIndex].g_iBossLimit, value, -1, 32); + g_esSpecial[iIndex].g_iBossStages = iGetKeyValue(subsection, MT_CONFIG_SECTION_BOSS, MT_CONFIG_SECTION_BOSS, MT_CONFIG_SECTION_BOSS, MT_CONFIG_SECTION_BOSS, key, "BossStages", "Boss Stages", "Boss_Stages", "bossstages", g_esSpecial[iIndex].g_iBossStages, value, -1, 4); + g_esSpecial[iIndex].g_iRandomSpecial = iGetKeyValue(subsection, MT_CONFIG_SECTION_RANDOM, MT_CONFIG_SECTION_RANDOM, MT_CONFIG_SECTION_RANDOM, MT_CONFIG_SECTION_RANDOM, key, "RandomSpecial", "Random Special", "Random_Special", "random", g_esSpecial[iIndex].g_iRandomSpecial, value, -1, 1); + g_esSpecial[iIndex].g_flRandomDuration = flGetKeyValue(subsection, MT_CONFIG_SECTION_RANDOM, MT_CONFIG_SECTION_RANDOM, MT_CONFIG_SECTION_RANDOM, MT_CONFIG_SECTION_RANDOM, key, "RandomDuration", "Random Duration", "Random_Duration", "randduration", g_esSpecial[iIndex].g_flRandomDuration, value, -1.0, 99999.0); + g_esSpecial[iIndex].g_flRandomInterval = flGetKeyValue(subsection, MT_CONFIG_SECTION_RANDOM, MT_CONFIG_SECTION_RANDOM, MT_CONFIG_SECTION_RANDOM, MT_CONFIG_SECTION_RANDOM, key, "RandomInterval", "Random Interval", "Random_Interval", "randinterval", g_esSpecial[iIndex].g_flRandomInterval, value, -1.0, 99999.0); + g_esSpecial[iIndex].g_flTransformDelay = flGetKeyValue(subsection, MT_CONFIG_SECTION_TRANSFORM, MT_CONFIG_SECTION_TRANSFORM, MT_CONFIG_SECTION_TRANSFORM, MT_CONFIG_SECTION_TRANSFORM, key, "TransformDelay", "Transform Delay", "Transform_Delay", "transdelay", g_esSpecial[iIndex].g_flTransformDelay, value, -1.0, 99999.0); + g_esSpecial[iIndex].g_flTransformDuration = flGetKeyValue(subsection, MT_CONFIG_SECTION_TRANSFORM, MT_CONFIG_SECTION_TRANSFORM, MT_CONFIG_SECTION_TRANSFORM, MT_CONFIG_SECTION_TRANSFORM, key, "TransformDuration", "Transform Duration", "Transform_Duration", "transduration", g_esSpecial[iIndex].g_flTransformDuration, value, -1.0, 99999.0); + g_esSpecial[iIndex].g_iSpawnType = iGetKeyValue(subsection, MT_CONFIG_SECTION_SPAWN, MT_CONFIG_SECTION_SPAWN, MT_CONFIG_SECTION_SPAWN, MT_CONFIG_SECTION_SPAWN, key, "SpawnType", "Spawn Type", "Spawn_Type", "spawntype", g_esSpecial[iIndex].g_iSpawnType, value, -1, 4); + g_esSpecial[iIndex].g_iRockModel = iGetKeyValue(subsection, MT_CONFIG_SECTION_PROPS, MT_CONFIG_SECTION_PROPS, MT_CONFIG_SECTION_PROPS, MT_CONFIG_SECTION_PROPS, key, "RockModel", "Rock Model", "Rock_Model", "rockmodel", g_esSpecial[iIndex].g_iRockModel, value, -1, 2); + g_esSpecial[iIndex].g_iBodyEffects = iGetKeyValue(subsection, MT_CONFIG_SECTION_PARTICLES, MT_CONFIG_SECTION_PARTICLES, MT_CONFIG_SECTION_PARTICLES, MT_CONFIG_SECTION_PARTICLES, key, "BodyEffects", "Body Effects", "Body_Effects", "body", g_esSpecial[iIndex].g_iBodyEffects, value, -1, 127); + g_esSpecial[iIndex].g_iRockEffects = iGetKeyValue(subsection, MT_CONFIG_SECTION_PARTICLES, MT_CONFIG_SECTION_PARTICLES, MT_CONFIG_SECTION_PARTICLES, MT_CONFIG_SECTION_PARTICLES, key, "RockEffects", "Rock Effects", "Rock_Effects", "rock", g_esSpecial[iIndex].g_iRockEffects, value, -1, 15); + g_esSpecial[iIndex].g_flAttackInterval = flGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "AttackInterval", "Attack Interval", "Attack_Interval", "attack", g_esSpecial[iIndex].g_flAttackInterval, value, -1.0, 99999.0); + g_esSpecial[iIndex].g_iAutoHop = iGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "BunnyHop", "Bunny Hop", "Bunny_Hop", "bhop", g_esSpecial[iIndex].g_iAutoHop, value, -1, 1); + g_esSpecial[iIndex].g_flClawDamage = flGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "ClawDamage", "Claw Damage", "Claw_Damage", "claw", g_esSpecial[iIndex].g_flClawDamage, value, -2.0, 99999.0); + g_esSpecial[iIndex].g_flHittableDamage = flGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "HittableDamage", "Hittable Damage", "Hittable_Damage", "hittable", g_esSpecial[iIndex].g_flHittableDamage, value, -2.0, 99999.0); + g_esSpecial[iIndex].g_flIncapDamageMultiplier = flGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "IncapDamageMultiplier", "Incap Damage Multiplier", "Incap_Damage_Multiplier", "incapdmgmulti", g_esSpecial[iIndex].g_flIncapDamageMultiplier, value, -1.0, 99999.0); + g_esSpecial[iIndex].g_iIntangibleBody = iGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "IntangibleBody", "Intangible Body", "Intangible_Body", "intangible", g_esSpecial[iIndex].g_iIntangibleBody, value, -1, 1); + g_esSpecial[iIndex].g_iMeleeHitMode = iGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "MeleeHitMode", "Melee Hit Mode", "Melee_Hit_Mode", "meleehit", g_esSpecial[iIndex].g_iMeleeHitMode, value, -1, 2); + g_esSpecial[iIndex].g_flMeleeHitValue = flGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "MeleeHitValue", "Melee Hit Value", "Melee_Hit_Value", "meleevalue", g_esSpecial[iIndex].g_flMeleeHitValue, value, -1.0, 99999.0); + g_esSpecial[iIndex].g_flPinDamage = flGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "PinDamage", "Pin Damage", "Pin_Damage", "pindmg", g_esSpecial[iIndex].g_flPinDamage, value, -2.0, 99999.0); + g_esSpecial[iIndex].g_flRunSpeed = flGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "RunSpeed", "Run Speed", "Run_Speed", "speed", g_esSpecial[iIndex].g_flRunSpeed, value, -1.0, 99.0); + g_esSpecial[iIndex].g_flSpecialInterval = flGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "SpecialInterval", "Special Interval", "Special_Interval", "specint", g_esSpecial[iIndex].g_flSpecialInterval, value, -1.0, 99999.0); + g_esSpecial[iIndex].g_iThrowRock = iGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "ThrowRock", "Throw Rock", "Throw_Rock", "throwrock", g_esSpecial[iIndex].g_iThrowRock, value, -1, 1); + g_esSpecial[iIndex].g_iBulletImmunity = iGetKeyValue(subsection, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE2, key, "BulletImmunity", "Bullet Immunity", "Bullet_Immunity", "bullet", g_esSpecial[iIndex].g_iBulletImmunity, value, -1, 1); + g_esSpecial[iIndex].g_iExplosiveImmunity = iGetKeyValue(subsection, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE2, key, "ExplosiveImmunity", "Explosive Immunity", "Explosive_Immunity", "explosive", g_esSpecial[iIndex].g_iExplosiveImmunity, value, -1, 1); + g_esSpecial[iIndex].g_iFireImmunity = iGetKeyValue(subsection, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE2, key, "FireImmunity", "Fire Immunity", "Fire_Immunity", "fire", g_esSpecial[iIndex].g_iFireImmunity, value, -1, 1); + g_esSpecial[iIndex].g_iHittableImmunity = iGetKeyValue(subsection, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE2, key, "HittableImmunity", "Hittable Immunity", "Hittable_Immunity", "hittable", g_esSpecial[iIndex].g_iHittableImmunity, value, -1, 1); + g_esSpecial[iIndex].g_iMeleeImmunity = iGetKeyValue(subsection, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE2, key, "MeleeImmunity", "Melee Immunity", "Melee_Immunity", "melee", g_esSpecial[iIndex].g_iMeleeImmunity, value, -1, 1); + g_esSpecial[iIndex].g_iVomitImmunity = iGetKeyValue(subsection, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE2, key, "VomitImmunity", "Vomit Immunity", "Vomit_Immunity", "vomit", g_esSpecial[iIndex].g_iVomitImmunity, value, -1, 1); + + vGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "ArmorCharacters", "Armor Characters", "Armor_Characters", "armorchars", g_esSpecial[iIndex].g_sArmorCharacters, sizeof esSpecial::g_sArmorCharacters, value); + vGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "HealthCharacters", "Health Characters", "Health_Characters", "hpchars", g_esSpecial[iIndex].g_sHealthCharacters, sizeof esSpecial::g_sHealthCharacters, value); + vGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "ShieldCharacters", "Shield Characters", "Shield_Characters", "shieldchars", g_esSpecial[iIndex].g_sShieldCharacters, sizeof esSpecial::g_sShieldCharacters, value); + vGetKeyValue(subsection, MT_CONFIG_SECTION_COMBO, MT_CONFIG_SECTION_COMBO, MT_CONFIG_SECTION_COMBO, MT_CONFIG_SECTION_COMBO, key, "ComboSet", "Combo Set", "Combo_Set", "set", g_esSpecial[iIndex].g_sComboSet, sizeof esSpecial::g_sComboSet, value); - if (StrEqual(subsection, MT_CONFIG_SECTION_GENERAL, false)) - { - if (StrEqual(key, "SkinColor", false) || StrEqual(key, "Skin Color", false) || StrEqual(key, "Skin_Color", false) || StrEqual(key, "skin", false)) + if (StrEqual(subsection, MT_CONFIG_SECTION_GENERAL, false)) { - char sValue[64], sSet[4][4]; - vGetConfigColors(sValue, sizeof sValue, value); - strcopy(g_esSpecial[iIndex].g_sSkinColor, sizeof esSpecial::g_sSkinColor, value); + if (StrEqual(key, "SkinColor", false) || StrEqual(key, "Skin Color", false) || StrEqual(key, "Skin_Color", false) || StrEqual(key, "skin", false)) + { + char sValue[64], sSet[4][4]; + vGetConfigColors(sValue, sizeof sValue, value); + strcopy(g_esSpecial[iIndex].g_sSkinColor, sizeof esSpecial::g_sSkinColor, value); + ReplaceString(sValue, sizeof sValue, " ", ""); + ExplodeString(sValue, ",", sSet, sizeof sSet, sizeof sSet[]); + for (int iPos = 0; iPos < (sizeof esSpecial::g_iSkinColor); iPos++) + { + g_esSpecial[iIndex].g_iSkinColor[iPos] = (sSet[iPos][0] != '\0' && StringToInt(sSet[iPos]) >= 0) ? iClamp(StringToInt(sSet[iPos]), 0, 255) : -1; + } + } + else if (StrContains(key, "Class", false) != -1) + { + vGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "BoomerClass", "Boomer Class", "Boomer_Class", "bclass", g_esSpecial[iIndex].g_sBoomerClass, sizeof esSpecial::g_sBoomerClass, value); + vGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "ChargerClass", "Charger Class", "Charger_Class", "cclass", g_esSpecial[iIndex].g_sChargerClass, sizeof esSpecial::g_sChargerClass, value); + vGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "HunterClass", "Hunter Class", "Hunter_Class", "hclass", g_esSpecial[iIndex].g_sHunterClass, sizeof esSpecial::g_sHunterClass, value); + vGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "JockeyClass", "Jockey Class", "Jockey_Class", "jclass", g_esSpecial[iIndex].g_sJockeyClass, sizeof esSpecial::g_sJockeyClass, value); + vGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "SmokerClass", "Smoker Class", "Smoker_Class", "smclass", g_esSpecial[iIndex].g_sSmokerClass, sizeof esSpecial::g_sSmokerClass, value); + vGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "SpitterClass", "Spitter Class", "Spitter_Class", "spclass", g_esSpecial[iIndex].g_sSpitterClass, sizeof esSpecial::g_sSpitterClass, value); + } + else if (StrContains(key, "Name", false) != -1) + { + vGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "BoomerName", "Boomer Name", "Boomer_Name", "bname", g_esSpecial[iIndex].g_sBoomerName, sizeof esSpecial::g_sBoomerName, value); + vGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "ChargerName", "Charger Name", "Charger_Name", "cname", g_esSpecial[iIndex].g_sChargerName, sizeof esSpecial::g_sChargerName, value); + vGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "HunterName", "Hunter Name", "Hunter_Name", "hname", g_esSpecial[iIndex].g_sHunterName, sizeof esSpecial::g_sHunterName, value); + vGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "JockeyName", "Jockey Name", "Jockey_Name", "jname", g_esSpecial[iIndex].g_sJockeyName, sizeof esSpecial::g_sJockeyName, value); + vGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "SmokerName", "Smoker Name", "Smoker_Name", "smname", g_esSpecial[iIndex].g_sSmokerName, sizeof esSpecial::g_sSmokerName, value); + vGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "SpitterName", "Spitter Name", "Spitter_Name", "spname", g_esSpecial[iIndex].g_sSpitterName, sizeof esSpecial::g_sSpitterName, value); + } + } + else if (StrEqual(subsection, MT_CONFIG_SECTION_REWARDS, false)) + { + char sValue[2560], sSet[8][320]; + strcopy(sValue, sizeof sValue, value); ReplaceString(sValue, sizeof sValue, " ", ""); ExplodeString(sValue, ",", sSet, sizeof sSet, sizeof sSet[]); - for (int iPos = 0; iPos < (sizeof esSpecial::g_iSkinColor); iPos++) + for (int iPos = 0; iPos < (sizeof esSpecial::g_iStackLimits); iPos++) { - g_esSpecial[iIndex].g_iSkinColor[iPos] = (sSet[iPos][0] != '\0' && StringToInt(sSet[iPos]) >= 0) ? iClamp(StringToInt(sSet[iPos]), 0, 255) : -1; + if (iPos < (sizeof esSpecial::g_iRewardEnabled)) + { + g_esSpecial[iIndex].g_flRewardChance[iPos] = flGetClampedValue(key, "RewardChance", "Reward Chance", "Reward_Chance", "chance", g_esSpecial[iIndex].g_flRewardChance[iPos], sSet[iPos], -1.0, 100.0); + g_esSpecial[iIndex].g_flRewardDuration[iPos] = flGetClampedValue(key, "RewardDuration", "Reward Duration", "Reward_Duration", "duration", g_esSpecial[iIndex].g_flRewardDuration[iPos], sSet[iPos], -1.0, 99999.0); + g_esSpecial[iIndex].g_flRewardPercentage[iPos] = flGetClampedValue(key, "RewardPercentage", "Reward Percentage", "Reward_Percentage", "percent", g_esSpecial[iIndex].g_flRewardPercentage[iPos], sSet[iPos], -1.0, 100.0); + g_esSpecial[iIndex].g_flActionDurationReward[iPos] = flGetClampedValue(key, "ActionDurationReward", "Action Duration Reward", "Action_Duration_Reward", "actionduration", g_esSpecial[iIndex].g_flActionDurationReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esSpecial[iIndex].g_flAdrenalineTimeReward[iPos] = flGetClampedValue(key, "AdrenalineTimeReward", "Adrenaline Time Reward", "Adrenaline_Time_Reward", "adrenaline", g_esSpecial[iIndex].g_flAdrenalineTimeReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esSpecial[iIndex].g_flAttackBoostReward[iPos] = flGetClampedValue(key, "AttackBoostReward", "Attack Boost Reward", "Attack_Boost_Reward", "attackboost", g_esSpecial[iIndex].g_flAttackBoostReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esSpecial[iIndex].g_flDamageBoostReward[iPos] = flGetClampedValue(key, "DamageBoostReward", "Damage Boost Reward", "Damage_Boost_Reward", "dmgboost", g_esSpecial[iIndex].g_flDamageBoostReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esSpecial[iIndex].g_flDamageResistanceReward[iPos] = flGetClampedValue(key, "DamageResistanceReward", "Damage Resistance Reward", "Damage_Resistance_Reward", "dmgres", g_esSpecial[iIndex].g_flDamageResistanceReward[iPos], sSet[iPos], -1.0, 1.0); + g_esSpecial[iIndex].g_flDopamineRadiusReward[iPos] = flGetClampedValue(key, "DopamineRadiusReward", "Dopamine Radius Reward", "Dopamine_Radius_Reward", "dopamine", g_esSpecial[iIndex].g_flDopamineRadiusReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esSpecial[iIndex].g_flFireRateReward[iPos] = flGetClampedValue(key, "FireRateReward", "Fire Rate Reward", "Fire_Rate_Reward", "firerate", g_esSpecial[iIndex].g_flFireRateReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esSpecial[iIndex].g_flGrenadeLauncherReward[iPos] = flGetClampedValue(key, "GrenadeLauncherReward", "Grenade Launcher Reward", "Grenade_Launcher_Reward", "grenade", g_esSpecial[iIndex].g_flGrenadeLauncherReward[iPos], sSet[iPos], -1.0, 100.0); + g_esSpecial[iIndex].g_flHealPercentReward[iPos] = flGetClampedValue(key, "HealPercentReward", "Heal Percent Reward", "Heal_Percent_Reward", "healpercent", g_esSpecial[iIndex].g_flHealPercentReward[iPos], sSet[iPos], -1.0, 100.0); + g_esSpecial[iIndex].g_flHealthcareRadiusReward[iPos] = flGetClampedValue(key, "HealthcareRadiusReward", "Healthcare Radius Reward", "Healthcare_Radius_Reward", "healthcare", g_esSpecial[iIndex].g_flHealthcareRadiusReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esSpecial[iIndex].g_flHeartbeatReward[iPos] = flGetClampedValue(key, "HeartbeatReward", "Heartbeat Reward", "Heartbeat_Reward", "heartbeat", g_esSpecial[iIndex].g_flHeartbeatReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esSpecial[iIndex].g_flHollowpointAmmoReward[iPos] = flGetClampedValue(key, "HollowpointAmmoReward", "Hollowpoint Ammo Reward", "Hollowpoint_Ammo_Reward", "hollowpoint", g_esSpecial[iIndex].g_flHollowpointAmmoReward[iPos], sSet[iPos], -1.0, 100.0); + g_esSpecial[iIndex].g_flJumpHeightReward[iPos] = flGetClampedValue(key, "JumpHeightReward", "Jump Height Reward", "Jump_Height_Reward", "jumpheight", g_esSpecial[iIndex].g_flJumpHeightReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esSpecial[iIndex].g_flLadyKillerReward[iPos] = flGetClampedValue(key, "LadyKillerReward", "Lady Killer Reward", "Lady_Killer_Reward", "ladykiller", g_esSpecial[iIndex].g_flLadyKillerReward[iPos], sSet[iPos], -1.0, 100.0); + g_esSpecial[iIndex].g_flLoopingVoicelineInterval[iPos] = flGetClampedValue(key, "LoopingVoicelineInterval", "Looping Voiceline Interval", "Looping_Voiceline_Interval", "loopinterval", g_esSpecial[iIndex].g_flLoopingVoicelineInterval[iPos], sSet[iPos], -1.0, 99999.0); + g_esSpecial[iIndex].g_flLuckyBulletReward[iPos] = flGetClampedValue(key, "LuckyBulletReward", "Lucky Bullet Reward", "Lucky_Bullet_Reward", "luckybullet", g_esSpecial[iIndex].g_flLuckyBulletReward[iPos], sSet[iPos], -1.0, 100.0); + g_esSpecial[iIndex].g_flMotivationRadiusReward[iPos] = flGetClampedValue(key, "MotivationRadiusReward", "Motivation Radius Reward", "Motivation_Radius_Reward", "motivation", g_esSpecial[iIndex].g_flMotivationRadiusReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esSpecial[iIndex].g_flOverdoseRadiusReward[iPos] = flGetClampedValue(key, "OverdoseRadiusReward", "Overdose Radius Reward", "Overdose_Radius_Reward", "overdose", g_esSpecial[iIndex].g_flOverdoseRadiusReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esSpecial[iIndex].g_flPipeBombDurationReward[iPos] = flGetClampedValue(key, "PipebombDurationReward", "Pipebomb Duration Reward", "Pipebomb_Duration_Reward", "pipeduration", g_esSpecial[iIndex].g_flPipeBombDurationReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esSpecial[iIndex].g_flPunchResistanceReward[iPos] = flGetClampedValue(key, "PunchResistanceReward", "Punch Resistance Reward", "Punch_Resistance_Reward", "punchres", g_esSpecial[iIndex].g_flPunchResistanceReward[iPos], sSet[iPos], -1.0, 1.0); + g_esSpecial[iIndex].g_flRapidPistolReward[iPos] = flGetClampedValue(key, "RapidPistolReward", "Rapid Pistol Reward", "Rapid_Pistol_Reward", "rapidpistol", g_esSpecial[iIndex].g_flRapidPistolReward[iPos], sSet[iPos], -1.0, 1.0); + g_esSpecial[iIndex].g_flRefillPercentReward[iPos] = flGetClampedValue(key, "RefillPercentReward", "Refill Percent Reward", "Refill_Percent_Reward", "refillpercent", g_esSpecial[iIndex].g_flRefillPercentReward[iPos], sSet[iPos], -1.0, 100.0); + g_esSpecial[iIndex].g_flReloadRateReward[iPos] = flGetClampedValue(key, "ReloadRateReward", "Reload Rate Reward", "Reload_Rate_Reward", "reloadrate", g_esSpecial[iIndex].g_flReloadRateReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esSpecial[iIndex].g_flShockwaveRadiusReward[iPos] = flGetClampedValue(key, "ShockwaveRadiusReward", "Shockwave Radius Reward", "Shockwave_Radius_Reward", "shockwave", g_esSpecial[iIndex].g_flShockwaveRadiusReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esSpecial[iIndex].g_flShoveDamageReward[iPos] = flGetClampedValue(key, "ShoveDamageReward", "Shove Damage Reward", "Shove_Damage_Reward", "shovedmg", g_esSpecial[iIndex].g_flShoveDamageReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esSpecial[iIndex].g_flShoveRateReward[iPos] = flGetClampedValue(key, "ShoveRateReward", "Shove Rate Reward", "Shove_Rate_Reward", "shoverate", g_esSpecial[iIndex].g_flShoveRateReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esSpecial[iIndex].g_flSledgehammerRoundsReward[iPos] = flGetClampedValue(key, "SledgehammerRoundsReward", "Sledgehammer Rounds Reward", "Sledgehammer_Rounds_Reward", "sledgehammer", g_esSpecial[iIndex].g_flSledgehammerRoundsReward[iPos], sSet[iPos], -1.0, 100.0); + g_esSpecial[iIndex].g_flSpeedBoostReward[iPos] = flGetClampedValue(key, "SpeedBoostReward", "Speed Boost Reward", "Speed_Boost_Reward", "speedboost", g_esSpecial[iIndex].g_flSpeedBoostReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esSpecial[iIndex].g_flSupplierReward[iPos] = flGetClampedValue(key, "SupplierPassive", "Supplier Passive", "Supplier_Passive", "supplier", g_esSpecial[iIndex].g_flSupplierReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esSpecial[iIndex].g_flSwingRateReward[iPos] = flGetClampedValue(key, "SwingRateReward", "Swing Rate Reward", "Swing_Rate_Reward", "swingrate", g_esSpecial[iIndex].g_flSwingRateReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esSpecial[iIndex].g_iRewardEnabled[iPos] = iGetClampedValue(key, "RewardEnabled", "Reward Enabled", "Reward_Enabled", "renabled", g_esSpecial[iIndex].g_iRewardEnabled[iPos], sSet[iPos], -2, 2147483647); + g_esSpecial[iIndex].g_iRewardBots[iPos] = iGetClampedValue(key, "RewardBots", "Reward Bots", "Reward_Bots", "rbots", g_esSpecial[iIndex].g_iRewardBots[iPos], sSet[iPos], -2, 2147483647); + g_esSpecial[iIndex].g_iRewardEffect[iPos] = iGetClampedValue(key, "RewardEffect", "Reward Effect", "Reward_Effect", "effect", g_esSpecial[iIndex].g_iRewardEffect[iPos], sSet[iPos], -1, 15); + g_esSpecial[iIndex].g_iRewardNotify[iPos] = iGetClampedValue(key, "RewardNotify", "Reward Notify", "Reward_Notify", "rnotify", g_esSpecial[iIndex].g_iRewardNotify[iPos], sSet[iPos], -1, 3); + g_esSpecial[iIndex].g_iRewardVisual[iPos] = iGetClampedValue(key, "RewardVisual", "Reward Visual", "Reward_Visual", "visual", g_esSpecial[iIndex].g_iRewardVisual[iPos], sSet[iPos], -1, 127); + g_esSpecial[iIndex].g_iAmmoBoostReward[iPos] = iGetClampedValue(key, "AmmoBoostReward", "Ammo Boost Reward", "Ammo_Boost_Reward", "ammoboost", g_esSpecial[iIndex].g_iAmmoBoostReward[iPos], sSet[iPos], -1, 1); + g_esSpecial[iIndex].g_iAmmoRefillReward[iPos] = iGetClampedValue(key, "AmmoRefillReward", "Ammo Refill Reward", "Ammo_Refill_Reward", "ammorefill", g_esSpecial[iIndex].g_iAmmoRefillReward[iPos], sSet[iPos], -1, 1); + g_esSpecial[iIndex].g_iAmmoRegenReward[iPos] = iGetClampedValue(key, "AmmoRegenReward", "Ammo Regen Reward", "Ammo_Regen_Reward", "ammoregen", g_esSpecial[iIndex].g_iAmmoRegenReward[iPos], sSet[iPos], -1, 99999); + g_esSpecial[iIndex].g_iBlazeHealthReward[iPos] = iGetClampedValue(key, "BlazeHealthReward", "Blaze Health Reward", "Blaze_Health_Reward", "blaze", g_esSpecial[iIndex].g_iBlazeHealthReward[iPos], sSet[iPos], -1, MT_MAXHEALTH); + g_esSpecial[iIndex].g_iBloodDonorReward[iPos] = iGetClampedValue(key, "BloodDonorReward", "Blood Donor Reward", "Blood_Donor_Reward", "donor", g_esSpecial[iIndex].g_iBloodDonorReward[iPos], sSet[iPos], -1, MT_MAXHEALTH); + g_esSpecial[iIndex].g_iBunnyHopReward[iPos] = iGetClampedValue(key, "BunnyHopReward", "Bunny Hop Reward", "Bunny_Hop_Reward", "bhop", g_esSpecial[iIndex].g_iBunnyHopReward[iPos], sSet[iPos], -1, 1); + g_esSpecial[iIndex].g_iBurstDoorsReward[iPos] = iGetClampedValue(key, "BurstDoorsReward", "Burst Doors Reward", "Burst_Doors_Reward", "burstdoors", g_esSpecial[iIndex].g_iBurstDoorsReward[iPos], sSet[iPos], -1, 1); + g_esSpecial[iIndex].g_iCleanKillsReward[iPos] = iGetClampedValue(key, "CleanKillsReward", "Clean Kills Reward", "Clean_Kills_Reward", "cleankills", g_esSpecial[iIndex].g_iCleanKillsReward[iPos], sSet[iPos], -1, 1); + g_esSpecial[iIndex].g_iClusterBombsReward[iPos] = iGetClampedValue(key, "ClusterBombsReward", "Cluster Bombs Reward", "Cluster_Bombs_Reward", "cluster", g_esSpecial[iIndex].g_iClusterBombsReward[iPos], sSet[iPos], -1, 5); + g_esSpecial[iIndex].g_iEternalFlamesReward[iPos] = iGetClampedValue(key, "EternalFlamesReward", "Eternal Flames Reward", "Eternal_Flames_Reward", "eternal", g_esSpecial[iIndex].g_iEternalFlamesReward[iPos], sSet[iPos], -1, 1); + g_esSpecial[iIndex].g_iFastRecoveryReward[iPos] = iGetClampedValue(key, "FastRecoveryReward", "Fast Recovery Reward", "Fast_Recovery_Reward", "fastrecovery", g_esSpecial[iIndex].g_iFastRecoveryReward[iPos], sSet[iPos], -1, 1); + g_esSpecial[iIndex].g_iFriendlyFireReward[iPos] = iGetClampedValue(key, "FriendlyFireReward", "Friendly Fire Reward", "Friendly_Fire_Reward", "friendlyfire", g_esSpecial[iIndex].g_iFriendlyFireReward[iPos], sSet[iPos], -1, 1); + g_esSpecial[iIndex].g_iGhostBulletsReward[iPos] = iGetClampedValue(key, "GhostBulletsReward", "Ghost Bullets Reward", "Ghost_Bullets_Reward", "ghost", g_esSpecial[iIndex].g_iGhostBulletsReward[iPos], sSet[iPos], -1, 1); + g_esSpecial[iIndex].g_iHealthRegenReward[iPos] = iGetClampedValue(key, "HealthRegenReward", "Health Regen Reward", "Health_Regen_Reward", "hpregen", g_esSpecial[iIndex].g_iHealthRegenReward[iPos], sSet[iPos], -1, MT_MAXHEALTH); + g_esSpecial[iIndex].g_iInfiniteAmmoReward[iPos] = iGetClampedValue(key, "InfiniteAmmoReward", "Infinite Ammo Reward", "Infinite_Ammo_Reward", "infammo", g_esSpecial[iIndex].g_iInfiniteAmmoReward[iPos], sSet[iPos], -1, 31); + g_esSpecial[iIndex].g_iLadderActionsReward[iPos] = iGetClampedValue(key, "LadderActionsReward", "Ladder Actions Reward", "Ladder_Action_Reward", "ladderacts", g_esSpecial[iIndex].g_iLadderActionsReward[iPos], sSet[iPos], -1, 1); + g_esSpecial[iIndex].g_iLaserSightReward[iPos] = iGetClampedValue(key, "LaserSightReward", "Laser Sight Reward", "Laser_Sight_Reward", "lasersight", g_esSpecial[iIndex].g_iLaserSightReward[iPos], sSet[iPos], -1, 1); + g_esSpecial[iIndex].g_iLifeLeechReward[iPos] = iGetClampedValue(key, "LifeLeechReward", "Life Leech Reward", "Life_Leech_Reward", "lifeleech", g_esSpecial[iIndex].g_iLifeLeechReward[iPos], sSet[iPos], -1, MT_MAXHEALTH); + g_esSpecial[iIndex].g_iMedicalCutsReward[iPos] = iGetClampedValue(key, "MedicalCutsReward", "Medical Cuts Reward", "Medical_Cuts_Reward", "medcuts", g_esSpecial[iIndex].g_iMedicalCutsReward[iPos], sSet[iPos], -1, MT_MAXHEALTH); + g_esSpecial[iIndex].g_iMeleeRangeReward[iPos] = iGetClampedValue(key, "MeleeRangeReward", "Melee Range Reward", "Melee_Range_Reward", "meleerange", g_esSpecial[iIndex].g_iMeleeRangeReward[iPos], sSet[iPos], -1, 99999); + g_esSpecial[iIndex].g_iMidairDashesReward[iPos] = iGetClampedValue(key, "MidairDashesReward", "Midair Dashes Reward", "Midair_Dashes_Reward", "middash", g_esSpecial[iIndex].g_iMidairDashesReward[iPos], sSet[iPos], -1, 99999); + g_esSpecial[iIndex].g_iOverhealthReward[iPos] = iGetClampedValue(key, "OverhealthReward", "Overhealth Reward", "Overhealth_Reward", "overhealth", g_esSpecial[iIndex].g_iOverhealthReward[iPos], sSet[iPos], -1, MT_MAXHEALTH); + g_esSpecial[iIndex].g_iParticleEffectVisual[iPos] = iGetClampedValue(key, "ParticleEffectVisual", "Particle Effect Visual", "Particle_Effect_Visual", "particle", g_esSpecial[iIndex].g_iParticleEffectVisual[iPos], sSet[iPos], -1, 15); + g_esSpecial[iIndex].g_iPrefsNotify[iPos] = iGetClampedValue(key, "PrefsNotify", "Prefs Notify", "Prefs_Notify", "pnotify", g_esSpecial[iIndex].g_iPrefsNotify[iPos], sSet[iPos], -1, 1); + g_esSpecial[iIndex].g_iRecoilDampenerReward[iPos] = iGetClampedValue(key, "RecoilDampenerReward", "Recoil Dampener Reward", "Recoil_Dampener_Reward", "recoil", g_esSpecial[iIndex].g_iRecoilDampenerReward[iPos], sSet[iPos], -1, 1); + g_esSpecial[iIndex].g_iRegenBurstsReward[iPos] = iGetClampedValue(key, "RegenBurstsReward", "Regen Bursts Reward", "Regen_Bursts_Reward", "regbursts", g_esSpecial[iIndex].g_iRegenBurstsReward[iPos], sSet[iPos], -1, MT_MAXHEALTH); + g_esSpecial[iIndex].g_iRespawnLoadoutReward[iPos] = iGetClampedValue(key, "RespawnLoadoutReward", "Respawn Loadout Reward", "Respawn_Loadout_Reward", "resloadout", g_esSpecial[iIndex].g_iRespawnLoadoutReward[iPos], sSet[iPos], -1, 1); + g_esSpecial[iIndex].g_iReviveHealthReward[iPos] = iGetClampedValue(key, "ReviveHealthReward", "Revive Health Reward", "Revive_Health_Reward", "revivehp", g_esSpecial[iIndex].g_iReviveHealthReward[iPos], sSet[iPos], -1, MT_MAXHEALTH); + g_esSpecial[iIndex].g_iRiotGearReward[iPos] = iGetClampedValue(key, "RiotGearReward", "Riot Gear Reward", "Riot_Gear_Reward", "riotgear", g_esSpecial[iIndex].g_iRiotGearReward[iPos], sSet[iPos], -1, 1); + g_esSpecial[iIndex].g_iSafetyBubbleReward[iPos] = iGetClampedValue(key, "SafetyBubbleReward", "Safety Bubble Reward", "Safety_Bubble_Reward", "safetybubble", g_esSpecial[iIndex].g_iSafetyBubbleReward[iPos], sSet[iPos], -1, 1); + g_esSpecial[iIndex].g_iShareRewards[iPos] = iGetClampedValue(key, "ShareRewards", "Share Rewards", "Share_Rewards", "share", g_esSpecial[iIndex].g_iShareRewards[iPos], sSet[iPos], -1, 3); + g_esSpecial[iIndex].g_iShovePenaltyReward[iPos] = iGetClampedValue(key, "ShovePenaltyReward", "Shove Penalty Reward", "Shove_Penalty_Reward", "shovepenalty", g_esSpecial[iIndex].g_iShovePenaltyReward[iPos], sSet[iPos], -1, 1); + g_esSpecial[iIndex].g_iSpecialAmmoReward[iPos] = iGetClampedValue(key, "SpecialAmmoReward", "Special Ammo Reward", "Special_Ammo_Reward", "specammo", g_esSpecial[iIndex].g_iSpecialAmmoReward[iPos], sSet[iPos], -1, 3); + g_esSpecial[iIndex].g_iStackRewards[iPos] = iGetClampedValue(key, "StackRewards", "Stack Rewards", "Stack_Rewards", "rstack", g_esSpecial[iIndex].g_iStackRewards[iPos], sSet[iPos], -1, 2147483647); + g_esSpecial[iIndex].g_iStickyGrenadesReward[iPos] = iGetClampedValue(key, "StickyGrenadesReward", "Sticky Grenades Reward", "Sticky_Grenades_Reward", "sticky", g_esSpecial[iIndex].g_iStickyGrenadesReward[iPos], sSet[iPos], -1, 1); + g_esSpecial[iIndex].g_iSyringeDartsReward[iPos] = iGetClampedValue(key, "SyringeDartsReward", "Syringe Darts Reward", "Syringe_Darts_Reward", "syringe", g_esSpecial[iIndex].g_iSyringeDartsReward[iPos], sSet[iPos], -1, MT_MAXHEALTH); + g_esSpecial[iIndex].g_iThornsReward[iPos] = iGetClampedValue(key, "ThornsReward", "Thorns Reward", "Thorns_Reward", "thorns", g_esSpecial[iIndex].g_iThornsReward[iPos], sSet[iPos], -1, 1); + g_esSpecial[iIndex].g_iUsefulRewards[iPos] = iGetClampedValue(key, "UsefulRewards", "Useful Rewards", "Useful_Rewards", "useful", g_esSpecial[iIndex].g_iUsefulRewards[iPos], sSet[iPos], -1, 15); + g_esSpecial[iIndex].g_iVoicePitchVisual[iPos] = iGetClampedValue(key, "VoicePitchVisual", "Voice Pitch Visual", "Voice_Pitch_Visual", "voicepitch", g_esSpecial[iIndex].g_iVoicePitchVisual[iPos], sSet[iPos], -1, 255); + + vGetConfigColors(sValue, sizeof sValue, sSet[iPos], ';'); + vGetStringValue(key, "BodyColorVisual", "Body Color Visual", "Body_Color_Visual", "bodycolor", iPos, g_esSpecial[iIndex].g_sBodyColorVisual, sizeof esSpecial::g_sBodyColorVisual, g_esSpecial[iIndex].g_sBodyColorVisual2, sizeof esSpecial::g_sBodyColorVisual2, g_esSpecial[iIndex].g_sBodyColorVisual3, sizeof esSpecial::g_sBodyColorVisual3, g_esSpecial[iIndex].g_sBodyColorVisual4, sizeof esSpecial::g_sBodyColorVisual4, sValue); + vGetStringValue(key, "FallVoicelineReward", "Fall Voiceline Reward", "Fall_Voiceline_Reward", "fallvoice", iPos, g_esSpecial[iIndex].g_sFallVoicelineReward, sizeof esSpecial::g_sFallVoicelineReward, g_esSpecial[iIndex].g_sFallVoicelineReward2, sizeof esSpecial::g_sFallVoicelineReward2, g_esSpecial[iIndex].g_sFallVoicelineReward3, sizeof esSpecial::g_sFallVoicelineReward3, g_esSpecial[iIndex].g_sFallVoicelineReward4, sizeof esSpecial::g_sFallVoicelineReward4, sSet[iPos]); + vGetStringValue(key, "GlowColorVisual", "Glow Color Visual", "Glow_Color_Visual", "glowcolor", iPos, g_esSpecial[iIndex].g_sOutlineColorVisual, sizeof esSpecial::g_sOutlineColorVisual, g_esSpecial[iIndex].g_sOutlineColorVisual2, sizeof esSpecial::g_sOutlineColorVisual2, g_esSpecial[iIndex].g_sOutlineColorVisual3, sizeof esSpecial::g_sOutlineColorVisual3, g_esSpecial[iIndex].g_sOutlineColorVisual4, sizeof esSpecial::g_sOutlineColorVisual4, sValue); + vGetStringValue(key, "ItemReward", "Item Reward", "Item_Reward", "item", iPos, g_esSpecial[iIndex].g_sItemReward, sizeof esSpecial::g_sItemReward, g_esSpecial[iIndex].g_sItemReward2, sizeof esSpecial::g_sItemReward2, g_esSpecial[iIndex].g_sItemReward3, sizeof esSpecial::g_sItemReward3, g_esSpecial[iIndex].g_sItemReward4, sizeof esSpecial::g_sItemReward4, sValue); + vGetStringValue(key, "LightColorVisual", "Light Color Visual", "Light_Color_Visual", "lightcolor", iPos, g_esSpecial[iIndex].g_sLightColorVisual, sizeof esSpecial::g_sLightColorVisual, g_esSpecial[iIndex].g_sLightColorVisual2, sizeof esSpecial::g_sLightColorVisual2, g_esSpecial[iIndex].g_sLightColorVisual3, sizeof esSpecial::g_sLightColorVisual3, g_esSpecial[iIndex].g_sLightColorVisual4, sizeof esSpecial::g_sLightColorVisual4, sValue); + vGetStringValue(key, "LoopingVoicelineVisual", "Looping Voiceline Visual", "Looping_Voiceline_Visual", "loopvoice", iPos, g_esSpecial[iIndex].g_sLoopingVoicelineVisual, sizeof esSpecial::g_sLoopingVoicelineVisual, g_esSpecial[iIndex].g_sLoopingVoicelineVisual2, sizeof esSpecial::g_sLoopingVoicelineVisual2, g_esSpecial[iIndex].g_sLoopingVoicelineVisual3, sizeof esSpecial::g_sLoopingVoicelineVisual3, g_esSpecial[iIndex].g_sLoopingVoicelineVisual4, sizeof esSpecial::g_sLoopingVoicelineVisual4, sSet[iPos]); + vGetStringValue(key, "ScreenColorVisual", "Screen Color Visual", "Screen_Color_Visual", "screencolor", iPos, g_esSpecial[iIndex].g_sScreenColorVisual, sizeof esSpecial::g_sScreenColorVisual, g_esSpecial[iIndex].g_sScreenColorVisual2, sizeof esSpecial::g_sScreenColorVisual2, g_esSpecial[iIndex].g_sScreenColorVisual3, sizeof esSpecial::g_sScreenColorVisual3, g_esSpecial[iIndex].g_sScreenColorVisual4, sizeof esSpecial::g_sScreenColorVisual4, sValue); + } + + g_esSpecial[iIndex].g_iStackLimits[iPos] = iGetClampedValue(key, "StackLimits", "Stack Limits", "Stack_Limits", "limits", g_esSpecial[iIndex].g_iStackLimits[iPos], sSet[iPos], -1, 99999); } } - else if (StrContains(key, "Name", false) != -1) + else if (StrEqual(subsection, MT_CONFIG_SECTION_GLOW, false)) { - vGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "BoomerName", "Boomer Name", "Boomer_Name", "bname", g_esSpecial[iIndex].g_sBoomerName, sizeof esSpecial::g_sBoomerName, value); - vGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "ChargerName", "Charger Name", "Charger_Name", "cname", g_esSpecial[iIndex].g_sChargerName, sizeof esSpecial::g_sChargerName, value); - vGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "HunterName", "Hunter Name", "Hunter_Name", "hname", g_esSpecial[iIndex].g_sHunterName, sizeof esSpecial::g_sHunterName, value); - vGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "JockeyName", "Jockey Name", "Jockey_Name", "jname", g_esSpecial[iIndex].g_sJockeyName, sizeof esSpecial::g_sJockeyName, value); - vGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "SmokerName", "Smoker Name", "Smoker_Name", "smname", g_esSpecial[iIndex].g_sSmokerName, sizeof esSpecial::g_sSmokerName, value); - vGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "SpitterName", "Spitter Name", "Spitter_Name", "spname", g_esSpecial[iIndex].g_sSpitterName, sizeof esSpecial::g_sSpitterName, value); + if (StrEqual(key, "GlowColor", false) || StrEqual(key, "Glow Color", false) || StrEqual(key, "Glow_Color", false)) + { + char sValue[64], sSet[3][4]; + vGetConfigColors(sValue, sizeof sValue, value); + strcopy(g_esSpecial[iIndex].g_sGlowColor, sizeof esSpecial::g_sGlowColor, value); + ReplaceString(sValue, sizeof sValue, " ", ""); + ExplodeString(sValue, ",", sSet, sizeof sSet, sizeof sSet[]); + for (int iPos = 0; iPos < (sizeof esSpecial::g_iGlowColor); iPos++) + { + g_esSpecial[iIndex].g_iGlowColor[iPos] = (sSet[iPos][0] != '\0' && StringToInt(sSet[iPos]) >= 0) ? iClamp(StringToInt(sSet[iPos]), 0, 255) : -1; + } + } + else if (StrEqual(key, "GlowRange", false) || StrEqual(key, "Glow Range", false) || StrEqual(key, "Glow_Range", false)) + { + char sValue[50], sRange[2][7]; + strcopy(sValue, sizeof sValue, value); + ReplaceString(sValue, sizeof sValue, " ", ""); + ExplodeString(sValue, "-", sRange, sizeof sRange, sizeof sRange[]); + + g_esSpecial[iIndex].g_iGlowMinRange = (sRange[0][0] != '\0') ? iClamp(StringToInt(sRange[0]), -1, 99999) : g_esSpecial[iIndex].g_iGlowMinRange; + g_esSpecial[iIndex].g_iGlowMaxRange = (sRange[1][0] != '\0') ? iClamp(StringToInt(sRange[1]), -1, 99999) : g_esSpecial[iIndex].g_iGlowMaxRange; + } } - } - else if (StrEqual(subsection, MT_CONFIG_SECTION_REWARDS, false)) - { - char sValue[1280], sSet[8][320]; - strcopy(sValue, sizeof sValue, value); - ReplaceString(sValue, sizeof sValue, " ", ""); - ExplodeString(sValue, ",", sSet, sizeof sSet, sizeof sSet[]); - for (int iPos = 0; iPos < (sizeof esSpecial::g_iStackLimits); iPos++) + else if (StrEqual(subsection, MT_CONFIG_SECTION_HEALTH, false)) { - if (iPos < (sizeof esSpecial::g_iRewardEnabled)) + char sSettings[4][128]; + for (int iPos = 0; iPos < (sizeof g_sSpecialNames); iPos++) { - g_esSpecial[iIndex].g_flRewardChance[iPos] = flGetClampedValue(key, "RewardChance", "Reward Chance", "Reward_Chance", "chance", g_esSpecial[iIndex].g_flRewardChance[iPos], sSet[iPos], -1.0, 100.0); - g_esSpecial[iIndex].g_flRewardDuration[iPos] = flGetClampedValue(key, "RewardDuration", "Reward Duration", "Reward_Duration", "duration", g_esSpecial[iIndex].g_flRewardDuration[iPos], sSet[iPos], -1.0, 99999.0); - g_esSpecial[iIndex].g_flRewardPercentage[iPos] = flGetClampedValue(key, "RewardPercentage", "Reward Percentage", "Reward_Percentage", "percent", g_esSpecial[iIndex].g_flRewardPercentage[iPos], sSet[iPos], -1.0, 100.0); - g_esSpecial[iIndex].g_flActionDurationReward[iPos] = flGetClampedValue(key, "ActionDurationReward", "Action Duration Reward", "Action_Duration_Reward", "actionduration", g_esSpecial[iIndex].g_flActionDurationReward[iPos], sSet[iPos], -1.0, 99999.0); - g_esSpecial[iIndex].g_flAttackBoostReward[iPos] = flGetClampedValue(key, "AttackBoostReward", "Attack Boost Reward", "Attack_Boost_Reward", "attackboost", g_esSpecial[iIndex].g_flAttackBoostReward[iPos], sSet[iPos], -1.0, 99999.0); - g_esSpecial[iIndex].g_flDamageBoostReward[iPos] = flGetClampedValue(key, "DamageBoostReward", "Damage Boost Reward", "Damage_Boost_Reward", "dmgboost", g_esSpecial[iIndex].g_flDamageBoostReward[iPos], sSet[iPos], -1.0, 99999.0); - g_esSpecial[iIndex].g_flDamageResistanceReward[iPos] = flGetClampedValue(key, "DamageResistanceReward", "Damage Resistance Reward", "Damage_Resistance_Reward", "dmgres", g_esSpecial[iIndex].g_flDamageResistanceReward[iPos], sSet[iPos], -1.0, 1.0); - g_esSpecial[iIndex].g_flHealPercentReward[iPos] = flGetClampedValue(key, "HealPercentReward", "Heal Percent Reward", "Heal_Percent_Reward", "healpercent", g_esSpecial[iIndex].g_flHealPercentReward[iPos], sSet[iPos], -1.0, 100.0); - g_esSpecial[iIndex].g_flJumpHeightReward[iPos] = flGetClampedValue(key, "JumpHeightReward", "Jump Height Reward", "Jump_Height_Reward", "jumpheight", g_esSpecial[iIndex].g_flJumpHeightReward[iPos], sSet[iPos], -1.0, 99999.0); - g_esSpecial[iIndex].g_flLoopingVoicelineInterval[iPos] = flGetClampedValue(key, "LoopingVoicelineInterval", "Looping Voiceline Interval", "Looping_Voiceline_Interval", "loopinterval", g_esSpecial[iIndex].g_flLoopingVoicelineInterval[iPos], sSet[iPos], -1.0, 99999.0); - g_esSpecial[iIndex].g_flPipeBombDurationReward[iPos] = flGetClampedValue(key, "PipebombDurationReward", "Pipebomb Duration Reward", "Pipebomb_Duration_Reward", "pipeduration", g_esSpecial[iIndex].g_flPipeBombDurationReward[iPos], sSet[iPos], -1.0, 99999.0); - g_esSpecial[iIndex].g_flPunchResistanceReward[iPos] = flGetClampedValue(key, "PunchResistanceReward", "Punch Resistance Reward", "Punch_Resistance_Reward", "punchres", g_esSpecial[iIndex].g_flPunchResistanceReward[iPos], sSet[iPos], -1.0, 1.0); - g_esSpecial[iIndex].g_flRapidPistolReward[iPos] = flGetClampedValue(key, "RapidPistolReward", "Rapid Pistol Reward", "Rapid_Pistol_Reward", "rapid", g_esSpecial[iIndex].g_flRapidPistolReward[iPos], sSet[iPos], -1.0, 1.0); - g_esSpecial[iIndex].g_flRefillPercentReward[iPos] = flGetClampedValue(key, "RefillPercentReward", "Refill Percent Reward", "Refill_Percent_Reward", "refillpercent", g_esSpecial[iIndex].g_flRefillPercentReward[iPos], sSet[iPos], -1.0, 100.0); - g_esSpecial[iIndex].g_flShoveDamageReward[iPos] = flGetClampedValue(key, "ShoveDamageReward", "Shove Damage Reward", "Shove_Damage_Reward", "shovedmg", g_esSpecial[iIndex].g_flShoveDamageReward[iPos], sSet[iPos], -1.0, 99999.0); - g_esSpecial[iIndex].g_flShoveRateReward[iPos] = flGetClampedValue(key, "ShoveRateReward", "Shove Rate Reward", "Shove_Rate_Reward", "shoverate", g_esSpecial[iIndex].g_flShoveRateReward[iPos], sSet[iPos], -1.0, 99999.0); - g_esSpecial[iIndex].g_flSpeedBoostReward[iPos] = flGetClampedValue(key, "SpeedBoostReward", "Speed Boost Reward", "Speed_Boost_Reward", "speedboost", g_esSpecial[iIndex].g_flSpeedBoostReward[iPos], sSet[iPos], -1.0, 99999.0); - g_esSpecial[iIndex].g_iRewardEnabled[iPos] = iGetClampedValue(key, "RewardEnabled", "Reward Enabled", "Reward_Enabled", "renabled", g_esSpecial[iIndex].g_iRewardEnabled[iPos], sSet[iPos], -2, 2147483647); - g_esSpecial[iIndex].g_iRewardBots[iPos] = iGetClampedValue(key, "RewardBots", "Reward Bots", "Reward_Bots", "bots", g_esSpecial[iIndex].g_iRewardBots[iPos], sSet[iPos], -2, 2147483647); - g_esSpecial[iIndex].g_iRewardEffect[iPos] = iGetClampedValue(key, "RewardEffect", "Reward Effect", "Reward_Effect", "effect", g_esSpecial[iIndex].g_iRewardEffect[iPos], sSet[iPos], -1, 15); - g_esSpecial[iIndex].g_iRewardNotify[iPos] = iGetClampedValue(key, "RewardNotify", "Reward Notify", "Reward_Notify", "rnotify", g_esSpecial[iIndex].g_iRewardNotify[iPos], sSet[iPos], -1, 3); - g_esSpecial[iIndex].g_iRewardVisual[iPos] = iGetClampedValue(key, "RewardVisual", "Reward Visual", "Reward_Visual", "visual", g_esSpecial[iIndex].g_iRewardVisual[iPos], sSet[iPos], -1, 127); - g_esSpecial[iIndex].g_iAmmoBoostReward[iPos] = iGetClampedValue(key, "AmmoBoostReward", "Ammo Boost Reward", "Ammo_Boost_Reward", "ammoboost", g_esSpecial[iIndex].g_iAmmoBoostReward[iPos], sSet[iPos], -1, 1); - g_esSpecial[iIndex].g_iAmmoRegenReward[iPos] = iGetClampedValue(key, "AmmoRegenReward", "Ammo Regen Reward", "Ammo_Regen_Reward", "ammoregen", g_esSpecial[iIndex].g_iAmmoRegenReward[iPos], sSet[iPos], -1, 99999); - g_esSpecial[iIndex].g_iBlazeHealthReward[iPos] = iGetClampedValue(key, "BlazeHealthReward", "Blaze Health Reward", "Blaze_Health_Reward", "blaze", g_esSpecial[iIndex].g_iBlazeHealthReward[iPos], sSet[iPos], -1, 1); - g_esSpecial[iIndex].g_iBunnyHopReward[iPos] = iGetClampedValue(key, "BunnyHopReward", "Bunny Hop Reward", "Bunny_Hop_Reward", "bhop", g_esSpecial[iIndex].g_iBunnyHopReward[iPos], sSet[iPos], -1, 1); - g_esSpecial[iIndex].g_iBurstDoorsReward[iPos] = iGetClampedValue(key, "BurstDoorsReward", "Burst Doors Reward", "Burst_Doors_Reward", "burstdoors", g_esSpecial[iIndex].g_iBurstDoorsReward[iPos], sSet[iPos], -1, 1); - g_esSpecial[iIndex].g_iCleanKillsReward[iPos] = iGetClampedValue(key, "CleanKillsReward", "Clean Kills Reward", "Clean_Kills_Reward", "cleankills", g_esSpecial[iIndex].g_iCleanKillsReward[iPos], sSet[iPos], -1, 1); - g_esSpecial[iIndex].g_iClusterBombsReward[iPos] = iGetClampedValue(key, "ClusterBombsReward", "Cluster Bombs Reward", "Cluster_Bombs_Reward", "cluster", g_esSpecial[iIndex].g_iClusterBombsReward[iPos], sSet[iPos], -1, 5); - g_esSpecial[iIndex].g_iFriendlyFireReward[iPos] = iGetClampedValue(key, "FriendlyFireReward", "Friendly Fire Reward", "Friendly_Fire_Reward", "friendlyfire", g_esSpecial[iIndex].g_iFriendlyFireReward[iPos], sSet[iPos], -1, 1); - g_esSpecial[iIndex].g_iGhostBulletsReward[iPos] = iGetClampedValue(key, "GhostBulletsReward", "Ghost Bullets Reward", "Ghost_Bullets_Reward", "ghost", g_esSpecial[iIndex].g_iGhostBulletsReward[iPos], sSet[iPos], -1, 1); - g_esSpecial[iIndex].g_iHealthRegenReward[iPos] = iGetClampedValue(key, "HealthRegenReward", "Health Regen Reward", "Health_Regen_Reward", "hpregen", g_esSpecial[iIndex].g_iHealthRegenReward[iPos], sSet[iPos], -1, MT_MAXHEALTH); - g_esSpecial[iIndex].g_iHollowpointAmmoReward[iPos] = iGetClampedValue(key, "HollowpointAmmoReward", "Hollowpoint Ammo Reward", "Hollowpoint_Ammo_Reward", "hollowpoint", g_esSpecial[iIndex].g_iHollowpointAmmoReward[iPos], sSet[iPos], -1, 1); - g_esSpecial[iIndex].g_iInextinguishableFireReward[iPos] = iGetClampedValue(key, "InextinguishableFireReward", "Inextinguishable Fire Reward", "Inextinguishable_Fire_Reward", "inexfire", g_esSpecial[iIndex].g_iInextinguishableFireReward[iPos], sSet[iPos], -1, 1); - g_esSpecial[iIndex].g_iInfiniteAmmoReward[iPos] = iGetClampedValue(key, "InfiniteAmmoReward", "Infinite Ammo Reward", "Infinite_Ammo_Reward", "infammo", g_esSpecial[iIndex].g_iInfiniteAmmoReward[iPos], sSet[iPos], -1, 31); - g_esSpecial[iIndex].g_iLadderActionsReward[iPos] = iGetClampedValue(key, "LadderActionsReward", "Ladder Actions Reward", "Ladder_Action_Reward", "ladderactions", g_esSpecial[iIndex].g_iLadderActionsReward[iPos], sSet[iPos], -1, 1); - g_esSpecial[iIndex].g_iLadyKillerReward[iPos] = iGetClampedValue(key, "LadyKillerReward", "Lady Killer Reward", "Lady_Killer_Reward", "ladykiller", g_esSpecial[iIndex].g_iLadyKillerReward[iPos], sSet[iPos], -1, 99999); - g_esSpecial[iIndex].g_iLaserSightReward[iPos] = iGetClampedValue(key, "LaserSightReward", "Laser Sight Reward", "Laser_Sight_Reward", "lasersight", g_esSpecial[iIndex].g_iLaserSightReward[iPos], sSet[iPos], -1, 1); - g_esSpecial[iIndex].g_iLifeLeechReward[iPos] = iGetClampedValue(key, "LifeLeechReward", "Life Leech Reward", "Life_Leech_Reward", "lifeleech", g_esSpecial[iIndex].g_iLifeLeechReward[iPos], sSet[iPos], -1, MT_MAXHEALTH); - g_esSpecial[iIndex].g_iMedicalCutsReward[iPos] = iGetClampedValue(key, "MedicalCutsReward", "Medical Cuts Reward", "Medical_Cuts_Reward", "medcuts", g_esSpecial[iIndex].g_iMedicalCutsReward[iPos], sSet[iPos], -1, 1); - g_esSpecial[iIndex].g_iMeleeRangeReward[iPos] = iGetClampedValue(key, "MeleeRangeReward", "Melee Range Reward", "Melee_Range_Reward", "meleerange", g_esSpecial[iIndex].g_iMeleeRangeReward[iPos], sSet[iPos], -1, 99999); - g_esSpecial[iIndex].g_iMidairDashesReward[iPos] = iGetClampedValue(key, "MidairDashesReward", "Midair Dashes Reward", "Midair_Dashes_Reward", "midairdashes", g_esSpecial[iIndex].g_iMidairDashesReward[iPos], sSet[iPos], -1, 99999); - g_esSpecial[iIndex].g_iParticleEffectVisual[iPos] = iGetClampedValue(key, "ParticleEffectVisual", "Particle Effect Visual", "Particle_Effect_Visual", "particle", g_esSpecial[iIndex].g_iParticleEffectVisual[iPos], sSet[iPos], -1, 15); - g_esSpecial[iIndex].g_iPrefsNotify[iPos] = iGetClampedValue(key, "PrefsNotify", "Prefs Notify", "Prefs_Notify", "pnotify", g_esSpecial[iIndex].g_iPrefsNotify[iPos], sSet[iPos], -1, 1); - g_esSpecial[iIndex].g_iRecoilDampenerReward[iPos] = iGetClampedValue(key, "RecoilDampenerReward", "Recoil Dampener Reward", "Recoil_Dampener_Reward", "recoil", g_esSpecial[iIndex].g_iRecoilDampenerReward[iPos], sSet[iPos], -1, 1); - g_esSpecial[iIndex].g_iRegenBurstsReward[iPos] = iGetClampedValue(key, "RegenBurstsReward", "Regen Bursts Reward", "Regen_Bursts_Reward", "regburst", g_esSpecial[iIndex].g_iRegenBurstsReward[iPos], sSet[iPos], -1, 1); - g_esSpecial[iIndex].g_iRespawnLoadoutReward[iPos] = iGetClampedValue(key, "RespawnLoadoutReward", "Respawn Loadout Reward", "Respawn_Loadout_Reward", "resloadout", g_esSpecial[iIndex].g_iRespawnLoadoutReward[iPos], sSet[iPos], -1, 1); - g_esSpecial[iIndex].g_iReviveHealthReward[iPos] = iGetClampedValue(key, "ReviveHealthReward", "Revive Health Reward", "Revive_Health_Reward", "revivehp", g_esSpecial[iIndex].g_iReviveHealthReward[iPos], sSet[iPos], -1, MT_MAXHEALTH); - g_esSpecial[iIndex].g_iShareRewards[iPos] = iGetClampedValue(key, "ShareRewards", "Share Rewards", "Share_Rewards", "share", g_esSpecial[iIndex].g_iShareRewards[iPos], sSet[iPos], -1, 3); - g_esSpecial[iIndex].g_iShovePenaltyReward[iPos] = iGetClampedValue(key, "ShovePenaltyReward", "Shove Penalty Reward", "Shove_Penalty_Reward", "shovepenalty", g_esSpecial[iIndex].g_iShovePenaltyReward[iPos], sSet[iPos], -1, 1); - g_esSpecial[iIndex].g_iSledgehammerRoundsReward[iPos] = iGetClampedValue(key, "SledgehammerRoundsReward", "Sledgehammer Rounds Reward", "Sledgehammer_Rounds_Reward", "sledgehammer", g_esSpecial[iIndex].g_iSledgehammerRoundsReward[iPos], sSet[iPos], -1, 1); - g_esSpecial[iIndex].g_iSpecialAmmoReward[iPos] = iGetClampedValue(key, "SpecialAmmoReward", "Special Ammo Reward", "Special_Ammo_Reward", "specialammo", g_esSpecial[iIndex].g_iSpecialAmmoReward[iPos], sSet[iPos], -1, 3); - g_esSpecial[iIndex].g_iStackRewards[iPos] = iGetClampedValue(key, "StackRewards", "Stack Rewards", "Stack_Rewards", "stack", g_esSpecial[iIndex].g_iStackRewards[iPos], sSet[iPos], -1, 2147483647); - g_esSpecial[iIndex].g_iStickyGrenadesReward[iPos] = iGetClampedValue(key, "StickyGrenadesReward", "Sticky Grenades Reward", "Sticky_Grenades_Reward", "sticky", g_esSpecial[iIndex].g_iStickyGrenadesReward[iPos], sSet[iPos], -1, 1); - g_esSpecial[iIndex].g_iSyringeDartsReward[iPos] = iGetClampedValue(key, "SyringeDartsReward", "Syringe Darts Reward", "Syringe_Darts_Reward", "syringe", g_esSpecial[iIndex].g_iSyringeDartsReward[iPos], sSet[iPos], -1, 1); - g_esSpecial[iIndex].g_iThornsReward[iPos] = iGetClampedValue(key, "ThornsReward", "Thorns Reward", "Thorns_Reward", "thorns", g_esSpecial[iIndex].g_iThornsReward[iPos], sSet[iPos], -1, 1); - g_esSpecial[iIndex].g_iUsefulRewards[iPos] = iGetClampedValue(key, "UsefulRewards", "Useful Rewards", "Useful_Rewards", "useful", g_esSpecial[iIndex].g_iUsefulRewards[iPos], sSet[iPos], -1, 15); - g_esSpecial[iIndex].g_iVoicePitchVisual[iPos] = iGetClampedValue(key, "VoicePitchVisual", "Voice Pitch Visual", "Voice_Pitch_Visual", "voicepitch", g_esSpecial[iIndex].g_iVoicePitchVisual[iPos], sSet[iPos], -1, 255); - - vGetConfigColors(sValue, sizeof sValue, sSet[iPos], ';'); - vGetStringValue(key, "BodyColorVisual", "Body Color Visual", "Body_Color_Visual", "bodycolor", iPos, g_esSpecial[iIndex].g_sBodyColorVisual, sizeof esSpecial::g_sBodyColorVisual, g_esSpecial[iIndex].g_sBodyColorVisual2, sizeof esSpecial::g_sBodyColorVisual2, g_esSpecial[iIndex].g_sBodyColorVisual3, sizeof esSpecial::g_sBodyColorVisual3, g_esSpecial[iIndex].g_sBodyColorVisual4, sizeof esSpecial::g_sBodyColorVisual4, sValue); - vGetStringValue(key, "FallVoicelineReward", "Fall Voiceline Reward", "Fall_Voiceline_Reward", "fallvoice", iPos, g_esSpecial[iIndex].g_sFallVoicelineReward, sizeof esSpecial::g_sFallVoicelineReward, g_esSpecial[iIndex].g_sFallVoicelineReward2, sizeof esSpecial::g_sFallVoicelineReward2, g_esSpecial[iIndex].g_sFallVoicelineReward3, sizeof esSpecial::g_sFallVoicelineReward3, g_esSpecial[iIndex].g_sFallVoicelineReward4, sizeof esSpecial::g_sFallVoicelineReward4, sSet[iPos]); - vGetStringValue(key, "GlowColorVisual", "Glow Color Visual", "Glow_Color_Visual", "glowcolor", iPos, g_esSpecial[iIndex].g_sOutlineColorVisual, sizeof esSpecial::g_sOutlineColorVisual, g_esSpecial[iIndex].g_sOutlineColorVisual2, sizeof esSpecial::g_sOutlineColorVisual2, g_esSpecial[iIndex].g_sOutlineColorVisual3, sizeof esSpecial::g_sOutlineColorVisual3, g_esSpecial[iIndex].g_sOutlineColorVisual4, sizeof esSpecial::g_sOutlineColorVisual4, sValue); - vGetStringValue(key, "ItemReward", "Item Reward", "Item_Reward", "item", iPos, g_esSpecial[iIndex].g_sItemReward, sizeof esSpecial::g_sItemReward, g_esSpecial[iIndex].g_sItemReward2, sizeof esSpecial::g_sItemReward2, g_esSpecial[iIndex].g_sItemReward3, sizeof esSpecial::g_sItemReward3, g_esSpecial[iIndex].g_sItemReward4, sizeof esSpecial::g_sItemReward4, sValue); - vGetStringValue(key, "LightColorVisual", "Light Color Visual", "Light_Color_Visual", "lightcolor", iPos, g_esSpecial[iIndex].g_sLightColorVisual, sizeof esSpecial::g_sLightColorVisual, g_esSpecial[iIndex].g_sLightColorVisual2, sizeof esSpecial::g_sLightColorVisual2, g_esSpecial[iIndex].g_sLightColorVisual3, sizeof esSpecial::g_sLightColorVisual3, g_esSpecial[iIndex].g_sLightColorVisual4, sizeof esSpecial::g_sLightColorVisual4, sValue); - vGetStringValue(key, "LoopingVoicelineVisual", "Looping Voiceline Visual", "Looping_Voiceline_Visual", "loopvoice", iPos, g_esSpecial[iIndex].g_sLoopingVoicelineVisual, sizeof esSpecial::g_sLoopingVoicelineVisual, g_esSpecial[iIndex].g_sLoopingVoicelineVisual2, sizeof esSpecial::g_sLoopingVoicelineVisual2, g_esSpecial[iIndex].g_sLoopingVoicelineVisual3, sizeof esSpecial::g_sLoopingVoicelineVisual3, g_esSpecial[iIndex].g_sLoopingVoicelineVisual4, sizeof esSpecial::g_sLoopingVoicelineVisual4, sSet[iPos]); - vGetStringValue(key, "ScreenColorVisual", "Screen Color Visual", "Screen_Color_Visual", "screencolor", iPos, g_esSpecial[iIndex].g_sScreenColorVisual, sizeof esSpecial::g_sScreenColorVisual, g_esSpecial[iIndex].g_sScreenColorVisual2, sizeof esSpecial::g_sScreenColorVisual2, g_esSpecial[iIndex].g_sScreenColorVisual3, sizeof esSpecial::g_sScreenColorVisual3, g_esSpecial[iIndex].g_sScreenColorVisual4, sizeof esSpecial::g_sScreenColorVisual4, sValue); + vGetSpecialSettingNames(sSettings, sizeof sSettings[], "BaseHealth", "Base Health", "Base_Health", "basehp", iPos); + g_esSpecial[iIndex].g_iBaseHealth[iPos] = iGetClampedValue(key, sSettings[0], sSettings[1], sSettings[2], sSettings[3], g_esSpecial[iIndex].g_iBaseHealth[iPos], value, -1, MT_MAXHEALTH); + vGetSpecialSettingNames(sSettings, sizeof sSettings[], "ExtraHealth", "Extra Health", "Extra_Health", "extrahp", iPos); + g_esSpecial[iIndex].g_iExtraHealth[iPos] = iGetClampedValue(key, sSettings[0], sSettings[1], sSettings[2], sSettings[3], g_esSpecial[iIndex].g_iExtraHealth[iPos], value, MT_MAX_HEALTH_REDUCTION, MT_MAXHEALTH); } - - g_esSpecial[iIndex].g_iStackLimits[iPos] = iGetClampedValue(key, "StackLimits", "Stack Limits", "Stack_Limits", "limits", g_esSpecial[iIndex].g_iStackLimits[iPos], sSet[iPos], -1, 99999); } - } - else if (StrEqual(subsection, MT_CONFIG_SECTION_GLOW, false)) - { - if (StrEqual(key, "GlowColor", false) || StrEqual(key, "Glow Color", false) || StrEqual(key, "Glow_Color", false)) + else if (StrEqual(subsection, MT_CONFIG_SECTION_BOSS, false)) { - char sValue[64], sSet[3][4]; - vGetConfigColors(sValue, sizeof sValue, value); - strcopy(g_esSpecial[iIndex].g_sGlowColor, sizeof esSpecial::g_sGlowColor, value); + char sValue[44], sSet[4][11]; + strcopy(sValue, sizeof sValue, value); ReplaceString(sValue, sizeof sValue, " ", ""); ExplodeString(sValue, ",", sSet, sizeof sSet, sizeof sSet[]); - for (int iPos = 0; iPos < (sizeof esSpecial::g_iGlowColor); iPos++) + for (int iPos = 0; iPos < (sizeof esSpecial::g_iBossHealth); iPos++) { - g_esSpecial[iIndex].g_iGlowColor[iPos] = (sSet[iPos][0] != '\0' && StringToInt(sSet[iPos]) >= 0) ? iClamp(StringToInt(sSet[iPos]), 0, 255) : -1; + g_esSpecial[iIndex].g_iBossHealth[iPos] = iGetClampedValue(key, "BossHealthStages", "Boss Health Stages", "Boss_Health_Stages", "bosshpstages", g_esSpecial[iIndex].g_iBossHealth[iPos], sSet[iPos], -1, MT_MAXHEALTH); + g_esSpecial[iIndex].g_iBossType[iPos] = iGetClampedValue(key, "BossTypes", "Boss Types", "Boss_Types", "bosstypes", g_esSpecial[iIndex].g_iBossType[iPos], sSet[iPos], -1, MT_MAXTYPES); } } - else if (StrEqual(key, "GlowRange", false) || StrEqual(key, "Glow Range", false) || StrEqual(key, "Glow_Range", false)) + else if (StrEqual(subsection, MT_CONFIG_SECTION_COMBO, false)) { - char sValue[50], sRange[2][7]; - strcopy(sValue, sizeof sValue, value); + if (StrEqual(key, "ComboTypeChance", false) || StrEqual(key, "Combo Type Chance", false) || StrEqual(key, "Combo_Type_Chance", false) || StrEqual(key, "typechance", false)) + { + char sValue[42], sSet[7][6]; + strcopy(sValue, sizeof sValue, value); + ReplaceString(sValue, sizeof sValue, " ", ""); + ExplodeString(sValue, ",", sSet, sizeof sSet, sizeof sSet[]); + for (int iPos = 0; iPos < (sizeof esSpecial::g_flComboTypeChance); iPos++) + { + g_esSpecial[iIndex].g_flComboTypeChance[iPos] = (sSet[iPos][0] != '\0') ? flClamp(StringToFloat(sSet[iPos]), -1.0, 100.0) : g_esSpecial[iIndex].g_flComboTypeChance[iPos]; + } + } + else + { + char sValue[140], sSet[10][14]; + strcopy(sValue, sizeof sValue, value); + ReplaceString(sValue, sizeof sValue, " ", ""); + ExplodeString(sValue, ",", sSet, sizeof sSet, sizeof sSet[]); + for (int iPos = 0; iPos < (sizeof esSpecial::g_flComboChance); iPos++) + { + if (StrEqual(key, "ComboRadius", false) || StrEqual(key, "Combo Radius", false) || StrEqual(key, "Combo_Radius", false) || StrEqual(key, "radius", false)) + { + char sRange[2][7], sSubset[14]; + strcopy(sSubset, sizeof sSubset, sSet[iPos]); + ReplaceString(sSubset, sizeof sSubset, " ", ""); + ExplodeString(sSubset, ";", sRange, sizeof sRange, sizeof sRange[]); + + g_esSpecial[iIndex].g_flComboMinRadius[iPos] = (sRange[0][0] != '\0') ? flClamp(StringToFloat(sRange[0]), -200.0, 1.0) : g_esSpecial[iIndex].g_flComboMinRadius[iPos]; + g_esSpecial[iIndex].g_flComboMaxRadius[iPos] = (sRange[1][0] != '\0') ? flClamp(StringToFloat(sRange[1]), -1.0, 200.0) : g_esSpecial[iIndex].g_flComboMaxRadius[iPos]; + } + else + { + g_esSpecial[iIndex].g_flComboChance[iPos] = flGetClampedValue(key, "ComboChance", "Combo Chance", "Combo_Chance", "chance", g_esSpecial[iIndex].g_flComboChance[iPos], sSet[iPos], -1.0, 100.0); + g_esSpecial[iIndex].g_iComboCooldown[iPos] = iGetClampedValue(key, "ComboCooldown", "Combo Cooldown", "Combo_Cooldown", "cooldown", g_esSpecial[iIndex].g_iComboCooldown[iPos], sSet[iPos], -1, 99999); + g_esSpecial[iIndex].g_flComboDamage[iPos] = flGetClampedValue(key, "ComboDamage", "Combo Damage", "Combo_Damage", "damage", g_esSpecial[iIndex].g_flComboDamage[iPos], sSet[iPos], -1.0, 99999.0); + g_esSpecial[iIndex].g_flComboDeathChance[iPos] = flGetClampedValue(key, "ComboDeathChance", "Combo Death Chance", "Combo_Death_Chance", "deathchance", g_esSpecial[iIndex].g_flComboDeathChance[iPos], sSet[iPos], -1.0, 100.0); + g_esSpecial[iIndex].g_flComboDeathRange[iPos] = flGetClampedValue(key, "ComboDeathRange", "Combo Death Range", "Combo_Death_Range", "deathrange", g_esSpecial[iIndex].g_flComboDeathRange[iPos], sSet[iPos], -1.0, 99999.0); + g_esSpecial[iIndex].g_flComboDelay[iPos] = flGetClampedValue(key, "ComboDelay", "Combo Delay", "Combo_Delay", "delay", g_esSpecial[iIndex].g_flComboDelay[iPos], sSet[iPos], -1.0, 99999.0); + g_esSpecial[iIndex].g_flComboDuration[iPos] = flGetClampedValue(key, "ComboDuration", "Combo Duration", "Combo_Duration", "duration", g_esSpecial[iIndex].g_flComboDuration[iPos], sSet[iPos], -1.0, 99999.0); + g_esSpecial[iIndex].g_flComboInterval[iPos] = flGetClampedValue(key, "ComboInterval", "Combo Interval", "Combo_Interval", "interval", g_esSpecial[iIndex].g_flComboInterval[iPos], sSet[iPos], -1.0, 99999.0); + g_esSpecial[iIndex].g_flComboRange[iPos] = flGetClampedValue(key, "ComboRange", "Combo Range", "Combo_Range", "range", g_esSpecial[iIndex].g_flComboRange[iPos], sSet[iPos], -1.0, 99999.0); + g_esSpecial[iIndex].g_flComboRangeChance[iPos] = flGetClampedValue(key, "ComboRangeChance", "Combo Range Chance", "Combo_Range_Chance", "rangechance", g_esSpecial[iIndex].g_flComboRangeChance[iPos], sSet[iPos], -1.0, 100.0); + g_esSpecial[iIndex].g_iComboRangeCooldown[iPos] = iGetClampedValue(key, "ComboRangeCooldown", "Combo Range Cooldown", "Combo_Range_Cooldown", "rangecooldown", g_esSpecial[iIndex].g_iComboRangeCooldown[iPos], sSet[iPos], -1, 99999); + g_esSpecial[iIndex].g_flComboRockChance[iPos] = flGetClampedValue(key, "ComboRockChance", "Combo Rock Chance", "Combo_Rock_Chance", "rockchance", g_esSpecial[iIndex].g_flComboRockChance[iPos], sSet[iPos], -1.0, 100.0); + g_esSpecial[iIndex].g_iComboRockCooldown[iPos] = iGetClampedValue(key, "ComboRockCooldown", "Combo Rock Cooldown", "Combo_Rock_Cooldown", "rockcooldown", g_esSpecial[iIndex].g_iComboRockCooldown[iPos], sSet[iPos], -1, 99999); + g_esSpecial[iIndex].g_flComboSpeed[iPos] = flGetClampedValue(key, "ComboSpeed", "Combo Speed", "Combo_Speed", "speed", g_esSpecial[iIndex].g_flComboSpeed[iPos], sSet[iPos], -1.0, 99999.0); + } + } + } + } + else if (StrEqual(subsection, MT_CONFIG_SECTION_TRANSFORM, false)) + { + if (StrEqual(key, "TransformTypes", false) || StrEqual(key, "Transform Types", false) || StrEqual(key, "Transform_Types", false) || StrEqual(key, "transtypes", false)) + { + char sValue[50], sSet[10][5]; + strcopy(sValue, sizeof sValue, value); + ReplaceString(sValue, sizeof sValue, " ", ""); + ExplodeString(sValue, ",", sSet, sizeof sSet, sizeof sSet[]); + for (int iPos = 0; iPos < (sizeof esSpecial::g_iTransformType); iPos++) + { + g_esSpecial[iIndex].g_iTransformType[iPos] = (sSet[iPos][0] != '\0') ? iClamp(StringToInt(sSet[iPos]), -1, MT_MAXTYPES) : g_esSpecial[iIndex].g_iTransformType[iPos]; + } + } + } + else if (StrEqual(subsection, MT_CONFIG_SECTION_PROPS, false)) + { + char sValue[64], sSet[4][4]; + vGetConfigColors(sValue, sizeof sValue, value); + vSaveConfigColors(key, "RockColor", "Rock Color", "Rock_Color", "rock", g_esSpecial[iIndex].g_sRockColor, sizeof esSpecial::g_sRockColor, value); ReplaceString(sValue, sizeof sValue, " ", ""); - ExplodeString(sValue, "-", sRange, sizeof sRange, sizeof sRange[]); + ExplodeString(sValue, ",", sSet, sizeof sSet, sizeof sSet[]); - g_esSpecial[iIndex].g_iGlowMinRange = (sRange[0][0] != '\0') ? iClamp(StringToInt(sRange[0]), -1, 99999) : g_esSpecial[iIndex].g_iGlowMinRange; - g_esSpecial[iIndex].g_iGlowMaxRange = (sRange[1][0] != '\0') ? iClamp(StringToInt(sRange[1]), -1, 99999) : g_esSpecial[iIndex].g_iGlowMaxRange; + for (int iPos = 0; iPos < (sizeof esSpecial::g_iRockColor); iPos++) + { + g_esSpecial[iIndex].g_iRockColor[iPos] = iGetClampedValue(key, "RockColor", "Rock Color", "Rock_Color", "rock", g_esSpecial[iIndex].g_iRockColor[iPos], sSet[iPos], -1, 255); + } } - } - else if (StrEqual(subsection, MT_CONFIG_SECTION_HEALTH, false)) - { - char sSettings[4][128]; - for (int iPos = 0; iPos < (sizeof g_sSpecialNames); iPos++) + else if (StrEqual(subsection, MT_CONFIG_SECTION_PARTICLES, false)) { - vGetSpecialSettingNames(sSettings, sizeof sSettings[], "BaseHealth", "Base Health", "Base_Health", "basehp", iPos); - g_esSpecial[iIndex].g_iBaseHealth[iPos] = iGetClampedValue(key, sSettings[0], sSettings[1], sSettings[2], sSettings[3], g_esSpecial[iIndex].g_iBaseHealth[iPos], value, -1, MT_MAXHEALTH); - vGetSpecialSettingNames(sSettings, sizeof sSettings[], "ExtraHealth", "Extra Health", "Extra_Health", "extrahp", iPos); - g_esSpecial[iIndex].g_iExtraHealth[iPos] = iGetClampedValue(key, sSettings[0], sSettings[1], sSettings[2], sSettings[3], g_esSpecial[iIndex].g_iExtraHealth[iPos], value, MT_MAX_HEALTH_REDUCTION, MT_MAXHEALTH); + if (StrEqual(key, "BodyChance", false) || StrEqual(key, "Body Chance", false) || StrEqual(key, "Body_Chance", false) || StrEqual(key, "bchance", false)) + { + char sValue[54], sSet[9][6]; + strcopy(sValue, sizeof sValue, value); + ReplaceString(sValue, sizeof sValue, " ", ""); + ExplodeString(sValue, ",", sSet, sizeof sSet, sizeof sSet[]); + for (int iPos = 0; iPos < (sizeof esSpecial::g_flBodyChance); iPos++) + { + g_esSpecial[iIndex].g_flBodyChance[iPos] = (sSet[iPos][0] != '\0') ? flClamp(StringToFloat(sSet[iPos]), -1.0, 100.0) : g_esSpecial[iIndex].g_flBodyChance[iPos]; + } + } + else if (StrEqual(key, "RockChance", false) || StrEqual(key, "Rock Chance", false) || StrEqual(key, "Rock_Chance", false) || StrEqual(key, "rchance", false)) + { + char sValue[54], sSet[9][6]; + strcopy(sValue, sizeof sValue, value); + ReplaceString(sValue, sizeof sValue, " ", ""); + ExplodeString(sValue, ",", sSet, sizeof sSet, sizeof sSet[]); + for (int iPos = 0; iPos < (sizeof esSpecial::g_flRockChance); iPos++) + { + g_esSpecial[iIndex].g_flRockChance[iPos] = (sSet[iPos][0] != '\0') ? flClamp(StringToFloat(sSet[iPos]), -1.0, 100.0) : g_esSpecial[iIndex].g_flRockChance[iPos]; + } + } } } - else if (StrEqual(subsection, MT_CONFIG_SECTION_BOSS, false)) + + if (StrContains(specsection, MT_CONFIG_SECTION_COMMON, false) != -1 || StrContains(specsection, MT_CONFIG_SECTION_WITCH, false) != -1 || StrEqual(specsection, MT_CONFIG_SECTION_MOB, false) || StrEqual(specsection, MT_CONFIG_SECTION_INFECTED, false) || StrContains(specsection, MT_CONFIG_SECTION_INFECTED2, false) != -1) { - char sValue[44], sSet[4][11]; - strcopy(sValue, sizeof sValue, value); - ReplaceString(sValue, sizeof sValue, " ", ""); - ExplodeString(sValue, ",", sSet, sizeof sSet, sizeof sSet[]); - for (int iPos = 0; iPos < (sizeof esSpecial::g_iBossHealth); iPos++) + g_esHorde[iIndex].g_iMobVariants = iGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "MobVariants", "Mob Variants", "Mob_Variants", "mobvariants ", g_esHorde[iIndex].g_iMobVariants, value, -1, 3); + g_esHorde[iIndex].g_flCommonBioChance = flGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "CommonBioChance", "Common Bio Chance", "Common_Bio_Chance", "commbiochance", g_esHorde[iIndex].g_flCommonBioChance, value, -1.0, 100.0); + g_esHorde[iIndex].g_flCommonChance = flGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "CommonChance", "Common Chance", "Common_Chance", "commchance", g_esHorde[iIndex].g_flCommonChance, value, -1.0, 100.0); + g_esHorde[iIndex].g_flCommonDamagePoints = flGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "CommonDamagePoints", "Common Damage Points", "Common_Damage_Points", "commdmgpoints", g_esHorde[iIndex].g_flCommonDamagePoints, value, -1.0, float(MT_MAXHEALTH)); + g_esHorde[iIndex].g_flCommonDeathPoints = flGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "CommonDeathPoints", "Common Death Points", "Common_Death_Points", "commdeathpoints", g_esHorde[iIndex].g_flCommonDeathPoints, value, -1.0, float(MT_MAXHEALTH)); + g_esHorde[iIndex].g_flCommonGoal = flGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "CommonGoal", "Common Goal", "Common_Goal", "commgoal", g_esHorde[iIndex].g_flCommonGoal, value, -1.0, float(MT_MAXHEALTH)); + g_esHorde[iIndex].g_iCommonVariant = iGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "CommonVariant", "Common Variant", "Common_Variant", "commvariant", g_esHorde[iIndex].g_iCommonVariant, value, -1, 255); + g_esHorde[iIndex].g_flWitchChance = flGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "WitchChance", "Witch Chance", "Witch_Chance", "witchchance", g_esHorde[iIndex].g_flWitchChance, value, -1.0, 100.0); + g_esHorde[iIndex].g_iWitchFilter = iGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "WitchFilter", "Witch Filter", "Witch_Filter", "witchfilter", g_esHorde[iIndex].g_iWitchFilter, value, -1, 511); + g_esHorde[iIndex].g_iWitchMode = iGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "WitchMode", "Witch Mode", "Witch_Mode", "witchmode", g_esHorde[iIndex].g_iWitchMode, value, -1, 1); + g_esHorde[iIndex].g_flWitchMutateChance = flGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "WitchMutateChance", "Witch Mutate Chance", "Witch_Mutate_Chance", "witchmutatechance", g_esHorde[iIndex].g_flWitchMutateChance, value, -1.0, 100.0); + g_esHorde[iIndex].g_flWitchRange = flGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "WitchRange", "Witch Range", "Witch_Range", "witchrange", g_esHorde[iIndex].g_flWitchRange, value, -1.0, 99999.0); + g_esHorde[iIndex].g_iWitchTypes = iGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "WitchTypes", "Witch Types", "Witch_Types", "witchtypes", g_esHorde[iIndex].g_iWitchTypes, value, -1, 7); + g_esHorde[iIndex].g_iGlowEnabled = iGetKeyValue(subsection, MT_CONFIG_SECTION_GLOW, MT_CONFIG_SECTION_GLOW, MT_CONFIG_SECTION_GLOW, MT_CONFIG_SECTION_GLOW, key, "GlowEnabled", "Glow Enabled", "Glow_Enabled", "genabled", g_esHorde[iIndex].g_iGlowEnabled, value, -1, 1); + g_esHorde[iIndex].g_iGlowFlashing = iGetKeyValue(subsection, MT_CONFIG_SECTION_GLOW, MT_CONFIG_SECTION_GLOW, MT_CONFIG_SECTION_GLOW, MT_CONFIG_SECTION_GLOW, key, "GlowFlashing", "Glow Flashing", "Glow_Flashing", "flashing", g_esHorde[iIndex].g_iGlowFlashing, value, -1, 1); + g_esHorde[iIndex].g_iGlowType = iGetKeyValue(subsection, MT_CONFIG_SECTION_GLOW, MT_CONFIG_SECTION_GLOW, MT_CONFIG_SECTION_GLOW, MT_CONFIG_SECTION_GLOW, key, "GlowType", "Glow Type", "Glow_Type", "type", g_esHorde[iIndex].g_iGlowType, value, -1, 1); + g_esHorde[iIndex].g_iDisplayHealth = iGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "DisplayHealth", "Display Health", "Display_Health", "displayhp", g_esHorde[iIndex].g_iDisplayHealth, value, -1, 11); + g_esHorde[iIndex].g_iDisplayHealthType = iGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "DisplayHealthType", "Display Health Type", "Display_Health_Type", "displaytype", g_esHorde[iIndex].g_iDisplayHealthType, value, -1, 2); + g_esHorde[iIndex].g_iBodyEffects = iGetKeyValue(subsection, MT_CONFIG_SECTION_PARTICLES, MT_CONFIG_SECTION_PARTICLES, MT_CONFIG_SECTION_PARTICLES, MT_CONFIG_SECTION_PARTICLES, key, "BodyEffects", "Body Effects", "Body_Effects", "body", g_esHorde[iIndex].g_iBodyEffects, value, -1, 127); + + vGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "HealthCharacters", "Health Characters", "Health_Characters", "hpchars", g_esHorde[iIndex].g_sHealthCharacters, sizeof esHorde::g_sHealthCharacters, value); + + if (StrEqual(subsection, MT_CONFIG_SECTION_GENERAL, false)) + { + if (StrEqual(key, "SkinColor", false) || StrEqual(key, "Skin Color", false) || StrEqual(key, "Skin_Color", false) || StrEqual(key, "skin", false)) + { + char sValue[64], sSet[4][4]; + vGetConfigColors(sValue, sizeof sValue, value); + strcopy(g_esHorde[iIndex].g_sSkinColor, sizeof esHorde::g_sSkinColor, value); + ReplaceString(sValue, sizeof sValue, " ", ""); + ExplodeString(sValue, ",", sSet, sizeof sSet, sizeof sSet[]); + for (int iPos = 0; iPos < (sizeof esHorde::g_iSkinColor); iPos++) + { + g_esHorde[iIndex].g_iSkinColor[iPos] = (sSet[iPos][0] != '\0' && StringToInt(sSet[iPos]) >= 0) ? iClamp(StringToInt(sSet[iPos]), 0, 255) : -1; + } + } + else if (StrContains(key, "Name", false) != -1) + { + vGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "CommonName", "Common Name", "Common_Name", "commname", g_esHorde[iIndex].g_sCommonName, sizeof esHorde::g_sCommonName, value); + vGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "WitchName", "Witch Name", "Witch_Name", "witchname", g_esHorde[iIndex].g_sWitchName, sizeof esHorde::g_sWitchName, value); + } + } + else if (StrEqual(subsection, MT_CONFIG_SECTION_GLOW, false)) + { + if (StrEqual(key, "GlowColor", false) || StrEqual(key, "Glow Color", false) || StrEqual(key, "Glow_Color", false)) + { + char sValue[64], sSet[3][4]; + vGetConfigColors(sValue, sizeof sValue, value); + strcopy(g_esHorde[iIndex].g_sGlowColor, sizeof esHorde::g_sGlowColor, value); + ReplaceString(sValue, sizeof sValue, " ", ""); + ExplodeString(sValue, ",", sSet, sizeof sSet, sizeof sSet[]); + for (int iPos = 0; iPos < (sizeof esHorde::g_iGlowColor); iPos++) + { + g_esHorde[iIndex].g_iGlowColor[iPos] = (sSet[iPos][0] != '\0' && StringToInt(sSet[iPos]) >= 0) ? iClamp(StringToInt(sSet[iPos]), 0, 255) : -1; + } + } + else if (StrEqual(key, "GlowRange", false) || StrEqual(key, "Glow Range", false) || StrEqual(key, "Glow_Range", false)) + { + char sValue[50], sRange[2][7]; + strcopy(sValue, sizeof sValue, value); + ReplaceString(sValue, sizeof sValue, " ", ""); + ExplodeString(sValue, "-", sRange, sizeof sRange, sizeof sRange[]); + + g_esHorde[iIndex].g_iGlowMinRange = (sRange[0][0] != '\0') ? iClamp(StringToInt(sRange[0]), -1, 99999) : g_esHorde[iIndex].g_iGlowMinRange; + g_esHorde[iIndex].g_iGlowMaxRange = (sRange[1][0] != '\0') ? iClamp(StringToInt(sRange[1]), -1, 99999) : g_esHorde[iIndex].g_iGlowMaxRange; + } + } + else if (StrEqual(subsection, MT_CONFIG_SECTION_PARTICLES, false)) { - g_esSpecial[iIndex].g_iBossHealth[iPos] = iGetClampedValue(key, "BossHealthStages", "Boss Health Stages", "Boss_Health_Stages", "bosshpstages", g_esSpecial[iIndex].g_iBossHealth[iPos], sSet[iPos], -1, MT_MAXHEALTH); - g_esSpecial[iIndex].g_iBossType[iPos] = iGetClampedValue(key, "BossTypes", "Boss Types", "Boss_Types", "bosstypes", g_esSpecial[iIndex].g_iBossType[iPos], sSet[iPos], -1, MT_MAXTYPES); + if (StrEqual(key, "BodyChance", false) || StrEqual(key, "Body Chance", false) || StrEqual(key, "Body_Chance", false) || StrEqual(key, "bchance", false)) + { + char sValue[54], sSet[9][6]; + strcopy(sValue, sizeof sValue, value); + ReplaceString(sValue, sizeof sValue, " ", ""); + ExplodeString(sValue, ",", sSet, sizeof sSet, sizeof sSet[]); + for (int iPos = 0; iPos < (sizeof esHorde::g_flBodyChance); iPos++) + { + g_esHorde[iIndex].g_flBodyChance[iPos] = (sSet[iPos][0] != '\0') ? flClamp(StringToFloat(sSet[iPos]), -1.0, 100.0) : g_esHorde[iIndex].g_flBodyChance[iPos]; + } + } } } - else if (StrEqual(subsection, MT_CONFIG_SECTION_COMBO, false)) - { - if (StrEqual(key, "ComboTypeChance", false) || StrEqual(key, "Combo Type Chance", false) || StrEqual(key, "Combo_Type_Chance", false) || StrEqual(key, "typechance", false)) + + vConfigsLoadedForward(subsection, key, value, iIndex, -1, mode, true, specsection); + } +} + +void vReadSpecificSettings(int mode, const char[] section, const char[] subsection, const char[] specsection, const char[] key, const char[] value) +{ + if (StrEqual(section, MT_CONFIG_SECTION_SETTINGS, false) || StrEqual(section, MT_CONFIG_SECTION_SETTINGS2, false) || StrEqual(section, MT_CONFIG_SECTION_SETTINGS3, false) || StrEqual(section, MT_CONFIG_SECTION_SETTINGS4, false)) + { + if (StrContains(specsection, MT_CONFIG_SECTION_NICK, false) != -1 || StrContains(specsection, MT_CONFIG_SECTION_ROCHELLE, false) != -1 || StrContains(specsection, MT_CONFIG_SECTION_ELLIS, false) != -1 || StrContains(specsection, MT_CONFIG_SECTION_COACH, false) != -1 + || StrContains(specsection, MT_CONFIG_SECTION_BILL, false) != -1 || StrContains(specsection, MT_CONFIG_SECTION_ZOEY, false) != -1 || StrContains(specsection, MT_CONFIG_SECTION_FRANCIS, false) != -1 || StrContains(specsection, MT_CONFIG_SECTION_LOUIS, false) != -1 + || StrContains(specsection, MT_CONFIG_SECTION_WEAPON, false) != -1 || StrContains(specsection, MT_CONFIG_SECTION_SMOKER, false) != -1 || StrContains(specsection, MT_CONFIG_SECTION_BOOMER, false) != -1 || StrContains(specsection, MT_CONFIG_SECTION_HUNTER, false) != -1 + || StrContains(specsection, MT_CONFIG_SECTION_SPITTER, false) != -1 || StrContains(specsection, MT_CONFIG_SECTION_JOCKEY, false) != -1 || StrContains(specsection, MT_CONFIG_SECTION_CHARGER, false) != -1 || StrEqual(specsection, MT_CONFIG_SECTION_SPECIAL, false) + || StrContains(specsection, MT_CONFIG_SECTION_SPECIAL2, false) != -1 || StrEqual(specsection, MT_CONFIG_SECTION_INFECTED, false) || StrContains(specsection, MT_CONFIG_SECTION_INFECTED2, false) != -1) + { + g_esSpecific.g_iSpecialTypes = iGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "SpecialTypes", "Special Types", "Special_Types", "spectypes", g_esSpecific.g_iSpecialTypes, value, -1, 63); + g_esSpecific.g_iSpecialTypes = (g_esSpecific.g_iSpecialTypes > 0) ? iGetSpecialTypes(g_esSpecific.g_iSpecialTypes, specsection) : 0; + g_esSpecific.g_iDeathRevert = iGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "DeathRevert", "Death Revert", "Death_Revert", "revert", g_esSpecific.g_iDeathRevert, value, -1, 1); + g_esSpecific.g_iFinalesOnly = iGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "FinalesOnly", "Finales Only", "Finales_Only", "finale", g_esSpecific.g_iFinalesOnly, value, -1, 4); + g_esSpecific.g_iRequiresHumans = iGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esSpecific.g_iRequiresHumans, value, -1, 32); + g_esSpecific.g_flSpecialChance = flGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "SpecialChance", "Special Chance", "Special_Chance", "chance", g_esSpecific.g_flSpecialChance, value, -1.0, 100.0); + g_esSpecific.g_iSpecialNote = iGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "SpecialNote", "Special Note", "Special_Note", "note", g_esSpecific.g_iSpecialNote, value, -1, 1); + g_esSpecific.g_iSpecialModel = iGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "SpecialModel", "Special Model", "Special_Model", "model", g_esSpecific.g_iSpecialModel, value, -1, 3); + g_esSpecific.g_flBurnDuration = flGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "BurnDuration", "Burn Duration", "Burn_Duration", "burndur", g_esSpecific.g_flBurnDuration, value, -1.0, 99999.0); + g_esSpecific.g_flBurntSkin = flGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "BurntSkin", "Burnt Skin", "Burnt_Skin", "burnt", g_esSpecific.g_flBurntSkin, value, -2.0, 1.0); + g_esSpecific.g_iCycleTypes = iGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "CycleTypes", "Cycle Types", "Cycle_Types", "cycle", g_esSpecific.g_iCycleTypes, value, -1, 4); + g_esSpecific.g_iSpawnEnabled = iGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "SpawnEnabled", "Spawn Enabled", "Spawn_Enabled", "spawn", g_esSpecific.g_iSpawnEnabled, value, -1, 1); + g_esSpecific.g_iAnnounceArrival = iGetKeyValue(subsection, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE2, key, "AnnounceArrival", "Announce Arrival", "Announce_Arrival", "arrival", g_esSpecific.g_iAnnounceArrival, value, -1, 31); + g_esSpecific.g_iAnnounceDeath = iGetKeyValue(subsection, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE2, key, "AnnounceDeath", "Announce Death", "Announce_Death", "death", g_esSpecific.g_iAnnounceDeath, value, -1, 2); + g_esSpecific.g_iAnnounceKill = iGetKeyValue(subsection, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE2, key, "AnnounceKill", "Announce Kill", "Announce_Kill", "kill", g_esSpecific.g_iAnnounceKill, value, -1, 1); + g_esSpecific.g_iArrivalMessage = iGetKeyValue(subsection, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE2, key, "ArrivalMessage", "Arrival Message", "Arrival_Message", "arrivalmsg", g_esSpecific.g_iArrivalMessage, value, -1, 1023); + g_esSpecific.g_iArrivalSound = iGetKeyValue(subsection, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE2, key, "ArrivalSound", "Arrival Sound", "Arrival_Sound", "arrivalsnd", g_esSpecific.g_iArrivalSound, value, -1, 1); + g_esSpecific.g_iDeathDetails = iGetKeyValue(subsection, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE2, key, "DeathDetails", "Death Details", "Death_Details", "deathdets", g_esSpecific.g_iDeathDetails, value, -1, 5); + g_esSpecific.g_iDeathMessage = iGetKeyValue(subsection, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE2, key, "DeathMessage", "Death Message", "Death_Message", "deathmsg", g_esSpecific.g_iDeathMessage, value, -1, 1023); + g_esSpecific.g_iDeathSound = iGetKeyValue(subsection, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE2, key, "DeathSound", "Death Sound", "Death_Sound", "deathsnd", g_esSpecific.g_iDeathSound, value, -1, 1); + g_esSpecific.g_iKillMessage = iGetKeyValue(subsection, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE2, key, "KillMessage", "Kill Message", "Kill_Message", "killmsg", g_esSpecific.g_iKillMessage, value, -1, 1023); + g_esSpecific.g_iVocalizeArrival = iGetKeyValue(subsection, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE2, key, "VocalizeArrival", "Vocalize Arrival", "Vocalize_Arrival", "arrivalvoc", g_esSpecific.g_iVocalizeArrival, value, -1, 1); + g_esSpecific.g_iVocalizeDeath = iGetKeyValue(subsection, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE2, key, "VocalizeDeath", "Vocalize Death", "Vocalize_Death", "deathvoc", g_esSpecific.g_iVocalizeDeath, value, -1, 1); + g_esSpecific.g_flArmorPercentage = flGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "ArmorPercentage", "Armor Percentage", "Armor_Percentage", "armorpercent", g_esSpecific.g_flArmorPercentage, value, -1.0, 1.0); + g_esSpecific.g_flArmorResistance[0] = flGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "ArmorResistance", "Armor Resistance", "Armor_Resistance", "armorres", g_esSpecific.g_flArmorResistance[0], value, -1.0, 1.0); + g_esSpecific.g_flShieldPercentage = flGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "ShieldPercentage", "Shield Percentage", "Shield_Percentage", "shieldpercent", g_esSpecific.g_flShieldPercentage, value, -1.0, 1.0); + g_esSpecific.g_flShieldRate = flGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "ShieldRate", "Shield Rate", "Shield_Rate", "shieldrate", g_esSpecific.g_flShieldRate, value, -1.0, 1.0); + g_esSpecific.g_flPassiveDelay = flGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "PassiveDelay", "Passive Delay", "Passive_Delay", "passdelay", g_esSpecific.g_flPassiveDelay, value, -1.0, 99999.0); + g_esSpecific.g_iPassiveHealth = iGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "PassiveHealth", "Passive Health", "Passive_Health", "passhp", g_esSpecific.g_iPassiveHealth, value, MT_MAX_HEALTH_REDUCTION, MT_MAXHEALTH); + g_esSpecific.g_flPassiveInterval = flGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "PassiveInterval", "Passive Interval", "Passive_Interval", "passint", g_esSpecific.g_flPassiveInterval, value, -1.0, 99999.0); + g_esSpecific.g_iDisplayHealth = iGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "DisplayHealth", "Display Health", "Display_Health", "displayhp", g_esSpecific.g_iDisplayHealth, value, -1, 11); + g_esSpecific.g_iDisplayHealthType = iGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "DisplayHealthType", "Display Health Type", "Display_Health_Type", "displaytype", g_esSpecific.g_iDisplayHealthType, value, -1, 2); + g_esSpecific.g_flHealPercentMultiplier = flGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "HealthPercentageMultiplier", "Health Percentage Multiplier", "Health_Percentage_Multiplier", "hpmulti", g_esSpecific.g_flHealPercentMultiplier, value, -1.0, 99999.0); + g_esSpecific.g_iHumanMultiplierMode = iGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "HumanMultiplierMode", "Human Multiplier Mode", "Human_Multiplier_Mode", "humanmultimode", g_esSpecific.g_iHumanMultiplierMode, value, -1, 1); + g_esSpecific.g_iMinimumHumans = iGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "MinimumHumans", "Minimum Humans", "Minimum_Humans", "minhumans", g_esSpecific.g_iMinimumHumans, value, -1, 32); + g_esSpecific.g_iMultiplyHealth = iGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "MultiplyHealth", "Multiply Health", "Multiply_Health", "multihp", g_esSpecific.g_iMultiplyHealth, value, -1, 3); + g_esSpecific.g_iSpawnProtection = iGetKeyValue(subsection, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT2, key, "SpawnProtection", "Spawn Protection", "Spawn_Protection", "protect", g_esSpecific.g_iSpawnProtection, value, -1, 3); + g_esSpecific.g_flArmorDuration = flGetKeyValue(subsection, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT2, key, "ArmorDuration", "Armor Duration", "Armor_Duration", "armorduration", g_esSpecific.g_flArmorDuration, value, -1.0, 99999.0); + g_esSpecific.g_flArmorResistance[1] = flGetKeyValue(subsection, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT2, key, "ArmorResistance", "Armor Resistance", "Armor_Resistance", "armorres", g_esSpecific.g_flArmorResistance[1], value, -1.0, 1.0); + g_esSpecific.g_flShieldDuration = flGetKeyValue(subsection, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT2, key, "ShieldDuration", "Shield Duration", "Shield_Duration", "shieldduration", g_esSpecific.g_flShieldDuration, value, -1.0, 99999.0); + g_esSpecific.g_flShieldResistance = flGetKeyValue(subsection, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT2, key, "ShieldResistance", "Shield Resistance", "Shield_Resistance", "shieldres", g_esSpecific.g_flShieldResistance, value, -1.0, 1.0); + g_esSpecific.g_flAttackInterval = flGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "AttackInterval", "Attack Interval", "Attack_Interval", "attack", g_esSpecific.g_flAttackInterval, value, -1.0, 99999.0); + g_esSpecific.g_iAutoHop = iGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "BunnyHop", "Bunny Hop", "Bunny_Hop", "bhop", g_esSpecific.g_iAutoHop, value, -1, 1); + g_esSpecific.g_flClawDamage = flGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "ClawDamage", "Claw Damage", "Claw_Damage", "claw", g_esSpecific.g_flClawDamage, value, -2.0, 99999.0); + g_esSpecific.g_flHittableDamage = flGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "HittableDamage", "Hittable Damage", "Hittable_Damage", "hittable", g_esSpecific.g_flHittableDamage, value, -2.0, 99999.0); + g_esSpecific.g_flIncapDamageMultiplier = flGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "IncapDamageMultiplier", "Incap Damage Multiplier", "Incap_Damage_Multiplier", "incapdmgmulti", g_esSpecific.g_flIncapDamageMultiplier, value, -1.0, 99999.0); + g_esSpecific.g_iIntangibleBody = iGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "IntangibleBody", "Intangible Body", "Intangible_Body", "intangible", g_esSpecific.g_iIntangibleBody, value, -1, 1); + g_esSpecific.g_iMeleeHitMode = iGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "MeleeHitMode", "Melee Hit Mode", "Melee_Hit_Mode", "meleehit", g_esSpecific.g_iMeleeHitMode, value, -1, 2); + g_esSpecific.g_flMeleeHitValue = flGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "MeleeHitValue", "Melee Hit Value", "Melee_Hit_Value", "meleevalue", g_esSpecific.g_flMeleeHitValue, value, -1.0, 99999.0); + g_esSpecific.g_flPinDamage = flGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "PinDamage", "Pin Damage", "Pin_Damage", "pindmg", g_esSpecific.g_flPinDamage, value, -2.0, 99999.0); + g_esSpecific.g_flRunSpeed = flGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "RunSpeed", "Run Speed", "Run_Speed", "speed", g_esSpecific.g_flRunSpeed, value, -1.0, 99.0); + g_esSpecific.g_flSpecialInterval = flGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "SpecialInterval", "Special Interval", "Special_Interval", "specint", g_esSpecific.g_flSpecialInterval, value, -1.0, 99999.0); + g_esSpecific.g_iThrowRock = iGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "ThrowRock", "Throw Rock", "Throw_Rock", "throwrock", g_esSpecific.g_iThrowRock, value, -1, 1); + g_esSpecific.g_iBulletImmunity = iGetKeyValue(subsection, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE2, key, "BulletImmunity", "Bullet Immunity", "Bullet_Immunity", "bullet", g_esSpecific.g_iBulletImmunity, value, -1, 1); + g_esSpecific.g_iExplosiveImmunity = iGetKeyValue(subsection, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE2, key, "ExplosiveImmunity", "Explosive Immunity", "Explosive_Immunity", "explosive", g_esSpecific.g_iExplosiveImmunity, value, -1, 1); + g_esSpecific.g_iFireImmunity = iGetKeyValue(subsection, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE2, key, "FireImmunity", "Fire Immunity", "Fire_Immunity", "fire", g_esSpecific.g_iFireImmunity, value, -1, 1); + g_esSpecific.g_iHittableImmunity = iGetKeyValue(subsection, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE2, key, "HittableImmunity", "Hittable Immunity", "Hittable_Immunity", "hittable", g_esSpecific.g_iHittableImmunity, value, -1, 1); + g_esSpecific.g_iMeleeImmunity = iGetKeyValue(subsection, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE2, key, "MeleeImmunity", "Melee Immunity", "Melee_Immunity", "melee", g_esSpecific.g_iMeleeImmunity, value, -1, 1); + g_esSpecific.g_iVomitImmunity = iGetKeyValue(subsection, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE2, key, "VomitImmunity", "Vomit Immunity", "Vomit_Immunity", "vomit", g_esSpecific.g_iVomitImmunity, value, -1, 1); + + vGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "ArmorCharacters", "Armor Characters", "Armor_Characters", "armorchars", g_esSpecific.g_sArmorCharacters, sizeof esSpecific::g_sArmorCharacters, value); + vGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "HealthCharacters", "Health Characters", "Health_Characters", "hpchars", g_esSpecific.g_sHealthCharacters, sizeof esSpecific::g_sHealthCharacters, value); + vGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "ShieldCharacters", "Shield Characters", "Shield_Characters", "shieldchars", g_esSpecific.g_sShieldCharacters, sizeof esSpecific::g_sShieldCharacters, value); + + if (StrEqual(subsection, MT_CONFIG_SECTION_GENERAL, false)) { - char sValue[42], sSet[7][6]; - strcopy(sValue, sizeof sValue, value); - ReplaceString(sValue, sizeof sValue, " ", ""); - ExplodeString(sValue, ",", sSet, sizeof sSet, sizeof sSet[]); - for (int iPos = 0; iPos < (sizeof esSpecial::g_flComboTypeChance); iPos++) + if (StrEqual(key, "TypeRange", false) || StrEqual(key, "Type Range", false) || StrEqual(key, "Type_Range", false) || StrEqual(key, "types", false)) { - g_esSpecial[iIndex].g_flComboTypeChance[iPos] = (sSet[iPos][0] != '\0') ? flClamp(StringToFloat(sSet[iPos]), -1.0, 100.0) : g_esSpecial[iIndex].g_flComboTypeChance[iPos]; + char sValue[10], sRange[2][5]; + strcopy(sValue, sizeof sValue, value); + ReplaceString(sValue, sizeof sValue, " ", ""); + ExplodeString(sValue, "-", sRange, sizeof sRange, sizeof sRange[]); + + g_esSpecific.g_iMinType = (sRange[0][0] != '\0') ? iClamp(StringToInt(sRange[0]), -1, MT_MAXTYPES) : g_esSpecific.g_iMinType; + g_esSpecific.g_iMaxType = (sRange[1][0] != '\0') ? iClamp(StringToInt(sRange[1]), -1, MT_MAXTYPES) : g_esSpecific.g_iMaxType; } } - else + else if (StrEqual(subsection, MT_CONFIG_SECTION_CLASSES, false)) { - char sValue[140], sSet[10][14]; - strcopy(sValue, sizeof sValue, value); - ReplaceString(sValue, sizeof sValue, " ", ""); - ExplodeString(sValue, ",", sSet, sizeof sSet, sizeof sSet[]); - for (int iPos = 0; iPos < (sizeof esSpecial::g_flComboChance); iPos++) + if (g_esGeneral.g_alClassKeys[0] != null) { - if (StrEqual(key, "ComboRadius", false) || StrEqual(key, "Combo Radius", false) || StrEqual(key, "Combo_Radius", false) || StrEqual(key, "radius", false)) + g_esGeneral.g_alClassKeys[0].PushString(key); + } + + if (g_esGeneral.g_alClassKeys[1] != null) + { + g_esGeneral.g_alClassKeys[1].PushString(value); + } + } + else if (StrEqual(subsection, MT_CONFIG_SECTION_SURVIVORS, false)) + { + char sSpecSection[32]; + for (int iIndex = 0; iIndex < MT_MAXSURVIVORS; iIndex++) + { + switch (iIndex) { - char sRange[2][7], sSubset[14]; - strcopy(sSubset, sizeof sSubset, sSet[iPos]); - ReplaceString(sSubset, sizeof sSubset, " ", ""); - ExplodeString(sSubset, ";", sRange, sizeof sRange, sizeof sRange[]); + case 0: strcopy(sSpecSection, sizeof sSpecSection, (g_bSecondGame ? MT_CONFIG_SECTION_NICK : MT_CONFIG_SECTION_BILL)); + case 1: strcopy(sSpecSection, sizeof sSpecSection, (g_bSecondGame ? MT_CONFIG_SECTION_ROCHELLE : MT_CONFIG_SECTION_ZOEY)); + case 2: strcopy(sSpecSection, sizeof sSpecSection, (g_bSecondGame ? MT_CONFIG_SECTION_COACH : MT_CONFIG_SECTION_FRANCIS)); + case 3: strcopy(sSpecSection, sizeof sSpecSection, (g_bSecondGame ? MT_CONFIG_SECTION_ELLIS : MT_CONFIG_SECTION_LOUIS)); + case 4: strcopy(sSpecSection, sizeof sSpecSection, MT_CONFIG_SECTION_BILL); + case 5: strcopy(sSpecSection, sizeof sSpecSection, MT_CONFIG_SECTION_ZOEY); + case 6: strcopy(sSpecSection, sizeof sSpecSection, MT_CONFIG_SECTION_FRANCIS); + case 7: strcopy(sSpecSection, sizeof sSpecSection, MT_CONFIG_SECTION_LOUIS); + } + + if (StrContains(specsection, sSpecSection, false) != -1) + { + g_esSurvivor[iIndex].g_flCarrierChance = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "CarrierChance", "Carrier Chance", "Carrier_Chance", "cachance", g_esSurvivor[iIndex].g_flCarrierChance, value, -1.0, 100.0); + g_esSurvivor[iIndex].g_flCarrierDamageMultiplier = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "CarrierDamageMultiplier", "Carrier Damage Multiplier", "Carrier_Damage_Multiplier", "cadmgmulti", g_esSurvivor[iIndex].g_flCarrierDamageMultiplier, value, -1.0, 99999.0); + g_esSurvivor[iIndex].g_flCarrierDelay = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "CarrierDelay", "Carrier Delay", "Carrier_Delay", "cadelay", g_esSurvivor[iIndex].g_flCarrierDelay, value, -1.0, 99999.0); + g_esSurvivor[iIndex].g_flCarrierHealthMultiplier = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "CarrierHealthMultiplier", "Carrier Health Multiplier", "Carrier_Health_Multiplier", "cahpmulti", g_esSurvivor[iIndex].g_flCarrierHealthMultiplier, value, -1.0, 99999.0); + g_esSurvivor[iIndex].g_flCarrierVoiceChance = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "CarrierVoiceChance", "Carrier Voice Chance", "Carrier_Voice_Chance", "cavoicechance", g_esSurvivor[iIndex].g_flCarrierVoiceChance, value, -1.0, 100.0); + g_esSurvivor[iIndex].g_flCarrierVoiceInterval = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "CarrierVoiceInterval", "Carrier Voice Interval", "Carrier_Voice_Interval", "cavoiceint", g_esSurvivor[iIndex].g_flCarrierVoiceInterval, value, -1.0, 99999.0); + g_esSurvivor[iIndex].g_iCarrierEnabled = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "CarrierEnabled", "Carrier Enabled", "Carrier_Enabled", "caenabled", g_esSurvivor[iIndex].g_iCarrierEnabled, value, -1, 1); + g_esSurvivor[iIndex].g_iCarrierBots = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "CarrierBots", "Carrier Bots", "Carrier_Bots", "cabots", g_esSurvivor[iIndex].g_iCarrierBots, value, -1, 1); + g_esSurvivor[iIndex].g_iCarrierBody = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "CarrierBody", "Carrier Body", "Carrier_Body", "cabody", g_esSurvivor[iIndex].g_iCarrierBody, value, -1, 1); + g_esSurvivor[iIndex].g_iCarrierCleanse = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "CarrierCleanse", "Carrier Cleanse", "Carrier_Cleanse", "cacleanse", g_esSurvivor[iIndex].g_iCarrierCleanse, value, -1, 1); + g_esSurvivor[iIndex].g_iCarrierFilter = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "CarrierFilter", "Carrier Filter", "Carrier_Filter", "cafilter", g_esSurvivor[iIndex].g_iCarrierFilter, value, -1, 127); + g_esSurvivor[iIndex].g_iCarrierInfection = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "CarrierInfection", "Carrier Infection", "Carrier_Infection", "cainfect", g_esSurvivor[iIndex].g_iCarrierInfection, value, -1, 511); + g_esSurvivor[iIndex].g_iCarrierMix = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "CarrierMix", "Carrier Mix", "Carrier_Mix", "camix", g_esSurvivor[iIndex].g_iCarrierMix, value, -1, 1); + g_esSurvivor[iIndex].g_iCarrierMode = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "CarrierMode", "Carrier Mode", "Carrier_Mode", "camode", g_esSurvivor[iIndex].g_iCarrierMode, value, -1, 6); + g_esSurvivor[iIndex].g_iCarrierTeleport = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "CarrierTeleport", "Carrier Teleport", "Carrier_Teleport", "cateleport", g_esSurvivor[iIndex].g_iCarrierTeleport, value, -1, 1); + g_esSurvivor[iIndex].g_iCarrierVoice = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "CarrierVoice", "Carrier Voice", "Carrier_Voice", "cavoice", g_esSurvivor[iIndex].g_iCarrierVoice, value, -1, 1); + g_esSurvivor[iIndex].g_flActionDurationPassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "ActionDurationPassive", "Action Duration Passive", "Action_Duration_Passive", "actionduration", g_esSurvivor[iIndex].g_flActionDurationPassive, value, -1.0, 99999.0); + g_esSurvivor[iIndex].g_flAdrenalineTimePassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "AdrenalineTimePassive", "Adrenaline Time Passive", "Adrenaline_Time_Passive", "adrenaline", g_esSurvivor[iIndex].g_flAdrenalineTimePassive, value, -1.0, 99999.0); + g_esSurvivor[iIndex].g_flAttackBoostPassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "AttackBoostPassive", "Attack Boost Passive", "Attack_Boost_Passive", "attackboost", g_esSurvivor[iIndex].g_flAttackBoostPassive, value, -1.0, 99999.0); + g_esSurvivor[iIndex].g_flDamageBoostPassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "DamageBoostPassive", "Damage Boost Passive", "Damage_Boost_Passive", "dmgboost", g_esSurvivor[iIndex].g_flDamageBoostPassive, value, -1.0, 99999.0); + g_esSurvivor[iIndex].g_flDamageResistancePassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "DamageResistancePassive", "Damage Resistance Passive", "Damage_Resistance_Passive", "dmgres", g_esSurvivor[iIndex].g_flDamageResistancePassive, value, -1.0, 99999.0); + g_esSurvivor[iIndex].g_flDopamineRadiusPassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "DopamineRadiusPassive", "Dopamine Radius Passive", "Dopamine_Radius_Passive", "dopamine", g_esSurvivor[iIndex].g_flDopamineRadiusPassive, value, -1.0, 99999.0); + g_esSurvivor[iIndex].g_flFireRatePassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "FireRatePassive", "Fire Rate Passive", "Fire_Rate_Passive", "firerate", g_esSurvivor[iIndex].g_flFireRatePassive, value, -1.0, 99999.0); + g_esSurvivor[iIndex].g_flGrenadeLauncherPassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "GrenadeLauncherPassive", "Grenade Launcher Passive", "Grenade_Launcher_Passive", "grenade", g_esSurvivor[iIndex].g_flGrenadeLauncherPassive, value, -1.0, 100.0); + g_esSurvivor[iIndex].g_flHealPercentPassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "HealPercentPassive", "Heal Percent Passive", "Heal_Percent_Passive", "healpercent", g_esSurvivor[iIndex].g_flHealPercentPassive, value, -1.0, 100.0); + g_esSurvivor[iIndex].g_flHealthcareRadiusPassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "HealthcareRadiusPassive", "Healthcare Radius Passive", "Healthcare_Radius_Passive", "healthcare", g_esSurvivor[iIndex].g_flHealthcareRadiusPassive, value, -1.0, 99999.0); + g_esSurvivor[iIndex].g_flHeartbeatPassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "HeartbeatPassive", "Heartbeat Passive", "Heartbeat_Passive", "heartbeat", g_esSurvivor[iIndex].g_flHeartbeatPassive, value, -1.0, 99999.0); + g_esSurvivor[iIndex].g_flHollowpointAmmoPassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "HollowpointAmmoPassive", "Hollowpoint Ammo Passive", "Hollowpoint_Ammo_Passive", "hollowpoint", g_esSurvivor[iIndex].g_flHollowpointAmmoPassive, value, -1.0, 100.0); + g_esSurvivor[iIndex].g_flJumpHeightPassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "JumpHeightPassive", "Jump Height Passive", "Jump_Height_Passive", "jumpheight", g_esSurvivor[iIndex].g_flJumpHeightPassive, value, -1.0, 99999.0); + g_esSurvivor[iIndex].g_flLadyKillerPassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "LadyKillerPassive", "Lady Killer Passive", "Lady_Killer_Passive", "ladykiller", g_esSurvivor[iIndex].g_flLadyKillerPassive, value, -1.0, 100.0); + g_esSurvivor[iIndex].g_flLuckyBulletPassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "LuckyBulletPassive", "Lucky Bullet Passive", "Lucky_Bullet_Passive", "luckybullet", g_esSurvivor[iIndex].g_flLuckyBulletPassive, value, -1.0, 100.0); + g_esSurvivor[iIndex].g_flMotivationRadiusPassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "MotivationRadiusPassive", "Motivation Radius Passive", "Motivation_Radius_Passive", "motivation", g_esSurvivor[iIndex].g_flMotivationRadiusPassive, value, -1.0, 99999.0); + g_esSurvivor[iIndex].g_flOverdoseRadiusPassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "OverdoseRadiusPassive", "Overdose Radius Passive", "Overdose_Radius_Passive", "overdose", g_esSurvivor[iIndex].g_flOverdoseRadiusPassive, value, -1.0, 99999.0); + g_esSurvivor[iIndex].g_flPipeBombDurationPassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "PipebombDurationPassive", "Pipebomb Duration Passive", "Pipebomb_Duration_Passive", "pipeduration", g_esSurvivor[iIndex].g_flPipeBombDurationPassive, value, -1.0, 99999.0); + g_esSurvivor[iIndex].g_flPunchResistancePassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "PunchResistancePassive", "Punch Resistance Passive", "Punch_Resistance_Passive", "punchres", g_esSurvivor[iIndex].g_flPunchResistancePassive, value, -1.0, 99999.0); + g_esSurvivor[iIndex].g_flRapidPistolPassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "RapidPistolPassive", "Rapid Pistol Passive", "Rapid_Pistol_Passive", "rapidpistol", g_esSurvivor[iIndex].g_flRapidPistolPassive, value, -1.0, 1.0); + g_esSurvivor[iIndex].g_flRefillPercentPassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "RefillPercentPassive", "Refill Percent Passive", "Refill_Percent_Passive", "refillpercent", g_esSurvivor[iIndex].g_flRefillPercentPassive, value, -1.0, 100.0); + g_esSurvivor[iIndex].g_flReloadRatePassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "ReloadRatePassive", "Reload Rate Passive", "Reload_Rate_Passive", "reloadrate", g_esSurvivor[iIndex].g_flReloadRatePassive, value, -1.0, 99999.0); + g_esSurvivor[iIndex].g_flShockwaveRadiusPassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "ShockwaveRadiusPassive", "Shockwave Radius Passive", "Shockwave_Radius_Passive", "shockwave", g_esSurvivor[iIndex].g_flShockwaveRadiusPassive, value, -1.0, 99999.0); + g_esSurvivor[iIndex].g_flShoveDamagePassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "ShoveDamagePassive", "Shove Damage Passive", "Shove_Damage_Passive", "shovedmg", g_esSurvivor[iIndex].g_flShoveDamagePassive, value, -1.0, 99999.0); + g_esSurvivor[iIndex].g_flShoveRatePassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "ShoveRatePassive", "Shove Rate Passive", "Shove_Rate_Passive", "shoverate", g_esSurvivor[iIndex].g_flShoveRatePassive, value, -1.0, 99999.0); + g_esSurvivor[iIndex].g_flSledgehammerRoundsPassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "SledgehammerRoundsPassive", "Sledgehammer Rounds Passive", "Sledgehammer_Rounds_Passive", "sledgehammer", g_esSurvivor[iIndex].g_flSledgehammerRoundsPassive, value, -1.0, 100.0); + g_esSurvivor[iIndex].g_flSpeedBoostPassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "SpeedBoostPassive", "Speed Boost Passive", "Speed_Boost_Passive", "speedboost", g_esSurvivor[iIndex].g_flSpeedBoostPassive, value, -1.0, 99999.0); + g_esSurvivor[iIndex].g_flSupplierPassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "SupplierPassive", "Supplier Passive", "Supplier_Passive", "supplier", g_esSurvivor[iIndex].g_flSupplierPassive, value, -1.0, 99999.0); + g_esSurvivor[iIndex].g_flSwingRatePassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "SwingRatePassive", "Swing Rate Passive", "Swing_Rate_Passive", "swingrate", g_esSurvivor[iIndex].g_flSwingRatePassive, value, -1.0, 99999.0); + g_esSurvivor[iIndex].g_iPassiveEnabled = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "PassiveEnabled", "Passive Enabled", "Passive_Enabled", "psenabled", g_esSurvivor[iIndex].g_iPassiveEnabled, value, -2, 2147483647); + g_esSurvivor[iIndex].g_iPassiveBots = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "PassiveBots", "Passive Bots", "Passive_Bots", "psbots", g_esSurvivor[iIndex].g_iPassiveBots, value, -2, 2147483647); + g_esSurvivor[iIndex].g_iPassiveNotify = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "PassiveNotify", "Passive Notify", "Passive_Notify", "psnotify", g_esSurvivor[iIndex].g_iPassiveNotify, value, -1, 1); + g_esSurvivor[iIndex].g_iAmmoBoostPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "AmmoBoostPassive", "Ammo Boost Passive", "Ammo_Boost_Passive", "ammoboost", g_esSurvivor[iIndex].g_iAmmoBoostPassive, value, -1, 1); + g_esSurvivor[iIndex].g_iAmmoRefillPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "AmmoRefillPassive", "Ammo Refill Passive", "Ammo_Refill_Passive", "ammorefill", g_esSurvivor[iIndex].g_iAmmoRefillPassive, value, -1, 1); + g_esSurvivor[iIndex].g_iAmmoRegenPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "AmmoRegenPassive", "Ammo Regen Passive", "Ammo_Regen_Passive", "ammoregen", g_esSurvivor[iIndex].g_iAmmoRegenPassive, value, -1, 99999); + g_esSurvivor[iIndex].g_iBlazeHealthPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "BlazeHealthPassive", "Blaze Health Passive", "Blaze_Health_Passive", "blaze", g_esSurvivor[iIndex].g_iBlazeHealthPassive, value, -1, MT_MAXHEALTH); + g_esSurvivor[iIndex].g_iBloodDonorPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "BloodDonorPassive", "Blood Donor Passive", "Blood_Donor_Passive", "donor", g_esSurvivor[iIndex].g_iBloodDonorPassive, value, -1, MT_MAXHEALTH); + g_esSurvivor[iIndex].g_iBunnyHopPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "BunnyHopPassive", "Bunny Hop Passive", "Bunny_Hop_Passive", "bhop", g_esSurvivor[iIndex].g_iBunnyHopPassive, value, -1, 1); + g_esSurvivor[iIndex].g_iBurstDoorsPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "BurstDoorsPassive", "Burst Doors Passive", "Burst_Doors_Passive", "burstdoors", g_esSurvivor[iIndex].g_iBurstDoorsPassive, value, -1, 1); + g_esSurvivor[iIndex].g_iCleanKillsPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "CleanKillsPassive", "Clean Kills Passive", "Clean_Kills_Passive", "cleankills", g_esSurvivor[iIndex].g_iCleanKillsPassive, value, -1, 1); + g_esSurvivor[iIndex].g_iClusterBombsPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "ClusterBombsPassive", "Cluster Bombs Passive", "Cluster_Bombs_Passive", "cluster", g_esSurvivor[iIndex].g_iClusterBombsPassive, value, -1, 5); + g_esSurvivor[iIndex].g_iEternalFlamesPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "EternalFlamesPassive", "Eternal Flames Passive", "Eternal_Flames_Passive", "eternal", g_esSurvivor[iIndex].g_iEternalFlamesPassive, value, -1, 1); + g_esSurvivor[iIndex].g_iFastRecoveryPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "FastRecoveryPassive", "Fast Recovery Passive", "Fast_Recovery_Passive", "fastrecovery", g_esSurvivor[iIndex].g_iFastRecoveryPassive, value, -1, 1); + g_esSurvivor[iIndex].g_iFriendlyFirePassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "FriendlyFirePassive", "Friendly Fire Passive", "Friendly_Fire_Passive", "friendlyfire", g_esSurvivor[iIndex].g_iFriendlyFirePassive, value, -1, 1); + g_esSurvivor[iIndex].g_iGhostBulletsPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "GhostBulletsPassive", "Ghost Bullets Passive", "Ghost_Bullets_Passive", "ghost", g_esSurvivor[iIndex].g_iGhostBulletsPassive, value, -1, 1); + g_esSurvivor[iIndex].g_iHealthRegenPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "HealthRegenPassive", "Health Regen Passive", "Health_Regen_Passive", "hpregen", g_esSurvivor[iIndex].g_iHealthRegenPassive, value, -1, MT_MAXHEALTH); + g_esSurvivor[iIndex].g_iInfiniteAmmoPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "InfiniteAmmoPassive", "Infinite Ammo Passive", "Infinite_Ammo_Passive", "infammo", g_esSurvivor[iIndex].g_iInfiniteAmmoPassive, value, -1, 31); + g_esSurvivor[iIndex].g_iLadderActionsPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "LadderActionsPassive", "Ladder Actions Passive", "Ladder_Action_Passive", "ladderacts", g_esSurvivor[iIndex].g_iLadderActionsPassive, value, -1, 1); + g_esSurvivor[iIndex].g_iLaserSightPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "LaserSightPassive", "Laser Sight Passive", "Laser_Sight_Passive", "lasersight", g_esSurvivor[iIndex].g_iLaserSightPassive, value, -1, 1); + g_esSurvivor[iIndex].g_iLifeLeechPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "LifeLeechPassive", "Life Leech Passive", "Life_Leech_Passive", "lifeleech", g_esSurvivor[iIndex].g_iLifeLeechPassive, value, -1, MT_MAXHEALTH); + g_esSurvivor[iIndex].g_iMedicalCutsPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "MedicalCutsPassive", "Medical Cuts Passive", "Medical_Cuts_Passive", "medcuts", g_esSurvivor[iIndex].g_iMedicalCutsPassive, value, -1, MT_MAXHEALTH); + g_esSurvivor[iIndex].g_iMeleeRangePassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "MeleeRangePassive", "Melee Range Passive", "Melee_Range_Passive", "meleerange", g_esSurvivor[iIndex].g_iMeleeRangePassive, value, -1, 99999); + g_esSurvivor[iIndex].g_iMidairDashesPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "MidairDashesPassive", "Midair Dashes Passive", "Midair_Dashes_Passive", "middash", g_esSurvivor[iIndex].g_iMidairDashesPassive, value, -1, 99999); + g_esSurvivor[iIndex].g_iOverhealthPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "OverhealthPassive", "Overhealth Passive", "Overhealth_Passive", "overhealth", g_esSurvivor[iIndex].g_iOverhealthPassive, value, -1, MT_MAXHEALTH); + g_esSurvivor[iIndex].g_iRecoilDampenerPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "RecoilDampenerPassive", "Recoil Dampener Passive", "Recoil_Dampener_Passive", "recoil", g_esSurvivor[iIndex].g_iRecoilDampenerPassive, value, -1, 1); + g_esSurvivor[iIndex].g_iRegenBurstsPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "RegenBurstsPassive", "Regen Bursts Passive", "Regen_Bursts_Passive", "regbursts", g_esSurvivor[iIndex].g_iRegenBurstsPassive, value, -1, MT_MAXHEALTH); + g_esSurvivor[iIndex].g_iRespawnLoadoutPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "RespawnLoadoutPassive", "Respawn Loadout Passive", "Respawn_Loadout_Passive", "resloadout", g_esSurvivor[iIndex].g_iRespawnLoadoutPassive, value, -1, 1); + g_esSurvivor[iIndex].g_iReviveHealthPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "ReviveHealthPassive", "Revive Health Passive", "Revive_Health_Passive", "revivehp", g_esSurvivor[iIndex].g_iReviveHealthPassive, value, -1, MT_MAXHEALTH); + g_esSurvivor[iIndex].g_iRiotGearPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "RiotGearPassive", "Riot Gear Passive", "Riot_Gear_Passive", "riotgear", g_esSurvivor[iIndex].g_iRiotGearPassive, value, -1, 1); + g_esSurvivor[iIndex].g_iSafetyBubblePassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "SafetyBubblePassive", "Safety Bubble Passive", "Safety_Bubble_Passive", "safetybubble", g_esSurvivor[iIndex].g_iSafetyBubblePassive, value, -1, 1); + g_esSurvivor[iIndex].g_iShovePenaltyPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "ShovePenaltyPassive", "Shove Penalty Passive", "Shove_Penalty_Passive", "shovepenalty", g_esSurvivor[iIndex].g_iShovePenaltyPassive, value, -1, 1); + g_esSurvivor[iIndex].g_iSpecialAmmoPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "SpecialAmmoPassive", "Special Ammo Passive", "Special_Ammo_Passive", "specammo", g_esSurvivor[iIndex].g_iSpecialAmmoPassive, value, -1, 3); + g_esSurvivor[iIndex].g_iStickyGrenadesPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "StickyGrenadesPassive", "Sticky Grenades Passive", "Sticky_Grenades_Passive", "sticky", g_esSurvivor[iIndex].g_iStickyGrenadesPassive, value, -1, 1); + g_esSurvivor[iIndex].g_iSyringeDartsPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "SyringeDartsPassive", "Syringe Darts Passive", "Syringe_Darts_Passive", "syringe", g_esSurvivor[iIndex].g_iSyringeDartsPassive, value, -1, MT_MAXHEALTH); + g_esSurvivor[iIndex].g_iThornsPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "ThornsPassive", "Thorns Passive", "Thorns_Passive", "thorns", g_esSurvivor[iIndex].g_iThornsPassive, value, -1, 1); + + vGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "CarrierAttackVoicelines", "Carrier Attack Voicelines", "Carrier_Attack_Voicelines", "caattacklines", g_esSurvivor[iIndex].g_sCarrierAttackVoicelines, sizeof esSurvivor::g_sCarrierAttackVoicelines, value); + vGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "CarrierBaitVoicelines", "Carrier Bait Voicelines", "Carrier_Bait_Voicelines", "cabaitlines", g_esSurvivor[iIndex].g_sCarrierBaitVoicelines, sizeof esSurvivor::g_sCarrierBaitVoicelines, value); + vGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "ItemPassive", "Item Passive", "Item_Passive", "item", g_esSurvivor[iIndex].g_sItemPassive, sizeof esSurvivor::g_sItemPassive, value); + + if (StrEqual(key, "CarrierType", false) || StrEqual(key, "Carrier Type", false) || StrEqual(key, "Carrier_Type", false) || StrEqual(key, "catype", false)) + { + char sValue[10], sRange[2][5]; + strcopy(sValue, sizeof sValue, value); + ReplaceString(sValue, sizeof sValue, " ", ""); + ExplodeString(sValue, "-", sRange, sizeof sRange, sizeof sRange[]); - g_esSpecial[iIndex].g_flComboMinRadius[iPos] = (sRange[0][0] != '\0') ? flClamp(StringToFloat(sRange[0]), -200.0, 1.0) : g_esSpecial[iIndex].g_flComboMinRadius[iPos]; - g_esSpecial[iIndex].g_flComboMaxRadius[iPos] = (sRange[1][0] != '\0') ? flClamp(StringToFloat(sRange[1]), -1.0, 200.0) : g_esSpecial[iIndex].g_flComboMaxRadius[iPos]; + g_esSurvivor[iIndex].g_iCarrierMinType = (sRange[0][0] != '\0') ? iClamp(StringToInt(sRange[0]), -1, MT_MAXTYPES) : g_esSurvivor[iIndex].g_iCarrierMinType; + g_esSurvivor[iIndex].g_iCarrierMaxType = (sRange[1][0] != '\0') ? iClamp(StringToInt(sRange[1]), -1, MT_MAXTYPES) : g_esSurvivor[iIndex].g_iCarrierMaxType; + } } - else + } +#if defined _WeaponHandling_included + strcopy(sSpecSection, sizeof sSpecSection, specsection); + if (StrContains(sSpecSection, MT_CONFIG_SECTION_WEAPON, false) == 0) + { + int iWeaponIndex = view_as(GetWeaponTypeFromClassname(sSpecSection)), iIndex = (iWeaponIndex > 0) ? iWeaponIndex : -1; + if (iIndex > 0) { - g_esSpecial[iIndex].g_flComboChance[iPos] = flGetClampedValue(key, "ComboChance", "Combo Chance", "Combo_Chance", "chance", g_esSpecial[iIndex].g_flComboChance[iPos], sSet[iPos], -1.0, 100.0); - g_esSpecial[iIndex].g_iComboCooldown[iPos] = iGetClampedValue(key, "ComboCooldown", "Combo Cooldown", "Combo_Cooldown", "cooldown", g_esSpecial[iIndex].g_iComboCooldown[iPos], sSet[iPos], -1, 99999); - g_esSpecial[iIndex].g_flComboDamage[iPos] = flGetClampedValue(key, "ComboDamage", "Combo Damage", "Combo_Damage", "damage", g_esSpecial[iIndex].g_flComboDamage[iPos], sSet[iPos], -1.0, 99999.0); - g_esSpecial[iIndex].g_flComboDeathChance[iPos] = flGetClampedValue(key, "ComboDeathChance", "Combo Death Chance", "Combo_Death_Chance", "deathchance", g_esSpecial[iIndex].g_flComboDeathChance[iPos], sSet[iPos], -1.0, 100.0); - g_esSpecial[iIndex].g_flComboDeathRange[iPos] = flGetClampedValue(key, "ComboDeathRange", "Combo Death Range", "Combo_Death_Range", "deathrange", g_esSpecial[iIndex].g_flComboDeathRange[iPos], sSet[iPos], -1.0, 99999.0); - g_esSpecial[iIndex].g_flComboDelay[iPos] = flGetClampedValue(key, "ComboDelay", "Combo Delay", "Combo_Delay", "delay", g_esSpecial[iIndex].g_flComboDelay[iPos], sSet[iPos], -1.0, 99999.0); - g_esSpecial[iIndex].g_flComboDuration[iPos] = flGetClampedValue(key, "ComboDuration", "Combo Duration", "Combo_Duration", "duration", g_esSpecial[iIndex].g_flComboDuration[iPos], sSet[iPos], -1.0, 99999.0); - g_esSpecial[iIndex].g_flComboInterval[iPos] = flGetClampedValue(key, "ComboInterval", "Combo Interval", "Combo_Interval", "interval", g_esSpecial[iIndex].g_flComboInterval[iPos], sSet[iPos], -1.0, 99999.0); - g_esSpecial[iIndex].g_flComboRange[iPos] = flGetClampedValue(key, "ComboRange", "Combo Range", "Combo_Range", "range", g_esSpecial[iIndex].g_flComboRange[iPos], sSet[iPos], -1.0, 99999.0); - g_esSpecial[iIndex].g_flComboRangeChance[iPos] = flGetClampedValue(key, "ComboRangeChance", "Combo Range Chance", "Combo_Range_Chance", "rangechance", g_esSpecial[iIndex].g_flComboRangeChance[iPos], sSet[iPos], -1.0, 100.0); - g_esSpecial[iIndex].g_iComboRangeCooldown[iPos] = iGetClampedValue(key, "ComboRangeCooldown", "Combo Range Cooldown", "Combo_Range_Cooldown", "rangecooldown", g_esSpecial[iIndex].g_iComboRangeCooldown[iPos], sSet[iPos], -1, 99999); - g_esSpecial[iIndex].g_flComboRockChance[iPos] = flGetClampedValue(key, "ComboRockChance", "Combo Rock Chance", "Combo_Rock_Chance", "rockchance", g_esSpecial[iIndex].g_flComboRockChance[iPos], sSet[iPos], -1.0, 100.0); - g_esSpecial[iIndex].g_iComboRockCooldown[iPos] = iGetClampedValue(key, "ComboRockCooldown", "Combo Rock Cooldown", "Combo_Rock_Cooldown", "rockcooldown", g_esSpecial[iIndex].g_iComboRockCooldown[iPos], sSet[iPos], -1, 99999); - g_esSpecial[iIndex].g_flComboSpeed[iPos] = flGetClampedValue(key, "ComboSpeed", "Combo Speed", "Combo_Speed", "speed", g_esSpecial[iIndex].g_flComboSpeed[iPos], sSet[iPos], -1.0, 99999.0); + g_esWeapon[iIndex].g_iWeaponIndex = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "WeaponIndex", "Weapon Index", "Weapon_Index", "weaponid", g_esWeapon[iIndex].g_iWeaponIndex, value, -1, 400); + if (g_esWeapon[iIndex].g_iWeaponIndex > 0) + { + iIndex = (g_esWeapon[iIndex].g_iWeaponIndex + 100); + g_esWeapon[iIndex].g_iWeaponIndex = iIndex; + if (!StrEqual(sSpecSection, "weapon_melee", false)) + { + strcopy(g_esWeapon[iIndex].g_sWeaponName, sizeof esWeapon::g_sWeaponName, sSpecSection); + } + + if (g_esGeneral.g_iMaxWeapons < iIndex) + { + g_esGeneral.g_iMaxWeapons = iIndex; + } + } + + g_esWeapon[iIndex].g_iWeaponIndex = iIndex; + g_esWeapon[iIndex].g_iWeaponCharacter = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "WeaponCharacter", "Weapon Character", "Weapon_Character", "weaponchar", g_esWeapon[iIndex].g_iWeaponCharacter, value, -1, 7); + g_esWeapon[iIndex].g_flActionDurationPassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "ActionDurationPassive", "Action Duration Passive", "Action_Duration_Passive", "actionduration", g_esWeapon[iIndex].g_flActionDurationPassive, value, -1.0, 99999.0); + g_esWeapon[iIndex].g_flAdrenalineTimePassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "AdrenalineTimePassive", "Adrenaline Time Passive", "Adrenaline_Time_Passive", "adrenaline", g_esWeapon[iIndex].g_flAdrenalineTimePassive, value, -1.0, 99999.0); + g_esWeapon[iIndex].g_flAttackBoostPassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "AttackBoostPassive", "Attack Boost Passive", "Attack_Boost_Passive", "attackboost", g_esWeapon[iIndex].g_flAttackBoostPassive, value, -1.0, 99999.0); + g_esWeapon[iIndex].g_flDamageBoostPassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "DamageBoostPassive", "Damage Boost Passive", "Damage_Boost_Passive", "dmgboost", g_esWeapon[iIndex].g_flDamageBoostPassive, value, -1.0, 99999.0); + g_esWeapon[iIndex].g_flDamageResistancePassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "DamageResistancePassive", "Damage Resistance Passive", "Damage_Resistance_Passive", "dmgres", g_esWeapon[iIndex].g_flDamageResistancePassive, value, -1.0, 99999.0); + g_esWeapon[iIndex].g_flDopamineRadiusPassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "DopamineRadiusPassive", "Dopamine Radius Passive", "Dopamine_Radius_Passive", "dopamine", g_esWeapon[iIndex].g_flDopamineRadiusPassive, value, -1.0, 99999.0); + g_esWeapon[iIndex].g_flFireRatePassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "FireRatePassive", "Fire Rate Passive", "Fire_Rate_Passive", "firerate", g_esWeapon[iIndex].g_flFireRatePassive, value, -1.0, 99999.0); + g_esWeapon[iIndex].g_flGrenadeLauncherPassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "GrenadeLauncherPassive", "Grenade Launcher Passive", "Grenade_Launcher_Passive", "grenade", g_esWeapon[iIndex].g_flGrenadeLauncherPassive, value, -1.0, 100.0); + g_esWeapon[iIndex].g_flHealPercentPassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "HealPercentPassive", "Heal Percent Passive", "Heal_Percent_Passive", "healpercent", g_esWeapon[iIndex].g_flHealPercentPassive, value, -1.0, 100.0); + g_esWeapon[iIndex].g_flHealthcareRadiusPassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "HealthcareRadiusPassive", "Healthcare Radius Passive", "Healthcare_Radius_Passive", "healthcare", g_esWeapon[iIndex].g_flHealthcareRadiusPassive, value, -1.0, 99999.0); + g_esWeapon[iIndex].g_flHeartbeatPassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "HeartbeatPassive", "Heartbeat Passive", "Heartbeat_Passive", "heartbeat", g_esWeapon[iIndex].g_flHeartbeatPassive, value, -1.0, 99999.0); + g_esWeapon[iIndex].g_flHollowpointAmmoPassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "HollowpointAmmoPassive", "Hollowpoint Ammo Passive", "Hollowpoint_Ammo_Passive", "hollowpoint", g_esWeapon[iIndex].g_flHollowpointAmmoPassive, value, -1.0, 100.0); + g_esWeapon[iIndex].g_flJumpHeightPassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "JumpHeightPassive", "Jump Height Passive", "Jump_Height_Passive", "jumpheight", g_esWeapon[iIndex].g_flJumpHeightPassive, value, -1.0, 99999.0); + g_esWeapon[iIndex].g_flLadyKillerPassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "LadyKillerPassive", "Lady Killer Passive", "Lady_Killer_Passive", "ladykiller", g_esWeapon[iIndex].g_flLadyKillerPassive, value, -1.0, 100.0); + g_esWeapon[iIndex].g_flLuckyBulletPassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "LuckyBulletPassive", "Lucky Bullet Passive", "Lucky_Bullet_Passive", "luckybullet", g_esWeapon[iIndex].g_flLuckyBulletPassive, value, -1.0, 100.0); + g_esWeapon[iIndex].g_flMotivationRadiusPassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "MotivationRadiusPassive", "Motivation Radius Passive", "Motivation_Radius_Passive", "motivation", g_esWeapon[iIndex].g_flMotivationRadiusPassive, value, -1.0, 99999.0); + g_esWeapon[iIndex].g_flOverdoseRadiusPassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "OverdoseRadiusPassive", "Overdose Radius Passive", "Overdose_Radius_Passive", "overdose", g_esWeapon[iIndex].g_flOverdoseRadiusPassive, value, -1.0, 99999.0); + g_esWeapon[iIndex].g_flPipeBombDurationPassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "PipebombDurationPassive", "Pipebomb Duration Passive", "Pipebomb_Duration_Passive", "pipeduration", g_esWeapon[iIndex].g_flPipeBombDurationPassive, value, -1.0, 99999.0); + g_esWeapon[iIndex].g_flPunchResistancePassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "PunchResistancePassive", "Punch Resistance Passive", "Punch_Resistance_Passive", "punchres", g_esWeapon[iIndex].g_flPunchResistancePassive, value, -1.0, 99999.0); + g_esWeapon[iIndex].g_flRapidPistolPassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "RapidPistolPassive", "Rapid Pistol Passive", "Rapid_Pistol_Passive", "rapidpistol", g_esWeapon[iIndex].g_flRapidPistolPassive, value, -1.0, 1.0); + g_esWeapon[iIndex].g_flRefillPercentPassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "RefillPercentPassive", "Refill Percent Passive", "Refill_Percent_Passive", "refillpercent", g_esWeapon[iIndex].g_flRefillPercentPassive, value, -1.0, 100.0); + g_esWeapon[iIndex].g_flReloadRatePassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "ReloadRatePassive", "Reload Rate Passive", "Reload_Rate_Passive", "reloadrate", g_esWeapon[iIndex].g_flReloadRatePassive, value, -1.0, 99999.0); + g_esWeapon[iIndex].g_flShockwaveRadiusPassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "ShockwaveRadiusPassive", "Shockwave Radius Passive", "Shockwave_Radius_Passive", "shockwave", g_esWeapon[iIndex].g_flShockwaveRadiusPassive, value, -1.0, 99999.0); + g_esWeapon[iIndex].g_flShoveDamagePassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "ShoveDamagePassive", "Shove Damage Passive", "Shove_Damage_Passive", "shovedmg", g_esWeapon[iIndex].g_flShoveDamagePassive, value, -1.0, 99999.0); + g_esWeapon[iIndex].g_flShoveRatePassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "ShoveRatePassive", "Shove Rate Passive", "Shove_Rate_Passive", "shoverate", g_esWeapon[iIndex].g_flShoveRatePassive, value, -1.0, 99999.0); + g_esWeapon[iIndex].g_flSledgehammerRoundsPassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "SledgehammerRoundsPassive", "Sledgehammer Rounds Passive", "Sledgehammer_Rounds_Passive", "sledgehammer", g_esWeapon[iIndex].g_flSledgehammerRoundsPassive, value, -1.0, 100.0); + g_esWeapon[iIndex].g_flSpeedBoostPassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "SpeedBoostPassive", "Speed Boost Passive", "Speed_Boost_Passive", "speedboost", g_esWeapon[iIndex].g_flSpeedBoostPassive, value, -1.0, 99999.0); + g_esWeapon[iIndex].g_flSupplierPassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "SupplierPassive", "Supplier Passive", "Supplier_Passive", "supplier", g_esWeapon[iIndex].g_flSupplierPassive, value, -1.0, 99999.0); + g_esWeapon[iIndex].g_flSwingRatePassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "SwingRatePassive", "Swing Rate Passive", "Swing_Rate_Passive", "swingrate", g_esWeapon[iIndex].g_flSwingRatePassive, value, -1.0, 99999.0); + g_esWeapon[iIndex].g_iPassiveEnabled = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "PassiveEnabled", "Passive Enabled", "Passive_Enabled", "psenabled", g_esWeapon[iIndex].g_iPassiveEnabled, value, -2, 2147483647); + g_esWeapon[iIndex].g_iPassiveBots = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "PassiveBots", "Passive Bots", "Passive_Bots", "psbots", g_esWeapon[iIndex].g_iPassiveBots, value, -2, 2147483647); + g_esWeapon[iIndex].g_iPassiveNotify = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "PassiveNotify", "Passive Notify", "Passive_Notify", "psnotify", g_esWeapon[iIndex].g_iPassiveNotify, value, -1, 1); + g_esWeapon[iIndex].g_iStackPassives = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "StackPassives", "Stack Passives", "Stack_Passives", "psstack", g_esWeapon[iIndex].g_iStackPassives, value, -2, 2147483647); + g_esWeapon[iIndex].g_iAmmoBoostPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "AmmoBoostPassive", "Ammo Boost Passive", "Ammo_Boost_Passive", "ammoboost", g_esWeapon[iIndex].g_iAmmoBoostPassive, value, -1, 1); + g_esWeapon[iIndex].g_iAmmoRefillPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "AmmoRefillPassive", "Ammo Refill Passive", "Ammo_Refill_Passive", "ammorefill", g_esWeapon[iIndex].g_iAmmoRefillPassive, value, -1, 1); + g_esWeapon[iIndex].g_iAmmoRegenPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "AmmoRegenPassive", "Ammo Regen Passive", "Ammo_Regen_Passive", "ammoregen", g_esWeapon[iIndex].g_iAmmoRegenPassive, value, -1, 99999); + g_esWeapon[iIndex].g_iBlazeHealthPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "BlazeHealthPassive", "Blaze Health Passive", "Blaze_Health_Passive", "blaze", g_esWeapon[iIndex].g_iBlazeHealthPassive, value, -1, MT_MAXHEALTH); + g_esWeapon[iIndex].g_iBloodDonorPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "BloodDonorPassive", "Blood Donor Passive", "Blood_Donor_Passive", "donor", g_esWeapon[iIndex].g_iBloodDonorPassive, value, -1, MT_MAXHEALTH); + g_esWeapon[iIndex].g_iBunnyHopPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "BunnyHopPassive", "Bunny Hop Passive", "Bunny_Hop_Passive", "bhop", g_esWeapon[iIndex].g_iBunnyHopPassive, value, -1, 1); + g_esWeapon[iIndex].g_iBurstDoorsPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "BurstDoorsPassive", "Burst Doors Passive", "Burst_Doors_Passive", "burstdoors", g_esWeapon[iIndex].g_iBurstDoorsPassive, value, -1, 1); + g_esWeapon[iIndex].g_iCleanKillsPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "CleanKillsPassive", "Clean Kills Passive", "Clean_Kills_Passive", "cleankills", g_esWeapon[iIndex].g_iCleanKillsPassive, value, -1, 1); + g_esWeapon[iIndex].g_iClusterBombsPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "ClusterBombsPassive", "Cluster Bombs Passive", "Cluster_Bombs_Passive", "cluster", g_esWeapon[iIndex].g_iClusterBombsPassive, value, -1, 5); + g_esWeapon[iIndex].g_iEternalFlamesPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "EternalFlamesPassive", "Eternal Flames Passive", "Eternal_Flames_Passive", "eternal", g_esWeapon[iIndex].g_iEternalFlamesPassive, value, -1, 1); + g_esWeapon[iIndex].g_iFastRecoveryPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "FastRecoveryPassive", "Fast Recovery Passive", "Fast_Recovery_Passive", "fastrecovery", g_esWeapon[iIndex].g_iFastRecoveryPassive, value, -1, 1); + g_esWeapon[iIndex].g_iFriendlyFirePassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "FriendlyFirePassive", "Friendly Fire Passive", "Friendly_Fire_Passive", "friendlyfire", g_esWeapon[iIndex].g_iFriendlyFirePassive, value, -1, 1); + g_esWeapon[iIndex].g_iGhostBulletsPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "GhostBulletsPassive", "Ghost Bullets Passive", "Ghost_Bullets_Passive", "ghost", g_esWeapon[iIndex].g_iGhostBulletsPassive, value, -1, 1); + g_esWeapon[iIndex].g_iHealthRegenPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "HealthRegenPassive", "Health Regen Passive", "Health_Regen_Passive", "hpregen", g_esWeapon[iIndex].g_iHealthRegenPassive, value, -1, MT_MAXHEALTH); + g_esWeapon[iIndex].g_iInfiniteAmmoPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "InfiniteAmmoPassive", "Infinite Ammo Passive", "Infinite_Ammo_Passive", "infammo", g_esWeapon[iIndex].g_iInfiniteAmmoPassive, value, -1, 31); + g_esWeapon[iIndex].g_iLadderActionsPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "LadderActionsPassive", "Ladder Actions Passive", "Ladder_Action_Passive", "ladderacts", g_esWeapon[iIndex].g_iLadderActionsPassive, value, -1, 1); + g_esWeapon[iIndex].g_iLaserSightPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "LaserSightPassive", "Laser Sight Passive", "Laser_Sight_Passive", "lasersight", g_esWeapon[iIndex].g_iLaserSightPassive, value, -1, 1); + g_esWeapon[iIndex].g_iLifeLeechPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "LifeLeechPassive", "Life Leech Passive", "Life_Leech_Passive", "lifeleech", g_esWeapon[iIndex].g_iLifeLeechPassive, value, -1, MT_MAXHEALTH); + g_esWeapon[iIndex].g_iMedicalCutsPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "MedicalCutsPassive", "Medical Cuts Passive", "Medical_Cuts_Passive", "medcuts", g_esWeapon[iIndex].g_iMedicalCutsPassive, value, -1, MT_MAXHEALTH); + g_esWeapon[iIndex].g_iMeleeRangePassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "MeleeRangePassive", "Melee Range Passive", "Melee_Range_Passive", "meleerange", g_esWeapon[iIndex].g_iMeleeRangePassive, value, -1, 99999); + g_esWeapon[iIndex].g_iMidairDashesPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "MidairDashesPassive", "Midair Dashes Passive", "Midair_Dashes_Passive", "middash", g_esWeapon[iIndex].g_iMidairDashesPassive, value, -1, 99999); + g_esWeapon[iIndex].g_iOverhealthPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "OverhealthPassive", "Overhealth Passive", "Overhealth_Passive", "overhealth", g_esWeapon[iIndex].g_iOverhealthPassive, value, -1, MT_MAXHEALTH); + g_esWeapon[iIndex].g_iRecoilDampenerPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "RecoilDampenerPassive", "Recoil Dampener Passive", "Recoil_Dampener_Passive", "recoil", g_esWeapon[iIndex].g_iRecoilDampenerPassive, value, -1, 1); + g_esWeapon[iIndex].g_iRegenBurstsPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "RegenBurstsPassive", "Regen Bursts Passive", "Regen_Bursts_Passive", "regbursts", g_esWeapon[iIndex].g_iRegenBurstsPassive, value, -1, MT_MAXHEALTH); + g_esWeapon[iIndex].g_iRespawnLoadoutPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "RespawnLoadoutPassive", "Respawn Loadout Passive", "Respawn_Loadout_Passive", "resloadout", g_esWeapon[iIndex].g_iRespawnLoadoutPassive, value, -1, 1); + g_esWeapon[iIndex].g_iReviveHealthPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "ReviveHealthPassive", "Revive Health Passive", "Revive_Health_Passive", "revivehp", g_esWeapon[iIndex].g_iReviveHealthPassive, value, -1, MT_MAXHEALTH); + g_esWeapon[iIndex].g_iRiotGearPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "RiotGearPassive", "Riot Gear Passive", "Riot_Gear_Passive", "riotgear", g_esWeapon[iIndex].g_iRiotGearPassive, value, -1, 1); + g_esWeapon[iIndex].g_iSafetyBubblePassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "SafetyBubblePassive", "Safety Bubble Passive", "Safety_Bubble_Passive", "safetybubble", g_esWeapon[iIndex].g_iSafetyBubblePassive, value, -1, 1); + g_esWeapon[iIndex].g_iShovePenaltyPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "ShovePenaltyPassive", "Shove Penalty Passive", "Shove_Penalty_Passive", "shovepenalty", g_esWeapon[iIndex].g_iShovePenaltyPassive, value, -1, 1); + g_esWeapon[iIndex].g_iSpecialAmmoPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "SpecialAmmoPassive", "Special Ammo Passive", "Special_Ammo_Passive", "specammo", g_esWeapon[iIndex].g_iSpecialAmmoPassive, value, -1, 3); + g_esWeapon[iIndex].g_iStickyGrenadesPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "StickyGrenadesPassive", "Sticky Grenades Passive", "Sticky_Grenades_Passive", "sticky", g_esWeapon[iIndex].g_iStickyGrenadesPassive, value, -1, 1); + g_esWeapon[iIndex].g_iSyringeDartsPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "SyringeDartsPassive", "Syringe Darts Passive", "Syringe_Darts_Passive", "syringe", g_esWeapon[iIndex].g_iSyringeDartsPassive, value, -1, MT_MAXHEALTH); + g_esWeapon[iIndex].g_iThornsPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "ThornsPassive", "Thorns Passive", "Thorns_Passive", "thorns", g_esWeapon[iIndex].g_iThornsPassive, value, -1, 1); + + vGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "ItemPassive", "Item Passive", "Item_Passive", "item", g_esWeapon[iIndex].g_sItemPassive, sizeof esWeapon::g_sItemPassive, value); + vGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "WeaponName", "Weapon Name", "Weapon_Name", "weaponname", g_esWeapon[iIndex].g_sWeaponName, sizeof esWeapon::g_sWeaponName, value); } } +#endif } - } - else if (StrEqual(subsection, MT_CONFIG_SECTION_TRANSFORM, false)) - { - if (StrEqual(key, "TransformTypes", false) || StrEqual(key, "Transform Types", false) || StrEqual(key, "Transform_Types", false) || StrEqual(key, "transtypes", false)) + else if (StrEqual(subsection, MT_CONFIG_SECTION_REWARDS, false)) { - char sValue[50], sSet[10][5]; + char sValue[2560], sSet[8][320]; strcopy(sValue, sizeof sValue, value); ReplaceString(sValue, sizeof sValue, " ", ""); ExplodeString(sValue, ",", sSet, sizeof sSet, sizeof sSet[]); - for (int iPos = 0; iPos < (sizeof esSpecial::g_iTransformType); iPos++) + for (int iPos = 0; iPos < (sizeof esSpecific::g_iStackLimits); iPos++) { - g_esSpecial[iIndex].g_iTransformType[iPos] = (sSet[iPos][0] != '\0') ? iClamp(StringToInt(sSet[iPos]), -1, MT_MAXTYPES) : g_esSpecial[iIndex].g_iTransformType[iPos]; + if (iPos < (sizeof esSpecific::g_iRewardEnabled)) + { + g_esSpecific.g_flRewardChance[iPos] = flGetClampedValue(key, "RewardChance", "Reward Chance", "Reward_Chance", "chance", g_esSpecific.g_flRewardChance[iPos], sSet[iPos], -1.0, 100.0); + g_esSpecific.g_flRewardDuration[iPos] = flGetClampedValue(key, "RewardDuration", "Reward Duration", "Reward_Duration", "duration", g_esSpecific.g_flRewardDuration[iPos], sSet[iPos], -1.0, 99999.0); + g_esSpecific.g_flRewardPercentage[iPos] = flGetClampedValue(key, "RewardPercentage", "Reward Percentage", "Reward_Percentage", "percent", g_esSpecific.g_flRewardPercentage[iPos], sSet[iPos], -1.0, 100.0); + g_esSpecific.g_flActionDurationReward[iPos] = flGetClampedValue(key, "ActionDurationReward", "Action Duration Reward", "Action_Duration_Reward", "actionduration", g_esSpecific.g_flActionDurationReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esSpecific.g_flAdrenalineTimeReward[iPos] = flGetClampedValue(key, "AdrenalineTimeReward", "Adrenaline Time Reward", "Adrenaline_Time_Reward", "adrenaline", g_esSpecific.g_flAdrenalineTimeReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esSpecific.g_flAttackBoostReward[iPos] = flGetClampedValue(key, "AttackBoostReward", "Attack Boost Reward", "Attack_Boost_Reward", "attackboost", g_esSpecific.g_flAttackBoostReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esSpecific.g_flDamageBoostReward[iPos] = flGetClampedValue(key, "DamageBoostReward", "Damage Boost Reward", "Damage_Boost_Reward", "dmgboost", g_esSpecific.g_flDamageBoostReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esSpecific.g_flDamageResistanceReward[iPos] = flGetClampedValue(key, "DamageResistanceReward", "Damage Resistance Reward", "Damage_Resistance_Reward", "dmgres", g_esSpecific.g_flDamageResistanceReward[iPos], sSet[iPos], -1.0, 1.0); + g_esSpecific.g_flDopamineRadiusReward[iPos] = flGetClampedValue(key, "DopamineRadiusReward", "Dopamine Radius Reward", "Dopamine_Radius_Reward", "dopamine", g_esSpecific.g_flDopamineRadiusReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esSpecific.g_flFireRateReward[iPos] = flGetClampedValue(key, "FireRateReward", "Fire Rate Reward", "Fire_Rate_Reward", "firerate", g_esSpecific.g_flFireRateReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esSpecific.g_flGrenadeLauncherReward[iPos] = flGetClampedValue(key, "GrenadeLauncherReward", "Grenade Launcher Reward", "Grenade_Launcher_Reward", "grenade", g_esSpecific.g_flGrenadeLauncherReward[iPos], sSet[iPos], -1.0, 100.0); + g_esSpecific.g_flHealPercentReward[iPos] = flGetClampedValue(key, "HealPercentReward", "Heal Percent Reward", "Heal_Percent_Reward", "healpercent", g_esSpecific.g_flHealPercentReward[iPos], sSet[iPos], -1.0, 100.0); + g_esSpecific.g_flHealthcareRadiusReward[iPos] = flGetClampedValue(key, "HealthcareRadiusReward", "Healthcare Radius Reward", "Healthcare_Radius_Reward", "healthcare", g_esSpecific.g_flHealthcareRadiusReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esSpecific.g_flHeartbeatReward[iPos] = flGetClampedValue(key, "HeartbeatReward", "Heartbeat Reward", "Heartbeat_Reward", "heartbeat", g_esSpecific.g_flHeartbeatReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esSpecific.g_flHollowpointAmmoReward[iPos] = flGetClampedValue(key, "HollowpointAmmoReward", "Hollowpoint Ammo Reward", "Hollowpoint_Ammo_Reward", "hollowpoint", g_esSpecific.g_flHollowpointAmmoReward[iPos], sSet[iPos], -1.0, 100.0); + g_esSpecific.g_flJumpHeightReward[iPos] = flGetClampedValue(key, "JumpHeightReward", "Jump Height Reward", "Jump_Height_Reward", "jumpheight", g_esSpecific.g_flJumpHeightReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esSpecific.g_flLadyKillerReward[iPos] = flGetClampedValue(key, "LadyKillerReward", "Lady Killer Reward", "Lady_Killer_Reward", "ladykiller", g_esSpecific.g_flLadyKillerReward[iPos], sSet[iPos], -1.0, 100.0); + g_esSpecific.g_flLoopingVoicelineInterval[iPos] = flGetClampedValue(key, "LoopingVoicelineInterval", "Looping Voiceline Interval", "Looping_Voiceline_Interval", "loopinterval", g_esSpecific.g_flLoopingVoicelineInterval[iPos], sSet[iPos], -1.0, 99999.0); + g_esSpecific.g_flLuckyBulletReward[iPos] = flGetClampedValue(key, "LuckyBulletReward", "Lucky Bullet Reward", "Lucky_Bullet_Reward", "luckybullet", g_esSpecific.g_flLuckyBulletReward[iPos], sSet[iPos], -1.0, 100.0); + g_esSpecific.g_flMotivationRadiusReward[iPos] = flGetClampedValue(key, "MotivationRadiusReward", "Motivation Radius Reward", "Motivation_Radius_Reward", "motivation", g_esSpecific.g_flMotivationRadiusReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esSpecific.g_flOverdoseRadiusReward[iPos] = flGetClampedValue(key, "OverdoseRadiusReward", "Overdose Radius Reward", "Overdose_Radius_Reward", "overdose", g_esSpecific.g_flOverdoseRadiusReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esSpecific.g_flPipeBombDurationReward[iPos] = flGetClampedValue(key, "PipebombDurationReward", "Pipebomb Duration Reward", "Pipebomb_Duration_Reward", "pipeduration", g_esSpecific.g_flPipeBombDurationReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esSpecific.g_flPunchResistanceReward[iPos] = flGetClampedValue(key, "PunchResistanceReward", "Punch Resistance Reward", "Punch_Resistance_Reward", "punchres", g_esSpecific.g_flPunchResistanceReward[iPos], sSet[iPos], -1.0, 1.0); + g_esSpecific.g_flRapidPistolReward[iPos] = flGetClampedValue(key, "RapidPistolReward", "Rapid Pistol Reward", "Rapid_Pistol_Reward", "rapidpistol", g_esSpecific.g_flRapidPistolReward[iPos], sSet[iPos], -1.0, 1.0); + g_esSpecific.g_flRefillPercentReward[iPos] = flGetClampedValue(key, "RefillPercentReward", "Refill Percent Reward", "Refill_Percent_Reward", "refillpercent", g_esSpecific.g_flRefillPercentReward[iPos], sSet[iPos], -1.0, 100.0); + g_esSpecific.g_flReloadRateReward[iPos] = flGetClampedValue(key, "ReloadRateReward", "Reload Rate Reward", "Reload_Rate_Reward", "reloadrate", g_esSpecific.g_flReloadRateReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esSpecific.g_flShockwaveRadiusReward[iPos] = flGetClampedValue(key, "ShockwaveRadiusReward", "Shockwave Radius Reward", "Shockwave_Radius_Reward", "shockwave", g_esSpecific.g_flShockwaveRadiusReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esSpecific.g_flShoveDamageReward[iPos] = flGetClampedValue(key, "ShoveDamageReward", "Shove Damage Reward", "Shove_Damage_Reward", "shovedmg", g_esSpecific.g_flShoveDamageReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esSpecific.g_flShoveRateReward[iPos] = flGetClampedValue(key, "ShoveRateReward", "Shove Rate Reward", "Shove_Rate_Reward", "shoverate", g_esSpecific.g_flShoveRateReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esSpecific.g_flSledgehammerRoundsReward[iPos] = flGetClampedValue(key, "SledgehammerRoundsReward", "Sledgehammer Rounds Reward", "Sledgehammer_Rounds_Reward", "sledgehammer", g_esSpecific.g_flSledgehammerRoundsReward[iPos], sSet[iPos], -1.0, 100.0); + g_esSpecific.g_flSpeedBoostReward[iPos] = flGetClampedValue(key, "SpeedBoostReward", "Speed Boost Reward", "Speed_Boost_Reward", "speedboost", g_esSpecific.g_flSpeedBoostReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esSpecific.g_flSupplierReward[iPos] = flGetClampedValue(key, "SupplierPassive", "Supplier Passive", "Supplier_Passive", "supplier", g_esSpecific.g_flSupplierReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esSpecific.g_flSwingRateReward[iPos] = flGetClampedValue(key, "SwingRateReward", "Swing Rate Reward", "Swing_Rate_Reward", "swingrate", g_esSpecific.g_flSwingRateReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esSpecific.g_iRewardEnabled[iPos] = iGetClampedValue(key, "RewardEnabled", "Reward Enabled", "Reward_Enabled", "renabled", g_esSpecific.g_iRewardEnabled[iPos], sSet[iPos], -2, 2147483647); + g_esSpecific.g_iRewardBots[iPos] = iGetClampedValue(key, "RewardBots", "Reward Bots", "Reward_Bots", "rbots", g_esSpecific.g_iRewardBots[iPos], sSet[iPos], -2, 2147483647); + g_esSpecific.g_iRewardEffect[iPos] = iGetClampedValue(key, "RewardEffect", "Reward Effect", "Reward_Effect", "effect", g_esSpecific.g_iRewardEffect[iPos], sSet[iPos], -1, 15); + g_esSpecific.g_iRewardNotify[iPos] = iGetClampedValue(key, "RewardNotify", "Reward Notify", "Reward_Notify", "rnotify", g_esSpecific.g_iRewardNotify[iPos], sSet[iPos], -1, 3); + g_esSpecific.g_iRewardVisual[iPos] = iGetClampedValue(key, "RewardVisual", "Reward Visual", "Reward_Visual", "visual", g_esSpecific.g_iRewardVisual[iPos], sSet[iPos], -1, 127); + g_esSpecific.g_iAmmoBoostReward[iPos] = iGetClampedValue(key, "AmmoBoostReward", "Ammo Boost Reward", "Ammo_Boost_Reward", "ammoboost", g_esSpecific.g_iAmmoBoostReward[iPos], sSet[iPos], -1, 1); + g_esSpecific.g_iAmmoRefillReward[iPos] = iGetClampedValue(key, "AmmoRefillReward", "Ammo Refill Reward", "Ammo_Refill_Reward", "ammorefill", g_esSpecific.g_iAmmoRefillReward[iPos], sSet[iPos], -1, 1); + g_esSpecific.g_iAmmoRegenReward[iPos] = iGetClampedValue(key, "AmmoRegenReward", "Ammo Regen Reward", "Ammo_Regen_Reward", "ammoregen", g_esSpecific.g_iAmmoRegenReward[iPos], sSet[iPos], -1, 99999); + g_esSpecific.g_iBlazeHealthReward[iPos] = iGetClampedValue(key, "BlazeHealthReward", "Blaze Health Reward", "Blaze_Health_Reward", "blaze", g_esSpecific.g_iBlazeHealthReward[iPos], sSet[iPos], -1, MT_MAXHEALTH); + g_esSpecific.g_iBloodDonorReward[iPos] = iGetClampedValue(key, "BloodDonorReward", "Blood Donor Reward", "Blood_Donor_Reward", "donor", g_esSpecific.g_iBloodDonorReward[iPos], sSet[iPos], -1, MT_MAXHEALTH); + g_esSpecific.g_iBunnyHopReward[iPos] = iGetClampedValue(key, "BunnyHopReward", "Bunny Hop Reward", "Bunny_Hop_Reward", "bhop", g_esSpecific.g_iBunnyHopReward[iPos], sSet[iPos], -1, 1); + g_esSpecific.g_iBurstDoorsReward[iPos] = iGetClampedValue(key, "BurstDoorsReward", "Burst Doors Reward", "Burst_Doors_Reward", "burstdoors", g_esSpecific.g_iBurstDoorsReward[iPos], sSet[iPos], -1, 1); + g_esSpecific.g_iCleanKillsReward[iPos] = iGetClampedValue(key, "CleanKillsReward", "Clean Kills Reward", "Clean_Kills_Reward", "cleankills", g_esSpecific.g_iCleanKillsReward[iPos], sSet[iPos], -1, 1); + g_esSpecific.g_iClusterBombsReward[iPos] = iGetClampedValue(key, "ClusterBombsReward", "Cluster Bombs Reward", "Cluster_Bombs_Reward", "cluster", g_esSpecific.g_iClusterBombsReward[iPos], sSet[iPos], -1, 5); + g_esSpecific.g_iEternalFlamesReward[iPos] = iGetClampedValue(key, "EternalFlamesReward", "Eternal Flames Reward", "Eternal_Flames_Reward", "eternal", g_esSpecific.g_iEternalFlamesReward[iPos], sSet[iPos], -1, 1); + g_esSpecific.g_iFastRecoveryReward[iPos] = iGetClampedValue(key, "FastRecoveryReward", "Fast Recovery Reward", "Fast_Recovery_Reward", "fastrecovery", g_esSpecific.g_iFastRecoveryReward[iPos], sSet[iPos], -1, 1); + g_esSpecific.g_iFriendlyFireReward[iPos] = iGetClampedValue(key, "FriendlyFireReward", "Friendly Fire Reward", "Friendly_Fire_Reward", "friendlyfire", g_esSpecific.g_iFriendlyFireReward[iPos], sSet[iPos], -1, 1); + g_esSpecific.g_iGhostBulletsReward[iPos] = iGetClampedValue(key, "GhostBulletsReward", "Ghost Bullets Reward", "Ghost_Bullets_Reward", "ghost", g_esSpecific.g_iGhostBulletsReward[iPos], sSet[iPos], -1, 1); + g_esSpecific.g_iHealthRegenReward[iPos] = iGetClampedValue(key, "HealthRegenReward", "Health Regen Reward", "Health_Regen_Reward", "hpregen", g_esSpecific.g_iHealthRegenReward[iPos], sSet[iPos], -1, MT_MAXHEALTH); + g_esSpecific.g_iInfiniteAmmoReward[iPos] = iGetClampedValue(key, "InfiniteAmmoReward", "Infinite Ammo Reward", "Infinite_Ammo_Reward", "infammo", g_esSpecific.g_iInfiniteAmmoReward[iPos], sSet[iPos], -1, 31); + g_esSpecific.g_iLadderActionsReward[iPos] = iGetClampedValue(key, "LadderActionsReward", "Ladder Actions Reward", "Ladder_Action_Reward", "ladderacts", g_esSpecific.g_iLadderActionsReward[iPos], sSet[iPos], -1, 1); + g_esSpecific.g_iLaserSightReward[iPos] = iGetClampedValue(key, "LaserSightReward", "Laser Sight Reward", "Laser_Sight_Reward", "lasersight", g_esSpecific.g_iLaserSightReward[iPos], sSet[iPos], -1, 1); + g_esSpecific.g_iLifeLeechReward[iPos] = iGetClampedValue(key, "LifeLeechReward", "Life Leech Reward", "Life_Leech_Reward", "lifeleech", g_esSpecific.g_iLifeLeechReward[iPos], sSet[iPos], -1, MT_MAXHEALTH); + g_esSpecific.g_iMedicalCutsReward[iPos] = iGetClampedValue(key, "MedicalCutsReward", "Medical Cuts Reward", "Medical_Cuts_Reward", "medcuts", g_esSpecific.g_iMedicalCutsReward[iPos], sSet[iPos], -1, MT_MAXHEALTH); + g_esSpecific.g_iMeleeRangeReward[iPos] = iGetClampedValue(key, "MeleeRangeReward", "Melee Range Reward", "Melee_Range_Reward", "meleerange", g_esSpecific.g_iMeleeRangeReward[iPos], sSet[iPos], -1, 99999); + g_esSpecific.g_iMidairDashesReward[iPos] = iGetClampedValue(key, "MidairDashesReward", "Midair Dashes Reward", "Midair_Dashes_Reward", "middash", g_esSpecific.g_iMidairDashesReward[iPos], sSet[iPos], -1, 99999); + g_esSpecific.g_iOverhealthReward[iPos] = iGetClampedValue(key, "OverhealthReward", "Overhealth Reward", "Overhealth_Reward", "overhealth", g_esSpecific.g_iOverhealthReward[iPos], sSet[iPos], -1, MT_MAXHEALTH); + g_esSpecific.g_iParticleEffectVisual[iPos] = iGetClampedValue(key, "ParticleEffectVisual", "Particle Effect Visual", "Particle_Effect_Visual", "particle", g_esSpecific.g_iParticleEffectVisual[iPos], sSet[iPos], -1, 15); + g_esSpecific.g_iPrefsNotify[iPos] = iGetClampedValue(key, "PrefsNotify", "Prefs Notify", "Prefs_Notify", "pnotify", g_esSpecific.g_iPrefsNotify[iPos], sSet[iPos], -1, 1); + g_esSpecific.g_iRecoilDampenerReward[iPos] = iGetClampedValue(key, "RecoilDampenerReward", "Recoil Dampener Reward", "Recoil_Dampener_Reward", "recoil", g_esSpecific.g_iRecoilDampenerReward[iPos], sSet[iPos], -1, 1); + g_esSpecific.g_iRegenBurstsReward[iPos] = iGetClampedValue(key, "RegenBurstsReward", "Regen Bursts Reward", "Regen_Bursts_Reward", "regbursts", g_esSpecific.g_iRegenBurstsReward[iPos], sSet[iPos], -1, MT_MAXHEALTH); + g_esSpecific.g_iRespawnLoadoutReward[iPos] = iGetClampedValue(key, "RespawnLoadoutReward", "Respawn Loadout Reward", "Respawn_Loadout_Reward", "resloadout", g_esSpecific.g_iRespawnLoadoutReward[iPos], sSet[iPos], -1, 1); + g_esSpecific.g_iReviveHealthReward[iPos] = iGetClampedValue(key, "ReviveHealthReward", "Revive Health Reward", "Revive_Health_Reward", "revivehp", g_esSpecific.g_iReviveHealthReward[iPos], sSet[iPos], -1, MT_MAXHEALTH); + g_esSpecific.g_iRiotGearReward[iPos] = iGetClampedValue(key, "RiotGearReward", "Riot Gear Reward", "Riot_Gear_Reward", "riotgear", g_esSpecific.g_iRiotGearReward[iPos], sSet[iPos], -1, 1); + g_esSpecific.g_iSafetyBubbleReward[iPos] = iGetClampedValue(key, "SafetyBubbleReward", "Safety Bubble Reward", "Safety_Bubble_Reward", "safetybubble", g_esSpecific.g_iSafetyBubbleReward[iPos], sSet[iPos], -1, 1); + g_esSpecific.g_iShareRewards[iPos] = iGetClampedValue(key, "ShareRewards", "Share Rewards", "Share_Rewards", "share", g_esSpecific.g_iShareRewards[iPos], sSet[iPos], -1, 3); + g_esSpecific.g_iShovePenaltyReward[iPos] = iGetClampedValue(key, "ShovePenaltyReward", "Shove Penalty Reward", "Shove_Penalty_Reward", "shovepenalty", g_esSpecific.g_iShovePenaltyReward[iPos], sSet[iPos], -1, 1); + g_esSpecific.g_iSpecialAmmoReward[iPos] = iGetClampedValue(key, "SpecialAmmoReward", "Special Ammo Reward", "Special_Ammo_Reward", "specammo", g_esSpecific.g_iSpecialAmmoReward[iPos], sSet[iPos], -1, 3); + g_esSpecific.g_iStackRewards[iPos] = iGetClampedValue(key, "StackRewards", "Stack Rewards", "Stack_Rewards", "rstack", g_esSpecific.g_iStackRewards[iPos], sSet[iPos], -1, 2147483647); + g_esSpecific.g_iStickyGrenadesReward[iPos] = iGetClampedValue(key, "StickyGrenadesReward", "Sticky Grenades Reward", "Sticky_Grenades_Reward", "sticky", g_esSpecific.g_iStickyGrenadesReward[iPos], sSet[iPos], -1, 1); + g_esSpecific.g_iSyringeDartsReward[iPos] = iGetClampedValue(key, "SyringeDartsReward", "Syringe Darts Reward", "Syringe_Darts_Reward", "syringe", g_esSpecific.g_iSyringeDartsReward[iPos], sSet[iPos], -1, MT_MAXHEALTH); + g_esSpecific.g_iThornsReward[iPos] = iGetClampedValue(key, "ThornsReward", "Thorns Reward", "Thorns_Reward", "thorns", g_esSpecific.g_iThornsReward[iPos], sSet[iPos], -1, 1); + g_esSpecific.g_iUsefulRewards[iPos] = iGetClampedValue(key, "UsefulRewards", "Useful Rewards", "Useful_Rewards", "useful", g_esSpecific.g_iUsefulRewards[iPos], sSet[iPos], -1, 15); + g_esSpecific.g_iVoicePitchVisual[iPos] = iGetClampedValue(key, "VoicePitchVisual", "Voice Pitch Visual", "Voice_Pitch_Visual", "voicepitch", g_esSpecific.g_iVoicePitchVisual[iPos], sSet[iPos], -1, 255); + + vGetConfigColors(sValue, sizeof sValue, sSet[iPos], ';'); + vGetStringValue(key, "BodyColorVisual", "Body Color Visual", "Body_Color_Visual", "bodycolor", iPos, g_esSpecific.g_sBodyColorVisual, sizeof esSpecific::g_sBodyColorVisual, g_esSpecific.g_sBodyColorVisual2, sizeof esSpecific::g_sBodyColorVisual2, g_esSpecific.g_sBodyColorVisual3, sizeof esSpecific::g_sBodyColorVisual3, g_esSpecific.g_sBodyColorVisual4, sizeof esSpecific::g_sBodyColorVisual4, sValue); + vGetStringValue(key, "FallVoicelineReward", "Fall Voiceline Reward", "Fall_Voiceline_Reward", "fallvoice", iPos, g_esSpecific.g_sFallVoicelineReward, sizeof esSpecific::g_sFallVoicelineReward, g_esSpecific.g_sFallVoicelineReward2, sizeof esSpecific::g_sFallVoicelineReward2, g_esSpecific.g_sFallVoicelineReward3, sizeof esSpecific::g_sFallVoicelineReward3, g_esSpecific.g_sFallVoicelineReward4, sizeof esSpecific::g_sFallVoicelineReward4, sSet[iPos]); + vGetStringValue(key, "GlowColorVisual", "Glow Color Visual", "Glow_Color_Visual", "glowcolor", iPos, g_esSpecific.g_sOutlineColorVisual, sizeof esSpecific::g_sOutlineColorVisual, g_esSpecific.g_sOutlineColorVisual2, sizeof esSpecific::g_sOutlineColorVisual2, g_esSpecific.g_sOutlineColorVisual3, sizeof esSpecific::g_sOutlineColorVisual3, g_esSpecific.g_sOutlineColorVisual4, sizeof esSpecific::g_sOutlineColorVisual4, sValue); + vGetStringValue(key, "ItemReward", "Item Reward", "Item_Reward", "item", iPos, g_esSpecific.g_sItemReward, sizeof esSpecific::g_sItemReward, g_esSpecific.g_sItemReward2, sizeof esSpecific::g_sItemReward2, g_esSpecific.g_sItemReward3, sizeof esSpecific::g_sItemReward3, g_esSpecific.g_sItemReward4, sizeof esSpecific::g_sItemReward4, sSet[iPos]); + vGetStringValue(key, "LightColorVisual", "Light Color Visual", "Light_Color_Visual", "lightcolor", iPos, g_esSpecific.g_sLightColorVisual, sizeof esSpecific::g_sLightColorVisual, g_esSpecific.g_sLightColorVisual2, sizeof esSpecific::g_sLightColorVisual2, g_esSpecific.g_sLightColorVisual3, sizeof esSpecific::g_sLightColorVisual3, g_esSpecific.g_sLightColorVisual4, sizeof esSpecific::g_sLightColorVisual4, sValue); + vGetStringValue(key, "LoopingVoicelineVisual", "Looping Voiceline Visual", "Looping_Voiceline_Visual", "loopvoice", iPos, g_esSpecific.g_sLoopingVoicelineVisual, sizeof esSpecific::g_sLoopingVoicelineVisual, g_esSpecific.g_sLoopingVoicelineVisual2, sizeof esSpecific::g_sLoopingVoicelineVisual2, g_esSpecific.g_sLoopingVoicelineVisual3, sizeof esSpecific::g_sLoopingVoicelineVisual3, g_esSpecific.g_sLoopingVoicelineVisual4, sizeof esSpecific::g_sLoopingVoicelineVisual4, sSet[iPos]); + vGetStringValue(key, "ScreenColorVisual", "Screen Color Visual", "Screen_Color_Visual", "screencolor", iPos, g_esSpecific.g_sScreenColorVisual, sizeof esSpecific::g_sScreenColorVisual, g_esSpecific.g_sScreenColorVisual2, sizeof esSpecific::g_sScreenColorVisual2, g_esSpecific.g_sScreenColorVisual3, sizeof esSpecific::g_sScreenColorVisual3, g_esSpecific.g_sScreenColorVisual4, sizeof esSpecific::g_sScreenColorVisual4, sValue); + } + + g_esSpecific.g_iStackLimits[iPos] = iGetClampedValue(key, "StackLimits", "Stack Limits", "Stack_Limits", "limits", g_esSpecific.g_iStackLimits[iPos], sSet[iPos], -1, 99999); } } - } - else if (StrEqual(subsection, MT_CONFIG_SECTION_PROPS, false)) - { - char sValue[64], sSet[4][4]; - vGetConfigColors(sValue, sizeof sValue, value); - vSaveConfigColors(key, "RockColor", "Rock Color", "Rock_Color", "rock", g_esSpecial[iIndex].g_sRockColor, sizeof esSpecial::g_sRockColor, value); - ReplaceString(sValue, sizeof sValue, " ", ""); - ExplodeString(sValue, ",", sSet, sizeof sSet, sizeof sSet[]); - - for (int iPos = 0; iPos < (sizeof esSpecial::g_iRockColor); iPos++) + else if (StrEqual(subsection, MT_CONFIG_SECTION_HEALTH, false)) { - g_esSpecial[iIndex].g_iRockColor[iPos] = iGetClampedValue(key, "RockColor", "Rock Color", "Rock_Color", "rock", g_esSpecial[iIndex].g_iRockColor[iPos], sSet[iPos], -1, 255); + char sSettings[4][128]; + for (int iPos = 0; iPos < (sizeof g_sSpecialNames); iPos++) + { + vGetSpecialSettingNames(sSettings, sizeof sSettings[], "BaseHealth", "Base Health", "Base_Health", "basehp", iPos); + g_esSpecific.g_iBaseHealth[iPos] = iGetClampedValue(key, sSettings[0], sSettings[1], sSettings[2], sSettings[3], g_esSpecific.g_iBaseHealth[iPos], value, -1, MT_MAXHEALTH); + vGetSpecialSettingNames(sSettings, sizeof sSettings[], "ExtraHealth", "Extra Health", "Extra_Health", "extrahp", iPos); + g_esSpecific.g_iExtraHealth[iPos] = iGetClampedValue(key, sSettings[0], sSettings[1], sSettings[2], sSettings[3], g_esSpecific.g_iExtraHealth[iPos], value, MT_MAX_HEALTH_REDUCTION, MT_MAXHEALTH); + } } } - vConfigsLoadedForward(subsection, key, value, iIndex, -1, mode, true, specsection); - } -} - -void vReadSpecificSettings(int mode, const char[] section, const char[] subsection, const char[] specsection, const char[] key, const char[] value) -{ - if (StrEqual(section, MT_CONFIG_SECTION_SETTINGS, false) || StrEqual(section, MT_CONFIG_SECTION_SETTINGS2, false) || StrEqual(section, MT_CONFIG_SECTION_SETTINGS3, false) || StrEqual(section, MT_CONFIG_SECTION_SETTINGS4, false)) - { - g_esSpecific.g_iSpecialTypes = iGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "SpecialTypes", "Special Types", "Special_Types", "spectypes", g_esSpecific.g_iSpecialTypes, value, -1, 63); - g_esSpecific.g_iSpecialTypes = (g_esSpecific.g_iSpecialTypes > 0) ? iGetSpecialTypes(g_esSpecific.g_iSpecialTypes, specsection) : 0; - g_esSpecific.g_iDeathRevert = iGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "DeathRevert", "Death Revert", "Death_Revert", "revert", g_esSpecific.g_iDeathRevert, value, -1, 1); - g_esSpecific.g_iFinalesOnly = iGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "FinalesOnly", "Finales Only", "Finales_Only", "finale", g_esSpecific.g_iFinalesOnly, value, -1, 4); - g_esSpecific.g_iRequiresHumans = iGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esSpecific.g_iRequiresHumans, value, -1, 32); - g_esSpecific.g_iSpecialModel = iGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "SpecialModel", "Special Model", "Special_Model", "model", g_esSpecific.g_iSpecialModel, value, -1, 3); - g_esSpecific.g_flBurnDuration = flGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "BurnDuration", "Burn Duration", "Burn_Duration", "burndur", g_esSpecific.g_flBurnDuration, value, -1.0, 99999.0); - g_esSpecific.g_flBurntSkin = flGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "BurntSkin", "Burnt Skin", "Burnt_Skin", "burnt", g_esSpecific.g_flBurntSkin, value, -2.0, 1.0); - g_esSpecific.g_iCycleTypes = iGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "CycleTypes", "Cycle Types", "Cycle_Types", "cycle", g_esSpecific.g_iCycleTypes, value, -1, 4); - g_esSpecific.g_iSpawnEnabled = iGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "SpawnEnabled", "Spawn Enabled", "Spawn_Enabled", "spawn", g_esSpecific.g_iSpawnEnabled, value, -1, 1); - g_esSpecific.g_iAnnounceArrival = iGetKeyValue(subsection, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE2, key, "AnnounceArrival", "Announce Arrival", "Announce_Arrival", "arrival", g_esSpecific.g_iAnnounceArrival, value, -1, 31); - g_esSpecific.g_iAnnounceDeath = iGetKeyValue(subsection, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE2, key, "AnnounceDeath", "Announce Death", "Announce_Death", "death", g_esSpecific.g_iAnnounceDeath, value, -1, 2); - g_esSpecific.g_iAnnounceKill = iGetKeyValue(subsection, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE2, key, "AnnounceKill", "Announce Kill", "Announce_Kill", "kill", g_esSpecific.g_iAnnounceKill, value, -1, 1); - g_esSpecific.g_iArrivalMessage = iGetKeyValue(subsection, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE2, key, "ArrivalMessage", "Arrival Message", "Arrival_Message", "arrivalmsg", g_esSpecific.g_iArrivalMessage, value, -1, 1023); - g_esSpecific.g_iArrivalSound = iGetKeyValue(subsection, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE2, key, "ArrivalSound", "Arrival Sound", "Arrival_Sound", "arrivalsnd", g_esSpecific.g_iArrivalSound, value, -1, 1); - g_esSpecific.g_iDeathDetails = iGetKeyValue(subsection, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE2, key, "DeathDetails", "Death Details", "Death_Details", "deathdets", g_esSpecific.g_iDeathDetails, value, -1, 5); - g_esSpecific.g_iDeathMessage = iGetKeyValue(subsection, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE2, key, "DeathMessage", "Death Message", "Death_Message", "deathmsg", g_esSpecific.g_iDeathMessage, value, -1, 1023); - g_esSpecific.g_iDeathSound = iGetKeyValue(subsection, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE2, key, "DeathSound", "Death Sound", "Death_Sound", "deathsnd", g_esSpecific.g_iDeathSound, value, -1, 1); - g_esSpecific.g_iKillMessage = iGetKeyValue(subsection, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE2, key, "KillMessage", "Kill Message", "Kill_Message", "killmsg", g_esSpecific.g_iKillMessage, value, -1, 1023); - g_esSpecific.g_iVocalizeArrival = iGetKeyValue(subsection, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE2, key, "VocalizeArrival", "Vocalize Arrival", "Vocalize_Arrival", "arrivalvoc", g_esSpecific.g_iVocalizeArrival, value, -1, 1); - g_esSpecific.g_iVocalizeDeath = iGetKeyValue(subsection, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE2, key, "VocalizeDeath", "Vocalize Death", "Vocalize_Death", "deathvoc", g_esSpecific.g_iVocalizeDeath, value, -1, 1); - g_esSpecific.g_iDisplayHealth = iGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "DisplayHealth", "Display Health", "Display_Health", "displayhp", g_esSpecific.g_iDisplayHealth, value, -1, 11); - g_esSpecific.g_iDisplayHealthType = iGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "DisplayHealthType", "Display Health Type", "Display_Health_Type", "displaytype", g_esSpecific.g_iDisplayHealthType, value, -1, 2); - g_esSpecific.g_flHealPercentMultiplier = flGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "HealthPercentageMultiplier", "Health Percentage Multiplier", "Health_Percentage_Multiplier", "hpmulti", g_esSpecific.g_flHealPercentMultiplier, value, -1.0, 99999.0); - g_esSpecific.g_iHumanMultiplierMode = iGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "HumanMultiplierMode", "Human Multiplier Mode", "Human_Multiplier_Mode", "humanmultimode", g_esSpecific.g_iHumanMultiplierMode, value, -1, 1); - g_esSpecific.g_iMinimumHumans = iGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "MinimumHumans", "Minimum Humans", "Minimum_Humans", "minhumans", g_esSpecific.g_iMinimumHumans, value, -1, 32); - g_esSpecific.g_iMultiplyHealth = iGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "MultiplyHealth", "Multiply Health", "Multiply_Health", "multihp", g_esSpecific.g_iMultiplyHealth, value, -1, 3); - g_esSpecific.g_iSpawnProtection = iGetKeyValue(subsection, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION2, key, "SpawnProtection", "Spawn Protection", "Spawn_Protection", "protect", g_esSpecific.g_iSpawnProtection, value, -1, 3); - g_esSpecific.g_flArmorDuration = flGetKeyValue(subsection, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION2, key, "ArmorDuration", "Armor Duration", "Armor_Duration", "armorduration", g_esSpecific.g_flArmorDuration, value, -1.0, 99999.0); - g_esSpecific.g_flArmorResistance = flGetKeyValue(subsection, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION2, key, "ArmorResistance", "Armor Resistance", "Armor_Resistance", "armorres", g_esSpecific.g_flArmorResistance, value, -1.0, 1.0); - g_esSpecific.g_flShieldDuration = flGetKeyValue(subsection, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION2, key, "ShieldDuration", "Shield Duration", "Shield_Duration", "shieldduration", g_esSpecific.g_flShieldDuration, value, -1.0, 99999.0); - g_esSpecific.g_flShieldResistance = flGetKeyValue(subsection, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION2, key, "ShieldResistance", "Shield Resistance", "Shield_Resistance", "shieldres", g_esSpecific.g_flShieldResistance, value, -1.0, 1.0); - g_esSpecific.g_flAttackInterval = flGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "AttackInterval", "Attack Interval", "Attack_Interval", "attack", g_esSpecific.g_flAttackInterval, value, -1.0, 99999.0); - g_esSpecific.g_flClawDamage = flGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "ClawDamage", "Claw Damage", "Claw_Damage", "claw", g_esSpecific.g_flClawDamage, value, -2.0, 99999.0); - g_esSpecific.g_flHittableDamage = flGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "HittableDamage", "Hittable Damage", "Hittable_Damage", "hittable", g_esSpecific.g_flHittableDamage, value, -2.0, 99999.0); - g_esSpecific.g_flIncapDamageMultiplier = flGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "IncapDamageMultiplier", "Incap Damage Multiplier", "Incap_Damage_Multiplier", "incapdmgmulti", g_esSpecific.g_flIncapDamageMultiplier, value, -1.0, 99999.0); - g_esSpecific.g_iIntangibleBody = iGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "IntangibleBody", "Intangible Body", "Intangible_Body", "intangible", g_esSpecific.g_iIntangibleBody, value, -1, 1); - g_esSpecific.g_iMeleeHitMode = iGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "MeleeHitMode", "Melee Hit Mode", "Melee_Hit_Mode", "meleehit", g_esSpecific.g_iMeleeHitMode, value, -1, 2); - g_esSpecific.g_flMeleeHitValue = flGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "MeleeHitValue", "Melee Hit Value", "Melee_Hit_Value", "meleevalue", g_esSpecific.g_flMeleeHitValue, value, -1.0, 99999.0); - g_esSpecific.g_flPinDamage = flGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "PinDamage", "Pin Damage", "Pin_Damage", "pindmg", g_esSpecific.g_flPinDamage, value, -2.0, 99999.0); - g_esSpecific.g_flRunSpeed = flGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "RunSpeed", "Run Speed", "Run_Speed", "speed", g_esSpecific.g_flRunSpeed, value, -1.0, 99.0); - g_esSpecific.g_flSpecialInterval = flGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "SpecialInterval", "Special Interval", "Special_Interval", "specint", g_esSpecific.g_flSpecialInterval, value, -1.0, 99999.0); - g_esSpecific.g_iThrowRock = iGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "ThrowRock", "Throw Rock", "Throw_Rock", "throwrock", g_esSpecific.g_iThrowRock, value, -1, 1); - g_esSpecific.g_iBulletImmunity = iGetKeyValue(subsection, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE2, key, "BulletImmunity", "Bullet Immunity", "Bullet_Immunity", "bullet", g_esSpecific.g_iBulletImmunity, value, -1, 1); - g_esSpecific.g_iExplosiveImmunity = iGetKeyValue(subsection, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE2, key, "ExplosiveImmunity", "Explosive Immunity", "Explosive_Immunity", "explosive", g_esSpecific.g_iExplosiveImmunity, value, -1, 1); - g_esSpecific.g_iFireImmunity = iGetKeyValue(subsection, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE2, key, "FireImmunity", "Fire Immunity", "Fire_Immunity", "fire", g_esSpecific.g_iFireImmunity, value, -1, 1); - g_esSpecific.g_iHittableImmunity = iGetKeyValue(subsection, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE2, key, "HittableImmunity", "Hittable Immunity", "Hittable_Immunity", "hittable", g_esSpecific.g_iHittableImmunity, value, -1, 1); - g_esSpecific.g_iMeleeImmunity = iGetKeyValue(subsection, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE2, key, "MeleeImmunity", "Melee Immunity", "Melee_Immunity", "melee", g_esSpecific.g_iMeleeImmunity, value, -1, 1); - g_esSpecific.g_iVomitImmunity = iGetKeyValue(subsection, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE2, key, "VomitImmunity", "Vomit Immunity", "Vomit_Immunity", "vomit", g_esSpecific.g_iVomitImmunity, value, -1, 1); - - vGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "HealthCharacters", "Health Characters", "Health_Characters", "hpchars", g_esSpecific.g_sHealthCharacters, sizeof esGeneral::g_sHealthCharacters, value); - - if (StrEqual(subsection, MT_CONFIG_SECTION_GENERAL, false)) - { - if (StrEqual(key, "TypeRange", false) || StrEqual(key, "Type Range", false) || StrEqual(key, "Type_Range", false) || StrEqual(key, "types", false)) - { - char sValue[10], sRange[2][5]; - strcopy(sValue, sizeof sValue, value); - ReplaceString(sValue, sizeof sValue, " ", ""); - ExplodeString(sValue, "-", sRange, sizeof sRange, sizeof sRange[]); - - g_esSpecific.g_iMinType = (sRange[0][0] != '\0') ? iClamp(StringToInt(sRange[0]), -1, MT_MAXTYPES) : g_esSpecific.g_iMinType; - g_esSpecific.g_iMaxType = (sRange[1][0] != '\0') ? iClamp(StringToInt(sRange[1]), -1, MT_MAXTYPES) : g_esSpecific.g_iMaxType; - } - } - else if (StrEqual(subsection, MT_CONFIG_SECTION_REWARDS, false)) + if (StrContains(specsection, MT_CONFIG_SECTION_COMMON, false) != -1 || StrContains(specsection, MT_CONFIG_SECTION_WITCH, false) != -1 || StrEqual(specsection, MT_CONFIG_SECTION_MOB, false) || StrEqual(specsection, MT_CONFIG_SECTION_INFECTED, false) || StrContains(specsection, MT_CONFIG_SECTION_INFECTED2, false) != -1) { - char sValue[1280], sSet[8][320]; - strcopy(sValue, sizeof sValue, value); - ReplaceString(sValue, sizeof sValue, " ", ""); - ExplodeString(sValue, ",", sSet, sizeof sSet, sizeof sSet[]); - for (int iPos = 0; iPos < (sizeof esSpecific::g_iStackLimits); iPos++) - { - if (iPos < (sizeof esSpecific::g_iRewardEnabled)) - { - g_esSpecific.g_flRewardChance[iPos] = flGetClampedValue(key, "RewardChance", "Reward Chance", "Reward_Chance", "chance", g_esSpecific.g_flRewardChance[iPos], sSet[iPos], -1.0, 100.0); - g_esSpecific.g_flRewardDuration[iPos] = flGetClampedValue(key, "RewardDuration", "Reward Duration", "Reward_Duration", "duration", g_esSpecific.g_flRewardDuration[iPos], sSet[iPos], -1.0, 99999.0); - g_esSpecific.g_flRewardPercentage[iPos] = flGetClampedValue(key, "RewardPercentage", "Reward Percentage", "Reward_Percentage", "percent", g_esSpecific.g_flRewardPercentage[iPos], sSet[iPos], -1.0, 100.0); - g_esSpecific.g_flActionDurationReward[iPos] = flGetClampedValue(key, "ActionDurationReward", "Action Duration Reward", "Action_Duration_Reward", "actionduration", g_esSpecific.g_flActionDurationReward[iPos], sSet[iPos], -1.0, 99999.0); - g_esSpecific.g_flAttackBoostReward[iPos] = flGetClampedValue(key, "AttackBoostReward", "Attack Boost Reward", "Attack_Boost_Reward", "attackboost", g_esSpecific.g_flAttackBoostReward[iPos], sSet[iPos], -1.0, 99999.0); - g_esSpecific.g_flDamageBoostReward[iPos] = flGetClampedValue(key, "DamageBoostReward", "Damage Boost Reward", "Damage_Boost_Reward", "dmgboost", g_esSpecific.g_flDamageBoostReward[iPos], sSet[iPos], -1.0, 99999.0); - g_esSpecific.g_flDamageResistanceReward[iPos] = flGetClampedValue(key, "DamageResistanceReward", "Damage Resistance Reward", "Damage_Resistance_Reward", "dmgres", g_esSpecific.g_flDamageResistanceReward[iPos], sSet[iPos], -1.0, 1.0); - g_esSpecific.g_flHealPercentReward[iPos] = flGetClampedValue(key, "HealPercentReward", "Heal Percent Reward", "Heal_Percent_Reward", "healpercent", g_esSpecific.g_flHealPercentReward[iPos], sSet[iPos], -1.0, 100.0); - g_esSpecific.g_flJumpHeightReward[iPos] = flGetClampedValue(key, "JumpHeightReward", "Jump Height Reward", "Jump_Height_Reward", "jumpheight", g_esSpecific.g_flJumpHeightReward[iPos], sSet[iPos], -1.0, 99999.0); - g_esSpecific.g_flLoopingVoicelineInterval[iPos] = flGetClampedValue(key, "LoopingVoicelineInterval", "Looping Voiceline Interval", "Looping_Voiceline_Interval", "loopinterval", g_esSpecific.g_flLoopingVoicelineInterval[iPos], sSet[iPos], -1.0, 99999.0); - g_esSpecific.g_flPipeBombDurationReward[iPos] = flGetClampedValue(key, "PipebombDurationReward", "Pipebomb Duration Reward", "Pipebomb_Duration_Reward", "pipeduration", g_esSpecific.g_flPipeBombDurationReward[iPos], sSet[iPos], -1.0, 99999.0); - g_esSpecific.g_flPunchResistanceReward[iPos] = flGetClampedValue(key, "PunchResistanceReward", "Punch Resistance Reward", "Punch_Resistance_Reward", "punchres", g_esSpecific.g_flPunchResistanceReward[iPos], sSet[iPos], -1.0, 1.0); - g_esSpecific.g_flRapidPistolReward[iPos] = flGetClampedValue(key, "RapidPistolReward", "Rapid Pistol Reward", "Rapid_Pistol_Reward", "rapid", g_esSpecific.g_flRapidPistolReward[iPos], sSet[iPos], -1.0, 1.0); - g_esSpecific.g_flRefillPercentReward[iPos] = flGetClampedValue(key, "RefillPercentReward", "Refill Percent Reward", "Refill_Percent_Reward", "refillpercent", g_esSpecific.g_flRefillPercentReward[iPos], sSet[iPos], -1.0, 100.0); - g_esSpecific.g_flShoveDamageReward[iPos] = flGetClampedValue(key, "ShoveDamageReward", "Shove Damage Reward", "Shove_Damage_Reward", "shovedmg", g_esSpecific.g_flShoveDamageReward[iPos], sSet[iPos], -1.0, 99999.0); - g_esSpecific.g_flShoveRateReward[iPos] = flGetClampedValue(key, "ShoveRateReward", "Shove Rate Reward", "Shove_Rate_Reward", "shoverate", g_esSpecific.g_flShoveRateReward[iPos], sSet[iPos], -1.0, 99999.0); - g_esSpecific.g_flSpeedBoostReward[iPos] = flGetClampedValue(key, "SpeedBoostReward", "Speed Boost Reward", "Speed_Boost_Reward", "speedboost", g_esSpecific.g_flSpeedBoostReward[iPos], sSet[iPos], -1.0, 99999.0); - g_esSpecific.g_iRewardEnabled[iPos] = iGetClampedValue(key, "RewardEnabled", "Reward Enabled", "Reward_Enabled", "renabled", g_esSpecific.g_iRewardEnabled[iPos], sSet[iPos], -2, 2147483647); - g_esSpecific.g_iRewardBots[iPos] = iGetClampedValue(key, "RewardBots", "Reward Bots", "Reward_Bots", "bots", g_esSpecific.g_iRewardBots[iPos], sSet[iPos], -2, 2147483647); - g_esSpecific.g_iRewardEffect[iPos] = iGetClampedValue(key, "RewardEffect", "Reward Effect", "Reward_Effect", "effect", g_esSpecific.g_iRewardEffect[iPos], sSet[iPos], -1, 15); - g_esSpecific.g_iRewardNotify[iPos] = iGetClampedValue(key, "RewardNotify", "Reward Notify", "Reward_Notify", "rnotify", g_esSpecific.g_iRewardNotify[iPos], sSet[iPos], -1, 3); - g_esSpecific.g_iRewardVisual[iPos] = iGetClampedValue(key, "RewardVisual", "Reward Visual", "Reward_Visual", "visual", g_esSpecific.g_iRewardVisual[iPos], sSet[iPos], -1, 127); - g_esSpecific.g_iAmmoBoostReward[iPos] = iGetClampedValue(key, "AmmoBoostReward", "Ammo Boost Reward", "Ammo_Boost_Reward", "ammoboost", g_esSpecific.g_iAmmoBoostReward[iPos], sSet[iPos], -1, 1); - g_esSpecific.g_iAmmoRegenReward[iPos] = iGetClampedValue(key, "AmmoRegenReward", "Ammo Regen Reward", "Ammo_Regen_Reward", "ammoregen", g_esSpecific.g_iAmmoRegenReward[iPos], sSet[iPos], -1, 99999); - g_esSpecific.g_iBlazeHealthReward[iPos] = iGetClampedValue(key, "BlazeHealthReward", "Blaze Health Reward", "Blaze_Health_Reward", "blaze", g_esSpecific.g_iBlazeHealthReward[iPos], sSet[iPos], -1, 1); - g_esSpecific.g_iBunnyHopReward[iPos] = iGetClampedValue(key, "BunnyHopReward", "Bunny Hop Reward", "Bunny_Hop_Reward", "bhop", g_esSpecific.g_iBunnyHopReward[iPos], sSet[iPos], -1, 1); - g_esSpecific.g_iBurstDoorsReward[iPos] = iGetClampedValue(key, "BurstDoorsReward", "Burst Doors Reward", "Burst_Doors_Reward", "burstdoors", g_esSpecific.g_iBurstDoorsReward[iPos], sSet[iPos], -1, 1); - g_esSpecific.g_iCleanKillsReward[iPos] = iGetClampedValue(key, "CleanKillsReward", "Clean Kills Reward", "Clean_Kills_Reward", "cleankills", g_esSpecific.g_iCleanKillsReward[iPos], sSet[iPos], -1, 1); - g_esSpecific.g_iClusterBombsReward[iPos] = iGetClampedValue(key, "ClusterBombsReward", "Cluster Bombs Reward", "Cluster_Bombs_Reward", "cluster", g_esSpecific.g_iClusterBombsReward[iPos], sSet[iPos], -1, 5); - g_esSpecific.g_iFriendlyFireReward[iPos] = iGetClampedValue(key, "FriendlyFireReward", "Friendly Fire Reward", "Friendly_Fire_Reward", "friendlyfire", g_esSpecific.g_iFriendlyFireReward[iPos], sSet[iPos], -1, 1); - g_esSpecific.g_iGhostBulletsReward[iPos] = iGetClampedValue(key, "GhostBulletsReward", "Ghost Bullets Reward", "Ghost_Bullets_Reward", "ghost", g_esSpecific.g_iGhostBulletsReward[iPos], sSet[iPos], -1, 1); - g_esSpecific.g_iHealthRegenReward[iPos] = iGetClampedValue(key, "HealthRegenReward", "Health Regen Reward", "Health_Regen_Reward", "hpregen", g_esSpecific.g_iHealthRegenReward[iPos], sSet[iPos], -1, MT_MAXHEALTH); - g_esSpecific.g_iHollowpointAmmoReward[iPos] = iGetClampedValue(key, "HollowpointAmmoReward", "Hollowpoint Ammo Reward", "Hollowpoint_Ammo_Reward", "hollowpoint", g_esSpecific.g_iHollowpointAmmoReward[iPos], sSet[iPos], -1, 1); - g_esSpecific.g_iInextinguishableFireReward[iPos] = iGetClampedValue(key, "InextinguishableFireReward", "Inextinguishable Fire Reward", "Inextinguishable_Fire_Reward", "inexfire", g_esSpecific.g_iInextinguishableFireReward[iPos], sSet[iPos], -1, 1); - g_esSpecific.g_iInfiniteAmmoReward[iPos] = iGetClampedValue(key, "InfiniteAmmoReward", "Infinite Ammo Reward", "Infinite_Ammo_Reward", "infammo", g_esSpecific.g_iInfiniteAmmoReward[iPos], sSet[iPos], -1, 31); - g_esSpecific.g_iLadderActionsReward[iPos] = iGetClampedValue(key, "LadderActionsReward", "Ladder Actions Reward", "Ladder_Action_Reward", "ladderactions", g_esSpecific.g_iLadderActionsReward[iPos], sSet[iPos], -1, 1); - g_esSpecific.g_iLadyKillerReward[iPos] = iGetClampedValue(key, "LadyKillerReward", "Lady Killer Reward", "Lady_Killer_Reward", "ladykiller", g_esSpecific.g_iLadyKillerReward[iPos], sSet[iPos], -1, 99999); - g_esSpecific.g_iLaserSightReward[iPos] = iGetClampedValue(key, "LaserSightReward", "Laser Sight Reward", "Laser_Sight_Reward", "lasersight", g_esSpecific.g_iLaserSightReward[iPos], sSet[iPos], -1, 1); - g_esSpecific.g_iLifeLeechReward[iPos] = iGetClampedValue(key, "LifeLeechReward", "Life Leech Reward", "Life_Leech_Reward", "lifeleech", g_esSpecific.g_iLifeLeechReward[iPos], sSet[iPos], -1, MT_MAXHEALTH); - g_esSpecific.g_iMedicalCutsReward[iPos] = iGetClampedValue(key, "MedicalCutsReward", "Medical Cuts Reward", "Medical_Cuts_Reward", "medcuts", g_esSpecific.g_iMedicalCutsReward[iPos], sSet[iPos], -1, 1); - g_esSpecific.g_iMeleeRangeReward[iPos] = iGetClampedValue(key, "MeleeRangeReward", "Melee Range Reward", "Melee_Range_Reward", "meleerange", g_esSpecific.g_iMeleeRangeReward[iPos], sSet[iPos], -1, 99999); - g_esSpecific.g_iMidairDashesReward[iPos] = iGetClampedValue(key, "MidairDashesReward", "Midair Dashes Reward", "Midair_Dashes_Reward", "midairdashes", g_esSpecific.g_iMidairDashesReward[iPos], sSet[iPos], -1, 99999); - g_esSpecific.g_iParticleEffectVisual[iPos] = iGetClampedValue(key, "ParticleEffectVisual", "Particle Effect Visual", "Particle_Effect_Visual", "particle", g_esSpecific.g_iParticleEffectVisual[iPos], sSet[iPos], -1, 15); - g_esSpecific.g_iPrefsNotify[iPos] = iGetClampedValue(key, "PrefsNotify", "Prefs Notify", "Prefs_Notify", "pnotify", g_esSpecific.g_iPrefsNotify[iPos], sSet[iPos], -1, 1); - g_esSpecific.g_iRecoilDampenerReward[iPos] = iGetClampedValue(key, "RecoilDampenerReward", "Recoil Dampener Reward", "Recoil_Dampener_Reward", "recoil", g_esSpecific.g_iRecoilDampenerReward[iPos], sSet[iPos], -1, 1); - g_esSpecific.g_iRegenBurstsReward[iPos] = iGetClampedValue(key, "RegenBurstsReward", "Regen Bursts Reward", "Regen_Bursts_Reward", "regburst", g_esSpecific.g_iRegenBurstsReward[iPos], sSet[iPos], -1, 1); - g_esSpecific.g_iRespawnLoadoutReward[iPos] = iGetClampedValue(key, "RespawnLoadoutReward", "Respawn Loadout Reward", "Respawn_Loadout_Reward", "resloadout", g_esSpecific.g_iRespawnLoadoutReward[iPos], sSet[iPos], -1, 1); - g_esSpecific.g_iReviveHealthReward[iPos] = iGetClampedValue(key, "ReviveHealthReward", "Revive Health Reward", "Revive_Health_Reward", "revivehp", g_esSpecific.g_iReviveHealthReward[iPos], sSet[iPos], -1, MT_MAXHEALTH); - g_esSpecific.g_iShareRewards[iPos] = iGetClampedValue(key, "ShareRewards", "Share Rewards", "Share_Rewards", "share", g_esSpecific.g_iShareRewards[iPos], sSet[iPos], -1, 3); - g_esSpecific.g_iShovePenaltyReward[iPos] = iGetClampedValue(key, "ShovePenaltyReward", "Shove Penalty Reward", "Shove_Penalty_Reward", "shovepenalty", g_esSpecific.g_iShovePenaltyReward[iPos], sSet[iPos], -1, 1); - g_esSpecific.g_iSledgehammerRoundsReward[iPos] = iGetClampedValue(key, "SledgehammerRoundsReward", "Sledgehammer Rounds Reward", "Sledgehammer_Rounds_Reward", "sledgehammer", g_esSpecific.g_iSledgehammerRoundsReward[iPos], sSet[iPos], -1, 1); - g_esSpecific.g_iSpecialAmmoReward[iPos] = iGetClampedValue(key, "SpecialAmmoReward", "Special Ammo Reward", "Special_Ammo_Reward", "specialammo", g_esSpecific.g_iSpecialAmmoReward[iPos], sSet[iPos], -1, 3); - g_esSpecific.g_iStackRewards[iPos] = iGetClampedValue(key, "StackRewards", "Stack Rewards", "Stack_Rewards", "stack", g_esSpecific.g_iStackRewards[iPos], sSet[iPos], -1, 2147483647); - g_esSpecific.g_iStickyGrenadesReward[iPos] = iGetClampedValue(key, "StickyGrenadesReward", "Sticky Grenades Reward", "Sticky_Grenades_Reward", "sticky", g_esSpecific.g_iStickyGrenadesReward[iPos], sSet[iPos], -1, 1); - g_esSpecific.g_iSyringeDartsReward[iPos] = iGetClampedValue(key, "SyringeDartsReward", "Syringe Darts Reward", "Syringe_Darts_Reward", "syringe", g_esSpecific.g_iSyringeDartsReward[iPos], sSet[iPos], -1, 1); - g_esSpecific.g_iThornsReward[iPos] = iGetClampedValue(key, "ThornsReward", "Thorns Reward", "Thorns_Reward", "thorns", g_esSpecific.g_iThornsReward[iPos], sSet[iPos], -1, 1); - g_esSpecific.g_iUsefulRewards[iPos] = iGetClampedValue(key, "UsefulRewards", "Useful Rewards", "Useful_Rewards", "useful", g_esSpecific.g_iUsefulRewards[iPos], sSet[iPos], -1, 15); - g_esSpecific.g_iVoicePitchVisual[iPos] = iGetClampedValue(key, "VoicePitchVisual", "Voice Pitch Visual", "Voice_Pitch_Visual", "voicepitch", g_esSpecific.g_iVoicePitchVisual[iPos], sSet[iPos], -1, 255); - - vGetConfigColors(sValue, sizeof sValue, sSet[iPos], ';'); - vGetStringValue(key, "BodyColorVisual", "Body Color Visual", "Body_Color_Visual", "bodycolor", iPos, g_esSpecific.g_sBodyColorVisual, sizeof esSpecific::g_sBodyColorVisual, g_esSpecific.g_sBodyColorVisual2, sizeof esSpecific::g_sBodyColorVisual2, g_esSpecific.g_sBodyColorVisual3, sizeof esSpecific::g_sBodyColorVisual3, g_esSpecific.g_sBodyColorVisual4, sizeof esSpecific::g_sBodyColorVisual4, sValue); - vGetStringValue(key, "FallVoicelineReward", "Fall Voiceline Reward", "Fall_Voiceline_Reward", "fallvoice", iPos, g_esSpecific.g_sFallVoicelineReward, sizeof esSpecific::g_sFallVoicelineReward, g_esSpecific.g_sFallVoicelineReward2, sizeof esSpecific::g_sFallVoicelineReward2, g_esSpecific.g_sFallVoicelineReward3, sizeof esSpecific::g_sFallVoicelineReward3, g_esSpecific.g_sFallVoicelineReward4, sizeof esSpecific::g_sFallVoicelineReward4, sSet[iPos]); - vGetStringValue(key, "GlowColorVisual", "Glow Color Visual", "Glow_Color_Visual", "glowcolor", iPos, g_esSpecific.g_sOutlineColorVisual, sizeof esSpecific::g_sOutlineColorVisual, g_esSpecific.g_sOutlineColorVisual2, sizeof esSpecific::g_sOutlineColorVisual2, g_esSpecific.g_sOutlineColorVisual3, sizeof esSpecific::g_sOutlineColorVisual3, g_esSpecific.g_sOutlineColorVisual4, sizeof esSpecific::g_sOutlineColorVisual4, sValue); - vGetStringValue(key, "ItemReward", "Item Reward", "Item_Reward", "item", iPos, g_esSpecific.g_sItemReward, sizeof esSpecific::g_sItemReward, g_esSpecific.g_sItemReward2, sizeof esSpecific::g_sItemReward2, g_esSpecific.g_sItemReward3, sizeof esSpecific::g_sItemReward3, g_esSpecific.g_sItemReward4, sizeof esSpecific::g_sItemReward4, sSet[iPos]); - vGetStringValue(key, "LightColorVisual", "Light Color Visual", "Light_Color_Visual", "lightcolor", iPos, g_esSpecific.g_sLightColorVisual, sizeof esSpecific::g_sLightColorVisual, g_esSpecific.g_sLightColorVisual2, sizeof esSpecific::g_sLightColorVisual2, g_esSpecific.g_sLightColorVisual3, sizeof esSpecific::g_sLightColorVisual3, g_esSpecific.g_sLightColorVisual4, sizeof esSpecific::g_sLightColorVisual4, sValue); - vGetStringValue(key, "LoopingVoicelineVisual", "Looping Voiceline Visual", "Looping_Voiceline_Visual", "loopvoice", iPos, g_esSpecific.g_sLoopingVoicelineVisual, sizeof esSpecific::g_sLoopingVoicelineVisual, g_esSpecific.g_sLoopingVoicelineVisual2, sizeof esSpecific::g_sLoopingVoicelineVisual2, g_esSpecific.g_sLoopingVoicelineVisual3, sizeof esSpecific::g_sLoopingVoicelineVisual3, g_esSpecific.g_sLoopingVoicelineVisual4, sizeof esSpecific::g_sLoopingVoicelineVisual4, sSet[iPos]); - vGetStringValue(key, "ScreenColorVisual", "Screen Color Visual", "Screen_Color_Visual", "screencolor", iPos, g_esSpecific.g_sScreenColorVisual, sizeof esSpecific::g_sScreenColorVisual, g_esSpecific.g_sScreenColorVisual2, sizeof esSpecific::g_sScreenColorVisual2, g_esSpecific.g_sScreenColorVisual3, sizeof esSpecific::g_sScreenColorVisual3, g_esSpecific.g_sScreenColorVisual4, sizeof esSpecific::g_sScreenColorVisual4, sValue); - } + g_esMob.g_iMobVariants = iGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "MobVariants", "Mob Variants", "Mob_Variants", "mobvariants ", g_esMob.g_iMobVariants, value, -1, 3); + g_esMob.g_flCommonBioChance = flGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "CommonBioChance", "Common Bio Chance", "Common_Bio_Chance", "commbiochance", g_esMob.g_flCommonBioChance, value, -1.0, 100.0); + g_esMob.g_flCommonChance = flGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "CommonChance", "Common Chance", "Common_Chance", "commchance", g_esMob.g_flCommonChance, value, -1.0, 100.0); + g_esMob.g_flCommonCheck = flGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "CommonCheck", "Common Check", "Common_Check", "commcheck", g_esMob.g_flCommonCheck, value, -1.0, 99999.0); + g_esMob.g_flCommonDamagePoints = flGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "CommonDamagePoints", "Common Damage Points", "Common_Damage_Points", "commdmgpoints", g_esMob.g_flCommonDamagePoints, value, -1.0, float(MT_MAXHEALTH)); + g_esMob.g_flCommonDeathPoints = flGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "CommonDeathPoints", "Common Death Points", "Common_Death_Points", "commdeathpoints", g_esMob.g_flCommonDeathPoints, value, -1.0, float(MT_MAXHEALTH)); + g_esMob.g_iCommonFilter = iGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "CommonFilter", "Common Filter", "Common_Filter", "commfilter", g_esMob.g_iCommonFilter, value, -1, 127); + g_esMob.g_flCommonGoal = flGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "CommonGoal", "Common Goal", "Common_Goal", "commgoal", g_esMob.g_flCommonGoal, value, -1.0, float(MT_MAXHEALTH)); + g_esMob.g_iCommonVariant = iGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "CommonVariant", "Common Variant", "Common_Variant", "commvariant", g_esMob.g_iCommonVariant, value, -1, 255); + g_esMob.g_flWitchChance = flGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "WitchChance", "Witch Chance", "Witch_Chance", "witchchance", g_esMob.g_flWitchChance, value, -1.0, 100.0); + g_esMob.g_iWitchFilter = iGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "WitchFilter", "Witch Filter", "Witch_Filter", "witchfilter", g_esMob.g_iWitchFilter, value, -1, 511); + g_esMob.g_iWitchMode = iGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "WitchMode", "Witch Mode", "Witch_Mode", "witchmode", g_esMob.g_iWitchMode, value, -1, 1); + g_esMob.g_flWitchMutateChance = flGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "WitchMutateChance", "Witch Mutate Chance", "Witch_Mutate_Chance", "witchmutatechance", g_esMob.g_flWitchMutateChance, value, -1.0, 100.0); + g_esMob.g_flWitchRange = flGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "WitchRange", "Witch Range", "Witch_Range", "witchrange", g_esMob.g_flWitchRange, value, -1.0, 99999.0); + g_esMob.g_iWitchTypes = iGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "WitchTypes", "Witch Types", "Witch_Types", "witchtypes", g_esMob.g_iWitchTypes, value, -1, 7); + g_esMob.g_iDisplayHealth = iGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "DisplayHealth", "Display Health", "Display_Health", "displayhp", g_esMob.g_iDisplayHealth, value, -1, 11); + g_esMob.g_iDisplayHealthType = iGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "DisplayHealthType", "Display Health Type", "Display_Health_Type", "displaytype", g_esMob.g_iDisplayHealthType, value, -1, 2); - g_esSpecific.g_iStackLimits[iPos] = iGetClampedValue(key, "StackLimits", "Stack Limits", "Stack_Limits", "limits", g_esSpecific.g_iStackLimits[iPos], sSet[iPos], -1, 99999); - } - } - else if (StrEqual(subsection, MT_CONFIG_SECTION_HEALTH, false)) - { - char sSettings[4][128]; - for (int iPos = 0; iPos < (sizeof g_sSpecialNames); iPos++) - { - vGetSpecialSettingNames(sSettings, sizeof sSettings[], "BaseHealth", "Base Health", "Base_Health", "basehp", iPos); - g_esSpecific.g_iBaseHealth[iPos] = iGetClampedValue(key, sSettings[0], sSettings[1], sSettings[2], sSettings[3], g_esSpecific.g_iBaseHealth[iPos], value, -1, MT_MAXHEALTH); - vGetSpecialSettingNames(sSettings, sizeof sSettings[], "ExtraHealth", "Extra Health", "Extra_Health", "extrahp", iPos); - g_esSpecific.g_iExtraHealth[iPos] = iGetClampedValue(key, sSettings[0], sSettings[1], sSettings[2], sSettings[3], g_esSpecific.g_iExtraHealth[iPos], value, MT_MAX_HEALTH_REDUCTION, MT_MAXHEALTH); - } + vGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "HealthCharacters", "Health Characters", "Health_Characters", "hpchars", g_esMob.g_sHealthCharacters, sizeof esMob::g_sHealthCharacters, value); } vConfigsLoadedForward(subsection, key, value, -1, -1, mode, true, specsection); @@ -17080,10 +22504,10 @@ void vReadTankSettings(int type, int mode, const char[] subsection, const char[] g_esTank[iIndex].g_iTankEnabled = iGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "TankEnabled", "Tank Enabled", "Tank_Enabled", "tenabled", g_esTank[iIndex].g_iTankEnabled, value, -1, 1); g_esTank[iIndex].g_iGameType = iGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "GameType", "Game Type", "Game_Type", "game", g_esTank[iIndex].g_iGameType, value, -1, 2); g_esTank[iIndex].g_flTankChance = flGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "TankChance", "Tank Chance", "Tank_Chance", "chance", g_esTank[iIndex].g_flTankChance, value, -1.0, 100.0); + g_esTank[iIndex].g_iTankNote = iGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "TankNote", "Tank Note", "Tank_Note", "note", g_esTank[iIndex].g_iTankNote, value, -1, 1); g_esTank[iIndex].g_iTankModel = iGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "TankModel", "Tank Model", "Tank_Model", "model", g_esTank[iIndex].g_iTankModel, value, -1, 7); g_esTank[iIndex].g_flBurnDuration = flGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "BurnDuration", "Burn Duration", "Burn_Duration", "burndur", g_esTank[iIndex].g_flBurnDuration, value, -1.0, 99999.0); g_esTank[iIndex].g_flBurntSkin = flGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "BurntSkin", "Burnt Skin", "Burnt_Skin", "burnt", g_esTank[iIndex].g_flBurntSkin, value, -2.0, 1.0); - g_esTank[iIndex].g_iTankNote = iGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "TankNote", "Tank Note", "Tank_Note", "note", g_esTank[iIndex].g_iTankNote, value, -1, 1); g_esTank[iIndex].g_iSpawnEnabled = iGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "SpawnEnabled", "Spawn Enabled", "Spawn_Enabled", "spawn", g_esTank[iIndex].g_iSpawnEnabled, value, -1, 1); g_esTank[iIndex].g_iMenuEnabled = iGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "MenuEnabled", "Menu Enabled", "Menu_Enabled", "menu", g_esTank[iIndex].g_iMenuEnabled, value, -1, 1); g_esTank[iIndex].g_iCheckAbilities = iGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "CheckAbilities", "Check Abilities", "Check_Abilities", "check", g_esTank[iIndex].g_iCheckAbilities, value, -1, 1); @@ -17107,6 +22531,13 @@ void vReadTankSettings(int type, int mode, const char[] subsection, const char[] g_esTank[iIndex].g_iGlowFlashing = iGetKeyValue(subsection, MT_CONFIG_SECTION_GLOW, MT_CONFIG_SECTION_GLOW, MT_CONFIG_SECTION_GLOW, MT_CONFIG_SECTION_GLOW, key, "GlowFlashing", "Glow Flashing", "Glow_Flashing", "flashing", g_esTank[iIndex].g_iGlowFlashing, value, -1, 1); g_esTank[iIndex].g_iGlowType = iGetKeyValue(subsection, MT_CONFIG_SECTION_GLOW, MT_CONFIG_SECTION_GLOW, MT_CONFIG_SECTION_GLOW, MT_CONFIG_SECTION_GLOW, key, "GlowType", "Glow Type", "Glow_Type", "type", g_esTank[iIndex].g_iGlowType, value, -1, 1); g_esTank[iIndex].g_iBaseHealth = iGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "BaseHealth", "Base Health", "Base_Health", "basehp", g_esTank[iIndex].g_iBaseHealth, value, -1, MT_MAXHEALTH); + g_esTank[iIndex].g_flArmorPercentage = flGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "ArmorPercentage", "Armor Percentage", "Armor_Percentage", "armorpercent", g_esTank[iIndex].g_flArmorPercentage, value, -1.0, 1.0); + g_esTank[iIndex].g_flArmorResistance[0] = flGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "ArmorResistance", "Armor Resistance", "Armor_Resistance", "armorres", g_esTank[iIndex].g_flArmorResistance[0], value, -1.0, 1.0); + g_esTank[iIndex].g_flShieldPercentage = flGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "ShieldPercentage", "Shield Percentage", "Shield_Percentage", "shieldpercent", g_esTank[iIndex].g_flShieldPercentage, value, -1.0, 1.0); + g_esTank[iIndex].g_flShieldRate = flGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "ShieldRate", "Shield Rate", "Shield_Rate", "shieldrate", g_esTank[iIndex].g_flShieldRate, value, -1.0, 1.0); + g_esTank[iIndex].g_flPassiveDelay = flGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "PassiveDelay", "Passive Delay", "Passive_Delay", "passdelay", g_esTank[iIndex].g_flPassiveDelay, value, -1.0, 99999.0); + g_esTank[iIndex].g_iPassiveHealth = iGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "PassiveHealth", "Passive Health", "Passive_Health", "passhp", g_esTank[iIndex].g_iPassiveHealth, value, MT_MAX_HEALTH_REDUCTION, MT_MAXHEALTH); + g_esTank[iIndex].g_flPassiveInterval = flGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "PassiveInterval", "Passive Interval", "Passive_Interval", "passint", g_esTank[iIndex].g_flPassiveInterval, value, -1.0, 99999.0); g_esTank[iIndex].g_iDisplayHealth = iGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "DisplayHealth", "Display Health", "Display_Health", "displayhp", g_esTank[iIndex].g_iDisplayHealth, value, -1, 11); g_esTank[iIndex].g_iDisplayHealthType = iGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "DisplayHealthType", "Display Health Type", "Display_Health_Type", "displaytype", g_esTank[iIndex].g_iDisplayHealthType, value, -1, 2); g_esTank[iIndex].g_iExtraHealth = iGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "ExtraHealth", "Extra Health", "Extra_Health", "extrahp", g_esTank[iIndex].g_iExtraHealth, value, MT_MAX_HEALTH_REDUCTION, MT_MAXHEALTH); @@ -17114,11 +22545,11 @@ void vReadTankSettings(int type, int mode, const char[] subsection, const char[] g_esTank[iIndex].g_iHumanMultiplierMode = iGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "HumanMultiplierMode", "Human Multiplier Mode", "Human_Multiplier_Mode", "humanmultimode", g_esTank[iIndex].g_iHumanMultiplierMode, value, -1, 1); g_esTank[iIndex].g_iMinimumHumans = iGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "MinimumHumans", "Minimum Humans", "Minimum_Humans", "minhumans", g_esTank[iIndex].g_iMinimumHumans, value, -1, 32); g_esTank[iIndex].g_iMultiplyHealth = iGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "MultiplyHealth", "Multiply Health", "Multiply_Health", "multihp", g_esTank[iIndex].g_iMultiplyHealth, value, -1, 3); - g_esTank[iIndex].g_iSpawnProtection = iGetKeyValue(subsection, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION2, key, "SpawnProtection", "Spawn Protection", "Spawn_Protection", "protect", g_esTank[iIndex].g_iSpawnProtection, value, -1, 3); - g_esTank[iIndex].g_flArmorDuration = flGetKeyValue(subsection, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION2, key, "ArmorDuration", "Armor Duration", "Armor_Duration", "armorduration", g_esTank[iIndex].g_flArmorDuration, value, -1.0, 99999.0); - g_esTank[iIndex].g_flArmorResistance = flGetKeyValue(subsection, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION2, key, "ArmorResistance", "Armor Resistance", "Armor_Resistance", "armorres", g_esTank[iIndex].g_flArmorResistance, value, -1.0, 1.0); - g_esTank[iIndex].g_flShieldDuration = flGetKeyValue(subsection, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION2, key, "ShieldDuration", "Shield Duration", "Shield_Duration", "shieldduration", g_esTank[iIndex].g_flShieldDuration, value, -1.0, 99999.0); - g_esTank[iIndex].g_flShieldResistance = flGetKeyValue(subsection, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION2, key, "ShieldResistance", "Shield Resistance", "Shield_Resistance", "shieldres", g_esTank[iIndex].g_flShieldResistance, value, -1.0, 1.0); + g_esTank[iIndex].g_iSpawnProtection = iGetKeyValue(subsection, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT2, key, "SpawnProtection", "Spawn Protection", "Spawn_Protection", "protect", g_esTank[iIndex].g_iSpawnProtection, value, -1, 3); + g_esTank[iIndex].g_flArmorDuration = flGetKeyValue(subsection, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT2, key, "ArmorDuration", "Armor Duration", "Armor_Duration", "armorduration", g_esTank[iIndex].g_flArmorDuration, value, -1.0, 99999.0); + g_esTank[iIndex].g_flArmorResistance[1] = flGetKeyValue(subsection, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT2, key, "ArmorResistance", "Armor Resistance", "Armor_Resistance", "armorres", g_esTank[iIndex].g_flArmorResistance[1], value, -1.0, 1.0); + g_esTank[iIndex].g_flShieldDuration = flGetKeyValue(subsection, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT2, key, "ShieldDuration", "Shield Duration", "Shield_Duration", "shieldduration", g_esTank[iIndex].g_flShieldDuration, value, -1.0, 99999.0); + g_esTank[iIndex].g_flShieldResistance = flGetKeyValue(subsection, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT2, key, "ShieldResistance", "Shield Resistance", "Shield_Resistance", "shieldres", g_esTank[iIndex].g_flShieldResistance, value, -1.0, 1.0); g_esTank[iIndex].g_iHumanSupport = iGetKeyValue(subsection, MT_CONFIG_SECTION_HUMAN, MT_CONFIG_SECTION_HUMAN2, MT_CONFIG_SECTION_HUMAN3, MT_CONFIG_SECTION_HUMAN4, key, MT_CONFIG_SECTION_HUMAN, MT_CONFIG_SECTION_HUMAN2, MT_CONFIG_SECTION_HUMAN3, MT_CONFIG_SECTION_HUMAN4, g_esTank[iIndex].g_iHumanSupport, value, -1, 2); g_esTank[iIndex].g_iTypeLimit = iGetKeyValue(subsection, MT_CONFIG_SECTION_SPAWN, MT_CONFIG_SECTION_SPAWN, MT_CONFIG_SECTION_SPAWN, MT_CONFIG_SECTION_SPAWN, key, "TypeLimit", "Type Limit", "Type_Limit", "typelimit", g_esTank[iIndex].g_iTypeLimit, value, -1, 32); g_esTank[iIndex].g_iFinaleTank = iGetKeyValue(subsection, MT_CONFIG_SECTION_SPAWN, MT_CONFIG_SECTION_SPAWN, MT_CONFIG_SECTION_SPAWN, MT_CONFIG_SECTION_SPAWN, key, "FinaleTank", "Finale Tank", "Finale_Tank", "finale", g_esTank[iIndex].g_iFinaleTank, value, -1, 4); @@ -17139,6 +22570,7 @@ void vReadTankSettings(int type, int mode, const char[] subsection, const char[] g_esTank[iIndex].g_iBodyEffects = iGetKeyValue(subsection, MT_CONFIG_SECTION_PARTICLES, MT_CONFIG_SECTION_PARTICLES, MT_CONFIG_SECTION_PARTICLES, MT_CONFIG_SECTION_PARTICLES, key, "BodyEffects", "Body Effects", "Body_Effects", "body", g_esTank[iIndex].g_iBodyEffects, value, -1, 127); g_esTank[iIndex].g_iRockEffects = iGetKeyValue(subsection, MT_CONFIG_SECTION_PARTICLES, MT_CONFIG_SECTION_PARTICLES, MT_CONFIG_SECTION_PARTICLES, MT_CONFIG_SECTION_PARTICLES, key, "RockEffects", "Rock Effects", "Rock_Effects", "rock", g_esTank[iIndex].g_iRockEffects, value, -1, 15); g_esTank[iIndex].g_flAttackInterval = flGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "AttackInterval", "Attack Interval", "Attack_Interval", "attack", g_esTank[iIndex].g_flAttackInterval, value, -1.0, 99999.0); + g_esTank[iIndex].g_iAutoHop = iGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "BunnyHop", "Bunny Hop", "Bunny_Hop", "bhop", g_esTank[iIndex].g_iAutoHop, value, -1, 1); g_esTank[iIndex].g_flClawDamage = flGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "ClawDamage", "Claw Damage", "Claw_Damage", "claw", g_esTank[iIndex].g_flClawDamage, value, -2.0, 99999.0); g_esTank[iIndex].g_iFootstepShake = iGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "FootstepShake", "Footstep Shake", "Footstep_Shake", "shake", g_esTank[iIndex].g_iFootstepShake, value, -1, 1); g_esTank[iIndex].g_iGroundPound = iGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "GroundPound", "Ground Pound", "Ground_Pound", "pound", g_esTank[iIndex].g_iGroundPound, value, -1, 1); @@ -17167,7 +22599,9 @@ void vReadTankSettings(int type, int mode, const char[] subsection, const char[] g_esTank[iIndex].g_iAccessFlags = iGetAdminFlagsValue(subsection, MT_CONFIG_SECTION_ADMIN, MT_CONFIG_SECTION_ADMIN, MT_CONFIG_SECTION_ADMIN, MT_CONFIG_SECTION_ADMIN2, key, "AccessFlags", "Access Flags", "Access_Flags", "access", value); g_esTank[iIndex].g_iImmunityFlags = iGetAdminFlagsValue(subsection, MT_CONFIG_SECTION_ADMIN, MT_CONFIG_SECTION_ADMIN, MT_CONFIG_SECTION_ADMIN, MT_CONFIG_SECTION_ADMIN2, key, "ImmunityFlags", "Immunity Flags", "Immunity_Flags", "immunity", value); + vGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "ArmorCharacters", "Armor Characters", "Armor_Characters", "armorchars", g_esTank[iIndex].g_sArmorCharacters, sizeof esTank::g_sArmorCharacters, value); vGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "HealthCharacters", "Health Characters", "Health_Characters", "hpchars", g_esTank[iIndex].g_sHealthCharacters, sizeof esTank::g_sHealthCharacters, value); + vGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "ShieldCharacters", "Shield Characters", "Shield_Characters", "shieldchars", g_esTank[iIndex].g_sShieldCharacters, sizeof esTank::g_sShieldCharacters, value); vGetKeyValue(subsection, MT_CONFIG_SECTION_COMBO, MT_CONFIG_SECTION_COMBO, MT_CONFIG_SECTION_COMBO, MT_CONFIG_SECTION_COMBO, key, "ComboSet", "Combo Set", "Combo_Set", "set", g_esTank[iIndex].g_sComboSet, sizeof esTank::g_sComboSet, value); if (StrEqual(subsection, MT_CONFIG_SECTION_GENERAL, false)) @@ -17186,12 +22620,13 @@ void vReadTankSettings(int type, int mode, const char[] subsection, const char[] } else { + vGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "TankClass", "Tank Class", "Tank_Class", "class", g_esTank[iIndex].g_sTankClass, sizeof esTank::g_sTankClass, value); vGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "TankName", "Tank Name", "Tank_Name", "name", g_esTank[iIndex].g_sTankName, sizeof esTank::g_sTankName, value); } } else if (StrEqual(subsection, MT_CONFIG_SECTION_REWARDS, false)) { - char sValue[1280], sSet[8][320]; + char sValue[2560], sSet[8][320]; strcopy(sValue, sizeof sValue, value); ReplaceString(sValue, sizeof sValue, " ", ""); ExplodeString(sValue, ",", sSet, sizeof sSet, sizeof sSet[]); @@ -17203,57 +22638,76 @@ void vReadTankSettings(int type, int mode, const char[] subsection, const char[] g_esTank[iIndex].g_flRewardDuration[iPos] = flGetClampedValue(key, "RewardDuration", "Reward Duration", "Reward_Duration", "duration", g_esTank[iIndex].g_flRewardDuration[iPos], sSet[iPos], -1.0, 99999.0); g_esTank[iIndex].g_flRewardPercentage[iPos] = flGetClampedValue(key, "RewardPercentage", "Reward Percentage", "Reward_Percentage", "percent", g_esTank[iIndex].g_flRewardPercentage[iPos], sSet[iPos], -1.0, 100.0); g_esTank[iIndex].g_flActionDurationReward[iPos] = flGetClampedValue(key, "ActionDurationReward", "Action Duration Reward", "Action_Duration_Reward", "actionduration", g_esTank[iIndex].g_flActionDurationReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esTank[iIndex].g_flAdrenalineTimeReward[iPos] = flGetClampedValue(key, "AdrenalineTimeReward", "Adrenaline Time Reward", "Adrenaline_Time_Reward", "adrenaline", g_esTank[iIndex].g_flAdrenalineTimeReward[iPos], sSet[iPos], -1.0, 99999.0); g_esTank[iIndex].g_flAttackBoostReward[iPos] = flGetClampedValue(key, "AttackBoostReward", "Attack Boost Reward", "Attack_Boost_Reward", "attackboost", g_esTank[iIndex].g_flAttackBoostReward[iPos], sSet[iPos], -1.0, 99999.0); g_esTank[iIndex].g_flDamageBoostReward[iPos] = flGetClampedValue(key, "DamageBoostReward", "Damage Boost Reward", "Damage_Boost_Reward", "dmgboost", g_esTank[iIndex].g_flDamageBoostReward[iPos], sSet[iPos], -1.0, 99999.0); g_esTank[iIndex].g_flDamageResistanceReward[iPos] = flGetClampedValue(key, "DamageResistanceReward", "Damage Resistance Reward", "Damage_Resistance_Reward", "dmgres", g_esTank[iIndex].g_flDamageResistanceReward[iPos], sSet[iPos], -1.0, 1.0); + g_esTank[iIndex].g_flDopamineRadiusReward[iPos] = flGetClampedValue(key, "DopamineRadiusReward", "Dopamine Radius Reward", "Dopamine_Radius_Reward", "dopamine", g_esTank[iIndex].g_flDopamineRadiusReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esTank[iIndex].g_flFireRateReward[iPos] = flGetClampedValue(key, "FireRateReward", "Fire Rate Reward", "Fire_Rate_Reward", "firerate", g_esTank[iIndex].g_flFireRateReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esTank[iIndex].g_flGrenadeLauncherReward[iPos] = flGetClampedValue(key, "GrenadeLauncherReward", "Grenade Launcher Reward", "Grenade_Launcher_Reward", "grenade", g_esTank[iIndex].g_flGrenadeLauncherReward[iPos], sSet[iPos], -1.0, 100.0); g_esTank[iIndex].g_flHealPercentReward[iPos] = flGetClampedValue(key, "HealPercentReward", "Heal Percent Reward", "Heal_Percent_Reward", "healpercent", g_esTank[iIndex].g_flHealPercentReward[iPos], sSet[iPos], -1.0, 100.0); + g_esTank[iIndex].g_flHealthcareRadiusReward[iPos] = flGetClampedValue(key, "HealthcareRadiusReward", "Healthcare Radius Reward", "Healthcare_Radius_Reward", "healthcare", g_esTank[iIndex].g_flHealthcareRadiusReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esTank[iIndex].g_flHeartbeatReward[iPos] = flGetClampedValue(key, "HeartbeatReward", "Heartbeat Reward", "Heartbeat_Reward", "heartbeat", g_esTank[iIndex].g_flHeartbeatReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esTank[iIndex].g_flHollowpointAmmoReward[iPos] = flGetClampedValue(key, "HollowpointAmmoReward", "Hollowpoint Ammo Reward", "Hollowpoint_Ammo_Reward", "hollowpoint", g_esTank[iIndex].g_flHollowpointAmmoReward[iPos], sSet[iPos], -1.0, 100.0); g_esTank[iIndex].g_flJumpHeightReward[iPos] = flGetClampedValue(key, "JumpHeightReward", "Jump Height Reward", "Jump_Height_Reward", "jumpheight", g_esTank[iIndex].g_flJumpHeightReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esTank[iIndex].g_flLadyKillerReward[iPos] = flGetClampedValue(key, "LadyKillerReward", "Lady Killer Reward", "Lady_Killer_Reward", "ladykiller", g_esTank[iIndex].g_flLadyKillerReward[iPos], sSet[iPos], -1.0, 100.0); g_esTank[iIndex].g_flLoopingVoicelineInterval[iPos] = flGetClampedValue(key, "LoopingVoicelineInterval", "Looping Voiceline Interval", "Looping_Voiceline_Interval", "loopinterval", g_esTank[iIndex].g_flLoopingVoicelineInterval[iPos], sSet[iPos], -1.0, 99999.0); + g_esTank[iIndex].g_flLuckyBulletReward[iPos] = flGetClampedValue(key, "LuckyBulletReward", "Lucky Bullet Reward", "Lucky_Bullet_Reward", "luckybullet", g_esTank[iIndex].g_flLuckyBulletReward[iPos], sSet[iPos], -1.0, 100.0); + g_esTank[iIndex].g_flMotivationRadiusReward[iPos] = flGetClampedValue(key, "MotivationRadiusReward", "Motivation Radius Reward", "Motivation_Radius_Reward", "motivation", g_esTank[iIndex].g_flMotivationRadiusReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esTank[iIndex].g_flOverdoseRadiusReward[iPos] = flGetClampedValue(key, "OverdoseRadiusReward", "Overdose Radius Reward", "Overdose_Radius_Reward", "overdose", g_esTank[iIndex].g_flOverdoseRadiusReward[iPos], sSet[iPos], -1.0, 99999.0); g_esTank[iIndex].g_flPipeBombDurationReward[iPos] = flGetClampedValue(key, "PipebombDurationReward", "Pipebomb Duration Reward", "Pipebomb_Duration_Reward", "pipeduration", g_esTank[iIndex].g_flPipeBombDurationReward[iPos], sSet[iPos], -1.0, 99999.0); g_esTank[iIndex].g_flPunchResistanceReward[iPos] = flGetClampedValue(key, "PunchResistanceReward", "Punch Resistance Reward", "Punch_Resistance_Reward", "punchres", g_esTank[iIndex].g_flPunchResistanceReward[iPos], sSet[iPos], -1.0, 1.0); - g_esTank[iIndex].g_flRapidPistolReward[iPos] = flGetClampedValue(key, "RapidPistolReward", "Rapid Pistol Reward", "Rapid_Pistol_Reward", "rapid", g_esTank[iIndex].g_flRapidPistolReward[iPos], sSet[iPos], -1.0, 1.0); + g_esTank[iIndex].g_flRapidPistolReward[iPos] = flGetClampedValue(key, "RapidPistolReward", "Rapid Pistol Reward", "Rapid_Pistol_Reward", "rapidpistol", g_esTank[iIndex].g_flRapidPistolReward[iPos], sSet[iPos], -1.0, 1.0); g_esTank[iIndex].g_flRefillPercentReward[iPos] = flGetClampedValue(key, "RefillPercentReward", "Refill Percent Reward", "Refill_Percent_Reward", "refillpercent", g_esTank[iIndex].g_flRefillPercentReward[iPos], sSet[iPos], -1.0, 100.0); + g_esTank[iIndex].g_flReloadRateReward[iPos] = flGetClampedValue(key, "ReloadRateReward", "Reload Rate Reward", "Reload_Rate_Reward", "reloadrate", g_esTank[iIndex].g_flReloadRateReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esTank[iIndex].g_flShockwaveRadiusReward[iPos] = flGetClampedValue(key, "ShockwaveRadiusReward", "Shockwave Radius Reward", "Shockwave_Radius_Reward", "shockwave", g_esTank[iIndex].g_flShockwaveRadiusReward[iPos], sSet[iPos], -1.0, 99999.0); g_esTank[iIndex].g_flShoveDamageReward[iPos] = flGetClampedValue(key, "ShoveDamageReward", "Shove Damage Reward", "Shove_Damage_Reward", "shovedmg", g_esTank[iIndex].g_flShoveDamageReward[iPos], sSet[iPos], -1.0, 99999.0); g_esTank[iIndex].g_flShoveRateReward[iPos] = flGetClampedValue(key, "ShoveRateReward", "Shove Rate Reward", "Shove_Rate_Reward", "shoverate", g_esTank[iIndex].g_flShoveRateReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esTank[iIndex].g_flSledgehammerRoundsReward[iPos] = flGetClampedValue(key, "SledgehammerRoundsReward", "Sledgehammer Rounds Reward", "Sledgehammer_Rounds_Reward", "sledgehammer", g_esTank[iIndex].g_flSledgehammerRoundsReward[iPos], sSet[iPos], -1.0, 100.0); g_esTank[iIndex].g_flSpeedBoostReward[iPos] = flGetClampedValue(key, "SpeedBoostReward", "Speed Boost Reward", "Speed_Boost_Reward", "speedboost", g_esTank[iIndex].g_flSpeedBoostReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esTank[iIndex].g_flSupplierReward[iPos] = flGetClampedValue(key, "SupplierPassive", "Supplier Passive", "Supplier_Passive", "supplier", g_esTank[iIndex].g_flSupplierReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esTank[iIndex].g_flSwingRateReward[iPos] = flGetClampedValue(key, "SwingRateReward", "Swing Rate Reward", "Swing_Rate_Reward", "swingrate", g_esTank[iIndex].g_flSwingRateReward[iPos], sSet[iPos], -1.0, 99999.0); g_esTank[iIndex].g_iRewardEnabled[iPos] = iGetClampedValue(key, "RewardEnabled", "Reward Enabled", "Reward_Enabled", "renabled", g_esTank[iIndex].g_iRewardEnabled[iPos], sSet[iPos], -2, 2147483647); - g_esTank[iIndex].g_iRewardBots[iPos] = iGetClampedValue(key, "RewardBots", "Reward Bots", "Reward_Bots", "bots", g_esTank[iIndex].g_iRewardBots[iPos], sSet[iPos], -2, 2147483647); + g_esTank[iIndex].g_iRewardBots[iPos] = iGetClampedValue(key, "RewardBots", "Reward Bots", "Reward_Bots", "rbots", g_esTank[iIndex].g_iRewardBots[iPos], sSet[iPos], -2, 2147483647); g_esTank[iIndex].g_iRewardEffect[iPos] = iGetClampedValue(key, "RewardEffect", "Reward Effect", "Reward_Effect", "effect", g_esTank[iIndex].g_iRewardEffect[iPos], sSet[iPos], -1, 15); g_esTank[iIndex].g_iRewardNotify[iPos] = iGetClampedValue(key, "RewardNotify", "Reward Notify", "Reward_Notify", "rnotify", g_esTank[iIndex].g_iRewardNotify[iPos], sSet[iPos], -1, 3); g_esTank[iIndex].g_iRewardVisual[iPos] = iGetClampedValue(key, "RewardVisual", "Reward Visual", "Reward_Visual", "visual", g_esTank[iIndex].g_iRewardVisual[iPos], sSet[iPos], -1, 127); g_esTank[iIndex].g_iAmmoBoostReward[iPos] = iGetClampedValue(key, "AmmoBoostReward", "Ammo Boost Reward", "Ammo_Boost_Reward", "ammoboost", g_esTank[iIndex].g_iAmmoBoostReward[iPos], sSet[iPos], -1, 1); + g_esTank[iIndex].g_iAmmoRefillReward[iPos] = iGetClampedValue(key, "AmmoRefillReward", "Ammo Refill Reward", "Ammo_Refill_Reward", "ammorefill", g_esTank[iIndex].g_iAmmoRefillReward[iPos], sSet[iPos], -1, 1); g_esTank[iIndex].g_iAmmoRegenReward[iPos] = iGetClampedValue(key, "AmmoRegenReward", "Ammo Regen Reward", "Ammo_Regen_Reward", "ammoregen", g_esTank[iIndex].g_iAmmoRegenReward[iPos], sSet[iPos], -1, 99999); - g_esTank[iIndex].g_iBlazeHealthReward[iPos] = iGetClampedValue(key, "BlazeHealthReward", "Blaze Health Reward", "Blaze_Health_Reward", "blaze", g_esTank[iIndex].g_iBlazeHealthReward[iPos], sSet[iPos], -1, 1); + g_esTank[iIndex].g_iBlazeHealthReward[iPos] = iGetClampedValue(key, "BlazeHealthReward", "Blaze Health Reward", "Blaze_Health_Reward", "blaze", g_esTank[iIndex].g_iBlazeHealthReward[iPos], sSet[iPos], -1, MT_MAXHEALTH); + g_esTank[iIndex].g_iBloodDonorReward[iPos] = iGetClampedValue(key, "BloodDonorReward", "Blood Donor Reward", "Blood_Donor_Reward", "donor", g_esTank[iIndex].g_iBloodDonorReward[iPos], sSet[iPos], -1, MT_MAXHEALTH); g_esTank[iIndex].g_iBunnyHopReward[iPos] = iGetClampedValue(key, "BunnyHopReward", "Bunny Hop Reward", "Bunny_Hop_Reward", "bhop", g_esTank[iIndex].g_iBunnyHopReward[iPos], sSet[iPos], -1, 1); g_esTank[iIndex].g_iBurstDoorsReward[iPos] = iGetClampedValue(key, "BurstDoorsReward", "Burst Doors Reward", "Burst_Doors_Reward", "burstdoors", g_esTank[iIndex].g_iBurstDoorsReward[iPos], sSet[iPos], -1, 1); g_esTank[iIndex].g_iCleanKillsReward[iPos] = iGetClampedValue(key, "CleanKillsReward", "Clean Kills Reward", "Clean_Kills_Reward", "cleankills", g_esTank[iIndex].g_iCleanKillsReward[iPos], sSet[iPos], -1, 1); g_esTank[iIndex].g_iClusterBombsReward[iPos] = iGetClampedValue(key, "ClusterBombsReward", "Cluster Bombs Reward", "Cluster_Bombs_Reward", "cluster", g_esTank[iIndex].g_iClusterBombsReward[iPos], sSet[iPos], -1, 5); + g_esTank[iIndex].g_iEternalFlamesReward[iPos] = iGetClampedValue(key, "EternalFlamesReward", "Eternal Flames Reward", "Eternal_Flames_Reward", "eternal", g_esTank[iIndex].g_iEternalFlamesReward[iPos], sSet[iPos], -1, 1); + g_esTank[iIndex].g_iFastRecoveryReward[iPos] = iGetClampedValue(key, "FastRecoveryReward", "Fast Recovery Reward", "Fast_Recovery_Reward", "fastrecovery", g_esTank[iIndex].g_iFastRecoveryReward[iPos], sSet[iPos], -1, 1); g_esTank[iIndex].g_iFriendlyFireReward[iPos] = iGetClampedValue(key, "FriendlyFireReward", "Friendly Fire Reward", "Friendly_Fire_Reward", "friendlyfire", g_esTank[iIndex].g_iFriendlyFireReward[iPos], sSet[iPos], -1, 1); g_esTank[iIndex].g_iGhostBulletsReward[iPos] = iGetClampedValue(key, "GhostBulletsReward", "Ghost Bullets Reward", "Ghost_Bullets_Reward", "ghost", g_esTank[iIndex].g_iGhostBulletsReward[iPos], sSet[iPos], -1, 1); g_esTank[iIndex].g_iHealthRegenReward[iPos] = iGetClampedValue(key, "HealthRegenReward", "Health Regen Reward", "Health_Regen_Reward", "hpregen", g_esTank[iIndex].g_iHealthRegenReward[iPos], sSet[iPos], -1, MT_MAXHEALTH); - g_esTank[iIndex].g_iHollowpointAmmoReward[iPos] = iGetClampedValue(key, "HollowpointAmmoReward", "Hollowpoint Ammo Reward", "Hollowpoint_Ammo_Reward", "hollowpoint", g_esTank[iIndex].g_iHollowpointAmmoReward[iPos], sSet[iPos], -1, 1); - g_esTank[iIndex].g_iInextinguishableFireReward[iPos] = iGetClampedValue(key, "InextinguishableFireReward", "Inextinguishable Fire Reward", "Inextinguishable_Fire_Reward", "inexfire", g_esTank[iIndex].g_iInextinguishableFireReward[iPos], sSet[iPos], -1, 1); g_esTank[iIndex].g_iInfiniteAmmoReward[iPos] = iGetClampedValue(key, "InfiniteAmmoReward", "Infinite Ammo Reward", "Infinite_Ammo_Reward", "infammo", g_esTank[iIndex].g_iInfiniteAmmoReward[iPos], sSet[iPos], -1, 31); - g_esTank[iIndex].g_iLadderActionsReward[iPos] = iGetClampedValue(key, "LadderActionsReward", "Ladder Actions Reward", "Ladder_Action_Reward", "ladderactions", g_esTank[iIndex].g_iLadderActionsReward[iPos], sSet[iPos], -1, 1); - g_esTank[iIndex].g_iLadyKillerReward[iPos] = iGetClampedValue(key, "LadyKillerReward", "Lady Killer Reward", "Lady_Killer_Reward", "ladykiller", g_esTank[iIndex].g_iLadyKillerReward[iPos], sSet[iPos], -1, 99999); + g_esTank[iIndex].g_iLadderActionsReward[iPos] = iGetClampedValue(key, "LadderActionsReward", "Ladder Actions Reward", "Ladder_Action_Reward", "ladderacts", g_esTank[iIndex].g_iLadderActionsReward[iPos], sSet[iPos], -1, 1); g_esTank[iIndex].g_iLaserSightReward[iPos] = iGetClampedValue(key, "LaserSightReward", "Laser Sight Reward", "Laser_Sight_Reward", "lasersight", g_esTank[iIndex].g_iLaserSightReward[iPos], sSet[iPos], -1, 1); g_esTank[iIndex].g_iLifeLeechReward[iPos] = iGetClampedValue(key, "LifeLeechReward", "Life Leech Reward", "Life_Leech_Reward", "lifeleech", g_esTank[iIndex].g_iLifeLeechReward[iPos], sSet[iPos], -1, MT_MAXHEALTH); - g_esTank[iIndex].g_iMedicalCutsReward[iPos] = iGetClampedValue(key, "MedicalCutsReward", "Medical Cuts Reward", "Medical_Cuts_Reward", "medcuts", g_esTank[iIndex].g_iMedicalCutsReward[iPos], sSet[iPos], -1, 1); + g_esTank[iIndex].g_iMedicalCutsReward[iPos] = iGetClampedValue(key, "MedicalCutsReward", "Medical Cuts Reward", "Medical_Cuts_Reward", "medcuts", g_esTank[iIndex].g_iMedicalCutsReward[iPos], sSet[iPos], -1, MT_MAXHEALTH); g_esTank[iIndex].g_iMeleeRangeReward[iPos] = iGetClampedValue(key, "MeleeRangeReward", "Melee Range Reward", "Melee_Range_Reward", "meleerange", g_esTank[iIndex].g_iMeleeRangeReward[iPos], sSet[iPos], -1, 99999); - g_esTank[iIndex].g_iMidairDashesReward[iPos] = iGetClampedValue(key, "MidairDashesReward", "Midair Dashes Reward", "Midair_Dashes_Reward", "midairdashes", g_esTank[iIndex].g_iMidairDashesReward[iPos], sSet[iPos], -1, 99999); + g_esTank[iIndex].g_iMidairDashesReward[iPos] = iGetClampedValue(key, "MidairDashesReward", "Midair Dashes Reward", "Midair_Dashes_Reward", "middash", g_esTank[iIndex].g_iMidairDashesReward[iPos], sSet[iPos], -1, 99999); + g_esTank[iIndex].g_iOverhealthReward[iPos] = iGetClampedValue(key, "OverhealthReward", "Overhealth Reward", "Overhealth_Reward", "overhealth", g_esTank[iIndex].g_iOverhealthReward[iPos], sSet[iPos], -1, MT_MAXHEALTH); g_esTank[iIndex].g_iParticleEffectVisual[iPos] = iGetClampedValue(key, "ParticleEffectVisual", "Particle Effect Visual", "Particle_Effect_Visual", "particle", g_esTank[iIndex].g_iParticleEffectVisual[iPos], sSet[iPos], -1, 15); g_esTank[iIndex].g_iPrefsNotify[iPos] = iGetClampedValue(key, "PrefsNotify", "Prefs Notify", "Prefs_Notify", "pnotify", g_esTank[iIndex].g_iPrefsNotify[iPos], sSet[iPos], -1, 1); g_esTank[iIndex].g_iRecoilDampenerReward[iPos] = iGetClampedValue(key, "RecoilDampenerReward", "Recoil Dampener Reward", "Recoil_Dampener_Reward", "recoil", g_esTank[iIndex].g_iRecoilDampenerReward[iPos], sSet[iPos], -1, 1); - g_esTank[iIndex].g_iRegenBurstsReward[iPos] = iGetClampedValue(key, "RegenBurstsReward", "Regen Bursts Reward", "Regen_Bursts_Reward", "regburst", g_esTank[iIndex].g_iRegenBurstsReward[iPos], sSet[iPos], -1, 1); + g_esTank[iIndex].g_iRegenBurstsReward[iPos] = iGetClampedValue(key, "RegenBurstsReward", "Regen Bursts Reward", "Regen_Bursts_Reward", "regbursts", g_esTank[iIndex].g_iRegenBurstsReward[iPos], sSet[iPos], -1, MT_MAXHEALTH); g_esTank[iIndex].g_iRespawnLoadoutReward[iPos] = iGetClampedValue(key, "RespawnLoadoutReward", "Respawn Loadout Reward", "Respawn_Loadout_Reward", "resloadout", g_esTank[iIndex].g_iRespawnLoadoutReward[iPos], sSet[iPos], -1, 1); g_esTank[iIndex].g_iReviveHealthReward[iPos] = iGetClampedValue(key, "ReviveHealthReward", "Revive Health Reward", "Revive_Health_Reward", "revivehp", g_esTank[iIndex].g_iReviveHealthReward[iPos], sSet[iPos], -1, MT_MAXHEALTH); + g_esTank[iIndex].g_iRiotGearReward[iPos] = iGetClampedValue(key, "RiotGearReward", "Riot Gear Reward", "Riot_Gear_Reward", "riotgear", g_esTank[iIndex].g_iRiotGearReward[iPos], sSet[iPos], -1, 1); + g_esTank[iIndex].g_iSafetyBubbleReward[iPos] = iGetClampedValue(key, "SafetyBubbleReward", "Safety Bubble Reward", "Safety_Bubble_Reward", "safetybubble", g_esTank[iIndex].g_iSafetyBubbleReward[iPos], sSet[iPos], -1, 1); g_esTank[iIndex].g_iShareRewards[iPos] = iGetClampedValue(key, "ShareRewards", "Share Rewards", "Share_Rewards", "share", g_esTank[iIndex].g_iShareRewards[iPos], sSet[iPos], -1, 3); g_esTank[iIndex].g_iShovePenaltyReward[iPos] = iGetClampedValue(key, "ShovePenaltyReward", "Shove Penalty Reward", "Shove_Penalty_Reward", "shovepenalty", g_esTank[iIndex].g_iShovePenaltyReward[iPos], sSet[iPos], -1, 1); - g_esTank[iIndex].g_iSledgehammerRoundsReward[iPos] = iGetClampedValue(key, "SledgehammerRoundsReward", "Sledgehammer Rounds Reward", "Sledgehammer_Rounds_Reward", "sledgehammer", g_esTank[iIndex].g_iSledgehammerRoundsReward[iPos], sSet[iPos], -1, 1); - g_esTank[iIndex].g_iSpecialAmmoReward[iPos] = iGetClampedValue(key, "SpecialAmmoReward", "Special Ammo Reward", "Special_Ammo_Reward", "specialammo", g_esTank[iIndex].g_iSpecialAmmoReward[iPos], sSet[iPos], -1, 3); - g_esTank[iIndex].g_iStackRewards[iPos] = iGetClampedValue(key, "StackRewards", "Stack Rewards", "Stack_Rewards", "stack", g_esTank[iIndex].g_iStackRewards[iPos], sSet[iPos], -1, 2147483647); + g_esTank[iIndex].g_iSpecialAmmoReward[iPos] = iGetClampedValue(key, "SpecialAmmoReward", "Special Ammo Reward", "Special_Ammo_Reward", "specammo", g_esTank[iIndex].g_iSpecialAmmoReward[iPos], sSet[iPos], -1, 3); + g_esTank[iIndex].g_iStackRewards[iPos] = iGetClampedValue(key, "StackRewards", "Stack Rewards", "Stack_Rewards", "rstack", g_esTank[iIndex].g_iStackRewards[iPos], sSet[iPos], -1, 2147483647); g_esTank[iIndex].g_iStickyGrenadesReward[iPos] = iGetClampedValue(key, "StickyGrenadesReward", "Sticky Grenades Reward", "Sticky_Grenades_Reward", "sticky", g_esTank[iIndex].g_iStickyGrenadesReward[iPos], sSet[iPos], -1, 1); - g_esTank[iIndex].g_iSyringeDartsReward[iPos] = iGetClampedValue(key, "SyringeDartsReward", "Syringe Darts Reward", "Syringe_Darts_Reward", "syringe", g_esTank[iIndex].g_iSyringeDartsReward[iPos], sSet[iPos], -1, 1); + g_esTank[iIndex].g_iSyringeDartsReward[iPos] = iGetClampedValue(key, "SyringeDartsReward", "Syringe Darts Reward", "Syringe_Darts_Reward", "syringe", g_esTank[iIndex].g_iSyringeDartsReward[iPos], sSet[iPos], -1, MT_MAXHEALTH); g_esTank[iIndex].g_iThornsReward[iPos] = iGetClampedValue(key, "ThornsReward", "Thorns Reward", "Thorns_Reward", "thorns", g_esTank[iIndex].g_iThornsReward[iPos], sSet[iPos], -1, 1); g_esTank[iIndex].g_iUsefulRewards[iPos] = iGetClampedValue(key, "UsefulRewards", "Useful Rewards", "Useful_Rewards", "useful", g_esTank[iIndex].g_iUsefulRewards[iPos], sSet[iPos], -1, 15); g_esTank[iIndex].g_iVoicePitchVisual[iPos] = iGetClampedValue(key, "VoicePitchVisual", "Voice Pitch Visual", "Voice_Pitch_Visual", "voicepitch", g_esTank[iIndex].g_iVoicePitchVisual[iPos], sSet[iPos], -1, 255); @@ -17412,6 +22866,31 @@ void vReadTankSettings(int type, int mode, const char[] subsection, const char[] } } } + else if (StrEqual(subsection, MT_CONFIG_SECTION_PARTICLES, false)) + { + if (StrEqual(key, "BodyChance", false) || StrEqual(key, "Body Chance", false) || StrEqual(key, "Body_Chance", false) || StrEqual(key, "bchance", false)) + { + char sValue[54], sSet[9][6]; + strcopy(sValue, sizeof sValue, value); + ReplaceString(sValue, sizeof sValue, " ", ""); + ExplodeString(sValue, ",", sSet, sizeof sSet, sizeof sSet[]); + for (int iPos = 0; iPos < (sizeof esTank::g_flBodyChance); iPos++) + { + g_esTank[iIndex].g_flBodyChance[iPos] = (sSet[iPos][0] != '\0') ? flClamp(StringToFloat(sSet[iPos]), -1.0, 100.0) : g_esTank[iIndex].g_flBodyChance[iPos]; + } + } + else if (StrEqual(key, "RockChance", false) || StrEqual(key, "Rock Chance", false) || StrEqual(key, "Rock_Chance", false) || StrEqual(key, "rchance", false)) + { + char sValue[54], sSet[9][6]; + strcopy(sValue, sizeof sValue, value); + ReplaceString(sValue, sizeof sValue, " ", ""); + ExplodeString(sValue, ",", sSet, sizeof sSet, sizeof sSet[]); + for (int iPos = 0; iPos < (sizeof esTank::g_flRockChance); iPos++) + { + g_esTank[iIndex].g_flRockChance[iPos] = (sSet[iPos][0] != '\0') ? flClamp(StringToFloat(sSet[iPos]), -1.0, 100.0) : g_esTank[iIndex].g_flRockChance[iPos]; + } + } + } if (g_esTank[iIndex].g_iAbilityCount == -1 && (StrContains(subsection, "ability", false) != -1 || (((!strncmp(key, "ability", 7, false) && StrContains(key, "enabled", false) != -1) || StrEqual(key, "aenabled", false) || (StrContains(key, " hit", false) != -1 && StrContains(key, "mode", false) == -1) || StrEqual(key, "hit", false) || StrContains(key, "break", false) != -1 || StrEqual(key, "rock", false)) && StringToInt(value) > 0))) @@ -17432,11 +22911,10 @@ void vReadTankSettings(int type, int mode, const char[] subsection, const char[] void vReadTeammateSettings(int special, int mode, const char[] subsection, const char[] specsection, const char[] key, const char[] value) { + g_esTeammate[special].g_iSpecialNote = iGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "SpecialNote", "Special Note", "Special_Note", "note", g_esTeammate[special].g_iSpecialNote, value, -1, 1); g_esTeammate[special].g_iSpecialModel = iGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "SpecialModel", "Special Model", "Special_Model", "model", g_esTeammate[special].g_iSpecialModel, value, -1, 3); - g_esTeammate[special].g_iSpecialModel = iGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "Model", "Model", "Model", "model", g_esTeammate[special].g_iSpecialModel, value, -1, 3); g_esTeammate[special].g_flBurnDuration = flGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "BurnDuration", "Burn Duration", "Burn_Duration", "burndur", g_esTeammate[special].g_flBurnDuration, value, -1.0, 99999.0); g_esTeammate[special].g_flBurntSkin = flGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "BurntSkin", "Burnt Skin", "Burnt_Skin", "burnt", g_esTeammate[special].g_flBurntSkin, value, -2.0, 1.0); - g_esTeammate[special].g_iSpecialNote = iGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "SpecialNote", "Special Note", "Special_Note", "note", g_esTeammate[special].g_iSpecialNote, value, -1, 1); g_esTeammate[special].g_iDeathRevert = iGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "DeathRevert", "Death Revert", "Death_Revert", "revert", g_esTeammate[special].g_iDeathRevert, value, -1, 1); g_esTeammate[special].g_iAnnounceArrival = iGetKeyValue(subsection, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE2, key, "AnnounceArrival", "Announce Arrival", "Announce_Arrival", "arrival", g_esTeammate[special].g_iAnnounceArrival, value, -1, 31); g_esTeammate[special].g_iAnnounceDeath = iGetKeyValue(subsection, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE2, key, "AnnounceDeath", "Announce Death", "Announce_Death", "death", g_esTeammate[special].g_iAnnounceDeath, value, -1, 2); @@ -17452,17 +22930,24 @@ void vReadTeammateSettings(int special, int mode, const char[] subsection, const g_esTeammate[special].g_iGlowEnabled = iGetKeyValue(subsection, MT_CONFIG_SECTION_GLOW, MT_CONFIG_SECTION_GLOW, MT_CONFIG_SECTION_GLOW, MT_CONFIG_SECTION_GLOW, key, "GlowEnabled", "Glow Enabled", "Glow_Enabled", "genabled", g_esTeammate[special].g_iGlowEnabled, value, -1, 1); g_esTeammate[special].g_iGlowFlashing = iGetKeyValue(subsection, MT_CONFIG_SECTION_GLOW, MT_CONFIG_SECTION_GLOW, MT_CONFIG_SECTION_GLOW, MT_CONFIG_SECTION_GLOW, key, "GlowFlashing", "Glow Flashing", "Glow_Flashing", "flashing", g_esTeammate[special].g_iGlowFlashing, value, -1, 1); g_esTeammate[special].g_iGlowType = iGetKeyValue(subsection, MT_CONFIG_SECTION_GLOW, MT_CONFIG_SECTION_GLOW, MT_CONFIG_SECTION_GLOW, MT_CONFIG_SECTION_GLOW, key, "GlowType", "Glow Type", "Glow_Type", "type", g_esTeammate[special].g_iGlowType, value, -1, 1); + g_esTeammate[special].g_flArmorPercentage = flGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "ArmorPercentage", "Armor Percentage", "Armor_Percentage", "armorpercent", g_esTeammate[special].g_flArmorPercentage, value, -1.0, 1.0); + g_esTeammate[special].g_flArmorResistance[0] = flGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "ArmorResistance", "Armor Resistance", "Armor_Resistance", "armorres", g_esTeammate[special].g_flArmorResistance[0], value, -1.0, 1.0); + g_esTeammate[special].g_flShieldPercentage = flGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "ShieldPercentage", "Shield Percentage", "Shield_Percentage", "shieldpercent", g_esTeammate[special].g_flShieldPercentage, value, -1.0, 1.0); + g_esTeammate[special].g_flShieldRate = flGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "ShieldRate", "Shield Rate", "Shield_Rate", "shieldrate", g_esTeammate[special].g_flShieldRate, value, -1.0, 1.0); + g_esTeammate[special].g_flPassiveDelay = flGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "PassiveDelay", "Passive Delay", "Passive_Delay", "passdelay", g_esTeammate[special].g_flPassiveDelay, value, -1.0, 99999.0); + g_esTeammate[special].g_iPassiveHealth = iGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "PassiveHealth", "Passive Health", "Passive_Health", "passhp", g_esTeammate[special].g_iPassiveHealth, value, MT_MAX_HEALTH_REDUCTION, MT_MAXHEALTH); + g_esTeammate[special].g_flPassiveInterval = flGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "PassiveInterval", "Passive Interval", "Passive_Interval", "passint", g_esTeammate[special].g_flPassiveInterval, value, -1.0, 99999.0); g_esTeammate[special].g_iDisplayHealth = iGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "DisplayHealth", "Display Health", "Display_Health", "displayhp", g_esTeammate[special].g_iDisplayHealth, value, -1, 11); g_esTeammate[special].g_iDisplayHealthType = iGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "DisplayHealthType", "Display Health Type", "Display_Health_Type", "displaytype", g_esTeammate[special].g_iDisplayHealthType, value, -1, 2); g_esTeammate[special].g_flHealPercentMultiplier = flGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "HealthPercentageMultiplier", "Health Percentage Multiplier", "Health_Percentage_Multiplier", "hpmulti", g_esTeammate[special].g_flHealPercentMultiplier, value, -1.0, 99999.0); g_esTeammate[special].g_iHumanMultiplierMode = iGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "HumanMultiplierMode", "Human Multiplier Mode", "Human_Multiplier_Mode", "humanmultimode", g_esTeammate[special].g_iHumanMultiplierMode, value, -1, 1); g_esTeammate[special].g_iMinimumHumans = iGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "MinimumHumans", "Minimum Humans", "Minimum_Humans", "minhumans", g_esTeammate[special].g_iMinimumHumans, value, -1, 32); g_esTeammate[special].g_iMultiplyHealth = iGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "MultiplyHealth", "Multiply Health", "Multiply_Health", "multihp", g_esTeammate[special].g_iMultiplyHealth, value, -1, 3); - g_esTeammate[special].g_iSpawnProtection = iGetKeyValue(subsection, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION2, key, "SpawnProtection", "Spawn Protection", "Spawn_Protection", "protect", g_esTeammate[special].g_iSpawnProtection, value, -1, 3); - g_esTeammate[special].g_flArmorDuration = flGetKeyValue(subsection, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION2, key, "ArmorDuration", "Armor Duration", "Armor_Duration", "armorduration", g_esTeammate[special].g_flArmorDuration, value, -1.0, 99999.0); - g_esTeammate[special].g_flArmorResistance = flGetKeyValue(subsection, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION2, key, "ArmorResistance", "Armor Resistance", "Armor_Resistance", "armorres", g_esTeammate[special].g_flArmorResistance, value, -1.0, 1.0); - g_esTeammate[special].g_flShieldDuration = flGetKeyValue(subsection, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION2, key, "ShieldDuration", "Shield Duration", "Shield_Duration", "shieldduration", g_esTeammate[special].g_flShieldDuration, value, -1.0, 99999.0); - g_esTeammate[special].g_flShieldResistance = flGetKeyValue(subsection, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION2, key, "ShieldResistance", "Shield Resistance", "Shield_Resistance", "shieldres", g_esTeammate[special].g_flShieldResistance, value, -1.0, 1.0); + g_esTeammate[special].g_iSpawnProtection = iGetKeyValue(subsection, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT2, key, "SpawnProtection", "Spawn Protection", "Spawn_Protection", "protect", g_esTeammate[special].g_iSpawnProtection, value, -1, 3); + g_esTeammate[special].g_flArmorDuration = flGetKeyValue(subsection, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT2, key, "ArmorDuration", "Armor Duration", "Armor_Duration", "armorduration", g_esTeammate[special].g_flArmorDuration, value, -1.0, 99999.0); + g_esTeammate[special].g_flArmorResistance[1] = flGetKeyValue(subsection, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT2, key, "ArmorResistance", "Armor Resistance", "Armor_Resistance", "armorres", g_esTeammate[special].g_flArmorResistance[1], value, -1.0, 1.0); + g_esTeammate[special].g_flShieldDuration = flGetKeyValue(subsection, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT2, key, "ShieldDuration", "Shield Duration", "Shield_Duration", "shieldduration", g_esTeammate[special].g_flShieldDuration, value, -1.0, 99999.0); + g_esTeammate[special].g_flShieldResistance = flGetKeyValue(subsection, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT2, key, "ShieldResistance", "Shield Resistance", "Shield_Resistance", "shieldres", g_esTeammate[special].g_flShieldResistance, value, -1.0, 1.0); g_esTeammate[special].g_iBossEffects = iGetKeyValue(subsection, MT_CONFIG_SECTION_BOSS, MT_CONFIG_SECTION_BOSS, MT_CONFIG_SECTION_BOSS, MT_CONFIG_SECTION_BOSS, key, "BossEffects", "Boss Effects", "Boss_Effects", "bosseffects", g_esTeammate[special].g_iBossEffects, value, -1, 15); g_esTeammate[special].g_iBossStages = iGetKeyValue(subsection, MT_CONFIG_SECTION_BOSS, MT_CONFIG_SECTION_BOSS, MT_CONFIG_SECTION_BOSS, MT_CONFIG_SECTION_BOSS, key, "BossStages", "Boss Stages", "Boss_Stages", "bossstages", g_esTeammate[special].g_iBossStages, value, -1, 4); g_esTeammate[special].g_iRandomSpecial = iGetKeyValue(subsection, MT_CONFIG_SECTION_RANDOM, MT_CONFIG_SECTION_RANDOM, MT_CONFIG_SECTION_RANDOM, MT_CONFIG_SECTION_RANDOM, key, "RandomSpecial", "Random Special", "Random_Special", "random", g_esTeammate[special].g_iRandomSpecial, value, -1, 1); @@ -17475,6 +22960,7 @@ void vReadTeammateSettings(int special, int mode, const char[] subsection, const g_esTeammate[special].g_iBodyEffects = iGetKeyValue(subsection, MT_CONFIG_SECTION_PARTICLES, MT_CONFIG_SECTION_PARTICLES, MT_CONFIG_SECTION_PARTICLES, MT_CONFIG_SECTION_PARTICLES, key, "BodyEffects", "Body Effects", "Body_Effects", "body", g_esTeammate[special].g_iBodyEffects, value, -1, 127); g_esTeammate[special].g_iRockEffects = iGetKeyValue(subsection, MT_CONFIG_SECTION_PARTICLES, MT_CONFIG_SECTION_PARTICLES, MT_CONFIG_SECTION_PARTICLES, MT_CONFIG_SECTION_PARTICLES, key, "RockEffects", "Rock Effects", "Rock_Effects", "rock", g_esTeammate[special].g_iRockEffects, value, -1, 15); g_esTeammate[special].g_flAttackInterval = flGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "AttackInterval", "Attack Interval", "Attack_Interval", "attack", g_esTeammate[special].g_flAttackInterval, value, -1.0, 99999.0); + g_esTeammate[special].g_iAutoHop = iGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "BunnyHop", "Bunny Hop", "Bunny_Hop", "bhop", g_esTeammate[special].g_iAutoHop, value, -1, 1); g_esTeammate[special].g_flClawDamage = flGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "ClawDamage", "Claw Damage", "Claw_Damage", "claw", g_esTeammate[special].g_flClawDamage, value, -2.0, 99999.0); g_esTeammate[special].g_flHittableDamage = flGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "HittableDamage", "Hittable Damage", "Hittable_Damage", "hittable", g_esTeammate[special].g_flHittableDamage, value, -2.0, 99999.0); g_esTeammate[special].g_flIncapDamageMultiplier = flGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "IncapDamageMultiplier", "Incap Damage Multiplier", "Incap_Damage_Multiplier", "incapdmgmulti", g_esTeammate[special].g_flIncapDamageMultiplier, value, -1.0, 99999.0); @@ -17492,7 +22978,9 @@ void vReadTeammateSettings(int special, int mode, const char[] subsection, const g_esTeammate[special].g_iMeleeImmunity = iGetKeyValue(subsection, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE2, key, "MeleeImmunity", "Melee Immunity", "Melee_Immunity", "melee", g_esTeammate[special].g_iMeleeImmunity, value, -1, 1); g_esTeammate[special].g_iVomitImmunity = iGetKeyValue(subsection, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE2, key, "VomitImmunity", "Vomit Immunity", "Vomit_Immunity", "vomit", g_esTeammate[special].g_iVomitImmunity, value, -1, 1); + vGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "ArmorCharacters", "Armor Characters", "Armor_Characters", "armorchars", g_esTeammate[special].g_sArmorCharacters, sizeof esTeammate::g_sArmorCharacters, value); vGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "HealthCharacters", "Health Characters", "Health_Characters", "hpchars", g_esTeammate[special].g_sHealthCharacters, sizeof esTeammate::g_sHealthCharacters, value); + vGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "ShieldCharacters", "Shield Characters", "Shield_Characters", "shieldchars", g_esTeammate[special].g_sShieldCharacters, sizeof esTeammate::g_sShieldCharacters, value); vGetKeyValue(subsection, MT_CONFIG_SECTION_COMBO, MT_CONFIG_SECTION_COMBO, MT_CONFIG_SECTION_COMBO, MT_CONFIG_SECTION_COMBO, key, "ComboSet", "Combo Set", "Combo_Set", "set", g_esTeammate[special].g_sComboSet, sizeof esTeammate::g_sComboSet, value); if (StrEqual(subsection, MT_CONFIG_SECTION_GENERAL, false)) @@ -17521,7 +23009,7 @@ void vReadTeammateSettings(int special, int mode, const char[] subsection, const } else if (StrEqual(subsection, MT_CONFIG_SECTION_REWARDS, false)) { - char sValue[1280], sSet[8][320]; + char sValue[2560], sSet[8][320]; strcopy(sValue, sizeof sValue, value); ReplaceString(sValue, sizeof sValue, " ", ""); ExplodeString(sValue, ",", sSet, sizeof sSet, sizeof sSet[]); @@ -17533,57 +23021,76 @@ void vReadTeammateSettings(int special, int mode, const char[] subsection, const g_esTeammate[special].g_flRewardDuration[iPos] = flGetClampedValue(key, "RewardDuration", "Reward Duration", "Reward_Duration", "duration", g_esTeammate[special].g_flRewardDuration[iPos], sSet[iPos], -1.0, 99999.0); g_esTeammate[special].g_flRewardPercentage[iPos] = flGetClampedValue(key, "RewardPercentage", "Reward Percentage", "Reward_Percentage", "percent", g_esTeammate[special].g_flRewardPercentage[iPos], sSet[iPos], -1.0, 100.0); g_esTeammate[special].g_flActionDurationReward[iPos] = flGetClampedValue(key, "ActionDurationReward", "Action Duration Reward", "Action_Duration_Reward", "actionduration", g_esTeammate[special].g_flActionDurationReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esTeammate[special].g_flAdrenalineTimeReward[iPos] = flGetClampedValue(key, "AdrenalineTimeReward", "Adrenaline Time Reward", "Adrenaline_Time_Reward", "adrenaline", g_esTeammate[special].g_flAdrenalineTimeReward[iPos], sSet[iPos], -1.0, 99999.0); g_esTeammate[special].g_flAttackBoostReward[iPos] = flGetClampedValue(key, "AttackBoostReward", "Attack Boost Reward", "Attack_Boost_Reward", "attackboost", g_esTeammate[special].g_flAttackBoostReward[iPos], sSet[iPos], -1.0, 99999.0); g_esTeammate[special].g_flDamageBoostReward[iPos] = flGetClampedValue(key, "DamageBoostReward", "Damage Boost Reward", "Damage_Boost_Reward", "dmgboost", g_esTeammate[special].g_flDamageBoostReward[iPos], sSet[iPos], -1.0, 99999.0); g_esTeammate[special].g_flDamageResistanceReward[iPos] = flGetClampedValue(key, "DamageResistanceReward", "Damage Resistance Reward", "Damage_Resistance_Reward", "dmgres", g_esTeammate[special].g_flDamageResistanceReward[iPos], sSet[iPos], -1.0, 1.0); + g_esTeammate[special].g_flDopamineRadiusReward[iPos] = flGetClampedValue(key, "DopamineRadiusReward", "Dopamine Radius Reward", "Dopamine_Radius_Reward", "dopamine", g_esTeammate[special].g_flDopamineRadiusReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esTeammate[special].g_flFireRateReward[iPos] = flGetClampedValue(key, "FireRateReward", "Fire Rate Reward", "Fire_Rate_Reward", "firerate", g_esTeammate[special].g_flFireRateReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esTeammate[special].g_flGrenadeLauncherReward[iPos] = flGetClampedValue(key, "GrenadeLauncherReward", "Grenade Launcher Reward", "Grenade_Launcher_Reward", "grenade", g_esTeammate[special].g_flGrenadeLauncherReward[iPos], sSet[iPos], -1.0, 100.0); g_esTeammate[special].g_flHealPercentReward[iPos] = flGetClampedValue(key, "HealPercentReward", "Heal Percent Reward", "Heal_Percent_Reward", "healpercent", g_esTeammate[special].g_flHealPercentReward[iPos], sSet[iPos], -1.0, 100.0); + g_esTeammate[special].g_flHealthcareRadiusReward[iPos] = flGetClampedValue(key, "HealthcareRadiusReward", "Healthcare Radius Reward", "Healthcare_Radius_Reward", "healthcare", g_esTeammate[special].g_flHealthcareRadiusReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esTeammate[special].g_flHeartbeatReward[iPos] = flGetClampedValue(key, "HeartbeatReward", "Heartbeat Reward", "Heartbeat_Reward", "heartbeat", g_esTeammate[special].g_flHeartbeatReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esTeammate[special].g_flHollowpointAmmoReward[iPos] = flGetClampedValue(key, "HollowpointAmmoReward", "Hollowpoint Ammo Reward", "Hollowpoint_Ammo_Reward", "hollowpoint", g_esTeammate[special].g_flHollowpointAmmoReward[iPos], sSet[iPos], -1.0, 100.0); g_esTeammate[special].g_flJumpHeightReward[iPos] = flGetClampedValue(key, "JumpHeightReward", "Jump Height Reward", "Jump_Height_Reward", "jumpheight", g_esTeammate[special].g_flJumpHeightReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esTeammate[special].g_flLadyKillerReward[iPos] = flGetClampedValue(key, "LadyKillerReward", "Lady Killer Reward", "Lady_Killer_Reward", "ladykiller", g_esTeammate[special].g_flLadyKillerReward[iPos], sSet[iPos], -1.0, 100.0); g_esTeammate[special].g_flLoopingVoicelineInterval[iPos] = flGetClampedValue(key, "LoopingVoicelineInterval", "Looping Voiceline Interval", "Looping_Voiceline_Interval", "loopinterval", g_esTeammate[special].g_flLoopingVoicelineInterval[iPos], sSet[iPos], -1.0, 99999.0); + g_esTeammate[special].g_flLuckyBulletReward[iPos] = flGetClampedValue(key, "LuckyBulletReward", "Lucky Bullet Reward", "Lucky_Bullet_Reward", "luckybullet", g_esTeammate[special].g_flLuckyBulletReward[iPos], sSet[iPos], -1.0, 100.0); + g_esTeammate[special].g_flMotivationRadiusReward[iPos] = flGetClampedValue(key, "MotivationRadiusReward", "Motivation Radius Reward", "Motivation_Radius_Reward", "motivation", g_esTeammate[special].g_flMotivationRadiusReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esTeammate[special].g_flOverdoseRadiusReward[iPos] = flGetClampedValue(key, "OverdoseRadiusReward", "Overdose Radius Reward", "Overdose_Radius_Reward", "overdose", g_esTeammate[special].g_flOverdoseRadiusReward[iPos], sSet[iPos], -1.0, 99999.0); g_esTeammate[special].g_flPipeBombDurationReward[iPos] = flGetClampedValue(key, "PipebombDurationReward", "Pipebomb Duration Reward", "Pipebomb_Duration_Reward", "pipeduration", g_esTeammate[special].g_flPipeBombDurationReward[iPos], sSet[iPos], -1.0, 99999.0); g_esTeammate[special].g_flPunchResistanceReward[iPos] = flGetClampedValue(key, "PunchResistanceReward", "Punch Resistance Reward", "Punch_Resistance_Reward", "punchres", g_esTeammate[special].g_flPunchResistanceReward[iPos], sSet[iPos], -1.0, 1.0); - g_esTeammate[special].g_flRapidPistolReward[iPos] = flGetClampedValue(key, "RapidPistolReward", "Rapid Pistol Reward", "Rapid_Pistol_Reward", "rapid", g_esTeammate[special].g_flRapidPistolReward[iPos], sSet[iPos], -1.0, 1.0); + g_esTeammate[special].g_flRapidPistolReward[iPos] = flGetClampedValue(key, "RapidPistolReward", "Rapid Pistol Reward", "Rapid_Pistol_Reward", "rapidpistol", g_esTeammate[special].g_flRapidPistolReward[iPos], sSet[iPos], -1.0, 1.0); g_esTeammate[special].g_flRefillPercentReward[iPos] = flGetClampedValue(key, "RefillPercentReward", "Refill Percent Reward", "Refill_Percent_Reward", "refillpercent", g_esTeammate[special].g_flRefillPercentReward[iPos], sSet[iPos], -1.0, 100.0); + g_esTeammate[special].g_flReloadRateReward[iPos] = flGetClampedValue(key, "ReloadRateReward", "Reload Rate Reward", "Reload_Rate_Reward", "reloadrate", g_esTeammate[special].g_flReloadRateReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esTeammate[special].g_flShockwaveRadiusReward[iPos] = flGetClampedValue(key, "ShockwaveRadiusReward", "Shockwave Radius Reward", "Shockwave_Radius_Reward", "shockwave", g_esTeammate[special].g_flShockwaveRadiusReward[iPos], sSet[iPos], -1.0, 99999.0); g_esTeammate[special].g_flShoveDamageReward[iPos] = flGetClampedValue(key, "ShoveDamageReward", "Shove Damage Reward", "Shove_Damage_Reward", "shovedmg", g_esTeammate[special].g_flShoveDamageReward[iPos], sSet[iPos], -1.0, 99999.0); g_esTeammate[special].g_flShoveRateReward[iPos] = flGetClampedValue(key, "ShoveRateReward", "Shove Rate Reward", "Shove_Rate_Reward", "shoverate", g_esTeammate[special].g_flShoveRateReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esTeammate[special].g_flSledgehammerRoundsReward[iPos] = flGetClampedValue(key, "SledgehammerRoundsReward", "Sledgehammer Rounds Reward", "Sledgehammer_Rounds_Reward", "sledgehammer", g_esTeammate[special].g_flSledgehammerRoundsReward[iPos], sSet[iPos], -1.0, 100.0); g_esTeammate[special].g_flSpeedBoostReward[iPos] = flGetClampedValue(key, "SpeedBoostReward", "Speed Boost Reward", "Speed_Boost_Reward", "speedboost", g_esTeammate[special].g_flSpeedBoostReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esTeammate[special].g_flSupplierReward[iPos] = flGetClampedValue(key, "SupplierPassive", "Supplier Passive", "Supplier_Passive", "supplier", g_esTeammate[special].g_flSupplierReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esTeammate[special].g_flSwingRateReward[iPos] = flGetClampedValue(key, "SwingRateReward", "Swing Rate Reward", "Swing_Rate_Reward", "swingrate", g_esTeammate[special].g_flSwingRateReward[iPos], sSet[iPos], -1.0, 99999.0); g_esTeammate[special].g_iRewardEnabled[iPos] = iGetClampedValue(key, "RewardEnabled", "Reward Enabled", "Reward_Enabled", "renabled", g_esTeammate[special].g_iRewardEnabled[iPos], sSet[iPos], -2, 2147483647); - g_esTeammate[special].g_iRewardBots[iPos] = iGetClampedValue(key, "RewardBots", "Reward Bots", "Reward_Bots", "bots", g_esTeammate[special].g_iRewardBots[iPos], sSet[iPos], -2, 2147483647); + g_esTeammate[special].g_iRewardBots[iPos] = iGetClampedValue(key, "RewardBots", "Reward Bots", "Reward_Bots", "rbots", g_esTeammate[special].g_iRewardBots[iPos], sSet[iPos], -2, 2147483647); g_esTeammate[special].g_iRewardEffect[iPos] = iGetClampedValue(key, "RewardEffect", "Reward Effect", "Reward_Effect", "effect", g_esTeammate[special].g_iRewardEffect[iPos], sSet[iPos], -1, 15); g_esTeammate[special].g_iRewardNotify[iPos] = iGetClampedValue(key, "RewardNotify", "Reward Notify", "Reward_Notify", "rnotify", g_esTeammate[special].g_iRewardNotify[iPos], sSet[iPos], -1, 3); g_esTeammate[special].g_iRewardVisual[iPos] = iGetClampedValue(key, "RewardVisual", "Reward Visual", "Reward_Visual", "visual", g_esTeammate[special].g_iRewardVisual[iPos], sSet[iPos], -1, 127); g_esTeammate[special].g_iAmmoBoostReward[iPos] = iGetClampedValue(key, "AmmoBoostReward", "Ammo Boost Reward", "Ammo_Boost_Reward", "ammoboost", g_esTeammate[special].g_iAmmoBoostReward[iPos], sSet[iPos], -1, 1); + g_esTeammate[special].g_iAmmoRefillReward[iPos] = iGetClampedValue(key, "AmmoRefillReward", "Ammo Refill Reward", "Ammo_Refill_Reward", "ammorefill", g_esTeammate[special].g_iAmmoRefillReward[iPos], sSet[iPos], -1, 1); g_esTeammate[special].g_iAmmoRegenReward[iPos] = iGetClampedValue(key, "AmmoRegenReward", "Ammo Regen Reward", "Ammo_Regen_Reward", "ammoregen", g_esTeammate[special].g_iAmmoRegenReward[iPos], sSet[iPos], -1, 99999); - g_esTeammate[special].g_iBlazeHealthReward[iPos] = iGetClampedValue(key, "BlazeHealthReward", "Blaze Health Reward", "Blaze_Health_Reward", "blaze", g_esTeammate[special].g_iBlazeHealthReward[iPos], sSet[iPos], -1, 1); + g_esTeammate[special].g_iBlazeHealthReward[iPos] = iGetClampedValue(key, "BlazeHealthReward", "Blaze Health Reward", "Blaze_Health_Reward", "blaze", g_esTeammate[special].g_iBlazeHealthReward[iPos], sSet[iPos], -1, MT_MAXHEALTH); + g_esTeammate[special].g_iBloodDonorReward[iPos] = iGetClampedValue(key, "BloodDonorReward", "Blood Donor Reward", "Blood_Donor_Reward", "donor", g_esTeammate[special].g_iBloodDonorReward[iPos], sSet[iPos], -1, MT_MAXHEALTH); g_esTeammate[special].g_iBunnyHopReward[iPos] = iGetClampedValue(key, "BunnyHopReward", "Bunny Hop Reward", "Bunny_Hop_Reward", "bhop", g_esTeammate[special].g_iBunnyHopReward[iPos], sSet[iPos], -1, 1); g_esTeammate[special].g_iBurstDoorsReward[iPos] = iGetClampedValue(key, "BurstDoorsReward", "Burst Doors Reward", "Burst_Doors_Reward", "burstdoors", g_esTeammate[special].g_iBurstDoorsReward[iPos], sSet[iPos], -1, 1); g_esTeammate[special].g_iCleanKillsReward[iPos] = iGetClampedValue(key, "CleanKillsReward", "Clean Kills Reward", "Clean_Kills_Reward", "cleankills", g_esTeammate[special].g_iCleanKillsReward[iPos], sSet[iPos], -1, 1); g_esTeammate[special].g_iClusterBombsReward[iPos] = iGetClampedValue(key, "ClusterBombsReward", "Cluster Bombs Reward", "Cluster_Bombs_Reward", "cluster", g_esTeammate[special].g_iClusterBombsReward[iPos], sSet[iPos], -1, 5); + g_esTeammate[special].g_iEternalFlamesReward[iPos] = iGetClampedValue(key, "EternalFlamesReward", "Eternal Flames Reward", "Eternal_Flames_Reward", "eternal", g_esTeammate[special].g_iEternalFlamesReward[iPos], sSet[iPos], -1, 1); + g_esTeammate[special].g_iFastRecoveryReward[iPos] = iGetClampedValue(key, "FastRecoveryReward", "Fast Recovery Reward", "Fast_Recovery_Reward", "fastrecovery", g_esTeammate[special].g_iFastRecoveryReward[iPos], sSet[iPos], -1, 1); g_esTeammate[special].g_iFriendlyFireReward[iPos] = iGetClampedValue(key, "FriendlyFireReward", "Friendly Fire Reward", "Friendly_Fire_Reward", "friendlyfire", g_esTeammate[special].g_iFriendlyFireReward[iPos], sSet[iPos], -1, 1); g_esTeammate[special].g_iGhostBulletsReward[iPos] = iGetClampedValue(key, "GhostBulletsReward", "Ghost Bullets Reward", "Ghost_Bullets_Reward", "ghost", g_esTeammate[special].g_iGhostBulletsReward[iPos], sSet[iPos], -1, 1); g_esTeammate[special].g_iHealthRegenReward[iPos] = iGetClampedValue(key, "HealthRegenReward", "Health Regen Reward", "Health_Regen_Reward", "hpregen", g_esTeammate[special].g_iHealthRegenReward[iPos], sSet[iPos], -1, MT_MAXHEALTH); - g_esTeammate[special].g_iHollowpointAmmoReward[iPos] = iGetClampedValue(key, "HollowpointAmmoReward", "Hollowpoint Ammo Reward", "Hollowpoint_Ammo_Reward", "hollowpoint", g_esTeammate[special].g_iHollowpointAmmoReward[iPos], sSet[iPos], -1, 1); - g_esTeammate[special].g_iInextinguishableFireReward[iPos] = iGetClampedValue(key, "InextinguishableFireReward", "Inextinguishable Fire Reward", "Inextinguishable_Fire_Reward", "inexfire", g_esTeammate[special].g_iInextinguishableFireReward[iPos], sSet[iPos], -1, 1); g_esTeammate[special].g_iInfiniteAmmoReward[iPos] = iGetClampedValue(key, "InfiniteAmmoReward", "Infinite Ammo Reward", "Infinite_Ammo_Reward", "infammo", g_esTeammate[special].g_iInfiniteAmmoReward[iPos], sSet[iPos], -1, 31); - g_esTeammate[special].g_iLadderActionsReward[iPos] = iGetClampedValue(key, "LadderActionsReward", "Ladder Actions Reward", "Ladder_Action_Reward", "ladderactions", g_esTeammate[special].g_iLadderActionsReward[iPos], sSet[iPos], -1, 1); - g_esTeammate[special].g_iLadyKillerReward[iPos] = iGetClampedValue(key, "LadyKillerReward", "Lady Killer Reward", "Lady_Killer_Reward", "ladykiller", g_esTeammate[special].g_iLadyKillerReward[iPos], sSet[iPos], -1, 99999); + g_esTeammate[special].g_iLadderActionsReward[iPos] = iGetClampedValue(key, "LadderActionsReward", "Ladder Actions Reward", "Ladder_Action_Reward", "ladderacts", g_esTeammate[special].g_iLadderActionsReward[iPos], sSet[iPos], -1, 1); g_esTeammate[special].g_iLaserSightReward[iPos] = iGetClampedValue(key, "LaserSightReward", "Laser Sight Reward", "Laser_Sight_Reward", "lasersight", g_esTeammate[special].g_iLaserSightReward[iPos], sSet[iPos], -1, 1); g_esTeammate[special].g_iLifeLeechReward[iPos] = iGetClampedValue(key, "LifeLeechReward", "Life Leech Reward", "Life_Leech_Reward", "lifeleech", g_esTeammate[special].g_iLifeLeechReward[iPos], sSet[iPos], -1, MT_MAXHEALTH); - g_esTeammate[special].g_iMedicalCutsReward[iPos] = iGetClampedValue(key, "MedicalCutsReward", "Medical Cuts Reward", "Medical_Cuts_Reward", "medcuts", g_esTeammate[special].g_iMedicalCutsReward[iPos], sSet[iPos], -1, 1); + g_esTeammate[special].g_iMedicalCutsReward[iPos] = iGetClampedValue(key, "MedicalCutsReward", "Medical Cuts Reward", "Medical_Cuts_Reward", "medcuts", g_esTeammate[special].g_iMedicalCutsReward[iPos], sSet[iPos], -1, MT_MAXHEALTH); g_esTeammate[special].g_iMeleeRangeReward[iPos] = iGetClampedValue(key, "MeleeRangeReward", "Melee Range Reward", "Melee_Range_Reward", "meleerange", g_esTeammate[special].g_iMeleeRangeReward[iPos], sSet[iPos], -1, 99999); - g_esTeammate[special].g_iMidairDashesReward[iPos] = iGetClampedValue(key, "MidairDashesReward", "Midair Dashes Reward", "Midair_Dashes_Reward", "midairdashes", g_esTeammate[special].g_iMidairDashesReward[iPos], sSet[iPos], -1, 99999); + g_esTeammate[special].g_iMidairDashesReward[iPos] = iGetClampedValue(key, "MidairDashesReward", "Midair Dashes Reward", "Midair_Dashes_Reward", "middash", g_esTeammate[special].g_iMidairDashesReward[iPos], sSet[iPos], -1, 99999); + g_esTeammate[special].g_iOverhealthReward[iPos] = iGetClampedValue(key, "OverhealthReward", "Overhealth Reward", "Overhealth_Reward", "overhealth", g_esTeammate[special].g_iOverhealthReward[iPos], sSet[iPos], -1, MT_MAXHEALTH); g_esTeammate[special].g_iParticleEffectVisual[iPos] = iGetClampedValue(key, "ParticleEffectVisual", "Particle Effect Visual", "Particle_Effect_Visual", "particle", g_esTeammate[special].g_iParticleEffectVisual[iPos], sSet[iPos], -1, 15); g_esTeammate[special].g_iPrefsNotify[iPos] = iGetClampedValue(key, "PrefsNotify", "Prefs Notify", "Prefs_Notify", "pnotify", g_esTeammate[special].g_iPrefsNotify[iPos], sSet[iPos], -1, 1); g_esTeammate[special].g_iRecoilDampenerReward[iPos] = iGetClampedValue(key, "RecoilDampenerReward", "Recoil Dampener Reward", "Recoil_Dampener_Reward", "recoil", g_esTeammate[special].g_iRecoilDampenerReward[iPos], sSet[iPos], -1, 1); - g_esTeammate[special].g_iRegenBurstsReward[iPos] = iGetClampedValue(key, "RegenBurstsReward", "Regen Bursts Reward", "Regen_Bursts_Reward", "regburst", g_esTeammate[special].g_iRegenBurstsReward[iPos], sSet[iPos], -1, 1); + g_esTeammate[special].g_iRegenBurstsReward[iPos] = iGetClampedValue(key, "RegenBurstsReward", "Regen Bursts Reward", "Regen_Bursts_Reward", "regbursts", g_esTeammate[special].g_iRegenBurstsReward[iPos], sSet[iPos], -1, MT_MAXHEALTH); g_esTeammate[special].g_iRespawnLoadoutReward[iPos] = iGetClampedValue(key, "RespawnLoadoutReward", "Respawn Loadout Reward", "Respawn_Loadout_Reward", "resloadout", g_esTeammate[special].g_iRespawnLoadoutReward[iPos], sSet[iPos], -1, 1); g_esTeammate[special].g_iReviveHealthReward[iPos] = iGetClampedValue(key, "ReviveHealthReward", "Revive Health Reward", "Revive_Health_Reward", "revivehp", g_esTeammate[special].g_iReviveHealthReward[iPos], sSet[iPos], -1, MT_MAXHEALTH); + g_esTeammate[special].g_iRiotGearReward[iPos] = iGetClampedValue(key, "RiotGearReward", "Riot Gear Reward", "Riot_Gear_Reward", "riotgear", g_esTeammate[special].g_iRiotGearReward[iPos], sSet[iPos], -1, 1); + g_esTeammate[special].g_iSafetyBubbleReward[iPos] = iGetClampedValue(key, "SafetyBubbleReward", "Safety Bubble Reward", "Safety_Bubble_Reward", "safetybubble", g_esTeammate[special].g_iSafetyBubbleReward[iPos], sSet[iPos], -1, 1); g_esTeammate[special].g_iShareRewards[iPos] = iGetClampedValue(key, "ShareRewards", "Share Rewards", "Share_Rewards", "share", g_esTeammate[special].g_iShareRewards[iPos], sSet[iPos], -1, 3); g_esTeammate[special].g_iShovePenaltyReward[iPos] = iGetClampedValue(key, "ShovePenaltyReward", "Shove Penalty Reward", "Shove_Penalty_Reward", "shovepenalty", g_esTeammate[special].g_iShovePenaltyReward[iPos], sSet[iPos], -1, 1); - g_esTeammate[special].g_iSledgehammerRoundsReward[iPos] = iGetClampedValue(key, "SledgehammerRoundsReward", "Sledgehammer Rounds Reward", "Sledgehammer_Rounds_Reward", "sledgehammer", g_esTeammate[special].g_iSledgehammerRoundsReward[iPos], sSet[iPos], -1, 1); - g_esTeammate[special].g_iSpecialAmmoReward[iPos] = iGetClampedValue(key, "SpecialAmmoReward", "Special Ammo Reward", "Special_Ammo_Reward", "specialammo", g_esTeammate[special].g_iSpecialAmmoReward[iPos], sSet[iPos], -1, 3); - g_esTeammate[special].g_iStackRewards[iPos] = iGetClampedValue(key, "StackRewards", "Stack Rewards", "Stack_Rewards", "stack", g_esTeammate[special].g_iStackRewards[iPos], sSet[iPos], -1, 2147483647); + g_esTeammate[special].g_iSpecialAmmoReward[iPos] = iGetClampedValue(key, "SpecialAmmoReward", "Special Ammo Reward", "Special_Ammo_Reward", "specammo", g_esTeammate[special].g_iSpecialAmmoReward[iPos], sSet[iPos], -1, 3); + g_esTeammate[special].g_iStackRewards[iPos] = iGetClampedValue(key, "StackRewards", "Stack Rewards", "Stack_Rewards", "rstack", g_esTeammate[special].g_iStackRewards[iPos], sSet[iPos], -1, 2147483647); g_esTeammate[special].g_iStickyGrenadesReward[iPos] = iGetClampedValue(key, "StickyGrenadesReward", "Sticky Grenades Reward", "Sticky_Grenades_Reward", "cluster", g_esTeammate[special].g_iStickyGrenadesReward[iPos], sSet[iPos], -1, 1); - g_esTeammate[special].g_iSyringeDartsReward[iPos] = iGetClampedValue(key, "SyringeDartsReward", "Syringe Darts Reward", "Syringe_Darts_Reward", "syringe", g_esTeammate[special].g_iSyringeDartsReward[iPos], sSet[iPos], -1, 1); + g_esTeammate[special].g_iSyringeDartsReward[iPos] = iGetClampedValue(key, "SyringeDartsReward", "Syringe Darts Reward", "Syringe_Darts_Reward", "syringe", g_esTeammate[special].g_iSyringeDartsReward[iPos], sSet[iPos], -1, MT_MAXHEALTH); g_esTeammate[special].g_iThornsReward[iPos] = iGetClampedValue(key, "ThornsReward", "Thorns Reward", "Thorns_Reward", "thorns", g_esTeammate[special].g_iThornsReward[iPos], sSet[iPos], -1, 1); g_esTeammate[special].g_iUsefulRewards[iPos] = iGetClampedValue(key, "UsefulRewards", "Useful Rewards", "Useful_Rewards", "useful", g_esTeammate[special].g_iUsefulRewards[iPos], sSet[iPos], -1, 15); g_esTeammate[special].g_iVoicePitchVisual[iPos] = iGetClampedValue(key, "VoicePitchVisual", "Voice Pitch Visual", "Voice_Pitch_Visual", "voicepitch", g_esTeammate[special].g_iVoicePitchVisual[iPos], sSet[iPos], -1, 255); @@ -17727,6 +23234,31 @@ void vReadTeammateSettings(int special, int mode, const char[] subsection, const g_esTeammate[special].g_iRockColor[iPos] = iGetClampedValue(key, "RockColor", "Rock Color", "Rock_Color", "rock", g_esTeammate[special].g_iRockColor[iPos], sSet[iPos], -1, 255); } } + else if (StrEqual(subsection, MT_CONFIG_SECTION_PARTICLES, false)) + { + if (StrEqual(key, "BodyChance", false) || StrEqual(key, "Body Chance", false) || StrEqual(key, "Body_Chance", false) || StrEqual(key, "bchance", false)) + { + char sValue[54], sSet[9][6]; + strcopy(sValue, sizeof sValue, value); + ReplaceString(sValue, sizeof sValue, " ", ""); + ExplodeString(sValue, ",", sSet, sizeof sSet, sizeof sSet[]); + for (int iPos = 0; iPos < (sizeof esTeammate::g_flBodyChance); iPos++) + { + g_esTeammate[special].g_flBodyChance[iPos] = (sSet[iPos][0] != '\0') ? flClamp(StringToFloat(sSet[iPos]), -1.0, 100.0) : g_esTeammate[special].g_flBodyChance[iPos]; + } + } + else if (StrEqual(key, "RockChance", false) || StrEqual(key, "Rock Chance", false) || StrEqual(key, "Rock_Chance", false) || StrEqual(key, "rchance", false)) + { + char sValue[54], sSet[9][6]; + strcopy(sValue, sizeof sValue, value); + ReplaceString(sValue, sizeof sValue, " ", ""); + ExplodeString(sValue, ",", sSet, sizeof sSet, sizeof sSet[]); + for (int iPos = 0; iPos < (sizeof esTeammate::g_flRockChance); iPos++) + { + g_esTeammate[special].g_flRockChance[iPos] = (sSet[iPos][0] != '\0') ? flClamp(StringToFloat(sSet[iPos]), -1.0, 100.0) : g_esTeammate[special].g_flRockChance[iPos]; + } + } + } vConfigsLoadedForward(subsection, key, value, -1, special, mode, true, specsection); } @@ -17770,7 +23302,7 @@ void vSetSpecialSettings(int mode, const char[] section, const char[] subsection { for (int iPlayer = 1; iPlayer <= MaxClients; iPlayer++) { - if (bIsValidClient(iPlayer, MT_CHECK_INGAME|MT_CHECK_FAKECLIENT) && (StrEqual(g_esPlayer[iPlayer].g_sSteamID32, section, false) || StrEqual(g_esPlayer[iPlayer].g_sSteam3ID, section, false))) + if (bIsValidClient(iPlayer, MT_CHECK_INGAME) && (StrEqual(g_esPlayer[iPlayer].g_sSteamID32, section, false) || StrEqual(g_esPlayer[iPlayer].g_sSteam3ID, section, false))) { vReadTeammateSettings(iPlayer, mode, subsection, specsection, key, value); @@ -17788,6 +23320,7 @@ void vSetTankSettings(int mode, const char[] section, const char[] subsection, c { g_esGeneral.g_iPluginEnabled = iGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "PluginEnabled", "Plugin Enabled", "Plugin_Enabled", "penabled", g_esGeneral.g_iPluginEnabled, value, -1, 1); g_esGeneral.g_iAutoUpdate = iGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "AutoUpdate", "Auto Update", "Auto_Update", "update", g_esGeneral.g_iAutoUpdate, value, -1, 1); + g_esGeneral.g_iGraphicsLevel = iGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "GraphicsLevel", "Graphics Level", "Graphics_Level", "graphics", g_esGeneral.g_iGraphicsLevel, value, -1, 3); g_esGeneral.g_iBulletFix = iGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "BulletFix", "Bullet Fix", "Bullet_Fix", "bfix", g_esGeneral.g_iBulletFix, value, -1, 1); g_esGeneral.g_iKickBots = iGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "KickBots", "Kick Bots", "Kick_Bots", "kick", g_esGeneral.g_iKickBots, value, -1, 1); g_esGeneral.g_iListenSupport = iGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "ListenSupport", "Listen Support", "Listen_Support", "listen", g_esGeneral.g_iListenSupport, value, -1, 1); @@ -17800,6 +23333,8 @@ void vSetTankSettings(int mode, const char[] section, const char[] subsection, c g_esGeneral.g_iLogMessages = iGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "LogMessages", "Log Messages", "Log_Messages", "logmsgs", g_esGeneral.g_iLogMessages, value, -1, 31); g_esGeneral.g_iRequiresHumans = iGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "RequiresHumans", "Requires Humans", "Requires_Humans", "hrequire", g_esGeneral.g_iRequiresHumans, value, -1, 32); g_esGeneral.g_iTankEnabled = iGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "TankEnabled", "Tank Enabled", "Tank_Enabled", "tenabled", g_esGeneral.g_iTankEnabled, value, -1, 1); + g_esGeneral.g_flTankChance = flGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "TankChance", "Tank Chance", "Tank_Chance", "chance", g_esGeneral.g_flTankChance, value, -1.0, 100.0); + g_esGeneral.g_iTankNote = iGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "TankNote", "Tank Note", "Tank_Note", "note", g_esGeneral.g_iTankNote, value, -1, 1); g_esGeneral.g_iTankModel = iGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "TankModel", "Tank Model", "Tank_Model", "model", g_esGeneral.g_iTankModel, value, -1, 7); g_esGeneral.g_flBurnDuration = flGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "BurnDuration", "Burn Duration", "Burn_Duration", "burndur", g_esGeneral.g_flBurnDuration, value, -1.0, 99999.0); g_esGeneral.g_flBurntSkin = flGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "BurntSkin", "Burnt Skin", "Burnt_Skin", "burnt", g_esGeneral.g_flBurntSkin, value, -2.0, 1.0); @@ -17817,7 +23352,92 @@ void vSetTankSettings(int mode, const char[] section, const char[] subsection, c g_esGeneral.g_iKillMessage = iGetKeyValue(subsection, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE2, key, "KillMessage", "Kill Message", "Kill_Message", "killmsg", g_esGeneral.g_iKillMessage, value, -1, 1023); g_esGeneral.g_iVocalizeArrival = iGetKeyValue(subsection, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE2, key, "VocalizeArrival", "Vocalize Arrival", "Vocalize_Arrival", "arrivalvoc", g_esGeneral.g_iVocalizeArrival, value, -1, 1); g_esGeneral.g_iVocalizeDeath = iGetKeyValue(subsection, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE2, key, "VocalizeDeath", "Vocalize Death", "Vocalize_Death", "deathvoc", g_esGeneral.g_iVocalizeDeath, value, -1, 1); + g_esGeneral.g_iFinaleCheck = iGetKeyValue(subsection, MT_CONFIG_SECTION_PUNISH, MT_CONFIG_SECTION_PUNISH, MT_CONFIG_SECTION_PUNISH, MT_CONFIG_SECTION_PUNISH2, key, "FinaleCheck", "Finale Check", "Finale_Check", "fincheck", g_esGeneral.g_iFinaleCheck, value, -1, 2); + g_esGeneral.g_iSurvivorTypes = iGetKeyValue(subsection, MT_CONFIG_SECTION_PUNISH, MT_CONFIG_SECTION_PUNISH, MT_CONFIG_SECTION_PUNISH, MT_CONFIG_SECTION_PUNISH2, key, "SurvivorTypes", "Survivor Types", "Survivor_Types", "stypes", g_esGeneral.g_iSurvivorTypes, value, -1, 63); + g_esGeneral.g_iSurvivorsRequired = iGetKeyValue(subsection, MT_CONFIG_SECTION_PUNISH, MT_CONFIG_SECTION_PUNISH, MT_CONFIG_SECTION_PUNISH, MT_CONFIG_SECTION_PUNISH2, key, "SurvivorsRequired", "Survivors Required", "Survivors_Required", "survivors", g_esGeneral.g_iSurvivorsRequired, value, -1, 32); + g_esGeneral.g_iIncapsRequired = iGetKeyValue(subsection, MT_CONFIG_SECTION_PUNISH, MT_CONFIG_SECTION_PUNISH, MT_CONFIG_SECTION_PUNISH, MT_CONFIG_SECTION_PUNISH2, key, "IncapsRequired", "Incaps Required", "Incaps_Required", "incaps", g_esGeneral.g_iIncapsRequired, value, -1, 32); g_esGeneral.g_iTeammateLimit = iGetKeyValue(subsection, MT_CONFIG_SECTION_REWARDS, MT_CONFIG_SECTION_REWARDS, MT_CONFIG_SECTION_REWARDS, MT_CONFIG_SECTION_REWARDS, key, "TeammateLimit", "Teammate Limit", "Teammate_Limit", "teamlimit", g_esGeneral.g_iTeammateLimit, value, -1, 32); + g_esHuman.g_flCarrierChance = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "CarrierChance", "Carrier Chance", "Carrier_Chance", "cachance", g_esHuman.g_flCarrierChance, value, -1.0, 100.0); + g_esHuman.g_flCarrierDamageMultiplier = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "CarrierDamageMultiplier", "Carrier Damage Multiplier", "Carrier_Damage_Multiplier", "cadmgmulti", g_esHuman.g_flCarrierDamageMultiplier, value, -1.0, 99999.0); + g_esHuman.g_flCarrierDelay = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "CarrierDelay", "Carrier Delay", "Carrier_Delay", "cadelay", g_esHuman.g_flCarrierDelay, value, -1.0, 99999.0); + g_esHuman.g_flCarrierHealthMultiplier = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "CarrierHealthMultiplier", "Carrier Health Multiplier", "Carrier_Health_Multiplier", "cahpmulti", g_esHuman.g_flCarrierHealthMultiplier, value, -1.0, 99999.0); + g_esHuman.g_flCarrierVoiceChance = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "CarrierVoiceChance", "Carrier Voice Chance", "Carrier_Voice_Chance", "cavoicechance", g_esHuman.g_flCarrierVoiceChance, value, -1.0, 100.0); + g_esHuman.g_flCarrierVoiceInterval = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "CarrierVoiceInterval", "Carrier Voice Interval", "Carrier_Voice_Interval", "cavoiceint", g_esHuman.g_flCarrierVoiceInterval, value, -1.0, 99999.0); + g_esHuman.g_iCarrierEnabled = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "CarrierEnabled", "Carrier Enabled", "Carrier_Enabled", "caenabled", g_esHuman.g_iCarrierEnabled, value, -1, 1); + g_esHuman.g_iCarrierBots = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "CarrierBots", "Carrier Bots", "Carrier_Bots", "cabots", g_esHuman.g_iCarrierBots, value, -1, 1); + g_esHuman.g_iCarrierBody = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "CarrierBody", "Carrier Body", "Carrier_Body", "cabody", g_esHuman.g_iCarrierBody, value, -1, 1); + g_esHuman.g_iCarrierCleanse = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "CarrierCleanse", "Carrier Cleanse", "Carrier_Cleanse", "cacleanse", g_esHuman.g_iCarrierCleanse, value, -1, 1); + g_esHuman.g_iCarrierFilter = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "CarrierFilter", "Carrier Filter", "Carrier_Filter", "cafilter", g_esHuman.g_iCarrierFilter, value, -1, 127); + g_esHuman.g_iCarrierInfection = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "CarrierInfection", "Carrier Infection", "Carrier_Infection", "cainfect", g_esHuman.g_iCarrierInfection, value, -1, 511); + g_esHuman.g_iCarrierMix = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "CarrierMix", "Carrier Mix", "Carrier_Mix", "camix", g_esHuman.g_iCarrierMix, value, -1, 1); + g_esHuman.g_iCarrierMode = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "CarrierMode", "Carrier Mode", "Carrier_Mode", "camode", g_esHuman.g_iCarrierMode, value, -1, 6); + g_esHuman.g_iCarrierTeleport = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "CarrierTeleport", "Carrier Teleport", "Carrier_Teleport", "cateleport", g_esHuman.g_iCarrierTeleport, value, -1, 1); + g_esHuman.g_iCarrierVoice = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "CarrierVoice", "Carrier Voice", "Carrier_Voice", "cavoice", g_esHuman.g_iCarrierVoice, value, -1, 1); + g_esHuman.g_flActionDurationPassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "ActionDurationPassive", "Action Duration Passive", "Action_Duration_Passive", "actionduration", g_esHuman.g_flActionDurationPassive, value, -1.0, 99999.0); + g_esHuman.g_flAdrenalineTimePassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "AdrenalineTimePassive", "Adrenaline Time Passive", "Adrenaline_Time_Passive", "adrenaline", g_esHuman.g_flAdrenalineTimePassive, value, -1.0, 99999.0); + g_esHuman.g_flAttackBoostPassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "AttackBoostPassive", "Attack Boost Passive", "Attack_Boost_Passive", "attackboost", g_esHuman.g_flAttackBoostPassive, value, -1.0, 99999.0); + g_esHuman.g_flDamageBoostPassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "DamageBoostPassive", "Damage Boost Passive", "Damage_Boost_Passive", "dmgboost", g_esHuman.g_flDamageBoostPassive, value, -1.0, 99999.0); + g_esHuman.g_flDamageResistancePassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "DamageResistancePassive", "Damage Resistance Passive", "Damage_Resistance_Passive", "dmgres", g_esHuman.g_flDamageResistancePassive, value, -1.0, 99999.0); + g_esHuman.g_flDopamineRadiusPassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "DopamineRadiusPassive", "Dopamine Radius Passive", "Dopamine_Radius_Passive", "dopamine", g_esHuman.g_flDopamineRadiusPassive, value, -1.0, 99999.0); + g_esHuman.g_flFireRatePassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "FireRatePassive", "Fire Rate Passive", "Fire_Rate_Passive", "firerate", g_esHuman.g_flFireRatePassive, value, -1.0, 99999.0); + g_esHuman.g_flGrenadeLauncherPassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "GrenadeLauncherPassive", "Grenade Launcher Passive", "Grenade_Launcher_Passive", "grenade", g_esHuman.g_flGrenadeLauncherPassive, value, -1.0, 100.0); + g_esHuman.g_flHealPercentPassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "HealPercentPassive", "Heal Percent Passive", "Heal_Percent_Passive", "healpercent", g_esHuman.g_flHealPercentPassive, value, -1.0, 100.0); + g_esHuman.g_flHealthcareRadiusPassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "HealthcareRadiusPassive", "Healthcare Radius Passive", "Healthcare_Radius_Passive", "healthcare", g_esHuman.g_flHealthcareRadiusPassive, value, -1.0, 99999.0); + g_esHuman.g_flHeartbeatPassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "HeartbeatPassive", "Heartbeat Passive", "Heartbeat_Passive", "heartbeat", g_esHuman.g_flHeartbeatPassive, value, -1.0, 99999.0); + g_esHuman.g_flHollowpointAmmoPassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "HollowpointAmmoPassive", "Hollowpoint Ammo Passive", "Hollowpoint_Ammo_Passive", "hollowpoint", g_esHuman.g_flHollowpointAmmoPassive, value, -1.0, 100.0); + g_esHuman.g_flJumpHeightPassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "JumpHeightPassive", "Jump Height Passive", "Jump_Height_Passive", "jumpheight", g_esHuman.g_flJumpHeightPassive, value, -1.0, 99999.0); + g_esHuman.g_flLadyKillerPassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "LadyKillerPassive", "Lady Killer Passive", "Lady_Killer_Passive", "ladykiller", g_esHuman.g_flLadyKillerPassive, value, -1.0, 100.0); + g_esHuman.g_flLuckyBulletPassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "LuckyBulletPassive", "Lucky Bullet Passive", "Lucky_Bullet_Passive", "luckybullet", g_esHuman.g_flLuckyBulletPassive, value, -1.0, 100.0); + g_esHuman.g_flMotivationRadiusPassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "MotivationRadiusPassive", "Motivation Radius Passive", "Motivation_Radius_Passive", "motivation", g_esHuman.g_flMotivationRadiusPassive, value, -1.0, 99999.0); + g_esHuman.g_flOverdoseRadiusPassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "OverdoseRadiusPassive", "Overdose Radius Passive", "Overdose_Radius_Passive", "overdose", g_esHuman.g_flOverdoseRadiusPassive, value, -1.0, 99999.0); + g_esHuman.g_flPipeBombDurationPassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "PipebombDurationPassive", "Pipebomb Duration Passive", "Pipebomb_Duration_Passive", "pipeduration", g_esHuman.g_flPipeBombDurationPassive, value, -1.0, 99999.0); + g_esHuman.g_flPunchResistancePassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "PunchResistancePassive", "Punch Resistance Passive", "Punch_Resistance_Passive", "punchres", g_esHuman.g_flPunchResistancePassive, value, -1.0, 99999.0); + g_esHuman.g_flRapidPistolPassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "RapidPistolPassive", "Rapid Pistol Passive", "Rapid_Pistol_Passive", "rapidpistol", g_esHuman.g_flRapidPistolPassive, value, -1.0, 1.0); + g_esHuman.g_flRefillPercentPassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "RefillPercentPassive", "Refill Percent Passive", "Refill_Percent_Passive", "refillpercent", g_esHuman.g_flRefillPercentPassive, value, -1.0, 100.0); + g_esHuman.g_flReloadRatePassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "ReloadRatePassive", "Reload Rate Passive", "Reload_Rate_Passive", "reloadrate", g_esHuman.g_flReloadRatePassive, value, -1.0, 99999.0); + g_esHuman.g_flShockwaveRadiusPassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "ShockwaveRadiusPassive", "Shockwave Radius Passive", "Shockwave_Radius_Passive", "shockwave", g_esHuman.g_flShockwaveRadiusPassive, value, -1.0, 99999.0); + g_esHuman.g_flShoveDamagePassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "ShoveDamagePassive", "Shove Damage Passive", "Shove_Damage_Passive", "shovedmg", g_esHuman.g_flShoveDamagePassive, value, -1.0, 99999.0); + g_esHuman.g_flShoveRatePassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "ShoveRatePassive", "Shove Rate Passive", "Shove_Rate_Passive", "shoverate", g_esHuman.g_flShoveRatePassive, value, -1.0, 99999.0); + g_esHuman.g_flSledgehammerRoundsPassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "SledgehammerRoundsPassive", "Sledgehammer Rounds Passive", "Sledgehammer_Rounds_Passive", "sledgehammer", g_esHuman.g_flSledgehammerRoundsPassive, value, -1.0, 100.0); + g_esHuman.g_flSpeedBoostPassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "SpeedBoostPassive", "Speed Boost Passive", "Speed_Boost_Passive", "speedboost", g_esHuman.g_flSpeedBoostPassive, value, -1.0, 99999.0); + g_esHuman.g_flSupplierPassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "SupplierPassive", "Supplier Passive", "Supplier_Passive", "supplier", g_esHuman.g_flSupplierPassive, value, -1.0, 99999.0); + g_esHuman.g_flSwingRatePassive = flGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "SwingRatePassive", "Swing Rate Passive", "Swing_Rate_Passive", "swingrate", g_esHuman.g_flSwingRatePassive, value, -1.0, 99999.0); + g_esHuman.g_iPassiveEnabled = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "PassiveEnabled", "Passive Enabled", "Passive_Enabled", "psenabled", g_esHuman.g_iPassiveEnabled, value, -2, 2147483647); + g_esHuman.g_iPassiveBots = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "PassiveBots", "Passive Bots", "Passive_Bots", "psbots", g_esHuman.g_iPassiveBots, value, -2, 2147483647); + g_esHuman.g_iPassiveNotify = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "PassiveNotify", "Passive Notify", "Passive_Notify", "psnotify", g_esHuman.g_iPassiveNotify, value, -1, 1); + g_esHuman.g_iAmmoBoostPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "AmmoBoostPassive", "Ammo Boost Passive", "Ammo_Boost_Passive", "ammoboost", g_esHuman.g_iAmmoBoostPassive, value, -1, 1); + g_esHuman.g_iAmmoRefillPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "AmmoRefillPassive", "Ammo Refill Passive", "Ammo_Refill_Passive", "ammorefill", g_esHuman.g_iAmmoRefillPassive, value, -1, 1); + g_esHuman.g_iAmmoRegenPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "AmmoRegenPassive", "Ammo Regen Passive", "Ammo_Regen_Passive", "ammoregen", g_esHuman.g_iAmmoRegenPassive, value, -1, 99999); + g_esHuman.g_iBlazeHealthPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "BlazeHealthPassive", "Blaze Health Passive", "Blaze_Health_Passive", "blaze", g_esHuman.g_iBlazeHealthPassive, value, -1, MT_MAXHEALTH); + g_esHuman.g_iBloodDonorPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "BloodDonorPassive", "Blood Donor Passive", "Blood_Donor_Passive", "donor", g_esHuman.g_iBloodDonorPassive, value, -1, MT_MAXHEALTH); + g_esHuman.g_iBunnyHopPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "BunnyHopPassive", "Bunny Hop Passive", "Bunny_Hop_Passive", "bhop", g_esHuman.g_iBunnyHopPassive, value, -1, 1); + g_esHuman.g_iBurstDoorsPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "BurstDoorsPassive", "Burst Doors Passive", "Burst_Doors_Passive", "burstdoors", g_esHuman.g_iBurstDoorsPassive, value, -1, 1); + g_esHuman.g_iCleanKillsPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "CleanKillsPassive", "Clean Kills Passive", "Clean_Kills_Passive", "cleankills", g_esHuman.g_iCleanKillsPassive, value, -1, 1); + g_esHuman.g_iClusterBombsPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "ClusterBombsPassive", "Cluster Bombs Passive", "Cluster_Bombs_Passive", "cluster", g_esHuman.g_iClusterBombsPassive, value, -1, 5); + g_esHuman.g_iEternalFlamesPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "EternalFlamesPassive", "Eternal Flames Passive", "Eternal_Flames_Passive", "eternal", g_esHuman.g_iEternalFlamesPassive, value, -1, 1); + g_esHuman.g_iFastRecoveryPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "FastRecoveryPassive", "Fast Recovery Passive", "Fast_Recovery_Passive", "fastrecovery", g_esHuman.g_iFastRecoveryPassive, value, -1, 1); + g_esHuman.g_iFriendlyFirePassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "FriendlyFirePassive", "Friendly Fire Passive", "Friendly_Fire_Passive", "friendlyfire", g_esHuman.g_iFriendlyFirePassive, value, -1, 1); + g_esHuman.g_iGhostBulletsPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "GhostBulletsPassive", "Ghost Bullets Passive", "Ghost_Bullets_Passive", "ghost", g_esHuman.g_iGhostBulletsPassive, value, -1, 1); + g_esHuman.g_iHealthRegenPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "HealthRegenPassive", "Health Regen Passive", "Health_Regen_Passive", "hpregen", g_esHuman.g_iHealthRegenPassive, value, -1, MT_MAXHEALTH); + g_esHuman.g_iInfiniteAmmoPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "InfiniteAmmoPassive", "Infinite Ammo Passive", "Infinite_Ammo_Passive", "infammo", g_esHuman.g_iInfiniteAmmoPassive, value, -1, 31); + g_esHuman.g_iLadderActionsPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "LadderActionsPassive", "Ladder Actions Passive", "Ladder_Action_Passive", "ladderacts", g_esHuman.g_iLadderActionsPassive, value, -1, 1); + g_esHuman.g_iLaserSightPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "LaserSightPassive", "Laser Sight Passive", "Laser_Sight_Passive", "lasersight", g_esHuman.g_iLaserSightPassive, value, -1, 1); + g_esHuman.g_iLifeLeechPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "LifeLeechPassive", "Life Leech Passive", "Life_Leech_Passive", "lifeleech", g_esHuman.g_iLifeLeechPassive, value, -1, MT_MAXHEALTH); + g_esHuman.g_iMedicalCutsPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "MedicalCutsPassive", "Medical Cuts Passive", "Medical_Cuts_Passive", "medcuts", g_esHuman.g_iMedicalCutsPassive, value, -1, MT_MAXHEALTH); + g_esHuman.g_iMeleeRangePassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "MeleeRangePassive", "Melee Range Passive", "Melee_Range_Passive", "meleerange", g_esHuman.g_iMeleeRangePassive, value, -1, 99999); + g_esHuman.g_iMidairDashesPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "MidairDashesPassive", "Midair Dashes Passive", "Midair_Dashes_Passive", "middash", g_esHuman.g_iMidairDashesPassive, value, -1, 99999); + g_esHuman.g_iOverhealthPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "OverhealthPassive", "Overhealth Passive", "Overhealth_Passive", "overhealth", g_esHuman.g_iOverhealthPassive, value, -1, MT_MAXHEALTH); + g_esHuman.g_iRecoilDampenerPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "RecoilDampenerPassive", "Recoil Dampener Passive", "Recoil_Dampener_Passive", "recoil", g_esHuman.g_iRecoilDampenerPassive, value, -1, 1); + g_esHuman.g_iRegenBurstsPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "RegenBurstsPassive", "Regen Bursts Passive", "Regen_Bursts_Passive", "regbursts", g_esHuman.g_iRegenBurstsPassive, value, -1, MT_MAXHEALTH); + g_esHuman.g_iRespawnLoadoutPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "RespawnLoadoutPassive", "Respawn Loadout Passive", "Respawn_Loadout_Passive", "resloadout", g_esHuman.g_iRespawnLoadoutPassive, value, -1, 1); + g_esHuman.g_iReviveHealthPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "ReviveHealthPassive", "Revive Health Passive", "Revive_Health_Passive", "revivehp", g_esHuman.g_iReviveHealthPassive, value, -1, MT_MAXHEALTH); + g_esHuman.g_iRiotGearPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "RiotGearPassive", "Riot Gear Passive", "Riot_Gear_Passive", "riotgear", g_esHuman.g_iRiotGearPassive, value, -1, 1); + g_esHuman.g_iSafetyBubblePassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "SafetyBubblePassive", "Safety Bubble Passive", "Safety_Bubble_Passive", "safetybubble", g_esHuman.g_iSafetyBubblePassive, value, -1, 1); + g_esHuman.g_iShovePenaltyPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "ShovePenaltyPassive", "Shove Penalty Passive", "Shove_Penalty_Passive", "shovepenalty", g_esHuman.g_iShovePenaltyPassive, value, -1, 1); + g_esHuman.g_iSpecialAmmoPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "SpecialAmmoPassive", "Special Ammo Passive", "Special_Ammo_Passive", "specammo", g_esHuman.g_iSpecialAmmoPassive, value, -1, 3); + g_esHuman.g_iStickyGrenadesPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "StickyGrenadesPassive", "Sticky Grenades Passive", "Sticky_Grenades_Passive", "sticky", g_esHuman.g_iStickyGrenadesPassive, value, -1, 1); + g_esHuman.g_iSyringeDartsPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "SyringeDartsPassive", "Syringe Darts Passive", "Syringe_Darts_Passive", "syringe", g_esHuman.g_iSyringeDartsPassive, value, -1, MT_MAXHEALTH); + g_esHuman.g_iThornsPassive = iGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "ThornsPassive", "Thorns Passive", "Thorns_Passive", "thorns", g_esHuman.g_iThornsPassive, value, -1, 1); g_esGeneral.g_iAutoAggravate = iGetKeyValue(subsection, MT_CONFIG_SECTION_COMP, MT_CONFIG_SECTION_COMP, MT_CONFIG_SECTION_COMP, MT_CONFIG_SECTION_COMP2, key, "AutoAggravate", "Auto Aggravate", "Auto_Aggravate", "autoaggro", g_esGeneral.g_iAutoAggravate, value, -1, 1); g_esGeneral.g_iCreditIgniters = iGetKeyValue(subsection, MT_CONFIG_SECTION_COMP, MT_CONFIG_SECTION_COMP, MT_CONFIG_SECTION_COMP, MT_CONFIG_SECTION_COMP2, key, "CreditIgniters", "Credit Igniters", "Credit_Igniters", "credit", g_esGeneral.g_iCreditIgniters, value, -1, 1); g_esGeneral.g_flForceSpawn = flGetKeyValue(subsection, MT_CONFIG_SECTION_COMP, MT_CONFIG_SECTION_COMP, MT_CONFIG_SECTION_COMP, MT_CONFIG_SECTION_COMP2, key, "ForceSpawn", "Force Spawn", "Force_Spawn", "force", g_esGeneral.g_flForceSpawn, value, -1.0, 99999.0); @@ -17825,7 +23445,23 @@ void vSetTankSettings(int mode, const char[] section, const char[] subsection, c g_esGeneral.g_iStasisMode = iGetKeyValue(subsection, MT_CONFIG_SECTION_COMP, MT_CONFIG_SECTION_COMP, MT_CONFIG_SECTION_COMP, MT_CONFIG_SECTION_COMP2, key, "StasisMode", "Stasis Mode", "Stasis_Mode", "stasis", g_esGeneral.g_iStasisMode, value, -1, 1); g_esGeneral.g_flSurvivalDelay = flGetKeyValue(subsection, MT_CONFIG_SECTION_COMP, MT_CONFIG_SECTION_COMP, MT_CONFIG_SECTION_COMP, MT_CONFIG_SECTION_COMP2, key, "SurvivalDelay", "Survival Delay", "Survival_Delay", "survdelay", g_esGeneral.g_flSurvivalDelay, value, -1.0, 99999.0); g_esGeneral.g_iScaleDamage = iGetKeyValue(subsection, MT_CONFIG_SECTION_DIFF, MT_CONFIG_SECTION_DIFF, MT_CONFIG_SECTION_DIFF, MT_CONFIG_SECTION_DIFF2, key, "ScaleDamage", "Scale Damage", "Scale_Damage", "scaledmg", g_esGeneral.g_iScaleDamage, value, -1, 1); + g_esGeneral.g_flInfectedChance = flGetKeyValue(subsection, MT_CONFIG_SECTION_SIZE, MT_CONFIG_SECTION_SIZE, MT_CONFIG_SECTION_SIZE, MT_CONFIG_SECTION_SIZE, key, "InfectedChance", "Infected Chance", "Infected_Chance", "infchance", g_esGeneral.g_flInfectedChance, value, -1.0, 100.0); + g_esGeneral.g_iInfectedDamage = iGetKeyValue(subsection, MT_CONFIG_SECTION_SIZE, MT_CONFIG_SECTION_SIZE, MT_CONFIG_SECTION_SIZE, MT_CONFIG_SECTION_SIZE, key, "InfectedDamage", "Infected Damage", "Infected_Damage", "infdmg", g_esGeneral.g_iInfectedDamage, value, -1, 1); + g_esGeneral.g_iInfectedHealth = iGetKeyValue(subsection, MT_CONFIG_SECTION_SIZE, MT_CONFIG_SECTION_SIZE, MT_CONFIG_SECTION_SIZE, MT_CONFIG_SECTION_SIZE, key, "InfectedHealth", "Infected Health", "Infected_Health", "infhp", g_esGeneral.g_iInfectedHealth, value, -1, 1); + g_esGeneral.g_flJockeyChance = flGetKeyValue(subsection, MT_CONFIG_SECTION_SIZE, MT_CONFIG_SECTION_SIZE, MT_CONFIG_SECTION_SIZE, MT_CONFIG_SECTION_SIZE, key, "JockeyChance", "Jockey Chance", "Jockey_Chance", "jockeychance", g_esGeneral.g_flJockeyChance, value, -1.0, 100.0); + g_esGeneral.g_iJockeyDamage = iGetKeyValue(subsection, MT_CONFIG_SECTION_SIZE, MT_CONFIG_SECTION_SIZE, MT_CONFIG_SECTION_SIZE, MT_CONFIG_SECTION_SIZE, key, "JockeyDamage", "Jockey Damage", "Jockey_Damage", "jockeydmg", g_esGeneral.g_iJockeyDamage, value, -1, 1); + g_esGeneral.g_iJockeyHealth = iGetKeyValue(subsection, MT_CONFIG_SECTION_SIZE, MT_CONFIG_SECTION_SIZE, MT_CONFIG_SECTION_SIZE, MT_CONFIG_SECTION_SIZE, key, "JockeyHealth", "Jockey Health", "Jockey_Health", "jockeyhp", g_esGeneral.g_iJockeyHealth, value, -1, 1); + g_esGeneral.g_flWitchChance = flGetKeyValue(subsection, MT_CONFIG_SECTION_SIZE, MT_CONFIG_SECTION_SIZE, MT_CONFIG_SECTION_SIZE, MT_CONFIG_SECTION_SIZE, key, "WitchChance", "Witch Chance", "Witch_Chance", "witchchance", g_esGeneral.g_flWitchChance, value, -1.0, 100.0); + g_esGeneral.g_iWitchDamage = iGetKeyValue(subsection, MT_CONFIG_SECTION_SIZE, MT_CONFIG_SECTION_SIZE, MT_CONFIG_SECTION_SIZE, MT_CONFIG_SECTION_SIZE, key, "WitchDamage", "Witch Damage", "Witch_Damage", "witchdmg", g_esGeneral.g_iWitchDamage, value, -1, 1); + g_esGeneral.g_iWitchHealth = iGetKeyValue(subsection, MT_CONFIG_SECTION_SIZE, MT_CONFIG_SECTION_SIZE, MT_CONFIG_SECTION_SIZE, MT_CONFIG_SECTION_SIZE, key, "WitchHealth", "Witch Health", "Witch_Health", "witchhp", g_esGeneral.g_iWitchHealth, value, -1, 1); g_esGeneral.g_iBaseHealth = iGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "BaseHealth", "Base Health", "Base_Health", "basehp", g_esGeneral.g_iBaseHealth, value, -1, MT_MAXHEALTH); + g_esGeneral.g_flArmorPercentage = flGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "ArmorPercentage", "Armor Percentage", "Armor_Percentage", "armorpercent", g_esGeneral.g_flArmorPercentage, value, -1.0, 1.0); + g_esGeneral.g_flArmorResistance[0] = flGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "ArmorResistance", "Armor Resistance", "Armor_Resistance", "armorres", g_esGeneral.g_flArmorResistance[0], value, -1.0, 1.0); + g_esGeneral.g_flShieldPercentage = flGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "ShieldPercentage", "Shield Percentage", "Shield_Percentage", "shieldpercent", g_esGeneral.g_flShieldPercentage, value, -1.0, 1.0); + g_esGeneral.g_flShieldRate = flGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "ShieldRate", "Shield Rate", "Shield_Rate", "shieldrate", g_esGeneral.g_flShieldRate, value, -1.0, 1.0); + g_esGeneral.g_flPassiveDelay = flGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "PassiveDelay", "Passive Delay", "Passive_Delay", "passdelay", g_esGeneral.g_flPassiveDelay, value, -1.0, 99999.0); + g_esGeneral.g_iPassiveHealth = iGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "PassiveHealth", "Passive Health", "Passive_Health", "passhp", g_esGeneral.g_iPassiveHealth, value, MT_MAX_HEALTH_REDUCTION, MT_MAXHEALTH); + g_esGeneral.g_flPassiveInterval = flGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "PassiveInterval", "Passive Interval", "Passive_Interval", "passint", g_esGeneral.g_flPassiveInterval, value, -1.0, 99999.0); g_esGeneral.g_iDisplayHealth = iGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "DisplayHealth", "Display Health", "Display_Health", "displayhp", g_esGeneral.g_iDisplayHealth, value, -1, 11); g_esGeneral.g_iDisplayHealthType = iGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "DisplayHealthType", "Display Health Type", "Display_Health_Type", "displaytype", g_esGeneral.g_iDisplayHealthType, value, -1, 2); g_esGeneral.g_iExtraHealth = iGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "ExtraHealth", "Extra Health", "Extra_Health", "extrahp", g_esGeneral.g_iExtraHealth, value, MT_MAX_HEALTH_REDUCTION, MT_MAXHEALTH); @@ -17833,12 +23469,13 @@ void vSetTankSettings(int mode, const char[] section, const char[] subsection, c g_esGeneral.g_iHumanMultiplierMode = iGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "HumanMultiplierMode", "Human Multiplier Mode", "Human_Multiplier_Mode", "humanmultimode", g_esGeneral.g_iHumanMultiplierMode, value, -1, 1); g_esGeneral.g_iMinimumHumans = iGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "MinimumHumans", "Minimum Humans", "Minimum_Humans", "minhumans", g_esGeneral.g_iMinimumHumans, value, -1, 32); g_esGeneral.g_iMultiplyHealth = iGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "MultiplyHealth", "Multiply Health", "Multiply_Health", "multihp", g_esGeneral.g_iMultiplyHealth, value, -1, 3); - g_esGeneral.g_iSpawnProtection = iGetKeyValue(subsection, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION2, key, "SpawnProtection", "Spawn Protection", "Spawn_Protection", "protect", g_esGeneral.g_iSpawnProtection, value, -1, 3); - g_esGeneral.g_flArmorDuration = flGetKeyValue(subsection, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION2, key, "ArmorDuration", "Armor Duration", "Armor_Duration", "armorduration", g_esGeneral.g_flArmorDuration, value, -1.0, 99999.0); - g_esGeneral.g_flArmorResistance = flGetKeyValue(subsection, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION2, key, "ArmorResistance", "Armor Resistance", "Armor_Resistance", "armorres", g_esGeneral.g_flArmorResistance, value, -1.0, 1.0); - g_esGeneral.g_flShieldDuration = flGetKeyValue(subsection, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION2, key, "ShieldDuration", "Shield Duration", "Shield_Duration", "shieldduration", g_esGeneral.g_flShieldDuration, value, -1.0, 99999.0); - g_esGeneral.g_flShieldResistance = flGetKeyValue(subsection, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION2, key, "ShieldResistance", "Shield Resistance", "Shield_Resistance", "shieldres", g_esGeneral.g_flShieldResistance, value, -1.0, 1.0); + g_esGeneral.g_iSpawnProtection = iGetKeyValue(subsection, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT2, key, "SpawnProtection", "Spawn Protection", "Spawn_Protection", "protect", g_esGeneral.g_iSpawnProtection, value, -1, 3); + g_esGeneral.g_flArmorDuration = flGetKeyValue(subsection, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT2, key, "ArmorDuration", "Armor Duration", "Armor_Duration", "armorduration", g_esGeneral.g_flArmorDuration, value, -1.0, 99999.0); + g_esGeneral.g_flArmorResistance[1] = flGetKeyValue(subsection, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT2, key, "ArmorResistance", "Armor Resistance", "Armor_Resistance", "armorres", g_esGeneral.g_flArmorResistance[1], value, -1.0, 1.0); + g_esGeneral.g_flShieldDuration = flGetKeyValue(subsection, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT2, key, "ShieldDuration", "Shield Duration", "Shield_Duration", "shieldduration", g_esGeneral.g_flShieldDuration, value, -1.0, 99999.0); + g_esGeneral.g_flShieldResistance = flGetKeyValue(subsection, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT, MT_CONFIG_SECTION_PROTECT2, key, "ShieldResistance", "Shield Resistance", "Shield_Resistance", "shieldres", g_esGeneral.g_flShieldResistance, value, -1.0, 1.0); g_esGeneral.g_flAttackInterval = flGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "AttackInterval", "Attack Interval", "Attack_Interval", "attack", g_esGeneral.g_flAttackInterval, value, -1.0, 99999.0); + g_esGeneral.g_iAutoHop = iGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "BunnyHop", "Bunny Hop", "Bunny_Hop", "bhop", g_esGeneral.g_iAutoHop, value, -1, 1); g_esGeneral.g_flClawDamage = flGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "ClawDamage", "Claw Damage", "Claw_Damage", "claw", g_esGeneral.g_flClawDamage, value, -2.0, 99999.0); g_esGeneral.g_iFootstepShake = iGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "FootstepShake", "Footstep Shake", "Footstep_Shake", "shake", g_esGeneral.g_iFootstepShake, value, -1, 1); g_esGeneral.g_iGroundPound = iGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "GroundPound", "Ground Pound", "Ground_Pound", "pound", g_esGeneral.g_iGroundPound, value, -1, 1); @@ -17877,7 +23514,7 @@ void vSetTankSettings(int mode, const char[] section, const char[] subsection, c g_esGeneral.g_iRegularWave = iGetKeyValue(subsection, MT_CONFIG_SECTION_WAVES, MT_CONFIG_SECTION_WAVES, MT_CONFIG_SECTION_WAVES, MT_CONFIG_SECTION_WAVES, key, "RegularWave", "Regular Wave", "Regular_Wave", "regwave", g_esGeneral.g_iRegularWave, value, -1, 1); g_esGeneral.g_iFinaleAmount = iGetKeyValue(subsection, MT_CONFIG_SECTION_WAVES, MT_CONFIG_SECTION_WAVES, MT_CONFIG_SECTION_WAVES, MT_CONFIG_SECTION_WAVES, key, "FinaleAmount", "Finale Amount", "Finale_Amount", "finamount", g_esGeneral.g_iFinaleAmount, value, -1, 32); g_esGeneral.g_iFinaleMode = iGetKeyValue(subsection, MT_CONFIG_SECTION_WAVES, MT_CONFIG_SECTION_WAVES, MT_CONFIG_SECTION_WAVES, MT_CONFIG_SECTION_WAVES, key, "FinaleMode", "Finale Mode", "Finale_Mode", "finmode", g_esGeneral.g_iFinaleMode, value, -1, 1); - g_esGeneral.g_iRushTypes = iGetKeyValue(subsection, MT_CONFIG_SECTION_RUSH, MT_CONFIG_SECTION_RUSH, MT_CONFIG_SECTION_RUSH, MT_CONFIG_SECTION_RUSH, key, "RushTypes", "Rush Types", "Rush_Types", "types", g_esGeneral.g_iRushTypes, value, -1, 127); + g_esGeneral.g_iRushTypes = iGetKeyValue(subsection, MT_CONFIG_SECTION_RUSH, MT_CONFIG_SECTION_RUSH, MT_CONFIG_SECTION_RUSH, MT_CONFIG_SECTION_RUSH, key, "RushTypes", "Rush Types", "Rush_Types", "rutypes", g_esGeneral.g_iRushTypes, value, -1, 127); g_esGeneral.g_iCommonLimit = iGetKeyValue(subsection, MT_CONFIG_SECTION_RUSH, MT_CONFIG_SECTION_RUSH, MT_CONFIG_SECTION_RUSH, MT_CONFIG_SECTION_RUSH, key, "CommonLimit", "Common Limit", "Common_Limit", "climit", g_esGeneral.g_iCommonLimit, value, -1, 100); g_esGeneral.g_flCoopDelay = flGetKeyValue(subsection, MT_CONFIG_SECTION_RUSH, MT_CONFIG_SECTION_RUSH, MT_CONFIG_SECTION_RUSH, MT_CONFIG_SECTION_RUSH, key, "CoopDelay", "Coop Delay", "Coop_Delay", "delay", g_esGeneral.g_flCoopDelay, value, -1.0, 99999.0); g_esGeneral.g_flFinaleCooldown = flGetKeyValue(subsection, MT_CONFIG_SECTION_RUSH, MT_CONFIG_SECTION_RUSH, MT_CONFIG_SECTION_RUSH, MT_CONFIG_SECTION_RUSH, key, "FinaleCooldown", "Finale Cooldown", "Finale_Cooldown", "cooldown", g_esGeneral.g_flFinaleCooldown, value, -1.0, 99999.0); @@ -17890,7 +23527,12 @@ void vSetTankSettings(int mode, const char[] section, const char[] subsection, c g_esGeneral.g_iAccessFlags = iGetAdminFlagsValue(subsection, MT_CONFIG_SECTION_ADMIN, MT_CONFIG_SECTION_ADMIN, MT_CONFIG_SECTION_ADMIN, MT_CONFIG_SECTION_ADMIN2, key, "AccessFlags", "Access Flags", "Access_Flags", "access", value); g_esGeneral.g_iImmunityFlags = iGetAdminFlagsValue(subsection, MT_CONFIG_SECTION_ADMIN, MT_CONFIG_SECTION_ADMIN, MT_CONFIG_SECTION_ADMIN, MT_CONFIG_SECTION_ADMIN2, key, "ImmunityFlags", "Immunity Flags", "Immunity_Flags", "immunity", value); + vGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "CarrierAttackVoicelines", "Carrier Attack Voicelines", "Carrier_Attack_Voicelines", "caattacklines", g_esHuman.g_sCarrierAttackVoicelines, sizeof esHuman::g_sCarrierAttackVoicelines, value); + vGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "CarrierBaitVoicelines", "Carrier Bait Voicelines", "Carrier_Bait_Voicelines", "cabaitlines", g_esHuman.g_sCarrierBaitVoicelines, sizeof esHuman::g_sCarrierBaitVoicelines, value); + vGetKeyValue(subsection, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, MT_CONFIG_SECTION_SURVIVORS, key, "ItemPassive", "Item Passive", "Item_Passive", "item", g_esHuman.g_sItemPassive, sizeof esHuman::g_sItemPassive, value); + vGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "ArmorCharacters", "Armor Characters", "Armor_Characters", "armorchars", g_esGeneral.g_sArmorCharacters, sizeof esGeneral::g_sArmorCharacters, value); vGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "HealthCharacters", "Health Characters", "Health_Characters", "hpchars", g_esGeneral.g_sHealthCharacters, sizeof esGeneral::g_sHealthCharacters, value); + vGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "ShieldCharacters", "Shield Characters", "Shield_Characters", "shieldchars", g_esGeneral.g_sShieldCharacters, sizeof esGeneral::g_sShieldCharacters, value); if (StrEqual(subsection, MT_CONFIG_SECTION_GENERAL, false)) { @@ -17905,6 +23547,18 @@ void vSetTankSettings(int mode, const char[] section, const char[] subsection, c g_esGeneral.g_iMaxType = (sRange[1][0] != '\0') ? iClamp(StringToInt(sRange[1]), -1, MT_MAXTYPES) : g_esGeneral.g_iMaxType; } } + else if (StrEqual(subsection, MT_CONFIG_SECTION_CLASSES, false)) + { + if (g_esGeneral.g_alClassKeys[0] != null) + { + g_esGeneral.g_alClassKeys[0].PushString(key); + } + + if (g_esGeneral.g_alClassKeys[1] != null) + { + g_esGeneral.g_alClassKeys[1].PushString(value); + } + } else if (StrEqual(subsection, MT_CONFIG_SECTION_COLORS, false)) { if (g_esGeneral.g_alColorKeys[0] != null) @@ -17917,9 +23571,41 @@ void vSetTankSettings(int mode, const char[] section, const char[] subsection, c g_esGeneral.g_alColorKeys[1].PushString(value); } } + else if (StrEqual(subsection, MT_CONFIG_SECTION_PUNISH, false) || StrEqual(subsection, MT_CONFIG_SECTION_PUNISH2, false)) + { + char sValue[16], sSet[2][8]; + strcopy(sValue, sizeof sValue, value); + ReplaceString(sValue, sizeof sValue, " ", ""); + ExplodeString(sValue, ",", sSet, sizeof sSet, sizeof sSet[]); + for (int iPos = 0; iPos < (sizeof esGeneral::g_iPunishEnabled); iPos++) + { + g_esGeneral.g_flPunisherLifetime[iPos] = flGetClampedValue(key, "PunisherLifetime", "Punisher Lifetime", "Punisher_Lifetime", "lifetime", g_esGeneral.g_flPunisherLifetime[iPos], sSet[iPos], -1.0, 99999.0); + g_esGeneral.g_flWarningDistance[iPos] = flGetClampedValue(key, "WarningDistance", "Warning Distance", "Warning_Distance", "warndist", g_esGeneral.g_flWarningDistance[iPos], sSet[iPos], -1.0, 99999.0); + g_esGeneral.g_flPunishDistance[iPos] = flGetClampedValue(key, "PunishDistance", "Punish Distance", "Punish_Distance", "pudist", g_esGeneral.g_flPunishDistance[iPos], sSet[iPos], -1.0, 99999.0); + g_esGeneral.g_flZedTime[iPos] = flGetClampedValue(key, "ZedTime", "Zed Time", "Zed_Time", "zedtime", g_esGeneral.g_flZedTime[iPos], sSet[iPos], -1.0, 99999.0); + g_esGeneral.g_iPunishEnabled[iPos] = iGetClampedValue(key, "PunishEnabled", "Punish Enabled", "Punish_Enabled", "puenabled", g_esGeneral.g_iPunishEnabled[iPos], sSet[iPos], -1, MT_MAXTYPES); + g_esGeneral.g_iPunishBots[iPos] = iGetClampedValue(key, "PunishBots", "Punish Bots", "Punish_Bots", "pubots", g_esGeneral.g_iPunishBots[iPos], sSet[iPos], -1, MT_MAXTYPES); + g_esGeneral.g_iPunisherTypes[iPos] = iGetClampedValue(key, "PunisherTypes", "Punisher Types", "Punisher_Types", "ptypes", g_esGeneral.g_iPunisherTypes[iPos], sSet[iPos], -1, 127); + g_esGeneral.g_iWarningLimit[iPos] = iGetClampedValue(key, "WarningLimit", "Warning Limit", "Warning_Limit", "warnlimit", g_esGeneral.g_iWarningLimit[iPos], sSet[iPos], -1, 99999); + g_esGeneral.g_iWarningInterval[iPos] = iGetClampedValue(key, "WarningInterval", "Warning Interval", "Warning_Interval", "warnint", g_esGeneral.g_iWarningInterval[iPos], sSet[iPos], -1, 99999); + } + } + else if (StrEqual(subsection, MT_CONFIG_SECTION_SURVIVORS, false)) + { + if (StrEqual(key, "CarrierType", false) || StrEqual(key, "Carrier Type", false) || StrEqual(key, "Carrier_Type", false) || StrEqual(key, "catype", false)) + { + char sValue[10], sRange[2][5]; + strcopy(sValue, sizeof sValue, value); + ReplaceString(sValue, sizeof sValue, " ", ""); + ExplodeString(sValue, "-", sRange, sizeof sRange, sizeof sRange[]); + + g_esHuman.g_iCarrierMinType = (sRange[0][0] != '\0') ? iClamp(StringToInt(sRange[0]), -1, MT_MAXTYPES) : g_esHuman.g_iCarrierMinType; + g_esHuman.g_iCarrierMaxType = (sRange[1][0] != '\0') ? iClamp(StringToInt(sRange[1]), -1, MT_MAXTYPES) : g_esHuman.g_iCarrierMaxType; + } + } else if (StrEqual(subsection, MT_CONFIG_SECTION_REWARDS, false)) { - char sValue[1280], sSet[8][320]; + char sValue[2560], sSet[8][320]; strcopy(sValue, sizeof sValue, value); ReplaceString(sValue, sizeof sValue, " ", ""); ExplodeString(sValue, ",", sSet, sizeof sSet, sizeof sSet[]); @@ -17931,57 +23617,76 @@ void vSetTankSettings(int mode, const char[] section, const char[] subsection, c g_esGeneral.g_flRewardDuration[iPos] = flGetClampedValue(key, "RewardDuration", "Reward Duration", "Reward_Duration", "duration", g_esGeneral.g_flRewardDuration[iPos], sSet[iPos], -1.0, 99999.0); g_esGeneral.g_flRewardPercentage[iPos] = flGetClampedValue(key, "RewardPercentage", "Reward Percentage", "Reward_Percentage", "percent", g_esGeneral.g_flRewardPercentage[iPos], sSet[iPos], -1.0, 100.0); g_esGeneral.g_flActionDurationReward[iPos] = flGetClampedValue(key, "ActionDurationReward", "Action Duration Reward", "Action_Duration_Reward", "actionduration", g_esGeneral.g_flActionDurationReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esGeneral.g_flAdrenalineTimeReward[iPos] = flGetClampedValue(key, "AdrenalineTimeReward", "Adrenaline Time Reward", "Adrenaline_Time_Reward", "adrenaline", g_esGeneral.g_flAdrenalineTimeReward[iPos], sSet[iPos], -1.0, 99999.0); g_esGeneral.g_flAttackBoostReward[iPos] = flGetClampedValue(key, "AttackBoostReward", "Attack Boost Reward", "Attack_Boost_Reward", "attackboost", g_esGeneral.g_flAttackBoostReward[iPos], sSet[iPos], -1.0, 99999.0); g_esGeneral.g_flDamageBoostReward[iPos] = flGetClampedValue(key, "DamageBoostReward", "Damage Boost Reward", "Damage_Boost_Reward", "dmgboost", g_esGeneral.g_flDamageBoostReward[iPos], sSet[iPos], -1.0, 99999.0); g_esGeneral.g_flDamageResistanceReward[iPos] = flGetClampedValue(key, "DamageResistanceReward", "Damage Resistance Reward", "Damage_Resistance_Reward", "dmgres", g_esGeneral.g_flDamageResistanceReward[iPos], sSet[iPos], -1.0, 1.0); + g_esGeneral.g_flDopamineRadiusReward[iPos] = flGetClampedValue(key, "DopamineRadiusReward", "Dopamine Radius Reward", "Dopamine_Radius_Reward", "dopamine", g_esGeneral.g_flDopamineRadiusReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esGeneral.g_flFireRateReward[iPos] = flGetClampedValue(key, "FireRateReward", "Fire Rate Reward", "Fire_Rate_Reward", "firerate", g_esGeneral.g_flFireRateReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esGeneral.g_flGrenadeLauncherReward[iPos] = flGetClampedValue(key, "GrenadeLauncherReward", "Grenade Launcher Reward", "Grenade_Launcher_Reward", "grenade", g_esGeneral.g_flGrenadeLauncherReward[iPos], sSet[iPos], -1.0, 100.0); g_esGeneral.g_flHealPercentReward[iPos] = flGetClampedValue(key, "HealPercentReward", "Heal Percent Reward", "Heal_Percent_Reward", "healpercent", g_esGeneral.g_flHealPercentReward[iPos], sSet[iPos], -1.0, 100.0); + g_esGeneral.g_flHealthcareRadiusReward[iPos] = flGetClampedValue(key, "HealthcareRadiusReward", "Healthcare Radius Reward", "Healthcare_Radius_Reward", "healthcare", g_esGeneral.g_flHealthcareRadiusReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esGeneral.g_flHeartbeatReward[iPos] = flGetClampedValue(key, "HeartbeatReward", "Heartbeat Reward", "Heartbeat_Reward", "heartbeat", g_esGeneral.g_flHeartbeatReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esGeneral.g_flHollowpointAmmoReward[iPos] = flGetClampedValue(key, "HollowpointAmmoReward", "Hollowpoint Ammo Reward", "Hollowpoint_Ammo_Reward", "hollowpoint", g_esGeneral.g_flHollowpointAmmoReward[iPos], sSet[iPos], -1.0, 100.0); g_esGeneral.g_flJumpHeightReward[iPos] = flGetClampedValue(key, "JumpHeightReward", "Jump Height Reward", "Jump_Height_Reward", "jumpheight", g_esGeneral.g_flJumpHeightReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esGeneral.g_flLadyKillerReward[iPos] = flGetClampedValue(key, "LadyKillerReward", "Lady Killer Reward", "Lady_Killer_Reward", "ladykiller", g_esGeneral.g_flLadyKillerReward[iPos], sSet[iPos], -1.0, 100.0); g_esGeneral.g_flLoopingVoicelineInterval[iPos] = flGetClampedValue(key, "LoopingVoicelineInterval", "Looping Voiceline Interval", "Looping_Voiceline_Interval", "loopinterval", g_esGeneral.g_flLoopingVoicelineInterval[iPos], sSet[iPos], -1.0, 99999.0); + g_esGeneral.g_flLuckyBulletReward[iPos] = flGetClampedValue(key, "LuckyBulletReward", "Lucky Bullet Reward", "Lucky_Bullet_Reward", "luckybullet", g_esGeneral.g_flLuckyBulletReward[iPos], sSet[iPos], -1.0, 100.0); + g_esGeneral.g_flMotivationRadiusReward[iPos] = flGetClampedValue(key, "MotivationRadiusReward", "Motivation Radius Reward", "Motivation_Radius_Reward", "motivation", g_esGeneral.g_flMotivationRadiusReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esGeneral.g_flOverdoseRadiusReward[iPos] = flGetClampedValue(key, "OverdoseRadiusReward", "Overdose Radius Reward", "Overdose_Radius_Reward", "overdose", g_esGeneral.g_flOverdoseRadiusReward[iPos], sSet[iPos], -1.0, 99999.0); g_esGeneral.g_flPipeBombDurationReward[iPos] = flGetClampedValue(key, "PipebombDurationReward", "Pipebomb Duration Reward", "Pipebomb_Duration_Reward", "pipeduration", g_esGeneral.g_flPipeBombDurationReward[iPos], sSet[iPos], -1.0, 99999.0); g_esGeneral.g_flPunchResistanceReward[iPos] = flGetClampedValue(key, "PunchResistanceReward", "Punch Resistance Reward", "Punch_Resistance_Reward", "punchres", g_esGeneral.g_flPunchResistanceReward[iPos], sSet[iPos], -1.0, 1.0); - g_esGeneral.g_flRapidPistolReward[iPos] = flGetClampedValue(key, "RapidPistolReward", "Rapid Pistol Reward", "Rapid_Pistol_Reward", "rapid", g_esGeneral.g_flRapidPistolReward[iPos], sSet[iPos], -1.0, 1.0); + g_esGeneral.g_flRapidPistolReward[iPos] = flGetClampedValue(key, "RapidPistolReward", "Rapid Pistol Reward", "Rapid_Pistol_Reward", "rapidpistol", g_esGeneral.g_flRapidPistolReward[iPos], sSet[iPos], -1.0, 1.0); g_esGeneral.g_flRefillPercentReward[iPos] = flGetClampedValue(key, "RefillPercentReward", "Refill Percent Reward", "Refill_Percent_Reward", "refillpercent", g_esGeneral.g_flRefillPercentReward[iPos], sSet[iPos], -1.0, 100.0); + g_esGeneral.g_flReloadRateReward[iPos] = flGetClampedValue(key, "ReloadRateReward", "Reload Rate Reward", "Reload_Rate_Reward", "reloadrate", g_esGeneral.g_flReloadRateReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esGeneral.g_flShockwaveRadiusReward[iPos] = flGetClampedValue(key, "ShockwaveRadiusReward", "Shockwave Radius Reward", "Shockwave_Radius_Reward", "shockwave", g_esGeneral.g_flShockwaveRadiusReward[iPos], sSet[iPos], -1.0, 99999.0); g_esGeneral.g_flShoveDamageReward[iPos] = flGetClampedValue(key, "ShoveDamageReward", "Shove Damage Reward", "Shove_Damage_Reward", "shovedmg", g_esGeneral.g_flShoveDamageReward[iPos], sSet[iPos], -1.0, 99999.0); g_esGeneral.g_flShoveRateReward[iPos] = flGetClampedValue(key, "ShoveRateReward", "Shove Rate Reward", "Shove_Rate_Reward", "shoverate", g_esGeneral.g_flShoveRateReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esGeneral.g_flSledgehammerRoundsReward[iPos] = flGetClampedValue(key, "SledgehammerRoundsReward", "Sledgehammer Rounds Reward", "Sledgehammer_Rounds_Reward", "sledgehammer", g_esGeneral.g_flSledgehammerRoundsReward[iPos], sSet[iPos], -1.0, 100.0); g_esGeneral.g_flSpeedBoostReward[iPos] = flGetClampedValue(key, "SpeedBoostReward", "Speed Boost Reward", "Speed_Boost_Reward", "speedboost", g_esGeneral.g_flSpeedBoostReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esGeneral.g_flSupplierReward[iPos] = flGetClampedValue(key, "SupplierPassive", "Supplier Passive", "Supplier_Passive", "supplier", g_esGeneral.g_flSupplierReward[iPos], sSet[iPos], -1.0, 99999.0); + g_esGeneral.g_flSwingRateReward[iPos] = flGetClampedValue(key, "SwingRateReward", "Swing Rate Reward", "Swing_Rate_Reward", "swingrate", g_esGeneral.g_flSwingRateReward[iPos], sSet[iPos], -1.0, 99999.0); g_esGeneral.g_iRewardEnabled[iPos] = iGetClampedValue(key, "RewardEnabled", "Reward Enabled", "Reward_Enabled", "renabled", g_esGeneral.g_iRewardEnabled[iPos], sSet[iPos], -2, 2147483647); - g_esGeneral.g_iRewardBots[iPos] = iGetClampedValue(key, "RewardBots", "Reward Bots", "Reward_Bots", "bots", g_esGeneral.g_iRewardBots[iPos], sSet[iPos], -2, 2147483647); + g_esGeneral.g_iRewardBots[iPos] = iGetClampedValue(key, "RewardBots", "Reward Bots", "Reward_Bots", "rbots", g_esGeneral.g_iRewardBots[iPos], sSet[iPos], -2, 2147483647); g_esGeneral.g_iRewardEffect[iPos] = iGetClampedValue(key, "RewardEffect", "Reward Effect", "Reward_Effect", "effect", g_esGeneral.g_iRewardEffect[iPos], sSet[iPos], -1, 15); g_esGeneral.g_iRewardNotify[iPos] = iGetClampedValue(key, "RewardNotify", "Reward Notify", "Reward_Notify", "rnotify", g_esGeneral.g_iRewardNotify[iPos], sSet[iPos], -1, 3); g_esGeneral.g_iRewardVisual[iPos] = iGetClampedValue(key, "RewardVisual", "Reward Visual", "Reward_Visual", "visual", g_esGeneral.g_iRewardVisual[iPos], sSet[iPos], -1, 127); g_esGeneral.g_iAmmoBoostReward[iPos] = iGetClampedValue(key, "AmmoBoostReward", "Ammo Boost Reward", "Ammo_Boost_Reward", "ammoboost", g_esGeneral.g_iAmmoBoostReward[iPos], sSet[iPos], -1, 1); + g_esGeneral.g_iAmmoRefillReward[iPos] = iGetClampedValue(key, "AmmoRefillReward", "Ammo Refill Reward", "Ammo_Refill_Reward", "ammorefill", g_esGeneral.g_iAmmoRefillReward[iPos], sSet[iPos], -1, 1); g_esGeneral.g_iAmmoRegenReward[iPos] = iGetClampedValue(key, "AmmoRegenReward", "Ammo Regen Reward", "Ammo_Regen_Reward", "ammoregen", g_esGeneral.g_iAmmoRegenReward[iPos], sSet[iPos], -1, 99999); - g_esGeneral.g_iBlazeHealthReward[iPos] = iGetClampedValue(key, "BlazeHealthReward", "Blaze Health Reward", "Blaze_Health_Reward", "blaze", g_esGeneral.g_iBlazeHealthReward[iPos], sSet[iPos], -1, 1); + g_esGeneral.g_iBlazeHealthReward[iPos] = iGetClampedValue(key, "BlazeHealthReward", "Blaze Health Reward", "Blaze_Health_Reward", "blaze", g_esGeneral.g_iBlazeHealthReward[iPos], sSet[iPos], -1, MT_MAXHEALTH); + g_esGeneral.g_iBloodDonorReward[iPos] = iGetClampedValue(key, "BlazeHealthReward", "Blaze Health Reward", "Blaze_Health_Reward", "blaze", g_esGeneral.g_iBloodDonorReward[iPos], sSet[iPos], -1, MT_MAXHEALTH); g_esGeneral.g_iBunnyHopReward[iPos] = iGetClampedValue(key, "BunnyHopReward", "Bunny Hop Reward", "Bunny_Hop_Reward", "bhop", g_esGeneral.g_iBunnyHopReward[iPos], sSet[iPos], -1, 1); g_esGeneral.g_iBurstDoorsReward[iPos] = iGetClampedValue(key, "BurstDoorsReward", "Burst Doors Reward", "Burst_Doors_Reward", "burstdoors", g_esGeneral.g_iBurstDoorsReward[iPos], sSet[iPos], -1, 1); g_esGeneral.g_iCleanKillsReward[iPos] = iGetClampedValue(key, "CleanKillsReward", "Clean Kills Reward", "Clean_Kills_Reward", "cleankills", g_esGeneral.g_iCleanKillsReward[iPos], sSet[iPos], -1, 1); g_esGeneral.g_iClusterBombsReward[iPos] = iGetClampedValue(key, "ClusterBombsReward", "Cluster Bombs Reward", "Cluster_Bombs_Reward", "cluster", g_esGeneral.g_iClusterBombsReward[iPos], sSet[iPos], -1, 5); + g_esGeneral.g_iEternalFlamesReward[iPos] = iGetClampedValue(key, "EternalFlamesReward", "Eternal Flames Reward", "Eternal_Flames_Reward", "eternal", g_esGeneral.g_iEternalFlamesReward[iPos], sSet[iPos], -1, 1); + g_esGeneral.g_iFastRecoveryReward[iPos] = iGetClampedValue(key, "FastRecoveryReward", "Fast Recovery Reward", "Fast_Recovery_Reward", "fastrecovery", g_esGeneral.g_iFastRecoveryReward[iPos], sSet[iPos], -1, 1); g_esGeneral.g_iFriendlyFireReward[iPos] = iGetClampedValue(key, "FriendlyFireReward", "Friendly Fire Reward", "Friendly_Fire_Reward", "friendlyfire", g_esGeneral.g_iFriendlyFireReward[iPos], sSet[iPos], -1, 1); g_esGeneral.g_iGhostBulletsReward[iPos] = iGetClampedValue(key, "GhostBulletsReward", "Ghost Bullets Reward", "Ghost_Bullets_Reward", "ghost", g_esGeneral.g_iGhostBulletsReward[iPos], sSet[iPos], -1, 1); g_esGeneral.g_iHealthRegenReward[iPos] = iGetClampedValue(key, "HealthRegenReward", "Health Regen Reward", "Health_Regen_Reward", "hpregen", g_esGeneral.g_iHealthRegenReward[iPos], sSet[iPos], -1, MT_MAXHEALTH); - g_esGeneral.g_iHollowpointAmmoReward[iPos] = iGetClampedValue(key, "HollowpointAmmoReward", "Hollowpoint Ammo Reward", "Hollowpoint_Ammo_Reward", "hollowpoint", g_esGeneral.g_iHollowpointAmmoReward[iPos], sSet[iPos], -1, 1); - g_esGeneral.g_iInextinguishableFireReward[iPos] = iGetClampedValue(key, "InextinguishableFireReward", "Inextinguishable Fire Reward", "Inextinguishable_Fire_Reward", "inexfire", g_esGeneral.g_iInextinguishableFireReward[iPos], sSet[iPos], -1, 1); g_esGeneral.g_iInfiniteAmmoReward[iPos] = iGetClampedValue(key, "InfiniteAmmoReward", "Infinite Ammo Reward", "Infinite_Ammo_Reward", "infammo", g_esGeneral.g_iInfiniteAmmoReward[iPos], sSet[iPos], -1, 31); - g_esGeneral.g_iLadderActionsReward[iPos] = iGetClampedValue(key, "LadderActionsReward", "Ladder Actions Reward", "Ladder_Action_Reward", "ladderactions", g_esGeneral.g_iLadderActionsReward[iPos], sSet[iPos], -1, 1); - g_esGeneral.g_iLadyKillerReward[iPos] = iGetClampedValue(key, "LadyKillerReward", "Lady Killer Reward", "Lady_Killer_Reward", "ladykiller", g_esGeneral.g_iLadyKillerReward[iPos], sSet[iPos], -1, 99999); + g_esGeneral.g_iLadderActionsReward[iPos] = iGetClampedValue(key, "LadderActionsReward", "Ladder Actions Reward", "Ladder_Action_Reward", "ladderacts", g_esGeneral.g_iLadderActionsReward[iPos], sSet[iPos], -1, 1); g_esGeneral.g_iLaserSightReward[iPos] = iGetClampedValue(key, "LaserSightReward", "Laser Sight Reward", "Laser_Sight_Reward", "lasersight", g_esGeneral.g_iLaserSightReward[iPos], sSet[iPos], -1, 1); g_esGeneral.g_iLifeLeechReward[iPos] = iGetClampedValue(key, "LifeLeechReward", "Life Leech Reward", "Life_Leech_Reward", "lifeleech", g_esGeneral.g_iLifeLeechReward[iPos], sSet[iPos], -1, MT_MAXHEALTH); - g_esGeneral.g_iMedicalCutsReward[iPos] = iGetClampedValue(key, "MedicalCutsReward", "Medical Cuts Reward", "Medical_Cuts_Reward", "medcuts", g_esGeneral.g_iMedicalCutsReward[iPos], sSet[iPos], -1, 1); + g_esGeneral.g_iMedicalCutsReward[iPos] = iGetClampedValue(key, "MedicalCutsReward", "Medical Cuts Reward", "Medical_Cuts_Reward", "medcuts", g_esGeneral.g_iMedicalCutsReward[iPos], sSet[iPos], -1, MT_MAXHEALTH); g_esGeneral.g_iMeleeRangeReward[iPos] = iGetClampedValue(key, "MeleeRangeReward", "Melee Range Reward", "Melee_Range_Reward", "meleerange", g_esGeneral.g_iMeleeRangeReward[iPos], sSet[iPos], -1, 99999); - g_esGeneral.g_iMidairDashesReward[iPos] = iGetClampedValue(key, "MidairDashesReward", "Midair Dashes Reward", "Midair_Dashes_Reward", "midairdashes", g_esGeneral.g_iMidairDashesReward[iPos], sSet[iPos], -1, 99999); + g_esGeneral.g_iMidairDashesReward[iPos] = iGetClampedValue(key, "MidairDashesReward", "Midair Dashes Reward", "Midair_Dashes_Reward", "middash", g_esGeneral.g_iMidairDashesReward[iPos], sSet[iPos], -1, 99999); + g_esGeneral.g_iOverhealthReward[iPos] = iGetClampedValue(key, "OverhealthReward", "Overhealth Reward", "Overhealth_Reward", "overhealth", g_esGeneral.g_iOverhealthReward[iPos], sSet[iPos], -1, MT_MAXHEALTH); g_esGeneral.g_iParticleEffectVisual[iPos] = iGetClampedValue(key, "ParticleEffectVisual", "Particle Effect Visual", "Particle_Effect_Visual", "particle", g_esGeneral.g_iParticleEffectVisual[iPos], sSet[iPos], -1, 15); g_esGeneral.g_iPrefsNotify[iPos] = iGetClampedValue(key, "PrefsNotify", "Prefs Notify", "Prefs_Notify", "pnotify", g_esGeneral.g_iPrefsNotify[iPos], sSet[iPos], -1, 1); g_esGeneral.g_iRecoilDampenerReward[iPos] = iGetClampedValue(key, "RecoilDampenerReward", "Recoil Dampener Reward", "Recoil_Dampener_Reward", "recoil", g_esGeneral.g_iRecoilDampenerReward[iPos], sSet[iPos], -1, 1); - g_esGeneral.g_iRegenBurstsReward[iPos] = iGetClampedValue(key, "RegenBurstsReward", "Regen Bursts Reward", "Regen_Bursts_Reward", "regburst", g_esGeneral.g_iRegenBurstsReward[iPos], sSet[iPos], -1, 1); + g_esGeneral.g_iRegenBurstsReward[iPos] = iGetClampedValue(key, "RegenBurstsReward", "Regen Bursts Reward", "Regen_Bursts_Reward", "regbursts", g_esGeneral.g_iRegenBurstsReward[iPos], sSet[iPos], -1, MT_MAXHEALTH); g_esGeneral.g_iRespawnLoadoutReward[iPos] = iGetClampedValue(key, "RespawnLoadoutReward", "Respawn Loadout Reward", "Respawn_Loadout_Reward", "resloadout", g_esGeneral.g_iRespawnLoadoutReward[iPos], sSet[iPos], -1, 1); g_esGeneral.g_iReviveHealthReward[iPos] = iGetClampedValue(key, "ReviveHealthReward", "Revive Health Reward", "Revive_Health_Reward", "revivehp", g_esGeneral.g_iReviveHealthReward[iPos], sSet[iPos], -1, MT_MAXHEALTH); + g_esGeneral.g_iRiotGearReward[iPos] = iGetClampedValue(key, "RiotGearReward", "Riot Gear Reward", "Riot_Gear_Reward", "riotgear", g_esGeneral.g_iRiotGearReward[iPos], sSet[iPos], -1, 1); + g_esGeneral.g_iSafetyBubbleReward[iPos] = iGetClampedValue(key, "SafetyBubbleReward", "Safety Bubble Reward", "Safety_Bubble_Reward", "safetybubble", g_esGeneral.g_iSafetyBubbleReward[iPos], sSet[iPos], -1, 1); g_esGeneral.g_iShareRewards[iPos] = iGetClampedValue(key, "ShareRewards", "Share Rewards", "Share_Rewards", "share", g_esGeneral.g_iShareRewards[iPos], sSet[iPos], -1, 3); g_esGeneral.g_iShovePenaltyReward[iPos] = iGetClampedValue(key, "ShovePenaltyReward", "Shove Penalty Reward", "Shove_Penalty_Reward", "shovepenalty", g_esGeneral.g_iShovePenaltyReward[iPos], sSet[iPos], -1, 1); - g_esGeneral.g_iSledgehammerRoundsReward[iPos] = iGetClampedValue(key, "SledgehammerRoundsReward", "Sledgehammer Rounds Reward", "Sledgehammer_Rounds_Reward", "sledgehammer", g_esGeneral.g_iSledgehammerRoundsReward[iPos], sSet[iPos], -1, 1); - g_esGeneral.g_iSpecialAmmoReward[iPos] = iGetClampedValue(key, "SpecialAmmoReward", "Special Ammo Reward", "Special_Ammo_Reward", "specialammo", g_esGeneral.g_iSpecialAmmoReward[iPos], sSet[iPos], -1, 3); - g_esGeneral.g_iStackRewards[iPos] = iGetClampedValue(key, "StackRewards", "Stack Rewards", "Stack_Rewards", "stack", g_esGeneral.g_iStackRewards[iPos], sSet[iPos], -1, 2147483647); + g_esGeneral.g_iSpecialAmmoReward[iPos] = iGetClampedValue(key, "SpecialAmmoReward", "Special Ammo Reward", "Special_Ammo_Reward", "specammo", g_esGeneral.g_iSpecialAmmoReward[iPos], sSet[iPos], -1, 3); + g_esGeneral.g_iStackRewards[iPos] = iGetClampedValue(key, "StackRewards", "Stack Rewards", "Stack_Rewards", "rstack", g_esGeneral.g_iStackRewards[iPos], sSet[iPos], -1, 2147483647); g_esGeneral.g_iStickyGrenadesReward[iPos] = iGetClampedValue(key, "StickyGrenadesReward", "Sticky Grenades Reward", "Sticky_Grenades_Reward", "sticky", g_esGeneral.g_iStickyGrenadesReward[iPos], sSet[iPos], -1, 1); - g_esGeneral.g_iSyringeDartsReward[iPos] = iGetClampedValue(key, "SyringeDartsReward", "Syringe Darts Reward", "Syringe_Darts_Reward", "syringe", g_esGeneral.g_iSyringeDartsReward[iPos], sSet[iPos], -1, 1); + g_esGeneral.g_iSyringeDartsReward[iPos] = iGetClampedValue(key, "SyringeDartsReward", "Syringe Darts Reward", "Syringe_Darts_Reward", "syringe", g_esGeneral.g_iSyringeDartsReward[iPos], sSet[iPos], -1, MT_MAXHEALTH); g_esGeneral.g_iThornsReward[iPos] = iGetClampedValue(key, "ThornsReward", "Thorns Reward", "Thorns_Reward", "thorns", g_esGeneral.g_iThornsReward[iPos], sSet[iPos], -1, 1); g_esGeneral.g_iUsefulRewards[iPos] = iGetClampedValue(key, "UsefulRewards", "Useful Rewards", "Useful_Rewards", "useful", g_esGeneral.g_iUsefulRewards[iPos], sSet[iPos], -1, 15); g_esGeneral.g_iVoicePitchVisual[iPos] = iGetClampedValue(key, "VoicePitchVisual", "Voice Pitch Visual", "Voice_Pitch_Visual", "voicepitch", g_esGeneral.g_iVoicePitchVisual[iPos], sSet[iPos], -1, 255); @@ -18013,6 +23718,28 @@ void vSetTankSettings(int mode, const char[] section, const char[] subsection, c } } } + else if (StrEqual(subsection, MT_CONFIG_SECTION_SIZE, false)) + { + char sValue[10], sRange[2][5]; + strcopy(sValue, sizeof sValue, value); + ReplaceString(sValue, sizeof sValue, " ", ""); + ExplodeString(sValue, "-", sRange, sizeof sRange, sizeof sRange[]); + if (StrEqual(key, "InfectedScale", false) || StrEqual(key, "Infected Scale", false) || StrEqual(key, "Infected_Scale", false) || StrEqual(key, "infected", false)) + { + g_esGeneral.g_flInfectedScaleMin = (sRange[0][0] != '\0') ? flClamp(StringToFloat(sRange[0]), -1.0, 10.0) : g_esGeneral.g_flInfectedScaleMin; + g_esGeneral.g_flInfectedScaleMax = (sRange[1][0] != '\0') ? flClamp(StringToFloat(sRange[1]), -1.0, 10.0) : g_esGeneral.g_flInfectedScaleMax; + } + else if (StrEqual(key, "JockeyScale", false) || StrEqual(key, "Jockey Scale", false) || StrEqual(key, "Jockey_Scale", false) || StrEqual(key, "jockey", false)) + { + g_esGeneral.g_flJockeyScaleMin = (sRange[0][0] != '\0') ? flClamp(StringToFloat(sRange[0]), -1.0, 10.0) : g_esGeneral.g_flJockeyScaleMin; + g_esGeneral.g_flJockeyScaleMax = (sRange[1][0] != '\0') ? flClamp(StringToFloat(sRange[1]), -1.0, 10.0) : g_esGeneral.g_flJockeyScaleMax; + } + else if (StrEqual(key, "WitchScale", false) || StrEqual(key, "Witch Scale", false) || StrEqual(key, "Witch_Scale", false) || StrEqual(key, "witch", false)) + { + g_esGeneral.g_flWitchScaleMin = (sRange[0][0] != '\0') ? flClamp(StringToFloat(sRange[0]), -1.0, 10.0) : g_esGeneral.g_flWitchScaleMin; + g_esGeneral.g_flWitchScaleMax = (sRange[1][0] != '\0') ? flClamp(StringToFloat(sRange[1]), -1.0, 10.0) : g_esGeneral.g_flWitchScaleMax; + } + } else if (StrEqual(subsection, MT_CONFIG_SECTION_WAVES, false)) { if (StrEqual(key, "RegularType", false) || StrEqual(key, "Regular Type", false) || StrEqual(key, "Regular_Type", false) || StrEqual(key, "regtype", false)) @@ -18074,435 +23801,78 @@ void vSetTankSettings(int mode, const char[] section, const char[] subsection, c g_esGeneral.g_cvMTTempSetting.Flags = iFlags; g_esGeneral.g_cvMTTempSetting = null; - vLogMessage(MT_LOG_SERVER, _, "%s Changed cvar \"%s\" to \"%s\".", MT_TAG, sKey, sValue); - } - else - { - vLogMessage(MT_LOG_SERVER, _, "%s Unable to change cvar: %s", MT_TAG, sKey); - } - } - else - { - vLogMessage(MT_LOG_SERVER, _, "%s Unable to find cvar: %s", MT_TAG, sKey); - } - } - - if (mode == -1 || mode == 1) - { - g_esGeneral.g_iGameModeTypes = iGetKeyValue(subsection, MT_CONFIG_SECTION_GAMEMODES, MT_CONFIG_SECTION_GAMEMODES2, MT_CONFIG_SECTION_GAMEMODES3, MT_CONFIG_SECTION_GAMEMODES4, key, "GameModeTypes", "Game Mode Types", "Game_Mode_Types", "types", g_esGeneral.g_iGameModeTypes, value, -1, 15); - g_esGeneral.g_iConfigEnable = iGetKeyValue(subsection, MT_CONFIG_SECTION_CUSTOM, MT_CONFIG_SECTION_CUSTOM, MT_CONFIG_SECTION_CUSTOM, MT_CONFIG_SECTION_CUSTOM, key, "EnableCustomConfigs", "Enable Custom Configs", "Enable_Custom_Configs", "cenabled", g_esGeneral.g_iConfigEnable, value, -1, 1); - g_esGeneral.g_iConfigCreate = iGetKeyValue(subsection, MT_CONFIG_SECTION_CUSTOM, MT_CONFIG_SECTION_CUSTOM, MT_CONFIG_SECTION_CUSTOM, MT_CONFIG_SECTION_CUSTOM, key, "CreateConfigTypes", "Create Config Types", "Create_Config_Types", "create", g_esGeneral.g_iConfigCreate, value, -1, 255); - g_esGeneral.g_flConfigDelay = flGetKeyValue(subsection, MT_CONFIG_SECTION_CUSTOM, MT_CONFIG_SECTION_CUSTOM, MT_CONFIG_SECTION_CUSTOM, MT_CONFIG_SECTION_CUSTOM, key, "ExecuteConfigDelay", "Execute Config Delay", "Execute_Config_Delay", "delay", g_esGeneral.g_flConfigDelay, value, -1.0, 99999.0); - g_esGeneral.g_iConfigExecute = iGetKeyValue(subsection, MT_CONFIG_SECTION_CUSTOM, MT_CONFIG_SECTION_CUSTOM, MT_CONFIG_SECTION_CUSTOM, MT_CONFIG_SECTION_CUSTOM, key, "ExecuteConfigTypes", "Execute Config Types", "Execute_Config_Types", "execute", g_esGeneral.g_iConfigExecute, value, -1, 255); - - vGetKeyValue(subsection, MT_CONFIG_SECTION_GAMEMODES, MT_CONFIG_SECTION_GAMEMODES2, MT_CONFIG_SECTION_GAMEMODES3, MT_CONFIG_SECTION_GAMEMODES4, key, "EnabledGameModes", "Enabled Game Modes", "Enabled_Game_Modes", "gmenabled", g_esGeneral.g_sEnabledGameModes, sizeof esGeneral::g_sEnabledGameModes, value); - vGetKeyValue(subsection, MT_CONFIG_SECTION_GAMEMODES, MT_CONFIG_SECTION_GAMEMODES2, MT_CONFIG_SECTION_GAMEMODES3, MT_CONFIG_SECTION_GAMEMODES4, key, "DisabledGameModes", "Disabled Game Modes", "Disabled_Game_Modes", "gmdisabled", g_esGeneral.g_sDisabledGameModes, sizeof esGeneral::g_sDisabledGameModes, value); - } - - vConfigsLoadedForward(subsection, key, value, -1, -1, mode, false); - } - else if (!strncmp(section, "Tank", 4, false) || section[0] == '#' || IsCharNumeric(section[0]) || StrEqual(section, "all", false) || FindCharInString(section, ',') != -1 || FindCharInString(section, '-') != -1) - { - int iStartPos = 0, iIndex = 0, iRealType = 0; - if (!strncmp(section, "Tank", 4, false) || section[0] == '#') - { - iStartPos = iGetConfigSectionNumber(section, strlen(section)), iIndex = StringToInt(section[iStartPos]); - vReadTankSettings(iIndex, mode, subsection, key, value); - } - else if (IsCharNumeric(section[0]) || StrEqual(section, "all", false) || FindCharInString(section, ',') != -1 || FindCharInString(section, '-') != -1) - { - if (IsCharNumeric(section[0]) && FindCharInString(section, ',') == -1 && FindCharInString(section, '-') == -1) - { - iIndex = StringToInt(section); - vReadTankSettings(iIndex, mode, subsection, key, value); - } - else if (StrEqual(section, "all", false) || FindCharInString(section, ',') != -1 || FindCharInString(section, '-') != -1) - { - for (iIndex = g_esGeneral.g_iMinType; iIndex <= g_esGeneral.g_iMaxType; iIndex++) - { - if (iIndex <= 0) - { - continue; - } - - iRealType = iFindSectionType(section, iIndex); - if (iIndex == iRealType || StrEqual(section, "all", false)) - { - vReadTankSettings(iIndex, mode, subsection, key, value); - } - } - } - } - } - } - - if ((mode == -1 || mode == 3) && (!strncmp(section, "STEAM_", 6, false) || !strncmp("0:", section, 2) || !strncmp("1:", section, 2) || (!strncmp(section, "[U:", 3) && section[strlen(section) - 1] == ']'))) - { - for (int iPlayer = 1; iPlayer <= MaxClients; iPlayer++) - { - if (bIsValidClient(iPlayer, MT_CHECK_INGAME|MT_CHECK_FAKECLIENT)) - { - if (StrEqual(g_esPlayer[iPlayer].g_sSteamID32, section, false) || StrEqual(g_esPlayer[iPlayer].g_sSteam3ID, section, false)) - { - g_esPlayer[iPlayer].g_iTankModel = iGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "TankModel", "Tank Model", "Tank_Model", "model", g_esPlayer[iPlayer].g_iTankModel, value, -1, 7); - g_esPlayer[iPlayer].g_flBurnDuration = flGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "BurnDuration", "Burn Duration", "Burn_Duration", "burndur", g_esPlayer[iPlayer].g_flBurnDuration, value, -1.0, 99999.0); - g_esPlayer[iPlayer].g_flBurntSkin = flGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "BurntSkin", "Burnt Skin", "Burnt_Skin", "burnt", g_esPlayer[iPlayer].g_flBurntSkin, value, -2.0, 1.0); - g_esPlayer[iPlayer].g_iTankNote = iGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "TankNote", "Tank Note", "Tank_Note", "note", g_esPlayer[iPlayer].g_iTankNote, value, -1, 1); - g_esPlayer[iPlayer].g_iCheckAbilities = iGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "CheckAbilities", "Check Abilities", "Check_Abilities", "check", g_esPlayer[iPlayer].g_iCheckAbilities, value, -1, 1); - g_esPlayer[iPlayer].g_iDeathRevert = iGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "DeathRevert", "Death Revert", "Death_Revert", "revert", g_esPlayer[iPlayer].g_iDeathRevert, value, -1, 1); - g_esPlayer[iPlayer].g_iAnnounceArrival = iGetKeyValue(subsection, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE2, key, "AnnounceArrival", "Announce Arrival", "Announce_Arrival", "arrival", g_esPlayer[iPlayer].g_iAnnounceArrival, value, -1, 31); - g_esPlayer[iPlayer].g_iAnnounceDeath = iGetKeyValue(subsection, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE2, key, "AnnounceDeath", "Announce Death", "Announce_Death", "death", g_esPlayer[iPlayer].g_iAnnounceDeath, value, -1, 2); - g_esPlayer[iPlayer].g_iAnnounceKill = iGetKeyValue(subsection, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE2, key, "AnnounceKill", "Announce Kill", "Announce_Kill", "kill", g_esPlayer[iPlayer].g_iAnnounceKill, value, -1, 1); - g_esPlayer[iPlayer].g_iArrivalMessage = iGetKeyValue(subsection, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE2, key, "ArrivalMessage", "Arrival Message", "Arrival_Message", "arrivalmsg", g_esPlayer[iPlayer].g_iArrivalMessage, value, -1, 1023); - g_esPlayer[iPlayer].g_iArrivalSound = iGetKeyValue(subsection, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE2, key, "ArrivalSound", "Arrival Sound", "Arrival_Sound", "arrivalsnd", g_esPlayer[iPlayer].g_iArrivalSound, value, -1, 1); - g_esPlayer[iPlayer].g_iDeathDetails = iGetKeyValue(subsection, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE2, key, "DeathDetails", "Death Details", "Death_Details", "deathdets", g_esPlayer[iPlayer].g_iDeathDetails, value, -1, 5); - g_esPlayer[iPlayer].g_iDeathMessage = iGetKeyValue(subsection, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE2, key, "DeathMessage", "Death Message", "Death_Message", "deathmsg", g_esPlayer[iPlayer].g_iDeathMessage, value, -1, 1023); - g_esPlayer[iPlayer].g_iDeathSound = iGetKeyValue(subsection, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE2, key, "DeathSound", "Death Sound", "Death_Sound", "deathsnd", g_esPlayer[iPlayer].g_iDeathSound, value, -1, 1); - g_esPlayer[iPlayer].g_iKillMessage = iGetKeyValue(subsection, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE2, key, "KillMessage", "Kill Message", "Kill_Message", "killmsg", g_esPlayer[iPlayer].g_iKillMessage, value, -1, 1023); - g_esPlayer[iPlayer].g_iVocalizeArrival = iGetKeyValue(subsection, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE2, key, "VocalizeArrival", "Vocalize Arrival", "Vocalize_Arrival", "arrivalvoc", g_esPlayer[iPlayer].g_iVocalizeArrival, value, -1, 1); - g_esPlayer[iPlayer].g_iVocalizeDeath = iGetKeyValue(subsection, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE, MT_CONFIG_SECTION_ANNOUNCE2, key, "VocalizeDeath", "Vocalize Death", "Vocalize_Death", "deathvoc", g_esPlayer[iPlayer].g_iVocalizeDeath, value, -1, 1); - g_esPlayer[iPlayer].g_iTeammateLimit = iGetKeyValue(subsection, MT_CONFIG_SECTION_REWARDS, MT_CONFIG_SECTION_REWARDS, MT_CONFIG_SECTION_REWARDS, MT_CONFIG_SECTION_REWARDS, key, "TeammateLimit", "Teammate Limit", "Teammate_Limit", "teamlimit", g_esPlayer[iPlayer].g_iTeammateLimit, value, -1, 32); - g_esPlayer[iPlayer].g_iGlowEnabled = iGetKeyValue(subsection, MT_CONFIG_SECTION_GLOW, MT_CONFIG_SECTION_GLOW, MT_CONFIG_SECTION_GLOW, MT_CONFIG_SECTION_GLOW, key, "GlowEnabled", "Glow Enabled", "Glow_Enabled", "genabled", g_esPlayer[iPlayer].g_iGlowEnabled, value, -1, 1); - g_esPlayer[iPlayer].g_iGlowFlashing = iGetKeyValue(subsection, MT_CONFIG_SECTION_GLOW, MT_CONFIG_SECTION_GLOW, MT_CONFIG_SECTION_GLOW, MT_CONFIG_SECTION_GLOW, key, "GlowFlashing", "Glow Flashing", "Glow_Flashing", "flashing", g_esPlayer[iPlayer].g_iGlowFlashing, value, -1, 1); - g_esPlayer[iPlayer].g_iGlowType = iGetKeyValue(subsection, MT_CONFIG_SECTION_GLOW, MT_CONFIG_SECTION_GLOW, MT_CONFIG_SECTION_GLOW, MT_CONFIG_SECTION_GLOW, key, "GlowType", "Glow Type", "Glow_Type", "type", g_esPlayer[iPlayer].g_iGlowType, value, -1, 1); - g_esPlayer[iPlayer].g_iBaseHealth = iGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "BaseHealth", "Base Health", "Base_Health", "basehp", g_esPlayer[iPlayer].g_iBaseHealth, value, -1, MT_MAXHEALTH); - g_esPlayer[iPlayer].g_iDisplayHealth = iGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "DisplayHealth", "Display Health", "Display_Health", "displayhp", g_esPlayer[iPlayer].g_iDisplayHealth, value, -1, 11); - g_esPlayer[iPlayer].g_iDisplayHealthType = iGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "DisplayHealthType", "Display Health Type", "Display_Health_Type", "displaytype", g_esPlayer[iPlayer].g_iDisplayHealthType, value, -1, 2); - g_esPlayer[iPlayer].g_iExtraHealth = iGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "ExtraHealth", "Extra Health", "Extra_Health", "extrahp", g_esPlayer[iPlayer].g_iExtraHealth, value, MT_MAX_HEALTH_REDUCTION, MT_MAXHEALTH); - g_esPlayer[iPlayer].g_flHealPercentMultiplier = flGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "HealthPercentageMultiplier", "Health Percentage Multiplier", "Health_Percentage_Multiplier", "hpmulti", g_esPlayer[iPlayer].g_flHealPercentMultiplier, value, -1.0, 99999.0); - g_esPlayer[iPlayer].g_iHumanMultiplierMode = iGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "HumanMultiplierMode", "Human Multiplier Mode", "Human_Multiplier_Mode", "humanmultimode", g_esPlayer[iPlayer].g_iHumanMultiplierMode, value, -1, 1); - g_esPlayer[iPlayer].g_iMinimumHumans = iGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "MinimumHumans", "Minimum Humans", "Minimum_Humans", "minhumans", g_esPlayer[iPlayer].g_iMinimumHumans, value, -1, 32); - g_esPlayer[iPlayer].g_iMultiplyHealth = iGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "MultiplyHealth", "Multiply Health", "Multiply_Health", "multihp", g_esPlayer[iPlayer].g_iMultiplyHealth, value, -1, 3); - g_esPlayer[iPlayer].g_iSpawnProtection = iGetKeyValue(subsection, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION2, key, "SpawnProtection", "Spawn Protection", "Spawn_Protection", "protect", g_esPlayer[iPlayer].g_iSpawnProtection, value, -1, 4); - g_esPlayer[iPlayer].g_flArmorDuration = flGetKeyValue(subsection, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION2, key, "ArmorDuration", "Armor Duration", "Armor_Duration", "armorduration", g_esPlayer[iPlayer].g_flArmorDuration, value, -1.0, 99999.0); - g_esPlayer[iPlayer].g_flArmorResistance = flGetKeyValue(subsection, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION2, key, "ArmorResistance", "Armor Resistance", "Armor_Resistance", "armorres", g_esPlayer[iPlayer].g_flArmorResistance, value, -1.0, 1.0); - g_esPlayer[iPlayer].g_flShieldDuration = flGetKeyValue(subsection, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION2, key, "ShieldDuration", "Shield Duration", "Shield_Duration", "shieldduration", g_esPlayer[iPlayer].g_flShieldDuration, value, -1.0, 99999.0); - g_esPlayer[iPlayer].g_flShieldResistance = flGetKeyValue(subsection, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION, MT_CONFIG_SECTION_PROTECTION2, key, "ShieldResistance", "Shield Resistance", "Shield_Resistance", "shieldres", g_esPlayer[iPlayer].g_flShieldResistance, value, -1.0, 1.0); - g_esPlayer[iPlayer].g_iBossEffects = iGetKeyValue(subsection, MT_CONFIG_SECTION_BOSS, MT_CONFIG_SECTION_BOSS, MT_CONFIG_SECTION_BOSS, MT_CONFIG_SECTION_BOSS, key, "BossEffects", "Boss Effects", "Boss_Effects", "bosseffects", g_esPlayer[iPlayer].g_iBossEffects, value, -1, 15); - g_esPlayer[iPlayer].g_iBossStages = iGetKeyValue(subsection, MT_CONFIG_SECTION_BOSS, MT_CONFIG_SECTION_BOSS, MT_CONFIG_SECTION_BOSS, MT_CONFIG_SECTION_BOSS, key, "BossStages", "Boss Stages", "Boss_Stages", "bossstages", g_esPlayer[iPlayer].g_iBossStages, value, -1, 4); - g_esPlayer[iPlayer].g_iRandomTank = iGetKeyValue(subsection, MT_CONFIG_SECTION_RANDOM, MT_CONFIG_SECTION_RANDOM, MT_CONFIG_SECTION_RANDOM, MT_CONFIG_SECTION_RANDOM, key, "RandomTank", "Random Tank", "Random_Tank", "random", g_esPlayer[iPlayer].g_iRandomTank, value, -1, 1); - g_esPlayer[iPlayer].g_flRandomDuration = flGetKeyValue(subsection, MT_CONFIG_SECTION_RANDOM, MT_CONFIG_SECTION_RANDOM, MT_CONFIG_SECTION_RANDOM, MT_CONFIG_SECTION_RANDOM, key, "RandomDuration", "Random Duration", "Random_Duration", "randduration", g_esPlayer[iPlayer].g_flRandomDuration, value, -1.0, 99999.0); - g_esPlayer[iPlayer].g_flRandomInterval = flGetKeyValue(subsection, MT_CONFIG_SECTION_RANDOM, MT_CONFIG_SECTION_RANDOM, MT_CONFIG_SECTION_RANDOM, MT_CONFIG_SECTION_RANDOM, key, "RandomInterval", "Random Interval", "Random_Interval", "randinterval", g_esPlayer[iPlayer].g_flRandomInterval, value, -1.0, 99999.0); - g_esPlayer[iPlayer].g_flTransformDelay = flGetKeyValue(subsection, MT_CONFIG_SECTION_TRANSFORM, MT_CONFIG_SECTION_TRANSFORM, MT_CONFIG_SECTION_TRANSFORM, MT_CONFIG_SECTION_TRANSFORM, key, "TransformDelay", "Transform Delay", "Transform_Delay", "transdelay", g_esPlayer[iPlayer].g_flTransformDelay, value, -1.0, 99999.0); - g_esPlayer[iPlayer].g_flTransformDuration = flGetKeyValue(subsection, MT_CONFIG_SECTION_TRANSFORM, MT_CONFIG_SECTION_TRANSFORM, MT_CONFIG_SECTION_TRANSFORM, MT_CONFIG_SECTION_TRANSFORM, key, "TransformDuration", "Transform Duration", "Transform_Duration", "transduration", g_esPlayer[iPlayer].g_flTransformDuration, value, -1.0, 99999.0); - g_esPlayer[iPlayer].g_iSpawnType = iGetKeyValue(subsection, MT_CONFIG_SECTION_SPAWN, MT_CONFIG_SECTION_SPAWN, MT_CONFIG_SECTION_SPAWN, MT_CONFIG_SECTION_SPAWN, key, "SpawnType", "Spawn Type", "Spawn_Type", "spawntype", g_esPlayer[iPlayer].g_iSpawnType, value, -1, 3); - g_esPlayer[iPlayer].g_iRockModel = iGetKeyValue(subsection, MT_CONFIG_SECTION_PROPS, MT_CONFIG_SECTION_PROPS, MT_CONFIG_SECTION_PROPS, MT_CONFIG_SECTION_PROPS, key, "RockModel", "Rock Model", "Rock_Model", "rockmodel", g_esPlayer[iPlayer].g_iRockModel, value, -1, 2); - g_esPlayer[iPlayer].g_iPropsAttached = iGetKeyValue(subsection, MT_CONFIG_SECTION_PROPS, MT_CONFIG_SECTION_PROPS, MT_CONFIG_SECTION_PROPS, MT_CONFIG_SECTION_PROPS, key, "PropsAttached", "Props Attached", "Props_Attached", "attached", g_esPlayer[iPlayer].g_iPropsAttached, value, -1, 511); - g_esPlayer[iPlayer].g_iBodyEffects = iGetKeyValue(subsection, MT_CONFIG_SECTION_PARTICLES, MT_CONFIG_SECTION_PARTICLES, MT_CONFIG_SECTION_PARTICLES, MT_CONFIG_SECTION_PARTICLES, key, "BodyEffects", "Body Effects", "Body_Effects", "body", g_esPlayer[iPlayer].g_iBodyEffects, value, -1, 127); - g_esPlayer[iPlayer].g_iRockEffects = iGetKeyValue(subsection, MT_CONFIG_SECTION_PARTICLES, MT_CONFIG_SECTION_PARTICLES, MT_CONFIG_SECTION_PARTICLES, MT_CONFIG_SECTION_PARTICLES, key, "RockEffects", "Rock Effects", "Rock_Effects", "rock", g_esPlayer[iPlayer].g_iRockEffects, value, -1, 15); - g_esPlayer[iPlayer].g_flAttackInterval = flGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "AttackInterval", "Attack Interval", "Attack_Interval", "attack", g_esPlayer[iPlayer].g_flAttackInterval, value, -1.0, 99999.0); - g_esPlayer[iPlayer].g_flClawDamage = flGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "ClawDamage", "Claw Damage", "Claw_Damage", "claw", g_esPlayer[iPlayer].g_flClawDamage, value, -2.0, 99999.0); - g_esPlayer[iPlayer].g_iFootstepShake = iGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "FootstepShake", "Footstep Shake", "Footstep_Shake", "shake", g_esPlayer[iPlayer].g_iFootstepShake, value, -1, 1); - g_esPlayer[iPlayer].g_iGroundPound = iGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "GroundPound", "Ground Pound", "Ground_Pound", "pound", g_esPlayer[iPlayer].g_iGroundPound, value, -1, 1); - g_esPlayer[iPlayer].g_flHittableDamage = flGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "HittableDamage", "Hittable Damage", "Hittable_Damage", "hittable", g_esPlayer[iPlayer].g_flHittableDamage, value, -2.0, 99999.0); - g_esPlayer[iPlayer].g_flIncapDamageMultiplier = flGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "IncapDamageMultiplier", "Incap Damage Multiplier", "Incap_Damage_Multiplier", "incapdmgmulti", g_esPlayer[iPlayer].g_flIncapDamageMultiplier, value, -1.0, 99999.0); - g_esPlayer[iPlayer].g_iIntangibleBody = iGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "IntangibleBody", "Intangible Body", "Intangible_Body", "intangible", g_esPlayer[iPlayer].g_iIntangibleBody, value, -1, 1); - g_esPlayer[iPlayer].g_iMeleeHitMode = iGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "MeleeHitMode", "Melee Hit Mode", "Melee_Hit_Mode", "meleehit", g_esPlayer[iPlayer].g_iMeleeHitMode, value, -1, 2); - g_esPlayer[iPlayer].g_flMeleeHitValue = flGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "MeleeHitValue", "Melee Hit Value", "Melee_Hit_Value", "meleevalue", g_esPlayer[iPlayer].g_flMeleeHitValue, value, -1.0, 99999.0); - g_esPlayer[iPlayer].g_flPunchForce = flGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "PunchForce", "Punch Force", "Punch_Force", "punchforce", g_esPlayer[iPlayer].g_flPunchForce, value, -2.0, 99999.0); - g_esPlayer[iPlayer].g_flPunchThrow = flGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "PunchThrow", "Punch Throw", "Punch_Throw", "punchthrow", g_esPlayer[iPlayer].g_flPunchThrow, value, -1.0, 100.0); - g_esPlayer[iPlayer].g_flRockDamage = flGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "RockDamage", "Rock Damage", "Rock_Damage", "rockdmg", g_esPlayer[iPlayer].g_flRockDamage, value, -2.0, 99999.0); - g_esPlayer[iPlayer].g_iRockSound = iGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "RockSound", "Rock Sound", "Rock_Sound", "rocksnd", g_esPlayer[iPlayer].g_iRockSound, value, -1, 1); - g_esPlayer[iPlayer].g_flRunSpeed = flGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "RunSpeed", "Run Speed", "Run_Speed", "speed", g_esPlayer[iPlayer].g_flRunSpeed, value, -1.0, 99.0); - g_esPlayer[iPlayer].g_iSkipIncap = iGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "SkipIncap", "Skip Incap", "Skip_Incap", "incap", g_esPlayer[iPlayer].g_iSkipIncap, value, -1, 1); - g_esPlayer[iPlayer].g_iSkipTaunt = iGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "SkipTaunt", "Skip Taunt", "Skip_Taunt", "taunt", g_esPlayer[iPlayer].g_iSkipTaunt, value, -1, 1); - g_esPlayer[iPlayer].g_iSweepFist = iGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "SweepFist", "Sweep Fist", "Sweep_Fist", "sweep", g_esPlayer[iPlayer].g_iSweepFist, value, -1, 1); - g_esPlayer[iPlayer].g_flThrowForce = flGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "ThrowForce", "Throw Force", "Throw_Force", "throwforce", g_esPlayer[iPlayer].g_flThrowForce, value, -1.0, 99999.0); - g_esPlayer[iPlayer].g_flThrowInterval = flGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "ThrowInterval", "Throw Interval", "Throw_Interval", "throwint", g_esPlayer[iPlayer].g_flThrowInterval, value, -1.0, 99999.0); - g_esPlayer[iPlayer].g_iThrowRock = iGetKeyValue(subsection, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE, MT_CONFIG_SECTION_ENHANCE2, key, "ThrowRock", "Throw Rock", "Throw_Rock", "throwrock", g_esPlayer[iPlayer].g_iThrowRock, value, -1, 1); - g_esPlayer[iPlayer].g_iBulletImmunity = iGetKeyValue(subsection, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE2, key, "BulletImmunity", "Bullet Immunity", "Bullet_Immunity", "bullet", g_esPlayer[iPlayer].g_iBulletImmunity, value, -1, 1); - g_esPlayer[iPlayer].g_iExplosiveImmunity = iGetKeyValue(subsection, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE2, key, "ExplosiveImmunity", "Explosive Immunity", "Explosive_Immunity", "explosive", g_esPlayer[iPlayer].g_iExplosiveImmunity, value, -1, 1); - g_esPlayer[iPlayer].g_iFireImmunity = iGetKeyValue(subsection, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE2, key, "FireImmunity", "Fire Immunity", "Fire_Immunity", "fire", g_esPlayer[iPlayer].g_iFireImmunity, value, -1, 1); - g_esPlayer[iPlayer].g_iHittableImmunity = iGetKeyValue(subsection, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE2, key, "HittableImmunity", "Hittable Immunity", "Hittable_Immunity", "hittable", g_esPlayer[iPlayer].g_iHittableImmunity, value, -1, 1); - g_esPlayer[iPlayer].g_iMeleeImmunity = iGetKeyValue(subsection, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE2, key, "MeleeImmunity", "Melee Immunity", "Melee_Immunity", "melee", g_esPlayer[iPlayer].g_iMeleeImmunity, value, -1, 1); - g_esPlayer[iPlayer].g_iVomitImmunity = iGetKeyValue(subsection, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE, MT_CONFIG_SECTION_IMMUNE2, key, "VomitImmunity", "Vomit Immunity", "Vomit_Immunity", "vomit", g_esPlayer[iPlayer].g_iVomitImmunity, value, -1, 1); - g_esPlayer[iPlayer].g_iFavoriteType = iGetKeyValue(subsection, MT_CONFIG_SECTION_ADMIN, MT_CONFIG_SECTION_ADMIN, MT_CONFIG_SECTION_ADMIN, MT_CONFIG_SECTION_ADMIN2, key, "FavoriteType", "Favorite Type", "Favorite_Type", "favorite", g_esPlayer[iPlayer].g_iFavoriteType, value, -1, g_esGeneral.g_iMaxType); - g_esPlayer[iPlayer].g_iAccessFlags = iGetAdminFlagsValue(subsection, MT_CONFIG_SECTION_ADMIN, MT_CONFIG_SECTION_ADMIN, MT_CONFIG_SECTION_ADMIN, MT_CONFIG_SECTION_ADMIN2, key, "AccessFlags", "Access Flags", "Access_Flags", "access", value); - g_esPlayer[iPlayer].g_iImmunityFlags = iGetAdminFlagsValue(subsection, MT_CONFIG_SECTION_ADMIN, MT_CONFIG_SECTION_ADMIN, MT_CONFIG_SECTION_ADMIN, MT_CONFIG_SECTION_ADMIN2, key, "ImmunityFlags", "Immunity Flags", "Immunity_Flags", "immunity", value); - - vGetKeyValue(subsection, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, MT_CONFIG_SECTION_HEALTH, key, "HealthCharacters", "Health Characters", "Health_Characters", "hpchars", g_esPlayer[iPlayer].g_sHealthCharacters, sizeof esPlayer::g_sHealthCharacters, value); - vGetKeyValue(subsection, MT_CONFIG_SECTION_COMBO, MT_CONFIG_SECTION_COMBO, MT_CONFIG_SECTION_COMBO, MT_CONFIG_SECTION_COMBO, key, "ComboSet", "Combo Set", "Combo_Set", "set", g_esPlayer[iPlayer].g_sComboSet, sizeof esPlayer::g_sComboSet, value); - - if (StrEqual(subsection, MT_CONFIG_SECTION_GENERAL, false)) - { - if (StrEqual(key, "SkinColor", false) || StrEqual(key, "Skin Color", false) || StrEqual(key, "Skin_Color", false) || StrEqual(key, "skin", false)) - { - char sValue[64], sSet[4][4]; - vGetConfigColors(sValue, sizeof sValue, value); - strcopy(g_esPlayer[iPlayer].g_sSkinColor, sizeof esPlayer::g_sSkinColor, value); - ReplaceString(sValue, sizeof sValue, " ", ""); - ExplodeString(sValue, ",", sSet, sizeof sSet, sizeof sSet[]); - for (int iPos = 0; iPos < (sizeof esPlayer::g_iSkinColor); iPos++) - { - g_esPlayer[iPlayer].g_iSkinColor[iPos] = (sSet[iPos][0] != '\0' && StringToInt(sSet[iPos]) >= 0) ? iClamp(StringToInt(sSet[iPos]), 0, 255) : -1; - } - } - else - { - vGetKeyValue(subsection, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, MT_CONFIG_SECTION_GENERAL, key, "TankName", "Tank Name", "Tank_Name", "name", g_esPlayer[iPlayer].g_sTankName, sizeof esPlayer::g_sTankName, value); - } - } - else if (StrEqual(subsection, MT_CONFIG_SECTION_REWARDS, false)) - { - char sValue[1280], sSet[8][320]; - strcopy(sValue, sizeof sValue, value); - ReplaceString(sValue, sizeof sValue, " ", ""); - ExplodeString(sValue, ",", sSet, sizeof sSet, sizeof sSet[]); - for (int iPos = 0; iPos < (sizeof esPlayer::g_iStackLimits); iPos++) - { - if (iPos < (sizeof esPlayer::g_iRewardEnabled)) - { - g_esPlayer[iPlayer].g_flRewardChance[iPos] = flGetClampedValue(key, "RewardChance", "Reward Chance", "Reward_Chance", "chance", g_esPlayer[iPlayer].g_flRewardChance[iPos], sSet[iPos], -1.0, 100.0); - g_esPlayer[iPlayer].g_flRewardDuration[iPos] = flGetClampedValue(key, "RewardDuration", "Reward Duration", "Reward_Duration", "duration", g_esPlayer[iPlayer].g_flRewardDuration[iPos], sSet[iPos], -1.0, 99999.0); - g_esPlayer[iPlayer].g_flRewardPercentage[iPos] = flGetClampedValue(key, "RewardPercentage", "Reward Percentage", "Reward_Percentage", "percent", g_esPlayer[iPlayer].g_flRewardPercentage[iPos], sSet[iPos], -1.0, 100.0); - g_esPlayer[iPlayer].g_flActionDurationReward[iPos] = flGetClampedValue(key, "ActionDurationReward", "Action Duration Reward", "Action_Duration_Reward", "actionduration", g_esPlayer[iPlayer].g_flActionDurationReward[iPos], sSet[iPos], -1.0, 99999.0); - g_esPlayer[iPlayer].g_flAttackBoostReward[iPos] = flGetClampedValue(key, "AttackBoostReward", "Attack Boost Reward", "Attack_Boost_Reward", "attackboost", g_esPlayer[iPlayer].g_flAttackBoostReward[iPos], sSet[iPos], -1.0, 99999.0); - g_esPlayer[iPlayer].g_flDamageBoostReward[iPos] = flGetClampedValue(key, "DamageBoostReward", "Damage Boost Reward", "Damage_Boost_Reward", "dmgboost", g_esPlayer[iPlayer].g_flDamageBoostReward[iPos], sSet[iPos], -1.0, 99999.0); - g_esPlayer[iPlayer].g_flDamageResistanceReward[iPos] = flGetClampedValue(key, "DamageResistanceReward", "Damage Resistance Reward", "Damage_Resistance_Reward", "dmgres", g_esPlayer[iPlayer].g_flDamageResistanceReward[iPos], sSet[iPos], -1.0, 1.0); - g_esPlayer[iPlayer].g_flHealPercentReward[iPos] = flGetClampedValue(key, "HealPercentReward", "Heal Percent Reward", "Heal_Percent_Reward", "healpercent", g_esPlayer[iPlayer].g_flHealPercentReward[iPos], sSet[iPos], -1.0, 100.0); - g_esPlayer[iPlayer].g_flJumpHeightReward[iPos] = flGetClampedValue(key, "JumpHeightReward", "Jump Height Reward", "Jump_Height_Reward", "jumpheight", g_esPlayer[iPlayer].g_flJumpHeightReward[iPos], sSet[iPos], -1.0, 99999.0); - g_esPlayer[iPlayer].g_flLoopingVoicelineInterval[iPos] = flGetClampedValue(key, "LoopingVoicelineInterval", "Looping Voiceline Interval", "Looping_Voiceline_Interval", "loopinterval", g_esPlayer[iPlayer].g_flLoopingVoicelineInterval[iPos], sSet[iPos], -1.0, 99999.0); - g_esPlayer[iPlayer].g_flPipeBombDurationReward[iPos] = flGetClampedValue(key, "PipebombDurationReward", "Pipebomb Duration Reward", "Pipebomb_Duration_Reward", "pipeduration", g_esPlayer[iPlayer].g_flPipeBombDurationReward[iPos], sSet[iPos], -1.0, 99999.0); - g_esPlayer[iPlayer].g_flPunchResistanceReward[iPos] = flGetClampedValue(key, "PunchResistanceReward", "Punch Resistance Reward", "Punch_Resistance_Reward", "punchres", g_esPlayer[iPlayer].g_flPunchResistanceReward[iPos], sSet[iPos], -1.0, 1.0); - g_esPlayer[iPlayer].g_flRapidPistolReward[iPos] = flGetClampedValue(key, "RapidPistolReward", "Rapid Pistol Reward", "Rapid_Pistol_Reward", "rapid", g_esPlayer[iPlayer].g_flRapidPistolReward[iPos], sSet[iPos], -1.0, 1.0); - g_esPlayer[iPlayer].g_flRefillPercentReward[iPos] = flGetClampedValue(key, "RefillPercentReward", "Refill Percent Reward", "Refill_Percent_Reward", "refillpercent", g_esPlayer[iPlayer].g_flRefillPercentReward[iPos], sSet[iPos], -1.0, 100.0); - g_esPlayer[iPlayer].g_flShoveDamageReward[iPos] = flGetClampedValue(key, "ShoveDamageReward", "Shove Damage Reward", "Shove_Damage_Reward", "shovedmg", g_esPlayer[iPlayer].g_flShoveDamageReward[iPos], sSet[iPos], -1.0, 99999.0); - g_esPlayer[iPlayer].g_flShoveRateReward[iPos] = flGetClampedValue(key, "ShoveRateReward", "Shove Rate Reward", "Shove_Rate_Reward", "shoverate", g_esPlayer[iPlayer].g_flShoveRateReward[iPos], sSet[iPos], -1.0, 99999.0); - g_esPlayer[iPlayer].g_flSpeedBoostReward[iPos] = flGetClampedValue(key, "SpeedBoostReward", "Speed Boost Reward", "Speed_Boost_Reward", "speedboost", g_esPlayer[iPlayer].g_flSpeedBoostReward[iPos], sSet[iPos], -1.0, 99999.0); - g_esPlayer[iPlayer].g_iRewardEnabled[iPos] = iGetClampedValue(key, "RewardEnabled", "Reward Enabled", "Reward_Enabled", "renabled", g_esPlayer[iPlayer].g_iRewardEnabled[iPos], sSet[iPos], -2, 2147483647); - g_esPlayer[iPlayer].g_iRewardBots[iPos] = iGetClampedValue(key, "RewardBots", "Reward Bots", "Reward_Bots", "bots", g_esPlayer[iPlayer].g_iRewardBots[iPos], sSet[iPos], -2, 2147483647); - g_esPlayer[iPlayer].g_iRewardEffect[iPos] = iGetClampedValue(key, "RewardEffect", "Reward Effect", "Reward_Effect", "effect", g_esPlayer[iPlayer].g_iRewardEffect[iPos], sSet[iPos], -1, 15); - g_esPlayer[iPlayer].g_iRewardNotify[iPos] = iGetClampedValue(key, "RewardNotify", "Reward Notify", "Reward_Notify", "rnotify", g_esPlayer[iPlayer].g_iRewardNotify[iPos], sSet[iPos], -1, 3); - g_esPlayer[iPlayer].g_iRewardVisual[iPos] = iGetClampedValue(key, "RewardVisual", "Reward Visual", "Reward_Visual", "visual", g_esPlayer[iPlayer].g_iRewardVisual[iPos], sSet[iPos], -1, 127); - g_esPlayer[iPlayer].g_iAmmoBoostReward[iPos] = iGetClampedValue(key, "AmmoBoostReward", "Ammo Boost Reward", "Ammo_Boost_Reward", "ammoboost", g_esPlayer[iPlayer].g_iAmmoBoostReward[iPos], sSet[iPos], -1, 1); - g_esPlayer[iPlayer].g_iAmmoRegenReward[iPos] = iGetClampedValue(key, "AmmoRegenReward", "Ammo Regen Reward", "Ammo_Regen_Reward", "ammoregen", g_esPlayer[iPlayer].g_iAmmoRegenReward[iPos], sSet[iPos], -1, 99999); - g_esPlayer[iPlayer].g_iBlazeHealthReward[iPos] = iGetClampedValue(key, "BlazeHealthReward", "Blaze Health Reward", "Blaze_Health_Reward", "blaze", g_esPlayer[iPlayer].g_iBlazeHealthReward[iPos], sSet[iPos], -1, 1); - g_esPlayer[iPlayer].g_iBunnyHopReward[iPos] = iGetClampedValue(key, "BunnyHopReward", "Bunny Hop Reward", "Bunny_Hop_Reward", "bhop", g_esPlayer[iPlayer].g_iBunnyHopReward[iPos], sSet[iPos], -1, 1); - g_esPlayer[iPlayer].g_iBurstDoorsReward[iPos] = iGetClampedValue(key, "BurstDoorsReward", "Burst Doors Reward", "Burst_Doors_Reward", "burstdoors", g_esPlayer[iPlayer].g_iBurstDoorsReward[iPos], sSet[iPos], -1, 1); - g_esPlayer[iPlayer].g_iCleanKillsReward[iPos] = iGetClampedValue(key, "CleanKillsReward", "Clean Kills Reward", "Clean_Kills_Reward", "cleankills", g_esPlayer[iPlayer].g_iCleanKillsReward[iPos], sSet[iPos], -1, 1); - g_esPlayer[iPlayer].g_iClusterBombsReward[iPos] = iGetClampedValue(key, "ClusterBombsReward", "Cluster Bombs Reward", "Cluster_Bombs_Reward", "cluster", g_esPlayer[iPlayer].g_iClusterBombsReward[iPos], sSet[iPos], -1, 5); - g_esPlayer[iPlayer].g_iFriendlyFireReward[iPos] = iGetClampedValue(key, "FriendlyFireReward", "Friendly Fire Reward", "Friendly_Fire_Reward", "friendlyfire", g_esPlayer[iPlayer].g_iFriendlyFireReward[iPos], sSet[iPos], -1, 1); - g_esPlayer[iPlayer].g_iGhostBulletsReward[iPos] = iGetClampedValue(key, "GhostBulletsReward", "Ghost Bullets Reward", "Ghost_Bullets_Reward", "ghost", g_esPlayer[iPlayer].g_iGhostBulletsReward[iPos], sSet[iPos], -1, 1); - g_esPlayer[iPlayer].g_iHealthRegenReward[iPos] = iGetClampedValue(key, "HealthRegenReward", "Health Regen Reward", "Health_Regen_Reward", "hpregen", g_esPlayer[iPlayer].g_iHealthRegenReward[iPos], sSet[iPos], -1, MT_MAXHEALTH); - g_esPlayer[iPlayer].g_iHollowpointAmmoReward[iPos] = iGetClampedValue(key, "HollowpointAmmoReward", "Hollowpoint Ammo Reward", "Hollowpoint_Ammo_Reward", "hollowpoint", g_esPlayer[iPlayer].g_iHollowpointAmmoReward[iPos], sSet[iPos], -1, 1); - g_esPlayer[iPlayer].g_iInextinguishableFireReward[iPos] = iGetClampedValue(key, "InextinguishableFireReward", "Inextinguishable Fire Reward", "Inextinguishable_Fire_Reward", "inexfire", g_esPlayer[iPlayer].g_iInextinguishableFireReward[iPos], sSet[iPos], -1, 1); - g_esPlayer[iPlayer].g_iInfiniteAmmoReward[iPos] = iGetClampedValue(key, "InfiniteAmmoReward", "Infinite Ammo Reward", "Infinite_Ammo_Reward", "infammo", g_esPlayer[iPlayer].g_iInfiniteAmmoReward[iPos], sSet[iPos], -1, 31); - g_esPlayer[iPlayer].g_iLadderActionsReward[iPos] = iGetClampedValue(key, "LadderActionsReward", "Ladder Actions Reward", "Ladder_Action_Reward", "ladderactions", g_esPlayer[iPlayer].g_iLadderActionsReward[iPos], sSet[iPos], -1, 1); - g_esPlayer[iPlayer].g_iLadyKillerReward[iPos] = iGetClampedValue(key, "LadyKillerReward", "Lady Killer Reward", "Lady_Killer_Reward", "ladykiller", g_esPlayer[iPlayer].g_iLadyKillerReward[iPos], sSet[iPos], -1, 99999); - g_esPlayer[iPlayer].g_iLaserSightReward[iPos] = iGetClampedValue(key, "LaserSightReward", "Laser Sight Reward", "Laser_Sight_Reward", "lasersight", g_esPlayer[iPlayer].g_iLaserSightReward[iPos], sSet[iPos], -1, 1); - g_esPlayer[iPlayer].g_iLifeLeechReward[iPos] = iGetClampedValue(key, "LifeLeechReward", "Life Leech Reward", "Life_Leech_Reward", "lifeleech", g_esPlayer[iPlayer].g_iLifeLeechReward[iPos], sSet[iPos], -1, MT_MAXHEALTH); - g_esPlayer[iPlayer].g_iMedicalCutsReward[iPos] = iGetClampedValue(key, "MedicalCutsReward", "Medical Cuts Reward", "Medical_Cuts_Reward", "medcuts", g_esPlayer[iPlayer].g_iMedicalCutsReward[iPos], sSet[iPos], -1, 1); - g_esPlayer[iPlayer].g_iMeleeRangeReward[iPos] = iGetClampedValue(key, "MeleeRangeReward", "Melee Range Reward", "Melee_Range_Reward", "meleerange", g_esPlayer[iPlayer].g_iMeleeRangeReward[iPos], sSet[iPos], -1, 99999); - g_esPlayer[iPlayer].g_iMidairDashesReward[iPos] = iGetClampedValue(key, "MidairDashesReward", "Midair Dashes Reward", "Midair_Dashes_Reward", "midairdashes", g_esPlayer[iPlayer].g_iMidairDashesReward[iPos], sSet[iPos], -1, 99999); - g_esPlayer[iPlayer].g_iParticleEffectVisual[iPos] = iGetClampedValue(key, "ParticleEffectVisual", "Particle Effect Visual", "Particle_Effect_Visual", "particle", g_esPlayer[iPlayer].g_iParticleEffectVisual[iPos], sSet[iPos], -1, 15); - g_esPlayer[iPlayer].g_iPrefsNotify[iPos] = iGetClampedValue(key, "PrefsNotify", "Prefs Notify", "Prefs_Notify", "pnotify", g_esPlayer[iPlayer].g_iPrefsNotify[iPos], sSet[iPos], -1, 1); - g_esPlayer[iPlayer].g_iRecoilDampenerReward[iPos] = iGetClampedValue(key, "RecoilDampenerReward", "Recoil Dampener Reward", "Recoil_Dampener_Reward", "recoil", g_esPlayer[iPlayer].g_iRecoilDampenerReward[iPos], sSet[iPos], -1, 1); - g_esPlayer[iPlayer].g_iRegenBurstsReward[iPos] = iGetClampedValue(key, "RegenBurstsReward", "Regen Bursts Reward", "Regen_Bursts_Reward", "regburst", g_esPlayer[iPlayer].g_iRegenBurstsReward[iPos], sSet[iPos], -1, 1); - g_esPlayer[iPlayer].g_iRespawnLoadoutReward[iPos] = iGetClampedValue(key, "RespawnLoadoutReward", "Respawn Loadout Reward", "Respawn_Loadout_Reward", "resloadout", g_esPlayer[iPlayer].g_iRespawnLoadoutReward[iPos], sSet[iPos], -1, 1); - g_esPlayer[iPlayer].g_iReviveHealthReward[iPos] = iGetClampedValue(key, "ReviveHealthReward", "Revive Health Reward", "Revive_Health_Reward", "revivehp", g_esPlayer[iPlayer].g_iReviveHealthReward[iPos], sSet[iPos], -1, MT_MAXHEALTH); - g_esPlayer[iPlayer].g_iShareRewards[iPos] = iGetClampedValue(key, "ShareRewards", "Share Rewards", "Share_Rewards", "share", g_esPlayer[iPlayer].g_iShareRewards[iPos], sSet[iPos], -1, 3); - g_esPlayer[iPlayer].g_iShovePenaltyReward[iPos] = iGetClampedValue(key, "ShovePenaltyReward", "Shove Penalty Reward", "Shove_Penalty_Reward", "shovepenalty", g_esPlayer[iPlayer].g_iShovePenaltyReward[iPos], sSet[iPos], -1, 1); - g_esPlayer[iPlayer].g_iSledgehammerRoundsReward[iPos] = iGetClampedValue(key, "SledgehammerRoundsReward", "Sledgehammer Rounds Reward", "Sledgehammer_Rounds_Reward", "sledgehammer", g_esPlayer[iPlayer].g_iSledgehammerRoundsReward[iPos], sSet[iPos], -1, 1); - g_esPlayer[iPlayer].g_iSpecialAmmoReward[iPos] = iGetClampedValue(key, "SpecialAmmoReward", "Special Ammo Reward", "Special_Ammo_Reward", "specialammo", g_esPlayer[iPlayer].g_iSpecialAmmoReward[iPos], sSet[iPos], -1, 3); - g_esPlayer[iPlayer].g_iStackRewards[iPos] = iGetClampedValue(key, "StackRewards", "Stack Rewards", "Stack_Rewards", "stack", g_esPlayer[iPlayer].g_iStackRewards[iPos], sSet[iPos], -1, 2147483647); - g_esPlayer[iPlayer].g_iStickyGrenadesReward[iPos] = iGetClampedValue(key, "StickyGrenadesReward", "Sticky Grenades Reward", "Sticky_Grenades_Reward", "sticky", g_esPlayer[iPlayer].g_iStickyGrenadesReward[iPos], sSet[iPos], -1, 1); - g_esPlayer[iPlayer].g_iSyringeDartsReward[iPos] = iGetClampedValue(key, "SyringeDartsReward", "Syringe Darts Reward", "Syringe_Darts_Reward", "syringe", g_esPlayer[iPlayer].g_iSyringeDartsReward[iPos], sSet[iPos], -1, 1); - g_esPlayer[iPlayer].g_iThornsReward[iPos] = iGetClampedValue(key, "ThornsReward", "Thorns Reward", "Thorns_Reward", "thorns", g_esPlayer[iPlayer].g_iThornsReward[iPos], sSet[iPos], -1, 1); - g_esPlayer[iPlayer].g_iUsefulRewards[iPos] = iGetClampedValue(key, "UsefulRewards", "Useful Rewards", "Useful_Rewards", "useful", g_esPlayer[iPlayer].g_iUsefulRewards[iPos], sSet[iPos], -1, 15); - g_esPlayer[iPlayer].g_iVoicePitchVisual[iPos] = iGetClampedValue(key, "VoicePitchVisual", "Voice Pitch Visual", "Voice_Pitch_Visual", "voicepitch", g_esPlayer[iPlayer].g_iVoicePitchVisual[iPos], sSet[iPos], -1, 255); - - vGetConfigColors(sValue, sizeof sValue, sSet[iPos], ';'); - vGetStringValue(key, "BodyColorVisual", "Body Color Visual", "Body_Color_Visual", "bodycolor", iPos, g_esPlayer[iPlayer].g_sBodyColorVisual, sizeof esPlayer::g_sBodyColorVisual, g_esPlayer[iPlayer].g_sBodyColorVisual2, sizeof esPlayer::g_sBodyColorVisual2, g_esPlayer[iPlayer].g_sBodyColorVisual3, sizeof esPlayer::g_sBodyColorVisual3, g_esPlayer[iPlayer].g_sBodyColorVisual4, sizeof esPlayer::g_sBodyColorVisual4, sValue); - vGetStringValue(key, "FallVoicelineReward", "Fall Voiceline Reward", "Fall_Voiceline_Reward", "fallvoice", iPos, g_esPlayer[iPlayer].g_sFallVoicelineReward, sizeof esPlayer::g_sFallVoicelineReward, g_esPlayer[iPlayer].g_sFallVoicelineReward2, sizeof esPlayer::g_sFallVoicelineReward2, g_esPlayer[iPlayer].g_sFallVoicelineReward3, sizeof esPlayer::g_sFallVoicelineReward3, g_esPlayer[iPlayer].g_sFallVoicelineReward4, sizeof esPlayer::g_sFallVoicelineReward4, sSet[iPos]); - vGetStringValue(key, "GlowColorVisual", "Glow Color Visual", "Glow_Color_Visual", "glowcolor", iPos, g_esPlayer[iPlayer].g_sOutlineColorVisual, sizeof esPlayer::g_sOutlineColorVisual, g_esPlayer[iPlayer].g_sOutlineColorVisual2, sizeof esPlayer::g_sOutlineColorVisual2, g_esPlayer[iPlayer].g_sOutlineColorVisual3, sizeof esPlayer::g_sOutlineColorVisual3, g_esPlayer[iPlayer].g_sOutlineColorVisual4, sizeof esPlayer::g_sOutlineColorVisual4, sValue); - vGetStringValue(key, "ItemReward", "Item Reward", "Item_Reward", "item", iPos, g_esPlayer[iPlayer].g_sItemReward, sizeof esPlayer::g_sItemReward, g_esPlayer[iPlayer].g_sItemReward2, sizeof esPlayer::g_sItemReward2, g_esPlayer[iPlayer].g_sItemReward3, sizeof esPlayer::g_sItemReward3, g_esPlayer[iPlayer].g_sItemReward4, sizeof esPlayer::g_sItemReward4, sSet[iPos]); - vGetStringValue(key, "LightColorVisual", "Light Color Visual", "Light_Color_Visual", "lightcolor", iPos, g_esPlayer[iPlayer].g_sLightColorVisual, sizeof esPlayer::g_sLightColorVisual, g_esPlayer[iPlayer].g_sLightColorVisual2, sizeof esPlayer::g_sLightColorVisual2, g_esPlayer[iPlayer].g_sLightColorVisual3, sizeof esPlayer::g_sLightColorVisual3, g_esPlayer[iPlayer].g_sLightColorVisual4, sizeof esPlayer::g_sLightColorVisual4, sValue); - vGetStringValue(key, "LoopingVoicelineVisual", "Looping Voiceline Visual", "Looping_Voiceline_Visual", "loopvoice", iPos, g_esPlayer[iPlayer].g_sLoopingVoicelineVisual, sizeof esPlayer::g_sLoopingVoicelineVisual, g_esPlayer[iPlayer].g_sLoopingVoicelineVisual2, sizeof esPlayer::g_sLoopingVoicelineVisual2, g_esPlayer[iPlayer].g_sLoopingVoicelineVisual3, sizeof esPlayer::g_sLoopingVoicelineVisual3, g_esPlayer[iPlayer].g_sLoopingVoicelineVisual4, sizeof esPlayer::g_sLoopingVoicelineVisual4, sSet[iPos]); - vGetStringValue(key, "ScreenColorVisual", "Screen Color Visual", "Screen_Color_Visual", "screencolor", iPos, g_esPlayer[iPlayer].g_sScreenColorVisual, sizeof esPlayer::g_sScreenColorVisual, g_esPlayer[iPlayer].g_sScreenColorVisual2, sizeof esPlayer::g_sScreenColorVisual2, g_esPlayer[iPlayer].g_sScreenColorVisual3, sizeof esPlayer::g_sScreenColorVisual3, g_esPlayer[iPlayer].g_sScreenColorVisual4, sizeof esPlayer::g_sScreenColorVisual4, sValue); - } - - g_esPlayer[iPlayer].g_iStackLimits[iPos] = iGetClampedValue(key, "StackLimits", "Stack Limits", "Stack_Limits", "limits", g_esPlayer[iPlayer].g_iStackLimits[iPos], sSet[iPos], -1, 99999); - } - } - else if (StrEqual(subsection, MT_CONFIG_SECTION_GLOW, false)) - { - if (StrEqual(key, "GlowColor", false) || StrEqual(key, "Glow Color", false) || StrEqual(key, "Glow_Color", false)) - { - char sValue[64], sSet[3][4]; - vGetConfigColors(sValue, sizeof sValue, value); - strcopy(g_esPlayer[iPlayer].g_sGlowColor, sizeof esPlayer::g_sGlowColor, value); - ReplaceString(sValue, sizeof sValue, " ", ""); - ExplodeString(sValue, ",", sSet, sizeof sSet, sizeof sSet[]); - for (int iPos = 0; iPos < (sizeof esPlayer::g_iGlowColor); iPos++) - { - g_esPlayer[iPlayer].g_iGlowColor[iPos] = (sSet[iPos][0] != '\0' && StringToInt(sSet[iPos]) >= 0) ? iClamp(StringToInt(sSet[iPos]), 0, 255) : -1; - } - } - else if (StrEqual(key, "GlowRange", false) || StrEqual(key, "Glow Range", false) || StrEqual(key, "Glow_Range", false)) - { - char sValue[14], sRange[2][7]; - strcopy(sValue, sizeof sValue, value); - ReplaceString(sValue, sizeof sValue, " ", ""); - ExplodeString(sValue, "-", sRange, sizeof sRange, sizeof sRange[]); - - g_esPlayer[iPlayer].g_iGlowMinRange = (sRange[0][0] != '\0') ? iClamp(StringToInt(sRange[0]), -1, 99999) : g_esPlayer[iPlayer].g_iGlowMinRange; - g_esPlayer[iPlayer].g_iGlowMaxRange = (sRange[1][0] != '\0') ? iClamp(StringToInt(sRange[1]), -1, 99999) : g_esPlayer[iPlayer].g_iGlowMaxRange; - } - } - else if (StrEqual(subsection, MT_CONFIG_SECTION_BOSS, false)) - { - char sValue[44], sSet[4][11]; - strcopy(sValue, sizeof sValue, value); - ReplaceString(sValue, sizeof sValue, " ", ""); - ExplodeString(sValue, ",", sSet, sizeof sSet, sizeof sSet[]); - for (int iPos = 0; iPos < (sizeof esPlayer::g_iBossHealth); iPos++) - { - g_esPlayer[iPlayer].g_iBossHealth[iPos] = iGetClampedValue(key, "BossHealthStages", "Boss Health Stages", "Boss_Health_Stages", "bosshpstages", g_esPlayer[iPlayer].g_iBossHealth[iPos], sSet[iPos], -1, MT_MAXHEALTH); - g_esPlayer[iPlayer].g_iBossType[iPos] = iGetClampedValue(key, "BossTypes", "Boss Types", "Boss_Types", "bosstypes", g_esPlayer[iPlayer].g_iBossType[iPos], sSet[iPos], -1, MT_MAXTYPES); - } - } - else if (StrEqual(subsection, MT_CONFIG_SECTION_COMBO, false)) - { - if (StrEqual(key, "ComboTypeChance", false) || StrEqual(key, "Combo Type Chance", false) || StrEqual(key, "Combo_Type_Chance", false) || StrEqual(key, "typechance", false)) - { - char sValue[42], sSet[7][6]; - strcopy(sValue, sizeof sValue, value); - ReplaceString(sValue, sizeof sValue, " ", ""); - ExplodeString(sValue, ",", sSet, sizeof sSet, sizeof sSet[]); - for (int iPos = 0; iPos < (sizeof esPlayer::g_flComboTypeChance); iPos++) - { - g_esPlayer[iPlayer].g_flComboTypeChance[iPos] = (sSet[iPos][0] != '\0') ? flClamp(StringToFloat(sSet[iPos]), -1.0, 100.0) : g_esPlayer[iPlayer].g_flComboTypeChance[iPos]; - } - } - else - { - char sValue[140], sSet[10][14]; - strcopy(sValue, sizeof sValue, value); - ReplaceString(sValue, sizeof sValue, " ", ""); - ExplodeString(sValue, ",", sSet, sizeof sSet, sizeof sSet[]); - for (int iPos = 0; iPos < (sizeof esPlayer::g_flComboChance); iPos++) - { - if (StrEqual(key, "ComboRadius", false) || StrEqual(key, "Combo Radius", false) || StrEqual(key, "Combo_Radius", false) || StrEqual(key, "radius", false)) - { - char sRange[2][7], sSubset[14]; - strcopy(sSubset, sizeof sSubset, sSet[iPos]); - ReplaceString(sSubset, sizeof sSubset, " ", ""); - ExplodeString(sSubset, ";", sRange, sizeof sRange, sizeof sRange[]); - - g_esPlayer[iPlayer].g_flComboMinRadius[iPos] = (sRange[0][0] != '\0') ? flClamp(StringToFloat(sRange[0]), -200.0, 1.0) : g_esPlayer[iPlayer].g_flComboMinRadius[iPos]; - g_esPlayer[iPlayer].g_flComboMaxRadius[iPos] = (sRange[1][0] != '\0') ? flClamp(StringToFloat(sRange[1]), -1.0, 200.0) : g_esPlayer[iPlayer].g_flComboMaxRadius[iPos]; - } - else - { - g_esPlayer[iPlayer].g_flComboChance[iPos] = flGetClampedValue(key, "ComboChance", "Combo Chance", "Combo_Chance", "chance", g_esPlayer[iPlayer].g_flComboChance[iPos], sSet[iPos], -1.0, 100.0); - g_esPlayer[iPlayer].g_iComboCooldown[iPos] = iGetClampedValue(key, "ComboCooldown", "Combo Cooldown", "Combo_Cooldown", "cooldown", g_esPlayer[iPlayer].g_iComboCooldown[iPos], sSet[iPos], -1, 99999); - g_esPlayer[iPlayer].g_flComboDamage[iPos] = flGetClampedValue(key, "ComboDamage", "Combo Damage", "Combo_Damage", "damage", g_esPlayer[iPlayer].g_flComboDamage[iPos], sSet[iPos], -1.0, 99999.0); - g_esPlayer[iPlayer].g_flComboDeathChance[iPos] = flGetClampedValue(key, "ComboDeathChance", "Combo Death Chance", "Combo_Death_Chance", "deathchance", g_esPlayer[iPlayer].g_flComboDeathChance[iPos], sSet[iPos], -1.0, 100.0); - g_esPlayer[iPlayer].g_flComboDeathRange[iPos] = flGetClampedValue(key, "ComboDeathRange", "Combo Death Range", "Combo_Death_Range", "deathrange", g_esPlayer[iPlayer].g_flComboDeathRange[iPos], sSet[iPos], -1.0, 99999.0); - g_esPlayer[iPlayer].g_flComboDelay[iPos] = flGetClampedValue(key, "ComboDelay", "Combo Delay", "Combo_Delay", "delay", g_esPlayer[iPlayer].g_flComboDelay[iPos], sSet[iPos], -1.0, 99999.0); - g_esPlayer[iPlayer].g_flComboDuration[iPos] = flGetClampedValue(key, "ComboDuration", "Combo Duration", "Combo_Duration", "duration", g_esPlayer[iPlayer].g_flComboDuration[iPos], sSet[iPos], -1.0, 99999.0); - g_esPlayer[iPlayer].g_flComboInterval[iPos] = flGetClampedValue(key, "ComboInterval", "Combo Interval", "Combo_Interval", "interval", g_esPlayer[iPlayer].g_flComboInterval[iPos], sSet[iPos], -1.0, 99999.0); - g_esPlayer[iPlayer].g_flComboRange[iPos] = flGetClampedValue(key, "ComboRange", "Combo Range", "Combo_Range", "range", g_esPlayer[iPlayer].g_flComboRange[iPos], sSet[iPos], -1.0, 99999.0); - g_esPlayer[iPlayer].g_flComboRangeChance[iPos] = flGetClampedValue(key, "ComboRangeChance", "Combo Range Chance", "Combo_Range_Chance", "rangechance", g_esPlayer[iPlayer].g_flComboRangeChance[iPos], sSet[iPos], -1.0, 100.0); - g_esPlayer[iPlayer].g_iComboRangeCooldown[iPos] = iGetClampedValue(key, "ComboRangeCooldown", "Combo Range Cooldown", "Combo_Range_Cooldown", "rangecooldown", g_esPlayer[iPlayer].g_iComboRangeCooldown[iPos], sSet[iPos], -1, 99999); - g_esPlayer[iPlayer].g_flComboRockChance[iPos] = flGetClampedValue(key, "ComboRockChance", "Combo Rock Chance", "Combo_Rock_Chance", "rockchance", g_esPlayer[iPlayer].g_flComboRockChance[iPos], sSet[iPos], -1.0, 100.0); - g_esPlayer[iPlayer].g_iComboRockCooldown[iPos] = iGetClampedValue(key, "ComboRockCooldown", "Combo Rock Cooldown", "Combo_Rock_Cooldown", "rockcooldown", g_esPlayer[iPlayer].g_iComboRockCooldown[iPos], sSet[iPos], -1, 99999); - g_esPlayer[iPlayer].g_flComboSpeed[iPos] = flGetClampedValue(key, "ComboSpeed", "Combo Speed", "Combo_Speed", "speed", g_esPlayer[iPlayer].g_flComboSpeed[iPos], sSet[iPos], -1.0, 99999.0); - } - } - } - } - else if (StrEqual(subsection, MT_CONFIG_SECTION_TRANSFORM, false)) - { - if (StrEqual(key, "TransformTypes", false) || StrEqual(key, "Transform Types", false) || StrEqual(key, "Transform_Types", false) || StrEqual(key, "transtypes", false)) - { - char sValue[50], sSet[10][5]; - strcopy(sValue, sizeof sValue, value); - ReplaceString(sValue, sizeof sValue, " ", ""); - ExplodeString(sValue, ",", sSet, sizeof sSet, sizeof sSet[]); - for (int iPos = 0; iPos < (sizeof esPlayer::g_iTransformType); iPos++) - { - g_esPlayer[iPlayer].g_iTransformType[iPos] = (sSet[iPos][0] != '\0') ? iClamp(StringToInt(sSet[iPos]), -1, MT_MAXTYPES) : g_esPlayer[iPlayer].g_iTransformType[iPos]; - } - } - } - else if (StrEqual(subsection, MT_CONFIG_SECTION_PROPS, false)) - { - if (StrEqual(key, "PropsChance", false) || StrEqual(key, "Props Chance", false) || StrEqual(key, "Props_Chance", false) || StrEqual(key, "chance", false)) - { - char sValue[54], sSet[9][6]; - strcopy(sValue, sizeof sValue, value); - ReplaceString(sValue, sizeof sValue, " ", ""); - ExplodeString(sValue, ",", sSet, sizeof sSet, sizeof sSet[]); - for (int iPos = 0; iPos < (sizeof esPlayer::g_flPropsChance); iPos++) - { - g_esPlayer[iPlayer].g_flPropsChance[iPos] = (sSet[iPos][0] != '\0') ? flClamp(StringToFloat(sSet[iPos]), -1.0, 100.0) : g_esPlayer[iPlayer].g_flPropsChance[iPos]; - } - } - else - { - char sValue[64], sSet[4][4]; - vGetConfigColors(sValue, sizeof sValue, value); - vSaveConfigColors(key, "OxygenTankColor", "Oxygen Tank Color", "Oxygen_Tank_Color", "oxygen", g_esPlayer[iPlayer].g_sOzTankColor, sizeof esPlayer::g_sOzTankColor, value); - vSaveConfigColors(key, "FlameColor", "Flame Color", "Flame_Color", "flame", g_esPlayer[iPlayer].g_sFlameColor, sizeof esPlayer::g_sFlameColor, value); - vSaveConfigColors(key, "RockColor", "Rock Color", "Rock_Color", "rock", g_esPlayer[iPlayer].g_sRockColor, sizeof esPlayer::g_sRockColor, value); - vSaveConfigColors(key, "TireColor", "Tire Color", "Tire_Color", "tire", g_esPlayer[iPlayer].g_sTireColor, sizeof esPlayer::g_sTireColor, value); - vSaveConfigColors(key, "PropaneTankColor", "Propane Tank Color", "Propane_Tank_Color", "propane", g_esPlayer[iPlayer].g_sPropTankColor, sizeof esPlayer::g_sPropTankColor, value); - vSaveConfigColors(key, "FlashlightColor", "Flashlight Color", "Flashlight_Color", "flashlight", g_esPlayer[iPlayer].g_sFlashlightColor, sizeof esPlayer::g_sFlashlightColor, value); - ReplaceString(sValue, sizeof sValue, " ", ""); - ExplodeString(sValue, ",", sSet, sizeof sSet, sizeof sSet[]); - - for (int iPos = 0; iPos < (sizeof esPlayer::g_iLightColor); iPos++) - { - g_esPlayer[iPlayer].g_iLightColor[iPos] = iGetClampedValue(key, "LightColor", "Light Color", "Light_Color", "light", g_esPlayer[iPlayer].g_iLightColor[iPos], sSet[iPos], -1, 255); - g_esPlayer[iPlayer].g_iOzTankColor[iPos] = iGetClampedValue(key, "OxygenTankColor", "Oxygen Tank Color", "Oxygen_Tank_Color", "oxygen", g_esPlayer[iPlayer].g_iOzTankColor[iPos], sSet[iPos], -1, 255); - g_esPlayer[iPlayer].g_iFlameColor[iPos] = iGetClampedValue(key, "FlameColor", "Flame Color", "Flame_Color", "flame", g_esPlayer[iPlayer].g_iFlameColor[iPos], sSet[iPos], -1, 255); - g_esPlayer[iPlayer].g_iRockColor[iPos] = iGetClampedValue(key, "RockColor", "Rock Color", "Rock_Color", "rock", g_esPlayer[iPlayer].g_iRockColor[iPos], sSet[iPos], -1, 255); - g_esPlayer[iPlayer].g_iTireColor[iPos] = iGetClampedValue(key, "TireColor", "Tire Color", "Tire_Color", "tire", g_esPlayer[iPlayer].g_iTireColor[iPos], sSet[iPos], -1, 255); - g_esPlayer[iPlayer].g_iPropTankColor[iPos] = iGetClampedValue(key, "PropaneTankColor", "Propane Tank Color", "Propane_Tank_Color", "propane", g_esPlayer[iPlayer].g_iPropTankColor[iPos], sSet[iPos], -1, 255); - g_esPlayer[iPlayer].g_iFlashlightColor[iPos] = iGetClampedValue(key, "FlashlightColor", "Flashlight Color", "Flashlight_Color", "flashlight", g_esPlayer[iPlayer].g_iFlashlightColor[iPos], sSet[iPos], -1, 255); - g_esPlayer[iPlayer].g_iCrownColor[iPos] = iGetClampedValue(key, "CrownColor", "Crown Color", "Crown_Color", "crown", g_esPlayer[iPlayer].g_iCrownColor[iPos], sSet[iPos], -1, 255); - } - } + vLogMessage(MT_LOG_SERVER, _, "%s Changed cvar \"%s\" to \"%s\".", MT_TAG, sKey, sValue); + } + else + { + vLogMessage(MT_LOG_SERVER, _, "%s Unable to change cvar: %s", MT_TAG, sKey); } - else if (!strncmp(subsection, "Tank", 4, false) || subsection[0] == '#' || IsCharNumeric(subsection[0]) || StrEqual(subsection, "all", false) || FindCharInString(subsection, ',') != -1 || FindCharInString(subsection, '-') != -1) + } + else + { + vLogMessage(MT_LOG_SERVER, _, "%s Unable to find cvar: %s", MT_TAG, sKey); + } + } + + if (mode == -1 || mode == 1) + { + g_esGeneral.g_iGameModeTypes = iGetKeyValue(subsection, MT_CONFIG_SECTION_GAMEMODES, MT_CONFIG_SECTION_GAMEMODES2, MT_CONFIG_SECTION_GAMEMODES3, MT_CONFIG_SECTION_GAMEMODES4, key, "GameModeTypes", "Game Mode Types", "Game_Mode_Types", "gmtypes", g_esGeneral.g_iGameModeTypes, value, -1, 15); + g_esGeneral.g_iConfigEnable = iGetKeyValue(subsection, MT_CONFIG_SECTION_CUSTOM, MT_CONFIG_SECTION_CUSTOM, MT_CONFIG_SECTION_CUSTOM, MT_CONFIG_SECTION_CUSTOM, key, "EnableCustomConfigs", "Enable Custom Configs", "Enable_Custom_Configs", "cenabled", g_esGeneral.g_iConfigEnable, value, -1, 1); + g_esGeneral.g_iConfigCreate = iGetKeyValue(subsection, MT_CONFIG_SECTION_CUSTOM, MT_CONFIG_SECTION_CUSTOM, MT_CONFIG_SECTION_CUSTOM, MT_CONFIG_SECTION_CUSTOM, key, "CreateConfigTypes", "Create Config Types", "Create_Config_Types", "create", g_esGeneral.g_iConfigCreate, value, -1, 255); + g_esGeneral.g_flConfigDelay = flGetKeyValue(subsection, MT_CONFIG_SECTION_CUSTOM, MT_CONFIG_SECTION_CUSTOM, MT_CONFIG_SECTION_CUSTOM, MT_CONFIG_SECTION_CUSTOM, key, "ExecuteConfigDelay", "Execute Config Delay", "Execute_Config_Delay", "delay", g_esGeneral.g_flConfigDelay, value, -1.0, 99999.0); + g_esGeneral.g_iConfigExecute = iGetKeyValue(subsection, MT_CONFIG_SECTION_CUSTOM, MT_CONFIG_SECTION_CUSTOM, MT_CONFIG_SECTION_CUSTOM, MT_CONFIG_SECTION_CUSTOM, key, "ExecuteConfigTypes", "Execute Config Types", "Execute_Config_Types", "execute", g_esGeneral.g_iConfigExecute, value, -1, 255); + + vGetKeyValue(subsection, MT_CONFIG_SECTION_GAMEMODES, MT_CONFIG_SECTION_GAMEMODES2, MT_CONFIG_SECTION_GAMEMODES3, MT_CONFIG_SECTION_GAMEMODES4, key, "EnabledGameModes", "Enabled Game Modes", "Enabled_Game_Modes", "gmenabled", g_esGeneral.g_sEnabledGameModes, sizeof esGeneral::g_sEnabledGameModes, value); + vGetKeyValue(subsection, MT_CONFIG_SECTION_GAMEMODES, MT_CONFIG_SECTION_GAMEMODES2, MT_CONFIG_SECTION_GAMEMODES3, MT_CONFIG_SECTION_GAMEMODES4, key, "DisabledGameModes", "Disabled Game Modes", "Disabled_Game_Modes", "gmdisabled", g_esGeneral.g_sDisabledGameModes, sizeof esGeneral::g_sDisabledGameModes, value); + } + + vConfigsLoadedForward(subsection, key, value, -1, -1, mode, false); + } + else if (!strncmp(section, "Tank", 4, false) || section[0] == '#' || IsCharNumeric(section[0]) || StrEqual(section, "all", false) || FindCharInString(section, ',') != -1 || FindCharInString(section, '-') != -1) + { + int iStartPos = 0, iIndex = 0, iRealType = 0; + if (!strncmp(section, "Tank", 4, false) || section[0] == '#') + { + iStartPos = iGetConfigSectionNumber(section, strlen(section)), iIndex = StringToInt(section[iStartPos]); + vReadTankSettings(iIndex, mode, subsection, key, value); + } + else if (IsCharNumeric(section[0]) || StrEqual(section, "all", false) || FindCharInString(section, ',') != -1 || FindCharInString(section, '-') != -1) + { + if (IsCharNumeric(section[0]) && FindCharInString(section, ',') == -1 && FindCharInString(section, '-') == -1) + { + iIndex = StringToInt(section); + vReadTankSettings(iIndex, mode, subsection, key, value); + } + else if (StrEqual(section, "all", false) || FindCharInString(section, ',') != -1 || FindCharInString(section, '-') != -1) + { + for (iIndex = g_esGeneral.g_iMinType; iIndex <= g_esGeneral.g_iMaxType; iIndex++) { - int iStartPos = 0, iIndex = 0, iRealType = 0; - if (!strncmp(subsection, "Tank", 4, false) || subsection[0] == '#') + if (iIndex <= 0) { - iStartPos = iGetConfigSectionNumber(subsection, strlen(subsection)), iIndex = StringToInt(subsection[iStartPos]); - vReadAdminSettings(iPlayer, iIndex, key, value); + continue; } - else if (IsCharNumeric(subsection[0]) || StrEqual(subsection, "all", false) || FindCharInString(subsection, ',') != -1 || FindCharInString(subsection, '-') != -1) - { - if (IsCharNumeric(subsection[0]) && FindCharInString(subsection, ',') == -1 && FindCharInString(subsection, '-') == -1) - { - iIndex = StringToInt(subsection); - vReadAdminSettings(iPlayer, iIndex, key, value); - } - else if (StrEqual(subsection, "all", false) || FindCharInString(subsection, ',') != -1 || FindCharInString(subsection, '-') != -1) - { - for (iIndex = g_esGeneral.g_iMinType; iIndex <= g_esGeneral.g_iMaxType; iIndex++) - { - if (iIndex <= 0) - { - continue; - } - iRealType = iFindSectionType(subsection, iIndex); - if (iIndex == iRealType || StrEqual(subsection, "all", false)) - { - vReadAdminSettings(iPlayer, iIndex, key, value); - } - } - } + iRealType = iFindSectionType(section, iIndex); + if (iIndex == iRealType || StrEqual(section, "all", false)) + { + vReadTankSettings(iIndex, mode, subsection, key, value); } } + } + } + } + } - vConfigsLoadedForward(subsection, key, value, -1, iPlayer, mode, false); + if ((mode == -1 || mode == 3) && (!strncmp(section, "STEAM_", 6, false) || !strncmp("0:", section, 2) || !strncmp("1:", section, 2) || (!strncmp(section, "[U:", 3) && section[strlen(section) - 1] == ']'))) + { + for (int iPlayer = 1; iPlayer <= MaxClients; iPlayer++) + { + if (bIsValidClient(iPlayer, MT_CHECK_INGAME) && (StrEqual(g_esPlayer[iPlayer].g_sSteamID32, section, false) || StrEqual(g_esPlayer[iPlayer].g_sSteam3ID, section, false))) + { + vReadPlayerSettings(iPlayer, subsection, key, value); + vConfigsLoadedForward(subsection, key, value, -1, iPlayer, mode, false); - break; - } + break; } } } @@ -18513,8 +23883,7 @@ void vSetTankSettings(int mode, const char[] section, const char[] subsection, c { vSetupConfigs(); } - else if (StrEqual(subsection, MT_CONFIG_SECTION_GENERAL, false) || StrEqual(subsection, MT_CONFIG_SECTION_GAMEMODES, false) || StrEqual(subsection, MT_CONFIG_SECTION_GAMEMODES2, false) - || StrEqual(subsection, MT_CONFIG_SECTION_GAMEMODES3, false) || StrEqual(subsection, MT_CONFIG_SECTION_GAMEMODES4, false)) + else if (StrEqual(subsection, MT_CONFIG_SECTION_GENERAL, false) || StrEqual(subsection, MT_CONFIG_SECTION_GAMEMODES, false) || StrEqual(subsection, MT_CONFIG_SECTION_GAMEMODES2, false) || StrEqual(subsection, MT_CONFIG_SECTION_GAMEMODES3, false) || StrEqual(subsection, MT_CONFIG_SECTION_GAMEMODES4, false)) { vPluginStatus(); } @@ -18664,7 +24033,7 @@ void vSetupConfigs() CreateDirectory(sSMPath, 511); char sEvent[32]; - int iLimit = g_bSecondGame ? 11 : 8; + int iLimit = (g_bSecondGame ? 11 : 8); for (int iType = 0; iType < iLimit; iType++) { switch (iType) @@ -19284,9 +24653,11 @@ void SMCParseStart_Config(SMCParser smc) SMCResult SMCNewSection_Config(SMCParser smc, const char[] name, bool opt_quotes) { - if (StrEqual(name, MT_CONFIG_SECTION_MAIN, false) || StrEqual(name, MT_CONFIG_SECTION_MAIN2, false) || StrEqual(name, MT_CONFIG_SECTION_MAIN3, false) || StrEqual(name, MT_CONFIG_SECTION_MAIN4, false) || StrEqual(name, MT_CONFIG_SECTION_MAIN5, false) - || StrContains(name, MT_CONFIG_SECTION_SMOKER, false) != -1 || StrContains(name, MT_CONFIG_SECTION_BOOMER, false) != -1 || StrContains(name, MT_CONFIG_SECTION_HUNTER, false) != -1 || StrContains(name, MT_CONFIG_SECTION_SPITTER, false) != -1 || StrContains(name, MT_CONFIG_SECTION_JOCKEY, false) != -1 - || StrContains(name, MT_CONFIG_SECTION_CHARGER, false) != -1 || StrEqual(name, MT_CONFIG_SECTION_SPECIAL, false) || StrContains(name, MT_CONFIG_SECTION_SPECIAL2, false) != -1 || StrEqual(name, MT_CONFIG_SECTION_INFECTED, false) || StrContains(name, MT_CONFIG_SECTION_INFECTED2, false) != -1) + if (StrEqual(name, MT_CONFIG_SECTION_MAIN, false) || StrEqual(name, MT_CONFIG_SECTION_MAIN2, false) || StrEqual(name, MT_CONFIG_SECTION_MAIN3, false) || StrEqual(name, MT_CONFIG_SECTION_MAIN4, false) || StrEqual(name, MT_CONFIG_SECTION_MAIN5, false) || StrContains(name, MT_CONFIG_SECTION_NICK, false) != -1 + || StrContains(name, MT_CONFIG_SECTION_ROCHELLE, false) != -1 || StrContains(name, MT_CONFIG_SECTION_ELLIS, false) != -1 || StrContains(name, MT_CONFIG_SECTION_COACH, false) != -1 || StrContains(name, MT_CONFIG_SECTION_BILL, false) != -1 || StrContains(name, MT_CONFIG_SECTION_ZOEY, false) != -1 + || StrContains(name, MT_CONFIG_SECTION_FRANCIS, false) != -1 || StrContains(name, MT_CONFIG_SECTION_LOUIS, false) != -1 || StrContains(name, MT_CONFIG_SECTION_WEAPON, false) != -1 || StrContains(name, MT_CONFIG_SECTION_SMOKER, false) != -1 || StrContains(name, MT_CONFIG_SECTION_BOOMER, false) != -1 + || StrContains(name, MT_CONFIG_SECTION_HUNTER, false) != -1 || StrContains(name, MT_CONFIG_SECTION_SPITTER, false) != -1 || StrContains(name, MT_CONFIG_SECTION_JOCKEY, false) != -1 || StrContains(name, MT_CONFIG_SECTION_CHARGER, false) != -1 || StrContains(name, MT_CONFIG_SECTION_WITCH, false) != -1 + || StrContains(name, MT_CONFIG_SECTION_COMMON, false) != -1 || StrEqual(name, MT_CONFIG_SECTION_SPECIAL, false) || StrContains(name, MT_CONFIG_SECTION_SPECIAL2, false) != -1 || StrEqual(name, MT_CONFIG_SECTION_MOB, false) || StrEqual(name, MT_CONFIG_SECTION_INFECTED, false) || StrContains(name, MT_CONFIG_SECTION_INFECTED2, false) != -1) { return SMCParse_Continue; } @@ -19447,8 +24818,9 @@ SMCResult SMCNewSection_Parser(SMCParser smc, const char[] name, bool opt_quotes } else if (g_esGeneral.g_csState2 == ConfigState_Specific) { - if (StrContains(name, MT_CONFIG_SECTION_SMOKER, false) != -1 || StrContains(name, MT_CONFIG_SECTION_BOOMER, false) != -1 || StrContains(name, MT_CONFIG_SECTION_HUNTER, false) != -1 || StrContains(name, MT_CONFIG_SECTION_SPITTER, false) != -1 || StrContains(name, MT_CONFIG_SECTION_JOCKEY, false) != -1 - || StrContains(name, MT_CONFIG_SECTION_CHARGER, false) != -1 || StrEqual(name, MT_CONFIG_SECTION_SPECIAL, false) || StrContains(name, MT_CONFIG_SECTION_SPECIAL2, false) != -1 || StrEqual(name, MT_CONFIG_SECTION_INFECTED, false) || StrContains(name, MT_CONFIG_SECTION_INFECTED2, false) != -1) + if (StrContains(name, MT_CONFIG_SECTION_NICK, false) != -1 || StrContains(name, MT_CONFIG_SECTION_ROCHELLE, false) != -1 || StrContains(name, MT_CONFIG_SECTION_ELLIS, false) != -1 || StrContains(name, MT_CONFIG_SECTION_COACH, false) != -1 || StrContains(name, MT_CONFIG_SECTION_BILL, false) != -1 || StrContains(name, MT_CONFIG_SECTION_ZOEY, false) != -1 || StrContains(name, MT_CONFIG_SECTION_FRANCIS, false) != -1 + || StrContains(name, MT_CONFIG_SECTION_LOUIS, false) != -1 || StrContains(name, MT_CONFIG_SECTION_WEAPON, false) != -1 || StrContains(name, MT_CONFIG_SECTION_SMOKER, false) != -1 || StrContains(name, MT_CONFIG_SECTION_BOOMER, false) != -1 || StrContains(name, MT_CONFIG_SECTION_HUNTER, false) != -1 || StrContains(name, MT_CONFIG_SECTION_SPITTER, false) != -1 || StrContains(name, MT_CONFIG_SECTION_JOCKEY, false) != -1 + || StrContains(name, MT_CONFIG_SECTION_CHARGER, false) != -1 || StrContains(name, MT_CONFIG_SECTION_WITCH, false) != -1 || StrContains(name, MT_CONFIG_SECTION_COMMON, false) != -1 || StrEqual(name, MT_CONFIG_SECTION_SPECIAL, false) || StrContains(name, MT_CONFIG_SECTION_SPECIAL2, false) != -1 || StrEqual(name, MT_CONFIG_SECTION_MOB, false) || StrEqual(name, MT_CONFIG_SECTION_INFECTED, false) || StrContains(name, MT_CONFIG_SECTION_INFECTED2, false) != -1) { g_esGeneral.g_csState2 = ConfigState_Special; @@ -19632,13 +25004,20 @@ void vConfigsLoadedForward(const char[] subsection, const char[] key, const char void vLoadConfigs(const char[] savepath, int mode) { + if (mode < 2) + { + vClearClassKeysList(); + vClearColorKeysList(); + + g_esGeneral.g_alClassKeys[0] = new ArrayList(ByteCountToCells(PLATFORM_MAX_PATH)); + g_esGeneral.g_alClassKeys[1] = new ArrayList(ByteCountToCells(PLATFORM_MAX_PATH)); + g_esGeneral.g_alColorKeys[0] = new ArrayList(ByteCountToCells(PLATFORM_MAX_PATH)); + g_esGeneral.g_alColorKeys[1] = new ArrayList(ByteCountToCells(PLATFORM_MAX_PATH)); + } + vClearAbilityList(); - vClearColorKeysList(); vClearPluginList(); - g_esGeneral.g_alColorKeys[0] = new ArrayList(ByteCountToCells(PLATFORM_MAX_PATH)); - g_esGeneral.g_alColorKeys[1] = new ArrayList(ByteCountToCells(PLATFORM_MAX_PATH)); - g_esGeneral.g_alPlugins = new ArrayList(ByteCountToCells(PLATFORM_MAX_PATH)); if (g_esGeneral.g_alPlugins != null) { @@ -19747,6 +25126,7 @@ void SMCParseStart_Main(SMCParser smc) g_esGeneral.g_iTypeCounter[1] = 0; g_esGeneral.g_iPluginEnabled = 0; g_esGeneral.g_iAutoUpdate = 0; + g_esGeneral.g_iGraphicsLevel = 3; g_esGeneral.g_iBulletFix = 1; g_esGeneral.g_iKickBots = 0; g_esGeneral.g_iListenSupport = g_bDedicated ? 0 : 1; @@ -19758,14 +25138,17 @@ void SMCParseStart_Main(SMCParser smc) g_esGeneral.g_iLogCommands = 31; g_esGeneral.g_iLogMessages = 0; g_esGeneral.g_iTankEnabled = -1; + g_esGeneral.g_flTankChance = 100.0; + g_esGeneral.g_iTankNote = 0; g_esGeneral.g_iTankModel = 0; g_esGeneral.g_flBurnDuration = 0.0; g_esGeneral.g_flBurntSkin = -1.0; g_esGeneral.g_iCycleTypes = 0; g_esGeneral.g_iSpawnEnabled = -1; g_esGeneral.g_iSpawnLimit = 0; - g_esGeneral.g_iMinType = 1; g_esGeneral.g_iMaxType = MT_MAXTYPES; + g_esGeneral.g_iMaxWeapons = 0; + g_esGeneral.g_iMinType = 1; g_esGeneral.g_iRequiresHumans = 0; g_esGeneral.g_iAnnounceArrival = 31; g_esGeneral.g_iAnnounceDeath = 1; @@ -19778,6 +25161,10 @@ void SMCParseStart_Main(SMCParser smc) g_esGeneral.g_iKillMessage = 0; g_esGeneral.g_iVocalizeArrival = 1; g_esGeneral.g_iVocalizeDeath = 1; + g_esGeneral.g_iFinaleCheck = 0; + g_esGeneral.g_iSurvivorTypes = 1; + g_esGeneral.g_iSurvivorsRequired = 3; + g_esGeneral.g_iIncapsRequired = 2; g_esGeneral.g_sBodyColorVisual = "-1;-1;-1;-1"; g_esGeneral.g_sBodyColorVisual2 = "-1;-1;-1;-1"; g_esGeneral.g_sBodyColorVisual3 = "-1;-1;-1;-1"; @@ -19807,6 +25194,92 @@ void SMCParseStart_Main(SMCParser smc) g_esGeneral.g_sScreenColorVisual3 = "-1;-1;-1;-1"; g_esGeneral.g_sScreenColorVisual4 = "-1;-1;-1;-1"; g_esGeneral.g_iTeammateLimit = 0; + g_esHuman.g_iCarrierEnabled = 0; + g_esHuman.g_iCarrierBots = 0; + g_esHuman.g_iCarrierBody = 0; + g_esHuman.g_flCarrierChance = 0.0; + g_esHuman.g_iCarrierCleanse = 0; + g_esHuman.g_flCarrierDamageMultiplier = 0.0; + g_esHuman.g_flCarrierDelay = 0.0; + g_esHuman.g_iCarrierFilter = 0; + g_esHuman.g_flCarrierHealthMultiplier = 0.0; + g_esHuman.g_iCarrierInfection = 0; + g_esHuman.g_iCarrierMaxType = MT_MAXTYPES; + g_esHuman.g_iCarrierMinType = 1; + g_esHuman.g_iCarrierMix = 0; + g_esHuman.g_iCarrierMode = 0; + g_esHuman.g_iCarrierTeleport = 0; + g_esHuman.g_iCarrierVoice = 0; + g_esHuman.g_flCarrierVoiceChance = 0.0; + g_esHuman.g_flCarrierVoiceInterval = 0.0; + g_esHuman.g_sCarrierAttackVoicelines[0] = '\0'; + g_esHuman.g_sCarrierBaitVoicelines[0] = '\0'; + g_esHuman.g_iPassiveEnabled = -1; + g_esHuman.g_iPassiveBots = -1; + g_esHuman.g_iPassiveNotify = 0; + g_esHuman.g_flActionDurationPassive = 0.0; + g_esHuman.g_flAdrenalineTimePassive = 0.0; + g_esHuman.g_iAmmoBoostPassive = 0; + g_esHuman.g_iAmmoRefillPassive = 0; + g_esHuman.g_iAmmoRegenPassive = 0; + g_esHuman.g_flAttackBoostPassive = 0.0; + g_esHuman.g_iBlazeHealthPassive = 0; + g_esHuman.g_iBloodDonorPassive = 0; + g_esHuman.g_iBunnyHopPassive = 0; + g_esHuman.g_iBurstDoorsPassive = 0; + g_esHuman.g_iCleanKillsPassive = 0; + g_esHuman.g_iClusterBombsPassive = 0; + g_esHuman.g_flDamageBoostPassive = 0.0; + g_esHuman.g_flDamageResistancePassive = 0.0; + g_esHuman.g_flDopamineRadiusPassive = 0.0; + g_esHuman.g_iEternalFlamesPassive = 0; + g_esHuman.g_iFastRecoveryPassive = 0; + g_esHuman.g_flFireRatePassive = 0.0; + g_esHuman.g_iFriendlyFirePassive = 0; + g_esHuman.g_iGhostBulletsPassive = 0; + g_esHuman.g_flGrenadeLauncherPassive = 0.0; + g_esHuman.g_flHealPercentPassive = 0.0; + g_esHuman.g_flHealthcareRadiusPassive = 0.0; + g_esHuman.g_iHealthRegenPassive = 0; + g_esHuman.g_flHeartbeatPassive = 0.0; + g_esHuman.g_flHollowpointAmmoPassive = 0.0; + g_esHuman.g_iInfiniteAmmoPassive = 0; + g_esHuman.g_sItemPassive[0] = '\0'; + g_esHuman.g_flJumpHeightPassive = 0.0; + g_esHuman.g_iLadderActionsPassive = 0; + g_esHuman.g_flLadyKillerPassive = 0.0; + g_esHuman.g_iLaserSightPassive = 0; + g_esHuman.g_iLifeLeechPassive = 0; + g_esHuman.g_flLuckyBulletPassive = 0.0; + g_esHuman.g_iMedicalCutsPassive = 0; + g_esHuman.g_iMeleeRangePassive = 0; + g_esHuman.g_iMidairDashesPassive = 0; + g_esHuman.g_flMotivationRadiusPassive = 0.0; + g_esHuman.g_flOverdoseRadiusPassive = 0.0; + g_esHuman.g_iOverhealthPassive = 0; + g_esHuman.g_flPipeBombDurationPassive = 0.0; + g_esHuman.g_flPunchResistancePassive = 0.0; + g_esHuman.g_flRapidPistolPassive = 0.0; + g_esHuman.g_iRecoilDampenerPassive = 0; + g_esHuman.g_flRefillPercentPassive = 0.0; + g_esHuman.g_iRegenBurstsPassive = 0; + g_esHuman.g_flReloadRatePassive = 0.0; + g_esHuman.g_iRespawnLoadoutPassive = 0; + g_esHuman.g_iReviveHealthPassive = 0; + g_esHuman.g_iRiotGearPassive = 0; + g_esHuman.g_iSafetyBubblePassive = 0; + g_esHuman.g_flShockwaveRadiusPassive = 0.0; + g_esHuman.g_flShoveDamagePassive = 0.0; + g_esHuman.g_iShovePenaltyPassive = 0; + g_esHuman.g_flShoveRatePassive = 0.0; + g_esHuman.g_flSledgehammerRoundsPassive = 0.0; + g_esHuman.g_iSpecialAmmoPassive = 0; + g_esHuman.g_flSpeedBoostPassive = 0.0; + g_esHuman.g_iStickyGrenadesPassive = 0; + g_esHuman.g_flSupplierPassive = 0.0; + g_esHuman.g_flSwingRatePassive = 0.0; + g_esHuman.g_iSyringeDartsPassive = 0; + g_esHuman.g_iThornsPassive = 0; g_esGeneral.g_iAutoAggravate = 1; g_esGeneral.g_iCreditIgniters = 1; g_esGeneral.g_flForceSpawn = 0.0; @@ -19814,10 +25287,34 @@ void SMCParseStart_Main(SMCParser smc) g_esGeneral.g_iStasisMode = 0; g_esGeneral.g_flSurvivalDelay = 0.1; g_esGeneral.g_iScaleDamage = 0; + g_esGeneral.g_flInfectedChance = 0.0; + g_esGeneral.g_iInfectedDamage = 1; + g_esGeneral.g_iInfectedHealth = 1; + g_esGeneral.g_flInfectedScaleMin = 0.1; + g_esGeneral.g_flInfectedScaleMax = 10.0; + g_esGeneral.g_flJockeyChance = 0.0; + g_esGeneral.g_iJockeyDamage = 1; + g_esGeneral.g_iJockeyHealth = 1; + g_esGeneral.g_flJockeyScaleMin = 0.1; + g_esGeneral.g_flJockeyScaleMax = 10.0; + g_esGeneral.g_flWitchChance = 0.0; + g_esGeneral.g_iWitchDamage = 1; + g_esGeneral.g_iWitchHealth = 1; + g_esGeneral.g_flWitchScaleMin = 0.1; + g_esGeneral.g_flWitchScaleMax = 10.0; g_esGeneral.g_iBaseHealth = 0; g_esGeneral.g_iDisplayHealth = 11; g_esGeneral.g_iDisplayHealthType = 1; g_esGeneral.g_iExtraHealth = 0; + g_esGeneral.g_sArmorCharacters = "],="; + g_esGeneral.g_flArmorPercentage = 0.0; + g_esGeneral.g_flArmorResistance[0] = 0.75; + g_esGeneral.g_sShieldCharacters = ">,-"; + g_esGeneral.g_flShieldPercentage = 0.0; + g_esGeneral.g_flShieldRate = 0.5; + g_esGeneral.g_flPassiveDelay = 5.0; + g_esGeneral.g_iPassiveHealth = 0; + g_esGeneral.g_flPassiveInterval = 1.0; g_esGeneral.g_sHealthCharacters = "|,-"; g_esGeneral.g_flHealPercentMultiplier = 1.0; g_esGeneral.g_iHumanMultiplierMode = 0; @@ -19825,10 +25322,11 @@ void SMCParseStart_Main(SMCParser smc) g_esGeneral.g_iMultiplyHealth = 0; g_esGeneral.g_iSpawnProtection = 0; g_esGeneral.g_flArmorDuration = 3.0; - g_esGeneral.g_flArmorResistance = 0.75; + g_esGeneral.g_flArmorResistance[1] = 0.75; g_esGeneral.g_flShieldDuration = 1.0; g_esGeneral.g_flShieldResistance = 0.0; g_esGeneral.g_flAttackInterval = 0.0; + g_esGeneral.g_iAutoHop = 0; g_esGeneral.g_flClawDamage = -1.0; g_esGeneral.g_iFootstepShake = 0; g_esGeneral.g_iGroundPound = 0; @@ -19895,6 +25393,19 @@ void SMCParseStart_Main(SMCParser smc) g_esGeneral.g_iFinaleMinTypes[iPos] = 1; g_esGeneral.g_iFinaleWave[iPos] = 0; + if (iPos < (sizeof esGeneral::g_iPunishEnabled)) + { + g_esGeneral.g_iPunishEnabled[iPos] = -1; + g_esGeneral.g_iPunishBots[iPos] = -1; + g_esGeneral.g_iPunisherTypes[iPos] = (g_bSecondGame ? 127 : 15); + g_esGeneral.g_flPunisherLifetime[iPos] = 5.0; + g_esGeneral.g_flWarningDistance[iPos] = 500.0; + g_esGeneral.g_flPunishDistance[iPos] = 1000.0; + g_esGeneral.g_iWarningLimit[iPos] = 3; + g_esGeneral.g_iWarningInterval[iPos] = 5; + g_esGeneral.g_flZedTime[iPos] = 1.0; + } + if (iPos < (sizeof esGeneral::g_iRewardEnabled)) { g_esGeneral.g_iRewardEnabled[iPos] = -1; @@ -19904,34 +25415,47 @@ void SMCParseStart_Main(SMCParser smc) g_esGeneral.g_iRewardEffect[iPos] = 15; g_esGeneral.g_iRewardNotify[iPos] = 3; g_esGeneral.g_flRewardPercentage[iPos] = 10.0; - g_esGeneral.g_iRewardVisual[iPos] = g_bSecondGame ? 127 : 63; + g_esGeneral.g_iRewardVisual[iPos] = (g_bSecondGame ? 127 : 63); g_esGeneral.g_flActionDurationReward[iPos] = 2.0; + g_esGeneral.g_flAdrenalineTimeReward[iPos] = 30.0; g_esGeneral.g_iAmmoBoostReward[iPos] = 1; + g_esGeneral.g_iAmmoRefillReward[iPos] = 1; g_esGeneral.g_iAmmoRegenReward[iPos] = 1; g_esGeneral.g_flAttackBoostReward[iPos] = 1.25; g_esGeneral.g_iBlazeHealthReward[iPos] = 1; + g_esGeneral.g_iBloodDonorReward[iPos] = 0; g_esGeneral.g_iBunnyHopReward[iPos] = 1; g_esGeneral.g_iBurstDoorsReward[iPos] = 1; g_esGeneral.g_iCleanKillsReward[iPos] = 1; g_esGeneral.g_iClusterBombsReward[iPos] = 3; g_esGeneral.g_flDamageBoostReward[iPos] = 1.25; g_esGeneral.g_flDamageResistanceReward[iPos] = 0.5; + g_esGeneral.g_flDopamineRadiusReward[iPos] = 150.0; + g_esGeneral.g_iEternalFlamesReward[iPos] = 1; + g_esGeneral.g_iFastRecoveryReward[iPos] = 1; + g_esGeneral.g_flFireRateReward[iPos] = 1.25; g_esGeneral.g_iFriendlyFireReward[iPos] = 1; g_esGeneral.g_iGhostBulletsReward[iPos] = 1; + g_esGeneral.g_flGrenadeLauncherReward[iPos] = 10.0; g_esGeneral.g_flHealPercentReward[iPos] = 100.0; + g_esGeneral.g_flHealthcareRadiusReward[iPos] = 150.0; g_esGeneral.g_iHealthRegenReward[iPos] = 1; - g_esGeneral.g_iHollowpointAmmoReward[iPos] = 1; - g_esGeneral.g_flJumpHeightReward[iPos] = 75.0; - g_esGeneral.g_iInextinguishableFireReward[iPos] = 1; + g_esGeneral.g_flHeartbeatReward[iPos] = 3.0; + g_esGeneral.g_flHollowpointAmmoReward[iPos] = 100.0; g_esGeneral.g_iInfiniteAmmoReward[iPos] = 31; + g_esGeneral.g_flJumpHeightReward[iPos] = 75.0; g_esGeneral.g_iLadderActionsReward[iPos] = 1; - g_esGeneral.g_iLadyKillerReward[iPos] = 1; + g_esGeneral.g_flLadyKillerReward[iPos] = 25.0; g_esGeneral.g_iLaserSightReward[iPos] = 1; g_esGeneral.g_iLifeLeechReward[iPos] = 1; g_esGeneral.g_flLoopingVoicelineInterval[iPos] = 10.0; + g_esGeneral.g_flLuckyBulletReward[iPos] = 25.0; g_esGeneral.g_iMedicalCutsReward[iPos] = 1; g_esGeneral.g_iMeleeRangeReward[iPos] = 150; g_esGeneral.g_iMidairDashesReward[iPos] = 2; + g_esGeneral.g_flMotivationRadiusReward[iPos] = 150.0; + g_esGeneral.g_flOverdoseRadiusReward[iPos] = 150.0; + g_esGeneral.g_iOverhealthReward[iPos] = 200; g_esGeneral.g_iParticleEffectVisual[iPos] = 15; g_esGeneral.g_flPipeBombDurationReward[iPos] = 10.0; g_esGeneral.g_iPrefsNotify[iPos] = 1; @@ -19940,17 +25464,23 @@ void SMCParseStart_Main(SMCParser smc) g_esGeneral.g_iRecoilDampenerReward[iPos] = 1; g_esGeneral.g_flRefillPercentReward[iPos] = 100.0; g_esGeneral.g_iRegenBurstsReward[iPos] = 1; + g_esGeneral.g_flReloadRateReward[iPos] = 1.25; g_esGeneral.g_iRespawnLoadoutReward[iPos] = 1; g_esGeneral.g_iReviveHealthReward[iPos] = 100; + g_esGeneral.g_iRiotGearReward[iPos] = 1; + g_esGeneral.g_iSafetyBubbleReward[iPos] = 1; g_esGeneral.g_iShareRewards[iPos] = 0; + g_esGeneral.g_flShockwaveRadiusReward[iPos] = 150.0; g_esGeneral.g_flShoveDamageReward[iPos] = 0.025; g_esGeneral.g_iShovePenaltyReward[iPos] = 1; g_esGeneral.g_flShoveRateReward[iPos] = 0.7; - g_esGeneral.g_iSledgehammerRoundsReward[iPos] = 1; + g_esGeneral.g_flSledgehammerRoundsReward[iPos] = 100.0; g_esGeneral.g_iSpecialAmmoReward[iPos] = 3; g_esGeneral.g_flSpeedBoostReward[iPos] = 1.25; g_esGeneral.g_iStackRewards[iPos] = 0; g_esGeneral.g_iStickyGrenadesReward[iPos] = 1; + g_esGeneral.g_flSupplierReward[iPos] = 3.0; + g_esGeneral.g_flSwingRateReward[iPos] = 1.25; g_esGeneral.g_iSyringeDartsReward[iPos] = 1; g_esGeneral.g_iThornsReward[iPos] = 1; g_esGeneral.g_iUsefulRewards[iPos] = 15; @@ -19971,13 +25501,15 @@ void SMCParseStart_Main(SMCParser smc) g_esSpecific.g_iDeathRevert = -1; g_esSpecific.g_iFinalesOnly = -1; g_esSpecific.g_iSpecialTypes = -1; + g_esSpecific.g_flSpecialChance = -1.0; + g_esSpecific.g_iSpecialNote = -1; g_esSpecific.g_iSpecialModel = -1; g_esSpecific.g_flBurnDuration = -1.0; g_esSpecific.g_flBurntSkin = -2.0; g_esSpecific.g_iCycleTypes = -1; g_esSpecific.g_iSpawnEnabled = -1; - g_esSpecific.g_iMinType = -1; g_esSpecific.g_iMaxType = -1; + g_esSpecific.g_iMinType = -1; g_esSpecific.g_iRequiresHumans = -1; g_esSpecific.g_iAnnounceArrival = -1; g_esSpecific.g_iAnnounceDeath = -1; @@ -19992,6 +25524,15 @@ void SMCParseStart_Main(SMCParser smc) g_esSpecific.g_iVocalizeDeath = -1; g_esSpecific.g_iDisplayHealth = -1; g_esSpecific.g_iDisplayHealthType = -1; + g_esSpecific.g_sArmorCharacters[0] = '\0'; + g_esSpecific.g_flArmorPercentage = -1.0; + g_esSpecific.g_flArmorResistance[0] = -1.0; + g_esSpecific.g_sShieldCharacters[0] = '\0'; + g_esSpecific.g_flShieldPercentage = -1.0; + g_esSpecific.g_flShieldRate = -1.0; + g_esSpecific.g_flPassiveDelay = -1.0; + g_esSpecific.g_iPassiveHealth = -1; + g_esSpecific.g_flPassiveInterval = -1.0; g_esSpecific.g_sHealthCharacters[0] = '\0'; g_esSpecific.g_flHealPercentMultiplier = -1.0; g_esSpecific.g_iHumanMultiplierMode = -1; @@ -19999,10 +25540,11 @@ void SMCParseStart_Main(SMCParser smc) g_esSpecific.g_iMultiplyHealth = -1; g_esSpecific.g_iSpawnProtection = -1; g_esSpecific.g_flArmorDuration = -1.0; - g_esSpecific.g_flArmorResistance = -1.0; + g_esSpecific.g_flArmorResistance[1] = -1.0; g_esSpecific.g_flShieldDuration = -1.0; g_esSpecific.g_flShieldResistance = -1.0; g_esSpecific.g_flAttackInterval = -1.0; + g_esSpecific.g_iAutoHop = -1; g_esSpecific.g_flClawDamage = -2.0; g_esSpecific.g_flHittableDamage = -2.0; g_esSpecific.g_flIncapDamageMultiplier = -1.0; @@ -20020,6 +25562,24 @@ void SMCParseStart_Main(SMCParser smc) g_esSpecific.g_iMeleeImmunity = -1; g_esSpecific.g_iVomitImmunity = -1; g_esSpecific.g_iSpawnMode = -1; + g_esMob.g_iMobVariants = -1; + g_esMob.g_flCommonBioChance = 50.0; + g_esMob.g_flCommonChance = 100.0; + g_esMob.g_flCommonCheck = 300.0; + g_esMob.g_flCommonDamagePoints = 50.0; + g_esMob.g_flCommonDeathPoints = 100.0; + g_esMob.g_iCommonFilter = 0; + g_esMob.g_flCommonGoal = 5000.0; + g_esMob.g_iCommonVariant = 0; + g_esMob.g_flWitchChance = 100.0; + g_esMob.g_iWitchFilter = 0; + g_esMob.g_iWitchMode = 0; + g_esMob.g_flWitchMutateChance = 100.0; + g_esMob.g_flWitchRange = 500.0; + g_esMob.g_iWitchTypes = 0; + g_esMob.g_iDisplayHealth = -1; + g_esMob.g_iDisplayHealthType = -1; + g_esMob.g_sHealthCharacters[0] = '\0'; for (int iPos = 0; iPos < (sizeof esSpecific::g_iStackLimits); iPos++) { @@ -20042,32 +25602,45 @@ void SMCParseStart_Main(SMCParser smc) g_esSpecific.g_flRewardPercentage[iPos] = -1.0; g_esSpecific.g_iRewardVisual[iPos] = -1; g_esSpecific.g_flActionDurationReward[iPos] = -1.0; + g_esSpecific.g_flAdrenalineTimeReward[iPos] = -1.0; g_esSpecific.g_iAmmoBoostReward[iPos] = -1; + g_esSpecific.g_iAmmoRefillReward[iPos] = -1; g_esSpecific.g_iAmmoRegenReward[iPos] = -1; g_esSpecific.g_flAttackBoostReward[iPos] = -1.0; g_esSpecific.g_iBlazeHealthReward[iPos] = -1; + g_esSpecific.g_iBloodDonorReward[iPos] = -1; g_esSpecific.g_iBunnyHopReward[iPos] = -1; g_esSpecific.g_iBurstDoorsReward[iPos] = -1; g_esSpecific.g_iCleanKillsReward[iPos] = -1; g_esSpecific.g_iClusterBombsReward[iPos] = -1; g_esSpecific.g_flDamageBoostReward[iPos] = -1.0; g_esSpecific.g_flDamageResistanceReward[iPos] = -1.0; + g_esSpecific.g_flDopamineRadiusReward[iPos] = -1.0; + g_esSpecific.g_iEternalFlamesReward[iPos] = -1; + g_esSpecific.g_iFastRecoveryReward[iPos] = -1; + g_esSpecific.g_flFireRateReward[iPos] = -1.0; g_esSpecific.g_iFriendlyFireReward[iPos] = -1; g_esSpecific.g_iGhostBulletsReward[iPos] = -1; + g_esSpecific.g_flGrenadeLauncherReward[iPos] = -1.0; g_esSpecific.g_flHealPercentReward[iPos] = -1.0; + g_esSpecific.g_flHealthcareRadiusReward[iPos] = -1.0; g_esSpecific.g_iHealthRegenReward[iPos] = -1; - g_esSpecific.g_iHollowpointAmmoReward[iPos] = -1; - g_esSpecific.g_flJumpHeightReward[iPos] = -1.0; - g_esSpecific.g_iInextinguishableFireReward[iPos] = -1; + g_esSpecific.g_flHeartbeatReward[iPos] = -1.0; + g_esSpecific.g_flHollowpointAmmoReward[iPos] = -1.0; g_esSpecific.g_iInfiniteAmmoReward[iPos] = -1; + g_esSpecific.g_flJumpHeightReward[iPos] = -1.0; g_esSpecific.g_iLadderActionsReward[iPos] = -1; - g_esSpecific.g_iLadyKillerReward[iPos] = -1; + g_esSpecific.g_flLadyKillerReward[iPos] = -1.0; g_esSpecific.g_iLaserSightReward[iPos] = -1; g_esSpecific.g_iLifeLeechReward[iPos] = -1; g_esSpecific.g_flLoopingVoicelineInterval[iPos] = -1.0; + g_esSpecific.g_flLuckyBulletReward[iPos] = -1.0; g_esSpecific.g_iMedicalCutsReward[iPos] = -1; g_esSpecific.g_iMeleeRangeReward[iPos] = -1; g_esSpecific.g_iMidairDashesReward[iPos] = -1; + g_esSpecific.g_flMotivationRadiusReward[iPos] = -1.0; + g_esSpecific.g_flOverdoseRadiusReward[iPos] = -1.0; + g_esSpecific.g_iOverhealthReward[iPos] = -1; g_esSpecific.g_iParticleEffectVisual[iPos] = -1; g_esSpecific.g_flPipeBombDurationReward[iPos] = -1.0; g_esSpecific.g_iPrefsNotify[iPos] = -1; @@ -20076,17 +25649,23 @@ void SMCParseStart_Main(SMCParser smc) g_esSpecific.g_iRecoilDampenerReward[iPos] = -1; g_esSpecific.g_flRefillPercentReward[iPos] = -1.0; g_esSpecific.g_iRegenBurstsReward[iPos] = -1; + g_esSpecific.g_flReloadRateReward[iPos] = -1.0; g_esSpecific.g_iRespawnLoadoutReward[iPos] = -1; g_esSpecific.g_iReviveHealthReward[iPos] = -1; + g_esSpecific.g_iRiotGearReward[iPos] = -1; + g_esSpecific.g_iSafetyBubbleReward[iPos] = -1; g_esSpecific.g_iShareRewards[iPos] = -1; + g_esSpecific.g_flShockwaveRadiusReward[iPos] = -1.0; g_esSpecific.g_flShoveDamageReward[iPos] = -1.0; g_esSpecific.g_iShovePenaltyReward[iPos] = -1; g_esSpecific.g_flShoveRateReward[iPos] = -1.0; - g_esSpecific.g_iSledgehammerRoundsReward[iPos] = -1; + g_esSpecific.g_flSledgehammerRoundsReward[iPos] = -1.0; g_esSpecific.g_iSpecialAmmoReward[iPos] = -1; g_esSpecific.g_flSpeedBoostReward[iPos] = -1.0; g_esSpecific.g_iStackRewards[iPos] = -1; g_esSpecific.g_iStickyGrenadesReward[iPos] = -1; + g_esSpecific.g_flSupplierReward[iPos] = -1.0; + g_esSpecific.g_flSwingRateReward[iPos] = -1.0; g_esSpecific.g_iSyringeDartsReward[iPos] = -1; g_esSpecific.g_iThornsReward[iPos] = -1; g_esSpecific.g_iUsefulRewards[iPos] = -1; @@ -20096,11 +25675,169 @@ void SMCParseStart_Main(SMCParser smc) if (iPos < (sizeof esSpecific::g_iStackLimits)) { g_esSpecific.g_iStackLimits[iPos] = 0; + g_esSurvivor[iPos].g_iCarrierEnabled = -1; + g_esSurvivor[iPos].g_iCarrierBots = -1; + g_esSurvivor[iPos].g_iCarrierBody = -1; + g_esSurvivor[iPos].g_flCarrierChance = -1.0; + g_esSurvivor[iPos].g_iCarrierCleanse = -1; + g_esSurvivor[iPos].g_flCarrierDamageMultiplier = -1.0; + g_esSurvivor[iPos].g_flCarrierDelay = -1.0; + g_esSurvivor[iPos].g_iCarrierFilter = -1; + g_esSurvivor[iPos].g_flCarrierHealthMultiplier = -1.0; + g_esSurvivor[iPos].g_iCarrierInfection = -1; + g_esSurvivor[iPos].g_iCarrierMaxType = -1; + g_esSurvivor[iPos].g_iCarrierMinType = -1; + g_esSurvivor[iPos].g_iCarrierMix = -1; + g_esSurvivor[iPos].g_iCarrierMode = -1; + g_esSurvivor[iPos].g_iCarrierTeleport = -1; + g_esSurvivor[iPos].g_iCarrierVoice = -1; + g_esSurvivor[iPos].g_flCarrierVoiceChance = -1.0; + g_esSurvivor[iPos].g_flCarrierVoiceInterval = -1.0; + g_esSurvivor[iPos].g_sCarrierAttackVoicelines[0] = '\0'; + g_esSurvivor[iPos].g_sCarrierBaitVoicelines[0] = '\0'; + g_esSurvivor[iPos].g_iPassiveEnabled = -2; + g_esSurvivor[iPos].g_iPassiveBots = -2; + g_esSurvivor[iPos].g_iPassiveNotify = -1; + g_esSurvivor[iPos].g_flActionDurationPassive = -1.0; + g_esSurvivor[iPos].g_flAdrenalineTimePassive = -1.0; + g_esSurvivor[iPos].g_iAmmoBoostPassive = -1; + g_esSurvivor[iPos].g_iAmmoRefillPassive = -1; + g_esSurvivor[iPos].g_iAmmoRegenPassive = -1; + g_esSurvivor[iPos].g_flAttackBoostPassive = -1.0; + g_esSurvivor[iPos].g_iBlazeHealthPassive = -1; + g_esSurvivor[iPos].g_iBloodDonorPassive = -1; + g_esSurvivor[iPos].g_iBunnyHopPassive = -1; + g_esSurvivor[iPos].g_iBurstDoorsPassive = -1; + g_esSurvivor[iPos].g_iCleanKillsPassive = -1; + g_esSurvivor[iPos].g_iClusterBombsPassive = -1; + g_esSurvivor[iPos].g_flDamageBoostPassive = -1.0; + g_esSurvivor[iPos].g_flDamageResistancePassive = -1.0; + g_esSurvivor[iPos].g_flDopamineRadiusPassive = -1.0; + g_esSurvivor[iPos].g_iEternalFlamesPassive = -1; + g_esSurvivor[iPos].g_iFastRecoveryPassive = -1; + g_esSurvivor[iPos].g_flFireRatePassive = -1.0; + g_esSurvivor[iPos].g_iFriendlyFirePassive = -1; + g_esSurvivor[iPos].g_iGhostBulletsPassive = -1; + g_esSurvivor[iPos].g_flGrenadeLauncherPassive = -1.0; + g_esSurvivor[iPos].g_flHealPercentPassive = -1.0; + g_esSurvivor[iPos].g_flHealthcareRadiusPassive = -1.0; + g_esSurvivor[iPos].g_iHealthRegenPassive = -1; + g_esSurvivor[iPos].g_flHeartbeatPassive = -1.0; + g_esSurvivor[iPos].g_flHollowpointAmmoPassive = -1.0; + g_esSurvivor[iPos].g_iInfiniteAmmoPassive = -1; + g_esSurvivor[iPos].g_sItemPassive[0] = '\0'; + g_esSurvivor[iPos].g_flJumpHeightPassive = -1.0; + g_esSurvivor[iPos].g_iLadderActionsPassive = -1; + g_esSurvivor[iPos].g_flLadyKillerPassive = -1.0; + g_esSurvivor[iPos].g_iLaserSightPassive = -1; + g_esSurvivor[iPos].g_iLifeLeechPassive = -1; + g_esSurvivor[iPos].g_flLuckyBulletPassive = -1.0; + g_esSurvivor[iPos].g_iMedicalCutsPassive = -1; + g_esSurvivor[iPos].g_iMeleeRangePassive = -1; + g_esSurvivor[iPos].g_iMidairDashesPassive = -1; + g_esSurvivor[iPos].g_flMotivationRadiusPassive = -1.0; + g_esSurvivor[iPos].g_flOverdoseRadiusPassive = -1.0; + g_esSurvivor[iPos].g_iOverhealthPassive = -1; + g_esSurvivor[iPos].g_flPipeBombDurationPassive = -1.0; + g_esSurvivor[iPos].g_flPunchResistancePassive = -1.0; + g_esSurvivor[iPos].g_flRapidPistolPassive = -1.0; + g_esSurvivor[iPos].g_iRecoilDampenerPassive = -1; + g_esSurvivor[iPos].g_flRefillPercentPassive = -1.0; + g_esSurvivor[iPos].g_iRegenBurstsPassive = -1; + g_esSurvivor[iPos].g_flReloadRatePassive = -1.0; + g_esSurvivor[iPos].g_iRespawnLoadoutPassive = -1; + g_esSurvivor[iPos].g_iReviveHealthPassive = -1; + g_esSurvivor[iPos].g_iRiotGearPassive = -1; + g_esSurvivor[iPos].g_iSafetyBubblePassive = -1; + g_esSurvivor[iPos].g_flShockwaveRadiusPassive = -1.0; + g_esSurvivor[iPos].g_flShoveDamagePassive = -1.0; + g_esSurvivor[iPos].g_iShovePenaltyPassive = -1; + g_esSurvivor[iPos].g_flShoveRatePassive = -1.0; + g_esSurvivor[iPos].g_flSledgehammerRoundsPassive = -1.0; + g_esSurvivor[iPos].g_iSpecialAmmoPassive = -1; + g_esSurvivor[iPos].g_flSpeedBoostPassive = -1.0; + g_esSurvivor[iPos].g_flSupplierPassive = -1.0; + g_esSurvivor[iPos].g_iStickyGrenadesPassive = -1; + g_esSurvivor[iPos].g_flSwingRatePassive = -1.0; + g_esSurvivor[iPos].g_iSyringeDartsPassive = -1; + g_esSurvivor[iPos].g_iThornsPassive = -1; } } for (int iIndex = 0; iIndex <= MT_MAXTYPES; iIndex++) { +#if defined _WeaponHandling_included + g_esWeapon[iIndex].g_iPassiveEnabled = -2; + g_esWeapon[iIndex].g_iPassiveBots = -2; + g_esWeapon[iIndex].g_iPassiveNotify = -1; + g_esWeapon[iIndex].g_flActionDurationPassive = -1.0; + g_esWeapon[iIndex].g_flAdrenalineTimePassive = -1.0; + g_esWeapon[iIndex].g_iAmmoBoostPassive = -1; + g_esWeapon[iIndex].g_iAmmoRefillPassive = -1; + g_esWeapon[iIndex].g_iAmmoRegenPassive = -1; + g_esWeapon[iIndex].g_flAttackBoostPassive = -1.0; + g_esWeapon[iIndex].g_iBlazeHealthPassive = -1; + g_esWeapon[iIndex].g_iBloodDonorPassive = -1; + g_esWeapon[iIndex].g_iBunnyHopPassive = -1; + g_esWeapon[iIndex].g_iBurstDoorsPassive = -1; + g_esWeapon[iIndex].g_iCleanKillsPassive = -1; + g_esWeapon[iIndex].g_iClusterBombsPassive = -1; + g_esWeapon[iIndex].g_flDamageBoostPassive = -1.0; + g_esWeapon[iIndex].g_flDamageResistancePassive = -1.0; + g_esWeapon[iIndex].g_flDopamineRadiusPassive = -1.0; + g_esWeapon[iIndex].g_iEternalFlamesPassive = -1; + g_esWeapon[iIndex].g_iFastRecoveryPassive = -1; + g_esWeapon[iIndex].g_flFireRatePassive = -1.0; + g_esWeapon[iIndex].g_iFriendlyFirePassive = -1; + g_esWeapon[iIndex].g_iGhostBulletsPassive = -1; + g_esWeapon[iIndex].g_flGrenadeLauncherPassive = -1.0; + g_esWeapon[iIndex].g_flHealPercentPassive = -1.0; + g_esWeapon[iIndex].g_flHealthcareRadiusPassive = -1.0; + g_esWeapon[iIndex].g_iHealthRegenPassive = -1; + g_esWeapon[iIndex].g_flHeartbeatPassive = -1.0; + g_esWeapon[iIndex].g_flHollowpointAmmoPassive = -1.0; + g_esWeapon[iIndex].g_iInfiniteAmmoPassive = -1; + g_esWeapon[iIndex].g_sItemPassive[0] = '\0'; + g_esWeapon[iIndex].g_flJumpHeightPassive = -1.0; + g_esWeapon[iIndex].g_iLadderActionsPassive = -1; + g_esWeapon[iIndex].g_flLadyKillerPassive = -1.0; + g_esWeapon[iIndex].g_iLaserSightPassive = -1; + g_esWeapon[iIndex].g_iLifeLeechPassive = -1; + g_esWeapon[iIndex].g_flLuckyBulletPassive = -1.0; + g_esWeapon[iIndex].g_iMedicalCutsPassive = -1; + g_esWeapon[iIndex].g_iMeleeRangePassive = -1; + g_esWeapon[iIndex].g_iMidairDashesPassive = -1; + g_esWeapon[iIndex].g_flMotivationRadiusPassive = -1.0; + g_esWeapon[iIndex].g_flOverdoseRadiusPassive = -1.0; + g_esWeapon[iIndex].g_iOverhealthPassive = -1; + g_esWeapon[iIndex].g_flPipeBombDurationPassive = -1.0; + g_esWeapon[iIndex].g_flPunchResistancePassive = -1.0; + g_esWeapon[iIndex].g_flRapidPistolPassive = -1.0; + g_esWeapon[iIndex].g_iRecoilDampenerPassive = -1; + g_esWeapon[iIndex].g_flRefillPercentPassive = -1.0; + g_esWeapon[iIndex].g_iRegenBurstsPassive = -1; + g_esWeapon[iIndex].g_flReloadRatePassive = -1.0; + g_esWeapon[iIndex].g_iRespawnLoadoutPassive = -1; + g_esWeapon[iIndex].g_iReviveHealthPassive = -1; + g_esWeapon[iIndex].g_iRiotGearPassive = -1; + g_esWeapon[iIndex].g_iSafetyBubblePassive = -1; + g_esWeapon[iIndex].g_flShockwaveRadiusPassive = -1.0; + g_esWeapon[iIndex].g_flShoveDamagePassive = -1.0; + g_esWeapon[iIndex].g_iShovePenaltyPassive = -1; + g_esWeapon[iIndex].g_flShoveRatePassive = -1.0; + g_esWeapon[iIndex].g_flSledgehammerRoundsPassive = -1.0; + g_esWeapon[iIndex].g_iSpecialAmmoPassive = -1; + g_esWeapon[iIndex].g_flSpeedBoostPassive = -1.0; + g_esWeapon[iIndex].g_iStackPassives = -2; + g_esWeapon[iIndex].g_iStickyGrenadesPassive = -1; + g_esWeapon[iIndex].g_flSupplierPassive = -1.0; + g_esWeapon[iIndex].g_flSwingRatePassive = -1.0; + g_esWeapon[iIndex].g_iSyringeDartsPassive = -1; + g_esWeapon[iIndex].g_iThornsPassive = -1; + g_esWeapon[iIndex].g_iWeaponCharacter = -1; + g_esWeapon[iIndex].g_iWeaponIndex = -1; + g_esWeapon[iIndex].g_sWeaponName[0] = '\0'; +#endif g_esTank[iIndex].g_bDuplicateType[0] = false; g_esTank[iIndex].g_bDuplicateType[1] = false; g_esTank[iIndex].g_bRecordedType[0] = false; @@ -20116,10 +25853,11 @@ void SMCParseStart_Main(SMCParser smc) g_esTank[iIndex].g_sPropTankColor = "255,255,255,255"; g_esTank[iIndex].g_sRockColor = "255,255,255,255"; g_esTank[iIndex].g_sTireColor = "255,255,255,255"; + g_esTank[iIndex].g_sTankClass[0] = '\0'; g_esTank[iIndex].g_sTankName = "Tank"; g_esTank[iIndex].g_iTankEnabled = -1; g_esTank[iIndex].g_iGameType = 0; - g_esTank[iIndex].g_flTankChance = 100.0; + g_esTank[iIndex].g_flTankChance = 0.0; g_esTank[iIndex].g_iTankNote = 0; g_esTank[iIndex].g_iTankModel = 0; g_esTank[iIndex].g_flBurnDuration = 0.0; @@ -20174,6 +25912,15 @@ void SMCParseStart_Main(SMCParser smc) g_esTank[iIndex].g_iDisplayHealth = -1; g_esTank[iIndex].g_iDisplayHealthType = -1; g_esTank[iIndex].g_iExtraHealth = -1; + g_esTank[iIndex].g_sArmorCharacters[0] = '\0'; + g_esTank[iIndex].g_flArmorPercentage = -1.0; + g_esTank[iIndex].g_flArmorResistance[0] = -1.0; + g_esTank[iIndex].g_sShieldCharacters[0] = '\0'; + g_esTank[iIndex].g_flShieldPercentage = -1.0; + g_esTank[iIndex].g_flShieldRate = -1.0; + g_esTank[iIndex].g_flPassiveDelay = -1.0; + g_esTank[iIndex].g_iPassiveHealth = -1; + g_esTank[iIndex].g_flPassiveInterval = -1.0; g_esTank[iIndex].g_sHealthCharacters[0] = '\0'; g_esTank[iIndex].g_flHealPercentMultiplier = -1.0; g_esTank[iIndex].g_iHumanMultiplierMode = -1; @@ -20181,7 +25928,7 @@ void SMCParseStart_Main(SMCParser smc) g_esTank[iIndex].g_iMultiplyHealth = -1; g_esTank[iIndex].g_iSpawnProtection = -1; g_esTank[iIndex].g_flArmorDuration = -1.0; - g_esTank[iIndex].g_flArmorResistance = -1.0; + g_esTank[iIndex].g_flArmorResistance[1] = -1.0; g_esTank[iIndex].g_flShieldDuration = -1.0; g_esTank[iIndex].g_flShieldResistance = -1.0; g_esTank[iIndex].g_iHumanSupport = 0; @@ -20208,11 +25955,12 @@ void SMCParseStart_Main(SMCParser smc) g_esTank[iIndex].g_flTransformDelay = 10.0; g_esTank[iIndex].g_flTransformDuration = 10.0; g_esTank[iIndex].g_iSpawnType = 0; - g_esTank[iIndex].g_iPropsAttached = g_bSecondGame ? 510 : 462; + g_esTank[iIndex].g_iPropsAttached = (g_bSecondGame ? 510 : 462); g_esTank[iIndex].g_iBodyEffects = 0; g_esTank[iIndex].g_iRockEffects = 0; g_esTank[iIndex].g_iRockModel = 2; g_esTank[iIndex].g_flAttackInterval = -1.0; + g_esTank[iIndex].g_iAutoHop = -1; g_esTank[iIndex].g_flClawDamage = -2.0; g_esTank[iIndex].g_iFootstepShake = -1; g_esTank[iIndex].g_iGroundPound = -1; @@ -20254,32 +26002,45 @@ void SMCParseStart_Main(SMCParser smc) g_esTank[iIndex].g_flRewardPercentage[iPos] = -1.0; g_esTank[iIndex].g_iRewardVisual[iPos] = -1; g_esTank[iIndex].g_flActionDurationReward[iPos] = -1.0; + g_esTank[iIndex].g_flAdrenalineTimeReward[iPos] = -1.0; g_esTank[iIndex].g_iAmmoBoostReward[iPos] = -1; + g_esTank[iIndex].g_iAmmoRefillReward[iPos] = -1; g_esTank[iIndex].g_iAmmoRegenReward[iPos] = -1; g_esTank[iIndex].g_flAttackBoostReward[iPos] = -1.0; g_esTank[iIndex].g_iBlazeHealthReward[iPos] = -1; + g_esTank[iIndex].g_iBloodDonorReward[iPos] = -1; g_esTank[iIndex].g_iBunnyHopReward[iPos] = -1; g_esTank[iIndex].g_iBurstDoorsReward[iPos] = -1; g_esTank[iIndex].g_iCleanKillsReward[iPos] = -1; g_esTank[iIndex].g_iClusterBombsReward[iPos] = -1; g_esTank[iIndex].g_flDamageBoostReward[iPos] = -1.0; g_esTank[iIndex].g_flDamageResistanceReward[iPos] = -1.0; + g_esTank[iIndex].g_flDopamineRadiusReward[iPos] = -1.0; + g_esTank[iIndex].g_iEternalFlamesReward[iPos] = -1; + g_esTank[iIndex].g_iFastRecoveryReward[iPos] = -1; + g_esTank[iIndex].g_flFireRateReward[iPos] = -1.0; g_esTank[iIndex].g_iFriendlyFireReward[iPos] = -1; g_esTank[iIndex].g_iGhostBulletsReward[iPos] = -1; + g_esTank[iIndex].g_flGrenadeLauncherReward[iPos] = -1.0; g_esTank[iIndex].g_flHealPercentReward[iPos] = -1.0; + g_esTank[iIndex].g_flHealthcareRadiusReward[iPos] = -1.0; g_esTank[iIndex].g_iHealthRegenReward[iPos] = -1; - g_esTank[iIndex].g_iHollowpointAmmoReward[iPos] = -1; - g_esTank[iIndex].g_flJumpHeightReward[iPos] = -1.0; - g_esTank[iIndex].g_iInextinguishableFireReward[iPos] = -1; + g_esTank[iIndex].g_flHeartbeatReward[iPos] = -1.0; + g_esTank[iIndex].g_flHollowpointAmmoReward[iPos] = -1.0; g_esTank[iIndex].g_iInfiniteAmmoReward[iPos] = -1; + g_esTank[iIndex].g_flJumpHeightReward[iPos] = -1.0; g_esTank[iIndex].g_iLadderActionsReward[iPos] = -1; - g_esTank[iIndex].g_iLadyKillerReward[iPos] = -1; + g_esTank[iIndex].g_flLadyKillerReward[iPos] = -1.0; g_esTank[iIndex].g_iLaserSightReward[iPos] = -1; g_esTank[iIndex].g_iLifeLeechReward[iPos] = -1; g_esTank[iIndex].g_flLoopingVoicelineInterval[iPos] = -1.0; + g_esTank[iIndex].g_flLuckyBulletReward[iPos] = -1.0; g_esTank[iIndex].g_iMedicalCutsReward[iPos] = -1; g_esTank[iIndex].g_iMeleeRangeReward[iPos] = -1; g_esTank[iIndex].g_iMidairDashesReward[iPos] = -1; + g_esTank[iIndex].g_flMotivationRadiusReward[iPos] = -1.0; + g_esTank[iIndex].g_flOverdoseRadiusReward[iPos] = -1.0; + g_esTank[iIndex].g_iOverhealthReward[iPos] = -1; g_esTank[iIndex].g_iParticleEffectVisual[iPos] = -1; g_esTank[iIndex].g_flPipeBombDurationReward[iPos] = -1.0; g_esTank[iIndex].g_iPrefsNotify[iPos] = -1; @@ -20288,17 +26049,23 @@ void SMCParseStart_Main(SMCParser smc) g_esTank[iIndex].g_iRecoilDampenerReward[iPos] = -1; g_esTank[iIndex].g_flRefillPercentReward[iPos] = -1.0; g_esTank[iIndex].g_iRegenBurstsReward[iPos] = -1; + g_esTank[iIndex].g_flReloadRateReward[iPos] = -1.0; g_esTank[iIndex].g_iRespawnLoadoutReward[iPos] = -1; g_esTank[iIndex].g_iReviveHealthReward[iPos] = -1; + g_esTank[iIndex].g_iRiotGearReward[iPos] = -1; + g_esTank[iIndex].g_iSafetyBubbleReward[iPos] = -1; g_esTank[iIndex].g_iShareRewards[iPos] = -1; + g_esTank[iIndex].g_flShockwaveRadiusReward[iPos] = -1.0; g_esTank[iIndex].g_flShoveDamageReward[iPos] = -1.0; g_esTank[iIndex].g_iShovePenaltyReward[iPos] = -1; g_esTank[iIndex].g_flShoveRateReward[iPos] = -1.0; - g_esTank[iIndex].g_iSledgehammerRoundsReward[iPos] = -1; + g_esTank[iIndex].g_flSledgehammerRoundsReward[iPos] = -1.0; g_esTank[iIndex].g_iSpecialAmmoReward[iPos] = -1; g_esTank[iIndex].g_flSpeedBoostReward[iPos] = -1.0; g_esTank[iIndex].g_iStackRewards[iPos] = -1; g_esTank[iIndex].g_iStickyGrenadesReward[iPos] = -1; + g_esTank[iIndex].g_flSupplierReward[iPos] = -1.0; + g_esTank[iIndex].g_flSwingRateReward[iPos] = -1.0; g_esTank[iIndex].g_iSyringeDartsReward[iPos] = -1; g_esTank[iIndex].g_iThornsReward[iPos] = -1; g_esTank[iIndex].g_iUsefulRewards[iPos] = -1; @@ -20333,6 +26100,7 @@ void SMCParseStart_Main(SMCParser smc) if (iPos < (sizeof esTank::g_flComboTypeChance)) { g_esTank[iIndex].g_flComboTypeChance[iPos] = 0.0; + g_esTank[iIndex].g_flBodyChance[iPos] = 100.0; } if (iPos < (sizeof esTank::g_flPropsChance)) @@ -20342,6 +26110,7 @@ void SMCParseStart_Main(SMCParser smc) if (iPos < (sizeof esTank::g_iSkinColor)) { + g_esTank[iIndex].g_flRockChance[iPos] = 100.0; g_esTank[iIndex].g_iSkinColor[iPos] = 255; g_esTank[iIndex].g_iBossHealth[iPos] = 5000 / (iPos + 1); g_esTank[iIndex].g_iBossType[iPos] = (iPos + 2); @@ -20361,14 +26130,20 @@ void SMCParseStart_Main(SMCParser smc) } } + g_esSpecial[iIndex].g_sBoomerClass[0] = '\0'; g_esSpecial[iIndex].g_sBoomerName = MT_CONFIG_SECTION_BOOMER; + g_esSpecial[iIndex].g_sChargerClass[0] = '\0'; g_esSpecial[iIndex].g_sChargerName = MT_CONFIG_SECTION_CHARGER; g_esSpecial[iIndex].g_sGlowColor[0] = '\0'; + g_esSpecial[iIndex].g_sHunterClass[0] = '\0'; g_esSpecial[iIndex].g_sHunterName = MT_CONFIG_SECTION_HUNTER; + g_esSpecial[iIndex].g_sJockeyClass[0] = '\0'; g_esSpecial[iIndex].g_sJockeyName = MT_CONFIG_SECTION_JOCKEY; g_esSpecial[iIndex].g_sRockColor[0] = '\0'; g_esSpecial[iIndex].g_sSkinColor[0] = '\0'; + g_esSpecial[iIndex].g_sSmokerClass[0] = '\0'; g_esSpecial[iIndex].g_sSmokerName = MT_CONFIG_SECTION_SMOKER; + g_esSpecial[iIndex].g_sSpitterClass[0] = '\0'; g_esSpecial[iIndex].g_sSpitterName = MT_CONFIG_SECTION_SPITTER; g_esSpecial[iIndex].g_iSpecialTypes = -1; g_esSpecial[iIndex].g_iGameType = -1; @@ -20393,6 +26168,15 @@ void SMCParseStart_Main(SMCParser smc) g_esSpecial[iIndex].g_iVocalizeDeath = -1; g_esSpecial[iIndex].g_iDisplayHealth = -1; g_esSpecial[iIndex].g_iDisplayHealthType = -1; + g_esSpecial[iIndex].g_sArmorCharacters[0] = '\0'; + g_esSpecial[iIndex].g_flArmorPercentage = -1.0; + g_esSpecial[iIndex].g_flArmorResistance[0] = -1.0; + g_esSpecial[iIndex].g_sShieldCharacters[0] = '\0'; + g_esSpecial[iIndex].g_flShieldPercentage = -1.0; + g_esSpecial[iIndex].g_flShieldRate = -1.0; + g_esSpecial[iIndex].g_flPassiveDelay = -1.0; + g_esSpecial[iIndex].g_iPassiveHealth = -1; + g_esSpecial[iIndex].g_flPassiveInterval = -1.0; g_esSpecial[iIndex].g_sHealthCharacters[0] = '\0'; g_esSpecial[iIndex].g_flHealPercentMultiplier = -1.0; g_esSpecial[iIndex].g_iHumanMultiplierMode = -1; @@ -20400,7 +26184,7 @@ void SMCParseStart_Main(SMCParser smc) g_esSpecial[iIndex].g_iMultiplyHealth = -1; g_esSpecial[iIndex].g_iSpawnProtection = -1; g_esSpecial[iIndex].g_flArmorDuration = -1.0; - g_esSpecial[iIndex].g_flArmorResistance = -1.0; + g_esSpecial[iIndex].g_flArmorResistance[1] = -1.0; g_esSpecial[iIndex].g_flShieldDuration = -1.0; g_esSpecial[iIndex].g_flShieldResistance = -1.0; g_esSpecial[iIndex].g_iHumanSupport = -1; @@ -20429,6 +26213,7 @@ void SMCParseStart_Main(SMCParser smc) g_esSpecial[iIndex].g_iRockEffects = -1; g_esSpecial[iIndex].g_iRockModel = -1; g_esSpecial[iIndex].g_flAttackInterval = -1.0; + g_esSpecial[iIndex].g_iAutoHop = -1; g_esSpecial[iIndex].g_flClawDamage = -2.0; g_esSpecial[iIndex].g_flHittableDamage = -2.0; g_esSpecial[iIndex].g_flIncapDamageMultiplier = -1.0; @@ -20445,6 +26230,32 @@ void SMCParseStart_Main(SMCParser smc) g_esSpecial[iIndex].g_iHittableImmunity = -1; g_esSpecial[iIndex].g_iMeleeImmunity = -1; g_esSpecial[iIndex].g_iVomitImmunity = -1; + g_esHorde[iIndex].g_iMobVariants = -1; + g_esHorde[iIndex].g_flCommonBioChance = -1.0; + g_esHorde[iIndex].g_flCommonChance = -1.0; + g_esHorde[iIndex].g_flCommonDamagePoints = -1.0; + g_esHorde[iIndex].g_flCommonDeathPoints = -1.0; + g_esHorde[iIndex].g_flCommonGoal = -1.0; + g_esHorde[iIndex].g_sCommonName = MT_CONFIG_SECTION_COMMON; + g_esHorde[iIndex].g_iCommonVariant = -1; + g_esHorde[iIndex].g_flWitchChance = -1.0; + g_esHorde[iIndex].g_iWitchFilter = -1; + g_esHorde[iIndex].g_iWitchMode = -1; + g_esHorde[iIndex].g_flWitchMutateChance = -1.0; + g_esHorde[iIndex].g_sWitchName = MT_CONFIG_SECTION_WITCH; + g_esHorde[iIndex].g_flWitchRange = -1.0; + g_esHorde[iIndex].g_iWitchTypes = -1; + g_esHorde[iIndex].g_sGlowColor[0] = '\0'; + g_esHorde[iIndex].g_sSkinColor[0] = '\0'; + g_esHorde[iIndex].g_iDisplayHealth = -1; + g_esHorde[iIndex].g_iDisplayHealthType = -1; + g_esHorde[iIndex].g_sHealthCharacters[0] = '\0'; + g_esHorde[iIndex].g_iGlowEnabled = -1; + g_esHorde[iIndex].g_iGlowFlashing = -1; + g_esHorde[iIndex].g_iGlowMinRange = -1; + g_esHorde[iIndex].g_iGlowMaxRange = -1; + g_esHorde[iIndex].g_iGlowType = -1; + g_esHorde[iIndex].g_iBodyEffects = -1; for (int iPos = 0; iPos < (sizeof esSpecial::g_iTransformType); iPos++) { @@ -20467,32 +26278,45 @@ void SMCParseStart_Main(SMCParser smc) g_esSpecial[iIndex].g_flRewardPercentage[iPos] = -1.0; g_esSpecial[iIndex].g_iRewardVisual[iPos] = -1; g_esSpecial[iIndex].g_flActionDurationReward[iPos] = -1.0; + g_esSpecial[iIndex].g_flAdrenalineTimeReward[iPos] = -1.0; g_esSpecial[iIndex].g_iAmmoBoostReward[iPos] = -1; + g_esSpecial[iIndex].g_iAmmoRefillReward[iPos] = -1; g_esSpecial[iIndex].g_iAmmoRegenReward[iPos] = -1; g_esSpecial[iIndex].g_flAttackBoostReward[iPos] = -1.0; g_esSpecial[iIndex].g_iBlazeHealthReward[iPos] = -1; + g_esSpecial[iIndex].g_iBloodDonorReward[iPos] = -1; g_esSpecial[iIndex].g_iBunnyHopReward[iPos] = -1; g_esSpecial[iIndex].g_iBurstDoorsReward[iPos] = -1; g_esSpecial[iIndex].g_iCleanKillsReward[iPos] = -1; g_esSpecial[iIndex].g_iClusterBombsReward[iPos] = -1; g_esSpecial[iIndex].g_flDamageBoostReward[iPos] = -1.0; g_esSpecial[iIndex].g_flDamageResistanceReward[iPos] = -1.0; + g_esSpecial[iIndex].g_flDopamineRadiusReward[iPos] = -1.0; + g_esSpecial[iIndex].g_iEternalFlamesReward[iPos] = -1; + g_esSpecial[iIndex].g_iFastRecoveryReward[iPos] = -1; + g_esSpecial[iIndex].g_flFireRateReward[iPos] = -1.0; g_esSpecial[iIndex].g_iFriendlyFireReward[iPos] = -1; g_esSpecial[iIndex].g_iGhostBulletsReward[iPos] = -1; + g_esSpecial[iIndex].g_flGrenadeLauncherReward[iPos] = -1.0; g_esSpecial[iIndex].g_flHealPercentReward[iPos] = -1.0; + g_esSpecial[iIndex].g_flHealthcareRadiusReward[iPos] = -1.0; g_esSpecial[iIndex].g_iHealthRegenReward[iPos] = -1; - g_esSpecial[iIndex].g_iHollowpointAmmoReward[iPos] = -1; - g_esSpecial[iIndex].g_flJumpHeightReward[iPos] = -1.0; - g_esSpecial[iIndex].g_iInextinguishableFireReward[iPos] = -1; + g_esSpecial[iIndex].g_flHeartbeatReward[iPos] = -1.0; + g_esSpecial[iIndex].g_flHollowpointAmmoReward[iPos] = -1.0; g_esSpecial[iIndex].g_iInfiniteAmmoReward[iPos] = -1; + g_esSpecial[iIndex].g_flJumpHeightReward[iPos] = -1.0; g_esSpecial[iIndex].g_iLadderActionsReward[iPos] = -1; - g_esSpecial[iIndex].g_iLadyKillerReward[iPos] = -1; + g_esSpecial[iIndex].g_flLadyKillerReward[iPos] = -1.0; g_esSpecial[iIndex].g_iLaserSightReward[iPos] = -1; g_esSpecial[iIndex].g_iLifeLeechReward[iPos] = -1; g_esSpecial[iIndex].g_flLoopingVoicelineInterval[iPos] = -1.0; + g_esSpecial[iIndex].g_flLuckyBulletReward[iPos] = -1.0; g_esSpecial[iIndex].g_iMedicalCutsReward[iPos] = -1; g_esSpecial[iIndex].g_iMeleeRangeReward[iPos] = -1; g_esSpecial[iIndex].g_iMidairDashesReward[iPos] = -1; + g_esSpecial[iIndex].g_flMotivationRadiusReward[iPos] = -1.0; + g_esSpecial[iIndex].g_flOverdoseRadiusReward[iPos] = -1.0; + g_esSpecial[iIndex].g_iOverhealthReward[iPos] = -1; g_esSpecial[iIndex].g_iParticleEffectVisual[iPos] = -1; g_esSpecial[iIndex].g_flPipeBombDurationReward[iPos] = -1.0; g_esSpecial[iIndex].g_iPrefsNotify[iPos] = -1; @@ -20501,17 +26325,23 @@ void SMCParseStart_Main(SMCParser smc) g_esSpecial[iIndex].g_iRecoilDampenerReward[iPos] = -1; g_esSpecial[iIndex].g_flRefillPercentReward[iPos] = -1.0; g_esSpecial[iIndex].g_iRegenBurstsReward[iPos] = -1; + g_esSpecial[iIndex].g_flReloadRateReward[iPos] = -1.0; g_esSpecial[iIndex].g_iRespawnLoadoutReward[iPos] = -1; g_esSpecial[iIndex].g_iReviveHealthReward[iPos] = -1; + g_esSpecial[iIndex].g_iRiotGearReward[iPos] = -1; + g_esSpecial[iIndex].g_iSafetyBubbleReward[iPos] = -1; g_esSpecial[iIndex].g_iShareRewards[iPos] = -1; + g_esSpecial[iIndex].g_flShockwaveRadiusReward[iPos] = -1.0; g_esSpecial[iIndex].g_flShoveDamageReward[iPos] = -1.0; g_esSpecial[iIndex].g_iShovePenaltyReward[iPos] = -1; g_esSpecial[iIndex].g_flShoveRateReward[iPos] = -1.0; - g_esSpecial[iIndex].g_iSledgehammerRoundsReward[iPos] = -1; + g_esSpecial[iIndex].g_flSledgehammerRoundsReward[iPos] = -1.0; g_esSpecial[iIndex].g_iSpecialAmmoReward[iPos] = -1; g_esSpecial[iIndex].g_flSpeedBoostReward[iPos] = -1.0; g_esSpecial[iIndex].g_iStackRewards[iPos] = -1; g_esSpecial[iIndex].g_iStickyGrenadesReward[iPos] = -1; + g_esSpecial[iIndex].g_flSupplierReward[iPos] = -1.0; + g_esSpecial[iIndex].g_flSwingRateReward[iPos] = -1.0; g_esSpecial[iIndex].g_iSyringeDartsReward[iPos] = -1; g_esSpecial[iIndex].g_iThornsReward[iPos] = -1; g_esSpecial[iIndex].g_iUsefulRewards[iPos] = -1; @@ -20546,19 +26376,24 @@ void SMCParseStart_Main(SMCParser smc) if (iPos < (sizeof esSpecial::g_flComboTypeChance)) { g_esSpecial[iIndex].g_flComboTypeChance[iPos] = -1.0; + g_esSpecial[iIndex].g_flBodyChance[iPos] = -1.0; + g_esHorde[iIndex].g_flBodyChance[iPos] = -1.0; } if (iPos < (sizeof esSpecial::g_iSkinColor)) { + g_esSpecial[iIndex].g_flRockChance[iPos] = -1.0; g_esSpecial[iIndex].g_iSkinColor[iPos] = -1; g_esSpecial[iIndex].g_iBossHealth[iPos] = -1; g_esSpecial[iIndex].g_iBossType[iPos] = -1; g_esSpecial[iIndex].g_iRockColor[iPos] = -1; + g_esHorde[iIndex].g_iSkinColor[iPos] = -1; } if (iPos < (sizeof esSpecial::g_iGlowColor)) { g_esSpecial[iIndex].g_iGlowColor[iPos] = -1; + g_esHorde[iIndex].g_iGlowColor[iPos] = -1; } } } @@ -20576,10 +26411,10 @@ void SMCParseStart_Main(SMCParser smc) g_esPlayer[iPlayer].g_sRockColor[0] = '\0'; g_esPlayer[iPlayer].g_sTireColor[0] = '\0'; g_esPlayer[iPlayer].g_sTankName[0] = '\0'; + g_esPlayer[iPlayer].g_iTankNote = -1; g_esPlayer[iPlayer].g_iTankModel = -1; g_esPlayer[iPlayer].g_flBurnDuration = -1.0; g_esPlayer[iPlayer].g_flBurntSkin = -2.0; - g_esPlayer[iPlayer].g_iTankNote = -1; g_esPlayer[iPlayer].g_iCheckAbilities = -1; g_esPlayer[iPlayer].g_iDeathRevert = -1; g_esPlayer[iPlayer].g_iAnnounceArrival = -1; @@ -20626,6 +26461,15 @@ void SMCParseStart_Main(SMCParser smc) g_esPlayer[iPlayer].g_iDisplayHealth = -1; g_esPlayer[iPlayer].g_iDisplayHealthType = -1; g_esPlayer[iPlayer].g_iExtraHealth = -1; + g_esPlayer[iPlayer].g_sArmorCharacters[0] = '\0'; + g_esPlayer[iPlayer].g_flArmorPercentage = -1.0; + g_esPlayer[iPlayer].g_flArmorResistance[0] = -1.0; + g_esPlayer[iPlayer].g_sShieldCharacters[0] = '\0'; + g_esPlayer[iPlayer].g_flShieldPercentage = -1.0; + g_esPlayer[iPlayer].g_flShieldRate = -1.0; + g_esPlayer[iPlayer].g_flPassiveDelay = -1.0; + g_esPlayer[iPlayer].g_iPassiveHealth = -1; + g_esPlayer[iPlayer].g_flPassiveInterval = -1.0; g_esPlayer[iPlayer].g_sHealthCharacters[0] = '\0'; g_esPlayer[iPlayer].g_flHealPercentMultiplier = -1.0; g_esPlayer[iPlayer].g_iHumanMultiplierMode = -1; @@ -20633,7 +26477,7 @@ void SMCParseStart_Main(SMCParser smc) g_esPlayer[iPlayer].g_iMultiplyHealth = -1; g_esPlayer[iPlayer].g_iSpawnProtection = -1; g_esPlayer[iPlayer].g_flArmorDuration = -1.0; - g_esPlayer[iPlayer].g_flArmorResistance = -1.0; + g_esPlayer[iPlayer].g_flArmorResistance[1] = -1.0; g_esPlayer[iPlayer].g_flShieldDuration = -1.0; g_esPlayer[iPlayer].g_flShieldResistance = -1.0; g_esPlayer[iPlayer].g_iGlowEnabled = -1; @@ -20658,6 +26502,7 @@ void SMCParseStart_Main(SMCParser smc) g_esPlayer[iPlayer].g_iRockEffects = -1; g_esPlayer[iPlayer].g_iRockModel = -1; g_esPlayer[iPlayer].g_flAttackInterval = -1.0; + g_esPlayer[iPlayer].g_iAutoHop = -1; g_esPlayer[iPlayer].g_flClawDamage = -2.0; g_esPlayer[iPlayer].g_iFootstepShake = -1; g_esPlayer[iPlayer].g_iGroundPound = -1; @@ -20699,32 +26544,45 @@ void SMCParseStart_Main(SMCParser smc) g_esPlayer[iPlayer].g_flRewardPercentage[iPos] = -1.0; g_esPlayer[iPlayer].g_iRewardVisual[iPos] = -1; g_esPlayer[iPlayer].g_flActionDurationReward[iPos] = -1.0; + g_esPlayer[iPlayer].g_flAdrenalineTimeReward[iPos] = -1.0; g_esPlayer[iPlayer].g_iAmmoBoostReward[iPos] = -1; + g_esPlayer[iPlayer].g_iAmmoRefillReward[iPos] = -1; g_esPlayer[iPlayer].g_iAmmoRegenReward[iPos] = -1; g_esPlayer[iPlayer].g_flAttackBoostReward[iPos] = -1.0; g_esPlayer[iPlayer].g_iBlazeHealthReward[iPos] = -1; + g_esPlayer[iPlayer].g_iBloodDonorReward[iPos] = -1; g_esPlayer[iPlayer].g_iBunnyHopReward[iPos] = -1; g_esPlayer[iPlayer].g_iBurstDoorsReward[iPos] = -1; g_esPlayer[iPlayer].g_iCleanKillsReward[iPos] = -1; g_esPlayer[iPlayer].g_iClusterBombsReward[iPos] = -1; g_esPlayer[iPlayer].g_flDamageBoostReward[iPos] = -1.0; g_esPlayer[iPlayer].g_flDamageResistanceReward[iPos] = -1.0; + g_esPlayer[iPlayer].g_flDopamineRadiusReward[iPos] = -1.0; + g_esPlayer[iPlayer].g_iEternalFlamesReward[iPos] = -1; + g_esPlayer[iPlayer].g_iFastRecoveryReward[iPos] = -1; + g_esPlayer[iPlayer].g_flFireRateReward[iPos] = -1.0; g_esPlayer[iPlayer].g_iFriendlyFireReward[iPos] = -1; g_esPlayer[iPlayer].g_iGhostBulletsReward[iPos] = -1; + g_esPlayer[iPlayer].g_flGrenadeLauncherReward[iPos] = -1.0; g_esPlayer[iPlayer].g_flHealPercentReward[iPos] = -1.0; + g_esPlayer[iPlayer].g_flHealthcareRadiusReward[iPos] = -1.0; g_esPlayer[iPlayer].g_iHealthRegenReward[iPos] = -1; - g_esPlayer[iPlayer].g_iHollowpointAmmoReward[iPos] = -1; - g_esPlayer[iPlayer].g_flJumpHeightReward[iPos] = -1.0; - g_esPlayer[iPlayer].g_iInextinguishableFireReward[iPos] = -1; + g_esPlayer[iPlayer].g_flHeartbeatReward[iPos] = -1.0; + g_esPlayer[iPlayer].g_flHollowpointAmmoReward[iPos] = -1.0; g_esPlayer[iPlayer].g_iInfiniteAmmoReward[iPos] = -1; + g_esPlayer[iPlayer].g_flJumpHeightReward[iPos] = -1.0; g_esPlayer[iPlayer].g_iLadderActionsReward[iPos] = -1; - g_esPlayer[iPlayer].g_iLadyKillerReward[iPos] = -1; + g_esPlayer[iPlayer].g_flLadyKillerReward[iPos] = -1.0; g_esPlayer[iPlayer].g_iLaserSightReward[iPos] = -1; g_esPlayer[iPlayer].g_iLifeLeechReward[iPos] = -1; g_esPlayer[iPlayer].g_flLoopingVoicelineInterval[iPos] = -1.0; + g_esPlayer[iPlayer].g_flLuckyBulletReward[iPos] = -1.0; g_esPlayer[iPlayer].g_iMedicalCutsReward[iPos] = -1; g_esPlayer[iPlayer].g_iMeleeRangeReward[iPos] = -1; g_esPlayer[iPlayer].g_iMidairDashesReward[iPos] = -1; + g_esPlayer[iPlayer].g_flMotivationRadiusReward[iPos] = -1.0; + g_esPlayer[iPlayer].g_flOverdoseRadiusReward[iPos] = -1.0; + g_esPlayer[iPlayer].g_iOverhealthReward[iPos] = -1; g_esPlayer[iPlayer].g_iParticleEffectVisual[iPos] = -1; g_esPlayer[iPlayer].g_flPipeBombDurationReward[iPos] = -1.0; g_esPlayer[iPlayer].g_iPrefsNotify[iPos] = -1; @@ -20733,17 +26591,23 @@ void SMCParseStart_Main(SMCParser smc) g_esPlayer[iPlayer].g_iRecoilDampenerReward[iPos] = -1; g_esPlayer[iPlayer].g_flRefillPercentReward[iPos] = -1.0; g_esPlayer[iPlayer].g_iRegenBurstsReward[iPos] = -1; + g_esPlayer[iPlayer].g_flReloadRateReward[iPos] = -1.0; g_esPlayer[iPlayer].g_iRespawnLoadoutReward[iPos] = -1; g_esPlayer[iPlayer].g_iReviveHealthReward[iPos] = -1; + g_esPlayer[iPlayer].g_iRiotGearReward[iPos] = -1; + g_esPlayer[iPlayer].g_iSafetyBubbleReward[iPos] = -1; g_esPlayer[iPlayer].g_iShareRewards[iPos] = -1; + g_esPlayer[iPlayer].g_flShockwaveRadiusReward[iPos] = -1.0; g_esPlayer[iPlayer].g_flShoveDamageReward[iPos] = -1.0; g_esPlayer[iPlayer].g_iShovePenaltyReward[iPos] = -1; g_esPlayer[iPlayer].g_flShoveRateReward[iPos] = -1.0; - g_esPlayer[iPlayer].g_iSledgehammerRoundsReward[iPos] = -1; + g_esPlayer[iPlayer].g_flSledgehammerRoundsReward[iPos] = -1.0; g_esPlayer[iPlayer].g_iSpecialAmmoReward[iPos] = -1; g_esPlayer[iPlayer].g_flSpeedBoostReward[iPos] = -1.0; g_esPlayer[iPlayer].g_iStackRewards[iPos] = -1; g_esPlayer[iPlayer].g_iStickyGrenadesReward[iPos] = -1; + g_esPlayer[iPlayer].g_flSupplierReward[iPos] = -1.0; + g_esPlayer[iPlayer].g_flSwingRateReward[iPos] = -1.0; g_esPlayer[iPlayer].g_iSyringeDartsReward[iPos] = -1; g_esPlayer[iPlayer].g_iThornsReward[iPos] = -1; g_esPlayer[iPlayer].g_iUsefulRewards[iPos] = -1; @@ -20753,6 +26617,92 @@ void SMCParseStart_Main(SMCParser smc) if (iPos < (sizeof esPlayer::g_iStackLimits)) { g_esPlayer[iPlayer].g_iStackLimits[iPos] = -1; + g_esShooter[iPlayer].g_iCarrierEnabled = -1; + g_esShooter[iPlayer].g_iCarrierBots = -1; + g_esShooter[iPlayer].g_iCarrierBody = -1; + g_esShooter[iPlayer].g_flCarrierChance = -1.0; + g_esShooter[iPlayer].g_iCarrierCleanse = -1; + g_esShooter[iPlayer].g_flCarrierDamageMultiplier = -1.0; + g_esShooter[iPlayer].g_flCarrierDelay = -1.0; + g_esShooter[iPlayer].g_iCarrierFilter = -1; + g_esShooter[iPlayer].g_flCarrierHealthMultiplier = -1.0; + g_esShooter[iPlayer].g_iCarrierInfection = -1; + g_esShooter[iPlayer].g_iCarrierMaxType = -1; + g_esShooter[iPlayer].g_iCarrierMinType = -1; + g_esShooter[iPlayer].g_iCarrierMix = -1; + g_esShooter[iPlayer].g_iCarrierMode = -1; + g_esShooter[iPlayer].g_iCarrierTeleport = -1; + g_esShooter[iPlayer].g_iCarrierVoice = -1; + g_esShooter[iPlayer].g_flCarrierVoiceChance = -1.0; + g_esShooter[iPlayer].g_flCarrierVoiceInterval = -1.0; + g_esShooter[iPlayer].g_sCarrierAttackVoicelines[0] = '\0'; + g_esShooter[iPlayer].g_sCarrierBaitVoicelines[0] = '\0'; + g_esShooter[iPlayer].g_iPassiveEnabled = -2; + g_esShooter[iPlayer].g_iPassiveBots = -2; + g_esShooter[iPlayer].g_iPassiveNotify = -1; + g_esShooter[iPlayer].g_flActionDurationPassive = -1.0; + g_esShooter[iPlayer].g_flAdrenalineTimePassive = -1.0; + g_esShooter[iPlayer].g_iAmmoBoostPassive = -1; + g_esShooter[iPlayer].g_iAmmoRefillPassive = -1; + g_esShooter[iPlayer].g_iAmmoRegenPassive = -1; + g_esShooter[iPlayer].g_flAttackBoostPassive = -1.0; + g_esShooter[iPlayer].g_iBlazeHealthPassive = -1; + g_esShooter[iPlayer].g_iBloodDonorPassive = -1; + g_esShooter[iPlayer].g_iBunnyHopPassive = -1; + g_esShooter[iPlayer].g_iBurstDoorsPassive = -1; + g_esShooter[iPlayer].g_iCleanKillsPassive = -1; + g_esShooter[iPlayer].g_iClusterBombsPassive = -1; + g_esShooter[iPlayer].g_flDamageBoostPassive = -1.0; + g_esShooter[iPlayer].g_flDamageResistancePassive = -1.0; + g_esShooter[iPlayer].g_flDopamineRadiusPassive = -1.0; + g_esShooter[iPlayer].g_iEternalFlamesPassive = -1; + g_esShooter[iPlayer].g_iFastRecoveryPassive = -1; + g_esShooter[iPlayer].g_flFireRatePassive = -1.0; + g_esShooter[iPlayer].g_iFriendlyFirePassive = -1; + g_esShooter[iPlayer].g_iGhostBulletsPassive = -1; + g_esShooter[iPlayer].g_flGrenadeLauncherPassive = -1.0; + g_esShooter[iPlayer].g_flHealPercentPassive = -1.0; + g_esShooter[iPlayer].g_flHealthcareRadiusPassive = -1.0; + g_esShooter[iPlayer].g_iHealthRegenPassive = -1; + g_esShooter[iPlayer].g_flHeartbeatPassive = -1.0; + g_esShooter[iPlayer].g_flHollowpointAmmoPassive = -1.0; + g_esShooter[iPlayer].g_iInfiniteAmmoPassive = -1; + g_esShooter[iPlayer].g_sItemPassive[0] = '\0'; + g_esShooter[iPlayer].g_flJumpHeightPassive = -1.0; + g_esShooter[iPlayer].g_iLadderActionsPassive = -1; + g_esShooter[iPlayer].g_flLadyKillerPassive = -1.0; + g_esShooter[iPlayer].g_iLaserSightPassive = -1; + g_esShooter[iPlayer].g_iLifeLeechPassive = -1; + g_esShooter[iPlayer].g_flLuckyBulletPassive = -1.0; + g_esShooter[iPlayer].g_iMedicalCutsPassive = -1; + g_esShooter[iPlayer].g_iMeleeRangePassive = -1; + g_esShooter[iPlayer].g_iMidairDashesPassive = -1; + g_esShooter[iPlayer].g_flMotivationRadiusPassive = -1.0; + g_esShooter[iPlayer].g_flOverdoseRadiusPassive = -1.0; + g_esShooter[iPlayer].g_iOverhealthPassive = -1; + g_esShooter[iPlayer].g_flPipeBombDurationPassive = -1.0; + g_esShooter[iPlayer].g_flPunchResistancePassive = -1.0; + g_esShooter[iPlayer].g_flRapidPistolPassive = -1.0; + g_esShooter[iPlayer].g_iRecoilDampenerPassive = -1; + g_esShooter[iPlayer].g_flRefillPercentPassive = -1.0; + g_esShooter[iPlayer].g_iRegenBurstsPassive = -1; + g_esShooter[iPlayer].g_flReloadRatePassive = -1.0; + g_esShooter[iPlayer].g_iRespawnLoadoutPassive = -1; + g_esShooter[iPlayer].g_iReviveHealthPassive = -1; + g_esShooter[iPlayer].g_iRiotGearPassive = -1; + g_esShooter[iPlayer].g_iSafetyBubblePassive = -1; + g_esShooter[iPlayer].g_flShockwaveRadiusPassive = -1.0; + g_esShooter[iPlayer].g_flShoveDamagePassive = -1.0; + g_esShooter[iPlayer].g_iShovePenaltyPassive = -1; + g_esShooter[iPlayer].g_flShoveRatePassive = -1.0; + g_esShooter[iPlayer].g_flSledgehammerRoundsPassive = -1.0; + g_esShooter[iPlayer].g_iSpecialAmmoPassive = -1; + g_esShooter[iPlayer].g_flSpeedBoostPassive = -1.0; + g_esShooter[iPlayer].g_iStickyGrenadesPassive = -1; + g_esShooter[iPlayer].g_flSupplierPassive = -1.0; + g_esShooter[iPlayer].g_flSwingRatePassive = -1.0; + g_esShooter[iPlayer].g_iSyringeDartsPassive = -1; + g_esShooter[iPlayer].g_iThornsPassive = -1; } if (iPos < (sizeof esPlayer::g_flComboChance)) @@ -20778,6 +26728,7 @@ void SMCParseStart_Main(SMCParser smc) if (iPos < (sizeof esPlayer::g_flComboTypeChance)) { g_esPlayer[iPlayer].g_flComboTypeChance[iPos] = -1.0; + g_esPlayer[iPlayer].g_flBodyChance[iPos] = -1.0; } if (iPos < (sizeof esPlayer::g_flPropsChance)) @@ -20787,6 +26738,7 @@ void SMCParseStart_Main(SMCParser smc) if (iPos < (sizeof esPlayer::g_iSkinColor)) { + g_esPlayer[iPlayer].g_flRockChance[iPos] = -1.0; g_esPlayer[iPlayer].g_iSkinColor[iPos] = -1; g_esPlayer[iPlayer].g_iBossHealth[iPos] = -1; g_esPlayer[iPlayer].g_iBossType[iPos] = -1; @@ -20815,10 +26767,10 @@ void SMCParseStart_Main(SMCParser smc) g_esTeammate[iPlayer].g_sSkinColor[0] = '\0'; g_esTeammate[iPlayer].g_sSmokerName[0] = '\0'; g_esTeammate[iPlayer].g_sSpitterName[0] = '\0'; + g_esTeammate[iPlayer].g_iSpecialNote = -1; g_esTeammate[iPlayer].g_iSpecialModel = -1; g_esTeammate[iPlayer].g_flBurnDuration = -1.0; g_esTeammate[iPlayer].g_flBurntSkin = -2.0; - g_esTeammate[iPlayer].g_iSpecialNote = -1; g_esTeammate[iPlayer].g_iDeathRevert = -1; g_esTeammate[iPlayer].g_iAnnounceArrival = -1; g_esTeammate[iPlayer].g_iAnnounceDeath = -1; @@ -20833,6 +26785,15 @@ void SMCParseStart_Main(SMCParser smc) g_esTeammate[iPlayer].g_iVocalizeDeath = -1; g_esTeammate[iPlayer].g_iDisplayHealth = -1; g_esTeammate[iPlayer].g_iDisplayHealthType = -1; + g_esTeammate[iPlayer].g_sArmorCharacters[0] = '\0'; + g_esTeammate[iPlayer].g_flArmorPercentage = -1.0; + g_esTeammate[iPlayer].g_flArmorResistance[0] = -1.0; + g_esTeammate[iPlayer].g_sShieldCharacters[0] = '\0'; + g_esTeammate[iPlayer].g_flShieldPercentage = -1.0; + g_esTeammate[iPlayer].g_flShieldRate = -1.0; + g_esTeammate[iPlayer].g_flPassiveDelay = -1.0; + g_esTeammate[iPlayer].g_iPassiveHealth = -1; + g_esTeammate[iPlayer].g_flPassiveInterval = -1.0; g_esTeammate[iPlayer].g_sHealthCharacters[0] = '\0'; g_esTeammate[iPlayer].g_flHealPercentMultiplier = -1.0; g_esTeammate[iPlayer].g_iHumanMultiplierMode = -1; @@ -20840,7 +26801,7 @@ void SMCParseStart_Main(SMCParser smc) g_esTeammate[iPlayer].g_iMultiplyHealth = -1; g_esTeammate[iPlayer].g_iSpawnProtection = -1; g_esTeammate[iPlayer].g_flArmorDuration = -1.0; - g_esTeammate[iPlayer].g_flArmorResistance = -1.0; + g_esTeammate[iPlayer].g_flArmorResistance[1] = -1.0; g_esTeammate[iPlayer].g_flShieldDuration = -1.0; g_esTeammate[iPlayer].g_flShieldResistance = -1.0; g_esTeammate[iPlayer].g_iGlowEnabled = -1; @@ -20861,6 +26822,7 @@ void SMCParseStart_Main(SMCParser smc) g_esTeammate[iPlayer].g_iRockEffects = -1; g_esTeammate[iPlayer].g_iRockModel = -1; g_esTeammate[iPlayer].g_flAttackInterval = -1.0; + g_esTeammate[iPlayer].g_iAutoHop = -1; g_esTeammate[iPlayer].g_flClawDamage = -2.0; g_esTeammate[iPlayer].g_flHittableDamage = -2.0; g_esTeammate[iPlayer].g_flIncapDamageMultiplier = -1.0; @@ -20899,32 +26861,45 @@ void SMCParseStart_Main(SMCParser smc) g_esTeammate[iPlayer].g_flRewardPercentage[iPos] = -1.0; g_esTeammate[iPlayer].g_iRewardVisual[iPos] = -1; g_esTeammate[iPlayer].g_flActionDurationReward[iPos] = -1.0; + g_esTeammate[iPlayer].g_flAdrenalineTimeReward[iPos] = -1.0; g_esTeammate[iPlayer].g_iAmmoBoostReward[iPos] = -1; + g_esTeammate[iPlayer].g_iAmmoRefillReward[iPos] = -1; g_esTeammate[iPlayer].g_iAmmoRegenReward[iPos] = -1; g_esTeammate[iPlayer].g_flAttackBoostReward[iPos] = -1.0; g_esTeammate[iPlayer].g_iBlazeHealthReward[iPos] = -1; + g_esTeammate[iPlayer].g_iBloodDonorReward[iPos] = -1; g_esTeammate[iPlayer].g_iBunnyHopReward[iPos] = -1; g_esTeammate[iPlayer].g_iBurstDoorsReward[iPos] = -1; g_esTeammate[iPlayer].g_iCleanKillsReward[iPos] = -1; g_esTeammate[iPlayer].g_iClusterBombsReward[iPos] = -1; g_esTeammate[iPlayer].g_flDamageBoostReward[iPos] = -1.0; g_esTeammate[iPlayer].g_flDamageResistanceReward[iPos] = -1.0; + g_esTeammate[iPlayer].g_flDopamineRadiusReward[iPos] = -1.0; + g_esTeammate[iPlayer].g_iEternalFlamesReward[iPos] = -1; + g_esTeammate[iPlayer].g_iFastRecoveryReward[iPos] = -1; + g_esTeammate[iPlayer].g_flFireRateReward[iPos] = -1.0; g_esTeammate[iPlayer].g_iFriendlyFireReward[iPos] = -1; g_esTeammate[iPlayer].g_iGhostBulletsReward[iPos] = -1; + g_esTeammate[iPlayer].g_flGrenadeLauncherReward[iPos] = -1.0; g_esTeammate[iPlayer].g_flHealPercentReward[iPos] = -1.0; + g_esTeammate[iPlayer].g_flHealthcareRadiusReward[iPos] = -1.0; g_esTeammate[iPlayer].g_iHealthRegenReward[iPos] = -1; - g_esTeammate[iPlayer].g_iHollowpointAmmoReward[iPos] = -1; - g_esTeammate[iPlayer].g_flJumpHeightReward[iPos] = -1.0; - g_esTeammate[iPlayer].g_iInextinguishableFireReward[iPos] = -1; + g_esTeammate[iPlayer].g_flHeartbeatReward[iPos] = -1.0; + g_esTeammate[iPlayer].g_flHollowpointAmmoReward[iPos] = -1.0; g_esTeammate[iPlayer].g_iInfiniteAmmoReward[iPos] = -1; + g_esTeammate[iPlayer].g_flJumpHeightReward[iPos] = -1.0; g_esTeammate[iPlayer].g_iLadderActionsReward[iPos] = -1; - g_esTeammate[iPlayer].g_iLadyKillerReward[iPos] = -1; + g_esTeammate[iPlayer].g_flLadyKillerReward[iPos] = -1.0; g_esTeammate[iPlayer].g_iLaserSightReward[iPos] = -1; g_esTeammate[iPlayer].g_iLifeLeechReward[iPos] = -1; g_esTeammate[iPlayer].g_flLoopingVoicelineInterval[iPos] = -1.0; + g_esTeammate[iPlayer].g_flLuckyBulletReward[iPos] = -1.0; g_esTeammate[iPlayer].g_iMedicalCutsReward[iPos] = -1; g_esTeammate[iPlayer].g_iMeleeRangeReward[iPos] = -1; g_esTeammate[iPlayer].g_iMidairDashesReward[iPos] = -1; + g_esTeammate[iPlayer].g_flMotivationRadiusReward[iPos] = -1.0; + g_esTeammate[iPlayer].g_flOverdoseRadiusReward[iPos] = -1.0; + g_esTeammate[iPlayer].g_iOverhealthReward[iPos] = -1; g_esTeammate[iPlayer].g_iParticleEffectVisual[iPos] = -1; g_esTeammate[iPlayer].g_flPipeBombDurationReward[iPos] = -1.0; g_esTeammate[iPlayer].g_iPrefsNotify[iPos] = -1; @@ -20933,17 +26908,23 @@ void SMCParseStart_Main(SMCParser smc) g_esTeammate[iPlayer].g_iRecoilDampenerReward[iPos] = -1; g_esTeammate[iPlayer].g_flRefillPercentReward[iPos] = -1.0; g_esTeammate[iPlayer].g_iRegenBurstsReward[iPos] = -1; + g_esTeammate[iPlayer].g_flReloadRateReward[iPos] = -1.0; g_esTeammate[iPlayer].g_iRespawnLoadoutReward[iPos] = -1; g_esTeammate[iPlayer].g_iReviveHealthReward[iPos] = -1; + g_esTeammate[iPlayer].g_iRiotGearReward[iPos] = -1; + g_esTeammate[iPlayer].g_iSafetyBubbleReward[iPos] = -1; g_esTeammate[iPlayer].g_iShareRewards[iPos] = -1; + g_esTeammate[iPlayer].g_flShockwaveRadiusReward[iPos] = -1.0; g_esTeammate[iPlayer].g_flShoveDamageReward[iPos] = -1.0; g_esTeammate[iPlayer].g_iShovePenaltyReward[iPos] = -1; g_esTeammate[iPlayer].g_flShoveRateReward[iPos] = -1.0; - g_esTeammate[iPlayer].g_iSledgehammerRoundsReward[iPos] = -1; + g_esTeammate[iPlayer].g_flSledgehammerRoundsReward[iPos] = -1.0; g_esTeammate[iPlayer].g_iSpecialAmmoReward[iPos] = -1; g_esTeammate[iPlayer].g_flSpeedBoostReward[iPos] = -1.0; g_esTeammate[iPlayer].g_iStackRewards[iPos] = -1; g_esTeammate[iPlayer].g_iStickyGrenadesReward[iPos] = -1; + g_esTeammate[iPlayer].g_flSupplierReward[iPos] = -1.0; + g_esTeammate[iPlayer].g_flSwingRateReward[iPos] = -1.0; g_esTeammate[iPlayer].g_iSyringeDartsReward[iPos] = -1; g_esTeammate[iPlayer].g_iThornsReward[iPos] = -1; g_esTeammate[iPlayer].g_iUsefulRewards[iPos] = -1; @@ -20978,10 +26959,12 @@ void SMCParseStart_Main(SMCParser smc) if (iPos < (sizeof esTeammate::g_flComboTypeChance)) { g_esTeammate[iPlayer].g_flComboTypeChance[iPos] = -1.0; + g_esTeammate[iPlayer].g_flBodyChance[iPos] = -1.0; } if (iPos < (sizeof esTeammate::g_iSkinColor)) { + g_esTeammate[iPlayer].g_flRockChance[iPos] = -1.0; g_esTeammate[iPlayer].g_iSkinColor[iPos] = -1; g_esTeammate[iPlayer].g_iBossHealth[iPos] = -1; g_esTeammate[iPlayer].g_iBossType[iPos] = -1; @@ -21139,8 +27122,9 @@ SMCResult SMCNewSection_Main(SMCParser smc, const char[] name, bool opt_quotes) } else if (g_esGeneral.g_csState == ConfigState_Specific) { - if (StrContains(name, MT_CONFIG_SECTION_SMOKER, false) != -1 || StrContains(name, MT_CONFIG_SECTION_BOOMER, false) != -1 || StrContains(name, MT_CONFIG_SECTION_HUNTER, false) != -1 || StrContains(name, MT_CONFIG_SECTION_SPITTER, false) != -1 || StrContains(name, MT_CONFIG_SECTION_JOCKEY, false) != -1 - || StrContains(name, MT_CONFIG_SECTION_CHARGER, false) != -1 || StrEqual(name, MT_CONFIG_SECTION_SPECIAL, false) || StrContains(name, MT_CONFIG_SECTION_SPECIAL2, false) != -1 || StrEqual(name, MT_CONFIG_SECTION_INFECTED, false) || StrContains(name, MT_CONFIG_SECTION_INFECTED2, false) != -1) + if (StrContains(name, MT_CONFIG_SECTION_NICK, false) != -1 || StrContains(name, MT_CONFIG_SECTION_ROCHELLE, false) != -1 || StrContains(name, MT_CONFIG_SECTION_ELLIS, false) != -1 || StrContains(name, MT_CONFIG_SECTION_COACH, false) != -1 || StrContains(name, MT_CONFIG_SECTION_BILL, false) != -1 || StrContains(name, MT_CONFIG_SECTION_ZOEY, false) != -1 || StrContains(name, MT_CONFIG_SECTION_FRANCIS, false) != -1 + || StrContains(name, MT_CONFIG_SECTION_LOUIS, false) != -1 || StrContains(name, MT_CONFIG_SECTION_WEAPON, false) != -1 || StrContains(name, MT_CONFIG_SECTION_SMOKER, false) != -1 || StrContains(name, MT_CONFIG_SECTION_BOOMER, false) != -1 || StrContains(name, MT_CONFIG_SECTION_HUNTER, false) != -1 || StrContains(name, MT_CONFIG_SECTION_SPITTER, false) != -1 || StrContains(name, MT_CONFIG_SECTION_JOCKEY, false) != -1 + || StrContains(name, MT_CONFIG_SECTION_CHARGER, false) != -1 || StrContains(name, MT_CONFIG_SECTION_WITCH, false) != -1 || StrContains(name, MT_CONFIG_SECTION_COMMON, false) != -1 || StrEqual(name, MT_CONFIG_SECTION_SPECIAL, false) || StrContains(name, MT_CONFIG_SECTION_SPECIAL2, false) != -1 || StrEqual(name, MT_CONFIG_SECTION_MOB, false) || StrEqual(name, MT_CONFIG_SECTION_INFECTED, false) || StrContains(name, MT_CONFIG_SECTION_INFECTED2, false) != -1) { g_esGeneral.g_csState = ConfigState_Special; @@ -21170,22 +27154,14 @@ SMCResult SMCKeyValues_Main(SMCParser smc, const char[] key, const char[] value, { if (g_esGeneral.g_csState == ConfigState_Specific) { - if (g_esGeneral.g_iConfigMode < 3) - { - vSetTankSettings(g_esGeneral.g_iConfigMode, g_esGeneral.g_sCurrentSection, g_esGeneral.g_sCurrentSubSection, key, value); - } - else if (g_esGeneral.g_iConfigMode == 3 && (!strncmp(g_esGeneral.g_sCurrentSection, "STEAM_", 6, false) || !strncmp("0:", g_esGeneral.g_sCurrentSection, 2) || !strncmp("1:", g_esGeneral.g_sCurrentSection, 2) || (!strncmp(g_esGeneral.g_sCurrentSection, "[U:", 3) && g_esGeneral.g_sCurrentSection[strlen(g_esGeneral.g_sCurrentSection) - 1] == ']'))) + if ((g_esGeneral.g_iConfigMode < 3) || (g_esGeneral.g_iConfigMode == 3 && (!strncmp(g_esGeneral.g_sCurrentSection, "STEAM_", 6, false) || !strncmp("0:", g_esGeneral.g_sCurrentSection, 2) || !strncmp("1:", g_esGeneral.g_sCurrentSection, 2) || (!strncmp(g_esGeneral.g_sCurrentSection, "[U:", 3) && g_esGeneral.g_sCurrentSection[strlen(g_esGeneral.g_sCurrentSection) - 1] == ']')))) { vSetTankSettings(g_esGeneral.g_iConfigMode, g_esGeneral.g_sCurrentSection, g_esGeneral.g_sCurrentSubSection, key, value); } } else if (g_esGeneral.g_csState == ConfigState_Special) { - if (g_esGeneral.g_iConfigMode < 3) - { - vSetSpecialSettings(g_esGeneral.g_iConfigMode, g_esGeneral.g_sCurrentSection, g_esGeneral.g_sCurrentSubSection, g_esGeneral.g_sCurrentSpecSection, key, value); - } - else if (g_esGeneral.g_iConfigMode == 3 && (!strncmp(g_esGeneral.g_sCurrentSection, "STEAM_", 6, false) || !strncmp("0:", g_esGeneral.g_sCurrentSection, 2) || !strncmp("1:", g_esGeneral.g_sCurrentSection, 2) || (!strncmp(g_esGeneral.g_sCurrentSection, "[U:", 3) && g_esGeneral.g_sCurrentSection[strlen(g_esGeneral.g_sCurrentSection) - 1] == ']'))) + if ((g_esGeneral.g_iConfigMode < 3) || (g_esGeneral.g_iConfigMode == 3 && (!strncmp(g_esGeneral.g_sCurrentSection, "STEAM_", 6, false) || !strncmp("0:", g_esGeneral.g_sCurrentSection, 2) || !strncmp("1:", g_esGeneral.g_sCurrentSection, 2) || (!strncmp(g_esGeneral.g_sCurrentSection, "[U:", 3) && g_esGeneral.g_sCurrentSection[strlen(g_esGeneral.g_sCurrentSection) - 1] == ']')))) { vSetSpecialSettings(g_esGeneral.g_iConfigMode, g_esGeneral.g_sCurrentSection, g_esGeneral.g_sCurrentSubSection, g_esGeneral.g_sCurrentSpecSection, key, value); } @@ -21256,7 +27232,8 @@ void SMCParseEnd_Main(SMCParser smc, bool halted, bool failed) { if (bIsValidClient(iPlayer)) { - vCacheSettings(iPlayer); + vCacheTankSettings(iPlayer); + vCacheSurvivorSettings(iPlayer); } } @@ -21435,7 +27412,7 @@ void vPipeBombSpawnFrame(int ref) if (bIsValidEntity(iGrenade)) { int iThrower = GetEntPropEnt(iGrenade, Prop_Data, "m_hThrower"); - if (bIsSurvivor(iThrower) && (bIsDeveloper(iThrower, 5) || bIsDeveloper(iThrower, 7) || ((g_esPlayer[iThrower].g_iRewardTypes & MT_REWARD_SPEEDBOOST) && g_esPlayer[iThrower].g_iStickyGrenades == 1))) + if (bIsSurvivor(iThrower) && (bIsDeveloper(iThrower, 5) || bIsDeveloper(iThrower, 7) || (((g_esShooter[iThrower].g_iTotalPassives & MT_PASSIVE_SPEEDBOOST) || (g_esPlayer[iThrower].g_iRewardTypes & MT_REWARD_SPEEDBOOST)) && g_esPlayer[iThrower].g_iStickyGrenades == 1))) { g_esGeneral.g_flStickyDelay[iGrenade] = GetGameTime(); @@ -21453,6 +27430,15 @@ void vPlayerSpawnFrame(DataPack pack) if (bIsSurvivor(iPlayer)) { + g_esShooter[iPlayer].g_iCharacterType[0] = -1; + g_esShooter[iPlayer].g_iNotify = 0; + g_esShooter[iPlayer].g_iPassiveTypes = 0; + g_esShooter[iPlayer].g_iTotalPassives = 0; + + delete g_esShooter[iPlayer].g_hCharacterTimer; + + g_esShooter[iPlayer].g_hCharacterTimer = CreateTimer(1.0, tTimerCheckCharacter, GetClientUserId(iPlayer), TIMER_REPEAT); + if (!g_esPlayer[iPlayer].g_bSetup) { g_esPlayer[iPlayer].g_bSetup = true; @@ -21463,7 +27449,7 @@ void vPlayerSpawnFrame(DataPack pack) } } - if (!bIsDeveloper(iPlayer, 0)) + if (!bIsDeveloper(iPlayer, 1)) { char sDelimiter[2]; float flCurrentTime = GetGameTime(); @@ -21495,7 +27481,7 @@ void vPlayerSpawnFrame(DataPack pack) } else if (bIsInfected(iPlayer) && !g_esPlayer[iPlayer].g_bFirstSpawn) { - if (bIsTank(iPlayer) && g_bSecondGame) + if (g_bSecondGame && bIsTank(iPlayer)) { g_esPlayer[iPlayer].g_bStasis = bIsTankInStasis(iPlayer) || (g_esGeneral.g_hSDKIsInStasis != null && SDKCall(g_esGeneral.g_hSDKIsInStasis, iPlayer)); @@ -21580,7 +27566,7 @@ void vRockThrowFrame(int ref) if (g_esGeneral.g_bPluginEnabled && bIsValidEntity(iRock)) { int iThrower = GetEntPropEnt(iRock, Prop_Data, "m_hThrower"); - if (bIsInfectedSupported(iThrower) && bIsInfectedEnabled(iThrower) && bHasCoreAdminAccess(iThrower) && !bIsInfectedIdle(iThrower)) + if (bIsSpecialSupported(iThrower) && bIsInfectedEnabled(iThrower) && bHasCoreAdminAccess(iThrower) && !bIsInfectedIdle(iThrower)) { vSetRockModel(iThrower, iRock); vSetRockEffects(iThrower, iRock); @@ -21597,9 +27583,30 @@ void vTankSpawnFrame(DataPack pack) int iTank = GetClientOfUserId(pack.ReadCell()), iMode = pack.ReadCell(), iSpecType = pack.ReadCell(); delete pack; - if (bIsInfectedSupported(iTank) && bHasCoreAdminAccess(iTank)) + if (bIsSpecialSupported(iTank) && bHasCoreAdminAccess(iTank)) { - vCacheSettings(iTank); + if ((g_esShooter[iTank].g_bSurvivor && g_esShooter[iTank].g_bMixTypes) || g_esShooter[iTank].g_bProduced) + { + int iTypeCount = 0, iTankTypes[MT_MAXTYPES + 1]; + for (int iIndex = 0; iIndex <= MT_MAXTYPES; iIndex++) + { + if (g_esShooter[iTank].g_bInfected[iIndex]) + { + iTankTypes[iTypeCount + 1] = iIndex; + iTypeCount++; + + vCacheTankSettings(iTank, iIndex, true); + } + } + + if (iTypeCount > 0) + { + int iChosenType = iTankTypes[MT_GetRandomInt(1, iTypeCount)]; + vCacheTankSettings(iTank, iChosenType, .visualsOnly = true); + + g_esShooter[iTank].g_bInfected[iChosenType] = false; + } + } if (!bIsInfectedGhost(iTank) && !g_esPlayer[iTank].g_bStasis) { @@ -21607,13 +27614,14 @@ void vTankSpawnFrame(DataPack pack) g_esPlayer[iTank].g_flLastAttackTime = GetGameTime(); char sOldName[33], sNewName[33]; - vGetTranslatedName(sOldName, sizeof sOldName, .type = g_esTank[g_esPlayer[iTank].g_iOldTankType].g_iRealType[0], .specType = iSpecType); - vGetTranslatedName(sNewName, sizeof sNewName, .type = g_esTank[g_esPlayer[iTank].g_iTankType].g_iRealType[0], .specType = iSpecType); + vGetTankTranslatedName(sOldName, sizeof sOldName, .type = g_esPlayer[iTank].g_iOldTankType, .specType = iSpecType, .survivor = g_esShooter[iTank].g_bSurvivor, .character = g_esShooter[iTank].g_iCharacter); + vGetTankTranslatedName(sNewName, sizeof sNewName, .type = g_esPlayer[iTank].g_iTankType, .specType = iSpecType, .survivor = g_esShooter[iTank].g_bSurvivor, .character = g_esShooter[iTank].g_iCharacter); vSetTankName(iTank, sOldName, sNewName, iMode, iSpecType); - vParticleEffects(iTank); - vResetTankSpeed(iTank, false); + vSetupTankParticleEffects(iTank); vSetTankProps(iTank); + vCacheTankSettings(iTank); + vResetTankSpeed(iTank, false); vSetTankThrowInterval(iTank); SDKHook(iTank, SDKHook_PostThinkPost, OnTankPostThinkPost); @@ -21655,7 +27663,77 @@ void vTankSpawnFrame(DataPack pack) } } } +#if defined _WeaponHandling_included +void vWeaponPassiveFrame(DataPack pack) +{ + pack.Reset(); + int iSurvivor = GetClientOfUserId(pack.ReadCell()), iWeapon = EntRefToEntIndex(pack.ReadCell()), iType = pack.ReadCell(); + delete pack; + + if (!bIsSurvivor(iSurvivor) || !bIsValidEntity(iWeapon)) + { + return; + } + + char sClassname[32], sTest[34], sTests[322]; + GetEntityClassname(iWeapon, sClassname, sizeof sClassname); + if (!StrEqual(g_esShooter[iSurvivor].g_sLastWeapon, sClassname)) + { + if (iType != 2) + { + if (g_esShooter[iSurvivor].g_sLastWeapon[0] != '\0') + { + int iOldIndex = view_as(GetWeaponTypeFromClassname(g_esShooter[iSurvivor].g_sLastWeapon)); + for (int iIndex = 101; iIndex <= g_esGeneral.g_iMaxWeapons; iIndex++) + { + FormatEx(sTests, sizeof sTests, ",%s,", g_esWeapon[iIndex].g_sWeaponName); + FormatEx(sTest, sizeof sTest, ",%s,", g_esShooter[iSurvivor].g_sLastWeapon); + iOldIndex = ((StrContains(sTests, sTest, false) != -1) ? iIndex : -1); + if (iOldIndex == -1) + { + continue; + } + + vToggleSurvivorPassive(iSurvivor, g_esWeapon[iOldIndex].g_iPassiveTypes, false, true, iOldIndex); + } + + vCheckSurvivorPassive(iSurvivor); + } + } + + if (iType != 1) + { + int iNewIndex = view_as(GetWeaponTypeFromClassname(sClassname)); + + switch (StrEqual(sClassname, "weapon_melee")) + { + case true: GetEntPropString(iWeapon, Prop_Data, "m_strMapSetScriptName", sClassname, sizeof sClassname); + case false: strcopy(g_esShooter[iSurvivor].g_sLastWeapon, sizeof esShooter::g_sLastWeapon, sClassname); + } + + vCheckSurvivorPassive(iSurvivor); + + for (int iIndex = 101; iIndex <= g_esGeneral.g_iMaxWeapons; iIndex++) + { + FormatEx(sTests, sizeof sTests, ",%s,", g_esWeapon[iIndex].g_sWeaponName); + FormatEx(sTest, sizeof sTest, ",%s,", sClassname); + iNewIndex = ((StrContains(sTests, sTest, false) != -1) ? iIndex : -1); + if (iNewIndex == -1) + { + continue; + } + vSetupWeaponPassives(iSurvivor, iNewIndex); + + if (iNewIndex > 0) + { + strcopy(g_esShooter[iSurvivor].g_sLastWeapon, sizeof esShooter::g_sLastWeapon, sClassname); + } + } + } + } +} +#endif void vWeaponSkinFrame(int userid) { int iSurvivor = GetClientOfUserId(userid); @@ -21677,7 +27755,7 @@ Action OnCombineTakeDamage(int victim, int &attacker, int &inflictor, float &dam { char sClassname[32]; GetEntityClassname(inflictor, sClassname, sizeof sClassname); - if (bIsInfectedSupported(attacker) && bIsSurvivor(victim)) + if (bIsSpecialSupported(attacker) && bIsSurvivor(victim)) { if (!bHasCoreAdminAccess(attacker) || bIsCoreAdminImmune(victim, attacker)) { @@ -21690,7 +27768,7 @@ Action OnCombineTakeDamage(int victim, int &attacker, int &inflictor, float &dam vCombineAbilitiesForward(attacker, MT_COMBO_MELEEHIT, victim, .classname = sClassname); } } - else if (bIsInfectedSupported(victim) && bIsSurvivor(attacker)) + else if (bIsSpecialSupported(victim) && bIsSurvivor(attacker)) { if (!bHasCoreAdminAccess(victim) || bIsCoreAdminImmune(attacker, victim)) { @@ -21713,14 +27791,14 @@ Action OnFriendlyTakeDamage(int victim, int &attacker, int &inflictor, float &da { if (bIsSurvivor(victim) && bIsSurvivor(attacker)) { - if ((bIsDeveloper(victim, 4) || ((g_esPlayer[victim].g_iRewardTypes & MT_REWARD_DAMAGEBOOST) && g_esPlayer[victim].g_iFriendlyFire == 1)) || (bIsDeveloper(attacker, 4) || ((g_esPlayer[attacker].g_iRewardTypes & MT_REWARD_DAMAGEBOOST) && g_esPlayer[attacker].g_iFriendlyFire == 1))) + if ((bIsDeveloper(victim, 4) || (((g_esShooter[victim].g_iTotalPassives & MT_PASSIVE_DAMAGEBOOST) || (g_esPlayer[victim].g_iRewardTypes & MT_REWARD_DAMAGEBOOST)) && g_esPlayer[victim].g_iFriendlyFire == 1)) || (bIsDeveloper(attacker, 4) || (((g_esShooter[attacker].g_iTotalPassives & MT_PASSIVE_DAMAGEBOOST) || (g_esPlayer[attacker].g_iRewardTypes & MT_REWARD_DAMAGEBOOST)) && g_esPlayer[attacker].g_iFriendlyFire == 1))) { return Plugin_Handled; } } - else if (bIsValidClient(attacker, MT_CHECK_INDEX) && bIsValidEntity(inflictor) && (g_esGeneral.g_iTeamID2[inflictor] == 2 || damagetype == 134217792)) + else if (bIsValidClient(attacker, MT_CHECK_INDEX) && bIsValidEntity(inflictor) && (g_esGeneral.g_iTeamID2[inflictor] == 2 || (g_esGeneral.g_iTeamID2[inflictor] == 2 && damagetype == 134217792))) { - if ((bIsDeveloper(victim, 4) || ((g_esPlayer[victim].g_iRewardTypes & MT_REWARD_DAMAGEBOOST) && g_esPlayer[victim].g_iFriendlyFire == 1)) && GetClientTeam(victim) == 2 && GetClientTeam(attacker) != 2) + if ((bIsDeveloper(victim, 4) || (((g_esShooter[victim].g_iTotalPassives & MT_PASSIVE_DAMAGEBOOST) || (g_esPlayer[victim].g_iRewardTypes & MT_REWARD_DAMAGEBOOST)) && g_esPlayer[victim].g_iFriendlyFire == 1)) && GetClientTeam(victim) == 2 && GetClientTeam(attacker) != 2) { if (damagetype == 134217792) { @@ -21735,13 +27813,13 @@ Action OnFriendlyTakeDamage(int victim, int &attacker, int &inflictor, float &da return Plugin_Handled; } } - else if (attacker == inflictor && bIsValidEntity(inflictor) && (g_esGeneral.g_iTeamID2[inflictor] == 2 || damagetype == 134217792) && GetClientTeam(victim) == 2) + else if (attacker == inflictor && bIsValidEntity(inflictor) && (g_esGeneral.g_iTeamID2[inflictor] == 2 || (g_esGeneral.g_iTeamID2[inflictor] == 2 && damagetype == 134217792)) && GetClientTeam(victim) == 2) { if (damagetype == 134217792) { char sClassname[5]; GetEntityClassname(inflictor, sClassname, sizeof sClassname); - if (StrEqual(sClassname, "pipe") && (bIsDeveloper(victim, 4) || ((g_esPlayer[victim].g_iRewardTypes & MT_REWARD_DAMAGEBOOST) && g_esPlayer[victim].g_iFriendlyFire == 1))) + if (StrEqual(sClassname, "pipe") && (bIsDeveloper(victim, 4) || (((g_esShooter[victim].g_iTotalPassives & MT_PASSIVE_DAMAGEBOOST) || (g_esPlayer[victim].g_iRewardTypes & MT_REWARD_DAMAGEBOOST)) && g_esPlayer[victim].g_iFriendlyFire == 1))) { return Plugin_Handled; } @@ -21749,7 +27827,7 @@ Action OnFriendlyTakeDamage(int victim, int &attacker, int &inflictor, float &da else { attacker = GetEntPropEnt(inflictor, Prop_Data, "m_hOwnerEntity"); - if ((bIsDeveloper(victim, 4) || ((g_esPlayer[victim].g_iRewardTypes & MT_REWARD_DAMAGEBOOST) && g_esPlayer[victim].g_iFriendlyFire == 1)) && (attacker == -1 || (bIsValidClient(attacker, MT_CHECK_INDEX) && (!IsClientInGame(attacker) || GetClientUserId(attacker) != g_esPlayer[attacker].g_iUserID2)))) + if ((bIsDeveloper(victim, 4) || (((g_esShooter[victim].g_iTotalPassives & MT_PASSIVE_DAMAGEBOOST) || (g_esPlayer[victim].g_iRewardTypes & MT_REWARD_DAMAGEBOOST)) && g_esPlayer[victim].g_iFriendlyFire == 1)) && (attacker == -1 || (bIsValidClient(attacker, MT_CHECK_INDEX) && (!IsClientInGame(attacker) || GetClientUserId(attacker) != g_esPlayer[attacker].g_iUserID2)))) { return Plugin_Handled; } @@ -21794,12 +27872,12 @@ Action OnPlayerTakeDamageAlive(int victim, int &attacker, int &inflictor, float { if (bIsSurvivor(victim)) { - bool bDeveloper = bIsDeveloper(victim, 6) || (g_esPlayer[victim].g_iRewardTypes & MT_REWARD_ATTACKBOOST); + bool bDeveloper = (bIsDeveloper(victim, 6) || (((g_esShooter[victim].g_iTotalPassives & MT_PASSIVE_ATTACKBOOST) || (g_esPlayer[victim].g_iRewardTypes & MT_REWARD_ATTACKBOOST)) && g_esPlayer[victim].g_iFastRecovery == 1)); if (bDeveloper) { static int iIndex[2] = {-1, -1}; int iReviver = GetClientOfUserId(g_esPlayer[victim].g_iReviver); - bool bDeveloper2 = bIsDeveloper(iReviver, 6) || (g_esPlayer[iReviver].g_iRewardTypes & MT_REWARD_ATTACKBOOST); + bool bDeveloper2 = (bIsDeveloper(iReviver, 6) || (((g_esShooter[iReviver].g_iTotalPassives & MT_PASSIVE_ATTACKBOOST) || (g_esPlayer[iReviver].g_iRewardTypes & MT_REWARD_ATTACKBOOST)) && g_esPlayer[iReviver].g_iFastRecovery == 1)); if (bDeveloper || (bIsSurvivor(iReviver) && bDeveloper2)) { if (iIndex[0] == -1) @@ -21829,7 +27907,20 @@ Action OnPlayerTakeDamageAlive(int victim, int &attacker, int &inflictor, float } else if (bIsInfected(victim)) { - float flResistance = g_esCache[victim].g_flShieldResistance; + int iHealth = bIsPlayerIncapacitated(victim) ? 0 : GetEntProp(victim, Prop_Data, "m_iHealth"), + iMaxHealth = GetEntProp(victim, Prop_Data, "m_iMaxHealth"), + iTotalHealth = (iHealth > iMaxHealth) ? iHealth : iMaxHealth; + + float flPercentage = (float(iHealth) / float(iTotalHealth)), flResistance = g_esTankCache[victim].g_flArmorResistance[0]; + if (g_esTankCache[victim].g_flArmorPercentage > 0.0 && (1.0 - g_esTankCache[victim].g_flArmorPercentage) <= flPercentage && flResistance >= 0.0) + { + flResistance = ((damagetype & DMG_BURN) || (damagetype & DMG_SLASH) || (damagetype & DMG_CLUB)) ? (flResistance * flResistance) : flResistance; + damage *= flResistance; + + return (flResistance > 0.0) ? Plugin_Changed : Plugin_Handled; + } + + flResistance = g_esTankCache[victim].g_flShieldResistance; if (g_esPlayer[victim].g_bProtected[0] && flResistance >= 0.0) { damage *= flResistance; @@ -21837,7 +27928,7 @@ Action OnPlayerTakeDamageAlive(int victim, int &attacker, int &inflictor, float return (flResistance > 0.0) ? Plugin_Changed : Plugin_Handled; } - flResistance = g_esCache[victim].g_flArmorResistance; + flResistance = g_esTankCache[victim].g_flArmorResistance[1]; if (g_esPlayer[victim].g_bProtected[1] && flResistance >= 0.0) { damage *= flResistance; @@ -21845,12 +27936,12 @@ Action OnPlayerTakeDamageAlive(int victim, int &attacker, int &inflictor, float return (flResistance > 0.0) ? Plugin_Changed : Plugin_Handled; } - if (((damagetype & DMG_SLASH) || (damagetype & DMG_CLUB)) && g_esCache[victim].g_iMeleeHitMode > 0 && g_esCache[victim].g_flMeleeHitValue > 0.0) + if (((damagetype & DMG_SLASH) || (damagetype & DMG_CLUB)) && g_esTankCache[victim].g_iMeleeHitMode > 0 && g_esTankCache[victim].g_flMeleeHitValue > 0.0) { - switch (g_esCache[victim].g_iMeleeHitMode) + switch (g_esTankCache[victim].g_iMeleeHitMode) { - case 1: damage = float(GetEntProp(victim, Prop_Data, "m_iMaxHealth")) * g_esCache[victim].g_flMeleeHitValue; - case 2: damage = g_esCache[victim].g_flMeleeHitValue; + case 1: damage = float(iMaxHealth) * g_esTankCache[victim].g_flMeleeHitValue; + case 2: damage = g_esTankCache[victim].g_flMeleeHitValue; } return Plugin_Changed; @@ -21890,8 +27981,9 @@ Action OnPlayerTakeDamage(int victim, int &attacker, int &inflictor, float &dama if (g_esGeneral.g_bPluginEnabled && damage > 0.0) { char sClassname[32]; + bool bInflictor = bIsValidEntity(inflictor); int iLauncher = 0, iThrower = 0; - if (bIsValidEntity(inflictor)) + if (bInflictor) { GetEntityClassname(inflictor, sClassname, sizeof sClassname); if (StrEqual(sClassname, "tank_rock")) @@ -21901,30 +27993,34 @@ Action OnPlayerTakeDamage(int victim, int &attacker, int &inflictor, float &dama } } - bool bDeveloper = false, bInfected = bIsSpecialInfected(attacker), bRewarded = false; + bool bCommonAttacker = bIsCommonInfected(attacker), bCommonVictim = bIsCommonInfected(victim), bDeveloper = false, bInfectedAttacker = bIsInfected(attacker), bInfectedVictim = bIsInfected(victim), bRewarded = false, bSpecialAttacker = bIsSpecialInfected(attacker), bSpecialVictim = bIsSpecialInfected(victim), bSurvivorAttacker = bIsSurvivor(attacker), bSurvivorVictim = bIsSurvivor(victim), bWitchAttacker = bIsWitch(attacker), bWitchVictim = bIsWitch(victim); float flResistance = 0.0; - if (bIsSurvivor(victim)) + if (bSurvivorVictim) { bDeveloper = bIsDeveloper(victim, 4); - bRewarded = bDeveloper || (g_esPlayer[victim].g_iRewardTypes & MT_REWARD_DAMAGEBOOST); + bRewarded = (bDeveloper || (g_esShooter[victim].g_iTotalPassives & MT_PASSIVE_DAMAGEBOOST) || (g_esPlayer[victim].g_iRewardTypes & MT_REWARD_DAMAGEBOOST)); static int iIndex = -1; if (iIndex == -1) { iIndex = iGetPatchIndex("MTPatch_DoJumpHeight"); } - if (bIsDeveloper(victim, 11) || (g_esPlayer[victim].g_iRewardTypes & MT_REWARD_GODMODE)) + if (((damagetype & DMG_DROWN) && iGetPlayerWaterLevel(victim) > MT_WATER_NONE) || ((damagetype & DMG_FALL) && !bIsSafeFalling(victim) && g_esPlayer[victim].g_bFatalFalling)) + { + g_esPlayer[victim].g_bFinalFall = true; + + return Plugin_Continue; + } + + if (bIsDeveloper(victim, 11) || (((g_esShooter[victim].g_iTotalPassives & MT_PASSIVE_GODMODE) || (g_esPlayer[victim].g_iRewardTypes & MT_REWARD_GODMODE)) && g_esPlayer[victim].g_iSafetyBubble == 1)) { if (StrEqual(sClassname, "tank_rock")) { RequestFrame(vDetonateRockFrame, EntIndexToEntRef(inflictor)); } - else if (((damagetype & DMG_DROWN) && iGetPlayerWaterLevel(victim) > MT_WATER_NONE) || ((damagetype & DMG_FALL) && !bIsSafeFalling(victim) && g_esPlayer[victim].g_bFatalFalling)) - { - SetEntProp(victim, Prop_Data, "m_takedamage", 2, 1); - return Plugin_Continue; - } + vShakePlayerScreen(victim); + EmitSoundToAll(SOUND_METAL, victim); return Plugin_Handled; } @@ -21934,7 +28030,7 @@ Action OnPlayerTakeDamage(int victim, int &attacker, int &inflictor, float &dama return Plugin_Handled; } - if ((g_esPlayer[victim].g_iFallPasses > 0 || (iIndex != -1 && g_esPatch[iIndex].g_iType == 2) || bIsDeveloper(victim, 5) || (g_esPlayer[victim].g_iRewardTypes & MT_REWARD_SPEEDBOOST)) && (damagetype & DMG_FALL) && (bIsSafeFalling(victim) || RoundToNearest(damage) < GetEntProp(victim, Prop_Data, "m_iHealth") || !g_esPlayer[victim].g_bFatalFalling)) + if ((g_esPlayer[victim].g_iFallPasses > 0 || (iIndex != -1 && g_esPatch[iIndex].g_iType == 2) || bIsDeveloper(victim, 5) || (g_esShooter[victim].g_iTotalPassives & MT_PASSIVE_SPEEDBOOST) || (g_esPlayer[victim].g_iRewardTypes & MT_REWARD_SPEEDBOOST)) && (damagetype & DMG_FALL) && (bIsSafeFalling(victim) || RoundToNearest(damage) < GetEntProp(victim, Prop_Data, "m_iHealth") || !g_esPlayer[victim].g_bFatalFalling)) { if (g_esPlayer[victim].g_iFallPasses > 0) { @@ -21944,43 +28040,51 @@ Action OnPlayerTakeDamage(int victim, int &attacker, int &inflictor, float &dama return Plugin_Handled; } - if (bIsSurvivor(attacker)) + if (bSurvivorAttacker && !bIsSurvivorDisabled(victim)) { bool bDeveloper2 = bIsDeveloper(attacker, 4); - if ((damagetype & DMG_BURN) && ((bDeveloper || ((g_esPlayer[victim].g_iRewardTypes & MT_REWARD_HEALTH) && g_esPlayer[victim].g_iBlazeHealth == 1)) || (bDeveloper2 || ((g_esPlayer[attacker].g_iRewardTypes & MT_REWARD_HEALTH) && g_esPlayer[attacker].g_iBlazeHealth == 1)))) + if ((damagetype & DMG_BURN) && ((bDeveloper || (((g_esShooter[victim].g_iTotalPassives & MT_PASSIVE_HEALTH) || (g_esPlayer[victim].g_iRewardTypes & MT_REWARD_HEALTH)) && g_esPlayer[victim].g_iBlazeHealth > 0)) || (bDeveloper2 || (((g_esShooter[attacker].g_iTotalPassives & MT_PASSIVE_HEALTH) || (g_esPlayer[attacker].g_iRewardTypes & MT_REWARD_HEALTH)) && g_esPlayer[attacker].g_iBlazeHealth > 0)))) { - int iExtra = (bDeveloper2 && g_esDeveloper[attacker].g_iDevBlazeHealth > 0) ? g_esDeveloper[attacker].g_iDevBlazeHealth : RoundToNearest(damage / 2.0); + int iBlazeHealth = (g_esPlayer[victim].g_iBlazeHealth > 0) ? g_esPlayer[victim].g_iBlazeHealth : g_esPlayer[attacker].g_iBlazeHealth, + iExtra = (bDeveloper2 && g_esDeveloper[attacker].g_iDevBlazeHealth > 0) ? g_esDeveloper[attacker].g_iDevBlazeHealth : iBlazeHealth; + vRegenSurvivorHealth(victim, attacker, iExtra); return Plugin_Handled; } - if (((damagetype & DMG_SLASH) || (damagetype & DMG_CLUB)) && ((bDeveloper || ((g_esPlayer[victim].g_iRewardTypes & MT_REWARD_HEALTH) && g_esPlayer[victim].g_iMedicalCuts == 1)) || (bDeveloper2 || ((g_esPlayer[attacker].g_iRewardTypes & MT_REWARD_HEALTH) && g_esPlayer[attacker].g_iMedicalCuts == 1)))) + if (((damagetype & DMG_SLASH) || (damagetype & DMG_CLUB)) && ((bDeveloper || (((g_esShooter[victim].g_iTotalPassives & MT_PASSIVE_HEALTH) || (g_esPlayer[victim].g_iRewardTypes & MT_REWARD_HEALTH)) && g_esPlayer[victim].g_iMedicalCuts > 0)) || (bDeveloper2 || (((g_esShooter[attacker].g_iTotalPassives & MT_PASSIVE_HEALTH) || (g_esPlayer[attacker].g_iRewardTypes & MT_REWARD_HEALTH)) && g_esPlayer[attacker].g_iMedicalCuts > 0)))) { - int iExtra = (bDeveloper2 && g_esDeveloper[attacker].g_iDevMedicalCuts > 0) ? g_esDeveloper[attacker].g_iDevMedicalCuts : RoundToNearest(damage / 2.0); + int iMedicalCuts = (g_esPlayer[victim].g_iMedicalCuts > 0) ? g_esPlayer[victim].g_iMedicalCuts : g_esPlayer[attacker].g_iMedicalCuts, + iExtra = (bDeveloper2 && g_esDeveloper[attacker].g_iDevMedicalCuts > 0) ? g_esDeveloper[attacker].g_iDevMedicalCuts : iMedicalCuts; + vRegenSurvivorHealth(victim, attacker, iExtra); return Plugin_Handled; } - if (((damagetype & DMG_BLAST) || (damagetype & DMG_BLAST_SURFACE) || (damagetype & DMG_AIRBOAT) || (damagetype & DMG_PLASMA)) && ((bDeveloper || ((g_esPlayer[victim].g_iRewardTypes & MT_REWARD_HEALTH) && g_esPlayer[victim].g_iRegenBursts == 1)) || (bDeveloper2 || ((g_esPlayer[attacker].g_iRewardTypes & MT_REWARD_HEALTH) && g_esPlayer[attacker].g_iRegenBursts == 1)))) + if (((damagetype & DMG_BLAST) || (damagetype & DMG_BLAST_SURFACE) || (damagetype & DMG_AIRBOAT) || (damagetype & DMG_PLASMA)) && ((bDeveloper || (((g_esShooter[victim].g_iTotalPassives & MT_PASSIVE_HEALTH) || (g_esPlayer[victim].g_iRewardTypes & MT_REWARD_HEALTH)) && g_esPlayer[victim].g_iRegenBursts > 0)) || (bDeveloper2 || (((g_esShooter[attacker].g_iTotalPassives & MT_PASSIVE_HEALTH) || (g_esPlayer[attacker].g_iRewardTypes & MT_REWARD_HEALTH)) && g_esPlayer[attacker].g_iRegenBursts > 0)))) { - int iExtra = (bDeveloper2 && g_esDeveloper[attacker].g_iDevRegenBursts > 0) ? g_esDeveloper[attacker].g_iDevRegenBursts : RoundToNearest(damage / 2.0); + int iRegenBursts = (g_esPlayer[victim].g_iRegenBursts > 0) ? g_esPlayer[victim].g_iRegenBursts : g_esPlayer[attacker].g_iRegenBursts, + iExtra = (bDeveloper2 && g_esDeveloper[attacker].g_iDevRegenBursts > 0) ? g_esDeveloper[attacker].g_iDevRegenBursts : iRegenBursts; + vRegenSurvivorHealth(victim, attacker, iExtra); return Plugin_Handled; } - if (((damagetype & DMG_BULLET) || (damagetype & DMG_BUCKSHOT)) && ((bDeveloper || ((g_esPlayer[victim].g_iRewardTypes & MT_REWARD_HEALTH) && g_esPlayer[victim].g_iSyringeDarts == 1)) || (bDeveloper2 || ((g_esPlayer[attacker].g_iRewardTypes & MT_REWARD_HEALTH) && g_esPlayer[attacker].g_iSyringeDarts == 1)))) + if (((damagetype & DMG_BULLET) || (damagetype & DMG_BUCKSHOT)) && ((bDeveloper || (((g_esShooter[victim].g_iTotalPassives & MT_PASSIVE_HEALTH) || (g_esPlayer[victim].g_iRewardTypes & MT_REWARD_HEALTH)) && g_esPlayer[victim].g_iSyringeDarts > 0)) || (bDeveloper2 || (((g_esShooter[attacker].g_iTotalPassives & MT_PASSIVE_HEALTH) || (g_esPlayer[attacker].g_iRewardTypes & MT_REWARD_HEALTH)) && g_esPlayer[attacker].g_iSyringeDarts > 0)))) { - int iExtra = (bDeveloper2 && g_esDeveloper[attacker].g_iDevSyringeDarts > 0) ? g_esDeveloper[attacker].g_iDevSyringeDarts : RoundToNearest(damage / 2.0); + int iSyringeDarts = (g_esPlayer[victim].g_iSyringeDarts > 0) ? g_esPlayer[victim].g_iSyringeDarts : g_esPlayer[attacker].g_iSyringeDarts, + iExtra = (bDeveloper2 && g_esDeveloper[attacker].g_iDevSyringeDarts > 0) ? g_esDeveloper[attacker].g_iDevSyringeDarts : iSyringeDarts; + vRegenSurvivorHealth(victim, attacker, iExtra); return Plugin_Handled; } } - if (bIsInfected(attacker)) + if (bInfectedAttacker) { flResistance = (bDeveloper && g_esDeveloper[victim].g_flDevDamageResistance > g_esPlayer[victim].g_flDamageResistance) ? g_esDeveloper[victim].g_flDevDamageResistance : g_esPlayer[victim].g_flDamageResistance; if (!bIsCoreAdminImmune(victim, attacker)) @@ -21992,39 +28096,49 @@ Action OnPlayerTakeDamage(int victim, int &attacker, int &inflictor, float &dama * Smoker pinned: DMG_ACID - (1 << 20) - 1048576 * Spitter acid: DMG_RADIATION|DMG_ENERGYBEAM - (1 << 18)|(1 << 10) - 263168 **/ - bool bCaught = bIsSurvivorCaught(victim); - float flIncapMultiplier = g_esCache[attacker].g_flIncapDamageMultiplier; - if (bInfected && (bCaught || (bIsSpitter(attacker) && StrEqual(sClassname, "insect_swarm"))) && g_esCache[attacker].g_flPinDamage >= 0.0) + bool bCaught = bIsSurvivorCaught(victim), bJockey = bIsJockey(attacker) && !!g_esGeneral.g_iJockeyDamage; + float flIncapMultiplier = g_esTankCache[attacker].g_flIncapDamageMultiplier, flDamageMultiplier = g_esShooter[attacker].g_flDamageMultiplier, + flScale = (g_bSecondGame && bJockey) ? GetEntPropFloat(attacker, Prop_Data, "m_flModelScale") : 0.0; + + if (bSpecialAttacker && (bCaught || (bIsSpitter(attacker) && StrEqual(sClassname, "insect_swarm"))) && g_esTankCache[attacker].g_flPinDamage >= 0.0) { - damage = flGetScaledDamage(g_esCache[attacker].g_flPinDamage); + damage = flGetScaledDamage(g_esTankCache[attacker].g_flPinDamage); damage = (bIsPlayerIncapacitated(victim) && flIncapMultiplier > 1.0) ? (damage * flIncapMultiplier) : damage; damage = (bRewarded && flResistance > 0.0) ? (damage * flResistance) : damage; + damage = (flScale > 0.0) ? (damage * flScale) : damage; + damage = (flDamageMultiplier > 0.0) ? (damage * flDamageMultiplier) : damage; - return (g_esCache[attacker].g_flPinDamage > 0.0) ? Plugin_Changed : Plugin_Handled; + return (g_esTankCache[attacker].g_flPinDamage > 0.0) ? Plugin_Changed : Plugin_Handled; } - else if (((bInfected && !bCaught && (damagetype & DMG_CLUB)) || StrEqual(sClassname[7], "tank_claw")) && g_esCache[attacker].g_flClawDamage >= 0.0) + else if (((bSpecialAttacker && !bCaught && (damagetype & DMG_CLUB)) || StrEqual(sClassname[7], "tank_claw")) && g_esTankCache[attacker].g_flClawDamage >= 0.0) { - damage = flGetScaledDamage(g_esCache[attacker].g_flClawDamage); + damage = flGetScaledDamage(g_esTankCache[attacker].g_flClawDamage); damage = (bIsPlayerIncapacitated(victim) && flIncapMultiplier > 1.0) ? (damage * flIncapMultiplier) : damage; damage = (bRewarded && flResistance > 0.0) ? (damage * flResistance) : damage; + damage = (flScale > 0.0) ? (damage * flScale) : damage; + damage = (flDamageMultiplier > 0.0) ? (damage * flDamageMultiplier) : damage; - return (g_esCache[attacker].g_flClawDamage > 0.0) ? Plugin_Changed : Plugin_Handled; + return (g_esTankCache[attacker].g_flClawDamage > 0.0) ? Plugin_Changed : Plugin_Handled; } - else if ((damagetype & DMG_CRUSH) && bIsValidEntity(inflictor) && HasEntProp(inflictor, Prop_Send, "m_isCarryable") && g_esCache[attacker].g_flHittableDamage >= 0.0) + else if ((damagetype & DMG_CRUSH) && bInflictor && HasEntProp(inflictor, Prop_Send, "m_isCarryable") && g_esTankCache[attacker].g_flHittableDamage >= 0.0) { - damage = flGetScaledDamage(g_esCache[attacker].g_flHittableDamage); + damage = flGetScaledDamage(g_esTankCache[attacker].g_flHittableDamage); damage = (bIsPlayerIncapacitated(victim) && flIncapMultiplier > 1.0) ? (damage * flIncapMultiplier) : damage; damage = (bRewarded && flResistance > 0.0) ? (damage * flResistance) : damage; + damage = (flScale > 0.0) ? (damage * flScale) : damage; + damage = (flDamageMultiplier > 0.0) ? (damage * flDamageMultiplier) : damage; - return (g_esCache[attacker].g_flHittableDamage > 0.0) ? Plugin_Changed : Plugin_Handled; + return (g_esTankCache[attacker].g_flHittableDamage > 0.0) ? Plugin_Changed : Plugin_Handled; } - else if (StrEqual(sClassname, "tank_rock") && !bIsValidEntity(iLauncher) && g_esCache[attacker].g_flRockDamage >= 0.0) + else if (StrEqual(sClassname, "tank_rock") && !bIsValidEntity(iLauncher) && g_esTankCache[attacker].g_flRockDamage >= 0.0) { - damage = flGetScaledDamage(g_esCache[attacker].g_flRockDamage); + damage = flGetScaledDamage(g_esTankCache[attacker].g_flRockDamage); damage = (bIsPlayerIncapacitated(victim) && flIncapMultiplier > 1.0) ? (damage * flIncapMultiplier) : damage; damage = (bRewarded && flResistance > 0.0) ? (damage * flResistance) : damage; + damage = (flScale > 0.0) ? (damage * flScale) : damage; + damage = (flDamageMultiplier > 0.0) ? (damage * flDamageMultiplier) : damage; - return (g_esCache[attacker].g_flRockDamage > 0.0) ? Plugin_Changed : Plugin_Handled; + return (g_esTankCache[attacker].g_flRockDamage > 0.0) ? Plugin_Changed : Plugin_Handled; } } else if (bRewarded && flResistance > 0.0) @@ -22035,17 +28149,27 @@ Action OnPlayerTakeDamage(int victim, int &attacker, int &inflictor, float &dama } } + if (bCommonAttacker || bWitchAttacker) + { + float flScale = (g_bSecondGame ? GetEntPropFloat(attacker, Prop_Data, "m_flModelScale") : 0.0); + damage = (flScale > 0.0) ? (damage * flScale) : damage; + if (flScale > 0.0) + { + return Plugin_Changed; + } + } + if (bRewarded) { if (bDeveloper || g_esPlayer[victim].g_iThorns == 1) { - if (bInfected) + if (bSpecialAttacker) { char sDamageType[32]; IntToString(damagetype, sDamageType, sizeof sDamageType); vDamagePlayer(attacker, victim, damage, sDamageType); } - else if (bIsCommonInfected(attacker)) + else if (bCommonAttacker) { SDKHooks_TakeDamage(attacker, victim, victim, damage, damagetype); } @@ -22060,14 +28184,14 @@ Action OnPlayerTakeDamage(int victim, int &attacker, int &inflictor, float &dama } } } - else if (bIsInfected(victim) || bIsCommonInfected(victim) || bIsWitch(victim)) + else if (bInfectedVictim || bCommonVictim || bWitchVictim) { - g_esGeneral.g_iInfectedHealth[victim] = GetEntProp(victim, Prop_Data, "m_iHealth"); + g_esGeneral.g_iCommonHealth[victim] = GetEntProp(victim, Prop_Data, "m_iHealth"); - bool bPlayer = bIsValidClient(attacker), bSurvivor = bIsSurvivor(attacker); + bool bPlayer = bIsValidClient(attacker); float flDamage = 0.0; - bDeveloper = bSurvivor && bIsDeveloper(attacker, 4), bRewarded = bDeveloper || (bSurvivor && (g_esPlayer[attacker].g_iRewardTypes & MT_REWARD_DAMAGEBOOST)); - if (bIsInfected(victim)) + bDeveloper = (bSurvivorAttacker && bIsDeveloper(attacker, 4)), bRewarded = (bSurvivorAttacker && ((g_esShooter[attacker].g_iTotalPassives & MT_PASSIVE_DAMAGEBOOST) || (g_esPlayer[attacker].g_iRewardTypes & MT_REWARD_DAMAGEBOOST))); + if (bInfectedVictim) { if (StrEqual(sClassname, "tank_rock")) { @@ -22076,30 +28200,57 @@ Action OnPlayerTakeDamage(int victim, int &attacker, int &inflictor, float &dama return Plugin_Handled; } - bool bBlockBullets = (((damagetype & DMG_BULLET) || (damagetype & DMG_BUCKSHOT)) && g_esCache[victim].g_iBulletImmunity == 1), - bBlockExplosives = (((damagetype & DMG_BLAST) || (damagetype & DMG_BLAST_SURFACE) || (damagetype & DMG_AIRBOAT) || (damagetype & DMG_PLASMA)) && g_esCache[victim].g_iExplosiveImmunity == 1), - bBlockFire = ((damagetype & DMG_BURN) && g_esCache[victim].g_iFireImmunity == 1), - bBlockHittables = ((damagetype & DMG_CRUSH) && bIsValidEntity(inflictor) && HasEntProp(inflictor, Prop_Send, "m_isCarryable") && g_esCache[victim].g_iHittableImmunity == 1), - bBlockMelee = (((damagetype & DMG_SLASH) || (damagetype & DMG_CLUB)) && g_esCache[victim].g_iMeleeImmunity == 1); + bool bBlockBullets = (((damagetype & DMG_BULLET) || (damagetype & DMG_BUCKSHOT)) && g_esTankCache[victim].g_iBulletImmunity == 1), + bBlockExplosives = (((damagetype & DMG_BLAST) || (damagetype & DMG_BLAST_SURFACE) || (damagetype & DMG_AIRBOAT) || (damagetype & DMG_PLASMA)) && g_esTankCache[victim].g_iExplosiveImmunity == 1), + bBlockFire = ((damagetype & DMG_BURN) && g_esTankCache[victim].g_iFireImmunity == 1), + bBlockHittables = ((damagetype & DMG_CRUSH) && bInflictor && HasEntProp(inflictor, Prop_Send, "m_isCarryable") && g_esTankCache[victim].g_iHittableImmunity == 1), + bBlockMelee = (((damagetype & DMG_SLASH) || (damagetype & DMG_CLUB)) && g_esTankCache[victim].g_iMeleeImmunity == 1); if (bBlockBullets || bBlockExplosives || bBlockFire || bBlockHittables || bBlockMelee) { - if (bRewarded) + if (bDeveloper || bRewarded) { if (bBlockBullets || bBlockMelee) { - vKnockbackTank(victim, attacker, damagetype); + vKnockbackTank(victim, attacker); } + bool bReturn = true; +#if defined _WeaponHandling_included + if (!(g_esShooter[attacker].g_iPassiveTypes & MT_PASSIVE_DAMAGEBOOST)) + { + int iWeapon = iGetSurvivorActiveWeapon(attacker); + if (iWeapon > MaxClients) + { + if (bBlockBullets) + { + bReturn = (iWeapon == GetPlayerWeaponSlot(attacker, 0) || (iWeapon == GetPlayerWeaponSlot(attacker, 1) && StrContains(sClassname, "pistol") != -1)); + } + + if (bBlockExplosives) + { + bReturn = (bInflictor && g_esGeneral.g_iOwnerID[inflictor] == attacker && (iWeapon == GetPlayerWeaponSlot(attacker, 2) || (iWeapon == GetPlayerWeaponSlot(attacker, 0) && (StrContains(sClassname, "grenade_launcher") != -1 || bHasSpecialAmmo(iWeapon, 0))) || g_esPlayer[attacker].g_flGrenadeLauncher > 0.0 || g_esPlayer[attacker].g_flLadyKiller > 0.0)); + } + + if (bBlockFire) + { + bReturn = (bInflictor && g_esGeneral.g_iOwnerID[inflictor] == attacker && (iWeapon == GetPlayerWeaponSlot(attacker, 2) || (iWeapon == GetPlayerWeaponSlot(attacker, 0) && bHasSpecialAmmo(iWeapon, 0)))); + } + + if (bBlockMelee) + { + bReturn = (iWeapon == GetPlayerWeaponSlot(attacker, 1) && StrContains(sClassname, "pistol") == -1); + } + } + } +#endif flDamage = (bDeveloper && g_esDeveloper[attacker].g_flDevDamageBoost > g_esPlayer[attacker].g_flDamageBoost) ? g_esDeveloper[attacker].g_flDevDamageBoost : g_esPlayer[attacker].g_flDamageBoost; - if (flDamage > 0.0) + if (bReturn && flDamage > 0.0) { damage *= flDamage; return Plugin_Changed; } - - return Plugin_Continue; } if (bBlockBullets && ((!bBlockExplosives && ((damagetype & DMG_BLAST) || (damagetype & DMG_BLAST_SURFACE) || (damagetype & DMG_AIRBOAT) || (damagetype & DMG_PLASMA))) || (!bBlockFire && (damagetype & DMG_BURN)))) @@ -22137,7 +28288,7 @@ Action OnPlayerTakeDamage(int victim, int &attacker, int &inflictor, float &dama float flTankPos[3]; GetClientAbsOrigin(victim, flTankPos); - switch (bSurvivor && (bIsDeveloper(attacker, 11) || (g_esPlayer[attacker].g_iRewardTypes & MT_REWARD_GODMODE))) + switch (bSurvivorAttacker && (bIsDeveloper(attacker, 11) || (((g_esShooter[attacker].g_iTotalPassives & MT_PASSIVE_GODMODE) || (g_esPlayer[attacker].g_iRewardTypes & MT_REWARD_GODMODE)) && g_esPlayer[attacker].g_iRiotGear == 1))) { case true: vPushNearbyEntities(victim, flTankPos, 300.0, 100.0); case false: vPushNearbyEntities(victim, flTankPos); @@ -22148,29 +28299,29 @@ Action OnPlayerTakeDamage(int victim, int &attacker, int &inflictor, float &dama return Plugin_Handled; } - if ((damagetype & DMG_BURN) && g_esCache[victim].g_flBurnDuration > 0.0) + if ((damagetype & DMG_BURN) && g_esTankCache[victim].g_flBurnDuration > 0.0) { int iFlame = GetEntPropEnt(victim, Prop_Send, "m_hEffectEntity"); if (bIsValidEntity(iFlame)) { float flCurrentTime = GetGameTime(); - if (GetEntPropFloat(iFlame, Prop_Data, "m_flLifetime") > (flCurrentTime + g_esCache[victim].g_flBurnDuration)) + if (GetEntPropFloat(iFlame, Prop_Data, "m_flLifetime") > (flCurrentTime + g_esTankCache[victim].g_flBurnDuration)) { - SetEntPropFloat(iFlame, Prop_Data, "m_flLifetime", (flCurrentTime + g_esCache[victim].g_flBurnDuration)); + SetEntPropFloat(iFlame, Prop_Data, "m_flLifetime", (flCurrentTime + g_esTankCache[victim].g_flBurnDuration)); } } } - if (bSurvivor) + if (bSurvivorAttacker) { if ((damagetype & DMG_BULLET) || (damagetype & DMG_BUCKSHOT) || (damagetype & DMG_SLASH) || (damagetype & DMG_CLUB)) { - vKnockbackTank(victim, attacker, damagetype); + vKnockbackTank(victim, attacker); } if ((damagetype & DMG_BURN) && g_esGeneral.g_iCreditIgniters <= 0) { - if (bRewarded) + if (bDeveloper || bRewarded) { flDamage = (bDeveloper && g_esDeveloper[attacker].g_flDevDamageBoost > g_esPlayer[attacker].g_flDamageBoost) ? g_esDeveloper[attacker].g_flDevDamageBoost : g_esPlayer[attacker].g_flDamageBoost; if (flDamage > 0.0) @@ -22188,12 +28339,12 @@ Action OnPlayerTakeDamage(int victim, int &attacker, int &inflictor, float &dama if (damagetype & DMG_BULLET) { bool bChanged = false; - bDeveloper = bIsDeveloper(attacker, 9), bRewarded = !!(g_esPlayer[attacker].g_iRewardTypes & MT_REWARD_DAMAGEBOOST); + bDeveloper = bIsDeveloper(attacker, 9); if (bDeveloper || bRewarded) { - if (bDeveloper || (bRewarded && g_esPlayer[attacker].g_iHollowpointAmmo == 1)) + if (bDeveloper || (bRewarded && GetRandomFloat(0.1, 100.0) <= flGetPelletChance(attacker, g_esPlayer[attacker].g_flHollowpointAmmo))) { - if (bIsCommonInfected(victim) || bIsWitch(victim)) + if (bCommonVictim || bWitchVictim) { if (g_bSecondGame) { @@ -22205,7 +28356,11 @@ Action OnPlayerTakeDamage(int victim, int &attacker, int &inflictor, float &dama flOrigin[2] += 48.0; RequestFrame(vInfectedTransmitFrame, EntIndexToEntRef(victim)); - vAttachParticle2(flOrigin, flAngles, PARTICLE_GORE, 0.2); + + if (g_esGeneral.g_iGraphicsLevel > 2 || g_esGeneral.g_cvMTGraphicsLevel.IntValue > 2) + { + vAttachParticle2(flOrigin, flAngles, PARTICLE_GORE, 0.2); + } } } else @@ -22216,19 +28371,18 @@ Action OnPlayerTakeDamage(int victim, int &attacker, int &inflictor, float &dama } } - if (bDeveloper || (bRewarded && g_esPlayer[attacker].g_iSledgehammerRounds == 1)) + if (bDeveloper || (bRewarded && GetRandomFloat(0.1, 100.0) <= flGetPelletChance(attacker, g_esPlayer[attacker].g_flSledgehammerRounds))) { - if (bIsSpecialInfected(victim)) + if (bSpecialVictim) { vPerformKnockback(victim, attacker); } - else if (bIsCommonInfected(victim) || bIsWitch(victim)) + else if (bCommonVictim || bWitchVictim) { - bRewarded = bDeveloper || (bSurvivor && (g_esPlayer[attacker].g_iRewardTypes & MT_REWARD_DAMAGEBOOST)); - if (bRewarded) + if (bDeveloper || bRewarded) { - bDeveloper = bSurvivor && bIsDeveloper(attacker, 4); - flDamage = (bDeveloper && g_esDeveloper[attacker].g_flDevDamageBoost > g_esPlayer[attacker].g_flDamageBoost) ? g_esDeveloper[attacker].g_flDevDamageBoost : g_esPlayer[attacker].g_flDamageBoost; + bDeveloper = (bSurvivorAttacker && bIsDeveloper(attacker, 4)); + flDamage = ((bDeveloper && g_esDeveloper[attacker].g_flDevDamageBoost > g_esPlayer[attacker].g_flDamageBoost) ? g_esDeveloper[attacker].g_flDevDamageBoost : g_esPlayer[attacker].g_flDamageBoost); if (flDamage > 0.0) { bChanged = true; @@ -22250,9 +28404,8 @@ Action OnPlayerTakeDamage(int victim, int &attacker, int &inflictor, float &dama } } - bDeveloper = bSurvivor && bIsDeveloper(attacker, 4); - bRewarded = bDeveloper || (bSurvivor && (g_esPlayer[attacker].g_iRewardTypes & MT_REWARD_DAMAGEBOOST)); - if (bRewarded) + bDeveloper = (bSurvivorAttacker && bIsDeveloper(attacker, 4)); + if (bDeveloper || bRewarded) { flDamage = (bDeveloper && g_esDeveloper[attacker].g_flDevDamageBoost > g_esPlayer[attacker].g_flDamageBoost) ? g_esDeveloper[attacker].g_flDevDamageBoost : g_esPlayer[attacker].g_flDamageBoost; if (flDamage > 0.0) @@ -22262,9 +28415,9 @@ Action OnPlayerTakeDamage(int victim, int &attacker, int &inflictor, float &dama return Plugin_Changed; } } - else if ((bIsInfectedSupported(attacker) && victim != attacker) || (bIsInfectedSupported(iLauncher) && victim != iLauncher) || (bIsInfectedSupported(iThrower) && victim != iThrower)) + else if ((bIsSpecialSupported(attacker) && victim != attacker) || (bIsSpecialSupported(iLauncher) && victim != iLauncher) || (bIsSpecialSupported(iThrower) && victim != iThrower)) { - if ((bInfected && (damagetype & DMG_CLUB)) || StrEqual(sClassname[7], "tank_claw")) + if ((bSpecialAttacker && (damagetype & DMG_CLUB)) || StrEqual(sClassname[7], "tank_claw")) { return Plugin_Continue; } @@ -22283,7 +28436,7 @@ Action OnPlayerTakeDamage(int victim, int &attacker, int &inflictor, float &dama } else if (victim == attacker) { - return (bIsWitch(victim) && (damagetype & DMG_BURN)) ? Plugin_Continue : Plugin_Handled; + return (bWitchVictim && (damagetype & DMG_BURN)) ? Plugin_Continue : Plugin_Handled; } } } @@ -22298,14 +28451,14 @@ Action OnPropTakeDamage(int victim, int &attacker, int &inflictor, float &damage if (attacker == inflictor && bIsValidEntity(inflictor) && g_esGeneral.g_iTeamID2[inflictor] == 2) { attacker = GetEntPropEnt(inflictor, Prop_Data, "m_hOwnerEntity"); - if (attacker == -1 || (bIsValidClient(attacker, MT_CHECK_INDEX) && ((bIsValidClient(victim) && GetClientTeam(victim) == GetClientTeam(attacker) && (bIsDeveloper(attacker, 4) || ((g_esPlayer[attacker].g_iRewardTypes & MT_REWARD_DAMAGEBOOST) && g_esPlayer[attacker].g_iFriendlyFire == 1))) || !IsClientInGame(attacker) || GetClientUserId(attacker) != g_esPlayer[attacker].g_iUserID2))) + if (attacker == -1 || (bIsValidClient(attacker, MT_CHECK_INDEX) && ((bIsValidClient(victim) && GetClientTeam(victim) == GetClientTeam(attacker) && (bIsDeveloper(attacker, 4) || (((g_esShooter[attacker].g_iTotalPassives & MT_PASSIVE_DAMAGEBOOST) || (g_esPlayer[attacker].g_iRewardTypes & MT_REWARD_DAMAGEBOOST)) && g_esPlayer[attacker].g_iFriendlyFire == 1))) || !IsClientInGame(attacker) || GetClientUserId(attacker) != g_esPlayer[attacker].g_iUserID2))) { return Plugin_Handled; } } else if (bIsValidClient(attacker, MT_CHECK_INDEX)) { - if (g_esGeneral.g_iTeamID2[inflictor] == 2 && ((bIsValidClient(victim) && GetClientTeam(victim) == GetClientTeam(attacker) && (bIsDeveloper(attacker, 4) || ((g_esPlayer[attacker].g_iRewardTypes & MT_REWARD_DAMAGEBOOST) && g_esPlayer[attacker].g_iFriendlyFire == 1))) || !IsClientInGame(attacker) || GetClientUserId(attacker) != g_esPlayer[attacker].g_iUserID2 || GetClientTeam(attacker) != 2)) + if (g_esGeneral.g_iTeamID2[inflictor] == 2 && ((bIsValidClient(victim) && GetClientTeam(victim) == GetClientTeam(attacker) && (bIsDeveloper(attacker, 4) || (((g_esShooter[attacker].g_iTotalPassives & MT_PASSIVE_DAMAGEBOOST) || (g_esPlayer[attacker].g_iRewardTypes & MT_REWARD_DAMAGEBOOST)) && g_esPlayer[attacker].g_iFriendlyFire == 1))) || !IsClientInGame(attacker) || GetClientUserId(attacker) != g_esPlayer[attacker].g_iUserID2 || GetClientTeam(attacker) != 2)) { return Plugin_Handled; } @@ -22352,7 +28505,7 @@ void OnPlayerTakeDamagePost(int victim, int attacker, int inflictor, float damag } else if (bIsInfected(victim) || bIsCommonInfected(victim) || bIsWitch(victim)) { - if (bIsSurvivor(attacker) && g_esGeneral.g_iInfectedHealth[victim] > GetEntProp(victim, Prop_Data, "m_iHealth")) + if (bIsSurvivor(attacker) && g_esGeneral.g_iCommonHealth[victim] > GetEntProp(victim, Prop_Data, "m_iHealth")) { vLifeLeech(attacker, 5, damagetype, victim); } @@ -22367,34 +28520,95 @@ void OnPlayerTakeDamagePost(int victim, int attacker, int inflictor, float damag { g_esPlayer[victim].g_iLastFireAttacker = 0; } + + if (g_esTankCache[victim].g_iPassiveHealth != 0 && g_esTankCache[victim].g_flPassiveDelay > 0.0 && g_esTankCache[victim].g_flPassiveInterval > 0.0 && !g_esPlayer[victim].g_bPassive) + { + delete g_esPlayer[victim].g_hPassiveTimer[0]; + delete g_esPlayer[victim].g_hPassiveTimer[1]; + + g_esPlayer[victim].g_bPassive = true; + g_esPlayer[victim].g_hPassiveTimer[0] = CreateTimer(g_esTankCache[victim].g_flPassiveDelay, tTimerDelayPassive, GetClientUserId(victim), TIMER_FLAG_NO_MAPCHANGE); + + CreateTimer(3.0, tTimerResetPassiveDelay, GetClientUserId(victim), TIMER_FLAG_NO_MAPCHANGE); + } + } + } + } +} + +// PreThinkPost hooks + +void OnInfectedRainbowPreThinkPost(int infected) +{ + if (!bIsValidEntity(infected) || !g_esInfected[infected].g_bRainbowColor || (g_esGeneral.g_iGraphicsLevel <= 2 && g_esGeneral.g_cvMTGraphicsLevel.IntValue <= 2)) + { + g_esInfected[infected].g_bRainbowColor = false; + + SDKUnhook(infected, SDKHook_PreThinkPost, OnTankRainbowPreThinkPost); + + return; + } + + bool bHook = false; + float flCurrentTime = GetGameTime(); + int iColor[4] = {0, 0, 0, 0}; + GetEntityRenderColor(infected, iColor[0], iColor[1], iColor[2], iColor[3]); + iColor[0] = RoundToNearest((Cosine((flCurrentTime * 1.0) + infected) * 127.5) + 127.5); + iColor[1] = RoundToNearest((Cosine((flCurrentTime * 1.0) + infected + 2) * 127.5) + 127.5); + iColor[2] = RoundToNearest((Cosine((flCurrentTime * 1.0) + infected + 4) * 127.5) + 127.5); + if (bIsCommonInfected(infected) || bIsWitch(infected)) + { + bool bRainbow = StrEqual(g_esInfectedCache[infected].g_sSkinColor, "rainbow", false); + if (!g_bSecondGame && bRainbow) + { + bHook = true; + + SetEntityRenderColor(infected, iColor[0], iColor[1], iColor[2], iColor[3]); + } + + if (g_bSecondGame && g_esInfectedCache[infected].g_iGlowEnabled == 1) + { + bRainbow = StrEqual(g_esInfectedCache[infected].g_sGlowColor, "rainbow", false); + if (bRainbow) + { + bHook = true; + g_esInfectedCache[infected].g_iGlowColor[0] = iColor[0]; + g_esInfectedCache[infected].g_iGlowColor[1] = iColor[1]; + g_esInfectedCache[infected].g_iGlowColor[2] = iColor[2]; + vSetInfectedGlow(infected); } } } + + if (!bHook) + { + g_esInfected[infected].g_bRainbowColor = false; + + SDKUnhook(infected, SDKHook_PreThinkPost, OnInfectedRainbowPreThinkPost); + } } -// PreThinkPost hooks - -void OnRainbowPreThinkPost(int player) +void OnTankRainbowPreThinkPost(int player) { - if (!bIsValidClient(player) || !g_esPlayer[player].g_bRainbowColor) + if (!bIsValidClient(player) || !g_esPlayer[player].g_bRainbowColor || (g_esGeneral.g_iGraphicsLevel <= 2 && g_esGeneral.g_cvMTGraphicsLevel.IntValue <= 2)) { g_esPlayer[player].g_bRainbowColor = false; - SDKUnhook(player, SDKHook_PreThinkPost, OnRainbowPreThinkPost); + SDKUnhook(player, SDKHook_PreThinkPost, OnTankRainbowPreThinkPost); return; } bool bHook = false, bRainbow = false; float flCurrentTime = GetGameTime(); - int iColor[4]; + int iColor[4] = {0, 0, 0, 0}; GetEntityRenderColor(player, iColor[0], iColor[1], iColor[2], iColor[3]); iColor[0] = RoundToNearest((Cosine((flCurrentTime * 1.0) + player) * 127.5) + 127.5); iColor[1] = RoundToNearest((Cosine((flCurrentTime * 1.0) + player + 2) * 127.5) + 127.5); iColor[2] = RoundToNearest((Cosine((flCurrentTime * 1.0) + player + 4) * 127.5) + 127.5); if (bIsSurvivor(player)) { - bool bDeveloper = bIsDeveloper(player, 0); + bool bDeveloper = bIsDeveloper(player, 1); if (g_esPlayer[player].g_bApplyVisuals[0] && g_esPlayer[player].g_flVisualTime[0] != -1.0 && g_esPlayer[player].g_flVisualTime[0] > flCurrentTime && StrEqual(g_esPlayer[player].g_sScreenColor, "rainbow", false)) { g_esPlayer[player].g_iScreenColorVisual[0] = iColor[0]; @@ -22453,7 +28667,7 @@ void OnRainbowPreThinkPost(int player) } else if (bIsInfected(player)) { - bRainbow = StrEqual(g_esCache[player].g_sSkinColor, "rainbow", false); + bRainbow = StrEqual(g_esTankCache[player].g_sSkinColor, "rainbow", false); if (bRainbow) { bHook = true; @@ -22461,24 +28675,24 @@ void OnRainbowPreThinkPost(int player) SetEntityRenderColor(player, iColor[0], iColor[1], iColor[2], iColor[3]); } - if (g_bSecondGame && g_esCache[player].g_iGlowEnabled == 1 && !g_esPlayer[player].g_bVomited) + if (g_bSecondGame && g_esTankCache[player].g_iGlowEnabled == 1 && !g_esPlayer[player].g_bVomited) { - bRainbow = StrEqual(g_esCache[player].g_sGlowColor, "rainbow", false); + bRainbow = StrEqual(g_esTankCache[player].g_sGlowColor, "rainbow", false); if (bRainbow) { bHook = true; - g_esCache[player].g_iGlowColor[0] = iColor[0]; - g_esCache[player].g_iGlowColor[1] = iColor[1]; - g_esCache[player].g_iGlowColor[2] = iColor[2]; + g_esTankCache[player].g_iGlowColor[0] = iColor[0]; + g_esTankCache[player].g_iGlowColor[1] = iColor[1]; + g_esTankCache[player].g_iGlowColor[2] = iColor[2]; vSetTankGlow(player); } } bool bRainbow2[4]; - bRainbow2[0] = StrEqual(g_esCache[player].g_sOzTankColor, "rainbow", false); - bRainbow2[1] = StrEqual(g_esCache[player].g_sFlameColor, "rainbow", false); - bRainbow2[2] = StrEqual(g_esCache[player].g_sTireColor, "rainbow", false); - bRainbow2[3] = StrEqual(g_esCache[player].g_sRockColor, "rainbow", false); + bRainbow2[0] = StrEqual(g_esTankCache[player].g_sOzTankColor, "rainbow", false); + bRainbow2[1] = StrEqual(g_esTankCache[player].g_sFlameColor, "rainbow", false); + bRainbow2[2] = StrEqual(g_esTankCache[player].g_sTireColor, "rainbow", false); + bRainbow2[3] = StrEqual(g_esTankCache[player].g_sRockColor, "rainbow", false); int iProp = -1; if (bIsTank(player)) @@ -22542,7 +28756,7 @@ void OnRainbowPreThinkPost(int player) } } - bRainbow = StrEqual(g_esCache[player].g_sPropTankColor, "rainbow", false); + bRainbow = StrEqual(g_esTankCache[player].g_sPropTankColor, "rainbow", false); if (bRainbow && bIsValidEntRef(g_esPlayer[player].g_iPropaneTank)) { bHook = true; @@ -22553,7 +28767,7 @@ void OnRainbowPreThinkPost(int player) } } - bRainbow = StrEqual(g_esCache[player].g_sFlashlightColor, "rainbow", false); + bRainbow = StrEqual(g_esTankCache[player].g_sFlashlightColor, "rainbow", false); if (bRainbow && bIsValidEntRef(g_esPlayer[player].g_iFlashlight)) { bHook = true; @@ -22585,7 +28799,7 @@ void OnRainbowPreThinkPost(int player) { g_esPlayer[player].g_bRainbowColor = false; - SDKUnhook(player, SDKHook_PreThinkPost, OnRainbowPreThinkPost); + SDKUnhook(player, SDKHook_PreThinkPost, OnTankRainbowPreThinkPost); } } @@ -22616,7 +28830,7 @@ void OnSpeedPreThinkPost(int survivor) } bool bDeveloper = bIsDeveloper(survivor, 5); - if (bDeveloper || (g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_SPEEDBOOST)) + if (bDeveloper || (g_esShooter[survivor].g_iTotalPassives & MT_PASSIVE_SPEEDBOOST) || (g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_SPEEDBOOST)) { float flSpeed = (bDeveloper && g_esDeveloper[survivor].g_flDevSpeedBoost > g_esPlayer[survivor].g_flSpeedBoost) ? g_esDeveloper[survivor].g_flDevSpeedBoost : g_esPlayer[survivor].g_flSpeedBoost; @@ -22670,7 +28884,7 @@ void OnSurvivorPostThinkPost(int survivor) { case true: { - if (bIsDeveloper(survivor, 6) || (g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_ATTACKBOOST)) + if (bIsDeveloper(survivor, 6) || (((g_esShooter[survivor].g_iTotalPassives & MT_PASSIVE_ATTACKBOOST) || (g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_ATTACKBOOST)) && g_esPlayer[survivor].g_iFastRecovery == 1)) { bool bFast = false; if (g_bSecondGame) @@ -22681,14 +28895,14 @@ void OnSurvivorPostThinkPost(int survivor) switch (sModel[29]) { - case 'b': bFast = iSequence == 620 || (627 <= iSequence <= 630) || iSequence == 667 || iSequence == 671 || iSequence == 672 || iSequence == 680; - case 'd': bFast = iSequence == 629 || (635 <= iSequence <= 638) || iSequence == 664 || iSequence == 678 || iSequence == 679 || iSequence == 687; - case 'c': bFast = iSequence == 621 || (627 <= iSequence <= 630) || iSequence == 656 || iSequence == 660 || iSequence == 661 || iSequence == 669; - case 'h': bFast = iSequence == 625 || (632 <= iSequence <= 635) || iSequence == 671 || iSequence == 675 || iSequence == 676 || iSequence == 684; - case 'v': bFast = iSequence == 528 || (535 <= iSequence <= 538) || iSequence == 759 || iSequence == 763 || iSequence == 764 || iSequence == 772; - case 'n': bFast = iSequence == 537 || (544 <= iSequence <= 547) || iSequence == 809 || iSequence == 819 || iSequence == 823 || iSequence == 824; - case 'e': bFast = iSequence == 531 || (539 <= iSequence <= 541) || iSequence == 762 || iSequence == 766 || iSequence == 767 || iSequence == 775; - case 'a': bFast = iSequence == 528 || (535 <= iSequence <= 538) || iSequence == 759 || iSequence == 763 || iSequence == 764 || iSequence == 772; + case 'b': bFast = (iSequence == 620 || (627 <= iSequence <= 630) || iSequence == 667 || iSequence == 671 || iSequence == 672 || iSequence == 680); + case 'd': bFast = (iSequence == 629 || (635 <= iSequence <= 638) || iSequence == 664 || iSequence == 678 || iSequence == 679 || iSequence == 687); + case 'c': bFast = (iSequence == 621 || (627 <= iSequence <= 630) || iSequence == 656 || iSequence == 660 || iSequence == 661 || iSequence == 669); + case 'h': bFast = (iSequence == 625 || (632 <= iSequence <= 635) || iSequence == 671 || iSequence == 675 || iSequence == 676 || iSequence == 684); + case 'v': bFast = (iSequence == 528 || (535 <= iSequence <= 538) || iSequence == 759 || iSequence == 763 || iSequence == 764 || iSequence == 772); + case 'n': bFast = (iSequence == 537 || (544 <= iSequence <= 547) || iSequence == 809 || iSequence == 819 || iSequence == 823 || iSequence == 824); + case 'e': bFast = (iSequence == 531 || (539 <= iSequence <= 541) || iSequence == 762 || iSequence == 766 || iSequence == 767 || iSequence == 775); + case 'a': bFast = (iSequence == 528 || (535 <= iSequence <= 538) || iSequence == 759 || iSequence == 763 || iSequence == 764 || iSequence == 772); } } @@ -22726,7 +28940,7 @@ void OnSurvivorPostThinkPost(int survivor) void OnTankPostThinkPost(int tank) { - if (bIsInfected(tank) && g_esCache[tank].g_iSkipTaunt == 1) + if (bIsInfected(tank) && g_esTankCache[tank].g_iSkipTaunt == 1) { bool bFast = false; char sModel[40]; @@ -22774,47 +28988,65 @@ void OnTankPostThinkPost(int tank) } } -void OnEffectSpawnPost(int entity) +void OnEffectSpawnPost(int effect) { - int iAttacker = GetEntPropEnt(entity, Prop_Data, "m_hOwnerEntity"); + int iAttacker = GetEntPropEnt(effect, Prop_Data, "m_hOwnerEntity"); if (bIsValidClient(iAttacker, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_ALIVE)) { - g_esGeneral.g_iTeamID[entity] = GetClientTeam(iAttacker); + g_esGeneral.g_iOwnerID[effect] = iAttacker; + g_esGeneral.g_iTeamID[effect] = GetClientTeam(iAttacker); - if (bIsSurvivor(iAttacker) && (bIsDeveloper(iAttacker, 4) || ((g_esPlayer[iAttacker].g_iRewardTypes & MT_REWARD_DAMAGEBOOST) && g_esPlayer[iAttacker].g_iFriendlyFire == 1))) + if (bIsSurvivor(iAttacker) && (bIsDeveloper(iAttacker, 4) || (((g_esShooter[iAttacker].g_iTotalPassives & MT_PASSIVE_DAMAGEBOOST) || (g_esPlayer[iAttacker].g_iRewardTypes & MT_REWARD_DAMAGEBOOST)) && g_esPlayer[iAttacker].g_iFriendlyFire == 1))) { - g_esGeneral.g_iTeamID2[entity] = g_esGeneral.g_iTeamID[entity]; + g_esGeneral.g_iOwnerID[effect] = g_esGeneral.g_iOwnerID2[effect]; + g_esGeneral.g_iTeamID2[effect] = g_esGeneral.g_iTeamID[effect]; } } } -void OnInfectedSpawnPost(int entity) +void OnInfectedSpawnPost(int infected) { - if (bIsValidEntity(entity)) + if (bIsValidEntity(infected)) { - SDKHook(entity, SDKHook_OnTakeDamage, OnInfectedTakeDamage); - SDKHook(entity, SDKHook_OnTakeDamage, OnPlayerTakeDamage); - SDKHook(entity, SDKHook_OnTakeDamagePost, OnPlayerTakeDamagePost); + vMutateInfected(infected); + SDKHook(infected, SDKHook_OnTakeDamage, OnInfectedTakeDamage); + SDKHook(infected, SDKHook_OnTakeDamage, OnPlayerTakeDamage); + SDKHook(infected, SDKHook_OnTakeDamagePost, OnPlayerTakeDamagePost); + CreateTimer(1.0, tTimerResizeInfected, EntIndexToEntRef(infected), TIMER_FLAG_NO_MAPCHANGE); } } -void OnPipeBombSpawn(int entity) +void OnPipeBombSpawn(int bomb) { - RequestFrame(vPipeBombSpawnFrame, EntIndexToEntRef(entity)); + RequestFrame(vPipeBombSpawnFrame, EntIndexToEntRef(bomb)); } -void OnPropSpawnPost(int entity) +void OnPropSpawnPost(int prop) { char sModel[64]; - GetEntPropString(entity, Prop_Data, "m_ModelName", sModel, sizeof sModel); + GetEntPropString(prop, Prop_Data, "m_ModelName", sModel, sizeof sModel); if (StrEqual(sModel, MODEL_OXYGENTANK) || StrEqual(sModel, MODEL_PROPANETANK) || StrEqual(sModel, MODEL_GASCAN) || (g_bSecondGame && StrEqual(sModel, MODEL_FIREWORKCRATE))) { - SDKHook(entity, SDKHook_OnTakeDamage, OnPropTakeDamage); + SDKHook(prop, SDKHook_OnTakeDamage, OnPropTakeDamage); } } // SetTransmit hooks +Action OnDeathModelSetTransmit(int entity, int client) +{ + if (g_esGeneral.g_bPluginEnabled && bIsValidClient(client) && bIsValidEntity(entity) && bIsValidEntRef(g_esShooter[client].g_iDeathModel)) + { + int iDeathModel = EntRefToEntIndex(g_esShooter[client].g_iDeathModel); + if (bIsValidEntity(iDeathModel) && iDeathModel == entity) + { + return Plugin_Continue; + } + } + + return Plugin_Handled; +} + Action OnInfectedSetTransmit(int entity, int client) { return Plugin_Handled; @@ -22822,8 +29054,13 @@ Action OnInfectedSetTransmit(int entity, int client) Action OnPropSetTransmit(int entity, int client) { +#if defined _ThirdPersonShoulder_Detect_included + bool bCheck = (g_esPlayer[client].g_bThirdPerson || g_esPlayer[client].g_bThirdPerson2); +#else + bool bCheck = g_esPlayer[client].g_bThirdPerson; +#endif int iOwner = GetEntPropEnt(entity, Prop_Data, "m_hOwnerEntity"); - if (g_esGeneral.g_bPluginEnabled && bIsValidClient(iOwner) && bIsValidClient(client) && iOwner == client && !g_esPlayer[client].g_bThirdPerson && !bIsPlayerInThirdPerson(client)) + if (g_esGeneral.g_bPluginEnabled && bIsValidClient(iOwner) && bIsValidClient(client) && iOwner == client && !bCheck && !bIsPlayerInThirdPerson(client)) { return Plugin_Handled; } @@ -22843,7 +29080,7 @@ void OnPipeBombTouch(int grenade, int other) { g_esPlayer[other].g_bStickied = true; - SetEntPropFloat(other, Prop_Send, "m_flLaggedMovementValue", (g_esGeneral.g_bLaggedMovementInstalled ? L4D_LaggedMovement(other, (g_esCache[other].g_flRunSpeed * 0.5)) : (g_esCache[other].g_flRunSpeed * 0.5))); + SetEntPropFloat(other, Prop_Send, "m_flLaggedMovementValue", (g_esGeneral.g_bLaggedMovementInstalled ? L4D_LaggedMovement(other, (g_esTankCache[other].g_flRunSpeed * 0.5)) : (g_esTankCache[other].g_flRunSpeed * 0.5))); vSetEntityParent(grenade, other); } else if (bIsCommonInfected(other) || bIsWitch(other) || other > MaxClients) @@ -22861,13 +29098,13 @@ void OnPipeBombTouch(int grenade, int other) void OnDoorTouchPost(int client, int door) { float flCurrentTime = GetGameTime(); - if (g_esGeneral.g_bPluginEnabled && bIsSurvivor(client) && (bIsDeveloper(client, 5) || bIsDeveloper(client, 11) || ((g_esPlayer[client].g_iRewardTypes & MT_REWARD_SPEEDBOOST) && g_esPlayer[client].g_iBurstDoors == 1)) && door > MaxClients && g_esPlayer[client].g_flLastPushTime < flCurrentTime) + if (g_esGeneral.g_bPluginEnabled && bIsSurvivor(client) && (bIsDeveloper(client, 5) || bIsDeveloper(client, 11) || (((g_esShooter[client].g_iTotalPassives & MT_PASSIVE_SPEEDBOOST) || (g_esPlayer[client].g_iRewardTypes & MT_REWARD_SPEEDBOOST)) && g_esPlayer[client].g_iBurstDoors == 1)) && door > MaxClients && g_esPlayer[client].g_flLastPushTime < flCurrentTime) { char sClassname[32]; GetEntityClassname(door, sClassname, sizeof sClassname); if (!strncmp(sClassname, "prop_door_rotating", 18) && GetEntProp(door, Prop_Data, "m_eDoorState") == 0) { - g_esPlayer[client].g_flLastPushTime = flCurrentTime + 0.5; + g_esPlayer[client].g_flLastPushTime = (flCurrentTime + 0.5); float flSpeed = GetEntPropFloat(door, Prop_Data, "m_flSpeed"), flTempSpeed = GetEntPropFloat(client, Prop_Send, "m_flLaggedMovementValue") * 200.0; SetEntPropFloat(door, Prop_Data, "m_flSpeed", flTempSpeed); @@ -22892,30 +29129,38 @@ void OnWeaponEquipPost(int client, int weapon) { vCheckGunClipSizes(client); vRefreshLaserSight(client); + GetEntityClassname(weapon, g_esPlayer[client].g_sWeaponCurrent, sizeof esPlayer::g_sWeaponCurrent); - char sWeapon[32]; - GetEntityClassname(weapon, sWeapon, sizeof sWeapon); if (GetPlayerWeaponSlot(client, 2) == weapon) { - strcopy(g_esPlayer[client].g_sStoredThrowable, sizeof esPlayer::g_sStoredThrowable, sWeapon); + strcopy(g_esPlayer[client].g_sStoredThrowable, sizeof esPlayer::g_sStoredThrowable, g_esPlayer[client].g_sWeaponCurrent); } else if (GetPlayerWeaponSlot(client, 3) == weapon) { - strcopy(g_esPlayer[client].g_sStoredMedkit, sizeof esPlayer::g_sStoredMedkit, sWeapon); + strcopy(g_esPlayer[client].g_sStoredMedkit, sizeof esPlayer::g_sStoredMedkit, g_esPlayer[client].g_sWeaponCurrent); } else if (GetPlayerWeaponSlot(client, 4) == weapon) { - strcopy(g_esPlayer[client].g_sStoredPills, sizeof esPlayer::g_sStoredPills, sWeapon); + strcopy(g_esPlayer[client].g_sStoredPills, sizeof esPlayer::g_sStoredPills, g_esPlayer[client].g_sWeaponCurrent); } +#if defined _WeaponHandling_included + vToggleWeaponPassive(client, weapon); +#endif } } void OnWeaponSwitchPost(int client, int weapon) { - if (g_esGeneral.g_bPluginEnabled && g_bSecondGame && bIsSurvivor(client) && bIsDeveloper(client, 2) && weapon > MaxClients) + if (g_esGeneral.g_bPluginEnabled && bIsSurvivor(client) && weapon > MaxClients) { - vRefreshLaserSight(client); - RequestFrame(vWeaponSkinFrame, GetClientUserId(client)); + if (g_bSecondGame && bIsDeveloper(client, 2)) + { + vRefreshLaserSight(client); + RequestFrame(vWeaponSkinFrame, GetClientUserId(client)); + } +#if defined _WeaponHandling_included + vToggleWeaponPassive(client, weapon); +#endif } } @@ -22931,7 +29176,7 @@ Action BlockSoundHook(int clients[MAXPLAYERS], int &numClients, char sample[PLAT iIndex = iGetPatchIndex("MTPatch_DoJumpHeight"); } - if (g_esPlayer[entity].g_iFallPasses > 0 || (iIndex != -1 && g_esPatch[iIndex].g_iType == 2) || bIsDeveloper(entity, 5) || bIsDeveloper(entity, 11) || (g_esPlayer[entity].g_iRewardTypes & MT_REWARD_SPEEDBOOST) || (g_esPlayer[entity].g_iRewardTypes & MT_REWARD_GODMODE)) + if (g_esPlayer[entity].g_iFallPasses > 0 || (iIndex != -1 && g_esPatch[iIndex].g_iType == 2) || bIsDeveloper(entity, 5) || bIsDeveloper(entity, 11) || (g_esShooter[entity].g_iTotalPassives & MT_PASSIVE_SPEEDBOOST) || (g_esPlayer[entity].g_iRewardTypes & MT_REWARD_SPEEDBOOST) || (((g_esShooter[entity].g_iTotalPassives & MT_PASSIVE_GODMODE) || (g_esPlayer[entity].g_iRewardTypes & MT_REWARD_GODMODE)) && g_esPlayer[entity].g_iRiotGear == 1)) { float flOrigin[3]; GetEntPropVector(entity, Prop_Data, "m_vecOrigin", flOrigin); @@ -22952,7 +29197,7 @@ Action BlockSoundHook(int clients[MAXPLAYERS], int &numClients, char sample[PLAT if (channel == SNDCHAN_VOICE) { - bool bDeveloper = bIsDeveloper(entity, 0) || bIsDeveloper(entity, 2) || bIsDeveloper(entity, 11); + bool bDeveloper = bIsDeveloper(entity, 2) || bIsDeveloper(entity, 11); if (bDeveloper || (g_esPlayer[entity].g_iRewardVisuals & MT_VISUAL_VOICEPITCH)) { int iPitch = (bDeveloper && g_esDeveloper[entity].g_iDevVoicePitch > 0) ? g_esDeveloper[entity].g_iDevVoicePitch : g_esPlayer[entity].g_iVoicePitch; @@ -23030,7 +29275,7 @@ Action umUpgradeDescription(UserMsg msg_id, BfRead msg, const int[] players, int char sMessage[255]; msg.ReadString(sMessage, sizeof sMessage, true); - if (StrContains(sMessage, "laser_sight_expire") != -1 || StrContains(sMessage, "_expire") != -1 || (StrContains(sMessage, "#L4D_Upgrade_") !=-1 && StrContains(sMessage, "description") !=-1)) + if (StrContains(sMessage, "laser_sight_expire") != -1 || StrContains(sMessage, "_expire") != -1 || (StrContains(sMessage, "#L4D_Upgrade_") != -1 && StrContains(sMessage, "description") != -1)) { return Plugin_Handled; } @@ -23398,11 +29643,11 @@ MRESReturn mreActionCompletePre(int pThis, DHookParam hParams) if (g_esGeneral.g_cvMTFirstAidHealPercent != null) { int iSurvivor = hParams.IsNull(1) ? 0 : hParams.Get(1), iTeammate = hParams.IsNull(2) ? 0 : hParams.Get(2); - if (bIsSurvivor(iSurvivor) && (bIsDeveloper(iSurvivor, 6) || (g_esPlayer[iSurvivor].g_iRewardTypes & MT_REWARD_HEALTH))) + if (bIsSurvivor(iSurvivor) && (bIsDeveloper(iSurvivor, 6) || (g_esShooter[iSurvivor].g_iTotalPassives & MT_PASSIVE_HEALTH) || (g_esPlayer[iSurvivor].g_iRewardTypes & MT_REWARD_HEALTH))) { vSetHealPercentCvar(false, iSurvivor); } - else if (bIsSurvivor(iTeammate) && (bIsDeveloper(iTeammate, 6) || (g_esPlayer[iTeammate].g_iRewardTypes & MT_REWARD_HEALTH))) + else if (bIsSurvivor(iTeammate) && (bIsDeveloper(iTeammate, 6) || (g_esShooter[iTeammate].g_iTotalPassives & MT_PASSIVE_HEALTH) || (g_esPlayer[iTeammate].g_iRewardTypes & MT_REWARD_HEALTH))) { vSetHealPercentCvar(false, iTeammate); } @@ -23424,10 +29669,10 @@ MRESReturn mreActionCompletePost(int pThis, DHookParam hParams) MRESReturn mreActivateAbilityPre(int pThis) { int iSpecial = !bIsValidEntity(pThis) ? 0 : GetEntPropEnt(pThis, Prop_Send, "m_owner"); - if (bIsInfected(iSpecial) && g_esCache[iSpecial].g_iThrowRock == 1) + if (bIsInfected(iSpecial) && g_esTankCache[iSpecial].g_iThrowRock == 1) { char sDamage[11]; - float flDamage = bIsTank(iSpecial) ? g_esCache[iSpecial].g_flRockDamage : g_esCache[iSpecial].g_flPinDamage; + float flDamage = bIsTank(iSpecial) ? g_esTankCache[iSpecial].g_flRockDamage : g_esTankCache[iSpecial].g_flPinDamage; IntToString(RoundToNearest(MT_GetScaledDamage(flDamage)), sDamage, sizeof sDamage); float flPos[3], flAngles[3]; @@ -23492,9 +29737,16 @@ MRESReturn mreBaseEntityGetGroundEntityPre(int pThis, DHookReturn hReturn) MRESReturn mreBeginChangeLevelPre(int pThis, DHookParam hParams) { - if (bIsSurvivor(pThis) && g_esPlayer[pThis].g_iRewardTypes > 0) + if (bIsSurvivor(pThis)) { - vEndRewards(pThis, true); + if (g_esShooter[pThis].g_iTotalPassives > 0 && g_esPlayer[pThis].g_iRewardTypes <= 0) + { + vEndPassives(pThis, true); + } + else if (g_esPlayer[pThis].g_iRewardTypes > 0 && g_esShooter[pThis].g_iTotalPassives <= 0) + { + vEndRewards(pThis, true); + } } return MRES_Ignored; @@ -23510,7 +29762,7 @@ MRESReturn mreCanDeployForPre(int pThis, DHookReturn hReturn, DHookParam hParams case false: iSurvivor = !bIsValidEntity(pThis) ? 0 : GetEntPropEnt(pThis, Prop_Send, "m_hOwner"); } - if (bIsSurvivor(iSurvivor) && (bIsDeveloper(iSurvivor, 6) || ((g_esPlayer[iSurvivor].g_iRewardTypes & MT_REWARD_ATTACKBOOST) && g_esPlayer[iSurvivor].g_iLadderActions == 1))) + if (bIsSurvivor(iSurvivor) && (bIsDeveloper(iSurvivor, 6) || (((g_esShooter[iSurvivor].g_iTotalPassives & MT_PASSIVE_ATTACKBOOST) || (g_esPlayer[iSurvivor].g_iRewardTypes & MT_REWARD_ATTACKBOOST)) && g_esPlayer[iSurvivor].g_iLadderActions == 1))) { static int iIndex = -1; if (iIndex == -1) @@ -23560,7 +29812,7 @@ MRESReturn mreCheckJumpButtonPost(Address pThis, DHookReturn hReturn) MRESReturn mreDeathFallCameraEnablePre(int pThis, DHookParam hParams) { int iSurvivor = hParams.IsNull(1) ? 0 : hParams.Get(1); - if (bIsSurvivor(iSurvivor) && (bIsDeveloper(iSurvivor, 5) || bIsDeveloper(iSurvivor, 11) || (g_esPlayer[iSurvivor].g_iRewardTypes & MT_REWARD_SPEEDBOOST) || (g_esPlayer[iSurvivor].g_iRewardTypes & MT_REWARD_GODMODE)) && g_esPlayer[iSurvivor].g_bFalling) + if (bIsSurvivor(iSurvivor) && (bIsDeveloper(iSurvivor, 5) || bIsDeveloper(iSurvivor, 11) || (g_esShooter[iSurvivor].g_iTotalPassives & MT_PASSIVE_SPEEDBOOST) || (g_esPlayer[iSurvivor].g_iRewardTypes & MT_REWARD_SPEEDBOOST) || (((g_esShooter[iSurvivor].g_iTotalPassives & MT_PASSIVE_GODMODE) || (g_esPlayer[iSurvivor].g_iRewardTypes & MT_REWARD_GODMODE)) && g_esPlayer[iSurvivor].g_iRiotGear == 1)) && g_esPlayer[iSurvivor].g_bFalling) { g_esPlayer[iSurvivor].g_bFatalFalling = true; @@ -23579,7 +29831,7 @@ MRESReturn mreDeathFallCameraEnablePre(int pThis, DHookParam hParams) MRESReturn mreDoAnimationEventPre(int pThis, DHookParam hParams) { - if (bIsSurvivor(pThis) && (bIsDeveloper(pThis, 6) || (g_esPlayer[pThis].g_iRewardTypes & MT_REWARD_ATTACKBOOST))) + if (bIsSurvivor(pThis) && (bIsDeveloper(pThis, 6) || (((g_esShooter[pThis].g_iTotalPassives & MT_PASSIVE_ATTACKBOOST) || (g_esPlayer[pThis].g_iRewardTypes & MT_REWARD_ATTACKBOOST)) && g_esPlayer[pThis].g_iFastRecovery == 1))) { int iAnim = hParams.Get(1); if (iAnim == MT_ANIM_TANKPUNCHED || iAnim == MT_ANIM_LANDING) @@ -23600,35 +29852,32 @@ MRESReturn mreDoJumpPre(Address pThis, DHookParam hParams) if (bIsSurvivor(iSurvivor)) { bool bDeveloper = bIsDeveloper(iSurvivor, 5); - if (bDeveloper || (g_esPlayer[iSurvivor].g_iRewardTypes & MT_REWARD_SPEEDBOOST)) + if ((bDeveloper || (((g_esShooter[iSurvivor].g_iTotalPassives & MT_PASSIVE_SPEEDBOOST) || (g_esPlayer[iSurvivor].g_iRewardTypes & MT_REWARD_SPEEDBOOST)) && g_esPlayer[iSurvivor].g_flJumpHeight > 0.0)) && !g_esGeneral.g_bPatchJumpHeight) { - if (!g_esGeneral.g_bPatchJumpHeight) + float flHeight = (bDeveloper && g_esDeveloper[iSurvivor].g_flDevJumpHeight > g_esPlayer[iSurvivor].g_flJumpHeight) ? g_esDeveloper[iSurvivor].g_flDevJumpHeight : g_esPlayer[iSurvivor].g_flJumpHeight; + if (flHeight > 0.0) { - float flHeight = (bDeveloper && g_esDeveloper[iSurvivor].g_flDevJumpHeight > g_esPlayer[iSurvivor].g_flJumpHeight) ? g_esDeveloper[iSurvivor].g_flDevJumpHeight : g_esPlayer[iSurvivor].g_flJumpHeight; - if (flHeight > 0.0) - { - g_esGeneral.g_bPatchJumpHeight = true; + g_esGeneral.g_bPatchJumpHeight = true; - switch (!g_bSecondGame && g_esGeneral.g_iPlatformType == 2) + switch (!g_bSecondGame && g_esGeneral.g_iPlatformType == 2) + { + case true: { - case true: - { - g_esGeneral.g_adOriginalJumpHeight[0] = LoadFromAddress(g_esGeneral.g_adDoJumpValue, NumberType_Int32); - StoreToAddress(g_esGeneral.g_adDoJumpValue, view_as(flHeight), NumberType_Int32, g_esGeneral.g_bUpdateDoJumpMemAccess); - g_esGeneral.g_bUpdateDoJumpMemAccess = false; - } - case false: - { - g_esGeneral.g_adOriginalJumpHeight[1] = LoadFromAddress(g_esGeneral.g_adDoJumpValue, NumberType_Int32); - g_esGeneral.g_adOriginalJumpHeight[0] = LoadFromAddress((g_esGeneral.g_adDoJumpValue + view_as

    (4)), NumberType_Int32); + g_esGeneral.g_adOriginalJumpHeight[0] = LoadFromAddress(g_esGeneral.g_adDoJumpValue, NumberType_Int32); + StoreToAddress(g_esGeneral.g_adDoJumpValue, view_as(flHeight), NumberType_Int32, g_esGeneral.g_bUpdateDoJumpMemAccess); + g_esGeneral.g_bUpdateDoJumpMemAccess = false; + } + case false: + { + g_esGeneral.g_adOriginalJumpHeight[1] = LoadFromAddress(g_esGeneral.g_adDoJumpValue, NumberType_Int32); + g_esGeneral.g_adOriginalJumpHeight[0] = LoadFromAddress((g_esGeneral.g_adDoJumpValue + view_as
    (4)), NumberType_Int32); - int iDouble[2]; - vGetDoubleFromFloat(flHeight, iDouble); - StoreToAddress(g_esGeneral.g_adDoJumpValue, iDouble[1], NumberType_Int32, g_esGeneral.g_bUpdateDoJumpMemAccess); - StoreToAddress((g_esGeneral.g_adDoJumpValue + view_as
    (4)), iDouble[0], NumberType_Int32, g_esGeneral.g_bUpdateDoJumpMemAccess); + int iDouble[2]; + vGetDoubleFromFloat(flHeight, iDouble); + StoreToAddress(g_esGeneral.g_adDoJumpValue, iDouble[1], NumberType_Int32, g_esGeneral.g_bUpdateDoJumpMemAccess); + StoreToAddress((g_esGeneral.g_adDoJumpValue + view_as
    (4)), iDouble[0], NumberType_Int32, g_esGeneral.g_bUpdateDoJumpMemAccess); - g_esGeneral.g_bUpdateDoJumpMemAccess = false; - } + g_esGeneral.g_bUpdateDoJumpMemAccess = false; } } } @@ -23692,6 +29941,68 @@ MRESReturn mreEventKilledPre(int pThis, DHookParam hParams) g_esPlayer[pThis].g_bLastLife[1] = false; g_esPlayer[pThis].g_iReviveCount = 0; + GetClientAbsOrigin(pThis, g_esPlayer[pThis].g_flLastPosition); + + if (!g_esPlayer[pThis].g_bFinalFall && g_esShooter[pThis].g_iFirstType > 0) + { + bool bHuman = bIsValidClient(pThis, MT_CHECK_FAKECLIENT); + int iEnabled = (bHuman ? g_esSurvivorCache[pThis].g_iCarrierEnabled : g_esSurvivorCache[pThis].g_iCarrierBots); + if (iEnabled > 0 && GetRandomFloat(0.1, 100.0) <= g_esSurvivorCache[pThis].g_flCarrierChance) + { + float flDelay = flClamp(g_esSurvivorCache[pThis].g_flCarrierDelay, 0.1); + int iUserID = GetClientUserId(pThis); + g_esShooter[pThis].g_bSurvivor = true; + g_esShooter[pThis].g_bDeathModel = !!g_esSurvivorCache[pThis].g_iCarrierBody; + g_esShooter[pThis].g_bMixTypes = !!g_esSurvivorCache[pThis].g_iCarrierMix; + g_esShooter[pThis].g_flDamageMultiplier = g_esSurvivorCache[pThis].g_flCarrierDamageMultiplier; + g_esShooter[pThis].g_flDeathModelDelay = flDelay; + g_esShooter[pThis].g_flHealthMultiplier = g_esSurvivorCache[pThis].g_flCarrierHealthMultiplier; + g_esShooter[pThis].g_iCharacter = g_esShooter[pThis].g_iCharacterType[1]; + + switch (bHuman) + { + case true: + { + char sName[33]; + GetClientName(pThis, sName, sizeof sName); + strcopy(g_esShooter[pThis].g_sSurvivorName, sizeof esShooter::g_sSurvivorName, sName); + } + case false: + { + int iCharacter = (g_bSecondGame ? g_esShooter[pThis].g_iCharacter : (g_esShooter[pThis].g_iCharacter + 4)); + strcopy(g_esShooter[pThis].g_sSurvivorName, sizeof esShooter::g_sSurvivorName, g_sSurvivorNames[iCharacter]); + } + } + + if (bIsInfected(iAttacker, MT_CHECK_INDEX|MT_CHECK_INGAME)) + { + g_esShooter[pThis].g_iKillerSpecial = g_esPlayer[iAttacker].g_iInfectedType; + g_esShooter[pThis].g_iKillerType = g_esPlayer[iAttacker].g_iTankType; + } + + float flPos[3], flAngles[3]; + GetClientEyePosition(pThis, flPos); + GetClientEyeAngles(pThis, flAngles); + + DataPack dpInfection; + CreateDataTimer(flDelay, tTimerInfectSurvivor, dpInfection, TIMER_FLAG_NO_MAPCHANGE); + dpInfection.WriteCell(iUserID); + dpInfection.WriteCell(g_esSurvivorCache[pThis].g_iCarrierFilter); + dpInfection.WriteCell(g_esSurvivorCache[pThis].g_iCarrierMix); + dpInfection.WriteCell(g_esSurvivorCache[pThis].g_iCarrierMode); + dpInfection.WriteCell(g_esSurvivorCache[pThis].g_iCarrierTeleport); + dpInfection.WriteCell(g_esSurvivorCache[pThis].g_iCarrierMinType); + dpInfection.WriteCell(g_esSurvivorCache[pThis].g_iCarrierMaxType); + dpInfection.WriteCell(g_esSurvivorCache[pThis].g_iCarrierVoice); + dpInfection.WriteFloat(g_esSurvivorCache[pThis].g_flCarrierVoiceChance); + dpInfection.WriteFloat(g_esSurvivorCache[pThis].g_flCarrierVoiceInterval); + dpInfection.WriteString(g_esSurvivorCache[pThis].g_sCarrierAttackVoicelines); + dpInfection.WriteString(g_esSurvivorCache[pThis].g_sCarrierBaitVoicelines); + dpInfection.WriteFloatArray(flPos, sizeof flPos); + dpInfection.WriteFloatArray(flAngles, sizeof flAngles); + } + } + vResetSurvivorStats(pThis, true); vSaveSurvivorWeapons(pThis); SetEntPropFloat(pThis, Prop_Send, "m_flLaggedMovementValue", 1.0); @@ -23722,12 +30033,12 @@ MRESReturn mreEventKilledPre(int pThis, DHookParam hParams) g_esGeneral.g_iSpecialCount--; } - if (bIsSurvivor(iAttacker) && (bIsDeveloper(iAttacker, 10) || ((g_esPlayer[iAttacker].g_iRewardTypes & MT_REWARD_GODMODE) && g_esPlayer[iAttacker].g_iCleanKills == 1))) + if (bIsSurvivor(iAttacker) && (bIsDeveloper(iAttacker, 10) || (((g_esShooter[iAttacker].g_iTotalPassives & MT_PASSIVE_GODMODE) || (g_esPlayer[iAttacker].g_iRewardTypes & MT_REWARD_GODMODE)) && g_esPlayer[iAttacker].g_iCleanKills == 1))) { bool bBoomer = bIsBoomer(pThis, MT_CHECK_INDEX|MT_CHECK_INGAME), bSmoker = bIsSmoker(pThis, MT_CHECK_INDEX|MT_CHECK_INGAME); char sName[32]; static int iIndex[11] = {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}; - int iLimit = g_bSecondGame ? 6 : 3; + int iLimit = (g_bSecondGame ? 6 : 3); for (int iPos = 0; iPos < (sizeof iIndex); iPos++) { if (bBoomer && iPos < iLimit) @@ -23773,10 +30084,24 @@ MRESReturn mreEventKilledPre(int pThis, DHookParam hParams) } } - if (bIsInfectedSupported(pThis) && bIsCustomTankSupported(pThis)) + if (bIsSpecialSupported(pThis) && bIsCustomTankSupported(pThis)) { vCombineAbilitiesForward(pThis, MT_COMBO_UPONDEATH); } + + if (g_esShooter[pThis].g_bDeathModel && g_esShooter[pThis].g_iDeathModel != INVALID_ENT_REFERENCE) + { + int iDeathModel = EntRefToEntIndex(g_esShooter[pThis].g_iDeathModel); + if (bIsValidEntity(iDeathModel)) + { + float flPos[3]; + GetClientAbsOrigin(pThis, flPos); + TeleportEntity(iDeathModel, flPos); + SDKUnhook(iDeathModel, SDKHook_SetTransmit, OnDeathModelSetTransmit); + } + } + + vRemoveInfection(pThis); } Call_StartForward(g_esGeneral.g_gfPlayerEventKilledForward); @@ -23791,7 +30116,7 @@ MRESReturn mreEventKilledPost(int pThis, DHookParam hParams) { char sName[32]; static int iIndex[11] = {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}; - int iLimit = g_bSecondGame ? 6 : 3; + int iLimit = (g_bSecondGame ? 6 : 3); for (int iPos = 0; iPos < (sizeof iIndex); iPos++) { if (iPos < iLimit) @@ -23840,7 +30165,7 @@ MRESReturn mreExtinguishPre(int pThis) if (bIsInfected(pThis)) { int iSurvivor = g_esPlayer[pThis].g_iLastFireAttacker; - if (bIsSurvivor(iSurvivor) && (bIsDeveloper(iSurvivor, 7) || ((g_esPlayer[iSurvivor].g_iRewardTypes & MT_REWARD_DAMAGEBOOST) && g_esPlayer[iSurvivor].g_iInextinguishableFire == 1))) + if (bIsSurvivor(iSurvivor) && (bIsDeveloper(iSurvivor, 7) || (((g_esShooter[iSurvivor].g_iTotalPassives & MT_PASSIVE_DAMAGEBOOST) || (g_esPlayer[iSurvivor].g_iRewardTypes & MT_REWARD_DAMAGEBOOST)) && g_esPlayer[iSurvivor].g_iEternalFlames == 1))) { return MRES_Supercede; } @@ -23862,7 +30187,7 @@ MRESReturn mreFallingPre(int pThis) iIndex[0] = iGetPatchIndex("MTPatch_DoJumpHeight"); } - if (((iIndex[0] != -1 && g_esPatch[iIndex[0]].g_iType == 2) || bIsDeveloper(pThis, 5) || bIsDeveloper(pThis, 11) || (g_esPlayer[pThis].g_iRewardTypes & MT_REWARD_SPEEDBOOST) || (g_esPlayer[pThis].g_iRewardTypes & MT_REWARD_GODMODE)) && !g_esGeneral.g_bPatchFallingSound) + if (((iIndex[0] != -1 && g_esPatch[iIndex[0]].g_iType == 2) || bIsDeveloper(pThis, 5) || bIsDeveloper(pThis, 11) || (g_esShooter[pThis].g_iTotalPassives & MT_PASSIVE_SPEEDBOOST) || (g_esPlayer[pThis].g_iRewardTypes & MT_REWARD_SPEEDBOOST) || (((g_esShooter[pThis].g_iTotalPassives & MT_PASSIVE_GODMODE) || (g_esPlayer[pThis].g_iRewardTypes & MT_REWARD_GODMODE)) && g_esPlayer[pThis].g_iRiotGear == 1)) && !g_esGeneral.g_bPatchFallingSound) { g_esGeneral.g_bPatchFallingSound = true; @@ -23911,7 +30236,7 @@ MRESReturn mreFallingPost(int pThis) MRESReturn mreFootstepPre(int pThis, DHookParam hParams) { - if (bIsTank(pThis) && g_esCache[pThis].g_iFootstepShake <= 0) + if (bIsTank(pThis) && g_esTankCache[pThis].g_iFootstepShake <= 0) { static int iIndex = -1; if (iIndex == -1) @@ -23949,7 +30274,7 @@ MRESReturn mreFirstSurvivorLeftSafeAreaPost(DHookParam hParams) int iSurvivor = hParams.IsNull(1) ? 0 : hParams.Get(1); if (bIsSurvivor(iSurvivor)) { - vResetTimers(true); + vResetRegularWavesTimer(true); if (bIsCoopMode() && g_esGeneral.g_iRushTypes > 0) { @@ -23967,7 +30292,7 @@ MRESReturn mreFinishHealingPre(int pThis) int iSurvivor = !bIsValidEntity(pThis) ? 0 : GetEntPropEnt(pThis, Prop_Send, "m_hOwner"); if (bIsSurvivor(iSurvivor) && g_esGeneral.g_cvMTFirstAidHealPercent != null) { - if (bIsDeveloper(iSurvivor, 6) || (g_esPlayer[iSurvivor].g_iRewardTypes & MT_REWARD_HEALTH)) + if (bIsDeveloper(iSurvivor, 6) || (g_esShooter[iSurvivor].g_iTotalPassives & MT_PASSIVE_HEALTH) || (g_esPlayer[iSurvivor].g_iRewardTypes & MT_REWARD_HEALTH)) { vSetHealPercentCvar(false, iSurvivor); } @@ -23991,7 +30316,7 @@ MRESReturn mreFireBulletPre(int pThis) int iSurvivor = !bIsValidEntity(pThis) ? 0 : GetEntPropEnt(pThis, Prop_Send, "m_hOwner"); if (bIsSurvivor(iSurvivor)) { - if (bIsDeveloper(iSurvivor, 4) || ((g_esPlayer[iSurvivor].g_iRewardTypes & MT_REWARD_DAMAGEBOOST) && g_esPlayer[iSurvivor].g_iRecoilDampener == 1) && !g_esGeneral.g_bPatchVerticalPunch) + if (bIsDeveloper(iSurvivor, 4) || (((g_esShooter[iSurvivor].g_iTotalPassives & MT_PASSIVE_DAMAGEBOOST) || (g_esPlayer[iSurvivor].g_iRewardTypes & MT_REWARD_DAMAGEBOOST)) && g_esPlayer[iSurvivor].g_iRecoilDampener == 1) && !g_esGeneral.g_bPatchVerticalPunch) { g_esGeneral.g_bPatchVerticalPunch = true; @@ -24005,11 +30330,11 @@ MRESReturn mreFireBulletPre(int pThis) } } - if (bIsDeveloper(iSurvivor, 1) || ((g_esPlayer[iSurvivor].g_iRewardTypes & MT_REWARD_DAMAGEBOOST) && g_esPlayer[iSurvivor].g_iGhostBullets == 1)) + if (bIsDeveloper(iSurvivor, 0) || (((g_esShooter[iSurvivor].g_iTotalPassives & MT_PASSIVE_DAMAGEBOOST) || (g_esPlayer[iSurvivor].g_iRewardTypes & MT_REWARD_DAMAGEBOOST)) && g_esPlayer[iSurvivor].g_iGhostBullets == 1)) { char sName[32]; static int iIndex[4] = {-1, -1, -1, -1}; - int iLimit = g_bSecondGame ? 4 : 2; + int iLimit = (g_bSecondGame ? 4 : 2); for (int iPos = 0; iPos < (sizeof iIndex); iPos++) { if (iPos < iLimit) @@ -24028,7 +30353,7 @@ MRESReturn mreFireBulletPre(int pThis) } } - if (g_bSecondGame && (bIsDeveloper(iSurvivor, 9) || ((g_esPlayer[iSurvivor].g_iRewardTypes & MT_REWARD_DAMAGEBOOST) && g_esPlayer[iSurvivor].g_iSledgehammerRounds == 1)) && g_esGeneral.g_cvMTPhysicsPushScale != null) + if (g_bSecondGame && (bIsDeveloper(iSurvivor, 9) || (((g_esShooter[iSurvivor].g_iTotalPassives & MT_PASSIVE_DAMAGEBOOST) || (g_esPlayer[iSurvivor].g_iRewardTypes & MT_REWARD_DAMAGEBOOST)) && g_esPlayer[iSurvivor].g_flSledgehammerRounds > 0.0)) && g_esGeneral.g_cvMTPhysicsPushScale != null) { g_esGeneral.g_flDefaultPhysicsPushScale = g_esGeneral.g_cvMTPhysicsPushScale.FloatValue; g_esGeneral.g_cvMTPhysicsPushScale.FloatValue = 5.0; @@ -24040,6 +30365,22 @@ MRESReturn mreFireBulletPre(int pThis) MRESReturn mreFireBulletPost(int pThis) { + bool bValid = bIsValidEntity(pThis); + int iSurvivor = !bValid ? 0 : GetEntPropEnt(pThis, Prop_Send, "m_hOwner"); + if (bIsSurvivor(iSurvivor) && bValid) + { + if (bIsDeveloper(iSurvivor, 0) || (((g_esShooter[iSurvivor].g_iTotalPassives & MT_PASSIVE_AMMO) || (g_esPlayer[iSurvivor].g_iRewardTypes & MT_REWARD_AMMO)) && GetRandomFloat(0.1, 100.0) <= g_esPlayer[iSurvivor].g_flLuckyBullet)) + { + int iClip = GetEntProp(pThis, Prop_Send, "m_iClip1"); + SetEntProp(pThis, Prop_Send, "m_iClip1", (iClip + 1)); + + if (g_bSecondGame && bHasSpecialAmmo(pThis, 0)) + { + SetEntProp(pThis, Prop_Send, "m_nUpgradedPrimaryAmmoLoaded", (iClip + 1)); + } + } + } + if (g_esGeneral.g_bPatchVerticalPunch) { g_esGeneral.g_bPatchVerticalPunch = false; @@ -24059,7 +30400,7 @@ MRESReturn mreFireBulletPost(int pThis) char sName[32]; static int iIndex[4] = {-1, -1, -1, -1}; - int iLimit = g_bSecondGame ? 4 : 2; + int iLimit = (g_bSecondGame ? 4 : 2); for (int iPos = 0; iPos < (sizeof iIndex); iPos++) { if (iPos < iLimit) @@ -24084,13 +30425,13 @@ MRESReturn mreFlingPre(int pThis, DHookParam hParams) { if (bIsSurvivor(pThis)) { - if (bIsDeveloper(pThis, 6) || (g_esPlayer[pThis].g_iRewardTypes & MT_REWARD_ATTACKBOOST)) + if (bIsDeveloper(pThis, 6) || (((g_esShooter[pThis].g_iTotalPassives & MT_PASSIVE_ATTACKBOOST) || (g_esPlayer[pThis].g_iRewardTypes & MT_REWARD_ATTACKBOOST)) && g_esPlayer[pThis].g_iFastRecovery == 1)) { hParams.Set(4, 1.5); return MRES_ChangedHandled; } - else if (bIsDeveloper(pThis, 8) || (g_esPlayer[pThis].g_iRewardTypes & MT_REWARD_GODMODE)) + else if (bIsDeveloper(pThis, 8) || (((g_esShooter[pThis].g_iTotalPassives & MT_PASSIVE_GODMODE) || (g_esPlayer[pThis].g_iRewardTypes & MT_REWARD_GODMODE)) && g_esPlayer[pThis].g_iRiotGear == 1)) { return MRES_Supercede; } @@ -24105,7 +30446,7 @@ MRESReturn mreGetMaxClip1Pre(int pThis, DHookReturn hReturn) if (bIsSurvivor(iSurvivor) && iClip > 0) { bool bDeveloper = bIsDeveloper(iSurvivor, 4) || bIsDeveloper(iSurvivor, 6); - if (bDeveloper || ((g_esPlayer[iSurvivor].g_iRewardTypes & MT_REWARD_AMMO) && g_esPlayer[iSurvivor].g_iAmmoBoost == 1)) + if (bDeveloper || (((g_esShooter[iSurvivor].g_iTotalPassives & MT_PASSIVE_AMMO) || (g_esPlayer[iSurvivor].g_iRewardTypes & MT_REWARD_AMMO)) && g_esPlayer[iSurvivor].g_iAmmoBoost == 1)) { hReturn.Value = iClip; @@ -24122,10 +30463,10 @@ MRESReturn mreGetRateOfFire(int pThis, DHookReturn hReturn) if (bIsSurvivor(iSurvivor)) { bool bDeveloper = bIsDeveloper(iSurvivor, 6); - if (bDeveloper || ((g_esPlayer[iSurvivor].g_iRewardTypes & MT_REWARD_ATTACKBOOST) && g_esPlayer[iSurvivor].g_flRapidPistol > 0.0)) + if (bDeveloper || (((g_esShooter[iSurvivor].g_iTotalPassives & MT_PASSIVE_ATTACKBOOST) || (g_esPlayer[iSurvivor].g_iRewardTypes & MT_REWARD_ATTACKBOOST)) && g_esPlayer[iSurvivor].g_flRapidPistol > 0.0)) { int iAmmoType = GetEntProp(pThis, Prop_Send, "m_iPrimaryAmmoType"); - bool bPistol = g_bSecondGame ? ((iAmmoType == MT_L4D2_AMMOTYPE_PISTOL) || (iAmmoType == MT_L4D2_AMMOTYPE_PISTOL_MAGNUM)) : (iAmmoType == MT_L4D1_AMMOTYPE_PISTOL); + bool bPistol = (g_bSecondGame ? ((iAmmoType == MT_L4D2_AMMOTYPE_PISTOL) || (iAmmoType == MT_L4D2_AMMOTYPE_PISTOL_MAGNUM)) : (iAmmoType == MT_L4D1_AMMOTYPE_PISTOL)); if (bPistol) { if (GetEntProp(pThis, Prop_Send, "m_isHoldingFireButton") != 0) @@ -24137,12 +30478,12 @@ MRESReturn mreGetRateOfFire(int pThis, DHookReturn hReturn) { SetEntProp(pThis, Prop_Send, "m_releasedFireButton", 1); } + } - float flRate = (bDeveloper && g_esDeveloper[iSurvivor].g_flDevRapidPistol > 0.0) ? g_esDeveloper[iSurvivor].g_flDevRapidPistol : g_esPlayer[iSurvivor].g_flRapidPistol; - hReturn.Value = flClamp(flRate, 0.01, 1.0); + float flRate = (bDeveloper && g_esDeveloper[iSurvivor].g_flDevRapidPistol > 0.0) ? g_esDeveloper[iSurvivor].g_flDevRapidPistol : g_esPlayer[iSurvivor].g_flRapidPistol; + hReturn.Value = flClamp(flRate, 0.01, 99999.0); - return MRES_Override; - } + return MRES_Override; } } @@ -24152,7 +30493,7 @@ MRESReturn mreGetRateOfFire(int pThis, DHookReturn hReturn) MRESReturn mreGrabVictimWithTonguePre(int pThis, DHookParam hParams) { int iSurvivor = hParams.IsNull(1) ? 0 : hParams.Get(1); - if (bIsSurvivor(iSurvivor) && (bIsDeveloper(iSurvivor, 11) || (g_esPlayer[iSurvivor].g_iRewardTypes & MT_REWARD_GODMODE))) + if (bIsSurvivor(iSurvivor) && (bIsDeveloper(iSurvivor, 11) || (((g_esShooter[iSurvivor].g_iTotalPassives & MT_PASSIVE_GODMODE) || (g_esPlayer[iSurvivor].g_iRewardTypes & MT_REWARD_GODMODE)) && g_esPlayer[iSurvivor].g_iSafetyBubble == 1))) { return MRES_Supercede; } @@ -24163,7 +30504,7 @@ MRESReturn mreGrabVictimWithTonguePre(int pThis, DHookParam hParams) MRESReturn mreHitByVomitJarPre(int pThis, DHookParam hParams) { int iSurvivor = hParams.IsNull(1) ? 0 : hParams.Get(1); - if (bIsInfected(pThis) && g_esCache[pThis].g_iVomitImmunity == 1 && bIsSurvivor(iSurvivor, MT_CHECK_INDEX|MT_CHECK_INGAME) && !(g_esPlayer[iSurvivor].g_iRewardTypes & MT_REWARD_DAMAGEBOOST)) + if (bIsInfected(pThis) && g_esTankCache[pThis].g_iVomitImmunity == 1 && bIsSurvivor(iSurvivor, MT_CHECK_INDEX|MT_CHECK_INGAME) && !(g_esShooter[iSurvivor].g_iTotalPassives & MT_PASSIVE_DAMAGEBOOST) && !(g_esPlayer[iSurvivor].g_iRewardTypes & MT_REWARD_DAMAGEBOOST)) { return MRES_Supercede; } @@ -24179,7 +30520,7 @@ MRESReturn mreHitByVomitJarPre(int pThis, DHookParam hParams) MRESReturn mreIncapacitatedAsTankPre(int pThis, DHookParam hParams) { - if (bIsTank(pThis) && g_esCache[pThis].g_iSkipIncap == 1 && g_esGeneral.g_cvMTTankIncapHealth != null) + if (bIsTank(pThis) && g_esTankCache[pThis].g_iSkipIncap == 1 && g_esGeneral.g_cvMTTankIncapHealth != null) { g_esGeneral.g_iDefaultTankIncapHealth = g_esGeneral.g_cvMTTankIncapHealth.IntValue; g_esGeneral.g_cvMTTankIncapHealth.IntValue = 0; @@ -24202,7 +30543,7 @@ MRESReturn mreIncapacitatedAsTankPost(int pThis, DHookParam hParams) MRESReturn mreInitialContainedActionPre(Address pThis, DHookParam hParams) { int iTank = hParams.Get(1); - if (bIsTank(iTank) && bIsCoopMode() && g_esCache[iTank].g_iAutoAggravate == 1) + if (bIsTank(iTank) && bIsCoopMode() && g_esTankCache[iTank].g_iAutoAggravate == 1) { static int iIndex = -1; if (iIndex == -1) @@ -24249,17 +30590,27 @@ MRESReturn mreITExpiredPost(int pThis) MRESReturn mreLadderDismountPre(int pThis) { - if (bIsSurvivor(pThis) && (bIsDeveloper(pThis, 6) || ((g_esPlayer[pThis].g_iRewardTypes & MT_REWARD_ATTACKBOOST) && g_esPlayer[pThis].g_iLadderActions == 1))) + if (bIsSurvivor(pThis)) { - static int iIndex = -1; - if (iIndex == -1) +#if defined _WeaponHandling_included + int iActiveWeapon = iGetSurvivorActiveWeapon(pThis); + if (bIsValidEntity(iActiveWeapon)) { - iIndex = iGetPatchIndex("MTPatch_LadderDismount1"); + vToggleWeaponPassive(pThis, iActiveWeapon, 2); } - - if (iIndex != -1) +#endif + if (bIsDeveloper(pThis, 6) || (((g_esShooter[pThis].g_iTotalPassives & MT_PASSIVE_ATTACKBOOST) || (g_esPlayer[pThis].g_iRewardTypes & MT_REWARD_ATTACKBOOST)) && g_esPlayer[pThis].g_iLadderActions == 1)) { - vInstallPatch(iIndex); + static int iIndex = -1; + if (iIndex == -1) + { + iIndex = iGetPatchIndex("MTPatch_LadderDismount1"); + } + + if (iIndex != -1) + { + vInstallPatch(iIndex); + } } } @@ -24284,17 +30635,27 @@ MRESReturn mreLadderDismountPost(int pThis) MRESReturn mreLadderMountPre(int pThis) { - if (bIsSurvivor(pThis) && (bIsDeveloper(pThis, 6) || ((g_esPlayer[pThis].g_iRewardTypes & MT_REWARD_ATTACKBOOST) && g_esPlayer[pThis].g_iLadderActions == 1))) + if (bIsSurvivor(pThis)) { - static int iIndex = -1; - if (iIndex == -1) +#if defined _WeaponHandling_included + int iActiveWeapon = iGetSurvivorActiveWeapon(pThis); + if (bIsValidEntity(iActiveWeapon)) { - iIndex = iGetPatchIndex("MTPatch_LadderMount1"); + vToggleWeaponPassive(pThis, iActiveWeapon, 1); } - - if (iIndex != -1) +#endif + if (bIsDeveloper(pThis, 6) || (((g_esShooter[pThis].g_iTotalPassives & MT_PASSIVE_ATTACKBOOST) || (g_esPlayer[pThis].g_iRewardTypes & MT_REWARD_ATTACKBOOST)) && g_esPlayer[pThis].g_iLadderActions == 1)) { - vInstallPatch(iIndex); + static int iIndex = -1; + if (iIndex == -1) + { + iIndex = iGetPatchIndex("MTPatch_LadderMount1"); + } + + if (iIndex != -1) + { + vInstallPatch(iIndex); + } } } @@ -24340,7 +30701,7 @@ MRESReturn mreLeaveStasisPost(int pThis) MRESReturn mreLeptOnSurvivorPre(int pThis, DHookParam hParams) { int iSurvivor = hParams.IsNull(1) ? 0 : hParams.Get(1); - if (bIsSurvivor(iSurvivor) && (bIsDeveloper(iSurvivor, 11) || (g_esPlayer[iSurvivor].g_iRewardTypes & MT_REWARD_GODMODE))) + if (bIsSurvivor(iSurvivor) && (bIsDeveloper(iSurvivor, 11) || (((g_esShooter[iSurvivor].g_iTotalPassives & MT_PASSIVE_GODMODE) || (g_esPlayer[iSurvivor].g_iRewardTypes & MT_REWARD_GODMODE)) && g_esPlayer[iSurvivor].g_iSafetyBubble == 1))) { return MRES_Supercede; } @@ -24354,7 +30715,7 @@ MRESReturn mreMaxCarryPre(Address pThis, DHookReturn hReturn, DHookParam hParams if (bIsSurvivor(iSurvivor) && iAmmo > 0) { bool bDeveloper = bIsDeveloper(iSurvivor, 4) || bIsDeveloper(iSurvivor, 6); - if (bDeveloper || ((g_esPlayer[iSurvivor].g_iRewardTypes & MT_REWARD_AMMO) && g_esPlayer[iSurvivor].g_iAmmoBoost == 1)) + if (bDeveloper || (((g_esShooter[iSurvivor].g_iTotalPassives & MT_PASSIVE_AMMO) || (g_esPlayer[iSurvivor].g_iRewardTypes & MT_REWARD_AMMO)) && g_esPlayer[iSurvivor].g_iAmmoBoost == 1)) { hReturn.Value = iAmmo; @@ -24371,7 +30732,7 @@ MRESReturn mrePipeBombProjectileCreatePre(DHookReturn hReturn, DHookParam hParam if (bIsSurvivor(iSurvivor) && g_esGeneral.g_cvMTPipeBombDuration != null) { bool bDeveloper = bIsDeveloper(iSurvivor, 4); - if (bDeveloper || (g_esPlayer[iSurvivor].g_iRewardTypes & MT_REWARD_DAMAGEBOOST)) + if (bDeveloper || (g_esShooter[iSurvivor].g_iTotalPassives & MT_PASSIVE_DAMAGEBOOST) || (g_esPlayer[iSurvivor].g_iRewardTypes & MT_REWARD_DAMAGEBOOST)) { float flDuration = (bDeveloper && g_esDeveloper[iSurvivor].g_flDevPipeBombDuration > g_esPlayer[iSurvivor].g_flPipeBombDuration) ? g_esDeveloper[iSurvivor].g_flDevPipeBombDuration : g_esPlayer[iSurvivor].g_flPipeBombDuration; if (flDuration > 0.0) @@ -24424,7 +30785,7 @@ MRESReturn mrePipeBombProjectileDetonatePost(int pThis) MRESReturn mrePouncedOnSurvivorPre(int pThis, DHookParam hParams) { int iSurvivor = hParams.IsNull(1) ? 0 : hParams.Get(1); - if (bIsSurvivor(iSurvivor) && (bIsDeveloper(iSurvivor, 11) || (g_esPlayer[iSurvivor].g_iRewardTypes & MT_REWARD_GODMODE))) + if (bIsSurvivor(iSurvivor) && (bIsDeveloper(iSurvivor, 11) || (((g_esShooter[iSurvivor].g_iTotalPassives & MT_PASSIVE_GODMODE) || (g_esPlayer[iSurvivor].g_iRewardTypes & MT_REWARD_GODMODE)) && g_esPlayer[iSurvivor].g_iSafetyBubble == 1))) { return MRES_Supercede; } @@ -24434,7 +30795,7 @@ MRESReturn mrePouncedOnSurvivorPre(int pThis, DHookParam hParams) MRESReturn mrePreThinkPre(int pThis) { - if (bIsSurvivor(pThis) && (bIsDeveloper(pThis, 6) || ((g_esPlayer[pThis].g_iRewardTypes & MT_REWARD_ATTACKBOOST) && g_esPlayer[pThis].g_iLadderActions == 1))) + if (bIsSurvivor(pThis) && (bIsDeveloper(pThis, 6) || (((g_esShooter[pThis].g_iTotalPassives & MT_PASSIVE_ATTACKBOOST) || (g_esPlayer[pThis].g_iRewardTypes & MT_REWARD_ATTACKBOOST)) && g_esPlayer[pThis].g_iLadderActions == 1))) { static int iIndex = -1; if (iIndex == -1) @@ -24470,7 +30831,7 @@ MRESReturn mrePreThinkPost(int pThis) MRESReturn mreQueuePummelVictimPre(int pThis, DHookParam hParams) { int iSurvivor = hParams.IsNull(1) ? 0 : hParams.Get(1); - if (bIsSurvivor(iSurvivor) && (bIsDeveloper(iSurvivor, 11) || (g_esPlayer[iSurvivor].g_iRewardTypes & MT_REWARD_GODMODE))) + if (bIsSurvivor(iSurvivor) && (bIsDeveloper(iSurvivor, 11) || (((g_esShooter[iSurvivor].g_iTotalPassives & MT_PASSIVE_GODMODE) || (g_esPlayer[iSurvivor].g_iRewardTypes & MT_REWARD_GODMODE)) && g_esPlayer[iSurvivor].g_iSafetyBubble == 1))) { DataPack dpPummel = new DataPack(); dpPummel.WriteCell(GetClientUserId(iSurvivor)); @@ -24497,7 +30858,7 @@ MRESReturn mreReplaceTankPost(DHookParam hParams) vTankSpawn(iNewTank, -1, 8); vResetTank(iOldTank, false); vResetTank2(iOldTank); - vCacheSettings(iOldTank); + vCacheTankSettings(iOldTank); return MRES_Ignored; } @@ -24507,7 +30868,7 @@ MRESReturn mreRevivedPre(int pThis) if (bIsSurvivor(pThis) && g_esGeneral.g_cvMTSurvivorReviveHealth != null) { bool bDeveloper = bIsDeveloper(pThis, 6); - if (bDeveloper || (g_esPlayer[pThis].g_iRewardTypes & MT_REWARD_HEALTH)) + if (bDeveloper || (g_esShooter[pThis].g_iTotalPassives & MT_PASSIVE_HEALTH) || (g_esPlayer[pThis].g_iRewardTypes & MT_REWARD_HEALTH)) { int iHealth = (bDeveloper && g_esDeveloper[pThis].g_iDevReviveHealth > g_esPlayer[pThis].g_iReviveHealth) ? g_esDeveloper[pThis].g_iDevReviveHealth : g_esPlayer[pThis].g_iReviveHealth; if (iHealth > 0) @@ -24538,7 +30899,7 @@ MRESReturn mreSecondaryAttackPre(int pThis) if (bIsSurvivor(iSurvivor) && g_esGeneral.g_cvMTGunSwingInterval != null) { bool bDeveloper = bIsDeveloper(iSurvivor, 6); - if (bDeveloper || (g_esPlayer[iSurvivor].g_iRewardTypes & MT_REWARD_ATTACKBOOST)) + if (bDeveloper || (((g_esShooter[iSurvivor].g_iTotalPassives & MT_PASSIVE_ATTACKBOOST) || (g_esPlayer[iSurvivor].g_iRewardTypes & MT_REWARD_ATTACKBOOST)) && g_esPlayer[iSurvivor].g_flShoveRate > 0.0)) { float flMultiplier = (bDeveloper && g_esDeveloper[iSurvivor].g_flDevShoveRate > g_esPlayer[iSurvivor].g_flShoveRate) ? g_esDeveloper[iSurvivor].g_flDevShoveRate : g_esPlayer[iSurvivor].g_flShoveRate; if (flMultiplier > 0.0) @@ -24567,12 +30928,12 @@ MRESReturn mreSelectWeightedSequencePre(int pThis, DHookReturn hReturn, DHookPar { bool bFast = false; int iActivity = hParams.Get(1); - if (bIsTank(pThis) && g_esCache[pThis].g_iSkipTaunt == 1) + if (bIsTank(pThis) && g_esTankCache[pThis].g_iSkipTaunt == 1) { switch (g_bSecondGame) { - case true: bFast = MT_L4D2_ACT_TERROR_HULK_VICTORY <= iActivity <= MT_L4D2_ACT_TERROR_RAGE_AT_KNOCKDOWN; - case false: bFast = MT_L4D1_ACT_TERROR_HULK_VICTORY <= iActivity <= MT_L4D1_ACT_TERROR_RAGE_AT_KNOCKDOWN; + case true: bFast = (MT_L4D2_ACT_TERROR_HULK_VICTORY <= iActivity <= MT_L4D2_ACT_TERROR_RAGE_AT_KNOCKDOWN); + case false: bFast = (MT_L4D1_ACT_TERROR_HULK_VICTORY <= iActivity <= MT_L4D1_ACT_TERROR_RAGE_AT_KNOCKDOWN); } if (bFast) @@ -24584,12 +30945,12 @@ MRESReturn mreSelectWeightedSequencePre(int pThis, DHookReturn hReturn, DHookPar return MRES_ChangedOverride; } } - else if (bIsSurvivor(pThis) && (bIsDeveloper(pThis, 6) || (g_esPlayer[pThis].g_iRewardTypes & MT_REWARD_ATTACKBOOST))) + else if (bIsSurvivor(pThis) && (bIsDeveloper(pThis, 6) || (((g_esShooter[pThis].g_iTotalPassives & MT_PASSIVE_ATTACKBOOST) || (g_esPlayer[pThis].g_iRewardTypes & MT_REWARD_ATTACKBOOST)) && g_esPlayer[pThis].g_iFastRecovery == 1))) { switch (g_bSecondGame) { - case true: bFast = iActivity == MT_L4D2_ACT_TERROR_HIT_BY_TANKPUNCH || iActivity == MT_L4D2_ACT_TERROR_IDLE_FALL_FROM_TANKPUNCH || iActivity == MT_L4D2_ACT_TERROR_POUNCED_TO_STAND || iActivity == MT_L4D2_ACT_TERROR_TANKROCK_TO_STAND; - case false: bFast = iActivity == MT_L4D1_ACT_TERROR_HIT_BY_TANKPUNCH || iActivity == MT_L4D1_ACT_TERROR_IDLE_FALL_FROM_TANKPUNCH || iActivity == MT_L4D1_ACT_TERROR_POUNCED_TO_STAND || iActivity == MT_L4D1_ACT_TERROR_TANKROCK_TO_STAND; + case true: bFast = (iActivity == MT_L4D2_ACT_TERROR_HIT_BY_TANKPUNCH || iActivity == MT_L4D2_ACT_TERROR_IDLE_FALL_FROM_TANKPUNCH || iActivity == MT_L4D2_ACT_TERROR_POUNCED_TO_STAND || iActivity == MT_L4D2_ACT_TERROR_TANKROCK_TO_STAND); + case false: bFast = (iActivity == MT_L4D1_ACT_TERROR_HIT_BY_TANKPUNCH || iActivity == MT_L4D1_ACT_TERROR_IDLE_FALL_FROM_TANKPUNCH || iActivity == MT_L4D1_ACT_TERROR_POUNCED_TO_STAND || iActivity == MT_L4D1_ACT_TERROR_TANKROCK_TO_STAND); } if (bFast) @@ -24605,7 +30966,7 @@ MRESReturn mreSelectWeightedSequencePre(int pThis, DHookReturn hReturn, DHookPar MRESReturn mreShovedByPounceLandingPre(int pThis, DHookParam hParams) { - if (bIsSurvivor(pThis) && (bIsDeveloper(pThis, 8) || (g_esPlayer[pThis].g_iRewardTypes & MT_REWARD_GODMODE))) + if (bIsSurvivor(pThis) && (bIsDeveloper(pThis, 8) || (((g_esShooter[pThis].g_iTotalPassives & MT_PASSIVE_GODMODE) || (g_esPlayer[pThis].g_iRewardTypes & MT_REWARD_GODMODE)) && g_esPlayer[pThis].g_iRiotGear == 1))) { return MRES_Supercede; } @@ -24753,9 +31114,9 @@ MRESReturn mreSpawnTankPre(DHookReturn hReturn, DHookParam hParams) MRESReturn mreSpecialClawSwingEndPost(int pThis, DHookParam hParams) { int iSpecial = !bIsValidEntity(pThis) ? 0 : GetEntPropEnt(pThis, Prop_Send, "m_hOwner"); - if (bIsInfected(iSpecial) && g_esCache[iSpecial].g_flAttackInterval > 0.0 && g_esGeneral.g_hSDKStartAttackTimer != null) + if (bIsInfected(iSpecial) && g_esTankCache[iSpecial].g_flAttackInterval > 0.0 && g_esGeneral.g_hSDKStartAttackTimer != null) { - SDKCall(g_esGeneral.g_hSDKStartAttackTimer, pThis, g_esCache[iSpecial].g_flAttackInterval); + SDKCall(g_esGeneral.g_hSDKStartAttackTimer, pThis, g_esTankCache[iSpecial].g_flAttackInterval); } return MRES_Ignored; @@ -24763,7 +31124,7 @@ MRESReturn mreSpecialClawSwingEndPost(int pThis, DHookParam hParams) MRESReturn mreStaggeredPre(int pThis, DHookParam hParams) { - if (bIsSurvivor(pThis) && (bIsDeveloper(pThis, 8) || (g_esPlayer[pThis].g_iRewardTypes & MT_REWARD_GODMODE))) + if (bIsSurvivor(pThis) && (bIsDeveloper(pThis, 8) || (((g_esShooter[pThis].g_iTotalPassives & MT_PASSIVE_GODMODE) || (g_esPlayer[pThis].g_iRewardTypes & MT_REWARD_GODMODE)) && g_esPlayer[pThis].g_iRiotGear == 1))) { return MRES_Supercede; } @@ -24777,7 +31138,7 @@ MRESReturn mreStartActionPre(int pThis, DHookReturn hReturn, DHookParam hParams) if (bIsSurvivor(iSurvivor) && g_esGeneral.g_hSDKGetUseAction != null) { bool bDeveloper = bIsDeveloper(iSurvivor, 6); - if (bDeveloper || (g_esPlayer[iSurvivor].g_iRewardTypes & MT_REWARD_ATTACKBOOST)) + if (bDeveloper || (((g_esShooter[iSurvivor].g_iTotalPassives & MT_PASSIVE_ATTACKBOOST) || (g_esPlayer[iSurvivor].g_iRewardTypes & MT_REWARD_ATTACKBOOST)) && g_esPlayer[iSurvivor].g_flActionDuration > 0.0)) { float flDuration = (bDeveloper && g_esDeveloper[iSurvivor].g_flDevActionDuration > g_esPlayer[iSurvivor].g_flActionDuration) ? g_esDeveloper[iSurvivor].g_flDevActionDuration : g_esPlayer[iSurvivor].g_flActionDuration; if (flDuration > 0.0) @@ -24803,7 +31164,7 @@ MRESReturn mreStartActionPost(int pThis, DHookReturn hReturn, DHookParam hParams MRESReturn mreStartCarryingVictimPre(int pThis, DHookParam hParams) { int iSurvivor = hParams.IsNull(1) ? 0 : hParams.Get(1); - if (bIsSurvivor(iSurvivor) && (bIsDeveloper(iSurvivor, 11) || (g_esPlayer[iSurvivor].g_iRewardTypes & MT_REWARD_GODMODE))) + if (bIsSurvivor(iSurvivor) && (bIsDeveloper(iSurvivor, 11) || (((g_esShooter[iSurvivor].g_iTotalPassives & MT_PASSIVE_GODMODE) || (g_esPlayer[iSurvivor].g_iRewardTypes & MT_REWARD_GODMODE)) && g_esPlayer[iSurvivor].g_iSafetyBubble == 1))) { return MRES_Supercede; } @@ -24817,7 +31178,7 @@ MRESReturn mreStartHealingLinuxPre(DHookParam hParams) if (bIsSurvivor(iSurvivor) && g_esGeneral.g_cvMTFirstAidKitUseDuration != null) { bool bDeveloper = bIsDeveloper(iSurvivor, 6); - if (bDeveloper || (g_esPlayer[iSurvivor].g_iRewardTypes & MT_REWARD_ATTACKBOOST)) + if (bDeveloper || (((g_esShooter[iSurvivor].g_iTotalPassives & MT_PASSIVE_ATTACKBOOST) || (g_esPlayer[iSurvivor].g_iRewardTypes & MT_REWARD_ATTACKBOOST)) && g_esPlayer[iSurvivor].g_flActionDuration > 0.0)) { float flDuration = (bDeveloper && g_esDeveloper[iSurvivor].g_flDevActionDuration > g_esPlayer[iSurvivor].g_flActionDuration) ? g_esDeveloper[iSurvivor].g_flDevActionDuration : g_esPlayer[iSurvivor].g_flActionDuration; if (flDuration > 0.0) @@ -24848,7 +31209,7 @@ MRESReturn mreStartHealingWindowsPre(int pThis, DHookParam hParams) if (bIsSurvivor(iSurvivor) && g_esGeneral.g_cvMTFirstAidKitUseDuration != null) { bool bDeveloper = bIsDeveloper(iSurvivor, 6); - if (bDeveloper || (g_esPlayer[iSurvivor].g_iRewardTypes & MT_REWARD_ATTACKBOOST)) + if (bDeveloper || (((g_esShooter[iSurvivor].g_iTotalPassives & MT_PASSIVE_ATTACKBOOST) || (g_esPlayer[iSurvivor].g_iRewardTypes & MT_REWARD_ATTACKBOOST)) && g_esPlayer[iSurvivor].g_flActionDuration > 0.0)) { float flDuration = (bDeveloper && g_esDeveloper[iSurvivor].g_flDevActionDuration > g_esPlayer[iSurvivor].g_flActionDuration) ? g_esDeveloper[iSurvivor].g_flDevActionDuration : g_esPlayer[iSurvivor].g_flActionDuration; if (flDuration > 0.0) @@ -24878,11 +31239,11 @@ MRESReturn mreStartRevivingPre(int pThis, DHookParam hParams) if (g_esGeneral.g_cvMTSurvivorReviveDuration != null) { int iTarget = hParams.IsNull(1) ? 0 : hParams.Get(1); - if (bIsSurvivor(pThis) && (bIsDeveloper(pThis, 6) || (g_esPlayer[pThis].g_iRewardTypes & MT_REWARD_ATTACKBOOST))) + if (bIsSurvivor(pThis) && (bIsDeveloper(pThis, 6) || (g_esShooter[pThis].g_iTotalPassives & MT_PASSIVE_ATTACKBOOST) || (g_esPlayer[pThis].g_iRewardTypes & MT_REWARD_ATTACKBOOST))) { vSetReviveDurationCvar(pThis); } - else if (bIsSurvivor(iTarget) && (bIsDeveloper(iTarget, 6) || (g_esPlayer[iTarget].g_iRewardTypes & MT_REWARD_ATTACKBOOST))) + else if (bIsSurvivor(iTarget) && (bIsDeveloper(iTarget, 6) || (g_esShooter[iTarget].g_iTotalPassives & MT_PASSIVE_ATTACKBOOST) || (g_esPlayer[iTarget].g_iRewardTypes & MT_REWARD_ATTACKBOOST))) { vSetReviveDurationCvar(iTarget); } @@ -24907,7 +31268,7 @@ MRESReturn mreStartRevivingPost(int pThis, DHookParam hParams) MRESReturn mreTankClawDoSwingPre(int pThis) { int iTank = !bIsValidEntity(pThis) ? 0 : GetEntPropEnt(pThis, Prop_Send, "m_hOwner"); - if (bIsTank(iTank) && g_esCache[iTank].g_iSweepFist == 1) + if (bIsTank(iTank) && g_esTankCache[iTank].g_iSweepFist == 1) { char sName[32]; static int iIndex[2] = {-1, -1}; @@ -24953,7 +31314,7 @@ MRESReturn mreTankClawDoSwingPost(int pThis) MRESReturn mreTankClawGroundPoundPre(int pThis) { int iTank = !bIsValidEntity(pThis) ? 0 : GetEntPropEnt(pThis, Prop_Send, "m_hOwner"); - if (bIsTank(iTank) && g_esCache[iTank].g_iGroundPound == 1) + if (bIsTank(iTank) && g_esTankCache[iTank].g_iGroundPound == 1) { static int iIndex = -1; if (iIndex == -1) @@ -25003,9 +31364,9 @@ MRESReturn mreTankClawPlayerHitPost(int pThis, DHookParam hParams) if (bIsTank(iTank) && bIsSurvivor(iSurvivor)) { bool bDeveloper = bIsDeveloper(iSurvivor, 4); - if (g_esCache[iTank].g_flPunchForce >= 0.0 || bDeveloper || (g_esPlayer[iSurvivor].g_iRewardTypes & MT_REWARD_GODMODE)) + if (g_esTankCache[iTank].g_flPunchForce >= 0.0 || bDeveloper || (((g_esShooter[iSurvivor].g_iTotalPassives & MT_PASSIVE_GODMODE) || (g_esPlayer[iSurvivor].g_iRewardTypes & MT_REWARD_GODMODE)) && g_esPlayer[iSurvivor].g_iRiotGear == 1)) { - float flVelocity[3], flForce = flGetPunchForce(iSurvivor, g_esCache[iTank].g_flPunchForce); + float flVelocity[3], flForce = flGetPunchForce(iSurvivor, g_esTankCache[iTank].g_flPunchForce); if (flForce >= 0.0) { GetEntPropVector(iSurvivor, Prop_Data, "m_vecVelocity", flVelocity); @@ -25021,10 +31382,10 @@ MRESReturn mreTankClawPlayerHitPost(int pThis, DHookParam hParams) MRESReturn mreTankClawPrimaryAttackPre(int pThis) { int iTank = !bIsValidEntity(pThis) ? 0 : GetEntPropEnt(pThis, Prop_Send, "m_hOwner"); - if (bIsTank(iTank) && g_esCache[iTank].g_flAttackInterval > 0.0) + if (bIsTank(iTank) && g_esTankCache[iTank].g_flAttackInterval > 0.0) { float flCurrentTime = GetGameTime(); - if ((g_esPlayer[iTank].g_flLastAttackTime + g_esCache[iTank].g_flAttackInterval) > flCurrentTime) + if ((g_esPlayer[iTank].g_flLastAttackTime + g_esTankCache[iTank].g_flAttackInterval) > flCurrentTime) { return MRES_Supercede; } @@ -25067,7 +31428,7 @@ MRESReturn mreTankRockDetonatePre(int pThis) MRESReturn mreTankRockReleaseLinuxPre(DHookParam hParams) { int pThis = hParams.Get(1), iThrower = !bIsValidEntity(pThis) ? 0 : GetEntPropEnt(pThis, Prop_Data, "m_hThrower"); - if (bIsTank(iThrower) && g_esCache[iThrower].g_iRockSound <= 0) + if (bIsTank(iThrower) && g_esTankCache[iThrower].g_iRockSound <= 0) { static int iIndex = -1; if (iIndex == -1) @@ -25103,7 +31464,7 @@ MRESReturn mreTankRockReleaseLinuxPost(DHookParam hParams) MRESReturn mreTankRockReleaseWindowsPre(int pThis, DHookParam hParams) { int iThrower = !bIsValidEntity(pThis) ? 0 : GetEntPropEnt(pThis, Prop_Data, "m_hThrower"); - if (bIsTank(iThrower) && g_esCache[iThrower].g_iRockSound <= 0) + if (bIsTank(iThrower) && g_esTankCache[iThrower].g_iRockSound <= 0) { static int iIndex = -1; if (iIndex == -1) @@ -25142,7 +31503,7 @@ MRESReturn mreTestMeleeSwingCollisionPre(int pThis, DHookParam hParams) if (bIsSurvivor(iSurvivor) && g_esGeneral.g_cvMTMeleeRange != null) { bool bDeveloper = bIsDeveloper(iSurvivor, 6); - if (bDeveloper || (g_esPlayer[iSurvivor].g_iRewardTypes & MT_REWARD_DAMAGEBOOST)) + if (bDeveloper || (g_esShooter[iSurvivor].g_iTotalPassives & MT_PASSIVE_DAMAGEBOOST) || (g_esPlayer[iSurvivor].g_iRewardTypes & MT_REWARD_DAMAGEBOOST)) { int iRange = (bDeveloper && g_esDeveloper[iSurvivor].g_iDevMeleeRange > g_esPlayer[iSurvivor].g_iMeleeRange) ? g_esDeveloper[iSurvivor].g_iDevMeleeRange : g_esPlayer[iSurvivor].g_iMeleeRange; if (iRange > 0) @@ -25170,10 +31531,10 @@ MRESReturn mreTestMeleeSwingCollisionPost(int pThis, DHookParam hParams) MRESReturn mreThrowUpdateAbilityPre(int pThis) { int iTank = !bIsValidEntity(pThis) ? 0 : GetEntPropEnt(pThis, Prop_Send, "m_owner"); - if (bIsTank(iTank) && g_esCache[iTank].g_flThrowForce > 0.0 && g_esGeneral.g_cvMTTankThrowForce != null) + if (bIsTank(iTank) && g_esTankCache[iTank].g_flThrowForce > 0.0 && g_esGeneral.g_cvMTTankThrowForce != null) { g_esGeneral.g_flDefaultTankThrowForce = g_esGeneral.g_cvMTTankThrowForce.FloatValue; - g_esGeneral.g_cvMTTankThrowForce.FloatValue = g_esCache[iTank].g_flThrowForce; + g_esGeneral.g_cvMTTankThrowForce.FloatValue = g_esTankCache[iTank].g_flThrowForce; } return MRES_Ignored; @@ -25193,9 +31554,9 @@ MRESReturn mreThrowUpdateAbilityPost(int pThis) MRESReturn mreTrySwingPre(int pThis, DHookParam hParams) { int iSpecial = !bIsValidEntity(pThis) ? 0 : GetEntPropEnt(pThis, Prop_Send, "m_hOwner"); - if (bIsInfected(iSpecial) && g_esCache[iSpecial].g_flAttackInterval > 0.0) + if (bIsInfected(iSpecial) && g_esTankCache[iSpecial].g_flAttackInterval > 0.0) { - hParams.Set(1, g_esCache[iSpecial].g_flAttackInterval); + hParams.Set(1, g_esTankCache[iSpecial].g_flAttackInterval); return MRES_ChangedHandled; } @@ -25208,7 +31569,7 @@ MRESReturn mreTryToThrowRockPre(Address pThis, DHookParam hParams) int iTank = hParams.Get(1); if (bIsTank(iTank)) { - if (bIsCoopMode() && g_esCache[iTank].g_iPrioritizeThrows == 1) + if (bIsCoopMode() && g_esTankCache[iTank].g_iPrioritizeThrows == 1) { char sName[32]; static int iIndex[2] = {-1, -1}; @@ -25227,10 +31588,10 @@ MRESReturn mreTryToThrowRockPre(Address pThis, DHookParam hParams) } } - if (g_esCache[iTank].g_flThrowForce > 0.0 && g_esGeneral.g_cvMTTankThrowForce != null) + if (g_esTankCache[iTank].g_flThrowForce > 0.0 && g_esGeneral.g_cvMTTankThrowForce != null) { g_esGeneral.g_flDefaultTankThrowForce = g_esGeneral.g_cvMTTankThrowForce.FloatValue; - g_esGeneral.g_cvMTTankThrowForce.FloatValue = g_esCache[iTank].g_flThrowForce; + g_esGeneral.g_cvMTTankThrowForce.FloatValue = g_esTankCache[iTank].g_flThrowForce; } } @@ -25287,7 +31648,7 @@ MRESReturn mreUTILSetModelPre(DHookParam hParams) MRESReturn mreUsePre(int pThis, DHookParam hParams) { int iSurvivor = hParams.Get(1); - if (bIsSurvivor(iSurvivor) && (bIsDeveloper(iSurvivor, 6) || (g_esPlayer[iSurvivor].g_iRewardTypes & MT_REWARD_ATTACKBOOST))) + if (bIsSurvivor(iSurvivor) && (bIsDeveloper(iSurvivor, 6) || (g_esShooter[iSurvivor].g_iTotalPassives & MT_PASSIVE_ATTACKBOOST) || (g_esPlayer[iSurvivor].g_iRewardTypes & MT_REWARD_ATTACKBOOST))) { char sName[32]; static int iIndex[3] = {-1, -1, -1}; @@ -25332,7 +31693,7 @@ MRESReturn mreUsePost(int pThis, DHookParam hParams) MRESReturn mreVomitedUponPre(int pThis, DHookParam hParams) { - if (bIsSurvivor(pThis) && (bIsDeveloper(pThis, 8) || bIsDeveloper(pThis, 10) || (g_esPlayer[pThis].g_iRewardTypes & MT_REWARD_GODMODE))) + if (bIsSurvivor(pThis) && (bIsDeveloper(pThis, 8) || bIsDeveloper(pThis, 10) || (((g_esShooter[pThis].g_iTotalPassives & MT_PASSIVE_GODMODE) || (g_esPlayer[pThis].g_iRewardTypes & MT_REWARD_GODMODE)) && g_esPlayer[pThis].g_iSafetyBubble == 1))) { return MRES_Supercede; } @@ -25344,7 +31705,7 @@ MRESReturn mreVomitedUponPost(int pThis, DHookParam hParams) { if (bIsValidClient(pThis, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_ALIVE) && !g_esPlayer[pThis].g_bVomited) { - if (bIsSurvivor(pThis) && (bIsDeveloper(pThis, 8) || bIsDeveloper(pThis, 10) || (g_esPlayer[pThis].g_iRewardTypes & MT_REWARD_GODMODE))) + if (bIsSurvivor(pThis) && (bIsDeveloper(pThis, 8) || bIsDeveloper(pThis, 10) || (((g_esShooter[pThis].g_iTotalPassives & MT_PASSIVE_GODMODE) || (g_esPlayer[pThis].g_iRewardTypes & MT_REWARD_GODMODE)) && g_esPlayer[pThis].g_iSafetyBubble == 1))) { return MRES_Ignored; } @@ -25720,7 +32081,7 @@ void vReadSignatureSettings(const char[] key, const char[] value) g_esSignature[iIndex].g_sLibrary = "server"; } - g_esSignature[iIndex].g_sdkLibrary = StrEqual(g_esSignature[iIndex].g_sLibrary, "server", false) ? SDKLibrary_Server : SDKLibrary_Engine; + g_esSignature[iIndex].g_sdkLibrary = (StrEqual(g_esSignature[iIndex].g_sLibrary, "server", false) ? SDKLibrary_Server : SDKLibrary_Engine); if (g_esSignature[iIndex].g_sStart[0] == '\0') { @@ -26040,7 +32401,7 @@ public void Updater_OnPluginUpdated() float flGetAttackBoost(int survivor, float speed) { bool bDeveloper = bIsDeveloper(survivor, 6); - if (bDeveloper || (g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_ATTACKBOOST)) + if (bDeveloper || (((g_esShooter[survivor].g_iTotalPassives & MT_PASSIVE_ATTACKBOOST) || (g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_ATTACKBOOST)) && g_esPlayer[survivor].g_flAttackBoost > 0.0)) { float flBoost = (bDeveloper && g_esDeveloper[survivor].g_flDevAttackBoost > g_esPlayer[survivor].g_flAttackBoost) ? g_esDeveloper[survivor].g_flDevAttackBoost : g_esPlayer[survivor].g_flAttackBoost; if (flBoost > 0.0) @@ -26052,9 +32413,54 @@ float flGetAttackBoost(int survivor, float speed) return speed; } +float flGetFireRate(int survivor, float speed) +{ + bool bDeveloper = bIsDeveloper(survivor, 6); + if (bDeveloper || (((g_esShooter[survivor].g_iTotalPassives & MT_PASSIVE_ATTACKBOOST) || (g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_ATTACKBOOST)) && g_esPlayer[survivor].g_flFireRate > 0.0)) + { + float flBoost = (bDeveloper && g_esDeveloper[survivor].g_flDevFireRate > g_esPlayer[survivor].g_flFireRate) ? g_esDeveloper[survivor].g_flDevFireRate : g_esPlayer[survivor].g_flFireRate; + if (flBoost > 0.0) + { + return flBoost; + } + } + + return speed; +} + +float flGetReloadRate(int survivor, float speed) +{ + bool bDeveloper = bIsDeveloper(survivor, 6); + if (bDeveloper || (((g_esShooter[survivor].g_iTotalPassives & MT_PASSIVE_ATTACKBOOST) || (g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_ATTACKBOOST)) && g_esPlayer[survivor].g_flReloadRate > 0.0)) + { + float flBoost = (bDeveloper && g_esDeveloper[survivor].g_flDevReloadRate > g_esPlayer[survivor].g_flReloadRate) ? g_esDeveloper[survivor].g_flDevReloadRate : g_esPlayer[survivor].g_flReloadRate; + if (flBoost > 0.0) + { + return flBoost; + } + } + + return speed; +} + +float flGetSwingRate(int survivor, float speed) +{ + bool bDeveloper = bIsDeveloper(survivor, 6); + if (bDeveloper || (((g_esShooter[survivor].g_iTotalPassives & MT_PASSIVE_ATTACKBOOST) || (g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_ATTACKBOOST)) && g_esPlayer[survivor].g_flSwingRate > 0.0)) + { + float flBoost = (bDeveloper && g_esDeveloper[survivor].g_flDevSwingRate > g_esPlayer[survivor].g_flSwingRate) ? g_esDeveloper[survivor].g_flDevSwingRate : g_esPlayer[survivor].g_flSwingRate; + if (flBoost > 0.0) + { + return flBoost; + } + } + + return speed; +} + public void WH_OnMeleeSwing(int client, int weapon, float &speedmodifier) { - speedmodifier *= flGetAttackBoost(client, speedmodifier); + speedmodifier *= flGetSwingRate(client, speedmodifier); } public void WH_OnStartThrow(int client, int weapon, L4D2WeaponType weapontype, float &speedmodifier) @@ -26069,12 +32475,12 @@ public void WH_OnReadyingThrow(int client, int weapon, L4D2WeaponType weapontype public void WH_OnReloadModifier(int client, int weapon, L4D2WeaponType weapontype, float &speedmodifier) { - speedmodifier *= flGetAttackBoost(client, speedmodifier); + speedmodifier *= flGetReloadRate(client, speedmodifier); } public void WH_OnGetRateOfFire(int client, int weapon, L4D2WeaponType weapontype, float &speedmodifier) { - speedmodifier *= flGetAttackBoost(client, speedmodifier); + speedmodifier *= flGetFireRate(client, speedmodifier); } public void WH_OnDeployModifier(int client, int weapon, L4D2WeaponType weapontype, float &speedmodifier) @@ -26219,7 +32625,7 @@ void vChangeInfectedToRandom(int special) { if (bIsHumanInfected(special) && g_esGeneral.g_hSDKSetClass != null) { - int iLimit = g_bSecondGame ? 6 : 3; + int iLimit = (g_bSecondGame ? 6 : 3); SDKCall(g_esGeneral.g_hSDKSetClass, special, MT_GetRandomInt(1, iLimit)); } } @@ -26231,7 +32637,7 @@ void vChangeInfectedToRandoms() return; } - int iLimit = g_bSecondGame ? 6 : 3; + int iLimit = (g_bSecondGame ? 6 : 3); for (int iSpecial = 1; iSpecial <= MaxClients; iSpecial++) { if (bIsHumanInfected(iSpecial, MT_CHECK_INGAME|MT_CHECK_ALIVE)) @@ -26289,7 +32695,7 @@ void vHealAllSurvivors() if (g_esPlayer[iSurvivor].g_bLastLife[1]) { - vSetSurvivorLastLife(iSurvivor); + vSetSurvivorLastLife(iSurvivor, g_esGeneral.g_cvMTSurvivorMaxIncapCount.IntValue, false); } } } @@ -26297,35 +32703,14 @@ void vHealAllSurvivors() void vKickInfectedBots() { + int iTypes = g_esGeneral.g_iRushTypes; for (int iSpecial = 1; iSpecial <= MaxClients; iSpecial++) { if (bIsValidClient(iSpecial, MT_CHECK_INGAME) && !bIsValidClient(iSpecial, MT_CHECK_FAKECLIENT)) { - if (bIsTank(iSpecial, MT_CHECK_INGAME) && !(g_esGeneral.g_iRushTypes & MT_RUSHTYPE_TANK)) - { - KickClient(iSpecial); - } - else if (bIsSmoker(iSpecial, MT_CHECK_INGAME) && !(g_esGeneral.g_iRushTypes & MT_RUSHTYPE_SMOKER)) - { - KickClient(iSpecial); - } - else if (bIsBoomer(iSpecial, MT_CHECK_INGAME) && !(g_esGeneral.g_iRushTypes & MT_RUSHTYPE_BOOMER)) - { - KickClient(iSpecial); - } - else if (bIsHunter(iSpecial, MT_CHECK_INGAME) && !(g_esGeneral.g_iRushTypes & MT_RUSHTYPE_HUNTER)) - { - KickClient(iSpecial); - } - else if (bIsSpitter(iSpecial, MT_CHECK_INGAME) && !(g_esGeneral.g_iRushTypes & MT_RUSHTYPE_SPITTER)) - { - KickClient(iSpecial); - } - else if (bIsJockey(iSpecial, MT_CHECK_INGAME) && !(g_esGeneral.g_iRushTypes & MT_RUSHTYPE_JOCKEY)) - { - KickClient(iSpecial); - } - else if (bIsCharger(iSpecial, MT_CHECK_INGAME) && !(g_esGeneral.g_iRushTypes & MT_RUSHTYPE_CHARGER)) + if ((bIsSmoker(iSpecial, MT_CHECK_INGAME) && !(iTypes & MT_RUSHTYPE_SMOKER)) || (bIsBoomer(iSpecial, MT_CHECK_INGAME) && !(iTypes & MT_RUSHTYPE_BOOMER)) || (bIsHunter(iSpecial, MT_CHECK_INGAME) && !(iTypes & MT_RUSHTYPE_HUNTER)) + || (bIsSpitter(iSpecial, MT_CHECK_INGAME) && !(iTypes & MT_RUSHTYPE_SPITTER)) || (bIsJockey(iSpecial, MT_CHECK_INGAME) && !(iTypes & MT_RUSHTYPE_JOCKEY)) || (bIsCharger(iSpecial, MT_CHECK_INGAME) && !(iTypes & MT_RUSHTYPE_CHARGER)) + || (bIsTank(iSpecial, MT_CHECK_INGAME) && !(iTypes & MT_RUSHTYPE_TANK))) { KickClient(iSpecial); } @@ -26375,18 +32760,6 @@ void vRespawnInfectedPlayers(bool extra = true) } } -void vSetSurvivorLastLife(int survivor) -{ - if (g_bSecondGame) - { - SetEntProp(survivor, Prop_Send, "m_currentReviveCount", g_esGeneral.g_cvMTSurvivorMaxIncapCount.IntValue); - } - - SetEntProp(survivor, Prop_Send, "m_isGoingToDie", 1); - SetEntProp(survivor, Prop_Send, "m_bIsOnThirdStrike", 1); - vReviveSurvivor(survivor); -} - void vSetTankPlayer(int client) { if (g_esGeneral.g_hSDKStateTransition == null || g_esGeneral.g_hSDKBecomeGhost == null) @@ -26407,42 +32780,54 @@ void vSetTankPlayer(int client) void vToggleTankRushConVars() { + static bool bHooked; + switch (g_esGeneral.g_bPluginEnabled && g_esGeneral.g_iRushTypes > 0) { case true: { - if (g_esGeneral.g_iCommonLimit >= 0) + if (!bHooked) { - g_esGeneral.g_cvMTCommonLimit.IntValue = g_esGeneral.g_iCommonLimit; - } + bHooked = true; + + if (g_esGeneral.g_iCommonLimit >= 0) + { + g_esGeneral.g_cvMTCommonLimit.IntValue = g_esGeneral.g_iCommonLimit; + } - g_esGeneral.g_cvMTDirectorNoBosses.IntValue = 1; - g_esGeneral.g_cvMTDirectorNoMobs.IntValue = 1; - g_esGeneral.g_cvMTGhostSpeed.IntValue = 850; - g_esGeneral.g_cvMTGhostTravelDistance.IntValue = 0; - g_esGeneral.g_cvMTTankFrustration.IntValue = 0; + g_esGeneral.g_cvMTDirectorNoBosses.IntValue = 1; + g_esGeneral.g_cvMTDirectorNoMobs.IntValue = 1; + g_esGeneral.g_cvMTGhostSpeed.IntValue = 850; + g_esGeneral.g_cvMTGhostTravelDistance.IntValue = 0; + g_esGeneral.g_cvMTTankFrustration.IntValue = 0; - switch (g_esGeneral.g_iHardcoreMode) - { - case -1, 0: + switch (g_esGeneral.g_iHardcoreMode) { - if (g_esGeneral.g_iSurvivorIncaps >= 0) + case -1, 0: { - g_esGeneral.g_cvMTSurvivorMaxIncapCount.IntValue = g_esGeneral.g_iSurvivorIncaps; + if (g_esGeneral.g_iSurvivorIncaps >= 0) + { + g_esGeneral.g_cvMTSurvivorMaxIncapCount.IntValue = g_esGeneral.g_iSurvivorIncaps; + } } + case 1: g_esGeneral.g_cvMTSurvivorMaxIncapCount.IntValue = 0; } - case 1: g_esGeneral.g_cvMTSurvivorMaxIncapCount.IntValue = 0; } } case false: { - g_esGeneral.g_cvMTCommonLimit.RestoreDefault(); - g_esGeneral.g_cvMTDirectorNoBosses.RestoreDefault(); - g_esGeneral.g_cvMTDirectorNoMobs.RestoreDefault(); - g_esGeneral.g_cvMTGhostSpeed.RestoreDefault(); - g_esGeneral.g_cvMTGhostTravelDistance.RestoreDefault(); - g_esGeneral.g_cvMTSurvivorMaxIncapCount.RestoreDefault(); - g_esGeneral.g_cvMTTankFrustration.RestoreDefault(); + if (bHooked) + { + bHooked = false; + + g_esGeneral.g_cvMTCommonLimit.RestoreDefault(); + g_esGeneral.g_cvMTDirectorNoBosses.RestoreDefault(); + g_esGeneral.g_cvMTDirectorNoMobs.RestoreDefault(); + g_esGeneral.g_cvMTGhostSpeed.RestoreDefault(); + g_esGeneral.g_cvMTGhostTravelDistance.RestoreDefault(); + g_esGeneral.g_cvMTSurvivorMaxIncapCount.RestoreDefault(); + g_esGeneral.g_cvMTTankFrustration.RestoreDefault(); + } } } } @@ -26507,131 +32892,166 @@ void vGetSpecialSettingNames(char[][] buffers, int maxStringLength, const char[] } } -void vGetTranslatedName(char[] buffer, int size, int tank = 0, int type = 0, int specType = 0) +void vGetTankTranslatedName(char[] buffer, int size, int tank = 0, int type = 0, int specType = 0, bool survivor = false, int character = -1) { - int iType = (type > 0) ? type : g_esTank[g_esPlayer[tank].g_iTankType].g_iRealType[0], + int iType = (type > 0) ? type : g_esPlayer[tank].g_iTankType, iSpecType = (tank > 0 && specType <= 0) ? g_esPlayer[tank].g_iInfectedType : specType; + if (bIsValidClient(tank, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_FAKECLIENT)) { char sName[33]; - switch (iSpecType) + switch (survivor) { - case 1: strcopy(sName, sizeof sName, g_esTeammate[tank].g_sSmokerName); - case 2: strcopy(sName, sizeof sName, g_esTeammate[tank].g_sBoomerName); - case 3: strcopy(sName, sizeof sName, g_esTeammate[tank].g_sHunterName); - case 4: strcopy(sName, sizeof sName, g_esTeammate[tank].g_sSpitterName); - case 5: strcopy(sName, sizeof sName, g_esTeammate[tank].g_sJockeyName); - case 6: strcopy(sName, sizeof sName, g_esTeammate[tank].g_sChargerName); - default: strcopy(sName, sizeof sName, g_esPlayer[tank].g_sTankName); - } + case true: vGetTankTranslatedNoName(buffer, size, iSpecType, survivor, character); + case false: + { + switch (iSpecType) + { + case 1: strcopy(sName, sizeof sName, g_esTeammate[tank].g_sSmokerName); + case 2: strcopy(sName, sizeof sName, g_esTeammate[tank].g_sBoomerName); + case 3: strcopy(sName, sizeof sName, g_esTeammate[tank].g_sHunterName); + case 4: strcopy(sName, sizeof sName, g_esTeammate[tank].g_sSpitterName); + case 5: strcopy(sName, sizeof sName, g_esTeammate[tank].g_sJockeyName); + case 6: strcopy(sName, sizeof sName, g_esTeammate[tank].g_sChargerName); + default: strcopy(sName, sizeof sName, g_esPlayer[tank].g_sTankName); + } - if (sName[0] != '\0') - { - char sPhrase[64], sPhrase2[64], sSteamIDFinal[64], sSpecialName[33]; + if (sName[0] != '\0') + { + char sPhrase[64], sPhrase2[64], sSteamIDFinal[64], sSpecialName[33]; - switch (iSpecType) - { - case 1, 2, 3, 4, 5, 6: strcopy(sSpecialName, sizeof sSpecialName, g_sSpecialNames[iSpecType]); - default: sSpecialName = "Tank"; - } + switch (iSpecType) + { + case 1, 2, 3, 4, 5, 6: strcopy(sSpecialName, sizeof sSpecialName, g_sSpecialNames[iSpecType]); + default: sSpecialName = "Tank"; + } - FormatEx(sPhrase, sizeof sPhrase, "%s %s Name", g_esPlayer[tank].g_sSteamID32, sSpecialName); - FormatEx(sPhrase2, sizeof sPhrase2, "%s %s Name", g_esPlayer[tank].g_sSteam3ID, sSpecialName); - FormatEx(sSteamIDFinal, sizeof sSteamIDFinal, "%s", (TranslationPhraseExists(sPhrase) ? sPhrase : sPhrase2)); + FormatEx(sPhrase, sizeof sPhrase, "%s %s Name", g_esPlayer[tank].g_sSteamID32, sSpecialName); + FormatEx(sPhrase2, sizeof sPhrase2, "%s %s Name", g_esPlayer[tank].g_sSteam3ID, sSpecialName); + FormatEx(sSteamIDFinal, sizeof sSteamIDFinal, "%s", (TranslationPhraseExists(sPhrase) ? sPhrase : sPhrase2)); - switch (sSteamIDFinal[0] != '\0' && TranslationPhraseExists(sSteamIDFinal)) - { - case true: strcopy(buffer, size, sSteamIDFinal); - case false: vGetTranslatedNoName(buffer, size, iSpecType); + switch (sSteamIDFinal[0] != '\0' && TranslationPhraseExists(sSteamIDFinal)) + { + case true: strcopy(buffer, size, sSteamIDFinal); + case false: vGetTankTranslatedNoName(buffer, size, iSpecType, survivor, character); + } + } + else + { + vGetTankTranslatedNoName(buffer, size, iSpecType, survivor, character); + } } } - else - { - vGetTranslatedNoName(buffer, size, iSpecType); - } } else { char sName[33]; - switch (iSpecType) - { - case 1: strcopy(sName, sizeof sName, g_esSpecial[iType].g_sSmokerName); - case 2: strcopy(sName, sizeof sName, g_esSpecial[iType].g_sBoomerName); - case 3: strcopy(sName, sizeof sName, g_esSpecial[iType].g_sHunterName); - case 4: strcopy(sName, sizeof sName, g_esSpecial[iType].g_sSpitterName); - case 5: strcopy(sName, sizeof sName, g_esSpecial[iType].g_sJockeyName); - case 6: strcopy(sName, sizeof sName, g_esSpecial[iType].g_sChargerName); - default: strcopy(sName, sizeof sName, g_esTank[iType].g_sTankName); - } - - if (sName[0] != '\0') + switch (survivor) { - char sSpecialName[64]; - if (1 <= iSpecType <= 6) + case true: vGetTankTranslatedNoName(buffer, size, iSpecType, survivor, character); + case false: { - FormatEx(sSpecialName, sizeof sSpecialName, "%s #%i Name", g_sSpecialNames[iSpecType], iType); - - if (sSpecialName[0] != '\0' && !TranslationPhraseExists(sSpecialName)) + switch (iSpecType) { - FormatEx(sSpecialName, sizeof sSpecialName, "%s Name", sName); + case 1: strcopy(sName, sizeof sName, g_esSpecial[iType].g_sSmokerName); + case 2: strcopy(sName, sizeof sName, g_esSpecial[iType].g_sBoomerName); + case 3: strcopy(sName, sizeof sName, g_esSpecial[iType].g_sHunterName); + case 4: strcopy(sName, sizeof sName, g_esSpecial[iType].g_sSpitterName); + case 5: strcopy(sName, sizeof sName, g_esSpecial[iType].g_sJockeyName); + case 6: strcopy(sName, sizeof sName, g_esSpecial[iType].g_sChargerName); + default: strcopy(sName, sizeof sName, g_esTank[iType].g_sTankName); } - if (sSpecialName[0] != '\0' && !TranslationPhraseExists(sSpecialName)) + if (sName[0] != '\0') { - FormatEx(sSpecialName, sizeof sSpecialName, "%s #%i", g_sSpecialNames[iSpecType], iType); - } + char sSpecialName[64]; + iType = g_esTank[iType].g_iRealType[0]; + if (1 <= iSpecType <= 6) + { + FormatEx(sSpecialName, sizeof sSpecialName, "%s #%i Name", g_sSpecialNames[iSpecType], iType); - if (sSpecialName[0] != '\0' && !TranslationPhraseExists(sSpecialName)) - { - strcopy(sSpecialName, sizeof sSpecialName, sName); - } - } - else - { - FormatEx(sSpecialName, sizeof sSpecialName, "Tank #%i Name", iType); + if (sSpecialName[0] != '\0' && !TranslationPhraseExists(sSpecialName)) + { + FormatEx(sSpecialName, sizeof sSpecialName, "%s Name", sName); + } - if (sSpecialName[0] != '\0' && !TranslationPhraseExists(sSpecialName)) - { - FormatEx(sSpecialName, sizeof sSpecialName, "%s Name", sName); - } + if (sSpecialName[0] != '\0' && !TranslationPhraseExists(sSpecialName)) + { + FormatEx(sSpecialName, sizeof sSpecialName, "%s #%i", g_sSpecialNames[iSpecType], iType); + } - if (sSpecialName[0] != '\0' && !TranslationPhraseExists(sSpecialName)) - { - FormatEx(sSpecialName, sizeof sSpecialName, "Tank #%i", iType); + if (sSpecialName[0] != '\0' && !TranslationPhraseExists(sSpecialName)) + { + strcopy(sSpecialName, sizeof sSpecialName, sName); + } + } + else + { + FormatEx(sSpecialName, sizeof sSpecialName, "Tank #%i Name", iType); + + if (sSpecialName[0] != '\0' && !TranslationPhraseExists(sSpecialName)) + { + FormatEx(sSpecialName, sizeof sSpecialName, "%s Name", sName); + } + + if (sSpecialName[0] != '\0' && !TranslationPhraseExists(sSpecialName)) + { + FormatEx(sSpecialName, sizeof sSpecialName, "Tank #%i", iType); + } + + if (sSpecialName[0] != '\0' && !TranslationPhraseExists(sSpecialName)) + { + strcopy(sSpecialName, sizeof sSpecialName, sName); + } + } + + switch (sSpecialName[0] != '\0' && TranslationPhraseExists(sSpecialName)) + { + case true: strcopy(buffer, size, sSpecialName); + case false: vGetTankTranslatedNoName(buffer, size, iSpecType, survivor, character); + } } - - if (sSpecialName[0] != '\0' && !TranslationPhraseExists(sSpecialName)) + else { - strcopy(sSpecialName, sizeof sSpecialName, sName); + vGetTankTranslatedNoName(buffer, size, iSpecType, survivor, character); } } - - switch (sSpecialName[0] != '\0' && TranslationPhraseExists(sSpecialName)) - { - case true: strcopy(buffer, size, sSpecialName); - case false: vGetTranslatedNoName(buffer, size, iSpecType); - } - } - else - { - vGetTranslatedNoName(buffer, size, iSpecType); } } } -void vGetTranslatedNoName(char[] buffer, int size, int specType) +void vGetTankTranslatedNoName(char[] buffer, int size, int specType, bool survivor, int character) { - switch (specType) + if (survivor) + { + int iCharacter = (g_bSecondGame ? character : (character + 4)); + + switch (iCharacter) + { + case 0: strcopy(buffer, size, "NoNameNick"); + case 1: strcopy(buffer, size, "NoNameRochelle"); + case 2: strcopy(buffer, size, "NoNameCoach"); + case 3: strcopy(buffer, size, "NoNameEllis"); + case 4: strcopy(buffer, size, "NoNameBill"); + case 5: strcopy(buffer, size, "NoNameZoey"); + case 6: strcopy(buffer, size, "NoNameFrancis"); + case 7: strcopy(buffer, size, "NoNameLouis"); + } + } + else { - case 1: strcopy(buffer, size, "NoNameSmoker"); - case 2: strcopy(buffer, size, "NoNameBoomer"); - case 3: strcopy(buffer, size, "NoNameHunter"); - case 4: strcopy(buffer, size, "NoNameSpitter"); - case 5: strcopy(buffer, size, "NoNameJockey"); - case 6: strcopy(buffer, size, "NoNameCharger"); - default: strcopy(buffer, size, "NoName"); + switch (specType) + { + case 1: strcopy(buffer, size, "NoNameSmoker"); + case 2: strcopy(buffer, size, "NoNameBoomer"); + case 3: strcopy(buffer, size, "NoNameHunter"); + case 4: strcopy(buffer, size, "NoNameSpitter"); + case 5: strcopy(buffer, size, "NoNameJockey"); + case 6: strcopy(buffer, size, "NoNameCharger"); + default: strcopy(buffer, size, "NoName"); + } } } @@ -26757,6 +33177,75 @@ bool bIsChargerEnabled(int type) return iTypes > 0 && (iTypes & MT_SPECINF_CHARGER); } +bool bIsClassLimited(int tank, const char[] class, int type, int specType = 0) +{ + if (g_esGeneral.g_alClassKeys[0] == null || g_esGeneral.g_alClassKeys[1] == null) + { + return false; + } + + bool bTypeLimit = false; + char sTypeClass[65]; + int iClassCount = 0, iType = 0; + for (int iInfected = 1; iInfected <= MaxClients; iInfected++) + { + if (bIsInfected(iInfected, MT_CHECK_INGAME|MT_CHECK_ALIVE) && !bIsCustomTank(iInfected) && !g_esPlayer[iInfected].g_bArtificial && iInfected != tank) + { + iType = g_esPlayer[iInfected].g_iTankType; + + switch (specType) + { + case 1: + { + bTypeLimit = (g_esSpecial[iType].g_sSmokerClass[0] != '\0'); + sTypeClass = (g_esSpecial[iType].g_sSmokerClass[0] != '\0') ? g_esSpecial[iType].g_sSmokerClass : g_esTank[iType].g_sTankClass; + } + case 2: + { + bTypeLimit = (g_esSpecial[iType].g_sBoomerClass[0] != '\0'); + sTypeClass = (g_esSpecial[iType].g_sBoomerClass[0] != '\0') ? g_esSpecial[iType].g_sBoomerClass : g_esTank[iType].g_sTankClass; + } + case 3: + { + bTypeLimit = (g_esSpecial[iType].g_sHunterClass[0] != '\0'); + sTypeClass = (g_esSpecial[iType].g_sHunterClass[0] != '\0') ? g_esSpecial[iType].g_sHunterClass : g_esTank[iType].g_sTankClass; + } + case 4: + { + bTypeLimit = (g_esSpecial[iType].g_sSpitterClass[0] != '\0'); + sTypeClass = (g_esSpecial[iType].g_sSpitterClass[0] != '\0') ? g_esSpecial[iType].g_sSpitterClass : g_esTank[iType].g_sTankClass; + } + case 5: + { + bTypeLimit = (g_esSpecial[iType].g_sJockeyClass[0] != '\0'); + sTypeClass = (g_esSpecial[iType].g_sJockeyClass[0] != '\0') ? g_esSpecial[iType].g_sJockeyClass : g_esTank[iType].g_sTankClass; + } + case 6: + { + bTypeLimit = (g_esSpecial[iType].g_sChargerClass[0] != '\0'); + sTypeClass = (g_esSpecial[iType].g_sChargerClass[0] != '\0') ? g_esSpecial[iType].g_sChargerClass : g_esTank[iType].g_sTankClass; + } + default: sTypeClass = g_esTank[iType].g_sTankClass; + } + + if (bTypeLimit && g_esPlayer[iInfected].g_iInfectedType != specType) + { + continue; + } + + iClassCount += (StrEqual(class, sTypeClass) || iType == type) ? 1 : 0; + } + } + + int iIndex = g_esGeneral.g_alClassKeys[0].FindString(class); + if (iIndex != -1) + { + return (0 < g_esGeneral.g_alClassKeys[1].Get(iIndex) <= iClassCount); + } + + return false; +} + bool bIsCompetitiveMode() { return bIsVersusMode() || bIsScavengeMode(); @@ -26771,14 +33260,30 @@ bool bIsCompetitiveModeRound(int type) switch (type) { - case 0: return !g_esGeneral.g_bNextRound && g_esGeneral.g_alCompTypes == null; - case 1: return !g_esGeneral.g_bNextRound && g_esGeneral.g_alCompTypes != null; - case 2: return g_esGeneral.g_bNextRound && g_esGeneral.g_alCompTypes != null && g_esGeneral.g_alCompTypes.Length > 0; + case 0: return !g_esGeneral.g_bNextRound && (g_esGeneral.g_alCompTypes[0] == null || g_esGeneral.g_alCompTypes[1] == null); + case 1: return !g_esGeneral.g_bNextRound && (g_esGeneral.g_alCompTypes[0] != null || g_esGeneral.g_alCompTypes[1] != null); + case 2: return g_esGeneral.g_bNextRound && ((g_esGeneral.g_alCompTypes[0] != null && g_esGeneral.g_alCompTypes[0].Length > 0) || (g_esGeneral.g_alCompTypes[1] != null && g_esGeneral.g_alCompTypes[1].Length > 0)); } return false; } +bool bIsCommonEnabled(int type) +{ + int iVariants = iGetSettingValue(true, true, g_esHorde[type].g_iMobVariants, g_esMob.g_iMobVariants, 1); + return (iVariants > 0 && (iVariants & MT_MOBVARIANT_COMMON)); +} + +bool bIsCommonInfectedSupported(int common) +{ + if (!bIsCommonInfected(common) || (g_esInfected[common].g_iTankType <= 0)) + { + return false; + } + + return true; +} + bool bIsConVarConflictFound(const char[] name, const char[] set, const char[] action, bool log) { if (set[0] != '\0') @@ -26826,7 +33331,7 @@ bool bIsCoreAdminImmune(int survivor, int tank) return false; } - if (bIsDeveloper(survivor, 1) || bIsDeveloper(survivor, 11) || (g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_GODMODE)) + if (bIsDeveloper(survivor, 1) || bIsDeveloper(survivor, 11) || (((g_esShooter[survivor].g_iTotalPassives & MT_PASSIVE_GODMODE) || (g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_GODMODE)) && g_esPlayer[survivor].g_iSafetyBubble == 1)) { return true; } @@ -26887,18 +33392,18 @@ bool bIsDayConfigFound(char[] buffer, int size) /** * Developer tools for testing - * 1 - 0 - no versus cooldown, visual effects, voice pitch - * 2 - 1 - immune to abilities, access to all tanks, ghost bullets - * 4 - 2 - loadout on initial spawn, voice pitch - * 8 - 3 - all rewards/effects, laser sight, blink and recall, fast dash + * 1 - 0 - no versus cooldown, ghost bullets, infinite ammo + * 2 - 1 - immune to abilities, access to all tanks, visual effects + * 4 - 2 - loadout on initial spawn, random weapon skins, voice pitch + * 8 - 3 - all rewards/effects, laser sight, blink and recall, fast dash, overhealth * 16 - 4 - damage boost/resistance, less punch force, no friendly-fire, ammo regen, custom pipe bomb duration, recoil dampener, blaze health, no nudge - * 32 - 5 - speed boost, jump height, auto-revive, life leech, bunny hop, midair dash, door push, cluster bombs, sticky grenades - * 64 - 6 - no shove penalty, fast shove/attack rate/action durations, fast recovery, full health when healing/reviving, ammo regen, ladder actions, bunny hop + * 32 - 5 - speed boost, jump height, life leech, bunny hop, midair dash, door push, cluster bombs, sticky grenades + * 64 - 6 - no shove penalty, fast shove/attack rate/action durations, fast recovery, ammo regen, ladder actions, bunny hop * 128 - 7 - infinite ammo, health regen, special ammo, inextinguishable fire, cluster bombs, sticky grenades - * 256 - 8 - block puke/fling/shove/stagger/punch/acid puddle + * 256 - 8 - block puke/fling/shove/stagger/punch/acid puddle, full health when healing/reviving, medkit/defib/adrenaline/pills radius * 512 - 9 - sledgehammer rounds, hollowpoint ammo, tank melee knockback, shove damage against tank/charger/witch - * 1024 - 10 - respawn upon death, clean kills, block puke/acid puddle - * 2048 - 11 - auto-insta-kill SI attackers, god mode, no damage, lady killer, special ammo, voice pitch, door push, no nudge + * 1024 - 10 - respawn upon death, clean kills, block puke/acid puddle, aoe healing, aoe giving ammo + * 2048 - 11 - auto-insta-kill SI attackers, auto-revive, god mode, no damage, lady killer, special ammo, voice pitch, door push, no nudge, immune to punishment system **/ bool bIsDeveloper(int developer, int bit = -1, bool real = false) { @@ -26910,7 +33415,7 @@ bool bIsDeveloper(int developer, int bit = -1, bool real = false) || (!real && bGuest && !bReturn); } - return false; + return bReturn; } bool bIsDifficultyConfigFound(char[] buffer, int size) @@ -27019,13 +33524,13 @@ bool bIsInfectedEnabled(int special) { switch (g_esPlayer[special].g_iInfectedType) { - case 1: return !!(g_esCache[special].g_iSpecialTypes & MT_SPECINF_SMOKER); - case 2: return !!(g_esCache[special].g_iSpecialTypes & MT_SPECINF_BOOMER); - case 3: return !!(g_esCache[special].g_iSpecialTypes & MT_SPECINF_HUNTER); - case 4: return !!(g_esCache[special].g_iSpecialTypes & MT_SPECINF_SPITTER); - case 5: return !!(g_esCache[special].g_iSpecialTypes & MT_SPECINF_JOCKEY); - case 6: return !!(g_esCache[special].g_iSpecialTypes & MT_SPECINF_CHARGER); - case 8: return (g_esCache[special].g_iTankEnabled > 0); + case 1: return !!(g_esTankCache[special].g_iSpecialTypes & MT_SPECINF_SMOKER); + case 2: return !!(g_esTankCache[special].g_iSpecialTypes & MT_SPECINF_BOOMER); + case 3: return !!(g_esTankCache[special].g_iSpecialTypes & MT_SPECINF_HUNTER); + case 4: return !!(g_esTankCache[special].g_iSpecialTypes & MT_SPECINF_SPITTER); + case 5: return !!(g_esTankCache[special].g_iSpecialTypes & MT_SPECINF_JOCKEY); + case 6: return !!(g_esTankCache[special].g_iSpecialTypes & MT_SPECINF_CHARGER); + case 8: return (g_esTankCache[special].g_iTankEnabled > 0); } return false; @@ -27100,12 +33605,204 @@ bool bIsInfectedIdle(int special, int type = 0) case 2: return StrEqual(sAction, "TankBehavior") || adAction == adBehavior; } #endif + return !bIsVisibleToPlayer(special); +} + +bool bIsJockeyEnabled(int type) +{ + int iTypes = iGetSettingValue(true, true, g_esSpecial[type].g_iSpecialTypes, g_esSpecific.g_iSpecialTypes, 1); + return iTypes > 0 && (iTypes & MT_SPECINF_JOCKEY); +} + +bool bIsMapConfigFound(char[] buffer, int size) +{ + char sFolder[PLATFORM_MAX_PATH], sPath[PLATFORM_MAX_PATH]; + FormatEx(sFolder, sizeof sFolder, "%s%s", MT_CONFIG_FILEPATH, (g_bSecondGame ? MT_CONFIG_PATH_MAP2 : MT_CONFIG_PATH_MAP)); + BuildPath(Path_SM, sPath, sizeof sPath, sFolder); + + char sMap[128], sFilename[132]; + GetCurrentMap(sMap, sizeof sMap); + FormatEx(sFilename, sizeof sFilename, "%s.cfg", sMap); + + char sMapConfig[PLATFORM_MAX_PATH]; + FormatEx(sMapConfig, sizeof sMapConfig, "%s%s", sPath, sFilename); + if (MT_FileExists(sFolder, sFilename, sMapConfig, sMapConfig, sizeof sMapConfig)) + { + strcopy(buffer, size, sMapConfig); + + return true; + } + + return false; +} + +bool bIsMenuEnabled(int type, int specType) +{ + int iMenu = (specType != 8) ? g_esSpecial[type].g_iMenuEnabled : -1; + iMenu = (specType != 8 && iMenu >= 0) ? iMenu : g_esTank[type].g_iMenuEnabled; + return iMenu == 1; +} + +bool bIsMobSupported(int infected) +{ + if ((!bIsCommonInfected(infected) && !bIsWitch(infected)) || (g_esInfected[infected].g_iTankType <= 0)) + { + return false; + } + + return true; +} + +bool bIsMutationUnpredictable(int tank) +{ + return (g_esPlayer[tank].g_bBoss || g_esPlayer[tank].g_bCombo || g_esPlayer[tank].g_bPunisher || g_esPlayer[tank].g_bRandomized || g_esPlayer[tank].g_bTransformed); +} + +bool bIsRightGame(int type, int specType) +{ + int iGameType = g_esTank[type].g_iGameType; + + switch (specType) + { + case 1, 2, 3, 4, 5, 6: iGameType = g_esSpecial[type].g_iGameType; + default: iGameType = g_esTank[type].g_iGameType; + } + + switch (iGameType) + { + case 1: return !g_bSecondGame; + case 2: return g_bSecondGame; + } + + return true; +} + +bool bIsSafeFalling(int survivor) +{ + if (g_esPlayer[survivor].g_bFalling) + { + float flOrigin[3]; + GetEntPropVector(survivor, Prop_Data, "m_vecOrigin", flOrigin); + if (0.0 < (g_esPlayer[survivor].g_flPreFallZ - flOrigin[2]) < 900.0) + { + g_esPlayer[survivor].g_bFalling = false; + g_esPlayer[survivor].g_flPreFallZ = 0.0; + + return true; + } + + g_esPlayer[survivor].g_bFalling = false; + g_esPlayer[survivor].g_flPreFallZ = 0.0; + } + + return false; +} + +bool bIsSameMission() +{ + if (g_esGeneral.g_hSDKGetMissionInfo != null) + { + Address adMissionInfo = SDKCall(g_esGeneral.g_hSDKGetMissionInfo); + if (adMissionInfo != Address_Null && g_esGeneral.g_hSDKKeyValuesGetString != null) + { + char sTemp[64], sTemp2[64]; + SDKCall(g_esGeneral.g_hSDKKeyValuesGetString, adMissionInfo, sTemp, sizeof sTemp, "Name", ""); + SDKCall(g_esGeneral.g_hSDKKeyValuesGetString, adMissionInfo, sTemp2, sizeof sTemp2, "DisplayTitle", ""); + + bool bSame = StrEqual(g_esGeneral.g_sCurrentMissionName, sTemp) || StrEqual(g_esGeneral.g_sCurrentMissionDisplayTitle, sTemp2); + if (!bSame) + { + strcopy(g_esGeneral.g_sCurrentMissionName, sizeof esGeneral::g_sCurrentMissionName, sTemp); + strcopy(g_esGeneral.g_sCurrentMissionDisplayTitle, sizeof esGeneral::g_sCurrentMissionDisplayTitle, sTemp2); + } + + return bSame; + } + } + + return false; +} + +bool bIsScavengeMode() +{ + return g_esGeneral.g_iCurrentMode == 8; +} + +bool bIsSmokerEnabled(int type) +{ + int iTypes = iGetSettingValue(true, true, g_esSpecial[type].g_iSpecialTypes, g_esSpecific.g_iSpecialTypes, 1); + return iTypes > 0 && (iTypes & MT_SPECINF_SMOKER); +} + +bool bIsSpitterEnabled(int type) +{ + int iTypes = iGetSettingValue(true, true, g_esSpecial[type].g_iSpecialTypes, g_esSpecific.g_iSpecialTypes, 1); + return iTypes > 0 && (iTypes & MT_SPECINF_SPITTER); +} + +bool bIsSpawnEnabled(int type, int specType) +{ + if (specType > 0 && specType != 8) + { + return iGetSubSettingValue(true, true, g_esSpecial[type].g_iSpawnEnabled, g_esTank[type].g_iSpawnEnabled, g_esSpecific.g_iSpawnEnabled, g_esGeneral.g_iSpawnEnabled, 1) == 1; + } + + return iGetSettingValue(true, true, g_esTank[type].g_iSpawnEnabled, g_esGeneral.g_iSpawnEnabled, 1) == 1; +} + +bool bIsSpecialEnabled(int type) +{ + return bIsBoomerEnabled(type) || bIsChargerEnabled(type) || bIsHunterEnabled(type) || bIsJockeyEnabled(type) || bIsSmokerEnabled(type) || bIsSpitterEnabled(type); +} + +bool bIsSpecialRandomType(int type, int specType, int special = 0) +{ + int iRandom = (specType != 8) ? g_esSpecial[type].g_iRandomSpecial : -1; + return (special > 0 && g_esTankCache[special].g_iRandomSpecial == 1) || iRandom == 1 || (iRandom < 0 && g_esTank[type].g_iRandomTank == 1); +} + +bool bIsSpecialSupported(int special, int flags = MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_ALIVE) +{ + if (!bIsInfected(special, flags) || (g_esPlayer[special].g_iTankType <= 0) || (bIsInfected(special, MT_CHECK_FAKECLIENT) && !bIsHumanSupported(special))) + { + return false; + } + + return true; +} + +bool bIsSurvivalMode() +{ + return g_esGeneral.g_iCurrentMode == 4; +} + +bool bIsTankEnabled(int type) +{ + return iGetSettingValue(true, true, g_esTank[type].g_iTankEnabled, g_esGeneral.g_iTankEnabled, 1) == 1; +} + +#if defined _actions_included +bool bIsTankIdle(const char[] action, int target = 0, int type = 0) +{ + switch (type) + { + case 0, 3: return StrEqual(action, "TankIdle") || StrEqual(action, "TankBehavior") || (StrContains(action, "Attack") != -1 && !bIsSurvivor(target)); + case 1: return StrEqual(action, "TankIdle") || (StrContains(action, "Attack") != -1 && !bIsSurvivor(target)); + case 2: return StrEqual(action, "TankBehavior") || (StrContains(action, "Attack") != -1 && !bIsSurvivor(target)); + } + return false; } +#endif + +bool bIsTankRandomType(int type, int tank = 0) +{ + return (tank > 0 && g_esTankCache[tank].g_iRandomTank == 1) || g_esTank[type].g_iRandomTank == 1; +} -bool bIsInfectedSupported(int special, int flags = MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_ALIVE) +bool bIsTankSupported(int tank, int flags = MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_ALIVE) { - if (!bIsInfected(special, flags) || (g_esPlayer[special].g_iTankType <= 0) || (bIsInfected(special, MT_CHECK_FAKECLIENT) && !bIsHumanSupported(special))) + if (!bIsTank(tank, flags) || (g_esPlayer[tank].g_iTankType <= 0) || (bIsTank(tank, MT_CHECK_FAKECLIENT) && !bIsHumanSupported(tank))) { return false; } @@ -27113,1514 +33810,2254 @@ bool bIsInfectedSupported(int special, int flags = MT_CHECK_INDEX|MT_CHECK_INGAM return true; } -bool bIsJockeyEnabled(int type) +bool bIsTypeAvailable(int type, int tank = 0) { - int iTypes = iGetSettingValue(true, true, g_esSpecial[type].g_iSpecialTypes, g_esSpecific.g_iSpecialTypes, 1); - return iTypes > 0 && (iTypes & MT_SPECINF_JOCKEY); + if ((tank > 0 && g_esTankCache[tank].g_iCheckAbilities <= 0) && g_esGeneral.g_iCheckAbilities <= 0 && g_esTank[type].g_iCheckAbilities <= 0) + { + return true; + } + + int iPluginCount = 0; + for (int iPos = 0; iPos < MT_MAXABILITIES; iPos++) + { + if (!g_esGeneral.g_bAbilityPlugin[iPos]) + { + continue; + } + + iPluginCount++; + } + + return g_esTank[type].g_iAbilityCount == -1 || (g_esTank[type].g_iAbilityCount > 0 && iPluginCount > 0); } -bool bIsMapConfigFound(char[] buffer, int size) +bool bIsTypeCycled(int specType, int type, bool manual) { - char sFolder[PLATFORM_MAX_PATH], sPath[PLATFORM_MAX_PATH]; - FormatEx(sFolder, sizeof sFolder, "%s%s", MT_CONFIG_FILEPATH, (g_bSecondGame ? MT_CONFIG_PATH_MAP2 : MT_CONFIG_PATH_MAP)); - BuildPath(Path_SM, sPath, sizeof sPath, sFolder); + bool bCycled = false, bSpecial = (specType > 0 && specType != 8); - char sMap[128], sFilename[132]; - GetCurrentMap(sMap, sizeof sMap); - FormatEx(sFilename, sizeof sFilename, "%s.cfg", sMap); + switch (manual) + { + case true: bCycled = bSpecial ? g_esSpecial[type].g_bTypeCycled2[specType] : g_esTank[type].g_bTypeCycled2; + case false: bCycled = bSpecial ? g_esSpecial[type].g_bTypeCycled[specType] : g_esTank[type].g_bTypeCycled; + } - char sMapConfig[PLATFORM_MAX_PATH]; - FormatEx(sMapConfig, sizeof sMapConfig, "%s%s", sPath, sFilename); - if (MT_FileExists(sFolder, sFilename, sMapConfig, sMapConfig, sizeof sMapConfig)) + return iGetCycleType(specType) > 0 && bCycled; +} + +bool bIsTypeShown(int admin, int type, int specType) +{ + bool bReturn = false; + int iFlags = g_esPlayer[admin].g_iMenuFlags; + if (iFlags > 0) { - strcopy(buffer, size, sMapConfig); + if (iFlags & MT_MENUFLAG_INDOOR) + { + bReturn = g_esTank[type].g_flCloseAreasOnly > 0.0; + } - return true; + if (iFlags & MT_MENUFLAG_OUTDOOR) + { + bReturn = g_esTank[type].g_flOpenAreasOnly > 0.0; + } + + if (iFlags & MT_MENUFLAG_HUMANS) + { + bReturn = bAreHumansRequired(type, specType, 0); + } + + if (iFlags & MT_MENUFLAG_BOTS) + { + bReturn = !bAreHumansRequired(type, specType, 0); + } + + if (iFlags & MT_MENUFLAG_SPAWNABLE) + { + bReturn = bIsSpawnEnabled(type, specType) && bCanTypeSpawn(type, specType); + } + + if (iFlags & MT_MENUFLAG_UNSPAWNABLE) + { + bReturn = !bIsSpawnEnabled(type, specType) || !bCanTypeSpawn(type, specType); + } + + if (iFlags & MT_MENUFLAG_COMPETITIVE) + { + bReturn = bIsHumanSupported(admin, specType); + } + } + else + { + bReturn = !bIsAreaWide(admin, g_esTank[type].g_flCloseAreasOnly) || !bIsAreaNarrow(admin, g_esTank[type].g_flOpenAreasOnly) + || bAreHumansRequired(type, specType) || bCanTypeSpawn(type, specType); } - return false; + return bReturn || (iFlags & MT_MENUFLAG_ALL); } -bool bIsMenuEnabled(int type, int specType) +bool bIsVersusMode() { - int iMenu = (specType != 8) ? g_esSpecial[type].g_iMenuEnabled : -1; - iMenu = (specType != 8 && iMenu >= 0) ? iMenu : g_esTank[type].g_iMenuEnabled; - return iMenu == 1; + return g_esGeneral.g_iCurrentMode == 2; } -bool bIsRightGame(int type, int specType) +bool bIsWitchEnabled(int type) { - int iGameType = g_esTank[type].g_iGameType; - - switch (specType) - { - case 1, 2, 3, 4, 5, 6: iGameType = g_esSpecial[type].g_iGameType; - default: iGameType = g_esTank[type].g_iGameType; - } + int iVariants = iGetSettingValue(true, true, g_esHorde[type].g_iMobVariants, g_esMob.g_iMobVariants, 1); + return (iVariants > 0 && (iVariants & MT_MOBVARIANT_WITCH)); +} - switch (iGameType) +bool bIsWitchSupported(int witch) +{ + if (!bIsWitch(witch) || (g_esInfected[witch].g_iTankType <= 0)) { - case 1: return !g_bSecondGame; - case 2: return g_bSecondGame; + return false; } return true; } -bool bIsSafeFalling(int survivor) +bool bIsWrongRushType(const char[] item) { - if (g_esPlayer[survivor].g_bFalling) + return ((!(g_esGeneral.g_iRushTypes & MT_RUSHTYPE_SMOKER) && StrContains(item, "smoker") == 0) || (!(g_esGeneral.g_iRushTypes & MT_RUSHTYPE_BOOMER) && StrContains(item, "boomer") == 0) || (!(g_esGeneral.g_iRushTypes & MT_RUSHTYPE_HUNTER) && StrContains(item, "hunter") == 0) || (!(g_esGeneral.g_iRushTypes & MT_RUSHTYPE_SPITTER) && StrContains(item, "spitter") == 0) + || (!(g_esGeneral.g_iRushTypes & MT_RUSHTYPE_JOCKEY) && StrContains(item, "jockey") == 0) || (!(g_esGeneral.g_iRushTypes & MT_RUSHTYPE_CHARGER) && StrContains(item, "charger") == 0) || (!(g_esGeneral.g_iRushTypes & MT_RUSHTYPE_TANK) && StrContains(item, "tank") == 0)); +} + +bool bRespawnSurvivor(int survivor, bool restore, int target = 0) +{ + if (!bIsSurvivor(survivor, MT_CHECK_ALIVE) && g_esGeneral.g_hSDKRoundRespawn != null) { - float flOrigin[3]; - GetEntPropVector(survivor, Prop_Data, "m_vecOrigin", flOrigin); - if (0.0 < (g_esPlayer[survivor].g_flPreFallZ - flOrigin[2]) < 900.0) + bool bTeleport = false; + float flOrigin[3], flAngles[3]; + for (int iTeammate = 1; iTeammate <= MaxClients; iTeammate++) { - g_esPlayer[survivor].g_bFalling = false; - g_esPlayer[survivor].g_flPreFallZ = 0.0; + if (bIsSurvivor(iTeammate) && !bIsSurvivorHanging(iTeammate) && iTeammate != survivor) + { + if (target > 0 && iTeammate != target) + { + continue; + } - return true; - } + bTeleport = true; - g_esPlayer[survivor].g_bFalling = false; - g_esPlayer[survivor].g_flPreFallZ = 0.0; - } + GetClientAbsOrigin(iTeammate, flOrigin); + GetClientEyeAngles(iTeammate, flAngles); + flAngles[2] = 0.0; - return false; -} + break; + } + } -bool bIsSameMission() -{ - if (g_esGeneral.g_hSDKGetMissionInfo != null) - { - Address adMissionInfo = SDKCall(g_esGeneral.g_hSDKGetMissionInfo); - if (adMissionInfo != Address_Null && g_esGeneral.g_hSDKKeyValuesGetString != null) + if (bTeleport) { - char sTemp[64], sTemp2[64]; - SDKCall(g_esGeneral.g_hSDKKeyValuesGetString, adMissionInfo, sTemp, sizeof sTemp, "Name", ""); - SDKCall(g_esGeneral.g_hSDKKeyValuesGetString, adMissionInfo, sTemp2, sizeof sTemp2, "DisplayTitle", ""); + vRespawnSurvivor(survivor); + TeleportEntity(survivor, flOrigin, flAngles); + vFixPlayerPosition(survivor); - bool bSame = StrEqual(g_esGeneral.g_sCurrentMissionName, sTemp) || StrEqual(g_esGeneral.g_sCurrentMissionDisplayTitle, sTemp2); - if (!bSame) + if (restore) { - strcopy(g_esGeneral.g_sCurrentMissionName, sizeof esGeneral::g_sCurrentMissionName, sTemp); - strcopy(g_esGeneral.g_sCurrentMissionDisplayTitle, sizeof esGeneral::g_sCurrentMissionDisplayTitle, sTemp2); + vRemoveWeapons(survivor); + vGiveSurvivorWeapons(survivor); + vSetupLoadout(survivor); + vRefreshLaserSight(survivor); + vGiveGunSpecialAmmo(survivor); } - return bSame; + return true; } } return false; } -bool bIsScavengeMode() +float flGetPelletChance(int survivor, float chance) { - return g_esGeneral.g_iCurrentMode == 8; -} + float flValue = chance; + if (StrEqual(g_esPlayer[survivor].g_sWeaponCurrent[7], "pumpshotgun")) + { + flValue = (chance / 10.0); + } + else if (StrEqual(g_esPlayer[survivor].g_sWeaponCurrent[7], "shotgun_chrome")) + { + flValue = (chance / 8.0); + } + else if (StrEqual(g_esPlayer[survivor].g_sWeaponCurrent[7], "autoshotgun")) + { + flValue = (g_bSecondGame ? 11.0 : 12.0); + flValue = (chance / flValue); + } + else if (StrEqual(g_esPlayer[survivor].g_sWeaponCurrent[7], "shotgun_spas")) + { + flValue = (chance / 9.0); + } -bool bIsSmokerEnabled(int type) -{ - int iTypes = iGetSettingValue(true, true, g_esSpecial[type].g_iSpecialTypes, g_esSpecific.g_iSpecialTypes, 1); - return iTypes > 0 && (iTypes & MT_SPECINF_SMOKER); + return flClamp(flValue, 0.1, 100.0); } -bool bIsSpitterEnabled(int type) +float flGetPunchForce(int survivor, float force) { - int iTypes = iGetSettingValue(true, true, g_esSpecial[type].g_iSpecialTypes, g_esSpecific.g_iSpecialTypes, 1); - return iTypes > 0 && (iTypes & MT_SPECINF_SPITTER); + bool bDeveloper = bIsDeveloper(survivor, 4); + if (bDeveloper || (((g_esShooter[survivor].g_iTotalPassives & MT_PASSIVE_GODMODE) || (g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_GODMODE)) && g_esPlayer[survivor].g_iRiotGear == 1)) + { + float flForce = (bDeveloper && g_esDeveloper[survivor].g_flDevPunchResistance > g_esPlayer[survivor].g_flPunchResistance) ? g_esDeveloper[survivor].g_flDevPunchResistance : g_esPlayer[survivor].g_flPunchResistance; + if (force < 0.0 || force >= flForce) + { + return flForce; + } + } + + return force; } -bool bIsSpawnEnabled(int type, int specType) +float flGetScaledDamage(float damage) { - if (specType > 0 && specType != 8) + if (g_esGeneral.g_cvMTDifficulty != null && g_esGeneral.g_iScaleDamage == 1) { - return iGetSubSettingValue(true, true, g_esSpecial[type].g_iSpawnEnabled, g_esTank[type].g_iSpawnEnabled, g_esSpecific.g_iSpawnEnabled, g_esGeneral.g_iSpawnEnabled, 1) == 1; + char sDifficulty[11]; + g_esGeneral.g_cvMTDifficulty.GetString(sDifficulty, sizeof sDifficulty); + + switch (sDifficulty[0]) + { + case 'e', 'E': return (g_esGeneral.g_flDifficultyDamage[0] > 0.0) ? (damage * g_esGeneral.g_flDifficultyDamage[0]) : damage; + case 'n', 'N': return (g_esGeneral.g_flDifficultyDamage[1] > 0.0) ? (damage * g_esGeneral.g_flDifficultyDamage[1]) : damage; + case 'h', 'H': return (g_esGeneral.g_flDifficultyDamage[2] > 0.0) ? (damage * g_esGeneral.g_flDifficultyDamage[2]) : damage; + case 'i', 'I': return (g_esGeneral.g_flDifficultyDamage[3] > 0.0) ? (damage * g_esGeneral.g_flDifficultyDamage[3]) : damage; + } } - return iGetSettingValue(true, true, g_esTank[type].g_iSpawnEnabled, g_esGeneral.g_iSpawnEnabled, 1) == 1; + return damage; } -bool bIsSpecialEnabled(int type) +float flGetTypeChance(int tank, int type, int specType = 0) { - return bIsBoomerEnabled(type) || bIsChargerEnabled(type) || bIsHunterEnabled(type) || bIsJockeyEnabled(type) || bIsSmokerEnabled(type) || bIsSpitterEnabled(type); -} + int iSpecType = ((tank > 0 && specType <= 0) ? g_esPlayer[tank].g_iInfectedType : specType); + float flSpecialChance = flGetSubSettingValue(true, true, g_esSpecial[type].g_flSpecialChance, g_esTank[type].g_flTankChance, g_esSpecific.g_flSpecialChance, g_esGeneral.g_flTankChance, 1), + flTankChance = flGetSettingValue(true, true, g_esTank[type].g_flTankChance, g_esGeneral.g_flTankChance, 1); -bool bIsSpecialRandomType(int type, int specType, int special = 0) -{ - int iRandom = (specType != 8) ? g_esSpecial[type].g_iRandomSpecial : -1; - return (special > 0 && g_esCache[special].g_iRandomSpecial == 1) || iRandom == 1 || (iRandom < 0 && g_esTank[type].g_iRandomTank == 1); + return ((iSpecType != 8) ? flSpecialChance : flTankChance); } -bool bIsSurvivalMode() +int iChooseInfectedType(int infected, int min = -1, int max = -1) { - return g_esGeneral.g_iCurrentMode == 4; -} + bool bCommon = bIsCommonInfected(infected), bVariant = true, bWitch = bIsWitch(infected); + char sModel[64]; + int iMin = (min >= 0) ? min : iGetMinType(), iMax = (max >= 0) ? max : iGetMaxType(); + if (iMax < iMin || (bIsSurvivalMode() && g_esGeneral.g_iSurvivalBlock != 2)) + { + return 0; + } + + float flRandom = GetRandomFloat(0.1, 100.0), flChance = 0.0; + int iBackupCount = 0, iBackupTypes[MT_MAXTYPES + 1], iCount = iGetInfectedTypeCount(infected), + iType = 0, iTypeCount = 0, iTankTypes[MT_MAXTYPES + 1], iVariant = -1; + for (int iIndex = iMin; iIndex <= iMax; iIndex++) + { + if (iIndex <= 0) + { + continue; + } + + bVariant = true; + iType = g_esTank[iIndex].g_iRecordedType[0]; + + switch (bWitch) + { + case true: flChance = flGetSubSettingValue(true, true, g_esHorde[iIndex].g_flWitchChance, g_esTank[iIndex].g_flTankChance, g_esMob.g_flWitchChance, g_esGeneral.g_flTankChance, 1); + case false: + { + flChance = flGetSubSettingValue(true, true, g_esHorde[iIndex].g_flCommonChance, g_esTank[iIndex].g_flTankChance, g_esMob.g_flCommonChance, g_esGeneral.g_flTankChance, 1); + iVariant = iGetSettingValue(true, true, g_esHorde[iIndex].g_iCommonVariant, g_esMob.g_iCommonVariant, 1); + } + } + + if (iVariant >= 0) + { + GetEntPropString(infected, Prop_Data, "m_ModelName", sModel, sizeof sModel); + for (int iBit = 1; iBit <= (sizeof g_sUncommonModels); iBit++) + { + if (StrEqual(sModel, g_sUncommonModels[iBit - 1])) + { + bVariant = (iVariant == 0 || (iVariant & (1 << iBit))); + + break; + } + } + } + + if (!bVariant || !bIsRightGame(iType, 8) || g_esTank[iType].g_iSpawnType > 0 || (bCommon && !bIsCommonEnabled(iType)) || (bWitch && !bIsWitchEnabled(iType)) || !bIsSpawnEnabled(iType, 8) || !bIsTypeAvailable(iType) || bAreHumansRequired(iType, 8) || !bCanTypeSpawn(iType, 8) || flChance <= 0.0 || (g_esGeneral.g_iSpawnLimit > 0 && iCount >= g_esGeneral.g_iSpawnLimit) || (0 < g_esSpecial[iType].g_iTypeLimit <= iGetInfectedTypeCount(infected, iType)) || bIsBossLimited(iType) || (g_esInfected[infected].g_iTankType == iType)) + { + continue; + } -bool bIsTankEnabled(int type) -{ - return iGetSettingValue(true, true, g_esTank[type].g_iTankEnabled, g_esGeneral.g_iTankEnabled, 1) == 1; -} + switch (flChance <= flRandom) + { + case true: continue; + case false: + { + iBackupTypes[iBackupCount + 1] = iType; + iBackupCount++; + } + } -#if defined _actions_included -bool bIsTankIdle(const char[] action, int target = 0, int type = 0) -{ - switch (type) - { - case 0, 3: return StrEqual(action, "TankIdle") || StrEqual(action, "TankBehavior") || (StrContains(action, "Attack") != -1 && !bIsSurvivor(target)); - case 1: return StrEqual(action, "TankIdle") || (StrContains(action, "Attack") != -1 && !bIsSurvivor(target)); - case 2: return StrEqual(action, "TankBehavior") || (StrContains(action, "Attack") != -1 && !bIsSurvivor(target)); + iTankTypes[iTypeCount + 1] = iType; + iTypeCount++; } - return false; -} -#endif + int iFinalCount = (iTypeCount > 0) ? iTypeCount : 0, iFinalType = ((iTypeCount > 0) ? iTankTypes[MT_GetRandomInt(1, iTypeCount)] : 0), + iBackupType = ((iBackupCount > 0) ? iBackupTypes[MT_GetRandomInt(1, iBackupCount)] : 0), iChosen = ((iFinalCount > 0) ? iFinalType : iBackupType); -bool bIsTankRandomType(int type, int tank = 0) -{ - return (tank > 0 && g_esCache[tank].g_iRandomTank == 1) || g_esTank[type].g_iRandomTank == 1; + return iChosen; } -bool bIsTankSupported(int tank, int flags = MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_ALIVE) +int iChooseMutantInfected(int infected, int min = -1, int max = -1, bool mutate = true) { - if (!bIsTank(tank, flags) || (g_esPlayer[tank].g_iTankType <= 0) || (bIsTank(tank, MT_CHECK_FAKECLIENT) && !bIsHumanSupported(tank))) + int iChosen = iChooseInfectedType(infected, min, max); + if (iChosen > 0) { - return false; + int iRealType = g_esTank[iChosen].g_iRealType[0]; + if (iRealType > 0) + { + if (mutate) + { + vSetInfectedColor(infected, iRealType, bIsWitch(infected)); + } + + return iRealType; + } + + return iChosen; } - return true; + return 0; } -bool bIsTypeAvailable(int type, int tank = 0) +int iChooseMutantTank(int tank, int exclude, int min = -1, int max = -1, bool mutate = true) { - if ((tank > 0 && g_esCache[tank].g_iCheckAbilities <= 0) && g_esGeneral.g_iCheckAbilities <= 0 && g_esTank[type].g_iCheckAbilities <= 0) + if (g_esShooter[tank].g_bSurvivor || g_esShooter[tank].g_bProduced) { - return true; - } + int iTypeCount = 0, iTankTypes[MT_MAXTYPES + 1]; + for (int iIndex = 0; iIndex <= MT_MAXTYPES; iIndex++) + { + if (g_esShooter[tank].g_bInfected[iIndex]) + { + iTankTypes[iTypeCount + 1] = iIndex; + iTypeCount++; + } + } - int iPluginCount = 0; - for (int iPos = 0; iPos < MT_MAXABILITIES; iPos++) - { - if (!g_esGeneral.g_bAbilityPlugin[iPos]) + if (iTypeCount > 0) { - continue; + int iChosen = iTankTypes[MT_GetRandomInt(1, iTypeCount)], iRealType = iGetRealType(iChosen, exclude, tank, min, max); + if (iRealType > 0) + { + if (mutate) + { + vSetTankColor(tank, iRealType, false, .store = bIsTank(tank)); + } + + return iRealType; + } + + return iChosen; } + } + else + { + int iChosen = iChooseTankType(exclude, tank, min, max); + if (iChosen > 0) + { + int iRealType = iGetRealType(iChosen, exclude, tank, min, max); + if (iRealType > 0) + { + if (mutate) + { + vSetTankColor(tank, iRealType, false, .store = bIsTank(tank)); + } - iPluginCount++; + return iRealType; + } + + return iChosen; + } } - return g_esTank[type].g_iAbilityCount == -1 || (g_esTank[type].g_iAbilityCount > 0 && iPluginCount > 0); + return 0; } -bool bIsTypeCycled(int specType, int type, bool manual) +int iChooseTankType(int exclude, int tank, int min = -1, int max = -1) { - bool bCycled = false, bSpecial = specType > 0 && specType != 8; - - switch (manual) + bool bCondition = false, bTank = bIsTank(tank); + int iClass = 8, iSpecType = g_esPlayer[tank].g_iInfectedType, iMin = (min >= 0) ? min : iGetMinType(iSpecType, bTank), iMax = (max >= 0) ? max : iGetMaxType(iSpecType, bTank); + if (iMax < iMin || (bIsSurvivalMode() && g_esGeneral.g_iSurvivalBlock != 2)) { - case true: bCycled = bSpecial ? g_esSpecial[type].g_bTypeCycled2[specType] : g_esTank[type].g_bTypeCycled2; - case false: bCycled = bSpecial ? g_esSpecial[type].g_bTypeCycled[specType] : g_esTank[type].g_bTypeCycled; + return 0; } - return iGetCycleType(specType) > 0 && bCycled; -} - -bool bIsTypeShown(int admin, int type, int specType) -{ - bool bReturn = false; - int iFlags = g_esPlayer[admin].g_iMenuFlags; - if (iFlags > 0) + char sTypeClass[65]; + float flClose = 0.0, flOpen = 0.0, flRandom = GetRandomFloat(0.1, 100.0), flChance = 0.0; + int iBackupCount = 0, iBackupTypes[MT_MAXTYPES + 1], iCycleCount = 0, iCycleTypes[MT_MAXTYPES + 1], + iCount = iGetTankTypeCount(tank), iType = 0, iTypeCount = 0, iTypeLimit = 0, iTankTypes[MT_MAXTYPES + 1]; + for (int iIndex = iMin; iIndex <= iMax; iIndex++) { - if (iFlags & MT_MENUFLAG_INDOOR) + if (iIndex <= 0) { - bReturn = g_esTank[type].g_flCloseAreasOnly > 0.0; + continue; } - if (iFlags & MT_MENUFLAG_OUTDOOR) + iType = g_esTank[iIndex].g_iRecordedType[0]; + flChance = flGetTypeChance(tank, iType, iSpecType); + if (iSpecType > 0 && iSpecType != iClass) { - bReturn = g_esTank[type].g_flOpenAreasOnly > 0.0; + flClose = g_esSpecial[iType].g_flCloseAreasOnly; + flOpen = g_esSpecial[iType].g_flOpenAreasOnly; + iTypeLimit = g_esSpecial[iType].g_iTypeLimit; + + switch (iSpecType) + { + case 1: sTypeClass = (g_esSpecial[iType].g_sSmokerClass[0] != '\0') ? g_esSpecial[iType].g_sSmokerClass : g_esTank[iType].g_sTankClass; + case 2: sTypeClass = (g_esSpecial[iType].g_sBoomerClass[0] != '\0') ? g_esSpecial[iType].g_sBoomerClass : g_esTank[iType].g_sTankClass; + case 3: sTypeClass = (g_esSpecial[iType].g_sHunterClass[0] != '\0') ? g_esSpecial[iType].g_sHunterClass : g_esTank[iType].g_sTankClass; + case 4: sTypeClass = (g_esSpecial[iType].g_sSpitterClass[0] != '\0') ? g_esSpecial[iType].g_sSpitterClass : g_esTank[iType].g_sTankClass; + case 5: sTypeClass = (g_esSpecial[iType].g_sJockeyClass[0] != '\0') ? g_esSpecial[iType].g_sJockeyClass : g_esTank[iType].g_sTankClass; + case 6: sTypeClass = (g_esSpecial[iType].g_sChargerClass[0] != '\0') ? g_esSpecial[iType].g_sChargerClass : g_esTank[iType].g_sTankClass; + } } - if (iFlags & MT_MENUFLAG_HUMANS) + vRecycleType(iSpecType, iType, false); + + switch (exclude) { - bReturn = bAreHumansRequired(type, specType, 0); + case 1: + { + switch (iSpecType) + { + case 1: bCondition = !bIsRightGame(iType, iSpecType) || (bIsSmoker(tank) && !bIsSmokerEnabled(iType)) || !bHasCoreAdminAccess(tank, iType) || !bIsSpawnEnabled(iType, iSpecType) || !bIsTypeAvailable(iType, tank) || bAreHumansRequired(iType, iSpecType) || !bCanTypeSpawn(iType, iSpecType) || bIsAreaNarrow(tank, flOpen) || bIsAreaWide(tank, flClose) || flChance <= 0.0 || (g_esGeneral.g_iSpawnLimit > 0 && iCount >= g_esGeneral.g_iSpawnLimit) || (0 < iTypeLimit <= iGetTankTypeCount(tank, iType)) || (sTypeClass[0] != '\0' && bIsClassLimited(tank, sTypeClass, iType, iSpecType)) || bIsBossLimited(iType) || (g_esPlayer[tank].g_iTankType == iType); + case 2: bCondition = !bIsRightGame(iType, iSpecType) || (bIsBoomer(tank) && !bIsBoomerEnabled(iType)) || !bHasCoreAdminAccess(tank, iType) || !bIsSpawnEnabled(iType, iSpecType) || !bIsTypeAvailable(iType, tank) || bAreHumansRequired(iType, iSpecType) || !bCanTypeSpawn(iType, iSpecType) || bIsAreaNarrow(tank, flOpen) || bIsAreaWide(tank, flClose) || flChance <= 0.0 || (g_esGeneral.g_iSpawnLimit > 0 && iCount >= g_esGeneral.g_iSpawnLimit) || (0 < iTypeLimit <= iGetTankTypeCount(tank, iType)) || (sTypeClass[0] != '\0' && bIsClassLimited(tank, sTypeClass, iType, iSpecType)) || bIsBossLimited(iType) || (g_esPlayer[tank].g_iTankType == iType); + case 3: bCondition = !bIsRightGame(iType, iSpecType) || (bIsHunter(tank) && !bIsHunterEnabled(iType)) || !bHasCoreAdminAccess(tank, iType) || !bIsSpawnEnabled(iType, iSpecType) || !bIsTypeAvailable(iType, tank) || bAreHumansRequired(iType, iSpecType) || !bCanTypeSpawn(iType, iSpecType) || bIsAreaNarrow(tank, flOpen) || bIsAreaWide(tank, flClose) || flChance <= 0.0 || (g_esGeneral.g_iSpawnLimit > 0 && iCount >= g_esGeneral.g_iSpawnLimit) || (0 < iTypeLimit <= iGetTankTypeCount(tank, iType)) || (sTypeClass[0] != '\0' && bIsClassLimited(tank, sTypeClass, iType, iSpecType)) || bIsBossLimited(iType) || (g_esPlayer[tank].g_iTankType == iType); + case 4: bCondition = !bIsRightGame(iType, iSpecType) || (bIsSpitter(tank) && !bIsSpitterEnabled(iType)) || !bHasCoreAdminAccess(tank, iType) || !bIsSpawnEnabled(iType, iSpecType) || !bIsTypeAvailable(iType, tank) || bAreHumansRequired(iType, iSpecType) || !bCanTypeSpawn(iType, iSpecType) || bIsAreaNarrow(tank, flOpen) || bIsAreaWide(tank, flClose) || flChance <= 0.0 || (g_esGeneral.g_iSpawnLimit > 0 && iCount >= g_esGeneral.g_iSpawnLimit) || (0 < iTypeLimit <= iGetTankTypeCount(tank, iType)) || (sTypeClass[0] != '\0' && bIsClassLimited(tank, sTypeClass, iType, iSpecType)) || bIsBossLimited(iType) || (g_esPlayer[tank].g_iTankType == iType); + case 5: bCondition = !bIsRightGame(iType, iSpecType) || (bIsJockey(tank) && !bIsJockeyEnabled(iType)) || !bHasCoreAdminAccess(tank, iType) || !bIsSpawnEnabled(iType, iSpecType) || !bIsTypeAvailable(iType, tank) || bAreHumansRequired(iType, iSpecType) || !bCanTypeSpawn(iType, iSpecType) || bIsAreaNarrow(tank, flOpen) || bIsAreaWide(tank, flClose) || flChance <= 0.0 || (g_esGeneral.g_iSpawnLimit > 0 && iCount >= g_esGeneral.g_iSpawnLimit) || (0 < iTypeLimit <= iGetTankTypeCount(tank, iType)) || (sTypeClass[0] != '\0' && bIsClassLimited(tank, sTypeClass, iType, iSpecType)) || bIsBossLimited(iType) || (g_esPlayer[tank].g_iTankType == iType); + case 6: bCondition = !bIsRightGame(iType, iSpecType) || (bIsCharger(tank) && !bIsChargerEnabled(iType)) || !bHasCoreAdminAccess(tank, iType) || !bIsSpawnEnabled(iType, iSpecType) || !bIsTypeAvailable(iType, tank) || bAreHumansRequired(iType, iSpecType) || !bCanTypeSpawn(iType, iSpecType) || bIsAreaNarrow(tank, flOpen) || bIsAreaWide(tank, flClose) || flChance <= 0.0 || (g_esGeneral.g_iSpawnLimit > 0 && iCount >= g_esGeneral.g_iSpawnLimit) || (0 < iTypeLimit <= iGetTankTypeCount(tank, iType)) || (sTypeClass[0] != '\0' && bIsClassLimited(tank, sTypeClass, iType, iSpecType)) || bIsBossLimited(iType) || (g_esPlayer[tank].g_iTankType == iType); + default: bCondition = !bIsRightGame(iType, iSpecType) || (bTank && !bIsTankEnabled(iType)) || !bHasCoreAdminAccess(tank, iType) || !bIsSpawnEnabled(iType, iSpecType) || !bIsTypeAvailable(iType, tank) || bAreHumansRequired(iType, iSpecType) || !bCanTypeSpawn(iType, iSpecType) || bIsAreaNarrow(tank, g_esTank[iType].g_flOpenAreasOnly) || bIsAreaWide(tank, g_esTank[iType].g_flCloseAreasOnly) || flChance <= 0.0 || (g_esGeneral.g_iSpawnLimit > 0 && iCount >= g_esGeneral.g_iSpawnLimit) || (0 < g_esTank[iType].g_iTypeLimit <= iGetTankTypeCount(tank, iType)) || (g_esTank[iType].g_sTankClass[0] != '\0' && bIsClassLimited(tank, g_esTank[iType].g_sTankClass, iType, iSpecType)) || bIsBossLimited(iType) || (g_esPlayer[tank].g_iTankType == iType); + } + } + case 2: + { + switch (iSpecType) + { + case 1: bCondition = !bIsRightGame(iType, iSpecType) || (bIsSmoker(tank) && !bIsSmokerEnabled(iType)) || !bHasCoreAdminAccess(tank) || !bIsSpecialRandomType(iType, iSpecType) || !bIsSpawnEnabled(iType, iSpecType) || (bIsSmoker(tank, MT_CHECK_FAKECLIENT) && !bIsSpecialRandomType(iType, iSpecType)) || (g_esPlayer[tank].g_iTankType == iType) || !bIsTypeAvailable(iType, tank) || bAreHumansRequired(iType, iSpecType) || !bCanTypeSpawn(iType, iSpecType) || bIsAreaNarrow(tank, flOpen) || bIsAreaWide(tank, flClose) || flChance <= 0.0; + case 2: bCondition = !bIsRightGame(iType, iSpecType) || (bIsBoomer(tank) && !bIsBoomerEnabled(iType)) || !bHasCoreAdminAccess(tank) || !bIsSpecialRandomType(iType, iSpecType) || !bIsSpawnEnabled(iType, iSpecType) || (bIsBoomer(tank, MT_CHECK_FAKECLIENT) && !bIsSpecialRandomType(iType, iSpecType)) || (g_esPlayer[tank].g_iTankType == iType) || !bIsTypeAvailable(iType, tank) || bAreHumansRequired(iType, iSpecType) || !bCanTypeSpawn(iType, iSpecType) || bIsAreaNarrow(tank, flOpen) || bIsAreaWide(tank, flClose) || flChance <= 0.0; + case 3: bCondition = !bIsRightGame(iType, iSpecType) || (bIsHunter(tank) && !bIsHunterEnabled(iType)) || !bHasCoreAdminAccess(tank) || !bIsSpecialRandomType(iType, iSpecType) || !bIsSpawnEnabled(iType, iSpecType) || (bIsHunter(tank, MT_CHECK_FAKECLIENT) && !bIsSpecialRandomType(iType, iSpecType)) || (g_esPlayer[tank].g_iTankType == iType) || !bIsTypeAvailable(iType, tank) || bAreHumansRequired(iType, iSpecType) || !bCanTypeSpawn(iType, iSpecType) || bIsAreaNarrow(tank, flOpen) || bIsAreaWide(tank, flClose) || flChance <= 0.0; + case 4: bCondition = !bIsRightGame(iType, iSpecType) || (bIsSpitter(tank) && !bIsSpitterEnabled(iType)) || !bHasCoreAdminAccess(tank) || !bIsSpecialRandomType(iType, iSpecType) || !bIsSpawnEnabled(iType, iSpecType) || (bIsSpitter(tank, MT_CHECK_FAKECLIENT) && !bIsSpecialRandomType(iType, iSpecType)) || (g_esPlayer[tank].g_iTankType == iType) || !bIsTypeAvailable(iType, tank) || bAreHumansRequired(iType, iSpecType) || !bCanTypeSpawn(iType, iSpecType) || bIsAreaNarrow(tank, flOpen) || bIsAreaWide(tank, flClose) || flChance <= 0.0; + case 5: bCondition = !bIsRightGame(iType, iSpecType) || (bIsJockey(tank) && !bIsJockeyEnabled(iType)) || !bHasCoreAdminAccess(tank) || !bIsSpecialRandomType(iType, iSpecType) || !bIsSpawnEnabled(iType, iSpecType) || (bIsJockey(tank, MT_CHECK_FAKECLIENT) && !bIsSpecialRandomType(iType, iSpecType)) || (g_esPlayer[tank].g_iTankType == iType) || !bIsTypeAvailable(iType, tank) || bAreHumansRequired(iType, iSpecType) || !bCanTypeSpawn(iType, iSpecType) || bIsAreaNarrow(tank, flOpen) || bIsAreaWide(tank, flClose) || flChance <= 0.0; + case 6: bCondition = !bIsRightGame(iType, iSpecType) || (bIsCharger(tank) && !bIsChargerEnabled(iType)) || !bHasCoreAdminAccess(tank) || !bIsSpecialRandomType(iType, iSpecType) || !bIsSpawnEnabled(iType, iSpecType) || (bIsCharger(tank, MT_CHECK_FAKECLIENT) && !bIsSpecialRandomType(iType, iSpecType)) || (g_esPlayer[tank].g_iTankType == iType) || !bIsTypeAvailable(iType, tank) || bAreHumansRequired(iType, iSpecType) || !bCanTypeSpawn(iType, iSpecType) || bIsAreaNarrow(tank, flOpen) || bIsAreaWide(tank, flClose) || flChance <= 0.0; + default: bCondition = !bIsRightGame(iType, iSpecType) || (bTank && !bIsTankEnabled(iType)) || !bHasCoreAdminAccess(tank) || !bIsTankRandomType(iType) || !bIsSpawnEnabled(iType, iSpecType) || (bIsTank(tank, MT_CHECK_FAKECLIENT) && !bIsTankRandomType(iType, tank)) || (g_esPlayer[tank].g_iTankType == iType) || !bIsTypeAvailable(iType, tank) || bAreHumansRequired(iType, iSpecType) || !bCanTypeSpawn(iType, iSpecType) || bIsAreaNarrow(tank, g_esTank[iType].g_flOpenAreasOnly) || bIsAreaWide(tank, g_esTank[iType].g_flCloseAreasOnly) || flChance <= 0.0; + } + } } - if (iFlags & MT_MENUFLAG_BOTS) + if (bCondition) { - bReturn = !bAreHumansRequired(type, specType, 0); + continue; } - if (iFlags & MT_MENUFLAG_SPAWNABLE) + switch (flChance <= flRandom) { - bReturn = bIsSpawnEnabled(type, specType) && bCanTypeSpawn(type, specType); + case true: continue; + case false: + { + iBackupTypes[iBackupCount + 1] = iType; + iBackupCount++; + } } - if (iFlags & MT_MENUFLAG_UNSPAWNABLE) + iCycleTypes[iCycleCount + 1] = iType; + iCycleCount++; + + if (bIsTypeCycled(iSpecType, iType, false)) { - bReturn = !bIsSpawnEnabled(type, specType) || !bCanTypeSpawn(type, specType); + continue; } - if (iFlags & MT_MENUFLAG_COMPETITIVE) + iTankTypes[iTypeCount + 1] = iType; + iTypeCount++; + } + + bool bLinear = iGetCycleType(iSpecType) >= 3; + int iFinalCount = (iTypeCount > 0) ? iTypeCount : iCycleCount, iFinalType = ((iTypeCount > 0) ? iTankTypes[(bLinear ? 1 : MT_GetRandomInt(1, iTypeCount))] : iCycleTypes[(bLinear ? 1 : MT_GetRandomInt(1, iCycleCount))]), + iBackupType = ((iBackupCount > 0) ? iBackupTypes[(bLinear ? 1 : MT_GetRandomInt(1, iBackupCount))] : 0), iChosen = ((iFinalCount > 0) ? iFinalType : iBackupType), iPos = ((iSpecType != iClass) ? iSpecType : 0); + + g_esGeneral.g_bRecycleTypes = (iSpecType == iClass && iTypeCount <= 0 && iCycleCount > 0); + g_esTank[iChosen].g_bTypeCycled = (iSpecType == iClass); + g_esSpecific.g_bRecycleTypes[iPos] = (iSpecType != iClass && iTypeCount <= 0 && iCycleCount > 0); + g_esSpecial[iChosen].g_bTypeCycled[iPos] = (iSpecType != iClass); + + return iChosen; +} + +int iFindSectionType(const char[] section, int type) +{ + if (FindCharInString(section, ',') != -1 || FindCharInString(section, '-') != -1) + { + char sSection[PLATFORM_MAX_PATH], sSet[16][10]; + int iType = 0, iSize = 0; + strcopy(sSection, sizeof sSection, section); + if (FindCharInString(section, ',') != -1) { - bReturn = bIsHumanSupported(admin, specType); + char sRange[2][5]; + ExplodeString(sSection, ",", sSet, sizeof sSet, sizeof sSet[]); + for (int iPos = 0; iPos < (sizeof sSet); iPos++) + { + if (FindCharInString(sSet[iPos], '-') != -1) + { + ExplodeString(sSet[iPos], "-", sRange, sizeof sRange, sizeof sRange[]); + iSize = StringToInt(sRange[1]); + for (iType = StringToInt(sRange[0]); iType <= iSize; iType++) + { + if (type == iType) + { + return iType; + } + } + } + else + { + iType = StringToInt(sSet[iPos]); + if (type == iType) + { + return iType; + } + } + } + } + else if (FindCharInString(section, '-') != -1) + { + ExplodeString(sSection, "-", sSet, sizeof sSet, sizeof sSet[]); + iSize = StringToInt(sSet[1]); + for (iType = StringToInt(sSet[0]); iType <= iSize; iType++) + { + if (type == iType) + { + return iType; + } + } } } - else + + return 0; +} + +int iGetConfigSectionNumber(const char[] section, int size) +{ + for (int iPos = 0; iPos < size; iPos++) { - bReturn = !bIsAreaWide(admin, g_esTank[type].g_flCloseAreasOnly) || !bIsAreaNarrow(admin, g_esTank[type].g_flOpenAreasOnly) - || bAreHumansRequired(type, specType) || bCanTypeSpawn(type, specType); + if (IsCharNumeric(section[iPos])) + { + return iPos; + } } - return bReturn || (iFlags & MT_MENUFLAG_ALL); + return -1; } -bool bIsVersusMode() +int iGetCycleType(int specType) { - return g_esGeneral.g_iCurrentMode == 2; + return (specType > 0 && specType != 8) ? iGetSettingValue(true, true, g_esSpecific.g_iCycleTypes, g_esGeneral.g_iCycleTypes, 1) : g_esGeneral.g_iCycleTypes; } -bool bIsWrongRushType(const char[] item) +int iGetDecimalFromHex(int character) { - if (!(g_esGeneral.g_iRushTypes & MT_RUSHTYPE_SMOKER) && StrContains(item, "smoker") == 0) + if (IsCharNumeric(character)) { - return true; + return (character - '0'); } - - if (!(g_esGeneral.g_iRushTypes & MT_RUSHTYPE_BOOMER) && StrContains(item, "boomer") == 0) + else if (IsCharAlpha(character)) { - return true; + int iLetter = CharToUpper(character); + if (iLetter < 'A' || iLetter > 'F') + { + return -1; + } + + return ((iLetter - 'A') + 10); } - if (!(g_esGeneral.g_iRushTypes & MT_RUSHTYPE_HUNTER) && StrContains(item, "hunter") == 0) + return -1; +} + +int iGetDecimalFromHex2(char[] bytes) +{ + int iBase = 1, iLength = strlen(bytes), iValue = 0; + for (int iPos = (iLength - 1); iPos >= 0; iPos--) { - return true; + if (bytes[iPos] >= '0' && bytes[iPos] <= '9') + { + iValue += (bytes[iPos] - 48) * iBase; + iBase = (iBase * 16); + } + else if (bytes[iPos] >= 'A' && bytes[iPos] <= 'F') + { + iValue += (bytes[iPos] - 55) * iBase; + iBase = (iBase * 16); + } } - if (!(g_esGeneral.g_iRushTypes & MT_RUSHTYPE_SPITTER) && StrContains(item, "spitter") == 0) - { - return true; - } + return iValue; +} - if (!(g_esGeneral.g_iRushTypes & MT_RUSHTYPE_JOCKEY) && StrContains(item, "jockey") == 0) - { - return true; - } +int iGetFinaleType(int type, int specType) +{ + int iFinale = (specType != 8) ? g_esSpecial[type].g_iFinaleSpecial : -1; + iFinale = (specType != 8 && iFinale >= 0) ? iFinale : g_esTank[type].g_iFinaleTank; + return iFinale; +} - if (!(g_esGeneral.g_iRushTypes & MT_RUSHTYPE_CHARGER) && StrContains(item, "charger") == 0) +int iGetInfectedTypeCount(int infected, int type = 0) +{ + bool bCheck = false; + int iInfected = -1, iTypeCount = 0; + if (bIsCommonInfected(infected)) { - return true; + while ((iInfected = FindEntityByClassname(iInfected, "infected")) != INVALID_ENT_REFERENCE) + { + bCheck = (type > 0) ? (g_esInfected[iInfected].g_iTankType == type) : (g_esInfected[iInfected].g_iTankType > 0); + if (bCheck) + { + iTypeCount++; + } + } } - - if (!(g_esGeneral.g_iRushTypes & MT_RUSHTYPE_TANK) && StrContains(item, "tank") == 0) + else if (bIsWitch(infected)) { - return true; + while ((iInfected = FindEntityByClassname(iInfected, "witch")) != INVALID_ENT_REFERENCE) + { + bCheck = (type > 0) ? (g_esInfected[iInfected].g_iTankType == type) : (g_esInfected[iInfected].g_iTankType > 0); + if (bCheck) + { + iTypeCount++; + } + } } - return false; + return iTypeCount; } -bool bRespawnSurvivor(int survivor, bool restore) +int iGetMaxAmmo(int survivor, int type, int weapon, bool reserve, bool reset = false) { - if (!bIsSurvivor(survivor, MT_CHECK_ALIVE) && g_esGeneral.g_hSDKRoundRespawn != null) + bool bRewarded = bIsSurvivor(survivor) && (bIsDeveloper(survivor, 4) || bIsDeveloper(survivor, 6) || (((g_esShooter[survivor].g_iTotalPassives & MT_PASSIVE_AMMO) || (g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_AMMO)) && g_esPlayer[survivor].g_iAmmoBoost == 1)); + int iType = (type > 0 || weapon <= MaxClients) ? type : GetEntProp(weapon, Prop_Send, "m_iPrimaryAmmoType"); + if (g_bSecondGame) { - bool bTeleport = false; - float flOrigin[3], flAngles[3]; - for (int iTeammate = 1; iTeammate <= MaxClients; iTeammate++) + if (reserve) { - if (bIsSurvivor(iTeammate) && !bIsSurvivorHanging(iTeammate) && iTeammate != survivor) + switch (iType) { - bTeleport = true; - - GetClientAbsOrigin(iTeammate, flOrigin); - GetClientEyeAngles(iTeammate, flAngles); - flAngles[2] = 0.0; - - break; + case MT_L4D2_AMMOTYPE_RIFLE: return (bRewarded && !reset) ? (g_esGeneral.g_cvMTAssaultRifleAmmo.IntValue * 2) : g_esGeneral.g_cvMTAssaultRifleAmmo.IntValue; + case MT_L4D2_AMMOTYPE_SMG: return (bRewarded && !reset) ? iClamp(RoundToNearest(g_esGeneral.g_cvMTSMGAmmo.IntValue * 1.23), 1, 1000) : g_esGeneral.g_cvMTSMGAmmo.IntValue; + case MT_L4D2_AMMOTYPE_SHOTGUN_TIER1: return (bRewarded && !reset) ? iClamp(RoundToNearest(g_esGeneral.g_cvMTShotgunAmmo.IntValue * 2.08), 1, 255) : g_esGeneral.g_cvMTShotgunAmmo.IntValue; + case MT_L4D2_AMMOTYPE_SHOTGUN_TIER2: return (bRewarded && !reset) ? iClamp(RoundToNearest(g_esGeneral.g_cvMTAutoShotgunAmmo.IntValue * 2.22), 1, 255) : g_esGeneral.g_cvMTAutoShotgunAmmo.IntValue; + case MT_L4D2_AMMOTYPE_HUNTING_RIFLE: return (bRewarded && !reset) ? (g_esGeneral.g_cvMTHuntingRifleAmmo.IntValue * 2) : g_esGeneral.g_cvMTHuntingRifleAmmo.IntValue; + case MT_L4D2_AMMOTYPE_SNIPER_RIFLE: return (bRewarded && !reset) ? (g_esGeneral.g_cvMTSniperRifleAmmo.IntValue * 2) : g_esGeneral.g_cvMTSniperRifleAmmo.IntValue; + case MT_L4D2_AMMOTYPE_GRENADE_LAUNCHER: return (bRewarded && !reset) ? (g_esGeneral.g_cvMTGrenadeLauncherAmmo.IntValue * 2) : g_esGeneral.g_cvMTGrenadeLauncherAmmo.IntValue; } } - - if (bTeleport) + else { - vRespawnSurvivor(survivor); - TeleportEntity(survivor, flOrigin, flAngles); - vFixPlayerPosition(survivor); - - if (restore) + switch (iType) { - vRemoveWeapons(survivor); - vGiveSurvivorWeapons(survivor); - vSetupLoadout(survivor); - vRefreshLaserSight(survivor); - vGiveGunSpecialAmmo(survivor); + case MT_L4D2_AMMOTYPE_PISTOL: return (bRewarded && !reset) ? 30 : 15; + case MT_L4D2_AMMOTYPE_PISTOL_MAGNUM: return (bRewarded && !reset) ? 16 : 8; + case MT_L4D2_AMMOTYPE_RIFLE: return (bRewarded && !reset) ? 100 : 50; + case MT_L4D2_AMMOTYPE_SMG: return (bRewarded && !reset) ? 100 : 50; + case MT_L4D2_AMMOTYPE_RIFLE_M60: return (bRewarded && !reset) ? 300 : 150; + case MT_L4D2_AMMOTYPE_SHOTGUN_TIER1: return (bRewarded && !reset) ? 16 : 8; + case MT_L4D2_AMMOTYPE_SHOTGUN_TIER2: return (bRewarded && !reset) ? 20 : 10; + case MT_L4D2_AMMOTYPE_HUNTING_RIFLE: return (bRewarded && !reset) ? 30 : 15; + case MT_L4D2_AMMOTYPE_SNIPER_RIFLE: return (bRewarded && !reset) ? 60 : 30; + case MT_L4D2_AMMOTYPE_GRENADE_LAUNCHER: return (bRewarded && !reset) ? 2 : 1; + } + } + } + else + { + if (reserve) + { + switch (iType) + { + case MT_L4D1_AMMOTYPE_HUNTING_RIFLE: return (bRewarded && !reset) ? (g_esGeneral.g_cvMTHuntingRifleAmmo.IntValue * 2) : g_esGeneral.g_cvMTHuntingRifleAmmo.IntValue; + case MT_L4D1_AMMOTYPE_RIFLE: return (bRewarded && !reset) ? (g_esGeneral.g_cvMTAssaultRifleAmmo.IntValue * 2) : g_esGeneral.g_cvMTAssaultRifleAmmo.IntValue; + case MT_L4D1_AMMOTYPE_SMG: return (bRewarded && !reset) ? iClamp(RoundToNearest(g_esGeneral.g_cvMTSMGAmmo.IntValue * 1.23), 1, 1000) : g_esGeneral.g_cvMTSMGAmmo.IntValue; + case MT_L4D1_AMMOTYPE_SHOTGUN: return (bRewarded && !reset) ? iClamp(RoundToNearest(g_esGeneral.g_cvMTShotgunAmmo.IntValue * 1.56), 1, 255) : g_esGeneral.g_cvMTShotgunAmmo.IntValue; + } + } + else + { + switch (iType) + { + case MT_L4D1_AMMOTYPE_PISTOL: return (bRewarded && !reset) ? 30 : 15; + case MT_L4D1_AMMOTYPE_HUNTING_RIFLE: return (bRewarded && !reset) ? 30 : 15; + case MT_L4D1_AMMOTYPE_RIFLE: return (bRewarded && !reset) ? 100 : 50; + case MT_L4D1_AMMOTYPE_SMG: return (bRewarded && !reset) ? 100 : 50; + case MT_L4D1_AMMOTYPE_SHOTGUN: return (bRewarded && !reset) ? 20 : 10; } - - return true; } } - return false; + return 0; } -float flGetPunchForce(int survivor, float force) +int iGetMaxWeaponSkins(int developer) { - bool bDeveloper = bIsDeveloper(survivor, 4); - if (bDeveloper || (g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_GODMODE)) + int iActiveWeapon = iGetSurvivorActiveWeapon(developer); + if (bIsValidEntity(iActiveWeapon)) { - float flForce = (bDeveloper && g_esDeveloper[survivor].g_flDevPunchResistance > g_esPlayer[survivor].g_flPunchResistance) ? g_esDeveloper[survivor].g_flDevPunchResistance : g_esPlayer[survivor].g_flPunchResistance; - if (force < 0.0 || force >= flForce) + char sClassname[32]; + GetEntityClassname(iActiveWeapon, sClassname, sizeof sClassname); + if (StrEqual(sClassname[7], "pistol_magnum") || StrEqual(sClassname[7], "rifle") || StrEqual(sClassname[7], "rifle_ak47")) { - return flForce; + return 2; + } + else if (StrEqual(sClassname[7], "smg") || StrEqual(sClassname[7], "smg_silenced") + || StrEqual(sClassname[7], "pumpshotgun") || StrEqual(sClassname[7], "shotgun_chrome") + || StrEqual(sClassname[7], "autoshotgun") || StrEqual(sClassname[7], "hunting_rifle")) + { + return 1; + } + else if (StrEqual(sClassname[7], "melee")) + { + char sWeapon[32]; + GetEntPropString(iActiveWeapon, Prop_Data, "m_strMapSetScriptName", sWeapon, sizeof sWeapon); + if (StrEqual(sWeapon, "cricket_bat") || StrEqual(sWeapon, "crowbar")) + { + return 1; + } } } - return force; + return -1; } -float flGetScaledDamage(float damage) +int iGetMaxType(int specType = 0, bool condition = false) { - if (g_esGeneral.g_cvMTDifficulty != null && g_esGeneral.g_iScaleDamage == 1) + int iMaxType = (specType != 8) ? g_esSpecific.g_iMaxType : -1; + return (specType == 8 || condition || iMaxType <= 0) ? g_esGeneral.g_iMaxType : iMaxType; +} + +int iGetMessageType(int setting) +{ + int iMessageCount = 0, iMessages[10], iFlag = 0; + for (int iBit = 0; iBit < (sizeof iMessages); iBit++) { - char sDifficulty[11]; - g_esGeneral.g_cvMTDifficulty.GetString(sDifficulty, sizeof sDifficulty); + iFlag = (1 << iBit); + if (!(setting & iFlag)) + { + continue; + } - switch (sDifficulty[0]) + iMessages[iMessageCount] = iFlag; + iMessageCount++; + } + + if (iMessageCount > 0) + { + switch (iMessages[MT_GetRandomInt(0, (iMessageCount - 1))]) { - case 'e', 'E': return (g_esGeneral.g_flDifficultyDamage[0] > 0.0) ? (damage * g_esGeneral.g_flDifficultyDamage[0]) : damage; - case 'n', 'N': return (g_esGeneral.g_flDifficultyDamage[1] > 0.0) ? (damage * g_esGeneral.g_flDifficultyDamage[1]) : damage; - case 'h', 'H': return (g_esGeneral.g_flDifficultyDamage[2] > 0.0) ? (damage * g_esGeneral.g_flDifficultyDamage[2]) : damage; - case 'i', 'I': return (g_esGeneral.g_flDifficultyDamage[3] > 0.0) ? (damage * g_esGeneral.g_flDifficultyDamage[3]) : damage; + case 1: return 1; + case 2: return 2; + case 4: return 3; + case 8: return 4; + case 16: return 5; + case 32: return 6; + case 64: return 7; + case 128: return 8; + case 256: return 9; + case 512: return 10; + default: return MT_GetRandomInt(1, (sizeof iMessages)); } } - return damage; + return MT_GetRandomInt(1, (sizeof iMessages)); } -float flGetTypeChance(int tank, int type, int specType = 0) +int iGetMinType(int specType = 0, bool condition = false) { - int iSpecType = (tank > 0 && specType <= 0) ? g_esPlayer[tank].g_iInfectedType : specType; - float flChance = (iSpecType != 8) ? g_esSpecial[type].g_flSpecialChance : -1.0; - flChance = (iSpecType != 8 && flChance >= 0.0) ? flChance : g_esTank[type].g_flTankChance; - return flChance; + int iMinType = (specType != 8) ? g_esSpecific.g_iMinType : -1; + return (specType == 8 || condition || iMinType <= 0) ? g_esGeneral.g_iMinType : iMinType; } -int iChooseInfected(int tank, int exclude, int min = -1, int max = -1, bool mutate = true) +int iGetRandomRecipient(int recipient, int tank, int priority, bool none) { - int iChosen = iChooseType(exclude, tank, min, max); - if (iChosen > 0) + bool bCondition = false; + float flPercentage = 0.0; + int iRecipient = recipient, iRecipientCount = 0; + int[] iRecipients = new int[MaxClients + 1]; + if (g_esTankCache[tank].g_iShareRewards[priority] == 1 || g_esTankCache[tank].g_iShareRewards[priority] == 3) { - int iRealType = iGetRealType(iChosen, exclude, tank, min, max); - if (iRealType > 0) + for (int iSurvivor = 1; iSurvivor <= MaxClients; iSurvivor++) { - if (mutate) + bCondition = none ? (g_esPlayer[iSurvivor].g_iRewardTypes <= 0) : (g_esPlayer[iSurvivor].g_iRewardTypes > 0); + flPercentage = ((float(g_esPlayer[iSurvivor].g_iTankDamage[tank]) / float(g_esPlayer[tank].g_iSpecialMaxHealth)) * 100.0); + if (bIsHumanSurvivor(iSurvivor) && bCondition && (1.0 <= flPercentage < g_esTankCache[tank].g_flRewardPercentage[priority]) && iSurvivor != recipient) { - vSetTankColor(tank, iRealType, false, .store = bIsTank(tank)); + iRecipients[iRecipientCount] = iSurvivor; + iRecipientCount++; } - - return iRealType; } - - return iChosen; } - return 0; -} - -int iChooseType(int exclude, int tank, int min = -1, int max = -1) -{ - bool bCondition = false, bTank = bIsTank(tank); - int iClass = 8, iSpecType = g_esPlayer[tank].g_iInfectedType, iMin = (min >= 0) ? min : iGetMinType(iSpecType, bTank), iMax = (max >= 0) ? max : iGetMaxType(iSpecType, bTank); - if (iMax < iMin || (bIsSurvivalMode() && g_esGeneral.g_iSurvivalBlock != 2)) + if (iRecipientCount > 0) { - return 0; + iRecipient = iRecipients[MT_GetRandomInt(0, (iRecipientCount - 1))]; } - float flClose = 0.0, flOpen = 0.0, flRandom = GetRandomFloat(0.1, 100.0), flChance = 0.0; - int iBackupCount = 0, iBackupTypes[MT_MAXTYPES + 1], iCycleCount = 0, iCycleTypes[MT_MAXTYPES + 1], - iCount = iGetTypeCount(tank), iType = 0, iTypeCount = 0, iTypeLimit = 0, iTankTypes[MT_MAXTYPES + 1]; - for (int iIndex = iMin; iIndex <= iMax; iIndex++) + if ((g_esTankCache[tank].g_iShareRewards[priority] == 2 || g_esTankCache[tank].g_iShareRewards[priority] == 3) && (iRecipientCount == 0 || iRecipient == recipient)) { - if (iIndex <= 0) - { - continue; - } - - iType = g_esTank[iIndex].g_iRecordedType[0]; - flChance = flGetTypeChance(tank, iType, iSpecType); - if (iSpecType > 0 && iSpecType != iClass) - { - flClose = g_esSpecial[iType].g_flCloseAreasOnly; - flOpen = g_esSpecial[iType].g_flOpenAreasOnly; - iTypeLimit = g_esSpecial[iType].g_iTypeLimit; - } - - vRecycleType(iSpecType, iType, false); - - switch (exclude) + bool bBot = false; + for (int iSurvivor = 1; iSurvivor <= MaxClients; iSurvivor++) { - case 1: - { - switch (iSpecType) - { - case 1: bCondition = !bIsRightGame(iType, iSpecType) || (bIsSmoker(tank) && !bIsSmokerEnabled(iType)) || !bHasCoreAdminAccess(tank, iType) || !bIsSpawnEnabled(iType, iSpecType) || !bIsTypeAvailable(iType, tank) || bAreHumansRequired(iType, iSpecType) || !bCanTypeSpawn(iType, iSpecType) || bIsAreaNarrow(tank, flOpen) || bIsAreaWide(tank, flClose) || flChance <= 0.0 || (g_esGeneral.g_iSpawnLimit > 0 && iCount >= g_esGeneral.g_iSpawnLimit) || (0 < iTypeLimit <= iGetTypeCount(tank, iType)) || bIsBossLimited(iType) || (g_esPlayer[tank].g_iTankType == iType); - case 2: bCondition = !bIsRightGame(iType, iSpecType) || (bIsBoomer(tank) && !bIsBoomerEnabled(iType)) || !bHasCoreAdminAccess(tank, iType) || !bIsSpawnEnabled(iType, iSpecType) || !bIsTypeAvailable(iType, tank) || bAreHumansRequired(iType, iSpecType) || !bCanTypeSpawn(iType, iSpecType) || bIsAreaNarrow(tank, flOpen) || bIsAreaWide(tank, flClose) || flChance <= 0.0 || (g_esGeneral.g_iSpawnLimit > 0 && iCount >= g_esGeneral.g_iSpawnLimit) || (0 < iTypeLimit <= iGetTypeCount(tank, iType)) || bIsBossLimited(iType) || (g_esPlayer[tank].g_iTankType == iType); - case 3: bCondition = !bIsRightGame(iType, iSpecType) || (bIsHunter(tank) && !bIsHunterEnabled(iType)) || !bHasCoreAdminAccess(tank, iType) || !bIsSpawnEnabled(iType, iSpecType) || !bIsTypeAvailable(iType, tank) || bAreHumansRequired(iType, iSpecType) || !bCanTypeSpawn(iType, iSpecType) || bIsAreaNarrow(tank, flOpen) || bIsAreaWide(tank, flClose) || flChance <= 0.0 || (g_esGeneral.g_iSpawnLimit > 0 && iCount >= g_esGeneral.g_iSpawnLimit) || (0 < iTypeLimit <= iGetTypeCount(tank, iType)) || bIsBossLimited(iType) || (g_esPlayer[tank].g_iTankType == iType); - case 4: bCondition = !bIsRightGame(iType, iSpecType) || (bIsSpitter(tank) && !bIsSpitterEnabled(iType)) || !bHasCoreAdminAccess(tank, iType) || !bIsSpawnEnabled(iType, iSpecType) || !bIsTypeAvailable(iType, tank) || bAreHumansRequired(iType, iSpecType) || !bCanTypeSpawn(iType, iSpecType) || bIsAreaNarrow(tank, flOpen) || bIsAreaWide(tank, flClose) || flChance <= 0.0 || (g_esGeneral.g_iSpawnLimit > 0 && iCount >= g_esGeneral.g_iSpawnLimit) || (0 < iTypeLimit <= iGetTypeCount(tank, iType)) || bIsBossLimited(iType) || (g_esPlayer[tank].g_iTankType == iType); - case 5: bCondition = !bIsRightGame(iType, iSpecType) || (bIsJockey(tank) && !bIsJockeyEnabled(iType)) || !bHasCoreAdminAccess(tank, iType) || !bIsSpawnEnabled(iType, iSpecType) || !bIsTypeAvailable(iType, tank) || bAreHumansRequired(iType, iSpecType) || !bCanTypeSpawn(iType, iSpecType) || bIsAreaNarrow(tank, flOpen) || bIsAreaWide(tank, flClose) || flChance <= 0.0 || (g_esGeneral.g_iSpawnLimit > 0 && iCount >= g_esGeneral.g_iSpawnLimit) || (0 < iTypeLimit <= iGetTypeCount(tank, iType)) || bIsBossLimited(iType) || (g_esPlayer[tank].g_iTankType == iType); - case 6: bCondition = !bIsRightGame(iType, iSpecType) || (bIsCharger(tank) && !bIsChargerEnabled(iType)) || !bHasCoreAdminAccess(tank, iType) || !bIsSpawnEnabled(iType, iSpecType) || !bIsTypeAvailable(iType, tank) || bAreHumansRequired(iType, iSpecType) || !bCanTypeSpawn(iType, iSpecType) || bIsAreaNarrow(tank, flOpen) || bIsAreaWide(tank, flClose) || flChance <= 0.0 || (g_esGeneral.g_iSpawnLimit > 0 && iCount >= g_esGeneral.g_iSpawnLimit) || (0 < iTypeLimit <= iGetTypeCount(tank, iType)) || bIsBossLimited(iType) || (g_esPlayer[tank].g_iTankType == iType); - default: bCondition = !bIsRightGame(iType, iSpecType) || (bTank && !bIsTankEnabled(iType)) || !bHasCoreAdminAccess(tank, iType) || !bIsSpawnEnabled(iType, iSpecType) || !bIsTypeAvailable(iType, tank) || bAreHumansRequired(iType, iSpecType) || !bCanTypeSpawn(iType, iSpecType) || bIsAreaNarrow(tank, g_esTank[iType].g_flOpenAreasOnly) || bIsAreaWide(tank, g_esTank[iType].g_flCloseAreasOnly) || flChance <= 0.0 || (g_esGeneral.g_iSpawnLimit > 0 && iCount >= g_esGeneral.g_iSpawnLimit) || (0 < g_esTank[iType].g_iTypeLimit <= iGetTypeCount(tank, iType)) || bIsBossLimited(iType) || (g_esPlayer[tank].g_iTankType == iType); - } - } - case 2: + bCondition = none ? (g_esPlayer[iSurvivor].g_iRewardTypes <= 0) : (g_esPlayer[iSurvivor].g_iRewardTypes > 0); + flPercentage = ((float(g_esPlayer[iSurvivor].g_iTankDamage[tank]) / float(g_esPlayer[tank].g_iSpecialMaxHealth)) * 100.0); + if (bIsSurvivor(iSurvivor) && bCondition && (1.0 <= flPercentage < g_esTankCache[tank].g_flRewardPercentage[priority]) && iSurvivor != recipient) { - switch (iSpecType) + bBot = (g_esTankCache[tank].g_iShareRewards[priority] == 2) ? !bIsValidClient(iSurvivor, MT_CHECK_FAKECLIENT) : true; + if (bBot) { - case 1: bCondition = !bIsRightGame(iType, iSpecType) || (bIsSmoker(tank) && !bIsSmokerEnabled(iType)) || !bHasCoreAdminAccess(tank) || !bIsSpecialRandomType(iType, iSpecType) || !bIsSpawnEnabled(iType, iSpecType) || (bIsSmoker(tank, MT_CHECK_FAKECLIENT) && !bIsSpecialRandomType(iType, iSpecType)) || (g_esPlayer[tank].g_iTankType == iType) || !bIsTypeAvailable(iType, tank) || bAreHumansRequired(iType, iSpecType) || !bCanTypeSpawn(iType, iSpecType) || bIsAreaNarrow(tank, flOpen) || bIsAreaWide(tank, flClose) || flChance <= 0.0; - case 2: bCondition = !bIsRightGame(iType, iSpecType) || (bIsBoomer(tank) && !bIsBoomerEnabled(iType)) || !bHasCoreAdminAccess(tank) || !bIsSpecialRandomType(iType, iSpecType) || !bIsSpawnEnabled(iType, iSpecType) || (bIsBoomer(tank, MT_CHECK_FAKECLIENT) && !bIsSpecialRandomType(iType, iSpecType)) || (g_esPlayer[tank].g_iTankType == iType) || !bIsTypeAvailable(iType, tank) || bAreHumansRequired(iType, iSpecType) || !bCanTypeSpawn(iType, iSpecType) || bIsAreaNarrow(tank, flOpen) || bIsAreaWide(tank, flClose) || flChance <= 0.0; - case 3: bCondition = !bIsRightGame(iType, iSpecType) || (bIsHunter(tank) && !bIsHunterEnabled(iType)) || !bHasCoreAdminAccess(tank) || !bIsSpecialRandomType(iType, iSpecType) || !bIsSpawnEnabled(iType, iSpecType) || (bIsHunter(tank, MT_CHECK_FAKECLIENT) && !bIsSpecialRandomType(iType, iSpecType)) || (g_esPlayer[tank].g_iTankType == iType) || !bIsTypeAvailable(iType, tank) || bAreHumansRequired(iType, iSpecType) || !bCanTypeSpawn(iType, iSpecType) || bIsAreaNarrow(tank, flOpen) || bIsAreaWide(tank, flClose) || flChance <= 0.0; - case 4: bCondition = !bIsRightGame(iType, iSpecType) || (bIsSpitter(tank) && !bIsSpitterEnabled(iType)) || !bHasCoreAdminAccess(tank) || !bIsSpecialRandomType(iType, iSpecType) || !bIsSpawnEnabled(iType, iSpecType) || (bIsSpitter(tank, MT_CHECK_FAKECLIENT) && !bIsSpecialRandomType(iType, iSpecType)) || (g_esPlayer[tank].g_iTankType == iType) || !bIsTypeAvailable(iType, tank) || bAreHumansRequired(iType, iSpecType) || !bCanTypeSpawn(iType, iSpecType) || bIsAreaNarrow(tank, flOpen) || bIsAreaWide(tank, flClose) || flChance <= 0.0; - case 5: bCondition = !bIsRightGame(iType, iSpecType) || (bIsJockey(tank) && !bIsJockeyEnabled(iType)) || !bHasCoreAdminAccess(tank) || !bIsSpecialRandomType(iType, iSpecType) || !bIsSpawnEnabled(iType, iSpecType) || (bIsJockey(tank, MT_CHECK_FAKECLIENT) && !bIsSpecialRandomType(iType, iSpecType)) || (g_esPlayer[tank].g_iTankType == iType) || !bIsTypeAvailable(iType, tank) || bAreHumansRequired(iType, iSpecType) || !bCanTypeSpawn(iType, iSpecType) || bIsAreaNarrow(tank, flOpen) || bIsAreaWide(tank, flClose) || flChance <= 0.0; - case 6: bCondition = !bIsRightGame(iType, iSpecType) || (bIsCharger(tank) && !bIsChargerEnabled(iType)) || !bHasCoreAdminAccess(tank) || !bIsSpecialRandomType(iType, iSpecType) || !bIsSpawnEnabled(iType, iSpecType) || (bIsCharger(tank, MT_CHECK_FAKECLIENT) && !bIsSpecialRandomType(iType, iSpecType)) || (g_esPlayer[tank].g_iTankType == iType) || !bIsTypeAvailable(iType, tank) || bAreHumansRequired(iType, iSpecType) || !bCanTypeSpawn(iType, iSpecType) || bIsAreaNarrow(tank, flOpen) || bIsAreaWide(tank, flClose) || flChance <= 0.0; - default: bCondition = !bIsRightGame(iType, iSpecType) || (bTank && !bIsTankEnabled(iType)) || !bHasCoreAdminAccess(tank) || !bIsTankRandomType(iType) || !bIsSpawnEnabled(iType, iSpecType) || (bIsTank(tank, MT_CHECK_FAKECLIENT) && !bIsTankRandomType(iType, tank)) || (g_esPlayer[tank].g_iTankType == iType) || !bIsTypeAvailable(iType, tank) || bAreHumansRequired(iType, iSpecType) || !bCanTypeSpawn(iType, iSpecType) || bIsAreaNarrow(tank, g_esTank[iType].g_flOpenAreasOnly) || bIsAreaWide(tank, g_esTank[iType].g_flCloseAreasOnly) || flChance <= 0.0; + iRecipients[iRecipientCount] = iSurvivor; + iRecipientCount++; } } } - if (bCondition) + if (iRecipientCount > 0) { - continue; + iRecipient = iRecipients[MT_GetRandomInt(0, (iRecipientCount - 1))]; } + } - iBackupTypes[iBackupCount + 1] = iType; - iBackupCount++; + return iRecipient; +} - if (flChance <= flRandom) - { - continue; - } +int iGetRealType(int type, int exclude = 0, int tank, int min = -1, int max = -1) +{ + Action aResult = Plugin_Continue; + int iType = g_esTank[type].g_iRealType[0]; - iCycleTypes[iCycleCount + 1] = iType; - iCycleCount++; + Call_StartForward(g_esGeneral.g_gfTypeChosenForward); + Call_PushCellRef(iType); + Call_PushCell(tank); + Call_Finish(aResult); - if (bIsTypeCycled(iSpecType, iType, false)) + switch (aResult) + { + case Plugin_Stop: return 0; + case Plugin_Handled: return iChooseTankType(exclude, tank, min, max); + case Plugin_Changed: return g_esTank[iType].g_iRecordedType[0]; + } + + return type; +} + +int iGetRefEHandle(Address entityHandle) +{ + if (!entityHandle) + { + return INVALID_EHANDLE_INDEX; + } + + Address adRefHandle = SDKCall(g_esGeneral.g_hSDKGetRefEHandle, entityHandle); + return LoadFromAddress(adRefHandle, NumberType_Int32); +} + +int iGetRandomRushType() +{ + int iRushCount = 0, iRushTypes[7], iFlag = 0; + for (int iBit = 0; iBit < (sizeof iRushTypes); iBit++) + { + iFlag = (1 << iBit); + if (!(g_esGeneral.g_iRushTypes & iFlag) || (!g_bSecondGame && iBit >= 4)) { continue; } - iTankTypes[iTypeCount + 1] = iType; - iTypeCount++; + iRushTypes[iRushCount] = iFlag; + iRushCount++; } - bool bLinear = iGetCycleType(iSpecType) >= 3; - int iFinalCount = (iTypeCount > 0) ? iTypeCount : iCycleCount, iFinalType = (iTypeCount > 0) ? iTankTypes[bLinear ? 1 : MT_GetRandomInt(1, iTypeCount)] : iCycleTypes[bLinear ? 1 : MT_GetRandomInt(1, iCycleCount)], - iBackupType = (iBackupCount > 0) ? iBackupTypes[bLinear ? 1 : MT_GetRandomInt(1, iBackupCount)] : 0, iChosen = (iFinalCount > 0) ? iFinalType : iBackupType, iPos = (iSpecType != iClass) ? iSpecType : 0; - g_esGeneral.g_bRecycleTypes = iSpecType == iClass && iTypeCount <= 0 && iCycleCount > 0; - g_esTank[iChosen].g_bTypeCycled = iSpecType == iClass; - g_esSpecific.g_bRecycleTypes[iPos] = iSpecType != iClass && iTypeCount <= 0 && iCycleCount > 0; - g_esSpecial[iChosen].g_bTypeCycled[iPos] = iSpecType != iClass; + if (iRushCount > 0) + { + int iType = iRushTypes[MT_GetRandomInt(0, (iRushCount - 1))]; - return iChosen; + switch (iType) + { + case MT_RUSHTYPE_SMOKER: return 1; + case MT_RUSHTYPE_BOOMER: return 2; + case MT_RUSHTYPE_HUNTER: return 3; + case MT_RUSHTYPE_SPITTER: return (g_bSecondGame ? 4 : 2); + case MT_RUSHTYPE_JOCKEY: return (g_bSecondGame ? 5 : 3); + case MT_RUSHTYPE_CHARGER: return (g_bSecondGame ? 6 : 1); + case MT_RUSHTYPE_TANK: return 8; + } + } + + return 0; } -int iFindSectionType(const char[] section, int type) +int iGetSpecialCount(bool manual, bool include = false) { - if (FindCharInString(section, ',') != -1 || FindCharInString(section, '-') != -1) + switch (manual) { - char sSection[PLATFORM_MAX_PATH], sSet[16][10]; - int iType = 0, iSize = 0; - strcopy(sSection, sizeof sSection, section); - if (FindCharInString(section, ',') != -1) + case true: { - char sRange[2][5]; - ExplodeString(sSection, ",", sSet, sizeof sSet, sizeof sSet[]); - for (int iPos = 0; iPos < (sizeof sSet); iPos++) + int iSpecialCount = 0; + for (int iSpecial = 1; iSpecial <= MaxClients; iSpecial++) { - if (FindCharInString(sSet[iPos], '-') != -1) - { - ExplodeString(sSet[iPos], "-", sRange, sizeof sRange, sizeof sRange[]); - iSize = StringToInt(sRange[1]); - for (iType = StringToInt(sRange[0]); iType <= iSize; iType++) - { - if (type == iType) - { - return iType; - } - } - } - else + if (bIsSpecialInfected(iSpecial, MT_CHECK_INGAME|MT_CHECK_ALIVE)) { - iType = StringToInt(sSet[iPos]); - if (type == iType) + if (!include && bIsCustomTank(iSpecial)) { - return iType; + continue; } + + iSpecialCount++; } } + + return iSpecialCount; } - else if (FindCharInString(section, '-') != -1) - { - ExplodeString(sSection, "-", sSet, sizeof sSet, sizeof sSet[]); - iSize = StringToInt(sSet[1]); - for (iType = StringToInt(sSet[0]); iType <= iSize; iType++) - { - if (type == iType) - { - return iType; - } - } - } + case false: return g_esGeneral.g_iSpecialCount; } return 0; } -int iGetConfigSectionNumber(const char[] section, int size) +int iGetSpecialTypes(int setting, const char[] specsection) { - for (int iPos = 0; iPos < size; iPos++) + int iPos = StrContains(specsection, MT_CONFIG_SECTION_SMOKER, false); + bool bCheck = iPos != -1; + int iTypes = setting; + iPos = (iPos > 0) ? (iPos - 1) : 0; + if (bCheck) { - if (IsCharNumeric(section[iPos])) + switch (specsection[iPos] == '!' || specsection[iPos] == '/') { - return iPos; + case true: iTypes = !!(iTypes & MT_SPECINF_SMOKER) ? (iTypes & ~MT_SPECINF_SMOKER) : iTypes; + case false: iTypes = !(iTypes & MT_SPECINF_SMOKER) ? (iTypes|MT_SPECINF_SMOKER) : iTypes; } } - return -1; -} + iPos = StrContains(specsection, MT_CONFIG_SECTION_BOOMER, false); + bCheck = iPos != -1; + iPos = (iPos > 0) ? (iPos - 1) : 0; + if (bCheck) + { + switch (specsection[iPos] == '!' || specsection[iPos] == '/') + { + case true: iTypes = !!(iTypes & MT_SPECINF_BOOMER) ? (iTypes & ~MT_SPECINF_BOOMER) : iTypes; + case false: iTypes = !(iTypes & MT_SPECINF_BOOMER) ? (iTypes|MT_SPECINF_BOOMER) : iTypes; + } + } -int iGetCycleType(int specType) -{ - return (specType > 0 && specType != 8) ? iGetSettingValue(true, true, g_esSpecific.g_iCycleTypes, g_esGeneral.g_iCycleTypes, 1) : g_esGeneral.g_iCycleTypes; -} + iPos = StrContains(specsection, MT_CONFIG_SECTION_HUNTER, false); + bCheck = iPos != -1; + iPos = (iPos > 0) ? (iPos - 1) : 0; + if (bCheck) + { + switch (specsection[iPos] == '!' || specsection[iPos] == '/') + { + case true: iTypes = !!(iTypes & MT_SPECINF_HUNTER) ? (iTypes & ~MT_SPECINF_HUNTER) : iTypes; + case false: iTypes = !(iTypes & MT_SPECINF_HUNTER) ? (iTypes|MT_SPECINF_HUNTER) : iTypes; + } + } -int iGetDecimalFromHex(int character) -{ - if (IsCharNumeric(character)) + iPos = StrContains(specsection, MT_CONFIG_SECTION_SPITTER, false); + bCheck = iPos != -1; + iPos = (iPos > 0) ? (iPos - 1) : 0; + if (bCheck) { - return (character - '0'); + switch (specsection[iPos] == '!' || specsection[iPos] == '/') + { + case true: iTypes = !!(iTypes & MT_SPECINF_SPITTER) ? (iTypes & ~MT_SPECINF_SPITTER) : iTypes; + case false: iTypes = !(iTypes & MT_SPECINF_SPITTER) ? (iTypes|MT_SPECINF_SPITTER) : iTypes; + } } - else if (IsCharAlpha(character)) + + iPos = StrContains(specsection, MT_CONFIG_SECTION_JOCKEY, false); + bCheck = iPos != -1; + iPos = (iPos > 0) ? (iPos - 1) : 0; + if (bCheck) { - int iLetter = CharToUpper(character); - if (iLetter < 'A' || iLetter > 'F') + switch (specsection[iPos] == '!' || specsection[iPos] == '/') { - return -1; + case true: iTypes = !!(iTypes & MT_SPECINF_JOCKEY) ? (iTypes & ~MT_SPECINF_JOCKEY) : iTypes; + case false: iTypes = !(iTypes & MT_SPECINF_JOCKEY) ? (iTypes|MT_SPECINF_JOCKEY) : iTypes; } + } - return ((iLetter - 'A') + 10); + iPos = StrContains(specsection, MT_CONFIG_SECTION_CHARGER, false); + bCheck = iPos != -1; + iPos = (iPos > 0) ? (iPos - 1) : 0; + if (bCheck) + { + switch (specsection[iPos] == '!' || specsection[iPos] == '/') + { + case true: iTypes = !!(iTypes & MT_SPECINF_CHARGER) ? (iTypes & ~MT_SPECINF_CHARGER) : iTypes; + case false: iTypes = !(iTypes & MT_SPECINF_CHARGER) ? (iTypes|MT_SPECINF_CHARGER) : iTypes; + } } - return -1; + return iTypes; } -int iGetDecimalFromHex2(char[] bytes) +int iGetTankCount(bool manual, bool include = false) { - int iBase = 1, iLength = strlen(bytes), iValue = 0; - for (int iPos = (iLength - 1); iPos >= 0; iPos--) + switch (manual) { - if (bytes[iPos] >= '0' && bytes[iPos] <= '9') - { - iValue += (bytes[iPos] - 48) * iBase; - iBase = (iBase * 16); - } - else if (bytes[iPos] >= 'A' && bytes[iPos] <= 'F') + case true: { - iValue += (bytes[iPos] - 55) * iBase; - iBase = (iBase * 16); + int iTankCount = 0; + for (int iTank = 1; iTank <= MaxClients; iTank++) + { + if (bIsTank(iTank, MT_CHECK_INGAME|MT_CHECK_ALIVE)) + { + if (!include && bIsCustomTank(iTank)) + { + continue; + } + + iTankCount++; + } + } + + return iTankCount; } + case false: return g_esGeneral.g_iTankCount; } - return iValue; + return 0; } -int iGetFinaleType(int type, int specType) +int iGetTankTypeCount(int tank, int type = 0) { - int iFinale = (specType != 8) ? g_esSpecial[type].g_iFinaleSpecial : -1; - iFinale = (specType != 8 && iFinale >= 0) ? iFinale : g_esTank[type].g_iFinaleTank; - return iFinale; -} + bool bCondition = false, bCheck = false; + int iTypeCount = 0; + for (int iTank = 1; iTank <= MaxClients; iTank++) + { + switch (g_esPlayer[tank].g_iInfectedType) + { + case 1: bCondition = bIsSmoker(iTank, MT_CHECK_INGAME|MT_CHECK_ALIVE); + case 2: bCondition = bIsBoomer(iTank, MT_CHECK_INGAME|MT_CHECK_ALIVE); + case 3: bCondition = bIsHunter(iTank, MT_CHECK_INGAME|MT_CHECK_ALIVE); + case 4: bCondition = bIsSpitter(iTank, MT_CHECK_INGAME|MT_CHECK_ALIVE); + case 5: bCondition = bIsJockey(iTank, MT_CHECK_INGAME|MT_CHECK_ALIVE); + case 6: bCondition = bIsCharger(iTank, MT_CHECK_INGAME|MT_CHECK_ALIVE); + default: bCondition = bIsTank(iTank, MT_CHECK_INGAME|MT_CHECK_ALIVE); + } + + bCheck = (type > 0) ? (g_esPlayer[iTank].g_iTankType == type) : (g_esPlayer[iTank].g_iTankType > 0); + if (bCondition && !g_esPlayer[iTank].g_bArtificial && bCheck) + { + iTypeCount++; + } + } -int iGetMaxAmmo(int survivor, int type, int weapon, bool reserve, bool reset = false) + return iTypeCount; +} +#if defined _WeaponHandling_included +int iGetTotalPassives(int survivor, int type, bool include) { - bool bRewarded = bIsSurvivor(survivor) && (bIsDeveloper(survivor, 4) || bIsDeveloper(survivor, 6) || ((g_esPlayer[survivor].g_iRewardTypes & MT_REWARD_AMMO) && g_esPlayer[survivor].g_iAmmoBoost == 1)); - int iType = (type > 0 || weapon <= MaxClients) ? type : GetEntProp(weapon, Prop_Send, "m_iPrimaryAmmoType"); - if (g_bSecondGame) + int iType = (include ? 0 : type); + + switch (include) { - if (reserve) + case true: { - switch (iType) + for (int iBit = 0; iBit < 10; iBit++) { - case MT_L4D2_AMMOTYPE_RIFLE: return (bRewarded && !reset) ? (g_esGeneral.g_cvMTAssaultRifleAmmo.IntValue * 2) : g_esGeneral.g_cvMTAssaultRifleAmmo.IntValue; - case MT_L4D2_AMMOTYPE_SMG: return (bRewarded && !reset) ? iClamp(RoundToNearest(g_esGeneral.g_cvMTSMGAmmo.IntValue * 1.23), 1, 1000) : g_esGeneral.g_cvMTSMGAmmo.IntValue; - case MT_L4D2_AMMOTYPE_SHOTGUN_TIER1: return (bRewarded && !reset) ? iClamp(RoundToNearest(g_esGeneral.g_cvMTShotgunAmmo.IntValue * 2.08), 1, 255) : g_esGeneral.g_cvMTShotgunAmmo.IntValue; - case MT_L4D2_AMMOTYPE_SHOTGUN_TIER2: return (bRewarded && !reset) ? iClamp(RoundToNearest(g_esGeneral.g_cvMTAutoShotgunAmmo.IntValue * 2.22), 1, 255) : g_esGeneral.g_cvMTAutoShotgunAmmo.IntValue; - case MT_L4D2_AMMOTYPE_HUNTING_RIFLE: return (bRewarded && !reset) ? (g_esGeneral.g_cvMTHuntingRifleAmmo.IntValue * 2) : g_esGeneral.g_cvMTHuntingRifleAmmo.IntValue; - case MT_L4D2_AMMOTYPE_SNIPER_RIFLE: return (bRewarded && !reset) ? (g_esGeneral.g_cvMTSniperRifleAmmo.IntValue * 2) : g_esGeneral.g_cvMTSniperRifleAmmo.IntValue; - case MT_L4D2_AMMOTYPE_GRENADE_LAUNCHER: return (bRewarded && !reset) ? (g_esGeneral.g_cvMTGrenadeLauncherAmmo.IntValue * 2) : g_esGeneral.g_cvMTGrenadeLauncherAmmo.IntValue; + if ((type & (1 << iBit)) && !(g_esShooter[survivor].g_iPassiveTypes & (1 << iBit))) + { + iType |= (1 << iBit); + } } } - else + case false: { - switch (iType) + for (int iBit = 0; iBit < 10; iBit++) { - case MT_L4D2_AMMOTYPE_PISTOL: return (bRewarded && !reset) ? 30 : 15; - case MT_L4D2_AMMOTYPE_PISTOL_MAGNUM: return (bRewarded && !reset) ? 16 : 8; - case MT_L4D2_AMMOTYPE_RIFLE: return (bRewarded && !reset) ? 100 : 50; - case MT_L4D2_AMMOTYPE_SMG: return (bRewarded && !reset) ? 100 : 50; - case MT_L4D2_AMMOTYPE_RIFLE_M60: return (bRewarded && !reset) ? 300 : 150; - case MT_L4D2_AMMOTYPE_SHOTGUN_TIER1: return (bRewarded && !reset) ? 16 : 8; - case MT_L4D2_AMMOTYPE_SHOTGUN_TIER2: return (bRewarded && !reset) ? 20 : 10; - case MT_L4D2_AMMOTYPE_HUNTING_RIFLE: return (bRewarded && !reset) ? 30 : 15; - case MT_L4D2_AMMOTYPE_SNIPER_RIFLE: return (bRewarded && !reset) ? 60 : 30; - case MT_L4D2_AMMOTYPE_GRENADE_LAUNCHER: return (bRewarded && !reset) ? 2 : 1; + if ((type & (1 << iBit)) && (g_esShooter[survivor].g_iPassiveTypes & (1 << iBit))) + { + iType &= ~(1 << iBit); + } } } } - else + + return iType; +} +#endif + +int iGetUsefulRewards(int survivor, int tank, int types, int priority) +{ + int iType = 0; + if (g_esTankCache[tank].g_iUsefulRewards[priority] > 0) { - if (reserve) + if (bIsSurvivor(survivor, MT_CHECK_ALIVE)) { - switch (iType) + int iAmmo = -1, iWeapon = GetPlayerWeaponSlot(survivor, 0); + if (iWeapon > MaxClients) { - case MT_L4D1_AMMOTYPE_HUNTING_RIFLE: return (bRewarded && !reset) ? (g_esGeneral.g_cvMTHuntingRifleAmmo.IntValue * 2) : g_esGeneral.g_cvMTHuntingRifleAmmo.IntValue; - case MT_L4D1_AMMOTYPE_RIFLE: return (bRewarded && !reset) ? (g_esGeneral.g_cvMTAssaultRifleAmmo.IntValue * 2) : g_esGeneral.g_cvMTAssaultRifleAmmo.IntValue; - case MT_L4D1_AMMOTYPE_SMG: return (bRewarded && !reset) ? iClamp(RoundToNearest(g_esGeneral.g_cvMTSMGAmmo.IntValue * 1.23), 1, 1000) : g_esGeneral.g_cvMTSMGAmmo.IntValue; - case MT_L4D1_AMMOTYPE_SHOTGUN: return (bRewarded && !reset) ? iClamp(RoundToNearest(g_esGeneral.g_cvMTShotgunAmmo.IntValue * 1.56), 1, 255) : g_esGeneral.g_cvMTShotgunAmmo.IntValue; + iAmmo = GetEntProp(survivor, Prop_Send, "m_iAmmo", .element = iGetWeaponOffset(iWeapon)); } - } - else - { - switch (iType) + + if ((g_esTankCache[tank].g_iUsefulRewards[priority] & MT_USEFUL_REFILL) && !(types & MT_REWARD_REFILL) && ((g_esPlayer[survivor].g_bLastLife[0] && g_esPlayer[survivor].g_iReviveCount > 0) || bIsSurvivorDisabled(survivor)) && -1 < iAmmo <= 10) { - case MT_L4D1_AMMOTYPE_PISTOL: return (bRewarded && !reset) ? 30 : 15; - case MT_L4D1_AMMOTYPE_HUNTING_RIFLE: return (bRewarded && !reset) ? 30 : 15; - case MT_L4D1_AMMOTYPE_RIFLE: return (bRewarded && !reset) ? 100 : 50; - case MT_L4D1_AMMOTYPE_SMG: return (bRewarded && !reset) ? 100 : 50; - case MT_L4D1_AMMOTYPE_SHOTGUN: return (bRewarded && !reset) ? 20 : 10; + iType |= MT_REWARD_REFILL; } + else if ((g_esTankCache[tank].g_iUsefulRewards[priority] & MT_USEFUL_HEALTH) && !(types & MT_REWARD_REFILL) && !(types & MT_REWARD_HEALTH) && ((g_esPlayer[survivor].g_bLastLife[0] && g_esPlayer[survivor].g_iReviveCount > 0) || bIsSurvivorDisabled(survivor))) + { + iType |= MT_REWARD_HEALTH; + } + else if ((g_esTankCache[tank].g_iUsefulRewards[priority] & MT_USEFUL_AMMO) && !(types & MT_REWARD_REFILL) && !(types & MT_REWARD_AMMO) && -1 < iAmmo <= 10) + { + iType |= MT_REWARD_AMMO; + } + } + else if ((g_esTankCache[tank].g_iUsefulRewards[priority] & MT_USEFUL_RESPAWN) && !(types & MT_REWARD_RESPAWN)) + { + iType |= MT_REWARD_RESPAWN; } } - return 0; + return iType; } -int iGetMaxWeaponSkins(int developer) +int iGetWeaponInfoID(int weapon) { - int iActiveWeapon = GetEntPropEnt(developer, Prop_Send, "m_hActiveWeapon"); - if (bIsValidEntity(iActiveWeapon)) + if (bIsValidEntity(weapon) && g_esGeneral.g_hSDKGetWeaponID != null) { - char sClassname[32]; - GetEntityClassname(iActiveWeapon, sClassname, sizeof sClassname); - if (StrEqual(sClassname[7], "pistol_magnum") || StrEqual(sClassname[7], "rifle") || StrEqual(sClassname[7], "rifle_ak47")) - { - return 2; - } - else if (StrEqual(sClassname[7], "smg") || StrEqual(sClassname[7], "smg_silenced") - || StrEqual(sClassname[7], "pumpshotgun") || StrEqual(sClassname[7], "shotgun_chrome") - || StrEqual(sClassname[7], "autoshotgun") || StrEqual(sClassname[7], "hunting_rifle")) - { - return 1; - } - else if (StrEqual(sClassname[7], "melee")) + int iWeaponID = SDKCall(g_esGeneral.g_hSDKGetWeaponID, weapon); + if (iWeaponID != -1 && g_esGeneral.g_hSDKGetWeaponInfo != null) { - char sWeapon[32]; - GetEntPropString(iActiveWeapon, Prop_Data, "m_strMapSetScriptName", sWeapon, sizeof sWeapon); - if (StrEqual(sWeapon, "cricket_bat") || StrEqual(sWeapon, "crowbar")) - { - return 1; - } + return SDKCall(g_esGeneral.g_hSDKGetWeaponInfo, iWeaponID); } } return -1; } -int iGetMaxType(int specType = 0, bool condition = false) +int iSpawnNearbySpecial(int survivor, int filter, int chosenType, bool customPos, bool teleport = true, float pos[3] = {0.0, 0.0, 0.0}, float angles[3] = {0.0, 0.0, 0.0}) { - int iMaxType = (specType != 8) ? g_esSpecific.g_iMaxType : -1; - return (specType == 8 || condition || iMaxType <= 0) ? g_esGeneral.g_iMaxType : iMaxType; -} + float flHitPos[3], flPos[3], flAngles[3], flVector[3]; + if (customPos) + { + vCopyVector(pos, flPos); + vCopyVector(angles, flAngles); + } + else + { + GetClientEyePosition(survivor, flPos); + GetClientEyeAngles(survivor, flAngles); + } -int iGetMessageType(int setting) -{ - int iMessageCount = 0, iMessages[10], iFlag = 0; - for (int iBit = 0; iBit < (sizeof iMessages); iBit++) + flAngles[0] = -25.0; + GetAngleVectors(flAngles, flAngles, NULL_VECTOR, NULL_VECTOR); + NormalizeVector(flAngles, flAngles); + ScaleVector(flAngles, -1.0); + vCopyVector(flAngles, flVector); + GetVectorAngles(flAngles, flAngles); + + Handle hTrace = null; + + switch (customPos) { - iFlag = (1 << iBit); - if (!(setting & iFlag)) + case true: hTrace = TR_TraceRayFilterEx(flPos, flAngles, MASK_SOLID, RayType_Infinite, bTraceRayDontHitSelfAndSolid); + case false: hTrace = TR_TraceRayFilterEx(flPos, flAngles, MASK_SOLID, RayType_Infinite, bTraceRayDontHitSelf, survivor); + } + + int iSpecial = 0; + if (hTrace != null) + { + if (TR_DidHit(hTrace)) { - continue; + TR_GetEndPosition(flHitPos, hTrace); + NormalizeVector(flVector, flVector); + ScaleVector(flVector, -40.0); + AddVectors(flHitPos, flVector, flHitPos); + if (!teleport || customPos || (40.0 < GetVectorDistance(flHitPos, flPos) < 200.0)) + { + bool[] bExists = new bool[MaxClients + 1]; + for (int iPlayer = 1; iPlayer <= MaxClients; iPlayer++) + { + bExists[iPlayer] = false; + if (bIsInfected(iPlayer, MT_CHECK_INGAME)) + { + bExists[iPlayer] = true; + } + } + + int iTypeCount = 0, iTypes[7], iFlag = 0; + for (int iBit = 0; iBit < (sizeof iTypes); iBit++) + { + iFlag = (1 << iBit); + if (!(filter & iFlag)) + { + continue; + } + + iTypes[iTypeCount] = iFlag; + iTypeCount++; + } + + int iChosenType = g_esTank[chosenType].g_iRealType[0], iType = (iTypeCount > 0) ? iTypes[MT_GetRandomInt(0, (iTypeCount - 1))] : iTypes[0]; + iChosenType = (iChosenType <= 0) ? 0 : iChosenType; + if (iChosenType >= 0) + { + switch (iType) + { + case 1: vQueueTank(survivor, 8, iChosenType, .log = false, .custom = true); + case 2: vQueueTank(survivor, 1, iChosenType, .log = false, .custom = true); + case 4: vQueueTank(survivor, 2, iChosenType, .log = false, .custom = true); + case 8: vQueueTank(survivor, 3, iChosenType, .log = false, .custom = true); + case 16: vQueueTank(survivor, (g_bSecondGame ? 4 : 1), iChosenType, .log = false, .custom = true); + case 32: vQueueTank(survivor, (g_bSecondGame ? 5 : 2), iChosenType, .log = false, .custom = true); + case 64: vQueueTank(survivor, (g_bSecondGame ? 6 : 3), iChosenType, .log = false, .custom = true); + default: + { + switch (MT_GetRandomInt(1, (sizeof iTypes))) + { + case 1: vQueueTank(survivor, 8, iChosenType, .log = false, .custom = true); + case 2: vQueueTank(survivor, 1, iChosenType, .log = false, .custom = true); + case 3: vQueueTank(survivor, 2, iChosenType, .log = false, .custom = true); + case 4: vQueueTank(survivor, 3, iChosenType, .log = false, .custom = true); + case 5: vQueueTank(survivor, (g_bSecondGame ? 4 : 1), iChosenType, .log = false, .custom = true); + case 6: vQueueTank(survivor, (g_bSecondGame ? 5 : 2), iChosenType, .log = false, .custom = true); + case 7: vQueueTank(survivor, (g_bSecondGame ? 6 : 3), iChosenType, .log = false, .custom = true); + } + } + } + + for (int iPlayer = 1; iPlayer <= MaxClients; iPlayer++) + { + if (bIsInfected(iPlayer, MT_CHECK_INGAME|MT_CHECK_ALIVE) && !bExists[iPlayer]) + { + iSpecial = iPlayer; + + break; + } + } + + if (bIsInfected(iSpecial) && teleport) + { + TeleportEntity(iSpecial, flHitPos); + } + } + } } - iMessages[iMessageCount] = iFlag; - iMessageCount++; + delete hTrace; } - if (iMessageCount > 0) + return iSpecial; +} + +/** + * ArrayList functions + **/ + +void vClearAbilityList() +{ + for (int iPos = 0; iPos < (sizeof esGeneral::g_alAbilitySections); iPos++) { - switch (iMessages[MT_GetRandomInt(0, (iMessageCount - 1))]) + if (g_esGeneral.g_alAbilitySections[iPos] != null) { - case 1: return 1; - case 2: return 2; - case 4: return 3; - case 8: return 4; - case 16: return 5; - case 32: return 6; - case 64: return 7; - case 128: return 8; - case 256: return 9; - case 512: return 10; - default: return MT_GetRandomInt(1, (sizeof iMessages)); + g_esGeneral.g_alAbilitySections[iPos].Clear(); + + delete g_esGeneral.g_alAbilitySections[iPos]; } } - - return MT_GetRandomInt(1, (sizeof iMessages)); } -int iGetMinType(int specType = 0, bool condition = false) +void vClearClassKeysList() { - int iMinType = (specType != 8) ? g_esSpecific.g_iMinType : -1; - return (specType == 8 || condition || iMinType <= 0) ? g_esGeneral.g_iMinType : iMinType; + for (int iPos = 0; iPos < (sizeof esGeneral::g_alClassKeys); iPos++) + { + if (g_esGeneral.g_alClassKeys[iPos] != null) + { + g_esGeneral.g_alClassKeys[iPos].Clear(); + + delete g_esGeneral.g_alClassKeys[iPos]; + } + } } -int iGetRandomRecipient(int recipient, int tank, int priority, bool none) +void vClearColorKeysList() { - bool bCondition = false; - float flPercentage = 0.0; - int iRecipient = recipient, iRecipientCount = 0; - int[] iRecipients = new int[MaxClients + 1]; - if (g_esCache[tank].g_iShareRewards[priority] == 1 || g_esCache[tank].g_iShareRewards[priority] == 3) + for (int iPos = 0; iPos < (sizeof esGeneral::g_alColorKeys); iPos++) { - for (int iSurvivor = 1; iSurvivor <= MaxClients; iSurvivor++) + if (g_esGeneral.g_alColorKeys[iPos] != null) { - bCondition = none ? (g_esPlayer[iSurvivor].g_iRewardTypes <= 0) : (g_esPlayer[iSurvivor].g_iRewardTypes > 0); - flPercentage = ((float(g_esPlayer[iSurvivor].g_iTankDamage[tank]) / float(g_esPlayer[tank].g_iSpecialMaxHealth)) * 100.0); - if (bIsHumanSurvivor(iSurvivor) && bCondition && (1.0 <= flPercentage < g_esCache[tank].g_flRewardPercentage[priority]) && iSurvivor != recipient) - { - iRecipients[iRecipientCount] = iSurvivor; - iRecipientCount++; - } + g_esGeneral.g_alColorKeys[iPos].Clear(); + + delete g_esGeneral.g_alColorKeys[iPos]; } } +} - if (iRecipientCount > 0) +void vClearCompTypesList() +{ + if (g_esGeneral.g_alCompTypes[0] != null) { - iRecipient = iRecipients[MT_GetRandomInt(0, (iRecipientCount - 1))]; + g_esGeneral.g_alCompTypes[0].Clear(); + + delete g_esGeneral.g_alCompTypes[0]; } - if ((g_esCache[tank].g_iShareRewards[priority] == 2 || g_esCache[tank].g_iShareRewards[priority] == 3) && (iRecipientCount == 0 || iRecipient == recipient)) + if (g_esGeneral.g_alCompTypes[1] != null) { - bool bBot = false; - for (int iSurvivor = 1; iSurvivor <= MaxClients; iSurvivor++) - { - bCondition = none ? (g_esPlayer[iSurvivor].g_iRewardTypes <= 0) : (g_esPlayer[iSurvivor].g_iRewardTypes > 0); - flPercentage = ((float(g_esPlayer[iSurvivor].g_iTankDamage[tank]) / float(g_esPlayer[tank].g_iSpecialMaxHealth)) * 100.0); - if (bIsSurvivor(iSurvivor) && bCondition && (1.0 <= flPercentage < g_esCache[tank].g_flRewardPercentage[priority]) && iSurvivor != recipient) - { - bBot = (g_esCache[tank].g_iShareRewards[priority] == 2) ? !bIsValidClient(iSurvivor, MT_CHECK_FAKECLIENT) : true; - if (bBot) - { - iRecipients[iRecipientCount] = iSurvivor; - iRecipientCount++; - } - } - } + g_esGeneral.g_alCompTypes[1].Clear(); - if (iRecipientCount > 0) - { - iRecipient = iRecipients[MT_GetRandomInt(0, (iRecipientCount - 1))]; - } + delete g_esGeneral.g_alCompTypes[1]; } +} - return iRecipient; +void vClearElevatorsList() +{ + if (g_esGeneral.g_alElevators != null) + { + g_esGeneral.g_alElevators.Clear(); + + delete g_esGeneral.g_alElevators; + } } -int iGetRealType(int type, int exclude = 0, int tank, int min = -1, int max = -1) +void vClearPluginList() { - Action aResult = Plugin_Continue; - int iType = g_esTank[type].g_iRealType[0]; + if (g_esGeneral.g_alPlugins != null) + { + g_esGeneral.g_alPlugins.Clear(); - Call_StartForward(g_esGeneral.g_gfTypeChosenForward); - Call_PushCellRef(iType); - Call_PushCell(tank); - Call_Finish(aResult); + delete g_esGeneral.g_alPlugins; + } +} - switch (aResult) +void vClearSectionList() +{ + if (g_esGeneral.g_alSections != null) { - case Plugin_Stop: return 0; - case Plugin_Handled: return iChooseType(exclude, tank, min, max); - case Plugin_Changed: return g_esTank[iType].g_iRecordedType[0]; + g_esGeneral.g_alSections.Clear(); + + delete g_esGeneral.g_alSections; } +} - return type; +void vResetElevatorsList() +{ + vClearElevatorsList(); + + g_esGeneral.g_alElevators = new ArrayList(); } -int iGetRefEHandle(Address entityHandle) +/** + * Timer functions & callbacks + **/ + +void vResetBioMassTimer() { - if (!entityHandle) - { - return INVALID_EHANDLE_INDEX; - } + delete g_esMob.g_hBioMassTimer; - Address adRefHandle = SDKCall(g_esGeneral.g_hSDKGetRefEHandle, entityHandle); - return LoadFromAddress(adRefHandle, NumberType_Int32); + g_esMob.g_hBioMassTimer = CreateTimer(g_esMob.g_flCommonCheck, tTimerCheckBioMassMeter, .flags = TIMER_REPEAT); } -int iGetRandomRushType() +void vResetProtectionTimers(int tank, int type) { - int iRushCount = 0, iRushTypes[7], iFlag = 0; - for (int iBit = 0; iBit < (sizeof iRushTypes); iBit++) + if (type == 1 || type == 3) { - iFlag = (1 << iBit); - if (!(g_esGeneral.g_iRushTypes & iFlag) || (!g_bSecondGame && iBit >= 4)) - { - continue; - } + delete g_esPlayer[tank].g_hProtectionTimer[0]; - iRushTypes[iRushCount] = iFlag; - iRushCount++; + g_esPlayer[tank].g_hProtectionTimer[0] = CreateTimer(g_esTankCache[tank].g_flShieldDuration, tTimerRemoveShield, GetClientUserId(tank), TIMER_FLAG_NO_MAPCHANGE); } - if (iRushCount > 0) + if (type == 2 || type == 3) { - int iType = iRushTypes[MT_GetRandomInt(0, (iRushCount - 1))]; + delete g_esPlayer[tank].g_hProtectionTimer[1]; - switch (iType) - { - case MT_RUSHTYPE_SMOKER: return 1; - case MT_RUSHTYPE_BOOMER: return 2; - case MT_RUSHTYPE_HUNTER: return 3; - case MT_RUSHTYPE_SPITTER: return g_bSecondGame ? 4 : 2; - case MT_RUSHTYPE_JOCKEY: return g_bSecondGame ? 5 : 3; - case MT_RUSHTYPE_CHARGER: return g_bSecondGame ? 6 : 1; - case MT_RUSHTYPE_TANK: return 8; - } + g_esPlayer[tank].g_hProtectionTimer[1] = CreateTimer(g_esTankCache[tank].g_flArmorDuration, tTimerRemoveArmor, GetClientUserId(tank), TIMER_FLAG_NO_MAPCHANGE); } - - return 0; } -int iGetSpecialCount(bool manual, bool include = false) +void vResetRegularWavesTimer(bool delay) { - switch (manual) + switch (delay) { - case true: + case true: CreateTimer(g_esGeneral.g_flRegularDelay, tTimerDelayRegularWaves, .flags = TIMER_FLAG_NO_MAPCHANGE); + case false: { - int iSpecialCount = 0; - for (int iSpecial = 1; iSpecial <= MaxClients; iSpecial++) + if (g_esGeneral.g_hSDKHasAnySurvivorLeftSafeArea != null && g_esGeneral.g_adDirector != Address_Null && SDKCall(g_esGeneral.g_hSDKHasAnySurvivorLeftSafeArea, g_esGeneral.g_adDirector)) { - if (bIsInfected(iSpecial, MT_CHECK_INGAME|MT_CHECK_ALIVE)) - { - if (!include && bIsCustomTank(iSpecial)) - { - continue; - } + delete g_esGeneral.g_hRegularWavesTimer; - iSpecialCount++; - } + g_esGeneral.g_hRegularWavesTimer = CreateTimer(g_esGeneral.g_flRegularInterval, tTimerRegularWaves, .flags = TIMER_REPEAT); } - - return iSpecialCount; } - case false: return g_esGeneral.g_iSpecialCount; } - - return 0; } -int iGetSpecialTypes(int setting, const char[] specsection) +void vResetTimers() { - int iPos = StrContains(specsection, MT_CONFIG_SECTION_SMOKER, false); - bool bCheck = iPos != -1; - int iTypes = setting; - iPos = (iPos > 0) ? (iPos - 1) : 0; - if (bCheck) + vResetBioMassTimer(); + vResetRegularWavesTimer(false); + + for (int iTank = 1; iTank <= MaxClients; iTank++) { - switch (specsection[iPos] == '!' || specsection[iPos] == '/') + if (bIsSpecialSupported(iTank)) { - case true: iTypes = !!(iTypes & MT_SPECINF_SMOKER) ? (iTypes & ~MT_SPECINF_SMOKER) : iTypes; - case false: iTypes = !(iTypes & MT_SPECINF_SMOKER) ? (iTypes|MT_SPECINF_SMOKER) : iTypes; + vResetTimersForward(1, iTank); } } - iPos = StrContains(specsection, MT_CONFIG_SECTION_BOOMER, false); - bCheck = iPos != -1; - iPos = (iPos > 0) ? (iPos - 1) : 0; - if (bCheck) + vResetTimersForward(); +} + +Action tTimerAnnounce(Handle timer, DataPack pack) +{ + pack.Reset(); + + int iTank = GetClientOfUserId(pack.ReadCell()); + if (!bIsInfected(iTank) || g_esGeneral.g_bFinaleEnded || g_esGeneral.g_bRoundEnded) { - switch (specsection[iPos] == '!' || specsection[iPos] == '/') - { - case true: iTypes = !!(iTypes & MT_SPECINF_BOOMER) ? (iTypes & ~MT_SPECINF_BOOMER) : iTypes; - case false: iTypes = !(iTypes & MT_SPECINF_BOOMER) ? (iTypes|MT_SPECINF_BOOMER) : iTypes; - } + return Plugin_Stop; } - iPos = StrContains(specsection, MT_CONFIG_SECTION_HUNTER, false); - bCheck = iPos != -1; - iPos = (iPos > 0) ? (iPos - 1) : 0; - if (bCheck) + if (bIsSpecialSupported(iTank) && !bIsInfectedIdle(iTank)) { - switch (specsection[iPos] == '!' || specsection[iPos] == '/') + if (bIsSpecialInfected(iTank) && !bIsTankVisible(iTank)) { - case true: iTypes = !!(iTypes & MT_SPECINF_HUNTER) ? (iTypes & ~MT_SPECINF_HUNTER) : iTypes; - case false: iTypes = !(iTypes & MT_SPECINF_HUNTER) ? (iTypes|MT_SPECINF_HUNTER) : iTypes; + return Plugin_Continue; } + + char sOldName[33], sNewName[33]; + pack.ReadString(sOldName, sizeof sOldName); + pack.ReadString(sNewName, sizeof sNewName); + + int iMode = pack.ReadCell(), iSpecType = pack.ReadCell(); + vChooseArrivalType(iTank, sOldName, sNewName, iMode, iSpecType); + + return Plugin_Stop; } - iPos = StrContains(specsection, MT_CONFIG_SECTION_SPITTER, false); - bCheck = iPos != -1; - iPos = (iPos > 0) ? (iPos - 1) : 0; - if (bCheck) + return Plugin_Continue; +} + +Action tTimerAnnounce2(Handle timer, DataPack pack) +{ + pack.Reset(); + + int iTank = GetClientOfUserId(pack.ReadCell()); + if (!bIsInfected(iTank) || g_esGeneral.g_bFinaleEnded || g_esGeneral.g_bRoundEnded) { - switch (specsection[iPos] == '!' || specsection[iPos] == '/') - { - case true: iTypes = !!(iTypes & MT_SPECINF_SPITTER) ? (iTypes & ~MT_SPECINF_SPITTER) : iTypes; - case false: iTypes = !(iTypes & MT_SPECINF_SPITTER) ? (iTypes|MT_SPECINF_SPITTER) : iTypes; - } + return Plugin_Stop; } - iPos = StrContains(specsection, MT_CONFIG_SECTION_JOCKEY, false); - bCheck = iPos != -1; - iPos = (iPos > 0) ? (iPos - 1) : 0; - if (bCheck) + if (!bIsInfectedIdle(iTank)) { - switch (specsection[iPos] == '!' || specsection[iPos] == '/') + if (bIsSpecialInfected(iTank) && !bIsTankVisible(iTank)) { - case true: iTypes = !!(iTypes & MT_SPECINF_JOCKEY) ? (iTypes & ~MT_SPECINF_JOCKEY) : iTypes; - case false: iTypes = !(iTypes & MT_SPECINF_JOCKEY) ? (iTypes|MT_SPECINF_JOCKEY) : iTypes; + return Plugin_Continue; } + + int iSpecType = pack.ReadCell(); + vAnnounceArrival(iTank, iSpecType); + + return Plugin_Stop; } - iPos = StrContains(specsection, MT_CONFIG_SECTION_CHARGER, false); - bCheck = iPos != -1; - iPos = (iPos > 0) ? (iPos - 1) : 0; - if (bCheck) + return Plugin_Continue; +} + +Action tTimerBloodEffect(Handle timer, int userid) +{ + int iTank = GetClientOfUserId(userid); + if (!g_esGeneral.g_bPluginEnabled || !bIsSpecialSupported(iTank) || !bHasCoreAdminAccess(iTank) || !bIsInfectedEnabled(iTank) || !(g_esTankCache[iTank].g_iBodyEffects & MT_PARTICLE_BLOOD) || !g_esPlayer[iTank].g_bBlood || g_esGeneral.g_bFinaleEnded || g_esGeneral.g_bRoundEnded) { - switch (specsection[iPos] == '!' || specsection[iPos] == '/') - { - case true: iTypes = !!(iTypes & MT_SPECINF_CHARGER) ? (iTypes & ~MT_SPECINF_CHARGER) : iTypes; - case false: iTypes = !(iTypes & MT_SPECINF_CHARGER) ? (iTypes|MT_SPECINF_CHARGER) : iTypes; - } + g_esPlayer[iTank].g_bBlood = false; + + return Plugin_Stop; } - return iTypes; + if (bIsInfectedIdle(iTank) || (bIsSpecialInfected(iTank) && !bIsTankVisible(iTank)) || (g_esGeneral.g_iGraphicsLevel <= 2 && g_esGeneral.g_cvMTGraphicsLevel.IntValue <= 2)) + { + return Plugin_Continue; + } + + vAttachParticle(iTank, PARTICLE_BLOOD, 0.75, 30.0); + + return Plugin_Continue; } -int iGetTankCount(bool manual, bool include = false) +Action tTimerBloodEffect2(Handle timer, int ref) { - switch (manual) + int iInfected = EntRefToEntIndex(ref); + if (!bIsValidEntity(iInfected) || g_esGeneral.g_bFinaleEnded || g_esGeneral.g_bRoundEnded) { - case true: - { - int iTankCount = 0; - for (int iTank = 1; iTank <= MaxClients; iTank++) - { - if (bIsTank(iTank, MT_CHECK_INGAME|MT_CHECK_ALIVE)) - { - if (!include && bIsCustomTank(iTank)) - { - continue; - } + return Plugin_Stop; + } - iTankCount++; - } - } + if (!g_esGeneral.g_bPluginEnabled || !bIsMobSupported(iInfected) || (!bIsCommonInfected(iInfected) && !bIsWitch(iInfected)) || !(g_esInfectedCache[iInfected].g_iBodyEffects & MT_PARTICLE_BLOOD) || !g_esInfected[iInfected].g_bBlood) + { + g_esInfected[iInfected].g_bBlood = false; - return iTankCount; - } - case false: return g_esGeneral.g_iTankCount; + return Plugin_Stop; } - return 0; + if (g_esGeneral.g_iGraphicsLevel <= 2 && g_esGeneral.g_cvMTGraphicsLevel.IntValue <= 2) + { + return Plugin_Continue; + } + + vAttachParticle(iInfected, PARTICLE_BLOOD, 0.75, 30.0); + + return Plugin_Continue; } -int iGetTypeCount(int tank, int type = 0) +Action tTimerBlurEffect(Handle timer, int userid) { - bool bCondition = false, bCheck = false; - int iTypeCount = 0; - for (int iTank = 1; iTank <= MaxClients; iTank++) + int iTank = GetClientOfUserId(userid); + if (!g_esGeneral.g_bPluginEnabled || !bIsSpecialSupported(iTank) || !bHasCoreAdminAccess(iTank) || !bIsInfectedEnabled(iTank) || !(g_esTankCache[iTank].g_iPropsAttached & MT_PROP_BLUR) || !g_esPlayer[iTank].g_bBlur || g_esGeneral.g_bFinaleEnded || g_esGeneral.g_bRoundEnded) { - switch (g_esPlayer[tank].g_iInfectedType) - { - case 1: bCondition = bIsSmoker(iTank, MT_CHECK_INGAME|MT_CHECK_ALIVE); - case 2: bCondition = bIsBoomer(iTank, MT_CHECK_INGAME|MT_CHECK_ALIVE); - case 3: bCondition = bIsHunter(iTank, MT_CHECK_INGAME|MT_CHECK_ALIVE); - case 4: bCondition = bIsSpitter(iTank, MT_CHECK_INGAME|MT_CHECK_ALIVE); - case 5: bCondition = bIsJockey(iTank, MT_CHECK_INGAME|MT_CHECK_ALIVE); - case 6: bCondition = bIsCharger(iTank, MT_CHECK_INGAME|MT_CHECK_ALIVE); - default: bCondition = bIsTank(iTank, MT_CHECK_INGAME|MT_CHECK_ALIVE); - } + g_esPlayer[iTank].g_bBlur = false; - bCheck = (type > 0) ? (g_esPlayer[iTank].g_iTankType == type) : (g_esPlayer[iTank].g_iTankType > 0); - if (bCondition && !g_esPlayer[iTank].g_bArtificial && bCheck) - { - iTypeCount++; - } + return Plugin_Stop; } - return iTypeCount; + int iTankModel = EntRefToEntIndex(g_esPlayer[iTank].g_iBlur); + if (iTankModel == INVALID_ENT_REFERENCE || !bIsValidEntity(iTankModel)) + { + g_esPlayer[iTank].g_bBlur = false; + g_esPlayer[iTank].g_iBlur = INVALID_ENT_REFERENCE; + + return Plugin_Stop; + } + + float flTankPos[3], flTankAngles[3]; + GetClientAbsOrigin(iTank, flTankPos); + GetClientAbsAngles(iTank, flTankAngles); + if (bIsValidEntity(iTankModel)) + { + TeleportEntity(iTankModel, flTankPos, flTankAngles); + SetEntProp(iTankModel, Prop_Send, "m_nSequence", GetEntProp(iTank, Prop_Send, "m_nSequence")); + } + + return Plugin_Continue; } -int iGetUsefulRewards(int survivor, int tank, int types, int priority) +Action tTimerCheckBioMassMeter(Handle timer) { - int iType = 0; - if (g_esCache[tank].g_iUsefulRewards[priority] > 0) + if (g_esGeneral.g_bFinaleEnded || g_esGeneral.g_bRoundEnded) + { + g_esMob.g_hBioMassTimer = null; + + return Plugin_Stop; + } + + float flChance = 0.0, flGoal = 0.0, flTemp = 0.0; + int iCount = 0; + for (int iIndex = 0; iIndex <= MT_MAXTYPES; iIndex++) { - if (bIsSurvivor(survivor, MT_CHECK_ALIVE)) + flGoal = flGetSettingValue(true, true, g_esHorde[iIndex].g_flCommonGoal, g_esMob.g_flCommonGoal, 1); + if (0.0 < flGoal <= g_esMob.g_flBioMassMeter) { - int iAmmo = -1, iWeapon = GetPlayerWeaponSlot(survivor, 0); - if (iWeapon > MaxClients) + flChance = flGetSettingValue(true, true, g_esHorde[iIndex].g_flCommonBioChance, g_esMob.g_flCommonBioChance, 1); + iCount = iGetTankTypeCount(0, iIndex); + if (!bIsRightGame(iIndex, 8) || g_esTank[iIndex].g_iSpawnType > 0 || !bIsCommonEnabled(iIndex) || !bIsSpawnEnabled(iIndex, 8) || !bIsTypeAvailable(iIndex) || bAreHumansRequired(iIndex, 8) || !bCanTypeSpawn(iIndex, 8) || flChance <= 0.0 || (g_esGeneral.g_iSpawnLimit > 0 && iCount >= g_esGeneral.g_iSpawnLimit) || bIsBossLimited(iIndex)) { - iAmmo = GetEntProp(survivor, Prop_Send, "m_iAmmo", .element = iGetWeaponOffset(iWeapon)); + continue; } - if ((g_esCache[tank].g_iUsefulRewards[priority] & MT_USEFUL_REFILL) && !(types & MT_REWARD_REFILL) && ((g_esPlayer[survivor].g_bLastLife[0] && g_esPlayer[survivor].g_iReviveCount > 0) || bIsSurvivorDisabled(survivor)) && -1 < iAmmo <= 10) - { - iType |= MT_REWARD_REFILL; - } - else if ((g_esCache[tank].g_iUsefulRewards[priority] & MT_USEFUL_HEALTH) && !(types & MT_REWARD_REFILL) && !(types & MT_REWARD_HEALTH) && ((g_esPlayer[survivor].g_bLastLife[0] && g_esPlayer[survivor].g_iReviveCount > 0) || bIsSurvivorDisabled(survivor))) + if (flChance <= GetRandomFloat(0.1, 100.0)) { - iType |= MT_REWARD_HEALTH; + continue; } - else if ((g_esCache[tank].g_iUsefulRewards[priority] & MT_USEFUL_AMMO) && !(types & MT_REWARD_REFILL) && !(types & MT_REWARD_AMMO) && -1 < iAmmo <= 10) + + g_esSpecific.g_bInfected[iIndex] = true; + + if (flGoal > flTemp) { - iType |= MT_REWARD_AMMO; + flTemp = flGoal; } } - else if ((g_esCache[tank].g_iUsefulRewards[priority] & MT_USEFUL_RESPAWN) && !(types & MT_REWARD_RESPAWN)) - { - iType |= MT_REWARD_RESPAWN; - } } - return iType; + if (0.0 < flTemp <= g_esMob.g_flBioMassMeter) + { + CreateTimer(1.0, tTimerUseBioMass, flTemp, TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); + + g_esMob.g_hBioMassTimer = null; + + return Plugin_Stop; + } + + return Plugin_Continue; } -int iGetWeaponInfoID(int weapon) +Action tTimerCheckCharacter(Handle timer, int userid) { - if (bIsValidEntity(weapon) && g_esGeneral.g_hSDKGetWeaponID != null) + int iSurvivor = GetClientOfUserId(userid); + if (!bIsSurvivor(iSurvivor) || g_esPlayer[iSurvivor].g_iRewardTypes > 0 || g_esGeneral.g_bFinaleEnded || g_esGeneral.g_bRoundEnded) { - int iWeaponID = SDKCall(g_esGeneral.g_hSDKGetWeaponID, weapon); - if (iWeaponID != -1 && g_esGeneral.g_hSDKGetWeaponInfo != null) + g_esShooter[iSurvivor].g_hCharacterTimer = null; + + return Plugin_Stop; + } + + int iType = GetEntProp(iSurvivor, Prop_Send, "m_survivorCharacter"); + if (g_esShooter[iSurvivor].g_iCharacterType[1] == -1 || g_esShooter[iSurvivor].g_iCharacterType[1] != iType) + { + g_esShooter[iSurvivor].g_iCharacterType[1] = iType; + } + + if (g_esShooter[iSurvivor].g_iCharacterType[0] == -1 || g_esShooter[iSurvivor].g_iCharacterType[0] != iType) + { + g_esShooter[iSurvivor].g_iCharacterType[0] = iType; + + vCacheSurvivorSettings(iSurvivor); + vCheckSurvivorPassive(iSurvivor); +#if defined _WeaponHandling_included + int iActiveWeapon = iGetSurvivorActiveWeapon(iSurvivor); + if (bIsValidEntity(iActiveWeapon)) { - return SDKCall(g_esGeneral.g_hSDKGetWeaponInfo, iWeaponID); + vToggleWeaponPassive(iSurvivor, iActiveWeapon); } +#endif } - return -1; + return Plugin_Continue; } -/** - * ArrayList functions - **/ - -void vClearAbilityList() +Action tTimerCheckInfection(Handle timer, DataPack pack) { - for (int iPos = 0; iPos < (sizeof esGeneral::g_alAbilitySections); iPos++) + pack.Reset(); + + int iSurvivor = GetClientOfUserId(pack.ReadCell()); + if (bIsSurvivor(iSurvivor) || g_esGeneral.g_bFinaleEnded || g_esGeneral.g_bRoundEnded) { - if (g_esGeneral.g_alAbilitySections[iPos] != null) - { - g_esGeneral.g_alAbilitySections[iPos].Clear(); + vRemoveInfection(iSurvivor); - delete g_esGeneral.g_alAbilitySections[iPos]; - } + return Plugin_Stop; } -} -void vClearColorKeysList() -{ - for (int iPos = 0; iPos < (sizeof esGeneral::g_alColorKeys); iPos++) + int iChosenType = pack.ReadCell(), iSpecType = pack.ReadCell(), iTeleport = pack.ReadCell(), iVoice = pack.ReadCell(); + float flVoiceChance = pack.ReadFloat(), flVoiceInterval = pack.ReadFloat(), flPos[3], flAngles[3]; + char sAttackLines[1280], sBaitLines[1280]; + pack.ReadString(sAttackLines, sizeof sAttackLines); + pack.ReadString(sBaitLines, sizeof sBaitLines); + pack.ReadFloatArray(flPos, sizeof flPos); + pack.ReadFloatArray(flAngles, sizeof flAngles); + + int iSpecial = iSpawnNearbySpecial(iSurvivor, iSpecType, iChosenType, true, !!iTeleport, flPos, flAngles); + if (bIsInfected(iSpecial)) { - if (g_esGeneral.g_alColorKeys[iPos] != null) + if (iVoice == 1 && flVoiceInterval > 0.0) { - g_esGeneral.g_alColorKeys[iPos].Clear(); - - delete g_esGeneral.g_alColorKeys[iPos]; + DataPack dpVoices; + CreateDataTimer(flVoiceInterval, tTimerInfectionVoices, dpVoices, TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); + dpVoices.WriteCell(GetClientUserId(iSpecial)); + dpVoices.WriteFloat(flVoiceChance); + dpVoices.WriteString(sAttackLines); + dpVoices.WriteString(sBaitLines); } + + vCopyInfectionStats(iSurvivor, iSpecial); + vRemoveInfection(iSurvivor); + + return Plugin_Stop; } + + return Plugin_Continue; } -void vClearCompTypesList() +Action tTimerCheckTankView(Handle timer, int userid) { - if (g_esGeneral.g_alCompTypes != null) + int iTank = GetClientOfUserId(userid); + if (!g_esGeneral.g_bPluginEnabled || !bIsSpecialSupported(iTank, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_ALIVE|MT_CHECK_FAKECLIENT)) { - g_esGeneral.g_alCompTypes.Clear(); - - delete g_esGeneral.g_alCompTypes; + return Plugin_Stop; } + + QueryClientConVar(iTank, "z_view_distance", vViewDistanceQuery); + + return Plugin_Continue; } -void vClearPluginList() +Action tTimerControlTank(Handle timer, int userid) { - if (g_esGeneral.g_alPlugins != null) + int iTank = GetClientOfUserId(userid); + if (!bIsInfected(iTank)) { - g_esGeneral.g_alPlugins.Clear(); - - delete g_esGeneral.g_alPlugins; + return Plugin_Stop; } + + vTankSpawn(iTank, -1, 8); + + return Plugin_Continue; } -void vClearSectionList() +Action tTimerDelayPassive(Handle timer, int userid) { - if (g_esGeneral.g_alSections != null) + int iTank = GetClientOfUserId(userid); + if (!bIsInfected(iTank) || g_esGeneral.g_bFinaleEnded || g_esGeneral.g_bRoundEnded) { - g_esGeneral.g_alSections.Clear(); + g_esPlayer[iTank].g_hPassiveTimer[0] = null; - delete g_esGeneral.g_alSections; + return Plugin_Stop; } + + delete g_esPlayer[iTank].g_hPassiveTimer[1]; + + g_esPlayer[iTank].g_bPassive = false; + g_esPlayer[iTank].g_hPassiveTimer[1] = CreateTimer(g_esTankCache[iTank].g_flPassiveInterval, tTimerPassive, GetClientUserId(iTank), TIMER_REPEAT); + g_esPlayer[iTank].g_hPassiveTimer[0] = null; + + return Plugin_Continue; } -/** - * Timer functions & callbacks - **/ +Action tTimerDelayRegularWaves(Handle timer) +{ + delete g_esGeneral.g_hRegularWavesTimer; -void vResetProtectionTimers(int tank, int type) + g_esGeneral.g_hRegularWavesTimer = CreateTimer(g_esGeneral.g_flRegularInterval, tTimerRegularWaves, .flags = TIMER_REPEAT); + + return Plugin_Continue; +} + +Action tTimerDelaySurvival(Handle timer) { - if (type == 1 || type == 3) + g_esGeneral.g_hSurvivalTimer = null; + g_esGeneral.g_iSurvivalBlock = 2; + + return Plugin_Continue; +} + +Action tTimerDevParticle(Handle timer, int userid) +{ + int iSurvivor = GetClientOfUserId(userid); + if (!g_esGeneral.g_bPluginEnabled || !bIsSurvivor(iSurvivor) || !bIsDeveloper(iSurvivor, 1) || !g_esDeveloper[iSurvivor].g_bDevVisual || g_esGeneral.g_bFinaleEnded || g_esGeneral.g_bRoundEnded) { - delete g_esPlayer[tank].g_hProtectionTimer[0]; + g_esDeveloper[iSurvivor].g_bDevVisual = false; - g_esPlayer[tank].g_hProtectionTimer[0] = CreateTimer(g_esCache[tank].g_flShieldDuration, tTimerRemoveShield, GetClientUserId(tank), TIMER_FLAG_NO_MAPCHANGE); + return Plugin_Stop; } - if (type == 2 || type == 3) + if (g_esDeveloper[iSurvivor].g_iDevParticle <= 0 || (g_esGeneral.g_iGraphicsLevel <= 2 && g_esGeneral.g_cvMTGraphicsLevel.IntValue <= 2)) { - delete g_esPlayer[tank].g_hProtectionTimer[1]; - - g_esPlayer[tank].g_hProtectionTimer[1] = CreateTimer(g_esCache[tank].g_flArmorDuration, tTimerRemoveArmor, GetClientUserId(tank), TIMER_FLAG_NO_MAPCHANGE); + return Plugin_Continue; } + + vSetSurvivorEffects(iSurvivor, g_esDeveloper[iSurvivor].g_iDevParticle); + + return Plugin_Continue; } -void vResetTimers(bool delay = false) +Action tTimerElectricEffect(Handle timer, int userid) { - switch (delay) + int iTank = GetClientOfUserId(userid); + if (!g_esGeneral.g_bPluginEnabled || !bIsSpecialSupported(iTank) || !bHasCoreAdminAccess(iTank) || !bIsInfectedEnabled(iTank) || !(g_esTankCache[iTank].g_iBodyEffects & MT_PARTICLE_ELECTRICITY) || !g_esPlayer[iTank].g_bElectric || g_esGeneral.g_bFinaleEnded || g_esGeneral.g_bRoundEnded) { - case true: CreateTimer(g_esGeneral.g_flRegularDelay, tTimerDelayRegularWaves, .flags = TIMER_FLAG_NO_MAPCHANGE); + g_esPlayer[iTank].g_bElectric = false; + + return Plugin_Stop; + } + + if (bIsInfectedIdle(iTank) || (bIsSpecialInfected(iTank) && !bIsTankVisible(iTank)) || (g_esGeneral.g_iGraphicsLevel <= 2 && g_esGeneral.g_cvMTGraphicsLevel.IntValue <= 2)) + { + return Plugin_Continue; + } + + switch (bIsValidClient(iTank, MT_CHECK_FAKECLIENT)) + { + case true: vAttachParticle(iTank, PARTICLE_ELECTRICITY, 0.75, 30.0); case false: { - if (g_esGeneral.g_hSDKHasAnySurvivorLeftSafeArea != null && g_esGeneral.g_adDirector != Address_Null && SDKCall(g_esGeneral.g_hSDKHasAnySurvivorLeftSafeArea, g_esGeneral.g_adDirector)) + for (int iCount = 1; iCount < 4; iCount++) { - delete g_esGeneral.g_hRegularWavesTimer; - - g_esGeneral.g_hRegularWavesTimer = CreateTimer(g_esGeneral.g_flRegularInterval, tTimerRegularWaves, .flags = TIMER_REPEAT); + switch (bIsSpecialInfected(iTank)) + { + case true: vAttachParticle(iTank, PARTICLE_ELECTRICITY, 0.75, (1.0 * float(iCount * 10))); + case false: vAttachParticle(iTank, PARTICLE_ELECTRICITY, 0.75, (1.0 * float(iCount * 15))); + } } } } - for (int iTank = 1; iTank <= MaxClients; iTank++) + return Plugin_Continue; +} + +Action tTimerElectricEffect2(Handle timer, int ref) +{ + int iInfected = EntRefToEntIndex(ref); + if (!bIsValidEntity(iInfected) || g_esGeneral.g_bFinaleEnded || g_esGeneral.g_bRoundEnded) { - if (bIsInfectedSupported(iTank)) - { - vResetTimersForward(1, iTank); - } + return Plugin_Stop; } - vResetTimersForward(); + if (!g_esGeneral.g_bPluginEnabled || !bIsMobSupported(iInfected) || (!bIsCommonInfected(iInfected) && !bIsWitch(iInfected)) || !(g_esInfectedCache[iInfected].g_iBodyEffects & MT_PARTICLE_ELECTRICITY) || !g_esInfected[iInfected].g_bElectric) + { + g_esInfected[iInfected].g_bElectric = false; + + return Plugin_Stop; + } + + if (g_esGeneral.g_iGraphicsLevel <= 2 && g_esGeneral.g_cvMTGraphicsLevel.IntValue <= 2) + { + return Plugin_Continue; + } + + vAttachParticle(iInfected, PARTICLE_ELECTRICITY, 0.75, 30.0); + + return Plugin_Continue; } -Action tTimerAnnounce(Handle timer, DataPack pack) +Action tTimerExecuteCustomConfig(Handle timer, DataPack pack) { pack.Reset(); - int iTank = GetClientOfUserId(pack.ReadCell()); - if (!bIsInfected(iTank)) + char sSavePath[PLATFORM_MAX_PATH]; + pack.ReadString(sSavePath, sizeof sSavePath); + if (sSavePath[0] != '\0') + { + vLogMessage(MT_LOG_SERVER, _, "%s %T", MT_TAG, "ReloadingConfig", LANG_SERVER, sSavePath); + vLoadConfigs(sSavePath, 2); + vPluginStatus(); + vResetTimers(); + vToggleTankRushConVars(); + vToggleLogging(); + } + + return Plugin_Continue; +} + +Action tTimerFireEffect(Handle timer, int userid) +{ + int iTank = GetClientOfUserId(userid); + if (!g_esGeneral.g_bPluginEnabled || !bIsSpecialSupported(iTank) || !bHasCoreAdminAccess(iTank) || !bIsInfectedEnabled(iTank) || !(g_esTankCache[iTank].g_iBodyEffects & MT_PARTICLE_FIRE) || !g_esPlayer[iTank].g_bFire || g_esGeneral.g_bFinaleEnded || g_esGeneral.g_bRoundEnded) { + g_esPlayer[iTank].g_bFire = false; + return Plugin_Stop; } - if (bIsInfectedSupported(iTank) && !bIsInfectedIdle(iTank)) + if (bIsInfectedIdle(iTank) || (bIsSpecialInfected(iTank) && !bIsTankVisible(iTank)) || (g_esGeneral.g_iGraphicsLevel <= 2 && g_esGeneral.g_cvMTGraphicsLevel.IntValue <= 2)) { - if (bIsSpecialInfected(iTank) && !bIsTankVisible(iTank)) - { - return Plugin_Continue; - } + return Plugin_Continue; + } - char sOldName[33], sNewName[33]; - pack.ReadString(sOldName, sizeof sOldName); - pack.ReadString(sNewName, sizeof sNewName); + vAttachParticle(iTank, PARTICLE_FIRE, 0.75); - int iMode = pack.ReadCell(), iSpecType = pack.ReadCell(); - vChooseArrivalType(iTank, sOldName, sNewName, iMode, iSpecType); + return Plugin_Continue; +} + +Action tTimerFireEffect2(Handle timer, int ref) +{ + int iInfected = EntRefToEntIndex(ref); + if (!bIsValidEntity(iInfected) || g_esGeneral.g_bFinaleEnded || g_esGeneral.g_bRoundEnded) + { + return Plugin_Stop; + } + + if (!g_esGeneral.g_bPluginEnabled || !bIsMobSupported(iInfected) || (!bIsCommonInfected(iInfected) && !bIsWitch(iInfected)) || !(g_esInfectedCache[iInfected].g_iBodyEffects & MT_PARTICLE_FIRE) || !g_esInfected[iInfected].g_bFire) + { + g_esInfected[iInfected].g_bFire = false; return Plugin_Stop; } + if (g_esGeneral.g_iGraphicsLevel <= 2 && g_esGeneral.g_cvMTGraphicsLevel.IntValue <= 2) + { + return Plugin_Continue; + } + + vAttachParticle(iInfected, PARTICLE_FIRE, 0.75); + return Plugin_Continue; } -Action tTimerAnnounce2(Handle timer, DataPack pack) +Action tTimerForceSpawnInfected(Handle timer, int userid) { - pack.Reset(); + int iTank = GetClientOfUserId(userid); + if (!g_esGeneral.g_bPluginEnabled || !bIsInfected(iTank) || !bIsInfectedGhost(iTank)) + { + return Plugin_Stop; + } + + int iAbility = -1; + if (g_esGeneral.g_hSDKMaterializeFromGhost != null) + { + SDKCall(g_esGeneral.g_hSDKMaterializeFromGhost, iTank); + iAbility = GetEntPropEnt(iTank, Prop_Send, "m_customAbility"); + } + + switch (iAbility) + { + case -1: MT_PrintToChat(iTank, "%s %t", MT_TAG3, "SpawnManually"); + default: vTankSpawn(iTank); + } + + return Plugin_Continue; +} - int iTank = GetClientOfUserId(pack.ReadCell()); - if (!bIsInfected(iTank)) +Action tTimerHideDeathModel(Handle timer, int ref) +{ + int iDeathModel = EntRefToEntIndex(ref); + if (iDeathModel == INVALID_ENT_REFERENCE || !bIsValidEntity(iDeathModel)) { return Plugin_Stop; } - if (!bIsInfectedIdle(iTank)) - { - if (bIsSpecialInfected(iTank) && !bIsTankVisible(iTank)) - { - return Plugin_Continue; - } + float flPos[3]; + flPos[0] = MT_GetRandomFloat(-180.0, 180.0); + flPos[1] = MT_GetRandomFloat(-180.0, 180.0); + flPos[2] = MT_GetRandomFloat(-180.0, 180.0); + TeleportEntity(iDeathModel, flPos); + SDKHook(iDeathModel, SDKHook_SetTransmit, OnDeathModelSetTransmit); - int iSpecType = pack.ReadCell(); - vAnnounceArrival(iTank, iSpecType); + return Plugin_Continue; +} + +Action tTimerHudPanel(Handle timer, int userid) +{ + int iPlayer = GetClientOfUserId(userid); + if (!g_esGeneral.g_bPluginEnabled || !bIsValidClient(iPlayer) || !bIsDeveloper(iPlayer, .real = true) || iGetTankCount(true, true) <= 0 || g_esGeneral.g_bFinaleEnded || g_esGeneral.g_bRoundEnded) + { + g_esPlayer[iPlayer].g_hHudTimer = null; return Plugin_Stop; } + vHudPanel(iPlayer, g_esPlayer[iPlayer].g_iHudPanelPage); + return Plugin_Continue; } -Action tTimerBloodEffect(Handle timer, int userid) +Action tTimerIceEffect(Handle timer, int userid) { int iTank = GetClientOfUserId(userid); - if (!g_esGeneral.g_bPluginEnabled || !bIsInfectedSupported(iTank) || !bHasCoreAdminAccess(iTank) || !bIsInfectedEnabled(iTank) || !(g_esCache[iTank].g_iBodyEffects & MT_PARTICLE_BLOOD) || !g_esPlayer[iTank].g_bBlood) + if (!g_esGeneral.g_bPluginEnabled || !bIsSpecialSupported(iTank) || !bHasCoreAdminAccess(iTank) || !bIsInfectedEnabled(iTank) || !(g_esTankCache[iTank].g_iBodyEffects & MT_PARTICLE_ICE) || !g_esPlayer[iTank].g_bIce || g_esGeneral.g_bFinaleEnded || g_esGeneral.g_bRoundEnded) { - g_esPlayer[iTank].g_bBlood = false; + g_esPlayer[iTank].g_bIce = false; return Plugin_Stop; } - if (bIsInfectedIdle(iTank) || (bIsSpecialInfected(iTank) && !bIsTankVisible(iTank))) + if (bIsInfectedIdle(iTank) || (bIsSpecialInfected(iTank) && !bIsTankVisible(iTank)) || (g_esGeneral.g_iGraphicsLevel <= 2 && g_esGeneral.g_cvMTGraphicsLevel.IntValue <= 2)) { return Plugin_Continue; } - vAttachParticle(iTank, PARTICLE_BLOOD, 0.75, 30.0); + vAttachParticle(iTank, PARTICLE_ICE, 2.0, 30.0); return Plugin_Continue; } -Action tTimerBlurEffect(Handle timer, int userid) +Action tTimerIceEffect2(Handle timer, int ref) { - int iTank = GetClientOfUserId(userid); - if (!g_esGeneral.g_bPluginEnabled || !bIsInfectedSupported(iTank) || !bHasCoreAdminAccess(iTank) || !bIsInfectedEnabled(iTank) || !(g_esCache[iTank].g_iPropsAttached & MT_PROP_BLUR) || !g_esPlayer[iTank].g_bBlur) + int iInfected = EntRefToEntIndex(ref); + if (!bIsValidEntity(iInfected) || g_esGeneral.g_bFinaleEnded || g_esGeneral.g_bRoundEnded) { - g_esPlayer[iTank].g_bBlur = false; - return Plugin_Stop; } - int iTankModel = EntRefToEntIndex(g_esPlayer[iTank].g_iBlur); - if (iTankModel == INVALID_ENT_REFERENCE || !bIsValidEntity(iTankModel)) + if (!g_esGeneral.g_bPluginEnabled || !bIsMobSupported(iInfected) || (!bIsCommonInfected(iInfected) && !bIsWitch(iInfected)) || !(g_esInfectedCache[iInfected].g_iBodyEffects & MT_PARTICLE_ICE) || !g_esInfected[iInfected].g_bIce) { - g_esPlayer[iTank].g_bBlur = false; - g_esPlayer[iTank].g_iBlur = INVALID_ENT_REFERENCE; + g_esInfected[iInfected].g_bIce = false; return Plugin_Stop; } - float flTankPos[3], flTankAngles[3]; - GetClientAbsOrigin(iTank, flTankPos); - GetClientAbsAngles(iTank, flTankAngles); - if (bIsValidEntity(iTankModel)) + if (g_esGeneral.g_iGraphicsLevel <= 2 && g_esGeneral.g_cvMTGraphicsLevel.IntValue <= 2) { - TeleportEntity(iTankModel, flTankPos, flTankAngles); - SetEntProp(iTankModel, Prop_Send, "m_nSequence", GetEntProp(iTank, Prop_Send, "m_nSequence")); + return Plugin_Continue; } + vAttachParticle(iInfected, PARTICLE_ICE, 2.0, 30.0); + return Plugin_Continue; } -Action tTimerCheckTankView(Handle timer, int userid) +Action tTimerInfectionVoices(Handle timer, DataPack pack) { - int iTank = GetClientOfUserId(userid); - if (!g_esGeneral.g_bPluginEnabled || !bIsInfectedSupported(iTank, MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_ALIVE|MT_CHECK_FAKECLIENT)) + pack.Reset(); + + int iSpecial = GetClientOfUserId(pack.ReadCell()); + if (!bIsInfected(iSpecial) || g_esGeneral.g_bFinaleEnded || g_esGeneral.g_bRoundEnded) { return Plugin_Stop; } - QueryClientConVar(iTank, "z_view_distance", vViewDistanceQuery); - - return Plugin_Continue; -} + float flVoiceChance = pack.ReadFloat(); + char sAttackLines[1280], sBaitLines[1280]; + pack.ReadString(sAttackLines, sizeof sAttackLines); + pack.ReadString(sBaitLines, sizeof sBaitLines); -void tTimerControlTank(Handle timer, int userid) -{ - int iTank = GetClientOfUserId(userid); - if (!bIsInfected(iTank)) + if (GetRandomFloat(0.1, 100.0) <= flVoiceChance) { - return; - } - - vTankSpawn(iTank, -1, 8); -} + bool bAttacking = (iGetInfectedVictim(iSpecial, g_esPlayer[iSpecial].g_iInfectedType) > 0 || bIsVisibleToPlayer(iSpecial)); + char sVoicelines[1280], sSet[20][64]; + FormatEx(sVoicelines, sizeof sVoicelines, "%s", ((!bAttacking || bIsInfectedIdle(iSpecial, 3)) ? sBaitLines : sAttackLines)); + ReplaceString(sVoicelines, sizeof sVoicelines, " ", ""); -void tTimerDelayRegularWaves(Handle timer) -{ - delete g_esGeneral.g_hRegularWavesTimer; + int iVoicelineCount = ExplodeString(sVoicelines, ",", sSet, sizeof sSet, sizeof sSet[]); + if (iVoicelineCount > 0) + { + FormatEx(sVoicelines, sizeof sVoicelines, "player/survivor/voice/%s", sSet[MT_GetRandomInt(0, (iVoicelineCount - 1))]); + EmitSoundToAll(sVoicelines, iSpecial, SNDCHAN_VOICE, .flags = SND_SHOULDPAUSE); + } + } - g_esGeneral.g_hRegularWavesTimer = CreateTimer(g_esGeneral.g_flRegularInterval, tTimerRegularWaves, .flags = TIMER_REPEAT); + return Plugin_Continue; } -void tTimerDelaySurvival(Handle timer) +Action tTimerInfectSurvivor(Handle timer, DataPack pack) { - g_esGeneral.g_hSurvivalTimer = null; - g_esGeneral.g_iSurvivalBlock = 2; -} + pack.Reset(); -Action tTimerDevParticle(Handle timer, int userid) -{ - int iSurvivor = GetClientOfUserId(userid); - if (!g_esGeneral.g_bPluginEnabled || !bIsSurvivor(iSurvivor) || !bIsDeveloper(iSurvivor, 0) || !g_esDeveloper[iSurvivor].g_bDevVisual || g_esGeneral.g_bFinaleEnded) + int iSurvivor = GetClientOfUserId(pack.ReadCell()); + if (bIsSurvivor(iSurvivor) || g_esGeneral.g_bFinaleEnded || g_esGeneral.g_bRoundEnded) { - g_esDeveloper[iSurvivor].g_bDevVisual = false; - return Plugin_Stop; } - if (g_esDeveloper[iSurvivor].g_iDevParticle <= 0) + int iFilter = pack.ReadCell(), iMix = pack.ReadCell(), iMode = pack.ReadCell(), iTeleport = pack.ReadCell(), iMinType = pack.ReadCell(), iMaxType = pack.ReadCell(), iVoice = pack.ReadCell(); + float flVoiceChance = pack.ReadFloat(), flVoiceInterval = pack.ReadFloat(), flPos[3], flAngles[3]; + char sAttackLines[1280], sBaitLines[1280]; + pack.ReadString(sAttackLines, sizeof sAttackLines); + pack.ReadString(sBaitLines, sizeof sBaitLines); + pack.ReadFloatArray(flPos, sizeof flPos); + pack.ReadFloatArray(flAngles, sizeof flAngles); + + int iBit = 0, iChosenType = 0, iSpecType = 0; + + switch (iMode) { - return Plugin_Continue; + case 1: + { + iChosenType = (iMix == 1) ? iChosenType : MT_GetRandomInt(iMinType, iMaxType); + iSpecType = iFilter; + } + case 2: + { + iChosenType = (iMix == 1) ? iChosenType : g_esShooter[iSurvivor].g_iFirstType; + iBit = g_esShooter[iSurvivor].g_iFirstSpecial; + iSpecType = (iBit != -1) ? (1 << iBit) : iFilter; + iSpecType = (iBit == 8) ? (1 << 0) : iSpecType; + } + case 3: + { + iChosenType = (iMix == 1) ? iChosenType : g_esShooter[iSurvivor].g_iLastType; + iBit = g_esShooter[iSurvivor].g_iLastSpecial; + iSpecType = (iBit != -1) ? (1 << iBit) : iFilter; + iSpecType = (iBit == 8) ? (1 << 0) : iSpecType; + } + case 4: + { + iChosenType = (iMix == 1) ? iChosenType : g_esShooter[iSurvivor].g_iLeastType; + iBit = g_esShooter[iSurvivor].g_iLeastSpecial; + iSpecType = (iBit != -1) ? (1 << iBit) : iFilter; + iSpecType = (iBit == 8) ? (1 << 0) : iSpecType; + } + case 5: + { + iChosenType = (iMix == 1) ? iChosenType : g_esShooter[iSurvivor].g_iMostType; + iBit = g_esShooter[iSurvivor].g_iMostSpecial; + iSpecType = (iBit != -1) ? (1 << iBit) : iFilter; + iSpecType = (iBit == 8) ? (1 << 0) : iSpecType; + } + case 6: + { + iChosenType = (iMix == 1) ? iChosenType : g_esShooter[iSurvivor].g_iKillerType; + iBit = g_esShooter[iSurvivor].g_iKillerSpecial; + iSpecType = (iBit != -1) ? (1 << iBit) : iFilter; + iSpecType = (iBit == 8) ? (1 << 0) : iSpecType; + } } - vSetSurvivorEffects(iSurvivor, g_esDeveloper[iSurvivor].g_iDevParticle); + DataPack dpInfection; + CreateDataTimer(1.0, tTimerCheckInfection, dpInfection, TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); + dpInfection.WriteCell(GetClientUserId(iSurvivor)); + dpInfection.WriteCell(iChosenType); + dpInfection.WriteCell(iSpecType); + dpInfection.WriteCell(iTeleport); + dpInfection.WriteCell(iVoice); + dpInfection.WriteFloat(flVoiceChance); + dpInfection.WriteFloat(flVoiceInterval); + dpInfection.WriteString(sAttackLines); + dpInfection.WriteString(sBaitLines); + dpInfection.WriteFloatArray(flPos, sizeof flPos); + dpInfection.WriteFloatArray(flAngles, sizeof flAngles); return Plugin_Continue; } -Action tTimerElectricEffect(Handle timer, int userid) +Action tTimerKillIdleTank(Handle timer, int userid) { int iTank = GetClientOfUserId(userid); - if (!g_esGeneral.g_bPluginEnabled || !bIsInfectedSupported(iTank) || !bHasCoreAdminAccess(iTank) || !bIsInfectedEnabled(iTank) || !(g_esCache[iTank].g_iBodyEffects & MT_PARTICLE_ELECTRICITY) || !g_esPlayer[iTank].g_bElectric) + if (!g_esGeneral.g_bPluginEnabled || !bIsTank(iTank) || bIsTank(iTank, MT_CHECK_FAKECLIENT)) { - g_esPlayer[iTank].g_bElectric = false; - return Plugin_Stop; } - if (bIsInfectedIdle(iTank) || (bIsSpecialInfected(iTank) && !bIsTankVisible(iTank))) + if (g_esPlayer[iTank].g_bBlindTank && g_esGeneral.g_cvMTBlind.BoolValue) { return Plugin_Continue; } - switch (bIsValidClient(iTank, MT_CHECK_FAKECLIENT)) + if (iGetIncapacitatedCount() < iGetSurvivorCount() && bIsInfectedIdle(iTank, g_esGeneral.g_iIdleCheckMode)) { - case true: vAttachParticle(iTank, PARTICLE_ELECTRICITY, 0.75, 30.0); - case false: - { - for (int iCount = 1; iCount < 4; iCount++) - { - switch (bIsSpecialInfected(iTank)) - { - case true: vAttachParticle(iTank, PARTICLE_ELECTRICITY, 0.75, (1.0 * float(iCount * 10))); - case false: vAttachParticle(iTank, PARTICLE_ELECTRICITY, 0.75, (1.0 * float(iCount * 15))); - } - } - } + ForcePlayerSuicide(iTank); + + return Plugin_Stop; } return Plugin_Continue; } -void tTimerExecuteCustomConfig(Handle timer, DataPack pack) +Action tTimerKillStuckTank(Handle timer, int userid) { - pack.Reset(); - - char sSavePath[PLATFORM_MAX_PATH]; - pack.ReadString(sSavePath, sizeof sSavePath); - if (sSavePath[0] != '\0') + int iTank = GetClientOfUserId(userid); + if (!g_esGeneral.g_bPluginEnabled || !bIsInfected(iTank) || !bIsPlayerIncapacitated(iTank)) { - vLogMessage(MT_LOG_SERVER, _, "%s %T", MT_TAG, "ReloadingConfig", LANG_SERVER, sSavePath); - vLoadConfigs(sSavePath, 2); - vPluginStatus(); - vResetTimers(); - vToggleTankRushConVars(); - vToggleLogging(); + return Plugin_Stop; } + + ForcePlayerSuicide(iTank); + + return Plugin_Continue; } -Action tTimerFireEffect(Handle timer, int userid) +Action tTimerLoopVoiceline(Handle timer, int userid) { - int iTank = GetClientOfUserId(userid); - if (!g_esGeneral.g_bPluginEnabled || !bIsInfectedSupported(iTank) || !bHasCoreAdminAccess(iTank) || !bIsInfectedEnabled(iTank) || !(g_esCache[iTank].g_iBodyEffects & MT_PARTICLE_FIRE) || !g_esPlayer[iTank].g_bFire) + int iSurvivor = GetClientOfUserId(userid); + if (!g_esGeneral.g_bPluginEnabled || !bIsSurvivor(iSurvivor) || g_esPlayer[iSurvivor].g_flVisualTime[2] == -1.0 || g_esPlayer[iSurvivor].g_flVisualTime[2] < GetGameTime() || g_esPlayer[iSurvivor].g_sLoopingVoiceline[0] == '\0' || g_esGeneral.g_bFinaleEnded || g_esGeneral.g_bRoundEnded) { - g_esPlayer[iTank].g_bFire = false; + g_esPlayer[iSurvivor].g_flVisualTime[2] = -1.0; + g_esPlayer[iSurvivor].g_sLoopingVoiceline[0] = '\0'; return Plugin_Stop; } - if (bIsInfectedIdle(iTank) || (bIsSpecialInfected(iTank) && !bIsTankVisible(iTank))) + if (!(g_esPlayer[iSurvivor].g_iRewardVisuals & MT_VISUAL_VOICELINE) || bHasIdlePlayer(iSurvivor) || bIsPlayerIdle(iSurvivor)) { return Plugin_Continue; } - vAttachParticle(iTank, PARTICLE_FIRE, 0.75); + vForceVocalize(iSurvivor, g_esPlayer[iSurvivor].g_sLoopingVoiceline); return Plugin_Continue; } -Action tTimerForceSpawnInfected(Handle timer, int userid) +Action tTimerMeteorEffect(Handle timer, int userid) { int iTank = GetClientOfUserId(userid); - if (!g_esGeneral.g_bPluginEnabled || !bIsInfected(iTank) || !bIsInfectedGhost(iTank)) + if (!g_esGeneral.g_bPluginEnabled || !bIsSpecialSupported(iTank) || !bHasCoreAdminAccess(iTank) || !bIsInfectedEnabled(iTank) || !(g_esTankCache[iTank].g_iBodyEffects & MT_PARTICLE_METEOR) || !g_esPlayer[iTank].g_bMeteor || g_esGeneral.g_bFinaleEnded || g_esGeneral.g_bRoundEnded) { + g_esPlayer[iTank].g_bMeteor = false; + return Plugin_Stop; } - int iAbility = -1; - if (g_esGeneral.g_hSDKMaterializeFromGhost != null) + if (bIsInfectedIdle(iTank) || (bIsSpecialInfected(iTank) && !bIsTankVisible(iTank)) || (g_esGeneral.g_iGraphicsLevel <= 2 && g_esGeneral.g_cvMTGraphicsLevel.IntValue <= 2)) { - SDKCall(g_esGeneral.g_hSDKMaterializeFromGhost, iTank); - iAbility = GetEntPropEnt(iTank, Prop_Send, "m_customAbility"); + return Plugin_Continue; } - switch (iAbility) - { - case -1: MT_PrintToChat(iTank, "%s %t", MT_TAG3, "SpawnManually"); - default: vTankSpawn(iTank); - } + vAttachParticle(iTank, PARTICLE_METEOR, 6.0, 30.0); return Plugin_Continue; } -Action tTimerHudPanel(Handle timer, int userid) +Action tTimerMeteorEffect2(Handle timer, int ref) { - int iPlayer = GetClientOfUserId(userid); - if (!g_esGeneral.g_bPluginEnabled || !bIsValidClient(iPlayer) || !bIsDeveloper(iPlayer, .real = true) || iGetTankCount(true, true) <= 0) + int iInfected = EntRefToEntIndex(ref); + if (!bIsValidEntity(iInfected) || g_esGeneral.g_bFinaleEnded || g_esGeneral.g_bRoundEnded) { - g_esPlayer[iPlayer].g_hHudTimer = null; + return Plugin_Stop; + } + + if (!g_esGeneral.g_bPluginEnabled || !bIsMobSupported(iInfected) || (!bIsCommonInfected(iInfected) && !bIsWitch(iInfected)) || !(g_esInfectedCache[iInfected].g_iBodyEffects & MT_PARTICLE_METEOR) || !g_esInfected[iInfected].g_bMeteor) + { + g_esInfected[iInfected].g_bMeteor = false; return Plugin_Stop; } - vHudPanel(iPlayer, g_esPlayer[iPlayer].g_iHudPanelPage); + if (g_esGeneral.g_iGraphicsLevel <= 2 && g_esGeneral.g_cvMTGraphicsLevel.IntValue <= 2) + { + return Plugin_Continue; + } + + vAttachParticle(iInfected, PARTICLE_METEOR, 6.0, 30.0); return Plugin_Continue; } -Action tTimerIceEffect(Handle timer, int userid) +Action tTimerParticleVisual(Handle timer, int userid) { - int iTank = GetClientOfUserId(userid); - if (!g_esGeneral.g_bPluginEnabled || !bIsInfectedSupported(iTank) || !bHasCoreAdminAccess(iTank) || !bIsInfectedEnabled(iTank) || !(g_esCache[iTank].g_iBodyEffects & MT_PARTICLE_ICE) || !g_esPlayer[iTank].g_bIce) + int iSurvivor = GetClientOfUserId(userid); + if (!g_esGeneral.g_bPluginEnabled || !bIsSurvivor(iSurvivor) || g_esPlayer[iSurvivor].g_flVisualTime[1] == -1.0 || g_esPlayer[iSurvivor].g_flVisualTime[1] < GetGameTime() || g_esPlayer[iSurvivor].g_iParticleEffect <= 0 || g_esGeneral.g_bFinaleEnded || g_esGeneral.g_bRoundEnded) { - g_esPlayer[iTank].g_bIce = false; + g_esPlayer[iSurvivor].g_flVisualTime[1] = -1.0; + g_esPlayer[iSurvivor].g_iParticleEffect = 0; return Plugin_Stop; } - if (bIsInfectedIdle(iTank) || (bIsSpecialInfected(iTank) && !bIsTankVisible(iTank))) + if ((bIsDeveloper(iSurvivor, 1) && g_esDeveloper[iSurvivor].g_bDevVisual && g_esDeveloper[iSurvivor].g_iDevParticle > 0) || !(g_esPlayer[iSurvivor].g_iRewardVisuals & MT_VISUAL_PARTICLE) || bHasIdlePlayer(iSurvivor) || bIsPlayerIdle(iSurvivor) || (g_esGeneral.g_iGraphicsLevel <= 2 && g_esGeneral.g_cvMTGraphicsLevel.IntValue <= 2)) { return Plugin_Continue; } - vAttachParticle(iTank, PARTICLE_ICE, 2.0, 30.0); + vSetSurvivorEffects(iSurvivor, g_esPlayer[iSurvivor].g_iParticleEffect); return Plugin_Continue; } -Action tTimerKillIdleTank(Handle timer, int userid) +Action tTimerPassive(Handle timer, int userid) { int iTank = GetClientOfUserId(userid); - if (!g_esGeneral.g_bPluginEnabled || !bIsTank(iTank) || bIsTank(iTank, MT_CHECK_FAKECLIENT)) + if (!g_esGeneral.g_bPluginEnabled || !bIsSpecialSupported(iTank) || !bHasCoreAdminAccess(iTank) || !bIsInfectedEnabled(iTank) || g_esGeneral.g_bFinaleEnded || g_esGeneral.g_bRoundEnded) { + g_esPlayer[iTank].g_hPassiveTimer[1] = null; + return Plugin_Stop; } - if (bIsInfectedIdle(iTank, g_esGeneral.g_iIdleCheckMode)) + int iPassiveHealth = g_esTankCache[iTank].g_iPassiveHealth; + if (iPassiveHealth == 0) { - ForcePlayerSuicide(iTank); + g_esPlayer[iTank].g_bPassive = false; + g_esPlayer[iTank].g_hPassiveTimer[1] = null; + + return Plugin_Stop; + } + + int iHealth = GetEntProp(iTank, Prop_Data, "m_iHealth"), iMaxHealth = GetEntProp(iTank, Prop_Data, "m_iMaxHealth"); + float flHealthPercentage = (float(iHealth) / float(iMaxHealth)), flPassiveHealth = float(iPassiveHealth); + if (g_esTankCache[iTank].g_flArmorPercentage > 0.0 && (1.0 - g_esTankCache[iTank].g_flArmorPercentage) <= flHealthPercentage && g_esTankCache[iTank].g_flArmorResistance[0] > 0.0) + { + flPassiveHealth /= (flPassiveHealth / (flPassiveHealth * (1.0 - g_esTankCache[iTank].g_flArmorResistance[0]))); + } + else if (g_esTankCache[iTank].g_flShieldPercentage > 0.0 && (1.0 - g_esTankCache[iTank].g_flArmorPercentage - g_esTankCache[iTank].g_flShieldPercentage) <= flHealthPercentage && g_esTankCache[iTank].g_flShieldRate > 0.0) + { + flPassiveHealth /= g_esTankCache[iTank].g_flShieldRate; + } + + int iNewHealth = (iHealth + RoundToNearest(flPassiveHealth)), iHealthBoost = (iNewHealth > iMaxHealth) ? iMaxHealth : iNewHealth, + iHealthNoBoost = (iNewHealth < iHealth) ? 1 : iNewHealth, iFinalHealth = (iNewHealth >= 0) ? iHealthBoost : iHealthNoBoost; + SetEntProp(iTank, Prop_Data, "m_iHealth", iFinalHealth); + + if ((iPassiveHealth > 0 && iFinalHealth >= iMaxHealth) || (iPassiveHealth < 0 && iFinalHealth <= 1)) + { + g_esPlayer[iTank].g_bPassive = false; + g_esPlayer[iTank].g_hPassiveTimer[1] = null; + + if (iPassiveHealth < 0 && iFinalHealth <= 1) + { + ForcePlayerSuicide(iTank); + } return Plugin_Stop; } @@ -28628,76 +36065,175 @@ Action tTimerKillIdleTank(Handle timer, int userid) return Plugin_Continue; } -void tTimerKillStuckTank(Handle timer, int userid) +Action tTimerPunishSurvivors(Handle timer) { - int iTank = GetClientOfUserId(userid); - if (!g_esGeneral.g_bPluginEnabled || !bIsInfected(iTank) || !bIsPlayerIncapacitated(iTank)) + if (g_esGeneral.g_bFinaleEnded || g_esGeneral.g_bRoundEnded) { - return; + return Plugin_Stop; + } + + if (!g_esGeneral.g_bPluginEnabled || bIsCompetitiveMode() || (g_esGeneral.g_iPunishEnabled[0] <= -1 && g_esGeneral.g_iPunishEnabled[1] <= -1 && g_esGeneral.g_iPunishBots[0] <= -1 && g_esGeneral.g_iPunishBots[1] <= -1) || (g_esGeneral.g_iFinaleCheck == 2 && g_esGeneral.g_bNormalMap) || (g_esGeneral.g_iFinaleCheck == 1 && g_esGeneral.g_bFinalMap)) + { + return Plugin_Continue; } - ForcePlayerSuicide(iTank); -} + ArrayList alFlowList = new ArrayList(2); + if (alFlowList != null) + { + bool bHuman = false; + float flFlow = 0.0; + int iArea = 0, iCount = 0, iFlowCount = 0, iIncapCount = 0, iIndex = 0, iLift = -1, iSurvivor = 0; + int[] iSurvivors = new int[MaxClients + 1]; + for (int iPlayer = 1; iPlayer <= MaxClients; iPlayer++) + { + if (bIsSurvivor(iPlayer, MT_CHECK_INGAME|MT_CHECK_ALIVE)) + { + if (bIsDeveloper(iPlayer, 11) || (((g_esShooter[iPlayer].g_iTotalPassives & MT_PASSIVE_GODMODE) || (g_esPlayer[iPlayer].g_iRewardTypes & MT_REWARD_GODMODE)) && g_esPlayer[iPlayer].g_iSafetyBubble == 1) || g_esPlayer[iPlayer].g_bPunished) + { + continue; + } + + iSurvivors[iCount++] = iPlayer; + + if (g_esGeneral.g_iIncapsRequired > 0 && bIsSurvivorDisabled(iPlayer)) + { + iIncapCount++; + } + } + } + + for (int iPos = 0; iPos < iCount; iPos++) + { + iSurvivor = iSurvivors[iPos]; + bHuman = bIsValidClient(iSurvivor, MT_CHECK_FAKECLIENT); + + if ((!(g_esGeneral.g_iSurvivorTypes & MT_PUNISH_ALIVE) && bIsSurvivor(iSurvivor, MT_CHECK_ALIVE)) || (!(g_esGeneral.g_iSurvivorTypes & MT_PUNISH_INCAPS) && 0 < g_esGeneral.g_iIncapsRequired <= iIncapCount && bIsSurvivorDisabled(iSurvivor)) + || (!(g_esGeneral.g_iSurvivorTypes & MT_PUNISH_ACTIONS) && bIsSurvivorHelping(iSurvivor)) || (!(g_esGeneral.g_iSurvivorTypes & MT_PUNISH_IDLE) && bIsPlayerIdle(iSurvivor)) || (!(g_esGeneral.g_iSurvivorTypes & MT_PUNISH_PINNED) && bIsSurvivorCaught(iSurvivor)) + || (!(g_esGeneral.g_iSurvivorTypes & MT_PUNISH_INJURED) && g_esPlayer[iSurvivor].g_bLastLife[0])) + { + continue; + } + + iLift = GetEntPropEnt(iSurvivor, Prop_Send, "m_hGroundEntity"); + if (iLift > MaxClients) + { + iLift = EntIndexToEntRef(iLift); + if (g_esGeneral.g_alElevators.FindValue(iLift) != -1) + { + continue; + } + } + + iArea = SDKCall(g_esGeneral.g_hSDKGetLastKnownArea, iSurvivor); + flFlow = (iArea == 0) ? 0.0 : view_as(LoadFromAddress(view_as
    (iArea + g_esGeneral.g_iFlowOffset), NumberType_Int32)); + flFlow = (flFlow == -9999.0) ? 0.0 : flFlow; + if (flFlow && flFlow != -9999.0) + { + iFlowCount++; + iIndex = alFlowList.Push(flFlow); + alFlowList.Set(iIndex, iSurvivor, 1); + } + } + + if (0 < g_esGeneral.g_iSurvivorsRequired <= iFlowCount) + { + alFlowList.Sort(Sort_Descending, Sort_Float); + + float flCurrentTime = GetGameTime(), flDistance = 0.0, flLastFlow = 0.0; + if (g_esGeneral.g_flPunishDistance[1] > 0.0) + { + for (int iPos = 0; iPos < iFlowCount; iPos++) + { + iSurvivor = alFlowList.Get(iPos, 1); + bHuman = bIsValidClient(iSurvivor, MT_CHECK_FAKECLIENT); + + if ((bHuman && g_esGeneral.g_iPunishEnabled[1] <= -1) || (!bHuman && g_esGeneral.g_iPunishBots[1] <= -1) || bIsDeveloper(iSurvivor, 11) || (((g_esShooter[iSurvivor].g_iTotalPassives & MT_PASSIVE_GODMODE) || (g_esPlayer[iSurvivor].g_iRewardTypes & MT_REWARD_GODMODE)) && g_esPlayer[iSurvivor].g_iSafetyBubble == 1) || g_esPlayer[iSurvivor].g_bPunished) + { + continue; + } + + if (iPos < (iFlowCount / 2)) + { + flFlow = alFlowList.Get(iPos, 0); + + for (int iPos2 = (iPos + 1); iPos2 <= (iFlowCount / 2); iPos2++) + { + flLastFlow = alFlowList.Get(iPos2, 0); + flDistance = (flFlow - flLastFlow); + + if (g_esGeneral.g_iWarningLimit[1] > 0 && (0.0 < g_esGeneral.g_flWarningDistance[1] < flDistance < g_esGeneral.g_flPunishDistance[1]) && g_esPlayer[iSurvivor].g_flLastWarning < flCurrentTime) + { + g_esPlayer[iSurvivor].g_flLastWarning = (flCurrentTime + float(g_esGeneral.g_iWarningInterval[1])); -Action tTimerLoopVoiceline(Handle timer, int userid) -{ - int iSurvivor = GetClientOfUserId(userid); - if (!g_esGeneral.g_bPluginEnabled || !bIsSurvivor(iSurvivor) || g_esPlayer[iSurvivor].g_flVisualTime[2] == -1.0 || g_esPlayer[iSurvivor].g_flVisualTime[2] < GetGameTime() || g_esPlayer[iSurvivor].g_sLoopingVoiceline[0] == '\0' || g_esGeneral.g_bFinaleEnded) - { - g_esPlayer[iSurvivor].g_flVisualTime[2] = -1.0; - g_esPlayer[iSurvivor].g_sLoopingVoiceline[0] = '\0'; + if (bHuman) + { + PrintHintText(iSurvivor, "%s %t", MT_TAG, "MTWarnRusher"); + } + } - return Plugin_Stop; - } + if (flDistance > g_esGeneral.g_flPunishDistance[1]) + { + if (flFlow > g_esPlayer[iSurvivor].g_flLastFlow) + { + g_esPlayer[iSurvivor].g_flLastFlow = flFlow; - if (!(g_esPlayer[iSurvivor].g_iRewardVisuals & MT_VISUAL_VOICELINE) || bHasIdlePlayer(iSurvivor) || bIsPlayerIdle(iSurvivor)) - { - return Plugin_Continue; - } + vPunishSurvivor(iSurvivor, bHuman, 1); + } + else if (flFlow < g_esPlayer[iSurvivor].g_flLastFlow) + { + g_esPlayer[iSurvivor].g_flLastFlow = flFlow; + } - vForceVocalize(iSurvivor, g_esPlayer[iSurvivor].g_sLoopingVoiceline); + break; + } + } + } + } + } - return Plugin_Continue; -} + if (g_esGeneral.g_flPunishDistance[0] > 0.0) + { + for (int iPos = (iFlowCount - 1); iPos > (iFlowCount / 2); iPos--) + { + iSurvivor = alFlowList.Get(iPos, 1); + bHuman = bIsValidClient(iSurvivor, MT_CHECK_FAKECLIENT); -Action tTimerMeteorEffect(Handle timer, int userid) -{ - int iTank = GetClientOfUserId(userid); - if (!g_esGeneral.g_bPluginEnabled || !bIsInfectedSupported(iTank) || !bHasCoreAdminAccess(iTank) || !bIsInfectedEnabled(iTank) || !(g_esCache[iTank].g_iBodyEffects & MT_PARTICLE_METEOR) || !g_esPlayer[iTank].g_bMeteor) - { - g_esPlayer[iTank].g_bMeteor = false; + if ((bHuman && g_esGeneral.g_iPunishEnabled[0] <= -1) || (!bHuman && g_esGeneral.g_iPunishBots[0] <= -1) || bIsDeveloper(iSurvivor, 11) || (((g_esShooter[iSurvivor].g_iTotalPassives & MT_PASSIVE_GODMODE) || (g_esPlayer[iSurvivor].g_iRewardTypes & MT_REWARD_GODMODE)) && g_esPlayer[iSurvivor].g_iSafetyBubble == 1) || g_esPlayer[iSurvivor].g_bPunished) + { + continue; + } - return Plugin_Stop; - } + flFlow = alFlowList.Get(iPos, 0); - if (bIsInfectedIdle(iTank) || (bIsSpecialInfected(iTank) && !bIsTankVisible(iTank))) - { - return Plugin_Continue; - } + for (int iPos2 = (iPos - 1); iPos2 < iFlowCount; iPos2++) + { + flLastFlow = alFlowList.Get(iPos2, 0); + flDistance = (flLastFlow - flFlow); - vAttachParticle(iTank, PARTICLE_METEOR, 6.0, 30.0); + if (g_esGeneral.g_iWarningLimit[0] > 0 && (0.0 < g_esGeneral.g_flWarningDistance[0] < flDistance < g_esGeneral.g_flPunishDistance[0]) && g_esPlayer[iSurvivor].g_flLastWarning < flCurrentTime) + { + g_esPlayer[iSurvivor].g_flLastWarning = (flCurrentTime + float(g_esGeneral.g_iWarningInterval[0])); - return Plugin_Continue; -} + if (bHuman) + { + PrintHintText(iSurvivor, "%s %t", MT_TAG, "MTWarnSlacker"); + } + } -Action tTimerParticleVisual(Handle timer, int userid) -{ - int iSurvivor = GetClientOfUserId(userid); - if (!g_esGeneral.g_bPluginEnabled || !bIsSurvivor(iSurvivor) || g_esPlayer[iSurvivor].g_flVisualTime[1] == -1.0 || g_esPlayer[iSurvivor].g_flVisualTime[1] < GetGameTime() || g_esPlayer[iSurvivor].g_iParticleEffect <= 0 || g_esGeneral.g_bFinaleEnded) - { - g_esPlayer[iSurvivor].g_flVisualTime[1] = -1.0; - g_esPlayer[iSurvivor].g_iParticleEffect = 0; + if (flDistance > g_esGeneral.g_flPunishDistance[0]) + { + vPunishSurvivor(iSurvivor, bHuman, 0); - return Plugin_Stop; - } + break; + } + } + } + } + } - if ((bIsDeveloper(iSurvivor, 0) && g_esDeveloper[iSurvivor].g_bDevVisual && g_esDeveloper[iSurvivor].g_iDevParticle > 0) || !(g_esPlayer[iSurvivor].g_iRewardVisuals & MT_VISUAL_PARTICLE) || bHasIdlePlayer(iSurvivor) || bIsPlayerIdle(iSurvivor)) - { - return Plugin_Continue; + delete alFlowList; } - vSetSurvivorEffects(iSurvivor, g_esPlayer[iSurvivor].g_iParticleEffect); - return Plugin_Continue; } @@ -28707,6 +36243,7 @@ Action tTimerRefreshRewards(Handle timer) { if (bIsSurvivor(iSurvivor, MT_CHECK_INGAME|MT_CHECK_ALIVE)) { + vEndPassives(iSurvivor, false); vEndRewards(iSurvivor, false); } } @@ -28716,6 +36253,11 @@ Action tTimerRefreshRewards(Handle timer) Action tTimerRegenerateAmmoHealth(Handle timer) { + if (g_esGeneral.g_bFinaleEnded || g_esGeneral.g_bRoundEnded) + { + return Plugin_Stop; + } + if (!g_esGeneral.g_bPluginEnabled) { return Plugin_Continue; @@ -28723,7 +36265,7 @@ Action tTimerRegenerateAmmoHealth(Handle timer) bool bDeveloper = false; char sWeapon[32]; - int iAmmo = 0, iAmmoOffset = 0, iMaxAmmo = 0, iClip = 0, iRegen = 0, iSlot = 0, iSpecialAmmo = 0, iUpgrades = 0; + int iAmmo = 0, iAmmoOffset = 0, iMaxAmmo = 0, iClip = 0, iRegen = 0, iSlot = 0, iSpecialAmmo = 0; for (int iSurvivor = 1; iSurvivor <= MaxClients; iSurvivor++) { if (!bIsSurvivor(iSurvivor)) @@ -28736,7 +36278,7 @@ Action tTimerRegenerateAmmoHealth(Handle timer) bDeveloper = bIsDeveloper(iSurvivor, 4) || bIsDeveloper(iSurvivor, 6); iRegen = (bDeveloper && g_esDeveloper[iSurvivor].g_iDevAmmoRegen > g_esPlayer[iSurvivor].g_iAmmoRegen) ? g_esDeveloper[iSurvivor].g_iDevAmmoRegen : g_esPlayer[iSurvivor].g_iAmmoRegen; - if ((!bDeveloper && (!(g_esPlayer[iSurvivor].g_iRewardTypes & MT_REWARD_AMMO) || g_esPlayer[iSurvivor].g_flRewardTime[4] == -1.0)) || iRegen <= 0) + if ((!bDeveloper && !(g_esShooter[iSurvivor].g_iTotalPassives & MT_PASSIVE_AMMO) && (!(g_esPlayer[iSurvivor].g_iRewardTypes & MT_REWARD_AMMO) || g_esPlayer[iSurvivor].g_flRewardTime[4] == -1.0)) || iRegen <= 0) { continue; } @@ -28760,21 +36302,17 @@ Action tTimerRegenerateAmmoHealth(Handle timer) SetEntProp(iSlot, Prop_Send, "m_iClip1", g_esPlayer[iSurvivor].g_iMaxClip[0]); } - if (g_bSecondGame) + if (g_bSecondGame && bHasSpecialAmmo(iSlot, 0)) { - iUpgrades = GetEntProp(iSlot, Prop_Send, "m_upgradeBitVec"); - if ((iUpgrades & MT_UPGRADE_INCENDIARY) || (iUpgrades & MT_UPGRADE_EXPLOSIVE)) + iSpecialAmmo = GetEntProp(iSlot, Prop_Send, "m_nUpgradedPrimaryAmmoLoaded"); + if (iSpecialAmmo < g_esPlayer[iSurvivor].g_iMaxClip[0]) { - iSpecialAmmo = GetEntProp(iSlot, Prop_Send, "m_nUpgradedPrimaryAmmoLoaded"); - if (iSpecialAmmo < g_esPlayer[iSurvivor].g_iMaxClip[0]) - { - SetEntProp(iSlot, Prop_Send, "m_nUpgradedPrimaryAmmoLoaded", (iSpecialAmmo + iRegen)); - } + SetEntProp(iSlot, Prop_Send, "m_nUpgradedPrimaryAmmoLoaded", (iSpecialAmmo + iRegen)); + } - if ((iSpecialAmmo + iRegen) > g_esPlayer[iSurvivor].g_iMaxClip[0]) - { - SetEntProp(iSlot, Prop_Send, "m_nUpgradedPrimaryAmmoLoaded", g_esPlayer[iSurvivor].g_iMaxClip[0]); - } + if ((iSpecialAmmo + iRegen) > g_esPlayer[iSurvivor].g_iMaxClip[0]) + { + SetEntProp(iSlot, Prop_Send, "m_nUpgradedPrimaryAmmoLoaded", g_esPlayer[iSurvivor].g_iMaxClip[0]); } } @@ -28820,7 +36358,7 @@ Action tTimerRegularWaves(Handle timer) { int iClass = 8, iCount = iGetTankCount(true); iCount = (iCount > 0) ? iCount : iGetTankCount(false); - if (!bCanTypeSpawn(.specType = iClass) || g_esGeneral.g_bFinalMap || g_esGeneral.g_iTankWave > 0 || iCount > 0 || (g_esGeneral.g_iRegularLimit > 0 && g_esGeneral.g_iRegularCount >= g_esGeneral.g_iRegularLimit)) + if (!bCanTypeSpawn(.specType = iClass) || g_esGeneral.g_bFinalMap || g_esGeneral.g_iTankWave > 0 || iCount > 0 || (g_esGeneral.g_iRegularLimit > 0 && g_esGeneral.g_iRegularCount >= g_esGeneral.g_iRegularLimit) || g_esGeneral.g_bFinaleEnded || g_esGeneral.g_bRoundEnded) { g_esGeneral.g_hRegularWavesTimer = null; @@ -28858,67 +36396,189 @@ Action tTimerReloadConfigs(Handle timer) return Plugin_Continue; } -void tTimerRemoveArmor(Handle timer, int userid) +Action tTimerRemoveArmor(Handle timer, int userid) { int iTank = GetClientOfUserId(userid); if (!bIsValidClient(iTank)) { g_esPlayer[iTank].g_hProtectionTimer[1] = null; - return; + return Plugin_Stop; } g_esPlayer[iTank].g_bProtected[1] = false; g_esPlayer[iTank].g_hProtectionTimer[1] = null; + + return Plugin_Continue; +} + +Action tTimerRemovePunisher(Handle timer, DataPack pack) +{ + pack.Reset(); + + int iPunished = GetClientOfUserId(pack.ReadCell()), iPunisher = GetClientOfUserId(pack.ReadCell()); + if (bIsSurvivor(iPunished, MT_CHECK_INDEX|MT_CHECK_INGAME) && g_esPlayer[iPunished].g_bPunished) + { + g_esPlayer[iPunished].g_bPunished = false; + } + + if (!bIsSpecialSupported(iPunisher) || !g_esPlayer[iPunisher].g_bPunisher) + { + g_esPlayer[iPunisher].g_bPunisher = false; + + return Plugin_Stop; + } + + if (g_esPlayer[iPunisher].g_bPunisher) + { + g_esPlayer[iPunisher].g_bPunisher = false; + + switch (bIsValidClient(iPunisher, MT_CHECK_FAKECLIENT)) + { + case true: ForcePlayerSuicide(iPunisher); + case false: KickClient(iPunisher); + } + } + + return Plugin_Continue; } -void tTimerRemoveShield(Handle timer, int userid) +Action tTimerRemoveShield(Handle timer, int userid) { int iTank = GetClientOfUserId(userid); if (!bIsValidClient(iTank)) { g_esPlayer[iTank].g_hProtectionTimer[0] = null; - return; + return Plugin_Stop; } g_esPlayer[iTank].g_bProtected[0] = false; g_esPlayer[iTank].g_hProtectionTimer[0] = null; + + return Plugin_Continue; } -void tTimerRemoveTimescale(Handle timer, int ref) +Action tTimerRemoveTimescale(Handle timer, int ref) { int iTimescale = EntRefToEntIndex(ref); if (iTimescale == INVALID_ENT_REFERENCE || !bIsValidEntity(iTimescale)) { - return; + return Plugin_Stop; } AcceptEntityInput(iTimescale, "Stop"); RemoveEntity(iTimescale); + + return Plugin_Continue; +} + +Action tTimerResetPassiveDelay(Handle timer, int userid) +{ + int iTank = GetClientOfUserId(userid); + if (!bIsValidClient(iTank)) + { + return Plugin_Stop; + } + + g_esPlayer[iTank].g_bPassive = false; + + return Plugin_Continue; } -void tTimerResetType(Handle timer, int userid) +Action tTimerResetType(Handle timer, int userid) { int iTank = GetClientOfUserId(userid); if (!bIsValidClient(iTank)) { vResetTank2(iTank); - return; + return Plugin_Stop; } vResetTank2(iTank); if (g_esPlayer[iTank].g_iTankType > 0) { - vCacheSettings(iTank); + vCacheTankSettings(iTank); } if (!bIsValidClient(iTank, MT_CHECK_FAKECLIENT) && g_esGeneral.g_iKickBots == 1) { KickClient(iTank); } + + return Plugin_Continue; +} + +Action tTimerResizeInfected(Handle timer, int ref) +{ + int iInfected = EntRefToEntIndex(ref); + if (iInfected == INVALID_ENT_REFERENCE || !bIsValidEntity(iInfected) || !g_bSecondGame || g_esGeneral.g_bFinaleEnded || g_esGeneral.g_bRoundEnded) + { + return Plugin_Stop; + } + + bool bCommon = bIsCommonInfected(iInfected), bWitch = bIsWitch(iInfected); + if (bCommon || bWitch) + { + bool bHealth = false; + float flScale = 0.0; + if (bCommon && GetRandomFloat(0.1, 100.0) <= g_esGeneral.g_flInfectedChance) + { + bHealth = !!g_esGeneral.g_iInfectedHealth; + flScale = MT_GetRandomFloat(g_esGeneral.g_flInfectedScaleMin, g_esGeneral.g_flInfectedScaleMax); + } + else if (bWitch && GetRandomFloat(0.1, 100.0) <= g_esGeneral.g_flWitchChance) + { + bHealth = !!g_esGeneral.g_iWitchHealth; + flScale = MT_GetRandomFloat(g_esGeneral.g_flWitchScaleMin, g_esGeneral.g_flWitchScaleMax); + CreateTimer(0.1, tTimerResizeWitch, ref, TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); + } + + if (0.0 < flScale <= 10.0) + { + if (bHealth) + { + int iNewHealth = RoundToCeil(float(GetEntProp(iInfected, Prop_Data, "m_iHealth")) * flScale); + SetEntProp(iInfected, Prop_Data, "m_iHealth", iNewHealth); + SetEntProp(iInfected, Prop_Data, "m_iMaxHealth", iNewHealth); + } + + SetEntPropFloat(iInfected, Prop_Data, "m_flModelScale", flScale); + } + } + + return Plugin_Continue; +} + +Action tTimerResizeWitch(Handle timer, int ref) +{ + int iWitch = EntRefToEntIndex(ref); + if (iWitch == INVALID_ENT_REFERENCE || !bIsValidEntity(iWitch) || !g_bSecondGame || g_esGeneral.g_bFinaleEnded || g_esGeneral.g_bRoundEnded) + { + return Plugin_Stop; + } + + if (bIsWitch(iWitch)) + { + float flRage = GetEntPropFloat(iWitch, Prop_Send, "m_rage"); + int iRush = GetEntProp(iWitch, Prop_Send, "m_mobRush"); + float flScale = (1.0 + (flRage * (g_esGeneral.g_flWitchScaleMax - 1.0))); + if (0.0 < flScale <= 10.0) + { + SetEntPropFloat(iWitch, Prop_Data, "m_flModelScale", flScale); + } + + if (iRush) + { + SetEntPropFloat(iWitch, Prop_Data, "m_flModelScale", g_esGeneral.g_flWitchScaleMax); + + return Plugin_Stop; + } + } + + return Plugin_Continue; } Action tTimerRockEffects(Handle timer, DataPack pack) @@ -28926,7 +36586,7 @@ Action tTimerRockEffects(Handle timer, DataPack pack) pack.Reset(); int iRock = EntRefToEntIndex(pack.ReadCell()), iTank = GetClientOfUserId(pack.ReadCell()); - if (!g_esGeneral.g_bPluginEnabled || iRock == INVALID_ENT_REFERENCE || !bIsValidEntity(iRock) || !bIsTankSupported(iTank) || !bHasCoreAdminAccess(iTank) || !bIsInfectedEnabled(iTank) || g_esCache[iTank].g_iRockEffects <= 0) + if (!g_esGeneral.g_bPluginEnabled || iRock == INVALID_ENT_REFERENCE || !bIsValidEntity(iRock) || !bIsTankSupported(iTank) || !bHasCoreAdminAccess(iTank) || !bIsInfectedEnabled(iTank) || g_esTankCache[iTank].g_iRockEffects <= 0 || g_esGeneral.g_bFinaleEnded || g_esGeneral.g_bRoundEnded) { return Plugin_Stop; } @@ -28938,22 +36598,27 @@ Action tTimerRockEffects(Handle timer, DataPack pack) return Plugin_Stop; } - if (g_esCache[iTank].g_iRockEffects & MT_ROCK_BLOOD) + if (g_esGeneral.g_iGraphicsLevel <= 2 && g_esGeneral.g_cvMTGraphicsLevel.IntValue <= 2) + { + return Plugin_Continue; + } + + if ((g_esTankCache[iTank].g_iRockEffects & MT_ROCK_BLOOD) && GetRandomFloat(0.1, 100.0) <= g_esTankCache[iTank].g_flRockChance[0]) { vAttachParticle(iRock, PARTICLE_BLOOD, 0.75); } - if (g_esCache[iTank].g_iRockEffects & MT_ROCK_ELECTRICITY) + if ((g_esTankCache[iTank].g_iRockEffects & MT_ROCK_ELECTRICITY) && GetRandomFloat(0.1, 100.0) <= g_esTankCache[iTank].g_flRockChance[1]) { vAttachParticle(iRock, PARTICLE_ELECTRICITY, 0.75); } - if (g_esCache[iTank].g_iRockEffects & MT_ROCK_FIRE) + if ((g_esTankCache[iTank].g_iRockEffects & MT_ROCK_FIRE) && GetRandomFloat(0.1, 100.0) <= g_esTankCache[iTank].g_flRockChance[2]) { IgniteEntity(iRock, 120.0); } - if (g_bSecondGame && (g_esCache[iTank].g_iRockEffects & MT_ROCK_SPIT)) + if (g_bSecondGame && (g_esTankCache[iTank].g_iRockEffects & MT_ROCK_SPIT) && GetRandomFloat(0.1, 100.0) <= g_esTankCache[iTank].g_flRockChance[3]) { EmitSoundToAll(SOUND_SPIT, iTank); vAttachParticle(iRock, PARTICLE_SPIT, 0.75); @@ -28965,7 +36630,7 @@ Action tTimerRockEffects(Handle timer, DataPack pack) Action tTimerScreenEffect(Handle timer, int userid) { int iSurvivor = GetClientOfUserId(userid); - if (!g_esGeneral.g_bPluginEnabled || !bIsSurvivor(iSurvivor) || g_esPlayer[iSurvivor].g_flVisualTime[0] == -1.0 || g_esPlayer[iSurvivor].g_flVisualTime[0] < GetGameTime() || g_esGeneral.g_bFinaleEnded) + if (!g_esGeneral.g_bPluginEnabled || !bIsSurvivor(iSurvivor) || g_esPlayer[iSurvivor].g_flVisualTime[0] == -1.0 || g_esPlayer[iSurvivor].g_flVisualTime[0] < GetGameTime() || g_esGeneral.g_bFinaleEnded || g_esGeneral.g_bRoundEnded) { g_esPlayer[iSurvivor].g_flVisualTime[0] = -1.0; g_esPlayer[iSurvivor].g_iScreenColorVisual[0] = -1; @@ -28976,7 +36641,7 @@ Action tTimerScreenEffect(Handle timer, int userid) return Plugin_Stop; } - if (!(g_esPlayer[iSurvivor].g_iRewardVisuals & MT_VISUAL_SCREEN) || bHasIdlePlayer(iSurvivor) || bIsPlayerIdle(iSurvivor) || bIsSurvivorHanging(iSurvivor) || bIsPlayerInThirdPerson(iSurvivor)) + if (!(g_esPlayer[iSurvivor].g_iRewardVisuals & MT_VISUAL_SCREEN) || bHasIdlePlayer(iSurvivor) || bIsPlayerIdle(iSurvivor) || bIsSurvivorHanging(iSurvivor) || bIsPlayerInThirdPerson(iSurvivor) || (g_esGeneral.g_iGraphicsLevel <= 0 && g_esGeneral.g_cvMTGraphicsLevel.IntValue <= 0)) { return Plugin_Continue; } @@ -28994,14 +36659,14 @@ Action tTimerScreenEffect(Handle timer, int userid) Action tTimerSmokeEffect(Handle timer, int userid) { int iTank = GetClientOfUserId(userid); - if (!g_esGeneral.g_bPluginEnabled || !bIsInfectedSupported(iTank) || !bHasCoreAdminAccess(iTank) || !bIsInfectedEnabled(iTank) || !(g_esCache[iTank].g_iBodyEffects & MT_PARTICLE_SMOKE) || !g_esPlayer[iTank].g_bSmoke) + if (!g_esGeneral.g_bPluginEnabled || !bIsSpecialSupported(iTank) || !bHasCoreAdminAccess(iTank) || !bIsInfectedEnabled(iTank) || !(g_esTankCache[iTank].g_iBodyEffects & MT_PARTICLE_SMOKE) || !g_esPlayer[iTank].g_bSmoke || g_esGeneral.g_bFinaleEnded || g_esGeneral.g_bRoundEnded) { g_esPlayer[iTank].g_bSmoke = false; return Plugin_Stop; } - if (bIsInfectedIdle(iTank) || (bIsSpecialInfected(iTank) && !bIsTankVisible(iTank))) + if (bIsInfectedIdle(iTank) || (bIsSpecialInfected(iTank) && !bIsTankVisible(iTank)) || (g_esGeneral.g_iGraphicsLevel <= 2 && g_esGeneral.g_cvMTGraphicsLevel.IntValue <= 2)) { return Plugin_Continue; } @@ -29011,17 +36676,42 @@ Action tTimerSmokeEffect(Handle timer, int userid) return Plugin_Continue; } +Action tTimerSmokeEffect2(Handle timer, int ref) +{ + int iInfected = EntRefToEntIndex(ref); + if (!bIsValidEntity(iInfected) || g_esGeneral.g_bFinaleEnded || g_esGeneral.g_bRoundEnded) + { + return Plugin_Stop; + } + + if (!g_esGeneral.g_bPluginEnabled || !bIsMobSupported(iInfected) || (!bIsCommonInfected(iInfected) && !bIsWitch(iInfected)) || !(g_esInfectedCache[iInfected].g_iBodyEffects & MT_PARTICLE_SMOKE) || !g_esInfected[iInfected].g_bSmoke) + { + g_esInfected[iInfected].g_bSmoke = false; + + return Plugin_Stop; + } + + if (g_esGeneral.g_iGraphicsLevel <= 2 && g_esGeneral.g_cvMTGraphicsLevel.IntValue <= 2) + { + return Plugin_Continue; + } + + vAttachParticle(iInfected, PARTICLE_SMOKE, 1.5); + + return Plugin_Continue; +} + Action tTimerSpitEffect(Handle timer, int userid) { int iTank = GetClientOfUserId(userid); - if (!g_esGeneral.g_bPluginEnabled || !bIsInfectedSupported(iTank) || !bHasCoreAdminAccess(iTank) || !bIsInfectedEnabled(iTank) || !(g_esCache[iTank].g_iBodyEffects & MT_PARTICLE_SPIT) || !g_esPlayer[iTank].g_bSpit) + if (!g_esGeneral.g_bPluginEnabled || !bIsSpecialSupported(iTank) || !bHasCoreAdminAccess(iTank) || !bIsInfectedEnabled(iTank) || !(g_esTankCache[iTank].g_iBodyEffects & MT_PARTICLE_SPIT) || !g_esPlayer[iTank].g_bSpit || g_esGeneral.g_bFinaleEnded || g_esGeneral.g_bRoundEnded) { g_esPlayer[iTank].g_bSpit = false; return Plugin_Stop; } - if (bIsInfectedIdle(iTank) || (bIsSpecialInfected(iTank) && !bIsTankVisible(iTank))) + if (bIsInfectedIdle(iTank) || (bIsSpecialInfected(iTank) && !bIsTankVisible(iTank)) || (g_esGeneral.g_iGraphicsLevel <= 2 && g_esGeneral.g_cvMTGraphicsLevel.IntValue <= 2)) { return Plugin_Continue; } @@ -29032,25 +36722,53 @@ Action tTimerSpitEffect(Handle timer, int userid) return Plugin_Continue; } -void tTimerTankCountCheck(Handle timer, DataPack pack) +Action tTimerSpitEffect2(Handle timer, int ref) +{ + int iInfected = EntRefToEntIndex(ref); + if (!bIsValidEntity(iInfected) || g_esGeneral.g_bFinaleEnded || g_esGeneral.g_bRoundEnded) + { + return Plugin_Stop; + } + + if (!g_esGeneral.g_bPluginEnabled || !bIsMobSupported(iInfected) || (!bIsCommonInfected(iInfected) && !bIsWitch(iInfected)) || !(g_esInfectedCache[iInfected].g_iBodyEffects & MT_PARTICLE_SPIT) || !g_esInfected[iInfected].g_bSpit) + { + g_esInfected[iInfected].g_bSpit = false; + + return Plugin_Stop; + } + + if (g_esGeneral.g_iGraphicsLevel <= 2 && g_esGeneral.g_cvMTGraphicsLevel.IntValue <= 2) + { + return Plugin_Continue; + } + + vAttachParticle(iInfected, PARTICLE_SPIT, 2.0, 30.0); + iCreateParticle(iInfected, PARTICLE_SPIT2, NULL_VECTOR, NULL_VECTOR, 0.95, 2.0); + + return Plugin_Continue; +} + +Action tTimerTankCountCheck(Handle timer, DataPack pack) { pack.Reset(); int iTank = GetClientOfUserId(pack.ReadCell()), iAmount = pack.ReadCell(), iCount = iGetTankCount(true), iCount2 = iGetTankCount(false); if (!bIsTank(iTank) || g_esGeneral.g_iRushTypes > 0 || iAmount <= 0 || iCount >= iAmount || iCount2 >= iAmount || (g_esGeneral.g_bNormalMap && g_esGeneral.g_iTankWave <= 0 && g_esGeneral.g_iRegularMode == 1 && g_esGeneral.g_iRegularWave == 1)) { - return; + return Plugin_Stop; } else if (iCount < iAmount && iCount2 < iAmount) { vRegularSpawn(8); } + + return Plugin_Continue; } Action tTimerTankUpdate(Handle timer, int userid) { int iTank = GetClientOfUserId(userid); - if (!g_esGeneral.g_bPluginEnabled || !bIsInfectedSupported(iTank) || !bIsCustomTankSupported(iTank) || bIsPlayerIncapacitated(iTank) || g_esGeneral.g_bFinaleEnded) + if (!g_esGeneral.g_bPluginEnabled || !bIsSpecialSupported(iTank) || !bIsCustomTankSupported(iTank) || bIsPlayerIncapacitated(iTank) || g_esGeneral.g_bFinaleEnded || g_esGeneral.g_bRoundEnded) { return Plugin_Stop; } @@ -29060,7 +36778,7 @@ Action tTimerTankUpdate(Handle timer, int userid) return Plugin_Continue; } - switch (g_esCache[iTank].g_iSpawnType) + switch (g_esTankCache[iTank].g_iSpawnType) { case 1: { @@ -29071,13 +36789,9 @@ Action tTimerTankUpdate(Handle timer, int userid) DataPack dpBoss; CreateDataTimer(0.1, tTimerUpdateBoss, dpBoss, TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); dpBoss.WriteCell(GetClientUserId(iTank)); - dpBoss.WriteCell(g_esCache[iTank].g_iBossStages); - - for (int iPos = 0; iPos < (sizeof esCache::g_iBossHealth); iPos++) - { - dpBoss.WriteCell(g_esCache[iTank].g_iBossHealth[iPos]); - dpBoss.WriteCell(g_esCache[iTank].g_iBossType[iPos]); - } + dpBoss.WriteCell(g_esTankCache[iTank].g_iBossStages); + dpBoss.WriteCellArray(g_esTankCache[iTank].g_iBossHealth, sizeof esTankCache::g_iBossHealth); + dpBoss.WriteCellArray(g_esTankCache[iTank].g_iBossType, sizeof esTankCache::g_iBossType); } } case 2: @@ -29087,7 +36801,7 @@ Action tTimerTankUpdate(Handle timer, int userid) vSpawnModes(iTank, true); DataPack dpRandom; - CreateDataTimer(g_esCache[iTank].g_flRandomInterval, tTimerUpdateRandomize, dpRandom, TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); + CreateDataTimer(g_esTankCache[iTank].g_flRandomInterval, tTimerUpdateRandomize, dpRandom, TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); dpRandom.WriteCell(GetClientUserId(iTank)); dpRandom.WriteFloat(GetGameTime()); } @@ -29097,10 +36811,10 @@ Action tTimerTankUpdate(Handle timer, int userid) if (!g_esPlayer[iTank].g_bTransformed) { vSpawnModes(iTank, true); - CreateTimer(g_esCache[iTank].g_flTransformDelay, tTimerTransform, GetClientUserId(iTank), TIMER_FLAG_NO_MAPCHANGE); + CreateTimer(g_esTankCache[iTank].g_flTransformDelay, tTimerTransform, GetClientUserId(iTank), TIMER_FLAG_NO_MAPCHANGE); DataPack dpUntransform; - CreateDataTimer((g_esCache[iTank].g_flTransformDuration + g_esCache[iTank].g_flTransformDelay), tTimerUntransform, dpUntransform, TIMER_FLAG_NO_MAPCHANGE); + CreateDataTimer((g_esTankCache[iTank].g_flTransformDuration + g_esTankCache[iTank].g_flTransformDelay), tTimerUntransform, dpUntransform, TIMER_FLAG_NO_MAPCHANGE); dpUntransform.WriteCell(GetClientUserId(iTank)); dpUntransform.WriteCell(g_esPlayer[iTank].g_iTankType); } @@ -29117,11 +36831,11 @@ Action tTimerTankUpdate(Handle timer, int userid) return Plugin_Continue; } -void tTimerTankRushUpdate(Handle timer) +Action tTimerTankRushUpdate(Handle timer) { - if (!g_esGeneral.g_bPluginEnabled || g_esGeneral.g_iRushTypes <= 0) + if (!g_esGeneral.g_bPluginEnabled || g_esGeneral.g_iRushTypes <= 0 || g_esGeneral.g_bFinaleEnded || g_esGeneral.g_bRoundEnded) { - return; + return Plugin_Stop; } if (bIsCoopMode() && !g_esGeneral.g_bRushSpawning && !g_esGeneral.g_bRushCooldown && !g_esGeneral.g_bRushCoop && !g_esGeneral.g_bRushEnded) @@ -29303,62 +37017,70 @@ void tTimerTankRushUpdate(Handle timer) } } } + + return Plugin_Continue; } -void tTimerTankWave(Handle timer) +Action tTimerTankWave(Handle timer) { if (g_esGeneral.g_bNormalMap || iGetTankCount(true, true) > 0 || iGetTankCount(false, true) > 0 || !(0 < g_esGeneral.g_iTankWave < 10)) { g_esGeneral.g_hTankWaveTimer = null; - return; + return Plugin_Stop; } g_esGeneral.g_hTankWaveTimer = null; g_esGeneral.g_iTankWave++; + + return Plugin_Continue; } -void tTimerTransform(Handle timer, int userid) +Action tTimerTransform(Handle timer, int userid) { int iTank = GetClientOfUserId(userid); - if (!g_esGeneral.g_bPluginEnabled || !bIsInfectedSupported(iTank) || !bIsCustomTankSupported(iTank) || !bHasCoreAdminAccess(iTank) || !bIsInfectedEnabled(iTank) || !g_esPlayer[iTank].g_bTransformed) + if (!g_esGeneral.g_bPluginEnabled || !bIsSpecialSupported(iTank) || !bIsCustomTankSupported(iTank) || !bHasCoreAdminAccess(iTank) || !bIsInfectedEnabled(iTank) || !g_esPlayer[iTank].g_bTransformed || g_esGeneral.g_bFinaleEnded || g_esGeneral.g_bRoundEnded) { vSpawnModes(iTank, false); - return; + return Plugin_Stop; } if (bIsInfectedIdle(iTank) || (bIsSpecialInfected(iTank) && !bIsTankVisible(iTank))) { - return; + return Plugin_Stop; } - int iPos = MT_GetRandomInt(0, (sizeof esCache::g_iTransformType - 1)); - vSetTankColor(iTank, g_esCache[iTank].g_iTransformType[iPos]); + int iPos = MT_GetRandomInt(0, (sizeof esTankCache::g_iTransformType - 1)); + vSetTankColor(iTank, g_esTankCache[iTank].g_iTransformType[iPos]); vTankSpawn(iTank, 3); + + return Plugin_Continue; } -void tTimerUntransform(Handle timer, DataPack pack) +Action tTimerUntransform(Handle timer, DataPack pack) { pack.Reset(); int iTank = GetClientOfUserId(pack.ReadCell()); - if (!bIsInfectedSupported(iTank) || !bIsInfectedEnabled(iTank)) + if (!bIsSpecialSupported(iTank) || !bIsInfectedEnabled(iTank)) { vSpawnModes(iTank, false); - return; + return Plugin_Stop; } if (bIsInfectedIdle(iTank)) { - return; + return Plugin_Stop; } int iTankType = pack.ReadCell(); vSetTankColor(iTank, iTankType); vTankSpawn(iTank, 4); vSpawnModes(iTank, false); + + return Plugin_Continue; } Action tTimerUpdateBoss(Handle timer, DataPack pack) @@ -29366,7 +37088,7 @@ Action tTimerUpdateBoss(Handle timer, DataPack pack) pack.Reset(); int iTank = GetClientOfUserId(pack.ReadCell()); - if (!g_esGeneral.g_bPluginEnabled || !bIsInfectedSupported(iTank) || !bIsCustomTankSupported(iTank) || !bHasCoreAdminAccess(iTank) || !bIsInfectedEnabled(iTank) || !g_esPlayer[iTank].g_bBoss) + if (!g_esGeneral.g_bPluginEnabled || !bIsSpecialSupported(iTank) || !bIsCustomTankSupported(iTank) || !bHasCoreAdminAccess(iTank) || !bIsInfectedEnabled(iTank) || !g_esPlayer[iTank].g_bBoss || g_esGeneral.g_bFinaleEnded || g_esGeneral.g_bRoundEnded) { vSpawnModes(iTank, false); @@ -29379,14 +37101,11 @@ Action tTimerUpdateBoss(Handle timer, DataPack pack) } int iBossStageCount = g_esPlayer[iTank].g_iBossStageCount, - iBossStages = pack.ReadCell(), iBossHealths[5], iTypes[5]; + iBossStages = pack.ReadCell(), iBossHealthValues[4] = {0, 0, 0, 0}, iTypes[4] = {0, 0, 0, 0}; + pack.ReadCellArray(iBossHealthValues, sizeof iBossHealthValues); + pack.ReadCellArray(iTypes, sizeof iTypes); - iBossHealths[0] = pack.ReadCell(), iTypes[0] = pack.ReadCell(), - iBossHealths[1] = pack.ReadCell(), iTypes[1] = pack.ReadCell(), - iBossHealths[2] = pack.ReadCell(), iTypes[2] = pack.ReadCell(), - iBossHealths[3] = pack.ReadCell(), iTypes[3] = pack.ReadCell(), - iBossHealths[4] = -1, iTypes[4] = 0; - vEvolveBoss(iTank, iBossHealths[iBossStageCount], iBossStages, iTypes[iBossStageCount], (iBossStageCount + 1)); + vEvolveBoss(iTank, iBossHealthValues[iBossStageCount], iBossStages, iTypes[iBossStageCount], (iBossStageCount + 1)); return Plugin_Continue; } @@ -29397,7 +37116,7 @@ Action tTimerUpdateRandomize(Handle timer, DataPack pack) int iTank = GetClientOfUserId(pack.ReadCell()); float flTime = pack.ReadFloat(); - if (!g_esGeneral.g_bPluginEnabled || !bIsInfectedSupported(iTank) || !bIsCustomTankSupported(iTank) || !bHasCoreAdminAccess(iTank) || !bIsInfectedEnabled(iTank) || !g_esPlayer[iTank].g_bRandomized || (flTime + g_esCache[iTank].g_flRandomDuration < GetGameTime())) + if (!g_esGeneral.g_bPluginEnabled || !bIsSpecialSupported(iTank) || !bIsCustomTankSupported(iTank) || !bHasCoreAdminAccess(iTank) || !bIsInfectedEnabled(iTank) || !g_esPlayer[iTank].g_bRandomized || (flTime + g_esTankCache[iTank].g_flRandomDuration < GetGameTime()) || g_esGeneral.g_bFinaleEnded || g_esGeneral.g_bRoundEnded) { vSpawnModes(iTank, false); @@ -29409,7 +37128,7 @@ Action tTimerUpdateRandomize(Handle timer, DataPack pack) return Plugin_Continue; } - int iType = iChooseInfected(iTank, 2, .mutate = false); + int iType = iChooseMutantTank(iTank, 2, .mutate = false); switch (iType) { @@ -29419,5 +37138,28 @@ Action tTimerUpdateRandomize(Handle timer, DataPack pack) vTankSpawn(iTank, 2); + return Plugin_Continue; +} + +Action tTimerUseBioMass(Handle timer, float cost) +{ + if (g_esGeneral.g_bFinaleEnded || g_esGeneral.g_bRoundEnded) + { + return Plugin_Stop; + } + + int iSpecial = iSpawnNearbySpecial(iGetRandomSurvivor(0), g_esMob.g_iCommonFilter, 0, true, false); + if (bIsInfected(iSpecial)) + { + g_esMob.g_flBioMassMeter -= cost; + g_esShooter[iSpecial].g_bProduced = true; + + vCopyBioMassStats(iSpecial); + vRemoveBioMass(); + vResetBioMassTimer(); + + return Plugin_Stop; + } + return Plugin_Continue; } \ No newline at end of file diff --git a/addons/sourcemod/translations/chi/mutant_tanks.phrases.txt b/addons/sourcemod/translations/chi/mutant_tanks.phrases.txt index db41348eef..167026fecc 100644 --- a/addons/sourcemod/translations/chi/mutant_tanks.phrases.txt +++ b/addons/sourcemod/translations/chi/mutant_tanks.phrases.txt @@ -224,6 +224,16 @@ "chi" "突变坦克版本" } + "MTWarnRusher" + { + "chi" "追杀将至,别和你大部队分道扬镳!" + } + + "MTWarnSlacker" + { + "chi" "追杀将至,快跟上你的大部队!" + } + "Ammunition" { "chi" "次数" @@ -251,12 +261,17 @@ "AbilityButtonMode1" { - "chi" "按下按键触发你的能力。" + "chi" "点击按钮来激活你的技能。" } "AbilityButtonMode2" { - "chi" "按住按键触发你的能力。" + "chi" "长按按钮来激活你的技能。" + } + + "AbilityButtonMode3" + { + "chi" "点击按钮来切换你的技能。" } "Buttons" @@ -1004,6 +1019,11 @@ "chi" "坦克" } + "NoNameBill" + { + "chi" "比尔" + } + "NoNameBoomer" { "chi" "胖子" @@ -1014,6 +1034,26 @@ "chi" "牛" } + "NoNameCoach" + { + "chi" "教练" + } + + "NoNameCommon" + { + "chi" "普通" + } + + "NoNameEllis" + { + "chi" "埃里斯" + } + + "NoNameFrancis" + { + "chi" "朗西斯" + } + "NoNameHunter" { "chi" "猎人" @@ -1024,6 +1064,21 @@ "chi" "猴子" } + "NoNameLouis" + { + "chi" "路易斯" + } + + "NoNameNick" + { + "chi" "尼克" + } + + "NoNameRochelle" + { + "chi" "罗雪儿" + } + "NoNameSmoker" { "chi" "烟鬼" @@ -1039,6 +1094,11 @@ "chi" "女巫" } + "NoNameZoey" + { + "chi" "佐伊" + } + "NoNote" { "chi" "找不到该突变坦克的注释文本。" @@ -1295,11 +1355,6 @@ } "RewardLadyKiller" - { - "chi" "{1}{default} 次{mint} 女巫杀手{default} 的使用权" - } - - "RewardLadyKiller2" { "chi" "你的{mint} 女巫杀手{default} 还剩下{yellow} {1}{default} 次可用。" } @@ -1849,61 +1904,11 @@ "chi" "掠弹能力" } - "Blind" - { - "chi" "{olive}{1}{mint} 致盲了{olive} {2}{mint}!" - } - - "Blind2" - { - "chi" "{olive}{1}{mint} 可以看见东西了!" - } - - "BlindAmmo" - { - "chi" "你已经用光了所有 致盲 范围能力次数。" - } - "BlindDetails" { "chi" "你可以致盲幸存者。" } - "BlindHuman" - { - "chi" "你激活了{olive} {1}{mint}/{olive}{2}{mint} 次 致盲 能力!" - } - - "BlindHuman2" - { - "chi" "你的 致盲 能力未能激活, 请重试。" - } - - "BlindHuman3" - { - "chi" "你的 致盲 能力还需要{yellow} {1} 秒{mint}进行充能。" - } - - "BlindHuman4" - { - "chi" "附近没有幸存者可以让你使用 致盲 能力。" - } - - "BlindHuman5" - { - "chi" "你的 致盲 能力已结束, 需要{yellow} {1} 秒{mint}进行充能。" - } - - "BlindMenu" - { - "chi" "致盲能力信息" - } - - "BlindMenu2" - { - "chi" "致盲能力" - } - "Bomb" { "chi" "{olive}{1}{mint} 刚刚在{olive} {2}{mint} 的位置爆炸了!" @@ -2244,6 +2249,11 @@ "chi" "{olive}{1}{mint} 掉落了近战武器!" } + "Drop3" + { + "chi" "{olive}{1}{mint} 给予了幸存者{yellow} 物品{mint}!" + } + "DropDetails" { "chi" "你死亡时掉落武器。" @@ -2251,12 +2261,12 @@ "DropHuman" { - "chi" "你死亡后会掉落武器。" + "chi" "死后你会给予幸存者物品!" } "DropHuman2" { - "chi" "你将在死亡后掉落武器。" + "chi" "你将在死亡后给予幸存者物品。" } "DropMenu" @@ -3139,24 +3149,24 @@ "chi" "你只有特定部位能受到伤害。" } - "HitMenu" + "Hurt" { - "chi" "狙击能力信息" + "chi" "{olive}{1}{mint} 对{olive} {2}{mint} 造成的伤口在不断流血!" } - "HitMenu2" + "Hurt2" { - "chi" "狙击能力" + "chi" "{olive}{1}{mint} 的伤口愈合了!" } - "Hurt" + "Hurt3" { - "chi" "{olive}{1}{mint} 对{olive} {2}{mint} 造成的伤口在不断流血!" + "chi" "{olive}{1}{mint} 鞭挞了{olive} {2}{mint} 好几次!" } - "Hurt2" + "Hurt4" { - "chi" "{olive}{1}{mint} 的伤口愈合了!" + "chi" "{olive}{1}{mint} 逃过了鞭挞!" } "HurtAmmo" @@ -3419,36 +3429,11 @@ "chi" "反向能力" } - "Item" - { - "chi" "{olive}{1}{mint} 给予了幸存者{yellow} 物品{mint}!" - } - "ItemDetails" { "chi" "你死亡后会给予幸存者物品。" } - "ItemHuman" - { - "chi" "死后你会给予幸存者物品!" - } - - "ItemHuman2" - { - "chi" "你将在死亡后给予幸存者物品。" - } - - "ItemMenu" - { - "chi" "赠物能力信息" - } - - "ItemMenu2" - { - "chi" "赠物能力" - } - "Jump" { "chi" "{olive}{1}{mint} 迫使{olive} {2}{mint} 乱跳!" @@ -3534,41 +3519,11 @@ "chi" "跳跃能力" } - "Kamikaze" - { - "chi" "{olive}{1}{mint} 与{olive} {2}{mint} 同归于尽了!" - } - "KamikazeDetails" { "chi" "你会与幸存者同归于尽。" } - "KamikazeHuman" - { - "chi" "你激活了你的 神风 能力!" - } - - "KamikazeHuman2" - { - "chi" "你的 神风 能力未能激活, 请重试。" - } - - "KamikazeHuman3" - { - "chi" "附近没有幸存者可以让你使用 神风 能力。" - } - - "KamikazeMenu" - { - "chi" "神风能力信息" - } - - "KamikazeMenu2" - { - "chi" "神风能力" - } - "Lag" { "chi" "{olive}{1}{mint} 把{olive} {2}{mint} 打出延迟!" @@ -3679,61 +3634,11 @@ "chi" "激光能力" } - "Leech" - { - "chi" "{olive}{1}{mint} 正用{yellow} 水蛭{mint} 汲取{olive} {2}{mint} 的生命值!" - } - - "Leech2" - { - "chi" "{olive}{1}{mint} 的{yellow} 水蛭{mint} 不在汲取{olive} {2}{mint} 的生命值了!" - } - - "LeechAmmo" - { - "chi" "你已经用光了所有 水蛭 范围能力次数。" - } - "LeechDetails" { "chi" "你可以从幸存者身上吸取生命值。" } - "LeechHuman" - { - "chi" "你激活了{olive} {1}{mint}/{olive}{2}{mint} 次 水蛭 能力!" - } - - "LeechHuman2" - { - "chi" "你的 水蛭 能力未能激活, 请重试。" - } - - "LeechHuman3" - { - "chi" "你的 水蛭 能力还需要{yellow} {1} 秒{mint}进行充能。" - } - - "LeechHuman4" - { - "chi" "附近没有幸存者可以让你使用 水蛭 能力。" - } - - "LeechHuman5" - { - "chi" "你的 水蛭 能力已结束, 需要{yellow} {1} 秒{mint}进行充能。" - } - - "LeechMenu" - { - "chi" "水蛭能力信息" - } - - "LeechMenu2" - { - "chi" "水蛭能力" - } - "Lightning" { "chi" "{olive}{1}{mint} 召唤了{yellow} 雷雨{mint}!" @@ -3959,56 +3864,11 @@ "chi" "仆从能力" } - "Necro" - { - "chi" "{olive}{1}{mint} 复活了附近的特殊感染者!" - } - - "NecroAmmo" - { - "chi" "你已经用光了所有 死灵 能力次数。" - } - "NecroDetails" { "chi" "你可以复活附近死亡的特殊感染者。" } - "NecroHuman" - { - "chi" "你激活了{olive} {1}{mint}/{olive}{2}{mint} 次 死灵 能力!" - } - - "NecroHuman2" - { - "chi" "你的 死灵 能力未能激活, 请重试。" - } - - "NecroHuman3" - { - "chi" "你已经激活了你的 死灵 能力。" - } - - "NecroHuman4" - { - "chi" "你的 死灵 能力还需要{yellow} {1} 秒{mint}进行充能。" - } - - "NecroHuman5" - { - "chi" "你的 死灵 能力已结束, 需要{yellow} {1} 秒{mint}进行充能。" - } - - "NecroMenu" - { - "chi" "死灵能力信息" - } - - "NecroMenu2" - { - "chi" "死灵能力" - } - "Nullify" { "chi" "{olive}{1}{mint} 暂时免疫来自{olive} {2}{mint} 的伤害!" @@ -4174,61 +4034,11 @@ "chi" "唤潮能力" } - "Pimp" - { - "chi" "{olive}{1}{mint} 鞭挞了{olive} {2}{mint} 好几次!" - } - - "Pimp2" - { - "chi" "{olive}{1}{mint} 逃过了鞭挞!" - } - - "PimpAmmo" - { - "chi" "你已经用光了所有 鞭挞 范围能力次数。" - } - "PimpDetails" { "chi" "你可以鞭挞幸存者。" } - "PimpHuman" - { - "chi" "你激活了{olive} {1}{mint}/{olive}{2}{mint} 次 鞭挞 能力!" - } - - "PimpHuman2" - { - "chi" "你的 鞭挞 能力未能激活, 请重试。" - } - - "PimpHuman3" - { - "chi" "你的 鞭挞 能力还需要{yellow} {1} 秒{mint}进行充能。" - } - - "PimpHuman4" - { - "chi" "附近没有幸存者可以让你使用 鞭挞 能力。" - } - - "PimpHuman5" - { - "chi" "你的 鞭挞 能力已结束, 需要{yellow} {1} 秒{mint}进行充能。" - } - - "PimpMenu" - { - "chi" "鞭挞能力信息" - } - - "PimpMenu2" - { - "chi" "鞭挞能力" - } - "Puke" { "chi" "{olive}{1}{mint} 吐了{olive} {2}{mint} 一身!" @@ -4539,6 +4349,16 @@ "chi" "{olive}{1}{mint} 停止了恢复生命值!" } + "Regen3" + { + "chi" "{olive}{1}{mint} 从{olive} {2}{mint} 身上偷取了一些生命值!" + } + + "Regen4" + { + "chi" "{olive}{1}{mint} 从{olive} {2}{mint} 身上偷取了一些生命值!" + } + "RegenAmmo" { "chi" "你已经用光了所有 自愈 能力次数。" @@ -4585,11 +4405,21 @@ } "Respawn" + { + "chi" "{olive}{1}{mint} 复活了附近的特殊感染者!" + } + + "Respawn2" { "chi" "{olive}{1}{mint} 复活了!" } "RespawnAmmo" + { + "chi" "你已经用光了所有 死灵 能力次数。" + } + + "RespawnAmmo2" { "chi" "你已经用光了所有 复活 能力次数。" } @@ -4601,42 +4431,67 @@ "RespawnHuman" { - "chi" "你死亡后会重生!" + "chi" "你激活了{olive} {1}{mint}/{olive}{2}{mint} 次 死灵 能力!" } "RespawnHuman2" { - "chi" "你将在死亡后重生。" + "chi" "你的 死灵 能力未能激活, 请重试。" } "RespawnHuman3" { - "chi" "你激活了{olive} {1}{mint}/{olive}{2}{mint} 次 重生!" + "chi" "你已经激活了你的 死灵 能力。" } - "RespawnMenu" + "RespawnHuman4" { - "chi" "重生能力信息" + "chi" "你的 死灵 能力还需要{yellow} {1} 秒{mint}进行充能。" } - "RespawnMenu2" + "RespawnHuman5" { - "chi" "重生能力" + "chi" "你的 死灵 能力已结束, 需要{yellow} {1} 秒{mint}进行充能。" } - "Restart" + "RespawnHuman6" { - "chi" "{olive}{1}{mint} 让{olive} {2}{mint} 用不同的装备重新开始!" + "chi" "你死亡后会重生!" } - "RestartAmmo" + "RespawnHuman7" { - "chi" "你已经用光了所有 重来 范围能力次数。" + "chi" "你将在死亡后重生。" } - "RestartDetails" + "RespawnHuman8" { - "chi" "你可以强制幸存者在地图起始点或队友附近用新的装备重新开始。" + "chi" "你激活了{olive} {1}{mint}/{olive}{2}{mint} 次 重生!" + } + + "RespawnMenu" + { + "chi" "重生能力信息" + } + + "RespawnMenu2" + { + "chi" "重生能力" + } + + "Restart" + { + "chi" "{olive}{1}{mint} 让{olive} {2}{mint} 用不同的装备重新开始!" + } + + "RestartAmmo" + { + "chi" "你已经用光了所有 重来 范围能力次数。" + } + + "RestartDetails" + { + "chi" "你可以强制幸存者在地图起始点或队友附近用新的装备重新开始。" } "RestartHuman" @@ -4676,12 +4531,12 @@ "Rock" { - "chi" "{olive}{1}{mint} 开始召唤{yellow} 岩石雨{mint}!" + "chi" "{olive}{1}{mint} 正在连投岩石!" } "Rock2" { - "chi" "{olive}{1}{mint} 的 岩石雨 结束了!" + "chi" "{olive}{1}{mint} 停止了连投岩石!" } "RockAmmo" @@ -4696,27 +4551,27 @@ "RockHuman" { - "chi" "你激活了{olive} {1}{mint}/{olive}{2}{mint} 次 岩石雨!" + "chi" "你激活了{olive} {1}{mint}/{olive}{2}{mint} 次 岩石连投 能力!" } "RockHuman2" { - "chi" "你的 岩石雨 未能激活, 请重试。" + "chi" "你的 岩石连投 能力未能激活, 请重试。" } "RockHuman3" { - "chi" "你已经激活了你的 岩石雨。" + "chi" "你已经激活了你的 岩石连投 能力。" } "RockHuman4" { - "chi" "你的 岩石雨 还需要{yellow} {1} 秒{mint}进行充能。" + "chi" "你的 岩石连投 能力还需要{yellow} {1} 秒{mint}进行充能。" } "RockHuman5" { - "chi" "你的 岩石雨 能力已结束, 还需要{yellow} {1} 秒{mint}进行充能。" + "chi" "你的 岩石连投 能力已结束, 需要{yellow} {1} 秒{mint}进行充能。" } "RockMenu" @@ -4729,111 +4584,16 @@ "chi" "岩石雨能力" } - "Rocket" - { - "chi" "{olive}{1}{mint} 把{olive} {2}{mint} 送上了太空!" - } - - "RocketAmmo" - { - "chi" "你已经用光了所有 火箭 范围能力次数。" - } - "RocketDetails" { "chi" "你可以把幸存者送上太空。" } - "RocketHuman" - { - "chi" "你激活了{olive} {1}{mint}/{olive}{2}{mint} 次 火箭 能力!" - } - - "RocketHuman2" - { - "chi" "你的 火箭 能力未能激活, 请重试。" - } - - "RocketHuman3" - { - "chi" "你的 火箭 能力还需要{yellow} {1} 秒{mint}进行充能。" - } - - "RocketHuman4" - { - "chi" "附近没有幸存者可以让你使用 火箭 能力。" - } - - "RocketHuman5" - { - "chi" "你的 火箭 能力已结束, 需要{yellow} {1} 秒{mint}进行充能。" - } - - "RocketMenu" - { - "chi" "火箭能力信息" - } - - "RocketMenu2" - { - "chi" "火箭" - } - - "Shake" - { - "chi" "{olive}{1}{mint} 让{olive} {2}{mint} 的屏幕疯狂抖动!" - } - - "Shake2" - { - "chi" "{olive}{1}{mint} 的屏幕停止了抖动!" - } - - "ShakeAmmo" - { - "chi" "你已经用光了所有 震动 范围能力次数。" - } - "ShakeDetails" { "chi" "你可以晃动幸存者屏幕。" } - "ShakeHuman" - { - "chi" "你激活了{olive} {1}{mint}/{olive}{2}{mint} 次 震动 能力!" - } - - "ShakeHuman2" - { - "chi" "你的 震动 能力未能激活, 请重试。" - } - - "ShakeHuman3" - { - "chi" "你的 震动 能力还需要{yellow} {1} 秒{mint}进行充能。" - } - - "ShakeHuman4" - { - "chi" "附近没有幸存者可以让你使用 震动 能力。" - } - - "ShakeHuman5" - { - "chi" "你的 震动 能力已结束, 需要{yellow} {1} 秒{mint}进行充能。" - } - - "ShakeMenu" - { - "chi" "震动能力信息" - } - - "ShakeMenu2" - { - "chi" "震动" - } - "Shield" { "chi" "{olive}{1}{mint} 的护盾{yellow} 已激活{mint}!" @@ -5009,6 +4769,21 @@ "chi" "{olive}{1}{mint} 把{olive} {2}{mint} 砸死了!" } + "Smash2" + { + "chi" "{olive}{1}{mint} 与{olive} {2}{mint} 同归于尽了!" + } + + "Smash3" + { + "chi" "{olive}{1}{mint} 把{olive} {2}{mint} 送上了太空!" + } + + "Smash4" + { + "chi" "{olive}{1}{mint} 重击了{olive} {2}{mint}!" + } + "SmashAmmo" { "chi" "你已经用光了所有 粉碎 范围能力次数。" @@ -5054,221 +4829,21 @@ "chi" "粉碎能力" } - "Smite" - { - "chi" "{olive}{1}{mint} 重击了{olive} {2}{mint}!" - } - - "SmiteAmmo" - { - "chi" "你已经用光了所有 重击 范围能力次数。" - } - "SmiteDetails" { "chi" "你可以重击幸存者。" } - "SmiteHuman" - { - "chi" "你激活了{olive} {1}{mint}/{olive}{2}{mint} 次 重击 能力!" - } - - "SmiteHuman2" - { - "chi" "你的 重击 能力未能激活, 请重试。" - } - - "SmiteHuman3" - { - "chi" "你的 重击 能力还需要{yellow} {1} 秒{mint}进行充能。" - } - - "SmiteHuman4" - { - "chi" "附近没有幸存者可以让你使用 重击 能力。" - } - - "SmiteHuman5" - { - "chi" "你的 重击 能力已结束, 需要{yellow} {1} 秒{mint}进行充能。" - } - - "SmiteMenu" - { - "chi" "重击能力信息" - } - - "SmiteMenu2" - { - "chi" "重击能力" - } - - "Spam" - { - "chi" "{olive}{1}{mint} 正在连投岩石!" - } - - "Spam2" - { - "chi" "{olive}{1}{mint} 停止了连投岩石!" - } - - "SpamAmmo" - { - "chi" "你已经用光了所有 连投 能力次数。" - } - "SpamDetails" { "chi" "你可以对幸存者投掷一堆岩石。" } - "SpamHuman" - { - "chi" "你激活了{olive} {1}{mint}/{olive}{2}{mint} 次 岩石连投 能力!" - } - - "SpamHuman2" - { - "chi" "你的 岩石连投 能力未能激活, 请重试。" - } - - "SpamHuman3" - { - "chi" "你已经激活了你的 岩石连投 能力。" - } - - "SpamHuman4" - { - "chi" "你的 岩石连投 能力还需要{yellow} {1} 秒{mint}进行充能。" - } - - "SpamHuman5" - { - "chi" "你的 岩石连投 能力已结束, 需要{yellow} {1} 秒{mint}进行充能。" - } - - "SpamMenu" - { - "chi" "连投能力信息" - } - - "SpamMenu2" - { - "chi" "连投能力" - } - - "Splash" - { - "chi" "{olive}{1}{mint} 正在对幸存者溅射伤害!" - } - - "Splash2" - { - "chi" "{olive}{1}{mint} 停止了对幸存者溅射伤害!" - } - - "SplashAmmo" - { - "chi" "你已经用光了所有 溅射 能力次数。" - } - - "SplashDetails" - { - "chi" "你可以对附近的幸存者造成溅射伤害。" - } - - "SplashHuman" - { - "chi" "你激活了{olive} {1}{mint}/{olive}{2}{mint} 次 溅射 能力!" - } - - "SplashHuman2" - { - "chi" "你的 溅射 能力未能激活, 请重试。" - } - - "SplashHuman3" - { - "chi" "你已经激活了你的 溅射 能力。" - } - - "SplashHuman4" - { - "chi" "你的 溅射 能力还需要{yellow} {1} 秒{mint}进行充能。" - } - - "SplashHuman5" - { - "chi" "你的 溅射 能力已结束, 需要{yellow} {1} 秒{mint}进行充能。" - } - - "SplashMenu" - { - "chi" "溅射能力信息" - } - - "SplashMenu2" - { - "chi" "溅射能力" - } - - "Splatter" - { - "chi" "{olive}{1}{mint} 的喷溅物正在遮挡{olive} {2}{mint} 的屏幕!" - } - - "Splatter2" - { - "chi" "{olive}{1}{mint} 不再被喷溅物遮挡{mint}!" - } - - "SplatterAmmo" - { - "chi" "你已经用完了所有飞溅能力的弹药。" - } - "SplatterDetails" { "chi" "你可以用喷溅物遮挡幸存者屏幕。" } - "SplatterHuman" - { - "chi" "你激活了{olive} {1}{mint}/{olive}{2}{mint} 的飞溅能力!" - } - - "SplatterHuman2" - { - "chi" "你的飞溅技能无法激活, 请重试。" - } - - "SplatterHuman3" - { - "chi" "你的喷溅能力还需要{yellow} {1} 秒{mint} 进行充能。" - } - - "SplatterHuman4" - { - "chi" "附近没有幸存者可以给你使用喷溅能力。" - } - - "SplatterHuman5" - { - "chi" "你的飞溅能力结束, 需要{yellow} {1} 秒{mint}补充能量。" - } - - "SplatterMenu" - { - "chi" "飞溅能力信息" - } - - "SplatterMenu2" - { - "chi" "飞溅能力" - } - "Throw" { "chi" "{olive}{1}{mint} 扔出了 汽车!" @@ -5494,32 +5069,47 @@ "chi" "不死能力" } - "Vampire" + "VampireDetails" { - "chi" "{olive}{1}{mint} 从{olive} {2}{mint} 偷走了一些生命值!" + "chi" "你可以通过伤害幸存者获得生命值。" } - "VampireDetails" + "Vision" { - "chi" "你可以通过伤害幸存者获得生命值。" + "chi" "{olive}{1}{mint} 致盲了{olive} {2}{mint}!" } - "VampireMenu" + "Vision2" { - "chi" "吸血能力信息" + "chi" "{olive}{1}{mint} 可以看见东西了!" } - "VampireMenu2" + "Vision3" { - "chi" "吸血能力" + "chi" "{olive}{1}{mint} 让{olive} {2}{mint} 的屏幕疯狂抖动!" } - "Vision" + "Vision4" + { + "chi" "{olive}{1}{mint} 的屏幕停止了抖动!" + } + + "Vision5" + { + "chi" "{olive}{1}{mint} 的喷溅物正在遮挡{olive} {2}{mint} 的屏幕!" + } + + "Vision6" + { + "chi" "{olive}{1}{mint} 不再被喷溅物遮挡{mint}!" + } + + "Vision7" { "chi" "{olive}{1}{mint} 让{olive} {2}{mint} 的视觉系数变成了{yellow} {3}{mint}!" } - "Vision2" + "Vision8" { "chi" "{olive}{1}{mint} 让{yellow} {2}{mint} 的视觉系数变回去了!" } @@ -5759,31 +5349,11 @@ "chi" "女巫能力" } - "Xiphos" - { - "chi" "{olive}{1}{mint} 从{olive} {2}{mint} 身上偷取了一些生命值!" - } - - "Xiphos2" - { - "chi" "{olive}{1}{mint} 从{olive} {2}{mint} 身上偷取了一些生命值!" - } - "XiphosDetails" { "chi" "你可以从幸存者身上窃取生命值, 反之亦然。" } - "XiphosMenu" - { - "chi" "双刃剑能力信息" - } - - "XiphosMenu2" - { - "chi" "双刃剑能力" - } - "Yell" { "chi" "{olive}{1}{mint} 对幸存者大喊!" @@ -5839,58 +5409,8 @@ "chi" "战吼能力" } - "Zombie" - { - "chi" "{olive}{1}{mint} 将定期召唤僵尸!" - } - - "Zombie2" - { - "chi" "{olive}{1}{mint} 召唤了{yellow} 僵尸{mint}!" - } - - "ZombieAmmo" - { - "chi" "你已经用光了所有 僵尸 召唤能力次数。" - } - "ZombieDetails" { "chi" "你可以召唤僵尸。" } - - "ZombieHuman" - { - "chi" "你激活了{olive} {1}{mint}/{olive}{2}{mint} 次 召唤僵尸 能力!" - } - - "ZombieHuman2" - { - "chi" "你的 召唤僵尸 能力未能激活, 请重试。" - } - - "ZombieHuman3" - { - "chi" "你已经激活了你的 召唤僵尸 能力。" - } - - "ZombieHuman4" - { - "chi" "你的 召唤僵尸 能力还需要{yellow} {1} 秒{mint}进行充能。" - } - - "ZombieHuman5" - { - "chi" "你的 召唤僵尸 能力已结束, 需要{yellow} {1} 秒{mint}进行充能。" - } - - "ZombieMenu" - { - "chi" "僵尸能力信息" - } - - "ZombieMenu2" - { - "chi" "僵尸能力" - } } \ No newline at end of file diff --git a/addons/sourcemod/translations/chi/mutant_tanks_names.phrases.txt b/addons/sourcemod/translations/chi/mutant_tanks_names.phrases.txt index 7894a12637..73e82efd0f 100644 --- a/addons/sourcemod/translations/chi/mutant_tanks_names.phrases.txt +++ b/addons/sourcemod/translations/chi/mutant_tanks_names.phrases.txt @@ -54,6 +54,11 @@ "chi" "吸收女巫" } + "Common #1 Name" + { + "chi" "吸收普通" + } + "Tank #1" { "chi" "{mint}这个坦克可以吸收大部分伤害。" @@ -94,6 +99,11 @@ "chi" "{mint}这个女巫可以吸收大部分伤害。" } + "Common #1" + { + "chi" "{mint}这个普通可以吸收大部分伤害。" + } + "Tank #2 Name" { "chi" "酸液坦克" @@ -134,6 +144,11 @@ "chi" "酸液女巫" } + "Common #2 Name" + { + "chi" "酸液普通" + } + "Tank #2" { "chi" "{mint}这个坦克可以在幸存者脚下生成酸液地带。" @@ -174,6 +189,11 @@ "chi" "{mint}这个女巫可以在幸存者脚下生成酸液地带。" } + "Common #2" + { + "chi" "{mint}这个普通可以在幸存者脚下生成酸液地带。" + } + "Tank #3 Name" { "chi" "禁瞄坦克" @@ -214,6 +234,11 @@ "chi" "禁瞄女巫" } + "Common #3 Name" + { + "chi" "禁瞄普通" + } + "Tank #3" { "chi" "{mint}这个坦克可以阻止幸存者瞄准。" @@ -254,6 +279,11 @@ "chi" "{mint}这个女巫可以阻止幸存者瞄准。" } + "Common #3" + { + "chi" "{mint}这个普通可以阻止幸存者瞄准。" + } + "Tank #4 Name" { "chi" "掠弹坦克" @@ -294,6 +324,11 @@ "chi" "掠弹女巫" } + "Common #4 Name" + { + "chi" "掠弹普通" + } + "Tank #4" { "chi" "{mint}这个坦克可以偷走你的部分或全部弹药。" @@ -334,6 +369,11 @@ "chi" "{mint}这个女巫可以偷走你的部分或全部弹药。" } + "Common #4" + { + "chi" "{mint}这个普通可以偷走你的部分或全部弹药。" + } + "Tank #5 Name" { "chi" "致盲坦克" @@ -374,6 +414,11 @@ "chi" "致盲女巫" } + "Common #5 Name" + { + "chi" "致盲普通" + } + "Tank #5" { "chi" "{mint}这个坦克可以让你失明。" @@ -414,6 +459,11 @@ "chi" "{mint}这个女巫可以让你失明。" } + "Common #5" + { + "chi" "{mint}这个普通可以让你失明。" + } + "Tank #6 Name" { "chi" "裂爆坦克" @@ -454,6 +504,11 @@ "chi" "裂爆女巫" } + "Common #6 Name" + { + "chi" "裂爆普通" + } + "Tank #6" { "chi" "{mint}这个坦克可以引发爆炸, 同时免疫爆炸伤害。" @@ -494,6 +549,11 @@ "chi" "{mint}这个女巫可以引发爆炸, 同时免疫爆炸伤害。" } + "Common #6" + { + "chi" "{mint}这个普通可以引发爆炸, 同时免疫爆炸伤害。" + } + "Tank #7 Name" { "chi" "胖子坦克" @@ -534,6 +594,11 @@ "chi" "胖子女巫" } + "Common #7 Name" + { + "chi" "胖子普通" + } + "Tank #7" { "chi" "{mint}这个坦克可以生成胖子和向幸存者投掷胖子。" @@ -574,6 +639,11 @@ "chi" "{mint}这个女巫可以生成胖子。" } + "Common #7" + { + "chi" "{mint}这个普通可以生成胖子。" + } + "Tank #8 Name" { "chi" "防弹坦克" @@ -614,6 +684,11 @@ "chi" "防弹女巫" } + "Common #8 Name" + { + "chi" "防弹普通" + } + "Tank #8" { "chi" "{mint}这个坦克免疫子弹伤害。" @@ -654,6 +729,11 @@ "chi" "{mint}这个女巫免疫子弹伤害。" } + "Common #8" + { + "chi" "{mint}这个普通免疫子弹伤害。" + } + "Tank #9 Name" { "chi" "埋葬坦克" @@ -694,6 +774,11 @@ "chi" "埋葬女巫" } + "Common #9 Name" + { + "chi" "埋葬普通" + } + "Tank #9" { "chi" "{mint}这个坦克可以埋葬幸存者。" @@ -734,6 +819,11 @@ "chi" "{mint}这个女巫可以埋葬幸存者。" } + "Common #9" + { + "chi" "{mint}这个普通可以埋葬幸存者。" + } + "Tank #10 Name" { "chi" "投车坦克" @@ -774,6 +864,11 @@ "chi" "投车女巫" } + "Common #10 Name" + { + "chi" "投车普通" + } + "Tank #10" { "chi" "{mint}这个坦克可以向幸存者投掷汽车。 投掷出来的汽车在30秒后消失。" @@ -814,6 +909,11 @@ "chi" "{mint}这个女巫可以召唤汽车雨。 投掷出来的汽车在30秒后消失。" } + "Common #10" + { + "chi" "{mint}这个普通可以召唤汽车雨。 投掷出来的汽车在30秒后消失。" + } + "Tank #11 Name" { "chi" "莽牛坦克" @@ -854,6 +954,11 @@ "chi" "莽牛女巫" } + "Common #11 Name" + { + "chi" "莽牛普通" + } + "Tank #11" { "chi" "{mint}这个坦克可以生成牛和向幸存者投掷牛。" @@ -894,6 +999,11 @@ "chi" "{mint}这个女巫可以生成牛。" } + "Common #11" + { + "chi" "{mint}这个普通可以生成牛。" + } + "Tank #12 Name" { "chi" "窒息坦克" @@ -934,6 +1044,11 @@ "chi" "窒息女巫" } + "Common #12 Name" + { + "chi" "窒息普通" + } + "Tank #12" { "chi" "{mint}这个坦克可以让幸存者窒息。" @@ -974,6 +1089,11 @@ "chi" "{mint}这个女巫可以让幸存者窒息。" } + "Common #12" + { + "chi" "{mint}这个普通可以让幸存者窒息。" + } + "Tank #13 Name" { "chi" "克隆坦克" @@ -1014,6 +1134,11 @@ "chi" "克隆女巫" } + "Common #13 Name" + { + "chi" "克隆普通" + } + "Tank #13" { "chi" "{mint}这个坦克可以生成自己的克隆体和向幸存者投掷坦克。" @@ -1054,6 +1179,11 @@ "chi" "{mint}这个女巫可以生成自己的克隆体。" } + "Common #13" + { + "chi" "{mint}这个普通可以生成自己的克隆体。" + } + "Tank #14 Name" { "chi" "烟雾坦克" @@ -1094,6 +1224,11 @@ "chi" "烟雾女巫" } + "Common #14 Name" + { + "chi" "烟雾普通" + } + "Tank #14" { "chi" "{mint}这个坦克会散播能伤害和困惑幸存者的烟雾。" @@ -1134,6 +1269,11 @@ "chi" "{mint}这个女巫会散播能伤害和困惑幸存者的烟雾。" } + "Common #14" + { + "chi" "{mint}这个普通会散播能伤害和困惑幸存者的烟雾。" + } + "Tank #15 Name" { "chi" "掉物坦克" @@ -1174,6 +1314,11 @@ "chi" "掉物女巫" } + "Common #15 Name" + { + "chi" "掉物普通" + } + "Tank #15" { "chi" "{mint}这个坦克死亡时会掉落随机武器。" @@ -1214,6 +1359,11 @@ "chi" "{mint}这个女巫死亡时会掉落随机武器。" } + "Common #15" + { + "chi" "{mint}这个普通死亡时会掉落随机武器。" + } + "Tank #16 Name" { "chi" "投毒坦克" @@ -1254,6 +1404,11 @@ "chi" "投毒女巫" } + "Common #16 Name" + { + "chi" "投毒普通" + } + "Tank #16" { "chi" "{mint}这个坦克可以对幸存者下毒药。" @@ -1294,6 +1449,11 @@ "chi" "{mint}这个女巫可以对幸存者下毒药。" } + "Common #16" + { + "chi" "{mint}这个普通可以对幸存者下毒药。" + } + "Tank #17 Name" { "chi" "醉酒坦克" @@ -1334,6 +1494,11 @@ "chi" "醉酒女巫" } + "Common #17 Name" + { + "chi" "醉酒普通" + } + "Tank #17" { "chi" "{mint}这个坦克可以让幸存者喝醉酒。" @@ -1374,6 +1539,11 @@ "chi" "{mint}这个女巫可以让幸存者喝醉酒。" } + "Common #17" + { + "chi" "{mint}这个普通可以让幸存者喝醉酒。" + } + "Tank #18 Name" { "chi" "电击坦克" @@ -1414,6 +1584,11 @@ "chi" "电击女巫" } + "Common #18 Name" + { + "chi" "电击普通" + } + "Tank #18" { "chi" "{mint}这个坦克可以电击幸存者。" @@ -1454,6 +1629,11 @@ "chi" "{mint}这个女巫可以电击幸存者。" } + "Common #18" + { + "chi" "{mint}这个普通可以电击幸存者。" + } + "Tank #19 Name" { "chi" "强迫坦克" @@ -1494,6 +1674,11 @@ "chi" "强迫女巫" } + "Common #19 Name" + { + "chi" "强迫普通" + } + "Tank #19" { "chi" "{mint}这个坦克可以强迫幸存者在一定时间内只能使用特定的武器槽。" @@ -1534,6 +1719,11 @@ "chi" "{mint}这个女巫可以强迫幸存者在一定时间内只能使用特定的武器槽。" } + "Common #19" + { + "chi" "{mint}这个普通可以强迫幸存者在一定时间内只能使用特定的武器槽。" + } + "Tank #20 Name" { "chi" "闪速坦克" @@ -1574,6 +1764,11 @@ "chi" "闪速女巫" } + "Common #20 Name" + { + "chi" "闪速普通" + } + "Tank #20" { "chi" "{mint}这个坦克可以跑的跟闪电一样快。" @@ -1614,6 +1809,11 @@ "chi" "{mint}这个女巫可以跑的跟闪电一样快。" } + "Common #20" + { + "chi" "{mint}这个普通可以跑的跟闪电一样快。" + } + "Tank #21 Name" { "chi" "防火坦克" @@ -1654,6 +1854,11 @@ "chi" "防火女巫" } + "Common #21 Name" + { + "chi" "防火普通" + } + "Tank #21" { "chi" "{mint}这个坦克可以引发火灾而且免疫火焰伤害。" @@ -1694,6 +1899,11 @@ "chi" "{mint}这个女巫可以引发火灾而且免疫火焰伤害。" } + "Common #21" + { + "chi" "{mint}这个普通可以引发火灾而且免疫火焰伤害。" + } + "Tank #22 Name" { "chi" "投空坦克" @@ -1734,6 +1944,11 @@ "chi" "投空女巫" } + "Common #22 Name" + { + "chi" "投空普通" + } + "Tank #22" { "chi" "{mint}这个坦克可以把幸存者抛向半空。" @@ -1774,6 +1989,11 @@ "chi" "{mint}这个女巫可以把幸存者抛向半空。" } + "Common #22" + { + "chi" "{mint}这个普通可以把幸存者抛向半空。" + } + "Tank #23 Name" { "chi" "飞行坦克" @@ -1814,6 +2034,11 @@ "chi" "飞行女巫" } + "Common #23 Name" + { + "chi" "飞行普通" + } + "Tank #23" { "chi" "{mint}这个坦克四处寻找受害者。" @@ -1854,6 +2079,11 @@ "chi" "{mint}这个女巫四处寻找受害者。" } + "Common #23" + { + "chi" "{mint}这个普通四处寻找受害者。" + } + "Tank #24 Name" { "chi" "脆弱坦克" @@ -1894,6 +2124,11 @@ "chi" "脆弱女巫" } + "Common #24 Name" + { + "chi" "脆弱普通" + } + "Tank #24" { "chi" "{mint}这个坦克在受到更多伤害的同时, 移动速度变快且对幸存者造成的伤害也更高。" @@ -1934,6 +2169,11 @@ "chi" "{mint}这个女巫在受到更多伤害的同时, 移动速度变快且对幸存者造成的伤害也更高。" } + "Common #24" + { + "chi" "{mint}这个普通在受到更多伤害的同时, 移动速度变快且对幸存者造成的伤害也更高。" + } + "Tank #25 Name" { "chi" "幽灵坦克" @@ -1974,6 +2214,11 @@ "chi" "幽灵女巫" } + "Common #25 Name" + { + "chi" "幽灵普通" + } + "Tank #25" { "chi" "{mint}这个坦克可以让自己隐身和让幸存者缴械。" @@ -2014,6 +2259,11 @@ "chi" "{mint}这个女巫可以让自己隐身和让幸存者缴械。" } + "Common #25" + { + "chi" "{mint}这个普通可以让自己隐身和让幸存者缴械。" + } + "Tank #26 Name" { "chi" "虔诚坦克" @@ -2054,6 +2304,11 @@ "chi" "虔诚女巫" } + "Common #26 Name" + { + "chi" "虔诚普通" + } + "Tank #26" { "chi" "{mint}这个坦克可以获得暂时性的无敌。" @@ -2094,6 +2349,11 @@ "chi" "{mint}这个女巫可以获得暂时性的无敌。" } + "Common #26" + { + "chi" "{mint}这个普通可以获得暂时性的无敌。" + } + "Tank #27 Name" { "chi" "重力坦克" @@ -2134,6 +2394,11 @@ "chi" "重力女巫" } + "Common #27 Name" + { + "chi" "重力普通" + } + "Tank #27" { "chi" "{mint}这个坦克可以把附近的幸存者和感染者拉向他的脚下, 同时降低幸存者的重力值。" @@ -2174,6 +2439,11 @@ "chi" "{mint}这个女巫可以把附近的幸存者和感染者拉向他的脚下, 同时降低幸存者的重力值。" } + "Common #27" + { + "chi" "{mint}这个普通可以把附近的幸存者和感染者拉向他的脚下, 同时降低幸存者的重力值。" + } + "Tank #28 Name" { "chi" "炮手坦克" @@ -2214,6 +2484,11 @@ "chi" "炮手女巫" } + "Common #28 Name" + { + "chi" "炮手普通" + } + "Tank #28" { "chi" "{mint}此坦克会用枪械武装自己并对幸存者开枪。" @@ -2254,6 +2529,11 @@ "chi" "{mint}此女巫会用枪械武装自己并对幸存者开枪。" } + "Common #28" + { + "chi" "{mint}此普通会用枪械武装自己并对幸存者开枪。" + } + "Tank #29 Name" { "chi" "败血坦克" @@ -2294,6 +2574,11 @@ "chi" "败血女巫" } + "Common #29 Name" + { + "chi" "败血普通" + } + "Tank #29" { "chi" "{mint}这个坦克可以让幸存者的生命变成临时生命值, 并且可以吸收附近特殊感染者的生命值。" @@ -2334,6 +2619,11 @@ "chi" "{mint}这个女巫可以让幸存者的生命变成临时生命值, 并且可以吸收附近特殊感染者的生命值。" } + "Common #29" + { + "chi" "{mint}这个普通可以让幸存者的生命变成临时生命值, 并且可以吸收附近特殊感染者的生命值。" + } + "Tank #30 Name" { "chi" "弱点坦克" @@ -2374,6 +2664,11 @@ "chi" "弱点女巫" } + "Common #30 Name" + { + "chi" "弱点普通" + } + "Tank #30" { "chi" "{mint}这个坦克只能射击头部造成伤害。" @@ -2414,6 +2709,11 @@ "chi" "{mint}这个女巫只能射击头部造成伤害。" } + "Common #30" + { + "chi" "{mint}这个普通只能射击头部造成伤害。" + } + "Tank #31 Name" { "chi" "猎人坦克" @@ -2454,6 +2754,11 @@ "chi" "猎人女巫" } + "Common #31 Name" + { + "chi" "猎人普通" + } + "Tank #31" { "chi" "{mint}这个坦克可以生成猎人和向幸存者投掷猎人。" @@ -2494,6 +2799,11 @@ "chi" "{mint}这个女巫可以生成猎人。" } + "Common #31" + { + "chi" "{mint}这个普通可以生成猎人。" + } + "Tank #32 Name" { "chi" "悲伤坦克" @@ -2534,6 +2844,11 @@ "chi" "悲伤女巫" } + "Common #32 Name" + { + "chi" "悲伤普通" + } + "Tank #32" { "chi" "{mint}这个坦克可以持续伤害幸存者一段时间。" @@ -2574,6 +2889,11 @@ "chi" "{mint}这个女巫可以持续伤害幸存者一段时间。" } + "Common #32" + { + "chi" "{mint}这个普通可以持续伤害幸存者一段时间。" + } + "Tank #33 Name" { "chi" "催眠坦克" @@ -2614,6 +2934,11 @@ "chi" "催眠女巫" } + "Common #33 Name" + { + "chi" "催眠普通" + } + "Tank #33" { "chi" "{mint}这个坦克可以催眠幸存者让其自残或伤害他的队友。" @@ -2654,6 +2979,11 @@ "chi" "{mint}这个女巫可以催眠幸存者让其自残或伤害他的队友。" } + "Common #33" + { + "chi" "{mint}这个普通可以催眠幸存者让其自残或伤害他的队友。" + } + "Tank #34 Name" { "chi" "冻结坦克" @@ -2694,6 +3024,11 @@ "chi" "冻结女巫" } + "Common #34 Name" + { + "chi" "冻结普通" + } + "Tank #34" { "chi" "{mint}这个坦克可以冻结幸存者。" @@ -2734,6 +3069,11 @@ "chi" "{mint}这个女巫可以冻结幸存者。" } + "Common #34" + { + "chi" "{mint}这个普通可以冻结幸存者。" + } + "Tank #35 Name" { "chi" "闲置坦克" @@ -2774,6 +3114,11 @@ "chi" "闲置女巫" } + "Common #35 Name" + { + "chi" "闲置普通" + } + "Tank #35" { "chi" "{mint}这个坦克可以让幸存者进入闲置模式。 (这对Bot无效。)" @@ -2814,6 +3159,11 @@ "chi" "{mint}这个女巫可以让幸存者进入闲置模式。 (这对Bot无效。)" } + "Common #35" + { + "chi" "{mint}这个普通可以让幸存者进入闲置模式。 (这对Bot无效。)" + } + "Tank #36 Name" { "chi" "反向坦克" @@ -2854,6 +3204,11 @@ "chi" "反向女巫" } + "Common #36 Name" + { + "chi" "反向普通" + } + "Tank #36" { "chi" "{mint}这个坦克可以反转幸存者的方向键。" @@ -2894,6 +3249,11 @@ "chi" "{mint}这个女巫可以反转幸存者的方向键。" } + "Common #36" + { + "chi" "{mint}这个普通可以反转幸存者的方向键。" + } + "Tank #37 Name" { "chi" "载物坦克" @@ -2934,6 +3294,11 @@ "chi" "载物女巫" } + "Common #37 Name" + { + "chi" "载物普通" + } + "Tank #37" { "chi" "{mint}这个坦克在死亡时会给予幸存者道具。" @@ -2974,6 +3339,11 @@ "chi" "{mint}这个女巫在死亡时会给予幸存者道具。" } + "Common #37" + { + "chi" "{mint}这个普通在死亡时会给予幸存者道具。" + } + "Tank #38 Name" { "chi" "猴子坦克" @@ -3014,6 +3384,11 @@ "chi" "猴子女巫" } + "Common #38 Name" + { + "chi" "猴子普通" + } + "Tank #38" { "chi" "{mint}这个坦克可以生成猴子和向幸存者投掷猴子。" @@ -3054,6 +3429,11 @@ "chi" "{mint}这个女巫可以生成猴子。" } + "Common #38" + { + "chi" "{mint}这个普通可以生成猴子。" + } + "Tank #39 Name" { "chi" "跳跃坦克" @@ -3094,6 +3474,11 @@ "chi" "跳跃女巫" } + "Common #39 Name" + { + "chi" "跳跃普通" + } + "Tank #39" { "chi" "{mint}这个坦克会进行周期性的跳跃和让幸存者无法自控地跳跃。" @@ -3134,6 +3519,11 @@ "chi" "{mint}这个女巫会进行周期性的跳跃和让幸存者无法自控地跳跃。" } + "Common #39" + { + "chi" "{mint}这个普通会进行周期性的跳跃和让幸存者无法自控地跳跃。" + } + "Tank #40 Name" { "chi" "神风坦克" @@ -3174,6 +3564,11 @@ "chi" "神风女巫" } + "Common #40 Name" + { + "chi" "神风普通" + } + "Tank #40" { "chi" "{mint}这个坦克会和幸存者同归于尽。" @@ -3214,6 +3609,11 @@ "chi" "{mint}这个女巫会和幸存者同归于尽。" } + "Common #40" + { + "chi" "{mint}这个普通会和幸存者同归于尽。" + } + "Tank #41 Name" { "chi" "滞后坦克" @@ -3254,6 +3654,11 @@ "chi" "滞后女巫" } + "Common #41 Name" + { + "chi" "滞后普通" + } + "Tank #41" { "chi" "{mint}这个坦克会让幸存者产生滞后感。" @@ -3294,6 +3699,11 @@ "chi" "{mint}这个女巫会让幸存者产生滞后感。" } + "Common #41" + { + "chi" "{mint}这个普通会让幸存者产生滞后感。" + } + "Tank #42 Name" { "chi" "激光坦克" @@ -3334,6 +3744,11 @@ "chi" "激光女巫" } + "Common #42 Name" + { + "chi" "激光普通" + } + "Tank #42" { "chi" "{mint}这个坦克会对幸存者发射激光。" @@ -3374,6 +3789,11 @@ "chi" "{mint}这个女巫会对幸存者发射激光。" } + "Common #42" + { + "chi" "{mint}这个普通会对幸存者发射激光。" + } + "Tank #43 Name" { "chi" "水蛭坦克" @@ -3414,6 +3834,11 @@ "chi" "水蛭女巫" } + "Common #43 Name" + { + "chi" "水蛭普通" + } + "Tank #43" { "chi" "{mint}这个坦克可以从幸存者身上汲取生命。" @@ -3454,7 +3879,12 @@ "chi" "{mint}这个女巫可以从幸存者身上汲取生命。" } - "Tank #44 Name" + "Common #43" + { + "chi" "{mint}这个普通可以从幸存者身上汲取生命。" + } + + "Tank #44 Name" { "chi" "雷暴坦克" } @@ -3494,6 +3924,11 @@ "chi" "雷暴女巫" } + "Common #44 Name" + { + "chi" "雷暴普通" + } + "Tank #44" { "chi" "{mint}这个坦克制造了闪电风暴。" @@ -3534,6 +3969,11 @@ "chi" "{mint}这个女巫制造了闪电风暴。" } + "Common #44" + { + "chi" "{mint}这个普通制造了闪电风暴。" + } + "Tank #45 Name" { "chi" "军医坦克" @@ -3574,6 +4014,11 @@ "chi" "军医女巫" } + "Common #45 Name" + { + "chi" "军医普通" + } + "Tank #45" { "chi" "{mint}这个坦克死亡后会治愈附近的特殊感染者。" @@ -3614,6 +4059,11 @@ "chi" "{mint}这个女巫死亡后会治愈附近的特殊感染者。" } + "Common #45" + { + "chi" "{mint}这个普通死亡后会治愈附近的特殊感染者。" + } + "Tank #46 Name" { "chi" "流星坦克" @@ -3654,6 +4104,11 @@ "chi" "流星女巫" } + "Common #46 Name" + { + "chi" "流星普通" + } + "Tank #46" { "chi" "{mint}这个坦克可以召唤带火焰和爆炸效果的流星雨, 会持续好几秒。" @@ -3694,6 +4149,11 @@ "chi" "{mint}这个女巫可以召唤带火焰和爆炸效果的流星雨, 会持续好几秒。" } + "Common #46" + { + "chi" "{mint}这个普通可以召唤带火焰和爆炸效果的流星雨, 会持续好几秒。" + } + "Tank #47 Name" { "chi" "死灵坦克" @@ -3734,6 +4194,11 @@ "chi" "死灵女巫" } + "Common #47 Name" + { + "chi" "死灵普通" + } + "Tank #47" { "chi" "{mint}这个坦克可以复活死亡的的特殊感染者。" @@ -3774,6 +4239,11 @@ "chi" "{mint}这个女巫可以复活死亡的的特殊感染者。" } + "Common #47" + { + "chi" "{mint}这个普通可以复活死亡的的特殊感染者。" + } + "Tank #48 Name" { "chi" "免疫坦克" @@ -3814,6 +4284,11 @@ "chi" "免疫女巫" } + "Common #48 Name" + { + "chi" "免疫普通" + } + "Tank #48" { "chi" "{mint}这个坦克可以抵消幸存者造成的伤害。" @@ -3854,6 +4329,11 @@ "chi" "{mint}这个女巫可以抵消幸存者造成的伤害。" } + "Common #48" + { + "chi" "{mint}这个普通可以抵消幸存者造成的伤害。" + } + "Tank #49 Name" { "chi" "全能坦克" @@ -3894,6 +4374,11 @@ "chi" "全能女巫" } + "Common #49 Name" + { + "chi" "全能普通" + } + "Tank #49" { "chi" "{mint}这个坦克可以使用附近突变坦克的能力。" @@ -3934,6 +4419,11 @@ "chi" "{mint}这个女巫可以使用附近突变女巫的能力。" } + "Common #49" + { + "chi" "{mint}这个普通可以使用附近突变女巫的能力。" + } + "Tank #50 Name" { "chi" "尸潮坦克" @@ -3974,6 +4464,11 @@ "chi" "尸潮女巫" } + "Common #50 Name" + { + "chi" "尸潮普通" + } + "Tank #50" { "chi" "{mint}这个坦克可以召唤尸潮。" @@ -4014,6 +4509,11 @@ "chi" "{mint}这个女巫可以召唤尸潮。" } + "Common #50" + { + "chi" "{mint}这个普通可以召唤尸潮。" + } + "Tank #51 Name" { "chi" "拥抱坦克" @@ -4054,6 +4554,11 @@ "chi" "拥抱女巫" } + "Common #51 Name" + { + "chi" "拥抱普通" + } + "Tank #51" { "chi" "{mint}这个坦克忠于幸存者, 喜欢拥抱。" @@ -4094,6 +4599,11 @@ "chi" "{mint}这个女巫忠于幸存者, 喜欢拥抱。" } + "Common #51" + { + "chi" "{mint}这个普通忠于幸存者, 喜欢拥抱。" + } + "Tank #52 Name" { "chi" "鞭挞坦克" @@ -4134,6 +4644,11 @@ "chi" "鞭挞女巫" } + "Common #52 Name" + { + "chi" "鞭挞普通" + } + "Tank #52" { "chi" "{mint}这个坦克可以鞭挞幸存者, 让幸存者知道谁才是老大。" @@ -4174,6 +4689,11 @@ "chi" "{mint}这个女巫可以鞭挞幸存者, 让幸存者知道谁才是老大。" } + "Common #52" + { + "chi" "{mint}这个普通可以鞭挞幸存者, 让幸存者知道谁才是老大。" + } + "Tank #53 Name" { "chi" "白金坦克" @@ -4214,6 +4734,11 @@ "chi" "白金女巫" } + "Common #53 Name" + { + "chi" "白金普通" + } + "Tank #53" { "chi" "{mint}这个坦克免疫近战伤害。" @@ -4254,6 +4779,11 @@ "chi" "{mint}这个女巫免疫近战伤害。" } + "Common #53" + { + "chi" "{mint}这个普通免疫近战伤害。" + } + "Tank #54 Name" { "chi" "呕吐坦克" @@ -4294,6 +4824,11 @@ "chi" "呕吐女巫" } + "Common #54 Name" + { + "chi" "呕吐普通" + } + "Tank #54" { "chi" "{mint}这个坦克会对幸存者呕吐。" @@ -4334,6 +4869,11 @@ "chi" "{mint}这个女巫会对幸存者呕吐。" } + "Common #54" + { + "chi" "{mint}这个普通会对幸存者呕吐。" + } + "Tank #55 Name" { "chi" "烈火坦克" @@ -4374,6 +4914,11 @@ "chi" "烈火女巫" } + "Common #55 Name" + { + "chi" "烈火普通" + } + "Tank #55" { "chi" "{mint}这个坦克被点燃时会提高移动速度。" @@ -4414,6 +4959,11 @@ "chi" "{mint}这个女巫被点燃时会提高移动速度。" } + "Common #55" + { + "chi" "{mint}这个普通被点燃时会提高移动速度。" + } + "Tank #56 Name" { "chi" "沉默坦克" @@ -4454,6 +5004,11 @@ "chi" "沉默女巫" } + "Common #56 Name" + { + "chi" "沉默普通" + } + "Tank #56" { "chi" "{mint}这个坦克可以在幸存者附近消无声息。" @@ -4494,6 +5049,11 @@ "chi" "{mint}这个女巫可以在幸存者附近消无声息。" } + "Common #56" + { + "chi" "{mint}这个普通可以在幸存者附近消无声息。" + } + "Tank #57 Name" { "chi" "回溯坦克" @@ -4534,6 +5094,11 @@ "chi" "回溯女巫" } + "Common #57 Name" + { + "chi" "回溯普通" + } + "Tank #57" { "chi" "{mint}这个坦克会使用时间能力穿越时空, 特别让幸存者烦恼。" @@ -4574,6 +5139,11 @@ "chi" "{mint}这个女巫会使用时间能力穿越时空, 特别让幸存者烦恼。" } + "Common #57" + { + "chi" "{mint}这个普通会使用时间能力穿越时空, 特别让幸存者烦恼。" + } + "Tank #58 Name" { "chi" "冲击坦克" @@ -4614,6 +5184,11 @@ "chi" "冲击女巫" } + "Common #58 Name" + { + "chi" "冲击普通" + } + "Tank #58" { "chi" "{mint}这个坦克会给予幸存者巨大的后坐力。" @@ -4654,6 +5229,11 @@ "chi" "{mint}这个女巫会给予幸存者巨大的后坐力。" } + "Common #58" + { + "chi" "{mint}这个普通会给予幸存者巨大的后坐力。" + } + "Tank #59 Name" { "chi" "渐愈坦克" @@ -4694,6 +5274,11 @@ "chi" "渐愈女巫" } + "Common #59 Name" + { + "chi" "渐愈普通" + } + "Tank #59" { "chi" "{mint}这个坦克会每秒持续恢复生命值。" @@ -4734,6 +5319,11 @@ "chi" "{mint}这个女巫会每秒持续恢复生命值。" } + "Common #59" + { + "chi" "{mint}这个普通会每秒持续恢复生命值。" + } + "Tank #60 Name" { "chi" "重生坦克" @@ -4774,6 +5364,11 @@ "chi" "重生女巫" } + "Common #60 Name" + { + "chi" "重生普通" + } + "Tank #60" { "chi" "{mint}这个坦克死亡后会复活。" @@ -4814,6 +5409,11 @@ "chi" "{mint}这个女巫死亡后会复活。" } + "Common #60" + { + "chi" "{mint}这个普通死亡后会复活。" + } + "Tank #61 Name" { "chi" "轮回坦克" @@ -4854,6 +5454,11 @@ "chi" "轮回女巫" } + "Common #61 Name" + { + "chi" "轮回普通" + } + "Tank #61" { "chi" "{mint}这个坦克能让幸存者用新的装备套件重新开始。" @@ -4894,6 +5499,11 @@ "chi" "{mint}这个女巫能让幸存者用新的装备套件重新开始。" } + "Common #61" + { + "chi" "{mint}这个普通能让幸存者用新的装备套件重新开始。" + } + "Tank #62 Name" { "chi" "岩石坦克" @@ -4934,6 +5544,11 @@ "chi" "岩石女巫" } + "Common #62 Name" + { + "chi" "岩石普通" + } + "Tank #62" { "chi" "{mint}这个坦克可以召唤岩石雨。" @@ -4974,6 +5589,11 @@ "chi" "{mint}这个女巫可以召唤岩石雨。" } + "Common #62" + { + "chi" "{mint}这个普通可以召唤岩石雨。" + } + "Tank #63 Name" { "chi" "火箭坦克" @@ -5014,6 +5634,11 @@ "chi" "火箭女巫" } + "Common #63 Name" + { + "chi" "火箭普通" + } + "Tank #63" { "chi" "{mint}这个坦克可以把幸存者送上太空。" @@ -5054,6 +5679,11 @@ "chi" "{mint}这个女巫可以把幸存者送上太空。" } + "Common #63" + { + "chi" "{mint}这个普通可以把幸存者送上太空。" + } + "Tank #64 Name" { "chi" "投手坦克" @@ -5094,6 +5724,11 @@ "chi" "投手女巫" } + "Common #64 Name" + { + "chi" "投手普通" + } + "Tank #64" { "chi" "{mint}这个坦克会对幸存者投掷随机的物品。" @@ -5134,6 +5769,11 @@ "chi" "{mint}这个女巫会对幸存者投掷随机的物品。" } + "Common #64" + { + "chi" "{mint}这个普通会对幸存者投掷随机的物品。" + } + "Tank #65 Name" { "chi" "撼动坦克" @@ -5174,6 +5814,11 @@ "chi" "撼动女巫" } + "Common #65 Name" + { + "chi" "撼动普通" + } + "Tank #65" { "chi" "{mint}这个坦克可以震动幸存者的屏幕。" @@ -5214,6 +5859,11 @@ "chi" "{mint}这个女巫可以震动幸存者的屏幕。" } + "Common #65" + { + "chi" "{mint}这个普通可以震动幸存者的屏幕。" + } + "Tank #66 Name" { "chi" "护盾坦克" @@ -5254,6 +5904,11 @@ "chi" "护盾女巫" } + "Common #66 Name" + { + "chi" "护盾普通" + } + "Tank #66" { "chi" "{mint}这个坦克出生时会被护盾保护, 投掷的石头会变成煤气瓶或汽油桶, 幸存者可以用他们打破盾牌。" @@ -5294,6 +5949,11 @@ "chi" "{mint}这个女巫出生时会被护盾保护。" } + "Common #66" + { + "chi" "{mint}这个普通出生时会被护盾保护。" + } + "Tank #67 Name" { "chi" "推挤坦克" @@ -5334,6 +5994,11 @@ "chi" "推挤女巫" } + "Common #67 Name" + { + "chi" "推挤普通" + } + "Tank #67" { "chi" "{mint}这个坦克可以把幸存者推到附近。" @@ -5374,6 +6039,11 @@ "chi" "{mint}这个女巫可以把幸存者推到附近。" } + "Common #67" + { + "chi" "{mint}这个普通可以把幸存者推到附近。" + } + "Tank #68 Name" { "chi" "缓速坦克" @@ -5414,6 +6084,11 @@ "chi" "缓速女巫" } + "Common #68 Name" + { + "chi" "缓速普通" + } + "Tank #68" { "chi" "{mint}这个坦克可以减慢幸存者的速度。" @@ -5454,6 +6129,11 @@ "chi" "{mint}这个女巫可以减慢幸存者的速度。" } + "Common #68" + { + "chi" "{mint}这个普通可以减慢幸存者的速度。" + } + "Tank #69 Name" { "chi" "粉碎坦克" @@ -5494,6 +6174,11 @@ "chi" "粉碎女巫" } + "Common #69 Name" + { + "chi" "粉碎普通" + } + "Tank #69" { "chi" "{mint}这个坦克可以砸死幸存者。" @@ -5534,6 +6219,11 @@ "chi" "{mint}这个女巫可以砸死幸存者。" } + "Common #69" + { + "chi" "{mint}这个普通可以砸死幸存者。" + } + "Tank #70 Name" { "chi" "重击坦克" @@ -5574,6 +6264,11 @@ "chi" "重击女巫" } + "Common #70 Name" + { + "chi" "重击普通" + } + "Tank #70" { "chi" "{mint}这个坦克击倒幸存者会直接杀死。" @@ -5614,6 +6309,11 @@ "chi" "{mint}这个女巫击倒幸存者会直接杀死。" } + "Common #70" + { + "chi" "{mint}这个普通击倒幸存者会直接杀死。" + } + "Tank #71 Name" { "chi" "烟鬼坦克" @@ -5654,6 +6354,11 @@ "chi" "烟鬼女巫" } + "Common #71 Name" + { + "chi" "烟鬼普通" + } + "Tank #71" { "chi" "{mint}这个坦克可以生成烟鬼和向幸存者投掷烟鬼。" @@ -5694,6 +6399,11 @@ "chi" "{mint}这个女巫可以生成烟鬼。" } + "Common #71" + { + "chi" "{mint}这个普通可以生成烟鬼。" + } + "Tank #72 Name" { "chi" "投石坦克" @@ -5734,6 +6444,11 @@ "chi" "投石女巫" } + "Common #72 Name" + { + "chi" "投石普通" + } + "Tank #72" { "chi" "{mint}这个坦克可以对幸存者投掷一堆岩石。" @@ -5774,6 +6489,11 @@ "chi" "{mint}这个女巫可以对幸存者投掷一堆岩石。" } + "Common #72" + { + "chi" "{mint}这个普通可以对幸存者投掷一堆岩石。" + } + "Tank #73 Name" { "chi" "特种坦克" @@ -5814,6 +6534,11 @@ "chi" "特种女巫" } + "Common #73 Name" + { + "chi" "特种普通" + } + "Tank #73" { "chi" "{mint}这个坦克可以生成特殊感染者和向幸存者投掷特殊感染者。" @@ -5854,6 +6579,11 @@ "chi" "{mint}这个女巫可以生成特殊感染者。" } + "Common #73" + { + "chi" "{mint}这个普通可以生成特殊感染者。" + } + "Tank #74 Name" { "chi" "口水坦克" @@ -5894,6 +6624,11 @@ "chi" "口水女巫" } + "Common #74 Name" + { + "chi" "口水普通" + } + "Tank #74" { "chi" "{mint}这个坦克可以生成口水和向幸存者投掷口水。" @@ -5934,6 +6669,11 @@ "chi" "{mint}这个女巫可以生成口水。" } + "Common #74" + { + "chi" "{mint}这个普通可以生成口水。" + } + "Tank #75 Name" { "chi" "溅射坦克" @@ -5974,6 +6714,11 @@ "chi" "溅射女巫" } + "Common #75 Name" + { + "chi" "溅射普通" + } + "Tank #75" { "chi" "{mint}这个坦克可以让一定范围内的幸存者受到伤害。" @@ -6014,6 +6759,11 @@ "chi" "{mint}这个女巫可以让一定范围内的幸存者受到伤害。" } + "Common #75" + { + "chi" "{mint}这个普通可以让一定范围内的幸存者受到伤害。" + } + "Tank #76 Name" { "chi" "飞溅坦克" @@ -6054,6 +6804,11 @@ "chi" "飞溅女巫" } + "Common #76 Name" + { + "chi" "飞溅普通" + } + "Tank #76" { "chi" "{mint}该坦克可以用飞溅覆盖每个人的屏幕。" @@ -6094,6 +6849,11 @@ "chi" "{mint}该女巫可以用飞溅覆盖每个人的屏幕。" } + "Common #76" + { + "chi" "{mint}该普通可以用飞溅覆盖每个人的屏幕。" + } + "Tank #77 Name" { "chi" "投掷坦克" @@ -6134,44 +6894,54 @@ "chi" "投掷女巫" } + "Common #77 Name" + { + "chi" "投掷普通" + } + "Tank #77" { - "chi" "{mint}这个坦克可以投掷汽车/特殊感染者/坦克/女巫, 甚至它自己!" + "chi" "{mint}这个坦克可以投掷汽车/特殊感染者/坦克/女巫, 甚至它自己!" } "Boomer #77" { - "chi" "{mint}这个胖子可以投掷汽车/特殊感染者/坦克/女巫, 甚至它自己!" + "chi" "{mint}这个胖子可以投掷汽车/特殊感染者/坦克/女巫, 甚至它自己!" } "Charger #77" { - "chi" "{mint}这个牛可以投掷汽车/特殊感染者/坦克/女巫, 甚至它自己!" + "chi" "{mint}这个牛可以投掷汽车/特殊感染者/坦克/女巫, 甚至它自己!" } "Hunter #77" { - "chi" "{mint}这个猎人可以投掷汽车/特殊感染者/坦克/女巫, 甚至它自己!" + "chi" "{mint}这个猎人可以投掷汽车/特殊感染者/坦克/女巫, 甚至它自己!" } "Jockey #77" { - "chi" "{mint}这个猴子可以投掷汽车/特殊感染者/坦克/女巫, 甚至它自己!" + "chi" "{mint}这个猴子可以投掷汽车/特殊感染者/坦克/女巫, 甚至它自己!" } "Smoker #77" { - "chi" "{mint}这个烟鬼可以投掷汽车/特殊感染者/坦克/女巫, 甚至它自己!" + "chi" "{mint}这个烟鬼可以投掷汽车/特殊感染者/坦克/女巫, 甚至它自己!" } "Spitter #77" { - "chi" "{mint}这个口水可以投掷汽车/特殊感染者/坦克/女巫, 甚至它自己!" + "chi" "{mint}这个口水可以投掷汽车/特殊感染者/坦克/女巫, 甚至它自己!" } "Witch #77" { - "chi" "{mint}这个女巫可以投掷汽车/特殊感染者/坦克/女巫, 甚至它自己!" + "chi" "{mint}这个女巫可以投掷汽车/特殊感染者/坦克/女巫, 甚至它自己!" + } + + "Common #77" + { + "chi" "{mint}这个普通可以投掷汽车/特殊感染者/坦克/女巫, 甚至它自己!" } "Tank #78 Name" @@ -6214,6 +6984,11 @@ "chi" "追踪女巫" } + "Common #78 Name" + { + "chi" "追踪普通" + } + "Tank #78" { "chi" "{mint}这个坦克投掷的岩石会追踪附近的幸存者。" @@ -6254,6 +7029,11 @@ "chi" "{mint}这个女巫投掷的岩石会追踪附近的幸存者。" } + "Common #78" + { + "chi" "{mint}这个普通投掷的岩石会追踪附近的幸存者。" + } + "Tank #79 Name" { "chi" "终极坦克" @@ -6294,6 +7074,11 @@ "chi" "终极女巫" } + "Common #79 Name" + { + "chi" "终极普通" + } + "Tank #79" { "chi" "{mint}这个坦克在生命值过低时会获得暂时性的无敌和伤害提升。" @@ -6334,6 +7119,11 @@ "chi" "{mint}这个女巫在生命值过低时会获得暂时性的无敌和伤害提升。" } + "Common #79" + { + "chi" "{mint}这个普通在生命值过低时会获得暂时性的无敌和伤害提升。" + } + "Tank #80 Name" { "chi" "亡灵坦克" @@ -6374,6 +7164,11 @@ "chi" "亡灵女巫" } + "Common #80 Name" + { + "chi" "亡灵普通" + } + "Tank #80" { "chi" "{mint}这个坦克在濒临死亡时会回满生命值。" @@ -6414,6 +7209,11 @@ "chi" "{mint}这个女巫在濒临死亡时会回满生命值。" } + "Common #80" + { + "chi" "{mint}这个普通在濒临死亡时会回满生命值。" + } + "Tank #81 Name" { "chi" "吸血坦克" @@ -6454,6 +7254,11 @@ "chi" "吸血女巫" } + "Common #81 Name" + { + "chi" "吸血普通" + } + "Tank #81" { "chi" "{mint}这个坦克可以窃取幸存者生命值。" @@ -6494,6 +7299,11 @@ "chi" "{mint}这个女巫可以窃取幸存者生命值。" } + "Common #81" + { + "chi" "{mint}这个普通可以窃取幸存者生命值。" + } + "Tank #82 Name" { "chi" "视觉坦克" @@ -6534,6 +7344,11 @@ "chi" "视觉女巫" } + "Common #82 Name" + { + "chi" "视觉普通" + } + "Tank #82" { "chi" "{mint}这个坦克可以改变幸存者的视野。" @@ -6574,6 +7389,11 @@ "chi" "{mint}这个女巫可以改变幸存者的视野。" } + "Common #82" + { + "chi" "{mint}这个普通可以改变幸存者的视野。" + } + "Tank #83 Name" { "chi" "变形坦克" @@ -6614,6 +7434,11 @@ "chi" "变形女巫" } + "Common #83 Name" + { + "chi" "变形普通" + } + "Tank #83" { "chi" "{mint}这个坦克会传送到随机一名幸存者身上。" @@ -6654,6 +7479,11 @@ "chi" "{mint}这个女巫会传送到随机一名幸存者身上。" } + "Common #83" + { + "chi" "{mint}这个普通会传送到随机一名幸存者身上。" + } + "Tank #84 Name" { "chi" "旋风坦克" @@ -6694,6 +7524,11 @@ "chi" "旋风女巫" } + "Common #84 Name" + { + "chi" "旋风普通" + } + "Tank #84" { "chi" "{mint}这个坦克可以把幸存者翻转。" @@ -6734,6 +7569,11 @@ "chi" "{mint}这个女巫可以把幸存者翻转。" } + "Common #84" + { + "chi" "{mint}这个普通可以把幸存者翻转。" + } + "Tank #85 Name" { "chi" "女巫坦克" @@ -6774,6 +7614,11 @@ "chi" "女巫女巫" } + "Common #85 Name" + { + "chi" "女巫普通" + } + "Tank #85" { "chi" "{mint}这个坦克可以把附近的普通感染者转化成女巫并向幸存者投掷女巫。" @@ -6814,6 +7659,11 @@ "chi" "{mint}这个女巫可以把附近的普通感染者转化成女巫并向幸存者投掷女巫。" } + "Common #85" + { + "chi" "{mint}这个普通可以把附近的普通感染者转化成女巫并向幸存者投掷女巫。" + } + "Tank #86 Name" { "chi" "换血坦克" @@ -6854,6 +7704,11 @@ "chi" "换血女巫" } + "Common #86 Name" + { + "chi" "换血普通" + } + "Tank #86" { "chi" "{mint}这个坦克可以窃取幸存者生命值, 反之亦然。" @@ -6894,6 +7749,11 @@ "chi" "{mint}这个女巫可以窃取幸存者生命值, 反之亦然。" } + "Common #86" + { + "chi" "{mint}这个普通可以窃取幸存者生命值, 反之亦然。" + } + "Tank #87 Name" { "chi" "狂吼坦克" @@ -6934,6 +7794,11 @@ "chi" "狂吼女巫" } + "Common #87 Name" + { + "chi" "狂吼普通" + } + "Tank #87" { "chi" "{mint}这个坦克可以大吼来震慑幸存者。" @@ -6974,6 +7839,11 @@ "chi" "{mint}这个女巫可以大吼来震慑幸存者。" } + "Common #87" + { + "chi" "{mint}这个普通可以大吼来震慑幸存者。" + } + "Tank #88 Name" { "chi" "僵尸坦克" @@ -7014,6 +7884,11 @@ "chi" "僵尸女巫" } + "Common #88 Name" + { + "chi" "僵尸普通" + } + "Tank #88" { "chi" "{mint}这个坦克可以在某个区域内召唤僵尸。" @@ -7054,6 +7929,11 @@ "chi" "{mint}这个女巫可以在某个区域内召唤僵尸。" } + "Common #88" + { + "chi" "{mint}这个普通可以在某个区域内召唤僵尸。" + } + "Tank #89 Name" { "chi" "决战坦克" @@ -7094,6 +7974,11 @@ "chi" "决战女巫" } + "Common #89 Name" + { + "chi" "决战普通" + } + "Tank #89" { "chi" "{mint}这个坦克免疫爆炸伤害, 可以把幸存者和特殊感染者拉向它身边。 并且可以召唤流星雨。" @@ -7134,6 +8019,11 @@ "chi" "{mint}这个女巫免疫爆炸伤害, 可以把幸存者和特殊感染者拉向它身边。 并且可以召唤流星雨。" } + "Common #89" + { + "chi" "{mint}这个普通免疫爆炸伤害, 可以把幸存者和特殊感染者拉向它身边。 并且可以召唤流星雨。" + } + "Tank #90 Name" { "chi" "精英坦克" @@ -7174,6 +8064,11 @@ "chi" "精英女巫" } + "Common #90 Name" + { + "chi" "精英普通" + } + "Tank #90" { "chi" "{mint}对火免疫, 跑得快, 伪装自己, 让幸存者缴械, 把幸存者拉向它身边同时改变他们的重力, 周期性跳跃和召唤流星雨, 出生自带护盾, 会重击幸存者, 会传送到幸存者身边并生成女巫/僵尸。" @@ -7214,6 +8109,11 @@ "chi" "{mint}对火免疫, 跑得快, 伪装自己, 让幸存者缴械, 把幸存者拉向它身边同时改变他们的重力, 周期性跳跃和召唤流星雨, 出生自带护盾, 会重击幸存者, 会传送到幸存者身边并生成女巫/僵尸。" } + "Common #90" + { + "chi" "{mint}对火免疫, 跑得快, 伪装自己, 让幸存者缴械, 把幸存者拉向它身边同时改变他们的重力, 周期性跳跃和召唤流星雨, 出生自带护盾, 会重击幸存者, 会传送到幸存者身边并生成女巫/僵尸。" + } + "Tank #91 Name" { "chi" "钴金坦克" @@ -7254,6 +8154,11 @@ "chi" "钴金女巫" } + "Common #91 Name" + { + "chi" "钴金普通" + } + "Tank #91" { "chi" "{mint}这个坦克免疫火焰伤害同时跑得很快。" @@ -7294,6 +8199,11 @@ "chi" "{mint}这个女巫免疫火焰伤害同时跑得很快。" } + "Common #91" + { + "chi" "{mint}这个普通免疫火焰伤害同时跑得很快。" + } + "Tank #92 Name" { "chi" "牵引坦克" @@ -7334,6 +8244,11 @@ "chi" "牵引女巫" } + "Common #92 Name" + { + "chi" "牵引普通" + } + "Tank #92" { "chi" "{mint}这个坦克会周期性的跳跃, 让幸存者不受控制的跳跃并且会传送到幸存者身边。" @@ -7374,6 +8289,11 @@ "chi" "{mint}这个女巫会周期性的跳跃, 让幸存者不受控制的跳跃并且会传送到幸存者身边。" } + "Common #92" + { + "chi" "{mint}这个普通会周期性的跳跃, 让幸存者不受控制的跳跃并且会传送到幸存者身边。" + } + "Tank #93 Name" { "chi" "抗拒坦克" @@ -7414,6 +8334,11 @@ "chi" "抗拒女巫" } + "Common #93 Name" + { + "chi" "抗拒普通" + } + "Tank #93" { "chi" "{mint}这个坦克会一直推开幸存者。" @@ -7454,6 +8379,11 @@ "chi" "{mint}这个女巫会一直推开幸存者。" } + "Common #93" + { + "chi" "{mint}这个普通会一直推开幸存者。" + } + "Tank #94 Name" { "chi" "闪光坦克" @@ -7494,6 +8424,11 @@ "chi" "闪光女巫" } + "Common #94 Name" + { + "chi" "闪光普通" + } + "Tank #94" { "chi" "{mint}这个坦克的运行速度非常快,可以向生还者投掷闪电,并可以减慢其周围的时间,而这一切都是暂时的。" @@ -7534,6 +8469,11 @@ "chi" "{mint}这个女巫的运行速度非常快,可并可以减慢其周围的时间,而这一切都是暂时的。" } + "Common #94" + { + "chi" "{mint}这个普通的运行速度非常快,可并可以减慢其周围的时间,而这一切都是暂时的。" + } + "Tank #95 Name" { "chi" "巨人坦克" @@ -7574,6 +8514,11 @@ "chi" "巨人女巫" } + "Common #95 Name" + { + "chi" "巨人普通" + } + "Tank #95" { "chi" "{mint}免疫火焰伤害, 移动速度慢, 会给予幸存者临时生命值, 吸收附近特殊感染者的生命值, 出生自带护盾和重击幸存者。" @@ -7614,6 +8559,11 @@ "chi" "{mint}免疫火焰伤害, 移动速度慢, 会给予幸存者临时生命值, 吸收附近特殊感染者的生命值, 出生自带护盾和重击幸存者。" } + "Common #95" + { + "chi" "{mint}免疫火焰伤害, 移动速度慢, 会给予幸存者临时生命值, 吸收附近特殊感染者的生命值, 出生自带护盾和重击幸存者。" + } + "Tank #96 Name" { "chi" "幻觉坦克" @@ -7654,6 +8604,11 @@ "chi" "幻觉女巫" } + "Common #96 Name" + { + "chi" "幻觉普通" + } + "Tank #96" { "chi" "{mint}免疫火焰伤害, 伪装自己且会传送到幸存者身边。" @@ -7694,6 +8649,11 @@ "chi" "{mint}免疫火焰伤害, 伪装自己且会传送到幸存者身边。" } + "Common #96" + { + "chi" "{mint}免疫火焰伤害, 伪装自己且会传送到幸存者身边。" + } + "Tank #97 Name" { "chi" "米姆坦克" @@ -7734,6 +8694,11 @@ "chi" "米姆女巫" } + "Common #97 Name" + { + "chi" "米姆普通" + } + "Tank #97" { "chi" "{mint}免疫火焰伤害, 吸收伤害, 跑得快, 伪装自己, 将幸存者拉向自己并改变他们重力值, 跳得高, 召唤流星雨, 重击幸存者, 投掷一堆岩石, 会传送到幸存者身边和召唤女巫/僵尸。" @@ -7774,6 +8739,11 @@ "chi" "{mint}免疫火焰伤害, 吸收伤害, 跑得快, 伪装自己, 将幸存者拉向自己并改变他们重力值, 跳得高, 召唤流星雨, 重击幸存者, 投掷一堆岩石, 会传送到幸存者身边和召唤女巫/僵尸。" } + "Common #97" + { + "chi" "{mint}免疫火焰伤害, 吸收伤害, 跑得快, 伪装自己, 将幸存者拉向自己并改变他们重力值, 跳得高, 召唤流星雨, 重击幸存者, 投掷一堆岩石, 会传送到幸存者身边和召唤女巫/僵尸。" + } + "Tank #98 Name" { "chi" "幻影坦克" @@ -7814,6 +8784,11 @@ "chi" "幻影女巫" } + "Common #98 Name" + { + "chi" "幻影普通" + } + "Tank #98" { "chi" "{mint}这个坦克免疫火焰伤害, 跑得快并可以传送到幸存者身边。" @@ -7854,6 +8829,11 @@ "chi" "{mint}这个女巫免疫火焰伤害, 跑得快并可以传送到幸存者身边。" } + "Common #98" + { + "chi" "{mint}这个普通免疫火焰伤害, 跑得快并可以传送到幸存者身边。" + } + "Tank #99 Name" { "chi" "恶作剧坦克" @@ -7894,6 +8874,11 @@ "chi" "恶作剧女巫" } + "Common #99 Name" + { + "chi" "恶作剧普通" + } + "Tank #99" { "chi" "{mint}这个坦克免疫火焰伤害, 跑得快, 伪装自己并可以传送到幸存者身边。" @@ -7934,6 +8919,11 @@ "chi" "{mint}这个女巫免疫火焰伤害, 跑得快, 伪装自己并可以传送到幸存者身边。" } + "Common #99" + { + "chi" "{mint}这个普通免疫火焰伤害, 跑得快, 伪装自己并可以传送到幸存者身边。" + } + "Tank #100 Name" { "chi" "精神病坦克" @@ -7974,6 +8964,11 @@ "chi" "精神病女巫" } + "Common #100 Name" + { + "chi" "精神病普通" + } + "Tank #100" { "chi" "{mint}该坦克可以为幸存者提供暂时的健康状况,吸收附近感染者的生命,开始流星雨,产下盾牌,并向幸存者弯曲。" @@ -8014,6 +9009,11 @@ "chi" "{mint}该女巫可以为幸存者提供暂时的健康状况,吸收附近感染者的生命,开始流星雨,产下盾牌,并向幸存者弯曲。" } + "Common #100" + { + "chi" "{mint}该普通可以为幸存者提供暂时的健康状况,吸收附近感染者的生命,开始流星雨,产下盾牌,并向幸存者弯曲。" + } + "Tank #101 Name" { "chi" "反闪坦克" @@ -8054,6 +9054,11 @@ "chi" "反闪女巫" } + "Common #101 Name" + { + "chi" "反闪普通" + } + "Tank #101" { "chi" "{mint}这个坦克免疫火焰伤害, 跑得快, 并且可以传送到幸存者身边。" @@ -8094,6 +9099,11 @@ "chi" "{mint}这个女巫免疫火焰伤害, 跑得快, 并且可以传送到幸存者身边。" } + "Common #101" + { + "chi" "{mint}这个普通免疫火焰伤害, 跑得快, 并且可以传送到幸存者身边。" + } + "Tank #102 Name" { "chi" "召唤坦克" @@ -8134,6 +9144,11 @@ "chi" "召唤女巫" } + "Common #102 Name" + { + "chi" "召唤普通" + } + "Tank #102" { "chi" "{mint}这个坦克会在烟雾内生成僵尸。" @@ -8174,6 +9189,11 @@ "chi" "{mint}这个女巫会在烟雾内生成僵尸。" } + "Common #102" + { + "chi" "{mint}这个普通会在烟雾内生成僵尸。" + } + "Tank #103 Name" { "chi" "变焦坦克" @@ -8214,6 +9234,11 @@ "chi" "变焦女巫" } + "Common #103 Name" + { + "chi" "变焦普通" + } + "Tank #103" { "chi" "{mint}这个坦克免疫火焰伤害, 跑得快, 并且会传送到幸存者身边。" @@ -8254,6 +9279,11 @@ "chi" "{mint}这个女巫免疫火焰伤害, 跑得快, 并且会传送到幸存者身边。" } + "Common #103" + { + "chi" "{mint}这个普通免疫火焰伤害, 跑得快, 并且会传送到幸存者身边。" + } + "Tank #104 Name" { "chi" "陷阱坦克" @@ -8294,6 +9324,11 @@ "chi" "陷阱女巫" } + "Common #104 Name" + { + "chi" "陷阱普通" + } + "Tank #104" { "chi" "{mint}这看上去不像坦克?" @@ -8334,6 +9369,11 @@ "chi" "{mint}这看上去不像女巫?" } + "Common #104" + { + "chi" "{mint}这看上去不像普通?" + } + "Tank #105 Name" { "chi" "恐惧坦克" @@ -8374,6 +9414,11 @@ "chi" "恐惧女巫" } + "Common #105 Name" + { + "chi" "恐惧普通" + } + "Tank #105" { "chi" "{mint}该坦克可以使幸存者部分失明。" @@ -8414,6 +9459,11 @@ "chi" "{mint}该女巫可以使幸存者部分失明。" } + "Common #105" + { + "chi" "{mint}该普通可以使幸存者部分失明。" + } + "Tank #106 Name" { "chi" "狂暴坦克" @@ -8454,6 +9504,11 @@ "chi" "狂暴女巫" } + "Common #106 Name" + { + "chi" "狂暴普通" + } + "Tank #106" { "chi" "{mint}这个坦克可以让幸存者中毒和受到持续伤害。" @@ -8494,6 +9549,11 @@ "chi" "{mint}这个女巫可以让幸存者中毒和受到持续伤害。" } + "Common #106" + { + "chi" "{mint}这个普通可以让幸存者中毒和受到持续伤害。" + } + "Tank #107 Name" { "chi" "震荡坦克" @@ -8534,6 +9594,11 @@ "chi" "震荡女巫" } + "Common #107 Name" + { + "chi" "震荡普通" + } + "Tank #107" { "chi" "{mint}该坦克可以向生还者投掷石块。" @@ -8574,6 +9639,11 @@ "chi" "{mint}该女巫可以向生还者投掷石块。" } + "Common #107" + { + "chi" "{mint}该普通可以向生还者投掷石块。" + } + "Tank #108 Name" { "chi" "Psyk0tik 坦克" @@ -8614,6 +9684,11 @@ "chi" "Psyk0tik 女巫" } + "Common #108 Name" + { + "chi" "Psyk0tik 普通" + } + "Tank #108" { "chi" "{mint}这个坦克会造成额外的伤害,并且在掩盖自身并减慢幸存者的速度时会非常快地运行。" @@ -8654,6 +9729,11 @@ "chi" "{mint}这个女巫会造成额外的伤害,并且在掩盖自身并减慢幸存者的速度时会非常快地运行。" } + "Common #108" + { + "chi" "{mint}这个普通会造成额外的伤害,并且在掩盖自身并减慢幸存者的速度时会非常快地运行。" + } + "Tank #109 Name" { "chi" "末日坦克" @@ -8694,6 +9774,11 @@ "chi" "末日女巫" } + "Common #109 Name" + { + "chi" "末日普通" + } + "Tank #109" { "chi" "{mint}这个坦克免疫火焰伤害, 跑得快, 会召唤流星雨/尸潮和岩石雨" @@ -8734,6 +9819,11 @@ "chi" "{mint}这个女巫免疫火焰伤害, 跑得快, 会召唤流星雨/尸潮和岩石雨" } + "Common #109" + { + "chi" "{mint}这个普通免疫火焰伤害, 跑得快, 会召唤流星雨/尸潮和岩石雨" + } + "Tank #110 Name" { "chi" "达斯·维达 坦克" @@ -8774,44 +9864,54 @@ "chi" "达斯·维达 女巫" } + "Common #110 Name" + { + "chi" "达斯·维达 普通" + } + "Tank #110" { - "chi" "{mint}是。。。 是达斯·维达。。。 它是帝国的突变坦克!" + "chi" "{mint}是。。。 是达斯·维达。。。 它是帝国的突变坦克!" } "Boomer #110" { - "chi" "{mint}是。。。 是达斯·维达。。。 它是帝国的突变胖子!" + "chi" "{mint}是。。。 是达斯·维达。。。 它是帝国的突变胖子!" } "Charger #110" { - "chi" "{mint}是。。。 是达斯·维达。。。 它是帝国的突变牛!" + "chi" "{mint}是。。。 是达斯·维达。。。 它是帝国的突变牛!" } "Hunter #110" { - "chi" "{mint}是。。。 是达斯·维达。。。 它是帝国的突变猎人!" + "chi" "{mint}是。。。 是达斯·维达。。。 它是帝国的突变猎人!" } "Jockey #110" { - "chi" "{mint}是。。。 是达斯·维达。。。 它是帝国的突变猴子!" + "chi" "{mint}是。。。 是达斯·维达。。。 它是帝国的突变猴子!" } "Smoker #110" { - "chi" "{mint}是。。。 是达斯·维达。。。 它是帝国的突变烟鬼!" + "chi" "{mint}是。。。 是达斯·维达。。。 它是帝国的突变烟鬼!" } "Spitter #110" { - "chi" "{mint}是。。。 是达斯·维达。。。 它是帝国的突变口水!" + "chi" "{mint}是。。。 是达斯·维达。。。 它是帝国的突变口水!" } "Witch #110" { - "chi" "{mint}是。。。 是达斯·维达。。。 它是帝国的突变女巫!" + "chi" "{mint}是。。。 是达斯·维达。。。 它是帝国的突变女巫!" + } + + "Common #110" + { + "chi" "{mint}是。。。 是达斯·维达。。。 它是帝国的突变普通!" } "Tank #111 Name" @@ -8854,6 +9954,11 @@ "chi" "吸毒女巫" } + "Common #111 Name" + { + "chi" "吸毒普通" + } + "Tank #111" { "chi" "{mint}这个坦克具有传染性上瘾。" @@ -8894,6 +9999,11 @@ "chi" "{mint}这个女巫具有传染性上瘾。" } + "Common #111" + { + "chi" "{mint}这个普通具有传染性上瘾。" + } + "Tank #112 Name" { "chi" "神行坦克" @@ -8934,6 +10044,11 @@ "chi" "神行女巫" } + "Common #112 Name" + { + "chi" "神行普通" + } + "Tank #112" { "chi" "{mint}此坦克免疫火炎伤害,跑的快同时还会向幸存者方向传送。" @@ -8974,6 +10089,11 @@ "chi" "{mint}此女巫免疫火炎伤害,跑的快同时还会向幸存者方向传送。" } + "Common #112" + { + "chi" "{mint}此普通免疫火炎伤害,跑的快同时还会向幸存者方向传送。" + } + "Tank #113 Name" { "chi" "死神坦克" @@ -9014,6 +10134,11 @@ "chi" "死神女巫" } + "Common #113 Name" + { + "chi" "死神普通" + } + "Tank #113" { "chi" "{mint}这个坦克跑的比一般的快, 会伪装自己, 可以埋葬幸存者和传送到幸存者身边。" @@ -9054,6 +10179,11 @@ "chi" "{mint}这个女巫跑的比一般的快, 会伪装自己, 可以埋葬幸存者和传送到幸存者身边。" } + "Common #113" + { + "chi" "{mint}这个普通跑的比一般的快, 会伪装自己, 可以埋葬幸存者和传送到幸存者身边。" + } + "Tank #114 Name" { "chi" "部落坦克" @@ -9094,6 +10224,11 @@ "chi" "部落女巫" } + "Common #114 Name" + { + "chi" "部落普通" + } + "Tank #114" { "chi" "{mint}这个坦克可以引发恐慌事件,还可以对幸存者进行呕吐以延长生存时间。" @@ -9134,6 +10269,11 @@ "chi" "{mint}这个女巫可以引发恐慌事件,还可以对幸存者进行呕吐以延长生存时间。" } + "Common #114" + { + "chi" "{mint}这个普通可以引发恐慌事件,还可以对幸存者进行呕吐以延长生存时间。" + } + "Tank #115 Name" { "chi" "绿巨人坦克" @@ -9174,44 +10314,54 @@ "chi" "绿巨人女巫" } + "Common #115 Name" + { + "chi" "绿巨人普通" + } + "Tank #115" { - "chi" "{mint}遇到难以置信的绿巨人!这个坦克拥有绿巨人的大部分能力!" + "chi" "{mint}遇到难以置信的绿巨人!这个坦克拥有绿巨人的大部分能力!" } "Boomer #115" { - "chi" "{mint}遇到难以置信的绿巨人!这个胖子拥有绿巨人的大部分能力!" + "chi" "{mint}遇到难以置信的绿巨人!这个胖子拥有绿巨人的大部分能力!" } "Charger #115" { - "chi" "{mint}遇到难以置信的绿巨人!这个牛拥有绿巨人的大部分能力!" + "chi" "{mint}遇到难以置信的绿巨人!这个牛拥有绿巨人的大部分能力!" } "Hunter #115" { - "chi" "{mint}遇到难以置信的绿巨人!这个猎人拥有绿巨人的大部分能力!" + "chi" "{mint}遇到难以置信的绿巨人!这个猎人拥有绿巨人的大部分能力!" } "Jockey #115" { - "chi" "{mint}遇到难以置信的绿巨人!这个猴子拥有绿巨人的大部分能力!" + "chi" "{mint}遇到难以置信的绿巨人!这个猴子拥有绿巨人的大部分能力!" } "Smoker #115" { - "chi" "{mint}遇到难以置信的绿巨人!这个烟鬼拥有绿巨人的大部分能力!" + "chi" "{mint}遇到难以置信的绿巨人!这个烟鬼拥有绿巨人的大部分能力!" } "Spitter #115" { - "chi" "{mint}遇到难以置信的绿巨人!这个口水拥有绿巨人的大部分能力!" + "chi" "{mint}遇到难以置信的绿巨人!这个口水拥有绿巨人的大部分能力!" } "Witch #115" { - "chi" "{mint}遇到难以置信的绿巨人!这个女巫拥有绿巨人的大部分能力!" + "chi" "{mint}遇到难以置信的绿巨人!这个女巫拥有绿巨人的大部分能力!" + } + + "Common #115" + { + "chi" "{mint}遇到难以置信的绿巨人!这个普通拥有绿巨人的大部分能力!" } "Tank #116 Name" @@ -9254,44 +10404,54 @@ "chi" "忍者女巫" } + "Common #116 Name" + { + "chi" "忍者普通" + } + "Tank #116" { - "chi" "{mint}这个坦克可以瞬移, 消无声息的移动和伪装自己。 需要特别小心!" + "chi" "{mint}这个坦克可以瞬移, 消无声息的移动和伪装自己。 需要特别小心!" } "Boomer #116" { - "chi" "{mint}这个胖子可以瞬移, 消无声息的移动和伪装自己。 需要特别小心!" + "chi" "{mint}这个胖子可以瞬移, 消无声息的移动和伪装自己。 需要特别小心!" } "Charger #116" { - "chi" "{mint}这个牛可以瞬移, 消无声息的移动和伪装自己。 需要特别小心!" + "chi" "{mint}这个牛可以瞬移, 消无声息的移动和伪装自己。 需要特别小心!" } "Hunter #116" { - "chi" "{mint}这个猎人可以瞬移, 消无声息的移动和伪装自己。 需要特别小心!" + "chi" "{mint}这个猎人可以瞬移, 消无声息的移动和伪装自己。 需要特别小心!" } "Jockey #116" { - "chi" "{mint}这个猴子可以瞬移, 消无声息的移动和伪装自己。 需要特别小心!" + "chi" "{mint}这个猴子可以瞬移, 消无声息的移动和伪装自己。 需要特别小心!" } "Smoker #116" { - "chi" "{mint}这个烟鬼可以瞬移, 消无声息的移动和伪装自己。 需要特别小心!" + "chi" "{mint}这个烟鬼可以瞬移, 消无声息的移动和伪装自己。 需要特别小心!" } "Spitter #116" { - "chi" "{mint}这个口水可以瞬移, 消无声息的移动和伪装自己。 需要特别小心!" + "chi" "{mint}这个口水可以瞬移, 消无声息的移动和伪装自己。 需要特别小心!" } "Witch #116" { - "chi" "{mint}这个女巫可以瞬移, 消无声息的移动和伪装自己。 需要特别小心!" + "chi" "{mint}这个女巫可以瞬移, 消无声息的移动和伪装自己。 需要特别小心!" + } + + "Common #116" + { + "chi" "{mint}这个普通可以瞬移, 消无声息的移动和伪装自己。 需要特别小心!" } "Tank #117 Name" @@ -9334,6 +10494,11 @@ "chi" "冥思女巫" } + "Common #117 Name" + { + "chi" "冥思普通" + } + "Tank #117" { "chi" "{mint}这个坦克沉迷冥思, 根本对你毫无兴趣。" @@ -9374,6 +10539,11 @@ "chi" "{mint}这个女巫沉迷冥思, 根本对你毫无兴趣。" } + "Common #117" + { + "chi" "{mint}这个普通沉迷冥思, 根本对你毫无兴趣。" + } + "Tank #118 Name" { "chi" "老板 (第一形式)" @@ -9414,6 +10584,11 @@ "chi" "老板 (第一形式)" } + "Common #118 Name" + { + "chi" "老板 (第一形式)" + } + "Tank #118" { "chi" "{mint}这个坦克会对幸存者投掷会爆炸的岩石并会定期进行传送。" @@ -9454,6 +10629,11 @@ "chi" "{mint}这个女巫并会定期进行传送。" } + "Common #118" + { + "chi" "{mint}这个普通并会定期进行传送。" + } + "Tank #119 Name" { "chi" "钢铁霸主 (第二种形式)" @@ -9494,6 +10674,11 @@ "chi" "钢铁霸主 (第二种形式)" } + "Common #119 Name" + { + "chi" "钢铁霸主 (第二种形式)" + } + "Tank #119" { "chi" "{mint}这个坦克跑得比一般的快, 免疫近战伤害, 比一般的坦克强一点, 会投掷爆炸的岩石, 可以改变幸存者的重力值和传送到幸存者身边。" @@ -9534,6 +10719,11 @@ "chi" "{mint}这个女巫跑得比一般的快, 免疫近战伤害, 比一般的女巫强一点, 可以改变幸存者的重力值和传送到幸存者身边。" } + "Common #119" + { + "chi" "{mint}这个普通跑得比一般的快, 免疫近战伤害, 比一般的女巫强一点, 可以改变幸存者的重力值和传送到幸存者身边。" + } + "Tank #120 Name" { "chi" "暗夜魔王 (第三形式)" @@ -9574,6 +10764,11 @@ "chi" "暗夜魔王 (第三形式)" } + "Common #120 Name" + { + "chi" "暗夜魔王 (第三形式)" + } + "Tank #120" { "chi" "{mint}这个坦克跑得比一般的快, 免疫火焰伤害, 比一般的坦克弱一点, 会投掷爆炸的岩石, 可以让幸存者失明和伪装自己, 并会定期传送到幸存者身边。" @@ -9614,6 +10809,11 @@ "chi" "{mint}这个坦克跑得比一般的快, 免疫火焰伤害, 比一般的女巫弱一点, 会投掷爆炸的岩石, 可以让幸存者失明和伪装自己, 并会定期传送到幸存者身边。" } + "Common #120" + { + "chi" "{mint}这个坦克跑得比一般的快, 免疫火焰伤害, 比一般的女巫弱一点, 会投掷爆炸的岩石, 可以让幸存者失明和伪装自己, 并会定期传送到幸存者身边。" + } + "Tank #121 Name" { "chi" "火灵 (第四形式)" @@ -9654,6 +10854,11 @@ "chi" "火灵 (第四形式)" } + "Common #121 Name" + { + "chi" "火灵 (第四形式)" + } + "Tank #121" { "chi" "{mint}这个坦克跑的比一般的快, 免疫火焰伤害, 比一般的坦克强一点, 会投掷爆炸的岩石和引发火灾, 给予幸存者临时生命值, 会定期进行跳跃和传送到幸存者身边。" @@ -9694,6 +10899,11 @@ "chi" "{mint}这个坦克跑的比一般的快, 免疫火焰伤害, 比一般的女巫强一点, 会投掷爆炸的岩石和引发火灾, 给予幸存者临时生命值, 会定期进行跳跃和传送到幸存者身边。" } + "Common #121" + { + "chi" "{mint}这个坦克跑的比一般的快, 免疫火焰伤害, 比一般的女巫强一点, 会投掷爆炸的岩石和引发火灾, 给予幸存者临时生命值, 会定期进行跳跃和传送到幸存者身边。" + } + "Tank #122 Name" { "chi" "随机坦克" @@ -9734,6 +10944,11 @@ "chi" "随机女巫" } + "Common #122 Name" + { + "chi" "随机普通" + } + "Tank #122" { "chi" "{mint}这个坦克会随机转化成其他突变坦克类型, 会造成巨大威胁。 请小心。。。" @@ -9774,6 +10989,11 @@ "chi" "{mint}这个女巫会随机转化成其他突变女巫类型, 会造成巨大威胁。 请小心。。。" } + "Common #122" + { + "chi" "{mint}这个普通会随机转化成其他突变女巫类型, 会造成巨大威胁。 请小心。。。" + } + "Tank #123 Name" { "chi" "变形坦克" @@ -9814,6 +11034,11 @@ "chi" "变形女巫" } + "Common #123 Name" + { + "chi" "变形普通" + } + "Tank #123" { "chi" "{mint}这个坦克可以变成其他突变坦克类型。 要特别小心。。。" @@ -9854,6 +11079,11 @@ "chi" "{mint}这个女巫可以变成其他突变女巫类型。 要特别小心。。。" } + "Common #123" + { + "chi" "{mint}这个普通可以变成其他突变女巫类型。 要特别小心。。。" + } + "Tank #124 Name" { "chi" "闪光坦克" @@ -9894,6 +11124,11 @@ "chi" "闪光女巫" } + "Common #124 Name" + { + "chi" "闪光普通" + } + "Tank #124" { "chi" "{mint}此坦克会用闪光弹让它和受它攻击的人蹒跚。" @@ -9934,6 +11169,11 @@ "chi" "{mint}此女巫会用闪光弹让它和受它攻击的人蹒跚。" } + "Common #124" + { + "chi" "{mint}此普通会用闪光弹让它和受它攻击的人蹒跚。" + } + "Tank #125 Name" { "chi" "泥浆坦克" @@ -9974,6 +11214,11 @@ "chi" "泥浆女巫" } + "Common #125 Name" + { + "chi" "泥浆普通" + } + "Tank #125" { "chi" "{mint}这个坦克像任何泥人一样令人讨厌。" @@ -10014,6 +11259,11 @@ "chi" "{mint}这个女巫像任何泥人一样令人讨厌。" } + "Common #125" + { + "chi" "{mint}这个普通像任何泥人一样令人讨厌。" + } + "Tank #126 Name" { "chi" "残局坦克" @@ -10054,44 +11304,54 @@ "chi" "残局女巫" } + "Common #126 Name" + { + "chi" "残局普通" + } + "Tank #126" { - "chi" "{mint}再见了, 大家!" + "chi" "{mint}再见了, 大家!" } "Boomer #126" { - "chi" "{mint}再见了, 大家!" + "chi" "{mint}再见了, 大家!" } "Charger #126" { - "chi" "{mint}再见了, 大家!" + "chi" "{mint}再见了, 大家!" } "Hunter #126" { - "chi" "{mint}再见了, 大家!" + "chi" "{mint}再见了, 大家!" } "Jockey #126" { - "chi" "{mint}再见了, 大家!" + "chi" "{mint}再见了, 大家!" } "Smoker #126" { - "chi" "{mint}再见了, 大家!" + "chi" "{mint}再见了, 大家!" } "Spitter #126" { - "chi" "{mint}再见了, 大家!" + "chi" "{mint}再见了, 大家!" } "Witch #126" { - "chi" "{mint}再见了, 大家!" + "chi" "{mint}再见了, 大家!" + } + + "Common #126" + { + "chi" "{mint}再见了, 大家!" } "Tank #127 Name" @@ -10134,124 +11394,1764 @@ "chi" "俏皮女巫" } + "Common #127 Name" + { + "chi" "俏皮普通" + } + "Tank #127" { - "chi" "{mint}该坦克不会造成任何伤害。 它只是想玩!" + "chi" "{mint}该坦克不会造成任何伤害。 它只是想玩!" + } + + "Boomer #127" + { + "chi" "{mint}该胖子不会造成任何伤害。 它只是想玩!" + } + + "Charger #127" + { + "chi" "{mint}该牛不会造成任何伤害。 它只是想玩!" + } + + "Hunter #127" + { + "chi" "{mint}该猎人不会造成任何伤害。 它只是想玩!" + } + + "Jockey #127" + { + "chi" "{mint}该猴子不会造成任何伤害。 它只是想玩!" + } + + "Smoker #127" + { + "chi" "{mint}该烟鬼不会造成任何伤害。 它只是想玩!" + } + + "Spitter #127" + { + "chi" "{mint}该口水不会造成任何伤害。 它只是想玩!" + } + + "Witch #127" + { + "chi" "{mint}该女巫不会造成任何伤害。 它只是想玩!" + } + + "Common #127" + { + "chi" "{mint}该普通不会造成任何伤害。 它只是想玩!" + } + + "Tank #128 Name" + { + "chi" "纠缠坦克" + } + + "Boomer #128 Name" + { + "chi" "纠缠胖子" + } + + "Charger #128 Name" + { + "chi" "纠缠牛" + } + + "Hunter #128 Name" + { + "chi" "纠缠猎人" + } + + "Jockey #128 Name" + { + "chi" "纠缠猴子" + } + + "Smoker #128 Name" + { + "chi" "纠缠烟鬼" + } + + "Spitter #128 Name" + { + "chi" "纠缠口水" + } + + "Witch #128 Name" + { + "chi" "纠缠女巫" + } + + "Common #128 Name" + { + "chi" "纠缠普通" + } + + "Tank #128" + { + "chi" "{mint}这个坦克不会消失。" + } + + "Boomer #128" + { + "chi" "{mint}这个胖子不会消失。" + } + + "Charger #128" + { + "chi" "{mint}这个牛不会消失。" + } + + "Hunter #128" + { + "chi" "{mint}这个猎人不会消失。" + } + + "Jockey #128" + { + "chi" "{mint}这个猴子不会消失。" + } + + "Smoker #128" + { + "chi" "{mint}这个烟鬼不会消失。" + } + + "Spitter #128" + { + "chi" "{mint}这个口水不会消失。" + } + + "Witch #128" + { + "chi" "{mint}这个女巫不会消失。" + } + + "Common #128" + { + "chi" "{mint}这个普通不会消失。" + } + + "Tank #129 Name" + { + "chi" "矽酸坦克" + } + + "Boomer #129 Name" + { + "chi" "矽酸胖子" + } + + "Charger #129 Name" + { + "chi" "矽酸牛" + } + + "Hunter #129 Name" + { + "chi" "矽酸猎人" + } + + "Jockey #129 Name" + { + "chi" "矽酸猴子" + } + + "Smoker #129 Name" + { + "chi" "矽酸烟鬼" + } + + "Spitter #129 Name" + { + "chi" "矽酸口水" + } + + "Witch #129 Name" + { + "chi" "矽酸女巫" + } + + "Common #129 Name" + { + "chi" "矽酸普通" + } + + "Tank #129" + { + "chi" "{mint}此坦克会在幸存者脚下生成酸性地带,并召唤流星雨。流星雨的陨石会在几秒钟后爆炸并且燃烧起来" + } + + "Boomer #129" + { + "chi" "{mint}此胖子会在幸存者脚下生成酸性地带,并召唤流星雨。流星雨的陨石会在几秒钟后爆炸并且燃烧起来。" + } + + "Charger #129" + { + "chi" "{mint}此牛会在幸存者脚下生成酸性地带,并召唤流星雨。流星雨的陨石会在几秒钟后爆炸并且燃烧起来。" + } + + "Hunter #129" + { + "chi" "{mint}此猎人会在幸存者脚下生成酸性地带,并召唤流星雨。流星雨的陨石会在几秒钟后爆炸并且燃烧起来。" + } + + "Jockey #129" + { + "chi" "{mint}此猴子会在幸存者脚下生成酸性地带,并召唤流星雨。流星雨的陨石会在几秒钟后爆炸并且燃烧起来。" + } + + "Smoker #129" + { + "chi" "{mint}此烟鬼会在幸存者脚下生成酸性地带,并召唤流星雨。流星雨的陨石会在几秒钟后爆炸并且燃烧起来。" + } + + "Spitter #129" + { + "chi" "{mint}此口水会在幸存者脚下生成酸性地带,并召唤流星雨。流星雨的陨石会在几秒钟后爆炸并且燃烧起来。" + } + + "Witch #129" + { + "chi" "{mint}此女巫会在幸存者脚下生成酸性地带,并召唤流星雨。流星雨的陨石会在几秒钟后爆炸并且燃烧起来。" + } + + "Common #129" + { + "chi" "{mint}此普通会在幸存者脚下生成酸性地带,并召唤流星雨。流星雨的陨石会在几秒钟后爆炸并且燃烧起来。" + } + + "Tank #130 Name" + { + "chi" "邪恶坦克" + } + + "Boomer #130 Name" + { + "chi" "邪恶胖子" + } + + "Charger #130 Name" + { + "chi" "邪恶牛" + } + + "Hunter #130 Name" + { + "chi" "邪恶猎人" + } + + "Jockey #130 Name" + { + "chi" "邪恶猴子" + } + + "Smoker #130 Name" + { + "chi" "邪恶烟鬼" + } + + "Spitter #130 Name" + { + "chi" "邪恶口水" + } + + "Witch #130 Name" + { + "chi" "邪恶女巫" + } + + "Common #130 Name" + { + "chi" "邪恶普通" + } + + "Tank #130" + { + "chi" "{mint}此坦克能把你送到岩浆里去的同时不会让任何东西死亡!" + } + + "Boomer #130" + { + "chi" "{mint}此胖子能把你送到岩浆里去的同时不会让任何东西死亡!" + } + + "Charger #130" + { + "chi" "{mint}此牛能把你送到岩浆里去的同时不会让任何东西死亡!" + } + + "Hunter #130" + { + "chi" "{mint}此猎人能把你送到岩浆里去的同时不会让任何东西死亡!" + } + + "Jockey #130" + { + "chi" "{mint}此猴子能把你送到岩浆里去的同时不会让任何东西死亡!" + } + + "Smoker #130" + { + "chi" "{mint}此烟鬼能把你送到岩浆里去的同时不会让任何东西死亡!" + } + + "Spitter #130" + { + "chi" "{mint}此口水能把你送到岩浆里去的同时不会让任何东西死亡!" + } + + "Witch #130" + { + "chi" "{mint}此女巫能把你送到岩浆里去的同时不会让任何东西死亡!" + } + + "Common #130" + { + "chi" "{mint}此普通能把你送到岩浆里去的同时不会让任何东西死亡!" + } + + "Tank #131 Name" + { + "chi" "警官坦克" + } + + "Boomer #131 Name" + { + "chi" "警官胖子" + } + + "Charger #131 Name" + { + "chi" "警官牛" + } + + "Hunter #131 Name" + { + "chi" "警官猎人" + } + + "Jockey #131 Name" + { + "chi" "警官猴子" + } + + "Smoker #131 Name" + { + "chi" "警官烟鬼" + } + + "Spitter #131 Name" + { + "chi" "警官口水" + } + + "Witch #131 Name" + { + "chi" "警官女巫" + } + + "Common #131 Name" + { + "chi" "警官普通" + } + + "Tank #131 Note" + { + "chi" "{mint}此坦克会召集整个警察局的人来对你进行制裁!" + } + + "Boomer #131 Note" + { + "chi" "{mint}此胖子会召集整个警察局的人来对你进行制裁!" + } + + "Charger #131 Note" + { + "chi" "{mint}此牛会召集整个警察局的人来对你进行制裁!" + } + + "Hunter #131 Note" + { + "chi" "{mint}此猎人会召集整个警察局的人来对你进行制裁!" + } + + "Jockey #131 Note" + { + "chi" "{mint}此猴子会召集整个警察局的人来对你进行制裁!" + } + + "Smoker #131 Note" + { + "chi" "{mint}此烟鬼会召集整个警察局的人来对你进行制裁!" + } + + "Spitter #131 Note" + { + "chi" "{mint}此口水会召集整个警察局的人来对你进行制裁!" + } + + "Witch #131 Note" + { + "chi" "{mint}此女巫会召集整个警察局的人来对你进行制裁!" + } + + "Common #131 Note" + { + "chi" "{mint}此普通会召集整个警察局的人来对你进行制裁!" + } + + "Tank #132 Name" + { + "chi" "黑手党坦克" + } + + "Boomer #132 Name" + { + "chi" "黑手党胖子" + } + + "Charger #132 Name" + { + "chi" "黑手党牛" + } + + "Hunter #132 Name" + { + "chi" "黑手党猎人" + } + + "Jockey #132 Name" + { + "chi" "黑手党猴子" + } + + "Smoker #132 Name" + { + "chi" "黑手党烟鬼" + } + + "Spitter #132 Name" + { + "chi" "黑手党口水" + } + + "Witch #132 Name" + { + "chi" "黑手党女巫" + } + + "Common #132 Name" + { + "chi" "黑手党普通" + } + + "Tank #132 Note" + { + "chi" "{mint}此坦克是黑手党成员!" + } + + "Boomer #132 Note" + { + "chi" "{mint}此胖子是黑手党成员!" + } + + "Charger #132 Note" + { + "chi" "{mint}此牛是黑手党成员!" + } + + "Hunter #132 Note" + { + "chi" "{mint}此猎人是黑手党成员!" + } + + "Jockey #132 Note" + { + "chi" "{mint}此猴子是黑手党成员!" + } + + "Smoker #132 Note" + { + "chi" "{mint}此烟鬼是黑手党成员!" + } + + "Spitter #132 Note" + { + "chi" "{mint}此口水是黑手党成员!" + } + + "Witch #132 Note" + { + "chi" "{mint}此女巫是黑手党成员!" + } + + "Common #132 Note" + { + "chi" "{mint}此普通是黑手党成员!" + } + + "Tank #133 Name" + { + "chi" "人造人坦克" + } + + "Boomer #133 Name" + { + "chi" "人造人胖子" + } + + "Charger #133 Name" + { + "chi" "人造人牛" + } + + "Hunter #133 Name" + { + "chi" "人造人猎人" + } + + "Jockey #133 Name" + { + "chi" "人造人猴子" + } + + "Smoker #133 Name" + { + "chi" "人造人烟鬼" + } + + "Spitter #133 Name" + { + "chi" "人造人口水" + } + + "Witch #133 Name" + { + "chi" "人造人女巫" + } + + "Common #133 Name" + { + "chi" "人造人普通" + } + + "Tank #133 Note" + { + "chi" "{mint}此坦克肯定是人造人变种!" + } + + "Boomer #133 Note" + { + "chi" "{mint}此胖子肯定是人造人变种!" + } + + "Charger #133 Note" + { + "chi" "{mint}此牛肯定是人造人变种!" + } + + "Hunter #133 Note" + { + "chi" "{mint}此猎人肯定是人造人变种!" + } + + "Jockey #133 Note" + { + "chi" "{mint}此猴子肯定是人造人变种!" + } + + "Smoker #133 Note" + { + "chi" "{mint}此烟鬼肯定是人造人变种!" + } + + "Spitter #133 Note" + { + "chi" "{mint}此口水肯定是人造人变种!" + } + + "Witch #133 Note" + { + "chi" "{mint}此女巫肯定是人造人变种!" + } + + "Common #133 Note" + { + "chi" "{mint}此普通肯定是人造人变种!" + } + + "Tank #134 Name" + { + "chi" "原型坦克" + } + + "Boomer #134 Name" + { + "chi" "原型胖子" + } + + "Charger #134 Name" + { + "chi" "原型牛" + } + + "Hunter #134 Name" + { + "chi" "原型猎人" + } + + "Jockey #134 Name" + { + "chi" "原型猴子" + } + + "Smoker #134 Name" + { + "chi" "原型烟鬼" + } + + "Spitter #134 Name" + { + "chi" "原型口水" + } + + "Witch #134 Name" + { + "chi" "原型女巫" + } + + "Common #134 Name" + { + "chi" "原型普通" + } + + "Tank #134 Note" + { + "chi" "{mint}此坦克学会了随机应变, 会自适应来克服任何情况." + } + + "Boomer #134 Note" + { + "chi" "{mint}此胖子学会了随机应变, 会自适应来克服任何情况." + } + + "Charger #134 Note" + { + "chi" "{mint}此牛学会了随机应变, 会自适应来克服任何情况." + } + + "Hunter #134 Note" + { + "chi" "{mint}此猎人学会了随机应变, 会自适应来克服任何情况." + } + + "Jockey #134 Note" + { + "chi" "{mint}此猴子学会了随机应变, 会自适应来克服任何情况." + } + + "Smoker #134 Note" + { + "chi" "{mint}此烟鬼学会了随机应变, 会自适应来克服任何情况." + } + + "Spitter #134 Note" + { + "chi" "{mint}此口水学会了随机应变, 会自适应来克服任何情况." + } + + "Witch #134 Note" + { + "chi" "{mint}此女巫学会了随机应变, 会自适应来克服任何情况." + } + + "Common #134 Note" + { + "chi" "{mint}此普通学会了随机应变, 会自适应来克服任何情况." + } + + "Tank #135 Name" + { + "chi" "宙斯坦克" + } + + "Boomer #135 Name" + { + "chi" "宙斯胖子" + } + + "Charger #135 Name" + { + "chi" "宙斯牛" + } + + "Hunter #135 Name" + { + "chi" "宙斯猎人" + } + + "Jockey #135 Name" + { + "chi" "宙斯猴子" + } + + "Smoker #135 Name" + { + "chi" "宙斯烟鬼" + } + + "Spitter #135 Name" + { + "chi" "宙斯口水" + } + + "Witch #135 Name" + { + "chi" "宙斯女巫" + } + + "Common #135 Name" + { + "chi" "宙斯普通" + } + + "Tank #135 Note" + { + "chi" "{mint}此坦克学会了指尖闪电!" + } + + "Boomer #135 Note" + { + "chi" "{mint}此胖子学会了指尖闪电!" + } + + "Charger #135 Note" + { + "chi" "{mint}此牛学会了指尖闪电!" + } + + "Hunter #135 Note" + { + "chi" "{mint}此猎人学会了指尖闪电!" + } + + "Jockey #135 Note" + { + "chi" "{mint}此猴子学会了指尖闪电!" + } + + "Smoker #135 Note" + { + "chi" "{mint}此烟鬼学会了指尖闪电!" + } + + "Spitter #135 Note" + { + "chi" "{mint}此口水学会了指尖闪电!" + } + + "Witch #135 Note" + { + "chi" "{mint}此女巫学会了指尖闪电!" + } + + "Common #135 Note" + { + "chi" "{mint}此普通学会了指尖闪电!" + } + + "Tank #136 Name" + { + "chi" "轨迹坦克" + } + + "Boomer #136 Name" + { + "chi" "轨迹胖子" + } + + "Charger #136 Name" + { + "chi" "轨迹牛" + } + + "Hunter #136 Name" + { + "chi" "轨迹猎人" + } + + "Jockey #136 Name" + { + "chi" "轨迹猴子" + } + + "Smoker #136 Name" + { + "chi" "轨迹烟鬼" + } + + "Spitter #136 Name" + { + "chi" "轨迹口水" + } + + "Witch #136 Name" + { + "chi" "轨迹女巫" + } + + "Common #136 Name" + { + "chi" "轨迹普通" + } + + "Tank #136 Note" + { + "chi" "{mint}此坦克会用速度来改变你的生命轨迹!" + } + + "Boomer #136 Note" + { + "chi" "{mint}此胖子会用速度来改变你的生命轨迹!" + } + + "Charger #136 Note" + { + "chi" "{mint}此牛会用速度来改变你的生命轨迹!" + } + + "Hunter #136 Note" + { + "chi" "{mint}此猎人会用速度来改变你的生命轨迹!" + } + + "Jockey #136 Note" + { + "chi" "{mint}此猴子会用速度来改变你的生命轨迹!" + } + + "Smoker #136 Note" + { + "chi" "{mint}此烟鬼会用速度来改变你的生命轨迹!" + } + + "Spitter #136 Note" + { + "chi" "{mint}此口水会用速度来改变你的生命轨迹!" + } + + "Witch #136 Note" + { + "chi" "{mint}此女巫会用速度来改变你的生命轨迹!" + } + + "Common #136 Note" + { + "chi" "{mint}此普通会用速度来改变你的生命轨迹!" + } + + "Tank #137 Name" + { + "chi" "无尽坦克" + } + + "Boomer #137 Name" + { + "chi" "无尽胖子" + } + + "Charger #137 Name" + { + "chi" "无尽牛" + } + + "Hunter #137 Name" + { + "chi" "无尽猎人" + } + + "Jockey #137 Name" + { + "chi" "无尽猴子" + } + + "Smoker #137 Name" + { + "chi" "无尽烟鬼" + } + + "Spitter #137 Name" + { + "chi" "无尽口水" + } + + "Witch #137 Name" + { + "chi" "无尽女巫" + } + + "Common #137 Name" + { + "chi" "无尽普通" + } + + "Tank #137 Note" + { + "chi" "{mint}此坦克不会给你任何停歇的时间." + } + + "Boomer #137 Note" + { + "chi" "{mint}此胖子不会给你任何停歇的时间." + } + + "Charger #137 Note" + { + "chi" "{mint}此牛不会给你任何停歇的时间." + } + + "Hunter #137 Note" + { + "chi" "{mint}此猎人不会给你任何停歇的时间." + } + + "Jockey #137 Note" + { + "chi" "{mint}此猴子不会给你任何停歇的时间." + } + + "Smoker #137 Note" + { + "chi" "{mint}此烟鬼不会给你任何停歇的时间." + } + + "Spitter #137 Note" + { + "chi" "{mint}此口水不会给你任何停歇的时间." + } + + "Witch #137 Note" + { + "chi" "{mint}此女巫不会给你任何停歇的时间." + } + + "Common #137 Note" + { + "chi" "{mint}此普通不会给你任何停歇的时间." + } + + "Tank #138 Name" + { + "chi" "收藏家坦克" + } + + "Boomer #138 Name" + { + "chi" "收藏家胖子" + } + + "Charger #138 Name" + { + "chi" "收藏家牛" + } + + "Hunter #138 Name" + { + "chi" "收藏家猎人" + } + + "Jockey #138 Name" + { + "chi" "收藏家猴子" + } + + "Smoker #138 Name" + { + "chi" "收藏家烟鬼" + } + + "Spitter #138 Name" + { + "chi" "收藏家口水" + } + + "Witch #138 Name" + { + "chi" "收藏家女巫" + } + + "Common #138 Name" + { + "chi" "收藏家普通" + } + + "Tank #138 Note" + { + "chi" "{mint}此坦克只想把你做成标本进行收藏..." + } + + "Boomer #138 Note" + { + "chi" "{mint}此胖子只想把你做成标本进行收藏..." + } + + "Charger #138 Note" + { + "chi" "{mint}此牛只想把你做成标本进行收藏..." + } + + "Hunter #138 Note" + { + "chi" "{mint}此猎人只想把你做成标本进行收藏..." + } + + "Jockey #138 Note" + { + "chi" "{mint}此猴子只想把你做成标本进行收藏..." + } + + "Smoker #138 Note" + { + "chi" "{mint}此烟鬼只想把你做成标本进行收藏..." + } + + "Spitter #138 Note" + { + "chi" "{mint}此口水只想把你做成标本进行收藏..." + } + + "Witch #138 Note" + { + "chi" "{mint}此女巫只想把你做成标本进行收藏..." + } + + "Common #138 Note" + { + "chi" "{mint}此普通只想把你做成标本进行收藏..." + } + + "Tank #139 Name" + { + "chi" "时间旅者坦克" + } + + "Boomer #139 Name" + { + "chi" "时间旅者胖子" + } + + "Charger #139 Name" + { + "chi" "时间旅者牛" + } + + "Hunter #139 Name" + { + "chi" "时间旅者猎人" + } + + "Jockey #139 Name" + { + "chi" "时间旅者猴子" + } + + "Smoker #139 Name" + { + "chi" "时间旅者烟鬼" + } + + "Spitter #139 Name" + { + "chi" "时间旅者口水" + } + + "Witch #139 Name" + { + "chi" "时间旅者女巫" + } + + "Common #139 Name" + { + "chi" "时间旅者普通" + } + + "Tank #139 Note" + { + "chi" "{mint}此坦克从古至今一直都存在." + } + + "Boomer #139 Note" + { + "chi" "{mint}此胖子从古至今一直都存在." + } + + "Charger #139 Note" + { + "chi" "{mint}此牛从古至今一直都存在." + } + + "Hunter #139 Note" + { + "chi" "{mint}此猎人从古至今一直都存在." + } + + "Jockey #139 Note" + { + "chi" "{mint}此猴子从古至今一直都存在." + } + + "Smoker #139 Note" + { + "chi" "{mint}此烟鬼从古至今一直都存在." + } + + "Spitter #139 Note" + { + "chi" "{mint}此口水从古至今一直都存在." + } + + "Witch #139 Note" + { + "chi" "{mint}此女巫从古至今一直都存在." + } + + "Common #139 Note" + { + "chi" "{mint}此普通从古至今一直都存在." + } + + "Tank #140 Name" + { + "chi" "急速恶魔坦克" + } + + "Boomer #140 Name" + { + "chi" "急速恶魔胖子" + } + + "Charger #140 Name" + { + "chi" "急速恶魔牛" + } + + "Hunter #140 Name" + { + "chi" "急速恶魔猎人" + } + + "Jockey #140 Name" + { + "chi" "急速恶魔猴子" + } + + "Smoker #140 Name" + { + "chi" "急速恶魔烟鬼" + } + + "Spitter #140 Name" + { + "chi" "急速恶魔口水" + } + + "Witch #140 Name" + { + "chi" "急速恶魔女巫" + } + + "Common #140 Name" + { + "chi" "急速恶魔普通" + } + + "Tank #140 Note" + { + "chi" "{mint}此坦克所到之处都会留下火光..." + } + + "Boomer #140 Note" + { + "chi" "{mint}此胖子所到之处都会留下火光..." + } + + "Charger #140 Note" + { + "chi" "{mint}此牛所到之处都会留下火光..." + } + + "Hunter #140 Note" + { + "chi" "{mint}此猎人所到之处都会留下火光..." + } + + "Jockey #140 Note" + { + "chi" "{mint}此猴子所到之处都会留下火光..." + } + + "Smoker #140 Note" + { + "chi" "{mint}此烟鬼所到之处都会留下火光..." + } + + "Spitter #140 Note" + { + "chi" "{mint}此口水所到之处都会留下火光..." + } + + "Witch #140 Note" + { + "chi" "{mint}此女巫所到之处都会留下火光..." + } + + "Common #140 Note" + { + "chi" "{mint}此普通所到之处都会留下火光..." + } + + "Tank #141 Name" + { + "chi" "入侵者坦克" + } + + "Boomer #141 Name" + { + "chi" "入侵者胖子" + } + + "Charger #141 Name" + { + "chi" "入侵者牛" + } + + "Hunter #141 Name" + { + "chi" "入侵者猎人" + } + + "Jockey #141 Name" + { + "chi" "入侵者猴子" + } + + "Smoker #141 Name" + { + "chi" "入侵者烟鬼" + } + + "Spitter #141 Name" + { + "chi" "入侵者口水" + } + + "Witch #141 Name" + { + "chi" "入侵者女巫" + } + + "Common #141 Name" + { + "chi" "入侵者普通" + } + + "Tank #141 Note" + { + "chi" "{mint}此坦克会炸毁沿途的所有东西!" + } + + "Boomer #141 Note" + { + "chi" "{mint}此胖子会炸毁沿途的所有东西!" + } + + "Charger #141 Note" + { + "chi" "{mint}此牛会炸毁沿途的所有东西!" + } + + "Hunter #141 Note" + { + "chi" "{mint}此猎人会炸毁沿途的所有东西!" + } + + "Jockey #141 Note" + { + "chi" "{mint}此猴子会炸毁沿途的所有东西!" + } + + "Smoker #141 Note" + { + "chi" "{mint}此烟鬼会炸毁沿途的所有东西!" } - "Boomer #127" + "Spitter #141 Note" { - "chi" "{mint}该胖子不会造成任何伤害。 它只是想玩!" + "chi" "{mint}此口水会炸毁沿途的所有东西!" } - "Charger #127" + "Witch #141 Note" { - "chi" "{mint}该牛不会造成任何伤害。 它只是想玩!" + "chi" "{mint}此女巫会炸毁沿途的所有东西!" } - "Hunter #127" + "Common #141 Note" { - "chi" "{mint}该猎人不会造成任何伤害。 它只是想玩!" + "chi" "{mint}此普通会炸毁沿途的所有东西!" } - "Jockey #127" + "Tank #142 Name" { - "chi" "{mint}该猴子不会造成任何伤害。 它只是想玩!" + "chi" "拉玛刹坦克" } - "Smoker #127" + "Boomer #142 Name" { - "chi" "{mint}该烟鬼不会造成任何伤害。 它只是想玩!" + "chi" "拉玛刹胖子" } - "Spitter #127" + "Charger #142 Name" { - "chi" "{mint}该口水不会造成任何伤害。 它只是想玩!" + "chi" "拉玛刹牛" } - "Witch #127" + "Hunter #142 Name" { - "chi" "{mint}该女巫不会造成任何伤害。 它只是想玩!" + "chi" "拉玛刹猎人" } - "Tank #128 Name" + "Jockey #142 Name" { - "chi" "纠缠坦克" + "chi" "拉玛刹猴子" } - "Boomer #128 Name" + "Smoker #142 Name" { - "chi" "纠缠胖子" + "chi" "拉玛刹烟鬼" } - "Charger #128 Name" + "Spitter #142 Name" { - "chi" "纠缠牛" + "chi" "拉玛刹口水" } - "Hunter #128 Name" + "Witch #142 Name" { - "chi" "纠缠猎人" + "chi" "拉玛刹女巫" } - "Jockey #128 Name" + "Common #142 Name" { - "chi" "纠缠猴子" + "chi" "拉玛刹普通" } - "Smoker #128 Name" + "Tank #142" { - "chi" "纠缠烟鬼" + "chi" "{mint}此坦克会让你像他一样。。。 饱!受!折!磨!" } - "Spitter #128 Name" + "Boomer #142" { - "chi" "纠缠口水" + "chi" "{mint}此胖子会让你像他一样。。。 饱!受!折!磨!" } - "Witch #128 Name" + "Charger #142" { - "chi" "纠缠女巫" + "chi" "{mint}此牛会让你像他一样。。。 饱!受!折!磨!" } - "Tank #128" + "Hunter #142" { - "chi" "{mint}这个坦克不会消失。" + "chi" "{mint}此猎人会让你像他一样。。。 饱!受!折!磨!" } - "Boomer #128" + "Jockey #142" { - "chi" "{mint}这个胖子不会消失。" + "chi" "{mint}此猴子会让你像他一样。。。 饱!受!折!磨!" } - "Charger #128" + "Smoker #142" { - "chi" "{mint}这个牛不会消失。" + "chi" "{mint}此烟鬼会让你像他一样。。。 饱!受!折!磨!" } - "Hunter #128" + "Spitter #142" { - "chi" "{mint}这个猎人不会消失。" + "chi" "{mint}此口水会让你像他一样。。。 饱!受!折!磨!" } - "Jockey #128" + "Witch #142" { - "chi" "{mint}这个猴子不会消失。" + "chi" "{mint}此女巫会让你像他一样。。。 饱!受!折!磨!" } - "Smoker #128" + "Common #142" { - "chi" "{mint}这个烟鬼不会消失。" + "chi" "{mint}此普通会让你像他一样。。。 饱!受!折!磨!" } - "Spitter #128" + "Tank #143 Name" { - "chi" "{mint}这个口水不会消失。" + "chi" "西格玛坦克" } - "Witch #128" + "Boomer #143 Name" { - "chi" "{mint}这个女巫不会消失。" + "chi" "西格玛胖子" + } + + "Charger #143 Name" + { + "chi" "西格玛牛" + } + + "Hunter #143 Name" + { + "chi" "西格玛猎人" + } + + "Jockey #143 Name" + { + "chi" "西格玛猴子" + } + + "Smoker #143 Name" + { + "chi" "西格玛烟鬼" + } + + "Spitter #143 Name" + { + "chi" "西格玛口水" + } + + "Witch #143 Name" + { + "chi" "西格玛女巫" + } + + "Common #143 Name" + { + "chi" "西格玛普通" + } + + "Tank #143" + { + "chi" "{mint}此坦克可以控制重力并且吸收大量的伤害。" + } + + "Boomer #143" + { + "chi" "{mint}此胖子可以控制重力并且吸收大量的伤害。" + } + + "Charger #143" + { + "chi" "{mint}此牛可以控制重力并且吸收大量的伤害。" + } + + "Hunter #143" + { + "chi" "{mint}此猎人可以控制重力并且吸收大量的伤害。" + } + + "Jockey #143" + { + "chi" "{mint}此猴子可以控制重力并且吸收大量的伤害。" + } + + "Smoker #143" + { + "chi" "{mint}此烟鬼可以控制重力并且吸收大量的伤害。" + } + + "Spitter #143" + { + "chi" "{mint}此口水可以控制重力并且吸收大量的伤害。" + } + + "Witch #143" + { + "chi" "{mint}此女巫可以控制重力并且吸收大量的伤害。" + } + + "Common #143" + { + "chi" "{mint}此普通可以控制重力并且吸收大量的伤害。" + } + + "Tank #144 Name" + { + "chi" "札莉雅坦克" + } + + "Boomer #144 Name" + { + "chi" "札莉雅胖子" + } + + "Charger #144 Name" + { + "chi" "札莉雅牛" + } + + "Hunter #144 Name" + { + "chi" "札莉雅猎人" + } + + "Jockey #144 Name" + { + "chi" "札莉雅猴子" + } + + "Smoker #144 Name" + { + "chi" "札莉雅烟鬼" + } + + "Spitter #144 Name" + { + "chi" "札莉雅口水" + } + + "Witch #144 Name" + { + "chi" "札莉雅女巫" + } + + "Common #144 Name" + { + "chi" "札莉雅普通" + } + + "Tank #144 Note" + { + "chi" "{mint}此坦克不仅可以控制重力,还会把受到的伤害转化为护甲和伤害提升,同时会一直吸收附近感染者的生命值." + } + + "Boomer #144 Note" + { + "chi" "{mint}此胖子不仅可以控制重力,还会把受到的伤害转化为护甲和伤害提升,同时会一直吸收附近感染者的生命值." + } + + "Charger #144 Note" + { + "chi" "{mint}此牛不仅可以控制重力,还会把受到的伤害转化为护甲和伤害提升,同时会一直吸收附近感染者的生命值." + } + + "Hunter #144 Note" + { + "chi" "{mint}此猎人不仅可以控制重力,还会把受到的伤害转化为护甲和伤害提升,同时会一直吸收附近感染者的生命值." + } + + "Jockey #144 Note" + { + "chi" "{mint}此猴子不仅可以控制重力,还会把受到的伤害转化为护甲和伤害提升,同时会一直吸收附近感染者的生命值." + } + + "Smoker #144 Note" + { + "chi" "{mint}此烟鬼不仅可以控制重力,还会把受到的伤害转化为护甲和伤害提升,同时会一直吸收附近感染者的生命值." + } + + "Spitter #144 Note" + { + "chi" "{mint}此口水不仅可以控制重力,还会把受到的伤害转化为护甲和伤害提升,同时会一直吸收附近感染者的生命值." + } + + "Witch #144 Note" + { + "chi" "{mint}此女巫不仅可以控制重力,还会把受到的伤害转化为护甲和伤害提升,同时会一直吸收附近感染者的生命值." + } + + "Common #144 Note" + { + "chi" "{mint}此普通不仅可以控制重力,还会把受到的伤害转化为护甲和伤害提升,同时会一直吸收附近感染者的生命值." + } + + "Tank #145 Name" + { + "chi" "懒人检察者坦克" + } + + "Boomer #145 Name" + { + "chi" "懒人检察者胖子" + } + + "Charger #145 Name" + { + "chi" "懒人检察者牛" + } + + "Hunter #145 Name" + { + "chi" "懒人检察者猎人" + } + + "Jockey #145 Name" + { + "chi" "懒人检察者猴子" + } + + "Smoker #145 Name" + { + "chi" "懒人检察者烟鬼" + } + + "Spitter #145 Name" + { + "chi" "懒人检察者口水" + } + + "Witch #145 Name" + { + "chi" "懒人检察者女巫" + } + + "Common #145 Name" + { + "chi" "懒人检察者普通" + } + + "Tank #145 Note" + { + "chi" "{mint}此坦克会惩罚那些掉队的幸存者!" + } + + "Boomer #145 Note" + { + "chi" "{mint}此胖子会惩罚那些掉队的幸存者!" + } + + "Charger #145 Note" + { + "chi" "{mint}此牛会惩罚那些掉队的幸存者!" + } + + "Hunter #145 Note" + { + "chi" "{mint}此猎人会惩罚那些掉队的幸存者!" + } + + "Jockey #145 Note" + { + "chi" "{mint}此猴子会惩罚那些掉队的幸存者!" + } + + "Smoker #145 Note" + { + "chi" "{mint}此烟鬼会惩罚那些掉队的幸存者!" + } + + "Spitter #145 Note" + { + "chi" "{mint}此口水会惩罚那些掉队的幸存者!" + } + + "Witch #145 Note" + { + "chi" "{mint}此女巫会惩罚那些掉队的幸存者!" + } + + "Common #145 Note" + { + "chi" "{mint}此普通会惩罚那些掉队的幸存者!" + } + + "Tank #146 Name" + { + "chi" "领头惩罚者坦克" + } + + "Boomer #146 Name" + { + "chi" "领头惩罚者胖子" + } + + "Charger #146 Name" + { + "chi" "领头惩罚者牛" + } + + "Hunter #146 Name" + { + "chi" "领头惩罚者猎人" + } + + "Jockey #146 Name" + { + "chi" "领头惩罚者猴子" + } + + "Smoker #146 Name" + { + "chi" "领头惩罚者烟鬼" + } + + "Spitter #146 Name" + { + "chi" "领头惩罚者口水" + } + + "Witch #146 Name" + { + "chi" "领头惩罚者女巫" + } + + "Common #146 Name" + { + "chi" "领头惩罚者普通" + } + + "Tank #146 Note" + { + "chi" "{mint}此坦克会惩罚那些不顾团队跑在前面的人!" + } + + "Boomer #146 Note" + { + "chi" "{mint}此胖子会惩罚那些不顾团队跑在前面的人!" + } + + "Charger #146 Note" + { + "chi" "{mint}此牛会惩罚那些不顾团队跑在前面的人!" + } + + "Hunter #146 Note" + { + "chi" "{mint}此猎人会惩罚那些不顾团队跑在前面的人!" + } + + "Jockey #146 Note" + { + "chi" "{mint}此猴子会惩罚那些不顾团队跑在前面的人!" + } + + "Smoker #146 Note" + { + "chi" "{mint}此烟鬼会惩罚那些不顾团队跑在前面的人!" + } + + "Spitter #146 Note" + { + "chi" "{mint}此口水会惩罚那些不顾团队跑在前面的人!" + } + + "Witch #146 Note" + { + "chi" "{mint}此女巫会惩罚那些不顾团队跑在前面的人!" + } + + "Common #146 Note" + { + "chi" "{mint}此普通会惩罚那些不顾团队跑在前面的人!" } // 这实际上是一个有效的 Steam32ID, 所以请不要取消注释, 这只是一个示例 @@ -10325,16 +13225,6 @@ // { // "chi" "{mint}这个口水是某某某在控制的。" // } - // - // "STEAM_0:1:23456789 Witch Name" - // { - // "chi" "女巫" - // } - // - // "STEAM_0:1:23456789 Witch" - // { - // "chi" "{mint}这个女巫是某某某在控制的。" - // } // -- - // 给你自己所控的突变坦克添加坦克注释短语文本! + // 给你自己所控的突变坦克添加坦克注释短语文本! } \ No newline at end of file diff --git a/addons/sourcemod/translations/hu/mutant_tanks.phrases.txt b/addons/sourcemod/translations/hu/mutant_tanks.phrases.txt index 8b54bfe5d7..09e589507d 100644 --- a/addons/sourcemod/translations/hu/mutant_tanks.phrases.txt +++ b/addons/sourcemod/translations/hu/mutant_tanks.phrases.txt @@ -224,6 +224,16 @@ "hu" "Mutáns Tankok Verzió" } + "MTWarnRusher" + { + "hu" "Csoportosulj a csapatoddal, mielőtt levadásznak!" + } + + "MTWarnSlacker" + { + "hu" "Érd utol a csapatodat, mielőtt levadásznak!" + } + "Ammunition" { "hu" "Lőszer" @@ -251,12 +261,17 @@ "AbilityButtonMode1" { - "hu" "Nyomj gombo(kat)t hogy aktiváld a képesége(idet)det." + "hu" "Nyomj gomb(ok)at a képességeid aktiválásához." } "AbilityButtonMode2" { - "hu" "Tarts lenyomva gombo(kat) a képessége(ek)id használatához." + "hu" "A képességek használatához tartsd lenyomva a gomb(ok)at." + } + + "AbilityButtonMode3" + { + "hu" "Nyomj gomb(ok)at a képességeid váltásához." } "Buttons" @@ -1004,6 +1019,11 @@ "hu" "Tank" } + "NoNameBill" + { + "hu" "Bill" + } + "NoNameBoomer" { "hu" "Pukkancs" @@ -1014,6 +1034,26 @@ "hu" "Rohanó" } + "NoNameCoach" + { + "hu" "Edző" + } + + "NoNameCommon" + { + "hu" "Fertőzöttek" + } + + "NoNameEllis" + { + "hu" "Ellis" + } + + "NoNameFrancis" + { + "hu" "Francis" + } + "NoNameHunter" { "hu" "Vadász" @@ -1024,6 +1064,21 @@ "hu" "Zsoké" } + "NoNameLouis" + { + "hu" "Louis" + } + + "NoNameNick" + { + "hu" "Nick" + } + + "NoNameRochelle" + { + "hu" "Rochelle" + } + "NoNameSmoker" { "hu" "Füstös" @@ -1039,6 +1094,11 @@ "hu" "Boszorka" } + "NoNameZoey" + { + "hu" "Zoey" + } + "NoNote" { "hu" "Nincs jegyzet ehhez a Mutáns Tankhoz." @@ -1295,11 +1355,6 @@ } "RewardLadyKiller" - { - "hu" "{1}{mint} nőcsábász{default} használatot" - } - - "RewardLadyKiller2" { "hu" "Van még neked{yellow} {1}{mint} nőcsábász{default} használatod." } @@ -1849,61 +1904,11 @@ "hu" "Lőszer Képesség" } - "Blind" - { - "hu" "{olive}{1}{mint} megvakította{olive} {2}{mint}!" - } - - "Blind2" - { - "hu" "{olive}{1}{mint} többé már nem vak!" - } - - "BlindAmmo" - { - "hu" "Elhasználtad az összes távolsági vakító képességed lőszerét." - } - "BlindDetails" { "hu" "Megvakítod a túlélőket." } - "BlindHuman" - { - "hu" "Aktiváltad{olive} {1}{mint}/{olive}{2}{mint} az egyik vakító képességedet!" - } - - "BlindHuman2" - { - "hu" "A vakító képességed aktiválása nem sikerült. Próbáld újra." - } - - "BlindHuman3" - { - "hu" "A vakító képességednek még kell{yellow} {1} másodperc{mint} az újratöltéshez." - } - - "BlindHuman4" - { - "hu" "Nincsenek túlélők a közelben ahhoz hogy használni tudd a vakító képességedet." - } - - "BlindHuman5" - { - "hu" "A vakító képességed véget ért, az újratöltéséhez még kell{yellow} {1} másodperc{mint}." - } - - "BlindMenu" - { - "hu" "Távolsági Vakító Információ" - } - - "BlindMenu2" - { - "hu" "Vakító Képesség" - } - "Bomb" { "hu" "{olive}{1}{mint} létrehozott egy robbanást{olive} {2}{mint} helyzeténél!" @@ -2244,6 +2249,11 @@ "hu" "{olive}{1}{mint} dobott egy közelharci fegyvert!" } + "Drop3" + { + "hu" "{olive}{1}{mint} tételeket adott{yellow} a túlélőknek{mint}!" + } + "DropDetails" { "hu" "Fegyvert dobsz a halálod után." @@ -2251,12 +2261,12 @@ "DropHuman" { - "hu" "Fegyvert dobsz miután meghalsz!" + "hu" "Tételeket adsz a túlélőknek miután meghalsz!" } "DropHuman2" { - "hu" "Azonnal fegyvert dobsz a halálod után." + "hu" "Már adtál tételeket a túlélőknek a halálod után." } "DropMenu" @@ -3139,24 +3149,24 @@ "hu" "Csak a tested bizonyos pontjain vagy sebezhető." } - "HitMenu" + "Hurt" { - "hu" "Ütő Képesség Információ" + "hu" "{olive}{1}{mint} bántja{olive} {2}{mint}-t!" } - "HitMenu2" + "Hurt2" { - "hu" "Ütő Képesség" + "hu" "{olive}{1}{mint} többé már nincs bántalmazás alatt!" } - "Hurt" + "Hurt3" { - "hu" "{olive}{1}{mint} bántja{olive} {2}{mint}-t!" + "hu" "{olive}{1}{mint} csapdossa{olive} {2}{mint}-t!" } - "Hurt2" + "Hurt4" { - "hu" "{olive}{1}{mint} többé már nincs bántalmazás alatt!" + "hu" "{olive}{1}{mint} többé már nincs csapdosva!" } "HurtAmmo" @@ -3419,36 +3429,11 @@ "hu" "Megfordítás Képesség" } - "Item" - { - "hu" "{olive}{1}{mint} tételeket adott{yellow} a túlélőknek{mint}!" - } - "ItemDetails" { "hu" "Tételeket adsz a túlélőknek halálod után." } - "ItemHuman" - { - "hu" "Tételeket adsz a túlélőknek miután meghalsz!" - } - - "ItemHuman2" - { - "hu" "Már adtál tételeket a túlélőknek a halálod után." - } - - "ItemMenu" - { - "hu" "Tétel Képesség Információ" - } - - "ItemMenu2" - { - "hu" "Tétel Képesség" - } - "Jump" { "hu" "{olive}{1}{mint} kényszeríti{olive} {2}{mint} -t hogy kontrollálhatatlanul ugráljon!" @@ -3534,41 +3519,11 @@ "hu" "Ugrás Képesség" } - "Kamikaze" - { - "hu" "{olive}{1}{mint} kamikazét adott{olive} {2}{mint}-nak!" - } - "KamikazeDetails" { "hu" "Megölöd magad és áldozatként viszed magaddal a túlélőket is." } - "KamikazeHuman" - { - "hu" "Aktiváltad a kamikaze képességedet!" - } - - "KamikazeHuman2" - { - "hu" "Nem sikerült aktiválni a kamikaze képességedet. Próbáld újra." - } - - "KamikazeHuman3" - { - "hu" "Nincsenek túlélők a közelben ahhoz hogy használni tudd a kamikaze képességedet." - } - - "KamikazeMenu" - { - "hu" "Kamikaze Képesség Információ" - } - - "KamikazeMenu2" - { - "hu" "Kamikaze Képesség" - } - "Lag" { "hu" "{olive}{1}{mint} késlelteti{olive} {2}{mint} -t!" @@ -3679,61 +3634,11 @@ "hu" "Lézer Képesség" } - "Leech" - { - "hu" "{olive}{1}{mint} életet{yellow} szív{mint} el{olive} {2}{mint}-tól!" - } - - "Leech2" - { - "hu" "{olive}{1}{mint} már nem szív{yellow} életet{mint} el{olive} {2}{mint}-tól!" - } - - "LeechAmmo" - { - "hu" "Elhasználtad a távolsági pióca képességed összes lőszerét." - } - "LeechDetails" { "hu" "Elszívod az életet a túlélőktől." } - "LeechHuman" - { - "hu" "Aktiváltad{olive} {1}{mint}/{olive}{2}{mint} az egyik pióca képességedet!" - } - - "LeechHuman2" - { - "hu" "Nem sikerült aktiválni a pióca képességedet. Próbáld újra." - } - - "LeechHuman3" - { - "hu" "A pióca képességednek még kell{yellow} {1} másodperc{mint} az újratöltéshez." - } - - "LeechHuman4" - { - "hu" "Nincsenek túlélők a közelben ahhoz hogy használni tudd a pióca képességedet." - } - - "LeechHuman5" - { - "hu" "A pióca képességed véget ért, az újratöltéséhez még kell{yellow} {1} másodperc{mint}." - } - - "LeechMenu" - { - "hu" "Pióca Képesség Információ" - } - - "LeechMenu2" - { - "hu" "Pióca Képesség" - } - "Lightning" { "hu" "{olive}{1}{mint} elindított egy{yellow} villám vihart{mint}!" @@ -3959,56 +3864,11 @@ "hu" "Minyon Képesség" } - "Necro" - { - "hu" "{olive}{1}{mint} visszahozta a közelben lévő speciális fertőzötteket!" - } - - "NecroAmmo" - { - "hu" "Elhasználtad a haláli képességed összes lőszerét." - } - "NecroDetails" { "hu" "Visszahozod a közelben lévő speciális fertőzötteket amikor meghalnak." } - "NecroHuman" - { - "hu" "Aktiváltad{olive} {1}{mint}/{olive}{2}{mint} az egyik haláli képességedet!" - } - - "NecroHuman2" - { - "hu" "Nem sikerült aktiválni a haláli képességedet. Próbáld újra." - } - - "NecroHuman3" - { - "hu" "Már aktiváltad a haláli képességedet." - } - - "NecroHuman4" - { - "hu" "A haláli képességednek még kell{yellow} {1} másodperc{mint} az újratöltéshez." - } - - "NecroHuman5" - { - "hu" "A haláli képességed véget ért, az újratöltéséhez még kell{yellow} {1} másodperc{mint}." - } - - "NecroMenu" - { - "hu" "Haláli Képesség Információ" - } - - "NecroMenu2" - { - "hu" "Haláli Képesség" - } - "Nullify" { "hu" "{olive}{1}{mint} hatástalanítja{olive} {2}{mint} összes sebzését!" @@ -4174,61 +4034,11 @@ "hu" "Pánik Képesség" } - "Pimp" - { - "hu" "{olive}{1}{mint} csapdossa{olive} {2}{mint}-t!" - } - - "Pimp2" - { - "hu" "{olive}{1}{mint} többé már nincs csapdosva!" - } - - "PimpAmmo" - { - "hu" "Elhasználtad a távolsági csapdosó képességed összes lőszerét." - } - "PimpDetails" { "hu" "Lecsapod a túlélőket." } - "PimpHuman" - { - "hu" "Aktiváltad{olive} {1}{mint}/{olive}{2}{mint} az egyik csapdosó képességedet!" - } - - "PimpHuman2" - { - "hu" "Nem sikerült aktiválni a csapdosó képességedet. Próbáld újra." - } - - "PimpHuman3" - { - "hu" "A csapdosó képességednek még kell{yellow} {1} másodperc{mint} az újratöltéshez." - } - - "PimpHuman4" - { - "hu" "Nincsenek túlélők a közelben ahhoz, hogy használni tudd a csapdosó képességedet." - } - - "PimpHuman5" - { - "hu" "A csapdosó képességed véget ért, az újratöltéséhez még kell{yellow} {1} másodperc{mint}." - } - - "PimpMenu" - { - "hu" "Csapdosó Képesség Információ" - } - - "PimpMenu2" - { - "hu" "Csapdosó Képesség" - } - "Puke" { "hu" "{olive}{1}{mint} lehányta{olive} {2}{mint}-t!" @@ -4539,6 +4349,16 @@ "hu" "{olive}{1}{mint} már nem regenerálja az életerejét!" } + "Regen3" + { + "hu" "{olive}{1}{mint} ellopott egy kis életerőt{olive} {2}{mint}-tol!" + } + + "Regen4" + { + "hu" "{olive}{1}{mint} ellopott egy kis életerőt{olive} {2}{mint}-tol!" + } + "RegenAmmo" { "hu" "Elhasználtad a regeneráló képességed összes lőszerét." @@ -4585,11 +4405,21 @@ } "Respawn" + { + "hu" "{olive}{1}{mint} visszahozta a közelben lévő speciális fertőzötteket!" + } + + "Respawn2" { "hu" "{olive}{1}{mint} visszahozta önmagát!" } "RespawnAmmo" + { + "hu" "Elhasználtad a haláli képességed összes lőszerét." + } + + "RespawnAmmo2" { "hu" "Elhasználtad az összes szikla záporodat." } @@ -4601,42 +4431,67 @@ "RespawnHuman" { - "hu" "Újjászületsz miután meghalsz!" + "hu" "Aktiváltad{olive} {1}{mint}/{olive}{2}{mint} az egyik haláli képességedet!" } "RespawnHuman2" { - "hu" "Azonnal újjászületsz a halálod pillanatában." + "hu" "Nem sikerült aktiválni a haláli képességedet. Próbáld újra." } "RespawnHuman3" { - "hu" "Aktiváltad{olive} {1}{mint}/{olive}{2}{mint} az egyik újjászületésedet!" + "hu" "Már aktiváltad a haláli képességedet." } - "RespawnMenu" + "RespawnHuman4" { - "hu" "Újjászületés Képesség Információ" + "hu" "A haláli képességednek még kell{yellow} {1} másodperc{mint} az újratöltéshez." } - "RespawnMenu2" + "RespawnHuman5" { - "hu" "Újjászületés Képesség" + "hu" "A haláli képességed véget ért, az újratöltéséhez még kell{yellow} {1} másodperc{mint}." } - "Restart" + "RespawnHuman6" { - "hu" "{olive}{1}{mint} rávette{olive} {2}{mint} -t hogy újrakezdje egy eltérő felszereléssel!" + "hu" "Újjászületsz miután meghalsz!" } - "RestartAmmo" + "RespawnHuman7" { - "hu" "Elhasználtad a távolsági újrakezdő képességed összes lőszerét." + "hu" "Azonnal újjászületsz a halálod pillanatában." } - "RestartDetails" + "RespawnHuman8" { - "hu" "Ráveszed a túlélőket arra hogy eltérő felszereléssel kezdjenek a pálya elejétől vagy egy társuk közelében." + "hu" "Aktiváltad{olive} {1}{mint}/{olive}{2}{mint} az egyik újjászületésedet!" + } + + "RespawnMenu" + { + "hu" "Újjászületés Képesség Információ" + } + + "RespawnMenu2" + { + "hu" "Újjászületés Képesség" + } + + "Restart" + { + "hu" "{olive}{1}{mint} rávette{olive} {2}{mint} -t hogy újrakezdje egy eltérő felszereléssel!" + } + + "RestartAmmo" + { + "hu" "Elhasználtad a távolsági újrakezdő képességed összes lőszerét." + } + + "RestartDetails" + { + "hu" "Ráveszed a túlélőket arra hogy eltérő felszereléssel kezdjenek a pálya elejétől vagy egy társuk közelében." } "RestartHuman" @@ -4676,12 +4531,12 @@ "Rock" { - "hu" "{olive}{1}{mint} szikla záport{yellow} indított{mint}!" + "hu" "{olive}{1}{mint} folyamatosan sziklákat dobál!" } "Rock2" { - "hu" "{olive}{1}{mint} szikla zápora véget ért!" + "hu" "{olive}{1}{mint} többé már nem dobál folyamatosan sziklákat!" } "RockAmmo" @@ -4696,27 +4551,27 @@ "RockHuman" { - "hu" "Aktiváltad{olive} {1}{mint}/{olive}{2}{mint} az egyik szikla záporodat!" + "hu" "Aktiváltad{olive} {1}{mint}/{olive}{2}{mint} az egyik folyamatos szikla képességedet!" } "RockHuman2" { - "hu" "Nem sikerült aktiválni a szikla záporodat. Próbáld újra." + "hu" "Nem sikerült aktiválni a folyamatos szikla képességedet. Próbáld újra." } "RockHuman3" { - "hu" "Már aktiváltad a szikla záporodat." + "hu" "Már aktiváltad a folyamatos szikla képességedet." } "RockHuman4" { - "hu" "A szikla zápor képességednek még kell{yellow} {1} másodperc{mint} az újratöltéshez." + "hu" "A folyamatos szikla képességednek még kell{yellow} {1} másodperc{mint} az újratöltéshez." } "RockHuman5" { - "hu" "A szikla zápor képességed véget ért, az újratöltéséhez még kell{yellow} {1} másodperc{mint}." + "hu" "A folyamatos szikla képességed véget ért, az újratöltés ideje{yellow} {1} másodperc{mint}." } "RockMenu" @@ -4729,111 +4584,16 @@ "hu" "Szikla Képesség" } - "Rocket" - { - "hu" "{olive}{1}{mint} elküldte{olive} {2}{mint}-t az űrbe!" - } - - "RocketAmmo" - { - "hu" "Elhasználtad a távolsági rakéta képességed összes lőszerét." - } - "RocketDetails" { "hu" "Az űrbe küldöd a túlélőket." } - "RocketHuman" - { - "hu" "Aktiváltad{olive} {1}{mint}/{olive}{2}{mint} az egyik rakéta képességedet!" - } - - "RocketHuman2" - { - "hu" "Nem sikerült aktiválni a rakéta képességedet. Próbáld újra." - } - - "RocketHuman3" - { - "hu" "A rakéta képességednek még kell{yellow} {1} másodperc{mint} az újratöltéshez." - } - - "RocketHuman4" - { - "hu" "Nincsenek túlélők a közelben ahhoz, hogy használni tudd a rakéta képességedet." - } - - "RocketHuman5" - { - "hu" "A rakéta képességed véget ért, az újratöltéséhez még kell{yellow} {1} másodperc{mint}." - } - - "RocketMenu" - { - "hu" "Rakéta Képesség Információ" - } - - "RocketMenu2" - { - "hu" "Rakéta Képesség" - } - - "Shake" - { - "hu" "{olive}{1}{mint} rázza{olive} {2}{mint}-t!" - } - - "Shake2" - { - "hu" "{olive}{1}{mint} többé már nem rázkódik!" - } - - "ShakeAmmo" - { - "hu" "Elhasználtad a távolsági rázó képességed összes lőszerét." - } - "ShakeDetails" { "hu" "Rázod a túlélők képernyőjét." } - "ShakeHuman" - { - "hu" "Aktiváltad{olive} {1}{mint}/{olive}{2}{mint} az egyik rázó képességedet!" - } - - "ShakeHuman2" - { - "hu" "Nem sikerült aktiválni a rázó képességedet. Próbáld újra." - } - - "ShakeHuman3" - { - "hu" "A rázó képességednek még kell{yellow} {1} másodperc{mint} az újratöltéshez." - } - - "ShakeHuman4" - { - "hu" "nincsenek túlélők a közelben ahhoz, hogy használni tudd a rázó képességedet." - } - - "ShakeHuman5" - { - "hu" "A rázó képességed véget ért, az újratöltéséhez még kell{yellow} {1} másodperc{mint}." - } - - "ShakeMenu" - { - "hu" "Rázó Képesség Információ" - } - - "ShakeMenu2" - { - "hu" "Rázó Képesség" - } - "Shield" { "hu" "{olive}{1}{mint} pajzsa{yellow} aktiválva{mint}!" @@ -5009,6 +4769,21 @@ "hu" "{olive}{1}{mint} halálra zúzta{olive} {2}{mint} -t!" } + "Smash2" + { + "hu" "{olive}{1}{mint} kamikazét adott{olive} {2}{mint}-nak!" + } + + "Smash3" + { + "hu" "{olive}{1}{mint} elküldte{olive} {2}{mint}-t az űrbe!" + } + + "Smash4" + { + "hu" "{olive}{1}{mint} lesújtott{olive} {2}{mint}-ra!" + } + "SmashAmmo" { "hu" "Elhasználtad a távolsági zúzó képességed összes lőszerét." @@ -5054,221 +4829,21 @@ "hu" "Zúzó Képesség" } - "Smite" - { - "hu" "{olive}{1}{mint} lesújtott{olive} {2}{mint}-ra!" - } - - "SmiteAmmo" - { - "hu" "Elhasználtad a távolsági lesújtó képességed összes lőszerét." - } - "SmiteDetails" { "hu" "Lesújtól a túlélőkre." } - "SmiteHuman" - { - "hu" "Aktiváltad{olive} {1}{mint}/{olive}{2}{mint} az egyik lesújtó képességedet!" - } - - "SmiteHuman2" - { - "hu" "Nem sikerült aktiválni a lesújtó képességedet. Próbáld újra." - } - - "SmiteHuman3" - { - "hu" "A lesújtó képességednek még kell{yellow} {1} másodperc{mint} az újratöltéshez." - } - - "SmiteHuman4" - { - "hu" "Nincsenek túlélők a közelben ahhoz, hogy használni tudd a lesújtó képességedet." - } - - "SmiteHuman5" - { - "hu" "A zúzó képességed véget ért, az újratöltés időtartama{yellow} {1} másodperc{mint}." - } - - "SmiteMenu" - { - "hu" "Lesújtó Képesség Információ" - } - - "SmiteMenu2" - { - "hu" "Lesújtó Képesség" - } - - "Spam" - { - "hu" "{olive}{1}{mint} folyamatosan sziklákat dobál!" - } - - "Spam2" - { - "hu" "{olive}{1}{mint} többé már nem dobál folyamatosan sziklákat!" - } - - "SpamAmmo" - { - "hu" "Elhasználtad a folyamatos képességed összes lőszerét." - } - "SpamDetails" { "hu" "Folyamatosan sziklákat dobálsz a túlélőkre." } - "SpamHuman" - { - "hu" "Aktiváltad{olive} {1}{mint}/{olive}{2}{mint} az egyik folyamatos szikla képességedet!" - } - - "SpamHuman2" - { - "hu" "Nem sikerült aktiválni a folyamatos szikla képességedet. Próbáld újra." - } - - "SpamHuman3" - { - "hu" "Már aktiváltad a folyamatos szikla képességedet." - } - - "SpamHuman4" - { - "hu" "A folyamatos szikla képességednek még kell{yellow} {1} másodperc{mint} az újratöltéshez." - } - - "SpamHuman5" - { - "hu" "A folyamatos szikla képességed véget ért, az újratöltés ideje{yellow} {1} másodperc{mint}." - } - - "SpamMenu" - { - "hu" "Folyamatos Képesség Információ" - } - - "SpamMenu2" - { - "hu" "Folyamatos Képesség" - } - - "Splash" - { - "hu" "{olive}{1}{mint} területi sebzést okoz a közelben lévő túlélőkre!" - } - - "Splash2" - { - "hu" "{olive}{1}{mint} többé már nem okoz területi sebzést a túlélőkre!" - } - - "SplashAmmo" - { - "hu" "Elhasználtad a területi sebzés képességed összes lőszerét." - } - - "SplashDetails" - { - "hu" "Folyamatosan területi sebzést okozol a közelben lévő túlélőkre." - } - - "SplashHuman" - { - "hu" "Aktiváltad{olive} {1}{mint}/{olive}{2}{mint} az egyik területi sebzés képességedet!" - } - - "SplashHuman2" - { - "hu" "Nem sikerült aktiválni a területi képességedet. Próbáld újra." - } - - "SplashHuman3" - { - "hu" "Már aktiváltad a területi képességedet." - } - - "SplashHuman4" - { - "hu" "A területi képességednek még kell{yellow} {1} másodperc{mint} az újratöltéshez." - } - - "SplashHuman5" - { - "hu" "A területi képességed véget ért, az újratöltés időtartama{yellow} {1} másodperc{mint}." - } - - "SplashMenu" - { - "hu" "Területi Képesség Információ" - } - - "SplashMenu2" - { - "hu" "Területi Képesség" - } - - "Splatter" - { - "hu" "{olive}{1}{mint} épp összefröcsköli{olive} {2}{mint} képernyőjét!" - } - - "Splatter2" - { - "hu" "{olive}{1}képernyője{mint} többé már nincs összefröcskölve{mint}!" - } - - "SplatterAmmo" - { - "hu" "Elhasználtad a Fröcskölő képességed összes lőszerét." - } - "SplatterDetails" { "hu" "Összefröcskölöd a túlélők képernyőjét." } - "SplatterHuman" - { - "hu" "Aktiváltad{olive} {1}{mint}/{olive}{2}{mint} fröcskölő képességedet!" - } - - "SplatterHuman2" - { - "hu" "Nem sikerült aktiválni a fröcskölő képességedet. Próbáld újra." - } - - "SplatterHuman3" - { - "hu" "A fröccsenő képességednek még kell{yellow} {1} másodperc(ek){mint} az újratöltéshez.." - } - - "SplatterHuman4" - { - "hu" "Nincsenek túlélők a közeledben akiken használhatnád a fröccsenő képességedet." - } - - "SplatterHuman5" - { - "hu" "A fröcskölő képességed véget ért, az újratöltéshez kell még{yellow} {1} másodperc{mint}." - } - - "SplatterMenu" - { - "hu" "Fröcskölő Képesség Információ" - } - - "SplatterMenu2" - { - "hu" "Fröcskölő Képesség" - } - "Throw" { "hu" "{olive}{1}{mint} dobott egy autót!" @@ -5494,32 +5069,47 @@ "hu" "Élőholt Képesség" } - "Vampire" + "VampireDetails" { - "hu" "{olive}{1}{mint} életerőt lopott{olive} {2}{mint}-tol!" + "hu" "Életerőt kapsz ha bántod a túlélőket." } - "VampireDetails" + "Vision" { - "hu" "Életerőt kapsz ha bántod a túlélőket." + "hu" "{olive}{1}{mint} megvakította{olive} {2}{mint}!" } - "VampireMenu" + "Vision2" { - "hu" "Vámpír Képesség Információ" + "hu" "{olive}{1}{mint} többé már nem vak!" } - "VampireMenu2" + "Vision3" { - "hu" "Vámpír Képesség" + "hu" "{olive}{1}{mint} rázza{olive} {2}{mint}-t!" } - "Vision" + "Vision4" + { + "hu" "{olive}{1}{mint} többé már nem rázkódik!" + } + + "Vision5" + { + "hu" "{olive}{1}{mint} épp összefröcsköli{olive} {2}{mint} képernyőjét!" + } + + "Vision6" + { + "hu" "{olive}{1}képernyője{mint} többé már nincs összefröcskölve{mint}!" + } + + "Vision7" { "hu" "{olive}{1}{mint} megváltoztatta{olive} {2}{mint} látómezejét{yellow} {3}{mint}-ra/re!" } - "Vision2" + "Vision8" { "hu" "{olive}{1}{mint} látómezeje visszaállt{yellow} {2}{mint}-ra/re!" } @@ -5759,31 +5349,11 @@ "hu" "Boszorka Képesség" } - "Xiphos" - { - "hu" "{olive}{1}{mint} ellopott egy kis életerőt{olive} {2}{mint}-tol!" - } - - "Xiphos2" - { - "hu" "{olive}{1}{mint} ellopott egy kis életerőt{olive} {2}{mint}-tol!" - } - "XiphosDetails" { "hu" "Életerőt tudsz lopni a túlélőktől, és fordítva." } - "XiphosMenu" - { - "hu" "Xipho Képesség Információ" - } - - "XiphosMenu2" - { - "hu" "Xipho Képesség" - } - "Yell" { "hu" "{olive}{1}{mint} ráordított a túlélőkre" @@ -5839,58 +5409,8 @@ "hu" "Üvöltő Képesség" } - "Zombie" - { - "hu" "{olive}{1}{mint} időszakosan zombikat hozz létre!" - } - - "Zombie2" - { - "hu" "{olive}{1}{mint} zombikat{yellow} hozott létre{mint}!" - } - - "ZombieAmmo" - { - "hu" "Elhasználtad a zombi létrehozó képességed összes lőszerét." - } - "ZombieDetails" { "hu" "Zombikat hozol létre." } - - "ZombieHuman" - { - "hu" "Aktiváltad{olive} {1}{mint}/{olive}{2}{mint} az egyik zombi létrehozó képességedet!" - } - - "ZombieHuman2" - { - "hu" "Nem sikerült aktiválni a zombi létrehozó képességedet. Próbáld újra." - } - - "ZombieHuman3" - { - "hu" "Már aktiváltad a zombi létrehozó képességedet." - } - - "ZombieHuman4" - { - "hu" "A zombi létrehozó képességednek még kell{yellow} {1} másodperc{mint} az újratöltéshez." - } - - "ZombieHuman5" - { - "hu" "A zombi létrehozó képességed véget ért, az újratöltés időtartama{yellow} {1} másodperc{mint}." - } - - "ZombieMenu" - { - "hu" "Zombi Képesség Információ" - } - - "ZombieMenu2" - { - "hu" "Zombi Képesség" - } } \ No newline at end of file diff --git a/addons/sourcemod/translations/hu/mutant_tanks_names.phrases.txt b/addons/sourcemod/translations/hu/mutant_tanks_names.phrases.txt index 434ea7b930..bad477ef57 100644 --- a/addons/sourcemod/translations/hu/mutant_tanks_names.phrases.txt +++ b/addons/sourcemod/translations/hu/mutant_tanks_names.phrases.txt @@ -54,6 +54,11 @@ "hu" "Elnyelő Boszorka" } + "Common #1 Name" + { + "hu" "Elnyelő Fertőzöttek" + } + "Tank #1" { "hu" "{mint}Ez a Tank elnyeli a sebzések nagy részét amit kap." @@ -94,6 +99,11 @@ "hu" "{mint}Ez a Boszorka elnyeli a sebzések nagy részét amit kap." } + "Common #1" + { + "hu" "{mint}Ez a Fertőzöttek elnyeli a sebzések nagy részét amit kap." + } + "Tank #2 Name" { "hu" "Savas Tank" @@ -134,6 +144,11 @@ "hu" "Savas Boszorka" } + "Common #2 Name" + { + "hu" "Savas Fertőzöttek" + } + "Tank #2" { "hu" "{mint}Ez a Tank savas pocsolyákat hozhat létre a túlélők alatt." @@ -174,6 +189,11 @@ "hu" "{mint}Ez a Boszorka savas pocsolyákat hozhat létre a túlélők alatt." } + "Common #2" + { + "hu" "{mint}Ez a Fertőzöttek savas pocsolyákat hozhat létre a túlélők alatt." + } + "Tank #3 Name" { "hu" "Céltalan Tank" @@ -214,6 +234,11 @@ "hu" "Céltalan Boszorka" } + "Common #3 Name" + { + "hu" "Céltalan Fertőzöttek" + } + "Tank #3" { "hu" "{mint}Ez a Tank megakadályozza a túlélőket a célzásban." @@ -254,6 +279,11 @@ "hu" "{mint}Ez a Boszorka megakadályozza a túlélőket a célzásban." } + "Common #3" + { + "hu" "{mint}Ez a Fertőzöttek megakadályozza a túlélőket a célzásban." + } + "Tank #4 Name" { "hu" "Lőszer Tank" @@ -294,6 +324,11 @@ "hu" "Lőszer Boszorka" } + "Common #4 Name" + { + "hu" "Lőszer Fertőzöttek" + } + "Tank #4" { "hu" "{mint}Ez a Tank ellophat tőled egy kis lőszert, vagy az egészet." @@ -334,6 +369,11 @@ "hu" "{mint}Ez a Boszorka ellophat tőled egy kis lőszert, vagy az egészet." } + "Common #4" + { + "hu" "{mint}Ez a Fertőzöttek ellophat tőled egy kis lőszert, vagy az egészet." + } + "Tank #5 Name" { "hu" "Vak Tank" @@ -374,6 +414,11 @@ "hu" "Vak Boszorka" } + "Common #5 Name" + { + "hu" "Vak Fertőzöttek" + } + "Tank #5" { "hu" "{mint}Ez a Tank megvakíthatja a túlélőket." @@ -414,6 +459,11 @@ "hu" "{mint}Ez a Boszorka megvakíthatja a túlélőket." } + "Common #5" + { + "hu" "{mint}Ez a Fertőzöttek megvakíthatja a túlélőket." + } + "Tank #6 Name" { "hu" "Bombázó Tank" @@ -454,6 +504,11 @@ "hu" "Bombázó Boszorka" } + "Common #6 Name" + { + "hu" "Bombázó Fertőzöttek" + } + "Tank #6" { "hu" "{mint}Ez a Tank robbanásokat okozhat és immunis a robbanásokra." @@ -494,6 +549,11 @@ "hu" "{mint}Ez a Boszorka robbanásokat okozhat és immunis a robbanásokra." } + "Common #6" + { + "hu" "{mint}Ez a Fertőzöttek robbanásokat okozhat és immunis a robbanásokra." + } + "Tank #7 Name" { "hu" "Pukkancs Tank" @@ -534,6 +594,11 @@ "hu" "Pukkancs Boszorka" } + "Common #7 Name" + { + "hu" "Pukkancs Fertőzöttek" + } + "Tank #7" { "hu" "{mint}Ez a Tank pukkancsokat hozhat létre, és dobhat is párat a túlélők felé." @@ -574,6 +639,11 @@ "hu" "{mint}Ez a Boszorka pukkancsokat hozhat létre." } + "Common #7" + { + "hu" "{mint}Ez a Fertőzöttek pukkancsokat hozhat létre." + } + "Tank #8 Name" { "hu" "Golyóálló Tank" @@ -614,6 +684,11 @@ "hu" "Golyóálló Boszorka" } + "Common #8 Name" + { + "hu" "Golyóálló Fertőzöttek" + } + "Tank #8" { "hu" "{mint}Ez a Tank immunis a lőszer sebzésre." @@ -654,6 +729,11 @@ "hu" "{mint}Ez a Boszorka immunis a lőszer sebzésre." } + "Common #8" + { + "hu" "{mint}Ez a Fertőzöttek immunis a lőszer sebzésre." + } + "Tank #9 Name" { "hu" "Eltemető Tank" @@ -694,6 +774,11 @@ "hu" "Eltemető Boszorka" } + "Common #9 Name" + { + "hu" "Eltemető Fertőzöttek" + } + "Tank #9" { "hu" "{mint}Ez a Tank eltemetheti a túlélőket." @@ -734,6 +819,11 @@ "hu" "{mint}Ez a Boszorka eltemetheti a túlélőket." } + "Common #9" + { + "hu" "{mint}Ez a Fertőzöttek eltemetheti a túlélőket." + } + "Tank #10 Name" { "hu" "Autó Tank" @@ -774,6 +864,11 @@ "hu" "Autó Boszorka" } + "Common #10 Name" + { + "hu" "Autó Fertőzöttek" + } + "Tank #10" { "hu" "{mint}Ez a Tank autókat dobhat a túlélők felé. Az autók eltűnnek 30mp után." @@ -814,6 +909,11 @@ "hu" "{mint}Ez a Boszorka autókat záporokat indít. Az autók eltűnnek 30mp után." } + "Common #10" + { + "hu" "{mint}Ez a Fertőzöttek autókat záporokat indít. Az autók eltűnnek 30mp után." + } + "Tank #11 Name" { "hu" "Rohanó Tank" @@ -854,6 +954,11 @@ "hu" "Rohanó Boszorka" } + "Common #11 Name" + { + "hu" "Rohanó Fertőzöttek" + } + "Tank #11" { "hu" "{mint}Ez a Tank rohanókat hozhat létre, és dobhat is párat a túlélők felé." @@ -894,6 +999,11 @@ "hu" "{mint}Ez a Boszorka rohanókat hozhat létre." } + "Common #11" + { + "hu" "{mint}Ez a Fertőzöttek rohanókat hozhat létre." + } + "Tank #12 Name" { "hu" "Elzáró Tank" @@ -934,6 +1044,11 @@ "hu" "Elzáró Boszorka" } + "Common #12 Name" + { + "hu" "Elzáró Fertőzöttek" + } + "Tank #12" { "hu" "{mint}Ez a Tank fojtogatja a túlélőket a levegőben." @@ -974,6 +1089,11 @@ "hu" "{mint}Ez a Boszorka fojtogatja a túlélőket a levegőben." } + "Common #12" + { + "hu" "{mint}Ez a Fertőzöttek fojtogatja a túlélőket a levegőben." + } + "Tank #13 Name" { "hu" "Klón Tank" @@ -1014,6 +1134,11 @@ "hu" "Klón Boszorka" } + "Common #13 Name" + { + "hu" "Klón Fertőzöttek" + } + "Tank #13" { "hu" "{mint}Ez a Tank klónokat hozhat létre, és dobhat is párat a túlélők felé." @@ -1054,6 +1179,11 @@ "hu" "{mint}Ez a Boszorka klónokat hozhat létre." } + "Common #13" + { + "hu" "{mint}Ez a Fertőzöttek klónokat hozhat létre." + } + "Tank #14 Name" { "hu" "Felhős Tank" @@ -1094,6 +1224,11 @@ "hu" "Felhős Boszorka" } + "Common #14 Name" + { + "hu" "Felhős Fertőzöttek" + } + "Tank #14" { "hu" "{mint}Ez a Tank füstfelhőket hoz létre, ami sebzi a benne lévő túlélőket" @@ -1134,6 +1269,11 @@ "hu" "{mint}Ez a Boszorka füstfelhőket hoz létre, ami sebzi a benne lévő túlélőket" } + "Common #14" + { + "hu" "{mint}Ez a Fertőzöttek füstfelhőket hoz létre, ami sebzi a benne lévő túlélőket" + } + "Tank #15 Name" { "hu" "Dobó Tank" @@ -1174,6 +1314,11 @@ "hu" "Dobó Boszorka" } + "Common #15 Name" + { + "hu" "Dobó Fertőzöttek" + } + "Tank #15" { "hu" "{mint}Ez a Tank véletlenszerű fegyvereket dob a halála után." @@ -1214,6 +1359,11 @@ "hu" "{mint}Ez a Boszorka véletlenszerű fegyvereket dob a halála után." } + "Common #15" + { + "hu" "{mint}Ez a Fertőzöttek véletlenszerű fegyvereket dob a halála után." + } + "Tank #16 Name" { "hu" "Drogozó Tank" @@ -1254,6 +1404,11 @@ "hu" "Drogozó Boszorka" } + "Common #16 Name" + { + "hu" "Drogozó Fertőzöttek" + } + "Tank #16" { "hu" "{mint}Ez a Tank bedrogozhatja a túlélőket." @@ -1294,6 +1449,11 @@ "hu" "{mint}Ez a Boszorka bedrogozhatja a túlélőket." } + "Common #16" + { + "hu" "{mint}Ez a Fertőzöttek bedrogozhatja a túlélőket." + } + "Tank #17 Name" { "hu" "Részeg Tank" @@ -1334,6 +1494,11 @@ "hu" "Részeg Boszorka" } + "Common #17 Name" + { + "hu" "Részeg Fertőzöttek" + } + "Tank #17" { "hu" "{mint}Ez a Tank részeggé teheti a túlélőket." @@ -1374,6 +1539,11 @@ "hu" "{mint}Ez a Boszorka részeggé teheti a túlélőket." } + "Common #17" + { + "hu" "{mint}Ez a Fertőzöttek részeggé teheti a túlélőket." + } + "Tank #18 Name" { "hu" "Elektromos Tank" @@ -1414,6 +1584,11 @@ "hu" "Elektromos Boszorka" } + "Common #18 Name" + { + "hu" "Elektromos Fertőzöttek" + } + "Tank #18" { "hu" "{mint}Ez a Tank megrázhatja a túlélőket." @@ -1454,6 +1629,11 @@ "hu" "{mint}Ez a Boszorka megrázhatja a túlélőket." } + "Common #18" + { + "hu" "{mint}Ez a Fertőzöttek megrázhatja a túlélőket." + } + "Tank #19 Name" { "hu" "Végrehajtó Tank" @@ -1494,6 +1674,11 @@ "hu" "Végrehajtó Boszorka" } + "Common #19 Name" + { + "hu" "Végrehajtó Fertőzöttek" + } + "Tank #19" { "hu" "{mint}Ez a Tank ráveheti a túlélőket arra hogy bizonyos fegyvereket használjanak egy bizonyos ideig." @@ -1534,6 +1719,11 @@ "hu" "{mint}Ez a Boszorka ráveheti a túlélőket arra hogy bizonyos fegyvereket használjanak egy bizonyos ideig." } + "Common #19" + { + "hu" "{mint}Ez a Fertőzöttek ráveheti a túlélőket arra hogy bizonyos fegyvereket használjanak egy bizonyos ideig." + } + "Tank #20 Name" { "hu" "Gyors Tank" @@ -1574,6 +1764,11 @@ "hu" "Gyors Boszorka" } + "Common #20 Name" + { + "hu" "Gyors Fertőzöttek" + } + "Tank #20" { "hu" "{mint}Ez a Tank olyan gyorsan fut mint Flash." @@ -1614,6 +1809,11 @@ "hu" "{mint}Ez a Boszorka olyan gyorsan fut mint Flash." } + "Common #20" + { + "hu" "{mint}Ez a Fertőzöttek olyan gyorsan fut mint Flash." + } + "Tank #21 Name" { "hu" "Tűzálló Tank" @@ -1654,6 +1854,11 @@ "hu" "Tűzálló Boszorka" } + "Common #21 Name" + { + "hu" "Tűzálló Fertőzöttek" + } + "Tank #21" { "hu" "{mint}Ez a Tank tüzeket hozhat létre és immunis a tűzre." @@ -1694,6 +1899,11 @@ "hu" "{mint}Ez a Boszorka tüzeket hozhat létre és immunis a tűzre." } + "Common #21" + { + "hu" "{mint}Ez a Fertőzöttek tüzeket hozhat létre és immunis a tűzre." + } + "Tank #22 Name" { "hu" "Hajító Tank" @@ -1734,6 +1944,11 @@ "hu" "Hajító Boszorka" } + "Common #22 Name" + { + "hu" "Hajító Fertőzöttek" + } + "Tank #22" { "hu" "{mint}Ez a Tank elhajítja a túlélőket a levegőbe." @@ -1774,6 +1989,11 @@ "hu" "{mint}Ez a Boszorka elhajítja a túlélőket a levegőbe." } + "Common #22" + { + "hu" "{mint}Ez a Fertőzöttek elhajítja a túlélőket a levegőbe." + } + "Tank #23 Name" { "hu" "Repülő Tank" @@ -1814,6 +2034,11 @@ "hu" "Repülő Boszorka" } + "Common #23 Name" + { + "hu" "Repülő Fertőzöttek" + } + "Tank #23" { "hu" "{mint}Ez a Tank körbe-körbe repül, áldozatokat keresve." @@ -1854,6 +2079,11 @@ "hu" "{mint}Ez a Boszorka körbe-körbe repül, áldozatokat keresve." } + "Common #23" + { + "hu" "{mint}Ez a Fertőzöttek körbe-körbe repül, áldozatokat keresve." + } + "Tank #24 Name" { "hu" "Törékeny Tank" @@ -1894,6 +2124,11 @@ "hu" "Törékeny Boszorka" } + "Common #24 Name" + { + "hu" "Törékeny Fertőzöttek" + } + "Tank #24" { "hu" "{mint}Ez a Tank érzékenyebb a sebzésre, de közben többet sebez és gyorsabban fut." @@ -1934,6 +2169,11 @@ "hu" "{mint}Ez a Boszorka érzékenyebb a sebzésre, de közben többet sebez és gyorsabban fut." } + "Common #24" + { + "hu" "{mint}Ez a Fertőzöttek érzékenyebb a sebzésre, de közben többet sebez és gyorsabban fut." + } + "Tank #25 Name" { "hu" "Szellem Tank" @@ -1974,6 +2214,11 @@ "hu" "Szellem Boszorka" } + "Common #25 Name" + { + "hu" "Szellem Fertőzöttek" + } + "Tank #25" { "hu" "{mint}Ez a Tank álcázhatja magát és lefegyverezheti a túlélőket." @@ -2014,6 +2259,11 @@ "hu" "{mint}Ez a Boszorka álcázhatja magát és lefegyverezheti a túlélőket." } + "Common #25" + { + "hu" "{mint}Ez a Fertőzöttek álcázhatja magát és lefegyverezheti a túlélőket." + } + "Tank #26 Name" { "hu" "Isteni Tank" @@ -2054,6 +2304,11 @@ "hu" "Isteni Boszorka" } + "Common #26 Name" + { + "hu" "Isteni Fertőzöttek" + } + "Tank #26" { "hu" "{mint}Ez a Tank ideiglenes legyőzhetetlenséget kaphat." @@ -2094,6 +2349,11 @@ "hu" "{mint}Ez a Boszorka ideiglenes legyőzhetetlenséget kaphat." } + "Common #26" + { + "hu" "{mint}Ez a Fertőzöttek ideiglenes legyőzhetetlenséget kaphat." + } + "Tank #27 Name" { "hu" "Gravitációs Tank" @@ -2134,6 +2394,11 @@ "hu" "Gravitációs Boszorka" } + "Common #27 Name" + { + "hu" "Gravitációs Fertőzöttek" + } + "Tank #27" { "hu" "{mint}Ez a Tank magához húzhatja a túlélőket és a fertőzötteket és csökkentheti a túlélők gravitációját." @@ -2174,6 +2439,11 @@ "hu" "{mint}Ez a Boszorka magához húzhatja a túlélőket és a fertőzötteket és csökkentheti a túlélők gravitációját." } + "Common #27" + { + "hu" "{mint}Ez a Fertőzöttek magához húzhatja a túlélőket és a fertőzötteket és csökkentheti a túlélők gravitációját." + } + "Tank #28 Name" { "hu" "Tüzér Tank" @@ -2214,6 +2484,11 @@ "hu" "Tüzér Boszorka" } + "Common #28 Name" + { + "hu" "Tüzér Fertőzöttek" + } + "Tank #28" { "hu" "{mint}Ez a Tank képes felfegyverkezni és lövéseket leadni a túlélőkre." @@ -2254,6 +2529,11 @@ "hu" "{mint}Ez a Boszorka képes felfegyverkezni és lövéseket leadni a túlélőkre." } + "Common #28" + { + "hu" "{mint}Ez a Fertőzöttek képes felfegyverkezni és lövéseket leadni a túlélőkre." + } + "Tank #29 Name" { "hu" "Egészséges Tank" @@ -2294,6 +2574,11 @@ "hu" "Egészséges Boszorka" } + "Common #29 Name" + { + "hu" "Egészséges Fertőzöttek" + } + "Tank #29" { "hu" "{mint}Ez a Tank ideiglenes életerőt adhat a túlélőknek, és életerőt nyelhet el a közeli fertőzöttektől." @@ -2334,6 +2619,11 @@ "hu" "{mint}Ez a Boszorka ideiglenes életerőt adhat a túlélőknek, és életerőt nyelhet el a közeli fertőzöttektől." } + "Common #29" + { + "hu" "{mint}Ez a Fertőzöttek ideiglenes életerőt adhat a túlélőknek, és életerőt nyelhet el a közeli fertőzöttektől." + } + "Tank #30 Name" { "hu" "Ütős Tank" @@ -2374,6 +2664,11 @@ "hu" "Ütős Boszorka" } + "Common #30 Name" + { + "hu" "Ütős Fertőzöttek" + } + "Tank #30" { "hu" "{mint}Ez a Tank csak a fejlövés sebzi." @@ -2414,6 +2709,11 @@ "hu" "{mint}Ez a Boszorka csak a fejlövés sebzi." } + "Common #30" + { + "hu" "{mint}Ez a Fertőzöttek csak a fejlövés sebzi." + } + "Tank #31 Name" { "hu" "Vadász Tank" @@ -2454,6 +2754,11 @@ "hu" "Vadász Boszorka" } + "Common #31 Name" + { + "hu" "Vadász Fertőzöttek" + } + "Tank #31" { "hu" "{mint}Ez a Tank Vadászokat hozhat létre, és dobhat is párat a túlélők felé." @@ -2494,6 +2799,11 @@ "hu" "{mint}Ez a Boszorka Vadászokat hozhat létre." } + "Common #31" + { + "hu" "{mint}Ez a Fertőzöttek Vadászokat hozhat létre." + } + "Tank #32 Name" { "hu" "Bántó Tank" @@ -2534,6 +2844,11 @@ "hu" "Bántó Boszorka" } + "Common #32 Name" + { + "hu" "Bántó Fertőzöttek" + } + "Tank #32" { "hu" "{mint}Ez a Tank folyamatosan bántja a túlélőket egy bizonyos időn belül." @@ -2574,6 +2889,11 @@ "hu" "{mint}Ez a Boszorka folyamatosan bántja a túlélőket egy bizonyos időn belül." } + "Common #32" + { + "hu" "{mint}Ez a Fertőzöttek folyamatosan bántja a túlélőket egy bizonyos időn belül." + } + "Tank #33 Name" { "hu" "Hipnotizáló Tank" @@ -2614,6 +2934,11 @@ "hu" "Hipnotizáló Boszorka" } + "Common #33 Name" + { + "hu" "Hipnotizáló Fertőzöttek" + } + "Tank #33" { "hu" "{mint}Ez a Tank hipnotizálhatja a túlélőket, hogy magukat vagy a társaikat támadják." @@ -2654,6 +2979,11 @@ "hu" "{mint}Ez a Boszorka hipnotizálhatja a túlélőket, hogy magukat vagy a társaikat támadják." } + "Common #33" + { + "hu" "{mint}Ez a Fertőzöttek hipnotizálhatja a túlélőket, hogy magukat vagy a társaikat támadják." + } + "Tank #34 Name" { "hu" "Fagyos Tank" @@ -2694,6 +3024,11 @@ "hu" "Fagyos Boszorka" } + "Common #34 Name" + { + "hu" "Fagyos Fertőzöttek" + } + "Tank #34" { "hu" "{mint}Ez a Tank megfagyasztja a túlélőket." @@ -2734,6 +3069,11 @@ "hu" "{mint}Ez a Boszorka megfagyasztja a túlélőket." } + "Common #34" + { + "hu" "{mint}Ez a Fertőzöttek megfagyasztja a túlélőket." + } + "Tank #35 Name" { "hu" "Tétlen Tank" @@ -2774,6 +3114,11 @@ "hu" "Tétlen Boszorka" } + "Common #35 Name" + { + "hu" "Tétlen Fertőzöttek" + } + "Tank #35" { "hu" "{mint}Ez a Tank ráveheti a túlélőket arra hogy szünetet tartsanak. (Botokra ez nem hat.)" @@ -2814,6 +3159,11 @@ "hu" "{mint}Ez a Boszorka ráveheti a túlélőket arra hogy szünetet tartsanak. (Botokra ez nem hat.)" } + "Common #35" + { + "hu" "{mint}Ez a Fertőzöttek ráveheti a túlélőket arra hogy szünetet tartsanak. (Botokra ez nem hat.)" + } + "Tank #36 Name" { "hu" "Felcserélő Tank" @@ -2854,6 +3204,11 @@ "hu" "Felcserélő Boszorka" } + "Common #36 Name" + { + "hu" "Felcserélő Fertőzöttek" + } + "Tank #36" { "hu" "{mint}Ez a Tank felcserélheti a túlélők irányítási gombjait." @@ -2894,6 +3249,11 @@ "hu" "{mint}Ez a Boszorka felcserélheti a túlélők irányítási gombjait." } + "Common #36" + { + "hu" "{mint}Ez a Fertőzöttek felcserélheti a túlélők irányítási gombjait." + } + "Tank #37 Name" { "hu" "Áru Tank" @@ -2934,6 +3294,11 @@ "hu" "Áru Boszorka" } + "Common #37 Name" + { + "hu" "Áru Fertőzöttek" + } + "Tank #37" { "hu" "{mint}Ez a Tank árukat adhat a túlélőknek miután meghalt." @@ -2974,6 +3339,11 @@ "hu" "{mint}Ez a Boszorka árukat adhat a túlélőknek miután meghalt." } + "Common #37" + { + "hu" "{mint}Ez a Fertőzöttek árukat adhat a túlélőknek miután meghalt." + } + "Tank #38 Name" { "hu" "Zsoké Tank" @@ -3014,6 +3384,11 @@ "hu" "Zsoké Boszorka" } + "Common #38 Name" + { + "hu" "Zsoké Fertőzöttek" + } + "Tank #38" { "hu" "{mint}Ez a Tank Zsokékat hozhat létre és dobhat egy párat a túlélők felé is." @@ -3054,6 +3429,11 @@ "hu" "{mint}Ez a Boszorka Zsokékat hozhat létre és dobhat egy párat a túlélők felé is." } + "Common #38" + { + "hu" "{mint}Ez a Fertőzöttek Zsokékat hozhat létre és dobhat egy párat a túlélők felé is." + } + "Tank #39 Name" { "hu" "Ugró Tank" @@ -3094,6 +3474,11 @@ "hu" "Ugró Boszorka" } + "Common #39 Name" + { + "hu" "Ugró Fertőzöttek" + } + "Tank #39" { "hu" "{mint}Ez a Tank időszakosan ugrálhat és ráveheti a túlélőket a kontrollálhatatlan ugrálásra is." @@ -3134,6 +3519,11 @@ "hu" "{mint}Ez a Boszorka időszakosan ugrálhat és ráveheti a túlélőket a kontrollálhatatlan ugrálásra is." } + "Common #39" + { + "hu" "{mint}Ez a Fertőzöttek időszakosan ugrálhat és ráveheti a túlélőket a kontrollálhatatlan ugrálásra is." + } + "Tank #40 Name" { "hu" "Öngyilkos Tank" @@ -3174,6 +3564,11 @@ "hu" "Öngyilkos Boszorka" } + "Common #40 Name" + { + "hu" "Öngyilkos Fertőzöttek" + } + "Tank #40" { "hu" "{mint}Ez a Tank megölheti magát, vihet egy túlélő áldozatot is." @@ -3214,6 +3609,11 @@ "hu" "{mint}Ez a Boszorka megölheti magát, vihet egy túlélő áldozatot is." } + "Common #40" + { + "hu" "{mint}Ez a Fertőzöttek megölheti magát, vihet egy túlélő áldozatot is." + } + "Tank #41 Name" { "hu" "Késleltető Tank" @@ -3254,6 +3654,11 @@ "hu" "Késleltető Boszorka" } + "Common #41 Name" + { + "hu" "Késleltető Fertőzöttek" + } + "Tank #41" { "hu" "{mint}Ez a Tank késleltetheti a túlélőket." @@ -3294,6 +3699,11 @@ "hu" "{mint}Ez a Boszorka késleltetheti a túlélőket." } + "Common #41" + { + "hu" "{mint}Ez a Fertőzöttek késleltetheti a túlélőket." + } + "Tank #42 Name" { "hu" "Lézer Tank" @@ -3334,6 +3744,11 @@ "hu" "Lézer Boszorka" } + "Common #42 Name" + { + "hu" "Lézer Fertőzöttek" + } + "Tank #42" { "hu" "{mint}Ez a Tank lézereket lőhet a túlélők felé." @@ -3374,6 +3789,11 @@ "hu" "{mint}Ez a Boszorka lézereket lőhet a túlélők felé." } + "Common #42" + { + "hu" "{mint}Ez a Fertőzöttek lézereket lőhet a túlélők felé." + } + "Tank #43 Name" { "hu" "Pióca Tank" @@ -3414,6 +3834,11 @@ "hu" "Pióca Boszorka" } + "Common #43 Name" + { + "hu" "Pióca Fertőzöttek" + } + "Tank #43" { "hu" "{mint}Ez a Tank életet szívhat el a túlélőktől." @@ -3454,7 +3879,12 @@ "hu" "{mint}Ez a Boszorka életet szívhat el a túlélőktől." } - "Tank #44 Name" + "Common #43" + { + "hu" "{mint}Ez a Fertőzöttek életet szívhat el a túlélőktől." + } + + "Tank #44 Name" { "hu" "Villám Tank" } @@ -3494,6 +3924,11 @@ "hu" "Villám Boszorka" } + "Common #44 Name" + { + "hu" "Villám Fertőzöttek" + } + "Tank #44" { "hu" "{mint}Ez a Tank villám viharokat indít." @@ -3534,6 +3969,11 @@ "hu" "{mint}Ez a Boszorka villám viharokat indít." } + "Common #44" + { + "hu" "{mint}Ez a Fertőzöttek villám viharokat indít." + } + "Tank #45 Name" { "hu" "Gyógyító Tank" @@ -3574,6 +4014,11 @@ "hu" "Gyógyító Boszorka" } + "Common #45 Name" + { + "hu" "Gyógyító Fertőzöttek" + } + "Tank #45" { "hu" "{mint}Ez a Tank gyógyítja a közeli speciális fertőzötteket a halála pillanatában." @@ -3614,6 +4059,11 @@ "hu" "{mint}Ez a Boszorka gyógyítja a közeli speciális fertőzötteket a halála pillanatában." } + "Common #45" + { + "hu" "{mint}Ez a Fertőzöttek gyógyítja a közeli speciális fertőzötteket a halála pillanatában." + } + "Tank #46 Name" { "hu" "Meteor Tank" @@ -3654,6 +4104,11 @@ "hu" "Meteor Boszorka" } + "Common #46 Name" + { + "hu" "Meteor Fertőzöttek" + } + "Tank #46" { "hu" "{mint}Ez a Tank meteor záport indíthat, meteorokkal ami elég és felrobban pár másodperc múlva." @@ -3694,6 +4149,11 @@ "hu" "{mint}Ez a Boszorka meteor záport indíthat, meteorokkal ami elég és felrobban pár másodperc múlva." } + "Common #46" + { + "hu" "{mint}Ez a Fertőzöttek meteor záport indíthat, meteorokkal ami elég és felrobban pár másodperc múlva." + } + "Tank #47 Name" { "hu" "Nekromanta Tank" @@ -3734,6 +4194,11 @@ "hu" "Nekromanta Boszorka" } + "Common #47 Name" + { + "hu" "Nekromanta Fertőzöttek" + } + "Tank #47" { "hu" "{mint}Ez a Tank visszahozhatja a halott speciális fertőzötteket." @@ -3774,6 +4239,11 @@ "hu" "{mint}Ez a Boszorka visszahozhatja a halott speciális fertőzötteket." } + "Common #47" + { + "hu" "{mint}Ez a Fertőzöttek visszahozhatja a halott speciális fertőzötteket." + } + "Tank #48 Name" { "hu" "Hatástalanító Tank" @@ -3814,6 +4284,11 @@ "hu" "Hatástalanító Boszorka" } + "Common #48 Name" + { + "hu" "Hatástalanító Fertőzöttek" + } + "Tank #48" { "hu" "{mint}Ez a Tank hatástalanítja a túlélők sebzését, ezáltal védve önmagát." @@ -3854,6 +4329,11 @@ "hu" "{mint}Ez a Boszorka hatástalanítja a túlélők sebzését, ezáltal védve önmagát." } + "Common #48" + { + "hu" "{mint}Ez a Fertőzöttek hatástalanítja a túlélők sebzését, ezáltal védve önmagát." + } + "Tank #49 Name" { "hu" "Mindenható Tank" @@ -3894,6 +4374,11 @@ "hu" "Mindenható Boszorka" } + "Common #49 Name" + { + "hu" "Mindenható Fertőzöttek" + } + "Tank #49" { "hu" "{mint}Ez a Tank hozzáfér a többi közel lévő Mutáns Tank képességeihez." @@ -3934,6 +4419,11 @@ "hu" "{mint}Ez a Boszorka hozzáfér a többi közel lévő Mutáns Boszorka képességeihez." } + "Common #49" + { + "hu" "{mint}Ez a Boszorka hozzáfér a többi közel lévő Mutáns Fertőzöttek képességeihez." + } + "Tank #50 Name" { "hu" "Pánik Tank" @@ -3974,6 +4464,11 @@ "hu" "Pánik Boszorka" } + "Common #50 Name" + { + "hu" "Pánik Fertőzöttek" + } + "Tank #50" { "hu" "{mint}Ez a Tank pánik eseményt indíthat, nagyon sok zombival." @@ -4014,6 +4509,11 @@ "hu" "{mint}Ez a Boszorka pánik eseményt indíthat, nagyon sok zombival." } + "Common #50" + { + "hu" "{mint}Ez a Fertőzöttek pánik eseményt indíthat, nagyon sok zombival." + } + "Tank #51 Name" { "hu" "Háziállat Tank" @@ -4054,6 +4554,11 @@ "hu" "Háziállat Boszorka" } + "Common #51 Name" + { + "hu" "Háziállat Fertőzöttek" + } + "Tank #51" { "hu" "{mint}Ez a Tank lojális a túlélőkhöz és szeret öleléseket adni." @@ -4094,6 +4599,11 @@ "hu" "{mint}Ez a Boszorka lojális a túlélőkhöz és szeret öleléseket adni." } + "Common #51" + { + "hu" "{mint}Ez a Fertőzöttek lojális a túlélőkhöz és szeret öleléseket adni." + } + "Tank #52 Name" { "hu" "Csapdosó Tank" @@ -4134,6 +4644,11 @@ "hu" "Csapdosó Boszorka" } + "Common #52 Name" + { + "hu" "Csapdosó Fertőzöttek" + } + "Tank #52" { "hu" "{mint}Ez a Tank folyamatosan csapdossa a túlélőket, megmutatja nekik ki a főnök." @@ -4174,6 +4689,11 @@ "hu" "{mint}Ez a Boszorka folyamatosan csapdossa a túlélőket, megmutatja nekik ki a főnök." } + "Common #52" + { + "hu" "{mint}Ez a Fertőzöttek folyamatosan csapdossa a túlélőket, megmutatja nekik ki a főnök." + } + "Tank #53 Name" { "hu" "Platina Tank" @@ -4214,6 +4734,11 @@ "hu" "Platina Boszorka" } + "Common #53 Name" + { + "hu" "Platina Fertőzöttek" + } + "Tank #53" { "hu" "{mint}Ez a Tank immunis a közelharci sebzésre." @@ -4254,6 +4779,11 @@ "hu" "{mint}Ez a Boszorka immunis a közelharci sebzésre." } + "Common #53" + { + "hu" "{mint}Ez a Fertőzöttek immunis a közelharci sebzésre." + } + "Tank #54 Name" { "hu" "Hányó Tank" @@ -4294,6 +4824,11 @@ "hu" "Hányó Boszorka" } + "Common #54 Name" + { + "hu" "Hányó Fertőzöttek" + } + "Tank #54" { "hu" "{mint}Ez a Tank lehányhatja a túlélőket." @@ -4334,6 +4869,11 @@ "hu" "{mint}Ez a Boszorka lehányhatja a túlélőket." } + "Common #54" + { + "hu" "{mint}Ez a Fertőzöttek lehányhatja a túlélőket." + } + "Tank #55 Name" { "hu" "Piromániás Tank" @@ -4374,6 +4914,11 @@ "hu" "Piromániás Boszorka" } + "Common #55 Name" + { + "hu" "Piromániás Fertőzöttek" + } + "Tank #55" { "hu" "{mint}Ez a Tank gyorsabb lesz ha felgyújtják." @@ -4414,6 +4959,11 @@ "hu" "{mint}Ez a Boszorka gyorsabb lesz ha felgyújtják." } + "Common #55" + { + "hu" "{mint}Ez a Fertőzöttek gyorsabb lesz ha felgyújtják." + } + "Tank #56 Name" { "hu" "Csendes Tank" @@ -4454,6 +5004,11 @@ "hu" "Csendes Boszorka" } + "Common #56 Name" + { + "hu" "Csendes Fertőzöttek" + } + "Tank #56" { "hu" "{mint}Ez a Tank lenémíthatja magát a túlélők elől." @@ -4494,6 +5049,11 @@ "hu" "{mint}Ez a Boszorka lenémíthatja magát a túlélők elől." } + "Common #56" + { + "hu" "{mint}Ez a Fertőzöttek lenémíthatja magát a túlélők elől." + } + "Tank #57 Name" { "hu" "Visszahívás Tank" @@ -4534,6 +5094,11 @@ "hu" "Visszahívás Boszorka" } + "Common #57 Name" + { + "hu" "Visszahívás Fertőzöttek" + } + "Tank #57" { "hu" "{mint}Ez a Tank képes az időutazásra, ezzel bosszantva a túlélőket." @@ -4574,6 +5139,11 @@ "hu" "{mint}Ez a Boszorka képes az időutazásra, ezzel bosszantva a túlélőket." } + "Common #57" + { + "hu" "{mint}Ez a Fertőzöttek képes az időutazásra, ezzel bosszantva a túlélőket." + } + "Tank #58 Name" { "hu" "Visszarúgó Tank" @@ -4614,6 +5184,11 @@ "hu" "Visszarúgó Boszorka" } + "Common #58 Name" + { + "hu" "Visszarúgó Fertőzöttek" + } + "Tank #58" { "hu" "{mint}Ez a Tank erős visszarúgást adhat a túlélőknek." @@ -4654,6 +5229,11 @@ "hu" "{mint}Ez a Boszorka erős visszarúgást adhat a túlélőknek." } + "Common #58" + { + "hu" "{mint}Ez a Fertőzöttek erős visszarúgást adhat a túlélőknek." + } + "Tank #59 Name" { "hu" "Regeneráló Tank" @@ -4694,6 +5274,11 @@ "hu" "Regeneráló Boszorka" } + "Common #59 Name" + { + "hu" "Regeneráló Fertőzöttek" + } + "Tank #59" { "hu" "{mint}Ez a Tank életerőt regenerál minden másodpercben." @@ -4734,6 +5319,11 @@ "hu" "{mint}Ez a Boszorka életerőt regenerál minden másodpercben." } + "Common #59" + { + "hu" "{mint}Ez a Fertőzöttek életerőt regenerál minden másodpercben." + } + "Tank #60 Name" { "hu" "Újjászülető Tank" @@ -4774,6 +5364,11 @@ "hu" "Újjászülető Boszorka" } + "Common #60 Name" + { + "hu" "Újjászülető Fertőzöttek" + } + "Tank #60" { "hu" "{mint}Ez a Tank újjászülethet a halála pillanatában." @@ -4814,6 +5409,11 @@ "hu" "{mint}Ez a Boszorka újjászülethet a halála pillanatában." } + "Common #60" + { + "hu" "{mint}Ez a Fertőzöttek újjászülethet a halála pillanatában." + } + "Tank #61 Name" { "hu" "Újraindító Tank" @@ -4854,6 +5454,11 @@ "hu" "Újraindító Boszorka" } + "Common #61 Name" + { + "hu" "Újraindító Fertőzöttek" + } + "Tank #61" { "hu" "{mint}Ez a Tank ráveheti a túlélőket arra, hogy új felszereléssel kezdjenek előröl." @@ -4894,6 +5499,11 @@ "hu" "{mint}Ez a Boszorka ráveheti a túlélőket arra, hogy új felszereléssel kezdjenek előröl." } + "Common #61" + { + "hu" "{mint}Ez a Fertőzöttek ráveheti a túlélőket arra, hogy új felszereléssel kezdjenek előröl." + } + "Tank #62 Name" { "hu" "Szikla Tank" @@ -4934,6 +5544,11 @@ "hu" "Szikla Boszorka" } + "Common #62 Name" + { + "hu" "Szikla Fertőzöttek" + } + "Tank #62" { "hu" "{mint}Ez a Tank szikla záporokat indít." @@ -4974,6 +5589,11 @@ "hu" "{mint}Ez a Boszorka szikla záporokat indít." } + "Common #62" + { + "hu" "{mint}Ez a Fertőzöttek szikla záporokat indít." + } + "Tank #63 Name" { "hu" "Rakétaszakértő Tank" @@ -5014,6 +5634,11 @@ "hu" "Rakétaszakértő Boszorka" } + "Common #63 Name" + { + "hu" "Rakétaszakértő Fertőzöttek" + } + "Tank #63" { "hu" "{mint}Ez a Tank az űrbe küldheti a túlélőket." @@ -5054,6 +5679,11 @@ "hu" "{mint}Ez a Boszorka az űrbe küldheti a túlélőket." } + "Common #63" + { + "hu" "{mint}Ez a Fertőzöttek az űrbe küldheti a túlélőket." + } + "Tank #64 Name" { "hu" "Öndobó Tank" @@ -5094,6 +5724,11 @@ "hu" "Öndobó Boszorka" } + "Common #64 Name" + { + "hu" "Öndobó Fertőzöttek" + } + "Tank #64" { "hu" "{mint}Ez a Tank eldobhatja magát a túlélők felé." @@ -5134,6 +5769,11 @@ "hu" "{mint}Ez a Boszorka eldobhatja magát a túlélők felé." } + "Common #64" + { + "hu" "{mint}Ez a Fertőzöttek eldobhatja magát a túlélők felé." + } + "Tank #65 Name" { "hu" "Rázó Tank" @@ -5174,6 +5814,11 @@ "hu" "Rázó Boszorka" } + "Common #65 Name" + { + "hu" "Rázó Fertőzöttek" + } + "Tank #65" { "hu" "{mint}Ez a Tank megrázza a túlélők képernyőjét." @@ -5214,6 +5859,11 @@ "hu" "{mint}Ez a Boszorka megrázza a túlélők képernyőjét." } + "Common #65" + { + "hu" "{mint}Ez a Fertőzöttek megrázza a túlélők képernyőjét." + } + "Tank #66 Name" { "hu" "Pajzs Tank" @@ -5254,6 +5904,11 @@ "hu" "Pajzs Boszorka" } + "Common #66 Name" + { + "hu" "Pajzs Fertőzöttek" + } + "Tank #66" { "hu" "{mint}Ez a Tank egy pajzzsal születik, propán tartályokat vagy benzines kannákat dobál. Ezek segítségével a túlélők áttörhetnek a pajzson." @@ -5294,6 +5949,11 @@ "hu" "{mint}Ez a Boszorka egy pajzzsal születik." } + "Common #66" + { + "hu" "{mint}Ez a Fertőzöttek egy pajzzsal születik." + } + "Tank #67 Name" { "hu" "Lökő Tank" @@ -5334,6 +5994,11 @@ "hu" "Lökő Boszorka" } + "Common #67 Name" + { + "hu" "Lökő Fertőzöttek" + } + "Tank #67" { "hu" "{mint}Ez a Tank mindenhova lökdösi a túlélőket." @@ -5374,6 +6039,11 @@ "hu" "{mint}Ez a Boszorka mindenhova lökdösi a túlélőket." } + "Common #67" + { + "hu" "{mint}Ez a Fertőzöttek mindenhova lökdösi a túlélőket." + } + "Tank #68 Name" { "hu" "Lassú Tank" @@ -5414,6 +6084,11 @@ "hu" "Lassú Boszorka" } + "Common #68 Name" + { + "hu" "Lassú Fertőzöttek" + } + "Tank #68" { "hu" "{mint}Ez a Tank letudja lassítani a túlélőket." @@ -5454,6 +6129,11 @@ "hu" "{mint}Ez a Boszorka letudja lassítani a túlélőket." } + "Common #68" + { + "hu" "{mint}Ez a Fertőzöttek letudja lassítani a túlélőket." + } + "Tank #69 Name" { "hu" "Zúzó Tank" @@ -5494,6 +6174,11 @@ "hu" "Zúzó Boszorka" } + "Common #69 Name" + { + "hu" "Zúzó Fertőzöttek" + } + "Tank #69" { "hu" "{mint}Ez a Tank a halálba tudja zúzni a túlélőket." @@ -5534,6 +6219,11 @@ "hu" "{mint}Ez a Boszorka a halálba tudja zúzni a túlélőket." } + "Common #69" + { + "hu" "{mint}Ez a Fertőzöttek a halálba tudja zúzni a túlélőket." + } + "Tank #70 Name" { "hu" "Lecsapó Tank" @@ -5574,6 +6264,11 @@ "hu" "Lecsapó Boszorka" } + "Common #70 Name" + { + "hu" "Lecsapó Fertőzöttek" + } + "Tank #70" { "hu" "{mint}Ez a Tank letudja csapni a túlélőket, ezzel azonnali halált okozva." @@ -5614,6 +6309,11 @@ "hu" "{mint}Ez a Boszorka letudja csapni a túlélőket, ezzel azonnali halált okozva." } + "Common #70" + { + "hu" "{mint}Ez a Fertőzöttek letudja csapni a túlélőket, ezzel azonnali halált okozva." + } + "Tank #71 Name" { "hu" "Füstös Tank" @@ -5654,6 +6354,11 @@ "hu" "Füstös Boszorka" } + "Common #71 Name" + { + "hu" "Füstös Fertőzöttek" + } + "Tank #71" { "hu" "{mint}Ez a Tank tud Füstösöket létrehozni, és dobni is egy párat a túlélők felé." @@ -5694,6 +6399,11 @@ "hu" "{mint}Ez a Boszorka tud Füstösöket létrehozni, és dobni is egy párat a túlélők felé." } + "Common #71" + { + "hu" "{mint}Ez a Fertőzöttek tud Füstösöket létrehozni, és dobni is egy párat a túlélők felé." + } + "Tank #72 Name" { "hu" "Kéretlen Tank" @@ -5734,6 +6444,11 @@ "hu" "Kéretlen Boszorka" } + "Common #72 Name" + { + "hu" "Kéretlen Fertőzöttek" + } + "Tank #72" { "hu" "{mint}Ez a Tank folyamatosan sziklákat dobál a túlélők felé." @@ -5774,6 +6489,11 @@ "hu" "{mint}Ez a Boszorka folyamatosan sziklákat dobál a túlélők felé." } + "Common #72" + { + "hu" "{mint}Ez a Fertőzöttek folyamatosan sziklákat dobál a túlélők felé." + } + "Tank #73 Name" { "hu" "Speciális Tank" @@ -5814,6 +6534,11 @@ "hu" "Speciális Boszorka" } + "Common #73 Name" + { + "hu" "Speciális Fertőzöttek" + } + "Tank #73" { "hu" "{mint}Ez a Tank tud létrehozni véletlenszerű speciális fertőzötteket, és dobni is egy párat a túlélők felé." @@ -5854,6 +6579,11 @@ "hu" "{mint}Ez a Boszorka tud létrehozni véletlenszerű speciális fertőzötteket." } + "Common #73" + { + "hu" "{mint}Ez a Fertőzöttek tud létrehozni véletlenszerű speciális fertőzötteket." + } + "Tank #74 Name" { "hu" "köpködő Tank" @@ -5894,6 +6624,11 @@ "hu" "köpködő Boszorka" } + "Common #74 Name" + { + "hu" "köpködő Fertőzöttek" + } + "Tank #74" { "hu" "{mint}Ez a Tank tud Köpködőket létrehozni, és dobni is egy párat a túlélők felé." @@ -5934,6 +6669,11 @@ "hu" "{mint}Ez a Boszorka tud Köpködőket létrehozni." } + "Common #74" + { + "hu" "{mint}Ez a Fertőzöttek tud Köpködőket létrehozni." + } + "Tank #75 Name" { "hu" "Területsebző Tank" @@ -5974,6 +6714,11 @@ "hu" "Területsebző Boszorka" } + "Common #75 Name" + { + "hu" "Területsebző Fertőzöttek" + } + "Tank #75" { "hu" "{mint}Ez a Tank területi sebzést okoz egy bizonyos távolságon belül." @@ -6014,6 +6759,11 @@ "hu" "{mint}Ez a Boszorka területi sebzést okoz egy bizonyos távolságon belül." } + "Common #75" + { + "hu" "{mint}Ez a Fertőzöttek területi sebzést okoz egy bizonyos távolságon belül." + } + "Tank #76 Name" { "hu" "Fröcskölő Tank" @@ -6054,6 +6804,11 @@ "hu" "Fröcskölő Boszorka" } + "Common #76 Name" + { + "hu" "Fröcskölő Fertőzöttek" + } + "Tank #76" { "hu" "{mint}Ez a Tank mindenki képernyőjét befröcsköli." @@ -6094,6 +6849,11 @@ "hu" "{mint}Ez a Boszorka mindenki képernyőjét befröcsköli." } + "Common #76" + { + "hu" "{mint}Ez a Fertőzöttek mindenki képernyőjét befröcsköli." + } + "Tank #77 Name" { "hu" "Eldobó Tank" @@ -6134,6 +6894,11 @@ "hu" "Eldobó Boszorka" } + "Common #77 Name" + { + "hu" "Eldobó Fertőzöttek" + } + "Tank #77" { "hu" "{mint}Ez a Tank tud dobni autókat, speciális fertőzötteket, Tankokat, Boszorkákat, és saját magát!" @@ -6174,6 +6939,11 @@ "hu" "{mint}Ez a Boszorka tud dobni autókat, speciális fertőzötteket, Tankokat, Boszorkákat, és saját magát!" } + "Common #77" + { + "hu" "{mint}Ez a Fertőzöttek tud dobni autókat, speciális fertőzötteket, Tankokat, Boszorkákat, és saját magát!" + } + "Tank #78 Name" { "hu" "Követő Tank" @@ -6214,6 +6984,11 @@ "hu" "Követő Boszorka" } + "Common #78 Name" + { + "hu" "Követő Fertőzöttek" + } + "Tank #78" { "hu" "{mint}Ez a Tank olyan sziklákat dob, ami követi a közelben lévő túlélőket." @@ -6254,6 +7029,11 @@ "hu" "{mint}Ez a Boszorka olyan sziklákat dob, ami követi a közelben lévő túlélőket." } + "Common #78" + { + "hu" "{mint}Ez a Fertőzöttek olyan sziklákat dob, ami követi a közelben lévő túlélőket." + } + "Tank #79 Name" { "hu" "Végső Tank" @@ -6294,6 +7074,11 @@ "hu" "Végső Boszorka" } + "Common #79 Name" + { + "hu" "Végső Fertőzöttek" + } + "Tank #79" { "hu" "{mint}Ez a Tank ideiglenes halhatatlanságot és sebzést növelést kap, amikor már kevés az életereje." @@ -6334,6 +7119,11 @@ "hu" "{mint}Ez a Boszorka ideiglenes halhatatlanságot és sebzést növelést kap, amikor már kevés az életereje." } + "Common #79" + { + "hu" "{mint}Ez a Fertőzöttek ideiglenes halhatatlanságot és sebzést növelést kap, amikor már kevés az életereje." + } + "Tank #80 Name" { "hu" "Halhatatlan Tank" @@ -6374,6 +7164,11 @@ "hu" "Halhatatlan Boszorka" } + "Common #80 Name" + { + "hu" "Halhatatlan Fertőzöttek" + } + "Tank #80" { "hu" "{mint}Ez a Tank visszanyeri a teljes életerejét, amikor már közel jár a halálhoz." @@ -6414,6 +7209,11 @@ "hu" "{mint}Ez a Boszorka visszanyeri a teljes életerejét, amikor már közel jár a halálhoz." } + "Common #80" + { + "hu" "{mint}Ez a Fertőzöttek visszanyeri a teljes életerejét, amikor már közel jár a halálhoz." + } + "Tank #81 Name" { "hu" "Vámpír Tank" @@ -6454,6 +7254,11 @@ "hu" "Vámpír Boszorka" } + "Common #81 Name" + { + "hu" "Vámpír Fertőzöttek" + } + "Tank #81" { "hu" "{mint}Ez a Tank életerőt lophat a túlélőktől." @@ -6494,6 +7299,11 @@ "hu" "{mint}Ez a Boszorka életerőt lophat a túlélőktől." } + "Common #81" + { + "hu" "{mint}Ez a Fertőzöttek életerőt lophat a túlélőktől." + } + "Tank #82 Name" { "hu" "Vizuális Tank" @@ -6534,6 +7344,11 @@ "hu" "Vizuális Boszorka" } + "Common #82 Name" + { + "hu" "Vizuális Fertőzöttek" + } + "Tank #82" { "hu" "{mint}Ez a Tank megváltoztatja a túlélők látómezejét." @@ -6574,6 +7389,11 @@ "hu" "{mint}Ez a Boszorka megváltoztatja a túlélők látómezejét." } + "Common #82" + { + "hu" "{mint}Ez a Fertőzöttek megváltoztatja a túlélők látómezejét." + } + "Tank #83 Name" { "hu" "Teleportáló Tank" @@ -6614,6 +7434,11 @@ "hu" "Teleportáló Boszorka" } + "Common #83 Name" + { + "hu" "Teleportáló Fertőzöttek" + } + "Tank #83" { "hu" "{mint}Ez a Tank véletlenszerűen egy túlélőhöz teleportál." @@ -6654,6 +7479,11 @@ "hu" "{mint}Ez a Boszorka véletlenszerűen egy túlélőhöz teleportál." } + "Common #83" + { + "hu" "{mint}Ez a Fertőzöttek véletlenszerűen egy túlélőhöz teleportál." + } + "Tank #84 Name" { "hu" "Örvénylő Tank" @@ -6694,6 +7524,11 @@ "hu" "Örvénylő Boszorka" } + "Common #84 Name" + { + "hu" "Örvénylő Fertőzöttek" + } + "Tank #84" { "hu" "{mint}Ez a Tank megpörgeti a túlélőket." @@ -6734,6 +7569,11 @@ "hu" "{mint}Ez a Boszorka megpörgeti a túlélőket." } + "Common #84" + { + "hu" "{mint}Ez a Fertőzöttek megpörgeti a túlélőket." + } + "Tank #85 Name" { "hu" "Boszorka Tank" @@ -6774,6 +7614,11 @@ "hu" "Boszorka Boszorka" } + "Common #85 Name" + { + "hu" "Boszorka Fertőzöttek" + } + "Tank #85" { "hu" "{mint}Ez a Tank Boszorkává alakítja a közeli fertőzötteket, és dob is párat a túlélők felé." @@ -6814,6 +7659,11 @@ "hu" "{mint}Ez a Boszorka Boszorkává alakítja a közeli fertőzötteket." } + "Common #85" + { + "hu" "{mint}Ez a Fertőzöttek Boszorkává alakítja a közeli fertőzötteket." + } + "Tank #86 Name" { "hu" "Xiphos Tank" @@ -6854,6 +7704,11 @@ "hu" "Xiphos Boszorka" } + "Common #86 Name" + { + "hu" "Xiphos Fertőzöttek" + } + "Tank #86" { "hu" "{mint}Ez a Tank tud életerőt lopni a túlélőktől és fordítva." @@ -6894,6 +7749,11 @@ "hu" "{mint}Ez a Boszorka tud életerőt lopni a túlélőktől és fordítva." } + "Common #86" + { + "hu" "{mint}Ez a Fertőzöttek tud életerőt lopni a túlélőktől és fordítva." + } + "Tank #87 Name" { "hu" "Üvöltő Tank" @@ -6934,6 +7794,11 @@ "hu" "Üvöltő Boszorka" } + "Common #87 Name" + { + "hu" "Üvöltő Fertőzöttek" + } + "Tank #87" { "hu" "{mint}Ez a Tank tud üvölteni, így megsüketítve a túlélőket." @@ -6974,6 +7839,11 @@ "hu" "{mint}Ez a Boszorka tud üvölteni, így megsüketítve a túlélőket." } + "Common #87" + { + "hu" "{mint}Ez a Fertőzöttek tud üvölteni, így megsüketítve a túlélőket." + } + "Tank #88 Name" { "hu" "Zombi Tank" @@ -7014,6 +7884,11 @@ "hu" "Zombi Boszorka" } + "Common #88 Name" + { + "hu" "Zombi Fertőzöttek" + } + "Tank #88" { "hu" "{mint}Ez a Tank hordákat hoz létre." @@ -7054,6 +7929,11 @@ "hu" "{mint}Ez a Boszorka hordákat hoz létre." } + "Common #88" + { + "hu" "{mint}Ez a Fertőzöttek hordákat hoz létre." + } + "Tank #89 Name" { "hu" "Armageddon Tank" @@ -7094,6 +7974,11 @@ "hu" "Armageddon Boszorka" } + "Common #89 Name" + { + "hu" "Armageddon Fertőzöttek" + } + "Tank #89" { "hu" "{mint}Ez a Tank immunis a robbanásokra, magához húzza a túlélőket és fertőzötteket, meteor záport indít." @@ -7134,6 +8019,11 @@ "hu" "{mint}Ez a Boszorka immunis a robbanásokra, magához húzza a túlélőket és fertőzötteket, meteor záport indít." } + "Common #89" + { + "hu" "{mint}Ez a Fertőzöttek immunis a robbanásokra, magához húzza a túlélőket és fertőzötteket, meteor záport indít." + } + "Tank #90 Name" { "hu" "Főnök Tank" @@ -7174,6 +8064,11 @@ "hu" "Főnök Boszorka" } + "Common #90 Name" + { + "hu" "Főnök Fertőzöttek" + } + "Tank #90" { "hu" "{mint}Tűz immunitás, gyors, álcázza magát, lefegyverzi a túlélőket, magához húzza és megváltoztatja a túlélők gravitációját, időszakosan ugrik, meteor záport indít, pajzzsal születik, lecsapja a túlélőket, túlélőkhöz teleportál, és Boszorkákat/zombikat hozz létre." @@ -7214,6 +8109,11 @@ "hu" "{mint}Tűz immunitás, gyors, álcázza magát, lefegyverzi a túlélőket, magához húzza és megváltoztatja a túlélők gravitációját, időszakosan ugrik, meteor záport indít, pajzzsal születik, lecsapja a túlélőket, túlélőkhöz teleportál, és Boszorkákat/zombikat hozz létre." } + "Common #90" + { + "hu" "{mint}Tűz immunitás, gyors, álcázza magát, lefegyverzi a túlélőket, magához húzza és megváltoztatja a túlélők gravitációját, időszakosan ugrik, meteor záport indít, pajzzsal születik, lecsapja a túlélőket, túlélőkhöz teleportál, és Boszorkákat/zombikat hozz létre." + } + "Tank #91 Name" { "hu" "Kobalt Tank" @@ -7254,6 +8154,11 @@ "hu" "Kobalt Boszorka" } + "Common #91 Name" + { + "hu" "Kobalt Fertőzöttek" + } + "Tank #91" { "hu" "{mint}Ez a Tank immunis a tűzre és nagyon gyorsan fut." @@ -7294,6 +8199,11 @@ "hu" "{mint}Ez a Boszorka immunis a tűzre és nagyon gyorsan fut." } + "Common #91" + { + "hu" "{mint}Ez a Fertőzöttek immunis a tűzre és nagyon gyorsan fut." + } + "Tank #92 Name" { "hu" "Elterelő Tank" @@ -7334,6 +8244,11 @@ "hu" "Elterelő Boszorka" } + "Common #92 Name" + { + "hu" "Elterelő Fertőzöttek" + } + "Tank #92" { "hu" "{mint}Ez a Tank időszakosan ugrik, ráveszi a túlélőket arra hogy kontrollálhatatlanul ugráljanak, és a túlélőkhöz teleportál." @@ -7374,6 +8289,11 @@ "hu" "{mint}Ez a Boszorka időszakosan ugrik, ráveszi a túlélőket arra hogy kontrollálhatatlanul ugráljanak, és a túlélőkhöz teleportál." } + "Common #92" + { + "hu" "{mint}Ez a Fertőzöttek időszakosan ugrik, ráveszi a túlélőket arra hogy kontrollálhatatlanul ugráljanak, és a túlélőkhöz teleportál." + } + "Tank #93 Name" { "hu" "Visszaverő Tank" @@ -7414,6 +8334,11 @@ "hu" "Visszaverő Boszorka" } + "Common #93 Name" + { + "hu" "Visszaverő Fertőzöttek" + } + "Tank #93" { "hu" "{mint}Ez a Tank ellöki magától a túlélőket." @@ -7454,6 +8379,11 @@ "hu" "{mint}Ez a Boszorka ellöki magától a túlélőket." } + "Common #93" + { + "hu" "{mint}Ez a Fertőzöttek ellöki magától a túlélőket." + } + "Tank #94 Name" { "hu" "Flash Tank" @@ -7494,6 +8424,11 @@ "hu" "Flash Boszorka" } + "Common #94 Name" + { + "hu" "Flash Fertőzöttek" + } + "Tank #94" { "hu" "{mint}Ez a Tank nagyon gyorsan tud futni, elektromosságot dob a túlélőkre, lelassítja az időt maga körül, miközben ideiglenesen legyőzhetetlen." @@ -7534,6 +8469,11 @@ "hu" "{mint}Ez a Boszorka nagyon gyorsan tud futni, lelassítja az időt maga körül, miközben ideiglenesen legyőzhetetlen." } + "Common #94" + { + "hu" "{mint}Ez a Fertőzöttek nagyon gyorsan tud futni, lelassítja az időt maga körül, miközben ideiglenesen legyőzhetetlen." + } + "Tank #95 Name" { "hu" "Góliát Tank" @@ -7574,6 +8514,11 @@ "hu" "Góliát Boszorka" } + "Common #95 Name" + { + "hu" "Góliát Fertőzöttek" + } + "Tank #95" { "hu" "{mint}Tűz immunitás, lassan mozog, ideiglenes életerőt ad a túlélőknek, életerőt szív el a közeli fertőzöttektől, pajzzsal születik, és lecsapja a túlélőket." @@ -7614,6 +8559,11 @@ "hu" "{mint}Tűz immunitás, lassan mozog, ideiglenes életerőt ad a túlélőknek, életerőt szív el a közeli fertőzöttektől, pajzzsal születik, és lecsapja a túlélőket." } + "Common #95" + { + "hu" "{mint}Tűz immunitás, lassan mozog, ideiglenes életerőt ad a túlélőknek, életerőt szív el a közeli fertőzöttektől, pajzzsal születik, és lecsapja a túlélőket." + } + "Tank #96 Name" { "hu" "Hallucináció Tank" @@ -7654,6 +8604,11 @@ "hu" "Hallucináció Boszorka" } + "Common #96 Name" + { + "hu" "Hallucináció Fertőzöttek" + } + "Tank #96" { "hu" "{mint}Tűz immunitás, álcázza magát, és a túlélőkhöz teleportál." @@ -7694,6 +8649,11 @@ "hu" "{mint}Tűz immunitás, álcázza magát, és a túlélőkhöz teleportál." } + "Common #96" + { + "hu" "{mint}Tűz immunitás, álcázza magát, és a túlélőkhöz teleportál." + } + "Tank #97 Name" { "hu" "Mém Tank" @@ -7734,6 +8694,11 @@ "hu" "Mém Boszorka" } + "Common #97 Name" + { + "hu" "Mém Fertőzöttek" + } + "Tank #97" { "hu" "{mint}Tűz immunitás, sebzés elnyelés, gyorsan fut, álcázza magát, magához vonzza a túlélőket és megváltoztatja a gravitációjukat, magasra ugrik, meteor záport indít, lecsapja a túlélőket, sziklákat dobál folyamatosan, túlélőkhöz teleportál, és Boszorkákat/zombikat hoz létre." @@ -7774,6 +8739,11 @@ "hu" "{mint}Tűz immunitás, sebzés elnyelés, gyorsan fut, álcázza magát, magához vonzza a túlélőket és megváltoztatja a gravitációjukat, magasra ugrik, meteor záport indít, lecsapja a túlélőket, sziklákat dobál folyamatosan, túlélőkhöz teleportál, és Boszorkákat/zombikat hoz létre." } + "Common #97" + { + "hu" "{mint}Tűz immunitás, sebzés elnyelés, gyorsan fut, álcázza magát, magához vonzza a túlélőket és megváltoztatja a gravitációjukat, magasra ugrik, meteor záport indít, lecsapja a túlélőket, sziklákat dobál folyamatosan, túlélőkhöz teleportál, és Boszorkákat/zombikat hoz létre." + } + "Tank #98 Name" { "hu" "Káprázat Tank" @@ -7814,6 +8784,11 @@ "hu" "Káprázat Boszorka" } + "Common #98 Name" + { + "hu" "Káprázat Fertőzöttek" + } + "Tank #98" { "hu" "{mint}Ez a Tank immunis a tűzre, gyorsan fut, és a túlélőkhöz teleportál." @@ -7854,6 +8829,11 @@ "hu" "{mint}Ez a Boszorka immunis a tűzre, gyorsan fut, és a túlélőkhöz teleportál." } + "Common #98" + { + "hu" "{mint}Ez a Fertőzöttek immunis a tűzre, gyorsan fut, és a túlélőkhöz teleportál." + } + "Tank #99 Name" { "hu" "Kísértet Tank" @@ -7894,6 +8874,11 @@ "hu" "Kísértet Boszorka" } + "Common #99 Name" + { + "hu" "Kísértet Fertőzöttek" + } + "Tank #99" { "hu" "{mint}Ez a Tank immunis a tűzre, gyorsan fut, álcázza magát, és a túlélőkhöz teleportál." @@ -7934,6 +8919,11 @@ "hu" "{mint}Ez a Boszorka immunis a tűzre, gyorsan fut, álcázza magát, és a túlélőkhöz teleportál." } + "Common #99" + { + "hu" "{mint}Ez a Fertőzöttek immunis a tűzre, gyorsan fut, álcázza magát, és a túlélőkhöz teleportál." + } + "Tank #100 Name" { "hu" "Elmebeteg Tank" @@ -7974,6 +8964,11 @@ "hu" "Elmebeteg Boszorka" } + "Common #100 Name" + { + "hu" "Elmebeteg Fertőzöttek" + } + "Tank #100" { "hu" "{mint}Ez a Tank ideiglenes életerőt ad a túlélőknek, életerőt szív el a közeli fertőzöttektől, meteor záport indít, pajzzsal születik, és a túlélőkhöz teleportál." @@ -8014,6 +9009,11 @@ "hu" "{mint}Ez a Boszorka ideiglenes életerőt ad a túlélőknek, életerőt szív el a közeli fertőzöttektől, meteor záport indít, pajzzsal születik, és a túlélőkhöz teleportál." } + "Common #100" + { + "hu" "{mint}Ez a Fertőzöttek ideiglenes életerőt ad a túlélőknek, életerőt szív el a közeli fertőzöttektől, meteor záport indít, pajzzsal születik, és a túlélőkhöz teleportál." + } + "Tank #101 Name" { "hu" "Fordító Tank" @@ -8054,6 +9054,11 @@ "hu" "Fordító Boszorka" } + "Common #101 Name" + { + "hu" "Fordító Fertőzöttek" + } + "Tank #101" { "hu" "{mint}Ez a Tank immunis a tűzre, nagyon gyorsan fut, és teleportál a túlélőkhöz." @@ -8094,6 +9099,11 @@ "hu" "{mint}Ez a Boszorka immunis a tűzre, nagyon gyorsan fut, és teleportál a túlélőkhöz." } + "Common #101" + { + "hu" "{mint}Ez a Fertőzöttek immunis a tűzre, nagyon gyorsan fut, és teleportál a túlélőkhöz." + } + "Tank #102 Name" { "hu" "Létrehozó Tank" @@ -8134,6 +9144,11 @@ "hu" "Létrehozó Boszorka" } + "Common #102 Name" + { + "hu" "Létrehozó Fertőzöttek" + } + "Tank #102" { "hu" "{mint}Ez a Tank zombikat hoz létre egy füstfelhő mögött." @@ -8174,6 +9189,11 @@ "hu" "{mint}Ez a Boszorka zombikat hoz létre egy füstfelhő mögött." } + "Common #102" + { + "hu" "{mint}Ez a Fertőzöttek zombikat hoz létre egy füstfelhő mögött." + } + "Tank #103 Name" { "hu" "Közelítő Tank" @@ -8214,6 +9234,11 @@ "hu" "Közelítő Boszorka" } + "Common #103 Name" + { + "hu" "Közelítő Fertőzöttek" + } + "Tank #103" { "hu" "{mint}Ez a Tank immunis a tűzre, nagyon gyorsan fut, és teleportál a túlélőkhöz." @@ -8254,6 +9279,11 @@ "hu" "{mint}Ez a Boszorka immunis a tűzre, nagyon gyorsan fut, és teleportál a túlélőkhöz." } + "Common #103" + { + "hu" "{mint}Ez a Fertőzöttek immunis a tűzre, nagyon gyorsan fut, és teleportál a túlélőkhöz." + } + "Tank #104 Name" { "hu" "Csapda Tank" @@ -8294,6 +9324,11 @@ "hu" "Csapda Boszorka" } + "Common #104 Name" + { + "hu" "Csapda Fertőzöttek" + } + "Tank #104" { "hu" "{mint}Ez a Tank nem az aminek látszik." @@ -8334,6 +9369,11 @@ "hu" "{mint}Ez a Boszorka nem az aminek látszik." } + "Common #104" + { + "hu" "{mint}Ez a Fertőzöttek nem az aminek látszik." + } + "Tank #105 Name" { "hu" "Félelemkeltő Tank" @@ -8374,6 +9414,11 @@ "hu" "Félelemkeltő Boszorka" } + "Common #105 Name" + { + "hu" "Félelemkeltő Fertőzöttek" + } + "Tank #105" { "hu" "{mint}Ez a Tank megtudja részben vakítani a túlélőket." @@ -8414,6 +9459,11 @@ "hu" "{mint}Ez a Boszorka megtudja részben vakítani a túlélőket." } + "Common #105" + { + "hu" "{mint}Ez a Fertőzöttek megtudja részben vakítani a túlélőket." + } + "Tank #106 Name" { "hu" "Fanatikus Tank" @@ -8454,6 +9504,11 @@ "hu" "Fanatikus Boszorka" } + "Common #106 Name" + { + "hu" "Fanatikus Fertőzöttek" + } + "Tank #106" { "hu" "{mint}Ez a Tank részben bedrogozza és bántja a túlélőket." @@ -8494,6 +9549,11 @@ "hu" "{mint}Ez a Boszorka részben bedrogozza és bántja a túlélőket." } + "Common #106" + { + "hu" "{mint}Ez a Fertőzöttek részben bedrogozza és bántja a túlélőket." + } + "Tank #107 Name" { "hu" "Remegő Tank" @@ -8534,6 +9594,11 @@ "hu" "Remegő Boszorka" } + "Common #107 Name" + { + "hu" "Remegő Fertőzöttek" + } + "Tank #107" { "hu" "{mint}Ez a Tank odadobja a sziklákat a túlélőkre." @@ -8574,6 +9639,11 @@ "hu" "{mint}Ez a Boszorka odadobja a sziklákat a túlélőkre." } + "Common #107" + { + "hu" "{mint}Ez a Fertőzöttek odadobja a sziklákat a túlélőkre." + } + "Tank #108 Name" { "hu" "Elmeb3teg Tank" @@ -8614,6 +9684,11 @@ "hu" "Elmeb3teg Boszorka" } + "Common #108 Name" + { + "hu" "Elmeb3teg Fertőzöttek" + } + "Tank #108" { "hu" "{mint}Ez a Tank extra sebzést okozz, nagyon gyorsan fut miközben álcázza magát és lelassítja a túlélőket." @@ -8654,6 +9729,11 @@ "hu" "{mint}Ez a Boszorka extra sebzést okozz, nagyon gyorsan fut miközben álcázza magát és lelassítja a túlélőket." } + "Common #108" + { + "hu" "{mint}Ez a Fertőzöttek extra sebzést okozz, nagyon gyorsan fut miközben álcázza magát és lelassítja a túlélőket." + } + "Tank #109 Name" { "hu" "Apokalipszis Tank" @@ -8694,6 +9774,11 @@ "hu" "Apokalipszis Boszorka" } + "Common #109 Name" + { + "hu" "Apokalipszis Fertőzöttek" + } + "Tank #109" { "hu" "{mint}Ez a Tank immunis a tűzre, kicsit gyorsabban fut, meteor záport, pánik eseményt, és szikla záport indít." @@ -8734,6 +9819,11 @@ "hu" "{mint}Ez a Boszorka immunis a tűzre, kicsit gyorsabban fut, meteor záport, pánik eseményt, és szikla záport indít." } + "Common #109" + { + "hu" "{mint}Ez a Fertőzöttek immunis a tűzre, kicsit gyorsabban fut, meteor záport, pánik eseményt, és szikla záport indít." + } + "Tank #110 Name" { "hu" "Darth Vader Tank" @@ -8774,6 +9864,11 @@ "hu" "Darth Vader Boszorka" } + "Common #110 Name" + { + "hu" "Darth Vader Fertőzöttek" + } + "Tank #110" { "hu" "{mint}Ez Darth Vader... És ő egy... Mutáns Tank az erővel!" @@ -8814,6 +9909,11 @@ "hu" "{mint}Ez Darth Vader... És ő egy... Mutáns Boszorka az erővel!" } + "Common #110" + { + "hu" "{mint}Ez Darth Vader... És ő egy... Mutáns Fertőzöttek az erővel!" + } + "Tank #111 Name" { "hu" "Drog Szenvedélye Tank" @@ -8854,6 +9954,11 @@ "hu" "Drog Szenvedélye Boszorka" } + "Common #111 Name" + { + "hu" "Drog Szenvedélye Fertőzöttek" + } + "Tank #111" { "hu" "{mint}Ennek a Tanknak fertőző a szenvedélye." @@ -8894,6 +9999,11 @@ "hu" "{mint}Ennek a Boszorkanak fertőző a szenvedélye." } + "Common #111" + { + "hu" "{mint}Ennek a Fertőzötteknak fertőző a szenvedélye." + } + "Tank #112 Name" { "hu" "SokSzerencsét Tank" @@ -8934,6 +10044,11 @@ "hu" "SokSzerencsét Boszorka" } + "Common #112 Name" + { + "hu" "SokSzerencsét Fertőzöttek" + } + "Tank #112" { "hu" "{mint}Ez a Tank immunis a tűzre, nagyon gyorsan fut, és a túlélőkhöz tud teleportálni." @@ -8974,6 +10089,11 @@ "hu" "{mint}Ez a Boszorka immunis a tűzre, nagyon gyorsan fut, és a túlélőkhöz tud teleportálni." } + "Common #112" + { + "hu" "{mint}Ez a Fertőzöttek immunis a tűzre, nagyon gyorsan fut, és a túlélőkhöz tud teleportálni." + } + "Tank #113 Name" { "hu" "Zord Kaszás Tank" @@ -9014,6 +10134,11 @@ "hu" "Zord Kaszás Boszorka" } + "Common #113 Name" + { + "hu" "Zord Kaszás Fertőzöttek" + } + "Tank #113" { "hu" "{mint}Ez a Tank egy kicsit gyorsabban fut, eltemeti a túlélőket, álcázza magát, túlélőkhöz teleportál." @@ -9054,6 +10179,11 @@ "hu" "{mint}Ez a Boszorka egy kicsit gyorsabban fut, eltemeti a túlélőket, álcázza magát, túlélőkhöz teleportál." } + "Common #113" + { + "hu" "{mint}Ez a Fertőzöttek egy kicsit gyorsabban fut, eltemeti a túlélőket, álcázza magát, túlélőkhöz teleportál." + } + "Tank #114 Name" { "hu" "Horda Tank" @@ -9094,6 +10224,11 @@ "hu" "Horda Boszorka" } + "Common #114 Name" + { + "hu" "Horda Fertőzöttek" + } + "Tank #114" { "hu" "{mint}Ez a Tank pánik eseményt indíthat és lehányhatja a túlélőket hogy segítsen." @@ -9134,6 +10269,11 @@ "hu" "{mint}Ez a Boszorka pánik eseményt indíthat és lehányhatja a túlélőket hogy segítsen." } + "Common #114" + { + "hu" "{mint}Ez a Fertőzöttek pánik eseményt indíthat és lehányhatja a túlélőket hogy segítsen." + } + "Tank #115 Name" { "hu" "Hulk Tank" @@ -9174,6 +10314,11 @@ "hu" "Hulk Boszorka" } + "Common #115 Name" + { + "hu" "Hulk Fertőzöttek" + } + "Tank #115" { "hu" "{mint}Bemutatom a Hihetetlen Hulk-ot! Ennek a Tanknak nagyrészt olyan képességei vannak mint Hulk-nak!" @@ -9214,6 +10359,11 @@ "hu" "{mint}Bemutatom a Hihetetlen Hulk-ot! Ennek a Boszorkanak nagyrészt olyan képességei vannak mint Hulk-nak!" } + "Common #115" + { + "hu" "{mint}Bemutatom a Hihetetlen Hulk-ot! Ennek a Fertőzötteknak nagyrészt olyan képességei vannak mint Hulk-nak!" + } + "Tank #116 Name" { "hu" "Nindzsa Tank" @@ -9254,6 +10404,11 @@ "hu" "Nindzsa Boszorka" } + "Common #116 Name" + { + "hu" "Nindzsa Fertőzöttek" + } + "Tank #116" { "hu" "{mint}Ez a Tank tud teleportálni, csendben mozogni, és tudja álcázni magát. Légy óvatos!" @@ -9294,6 +10449,11 @@ "hu" "{mint}Ez a Boszorka tud teleportálni, csendben mozogni, és tudja álcázni magát. Légy óvatos!" } + "Common #116" + { + "hu" "{mint}Ez a Fertőzöttek tud teleportálni, csendben mozogni, és tudja álcázni magát. Légy óvatos!" + } + "Tank #117 Name" { "hu" "Zen Tank" @@ -9334,6 +10494,11 @@ "hu" "Zen Boszorka" } + "Common #117 Name" + { + "hu" "Zen Fertőzöttek" + } + "Tank #117" { "hu" "{mint}Ez a Tank éppen meditál, túl elfoglalt hogy foglalkozzon veled." @@ -9374,6 +10539,11 @@ "hu" "{mint}Ez a Boszorka éppen meditál, túl elfoglalt hogy foglalkozzon veled." } + "Common #117" + { + "hu" "{mint}Ez a Fertőzöttek éppen meditál, túl elfoglalt hogy foglalkozzon veled." + } + "Tank #118 Name" { "hu" "A Főnök (1. Alak)" @@ -9414,6 +10584,11 @@ "hu" "A Főnök (1. Alak)" } + "Common #118 Name" + { + "hu" "A Főnök (1. Alak)" + } + "Tank #118" { "hu" "{mint}Ez a Tank robbanó sziklákat dob és időszakosan teleportál egy túlélőkhöz." @@ -9454,6 +10629,11 @@ "hu" "{mint}Ez a Boszorka időszakosan teleportál egy túlélőkhöz." } + "Common #118" + { + "hu" "{mint}Ez a Fertőzöttek időszakosan teleportál egy túlélőkhöz." + } + "Tank #119 Name" { "hu" "Acél Hűbérúr (2. Alak)" @@ -9494,6 +10674,11 @@ "hu" "Acél Hűbérúr (2. Alak)" } + "Common #119 Name" + { + "hu" "Acél Hűbérúr (2. Alak)" + } + "Tank #119" { "hu" "{mint}Ez a Tank egy kicsit gyorsabban fut, immunis a közelharcra, erősebb a szokásosnál, robbanó sziklákat dob, megváltoztathatja a túlélők gravitációját, időszakosan teleportál egy túlélőhöz." @@ -9534,6 +10719,11 @@ "hu" "{mint}Ez a Boszorka egy kicsit gyorsabban fut, immunis a közelharcra, erősebb a szokásosnál, megváltoztathatja a túlélők gravitációját, időszakosan teleportál egy túlélőhöz." } + "Common #119" + { + "hu" "{mint}Ez a Fertőzöttek egy kicsit gyorsabban fut, immunis a közelharcra, erősebb a szokásosnál, megváltoztathatja a túlélők gravitációját, időszakosan teleportál egy túlélőhöz." + } + "Tank #120 Name" { "hu" "Éjjeli Orvvadász (3. Alak)" @@ -9574,6 +10764,11 @@ "hu" "Éjjeli Orvvadász (3. Alak)" } + "Common #120 Name" + { + "hu" "Éjjeli Orvvadász (3. Alak)" + } + "Tank #120" { "hu" "{mint}Ez a Tank egy kicsit gyorsabban fut, immunis a tűzre, gyengébb a szokásosnál, robbanó sziklákat dob, megvakítja a túlélőket, láthatatlanná tud válni, időszakosan teleportál egy túlélőhöz." @@ -9614,6 +10809,11 @@ "hu" "{mint}Ez a Boszorka egy kicsit gyorsabban fut, immunis a tűzre, gyengébb a szokásosnál, megvakítja a túlélőket, láthatatlanná tud válni, időszakosan teleportál egy túlélőhöz." } + "Common #120" + { + "hu" "{mint}Ez a Fertőzöttek egy kicsit gyorsabban fut, immunis a tűzre, gyengébb a szokásosnál, megvakítja a túlélőket, láthatatlanná tud válni, időszakosan teleportál egy túlélőhöz." + } + "Tank #121 Name" { "hu" "Tűz Szelleme (4. Alak)" @@ -9654,6 +10854,11 @@ "hu" "Tűz Szelleme (4. Alak)" } + "Common #121 Name" + { + "hu" "Tűz Szelleme (4. Alak)" + } + "Tank #121" { "hu" "{mint}Ez a Tank egy kicsit gyorsabban fut, immunis a tűzre, erősebb a szokásosnál, robbanó sziklákat dob, tüzet okoz, ideiglenes életerőt ad a túlélőknek, időszakosan ugrál, időszakosan teleportál egy túlélőhöz." @@ -9694,6 +10899,11 @@ "hu" "{mint}Ez a Boszorka egy kicsit gyorsabban fut, immunis a tűzre, erősebb a szokásosnál, tüzet okoz, ideiglenes életerőt ad a túlélőknek, időszakosan ugrál, időszakosan teleportál egy túlélőhöz." } + "Common #121" + { + "hu" "{mint}Ez a Fertőzöttek egy kicsit gyorsabban fut, immunis a tűzre, erősebb a szokásosnál, tüzet okoz, ideiglenes életerőt ad a túlélőknek, időszakosan ugrál, időszakosan teleportál egy túlélőhöz." + } + "Tank #122 Name" { "hu" "Randomizáló Tank" @@ -9734,6 +10944,11 @@ "hu" "Randomizáló Boszorka" } + "Common #122 Name" + { + "hu" "Randomizáló Fertőzöttek" + } + "Tank #122" { "hu" "{mint}Ez a Tank véletlenszerűen átalakul egy másik típusú Mutáns Tankká, a sebzése megnő. Légy óvatos..." @@ -9774,6 +10989,11 @@ "hu" "{mint}Ez a Boszorka véletlenszerűen átalakul egy másik típusú Mutáns Boszorkaká, a sebzése megnő. Légy óvatos..." } + "Common #122" + { + "hu" "{mint}Ez a Boszorka véletlenszerűen átalakul egy másik típusú Mutáns Fertőzöttekká, a sebzése megnő. Légy óvatos..." + } + "Tank #123 Name" { "hu" "Alakváltó Tank" @@ -9814,6 +11034,11 @@ "hu" "Alakváltó Boszorka" } + "Common #123 Name" + { + "hu" "Alakváltó Fertőzöttek" + } + "Tank #123" { "hu" "{mint}Ez a Tank át tud alakulni egy másik típusú Mutáns Tankká. Ne becsüld le..." @@ -9854,6 +11079,11 @@ "hu" "{mint}Ez a Boszorka át tud alakulni egy másik típusú Mutáns Boszorkaká. Ne becsüld le..." } + "Common #123" + { + "hu" "{mint}Ez a Boszorka át tud alakulni egy másik típusú Mutáns Fertőzöttekká. Ne becsüld le..." + } + "Tank #124 Name" { "hu" "Villanó Tank" @@ -9894,6 +11124,11 @@ "hu" "Villanó Boszorka" } + "Common #124 Name" + { + "hu" "Villanó Fertőzöttek" + } + "Tank #124" { "hu" "{mint}Ez a Tank villanásokat okoz, amitől ő maga, de mindenki más is megbénul akit megsebez." @@ -9934,6 +11169,11 @@ "hu" "{mint}Ez a Boszorka villanásokat okoz, amitől ő maga, de mindenki más is megbénul akit megsebez." } + "Common #124" + { + "hu" "{mint}Ez a Fertőzöttek villanásokat okoz, amitől ő maga, de mindenki más is megbénul akit megsebez." + } + "Tank #125 Name" { "hu" "Mocsárember Tank" @@ -9974,6 +11214,11 @@ "hu" "Mocsárember Boszorka" } + "Common #125 Name" + { + "hu" "Mocsárember Fertőzöttek" + } + "Tank #125" { "hu" "{mint}Ez a Tank ugyanolyan bosszantó mint bármelyik sárember." @@ -10014,6 +11259,11 @@ "hu" "{mint}Ez a Boszorka ugyanolyan bosszantó mint bármelyik sárember." } + "Common #125" + { + "hu" "{mint}Ez a Fertőzöttek ugyanolyan bosszantó mint bármelyik sárember." + } + "Tank #126 Name" { "hu" "Végjáték Tank" @@ -10054,6 +11304,11 @@ "hu" "Végjáték Boszorka" } + "Common #126 Name" + { + "hu" "Végjáték Fertőzöttek" + } + "Tank #126" { "hu" "{mint}Viszlát mindenki!" @@ -10094,6 +11349,11 @@ "hu" "{mint}Viszlát mindenki!" } + "Common #126" + { + "hu" "{mint}Viszlát mindenki!" + } + "Tank #127 Name" { "hu" "Játékos Tank" @@ -10134,124 +11394,1764 @@ "hu" "Játékos Boszorka" } - "Tank #127" + "Common #127 Name" + { + "hu" "Játékos Fertőzöttek" + } + + "Tank #127" { "hu" "{mint}Ez a Tank nem okoz sebzést. Csak játszani szeretne!" } - "Boomer #127" + "Boomer #127" + { + "hu" "{mint}Ez a Pukkancs nem okoz sebzést. Csak játszani szeretne!" + } + + "Charger #127" + { + "hu" "{mint}Ez a Rohanó nem okoz sebzést. Csak játszani szeretne!" + } + + "Hunter #127" + { + "hu" "{mint}Ez a Vadász nem okoz sebzést. Csak játszani szeretne!" + } + + "Jockey #127" + { + "hu" "{mint}Ez a Zsoké nem okoz sebzést. Csak játszani szeretne!" + } + + "Smoker #127" + { + "hu" "{mint}Ez a Füstös nem okoz sebzést. Csak játszani szeretne!" + } + + "Spitter #127" + { + "hu" "{mint}Ez a Köpködő nem okoz sebzést. Csak játszani szeretne!" + } + + "Witch #127" + { + "hu" "{mint}Ez a Boszorka nem okoz sebzést. Csak játszani szeretne!" + } + + "Common #127" + { + "hu" "{mint}Ez a Fertőzöttek nem okoz sebzést. Csak játszani szeretne!" + } + + "Tank #128 Name" + { + "hu" "Bosszantó Tank" + } + + "Boomer #128 Name" + { + "hu" "Bosszantó Pukkancs" + } + + "Charger #128 Name" + { + "hu" "Bosszantó Rohanó" + } + + "Hunter #128 Name" + { + "hu" "Bosszantó Vadász" + } + + "Jockey #128 Name" + { + "hu" "Bosszantó Zsoké" + } + + "Smoker #128 Name" + { + "hu" "Bosszantó Füstös" + } + + "Spitter #128 Name" + { + "hu" "Bosszantó Köpködő" + } + + "Witch #128 Name" + { + "hu" "Bosszantó Boszorka" + } + + "Common #128 Name" + { + "hu" "Bosszantó Fertőzöttek" + } + + "Tank #128" + { + "hu" "{mint}Ez a Tank egyszerűen csak nem megy el." + } + + "Boomer #128" + { + "hu" "{mint}Ez a Pukkancs egyszerűen csak nem megy el." + } + + "Charger #128" + { + "hu" "{mint}Ez a Rohanó egyszerűen csak nem megy el." + } + + "Hunter #128" + { + "hu" "{mint}Ez a Vadász egyszerűen csak nem megy el." + } + + "Jockey #128" + { + "hu" "{mint}Ez a Zsoké egyszerűen csak nem megy el." + } + + "Smoker #128" + { + "hu" "{mint}Ez a Füstös egyszerűen csak nem megy el." + } + + "Spitter #128" + { + "hu" "{mint}Ez a Köpködő egyszerűen csak nem megy el." + } + + "Witch #128" + { + "hu" "{mint}Ez a Boszorka egyszerűen csak nem megy el." + } + + "Common #128" + { + "hu" "{mint}Ez a Fertőzöttek egyszerűen csak nem megy el." + } + + "Tank #129 Name" + { + "hu" "Sipow Tank" + } + + "Boomer #129 Name" + { + "hu" "Sipow Pukkancs" + } + + "Charger #129 Name" + { + "hu" "Sipow Rohanó" + } + + "Hunter #129 Name" + { + "hu" "Sipow Vadász" + } + + "Jockey #129 Name" + { + "hu" "Sipow Zsoké" + } + + "Smoker #129 Name" + { + "hu" "Sipow Füstös" + } + + "Spitter #129 Name" + { + "hu" "Sipow Köpködő" + } + + "Witch #129 Name" + { + "hu" "Sipow Boszorka" + } + + "Common #129 Name" + { + "hu" "Sipow Fertőzöttek" + } + + "Tank #129" + { + "hu" "{mint}Ez a Tank savas tócsákat hozhat létre a túlélők alatt, és meteorzáport indíthat el meteoritokkal, amelyek néhány másodperc múlva égnek és felrobbannak." + } + + "Boomer #129" + { + "hu" "{mint}Ez a Pukkancs savas tócsákat hozhat létre a túlélők alatt, és meteorzáport indíthat el meteoritokkal, amelyek néhány másodperc múlva égnek és felrobbannak." + } + + "Charger #129" + { + "hu" "{mint}Ez a Rohanó savas tócsákat hozhat létre a túlélők alatt, és meteorzáport indíthat el meteoritokkal, amelyek néhány másodperc múlva égnek és felrobbannak." + } + + "Hunter #129" + { + "hu" "{mint}Ez a Vadász savas tócsákat hozhat létre a túlélők alatt, és meteorzáport indíthat el meteoritokkal, amelyek néhány másodperc múlva égnek és felrobbannak." + } + + "Jockey #129" + { + "hu" "{mint}Ez a Zsoké savas tócsákat hozhat létre a túlélők alatt, és meteorzáport indíthat el meteoritokkal, amelyek néhány másodperc múlva égnek és felrobbannak." + } + + "Smoker #129" + { + "hu" "{mint}Ez a Füstös savas tócsákat hozhat létre a túlélők alatt, és meteorzáport indíthat el meteoritokkal, amelyek néhány másodperc múlva égnek és felrobbannak." + } + + "Spitter #129" + { + "hu" "{mint}Ez a Köpködő savas tócsákat hozhat létre a túlélők alatt, és meteorzáport indíthat el meteoritokkal, amelyek néhány másodperc múlva égnek és felrobbannak." + } + + "Witch #129" + { + "hu" "{mint}Ez a Boszorka savas tócsákat hozhat létre a túlélők alatt, és meteorzáport indíthat el meteoritokkal, amelyek néhány másodperc múlva égnek és felrobbannak." + } + + "Common #129" + { + "hu" "{mint}Ez a Fertőzöttek savas tócsákat hozhat létre a túlélők alatt, és meteorzáport indíthat el meteoritokkal, amelyek néhány másodperc múlva égnek és felrobbannak." + } + + "Tank #130 Name" + { + "hu" "Gonosz Tank" + } + + "Boomer #130 Name" + { + "hu" "Gonosz Pukkancs" + } + + "Charger #130 Name" + { + "hu" "Gonosz Rohanó" + } + + "Hunter #130 Name" + { + "hu" "Gonosz Vadász" + } + + "Jockey #130 Name" + { + "hu" "Gonosz Zsoké" + } + + "Smoker #130 Name" + { + "hu" "Gonosz Füstös" + } + + "Spitter #130 Name" + { + "hu" "Gonosz Köpködő" + } + + "Witch #130 Name" + { + "hu" "Gonosz Boszorka" + } + + "Common #130 Name" + { + "hu" "Gonosz Fertőzöttek" + } + + "Tank #130" + { + "hu" "{mint}Ez a Tank a lávába küldhet, de nem hagy semmit meghalni!" + } + + "Boomer #130" + { + "hu" "{mint}Ez a Pukkancs a lávába küldhet, de nem hagy semmit meghalni!" + } + + "Charger #130" + { + "hu" "{mint}Ez a Rohanó a lávába küldhet, de nem hagy semmit meghalni!" + } + + "Hunter #130" + { + "hu" "{mint}Ez a Vadász a lávába küldhet, de nem hagy semmit meghalni!" + } + + "Jockey #130" + { + "hu" "{mint}Ez a Zsoké a lávába küldhet, de nem hagy semmit meghalni!" + } + + "Smoker #130" + { + "hu" "{mint}Ez a Füstös a lávába küldhet, de nem hagy semmit meghalni!" + } + + "Spitter #130" + { + "hu" "{mint}Ez a Köpködő a lávába küldhet, de nem hagy semmit meghalni!" + } + + "Witch #130" + { + "hu" "{mint}Ez a Boszorka a lávába küldhet, de nem hagy semmit meghalni!" + } + + "Common #130" + { + "hu" "{mint}Ez a Fertőzöttek a lávába küldhet, de nem hagy semmit meghalni!" + } + + "Tank #131 Name" + { + "hu" "Biztos úr Tank" + } + + "Boomer #131 Name" + { + "hu" "Biztos úr Pukkancs" + } + + "Charger #131 Name" + { + "hu" "Biztos úr Rohanó" + } + + "Hunter #131 Name" + { + "hu" "Biztos úr Vadász" + } + + "Jockey #131 Name" + { + "hu" "Biztos úr Zsoké" + } + + "Smoker #131 Name" + { + "hu" "Biztos úr Füstös" + } + + "Spitter #131 Name" + { + "hu" "Biztos úr Köpködő" + } + + "Witch #131 Name" + { + "hu" "Biztos úr Boszorka" + } + + "Common #131 Name" + { + "hu" "Biztos úr Fertőzötteket" + } + + "Tank #131 Note" + { + "hu" "{mint}Ez a Tank és az egész rendőrség azért van itt, hogy érvényt szerezzen a törvénynek!" + } + + "Boomer #131 Note" + { + "hu" "{mint}Ez a Pukkancs és az egész rendőrség azért van itt, hogy érvényt szerezzen a törvénynek!" + } + + "Charger #131 Note" + { + "hu" "{mint}Ez a Rohanó és az egész rendőrség azért van itt, hogy érvényt szerezzen a törvénynek!" + } + + "Hunter #131 Note" + { + "hu" "{mint}Ez a Vadász és az egész rendőrség azért van itt, hogy érvényt szerezzen a törvénynek!" + } + + "Jockey #131 Note" + { + "hu" "{mint}Ez a Zsoké és az egész rendőrség azért van itt, hogy érvényt szerezzen a törvénynek!" + } + + "Smoker #131 Note" + { + "hu" "{mint}Ez a Füstös és az egész rendőrség azért van itt, hogy érvényt szerezzen a törvénynek!" + } + + "Spitter #131 Note" + { + "hu" "{mint}Ez a Köpködő és az egész rendőrség azért van itt, hogy érvényt szerezzen a törvénynek!" + } + + "Witch #131 Note" + { + "hu" "{mint}Ez a Boszorka és az egész rendőrség azért van itt, hogy érvényt szerezzen a törvénynek!" + } + + "Common #131 Note" + { + "hu" "{mint}Ez a Fertőzötteket és az egész rendőrség azért van itt, hogy érvényt szerezzen a törvénynek!" + } + + "Tank #132 Name" + { + "hu" "Maffia Tank" + } + + "Boomer #132 Name" + { + "hu" "Maffia Pukkancs" + } + + "Charger #132 Name" + { + "hu" "Maffia Rohanó" + } + + "Hunter #132 Name" + { + "hu" "Maffia Vadász" + } + + "Jockey #132 Name" + { + "hu" "Maffia Zsoké" + } + + "Smoker #132 Name" + { + "hu" "Maffia Füstös" + } + + "Spitter #132 Name" + { + "hu" "Maffia Köpködő" + } + + "Witch #132 Name" + { + "hu" "Maffia Boszorka" + } + + "Common #132 Name" + { + "hu" "Maffia Fertőzötteket" + } + + "Tank #132 Note" + { + "hu" "{mint}Ez a Tank a maffia tagja!" + } + + "Boomer #132 Note" + { + "hu" "{mint}Ez a Pukkancs a maffia tagja!" + } + + "Charger #132 Note" + { + "hu" "{mint}Ez a Rohanó a maffia tagja!" + } + + "Hunter #132 Note" + { + "hu" "{mint}Ez a Vadász a maffia tagja!" + } + + "Jockey #132 Note" + { + "hu" "{mint}Ez a Zsoké a maffia tagja!" + } + + "Smoker #132 Note" + { + "hu" "{mint}Ez a Füstös a maffia tagja!" + } + + "Spitter #132 Note" + { + "hu" "{mint}Ez a Köpködő a maffia tagja!" + } + + "Witch #132 Note" + { + "hu" "{mint}Ez a Boszorka a maffia tagja!" + } + + "Common #132 Note" + { + "hu" "{mint}Ez a Fertőzötteket a maffia tagja!" + } + + "Tank #133 Name" + { + "hu" "Frankenstein Tank" + } + + "Boomer #133 Name" + { + "hu" "Frankenstein Pukkancs" + } + + "Charger #133 Name" + { + "hu" "Frankenstein Rohanó" + } + + "Hunter #133 Name" + { + "hu" "Frankenstein Vadász" + } + + "Jockey #133 Name" + { + "hu" "Frankenstein Zsoké" + } + + "Smoker #133 Name" + { + "hu" "Frankenstein Füstös" + } + + "Spitter #133 Name" + { + "hu" "Frankenstein Köpködő" + } + + "Witch #133 Name" + { + "hu" "Frankenstein Boszorka" + } + + "Common #133 Name" + { + "hu" "Frankenstein Fertőzötteket" + } + + "Tank #133 Note" + { + "hu" "{mint}Ez a Tank Frankenstein mutánsa!" + } + + "Boomer #133 Note" + { + "hu" "{mint}Ez a Pukkancs Frankenstein mutánsa!" + } + + "Charger #133 Note" + { + "hu" "{mint}Ez a Rohanó Frankenstein mutánsa!" + } + + "Hunter #133 Note" + { + "hu" "{mint}Ez a Vadász Frankenstein mutánsa!" + } + + "Jockey #133 Note" + { + "hu" "{mint}Ez a Zsoké Frankenstein mutánsa!" + } + + "Smoker #133 Note" + { + "hu" "{mint}Ez a Füstös Frankenstein mutánsa!" + } + + "Spitter #133 Note" + { + "hu" "{mint}Ez a Köpködő Frankenstein mutánsa!" + } + + "Witch #133 Note" + { + "hu" "{mint}Ez a Boszorka Frankenstein mutánsa!" + } + + "Common #133 Note" + { + "hu" "{mint}Ez a Fertőzötteket Frankenstein mutánsa!" + } + + "Tank #134 Name" + { + "hu" "Prototípus Tank" + } + + "Boomer #134 Name" + { + "hu" "Prototípus Pukkancs" + } + + "Charger #134 Name" + { + "hu" "Prototípus Rohanó" + } + + "Hunter #134 Name" + { + "hu" "Prototípus Vadász" + } + + "Jockey #134 Name" + { + "hu" "Prototípus Zsoké" + } + + "Smoker #134 Name" + { + "hu" "Prototípus Füstös" + } + + "Spitter #134 Name" + { + "hu" "Prototípus Köpködő" + } + + "Witch #134 Name" + { + "hu" "Prototípus Boszorka" + } + + "Common #134 Name" + { + "hu" "Prototípus Fertőzötteket" + } + + "Tank #134 Note" + { + "hu" "{mint}Ez a Tank improvizál, alkalmazkodik, és minden helyzetet leküzd." + } + + "Boomer #134 Note" + { + "hu" "{mint}Ez a Pukkancs improvizál, alkalmazkodik, és minden helyzetet leküzd." + } + + "Charger #134 Note" + { + "hu" "{mint}Ez a Rohanó improvizál, alkalmazkodik, és minden helyzetet leküzd." + } + + "Hunter #134 Note" + { + "hu" "{mint}Ez a Vadász improvizál, alkalmazkodik, és minden helyzetet leküzd." + } + + "Jockey #134 Note" + { + "hu" "{mint}Ez a Zsoké improvizál, alkalmazkodik, és minden helyzetet leküzd." + } + + "Smoker #134 Note" + { + "hu" "{mint}Ez a Füstös improvizál, alkalmazkodik, és minden helyzetet leküzd." + } + + "Spitter #134 Note" + { + "hu" "{mint}Ez a Köpködő improvizál, alkalmazkodik, és minden helyzetet leküzd." + } + + "Witch #134 Note" + { + "hu" "{mint}Ez a Boszorka improvizál, alkalmazkodik, és minden helyzetet leküzd." + } + + "Common #134 Note" + { + "hu" "{mint}Ez a Fertőzötteket improvizál, alkalmazkodik, és minden helyzetet leküzd." + } + + "Tank #135 Name" + { + "hu" "Zeusz Tank" + } + + "Boomer #135 Name" + { + "hu" "Zeusz Pukkancs" + } + + "Charger #135 Name" + { + "hu" "Zeusz Rohanó" + } + + "Hunter #135 Name" + { + "hu" "Zeusz Vadász" + } + + "Jockey #135 Name" + { + "hu" "Zeusz Zsoké" + } + + "Smoker #135 Name" + { + "hu" "Zeusz Füstös" + } + + "Spitter #135 Name" + { + "hu" "Zeusz Köpködő" + } + + "Witch #135 Name" + { + "hu" "Zeusz Boszorka" + } + + "Common #135 Name" + { + "hu" "Zeusz Fertőzötteket" + } + + "Tank #135 Note" + { + "hu" "{mint}Ez a Tank villámokat lő ki az ujjbegyeiből!!" + } + + "Boomer #135 Note" + { + "hu" "{mint}Ez a Pukkancs villámokat lő ki az ujjbegyeiből!!" + } + + "Charger #135 Note" + { + "hu" "{mint}Ez a Rohanó villámokat lő ki az ujjbegyeiből!!" + } + + "Hunter #135 Note" + { + "hu" "{mint}Ez a Vadász villámokat lő ki az ujjbegyeiből!!" + } + + "Jockey #135 Note" + { + "hu" "{mint}Ez a Zsoké villámokat lő ki az ujjbegyeiből!!" + } + + "Smoker #135 Note" + { + "hu" "{mint}Ez a Füstös villámokat lő ki az ujjbegyeiből!!" + } + + "Spitter #135 Note" + { + "hu" "{mint}Ez a Köpködő villámokat lő ki az ujjbegyeiből!!" + } + + "Witch #135 Note" + { + "hu" "{mint}Ez a Boszorka villámokat lő ki az ujjbegyeiből!!" + } + + "Common #135 Note" + { + "hu" "{mint}Ez a Fertőzötteket villámokat lő ki az ujjbegyeiből!!" + } + + "Tank #136 Name" + { + "hu" "Röppálya Tank" + } + + "Boomer #136 Name" + { + "hu" "Röppálya Pukkancs" + } + + "Charger #136 Name" + { + "hu" "Röppálya Rohanó" + } + + "Hunter #136 Name" + { + "hu" "Röppálya Vadász" + } + + "Jockey #136 Name" + { + "hu" "Röppálya Zsoké" + } + + "Smoker #136 Name" + { + "hu" "Röppálya Füstös" + } + + "Spitter #136 Name" + { + "hu" "Röppálya Köpködő" + } + + "Witch #136 Name" + { + "hu" "Röppálya Boszorka" + } + + "Common #136 Name" + { + "hu" "Röppálya Fertőzötteket" + } + + "Tank #136 Note" + { + "hu" "{mint}Ez a Tank a sebességet használja, hogy megváltoztassa az élettartamod röppályáját." + } + + "Boomer #136 Note" + { + "hu" "{mint}Ez a Pukkancs a sebességet használja, hogy megváltoztassa az élettartamod röppályáját." + } + + "Charger #136 Note" + { + "hu" "{mint}Ez a Rohanó a sebességet használja, hogy megváltoztassa az élettartamod röppályáját." + } + + "Hunter #136 Note" + { + "hu" "{mint}Ez a Vadász a sebességet használja, hogy megváltoztassa az élettartamod röppályáját." + } + + "Jockey #136 Note" + { + "hu" "{mint}Ez a Zsoké a sebességet használja, hogy megváltoztassa az élettartamod röppályáját." + } + + "Smoker #136 Note" + { + "hu" "{mint}Ez a Füstös a sebességet használja, hogy megváltoztassa az élettartamod röppályáját." + } + + "Spitter #136 Note" + { + "hu" "{mint}Ez a Köpködő a sebességet használja, hogy megváltoztassa az élettartamod röppályáját." + } + + "Witch #136 Note" + { + "hu" "{mint}Ez a Boszorka a sebességet használja, hogy megváltoztassa az élettartamod röppályáját." + } + + "Common #136 Note" + { + "hu" "{mint}Ez a Fertőzötteket a sebességet használja, hogy megváltoztassa az élettartamod röppályáját." + } + + "Tank #137 Name" + { + "hu" "Tűzgát Tank" + } + + "Boomer #137 Name" + { + "hu" "Tűzgát Pukkancs" + } + + "Charger #137 Name" + { + "hu" "Tűzgát Rohanó" + } + + "Hunter #137 Name" + { + "hu" "Tűzgát Vadász" + } + + "Jockey #137 Name" + { + "hu" "Tűzgát Zsoké" + } + + "Smoker #137 Name" + { + "hu" "Tűzgát Füstös" + } + + "Spitter #137 Name" + { + "hu" "Tűzgát Köpködő" + } + + "Witch #137 Name" + { + "hu" "Tűzgát Boszorka" + } + + "Common #137 Name" + { + "hu" "Tűzgát Fertőzötteket" + } + + "Tank #137 Note" + { + "hu" "{mint}Ez a Tank nem kegyelmez semmilyen leállási idővel." + } + + "Boomer #137 Note" + { + "hu" "{mint}Ez a Pukkancs nem kegyelmez semmilyen leállási idővel." + } + + "Charger #137 Note" + { + "hu" "{mint}Ez a Rohanó nem kegyelmez semmilyen leállási idővel." + } + + "Hunter #137 Note" + { + "hu" "{mint}Ez a Vadász nem kegyelmez semmilyen leállási idővel." + } + + "Jockey #137 Note" + { + "hu" "{mint}Ez a Zsoké nem kegyelmez semmilyen leállási idővel." + } + + "Smoker #137 Note" + { + "hu" "{mint}Ez a Füstös nem kegyelmez semmilyen leállási idővel." + } + + "Spitter #137 Note" + { + "hu" "{mint}Ez a Köpködő nem kegyelmez semmilyen leállási idővel." + } + + "Witch #137 Note" + { + "hu" "{mint}Ez a Boszorka nem kegyelmez semmilyen leállási idővel." + } + + "Common #137 Note" + { + "hu" "{mint}Ez a Fertőzötteket nem kegyelmez semmilyen leállási idővel." + } + + "Tank #138 Name" + { + "hu" "Gyűjtő Tank" + } + + "Boomer #138 Name" + { + "hu" "Gyűjtő Pukkancs" + } + + "Charger #138 Name" + { + "hu" "Gyűjtő Rohanó" + } + + "Hunter #138 Name" + { + "hu" "Gyűjtő Vadász" + } + + "Jockey #138 Name" + { + "hu" "Gyűjtő Zsoké" + } + + "Smoker #138 Name" + { + "hu" "Gyűjtő Füstös" + } + + "Spitter #138 Name" + { + "hu" "Gyűjtő Köpködő" + } + + "Witch #138 Name" + { + "hu" "Gyűjtő Boszorka" + } + + "Common #138 Name" + { + "hu" "Gyűjtő Fertőzötteket" + } + + "Tank #138 Note" + { + "hu" "{mint}Ez a Tank szeretne felvenni téged a gyűjteményébe..." + } + + "Boomer #138 Note" + { + "hu" "{mint}Ez a Pukkancs szeretne felvenni téged a gyűjteményébe..." + } + + "Charger #138 Note" + { + "hu" "{mint}Ez a Rohanó szeretne felvenni téged a gyűjteményébe..." + } + + "Hunter #138 Note" + { + "hu" "{mint}Ez a Vadász szeretne felvenni téged a gyűjteményébe..." + } + + "Jockey #138 Note" + { + "hu" "{mint}Ez a Zsoké szeretne felvenni téged a gyűjteményébe..." + } + + "Smoker #138 Note" + { + "hu" "{mint}Ez a Füstös szeretne felvenni téged a gyűjteményébe..." + } + + "Spitter #138 Note" + { + "hu" "{mint}Ez a Köpködő szeretne felvenni téged a gyűjteményébe..." + } + + "Witch #138 Note" + { + "hu" "{mint}Ez a Boszorka szeretne felvenni téged a gyűjteményébe..." + } + + "Common #138 Note" + { + "hu" "{mint}Ez a Fertőzötteket szeretne felvenni téged a gyűjteményébe..." + } + + "Tank #139 Name" + { + "hu" "Időjáró Tank" + } + + "Boomer #139 Name" + { + "hu" "Időjáró Pukkancs" + } + + "Charger #139 Name" + { + "hu" "Időjáró Rohanó" + } + + "Hunter #139 Name" + { + "hu" "Időjáró Vadász" + } + + "Jockey #139 Name" + { + "hu" "Időjáró Zsoké" + } + + "Smoker #139 Name" + { + "hu" "Időjáró Füstös" + } + + "Spitter #139 Name" + { + "hu" "Időjáró Köpködő" + } + + "Witch #139 Name" + { + "hu" "Időjáró Boszorka" + } + + "Common #139 Name" + { + "hu" "Időjáró Fertőzötteket" + } + + "Tank #139 Note" + { + "hu" "{mint}Ez a Tank minden időben létezik." + } + + "Boomer #139 Note" + { + "hu" "{mint}Ez a Pukkancs minden időben létezik." + } + + "Charger #139 Note" + { + "hu" "{mint}Ez a Rohanó minden időben létezik." + } + + "Hunter #139 Note" + { + "hu" "{mint}Ez a Vadász minden időben létezik." + } + + "Jockey #139 Note" + { + "hu" "{mint}Ez a Zsoké minden időben létezik." + } + + "Smoker #139 Note" + { + "hu" "{mint}Ez a Füstös minden időben létezik." + } + + "Spitter #139 Note" + { + "hu" "{mint}Ez a Köpködő minden időben létezik." + } + + "Witch #139 Note" + { + "hu" "{mint}Ez a Boszorka minden időben létezik." + } + + "Common #139 Note" + { + "hu" "{mint}Ez a Fertőzötteket minden időben létezik." + } + + "Tank #140 Name" + { + "hu" "Sebesség Démon Tank" + } + + "Boomer #140 Name" + { + "hu" "Sebesség Démon Pukkancs" + } + + "Charger #140 Name" + { + "hu" "Sebesség Démon Rohanó" + } + + "Hunter #140 Name" + { + "hu" "Sebesség Démon Vadász" + } + + "Jockey #140 Name" + { + "hu" "Sebesség Démon Zsoké" + } + + "Smoker #140 Name" + { + "hu" "Sebesség Démon Füstös" + } + + "Spitter #140 Name" + { + "hu" "Sebesség Démon Köpködő" + } + + "Witch #140 Name" + { + "hu" "Sebesség Démon Boszorka" + } + + "Common #140 Name" + { + "hu" "Sebesség Démon Fertőzötteket" + } + + "Tank #140 Note" + { + "hu" "{mint}Ez a Tank mindenhol tűznyomot hagy, ahová csak megy..." + } + + "Boomer #140 Note" + { + "hu" "{mint}Ez a Pukkancs mindenhol tűznyomot hagy, ahová csak megy..." + } + + "Charger #140 Note" + { + "hu" "{mint}Ez a Rohanó mindenhol tűznyomot hagy, ahová csak megy..." + } + + "Hunter #140 Note" + { + "hu" "{mint}Ez a Vadász mindenhol tűznyomot hagy, ahová csak megy..." + } + + "Jockey #140 Note" + { + "hu" "{mint}Ez a Zsoké mindenhol tűznyomot hagy, ahová csak megy..." + } + + "Smoker #140 Note" + { + "hu" "{mint}Ez a Füstös mindenhol tűznyomot hagy, ahová csak megy..." + } + + "Spitter #140 Note" + { + "hu" "{mint}Ez a Köpködő mindenhol tűznyomot hagy, ahová csak megy..." + } + + "Witch #140 Note" + { + "hu" "{mint}Ez a Boszorka mindenhol tűznyomot hagy, ahová csak megy..." + } + + "Common #140 Note" + { + "hu" "{mint}Ez a Fertőzötteket mindenhol tűznyomot hagy, ahová csak megy..." + } + + "Tank #141 Name" + { + "hu" "Pusztító Tank" + } + + "Boomer #141 Name" + { + "hu" "Pusztító Pukkancs" + } + + "Charger #141 Name" + { + "hu" "Pusztító Rohanó" + } + + "Hunter #141 Name" + { + "hu" "Pusztító Vadász" + } + + "Jockey #141 Name" + { + "hu" "Pusztító Zsoké" + } + + "Smoker #141 Name" + { + "hu" "Pusztító Füstös" + } + + "Spitter #141 Name" + { + "hu" "Pusztító Köpködő" + } + + "Witch #141 Name" + { + "hu" "Pusztító Boszorka" + } + + "Common #141 Name" + { + "hu" "Pusztító Fertőzötteket" + } + + "Tank #141 Note" + { + "hu" "{mint}Ez a Tank mindent felrobbant, ami az útjába kerül!" + } + + "Boomer #141 Note" + { + "hu" "{mint}Ez a Pukkancs mindent felrobbant, ami az útjába kerül!" + } + + "Charger #141 Note" + { + "hu" "{mint}Ez a Rohanó mindent felrobbant, ami az útjába kerül!" + } + + "Hunter #141 Note" + { + "hu" "{mint}Ez a Vadász mindent felrobbant, ami az útjába kerül!" + } + + "Jockey #141 Note" + { + "hu" "{mint}Ez a Zsoké mindent felrobbant, ami az útjába kerül!" + } + + "Smoker #141 Note" + { + "hu" "{mint}Ez a Füstös mindent felrobbant, ami az útjába kerül!" + } + + "Spitter #141 Note" + { + "hu" "{mint}Ez a Köpködő mindent felrobbant, ami az útjába kerül!" + } + + "Witch #141 Note" + { + "hu" "{mint}Ez a Boszorka mindent felrobbant, ami az útjába kerül!" + } + + "Common #141 Note" { - "hu" "{mint}Ez a Pukkancs nem okoz sebzést. Csak játszani szeretne!" + "hu" "{mint}Ez a Fertőzötteket mindent felrobbant, ami az útjába kerül!" } - "Charger #127" + "Tank #142 Name" { - "hu" "{mint}Ez a Rohanó nem okoz sebzést. Csak játszani szeretne!" + "hu" "Ramattra Tank" } - "Hunter #127" + "Boomer #142 Name" { - "hu" "{mint}Ez a Vadász nem okoz sebzést. Csak játszani szeretne!" + "hu" "Ramattra Pukkancs" } - "Jockey #127" + "Charger #142 Name" { - "hu" "{mint}Ez a Zsoké nem okoz sebzést. Csak játszani szeretne!" + "hu" "Ramattra Rohanó" } - "Smoker #127" + "Hunter #142 Name" { - "hu" "{mint}Ez a Füstös nem okoz sebzést. Csak játszani szeretne!" + "hu" "Ramattra Vadász" } - "Spitter #127" + "Jockey #142 Name" { - "hu" "{mint}Ez a Köpködő nem okoz sebzést. Csak játszani szeretne!" + "hu" "Ramattra Zsoké" } - "Witch #127" + "Smoker #142 Name" { - "hu" "{mint}Ez a Boszorka nem okoz sebzést. Csak játszani szeretne!" + "hu" "Ramattra Füstös" } - "Tank #128 Name" + "Spitter #142 Name" { - "hu" "Bosszantó Tank" + "hu" "Ramattra Köpködő" } - "Boomer #128 Name" + "Witch #142 Name" { - "hu" "Bosszantó Pukkancs" + "hu" "Ramattra Boszorka" } - "Charger #128 Name" + "Common #142 Name" { - "hu" "Bosszantó Rohanó" + "hu" "Ramattra Fertőzöttek" } - "Hunter #128 Name" + "Tank #142" { - "hu" "Bosszantó Vadász" + "hu" "{mint}Ettől a Tank-tol ÚGY FOGSZ SZENVEDNI AHOGY Ő SZENVEDETT!" } - "Jockey #128 Name" + "Boomer #142" { - "hu" "Bosszantó Zsoké" + "hu" "{mint}Ettől a Pukkancs-tol ÚGY FOGSZ SZENVEDNI AHOGY Ő SZENVEDETT!" } - "Smoker #128 Name" + "Charger #142" { - "hu" "Bosszantó Füstös" + "hu" "{mint}Ettől a Rohanó-tol ÚGY FOGSZ SZENVEDNI AHOGY Ő SZENVEDETT!" } - "Spitter #128 Name" + "Hunter #142" { - "hu" "Bosszantó Köpködő" + "hu" "{mint}Ettől a Vadász-tol ÚGY FOGSZ SZENVEDNI AHOGY Ő SZENVEDETT!" } - "Witch #128 Name" + "Jockey #142" { - "hu" "Bosszantó Boszorka" + "hu" "{mint}Ettől a Zsoké-tol ÚGY FOGSZ SZENVEDNI AHOGY Ő SZENVEDETT!" } - "Tank #128" + "Smoker #142" { - "hu" "{mint}Ez a Tank egyszerűen csak nem megy el." + "hu" "{mint}Ettől a Füstös-tol ÚGY FOGSZ SZENVEDNI AHOGY Ő SZENVEDETT!" } - "Boomer #128" + "Spitter #142" { - "hu" "{mint}Ez a Pukkancs egyszerűen csak nem megy el." + "hu" "{mint}Ettől a Köpködő-tol ÚGY FOGSZ SZENVEDNI AHOGY Ő SZENVEDETT!" } - "Charger #128" + "Witch #142" { - "hu" "{mint}Ez a Rohanó egyszerűen csak nem megy el." + "hu" "{mint}Ettől a Boszorka-tol ÚGY FOGSZ SZENVEDNI AHOGY Ő SZENVEDETT!" } - "Hunter #128" + "Common #142" { - "hu" "{mint}Ez a Vadász egyszerűen csak nem megy el." + "hu" "{mint}Ettől a Fertőzöttek-tol ÚGY FOGSZ SZENVEDNI AHOGY Ő SZENVEDETT!" } - "Jockey #128" + "Tank #143 Name" { - "hu" "{mint}Ez a Zsoké egyszerűen csak nem megy el." + "hu" "Szigma Tank" } - "Smoker #128" + "Boomer #143 Name" { - "hu" "{mint}Ez a Füstös egyszerűen csak nem megy el." + "hu" "Szigma Pukkancs" } - "Spitter #128" + "Charger #143 Name" { - "hu" "{mint}Ez a Köpködő egyszerűen csak nem megy el." + "hu" "Szigma Rohanó" } - "Witch #128" + "Hunter #143 Name" { - "hu" "{mint}Ez a Boszorka egyszerűen csak nem megy el." + "hu" "Szigma Vadász" + } + + "Jockey #143 Name" + { + "hu" "Szigma Zsoké" + } + + "Smoker #143 Name" + { + "hu" "Szigma Füstös" + } + + "Spitter #143 Name" + { + "hu" "Szigma Köpködő" + } + + "Witch #143 Name" + { + "hu" "Szigma Boszorka" + } + + "Common #143 Name" + { + "hu" "Szigma Fertőzöttek" + } + + "Tank #143" + { + "hu" "{mint}Ez a Tank képes irányítani a gravitációt és sok sérülést elnyelni." + } + + "Boomer #143" + { + "hu" "{mint}Ez a Pukkancs képes irányítani a gravitációt és sok sérülést elnyelni." + } + + "Charger #143" + { + "hu" "{mint}Ez a Rohanó képes irányítani a gravitációt és sok sérülést elnyelni." + } + + "Hunter #143" + { + "hu" "{mint}Ez a Vadász képes irányítani a gravitációt és sok sérülést elnyelni." + } + + "Jockey #143" + { + "hu" "{mint}Ez a Zsoké képes irányítani a gravitációt és sok sérülést elnyelni." + } + + "Smoker #143" + { + "hu" "{mint}Ez a Füstös képes irányítani a gravitációt és sok sérülést elnyelni." + } + + "Spitter #143" + { + "hu" "{mint}Ez a Köpködő képes irányítani a gravitációt és sok sérülést elnyelni." + } + + "Witch #143" + { + "hu" "{mint}Ez a Boszorka képes irányítani a gravitációt és sok sérülést elnyelni." + } + + "Common #143" + { + "hu" "{mint}Ez a Fertőzöttek képes irányítani a gravitációt és sok sérülést elnyelni." + } + + "Tank #144 Name" + { + "hu" "Zarya Tank" + } + + "Boomer #144 Name" + { + "hu" "Zarya Pukkancs" + } + + "Charger #144 Name" + { + "hu" "Zarya Rohanó" + } + + "Hunter #144 Name" + { + "hu" "Zarya Vadász" + } + + "Jockey #144 Name" + { + "hu" "Zarya Zsoké" + } + + "Smoker #144 Name" + { + "hu" "Zarya Füstös" + } + + "Spitter #144 Name" + { + "hu" "Zarya Köpködő" + } + + "Witch #144 Name" + { + "hu" "Zarya Boszorka" + } + + "Common #144 Name" + { + "hu" "Zarya Fertőzötteket" + } + + "Tank #144 Note" + { + "hu" "{mint}Ez a Tank képes irányítani a gravitációt, a bejövő sebzést páncélzattá és sebzésfokozóvá alakítani, valamint a közeli fertőzöttek életerejét elnyelni." + } + + "Boomer #144 Note" + { + "hu" "{mint}Ez a Pukkancs képes irányítani a gravitációt, a bejövő sebzést páncélzattá és sebzésfokozóvá alakítani, valamint a közeli fertőzöttek életerejét elnyelni." + } + + "Charger #144 Note" + { + "hu" "{mint}Ez a Rohanó képes irányítani a gravitációt, a bejövő sebzést páncélzattá és sebzésfokozóvá alakítani, valamint a közeli fertőzöttek életerejét elnyelni." + } + + "Hunter #144 Note" + { + "hu" "{mint}Ez a Vadász képes irányítani a gravitációt, a bejövő sebzést páncélzattá és sebzésfokozóvá alakítani, valamint a közeli fertőzöttek életerejét elnyelni." + } + + "Jockey #144 Note" + { + "hu" "{mint}Ez a Zsoké képes irányítani a gravitációt, a bejövő sebzést páncélzattá és sebzésfokozóvá alakítani, valamint a közeli fertőzöttek életerejét elnyelni." + } + + "Smoker #144 Note" + { + "hu" "{mint}Ez a Füstös képes irányítani a gravitációt, a bejövő sebzést páncélzattá és sebzésfokozóvá alakítani, valamint a közeli fertőzöttek életerejét elnyelni." + } + + "Spitter #144 Note" + { + "hu" "{mint}Ez a Köpködő képes irányítani a gravitációt, a bejövő sebzést páncélzattá és sebzésfokozóvá alakítani, valamint a közeli fertőzöttek életerejét elnyelni." + } + + "Witch #144 Note" + { + "hu" "{mint}Ez a Boszorka képes irányítani a gravitációt, a bejövő sebzést páncélzattá és sebzésfokozóvá alakítani, valamint a közeli fertőzöttek életerejét elnyelni." + } + + "Common #144 Note" + { + "hu" "{mint}Ez a Fertőzötteket képes irányítani a gravitációt, a bejövő sebzést páncélzattá és sebzésfokozóvá alakítani, valamint a közeli fertőzöttek életerejét elnyelni." + } + + "Tank #145 Name" + { + "hu" "Laza Tank" + } + + "Boomer #145 Name" + { + "hu" "Laza Pukkancs" + } + + "Charger #145 Name" + { + "hu" "Laza Rohanó" + } + + "Hunter #145 Name" + { + "hu" "Laza Vadász" + } + + "Jockey #145 Name" + { + "hu" "Laza Zsoké" + } + + "Smoker #145 Name" + { + "hu" "Laza Füstös" + } + + "Spitter #145 Name" + { + "hu" "Laza Köpködő" + } + + "Witch #145 Name" + { + "hu" "Laza Boszorka" + } + + "Common #145 Name" + { + "hu" "Laza Fertőzötteket" + } + + "Tank #145 Note" + { + "hu" "{mint}Ez a Tank megbünteti a lemaradókat!" + } + + "Boomer #145 Note" + { + "hu" "{mint}Ez a Pukkancs megbünteti a lemaradókat!" + } + + "Charger #145 Note" + { + "hu" "{mint}Ez a Rohanó megbünteti a lemaradókat!" + } + + "Hunter #145 Note" + { + "hu" "{mint}Ez a Vadász megbünteti a lemaradókat!" + } + + "Jockey #145 Note" + { + "hu" "{mint}Ez a Zsoké megbünteti a lemaradókat!" + } + + "Smoker #145 Note" + { + "hu" "{mint}Ez a Füstös megbünteti a lemaradókat!" + } + + "Spitter #145 Note" + { + "hu" "{mint}Ez a Köpködő megbünteti a lemaradókat!" + } + + "Witch #145 Note" + { + "hu" "{mint}Ez a Boszorka megbünteti a lemaradókat!" + } + + "Common #145 Note" + { + "hu" "{mint}Ez a Fertőzötteket megbünteti a lemaradókat!" + } + + "Tank #146 Name" + { + "hu" "Siető Tank" + } + + "Boomer #146 Name" + { + "hu" "Siető Pukkancs" + } + + "Charger #146 Name" + { + "hu" "Siető Rohanó" + } + + "Hunter #146 Name" + { + "hu" "Siető Vadász" + } + + "Jockey #146 Name" + { + "hu" "Siető Zsoké" + } + + "Smoker #146 Name" + { + "hu" "Siető Füstös" + } + + "Spitter #146 Name" + { + "hu" "Siető Köpködő" + } + + "Witch #146 Name" + { + "hu" "Siető Boszorka" + } + + "Common #146 Name" + { + "hu" "Siető Fertőzötteket" + } + + "Tank #146 Note" + { + "hu" "{mint}Ez a Tank megbünteti azokat, akik előreszaladtak!" + } + + "Boomer #146 Note" + { + "hu" "{mint}Ez a Pukkancs megbünteti azokat, akik előreszaladtak!" + } + + "Charger #146 Note" + { + "hu" "{mint}Ez a Rohanó megbünteti azokat, akik előreszaladtak!" + } + + "Hunter #146 Note" + { + "hu" "{mint}Ez a Vadász megbünteti azokat, akik előreszaladtak!" + } + + "Jockey #146 Note" + { + "hu" "{mint}Ez a Zsoké megbünteti azokat, akik előreszaladtak!" + } + + "Smoker #146 Note" + { + "hu" "{mint}Ez a Füstös megbünteti azokat, akik előreszaladtak!" + } + + "Spitter #146 Note" + { + "hu" "{mint}Ez a Köpködő megbünteti azokat, akik előreszaladtak!" + } + + "Witch #146 Note" + { + "hu" "{mint}Ez a Boszorka megbünteti azokat, akik előreszaladtak!" + } + + "Common #146 Note" + { + "hu" "{mint}Ez a Fertőzötteket megbünteti azokat, akik előreszaladtak!" } // Ez egy valós Steam32ID. Ne töröld! Ez csak egy példa. @@ -10325,16 +13225,6 @@ // { // "hu" "{mint}Ez a Köpködő valaki irányítja." // } - // - // "STEAM_0:1:23456789 Witch Name" - // { - // "hu" "Boszorka" - // } - // - // "STEAM_0:1:23456789 Witch" - // { - // "hu" "{mint}Ez a Boszorka valaki irányítja." - // } // -- // Adj saját kifejezést a saját Mutáns Tankjaidnak lentebb! } \ No newline at end of file diff --git a/addons/sourcemod/translations/mutant_tanks.phrases.txt b/addons/sourcemod/translations/mutant_tanks.phrases.txt index 4d462a8072..5962ba4a32 100644 --- a/addons/sourcemod/translations/mutant_tanks.phrases.txt +++ b/addons/sourcemod/translations/mutant_tanks.phrases.txt @@ -232,6 +232,16 @@ "en" "Mutant Tanks Version" } + "MTWarnRusher" + { + "en" "Group up with your team before you get hunted down!" + } + + "MTWarnSlacker" + { + "en" "Catch up to your team before you get hunted down!" + } + "Ammunition" { "en" "Ammunition" @@ -261,12 +271,17 @@ "AbilityButtonMode1" { - "en" "Press button(s) to activate your abilit(y/ies)." + "en" "Press button(s) to activate your abilities." } "AbilityButtonMode2" { - "en" "Hold button(s) down to use your abilit(y/ies)." + "en" "Hold button(s) down to use your abilities." + } + + "AbilityButtonMode3" + { + "en" "Press button(s) to toggle your abilities." } "Buttons" @@ -1112,6 +1127,11 @@ "en" "Tank" } + "NoNameBill" + { + "en" "Bill" + } + "NoNameBoomer" { "en" "Boomer" @@ -1122,6 +1142,26 @@ "en" "Charger" } + "NoNameCoach" + { + "en" "Coach" + } + + "NoNameCommon" + { + "en" "Common" + } + + "NoNameEllis" + { + "en" "Ellis" + } + + "NoNameFrancis" + { + "en" "Francis" + } + "NoNameHunter" { "en" "Hunter" @@ -1132,6 +1172,21 @@ "en" "Jockey" } + "NoNameLouis" + { + "en" "Louis" + } + + "NoNameNick" + { + "en" "Nick" + } + + "NoNameRochelle" + { + "en" "Rochelle" + } + "NoNameSmoker" { "en" "Smoker" @@ -1147,6 +1202,11 @@ "en" "Witch" } + "NoNameZoey" + { + "en" "Zoey" + } + "NoNote" { "en" "No note found for this Mutant Tank." @@ -1423,12 +1483,6 @@ } "RewardLadyKiller" - { - "#format" "{1:i}" - "en" "{1}{default} use(s) of{mint} Lady Killer" - } - - "RewardLadyKiller2" { "#format" "{1:i}" "en" "Your{mint} Lady Killer{default} has{yellow} {1}{default} use(s) left." @@ -2019,66 +2073,6 @@ "en" "Ammo Ability" } - "Blind" - { - "#format" "{1:t},{2:N}" - "en" "{olive}{1}{mint} blinded{olive} {2}{mint}!" - } - - "Blind2" - { - "#format" "{1:N}" - "en" "{olive}{1}{mint} is no longer blind!" - } - - "BlindAmmo" - { - "en" "You've used up all your blind range ability's ammo." - } - - "BlindDetails" - { - "en" "You blind survivors." - } - - "BlindHuman" - { - "#format" "{1:i},{2:i}" - "en" "You activated{olive} {1}{mint}/{olive}{2}{mint} of your blind ability!" - } - - "BlindHuman2" - { - "en" "Your blind ability failed to activate. Try again." - } - - "BlindHuman3" - { - "#format" "{1:i}" - "en" "Your blind ability still needs another{yellow} {1} second(s){mint} to recharge." - } - - "BlindHuman4" - { - "en" "There are no survivors nearby to use your blind ability on." - } - - "BlindHuman5" - { - "#format" "{1:i}" - "en" "Your blind ability ended and needs to recharge for{yellow} {1} second(s){mint}." - } - - "BlindMenu" - { - "en" "Blind Ability Information" - } - - "BlindMenu2" - { - "en" "Blind Ability" - } - "Bomb" { "#format" "{1:t},{2:N}" @@ -2450,19 +2444,25 @@ "en" "{olive}{1}{mint} dropped a melee weapon!" } + "Drop3" + { + "#format" "{1:t}" + "en" "{olive}{1}{mint} gave the survivors{yellow} items{mint}!" + } + "DropDetails" { - "en" "You drop a weapon upon death." + "en" "You drop a weapon and give survivors items upon death." } "DropHuman" { - "en" "You will drop a weapon when you die!" + "en" "You will give survivors items when you die!" } "DropHuman2" { - "en" "You will already drop a weapon upon death." + "en" "You will already give survivors items upon death." } "DropMenu" @@ -3422,31 +3422,28 @@ "en" "Heal Ability" } - "HitDetails" - { - "en" "You only take damage on certain parts of your body." - } - - "HitMenu" + "Hurt" { - "en" "Hit Ability Information" + "#format" "{1:t},{2:N}" + "en" "{olive}{1}{mint} is hurting{olive} {2}{mint}!" } - "HitMenu2" + "Hurt2" { - "en" "Hit Ability" + "#format" "{1:N}" + "en" "{olive}{1}{mint} is no longer hurting!" } - "Hurt" + "Hurt3" { "#format" "{1:t},{2:N}" - "en" "{olive}{1}{mint} is hurting{olive} {2}{mint}!" + "en" "{olive}{1}{mint} is pimp slapping{olive} {2}{mint}!" } - "Hurt2" + "Hurt4" { "#format" "{1:N}" - "en" "{olive}{1}{mint} is no longer hurting!" + "en" "{olive}{1}{mint} is no longer being pimp slapped!" } "HurtAmmo" @@ -3456,7 +3453,7 @@ "HurtDetails" { - "en" "You repeatedly hurt survivors." + "en" "You repeatedly hurt or pimp slap survivors." } "HurtHuman" @@ -3731,37 +3728,6 @@ "en" "Invert Ability" } - "Item" - { - "#format" "{1:t}" - "en" "{olive}{1}{mint} gave the survivors{yellow} items{mint}!" - } - - "ItemDetails" - { - "en" "You give survivors items upon death." - } - - "ItemHuman" - { - "en" "You will give survivors items when you die!" - } - - "ItemHuman2" - { - "en" "You will already give survivors items upon death." - } - - "ItemMenu" - { - "en" "Item Ability Information" - } - - "ItemMenu2" - { - "en" "Item Ability" - } - "Jump" { "#format" "{1:t},{2:N}" @@ -3856,42 +3822,6 @@ "en" "Jump Ability" } - "Kamikaze" - { - "#format" "{1:t},{2:N}" - "en" "{olive}{1}{mint} just went kamikaze on{olive} {2}{mint}!" - } - - "KamikazeDetails" - { - "en" "You kill yourself along with a survivor victim." - } - - "KamikazeHuman" - { - "en" "You activated your kamikaze ability!" - } - - "KamikazeHuman2" - { - "en" "Your kamikaze ability failed to activate. Try again." - } - - "KamikazeHuman3" - { - "en" "There are no survivors nearby to use your kamikaze ability on." - } - - "KamikazeMenu" - { - "en" "Kamikaze Ability Information" - } - - "KamikazeMenu2" - { - "en" "Kamikaze Ability" - } - "Lag" { "#format" "{1:t},{2:N}" @@ -4012,66 +3942,6 @@ "en" "Laser Ability" } - "Leech" - { - "#format" "{1:t},{2:N}" - "en" "{olive}{1}{mint} is{yellow} leeching health{mint} off of{olive} {2}{mint}!" - } - - "Leech2" - { - "#format" "{1:t},{2:N}" - "en" "{olive}{1}{mint} is no longer{yellow} leeching health{mint} off of{olive} {2}{mint}!" - } - - "LeechAmmo" - { - "en" "You've used up all your leech range ability's ammo." - } - - "LeechDetails" - { - "en" "You leech health off of survivors." - } - - "LeechHuman" - { - "#format" "{1:i},{2:i}" - "en" "You activated{olive} {1}{mint}/{olive}{2}{mint} of your leech ability!" - } - - "LeechHuman2" - { - "en" "Your leech ability failed to activate. Try again." - } - - "LeechHuman3" - { - "#format" "{1:i}" - "en" "Your leech ability still needs another{yellow} {1} second(s){mint} to recharge." - } - - "LeechHuman4" - { - "en" "There are no survivors nearby to use your leech ability on." - } - - "LeechHuman5" - { - "#format" "{1:i}" - "en" "Your leech ability ended and needs to recharge for{yellow} {1} second(s){mint}." - } - - "LeechMenu" - { - "en" "Leech Ability Information" - } - - "LeechMenu2" - { - "en" "Leech Ability" - } - "Lightning" { "#format" "{1:t}" @@ -4163,7 +4033,7 @@ "MedicDetails" { - "en" "You heal nearby special infected." + "en" "You heal nearby special infected only take damage on certain parts of your body." } "MedicHuman" @@ -4318,60 +4188,6 @@ "en" "Minion Ability" } - "Necro" - { - "#format" "{1:t}" - "en" "{olive}{1}{mint} resurrected nearby special infected!" - } - - "NecroAmmo" - { - "en" "You've used up all your necro ability's ammo." - } - - "NecroDetails" - { - "en" "You resurrect nearby special infected that die." - } - - "NecroHuman" - { - "#format" "{1:i},{2:i}" - "en" "You activated{olive} {1}{mint}/{olive}{2}{mint} of your necro ability!" - } - - "NecroHuman2" - { - "en" "Your necro ability failed to activate. Try again." - } - - "NecroHuman3" - { - "en" "You already activated your necro ability." - } - - "NecroHuman4" - { - "#format" "{1:i}" - "en" "Your necro ability still needs another{yellow} {1} second(s){mint} to recharge." - } - - "NecroHuman5" - { - "#format" "{1:i}" - "en" "Your necro ability ended and needs to recharge for{yellow} {1} second(s){mint}." - } - - "NecroMenu" - { - "en" "Necro Ability Information" - } - - "NecroMenu2" - { - "en" "Necro Ability" - } - "Nullify" { "#format" "{1:t},{2:N}" @@ -4511,7 +4327,7 @@ "PanicDetails" { - "en" "You start panic events." + "en" "You start panic events and spawn zombies." } "PanicHuman" @@ -4552,121 +4368,61 @@ "en" "Panic Ability" } - "Pimp" + "Puke" { "#format" "{1:t},{2:N}" - "en" "{olive}{1}{mint} is pimp slapping{olive} {2}{mint}!" - } - - "Pimp2" - { - "#format" "{1:N}" - "en" "{olive}{1}{mint} is no longer being pimp slapped!" + "en" "{olive}{1}{mint} puked on{olive} {2}{mint}!" } - "PimpAmmo" + "PukeAmmo" { - "en" "You've used up all your pimp slap range ability's ammo." + "en" "You've used up all your puke range ability's ammo." } - "PimpDetails" + "PukeDetails" { - "en" "You pimp slap survivors." + "en" "You puke on survivors." } - "PimpHuman" + "PukeHuman" { "#format" "{1:i},{2:i}" - "en" "You activated{olive} {1}{mint}/{olive}{2}{mint} of your pimp slap ability!" + "en" "You activated{olive} {1}{mint}/{olive}{2}{mint} of your puke ability!" } - "PimpHuman2" + "PukeHuman2" { - "en" "Your pimp slap ability failed to activate. Try again." + "en" "Your puke ability failed to activate. Try again." } - "PimpHuman3" + "PukeHuman3" { "#format" "{1:i}" - "en" "Your pimp slap ability still needs another{yellow} {1} second(s){mint} to recharge." + "en" "Your puke ability still needs another{yellow} {1} second(s){mint} to recharge." } - "PimpHuman4" + "PukeHuman4" { - "en" "There are no survivors nearby to use your pimp slap ability on." + "en" "There are no survivors nearby to use your puke ability on." } - "PimpHuman5" + "PukeHuman5" { "#format" "{1:i}" - "en" "Your pimp slap ability ended and needs to recharge for{yellow} {1} second(s){mint}." + "en" "Your puke ability ended and needs to recharge for{yellow} {1} second(s){mint}." } - "PimpMenu" + "PukeMenu" { - "en" "Pimp Ability Information" + "en" "Puke Ability Information" } - "PimpMenu2" + "PukeMenu2" { - "en" "Pimp Ability" + "en" "Puke Ability" } - "Puke" - { - "#format" "{1:t},{2:N}" - "en" "{olive}{1}{mint} puked on{olive} {2}{mint}!" - } - - "PukeAmmo" - { - "en" "You've used up all your puke range ability's ammo." - } - - "PukeDetails" - { - "en" "You puke on survivors." - } - - "PukeHuman" - { - "#format" "{1:i},{2:i}" - "en" "You activated{olive} {1}{mint}/{olive}{2}{mint} of your puke ability!" - } - - "PukeHuman2" - { - "en" "Your puke ability failed to activate. Try again." - } - - "PukeHuman3" - { - "#format" "{1:i}" - "en" "Your puke ability still needs another{yellow} {1} second(s){mint} to recharge." - } - - "PukeHuman4" - { - "en" "There are no survivors nearby to use your puke ability on." - } - - "PukeHuman5" - { - "#format" "{1:i}" - "en" "Your puke ability ended and needs to recharge for{yellow} {1} second(s){mint}." - } - - "PukeMenu" - { - "en" "Puke Ability Information" - } - - "PukeMenu2" - { - "en" "Puke Ability" - } - - "Pyro" + "Pyro" { "#format" "{1:t}" "en" "{olive}{1}{mint} ignited itself!" @@ -4953,6 +4709,18 @@ "en" "{olive}{1}{mint} stopped regenerating health!" } + "Regen3" + { + "#format" "{1:t},{2:N}" + "en" "{olive}{1}{mint} stole some health from{olive} {2}{mint}!" + } + + "Regen4" + { + "#format" "{1:N},{2:t}" + "en" "{olive}{1}{mint} stole some health from{olive} {2}{mint}!" + } + "RegenAmmo" { "en" "You've used up all your regen ability's ammo." @@ -4960,7 +4728,7 @@ "RegenDetails" { - "en" "You regenerate health." + "en" "You leech health off of survivors, regenerate health, gain health from hurting survivors, and can steal health from survivors and vice-versa." } "RegenHuman" @@ -5002,32 +4770,71 @@ } "Respawn" + { + "#format" "{1:t}" + "en" "{olive}{1}{mint} resurrected nearby special infected!" + } + + "Respawn2" { "#format" "{1:t}" "en" "{olive}{1}{mint} just respawned itself!" } "RespawnAmmo" + { + "en" "You've used up all your necro ability's ammo." + } + + "RespawnAmmo2" { "en" "You've used up all your respawns." } "RespawnDetails" { - "en" "You respawn upon death." + "en" "You respawn upon death and resurrect nearby special infected that die." } "RespawnHuman" { - "en" "You will respawn when you die!" + "#format" "{1:i},{2:i}" + "en" "You activated{olive} {1}{mint}/{olive}{2}{mint} of your necro ability!" } "RespawnHuman2" { - "en" "You will already respawn upon death." + "en" "Your necro ability failed to activate. Try again." } "RespawnHuman3" + { + "en" "You already activated your necro ability." + } + + "RespawnHuman4" + { + "#format" "{1:i}" + "en" "Your necro ability still needs another{yellow} {1} second(s){mint} to recharge." + } + + "RespawnHuman5" + { + "#format" "{1:i}" + "en" "Your necro ability ended and needs to recharge for{yellow} {1} second(s){mint}." + } + + "RespawnHuman6" + { + "en" "You will respawn when you die!" + } + + "RespawnHuman7" + { + "en" "You will already respawn upon death." + } + + "RespawnHuman8" { "#format" "{1:i},{2:i}" "en" "You activated{olive} {1}{mint}/{olive}{2}{mint} of your respawns!" @@ -5100,13 +4907,13 @@ "Rock" { "#format" "{1:t}" - "en" "{olive}{1}{mint} started a{yellow} rock shower{mint}!" + "en" "{olive}{1}{mint} is spamming rocks!" } "Rock2" { "#format" "{1:t}" - "en" "{olive}{1}'s{mint} rock shower ended!" + "en" "{olive}{1}{mint} is no longer spamming rocks!" } "RockAmmo" @@ -5116,35 +4923,35 @@ "RockDetails" { - "en" "You create rock showers." + "en" "You create rock showers and spam rocks at survivors." } "RockHuman" { "#format" "{1:i},{2:i}" - "en" "You activated{olive} {1}{mint}/{olive}{2}{mint} of your rock showers!" + "en" "You activated{olive} {1}{mint}/{olive}{2}{mint} of your rock spammer ability!" } "RockHuman2" { - "en" "Your rock shower failed to activate. Try again." + "en" "Your rock spammer ability failed to activate. Try again." } "RockHuman3" { - "en" "You already activated your rock shower." + "en" "You already activated your rock spammer ability." } "RockHuman4" { "#format" "{1:i}" - "en" "Your rock shower ability still needs another{yellow} {1} second(s){mint} to recharge." + "en" "Your rock spammer ability still needs another{yellow} {1} second(s){mint} to recharge." } "RockHuman5" { "#format" "{1:i}" - "en" "Your rock shower ability ended and needs to recharge for{yellow} {1} second(s){mint}." + "en" "Your rock spammer ability ended and needs to recharge for{yellow} {1} second(s){mint}." } "RockMenu" @@ -5157,120 +4964,6 @@ "en" "Rock Ability" } - "Rocket" - { - "#format" "{1:t},{2:N}" - "en" "{olive}{1}{mint} sent{olive} {2}{mint} into space!" - } - - "RocketAmmo" - { - "en" "You've used up all your rocket range ability's ammo." - } - - "RocketDetails" - { - "en" "You send survivors into space." - } - - "RocketHuman" - { - "#format" "{1:i},{2:i}" - "en" "You activated{olive} {1}{mint}/{olive}{2}{mint} of your rocket ability!" - } - - "RocketHuman2" - { - "en" "Your rocket ability failed to activate. Try again." - } - - "RocketHuman3" - { - "#format" "{1:i}" - "en" "Your rocket ability still needs another{yellow} {1} second(s){mint} to recharge." - } - - "RocketHuman4" - { - "en" "There are no survivors nearby to use your rocket ability on." - } - - "RocketHuman5" - { - "#format" "{1:i}" - "en" "Your rocket ability ended and needs to recharge for{yellow} {1} second(s){mint}." - } - - "RocketMenu" - { - "en" "Rocket Ability Information" - } - - "RocketMenu2" - { - "en" "Rocket Ability" - } - - "Shake" - { - "#format" "{1:t},{2:N}" - "en" "{olive}{1}{mint} is shaking{olive} {2}{mint}!" - } - - "Shake2" - { - "#format" "{1:N}" - "en" "{olive}{1}{mint} is no longer shaking!" - } - - "ShakeAmmo" - { - "en" "You've used up all your shake range ability's ammo." - } - - "ShakeDetails" - { - "en" "You shake the survivors' screens." - } - - "ShakeHuman" - { - "#format" "{1:i},{2:i}" - "en" "You activated{olive} {1}{mint}/{olive}{2}{mint} of your shake ability!" - } - - "ShakeHuman2" - { - "en" "Your shake ability failed to activate. Try again." - } - - "ShakeHuman3" - { - "#format" "{1:i}" - "en" "Your shake ability still needs another{yellow} {1} second(s){mint} to recharge." - } - - "ShakeHuman4" - { - "en" "There are no survivors nearby to use your shake ability on." - } - - "ShakeHuman5" - { - "#format" "{1:i}" - "en" "Your shake ability ended and needs to recharge for{yellow} {1} second(s){mint}." - } - - "ShakeMenu" - { - "en" "Shake Ability Information" - } - - "ShakeMenu2" - { - "en" "Shake Ability" - } - "Shield" { "#format" "{1:t}" @@ -5463,6 +5156,24 @@ "en" "{olive}{1}{mint} smashed{olive} {2}{mint} to death!" } + "Smash2" + { + "#format" "{1:t},{2:N}" + "en" "{olive}{1}{mint} just went kamikaze on{olive} {2}{mint}!" + } + + "Smash3" + { + "#format" "{1:t},{2:N}" + "en" "{olive}{1}{mint} sent{olive} {2}{mint} into space!" + } + + "Smash4" + { + "#format" "{1:t},{2:N}" + "en" "{olive}{1}{mint} smited{olive} {2}{mint}!" + } + "SmashAmmo" { "en" "You've used up all your smash range ability's ammo." @@ -5470,7 +5181,7 @@ "SmashDetails" { - "en" "You smash survivors to death." + "en" "You send survivors into space, smash survivors to death, smite survivors, and kill yourself along with a survivor victim." } "SmashHuman" @@ -5511,240 +5222,6 @@ "en" "Smash Ability" } - "Smite" - { - "#format" "{1:t},{2:N}" - "en" "{olive}{1}{mint} smited{olive} {2}{mint}!" - } - - "SmiteAmmo" - { - "en" "You've used up all your smite range ability's ammo." - } - - "SmiteDetails" - { - "en" "You smite survivors." - } - - "SmiteHuman" - { - "#format" "{1:i},{2:i}" - "en" "You activated{olive} {1}{mint}/{olive}{2}{mint} of your smite ability!" - } - - "SmiteHuman2" - { - "en" "Your smite ability failed to activate. Try again." - } - - "SmiteHuman3" - { - "#format" "{1:i}" - "en" "Your smite ability still needs another{yellow} {1} second(s){mint} to recharge." - } - - "SmiteHuman4" - { - "en" "There are no survivors nearby to use your smite ability on." - } - - "SmiteHuman5" - { - "#format" "{1:i}" - "en" "Your smite ability ended and needs to recharge for{yellow} {1} second(s){mint}." - } - - "SmiteMenu" - { - "en" "Smite Ability Information" - } - - "SmiteMenu2" - { - "en" "Smite Ability" - } - - "Spam" - { - "#format" "{1:t}" - "en" "{olive}{1}{mint} is spamming rocks!" - } - - "Spam2" - { - "#format" "{1:t}" - "en" "{olive}{1}{mint} is no longer spamming rocks!" - } - - "SpamAmmo" - { - "en" "You've used up all your spam ability's ammo." - } - - "SpamDetails" - { - "en" "You spam rocks at survivors." - } - - "SpamHuman" - { - "#format" "{1:i},{2:i}" - "en" "You activated{olive} {1}{mint}/{olive}{2}{mint} of your rock spammer ability!" - } - - "SpamHuman2" - { - "en" "Your rock spammer ability failed to activate. Try again." - } - - "SpamHuman3" - { - "en" "You already activated your rock spammer ability." - } - - "SpamHuman4" - { - "#format" "{1:i}" - "en" "Your rock spammer ability still needs another{yellow} {1} second(s){mint} to recharge." - } - - "SpamHuman5" - { - "#format" "{1:i}" - "en" "Your rock spammer ability ended and needs to recharge for{yellow} {1} second(s){mint}." - } - - "SpamMenu" - { - "en" "Spam Ability Information" - } - - "SpamMenu2" - { - "en" "Spam Ability" - } - - "Splash" - { - "#format" "{1:t}" - "en" "{olive}{1}{mint} is splashing damage at nearby survivors!" - } - - "Splash2" - { - "#format" "{1:t}" - "en" "{olive}{1}{mint} is no longer splashing damage at nearby survivors!" - } - - "SplashAmmo" - { - "en" "You've used up all your splash ability's ammo." - } - - "SplashDetails" - { - "en" "You constantly deal splash damage to nearby survivors." - } - - "SplashHuman" - { - "#format" "{1:i},{2:i}" - "en" "You activated{olive} {1}{mint}/{olive}{2}{mint} of your splash ability!" - } - - "SplashHuman2" - { - "en" "Your splash ability failed to activate. Try again." - } - - "SplashHuman3" - { - "en" "You already activated your splash ability." - } - - "SplashHuman4" - { - "#format" "{1:i}" - "en" "Your splash ability still needs another{yellow} {1} second(s){mint} to recharge." - } - - "SplashHuman5" - { - "#format" "{1:i}" - "en" "Your splash ability ended and needs to recharge for{yellow} {1} second(s){mint}." - } - - "SplashMenu" - { - "en" "Splash Ability Information" - } - - "SplashMenu2" - { - "en" "Splash Ability" - } - - "Splatter" - { - "#format" "{1:t},{2:N}" - "en" "{olive}{1}{mint} is splattering{olive} {2}'s{mint} screen!" - } - - "Splatter2" - { - "#format" "{1:N}" - "en" "{olive}{1}'s{mint} screen is no longer being splattered{mint}!" - } - - "SplatterAmmo" - { - "en" "You've used up all your splatter ability's ammo." - } - - "SplatterDetails" - { - "en" "You splatter the survivors' screens." - } - - "SplatterHuman" - { - "#format" "{1:i},{2:i}" - "en" "You activated{olive} {1}{mint}/{olive}{2}{mint} of your splatter ability!" - } - - "SplatterHuman2" - { - "en" "Your splatter ability failed to activate. Try again." - } - - "SplatterHuman3" - { - "#format" "{1:i}" - "en" "Your splatter ability still needs another{yellow} {1} second(s){mint} to recharge." - } - - "SplatterHuman4" - { - "en" "There are no survivors nearby to use your splatter ability on." - } - - "SplatterHuman5" - { - "#format" "{1:i}" - "en" "Your splatter ability ended and needs to recharge for{yellow} {1} second(s){mint}." - } - - "SplatterMenu" - { - "en" "Splatter Ability Information" - } - - "SplatterMenu2" - { - "en" "Splatter Ability" - } - "Throw" { "#format" "{1:t}" @@ -5992,34 +5469,49 @@ "en" "Undead Ability" } - "Vampire" + "Vision" { "#format" "{1:t},{2:N}" - "en" "{olive}{1}{mint} stole some health from{olive} {2}{mint}!" + "en" "{olive}{1}{mint} blinded{olive} {2}{mint}!" } - "VampireDetails" + "Vision2" { - "en" "You gain health from hurting survivors." + "#format" "{1:N}" + "en" "{olive}{1}{mint} is no longer blind!" } - "VampireMenu" + "Vision3" { - "en" "Vampire Ability Information" + "#format" "{1:t},{2:N}" + "en" "{olive}{1}{mint} is shaking{olive} {2}{mint}!" } - "VampireMenu2" + "Vision4" { - "en" "Vampire Ability" + "#format" "{1:N}" + "en" "{olive}{1}{mint} is no longer shaking!" } - "Vision" + "Vision5" + { + "#format" "{1:t},{2:N}" + "en" "{olive}{1}{mint} is splattering{olive} {2}'s{mint} screen!" + } + + "Vision6" + { + "#format" "{1:N}" + "en" "{olive}{1}'s{mint} screen is no longer being splattered{mint}!" + } + + "Vision7" { "#format" "{1:t},{2:N},{3:i}" "en" "{olive}{1}{mint} changed{olive} {2}'s{mint} vision to{yellow} {3}{mint} FOV!" } - "Vision2" + "Vision8" { "#format" "{1:N},{2:i}" "en" "{olive}{1}'s{mint} vision changed back to{yellow} {2}{mint} FOV!" @@ -6032,7 +5524,7 @@ "VisionDetails" { - "en" "You change the survivors' field of view." + "en" "You blind survivors, shake the survivors' screens, splatter the survivors' screens, and change the survivors' field of view." } "VisionHuman" @@ -6282,33 +5774,6 @@ "en" "Witch Ability" } - "Xiphos" - { - "#format" "{1:t},{2:N}" - "en" "{olive}{1}{mint} stole some health from{olive} {2}{mint}!" - } - - "Xiphos2" - { - "#format" "{1:N},{2:t}" - "en" "{olive}{1}{mint} stole some health from{olive} {2}{mint}!" - } - - "XiphosDetails" - { - "en" "You can steal health from survivors and vice-versa." - } - - "XiphosMenu" - { - "en" "Xiphos Ability Information" - } - - "XiphosMenu2" - { - "en" "Xiphos Ability" - } - "Yell" { "#format" "{1:t}" @@ -6368,64 +5833,4 @@ { "en" "Yell Ability" } - - "Zombie" - { - "#format" "{1:t}" - "en" "{olive}{1}{mint} will spawn zombies periodically!" - } - - "Zombie2" - { - "#format" "{1:t}" - "en" "{olive}{1}{mint} spawned{yellow} zombies{mint}!" - } - - "ZombieAmmo" - { - "en" "You've used up all your zombie spawner ability's ammo." - } - - "ZombieDetails" - { - "en" "You spawn zombies." - } - - "ZombieHuman" - { - "#format" "{1:i},{2:i}" - "en" "You activated{olive} {1}{mint}/{olive}{2}{mint} of your zombie spawner ability!" - } - - "ZombieHuman2" - { - "en" "Your zombie spawner ability failed to activate. Try again." - } - - "ZombieHuman3" - { - "en" "You already activated your zombie spawner ability." - } - - "ZombieHuman4" - { - "#format" "{1:i}" - "en" "Your zombie spawner ability still needs another{yellow} {1} second(s){mint} to recharge." - } - - "ZombieHuman5" - { - "#format" "{1:i}" - "en" "Your zombie spawner ability ended and needs to recharge for{yellow} {1} second(s){mint}." - } - - "ZombieMenu" - { - "en" "Zombie Ability Information" - } - - "ZombieMenu2" - { - "en" "Zombie Ability" - } } \ No newline at end of file diff --git a/addons/sourcemod/translations/mutant_tanks_names.phrases.txt b/addons/sourcemod/translations/mutant_tanks_names.phrases.txt index a8afe3b93d..5ed03a042c 100644 --- a/addons/sourcemod/translations/mutant_tanks_names.phrases.txt +++ b/addons/sourcemod/translations/mutant_tanks_names.phrases.txt @@ -54,6 +54,11 @@ "en" "Absorber Witch" } + "Common #1 Name" + { + "en" "Absorber Common" + } + "Tank #1" { "en" "{mint}This Tank can absorb most of the damage it receives." @@ -94,6 +99,11 @@ "en" "{mint}This Witch can absorb most of the damage it receives." } + "Common #1" + { + "en" "{mint}This Common can absorb most of the damage it receives." + } + "Tank #2 Name" { "en" "Acidic Tank" @@ -134,6 +144,11 @@ "en" "Acidic Witch" } + "Common #2 Name" + { + "en" "Acidic Common" + } + "Tank #2" { "en" "{mint}This Tank can create acid puddles underneath survivors." @@ -174,6 +189,11 @@ "en" "{mint}This Witch can create acid puddles underneath survivors." } + "Common #2" + { + "en" "{mint}This Common can create acid puddles underneath survivors." + } + "Tank #3 Name" { "en" "Aimless Tank" @@ -214,6 +234,11 @@ "en" "Aimless Witch" } + "Common #3 Name" + { + "en" "Aimless Common" + } + "Tank #3" { "en" "{mint}This Tank can prevent survivors from aiming." @@ -254,6 +279,11 @@ "en" "{mint}This Witch can prevent survivors from aiming." } + "Common #3" + { + "en" "{mint}This Common can prevent survivors from aiming." + } + "Tank #4 Name" { "en" "Ammo Tank" @@ -294,6 +324,11 @@ "en" "Ammo Witch" } + "Common #4 Name" + { + "en" "Ammo Common" + } + "Tank #4" { "en" "{mint}This Tank can steal some or all of your ammunition." @@ -334,6 +369,11 @@ "en" "{mint}This Witch can steal some or all of your ammunition." } + "Common #4" + { + "en" "{mint}This Common can steal some or all of your ammunition." + } + "Tank #5 Name" { "en" "Blind Tank" @@ -374,6 +414,11 @@ "en" "Blind Witch" } + "Common #5 Name" + { + "en" "Blind Common" + } + "Tank #5" { "en" "{mint}This Tank can blind survivors." @@ -414,6 +459,11 @@ "en" "{mint}This Witch can blind survivors." } + "Common #5" + { + "en" "{mint}This Common can blind survivors." + } + "Tank #6 Name" { "en" "Bomber Tank" @@ -454,6 +504,11 @@ "en" "Bomber Witch" } + "Common #6 Name" + { + "en" "Bomber Common" + } + "Tank #6" { "en" "{mint}This Tank can cause explosions and is immune to explosive damage." @@ -494,6 +549,11 @@ "en" "{mint}This Witch can cause explosions and is immune to explosive damage." } + "Common #6" + { + "en" "{mint}This Common can cause explosions and is immune to explosive damage." + } + "Tank #7 Name" { "en" "Boomer Tank" @@ -534,6 +594,11 @@ "en" "Boomer Witch" } + "Common #7 Name" + { + "en" "Boomer Common" + } + "Tank #7" { "en" "{mint}This Tank can spawn Boomers behind it and throw some at survivors too." @@ -574,6 +639,11 @@ "en" "{mint}This Witch can spawn Boomers behind it." } + "Common #7" + { + "en" "{mint}This Common can spawn Boomers behind it." + } + "Tank #8 Name" { "en" "Bulletproof Tank" @@ -614,6 +684,11 @@ "en" "Bulletproof Witch" } + "Common #8 Name" + { + "en" "Bulletproof Common" + } + "Tank #8" { "en" "{mint}This Tank is immune to bullet damage." @@ -654,6 +729,11 @@ "en" "{mint}This Witch is immune to bullet damage." } + "Common #8" + { + "en" "{mint}This Common is immune to bullet damage." + } + "Tank #9 Name" { "en" "Burier Tank" @@ -694,6 +774,11 @@ "en" "Burier Witch" } + "Common #9 Name" + { + "en" "Burier Common" + } + "Tank #9" { "en" "{mint}This Tank can bury survivors." @@ -734,6 +819,11 @@ "en" "{mint}This Witch can bury survivors." } + "Common #9" + { + "en" "{mint}This Common can bury survivors." + } + "Tank #10 Name" { "en" "Car Tank" @@ -774,6 +864,11 @@ "en" "Car Witch" } + "Common #10 Name" + { + "en" "Car Common" + } + "Tank #10" { "en" "{mint}This Tank can throw cars at survivors. The cars disappear after 30 seconds." @@ -814,6 +909,11 @@ "en" "{mint}This Witch can start car showers. The cars disappear after 30 seconds." } + "Common #10" + { + "en" "{mint}This Common can start car showers. The cars disappear after 30 seconds." + } + "Tank #11 Name" { "en" "Charger Tank" @@ -854,6 +954,11 @@ "en" "Charger Witch" } + "Common #11 Name" + { + "en" "Charger Common" + } + "Tank #11" { "en" "{mint}This Tank can spawn Chargers behind it and throw some at survivors too." @@ -894,6 +999,11 @@ "en" "{mint}This Witch can spawn Chargers behind it." } + "Common #11" + { + "en" "{mint}This Common can spawn Chargers behind it." + } + "Tank #12 Name" { "en" "Choker Tank" @@ -934,6 +1044,11 @@ "en" "Choker Witch" } + "Common #12 Name" + { + "en" "Choker Common" + } + "Tank #12" { "en" "{mint}This Tank can choke survivors in the air." @@ -974,6 +1089,11 @@ "en" "{mint}This Witch can choke survivors in the air." } + "Common #12" + { + "en" "{mint}This Common can choke survivors in the air." + } + "Tank #13 Name" { "en" "Clone Tank" @@ -1014,6 +1134,11 @@ "en" "Clone Witch" } + "Common #13 Name" + { + "en" "Clone Common" + } + "Tank #13" { "en" "{mint}This Tank can spawn clones behind it and throw some at survivors too." @@ -1054,6 +1179,11 @@ "en" "{mint}This Witch can spawn clones behind it." } + "Common #13" + { + "en" "{mint}This Common can spawn clones behind it." + } + "Tank #14 Name" { "en" "Cloudy Tank" @@ -1094,6 +1224,11 @@ "en" "Cloudy Witch" } + "Common #14 Name" + { + "en" "Cloudy Common" + } + "Tank #14" { "en" "{mint}This Tank can emit clouds of smoke that damage survivors caught in them." @@ -1134,6 +1269,11 @@ "en" "{mint}This Witch can emit clouds of smoke that damage survivors caught in them." } + "Common #14" + { + "en" "{mint}This Common can emit clouds of smoke that damage survivors caught in them." + } + "Tank #15 Name" { "en" "Dropper Tank" @@ -1174,6 +1314,11 @@ "en" "Dropper Witch" } + "Common #15 Name" + { + "en" "Dropper Common" + } + "Tank #15" { "en" "{mint}This Tank can drop a random weapon upon death." @@ -1214,6 +1359,11 @@ "en" "{mint}This Witch can drop a random weapon upon death." } + "Common #15" + { + "en" "{mint}This Common can drop a random weapon upon death." + } + "Tank #16 Name" { "en" "Drugger Tank" @@ -1254,6 +1404,11 @@ "en" "Drugger Witch" } + "Common #16 Name" + { + "en" "Drugger Common" + } + "Tank #16" { "en" "{mint}This Tank can drug survivors." @@ -1294,6 +1449,11 @@ "en" "{mint}This Witch can drug survivors." } + "Common #16" + { + "en" "{mint}This Common can drug survivors." + } + "Tank #17 Name" { "en" "Drunk Tank" @@ -1334,6 +1494,11 @@ "en" "Drunk Witch" } + "Common #17 Name" + { + "en" "Drunk Common" + } + "Tank #17" { "en" "{mint}This Tank can make survivors drunk." @@ -1374,6 +1539,11 @@ "en" "{mint}This Witch can make survivors drunk." } + "Common #17" + { + "en" "{mint}This Common can make survivors drunk." + } + "Tank #18 Name" { "en" "Electric Tank" @@ -1414,6 +1584,11 @@ "en" "Electric Witch" } + "Common #18 Name" + { + "en" "Electric Common" + } + "Tank #18" { "en" "{mint}This Tank can electrocute survivors." @@ -1454,6 +1629,11 @@ "en" "{mint}This Witch can electrocute survivors." } + "Common #18" + { + "en" "{mint}This Common can electrocute survivors." + } + "Tank #19 Name" { "en" "Enforcer Tank" @@ -1494,6 +1674,11 @@ "en" "Enforcer Witch" } + "Common #19 Name" + { + "en" "Enforcer Common" + } + "Tank #19" { "en" "{mint}This Tank can force survivors to equip a specific weapon slot for a certain period of time." @@ -1534,6 +1719,11 @@ "en" "{mint}This Witch can force survivors to equip a specific weapon slot for a certain period of time." } + "Common #19" + { + "en" "{mint}This Common can force survivors to equip a specific weapon slot for a certain period of time." + } + "Tank #20 Name" { "en" "Fast Tank" @@ -1574,6 +1764,11 @@ "en" "Fast Witch" } + "Common #20 Name" + { + "en" "Fast Common" + } + "Tank #20" { "en" "{mint}This Tank can run really fast like the Flash." @@ -1614,6 +1809,11 @@ "en" "{mint}This Witch can run really fast like the Flash." } + "Common #20" + { + "en" "{mint}This Common can run really fast like the Flash." + } + "Tank #21 Name" { "en" "Fireproof Tank" @@ -1654,6 +1854,11 @@ "en" "Fireproof Witch" } + "Common #21 Name" + { + "en" "Fireproof Common" + } + "Tank #21" { "en" "{mint}This Tank can start fires and is immune to fire damage." @@ -1694,6 +1899,11 @@ "en" "{mint}This Witch can start fires and is immune to fire damage." } + "Common #21" + { + "en" "{mint}This Common can start fires and is immune to fire damage." + } + "Tank #22 Name" { "en" "Flinger Tank" @@ -1734,6 +1944,11 @@ "en" "Flinger Witch" } + "Common #22 Name" + { + "en" "Flinger Common" + } + "Tank #22" { "en" "{mint}This Tank can fling survivors away or into the air." @@ -1774,6 +1989,11 @@ "en" "{mint}This Witch can fling survivors away or into the air." } + "Common #22" + { + "en" "{mint}This Common can fling survivors away or into the air." + } + "Tank #23 Name" { "en" "Flying Tank" @@ -1814,6 +2034,11 @@ "en" "Flying Witch" } + "Common #23 Name" + { + "en" "Flying Common" + } + "Tank #23" { "en" "{mint}This Tank flies around looking for victims." @@ -1854,6 +2079,11 @@ "en" "{mint}This Witch flies around looking for victims." } + "Common #23" + { + "en" "{mint}This Common flies around looking for victims." + } + "Tank #24 Name" { "en" "Fragile Tank" @@ -1894,6 +2124,11 @@ "en" "Fragile Witch" } + "Common #24 Name" + { + "en" "Fragile Common" + } + "Tank #24" { "en" "{mint}This Tank takes extra damage while dealing more damage and running faster." @@ -1934,6 +2169,11 @@ "en" "{mint}This Witch takes extra damage while dealing more damage and running faster." } + "Common #24" + { + "en" "{mint}This Common takes extra damage while dealing more damage and running faster." + } + "Tank #25 Name" { "en" "Ghost Tank" @@ -1974,6 +2214,11 @@ "en" "Ghost Witch" } + "Common #25 Name" + { + "en" "Ghost Common" + } + "Tank #25" { "en" "{mint}This Tank can cloak itself and disarm survivors." @@ -2014,6 +2259,11 @@ "en" "{mint}This Witch can cloak itself and disarm survivors." } + "Common #25" + { + "en" "{mint}This Common can cloak itself and disarm survivors." + } + "Tank #26 Name" { "en" "Godly Tank" @@ -2054,6 +2304,11 @@ "en" "Godly Witch" } + "Common #26 Name" + { + "en" "Godly Common" + } + "Tank #26" { "en" "{mint}This Tank can gain temporary invincibility." @@ -2094,6 +2349,11 @@ "en" "{mint}This Witch can gain temporary invincibility." } + "Common #26" + { + "en" "{mint}This Common can gain temporary invincibility." + } + "Tank #27 Name" { "en" "Gravity Tank" @@ -2134,6 +2394,11 @@ "en" "Gravity Witch" } + "Common #27 Name" + { + "en" "Gravity Common" + } + "Tank #27" { "en" "{mint}This Tank can pull survivors and infected towards it and lower survivors' gravity." @@ -2174,6 +2439,11 @@ "en" "{mint}This Witch can pull survivors and infected towards it and lower survivors' gravity." } + "Common #27" + { + "en" "{mint}This Common can pull survivors and infected towards it and lower survivors' gravity." + } + "Tank #28 Name" { "en" "Gunner Tank" @@ -2214,6 +2484,11 @@ "en" "Gunner Witch" } + "Common #28 Name" + { + "en" "Gunner Common" + } + "Tank #28" { "en" "{mint}This Tank can arm itself with guns and fire gunshots at survivors." @@ -2254,6 +2529,11 @@ "en" "{mint}This Witch can arm itself with guns and fire gunshots at survivors." } + "Common #28" + { + "en" "{mint}This Common can arm itself with guns and fire gunshots at survivors." + } + "Tank #29 Name" { "en" "Healthy Tank" @@ -2294,6 +2574,11 @@ "en" "Healthy Witch" } + "Common #29 Name" + { + "en" "Healthy Common" + } + "Tank #29" { "en" "{mint}This Tank can give survivors temporary health, and it can absorb health from nearby infected." @@ -2334,6 +2619,11 @@ "en" "{mint}This Witch can give survivors temporary health, and it can absorb health from nearby infected." } + "Common #29" + { + "en" "{mint}This Common can give survivors temporary health, and it can absorb health from nearby infected." + } + "Tank #30 Name" { "en" "Hitter Tank" @@ -2374,6 +2664,11 @@ "en" "Hitter Witch" } + "Common #30 Name" + { + "en" "Hitter Common" + } + "Tank #30" { "en" "{mint}This Tank can only be damaged by headshots." @@ -2414,6 +2709,11 @@ "en" "{mint}This Witch can only be damaged by headshots." } + "Common #30" + { + "en" "{mint}This Common can only be damaged by headshots." + } + "Tank #31 Name" { "en" "Hunter Tank" @@ -2454,6 +2754,11 @@ "en" "Hunter Witch" } + "Common #31 Name" + { + "en" "Hunter Common" + } + "Tank #31" { "en" "{mint}This Tank can spawn Hunters behind it and throw some at survivors too." @@ -2494,6 +2799,11 @@ "en" "{mint}This Witch can spawn Hunters behind it." } + "Common #31" + { + "en" "{mint}This Common can spawn Hunters behind it." + } + "Tank #32 Name" { "en" "Hurtful Tank" @@ -2534,6 +2844,11 @@ "en" "Hurtful Witch" } + "Common #32 Name" + { + "en" "Hurtful Common" + } + "Tank #32" { "en" "{mint}This Tank can constantly hurt survivors for a certain period of time." @@ -2574,6 +2889,11 @@ "en" "{mint}This Witch can constantly hurt survivors for a certain period of time." } + "Common #32" + { + "en" "{mint}This Common can constantly hurt survivors for a certain period of time." + } + "Tank #33 Name" { "en" "Hypnotizer Tank" @@ -2614,6 +2934,11 @@ "en" "Hypnotizer Witch" } + "Common #33 Name" + { + "en" "Hypnotizer Common" + } + "Tank #33" { "en" "{mint}This Tank can hypnotize survivors to hurt themselves or their teammates." @@ -2654,6 +2979,11 @@ "en" "{mint}This Witch can hypnotize survivors to hurt themselves or their teammates." } + "Common #33" + { + "en" "{mint}This Common can hypnotize survivors to hurt themselves or their teammates." + } + "Tank #34 Name" { "en" "Icy Tank" @@ -2694,6 +3024,11 @@ "en" "Icy Witch" } + "Common #34 Name" + { + "en" "Icy Common" + } + "Tank #34" { "en" "{mint}This Tank can freeze survivors." @@ -2734,6 +3069,11 @@ "en" "{mint}This Witch can freeze survivors." } + "Common #34" + { + "en" "{mint}This Common can freeze survivors." + } + "Tank #35 Name" { "en" "Idler Tank" @@ -2774,6 +3114,11 @@ "en" "Idler Witch" } + "Common #35 Name" + { + "en" "Idler Common" + } + "Tank #35" { "en" "{mint}This Tank can make survivors go idle. (This doesn't affect bots.)" @@ -2814,6 +3159,11 @@ "en" "{mint}This Witch can make survivors go idle. (This doesn't affect bots.)" } + "Common #35" + { + "en" "{mint}This Common can make survivors go idle. (This doesn't affect bots.)" + } + "Tank #36 Name" { "en" "Inverter Tank" @@ -2854,6 +3204,11 @@ "en" "Inverter Witch" } + "Common #36 Name" + { + "en" "Inverter Common" + } + "Tank #36" { "en" "{mint}This Tank can invert survivors' movement keys." @@ -2894,6 +3249,11 @@ "en" "{mint}This Witch can invert survivors' movement keys." } + "Common #36" + { + "en" "{mint}This Common can invert survivors' movement keys." + } + "Tank #37 Name" { "en" "Item Tank" @@ -2934,6 +3294,11 @@ "en" "Item Witch" } + "Common #37 Name" + { + "en" "Item Common" + } + "Tank #37" { "en" "{mint}This Tank can give survivors items upon death." @@ -2974,6 +3339,11 @@ "en" "{mint}This Witch can give survivors items upon death." } + "Common #37" + { + "en" "{mint}This Common can give survivors items upon death." + } + "Tank #38 Name" { "en" "Jockey Tank" @@ -3014,6 +3384,11 @@ "en" "Jockey Witch" } + "Common #38 Name" + { + "en" "Jockey Common" + } + "Tank #38" { "en" "{mint}This Tank can spawn Jockeys behind it and throw some at survivors too." @@ -3054,6 +3429,11 @@ "en" "{mint}This Witch can spawn Jockeys behind it." } + "Common #38" + { + "en" "{mint}This Common can spawn Jockeys behind it." + } + "Tank #39 Name" { "en" "Jumper Tank" @@ -3094,6 +3474,11 @@ "en" "Jumper Witch" } + "Common #39 Name" + { + "en" "Jumper Common" + } + "Tank #39" { "en" "{mint}This Tank can jump periodically and make survivors jump uncontrollably." @@ -3134,6 +3519,11 @@ "en" "{mint}This Witch can jump periodically and make survivors jump uncontrollably." } + "Common #39" + { + "en" "{mint}This Common can jump periodically and make survivors jump uncontrollably." + } + "Tank #40 Name" { "en" "Kamikaze Tank" @@ -3174,6 +3564,11 @@ "en" "Kamikaze Witch" } + "Common #40 Name" + { + "en" "Kamikaze Common" + } + "Tank #40" { "en" "{mint}This Tank can kill itself along with a survivor victim." @@ -3214,6 +3609,11 @@ "en" "{mint}This Witch can kill itself along with a survivor victim." } + "Common #40" + { + "en" "{mint}This Common can kill itself along with a survivor victim." + } + "Tank #41 Name" { "en" "Lagger Tank" @@ -3254,6 +3654,11 @@ "en" "Lagger Witch" } + "Common #41 Name" + { + "en" "Lagger Common" + } + "Tank #41" { "en" "{mint}This Tank can make survivors lag." @@ -3294,6 +3699,11 @@ "en" "{mint}This Witch can make survivors lag." } + "Common #41" + { + "en" "{mint}This Common can make survivors lag." + } + "Tank #42 Name" { "en" "Laser Tank" @@ -3334,6 +3744,11 @@ "en" "Laser Witch" } + "Common #42 Name" + { + "en" "Laser Common" + } + "Tank #42" { "en" "{mint}This Tank can shoot lasers at survivors." @@ -3374,6 +3789,11 @@ "en" "{mint}This Witch can shoot lasers at survivors." } + "Common #42" + { + "en" "{mint}This Common can shoot lasers at survivors." + } + "Tank #43 Name" { "en" "Leecher Tank" @@ -3414,6 +3834,11 @@ "en" "Leecher Witch" } + "Common #43 Name" + { + "en" "Leecher Common" + } + "Tank #43" { "en" "{mint}This Tank can leech off health from survivors." @@ -3454,7 +3879,12 @@ "en" "{mint}This Witch can leech off health from survivors." } - "Tank #44 Name" + "Common #43" + { + "en" "{mint}This Common can leech off health from survivors." + } + + "Tank #44 Name" { "en" "Lightning Tank" } @@ -3494,6 +3924,11 @@ "en" "Lightning Witch" } + "Common #44 Name" + { + "en" "Lightning Common" + } + "Tank #44" { "en" "{mint}This Tank creates lightning storms." @@ -3534,6 +3969,11 @@ "en" "{mint}This Witch creates lightning storms." } + "Common #44" + { + "en" "{mint}This Common creates lightning storms." + } + "Tank #45 Name" { "en" "Medic Tank" @@ -3574,6 +4014,11 @@ "en" "Medic Witch" } + "Common #45 Name" + { + "en" "Medic Common" + } + "Tank #45" { "en" "{mint}This Tank can heal nearby special infected upon death." @@ -3614,6 +4059,11 @@ "en" "{mint}This Witch can heal nearby special infected upon death." } + "Common #45" + { + "en" "{mint}This Common can heal nearby special infected upon death." + } + "Tank #46 Name" { "en" "Meteor Tank" @@ -3654,6 +4104,11 @@ "en" "Meteor Witch" } + "Common #46 Name" + { + "en" "Meteor Common" + } + "Tank #46" { "en" "{mint}This Tank can start meteor showers with meteorites that burn and explode after a few seconds." @@ -3694,6 +4149,11 @@ "en" "{mint}This Witch can start meteor showers with meteorites that burn and explode after a few seconds." } + "Common #46" + { + "en" "{mint}This Common can start meteor showers with meteorites that burn and explode after a few seconds." + } + "Tank #47 Name" { "en" "Necromancer Tank" @@ -3734,6 +4194,11 @@ "en" "Necromancer Witch" } + "Common #47 Name" + { + "en" "Necromancer Common" + } + "Tank #47" { "en" "{mint}This Tank can resurrect dead special infected." @@ -3774,6 +4239,11 @@ "en" "{mint}This Witch can resurrect dead special infected." } + "Common #47" + { + "en" "{mint}This Common can resurrect dead special infected." + } + "Tank #48 Name" { "en" "Nullifier Tank" @@ -3814,6 +4284,11 @@ "en" "Nullifier Witch" } + "Common #48 Name" + { + "en" "Nullifier Common" + } + "Tank #48" { "en" "{mint}This Tank can nullify survivors' damage to protect itself from damage." @@ -3854,6 +4329,11 @@ "en" "{mint}This Witch can nullify survivors' damage to protect itself from damage." } + "Common #48" + { + "en" "{mint}This Common can nullify survivors' damage to protect itself from damage." + } + "Tank #49 Name" { "en" "Omni Tank" @@ -3894,6 +4374,11 @@ "en" "Omni Witch" } + "Common #49 Name" + { + "en" "Omni Common" + } + "Tank #49" { "en" "{mint}This Tank can access other nearby Mutant Tanks' abilities." @@ -3934,6 +4419,11 @@ "en" "{mint}This Witch can access other nearby Mutant Witches' abilities." } + "Common #49" + { + "en" "{mint}This Common can access other nearby Mutant Witches' abilities." + } + "Tank #50 Name" { "en" "Panic Tank" @@ -3974,6 +4464,11 @@ "en" "Panic Witch" } + "Common #50 Name" + { + "en" "Panic Common" + } + "Tank #50" { "en" "{mint}This Tank can start panic events with hordes of zombies." @@ -4014,6 +4509,11 @@ "en" "{mint}This Witch can start panic events with hordes of zombies." } + "Common #50" + { + "en" "{mint}This Common can start panic events with hordes of zombies." + } + "Tank #51 Name" { "en" "Pet Tank" @@ -4054,6 +4554,11 @@ "en" "Pet Witch" } + "Common #51 Name" + { + "en" "Pet Common" + } + "Tank #51" { "en" "{mint}This Tank is loyal to the survivors and loves to give hugs." @@ -4094,6 +4599,11 @@ "en" "{mint}This Witch is loyal to the survivors and loves to give hugs." } + "Common #51" + { + "en" "{mint}This Common is loyal to the survivors and loves to give hugs." + } + "Tank #52 Name" { "en" "Pimp Tank" @@ -4134,6 +4644,11 @@ "en" "Pimp Witch" } + "Common #52 Name" + { + "en" "Pimp Common" + } + "Tank #52" { "en" "{mint}This Tank can pimp slap survivors repeatedly to show them who's boss." @@ -4174,6 +4689,11 @@ "en" "{mint}This Witch can pimp slap survivors repeatedly to show them who's boss." } + "Common #52" + { + "en" "{mint}This Common can pimp slap survivors repeatedly to show them who's boss." + } + "Tank #53 Name" { "en" "Platinum Tank" @@ -4214,6 +4734,11 @@ "en" "Platinum Witch" } + "Common #53 Name" + { + "en" "Platinum Common" + } + "Tank #53" { "en" "{mint}This Tank is immune to melee damage." @@ -4254,6 +4779,11 @@ "en" "{mint}This Witch is immune to melee damage." } + "Common #53" + { + "en" "{mint}This Common is immune to melee damage." + } + "Tank #54 Name" { "en" "Puke Tank" @@ -4294,6 +4824,11 @@ "en" "Puke Witch" } + "Common #54 Name" + { + "en" "Puke Common" + } + "Tank #54" { "en" "{mint}This Tank can puke on survivors." @@ -4334,6 +4869,11 @@ "en" "{mint}This Witch can puke on survivors." } + "Common #54" + { + "en" "{mint}This Common can puke on survivors." + } + "Tank #55 Name" { "en" "Pyromaniac Tank" @@ -4374,6 +4914,11 @@ "en" "Pyromaniac Witch" } + "Common #55 Name" + { + "en" "Pyromaniac Common" + } + "Tank #55" { "en" "{mint}This Tank gains a speed boost when set on fire." @@ -4414,6 +4959,11 @@ "en" "{mint}This Witch gains a speed boost when set on fire." } + "Common #55" + { + "en" "{mint}This Common gains a speed boost when set on fire." + } + "Tank #56 Name" { "en" "Quiet Tank" @@ -4454,6 +5004,11 @@ "en" "Quiet Witch" } + "Common #56 Name" + { + "en" "Quiet Common" + } + "Tank #56" { "en" "{mint}This Tank can silence itself from survivors." @@ -4494,6 +5049,11 @@ "en" "{mint}This Witch can silence itself from survivors." } + "Common #56" + { + "en" "{mint}This Common can silence itself from survivors." + } + "Tank #57 Name" { "en" "Recall Tank" @@ -4534,6 +5094,11 @@ "en" "Recall Witch" } + "Common #57 Name" + { + "en" "Recall Common" + } + "Tank #57" { "en" "{mint}This Tank can time travel to annoy survivors." @@ -4574,6 +5139,11 @@ "en" "{mint}This Witch can time travel to annoy survivors." } + "Common #57" + { + "en" "{mint}This Common can time travel to annoy survivors." + } + "Tank #58 Name" { "en" "Recoil Tank" @@ -4614,6 +5184,11 @@ "en" "Recoil Witch" } + "Common #58 Name" + { + "en" "Recoil Common" + } + "Tank #58" { "en" "{mint}This Tank can give survivors high gun recoil." @@ -4654,6 +5229,11 @@ "en" "{mint}This Witch can give survivors high gun recoil." } + "Common #58" + { + "en" "{mint}This Common can give survivors high gun recoil." + } + "Tank #59 Name" { "en" "Regenerative Tank" @@ -4694,6 +5274,11 @@ "en" "Regenerative Witch" } + "Common #59 Name" + { + "en" "Regenerative Common" + } + "Tank #59" { "en" "{mint}This Tank regenerates health every second." @@ -4734,6 +5319,11 @@ "en" "{mint}This Witch regenerates health every second." } + "Common #59" + { + "en" "{mint}This Common regenerates health every second." + } + "Tank #60 Name" { "en" "Respawner Tank" @@ -4774,6 +5364,11 @@ "en" "Respawner Witch" } + "Common #60 Name" + { + "en" "Respawner Common" + } + "Tank #60" { "en" "{mint}This Tank can respawn upon death." @@ -4814,6 +5409,11 @@ "en" "{mint}This Witch can respawn upon death." } + "Common #60" + { + "en" "{mint}This Common can respawn upon death." + } + "Tank #61 Name" { "en" "Restarter Tank" @@ -4854,6 +5454,11 @@ "en" "Restarter Witch" } + "Common #61 Name" + { + "en" "Restarter Common" + } + "Tank #61" { "en" "{mint}This Tank can force survivors to restart with a new loadout." @@ -4894,6 +5499,11 @@ "en" "{mint}This Witch can force survivors to restart with a new loadout." } + "Common #61" + { + "en" "{mint}This Common can force survivors to restart with a new loadout." + } + "Tank #62 Name" { "en" "Rock Tank" @@ -4934,6 +5544,11 @@ "en" "Rock Witch" } + "Common #62 Name" + { + "en" "Rock Common" + } + "Tank #62" { "en" "{mint}This Tank can start rock showers." @@ -4974,6 +5589,11 @@ "en" "{mint}This Witch can start rock showers." } + "Common #62" + { + "en" "{mint}This Common can start rock showers." + } + "Tank #63 Name" { "en" "Rocketeer Tank" @@ -5014,6 +5634,11 @@ "en" "Rocketeer Witch" } + "Common #63 Name" + { + "en" "Rocketeer Common" + } + "Tank #63" { "en" "{mint}This Tank can send survivors into space." @@ -5054,6 +5679,11 @@ "en" "{mint}This Witch can send survivors into space." } + "Common #63" + { + "en" "{mint}This Common can send survivors into space." + } + "Tank #64 Name" { "en" "Self-throwing Tank" @@ -5094,6 +5724,11 @@ "en" "Self-throwing Witch" } + "Common #64 Name" + { + "en" "Self-throwing Common" + } + "Tank #64" { "en" "{mint}This Tank can throw itself towards survivors." @@ -5134,6 +5769,11 @@ "en" "{mint}This Witch can throw itself towards survivors." } + "Common #64" + { + "en" "{mint}This Common can throw itself towards survivors." + } + "Tank #65 Name" { "en" "Shaker Tank" @@ -5174,6 +5814,11 @@ "en" "Shaker Witch" } + "Common #65 Name" + { + "en" "Shaker Common" + } + "Tank #65" { "en" "{mint}This Tank can shake survivors' screens." @@ -5214,6 +5859,11 @@ "en" "{mint}This Witch can shake survivors' screens." } + "Common #65" + { + "en" "{mint}This Common can shake survivors' screens." + } + "Tank #66 Name" { "en" "Shield Tank" @@ -5254,6 +5904,11 @@ "en" "Shield Witch" } + "Common #66 Name" + { + "en" "Shield Common" + } + "Tank #66" { "en" "{mint}This Tank spawns with a shield and throws propane tanks or gas cans which survivors can use to break the shield." @@ -5294,6 +5949,11 @@ "en" "{mint}This Witch spawns with a shield." } + "Common #66" + { + "en" "{mint}This Common spawns with a shield." + } + "Tank #67 Name" { "en" "Shover Tank" @@ -5334,6 +5994,11 @@ "en" "Shover Witch" } + "Common #67 Name" + { + "en" "Shover Common" + } + "Tank #67" { "en" "{mint}This Tank can shove survivors around." @@ -5374,6 +6039,11 @@ "en" "{mint}This Witch can shove survivors around." } + "Common #67" + { + "en" "{mint}This Common can shove survivors around." + } + "Tank #68 Name" { "en" "Slow Tank" @@ -5414,6 +6084,11 @@ "en" "Slow Witch" } + "Common #68 Name" + { + "en" "Slow Common" + } + "Tank #68" { "en" "{mint}This Tank can slow survivors down." @@ -5454,6 +6129,11 @@ "en" "{mint}This Witch can slow survivors down." } + "Common #68" + { + "en" "{mint}This Common can slow survivors down." + } + "Tank #69 Name" { "en" "Smasher Tank" @@ -5494,6 +6174,11 @@ "en" "Smasher Witch" } + "Common #69 Name" + { + "en" "Smasher Common" + } + "Tank #69" { "en" "{mint}This Tank can smash survivors to death." @@ -5534,6 +6219,11 @@ "en" "{mint}This Witch can smash survivors to death." } + "Common #69" + { + "en" "{mint}This Common can smash survivors to death." + } + "Tank #70 Name" { "en" "Smiter Tank" @@ -5574,6 +6264,11 @@ "en" "Smiter Witch" } + "Common #70 Name" + { + "en" "Smiter Common" + } + "Tank #70" { "en" "{mint}This Tank can smite survivors for an instant kill." @@ -5614,6 +6309,11 @@ "en" "{mint}This Witch can smite survivors for an instant kill." } + "Common #70" + { + "en" "{mint}This Common can smite survivors for an instant kill." + } + "Tank #71 Name" { "en" "Smoker Tank" @@ -5654,6 +6354,11 @@ "en" "Smoker Witch" } + "Common #71 Name" + { + "en" "Smoker Common" + } + "Tank #71" { "en" "{mint}This Tank can spawn Smokers behind it and throw some at survivors too." @@ -5694,6 +6399,11 @@ "en" "{mint}This Witch can spawn Smokers behind it." } + "Common #71" + { + "en" "{mint}This Common can spawn Smokers behind it." + } + "Tank #72 Name" { "en" "Spammer Tank" @@ -5734,6 +6444,11 @@ "en" "Spammer Witch" } + "Common #72 Name" + { + "en" "Spammer Common" + } + "Tank #72" { "en" "{mint}This Tank can spam rocks at survivors." @@ -5774,6 +6489,11 @@ "en" "{mint}This Witch can spam rocks at survivors." } + "Common #72" + { + "en" "{mint}This Common can spam rocks at survivors." + } + "Tank #73 Name" { "en" "Special Tank" @@ -5814,6 +6534,11 @@ "en" "Special Witch" } + "Common #73 Name" + { + "en" "Special Common" + } + "Tank #73" { "en" "{mint}This Tank can spawn random special infected behind it and throw some at survivors too." @@ -5854,6 +6579,11 @@ "en" "{mint}This Witch can spawn random special infected behind it." } + "Common #73" + { + "en" "{mint}This Common can spawn random special infected behind it." + } + "Tank #74 Name" { "en" "Spitter Tank" @@ -5894,6 +6624,11 @@ "en" "Spitter Witch" } + "Common #74 Name" + { + "en" "Spitter Common" + } + "Tank #74" { "en" "{mint}This Tank can spawn Spitters behind it and throw some at survivors too." @@ -5934,6 +6669,11 @@ "en" "{mint}This Witch can spawn Spitters behind it." } + "Common #74" + { + "en" "{mint}This Common can spawn Spitters behind it." + } + "Tank #75 Name" { "en" "Splasher Tank" @@ -5974,6 +6714,11 @@ "en" "Splasher Witch" } + "Common #75 Name" + { + "en" "Splasher Common" + } + "Tank #75" { "en" "{mint}This Tank can release a splash of damage within a certain radius." @@ -6014,6 +6759,11 @@ "en" "{mint}This Witch can release a splash of damage within a certain radius." } + "Common #75" + { + "en" "{mint}This Common can release a splash of damage within a certain radius." + } + "Tank #76 Name" { "en" "Splatter Tank" @@ -6054,6 +6804,11 @@ "en" "Splatter Witch" } + "Common #76 Name" + { + "en" "Splatter Common" + } + "Tank #76" { "en" "{mint}This Tank can cover everyone's screens with splatters." @@ -6094,6 +6849,11 @@ "en" "{mint}This Witch can cover everyone's screens with splatters." } + "Common #76" + { + "en" "{mint}This Common can cover everyone's screens with splatters." + } + "Tank #77 Name" { "en" "Thrower Tank" @@ -6134,6 +6894,11 @@ "en" "Thrower Witch" } + "Common #77 Name" + { + "en" "Thrower Common" + } + "Tank #77" { "en" "{mint}This Tank can throw cars, special infected, Tanks, Witches, and itself!" @@ -6174,6 +6939,11 @@ "en" "{mint}This Witch can throw cars, special infected, Tanks, Witches, and itself!" } + "Common #77" + { + "en" "{mint}This Common can throw cars, special infected, Tanks, Witches, and itself!" + } + "Tank #78 Name" { "en" "Tracker Tank" @@ -6214,6 +6984,11 @@ "en" "Tracker Witch" } + "Common #78 Name" + { + "en" "Tracker Common" + } + "Tank #78" { "en" "{mint}This Tank throws rocks which can track nearby survivors." @@ -6254,6 +7029,11 @@ "en" "{mint}This Witch throws rocks which can track nearby survivors." } + "Common #78" + { + "en" "{mint}This Common throws rocks which can track nearby survivors." + } + "Tank #79 Name" { "en" "Ultimate Tank" @@ -6294,6 +7074,11 @@ "en" "Ultimate Witch" } + "Common #79 Name" + { + "en" "Ultimate Common" + } + "Tank #79" { "en" "{mint}This Tank gains temporary godmode and damage boost when low on health." @@ -6334,6 +7119,11 @@ "en" "{mint}This Witch gains temporary godmode and damage boost when low on health." } + "Common #79" + { + "en" "{mint}This Common gains temporary godmode and damage boost when low on health." + } + "Tank #80 Name" { "en" "Undead Tank" @@ -6374,6 +7164,11 @@ "en" "Undead Witch" } + "Common #80 Name" + { + "en" "Undead Common" + } + "Tank #80" { "en" "{mint}This Tank regains full HP when close to dying." @@ -6414,6 +7209,11 @@ "en" "{mint}This Witch regains full HP when close to dying." } + "Common #80" + { + "en" "{mint}This Common regains full HP when close to dying." + } + "Tank #81 Name" { "en" "Vampire Tank" @@ -6454,6 +7254,11 @@ "en" "Vampire Witch" } + "Common #81 Name" + { + "en" "Vampire Common" + } + "Tank #81" { "en" "{mint}This Tank can steal health from survivors." @@ -6494,6 +7299,11 @@ "en" "{mint}This Witch can steal health from survivors." } + "Common #81" + { + "en" "{mint}This Common can steal health from survivors." + } + "Tank #82 Name" { "en" "Visual Tank" @@ -6534,6 +7344,11 @@ "en" "Visual Witch" } + "Common #82 Name" + { + "en" "Visual Common" + } + "Tank #82" { "en" "{mint}This Tank can change the FOV of survivors." @@ -6574,6 +7389,11 @@ "en" "{mint}This Witch can change the FOV of survivors." } + "Common #82" + { + "en" "{mint}This Common can change the FOV of survivors." + } + "Tank #83 Name" { "en" "Warper Tank" @@ -6614,6 +7434,11 @@ "en" "Warper Witch" } + "Common #83 Name" + { + "en" "Warper Common" + } + "Tank #83" { "en" "{mint}This Tank can warp to a random survivor." @@ -6654,6 +7479,11 @@ "en" "{mint}This Witch can warp to a random survivor." } + "Common #83" + { + "en" "{mint}This Common can warp to a random survivor." + } + "Tank #84 Name" { "en" "Whirler Tank" @@ -6694,6 +7524,11 @@ "en" "Whirler Witch" } + "Common #84 Name" + { + "en" "Whirler Common" + } + "Tank #84" { "en" "{mint}This Tank can make survivors whirl." @@ -6734,6 +7569,11 @@ "en" "{mint}This Witch can make survivors whirl." } + "Common #84" + { + "en" "{mint}This Common can make survivors whirl." + } + "Tank #85 Name" { "en" "Witch Tank" @@ -6774,6 +7614,11 @@ "en" "Witch Witch" } + "Common #85 Name" + { + "en" "Witch Common" + } + "Tank #85" { "en" "{mint}This Tank can convert nearby common infected into Witches and throw some at survivors too." @@ -6814,6 +7659,11 @@ "en" "{mint}This Witch can convert nearby common infected into Witches." } + "Common #85" + { + "en" "{mint}This Common can convert nearby common infected into Witches." + } + "Tank #86 Name" { "en" "Xiphos Tank" @@ -6854,6 +7704,11 @@ "en" "Xiphos Witch" } + "Common #86 Name" + { + "en" "Xiphos Common" + } + "Tank #86" { "en" "{mint}This Tank can steal health from survivors and vice-versa." @@ -6894,6 +7749,11 @@ "en" "{mint}This Witch can steal health from survivors and vice-versa." } + "Common #86" + { + "en" "{mint}This Common can steal health from survivors and vice-versa." + } + "Tank #87 Name" { "en" "Yeller Tank" @@ -6934,6 +7794,11 @@ "en" "Yeller Witch" } + "Common #87 Name" + { + "en" "Yeller Common" + } + "Tank #87" { "en" "{mint}This Tank can yell to defean survivors." @@ -6974,6 +7839,11 @@ "en" "{mint}This Witch can yell to defean survivors." } + "Common #87" + { + "en" "{mint}This Common can yell to defean survivors." + } + "Tank #88 Name" { "en" "Zombie Tank" @@ -7014,6 +7884,11 @@ "en" "Zombie Witch" } + "Common #88 Name" + { + "en" "Zombie Common" + } + "Tank #88" { "en" "{mint}This Tank can create a mob of zombies within the area." @@ -7054,6 +7929,11 @@ "en" "{mint}This Witch can create a mob of zombies within the area." } + "Common #88" + { + "en" "{mint}This Common can create a mob of zombies within the area." + } + "Tank #89 Name" { "en" "Armageddon Tank" @@ -7094,6 +7974,11 @@ "en" "Armageddon Witch" } + "Common #89 Name" + { + "en" "Armageddon Common" + } + "Tank #89" { "en" "{mint}This Tank is immune to explosives, can pull survivors and infected towards it, and can start meteor showers." @@ -7134,6 +8019,11 @@ "en" "{mint}This Witch is immune to explosives, can pull survivors and infected towards it, and can start meteor showers." } + "Common #89" + { + "en" "{mint}This Common is immune to explosives, can pull survivors and infected towards it, and can start meteor showers." + } + "Tank #90 Name" { "en" "Boss Tank" @@ -7174,6 +8064,11 @@ "en" "Boss Witch" } + "Common #90 Name" + { + "en" "Boss Common" + } + "Tank #90" { "en" "{mint}Fire immunity, fast, cloak itself, disarm survivors, pull survivors in and change their gravity, jump periodically, start meteor showers, spawn with a shield, smite survivors, warp to survivors, and spawn Witches/zombies." @@ -7214,6 +8109,11 @@ "en" "{mint}Fire immunity, fast, cloak itself, disarm survivors, pull survivors in and change their gravity, jump periodically, start meteor showers, spawn with a shield, smite survivors, warp to survivors, and spawn Witches/zombies." } + "Common #90" + { + "en" "{mint}Fire immunity, fast, cloak itself, disarm survivors, pull survivors in and change their gravity, jump periodically, start meteor showers, spawn with a shield, smite survivors, warp to survivors, and spawn Witches/zombies." + } + "Tank #91 Name" { "en" "Cobalt Tank" @@ -7254,6 +8154,11 @@ "en" "Cobalt Witch" } + "Common #91 Name" + { + "en" "Cobalt Common" + } + "Tank #91" { "en" "{mint}This Tank is immune to fire damage and can run really fast." @@ -7294,6 +8199,11 @@ "en" "{mint}This Witch is immune to fire damage and can run really fast." } + "Common #91" + { + "en" "{mint}This Common is immune to fire damage and can run really fast." + } + "Tank #92 Name" { "en" "Distraction Tank" @@ -7334,6 +8244,11 @@ "en" "Distraction Witch" } + "Common #92 Name" + { + "en" "Distraction Common" + } + "Tank #92" { "en" "{mint}This Tank can jump periodically, make survivors jump uncontrollably, and warp to survivors." @@ -7374,6 +8289,11 @@ "en" "{mint}This Witch can jump periodically, make survivors jump uncontrollably, and warp to survivors." } + "Common #92" + { + "en" "{mint}This Common can jump periodically, make survivors jump uncontrollably, and warp to survivors." + } + "Tank #93 Name" { "en" "Feedback Tank" @@ -7414,6 +8334,11 @@ "en" "Feedback Witch" } + "Common #93 Name" + { + "en" "Feedback Common" + } + "Tank #93" { "en" "{mint}This Tank pushes survivors away." @@ -7454,6 +8379,11 @@ "en" "{mint}This Witch pushes survivors away." } + "Common #93" + { + "en" "{mint}This Common pushes survivors away." + } + "Tank #94 Name" { "en" "Flash Tank" @@ -7494,6 +8424,11 @@ "en" "Flash Witch" } + "Common #94 Name" + { + "en" "Flash Common" + } + "Tank #94" { "en" "{mint}This Tank can run really fast, throw electricity at survivors, and slow down time around itself, all while having temporary invincibility." @@ -7534,6 +8469,11 @@ "en" "{mint}This Witch can run really fast and slow down time around itself, all while having temporary invincibility." } + "Common #94" + { + "en" "{mint}This Common can run really fast and slow down time around itself, all while having temporary invincibility." + } + "Tank #95 Name" { "en" "Goliath Tank" @@ -7574,6 +8514,11 @@ "en" "Goliath Witch" } + "Common #95 Name" + { + "en" "Goliath Common" + } + "Tank #95" { "en" "{mint}Fire immunity, moves slowly, give survivors temporary health, absorbs health from nearby infected, spawns with a shield, and smites survivors." @@ -7614,6 +8559,11 @@ "en" "{mint}Fire immunity, moves slowly, give survivors temporary health, absorbs health from nearby infected, spawns with a shield, and smites survivors." } + "Common #95" + { + "en" "{mint}Fire immunity, moves slowly, give survivors temporary health, absorbs health from nearby infected, spawns with a shield, and smites survivors." + } + "Tank #96 Name" { "en" "Hallucination Tank" @@ -7654,6 +8604,11 @@ "en" "Hallucination Witch" } + "Common #96 Name" + { + "en" "Hallucination Common" + } + "Tank #96" { "en" "{mint}Fire immunity, cloaks itself, and warps to survivors." @@ -7694,6 +8649,11 @@ "en" "{mint}Fire immunity, cloaks itself, and warps to survivors." } + "Common #96" + { + "en" "{mint}Fire immunity, cloaks itself, and warps to survivors." + } + "Tank #97 Name" { "en" "Meme Tank" @@ -7734,6 +8694,11 @@ "en" "Meme Witch" } + "Common #97 Name" + { + "en" "Meme Common" + } + "Tank #97" { "en" "{mint}Fire immunity, absorbs damage, runs fast, cloaks itself, pulls survivors in and changes their gravity, jumps high, starts meteor showers, smites survivors, spams rocks, warps to survivors, and spawns Witches/zombies." @@ -7774,6 +8739,11 @@ "en" "{mint}Fire immunity, absorbs damage, runs fast, cloaks itself, pulls survivors in and changes their gravity, jumps high, starts meteor showers, smites survivors, spams rocks, warps to survivors, and spawns Witches/zombies." } + "Common #97" + { + "en" "{mint}Fire immunity, absorbs damage, runs fast, cloaks itself, pulls survivors in and changes their gravity, jumps high, starts meteor showers, smites survivors, spams rocks, warps to survivors, and spawns Witches/zombies." + } + "Tank #98 Name" { "en" "Mirage Tank" @@ -7814,6 +8784,11 @@ "en" "Mirage Witch" } + "Common #98 Name" + { + "en" "Mirage Common" + } + "Tank #98" { "en" "{mint}This Tank is immune to fire damage, runs fast, and warps to survivors." @@ -7854,6 +8829,11 @@ "en" "{mint}This Witch is immune to fire damage, runs fast, and warps to survivors." } + "Common #98" + { + "en" "{mint}This Common is immune to fire damage, runs fast, and warps to survivors." + } + "Tank #99 Name" { "en" "Poltergeist Tank" @@ -7894,6 +8874,11 @@ "en" "Poltergeist Witch" } + "Common #99 Name" + { + "en" "Poltergeist Common" + } + "Tank #99" { "en" "{mint}This Tank is immune to fire damage, runs fast, cloaks itself, and warps to survivors." @@ -7934,6 +8919,11 @@ "en" "{mint}This Witch is immune to fire damage, runs fast, cloaks itself, and warps to survivors." } + "Common #99" + { + "en" "{mint}This Common is immune to fire damage, runs fast, cloaks itself, and warps to survivors." + } + "Tank #100 Name" { "en" "Psychotic Tank" @@ -7974,6 +8964,11 @@ "en" "Psychotic Witch" } + "Common #100 Name" + { + "en" "Psychotic Common" + } + "Tank #100" { "en" "{mint}This Tank can give survivors temporary health, absorb health from nearby infected, start meteor showers, spawn with a shield, and warp to survivors." @@ -8014,6 +9009,11 @@ "en" "{mint}This Witch can give survivors temporary health, absorb health from nearby infected, start meteor showers, spawn with a shield, and warp to survivors." } + "Common #100" + { + "en" "{mint}This Common can give survivors temporary health, absorb health from nearby infected, start meteor showers, spawn with a shield, and warp to survivors." + } + "Tank #101 Name" { "en" "Reverse-Flash Tank" @@ -8054,6 +9054,11 @@ "en" "Reverse-Flash Witch" } + "Common #101 Name" + { + "en" "Reverse-Flash Common" + } + "Tank #101" { "en" "{mint}This Tank is immune to fire damage, runs really fast, and warps to survivors." @@ -8094,6 +9099,11 @@ "en" "{mint}This Witch is immune to fire damage, runs really fast, and warps to survivors." } + "Common #101" + { + "en" "{mint}This Common is immune to fire damage, runs really fast, and warps to survivors." + } + "Tank #102 Name" { "en" "Spawner Tank" @@ -8134,6 +9144,11 @@ "en" "Spawner Witch" } + "Common #102 Name" + { + "en" "Spawner Common" + } + "Tank #102" { "en" "{mint}This Tank spawns zombies behind clouds of smoke within the area." @@ -8174,6 +9189,11 @@ "en" "{mint}This Witch spawns zombies behind clouds of smoke within the area." } + "Common #102" + { + "en" "{mint}This Common spawns zombies behind clouds of smoke within the area." + } + "Tank #103 Name" { "en" "Zoom Tank" @@ -8214,6 +9234,11 @@ "en" "Zoom Witch" } + "Common #103 Name" + { + "en" "Zoom Common" + } + "Tank #103" { "en" "{mint}This Tank is immune to fire damage, runs really fast, and warps to survivors." @@ -8254,6 +9279,11 @@ "en" "{mint}This Witch is immune to fire damage, runs really fast, and warps to survivors." } + "Common #103" + { + "en" "{mint}This Common is immune to fire damage, runs really fast, and warps to survivors." + } + "Tank #104 Name" { "en" "Trap Tank" @@ -8294,6 +9324,11 @@ "en" "Trap Witch" } + "Common #104 Name" + { + "en" "Trap Common" + } + "Tank #104" { "en" "{mint}This Tank is not what it seems." @@ -8334,6 +9369,11 @@ "en" "{mint}This Witch is not what it seems." } + "Common #104" + { + "en" "{mint}This Common is not what it seems." + } + "Tank #105 Name" { "en" "Dread Tank" @@ -8374,6 +9414,11 @@ "en" "Dread Witch" } + "Common #105 Name" + { + "en" "Dread Common" + } + "Tank #105" { "en" "{mint}This Tank can partially blind survivors." @@ -8414,6 +9459,11 @@ "en" "{mint}This Witch can partially blind survivors." } + "Common #105" + { + "en" "{mint}This Common can partially blind survivors." + } + "Tank #106 Name" { "en" "Rabid Tank" @@ -8454,6 +9504,11 @@ "en" "Rabid Witch" } + "Common #106 Name" + { + "en" "Rabid Common" + } + "Tank #106" { "en" "{mint}This Tank can partially drug and hurt survivors." @@ -8494,6 +9549,11 @@ "en" "{mint}This Witch can partially drug and hurt survivors." } + "Common #106" + { + "en" "{mint}This Common can partially drug and hurt survivors." + } + "Tank #107 Name" { "en" "Tremor Tank" @@ -8534,6 +9594,11 @@ "en" "Tremor Witch" } + "Common #107 Name" + { + "en" "Tremor Common" + } + "Tank #107" { "en" "{mint}This Tank can hurl rocks at survivors." @@ -8574,6 +9639,11 @@ "en" "{mint}This Witch can hurl rocks at survivors." } + "Common #107" + { + "en" "{mint}This Common can hurl rocks at survivors." + } + "Tank #108 Name" { "en" "Psyk0tik Tank" @@ -8614,6 +9684,11 @@ "en" "Psyk0tik Witch" } + "Common #108 Name" + { + "en" "Psyk0tik Common" + } + "Tank #108" { "en" "{mint}This Tank does extra damage and runs really fast while cloaking itself and slowing survivors down." @@ -8654,6 +9729,11 @@ "en" "{mint}This Witch does extra damage and runs really fast while cloaking itself and slowing survivors down." } + "Common #108" + { + "en" "{mint}This Common does extra damage and runs really fast while cloaking itself and slowing survivors down." + } + "Tank #109 Name" { "en" "Apocalyptic Tank" @@ -8694,6 +9774,11 @@ "en" "Apocalyptic Witch" } + "Common #109 Name" + { + "en" "Apocalyptic Common" + } + "Tank #109" { "en" "{mint}This Tank is immune to fire damage, runs a little faster, starts meteor showers, panic events, and rock showers." @@ -8734,6 +9819,11 @@ "en" "{mint}This Witch is immune to fire damage, runs a little faster, starts meteor showers, panic events, and rock showers." } + "Common #109" + { + "en" "{mint}This Common is immune to fire damage, runs a little faster, starts meteor showers, panic events, and rock showers." + } + "Tank #110 Name" { "en" "Darth Vader Tank" @@ -8774,6 +9864,11 @@ "en" "Darth Vader Witch" } + "Common #110 Name" + { + "en" "Darth Vader Common" + } + "Tank #110" { "en" "{mint}It's Darth Vader... And he is... A Mutant Tank with the Force!" @@ -8814,6 +9909,11 @@ "en" "{mint}It's Darth Vader... And he is... A Mutant Witch with the Force!" } + "Common #110" + { + "en" "{mint}It's Darth Vader... And he is... A Mutant Common with the Force!" + } + "Tank #111 Name" { "en" "Drug Addict Tank" @@ -8854,6 +9954,11 @@ "en" "Drug Addict Witch" } + "Common #111 Name" + { + "en" "Drug Addict Common" + } + "Tank #111" { "en" "{mint}This Tank has a contagious addiction." @@ -8894,6 +9999,11 @@ "en" "{mint}This Witch has a contagious addiction." } + "Common #111" + { + "en" "{mint}This Common has a contagious addiction." + } + "Tank #112 Name" { "en" "Godspeed Tank" @@ -8934,6 +10044,11 @@ "en" "Godspeed Witch" } + "Common #112 Name" + { + "en" "Godspeed Common" + } + "Tank #112" { "en" "{mint}This Tank is immune to fire damage, runs really fast, and warps to survivors." @@ -8974,6 +10089,11 @@ "en" "{mint}This Witch is immune to fire damage, runs really fast, and warps to survivors." } + "Common #112" + { + "en" "{mint}This Common is immune to fire damage, runs really fast, and warps to survivors." + } + "Tank #113 Name" { "en" "Grim Reaper Tank" @@ -9014,6 +10134,11 @@ "en" "Grim Reaper Witch" } + "Common #113 Name" + { + "en" "Grim Reaper Common" + } + "Tank #113" { "en" "{mint}This Tank runs a little faster, buries survivors, cloaks itself, and warps to survivors." @@ -9054,6 +10179,11 @@ "en" "{mint}This Witch runs a little faster, buries survivors, cloaks itself, and warps to survivors." } + "Common #113" + { + "en" "{mint}This Common runs a little faster, buries survivors, cloaks itself, and warps to survivors." + } + "Tank #114 Name" { "en" "Horde Tank" @@ -9094,6 +10224,11 @@ "en" "Horde Witch" } + "Common #114 Name" + { + "en" "Horde Common" + } + "Tank #114" { "en" "{mint}This Tank can start panic events and puke on survivors to help prolong them." @@ -9134,6 +10269,11 @@ "en" "{mint}This Witch can start panic events and puke on survivors to help prolong them." } + "Common #114" + { + "en" "{mint}This Common can start panic events and puke on survivors to help prolong them." + } + "Tank #115 Name" { "en" "Hulk Tank" @@ -9174,6 +10314,11 @@ "en" "Hulk Witch" } + "Common #115 Name" + { + "en" "Hulk Common" + } + "Tank #115" { "en" "{mint}Meet the Incredible Hulk! This Tank has most of the abilities of the Hulk!" @@ -9214,6 +10359,11 @@ "en" "{mint}Meet the Incredible Hulk! This Witch has most of the abilities of the Hulk!" } + "Common #115" + { + "en" "{mint}Meet the Incredible Hulk! This Common has most of the abilities of the Hulk!" + } + "Tank #116 Name" { "en" "Ninja Tank" @@ -9254,6 +10404,11 @@ "en" "Ninja Witch" } + "Common #116 Name" + { + "en" "Ninja Common" + } + "Tank #116" { "en" "{mint}This Tank can teleport, move around silently, and cloak itself. Be very careful!" @@ -9294,6 +10449,11 @@ "en" "{mint}This Witch can teleport, move around silently, and cloak itself. Be very careful!" } + "Common #116" + { + "en" "{mint}This Common can teleport, move around silently, and cloak itself. Be very careful!" + } + "Tank #117 Name" { "en" "Zen Tank" @@ -9334,6 +10494,11 @@ "en" "Zen Witch" } + "Common #117 Name" + { + "en" "Zen Common" + } + "Tank #117" { "en" "{mint}This Tank is too busy meditating to care about you." @@ -9374,6 +10539,11 @@ "en" "{mint}This Witch is too busy meditating to care about you." } + "Common #117" + { + "en" "{mint}This Common is too busy meditating to care about you." + } + "Tank #118 Name" { "en" "The Boss (1st Form)" @@ -9414,6 +10584,11 @@ "en" "The Boss (1st Form)" } + "Common #118 Name" + { + "en" "The Boss (1st Form)" + } + "Tank #118" { "en" "{mint}This Tank throws explosive rocks and periodically warps to survivors." @@ -9454,6 +10629,11 @@ "en" "{mint}This Witch periodically warps to survivors." } + "Common #118" + { + "en" "{mint}This Common periodically warps to survivors." + } + "Tank #119 Name" { "en" "Steel Overlord (2nd Form)" @@ -9494,6 +10674,11 @@ "en" "Steel Overlord (2nd Form)" } + "Common #119 Name" + { + "en" "Steel Overlord (2nd Form)" + } + "Tank #119" { "en" "{mint}This Tank runs a little faster, is immune to melee, is a bit stronger than usual, throws explosive rocks, can change survivors' gravity, and periodically warps to survivors." @@ -9534,6 +10719,11 @@ "en" "{mint}This Witch runs a little faster, is immune to melee, is a bit stronger than usual, can change survivors' gravity, and periodically warps to survivors." } + "Common #119" + { + "en" "{mint}This Common runs a little faster, is immune to melee, is a bit stronger than usual, can change survivors' gravity, and periodically warps to survivors." + } + "Tank #120 Name" { "en" "Night Stalker (3rd Form)" @@ -9574,6 +10764,11 @@ "en" "Night Stalker (3rd Form)" } + "Common #120 Name" + { + "en" "Night Stalker (3rd Form)" + } + "Tank #120" { "en" "{mint}This Tank runs a little faster, is immune to fire, is a bit weaker than usual, throws explosive rocks, can blind survivors, can go invisible, and periodically warps to survivors." @@ -9614,6 +10809,11 @@ "en" "{mint}This Witch runs a little faster, is immune to fire, is a bit weaker than usual, can blind survivors, can go invisible, and periodically warps to survivors." } + "Common #120" + { + "en" "{mint}This Common runs a little faster, is immune to fire, is a bit weaker than usual, can blind survivors, can go invisible, and periodically warps to survivors." + } + "Tank #121 Name" { "en" "Spirit of Fire (4th Form)" @@ -9654,6 +10854,11 @@ "en" "Spirit of Fire (4th Form)" } + "Common #121 Name" + { + "en" "Spirit of Fire (4th Form)" + } + "Tank #121" { "en" "{mint}This Tank runs a little faster, is immune to fire, is stronger than usual, throws explosive rocks, create fires, give survivors temporary health, jump periodically, and periodically warps to survivors." @@ -9694,6 +10899,11 @@ "en" "{mint}This Witch runs a little faster, is immune to fire, is stronger than usual, create fires, give survivors temporary health, jump periodically, and periodically warps to survivors." } + "Common #121" + { + "en" "{mint}This Common runs a little faster, is immune to fire, is stronger than usual, create fires, give survivors temporary health, jump periodically, and periodically warps to survivors." + } + "Tank #122 Name" { "en" "Randomizer Tank" @@ -9734,6 +10944,11 @@ "en" "Randomizer Witch" } + "Common #122 Name" + { + "en" "Randomizer Common" + } + "Tank #122" { "en" "{mint}This Tank randomly switches into different Mutant Tank types and deals increased damage. Be careful..." @@ -9774,6 +10989,11 @@ "en" "{mint}This Witch randomly switches into different Mutant Witch types and deals increased damage. Be careful..." } + "Common #122" + { + "en" "{mint}This Common randomly switches into different Mutant Witch types and deals increased damage. Be careful..." + } + "Tank #123 Name" { "en" "Shapeshifter Tank" @@ -9814,6 +11034,11 @@ "en" "Shapeshifter Witch" } + "Common #123 Name" + { + "en" "Shapeshifter Common" + } + "Tank #123" { "en" "{mint}This Tank can shapeshift into different Mutant Tank types. Don't underestimate it..." @@ -9854,6 +11079,11 @@ "en" "{mint}This Witch can shapeshift into different Mutant Witch types. Don't underestimate it..." } + "Common #123" + { + "en" "{mint}This Common can shapeshift into different Mutant Witch types. Don't underestimate it..." + } + "Tank #124 Name" { "en" "Flashbanger Tank" @@ -9894,6 +11124,11 @@ "en" "Flashbanger Witch" } + "Common #124 Name" + { + "en" "Flashbanger Common" + } + "Tank #124" { "en" "{mint}This Tank causes flashbangs which staggers it and anyone affected by its attacks." @@ -9934,6 +11169,11 @@ "en" "{mint}This Witch causes flashbangs which staggers it and anyone affected by its attacks." } + "Common #124" + { + "en" "{mint}This Common causes flashbangs which staggers it and anyone affected by its attacks." + } + "Tank #125 Name" { "en" "Mudman Tank" @@ -9974,6 +11214,11 @@ "en" "Mudman Witch" } + "Common #125 Name" + { + "en" "Mudman Common" + } + "Tank #125" { "en" "{mint}This Tank is as annoying as any mudman." @@ -10014,6 +11259,11 @@ "en" "{mint}This Witch is as annoying as any mudman." } + "Common #125" + { + "en" "{mint}This Common is as annoying as any mudman." + } + "Tank #126 Name" { "en" "Endgame Tank" @@ -10054,6 +11304,11 @@ "en" "Endgame Witch" } + "Common #126 Name" + { + "en" "Endgame Common" + } + "Tank #126" { "en" "{mint}Goodbye everyone!" @@ -10094,6 +11349,11 @@ "en" "{mint}Goodbye everyone!" } + "Common #126" + { + "en" "{mint}Goodbye everyone!" + } + "Tank #127 Name" { "en" "Playful Tank" @@ -10134,124 +11394,1764 @@ "en" "Playful Witch" } - "Tank #127" + "Common #127 Name" + { + "en" "Playful Common" + } + + "Tank #127" { "en" "{mint}This Tank doesn't do any damage. It just wants to play!" } - "Boomer #127" + "Boomer #127" + { + "en" "{mint}This Boomer doesn't do any damage. It just wants to play!" + } + + "Charger #127" + { + "en" "{mint}This Charger doesn't do any damage. It just wants to play!" + } + + "Hunter #127" + { + "en" "{mint}This Hunter doesn't do any damage. It just wants to play!" + } + + "Jockey #127" + { + "en" "{mint}This Jockey doesn't do any damage. It just wants to play!" + } + + "Smoker #127" + { + "en" "{mint}This Smoker doesn't do any damage. It just wants to play!" + } + + "Spitter #127" + { + "en" "{mint}This Spitter doesn't do any damage. It just wants to play!" + } + + "Witch #127" + { + "en" "{mint}This Witch doesn't do any damage. It just wants to play!" + } + + "Common #127" + { + "en" "{mint}This Common doesn't do any damage. It just wants to play!" + } + + "Tank #128 Name" + { + "en" "Annoying Tank" + } + + "Boomer #128 Name" + { + "en" "Annoying Boomer" + } + + "Charger #128 Name" + { + "en" "Annoying Charger" + } + + "Hunter #128 Name" + { + "en" "Annoying Hunter" + } + + "Jockey #128 Name" + { + "en" "Annoying Jockey" + } + + "Smoker #128 Name" + { + "en" "Annoying Smoker" + } + + "Spitter #128 Name" + { + "en" "Annoying Spitter" + } + + "Witch #128 Name" + { + "en" "Annoying Witch" + } + + "Common #128 Name" + { + "en" "Annoying Common" + } + + "Tank #128" + { + "en" "{mint}This Tank just won't go away." + } + + "Boomer #128" + { + "en" "{mint}This Boomer just won't go away." + } + + "Charger #128" + { + "en" "{mint}This Charger just won't go away." + } + + "Hunter #128" + { + "en" "{mint}This Hunter just won't go away." + } + + "Jockey #128" + { + "en" "{mint}This Jockey just won't go away." + } + + "Smoker #128" + { + "en" "{mint}This Smoker just won't go away." + } + + "Spitter #128" + { + "en" "{mint}This Spitter just won't go away." + } + + "Witch #128" + { + "en" "{mint}This Witch just won't go away." + } + + "Common #128" + { + "en" "{mint}This Common just won't go away." + } + + "Tank #129 Name" + { + "en" "Sipow Tank" + } + + "Boomer #129 Name" + { + "en" "Sipow Boomer" + } + + "Charger #129 Name" + { + "en" "Sipow Charger" + } + + "Hunter #129 Name" + { + "en" "Sipow Hunter" + } + + "Jockey #129 Name" + { + "en" "Sipow Jockey" + } + + "Smoker #129 Name" + { + "en" "Sipow Smoker" + } + + "Spitter #129 Name" + { + "en" "Sipow Spitter" + } + + "Witch #129 Name" + { + "en" "Sipow Witch" + } + + "Common #129 Name" + { + "en" "Sipow Common" + } + + "Tank #129" + { + "en" "{mint}This Tank can create acid puddles underneath survivors and start meteor showers with meteorites that burn and explode after a few seconds." + } + + "Boomer #129" + { + "en" "{mint}This Boomer can create acid puddles underneath survivors and start meteor showers with meteorites that burn and explode after a few seconds." + } + + "Charger #129" + { + "en" "{mint}This Charger can create acid puddles underneath survivors and start meteor showers with meteorites that burn and explode after a few seconds." + } + + "Hunter #129" + { + "en" "{mint}This Hunter can create acid puddles underneath survivors and start meteor showers with meteorites that burn and explode after a few seconds." + } + + "Jockey #129" + { + "en" "{mint}This Jockey can create acid puddles underneath survivors and start meteor showers with meteorites that burn and explode after a few seconds." + } + + "Smoker #129" + { + "en" "{mint}This Smoker can create acid puddles underneath survivors and start meteor showers with meteorites that burn and explode after a few seconds." + } + + "Spitter #129" + { + "en" "{mint}This Spitter can create acid puddles underneath survivors and start meteor showers with meteorites that burn and explode after a few seconds." + } + + "Witch #129" + { + "en" "{mint}This Witch can create acid puddles underneath survivors and start meteor showers with meteorites that burn and explode after a few seconds." + } + + "Common #129" + { + "en" "{mint}This Common can create acid puddles underneath survivors and start meteor showers with meteorites that burn and explode after a few seconds." + } + + "Tank #130 Name" + { + "en" "Evil Tank" + } + + "Boomer #130 Name" + { + "en" "Evil Boomer" + } + + "Charger #130 Name" + { + "en" "Evil Charger" + } + + "Hunter #130 Name" + { + "en" "Evil Hunter" + } + + "Jockey #130 Name" + { + "en" "Evil Jockey" + } + + "Smoker #130 Name" + { + "en" "Evil Smoker" + } + + "Spitter #130 Name" + { + "en" "Evil Spitter" + } + + "Witch #130 Name" + { + "en" "Evil Witch" + } + + "Common #130 Name" + { + "en" "Evil Common" + } + + "Tank #130" + { + "en" "{mint}This Tank can send you to the lava but will not let anything die!" + } + + "Boomer #130" + { + "en" "{mint}This Boomer can send you to the lava but will not let anything die!" + } + + "Charger #130" + { + "en" "{mint}This Charger can send you to the lava but will not let anything die!" + } + + "Hunter #130" + { + "en" "{mint}This Hunter can send you to the lava but will not let anything die!" + } + + "Jockey #130" + { + "en" "{mint}This Jockey can send you to the lava but will not let anything die!" + } + + "Smoker #130" + { + "en" "{mint}This Smoker can send you to the lava but will not let anything die!" + } + + "Spitter #130" + { + "en" "{mint}This Spitter can send you to the lava but will not let anything die!" + } + + "Witch #130" + { + "en" "{mint}This Witch can send you to the lava but will not let anything die!" + } + + "Common #130" + { + "en" "{mint}This Common can send you to the lava but will not let anything die!" + } + + "Tank #131 Name" + { + "en" "Officer Tank" + } + + "Boomer #131 Name" + { + "en" "Officer Boomer" + } + + "Charger #131 Name" + { + "en" "Officer Charger" + } + + "Hunter #131 Name" + { + "en" "Officer Hunter" + } + + "Jockey #131 Name" + { + "en" "Officer Jockey" + } + + "Smoker #131 Name" + { + "en" "Officer Smoker" + } + + "Spitter #131 Name" + { + "en" "Officer Spitter" + } + + "Witch #131 Name" + { + "en" "Officer Witch" + } + + "Common #131 Name" + { + "en" "Officer Common" + } + + "Tank #131" + { + "en" "{mint}This Tank and the whole police department is here to enforce the law!" + } + + "Boomer #131" + { + "en" "{mint}This Boomer and the whole police department is here to enforce the law!" + } + + "Charger #131" + { + "en" "{mint}This Charger and the whole police department is here to enforce the law!" + } + + "Hunter #131" + { + "en" "{mint}This Hunter and the whole police department is here to enforce the law!" + } + + "Jockey #131" + { + "en" "{mint}This Jockey and the whole police department is here to enforce the law!" + } + + "Smoker #131" + { + "en" "{mint}This Smoker and the whole police department is here to enforce the law!" + } + + "Spitter #131" + { + "en" "{mint}This Spitter and the whole police department is here to enforce the law!" + } + + "Witch #131" + { + "en" "{mint}This Witch and the whole police department is here to enforce the law!" + } + + "Common #131" + { + "en" "{mint}This Common and the whole police department is here to enforce the law!" + } + + "Tank #132 Name" + { + "en" "Mafia Tank" + } + + "Boomer #132 Name" + { + "en" "Mafia Boomer" + } + + "Charger #132 Name" + { + "en" "Mafia Charger" + } + + "Hunter #132 Name" + { + "en" "Mafia Hunter" + } + + "Jockey #132 Name" + { + "en" "Mafia Jockey" + } + + "Smoker #132 Name" + { + "en" "Mafia Smoker" + } + + "Spitter #132 Name" + { + "en" "Mafia Spitter" + } + + "Witch #132 Name" + { + "en" "Mafia Witch" + } + + "Common #132 Name" + { + "en" "Mafia Common" + } + + "Tank #132" + { + "en" "{mint}This Tank is part of the Mafia!" + } + + "Boomer #132" + { + "en" "{mint}This Boomer is part of the Mafia!" + } + + "Charger #132" + { + "en" "{mint}This Charger is part of the Mafia!" + } + + "Hunter #132" + { + "en" "{mint}This Hunter is part of the Mafia!" + } + + "Jockey #132" + { + "en" "{mint}This Jockey is part of the Mafia!" + } + + "Smoker #132" + { + "en" "{mint}This Smoker is part of the Mafia!" + } + + "Spitter #132" + { + "en" "{mint}This Spitter is part of the Mafia!" + } + + "Witch #132" + { + "en" "{mint}This Witch is part of the Mafia!" + } + + "Common #132" + { + "en" "{mint}This Common is part of the Mafia!" + } + + "Tank #133 Name" + { + "en" "Frankenstein Tank" + } + + "Boomer #133 Name" + { + "en" "Frankenstein Boomer" + } + + "Charger #133 Name" + { + "en" "Frankenstein Charger" + } + + "Hunter #133 Name" + { + "en" "Frankenstein Hunter" + } + + "Jockey #133 Name" + { + "en" "Frankenstein Jockey" + } + + "Smoker #133 Name" + { + "en" "Frankenstein Smoker" + } + + "Spitter #133 Name" + { + "en" "Frankenstein Spitter" + } + + "Witch #133 Name" + { + "en" "Frankenstein Witch" + } + + "Common #133 Name" + { + "en" "Frankenstein Common" + } + + "Tank #133" + { + "en" "{mint}This Tank is Frankenstein's mutant!" + } + + "Boomer #133" + { + "en" "{mint}This Boomer is Frankenstein's mutant!" + } + + "Charger #133" + { + "en" "{mint}This Charger is Frankenstein's mutant!" + } + + "Hunter #133" + { + "en" "{mint}This Hunter is Frankenstein's mutant!" + } + + "Jockey #133" + { + "en" "{mint}This Jockey is Frankenstein's mutant!" + } + + "Smoker #133" + { + "en" "{mint}This Smoker is Frankenstein's mutant!" + } + + "Spitter #133" + { + "en" "{mint}This Spitter is Frankenstein's mutant!" + } + + "Witch #133" + { + "en" "{mint}This Witch is Frankenstein's mutant!" + } + + "Common #133" + { + "en" "{mint}This Common is Frankenstein's mutant!" + } + + "Tank #134 Name" + { + "en" "Prototype Tank" + } + + "Boomer #134 Name" + { + "en" "Prototype Boomer" + } + + "Charger #134 Name" + { + "en" "Prototype Charger" + } + + "Hunter #134 Name" + { + "en" "Prototype Hunter" + } + + "Jockey #134 Name" + { + "en" "Prototype Jockey" + } + + "Smoker #134 Name" + { + "en" "Prototype Smoker" + } + + "Spitter #134 Name" + { + "en" "Prototype Spitter" + } + + "Witch #134 Name" + { + "en" "Prototype Witch" + } + + "Common #134 Name" + { + "en" "Prototype Common" + } + + "Tank #134" + { + "en" "{mint}This Tank improvises, adapts, and overcomes any situation." + } + + "Boomer #134" + { + "en" "{mint}This Boomer improvises, adapts, and overcomes any situation." + } + + "Charger #134" + { + "en" "{mint}This Charger improvises, adapts, and overcomes any situation." + } + + "Hunter #134" + { + "en" "{mint}This Hunter improvises, adapts, and overcomes any situation." + } + + "Jockey #134" + { + "en" "{mint}This Jockey improvises, adapts, and overcomes any situation." + } + + "Smoker #134" + { + "en" "{mint}This Smoker improvises, adapts, and overcomes any situation." + } + + "Spitter #134" + { + "en" "{mint}This Spitter improvises, adapts, and overcomes any situation." + } + + "Witch #134" + { + "en" "{mint}This Witch improvises, adapts, and overcomes any situation." + } + + "Common #134" + { + "en" "{mint}This Common improvises, adapts, and overcomes any situation." + } + + "Tank #135 Name" + { + "en" "Zeus Tank" + } + + "Boomer #135 Name" + { + "en" "Zeus Boomer" + } + + "Charger #135 Name" + { + "en" "Zeus Charger" + } + + "Hunter #135 Name" + { + "en" "Zeus Hunter" + } + + "Jockey #135 Name" + { + "en" "Zeus Jockey" + } + + "Smoker #135 Name" + { + "en" "Zeus Smoker" + } + + "Spitter #135 Name" + { + "en" "Zeus Spitter" + } + + "Witch #135 Name" + { + "en" "Zeus Witch" + } + + "Common #135 Name" + { + "en" "Zeus Common" + } + + "Tank #135" + { + "en" "{mint}This Tank shoots lightning bolts from its fingertips!" + } + + "Boomer #135" + { + "en" "{mint}This Boomer shoots lightning bolts from its fingertips!" + } + + "Charger #135" + { + "en" "{mint}This Charger shoots lightning bolts from its fingertips!" + } + + "Hunter #135" + { + "en" "{mint}This Hunter shoots lightning bolts from its fingertips!" + } + + "Jockey #135" + { + "en" "{mint}This Jockey shoots lightning bolts from its fingertips!" + } + + "Smoker #135" + { + "en" "{mint}This Smoker shoots lightning bolts from its fingertips!" + } + + "Spitter #135" + { + "en" "{mint}This Spitter shoots lightning bolts from its fingertips!" + } + + "Witch #135" + { + "en" "{mint}This Witch shoots lightning bolts from its fingertips!" + } + + "Common #135" + { + "en" "{mint}This Common shoots lightning bolts from its fingertips!" + } + + "Tank #136 Name" + { + "en" "Trajectory Tank" + } + + "Boomer #136 Name" + { + "en" "Trajectory Boomer" + } + + "Charger #136 Name" + { + "en" "Trajectory Charger" + } + + "Hunter #136 Name" + { + "en" "Trajectory Hunter" + } + + "Jockey #136 Name" + { + "en" "Trajectory Jockey" + } + + "Smoker #136 Name" + { + "en" "Trajectory Smoker" + } + + "Spitter #136 Name" + { + "en" "Trajectory Spitter" + } + + "Witch #136 Name" + { + "en" "Trajectory Witch" + } + + "Common #136 Name" + { + "en" "Trajectory Common" + } + + "Tank #136" + { + "en" "{mint}This Tank uses velocity to change the trajectory of your lifespan!" + } + + "Boomer #136" + { + "en" "{mint}This Boomer uses velocity to change the trajectory of your lifespan!" + } + + "Charger #136" + { + "en" "{mint}This Charger uses velocity to change the trajectory of your lifespan!" + } + + "Hunter #136" + { + "en" "{mint}This Hunter uses velocity to change the trajectory of your lifespan!" + } + + "Jockey #136" + { + "en" "{mint}This Jockey uses velocity to change the trajectory of your lifespan!" + } + + "Smoker #136" + { + "en" "{mint}This Smoker uses velocity to change the trajectory of your lifespan!" + } + + "Spitter #136" + { + "en" "{mint}This Spitter uses velocity to change the trajectory of your lifespan!" + } + + "Witch #136" + { + "en" "{mint}This Witch uses velocity to change the trajectory of your lifespan!" + } + + "Common #136" + { + "en" "{mint}This Common uses velocity to change the trajectory of your lifespan!" + } + + "Tank #137 Name" + { + "en" "Barrage Tank" + } + + "Boomer #137 Name" + { + "en" "Barrage Boomer" + } + + "Charger #137 Name" + { + "en" "Barrage Charger" + } + + "Hunter #137 Name" + { + "en" "Barrage Hunter" + } + + "Jockey #137 Name" + { + "en" "Barrage Jockey" + } + + "Smoker #137 Name" + { + "en" "Barrage Smoker" + } + + "Spitter #137 Name" + { + "en" "Barrage Spitter" + } + + "Witch #137 Name" + { + "en" "Barrage Witch" + } + + "Common #137 Name" + { + "en" "Barrage Common" + } + + "Tank #137" + { + "en" "{mint}This Tank will not grace you with any downtime." + } + + "Boomer #137" + { + "en" "{mint}This Boomer will not grace you with any downtime." + } + + "Charger #137" + { + "en" "{mint}This Charger will not grace you with any downtime." + } + + "Hunter #137" + { + "en" "{mint}This Hunter will not grace you with any downtime." + } + + "Jockey #137" + { + "en" "{mint}This Jockey will not grace you with any downtime." + } + + "Smoker #137" + { + "en" "{mint}This Smoker will not grace you with any downtime." + } + + "Spitter #137" + { + "en" "{mint}This Spitter will not grace you with any downtime." + } + + "Witch #137" + { + "en" "{mint}This Witch will not grace you with any downtime." + } + + "Common #137" + { + "en" "{mint}This Common will not grace you with any downtime." + } + + "Tank #138 Name" + { + "en" "Collector Tank" + } + + "Boomer #138 Name" + { + "en" "Collector Boomer" + } + + "Charger #138 Name" + { + "en" "Collector Charger" + } + + "Hunter #138 Name" + { + "en" "Collector Hunter" + } + + "Jockey #138 Name" + { + "en" "Collector Jockey" + } + + "Smoker #138 Name" + { + "en" "Collector Smoker" + } + + "Spitter #138 Name" + { + "en" "Collector Spitter" + } + + "Witch #138 Name" + { + "en" "Collector Witch" + } + + "Common #138 Name" + { + "en" "Collector Common" + } + + "Tank #138" + { + "en" "{mint}This Tank wants to add you to its collection..." + } + + "Boomer #138" + { + "en" "{mint}This Boomer wants to add you to its collection..." + } + + "Charger #138" + { + "en" "{mint}This Charger wants to add you to its collection..." + } + + "Hunter #138" + { + "en" "{mint}This Hunter wants to add you to its collection..." + } + + "Jockey #138" + { + "en" "{mint}This Jockey wants to add you to its collection..." + } + + "Smoker #138" + { + "en" "{mint}This Smoker wants to add you to its collection..." + } + + "Spitter #138" + { + "en" "{mint}This Spitter wants to add you to its collection..." + } + + "Witch #138" + { + "en" "{mint}This Witch wants to add you to its collection..." + } + + "Common #138" + { + "en" "{mint}This Common wants to add you to its collection..." + } + + "Tank #139 Name" + { + "en" "Timewalker Tank" + } + + "Boomer #139 Name" + { + "en" "Timewalker Boomer" + } + + "Charger #139 Name" + { + "en" "Timewalker Charger" + } + + "Hunter #139 Name" + { + "en" "Timewalker Hunter" + } + + "Jockey #139 Name" + { + "en" "Timewalker Jockey" + } + + "Smoker #139 Name" + { + "en" "Timewalker Smoker" + } + + "Spitter #139 Name" + { + "en" "Timewalker Spitter" + } + + "Witch #139 Name" + { + "en" "Timewalker Witch" + } + + "Common #139 Name" + { + "en" "Timewalker Common" + } + + "Tank #139" + { + "en" "{mint}This Tank exists all throughout time." + } + + "Boomer #139" + { + "en" "{mint}This Boomer exists all throughout time." + } + + "Charger #139" + { + "en" "{mint}This Charger exists all throughout time." + } + + "Hunter #139" + { + "en" "{mint}This Hunter exists all throughout time." + } + + "Jockey #139" + { + "en" "{mint}This Jockey exists all throughout time." + } + + "Smoker #139" + { + "en" "{mint}This Smoker exists all throughout time." + } + + "Spitter #139" + { + "en" "{mint}This Spitter exists all throughout time." + } + + "Witch #139" + { + "en" "{mint}This Witch exists all throughout time." + } + + "Common #139" + { + "en" "{mint}This Common exists all throughout time." + } + + "Tank #140 Name" + { + "en" "Speed Demon Tank" + } + + "Boomer #140 Name" + { + "en" "Speed Demon Boomer" + } + + "Charger #140 Name" + { + "en" "Speed Demon Charger" + } + + "Hunter #140 Name" + { + "en" "Speed Demon Hunter" + } + + "Jockey #140 Name" + { + "en" "Speed Demon Jockey" + } + + "Smoker #140 Name" + { + "en" "Speed Demon Smoker" + } + + "Spitter #140 Name" + { + "en" "Speed Demon Spitter" + } + + "Witch #140 Name" + { + "en" "Speed Demon Witch" + } + + "Common #140 Name" + { + "en" "Speed Demon Common" + } + + "Tank #140" + { + "en" "{mint}This Tank leaves a trail of fire wherever it goes..." + } + + "Boomer #140" + { + "en" "{mint}This Boomer leaves a trail of fire wherever it goes..." + } + + "Charger #140" + { + "en" "{mint}This Charger leaves a trail of fire wherever it goes..." + } + + "Hunter #140" + { + "en" "{mint}This Hunter leaves a trail of fire wherever it goes..." + } + + "Jockey #140" + { + "en" "{mint}This Jockey leaves a trail of fire wherever it goes..." + } + + "Smoker #140" + { + "en" "{mint}This Smoker leaves a trail of fire wherever it goes..." + } + + "Spitter #140" + { + "en" "{mint}This Spitter leaves a trail of fire wherever it goes..." + } + + "Witch #140" + { + "en" "{mint}This Witch leaves a trail of fire wherever it goes..." + } + + "Common #140" + { + "en" "{mint}This Common leaves a trail of fire wherever it goes..." + } + + "Tank #141 Name" + { + "en" "Ravager Tank" + } + + "Boomer #141 Name" + { + "en" "Ravager Boomer" + } + + "Charger #141 Name" + { + "en" "Ravager Charger" + } + + "Hunter #141 Name" + { + "en" "Ravager Hunter" + } + + "Jockey #141 Name" + { + "en" "Ravager Jockey" + } + + "Smoker #141 Name" + { + "en" "Ravager Smoker" + } + + "Spitter #141 Name" + { + "en" "Ravager Spitter" + } + + "Witch #141 Name" + { + "en" "Ravager Witch" + } + + "Common #141 Name" + { + "en" "Ravager Common" + } + + "Tank #141" + { + "en" "{mint}This Tank will blow up anything in its path!" + } + + "Boomer #141" + { + "en" "{mint}This Boomer will blow up anything in its path!" + } + + "Charger #141" + { + "en" "{mint}This Charger will blow up anything in its path!" + } + + "Hunter #141" + { + "en" "{mint}This Hunter will blow up anything in its path!" + } + + "Jockey #141" + { + "en" "{mint}This Jockey will blow up anything in its path!" + } + + "Smoker #141" + { + "en" "{mint}This Smoker will blow up anything in its path!" + } + + "Spitter #141" + { + "en" "{mint}This Spitter will blow up anything in its path!" + } + + "Witch #141" + { + "en" "{mint}This Witch will blow up anything in its path!" + } + + "Common #141" { - "en" "{mint}This Boomer doesn't do any damage. It just wants to play!" + "en" "{mint}This Common will blow up anything in its path!" } - "Charger #127" + "Tank #142 Name" { - "en" "{mint}This Charger doesn't do any damage. It just wants to play!" + "en" "Ramattra Tank" } - "Hunter #127" + "Boomer #142 Name" { - "en" "{mint}This Hunter doesn't do any damage. It just wants to play!" + "en" "Ramattra Boomer" } - "Jockey #127" + "Charger #142 Name" { - "en" "{mint}This Jockey doesn't do any damage. It just wants to play!" + "en" "Ramattra Charger" } - "Smoker #127" + "Hunter #142 Name" { - "en" "{mint}This Smoker doesn't do any damage. It just wants to play!" + "en" "Ramattra Hunter" } - "Spitter #127" + "Jockey #142 Name" { - "en" "{mint}This Spitter doesn't do any damage. It just wants to play!" + "en" "Ramattra Jockey" } - "Witch #127" + "Smoker #142 Name" { - "en" "{mint}This Witch doesn't do any damage. It just wants to play!" + "en" "Ramattra Smoker" } - "Tank #128 Name" + "Spitter #142 Name" { - "en" "Annoying Tank" + "en" "Ramattra Spitter" } - "Boomer #128 Name" + "Witch #142 Name" { - "en" "Annoying Boomer" + "en" "Ramattra Witch" } - "Charger #128 Name" + "Common #142 Name" { - "en" "Annoying Charger" + "en" "Ramattra Common" } - "Hunter #128 Name" + "Tank #142" { - "en" "Annoying Hunter" + "en" "{mint}This Tank will make you SUFFER AS IT HAS!" } - "Jockey #128 Name" + "Boomer #142" { - "en" "Annoying Jockey" + "en" "{mint}This Boomer will make you SUFFER AS IT HAS!" } - "Smoker #128 Name" + "Charger #142" { - "en" "Annoying Smoker" + "en" "{mint}This Charger will make you SUFFER AS IT HAS!" } - "Spitter #128 Name" + "Hunter #142" { - "en" "Annoying Spitter" + "en" "{mint}This Hunter will make you SUFFER AS IT HAS!" } - "Witch #128 Name" + "Jockey #142" { - "en" "Annoying Witch" + "en" "{mint}This Jockey will make you SUFFER AS IT HAS!" } - "Tank #128" + "Smoker #142" { - "en" "{mint}This Tank just won't go away." + "en" "{mint}This Smoker will make you SUFFER AS IT HAS!" } - "Boomer #128" + "Spitter #142" { - "en" "{mint}This Boomer just won't go away." + "en" "{mint}This Spitter will make you SUFFER AS IT HAS!" } - "Charger #128" + "Witch #142" { - "en" "{mint}This Charger just won't go away." + "en" "{mint}This Witch will make you SUFFER AS IT HAS!" } - "Hunter #128" + "Common #142" { - "en" "{mint}This Hunter just won't go away." + "en" "{mint}This Common will make you SUFFER AS IT HAS!" } - "Jockey #128" + "Tank #143 Name" { - "en" "{mint}This Jockey just won't go away." + "en" "Sigma Tank" } - "Smoker #128" + "Boomer #143 Name" { - "en" "{mint}This Smoker just won't go away." + "en" "Sigma Boomer" } - "Spitter #128" + "Charger #143 Name" { - "en" "{mint}This Spitter just won't go away." + "en" "Sigma Charger" } - "Witch #128" + "Hunter #143 Name" { - "en" "{mint}This Witch just won't go away." + "en" "Sigma Hunter" + } + + "Jockey #143 Name" + { + "en" "Sigma Jockey" + } + + "Smoker #143 Name" + { + "en" "Sigma Smoker" + } + + "Spitter #143 Name" + { + "en" "Sigma Spitter" + } + + "Witch #143 Name" + { + "en" "Sigma Witch" + } + + "Common #143 Name" + { + "en" "Sigma Common" + } + + "Tank #143" + { + "en" "{mint}This Tank can control gravity and absorb a lot of damage." + } + + "Boomer #143" + { + "en" "{mint}This Boomer can control gravity and absorb a lot of damage." + } + + "Charger #143" + { + "en" "{mint}This Charger can control gravity and absorb a lot of damage." + } + + "Hunter #143" + { + "en" "{mint}This Hunter can control gravity and absorb a lot of damage." + } + + "Jockey #143" + { + "en" "{mint}This Jockey can control gravity and absorb a lot of damage." + } + + "Smoker #143" + { + "en" "{mint}This Smoker can control gravity and absorb a lot of damage." + } + + "Spitter #143" + { + "en" "{mint}This Spitter can control gravity and absorb a lot of damage." + } + + "Witch #143" + { + "en" "{mint}This Witch can control gravity and absorb a lot of damage." + } + + "Common #143" + { + "en" "{mint}This Common can control gravity and absorb a lot of damage." + } + + "Tank #144 Name" + { + "en" "Zarya Tank" + } + + "Boomer #144 Name" + { + "en" "Zarya Boomer" + } + + "Charger #144 Name" + { + "en" "Zarya Charger" + } + + "Hunter #144 Name" + { + "en" "Zarya Hunter" + } + + "Jockey #144 Name" + { + "en" "Zarya Jockey" + } + + "Smoker #144 Name" + { + "en" "Zarya Smoker" + } + + "Spitter #144 Name" + { + "en" "Zarya Spitter" + } + + "Witch #144 Name" + { + "en" "Zarya Witch" + } + + "Common #144 Name" + { + "en" "Zarya Common" + } + + "Tank #144" + { + "en" "{mint}This Tank can control gravity, convert incoming damage into armor and damage boost, and absorb health from nearby infected." + } + + "Boomer #144" + { + "en" "{mint}This Boomer can control gravity, convert incoming damage into armor and damage boost, and absorb health from nearby infected." + } + + "Charger #144" + { + "en" "{mint}This Charger can control gravity, convert incoming damage into armor and damage boost, and absorb health from nearby infected." + } + + "Hunter #144" + { + "en" "{mint}This Hunter can control gravity, convert incoming damage into armor and damage boost, and absorb health from nearby infected." + } + + "Jockey #144" + { + "en" "{mint}This Jockey can control gravity, convert incoming damage into armor and damage boost, and absorb health from nearby infected." + } + + "Smoker #144" + { + "en" "{mint}This Smoker can control gravity, convert incoming damage into armor and damage boost, and absorb health from nearby infected." + } + + "Spitter #144" + { + "en" "{mint}This Spitter can control gravity, convert incoming damage into armor and damage boost, and absorb health from nearby infected." + } + + "Witch #144" + { + "en" "{mint}This Witch can control gravity, convert incoming damage into armor and damage boost, and absorb health from nearby infected." + } + + "Common #144" + { + "en" "{mint}This Common can control gravity, convert incoming damage into armor and damage boost, and absorb health from nearby infected." + } + + "Tank #145 Name" + { + "en" "Slacker Tank" + } + + "Boomer #145 Name" + { + "en" "Slacker Boomer" + } + + "Charger #145 Name" + { + "en" "Slacker Charger" + } + + "Hunter #145 Name" + { + "en" "Slacker Hunter" + } + + "Jockey #145 Name" + { + "en" "Slacker Jockey" + } + + "Smoker #145 Name" + { + "en" "Slacker Smoker" + } + + "Spitter #145 Name" + { + "en" "Slacker Spitter" + } + + "Witch #145 Name" + { + "en" "Slacker Witch" + } + + "Common #145 Name" + { + "en" "Slacker Common" + } + + "Tank #145" + { + "en" "{mint}This Tank punishes those who have been falling behind!" + } + + "Boomer #145" + { + "en" "{mint}This Boomer punishes those who have been falling behind!" + } + + "Charger #145" + { + "en" "{mint}This Charger punishes those who have been falling behind!" + } + + "Hunter #145" + { + "en" "{mint}This Hunter punishes those who have been falling behind!" + } + + "Jockey #145" + { + "en" "{mint}This Jockey punishes those who have been falling behind!" + } + + "Smoker #145" + { + "en" "{mint}This Smoker punishes those who have been falling behind!" + } + + "Spitter #145" + { + "en" "{mint}This Spitter punishes those who have been falling behind!" + } + + "Witch #145" + { + "en" "{mint}This Witch punishes those who have been falling behind!" + } + + "Common #145" + { + "en" "{mint}This Common punishes those who have been falling behind!" + } + + "Tank #146 Name" + { + "en" "Rusher Tank" + } + + "Boomer #146 Name" + { + "en" "Rusher Boomer" + } + + "Charger #146 Name" + { + "en" "Rusher Charger" + } + + "Hunter #146 Name" + { + "en" "Rusher Hunter" + } + + "Jockey #146 Name" + { + "en" "Rusher Jockey" + } + + "Smoker #146 Name" + { + "en" "Rusher Smoker" + } + + "Spitter #146 Name" + { + "en" "Rusher Spitter" + } + + "Witch #146 Name" + { + "en" "Rusher Witch" + } + + "Common #146 Name" + { + "en" "Rusher Common" + } + + "Tank #146" + { + "en" "{mint}This Tank punishes those who have been running ahead!" + } + + "Boomer #146" + { + "en" "{mint}This Boomer punishes those who have been running ahead!" + } + + "Charger #146" + { + "en" "{mint}This Charger punishes those who have been running ahead!" + } + + "Hunter #146" + { + "en" "{mint}This Hunter punishes those who have been running ahead!" + } + + "Jockey #146" + { + "en" "{mint}This Jockey punishes those who have been running ahead!" + } + + "Smoker #146" + { + "en" "{mint}This Smoker punishes those who have been running ahead!" + } + + "Spitter #146" + { + "en" "{mint}This Spitter punishes those who have been running ahead!" + } + + "Witch #146" + { + "en" "{mint}This Witch punishes those who have been running ahead!" + } + + "Common #146" + { + "en" "{mint}This Common punishes those who have been running ahead!" } // This is actually a valid Steam32ID, so don't uncomment this; it's just an example. @@ -10325,16 +13225,6 @@ // { // "en" "{mint}This Spitter is controlled by someone." // } - // - // "STEAM_0:1:23456789 Witch Name" - // { - // "en" "Witch" - // } - // - // "STEAM_0:1:23456789 Witch" - // { - // "en" "{mint}This Witch is controlled by someone." - // } // -- // Add Tank Note phrases for your own Mutant Tanks below! } \ No newline at end of file diff --git a/addons/sourcemod/translations/ru/mutant_tanks.phrases.txt b/addons/sourcemod/translations/ru/mutant_tanks.phrases.txt index 834bcb4e96..a35e4f3911 100644 --- a/addons/sourcemod/translations/ru/mutant_tanks.phrases.txt +++ b/addons/sourcemod/translations/ru/mutant_tanks.phrases.txt @@ -224,6 +224,16 @@ "ru" "Версия Танков-Мутантов" } + "MTWarnRusher" + { + "ru" "Объединитесь с командой, пока вас не поймали!" + } + + "MTWarnSlacker" + { + "ru" "Догоните свою команду, пока вас не выследили!" + } + "Ammunition" { "ru" "Аммуниция" @@ -259,6 +269,11 @@ "ru" "Удерживайте кнопку, чтобы использовать свои способности." } + "AbilityButtonMode3" + { + "ru" "Нажмите кнопку, чтобы переключить свои способности." + } + "Buttons" { "ru" "Кнопки" @@ -1004,6 +1019,11 @@ "ru" "Танк" } + "NoNameBill" + { + "ru" "Билл" + } + "NoNameBoomer" { "ru" "Толстяк" @@ -1014,6 +1034,26 @@ "ru" "Громила" } + "NoNameCoach" + { + "ru" "Тренер" + } + + "NoNameCommon" + { + "ru" "Обычных" + } + + "NoNameEllis" + { + "ru" "Эллис" + } + + "NoNameFrancis" + { + "ru" "Френсис" + } + "NoNameHunter" { "ru" "Охотник" @@ -1024,6 +1064,21 @@ "ru" "Жокей" } + "NoNameLouis" + { + "ru" "Луис" + } + + "NoNameNick" + { + "ru" "Ник" + } + + "NoNameRochelle" + { + "ru" "Рошель" + } + "NoNameSmoker" { "ru" "Курильщик" @@ -1039,6 +1094,11 @@ "ru" "Ведьма" } + "NoNameZoey" + { + "ru" "Зой" + } + "NoNote" { "ru" "Для этого танка-мутанта заметок не найдено." @@ -1295,11 +1355,6 @@ } "RewardLadyKiller" - { - "ru" "{1}{default} использований{mint} женоубийцы" - } - - "RewardLadyKiller2" { "ru" "В вашем бонусе:{mint} Женоубийца{default} осталось{yellow} {1}{default} использований." } @@ -1849,61 +1904,11 @@ "ru" "Способность боеприпасов" } - "Blind" - { - "ru" "{olive}{1}{mint} ослепляет{olive} {2}{mint}!" - } - - "Blind2" - { - "ru" "{olive}{1}{mint} больше не ослеплён!" - } - - "BlindAmmo" - { - "ru" "Вы потратили заряды вашей способности: Ослепление." - } - "BlindDetails" { "ru" "Вы ослепляете выживших." } - "BlindHuman" - { - "ru" "Вы использовали{olive} {1}{mint}/{olive}{2}{mint} от способности: Ослепление!" - } - - "BlindHuman2" - { - "ru" "Ваша способность [Ослепление] не сработала. Попробуйте снова." - } - - "BlindHuman3" - { - "ru" "Ваша способность [Ослепление] перезаряжается:{yellow} {1} сек.{mint}" - } - - "BlindHuman4" - { - "ru" "Рядом нет выживших для использования способности: Ослепление." - } - - "BlindHuman5" - { - "ru" "Ваша способность [Ослепление] закончилась. Перезарядка через{yellow} {1} сек.{mint}" - } - - "BlindMenu" - { - "ru" "Информация о способности ослепления" - } - - "BlindMenu2" - { - "ru" "Способность ослепления" - } - "Bomb" { "ru" "{olive}{1}{mint} только что произвёл взрыв в расположении{olive} {2}{mint}!" @@ -2244,6 +2249,11 @@ "ru" "{mint}Из{olive} [{1}]{mint} выпало своё холодное оружие!" } + "Drop3" + { + "ru" "{olive}{1}{mint} даёт выжившим{yellow} предметы{mint}!" + } + "DropDetails" { "ru" "Из вас выпадает оружие после смерти." @@ -2251,12 +2261,12 @@ "DropHuman" { - "ru" "Из вас выпадает оружие, когда вы умрёте!" + "ru" "Вы дадите выжившим предметы, когда умрёте!" } "DropHuman2" { - "ru" "Из вас уже выпадет оружие после смерти." + "ru" "Вы уже дадите выжившим предметы после смерти." } "DropMenu" @@ -3139,24 +3149,24 @@ "ru" "Вы получаете урон только определённым частям своего тела." } - "HitMenu" + "Hurt" { - "ru" "Информация о способности слабого места" + "ru" "{olive}{1}{mint} причиняет боль{olive} {2}{mint}!" } - "HitMenu2" + "Hurt2" { - "ru" "Способность слабого места" + "ru" "{olive}{1}{mint} больше испытывает боль!" } - "Hurt" + "Hurt3" { - "ru" "{olive}{1}{mint} причиняет боль{olive} {2}{mint}!" + "ru" "{olive}{1}{mint} даёт пощёчину{olive} {2}{mint}!" } - "Hurt2" + "Hurt4" { - "ru" "{olive}{1}{mint} больше испытывает боль!" + "ru" "{olive}{1}{mint} больше не получает пощёчин!" } "HurtAmmo" @@ -3419,36 +3429,11 @@ "ru" "Способность инвертирования" } - "Item" - { - "ru" "{olive}{1}{mint} даёт выжившим{yellow} предметы{mint}!" - } - "ItemDetails" { "ru" "После смерти вы даёте выжившим предметы." } - "ItemHuman" - { - "ru" "Вы дадите выжившим предметы, когда умрёте!" - } - - "ItemHuman2" - { - "ru" "Вы уже дадите выжившим предметы после смерти." - } - - "ItemMenu" - { - "ru" "Информация о способности выпадения предметов" - } - - "ItemMenu2" - { - "ru" "Способность выпадения предметов" - } - "Jump" { "ru" "{olive}{1}{mint} заставляет{olive} {2}{mint} бесконтрольно прыгать!" @@ -3534,41 +3519,11 @@ "ru" "Способность прыжка" } - "Kamikaze" - { - "ru" "{olive}{1}{mint} как камикадзе взрывает{olive} {2}{mint}!" - } - "KamikazeDetails" { "ru" "Вы убиваете себя вместе с выжившим." } - "KamikazeHuman" - { - "ru" "Вы использовали способность: Камикадзе!" - } - - "KamikazeHuman2" - { - "ru" "Ваша способность [Камикадзе] не сработала. Попробуйте снова." - } - - "KamikazeHuman3" - { - "ru" "Рядом нет выживших для использования способности: Камикадзе." - } - - "KamikazeMenu" - { - "ru" "Информация о способности камикадзе" - } - - "KamikazeMenu2" - { - "ru" "Способность камикадзе" - } - "Lag" { "ru" "{olive}{1}{mint} создаёт подвисания для{olive} {2}{mint}!" @@ -3679,61 +3634,11 @@ "ru" "Лазерная способность" } - "Leech" - { - "ru" "{olive}{1}{mint} высасывает{yellow} здоровье{mint} из{olive} {2}{mint}!" - } - - "Leech2" - { - "ru" "{olive}{1}{mint} больше не высасывает{yellow} здоровье{mint} из{olive} {2}{mint}!" - } - - "LeechAmmo" - { - "ru" "Вы потратили заряды вашей способности: Кровопийца." - } - "LeechDetails" { "ru" "Вы высасываете здоровье у выживших." } - "LeechHuman" - { - "ru" "Вы использовали{olive} {1}{mint}/{olive}{2}{mint} от способности: Кровопийца!" - } - - "LeechHuman2" - { - "ru" "Ваша способность [Кровопийца] не сработала. Попробуйте снова." - } - - "LeechHuman3" - { - "ru" "Ваша способность [Кровопийца] перезаряжается:{yellow} {1} сек.{mint}" - } - - "LeechHuman4" - { - "ru" "Рядом нет выживших для использования способности: Кровопийца." - } - - "LeechHuman5" - { - "ru" "Ваша способность [Кровопийца] закончилась. Перезарядка через{yellow} {1} сек.{mint}" - } - - "LeechMenu" - { - "ru" "Информация о способности кровопийцы" - } - - "LeechMenu2" - { - "ru" "Способность кровопийцы" - } - "Lightning" { "ru" "{olive}{1}{mint} начинает{yellow} грозовой шторм{mint}!" @@ -3959,56 +3864,11 @@ "ru" "Способность призыва приспешников" } - "Necro" - { - "ru" "{olive}{1}{mint} воскрешает особых заражённых поблизости!" - } - - "NecroAmmo" - { - "ru" "Вы потратили заряды вашей способности: Некро." - } - "NecroDetails" { "ru" "Вы воскрешаете ближайших особых заражённых, когда те умирают." } - "NecroHuman" - { - "ru" "Вы использовали{olive} {1}{mint}/{olive}{2}{mint} от способности: Некро!" - } - - "NecroHuman2" - { - "ru" "Ваша способность [Некро] не сработала. Попробуйте снова." - } - - "NecroHuman3" - { - "ru" "Вы использовали способность: Некро." - } - - "NecroHuman4" - { - "ru" "Ваша способность [Некро] перезаряжается:{yellow} {1} сек.{mint}" - } - - "NecroHuman5" - { - "ru" "Ваша способность [Некро] закончилась. Перезарядка через{yellow} {1} сек.{mint}" - } - - "NecroMenu" - { - "ru" "Информация о некроспособности" - } - - "NecroMenu2" - { - "ru" "Некроспособность" - } - "Nullify" { "ru" "{olive}{1}{mint} временно обнуляет весь урон{olive} {2}{mint}!" @@ -4174,61 +4034,11 @@ "ru" "Способность орды" } - "Pimp" - { - "ru" "{olive}{1}{mint} даёт пощёчину{olive} {2}{mint}!" - } - - "Pimp2" - { - "ru" "{olive}{1}{mint} больше не получает пощёчин!" - } - - "PimpAmmo" - { - "ru" "Вы потратили заряды вашей способности: Пощёчина." - } - "PimpDetails" { "ru" "Вы даёте пощёчину выжившим." } - "PimpHuman" - { - "ru" "Вы использовали{olive} {1}{mint}/{olive}{2}{mint} от способности: Пощёчина!" - } - - "PimpHuman2" - { - "ru" "Ваша способность [Пощёчина] не сработала. Попробуйте снова." - } - - "PimpHuman3" - { - "ru" "Ваша способность [Пощёчина] перезаряжается:{yellow} {1} сек.{mint}" - } - - "PimpHuman4" - { - "ru" "Рядом нет выживших для использования способности: Пощёчина." - } - - "PimpHuman5" - { - "ru" "Ваша способность [Пощёчина] закончилась. Перезарядка через{yellow} {1} сек.{mint}" - } - - "PimpMenu" - { - "ru" "Информация о способности пощёчины" - } - - "PimpMenu2" - { - "ru" "Способность пощёчины" - } - "Puke" { "ru" "{olive}{1}{mint} вырвало на{olive} {2}{mint}!" @@ -4539,6 +4349,16 @@ "ru" "{olive}{1}{mint} перестаёт восстанавливать здоровье!" } + "Regen3" + { + "ru" "{olive}{1}{mint} крадёт немного здоровья у{olive} {2}{mint}!" + } + + "Regen4" + { + "ru" "{olive}{1}{mint} крадёт немного здоровья у{olive} [{2}]{mint}!" + } + "RegenAmmo" { "ru" "Вы потратили заряды вашей способности: Регенерация." @@ -4585,11 +4405,21 @@ } "Respawn" + { + "ru" "{olive}{1}{mint} воскрешает особых заражённых поблизости!" + } + + "Respawn2" { "ru" "{olive}{1}{mint} только что возродил себя!" } "RespawnAmmo" + { + "ru" "Вы потратили заряды вашей способности: Некро." + } + + "RespawnAmmo2" { "ru" "Вы потратили заряды вашей способности: Возрождение." } @@ -4601,42 +4431,67 @@ "RespawnHuman" { - "ru" "Вы возродитесь, когда умрёте!" + "ru" "Вы использовали{olive} {1}{mint}/{olive}{2}{mint} от способности: Некро!" } "RespawnHuman2" { - "ru" "Вы уже возродитесь после смерти." + "ru" "Ваша способность [Некро] не сработала. Попробуйте снова." } "RespawnHuman3" { - "ru" "Вы использовали{olive} {1}{mint}/{olive}{2}{mint} от ваших возрождений!" + "ru" "Вы использовали способность: Некро." } - "RespawnMenu" + "RespawnHuman4" { - "ru" "Информация о способности возрождения" + "ru" "Ваша способность [Некро] перезаряжается:{yellow} {1} сек.{mint}" } - "RespawnMenu2" + "RespawnHuman5" { - "ru" "Способность возрождения" + "ru" "Ваша способность [Некро] закончилась. Перезарядка через{yellow} {1} сек.{mint}" } - "Restart" + "RespawnHuman6" { - "ru" "{olive}{1}{mint} заставил{olive} {2}{mint} начать игру заново с другим снаряжением!" + "ru" "Вы возродитесь, когда умрёте!" } - "RestartAmmo" + "RespawnHuman7" { - "ru" "Вы потратили заряды вашей способности: Перезапуск." + "ru" "Вы уже возродитесь после смерти." } - "RestartDetails" + "RespawnHuman8" { - "ru" "Вы заставляете выживших появиться в начале карты или рядом с товарищем с новым снаряжением." + "ru" "Вы использовали{olive} {1}{mint}/{olive}{2}{mint} от ваших возрождений!" + } + + "RespawnMenu" + { + "ru" "Информация о способности возрождения" + } + + "RespawnMenu2" + { + "ru" "Способность возрождения" + } + + "Restart" + { + "ru" "{olive}{1}{mint} заставил{olive} {2}{mint} начать игру заново с другим снаряжением!" + } + + "RestartAmmo" + { + "ru" "Вы потратили заряды вашей способности: Перезапуск." + } + + "RestartDetails" + { + "ru" "Вы заставляете выживших появиться в начале карты или рядом с товарищем с новым снаряжением." } "RestartHuman" @@ -4676,12 +4531,12 @@ "Rock" { - "ru" "{olive}{1}{mint} пускает{yellow} камнепад{mint}!" + "ru" "{olive}{1}{mint} спамит камнями!" } "Rock2" { - "ru" "{mint}Камнепад{olive} [{1}]{mint} закончился!" + "ru" "{olive}{1}{mint} больше не спамит камнями!" } "RockAmmo" @@ -4696,27 +4551,27 @@ "RockHuman" { - "ru" "Вы использовали{olive} {1}{mint}/{olive}{2}{mint} от способности: Камнепад!" + "ru" "Вы использовали{olive} {1}{mint}/{olive}{2}{mint} от способности: Спам!" } "RockHuman2" { - "ru" "Ваша способность [Камнепад] не сработала. Попробуйте снова." + "ru" "Ваша способность [Спам] не сработала. Попробуйте снова." } "RockHuman3" { - "ru" "Вы использовали способность: Камнепад." + "ru" "Вы использовали способность: Спам." } "RockHuman4" { - "ru" "Ваша способность [Камнепад] перезаряжается:{yellow} {1} сек.{mint}" + "ru" "Ваша способность [Спам] перезаряжается:{yellow} {1} сек.{mint}" } "RockHuman5" { - "ru" "Ваша способность [Камнепад] закончилась. Перезарядка через{yellow} {1} сек.{mint}" + "ru" "Ваша способность [Спам] закончилась. Перезарядка через{yellow} {1} сек.{mint}" } "RockMenu" @@ -4729,111 +4584,16 @@ "ru" "Способность камнепада" } - "Rocket" - { - "ru" "{olive}{1}{mint} отправляет{olive} {2}{mint} в космос!" - } - - "RocketAmmo" - { - "ru" "Вы потратили заряды вашей способности: Ракета." - } - "RocketDetails" { "ru" "Вы отправляете выживших в космос." } - "RocketHuman" - { - "ru" "Вы использовали{olive} {1}{mint}/{olive}{2}{mint} от способности: Ракета!" - } - - "RocketHuman2" - { - "ru" "Ваша способность [Ракета] не сработала. Попробуйте снова." - } - - "RocketHuman3" - { - "ru" "Ваша способность [Ракета] перезаряжается:{yellow} {1} сек.{mint}" - } - - "RocketHuman4" - { - "ru" "Рядом нет выживших для использования способности: Ракета." - } - - "RocketHuman5" - { - "ru" "Ваша способность [Ракета] закончилась. Перезарядка через{yellow} {1} сек.{mint}" - } - - "RocketMenu" - { - "ru" "Информация о ракетной способности" - } - - "RocketMenu2" - { - "ru" "Ракетная способность" - } - - "Shake" - { - "ru" "{olive}{2}{mint} дрожит из-за{olive} [{1}]{mint}!" - } - - "Shake2" - { - "ru" "{olive}{1}{mint} больше не дрожит!" - } - - "ShakeAmmo" - { - "ru" "Вы потратили заряды вашей способности: Дрожание." - } - "ShakeDetails" { "ru" "Вы заставляете экран выживших дрожать." } - "ShakeHuman" - { - "ru" "Вы использовали{olive} {1}{mint}/{olive}{2}{mint} от способности: Дрожание!" - } - - "ShakeHuman2" - { - "ru" "Ваша способность [Дрожание] не сработала. Попробуйте снова." - } - - "ShakeHuman3" - { - "ru" "Ваша способность [Дрожание] перезаряжается:{yellow} {1} сек.{mint}" - } - - "ShakeHuman4" - { - "ru" "Рядом нет выживших для использования способности: Дрожание." - } - - "ShakeHuman5" - { - "ru" "Ваша способность [Дрожание] закончилась. Перезарядка через{yellow} {1} сек.{mint}" - } - - "ShakeMenu" - { - "ru" "Информация о способности дрожания" - } - - "ShakeMenu2" - { - "ru" "Способность дрожания" - } - "Shield" { "ru" "{mint}Щит{olive} [{1}]{yellow} включён{mint}!" @@ -5009,6 +4769,21 @@ "ru" "{olive}{1}{mint} раздавливает{olive} {2}{mint} насмерть!" } + "Smash2" + { + "ru" "{olive}{1}{mint} как камикадзе взрывает{olive} {2}{mint}!" + } + + "Smash3" + { + "ru" "{olive}{1}{mint} отправляет{olive} {2}{mint} в космос!" + } + + "Smash4" + { + "ru" "{olive}{1}{mint} поражает{olive} {2}{mint}!" + } + "SmashAmmo" { "ru" "Вы потратили заряды вашей способности: Сокрушение." @@ -5054,221 +4829,21 @@ "ru" "Способность сокрушения" } - "Smite" - { - "ru" "{olive}{1}{mint} поражает{olive} {2}{mint}!" - } - - "SmiteAmmo" - { - "ru" "Вы потратили заряды вашей способности: Поражение." - } - "SmiteDetails" { "ru" "Ваши удары поражают выживших." } - "SmiteHuman" - { - "ru" "Вы использовали{olive} {1}{mint}/{olive}{2}{mint} от способности: Поражение!" - } - - "SmiteHuman2" - { - "ru" "Ваша способность [Поражение] не сработала. Попробуйте снова." - } - - "SmiteHuman3" - { - "ru" "Ваша способность [Поражение] перезаряжается:{yellow} {1} сек.{mint}" - } - - "SmiteHuman4" - { - "ru" "Рядом нет выживших для использования способности: Поражение." - } - - "SmiteHuman5" - { - "ru" "Ваша способность [Поражение] закончилась. Перезарядка через{yellow} {1} сек.{mint}" - } - - "SmiteMenu" - { - "ru" "Информация о способности поражения" - } - - "SmiteMenu2" - { - "ru" "Способность поражения" - } - - "Spam" - { - "ru" "{olive}{1}{mint} спамит камнями!" - } - - "Spam2" - { - "ru" "{olive}{1}{mint} больше не спамит камнями!" - } - - "SpamAmmo" - { - "ru" "Вы потратили заряды вашей способности: Спам." - } - "SpamDetails" { "ru" "Вы спамите камнями в выживших." } - "SpamHuman" - { - "ru" "Вы использовали{olive} {1}{mint}/{olive}{2}{mint} от способности: Спам!" - } - - "SpamHuman2" - { - "ru" "Ваша способность [Спам] не сработала. Попробуйте снова." - } - - "SpamHuman3" - { - "ru" "Вы использовали способность: Спам." - } - - "SpamHuman4" - { - "ru" "Ваша способность [Спам] перезаряжается:{yellow} {1} сек.{mint}" - } - - "SpamHuman5" - { - "ru" "Ваша способность [Спам] закончилась. Перезарядка через{yellow} {1} сек.{mint}" - } - - "SpamMenu" - { - "ru" "Информация о способности спама" - } - - "SpamMenu2" - { - "ru" "Способность спама" - } - - "Splash" - { - "ru" "{olive}{1}{mint} наносит урон ближайшим выжившим!" - } - - "Splash2" - { - "ru" "{olive}{1}{mint} больше не наносит урон ближайшим выжившим!" - } - - "SplashAmmo" - { - "ru" "Вы потратили заряды вашей способности: Урон по области." - } - - "SplashDetails" - { - "ru" "Вы периодически наносите урон ближайшим выжившим." - } - - "SplashHuman" - { - "ru" "Вы использовали{olive} {1}{mint}/{olive}{2}{mint} от способности: Урон по области!" - } - - "SplashHuman2" - { - "ru" "Ваша способность [Урон по области] не сработала. Попробуйте снова." - } - - "SplashHuman3" - { - "ru" "Вы использовали способность: Урон по области." - } - - "SplashHuman4" - { - "ru" "Ваша способность [Урон по области] перезаряжается:{yellow} {1} сек.{mint}." - } - - "SplashHuman5" - { - "ru" "Ваша способность [Урон по области] закончилась. Перезарядка через{yellow} {1} сек.{mint}" - } - - "SplashMenu" - { - "ru" "Информация о способности урона по области" - } - - "SplashMenu2" - { - "ru" "Способность урона по области" - } - - "Splatter" - { - "ru" "{olive}{1}{mint} опрыскивает экран{olive} {2}{mint}!" - } - - "Splatter2" - { - "ru" "{mint}Экран {olive}{1}{mint} больше не опрыскан{mint}!" - } - - "SplatterAmmo" - { - "ru" "Вы потратили заряды вашей способности: Опрыскивание." - } - "SplatterDetails" { "ru" "Вы опрыскиваете глаза выживших." } - "SplatterHuman" - { - "ru" "Вы использовали{olive} {1}{mint}/{olive}{2}{mint} от способности: Опрыскивание!" - } - - "SplatterHuman2" - { - "ru" "Ваша способность [Опрыскивание] не сработала. Попробуйте снова." - } - - "SplatterHuman3" - { - "ru" "Ваша способность [Опрыскивание] перезаряжается:{yellow} {1} сек.{mint}" - } - - "SplatterHuman4" - { - "ru" "Рядом нет выживших для использования способности: Опрыскивание." - } - - "SplatterHuman5" - { - "ru" "Ваша способность [Опрыскивание] закончилась. Перезарядка через{yellow} {1} сек.{mint}" - } - - "SplatterMenu" - { - "ru" "Информация о способности опрыскивания" - } - - "SplatterMenu2" - { - "ru" "Способность опрыскивания" - } - "Throw" { "ru" "{olive}{1}{mint} метает машину!" @@ -5494,32 +5069,47 @@ "ru" "Способность нежити" } - "Vampire" + "VampireDetails" { - "ru" "{olive}{1}{mint} крадёт немного здоровья у{olive} {2}{mint}!" + "ru" "Вы получаете здоровье, причиняя боль выжившим." } - "VampireDetails" + "Vision" { - "ru" "Вы получаете здоровье, причиняя боль выжившим." + "ru" "{olive}{1}{mint} ослепляет{olive} {2}{mint}!" } - "VampireMenu" + "Vision2" { - "ru" "Информация о способности вампира" + "ru" "{olive}{1}{mint} больше не ослеплён!" } - "VampireMenu2" + "Vision3" { - "ru" "Способность вампира" + "ru" "{olive}{2}{mint} дрожит из-за{olive} [{1}]{mint}!" } - "Vision" + "Vision4" + { + "ru" "{olive}{1}{mint} больше не дрожит!" + } + + "Vision5" + { + "ru" "{olive}{1}{mint} опрыскивает экран{olive} {2}{mint}!" + } + + "Vision6" + { + "ru" "{mint}Экран {olive}{1}{mint} больше не опрыскан{mint}!" + } + + "Vision7" { "ru" "{olive}{1}{mint} меняет поле зрения{olive} {2}{mint} на{yellow} {3}{mint}!" } - "Vision2" + "Vision8" { "ru" "{mint}Поле зрения{olive} {1}{mint} изменено обратно на{yellow} {2}{mint}!" } @@ -5759,31 +5349,11 @@ "ru" "Способность ведьмы" } - "Xiphos" - { - "ru" "{olive}{1}{mint} крадёт немного здоровья у{olive} {2}{mint}!" - } - - "Xiphos2" - { - "ru" "{olive}{1}{mint} крадёт немного здоровья у{olive} [{2}]{mint}!" - } - "XiphosDetails" { "ru" "Вы можете украсть здоровье у выживших и наоборот." } - "XiphosMenu" - { - "ru" "Информация о способности «Ксифос»" - } - - "XiphosMenu2" - { - "ru" "Способности «Ксифос»" - } - "Yell" { "ru" "{olive}{1}{mint} кричит на выживших!" @@ -5839,58 +5409,8 @@ "ru" "Способность крика" } - "Zombie" - { - "ru" "{olive}{1}{mint} периодически будет создавать зомби!" - } - - "Zombie2" - { - "ru" "{olive}{1}{mint} создаёт{yellow} зомби{mint}!" - } - - "ZombieAmmo" - { - "ru" "Вы потратили заряды вашей способности: Создание зомби." - } - "ZombieDetails" { "ru" "Вы создаёте зомби." } - - "ZombieHuman" - { - "ru" "Вы использовали{olive} {1}{mint}/{olive}{2}{mint} от способности: Создание зомби!" - } - - "ZombieHuman2" - { - "ru" "Ваша способность [Создание зомби] не сработала. Попробуйте снова." - } - - "ZombieHuman3" - { - "ru" "Вы использовали способность: Создание зомби." - } - - "ZombieHuman4" - { - "ru" "Ваша способность [Создание зомби] перезаряжается:{yellow} {1} сек.{mint}" - } - - "ZombieHuman5" - { - "ru" "Ваша способность [Создание зомби] закончилась. Перезарядка через{yellow} {1} сек.{mint}" - } - - "ZombieMenu" - { - "ru" "Информация о способности зомби" - } - - "ZombieMenu2" - { - "ru" "Способность зомби" - } } \ No newline at end of file diff --git a/addons/sourcemod/translations/ru/mutant_tanks_names.phrases.txt b/addons/sourcemod/translations/ru/mutant_tanks_names.phrases.txt index 484c527e2f..f4e349e13d 100644 --- a/addons/sourcemod/translations/ru/mutant_tanks_names.phrases.txt +++ b/addons/sourcemod/translations/ru/mutant_tanks_names.phrases.txt @@ -54,6 +54,11 @@ "ru" "Ведьма-поглотитель" } + "Common #1 Name" + { + "ru" "Обычных-поглотитель" + } + "Tank #1" { "ru" "{mint}Этот танк может поглотить большую часть получаемого урона." @@ -86,12 +91,17 @@ "Spitter #1" { - "ru" "{mint}Эта плевальщица может поглотить большую часть получаемого урона." + "ru" "{mint}Этот плевальщица может поглотить большую часть получаемого урона." } "Witch #1" { - "ru" "{mint}Эта Ведьма может поглотить большую часть получаемого урона." + "ru" "{mint}Этот ведьма может поглотить большую часть получаемого урона." + } + + "Common #1" + { + "ru" "{mint}Этот обычных может поглотить большую часть получаемого урона." } "Tank #2 Name" @@ -134,6 +144,11 @@ "ru" "Кислотная Ведьма" } + "Common #2 Name" + { + "ru" "Кислотная Обычных" + } + "Tank #2" { "ru" "{mint}Этот танк может создавать лужи кислоты под выжившими." @@ -166,12 +181,17 @@ "Spitter #2" { - "ru" "{mint}Эта плевальщица может создавать лужи кислоты под выжившими." + "ru" "{mint}Этот плевальщица может создавать лужи кислоты под выжившими." } "Witch #2" { - "ru" "{mint}Эта Ведьма может создавать лужи кислоты под выжившими." + "ru" "{mint}Этот ведьма может создавать лужи кислоты под выжившими." + } + + "Common #2" + { + "ru" "{mint}Этот обычных может создавать лужи кислоты под выжившими." } "Tank #3 Name" @@ -214,6 +234,11 @@ "ru" "Ведьма бесприцельности" } + "Common #3 Name" + { + "ru" "Обычных бесприцельности" + } + "Tank #3" { "ru" "{mint}Этот танк может помешать выжившим прицелиться." @@ -246,12 +271,17 @@ "Spitter #3" { - "ru" "{mint}Эта плевальщица может помешать выжившим прицелиться." + "ru" "{mint}Этот плевальщица может помешать выжившим прицелиться." } "Witch #3" { - "ru" "{mint}Эта Ведьма может помешать выжившим прицелиться." + "ru" "{mint}Этот ведьма может помешать выжившим прицелиться." + } + + "Common #3" + { + "ru" "{mint}Этот обычных может помешать выжившим прицелиться." } "Tank #4 Name" @@ -294,6 +324,11 @@ "ru" "Ведьма боеприпасов" } + "Common #4 Name" + { + "ru" "Обычных боеприпасов" + } + "Tank #4" { "ru" "{mint}Этот танк может украсть часть или все ваши боеприпасы." @@ -326,12 +361,17 @@ "Spitter #4" { - "ru" "{mint}Эта плевальщица может украсть часть или все ваши боеприпасы." + "ru" "{mint}Этот плевальщица может украсть часть или все ваши боеприпасы." } "Witch #4" { - "ru" "{mint}Эта Ведьма может украсть часть или все ваши боеприпасы." + "ru" "{mint}Этот ведьма может украсть часть или все ваши боеприпасы." + } + + "Common #4" + { + "ru" "{mint}Этот обычных может украсть часть или все ваши боеприпасы." } "Tank #5 Name" @@ -374,6 +414,11 @@ "ru" "Ослепляющая Ведьма" } + "Common #5 Name" + { + "ru" "Ослепляющая Обычных" + } + "Tank #5" { "ru" "{mint}Этот танк может ослепить выживших." @@ -406,12 +451,17 @@ "Spitter #5" { - "ru" "{mint}Эта плевальщица может ослепить выживших." + "ru" "{mint}Этот плевальщица может ослепить выживших." } "Witch #5" { - "ru" "{mint}Эта Ведьма может ослепить выживших." + "ru" "{mint}Этот ведьма может ослепить выживших." + } + + "Common #5" + { + "ru" "{mint}Этот обычных может ослепить выживших." } "Tank #6 Name" @@ -454,6 +504,11 @@ "ru" "Ведьма-подрывник" } + "Common #6 Name" + { + "ru" "Обычных-подрывник" + } + "Tank #6" { "ru" "{mint}Этот танк может вызывать взрывы и невосприимчив к урону от взрывов." @@ -486,12 +541,17 @@ "Spitter #6" { - "ru" "{mint}Эта плевальщица может вызывать взрывы и невосприимчива к урону от взрывов." + "ru" "{mint}Этот плевальщица может вызывать взрывы и невосприимчива к урону от взрывов." } "Witch #6" { - "ru" "{mint}Эта Ведьма может вызывать взрывы и невосприимчива к урону от взрывов." + "ru" "{mint}Этот ведьма может вызывать взрывы и невосприимчива к урону от взрывов." + } + + "Common #6" + { + "ru" "{mint}Этот обычных может вызывать взрывы и невосприимчива к урону от взрывов." } "Tank #7 Name" @@ -534,6 +594,11 @@ "ru" "Ведьма-толстяк" } + "Common #7 Name" + { + "ru" "Обычных-толстяк" + } + "Tank #7" { "ru" "{mint}Этот танк может создавать за собой Толстяков, а также бросать их в выживших." @@ -566,12 +631,17 @@ "Spitter #7" { - "ru" "{mint}Эта плевальщица может создавать за собой Толстяков." + "ru" "{mint}Этот плевальщица может создавать за собой Толстяков." } "Witch #7" { - "ru" "{mint}Эта Ведьма может создавать за собой Толстяков." + "ru" "{mint}Этот ведьма может создавать за собой Толстяков." + } + + "Common #7" + { + "ru" "{mint}Этот обычных может создавать за собой Толстяков." } "Tank #8 Name" @@ -614,6 +684,11 @@ "ru" "Пуленепробиваемая Ведьма" } + "Common #8 Name" + { + "ru" "Пуленепробиваемая Обычных" + } + "Tank #8" { "ru" "{mint}Этот танк невосприимчив к пулям." @@ -646,12 +721,17 @@ "Spitter #8" { - "ru" "{mint}Эта плевальщица невосприимчива к пулям." + "ru" "{mint}Этот плевальщица невосприимчива к пулям." } "Witch #8" { - "ru" "{mint}Эта Ведьма невосприимчива к пулям." + "ru" "{mint}Этот ведьма невосприимчива к пулям." + } + + "Common #8" + { + "ru" "{mint}Этот обычных невосприимчива к пулям." } "Tank #9 Name" @@ -694,6 +774,11 @@ "ru" "Ведьма-закапыватель" } + "Common #9 Name" + { + "ru" "Обычных-закапыватель" + } + "Tank #9" { "ru" "{mint}Этот танк может закопать выживших." @@ -726,12 +811,17 @@ "Spitter #9" { - "ru" "{mint}Эта плевальщица может закопать выживших." + "ru" "{mint}Этот плевальщица может закопать выживших." } "Witch #9" { - "ru" "{mint}Эта Ведьма может закопать выживших." + "ru" "{mint}Этот ведьма может закопать выживших." + } + + "Common #9" + { + "ru" "{mint}Этот обычных может закопать выживших." } "Tank #10 Name" @@ -774,6 +864,11 @@ "ru" "Машинная Ведьма" } + "Common #10 Name" + { + "ru" "Машинная Обычных" + } + "Tank #10" { "ru" "{mint}Этот танк может бросать машины в выживших. Машины исчезают через 30 секунд." @@ -806,12 +901,17 @@ "Spitter #10" { - "ru" "{mint}Эта плевальщица может вызвать машины. Машины исчезают через 30 секунд." + "ru" "{mint}Этот плевальщица может вызвать машины. Машины исчезают через 30 секунд." } "Witch #10" { - "ru" "{mint}Эта Ведьма может вызвать машины. Машины исчезают через 30 секунд." + "ru" "{mint}Этот ведьма может вызвать машины. Машины исчезают через 30 секунд." + } + + "Common #10" + { + "ru" "{mint}Этот обычных может вызвать машины. Машины исчезают через 30 секунд." } "Tank #11 Name" @@ -854,6 +954,11 @@ "ru" "Ведьма-громила" } + "Common #11 Name" + { + "ru" "Обычных-громила" + } + "Tank #11" { "ru" "{mint}Этот танк может создавать за собой Громил, а также бросать их в выживших." @@ -886,12 +991,17 @@ "Spitter #11" { - "ru" "{mint}Эта плевальщица может создавать за собой Громил." + "ru" "{mint}Этот плевальщица может создавать за собой Громил." } "Witch #11" { - "ru" "{mint}Эта Ведьма может создавать за собой Громил." + "ru" "{mint}Этот ведьма может создавать за собой Громил." + } + + "Common #11" + { + "ru" "{mint}Этот обычных может создавать за собой Громил." } "Tank #12 Name" @@ -934,6 +1044,11 @@ "ru" "Ведьма-душитель" } + "Common #12 Name" + { + "ru" "Обычных-душитель" + } + "Tank #12" { "ru" "{mint}Этот танк может задушить выживших в воздухе." @@ -966,12 +1081,17 @@ "Spitter #12" { - "ru" "{mint}Эта плевальщица может задушить выживших в воздухе." + "ru" "{mint}Этот плевальщица может задушить выживших в воздухе." } "Witch #12" { - "ru" "{mint}Эта Ведьма может задушить выживших в воздухе." + "ru" "{mint}Этот ведьма может задушить выживших в воздухе." + } + + "Common #12" + { + "ru" "{mint}Этот обычных может задушить выживших в воздухе." } "Tank #13 Name" @@ -1014,6 +1134,11 @@ "ru" "Клонирующая Ведьма" } + "Common #13 Name" + { + "ru" "Клонирующая Обычных" + } + "Tank #13" { "ru" "{mint}Этот танк может создавать клонов за собой и бросать некоторых в выживших." @@ -1046,12 +1171,17 @@ "Spitter #13" { - "ru" "{mint}Эта плевальщица может создавать клонов за собой." + "ru" "{mint}Этот плевальщица может создавать клонов за собой." } "Witch #13" { - "ru" "{mint}Эта Ведьма может создавать клонов за собой." + "ru" "{mint}Этот ведьма может создавать клонов за собой." + } + + "Common #13" + { + "ru" "{mint}Этот обычных может создавать клонов за собой." } "Tank #14 Name" @@ -1094,6 +1224,11 @@ "ru" "Дымная Ведьма" } + "Common #14 Name" + { + "ru" "Дымная Обычных" + } + "Tank #14" { "ru" "{mint}Этот танк может испускать клубы дыма, которые наносят урон находящимся в них выжившим." @@ -1126,12 +1261,17 @@ "Spitter #14" { - "ru" "{mint}Эта плевальщица может испускать клубы дыма, которые наносят урон находящимся в них выжившим." + "ru" "{mint}Этот плевальщица может испускать клубы дыма, которые наносят урон находящимся в них выжившим." } "Witch #14" { - "ru" "{mint}Эта Ведьма может испускать клубы дыма, которые наносят урон находящимся в них выжившим." + "ru" "{mint}Этот ведьма может испускать клубы дыма, которые наносят урон находящимся в них выжившим." + } + + "Common #14" + { + "ru" "{mint}Этот обычных может испускать клубы дыма, которые наносят урон находящимся в них выжившим." } "Tank #15 Name" @@ -1174,6 +1314,11 @@ "ru" "Ведьма с добычей" } + "Common #15 Name" + { + "ru" "Обычных с добычей" + } + "Tank #15" { "ru" "{mint}После смерти из этого танка может выпасть случайное оружие." @@ -1206,12 +1351,17 @@ "Spitter #15" { - "ru" "{mint}После смерти из этой Плевальщицы может выпасть случайное оружие." + "ru" "{mint}После смерти из этой плевальщицы может выпасть случайное оружие." } "Witch #15" { - "ru" "{mint}После смерти из этой Ведьмы может выпасть случайное оружие." + "ru" "{mint}После смерти из этой ведьмы может выпасть случайное оружие." + } + + "Common #15" + { + "ru" "{mint}После смерти из этой ведьмы может выпасть случайное оружие." } "Tank #16 Name" @@ -1254,6 +1404,11 @@ "ru" "Одурманивающая Ведьма" } + "Common #16 Name" + { + "ru" "Одурманивающая Обычных" + } + "Tank #16" { "ru" "{mint}Этот танк может использовать одурманивающие эффекты на выживших." @@ -1286,12 +1441,17 @@ "Spitter #16" { - "ru" "{mint}Эта плевальщица может использовать одурманивающие эффекты на выживших." + "ru" "{mint}Этот плевальщица может использовать одурманивающие эффекты на выживших." } "Witch #16" { - "ru" "{mint}Эта Ведьма может использовать одурманивающие эффекты на выживших." + "ru" "{mint}Этот ведьма может использовать одурманивающие эффекты на выживших." + } + + "Common #16" + { + "ru" "{mint}Этот обычных может использовать одурманивающие эффекты на выживших." } "Tank #17 Name" @@ -1334,6 +1494,11 @@ "ru" "Пьяная Ведьма" } + "Common #17 Name" + { + "ru" "Пьяная Обычных" + } + "Tank #17" { "ru" "{mint}Этот танк может опьянить выживших." @@ -1366,12 +1531,17 @@ "Spitter #17" { - "ru" "{mint}Эта плевальщица может опьянить выживших." + "ru" "{mint}Этот плевальщица может опьянить выживших." } "Witch #17" { - "ru" "{mint}Эта Ведьма может опьянить выживших." + "ru" "{mint}Этот ведьма может опьянить выживших." + } + + "Common #17" + { + "ru" "{mint}Этот обычных может опьянить выживших." } "Tank #18 Name" @@ -1414,6 +1584,11 @@ "ru" "Электрическая Ведьма" } + "Common #18 Name" + { + "ru" "Электрическая Обычных" + } + "Tank #18" { "ru" "{mint}Этот танк может убить выживших электрическим током." @@ -1446,7 +1621,7 @@ "Spitter #18" { - "ru" "{mint}Эта плевальщица может убить выживших электрическим током." + "ru" "{mint}Этот плевальщица может убить выживших электрическим током." } "Witch #18" @@ -1454,6 +1629,11 @@ "ru" "{mint}Этот Ведьма может убить выживших электрическим током." } + "Common #18" + { + "ru" "{mint}Этот Обычных может убить выживших электрическим током." + } + "Tank #19 Name" { "ru" "Танк-блокировщик слотов оружия" @@ -1494,6 +1674,11 @@ "ru" "Ведьма-блокировщик слотов оружия" } + "Common #19 Name" + { + "ru" "Обычных-блокировщик слотов оружия" + } + "Tank #19" { "ru" "{mint}Этот танк может заставить выживших выбрать определённое оружие на определённый период времени." @@ -1526,12 +1711,17 @@ "Spitter #19" { - "ru" "{mint}Эта плевальщица может заставить выживших выбрать определённое оружие на определённый период времени." + "ru" "{mint}Этот плевальщица может заставить выживших выбрать определённое оружие на определённый период времени." } "Witch #19" { - "ru" "{mint}Эта Ведьма может заставить выживших выбрать определённое оружие на определённый период времени." + "ru" "{mint}Этот ведьма может заставить выживших выбрать определённое оружие на определённый период времени." + } + + "Common #19" + { + "ru" "{mint}Этот обычных может заставить выживших выбрать определённое оружие на определённый период времени." } "Tank #20 Name" @@ -1574,6 +1764,11 @@ "ru" "Быстрая Ведьма" } + "Common #20 Name" + { + "ru" "Быстрая Обычных" + } + "Tank #20" { "ru" "{mint}Этот танк может бегать очень быстро, как Флэш." @@ -1606,12 +1801,17 @@ "Spitter #20" { - "ru" "{mint}Эта плевальщица может бегать очень быстро, как Флэш." + "ru" "{mint}Этот плевальщица может бегать очень быстро, как Флэш." } "Witch #20" { - "ru" "{mint}Эта Ведьма может бегать очень быстро, как Флэш." + "ru" "{mint}Этот ведьма может бегать очень быстро, как Флэш." + } + + "Common #20" + { + "ru" "{mint}Этот обычных может бегать очень быстро, как Флэш." } "Tank #21 Name" @@ -1654,6 +1854,11 @@ "ru" "Огнеупорная Ведьма" } + "Common #21 Name" + { + "ru" "Огнеупорная Обычных" + } + "Tank #21" { "ru" "{mint}Этот танк может поджигать и невосприимчив к урону от огня." @@ -1686,12 +1891,17 @@ "Spitter #21" { - "ru" "{mint}Эта плевальщица может поджигать и невосприимчива к урону от огня." + "ru" "{mint}Этот плевальщица может поджигать и невосприимчива к урону от огня." } "Witch #21" { - "ru" "{mint}Эта Ведьма может поджигать и невосприимчива к урону от огня." + "ru" "{mint}Этот ведьма может поджигать и невосприимчива к урону от огня." + } + + "Common #21" + { + "ru" "{mint}Этот обычных может поджигать и невосприимчива к урону от огня." } "Tank #22 Name" @@ -1734,6 +1944,11 @@ "ru" "Ведьма-бросатель" } + "Common #22 Name" + { + "ru" "Обычных-бросатель" + } + "Tank #22" { "ru" "{mint}Этот танк может подбрасывать выживших или подбрасывать их в воздух." @@ -1766,12 +1981,17 @@ "Spitter #22" { - "ru" "{mint}Эта плевальщица может подбрасывать выживших или подбрасывать их в воздух." + "ru" "{mint}Этот плевальщица может подбрасывать выживших или подбрасывать их в воздух." } "Witch #22" { - "ru" "{mint}Эта ведьма может подбрасывать выживших или подбрасывать их в воздух." + "ru" "{mint}Этот ведьма может подбрасывать выживших или подбрасывать их в воздух." + } + + "Common #22" + { + "ru" "{mint}Этот обычных может подбрасывать выживших или подбрасывать их в воздух." } "Tank #23 Name" @@ -1814,6 +2034,11 @@ "ru" "Летающая Ведьма" } + "Common #23 Name" + { + "ru" "Летающая Обычных" + } + "Tank #23" { "ru" "{mint}Этот танк летает в поисках жертв." @@ -1846,7 +2071,7 @@ "Spitter #23" { - "ru" "{mint}Эта плевальщица летает в поисках жертв." + "ru" "{mint}Этот плевальщица летает в поисках жертв." } "Witch #23" @@ -1854,6 +2079,11 @@ "ru" "{mint}Этот ведьма летает в поисках жертв." } + "Common #23" + { + "ru" "{mint}Этот обычных летает в поисках жертв." + } + "Tank #24 Name" { "ru" "Уязвимый Танк" @@ -1894,6 +2124,11 @@ "ru" "Уязвимая Ведьма" } + "Common #24 Name" + { + "ru" "Уязвимая Обычных" + } + "Tank #24" { "ru" "{mint}Этот танк получает дополнительный урон, нанося больше урона и быстрее бегая." @@ -1926,12 +2161,17 @@ "Spitter #24" { - "ru" "{mint}Эта плевальщица получает дополнительный урон, нанося больше урона и быстрее бегая." + "ru" "{mint}Этот плевальщица получает дополнительный урон, нанося больше урона и быстрее бегая." } "Witch #24" { - "ru" "{mint}Эта Ведьма получает дополнительный урон, нанося больше урона и быстрее бегая." + "ru" "{mint}Этот ведьма получает дополнительный урон, нанося больше урона и быстрее бегая." + } + + "Common #24" + { + "ru" "{mint}Этот обычных получает дополнительный урон, нанося больше урона и быстрее бегая." } "Tank #25 Name" @@ -1974,6 +2214,11 @@ "ru" "Ведьма-призрак" } + "Common #25 Name" + { + "ru" "Обычных-призрак" + } + "Tank #25" { "ru" "{mint}Этот танк может маскироваться и обезоруживать выживших." @@ -2006,12 +2251,17 @@ "Spitter #25" { - "ru" "{mint}Эта плевальщица может маскироваться и обезоруживать выживших." + "ru" "{mint}Этот плевальщица может маскироваться и обезоруживать выживших." } "Witch #25" { - "ru" "{mint}Эта ведьма может маскироваться и обезоруживать выживших." + "ru" "{mint}Этот ведьма может маскироваться и обезоруживать выживших." + } + + "Common #25" + { + "ru" "{mint}Этот обычных может маскироваться и обезоруживать выживших." } "Tank #26 Name" @@ -2054,6 +2304,11 @@ "ru" "Божественная Ведьма" } + "Common #26 Name" + { + "ru" "Божественная Обычных" + } + "Tank #26" { "ru" "{mint}Этот танк может получить временную неуязвимость." @@ -2086,12 +2341,17 @@ "Spitter #26" { - "ru" "{mint}Эта плевальщица может получить временную неуязвимость." + "ru" "{mint}Этот плевальщица может получить временную неуязвимость." } "Witch #26" { - "ru" "{mint}Эта Ведьма может получить временную неуязвимость." + "ru" "{mint}Этот ведьма может получить временную неуязвимость." + } + + "Common #26" + { + "ru" "{mint}Этот обычных может получить временную неуязвимость." } "Tank #27 Name" @@ -2134,6 +2394,11 @@ "ru" "Гравитационная Ведьма" } + "Common #27 Name" + { + "ru" "Гравитационная Обычных" + } + "Tank #27" { "ru" "{mint}Этот танк может притягивать к себе выживших и заражённых и понижать гравитацию выживших." @@ -2166,12 +2431,17 @@ "Spitter #27" { - "ru" "{mint}Эта плевальщица может притягивать к себе выживших и заражённых и понижать гравитацию выживших." + "ru" "{mint}Этот плевальщица может притягивать к себе выживших и заражённых и понижать гравитацию выживших." } "Witch #27" { - "ru" "{mint}Эта Ведьма может притягивать к себе выживших и заражённых и понижать гравитацию выживших." + "ru" "{mint}Этот ведьма может притягивать к себе выживших и заражённых и понижать гравитацию выживших." + } + + "Common #27" + { + "ru" "{mint}Этот обычных может притягивать к себе выживших и заражённых и понижать гравитацию выживших." } "Tank #28 Name" @@ -2214,6 +2484,11 @@ "ru" "Ведьма-стрелок" } + "Common #28 Name" + { + "ru" "Обычных-стрелок" + } + "Tank #28" { "ru" "{mint}Этот танк может вооружаться пушками и стрелять по выжившим." @@ -2246,12 +2521,17 @@ "Spitter #28" { - "ru" "{mint}Эта плевальщица может вооружаться пушками и стрелять по выжившим." + "ru" "{mint}Этот плевальщица может вооружаться пушками и стрелять по выжившим." } "Witch #28" { - "ru" "{mint}Эта Ведьма может вооружаться пушками и стрелять по выжившим." + "ru" "{mint}Этот ведьма может вооружаться пушками и стрелять по выжившим." + } + + "Common #28" + { + "ru" "{mint}Этот обычных может вооружаться пушками и стрелять по выжившим." } "Tank #29 Name" @@ -2294,6 +2574,11 @@ "ru" "Здоровая Ведьма" } + "Common #29 Name" + { + "ru" "Здоровая Обычных" + } + "Tank #29" { "ru" "{mint}Этот танк может дать выжившим временное здоровье, и он может поглощать здоровье находящихся поблизости заражённых." @@ -2326,12 +2611,17 @@ "Spitter #29" { - "ru" "{mint}Эта плевальщица может дать выжившим временное здоровье, и она может поглощать здоровье находящихся поблизости заражённых." + "ru" "{mint}Этот плевальщица может дать выжившим временное здоровье, и она может поглощать здоровье находящихся поблизости заражённых." } "Witch #29" { - "ru" "{mint}Эта Ведьма может дать выжившим временное здоровье, и она может поглощать здоровье находящихся поблизости заражённых." + "ru" "{mint}Этот ведьма может дать выжившим временное здоровье, и она может поглощать здоровье находящихся поблизости заражённых." + } + + "Common #29" + { + "ru" "{mint}Этот обычных может дать выжившим временное здоровье, и она может поглощать здоровье находящихся поблизости заражённых." } "Tank #30 Name" @@ -2374,6 +2664,11 @@ "ru" "Ведьма с слабым местом" } + "Common #30 Name" + { + "ru" "Обычных с слабым местом" + } + "Tank #30" { "ru" "{mint}Этого танка можно повредить только выстрелами в голову." @@ -2414,6 +2709,11 @@ "ru" "{mint}Эту Ведьму можно повредить только выстрелами в голову." } + "Common #30" + { + "ru" "{mint}Эту Ведьму можно повредить только выстрелами в голову." + } + "Tank #31 Name" { "ru" "Танк-охотник" @@ -2454,6 +2754,11 @@ "ru" "Ведьма-охотник" } + "Common #31 Name" + { + "ru" "Обычных-охотник" + } + "Tank #31" { "ru" "{mint}Этот танк может создавать за собой охотников и бросать их в выживших." @@ -2486,12 +2791,17 @@ "Spitter #31" { - "ru" "{mint}Эта плевальщица может создавать за собой охотников." + "ru" "{mint}Этот плевальщица может создавать за собой охотников." } "Witch #31" { - "ru" "{mint}Эта Ведьма может создавать за собой охотников." + "ru" "{mint}Этот ведьма может создавать за собой охотников." + } + + "Common #31" + { + "ru" "{mint}Этот обычных может создавать за собой охотников." } "Tank #32 Name" @@ -2534,6 +2844,11 @@ "ru" "Вредящий Ведьма" } + "Common #32 Name" + { + "ru" "Вредящий Обычных" + } + "Tank #32" { "ru" "{mint}Этот танк в течение определённого периода времени может постоянно наносить урон выжившим." @@ -2566,12 +2881,17 @@ "Spitter #32" { - "ru" "{mint}Эта плевальщица в течение определённого периода времени может постоянно наносить урон выжившим." + "ru" "{mint}Этот плевальщица в течение определённого периода времени может постоянно наносить урон выжившим." } "Witch #32" { - "ru" "{mint}Эта Ведьма в течение определённого периода времени может постоянно наносить урон выжившим." + "ru" "{mint}Этот ведьма в течение определённого периода времени может постоянно наносить урон выжившим." + } + + "Common #32" + { + "ru" "{mint}Этот обычных в течение определённого периода времени может постоянно наносить урон выжившим." } "Tank #33 Name" @@ -2614,6 +2934,11 @@ "ru" "Ведьма-гипнотизёр" } + "Common #33 Name" + { + "ru" "Обычных-гипнотизёр" + } + "Tank #33" { "ru" "{mint}Этот танк может загипнотизировать выживших, чтобы они навредили себе или своим товарищам." @@ -2646,12 +2971,17 @@ "Spitter #33" { - "ru" "{mint}Эта плевальщица может загипнотизировать выживших, чтобы они навредили себе или своим товарищам." + "ru" "{mint}Этот плевальщица может загипнотизировать выживших, чтобы они навредили себе или своим товарищам." } "Witch #33" { - "ru" "{mint}Эта Ведьма может загипнотизировать выживших, чтобы они навредили себе или своим товарищам." + "ru" "{mint}Этот ведьма может загипнотизировать выживших, чтобы они навредили себе или своим товарищам." + } + + "Common #33" + { + "ru" "{mint}Этот обычных может загипнотизировать выживших, чтобы они навредили себе или своим товарищам." } "Tank #34 Name" @@ -2694,6 +3024,11 @@ "ru" "Ледяной Ведьма" } + "Common #34 Name" + { + "ru" "Ледяной Обычных" + } + "Tank #34" { "ru" "{mint}Этот танк может заморозить выживших." @@ -2726,12 +3061,17 @@ "Spitter #34" { - "ru" "{mint}Эта плевальщица может заморозить выживших." + "ru" "{mint}Этот плевальщица может заморозить выживших." } "Witch #34" { - "ru" "{mint}Эта Ведьма может заморозить выживших." + "ru" "{mint}Этот ведьма может заморозить выживших." + } + + "Common #34" + { + "ru" "{mint}Этот обычных может заморозить выживших." } "Tank #35 Name" @@ -2774,6 +3114,11 @@ "ru" "Ведьма бездействия" } + "Common #35 Name" + { + "ru" "Обычных бездействия" + } + "Tank #35" { "ru" "{mint}Этот танк может заставить выживших перейти в режим бездействия. (Это не влияет на ботов.)" @@ -2806,12 +3151,17 @@ "Spitter #35" { - "ru" "{mint}Эта плевальщица может заставить выживших перейти в режим бездействия. (Это не влияет на ботов.)" + "ru" "{mint}Этот плевальщица может заставить выживших перейти в режим бездействия. (Это не влияет на ботов.)" } "Witch #35" { - "ru" "{mint}Эта Ведьма может заставить выживших перейти в режим бездействия. (Это не влияет на ботов.)" + "ru" "{mint}Этот ведьма может заставить выживших перейти в режим бездействия. (Это не влияет на ботов.)" + } + + "Common #35" + { + "ru" "{mint}Этот обычных может заставить выживших перейти в режим бездействия. (Это не влияет на ботов.)" } "Tank #36 Name" @@ -2854,6 +3204,11 @@ "ru" "Инверторный Ведьма" } + "Common #36 Name" + { + "ru" "Инверторный Обычных" + } + "Tank #36" { "ru" "{mint}Этот танк может инвертировать клавиши передвижения выживших." @@ -2886,12 +3241,17 @@ "Spitter #36" { - "ru" "{mint}Эта плевальщица может инвертировать клавиши передвижения выживших." + "ru" "{mint}Этот плевальщица может инвертировать клавиши передвижения выживших." } "Witch #36" { - "ru" "{mint}Эта Ведьма может инвертировать клавиши передвижения выживших." + "ru" "{mint}Этот ведьма может инвертировать клавиши передвижения выживших." + } + + "Common #36" + { + "ru" "{mint}Этот обычных может инвертировать клавиши передвижения выживших." } "Tank #37 Name" @@ -2934,6 +3294,11 @@ "ru" "Ведьма с предметами" } + "Common #37 Name" + { + "ru" "Обычных с предметами" + } + "Tank #37" { "ru" "{mint}Этот танк может дать выжившим предметы после смерти." @@ -2966,12 +3331,17 @@ "Spitter #37" { - "ru" "{mint}Эта плевальщица может дать выжившим предметы после смерти." + "ru" "{mint}Этот плевальщица может дать выжившим предметы после смерти." } "Witch #37" { - "ru" "{mint}Эта Ведьма может дать выжившим предметы после смерти." + "ru" "{mint}Этот ведьма может дать выжившим предметы после смерти." + } + + "Common #37" + { + "ru" "{mint}Этот обычных может дать выжившим предметы после смерти." } "Tank #38 Name" @@ -3014,6 +3384,11 @@ "ru" "Ведьма-жокей" } + "Common #38 Name" + { + "ru" "Обычных-жокей" + } + "Tank #38" { "ru" "{mint}Этот танк может создавать за собой жокеев и бросать их в выживших." @@ -3046,12 +3421,17 @@ "Spitter #38" { - "ru" "{mint}Эта плевальщица может создавать за собой жокеев." + "ru" "{mint}Этот плевальщица может создавать за собой жокеев." } "Witch #38" { - "ru" "{mint}Эта Ведьма может создавать за собой жокеев." + "ru" "{mint}Этот ведьма может создавать за собой жокеев." + } + + "Common #38" + { + "ru" "{mint}Этот обычных может создавать за собой жокеев." } "Tank #39 Name" @@ -3094,6 +3474,11 @@ "ru" "Ведьма-прыгун" } + "Common #39 Name" + { + "ru" "Обычных-прыгун" + } + "Tank #39" { "ru" "{mint}Этот танк может периодически прыгать и заставлять выживших бесконтрольно прыгать." @@ -3126,12 +3511,17 @@ "Spitter #39" { - "ru" "{mint}Эта плевальщица может периодически прыгать и заставлять выживших бесконтрольно прыгать." + "ru" "{mint}Этот плевальщица может периодически прыгать и заставлять выживших бесконтрольно прыгать." } "Witch #39" { - "ru" "{mint}Эта Ведьма может периодически прыгать и заставлять выживших бесконтрольно прыгать." + "ru" "{mint}Этот ведьма может периодически прыгать и заставлять выживших бесконтрольно прыгать." + } + + "Common #39" + { + "ru" "{mint}Этот обычных может периодически прыгать и заставлять выживших бесконтрольно прыгать." } "Tank #40 Name" @@ -3174,6 +3564,11 @@ "ru" "Ведьма-камикадзе" } + "Common #40 Name" + { + "ru" "Обычных-камикадзе" + } + "Tank #40" { "ru" "{mint}Этот танк может убить себя вместе с выжившим." @@ -3206,12 +3601,17 @@ "Spitter #40" { - "ru" "{mint}Эта плевальщица может убить себя вместе с выжившим." + "ru" "{mint}Этот плевальщица может убить себя вместе с выжившим." } "Witch #40" { - "ru" "{mint}Эта Ведьма может убить себя вместе с выжившим." + "ru" "{mint}Этот ведьма может убить себя вместе с выжившим." + } + + "Common #40" + { + "ru" "{mint}Этот обычных может убить себя вместе с выжившим." } "Tank #41 Name" @@ -3254,6 +3654,11 @@ "ru" "Лаггер-Ведьма" } + "Common #41 Name" + { + "ru" "Лаггер-Обычных" + } + "Tank #41" { "ru" "{mint}Этот танк может вызвать у выживших подвисание игры." @@ -3286,12 +3691,17 @@ "Spitter #41" { - "ru" "{mint}Эта плевальщица может вызвать у выживших подвисание игры." + "ru" "{mint}Этот плевальщица может вызвать у выживших подвисание игры." } "Witch #41" { - "ru" "{mint}Эта Ведьма может вызвать у выживших подвисание игры." + "ru" "{mint}Этот ведьма может вызвать у выживших подвисание игры." + } + + "Common #41" + { + "ru" "{mint}Этот обычных может вызвать у выживших подвисание игры." } "Tank #42 Name" @@ -3334,6 +3744,11 @@ "ru" "Лазерный Ведьма" } + "Common #42 Name" + { + "ru" "Лазерный Обычных" + } + "Tank #42" { "ru" "{mint}Этот танк может стрелять лазерами по выжившим." @@ -3366,12 +3781,17 @@ "Spitter #42" { - "ru" "{mint}Эта плевальщица может стрелять лазерами по выжившим." + "ru" "{mint}Этот плевальщица может стрелять лазерами по выжившим." } "Witch #42" { - "ru" "{mint}Эта Ведьма может стрелять лазерами по выжившим." + "ru" "{mint}Этот ведьма может стрелять лазерами по выжившим." + } + + "Common #42" + { + "ru" "{mint}Этот обычных может стрелять лазерами по выжившим." } "Tank #43 Name" @@ -3414,6 +3834,11 @@ "ru" "Ведьма-кровопийца" } + "Common #43 Name" + { + "ru" "Обычных-кровопийца" + } + "Tank #43" { "ru" "{mint}Этот танк может высасывать здоровье у выживших." @@ -3446,12 +3871,17 @@ "Spitter #43" { - "ru" "{mint}Эта плевальщица может высасывать здоровье у выживших." + "ru" "{mint}Этот плевальщица может высасывать здоровье у выживших." } "Witch #43" { - "ru" "{mint}Эта Ведьма может высасывать здоровье у выживших." + "ru" "{mint}Этот ведьма может высасывать здоровье у выживших." + } + + "Common #43" + { + "ru" "{mint}Этот обычных может высасывать здоровье у выживших." } "Tank #44 Name" @@ -3494,6 +3924,11 @@ "ru" "Ведьма молний" } + "Common #44 Name" + { + "ru" "Обычных молний" + } + "Tank #44" { "ru" "{mint}Этот танк создаёт грозовой шторм." @@ -3526,12 +3961,17 @@ "Spitter #44" { - "ru" "{mint}Эта плевальщица создаёт грозовой шторм." + "ru" "{mint}Этот плевальщица создаёт грозовой шторм." } "Witch #44" { - "ru" "{mint}Эта Ведьма создаёт грозовой шторм." + "ru" "{mint}Этот ведьма создаёт грозовой шторм." + } + + "Common #44" + { + "ru" "{mint}Этот обычных создаёт грозовой шторм." } "Tank #45 Name" @@ -3574,6 +4014,11 @@ "ru" "Ведьма-медик" } + "Common #45 Name" + { + "ru" "Обычных-медик" + } + "Tank #45" { "ru" "{mint}Этот танк может лечить ближайших особых заражённых после смерти." @@ -3606,12 +4051,17 @@ "Spitter #45" { - "ru" "{mint}Эта плевальщица может лечить ближайших особых заражённых после смерти." + "ru" "{mint}Этот плевальщица может лечить ближайших особых заражённых после смерти." } "Witch #45" { - "ru" "{mint}Эта Ведьма может лечить ближайших особых заражённых после смерти." + "ru" "{mint}Этот ведьма может лечить ближайших особых заражённых после смерти." + } + + "Common #45" + { + "ru" "{mint}Этот обычных может лечить ближайших особых заражённых после смерти." } "Tank #46 Name" @@ -3654,6 +4104,11 @@ "ru" "Метеоритный Ведьма" } + "Common #46 Name" + { + "ru" "Метеоритный Обычных" + } + "Tank #46" { "ru" "{mint}Этот танк может вызвать метеоритный дождь, которые горят и взрываются через несколько секунд." @@ -3686,12 +4141,17 @@ "Spitter #46" { - "ru" "{mint}Эта плевальщица может вызвать метеоритный дождь, которые горят и взрываются через несколько секунд." + "ru" "{mint}Этот плевальщица может вызвать метеоритный дождь, которые горят и взрываются через несколько секунд." } "Witch #46" { - "ru" "{mint}Эта Ведьма может вызвать метеоритный дождь, которые горят и взрываются через несколько секунд." + "ru" "{mint}Этот ведьма может вызвать метеоритный дождь, которые горят и взрываются через несколько секунд." + } + + "Common #46" + { + "ru" "{mint}Этот обычных может вызвать метеоритный дождь, которые горят и взрываются через несколько секунд." } "Tank #47 Name" @@ -3734,6 +4194,11 @@ "ru" "Ведьма-некромант" } + "Common #47 Name" + { + "ru" "Обычных-некромант" + } + "Tank #47" { "ru" "{mint}Этот танк может воскрешать мёртвых особых заражённых." @@ -3766,12 +4231,17 @@ "Spitter #47" { - "ru" "{mint}Эта плевальщица может воскрешать мёртвых особых заражённых." + "ru" "{mint}Этот плевальщица может воскрешать мёртвых особых заражённых." } "Witch #47" { - "ru" "{mint}Эта Ведьма может воскрешать мёртвых особых заражённых." + "ru" "{mint}Этот ведьма может воскрешать мёртвых особых заражённых." + } + + "Common #47" + { + "ru" "{mint}Этот обычных может воскрешать мёртвых особых заражённых." } "Tank #48 Name" @@ -3814,6 +4284,11 @@ "ru" "Ведьма-обнулитель" } + "Common #48 Name" + { + "ru" "Обычных-обнулитель" + } + "Tank #48" { "ru" "{mint}Этот танк может обнулить урон от выживших, чтобы защитить себя от получаемого урона." @@ -3846,12 +4321,17 @@ "Spitter #48" { - "ru" "{mint}Эта плевальщица может обнулить урон от выживших, чтобы защитить себя от получаемого урона." + "ru" "{mint}Этот плевальщица может обнулить урон от выживших, чтобы защитить себя от получаемого урона." } "Witch #48" { - "ru" "{mint}Эта Ведьма может обнулить урон от выживших, чтобы защитить себя от получаемого урона." + "ru" "{mint}Этот ведьма может обнулить урон от выживших, чтобы защитить себя от получаемого урона." + } + + "Common #48" + { + "ru" "{mint}Этот обычных может обнулить урон от выживших, чтобы защитить себя от получаемого урона." } "Tank #49 Name" @@ -3894,6 +4374,11 @@ "ru" "Омниведьма" } + "Common #49 Name" + { + "ru" "Омниведьма" + } + "Tank #49" { "ru" "{mint}Этот танк может получить доступ к способностям других ближайших танков-мутантов." @@ -3926,12 +4411,17 @@ "Spitter #49" { - "ru" "{mint}Эта Плевальщица может получить доступ к способностям других ближайших плевальщиц-мутантов." + "ru" "{mint}Этот Плевальщица может получить доступ к способностям других ближайших плевальщиц-мутантов." } "Witch #49" { - "ru" "{mint}Эта Ведьма может получить доступ к способностям других ближайших Ведьм-мутантов." + "ru" "{mint}Этот ведьма может получить доступ к способностям других ближайших Ведьм-мутантов." + } + + "Common #49" + { + "ru" "{mint}Этот обычных может получить доступ к способностям других ближайших Ведьм-мутантов." } "Tank #50 Name" @@ -3974,6 +4464,11 @@ "ru" "Ведьма орды" } + "Common #50 Name" + { + "ru" "Обычных орды" + } + "Tank #50" { "ru" "{mint}Этот танк может запускать события орды зомби." @@ -4006,12 +4501,17 @@ "Spitter #50" { - "ru" "{mint}Эта плевальщица может запускать события орды зомби." + "ru" "{mint}Этот плевальщица может запускать события орды зомби." } "Witch #50" { - "ru" "{mint}Эта Ведьма может запускать события орды зомби." + "ru" "{mint}Этот ведьма может запускать события орды зомби." + } + + "Common #50" + { + "ru" "{mint}Этот обычных может запускать события орды зомби." } "Tank #51 Name" @@ -4054,6 +4554,11 @@ "ru" "Ручной Ведьма" } + "Common #51 Name" + { + "ru" "Ручной Обычных" + } + "Tank #51" { "ru" "{mint}Этот танк верен выжившим и любит обниматься." @@ -4086,12 +4591,17 @@ "Spitter #51" { - "ru" "{mint}Эта плевальщица верна выжившим и любит обниматься." + "ru" "{mint}Этот плевальщица верна выжившим и любит обниматься." } "Witch #51" { - "ru" "{mint}Эта Ведьма верна выжившим и любит обниматься." + "ru" "{mint}Этот ведьма верна выжившим и любит обниматься." + } + + "Common #51" + { + "ru" "{mint}Этот обычных верна выжившим и любит обниматься." } "Tank #52 Name" @@ -4134,6 +4644,11 @@ "ru" "Ведьма пощёчины" } + "Common #52 Name" + { + "ru" "Обычных пощёчины" + } + "Tank #52" { "ru" "{mint}Этот танк может многократно шлепать выживших, чтобы показать им, кто здесь главный." @@ -4166,12 +4681,17 @@ "Spitter #52" { - "ru" "{mint}Эта плевальщица может многократно шлепать выживших, чтобы показать им, кто здесь главный." + "ru" "{mint}Этот плевальщица может многократно шлепать выживших, чтобы показать им, кто здесь главный." } "Witch #52" { - "ru" "{mint}Эта Ведьма может многократно шлепать выживших, чтобы показать им, кто здесь главный." + "ru" "{mint}Этот ведьма может многократно шлепать выживших, чтобы показать им, кто здесь главный." + } + + "Common #52" + { + "ru" "{mint}Этот обычных может многократно шлепать выживших, чтобы показать им, кто здесь главный." } "Tank #53 Name" @@ -4214,6 +4734,11 @@ "ru" "Платиновый Ведьма" } + "Common #53 Name" + { + "ru" "Платиновый Обычных" + } + "Tank #53" { "ru" "{mint}Этот танк невосприимчив к урону в ближнем бою." @@ -4246,12 +4771,17 @@ "Spitter #53" { - "ru" "{mint}Эта плевальщица невосприимчива к урону в ближнем бою." + "ru" "{mint}Этот плевальщица невосприимчива к урону в ближнем бою." } "Witch #53" { - "ru" "{mint}Эта Ведьма невосприимчива к урону в ближнем бою." + "ru" "{mint}Этот ведьма невосприимчива к урону в ближнем бою." + } + + "Common #53" + { + "ru" "{mint}Этот обычных невосприимчива к урону в ближнем бою." } "Tank #54 Name" @@ -4294,6 +4824,11 @@ "ru" "Рвотная Ведьма" } + "Common #54 Name" + { + "ru" "Рвотная Обычных" + } + "Tank #54" { "ru" "{mint}Этот танка может вырвать на выживших." @@ -4326,12 +4861,17 @@ "Spitter #54" { - "ru" "{mint}Эта плевальщица может вырвать на выживших." + "ru" "{mint}Этот плевальщица может вырвать на выживших." } "Witch #54" { - "ru" "{mint}Эта Ведьма может вырвать на выживших." + "ru" "{mint}Этот ведьма может вырвать на выживших." + } + + "Common #54" + { + "ru" "{mint}Этот обычных может вырвать на выживших." } "Tank #55 Name" @@ -4374,6 +4914,11 @@ "ru" "Ведьма-пироманьяк" } + "Common #55 Name" + { + "ru" "Обычных-пироманьяк" + } + "Tank #55" { "ru" "{mint}Этот танк увеличивает свою скорость передвижения при поджоге себя." @@ -4406,12 +4951,17 @@ "Spitter #55" { - "ru" "{mint}Эта плевальщица увеличивает свою скорость передвижения при поджоге себя." + "ru" "{mint}Этот плевальщица увеличивает свою скорость передвижения при поджоге себя." } "Witch #55" { - "ru" "{mint}Эта Ведьма увеличивает свою скорость передвижения при поджоге себя." + "ru" "{mint}Этот ведьма увеличивает свою скорость передвижения при поджоге себя." + } + + "Common #55" + { + "ru" "{mint}Этот обычных увеличивает свою скорость передвижения при поджоге себя." } "Tank #56 Name" @@ -4454,6 +5004,11 @@ "ru" "Тихая Ведьма" } + "Common #56 Name" + { + "ru" "Тихая Обычных" + } + "Tank #56" { "ru" "{mint}Этот танк может бесшумно передвигаться для выживших." @@ -4486,12 +5041,17 @@ "Spitter #56" { - "ru" "{mint}Эта плевальщица может бесшумно передвигаться для выживших." + "ru" "{mint}Этот плевальщица может бесшумно передвигаться для выживших." } "Witch #56" { - "ru" "{mint}Эта Ведьма может бесшумно передвигаться для выживших." + "ru" "{mint}Этот ведьма может бесшумно передвигаться для выживших." + } + + "Common #56" + { + "ru" "{mint}Этот обычных может бесшумно передвигаться для выживших." } "Tank #57 Name" @@ -4534,6 +5094,11 @@ "ru" "Ведьма телепортации" } + "Common #57 Name" + { + "ru" "Обычных телепортации" + } + "Tank #57" { "ru" "{mint}Этот танк может перемещаться во времени и досаждать выжившим." @@ -4566,12 +5131,17 @@ "Spitter #57" { - "ru" "{mint}Эта плевальщица может перемещаться во времени и досаждать выжившим." + "ru" "{mint}Этот плевальщица может перемещаться во времени и досаждать выжившим." } "Witch #57" { - "ru" "{mint}Эта Ведьма может перемещаться во времени и досаждать выжившим." + "ru" "{mint}Этот ведьма может перемещаться во времени и досаждать выжившим." + } + + "Common #57" + { + "ru" "{mint}Этот обычных может перемещаться во времени и досаждать выжившим." } "Tank #58 Name" @@ -4614,6 +5184,11 @@ "ru" "Ведьма отдачи" } + "Common #58 Name" + { + "ru" "Обычных отдачи" + } + "Tank #58" { "ru" "{mint}Этот танк может дать выжившим высокую отдачу орудия." @@ -4646,12 +5221,17 @@ "Spitter #58" { - "ru" "{mint}Эта плевальщица может дать выжившим высокую отдачу орудия." + "ru" "{mint}Этот плевальщица может дать выжившим высокую отдачу орудия." } "Witch #58" { - "ru" "{mint}Эта Ведьма может дать выжившим высокую отдачу орудия." + "ru" "{mint}Этот ведьма может дать выжившим высокую отдачу орудия." + } + + "Common #58" + { + "ru" "{mint}Этот обычных может дать выжившим высокую отдачу орудия." } "Tank #59 Name" @@ -4694,6 +5274,11 @@ "ru" "Регенеративная Ведьма" } + "Common #59 Name" + { + "ru" "Регенеративная Обычных" + } + "Tank #59" { "ru" "{mint}Этот танк регенерирует здоровье каждую секунду." @@ -4726,12 +5311,17 @@ "Spitter #59" { - "ru" "{mint}Эта плевальщица регенерирует здоровье каждую секунду." + "ru" "{mint}Этот плевальщица регенерирует здоровье каждую секунду." } "Witch #59" { - "ru" "{mint}Эта Ведьма регенерирует здоровье каждую секунду." + "ru" "{mint}Этот ведьма регенерирует здоровье каждую секунду." + } + + "Common #59" + { + "ru" "{mint}Этот обычных регенерирует здоровье каждую секунду." } "Tank #60 Name" @@ -4774,6 +5364,11 @@ "ru" "Воскрещающийся Ведьма" } + "Common #60 Name" + { + "ru" "Воскрещающийся Обычных" + } + "Tank #60" { "ru" "{mint}Этот танк может возродиться после смерти." @@ -4806,12 +5401,17 @@ "Spitter #60" { - "ru" "{mint}Эта плевальщица может возродиться после смерти." + "ru" "{mint}Этот плевальщица может возродиться после смерти." } "Witch #60" { - "ru" "{mint}Эта Ведьма может возродиться после смерти." + "ru" "{mint}Этот ведьма может возродиться после смерти." + } + + "Common #60" + { + "ru" "{mint}Этот обычных может возродиться после смерти." } "Tank #61 Name" @@ -4854,6 +5454,11 @@ "ru" "Рестартящая Ведьма" } + "Common #61 Name" + { + "ru" "Рестартящая Обычных" + } + "Tank #61" { "ru" "{mint}Этот танк может заставить выживших перезапустить игру с новым снаряжением." @@ -4886,12 +5491,17 @@ "Spitter #61" { - "ru" "{mint}Эта плевальщица может заставить выживших перезапустить игру с новым снаряжением." + "ru" "{mint}Этот плевальщица может заставить выживших перезапустить игру с новым снаряжением." } "Witch #61" { - "ru" "{mint}Эта Ведьма может заставить выживших перезапустить игру с новым снаряжением." + "ru" "{mint}Этот ведьма может заставить выживших перезапустить игру с новым снаряжением." + } + + "Common #61" + { + "ru" "{mint}Этот обычных может заставить выживших перезапустить игру с новым снаряжением." } "Tank #62 Name" @@ -4934,6 +5544,11 @@ "ru" "Ведьма камнепада" } + "Common #62 Name" + { + "ru" "Обычных камнепада" + } + "Tank #62" { "ru" "{mint}Этот танк может вызвать камнепад." @@ -4966,12 +5581,17 @@ "Spitter #62" { - "ru" "{mint}Эта плевальщица может вызвать камнепад." + "ru" "{mint}Этот плевальщица может вызвать камнепад." } "Witch #62" { - "ru" "{mint}Эта Ведьма может вызвать камнепад." + "ru" "{mint}Этот ведьма может вызвать камнепад." + } + + "Common #62" + { + "ru" "{mint}Этот обычных может вызвать камнепад." } "Tank #63 Name" @@ -5014,6 +5634,11 @@ "ru" "Ведьма-ракетчица" } + "Common #63 Name" + { + "ru" "Обычных-ракетчица" + } + "Tank #63" { "ru" "{mint}Этот танк может отправлять выживших в космос." @@ -5046,12 +5671,17 @@ "Spitter #63" { - "ru" "{mint}Эта плевальщица может отправлять выживших в космос." + "ru" "{mint}Этот плевальщица может отправлять выживших в космос." } "Witch #63" { - "ru" "{mint}Эта Ведьма может отправлять выживших в космос." + "ru" "{mint}Этот ведьма может отправлять выживших в космос." + } + + "Common #63" + { + "ru" "{mint}Этот обычных может отправлять выживших в космос." } "Tank #64 Name" @@ -5094,6 +5724,11 @@ "ru" "Самошвыряющийся Ведьма" } + "Common #64 Name" + { + "ru" "Самошвыряющийся Обычных" + } + "Tank #64" { "ru" "{mint}Этот танк может бросить самого себя на выживших." @@ -5126,12 +5761,17 @@ "Spitter #64" { - "ru" "{mint}Эта плевальщица может бросить саму себя на выживших." + "ru" "{mint}Этот плевальщица может бросить саму себя на выживших." } "Witch #64" { - "ru" "{mint}Эта Ведьма может бросить саму себя на выживших." + "ru" "{mint}Этот ведьма может бросить саму себя на выживших." + } + + "Common #64" + { + "ru" "{mint}Этот обычных может бросить саму себя на выживших." } "Tank #65 Name" @@ -5174,6 +5814,11 @@ "ru" "Дрожащая Ведьма" } + "Common #65 Name" + { + "ru" "Дрожащая Обычных" + } + "Tank #65" { "ru" "{mint}Этот танк может заставить дрожать экран у выживших." @@ -5206,12 +5851,17 @@ "Spitter #65" { - "ru" "{mint}Эта плевальщица может заставить дрожать экран у выживших." + "ru" "{mint}Этот плевальщица может заставить дрожать экран у выживших." } "Witch #65" { - "ru" "{mint}Эта Ведьма может заставить дрожать экран у выживших." + "ru" "{mint}Этот ведьма может заставить дрожать экран у выживших." + } + + "Common #65" + { + "ru" "{mint}Этот обычных может заставить дрожать экран у выживших." } "Tank #66 Name" @@ -5254,6 +5904,11 @@ "ru" "Щитовой Ведьма" } + "Common #66 Name" + { + "ru" "Щитовой Обычных" + } + "Tank #66" { "ru" "{mint}Этот танк появляется со щитом и бросает баллоны с пропаном или канистры с бензином, которые выжившие могут использовать, чтобы сломать щит." @@ -5286,12 +5941,17 @@ "Spitter #66" { - "ru" "{mint}Эта плевальщица появляется со щитом." + "ru" "{mint}Этот плевальщица появляется со щитом." } "Witch #66" { - "ru" "{mint}Эта Ведьма появляется со щитом." + "ru" "{mint}Этот ведьма появляется со щитом." + } + + "Common #66" + { + "ru" "{mint}Этот обычных появляется со щитом." } "Tank #67 Name" @@ -5334,6 +5994,11 @@ "ru" "Толкающая Ведьма" } + "Common #67 Name" + { + "ru" "Толкающая Обычных" + } + "Tank #67" { "ru" "{mint}Этот танк может толкать выживших." @@ -5366,12 +6031,17 @@ "Spitter #67" { - "ru" "{mint}Эта плевальщица может толкать выживших." + "ru" "{mint}Этот плевальщица может толкать выживших." } "Witch #67" { - "ru" "{mint}Эта Ведьма может толкать выживших." + "ru" "{mint}Этот ведьма может толкать выживших." + } + + "Common #67" + { + "ru" "{mint}Этот обычных может толкать выживших." } "Tank #68 Name" @@ -5414,6 +6084,11 @@ "ru" "Замедляющая Ведьма" } + "Common #68 Name" + { + "ru" "Замедляющая Обычных" + } + "Tank #68" { "ru" "{mint}Этот танк может замедлить выживших." @@ -5446,12 +6121,17 @@ "Spitter #68" { - "ru" "{mint}Эта плевальщица может замедлить выживших." + "ru" "{mint}Этот плевальщица может замедлить выживших." } "Witch #68" { - "ru" "{mint}Эта Ведьма может замедлить выживших." + "ru" "{mint}Этот ведьма может замедлить выживших." + } + + "Common #68" + { + "ru" "{mint}Этот обычных может замедлить выживших." } "Tank #69 Name" @@ -5494,6 +6174,11 @@ "ru" "Ведьма-сокрушитель" } + "Common #69 Name" + { + "ru" "Обычных-сокрушитель" + } + "Tank #69" { "ru" "{mint}Этот танк может сокрушить выживших до смерти." @@ -5526,12 +6211,17 @@ "Spitter #69" { - "ru" "{mint}Эта плевальщица может сокрушить выживших до смерти." + "ru" "{mint}Этот плевальщица может сокрушить выживших до смерти." } "Witch #69" { - "ru" "{mint}Эта Ведьма может сокрушить выживших до смерти." + "ru" "{mint}Этот ведьма может сокрушить выживших до смерти." + } + + "Common #69" + { + "ru" "{mint}Этот обычных может сокрушить выживших до смерти." } "Tank #70 Name" @@ -5574,6 +6264,11 @@ "ru" "Поражающая Ведьма" } + "Common #70 Name" + { + "ru" "Поражающая Обычных" + } + "Tank #70" { "ru" "{mint}Этот танк может мгновенно убить выживших." @@ -5606,12 +6301,17 @@ "Spitter #70" { - "ru" "{mint}Эта плевальщица может мгновенно убить выживших." + "ru" "{mint}Этот плевальщица может мгновенно убить выживших." } "Witch #70" { - "ru" "{mint}Эта Ведьма может мгновенно убить выживших." + "ru" "{mint}Этот ведьма может мгновенно убить выживших." + } + + "Common #70" + { + "ru" "{mint}Этот обычных может мгновенно убить выживших." } "Tank #71 Name" @@ -5654,6 +6354,11 @@ "ru" "Ведьма-курильщик" } + "Common #71 Name" + { + "ru" "Обычных-курильщик" + } + "Tank #71" { "ru" "{mint}Этот танк может создавать за собой курильщиков, а также бросать их в выживших." @@ -5686,12 +6391,17 @@ "Spitter #71" { - "ru" "{mint}Эта плевальщица может создавать за собой курильщиков." + "ru" "{mint}Этот плевальщица может создавать за собой курильщиков." } "Witch #71" { - "ru" "{mint}Эта Ведьма может создавать за собой курильщиков." + "ru" "{mint}Этот ведьма может создавать за собой курильщиков." + } + + "Common #71" + { + "ru" "{mint}Этот обычных может создавать за собой курильщиков." } "Tank #72 Name" @@ -5734,6 +6444,11 @@ "ru" "Ведьма-спамер" } + "Common #72 Name" + { + "ru" "Обычных-спамер" + } + "Tank #72" { "ru" "{mint}Этот танк может спамить камнями в выживших." @@ -5766,12 +6481,17 @@ "Spitter #72" { - "ru" "{mint}Эта плевальщица может спамить камнями в выживших." + "ru" "{mint}Этот плевальщица может спамить камнями в выживших." } "Witch #72" { - "ru" "{mint}Эта Ведьма может спамить камнями в выживших." + "ru" "{mint}Этот ведьма может спамить камнями в выживших." + } + + "Common #72" + { + "ru" "{mint}Этот обычных может спамить камнями в выживших." } "Tank #73 Name" @@ -5814,6 +6534,11 @@ "ru" "Особая Ведьма" } + "Common #73 Name" + { + "ru" "Особая Обычных" + } + "Tank #73" { "ru" "{mint}Этот танк может создавать за собой случайных особых заражённых, а также бросать некоторых в выживших." @@ -5846,12 +6571,17 @@ "Spitter #73" { - "ru" "{mint}Эта плевальщица может создавать за собой случайных особых заражённых." + "ru" "{mint}Этот плевальщица может создавать за собой случайных особых заражённых." } "Witch #73" { - "ru" "{mint}Эта Ведьма может создавать за собой случайных особых заражённых." + "ru" "{mint}Этот ведьма может создавать за собой случайных особых заражённых." + } + + "Common #73" + { + "ru" "{mint}Этот обычных может создавать за собой случайных особых заражённых." } "Tank #74 Name" @@ -5894,6 +6624,11 @@ "ru" "Ведьма-Плевальщица" } + "Common #74 Name" + { + "ru" "Обычных-Плевальщица" + } + "Tank #74" { "ru" "{mint}Этот танк может создавать за собой плевальщиц, а также бросать их в выживших." @@ -5926,12 +6661,17 @@ "Spitter #74" { - "ru" "{mint}Эта плевальщица может создавать за собой плевальщиц." + "ru" "{mint}Этот плевальщица может создавать за собой плевальщиц." } "Witch #74" { - "ru" "{mint}Эта ведьма может создавать за собой плевальщиц." + "ru" "{mint}Этот ведьма может создавать за собой плевальщиц." + } + + "Common #74" + { + "ru" "{mint}Этот обычных может создавать за собой плевальщиц." } "Tank #75 Name" @@ -5974,6 +6714,11 @@ "ru" "Сплешер Ведьма" } + "Common #75 Name" + { + "ru" "Сплешер Обычных" + } + "Tank #75" { "ru" "{mint}Этот танк может наносить урон по области." @@ -6006,12 +6751,17 @@ "Spitter #75" { - "ru" "{mint}Эта плевальщица может наносить урон по области." + "ru" "{mint}Этот плевальщица может наносить урон по области." } "Witch #75" { - "ru" "{mint}Эта Ведьма может наносить урон по области." + "ru" "{mint}Этот ведьма может наносить урон по области." + } + + "Common #75" + { + "ru" "{mint}Этот обычных может наносить урон по области." } "Tank #76 Name" @@ -6054,6 +6804,11 @@ "ru" "Ведьма-опрыскиватель" } + "Common #76 Name" + { + "ru" "Обычных-опрыскиватель" + } + "Tank #76" { "ru" "{mint}Этот танк может забрызгать экран у всех игроков." @@ -6086,12 +6841,17 @@ "Spitter #76" { - "ru" "{mint}Эта плевальщица может забрызгать экран у всех игроков." + "ru" "{mint}Этот плевальщица может забрызгать экран у всех игроков." } "Witch #76" { - "ru" "{mint}Эта Ведьма может забрызгать экран у всех игроков." + "ru" "{mint}Этот ведьма может забрызгать экран у всех игроков." + } + + "Common #76" + { + "ru" "{mint}Этот обычных может забрызгать экран у всех игроков." } "Tank #77 Name" @@ -6134,6 +6894,11 @@ "ru" "Ведьма-метатель" } + "Common #77 Name" + { + "ru" "Обычных-метатель" + } + "Tank #77" { "ru" "{mint}Этот танк может метать машины, особых заражённых, танков, ведьм и самого себя!" @@ -6166,12 +6931,17 @@ "Spitter #77" { - "ru" "{mint}Эта плевальщица может метать машины, особых заражённых, танков, ведьм и самого себя!" + "ru" "{mint}Этот плевальщица может метать машины, особых заражённых, танков, ведьм и самого себя!" } "Witch #77" { - "ru" "{mint}Эта Ведьма может метать машины, особых заражённых, танков, ведьм и самого себя!" + "ru" "{mint}Этот ведьма может метать машины, особых заражённых, танков, ведьм и самого себя!" + } + + "Common #77" + { + "ru" "{mint}Этот обычных может метать машины, особых заражённых, танков, ведьм и самого себя!" } "Tank #78 Name" @@ -6214,6 +6984,11 @@ "ru" "Ведьма-наводчик" } + "Common #78 Name" + { + "ru" "Обычных-наводчик" + } + "Tank #78" { "ru" "{mint}Этот танк бросает камни, которые могут самонаводиться на выживших поблизости." @@ -6246,12 +7021,17 @@ "Spitter #78" { - "ru" "{mint}Эта плевальщица бросает камни, которые могут самонаводиться на выживших поблизости." + "ru" "{mint}Этот плевальщица бросает камни, которые могут самонаводиться на выживших поблизости." } "Witch #78" { - "ru" "{mint}Эта Ведьма бросает камни, которые могут самонаводиться на выживших поблизости." + "ru" "{mint}Этот ведьма бросает камни, которые могут самонаводиться на выживших поблизости." + } + + "Common #78" + { + "ru" "{mint}Этот обычных бросает камни, которые могут самонаводиться на выживших поблизости." } "Tank #79 Name" @@ -6294,6 +7074,11 @@ "ru" "Ведьма «Ультимэйт»" } + "Common #79 Name" + { + "ru" "Обычных «Ультимэйт»" + } + "Tank #79" { "ru" "{mint}Этот танк получает временный режим бога и увеличивает урон при низком уровне здоровья." @@ -6326,12 +7111,17 @@ "Spitter #79" { - "ru" "{mint}Эта плевальщица получает временный режим бога и увеличивает урон при низком уровне здоровья." + "ru" "{mint}Этот плевальщица получает временный режим бога и увеличивает урон при низком уровне здоровья." } "Witch #79" { - "ru" "{mint}Эта Ведьма получает временный режим бога и увеличивает урон при низком уровне здоровья." + "ru" "{mint}Этот ведьма получает временный режим бога и увеличивает урон при низком уровне здоровья." + } + + "Common #79" + { + "ru" "{mint}Этот обычных получает временный режим бога и увеличивает урон при низком уровне здоровья." } "Tank #80 Name" @@ -6374,6 +7164,11 @@ "ru" "Ведьма-нежить" } + "Common #80 Name" + { + "ru" "Обычных-нежить" + } + "Tank #80" { "ru" "{mint}Этот танк полностью восстанавливает здоровье, когда при смерти." @@ -6406,12 +7201,17 @@ "Spitter #80" { - "ru" "{mint}Эта плевальщица полностью восстанавливает здоровье, когда при смерти." + "ru" "{mint}Этот плевальщица полностью восстанавливает здоровье, когда при смерти." } "Witch #80" { - "ru" "{mint}Эта ведьма полностью восстанавливает здоровье, когда при смерти." + "ru" "{mint}Этот ведьма полностью восстанавливает здоровье, когда при смерти." + } + + "Common #80" + { + "ru" "{mint}Этот обычных полностью восстанавливает здоровье, когда при смерти." } "Tank #81 Name" @@ -6454,6 +7254,11 @@ "ru" "Ведьма-вампир" } + "Common #81 Name" + { + "ru" "Обычных-вампир" + } + "Tank #81" { "ru" "{mint}Этот танк может украсть здоровье у выживших." @@ -6486,12 +7291,17 @@ "Spitter #81" { - "ru" "{mint}Эта плевальщица может украсть здоровье у выживших." + "ru" "{mint}Этот плевальщица может украсть здоровье у выживших." } "Witch #81" { - "ru" "{mint}Эта ведьма может украсть здоровье у выживших." + "ru" "{mint}Этот ведьма может украсть здоровье у выживших." + } + + "Common #81" + { + "ru" "{mint}Этот обычных может украсть здоровье у выживших." } "Tank #82 Name" @@ -6534,6 +7344,11 @@ "ru" "Визуальная Ведьма" } + "Common #82 Name" + { + "ru" "Визуальная Обычных" + } + "Tank #82" { "ru" "{mint}Этот танк может изменять поле зрения у выживших." @@ -6566,12 +7381,17 @@ "Spitter #82" { - "ru" "{mint}Эта плевальщица может изменять поле зрения у выживших." + "ru" "{mint}Этот плевальщица может изменять поле зрения у выживших." } "Witch #82" { - "ru" "{mint}Эта Ведьма может изменять поле зрения у выживших." + "ru" "{mint}Этот ведьма может изменять поле зрения у выживших." + } + + "Common #82" + { + "ru" "{mint}Этот обычных может изменять поле зрения у выживших." } "Tank #83 Name" @@ -6614,6 +7434,11 @@ "ru" "Деформирующаяся Ведьма" } + "Common #83 Name" + { + "ru" "Деформирующаяся Обычных" + } + "Tank #83" { "ru" "{mint}Этот танк может телепортироваться к случайному выжившему." @@ -6646,12 +7471,17 @@ "Spitter #83" { - "ru" "{mint}Эта плевальщица может телепортироваться к случайному выжившему." + "ru" "{mint}Этот плевальщица может телепортироваться к случайному выжившему." } "Witch #83" { - "ru" "{mint}Эта Ведьма может телепортироваться к случайному выжившему." + "ru" "{mint}Этот ведьма может телепортироваться к случайному выжившему." + } + + "Common #83" + { + "ru" "{mint}Этот обычных может телепортироваться к случайному выжившему." } "Tank #84 Name" @@ -6694,6 +7524,11 @@ "ru" "Вихреая Ведьма" } + "Common #84 Name" + { + "ru" "Вихреая Обычных" + } + "Tank #84" { "ru" "{mint}Этот танк может заставить выживших кружиться." @@ -6726,12 +7561,17 @@ "Spitter #84" { - "ru" "{mint}Эта плевальщица может заставить выживших кружиться." + "ru" "{mint}Этот плевальщица может заставить выживших кружиться." } "Witch #84" { - "ru" "{mint}Эта Ведьма может заставить выживших кружиться." + "ru" "{mint}Этот ведьма может заставить выживших кружиться." + } + + "Common #84" + { + "ru" "{mint}Этот обычных может заставить выживших кружиться." } "Tank #85 Name" @@ -6774,6 +7614,11 @@ "ru" "Ведьма-ведьма" } + "Common #85 Name" + { + "ru" "Обычных-ведьма" + } + "Tank #85" { "ru" "{mint}Этот танк может превращать ближайших обычных заражённых в ведьм, а также бросать некоторых в выживших." @@ -6806,12 +7651,17 @@ "Spitter #85" { - "ru" "{mint}Эта плевальщица может превращать ближайших обычных заражённых в ведьм." + "ru" "{mint}Этот плевальщица может превращать ближайших обычных заражённых в ведьм." } "Witch #85" { - "ru" "{mint}Эта Ведьма может превращать ближайших обычных заражённых в ведьм." + "ru" "{mint}Этот ведьма может превращать ближайших обычных заражённых в ведьм." + } + + "Common #85" + { + "ru" "{mint}Этот обычных может превращать ближайших обычных заражённых в ведьм." } "Tank #86 Name" @@ -6854,6 +7704,11 @@ "ru" "Ведьма «Ксифос»" } + "Common #86 Name" + { + "ru" "Обычных «Ксифос»" + } + "Tank #86" { "ru" "{mint}Этот танк может украсть здоровье у выживших и наоборот." @@ -6886,12 +7741,17 @@ "Spitter #86" { - "ru" "{mint}Эта плевальщица может украсть здоровье у выживших и наоборот." + "ru" "{mint}Этот плевальщица может украсть здоровье у выживших и наоборот." } "Witch #86" { - "ru" "{mint}Эта Ведьма может украсть здоровье у выживших и наоборот." + "ru" "{mint}Этот ведьма может украсть здоровье у выживших и наоборот." + } + + "Common #86" + { + "ru" "{mint}Этот обычных может украсть здоровье у выживших и наоборот." } "Tank #87 Name" @@ -6934,6 +7794,11 @@ "ru" "Ведьма-крикун" } + "Common #87 Name" + { + "ru" "Обычных-крикун" + } + "Tank #87" { "ru" "{mint}Этот танк может кричать для победы над выжившими." @@ -6966,12 +7831,17 @@ "Spitter #87" { - "ru" "{mint}Эта плевальщица может кричать для победы над выжившими." + "ru" "{mint}Этот плевальщица может кричать для победы над выжившими." } "Witch #87" { - "ru" "{mint}Эта Ведьма может кричать для победы над выжившими." + "ru" "{mint}Этот ведьма может кричать для победы над выжившими." + } + + "Common #87" + { + "ru" "{mint}Этот обычных может кричать для победы над выжившими." } "Tank #88 Name" @@ -7014,6 +7884,11 @@ "ru" "Ведьма-зомби" } + "Common #88 Name" + { + "ru" "Обычных-зомби" + } + "Tank #88" { "ru" "{mint}Этот танк может создать толпу зомби в пределах области." @@ -7046,12 +7921,17 @@ "Spitter #88" { - "ru" "{mint}Эта плевальщица может создать толпу зомби в пределах области." + "ru" "{mint}Этот плевальщица может создать толпу зомби в пределах области." } "Witch #88" { - "ru" "{mint}Эта Ведьма может создать толпу зомби в пределах области." + "ru" "{mint}Этот ведьма может создать толпу зомби в пределах области." + } + + "Common #88" + { + "ru" "{mint}Этот обычных может создать толпу зомби в пределах области." } "Tank #89 Name" @@ -7094,6 +7974,11 @@ "ru" "Ведьма «Армагеддон»" } + "Common #89 Name" + { + "ru" "Обычных «Армагеддон»" + } + "Tank #89" { "ru" "{mint}Этот танк невосприимчив к урону от взрыва, может притягивать к себе выживших и заражённых, а также может вызывать метеоритные дожди." @@ -7126,12 +8011,17 @@ "Spitter #89" { - "ru" "{mint}Эта плевальщица невосприимчива к урону от взрыва, может притягивать к себе выживших и заражённых, а также может вызывать метеоритные дожди." + "ru" "{mint}Этот плевальщица невосприимчива к урону от взрыва, может притягивать к себе выживших и заражённых, а также может вызывать метеоритные дожди." } "Witch #89" { - "ru" "{mint}Эта Ведьма невосприимчива к урону от взрыва, может притягивать к себе выживших и заражённых, а также может вызывать метеоритные дожди." + "ru" "{mint}Этот ведьма невосприимчива к урону от взрыва, может притягивать к себе выживших и заражённых, а также может вызывать метеоритные дожди." + } + + "Common #89" + { + "ru" "{mint}Этот обычных невосприимчива к урону от взрыва, может притягивать к себе выживших и заражённых, а также может вызывать метеоритные дожди." } "Tank #90 Name" @@ -7174,6 +8064,11 @@ "ru" "Босс-Ведьма" } + "Common #90 Name" + { + "ru" "Босс-Обычных" + } + "Tank #90" { "ru" "{mint}Иммунитет к огню, быстрый, имеет невидимость, обезоруживание выживших, притягивание выживших и изменение их гравитации, периодические прыжки, запуск метеоритных дождей, появление со щитом, поражение выживших, телепортация к выжившим и создание ведьм/зомби." @@ -7214,6 +8109,11 @@ "ru" "{mint}Иммунитет к огню, быстрый, имеет невидимость, обезоруживание выживших, притягивание выживших и изменение их гравитации, периодические прыжки, запуск метеоритных дождей, появление со щитом, поражение выживших, телепортация к выжившим и создание ведьм/зомби." } + "Common #90" + { + "ru" "{mint}Иммунитет к огню, быстрый, имеет невидимость, обезоруживание выживших, притягивание выживших и изменение их гравитации, периодические прыжки, запуск метеоритных дождей, появление со щитом, поражение выживших, телепортация к выжившим и создание ведьм/зомби." + } + "Tank #91 Name" { "ru" "Танк-кобальт" @@ -7254,6 +8154,11 @@ "ru" "Ведьма-кобальт" } + "Common #91 Name" + { + "ru" "Обычных-кобальт" + } + "Tank #91" { "ru" "{mint}Этот танк невосприимчив к урону от огня и может очень быстро бегать." @@ -7286,12 +8191,17 @@ "Spitter #91" { - "ru" "{mint}Эта плевальщица невосприимчива к урону от огня и может очень быстро бегать." + "ru" "{mint}Этот плевальщица невосприимчива к урону от огня и может очень быстро бегать." } "Witch #91" { - "ru" "{mint}Эта Ведьма невосприимчива к урону от огня и может очень быстро бегать." + "ru" "{mint}Этот ведьма невосприимчива к урону от огня и может очень быстро бегать." + } + + "Common #91" + { + "ru" "{mint}Этот обычных невосприимчива к урону от огня и может очень быстро бегать." } "Tank #92 Name" @@ -7334,6 +8244,11 @@ "ru" "Отвлекающая Ведьма" } + "Common #92 Name" + { + "ru" "Отвлекающая Обычных" + } + "Tank #92" { "ru" "{mint}Этот танк может периодически прыгать, заставлять выживших бесконтрольно прыгать и телепортироваться к выжившим." @@ -7366,12 +8281,17 @@ "Spitter #92" { - "ru" "{mint}Эта плевальщица может периодически прыгать, заставлять выживших бесконтрольно прыгать и телепортироваться к выжившим." + "ru" "{mint}Этот плевальщица может периодически прыгать, заставлять выживших бесконтрольно прыгать и телепортироваться к выжившим." } "Witch #92" { - "ru" "{mint}Эта Ведьма может периодически прыгать, заставлять выживших бесконтрольно прыгать и телепортироваться к выжившим." + "ru" "{mint}Этот ведьма может периодически прыгать, заставлять выживших бесконтрольно прыгать и телепортироваться к выжившим." + } + + "Common #92" + { + "ru" "{mint}Этот обычных может периодически прыгать, заставлять выживших бесконтрольно прыгать и телепортироваться к выжившим." } "Tank #93 Name" @@ -7414,6 +8334,11 @@ "ru" "Ведьма ответной реакции" } + "Common #93 Name" + { + "ru" "Обычных ответной реакции" + } + "Tank #93" { "ru" "{mint}Этот танк отталкивает выживших." @@ -7446,12 +8371,17 @@ "Spitter #93" { - "ru" "{mint}Эта плевальщица отталкивает выживших." + "ru" "{mint}Этот плевальщица отталкивает выживших." } "Witch #93" { - "ru" "{mint}Эта Ведьма отталкивает выживших." + "ru" "{mint}Этот ведьма отталкивает выживших." + } + + "Common #93" + { + "ru" "{mint}Этот обычных отталкивает выживших." } "Tank #94 Name" @@ -7494,6 +8424,11 @@ "ru" "Ведьма-Флэш" } + "Common #94 Name" + { + "ru" "Обычных-Флэш" + } + "Tank #94" { "ru" "{mint}Этот танк может бегать очень быстро, бросать электричество в выживших и замедлять время вокруг себя, при этом имея временную неуязвимость." @@ -7526,12 +8461,17 @@ "Spitter #94" { - "ru" "{mint}Эта плевальщица может бегать очень быстро, замедлять время вокруг себя, при этом имея временную неуязвимость." + "ru" "{mint}Этот плевальщица может бегать очень быстро, замедлять время вокруг себя, при этом имея временную неуязвимость." } "Witch #94" { - "ru" "{mint}Эта Ведьма может бегать очень быстро, замедлять время вокруг себя, при этом имея временную неуязвимость." + "ru" "{mint}Этот ведьма может бегать очень быстро, замедлять время вокруг себя, при этом имея временную неуязвимость." + } + + "Common #94" + { + "ru" "{mint}Этот обычных может бегать очень быстро, замедлять время вокруг себя, при этом имея временную неуязвимость." } "Tank #95 Name" @@ -7574,6 +8514,11 @@ "ru" "Ведьма-голиаф" } + "Common #95 Name" + { + "ru" "Обычных-голиаф" + } + "Tank #95" { "ru" "{mint}Иммунитет к огню, передвигается медленно, даёт выжившим временное здоровье, поглощает здоровье находящихся поблизости заражённых, появляется со щитом и поражает выживших." @@ -7614,6 +8559,11 @@ "ru" "{mint}Иммунитет к огню, передвигается медленно, даёт выжившим временное здоровье, поглощает здоровье находящихся поблизости заражённых, появляется со щитом и поражает выживших." } + "Common #95" + { + "ru" "{mint}Иммунитет к огню, передвигается медленно, даёт выжившим временное здоровье, поглощает здоровье находящихся поблизости заражённых, появляется со щитом и поражает выживших." + } + "Tank #96 Name" { "ru" "Галлюцинационный Танк" @@ -7654,6 +8604,11 @@ "ru" "Галлюцинационная Ведьма" } + "Common #96 Name" + { + "ru" "Галлюцинационная Обычных" + } + "Tank #96" { "ru" "{mint}Иммунитет к огню, маскируется и телепортируется к выжившим." @@ -7694,6 +8649,11 @@ "ru" "{mint}Иммунитет к огню, маскируется и телепортируется к выжившим." } + "Common #96" + { + "ru" "{mint}Иммунитет к огню, маскируется и телепортируется к выжившим." + } + "Tank #97 Name" { "ru" "Мемный Танк" @@ -7734,6 +8694,11 @@ "ru" "Мемная Ведьма" } + "Common #97 Name" + { + "ru" "Мемная Обычных" + } + "Tank #97" { "ru" "{mint}Иммунитет к огню, поглощает урон, быстро бегает, маскируется, притягивает выживших и меняет их гравитацию, высоко прыгает, запускает метеоритные дожди, поражает выживших, спамит камнями, телепортируется к выжившим и создаёт ведьм/зомби." @@ -7774,6 +8739,11 @@ "ru" "{mint}Иммунитет к огню, поглощает урон, быстро бегает, маскируется, притягивает выживших и меняет их гравитацию, высоко прыгает, запускает метеоритные дожди, поражает выживших, спамит камнями, телепортируется к выжившим и создаёт ведьм/зомби." } + "Common #97" + { + "ru" "{mint}Иммунитет к огню, поглощает урон, быстро бегает, маскируется, притягивает выживших и меняет их гравитацию, высоко прыгает, запускает метеоритные дожди, поражает выживших, спамит камнями, телепортируется к выжившим и создаёт ведьм/зомби." + } + "Tank #98 Name" { "ru" "Танк-мираж" @@ -7814,6 +8784,11 @@ "ru" "Ведьма-мираж" } + "Common #98 Name" + { + "ru" "Обычных-мираж" + } + "Tank #98" { "ru" "{mint}Этот танк невосприимчив к урону от огня, быстро бегает и телепортируется к выжившим." @@ -7846,12 +8821,17 @@ "Spitter #98" { - "ru" "{mint}Эта плевальщица невосприимчива к урону от огня, быстро бегает и телепортируется к выжившим." + "ru" "{mint}Этот плевальщица невосприимчива к урону от огня, быстро бегает и телепортируется к выжившим." } "Witch #98" { - "ru" "{mint}Эта Ведьма невосприимчива к урону от огня, быстро бегает и телепортируется к выжившим." + "ru" "{mint}Этот ведьма невосприимчива к урону от огня, быстро бегает и телепортируется к выжившим." + } + + "Common #98" + { + "ru" "{mint}Этот обычных невосприимчива к урону от огня, быстро бегает и телепортируется к выжившим." } "Tank #99 Name" @@ -7894,6 +8874,11 @@ "ru" "Ведьма-полтергейст" } + "Common #99 Name" + { + "ru" "Обычных-полтергейст" + } + "Tank #99" { "ru" "{mint}Этот танк невосприимчив к урону от огня, быстро бегает, маскируется и телепортируется к выжившим." @@ -7926,12 +8911,17 @@ "Spitter #99" { - "ru" "{mint}Эта плевальщица невосприимчива к урону от огня, быстро бегает, маскируется и телепортируется к выжившим." + "ru" "{mint}Этот плевальщица невосприимчива к урону от огня, быстро бегает, маскируется и телепортируется к выжившим." } "Witch #99" { - "ru" "{mint}Эта Ведьма невосприимчива к урону от огня, быстро бегает, маскируется и телепортируется к выжившим." + "ru" "{mint}Этот ведьма невосприимчива к урону от огня, быстро бегает, маскируется и телепортируется к выжившим." + } + + "Common #99" + { + "ru" "{mint}Этот обычных невосприимчива к урону от огня, быстро бегает, маскируется и телепортируется к выжившим." } "Tank #100 Name" @@ -7974,6 +8964,11 @@ "ru" "«ПсихоВедьма»" } + "Common #100 Name" + { + "ru" "«ПсихоОбычных»" + } + "Tank #100" { "ru" "{mint}Этот танк может дать выжившим временное здоровье, поглотить здоровье ближайших заражённых, запустить метеоритный дождь, появиться со щитом и телепортироваться к выжившим." @@ -8006,12 +9001,17 @@ "Spitter #100" { - "ru" "{mint}Эта плевальщица может дать выжившим временное здоровье, поглотить здоровье ближайших заражённых, запустить метеоритный дождь, появиться со щитом и телепортироваться к выжившим." + "ru" "{mint}Этот плевальщица может дать выжившим временное здоровье, поглотить здоровье ближайших заражённых, запустить метеоритный дождь, появиться со щитом и телепортироваться к выжившим." } "Witch #100" { - "ru" "{mint}Эта Ведьма может дать выжившим временное здоровье, поглотить здоровье ближайших заражённых, запустить метеоритный дождь, появиться со щитом и телепортироваться к выжившим." + "ru" "{mint}Этот ведьма может дать выжившим временное здоровье, поглотить здоровье ближайших заражённых, запустить метеоритный дождь, появиться со щитом и телепортироваться к выжившим." + } + + "Common #100" + { + "ru" "{mint}Этот обычных может дать выжившим временное здоровье, поглотить здоровье ближайших заражённых, запустить метеоритный дождь, появиться со щитом и телепортироваться к выжившим." } "Tank #101 Name" @@ -8054,6 +9054,11 @@ "ru" "Ведьма обратной вспышки" } + "Common #101 Name" + { + "ru" "Обычных обратной вспышки" + } + "Tank #101" { "ru" "{mint}Этот танк невосприимчив к урону от огня, очень быстро бегает и телепортируется к выжившим." @@ -8086,12 +9091,17 @@ "Spitter #101" { - "ru" "{mint}Эта плевальщица невосприимчива к урону от огня, очень быстро бегает и телепортируется к выжившим." + "ru" "{mint}Этот плевальщица невосприимчива к урону от огня, очень быстро бегает и телепортируется к выжившим." } "Witch #101" { - "ru" "{mint}Эта Ведьма невосприимчива к урону от огня, очень быстро бегает и телепортируется к выжившим." + "ru" "{mint}Этот ведьма невосприимчива к урону от огня, очень быстро бегает и телепортируется к выжившим." + } + + "Common #101" + { + "ru" "{mint}Этот обычных невосприимчива к урону от огня, очень быстро бегает и телепортируется к выжившим." } "Tank #102 Name" @@ -8134,6 +9144,11 @@ "ru" "Ведьма-породитель" } + "Common #102 Name" + { + "ru" "Обычных-породитель" + } + "Tank #102" { "ru" "{mint}Этот танк создаёт зомби за облаками дыма в пределах области." @@ -8166,12 +9181,17 @@ "Spitter #102" { - "ru" "{mint}Эта плевальщица создаёт зомби за облаками дыма в пределах области." + "ru" "{mint}Этот плевальщица создаёт зомби за облаками дыма в пределах области." } "Witch #102" { - "ru" "{mint}Эта Ведьма создаёт зомби за облаками дыма в пределах области." + "ru" "{mint}Этот ведьма создаёт зомби за облаками дыма в пределах области." + } + + "Common #102" + { + "ru" "{mint}Этот обычных создаёт зомби за облаками дыма в пределах области." } "Tank #103 Name" @@ -8214,6 +9234,11 @@ "ru" "Оптическая Ведьма" } + "Common #103 Name" + { + "ru" "Оптическая Обычных" + } + "Tank #103" { "ru" "{mint}Этот танк невосприимчив к урону от огня, очень быстро бегает и телепортируется к выжившим." @@ -8246,12 +9271,17 @@ "Spitter #103" { - "ru" "{mint}Эта плевальщица невосприимчива к урону от огня, очень быстро бегает и телепортируется к выжившим." + "ru" "{mint}Этот плевальщица невосприимчива к урону от огня, очень быстро бегает и телепортируется к выжившим." } "Witch #103" { - "ru" "{mint}Эта Ведьма невосприимчива к урону от огня, очень быстро бегает и телепортируется к выжившим." + "ru" "{mint}Этот ведьма невосприимчива к урону от огня, очень быстро бегает и телепортируется к выжившим." + } + + "Common #103" + { + "ru" "{mint}Этот обычных невосприимчива к урону от огня, очень быстро бегает и телепортируется к выжившим." } "Tank #104 Name" @@ -8294,6 +9324,11 @@ "ru" "Ведьма-ловушка" } + "Common #104 Name" + { + "ru" "Обычных-ловушка" + } + "Tank #104" { "ru" "{mint}Этот танк не такой, каким кажется." @@ -8326,12 +9361,17 @@ "Spitter #104" { - "ru" "{mint}Эта плевальщица не такая, какая кажется." + "ru" "{mint}Этот плевальщица не такая, какая кажется." } "Witch #104" { - "ru" "{mint}Эта Ведьма не такая, какая кажется." + "ru" "{mint}Этот ведьма не такая, какая кажется." + } + + "Common #104" + { + "ru" "{mint}Этот обычных не такая, какая кажется." } "Tank #105 Name" @@ -8374,6 +9414,11 @@ "ru" "Ведьма страха" } + "Common #105 Name" + { + "ru" "Обычных страха" + } + "Tank #105" { "ru" "{mint}Этот танк может частично ослепить выживших." @@ -8406,12 +9451,17 @@ "Spitter #105" { - "ru" "{mint}Эта плевальщица может частично ослепить выживших." + "ru" "{mint}Этот плевальщица может частично ослепить выживших." } "Witch #105" { - "ru" "{mint}Эта Ведьма может частично ослепить выживших." + "ru" "{mint}Этот ведьма может частично ослепить выживших." + } + + "Common #105" + { + "ru" "{mint}Этот обычных может частично ослепить выживших." } "Tank #106 Name" @@ -8454,6 +9504,11 @@ "ru" "Бешеный Ведьма" } + "Common #106 Name" + { + "ru" "Бешеный Обычных" + } + "Tank #106" { "ru" "{mint}Этот танк может частично использовать одурманивающие эффекты на выживших и периодически вредить выжившим." @@ -8486,12 +9541,17 @@ "Spitter #106" { - "ru" "{mint}Эта плевальщица может частично использовать одурманивающие эффекты на выживших и периодически вредить выжившим." + "ru" "{mint}Этот плевальщица может частично использовать одурманивающие эффекты на выживших и периодически вредить выжившим." } "Witch #106" { - "ru" "{mint}Эта Ведьма может частично использовать одурманивающие эффекты на выживших и периодически вредить выжившим." + "ru" "{mint}Этот ведьма может частично использовать одурманивающие эффекты на выживших и периодически вредить выжившим." + } + + "Common #106" + { + "ru" "{mint}Этот обычных может частично использовать одурманивающие эффекты на выживших и периодически вредить выжившим." } "Tank #107 Name" @@ -8534,6 +9594,11 @@ "ru" "Ведьма-тремор" } + "Common #107 Name" + { + "ru" "Обычных-тремор" + } + "Tank #107" { "ru" "{mint}Этот танк может швырять камни в выживших." @@ -8566,12 +9631,17 @@ "Spitter #107" { - "ru" "{mint}Эта плевальщица может швырять камни в выживших." + "ru" "{mint}Этот плевальщица может швырять камни в выживших." } "Witch #107" { - "ru" "{mint}Эта Ведьма может швырять камни в выживших." + "ru" "{mint}Этот ведьма может швырять камни в выживших." + } + + "Common #107" + { + "ru" "{mint}Этот обычных может швырять камни в выживших." } "Tank #108 Name" @@ -8614,6 +9684,11 @@ "ru" "Ведьма «Psyk0tik»" } + "Common #108 Name" + { + "ru" "Обычных «Psyk0tik»" + } + "Tank #108" { "ru" "{mint}Этот танк наносит дополнительный урон и очень быстро бегает, маскируясь и замедляя выживших." @@ -8646,12 +9721,17 @@ "Spitter #108" { - "ru" "{mint}Эта плевальщица наносит дополнительный урон и очень быстро бегает, маскируясь и замедляя выживших." + "ru" "{mint}Этот плевальщица наносит дополнительный урон и очень быстро бегает, маскируясь и замедляя выживших." } "Witch #108" { - "ru" "{mint}Эта Ведьма наносит дополнительный урон и очень быстро бегает, маскируясь и замедляя выживших." + "ru" "{mint}Этот ведьма наносит дополнительный урон и очень быстро бегает, маскируясь и замедляя выживших." + } + + "Common #108" + { + "ru" "{mint}Этот обычных наносит дополнительный урон и очень быстро бегает, маскируясь и замедляя выживших." } "Tank #109 Name" @@ -8694,6 +9774,11 @@ "ru" "Ведьма «Апокалипсис»" } + "Common #109 Name" + { + "ru" "Обычных «Апокалипсис»" + } + "Tank #109" { "ru" "{mint}Этот танк невосприимчив к урону от огня, бегает немного быстрее, запускает метеоритные дожди, панические события и камнепад." @@ -8726,12 +9811,17 @@ "Spitter #109" { - "ru" "{mint}Эта плевальщица невосприимчива к урону от огня, бегает немного быстрее, запускает метеоритные дожди, панические события и камнепад." + "ru" "{mint}Этот плевальщица невосприимчива к урону от огня, бегает немного быстрее, запускает метеоритные дожди, панические события и камнепад." } "Witch #109" { - "ru" "{mint}Эта Ведьма невосприимчива к урону от огня, бегает немного быстрее, запускает метеоритные дожди, панические события и камнепад." + "ru" "{mint}Этот ведьма невосприимчива к урону от огня, бегает немного быстрее, запускает метеоритные дожди, панические события и камнепад." + } + + "Common #109" + { + "ru" "{mint}Этот обычных невосприимчива к урону от огня, бегает немного быстрее, запускает метеоритные дожди, панические события и камнепад." } "Tank #110 Name" @@ -8774,6 +9864,11 @@ "ru" "Ведьма «Дарт Вейдер»" } + "Common #110 Name" + { + "ru" "Обычных «Дарт Вейдер»" + } + "Tank #110" { "ru" "{mint}Это Дарт Вейдер... И он... Танк-мутант с силой!" @@ -8814,6 +9909,11 @@ "ru" "{mint}Это Дарт Вейдер... И она... Ведьма-мутант с силой!" } + "Common #110" + { + "ru" "{mint}Это Дарт Вейдер... И она... Обычных-мутант с силой!" + } + "Tank #111 Name" { "ru" "Одурманивающий танк-заразитель" @@ -8854,6 +9954,11 @@ "ru" "Одурманивающая Ведьма-заразитель" } + "Common #111 Name" + { + "ru" "Одурманивающая Обычных-заразитель" + } + "Tank #111" { "ru" "{mint}У этого Танк заразная одурманивающая способность." @@ -8894,6 +9999,11 @@ "ru" "{mint}У этой Ведьмы заразная одурманивающая способность." } + "Common #111" + { + "ru" "{mint}У этой Ведьмы заразная одурманивающая способность." + } + "Tank #112 Name" { "ru" "Танк Божьей Скорости" @@ -8934,6 +10044,11 @@ "ru" "Ведьма Божьей Скорости" } + "Common #112 Name" + { + "ru" "Обычных Божьей Скорости" + } + "Tank #112" { "ru" "{mint}Этот танк невосприимчив к урону от огня, очень быстро бегает и телепортируется к выжившим." @@ -8966,12 +10081,17 @@ "Spitter #112" { - "ru" "{mint}Эта плевальщица невосприимчива к урону от огня, очень быстро бегает и телепортируется к выжившим." + "ru" "{mint}Этот плевальщица невосприимчива к урону от огня, очень быстро бегает и телепортируется к выжившим." } "Witch #112" { - "ru" "{mint}Эта Ведьма невосприимчива к урону от огня, очень быстро бегает и телепортируется к выжившим." + "ru" "{mint}Этот ведьма невосприимчива к урону от огня, очень быстро бегает и телепортируется к выжившим." + } + + "Common #112" + { + "ru" "{mint}Этот обычных невосприимчива к урону от огня, очень быстро бегает и телепортируется к выжившим." } "Tank #113 Name" @@ -9014,6 +10134,11 @@ "ru" "Ведьма «Мрачный жнец»" } + "Common #113 Name" + { + "ru" "Обычных «Мрачный жнец»" + } + "Tank #113" { "ru" "{mint}Этот танк бегает немного быстрее, закапывает выживших, маскируется и телепортируется к выжившим." @@ -9046,12 +10171,17 @@ "Spitter #113" { - "ru" "{mint}Эта плевальщица бегает немного быстрее, закапывает выживших, маскируется и телепортируется к выжившим." + "ru" "{mint}Этот плевальщица бегает немного быстрее, закапывает выживших, маскируется и телепортируется к выжившим." } "Witch #113" { - "ru" "{mint}Эта Ведьма бегает немного быстрее, закапывает выживших, маскируется и телепортируется к выжившим." + "ru" "{mint}Этот ведьма бегает немного быстрее, закапывает выживших, маскируется и телепортируется к выжившим." + } + + "Common #113" + { + "ru" "{mint}Этот обычных бегает немного быстрее, закапывает выживших, маскируется и телепортируется к выжившим." } "Tank #114 Name" @@ -9094,6 +10224,11 @@ "ru" "Ведьма орды" } + "Common #114 Name" + { + "ru" "Обычных орды" + } + "Tank #114" { "ru" "{mint}Этот танк может вызывать орду и блевать на выживших, чтобы задержать их." @@ -9126,12 +10261,17 @@ "Spitter #114" { - "ru" "{mint}Эта плевальщица может вызывать орду и блевать на выживших, чтобы задержать их." + "ru" "{mint}Этот плевальщица может вызывать орду и блевать на выживших, чтобы задержать их." } "Witch #114" { - "ru" "{mint}Эта Ведьма может вызывать орду и блевать на выживших, чтобы задержать их." + "ru" "{mint}Этот ведьма может вызывать орду и блевать на выживших, чтобы задержать их." + } + + "Common #114" + { + "ru" "{mint}Этот обычных может вызывать орду и блевать на выживших, чтобы задержать их." } "Tank #115 Name" @@ -9174,6 +10314,11 @@ "ru" "Ведьма «Халк»" } + "Common #115 Name" + { + "ru" "Обычных «Халк»" + } + "Tank #115" { "ru" "{mint}Встречайте невероятного Халка! Этот Танк обладает большинством способностей Халка!" @@ -9211,7 +10356,12 @@ "Witch #115" { - "ru" "{mint}Встречайте невероятного Халка! Эта Ведьма обладает большинством способностей Халка!" + "ru" "{mint}Встречайте невероятного Халка! Этот ведьма обладает большинством способностей Халка!" + } + + "Common #115" + { + "ru" "{mint}Встречайте невероятного Халка! Этот обычных обладает большинством способностей Халка!" } "Tank #116 Name" @@ -9254,6 +10404,11 @@ "ru" "Ведьма-ниндзя" } + "Common #116 Name" + { + "ru" "Обычных-ниндзя" + } + "Tank #116" { "ru" "{mint}Этот танк может телепортироваться, бесшумно перемещаться и маскироваться. Будь очень осторожны!" @@ -9286,12 +10441,17 @@ "Spitter #116" { - "ru" "{mint}Эта плевальщица может телепортироваться, бесшумно перемещаться и маскироваться. Будь очень осторожны!" + "ru" "{mint}Этот плевальщица может телепортироваться, бесшумно перемещаться и маскироваться. Будь очень осторожны!" } "Witch #116" { - "ru" "{mint}Эта Ведьма может телепортироваться, бесшумно перемещаться и маскироваться. Будь очень осторожны!" + "ru" "{mint}Этот ведьма может телепортироваться, бесшумно перемещаться и маскироваться. Будь очень осторожны!" + } + + "Common #116" + { + "ru" "{mint}Этот обычных может телепортироваться, бесшумно перемещаться и маскироваться. Будь очень осторожны!" } "Tank #117 Name" @@ -9334,6 +10494,11 @@ "ru" "Ведьма дзен" } + "Common #117 Name" + { + "ru" "Обычных дзен" + } + "Tank #117" { "ru" "{mint}Этот танк слишком занят медитацией, чтобы заботиться о тебе." @@ -9366,12 +10531,17 @@ "Spitter #117" { - "ru" "{mint}Эта плевальщица слишком занята медитацией, чтобы заботиться о тебе." + "ru" "{mint}Этот плевальщица слишком занята медитацией, чтобы заботиться о тебе." } "Witch #117" { - "ru" "{mint}Эта Ведьма слишком занята медитацией, чтобы заботиться о тебе." + "ru" "{mint}Этот ведьма слишком занята медитацией, чтобы заботиться о тебе." + } + + "Common #117" + { + "ru" "{mint}Этот обычных слишком занята медитацией, чтобы заботиться о тебе." } "Tank #118 Name" @@ -9414,6 +10584,11 @@ "ru" "Босс (1-ая форма)" } + "Common #118 Name" + { + "ru" "Босс (1-ая форма)" + } + "Tank #118" { "ru" "{mint}Этот танк бросает взрывоопасные камни и периодически телепортируется к выжившим." @@ -9446,12 +10621,17 @@ "Spitter #118" { - "ru" "{mint}Эта плевальщица периодически телепортируется к выжившим." + "ru" "{mint}Этот плевальщица периодически телепортируется к выжившим." } "Witch #118" { - "ru" "{mint}Эта Ведьма периодически телепортируется к выжившим." + "ru" "{mint}Этот ведьма периодически телепортируется к выжившим." + } + + "Common #118" + { + "ru" "{mint}Этот обычных периодически телепортируется к выжившим." } "Tank #119 Name" @@ -9494,6 +10674,11 @@ "ru" "Стальная Повелительница (2-ая форма)" } + "Common #119 Name" + { + "ru" "Стальная Повелительница (2-ая форма)" + } + "Tank #119" { "ru" "{mint}Этот танк бегает немного быстрее, невосприимчив к рукопашному бою, немного сильнее обычного, бросает взрывоопасные камни, может изменять гравитацию выживших и периодически телепортируется к выжившим." @@ -9526,12 +10711,17 @@ "Spitter #119" { - "ru" "{mint}Эта плевальщица бегает немного быстрее, невосприимчива к рукопашному бою, немного сильнее обычного, может изменять гравитацию выживших и периодически телепортируется к выжившим." + "ru" "{mint}Этот плевальщица бегает немного быстрее, невосприимчива к рукопашному бою, немного сильнее обычного, может изменять гравитацию выживших и периодически телепортируется к выжившим." } "Witch #119" { - "ru" "{mint}Эта Ведьма бегает немного быстрее, невосприимчива к рукопашному бою, немного сильнее обычного, может изменять гравитацию выживших и периодически телепортируется к выжившим." + "ru" "{mint}Этот ведьма бегает немного быстрее, невосприимчива к рукопашному бою, немного сильнее обычного, может изменять гравитацию выживших и периодически телепортируется к выжившим." + } + + "Common #119" + { + "ru" "{mint}Этот обычных бегает немного быстрее, невосприимчива к рукопашному бою, немного сильнее обычного, может изменять гравитацию выживших и периодически телепортируется к выжившим." } "Tank #120 Name" @@ -9574,6 +10764,11 @@ "ru" "Ночной Сталкер (3-я форма)" } + "Common #120 Name" + { + "ru" "Ночной Сталкер (3-я форма)" + } + "Tank #120" { "ru" "{mint}Этот танк бегает немного быстрее, невосприимчив к огню, немного слабее обычного, бросает взрывоопасные камни, может ослепить выживших, может стать невидимым и периодически телепортируется к выжившим." @@ -9606,12 +10801,17 @@ "Spitter #120" { - "ru" "{mint}Эта плевальщица бегает немного быстрее, невосприимчива к огню, немного слабее обычного, может ослепить выживших, может стать невидимым и периодически телепортируется к выжившим." + "ru" "{mint}Этот плевальщица бегает немного быстрее, невосприимчива к огню, немного слабее обычного, может ослепить выживших, может стать невидимым и периодически телепортируется к выжившим." } "Witch #120" { - "ru" "{mint}Эта Ведьма бегает немного быстрее, невосприимчива к огню, немного слабее обычного, может ослепить выживших, может стать невидимым и периодически телепортируется к выжившим." + "ru" "{mint}Этот ведьма бегает немного быстрее, невосприимчива к огню, немного слабее обычного, может ослепить выживших, может стать невидимым и периодически телепортируется к выжившим." + } + + "Common #120" + { + "ru" "{mint}Этот обычных бегает немного быстрее, невосприимчива к огню, немного слабее обычного, может ослепить выживших, может стать невидимым и периодически телепортируется к выжившим." } "Tank #121 Name" @@ -9654,6 +10854,11 @@ "ru" "Дух огня (4-ая форма)" } + "Common #121 Name" + { + "ru" "Дух огня (4-ая форма)" + } + "Tank #121" { "ru" "{mint}Этот танк бегает немного быстрее, невосприимчив к огню, сильнее обычного, бросает взрывоопасные камни, создаёт огонь, даёт выжившим временное здоровье, периодически прыгает и периодически телепортируется к выжившим." @@ -9686,12 +10891,17 @@ "Spitter #121" { - "ru" "{mint}Эта плевальщица бегает немного быстрее, невосприимчива к огню, сильнее обычного, создаёт огонь, даёт выжившим временное здоровье, периодически прыгает и периодически телепортируется к выжившим." + "ru" "{mint}Этот плевальщица бегает немного быстрее, невосприимчива к огню, сильнее обычного, создаёт огонь, даёт выжившим временное здоровье, периодически прыгает и периодически телепортируется к выжившим." } "Witch #121" { - "ru" "{mint}Эта Ведьма бегает немного быстрее, невосприимчива к огню, сильнее обычного, создаёт огонь, даёт выжившим временное здоровье, периодически прыгает и периодически телепортируется к выжившим." + "ru" "{mint}Этот ведьма бегает немного быстрее, невосприимчива к огню, сильнее обычного, создаёт огонь, даёт выжившим временное здоровье, периодически прыгает и периодически телепортируется к выжившим." + } + + "Common #121" + { + "ru" "{mint}Этот обычных бегает немного быстрее, невосприимчива к огню, сильнее обычного, создаёт огонь, даёт выжившим временное здоровье, периодически прыгает и периодически телепортируется к выжившим." } "Tank #122 Name" @@ -9734,6 +10944,11 @@ "ru" "Случайный Ведьма" } + "Common #122 Name" + { + "ru" "Случайный Обычных" + } + "Tank #122" { "ru" "{mint}Этот танк случайным образом переключается на разные типы танков-мутантов и наносит повышенный урон. Будьте осторожны..." @@ -9766,12 +10981,17 @@ "Spitter #122" { - "ru" "{mint}Эта плевальщица случайным образом переключается на разные типы плевальщиц-мутантов и наносит повышенный урон. Будьте осторожны..." + "ru" "{mint}Этот плевальщица случайным образом переключается на разные типы плевальщиц-мутантов и наносит повышенный урон. Будьте осторожны..." } "Witch #122" { - "ru" "{mint}Эта Ведьма случайным образом переключается на разные типы Ведьма-мутантов и наносит повышенный урон. Будьте осторожны..." + "ru" "{mint}Этот ведьма случайным образом переключается на разные типы ведьма-мутантов и наносит повышенный урон. Будьте осторожны..." + } + + "Common #122" + { + "ru" "{mint}Этот обычных случайным образом переключается на разные типы обычных-мутантов и наносит повышенный урон. Будьте осторожны..." } "Tank #123 Name" @@ -9814,6 +11034,11 @@ "ru" "Ведьма-оборотень" } + "Common #123 Name" + { + "ru" "Обычных-оборотень" + } + "Tank #123" { "ru" "{mint}Этот танк может превращаться в разные типы танков-мутантов. Не недооценивайте это..." @@ -9846,12 +11071,17 @@ "Spitter #123" { - "ru" "{mint}Эта плевальщица может превращаться в разные типы плевальщиц-мутантов. Не недооценивайте это..." + "ru" "{mint}Этот плевальщица может превращаться в разные типы плевальщиц-мутантов. Не недооценивайте это..." } "Witch #123" { - "ru" "{mint}Эта Ведьма может превращаться в разные типы Ведьмаов-мутантов. Не недооценивайте это..." + "ru" "{mint}Этот ведьма может превращаться в разные типы ведьмаов-мутантов. Не недооценивайте это..." + } + + "Common #123" + { + "ru" "{mint}Этот обычных может превращаться в разные типы обычных-мутантов. Не недооценивайте это..." } "Tank #124 Name" @@ -9894,6 +11124,11 @@ "ru" "Светошумовая Ведьма" } + "Common #124 Name" + { + "ru" "Светошумовая Обычных" + } + "Tank #124" { "ru" "{mint}Этот танк вызывает вспышки, которые ослепляют его самого и всех, кто пострадал от его атак." @@ -9926,12 +11161,17 @@ "Spitter #124" { - "ru" "{mint}Эта плевальщица вызывает вспышки, которые ослепляют его самого и всех, кто пострадал от его атак." + "ru" "{mint}Этот плевальщица вызывает вспышки, которые ослепляют его самого и всех, кто пострадал от его атак." } "Witch #124" { - "ru" "{mint}Эта Ведьма вызывает вспышки, которые ослепляют его самого и всех, кто пострадал от его атак." + "ru" "{mint}Этот ведьма вызывает вспышки, которые ослепляют его самого и всех, кто пострадал от его атак." + } + + "Common #124" + { + "ru" "{mint}Этот обычных вызывает вспышки, которые ослепляют его самого и всех, кто пострадал от его атак." } "Tank #125 Name" @@ -9974,6 +11214,11 @@ "ru" "Ведьма-Грязевик" } + "Common #125 Name" + { + "ru" "Обычных-Грязевик" + } + "Tank #125" { "ru" "{mint}Этот танк так же раздражает, как и любой Грязевик." @@ -10006,12 +11251,17 @@ "Spitter #125" { - "ru" "{mint}Эта плевальщица так же раздражает, как и любой Грязевик." + "ru" "{mint}Этот плевальщица так же раздражает, как и любой Грязевик." } "Witch #125" { - "ru" "{mint}Эта Ведьма так же раздражает, как и любой Грязевик." + "ru" "{mint}Этот ведьма так же раздражает, как и любой Грязевик." + } + + "Common #125" + { + "ru" "{mint}Этот обычных так же раздражает, как и любой Грязевик." } "Tank #126 Name" @@ -10054,6 +11304,11 @@ "ru" "Ведьма конца игры" } + "Common #126 Name" + { + "ru" "Обычных конца игры" + } + "Tank #126" { "ru" "{mint}Прощайте, все!" @@ -10094,6 +11349,11 @@ "ru" "{mint}Прощайте, все!" } + "Common #126" + { + "ru" "{mint}Прощайте, все!" + } + "Tank #127 Name" { "ru" "Игривый Танк" @@ -10134,124 +11394,1764 @@ "ru" "Игривая Ведьма" } + "Common #127 Name" + { + "ru" "Игривая Обычных" + } + "Tank #127" { - "ru" "{mint}Этот танк не наносит никакого урона. Он просто хочет поиграть!" + "ru" "{mint}Этот танк не наносит никакого урона. Он просто хочет поиграть!" + } + + "Boomer #127" + { + "ru" "{mint}Этот толстяк не наносит никакого урона. Он просто хочет поиграть!" + } + + "Charger #127" + { + "ru" "{mint}Этот громила не наносит никакого урона. Он просто хочет поиграть!" + } + + "Hunter #127" + { + "ru" "{mint}Этот охотник не наносит никакого урона. Он просто хочет поиграть!" + } + + "Jockey #127" + { + "ru" "{mint}Этот жокей не наносит никакого урона. Он просто хочет поиграть!" + } + + "Smoker #127" + { + "ru" "{mint}Этот курильщик не наносит никакого урона. Он просто хочет поиграть!" + } + + "Spitter #127" + { + "ru" "{mint}Этот плевальщица не наносит никакого урона. Она просто хочет поиграть!" + } + + "Witch #127" + { + "ru" "{mint}Этот ведьма не наносит никакого урона. Она просто хочет поиграть!" + } + + "Common #127" + { + "ru" "{mint}Этот обычных не наносит никакого урона. Она просто хочет поиграть!" + } + + "Tank #128 Name" + { + "ru" "Раздражающий Танк" + } + + "Boomer #128 Name" + { + "ru" "Раздражающий Толстяк" + } + + "Charger #128 Name" + { + "ru" "Раздражающий Громила" + } + + "Hunter #128 Name" + { + "ru" "Раздражающий Охотник" + } + + "Jockey #128 Name" + { + "ru" "Раздражающий Жокей" + } + + "Smoker #128 Name" + { + "ru" "Раздражающий Курильщик" + } + + "Spitter #128 Name" + { + "ru" "Раздражающая Плевальщица" + } + + "Witch #128 Name" + { + "ru" "Раздражающая Ведьма" + } + + "Common #128 Name" + { + "ru" "Раздражающая Обычных" + } + + "Tank #128" + { + "ru" "{mint}Этот танк никуда не денется." + } + + "Boomer #128" + { + "ru" "{mint}Этот толстяк никуда не денется." + } + + "Charger #128" + { + "ru" "{mint}Этот громила никуда не денется." + } + + "Hunter #128" + { + "ru" "{mint}Этот охотник никуда не денется." + } + + "Jockey #128" + { + "ru" "{mint}Этот жокей никуда не денется." + } + + "Smoker #128" + { + "ru" "{mint}Этот курильщик никуда не денется." + } + + "Spitter #128" + { + "ru" "{mint}Этот плевальщица никуда не денется." + } + + "Witch #128" + { + "ru" "{mint}Этот ведьма никуда не денется." + } + + "Common #128" + { + "ru" "{mint}Этот обычных никуда не денется." + } + + "Tank #129 Name" + { + "ru" "Танк Сипоу" + } + + "Boomer #129 Name" + { + "ru" "Толстяк Сипоу" + } + + "Charger #129 Name" + { + "ru" "Громила Сипоу" + } + + "Hunter #129 Name" + { + "ru" "Охотник Сипоу" + } + + "Jockey #129 Name" + { + "ru" "Жокей Сипоу" + } + + "Smoker #129 Name" + { + "ru" "Курильщик Сипоу" + } + + "Spitter #129 Name" + { + "ru" "Плевальщица Сипоу" + } + + "Witch #129 Name" + { + "ru" "Ведьма Сипоу" + } + + "Common #129 Name" + { + "ru" "Обычных Сипоу" + } + + "Tank #129" + { + "ru" "{mint}Этот танк может создавать кислотные лужи под выжившими и запускать метеоритные дожди с горящими метеоритами и взрывающимися через несколько секунд." + } + + "Boomer #129" + { + "ru" "{mint}Этот толстяк может создавать кислотные лужи под выжившими и запускать метеоритные дожди с горящими метеоритами и взрывающимися через несколько секунд." + } + + "Charger #129" + { + "ru" "{mintЭтот громила может создавать кислотные лужи под выжившими и запускать метеоритные дожди с горящими метеоритами и взрывающимися через несколько секунд." + } + + "Hunter #129" + { + "ru" "{mint}Этот охотник может создавать кислотные лужи под выжившими и запускать метеоритные дожди с горящими метеоритами и взрывающимися через несколько секунд." + } + + "Jockey #129" + { + "ru" "{mint}Этот жокей может создавать кислотные лужи под выжившими и запускать метеоритные дожди с горящими метеоритами и взрывающимися через несколько секунд." + } + + "Smoker #129" + { + "ru" "{mint}Этот курильщик может создавать кислотные лужи под выжившими и запускать метеоритные дожди с горящими метеоритами и взрывающимися через несколько секунд." + } + + "Spitter #129" + { + "ru" "{mint}Этот плевальщица может создавать кислотные лужи под выжившими и запускать метеоритные дожди с горящими метеоритами и взрывающимися через несколько секунд." + } + + "Witch #129" + { + "ru" "{mint}Этот ведьма может создавать кислотные лужи под выжившими и запускать метеоритные дожди с горящими метеоритами и взрывающимися через несколько секунд." + } + + "Common #129" + { + "ru" "{mint}Этот обычных может создавать кислотные лужи под выжившими и запускать метеоритные дожди с горящими метеоритами и взрывающимися через несколько секунд." + } + + "Tank #130 Name" + { + "ru" "Танк зла" + } + + "Boomer #130 Name" + { + "ru" "Толстяк зла" + } + + "Charger #130 Name" + { + "ru" "Громила зла" + } + + "Hunter #130 Name" + { + "ru" "Охотник зла" + } + + "Jockey #130 Name" + { + "ru" "Жокей зла" + } + + "Smoker #130 Name" + { + "ru" "Курильщик зла" + } + + "Spitter #130 Name" + { + "ru" "Плевальщица зла" + } + + "Witch #130 Name" + { + "ru" "Ведьма зла" + } + + "Common #130 Name" + { + "ru" "Обычных зла" + } + + "Tank #130" + { + "ru" "{mint}Этот танк может отправить вас в лаву, но не даст погибнуть ничему!" + } + + "Boomer #130" + { + "ru" "{mint}Этот толстяк может отправить вас в лаву, но не даст погибнуть ничему!" + } + + "Charger #130" + { + "ru" "{mint}Этот громила может отправить вас в лаву, но не даст погибнуть ничему!" + } + + "Hunter #130" + { + "ru" "{mint}Этот охотник может отправить вас в лаву, но не даст погибнуть ничему!" + } + + "Jockey #130" + { + "ru" "{mint}Этот жокей может отправить вас в лаву, но не даст погибнуть ничему!" + } + + "Smoker #130" + { + "ru" "{mint}Этот курильщик может отправить вас в лаву, но не даст погибнуть ничему!" + } + + "Spitter #130" + { + "ru" "{mint}Этот плевальщица может отправить вас в лаву, но не даст погибнуть ничему!" + } + + "Witch #130" + { + "ru" "{mint}Этот ведьма может отправить вас в лаву, но не даст погибнуть ничему!" + } + + "Common #130" + { + "ru" "{mint}Этот обычных может отправить вас в лаву, но не даст погибнуть ничему!" + } + + "Tank #131 Name" + { + "ru" "Танк-офицер" + } + + "Boomer #131 Name" + { + "ru" "Толстяк-офицер" + } + + "Charger #131 Name" + { + "ru" "Громила-офицер" + } + + "Hunter #131 Name" + { + "ru" "Охотник-офицер" + } + + "Jockey #131 Name" + { + "ru" "Жокей-офицер" + } + + "Smoker #131 Name" + { + "ru" "Курильщик-офицер" + } + + "Spitter #131 Name" + { + "ru" "Плевальщица-офицер" + } + + "Witch #131 Name" + { + "ru" "Ведьма-офицер" + } + + "Common #131 Name" + { + "ru" "Обычных-офицер" + } + + "Tank #131" + { + "ru" "{mint}Этот танк и всё полицейское управление здесь для того, чтобы блюсти закон!" + } + + "Boomer #131" + { + "ru" "{mint}Этот толстяк и всё полицейское управление здесь для того, чтобы блюсти закон!" + } + + "Charger #131" + { + "ru" "{mint}Этот громила и всё полицейское управление здесь для того, чтобы блюсти закон!" + } + + "Hunter #131" + { + "ru" "{mint}Этот охотник и всё полицейское управление здесь для того, чтобы блюсти закон!" + } + + "Jockey #131" + { + "ru" "{mint}Этот жокей и всё полицейское управление здесь для того, чтобы блюсти закон!" + } + + "Smoker #131" + { + "ru" "{mint}Этот курильщик и всё полицейское управление здесь для того, чтобы блюсти закон!" + } + + "Spitter #131" + { + "ru" "{mint}Этот плевальщица и всё полицейское управление здесь для того, чтобы блюсти закон!" + } + + "Witch #131" + { + "ru" "{mint}Этот ведьма и всё полицейское управление здесь для того, чтобы блюсти закон!" + } + + "Common #131" + { + "ru" "{mint}Этот обычных и всё полицейское управление здесь для того, чтобы блюсти закон!" + } + + "Tank #132 Name" + { + "ru" "Танк-мафиозник" + } + + "Boomer #132 Name" + { + "ru" "Толстяк-мафиозник" + } + + "Charger #132 Name" + { + "ru" "Громила-мафиозник" + } + + "Hunter #132 Name" + { + "ru" "Охотник-мафиозник" + } + + "Jockey #132 Name" + { + "ru" "Жокей-мафиозник" + } + + "Smoker #132 Name" + { + "ru" "Курильщик-мафиозник" + } + + "Spitter #132 Name" + { + "ru" "Плевальщица-мафиозник" + } + + "Witch #132 Name" + { + "ru" "Ведьма-мафиозник" + } + + "Common #132 Name" + { + "ru" "Обычных-мафиозник" + } + + "Tank #132" + { + "ru" "{mint}Этот танк является частью мафии!" + } + + "Boomer #132" + { + "ru" "{mint}Этот толстяк является частью мафии!" + } + + "Charger #132" + { + "ru" "{mint}Этот громила является частью мафии!" + } + + "Hunter #132" + { + "ru" "{mint}Этот охотник является частью мафии!" + } + + "Jockey #132" + { + "ru" "{mint}Этот жокей является частью мафии!" + } + + "Smoker #132" + { + "ru" "{mint}Этот курильщик является частью мафии!" + } + + "Spitter #132" + { + "ru" "{mint}Этот плевальщица является частью мафии!" + } + + "Witch #132" + { + "ru" "{mint}Этот ведьма является частью мафии!" + } + + "Common #132" + { + "ru" "{mint}Этот обычных является частью мафии!" + } + + "Tank #133 Name" + { + "ru" "Танк-Франкенштейн" + } + + "Boomer #133 Name" + { + "ru" "Толстяк-Франкенштейн" + } + + "Charger #133 Name" + { + "ru" "Громила-Франкенштейн" + } + + "Hunter #133 Name" + { + "ru" "Охотник-Франкенштейн" + } + + "Jockey #133 Name" + { + "ru" "Жокей-Франкенштейн" + } + + "Smoker #133 Name" + { + "ru" "Курильщик-Франкенштейн" + } + + "Spitter #133 Name" + { + "ru" "Плевальщица-Франкенштейн" + } + + "Witch #133 Name" + { + "ru" "Ведьма-Франкенштейн" + } + + "Common #133 Name" + { + "ru" "Обычных-Франкенштейн" + } + + "Tank #133" + { + "ru" "{mint}Этот танк - мутант Франкенштейна!" + } + + "Boomer #133" + { + "ru" "{mint}Этот толстяк - мутант Франкенштейна!" + } + + "Charger #133" + { + "ru" "{mint}Этот громила - мутант Франкенштейна!" + } + + "Hunter #133" + { + "ru" "{mint}Этот охотник - мутант Франкенштейна!" + } + + "Jockey #133" + { + "ru" "{mint}Этот жокей - мутант Франкенштейна!" + } + + "Smoker #133" + { + "ru" "{mint}Этот курильщик - мутант Франкенштейна!" + } + + "Spitter #133" + { + "ru" "{mint}Этот плевальщица - мутант Франкенштейна!" + } + + "Witch #133" + { + "ru" "{mint}Этот ведьма - мутант Франкенштейна!" + } + + "Common #133" + { + "ru" "{mint}Этот обычных - мутант Франкенштейна!" + } + + "Tank #134 Name" + { + "ru" "Танк-прототип" + } + + "Boomer #134 Name" + { + "ru" "Толстяк-прототип" + } + + "Charger #134 Name" + { + "ru" "Громила-прототип" + } + + "Hunter #134 Name" + { + "ru" "Охотник-прототип" + } + + "Jockey #134 Name" + { + "ru" "Жокей-прототип" + } + + "Smoker #134 Name" + { + "ru" "Курильщик-прототип" + } + + "Spitter #134 Name" + { + "ru" "Плевальщица-прототип" + } + + "Witch #134 Name" + { + "ru" "Ведьма-прототип" + } + + "Common #134 Name" + { + "ru" "Обычных-прототип" + } + + "Tank #134" + { + "ru" "{mint}Этот танк импровизирует, приспосабливается и выходит из любой ситуации." + } + + "Boomer #134" + { + "ru" "{mint}Этот толстяк импровизирует, приспосабливается и выходит из любой ситуации." + } + + "Charger #134" + { + "ru" "{mint}Этот громила импровизирует, приспосабливается и выходит из любой ситуации." + } + + "Hunter #134" + { + "ru" "{mint}Этот охотник импровизирует, приспосабливается и выходит из любой ситуации." + } + + "Jockey #134" + { + "ru" "{mint}Этот жокей импровизирует, приспосабливается и выходит из любой ситуации." + } + + "Smoker #134" + { + "ru" "{mint}Этот курильщик импровизирует, приспосабливается и выходит из любой ситуации." + } + + "Spitter #134" + { + "ru" "{mint}Этот плевальщица импровизирует, приспосабливается и выходит из любой ситуации." + } + + "Witch #134" + { + "ru" "{mint}Этот ведьма импровизирует, приспосабливается и выходит из любой ситуации." + } + + "Common #134" + { + "ru" "{mint}Этот обычных импровизирует, приспосабливается и выходит из любой ситуации." + } + + "Tank #135 Name" + { + "ru" "Танк Зевс" + } + + "Boomer #135 Name" + { + "ru" "Толстяк Зевс" + } + + "Charger #135 Name" + { + "ru" "Громила Зевс" + } + + "Hunter #135 Name" + { + "ru" "Охотник Зевс" + } + + "Jockey #135 Name" + { + "ru" "Жокей Зевс" + } + + "Smoker #135 Name" + { + "ru" "Курильщик Зевс" + } + + "Spitter #135 Name" + { + "ru" "Плевальщица Зевс" + } + + "Witch #135 Name" + { + "ru" "Ведьма Зевс" + } + + "Common #135 Name" + { + "ru" "Обычных Зевс" + } + + "Tank #135" + { + "ru" "{mint}Этот танк стреляет молниями из кончиков пальцев!" + } + + "Boomer #135" + { + "ru" "{mint}Этот толстяк стреляет молниями из кончиков пальцев!" + } + + "Charger #135" + { + "ru" "{mint}Этот громила стреляет молниями из кончиков пальцев!" + } + + "Hunter #135" + { + "ru" "{mint}Этот охотник стреляет молниями из кончиков пальцев!" + } + + "Jockey #135" + { + "ru" "{mint}Этот жокей стреляет молниями из кончиков пальцев!" + } + + "Smoker #135" + { + "ru" "{mint}Этот курильщик стреляет молниями из кончиков пальцев!" + } + + "Spitter #135" + { + "ru" "{mint}Этот плевальщица стреляет молниями из кончиков пальцев!" + } + + "Witch #135" + { + "ru" "{mint}Этот ведьма стреляет молниями из кончиков пальцев!" + } + + "Common #135" + { + "ru" "{mint}Этот обычных стреляет молниями из кончиков пальцев!" + } + + "Tank #136 Name" + { + "ru" "Траекторный Танк" + } + + "Boomer #136 Name" + { + "ru" "Траекторный Толстяк" + } + + "Charger #136 Name" + { + "ru" "Траекторный Громила" + } + + "Hunter #136 Name" + { + "ru" "Траекторный Охотник" + } + + "Jockey #136 Name" + { + "ru" "Траекторный Жокей" + } + + "Smoker #136 Name" + { + "ru" "Траекторный Курильщик" + } + + "Spitter #136 Name" + { + "ru" "Траекторный Плевальщица" + } + + "Witch #136 Name" + { + "ru" "Траекторный Ведьма" + } + + "Common #136 Name" + { + "ru" "Траекторный Обычных" + } + + "Tank #136" + { + "ru" "{mint}Этот танк использует скорость, чтобы изменить траекторию вашей жизни!" + } + + "Boomer #136" + { + "ru" "{mint}Этот толстяк использует скорость, чтобы изменить траекторию вашей жизни!" + } + + "Charger #136" + { + "ru" "{mint}Этот громила использует скорость, чтобы изменить траекторию вашей жизни!" + } + + "Hunter #136" + { + "ru" "{mint}Этот охотник использует скорость, чтобы изменить траекторию вашей жизни!" + } + + "Jockey #136" + { + "ru" "{mint}Этот жокей использует скорость, чтобы изменить траекторию вашей жизни!" + } + + "Smoker #136" + { + "ru" "{mint}Этот курильщик использует скорость, чтобы изменить траекторию вашей жизни!" + } + + "Spitter #136" + { + "ru" "{mint}Этот плевальщица использует скорость, чтобы изменить траекторию вашей жизни!" + } + + "Witch #136" + { + "ru" "{mint}Этот ведьма использует скорость, чтобы изменить траекторию вашей жизни!" + } + + "Common #136" + { + "ru" "{mint}Этот обычных использует скорость, чтобы изменить траекторию вашей жизни!" + } + + "Tank #137 Name" + { + "ru" "Танк артобстрела" + } + + "Boomer #137 Name" + { + "ru" "Толстяк артобстрела" + } + + "Charger #137 Name" + { + "ru" "Громила артобстрела" + } + + "Hunter #137 Name" + { + "ru" "Охотник артобстрела" + } + + "Jockey #137 Name" + { + "ru" "Жокей артобстрела" + } + + "Smoker #137 Name" + { + "ru" "Курильщик артобстрела" + } + + "Spitter #137 Name" + { + "ru" "Плевальщица артобстрела" + } + + "Witch #137 Name" + { + "ru" "Ведьма артобстрела" + } + + "Common #137 Name" + { + "ru" "Обычных артобстрела" + } + + "Tank #137" + { + "ru" "{mint}Этот танк не отправит вас отключку." + } + + "Boomer #137" + { + "ru" "{mint}Этот толстяк не отправит вас отключку." + } + + "Charger #137" + { + "ru" "{mint}Этот громила не отправит вас отключку." + } + + "Hunter #137" + { + "ru" "{mint}Этот охотник не отправит вас отключку." + } + + "Jockey #137" + { + "ru" "{mint}Этот жокей не отправит вас отключку." + } + + "Smoker #137" + { + "ru" "{mint}Этот курильщик не отправит вас отключку." + } + + "Spitter #137" + { + "ru" "{mint}Этот плевальщица не отправит вас отключку." + } + + "Witch #137" + { + "ru" "{mint}Этот ведьма не отправит вас отключку." + } + + "Common #137" + { + "ru" "{mint}Этот обычных не отправит вас отключку." + } + + "Tank #138 Name" + { + "ru" "Танк-коллекционер" + } + + "Boomer #138 Name" + { + "ru" "Толстяк-коллекционер" + } + + "Charger #138 Name" + { + "ru" "Громила-коллекционер" + } + + "Hunter #138 Name" + { + "ru" "Охотник-коллекционер" + } + + "Jockey #138 Name" + { + "ru" "Жокей-коллекционер" + } + + "Smoker #138 Name" + { + "ru" "Курильщик-коллекционер" + } + + "Spitter #138 Name" + { + "ru" "Плевальщица-коллекционер" + } + + "Witch #138 Name" + { + "ru" "Ведьма-коллекционер" + } + + "Common #138 Name" + { + "ru" "Обычных-коллекционер" + } + + "Tank #138" + { + "ru" "{mint}Этот танк хочет добавить вас в свою коллекцию..." + } + + "Boomer #138" + { + "ru" "{mint}Этот толстяк хочет добавить вас в свою коллекцию..." + } + + "Charger #138" + { + "ru" "{mint}Этот громила хочет добавить вас в свою коллекцию..." + } + + "Hunter #138" + { + "ru" "{mint}Этот охотник хочет добавить вас в свою коллекцию..." + } + + "Jockey #138" + { + "ru" "{mint}Этот жокей хочет добавить вас в свою коллекцию..." + } + + "Smoker #138" + { + "ru" "{mint}Этот курильщик хочет добавить вас в свою коллекцию..." + } + + "Spitter #138" + { + "ru" "{mint}Этот плевальщица хочет добавить вас в свою коллекцию..." + } + + "Witch #138" + { + "ru" "{mint}Этот ведьма хочет добавить вас в свою коллекцию..." + } + + "Common #138" + { + "ru" "{mint}Этот обычных хочет добавить вас в свою коллекцию..." + } + + "Tank #139 Name" + { + "ru" "Танк «Времяходец»" + } + + "Boomer #139 Name" + { + "ru" "Толстяк «Времяходец»" + } + + "Charger #139 Name" + { + "ru" "Громила «Времяходец»" + } + + "Hunter #139 Name" + { + "ru" "Охотник «Времяходец»" + } + + "Jockey #139 Name" + { + "ru" "Жокей «Времяходец»" + } + + "Smoker #139 Name" + { + "ru" "Курильщик «Времяходец»" + } + + "Spitter #139 Name" + { + "ru" "Плевальщица «Времяходец»" + } + + "Witch #139 Name" + { + "ru" "Ведьма «Времяходец»" + } + + "Common #139 Name" + { + "ru" "Обычных «Времяходец»" + } + + "Tank #139" + { + "ru" "{mint}Этот танк существует во все времена." + } + + "Boomer #139" + { + "ru" "{mint}Этот толстяк существует во все времена." + } + + "Charger #139" + { + "ru" "{mint}Этот громила существует во все времена." + } + + "Hunter #139" + { + "ru" "{mint}Этот охотник существует во все времена." + } + + "Jockey #139" + { + "ru" "{mint}Этот жокей существует во все времена." + } + + "Smoker #139" + { + "ru" "{mint}Этот курильщик существует во все времена." + } + + "Spitter #139" + { + "ru" "{mint}Этот плевальщица существует во все времена." + } + + "Witch #139" + { + "ru" "{mint}Этот ведьма существует во все времена." + } + + "Common #139" + { + "ru" "{mint}Этот обычных существует во все времена." + } + + "Tank #140 Name" + { + "ru" "Танк-демон скорости" + } + + "Boomer #140 Name" + { + "ru" "Толстяк-демон скорости" + } + + "Charger #140 Name" + { + "ru" "Громила-демон скорости" + } + + "Hunter #140 Name" + { + "ru" "Охотник-демон скорости" + } + + "Jockey #140 Name" + { + "ru" "Жокей-демон скорости" + } + + "Smoker #140 Name" + { + "ru" "Курильщик-демон скорости" + } + + "Spitter #140 Name" + { + "ru" "Плевальщица-демон скорости" + } + + "Witch #140 Name" + { + "ru" "Ведьма-демон скорости" + } + + "Common #140 Name" + { + "ru" "Обычных-демон скорости" + } + + "Tank #140" + { + "ru" "{mint}Этот танк оставляет за собой огненный след..." + } + + "Boomer #140" + { + "ru" "{mint}Этот толстяк оставляет за собой огненный след..." + } + + "Charger #140" + { + "ru" "{mint}Этот громила оставляет за собой огненный след..." + } + + "Hunter #140" + { + "ru" "{mint}Этот охотник оставляет за собой огненный след..." + } + + "Jockey #140" + { + "ru" "{mint}Этот жокей оставляет за собой огненный след..." + } + + "Smoker #140" + { + "ru" "{mint}Этот курильщик оставляет за собой огненный след..." + } + + "Spitter #140" + { + "ru" "{mint}Этот плевальщица оставляет за собой огненный след..." + } + + "Witch #140" + { + "ru" "{mint}Этот ведьма оставляет за собой огненный след..." + } + + "Common #140" + { + "ru" "{mint}Этот обычных оставляет за собой огненный след..." + } + + "Tank #141 Name" + { + "ru" "Танк-разоритель" + } + + "Boomer #141 Name" + { + "ru" "Толстяк-разоритель" + } + + "Charger #141 Name" + { + "ru" "Громила-разоритель" + } + + "Hunter #141 Name" + { + "ru" "Охотник-разоритель" + } + + "Jockey #141 Name" + { + "ru" "Жокей-разоритель" + } + + "Smoker #141 Name" + { + "ru" "Курильщик-разоритель" + } + + "Spitter #141 Name" + { + "ru" "Плевальщица-разоритель" + } + + "Witch #141 Name" + { + "ru" "Ведьма-разоритель" + } + + "Common #141 Name" + { + "ru" "Обычных-разоритель" + } + + "Tank #141" + { + "ru" "{mint}Этот танк взорвёт всё на своём пути!" + } + + "Boomer #141" + { + "ru" "{mint}Этот толстяк взорвёт всё на своём пути!" + } + + "Charger #141" + { + "ru" "{mint}Этот громила взорвёт всё на своём пути!" + } + + "Hunter #141" + { + "ru" "{mint}Этот охотник взорвёт всё на своём пути!" + } + + "Jockey #141" + { + "ru" "{mint}Этот жокей взорвёт всё на своём пути!" + } + + "Smoker #141" + { + "ru" "{mint}Этот курильщик взорвёт всё на своём пути!" + } + + "Spitter #141" + { + "ru" "{mint}Этот плевальщица взорвёт всё на своём пути!" } - "Boomer #127" + "Witch #141" { - "ru" "{mint}Этот толстяк не наносит никакого урона. Он просто хочет поиграть!" + "ru" "{mint}Этот ведьма взорвёт всё на своём пути!" } - "Charger #127" + "Common #141" { - "ru" "{mint}Этот громила не наносит никакого урона. Он просто хочет поиграть!" + "ru" "{mint}Этот обычных взорвёт всё на своём пути!" } - "Hunter #127" + "Tank #142 Name" { - "ru" "{mint}Этот охотник не наносит никакого урона. Он просто хочет поиграть!" + "ru" "Танк Раматтра" } - "Jockey #127" + "Boomer #142 Name" { - "ru" "{mint}Этот жокей не наносит никакого урона. Он просто хочет поиграть!" + "ru" "Толстяк Раматтра" } - "Smoker #127" + "Charger #142 Name" { - "ru" "{mint}Этот курильщик не наносит никакого урона. Он просто хочет поиграть!" + "ru" "Громила Раматтра" } - "Spitter #127" + "Hunter #142 Name" { - "ru" "{mint}Эта плевальщица не наносит никакого урона. Она просто хочет поиграть!" + "ru" "Охотник Раматтра" } - "Witch #127" + "Jockey #142 Name" { - "ru" "{mint}Эта Ведьма не наносит никакого урона. Она просто хочет поиграть!" + "ru" "Жокей Раматтра" } - "Tank #128 Name" + "Smoker #142 Name" { - "ru" "Раздражающий Танк" + "ru" "Курильщик Раматтра" } - "Boomer #128 Name" + "Spitter #142 Name" { - "ru" "Раздражающий Толстяк" + "ru" "Плевальщица Раматтра" } - "Charger #128 Name" + "Witch #142 Name" { - "ru" "Раздражающий Громила" + "ru" "Ведьма Раматтра" } - "Hunter #128 Name" + "Common #142 Name" { - "ru" "Раздражающий Охотник" + "ru" "Обычных Раматтра" } - "Jockey #128 Name" + "Tank #142" { - "ru" "Раздражающий Жокей" + "ru" "{mint}Этот танк заставит вас СТРАДАТЬ ТАК ЖЕ, КАК И ОН!" } - "Smoker #128 Name" + "Boomer #142" { - "ru" "Раздражающий Курильщик" + "ru" "{mint}Этот толстяк заставит вас СТРАДАТЬ ТАК ЖЕ, КАК И ОН!" } - "Spitter #128 Name" + "Charger #142" { - "ru" "Раздражающая Плевальщица" + "ru" "{mint}Этот громила заставит вас СТРАДАТЬ ТАК ЖЕ, КАК И ОН!" } - "Witch #128 Name" + "Hunter #142" { - "ru" "Раздражающая Ведьма" + "ru" "{mint}Этот охотник заставит вас СТРАДАТЬ ТАК ЖЕ, КАК И ОН!" } - "Tank #128" + "Jockey #142" { - "ru" "{mint}Этот танк никуда не денется." + "ru" "{mint}Этот жокей заставит вас СТРАДАТЬ ТАК ЖЕ, КАК И ОН!" } - "Boomer #128" + "Smoker #142" { - "ru" "{mint}Этот толстяк никуда не денется." + "ru" "{mint}Этот курильщик заставит вас СТРАДАТЬ ТАК ЖЕ, КАК И ОН!" } - "Charger #128" + "Spitter #142" { - "ru" "{mint}Этот громила никуда не денется." + "ru" "{mint}Этот плевальщица заставит вас СТРАДАТЬ ТАК ЖЕ, КАК И ОН!" } - "Hunter #128" + "Witch #142" { - "ru" "{mint}Этот охотник никуда не денется." + "ru" "{mint}Этот ведьма заставит вас СТРАДАТЬ ТАК ЖЕ, КАК И ОН!" } - "Jockey #128" + "Common #142" { - "ru" "{mint}Этот жокей никуда не денется." + "ru" "{mint}Этот обычных заставит вас СТРАДАТЬ ТАК ЖЕ, КАК И ОН!" } - "Smoker #128" + "Tank #143 Name" { - "ru" "{mint}Этот курильщик никуда не денется." + "ru" "Танк «Сигма»" } - "Spitter #128" + "Boomer #143 Name" { - "ru" "{mint}Эта плевальщица никуда не денется." + "ru" "Толстяк «Сигма»" } - "Witch #128" + "Charger #143 Name" + { + "ru" "Громила «Сигма»" + } + + "Hunter #143 Name" + { + "ru" "Охотник «Сигма»" + } + + "Jockey #143 Name" + { + "ru" "Жокей «Сигма»" + } + + "Smoker #143 Name" + { + "ru" "Курильщик «Сигма»" + } + + "Spitter #143 Name" + { + "ru" "Плевальщица «Сигма»" + } + + "Witch #143 Name" + { + "ru" "Ведьма «Сигма»" + } + + "Common #143 Name" + { + "ru" "Обычных «Сигма»" + } + + "Tank #143" + { + "ru" "{mint}Этот танк может управлять гравитацией и поглощать много урона." + } + + "Boomer #143" + { + "ru" "{mint}Этот толстяк может управлять гравитацией и поглощать много урона." + } + + "Charger #143" + { + "ru" "{mint}Этот громила может управлять гравитацией и поглощать много урона." + } + + "Hunter #143" + { + "ru" "{mint}Этот охотник может управлять гравитацией и поглощать много урона." + } + + "Jockey #143" + { + "ru" "{mint}Этот жокей может управлять гравитацией и поглощать много урона." + } + + "Smoker #143" + { + "ru" "{mint}Этот курильщик может управлять гравитацией и поглощать много урона." + } + + "Spitter #143" + { + "ru" "{mint}Этот плевальщица может управлять гравитацией и поглощать много урона." + } + + "Witch #143" + { + "ru" "{mint}Этот ведьма может управлять гравитацией и поглощать много урона." + } + + "Common #143" + { + "ru" "{mint}Этот обычных может управлять гравитацией и поглощать много урона." + } + + "Tank #144 Name" + { + "ru" "Танк Заря" + } + + "Boomer #144 Name" + { + "ru" "Толстяк Заря" + } + + "Charger #144 Name" + { + "ru" "Громила Заря" + } + + "Hunter #144 Name" + { + "ru" "Охотник Заря" + } + + "Jockey #144 Name" + { + "ru" "Жокей Заря" + } + + "Smoker #144 Name" + { + "ru" "Курильщик Заря" + } + + "Spitter #144 Name" + { + "ru" "Плевальщица Заря" + } + + "Witch #144 Name" + { + "ru" "Ведьма Заря" + } + + "Common #144 Name" + { + "ru" "Обычных Заря" + } + + "Tank #144" + { + "ru" "{mint}Этот танк может управлять гравитацией, преобразовывать получаемый урон в броню и прибавку к урону, а также поглощать здоровье у ближайших заражённых." + } + + "Boomer #144" + { + "ru" "{mint}Этот толстяк может управлять гравитацией, преобразовывать получаемый урон в броню и прибавку к урону, а также поглощать здоровье у ближайших заражённых." + } + + "Charger #144" + { + "ru" "{mint}Этот громила может управлять гравитацией, преобразовывать получаемый урон в броню и прибавку к урону, а также поглощать здоровье у ближайших заражённых." + } + + "Hunter #144" + { + "ru" "{mint}Этот охотник может управлять гравитацией, преобразовывать получаемый урон в броню и прибавку к урону, а также поглощать здоровье у ближайших заражённых." + } + + "Jockey #144" + { + "ru" "{mint}Этот жокей может управлять гравитацией, преобразовывать получаемый урон в броню и прибавку к урону, а также поглощать здоровье у ближайших заражённых." + } + + "Smoker #144" + { + "ru" "{mint}Этот курильщик может управлять гравитацией, преобразовывать получаемый урон в броню и прибавку к урону, а также поглощать здоровье у ближайших заражённых." + } + + "Spitter #144" + { + "ru" "{mint}Этот плевальщица может управлять гравитацией, преобразовывать получаемый урон в броню и прибавку к урону, а также поглощать здоровье у ближайших заражённых." + } + + "Witch #144" + { + "ru" "{mint}Этот ведьма может управлять гравитацией, преобразовывать получаемый урон в броню и прибавку к урону, а также поглощать здоровье у ближайших заражённых." + } + + "Common #144" + { + "ru" "{mint}Этот обычных может управлять гравитацией, преобразовывать получаемый урон в броню и прибавку к урону, а также поглощать здоровье у ближайших заражённых." + } + + "Tank #145 Name" + { + "ru" "Танк-лентяй" + } + + "Boomer #145 Name" + { + "ru" "Толстяк-лентяй" + } + + "Charger #145 Name" + { + "ru" "Громила-лентяй" + } + + "Hunter #145 Name" + { + "ru" "Охотник-лентяй" + } + + "Jockey #145 Name" + { + "ru" "Жокей-лентяй" + } + + "Smoker #145 Name" + { + "ru" "Курильщик-лентяй" + } + + "Spitter #145 Name" + { + "ru" "Плевальщица-лентяй" + } + + "Witch #145 Name" + { + "ru" "Ведьма-лентяй" + } + + "Common #145 Name" + { + "ru" "Обычных-лентяй" + } + + "Tank #145" + { + "ru" "{mint}Этот танк наказывает тех, кто отстаёт!" + } + + "Boomer #145" + { + "ru" "{mint}Этот толстяк наказывает тех, кто отстаёт!" + } + + "Charger #145" + { + "ru" "{mint}Этот громила наказывает тех, кто отстаёт!" + } + + "Hunter #145" + { + "ru" "{mint}Этот охотник наказывает тех, кто отстаёт!" + } + + "Jockey #145" + { + "ru" "{mint}Этот жокей наказывает тех, кто отстаёт!" + } + + "Smoker #145" + { + "ru" "{mint}Этот курильщик наказывает тех, кто отстаёт!" + } + + "Spitter #145" + { + "ru" "{mint}Этот плевальщица наказывает тех, кто отстаёт!" + } + + "Witch #145" + { + "ru" "{mint}Этот ведьма наказывает тех, кто отстаёт!" + } + + "Common #145" + { + "ru" "{mint}Этот обычных наказывает тех, кто отстаёт!" + } + + "Tank #146 Name" + { + "ru" "Танк-торопыга" + } + + "Boomer #146 Name" + { + "ru" "Толстяк-торопыга" + } + + "Charger #146 Name" + { + "ru" "Громила-торопыга" + } + + "Hunter #146 Name" + { + "ru" "Охотник-торопыга" + } + + "Jockey #146 Name" + { + "ru" "Жокей-торопыга" + } + + "Smoker #146 Name" + { + "ru" "Курильщик-торопыга" + } + + "Spitter #146 Name" + { + "ru" "Плевальщица-торопыга" + } + + "Witch #146 Name" + { + "ru" "Ведьма-торопыга" + } + + "Common #146 Name" + { + "ru" "Обычных-торопыга" + } + + "Tank #146" + { + "ru" "{mint}Этот танк наказывает тех, кто бежит вперёд!" + } + + "Boomer #146" + { + "ru" "{mint}Этот толстяк наказывает тех, кто бежит вперёд!" + } + + "Charger #146" + { + "ru" "{mint}Этот громила наказывает тех, кто бежит вперёд!" + } + + "Hunter #146" + { + "ru" "{mint}Этот охотник наказывает тех, кто бежит вперёд!" + } + + "Jockey #146" + { + "ru" "{mint}Этот жокей наказывает тех, кто бежит вперёд!" + } + + "Smoker #146" + { + "ru" "{mint}Этот курильщик наказывает тех, кто бежит вперёд!" + } + + "Spitter #146" + { + "ru" "{mint}Этот плевальщица наказывает тех, кто бежит вперёд!" + } + + "Witch #146" + { + "ru" "{mint}Этот ведьма наказывает тех, кто бежит вперёд!" + } + + "Common #146" { - "ru" "{mint}Эта Ведьма никуда не денется." + "ru" "{mint}Этот обычных наказывает тех, кто бежит вперёд!" } // На самом деле это действительный Steam32ID, поэтому не комментируйте его; это просто пример. @@ -10323,17 +13223,7 @@ // // "STEAM_0:1:23456789 Spitter" // { - // "ru" "{mint}Эта плевальщица кем-то управляется." - // } - // - // "STEAM_0:1:23456789 Witch Name" - // { - // "ru" "Ведьма" - // } - // - // "STEAM_0:1:23456789 Witch" - // { - // "ru" "{mint}Эта Ведьма кем-то управляется." + // "ru" "{mint}Этот плевальщица кем-то управляется." // } // -- // Добавьте ниже переводимые фразы для ваших собственных танков-мутантов! diff --git a/cfg/sourcemod/mutant_tanks.cfg b/cfg/sourcemod/mutant_tanks.cfg index e71581a156..760899b959 100644 --- a/cfg/sourcemod/mutant_tanks.cfg +++ b/cfg/sourcemod/mutant_tanks.cfg @@ -47,6 +47,17 @@ mt_enabledgamemodes "" // Maximum: "15.000000" mt_gamemodetypes "0" +// Sets the graphics level of the plugin to help with server performance.. +// 0: OFF +// 1: Low +// 2: Medium +// 3: High +// - +// Default: "3" +// Minimum: "0.000000" +// Maximum: "3.000000" +mt_graphicslevel "3" + // Enable Mutant Tanks on listen servers. // 0: OFF // 1: ON

    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

  2. Oicvg<+fv>5&k?1 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­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
    8dM9t2`aVYA~c9fw=%)33KsFHw(xVB(`K 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