[MOD] Zombie Plague 4.3 Fix 5a default

Aici vom publica si discuta despre diverse moduri necesare serverelor dedicate.

Moderators: Moderatori, Moderatori ajutători

Post Reply
User avatar
Rainq
Fost administrator
Fost administrator
Posts: 381
Joined: Mon Jan 18, 2021 7:25 am
Status: Citesc forumul TheXForce.RO...!
Detinator Steam: Da
SteamID: mrainq
Gaming experience: Nu spun..
Reputatie: Fost administrator
Nume anterior: Light
Fost detinator zm.thexforce.ro
Fost detinator dr.thexforce.ro
Location: Bucureşti
Has thanked: 2 times
Been thanked: 1 time
Contact:

[MOD] Zombie Plague 4.3 Fix 5a default

Post by Rainq »

Descriere: Un addons default de zombie
Autor: Kakarot47
Versiune: 4.3
Descarcare:

zombieplague.ini

Code: Select all

; -----------------------------------------
; Zombie Plague 4.3 Fix5 Customization File
; -----------------------------------------
; Any changes you make here will be
; automatically loaded at map start

; Note: No error parsing is done for this.
; Make sure you don't mistype anything.
; Edited by BAKiR.

[Access Flags]
ENABLE/DISABLE MOD = l
ADMIN MENU = d
ADMIN MODES MENU = d
START MODE INFECTION = d
START MODE NEMESIS = d
START MODE ASSASSIN = d
START MODE SURVIVOR = d
START MODE SNIPER = d
START MODE SWARM = d
START MODE MULTI = d
START MODE PLAGUE = d
START MODE ARMAGEDDON = d
START MODE APOCALYPSE = d
START MODE NIGHTMARE = d
MAKE ZOMBIE = d
MAKE HUMAN = d
MAKE NEMESIS = d
MAKE ASSASSIN = d
MAKE SURVIVOR = d
MAKE SNIPER = d
RESPAWN PLAYERS = d
ADMIN MODELS = d

[Player Models] (randomly chosen if more than one)
HUMAN = arctic , guerilla , leet , terror , gign , gsg9 , sas , urban
NEMESIS = zombie_source
ASSASSIN = zombie_source
SURVIVOR = leet , sas
SNIPER = arctic
ADMIN ZOMBIE = zombie_source
ADMIN HUMAN = vip

; If you don't want people using altered player models, enable the following.
; 1 = Bounds Check (model's geometry must fit in the same bbox)
; 2 = CRC Check (file on client must exactly match server's file)
FORCE CONSISTENCY = 0

; By default, zombie models are class specific. You can edit them separately in your zp_zombieclasses.ini
; If, however, you want all zombies to use the same models regardless of class, you can enable this
; setting and add your global zombie models to the "ZOMBIE" line.
SAME MODELS FOR ALL = 0
ZOMBIE = zombie_source

[Weapon Models]
V_KNIFE HUMAN = models/v_knife.mdl
V_KNIFE NEMESIS = models/zombie_plague/v_knife_zombie.mdl
V_KNIFE ASSASSIN = models/zombie_plague/v_knife_zombie.mdl
V_WEAPON SURVIVOR = models/v_m249.mdl
V_AWP SNIPER = models/v_awp.mdl
P_AWP SNIPER = models/p_awp.mdl
GRENADE INFECT = models/zombie_plague/v_grenade_infect.mdl
GRENADE FIRE = models/zombie_plague/v_grenade_fire.mdl
GRENADE FROST = models/zombie_plague/v_grenade_frost.mdl
GRENADE FLARE = models/zombie_plague/v_grenade_flare.mdl
V_KNIFE ADMIN HUMAN = models/v_knife.mdl
V_KNIFE ADMIN ZOMBIE = models/zombie_plague/v_knife_zombie.mdl

[Grenade Sprites]
TRAIL = sprites/laserbeam.spr
RING = sprites/shockwave.spr
FIRE = sprites/flame.spr
SMOKE = sprites/black_smoke3.spr
GLASS = models/glassgibs.mdl

[Sounds] (randomly chosen if more than one)
WIN ZOMBIES = ambience/the_horror1.wav , ambience/the_horror3.wav , ambience/the_horror4.wav
WIN HUMANS = zombie_plague/win_humans1.wav , zombie_plague/win_humans2.wav
WIN NO ONE = ambience/3dmstart.wav
ZOMBIE INFECT = zombie_plague/zombie_infec1.wav , zombie_plague/zombie_infec2.wav , zombie_plague/zombie_infec3.wav , scientist/c1a0_sci_catscream.wav , scientist/scream01.wav
ZOMBIE PAIN = zombie_plague/zombie_pain1.wav , zombie_plague/zombie_pain2.wav , zombie_plague/zombie_pain3.wav , zombie_plague/zombie_pain4.wav , zombie_plague/zombie_pain5.wav
NEMESIS PAIN = zombie_plague/nemesis_pain1.wav , zombie_plague/nemesis_pain2.wav , zombie_plague/nemesis_pain3.wav
ASSASSIN PAIN = zombie_plague/nemesis_pain1.wav , zombie_plague/nemesis_pain2.wav , zombie_plague/nemesis_pain3.wav
ZOMBIE DIE = zombie_plague/zombie_die1.wav , zombie_plague/zombie_die2.wav , zombie_plague/zombie_die3.wav , zombie_plague/zombie_die4.wav , zombie_plague/zombie_die5.wav
ZOMBIE FALL = zombie_plague/zombie_fall1.wav
ZOMBIE MISS SLASH = weapons/knife_slash1.wav , weapons/knife_slash2.wav
ZOMBIE MISS WALL = weapons/knife_hitwall1.wav
ZOMBIE HIT NORMAL = weapons/knife_hit1.wav , weapons/knife_hit2.wav , weapons/knife_hit3.wav , weapons/knife_hit4.wav
ZOMBIE HIT STAB = weapons/knife_stab.wav
ZOMBIE IDLE = nihilanth/nil_now_die.wav , nihilanth/nil_slaves.wav , nihilanth/nil_alone.wav , zombie_plague/zombie_brains1.wav , zombie_plague/zombie_brains2.wav
ZOMBIE IDLE LAST = nihilanth/nil_thelast.wav
ZOMBIE MADNESS = zombie_plague/zombie_madness1.wav
ROUND NEMESIS = zombie_plague/nemesis1.wav , zombie_plague/nemesis2.wav
ROUND ASSASSIN = zombie_plague/nemesis1.wav , zombie_plague/nemesis2.wav
ROUND SURVIVOR = zombie_plague/survivor1.wav , zombie_plague/survivor2.wav
ROUND SNIPER = zombie_plague/survivor1.wav , zombie_plague/survivor2.wav
ROUND SWARM = ambience/the_horror2.wav
ROUND MULTI = ambience/the_horror2.wav
ROUND PLAGUE = zombie_plague/nemesis1.wav , zombie_plague/survivor1.wav
ROUND ARMAGEDDON = zombie_plague/nemesis1.wav , zombie_plague/survivor1.wav
ROUND APOCALYPSE = zombie_plague/nemesis1.wav , zombie_plague/survivor1.wav
ROUND NIGHTMARE = zombie_plague/nemesis1.wav , zombie_plague/survivor1.wav
GRENADE INFECT EXPLODE = zombie_plague/grenade_infect.wav
GRENADE INFECT PLAYER = scientist/scream20.wav , scientist/scream22.wav , scientist/scream05.wav
GRENADE FIRE EXPLODE = zombie_plague/grenade_explode.wav
GRENADE FIRE PLAYER = zombie_plague/zombie_burn3.wav , zombie_plague/zombie_burn4.wav , zombie_plague/zombie_burn5.wav , zombie_plague/zombie_burn6.wav , zombie_plague/zombie_burn7.wav
GRENADE FROST EXPLODE = warcraft3/frostnova.wav
GRENADE FROST PLAYER = warcraft3/impalehit.wav
GRENADE FROST BREAK = warcraft3/impalelaunch1.wav
GRENADE FLARE = items/nvg_on.wav
ANTIDOTE = items/smallmedkit1.wav
THUNDER = zombie_plague/thunder1.wav , zombie_plague/thunder2.wav

[Ambience Sounds] (randomly chosen if more than one) (only .wav and .mp3 formats supported) (duration is in seconds)
INFECTION ENABLE = 0
INFECTION SOUNDS = zombie_plague/ambience.wav
INFECTION DURATIONS = 17
NEMESIS ENABLE = 0
NEMESIS SOUNDS = zombie_plague/ambience.wav
NEMESIS DURATIONS = 17
ASSASSIN ENABLE = 0
ASSASSIN SOUNDS = zombie_plague/ambience.wav
ASSASSIN DURATIONS = 17
SURVIVOR ENABLE = 0
SURVIVOR SOUNDS = zombie_plague/ambience.wav
SURVIVOR DURATIONS = 17
SNIPER ENABLE = 0
SNIPER SOUNDS = zombie_plague/ambience.wav
SNIPER DURATIONS = 17
SWARM ENABLE = 0
SWARM SOUNDS = zombie_plague/ambience.wav
SWARM DURATIONS = 17
PLAGUE ENABLE = 0
PLAGUE SOUNDS = zombie_plague/ambience.wav
PLAGUE DURATIONS = 17
ARMAGEDDON ENABLE = 0
ARMAGEDDON SOUNDS = zombie_plague_v44/ambience.wav
ARMAGEDDON DURATIONS = 17
APOCALYPSE ENABLE = 0
APOCALYPSE SOUNDS = zombie_plague_v44/ambience.wav
APOCALYPSE DURATIONS = 17
NIGHTMARE ENABLE = 0
NIGHTMARE SOUNDS = zombie_plague_v44/ambience.wav
NIGHTMARE DURATIONS = 17

[Buy Menu Weapons]
PRIMARY = weapon_galil , weapon_famas , weapon_m4a1 , weapon_ak47 , weapon_sg552 , weapon_aug , weapon_scout , weapon_m3 , weapon_xm1014 , weapon_tmp , weapon_mac10 , weapon_ump45 , weapon_mp5navy , weapon_p90
SECONDARY = weapon_glock18 , weapon_usp , weapon_p228 , weapon_deagle , weapon_fiveseven , weapon_elite
ADDITIONAL ITEMS = weapon_hegrenade , weapon_flashbang , weapon_smokegrenade

[Extra Items: Weapons and their costs]
NAMES = Napalm Nade , Frost Nade , Flare , AWP Magnum Sniper , M249 Para Machinegun , SG550 Auto-Sniper , G3SG1 Auto-Sniper
ITEMS = weapon_hegrenade , weapon_flashbang , weapon_smokegrenade , weapon_awp , weapon_m249 , weapon_sg550 , weapon_g3sg1
COSTS = 6 , 6 , 6 , 8 , 10 , 12 , 12

[Hard Coded Items Costs]
NIGHT VISION = 15
ANTIDOTE = 15
ZOMBIE MADNESS = 17
INFECTION BOMB = 20

[Weather Effects]
RAIN = 0
SNOW = 0
FOG = 0
FOG DENSITY = 0.0018
FOG COLOR = 128 128 128

[Custom Skies] (randomly chosen if more than one)
ENABLE = 1
SKY NAMES = space

[Lightning Lights Cycle]
LIGHTS = ijklmnonmlkjihgfedcb , klmlkjihgfedcbaabcdedcb , bcdefedcijklmlkjihgfedcb

[Zombie Decals] (for bloodstains/footsteps)
DECALS = 99 , 107 , 108 , 184 , 185 , 186 , 187 , 188 , 189

[Knockback Power for Weapons] (use -1.0 to disable knockback power for the weapon)
P228 = 2.4
SCOUT = 6.5
XM1014 = 8.0
MAC10 = 2.3
AUG = 5.0
ELITE = 2.4
FIVESEVEN = 2.0
UMP45 = 2.4
SG550 = 5.3
GALIL = 5.5
FAMAS = 5.5
USP = 2.2
GLOCK18 = 2.0
AWP = 10.0
MP5NAVY = 2.5
M249 = 5.2
M3 = 8.0
M4A1 = 5.0
TMP = 2.4
G3SG1 = 6.5
DEAGLE = 5.3
SG552 = 5.0
AK47 = 6.0
P90 = 2.0

[Objective Entities] (and anything that would affect gameplay that needs to be removed)
CLASSNAMES = func_bomb_target , info_bomb_target , info_vip_start , func_vip_safetyzone , func_escapezone , hostage_entity , monster_scientist , func_hostage_rescue , info_hostage_rescue , env_fog , env_rain , env_snow , item_longjump , func_vehicle , func_buyzone

[SVC_BAD Prevention] (if you experience *many* SVC_BAD kicks, try one of the following)
; A. Increase the delay between model changes here (in 0.1 increments until the kicks are gone)
MODELCHANGE DELAY = 0.2
; B. If you still get recurring kicks, try enabling this setting: (experimental!)
HANDLE MODELS ON SEPARATE ENT = 0

; If you want your models to have accurate hitboxes, try enabling this.
; Note: make sure your models don't have messed up hitboxes, otherwise
; this setting might cause your server insane cpu usage and lag!
SET MODELINDEX OFFSET = 0
zombieplague.cfg

Code: Select all

// ----------------------------------
// Zombie Plague 4.3 Fix6 Config File
// ----------------------------------
// Any changes you make here will be
// automatically loaded at map start
// edited by BAKiR

// General
// -------
zp_delay 10 // Time before any game mode starts in seconds
zp_lighting "g" // Map lighting ["a"-darkest // "z"-brightest // ""-default // "0"-disabled]
zp_thunderclap 90 // Thunderclap rate in seconds [0-disabled]
zp_triggered_lights 1 // Allow map triggered lights (e.g. light switches)
zp_remove_doors 0 // Remove doors from maps [0-none // 1-rotating only // 2-all doors]
zp_blockuse_pushables 1 // Block +use on pushables to prevent the speed bug
zp_block_suicide 1 // Prevent players from killing themselves
zp_random_spawn 1 // Enable random spawning (will use CSDM spawns if present)
zp_respawn_on_worldspawn_kill 1 // Respawn players after a worldspawn kill
zp_remove_dropped 0 // Time before removing dropped weapons in seconds [0-disabled]
zp_remove_money 1 // Remove player's money
zp_buy_custom 1 // Enable custom buy menus
zp_buyzone_time 0.0 // Time in seconds humans are allowed to use CS buyzones after spawning
zp_random_weapons 0 // Whether players should get weapons randomly instead of buying them
zp_admin_models_human 1 // Enable admin player models for humans
zp_admin_knife_models_human 0 // Enable admin knife models for humans
zp_admin_models_zombie 1 // Enable admin player models for zombies
zp_admin_knife_models_zombie 0 // Enable admin knife models for zombies
zp_zombie_classes 1 // Enable zombie classes
zp_stats_save 1 // Temporarily save player's ammo packs and zombie class when they disconnect
zp_starting_ammo_packs 500 // Starting amount of ammo packs for new players
zp_prevent_consecutive_modes 1 // Prevent the same game mode from being played two rounds in a row
zp_keep_health_on_disconnect 1 // Whether the health of the Nemesis/Survivor chosen to keep the round going should be set to that of the leaving player's
zp_hud_display 1 // Enable ZP custom HUD display at the bottom
zp_aim_info 1 // if enable, allow to show aim informatin
zp_dmg_while_frost 0 // if enable, Zombie will not get dmg when frost.

// Deathmatch
// ----------
zp_deathmatch 0 // Deathmatch mode, respawn as: [0-disabled // 1-human // 2-zombie // 3-randomly // 4-balance]
zp_spawn_delay 5 // Delay before respawning on deathmatch mode in seconds
zp_spawn_protection 5 // Spawn protection time for deathmatch in seconds [0-disabled]
zp_respawn_on_suicide 0 // Respawn players if they commited suicide
zp_respawn_after_last_human 1 // Respawn players if only the last human is left
zp_infection_allow_respawn 1 // Allow respawning on infection rounds
zp_nem_allow_respawn 0 // Allow respawning on nemesis rounds
zp_assa_allow_respawn 0 // Allow respawning on assassin rounds
zp_surv_allow_respawn 0 // Allow respawning on survivor rounds
zp_sni_allow_respawn 0 // Allow respawning on sniper rounds
zp_swarm_allow_respawn 0 // Allow respawning on swarm rounds
zp_plague_allow_respawn 0 // Allow respawning on plague rounds
zp_armageddon_allow_respawn 0 // Allow respawning on armageddon rounds
zp_apocalypse_allow_respawn 0 // Allow respawning on apocalypse rounds
zp_nightmare_allow_respawn 0 // Allow respawning on nightmare rounds
zp_respawn_zombies 1 // Whether to respawn killed zombies
zp_respawn_humans 1 // Whether to respawn killed humans
zp_respawn_nemesis 1 // Whether to respawn killed nemesis
zp_respawn_assassins 0 // Whether to respawn killed assassins
zp_respawn_survivors 1 // Whether to respawn killed survivors
zp_respawn_snipers 0 // Whether to respawn killed snipers

// Extra Items
// -----------
zp_extra_items 1 // Enable extra items
zp_extra_weapons 1 // Include weapons
zp_extra_nvision 1 // Include night vision
zp_extra_antidote 1 // Include antidote
zp_extra_antidote_limit 999 // Antidote purchase limit per round
zp_extra_madness 1 // Include zombie madness
zp_extra_madness_limit 999 // Zombie madness purchase limit per round
zp_extra_madness_duration 5.0 // Zombie madness duration
zp_extra_infbomb 1 // Include infection bomb
zp_extra_infbomb_limit 999 // Infection bomb purchase limit per round

// Flashlight & Nightvision
// ------------------------
zp_nvg_give 1 // Give nightvision [0-disabled // 1-enabled // 2-enabled, but no auto turning on]
zp_nvg_custom 1 // Enable custom nightvision
zp_nvg_size 80 // Nightvision size (radius)
zp_nvg_color_R 0 // Zombie custom nightvision color (red)
zp_nvg_color_G 150 // Zombie custom nightvision color (green)
zp_nvg_color_B 0 // Zombie custom nightvision color (blue)
zp_nvg_hum_color_R 0 // Human/Spectator custom nightvision color (red)
zp_nvg_hum_color_G 150 // Human/Spectator custom nightvision color (green)
zp_nvg_hum_color_B 0 // Human/Spectator custom nightvision color (blue)
zp_nvg_nem_color_R 150 // Nemesis custom nightvision color (red)
zp_nvg_nem_color_G 0 // Nemesis custom nightvision color (green)
zp_nvg_nem_color_B 0 // Nemesis custom nightvision color (blue)
zp_nvg_assa_color_R 0 // Assassin custom nightvision color (red)
zp_nvg_assa_color_G 150 // Assassin custom nightvision color (green)
zp_nvg_assa_color_B 90 // Assassin custom nightvision color (blue)
zp_flash_custom 0 // Enable custom flashlight
zp_flash_size 10 // Custom flashlight size (radius)
zp_flash_drain 1 // Custom flashlight drain rate [0-unlimited batteries]
zp_flash_charge 5 // Custom flashlight charge rate [0-non chargeable batteries]
zp_flash_distance 1000 // Custom flashlight max distance
zp_flash_color_R 100 // Custom flashlight color (red)
zp_flash_color_G 100 // Custom flashlight color (green)
zp_flash_color_B 100 // Custom flashlight color (blue)
zp_flash_show_all 1 // Let players see each other's flashlights

// Knockback
// ---------
zp_knockback 0 // Enable weapon knockback (note: pain shock free increases knockback effect)
zp_knockback_damage 1 // Use damage on knockback calculation
zp_knockback_power 1 // Use weapon power on knockback calculation
zp_knockback_zvel 0 // Should knockback affect vertical velocity
zp_knockback_ducking 0.25 // Knockback multiplier for crouched zombies [0-knockback disabled when ducking]
zp_knockback_distance 500 // Max distance for knockback to take effect
zp_knockback_nemesis 0.25 // Nemesis knockback multiplier [0-disable knockback for nemesis]
zp_knockback_assassin 0.7 // Assassin knockback multiplier [0-disable knockback for assassin]

// Longjump
// --------
zp_leap_zombies 0 // Give leap to Zombies [0-disabled // 1-enabled // 2-only first zombie // 3-only last zombie]
zp_leap_zombies_force 500 // Force multiplier
zp_leap_zombies_height 300 // Upwards force
zp_leap_zombies_cooldown 5.0 // Time between leap uses
zp_leap_nemesis 1 // Give leap to Nemesis
zp_leap_nemesis_force 500 // Force multiplier
zp_leap_nemesis_height 300 // Upwards force
zp_leap_nemesis_cooldown 5.0 // Time between leap uses
zp_leap_assassin 1 // Give leap to Assassin
zp_leap_assassin_force 500 // Force multiplier
zp_leap_assassin_height 300 // Upwards force
zp_leap_assassin_cooldown 5.0 // Time between leap uses
zp_leap_survivor 0 // Give leap to Survivor
zp_leap_survivor_force 500 // Force multiplier
zp_leap_survivor_height 300 // Upwards force
zp_leap_survivor_cooldown 5.0 // Time between leap uses
zp_leap_sniper 1 // Give leap to Sniper
zp_leap_sniper_force 500 // Force multiplier
zp_leap_sniper_height 300 // Upwards force
zp_leap_sniper_cooldown 5.0 // Time between leap uses

// Humans
// ------
zp_human_health 100 // Health
zp_human_last_extrahp 0 // Last human's extra health reward
zp_human_speed 240 // Speed [0 - use CS default weapon speeds]
zp_human_gravity 1.0 // Gravity (0.5 = half)
zp_human_armor_protect 1 // Armor needs to be reduced completely in order to get infected
zp_human_unlimited_ammo 1 // Unlimited ammo [0-disabled // 1-BP ammo // 2-clip ammo]
zp_human_damage_reward 500 // Damage humans must deal on zombies to get an ammo pack [0 - disabled]
zp_human_frags_for_kill 1 // How many frags humans get for killing a zombie

// Custom Grenades
// ---------------
zp_fire_grenades 1 // Enable napalm grenades (overrides HE)
zp_fire_duration 10 // Burning duration in seconds
zp_fire_damage 5 // Burning damage (every 0.2 secs)
zp_fire_slowdown 0.5 // Burning slowdown multiplier (0.5 = reduces velocity by a half) [0-disabled]
zp_frost_grenades 1 // Enable frost grenades (overrides FB)
zp_frost_duration 3 // Freeze duration in seconds
zp_flare_grenades 1 // Enable flare grenades (overrides SG)
zp_flare_duration 60 // Flare lightning duration in seconds
zp_flare_size 25 // Flare lightning size (radius)
zp_flare_color 0 // Flare color [0-white // 1-red // 2-green // 3-blue // 4-full random // 5-random between r,g,b]

// Zombies
// -------
zp_zombie_first_hp 2.0 // First zombie HP multiplier (2.0 = double health)
zp_zombie_armor 0.75 // Armor multiplier (0.75 = zombies take 75% damage only)
zp_zombie_hitzones 0 // Allowed hitzones bitsum (look into fun.inc for body part bits) [0-disabled]
zp_zombie_infect_health 100 // How much health a zombie regains with every infection
zp_zombie_fov 110 // Field of view [0-dont change]
zp_zombie_silent 1 // Enable silent footsteps
zp_zombie_painfree 2 // Zombies are pain shock free [0-disabled // 1-enabled // 2-only last zombie // 3-only first zombie]
zp_zombie_bleeding 1 // Zombies leave footprints/bloodstains on the floor
zp_zombie_infect_reward 1 // Ammo packs given to zombies for infecting/killing a human
zp_zombie_damage_reward 0 // Damage zombies must deal on humans/survivor to get an ammo pack [0 - disabled]
zp_zombie_frags_for_infect 1 // How many frags zombies get for infecting a human

// Special Effects
// ---------------
zp_infection_screenfade 1 // Screen fade for infected player
zp_infection_screenshake 1 // Screen shake for infected player
zp_infection_sparkle 1 // Light sparkle on infection
zp_infection_tracers 1 // Tracers on infection
zp_infection_particles 1 // Particles on infection
zp_hud_icons 1 // Display small HUD icons on infection, burning, and freeze events

// Nemesis
// -------
zp_nem_enabled 0 // Enable nemesis mode
zp_nem_chance 20 // Chance (1 in X)
zp_nem_min_players 0 // Minimum players required
zp_nem_health 150000 // Health [0 - human count*base health]
zp_nem_base_health 0 // Base health [0 - use first zombie's health]
zp_nem_speed 250 // Speed
zp_nem_gravity 0.5 // Gravity (0.5 = half)
zp_nem_damage 250 // Damage per hit
zp_nem_glow 1 // Glow effect
zp_nem_aura 1 // Halo effect
zp_nem_painfree 0 // Pain shock free
zp_nem_ignore_frags 1 // Whether to earn frags
zp_nem_ignore_rewards 1 // Whether to earn ammo packs

// Assassin
zp_assa_enabled 1 // Enable assassin mode
zp_assa_chance 50 // Chance (1 in X)
zp_assa_min_players 0 // Minimum players required
zp_assa_health 25000 // Health [0 - human count*base health]
zp_assa_base_health 0 // Base health [0 - use first zombie's health]
zp_assa_speed 650 // Speed
zp_assa_gravity 0.4 // Gravity (0.5 = half)
zp_assa_damage 250 // Damage per hit
zp_assa_glow 1 // Glow effect
zp_assa_aura 1 // Halo effect	
zp_assa_painfree 1 // Pain shock free
zp_assassin_ignore_frags 1 // Whether to earn frags
zp_assassin_ignore_rewards 1 // Whether to earn ammo packs


// Survivor
// -------
zp_surv_enabled 1 // Enable survivor mode
zp_surv_chance 20 // Chance (1 in X)
zp_surv_min_players 0 // Minimum players required
zp_surv_health 3000 // Health  [0 - zombie count*base health]
zp_surv_base_health 0 // Base health [0 - use human's health]
zp_surv_speed 230 // Speed
zp_surv_gravity 1.25 // Gravity (0.5 = half)
zp_surv_glow 1 // Glow effect
zp_surv_aura 1 // Halo effect
zp_surv_painfree 1 // Pain shock free
zp_surv_ignore_frags 1 // Whether to earn frags
zp_surv_ignore_rewards 1 // Whether to earn ammo packs
zp_surv_unlimited_ammo 2 // Unlimited ammo for Survivor [0-disabled // 1-BP ammo // 2-clip ammo]

// Sniper
zp_sni_enabled 1 // Enable sniper mode
zp_sni_chance 250 // Chance (1 in X)
zp_sni_min_players 0 // Minimum players required
zp_sni_health 3000 // Health [0 - human count*base health]
zp_sni_base_health 0 // Base health [0 - use first zombie's health]
zp_sni_speed 230 // Speed
zp_sni_gravity 0.4 // Gravity (0.5 = half)
zp_sni_glow 1 // Glow effect
zp_sni_aura 1 // Halo effect
zp_sni_painfree 0 // Pain shock free
zp_sniper_ignore_frags 1 // Whether to earn frags
zp_sniper_ignore_rewards 1 // Whether to earn ammo packs 
zp_sni_damage 4500 // Damage done by one bullet of the sniper's weapon [value must be float/decimal]
zp_sni_unlimited_ammo 2 // Unlimited ammo for Sniper [0-disabled // 1-BP ammo]


// Swarm Mode
// ----------
zp_swarm_enabled 1 // Enable swarm mode
zp_swarm_chance 20 // Chance (1 in X)
zp_swarm_min_players 0 // Minimum players required

// Multiple Infection
// ------------------
zp_multi_enabled 1 // Enable multiple infection mode
zp_multi_chance 20 // Chance (1 in X)
zp_multi_min_players 0 // Minimum players required
zp_multi_ratio 0.15 // Infect ratio (zombie count = ratio*humans count)

// Plague Mode
// -----------
zp_plague_enabled 1 // Enable plague mode
zp_plague_chance 30 // Chance (1 in X)
zp_plague_min_players 0 // Minimum players required
zp_plague_ratio 0.5 // Infect ratio (zombie count = ratio*humans count)
zp_plague_nem_number 1 // Nemesis count
zp_plague_nem_hp_multi 0.5 // Nemesis HP multiplier (0.5 = 50% health)
zp_plague_surv_number 1 // Survivor count
zp_plague_surv_hp_multi 0.5 // Survivor HP multiplier (0.5 = 50% health)

// Cvars - Armageddon Mode
// ------------------------
zp_armageddon_enabled 1 // Enable armageddon mode
zp_armageddon_chance 30 // Chance (1 in X)
zp_armageddon_min_players 0 // Minimum players required
zp_armageddon_ratio 0.5 // Infect ratio (zombie count = ratio*humans count)
zp_armageddon_nemesis_hp_multi 0.5 // Nemesis HP multiplier (0.5 = 50% health)
zp_armageddon_survivor_hp_multi 3.5 // Survivor HP multiplier (0.5 = 50% health)

// Cvars - Apocalypse Mode
// ------------------------
zp_apocalypse_enabled 1 // Enable apocalypse mode
zp_apocalypse_chance 30 // Chance (1 in X)
zp_apocalypse_min_players 0 // Minimum players required
zp_apocalypse_ratio 0.5 // Infect ratio (zombie count = ratio*humans count)
zp_apocalypse_assassin_hp_multi 2 // Assassin HP multiplier (0.5 = 50% health)
zp_apocalypse_sniper_hp_multi 3 // Sniper HP multiplier (0.5 = 50% health)

// Cvars - Nightmare Mode
// ------------------------
zp_nightmare_enabled 1 // Enable nightmare mode
zp_nightmare_chance 40 // Chance (1 in X)
zp_nightmare_min_players 0 // Minimum players required
zp_nightmare_ratio 0.5 // Infect ratio (zombie count = ratio*humans count)
zp_nightmare_assassin_hp_multi 2 // Assassin HP multiplier (0.5 = 50% health)
zp_nightmare_sniper_hp_multi 3 // Sniper HP multiplier (0.5 = 50% health)
zp_nightmare_nemesis_hp_multi 0.5 // Nemesis HP multiplier (0.5 = 50% health)
zp_nightmare_survivor_hp_multi 3.5 // Survivor HP multiplier (0.5 = 50% health)


// Logging
// -------
zp_logcommands 1 // Log admin commands to "zombieplague.log"

// Additional settings
// -------------------
mp_flashlight 1 // Enables flashlight
mp_footsteps 1 // Enables footsteps
mp_playerid 1 // Prevents seeing enemies in the dark exploit
sv_maxspeed 9999 // Prevents CS from limiting your human/zombie speeds at 320
mp_buytime 99 // Prevents CS buytime messing up ZP buytime cvar
zombie_plague.txt

Code: Select all

[en]
NOTICE_INFO1 = Press M to show the game menu
NOTICE_INFO2 = Press , or . to purchase ammo
NOTICE_VIRUS_FREE = The T-Virus has been set loose...
NOTICE_FIRST = %s is the first zombie !!
NOTICE_INFECT = %s's brains has been eaten...
NOTICE_INFECT2 = %s's brains has been eaten by %s...
NOTICE_ANTIDOTE = %s has used an antidote...
NOTICE_NEMESIS = %s is a Nemesis !!!
NOTICE_ASSASSIN = %s is a Assassin !!!
NOTICE_SURVIVOR = %s is a Survivor !!!
NOTICE_SNIPER = %s is a Sniper !!!
NOTICE_SWARM = Swarm Mode !!!
NOTICE_MULTI = Multiple Infection !!!
NOTICE_PLAGUE = Plague Mode !!!
NOTICE_ARMAGEDDON = Armageddon Mode !!!
NOTICE_APOCALYPSE = Apocalypse Mode !!!
NOTICE_NIGHTMARE = Nightmare Mode !!!

WIN_HUMAN = Humans defeated the plague!
WIN_ZOMBIE = Zombies have taken over the world!
WIN_NO_ONE = No one won...

CMD_INFECT = turned into a Zombie
CMD_DISINFECT = turned back to Human
CMD_NEMESIS = turned into a Nemesis
CMD_ASSASSIN = turned into a Assassin
CMD_SURVIVAL = turned into a Survivor
CMD_SNIPER = turned into a Sniper
CMD_SWARM = start Swarm Mode
CMD_MULTI = start Multiple Infection
CMD_PLAGUE = start Plague Mode
CMD_ARMAGEDDON = start Armageddon Mode
CMD_APOCALYPSE = start Apocalypse Mode
CMD_NIGHTMARE = start Nightmare Mode
CMD_RESPAWN = respawned
CMD_NOT = Unavailable command.
CMD_ZOMBIE_ONLY = This is only available to zombies.
CMD_HUMAN_ONLY = This is only available to humans.
CMD_NOT_STUCK = You are not stuck.
CMD_NOT_ACCESS = You have no access.
CMD_NOT_CANTUSE = You can't use this right now.
CMD_NOT_EXTRAS = Extra Items are disabled.
CMD_NOT_ZCLASSES = Zombie Classes are disabled.

MENU_BUY = Buy Weapons
MENU_EXTRABUY = Buy Extra Items
MENU_ZCLASS = Choose Zombie Class
MENU_UNSTUCK = Unstuck
MENU_ADMIN = Admin Menu
MENU_INFO = Help
MENU_SPECTATOR = Join Spectators

MENU_BUY1_TITLE = Primary Weapon
MENU_BUY2_TITLE = Secondary Weapon
MENU_ZCLASS_TITLE = Zombie Class
MENU_EXTRA_TITLE = Extra Items
MENU_ADMIN_TITLE = Admin Menu
MENU_ADMIN_MODES_TITLE = Admin Modes Menu
MENU_INFO_TITLE = Plugin Information

MENU_EXTRA1 = NightVision (single round)
MENU_EXTRA2 = T-Virus Antidote
MENU_EXTRA3 = Zombie Madness
MENU_EXTRA4 = Infection Bomb
MENU_ADMIN1 = Make Zombie/Human
MENU_ADMIN2 = Make Nemesis
MENU_ADMIN3 = Make Survivor
MENU_ADMIN4 = Respawn Someone
MENU_ADMIN5 = Start Swarm Mode
MENU_ADMIN6 = Start Multiple Infection
MENU_ADMIN7 = Start Plague Mode
MENU_ADMIN8 = Make Sniper
MENU_ADMIN9 = Make Assassin
MENU_ADMIN10 = Admin Mode Menu
MENU_ADMIN11 = Start Armageddon Mode
MENU_ADMIN12 = Start Apocalypse Mode
MENU_ADMIN13 = Start Nightmare Mode
MENU_INFO1 = General
MENU_INFO2 = Humans
MENU_INFO3 = Zombies
MENU_INFO4 = Gameplay Modes

MENU_AUTOSELECT = Remember Selection
MENU_BACK = Back
MENU_NEXT = Next
MENU_EXIT = Exit

MOTD_INFO11 = <meta charset=UTF-8><body bgcolor=\"#000000\"><font color=\"#FF0505\"><b>%s %s by %s :</b> is a Counter-Strike plugin developed for AMX Mod X, in which humans and zombies are confronted. It is based on the classic zombie infection mod: on every round a random player is picked to be the first zombie who has to infect everyone else. 
MOTD_INFO12 = But there are new features and enhancements. For instance, you are able to buy extra items (such as weapons) in exchange of ammo packs. You can get ammo packs by killing zombies/infecting humans.<br><br><br><u>Current server settings:</u><br>
MOTD_INFO1_A = <br>Ambience Effects:
MOTD_INFO1_B = <br>Lightning Level: %s
MOTD_INFO1_C = <br>Triggered Lights: %L
MOTD_INFO1_D = <br>Thunderclaps Every: %d seconds
MOTD_INFO1_E = <br>Doors: %L
MOTD_INFO1_F = <br>Deathmatch: %L
MOTD_INFO1_G = <br>Spawn Protection Time: %d seconds
MOTD_INFO1_H = <br>Random Spawning: %L
MOTD_INFO1_I = <br>Extra Items: %L
MOTD_INFO1_J = <br>Zombie Classes: %L
MOTD_INFO1_K = <br>Custom Nightvision: %L
MOTD_INFO1_L = <br>Custom Flashlight: %L
MOTD_INFO2 = <meta charset=UTF-8><body bgcolor=\"#000000\"><font color=\"#FF0505\"><b>Humans:</b> their objective is to eliminate any zombie threat. They have a big arsenal of weapons to choose from, and use flashlights on dark maps. Team work is a must to survive.<br><br><br><u>Current server settings:</u><br>
MOTD_INFO2_A = <br>Health: %d
MOTD_INFO2_B = <br>Health Reward for Last Human: %d
MOTD_INFO2_C = <br>Speed: %d
MOTD_INFO2_D = <br>Gravity: %d
MOTD_INFO2_E = <br>Ammo: %L
MOTD_INFO2_F = <br>Damage to Get an Ammo Pack: %d
MOTD_INFO2_G = <br>Fire Grenades: %L
MOTD_INFO2_H = <br>Frost Grenades: %L
MOTD_INFO2_I = <br>Flare Grenades: %L
MOTD_INFO2_J = <br>Knockback: %L
MOTD_INFO3 = <meta charset=UTF-8><body bgcolor=\"#000000\"><font color=\"#FF0505\"><b>Zombies:</b> their objective is to infect every alive human. They are able to see in the dark, but can only attack melee. There are many zombie classes to choose from, each with his own strenghts and weaknesses, but all capable of eating brains.<br><br><br><u>Current server settings:</u><br>
MOTD_INFO3_A = <br>Zombie Health: %d
MOTD_INFO3_B = <br>First Zombie Health: %d
MOTD_INFO3_C = <br>Armor: %d%% damage taken
MOTD_INFO3_D = <br>Speed: %d
MOTD_INFO3_E = <br>Gravity: %d
MOTD_INFO3_F = <br>HP for Infection: %d
MOTD_INFO3_G = <br>Pain Shock Free: %L
MOTD_INFO3_H = <br>Bleeding: %L
MOTD_INFO3_I = <br>Ammo Packs for Infection: %d
MOTD_INFO4 = <meta charset=UTF-8><body bgcolor=\"#000000\"><font color=\"#FF0505\"><b>Mini-Games:</b> there are 5 special gameplay modes that may randomly take place during the course of the game.<br><br><br><u>Current server settings:</u><br>
MOTD_INFO4_A = <br>Nemesis: %L
MOTD_INFO4_B = <br>Nemesis Chance: 1 in %d
MOTD_INFO4_C = <br>Nemesis Health: %s
MOTD_INFO4_D = <br>Nemesis Speed: %d
MOTD_INFO4_E = <br>Nemesis Gravity: %d
MOTD_INFO4_F = <br>Nemesis Leap: %L
MOTD_INFO4_G = <br>Nemesis Pain Shock Free: %L
MOTD_INFO4_H = <br><br>Survivor: %L
MOTD_INFO4_I = <br>Survivor Chance: 1 in %d
MOTD_INFO4_J = <br>Survivor Health: %s
MOTD_INFO4_K = <br>Survivor Speed: %d
MOTD_INFO4_L = <br>Survivor Gravity: %d
MOTD_INFO4_M = <br>Survivor Leap: %L
MOTD_INFO4_N = <br>Survivor Pain Shock Free: %L
MOTD_INFO4_O = <br><br>Swarm Mode: %L
MOTD_INFO4_P = <br>Swarm Mode Chance: 1 in %d
MOTD_INFO4_Q = <br><br>Multi Infection: %L
MOTD_INFO4_R = <br>Multi Infection Chance: 1 in %d
MOTD_INFO4_S = <br>Infection Ratio: %d%%
MOTD_INFO4_T = <br><br>Plague Mode: %L
MOTD_INFO4_U = <br>Plague Mode Chance: 1 in %d
MOTD_INFO4_V = <br>Infection Ratio: %d%%
MOTD_INFO5_A = <br><br>Sniper: %L
MOTD_INFO5_B = <br>Sniper Chance: 1 in %d
MOTD_INFO5_C = <br>Sniper Health: %s
MOTD_INFO5_D = <br>Sniper Speed: %d
MOTD_INFO5_E = <br>Sniper Gravity: %d
MOTD_INFO5_F = <br>Sniper Leap: %L
MOTD_INFO5_G = <br>Sniper Pain Shock Free: %L
MOTD_INFO5_H = <br>Sniper Bullet Damage: %d
MOTD_INFO6_A = <br><br>Assassin: %L
MOTD_INFO6_B = <br>Assassin Chance: 1 in %d
MOTD_INFO6_C = <br>Assassin Health: %s
MOTD_INFO6_D = <br>Assassin Speed: %d
MOTD_INFO6_E = <br>Assassin Gravity: %d
MOTD_INFO6_F = <br>Assassin Leap: %L
MOTD_INFO6_G = <br>Assassin Pain Shock Free: %L
MOTD_INFO6_H = <br><br>Armageddon Mode: %L
MOTD_INFO6_I = <br>Armageddon Mode Chance: 1 in %d
MOTD_INFO6_J = <br>Infection Ratio: %d%%
MOTD_INFO7_H = <br><br>Apocalypse Mode: %L
MOTD_INFO7_I = <br>Apocalypse Mode Chance: 1 in %d
MOTD_INFO7_J = <br>Infection Ratio: %d%%
MOTD_INFO8_H = <br><br>Nightmare Mode: %L
MOTD_INFO8_I = <br>Nightmare Mode Chance: 1 in %d
MOTD_INFO8_J = <br>Infection Ratio: %d%%


MOTD_ENABLED = Enabled
MOTD_DISABLED = Disabled
MOTD_FOG = Fog
MOTD_RAIN = Rain
MOTD_SNOW = Snow
MOTD_ROTATING = Rotating doors removed
MOTD_DOORS = All doors removed
MOTD_DM_HUMAN = Respawn as human
MOTD_DM_ZOMBIE = Respawn as zombie
MOTD_LIMITED = Limited
MOTD_AMMO_BP = Unlimited reloads
MOTD_AMMO_CLIP = Unlimited clip
MOTD_LASTZOMBIE = Only on last zombie

ZOMBIE_ATTRIB1 = Health
ZOMBIE_ATTRIB2 = Speed
ZOMBIE_ATTRIB3 = Gravity
ZOMBIE_ATTRIB4 = Knockback

CLASS_CLASS = Class:
CLASS_HUMAN = Human
CLASS_ZOMBIE = Zombie
CLASS_SURVIVOR = Survivor
CLASS_SNIPER = Sniper
CLASS_NEMESIS = Nemesis
CLASS_ASSASSIN = Assassin

LAST_ZOMBIE_LEFT = The last zombie has left, %s is the new zombie.
LAST_HUMAN_LEFT = The last human has left, %s is the new human.
NOT_ENOUGH_AMMO = You dont have enough ammo packs.
AMMO_BOUGHT = You purchased extra ammo for your guns.
ZOMBIE_SELECT = Your zombie class after the next infection will be
BUY_ENABLED = Your buy menu has been re-enabled.
AMMO_PACKS1 = Ammo packs:
AMMO_PACKS2 = ammo packs
ARMOR = Armor:
SPECTATING = Spectating:
AIM_INFO = %s^n[ %s | Health: %d | Armor: %d | Ammo Packs: %d ]

[es]
NOTICE_INFO1 = Presiona M para mostrar el menú de juego
NOTICE_INFO2 = Presiona , o . para comprar munición
NOTICE_VIRUS_FREE = El Virus-T se ha liberado...
NOTICE_FIRST = %s es el primer zombie !!
NOTICE_INFECT = %s ha perdido su cerebro...
NOTICE_INFECT2 = %s ha perdido su cerebro a manos de %s...
NOTICE_ANTIDOTE = %s ha usado un antídoto...
NOTICE_NEMESIS = %s es un Nemesis !!!
NOTICE_SURVIVOR = %s es un Survivor !!!
NOTICE_SWARM = Modo Swarm !!!
NOTICE_MULTI = Infección Multiple !!!
NOTICE_PLAGUE = Modo Plague !!!

WIN_HUMAN = Los Humanos han vencido la plaga!
WIN_ZOMBIE = Los Zombies han tomado el mundo!
WIN_NO_ONE = Nadie ha ganado...

CMD_INFECT = convertido en Zombie
CMD_DISINFECT = convertido en Humano
CMD_NEMESIS = convertido en Nemesis
CMD_SURVIVAL = convertido en Survivor
CMD_SWARM = comenzar Modo Swarm
CMD_MULTI = comenzar Infeccion Multiple
CMD_PLAGUE = comenzar Modo Plague
CMD_RESPAWN = revivido
CMD_NOT = Comando no disponible.
CMD_ZOMBIE_ONLY = Esto sólo está disponible para zombies.
CMD_HUMAN_ONLY = Esto sólo está disponible para humanos.
CMD_NOT_STUCK = No estás trabado.
CMD_NOT_ACCESS = No tienes acceso.
CMD_NOT_CANTUSE = No puedes usar esto ahora.
CMD_NOT_EXTRAS = Los Items Extra están deshabilitados.
CMD_NOT_ZCLASSES = Las Clases de Zombie están deshabilitadas.

MENU_BUY = Comprar Armas
MENU_EXTRABUY = Comprar Items Extra
MENU_ZCLASS = Elegir Clase de Zombie
MENU_UNSTUCK = Destrabar (unstuck)
MENU_ADMIN = Menú de Admin
MENU_INFO = Ayuda
MENU_SPECTATOR = Unirse a Espectador

MENU_BUY1_TITLE = Arma Primaria
MENU_BUY2_TITLE = Arma Secundaria
MENU_ZCLASS_TITLE = Clase de Zombie
MENU_EXTRA_TITLE = Items Extra
MENU_ADMIN_TITLE = Mení de Admin
MENU_INFO_TITLE = Información del Plugin

MENU_EXTRA1 = NightVision (una ronda)
MENU_EXTRA2 = Antídoto del Virus-T
MENU_EXTRA3 = Furia Zombie
MENU_EXTRA4 = Bomba de Infección
MENU_ADMIN1 = Hacer Zombie/Humano
MENU_ADMIN2 = Hacer Nemesis
MENU_ADMIN3 = Hacer Survivor
MENU_ADMIN4 = Revivir a Alguien
MENU_ADMIN5 = Comenzar Modo Swarm
MENU_ADMIN6 = Comenzar Infección Multiple
MENU_ADMIN7 = Comenzar Modo Plague
MENU_INFO1 = General
MENU_INFO2 = Humanos
MENU_INFO3 = Zombies
MENU_INFO4 = Modos de Juego

MENU_AUTOSELECT = Recordar Selección
MENU_BACK = Anterior
MENU_NEXT = Siguiente
MENU_EXIT = Salir

MOTD_INFO11 = <meta charset=UTF-8><body bgcolor=\"#000000\"><font color=\"#FF0505\"><b>%s %s por %s :</b> es un plugin de Counter-Strike hecho para AMX Mod X, donde se enfrentan humanos y zombies. Está basado en el clásico zombie infection mod: en cada ronda un jugador al azar es elegido para ser el primer zombie, quien deberá infectar a los demás.
MOTD_INFO12 = Pero hay nuevas características y mejoras. Por ejemplo, se puede comprar items extra (como armas) a cambio de ammo packs. Los ammo packs se consiguen matando zombies/infectando humanos.<br><br><br><u>Configuración actual del servidor:</u><br>
MOTD_INFO1_A = <br>Efectos Ambientales:
MOTD_INFO1_B = <br>Nivel de Iluminación: %s
MOTD_INFO1_C = <br>Luces de Interrumptores: %L
MOTD_INFO1_D = <br>Relámpagos cada: %d segundos
MOTD_INFO1_E = <br>Puertas: %L
MOTD_INFO1_F = <br>Deathmatch: %L
MOTD_INFO1_G = <br>Protección de Spawn: %d segundos
MOTD_INFO1_H = <br>Spawn Aleatorio: %L
MOTD_INFO1_I = <br>Items Extra: %L
MOTD_INFO1_J = <br>Clases de Zombie: %L
MOTD_INFO1_K = <br>Visión Nocturna Personalizada: %L
MOTD_INFO1_L = <br>Linterna Personalizada: %L
MOTD_INFO2 = <meta charset=UTF-8><body bgcolor=\"#000000\"><font color=\"#FF0505\"><b>Humanos:</b> su objetivo es eliminar toda amenaza zombie. Tienen un gran arsenal de armas para elegir, y usan linternas en mapas oscuros. El trabajo en equipo es indispensable para sobrevivir.<br><br><br><u>Configuración actual del servidor:</u><br>
MOTD_INFO2_A = <br>Vida: %d
MOTD_INFO2_B = <br>Vida Adicional para Ultimo Humano: %d
MOTD_INFO2_C = <br>Velocidad: %d
MOTD_INFO2_D = <br>Gravedad: %d
MOTD_INFO2_E = <br>Munición: %L
MOTD_INFO2_F = <br>Daño para Conseguir un Ammo Pack: %d
MOTD_INFO2_G = <br>Granadas de Fuego: %L
MOTD_INFO2_H = <br>Granadas de Hielo: %L
MOTD_INFO2_I = <br>Granadas de Luz: %L
MOTD_INFO2_J = <br>Knockback: %L
MOTD_INFO3 = <meta charset=UTF-8><body bgcolor=\"#000000\"><font color=\"#FF0505\"><b>Zombies:</b> su objetivo es infectar a todos los humanos. Pueden ver en la oscuridad, pero sólo atacan a corto rango. Hay distintas clases de zombie para elegir, cada una con sus propias fortalezas y debilidades, pero todas capaces de comer cerebros por igual.<br><br><br><u>Configuración actual del servidor:</u><br>
MOTD_INFO3_A = <br>Vida de Zombie: %d
MOTD_INFO3_B = <br>Vida de Primer Zombie: %d
MOTD_INFO3_C = <br>Armadura: %d%% daño recibido
MOTD_INFO3_D = <br>Velocidad: %d
MOTD_INFO3_E = <br>Gravedad: %d
MOTD_INFO3_F = <br>HP por Infección: %d
MOTD_INFO3_G = <br>Velocidad no Afectada por Daño: %L
MOTD_INFO3_H = <br>Sangrado: %L
MOTD_INFO3_I = <br>Ammo Packs por Infección: %d
MOTD_INFO4 = <meta charset=UTF-8><body bgcolor=\"#000000\"><font color=\"#FF0505\"><b>Mini-juegos</b> hay 5 modos especiales que pueden tener lugar aleatoriamente durante el transcurso del juego.<br><br><br><u>Configuración actual del servidor:</u><br>
MOTD_INFO4_A = <br>Nemesis: %L
MOTD_INFO4_B = <br>Chance de Nemesis: 1 en %d
MOTD_INFO4_C = <br>Vida de Nemesis: %s
MOTD_INFO4_D = <br>Velocidad de Nemesis: %d
MOTD_INFO4_E = <br>Gravedad de Nemesis: %d
MOTD_INFO4_F = <br>Salto Largo de Nemesis: %L
MOTD_INFO4_G = <br>Velocidad no Afectada por Daño para Nemesis: %L
MOTD_INFO4_H = <br><br>Survivor: %L
MOTD_INFO4_I = <br>Chance de Survivor: 1 en %d
MOTD_INFO4_J = <br>Vida de Survivor: %s
MOTD_INFO4_K = <br>Velocidad de Survivor: %d
MOTD_INFO4_L = <br>Gravedad de Survivor: %d
MOTD_INFO4_M = <br>Salto Largo de Survivor: %L
MOTD_INFO4_N = <br>Velocidad no Afectada por Daño para Survivor: %L
MOTD_INFO4_O = <br><br>Modo Swarm: %L
MOTD_INFO4_P = <br>Chance de Modo Swarm: 1 en %d
MOTD_INFO4_Q = <br><br>Multi Infección: %L
MOTD_INFO4_R = <br>Chance de Multi Infección: 1 en %d
MOTD_INFO4_S = <br>Indice de Infección: %d%%
MOTD_INFO4_T = <br><br>Modo Plague: %L
MOTD_INFO4_U = <br>Chance de Modo Plague: 1 en %d
MOTD_INFO4_V = <br>Indice de Infección: %d%%

MOTD_ENABLED = Habilitado
MOTD_DISABLED = Deshabilitado
MOTD_FOG = Niebla
MOTD_RAIN = Lluvia
MOTD_SNOW = Nieve
MOTD_ROTATING = Puertas giratorias removidas
MOTD_DOORS = Todas las puertas removidas
MOTD_DM_HUMAN = Renacer como humano
MOTD_DM_ZOMBIE = Renacer como zombie
MOTD_LIMITED = Limitada
MOTD_AMMO_BP = Recargas ilimitadas
MOTD_AMMO_CLIP = Cartucho ilimitado
MOTD_LASTZOMBIE = Sólo en el último zombie

ZOMBIE_ATTRIB1 = Vida
ZOMBIE_ATTRIB2 = Velocidad
ZOMBIE_ATTRIB3 = Gravedad
ZOMBIE_ATTRIB4 = Knockback

CLASS_CLASS = Clase:
CLASS_HUMAN = Humano
CLASS_ZOMBIE = Zombie
CLASS_SURVIVOR = Survivor
CLASS_NEMESIS = Nemesis

ARMOR_ARMOR = armor
LAST_ZOMBIE_LEFT = El último zombie se ha ido, %s es el nuevo zombie.
LAST_HUMAN_LEFT = El último humano se ha ido, %s es el nuevo humano.
NOT_ENOUGH_AMMO = No tienes suficientes ammo packs.
AMMO_BOUGHT = Has comprado munición extra para tus armas.
ZOMBIE_SELECT = En tu próxima infección tu clase será
BUY_ENABLED = El menú de compra ha sido re-activado.
AMMO_PACKS1 = Ammo packs:
AMMO_PACKS2 = ammo packs
SPECTATING = Siguiendo a:

[bp]
NOTICE_INFO1 = Aperte M para mostrar o menu do jogo.
NOTICE_INFO2 = Aperte , ou . para comprar municao.
NOTICE_VIRUS_FREE = O Virus-T foi libertado...
NOTICE_FIRST = %s e o primeiro zombie!
NOTICE_INFECT = %s teve seu cerebro comido...
NOTICE_INFECT2 = %s foi Infectado por %s. CORRA!
NOTICE_ANTIDOTE = %s usou um antidoto...
NOTICE_NEMESIS = %s e o NEMESIS ! Fuja ou se esconda !
NOTICE_SURVIVOR = %s e o SURVIVOR... Boa Sote !
NOTICE_SWARM = Modo Swarm !
NOTICE_MULTI = Infeccao Multipla !
NOTICE_PLAGUE = Modo Plague !

WIN_HUMAN = O T-Virus foi extinto do mundo, os Humanos ganharam!
WIN_ZOMBIE = O T-Virus dominou o mundo. A Humanidade foi extinta!
WIN_NO_ONE = Resta uma unica pergunta... Ha sobreviventes deste terrivel ataque?

CMD_INFECT = Convertido em Zombie
CMD_DISINFECT = Convertido em Humano
CMD_NEMESIS = Convertido em Nemesis
CMD_SURVIVAL = Convertido em Survivor
CMD_SWARM = Comecar Modo Swarm
CMD_MULTI = Comecar Infeccao Multipla
CMD_PLAGUE = Comecar Modo Plague
CMD_RESPAWN = Revivido
CMD_NOT = Comando nao disponivel.
CMD_ZOMBIE_ONLY = Comando apenas para zombies.
CMD_HUMAN_ONLY = Comando apenas para humanos.
CMD_NOT_STUCK = Nao estas encravado.
CMD_NOT_ACCESS = Voce nao tem acesso a este comando!
CMD_NOT_CANTUSE = Nao pode usar agora.
CMD_NOT_EXTRAS = Itens extras desligados!
CMD_NOT_ZCLASSES = Classes de zombie desligadas!

MENU_BUY = Comprar armas
MENU_EXTRABUY = Comprar itens extra
MENU_ZCLASS = Eleger classe de zombie
MENU_UNSTUCK = Desencravar (unstuck)
MENU_ADMIN = Menu de admin
MENU_INFO = Ajuda
MENU_SPECTATOR = Entrar no modo Espectator

MENU_BUY1_TITLE = Arma primaria
MENU_BUY2_TITLE = Arma secundaria
MENU_ZCLASS_TITLE = Classe de zombie
MENU_EXTRA_TITLE = Itens extra
MENU_ADMIN_TITLE = Menu de admin
MENU_INFO_TITLE = Informacao do plugin

MENU_EXTRA1 = NightVision (uma ronda)
MENU_EXTRA2 = Antidoto do Virus-T
MENU_EXTRA3 = Furia zombie
MENU_EXTRA4 = Bomba de infeccao
MENU_ADMIN1 = Transformar em Zombie/Humano
MENU_ADMIN2 = Transformar em Nemesis
MENU_ADMIN3 = Transformar em Survivor
MENU_ADMIN4 = Reviver cliente
MENU_ADMIN5 = Comecar modo swarm
MENU_ADMIN6 = Comecar infeccao multipla
MENU_ADMIN7 = Comecar modo plague
MENU_INFO1 = General
MENU_INFO2 = Humanos
MENU_INFO3 = Zombies
MENU_INFO4 = Modos de Jogo

MENU_AUTOSELECT = Lembrar Selecao
MENU_BACK = Voltar
MENU_NEXT = Proxima
MENU_EXIT = Sair

MOTD_INFO11 = <meta charset=UTF-8><body bgcolor=\"#000000\"><font color=\"#FF0505\"><b>%s %s por %s :</b> &eacute; um plugin para Counter-Strike feito em AMX Mod X, onde se enfrentam humanos e zombies. Est&aacute; baseado no Classico Zombie Infection MOD: em cada ronda um jogador &eacute; infectado, e tem a proesa de espalhar o seu v&iacute;rus, o famoso V&iacute;rus-T.
MOTD_INFO12 = Novas caracter&iacute;sticas melhoradas. Por exemplo: pode-se comprar itens extra (como armas) e trocar por ammo packs. Os ammo packs s&atildeo obtidos matando zombies ou infectando humanos.<br><br><br><u>Configura&ccedil;&atilde;o actual do servidor:</u><br>
MOTD_INFO1_A = <br>Efeitos ambiente:
MOTD_INFO1_B = <br>Nivel de ilumina&ccedil;&atilde;o: %s
MOTD_INFO1_C = <br>Luzes de interrumptores: %L
MOTD_INFO1_D = <br>Rel&acirc;mpagos cada: %d segundos
MOTD_INFO1_E = <br>Portas: %L
MOTD_INFO1_F = <br>Deathmatch: %L
MOTD_INFO1_G = <br>Protec&ccedil;&atilde;o de spawn: %d segundos
MOTD_INFO1_H = <br>Spawn aleat&oacute;rio: %L
MOTD_INFO1_I = <br>Itens extra: %L
MOTD_INFO1_J = <br>Classes de zombie: %L
MOTD_INFO1_K = <br>Vis&atilde;o noturna personalizada: %L
MOTD_INFO1_L = <br>Lanterna personalizada: %L
MOTD_INFO2 = <meta charset=UTF-8><body bgcolor=\"#000000\"><font color=\"#FF0505\"><b>Humanos:</b> o seu objetivo &eacute; eliminar qualquer amea&ccedil;a zombie. Tem um grande arsenal de armas para escolher, e usam lanternas em mapas escuros. O trabalho em equipa &eacute; indispens&aacute;vel para sobreviver.<br><br><br><u>Configura&ccedil;&atilde;o actual do servidor:</u><br>
MOTD_INFO2_A = <br>Vida: %d
MOTD_INFO2_B = <br>Recompensa de vida para o &uacute;ltimo humano: %d
MOTD_INFO2_C = <br>Velocidade: %d
MOTD_INFO2_D = <br>Gravidade: %d
MOTD_INFO2_E = <br>Muni&ccedil;&otilde;es: %L
MOTD_INFO2_F = <br>Estrago para conseguir um Ammo Pack: %d
MOTD_INFO2_G = <br>Granadas de fogo: %L
MOTD_INFO2_H = <br>Granadas de congela&ccedil;&atilde;: %L
MOTD_INFO2_I = <br>Granadas flash: %L
MOTD_INFO2_J = <br>Knockback: %L
MOTD_INFO3 = <meta charset=UTF-8><body bgcolor=\"#000000\"><font color=\"#FF0505\"><b>Zombies:</b> o seu objetivo &eacute;  infectar todos os humanos. Podem ver na escurid&atilde;o, mas s&oacute; atacam de perto. H&aacute; 6 classes distintas de zombie, cada uma com suas pr&oacute;prias habilidades e caracter&iacute;sticas, mas todas com fome de um bom cerebro.<br><br><br><u>Configura&ccedil;&atilde;o atual do servidor:</u><br>
MOTD_INFO3_A = <br>Vida de zombie: %d
MOTD_INFO3_B = <br>Vida do primeiro zombie: %d
MOTD_INFO3_C = <br>Armadura: %d%% estrago recebido
MOTD_INFO3_D = <br>Velocidade: %d
MOTD_INFO3_E = <br>Gravidade: %d
MOTD_INFO3_F = <br>HP por infec&ccedil;&atilde;o: %d
MOTD_INFO3_G = <br>Velocidade n&atilde;o afectada por estragp: %L
MOTD_INFO3_H = <br>Sangrado: %L
MOTD_INFO3_I = <br>Ammo Packs por infec&ccedil;&atilde;o: %d
MOTD_INFO4 = <meta charset=UTF-8><body bgcolor=\"#000000\"><font color=\"#FF0505\"><b>Mini-jogos:</b> h&aacute; 4 distintos modos de jogo especiais que ocorrer&atilde;o aleatoriamente durante este jogo.<br><br><br><u>Configura&ccedil;&atilde;o actual do servidor:</u><br>
MOTD_INFO4_A = <br>Nemesis: %L
MOTD_INFO4_B = <br>Chance de Nemesis: 1 em %d
MOTD_INFO4_C = <br>Vida de Nemesis: %s
MOTD_INFO4_D = <br>Velocidade de Nemesis: %d
MOTD_INFO4_E = <br>Gravidade de Nemesis: %d
MOTD_INFO4_F = <br>Salto Largo de Nemesis: %L
MOTD_INFO4_G = <br>Velocidade n&atilde;o afectada por estrago para Nemesis: %L
MOTD_INFO4_H = <br><br>Survivor: %L
MOTD_INFO4_I = <br>Chance de Survivor: 1 em %d
MOTD_INFO4_J = <br>Vida de Survivor: %s
MOTD_INFO4_K = <br>Velocidade de Survivor: %d
MOTD_INFO4_L = <br>Gravidade de Survivor: %d
MOTD_INFO4_M = <br>Salto Largo de Survivor: %L
MOTD_INFO4_N = <br>Velocidade n&atilde;o afectada por estrago para Survivor: %L
MOTD_INFO4_O = <br><br>Modo Swarm: %L
MOTD_INFO4_P = <br>Chance de modo Swarm: 1 em %d
MOTD_INFO4_Q = <br><br>Multi infec&ccedil;&atilde;o: %L
MOTD_INFO4_R = <br>Chance de multi infec&ccedil;&atilde;o: 1 en %d
MOTD_INFO4_S = <br>Indice de infec&ccedil;&atilde;o: %d%%
MOTD_INFO4_T = <br><br>Modo Plague: %L
MOTD_INFO4_U = <br>Chance de modo Plague: 1 em %d
MOTD_INFO4_V = <br>Indice de infec&ccedil;&atilde;o: %d%%

MOTD_ENABLED = Habilitado
MOTD_DISABLED = Desabilitado
MOTD_FOG = Neblina
MOTD_RAIN = Chuva
MOTD_SNOW = Neve
MOTD_ROTATING = Portas girat&oacute;rias removidas
MOTD_DOORS = Todas as portas foram removidas
MOTD_DM_HUMAN = Renascer como humano
MOTD_DM_ZOMBIE = Renascer como zombie
MOTD_LIMITED = Muni&ccedil;&oacute;o limitada
MOTD_AMMO_BP = Muni&ccedil;&oacute;o ilimitada
MOTD_AMMO_CLIP = Sem carregar armas
MOTD_LASTZOMBIE = Sempre o &uacute;ltimo zombie

ZOMBIE_ATTRIB1 = Vida
ZOMBIE_ATTRIB2 = Velocidade
ZOMBIE_ATTRIB3 = Gravidade
ZOMBIE_ATTRIB4 = Impacto

CLASS_CLASS = Classe:
CLASS_HUMAN = Humano
CLASS_ZOMBIE = Zombie
CLASS_SURVIVOR = Survivor
CLASS_NEMESIS = Nemesis

LAST_ZOMBIE_LEFT = O ultimo zombie saiu, %s e o novo zombie.
LAST_HUMAN_LEFT = O ultimo humano saiu, %s e o novo humano.
NOT_ENOUGH_AMMO = Nao tem suficientes ammo packs.
AMMO_BOUGHT = Voce comprou Municao Extra.
ZOMBIE_SELECT = Voce esta na seguinte classe de Zombies:
BUY_ENABLED = O seu menu de compras foi re-ativado.
AMMO_PACKS1 = Ammo packs:
AMMO_PACKS2 = ammo packs
SPECTATING = Voce esta Assistindo:

[pl]
NOTICE_INFO1 = Wcisnij M zeby uruchomic menu gry
NOTICE_INFO2 = wcisnij , albo . zeby kupic amunicje
NOTICE_VIRUS_FREE = T-Virus zostal zgubiony...
NOTICE_FIRST = %s jest pierwszym zombi !!
NOTICE_INFECT = %s - jego mozg zostal zainfekowany...
NOTICE_INFECT2 = %s - jego mozg zostal zainfekowany przez %s...
NOTICE_ANTIDOTE = %s uzyl antidotum...
NOTICE_NEMESIS = %s jest Nemesis !!!
NOTICE_SURVIVOR = %s stal sie Survivor !!!
NOTICE_SWARM = Swarm Mode !!!
NOTICE_MULTI = wielokrotna infekcja !!!
NOTICE_PLAGUE = Plague Mode !!!

WIN_HUMAN = Ludzie pokonali plage!
WIN_ZOMBIE = Zombi zapanowal nad swiatem!
WIN_NO_ONE = Nikt nie wygral...

CMD_INFECT = zmieniony w Zombi
CMD_DISINFECT = Zmieniony z powrotem w czlowieka
CMD_NEMESIS = Zmieniony w Nemesis
CMD_SURVIVAL = zmieniony w Survivor
CMD_SWARM = Rozpoczyna sie Swarm Mode
CMD_MULTI = Rozpoczyna sie wielokrotna infekcja
CMD_PLAGUE = Rozpoczyna sie Plague Mode
CMD_RESPAWN = Zmaterializowany
CMD_NOT = Nieznana komenda.
CMD_ZOMBIE_ONLY = Mozliwe tylko dla zombiakow.
CMD_HUMAN_ONLY = Mozliwe tylko dla ludzi.
CMD_NOT_STUCK = Nie jestes uprawniony. (nie jestes zablokowany)
CMD_NOT_ACCESS = Nie masz dostepu.
CMD_NOT_CANTUSE = Nie mozesz uzywac tego teraz.
CMD_NOT_EXTRAS = Dodatkowe rzeczy sa wylaczone.
CMD_NOT_ZCLASSES = Klasy zombi sa wylaczone.

MENU_BUY = Kup bron
MENU_EXTRABUY = Kup dodatkowy ekwipunek
MENU_ZCLASS = Wybierz klase zombi
MENU_UNSTUCK = Odblokuj
MENU_ADMIN = Menu Admina
MENU_INFO = Pomoc
MENU_SPECTATOR = Dolacz do Obserwatorow

MENU_BUY1_TITLE = Bron pierwsza
MENU_BUY2_TITLE = Bron druga
MENU_ZCLASS_TITLE = Klasa Zombi
MENU_EXTRA_TITLE = Dodatkowe rzeczy
MENU_ADMIN_TITLE = Menu Admina
MENU_INFO_TITLE = Informacje o Pluginie

MENU_EXTRA1 = Noktowizor (pojedyncza runda)
MENU_EXTRA2 = Antidotum na T-virus
MENU_EXTRA3 = Szalone Zombi
MENU_EXTRA4 = Zarazajaca bomba
MENU_ADMIN1 = Zrob Zombie/czlowiekiem
MENU_ADMIN2 = Zrob Nemesis
MENU_ADMIN3 = Zrob Survivor
MENU_ADMIN4 = Zmaterializuj kogos
MENU_ADMIN5 = Start Swarm Mode
MENU_ADMIN6 = Start Wielokrotna Infekcje
MENU_ADMIN7 = Start Plague Mode
MENU_INFO1 = Ogolne
MENU_INFO2 = Ludzie
MENU_INFO3 = Zombi
MENU_INFO4 = Tryby Gry

MENU_AUTOSELECT = Pamietaj Wybor
MENU_BACK = Powrot
MENU_NEXT = Nastepny
MENU_EXIT = Wyjscie

MOTD_INFO11 = <meta charset=UTF-8><body bgcolor=\"#000000\"><font color=\"#FF0505\"><b>%s %s by %s :</b> jest Counter-Strike plugin zrobionym pod AMX Mod X, w ktorym ludzie i zombi walcza ze soba. Bazuje na klasach zomni z infection mod: W kazdej rundzie jeden gracz staje sie zombi ktore zaraza wszystkich innych.
MOTD_INFO12 = Ale teraz sa nowe modyfikacje i dodatki. Dla przykladu, mozesz kupic dodatkowe rzeczy (cos jak bronie) i dokupic do nich amunicje. Mozesz dostawac ammo zabijajac zombi/zainfekowanych ludzi.<br><br><br><u>Obecne ustawienia serwera:</u><br>
MOTD_INFO1_A = <br>Efekty klimatu:
MOTD_INFO1_B = <br>Poziom Oswietlenia: %s
MOTD_INFO1_C = <br>uruchomione swiatla: %L
MOTD_INFO1_D = <br>Piorun uderza kazde: %d sekund
MOTD_INFO1_E = <br>Drzwi: %L
MOTD_INFO1_F = <br>Deathmatch: %L
MOTD_INFO1_G = <br>Czas ochrony po materializacji: %d sekund
MOTD_INFO1_H = <br>Przypadkowa materializacja: %L
MOTD_INFO1_I = <br>Dodatkowe rzeczy: %L
MOTD_INFO1_J = <br>Klasy Zombi: %L
MOTD_INFO1_K = <br>Noktowizor uzytkownika: %L
MOTD_INFO1_L = <br>Latarka uzytkownika: %L
MOTD_INFO2 = <meta charset=UTF-8><body bgcolor=\"#000000\"><font color=\"#FF0505\"><b>Ludzie:</b> ich celem jest eliminacja wszystkich zombi jakie znajda. Maja duzy arsenal broni oraz uzywaja latarek na ciemnych mapach. PRACUJCIE ZASPOLOWA ZEBYSCIE PRZETRWALI.<br><br><br><u>Obecne ustawienia serwera:</u><br>
MOTD_INFO2_A = <br>Zdrowie: %d
MOTD_INFO2_B = <br>Szybkosc: %d
MOTD_INFO2_C = <br>Grawitacja: %d
MOTD_INFO2_D = <br>Amunicja: %d
MOTD_INFO2_E = <br>Obrazenia by uzyskac paczke ammo: %L
MOTD_INFO2_F = <br>Granaty ogniowe: %d
MOTD_INFO2_G = <br>Granaty lodowe: %L
MOTD_INFO2_H = <br>Granaty oswietlajace: %L
MOTD_INFO2_I = <br>Polobrot: %L
MOTD_INFO2_J = <br>Sila Polobrotu: %L
MOTD_INFO3 = <meta charset=UTF-8><body bgcolor=\"#000000\"><font color=\"#FF0505\"><b>Zombies:</b> Waszym celem jest zainfekowanie kazdego zywego czlowieka. Macie mozliwosc widzenia w ciemnosci, ale mozecie akatowac tylko w bezposrednim starciu. Jest 6 roznych klas zombi do wyboru, kazda z nich ma zalety i wady, ale kazda umnie jesc mozgi.<br><br><br><u>Obecne ustawienia serwera:</u><br>
MOTD_INFO3_A = <br>Zdrowie zombi: %d
MOTD_INFO3_B = <br>Pierwotne zdrowie zombi: %d
MOTD_INFO3_C = <br>Pancerz: %d%% przyjete obrazenia
MOTD_INFO3_D = <br>Szybkosc: %d
MOTD_INFO3_E = <br>Grawitacja: %d
MOTD_INFO3_F = <br>HP dla infekcji: %d
MOTD_INFO3_G = <br>Pain Shock Free: %L
MOTD_INFO3_H = <br>Krwawienie: %L
MOTD_INFO3_I = <br>Paczki ammo dla infekcji: %d
MOTD_INFO4 = <meta charset=UTF-8><body bgcolor=\"#000000\"><font color=\"#FF0505\"><b>Mini-Games:</b> znajduja sie 4 specjalne tryby, gry ktore moga losowo nastapic podczas trwania gra.<br><br><br><u>Obecne ustawienia serwera:</u><br>
MOTD_INFO4_A = <br>Nemesis: %L
MOTD_INFO4_B = <br>Nemesis Przypadkowosc: 1 w %d
MOTD_INFO4_C = <br>Nemesis Zdrowie: %s
MOTD_INFO4_D = <br>Nemesis Szybkosc: %d
MOTD_INFO4_E = <br>Nemesis Grawitacja: %d
MOTD_INFO4_F = <br>Nemesis Skocznosc: %L
MOTD_INFO4_G = <br>Nemesis Odpornosc na bol: %L
MOTD_INFO4_H = <br><br>Survivor: %L
MOTD_INFO4_I = <br>Survivor Przypadkowosc: 1 in %d
MOTD_INFO4_J = <br>Survivor Zdrowie: %s
MOTD_INFO4_K = <br>Survivor Szybkosc: %d
MOTD_INFO4_L = <br>Survivor Grawitacja: %d
MOTD_INFO4_M = <br>Survivor Skocznosc: %L
MOTD_INFO4_N = <br>Survivor Odpornosc na bol: %L
MOTD_INFO4_O = <br><br>Swarm Mode: %L
MOTD_INFO4_P = <br>Przypadkowosc Swarm Mode: 1 w %d
MOTD_INFO4_Q = <br><br>Wielokrotna infekcja: %L
MOTD_INFO4_R = <br>Przypadkowosc wielokrotnej infekcji: 1 w %d
MOTD_INFO4_S = <br>Stosunek Infekcji: %d%%
MOTD_INFO4_T = <br><br>Plague Mode: %L
MOTD_INFO4_U = <br>Przypadkowosc Plague Mode: 1 w %d
MOTD_INFO4_V = <br>Stosunek Infekcji: %d%%

MOTD_ENABLED = Wlaczone
MOTD_DISABLED = Wylaczone
MOTD_FOG = Mgla
MOTD_RAIN = Deszcz
MOTD_SNOW = Snieg
MOTD_ROTATING = Drzwi obrotowe usuniete
MOTD_DOORS = Wszystkie drzwi usuniete
MOTD_DM_HUMAN = Rematerializacja jako czlowiek
MOTD_DM_ZOMBIE = Rematerializacja jako zombi
MOTD_LIMITED = ograniczone
MOTD_AMMO_BP = Nieograniczone przeladowania
MOTD_AMMO_CLIP = Nieograniczony magazynek
MOTD_LASTZOMBIE = Tylko na ostatnim zombie

ZOMBIE_ATTRIB1 = Zdrowie
ZOMBIE_ATTRIB2 = Szybkosc
ZOMBIE_ATTRIB3 = Grawitacja
ZOMBIE_ATTRIB4 = Odrzucenie

CLASS_CLASS = Klasy:
CLASS_HUMAN = Czlowiek
CLASS_ZOMBIE = Zombie
CLASS_SURVIVOR = Survivor
CLASS_NEMESIS = Nemesis

LAST_ZOMBIE_LEFT = Ostatnie Zombi opuscilo serwer, %s stal sie nowym zombi.
LAST_HUMAN_LEFT = Ostatni czlowiek opuscil serwer, %s stal sie nowym czlowiekiem.
NOT_ENOUGH_AMMO = Nie masz wystarczajacej ilosci paczek z amunicja.
AMMO_BOUGHT = Zdobyles dodatkowe amo do twojej broni.
ZOMBIE_SELECT = Twoja nowa klasa zombi jest
BUY_ENABLED = Twoje menu zakupu zostalo ponownie udostepnione.
AMMO_PACKS1 = Ammo paki:
AMMO_PACKS2 = ammo paki
SPECTATING = Obserwuje:

[de]
NOTICE_INFO1 = Druecke M um das Game Menu anzuzeigen
NOTICE_INFO2 = Druecke , oder . um Munition zu kaufen
NOTICE_VIRUS_FREE = Der T-Virus wurde freigesetzt...
NOTICE_FIRST = %s ist der erste Zombie !!
NOTICE_INFECT = %s Gehirn wurde gegessen...
NOTICE_INFECT2 = %s Gehirn wurde gegessen von %s...
NOTICE_ANTIDOTE = %s hat ein Gegengift benutzt...
NOTICE_NEMESIS = %s ist ein Nemesis !!!
NOTICE_SURVIVOR = %s ist ein Survivor !!!
NOTICE_SWARM = Swarm Modus !!!
NOTICE_MULTI = Multiple Infektionen !!!
NOTICE_PLAGUE = Plague Modus !!!

WIN_HUMAN = Menschen besiegten die Seuche!
WIN_ZOMBIE = Zombies haben die Welt übernommen!
WIN_NO_ONE = Niemand hat gewonnen...

CMD_INFECT = umgewandelt in einen Zombie
CMD_DISINFECT = zurück gewandelt in einen Menschen
CMD_NEMESIS = umgewandelt in einen Nemesis
CMD_SURVIVAL = umgewandelt in einen Survivor
CMD_SWARM = starte Swarm Modus
CMD_MULTI = starte Multiple Infektionen
CMD_PLAGUE = starte Plague Modus
CMD_RESPAWN = wiederbelebt
CMD_NOT = nicht verfuegbarer Befehl.
CMD_ZOMBIE_ONLY = Das ist nur fuer Zombies verfuegbar.
CMD_HUMAN_ONLY = Das ist nur fuer Menschen verfuegbar.
CMD_NOT_STUCK = Du steckst nicht fest.
CMD_NOT_ACCESS = Du hast keine Rechte.
CMD_NOT_CANTUSE = Du kannst dies zur Zeit nicht benutzen.
CMD_NOT_EXTRAS = Besondere Items sind zur Zeit ausgeschaltet.
CMD_NOT_ZCLASSES = Zombie Klassen sind ausgeschaltet.

MENU_BUY = Kaufe Waffen
MENU_EXTRABUY = Kaufe besondere Items
MENU_ZCLASS = Waehle eine Zombie Klasse
MENU_UNSTUCK = Freisetzen
MENU_ADMIN = Admin Menu
MENU_INFO = Hilfe
MENU_SPECTATOR = Join Spectator

MENU_BUY1_TITLE = Primaer Waffe
MENU_BUY2_TITLE = Sekundaer Waffe
MENU_ZCLASS_TITLE = Zombie Klasse
MENU_EXTRA_TITLE = Besondere Items
MENU_ADMIN_TITLE = Admin Menu
MENU_INFO_TITLE = Plugin Informationen

MENU_EXTRA1 = Nachtsicht (eine Runde)
MENU_EXTRA2 = T-Virus Gegengift
MENU_EXTRA3 = Zombie Wahnsinn
MENU_EXTRA4 = Infektions Bombe
MENU_ADMIN1 = Erzeuge Zombie/Mensch
MENU_ADMIN2 = Erzeuge Nemesis
MENU_ADMIN3 = Erzeuge Survivor
MENU_ADMIN4 = Jemand wiederbeleben
MENU_ADMIN5 = Starte Swarm Modus
MENU_ADMIN6 = Starte Multiple Infektionen
MENU_ADMIN7 = Starte Plague Modus
MENU_INFO1 = Allgemeines
MENU_INFO2 = Menschen
MENU_INFO3 = Zombies
MENU_INFO4 = Gameplay Modus

MENU_AUTOSELECT = Remember Selection
MENU_BACK = Zurueck
MENU_NEXT = Naechste
MENU_EXIT = Ausgang

MOTD_INFO11 = <meta charset=UTF-8><body bgcolor=\"#000000\"><font color=\"#FF0505\"><b>%s %s von %s :</b> ist ein Counter-Strike Plugin welches unter AMX Mod X entwickelt wurde, wo Menschen und Zombies aufeinandertreffen. Es beruht auf dem klassischem Zombie Infection Mod: Bei jeder Runde wird ein beliebiger Spieler ausgewählt welcher dann der erste Zombie ist. Der erste Zombie hat als Aufgabe die anderen Spieler zu infizieren. 
MOTD_INFO12 = Aber es gibt neue Besonderheiten und Erweiterungen. Zum Beispiel kannst du besondere Items kaufen (wie beispielsweise Waffen) im Tausch gegen Munitionspackungen. Du kannst Munitionspackungen kriegen indem du Zombies tötest oder Menschen infizierst.<br><br><br><u>Derzeitige Server-Einstellungen:</u><br>
MOTD_INFO1_A = <br>Atmosphäre Effekte:
MOTD_INFO1_B = <br>Blitz Stufe: %s
MOTD_INFO1_C = <br>Ausgelöste Lichter: %L
MOTD_INFO1_D = <br>Jeder Donnerschlag: %d sekunden
MOTD_INFO1_E = <br>Türen: %L
MOTD_INFO1_F = <br>Deathmatch: %L
MOTD_INFO1_G = <br>Schutz nach Wiederbelebung: %d sekunden
MOTD_INFO1_H = <br>Irgendwo Wiederbeleben: %L
MOTD_INFO1_I = <br>Besondere Items: %L
MOTD_INFO1_J = <br>Zombie Klassen: %L
MOTD_INFO1_K = <br>Benutzerdefiniertes Nachtsichtgerät: %L
MOTD_INFO1_L = <br>Benutzerdefinierte Blendgranate: %L
MOTD_INFO2 = <meta charset=UTF-8><body bgcolor=\"#000000\"><font color=\"#FF0505\"><b>Menschen:</b> Ihr Ziel ist es die Bedrohung durch Zombies zu unterdrücken. Sie haben eine große Auswahl von verschiedenen Waffen und können Blendgranaten bei dunklen Maps benutzen. Teamarbeit ist ein muss um zu überleben.<br><br><br><u>Derzeitige Server-Einstellungen:</u><br>
MOTD_INFO2_A = <br>Gesundheit: %d
MOTD_INFO2_B = <br>Gesundheits vergütung für den letzten Mensch: %d
MOTD_INFO2_C = <br>Geschwindigkeit: %d
MOTD_INFO2_D = <br>Gravitation: %d
MOTD_INFO2_E = <br>Munition: %L
MOTD_INFO2_F = <br>Schaden um eine Munitionspackung zu bekommen: %d
MOTD_INFO2_G = <br>Feuer Granaten: %L
MOTD_INFO2_H = <br>Frost Granaten: %L
MOTD_INFO2_I = <br>Leucht Granaten: %L
MOTD_INFO2_J = <br>Rückschlag: %L
MOTD_INFO3 = <meta charset=UTF-8><body bgcolor=\"#000000\"><font color=\"#FF0505\"><b>Zombies:</b> Ihr Ziel ist es jeden lebenden Menschen zu infizieren. Sie können im dunklen Sehen aber nur Nahkampfangriffe ausführen. Man kann zwischen 6 unterschiedlichen Zombie Klassen auswählen, jede hat ihre eigenen stärken und schwächen, aber alle fähig um ein Gehirn zu essen.<br><br><br><u>Derzeitige Server-Einstellungen:</u><br>
MOTD_INFO3_A = <br>Zombie Gesundheit: %d
MOTD_INFO3_B = <br>Erster Zombie Gesundheit: %d
MOTD_INFO3_C = <br>Rüstung: %d%% schaden erhalten
MOTD_INFO3_D = <br>Geschwindigkeit: %d
MOTD_INFO3_E = <br>Gravitation: %d
MOTD_INFO3_F = <br>HP für Infektion: %d
MOTD_INFO3_G = <br>Schmerz Schock frei: %L
MOTD_INFO3_H = <br>Blutung: %L
MOTD_INFO3_I = <br>Munitionspackung für Infektion: %d
MOTD_INFO4 = <meta charset=UTF-8><body bgcolor=\"#000000\"><font color=\"#FF0505\"><b>Mini-Spiele:</b> Es gibt 4 unterschiedliche spezial gameplay modi welche beliebig im Spielablauf auftreten.<br><br><br><u>Derzeitige Server-Einstellungen:</u><br>
MOTD_INFO4_A = <br>Nemesis: %L
MOTD_INFO4_B = <br>Nemesis Wahrscheinlichkeit: 1 in %d
MOTD_INFO4_C = <br>Nemesis Gesundheit: %s
MOTD_INFO4_D = <br>Nemesis Geschwindigkeit: %d
MOTD_INFO4_E = <br>Nemesis Gravitation: %d
MOTD_INFO4_F = <br>Nemesis Sprung: %L
MOTD_INFO4_G = <br>Nemesis Schmerz Schock frei: %L
MOTD_INFO4_H = <br><br>Survivor: %L
MOTD_INFO4_I = <br>Survivor Wahrscheinlichkeit: 1 in %d
MOTD_INFO4_J = <br>Survivor Gesundheit: %s
MOTD_INFO4_K = <br>Survivor Geschwindigkeit: %d
MOTD_INFO4_L = <br>Survivor Gravitation: %d
MOTD_INFO4_M = <br>Survivor Sprung: %L
MOTD_INFO4_N = <br>Survivor Schmerz Schock frei: %L
MOTD_INFO4_O = <br><br>Swarm Modus: %L
MOTD_INFO4_P = <br>Swarm Modus Wahrscheinlichkeit: 1 in %d
MOTD_INFO4_Q = <br><br>Multi Infektion: %L
MOTD_INFO4_R = <br>Multi Infektion Wahrscheinlichkeit: 1 in %d
MOTD_INFO4_S = <br>Infektions Anteil: %d%%
MOTD_INFO4_T = <br><br>Plague Modus: %L
MOTD_INFO4_U = <br>Plague Mode Wahrscheinlichkeit: 1 in %d
MOTD_INFO4_V = <br>Infektions Anteil: %d%%

MOTD_ENABLED = Eingeschaltet
MOTD_DISABLED = Ausgeschaltet
MOTD_FOG = Nebel
MOTD_RAIN = Regen
MOTD_SNOW = Schnee
MOTD_ROTATING = Rotierende Tueren entfernt
MOTD_DOORS = Alle Tueren entfernt
MOTD_DM_HUMAN = Wiederbeleben als Mensch
MOTD_DM_ZOMBIE = Wiederbeleben als Zombie
MOTD_LIMITED = Begrenzt
MOTD_AMMO_BP = Unbegrenzte Nachladungen
MOTD_AMMO_CLIP = Unbegrenzter  clip
MOTD_LASTZOMBIE = Nur bei dem letzten Zombie

ZOMBIE_ATTRIB1 = Gesundheit
ZOMBIE_ATTRIB2 = Geschwindigkeit
ZOMBIE_ATTRIB3 = Gravitation
ZOMBIE_ATTRIB4 = Rueckschlag

CLASS_CLASS = Klasse:
CLASS_HUMAN = Mensch
CLASS_ZOMBIE = Zombie
CLASS_SURVIVOR = Survivor
CLASS_NEMESIS = Nemesis

LAST_ZOMBIE_LEFT = Der letzte Zombie hat uns verlassen, %s ist der neue Zombie.
LAST_HUMAN_LEFT = Der letzte Mensch hat uns verlassen, %s ist der neue Mensch.
NOT_ENOUGH_AMMO = Du hast nicht genug Munitionspackungen.
AMMO_BOUGHT = Du hast besondere Munition gekauft für deine Waffen. 
ZOMBIE_SELECT = Bei dem nächsten Mal wird deine Zombie Klasse infiziert.
BUY_ENABLED = Your buy menu has been re-enabled.
AMMO_PACKS1 = Munitionspackungen:
AMMO_PACKS2 = Munitionspackungen
SPECTATING = Zuschauer:

[lt]
NOTICE_INFO1 = Spausk M, kad gautum zaidimo meniu
NOTICE_INFO2 = Spausk , arba . kad nusipirktum soviniu
NOTICE_VIRUS_FREE = T-Virusas buvo paskleistas...
NOTICE_FIRST = %s yra pirmasis zombis!!!
NOTICE_INFECT = %s smegenys buvo suvalgytos...
NOTICE_INFECT2 = %s smegenys buvo suvalgytos sukurtas %s...
NOTICE_ANTIDOTE = %s panaudojo priesnuodi...
NOTICE_NEMESIS = %s yra kersytojas!!!
NOTICE_SURVIVOR = %s yra isgyventojas!!!
NOTICE_SWARM = Spieciaus rezimas!!!
NOTICE_MULTI = Keleriopa infekcija!!!
NOTICE_PLAGUE = Plague Mode !!!

WIN_HUMAN = Zmones nugalejo mara!
WIN_ZOMBIE = Zombiai isigalejo pasaulyje!
WIN_NO_ONE = Nelaimejo niekas...

CMD_INFECT = pavirtai i zombi
CMD_DISINFECT = atvirtai i zmogu
CMD_NEMESIS = pavirtai i kersytoja
CMD_SURVIVAL = pavirtai i isgyventoja
CMD_SWARM = pradeti spieciaus rezima
CMD_MULTI = pradeti multi infekcija
CMD_PLAGUE = pradeti Plague Mode
CMD_RESPAWN = atsiradai
CMD_NOT = Negalima komanda.
CMD_ZOMBIE_ONLY = Tai prieinama tik zombiams.
CMD_HUMAN_ONLY = Tai prieinama tik zmonems.
CMD_NOT_STUCK = Tu ne uzstriges.
CMD_NOT_ACCESS = Neturi priejimo.
CMD_NOT_CANTUSE = Dabar negali sito naudoti.
CMD_NOT_EXTRAS = Papildomi daigtai yra isjungti.
CMD_NOT_ZCLASSES = Zombiu kases yra isjungtos.

MENU_BUY = Pirkti ginklus
MENU_EXTRABUY = Pirkti papildomus daigtus
MENU_ZCLASS = Pasirinkti zombiu klase
MENU_UNSTUCK = Atstrigti
MENU_ADMIN = Admino meniu
MENU_INFO = Pagalba
MENU_SPECTATOR = Join Spectator

MENU_BUY1_TITLE = Pirminis ginklas
MENU_BUY2_TITLE = Antrinis ginklas
MENU_ZCLASS_TITLE = Zombio klase
MENU_EXTRA_TITLE = Papildomi daigtai
MENU_ADMIN_TITLE = Admino meniu
MENU_INFO_TITLE = Plugino informacija

MENU_EXTRA1 = NightVision (vienam raundui)
MENU_EXTRA2 = T-Viruso priesnuodis
MENU_EXTRA3 = Zombio pasiutimas
MENU_EXTRA4 = Infekcijos bomba
MENU_ADMIN1 = Sukurti zombi/zmogu
MENU_ADMIN2 = Sukurti kersytoja
MENU_ADMIN3 = Sukurti isgyventoja
MENU_ADMIN4 = Atstatyti kazka
MENU_ADMIN5 = Pradeti spieciaus rezima
MENU_ADMIN6 = Pradeti keleriopa infekcija
MENU_ADMIN7 = Pradeti Plague Mode
MENU_INFO1 = Generalinis
MENU_INFO2 = Zmones
MENU_INFO3 = Zombiai
MENU_INFO4 = Zaidimo rezimai

MENU_AUTOSELECT = Remember Selection
MENU_BACK = Atgal
MENU_NEXT = Toliau
MENU_EXIT = Iseiti

MOTD_INFO11 = <meta charset=UTF-8><body bgcolor=\"#000000\"><font color=\"#FF0505\"><b>%s %s, sukurtas %s:</b> yra Counter-Strike pluginas skirtas AMX Mod X, kur kovoja zmones ir zombiai. Viskas yra paremta klasine zombiu infekcijos modifikacija: kiekviena raunda atsitiktinis zaidejas yra isrinktas, kuris turi infekuoti visus kitus. 
MOTD_INFO12 = Bet yra nauju ypatybiu bei patobulinimu. Pvz.: jus galite pirkti papildomus daigtus (kad ir ginklus) iskeisdami juos i soviniu paketus. Jus galite gauti soviniu paketus zudydami zombius/infekuodami zmones.<br><br><br><u>Dabartiniai serverio nustatymai:</u><br>
MOTD_INFO1_A = <br>Atmosferos efektai:
MOTD_INFO1_B = <br>Zaibavimo lygis: %s
MOTD_INFO1_C = <br>Paleidziamos sviesos: %L
MOTD_INFO1_D = <br>Griaustinio dundejimas kas: %d sekundziu
MOTD_INFO1_E = <br>Durys: %L
MOTD_INFO1_F = <br>Deathmatch: %L
MOTD_INFO1_G = <br>Atsiradimo saugos laikas: %d seconds
MOTD_INFO1_H = <br>Atsiradimas betkur: %L
MOTD_INFO1_I = <br>Papildomi daigtai: %L
MOTD_INFO1_J = <br>Zombiu klases: %L
MOTD_INFO1_K = <br>Kitoks naktinis matymas: %L
MOTD_INFO1_L = <br>Kitokis prozektorius: %L
MOTD_INFO2 = <meta charset=UTF-8><body bgcolor=\"#000000\"><font color=\"#FF0505\"><b>Zmones:</b> ju tikslas yra eliminuoti visus zombius. Jie turi dideli ginklu arsenala bei prozektorius tamsioje aplinkoje. Komandinis darbas yra privalomas norint isgyventi.<br><br><br><u>Dabartiniai serverio nustatymai:</u><br>
MOTD_INFO2_A = <br>Gyvybes: %d
MOTD_INFO2_B = <br>Gyvybiu apdovanojimas paskutiniam zmogui: %d
MOTD_INFO2_C = <br>Greitis: %d
MOTD_INFO2_D = <br>Gravitacija: %d
MOTD_INFO2_E = <br>Soviniai: %L
MOTD_INFO2_F = <br>Zala, uz kuria gaunami soviniu paketai: %d
MOTD_INFO2_G = <br>Ugnies granatos: %L
MOTD_INFO2_H = <br>Salcio granatos: %L
MOTD_INFO2_I = <br>Sviesos granatos: %L
MOTD_INFO2_J = <br>Knockback: %L
MOTD_INFO3 = <meta charset=UTF-8><body bgcolor=\"#000000\"><font color=\"#FF0505\"><b>Zombiai:</b> ju tikslas yra infekuoti visus gyvus zmones. Jie gali matyti tamsoje, bet gali atakuoti tik rankomias/nagais. Galite rinktis is 6 zombiu klasiu, kiekviena turi pliusu ir minusu, bet visos troksta valgyti smegenis.<br><br><br><u>Dabartiniai serverio nustatymai:</u><br>
MOTD_INFO3_A = <br>Zombiu gyvybes: %d
MOTD_INFO3_B = <br>Pirmojo zombio gyvybes: %d
MOTD_INFO3_C = <br>Sarvai: %d%% padarytos zalos
MOTD_INFO3_D = <br>Greitis: %d
MOTD_INFO3_E = <br>Gravitacija: %d
MOTD_INFO3_F = <br>HP uz infekavima: %d
MOTD_INFO3_G = <br>Skausmo soko nejautimas: %L
MOTD_INFO3_H = <br>Kraujavimas: %L
MOTD_INFO3_I = <br>Soviniu paketai uz infekavima: %d
MOTD_INFO4 = <meta charset=UTF-8><body bgcolor=\"#000000\"><font color=\"#FF0505\"><b>Mini-zaidimai:</b> yra 4 skirtingi specialus zaidimo rezimai, kurie gali automatiskai pasikeisti einant zaidimui.<br><br><br><u>Dabartiniai serverio nustatymai:</u><br>
MOTD_INFO4_A = <br>Kersytojas: %L
MOTD_INFO4_B = <br>Kersytojo sansas: 1 is %d
MOTD_INFO4_C = <br>Kersytojo gyvybes: %s
MOTD_INFO4_D = <br>Kersytojo greitis: %d
MOTD_INFO4_E = <br>Kersytojo gravitacija: %d
MOTD_INFO4_F = <br>Kersytojo suolis: %L
MOTD_INFO4_G = <br>Kersytojo skausmo soko nejautimas: %L
MOTD_INFO4_H = <br><br>Isgyventojas: %L
MOTD_INFO4_I = <br>Isgyventojo sansas: 1 is %d
MOTD_INFO4_J = <br>Isgyventojo gyvybes: %s
MOTD_INFO4_K = <br>Isgyventojo greitis: %d
MOTD_INFO4_L = <br>Isgyventojo gravitacija: %d
MOTD_INFO4_M = <br>Isgyventojo suolis: %L
MOTD_INFO4_N = <br>Isgyventojo skausmo soko nejautimas: %L
MOTD_INFO4_O = <br><br>Spieciaus rezimas: %L
MOTD_INFO4_P = <br>Spieciaus rezimo sansas: 1 is %d
MOTD_INFO4_Q = <br><br>Multi infekcija: %L
MOTD_INFO4_R = <br>Multi infekcijos sansas: 1 is %d
MOTD_INFO4_S = <br>Infekcijos santykis: %d%%
MOTD_INFO4_T = <br><br>Plague Mode: %L
MOTD_INFO4_U = <br>Plague Mode sansas: 1 is %d
MOTD_INFO4_V = <br>Infekcijos santykis: %d%%

MOTD_ENABLED = Ijungta
MOTD_DISABLED = Isjungta
MOTD_FOG = Rukas
MOTD_RAIN = Lietus
MOTD_SNOW = Sniegas
MOTD_ROTATING = Atidaromos durys isimtos
MOTD_DOORS = Visos durys isimtos
MOTD_DM_HUMAN = Atsirasti zmogumi
MOTD_DM_ZOMBIE = Atsirasti zombiu
MOTD_LIMITED = Ribota
MOTD_AMMO_BP = Nesibaigiantys uzsitaisymai
MOTD_AMMO_CLIP = Nesibaigianti apkaba
MOTD_LASTZOMBIE = Tik paskutiniam zombiui

ZOMBIE_ATTRIB1 = Gyvybes
ZOMBIE_ATTRIB2 = Greitis
ZOMBIE_ATTRIB3 = Gravitacija
ZOMBIE_ATTRIB4 = Knockback

CLASS_CLASS = Klase:
CLASS_HUMAN = Zmogus
CLASS_ZOMBIE = Zombis
CLASS_SURVIVOR = Isgyventojas
CLASS_NEMESIS = Kersytojas

LAST_ZOMBIE_LEFT = Paskutinis zombis isejo, %s yra naujas zombis.
LAST_HUMAN_LEFT = Paskutinis zmogus isejo, %s yra naujas zmogus.
NOT_ENOUGH_AMMO = Tu neturi pakankamai soviniu paketu.
AMMO_BOUGHT = Tu nusipirkai ekstra soviniu paketu savo ginklams.
ZOMBIE_SELECT = Kai sekanti karta busi infekuotas, tavo zombio klase bus
BUY_ENABLED = Your buy menu has been re-enabled.
AMMO_PACKS1 = Soviniu paketai:
AMMO_PACKS2 = soviniu paketai
SPECTATING = Ziurima:

[bg]
NOTICE_INFO1 = Natisnete M za da vidite menu-to na sarvara.
NOTICE_INFO2 = Natisnete , ili . za da si kupite patroni.
NOTICE_VIRUS_FREE = The T-Virus has been set loose...
NOTICE_FIRST = %s e purvoto ZOMBIE !!
NOTICE_INFECT = Na %s mu be6e izqden mozaka...
NOTICE_INFECT2 = Na %s mu be6e izaden mozaka ot %s...
NOTICE_ANTIDOTE = %s Izpolzva protivootrova...
NOTICE_NEMESIS = %s is a Nemesis !!!
NOTICE_SURVIVOR = %s Ocelq !!!
NOTICE_SWARM = Go Go Go Sward Mode !!!
NOTICE_MULTI = Nqkoilko infekcii !!!
NOTICE_PLAGUE = Plague Mode !!!

WIN_HUMAN = Svetut e spasen!
WIN_ZOMBIE = Zombies RULE the WORLD !
WIN_NO_ONE = Nikoi ne spe4eli...

CMD_INFECT = Se prevurna v ZOMBIIE.
CMD_DISINFECT = Otnovo e 4ovek.
CMD_NEMESIS = Se prevurna v Nemesis.
CMD_SURVIVAL = E oceleliq.
CMD_SWARM = start Swarm Mode.
CMD_MULTI = start Multiple Infection.
CMD_PLAGUE = start Plague Mode.
CMD_RESPAWN = Vuzroden.
CMD_NOT = Nevalidna komanda..
CMD_ZOMBIE_ONLY = Tova e pozvoleno samo na Zombitata.
CMD_HUMAN_ONLY = Tova e pozvoleno samo na Horata.
CMD_NOT_STUCK = Ne si zasendal.
CMD_NOT_ACCESS = Nqmate dostup.
CMD_NOT_CANTUSE = Ne mojete da go izpolzvate sega!
CMD_NOT_EXTRAS = Extrite sa izkliu4eni.
CMD_NOT_ZCLASSES = Zombie rasite sa izkliu4eni.

MENU_BUY = Kopuvane na orajiq ...
MENU_EXTRABUY = Kopuvane na Eztri...
MENU_ZCLASS = Izberete zombie rasa...
MENU_UNSTUCK = Otkle6ti me!!!!
MENU_ADMIN = Menio za admini.
MENU_INFO = POMO6T
MENU_SPECTATOR = Join Spectator

MENU_BUY1_TITLE = Primary Weapon
MENU_BUY2_TITLE = Secondary Weapon
MENU_ZCLASS_TITLE = Zombie rasa.
MENU_EXTRA_TITLE = Extra Items
MENU_ADMIN_TITLE = Menlio za ADMINI.
MENU_INFO_TITLE = MOD INFORMACIQ!

MENU_EXTRA1 = No6tno vijdane ( za 1 rund)
MENU_EXTRA2 = Antivirus.
MENU_EXTRA3 = Zombie Madness
MENU_EXTRA4 = Infektira6ta bomba.
MENU_ADMIN1 = Pravi Zombie/Human
MENU_ADMIN2 = Pravi nqkoi Nemesis
MENU_ADMIN3 = Pravi nqkoi Survivor
MENU_ADMIN4 = Vuzrodete nqkoi.
MENU_ADMIN5 = Zapo4nete Swarm Mode
MENU_ADMIN6 = Zapo4nete Nqkolko infekcii
MENU_ADMIN7 = Zapo4nete Plague Mode
MENU_INFO1 = General
MENU_INFO2 = Hora
MENU_INFO3 = Zombita
MENU_INFO4 = Gameplay Modes

MENU_AUTOSELECT = Remember Selection
MENU_BACK = Nazad
MENU_NEXT = Napred
MENU_EXIT = Izhod

MOTD_INFO11 = <meta charset=UTF-8><body bgcolor=\"#000000\"><font color=\"#FF0505\"><b>%s %s by %s :</b> is a Counter-Strike plugin developed under AMX Mod X, in where humans and zombies are confronted. It is based on the classic zombie infection mod: on every round a random player is picked to be the first zombie who has to infect everyone else.
MOTD_INFO12 = But there are new features and enhancements. For instance, you are able to buy extra items (such as weapons) in exchange of ammo packs. You can get ammo packs by killing zombies/infecting humans.<br><br><br><u>Current server settings:</u><br>
MOTD_INFO1_A = <br>Ambience Effects:
MOTD_INFO1_B = <br>Lightning Level: %s
MOTD_INFO1_C = <br>Triggered Lights: %L
MOTD_INFO1_D = <br>Thunderclaps Every: %d seconds
MOTD_INFO1_E = <br>Doors: %L
MOTD_INFO1_F = <br>Deathmatch: %L
MOTD_INFO1_G = <br>Spawn Protection Time: %d seconds
MOTD_INFO1_H = <br>Random Spawning: %L
MOTD_INFO1_I = <br>Extra Items: %L
MOTD_INFO1_J = <br>Zombie Classes: %L
MOTD_INFO1_K = <br>Custom Nightvision: %L
MOTD_INFO1_L = <br>Custom Flashlight: %L
MOTD_INFO2 = <meta charset=UTF-8><body bgcolor=\"#000000\"><font color=\"#FF0505\"><b>Humans:</b> their objective is to eliminate any zombie threat. They have a big arsenal of weapons to choose from, and use flashlights on dark maps. Team work is a must to survive.<br><br><br><u>Current server settings:</u><br>
MOTD_INFO2_A = <br>Health: %d
MOTD_INFO2_B = <br>Health Reward for Last Human: %d
MOTD_INFO2_C = <br>Speed: %d
MOTD_INFO2_D = <br>Gravity: %d
MOTD_INFO2_E = <br>Ammo: %L
MOTD_INFO2_F = <br>Damage to Get an Ammo Pack: %d
MOTD_INFO2_G = <br>Fire Grenades: %L
MOTD_INFO2_H = <br>Frost Grenades: %L
MOTD_INFO2_I = <br>Flare Grenades: %L
MOTD_INFO2_J = <br>Knockback: %L
MOTD_INFO3 = <meta charset=UTF-8><body bgcolor=\"#000000\"><font color=\"#FF0505\"><b>Zombies:</b> their objective is to infect every alive human. They are able to see in the dark, but can only attack melee. There are 6 different zombie classes to choose from, each with his own strenghts and weaknesses, but all capable of eating brains.<br><br><br><u>Current server settings:</u><br>
MOTD_INFO3_A = <br>Zombie Health: %d
MOTD_INFO3_B = <br>First Zombie Health: %d
MOTD_INFO3_C = <br>Armor: %d%% damage taken
MOTD_INFO3_D = <br>Speed: %d
MOTD_INFO3_E = <br>Gravity: %d
MOTD_INFO3_F = <br>HP for Infection: %d
MOTD_INFO3_G = <br>Pain Shock Free: %L
MOTD_INFO3_H = <br>Bleeding: %L
MOTD_INFO3_I = <br>Ammo Packs for Infection: %d
MOTD_INFO4 = <meta charset=UTF-8><body bgcolor=\"#000000\"><font color=\"#FF0505\"><b>Mini-Games:</b> there are 4 different special gameplay modes that may randomly occur during the course of the game.<br><br><br><u>Current server settings:</u><br>
MOTD_INFO4_A = <br>Nemesis: %L
MOTD_INFO4_B = <br>Nemesis Chance: 1 in %d
MOTD_INFO4_C = <br>Nemesis Health: %s
MOTD_INFO4_D = <br>Nemesis Speed: %d
MOTD_INFO4_E = <br>Nemesis Gravity: %d
MOTD_INFO4_F = <br>Nemesis Leap: %L
MOTD_INFO4_G = <br>Nemesis Pain Shock Free: %L
MOTD_INFO4_H = <br><br>Survivor: %L
MOTD_INFO4_I = <br>Survivor Chance: 1 in %d
MOTD_INFO4_J = <br>Survivor Health: %s
MOTD_INFO4_K = <br>Survivor Speed: %d
MOTD_INFO4_L = <br>Survivor Gravity: %d
MOTD_INFO4_M = <br>Survivor Leap: %L
MOTD_INFO4_N = <br>Survivor Pain Shock Free: %L
MOTD_INFO4_O = <br><br>Swarm Mode: %L
MOTD_INFO4_P = <br>Swarm Mode Chance: 1 in %d
MOTD_INFO4_Q = <br><br>Multi Infection: %L
MOTD_INFO4_R = <br>Multi Infection Chance: 1 in %d
MOTD_INFO4_S = <br>Infection Ratio: %d%%
MOTD_INFO4_T = <br><br>Plague Mode: %L
MOTD_INFO4_U = <br>Plague Mode Chance: 1 in %d
MOTD_INFO4_V = <br>Plague Infection Ratio: %d%%

MOTD_ENABLED = Vklio4eno
MOTD_DISABLED = Izkliu4eno.
MOTD_FOG = Magla.
MOTD_RAIN = Dujd.
MOTD_SNOW = Snqg.
MOTD_ROTATING = Rotating doors removed
MOTD_DOORS = Vsi4ki vrati premahnati.
MOTD_DM_HUMAN = Sajivete se kato 4ovek.
MOTD_DM_ZOMBIE = Sajivete se kato ZOMBIE.
MOTD_LIMITED = LIMITED
MOTD_AMMO_BP = Prezarejdaniq bez limit.
MOTD_AMMO_CLIP = Unlimited clip
MOTD_LASTZOMBIE = Only on last zombie

ZOMBIE_ATTRIB1 = Kruv.
ZOMBIE_ATTRIB2 = Skorost.
ZOMBIE_ATTRIB3 = Gravitaciq.
ZOMBIE_ATTRIB4 = Knockback

CLASS_CLASS = Rasa:
CLASS_HUMAN = 4ovek
CLASS_ZOMBIE = Zombie
CLASS_SURVIVOR = Ocelql
CLASS_NEMESIS = Nemesis

LAST_ZOMBIE_LEFT = Poslednoto zombie NAPUSNA, %s e novoto zombie.
LAST_HUMAN_LEFT = Posledniq 4ovek, %s e noviq 4ovek.
NOT_ENOUGH_AMMO = Nqmate ostatacno ammo packs.
AMMO_BOUGHT = Ti polu4i extra ammo za orajiqta si.
ZOMBIE_SELECT = Ot sledva6tiq put kogato vi napravqt zombie 6te budete
BUY_ENABLED = Your buy menu has been re-enabled.
AMMO_PACKS1 = Ammo packs:
AMMO_PACKS2 = ammo packs
SPECTATING = Gleda:

[da]
NOTICE_INFO1 = tryk M for at vise spille menuen
NOTICE_INFO2 = Tryk , eller . for at kQbe ammunition
NOTICE_VIRUS_FREE = T-Virusen er sluppet lQs...
NOTICE_FIRST = %s er den fQrste Zombie !!
NOTICE_INFECT = %s's Hjerne er blevet spist...
NOTICE_INFECT2 = %s's Hjerne er blevet spist af %s...
NOTICE_ANTIDOTE = %s har brugt en modgift...
NOTICE_NEMESIS = %s er en Nemesis !!!
NOTICE_SURVIVOR = %s er en Survivor !!!
NOTICE_SWARM = Swarm Mode !!!
NOTICE_MULTI = flere infektioner !!!
NOTICE_PLAGUE = Plague Mode !!!

WIN_HUMAN = Mennesket har overvundet virusen!
WIN_ZOMBIE = Zombierne har overtaget verden!
WIN_NO_ONE = ingen vandt...

CMD_INFECT = Blev til en Zombie
CMD_DISINFECT = Blev et menneske igen
CMD_NEMESIS = Blev en Nemesis
CMD_SURVIVAL = Blev en Survivor
CMD_SWARM = start Swarm Mode
CMD_MULTI = start flere infektioner
CMD_PLAGUE = start Plague Mode
CMD_RESPAWN = genoplevede
CMD_NOT = Ugyldig kommando.
CMD_ZOMBIE_ONLY = Dette er kun tilladt for Zombier.
CMD_HUMAN_ONLY = Dette er kun tilladt for mennesket.
CMD_NOT_STUCK = Du sidder ikke fast.
CMD_NOT_ACCESS = Du har ingen adgang.
CMD_NOT_CANTUSE = Du kan ikke bruge denne lige nu.
CMD_NOT_EXTRAS = Ekstra ting er slaaet fra.
CMD_NOT_ZCLASSES = Zombie klasser er slaaet fra.

MENU_BUY = KQb Vaaben
MENU_EXTRABUY = KQb Ekstra Ting
MENU_ZCLASS = Vaelg Zombie Klasse
MENU_UNSTUCK = Unstuck
MENU_ADMIN = Admin Menu
MENU_INFO = Hjaelp
MENU_SPECTATOR = Join Spectators

MENU_BUY1_TITLE = fQrste vaaben
MENU_BUY2_TITLE = Andet vaaben
MENU_ZCLASS_TITLE = Zombie Klasse
MENU_EXTRA_TITLE = Ekstra Ting
MENU_ADMIN_TITLE = Admin Menu
MENU_INFO_TITLE = Plugin Information

MENU_EXTRA1 = Nattesyn (en runde)
MENU_EXTRA2 = T-Virus Modgift
MENU_EXTRA3 = Zombie vanvid
MENU_EXTRA4 = Infektions Bombe
MENU_ADMIN1 = Lav til Zombie/Menneske
MENU_ADMIN2 = Lav til Nemesis
MENU_ADMIN3 = Lav til Survivor
MENU_ADMIN4 = Genopliv en
MENU_ADMIN5 = Start Swarm Mode
MENU_ADMIN6 = Start Flere Infektioner
MENU_ADMIN7 = Start Plague Mode
MENU_INFO1 = Generalt
MENU_INFO2 = Mennesker
MENU_INFO3 = Zombier
MENU_INFO4 = Gameplay Modes

MENU_AUTOSELECT = Remember Selection
MENU_BACK = Tilbage
MENU_NEXT = Naeste
MENU_EXIT = Luk

MOTD_INFO11 = <meta charset=UTF-8><body bgcolor=\"#000000\"><font color=\"#FF0505\"><b>%s %s af %s :</b> er et Counter-Strike plugin lavet under AMX Mod X, Hvor Mennesker og zombier er i krig mod hinanden. Det er baseret paa det klassiske zombie infection mod: I Hver runde bliver tilfaeldige spillere valgt til at vaere den første zombie som saa skal inficere de andre spillere. 
MOTD_INFO12 = Men der er nogle nye ting og forbedringer. for eksempel, Kan du nu købe ekstra ting (som vaaben) ved hjaelp af ammo packs. Du kan faa ammo packs ved at draebe zombier eller inficere mennesker.<br><br><br><u>Aktuele server opsætning:</u><br>
MOTD_INFO1_A = <br>Ambience Effekter:
MOTD_INFO1_B = <br>Lys niveau: %s
MOTD_INFO1_C = <br>Aktiveret lys: %L
MOTD_INFO1_D = <br>Thunderclaps hvert: %d seconds
MOTD_INFO1_E = <br>Døre: %L
MOTD_INFO1_F = <br>Deathmatch: %L
MOTD_INFO1_G = <br>Spawn beskyttelses Tid: %d seconds
MOTD_INFO1_H = <br>tilfaeldig Spawning: %L
MOTD_INFO1_I = <br>Ekstra Ting: %L
MOTD_INFO1_J = <br>Zombie Klasser: %L
MOTD_INFO1_K = <br>brugerdefineret Nattesyn: %L
MOTD_INFO1_L = <br>brugerdefineret Lommelygte: %L
MOTD_INFO2 = <meta charset=UTF-8><body bgcolor=\"#000000\"><font color=\"#FF0505\"><b>Mennesket:</b> Deres mission er at skyde alle Zombier. De har et stort arsenal af våben de kan vaelge imellem, og bruger lommelygter i mørke baner. Samarbejde er et must for at overleve.<br><br><br><u>Aktuele server opsætninger:</u><br>
MOTD_INFO2_A = <br>Liv: %d
MOTD_INFO2_B = <br>Liv tildelt for at være sidste levende menneske: %d
MOTD_INFO2_C = <br>Fart: %d
MOTD_INFO2_D = <br>Gravity: %d
MOTD_INFO2_E = <br>ammunition: %L
MOTD_INFO2_F = <br>Skade for at modtage en Ammo Pack: %d
MOTD_INFO2_G = <br>Ild Granader: %L
MOTD_INFO2_H = <br>Frost Granader: %L
MOTD_INFO2_I = <br>Lys Granader: %L
MOTD_INFO2_J = <br>Knockback: %L
MOTD_INFO3 = <meta charset=UTF-8><body bgcolor=\"#000000\"><font color=\"#FF0505\"><b>Zombier:</b> Deres mission er at inficere et hvert levende menneske. De kan se i mørke, men kan kun angribe med deres hænder. Der er 6 forskellige zombie klasser at vælge imellem, hver med deres egen styrke og svagheder, men alle i stand til at æde masser af hjerner.<br><br><br><u>Aktuele server opsætninger:</u><br>
MOTD_INFO3_A = <br>Zombie Liv: %d
MOTD_INFO3_B = <br>Første Zombies Liv: %d
MOTD_INFO3_C = <br>Rustning: %d%% Skade modtaget
MOTD_INFO3_D = <br>Fart: %d
MOTD_INFO3_E = <br>Gravity: %d
MOTD_INFO3_F = <br>Liv for Infektion: %d
MOTD_INFO3_G = <br>Smerte ryste fri: %L
MOTD_INFO3_H = <br>Bløder: %L
MOTD_INFO3_I = <br>Ammo Packs for Infektion: %d
MOTD_INFO4 = <meta charset=UTF-8><body bgcolor=\"#000000\"><font color=\"#FF0505\"><b>Smaa-Spil:</b> Der er 4 forskellige smaa spil som tilfældigt kan komme mens man spiller.<br><br><br><u>Aktuele server opsætninger:</u><br>
MOTD_INFO4_A = <br>Nemesis: %L
MOTD_INFO4_B = <br>Nemesis Chance: 1 in %d
MOTD_INFO4_C = <br>Nemesis Liv: %s
MOTD_INFO4_D = <br>Nemesis Fart: %d
MOTD_INFO4_E = <br>Nemesis Gravity: %d
MOTD_INFO4_F = <br>Nemesis Spring: %L
MOTD_INFO4_G = <br>Nemesis Smerte ryste fri: %L
MOTD_INFO4_H = <br><br>Survivor: %L
MOTD_INFO4_I = <br>Survivor Chance: 1 in %d
MOTD_INFO4_J = <br>Survivor Liv: %s
MOTD_INFO4_K = <br>Survivor Fart: %d
MOTD_INFO4_L = <br>Survivor Gravity: %d
MOTD_INFO4_M = <br>Survivor Spring: %L
MOTD_INFO4_N = <br>Survivor Smerte ryste fri: %L
MOTD_INFO4_O = <br><br>Swarm Mode: %L
MOTD_INFO4_P = <br>Swarm Mode Chance: 1 til %d
MOTD_INFO4_Q = <br><br>Flere Infektioner: %L
MOTD_INFO4_R = <br>Flere Infektions Chance: 1 til %d
MOTD_INFO4_S = <br>Infektion Ratio: %d%%
MOTD_INFO4_T = <br><br>Plague Mode: %L
MOTD_INFO4_U = <br>Plague Mode Chance: 1 til %d
MOTD_INFO4_V = <br>Infektion Ratio: %d%%

MOTD_ENABLED = Slaaet til
MOTD_DISABLED = Slaaet fra
MOTD_FOG = Taage
MOTD_RAIN = Regn
MOTD_SNOW = Sne
MOTD_ROTATING = Rotations døre fjernet
MOTD_DOORS = Alle døre er fjernet
MOTD_DM_HUMAN = Genoplev som menneske
MOTD_DM_ZOMBIE = Genoplev som zombie
MOTD_LIMITED = Begrænset
MOTD_AMMO_BP = Uendelige genladninger
MOTD_AMMO_CLIP = Uendelige skud 
MOTD_LASTZOMBIE = Kun paa den sidste zombie

ZOMBIE_ATTRIB1 = Liv
ZOMBIE_ATTRIB2 = Fart
ZOMBIE_ATTRIB3 = Gravity
ZOMBIE_ATTRIB4 = Knockback

CLASS_CLASS = Klasse:
CLASS_HUMAN = Menneske
CLASS_ZOMBIE = Zombie
CLASS_SURVIVOR = Survivor
CLASS_NEMESIS = Nemesis

LAST_ZOMBIE_LEFT = Den sidste zombie gik, %s er den nye Zombie.
LAST_HUMAN_LEFT = Det sidste menneske gik, %s er et nyt menneske.
NOT_ENOUGH_AMMO = Du har ikke nok ammo packs.
AMMO_BOUGHT = Du kQbte ekstra ammunition til dine vaaben.
ZOMBIE_SELECT = Fra naeste gang du bliver inficeret vil din zombie klasse vaere
AMMO_PACKS1 = Ammo packs:
AMMO_PACKS2 = ammo packs
SPECTATING = Kigger paa:

[fr]
NOTICE_INFO1 = Appuyez sur M pour afficher le menu
NOTICE_INFO2 = Presse, ou . pour acheter des munitions 
NOTICE_VIRUS_FREE = Le Virus-T a ete libere...
NOTICE_FIRST = %s est le premier zombie!!
NOTICE_INFECT = %s's le cerveau a été mangee...
NOTICE_ANTIDOTE = %s a utilisé un antidote...
NOTICE_NEMESIS = %s est un Nemesis !!!
NOTICE_SURVIVOR = %s est un survivant !!!
NOTICE_SWARM = Swarm Mode !!!
NOTICE_MULTI = Multiple Infection !!!
NOTICE_PLAGUE = Plague Mode !!!

WIN_HUMAN = L'homme a vaincu le Virus-T!
WIN_ZOMBIE = Zombies ont contamine le monde entier!
WIN_NO_ONE = personne na Gagnee...

CMD_INFECT = turned into a Zombie
CMD_DISINFECT = turned back to Human
CMD_NEMESIS = turned into a Nemesis
CMD_SURVIVAL = turned into a Survivor
CMD_SWARM = start Swarm Mode
CMD_MULTI = start Multiple Infection
CMD_PLAGUE = start Plague Mode
CMD_RESPAWN = respawned
CMD_NOT = Unavailable command.
CMD_ZOMBIE_ONLY = This is only available to zombies.
CMD_HUMAN_ONLY = This is only available to humans.
CMD_NOT_STUCK = Vous n'êtes pas coincé.
CMD_NOT_ACCESS = Vous n'avez pas accès.
CMD_NOT_CANTUSE = Vous cant usage de ce droit.
CMD_NOT_EXTRAS = Points supplémentaires sont désactivées.
CMD_NOT_ZCLASSES = Zombie classes sont désactivées.

MENU_BUY = acheter des armes
MENU_EXTRABUY = Acheter Extra items
MENU_ZCLASS = Choisir la classe de zombie
MENU_UNSTUCK = Débloquer
MENU_ADMIN = admin menu
MENU_INFO = Aide 
MENU_SPECTATOR = Join Spectators

MENU_BUY1_TITLE = principale arme
MENU_BUY2_TITLE = arme secondaire
MENU_ZCLASS_TITLE = Zombie classe
MENU_EXTRA_TITLE = Extra articles
MENU_ADMIN_TITLE = admin menu
MENU_INFO_TITLE = plugin information 

MENU_EXTRA1 = NightVision (1 seul tour)
MENU_EXTRA2 = Virus-T Antidote
MENU_EXTRA3 = Zombie Madness
MENU_EXTRA4 = infection bombe
MENU_ADMIN1 = Make Zombie/Human
MENU_ADMIN2 = Make Nemesis
MENU_ADMIN3 = Make Survivor
MENU_ADMIN4 = Respawn Someone
MENU_ADMIN5 = Start Swarm Mode
MENU_ADMIN6 = Start Multiple Infection
MENU_ADMIN7 = Start Plague Mode
MENU_INFO1 = General
MENU_INFO2 = Humans
MENU_INFO3 = Zombies
MENU_INFO4 = modes de jeu

MENU_AUTOSELECT = Remember Selection
MENU_BACK = Retour
MENU_NEXT = Suivant
MENU_EXIT = Quitter 

MOTD_INFO11 = <meta charset=UTF-8><body bgcolor=\"#000000\"><font color=\"#FF0505\"><b>%s %s par %s: </b>est un Counter-Strike plugin developpe sous AMX Mod X , Où les humains et les zombies sont confrontes. Il est base sur le classique de l'infection par le mod zombie, à chaque tour un joueur au hasard est choisi pour être le premier zombie qui doit infecter tout le monde.
MOTD_INFO12 = Mais il existe de nouvelles fonctionnalites et ameliorations. Par exemple, vous pouvez acheter des articles supplementaires (comme les armes) en echange de paquets de munitions. Vous pouvez obtenir des paquets de munitions en tuant des zombies / infecter l'homme. <br><br><br><u>Actuelle des parametres du serveur:</u><br>
MOTD_INFO1_A = <br>Ambience Effects:
MOTD_INFO1_B = <br>Lightning Level: %s
MOTD_INFO1_C = <br>Triggered Lights: %L
MOTD_INFO1_D = <br>Thunderclaps Every: %d seconds
MOTD_INFO1_E = <br>Doors: %L
MOTD_INFO1_F = <br>Deathmatch: %L
MOTD_INFO1_G = <br>Spawn Protection Time: %d seconds
MOTD_INFO1_H = <br>Random Spawning: %L
MOTD_INFO1_I = <br>Extra Items: %L
MOTD_INFO1_J = <br>Zombie Classes: %L
MOTD_INFO1_K = <br>Custom Nightvision: %L
MOTD_INFO1_L = <br>Custom Flashlight: %L
MOTD_INFO2 = <meta charset=UTF-8><body bgcolor=\"#000000\"><font color=\"#FF0505\"><b>humains: </b>leur objectif est d'éliminer toute menace zombie. Ils ont un grand arsenal d'armes de choix, et l'utilisation des lampes de poche sur la tombée de la nuit cartes. Le travail en équipe est une nécessité pour survivre.<br><br><br><u>parametres actuelle du serveur:</u><br>
MOTD_INFO2_A = <br>Health: %d
MOTD_INFO2_B = <br>Health Reward for Last Human: %d
MOTD_INFO2_C = <br>Speed: %d
MOTD_INFO2_D = <br>Gravity: %d
MOTD_INFO2_E = <br>Ammo: %L
MOTD_INFO2_F = <br>Damage to Get an Ammo Pack: %d
MOTD_INFO2_G = <br>Fire Grenades: %L
MOTD_INFO2_H = <br>Frost Grenades: %L
MOTD_INFO2_I = <br>Flare Grenades: %L
MOTD_INFO2_J = <br>Knockback: %L
MOTD_INFO3 = <meta charset=UTF-8><body bgcolor=\"#000000\"><font color=\"#FF0505\"><b>Zombies:</b>leur objectif est d'infecter chaque vie humaine. Ils sont capables de voir dans l'obscurité, mais ne peut attaque de mêlée. Il ya 6 classes différentes de zombies à choisir, chacun avec ses propres forces et faiblesses, mais tous capables de manger les cerveaux.<br><br><br><u>paramètres actuelle du serveur:</u><br>
MOTD_INFO3_A = <br>Zombie Health: %d
MOTD_INFO3_B = <br>First Zombie Health: %d
MOTD_INFO3_C = <br>Armor: %d%% damage taken
MOTD_INFO3_D = <br>Speed: %d
MOTD_INFO3_E = <br>Gravity: %d
MOTD_INFO3_F = <br>HP for Infection: %d
MOTD_INFO3_G = <br>Pain Shock Free: %L
MOTD_INFO3_H = <br>Bleeding: %L
MOTD_INFO3_I = <br>Ammo Packs for Infection: %d
MOTD_INFO4 = <meta charset=UTF-8><body bgcolor=\"#000000\"><font color=\"#FF0505\"><b>Mini-Games:</b> Il ya 4 différents modes de jeu spéciaux que se produisent de façon aléatoire mai au cours de la partie.<br><br><br><u> parametres actuelle du serveur:</u><br>
MOTD_INFO4_A = <br>Nemesis: %L
MOTD_INFO4_B = <br>Nemesis Chance: 1 in %d
MOTD_INFO4_C = <br>Nemesis Health: %s
MOTD_INFO4_D = <br>Nemesis Speed: %d
MOTD_INFO4_E = <br>Nemesis Gravity: %d
MOTD_INFO4_F = <br>Nemesis Leap: %L
MOTD_INFO4_G = <br>Nemesis Pain Shock Free: %L
MOTD_INFO4_H = <br><br>Survivor: %L
MOTD_INFO4_I = <br>Survivor Chance: 1 in %d
MOTD_INFO4_J = <br>Survivor Health: %s
MOTD_INFO4_K = <br>Survivor Speed: %d
MOTD_INFO4_L = <br>Survivor Gravity: %d
MOTD_INFO4_M = <br>Survivor Leap: %L
MOTD_INFO4_N = <br>Survivor Pain Shock Free: %L
MOTD_INFO4_O = <br><br>Swarm Mode: %L
MOTD_INFO4_P = <br>Swarm Mode Chance: 1 in %d
MOTD_INFO4_Q = <br><br>Multi Infection: %L
MOTD_INFO4_R = <br>Multi Infection Chance: 1 in %d
MOTD_INFO4_S = <br>Infection Ratio: %d%%
MOTD_INFO4_T = <br><br>Plague Mode: %L
MOTD_INFO4_U = <br>Plague Mode Chance: 1 in %d
MOTD_INFO4_V = <br>Plague Infection Ratio: %d%%

MOTD_ENABLED = Active
MOTD_DISABLED = Desactive
MOTD_FOG = Fog
MOTD_RAIN = pluie
MOTD_SNOW = Neige
MOTD_ROTATING = portes enleve
MOTD_DOORS = Tout portes enleve
MOTD_DM_HUMAN = human respawn 
MOTD_DM_ZOMBIE = zombie respawn
MOTD_LIMITED = Limited
MOTD_AMMO_BP = recharge illimite
MOTD_AMMO_CLIP = clip illimite
MOTD_LASTZOMBIE = Uniquement le dernier zombie

ZOMBIE_ATTRIB1 = Sante
ZOMBIE_ATTRIB2 = vitesse 
ZOMBIE_ATTRIB3 = Gravite
ZOMBIE_ATTRIB4 = Knockback

CLASS_CLASS = Categorie:
CLASS_HUMAN = humain
CLASS_ZOMBIE = Zombie
CLASS_SURVIVOR = survivant
CLASS_NEMESIS = Nemesis

LAST_ZOMBIE_LEFT = Le dernier zombie est partie, %s est le nouveau zombie.
LAST_HUMAN_LEFT = Le dernier Humain est partie, %s est le nouvel Humain.
NOT_ENOUGH_AMMO = Vous n'avez pas assez de paquets de munitions.
AMMO_BOUGHT = Vous avez acheté des munitions supplémentaires pour vos armes.
ZOMBIE_SELECT = Votre class de zombie serat effective a la prochaine infection
AMMO_PACKS1 = Ammo packs:
AMMO_PACKS2 = munitions packs
SPECTATING = Spectateur:

[ro]
NOTICE_INFO1 = Apasa tasta M pentru a afisa meniul jocului
NOTICE_INFO2 = Apasa tasta , sau . pentru a cumpara munitie
NOTICE_VIRUS_FREE = T-virus a fost scapat de sub control !
NOTICE_FIRST = %s este primul zombie !
NOTICE_INFECT = %s a fost infectat !
NOTICE_INFECT2 = %s a fost infectat de %s !
NOTICE_ANTIDOTE = %s a folosit un antidot...
NOTICE_NEMESIS = %s este Nemesis !!!
NOTICE_SURVIVOR = %s este ultimul Supravietuitor !!!
NOTICE_SWARM = Mod Swarm !!!
NOTICE_MULTI = Infectare multipla !!!
NOTICE_PLAGUE = Mod Plague !!!

WIN_HUMAN = Oamenii au invins virusul!
WIN_ZOMBIE = Zombie au cucerit lumea!
WIN_NO_ONE = Lupta pentru supravietuire continua...

CMD_INFECT = a fost transformat in Zombie
CMD_DISINFECT = a fost transformat inapoi in Om
CMD_NEMESIS = a fost transformat in Nemesis
CMD_SURVIVAL = a fost transformat in Supravietuitor
CMD_SWARM = Incepe Modul Swarm
CMD_MULTI = Incepe Infectarea Multipla
CMD_PLAGUE = Incepe Modul Plague
CMD_RESPAWN = reinviat
CMD_NOT = Comanda indisponibila
CMD_ZOMBIE_ONLY = Aceasta este disponibila numai pentru zombie
CMD_HUMAN_ONLY = Aceasta este disponibila numai pentru oameni
CMD_NOT_STUCK = Nu esti blocat !
CMD_NOT_ACCESS = Nu ai acces !
CMD_NOT_CANTUSE = Momentan nu poti folosi aceasta optiune...
CMD_NOT_EXTRAS = Elementele extra sunt dezactivate !
CMD_NOT_ZCLASSES = Clasele de zombie sunt dezactivate !

MENU_BUY = Cumparare Arme
MENU_EXTRABUY = Cumparare Elemente Extra
MENU_ZCLASS = Alege Clasa De Zombie
MENU_UNSTUCK = Deblocare
MENU_ADMIN = Meniu Admin
MENU_INFO = Ajutor
MENU_SPECTATOR = Intra Spectator

MENU_BUY1_TITLE = Arme Primare
MENU_BUY2_TITLE = Arme Secundare
MENU_ZCLASS_TITLE = Clasa De Zombie
MENU_EXTRA_TITLE = Elemente Extra
MENU_ADMIN_TITLE = Meniu Admin
MENU_INFO_TITLE = Informatii Plugin

MENU_EXTRA1 = Ochelari cu infrarosu (o singura runda)
MENU_EXTRA2 = Antidot T-Virus
MENU_EXTRA3 = Zombie Madness
MENU_EXTRA4 = Grenada De Infectare
MENU_ADMIN1 = Vindeca | Infecteaza
MENU_ADMIN2 = Transforma In Nemesis
MENU_ADMIN3 = Lasa Un Singur Supravietuitor
MENU_ADMIN4 = Reinviaza
MENU_ADMIN5 = Incepe Modul Swarm
MENU_ADMIN6 = Incepe Infectare Multipla
MENU_ADMIN7 = Incepe Modul Plague
MENU_INFO1 = General
MENU_INFO2 = Oameni
MENU_INFO3 = Zombie
MENU_INFO4 = Moduri de Joc

MENU_AUTOSELECT = Tine Minte Preferinte
MENU_BACK = Inapoi
MENU_NEXT = Urmatorul
MENU_EXIT = Iesire

MOTD_INFO11 = <meta charset=UTF-8><body bgcolor=\"#000000\"><font color=\"#FF0505\"><b>%s %s de %s:</b> este un plugin de Counter-Strike, elaborat in conformitate cu AMX Mod X, unde oamenii si zombie se confrunta. Se bazeaza pe modul clasic de Zombie Infection: In fiecare runda un jucator aleator este ales pentru a fi primul zombie care va trebui sa infecteze restul oamenilor
MOTD_INFO12 = Sunt si caracteristici noi si imbunatatiri. De exemplu, aveti posibilitatea de a cumpara elemente extra (cum ar fi arme) în schimbul pachetelor de munitie. Aveti posibilitatea sa obtineti pachete de munitie prin a rani/omori un zombie sau prin infectarea unui om <br> <br> <br> <u> Setarile curente ale serverului:</u><br>
MOTD_INFO1_A = <br>Efecte Atmosfera:
MOTD_INFO1_B = <br>Nivel Lumina: %s
MOTD_INFO1_C = <br>Declansare Lumini: %L
MOTD_INFO1_D = <br>Fulgere O Data La: %d secunde
MOTD_INFO1_E = <br>Usi: %L
MOTD_INFO1_F = <br>Reincarnare: %L
MOTD_INFO1_G = <br>Timp De Protectie Dupa Reincarnare: %d secunde
MOTD_INFO1_H = <br>Reincarnare Aleatorie: %L
MOTD_INFO1_I = <br>Elemente Extra: %L
MOTD_INFO1_J = <br>Clase De Zombie: %L
MOTD_INFO1_K = <br>Ochelari Cu Infrarosu: %L
MOTD_INFO1_L = <br>Lanterna: %L
MOTD_INFO2 = <meta charset=UTF-8><body bgcolor=\"#000000\"><font color=\"#FF0505\"><b>Oamenii:</b> obiectivul lor este sa opreasca raspandirea infectiei. Acestia au un arsenal mare de arme, si pot folosi lanterne pe harti cu vizibilitate redusa. Lucrul in echipa aduce un avantaj oamenilor.<br><br><br><u>Setarile curente ale serverului:</u><br>
MOTD_INFO2_A = <br>Viata: %d
MOTD_INFO2_B = <br>Bonus De Viata Pentru Ultimul Om: %d
MOTD_INFO2_C = <br>Viteza: %d
MOTD_INFO2_D = <br>Gravitatie: %d
MOTD_INFO2_E = <br>Munitie: %L
MOTD_INFO2_F = <br>Daune Necesare Pentru A Primi Un Pachet De Munitie: %d
MOTD_INFO2_G = <br>Grenazi Foc: %L
MOTD_INFO2_H = <br>Grenazi Inghetare: %L
MOTD_INFO2_I = <br>Grenazi Lumina: %L
MOTD_INFO2_J = <br>KnockBack: %L
MOTD_INFO3 = <meta charset=UTF-8><body bgcolor=\"#000000\"><font color=\"#FF0505\"><b>Zombie:</b> obiectivul lor este sa infecteze toti oamenii. Ei pot vedea pe intuneric, dar au ca arma numai ghearele. Sunt 6 clase diferite de zombie din care sa alegi, fiecare cu forta si punctul sau slab, dar toti capabili sa infecteze<br><br><br><u>Setarile curente ale serverului:</u><br>
MOTD_INFO3_A = <br>Viata Zombie: %d
MOTD_INFO3_B = <br>Viata Primului Zombie: %d
MOTD_INFO3_C = <br>Armura: %d%% Rani Suferite
MOTD_INFO3_D = <br>Viteza: %d
MOTD_INFO3_E = <br>Gravitatie: %d
MOTD_INFO3_F = <br>Viata Pentru Infectare: %d
MOTD_INFO3_G = <br>Simte Ranile Suferite: %L
MOTD_INFO3_H = <br>Sangerare: %L
MOTD_INFO3_I = <br>Pachete De Munitie Pentru Infectare: %d
MOTD_INFO4 = <meta charset=UTF-8><body bgcolor=\"#000000\"><font color=\"#FF0505\"><b>Moduri:</b> exista 4 moduri speciale de gameplay care pot aparea in timpul jocului.<br><br><br><u>Setarile curente ale serverului:</u><br>
MOTD_INFO4_A = <br>Nemesis: %L
MOTD_INFO4_B = <br>Sansa Nemesis: 1 la %d
MOTD_INFO4_C = <br>Viata Nemesis: %s
MOTD_INFO4_D = <br>Viteza Nemesis: %d
MOTD_INFO4_E = <br>Gravitatie Nemesis: %d
MOTD_INFO4_F = <br>Sarituri Nemesis: %L
MOTD_INFO4_G = <br>Nemesis Simte Ranile Suferite: %L
MOTD_INFO4_H = <br><br>Supravietuitor: %L
MOTD_INFO4_I = <br>Sansa Supravietuitor: 1 la %d
MOTD_INFO4_J = <br>Viata Supravietuitor: %s
MOTD_INFO4_K = <br>Viteza Supravietuitor: %d
MOTD_INFO4_L = <br>Gravitatia Supravietuitor: %d
MOTD_INFO4_M = <br>Sarituri Supravietuitor: %L
MOTD_INFO4_N = <br>Supravietuitorul Simte Ranile Suferite: %L
MOTD_INFO4_O = <br><br>Modul Swarm: %L
MOTD_INFO4_P = <br>Sansa Mod Swarm: 1 in %d
MOTD_INFO4_Q = <br><br>Infectare Multipla: %L
MOTD_INFO4_R = <br>Sansa Infectie Multipla: 1 in %d
MOTD_INFO4_S = <br>Rata De Infectare: %d%%
MOTD_INFO4_T = <br><br>Modul Plague: %L
MOTD_INFO4_U = <br>Sansa Mod Plague: 1 in %d
MOTD_INFO4_V = <br>Rata De Infectare: %d%%

MOTD_ENABLED = Activat
MOTD_DISABLED = Dezactivat
MOTD_FOG = Ceata
MOTD_RAIN = Ploaie
MOTD_SNOW = Ninsoare
MOTD_ROTATING = Usi rorative eliminate
MOTD_DOORS = Toate usile au fost eliminate
MOTD_DM_HUMAN = Reinvie ca Om
MOTD_DM_ZOMBIE = Reinvie ca Zombie
MOTD_LIMITED = Limitat
MOTD_AMMO_BP = Incarcari Nelimitate
MOTD_AMMO_CLIP = Munitie Nelimitata
MOTD_LASTZOMBIE = Numai Ultimul Zombie

ZOMBIE_ATTRIB1 = Viata
ZOMBIE_ATTRIB2 = Viteza
ZOMBIE_ATTRIB3 = Gravitatie
ZOMBIE_ATTRIB4 = KnockBack

CLASS_CLASS = Clasa:
CLASS_HUMAN = Om
CLASS_ZOMBIE = Zombie
CLASS_SURVIVOR = Supravietuitor
CLASS_NEMESIS = Nemesis

LAST_ZOMBIE_LEFT = Ultimul zombie a iesit de pe server, %s este noul zombie !
LAST_HUMAN_LEFT = Ultimul om ne-a parasit, %s este noul om.
NOT_ENOUGH_AMMO = Nu ai destule pachete de munitie !
AMMO_BOUGHT = Ai Cumparat Extra Munitie Pentru Armele Tale
ZOMBIE_SELECT = Data viitoare cand vei fi infectat, clasa ta de zombie va fi
BUY_ENABLED = Meniul tau de arme a fost reactivat.
AMMO_PACKS1 = Pachete De Munitie:
AMMO_PACKS2 = Pachete De Munitie
SPECTATING = Urmaresti Pe:

[cz]
NOTICE_INFO1 = Stiskni "M" pro zobrazeni nabidky.
NOTICE_INFO2 = Stiskni . nebo , pro koupeni naboju.
NOTICE_VIRUS_FREE = T-Virus byl vypusten
NOTICE_FIRST = %s je prvni Zombie !
NOTICE_INFECT = %s byl nakazen.
NOTICE_INFECT2 = %s byl nakazen hracem %s.
NOTICE_ANTIDOTE = %s pouzil protilatku.
NOTICE_NEMESIS = %s je Nemesis !
NOTICE_SURVIVOR = %s je Vyvoleny !
NOTICE_SWARM = Hejno Zombies !
NOTICE_MULTI = Vicenasobna Infekce !
NOTICE_PLAGUE = Zacalo Zamoreni !

WIN_HUMAN = Lide vyhrali !
WIN_ZOMBIE = Zombie vyhrali !
WIN_NO_ONE = Toto kolo nikdo nevyhral

CMD_INFECT = Zmenen na Zombie
CMD_DISINFECT = Zmenen na Cloveka
CMD_NEMESIS = Znemen na Nemesis
CMD_SURVIVAL = Znemen na Vyvoleneho
CMD_SWARM = Hejno Zombies !
CMD_MULTI = Vicenasobna Infekce !
CMD_PLAGUE = Zacalo Zamoreni
CMD_RESPAWN = Respawnovan.
CMD_NOT = Neznamy prikaz.
CMD_ZOMBIE_ONLY = Tato Funkce pouze pro Zombie.
CMD_HUMAN_ONLY = Tato Funkce je pouze pro Lidi.
CMD_NOT_STUCK = Nejsi zaseknuty.
CMD_NOT_ACCESS = Nemas pristup.
CMD_NOT_CANTUSE = Ted nemuzes pouzit tuto Funkci.
CMD_NOT_EXTRAS = Bonus veci byli zakazany.
CMD_NOT_ZCLASSES = Zombie typy byli zakazany.

MENU_BUY = Zbrane
MENU_EXTRABUY = Bonus Veci
MENU_ZCLASS = Vyber Zombie
MENU_UNSTUCK = Odseknout
MENU_ADMIN = Admin Menu
MENU_INFO = Pomoc
MENU_SPECTATOR = Divak

MENU_BUY1_TITLE = Primarni Zbran
MENU_BUY2_TITLE = Sekundarni Zbran
MENU_ZCLASS_TITLE = Zombie Typ
MENU_EXTRA_TITLE = Bonus Veci
MENU_ADMIN_TITLE = Admin Menu
MENU_INFO_TITLE = Informace o Pluginu

MENU_EXTRA1 = Nocni Videni [Jedno Kolo]
MENU_EXTRA2 = T-Virus Protilatka
MENU_EXTRA3 = Infekcni Granat
MENU_EXTRA4 = Zombie Silenstvi
MENU_ADMIN1 = Vytvorit Zombie | Cloveka
MENU_ADMIN2 = Vytvorit Nemesis
MENU_ADMIN3 = Vytvorit Vyvoleneho
MENU_ADMIN4 = Respawnovat Hrace
MENU_ADMIN5 = Vytvorit Hejno Zombies
MENU_ADMIN6 = Zacit Vicenasobnou Infekci
MENU_ADMIN7 = Zacit Zamoreni
MENU_INFO1 = Hlavni
MENU_INFO2 = Lide
MENU_INFO3 = Zombies
MENU_INFO4 = Herni Mody

MENU_AUTOSELECT = Zapamatovat Vyber
MENU_BACK = Zpet
MENU_NEXT = Dalsi
MENU_EXIT = Konec

MOTD_INFO11 = <meta charset=UTF-8><body bgcolor=\"#000000\"><font color=\"#FF0505\"><b>%s %s by %s : je mod Hry Counter-Strike vyvinuty pro AMX Mod X Plugin.</b>
MOTD_INFO12 = <b>V nove verzi je spoustu novych veci. Napriklad muzes kupovat Bonusove Veci za body [ Nocni Videni a Silne Zbrane jako Clovek nebo Infikovany Granat, T-Virus Protilatku a Zombie Silenstvi jako Zombie ] Body ziskavas za Nakazu Lidi, Zabijeni Zombie nebo za urcity pocet DMG<br><br><u>Aktualni Nastaveni Serveru:</b></u><br>
MOTD_INFO1_A = <b><br>Efekty
MOTD_INFO1_B = <br>Uroven Sviceni [ %s ]
MOTD_INFO1_C = <br>Spousteni Svetel [ %L ]
MOTD_INFO1_D = <br>Hrmeni kazdych [ %d ] vterin
MOTD_INFO1_E = <br>Dvere [ %L ]
MOTD_INFO1_F = <br>Deathmatch [ %L ]
MOTD_INFO1_G = <br>Cas Spawnove Protekce [ %d ] vterin
MOTD_INFO1_H = <br>Nahodne Spawnovani [ %L ]
MOTD_INFO1_I = <br>Bonus Veci [ %L ]
MOTD_INFO1_J = <br>Zombie Typ [ %L ]
MOTD_INFO1_K = <br>Nahodna Barva Nocniho Videni [ %L ]
MOTD_INFO1_L = <br>Nahodna Barva Baterky [ %L ]</b>
MOTD_INFO2 = <meta charset=UTF-8><body bgcolor=\"#000000\"><font color=\"#FF0505\"><b>Ukolem Lidi je zabit vsechny Zombie. Maji k dispozici hodne zbrani. Bez teamove prace lide nemaji sanci.<br><br><u>Aktualni Nastaveni Lidi:</u><br>
MOTD_INFO2_A = <b><br>Zdravi [ %d ]
MOTD_INFO2_B = <br>Zdravi posledniho Cloveka [ %d ]
MOTD_INFO2_C = <br>Rychlost [ %d ]
MOTD_INFO2_D = <br>Gravitace [ %d ]
MOTD_INFO2_E = <br>Naboje [ %L ]
MOTD_INFO2_F = <br>Pocet poskozeni pro ziskani jednoho bodu [ %d DMG ]
MOTD_INFO2_G = <br>Ohnive Granaty [ %L ]
MOTD_INFO2_H = <br>Ledove Granaty [ %L ]
MOTD_INFO2_I = <br>Svetlice [ %L ]
MOTD_INFO2_J = <br>Odhozeni [ %L ]</b>
MOTD_INFO3 = <meta charset=UTF-8><body bgcolor=\"#000000\"><font color=\"#FF0505\"><b>Ukolem Zombies je nakazit vsechny Lidi. Je zde 5. Typu Zombie, kazdy z nich ma svoje vyhody a nevyhody, ale vsichni maji jeden stejny ukol.<br><br><u>Aktualni Nastaveni Zombies:</b></u><br>
MOTD_INFO3_A = <b><br>Zdravi [ %d ]
MOTD_INFO3_B = <br>Zdravi prvniho Zombie [ %d HP ]
MOTD_INFO3_C = <br>Brneni [ %d%% ]
MOTD_INFO3_D = <br>Rychlost [ %d ]
MOTD_INFO3_E = <br>Gravitace [ %d ]
MOTD_INFO3_F = <br>Zdravi za Infekci [ %d ]
MOTD_INFO3_G = <br>Bolest [ %L ]
MOTD_INFO3_H = <br>Krvaceni [ %L ]
MOTD_INFO3_I = <br>Body za Infekci [ %d ]</b>
MOTD_INFO4 = <meta charset=UTF-8><body bgcolor=\"#000000\"><font color=\"#FF0505\"><b><u>Aktualni Nastaveni Modu:</b></u><br>
MOTD_INFO4_A = <b><br>Nemesis - Stav [ %L ]
MOTD_INFO4_B = <br>Nemesis - Sance [ 1 v %d ]
MOTD_INFO4_C = <br>Nemesis - Zdravi %s
MOTD_INFO4_D = <br>Nemesis - Rychlost [ %d ]
MOTD_INFO4_E = <br>Nemesis - Gravitace [ %d ]
MOTD_INFO4_F = <br>Nemesis - Dlouhy Skok [ %L ]
MOTD_INFO4_G = <br>Nemesis - Bolest [ %L ]
MOTD_INFO4_H = <br><br>Vyvoleny - Stav [ %L ]
MOTD_INFO4_I = <br>Vyvoleny - Sance [ 1 v %d ]
MOTD_INFO4_J = <br>Vyvoleny - Zdravi %s
MOTD_INFO4_K = <br>Vyvoleny - Rychlost [ %d ]
MOTD_INFO4_L = <br>Vyvoleny - Gravitace [ %d ]
MOTD_INFO4_M = <br>Vyvoleny - Dlouhy Skok [ %L ]
MOTD_INFO4_N = <br>Vyvoleny - Bolest [ %L ]
MOTD_INFO4_O = <br><br>Hejno - Stav [ %L ]
MOTD_INFO4_P = <br>Hejno - Sance [ 1 v %d ]
MOTD_INFO4_Q = <br><br>Vicenasobna Infekce - Stav [ %L ]
MOTD_INFO4_R = <br>Vicenasobna Infekce - Sance [ 1 v %d ]
MOTD_INFO4_S = <br>Vicenasobna Infekce - Pocet Infikovanych Hracu z Celku [ %d%% ]
MOTD_INFO4_T = <br><br>Zamoreni - Stav [ %L ]
MOTD_INFO4_U = <br>Zamoreni - Sance [ 1 v %d ]
MOTD_INFO4_V = <br>Zamoreni - Pocet Infikovanych Hracu z Celku [ %d%% ]</b>

MOTD_ENABLED = Povoleno
MOTD_DISABLED = Zakazano
MOTD_FOG = Mlha
MOTD_RAIN = Dest
MOTD_SNOW = Snih
MOTD_ROTATING = Rotujici Dvere odstraneny
MOTD_DOORS = Vsechny Dvere odstraneny
MOTD_DM_HUMAN = Respawnovan jako Clovek
MOTD_DM_ZOMBIE = Respawnovan jako Zombie
MOTD_LIMITED = Limitovane
MOTD_AMMO_BP = Bez Prebijeni
MOTD_AMMO_CLIP = Neomezene mnozstvi Zasobniku
MOTD_LASTZOMBIE = Jen posledni Zombie

ZOMBIE_ATTRIB1 = Zdravi
ZOMBIE_ATTRIB2 = Rychlost
ZOMBIE_ATTRIB3 = Gravitace
ZOMBIE_ATTRIB4 = Odhozeni

CLASS_CLASS = Typ:
CLASS_HUMAN = Clovek
CLASS_ZOMBIE = Zombie
CLASS_SURVIVOR = Vyvoleny
CLASS_NEMESIS = Nemesis

LAST_ZOMBIE_LEFT = Posledni Zombie odesel. Novy Zombie je %s
LAST_HUMAN_LEFT = Posledni Clovek odesel. Novy Clovek je %s
NOT_ENOUGH_AMMO = Nemas dost bodu
AMMO_BOUGHT = Koupil jsi naboje
ZOMBIE_SELECT = Po pristim nakazeni budes zombie typu
BUY_ENABLED = Nakupni menu bylo opet aktivovano.
AMMO_PACKS1 = Body:
AMMO_PACKS2 = Bodu
SPECTATING = Sledujes Hrace:

[sk]
NOTICE_INFO1 = Stlac "M" na zobrazenie ponuky.
NOTICE_INFO2 = Stlac . alebo , pre nakupenie nábojov.
NOTICE_VIRUS_FREE = T-Virus vypusteny.
NOTICE_FIRST = %s je prvy Zombie !
NOTICE_INFECT = %s bol nakazeny.
NOTICE_INFECT2 = %s bol nakazeny hracom %s.
NOTICE_ANTIDOTE = %s pouzil protilatku.
NOTICE_NEMESIS = %s je Nemesis !
NOTICE_SURVIVOR = %s je Vyvoleny !
NOTICE_SWARM = Stado Zombies !
NOTICE_MULTI = Viacnasobna Infekcia !
NOTICE_PLAGUE = Zacalo Zamorenie !

WIN_HUMAN = Ludia vyhrali !
WIN_ZOMBIE = Zombie vyhrali !
WIN_NO_ONE = Toto kolo nikto nevyhral

CMD_INFECT = Zmeneny na Zombie
CMD_DISINFECT = Zmeneny na Cloveka
CMD_NEMESIS = Znemeny na Nemesis
CMD_SURVIVAL = Znemeny na Vyvoleneho
CMD_SWARM = Stado Zombies 
CMD_MULTI = Viacnasobna Infekcia 
CMD_PLAGUE = Zacalo Zamorenie.
CMD_RESPAWN = Respawnovanie.
CMD_NOT = Neznamy prikaz.
CMD_ZOMBIE_ONLY = Tato Funkcia je iba pre Zombie.
CMD_HUMAN_ONLY = Tato Funkcia je iba pre Ludi.
CMD_NOT_STUCK = Nie si zaseknuty.
CMD_NOT_ACCESS = Nemas pristup.
CMD_NOT_CANTUSE = Teraz nemozes pouzit tuto funkciu.
CMD_NOT_EXTRAS = Bonusove vybavenie bolo zakazane.
CMD_NOT_ZCLASSES = Zombie typy boli zakazane.

MENU_BUY = Zbrane
MENU_EXTRABUY = Bonusove Vybavenie
MENU_ZCLASS = Vyber Zombie
MENU_UNSTUCK = Odseknut
MENU_ADMIN = Admin Menu
MENU_INFO = Pomoc
MENU_SPECTATOR = Divak

MENU_BUY1_TITLE = Primarna Zbran
MENU_BUY2_TITLE = Sekundarna Zbran
MENU_ZCLASS_TITLE = Zombie Typ
MENU_EXTRA_TITLE = Bonusove Vybavenie
MENU_ADMIN_TITLE = Admin Menu
MENU_INFO_TITLE = Informacie o Plugine

MENU_EXTRA1 = Nocne Videnie [Jedno Kolo]
MENU_EXTRA2 = T-Virus Protilatka
MENU_EXTRA3 = Infekcny Granat
MENU_EXTRA4 = Zombie Sialenstvo
MENU_ADMIN1 = Vytvorit Zombie | Cloveka
MENU_ADMIN2 = Vytvorit Nemesis
MENU_ADMIN3 = Vytvorit Vyvoleneho
MENU_ADMIN4 = Respawnovat Hraca
MENU_ADMIN5 = Vytvorit Stado Zombies
MENU_ADMIN6 = Zacat Viacnasobnu Infekciu
MENU_ADMIN7 = Zacat Zamorenie
MENU_INFO1 = Hlavne
MENU_INFO2 = Ludia
MENU_INFO3 = Zombies
MENU_INFO4 = Herne Mody

MENU_AUTOSELECT = Zapamatat Vyber
MENU_BACK = Spat
MENU_NEXT = Dalsi
MENU_EXIT = Koniec

MOTD_INFO11 = <meta charset=UTF-8><body bgcolor=\"#000000\"><font color=\"#FF0505\"><b>%s %s by %s : je Mod Hry Counter-Strike vyvinuty pre AMX Mod X Plugin.</b>
MOTD_INFO12 = <b>V novej verzi je mnoho novych veci. Napriklad mozes kupovat Bonusove Vybavenie za body [ Nocne Videnie a Silne Zbrane ako Clovek alebo Infikovany Granat, T-Virus Protilatku a Zombie Sialenstvo ako Zombie ] Body ziskavas za Nakazenie Ludi, Zabijenie Zombie alebo za urcity pocet DMG<br><br><u>Aktualne Nastavenie Serveru:</b></u><br>
MOTD_INFO1_A = <b><br>Efekty
MOTD_INFO1_B = <br>Uroven Svietenia [ %s ]
MOTD_INFO1_C = <br>Spustenie Svetiel [ %L ]
MOTD_INFO1_D = <br>Hrmenie kazdych [ %d ] sekund
MOTD_INFO1_E = <br>Dvere [ %L ]
MOTD_INFO1_F = <br>Deathmatch [ %L ]
MOTD_INFO1_G = <br>Cas Spawn ochrany [ %d ] sekund
MOTD_INFO1_H = <br>Nahodne Spawnovanie [ %L ]
MOTD_INFO1_I = <br>Bonusove vybavenie [ %L ]
MOTD_INFO1_J = <br>Zombie Typ [ %L ]
MOTD_INFO1_K = <br>Nahodna Farva Nocneho Videnia [ %L ]
MOTD_INFO1_L = <br>Nahodna Farva Baterky [ %L ]</b>
MOTD_INFO2 = <meta charset=UTF-8><body bgcolor=\"#000000\"><font color=\"#FF0505\"><b>Ulohou Ludi je zabit vsetych Zombie. Maju k dispozicii velky arzenal zbrani. Bez teamovej prace ludi nemaju sancu.<br><br><u>Aktualne Nastavenie Ludi:</u><br>
MOTD_INFO2_A = <b><br>Zdravie [ %d ]
MOTD_INFO2_B = <br>Zdravie posledneho Cloveka [ %d ]
MOTD_INFO2_C = <br>Rychlost [ %d ]
MOTD_INFO2_D = <br>Gravitacia [ %d ]
MOTD_INFO2_E = <br>Naboje [ %L ]
MOTD_INFO2_F = <br>Vyska poskodenia pre ziskani jedneho bodu [ %d DMG ]
MOTD_INFO2_G = <br>Ohnive Granaty [ %L ]
MOTD_INFO2_H = <br>Ladove Granaty [ %L ]
MOTD_INFO2_I = <br>Svetlice [ %L ]
MOTD_INFO2_J = <br>Odhodenie [ %L ]</b>
MOTD_INFO3 = <meta charset=UTF-8><body bgcolor=\"#000000\"><font color=\"#FF0505\"><b>Ulohou Zombies je nakazit vsetych Ludi. Je tu 5 typov Zombie, kazdy z nich ma svoje vyhody a nevyhody, ale vsetci maju rovnaku ulohu.<br><br><u>Aktualne Nastavenie Zombies:</b></u><br>
MOTD_INFO3_A = <b><br>Zdravie [ %d ]
MOTD_INFO3_B = <br>Zdravie prveho Zombie [ %d HP ]
MOTD_INFO3_C = <br>Brnenie [ %d%% ]
MOTD_INFO3_D = <br>Rychlost [ %d ]
MOTD_INFO3_E = <br>Gravitacia [ %d ]
MOTD_INFO3_F = <br>Zdravie za Infekciu[ %d ]
MOTD_INFO3_G = <br>Bolest [ %L ]
MOTD_INFO3_H = <br>Krvacenie [ %L ]
MOTD_INFO3_I = <br>Body za Infekciu [ %d ]</b>
MOTD_INFO4 = <meta charset=UTF-8><body bgcolor=\"#000000\"><font color=\"#FF0505\"><b><u>Aktualne Nastavenie Modu:</b></u><br>
MOTD_INFO4_A = <b><br>Nemesis - Stav [ %L ]
MOTD_INFO4_B = <br>Nemesis - Sanca [ 1 v %d ]
MOTD_INFO4_C = <br>Nemesis - Zdravie [ %s ]
MOTD_INFO4_D = <br>Nemesis - Rychlost [ %d ]
MOTD_INFO4_E = <br>Nemesis - Gravitacia [ %d ]
MOTD_INFO4_F = <br>Nemesis - Dlhy Skok [ %L ]
MOTD_INFO4_G = <br>Nemesis - Bolest [ %L ]
MOTD_INFO4_H = <br><br>Vyvoleny - Stav [ %L ]
MOTD_INFO4_I = <br>Vyvoleny - Sanca [ 1 v %d ]
MOTD_INFO4_J = <br>Vyvoleny - Zdravie %s
MOTD_INFO4_K = <br>Vyvoleny - Rychlost [ %d ]
MOTD_INFO4_L = <br>Vyvoleny - Gravitacia [ %d ]
MOTD_INFO4_M = <br>Vyvoleny - Dlhy Skok [ %L ]
MOTD_INFO4_N = <br>Vyvoleny - Bolest [ %L ]
MOTD_INFO4_O = <br><br>Hejno - Stav [ %L ]
MOTD_INFO4_P = <br>Hejno - Sanca [ 1 v %d ]
MOTD_INFO4_Q = <br><br>Viacnasobna Infekcia - Stav [ %L ]
MOTD_INFO4_R = <br>Viacnasobna Infekcia - Sanca [ 1 v %d ]
MOTD_INFO4_S = <br>Viacnasobna Infekcia - Pocet Infikovanych Hracov z Celku [ %d%% ]
MOTD_INFO4_T = <br><br>Zamorenie - Stav [ %L ]
MOTD_INFO4_U = <br>Zamorenie - Sanca [ 1 v %d ]
MOTD_INFO4_V = <br>Zamorenie - Pocet Infikovanych Hracov z Celku [ %d%% ]</b>

MOTD_ENABLED = Povolene
MOTD_DISABLED = Zakazane
MOTD_FOG = Hmla
MOTD_RAIN = Dazd
MOTD_SNOW = Sneh
MOTD_ROTATING = Rotujuce Dvere odstranene
MOTD_DOORS = Vsetky Dvere odstranene
MOTD_DM_HUMAN = Respawnovany ako Clovek
MOTD_DM_ZOMBIE = Respawnovany ako Zombie
MOTD_LIMITED = Limitovane
MOTD_AMMO_BP = Bez Prebijania
MOTD_AMMO_CLIP = Neobmedzene mnozstvo Zasobnikov
MOTD_LASTZOMBIE = Iba posledny Zombie

ZOMBIE_ATTRIB1 = Zdravie
ZOMBIE_ATTRIB2 = Rychlost
ZOMBIE_ATTRIB3 = Gravitacia
ZOMBIE_ATTRIB4 = Odhodenie

CLASS_CLASS = Typ:
CLASS_HUMAN = Clovek
CLASS_ZOMBIE = Zombie
CLASS_SURVIVOR = Vyvoleny
CLASS_NEMESIS = Nemesis

LAST_ZOMBIE_LEFT = Posledny Zombie odisiel. Novy Zombie je %s
LAST_HUMAN_LEFT = Posledny Clovek odisiel. Novy Clovek je %s
NOT_ENOUGH_AMMO = Nemas dostatok bodov
AMMO_BOUGHT = Kupil si naboje
ZOMBIE_SELECT = Po nasledujucej nakaze budes zombie typu
BUY_ENABLED = Nakupne menu bolo opat aktivovane.
AMMO_PACKS1 = Body:
AMMO_PACKS2 = Bodov
SPECTATING = Sledujes Hrace:

[sv]
NOTICE_INFO1 = Tryck M f'o'r att visa spel menyn
NOTICE_INFO2 = Tryck , eller . f'o'r att k'o'pa ammo
NOTICE_VIRUS_FREE = T-Viruset har blivit frisl'a'ppt...
NOTICE_FIRST = %s 'a'r den f'o'rsta zombie'n !!
NOTICE_INFECT = %s's hj'a'rna har blivit upp'a'ten...
NOTICE_INFECT2 = %s's hj'a'rna har blivit upp'a'ten av %s...
NOTICE_ANTIDOTE = %s har anv'a'nt ett motgift...
NOTICE_NEMESIS = %s 'a'r en Nemesis !!!
NOTICE_SURVIVOR = %s 'a'r en 'o'verlevande !!!
NOTICE_SWARM = Swarm Mode !!!
NOTICE_MULTI = Flera infektioner !!!
NOTICE_PLAGUE = Plague Mode !!!

WIN_HUMAN = M'a'nniskorna har vunnit 'o'ver virusen!
WIN_ZOMBIE = Zombies har tagit 'o'ver makten!
WIN_NO_ONE = Ingen vann...

CMD_INFECT = F'o'rvandlades till en Zombie
CMD_DISINFECT = Blev en m'a'nniska igen
CMD_NEMESIS = F'o'rvandlades till en Nemesis
CMD_SURVIVAL = blev en 'o'verlevande
CMD_SWARM = starta Swarm Mode
CMD_MULTI = starta Flera infektioner
CMD_PLAGUE = starta Plague Mode
CMD_RESPAWN = Aterupplivad
CMD_NOT = Ogiltigt kommando.
CMD_ZOMBIE_ONLY = Detta 'a'r Endast tillg'a'ngligt f'o'r zombies.
CMD_HUMAN_ONLY = Detta 'a'r Endast tillg'a'ngligt f'o'r m'a'nniskorna.
CMD_NOT_STUCK = Du sitter inte fast.
CMD_NOT_ACCESS = Du har inga r'a'ttigheter.
CMD_NOT_CANTUSE = Du kan inte anv'a'nda detta just nu.
CMD_NOT_EXTRAS = Extra saker 'a'r avaktiverade.
CMD_NOT_ZCLASSES = Zombie klasser 'a'r avaktiverade.

MENU_BUY = K'o'p vapen
MENU_EXTRABUY = K'o'p extra saker
MENU_ZCLASS = V'a'lj zombie klass
MENU_UNSTUCK = Sl'a'pp mig fri
MENU_ADMIN = Admin Meny
MENU_INFO = Hj'a'lp
MENU_SPECTATOR = Bli Spectator

MENU_BUY1_TITLE = Prim'a'rt vapen
MENU_BUY2_TITLE = Sekund'a'rt vapen
MENU_ZCLASS_TITLE = Zombie klass
MENU_EXTRA_TITLE = Extra saker
MENU_ADMIN_TITLE = Admin Meny
MENU_INFO_TITLE = Plugin Information

MENU_EXTRA1 = M'o'rkerseende (en runda)
MENU_EXTRA2 = T-Virus Motgift
MENU_EXTRA3 = Zombie Ilska
MENU_EXTRA4 = Infektion Bomb
MENU_ADMIN1 = Skapa Zombie/M'a'nniska
MENU_ADMIN2 = Skapa Nemesis
MENU_ADMIN3 = Skapa 'o'verlevande
MENU_ADMIN4 = Ateruppliva Nagon
MENU_ADMIN5 = Starta Swarm Mode
MENU_ADMIN6 = Starta Dubbla Infektioner
MENU_ADMIN7 = Starta Plague Mode
MENU_INFO1 = Generellt
MENU_INFO2 = M'a'nniskor
MENU_INFO3 = Zombies
MENU_INFO4 = Olika spels'a'tt

MENU_AUTOSELECT = Kom ihag val
MENU_BACK = Bakat
MENU_NEXT = N'a'sta
MENU_EXIT = Avsluta

MOTD_INFO11 = <meta charset=UTF-8><body bgcolor=\"#000000\"><font color=\"#FF0505\"><b>%s %s by %s :</b> 'a'r ett Counter-Strike plugin utvecklat f'o'r AMX Mod X, d'a'r m'a'nniskor och zombies m'o'ter varandra. Det 'a'r baserat pa den klassiska zombie infektionsmodden: Varje runda startar med att en slumpad spelare v'a'ljs till att bli den f'o'rsta zombien som sedan ska d'o'da resten av spelarna. 
MOTD_INFO12 = Men det 'a'r nya funktioner och f'o'rb'a'ttringar. Ett exempel, du har m'o'jligheten att k'o'pa extra saker (som vapen) i utbyte mot ammunition. Du kan fa ammunition genom att d'o'da zombies/infektera m'a'nniskor.<br><br><br><u>Nuvarande server inst'a'llningar:</u><br>
MOTD_INFO1_A = <br>Atmosf'a'r effekter:
MOTD_INFO1_B = <br>Ljusstyrka: %s
MOTD_INFO1_C = <br>Utl'o'sta lampor: %L
MOTD_INFO1_D = <br>Thunderclaps Varje: %d sekund
MOTD_INFO1_E = <br>D'o'rrar: %L
MOTD_INFO1_F = <br>Deathmatch: %L
MOTD_INFO1_G = <br>Aterupplivad Skyddstid: %d sekunder
MOTD_INFO1_H = <br>Slumpad aterupplevnad: %L
MOTD_INFO1_I = <br>Extra Saker: %L
MOTD_INFO1_J = <br>Zombie Klasser: %L
MOTD_INFO1_K = <br>Olika M'o'rkerseenden: %L
MOTD_INFO1_L = <br>Olika Lampor: %L
MOTD_INFO2 = <meta charset=UTF-8><body bgcolor=\"#000000\"><font color=\"#FF0505\"><b>M'a'nniskor:</b> deras uppdrag 'a'r att eliminera nagot zombie hot. De har ett stort urval av vapen att v'a'lja bland, och att anv'a'nda lampor pa m'o'rka banor. Lagsamarbete 'a'r ett maste f'o'r att 'o'verleva!<br><br><br><u>Nuvarande server inst'a'llningar:</u><br>
MOTD_INFO2_A = <br>He'a'lsa: %d
MOTD_INFO2_B = <br>H'a'lsa belo'ning f'o'r Senaste M'a'nniskan: %d
MOTD_INFO2_C = <br>Hastighet: %d
MOTD_INFO2_D = <br>Gravitation: %d
MOTD_INFO2_E = <br>Ammo: %L
MOTD_INFO2_F = <br>Skada f'o'r att fa Ammo: %d
MOTD_INFO2_G = <br>Eld granater: %L
MOTD_INFO2_H = <br>Frost granater: %L
MOTD_INFO2_I = <br>Lysgranater: %L
MOTD_INFO2_J = <br>'O'veraska: %L
MOTD_INFO3 = <meta charset=UTF-8><body bgcolor=\"#000000\"><font color=\"#FF0505\"><b>Zombies:</b> deras uppdrag 'a'r att infektera varje levande m'a'nniska. De har m'o'jligheten att see n'a'r det 'a'r m'o'rkt, men kan endast d'o'da nagon med kniven. Det finns 6 olika zombieklasser att v'a'lja mellan, varje klass har sin egen styrka och svaghet, men alla kapabla till att 'a'ta hj'a'rnor.<br><br><br><u>Nuvarande server inst'a'llningar:</u><br>
MOTD_INFO3_A = <br>Zombie H'a'lsa: %d
MOTD_INFO3_B = <br>F'o'rsta Zombie H'a'lsan: %d
MOTD_INFO3_C = <br>Armor: %d%% skada skedd
MOTD_INFO3_D = <br>Hastighet: %d
MOTD_INFO3_E = <br>Gravitation: %d
MOTD_INFO3_F = <br>HP f'o'r Infektion: %d
MOTD_INFO3_G = <br>Sm'a'rta Skakfri: %L
MOTD_INFO3_H = <br>Bl'o'der: %L
MOTD_INFO3_I = <br>Ammo Paket F'o'r Infektion: %d
MOTD_INFO4 = <meta charset=UTF-8><body bgcolor=\"#000000\"><font color=\"#FF0505\"><b>Mini-spell'a'gen:</b> det finns 4 olika speciella spell'a'gen som slumpvis uppkommer genomspelets gang.<br><br><br><u>Nuvarande server inst'a'llningar:</u><br>
MOTD_INFO4_A = <br>Nemesis: %L
MOTD_INFO4_B = <br>Nemesis Chans: 1 in %d
MOTD_INFO4_C = <br>Nemesis H'a'lsa: %s
MOTD_INFO4_D = <br>Nemesis Hastighet: %d
MOTD_INFO4_E = <br>Nemesis Gravitation: %d
MOTD_INFO4_F = <br>Nemesis Hoppa: %L
MOTD_INFO4_G = <br>Nemesis Sm'a'rtskaksfri: %L
MOTD_INFO4_H = <br><br>'O'verlevande: %L
MOTD_INFO4_I = <br>Survivor Chans: 1 in %d
MOTD_INFO4_J = <br>Survivor H'a'lsa: %s
MOTD_INFO4_K = <br>Survivor Hastighet: %d
MOTD_INFO4_L = <br>Survivor Gravitation: %d
MOTD_INFO4_M = <br>Survivor Hoppa: %L
MOTD_INFO4_N = <br>Survivor Sm'a'rtskaksfri: %L
MOTD_INFO4_O = <br><br>Swarm Mode: %L
MOTD_INFO4_P = <br>Swarm Mode Chans: 1 in %d
MOTD_INFO4_Q = <br><br>Dubbel infektion: %L
MOTD_INFO4_R = <br>Chans F'o'r Dubbelinfektion: 1 in %d
MOTD_INFO4_S = <br>Infektion Ratio: %d%%
MOTD_INFO4_T = <br><br>Plague Mode: %L
MOTD_INFO4_U = <br>Plague Mode Chans: 1 in %d
MOTD_INFO4_V = <br>Infektion Ratio: %d%%

MOTD_ENABLED = Aktiverad
MOTD_DISABLED = Avaktiverad
MOTD_FOG = Dimma 
MOTD_RAIN = Regn
MOTD_SNOW = Sn'o'
MOTD_ROTATING = Roterande d'o'rrar borttagna
MOTD_DOORS = Alla d'o'rrar borttagna
MOTD_DM_HUMAN = Aterupplivad som M'a'nniska
MOTD_DM_ZOMBIE = Aterupplivad som Zombie
MOTD_LIMITED = Begr'a'nsad
MOTD_AMMO_BP = Obegr'a'nsat med omladdningar
MOTD_AMMO_CLIP = Obegr'a'nsad takt
MOTD_LASTZOMBIE = Endast pa sista zombie'n

ZOMBIE_ATTRIB1 = H'a'lsa
ZOMBIE_ATTRIB2 = Hastighet
ZOMBIE_ATTRIB3 = Gravitation
ZOMBIE_ATTRIB4 = 'O'verraska

CLASS_CLASS = Klass:
CLASS_HUMAN = M'a'nniska
CLASS_ZOMBIE = Zombie
CLASS_SURVIVOR = 'O'verlevande
CLASS_NEMESIS = Nemesis

LAST_ZOMBIE_LEFT = Den sista zombie'n har l'a'mnat oss, %s 'a'r den nya zombie'n.
LAST_HUMAN_LEFT = Den sista m'a'nniskan har l'a'mnat oss, %s 'a'r den nya m'a'nniskan.
NOT_ENOUGH_AMMO = Du har inte tillr'a'ckligt med ammo.
AMMO_BOUGHT = Du k'o'pte extra ammo till dina vapen.
ZOMBIE_SELECT = Din zombieklass efter din n'a'sta infektion kommer att bli
BUY_ENABLED = Din k'o'pmeny har blivit ateraktiverad.
AMMO_PACKS1 = Ammo paket:
AMMO_PACKS2 = ammo paket
SPECTATING = Spectator:

[nl]
NOTICE_INFO1 = Druk op M om het menu te zien
NOTICE_INFO2 = Druk op , of . om kogels te kopen
NOTICE_VIRUS_FREE = Het T-Virus is uitgebroken...
NOTICE_FIRST = %s is de eerste zombie!!
NOTICE_INFECT = %s's hersenen zijn opgegeten...
NOTICE_INFECT2 = %s's hersenen zijn gegeten door %s...
NOTICE_ANTIDOTE = %s heeft een tegengif gebruikt...
NOTICE_NEMESIS = %s is de Nemesis !!!
NOTICE_SURVIVOR = %s is een Overlevende !!!
NOTICE_SWARM = Zwerm Modus !!!
NOTICE_MULTI = Meerdere Infecties !!!
NOTICE_PLAGUE = Plaag Modus !!!

WIN_HUMAN = De mensen hebben de plaag verslagen!
WIN_ZOMBIE = Zombies hebben de wereld overgenomen!
WIN_NO_ONE = Niemand heeft gewonnen...

CMD_INFECT = veranderde in een Zombie
CMD_DISINFECT = veranderde terug in een Mens
CMD_NEMESIS = veranderde in een Nemesis
CMD_SURVIVAL = veranderde in een Overlevende
CMD_SWARM = start Zwerm Modus
CMD_MULTI = start Meerdere Infecties
CMD_PLAGUE = start Plaag Modus
CMD_RESPAWN = terug tot leven gekomen
CMD_NOT = Onbekend commando.
CMD_ZOMBIE_ONLY = Dit is alleen toegankelijk voor zombies.
CMD_HUMAN_ONLY = Dit is alleen toegankelijk voor mensen.
CMD_NOT_STUCK = Je zit niet vast.
CMD_NOT_ACCESS = Je hebt geen toegang.
CMD_NOT_CANTUSE = Je kan dit niet gebruiken op dit moment.
CMD_NOT_EXTRAS = Extra Spullen zijn uitgeschakeld.
CMD_NOT_ZCLASSES = Zombie Klasses zijn uitgeschakeld.

MENU_BUY = Koop Wapens
MENU_EXTRABUY = Koop Extra Spullen
MENU_ZCLASS = Kies een Zombie Klasse
MENU_UNSTUCK = Maak jezelf vrij
MENU_ADMIN = Admin Menu
MENU_INFO = Help
MENU_SPECTATOR = Ga naar de Spectators

MENU_BUY1_TITLE = Primaire Wapens (Geweren)
MENU_BUY2_TITLE = Secondaire Wapens (Pistolen)
MENU_ZCLASS_TITLE = Zombie Klasse
MENU_EXTRA_TITLE = Extra Spullen
MENU_ADMIN_TITLE = Admin Menu
MENU_INFO_TITLE = Plugin Informatie

MENU_EXTRA1 = Nachtkijker (één ronde)
MENU_EXTRA2 = T-Virus Tegengif
MENU_EXTRA3 = Zombie Gekte
MENU_EXTRA4 = Infectie Bom
MENU_ADMIN1 = Maak Zombie/Human
MENU_ADMIN2 = Maak Nemesis
MENU_ADMIN3 = Maak Overlevende
MENU_ADMIN4 = Breng iemand terug tot leven
MENU_ADMIN5 = Start Zwerm Modus
MENU_ADMIN6 = Start Meerdere infecties
MENU_ADMIN7 = Start Plaag Modus
MENU_INFO1 = Algemeen
MENU_INFO2 = Mensen
MENU_INFO3 = Zombies
MENU_INFO4 = Spel Modi

MENU_AUTOSELECT = Onthoud geselecteerd
MENU_BACK = Terug
MENU_NEXT = Volgende
MENU_EXIT = Verlaat

MOTD_INFO11 = <meta charset=UTF-8><body bgcolor=\"#000000\"><font color=\"#FF0505\"><b>%s %s door %s :</b> is een Counter-Strike plugin gemaakt voor AMX Mod X, waar mensen en zombies tegen elkaar strijden. Het is gebaseerd op de klassieke Zombie Infection Mod: in elke ronde wordt er een willekeurige speler gekozen die als eerste een zombie wordt, met als doel de andere spelers te infecteren.
MOTD_INFO12 = Maar er zijn nieuwe eigenschappen en verhogingen. Bijvoorbeeld, je hebt de mogelijkheid om extra spullen (zoals wapens) te kopen in uitwisseling voor munitie pakketten (in plaats van geld). Je krijgt munitie pakketten door een zombie te vermoorden of door mensen te infecteren.<br><br><br><u>Configuratie in deze server:</u><br>
MOTD_INFO1_A = <br>Sfeer effecten:
MOTD_INFO1_B = <br>Helderheid van de bliksem: %s
MOTD_INFO1_C = <br>Lichten: %L
MOTD_INFO1_D = <br>Bliksem om de: %d seconden
MOTD_INFO1_E = <br>Deuren: %L
MOTD_INFO1_F = <br>Deathmatch: %L
MOTD_INFO1_G = <br>Bescherming vanaf wanneer je begint duurt: %d seconden
MOTD_INFO1_H = <br>Willekeurige plaats waar je begint: %L
MOTD_INFO1_I = <br>Extra Spullen: %L
MOTD_INFO1_J = <br>Zombie Klassen: %L
MOTD_INFO1_K = <br>Speciale Nachtkijker: %L
MOTD_INFO1_L = <br>Speciale Zaklantaarn: %L
MOTD_INFO2 = <meta charset=UTF-8><body bgcolor=\"#000000\"><font color=\"#FF0505\"><b>Mensen:</b> hun missie is om de zombies te elimineren. Ze hebben een groot arsenaal van wapens om uit te kiezen, en kunnen hun zaklantaarn gebruiken bij donkere mappen. Je moet samenwerken wil je overleven.<br><br><br><u>Configuraties in deze server:</u><br>
MOTD_INFO2_A = <br>Levens: %d
MOTD_INFO2_B = <br>Extra gezondheid van de laatste mens: %d
MOTD_INFO2_C = <br>Snelheid: %d
MOTD_INFO2_D = <br>Zwaartekracht: %d
MOTD_INFO2_E = <br>Munitie: %L
MOTD_INFO2_F = <br>Aantal schade aanbrengen om een Munitie Pakket te krijgen: %d
MOTD_INFO2_G = <br>Brand Granaten: %L
MOTD_INFO2_H = <br>IJs Granaten: %L
MOTD_INFO2_I = <br>Signaal Granaten: %L
MOTD_INFO2_J = <br>Terugslag: %L
MOTD_INFO3 = <meta charset=UTF-8><body bgcolor=\"#000000\"><font color=\"#FF0505\"><b>Zombies:</b> hun missie is om alle mensen te infecteren, of in sommige gevallen te doden. Ze kunnen zien in het donker door middel van nachtkijkers, maar hebben enkel hun klauwen om mee aan te aanvallen. Er zijn standaard zes verschillende zombie klasses om uit te kiezen.<br><br><br><u>Configuraties in deze server:</u><br>
MOTD_INFO3_A = <br>Zombie Gezondheid: %d
MOTD_INFO3_B = <br>Gezondheid van de eerste zombie: %d
MOTD_INFO3_C = <br>Bescherming: %d%% schade gedaan
MOTD_INFO3_D = <br>Snelheid: %d
MOTD_INFO3_E = <br>Zwaartekracht: %d
MOTD_INFO3_F = <br>Gezondheid na infectie: %d
MOTD_INFO3_G = <br>Pijn schok vrij: %L
MOTD_INFO3_H = <br>Bloeden als ze gewond zijn: %L
MOTD_INFO3_I = <br>Iedere infectie levert %d Munitie Pakketten op
MOTD_INFO4 = <meta charset=UTF-8><body bgcolor=\"#000000\"><font color=\"#FF0505\"><b>Extra Modi:</b> er zijn vier verschillende extra modi die willekeurig kunnen beginnen aan het begin van iedere ronde.<br><br><br><u>Configuraties van deze server:</u><br>
MOTD_INFO4_A = <br>Nemesis: %L
MOTD_INFO4_B = <br>Kans om Nemesis te worden: 1 op %d
MOTD_INFO4_C = <br>Gezondheid van de Nemesis: %s
MOTD_INFO4_D = <br>Snelheid van de Nemesis: %d
MOTD_INFO4_E = <br>Zwaartekracht van de Nemesis: %d
MOTD_INFO4_F = <br>Gigantische sprong van de Nemesis: %L
MOTD_INFO4_G = <br>Pijn schok vrij - Nemesis: %L
MOTD_INFO4_H = <br><br>Overlevende: %L
MOTD_INFO4_I = <br>Kans om een Overlevende te zijn: 1 op %d
MOTD_INFO4_J = <br>Gezondheid van de Overlevende: %s
MOTD_INFO4_K = <br>Snelheid van de Overlevende: %d
MOTD_INFO4_L = <br>Zwaartekracht van de Overlevende: %d
MOTD_INFO4_M = <br>Gigantische sprong van de Overlevende: %L
MOTD_INFO4_N = <br>Pijn schok vrij - Overlevende: %L
MOTD_INFO4_O = <br><br>Zwerm Modus: %L
MOTD_INFO4_P = <br>Kans op Zwerm Modus: 1 op %d
MOTD_INFO4_Q = <br><br>Meerdere Infecties: %L
MOTD_INFO4_R = <br>Kans op Meerdere Infecties: 1 op %d
MOTD_INFO4_S = <br>Verhouding van de Infectie: %d%%
MOTD_INFO4_T = <br><br>Plaag Modus: %L
MOTD_INFO4_U = <br>Kans op Plaag Modus: 1 op %d
MOTD_INFO4_V = <br>Verhouding van de Infectie: %d%%

MOTD_ENABLED = Ingeschakeld
MOTD_DISABLED = Uitgeschakeld
MOTD_FOG = Mist
MOTD_RAIN = Regen
MOTD_SNOW = Sneeuw
MOTD_ROTATING = Draaiende deuren verwijderd
MOTD_DOORS = Alle deuren verwijderd
MOTD_DM_HUMAN = Terug tot leven komen als een mens
MOTD_DM_ZOMBIE = Terug tot leven komen als een zombie
MOTD_LIMITED = Beperkt
MOTD_AMMO_BP = Onbeperkt herladen
MOTD_AMMO_CLIP = Onbeperkt schieten
MOTD_LASTZOMBIE = Alleen voor de laatste zombie

ZOMBIE_ATTRIB1 = Gezondheid
ZOMBIE_ATTRIB2 = Snelheid
ZOMBIE_ATTRIB3 = Zwaartekracht
ZOMBIE_ATTRIB4 = Terugslag

CLASS_CLASS = Klasse:
CLASS_HUMAN = Mens
CLASS_ZOMBIE = Zombie
CLASS_SURVIVOR = Overlevende
CLASS_NEMESIS = Nemesis

LAST_ZOMBIE_LEFT = De laatste zombie heeft de server verlaten, %s is de nieuwe zombie.
LAST_HUMAN_LEFT = De laatste mens heeft de server verlaten, %s is de nieuwe mens.
NOT_ENOUGH_AMMO = Je hebt niet genoeg Munitie Pakketten.
AMMO_BOUGHT = Je kocht extra munitie voor je wapens.
ZOMBIE_SELECT = Je zombie klasse na de volgende infectie zal zijn:
BUY_ENABLED = De volgende ronde heb je de optie om opnieuw wapens te kopen.
AMMO_PACKS1 = Munitie Pakketten:
AMMO_PACKS2 = munitie pakketten
SPECTATING = Je volgt:

[gr]
NOTICE_INFO1 = Pata M gia na deis to menu tou paxnidiou
NOTICE_INFO2 = Pata , i . gia na pareis sfaires
NOTICE_VIRUS_FREE = O Ios epese ston...
NOTICE_FIRST = O % einai to prwto zombie !!
NOTICE_INFECT = Ta miala tou % fagothikan...
NOTICE_INFECT2 = Ta miala tou % fagothikan apo %...
NOTICE_ANTIDOTE = O % xrisimopoihse antidoto...
NOTICE_NEMESIS = O %s egine Nemesis !!!
NOTICE_SURVIVOR = Polapli Molinsi !!!
NOTICE_PLAGUE = Plague Mode !!!

WIN_HUMAN = Oi anthrwpoi nikisan tin panoukla!
WIN_ZOMBIE = Ta Zombie kiriarxisan ton kosmo!
WIN_NO_ONE = Kanenas den nikise...

CMD_INFECT = metatrapike se Zombie
CMD_DISINFECT = metatrapike se Anthrwpo
CMD_NEMESIS = metatrapike se Nemesis
CMD_SURVIVAL = metatrapike se Epizonta
CMD_SWARM = Arxise to Swarm Mode
CMD_MULTI = Arxise i polapli Molinsi 
CMD_PLAGUE = Arxise to Plague Mode
CMD_RESPAWN = anagenithike
CMD_NOT = Mi diathesimi entoli.
CMD_ZOMBIE_ONLY = Auto einai mono diathesimo gia ta Zombie.
CMD_HUMAN_ONLY = TAuto einai mono diathesimo gia tous Anthwpous.
CMD_NOT_STUCK = Den exeis kolisei.
CMD_NOT_ACCESS = Den exeis prosbasei edw.
CMD_NOT_CANTUSE = Den mporeis na to xrisimopoihseis twra.
CMD_NOT_EXTRAS = Ta extra pragmata einai ektos leitourgeias.
CMD_NOT_ZCLASSES = Oi Katigories twn Zombie einai ektos leitourgeias.

MENU_BUY = Agorase Opla
MENU_EXTRABUY = Agorase Extra Pragmata
MENU_ZCLASS = Diale3e Katigoria Zombie
MENU_UNSTUCK = 3ekola
MENU_ADMIN = Admin Menu
MENU_INFO = Boitheia
MENU_SPECTATOR = Mpes ws Theatis

MENU_BUY1_TITLE = Arxiko Oplo
MENU_BUY2_TITLE = Deutero Oplo
MENU_ZCLASS_TITLE = Katigoria Zombie
MENU_EXTRA_TITLE = Extra pragmata
MENU_ADMIN_TITLE = Admin Menu
MENU_INFO_TITLE = Plirofories Plugin

MENU_EXTRA1 = Nixterini Orasi (Gia 1 giro)
MENU_EXTRA2 = Antidoto Panouklas
MENU_EXTRA3 = Trela ton Zombie
MENU_EXTRA4 = Bomba Molinsis
MENU_ADMIN1 = Kane ton Zombie/Anthrwpo
MENU_ADMIN2 = Kane ton Nemesis
MENU_ADMIN3 = Kane ton Epizonta
MENU_ADMIN4 = Anagenise Kapion
MENU_ADMIN5 = 3ekina Swarm Mode
MENU_ADMIN6 = 3ekina Pollapli Molinsi
MENU_ADMIN7 = 3ekina Plague Mode
MENU_INFO1 = Genika
MENU_INFO2 = Anthrwpoi
MENU_INFO3 = Zombie
MENU_INFO4 = Tropoi Gameplay

MENU_AUTOSELECT = Thimisou tin Epilogi
MENU_BACK = Pisw
MENU_NEXT = Mprosta
MENU_EXIT = E3odos

MOTD_INFO11 = <meta charset=UTF-8><body bgcolor=\"#000000\"><font color=\"#FF0505\"><b>%s %s apo %s :</b> einai ena Plugin tou  Counter-Strike anaptigmeno apo to AMX X MOD, ston opoio oi anthrwpoi kai zombies erxontai antimetwpoi. Einai vasismeno ston klasiko mod zombie infection: se kathe kyklo enas tyxaios paixtis epilegetai gia na einai to prwto zombie pou prepei na tous molinei olous tous alous.  
MOTD_INFO12 = Alla yparxoun nea xaraktiristika. Gia paradeigma, mporeite na agorasete prostheta pragmata (opws alla opla) me tin antallagi twn paketwn AMMO. Mporeite na parete ta paketa AMMO me ti dolofonia twn zombies i molynontas tous anthrwpous.<br><br><br><u>Trexouses rithmiseis tou Server</u><br>
MOTD_INFO1_A = <br>Apotelesmata perivalontws:
MOTD_INFO1_B = <br>Epipedo Astrapis: %s
MOTD_INFO1_C = <br>Prokaloumena Fwta: %L
MOTD_INFO1_D = <br>Astrapes kathe: %d deuterolepta
MOTD_INFO1_E = <br>Portes: %L
MOTD_INFO1_F = <br>Deathmatch: %L
MOTD_INFO1_G = <br>Xronos prostasias emfaniseis: %d deuterolepta
MOTD_INFO1_H = <br>Tixaia Emfanisi: %L
MOTD_INFO1_I = <br>Extra Pragmata: %L
MOTD_INFO1_J = <br>Katigories Zombie: %L
MOTD_INFO1_K = <br>Eidiki Nixterini Orasi: %L
MOTD_INFO1_L = <br>Eidikos Fakos: %L
MOTD_INFO2 = <meta charset=UTF-8><body bgcolor=\"#000000\"><font color=\"#FF0505\"><b>Anthrwpoi:</b> O stoxos tous einai na apovaloun opoiadipote apeili twn zombie. Exoun ena megalo oplostasio gia na epileksoun oti tous xreiazete, kai tous fakoys gia tis skoteines perioxes. Prepei na synergastoyn an theloun na epizisoun!<br><br><br><u>Trexouses Rithmiseis tou Server:</u><br>
MOTD_INFO2_A = <br>Ygeia: %d
MOTD_INFO2_B = <br>Antamoivi ygeias gia ton teleftaio anthrwpo: %d
MOTD_INFO2_C = <br>Taxitita: %d
MOTD_INFO2_D = <br>Baritita: %d
MOTD_INFO2_E = <br>Ammo: %L
MOTD_INFO2_F = <br>Zimia gia na pareis ena Paketo Ammo: %d
MOTD_INFO2_G = <br>Xeirovomvides pyrkagias: %L
MOTD_INFO2_H = <br>Xeirovomvides pagetoy: %L
MOTD_INFO2_I = <br>Xeirovomvides flogwn: %L
MOTD_INFO2_J = <br>Knockback: %L
MOTD_INFO3 = <meta charset=UTF-8><body bgcolor=\"#000000\"><font color=\"#FF0505\"><b>Zombie:</b> o stoxos tous einai na molynoun kathe zwntano on stin pista. Einai se thesi na doun sto skotadi, alla mporoyn mono na epitethoyn mono apo konta. Yparxoun polles katigories zombie gia na epilextoun, kathe mia me ta prwterimata kai ta elatvmata tou, alla ola eina ikana gia na trwne tous egkefalous. <br><br><br><u>Trexouses rithmiseis tou Server:</u><br>
MOTD_INFO3_A = <br>Ygeia tou Zombie: %d
MOTD_INFO3_B = <br>Ygeia tou prwtou Zombie: %d
MOTD_INFO3_C = <br>Tethwrakismeni: %d%% zimia pou lambanete
MOTD_INFO3_D = <br>Taxitita: %d
MOTD_INFO3_E = <br>Baritita: %d
MOTD_INFO3_F = <br>HP gia tin molinsi: %d
MOTD_INFO3_G = <br>Klonismos tou ponou: %L
MOTD_INFO3_H = <br>Aimoragia: %L
MOTD_INFO3_I = <br>Ammo Paketa gia tin molinsi: %d
MOTD_INFO4 = <meta charset=UTF-8><body bgcolor=\"#000000\"><font color=\"#FF0505\"><b>Mini-Paixnidia:</b> Yparxoun 5 prosthetoi typoi tou paixnidiou pou mporoyn tyxaia na pragmatopoiithoyn kata ti diarkeia tou paixnidioy.<br><br><br><u>Trexouses rithmiseis tou Server:</u><br>
MOTD_INFO4_A = <br>Nemesis: %L
MOTD_INFO4_B = <br>Pithanotita gia Nemesis: 1 se %d
MOTD_INFO4_C = <br>Ygeia tou Nemesis: %s
MOTD_INFO4_D = <br>Taxitita tou Nemesis: %d
MOTD_INFO4_E = <br>Baritita tou Nemesis: %d
MOTD_INFO4_F = <br>Pidima tou Nemesis: %L
MOTD_INFO4_G = <br>Klonismos tou ponou tou  tou Nemesis: %L
MOTD_INFO4_H = <br><br>Epizontas: %L
MOTD_INFO4_I = <br>Pithanotita Enos Epizonta: 1 se %d
MOTD_INFO4_J = <br>Ygeia Epizonta: %s
MOTD_INFO4_K = <br>Taxitita Epizonta: %d
MOTD_INFO4_L = <br>Baritita Epizonta: %d
MOTD_INFO4_M = <br>Pidima Epizonta: %L
MOTD_INFO4_N = <br>Klonismos tou ponou tou Epizonta: %L
MOTD_INFO4_O = <br><br>Swarm Mode: %L
MOTD_INFO4_P = <br>Pithanotita Swarm Mode: 1 se %d
MOTD_INFO4_Q = <br><br>Pollapli Molynsi: %L
MOTD_INFO4_R = <br>Pithanotita Molynsis: 1 se %d
MOTD_INFO4_S = <br>Analogia Molynsis: %d%%
MOTD_INFO4_T = <br><br>Panoukla: %L
MOTD_INFO4_U = <br>Pithanotita Panoyklas: 1 se %d
MOTD_INFO4_V = <br>Analogia molynsis: %d%%

MOTD_ENABLED = Energopihthike
MOTD_DISABLED = Apenergopihthike
MOTD_FOG = Omixli
MOTD_RAIN = Broxi
MOTD_SNOW = Xioni
MOTD_ROTATING = Oi peristrefomenes portes aferethikan
MOTD_DOORS = Oles oi portes afairethikan
MOTD_DM_HUMAN = Anagenithike ws anthrwpos
MOTD_DM_ZOMBIE = Anagenithike ws zombie
MOTD_LIMITED = Periorismeno
MOTD_AMMO_BP = Apeiroi gemistires
MOTD_AMMO_CLIP = Apeires sfaires
MOTD_LASTZOMBIE = Mono sto teleutaio Zombie
ZOMBIE_ATTRIB1 = Ygeia
ZOMBIE_ATTRIB2 = Taxitita
ZOMBIE_ATTRIB3 = Baritita
ZOMBIE_ATTRIB4 = Knockback

CLASS_CLASS = Katigoria:
CLASS_HUMAN = Anthrwpos
CLASS_ZOMBIE = Zombie
CLASS_SURVIVOR = Epizontas
CLASS_NEMESIS = Nemesis

LAST_ZOMBIE_LEFT = To teleutaio Zombie exei fugei, O % einai to neo zombie.
LAST_HUMAN_LEFT = O teleutaios Anthrwpos exei fugei,O % einai o neos anthwpos.
NOT_ENOUGH_AMMO = Den exeis arketa AMMO paketa.
AMMO_BOUGHT = Agorases extra sfaires gia to oplo sou.
ZOMBIE_SELECT = I katigoria tou Zombie sas tha einai meta tin epomeni molinsi
BUY_ENABLED = To menu gia agora oplwn Energopihthike.
AMMO_PACKS1 = Paketa Ammo:
AMMO_PACKS2 = Paketa ammo
SPECTATING = Spectating:

[ru]
NOTICE_INFO1 = Нажмите М для вызова меню
NOTICE_INFO2 = Нажмите , или . для покупки патронов
NOTICE_VIRUS_FREE = Т-вирус витает в воздухе...
NOTICE_FIRST = %s первый зомби !!!
NOTICE_INFECT = Мозги %s были съедены...
NOTICE_INFECT2 = Мозги %s были съедены %sом(ой)...
NOTICE_ANTIDOTE = %s использовал противоядие...
NOTICE_NEMESIS = %s Дьявол !!!
NOTICE_SURVIVOR = %s Выживший !!!
NOTICE_SWARM = Куча на кучу !!!
NOTICE_MULTI = Массовое Заражение !!!
NOTICE_PLAGUE = Чума расползается !!!

WIN_HUMAN = Люди победили заразу !
WIN_ZOMBIE = Зомби захватили весь мир !
WIN_NO_ONE = На этот раз ничья...

CMD_INFECT = стал Зомби
CMD_DISINFECT = превратился обратно в Человека
CMD_NEMESIS = Дьявол !!!
CMD_SURVIVAL = Выживший !!!
CMD_SWARM = Куча на кучу!
CMD_MULTI = Массовое Заражение!
CMD_PLAGUE = Чума!
CMD_RESPAWN = возродился
CMD_NOT = Недопустимая команда.
CMD_ZOMBIE_ONLY = Доступно только для Зомби.
CMD_HUMAN_ONLY = Доступно только для Людей.
CMD_NOT_STUCK = Вы не застряли.
CMD_NOT_ACCESS = У вас нет доступа.
CMD_NOT_CANTUSE = Это нельзя сейчас использовать.
CMD_NOT_EXTRAS = Специальные вещи отключены.
CMD_NOT_ZCLASSES = Классы Зомби отключены.

MENU_BUY = Выбрать оружие
MENU_EXTRABUY = Купить Спец-вещи
MENU_ZCLASS = Класс Зомби...
MENU_UNSTUCK = Застрял!
MENU_ADMIN = Админ-меню
MENU_INFO = Помощь
MENU_SPECTATOR = В зрители

MENU_BUY1_TITLE = Главное оружие
MENU_BUY2_TITLE = Доп. оружие
MENU_ZCLASS_TITLE = Класс Зомби:
MENU_EXTRA_TITLE = Спец-вещи
MENU_ADMIN_TITLE = Админ-меню
MENU_INFO_TITLE = Инфо о плагине

MENU_EXTRA1 = Ночное видение
MENU_EXTRA2 = Антидот
MENU_EXTRA3 = Бешенство зомби
MENU_EXTRA4 = Граната-вирус
MENU_ADMIN1 = Сделать Зомби/Человеком
MENU_ADMIN2 = Дьяволом
MENU_ADMIN3 = Выжившим
MENU_ADMIN4 = Возродить
MENU_ADMIN5 = Куча на кучу
MENU_ADMIN6 = Массовое Зар.
MENU_ADMIN7 = Чума
MENU_INFO1 = В общем
MENU_INFO2 = Люди
MENU_INFO3 = Зомби
MENU_INFO4 = Варианты игры

MENU_AUTOSELECT = Запомнить выбор
MENU_BACK = Назад
MENU_NEXT = Вперед
MENU_EXIT = Выход

MOTD_INFO11 = <meta charset=UTF-8><meta charset=UTF-8><body bgcolor=000000><font color=FF0505><b>%s %s by %s -</b> мод для Counter-Strike. Классический сценарий: случайный игрок становится зомби и должен заразить всех людей.
MOTD_INFO12 = Но есть немного новшеств. Специальные вещи(за кредиты), классы зомби. Кредиты можно получить убивая зомби или заражая людей.<br><br><u>Настройки:</u><br>
MOTD_INFO1_A = Эффекты:
MOTD_INFO1_B = <br>Освещение: %s
MOTD_INFO1_C = <br>Выключатели: %L
MOTD_INFO1_D = <br>Молния: %d сек
MOTD_INFO1_E = <br>Двери: %L
MOTD_INFO1_F = <br>Десматч: %L
MOTD_INFO1_G = <br>Нач. защита: %d сек
MOTD_INFO1_H = <br>Случайное появление: %L
MOTD_INFO1_I = <br>Спец-вещи: %L
MOTD_INFO1_J = <br>Классы Зомби: %L
MOTD_INFO1_K = <br>NightVision: %L
MOTD_INFO1_L = <br>Фонарик: %L
MOTD_INFO2 = <meta charset=UTF-8><body bgcolor=000000><font color=FF0505><b>Люди:</b> их главная задача - это убить всех зомби. В их распоряжении большой выбор оружия и специальных вещей. Коммандная игра необходима для выживания.<br><br><br><u>Текущие настройки сервера:</u><br>
MOTD_INFO2_A = <br>Здоровье: %d
MOTD_INFO2_B = <br>Добавляемое здоровье последнему: %d
MOTD_INFO2_C = <br>Скорость: %d
MOTD_INFO2_D = <br>Гравитация: %d
MOTD_INFO2_E = <br>Боеприпасы: %L
MOTD_INFO2_F = <br>Наносимый урон для получения кредита: %d
MOTD_INFO2_G = <br>Огненный гранаты: %L
MOTD_INFO2_H = <br>Замораживающие гранаты: %L
MOTD_INFO2_I = <br>Осветительные гранаты: %L
MOTD_INFO2_J = <br>Отскок при попадании: %L
MOTD_INFO3 = <meta charset=UTF-8><body bgcolor=000000><font color=FF0505><b>Зомби:</b> их задача - заразить всех людей и убить поледнего. Они хорошо видят в темноте, но могут атаковать только своими когтями. Существует много классов зомби, каждый со своими характеристиками.<br><br><br><u>Настройк и:</u><br>
MOTD_INFO3_A = <br>Здоровье: %d
MOTD_INFO3_B = <br>Здоровье первого: %d
MOTD_INFO3_C = <br>Повреждения: %d%%
MOTD_INFO3_D = <br>Скорость: %d
MOTD_INFO3_E = <br>Гравитация: %d
MOTD_INFO3_F = <br>Здоровье, получаемое за заражение: %d
MOTD_INFO3_G = <br>Замедление при попадании: %L
MOTD_INFO3_H = <br>Кровотечение: %L
MOTD_INFO3_I = <br>Кредиты за заражение: %d
MOTD_INFO4 = <meta charset=UTF-8><body bgcolor=000000><font color=FF0505><b>Мини-игры:</b> есть 5 типов, которые создаются случайно на протяжении игры.<br><br><u>Настройки:</u><br><br>
MOTD_INFO4_A = <u>Дьявол:</u> %L
MOTD_INFO4_B = <br>Шанс: 1 из %d
MOTD_INFO4_C = <br>Здоровье: %s
MOTD_INFO4_D = <br>Скорость: %d
MOTD_INFO4_E = <br>Гравитация: %d
MOTD_INFO4_F = <br>Прыжок: %L
MOTD_INFO4_G = <br>Замедление при попадании: %L
MOTD_INFO4_H = <br><u>Выживший:</u> %L
MOTD_INFO4_I = <br>Шанс: 1 из %d
MOTD_INFO4_J = <br>Здоровье: %s
MOTD_INFO4_K = <br>Скорость: %d
MOTD_INFO4_L = <br>Гравитация: %d
MOTD_INFO4_M = <br>Прыжок: %L
MOTD_INFO4_N = <br>Замедление при попадании: %L
MOTD_INFO4_O = <br><u>Куча на кучу:</u> %L
MOTD_INFO4_P = <br>Шанс: 1 из %d
MOTD_INFO4_Q = <br><u>Массовое Заражение:</u> %L
MOTD_INFO4_R = <br>Шанс: 1 из %d
MOTD_INFO4_S = <br>Зараженные: %d%%
MOTD_INFO4_T = <br><u>Чума:</u> %L
MOTD_INFO4_U = <br>Шанс: 1 из %d
MOTD_INFO4_V = <br>Соотношение: %d%%

MOTD_ENABLED = Вкл
MOTD_DISABLED = Выкл
MOTD_FOG = Туман
MOTD_RAIN = Дождь
MOTD_SNOW = Снег
MOTD_ROTATING = Вращающиесы двери убраны
MOTD_DOORS = Все двери убраны
MOTD_DM_HUMAN = Как Человек
MOTD_DM_ZOMBIE = Как Зомби
MOTD_LIMITED = Ограниченно
MOTD_AMMO_BP = Неогр. боеприпасы
MOTD_AMMO_CLIP = Неогр. патроны
MOTD_LASTZOMBIE = Только последний зомби

ZOMBIE_ATTRIB1 = Здоровье
ZOMBIE_ATTRIB2 = Скорость
ZOMBIE_ATTRIB3 = Гравитация
ZOMBIE_ATTRIB4 = Отброс

CLASS_CLASS = Тип:
CLASS_HUMAN = Человек
CLASS_ZOMBIE = Зомби
CLASS_SURVIVOR = Выживший
CLASS_NEMESIS = Дьявол

LAST_ZOMBIE_LEFT = Единственный Зомби вышел из игры, теперь %s Зомби.
LAST_HUMAN_LEFT = Единственный Человек вышел из игры, теперь %s Человек.
NOT_ENOUGH_AMMO = У вас не хватает кредитов.
AMMO_BOUGHT = Вы купили патроны.
ZOMBIE_SELECT = После заражения ваш класс Зомби будет
BUY_ENABLED = Меню покупки вновь включено.
AMMO_PACKS1 = Кредиты:
AMMO_PACKS2 = кр.
SPECTATING = Наблюдение:

[mn]
NOTICE_INFO1 = М дарж тоглоомны менюг vзнэ vv
NOTICE_INFO2 = , эсвэл . дарж сум авна уу
NOTICE_VIRUS_FREE = Т-Вирус маш олноор тархлаа...
NOTICE_FIRST = %s бол анхны зомби !!!
NOTICE_INFECT = %s тvvний тархи идэгдлээ...
NOTICE_INFECT2 = %s тvvний тархийг %s... амтархан идлээ
NOTICE_ANTIDOTE = %s ерендег ашиглалаа...
NOTICE_NEMESIS = %s Нэмэсис боллоо !!!
NOTICE_SURVIVOR = %s Сурвайвор боллоо !!!
NOTICE_SWARM = Сvрэг Зомби !!!
NOTICE_MULTI = Давхар халдварлалт !!!
NOTICE_PLAGUE = Тахал !!!

WIN_HUMAN = Хvмvvс тахлыг дийллээ!
WIN_ZOMBIE = Зомбинууд дэлхийг эзэллээ!
WIN_NO_ONE = Хэн ч ялсангvй...

CMD_INFECT = зомби боллоо
CMD_DISINFECT = хvн боллоо
CMD_NEMESIS = Нэмэсис боллоо
CMD_SURVIVAL = Сурвайвор боллоо
CMD_SWARM = Сvрэг Зомби-г эхлэх
CMD_MULTI = Давхар халдварлалт-г эхлэх
CMD_PLAGUE = Тахал-г эхлэх
CMD_RESPAWN = амиллаа
CMD_NOT = Комманд боломгvй байна
CMD_ZOMBIE_ONLY = Энийг зомбинууд л хэрэглэнэ.
CMD_HUMAN_ONLY = Энийг хvмvvс л хэрэглэнэ.
CMD_NOT_STUCK = Та гацаагvй байна.
CMD_NOT_ACCESS = Та нэвтрэх эрхгvй байна.
CMD_NOT_CANTUSE = Энийг яг одоо ашиглах боломжгvй байна.
CMD_NOT_EXTRAS = Нэмэлт Итэм боломжгvй байна.
CMD_NOT_ZCLASSES = Зомби сонгох боломжгvй байна.

MENU_BUY = Буу авах
MENU_EXTRABUY = Нэмэлт Итэм авах
MENU_ZCLASS = Зомби сонгох
MENU_UNSTUCK = Гацаагаа гаргах
MENU_ADMIN = Админы меню
MENU_INFO = Тусламж
MENU_SPECTATOR = Ажиглагч болох

MENU_BUY1_TITLE = 1 дvгээр зэвсэг
MENU_BUY2_TITLE = 2 дугээр зэвсэг
MENU_ZCLASS_TITLE = Зомбины терел
MENU_EXTRA_TITLE = Нэмэлт Итэм
MENU_ADMIN_TITLE = Админы меню
MENU_INFO_TITLE = Мэдээлэл

MENU_EXTRA1 = Шенийн дуран (1 vе)
MENU_EXTRA2 = Ерендег
MENU_EXTRA3 = Зомбины солиорол
MENU_EXTRA4 = Халдваржуулах бомб
MENU_ADMIN1 = Хvн/Зомби болгох
MENU_ADMIN2 = Нэмэсис болгох
MENU_ADMIN3 = Сурвайвор болгох
MENU_ADMIN4 = Хэн 1нийг амилуулах
MENU_ADMIN5 = Сvрэг Зомби-г эхлvvлэх
MENU_ADMIN6 = Давхар халдварлалт-г эхлvvлэх
MENU_ADMIN7 = Тахал-г эхлvvлэх
MENU_INFO1 = Еренхий
MENU_INFO2 = Хvмvvс
MENU_INFO3 = Зомби
MENU_INFO4 = Тоглоомны Хувилбарууд

MENU_AUTOSELECT = Сонголтыг хадгалах
MENU_BACK = Ухрах
MENU_NEXT = Дараагийн
MENU_EXIT = Гарах

MOTD_INFO11 = <meta charset=UTF-8><body bgcolor=\"#000000\"><font color=\"#FF0505\"><b>%s %s by %s :</b> is a Counter-Strike plugin developed under AMX Mod X, in where humans and zombies are confronted. It is based on the classic zombie infection mod: on every round a random player is picked to be the first zombie who has to infect everyone else.
MOTD_INFO12 = But there are new features and enhancements. For instance, you are able to buy extra items (such as weapons) in exchange of ammo packs. You can get ammo packs by killing zombies/infecting humans.<br><br><br><u>Current server settings:</u><br>
MOTD_INFO1_A = <br>Ambience Effects:
MOTD_INFO1_B = <br>Lightning Level: %s
MOTD_INFO1_C = <br>Triggered Lights: %L
MOTD_INFO1_D = <br>Thunderclaps Every: %d seconds
MOTD_INFO1_E = <br>Doors: %L
MOTD_INFO1_F = <br>Deathmatch: %L
MOTD_INFO1_G = <br>Spawn Protection Time: %d seconds
MOTD_INFO1_H = <br>Random Spawning: %L
MOTD_INFO1_I = <br>Extra Items: %L
MOTD_INFO1_J = <br>Zombie Classes: %L
MOTD_INFO1_K = <br>Custom Nightvision: %L
MOTD_INFO1_L = <br>Custom Flashlight: %L
MOTD_INFO2 = <meta charset=UTF-8><body bgcolor=\"#000000\"><font color=\"#FF0505\"><b>Humans:</b> their objective is to eliminate any zombie threat. They have a big arsenal of weapons to choose from, and use flashlights on dark maps. Team work is a must to survive.<br><br><br><u>Current server settings:</u><br>
MOTD_INFO2_A = <br>Health: %d
MOTD_INFO2_B = <br>Health Reward for Last Human: %d
MOTD_INFO2_C = <br>Speed: %d
MOTD_INFO2_D = <br>Gravity: %d
MOTD_INFO2_E = <br>Ammo: %L
MOTD_INFO2_F = <br>Damage to Get an Ammo Pack: %d
MOTD_INFO2_G = <br>Fire Grenades: %L
MOTD_INFO2_H = <br>Frost Grenades: %L
MOTD_INFO2_I = <br>Flare Grenades: %L
MOTD_INFO2_J = <br>Knockback: %L
MOTD_INFO3 = <meta charset=UTF-8><body bgcolor=\"#000000\"><font color=\"#FF0505\"><b>Zombies:</b> their objective is to infect every alive human. They are able to see in the dark, but can only attack melee. There are 6 different zombie classes to choose from, each with his own strenghts and weaknesses, but all capable of eating brains.<br><br><br><u>Current server settings:</u><br>
MOTD_INFO3_A = <br>Zombie Health: %d
MOTD_INFO3_B = <br>First Zombie Health: %d
MOTD_INFO3_C = <br>Armor: %d%% damage taken
MOTD_INFO3_D = <br>Speed: %d
MOTD_INFO3_E = <br>Gravity: %d
MOTD_INFO3_F = <br>HP for Infection: %d
MOTD_INFO3_G = <br>Pain Shock Free: %L
MOTD_INFO3_H = <br>Bleeding: %L
MOTD_INFO3_I = <br>Ammo Packs for Infection: %d
MOTD_INFO4 = <meta charset=UTF-8><body bgcolor=\"#000000\"><font color=\"#FF0505\"><b>Mini-Games:</b> there are 4 different special gameplay modes that may randomly occur during the course of the game.<br><br><br><u>Current server settings:</u><br>
MOTD_INFO4_A = <br>Nemesis: %L
MOTD_INFO4_B = <br>Nemesis Chance: 1 in %d
MOTD_INFO4_C = <br>Nemesis Health: %s
MOTD_INFO4_D = <br>Nemesis Speed: %d
MOTD_INFO4_E = <br>Nemesis Gravity: %d
MOTD_INFO4_F = <br>Nemesis Leap: %L
MOTD_INFO4_G = <br>Nemesis Pain Shock Free: %L
MOTD_INFO4_H = <br><br>Survivor: %L
MOTD_INFO4_I = <br>Survivor Chance: 1 in %d
MOTD_INFO4_J = <br>Survivor Health: %s
MOTD_INFO4_K = <br>Survivor Speed: %d
MOTD_INFO4_L = <br>Survivor Gravity: %d
MOTD_INFO4_M = <br>Survivor Leap: %L
MOTD_INFO4_N = <br>Survivor Pain Shock Free: %L
MOTD_INFO4_O = <br><br>Swarm Mode: %L
MOTD_INFO4_P = <br>Swarm Mode Chance: 1 in %d
MOTD_INFO4_Q = <br><br>Multi Infection: %L
MOTD_INFO4_R = <br>Multi Infection Chance: 1 in %d
MOTD_INFO4_S = <br>Infection Ratio: %d%%
MOTD_INFO4_T = <br><br>Plague Mode: %L
MOTD_INFO4_U = <br>Plague Mode Chance: 1 in %d
MOTD_INFO4_V = <br>Infection Ratio: %d%%

MOTD_ENABLED = Enabled
MOTD_DISABLED = Disabled
MOTD_FOG = Манан
MOTD_RAIN = Бороо
MOTD_SNOW = Цас
MOTD_ROTATING = Rotating doors removed
MOTD_DOORS = All doors removed
MOTD_DM_HUMAN = Хvн болж терех
MOTD_DM_ZOMBIE = Зомби болж терех
MOTD_LIMITED = Хязгаартай
MOTD_AMMO_BP = Хязгаартай сумтай
MOTD_AMMO_CLIP = Хязгаартай сумтай
MOTD_LASTZOMBIE = Зевхен сvvлийн зомбид

ZOMBIE_ATTRIB1 = Амь
ZOMBIE_ATTRIB2 = Хурд
ZOMBIE_ATTRIB3 = Таталзах хvч
ZOMBIE_ATTRIB4 = Нокбакь

CLASS_CLASS = Терел:
CLASS_HUMAN = Хvн
CLASS_ZOMBIE = Зомби
CLASS_SURVIVOR = Сурвайвор
CLASS_NEMESIS = Нэмэсис

LAST_ZOMBIE_LEFT = Сvvлийн зомби гарсан тул, %s шинэ зомби боллоо.
LAST_HUMAN_LEFT = Сvvлийн хvн гарсан тул, %s шинэ хvн боллоо.
NOT_ENOUGH_AMMO = Танд хангалттай Аммо алга.
AMMO_BOUGHT = Та буундаа сум худалдаж авлаа.
ZOMBIE_SELECT = Таны дараагий зомби терел бол
BUY_ENABLED = Худалдаж авах меню идэвхжлээ.
AMMO_PACKS1 = Aммо:
AMMO_PACKS2 = аммо
SPECTATING = Ажиглагчид:

[ls]
NOTICE_INFO1 = P|2355 M 70 5H0w 7H3 64M3 M3nU
NOTICE_INFO2 = P|2355 , 0|2 . 70 pU|2CH453 4MM0
NOTICE_VIRUS_FREE = 7H3 7-V1|2U5 H45 833n 537 L0053...
NOTICE_FIRST = %s 15 7H3 f1|257 z0M813 !!
NOTICE_INFECT = %s &|25QU0;5 8|241n5 H45 833n 3473n...
NOTICE_INFECT2 = %s &|25QU0;5 8|241n5 H45 833n 3473n 8y %s...
NOTICE_ANTIDOTE = %s H45 U53|} 4n 4n71|}073...
NOTICE_NEMESIS = %s 15 4 N3M3515 !!!
NOTICE_SURVIVOR = %s 15 4 5U|2v1v0|2 !!!
NOTICE_SWARM = 5w4|2M M0|}3 !!!
NOTICE_MULTI = MUL71pL3 1nf3C710n !!!
NOTICE_PLAGUE = PL46U3 M0|}3 !!!

WIN_HUMAN = HUM4n5 |}3f3473|} 7H3 pL46U3!
WIN_ZOMBIE = Z0M8135 H4v3 74K3n 0v3|2 7H3 w0|2L|}!
WIN_NO_ONE = N0 0n3 w0n...

CMD_INFECT = 7U|2n3|} 1n70 4 Z0M813
CMD_DISINFECT = 7U|2n3|} 84CK 70 HUM4n
CMD_NEMESIS = 7U|2n3|} 1n70 4 N3M3515
CMD_SURVIVAL = 7U|2n3|} 1n70 4 5U|2v1v0|2
CMD_SWARM = 574|27 5w4|2M M0|}3
CMD_MULTI = 574|27 MUL71pL3 1nf3C710n
CMD_PLAGUE = 574|27 PL46U3 M0|}3
CMD_RESPAWN = |235p4wn3|}
CMD_NOT = Un4v41L48L3 C0MM4n|}.
CMD_ZOMBIE_ONLY = 7H15 15 0nLy 4v41L48L3 70 z0M8135.
CMD_HUMAN_ONLY = 7H15 15 0nLy 4v41L48L3 70 HUM4n5.
CMD_NOT_STUCK = Y0U 4|23 n07 57UCK.
CMD_NOT_ACCESS = Y0U H4v3 n0 4CC355.
CMD_NOT_CANTUSE = Y0U C4n7 U53 7H15 |216H7 n0w.
CMD_NOT_EXTRAS = 3x7|24 173M5 4|23 |}1548L3|}.
CMD_NOT_ZCLASSES = Z0M813 CL45535 4|23 |}1548L3|}.

MENU_BUY = 8Uy W34p0n5
MENU_EXTRABUY = 8Uy 3x7|24 173M5
MENU_ZCLASS = CH0053 Z0M813 CL455
MENU_UNSTUCK = Un57UCK
MENU_ADMIN = 4|}M1n M3nU
MENU_INFO = H3Lp
MENU_SPECTATOR = J01n 5p3C7470|25

MENU_BUY1_TITLE = P|21M4|2y W34p0n
MENU_BUY2_TITLE = 53C0n|}4|2y W34p0n
MENU_ZCLASS_TITLE = Z0M813 CL455
MENU_EXTRA_TITLE = 3x7|24 173M5
MENU_ADMIN_TITLE = 4|}M1n M3nU
MENU_INFO_TITLE = PLU61n 1nf0|2M4710n

MENU_EXTRA1 = N16H7V1510n (51n6L3 |20Un|})
MENU_EXTRA2 = 7-V1|2U5 4n71|}073
MENU_EXTRA3 = Z0M813 M4|}n355
MENU_EXTRA4 = 1nf3C710n 80M8
MENU_ADMIN1 = M4K3 Z0M813/HUM4n
MENU_ADMIN2 = M4K3 N3M3515
MENU_ADMIN3 = M4K3 5U|2v1v0|2
MENU_ADMIN4 = |235p4wn 50M30n3
MENU_ADMIN5 = 574|27 5w4|2M M0|}3
MENU_ADMIN6 = 574|27 MUL71pL3 1nf3C710n
MENU_ADMIN7 = 574|27 PL46U3 M0|}3
MENU_INFO1 = 63n3|24L
MENU_INFO2 = HUM4n5
MENU_INFO3 = Z0M8135
MENU_INFO4 = 64M3pL4y M0|}35

MENU_AUTOSELECT = |23M3M83|2 53L3C710n
MENU_BACK = 84CK
MENU_NEXT = N3x7
MENU_EXIT = 3x17

MOTD_INFO11 = <meta charset=UTF-8><body bgcolor=\"#000000\"><font color=\"#FF0505\"><b>%s %s 8y %s </b>: 15 4 C0Un73|2-57|21K3 pLU61n |}3v3L0p3|} Un|}3|2 4MX M0|} X, 1n wH3|23 HUM4n5 4n|} z0M8135 4|23 C0nf|20n73|}. 17 15 8453|} 0n 7H3 CL4551C z0M813 1nf3C710n M0|}: 0n 3v3|2y |20Un|} 4 |24n|}0M pL4y3|2 15 p1CK3|} 70 83 7H3 f1|257 z0M813 wH0 H45 70 1nf3C7 3v3|2y0n3 3L53.
MOTD_INFO12 = 8U7 7H3|23 4|23 n3w f347U|235 4n|} 3nH4nC3M3n75. F0|2 1n574nC3, y0U 4|23 48L3 70 8Uy 3x7|24 173M5 (5UCH 45 w34p0n5) 1n 3xCH4n63 0f 4MM0 p4CK5. Y0U C4n 637 4MM0 p4CK5 8y K1LL1n6 z0M8135/1nf3C71n6 HUM4n5.<br><br><br>CU|2|23n7 53|2v3|2 53771n65:<br>
MOTD_INFO1_A = <br>4M813nC3 3ff3C75:
MOTD_INFO1_B = <br>L16H7n1n6 L3v3L: %s
MOTD_INFO1_C = <br>7|21663|23|} L16H75: %L
MOTD_INFO1_D = <br>7HUn|}3|2CL4p5 3v3|2y: %d 53C0n|}5
MOTD_INFO1_E = <br>|}00|25: %L
MOTD_INFO1_F = <br>|}347HM47CH: %L
MOTD_INFO1_G = <br>5p4wn P|2073C710n 71M3: %d 53C0n|}5
MOTD_INFO1_H = <br>|24n|}0M 5p4wn1n6: %L
MOTD_INFO1_I = <br>3x7|24 173M5: %L
MOTD_INFO1_J = <br>Z0M813 CL45535: %L
MOTD_INFO1_K = <br>CU570M N16H7v1510n: %L
MOTD_INFO1_L = <br>CU570M FL45HL16H7: %L
MOTD_INFO2 = <meta charset=UTF-8><body bgcolor=\"#000000\"><font color=\"#FF0505\"><b>HUM4n5:</b> 7H31|2 08j3C71v3 15 70 3L1M1n473 4ny z0M813 7H|2347. 7H3y H4v3 4 816 4|253n4L 0f w34p0n5 70 CH0053 f|20M, 4n|} U53 fL45HL16H75 0n |}4|2K M4p5. 734M w0|2K 15 4 MU57 70 5U|2v1v3.<br><br><br>CU|2|23n7 53|2v3|2 53771n65:<br>
MOTD_INFO2_B = <br>H34L7H: %d
MOTD_INFO2_B = <br>H34L7H |23w4|2|} f0|2 L457 HUM4n: %d
MOTD_INFO2_C = <br>5p33|}: %d
MOTD_INFO2_D = <br>6|24v17y: %d
MOTD_INFO2_E = <br>4MM0: %L
MOTD_INFO2_F = <br>|}4M463 70 637 4n 4MM0 P4CK: %d
MOTD_INFO2_G = <br>F1|23 6|23n4|}35: %L
MOTD_INFO2_H = <br>F|2057 6|23n4|}35: %L
MOTD_INFO2_I = <br>FL4|23 6|23n4|}35: %L
MOTD_INFO2_J = <br>Kn0CK84CK: %L
MOTD_INFO3 = <meta charset=UTF-8><body bgcolor=\"#000000\"><font color=\"#FF0505\"><b>Z0M8135:</b> 7H31|2 08j3C71v3 15 70 1nf3C7 3v3|2y 4L1v3 HUM4n. 7H3y 4|23 48L3 70 533 1n 7H3 |}4|2K, 8U7 C4n 0nLy 4774CK M3L33. 7H3|23 4|23 6 |}1ff3|23n7 z0M813 CL45535 70 CH0053 f|20M, 34CH w17H H15 0wn 57|23n6H75 4n|} w34Kn35535, 8U7 4LL C4p48L3 0f 3471n6 8|241n5.<br><br><br>CU|2|23n7 53|2v3|2 53771n65:<br>
MOTD_INFO3_A = <br>Z0M813 H34L7H: %d
MOTD_INFO3_B = <br>F1|257 Z0M813 H34L7H: %d
MOTD_INFO3_C = <br>4|2M0|2: %d%% |}4M463 74K3n
MOTD_INFO3_D = <br>5p33|}: %d
MOTD_INFO3_E = <br>6|24v17y: %d
MOTD_INFO3_F = <br>HP f0|2 1nf3C710n: %d
MOTD_INFO3_G = <br>P41n 5H0CK F|233: %L
MOTD_INFO3_H = <br>8L33|}1n6: %L
MOTD_INFO3_I = <br>4MM0 P4CK5 f0|2 1nf3C710n: %d
MOTD_INFO4 = <meta charset=UTF-8><body bgcolor=\"#000000\"><font color=\"#FF0505\"><b>M1n1-64M35:</b> 7H3|23 4|23 4 |}1ff3|23n7 5p3C14L 64M3pL4y M0|}35 7H47 M4y |24n|}0MLy 0CCU|2 |}U|21n6 7H3 C0U|253 0f 7H3 64M3.<br><br><br>CU|2|23n7 53|2v3|2 53771n65:<br>
MOTD_INFO4_A = <br>N3M3515: %L
MOTD_INFO4_B = <br>N3M3515 CH4nC3: 1 1n %d
MOTD_INFO4_C = <br>N3M3515 H34L7H: %s
MOTD_INFO4_D = <br>N3M3515 5p33|}: %d
MOTD_INFO4_E = <br>N3M3515 6|24v17y: %d
MOTD_INFO4_F = <br>N3M3515 L34p: %L
MOTD_INFO4_G = <br>N3M3515 P41n 5H0CK F|233: %L
MOTD_INFO4_H = <br><br>5U|2v1v0|2: %L
MOTD_INFO4_I = <br>5U|2v1v0|2 CH4nC3: 1 1n %d
MOTD_INFO4_J = <br>5U|2v1v0|2 H34L7H: %s
MOTD_INFO4_K = <br>5U|2v1v0|2 5p33|}: %d
MOTD_INFO4_L = <br>5U|2v1v0|2 6|24v17y: %d
MOTD_INFO4_M = <br>5U|2v1v0|2 L34p: %L
MOTD_INFO4_N = <br>5U|2v1v0|2 P41n 5H0CK F|233: %L
MOTD_INFO4_0 = <br><br>5w4|2M M0|}3: %L
MOTD_INFO4_P = <br>5w4|2M M0|}3 CH4nC3: 1 1n %d
MOTD_INFO4_Q = <br><br>MUL71 1nf3C710n: %L
MOTD_INFO4_R = <br>MUL71 1nf3C710n CH4nC3: 1 1n %d
MOTD_INFO4_S = <br>1nf3C710n |24710: %d%%
MOTD_INFO4_T = <br><br>PL46U3 M0|}3: %L
MOTD_INFO4_U = <br>PL46U3 M0|}3 CH4nC3: 1 1n %d
MOTD_INFO4_V = <br>1nf3C710n |24710: %d%%

MOTD_ENABLED = 3n48L3|}
MOTD_DISABLED = |}1548L3|}
MOTD_FOG = F06
MOTD_RAIN = |241n
MOTD_SNOW = 5n0w
MOTD_ROTATING = |207471n6 |}00|25 |23M0v3|}
MOTD_DOORS = 4LL |}00|25 |23M0v3|}
MOTD_DM_HUMAN = |235p4wn 45 HUM4n
MOTD_DM_ZOMBIE = |235p4wn 45 z0M813
MOTD_LIMITED = L1M173|}
MOTD_AMMO_BP = UnL1M173|} |23L04|}5
MOTD_AMMO_CLIP = UnL1M173|} CL1p
MOTD_LASTZOMBIE = 0nLy 0n L457 z0M813

ZOMBIE_ATTRIB1 = H34L7H
ZOMBIE_ATTRIB2 = 5p33|}
ZOMBIE_ATTRIB3 = 6|24v17y
ZOMBIE_ATTRIB4 = Kn0CK84CK

CLASS_CLASS = CL455:
CLASS_HUMAN = HUM4n
CLASS_ZOMBIE = Z0M813
CLASS_SURVIVOR = 5U|2v1v0|2
CLASS_NEMESIS = N3M3515

LAST_ZOMBIE_LEFT = 7H3 L457 z0M813 H45 L3f7, %s 15 7H3 n3w z0M813.
LAST_HUMAN_LEFT = 7H3 L457 HUM4n H45 L3f7, %s 15 7H3 n3w HUM4n.
NOT_ENOUGH_AMMO = Y0U |}0n7 H4v3 3n0U6H 4MM0 p4CK5.
AMMO_BOUGHT = Y0U pU|2CH453|} 3x7|24 4MM0 f0|2 y0U|2 6Un5.
ZOMBIE_SELECT = Y0U|2 z0M813 CL455 4f73|2 7H3 n3x7 1nf3C710n w1LL 83
BUY_ENABLED = Y0U|2 8Uy M3nU H45 833n |23-3n48L3|}.
AMMO_PACKS1 = 4MM0 p4CK5:
AMMO_PACKS2 = 4MM0 p4CK5
SPECTATING = 5p3C7471n6:

[vn]
NOTICE_INFO1 = Ấn M để hiện tùy chọn
NOTICE_INFO2 = Ấn , hoặc . để mua trang bị
NOTICE_VIRUS_FREE = T-Virus đã thoát ra ngoài...
NOTICE_FIRST = %s trở thành zombie đầu tiên !!
NOTICE_INFECT = Não của %s đã bị ăn...
NOTICE_INFECT2 = %s đã bị ăn thịt bởi %s...
NOTICE_ANTIDOTE = %s đã sử dụng thuốc kháng độc...
NOTICE_NEMESIS = %s là Nemesis nó rất nguy hiểm!!!
NOTICE_SURVIVOR = %s là Survivor cô ấy có sức mạnh phi thường!!!
NOTICE_SWARM = Chế độ chiến đấu !!!
NOTICE_MULTI = Bệnh dịch lan tràn !!!
NOTICE_PLAGUE = Chế độ plague !!!

WIN_HUMAN = Loài người đã dập tắt bệnh dịch!
WIN_ZOMBIE = Zombies đã chiếm toàn bộ thế giới!
WIN_NO_ONE = Không Ai Thắng...

CMD_INFECT = đã biến thành Zombie
CMD_DISINFECT = đã trở lại làm người
CMD_NEMESIS = đã biến thành Nemesis
CMD_SURVIVAL = đã trở thành Survivor
CMD_SWARM = bắt đầu chế độ Chiến Đấu
CMD_MULTI = bệnh dịch bắt đầu lan tràn
CMD_PLAGUE = bắt đầu chế độ plague
CMD_RESPAWN = được hồi sinh
CMD_NOT = không thể thực hiện được mệnh lệnh.
CMD_ZOMBIE_ONLY = Cái này chỉ dành cho zombies.
CMD_HUMAN_ONLY = Cái này chỉ dành cho người.
CMD_NOT_STUCK = You are not stuck.
CMD_NOT_ACCESS = Bạn không có quyền truy nhập.
CMD_NOT_CANTUSE = Bạn không thể sử dụng nó bây giờ.
CMD_NOT_EXTRAS = Vũ khí bổ sung đã bị tắt.
CMD_NOT_ZCLASSES = Loại Zombie đã bị tắt.

MENU_BUY = Mua vũ khí
MENU_EXTRABUY = Mua thêm trang bị
MENU_ZCLASS = Chọn loại Zombie
MENU_UNSTUCK = Unstuck
MENU_ADMIN = Tùy chọn của admin
MENU_INFO = Trợ giúp
MENU_SPECTATOR = Tham gia vào nhóm quan sát

MENU_BUY1_TITLE = Vũ khí chính
MENU_BUY2_TITLE = Vũ khí phụ
MENU_ZCLASS_TITLE = Loại Zombie
MENU_EXTRA_TITLE = Thêm trang bị
MENU_ADMIN_TITLE = Tùy chọn của người quản lý
MENU_INFO_TITLE = Thông tin về tác giả bản game này

MENU_EXTRA1 = Kính hồng ngoại(1 round)
MENU_EXTRA2 = Thuốc kháng T-Virus
MENU_EXTRA3 = Zombie hóa điên
MENU_EXTRA4 = Bomb Ä‘á»™c
MENU_ADMIN1 = Tạo Zombie/Người
MENU_ADMIN2 = Tạo Nemesis
MENU_ADMIN3 = Tạo Survivor
MENU_ADMIN4 = Hồi sinh ai đó
MENU_ADMIN5 = Bật chế độ Chiến đấu
MENU_ADMIN6 = Bệnh dịch lan tràn
MENU_ADMIN7 = Bắt đầu chế độ Plague
MENU_INFO1 = Thông tin chung
MENU_INFO2 = Người
MENU_INFO3 = Zombies
MENU_INFO4 = Chế độ chơi

MENU_AUTOSELECT = Lưu tùy chọn trước
MENU_BACK = Quay lại
MENU_NEXT = Tiếp theo
MENU_EXIT = Thoát

MOTD_INFO11 = <meta charset=UTF-8><body bgcolor=\"#000000\"><font color=\"#FF0505\"><b>%s %s by %s :</b> là 1 tiện ích dành cho Counter-Strike, trong đó loài người và zombie đối đầu nhau. Trong mỗi round 1 người chơi ngẫu nhiên sẽ được chọn làm zombie đầu tiên có nhiệm vụ truyền bệnh cho những người khác.
MOTD_INFO12 = Nhiều chức năng và nâng cấp. Bạn có thể mua vũ khí hoặc trang bị bằng việc trao đổi ammo packs. Bạn nhận được ammo packs bằng việc giết zombie.<br><br><br><u>Các thiết lập hiện tại của server:</u><br>
MOTD_INFO1_A = <br>Hiệu ứng âm thanh:
MOTD_INFO1_B = <br>Cấp độ ánh sáng: %s
MOTD_INFO1_C = <br>Triggered Lights: %L
MOTD_INFO1_D = <br>Tần xuất xuất hiện chớp: %d giây
MOTD_INFO1_E = <br>Các cánh cửa: %L
MOTD_INFO1_F = <br>Chế độ sinh tử: %L
MOTD_INFO1_G = <br>Thời gian bảo vệ sau khi hồi sinh: %d giây
MOTD_INFO1_H = <br>Hồi sinh ngẫu nhiên: %L
MOTD_INFO1_I = <br>Các món đồ bổ trợ: %L
MOTD_INFO1_J = <br>Loài Zombie: %L
MOTD_INFO1_K = <br>Custom Nightvision: %L
MOTD_INFO1_L = <br>Custom Flashlight: %L
MOTD_INFO2 = <meta charset=UTF-8><body bgcolor=\"#000000\"><font color=\"#FF0505\"><b>Loài người:</b> nhiệm vụ của họ là giết sạch bọn zombie không cho chúng truyền bệnh. Họ có lượng vũ khí khổng lồ sử dụng đèn để quan sát trong đêm tối. Phối hợp đồng đội là cần thiết để có khả năng sống sót cao.<br><br><br><u>Các thiết lập hiện tại của server:</u><br>
MOTD_INFO2_A = <br>Máu: %d
MOTD_INFO2_B = <br>Lượng máu thưởng cho người sống sót cuối cùng: %d
MOTD_INFO2_C = <br>Tốc độ: %d
MOTD_INFO2_D = <br>Nhảy cao: %d
MOTD_INFO2_E = <br>Giáp: %L
MOTD_INFO2_F = <br>Số máu bắn được để nhận Ammo Pack: %d
MOTD_INFO2_G = <br>Lá»±u lá»­a: %L
MOTD_INFO2_H = <br>Lựu băng: %L
MOTD_INFO2_I = <br>Lựu sáng: %L
MOTD_INFO2_J = <br>Bị bật lại khi dính đạn: %L
MOTD_INFO3 = <meta charset=UTF-8><body bgcolor=\"#000000\"><font color=\"#FF0505\"><b>Zombies:</b> nhiệm vụ của chúng là truyền bệnh cho những người khỏe mạnh (chúng có khả năng nhìn trong bóng đêm). Có nhiều loài zombie với điểm mạnh điểm yếu riêng.<br><br><br><u>Các thiết lập hiện tại của server:</u><br>
MOTD_INFO3_A = <br>Máu của Zombie: %d
MOTD_INFO3_B = <br>Máu của zombie đầu tiên: %d
MOTD_INFO3_C = <br>Giáp: %d%% số máu bị mất khi bị thương
MOTD_INFO3_D = <br>Tốc độ: %d
MOTD_INFO3_E = <br>Nhảy cao: %d
MOTD_INFO3_F = <br>Lượng máu được thưởng khi giết người: %d
MOTD_INFO3_G = <br>Ảnh hưởng khi bị dính đạn: %L
MOTD_INFO3_H = <br>Chảy máu: %L
MOTD_INFO3_I = <br>Ammo Packs cho việc truyền bệnh: %d
MOTD_INFO4 = <meta charset=UTF-8><body bgcolor=\"#000000\"><font color=\"#FF0505\"><b>Các trò chơi phụ:</b> có 5 chế độ chơi đặc biệt có thể được chọn ngẫu nhiên.<br><br><br><u>Các thiết lập hiện tại của server:</u><br>
MOTD_INFO4_A = <br>Nemesis: %L
MOTD_INFO4_B = <br>Nemesis Chance: 1 in %d
MOTD_INFO4_C = <br>Máu của Nemesis: %s
MOTD_INFO4_D = <br>Tốc độ của Nemesis: %d
MOTD_INFO4_E = <br>Nhảy cao của Nemesis: %d
MOTD_INFO4_F = <br>Khả năng nhảy xa của Nemesis: %L
MOTD_INFO4_G = <br>Ảnh hưởng khi bị dính đạn của Nemesis: %L
MOTD_INFO4_H = <br><br>Survivor: %L
MOTD_INFO4_I = <br>Survivor Chance: 1 in %d
MOTD_INFO4_J = <br>Máu của Survivor: %s
MOTD_INFO4_K = <br>Tốc độ của Survivor: %d
MOTD_INFO4_L = <br>Nhảy cao của Survivor: %d
MOTD_INFO4_M = <br>Khả năng nhảy xa của Survivor: %L
MOTD_INFO4_N = <br>Ảnh hưởng khi bị dính đạn của Survivor: %L
MOTD_INFO4_O = <br><br>Chế Độ Chiến Đấu: %L
MOTD_INFO4_P = <br>Tần xuất Chế Độ Chiến Đấu: 1 in %d
MOTD_INFO4_Q = <br><br>Chế Độ Dịch Bệnh Lan Tràn: %L
MOTD_INFO4_R = <br>Tần xuất Chế Độ Dịch Bệnh Lan Tràn: 1 in %d
MOTD_INFO4_S = <br>Tỉ lệ nhiễm bệnh: %d%%
MOTD_INFO4_T = <br><br>Chế độ Plague: %L
MOTD_INFO4_U = <br>Tần xuất Chế độ Plague: 1 in %d
MOTD_INFO4_V = <br>Tỉ lệ nhiễm bệnh: %d%%

MOTD_ENABLED = Thực hiện
MOTD_DISABLED = Không thực hiện
MOTD_FOG = Sương mù
MOTD_RAIN = MÆ°a
MOTD_SNOW = Tuyết
MOTD_ROTATING = Cánh cửa đã bị bỏ
MOTD_DOORS = Tất cả các cửa bị bỏ
MOTD_DM_HUMAN = Hồi sinh ai đó thành người
MOTD_DM_ZOMBIE = Hồi sinh ai đó thành zombie
MOTD_LIMITED = Bị giới hạn
MOTD_AMMO_BP = Không giới hạn nạp đạn
MOTD_AMMO_CLIP = Bắn không hết đạn
MOTD_LASTZOMBIE = Chỉ dành cho zombie cuối

ZOMBIE_ATTRIB1 = Máu
ZOMBIE_ATTRIB2 = Tốc độ
ZOMBIE_ATTRIB3 = Nhảy cao
ZOMBIE_ATTRIB4 = Bật lại khi dính đạn

CLASS_CLASS = Loài:
CLASS_HUMAN = Người
CLASS_ZOMBIE = Zombie
CLASS_SURVIVOR = Survivor
CLASS_NEMESIS = Nemesis

LAST_ZOMBIE_LEFT = Còn lại 1 con zombie cuối cùng, %s là 1 loại zombie mới.
LAST_HUMAN_LEFT = Còn lại 1 người cuối cùng, %s là 1 loại người mới.
NOT_ENOUGH_AMMO = Bạn không đủ ammo packs.
AMMO_BOUGHT = Bạn đã bỏ ra ammo packs cho những khẩu súng đó.
ZOMBIE_SELECT = Loại zombie mà bạn sẽ biến khi bị nhiễm bệnh lần tới là
BUY_ENABLED = Cửa sổ mua của bạn đã được kích hoạt.
AMMO_PACKS1 = Ammo packs:
AMMO_PACKS2 = ammo packs
SPECTATING = Đang theo dõi:

[cn]
NOTICE_INFO1 = 按 M 显示游戏菜单
NOTICE_INFO2 = 按 , 或 . 来购买弹药
NOTICE_VIRUS_FREE = T病毒已经开始在整个区域中扩散,请大家小心周围.
NOTICE_FIRST = %s 是第一个僵尸...
NOTICE_INFECT = %s 已经被感染病毒了...
NOTICE_INFECT2 = %s 已经被 %s 感染病毒了...
NOTICE_ANTIDOTE = %s 使用了T病毒解药...
NOTICE_NEMESIS = %s 是复仇之神!!!
NOTICE_SURVIVOR = %s 是一名幸存者!!!
NOTICE_SWARM = 对战模式!!!
NOTICE_MULTI = 多重感染模式!!!
NOTICE_PLAGUE = 军团模式!!!

WIN_HUMAN = 人类战胜了僵尸!
WIN_ZOMBIE = 僵尸已经统治了世界!
WIN_NO_ONE = 平局...

CMD_INFECT = 变成僵尸
CMD_DISINFECT = 变回人类
CMD_NEMESIS = 变成复仇之神
CMD_SURVIVAL = 成为一名幸存者
CMD_SWARM = 开始对战模式
CMD_MULTI = 开始多重感染模式
CMD_PLAGUE = 开始军团模式
CMD_RESPAWN = 复活
CMD_NOT = 无效的命令
CMD_ZOMBIE_ONLY = 这是只适用于僵尸.
CMD_HUMAN_ONLY = 这是只适用于人类.
CMD_NOT_STUCK = 你没有被卡住!!
CMD_NOT_ACCESS = 你没有权限使用该命令!
CMD_NOT_CANTUSE = 你现在不能使用它.
CMD_NOT_EXTRAS = 道具被禁止使用.
CMD_NOT_ZCLASSES = 僵尸类型被禁止使用.

MENU_BUY = 购买武器
MENU_EXTRABUY = 购买道具
MENU_ZCLASS = 选择僵尸的类型
MENU_UNSTUCK = 解除卡住(当你被卡住时使用)
MENU_ADMIN = 管理员菜单
MENU_INFO = 帮助
MENU_SPECTATOR = 成为观察者

MENU_BUY1_TITLE = 主要武器
MENU_BUY2_TITLE = 次要武器
MENU_ZCLASS_TITLE = 僵尸类型
MENU_EXTRA_TITLE = 道具
MENU_ADMIN_TITLE = 管理员菜单
MENU_INFO_TITLE = 插件信息

MENU_EXTRA1 = 夜视仪(只有一局时间)
MENU_EXTRA2 = T病毒解药(让你重新成为人类)
MENU_EXTRA3 = 无敌僵尸(20秒时间)
MENU_EXTRA4 = T病毒炸弹(可以感染一片的人类)
MENU_ADMIN1 = 成为僵尸/人类
MENU_ADMIN2 = 成为复仇之神
MENU_ADMIN3 = 成为幸存者
MENU_ADMIN4 = 复活某个人
MENU_ADMIN5 = 开启对战模式
MENU_ADMIN6 = 开启群体感染模式
MENU_ADMIN7 = 开启军团模式
MENU_INFO1 = 观众
MENU_INFO2 = 人类
MENU_INFO3 = 僵尸
MENU_INFO4 = 游戏模式

MENU_AUTOSELECT = 记住设置
MENU_BACK = 返回
MENU_NEXT = 继续
MENU_EXIT = 退出

MOTD_INFO11 = <meta charset=UTF-8><body bgcolor=\"#000000\"><font color=\"#FF0505\"><b>%s %s by %s :</b> 是一个基于 AMX Mod X的反恐精英插件, 在这里人类和僵尸才是对立的. 它是基于传统的僵尸模式: 在每一回合,一个随机的队员将变成一个僵尸去感染别人.
MOTD_INFO12 = 但也有新的增强功能. 举例来说,你可以是用血浆来购买特殊的道具(比如说大杀伤力的武器). 你可以通过杀死僵尸或是感染人类获得血浆<br><br><br><u>服务器的设定:</u><br>
MOTD_INFO1_A = <br>环境情况:
MOTD_INFO1_B = <br>闪电强度: %s
MOTD_INFO1_C = <br>手电强度: %L
MOTD_INFO1_D = <br>闪电频率: %d 秒
MOTD_INFO1_E = <br>é—¨: %L
MOTD_INFO1_F = <br>死斗: %L
MOTD_INFO1_G = <br>僵尸产生时间: %d 秒
MOTD_INFO1_H = <br>随机产生僵尸: %L
MOTD_INFO1_I = <br>道具: %L
MOTD_INFO1_J = <br>僵尸类型: %L
MOTD_INFO1_K = <br>自定义夜视: %L
MOTD_INFO1_L = <br>自定义闪光: %L
MOTD_INFO2 = <meta charset=UTF-8><body bgcolor=\"#000000\"><font color=\"#FF0505\"><b>人类:</b> 他们的任务是消灭所有的僵尸. 他们拥有一个庞大的武器库,另外在道具中还可以购买重型武器, 并可以在黑暗的地图中使用照明弹. 团队合作才是生存的条件.<br><br><br><u>服务器的设定:</u><br>
MOTD_INFO2_A = <br>生命: %d
MOTD_INFO2_B = <br>最后一个人类的生命: %d
MOTD_INFO2_C = <br>速度: %d
MOTD_INFO2_D = <br>重量: %d
MOTD_INFO2_E = <br>血浆: %L
MOTD_INFO2_F = <br>杀死僵尸得到的弹药袋: %d
MOTD_INFO2_G = <br>燃烧弹: %L
MOTD_INFO2_H = <br>冰冻弹: %L
MOTD_INFO2_I = <br>照明弹: %L
MOTD_INFO2_J = <br>死亡后是否复活: %L
MOTD_INFO3 = <meta charset=UTF-8><body bgcolor=\"#000000\"><font color=\"#FF0505\"><b>僵尸:</b> 它们的任务是感染所有活着的人类. 它们可以在黑暗中看见事物, 但是只能够近身攻击. 这里有6种僵尸的类型可以挑选, 每一种都有自己的优点和缺点, 但共同点是它们都可以吃人类的大脑.<br><br><br><u>服务器的设定:</u><br>
MOTD_INFO3_A = <br>僵尸的生命: %d
MOTD_INFO3_B = <br>第一个僵尸的生命: %d
MOTD_INFO3_C = <br>护甲: %d%% 伤害值
MOTD_INFO3_D = <br>速度: %d
MOTD_INFO3_E = <br>重量: %d
MOTD_INFO3_F = <br>感染人类奖励的生命: %d
MOTD_INFO3_G = <br>中弹时被击退: %L
MOTD_INFO3_H = <br>流血: %L
MOTD_INFO3_I = <br>感染人类得到的弹药袋: %d
MOTD_INFO4 = <meta charset=UTF-8><body bgcolor=\"#000000\"><font color=\"#FF0505\"><b>特殊游戏模式:</b> 这里有4种不同的特殊游戏模式,在游戏中会随机的产生.<br><br><br><u>服务器的设定:</u><br>
MOTD_INFO4_A = <br>复仇之神: %L
MOTD_INFO4_B = <br>复仇之神的产生: 1 in %d
MOTD_INFO4_C = <br>复仇之神的生命值: %s
MOTD_INFO4_D = <br>复仇之神的速度: %d
MOTD_INFO4_E = <br>复仇之神的重量: %d
MOTD_INFO4_F = <br>复仇之神的跳跃: %L
MOTD_INFO4_G = <br>复仇之神被击退: %L
MOTD_INFO4_H = <br><br>幸存者: %L
MOTD_INFO4_I = <br>幸存者的产生: 1 in %d
MOTD_INFO4_J = <br>幸存者的生命: %s
MOTD_INFO4_K = <br>幸存者的速度: %d
MOTD_INFO4_L = <br>幸存者的重量: %d
MOTD_INFO4_M = <br>幸存者的的跳跃: %L
MOTD_INFO4_N = <br>幸存者的的击退: %L
MOTD_INFO4_O = <br><br>对战模式: %L
MOTD_INFO4_P = <br>对战模式的开启概率: 1 in %d
MOTD_INFO4_Q = <br><br>多重感染模式: %L
MOTD_INFO4_R = <br>多重感染源的开启概率: 1 in %d
MOTD_INFO4_S = <br>感染的比例: %d%%
MOTD_INFO4_T = <br><br>军团模式: %L
MOTD_INFO4_U = <br>军团模式的开启概率: 1 in %d

MOTD_ENABLED = 启用
MOTD_DISABLED = 禁用
MOTD_FOG = 雾
MOTD_RAIN = 雨
MOTD_SNOW = 雪
MOTD_ROTATING = 拆除转动的大门
MOTD_DOORS = 拆除所有的大门
MOTD_DM_HUMAN = 复活成人类
MOTD_DM_ZOMBIE = 复活成僵尸
MOTD_LIMITED = 有限的
MOTD_AMMO_BP = 无限的弹药
MOTD_AMMO_CLIP = 无限的后备弹药
MOTD_LASTZOMBIE = 只在最后一个僵尸

ZOMBIE_ATTRIB1 = 生命
ZOMBIE_ATTRIB2 = 速度
ZOMBIE_ATTRIB3 = 重量
ZOMBIE_ATTRIB4 = 击退

CLASS_CLASS = 类型:
CLASS_HUMAN = 人类
CLASS_ZOMBIE = 僵尸
CLASS_SURVIVOR = 幸存者
CLASS_NEMESIS = 复仇之神

LAST_ZOMBIE_LEFT = 最后的一个僵尸离开了游戏, %s 是新的僵尸.
LAST_HUMAN_LEFT = 最后的一个人类离开了游戏, %s 是新的人类.
NOT_ENOUGH_AMMO = 你没有足够的弹药袋.
AMMO_BOUGHT = 为你的枪购买额外的弹药.
ZOMBIE_SELECT = 下一次你被感染时是:
BUY_ENABLED = 你的购买菜单已经被重新启用.
AMMO_PACKS1 = 弹药袋:
AMMO_PACKS2 = 弹药袋
SPECTATING = 观察中

[tc]
NOTICE_INFO1 = 點選"M"打開遊戲選單
NOTICE_INFO2 = 點選","或"."購買子彈
NOTICE_VIRUS_FREE = T-病毒飄散在空氣中...
NOTICE_FIRST = %s 是第一隻殭屍 !!
NOTICE_INFECT = %s's 的頭被吃掉了...
NOTICE_INFECT2 = %s's 的頭是被 %s 吃掉...
NOTICE_ANTIDOTE = %s 使用解毒劑...
NOTICE_NEMESIS = %s 是復仇者 !!!
NOTICE_SURVIVOR = %s 是倖存者 !!!
NOTICE_SWARM = 對抗殭屍模式 !!!
NOTICE_MULTI = 多人傳染模式 !!!
NOTICE_PLAGUE = 瘟疫模式 !!!

WIN_HUMAN = 人類打敗了殭屍!
WIN_ZOMBIE = 殭屍佔領了全世界!
WIN_NO_ONE = 沒有人獲勝...

CMD_INFECT = 轉換為殭屍
CMD_DISINFECT = 轉換為人類
CMD_NEMESIS = 轉換為復仇者
CMD_SURVIVAL = 轉換為倖存者
CMD_SWARM = 開始 對抗殭屍模式
CMD_MULTI = 開始 多人傳染模式
CMD_PLAGUE = 開始 瘟疫模式
CMD_RESPAWN = 重生
CMD_NOT = 無效的命令.
CMD_ZOMBIE_ONLY = 只對殭屍有效.
CMD_HUMAN_ONLY = 只對人類有效.
CMD_NOT_STUCK = 你不是stuck.
CMD_NOT_ACCESS = 你沒有權限.
CMD_NOT_CANTUSE = 你現在不能使用這個.
CMD_NOT_EXTRAS = 特殊道具已關閉.
CMD_NOT_ZCLASSES = 殭屍類型已關閉..

MENU_BUY = 買武器
MENU_EXTRABUY = 買特殊道具
MENU_ZCLASS = 選擇殭屍類型
MENU_UNSTUCK = Unstuck
MENU_ADMIN = 管理者選單
MENU_INFO = 幫助
MENU_SPECTATOR = 切換為觀察者

MENU_BUY1_TITLE = 主要武器
MENU_BUY2_TITLE = 副武器
MENU_ZCLASS_TITLE = 殭屍類型
MENU_EXTRA_TITLE = 特殊道具
MENU_ADMIN_TITLE = 管理者選單
MENU_INFO_TITLE = 插件訊息

MENU_EXTRA1 = 夜視鏡 (單回合)
MENU_EXTRA2 = T-病毒解毒劑
MENU_EXTRA3 = 殭屍憤怒(短時間無敵)
MENU_EXTRA4 = 毒素彈
MENU_ADMIN1 = 指定一個為殭屍/人類
MENU_ADMIN2 = 指定一個為復仇者
MENU_ADMIN3 = 指定一個為倖存者
MENU_ADMIN4 = 指定某人重生
MENU_ADMIN5 = 開殭屍對抗模式
MENU_ADMIN6 = 開始多人傳染模式
MENU_ADMIN7 = 開始 瘟疫模式
MENU_INFO1 = 一般介紹
MENU_INFO2 = 人類介紹
MENU_INFO3 = 喪屍介紹
MENU_INFO4 = 模式介紹

MENU_AUTOSELECT = 記住設定
MENU_BACK = 回去
MENU_NEXT = 下頁
MENU_EXIT = 離開

MOTD_INFO11 = <meta charset=UTF-8><body bgcolor=\"#000000\"><font color=\"#FF0505\"><b>%s %s by %s 此插件繁體化作者為skymoon蒼月:</b>每回合會有一個玩家被感染為殭屍,第一隻喪屍必須去傳染給其他玩家。
MOTD_INFO12 = 這遊戲的特色"""彈藥包""",人類可以用它來買更好的槍、解毒劑,殭屍可以買毒素彈..等等,需要使用的時候請按鍵盤"M",你也可以隨時點選(,)和(.)買主槍或副槍的子彈,但是會花費一個彈藥包。!!!!!彈藥包的取得方法!!!!!殭屍必須殺人類才有子彈包,而人類只要給予殭屍一定量的傷害就能得到彈藥包,傷害可以累計的。<br><br><br><u>現在伺服器的設置:</u><br>
MOTD_INFO1_A = <br>環境設置:
MOTD_INFO1_B = <br>亮度等級: %s
MOTD_INFO1_C = <br>觸發燈: %L
MOTD_INFO1_D = <br>閃電頻率: %d 秒數
MOTD_INFO1_E = <br>é–€: %L
MOTD_INFO1_F = <br>死鬥模式: %L
MOTD_INFO1_G = <br>重生後無敵時間: %d 秒
MOTD_INFO1_H = <br>隨機重生: %L
MOTD_INFO1_I = <br>特殊道具: %L
MOTD_INFO1_J = <br>殭屍類型: %L
MOTD_INFO1_K = <br>夜視功能: %L
MOTD_INFO1_L = <br>手電筒功能: %L
MOTD_INFO2 = <meta charset=UTF-8><body bgcolor=\"#000000\"><font color=\"#FF0505\"><b>人類:</b> 他們的目標是抵抗殭屍的威脅,團隊合作是非常重要的。<br><br><br><u>現在伺服器的設置:</u><br>
MOTD_INFO2_A = <br>生命值: %d
MOTD_INFO2_B = <br>最後一位人類得到額外的生命值: %d
MOTD_INFO2_C = <br>速度: %d
MOTD_INFO2_D = <br>重力: %d
MOTD_INFO2_E = <br>子彈: %L
MOTD_INFO2_F = <br>達到多少傷害才有彈藥包: %d
MOTD_INFO2_G = <br>火焰彈: %L
MOTD_INFO2_H = <br>冰凍彈: %L
MOTD_INFO2_I = <br>照明彈: %L
MOTD_INFO2_J = <br>槍枝擊退: %L
MOTD_INFO3 = <meta charset=UTF-8><body bgcolor=\"#000000\"><font color=\"#FF0505\"><b>殭屍:</b> 他們目標是撲滅任何的人類,他們能在黑暗中看見,有六種殭屍類型可以選擇,每個都各有他的特色、能力,但全部都很喜歡吃人腦,可以吃人腦來補血。<br><br><br><u>現在伺服器的設置</u><br>
MOTD_INFO3_A = <br>殭屍生命值: %d
MOTD_INFO3_B = <br>第一隻殭屍生命值: %d
MOTD_INFO3_C = <br>防禦力: %d%%
MOTD_INFO3_D = <br>速度: %d
MOTD_INFO3_E = <br>重力: %d
MOTD_INFO3_F = <br>傳染一個人得到的血量: %d
MOTD_INFO3_G = <br>疼痛免疫: %L
MOTD_INFO3_H = <br>吸血: %L
MOTD_INFO3_I = <br>吃一個人得到的子彈包: %d
MOTD_INFO4 = <meta charset=UTF-8><body bgcolor=\"#000000\"><font color=\"#FF0505\"><b>其他遊戲模式:</b> 有其他四種類型的遊戲模式,會隨機出現。<br><br><br><u>現在伺服器的設置:</u><br>
MOTD_INFO4_A = <br>復仇者(超級跳): %L
MOTD_INFO4_B = <br>復仇者模式機率: 1 in %d
MOTD_INFO4_C = <br>生命值: %s
MOTD_INFO4_D = <br>速度: %d
MOTD_INFO4_E = <br>重力: %d
MOTD_INFO4_F = <br>超級跳: %L
MOTD_INFO4_G = <br>疼痛免疫: %L
MOTD_INFO4_H = <br><br>倖存者: %L
MOTD_INFO4_I = <br>倖存者模式機率: 1 in %d
MOTD_INFO4_J = <br>生命值: %s
MOTD_INFO4_K = <br>速度: %d
MOTD_INFO4_L = <br>重力: %d
MOTD_INFO4_M = <br>超級跳(前進中時蹲和跳一起按): %L
MOTD_INFO4_N = <br>疼痛免疫: %L
MOTD_INFO4_O = <br><br>殭屍對抗模式(人類要消滅喪屍,不會被傳染): %L
MOTD_INFO4_P = <br>殭屍對抗模式機率: 1 in %d
MOTD_INFO4_Q = <br><br>多人傳染模式(一次出現多隻殭屍): %L
MOTD_INFO4_R = <br>多人傳染模式機率: 1 in %d
MOTD_INFO4_S = <br>傳染比率: %d%%
MOTD_INFO4_T = <br><br>瘟疫模式: %L
MOTD_INFO4_U = <br>瘟疫模式機率: 1 in %d

MOTD_ENABLED = é–‹å•Ÿ
MOTD_DISABLED = 關閉
MOTD_REMOVED = 移除
MOTD_FOG = 霧
MOTD_RAIN = 雨
MOTD_SNOW = 雪
MOTD_ROTATING = 轉動門移除
MOTD_DOORS = 移除全部的門
MOTD_DM_HUMAN = 重生為人類
MOTD_DM_ZOMBIE = 重生為殭屍
MOTD_LIMITED = 限制
MOTD_AMMO_BP = 無線填裝
MOTD_AMMO_CLIP = 無線彈夾
MOTD_KNOCKBACK1 = 只用副槍
MOTD_KNOCKBACK2 = 所有武器
MOTD_LASTZOMBIE = 只有最後一個殭屍

ZOMBIE_ATTRIB1 = 生命值
ZOMBIE_ATTRIB2 = 速度
ZOMBIE_ATTRIB3 = 重力
ZOMBIE_ATTRIB4 = 反彈力

CLASS_CLASS = é¡žåž‹:
CLASS_HUMAN = 人類
CLASS_ZOMBIE = 殭屍
CLASS_SURVIVOR = 倖存者
CLASS_NEMESIS = 復仇者

LAST_ZOMBIE_LEFT = 最後一隻殭屍離開了, %s 是新的殭屍.
LAST_HUMAN_LEFT = 最後一個人類離開了, %s 是新的人類.
NOT_ENOUGH_AMMO = 你沒有足夠的彈藥包.
AMMO_BOUGHT = 你用彈藥包買了子彈.
ZOMBIE_SELECT = (下次感染時才會變)你選擇的殭屍類型為
BUY_ENABLED = 您的購買菜單已重新啟用.
AMMO_PACKS1 = 彈藥包:
AMMO_PACKS2 = 彈藥包
SPECTATING = 正在觀察:
AIM_INFO = %s^n[ %s | Health: %d | Armor: %d | Ammo Packs: %d ]
zombieplague.inc

Code: Select all

/*================================================================================
	
	---------------------------------------
	-*- Zombie Plague 4.3 Includes File -*-
	---------------------------------------
	
	~~~~~~~~~~
	- How To -
	~~~~~~~~~~
	
	To make use of the Zombie Plague API features in your plugin, just
	add the following line at the beginning of your script:
	
	#include <zombieplague>
	
	~~~~~~~~~~~
	- Natives -
	~~~~~~~~~~~
	
	These work just like any other functions: you may have to pass
	parameters and they usually return values.
	
	Example:
	
	if ( is_user_alive( id ) && zp_get_user_zombie( id ) )
	{
		server_print( "Player %d is alive and a zombie", id )
	}
	
	~~~~~~~~~~~~
	- Forwards -
	~~~~~~~~~~~~
	
	Forwards get called whenever an event happens during the game.
	You need to make a public callback somewhere on your script,
	and it will automatically be triggered when the event occurs.
	
	Example:
	
	public zp_user_infected_post( id, infector, nemesis )
	{
		if ( !infector || nemesis )
			return;
		
		server_print( "Player %d just got infected by %d!", id, infector )
	}
	
	Also, take note of cases when there's a suffix:
	
	* _pre  : means the forward will be called BEFORE the event happens
	* _post : means it will be called AFTER the event takes place
	
=================================================================================*/

#if defined _zombieplague_included
  #endinput
#endif
#define _zombieplague_included

/* Teams for zp_register_extra_item() */
#define ZP_TEAM_ZOMBIE (1<<0)
#define ZP_TEAM_HUMAN (1<<1)
#define ZP_TEAM_NEMESIS (1<<2)
#define ZP_TEAM_ASSASSIN (1<<3)
#define ZP_TEAM_SURVIVOR (1<<4)
#define ZP_TEAM_SNIPER (1<<5)

/* Game modes for zp_round_started() */
enum
{
	MODE_INFECTION = 1,
	MODE_NEMESIS,
	MODE_ASSASSIN,
	MODE_SURVIVOR,
	MODE_SNIPER,
	MODE_SWARM,
	MODE_MULTI,
	MODE_PLAGUE,
	MODE_ARMAGEDDON,
	MODE_APOCALYPSE,
	MODE_NIGHTMARE
}

/* Winner teams for zp_round_ended() */
enum
{
	WIN_NO_ONE = 0,
	WIN_ZOMBIES,
	WIN_HUMANS
}

/* Custom forward return values */
#define ZP_PLUGIN_HANDLED 97

/**
 * Returns whether a player is a zombie.
 *
 * @param id		Player index.
 * @return		True if it is, false otherwise.
 */
native zp_get_user_zombie(id)

/**
 * Returns whether a player is a nemesis.
 *
 * @param id		Player index.
 * @return		True if it is, false otherwise.
 */
native zp_get_user_nemesis(id)

/**
 * Returns whether a player is a survivor.
 *
 * @param id		Player index.
 * @return		True if it is, false otherwise.
 */
 native zp_get_user_assassin(id)

/**
 * Returns whether a player is a survivor.
 *
 * @param id		Player index.
 * @return		True if it is, false otherwise.
 */
native zp_get_user_survivor(id)

/**
 * Returns whether a player is the first zombie.
 *
 * @param id		Player index.
 * @return		True if it is, false otherwise.
 */
 native zp_get_user_sniper(id)

/**
 * Returns whether a player is the first zombie.
 *
 * @param id		Player index.
 * @return		True if it is, false otherwise.
 */
native zp_get_user_first_zombie(id)

/**
 * Returns whether a player is the last zombie.
 *
 * @param id		Player index.
 * @return		True if it is, false otherwise.
 */
native zp_get_user_last_zombie(id)

/**
 * Returns whether a player is the last human.
 *
 * @param id		Player index.
 * @return		True if it is, false otherwise.
 */
native zp_get_user_last_human(id)

/**
 * Returns a player's current zombie class ID.
 *
 * @param id		Player index.
 * @return		Internal zombie class ID, or -1 if not yet chosen.
 */
native zp_get_user_zombie_class(id)

/**
 * Returns a player's next zombie class ID (for the next infection).
 *
 * @param id		Player index.
 * @return		Internal zombie class ID, or -1 if not yet chosen.
 */
native zp_get_user_next_class(id)

/**
 * Sets a player's next zombie class ID (for the next infection).
 *
 * @param id		Player index.
 * @param classid	A valid zombie class ID.
 * @return		True on success, false otherwise.
 */
native zp_set_user_zombie_class(id, classid)

/**
 * Returns a player's ammo pack count.
 *
 * @param id		Player index.
 * @return		Number of ammo packs owned.
 */
native zp_get_user_ammo_packs(id)

/**
 * Sets a player's ammo pack count.
 *
 * @param id		Player index.
 * @param amount	New quantity of ammo packs owned.
 */
native zp_set_user_ammo_packs(id, amount)

/**
 * Returns the default maximum health of a zombie.
 *
 * Note: Takes into account first zombie's HP multiplier.
 *
 * @param id		Player index.
 * @return		Maximum amount of health points, or -1 if not a normal zombie.
 */
native zp_get_zombie_maxhealth(id)

/**
 * Returns a player's custom flashlight batteries charge.
 *
 * @param id		Player index.
 * @return		Charge percent (0 to 100).
 */
native zp_get_user_batteries(id)

/**
 * Sets a player's custom flashlight batteries charge.
 *
 * @param id		Player index.
 * @param value		New charge percent (0 to 100).
 */
native zp_set_user_batteries(id, charge)

/**
 * Returns whether a player has night vision.
 *
 * @param id		Player index.
 * @return		True if it has, false otherwise.
 */
native zp_get_user_nightvision(id)

/**
 * Sets whether a player has night vision.
 *
 * @param id		Player index.
 * @param set		True to give, false for removing it.
 */
native zp_set_user_nightvision(id, set)

/**
 * Forces a player to become a zombie.
 *
 * Note: Unavailable for last human/survivor.
 *
 * @param id		Player index to be infected.
 * @param infector	Player index who infected him (optional).
 * @param silent	If set, there will be no HUD messages or infection sounds.
 * @param rewards	Whether to show DeathMsg and reward frags, hp, and ammo packs to infector.
 * @return		True on success, false otherwise.
 */
native zp_infect_user(id, infector = 0, silent = 0, rewards = 0)

/**
 * Forces a player to become a human.
 *
 * Note: Unavailable for last zombie/nemesis.
 *
 * @param id		Player index to be cured.
 * @param silent	If set, there will be no HUD messages or antidote sounds.
 * @return		True on success, false otherwise.
 */
native zp_disinfect_user(id, silent = 0)

/**
 * Forces a player to become a nemesis.
 *
 * Note: Unavailable for last human/survivor.
 *
 * @param id		Player index to turn into nemesis.
 * @return		True on success, false otherwise.
 */
native zp_make_user_nemesis(id)

/**
 * Forces a player to become a survivor.
 *
 * Note: Unavailable for last zombie/nemesis.
 *
 * @param id		Player index to turn into survivor.
 * @return		True on success, false otherwise.
 */
 native zp_make_user_assassin(id)

/**
 * Forces a player to become a survivor.
 *
 * Note: Unavailable for last zombie/nemesis/assassin.
 *
 * @param id		Player index to turn into survivor.
 * @return		True on success, false otherwise.
 */
native zp_make_user_survivor(id)

/**
 * Respawns a player into a specific team.
 *
 * @param id		Player index to be respawned.
 * @param team		Team to respawn the player into (ZP_TEAM_ZOMBIE or ZP_TEAM_HUMAN).
 * @return		True on success, false otherwise.
 */
 native zp_make_user_sniper(id)

/**
 * Respawns a player into a specific team.
 *
 * @param id		Player index to be respawned.
 * @param team		Team to respawn the player into (ZP_TEAM_ZOMBIE or ZP_TEAM_HUMAN).
 * @return		True on success, false otherwise.
 */
native zp_respawn_user(id, team)

/**
 * Forces a player to buy an extra item.
 *
 * @param id		Player index.
 * @param itemid	A valid extra item ID.
 * @param ignorecost	If set, item's cost won't be deduced from player.
 * @return		True on success, false otherwise.
 */
native zp_force_buy_extra_item(id, itemid, ignorecost = 0)

/**
 * Overrides ZP player model with a different custom model.
 *
 * Note: This will last until player's next infection/humanization/respawn.
 *
 * Note: Don't call more often than absolutely needed.
 *
 * @param id		Player index.
 * @param newmodel	Model name.
 * @param modelindex	Modelindex (optional).
 */
native zp_override_user_model(id, const newmodel[], modelindex = 0)

/**
 * Returns whether the ZP round has started, i.e. first zombie
 * has been chosen or a game mode has begun.
 *
 * @return		0 - Round not started
 *			1 - Round started
 *			2 - Round starting
 */
native zp_has_round_started()

/**
 * Returns whether the current round is a nemesis round.
 *
 * @return		True if it is, false otherwise.
 */
native zp_is_nemesis_round()

/**
 * Returns whether the current round is a survivor round.
 *
 * @return		True if it is, false otherwise.
 */
 native zp_is_assassin_round()

/**
 * Returns whether the current round is a survivor round.
 *
 * @return		True if it is, false otherwise.
 */
native zp_is_survivor_round()

/**
 * Returns whether the current round is a swarm round.
 *
 * @return		True if it is, false otherwise.
 */
 native zp_is_sniper_round()

/**
 * Returns whether the current round is a swarm round.
 *
 * @return		True if it is, false otherwise.
 */
native zp_is_swarm_round()

/**
 * Returns whether the current round is a plague round.
 *
 * @return		True if it is, false otherwise.
 */
native zp_is_plague_round()

/**
 * Returns number of alive zombies.
 *
 * @return		Zombie count.
 */
 native zp_is_armageddon_round()

/**
 * Returns whether the current round is a apocalypse round.
 *
 * @return		True if it is, false otherwise.
 */
native zp_is_apocalypse_round()

/**
 * Returns whether the current round is a nightmare round.
 *
 * @return		True if it is, false otherwise.
 */
native zp_is_nightmare_round()

/**
 * Returns number of alive zombies.
 *
 * @return		Zombie count.
 */
native zp_get_zombie_count()

/**
 * Returns number of alive humans.
 *
 * @return		Human count.
 */
native zp_get_human_count()

/**
 * Returns number of alive nemesis.
 *
 * @return		Nemesis count.
 */
native zp_get_nemesis_count()

/**
 * Returns number of alive survivors.
 *
 * @return		Survivor count.
 */
 native zp_get_assassin_count()

/**
 * Returns number of alive survivors.
 *
 * @return		Survivor count.
 */
native zp_get_survivor_count()

/**
 * Registers a custom item which will be added to the extra items menu of ZP.
 *
 * Note: The returned extra item ID can be later used to catch item
 * purchase events for the zp_extra_item_selected() forward.
 *
 * Note: ZP_TEAM_NEMESIS and ZP_TEAM_SURVIVOR can be used to make
 * an item available to Nemesis and Survivors respectively.
 *
 * @param name		Caption to display on the menu.
 * @param cost		Ammo packs to be deducted on purchase.
 * @param teams		Bitsum of teams it should be available for.
 * @return		An internal extra item ID, or -1 on failure.
 */
 native zp_get_sniper_count()

/**
 * Registers a custom item which will be added to the extra items menu of ZP.
 *
 * Note: The returned extra item ID can be later used to catch item
 * purchase events for the zp_extra_item_selected() forward.
 *
 * Note: ZP_TEAM_NEMESIS, ZP_TEAM_ASSASSIN, ZP_TEAM_SURVIVOR and ZP_TEAM_SNIPER can be used to make
 * an item available to Nemesis, Assassin, Survivors and Snipers respectively.
 *
 * @param name		Caption to display on the menu.
 * @param cost		Ammo packs to be deducted on purchase.
 * @param teams		Bitsum of teams it should be available for.
 * @return		An internal extra item ID, or -1 on failure.
 */
native zp_register_extra_item(const name[], cost, teams)

/**
 * Registers a custom class which will be added to the zombie classes menu of ZP.
 *
 * Note: The returned zombie class ID can be later used to identify
 * the class when calling the zp_get_user_zombie_class() natives.
 *
 * @param name		Caption to display on the menu.
 * @param info		Brief description of the class.
 * @param model		Player model to be used.
 * @param clawmodel	Claws model to be used.
 * @param hp		Initial health points.
 * @param speed		Maximum speed.
 * @param gravity	Gravity multiplier.
 * @param knockback	Knockback multiplier.
 * @return		An internal zombie class ID, or -1 on failure.
 */
native zp_register_zombie_class(const name[], const info[], const model[], const clawmodel[], hp, speed, Float:gravity, Float:knockback)

/**
 * Returns an extra item's ID.
 *
 * @param name		Item name to look for.
 * @return		Internal extra item ID, or -1 if not found.
 */
native zp_get_extra_item_id(const name[])

/**
 * Returns a zombie class' ID.
 *
 * @param name		Class name to look for.
 * @return		Internal zombie class ID, or -1 if not found.
 */
native zp_get_zombie_class_id(const name[])

/**
 * Returns a zombie class' description (passed by reference).
 *
 * @param classid		Internal zombie class ID.
 * @param info			The buffer to store the string in.
 * @param len			Character size of the output buffer.
 * @return			True on success, false otherwise.
 */
native zp_get_zombie_class_info(classid, info[], len)

/**
 * Called when the ZP round starts, i.e. first zombie
 * is chosen or a game mode begins.
 *
 * @param gamemode	Mode which has started.
 * @param id		Affected player's index (if applicable).
 */
forward zp_round_started(gamemode, id)

/**
 * Called when the round ends.
 *
 * @param winteam	Team which has won the round.
 */
forward zp_round_ended(winteam)

/**
 * Called when a player gets infected.
 *
 * @param id		Player index who was infected.
 * @param infector	Player index who infected him (if applicable).
 * @param nemesis	Whether the player was turned into a nemesis.
 */
forward zp_user_infected_pre(id, infector, nemesis)
forward zp_user_infected_post(id, infector, nemesis)

/**
 * Called when a player turns back to human.
 *
 * @param id		Player index who was cured.
 * @param survivor	Whether the player was turned into a survivor.
 */
forward zp_user_humanized_pre(id, survivor)
forward zp_user_humanized_post(id, survivor)

/**
 * Called on a player infect/cure attempt. You can use this to block
 * an infection/humanization by returning ZP_PLUGIN_HANDLED in your plugin.
 *
 * Note: Right now this is only available after the ZP round starts, since some
 * situations (like blocking a first zombie's infection) are not yet handled.
 */
forward zp_user_infect_attempt(id, infector, nemesis)
forward zp_user_humanize_attempt(id, survivor)

/**
 * Called when a player buys an extra item from the ZP menu.
 *
 * Note: You can now return ZP_PLUGIN_HANDLED in your plugin to block
 * the purchase and the player will be automatically refunded.
 *
 * @param id		Player index of purchaser.
 * @param itemid	Internal extra item ID.
 */
forward zp_extra_item_selected(id, itemid)

/**
 * Called when a player gets unfrozen (frostnades).
 *
 * @param id		Player index.
 */
forward zp_user_unfrozen(id)

/**
 * Called when a player becomes the last zombie.
 *
 * Note: This is called for the first zombie too.
 *
 * @param id		Player index.
 */
forward zp_user_last_zombie(id)

/**
 * Called when a player becomes the last human.
 *
 * @param id		Player index.
 */
forward zp_user_last_human(id)


/**
 * @deprecated - Do not use!
 * For backwards compatibility only.
 */
#define ZP_TEAM_ANY 0
zombie_plague40.sma

Code: Select all

/*================================================================================
	
		*****************************************************
		************** [Zombie Plague Mod 4.3] **************
		*****************************************************
	
	----------------------
	-*- Licensing Info -*-
	----------------------
	
	Zombie Plague Mod
	Copyright (C) 2008-2009 by MeRcyLeZZ
	
	This program is free software: you can redistribute it and/or modify
	it under the terms of the GNU General Public License as published by
	the Free Software Foundation, either version 3 of the License, or
	(at your option) any later version.
	
	This program is distributed in the hope that it will be useful,
	but WITHOUT ANY WARRANTY; without even the implied warranty of
	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
	GNU General Public License for more details.
	
	You should have received a copy of the GNU General Public License
	along with this program.  If not, see <http://www.gnu.org/licenses/>.
	
	In addition, as a special exception, the author gives permission to
	link the code of this program with the Half-Life Game Engine ("HL
	Engine") and Modified Game Libraries ("MODs") developed by Valve,
	L.L.C ("Valve"). You must obey the GNU General Public License in all
	respects for all of the code used other than the HL Engine and MODs
	from Valve. If you modify this file, you may extend this exception
	to your version of the file, but you are not obligated to do so. If
	you do not wish to do so, delete this exception statement from your
	version.
	
	-------------------
	-*- Description -*-
	-------------------
	
	Zombie Plague is a Counter-Strike server side modification, developed as
	an AMX Mod X plugin, which completely revamps the gameplay, turning the
	game into an intense "Humans vs Zombies" survival experience.
	
	Even though it's strongly based on the classic zombie infection mods, it
	takes the concept to a new level by introducing:
	
	* New Gameplay Modes: Nemesis, Survivor, Multi Infection, Swarm, Plague
	* Zombie Classes System: allows addding unlimited custom zombie classes
	* Ammo Packs: awarded to skilled players, can be exchanged for goods
	* Extra Items System: allows adding unlimited custom items to buy
	* Custom Grenades: Napalms, Frost Nades, Flares, and Infection Bombs
	* Deathmatch Mode: where zombies or humans can continually respawn
	* Admin Menus: to easily perform the included console commands
	* Special Effects: from the HL Engine, such as dynamic lighting and fog
	
	There is plenty of customization as well, which enables you to create
	several different styles of gameplay. You can:
	
	* Set zombies and humans' health, speed, models, rewards, and more
	* Toggle unlimited ammo and adjustable knockback for weapons
	* Separately enable and customize the new gameplay modes to your liking
	* Change overall map lighting (lightnings available for the dark settings)
	* Set different colors and sizes for flashlight and nightvision
	* Toggle leap (long jumping) and pain shock free (no damage slowdowns)
	* Toggle various infection effects, such as sparks and screen shakes
	* Enable random spawning (CSDM-spawn friendly)
	* Replace sounds or add some background themes
	* And many more...
	
	-------------
	-*- Media -*-
	-------------
	
	* Gameplay Video 1: http://www.youtube.com/watch?v=HFUyF7-_uzw
	* Gameplay Video 2: http://www.youtube.com/watch?v=XByif6Mti-w
	
	--------------------
	-*- Requirements -*-
	--------------------
	
	* Mods: Counter-Strike 1.6 or Condition-Zero
	* AMXX: Version 1.8.0 or later
	
	--------------------
	-*- Installation -*-
	--------------------
	
	Extract the contents from the .zip file to your server's mod directory
	("cstrike" or "czero"). Make sure to keep folder structure.
	
	-----------------------
	-*- Official Forums -*-
	-----------------------
	
	For the official Zombie Plague forums visit:
	http://forums.alliedmods.net/forumdisplay.php?f=126
	
	There you can:
	
	* Get the latest releases and early betas
	* Discuss new features and suggestions
	* Share sub-plugins (expansions) for the mod
	* Find the support and help you need
	* Report any bugs you might find
	* And all that sort of stuff...
	
	-------------------------------
	-*- CVARS and Customization -*-
	-------------------------------
	
	For a complete and in-depth cvar list, look at the zombieplague.cfg file
	located in the amxmodx\configs directory.
	
	Additionally, you can change player models, sounds, weather effects,
	and some other stuff from the configuration file zombieplague.ini.
	
	As for editing attributes of zombie classes or custom extra items, you'll
	find a zp_zombieclasses.ini and zp_extraitems.ini. These files will be
	automatically updated as you install new custom classes or items with
	new entries for you to edit conveniently.
	
	---------------
	-*- History -*-
	---------------
	
	This project started back on late 2007, when the free infection mods
	around were quite buggy and I wanted to make one on my own. With little
	to no experience at AMXX scripting, I had to start from the very scratch.
	
	Not after spending over a week looking at many plugins (mainly Zombie
	Swarm) and scarce tutorials, I somehow managed to have all the basic
	stuff working quite well (even though the code was a real mess). The
	following months were spent polishing things up and trying to fulfill
	new original ideas, most of them quite worth the hard work.
	
	In the meantime, I got the chance to try the plugin out on a 32 man
	server. This meant a huge progress on development, and after lots of
	testing and bug fixing, the mod turned out to be more than the simple
	infection plugin I had originally planned it to be.
	
	The project has come a long way since, and I'm glad to say I'm finally
	making it freely available. All I'm asking in return is to keep my
	name in the plugin.
	
	-Enjoy!
	
	----------------------
	-*- Infection Mode -*-
	----------------------
	
	On every round players start out as humans, equip themselves with a few
	weapons and grenades, and head to the closest cover they find, knowing
	that one of them is infected with the T-Virus, and will suddenly turn
	into a vicious brain eating creature.
	
	Only little time after, the battle for survival begins. The first zombie
	has to infect as many humans as possible to cluster a numerous zombie
	horde and take over the world.
	
	Maps are set in the dark by default. Humans must use flashlights to light
	their way and spot any enemies. Zombies, on the other hand, have night
	vision but can only attack melee.
	
	--------------------------
	-*- New Gameplay Modes -*-
	--------------------------
	
	* Nemesis:
	   The first zombie may turn into a Nemesis, a powerful fast-moving
	   beast. His goal is to kill every human while sustaining the gunfire.
	
	* Survivor:
	   Everyone became a zombie except him. The survivor gets a machinegun
	   with unlimited ammo and has to stop the never-ending army of undead.
	
	* Multiple Infection:
	   The round starts with many humans infected, so the remaining players
	   will have to act quickly in order to control the situation.
	
	* Swarm Mode:
	   Half of the players turn into zombies, the rest become immune and
	   cannot be infected. It's a battle to death.
	
	* Plague Mode: [bonus]
	   A full armed Survivor and his soldiers are to face Nemesis and
	   his zombie minions. The future of the world is in their hands.
	
	--------------------
	-*- In-Game Menu -*-
	--------------------
	
	Players can access the mod menu by typing "zpmenu" on chat, or by
	pressing the M ("chooseteam") key. The menu allows players to choose
	their zombie class, buy extra items, get unstuck, or see the ingame
	help. Admins will find an additional option to easily perform all
	console commands.
	
	----------------------
	-*- Admin Commands -*-
	----------------------
	
	The following console commands are available:
	
	* zp_zombie <target> - Turn someone into a Zombie
	* zp_human <target> - Turn someone back to Human
	* zp_nemesis <target> - Turn someone into a Nemesis
	* zp_survivor <target> - Turn someone into a Survivor
	* zp_respawn <target> - Respawn someone
	* zp_swarm - Start Swarm Mode (*)
	* zp_multi - Start Multi Infection (*)
	* zp_plague - Start Plague Mode (*)
	
	(*) - These commands can only be used at round start, that is, when the
	T-Virus notice is shown on screen. 
	
	------------------
	-*- Plugin API -*-
	------------------
	
	From version 3.6, some natives and forwards have been added to ease the
	development of sub-plugins, though you may also find them useful to work
	out compatibility issues with existing plugins.
	
	Look for the zombieplague.inc file in your amxmodx\scripting\include
	folder for the full documented list.
	
	----------------------
	-*- Zombie Classes -*-
	----------------------
	
	From version 4.0 it is possible to create and add an unlimited number of
	zombie classes to the main mod. They can be made as separate plugins,
	by using the provided zombie class API, and easily distributed.
	
	By default, five zombie classes are included:
	
	* Classic Zombie: well balanced zombie for beginners.
	* Raptor Zombie: fast moving zombie, but also the weakest.
	* Poison Zombie: light weighed zombie, jumps higher.
	* Big Zombie: slow but strong zombie, with lots of hit points.
	* Leech Zombie: regains additional health when infecting.
	
	-------------------
	-*- Extra Items -*-
	-------------------
	
	From version 4.0 it is possible to add an unlimited number of items
	which can be purchased through the Extra Items menu. All you need
	to do is use the provided item registration natives on your custom
	plugins. You can set the name, the cost in ammo packs, and the team
	the extra item should be available for.
	
	By default there is a number of items already included, listed here:
	
	* Night Vision: makes you able to see in the dark for a single round [Human]
	* T-Virus Antidote: makes you turn back to your human form [Zombie]
	* Zombie Madness: you develop a powerful shield for a short time [Zombie]
	* Infection Bomb: infects anyone within its explosion radius [Zombie]
	
	You are also able to choose some weapons to act as extra items, and change
	ammo packs costs in the customization file (zombieplague.ini).
	
	---------------
	-*- Credits -*-
	---------------
	
	* AMXX Dev Team: for all the hard work which made this possible
	* Imperio LNJ Community: for providing the first server where I
	   could really test the plugin and for everyone's support
	* Mini_Midget: for his Zombie Swarm plugin which I used for reference
	   on earliest stages of development
	* Avalanche: for the random spawning code I got from GunGame and the
	   original Frostnades concept that I ported in here
	* cheap_suit: for some modelchange and knockback codes that I got from
	   Biohazard
	* Simon Logic/ConnorMcLeod: for the Pain Shock Free feature
	* KRoT@L: for some code from Follow the Wounded, used to make the zombie
	   bleeding feature
	* VEN: for Fakemeta Utilities and some useful stocks
	* RaaPuar and Goltark: for the custom grenade models
	* Orangutanz: for finding the precached modelindex offset
	* ML Translations: DKs/nunoabc/DarkMarcos (bp), JahMan/KWo (pl), DA (de),
	   Zombie Lurker (ls), DoPe^ (da), k1nny (fr), NeWbiE' (cz), skymoon (tc),
	   SUPER MATRIX/Shidla/zDemon/4eRT (ru), zsy314 (cn), lOlIl/Seehank (sk),
	   Bridgestone (sv), crazyeffect.net/Mave/Wesley (nl), hleV/aaarnas (lt),
	   darkbad945 (bg), decongamco (vn), beckham9224 (mn), TehGeorge (gr),
	   shadoww_ro/tuty/georgik57/EastSider (ro)
	* Beta testers: for all the feedback, bug reports, and suggestions which
	   constantly help improve this mod further
	* And to all zombie-mod supporters out there!
	
	-----------------
	-*- Changelog -*-
	-----------------
	
	* v1.0: (Dec 2007)
	   - First Release: most of the basic stuff done.
	   - Added: random spawning, HP display on hud, lighting setting,
	      simple buy menu, custom nightvision, admin commands, Nemesis
	      and Survivor modes, glow and leap settings for them.
	
	* v2.2: (Jan 2008)
	   - Added: zombie classes, ammo packs system, buying ammo for weapons,
	      custom flashlight, admin skins setting, zombieplague.cfg file
	   - Upgraded: weapons menu improved, flashlight and nightvision colors
	      now customizable, HamSandwich module used to handle damage.
	   - Fixed various bugs.
	
	* v3.0: (Mar 2008)
	   - Added: door removal setting, unstuck feature, human cvars, armor
	      cvar for zombies, weapon knockback, zombie bleeding, flares,
	      extra items (weapons, antidote, infection bomb), pain shock
	      free setting, Multiple Infection and Swarm modes.
	   - Upgraded: dumped Engine, Fun and Cstrike modules, code optimized,
	      new model change method, new gfx effects for zombie infections.
	   - Fixed a bunch of gameplay bugs.
	
	* v3.5: (May 2008)
	   - Added: deathmatch setting with spawn protection, unlimited ammo
	      setting, fire and frost grenades, additional customization cvars,
	      new extra items, help menu.
	   - Upgraded: better objectives removal method, dropped weapons now
	      keep their bpammo, code optimized a lot.
	   - Fixed: no more game commencing bug when last zombie/human leaves,
	      no more hegrenade infection bug, reduced svc_bad errors, and
	      many more.
	
	* v3.6: (Jun 2008)
	   - Added: a few natives and forwards for sub-plugins support,
	      zombie classes can now have their own models, additional
	      knockback customization, bot support, various CVARs.
	   - Upgraded: extra items now supporting grenades and pistols, changed
	      bomb removal method, players can join on survivor/swarm rounds,
	      extended lightnings support to other dark settings.
	   - Fixed: a bunch of minor bugs, and a server crash with CZ bots.
	
	* v4.0: (Aug 2008)
	   - Added: new gameplay mode (Plague Mode), option to remember weapon
	      selection, command to enable/disable the plugin, more CVARs.
	   - Upgraded: redid all the menus, extra items and zombie classes now
	      support external additions, survivor can now have its own model,
	      upgraded model changing method.
	   - Fixed: some bugs with bots, win sounds not being precached.
	
	* v4.1: (Oct 2008)
	   - Added: more CVARs, more customization, more natives, custom
	      leap system, admin zombie models support, and more.
	   - Upgraded: custom grenades compatible with Nade Modes, ambience
	      sounds specific game mode support, optimized bandwidth usage
	      for temp ents, admin commands logged with IP and SteamID.
	   - Fixed: lots of bugs (some minor, some not)
	
	* v4.2: (Feb 2009)
	   - Added various CVARs for customization, improved prevention of
	      svc_bad in some cases, optimized ammo handling code.
	   - Fixed server crash with 'msg 35 has not been sent yet' error,
	      fixed client overflow issues with ambience sounds, resolved
	      many gameplay bugs.
	
	* v4.3: (Apr 2009)
	   - Customization settings can now be edited through external files,
	      added support for global and multiple random zombie models,
	      added even more CVARs for tweaking stuff, extended admin commands'
	      functionality, greatly extended API capabilities, implemented a
	      more efficient Pain Shock Free code, reworked some menus.
	   - Fixed pretty much all reported bugs to the date.
	   
	** v4.3.Fix6a [Dec 2015]

	   - Added Armor information.
	   - Added Aim info with cvar , // got code from zpa
	   - Added 5 new Modes  ,Sniper, Assassin, armageddon , sniper Vs Assassin and NightMare Mode.
	   - Changed HUD_SPECT_X , got code from zpa and changed spcetating color and size.
	   - Added P model for sniper Model
	   - Fixed Glow Size , that appear white glow without enable cvar_glow for nemesis, survivor, sniper. assassin. (bug fixed)
	   - Fixed nemesis Glow 
	   - Removed cvar_survweapon. and added AK-47 & XM1014 weapon for survivor. if you want to change, search it "// Update model on weaponmodel ent".
	   - Fixed player can walk when zombie is freeze (bug fixed)
	   - new CVAR zp_dmg_while_frost, if enable, zombie will not get dmg while frost
	   - Fixed SetHamParamInteger (fw_PlayerKilled runtime error)
	   - Added 2 new natives from zpa . zp_get_user_model & zp_set_user_model
	   - Removed Unlimited Clip. Survivor is now given 32767 clips
	   - Added zp_zombie_painfree <3> setting (only affect first zombie)
	   - Added zp_human_kill_reward setting (rewards ammopacks for killing zombie)
	
=================================================================================*/

/*================================================================================
 [Plugin Customization]
=================================================================================*/

// All customization settings have been moved
// to external files to allow easier editing
new const ZP_CUSTOMIZATION_FILE[] = "zombieplague.ini"
new const ZP_EXTRAITEMS_FILE[] = "zp_extraitems.ini"
new const ZP_ZOMBIECLASSES_FILE[] = "zp_zombieclasses.ini"

// Limiters for stuff not worth making dynamic arrays out of (increase if needed)
const MAX_CSDM_SPAWNS = 128
const MAX_STATS_SAVED = 64

/*================================================================================
 Customization ends here! Yes, that's it. Editing anything beyond
 here is not officially supported. Proceed at your own risk...
=================================================================================*/

#include <amxmodx>
#include <amxmisc>
#include <cstrike>
#include <fakemeta>
#include <hamsandwich>
#include <xs>

/*================================================================================
 [Constants, Offsets, Macros]
=================================================================================*/

// Plugin Version
new const PLUGIN_VERSION[] = "4.3 Fix6a"

// Customization file sections
enum
{
	SECTION_NONE = 0,
	SECTION_ACCESS_FLAGS,
	SECTION_PLAYER_MODELS,
	SECTION_WEAPON_MODELS,
	SECTION_GRENADE_SPRITES,
	SECTION_SOUNDS,
	SECTION_AMBIENCE_SOUNDS,
	SECTION_BUY_MENU_WEAPONS,
	SECTION_EXTRA_ITEMS_WEAPONS,
	SECTION_HARD_CODED_ITEMS_COSTS,
	SECTION_WEATHER_EFFECTS,
	SECTION_SKY,
	SECTION_LIGHTNING,
	SECTION_ZOMBIE_DECALS,
	SECTION_KNOCKBACK,
	SECTION_OBJECTIVE_ENTS,
	SECTION_SVC_BAD
}

// Access flags
enum
{
	ACCESS_ENABLE_MOD = 0,
	ACCESS_ADMIN_MENU,
	ACCESS_ADMIN_MODES_MENU,
	ACCESS_MODE_INFECTION,
	ACCESS_MODE_NEMESIS,
	ACCESS_MODE_ASSASSIN,
	ACCESS_MODE_SURVIVOR,
	ACCESS_MODE_SNIPER,
	ACCESS_MODE_SWARM,
	ACCESS_MODE_MULTI,
	ACCESS_MODE_PLAGUE,
	ACCESS_MODE_ARMAGEDDON,
	ACCESS_MODE_APOCALYPSE,
	ACCESS_MODE_NIGHTMARE,
	ACCESS_MAKE_ZOMBIE,
	ACCESS_MAKE_HUMAN,
	ACCESS_MAKE_NEMESIS,
	ACCESS_MAKE_ASSASSIN,
	ACCESS_MAKE_SURVIVOR,
	ACCESS_MAKE_SNIPER,
	ACCESS_RESPAWN_PLAYERS,
	ACCESS_ADMIN_MODELS,
	MAX_ACCESS_FLAGS
}

// Task offsets
enum (+= 100)
{
	TASK_MODEL = 2000,
	TASK_TEAM,
	TASK_SPAWN,
	TASK_BLOOD,
	TASK_AURA,
	TASK_BURN,
	TASK_NVISION,
	TASK_FLASH,
	TASK_CHARGE,
	TASK_SHOWHUD,
	TASK_MAKEZOMBIE,
	TASK_WELCOMEMSG,
	TASK_THUNDER_PRE,
	TASK_THUNDER,
	TASK_AMBIENCESOUNDS
}

// IDs inside tasks
#define ID_MODEL (taskid - TASK_MODEL)
#define ID_TEAM (taskid - TASK_TEAM)
#define ID_SPAWN (taskid - TASK_SPAWN)
#define ID_BLOOD (taskid - TASK_BLOOD)
#define ID_AURA (taskid - TASK_AURA)
#define ID_BURN (taskid - TASK_BURN)
#define ID_NVISION (taskid - TASK_NVISION)
#define ID_FLASH (taskid - TASK_FLASH)
#define ID_CHARGE (taskid - TASK_CHARGE)
#define ID_SHOWHUD (taskid - TASK_SHOWHUD)

// BP Ammo Refill task
#define REFILL_WEAPONID args[0]

// For weapon buy menu handlers
#define WPN_STARTID g_menu_data[id][1]
#define WPN_MAXIDS ArraySize(g_primary_items)
#define WPN_SELECTION (g_menu_data[id][1]+key)
#define WPN_AUTO_ON g_menu_data[id][2]
#define WPN_AUTO_PRI g_menu_data[id][3]
#define WPN_AUTO_SEC g_menu_data[id][4]

// For player list menu handlers
#define PL_ACTION g_menu_data[id][0]

// For remembering menu pages
#define MENU_PAGE_ZCLASS g_menu_data[id][5]
#define MENU_PAGE_EXTRAS g_menu_data[id][6]
#define MENU_PAGE_PLAYERS g_menu_data[id][7]

// For extra items menu handlers
#define EXTRAS_CUSTOM_STARTID (EXTRA_WEAPONS_STARTID + ArraySize(g_extraweapon_names))

// Menu selections
const MENU_KEY_AUTOSELECT = 7
const MENU_KEY_BACK = 7
const MENU_KEY_NEXT = 8
const MENU_KEY_EXIT = 9

// Hard coded extra items
enum
{
	EXTRA_NVISION = 0,
	EXTRA_ANTIDOTE,
	EXTRA_MADNESS,
	EXTRA_INFBOMB,
	EXTRA_WEAPONS_STARTID
}

// Game modes
enum
{
	MODE_NONE = 0,
	MODE_INFECTION,
	MODE_NEMESIS,
	MODE_ASSASSIN,
	MODE_SURVIVOR,
	MODE_SNIPER,
	MODE_SWARM,
	MODE_MULTI,
	MODE_PLAGUE,
	MODE_ARMAGEDDON,
	MODE_APOCALYPSE,
	MODE_NIGHTMARE
}

// ZP Teams
const ZP_TEAM_NO_ONE = 0
const ZP_TEAM_ANY = 0
const ZP_TEAM_ZOMBIE = (1<<0)
const ZP_TEAM_HUMAN = (1<<1)
const ZP_TEAM_NEMESIS = (1<<2)
const ZP_TEAM_ASSASSIN = (1<<3)
const ZP_TEAM_SURVIVOR = (1<<4)
const ZP_TEAM_SNIPER = (1<<5)
new const ZP_TEAM_NAMES[][] = 
{ 	
	"ZOMBIE , HUMAN", 
	"ZOMBIE", 
	"HUMAN", 
	"ZOMBIE , HUMAN", 
	"NEMESIS",
	"ZOMBIE , NEMESIS", 
	"HUMAN , NEMESIS", 
	"ZOMBIE , HUMAN , NEMESIS",
	"ASSASSIN", 
	"ZOMBIE , ASSASSIN", 
	"HUMAN , ASSASSIN", 
	"ZOMBIE, HUMAN, ASSASSIN",
	"NEMESIS , ASSASSIN",
	"ZOMBIE , NEMESIS , ASSASSIN",
	"HUMAN, NEMESIS, ASSASSIN",
	"ZOMBIE , HUMAN , NEMESIS , ASSASSIN",
	"SURVIVOR",
	"ZOMBIE, SURVIVOR",
	"HUMAN, SURVIVOR",
	"ZOMBIE, HUMAN, SURVIVOR",
	"NEMESIS , SURVIVOR",
	"ZOMBIE , NEMESIS , SURVIVOR",
	"HUMAN , NEMESIS , SURVIVOR",
	"ZOMBIE , HUMAN , NEMESIS , SURVIVOR",
	"ASSASSIN, SURVIVOR",
	"ZOMBIE, ASSASSIN, SURVIVOR",
	"HUMAN, ASSASSIN, SURVIVOR",
	"ZOMBIE, HUMAN, ASSASSIN, SURVIVOR",
	"NEMESIS, ASSASSIN, SURVIVOR",
	"ZOMBIE, NEMESIS, ASSASSIN, SURVIVOR",
	"HUMAN, NEMESIS, ASSASSIN, SURVIVOR",
	"ZOMBIE, HUMAN, NEMESIS, ASSASSIN, SURVIVOR",
	"SNIPER",
	"ZOMBIE, SNIPER",
	"HUMAN, SNIPER",
	"ZOMBIE, HUMAN, SNIPER",
	"NEMESIS, SNIPER",
	"ZOMBIE, NEMESIS, SNIPER",
	"HUMAN, NEMESIS, SNIPER",
	"ZOMBIE, HUMAN, NEMESIS, SNIPER",
	"ASSASSIN, SNIPER",
	"ZOMBIE, ASSASSIN, SNIPER",
	"HUMAN, ASSASSIN, SNIPER",
	"ZOMBIE, HUMAN, ASSASSIN, SNIPER",
	"NEMESIS, ASSASSIN, SNIPER",
	"ZOMBIE, NEMESIS, ASSASSIN, SNIPER",
	"HUMAN, NEMESIS, ASSASSIN, SNIPER",
	"ZOMBIE, HUMAN, NEMESIS, ASSASSIN, SNIPER",
	"SURVIVOR, SNIPER",
	"ZOMBIE, SURVIVOR, SNIPER",
	"HUMAN, SURVIVOR, SNIPER",
	"ZOMBIE, HUMAN, SURVIVOR, SNIPER",
	"NEMESIS, SURVIVOR, SNIPER",
	"ZOMBIE, NEMESIS, SURVIVOR, SNIPER",
	"HUMAN, NEMESIS, SURVIVOR, SNIPER",
	"ZOMBIE, HUMAN, NEMESIS, SURVIVOR, SNIPER",
	"ASSASSIN, SURVIVOR, SNIPER",
	"ZOMBIE, ASSASSIN, SURVIVOR, SNIPER",
	"HUMAN, ASSASSIN, SURVIVOR, SNIPER",
	"ZOMBIE, HUMAN, ASSASSIN, SURVIVOR, SNIPER",
	"NEMESIS, ASSASSIN, SURVIVOR, SNIPER",
	"ZOMBIE, NEMESIS, ASSASSIN, SURVIVOR, SNIPER",
	"HUMAN, NEMESIS, ASSASSIN, SURVIVOR, SNIPER",
	"ZOMBIE, HUMAN, NEMESIS, ASSASSIN, SURVIVOR, SNIPER"
}

// Zombie classes
const ZCLASS_NONE = -1

// HUD messages
const Float:HUD_EVENT_X = -1.0
const Float:HUD_EVENT_Y = 0.17
const Float:HUD_INFECT_X = 0.05
const Float:HUD_INFECT_Y = 0.45
const Float:HUD_SPECT_X = -1.0
const Float:HUD_SPECT_Y = 0.8
const Float:HUD_STATS_X = 0.02
const Float:HUD_STATS_Y = 0.9

// Hack to be able to use Ham_Player_ResetMaxSpeed (by joaquimandrade)
new Ham:Ham_Player_ResetMaxSpeed = Ham_Item_PreFrame

// CS Player PData Offsets (win32)
const PDATA_SAFE = 2
const OFFSET_PAINSHOCK = 108 // ConnorMcLeod
const OFFSET_CSTEAMS = 114
const OFFSET_CSMONEY = 115
const OFFSET_CSMENUCODE = 205
const OFFSET_FLASHLIGHT_BATTERY = 244
const OFFSET_CSDEATHS = 444
const OFFSET_MODELINDEX = 491 // Orangutanz

// CS Player CBase Offsets (win32)
const OFFSET_ACTIVE_ITEM = 373

// CS Weapon CBase Offsets (win32)
const OFFSET_WEAPONOWNER = 41

// Linux diff's
const OFFSET_LINUX = 5 // offsets 5 higher in Linux builds
const OFFSET_LINUX_WEAPONS = 4 // weapon offsets are only 4 steps higher on Linux

// CS Teams
enum
{
	FM_CS_TEAM_UNASSIGNED = 0,
	FM_CS_TEAM_T,
	FM_CS_TEAM_CT,
	FM_CS_TEAM_SPECTATOR
}
new const CS_TEAM_NAMES[][] = { "UNASSIGNED", "TERRORIST", "CT", "SPECTATOR" }

// Some constants
const HIDE_MONEY = (1<<5)
const UNIT_SECOND = (1<<12)
const DMG_HEGRENADE = (1<<24)
const IMPULSE_FLASHLIGHT = 100
const USE_USING = 2
const USE_STOPPED = 0
const STEPTIME_SILENT = 999
const BREAK_GLASS = 0x01
const FFADE_IN = 0x0000
const FFADE_STAYOUT = 0x0004
const PEV_SPEC_TARGET = pev_iuser2

// Max BP ammo for weapons
new const MAXBPAMMO[] = { -1, 52, -1, 90, 1, 32, 1, 100, 90, 1, 120, 100, 100, 90, 90, 90, 100, 120,
			30, 120, 200, 32, 90, 120, 90, 2, 35, 90, 90, -1, 100 }

// Max Clip for weapons
new const MAXCLIP[] = { -1, 13, -1, 10, -1, 7, -1, 30, 30, -1, 30, 20, 25, 30, 35, 25, 12, 20,
			10, 30, 100, 8, 30, 30, 20, -1, 7, 30, 30, -1, 50 }

// Amount of ammo to give when buying additional clips for weapons
new const BUYAMMO[] = { -1, 13, -1, 30, -1, 8, -1, 12, 30, -1, 30, 50, 12, 30, 30, 30, 12, 30,
			10, 30, 30, 8, 30, 30, 30, -1, 7, 30, 30, -1, 50 }

// Ammo IDs for weapons
new const AMMOID[] = { -1, 9, -1, 2, 12, 5, 14, 6, 4, 13, 10, 7, 6, 4, 4, 4, 6, 10,
			1, 10, 3, 5, 4, 10, 2, 11, 8, 4, 2, -1, 7 }

// Ammo Type Names for weapons
new const AMMOTYPE[][] = { "", "357sig", "", "762nato", "", "buckshot", "", "45acp", "556nato", "", "9mm", "57mm", "45acp",
			"556nato", "556nato", "556nato", "45acp", "9mm", "338magnum", "9mm", "556natobox", "buckshot",
			"556nato", "9mm", "762nato", "", "50ae", "556nato", "762nato", "", "57mm" }

// Weapon IDs for ammo types
new const AMMOWEAPON[] = { 0, CSW_AWP, CSW_SCOUT, CSW_M249, CSW_AUG, CSW_XM1014, CSW_MAC10, CSW_FIVESEVEN, CSW_DEAGLE,
			CSW_P228, CSW_ELITE, CSW_FLASHBANG, CSW_HEGRENADE, CSW_SMOKEGRENADE, CSW_C4 }

// Primary and Secondary Weapon Names
new const WEAPONNAMES[][] = { "", "P228 Compact", "", "Schmidt Scout", "", "XM1014 M4", "", "Ingram MAC-10", "Steyr AUG A1",
			"", "Dual Elite Berettas", "FiveseveN", "UMP 45", "SG-550 Auto-Sniper", "IMI Galil", "Famas",
			"USP .45 ACP Tactical", "Glock 18C", "AWP Magnum Sniper", "MP5 Navy", "M249 Para Machinegun",
			"M3 Super 90", "M4A1 Carbine", "Schmidt TMP", "G3SG1 Auto-Sniper", "", "Desert Eagle .50 AE",
			"SG-552 Commando", "AK-47 Kalashnikov", "", "ES P90" }

// Weapon entity names
new const WEAPONENTNAMES[][] = { "", "weapon_p228", "", "weapon_scout", "weapon_hegrenade", "weapon_xm1014", "weapon_c4", "weapon_mac10",
			"weapon_aug", "weapon_smokegrenade", "weapon_elite", "weapon_fiveseven", "weapon_ump45", "weapon_sg550",
			"weapon_galil", "weapon_famas", "weapon_usp", "weapon_glock18", "weapon_awp", "weapon_mp5navy", "weapon_m249",
			"weapon_m3", "weapon_m4a1", "weapon_tmp", "weapon_g3sg1", "weapon_flashbang", "weapon_deagle", "weapon_sg552",
			"weapon_ak47", "weapon_knife", "weapon_p90" }

// CS sounds
new const sound_flashlight[] = "items/flashlight1.wav"
new const sound_buyammo[] = "items/9mmclip1.wav"
new const sound_armorhit[] = "player/bhit_helmet-1.wav"

// Explosion radius for custom grenades
const Float:NADE_EXPLOSION_RADIUS = 240.0

// HACK: pev_ field used to store additional ammo on weapons
const PEV_ADDITIONAL_AMMO = pev_iuser1

// HACK: pev_ field used to store custom nade types and their values
const PEV_NADE_TYPE = pev_flTimeStepSound
const NADE_TYPE_INFECTION = 1111
const NADE_TYPE_NAPALM = 2222
const NADE_TYPE_FROST = 3333
const NADE_TYPE_FLARE = 4444
const PEV_FLARE_COLOR = pev_punchangle
const PEV_FLARE_DURATION = pev_flSwimTime

// Weapon bitsums
const PRIMARY_WEAPONS_BIT_SUM = (1<<CSW_SCOUT)|(1<<CSW_XM1014)|(1<<CSW_MAC10)|(1<<CSW_AUG)|(1<<CSW_UMP45)|(1<<CSW_SG550)|(1<<CSW_GALIL)|(1<<CSW_FAMAS)|(1<<CSW_AWP)|(1<<CSW_MP5NAVY)|(1<<CSW_M249)|(1<<CSW_M3)|(1<<CSW_M4A1)|(1<<CSW_TMP)|(1<<CSW_G3SG1)|(1<<CSW_SG552)|(1<<CSW_AK47)|(1<<CSW_P90)
const SECONDARY_WEAPONS_BIT_SUM = (1<<CSW_P228)|(1<<CSW_ELITE)|(1<<CSW_FIVESEVEN)|(1<<CSW_USP)|(1<<CSW_GLOCK18)|(1<<CSW_DEAGLE)

// Allowed weapons for zombies (added grenades/bomb for sub-plugin support, since they shouldn't be getting them anyway)
const ZOMBIE_ALLOWED_WEAPONS_BITSUM = (1<<CSW_KNIFE)|(1<<CSW_HEGRENADE)|(1<<CSW_FLASHBANG)|(1<<CSW_SMOKEGRENADE)|(1<<CSW_C4)

// Classnames for separate model entities
new const MODEL_ENT_CLASSNAME[] = "player_model"
new const WEAPON_ENT_CLASSNAME[] = "weapon_model"

// Menu keys
const KEYSMENU = MENU_KEY_1|MENU_KEY_2|MENU_KEY_3|MENU_KEY_4|MENU_KEY_5|MENU_KEY_6|MENU_KEY_7|MENU_KEY_8|MENU_KEY_9|MENU_KEY_0

// Ambience Sounds
enum
{
	AMBIENCE_SOUNDS_INFECTION = 0,
	AMBIENCE_SOUNDS_NEMESIS,
	AMBIENCE_SOUNDS_ASSASSIN,
	AMBIENCE_SOUNDS_SURVIVOR,
	AMBIENCE_SOUNDS_SNIPER,
	AMBIENCE_SOUNDS_SWARM,
	AMBIENCE_SOUNDS_PLAGUE,
	AMBIENCE_SOUNDS_ARMAGEDDON,
	AMBIENCE_SOUNDS_APOCALYPSE,
	AMBIENCE_SOUNDS_NIGHTMARE,
	MAX_AMBIENCE_SOUNDS
}

// Admin menu actions
enum
{
	ACTION_ZOMBIEFY_HUMANIZE = 0,
	ACTION_MAKE_NEMESIS,
	ACTION_MAKE_ASSASSIN,
	ACTION_MAKE_SURVIVOR,
	ACTION_MAKE_SNIPER,
	ACTION_RESPAWN_PLAYER,
	ACTION_MODES_MENU
	
}

// Admin modes menu actions
enum
{
    ACTION_MODE_SWARM,
	ACTION_MODE_MULTI,
	ACTION_MODE_PLAGUE,
	ACTION_MODE_ARMAGEDDON,
	ACTION_MODE_APOCALYPSE,
	ACTION_MODE_NIGHTMARE
}

// Custom forward return values
const ZP_PLUGIN_HANDLED = 97

/*================================================================================
 [Global Variables]
=================================================================================*/

// Player vars
new g_zombie[33] // is zombie
new g_nemesis[33] // is nemesis
new g_assassin[33] // is assassin
new g_survivor[33] // is survivor
new g_sniper[33] // is assassin
new g_firstzombie[33] // is first zombie
new g_lastzombie[33] // is last zombie
new g_lasthuman[33] // is last human
new g_frozen[33] // is frozen (can't move)
new Float:g_frozen_gravity[33] // store previous gravity when frozen
new g_nodamage[33] // has spawn protection/zombie madness
new g_respawn_as_zombie[33] // should respawn as zombie
new g_nvision[33] // has night vision
new g_nvisionenabled[33] // has night vision turned on
new g_zombieclass[33] // zombie class
new g_zombieclassnext[33] // zombie class for next infection
new g_flashlight[33] // has custom flashlight turned on
new g_flashbattery[33] = { 100, ... } // custom flashlight battery
new g_canbuy[33] // is allowed to buy a new weapon through the menu
new g_ammopacks[33] // ammo pack count
new g_damagedealt_human[33] // damage dealt as human (used to calculate ammo packs reward)
new g_damagedealt_zombie[33] // damage dealt as zombie (used to calculate ammo packs reward)
new Float:g_lastleaptime[33] // time leap was last used
new Float:g_lastflashtime[33] // time flashlight was last toggled
new g_playermodel[33][32] // current model's short name [player][model]
new g_menu_data[33][8] // data for some menu handlers
new g_ent_playermodel[33] // player model entity
new g_ent_weaponmodel[33] // weapon model entity
new g_burning_duration[33] // burning task duration
new Float:g_buytime[33] // used to calculate custom buytime

// Game vars
new g_pluginenabled // ZP enabled
new g_newround // new round starting
new g_endround // round ended
new g_nemround // nemesis round
new g_assaround // assassin round
new g_survround // survivor round
new g_sniround // sniper round
new g_swarmround // swarm round
new g_plagueround // plague round
new g_armageround // armageddon round
new g_apocround // apocalypse round
new g_nightround // nightmare round
new g_modestarted // mode fully started
new g_lastmode // last played mode
new g_scorezombies, g_scorehumans, g_gamecommencing // team scores
new g_spawnCount, g_spawnCount2 // available spawn points counter
new Float:g_spawns[MAX_CSDM_SPAWNS][3], Float:g_spawns2[MAX_CSDM_SPAWNS][3] // spawn points data
new g_lights_i // lightning current lights counter
new g_lights_cycle[32] // current lightning cycle
new g_lights_cycle_len // lightning cycle length
new Float:g_models_targettime // for adding delays between Model Change messages
new Float:g_teams_targettime // for adding delays between Team Change messages
new g_MsgSync, g_MsgSync2, g_MsgSync3 // message sync objects
new g_trailSpr, g_exploSpr, g_flameSpr, g_smokeSpr, g_glassSpr // grenade sprites
new g_modname[32] // for formatting the mod name
new g_freezetime // whether CS's freeze time is on
new g_maxplayers // max players counter
new g_czero // whether we are running on a CZ server
new g_hamczbots // whether ham forwards are registered for CZ bots
new g_fwSpawn, g_fwPrecacheSound // spawn and precache sound forward handles
new g_infbombcounter, g_antidotecounter, g_madnesscounter // to limit buying some items
new g_arrays_created // to prevent stuff from being registered before initializing arrays
new g_lastplayerleaving // flag for whenever a player leaves and another takes his place
new g_switchingteam // flag for whenever a player's team change emessage is sent
new g_buyzone_ent // custom buyzone entity

// Message IDs vars
new g_msgScoreInfo, g_msgNVGToggle, g_msgScoreAttrib, g_msgAmmoPickup, g_msgScreenFade,
g_msgDeathMsg, g_msgSetFOV, g_msgFlashlight, g_msgFlashBat, g_msgTeamInfo, g_msgDamage,
g_msgHideWeapon, g_msgCrosshair, g_msgSayText, g_msgScreenShake, g_msgCurWeapon

// Some forward handlers
new g_fwRoundStart, g_fwRoundEnd, g_fwUserInfected_pre, g_fwUserInfected_post,
g_fwUserHumanized_pre, g_fwUserHumanized_post, g_fwUserInfect_attempt,
g_fwUserHumanize_attempt, g_fwExtraItemSelected, g_fwUserUnfrozen,
g_fwUserLastZombie, g_fwUserLastHuman, g_fwDummyResult

// Temporary Database vars (used to restore players stats in case they get disconnected)
new db_name[MAX_STATS_SAVED][32] // player name
new db_ammopacks[MAX_STATS_SAVED] // ammo pack count
new db_zombieclass[MAX_STATS_SAVED] // zombie class
new db_slot_i // additional saved slots counter (should start on maxplayers+1)

// Extra Items vars
new Array:g_extraitem_name // caption
new Array:g_extraitem_cost // cost
new Array:g_extraitem_team // team
new g_extraitem_i // loaded extra items counter

// For extra items file parsing
new Array:g_extraitem2_realname, Array:g_extraitem2_name, Array:g_extraitem2_cost,
Array:g_extraitem2_team, Array:g_extraitem_new

// Zombie Classes vars
new Array:g_zclass_name // caption
new Array:g_zclass_info // description
new Array:g_zclass_modelsstart // start position in models array
new Array:g_zclass_modelsend // end position in models array
new Array:g_zclass_playermodel // player models array
new Array:g_zclass_modelindex // model indices array
new Array:g_zclass_clawmodel // claw model
new Array:g_zclass_hp // health
new Array:g_zclass_spd // speed
new Array:g_zclass_grav // gravity
new Array:g_zclass_kb // knockback
new g_zclass_i // loaded zombie classes counter

// For zombie classes file parsing
new Array:g_zclass2_realname, Array:g_zclass2_name, Array:g_zclass2_info,
Array:g_zclass2_modelsstart, Array:g_zclass2_modelsend, Array:g_zclass2_playermodel,
Array:g_zclass2_modelindex, Array:g_zclass2_clawmodel, Array:g_zclass2_hp,
Array:g_zclass2_spd, Array:g_zclass2_grav, Array:g_zclass2_kb, Array:g_zclass_new

// Customization vars
new g_access_flag[MAX_ACCESS_FLAGS], Array:model_nemesis, Array:model_survivor, Array:model_human,
Array:model_admin_zombie, Array:model_admin_human, Array:g_modelindex_human,
Array:g_modelindex_nemesis, Array:g_modelindex_survivor, g_same_models_for_all,
Array:g_modelindex_admin_zombie, Array:g_modelindex_admin_human, model_vknife_human[64],
model_vknife_nemesis[64], model_vweapon_survivor[64], model_grenade_infect[64],
model_grenade_fire[64], model_grenade_frost[64], model_grenade_flare[64],
model_vknife_admin_human[64], model_vknife_admin_zombie[64],
sprite_grenade_trail[64], sprite_grenade_ring[64], sprite_grenade_fire[64],
sprite_grenade_smoke[64], sprite_grenade_glass[64], Array:sound_win_zombies,
Array:sound_win_humans, Array:sound_win_no_one, Array:sound_win_zombies_ismp3,
Array:sound_win_humans_ismp3, Array:sound_win_no_one_ismp3, Array:zombie_infect,
Array:zombie_idle, Array:zombie_pain, Array:nemesis_pain, Array:zombie_die, Array:zombie_fall,
Array:zombie_miss_wall, Array:zombie_hit_normal, Array:zombie_hit_stab, g_ambience_rain,
Array:zombie_idle_last, Array:zombie_madness, Array:sound_nemesis, Array:sound_survivor,
Array:sound_swarm, Array:sound_multi, Array:sound_plague, Array:grenade_infect,
Array:grenade_infect_player, Array:grenade_fire, Array:grenade_fire_player,
Array:grenade_frost, Array:grenade_frost_player, Array:grenade_frost_break,
Array:grenade_flare, Array:sound_antidote, Array:sound_thunder, g_ambience_sounds[MAX_AMBIENCE_SOUNDS],
Array:sound_ambience1, Array:sound_ambience2, Array:sound_ambience3, Array:sound_ambience4,
Array:sound_ambience5, Array:sound_ambience1_duration, Array:sound_ambience2_duration,
Array:sound_ambience3_duration, Array:sound_ambience4_duration,
Array:sound_ambience5_duration, Array:sound_ambience1_ismp3, Array:sound_ambience2_ismp3,
Array:sound_ambience3_ismp3, Array:sound_ambience4_ismp3, Array:sound_ambience5_ismp3,
Array:g_primary_items, Array:g_secondary_items, Array:g_additional_items,
Array:g_primary_weaponids, Array:g_secondary_weaponids, Array:g_extraweapon_names,
Array:g_extraweapon_items, Array:g_extraweapon_costs, g_extra_costs2[EXTRA_WEAPONS_STARTID],
g_ambience_snow, g_ambience_fog, g_fog_density[10], g_fog_color[12], g_sky_enable,
Array:g_sky_names, Array:lights_thunder, Array:zombie_decals, Array:g_objective_ents,
Float:g_modelchange_delay, g_set_modelindex_offset, g_handle_models_on_separate_ent,
Float:kb_weapon_power[31] = { -1.0, ... }, Array:zombie_miss_slash, g_force_consistency,
Array:model_assassin, Array:model_sniper, Array:g_modelindex_assassin, Array:g_modelindex_sniper, model_vknife_assassin[64],
model_vawp_sniper[64], model_pawp_sniper[64], Array:assassin_pain, Array:sound_assassin, Array:sound_sniper, Array:sound_ambience6,
Array:sound_ambience6_duration, Array:sound_ambience6_ismp3, Array:sound_ambience7, Array:sound_ambience7_duration, Array:sound_ambience7_ismp3,
Array:sound_armageddon, Array:sound_apocalypse, Array:sound_ambience9, Array:sound_ambience9_duration, Array:sound_ambience9_ismp3, Array:sound_nightmare, Array:sound_ambience10, Array:sound_ambience10_duration, Array:sound_ambience10_ismp3,
Array:sound_ambience8_ismp3, Array:sound_ambience8, Array:sound_ambience8_duration


// CVAR pointers
new cvar_lighting, cvar_zombiefov, cvar_plague, cvar_plaguechance, cvar_zombiefirsthp,
cvar_removemoney, cvar_thunder, cvar_zombiebonushp, cvar_nemhp, cvar_nem, cvar_surv,
cvar_nemchance, cvar_deathmatch, cvar_nemglow, cvar_customnvg, cvar_hitzones, cvar_humanhp,
cvar_nemgravity, cvar_flashsize, cvar_ammodamage_human, cvar_ammodamage_zombie,
cvar_zombiearmor, cvar_survpainfree, cvar_nempainfree, cvar_nemspd, cvar_survchance,
cvar_survhp, cvar_survspd, cvar_humanspd, cvar_swarmchance, cvar_flashdrain,
cvar_zombiebleeding, cvar_removedoors, cvar_customflash, cvar_randspawn, cvar_multi,
cvar_multichance, cvar_infammo, cvar_swarm, cvar_ammoinfect, cvar_toggle,
cvar_knockbackpower, cvar_freezeduration, cvar_triggered, cvar_flashcharge,
cvar_firegrenades, cvar_frostgrenades, cvar_survgravity, cvar_logcommands, cvar_survglow,
cvar_humangravity, cvar_spawnprotection, cvar_nvgsize, cvar_flareduration, cvar_zclasses,
cvar_extraitems, cvar_showactivity, cvar_humanlasthp, cvar_nemignorefrags, cvar_warmup,
cvar_flashdist, cvar_flarecolor, cvar_survignorefrags, cvar_fireduration, cvar_firedamage,
cvar_flaregrenades, cvar_knockbackducking, cvar_knockbackdamage, cvar_knockbackzvel,
cvar_multiratio, cvar_flaresize, cvar_spawndelay, cvar_extraantidote, cvar_extramadness,
cvar_extraweapons, cvar_extranvision, cvar_nvggive, cvar_preventconsecutive, cvar_botquota,
cvar_buycustom, cvar_zombiepainfree, cvar_fireslowdown, cvar_survbasehp, cvar_survaura,
cvar_nemignoreammo, cvar_survignoreammo, cvar_nemaura, cvar_extrainfbomb, cvar_knockback,
cvar_fragsinfect, cvar_fragskill, cvar_humanarmor, cvar_zombiesilent, cvar_removedropped,
cvar_plagueratio, cvar_blocksuicide, cvar_knockbackdist, cvar_nemdamage, cvar_leapzombies,
cvar_leapzombiesforce, cvar_leapzombiesheight, cvar_leapzombiescooldown, cvar_leapnemesis,
cvar_leapnemesisforce, cvar_leapnemesisheight, cvar_leapnemesiscooldown, cvar_leapsurvivor,
cvar_leapsurvivorforce, cvar_leapsurvivorheight, cvar_nemminplayers, cvar_survminplayers,
cvar_respawnonsuicide, cvar_respawnafterlast, cvar_leapsurvivorcooldown, cvar_statssave,
cvar_swarmminplayers, cvar_multiminplayers, cvar_plagueminplayers, cvar_adminmodelshuman,
cvar_adminmodelszombie, cvar_nembasehp, cvar_blockpushables, cvar_respawnworldspawnkill,
cvar_madnessduration, cvar_plaguenemnum, cvar_plaguenemhpmulti, cvar_plaguesurvhpmulti,
cvar_plaguesurvnum, cvar_infectionscreenfade, cvar_infectionscreenshake,
cvar_infectionsparkle, cvar_infectiontracers, cvar_infectionparticles, cvar_infbomblimit,
cvar_allowrespawnsurv, cvar_flashshowall, cvar_allowrespawninfection, cvar_allowrespawnnem,
cvar_allowrespawnswarm, cvar_allowrespawnplague, cvar_survinfammo, cvar_nemknockback,
cvar_nvgcolor[3], cvar_nemnvgcolor[3], cvar_humnvgcolor[3], cvar_flashcolor[3],
cvar_hudicons, cvar_respawnzomb, cvar_respawnhum, cvar_respawnnem, cvar_respawnsurv,
cvar_startammopacks, cvar_randweapons, cvar_antidotelimit, cvar_madnesslimit,
cvar_adminknifemodelshuman, cvar_adminknifemodelszombie, cvar_keephealthondisconnect,
cvar_buyzonetime, cvar_huddisplay, cvar_leapsniper, cvar_leapsniperforce, cvar_leapsniperheight, 
cvar_leapsnipercooldown, cvar_sniminplayers, cvar_leapassassin, cvar_leapassassinforce, cvar_leapassassinheight, 
cvar_leapassassincooldown, cvar_sni, cvar_snipainfree, cvar_snichance, cvar_snihp, cvar_snispd,
cvar_snigravity, cvar_sniglow, cvar_assahp, cvar_assa, cvar_assachance, cvar_assagravity, cvar_assaglow, 
cvar_assapainfree, cvar_assaspd, cvar_assadamage, cvar_snibasehp, cvar_sniaura, cvar_assaminplayers,
cvar_assabasehp, cvar_allowrespawnassa, cvar_assaknockback, cvar_assanvgcolor[3], cvar_respawnassa, cvar_snidamage, cvar_allowrespawnsni, 
cvar_sniinfammo, cvar_respawnsni, cvar_assaaura, cvar_assaignoreammo, cvar_assaignorefrags, cvar_snipignorefrags, cvar_snipignoreammo,
cvar_armage, cvar_armagechance, cvar_armageminplayers, cvar_armageratio, cvar_armagenemhpmulti, cvar_armagesurvhpmulti, cvar_apoc, cvar_apocchance,
cvar_apocminplayers, cvar_apocratio, cvar_apocassahpmulti, cvar_apocsniphpmulti, cvar_night, cvar_nightchance, cvar_nightminplayers, cvar_nightratio,
cvar_nightassahpmulti, cvar_nightsniphpmulti, cvar_nightnemhpmulti, cvar_nightsurvhpmulti, cvar_allowrespawnarmage, cvar_allowrespawnapoc, cvar_allowrespawnnight, cvar_aiminfo, cvar_dmg_while_freeze

// Cached stuff for players
new g_isconnected[33] // whether player is connected
new g_isalive[33] // whether player is alive
new g_isbot[33] // whether player is a bot
new g_currentweapon[33] // player's current weapon id
new g_playername[33][32] // player's name
new Float:g_zombie_spd[33] // zombie class speed
new Float:g_zombie_knockback[33] // zombie class knockback
new g_zombie_classname[33][32] // zombie class name
#define is_user_valid_connected(%1) (1 <= %1 <= g_maxplayers && g_isconnected[%1])
#define is_user_valid_alive(%1) (1 <= %1 <= g_maxplayers && g_isalive[%1])
#define is_user_valid(%1) (1 <= %1 <= g_maxplayers)

// Cached CVARs
new g_cached_customflash, g_cached_zombiesilent, g_cached_leapzombies, g_cached_leapnemesis,
g_cached_leapsurvivor, Float:g_cached_leapzombiescooldown, Float:g_cached_leapnemesiscooldown, g_cached_leapassassin, Float:g_cached_leapassassincooldown,
Float:g_cached_leapsurvivorcooldown, Float:g_cached_buytime, g_cached_leapsniper, Float:g_cached_leapsnipercooldown


/*================================================================================
 [Natives, Precache and Init]
=================================================================================*/

public plugin_natives()
{
	// Player specific natives
	register_native("zp_get_user_zombie", "native_get_user_zombie", 1)
	register_native("zp_get_user_nemesis", "native_get_user_nemesis", 1)
	register_native("zp_get_user_assassin", "native_get_user_assassin", 1)
	register_native("zp_get_user_survivor", "native_get_user_survivor", 1)
	register_native("zp_get_user_sniper", "native_get_user_sniper", 1)
	register_native("zp_get_user_first_zombie", "native_get_user_first_zombie", 1)
	register_native("zp_get_user_last_zombie", "native_get_user_last_zombie", 1)
	register_native("zp_get_user_last_human", "native_get_user_last_human", 1)
	register_native("zp_get_user_zombie_class", "native_get_user_zombie_class", 1)
	register_native("zp_get_user_next_class", "native_get_user_next_class", 1)
	register_native("zp_set_user_zombie_class", "native_set_user_zombie_class", 1)
	register_native("zp_get_user_ammo_packs", "native_get_user_ammo_packs", 1)
	register_native("zp_set_user_ammo_packs", "native_set_user_ammo_packs", 1)
	register_native("zp_get_zombie_maxhealth", "native_get_zombie_maxhealth", 1)
	register_native("zp_get_user_batteries", "native_get_user_batteries", 1)
	register_native("zp_set_user_batteries", "native_set_user_batteries", 1)
	register_native("zp_get_user_nightvision", "native_get_user_nightvision", 1)
	register_native("zp_set_user_nightvision", "native_set_user_nightvision", 1)
	register_native("zp_infect_user", "native_infect_user", 1)
	register_native("zp_disinfect_user", "native_disinfect_user", 1)
	register_native("zp_make_user_nemesis", "native_make_user_nemesis", 1)
	register_native("zp_make_user_assassin", "native_make_user_assassin", 1)
	register_native("zp_make_user_survivor", "native_make_user_survivor", 1)
	register_native("zp_make_user_sniper", "native_make_user_sniper", 1)
	register_native("zp_respawn_user", "native_respawn_user", 1)
	register_native("zp_force_buy_extra_item", "native_force_buy_extra_item", 1)
	register_native("zp_override_user_model", "native_override_user_model", 1)
	
	// new natives
	register_native("zp_get_user_model", "native_get_user_model", 0)
	register_native("zp_set_user_model", "native_set_user_model", 1)
	
	// Round natives
	register_native("zp_has_round_started", "native_has_round_started", 1)
	register_native("zp_is_nemesis_round", "native_is_nemesis_round", 1)
	register_native("zp_is_assassin_round", "native_is_assassin_round", 1)
	register_native("zp_is_survivor_round", "native_is_survivor_round", 1)
	register_native("zp_is_sniper_round", "native_is_sniper_round", 1)
	register_native("zp_is_swarm_round", "native_is_swarm_round", 1)
	register_native("zp_is_plague_round", "native_is_plague_round", 1)
	register_native("zp_is_armageddon_round", "native_is_armageddon_round", 1)
	register_native("zp_is_apocalypse_round", "native_is_apocalypse_round", 1)
	register_native("zp_is_nightmare_round", "native_is_nightmare_round", 1)
	register_native("zp_get_zombie_count", "native_get_zombie_count", 1)
	register_native("zp_get_human_count", "native_get_human_count", 1)
	register_native("zp_get_nemesis_count", "native_get_nemesis_count", 1)
	register_native("zp_get_assassin_count", "native_get_assassin_count", 1)
	register_native("zp_get_survivor_count", "native_get_survivor_count", 1)
	register_native("zp_get_sniper_count", "native_get_sniper_count", 1)
	
	// External additions natives
	register_native("zp_register_extra_item", "native_register_extra_item", 1)
	register_native("zp_register_zombie_class", "native_register_zombie_class", 1)
	register_native("zp_get_extra_item_id", "native_get_extra_item_id", 1)
	register_native("zp_get_zombie_class_id", "native_get_zombie_class_id", 1)
	register_native("zp_get_zombie_class_info", "native_get_zombie_class_info", 1)
}

public plugin_precache()
{
	// Register earlier to show up in plugins list properly after plugin disable/error at loading
	register_plugin("Zombie Plague", PLUGIN_VERSION, "MeRcyLeZZ")
	
	// To switch plugin on/off
	register_concmd("zp_toggle", "cmd_toggle", _, "<1/0> - Enable/Disable Zombie Plague (will restart the current map)", 0)
	cvar_toggle = register_cvar("zp_on", "1")
	
	// Plugin disabled?
	if (!get_pcvar_num(cvar_toggle)) return;
	g_pluginenabled = true
	
	// Initialize a few dynamically sized arrays (alright, maybe more than just a few...)
	model_human = ArrayCreate(32, 1)
	model_nemesis = ArrayCreate(32, 1)
	model_assassin = ArrayCreate(32, 1)
	model_survivor = ArrayCreate(32, 1)
	model_sniper = ArrayCreate(32, 1)
	model_admin_human = ArrayCreate(32, 1)
	model_admin_zombie = ArrayCreate(32, 1)
	g_modelindex_human = ArrayCreate(1, 1)
	g_modelindex_nemesis = ArrayCreate(1, 1)
	g_modelindex_assassin = ArrayCreate(1, 1)
	g_modelindex_survivor = ArrayCreate(1, 1)
	g_modelindex_sniper = ArrayCreate(1, 1)
	g_modelindex_admin_human = ArrayCreate(1, 1)
	g_modelindex_admin_zombie = ArrayCreate(1, 1)
	sound_win_zombies = ArrayCreate(64, 1)
	sound_win_zombies_ismp3 = ArrayCreate(1, 1)
	sound_win_humans = ArrayCreate(64, 1)
	sound_win_humans_ismp3 = ArrayCreate(1, 1)
	sound_win_no_one = ArrayCreate(64, 1)
	sound_win_no_one_ismp3 = ArrayCreate(1, 1)
	zombie_infect = ArrayCreate(64, 1)
	zombie_pain = ArrayCreate(64, 1)
	nemesis_pain = ArrayCreate(64, 1)
	assassin_pain = ArrayCreate(64, 1)
	zombie_die = ArrayCreate(64, 1)
	zombie_fall = ArrayCreate(64, 1)
	zombie_miss_slash = ArrayCreate(64, 1)
	zombie_miss_wall = ArrayCreate(64, 1)
	zombie_hit_normal = ArrayCreate(64, 1)
	zombie_hit_stab = ArrayCreate(64, 1)
	zombie_idle = ArrayCreate(64, 1)
	zombie_idle_last = ArrayCreate(64, 1)
	zombie_madness = ArrayCreate(64, 1)
	sound_nemesis = ArrayCreate(64, 1)
	sound_assassin = ArrayCreate(64, 1)
	sound_survivor = ArrayCreate(64, 1)
	sound_sniper = ArrayCreate(64, 1)
	sound_swarm = ArrayCreate(64, 1)
	sound_multi = ArrayCreate(64, 1)
	sound_plague = ArrayCreate(64, 1)
	sound_armageddon = ArrayCreate(64, 1)
	sound_apocalypse = ArrayCreate(64, 1)
	sound_nightmare = ArrayCreate(64, 1)
	grenade_infect = ArrayCreate(64, 1)
	grenade_infect_player = ArrayCreate(64, 1)
	grenade_fire = ArrayCreate(64, 1)
	grenade_fire_player = ArrayCreate(64, 1)
	grenade_frost = ArrayCreate(64, 1)
	grenade_frost_player = ArrayCreate(64, 1)
	grenade_frost_break = ArrayCreate(64, 1)
	grenade_flare = ArrayCreate(64, 1)
	sound_antidote = ArrayCreate(64, 1)
	sound_thunder = ArrayCreate(64, 1)
	sound_ambience1 = ArrayCreate(64, 1)
	sound_ambience2 = ArrayCreate(64, 1)
	sound_ambience3 = ArrayCreate(64, 1)
	sound_ambience4 = ArrayCreate(64, 1)
	sound_ambience5 = ArrayCreate(64, 1)
	sound_ambience6 = ArrayCreate(64, 1)
	sound_ambience7 = ArrayCreate(64, 1)
	sound_ambience8 = ArrayCreate(64, 1)
	sound_ambience9 = ArrayCreate(64, 1)
	sound_ambience10 = ArrayCreate(64, 1)
	sound_ambience1_duration = ArrayCreate(1, 1)
	sound_ambience2_duration = ArrayCreate(1, 1)
	sound_ambience3_duration = ArrayCreate(1, 1)
	sound_ambience4_duration = ArrayCreate(1, 1)
	sound_ambience5_duration = ArrayCreate(1, 1)
	sound_ambience6_duration = ArrayCreate(1, 1)
	sound_ambience7_duration = ArrayCreate(1, 1)
	sound_ambience8_duration = ArrayCreate(1, 1)
	sound_ambience9_duration = ArrayCreate(1, 1)
	sound_ambience10_duration = ArrayCreate(1, 1)
	sound_ambience1_ismp3 = ArrayCreate(1, 1)
	sound_ambience2_ismp3 = ArrayCreate(1, 1)
	sound_ambience3_ismp3 = ArrayCreate(1, 1)
	sound_ambience4_ismp3 = ArrayCreate(1, 1)
	sound_ambience5_ismp3 = ArrayCreate(1, 1)
	sound_ambience6_ismp3 = ArrayCreate(1, 1)
	sound_ambience7_ismp3 = ArrayCreate(1, 1)
	sound_ambience8_ismp3 = ArrayCreate(1, 1)
	sound_ambience9_ismp3 = ArrayCreate(1, 1)
	sound_ambience10_ismp3 = ArrayCreate(1, 1)
	g_primary_items = ArrayCreate(32, 1)
	g_secondary_items = ArrayCreate(32, 1)
	g_additional_items = ArrayCreate(32, 1)
	g_primary_weaponids = ArrayCreate(1, 1)
	g_secondary_weaponids = ArrayCreate(1, 1)
	g_extraweapon_names = ArrayCreate(32, 1)
	g_extraweapon_items = ArrayCreate(32, 1)
	g_extraweapon_costs = ArrayCreate(1, 1)
	g_sky_names = ArrayCreate(32, 1)
	lights_thunder = ArrayCreate(32, 1)
	zombie_decals = ArrayCreate(1, 1)
	g_objective_ents = ArrayCreate(32, 1)
	g_extraitem_name = ArrayCreate(32, 1)
	g_extraitem_cost = ArrayCreate(1, 1)
	g_extraitem_team = ArrayCreate(1, 1)
	g_extraitem2_realname = ArrayCreate(32, 1)
	g_extraitem2_name = ArrayCreate(32, 1)
	g_extraitem2_cost = ArrayCreate(1, 1)
	g_extraitem2_team = ArrayCreate(1, 1)
	g_extraitem_new = ArrayCreate(1, 1)
	g_zclass_name = ArrayCreate(32, 1)
	g_zclass_info = ArrayCreate(32, 1)
	g_zclass_modelsstart = ArrayCreate(1, 1)
	g_zclass_modelsend = ArrayCreate(1, 1)
	g_zclass_playermodel = ArrayCreate(32, 1)
	g_zclass_modelindex = ArrayCreate(1, 1)
	g_zclass_clawmodel = ArrayCreate(32, 1)
	g_zclass_hp = ArrayCreate(1, 1)
	g_zclass_spd = ArrayCreate(1, 1)
	g_zclass_grav = ArrayCreate(1, 1)
	g_zclass_kb = ArrayCreate(1, 1)
	g_zclass2_realname = ArrayCreate(32, 1)
	g_zclass2_name = ArrayCreate(32, 1)
	g_zclass2_info = ArrayCreate(32, 1)
	g_zclass2_modelsstart = ArrayCreate(1, 1)
	g_zclass2_modelsend = ArrayCreate(1, 1)
	g_zclass2_playermodel = ArrayCreate(32, 1)
	g_zclass2_modelindex = ArrayCreate(1, 1)
	g_zclass2_clawmodel = ArrayCreate(32, 1)
	g_zclass2_hp = ArrayCreate(1, 1)
	g_zclass2_spd = ArrayCreate(1, 1)
	g_zclass2_grav = ArrayCreate(1, 1)
	g_zclass2_kb = ArrayCreate(1, 1)
	g_zclass_new = ArrayCreate(1, 1)
	
	// Allow registering stuff now
	g_arrays_created = true
	
	// Load customization data
	load_customization_from_files()
	
	new i, buffer[100]
	
	// Load up the hard coded extra items
	native_register_extra_item2("NightVision", g_extra_costs2[EXTRA_NVISION], ZP_TEAM_HUMAN)
	native_register_extra_item2("T-Virus Antidote", g_extra_costs2[EXTRA_ANTIDOTE], ZP_TEAM_ZOMBIE)
	native_register_extra_item2("Zombie Madness", g_extra_costs2[EXTRA_MADNESS], ZP_TEAM_ZOMBIE)
	native_register_extra_item2("Infection Bomb", g_extra_costs2[EXTRA_INFBOMB], ZP_TEAM_ZOMBIE)
	
	// Extra weapons
	for (i = 0; i < ArraySize(g_extraweapon_names); i++)
	{
		ArrayGetString(g_extraweapon_names, i, buffer, charsmax(buffer))
		native_register_extra_item2(buffer, ArrayGetCell(g_extraweapon_costs, i), ZP_TEAM_HUMAN)
	}
	
	// Custom player models
	for (i = 0; i < ArraySize(model_human); i++)
	{
		ArrayGetString(model_human, i, buffer, charsmax(buffer))
		format(buffer, charsmax(buffer), "models/player/%s/%s.mdl", buffer, buffer)
		ArrayPushCell(g_modelindex_human, engfunc(EngFunc_PrecacheModel, buffer))
		if (g_force_consistency == 1) force_unmodified(force_model_samebounds, {0,0,0}, {0,0,0}, buffer)
		if (g_force_consistency == 2) force_unmodified(force_exactfile, {0,0,0}, {0,0,0}, buffer)
		// Precache modelT.mdl files too
		copy(buffer[strlen(buffer)-4], charsmax(buffer) - (strlen(buffer)-4), "T.mdl")
		if (file_exists(buffer)) engfunc(EngFunc_PrecacheModel, buffer)
	}
	for (i = 0; i < ArraySize(model_nemesis); i++)
	{
		ArrayGetString(model_nemesis, i, buffer, charsmax(buffer))
		format(buffer, charsmax(buffer), "models/player/%s/%s.mdl", buffer, buffer)
		ArrayPushCell(g_modelindex_nemesis, engfunc(EngFunc_PrecacheModel, buffer))
		if (g_force_consistency == 1) force_unmodified(force_model_samebounds, {0,0,0}, {0,0,0}, buffer)
		if (g_force_consistency == 2) force_unmodified(force_exactfile, {0,0,0}, {0,0,0}, buffer)
		// Precache modelT.mdl files too
		copy(buffer[strlen(buffer)-4], charsmax(buffer) - (strlen(buffer)-4), "T.mdl")
		if (file_exists(buffer)) engfunc(EngFunc_PrecacheModel, buffer)
	}
	for (i = 0; i < ArraySize(model_assassin); i++)
	{
		ArrayGetString(model_assassin, i, buffer, charsmax(buffer))
		format(buffer, charsmax(buffer), "models/player/%s/%s.mdl", buffer, buffer)
		ArrayPushCell(g_modelindex_assassin, engfunc(EngFunc_PrecacheModel, buffer))
		if (g_force_consistency == 1) force_unmodified(force_model_samebounds, {0,0,0}, {0,0,0}, buffer)
		if (g_force_consistency == 2) force_unmodified(force_exactfile, {0,0,0}, {0,0,0}, buffer)
	}
	for (i = 0; i < ArraySize(model_survivor); i++)
	{
		ArrayGetString(model_survivor, i, buffer, charsmax(buffer))
		format(buffer, charsmax(buffer), "models/player/%s/%s.mdl", buffer, buffer)
		ArrayPushCell(g_modelindex_survivor, engfunc(EngFunc_PrecacheModel, buffer))
		if (g_force_consistency == 1) force_unmodified(force_model_samebounds, {0,0,0}, {0,0,0}, buffer)
		if (g_force_consistency == 2) force_unmodified(force_exactfile, {0,0,0}, {0,0,0}, buffer)
		// Precache modelT.mdl files too
		copy(buffer[strlen(buffer)-4], charsmax(buffer) - (strlen(buffer)-4), "T.mdl")
		if (file_exists(buffer)) engfunc(EngFunc_PrecacheModel, buffer)
	}
	for (i = 0; i < ArraySize(model_sniper); i++)
	{
		ArrayGetString(model_sniper, i, buffer, charsmax(buffer))
		format(buffer, charsmax(buffer), "models/player/%s/%s.mdl", buffer, buffer)
		ArrayPushCell(g_modelindex_sniper, engfunc(EngFunc_PrecacheModel, buffer))
		if (g_force_consistency == 1) force_unmodified(force_model_samebounds, {0,0,0}, {0,0,0}, buffer)
		if (g_force_consistency == 2) force_unmodified(force_exactfile, {0,0,0}, {0,0,0}, buffer)
	}
	for (i = 0; i < ArraySize(model_admin_zombie); i++)
	{
		ArrayGetString(model_admin_zombie, i, buffer, charsmax(buffer))
		format(buffer, charsmax(buffer), "models/player/%s/%s.mdl", buffer, buffer)
		ArrayPushCell(g_modelindex_admin_zombie, engfunc(EngFunc_PrecacheModel, buffer))
		if (g_force_consistency == 1) force_unmodified(force_model_samebounds, {0,0,0}, {0,0,0}, buffer)
		if (g_force_consistency == 2) force_unmodified(force_exactfile, {0,0,0}, {0,0,0}, buffer)
		// Precache modelT.mdl files too
		copy(buffer[strlen(buffer)-4], charsmax(buffer) - (strlen(buffer)-4), "T.mdl")
		if (file_exists(buffer)) engfunc(EngFunc_PrecacheModel, buffer)
	}
	for (i = 0; i < ArraySize(model_admin_human); i++)
	{
		ArrayGetString(model_admin_human, i, buffer, charsmax(buffer))
		format(buffer, charsmax(buffer), "models/player/%s/%s.mdl", buffer, buffer)
		ArrayPushCell(g_modelindex_admin_human, engfunc(EngFunc_PrecacheModel, buffer))
		if (g_force_consistency == 1) force_unmodified(force_model_samebounds, {0,0,0}, {0,0,0}, buffer)
		if (g_force_consistency == 2) force_unmodified(force_exactfile, {0,0,0}, {0,0,0}, buffer)
		// Precache modelT.mdl files too
		copy(buffer[strlen(buffer)-4], charsmax(buffer) - (strlen(buffer)-4), "T.mdl")
		if (file_exists(buffer)) engfunc(EngFunc_PrecacheModel, buffer)
	}
	
	// Custom weapon models
	engfunc(EngFunc_PrecacheModel, model_vknife_human)
	engfunc(EngFunc_PrecacheModel, model_vknife_nemesis)
	engfunc(EngFunc_PrecacheModel, model_vknife_assassin)
	engfunc(EngFunc_PrecacheModel, model_vweapon_survivor)
	engfunc(EngFunc_PrecacheModel, model_vawp_sniper)
	engfunc(EngFunc_PrecacheModel, model_pawp_sniper)
	engfunc(EngFunc_PrecacheModel, model_grenade_infect)
	engfunc(EngFunc_PrecacheModel, model_grenade_fire)
	engfunc(EngFunc_PrecacheModel, model_grenade_frost)
	engfunc(EngFunc_PrecacheModel, model_grenade_flare)
	engfunc(EngFunc_PrecacheModel, model_vknife_admin_human)
	engfunc(EngFunc_PrecacheModel, model_vknife_admin_zombie)
	
	// Custom sprites for grenades
	g_trailSpr = engfunc(EngFunc_PrecacheModel, sprite_grenade_trail)
	g_exploSpr = engfunc(EngFunc_PrecacheModel, sprite_grenade_ring)
	g_flameSpr = engfunc(EngFunc_PrecacheModel, sprite_grenade_fire)
	g_smokeSpr = engfunc(EngFunc_PrecacheModel, sprite_grenade_smoke)
	g_glassSpr = engfunc(EngFunc_PrecacheModel, sprite_grenade_glass)
	
	// Custom sounds
	for (i = 0; i < ArraySize(sound_win_zombies); i++)
	{
		ArrayGetString(sound_win_zombies, i, buffer, charsmax(buffer))
		if (ArrayGetCell(sound_win_zombies_ismp3, i))
		{
			format(buffer, charsmax(buffer), "sound/%s", buffer)
			engfunc(EngFunc_PrecacheGeneric, buffer)
		}
		else
		{
			engfunc(EngFunc_PrecacheSound, buffer)
		}
	}
	for (i = 0; i < ArraySize(sound_win_humans); i++)
	{
		ArrayGetString(sound_win_humans, i, buffer, charsmax(buffer))
		if (ArrayGetCell(sound_win_humans_ismp3, i))
		{
			format(buffer, charsmax(buffer), "sound/%s", buffer)
			engfunc(EngFunc_PrecacheGeneric, buffer)
		}
		else
		{
			engfunc(EngFunc_PrecacheSound, buffer)
		}
	}
	for (i = 0; i < ArraySize(sound_win_no_one); i++)
	{
		ArrayGetString(sound_win_no_one, i, buffer, charsmax(buffer))
		if (ArrayGetCell(sound_win_no_one_ismp3, i))
		{
			format(buffer, charsmax(buffer), "sound/%s", buffer)
			engfunc(EngFunc_PrecacheGeneric, buffer)
		}
		else
		{
			engfunc(EngFunc_PrecacheSound, buffer)
		}
	}
	for (i = 0; i < ArraySize(zombie_infect); i++)
	{
		ArrayGetString(zombie_infect, i, buffer, charsmax(buffer))
		engfunc(EngFunc_PrecacheSound, buffer)
	}
	for (i = 0; i < ArraySize(zombie_pain); i++)
	{
		ArrayGetString(zombie_pain, i, buffer, charsmax(buffer))
		engfunc(EngFunc_PrecacheSound, buffer)
	}
	for (i = 0; i < ArraySize(nemesis_pain); i++)
	{
		ArrayGetString(nemesis_pain, i, buffer, charsmax(buffer))
		engfunc(EngFunc_PrecacheSound, buffer)
	}
	for (i = 0; i < ArraySize(assassin_pain); i++)
	{
		ArrayGetString(assassin_pain, i, buffer, charsmax(buffer))
		engfunc(EngFunc_PrecacheSound, buffer)
	}
	for (i = 0; i < ArraySize(zombie_die); i++)
	{
		ArrayGetString(zombie_die, i, buffer, charsmax(buffer))
		engfunc(EngFunc_PrecacheSound, buffer)
	}
	for (i = 0; i < ArraySize(zombie_fall); i++)
	{
		ArrayGetString(zombie_fall, i, buffer, charsmax(buffer))
		engfunc(EngFunc_PrecacheSound, buffer)
	}
	for (i = 0; i < ArraySize(zombie_miss_slash); i++)
	{
		ArrayGetString(zombie_miss_slash, i, buffer, charsmax(buffer))
		engfunc(EngFunc_PrecacheSound, buffer)
	}
	for (i = 0; i < ArraySize(zombie_miss_wall); i++)
	{
		ArrayGetString(zombie_miss_wall, i, buffer, charsmax(buffer))
		engfunc(EngFunc_PrecacheSound, buffer)
	}
	for (i = 0; i < ArraySize(zombie_hit_normal); i++)
	{
		ArrayGetString(zombie_hit_normal, i, buffer, charsmax(buffer))
		engfunc(EngFunc_PrecacheSound, buffer)
	}
	for (i = 0; i < ArraySize(zombie_hit_stab); i++)
	{
		ArrayGetString(zombie_hit_stab, i, buffer, charsmax(buffer))
		engfunc(EngFunc_PrecacheSound, buffer)
	}
	for (i = 0; i < ArraySize(zombie_idle); i++)
	{
		ArrayGetString(zombie_idle, i, buffer, charsmax(buffer))
		engfunc(EngFunc_PrecacheSound, buffer)
	}
	for (i = 0; i < ArraySize(zombie_idle_last); i++)
	{
		ArrayGetString(zombie_idle_last, i, buffer, charsmax(buffer))
		engfunc(EngFunc_PrecacheSound, buffer)
	}
	for (i = 0; i < ArraySize(zombie_madness); i++)
	{
		ArrayGetString(zombie_madness, i, buffer, charsmax(buffer))
		engfunc(EngFunc_PrecacheSound, buffer)
	}
	for (i = 0; i < ArraySize(sound_nemesis); i++)
	{
		ArrayGetString(sound_nemesis, i, buffer, charsmax(buffer))
		engfunc(EngFunc_PrecacheSound, buffer)
	}
	for (i = 0; i < ArraySize(sound_assassin); i++)
	{
		ArrayGetString(sound_assassin, i, buffer, charsmax(buffer))
		engfunc(EngFunc_PrecacheSound, buffer)
	}
	for (i = 0; i < ArraySize(sound_survivor); i++)
	{
		ArrayGetString(sound_survivor, i, buffer, charsmax(buffer))
		engfunc(EngFunc_PrecacheSound, buffer)
	}
	for (i = 0; i < ArraySize(sound_sniper); i++)
	{
		ArrayGetString(sound_sniper, i, buffer, charsmax(buffer))
		engfunc(EngFunc_PrecacheSound, buffer)
	}
	for (i = 0; i < ArraySize(sound_swarm); i++)
	{
		ArrayGetString(sound_swarm, i, buffer, charsmax(buffer))
		engfunc(EngFunc_PrecacheSound, buffer)
	}
	for (i = 0; i < ArraySize(sound_multi); i++)
	{
		ArrayGetString(sound_multi, i, buffer, charsmax(buffer))
		engfunc(EngFunc_PrecacheSound, buffer)
	}
	for (i = 0; i < ArraySize(sound_plague); i++)
	{
		ArrayGetString(sound_plague, i, buffer, charsmax(buffer))
		engfunc(EngFunc_PrecacheSound, buffer)
	}
	for (i = 0; i < ArraySize(sound_armageddon); i++)
	{
		ArrayGetString(sound_armageddon, i, buffer, charsmax(buffer))
		engfunc(EngFunc_PrecacheSound, buffer)
	}
	for (i = 0; i < ArraySize(sound_apocalypse); i++)
	{
		ArrayGetString(sound_apocalypse, i, buffer, charsmax(buffer))
		engfunc(EngFunc_PrecacheSound, buffer)
	}
	for (i = 0; i < ArraySize(sound_nightmare); i++)
	{
		ArrayGetString(sound_nightmare, i, buffer, charsmax(buffer))
		engfunc(EngFunc_PrecacheSound, buffer)
	}
	for (i = 0; i < ArraySize(grenade_infect); i++)
	{
		ArrayGetString(grenade_infect, i, buffer, charsmax(buffer))
		engfunc(EngFunc_PrecacheSound, buffer)
	}
	for (i = 0; i < ArraySize(grenade_infect_player); i++)
	{
		ArrayGetString(grenade_infect_player, i, buffer, charsmax(buffer))
		engfunc(EngFunc_PrecacheSound, buffer)
	}
	for (i = 0; i < ArraySize(grenade_fire); i++)
	{
		ArrayGetString(grenade_fire, i, buffer, charsmax(buffer))
		engfunc(EngFunc_PrecacheSound, buffer)
	}
	for (i = 0; i < ArraySize(grenade_fire_player); i++)
	{
		ArrayGetString(grenade_fire_player, i, buffer, charsmax(buffer))
		engfunc(EngFunc_PrecacheSound, buffer)
	}
	for (i = 0; i < ArraySize(grenade_frost); i++)
	{
		ArrayGetString(grenade_frost, i, buffer, charsmax(buffer))
		engfunc(EngFunc_PrecacheSound, buffer)
	}
	for (i = 0; i < ArraySize(grenade_frost_player); i++)
	{
		ArrayGetString(grenade_frost_player, i, buffer, charsmax(buffer))
		engfunc(EngFunc_PrecacheSound, buffer)
	}
	for (i = 0; i < ArraySize(grenade_frost_break); i++)
	{
		ArrayGetString(grenade_frost_break, i, buffer, charsmax(buffer))
		engfunc(EngFunc_PrecacheSound, buffer)
	}
	for (i = 0; i < ArraySize(grenade_flare); i++)
	{
		ArrayGetString(grenade_flare, i, buffer, charsmax(buffer))
		engfunc(EngFunc_PrecacheSound, buffer)
	}
	for (i = 0; i < ArraySize(sound_antidote); i++)
	{
		ArrayGetString(sound_antidote, i, buffer, charsmax(buffer))
		engfunc(EngFunc_PrecacheSound, buffer)
	}
	for (i = 0; i < ArraySize(sound_thunder); i++)
	{
		ArrayGetString(sound_thunder, i, buffer, charsmax(buffer))
		engfunc(EngFunc_PrecacheSound, buffer)
	}
	
	// Ambience Sounds
	if (g_ambience_sounds[AMBIENCE_SOUNDS_INFECTION])
	{
		for (i = 0; i < ArraySize(sound_ambience1); i++)
		{
			ArrayGetString(sound_ambience1, i, buffer, charsmax(buffer))
			
			if (ArrayGetCell(sound_ambience1_ismp3, i))
			{
				format(buffer, charsmax(buffer), "sound/%s", buffer)
				engfunc(EngFunc_PrecacheGeneric, buffer)
			}
			else
			{
				engfunc(EngFunc_PrecacheSound, buffer)
			}
		}
	}
	if (g_ambience_sounds[AMBIENCE_SOUNDS_NEMESIS])
	{
		for (i = 0; i < ArraySize(sound_ambience2); i++)
		{
			ArrayGetString(sound_ambience2, i, buffer, charsmax(buffer))
			
			if (ArrayGetCell(sound_ambience2_ismp3, i))
			{
				format(buffer, charsmax(buffer), "sound/%s", buffer)
				engfunc(EngFunc_PrecacheGeneric, buffer)
			}
			else
			{
				engfunc(EngFunc_PrecacheSound, buffer)
			}
		}
	}
	if (g_ambience_sounds[AMBIENCE_SOUNDS_ASSASSIN])
	{
		for (i = 0; i < ArraySize(sound_ambience6); i++)
		{
			ArrayGetString(sound_ambience6, i, buffer, charsmax(buffer))
			
			if (ArrayGetCell(sound_ambience6_ismp3, i))
			{
				format(buffer, charsmax(buffer), "sound/%s", buffer)
				engfunc(EngFunc_PrecacheGeneric, buffer)
			}
			else
			{
				engfunc(EngFunc_PrecacheSound, buffer)
			}
		}
	}
	if (g_ambience_sounds[AMBIENCE_SOUNDS_SURVIVOR])
	{
		for (i = 0; i < ArraySize(sound_ambience3); i++)
		{
			ArrayGetString(sound_ambience3, i, buffer, charsmax(buffer))
			
			if (ArrayGetCell(sound_ambience3_ismp3, i))
			{
				format(buffer, charsmax(buffer), "sound/%s", buffer)
				engfunc(EngFunc_PrecacheGeneric, buffer)
			}
			else
			{
				engfunc(EngFunc_PrecacheSound, buffer)
			}
		}
	}
	if (g_ambience_sounds[AMBIENCE_SOUNDS_SNIPER])
	{
		for (i = 0; i < ArraySize(sound_ambience5); i++)
		{
			ArrayGetString(sound_ambience5, i, buffer, charsmax(buffer))
			
			if (ArrayGetCell(sound_ambience5_ismp3, i))
			{
				format(buffer, charsmax(buffer), "sound/%s", buffer)
				engfunc(EngFunc_PrecacheGeneric, buffer)
			}
			else
			{
				engfunc(EngFunc_PrecacheSound, buffer)
			}
		}
	}
	if (g_ambience_sounds[AMBIENCE_SOUNDS_SWARM])
	{
		for (i = 0; i < ArraySize(sound_ambience4); i++)
		{
			ArrayGetString(sound_ambience4, i, buffer, charsmax(buffer))
			
			if (ArrayGetCell(sound_ambience4_ismp3, i))
			{
				format(buffer, charsmax(buffer), "sound/%s", buffer)
				engfunc(EngFunc_PrecacheGeneric, buffer)
			}
			else
			{
				engfunc(EngFunc_PrecacheSound, buffer)
			}
		}
	}
	if (g_ambience_sounds[AMBIENCE_SOUNDS_PLAGUE])
	{
		for (i = 0; i < ArraySize(sound_ambience5); i++)
		{
			ArrayGetString(sound_ambience5, i, buffer, charsmax(buffer))
			
			if (ArrayGetCell(sound_ambience5_ismp3, i))
			{
				format(buffer, charsmax(buffer), "sound/%s", buffer)
				engfunc(EngFunc_PrecacheGeneric, buffer)
			}
			else
			{
				engfunc(EngFunc_PrecacheSound, buffer)
			}
		}
	}
	if (g_ambience_sounds[AMBIENCE_SOUNDS_ARMAGEDDON])
	{
		for (i = 0; i < ArraySize(sound_ambience8); i++)
		{
			ArrayGetString(sound_ambience8, i, buffer, charsmax(buffer))
			
			if (ArrayGetCell(sound_ambience8_ismp3, i))
			{
				format(buffer, charsmax(buffer), "sound/%s", buffer)
				engfunc(EngFunc_PrecacheGeneric, buffer)
			}
			else
			{
				engfunc(EngFunc_PrecacheSound, buffer)
			}
		}
	}
	if (g_ambience_sounds[AMBIENCE_SOUNDS_APOCALYPSE])
	{
		for (i = 0; i < ArraySize(sound_ambience9); i++)
		{
			ArrayGetString(sound_ambience9, i, buffer, charsmax(buffer))
			
			if (ArrayGetCell(sound_ambience9_ismp3, i))
			{
				format(buffer, charsmax(buffer), "sound/%s", buffer)
				engfunc(EngFunc_PrecacheGeneric, buffer)
			}
			else
			{
				engfunc(EngFunc_PrecacheSound, buffer)
			}
		}
	}
	if (g_ambience_sounds[AMBIENCE_SOUNDS_NIGHTMARE])
	{
		for (i = 0; i < ArraySize(sound_ambience10); i++)
		{
			ArrayGetString(sound_ambience10, i, buffer, charsmax(buffer))
			
			if (ArrayGetCell(sound_ambience10_ismp3, i))
			{
				format(buffer, charsmax(buffer), "sound/%s", buffer)
				engfunc(EngFunc_PrecacheGeneric, buffer)
			}
			else
			{
				engfunc(EngFunc_PrecacheSound, buffer)
			}
		}
	}
	
	// CS sounds (just in case)
	engfunc(EngFunc_PrecacheSound, sound_flashlight)
	engfunc(EngFunc_PrecacheSound, sound_buyammo)
	engfunc(EngFunc_PrecacheSound, sound_armorhit)
	
	new ent
	
	// Fake Hostage (to force round ending)
	ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "hostage_entity"))
	if (pev_valid(ent))
	{
		engfunc(EngFunc_SetOrigin, ent, Float:{8192.0,8192.0,8192.0})
		dllfunc(DLLFunc_Spawn, ent)
	}
	
	// Weather/ambience effects
	if (g_ambience_fog)
	{
		ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "env_fog"))
		if (pev_valid(ent))
		{
			fm_set_kvd(ent, "density", g_fog_density, "env_fog")
			fm_set_kvd(ent, "rendercolor", g_fog_color, "env_fog")
		}
	}
	if (g_ambience_rain) engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "env_rain"))
	if (g_ambience_snow) engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "env_snow"))
	
	// Custom buyzone for all players
	g_buyzone_ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "func_buyzone"))
	if (pev_valid(g_buyzone_ent))
	{
		dllfunc(DLLFunc_Spawn, g_buyzone_ent)
		set_pev(g_buyzone_ent, pev_solid, SOLID_NOT)
	}
	
	// Prevent some entities from spawning
	g_fwSpawn = register_forward(FM_Spawn, "fw_Spawn")
	
	// Prevent hostage sounds from being precached
	g_fwPrecacheSound = register_forward(FM_PrecacheSound, "fw_PrecacheSound")
}

public plugin_init()
{
	// Plugin disabled?
	if (!g_pluginenabled) return;
	
	// No zombie classes?
	if (!g_zclass_i) set_fail_state("No zombie classes loaded!")
	
	// Language files
	register_dictionary("zombie_plague.txt")
	
	// Events
	register_event("HLTV", "event_round_start", "a", "1=0", "2=0")
	register_event("StatusValue", "event_show_status", "be", "1=2", "2!0")
	register_event("StatusValue", "event_hide_status", "be", "1=1", "2=0")
	register_logevent("logevent_round_start",2, "1=Round_Start")
	register_logevent("logevent_round_end", 2, "1=Round_End")
	register_event("AmmoX", "event_ammo_x", "be")
	if (g_ambience_sounds[AMBIENCE_SOUNDS_INFECTION] || g_ambience_sounds[AMBIENCE_SOUNDS_NEMESIS] || g_ambience_sounds[AMBIENCE_SOUNDS_ASSASSIN] || g_ambience_sounds[AMBIENCE_SOUNDS_SURVIVOR] || g_ambience_sounds[AMBIENCE_SOUNDS_SNIPER]
	|| g_ambience_sounds[AMBIENCE_SOUNDS_SWARM] || g_ambience_sounds[AMBIENCE_SOUNDS_PLAGUE] || g_ambience_sounds[AMBIENCE_SOUNDS_ARMAGEDDON] || g_ambience_sounds[AMBIENCE_SOUNDS_APOCALYPSE] || g_ambience_sounds[AMBIENCE_SOUNDS_NIGHTMARE])
		register_event("30", "event_intermission", "a")
	
	// HAM Forwards
	RegisterHam(Ham_Spawn, "player", "fw_PlayerSpawn_Post", 1)
	RegisterHam(Ham_Killed, "player", "fw_PlayerKilled")
	RegisterHam(Ham_Killed, "player", "fw_PlayerKilled_Post", 1)
	RegisterHam(Ham_TakeDamage, "player", "fw_TakeDamage")
	RegisterHam(Ham_TakeDamage, "player", "fw_TakeDamage_Post", 1)
	RegisterHam(Ham_TraceAttack, "player", "fw_TraceAttack")
	RegisterHam(Ham_Player_ResetMaxSpeed, "player", "fw_ResetMaxSpeed_Post", 1)
	RegisterHam(Ham_Use, "func_tank", "fw_UseStationary")
	RegisterHam(Ham_Use, "func_tankmortar", "fw_UseStationary")
	RegisterHam(Ham_Use, "func_tankrocket", "fw_UseStationary")
	RegisterHam(Ham_Use, "func_tanklaser", "fw_UseStationary")
	RegisterHam(Ham_Use, "func_tank", "fw_UseStationary_Post", 1)
	RegisterHam(Ham_Use, "func_tankmortar", "fw_UseStationary_Post", 1)
	RegisterHam(Ham_Use, "func_tankrocket", "fw_UseStationary_Post", 1)
	RegisterHam(Ham_Use, "func_tanklaser", "fw_UseStationary_Post", 1)
	RegisterHam(Ham_Use, "func_pushable", "fw_UsePushable")
	RegisterHam(Ham_Touch, "weaponbox", "fw_TouchWeapon")
	RegisterHam(Ham_Touch, "armoury_entity", "fw_TouchWeapon")
	RegisterHam(Ham_Touch, "weapon_shield", "fw_TouchWeapon")
	RegisterHam(Ham_AddPlayerItem, "player", "fw_AddPlayerItem")
	for (new i = 1; i < sizeof WEAPONENTNAMES; i++)
		if (WEAPONENTNAMES[i][0]) RegisterHam(Ham_Item_Deploy, WEAPONENTNAMES[i], "fw_Item_Deploy_Post", 1)
	
	// FM Forwards
	register_forward(FM_ClientDisconnect, "fw_ClientDisconnect")
	register_forward(FM_ClientDisconnect, "fw_ClientDisconnect_Post", 1)
	register_forward(FM_ClientKill, "fw_ClientKill")
	register_forward(FM_EmitSound, "fw_EmitSound")
	if (!g_handle_models_on_separate_ent) register_forward(FM_SetClientKeyValue, "fw_SetClientKeyValue")
	register_forward(FM_ClientUserInfoChanged, "fw_ClientUserInfoChanged")
	register_forward(FM_GetGameDescription, "fw_GetGameDescription")
	register_forward(FM_SetModel, "fw_SetModel")
	RegisterHam(Ham_Think, "grenade", "fw_ThinkGrenade")
	register_forward(FM_CmdStart, "fw_CmdStart")
	register_forward(FM_PlayerPreThink, "fw_PlayerPreThink")
	unregister_forward(FM_Spawn, g_fwSpawn)
	unregister_forward(FM_PrecacheSound, g_fwPrecacheSound)
	
	// Client commands
	register_clcmd("say zpmenu", "clcmd_saymenu")
	register_clcmd("say /zpmenu", "clcmd_saymenu")
	register_clcmd("say unstuck", "clcmd_sayunstuck")
	register_clcmd("say /unstuck", "clcmd_sayunstuck")
	register_clcmd("nightvision", "clcmd_nightvision")
	register_clcmd("drop", "clcmd_drop")
	register_clcmd("buyammo1", "clcmd_buyammo")
	register_clcmd("buyammo2", "clcmd_buyammo")
	register_clcmd("chooseteam", "clcmd_changeteam")
	register_clcmd("jointeam", "clcmd_changeteam")
	
	// Menus
	register_menu("Game Menu", KEYSMENU, "menu_game")
	register_menu("Buy Menu 1", KEYSMENU, "menu_buy1")
	register_menu("Buy Menu 2", KEYSMENU, "menu_buy2")
	register_menu("Mod Info", KEYSMENU, "menu_info")
	register_menu("Admin Menu", KEYSMENU, "menu_admin")
	register_menu("Admin Modes Menu", KEYSMENU, "menu_modes_admin")
	
	// CS Buy Menus (to prevent zombies/survivor from buying)
	register_menucmd(register_menuid("#Buy", 1), 511, "menu_cs_buy")
	register_menucmd(register_menuid("BuyPistol", 1), 511, "menu_cs_buy")
	register_menucmd(register_menuid("BuyShotgun", 1), 511, "menu_cs_buy")
	register_menucmd(register_menuid("BuySub", 1), 511, "menu_cs_buy")
	register_menucmd(register_menuid("BuyRifle", 1), 511, "menu_cs_buy")
	register_menucmd(register_menuid("BuyMachine", 1), 511, "menu_cs_buy")
	register_menucmd(register_menuid("BuyItem", 1), 511, "menu_cs_buy")
	register_menucmd(-28, 511, "menu_cs_buy")
	register_menucmd(-29, 511, "menu_cs_buy")
	register_menucmd(-30, 511, "menu_cs_buy")
	register_menucmd(-32, 511, "menu_cs_buy")
	register_menucmd(-31, 511, "menu_cs_buy")
	register_menucmd(-33, 511, "menu_cs_buy")
	register_menucmd(-34, 511, "menu_cs_buy")
	
	// Admin commands
	register_concmd("zp_zombie", "cmd_zombie", _, "<target> - Turn someone into a Zombie", 0)
	register_concmd("zp_human", "cmd_human", _, "<target> - Turn someone back to Human", 0)
	register_concmd("zp_nemesis", "cmd_nemesis", _, "<target> - Turn someone into a Nemesis", 0)
	register_concmd("zp_assassin", "cmd_assassin", _, "<target> - Turn someone into an Assassin", 0)
	register_concmd("zp_survivor", "cmd_survivor", _, "<target> - Turn someone into a Survivor", 0)
	register_concmd("zp_sniper", "cmd_sniper", _, "<target> - Turn someone into a Sniper", 0)
	register_concmd("zp_respawn", "cmd_respawn", _, "<target> - Respawn someone", 0)
	register_concmd("zp_swarm", "cmd_swarm", _, " - Start Swarm Mode", 0)
	register_concmd("zp_multi", "cmd_multi", _, " - Start Multi Infection", 0)
	register_concmd("zp_plague", "cmd_plague", _, " - Start Plague Mode", 0)
	register_concmd("zp_armageddon", "cmd_armageddon", _, " - Start Armageddon Mode", 0)
	register_concmd("zp_apocalypse", "cmd_apocalypse", _, " - Start Apocalypse Mode", 0)
	register_concmd("zp_nightmare", "cmd_nightmare", _, " - Start Nightmare Mode", 0)
	
	// Message IDs
	g_msgScoreInfo = get_user_msgid("ScoreInfo")
	g_msgTeamInfo = get_user_msgid("TeamInfo")
	g_msgDeathMsg = get_user_msgid("DeathMsg")
	g_msgScoreAttrib = get_user_msgid("ScoreAttrib")
	g_msgSetFOV = get_user_msgid("SetFOV")
	g_msgScreenFade = get_user_msgid("ScreenFade")
	g_msgScreenShake = get_user_msgid("ScreenShake")
	g_msgNVGToggle = get_user_msgid("NVGToggle")
	g_msgFlashlight = get_user_msgid("Flashlight")
	g_msgFlashBat = get_user_msgid("FlashBat")
	g_msgAmmoPickup = get_user_msgid("AmmoPickup")
	g_msgDamage = get_user_msgid("Damage")
	g_msgHideWeapon = get_user_msgid("HideWeapon")
	g_msgCrosshair = get_user_msgid("Crosshair")
	g_msgSayText = get_user_msgid("SayText")
	g_msgCurWeapon = get_user_msgid("CurWeapon")
	
	// Message hooks
	register_message(g_msgCurWeapon, "message_cur_weapon")
	register_message(get_user_msgid("Money"), "message_money")
	register_message(get_user_msgid("Health"), "message_health")
	register_message(g_msgFlashBat, "message_flashbat")
	register_message(g_msgScreenFade, "message_screenfade")
	register_message(g_msgNVGToggle, "message_nvgtoggle")
	if (g_handle_models_on_separate_ent) register_message(get_user_msgid("ClCorpse"), "message_clcorpse")
	register_message(get_user_msgid("WeapPickup"), "message_weappickup")
	register_message(g_msgAmmoPickup, "message_ammopickup")
	register_message(get_user_msgid("Scenario"), "message_scenario")
	register_message(get_user_msgid("HostagePos"), "message_hostagepos")
	register_message(get_user_msgid("TextMsg"), "message_textmsg")
	register_message(get_user_msgid("SendAudio"), "message_sendaudio")
	register_message(get_user_msgid("TeamScore"), "message_teamscore")
	register_message(g_msgTeamInfo, "message_teaminfo")
	
	// CVARS - General Purpose
	cvar_warmup = register_cvar("zp_delay", "10")
	cvar_lighting = register_cvar("zp_lighting", "a")
	cvar_thunder = register_cvar("zp_thunderclap", "90")
	cvar_triggered = register_cvar("zp_triggered_lights", "1")
	cvar_removedoors = register_cvar("zp_remove_doors", "0")
	cvar_blockpushables = register_cvar("zp_blockuse_pushables", "1")
	cvar_blocksuicide = register_cvar("zp_block_suicide", "1")
	cvar_randspawn = register_cvar("zp_random_spawn", "1")
	cvar_respawnworldspawnkill = register_cvar("zp_respawn_on_worldspawn_kill", "1")
	cvar_removedropped = register_cvar("zp_remove_dropped", "0")
	cvar_removemoney = register_cvar("zp_remove_money", "1")
	cvar_buycustom = register_cvar("zp_buy_custom", "1")
	cvar_buyzonetime = register_cvar("zp_buyzone_time", "0.0")
	cvar_randweapons = register_cvar("zp_random_weapons", "0")
	cvar_adminmodelshuman = register_cvar("zp_admin_models_human", "1")
	cvar_adminknifemodelshuman = register_cvar("zp_admin_knife_models_human", "0")
	cvar_adminmodelszombie = register_cvar("zp_admin_models_zombie", "1")
	cvar_adminknifemodelszombie = register_cvar("zp_admin_knife_models_zombie", "0")
	cvar_zclasses = register_cvar("zp_zombie_classes", "1")
	cvar_statssave = register_cvar("zp_stats_save", "1")
	cvar_startammopacks = register_cvar("zp_starting_ammo_packs", "5")
	cvar_preventconsecutive = register_cvar("zp_prevent_consecutive_modes", "1")
	cvar_keephealthondisconnect = register_cvar("zp_keep_health_on_disconnect", "1")
	cvar_huddisplay = register_cvar("zp_hud_display", "1")
	cvar_aiminfo = register_cvar("zp_aim_info", "1")
	cvar_dmg_while_freeze = register_cvar("zp_dmg_while_frost", "1")
	
	// CVARS - Deathmatch
	cvar_deathmatch = register_cvar("zp_deathmatch", "0")
	cvar_spawndelay = register_cvar("zp_spawn_delay", "5")
	cvar_spawnprotection = register_cvar("zp_spawn_protection", "5")
	cvar_respawnonsuicide = register_cvar("zp_respawn_on_suicide", "0")
	cvar_respawnafterlast = register_cvar("zp_respawn_after_last_human", "1")
	cvar_allowrespawninfection = register_cvar("zp_infection_allow_respawn", "1")
	cvar_allowrespawnnem = register_cvar("zp_nem_allow_respawn", "0")
	cvar_allowrespawnassa = register_cvar("zp_assa_allow_respawn", "0")
	cvar_allowrespawnsurv = register_cvar("zp_surv_allow_respawn", "0")
	cvar_allowrespawnsni = register_cvar("zp_sni_allow_respawn", "0")
	cvar_allowrespawnswarm = register_cvar("zp_swarm_allow_respawn", "0")
	cvar_allowrespawnplague = register_cvar("zp_plague_allow_respawn", "0")
	cvar_allowrespawnarmage = register_cvar("zp_armageddon_allow_respawn", "0")
	cvar_allowrespawnapoc = register_cvar("zp_apocalypse_allow_respawn", "0")
	cvar_allowrespawnnight = register_cvar("zp_nightmare_allow_respawn", "0")
	cvar_respawnzomb = register_cvar("zp_respawn_zombies", "1")
	cvar_respawnhum = register_cvar("zp_respawn_humans", "1")
	cvar_respawnnem = register_cvar("zp_respawn_nemesis", "1")
	cvar_respawnassa = register_cvar("zp_respawn_assassins", "0")
	cvar_respawnsurv = register_cvar("zp_respawn_survivors", "1")
	cvar_respawnsni = register_cvar("zp_respawn_snipers", "0")
	
	// CVARS - Extra Items
	cvar_extraitems = register_cvar("zp_extra_items", "1")
	cvar_extraweapons = register_cvar("zp_extra_weapons", "1")
	cvar_extranvision = register_cvar("zp_extra_nvision", "1")
	cvar_extraantidote = register_cvar("zp_extra_antidote", "1")
	cvar_antidotelimit = register_cvar("zp_extra_antidote_limit", "999")
	cvar_extramadness = register_cvar("zp_extra_madness", "1")
	cvar_madnesslimit = register_cvar("zp_extra_madness_limit", "999")
	cvar_madnessduration = register_cvar("zp_extra_madness_duration", "5.0")
	cvar_extrainfbomb = register_cvar("zp_extra_infbomb", "1")
	cvar_infbomblimit = register_cvar("zp_extra_infbomb_limit", "999")
	
	// CVARS - Flashlight and Nightvision
	cvar_nvggive = register_cvar("zp_nvg_give", "1")
	cvar_customnvg = register_cvar("zp_nvg_custom", "1")
	cvar_nvgsize = register_cvar("zp_nvg_size", "80")
	cvar_nvgcolor[0] = register_cvar("zp_nvg_color_R", "0")
	cvar_nvgcolor[1] = register_cvar("zp_nvg_color_G", "150")
	cvar_nvgcolor[2] = register_cvar("zp_nvg_color_B", "0")
	cvar_humnvgcolor[0] = register_cvar("zp_nvg_hum_color_R", "0")
	cvar_humnvgcolor[1] = register_cvar("zp_nvg_hum_color_G", "150")
	cvar_humnvgcolor[2] = register_cvar("zp_nvg_hum_color_B", "0")
	cvar_nemnvgcolor[0] = register_cvar("zp_nvg_nem_color_R", "150")
	cvar_nemnvgcolor[1] = register_cvar("zp_nvg_nem_color_G", "0")
	cvar_nemnvgcolor[2] = register_cvar("zp_nvg_nem_color_B", "0")
	cvar_assanvgcolor[0] = register_cvar("zp_nvg_assa_color_R", "0")
	cvar_assanvgcolor[1] = register_cvar("zp_nvg_assa_color_G", "150")
	cvar_assanvgcolor[2] = register_cvar("zp_nvg_assa_color_B", "90")
	cvar_customflash = register_cvar("zp_flash_custom", "0")
	cvar_flashsize = register_cvar("zp_flash_size", "10")
	cvar_flashdrain = register_cvar("zp_flash_drain", "1")
	cvar_flashcharge = register_cvar("zp_flash_charge", "5")
	cvar_flashdist = register_cvar("zp_flash_distance", "1000")
	cvar_flashcolor[0] = register_cvar("zp_flash_color_R", "100")
	cvar_flashcolor[1] = register_cvar("zp_flash_color_G", "100")
	cvar_flashcolor[2] = register_cvar("zp_flash_color_B", "100")
	cvar_flashshowall = register_cvar("zp_flash_show_all", "1")
	
	// CVARS - Knockback
	cvar_knockback = register_cvar("zp_knockback", "0")
	cvar_knockbackdamage = register_cvar("zp_knockback_damage", "1")
	cvar_knockbackpower = register_cvar("zp_knockback_power", "1")
	cvar_knockbackzvel = register_cvar("zp_knockback_zvel", "0")
	cvar_knockbackducking = register_cvar("zp_knockback_ducking", "0.25")
	cvar_knockbackdist = register_cvar("zp_knockback_distance", "500")
	cvar_nemknockback = register_cvar("zp_knockback_nemesis", "0.25")
	cvar_assaknockback = register_cvar("zp_knockback_assassin", "0.7")
	
	// CVARS - Leap
	cvar_leapzombies = register_cvar("zp_leap_zombies", "0")
	cvar_leapzombiesforce = register_cvar("zp_leap_zombies_force", "500")
	cvar_leapzombiesheight = register_cvar("zp_leap_zombies_height", "300")
	cvar_leapzombiescooldown = register_cvar("zp_leap_zombies_cooldown", "5.0")
	cvar_leapnemesis = register_cvar("zp_leap_nemesis", "1")
	cvar_leapnemesisforce = register_cvar("zp_leap_nemesis_force", "500")
	cvar_leapnemesisheight = register_cvar("zp_leap_nemesis_height", "300")
	cvar_leapnemesiscooldown = register_cvar("zp_leap_nemesis_cooldown", "5.0")
	cvar_leapassassin = register_cvar("zp_leap_assassin", "0")
	cvar_leapassassinforce = register_cvar("zp_leap_assassin_force", "500")
	cvar_leapassassinheight = register_cvar("zp_leap_assassin_height", "300")
	cvar_leapassassincooldown = register_cvar("zp_leap_assassin_cooldown", "5.0")
	cvar_leapsurvivor = register_cvar("zp_leap_survivor", "0")
	cvar_leapsurvivorforce = register_cvar("zp_leap_survivor_force", "500")
	cvar_leapsurvivorheight = register_cvar("zp_leap_survivor_height", "300")
	cvar_leapsurvivorcooldown = register_cvar("zp_leap_survivor_cooldown", "5.0")
	cvar_leapsniper = register_cvar("zp_leap_sniper", "0")
	cvar_leapsniperforce = register_cvar("zp_leap_sniper_force", "500")
	cvar_leapsniperheight = register_cvar("zp_leap_sniper_height", "300")
	cvar_leapsnipercooldown = register_cvar("zp_leap_sniper_cooldown", "5.0")	
	
	// CVARS - Humans
	cvar_humanhp = register_cvar("zp_human_health", "100")
	cvar_humanlasthp = register_cvar("zp_human_last_extrahp", "0")
	cvar_humanspd = register_cvar("zp_human_speed", "240")
	cvar_humangravity = register_cvar("zp_human_gravity", "1.0")
	cvar_humanarmor = register_cvar("zp_human_armor_protect", "1")
	cvar_infammo = register_cvar("zp_human_unlimited_ammo", "0")
	cvar_ammodamage_human = register_cvar("zp_human_damage_reward", "500")
	cvar_fragskill = register_cvar("zp_human_frags_for_kill", "1")
	
	// CVARS - Custom Grenades
	cvar_firegrenades = register_cvar("zp_fire_grenades", "1")
	cvar_fireduration = register_cvar("zp_fire_duration", "10")
	cvar_firedamage = register_cvar("zp_fire_damage", "5")
	cvar_fireslowdown = register_cvar("zp_fire_slowdown", "0.5")
	cvar_frostgrenades = register_cvar("zp_frost_grenades", "1")
	cvar_freezeduration = register_cvar("zp_frost_duration", "3")
	cvar_flaregrenades = register_cvar("zp_flare_grenades","1")
	cvar_flareduration = register_cvar("zp_flare_duration", "60")
	cvar_flaresize = register_cvar("zp_flare_size", "25")
	cvar_flarecolor = register_cvar("zp_flare_color", "0")
	
	// CVARS - Zombies
	cvar_zombiefirsthp = register_cvar("zp_zombie_first_hp", "2.0")
	cvar_zombiearmor = register_cvar("zp_zombie_armor", "0.75")
	cvar_hitzones = register_cvar("zp_zombie_hitzones", "0")
	cvar_zombiebonushp = register_cvar("zp_zombie_infect_health", "100")
	cvar_zombiefov = register_cvar("zp_zombie_fov", "110")
	cvar_zombiesilent = register_cvar("zp_zombie_silent", "1")
	cvar_zombiepainfree = register_cvar("zp_zombie_painfree", "2")
	cvar_zombiebleeding = register_cvar("zp_zombie_bleeding", "1")
	cvar_ammoinfect = register_cvar("zp_zombie_infect_reward", "1")
	cvar_ammodamage_zombie = register_cvar("zp_zombie_damage_reward", "0")
	cvar_fragsinfect = register_cvar("zp_zombie_frags_for_infect", "1")
	
	// CVARS - Special Effects
	cvar_infectionscreenfade = register_cvar("zp_infection_screenfade", "1")
	cvar_infectionscreenshake = register_cvar("zp_infection_screenshake", "1")
	cvar_infectionsparkle = register_cvar("zp_infection_sparkle", "1")
	cvar_infectiontracers = register_cvar("zp_infection_tracers", "1")
	cvar_infectionparticles = register_cvar("zp_infection_particles", "1")
	cvar_hudicons = register_cvar("zp_hud_icons", "1")
	
	// CVARS - Nemesis
	cvar_nem = register_cvar("zp_nem_enabled", "1")
	cvar_nemchance = register_cvar("zp_nem_chance", "20")
	cvar_nemminplayers = register_cvar("zp_nem_min_players", "0")
	cvar_nemhp = register_cvar("zp_nem_health", "0")
	cvar_nembasehp = register_cvar("zp_nem_base_health", "0")
	cvar_nemspd = register_cvar("zp_nem_speed", "250")
	cvar_nemgravity = register_cvar("zp_nem_gravity", "0.5")
	cvar_nemdamage = register_cvar("zp_nem_damage", "250")
	cvar_nemglow = register_cvar("zp_nem_glow", "1")
	cvar_nemaura = register_cvar("zp_nem_aura", "1")	
	cvar_nempainfree = register_cvar("zp_nem_painfree", "0")
	cvar_nemignorefrags = register_cvar("zp_nem_ignore_frags", "1")
	cvar_nemignoreammo = register_cvar("zp_nem_ignore_rewards", "1")
	
	// CVARS - Assassin
	cvar_assa = register_cvar("zp_assa_enabled", "1")
	cvar_assachance = register_cvar("zp_assa_chance", "50")
	cvar_assaminplayers = register_cvar("zp_assa_min_players", "0")
	cvar_assahp = register_cvar("zp_assa_health", "25000")
	cvar_assabasehp = register_cvar("zp_assa_base_health", "0")
	cvar_assaspd = register_cvar("zp_assa_speed", "650")
	cvar_assagravity = register_cvar("zp_assa_gravity", "0.5")
	cvar_assadamage = register_cvar("zp_assa_damage", "250")
	cvar_assaglow = register_cvar("zp_assa_glow", "0")
	cvar_assaaura = register_cvar("zp_assa_aura", "0")	
	cvar_assapainfree = register_cvar("zp_assa_painfree", "0")
	cvar_assaignorefrags = register_cvar("zp_assassin_ignore_frags", "1")
	cvar_assaignoreammo = register_cvar("zp_assassin_ignore_rewards", "1")
	
	// CVARS - Survivor
	cvar_surv = register_cvar("zp_surv_enabled", "1")
	cvar_survchance = register_cvar("zp_surv_chance", "20")
	cvar_survminplayers = register_cvar("zp_surv_min_players", "0")
	cvar_survhp = register_cvar("zp_surv_health", "0")
	cvar_survbasehp = register_cvar("zp_surv_base_health", "0")
	cvar_survspd = register_cvar("zp_surv_speed", "230")
	cvar_survgravity = register_cvar("zp_surv_gravity", "1.25")
	cvar_survglow = register_cvar("zp_surv_glow", "1")
	cvar_survaura = register_cvar("zp_surv_aura", "1")
	cvar_survpainfree = register_cvar("zp_surv_painfree", "1")
	cvar_survignorefrags = register_cvar("zp_surv_ignore_frags", "1")
	cvar_survignoreammo = register_cvar("zp_surv_ignore_rewards", "1")
	cvar_survinfammo = register_cvar("zp_surv_unlimited_ammo", "2")
	
	// CVARS - Sniper
	cvar_sni = register_cvar("zp_sni_enabled", "1")
	cvar_snichance = register_cvar("zp_sni_chance", "250")
	cvar_sniminplayers = register_cvar("zp_sni_min_players", "0")
	cvar_snihp = register_cvar("zp_sni_health", "3000")
	cvar_snibasehp = register_cvar("zp_sni_base_health", "0")
	cvar_snispd = register_cvar("zp_sni_speed", "230")
	cvar_snigravity = register_cvar("zp_sni_gravity", "1.25")
	cvar_sniglow = register_cvar("zp_sni_glow", "1")
	cvar_sniaura = register_cvar("zp_sni_aura", "0")
	cvar_snipainfree = register_cvar("zp_sni_painfree", "0")
	cvar_snipignorefrags = register_cvar("zp_sniper_ignore_frags", "1")
	cvar_snipignoreammo = register_cvar("zp_sniper_ignore_rewards", "1")
	cvar_snidamage = register_cvar("zp_sni_damage", "4500")
	cvar_sniinfammo = register_cvar("zp_sni_unlimited_ammo", "1")
	
	// CVARS - Swarm Mode
	cvar_swarm = register_cvar("zp_swarm_enabled", "1")
	cvar_swarmchance = register_cvar("zp_swarm_chance", "20")
	cvar_swarmminplayers = register_cvar("zp_swarm_min_players", "0")
	
	// CVARS - Multi Infection
	cvar_multi = register_cvar("zp_multi_enabled", "1")
	cvar_multichance = register_cvar("zp_multi_chance", "20")
	cvar_multiminplayers = register_cvar("zp_multi_min_players", "0")
	cvar_multiratio = register_cvar("zp_multi_ratio", "0.15")
	
	// CVARS - Plague Mode
	cvar_plague = register_cvar("zp_plague_enabled", "1")
	cvar_plaguechance = register_cvar("zp_plague_chance", "30")
	cvar_plagueminplayers = register_cvar("zp_plague_min_players", "0")
	cvar_plagueratio = register_cvar("zp_plague_ratio", "0.5")
	cvar_plaguenemnum = register_cvar("zp_plague_nem_number", "1")
	cvar_plaguenemhpmulti = register_cvar("zp_plague_nem_hp_multi", "0.5")
	cvar_plaguesurvnum = register_cvar("zp_plague_surv_number", "1")
	cvar_plaguesurvhpmulti = register_cvar("zp_plague_surv_hp_multi", "0.5")
	
	// CVARS - Armageddon Mode
	cvar_armage = register_cvar("zp_armageddon_enabled", "1")
	cvar_armagechance = register_cvar("zp_armageddon_chance", "25")
	cvar_armageminplayers = register_cvar("zp_armageddon_min_players", "0")
	cvar_armageratio = register_cvar("zp_armageddon_ratio", "0.5")
	cvar_armagenemhpmulti = register_cvar("zp_armageddon_nemesis_hp_multi", "0.5")	
	cvar_armagesurvhpmulti = register_cvar("zp_armageddon_survivor_hp_multi", "0.5")

	// CVARS - Apocalypse Mode
	cvar_apoc = register_cvar("zp_apocalypse_enabled", "1")
	cvar_apocchance = register_cvar("zp_apocalypse_chance", "25")
	cvar_apocminplayers = register_cvar("zp_apocalypse_min_players", "0")
	cvar_apocratio = register_cvar("zp_apocalypse_ratio", "0.5")
	cvar_apocassahpmulti = register_cvar("zp_apocalypse_assassin_hp_multi", "0.5")	
	cvar_apocsniphpmulti = register_cvar("zp_apocalypse_sniper_hp_multi", "0.5")

	// CVARS - Nightmare Mode
	cvar_night = register_cvar("zp_nightmare_enabled", "1")
	cvar_nightchance = register_cvar("zp_nightmare_chance", "25")
	cvar_nightminplayers = register_cvar("zp_nightmare_min_players", "0")
	cvar_nightratio = register_cvar("zp_nightmare_ratio", "0.5")
	cvar_nightassahpmulti = register_cvar("zp_nightmare_assassin_hp_multi", "0.5")
	cvar_nightsniphpmulti = register_cvar("zp_nightmare_sniper_hp_multi", "0.5")
	cvar_nightnemhpmulti = register_cvar("zp_nightmare_nemesis_hp_multi", "0.5")
	cvar_nightsurvhpmulti = register_cvar("zp_nightmare_survivor_hp_multi", "0.5")
	
	// CVARS - Others
	cvar_logcommands = register_cvar("zp_logcommands", "1")
	cvar_showactivity = get_cvar_pointer("amx_show_activity")
	cvar_botquota = get_cvar_pointer("bot_quota")
	register_cvar("zp_version", PLUGIN_VERSION, FCVAR_SERVER|FCVAR_SPONLY)
	set_cvar_string("zp_version", PLUGIN_VERSION)
	
	// Custom Forwards
	g_fwRoundStart = CreateMultiForward("zp_round_started", ET_IGNORE, FP_CELL, FP_CELL)
	g_fwRoundEnd = CreateMultiForward("zp_round_ended", ET_IGNORE, FP_CELL)
	g_fwUserInfected_pre = CreateMultiForward("zp_user_infected_pre", ET_IGNORE, FP_CELL, FP_CELL, FP_CELL)
	g_fwUserInfected_post = CreateMultiForward("zp_user_infected_post", ET_IGNORE, FP_CELL, FP_CELL, FP_CELL)
	g_fwUserHumanized_pre = CreateMultiForward("zp_user_humanized_pre", ET_IGNORE, FP_CELL, FP_CELL)
	g_fwUserHumanized_post = CreateMultiForward("zp_user_humanized_post", ET_IGNORE, FP_CELL, FP_CELL)
	g_fwUserInfect_attempt = CreateMultiForward("zp_user_infect_attempt", ET_CONTINUE, FP_CELL, FP_CELL, FP_CELL)
	g_fwUserHumanize_attempt = CreateMultiForward("zp_user_humanize_attempt", ET_CONTINUE, FP_CELL, FP_CELL)
	g_fwExtraItemSelected = CreateMultiForward("zp_extra_item_selected", ET_CONTINUE, FP_CELL, FP_CELL)
	g_fwUserUnfrozen = CreateMultiForward("zp_user_unfrozen", ET_IGNORE, FP_CELL)
	g_fwUserLastZombie = CreateMultiForward("zp_user_last_zombie", ET_IGNORE, FP_CELL)
	g_fwUserLastHuman = CreateMultiForward("zp_user_last_human", ET_IGNORE, FP_CELL)
	
	// Collect random spawn points
	load_spawns()
	
	// Set a random skybox?
	if (g_sky_enable)
	{
		new sky[32]
		ArrayGetString(g_sky_names, random_num(0, ArraySize(g_sky_names) - 1), sky, charsmax(sky))
		set_cvar_string("sv_skyname", sky)
	}
	
	// Disable sky lighting so it doesn't mess with our custom lighting
	set_cvar_num("sv_skycolor_r", 0)
	set_cvar_num("sv_skycolor_g", 0)
	set_cvar_num("sv_skycolor_b", 0)
	
	// Create the HUD Sync Objects
	g_MsgSync = CreateHudSyncObj()
	g_MsgSync2 = CreateHudSyncObj()
	g_MsgSync3 = CreateHudSyncObj()
	
	// Format mod name
	formatex(g_modname, charsmax(g_modname), "Zombie Plague %s", PLUGIN_VERSION)
	
	// Get Max Players
	g_maxplayers = get_maxplayers()
	
	// Reserved saving slots starts on maxplayers+1
	db_slot_i = g_maxplayers+1
	
	// Check if it's a CZ server
	new mymod[6]
	get_modname(mymod, charsmax(mymod))
	if (equal(mymod, "czero")) g_czero = 1
}

public plugin_cfg()
{
	// Plugin disabled?
	if (!g_pluginenabled) return;
	
	// Get configs dir
	new cfgdir[32]
	get_configsdir(cfgdir, charsmax(cfgdir))
	
	// Execute config file (zombieplague.cfg)
	server_cmd("exec %s/zombieplague.cfg", cfgdir)
	
	// Prevent any more stuff from registering
	g_arrays_created = false
	
	// Save customization data
	save_customization()
	
	// Lighting task
	set_task(5.0, "lighting_effects", _, _, _, "b")
	
	// Cache CVARs after configs are loaded / call roundstart manually
	set_task(0.5, "cache_cvars")
	set_task(0.5, "event_round_start")
	set_task(0.5, "logevent_round_start")
}

// Some one aimed at someone
public event_show_status(id)
{
	// Not a bot and is still connected
	if (!g_isbot[id] && g_isconnected[id] && get_pcvar_num(cvar_aiminfo)) 
	{
		// Retrieve the aimed player's id
		static aimid
		aimid = read_data(2)
		
		// Only show friends status ?
		if (g_zombie[id] == g_zombie[aimid])
		{
			static class[32], red, blue
			
			// Format the class name according to the player's team
			if (g_zombie[id])
			{
				red = 255
				blue = 0
				
				if (g_nemesis[aimid])
					formatex(class, charsmax(class), "%L %L", id, "CLASS_CLASS", id, "CLASS_NEMESIS")
				else if (g_assassin[aimid])
					formatex(class, charsmax(class), "%L %L", id, "CLASS_CLASS", id, "CLASS_ASSASSIN")
				else
					formatex(class, charsmax(class), "%L %s", id, "CLASS_CLASS", g_zombie_classname[aimid])
			}
			else
			{
				red = 0
				blue = 255
				
				if (g_survivor[aimid])
					formatex(class, charsmax(class), "%L %L", id, "CLASS_CLASS", id, "CLASS_SURVIVOR")
				else if (g_sniper[aimid])
					formatex(class, charsmax(class), "%L %L", id, "CLASS_CLASS", id, "CLASS_SNIPER")
				else
					formatex(class, charsmax(class), "%L %L", id, "CLASS_CLASS", id, "CLASS_HUMAN")
			}
			
			// Show the notice
			set_hudmessage(red, 50, blue, -1.0, 0.60, 1, 0.01, 3.0, 0.01, 0.01, -1)
			ShowSyncHudMsg(id, g_MsgSync3,"%L", id, "AIM_INFO", g_playername[aimid], class, pev(aimid, pev_health), pev(aimid, pev_armorvalue), g_ammopacks[aimid])
		}
	}
}

// Remove the aim-info message
public event_hide_status(id)
{
	ClearSyncHud(id, g_MsgSync3)
}

/*================================================================================
 [Main Events]
=================================================================================*/

// Event Round Start
public event_round_start()
{
	// Remove doors/lights?
	set_task(0.1, "remove_stuff")
	
	// New round starting
	g_newround = true
	g_endround = false
	g_survround = false
	g_sniround = false
	g_nemround = false
	g_assaround = false
	g_swarmround = false
	g_plagueround = false
	g_armageround = false
	g_apocround = false
	g_nightround = false
	g_modestarted = false
	
	// Reset bought infection bombs counter
	g_infbombcounter = 0
	g_antidotecounter = 0
	g_madnesscounter = 0
	
	// Freezetime begins
	g_freezetime = true
	
	// Show welcome message and T-Virus notice
	remove_task(TASK_WELCOMEMSG)
	set_task(2.0, "welcome_msg", TASK_WELCOMEMSG)
	
	// Set a new "Make Zombie Task"
	remove_task(TASK_MAKEZOMBIE)
	set_task(2.0 + get_pcvar_float(cvar_warmup), "make_zombie_task", TASK_MAKEZOMBIE)
}

// Log Event Round Start
public logevent_round_start()
{
	// Freezetime ends
	g_freezetime = false
}

// Log Event Round End
public logevent_round_end()
{
	// Prevent this from getting called twice when restarting (bugfix)
	static Float:lastendtime, Float:current_time
	current_time = get_gametime()
	if (current_time - lastendtime < 0.5) return;
	lastendtime = current_time
	
	// Temporarily save player stats?
	if (get_pcvar_num(cvar_statssave))
	{
		static id, team
		for (id = 1; id <= g_maxplayers; id++)
		{
			// Not connected
			if (!g_isconnected[id])
				continue;
			
			team = fm_cs_get_user_team(id)
			
			// Not playing
			if (team == FM_CS_TEAM_SPECTATOR || team == FM_CS_TEAM_UNASSIGNED)
				continue;
			
			save_stats(id)
		}
	}
	
	// Round ended
	g_endround = true
	
	// Stop old tasks (if any)
	remove_task(TASK_WELCOMEMSG)
	remove_task(TASK_MAKEZOMBIE)
	
	// Stop ambience sounds
	if ((g_ambience_sounds[AMBIENCE_SOUNDS_NEMESIS] && g_nemround) || (g_ambience_sounds[AMBIENCE_SOUNDS_ASSASSIN] && g_assaround) || (g_ambience_sounds[AMBIENCE_SOUNDS_SURVIVOR] && g_survround) || (g_ambience_sounds[AMBIENCE_SOUNDS_SNIPER] && g_sniround) || (g_ambience_sounds[AMBIENCE_SOUNDS_SWARM] && g_swarmround) || (g_ambience_sounds[AMBIENCE_SOUNDS_PLAGUE] && g_plagueround)
	|| (g_ambience_sounds[AMBIENCE_SOUNDS_ARMAGEDDON] && g_armageround) || (g_ambience_sounds[AMBIENCE_SOUNDS_APOCALYPSE] && g_apocround) || (g_ambience_sounds[AMBIENCE_SOUNDS_NIGHTMARE] && g_nightround) || (g_ambience_sounds[AMBIENCE_SOUNDS_INFECTION] && !g_nemround && !g_assaround && !g_survround && !g_sniround && !g_swarmround && !g_plagueround && !g_armageround && !g_apocround && !g_nightround))
	{
		remove_task(TASK_AMBIENCESOUNDS)
		ambience_sound_stop()
	}
	
	// Show HUD notice, play win sound, update team scores...
	static sound[64]
	if (!fnGetZombies())
	{
		// Human team wins
		set_hudmessage(0, 0, 200, HUD_EVENT_X, HUD_EVENT_Y, 0, 0.0, 3.0, 2.0, 1.0, -1)
		ShowSyncHudMsg(0, g_MsgSync, "%L", LANG_PLAYER, "WIN_HUMAN")
		
		// Play win sound and increase score, unless game commencing
		ArrayGetString(sound_win_humans, random_num(0, ArraySize(sound_win_humans) - 1), sound, charsmax(sound))
		PlaySound(sound)
		if (!g_gamecommencing) g_scorehumans++
		
		// Round end forward
		ExecuteForward(g_fwRoundEnd, g_fwDummyResult, ZP_TEAM_HUMAN);
	}
	else if (!fnGetHumans())
	{
		// Zombie team wins
		set_hudmessage(200, 0, 0, HUD_EVENT_X, HUD_EVENT_Y, 0, 0.0, 3.0, 2.0, 1.0, -1)
		ShowSyncHudMsg(0, g_MsgSync, "%L", LANG_PLAYER, "WIN_ZOMBIE")
		
		// Play win sound and increase score, unless game commencing
		ArrayGetString(sound_win_zombies, random_num(0, ArraySize(sound_win_zombies) - 1), sound, charsmax(sound))
		PlaySound(sound)
		if (!g_gamecommencing) g_scorezombies++
		
		// Round end forward
		ExecuteForward(g_fwRoundEnd, g_fwDummyResult, ZP_TEAM_ZOMBIE);
	}
	else
	{
		// No one wins
		set_hudmessage(0, 200, 0, HUD_EVENT_X, HUD_EVENT_Y, 0, 0.0, 3.0, 2.0, 1.0, -1)
		ShowSyncHudMsg(0, g_MsgSync, "%L", LANG_PLAYER, "WIN_NO_ONE")
		
		// Play win sound
		ArrayGetString(sound_win_no_one, random_num(0, ArraySize(sound_win_no_one) - 1), sound, charsmax(sound))
		PlaySound(sound)
		
		// Round end forward
		ExecuteForward(g_fwRoundEnd, g_fwDummyResult, ZP_TEAM_NO_ONE);
	}
	
	// Game commencing triggers round end
	g_gamecommencing = false
	
	// Balance the teams
	balance_teams()
}

// Event Map Ended
public event_intermission()
{
	// Remove ambience sounds task
	remove_task(TASK_AMBIENCESOUNDS)
}

// BP Ammo update
public event_ammo_x(id)
{
	// Humans only
	if (g_zombie[id])
		return;
	
	// Get ammo type
	static type
	type = read_data(1)
	
	// Unknown ammo type
	if (type >= sizeof AMMOWEAPON)
		return;
	
	// Get weapon's id
	static weapon
	weapon = AMMOWEAPON[type]
	
	// Primary and secondary only
	if (MAXBPAMMO[weapon] <= 2)
		return;
	
	// Get ammo amount
	static amount
	amount = read_data(2)
	
	// Unlimited BP Ammo?
	if (g_survivor[id] ? get_pcvar_num(cvar_survinfammo) : g_sniper[id] ? get_pcvar_num(cvar_sniinfammo) : get_pcvar_num(cvar_infammo))
	{
		if (amount < MAXBPAMMO[weapon])
		{
			// The BP Ammo refill code causes the engine to send a message, but we
			// can't have that in this forward or we risk getting some recursion bugs.
			// For more info see: https://bugs.alliedmods.net/show_bug.cgi?id=3664
			static args[1]
			args[0] = weapon
			set_task(0.1, "refill_bpammo", id, args, sizeof args)
		}
	}
	// Bots automatically buy ammo when needed
	else if (g_isbot[id] && amount <= BUYAMMO[weapon])
	{
		// Task needed for the same reason as above
		set_task(0.1, "clcmd_buyammo", id)
	}
}

/*================================================================================
 [Main Forwards]
=================================================================================*/

// Entity Spawn Forward
public fw_Spawn(entity)
{
	// Invalid entity
	if (!pev_valid(entity)) return FMRES_IGNORED;
	
	// Get classname
	new classname[32], objective[32], size = ArraySize(g_objective_ents)
	pev(entity, pev_classname, classname, charsmax(classname))
	
	// Check whether it needs to be removed
	for (new i = 0; i < size; i++)
	{
		ArrayGetString(g_objective_ents, i, objective, charsmax(objective))
		
		if (equal(classname, objective))
		{
			engfunc(EngFunc_RemoveEntity, entity)
			return FMRES_SUPERCEDE;
		}
	}
	
	return FMRES_IGNORED;
}

// Sound Precache Forward
public fw_PrecacheSound(const sound[])
{
	// Block all those unneeeded hostage sounds
	if (equal(sound, "hostage", 7))
		return FMRES_SUPERCEDE;
	
	return FMRES_IGNORED;
}

// Ham Player Spawn Post Forward
public fw_PlayerSpawn_Post(id)
{
	// Not alive or didn't join a team yet
	if (!is_user_alive(id) || !fm_cs_get_user_team(id))
		return;
	
	// Player spawned
	g_isalive[id] = true
	
	// Remove previous tasks
	remove_task(id+TASK_SPAWN)
	remove_task(id+TASK_MODEL)
	remove_task(id+TASK_BLOOD)
	remove_task(id+TASK_AURA)
	remove_task(id+TASK_BURN)
	remove_task(id+TASK_CHARGE)
	remove_task(id+TASK_FLASH)
	remove_task(id+TASK_NVISION)
	
	// Spawn at a random location?
	if (get_pcvar_num(cvar_randspawn)) do_random_spawn(id)
	
	// Hide money?
	if (get_pcvar_num(cvar_removemoney))
		set_task(0.4, "task_hide_money", id+TASK_SPAWN)
	
	// Respawn player if he dies because of a worldspawn kill?
	if (get_pcvar_num(cvar_respawnworldspawnkill))
		set_task(2.0, "respawn_player_check_task", id+TASK_SPAWN)
	
	// Spawn as zombie?
	if (g_respawn_as_zombie[id] && !g_newround)
	{
		reset_vars(id, 0) // reset player vars
		zombieme(id, 0, 0, 0, 0, 0) // make him zombie right away
		return;
	}
	
	// Reset player vars
	reset_vars(id, 0)
	g_buytime[id] = get_gametime()
	
	// Show custom buy menu?
	if (get_pcvar_num(cvar_buycustom))
		set_task(0.2, "show_menu_buy1", id+TASK_SPAWN)
	
	// Set health and gravity
	fm_set_user_health(id, get_pcvar_num(cvar_humanhp))
	set_pev(id, pev_gravity, get_pcvar_float(cvar_humangravity))
	
	// Set human maxspeed
	ExecuteHamB(Ham_Player_ResetMaxSpeed, id)
	
	// Switch to CT if spawning mid-round
	if (!g_newround && fm_cs_get_user_team(id) != FM_CS_TEAM_CT) // need to change team?
	{
		remove_task(id+TASK_TEAM)
		fm_cs_set_user_team(id, FM_CS_TEAM_CT)
		fm_user_team_update(id)
	}
	
	// Custom models stuff
	static currentmodel[32], tempmodel[32], already_has_model, i, iRand, size
	already_has_model = false
	
	if (g_handle_models_on_separate_ent)
	{
		// Set the right model
		if (get_pcvar_num(cvar_adminmodelshuman) && (get_user_flags(id) & g_access_flag[ACCESS_ADMIN_MODELS]))
		{
			iRand = random_num(0, ArraySize(model_admin_human) - 1)
			ArrayGetString(model_admin_human, iRand, g_playermodel[id], charsmax(g_playermodel[]))
			if (g_set_modelindex_offset) fm_cs_set_user_model_index(id, ArrayGetCell(g_modelindex_admin_human, iRand))
		}
		else
		{
			iRand = random_num(0, ArraySize(model_human) - 1)
			ArrayGetString(model_human, iRand, g_playermodel[id], charsmax(g_playermodel[]))
			if (g_set_modelindex_offset) fm_cs_set_user_model_index(id, ArrayGetCell(g_modelindex_human, iRand))
		}
		
		// Set model on player model entity
		fm_set_playermodel_ent(id)
		
		// Remove glow on player model entity
		fm_set_rendering(g_ent_playermodel[id])
	}
	else
	{
		// Get current model for comparing it with the current one
		fm_cs_get_user_model(id, currentmodel, charsmax(currentmodel))
		
		// Set the right model, after checking that we don't already have it
		if (get_pcvar_num(cvar_adminmodelshuman) && (get_user_flags(id) & g_access_flag[ACCESS_ADMIN_MODELS]))
		{
			size = ArraySize(model_admin_human)
			for (i = 0; i < size; i++)
			{
				ArrayGetString(model_admin_human, i, tempmodel, charsmax(tempmodel))
				if (equal(currentmodel, tempmodel)) already_has_model = true
			}
			
			if (!already_has_model)
			{
				iRand = random_num(0, size - 1)
				ArrayGetString(model_admin_human, iRand, g_playermodel[id], charsmax(g_playermodel[]))
				if (g_set_modelindex_offset) fm_cs_set_user_model_index(id, ArrayGetCell(g_modelindex_admin_human, iRand))
			}
		}
		else
		{
			size = ArraySize(model_human)
			for (i = 0; i < size; i++)
			{
				ArrayGetString(model_human, i, tempmodel, charsmax(tempmodel))
				if (equal(currentmodel, tempmodel)) already_has_model = true
			}
			
			if (!already_has_model)
			{
				iRand = random_num(0, size - 1)
				ArrayGetString(model_human, iRand, g_playermodel[id], charsmax(g_playermodel[]))
				if (g_set_modelindex_offset) fm_cs_set_user_model_index(id, ArrayGetCell(g_modelindex_human, iRand))
			}
		}
		
		// Need to change the model?
		if (!already_has_model)
		{
			// An additional delay is offset at round start
			// since SVC_BAD is more likely to be triggered there
			if (g_newround)
				set_task(5.0 * g_modelchange_delay, "fm_user_model_update", id+TASK_MODEL)
			else
				fm_user_model_update(id+TASK_MODEL)
		}
		
		// Remove glow
		fm_set_rendering(id)
	}
	
	// Bots stuff
	if (g_isbot[id])
	{
		// Turn off NVG for bots
		cs_set_user_nvg(id, 0)
		
		// Automatically buy extra items/weapons after first zombie is chosen
		if (get_pcvar_num(cvar_extraitems))
		{
			if (g_newround) set_task(10.0 + get_pcvar_float(cvar_warmup), "bot_buy_extras", id+TASK_SPAWN)
			else set_task(10.0, "bot_buy_extras", id+TASK_SPAWN)
		}
	}
	
	// Enable spawn protection for humans spawning mid-round
	if (!g_newround && get_pcvar_float(cvar_spawnprotection) > 0.0)
	{
		// Do not take damage
		g_nodamage[id] = true
		
		// Make temporarily invisible
		set_pev(id, pev_effects, pev(id, pev_effects) | EF_NODRAW)
		
		// Set task to remove it
		set_task(get_pcvar_float(cvar_spawnprotection), "remove_spawn_protection", id+TASK_SPAWN)
	}
	
	// Turn off his flashlight (prevents double flashlight bug/exploit)
	turn_off_flashlight(id)
	
	// Set the flashlight charge task to update battery status
	if (g_cached_customflash)
		set_task(1.0, "flashlight_charge", id+TASK_CHARGE, _, _, "b")
	
	// Replace weapon models (bugfix)
	static weapon_ent
	weapon_ent = fm_cs_get_current_weapon_ent(id)
	if (pev_valid(weapon_ent)) replace_weapon_models(id, cs_get_weapon_id(weapon_ent))
	
	// Last Zombie Check
	fnCheckLastZombie()
}

// Ham Player Killed Forward
public fw_PlayerKilled(victim, attacker, shouldgib)
{
	// Player killed
	g_isalive[victim] = false
	// Disable nodamage mode after we die to prevent spectator nightvision using zombie madness colors bug
	g_nodamage[victim] = false
	
	// Enable dead players nightvision
	set_task(0.1, "spec_nvision", victim)
	
	// Disable nightvision when killed (bugfix)
	if (get_pcvar_num(cvar_nvggive) == 0 && g_nvision[victim])
	{
		if (get_pcvar_num(cvar_customnvg)) remove_task(victim+TASK_NVISION)
		else if (g_nvisionenabled[victim]) set_user_gnvision(victim, 0)
		g_nvision[victim] = false
		g_nvisionenabled[victim] = false
	}
	
	// Turn off nightvision when killed (bugfix)
	if (get_pcvar_num(cvar_nvggive) == 2 && g_nvision[victim] && g_nvisionenabled[victim])
	{
		if (get_pcvar_num(cvar_customnvg)) remove_task(victim+TASK_NVISION)
		else set_user_gnvision(victim, 0)
		g_nvisionenabled[victim] = false
	}
	
	// Turn off custom flashlight when killed
	if (g_cached_customflash)
	{
		// Turn it off
		g_flashlight[victim] = false
		g_flashbattery[victim] = 100
		
		// Remove previous tasks
		remove_task(victim+TASK_CHARGE)
		remove_task(victim+TASK_FLASH)
	}
	
	// Stop bleeding/burning/aura when killed
	if (g_zombie[victim])
	{
		remove_task(victim+TASK_BLOOD)
		remove_task(victim+TASK_AURA)
		remove_task(victim+TASK_BURN)
	}
	
	// Nemesis/Assassins explodes!
	if (g_nemesis[victim] || g_assassin[victim])                	
	        SetHamParamInteger(3, 2)
		
	// Get deathmatch mode status and whether the player killed himself
	static selfkill
	selfkill = (victim == attacker || !is_user_valid_connected(attacker)) ? true : false
	
	// Make sure that the player was not killed by a non-player entity or through self killing
	if (!selfkill)
	{		
		// When killed by a Sniper victim explodes
		if (g_sniper[attacker] && (g_currentweapon[attacker] == CSW_AWP))
		{	
			// Cut him into pieces
			SetHamParamInteger(3, 2)
			
			// Get his origin
			static origin[3]
			get_user_origin(victim, origin)
			
			// Make some blood in the air
			message_begin(MSG_PVS, SVC_TEMPENTITY, origin)
			write_byte(TE_LAVASPLASH) // TE id
			write_coord(origin[0]) // origin x
			write_coord(origin[1]) // origin y
			write_coord(origin[2] - 26) // origin z
			message_end()
		}
		else if (g_assassin[attacker])
			SetHamParamInteger(3, 2)		
	}
	
	// Killed by a non-player entity or self killed
	if (selfkill) return;
	
	// Ignore Nemesis/Survivor Frags?
	if ((g_nemesis[attacker] && get_pcvar_num(cvar_nemignorefrags)) || (g_assassin[attacker] && get_pcvar_num(cvar_assaignorefrags)) || (g_survivor[attacker] && get_pcvar_num(cvar_survignorefrags)) || (g_sniper[attacker] && get_pcvar_num(cvar_snipignorefrags)))
		RemoveFrags(attacker, victim)
	
	// Zombie/nemesis/assassin killed human, reward ammo packs
	if (g_zombie[attacker] && (!g_nemesis[attacker] || !get_pcvar_num(cvar_nemignoreammo)) && (!g_assassin[attacker] || !get_pcvar_num(cvar_assaignoreammo)))
		g_ammopacks[attacker] += get_pcvar_num(cvar_ammoinfect)
	
	// Human killed zombie, add up the extra frags for kill
	if (!g_zombie[attacker] && get_pcvar_num(cvar_fragskill) > 1)
		UpdateFrags(attacker, victim, get_pcvar_num(cvar_fragskill) - 1, 0, 0)
	
	// Zombie killed human, add up the extra frags for kill
	if (g_zombie[attacker] && get_pcvar_num(cvar_fragsinfect) > 1)
		UpdateFrags(attacker, victim, get_pcvar_num(cvar_fragsinfect) - 1, 0, 0)
}

// Ham Player Killed Post Forward
public fw_PlayerKilled_Post(victim, attacker, shouldgib)
{
	// Last Zombie Check
	fnCheckLastZombie()
	
	// Determine whether the player killed himself
	static selfkill
	selfkill = (victim == attacker || !is_user_valid_connected(attacker)) ? true : false
	
	// Respawn if deathmatch is enabled
	if (get_pcvar_num(cvar_deathmatch))
	{
		// Respawn on suicide?
		if (selfkill && !get_pcvar_num(cvar_respawnonsuicide))
			return;
		
		// Respawn if human/zombie/nemesis/survivor?
		if ((g_zombie[victim] && !g_nemesis[victim] && !g_assassin[victim] && !get_pcvar_num(cvar_respawnzomb)) || (!g_zombie[victim] && !g_survivor[victim] && !g_sniper[victim] && !get_pcvar_num(cvar_respawnhum)) || (g_nemesis[victim] && !get_pcvar_num(cvar_respawnnem)) || (g_assassin[victim] && !get_pcvar_num(cvar_respawnassa)) || (g_survivor[victim] && !get_pcvar_num(cvar_respawnsurv)) || (g_sniper[victim] && !get_pcvar_num(cvar_respawnsni)))
			return;
		
		// Set the respawn task
		set_task(get_pcvar_float(cvar_spawndelay), "respawn_player_task", victim+TASK_SPAWN)
	}
}

// Ham Take Damage Forward
public fw_TakeDamage(victim, inflictor, attacker, Float:damage, damage_type)
{
	// Non-player damage or self damage
	if (victim == attacker || !is_user_valid_connected(attacker))
		return HAM_IGNORED;
	
	// New round starting or round ended
	if (g_newround || g_endround)
		return HAM_SUPERCEDE;
	
	// Victim shouldn't take damage or victim is frozen
	if (g_nodamage[victim] || g_frozen[victim])
		return HAM_SUPERCEDE;
	
	// Prevent friendly fire
	if (g_zombie[attacker] == g_zombie[victim])
		return HAM_SUPERCEDE;
	
	// Attacker is human...
	if (!g_zombie[attacker])
	{
		// Armor multiplier for the final damage on normal zombies
		if (!g_nemesis[victim] && !g_assassin[victim] && !g_sniper[attacker])
		{
			damage *= get_pcvar_float(cvar_zombiearmor)
			SetHamParamFloat(4, damage)
		}
		
		// Reward ammo packs to humans for damaging zombies?
		if ((get_pcvar_num(cvar_ammodamage_human) > 0) && (!g_survivor[attacker] || !get_pcvar_num(cvar_survignoreammo)) && (!g_sniper[attacker] || !get_pcvar_num(cvar_snipignoreammo)))
		{
			// Store damage dealt
			g_damagedealt_human[attacker] += floatround(damage)
			
			// Reward ammo packs for every [ammo damage] dealt
			while (g_damagedealt_human[attacker] > get_pcvar_num(cvar_ammodamage_human))
			{
				g_ammopacks[attacker]++
				g_damagedealt_human[attacker] -= get_pcvar_num(cvar_ammodamage_human)
			}
		}
		
		// set sniper dmg
		if (g_sniper[attacker] && g_currentweapon[attacker] == CSW_AWP)
			SetHamParamFloat(4, get_pcvar_float(cvar_snidamage))
		
		return HAM_IGNORED;
	}
	
	// Attacker is zombie...
	
	// Prevent infection/damage by HE grenade (bugfix)
	if (damage_type & DMG_HEGRENADE)
		return HAM_SUPERCEDE;
	
	// Nemesis?
	if (g_nemesis[attacker])
	{
		// Ignore nemesis damage override if damage comes from a 3rd party entity
		// (to prevent this from affecting a sub-plugin's rockets e.g.)
		if (inflictor == attacker)
		{
			// Set nemesis damage
			SetHamParamFloat(4, get_pcvar_float(cvar_nemdamage))
		}
		
		return HAM_IGNORED;
	}
	else if (g_assassin[attacker])
	{
		// Ignore assassin damage override if damage comes from a 3rd party entity
		// (to prevent this from affecting a sub-plugin's rockets e.g.)
		if (inflictor == attacker)
		{
			// Set assassin damage
			SetHamParamFloat(4, get_pcvar_float(cvar_assadamage))
		}
		
		return HAM_IGNORED;
	}
	
	// Reward ammo packs to zombies for damaging humans?
	if (get_pcvar_num(cvar_ammodamage_zombie) > 0)
	{
		// Store damage dealt
		g_damagedealt_zombie[attacker] += floatround(damage)
		
		// Reward ammo packs for every [ammo damage] dealt
		while (g_damagedealt_zombie[attacker] > get_pcvar_num(cvar_ammodamage_zombie))
		{
			g_ammopacks[attacker]++
			g_damagedealt_zombie[attacker] -= get_pcvar_num(cvar_ammodamage_zombie)
		}
	}
	
	// Last human or not an infection round
	if (g_survround || g_sniround || g_nemround || g_assaround || g_swarmround || g_plagueround || g_armageround || g_apocround || g_nightround || fnGetHumans() == 1)
		return HAM_IGNORED; // human is killed
	
	// Does human armor need to be reduced before infecting?
	if (get_pcvar_num(cvar_humanarmor))
	{
		// Get victim armor
		static Float:armor
		pev(victim, pev_armorvalue, armor)
		
		// If he has some, block the infection and reduce armor instead
		if (armor > 0.0)
		{
			emit_sound(victim, CHAN_BODY, sound_armorhit, 1.0, ATTN_NORM, 0, PITCH_NORM)
			if (armor - damage > 0.0)
				set_pev(victim, pev_armorvalue, armor - damage)
			else
				cs_set_user_armor(victim, 0, CS_ARMOR_NONE)
			return HAM_SUPERCEDE;
		}
	}
	
	// Infection allowed
	zombieme(victim, attacker, 0, 0, 0, 1) // turn into zombie
	return HAM_SUPERCEDE;
}

// Ham Take Damage Post Forward
public fw_TakeDamage_Post(victim)
{
	// --- Check if victim should be Pain Shock Free ---
	
	// Check if proper CVARs are enabled
	if (g_zombie[victim])
	{
		if (g_nemesis[victim])
		{
			if (!get_pcvar_num(cvar_nempainfree)) return;
		}
		else if (g_assassin[victim])
		{
			if (!get_pcvar_num(cvar_assapainfree)) return;
		}
		else
		{
			switch (get_pcvar_num(cvar_zombiepainfree))
			{
				case 0: return;
				case 2: if (!g_lastzombie[victim]) return;
				case 3: if (!g_firstzombie[victim]) return;
			}
		}
	}
	else
	{
		if (g_survivor[victim])
		{
			if (!get_pcvar_num(cvar_survpainfree)) return;
		}
		else if (g_sniper[victim])
		{
			if (!get_pcvar_num(cvar_snipainfree)) return;
		}
		
		else return;
	}
	
	// Prevent server crash if entity's private data not initalized
	if (pev_valid(victim) != PDATA_SAFE)
		return;
	
	// Set pain shock free offset
	set_pdata_float(victim, OFFSET_PAINSHOCK, 1.0, OFFSET_LINUX)
}

// Ham Trace Attack Forward
public fw_TraceAttack(victim, attacker, Float:damage, Float:direction[3], tracehandle, damage_type)
{
	// Non-player damage or self damage
	if (victim == attacker || !is_user_valid_connected(attacker))
		return HAM_IGNORED;
	
	// New round starting or round ended
	if (g_newround || g_endround)
		return HAM_SUPERCEDE;
	
	// Victim shouldn't take damage or victim is frozen
	if (g_nodamage[victim] || (g_frozen[victim] && get_pcvar_num(cvar_dmg_while_freeze)))
		return HAM_SUPERCEDE;
	
	// Prevent friendly fire
	if (g_zombie[attacker] == g_zombie[victim])
		return HAM_SUPERCEDE;
	
	// Victim isn't a zombie or not bullet damage, nothing else to do here
	if (!g_zombie[victim] || !(damage_type & DMG_BULLET))
		return HAM_IGNORED;
	
	// If zombie hitzones are enabled, check whether we hit an allowed one
	if (get_pcvar_num(cvar_hitzones) && !g_nemesis[victim] && !g_assassin[victim] && !(get_pcvar_num(cvar_hitzones) & (1<<get_tr2(tracehandle, TR_iHitgroup))))
		return HAM_SUPERCEDE;
	
	// Knockback disabled, nothing else to do here
	if (!get_pcvar_num(cvar_knockback))
		return HAM_IGNORED;
	
	// Nemesis knockback disabled, nothing else to do here
	if (g_nemesis[victim] && get_pcvar_float(cvar_nemknockback) == 0.0)
		return HAM_IGNORED;
		
	// Assassin knockback disabled, nothing else to do here
	if (g_assassin[victim] && get_pcvar_float(cvar_assaknockback) == 0.0)
		return HAM_IGNORED;
	
	// Get whether the victim is in a crouch state
	static ducking
	ducking = pev(victim, pev_flags) & (FL_DUCKING | FL_ONGROUND) == (FL_DUCKING | FL_ONGROUND)
	
	// Zombie knockback when ducking disabled
	if (ducking && get_pcvar_float(cvar_knockbackducking) == 0.0)
		return HAM_IGNORED;
	
	// Get distance between players
	static origin1[3], origin2[3]
	get_user_origin(victim, origin1)
	get_user_origin(attacker, origin2)
	
	// Max distance exceeded
	if (get_distance(origin1, origin2) > get_pcvar_num(cvar_knockbackdist))
		return HAM_IGNORED;
	
	// Get victim's velocity
	static Float:velocity[3]
	pev(victim, pev_velocity, velocity)
	
	// Use damage on knockback calculation
	if (get_pcvar_num(cvar_knockbackdamage))
		xs_vec_mul_scalar(direction, damage, direction)
	
	// Use weapon power on knockback calculation
	if (get_pcvar_num(cvar_knockbackpower) && kb_weapon_power[g_currentweapon[attacker]] > 0.0)
		xs_vec_mul_scalar(direction, kb_weapon_power[g_currentweapon[attacker]], direction)
	
	// Apply ducking knockback multiplier
	if (ducking)
		xs_vec_mul_scalar(direction, get_pcvar_float(cvar_knockbackducking), direction)
	
	// Apply zombie class/nemesis knockback multiplier
	if (g_nemesis[victim])
		xs_vec_mul_scalar(direction, get_pcvar_float(cvar_nemknockback), direction)
	else if (g_assassin[victim])
		xs_vec_mul_scalar(direction, get_pcvar_float(cvar_assaknockback), direction)
	else
		xs_vec_mul_scalar(direction, g_zombie_knockback[victim], direction)
	
	// Add up the new vector
	xs_vec_add(velocity, direction, direction)
	
	// Should knockback also affect vertical velocity?
	if (!get_pcvar_num(cvar_knockbackzvel))
		direction[2] = velocity[2]
	
	// Set the knockback'd victim's velocity
	set_pev(victim, pev_velocity, direction)
	
	return HAM_IGNORED;
}

// Ham Reset MaxSpeed Post Forward
public fw_ResetMaxSpeed_Post(id)
{
	// Freezetime active or player not alive
	if (g_freezetime || !g_isalive[id])
		return;
	
	set_player_maxspeed(id)
}

// Ham Use Stationary Gun Forward
public fw_UseStationary(entity, caller, activator, use_type)
{
	// Prevent zombies from using stationary guns
	if (use_type == USE_USING && is_user_valid_connected(caller) && g_zombie[caller])
		return HAM_SUPERCEDE;
	
	return HAM_IGNORED;
}

// Ham Use Stationary Gun Post Forward
public fw_UseStationary_Post(entity, caller, activator, use_type)
{
	// Someone stopped using a stationary gun
	if (use_type == USE_STOPPED && is_user_valid_connected(caller))
		replace_weapon_models(caller, g_currentweapon[caller]) // replace weapon models (bugfix)
}

// Ham Use Pushable Forward
public fw_UsePushable()
{
	// Prevent speed bug with pushables?
	if (get_pcvar_num(cvar_blockpushables))
		return HAM_SUPERCEDE;
	
	return HAM_IGNORED;
}

// Ham Weapon Touch Forward
public fw_TouchWeapon(weapon, id)
{
	// Not a player
	if (!is_user_valid_connected(id))
		return HAM_IGNORED;
	
	// Dont pickup weapons if zombie or survivor (+PODBot MM fix)
	if (g_zombie[id] || g_isbot[id] || ((g_survivor[id] || g_sniper[id]) && (g_isbot[id] || g_isalive[id])))
		return HAM_SUPERCEDE;
	
	return HAM_IGNORED;
}

// Ham Weapon Pickup Forward
public fw_AddPlayerItem(id, weapon_ent)
{
	// HACK: Retrieve our custom extra ammo from the weapon
	static extra_ammo
	extra_ammo = pev(weapon_ent, PEV_ADDITIONAL_AMMO)
	
	// If present
	if (extra_ammo)
	{
		// Get weapon's id
		static weaponid
		weaponid = cs_get_weapon_id(weapon_ent)
		
		// Add to player's bpammo
		ExecuteHamB(Ham_GiveAmmo, id, extra_ammo, AMMOTYPE[weaponid], MAXBPAMMO[weaponid])
		set_pev(weapon_ent, PEV_ADDITIONAL_AMMO, 0)
	}
}

// Ham Weapon Deploy Forward
public fw_Item_Deploy_Post(weapon_ent)
{
	// Get weapon's owner
	static owner
	owner = fm_cs_get_weapon_ent_owner(weapon_ent)
	
	// Valid owner?
	if (!pev_valid(owner))
		return;
	
	// Get weapon's id
	static weaponid
	weaponid = cs_get_weapon_id(weapon_ent)
	
	// Store current weapon's id for reference
	g_currentweapon[owner] = weaponid
	
	// Replace weapon models with custom ones
	replace_weapon_models(owner, weaponid)
	
	// Zombie not holding an allowed weapon for some reason
	if (g_zombie[owner] && !((1<<weaponid) & ZOMBIE_ALLOWED_WEAPONS_BITSUM))
	{
		// Switch to knife
		g_currentweapon[owner] = CSW_KNIFE
		engclient_cmd(owner, "weapon_knife")
	}
}

// WeaponMod bugfix
//forward wpn_gi_reset_weapon(id);
public wpn_gi_reset_weapon(id)
{
	// Replace knife model
	replace_weapon_models(id, CSW_KNIFE)
}

// Client joins the game
public client_putinserver(id)
{
	// Plugin disabled?
	if (!g_pluginenabled) return;
	
	// Player joined
	g_isconnected[id] = true
	
	// Cache player's name
	get_user_name(id, g_playername[id], charsmax(g_playername[]))
	
	// Initialize player vars
	reset_vars(id, 1)
	
	// Load player stats?
	if (get_pcvar_num(cvar_statssave)) load_stats(id)
	
	// Set some tasks for humans only
	if (!is_user_bot(id))
	{
		// Set the custom HUD display task if enabled
		if (get_pcvar_num(cvar_huddisplay))
			set_task(1.0, "ShowHUD", id+TASK_SHOWHUD, _, _, "b")
		
		// Disable minmodels for clients to see zombies properly
		set_task(5.0, "disable_minmodels", id)
	}
	else
	{
		// Set bot flag
		g_isbot[id] = true
		
		// CZ bots seem to use a different "classtype" for player entities
		// (or something like that) which needs to be hooked separately
		if (!g_hamczbots && cvar_botquota)
		{
			// Set a task to let the private data initialize
			set_task(0.1, "register_ham_czbots", id)
		}
	}
}

// Client leaving
public fw_ClientDisconnect(id)
{
	// Check that we still have both humans and zombies to keep the round going
	if (g_isalive[id]) check_round(id)
	
	// Temporarily save player stats?
	if (get_pcvar_num(cvar_statssave)) save_stats(id)
	
	// Remove previous tasks
	remove_task(id+TASK_TEAM)
	remove_task(id+TASK_MODEL)
	remove_task(id+TASK_FLASH)
	remove_task(id+TASK_CHARGE)
	remove_task(id+TASK_SPAWN)
	remove_task(id+TASK_BLOOD)
	remove_task(id+TASK_AURA)
	remove_task(id+TASK_BURN)
	remove_task(id+TASK_NVISION)
	remove_task(id+TASK_SHOWHUD)
	
	if (g_handle_models_on_separate_ent)
	{
		// Remove custom model entities
		fm_remove_model_ents(id)
	}
	
	// Player left, clear cached flags
	g_isconnected[id] = false
	g_isbot[id] = false
	g_isalive[id] = false
}

// Client left
public fw_ClientDisconnect_Post()
{
	// Last Zombie Check
	fnCheckLastZombie()
}

// Client Kill Forward
public fw_ClientKill()
{
	// Prevent players from killing themselves?
	if (get_pcvar_num(cvar_blocksuicide))
		return FMRES_SUPERCEDE;
	
	return FMRES_IGNORED;
}

// Emit Sound Forward
public fw_EmitSound(id, channel, const sample[], Float:volume, Float:attn, flags, pitch)
{
	// Block all those unneeeded hostage sounds
	if (sample[0] == 'h' && sample[1] == 'o' && sample[2] == 's' && sample[3] == 't' && sample[4] == 'a' && sample[5] == 'g' && sample[6] == 'e')
		return FMRES_SUPERCEDE;
	
	// Replace these next sounds for zombies only
	if (!is_user_valid_connected(id) || !g_zombie[id])
		return FMRES_IGNORED;
	
	static sound[64]
	
	// Zombie being hit
	if (sample[7] == 'b' && sample[8] == 'h' && sample[9] == 'i' && sample[10] == 't')
	{
		if (g_nemesis[id])
		{
			ArrayGetString(nemesis_pain, random_num(0, ArraySize(nemesis_pain) - 1), sound, charsmax(sound))
			emit_sound(id, channel, sound, volume, attn, flags, pitch)
		}
		else if (g_assassin[id])
		{
			ArrayGetString(assassin_pain, random_num(0, ArraySize(assassin_pain) - 1), sound, charsmax(sound))
			emit_sound(id, channel, sound, volume, attn, flags, pitch)
		}
		else
		{
			ArrayGetString(zombie_pain, random_num(0, ArraySize(zombie_pain) - 1), sound, charsmax(sound))
			emit_sound(id, channel, sound, volume, attn, flags, pitch)
		}
		return FMRES_SUPERCEDE;
	}
	
	// Zombie attacks with knife
	if (sample[8] == 'k' && sample[9] == 'n' && sample[10] == 'i')
	{
		if (sample[14] == 's' && sample[15] == 'l' && sample[16] == 'a') // slash
		{
			ArrayGetString(zombie_miss_slash, random_num(0, ArraySize(zombie_miss_slash) - 1), sound, charsmax(sound))
			emit_sound(id, channel, sound, volume, attn, flags, pitch)
			return FMRES_SUPERCEDE;
		}
		if (sample[14] == 'h' && sample[15] == 'i' && sample[16] == 't') // hit
		{
			if (sample[17] == 'w') // wall
			{
				ArrayGetString(zombie_miss_wall, random_num(0, ArraySize(zombie_miss_wall) - 1), sound, charsmax(sound))
				emit_sound(id, channel, sound, volume, attn, flags, pitch)
				return FMRES_SUPERCEDE;
			}
			else
			{
				ArrayGetString(zombie_hit_normal, random_num(0, ArraySize(zombie_hit_normal) - 1), sound, charsmax(sound))
				emit_sound(id, channel, sound, volume, attn, flags, pitch)
				return FMRES_SUPERCEDE;
			}
		}
		if (sample[14] == 's' && sample[15] == 't' && sample[16] == 'a') // stab
		{
			ArrayGetString(zombie_hit_stab, random_num(0, ArraySize(zombie_hit_stab) - 1), sound, charsmax(sound))
			emit_sound(id, channel, sound, volume, attn, flags, pitch)
			return FMRES_SUPERCEDE;
		}
	}
	
	// Zombie dies
	if (sample[7] == 'd' && ((sample[8] == 'i' && sample[9] == 'e') || (sample[8] == 'e' && sample[9] == 'a')))
	{
		ArrayGetString(zombie_die, random_num(0, ArraySize(zombie_die) - 1), sound, charsmax(sound))
		emit_sound(id, channel, sound, volume, attn, flags, pitch)
		return FMRES_SUPERCEDE;
	}
	
	// Zombie falls off
	if (sample[10] == 'f' && sample[11] == 'a' && sample[12] == 'l' && sample[13] == 'l')
	{
		ArrayGetString(zombie_fall, random_num(0, ArraySize(zombie_fall) - 1), sound, charsmax(sound))
		emit_sound(id, channel, sound, volume, attn, flags, pitch)
		return FMRES_SUPERCEDE;
	}
	
	return FMRES_IGNORED;
}

// Forward Set ClientKey Value -prevent CS from changing player models-
public fw_SetClientKeyValue(id, const infobuffer[], const key[])
{
	// Block CS model changes
	if (key[0] == 'm' && key[1] == 'o' && key[2] == 'd' && key[3] == 'e' && key[4] == 'l')
		return FMRES_SUPERCEDE;
	
	return FMRES_IGNORED;
}

// Forward Client User Info Changed -prevent players from changing models-
public fw_ClientUserInfoChanged(id)
{
	// Cache player's name
	get_user_name(id, g_playername[id], charsmax(g_playername[]))
	
	if (!g_handle_models_on_separate_ent)
	{
		// Get current model
		static currentmodel[32]
		fm_cs_get_user_model(id, currentmodel, charsmax(currentmodel))
		
		// If they're different, set model again
		if (!equal(currentmodel, g_playermodel[id]) && !task_exists(id+TASK_MODEL))
			fm_cs_set_user_model(id+TASK_MODEL)
	}
}

// Forward Get Game Description
public fw_GetGameDescription()
{
	// Return the mod name so it can be easily identified
	forward_return(FMV_STRING, g_modname)
	
	return FMRES_SUPERCEDE;
}

// Forward Set Model
public fw_SetModel(entity, const model[])
{
	// We don't care
	if (strlen(model) < 8)
		return;
	
	// Remove weapons?
	if (get_pcvar_float(cvar_removedropped) > 0.0)
	{
		// Get entity's classname
		static classname[10]
		pev(entity, pev_classname, classname, charsmax(classname))
		
		// Check if it's a weapon box
		if (equal(classname, "weaponbox"))
		{
			// They get automatically removed when thinking
			set_pev(entity, pev_nextthink, get_gametime() + get_pcvar_float(cvar_removedropped))
			return;
		}
	}
	
	// Narrow down our matches a bit
	if (model[7] != 'w' || model[8] != '_')
		return;
	
	// Get damage time of grenade
	static Float:dmgtime
	pev(entity, pev_dmgtime, dmgtime)
	
	// Grenade not yet thrown
	if (dmgtime == 0.0)
		return;
	
	// Get whether grenade's owner is a zombie
	if (g_zombie[pev(entity, pev_owner)])
	{
		if (model[9] == 'h' && model[10] == 'e' && get_pcvar_num(cvar_extrainfbomb)) // Infection Bomb
		{
			// Give it a glow
			fm_set_rendering(entity, kRenderFxGlowShell, 0, 200, 0, kRenderNormal, 16);
			
			// And a colored trail
			message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
			write_byte(TE_BEAMFOLLOW) // TE id
			write_short(entity) // entity
			write_short(g_trailSpr) // sprite
			write_byte(10) // life
			write_byte(10) // width
			write_byte(0) // r
			write_byte(200) // g
			write_byte(0) // b
			write_byte(200) // brightness
			message_end()
			
			// Set grenade type on the thrown grenade entity
			set_pev(entity, PEV_NADE_TYPE, NADE_TYPE_INFECTION)
		}
	}
	else if (model[9] == 'h' && model[10] == 'e' && get_pcvar_num(cvar_firegrenades)) // Napalm Grenade
	{
		// Give it a glow
		fm_set_rendering(entity, kRenderFxGlowShell, 200, 0, 0, kRenderNormal, 16);
		
		// And a colored trail
		message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
		write_byte(TE_BEAMFOLLOW) // TE id
		write_short(entity) // entity
		write_short(g_trailSpr) // sprite
		write_byte(10) // life
		write_byte(10) // width
		write_byte(200) // r
		write_byte(0) // g
		write_byte(0) // b
		write_byte(200) // brightness
		message_end()
		
		// Set grenade type on the thrown grenade entity
		set_pev(entity, PEV_NADE_TYPE, NADE_TYPE_NAPALM)
	}
	else if (model[9] == 'f' && model[10] == 'l' && get_pcvar_num(cvar_frostgrenades)) // Frost Grenade
	{
		// Give it a glow
		fm_set_rendering(entity, kRenderFxGlowShell, 0, 100, 200, kRenderNormal, 16);
		
		// And a colored trail
		message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
		write_byte(TE_BEAMFOLLOW) // TE id
		write_short(entity) // entity
		write_short(g_trailSpr) // sprite
		write_byte(10) // life
		write_byte(10) // width
		write_byte(0) // r
		write_byte(100) // g
		write_byte(200) // b
		write_byte(200) // brightness
		message_end()
		
		// Set grenade type on the thrown grenade entity
		set_pev(entity, PEV_NADE_TYPE, NADE_TYPE_FROST)
	}
	else if (model[9] == 's' && model[10] == 'm' && get_pcvar_num(cvar_flaregrenades)) // Flare
	{
		// Build flare's color
		static rgb[3]
		switch (get_pcvar_num(cvar_flarecolor))
		{
			case 0: // white
			{
				rgb[0] = 255 // r
				rgb[1] = 255 // g
				rgb[2] = 255 // b
			}
			case 1: // red
			{
				rgb[0] = random_num(50,255) // r
				rgb[1] = 0 // g
				rgb[2] = 0 // b
			}
			case 2: // green
			{
				rgb[0] = 0 // r
				rgb[1] = random_num(50,255) // g
				rgb[2] = 0 // b
			}
			case 3: // blue
			{
				rgb[0] = 0 // r
				rgb[1] = 0 // g
				rgb[2] = random_num(50,255) // b
			}
			case 4: // random (all colors)
			{
				rgb[0] = random_num(50,200) // r
				rgb[1] = random_num(50,200) // g
				rgb[2] = random_num(50,200) // b
			}
			case 5: // random (r,g,b)
			{
				switch (random_num(1, 3))
				{
					case 1: // red
					{
						rgb[0] = random_num(50,255) // r
						rgb[1] = 0 // g
						rgb[2] = 0 // b
					}
					case 2: // green
					{
						rgb[0] = 0 // r
						rgb[1] = random_num(50,255) // g
						rgb[2] = 0 // b
					}
					case 3: // blue
					{
						rgb[0] = 0 // r
						rgb[1] = 0 // g
						rgb[2] = random_num(50,255) // b
					}
				}
			}
		}
		
		// Give it a glow
		fm_set_rendering(entity, kRenderFxGlowShell, rgb[0], rgb[1], rgb[2], kRenderNormal, 16);
		
		// And a colored trail
		message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
		write_byte(TE_BEAMFOLLOW) // TE id
		write_short(entity) // entity
		write_short(g_trailSpr) // sprite
		write_byte(10) // life
		write_byte(10) // width
		write_byte(rgb[0]) // r
		write_byte(rgb[1]) // g
		write_byte(rgb[2]) // b
		write_byte(200) // brightness
		message_end()
		
		// Set grenade type on the thrown grenade entity
		set_pev(entity, PEV_NADE_TYPE, NADE_TYPE_FLARE)
		
		// Set flare color on the thrown grenade entity
		set_pev(entity, PEV_FLARE_COLOR, rgb)
	}
}

// Ham Grenade Think Forward
public fw_ThinkGrenade(entity)
{
	// Invalid entity
	if (!pev_valid(entity)) return HAM_IGNORED;
	
	// Get damage time of grenade
	static Float:dmgtime, Float:current_time
	pev(entity, pev_dmgtime, dmgtime)
	current_time = get_gametime()
	
	// Check if it's time to go off
	if (dmgtime > current_time)
		return HAM_IGNORED;
	
	// Check if it's one of our custom nades
	switch (pev(entity, PEV_NADE_TYPE))
	{
		case NADE_TYPE_INFECTION: // Infection Bomb
		{
			infection_explode(entity)
			return HAM_SUPERCEDE;
		}
		case NADE_TYPE_NAPALM: // Napalm Grenade
		{
			fire_explode(entity)
			return HAM_SUPERCEDE;
		}
		case NADE_TYPE_FROST: // Frost Grenade
		{
			frost_explode(entity)
			return HAM_SUPERCEDE;
		}
		case NADE_TYPE_FLARE: // Flare
		{
			// Get its duration
			static duration
			duration = pev(entity, PEV_FLARE_DURATION)
			
			// Already went off, do lighting loop for the duration of PEV_FLARE_DURATION
			if (duration > 0)
			{
				// Check whether this is the last loop
				if (duration == 1)
				{
					// Get rid of the flare entity
					engfunc(EngFunc_RemoveEntity, entity)
					return HAM_SUPERCEDE;
				}
				
				// Light it up!
				flare_lighting(entity, duration)
				
				// Set time for next loop
				set_pev(entity, PEV_FLARE_DURATION, --duration)
				set_pev(entity, pev_dmgtime, current_time + 2.0)
			}
			// Light up when it's stopped on ground
			else if ((pev(entity, pev_flags) & FL_ONGROUND) && fm_get_speed(entity) < 10)
			{
				// Flare sound
				static sound[64]
				ArrayGetString(grenade_flare, random_num(0, ArraySize(grenade_flare) - 1), sound, charsmax(sound))
				emit_sound(entity, CHAN_WEAPON, sound, 1.0, ATTN_NORM, 0, PITCH_NORM)
				
				// Set duration and start lightning loop on next think
				set_pev(entity, PEV_FLARE_DURATION, 1 + get_pcvar_num(cvar_flareduration)/2)
				set_pev(entity, pev_dmgtime, current_time + 0.1)
			}
			else
			{
				// Delay explosion until we hit ground
				set_pev(entity, pev_dmgtime, current_time + 0.5)
			}
		}
	}
	
	return HAM_IGNORED;
}

// Forward CmdStart
public fw_CmdStart(id, handle)
{
	// Not alive
	if (!g_isalive[id])
		return;
	
	// This logic looks kinda weird, but it should work in theory...
	// p = g_zombie[id], q = g_survivor[id], r = g_cached_customflash
	// ¬(p v q v (¬p ^ r)) <==> ¬p ^ ¬q ^ (p v ¬r)
	if (!g_zombie[id] && !g_survivor[id] && !g_sniper[id] && (g_zombie[id] || !g_cached_customflash))
		return;
	
	// Check if it's a flashlight impulse
	if (get_uc(handle, UC_Impulse) != IMPULSE_FLASHLIGHT)
		return;
	
	// Block it I say!
	set_uc(handle, UC_Impulse, 0)
	
	// Should human's custom flashlight be turned on?
	if (!g_zombie[id] && !g_survivor[id] && !g_sniper[id] && g_flashbattery[id] > 2 && get_gametime() - g_lastflashtime[id] > 1.2)
	{
		// Prevent calling flashlight too quickly (bugfix)
		g_lastflashtime[id] = get_gametime()
		
		// Toggle custom flashlight
		g_flashlight[id] = !(g_flashlight[id])
		
		// Play flashlight toggle sound
		emit_sound(id, CHAN_ITEM, sound_flashlight, 1.0, ATTN_NORM, 0, PITCH_NORM)
		
		// Update flashlight status on the HUD
		message_begin(MSG_ONE, g_msgFlashlight, _, id)
		write_byte(g_flashlight[id]) // toggle
		write_byte(g_flashbattery[id]) // battery
		message_end()
		
		// Remove previous tasks
		remove_task(id+TASK_CHARGE)
		remove_task(id+TASK_FLASH)
		
		// Set the flashlight charge task
		set_task(1.0, "flashlight_charge", id+TASK_CHARGE, _, _, "b")
		
		// Call our custom flashlight task if enabled
		if (g_flashlight[id]) set_task(0.1, "set_user_flashlight", id+TASK_FLASH, _, _, "b")
	}
}

// Forward Player PreThink
public fw_PlayerPreThink(id)
{
	// Not alive
	if (!g_isalive[id])
		return;
	
	// Enable custom buyzone for player during buytime, unless zombie or survivor or time expired
	if (g_cached_buytime > 0.0 && !g_zombie[id] && !g_survivor[id] && (get_gametime() < g_buytime[id] + g_cached_buytime))
	{
		if (pev_valid(g_buyzone_ent))
			dllfunc(DLLFunc_Touch, g_buyzone_ent, id)
	}
	
	// Silent footsteps for zombies?
	if (g_cached_zombiesilent && g_zombie[id] && !g_nemesis[id] && g_assassin[id])
		set_pev(id, pev_flTimeStepSound, STEPTIME_SILENT)
	
	// Player frozen?
	if (g_frozen[id])
	{
		set_pev(id, pev_velocity, Float:{0.0,0.0,0.0}) // stop motion
		return; // shouldn't leap while frozen
	}
	
	// --- Check if player should leap ---
	
	// Don't allow leap during freezetime
	if (g_freezetime)
		return;
	
	// Check if proper CVARs are enabled and retrieve leap settings
	static Float:cooldown, Float:current_time
	if (g_zombie[id])
	{
		if (g_nemesis[id])
		{
			if (!g_cached_leapnemesis) return;
			cooldown = g_cached_leapnemesiscooldown
		}
		else if (g_assassin[id])
		{
			if (!g_cached_leapassassin) return;
			cooldown = g_cached_leapassassincooldown
		}
		else
		{
			switch (g_cached_leapzombies)
			{
				case 0: return;
				case 2: if (!g_firstzombie[id]) return;
				case 3: if (!g_lastzombie[id]) return;
			}
			cooldown = g_cached_leapzombiescooldown
		}
	}
	else
	{
		if (g_survivor[id])
		{
			if (!g_cached_leapsurvivor) return;
			cooldown = g_cached_leapsurvivorcooldown
		}
		else if (g_sniper[id])
		{
			if (!g_cached_leapsniper) return;
			cooldown = g_cached_leapsnipercooldown
		}
		else return;
	}
	
	current_time = get_gametime()
	
	// Cooldown not over yet
	if (current_time - g_lastleaptime[id] < cooldown)
		return;
	
	// Not doing a longjump (don't perform check for bots, they leap automatically)
	if (!g_isbot[id] && !(pev(id, pev_button) & (IN_JUMP | IN_DUCK) == (IN_JUMP | IN_DUCK)))
		return;
	
	// Not on ground or not enough speed
	if (!(pev(id, pev_flags) & FL_ONGROUND) || fm_get_speed(id) < 80)
		return;
	
	static Float:velocity[3]
	
	// Make velocity vector
	velocity_by_aim(id, g_survivor[id] ? get_pcvar_num(cvar_leapsurvivorforce) : g_sniper[id] ? get_pcvar_num(cvar_leapsniperforce) : g_nemesis[id] ? get_pcvar_num(cvar_leapnemesisforce) : g_assassin[id] ? get_pcvar_num(cvar_leapassassinforce) : get_pcvar_num(cvar_leapzombiesforce), velocity)
	
	// Set custom height
	velocity[2] = g_survivor[id] ? get_pcvar_float(cvar_leapsurvivorheight) : g_sniper[id] ? get_pcvar_float(cvar_leapsniperheight) : g_nemesis[id] ? get_pcvar_float(cvar_leapnemesisheight) : g_assassin[id] ? get_pcvar_float(cvar_leapassassinheight) : get_pcvar_float(cvar_leapzombiesheight)
	
	// Apply the new velocity
	set_pev(id, pev_velocity, velocity)
	
	// Update last leap time
	g_lastleaptime[id] = current_time
}

/*================================================================================
 [Client Commands]
=================================================================================*/

// Say "/zpmenu"
public clcmd_saymenu(id)
{
	show_menu_game(id) // show game menu
}

// Say "/unstuck"
public clcmd_sayunstuck(id)
{
	menu_game(id, 3) // try to get unstuck
}

// Nightvision toggle
public clcmd_nightvision(id)
{
	// Nightvision available to player?
	if (g_nvision[id] || (g_isalive[id] && cs_get_user_nvg(id)))
	{
		// Enable-disable
		g_nvisionenabled[id] = !(g_nvisionenabled[id])
		
		// Custom nvg?
		if (get_pcvar_num(cvar_customnvg))
		{
			remove_task(id+TASK_NVISION)
			if (g_nvisionenabled[id]) set_task(0.1, "set_user_nvision", id+TASK_NVISION, _, _, "b")
		}
		else
			set_user_gnvision(id, g_nvisionenabled[id])
	}
	
	return PLUGIN_HANDLED;
}

// Weapon Drop
public clcmd_drop(id)
{
	// Survivor should stick with its weapon
	if (g_survivor[id] || g_sniper[id])
		return PLUGIN_HANDLED;
	
	return PLUGIN_CONTINUE;
}

// Buy BP Ammo
public clcmd_buyammo(id)
{
	// Not alive or infinite ammo setting enabled
	if (!g_isalive[id] || get_pcvar_num(cvar_infammo))
		return PLUGIN_HANDLED;
	
	// Not human
	if (g_zombie[id])
	{
		zp_colored_print(id, "^x04[ZP]^x01 %L", id, "CMD_HUMAN_ONLY")
		return PLUGIN_HANDLED;
	}
	
	// Custom buytime enabled and human player standing in buyzone, allow buying weapon's ammo normally instead
	if (g_cached_buytime > 0.0 && !g_survivor[id] && !g_sniper[id] && (get_gametime() < g_buytime[id] + g_cached_buytime) && cs_get_user_buyzone(id))
		return PLUGIN_CONTINUE;
	
	// Not enough ammo packs
	if (g_ammopacks[id] < 1)
	{
		zp_colored_print(id, "^x04[ZP]^x01 %L", id, "NOT_ENOUGH_AMMO")
		return PLUGIN_HANDLED;
	}
	
	// Get user weapons
	static weapons[32], num, i, currentammo, weaponid, refilled
	num = 0 // reset passed weapons count (bugfix)
	refilled = false
	get_user_weapons(id, weapons, num)
	
	// Loop through them and give the right ammo type
	for (i = 0; i < num; i++)
	{
		// Prevents re-indexing the array
		weaponid = weapons[i]
		
		// Primary and secondary only
		if (MAXBPAMMO[weaponid] > 2)
		{
			// Get current ammo of the weapon
			currentammo = cs_get_user_bpammo(id, weaponid)
			
			// Give additional ammo
			ExecuteHamB(Ham_GiveAmmo, id, BUYAMMO[weaponid], AMMOTYPE[weaponid], MAXBPAMMO[weaponid])
			
			// Check whether we actually refilled the weapon's ammo
			if (cs_get_user_bpammo(id, weaponid) - currentammo > 0) refilled = true
		}
	}
	
	// Weapons already have full ammo
	if (!refilled) return PLUGIN_HANDLED;
	
	// Deduce ammo packs, play clip purchase sound, and notify player
	g_ammopacks[id]--
	emit_sound(id, CHAN_ITEM, sound_buyammo, 1.0, ATTN_NORM, 0, PITCH_NORM)
	zp_colored_print(id, "^x04[ZP]^x01 %L", id, "AMMO_BOUGHT")
	
	return PLUGIN_HANDLED;
}

// Block Team Change
public clcmd_changeteam(id)
{
	static team
	team = fm_cs_get_user_team(id)
	
	// Unless it's a spectator joining the game
	if (team == FM_CS_TEAM_SPECTATOR || team == FM_CS_TEAM_UNASSIGNED)
		return PLUGIN_CONTINUE;
	
	// Pressing 'M' (chooseteam) ingame should show the main menu instead
	show_menu_game(id)
	return PLUGIN_HANDLED;
}

/*================================================================================
 [Menus]
=================================================================================*/

// Game Menu
show_menu_game(id)
{
	// Player disconnected?
	if (!g_isconnected[id])
		return;
	
	static menu[250], len, userflags
	len = 0
	userflags = get_user_flags(id)
	
	// Title
	len += formatex(menu[len], charsmax(menu) - len, "\y%s^n^n", g_modname)
	
	// 1. Buy weapons
	if (get_pcvar_num(cvar_buycustom))
		len += formatex(menu[len], charsmax(menu) - len, "\r1.\w %L^n", id, "MENU_BUY")
	else
		len += formatex(menu[len], charsmax(menu) - len, "\d1. %L^n", id, "MENU_BUY")
	
	// 2. Extra items
	if (get_pcvar_num(cvar_extraitems) && g_isalive[id])
		len += formatex(menu[len], charsmax(menu) - len, "\r2.\w %L^n", id, "MENU_EXTRABUY")
	else
		len += formatex(menu[len], charsmax(menu) - len, "\d2. %L^n", id, "MENU_EXTRABUY")
	
	// 3. Zombie class
	if (get_pcvar_num(cvar_zclasses))
		len += formatex(menu[len], charsmax(menu) - len, "\r3.\w %L^n", id,"MENU_ZCLASS")
	else
		len += formatex(menu[len], charsmax(menu) - len, "\d3. %L^n", id,"MENU_ZCLASS")
	
	// 4. Unstuck
	if (g_isalive[id])
		len += formatex(menu[len], charsmax(menu) - len, "\r4.\w %L^n", id, "MENU_UNSTUCK")
	else
		len += formatex(menu[len], charsmax(menu) - len, "\d4. %L^n", id, "MENU_UNSTUCK")
	
	// 5. Help
	len += formatex(menu[len], charsmax(menu) - len, "\r5.\w %L^n^n", id, "MENU_INFO")
	
	// 6. Join spec
	if (!g_isalive[id] || !get_pcvar_num(cvar_blocksuicide) || (userflags & g_access_flag[ACCESS_ADMIN_MENU]))
		len += formatex(menu[len], charsmax(menu) - len, "\r6.\w %L^n^n", id, "MENU_SPECTATOR")
	else
		len += formatex(menu[len], charsmax(menu) - len, "\d6. %L^n^n", id, "MENU_SPECTATOR")
	
	// 9. Admin menu
	if (userflags & g_access_flag[ACCESS_ADMIN_MENU])
		len += formatex(menu[len], charsmax(menu) - len, "\r9.\w %L", id, "MENU_ADMIN")
	else
		len += formatex(menu[len], charsmax(menu) - len, "\d9. %L", id, "MENU_ADMIN")
	
	// 0. Exit
	len += formatex(menu[len], charsmax(menu) - len, "^n^n\r0.\w %L", id, "MENU_EXIT")
	
	// Fix for AMXX custom menus
	if (pev_valid(id) == PDATA_SAFE)
		set_pdata_int(id, OFFSET_CSMENUCODE, 0, OFFSET_LINUX)
	
	show_menu(id, KEYSMENU, menu, -1, "Game Menu")
}

// Buy Menu 1
public show_menu_buy1(taskid)
{
	// Get player's id
	static id
	(taskid > g_maxplayers) ? (id = ID_SPAWN) : (id = taskid);
	
	// Player dead?
	if (!g_isalive[id])
		return;
	
	// Zombies or survivors get no guns
	if (g_zombie[id] || g_survivor[id] || g_sniper[id])
		return;
	
	// Bots pick their weapons randomly / Random weapons setting enabled
	if (get_pcvar_num(cvar_randweapons) || g_isbot[id])
	{
		buy_primary_weapon(id, random_num(0, ArraySize(g_primary_items) - 1))
		menu_buy2(id, random_num(0, ArraySize(g_secondary_items) - 1))
		return;
	}
	
	// Automatic selection enabled for player and menu called on spawn event
	if (WPN_AUTO_ON && taskid > g_maxplayers)
	{
		buy_primary_weapon(id, WPN_AUTO_PRI)
		menu_buy2(id, WPN_AUTO_SEC)
		return;
	}
	
	static menu[300], len, weap, maxloops
	len = 0
	maxloops = min(WPN_STARTID+7, WPN_MAXIDS)
	
	// Title
	len += formatex(menu[len], charsmax(menu) - len, "\y%L \r[%d-%d]^n^n", id, "MENU_BUY1_TITLE", WPN_STARTID+1, min(WPN_STARTID+7, WPN_MAXIDS))
	
	// 1-7. Weapon List
	for (weap = WPN_STARTID; weap < maxloops; weap++)
		len += formatex(menu[len], charsmax(menu) - len, "\r%d.\w %s^n", weap-WPN_STARTID+1, WEAPONNAMES[ArrayGetCell(g_primary_weaponids, weap)])
	
	// 8. Auto Select
	len += formatex(menu[len], charsmax(menu) - len, "^n\r8.\w %L \y[%L]", id, "MENU_AUTOSELECT", id, (WPN_AUTO_ON) ? "MOTD_ENABLED" : "MOTD_DISABLED")
	
	// 9. Next/Back - 0. Exit
	len += formatex(menu[len], charsmax(menu) - len, "^n^n\r9.\w %L/%L^n^n\r0.\w %L", id, "MENU_NEXT", id, "MENU_BACK", id, "MENU_EXIT")
	
	// Fix for AMXX custom menus
	if (pev_valid(id) == PDATA_SAFE)
		set_pdata_int(id, OFFSET_CSMENUCODE, 0, OFFSET_LINUX)
	
	show_menu(id, KEYSMENU, menu, -1, "Buy Menu 1")
}

// Buy Menu 2
show_menu_buy2(id)
{
	// Player dead?
	if (!g_isalive[id])
		return;
	
	static menu[250], len, weap, maxloops
	len = 0
	maxloops = ArraySize(g_secondary_items)
	
	// Title
	len += formatex(menu[len], charsmax(menu) - len, "\y%L^n", id, "MENU_BUY2_TITLE")
	
	// 1-6. Weapon List
	for (weap = 0; weap < maxloops; weap++)
		len += formatex(menu[len], charsmax(menu) - len, "^n\r%d.\w %s", weap+1, WEAPONNAMES[ArrayGetCell(g_secondary_weaponids, weap)])
	
	// 8. Auto Select
	len += formatex(menu[len], charsmax(menu) - len, "^n^n\r8.\w %L \y[%L]", id, "MENU_AUTOSELECT", id, (WPN_AUTO_ON) ? "MOTD_ENABLED" : "MOTD_DISABLED")
	
	// 0. Exit
	len += formatex(menu[len], charsmax(menu) - len, "^n^n\r0.\w %L", id, "MENU_EXIT")
	
	// Fix for AMXX custom menus
	if (pev_valid(id) == PDATA_SAFE)
		set_pdata_int(id, OFFSET_CSMENUCODE, 0, OFFSET_LINUX)
	
	show_menu(id, KEYSMENU, menu, -1, "Buy Menu 2")
}

// Extra Items Menu
show_menu_extras(id)
{
	// Player dead?
	if (!g_isalive[id])
		return;
	
	static menuid, menu[128], item, team, buffer[32]
	
	// Title
	formatex(menu, charsmax(menu), "%L [%L]\r", id, "MENU_EXTRA_TITLE", id, g_nemesis[id] ? "CLASS_NEMESIS" : g_assassin[id] ? "CLASS_ASSASSIN" : g_zombie[id] ? "CLASS_ZOMBIE" : g_survivor[id] ? "CLASS_SURVIVOR" : g_sniper[id] ? "CLASS_SNIPER" : "CLASS_HUMAN")
	menuid = menu_create(menu, "menu_extras")
	
	// Item List
	for (item = 0; item < g_extraitem_i; item++)
	{
		// Retrieve item's team
		team = ArrayGetCell(g_extraitem_team, item)
		
		// Item not available to player's team/class
		if ((g_zombie[id] && !g_nemesis[id] && !g_assassin[id] && !(team & ZP_TEAM_ZOMBIE)) || (!g_zombie[id] && !g_survivor[id] && !g_sniper[id] && !(team & ZP_TEAM_HUMAN)) || (g_nemesis[id] && !(team & ZP_TEAM_NEMESIS)) || (g_assassin[id] && !(team & ZP_TEAM_ASSASSIN)) || (g_survivor[id] && !(team & ZP_TEAM_SURVIVOR)) || (g_sniper[id] && !(team & ZP_TEAM_SNIPER)))
			continue;
		
		// Check if it's one of the hardcoded items, check availability, set translated caption
		switch (item)
		{
			case EXTRA_NVISION:
			{
				if (!get_pcvar_num(cvar_extranvision)) continue;
				formatex(buffer, charsmax(buffer), "%L", id, "MENU_EXTRA1")
			}
			case EXTRA_ANTIDOTE:
			{
				if (!get_pcvar_num(cvar_extraantidote) || g_antidotecounter >= get_pcvar_num(cvar_antidotelimit)) continue;
				formatex(buffer, charsmax(buffer), "%L", id, "MENU_EXTRA2")
			}
			case EXTRA_MADNESS:
			{
				if (!get_pcvar_num(cvar_extramadness) || g_madnesscounter >= get_pcvar_num(cvar_madnesslimit)) continue;
				formatex(buffer, charsmax(buffer), "%L", id, "MENU_EXTRA3")
			}
			case EXTRA_INFBOMB:
			{
				if (!get_pcvar_num(cvar_extrainfbomb) || g_infbombcounter >= get_pcvar_num(cvar_infbomblimit)) continue;
				formatex(buffer, charsmax(buffer), "%L", id, "MENU_EXTRA4")
			}
			default:
			{
				if (item >= EXTRA_WEAPONS_STARTID && item <= EXTRAS_CUSTOM_STARTID-1 && !get_pcvar_num(cvar_extraweapons)) continue;
				ArrayGetString(g_extraitem_name, item, buffer, charsmax(buffer))
			}
		}
		
		// Add Item Name and Cost
		formatex(menu, charsmax(menu), "%s \y%d %L", buffer, ArrayGetCell(g_extraitem_cost, item), id, "AMMO_PACKS2")
		buffer[0] = item
		buffer[1] = 0
		menu_additem(menuid, menu, buffer)
	}
	
	// No items to display?
	if (menu_items(menuid) <= 0)
	{
		zp_colored_print(id, "^x04[ZP]^x01 %L", id ,"CMD_NOT_EXTRAS")
		menu_destroy(menuid)
		return;
	}
	
	// Back - Next - Exit
	formatex(menu, charsmax(menu), "%L", id, "MENU_BACK")
	menu_setprop(menuid, MPROP_BACKNAME, menu)
	formatex(menu, charsmax(menu), "%L", id, "MENU_NEXT")
	menu_setprop(menuid, MPROP_NEXTNAME, menu)
	formatex(menu, charsmax(menu), "%L", id, "MENU_EXIT")
	menu_setprop(menuid, MPROP_EXITNAME, menu)
		
	// If remembered page is greater than number of pages, clamp down the value
	MENU_PAGE_EXTRAS = min(MENU_PAGE_EXTRAS, menu_pages(menuid)-1)
	
	// Fix for AMXX custom menus
	if (pev_valid(id) == PDATA_SAFE)
		set_pdata_int(id, OFFSET_CSMENUCODE, 0, OFFSET_LINUX)
	
	menu_display(id, menuid, MENU_PAGE_EXTRAS)
}

// Zombie Class Menu
public show_menu_zclass(id)
{
	// Player disconnected
	if (!g_isconnected[id])
		return;
	
	// Bots pick their zombie class randomly
	if (g_isbot[id])
	{
		g_zombieclassnext[id] = random_num(0, g_zclass_i - 1)
		return;
	}
	
	static menuid, menu[128], class, buffer[32], buffer2[32]
	
	// Title
	formatex(menu, charsmax(menu), "%L\r", id, "MENU_ZCLASS_TITLE")
	menuid = menu_create(menu, "menu_zclass")
	
	// Class List
	for (class = 0; class < g_zclass_i; class++)
	{
		// Retrieve name and info
		ArrayGetString(g_zclass_name, class, buffer, charsmax(buffer))
		ArrayGetString(g_zclass_info, class, buffer2, charsmax(buffer2))
		
		// Add to menu
		if (class == g_zombieclassnext[id])
			formatex(menu, charsmax(menu), "\d%s %s", buffer, buffer2)
		else
			formatex(menu, charsmax(menu), "%s \y%s", buffer, buffer2)
		
		buffer[0] = class
		buffer[1] = 0
		menu_additem(menuid, menu, buffer)
	}
	
	// Back - Next - Exit
	formatex(menu, charsmax(menu), "%L", id, "MENU_BACK")
	menu_setprop(menuid, MPROP_BACKNAME, menu)
	formatex(menu, charsmax(menu), "%L", id, "MENU_NEXT")
	menu_setprop(menuid, MPROP_NEXTNAME, menu)
	formatex(menu, charsmax(menu), "%L", id, "MENU_EXIT")
	menu_setprop(menuid, MPROP_EXITNAME, menu)
	
	// If remembered page is greater than number of pages, clamp down the value
	MENU_PAGE_ZCLASS = min(MENU_PAGE_ZCLASS, menu_pages(menuid)-1)
	
	// Fix for AMXX custom menus
	if (pev_valid(id) == PDATA_SAFE)
		set_pdata_int(id, OFFSET_CSMENUCODE, 0, OFFSET_LINUX)
	
	menu_display(id, menuid, MENU_PAGE_ZCLASS)
}

// Help Menu
show_menu_info(id)
{
	// Player disconnected?
	if (!g_isconnected[id])
		return;
	
	static menu[150]
	
	formatex(menu, charsmax(menu), "\y%L^n^n\r1.\w %L^n\r2.\w %L^n\r3.\w %L^n\r4.\w %L^n^n\r0.\w %L", id, "MENU_INFO_TITLE", id, "MENU_INFO1", id,"MENU_INFO2", id,"MENU_INFO3", id,"MENU_INFO4", id, "MENU_EXIT")
	
	// Fix for AMXX custom menus
	if (pev_valid(id) == PDATA_SAFE)
		set_pdata_int(id, OFFSET_CSMENUCODE, 0, OFFSET_LINUX)
	
	show_menu(id, KEYSMENU, menu, -1, "Mod Info")
}

// Admin Menu
show_menu_admin(id)
{
	// Player disconnected?
	if (!g_isconnected[id])
		return;
	
	static menu[250], len, userflags
	len = 0
	userflags = get_user_flags(id)
	
	// Title
	len += formatex(menu[len], charsmax(menu) - len, "\y%L^n^n", id, "MENU_ADMIN_TITLE")
	
	// 1. Zombiefy/Humanize command
	if (userflags & (g_access_flag[ACCESS_MODE_INFECTION] | g_access_flag[ACCESS_MAKE_ZOMBIE] | g_access_flag[ACCESS_MAKE_HUMAN]))
		len += formatex(menu[len], charsmax(menu) - len, "\r1.\w %L^n", id, "MENU_ADMIN1")
	else
		len += formatex(menu[len], charsmax(menu) - len, "\d1. %L^n", id, "MENU_ADMIN1")
	
	// 2. Nemesis command
	if (userflags & (g_access_flag[ACCESS_MODE_NEMESIS] | g_access_flag[ACCESS_MAKE_NEMESIS]))
		len += formatex(menu[len], charsmax(menu) - len, "\r2.\w %L^n", id, "MENU_ADMIN2")
	else
		len += formatex(menu[len], charsmax(menu) - len, "\d2. %L^n", id, "MENU_ADMIN2")
		
	// 3. Assassin command
	if (userflags & (g_access_flag[ACCESS_MODE_ASSASSIN] | g_access_flag[ACCESS_MAKE_ASSASSIN]))
		len += formatex(menu[len], charsmax(menu) - len, "\r3.\w %L^n", id, "MENU_ADMIN9")
	else
		len += formatex(menu[len], charsmax(menu) - len, "\d3. %L^n", id, "MENU_ADMIN9")
	
	// 4. Survivor command
	if (userflags & (g_access_flag[ACCESS_MODE_SURVIVOR] | g_access_flag[ACCESS_MAKE_SURVIVOR]))
		len += formatex(menu[len], charsmax(menu) - len, "\r4.\w %L^n", id, "MENU_ADMIN3")
	else
		len += formatex(menu[len], charsmax(menu) - len, "\d4. %L^n", id, "MENU_ADMIN3")
		
	// 5. Sniper command
	if (userflags & (g_access_flag[ACCESS_MODE_SNIPER] | g_access_flag[ACCESS_MAKE_SNIPER]))
		len += formatex(menu[len], charsmax(menu) - len, "\r5.\w %L^n", id, "MENU_ADMIN8")
	else
		len += formatex(menu[len], charsmax(menu) - len, "\d5. %L^n", id, "MENU_ADMIN8")
	
	// 6. Respawn command
	if (userflags & g_access_flag[ACCESS_RESPAWN_PLAYERS])
		len += formatex(menu[len], charsmax(menu) - len, "\r6.\w %L^n", id, "MENU_ADMIN4")
	else
		len += formatex(menu[len], charsmax(menu) - len, "\d6. %L^n", id, "MENU_ADMIN4")
	
	// 7. Admin modes command
	if (userflags & g_access_flag[ACCESS_ADMIN_MODES_MENU])
		len += formatex(menu[len], charsmax(menu) - len, "\r7.\w %L^n", id, "MENU_ADMIN10")
	else
		len += formatex(menu[len], charsmax(menu) - len, "\d7. %L^n", id, "MENU_ADMIN10")
	
	// 0. Exit
	len += formatex(menu[len], charsmax(menu) - len, "^n\r0.\w %L", id, "MENU_EXIT")
	
	// Fix for AMXX custom menus
	if (pev_valid(id) == PDATA_SAFE)
		set_pdata_int(id, OFFSET_CSMENUCODE, 0, OFFSET_LINUX)
	
	show_menu(id, KEYSMENU, menu, -1, "Admin Menu")
}

// Admin Modes Menu
show_menu_modes_admin(id)
{
	static menu[250], len, userflags
	len = 0
	userflags = get_user_flags(id)
	
	// Title
	len += formatex(menu[len], charsmax(menu) - len, "\y%L^n^n", id, "MENU_ADMIN_MODES_TITLE")
	
	// 1. Swarm mode command
	if ((userflags & g_access_flag[ACCESS_MODE_SWARM]) && allowed_swarm())
		len += formatex(menu[len], charsmax(menu) - len, "\r1.\w %L^n", id, "MENU_ADMIN5")
	else
		len += formatex(menu[len], charsmax(menu) - len, "\d1. %L^n", id, "MENU_ADMIN5")
	
	// 2. Multi infection command
	if ((userflags & g_access_flag[ACCESS_MODE_MULTI]) && allowed_multi())
		len += formatex(menu[len], charsmax(menu) - len, "\r2.\w %L^n", id, "MENU_ADMIN6")
	else
		len += formatex(menu[len], charsmax(menu) - len, "\d2. %L^n", id, "MENU_ADMIN6")
	
	// 3. Plague mode command
	if ((userflags & g_access_flag[ACCESS_MODE_PLAGUE]) && allowed_plague())
		len += formatex(menu[len], charsmax(menu) - len, "\r3.\w %L^n", id, "MENU_ADMIN7")
	else
		len += formatex(menu[len], charsmax(menu) - len, "\d3. %L^n", id, "MENU_ADMIN7")
		
	// 4. Armageddon mode command
	if ((userflags & g_access_flag[ACCESS_MODE_ARMAGEDDON]) && allowed_armageddon())
		len += formatex(menu[len], charsmax(menu) - len, "\r4.\w %L^n", id, "MENU_ADMIN11")
	else
		len += formatex(menu[len], charsmax(menu) - len, "\d4. %L^n", id, "MENU_ADMIN11")

	// 5. Apocalypse mode command
	if ((userflags & g_access_flag[ACCESS_MODE_APOCALYPSE]) && allowed_apocalypse())
		len += formatex(menu[len], charsmax(menu) - len, "\r5.\w %L^n", id, "MENU_ADMIN12")
	else
		len += formatex(menu[len], charsmax(menu) - len, "\d5. %L^n", id, "MENU_ADMIN12")

	// 6. Nightmare mode command
	if ((userflags & g_access_flag[ACCESS_MODE_NIGHTMARE]) && allowed_nightmare())
		len += formatex(menu[len], charsmax(menu) - len, "\r6.\w %L^n", id, "MENU_ADMIN13")
	else
		len += formatex(menu[len], charsmax(menu) - len, "\d6. %L^n", id, "MENU_ADMIN13")

	// 0. Exit
	len += formatex(menu[len], charsmax(menu) - len, "^n\r0. \wExit")
	
	show_menu(id, KEYSMENU, menu, -1, "Admin Modes Menu")
}

// Player List Menu
show_menu_player_list(id)
{
	// Player disconnected?
	if (!g_isconnected[id])
		return;
	
	static menuid, menu[128], player, userflags, buffer[2]
	userflags = get_user_flags(id)
	
	// Title
	switch (PL_ACTION)
	{
		case ACTION_ZOMBIEFY_HUMANIZE: formatex(menu, charsmax(menu), "%L\r", id, "MENU_ADMIN1")
		case ACTION_MAKE_NEMESIS: formatex(menu, charsmax(menu), "%L\r", id, "MENU_ADMIN2")
		case ACTION_MAKE_ASSASSIN: formatex(menu, charsmax(menu), "%L\r", id, "MENU_ADMIN9")
		case ACTION_MAKE_SURVIVOR: formatex(menu, charsmax(menu), "%L\r", id, "MENU_ADMIN3")
		case ACTION_MAKE_SNIPER: formatex(menu, charsmax(menu), "%L\r", id, "MENU_ADMIN8")
		case ACTION_RESPAWN_PLAYER: formatex(menu, charsmax(menu), "%L\r", id, "MENU_ADMIN4")
	}
	menuid = menu_create(menu, "menu_player_list")
	
	// Player List
	for (player = 0; player <= g_maxplayers; player++)
	{
		// Skip if not connected
		if (!g_isconnected[player])
			continue;
		
		// Format text depending on the action to take
		switch (PL_ACTION)
		{
			case ACTION_ZOMBIEFY_HUMANIZE: // Zombiefy/Humanize command
			{
				if (g_zombie[player])
				{
					if (allowed_human(player) && (userflags & g_access_flag[ACCESS_MAKE_HUMAN]))
						formatex(menu, charsmax(menu), "%s \r[%L]", g_playername[player], id, g_nemesis[player] ? "CLASS_NEMESIS" : "CLASS_ZOMBIE")
					else
						formatex(menu, charsmax(menu), "\d%s [%L]", g_playername[player], id, g_nemesis[player] ? "CLASS_NEMESIS" : "CLASS_ZOMBIE")
				}
				else
				{
					if (allowed_zombie(player) && (g_newround ? (userflags & g_access_flag[ACCESS_MODE_INFECTION]) : (userflags & g_access_flag[ACCESS_MAKE_ZOMBIE])))
						formatex(menu, charsmax(menu), "%s \y[%L]", g_playername[player], id, g_survivor[player] ? "CLASS_SURVIVOR" : "CLASS_HUMAN")
					else
						formatex(menu, charsmax(menu), "\d%s [%L]", g_playername[player], id, g_survivor[player] ? "CLASS_SURVIVOR" : "CLASS_HUMAN")
				}
			}
			case ACTION_MAKE_NEMESIS: // Nemesis command
			{
				if (allowed_nemesis(player) && (g_newround ? (userflags & g_access_flag[ACCESS_MODE_NEMESIS]) : (userflags & g_access_flag[ACCESS_MAKE_NEMESIS])))
				{
					if (g_zombie[player])
						formatex(menu, charsmax(menu), "%s \r[%L]", g_playername[player], id, g_nemesis[player] ? "CLASS_NEMESIS" : "CLASS_ZOMBIE")
					else
						formatex(menu, charsmax(menu), "%s \y[%L]", g_playername[player], id, g_survivor[player] ? "CLASS_SURVIVOR" : "CLASS_HUMAN")
				}
				else
					formatex(menu, charsmax(menu), "\d%s [%L]", g_playername[player], id, g_zombie[player] ? g_nemesis[player] ? "CLASS_NEMESIS" : "CLASS_ZOMBIE" : g_survivor[player] ? "CLASS_SURVIVOR" : "CLASS_HUMAN")
			}
			case ACTION_MAKE_ASSASSIN: // Assassin command
			{
				if (allowed_assassin(player) && (g_newround ? (userflags & g_access_flag[ACCESS_MODE_ASSASSIN]) : (userflags & g_access_flag[ACCESS_MAKE_ASSASSIN])))
				{
					if (g_zombie[player])
						formatex(menu, charsmax(menu), "%s \r[%L]", g_playername[player], id, g_nemesis[player] ? "CLASS_NEMESIS" : g_assassin[player] ? "CLASS_ASSASSIN" : "CLASS_ZOMBIE")
					else
						formatex(menu, charsmax(menu), "%s \y[%L]", g_playername[player], id, g_survivor[player] ? "CLASS_SURVIVOR" : g_sniper[player] ? "CLASS_SNIPER" : "CLASS_HUMAN")
				}
				else
					formatex(menu, charsmax(menu), "\d%s [%L]", g_playername[player], id, g_zombie[player] ? g_nemesis[player] ? "CLASS_NEMESIS" : g_assassin[player] ? "CLASS_ASSASSIN" : "CLASS_ZOMBIE" : g_survivor[player] ? "CLASS_SURVIVOR" : g_sniper[player] ? "CLASS_SNIPER" : "CLASS_HUMAN")
			}
			case ACTION_MAKE_SURVIVOR: // Survivor command
			{
				if (allowed_survivor(player) && (g_newround ? (userflags & g_access_flag[ACCESS_MODE_SURVIVOR]) : (userflags & g_access_flag[ACCESS_MAKE_SURVIVOR])))
				{
					if (g_zombie[player])
						formatex(menu, charsmax(menu), "%s \r[%L]", g_playername[player], id, g_nemesis[player] ? "CLASS_NEMESIS" : "CLASS_ZOMBIE")
					else
						formatex(menu, charsmax(menu), "%s \y[%L]", g_playername[player], id, g_survivor[player] ? "CLASS_SURVIVOR" : "CLASS_HUMAN")
				}
				else
					formatex(menu, charsmax(menu), "\d%s [%L]", g_playername[player], id, g_zombie[player] ? g_nemesis[player] ? "CLASS_NEMESIS" : "CLASS_ZOMBIE" : g_survivor[player] ? "CLASS_SURVIVOR" : "CLASS_HUMAN")
			}
			case ACTION_MAKE_SNIPER: // Sniper command
			{
				if (allowed_sniper(player) && (g_newround ? (userflags & g_access_flag[ACCESS_MODE_SNIPER]) : (userflags & g_access_flag[ACCESS_MAKE_SNIPER])))
				{
					if (g_zombie[player])
						formatex(menu, charsmax(menu), "%s \r[%L]", g_playername[player], id, g_nemesis[player] ? "CLASS_NEMESIS" : g_assassin[player] ? "CLASS_ASSASSIN" : "CLASS_ZOMBIE")
					else
						formatex(menu, charsmax(menu), "%s \y[%L]", g_playername[player], id, g_survivor[player] ? "CLASS_SURVIVOR" : g_sniper[player] ? "CLASS_SNIPER" : "CLASS_HUMAN")
				}
				else
					formatex(menu, charsmax(menu), "\d%s [%L]", g_playername[player], id, g_zombie[player] ? g_nemesis[player] ? "CLASS_NEMESIS" : g_assassin[player] ? "CLASS_ASSASSIN" : "CLASS_ZOMBIE" : g_survivor[player] ? "CLASS_SURVIVOR" : g_sniper[player] ? "CLASS_SNIPER" : "CLASS_HUMAN")
			}
			case ACTION_RESPAWN_PLAYER: // Respawn command
			{
				if (allowed_respawn(player) && (userflags & g_access_flag[ACCESS_RESPAWN_PLAYERS]))
					formatex(menu, charsmax(menu), "%s", g_playername[player])
				else
					formatex(menu, charsmax(menu), "\d%s", g_playername[player])
			}
		}
		
		// Add player
		buffer[0] = player
		buffer[1] = 0
		menu_additem(menuid, menu, buffer)
	}
	
	// Back - Next - Exit
	formatex(menu, charsmax(menu), "%L", id, "MENU_BACK")
	menu_setprop(menuid, MPROP_BACKNAME, menu)
	formatex(menu, charsmax(menu), "%L", id, "MENU_NEXT")
	menu_setprop(menuid, MPROP_NEXTNAME, menu)
	formatex(menu, charsmax(menu), "%L", id, "MENU_EXIT")
	menu_setprop(menuid, MPROP_EXITNAME, menu)
	
	// If remembered page is greater than number of pages, clamp down the value
	MENU_PAGE_PLAYERS = min(MENU_PAGE_PLAYERS, menu_pages(menuid)-1)
	
	// Fix for AMXX custom menus
	if (pev_valid(id) == PDATA_SAFE)
		set_pdata_int(id, OFFSET_CSMENUCODE, 0, OFFSET_LINUX)
	
	menu_display(id, menuid, MENU_PAGE_PLAYERS)
}

/*================================================================================
 [Menu Handlers]
=================================================================================*/

// Game Menu
public menu_game(id, key)
{
	// Player disconnected?
	if (!g_isconnected[id])
		return PLUGIN_HANDLED;
	
	switch (key)
	{
		case 0: // Buy Weapons
		{
			// Custom buy menus enabled?
			if (get_pcvar_num(cvar_buycustom))
			{
				// Disable the remember selection setting
				WPN_AUTO_ON = 0
				zp_colored_print(id, "^x04[ZP]^x01 %L", id, "BUY_ENABLED")
				
				// Show menu if player hasn't yet bought anything
				if (g_canbuy[id]) show_menu_buy1(id)
			}
			else
				zp_colored_print(id, "^x04[ZP]^x01 %L", id, "CMD_NOT")
		}
		case 1: // Extra Items
		{
			// Extra items enabled?
			if (get_pcvar_num(cvar_extraitems))
			{
				// Check whether the player is able to buy anything
				if (g_isalive[id])
					show_menu_extras(id)
				else
					zp_colored_print(id, "^x04[ZP]^x01 %L", id, "CMD_NOT")
			}
			else
				zp_colored_print(id, "^x04[ZP]^x01 %L", id, "CMD_NOT_EXTRAS")
		}
		case 2: // Zombie Classes
		{
			// Zombie classes enabled?
			if (get_pcvar_num(cvar_zclasses))
				show_menu_zclass(id)
			else
				zp_colored_print(id, "^x04[ZP]^x01 %L", id, "CMD_NOT_ZCLASSES")
		}
		case 3: // Unstuck
		{
			// Check if player is stuck
			if (g_isalive[id])
			{
				if (is_player_stuck(id))
				{
					// Move to an initial spawn
					if (get_pcvar_num(cvar_randspawn))
						do_random_spawn(id) // random spawn (including CSDM)
					else
						do_random_spawn(id, 1) // regular spawn
				}
				else
					zp_colored_print(id, "^x04[ZP]^x01 %L", id, "CMD_NOT_STUCK")
			}
			else
				zp_colored_print(id, "^x04[ZP]^x01 %L", id, "CMD_NOT")
		}
		case 4: // Help Menu
		{
			show_menu_info(id)
		}
		case 5: // Join Spectator
		{
			// Player alive?
			if (g_isalive[id])
			{
				// Prevent abuse by non-admins if block suicide setting is enabled
				if (get_pcvar_num(cvar_blocksuicide) && !(get_user_flags(id) & g_access_flag[ACCESS_ADMIN_MENU]))
				{
					zp_colored_print(id, "^x04[ZP]^x01 %L", id, "CMD_NOT")
					return PLUGIN_HANDLED;
				}
				
				// Check that we still have both humans and zombies to keep the round going
				check_round(id)
				
				// Kill him before he switches team
				dllfunc(DLLFunc_ClientKill, id)
			}
			
			// Temporarily save player stats?
			if (get_pcvar_num(cvar_statssave)) save_stats(id)
			
			// Remove previous tasks
			remove_task(id+TASK_TEAM)
			remove_task(id+TASK_MODEL)
			remove_task(id+TASK_FLASH)
			remove_task(id+TASK_CHARGE)
			remove_task(id+TASK_SPAWN)
			remove_task(id+TASK_BLOOD)
			remove_task(id+TASK_AURA)
			remove_task(id+TASK_BURN)
			
			// Then move him to the spectator team
			fm_cs_set_user_team(id, FM_CS_TEAM_SPECTATOR)
			fm_user_team_update(id)
		}
		case 8: // Admin Menu
		{
			// Check if player has the required access
			if (get_user_flags(id) & g_access_flag[ACCESS_ADMIN_MENU])
				show_menu_admin(id)
			else
				zp_colored_print(id, "^x04[ZP]^x01 %L", id, "CMD_NOT_ACCESS")
		}
	}
	
	return PLUGIN_HANDLED;
}

// Buy Menu 1
public menu_buy1(id, key)
{
	// Player dead?
	if (!g_isalive[id])
		return PLUGIN_HANDLED;
	
	// Zombies or survivors get no guns
	if (g_zombie[id] || g_survivor[id] || g_sniper[id])
		return PLUGIN_HANDLED;
	
	// Special keys / weapon list exceeded
	if (key >= MENU_KEY_AUTOSELECT || WPN_SELECTION >= WPN_MAXIDS)
	{
		switch (key)
		{
			case MENU_KEY_AUTOSELECT: // toggle auto select
			{
				WPN_AUTO_ON = 1 - WPN_AUTO_ON
			}
			case MENU_KEY_NEXT: // next/back
			{
				if (WPN_STARTID+7 < WPN_MAXIDS)
					WPN_STARTID += 7
				else
					WPN_STARTID = 0
			}
			case MENU_KEY_EXIT: // exit
			{
				return PLUGIN_HANDLED;
			}
		}
		
		// Show buy menu again
		show_menu_buy1(id)
		return PLUGIN_HANDLED;
	}
	
	// Store selected weapon id
	WPN_AUTO_PRI = WPN_SELECTION
	
	// Buy primary weapon
	buy_primary_weapon(id, WPN_AUTO_PRI)
	
	// Show pistols menu
	show_menu_buy2(id)
	
	return PLUGIN_HANDLED;
}

// Buy Primary Weapon
buy_primary_weapon(id, selection)
{
	// Drop previous weapons
	drop_weapons(id, 1)
	drop_weapons(id, 2)
	
	// Strip off from weapons
	fm_strip_user_weapons(id)
	fm_give_item(id, "weapon_knife")
	
	// Get weapon's id and name
	static weaponid, wname[32]
	weaponid = ArrayGetCell(g_primary_weaponids, selection)
	ArrayGetString(g_primary_items, selection, wname, charsmax(wname))
	
	// Give the new weapon and full ammo
	fm_give_item(id, wname)
	ExecuteHamB(Ham_GiveAmmo, id, MAXBPAMMO[weaponid], AMMOTYPE[weaponid], MAXBPAMMO[weaponid])
	
	// Weapons bought
	g_canbuy[id] = false
	
	// Give additional items
	static i
	for (i = 0; i < ArraySize(g_additional_items); i++)
	{
		ArrayGetString(g_additional_items, i, wname, charsmax(wname))
		fm_give_item(id, wname)
	}
}

// Buy Menu 2
public menu_buy2(id, key)
{
	// Player dead?
	if (!g_isalive[id])
		return PLUGIN_HANDLED;
	
	// Zombies or survivors get no guns
	if (g_zombie[id] || g_survivor[id] || g_sniper[id])
		return PLUGIN_HANDLED;
	
	// Special keys / weapon list exceeded
	if (key >= ArraySize(g_secondary_items))
	{
		// Toggle autoselect
		if (key == MENU_KEY_AUTOSELECT)
			WPN_AUTO_ON = 1 - WPN_AUTO_ON
		
		// Reshow menu unless user exited
		if (key != MENU_KEY_EXIT)
			show_menu_buy2(id)
		
		return PLUGIN_HANDLED;
	}
	
	// Store selected weapon
	WPN_AUTO_SEC = key
	
	// Drop secondary gun again, in case we picked another (bugfix)
	drop_weapons(id, 2)
	
	// Get weapon's id
	static weaponid, wname[32]
	weaponid = ArrayGetCell(g_secondary_weaponids, key)
	ArrayGetString(g_secondary_items, key, wname, charsmax(wname))
	
	// Give the new weapon and full ammo
	fm_give_item(id, wname)
	ExecuteHamB(Ham_GiveAmmo, id, MAXBPAMMO[weaponid], AMMOTYPE[weaponid], MAXBPAMMO[weaponid])
	
	return PLUGIN_HANDLED;
}

// Extra Items Menu
public menu_extras(id, menuid, item)
{
	// Player disconnected?
	if (!is_user_connected(id))
	{
		menu_destroy(menuid)
		return PLUGIN_HANDLED;
	}
	
	// Remember player's menu page
	static menudummy
	player_menu_info(id, menudummy, menudummy, MENU_PAGE_EXTRAS)
	
	// Menu was closed
	if (item == MENU_EXIT)
	{
		menu_destroy(menuid)
		return PLUGIN_HANDLED;
	}
	
	// Dead players are not allowed to buy items
	if (!g_isalive[id])
	{
		zp_colored_print(id, "^x04[ZP]^x01 %L", id, "CMD_NOT")
		menu_destroy(menuid)
		return PLUGIN_HANDLED;
	}
	
	// Retrieve extra item id
	static buffer[2], dummy, itemid
	menu_item_getinfo(menuid, item, dummy, buffer, charsmax(buffer), _, _, dummy)
	itemid = buffer[0]
	
	// Attempt to buy the item
	buy_extra_item(id, itemid)
	menu_destroy(menuid)
	return PLUGIN_HANDLED;
}

// Buy Extra Item
buy_extra_item(id, itemid, ignorecost = 0)
{
	// Retrieve item's team
	static team
	team = ArrayGetCell(g_extraitem_team, itemid)
	
	// Check for team/class specific items
	if ((g_zombie[id] && !g_nemesis[id] && !g_assassin && !(team & ZP_TEAM_ZOMBIE)) || (!g_zombie[id] && !g_survivor[id] && !g_sniper[id] && !(team & ZP_TEAM_HUMAN)) || (g_nemesis[id] && !(team & ZP_TEAM_NEMESIS)) || (g_assassin[id] && !(team & ZP_TEAM_ASSASSIN)) || (g_survivor[id] && !(team & ZP_TEAM_SURVIVOR)) || (g_sniper[id] && !(team & ZP_TEAM_SNIPER)))
	{
		zp_colored_print(id, "^x04[ZP]^x01 %L", id, "CMD_NOT")
		return;
	}
	
	// Check for unavailable items
	if ((itemid == EXTRA_NVISION && !get_pcvar_num(cvar_extranvision))
	|| (itemid == EXTRA_ANTIDOTE && (!get_pcvar_num(cvar_extraantidote) || g_antidotecounter >= get_pcvar_num(cvar_antidotelimit)))
	|| (itemid == EXTRA_MADNESS && (!get_pcvar_num(cvar_extramadness) || g_madnesscounter >= get_pcvar_num(cvar_madnesslimit)))
	|| (itemid == EXTRA_INFBOMB && (!get_pcvar_num(cvar_extrainfbomb) || g_infbombcounter >= get_pcvar_num(cvar_infbomblimit)))
	|| (itemid >= EXTRA_WEAPONS_STARTID && itemid <= EXTRAS_CUSTOM_STARTID-1 && !get_pcvar_num(cvar_extraweapons)))
	{
		zp_colored_print(id, "^x04[ZP]^x01 %L", id, "CMD_NOT")
		return;
	}
	
	// Check for hard coded items with special conditions
	if ((itemid == EXTRA_ANTIDOTE && (g_endround || g_swarmround || g_nemround || g_assaround || g_survround || g_sniround || g_plagueround || g_armageround || g_apocround || g_nightround || fnGetZombies() <= 1 || (get_pcvar_num(cvar_deathmatch) && !get_pcvar_num(cvar_respawnafterlast) && fnGetHumans() == 1)))
	|| (itemid == EXTRA_MADNESS && g_nodamage[id]) || (itemid == EXTRA_INFBOMB && (g_endround || g_swarmround || g_nemround || g_assaround || g_survround || g_sniround || g_plagueround || g_armageround || g_apocround || g_nightround)))
	{
		zp_colored_print(id, "^x04[ZP]^x01 %L", id, "CMD_NOT_CANTUSE")
		return;
	}
	
	// Ignore item's cost?
	if (!ignorecost)
	{
		// Check that we have enough ammo packs
		if (g_ammopacks[id] < ArrayGetCell(g_extraitem_cost, itemid))
		{
			zp_colored_print(id, "^x04[ZP]^x01 %L", id, "NOT_ENOUGH_AMMO")
			return;
		}
		
		// Deduce item cost
		g_ammopacks[id] -= ArrayGetCell(g_extraitem_cost, itemid)
	}
	
	// Check which kind of item we're buying
	switch (itemid)
	{
		case EXTRA_NVISION: // Night Vision
		{
			g_nvision[id] = true
			
			if (!g_isbot[id])
			{
				g_nvisionenabled[id] = true
				
				// Custom nvg?
				if (get_pcvar_num(cvar_customnvg))
				{
					remove_task(id+TASK_NVISION)
					set_task(0.1, "set_user_nvision", id+TASK_NVISION, _, _, "b")
				}
				else
					set_user_gnvision(id, 1)
			}
			else
				cs_set_user_nvg(id, 1)
		}
		case EXTRA_ANTIDOTE: // Antidote
		{
			// Increase antidote purchase count for this round
			g_antidotecounter++
			
			humanme(id, 0, 0, 0)
		}
		case EXTRA_MADNESS: // Zombie Madness
		{
			// Increase madness purchase count for this round
			g_madnesscounter++
			
			g_nodamage[id] = true
			set_task(0.1, "zombie_aura", id+TASK_AURA, _, _, "b")
			set_task(get_pcvar_float(cvar_madnessduration), "madness_over", id+TASK_BLOOD)
			
			static sound[64]
			ArrayGetString(zombie_madness, random_num(0, ArraySize(zombie_madness) - 1), sound, charsmax(sound))
			emit_sound(id, CHAN_VOICE, sound, 1.0, ATTN_NORM, 0, PITCH_NORM)
		}
		case EXTRA_INFBOMB: // Infection Bomb
		{
			// Increase infection bomb purchase count for this round
			g_infbombcounter++
			
			// Already own one
			if (user_has_weapon(id, CSW_HEGRENADE))
			{
				// Increase BP ammo on it instead
				cs_set_user_bpammo(id, CSW_HEGRENADE, cs_get_user_bpammo(id, CSW_HEGRENADE) + 1)
				
				// Flash ammo in hud
				message_begin(MSG_ONE_UNRELIABLE, g_msgAmmoPickup, _, id)
				write_byte(AMMOID[CSW_HEGRENADE]) // ammo id
				write_byte(1) // ammo amount
				message_end()
				
				// Play clip purchase sound
				emit_sound(id, CHAN_ITEM, sound_buyammo, 1.0, ATTN_NORM, 0, PITCH_NORM)
				
				return; // stop here
			}
			
			// Give weapon to the player
			fm_give_item(id, "weapon_hegrenade")
		}
		default:
		{
			if (itemid >= EXTRA_WEAPONS_STARTID && itemid <= EXTRAS_CUSTOM_STARTID-1) // Weapons
			{
				// Get weapon's id and name
				static weaponid, wname[32]
				ArrayGetString(g_extraweapon_items, itemid - EXTRA_WEAPONS_STARTID, wname, charsmax(wname))
				weaponid = cs_weapon_name_to_id(wname)
				
				// If we are giving a primary/secondary weapon
				if (MAXBPAMMO[weaponid] > 2)
				{
					// Make user drop the previous one
					if ((1<<weaponid) & PRIMARY_WEAPONS_BIT_SUM)
						drop_weapons(id, 1)
					else
						drop_weapons(id, 2)
					
					// Give full BP ammo for the new one
					ExecuteHamB(Ham_GiveAmmo, id, MAXBPAMMO[weaponid], AMMOTYPE[weaponid], MAXBPAMMO[weaponid])
				}
				// If we are giving a grenade which the user already owns
				else if (user_has_weapon(id, weaponid))
				{
					// Increase BP ammo on it instead
					cs_set_user_bpammo(id, weaponid, cs_get_user_bpammo(id, weaponid) + 1)
					
					// Flash ammo in hud
					message_begin(MSG_ONE_UNRELIABLE, g_msgAmmoPickup, _, id)
					write_byte(AMMOID[weaponid]) // ammo id
					write_byte(1) // ammo amount
					message_end()
					
					// Play clip purchase sound
					emit_sound(id, CHAN_ITEM, sound_buyammo, 1.0, ATTN_NORM, 0, PITCH_NORM)
					
					return; // stop here
				}
				
				// Give weapon to the player
				fm_give_item(id, wname)
			}
			else // Custom additions
			{
				// Item selected forward
				ExecuteForward(g_fwExtraItemSelected, g_fwDummyResult, id, itemid);
				
				// Item purchase blocked, restore buyer's ammo packs
				if (g_fwDummyResult >= ZP_PLUGIN_HANDLED && !ignorecost)
					g_ammopacks[id] += ArrayGetCell(g_extraitem_cost, itemid)
			}
		}
	}
}

// Zombie Class Menu
public menu_zclass(id, menuid, item)
{
	// Player disconnected?
	if (!is_user_connected(id))
	{
		menu_destroy(menuid)
		return PLUGIN_HANDLED;
	}
	
	// Remember player's menu page
	static menudummy
	player_menu_info(id, menudummy, menudummy, MENU_PAGE_ZCLASS)
	
	// Menu was closed
	if (item == MENU_EXIT)
	{
		menu_destroy(menuid)
		return PLUGIN_HANDLED;
	}
	
	// Retrieve zombie class id
	static buffer[2], dummy, classid
	menu_item_getinfo(menuid, item, dummy, buffer, charsmax(buffer), _, _, dummy)
	classid = buffer[0]
	
	// Store selection for the next infection
	g_zombieclassnext[id] = classid
	
	static name[32]
	ArrayGetString(g_zclass_name, g_zombieclassnext[id], name, charsmax(name))
	
	// Show selected zombie class info and stats
	zp_colored_print(id, "^x04[ZP]^x01 %L^x01:^x04 %s", id, "ZOMBIE_SELECT", name)
	zp_colored_print(id, "^x04[ZP]^x01 %L^x01:^x04 %d^x01 |^x01 %L^x01:^x04 %d^x01 |^x01 %L^x01:^x04 %d^x01 |^x01 %L^x01:^x04 %d%%", id, "ZOMBIE_ATTRIB1", ArrayGetCell(g_zclass_hp, g_zombieclassnext[id]), id, "ZOMBIE_ATTRIB2", ArrayGetCell(g_zclass_spd, g_zombieclassnext[id]),
	id, "ZOMBIE_ATTRIB3", floatround(Float:ArrayGetCell(g_zclass_grav, g_zombieclassnext[id]) * 800.0), id, "ZOMBIE_ATTRIB4", floatround(Float:ArrayGetCell(g_zclass_kb, g_zombieclassnext[id]) * 100.0))
	
	menu_destroy(menuid)
	return PLUGIN_HANDLED;
}

// Info Menu
public menu_info(id, key)
{
	// Player disconnected?
	if (!g_isconnected[id])
		return PLUGIN_HANDLED;
	
	static motd[1500], len
	len = 0
	
	switch (key)
	{
		case 0: // General
		{
			static weather, lighting[2]
			weather = 0
			get_pcvar_string(cvar_lighting, lighting, charsmax(lighting))
			strtolower(lighting)
			
			len += formatex(motd[len], charsmax(motd) - len, "%L ", id, "MOTD_INFO11", "Zombie Plague", PLUGIN_VERSION, "MeRcyLeZZ and Bakir")
			len += formatex(motd[len], charsmax(motd) - len, "%L", id, "MOTD_INFO12")
			len += formatex(motd[len], charsmax(motd) - len, "%L", id, "MOTD_INFO1_A")
			
			if (g_ambience_fog)
			{
				len += formatex(motd[len], charsmax(motd) - len, (weather < 1) ? " %L" : ". %L", id, "MOTD_FOG")
				weather++
			}
			if (g_ambience_rain)
			{
				len += formatex(motd[len], charsmax(motd) - len, (weather < 1) ? " %L" : ". %L", id, "MOTD_RAIN")
				weather++
			}
			if (g_ambience_snow)
			{
				len += formatex(motd[len], charsmax(motd) - len, (weather < 1) ? " %L" : ". %L", id, "MOTD_SNOW")
				weather++
			}
			if (weather < 1) len += formatex(motd[len], charsmax(motd) - len, " %L", id, "MOTD_DISABLED")
			
			len += formatex(motd[len], charsmax(motd) - len, "%L", id, "MOTD_INFO1_B", lighting)
			len += formatex(motd[len], charsmax(motd) - len, "%L", id, "MOTD_INFO1_C", id, get_pcvar_num(cvar_triggered) ? "MOTD_ENABLED" : "MOTD_DISABLED")
			if (lighting[0] >= 'a' && lighting[0] <= 'd' && get_pcvar_float(cvar_thunder) > 0.0) len += formatex(motd[len], charsmax(motd) - len, "%L", id, "MOTD_INFO1_D", floatround(get_pcvar_float(cvar_thunder)))
			len += formatex(motd[len], charsmax(motd) - len, "%L", id, "MOTD_INFO1_E", id, get_pcvar_num(cvar_removedoors) > 0 ? get_pcvar_num(cvar_removedoors) > 1 ? "MOTD_DOORS" : "MOTD_ROTATING" : "MOTD_ENABLED")
			len += formatex(motd[len], charsmax(motd) - len, "%L", id, "MOTD_INFO1_F", id, get_pcvar_num(cvar_deathmatch) > 0 ? get_pcvar_num(cvar_deathmatch) > 1 ? get_pcvar_num(cvar_deathmatch) > 2 ? "MOTD_ENABLED" : "MOTD_DM_ZOMBIE" : "MOTD_DM_HUMAN" : "MOTD_DISABLED")
			if (get_pcvar_num(cvar_deathmatch)) len += formatex(motd[len], charsmax(motd) - len, "%L", id, "MOTD_INFO1_G", floatround(get_pcvar_float(cvar_spawnprotection)))
			len += formatex(motd[len], charsmax(motd) - len, "%L", id, "MOTD_INFO1_H", id, get_pcvar_num(cvar_randspawn) ? "MOTD_ENABLED" : "MOTD_DISABLED")
			len += formatex(motd[len], charsmax(motd) - len, "%L", id, "MOTD_INFO1_I", id, get_pcvar_num(cvar_extraitems) ? "MOTD_ENABLED" : "MOTD_DISABLED")
			len += formatex(motd[len], charsmax(motd) - len, "%L", id, "MOTD_INFO1_J", id, get_pcvar_num(cvar_zclasses) ? "MOTD_ENABLED" : "MOTD_DISABLED")
			len += formatex(motd[len], charsmax(motd) - len, "%L", id, "MOTD_INFO1_K", id, get_pcvar_num(cvar_customnvg) ? "MOTD_ENABLED" : "MOTD_DISABLED")
			len += formatex(motd[len], charsmax(motd) - len, "%L", id, "MOTD_INFO1_L", id, g_cached_customflash ? "MOTD_ENABLED" : "MOTD_DISABLED")
			
			show_motd(id, motd)
		}
		case 1: // Humans
		{
			len += formatex(motd[len], charsmax(motd) - len, "%L", id, "MOTD_INFO2")
			len += formatex(motd[len], charsmax(motd) - len, "%L", id, "MOTD_INFO2_A", get_pcvar_num(cvar_humanhp))
			if (get_pcvar_num(cvar_humanlasthp) > 0) len += formatex(motd[len], charsmax(motd) - len, "%L", id, "MOTD_INFO2_B", get_pcvar_num(cvar_humanlasthp))
			len += formatex(motd[len], charsmax(motd) - len, "%L", id, "MOTD_INFO2_C", get_pcvar_num(cvar_humanspd))
			len += formatex(motd[len], charsmax(motd) - len, "%L", id, "MOTD_INFO2_D", floatround(get_pcvar_float(cvar_humangravity) * 800.0))
			len += formatex(motd[len], charsmax(motd) - len, "%L", id, "MOTD_INFO2_E", id, get_pcvar_num(cvar_infammo) > 0 ? get_pcvar_num(cvar_infammo) > 1 ? "MOTD_AMMO_CLIP" : "MOTD_AMMO_BP" : "MOTD_LIMITED")
			len += formatex(motd[len], charsmax(motd) - len, "%L", id, "MOTD_INFO2_F", get_pcvar_num(cvar_ammodamage_human))
			len += formatex(motd[len], charsmax(motd) - len, "%L", id, "MOTD_INFO2_G", id, get_pcvar_num(cvar_firegrenades) ? "MOTD_ENABLED" : "MOTD_DISABLED")
			len += formatex(motd[len], charsmax(motd) - len, "%L", id, "MOTD_INFO2_H", id, get_pcvar_num(cvar_frostgrenades) ? "MOTD_ENABLED" : "MOTD_DISABLED")
			len += formatex(motd[len], charsmax(motd) - len, "%L", id, "MOTD_INFO2_I", id, get_pcvar_num(cvar_flaregrenades) ? "MOTD_ENABLED" : "MOTD_DISABLED")
			len += formatex(motd[len], charsmax(motd) - len, "%L", id, "MOTD_INFO2_J", id, get_pcvar_num(cvar_knockback) ? "MOTD_ENABLED" : "MOTD_DISABLED")
			
			show_motd(id, motd)
		}
		case 2: // Zombies
		{
			len += formatex(motd[len], charsmax(motd) - len, "%L", id, "MOTD_INFO3")
			len += formatex(motd[len], charsmax(motd) - len, "%L", id, "MOTD_INFO3_A", ArrayGetCell(g_zclass_hp, 0))
			len += formatex(motd[len], charsmax(motd) - len, "%L", id, "MOTD_INFO3_B", floatround(float(ArrayGetCell(g_zclass_hp, 0)) * get_pcvar_float(cvar_zombiefirsthp)))
			len += formatex(motd[len], charsmax(motd) - len, "%L", id, "MOTD_INFO3_C", floatround(get_pcvar_float(cvar_zombiearmor) * 100.0))
			len += formatex(motd[len], charsmax(motd) - len, "%L", id, "MOTD_INFO3_D", ArrayGetCell(g_zclass_spd, 0))
			len += formatex(motd[len], charsmax(motd) - len, "%L", id, "MOTD_INFO3_E", floatround(Float:ArrayGetCell(g_zclass_grav, 0) * 800.0))
			if (get_pcvar_num(cvar_zombiebonushp)) len += formatex(motd[len], charsmax(motd) - len, "%L", id, "MOTD_INFO3_F", get_pcvar_num(cvar_zombiebonushp))
			len += formatex(motd[len], charsmax(motd) - len, "%L", id, "MOTD_INFO3_G", id, get_pcvar_num(cvar_zombiepainfree) > 0 ? get_pcvar_num(cvar_zombiepainfree) > 1 ? "MOTD_LASTZOMBIE" : "MOTD_ENABLED" : "MOTD_DISABLED")
			len += formatex(motd[len], charsmax(motd) - len, "%L", id, "MOTD_INFO3_H", id, get_pcvar_num(cvar_zombiebleeding) ? "MOTD_ENABLED" : "MOTD_DISABLED")
			len += formatex(motd[len], charsmax(motd) - len, "%L", id, "MOTD_INFO3_I", get_pcvar_num(cvar_ammoinfect))
			
			show_motd(id, motd)
		}
		case 3: // Gameplay Modes
		{
			static nemhp[5], survhp[5], snihp[5], assahp[5]
			
			// Get nemesis and survivor health
			num_to_str(get_pcvar_num(cvar_nemhp), nemhp, charsmax(nemhp))
			num_to_str(get_pcvar_num(cvar_survhp), survhp, charsmax(survhp))
			num_to_str(get_pcvar_num(cvar_snihp), snihp, charsmax(snihp))
			num_to_str(get_pcvar_num(cvar_assahp), assahp, charsmax(assahp))
			
			len += formatex(motd[len], charsmax(motd) - len, "%L", id, "MOTD_INFO4")
			
			len += formatex(motd[len], charsmax(motd) - len, "%L", id, "MOTD_INFO4_A", id, get_pcvar_num(cvar_nem) ? "MOTD_ENABLED" : "MOTD_DISABLED")
			if (get_pcvar_num(cvar_nem))
			{
				len += formatex(motd[len], charsmax(motd) - len, "%L", id, "MOTD_INFO4_B", get_pcvar_num(cvar_nemchance))
				len += formatex(motd[len], charsmax(motd) - len, "%L", id, "MOTD_INFO4_C", get_pcvar_num(cvar_nemhp) > 0 ? nemhp : "[Auto]")
				len += formatex(motd[len], charsmax(motd) - len, "%L", id, "MOTD_INFO4_D", get_pcvar_num(cvar_nemspd))
				len += formatex(motd[len], charsmax(motd) - len, "%L", id, "MOTD_INFO4_E", floatround(get_pcvar_float(cvar_nemgravity) * 800.0))
				len += formatex(motd[len], charsmax(motd) - len, "%L", id, "MOTD_INFO4_F", id, g_cached_leapnemesis ? "MOTD_ENABLED" : "MOTD_DISABLED")
				len += formatex(motd[len], charsmax(motd) - len, "%L", id, "MOTD_INFO4_G", id, get_pcvar_num(cvar_nempainfree) ? "MOTD_ENABLED" : "MOTD_DISABLED")
			}
			len += formatex(motd[len], charsmax(motd) - len, "%L", id, "MOTD_INFO4_H", id, get_pcvar_num(cvar_surv) ? "MOTD_ENABLED" : "MOTD_DISABLED")
			if (get_pcvar_num(cvar_surv))
			{
				len += formatex(motd[len], charsmax(motd) - len, "%L", id, "MOTD_INFO4_I", get_pcvar_num(cvar_survchance))
				len += formatex(motd[len], charsmax(motd) - len, "%L", id, "MOTD_INFO4_J", get_pcvar_num(cvar_survhp) > 0 ? survhp : "[Auto]")
				len += formatex(motd[len], charsmax(motd) - len, "%L", id, "MOTD_INFO4_K", get_pcvar_num(cvar_survspd))
				len += formatex(motd[len], charsmax(motd) - len, "%L", id, "MOTD_INFO4_L", floatround(get_pcvar_float(cvar_survgravity) * 800.0))
				len += formatex(motd[len], charsmax(motd) - len, "%L", id, "MOTD_INFO4_M", id, g_cached_leapsurvivor ? "MOTD_ENABLED" : "MOTD_DISABLED")
				len += formatex(motd[len], charsmax(motd) - len, "%L", id, "MOTD_INFO4_N", id, get_pcvar_num(cvar_survpainfree) ? "MOTD_ENABLED" : "MOTD_DISABLED")
			}
			
			len += formatex(motd[len], charsmax(motd) - len, "%L", id, "MOTD_INFO4_O", id, get_pcvar_num(cvar_swarm) ? "MOTD_ENABLED" : "MOTD_DISABLED")
			if (get_pcvar_num(cvar_swarm)) len += formatex(motd[len], charsmax(motd) - len, "%L", id, "MOTD_INFO4_P", get_pcvar_num(cvar_swarmchance))
			
			len += formatex(motd[len], charsmax(motd) - len, "%L", id, "MOTD_INFO4_Q", id, get_pcvar_num(cvar_multi) ? "MOTD_ENABLED" : "MOTD_DISABLED")
			if (get_pcvar_num(cvar_multi))
			{
				len += formatex(motd[len], charsmax(motd) - len, "%L", id, "MOTD_INFO4_R", get_pcvar_num(cvar_multichance))
				len += formatex(motd[len], charsmax(motd) - len, "%L", id, "MOTD_INFO4_S", floatround(get_pcvar_float(cvar_multiratio) * 100.0))
			}
			
			len += formatex(motd[len], charsmax(motd) - len, "%L", id, "MOTD_INFO4_T", id, get_pcvar_num(cvar_plague) ? "MOTD_ENABLED" : "MOTD_DISABLED")
			if (get_pcvar_num(cvar_plague))
			{
				len += formatex(motd[len], charsmax(motd) - len, "%L", id, "MOTD_INFO4_U", get_pcvar_num(cvar_plaguechance))
				len += formatex(motd[len], charsmax(motd) - len, "%L", id, "MOTD_INFO4_V", floatround(get_pcvar_float(cvar_plagueratio) * 100.0))
			}
			
			len += formatex(motd[len], charsmax(motd) - len, "%L", id, "MOTD_INFO5_A", id, get_pcvar_num(cvar_sni) ? "MOTD_ENABLED" : "MOTD_DISABLED")
			if (get_pcvar_num(cvar_sni))
			{
				len += formatex(motd[len], charsmax(motd) - len, "%L", id, "MOTD_INFO5_B", get_pcvar_num(cvar_snichance))
				len += formatex(motd[len], charsmax(motd) - len, "%L", id, "MOTD_INFO5_C", get_pcvar_num(cvar_snihp) > 0 ? snihp : "[Auto]")
				len += formatex(motd[len], charsmax(motd) - len, "%L", id, "MOTD_INFO5_E", floatround(get_pcvar_float(cvar_snigravity) * 800.0))
				len += formatex(motd[len], charsmax(motd) - len, "%L", id, "MOTD_INFO5_F", id, g_cached_leapsniper ? "MOTD_ENABLED" : "MOTD_DISABLED")
				len += formatex(motd[len], charsmax(motd) - len, "%L", id, "MOTD_INFO5_G", id, get_pcvar_num(cvar_snipainfree) ? "MOTD_ENABLED" : "MOTD_DISABLED")
				len += formatex(motd[len], charsmax(motd) - len, "%L", id, "MOTD_INFO5_H", floatround(get_pcvar_float(cvar_snidamage)))
			}
			
			len += formatex(motd[len], charsmax(motd) - len, "%L", id, "MOTD_INFO6_A", id, get_pcvar_num(cvar_assa) ? "MOTD_ENABLED" : "MOTD_DISABLED")
			if (get_pcvar_num(cvar_assa))
			{
				len += formatex(motd[len], charsmax(motd) - len, "%L", id, "MOTD_INFO6_B", get_pcvar_num(cvar_assachance))
				len += formatex(motd[len], charsmax(motd) - len, "%L", id, "MOTD_INFO6_C", get_pcvar_num(cvar_assahp) > 0 ? assahp : "[Auto]")
				len += formatex(motd[len], charsmax(motd) - len, "%L", id, "MOTD_INFO6_D", get_pcvar_num(cvar_assaspd))
				len += formatex(motd[len], charsmax(motd) - len, "%L", id, "MOTD_INFO6_E", floatround(get_pcvar_float(cvar_assagravity) * 800.0))
				len += formatex(motd[len], charsmax(motd) - len, "%L", id, "MOTD_INFO6_F", id, g_cached_leapassassin ? "MOTD_ENABLED" : "MOTD_DISABLED")
				len += formatex(motd[len], charsmax(motd) - len, "%L", id, "MOTD_INFO6_G", id, get_pcvar_num(cvar_assapainfree) ? "MOTD_ENABLED" : "MOTD_DISABLED")
			}
			
			len += formatex(motd[len], charsmax(motd) - len, "%L", id, "MOTD_INFO6_H", id, get_pcvar_num(cvar_armage) ? "MOTD_ENABLED" : "MOTD_DISABLED")
			if (get_pcvar_num(cvar_armage))
			{
				len += formatex(motd[len], charsmax(motd) - len, "%L", id, "MOTD_INFO6_I", get_pcvar_num(cvar_armagechance))
				len += formatex(motd[len], charsmax(motd) - len, "%L", id, "MOTD_INFO6_J", floatround(get_pcvar_float(cvar_armageratio) * 100.0))
			}
			
			len += formatex(motd[len], charsmax(motd) - len, "%L", id, "MOTD_INFO7_H", id, get_pcvar_num(cvar_apoc) ? "MOTD_ENABLED" : "MOTD_DISABLED")
			if (get_pcvar_num(cvar_apoc))
			{
				len += formatex(motd[len], charsmax(motd) - len, "%L", id, "MOTD_INFO7_I", get_pcvar_num(cvar_apocchance))
				len += formatex(motd[len], charsmax(motd) - len, "%L", id, "MOTD_INFO7_J", floatround(get_pcvar_float(cvar_apocratio ) * 100.0))
			}
			
			len += formatex(motd[len], charsmax(motd) - len, "%L", id, "MOTD_INFO8_H", id, get_pcvar_num(cvar_night) ? "MOTD_ENABLED" : "MOTD_DISABLED")
			if (get_pcvar_num(cvar_night))
			{
				len += formatex(motd[len], charsmax(motd) - len, "%L", id, "MOTD_INFO8_I", get_pcvar_num(cvar_nightchance))
				len += formatex(motd[len], charsmax(motd) - len, "%L", id, "MOTD_INFO8_J", floatround(get_pcvar_float(cvar_nightratio) * 100.0))
			}
			
			show_motd(id, motd)
		}
		default: return PLUGIN_HANDLED;
	}
	
	// Show help menu again if user wishes to read another topic
	show_menu_info(id)
	
	return PLUGIN_HANDLED;
}

// Admin Menu
public menu_admin(id, key)
{
	// Player disconnected?
	if (!g_isconnected[id])
		return PLUGIN_HANDLED;
	
	static userflags
	userflags = get_user_flags(id)
	
	switch (key)
	{
		case ACTION_ZOMBIEFY_HUMANIZE: // Zombiefy/Humanize command
		{
			if (userflags & (g_access_flag[ACCESS_MODE_INFECTION] | g_access_flag[ACCESS_MAKE_ZOMBIE] | g_access_flag[ACCESS_MAKE_HUMAN]))
			{
				// Show player list for admin to pick a target
				PL_ACTION = ACTION_ZOMBIEFY_HUMANIZE
				show_menu_player_list(id)
			}
			else
			{
				zp_colored_print(id, "^x04[ZP]^x01 %L", id, "CMD_NOT_ACCESS")
				show_menu_admin(id)
			}
		}
		case ACTION_MAKE_NEMESIS: // Nemesis command
		{
			if (userflags & (g_access_flag[ACCESS_MODE_NEMESIS] | g_access_flag[ACCESS_MAKE_NEMESIS]))
			{
				// Show player list for admin to pick a target
				PL_ACTION = ACTION_MAKE_NEMESIS
				show_menu_player_list(id)
			}
			else
			{
				zp_colored_print(id, "^x04[ZP]^x01 %L", id, "CMD_NOT_ACCESS")
				show_menu_admin(id)
			}
		}
		case ACTION_MAKE_ASSASSIN: // Assassin command
		{
			if (userflags & (g_access_flag[ACCESS_MODE_ASSASSIN] | g_access_flag[ACCESS_MAKE_ASSASSIN]))
			{
				// Show player list for admin to pick a target
				PL_ACTION = ACTION_MAKE_ASSASSIN
				show_menu_player_list(id)
			}
			else
			{
				zp_colored_print(id, "^x04[ZP]^x01 %L", id, "CMD_NOT_ACCESS")
				show_menu_admin(id)
			}
		}
		case ACTION_MAKE_SURVIVOR: // Survivor command
		{
			if (userflags & (g_access_flag[ACCESS_MODE_SURVIVOR] | g_access_flag[ACCESS_MAKE_SURVIVOR]))
			{
				// Show player list for admin to pick a target
				PL_ACTION = ACTION_MAKE_SURVIVOR
				show_menu_player_list(id)
			}
			else
			{
				zp_colored_print(id, "^x04[ZP]^x01 %L", id, "CMD_NOT_ACCESS")
				show_menu_admin(id)
			}
		}
		case ACTION_MAKE_SNIPER: // Sniper command
		{
			if (userflags & (g_access_flag[ACCESS_MODE_SNIPER] | g_access_flag[ACCESS_MAKE_SNIPER]))
			{
				// Show player list for admin to pick a target
				PL_ACTION = ACTION_MAKE_SNIPER
				show_menu_player_list(id)
			}
			else
			{
				zp_colored_print(id, "^x04[ZP]^x01 %L", id, "CMD_NOT_ACCESS")
				show_menu_admin(id)
			}
		}
		case ACTION_RESPAWN_PLAYER: // Respawn command
		{
			if (userflags & g_access_flag[ACCESS_RESPAWN_PLAYERS])
			{
				// Show player list for admin to pick a target
				PL_ACTION = ACTION_RESPAWN_PLAYER
				show_menu_player_list(id)
			}
			else
			{
				zp_colored_print(id, "^x04[ZP]^x01 %L", id, "CMD_NOT_ACCESS")
				show_menu_admin(id)
			}
		}
		case ACTION_MODES_MENU: // Admin Modes command
		{
			if (userflags & g_access_flag[ACCESS_ADMIN_MODES_MENU])
				show_menu_modes_admin(id)			
			else
			{
				zp_colored_print(id, "^x04[ZP]^x01 %L", id, "CMD_NOT_ACCESS")
				show_menu_admin(id)
			}
		}
	}
	
	return PLUGIN_HANDLED;
}

// Admin Modes Menu
public menu_modes_admin(id, key)
{
	static userflags
	userflags = get_user_flags(id)
	
	switch (key)
	{		
		case ACTION_MODE_SWARM: // Swarm Mode command
		{
			if (userflags & g_access_flag[ACCESS_MODE_SWARM])
			{
				if (allowed_swarm())
					command_swarm(id)
				else
					zp_colored_print(id, "^x04[ZP]^x01 %L", id, "CMD_NOT")
			}
			else
				zp_colored_print(id, "^x04[ZP]^x01 %L", id, "CMD_NOT_ACCESS")
			
			show_menu_modes_admin(id)
		}
		case ACTION_MODE_MULTI: // Multiple Infection command
		{
			if (userflags & g_access_flag[ACCESS_MODE_MULTI])
			{
				if (allowed_multi())
					command_multi(id)
				else
					zp_colored_print(id, "^x04[ZP]^x01 %L", id, "CMD_NOT")
			}
			else
				zp_colored_print(id, "^x04[ZP]^x01 %L", id, "CMD_NOT_ACCESS")
			
			show_menu_modes_admin(id)
		}
		case ACTION_MODE_PLAGUE: // Plague Mode command
		{
			if (userflags & g_access_flag[ACCESS_MODE_PLAGUE])
			{
				if (allowed_plague())
					command_plague(id)
				else
					zp_colored_print(id, "^x04[ZP]^x01 %L", id, "CMD_NOT")
			}
			else
				zp_colored_print(id, "^x04[ZP]^x01 %L", id, "CMD_NOT_ACCESS")
			
			show_menu_modes_admin(id)
		}
		case ACTION_MODE_ARMAGEDDON: // Armageddon Mode command
		{
			if (userflags & g_access_flag[ACCESS_MODE_ARMAGEDDON])
			{
				if (allowed_armageddon())
					command_armageddon(id)
				else
					zp_colored_print(id, "^x04[ZP]^x01 %L", id, "CMD_NOT")
			}
			else
				zp_colored_print(id, "^x04[ZP]^x01 %L", id, "CMD_NOT_ACCESS")
			
			show_menu_modes_admin(id)
		}
		case ACTION_MODE_APOCALYPSE: // Apocalypse Mode command
		{
			if (userflags & g_access_flag[ACCESS_MODE_APOCALYPSE])
			{
				if (allowed_apocalypse())
					command_apocalypse(id)
				else
					zp_colored_print(id, "^x04[ZP]^x01 %L", id, "CMD_NOT")
			}
			else
				zp_colored_print(id, "^x04[ZP]^x01 %L", id, "CMD_NOT_ACCESS")
			
			show_menu_modes_admin(id)
		}
		case ACTION_MODE_NIGHTMARE: // Nightmare Mode command
		{
			if (userflags & g_access_flag[ACCESS_MODE_NIGHTMARE])
			{
				if (allowed_nightmare())
					command_nightmare(id)
				else
					zp_colored_print(id, "^x04[ZP]^x01 %L", id, "CMD_NOT")
			}
			else
				zp_colored_print(id, "^x04[ZP]^x01 %L", id, "CMD_NOT_ACCESS")
			
			show_menu_modes_admin(id)
		}
	}
	
	return PLUGIN_HANDLED;
}

// Player List Menu
public menu_player_list(id, menuid, item)
{
	// Player disconnected?
	if (!is_user_connected(id))
	{
		menu_destroy(menuid)
		return PLUGIN_HANDLED;
	}
	
	// Remember player's menu page
	static menudummy
	player_menu_info(id, menudummy, menudummy, MENU_PAGE_PLAYERS)
	
	// Menu was closed
	if (item == MENU_EXIT)
	{
		menu_destroy(menuid)
		show_menu_admin(id)
		return PLUGIN_HANDLED;
	}
	
	// Retrieve player id
	static buffer[2], dummy, playerid
	menu_item_getinfo(menuid, item, dummy, buffer, charsmax(buffer), _, _, dummy)
	playerid = buffer[0]
	
	// Perform action on player
	
	// Get admin flags
	static userflags
	userflags = get_user_flags(id)
	
	// Make sure it's still connected
	if (g_isconnected[playerid])
	{
		// Perform the right action if allowed
		switch (PL_ACTION)
		{
			case ACTION_ZOMBIEFY_HUMANIZE: // Zombiefy/Humanize command
			{
				if (g_zombie[playerid])
				{
					if (userflags & g_access_flag[ACCESS_MAKE_HUMAN])
					{
						if (allowed_human(playerid))
							command_human(id, playerid)
						else
							zp_colored_print(id, "^x04[ZP]^x01 %L", id, "CMD_NOT")
					}
					else
						zp_colored_print(id, "^x04[ZP]^x01 %L", id, "CMD_NOT_ACCESS")
				}
				else
				{
					if (g_newround ? (userflags & g_access_flag[ACCESS_MODE_INFECTION]) : (userflags & g_access_flag[ACCESS_MAKE_ZOMBIE]))
					{
						if (allowed_zombie(playerid))
							command_zombie(id, playerid)
						else
							zp_colored_print(id, "^x04[ZP]^x01 %L", id, "CMD_NOT")
					}
					else
						zp_colored_print(id, "^x04[ZP]^x01 %L", id, "CMD_NOT_ACCESS")
				}
			}
			case ACTION_MAKE_NEMESIS: // Nemesis command
			{
				if (g_newround ? (userflags & g_access_flag[ACCESS_MODE_NEMESIS]) : (userflags & g_access_flag[ACCESS_MAKE_NEMESIS]))
				{
					if (allowed_nemesis(playerid))
						command_nemesis(id, playerid)
					else
						zp_colored_print(id, "^x04[ZP]^x01 %L", id, "CMD_NOT")
				}
				else
					zp_colored_print(id, "^x04[ZP]^x01 %L", id, "CMD_NOT_ACCESS")
			}
			case ACTION_MAKE_ASSASSIN: // Assassin command
			{
				if (g_newround ? (userflags & g_access_flag[ACCESS_MODE_ASSASSIN]) : (userflags & g_access_flag[ACCESS_MAKE_ASSASSIN]))
				{
					if (allowed_assassin(playerid))
						command_assassin(id, playerid)
					else
						zp_colored_print(id, "^x04[ZP]^x01 %L", id, "CMD_NOT")
				}
				else
					zp_colored_print(id, "^x04[ZP]^x01 %L", id, "CMD_NOT_ACCESS")
			}
			case ACTION_MAKE_SURVIVOR: // Survivor command
			{
				if (g_newround ? (userflags & g_access_flag[ACCESS_MODE_SURVIVOR]) : (userflags & g_access_flag[ACCESS_MAKE_SURVIVOR]))
				{
					if (allowed_survivor(playerid))
						command_survivor(id, playerid)
					else
						zp_colored_print(id, "^x04[ZP]^x01 %L", id, "CMD_NOT")
				}
				else
					zp_colored_print(id, "^x04[ZP]^x01 %L", id, "CMD_NOT_ACCESS")
			}
			case ACTION_MAKE_SNIPER: // Sniper command
			{
				if (g_newround ? (userflags & g_access_flag[ACCESS_MODE_SNIPER]) : (userflags & g_access_flag[ACCESS_MAKE_SNIPER]))
				{
					if (allowed_sniper(playerid))
						command_sniper(id, playerid)
					else
						zp_colored_print(id, "^x04[ZP]^x01 %L", id, "CMD_NOT")
				}
				else
					zp_colored_print(id, "^x04[ZP]^x01 %L", id, "CMD_NOT_ACCESS")
			}
			case ACTION_RESPAWN_PLAYER: // Respawn command
			{
				if (userflags & g_access_flag[ACCESS_RESPAWN_PLAYERS])
				{
					if (allowed_respawn(playerid))
						command_respawn(id, playerid)
					else
						zp_colored_print(id, "^x04[ZP]^x01 %L", id, "CMD_NOT")
				}
				else
					zp_colored_print(id, "^x04[ZP]^x01 %L", id, "CMD_NOT_ACCESS")
			}
		}
	}
	else
		zp_colored_print(id, "^x04[ZP]^x01 %L", id, "CMD_NOT")
	
	menu_destroy(menuid)
	show_menu_player_list(id)
	return PLUGIN_HANDLED;
}

// CS Buy Menus
public menu_cs_buy(id, key)
{
	// Prevent buying if zombie/survivor (bugfix)
	if (g_zombie[id] || g_survivor[id] || g_sniper[id])
		return PLUGIN_HANDLED;
	
	return PLUGIN_CONTINUE;
}

/*================================================================================
 [Admin Commands]
=================================================================================*/

// zp_toggle [1/0]
public cmd_toggle(id, level, cid)
{
	// Check for access flag - Enable/Disable Mod
	if (!cmd_access(id, g_access_flag[ACCESS_ENABLE_MOD], cid, 2))
		return PLUGIN_HANDLED;
	
	// Retrieve arguments
	new arg[2]
	read_argv(1, arg, charsmax(arg))
	
	// Mod already enabled/disabled
	if (str_to_num(arg) == g_pluginenabled)
		return PLUGIN_HANDLED;
	
	// Set toggle cvar
	set_pcvar_num(cvar_toggle, str_to_num(arg))
	client_print(id, print_console, "Zombie Plague %L.", id, str_to_num(arg) ? "MOTD_ENABLED" : "MOTD_DISABLED")
	
	// Retrieve map name
	new mapname[32]
	get_mapname(mapname, charsmax(mapname))
	
	// Restart current map
	server_cmd("changelevel %s", mapname)
	
	return PLUGIN_HANDLED;
}

// zp_zombie [target]
public cmd_zombie(id, level, cid)
{
	// Check for access flag depending on the resulting action
	if (g_newround)
	{
		// Start Mode Infection
		if (!cmd_access(id, g_access_flag[ACCESS_MODE_INFECTION], cid, 2))
			return PLUGIN_HANDLED;
	}
	else
	{
		// Make Zombie
		if (!cmd_access(id, g_access_flag[ACCESS_MAKE_ZOMBIE], cid, 2))
			return PLUGIN_HANDLED;
	}
	
	// Retrieve arguments
	static arg[32], player
	read_argv(1, arg, charsmax(arg))
	player = cmd_target(id, arg, (CMDTARGET_ONLY_ALIVE | CMDTARGET_ALLOW_SELF))
	
	// Invalid target
	if (!player) return PLUGIN_HANDLED;
	
	// Target not allowed to be zombie
	if (!allowed_zombie(player))
	{
		client_print(id, print_console, "[ZP] %L", id, "CMD_NOT")
		return PLUGIN_HANDLED
	}
	
	command_zombie(id, player)
	
	return PLUGIN_HANDLED;
}

// zp_human [target]
public cmd_human(id, level, cid)
{
	// Check for access flag - Make Human
	if (!cmd_access(id, g_access_flag[ACCESS_MAKE_HUMAN], cid, 2))
		return PLUGIN_HANDLED;
	
	// Retrieve arguments
	static arg[32], player
	read_argv(1, arg, charsmax(arg))
	player = cmd_target(id, arg, (CMDTARGET_ONLY_ALIVE | CMDTARGET_ALLOW_SELF))
	
	// Invalid target
	if (!player) return PLUGIN_HANDLED;
	
	// Target not allowed to be human
	if (!allowed_human(player))
	{
		client_print(id, print_console, "[ZP] %L", id, "CMD_NOT")
		return PLUGIN_HANDLED;
	}
	
	command_human(id, player)
	
	return PLUGIN_HANDLED;
}

// zp_survivor [target]
public cmd_survivor(id, level, cid)
{
	// Check for access flag depending on the resulting action
	if (g_newround)
	{
		// Start Mode Survivor
		if (!cmd_access(id, g_access_flag[ACCESS_MODE_SURVIVOR], cid, 2))
			return PLUGIN_HANDLED;
	}
	else
	{
		// Make Survivor
		if (!cmd_access(id, g_access_flag[ACCESS_MAKE_SURVIVOR], cid, 2))
			return PLUGIN_HANDLED;
	}
	
	// Retrieve arguments
	static arg[32], player
	read_argv(1, arg, charsmax(arg))
	player = cmd_target(id, arg, (CMDTARGET_ONLY_ALIVE | CMDTARGET_ALLOW_SELF))
	
	// Invalid target
	if (!player) return PLUGIN_HANDLED;
	
	// Target not allowed to be survivor
	if (!allowed_survivor(player))
	{
		client_print(id, print_console, "[ZP] %L", id, "CMD_NOT")
		return PLUGIN_HANDLED;
	}
	
	command_survivor(id, player)
	
	return PLUGIN_HANDLED;
}

// zp_sniper [target]
public cmd_sniper(id, level, cid)
{
	// Check for access flag depending on the resulting action
	if (g_newround)
	{
		// Start Mode Sniper
		if (!cmd_access(id, g_access_flag[ACCESS_MODE_SNIPER], cid, 2))
			return PLUGIN_HANDLED;
	}
	else
	{
		// Make Sniper
		if (!cmd_access(id, g_access_flag[ACCESS_MAKE_SNIPER], cid, 2))
			return PLUGIN_HANDLED;
	}
	
	// Retrieve arguments
	static arg[32], player
	read_argv(1, arg, charsmax(arg))
	player = cmd_target(id, arg, (CMDTARGET_ONLY_ALIVE | CMDTARGET_ALLOW_SELF))
	
	// Invalid target
	if (!player) return PLUGIN_HANDLED;
	
	// Target not allowed to be sniper
	if (!allowed_sniper(player))
	{
		client_print(id, print_console, "[ZP] %L", id, "CMD_NOT")
		return PLUGIN_HANDLED;
	}
	
	command_sniper(id, player)
	
	return PLUGIN_HANDLED;
}

// zp_nemesis [target]
public cmd_nemesis(id, level, cid)
{
	// Check for access flag depending on the resulting action
	if (g_newround)
	{
		// Start Mode Nemesis
		if (!cmd_access(id, g_access_flag[ACCESS_MODE_NEMESIS], cid, 2))
			return PLUGIN_HANDLED;
	}
	else
	{
		// Make Nemesis
		if (!cmd_access(id, g_access_flag[ACCESS_MAKE_NEMESIS], cid, 2))
			return PLUGIN_HANDLED;
	}
	
	// Retrieve arguments
	static arg[32], player
	read_argv(1, arg, charsmax(arg))
	player = cmd_target(id, arg, (CMDTARGET_ONLY_ALIVE | CMDTARGET_ALLOW_SELF))
	
	// Invalid target
	if (!player) return PLUGIN_HANDLED;
	
	// Target not allowed to be nemesis
	if (!allowed_nemesis(player))
	{
		client_print(id, print_console, "[ZP] %L", id, "CMD_NOT")
		return PLUGIN_HANDLED;
	}
	
	command_nemesis(id, player)
	
	return PLUGIN_HANDLED;
}

// zp_assassin [target]
public cmd_assassin(id, level, cid)
{
	// Check for access flag depending on the resulting action
	if (g_newround)
	{
		// Start Mode Assassin
		if (!cmd_access(id, g_access_flag[ACCESS_MODE_ASSASSIN], cid, 2))
			return PLUGIN_HANDLED;
	}
	else
	{
		// Make Assassin
		if (!cmd_access(id, g_access_flag[ACCESS_MAKE_ASSASSIN], cid, 2))
			return PLUGIN_HANDLED;
	}
	
	// Retrieve arguments
	static arg[32], player
	read_argv(1, arg, charsmax(arg))
	player = cmd_target(id, arg, (CMDTARGET_ONLY_ALIVE | CMDTARGET_ALLOW_SELF))
	
	// Invalid target
	if (!player) return PLUGIN_HANDLED;
	
	// Target not allowed to be assassin
	if (!allowed_assassin(player))
	{
		client_print(id, print_console, "[ZP] %L", id, "CMD_NOT")
		return PLUGIN_HANDLED;
	}
	
	command_assassin(id, player)
	
	return PLUGIN_HANDLED;
}

// zp_respawn [target]
public cmd_respawn(id, level, cid)
{
	// Check for access flag - Respawn
	if (!cmd_access(id, g_access_flag[ACCESS_RESPAWN_PLAYERS], cid, 2))
		return PLUGIN_HANDLED;
	
	// Retrieve arguments
	static arg[32], player
	read_argv(1, arg, charsmax(arg))
	player = cmd_target(id, arg, CMDTARGET_ALLOW_SELF)
	
	// Invalid target
	if (!player) return PLUGIN_HANDLED;
	
	// Target not allowed to be respawned
	if (!allowed_respawn(player))
	{
		client_print(id, print_console, "[ZP] %L", id, "CMD_NOT")
		return PLUGIN_HANDLED;
	}
	
	command_respawn(id, player)
	
	return PLUGIN_HANDLED;
}

// zp_swarm
public cmd_swarm(id, level, cid)
{
	// Check for access flag - Mode Swarm
	if (!cmd_access(id, g_access_flag[ACCESS_MODE_SWARM], cid, 1))
		return PLUGIN_HANDLED;
	
	// Swarm mode not allowed
	if (!allowed_swarm())
	{
		client_print(id, print_console, "[ZP] %L", id, "CMD_NOT")
		return PLUGIN_HANDLED;
	}
	
	command_swarm(id)
	
	return PLUGIN_HANDLED;
}

// zp_multi
public cmd_multi(id, level, cid)
{
	// Check for access flag - Mode Multi
	if (!cmd_access(id, g_access_flag[ACCESS_MODE_MULTI], cid, 1))
		return PLUGIN_HANDLED;
	
	// Multi infection mode not allowed
	if (!allowed_multi())
	{
		client_print(id, print_console, "[ZP] %L", id, "CMD_NOT")
		return PLUGIN_HANDLED;
	}
	
	command_multi(id)
	
	return PLUGIN_HANDLED;
}

// zp_plague
public cmd_plague(id, level, cid)
{
	// Check for access flag - Mode Plague
	if (!cmd_access(id, g_access_flag[ACCESS_MODE_PLAGUE], cid, 1))
		return PLUGIN_HANDLED;
	
	// Plague mode not allowed
	if (!allowed_plague())
	{
		client_print(id, print_console, "[ZP] %L", id, "CMD_NOT")
		return PLUGIN_HANDLED;
	}
	
	command_plague(id)
	
	return PLUGIN_HANDLED;
}

// zp_armageddon
public cmd_armageddon(id, level, cid)
{
	// Check for access flag - Mode Armageddon
	if (!cmd_access(id, g_access_flag[ACCESS_MODE_ARMAGEDDON], cid, 1))
		return PLUGIN_HANDLED;
	
	// Armageddon mode not allowed
	if (!allowed_armageddon())
	{
		client_print(id, print_console, "[ZP] %L", id, "CMD_NOT")
		return PLUGIN_HANDLED;
	}
	
	command_armageddon(id)
	
	return PLUGIN_HANDLED;
}

// zp_apocalypse
public cmd_apocalypse(id, level, cid)
{
	// Check for access flag - Mode Apocalypse
	if (!cmd_access(id, g_access_flag[ACCESS_MODE_APOCALYPSE], cid, 1))
		return PLUGIN_HANDLED;
	
	// Apocalypse mode not allowed
	if (!allowed_apocalypse())
	{
		client_print(id, print_console, "[ZP] %L", id, "CMD_NOT")
		return PLUGIN_HANDLED;
	}
	
	command_apocalypse(id)
	
	return PLUGIN_HANDLED;
}

// zp_nightmare
public cmd_nightmare(id, level, cid)
{
	// Check for access flag - Mode Nightmare
	if (!cmd_access(id, g_access_flag[ACCESS_MODE_NIGHTMARE], cid, 1))
		return PLUGIN_HANDLED;
	
	// Nightmare mode not allowed
	if (!allowed_nightmare())
	{
		client_print(id, print_console, "[ZP] %L", id, "CMD_NOT")
		return PLUGIN_HANDLED;
	}
	
	command_nightmare(id)
	
	return PLUGIN_HANDLED;
}

/*================================================================================
 [Message Hooks]
=================================================================================*/

// Current Weapon info
public message_cur_weapon(msg_id, msg_dest, msg_entity)
{
	// Not alive or zombie
	if (!g_isalive[msg_entity] || g_zombie[msg_entity])
		return;
	
	// Not an active weapon
	if (get_msg_arg_int(1) != 1)
		return;
	
	// Unlimited clip disabled for class
	if (g_survivor[msg_entity] ? get_pcvar_num(cvar_survinfammo) <= 1 : g_sniper[msg_entity] ? get_pcvar_num(cvar_sniinfammo) <= 1 : get_pcvar_num(cvar_infammo) <= 1)
		return;
	
	// Get weapon's id
	static weapon
	weapon = get_msg_arg_int(2)
	
	// Unlimited Clip Ammo for this weapon?
	if (MAXBPAMMO[weapon] > 2)
	{
		// Max out clip ammo
		static weapon_ent
		weapon_ent = fm_cs_get_current_weapon_ent(msg_entity)
		if (pev_valid(weapon_ent)) cs_set_weapon_ammo(weapon_ent, MAXCLIP[weapon])
		
		// HUD should show full clip all the time
		set_msg_arg_int(3, get_msg_argtype(3), MAXCLIP[weapon])
	}
}

// Take off player's money
public message_money(msg_id, msg_dest, msg_entity)
{
	// Remove money setting enabled?
	if (!get_pcvar_num(cvar_removemoney))
		return PLUGIN_CONTINUE;
	
	fm_cs_set_user_money(msg_entity, 0)
	return PLUGIN_HANDLED;
}

// Fix for the HL engine bug when HP is multiples of 256
public message_health(msg_id, msg_dest, msg_entity)
{
	// Get player's health
	static health
	health = get_msg_arg_int(1)
	
	// Don't bother
	if (health < 256) return;
	
	// Check if we need to fix it
	if (health % 256 == 0)
		fm_set_user_health(msg_entity, pev(msg_entity, pev_health) + 1)
	
	// HUD can only show as much as 255 hp
	set_msg_arg_int(1, get_msg_argtype(1), 255)
}

// Block flashlight battery messages if custom flashlight is enabled instead
public message_flashbat()
{
	if (g_cached_customflash)
		return PLUGIN_HANDLED;
	
	return PLUGIN_CONTINUE;
}

// Flashbangs should only affect zombies
public message_screenfade(msg_id, msg_dest, msg_entity)
{
	if (get_msg_arg_int(4) != 255 || get_msg_arg_int(5) != 255 || get_msg_arg_int(6) != 255 || get_msg_arg_int(7) < 200)
		return PLUGIN_CONTINUE;
	
	// Nemesis shouldn't be FBed
	if (g_zombie[msg_entity] && !g_nemesis[msg_entity] && !g_assassin[msg_entity])
	{
		// Set flash color to nighvision's
		set_msg_arg_int(4, get_msg_argtype(4), get_pcvar_num(cvar_nvgcolor[0]))
		set_msg_arg_int(5, get_msg_argtype(5), get_pcvar_num(cvar_nvgcolor[1]))
		set_msg_arg_int(6, get_msg_argtype(6), get_pcvar_num(cvar_nvgcolor[2]))
		return PLUGIN_CONTINUE;
	}
	
	return PLUGIN_HANDLED;
}

// Prevent spectators' nightvision from being turned off when switching targets, etc.
public message_nvgtoggle()
{
	return PLUGIN_HANDLED;
}

// Set correct model on player corpses
public message_clcorpse()
{
	set_msg_arg_string(1, g_playermodel[get_msg_arg_int(12)])
}

// Prevent zombies from seeing any weapon pickup icon
public message_weappickup(msg_id, msg_dest, msg_entity)
{
	if (g_zombie[msg_entity])
		return PLUGIN_HANDLED;
	
	return PLUGIN_CONTINUE;
}

// Prevent zombies from seeing any ammo pickup icon
public message_ammopickup(msg_id, msg_dest, msg_entity)
{
	if (g_zombie[msg_entity])
		return PLUGIN_HANDLED;
	
	return PLUGIN_CONTINUE;
}

// Block hostage HUD display
public message_scenario()
{
	if (get_msg_args() > 1)
	{
		static sprite[8]
		get_msg_arg_string(2, sprite, charsmax(sprite))
		
		if (equal(sprite, "hostage"))
			return PLUGIN_HANDLED;
	}
	
	return PLUGIN_CONTINUE;
}

// Block hostages from appearing on radar
public message_hostagepos()
{
	return PLUGIN_HANDLED;
}

// Block some text messages
public message_textmsg()
{
	static textmsg[22]
	get_msg_arg_string(2, textmsg, charsmax(textmsg))
	
	// Game restarting, reset scores and call round end to balance the teams
	if (equal(textmsg, "#Game_will_restart_in"))
	{
		logevent_round_end()
		g_scorehumans = 0
		g_scorezombies = 0
	}
	// Game commencing, reset scores only (round end is automatically triggered)
	else if (equal(textmsg, "#Game_Commencing"))
	{
		g_gamecommencing = true
		g_scorehumans = 0
		g_scorezombies = 0
	}
	// Block round end related messages
	else if (equal(textmsg, "#Hostages_Not_Rescued") || equal(textmsg, "#Round_Draw") || equal(textmsg, "#Terrorists_Win") || equal(textmsg, "#CTs_Win"))
	{
		return PLUGIN_HANDLED;
	}
	
	return PLUGIN_CONTINUE;
}

// Block CS round win audio messages, since we're playing our own instead
public message_sendaudio()
{
	static audio[17]
	get_msg_arg_string(2, audio, charsmax(audio))
	
	if(equal(audio[7], "terwin") || equal(audio[7], "ctwin") || equal(audio[7], "rounddraw"))
		return PLUGIN_HANDLED;
	
	return PLUGIN_CONTINUE;
}

// Send actual team scores (T = zombies // CT = humans)
public message_teamscore()
{
	static team[2]
	get_msg_arg_string(1, team, charsmax(team))
	
	switch (team[0])
	{
		// CT
		case 'C': set_msg_arg_int(2, get_msg_argtype(2), g_scorehumans)
		// Terrorist
		case 'T': set_msg_arg_int(2, get_msg_argtype(2), g_scorezombies)
	}
}

// Team Switch (or player joining a team for first time)
public message_teaminfo(msg_id, msg_dest)
{
	// Only hook global messages
	if (msg_dest != MSG_ALL && msg_dest != MSG_BROADCAST) return;
	
	// Don't pick up our own TeamInfo messages for this player (bugfix)
	if (g_switchingteam) return;
	
	// Get player's id
	static id
	id = get_msg_arg_int(1)
	
	// Invalid player id? (bugfix)
	if (!(1 <= id <= g_maxplayers)) return;
	
	// Enable spectators' nightvision if not spawning right away
	set_task(0.2, "spec_nvision", id)
	
	// Round didn't start yet, nothing to worry about
	if (g_newround) return;
	
	// Get his new team
	static team[2]
	get_msg_arg_string(2, team, charsmax(team))
	
	// Perform some checks to see if they should join a different team instead
	switch (team[0])
	{
		case 'C': // CT
		{
			if ((g_survround && fnGetHumans()) || (g_sniround && fnGetHumans())) // survivor/sniper alive --> switch to T and spawn as zombie
			{
				g_respawn_as_zombie[id] = true;
				remove_task(id+TASK_TEAM)
				fm_cs_set_user_team(id, FM_CS_TEAM_T)
				set_msg_arg_string(2, "TERRORIST")
			}
			else if (!fnGetZombies()) // no zombies alive --> switch to T and spawn as zombie
			{
				g_respawn_as_zombie[id] = true;
				remove_task(id+TASK_TEAM)
				fm_cs_set_user_team(id, FM_CS_TEAM_T)
				set_msg_arg_string(2, "TERRORIST")
			}
		}
		case 'T': // Terrorist
		{
			if ((g_swarmround || g_survround || g_sniround) && fnGetHumans()) // survivor alive or swarm round w/ humans --> spawn as zombie
			{
				g_respawn_as_zombie[id] = true;
			}
			else if (fnGetZombies()) // zombies alive --> switch to CT
			{
				remove_task(id+TASK_TEAM)
				fm_cs_set_user_team(id, FM_CS_TEAM_CT)
				set_msg_arg_string(2, "CT")
			}
		}
	}
}

/*================================================================================
 [Main Functions]
=================================================================================*/

// Make Zombie Task
public make_zombie_task()
{
	// Call make a zombie with no specific mode
	make_a_zombie(MODE_NONE, 0)
}

// Make a Zombie Function
make_a_zombie(mode, id)
{
	// Get alive players count
	static iPlayersnum
	iPlayersnum = fnGetAlive()
	
	// Not enough players, come back later!
	if (iPlayersnum < 1)
	{
		set_task(2.0, "make_zombie_task", TASK_MAKEZOMBIE)
		return;
	}
	
	// Round started!
	g_newround = false
	
	// Set up some common vars
	static forward_id, sound[64], iZombies, iMaxZombies
	
	if ((mode == MODE_NONE && (!get_pcvar_num(cvar_preventconsecutive) || g_lastmode != MODE_SURVIVOR) && random_num(1, get_pcvar_num(cvar_survchance)) == get_pcvar_num(cvar_surv) && iPlayersnum >= get_pcvar_num(cvar_survminplayers)) || mode == MODE_SURVIVOR)
	{
		// Survivor Mode
		g_survround = true
		g_lastmode = MODE_SURVIVOR
		
		// Choose player randomly?
		if (mode == MODE_NONE)
			id = fnGetRandomAlive(random_num(1, iPlayersnum))
		
		// Remember id for calling our forward later
		forward_id = id
		
		// Turn player into a survivor
		humanme(id, 1, 0, 0)
		
		// Turn the remaining players into zombies
		for (id = 1; id <= g_maxplayers; id++)
		{
			// Not alive
			if (!g_isalive[id])
				continue;
			
			// Survivor or already a zombie
			if (g_survivor[id] || g_zombie[id])
				continue;
			
			// Turn into a zombie
			zombieme(id, 0, 0, 0, 1, 0)
		}
		
		// Play survivor sound
		ArrayGetString(sound_survivor, random_num(0, ArraySize(sound_survivor) - 1), sound, charsmax(sound))
		PlaySound(sound);
		
		// Show Survivor HUD notice
		set_hudmessage(20, 20, 255, HUD_EVENT_X, HUD_EVENT_Y, 1, 0.0, 5.0, 1.0, 1.0, -1)
		ShowSyncHudMsg(0, g_MsgSync, "%L", LANG_PLAYER, "NOTICE_SURVIVOR", g_playername[forward_id])
		
		// Mode fully started!
		g_modestarted = true
		
		// Round start forward
		ExecuteForward(g_fwRoundStart, g_fwDummyResult, MODE_SURVIVOR, forward_id);
	}
        else if ((mode == MODE_NONE && (!get_pcvar_num(cvar_preventconsecutive) || g_lastmode != MODE_SNIPER) && random_num(1, get_pcvar_num(cvar_snichance)) == get_pcvar_num(cvar_sni) && iPlayersnum >= get_pcvar_num(cvar_sniminplayers)) || mode == MODE_SNIPER)
	{
		// Sniper Mode
		g_sniround = true
		g_lastmode = MODE_SNIPER
		
		// Choose player randomly?
		if (mode == MODE_NONE)
		id = fnGetRandomAlive(random_num(1, iPlayersnum))
		
		// Remember id for calling our forward later
		forward_id = id
		
		// Turn player into a sniper
		humanme(id, 0, 1, 0)
		
		// Turn the remaining players into zombies
		for (id = 1; id <= g_maxplayers; id++)
		{
			// Not alive
			if (!g_isalive[id])
			continue;
			
			// Sniper or already a zombie
			if (g_sniper[id] || g_zombie[id])
			continue;
			
			// Turn into a zombie
			zombieme(id, 0, 0, 0, 1, 0)
		}
		
		// Play sniper sound
		ArrayGetString(sound_sniper, random_num(0, ArraySize(sound_sniper) - 1), sound, charsmax(sound))
		PlaySound(sound);
		
		// Show Sniper HUD notice
		set_hudmessage(20, 20, 255, HUD_EVENT_X, HUD_EVENT_Y, 1, 0.0, 5.0, 1.0, 1.0, -1)
		ShowSyncHudMsg(0, g_MsgSync, "%s is Sniper !!!", g_playername[forward_id])
	
		// Mode fully started!
		g_modestarted = true
		
		// Round start forward
		ExecuteForward(g_fwRoundStart, g_fwDummyResult, MODE_SNIPER, forward_id);
	}
	else if ((mode == MODE_NONE && (!get_pcvar_num(cvar_preventconsecutive) || g_lastmode != MODE_SWARM) && random_num(1, get_pcvar_num(cvar_swarmchance)) == get_pcvar_num(cvar_swarm) && iPlayersnum >= get_pcvar_num(cvar_swarmminplayers)) || mode == MODE_SWARM)
	{		
		// Swarm Mode
		g_swarmround = true
		g_lastmode = MODE_SWARM
		
		// Make sure there are alive players on both teams (BUGFIX)
		if (!fnGetAliveTs())
		{
			// Move random player to T team
			id = fnGetRandomAlive(random_num(1, iPlayersnum))
			remove_task(id+TASK_TEAM)
			fm_cs_set_user_team(id, FM_CS_TEAM_T)
			fm_user_team_update(id)
		}
		else if (!fnGetAliveCTs())
		{
			// Move random player to CT team
			id = fnGetRandomAlive(random_num(1, iPlayersnum))
			remove_task(id+TASK_TEAM)
			fm_cs_set_user_team(id, FM_CS_TEAM_CT)
			fm_user_team_update(id)
		}
		
		// Turn every T into a zombie
		for (id = 1; id <= g_maxplayers; id++)
		{
			// Not alive
			if (!g_isalive[id])
				continue;
			
			// Not a Terrorist
			if (fm_cs_get_user_team(id) != FM_CS_TEAM_T)
				continue;
			
			// Turn into a zombie
			zombieme(id, 0, 0, 0, 1, 0)
		}
		
		// Play swarm sound
		ArrayGetString(sound_swarm, random_num(0, ArraySize(sound_swarm) - 1), sound, charsmax(sound))
		PlaySound(sound);
		
		// Show Swarm HUD notice
		set_hudmessage(20, 255, 20, HUD_EVENT_X, HUD_EVENT_Y, 1, 0.0, 5.0, 1.0, 1.0, -1)
		ShowSyncHudMsg(0, g_MsgSync, "%L", LANG_PLAYER, "NOTICE_SWARM")
		
		// Mode fully started!
		g_modestarted = true
		
		// Round start forward
		ExecuteForward(g_fwRoundStart, g_fwDummyResult, MODE_SWARM, 0);
	}
	else if ((mode == MODE_NONE && (!get_pcvar_num(cvar_preventconsecutive) || g_lastmode != MODE_MULTI) && random_num(1, get_pcvar_num(cvar_multichance)) == get_pcvar_num(cvar_multi) && floatround(iPlayersnum*get_pcvar_float(cvar_multiratio), floatround_ceil) >= 2 && floatround(iPlayersnum*get_pcvar_float(cvar_multiratio), floatround_ceil) < iPlayersnum && iPlayersnum >= get_pcvar_num(cvar_multiminplayers)) || mode == MODE_MULTI)
	{
		// Multi Infection Mode
		g_lastmode = MODE_MULTI
		
		// iMaxZombies is rounded up, in case there aren't enough players
		iMaxZombies = floatround(iPlayersnum*get_pcvar_float(cvar_multiratio), floatround_ceil)
		iZombies = 0
		
		// Randomly turn iMaxZombies players into zombies
		while (iZombies < iMaxZombies)
		{
			// Keep looping through all players
			if (++id > g_maxplayers) id = 1
			
			// Dead or already a zombie
			if (!g_isalive[id] || g_zombie[id])
				continue;
			
			// Random chance
			if (random_num(0, 1))
			{
				// Turn into a zombie
				zombieme(id, 0, 0, 0, 1, 0)
				iZombies++
			}
		}
		
		// Turn the remaining players into humans
		for (id = 1; id <= g_maxplayers; id++)
		{
			// Only those of them who aren't zombies
			if (!g_isalive[id] || g_zombie[id])
				continue;
			
			// Switch to CT
			if (fm_cs_get_user_team(id) != FM_CS_TEAM_CT) // need to change team?
			{
				remove_task(id+TASK_TEAM)
				fm_cs_set_user_team(id, FM_CS_TEAM_CT)
				fm_user_team_update(id)
			}
		}
		
		// Play multi infection sound
		ArrayGetString(sound_multi, random_num(0, ArraySize(sound_multi) - 1), sound, charsmax(sound))
		PlaySound(sound);
		
		// Show Multi Infection HUD notice
		set_hudmessage(200, 50, 0, HUD_EVENT_X, HUD_EVENT_Y, 1, 0.0, 5.0, 1.0, 1.0, -1)
		ShowSyncHudMsg(0, g_MsgSync, "%L", LANG_PLAYER, "NOTICE_MULTI")
		
		// Mode fully started!
		g_modestarted = true
		
		// Round start forward
		ExecuteForward(g_fwRoundStart, g_fwDummyResult, MODE_MULTI, 0);
	}
	else if ((mode == MODE_NONE && (!get_pcvar_num(cvar_preventconsecutive) || g_lastmode != MODE_PLAGUE) && random_num(1, get_pcvar_num(cvar_plaguechance)) == get_pcvar_num(cvar_plague) && floatround((iPlayersnum-(get_pcvar_num(cvar_plaguenemnum)+get_pcvar_num(cvar_plaguesurvnum)))*get_pcvar_float(cvar_plagueratio), floatround_ceil) >= 1
	&& iPlayersnum-(get_pcvar_num(cvar_plaguesurvnum)+get_pcvar_num(cvar_plaguenemnum)+floatround((iPlayersnum-(get_pcvar_num(cvar_plaguenemnum)+get_pcvar_num(cvar_plaguesurvnum)))*get_pcvar_float(cvar_plagueratio), floatround_ceil)) >= 1 && iPlayersnum >= get_pcvar_num(cvar_plagueminplayers)) || mode == MODE_PLAGUE)
	{
		// Plague Mode
		g_plagueround = true
		g_lastmode = MODE_PLAGUE
		
		// Turn specified amount of players into Survivors
		static iSurvivors, iMaxSurvivors
		iMaxSurvivors = get_pcvar_num(cvar_plaguesurvnum)
		iSurvivors = 0
		
		while (iSurvivors < iMaxSurvivors)
		{
			// Choose random guy
			id = fnGetRandomAlive(random_num(1, iPlayersnum))
			
			// Already a survivor?
			if (g_survivor[id])
				continue;
			
			// If not, turn him into one
			humanme(id, 1, 0, 0)
			iSurvivors++
			
			// Apply survivor health multiplier
			fm_set_user_health(id, floatround(float(pev(id, pev_health)) * get_pcvar_float(cvar_plaguesurvhpmulti)))
		}
		
		// Turn specified amount of players into Nemesis
		static iNemesis, iMaxNemesis
		iMaxNemesis = get_pcvar_num(cvar_plaguenemnum)
		iNemesis = 0
		
		while (iNemesis < iMaxNemesis)
		{
			// Choose random guy
			id = fnGetRandomAlive(random_num(1, iPlayersnum))
			
			// Already a survivor or nemesis?
			if (g_survivor[id] || g_nemesis[id])
				continue;
			
			// If not, turn him into one
			zombieme(id, 0, 1, 0, 0, 0)
			iNemesis++
			
			// Apply nemesis health multiplier
			fm_set_user_health(id, floatround(float(pev(id, pev_health)) * get_pcvar_float(cvar_plaguenemhpmulti)))
		}
		
		// iMaxZombies is rounded up, in case there aren't enough players
		iMaxZombies = floatround((iPlayersnum-(get_pcvar_num(cvar_plaguenemnum)+get_pcvar_num(cvar_plaguesurvnum)))*get_pcvar_float(cvar_plagueratio), floatround_ceil)
		iZombies = 0
		
		// Randomly turn iMaxZombies players into zombies
		while (iZombies < iMaxZombies)
		{
			// Keep looping through all players
			if (++id > g_maxplayers) id = 1
			
			// Dead or already a zombie or survivor
			if (!g_isalive[id] || g_zombie[id] || g_survivor[id])
				continue;
			
			// Random chance
			if (random_num(0, 1))
			{
				// Turn into a zombie
				zombieme(id, 0, 0, 0, 1, 0)
				iZombies++
			}
		}
		
		// Turn the remaining players into humans
		for (id = 1; id <= g_maxplayers; id++)
		{
			// Only those of them who arent zombies or survivor
			if (!g_isalive[id] || g_zombie[id] || g_survivor[id])
				continue;
			
			// Switch to CT
			if (fm_cs_get_user_team(id) != FM_CS_TEAM_CT) // need to change team?
			{
				remove_task(id+TASK_TEAM)
				fm_cs_set_user_team(id, FM_CS_TEAM_CT)
				fm_user_team_update(id)
			}
		}
		
		// Play plague sound
		ArrayGetString(sound_plague, random_num(0, ArraySize(sound_plague) - 1), sound, charsmax(sound))
		PlaySound(sound);
		
		// Show Plague HUD notice
		set_hudmessage(0, 50, 200, HUD_EVENT_X, HUD_EVENT_Y, 1, 0.0, 5.0, 1.0, 1.0, -1)
		ShowSyncHudMsg(0, g_MsgSync, "%L", LANG_PLAYER, "NOTICE_PLAGUE")
		
		// Mode fully started!
		g_modestarted = true
		
		// Round start forward
		ExecuteForward(g_fwRoundStart, g_fwDummyResult, MODE_PLAGUE, 0);
	}
	else if ((mode == MODE_NONE && (!get_pcvar_num(cvar_preventconsecutive) || g_lastmode != MODE_ARMAGEDDON) && random_num(1, get_pcvar_num(cvar_armagechance)) == get_pcvar_num(cvar_armage) && iPlayersnum >= get_pcvar_num(cvar_armageminplayers) && iPlayersnum >= 2) || mode == MODE_ARMAGEDDON)
	{
		// Armageddon Mode
		g_armageround = true
		g_lastmode = MODE_ARMAGEDDON
		
		// iMaxZombies is rounded up, in case there aren't enough players
		iMaxZombies = floatround((iPlayersnum * get_pcvar_float(cvar_armageratio)), floatround_ceil)
		iZombies = 0
		
		// Randomly turn iMaxZombies players into Nemesis
		while (iZombies < iMaxZombies)
		{
			// Keep looping through all players
			if (++id > g_maxplayers) id = 1
			
			// Dead or already a zombie or survivor
			if (!g_isalive[id] || g_zombie[id] || g_survivor[id])
				continue;
			
			// Random chance
			if (random_num(0, 1))
			{
				// Turn into a Nemesis
				zombieme(id, 0, 1, 0, 0, 0)	
				fm_set_user_health(id, floatround(float(pev(id, pev_health)) * get_pcvar_float(cvar_armagenemhpmulti)))
				iZombies++
			}
		}
		
		// Turn the remaining players into survivors
		for (id = 1; id <= g_maxplayers; id++)
		{
			// Only those of them who arent zombies or survivor
			if (!g_isalive[id] || g_zombie[id]|| g_survivor[id])
				continue;
			
			// Turn into a Survivor
			humanme(id, 1, 0, 0)
			fm_set_user_health(id, floatround(float(pev(id, pev_health)) * get_pcvar_float(cvar_armagesurvhpmulti)))
		}
		
		// Play armageddon sound
		ArrayGetString(sound_armageddon, random_num(0, ArraySize(sound_armageddon) - 1), sound, charsmax(sound))
		PlaySound(sound);

		// Show Armageddon HUD notice
		set_hudmessage(181, 62, 244, HUD_EVENT_X, HUD_EVENT_Y, 1, 0.0, 5.0, 1.0, 1.0, -1)
		ShowSyncHudMsg(0, g_MsgSync, "%L", LANG_PLAYER, "NOTICE_ARMAGEDDON")
		
		// Mode fully started!
		g_modestarted = true
		
		// Round start forward
		ExecuteForward(g_fwRoundStart, g_fwDummyResult, MODE_ARMAGEDDON, 0);
	}
	else if ((mode == MODE_NONE && (!get_pcvar_num(cvar_preventconsecutive) || g_lastmode != MODE_APOCALYPSE) && random_num(1, get_pcvar_num(cvar_apocchance)) == get_pcvar_num(cvar_apoc) && iPlayersnum >= get_pcvar_num(cvar_apocminplayers) && iPlayersnum >= 2) || mode == MODE_APOCALYPSE)
	{
		// Apocalypse Mode
		g_apocround = true
		g_lastmode = MODE_APOCALYPSE
		
		// iMaxZombies is rounded up, in case there aren't enough players
		iMaxZombies = floatround((iPlayersnum * get_pcvar_float(cvar_apocratio)), floatround_ceil)
		iZombies = 0
		
		// Randomly turn iMaxZombies players into Assassin
		while (iZombies < iMaxZombies)
		{
			// Keep looping through all players
			if (++id > g_maxplayers) id = 1
			
			// Dead or already a zombie or sniper
			if (!g_isalive[id] || g_zombie[id] || g_sniper[id])
				continue;
			
			// Random chance
			if (random_num(0, 1))
			{
				// Turn into a Assassin
				zombieme(id, 0, 0, 1, 0, 0)	
				fm_set_user_health(id, floatround(float(pev(id, pev_health)) * get_pcvar_float(cvar_apocassahpmulti)))
				iZombies++
			}
		}
		
		// Turn the remaining players into snipers
		for (id = 1; id <= g_maxplayers; id++)
		{
			// Only those of them who arent zombies or sniper
			if (!g_isalive[id] || g_zombie[id]|| g_sniper[id])
				continue;
			
			// Turn into a Sniper
			humanme(id, 0, 1, 0)
			fm_set_user_health(id, floatround(float(pev(id, pev_health)) * get_pcvar_float(cvar_apocsniphpmulti)))
		}
		
		// Play apocalypse sound
		ArrayGetString(sound_apocalypse, random_num(0, ArraySize(sound_apocalypse) - 1), sound, charsmax(sound))
		PlaySound(sound);

		// Show Apocalypse HUD notice
		set_hudmessage(181, 62, 244, HUD_EVENT_X, HUD_EVENT_Y, 1, 0.0, 5.0, 1.0, 1.0, -1)
		ShowSyncHudMsg(0, g_MsgSync, "%L", LANG_PLAYER, "NOTICE_APOCALYPSE")
		
		// Mode fully started!
		g_modestarted = true
		
		// Round start forward
		ExecuteForward(g_fwRoundStart, g_fwDummyResult, MODE_APOCALYPSE, 0);
	}
	else if ((mode == MODE_NONE && (!get_pcvar_num(cvar_preventconsecutive) || g_lastmode != MODE_NIGHTMARE) && random_num(1, get_pcvar_num(cvar_nightchance)) == get_pcvar_num(cvar_night) && iPlayersnum >= get_pcvar_num(cvar_nightminplayers) && iPlayersnum >= 4) || mode == MODE_NIGHTMARE)
	{
		// Nightmare mode
		g_nightround = true
		g_lastmode = MODE_NIGHTMARE

		iMaxZombies = floatround((iPlayersnum * 0.25), floatround_ceil)
		iZombies = 0

		while (iZombies < iMaxZombies)
		{
			if ((++id) > g_maxplayers) id = 1

			if (!g_isalive[id])
				continue;

			if (random_num(1, 5) == 1)
			{
				zombieme(id, 0, 0, 1, 0, 0)	
				fm_set_user_health(id, floatround(float(pev(id, pev_health)) * get_pcvar_float(cvar_nightassahpmulti)))
				iZombies++
			}
		}

		iZombies = 0

		while (iZombies < iMaxZombies)
		{
			if ((++id) > g_maxplayers) id = 1

			if (!g_isalive[id] || g_assassin[id])
				continue;

			if (random_num(1, 5) == 1)
			{
				zombieme(id, 0, 1, 0, 0, 0)	
				fm_set_user_health(id, floatround(float(pev(id, pev_health)) * get_pcvar_float(cvar_nightnemhpmulti)))
				iZombies++
			}
		}

		iZombies = 0

		while (iZombies < iMaxZombies)
		{
			if ((++id) > g_maxplayers) id = 1

			if (!g_isalive[id] || g_assassin[id] || g_nemesis[id])
				continue;

			if (random_num(1, 5) == 1)
			{
				humanme(id, 1, 0, 0)
				fm_set_user_health(id, floatround(float(pev(id, pev_health)) * get_pcvar_float(cvar_nightsurvhpmulti)))
				iZombies++
			}
		}

		for (id = 1; id <= g_maxplayers; id++)
		{
			if (!g_isalive[id] || g_assassin[id] || g_nemesis[id] || g_survivor[id])
				continue;

			humanme(id, 0, 1, 0)
			fm_set_user_health(id, floatround(float(pev(id, pev_health)) * get_pcvar_float(cvar_nightsniphpmulti)))
		}

		// Play nightmare sound
		ArrayGetString(sound_nightmare, random_num(0, ArraySize(sound_nightmare) - 1), sound, charsmax(sound))
		PlaySound(sound);

		// Show Nightmare HUD notice
		set_hudmessage(181, 62, 244, HUD_EVENT_X, HUD_EVENT_Y, 1, 0.0, 5.0, 1.0, 1.0, -1)
		ShowSyncHudMsg(0, g_MsgSync, "%L", LANG_PLAYER, "NOTICE_NIGHTMARE")
		
		// Mode fully started!
		g_modestarted = true
		
		// Round start forward
		ExecuteForward(g_fwRoundStart, g_fwDummyResult, MODE_NIGHTMARE, 0);
	}
	else
	{
		// Single Infection Mode or Nemesis Mode
		
		// Choose player randomly?
		if (mode == MODE_NONE)
			id = fnGetRandomAlive(random_num(1, iPlayersnum))
		
		// Remember id for calling our forward later
		forward_id = id
		
		if ((mode == MODE_NONE && (!get_pcvar_num(cvar_preventconsecutive) || g_lastmode != MODE_NEMESIS) && random_num(1, get_pcvar_num(cvar_nemchance)) == get_pcvar_num(cvar_nem) && iPlayersnum >= get_pcvar_num(cvar_nemminplayers)) || mode == MODE_NEMESIS)
		{
			// Nemesis Mode
			g_nemround = true
			g_lastmode = MODE_NEMESIS
			
			// Turn player into nemesis
			zombieme(id, 0, 1, 0, 0, 0)
		}
		else if ((mode == MODE_NONE && (!get_pcvar_num(cvar_preventconsecutive) || g_lastmode != MODE_ASSASSIN) && random_num(1, get_pcvar_num(cvar_assachance)) == get_pcvar_num(cvar_assa) && iPlayersnum >= get_pcvar_num(cvar_assaminplayers)) || mode == MODE_ASSASSIN)
		{
			// Assassin Mode
			g_assaround = true
			g_lastmode = MODE_ASSASSIN
			
			// Turn player into assassin
			zombieme(id, 0, 0, 1, 0, 0)
		}
		else
		{
			// Single Infection Mode
			g_lastmode = MODE_INFECTION
			
			// Turn player into the first zombie
			zombieme(id, 0, 0, 0, 0, 0)
		}
		
		// Remaining players should be humans (CTs)
		for (id = 1; id <= g_maxplayers; id++)
		{
			// Not alive
			if (!g_isalive[id])
				continue;
			
			// First zombie/nemesis
			if (g_zombie[id])
				continue;
			
			// Switch to CT
			if (fm_cs_get_user_team(id) != FM_CS_TEAM_CT) // need to change team?
			{
				remove_task(id+TASK_TEAM)
				fm_cs_set_user_team(id, FM_CS_TEAM_CT)
				fm_user_team_update(id)
			}
		}
		
		if (g_nemround)
		{
			// Play Nemesis sound
			ArrayGetString(sound_nemesis, random_num(0, ArraySize(sound_nemesis) - 1), sound, charsmax(sound))
			PlaySound(sound);
			
			// Show Nemesis HUD notice
			set_hudmessage(255, 20, 20, HUD_EVENT_X, HUD_EVENT_Y, 1, 0.0, 5.0, 1.0, 1.0, -1)
			ShowSyncHudMsg(0, g_MsgSync, "%L", LANG_PLAYER, "NOTICE_NEMESIS", g_playername[forward_id])
			
			// Mode fully started!
			g_modestarted = true
			
			// Round start forward
			ExecuteForward(g_fwRoundStart, g_fwDummyResult, MODE_NEMESIS, forward_id);
		}
		else if (g_assaround)
		{
			// Play Assassin sound
			ArrayGetString(sound_assassin, random_num(0, ArraySize(sound_assassin) - 1), sound, charsmax(sound))
			PlaySound(sound);
			
			// Show Assassin HUD notice
			set_hudmessage(255, 255, 20, HUD_EVENT_X, HUD_EVENT_Y, 1, 0.0, 5.0, 1.0, 1.0, -1)
			ShowSyncHudMsg(0, g_MsgSync, "%s is Assassin !!!", g_playername[forward_id])
			
			// Mode fully started!
			g_modestarted = true
			
			// Round start forward
			ExecuteForward(g_fwRoundStart, g_fwDummyResult, MODE_ASSASSIN, forward_id);
		}
		else
		{
			// Show First Zombie HUD notice
			set_hudmessage(255, 0, 0, HUD_EVENT_X, HUD_EVENT_Y, 0, 0.0, 5.0, 1.0, 1.0, -1)
			ShowSyncHudMsg(0, g_MsgSync, "%L",LANG_PLAYER, "NOTICE_FIRST", g_playername[forward_id])
			
			// Mode fully started!
			g_modestarted = true
			
			// Round start forward
			ExecuteForward(g_fwRoundStart, g_fwDummyResult, MODE_INFECTION, forward_id);
		}
	}
	
	// Start ambience sounds after a mode begins
	if ((g_ambience_sounds[AMBIENCE_SOUNDS_NEMESIS] && g_nemround) || (g_ambience_sounds[AMBIENCE_SOUNDS_ASSASSIN] && g_assaround) || (g_ambience_sounds[AMBIENCE_SOUNDS_SURVIVOR] && g_survround) || (g_ambience_sounds[AMBIENCE_SOUNDS_SNIPER] && g_sniround) || (g_ambience_sounds[AMBIENCE_SOUNDS_SWARM] && g_swarmround) || (g_ambience_sounds[AMBIENCE_SOUNDS_PLAGUE] && g_plagueround || (g_ambience_sounds[AMBIENCE_SOUNDS_ARMAGEDDON] && g_armageround) 
         || (g_ambience_sounds[AMBIENCE_SOUNDS_APOCALYPSE] && g_apocround) || (g_ambience_sounds[AMBIENCE_SOUNDS_NIGHTMARE] && g_nightround) || (g_ambience_sounds[AMBIENCE_SOUNDS_INFECTION] && !g_nemround && !g_assaround && !g_survround && !g_sniround && !g_swarmround && !g_plagueround && !g_armageround && !g_apocround && !g_nightround)))
	{
		remove_task(TASK_AMBIENCESOUNDS)
		set_task(2.0, "ambience_sound_effects", TASK_AMBIENCESOUNDS)
	}	
}

// Zombie Me Function (player id, infector, turn into a nemesis, silent mode, deathmsg and rewards)
zombieme(id, infector, nemesis, assassin, silentmode, rewards)
{
	// User infect attempt forward
	ExecuteForward(g_fwUserInfect_attempt, g_fwDummyResult, id, infector, nemesis)
	
	// One or more plugins blocked the infection. Only allow this after making sure it's
	// not going to leave us with no zombies. Take into account a last player leaving case.
	// BUGFIX: only allow after a mode has started, to prevent blocking first zombie e.g.
	if (g_fwDummyResult >= ZP_PLUGIN_HANDLED && g_modestarted && fnGetZombies() > g_lastplayerleaving)
		return;
	
	// Pre user infect forward
	ExecuteForward(g_fwUserInfected_pre, g_fwDummyResult, id, infector, nemesis)
	
	// Show zombie class menu if they haven't chosen any (e.g. just connected)
	if (g_zombieclassnext[id] == ZCLASS_NONE && get_pcvar_num(cvar_zclasses))
		set_task(0.2, "show_menu_zclass", id)
	
	// Set selected zombie class
	g_zombieclass[id] = g_zombieclassnext[id]
	// If no class selected yet, use the first (default) one
	if (g_zombieclass[id] == ZCLASS_NONE) g_zombieclass[id] = 0
	
	// Way to go...
	g_zombie[id] = true
	g_nemesis[id] = false
	g_assassin[id] = false
	g_survivor[id] = false
	g_sniper[id] = false
	g_firstzombie[id] = false
	
	// Remove survivor's aura (bugfix)
	set_pev(id, pev_effects, pev(id, pev_effects) &~ EF_BRIGHTLIGHT)
	
	// Remove spawn protection (bugfix)
	g_nodamage[id] = false
	set_pev(id, pev_effects, pev(id, pev_effects) &~ EF_NODRAW)
	
	// Reset burning duration counter (bugfix)
	g_burning_duration[id] = 0
	
	// Show deathmsg and reward infector?
	if (rewards && infector)
	{
		// Send death notice and fix the "dead" attrib on scoreboard
		SendDeathMsg(infector, id)
		FixDeadAttrib(id)
		
		// Reward frags, deaths, health, and ammo packs
		UpdateFrags(infector, id, get_pcvar_num(cvar_fragsinfect), 1, 1)
		g_ammopacks[infector] += get_pcvar_num(cvar_ammoinfect)
		fm_set_user_health(infector, pev(infector, pev_health) + get_pcvar_num(cvar_zombiebonushp))
	}
	
	// Cache speed, knockback, and name for player's class
	g_zombie_spd[id] = float(ArrayGetCell(g_zclass_spd, g_zombieclass[id]))
	g_zombie_knockback[id] = Float:ArrayGetCell(g_zclass_kb, g_zombieclass[id])
	ArrayGetString(g_zclass_name, g_zombieclass[id], g_zombie_classname[id], charsmax(g_zombie_classname[]))
	
	// Set zombie attributes based on the mode
	static sound[64]
	if (!silentmode)
	{
		if (nemesis)
		{
			// Nemesis
			g_nemesis[id] = true
			
			// Set health [0 = auto]
			if (get_pcvar_num(cvar_nemhp) == 0)
			{
				if (get_pcvar_num(cvar_nembasehp) == 0)
					fm_set_user_health(id, ArrayGetCell(g_zclass_hp, 0) * fnGetAlive())
				else
					fm_set_user_health(id, get_pcvar_num(cvar_nembasehp) * fnGetAlive())
			}
			else
				fm_set_user_health(id, get_pcvar_num(cvar_nemhp))
			
			// Set gravity, if frozen set the restore gravity value instead
			if (!g_frozen[id]) set_pev(id, pev_gravity, get_pcvar_float(cvar_nemgravity))
			else g_frozen_gravity[id] = get_pcvar_float(cvar_nemgravity)
			
			// Set nemesis maxspeed
			ExecuteHamB(Ham_Player_ResetMaxSpeed, id)
		}
		else if (assassin)
		{
			// Assassin
			g_assassin[id] = true
			
			// Set health [0 = auto]
			if (get_pcvar_num(cvar_assahp) == 0)
			{
				if (get_pcvar_num(cvar_assabasehp) == 0)
					fm_set_user_health(id, ArrayGetCell(g_zclass_hp, 0) * fnGetAlive())
				else
					fm_set_user_health(id, get_pcvar_num(cvar_assabasehp) * fnGetAlive())
			}
			else
				fm_set_user_health(id, get_pcvar_num(cvar_assahp))
			
			// Set gravity, if frozen set the restore gravity value instead
			if (!g_frozen[id]) set_pev(id, pev_gravity, get_pcvar_float(cvar_assagravity))
			else g_frozen_gravity[id] = get_pcvar_float(cvar_assagravity)
			
			// Set assassin maxspeed
			ExecuteHamB(Ham_Player_ResetMaxSpeed, id)
		}
		else if (fnGetZombies() == 1)
		{
			// First zombie
			g_firstzombie[id] = true
			
			// Set health
			fm_set_user_health(id, floatround(float(ArrayGetCell(g_zclass_hp, g_zombieclass[id])) * get_pcvar_float(cvar_zombiefirsthp)))
			
			// Set gravity, if frozen set the restore gravity value instead
			if (!g_frozen[id]) set_pev(id, pev_gravity, Float:ArrayGetCell(g_zclass_grav, g_zombieclass[id]))
			else g_frozen_gravity[id] = Float:ArrayGetCell(g_zclass_grav, g_zombieclass[id])
			
			// Set zombie maxspeed
			ExecuteHamB(Ham_Player_ResetMaxSpeed, id)
			
			// Infection sound
			ArrayGetString(zombie_infect, random_num(0, ArraySize(zombie_infect) - 1), sound, charsmax(sound))
			emit_sound(id, CHAN_VOICE, sound, 1.0, ATTN_NORM, 0, PITCH_NORM)
		}
		else
		{
			// Infected by someone
			
			// Set health
			fm_set_user_health(id, ArrayGetCell(g_zclass_hp, g_zombieclass[id]))
			
			// Set gravity, if frozen set the restore gravity value instead
			if (!g_frozen[id]) set_pev(id, pev_gravity, Float:ArrayGetCell(g_zclass_grav, g_zombieclass[id]))
			else g_frozen_gravity[id] = Float:ArrayGetCell(g_zclass_grav, g_zombieclass[id])
			
			// Set zombie maxspeed
			ExecuteHamB(Ham_Player_ResetMaxSpeed, id)
			
			// Infection sound
			ArrayGetString(zombie_infect, random_num(0, ArraySize(zombie_infect) - 1), sound, charsmax(sound))
			emit_sound(id, CHAN_VOICE, sound, 1.0, ATTN_NORM, 0, PITCH_NORM)
			
			// Show Infection HUD notice
			set_hudmessage(255, 0, 0, HUD_INFECT_X, HUD_INFECT_Y, 0, 0.0, 5.0, 1.0, 1.0, -1)
			
			if (infector) // infected by someone?
				ShowSyncHudMsg(0, g_MsgSync, "%L", LANG_PLAYER, "NOTICE_INFECT2", g_playername[id], g_playername[infector])
			else
				ShowSyncHudMsg(0, g_MsgSync, "%L", LANG_PLAYER, "NOTICE_INFECT", g_playername[id])
		}
	}
	else
	{
		// Silent mode, no HUD messages, no infection sounds
		
		// Set health
		fm_set_user_health(id, ArrayGetCell(g_zclass_hp, g_zombieclass[id]))
		
		// Set gravity, if frozen set the restore gravity value instead
		if (!g_frozen[id]) set_pev(id, pev_gravity, Float:ArrayGetCell(g_zclass_grav, g_zombieclass[id]))
		else g_frozen_gravity[id] = Float:ArrayGetCell(g_zclass_grav, g_zombieclass[id])
		
		// Set zombie maxspeed
		ExecuteHamB(Ham_Player_ResetMaxSpeed, id)
	}
	
	// Remove previous tasks
	remove_task(id+TASK_MODEL)
	remove_task(id+TASK_BLOOD)
	remove_task(id+TASK_AURA)
	remove_task(id+TASK_BURN)
	
	// Switch to T
	if (fm_cs_get_user_team(id) != FM_CS_TEAM_T) // need to change team?
	{
		remove_task(id+TASK_TEAM)
		fm_cs_set_user_team(id, FM_CS_TEAM_T)
		fm_user_team_update(id)
	}
	
	// Custom models stuff
	static currentmodel[32], tempmodel[32], already_has_model, i, iRand, size
	already_has_model = false
	
	if (g_handle_models_on_separate_ent)
	{
		// Set the right model
		if (g_nemesis[id])
		{
			iRand = random_num(0, ArraySize(model_nemesis) - 1)
			ArrayGetString(model_nemesis, iRand, g_playermodel[id], charsmax(g_playermodel[]))
			if (g_set_modelindex_offset) fm_cs_set_user_model_index(id, ArrayGetCell(g_modelindex_nemesis, iRand))
		}
		else if (g_assassin[id])
		{
			iRand = random_num(0, ArraySize(model_assassin) - 1)
			ArrayGetString(model_assassin, iRand, g_playermodel[id], charsmax(g_playermodel[]))
			if (g_set_modelindex_offset) fm_cs_set_user_model_index(id, ArrayGetCell(g_modelindex_assassin, iRand))
		}
		else
		{
			if (get_pcvar_num(cvar_adminmodelszombie) && (get_user_flags(id) & g_access_flag[ACCESS_ADMIN_MODELS]))
			{
				iRand = random_num(0, ArraySize(model_admin_zombie) - 1)
				ArrayGetString(model_admin_zombie, iRand, g_playermodel[id], charsmax(g_playermodel[]))
				if (g_set_modelindex_offset) fm_cs_set_user_model_index(id, ArrayGetCell(g_modelindex_admin_zombie, iRand))
			}
			else
			{
				iRand = random_num(ArrayGetCell(g_zclass_modelsstart, g_zombieclass[id]), ArrayGetCell(g_zclass_modelsend, g_zombieclass[id]) - 1)
				ArrayGetString(g_zclass_playermodel, iRand, g_playermodel[id], charsmax(g_playermodel[]))
				if (g_set_modelindex_offset) fm_cs_set_user_model_index(id, ArrayGetCell(g_zclass_modelindex, iRand))
			}
		}
		
		// Set model on player model entity
		fm_set_playermodel_ent(id)
		
		// Nemesis glow / remove glow on player model entity, unless frozen
		if (!g_frozen[id])
		{
			if (g_nemesis[id] && get_pcvar_num(cvar_nemglow))
				fm_set_rendering(g_ent_playermodel[id], kRenderFxGlowShell, 250, 0 , 0, kRenderNormal, 25)
			else if (g_nemesis[id] && !(get_pcvar_num(cvar_nemglow)))
				fm_set_rendering(g_ent_playermodel[id], kRenderFxGlowShell, 0, 0 , 0, kRenderNormal, 25)
			else if (g_assassin[id] && get_pcvar_num(cvar_assaglow))
				fm_set_rendering(g_ent_playermodel[id], kRenderFxGlowShell, 255, 255, 0, kRenderNormal, 25)
			else
				fm_set_rendering(g_ent_playermodel[id])
		}
	}
	else
	{
		// Get current model for comparing it with the current one
		fm_cs_get_user_model(id, currentmodel, charsmax(currentmodel))
		
		// Set the right model, after checking that we don't already have it
		if (g_nemesis[id])
		{
			size = ArraySize(model_nemesis)
			for (i = 0; i < size; i++)
			{
				ArrayGetString(model_nemesis, i, tempmodel, charsmax(tempmodel))
				if (equal(currentmodel, tempmodel)) already_has_model = true
			}
			
			if (!already_has_model)
			{
				iRand = random_num(0, size - 1)
				ArrayGetString(model_nemesis, iRand, g_playermodel[id], charsmax(g_playermodel[]))
				if (g_set_modelindex_offset) fm_cs_set_user_model_index(id, ArrayGetCell(g_modelindex_nemesis, iRand))
			}
		}
		else if (g_assassin[id])
		{
			size = ArraySize(model_assassin)
			for (i = 0; i < size; i++)
			{
				ArrayGetString(model_assassin, i, tempmodel, charsmax(tempmodel))
				if (equal(currentmodel, tempmodel)) already_has_model = true
			}
			
			if (!already_has_model)
			{
				iRand = random_num(0, size - 1)
				ArrayGetString(model_assassin, iRand, g_playermodel[id], charsmax(g_playermodel[]))
				if (g_set_modelindex_offset) fm_cs_set_user_model_index(id, ArrayGetCell(g_modelindex_assassin, iRand))
			}
		}
		else
		{
			if (get_pcvar_num(cvar_adminmodelszombie) && (get_user_flags(id) & g_access_flag[ACCESS_ADMIN_MODELS]))
			{
				size = ArraySize(model_admin_zombie)
				for (i = 0; i < size; i++)
				{
					ArrayGetString(model_admin_zombie, i, tempmodel, charsmax(tempmodel))
					if (equal(currentmodel, tempmodel)) already_has_model = true
				}
				
				if (!already_has_model)
				{
					iRand = random_num(0, size - 1)
					ArrayGetString(model_admin_zombie, iRand, g_playermodel[id], charsmax(g_playermodel[]))
					if (g_set_modelindex_offset) fm_cs_set_user_model_index(id, ArrayGetCell(g_modelindex_admin_zombie, iRand))
				}
			}
			else
			{
				for (i = ArrayGetCell(g_zclass_modelsstart, g_zombieclass[id]); i < ArrayGetCell(g_zclass_modelsend, g_zombieclass[id]); i++)
				{
					ArrayGetString(g_zclass_playermodel, i, tempmodel, charsmax(tempmodel))
					if (equal(currentmodel, tempmodel)) already_has_model = true
				}
				
				if (!already_has_model)
				{
					iRand = random_num(ArrayGetCell(g_zclass_modelsstart, g_zombieclass[id]), ArrayGetCell(g_zclass_modelsend, g_zombieclass[id]) - 1)
					ArrayGetString(g_zclass_playermodel, iRand, g_playermodel[id], charsmax(g_playermodel[]))
					if (g_set_modelindex_offset) fm_cs_set_user_model_index(id, ArrayGetCell(g_zclass_modelindex, iRand))
				}
			}
		}
		
		// Need to change the model?
		if (!already_has_model)
		{
			// An additional delay is offset at round start
			// since SVC_BAD is more likely to be triggered there
			if (g_newround)
				set_task(5.0 * g_modelchange_delay, "fm_user_model_update", id+TASK_MODEL)
			else
				fm_user_model_update(id+TASK_MODEL)
		}
		
		// Nemesis glow / remove glow, unless frozen
		if (!g_frozen[id])
		{
			if (g_nemesis[id] && get_pcvar_num(cvar_nemglow))
				fm_set_rendering(id, kRenderFxGlowShell, 250, 0, 0, kRenderNormal, 25)
			else if (g_nemesis[id] && !(get_pcvar_num(cvar_nemglow)))
				fm_set_rendering(id, kRenderFxGlowShell, 0, 0, 0, kRenderNormal, 25)
			if (g_assassin[id] && get_pcvar_num(cvar_assaglow))
				fm_set_rendering(id, kRenderFxGlowShell, 255, 255, 0, kRenderNormal, 25)
				
			else if (!g_assassin[id] && !g_nemesis[id])
				fm_set_rendering(id)
		}
	}
	
	// Remove any zoom (bugfix)
	cs_set_user_zoom(id, CS_RESET_ZOOM, 1)
	
	// Remove armor
	cs_set_user_armor(id, 0, CS_ARMOR_NONE)
	
	// Drop weapons when infected
	drop_weapons(id, 1)
	drop_weapons(id, 2)
	
	// Strip zombies from guns and give them a knife
	fm_strip_user_weapons(id)
	fm_give_item(id, "weapon_knife")
	
	// Fancy effects
	infection_effects(id)
	
	// Nemesis aura task
	if (g_nemesis[id] && get_pcvar_num(cvar_nemaura))
		set_task(0.1, "zombie_aura", id+TASK_AURA, _, _, "b")
		
	// Assassin aura task
	if (g_assassin[id] && get_pcvar_num(cvar_assaaura))
		set_task(0.1, "zombie_aura", id+TASK_AURA, _, _, "b")
	
	// Remove CS nightvision if player owns one (bugfix)
	if (cs_get_user_nvg(id))
	{
		cs_set_user_nvg(id, 0)
		if (get_pcvar_num(cvar_customnvg)) remove_task(id+TASK_NVISION)
		else if (g_nvisionenabled[id]) set_user_gnvision(id, 0)
	}
	
	// Give Zombies Night Vision?
	if (get_pcvar_num(cvar_nvggive))
	{
		g_nvision[id] = true
		
		if (!g_isbot[id])
		{
			// Turn on Night Vision automatically?
			if (get_pcvar_num(cvar_nvggive) == 1)
			{
				g_nvisionenabled[id] = true
				
				// Custom nvg?
				if (get_pcvar_num(cvar_customnvg))
				{
					remove_task(id+TASK_NVISION)
					set_task(0.1, "set_user_nvision", id+TASK_NVISION, _, _, "b")
				}
				else
					set_user_gnvision(id, 1)
			}
			// Turn off nightvision when infected (bugfix)
			else if (g_nvisionenabled[id])
			{
				if (get_pcvar_num(cvar_customnvg)) remove_task(id+TASK_NVISION)
				else set_user_gnvision(id, 0)
				g_nvisionenabled[id] = false
			}
		}
		else
			cs_set_user_nvg(id, 1); // turn on NVG for bots
	}
	// Disable nightvision when infected (bugfix)
	else if (g_nvision[id])
	{
		if (get_pcvar_num(cvar_customnvg)) remove_task(id+TASK_NVISION)
		else if (g_nvisionenabled[id]) set_user_gnvision(id, 0)
		g_nvision[id] = false
		g_nvisionenabled[id] = false
	}
	
	// Set custom FOV?
	if (get_pcvar_num(cvar_zombiefov) != 90 && get_pcvar_num(cvar_zombiefov) != 0)
	{
		message_begin(MSG_ONE, g_msgSetFOV, _, id)
		write_byte(get_pcvar_num(cvar_zombiefov)) // fov angle
		message_end()
	}
	
	// Call the bloody task
	if (!g_nemesis[id] && !g_nemesis[id] && get_pcvar_num(cvar_zombiebleeding))
		set_task(0.7, "make_blood", id+TASK_BLOOD, _, _, "b")
	
	// Idle sounds task
	if (!g_nemesis[id] && !g_assassin[id])
		set_task(random_float(50.0, 70.0), "zombie_play_idle", id+TASK_BLOOD, _, _, "b")
	
	// Turn off zombie's flashlight
	turn_off_flashlight(id)
	
	// Post user infect forward
	ExecuteForward(g_fwUserInfected_post, g_fwDummyResult, id, infector, nemesis)
	
	// Last Zombie Check
	fnCheckLastZombie()
}

// Function Human Me (player id, turn into a survivor, silent mode)
humanme(id, survivor, sniper, silentmode)
{
	// User humanize attempt forward
	ExecuteForward(g_fwUserHumanize_attempt, g_fwDummyResult, id, survivor)
	
	// One or more plugins blocked the "humanization". Only allow this after making sure it's
	// not going to leave us with no humans. Take into account a last player leaving case.
	// BUGFIX: only allow after a mode has started, to prevent blocking first survivor e.g.
	if (g_fwDummyResult >= ZP_PLUGIN_HANDLED && g_modestarted && fnGetHumans() > g_lastplayerleaving)
		return;
	
	// Pre user humanize forward
	ExecuteForward(g_fwUserHumanized_pre, g_fwDummyResult, id, survivor)
	
	// Remove previous tasks
	remove_task(id+TASK_MODEL)
	remove_task(id+TASK_BLOOD)
	remove_task(id+TASK_AURA)
	remove_task(id+TASK_BURN)
	remove_task(id+TASK_NVISION)
	
	// Reset some vars
	g_zombie[id] = false
	g_nemesis[id] = false
	g_assassin[id] = false
	g_survivor[id] = false
	g_sniper[id] = false
	g_firstzombie[id] = false
	g_canbuy[id] = true
	g_buytime[id] = get_gametime()
	
	// Remove survivor's aura (bugfix)
	set_pev(id, pev_effects, pev(id, pev_effects) &~ EF_BRIGHTLIGHT)
	
	// Remove spawn protection (bugfix)
	g_nodamage[id] = false
	set_pev(id, pev_effects, pev(id, pev_effects) &~ EF_NODRAW)
	
	// Reset burning duration counter (bugfix)
	g_burning_duration[id] = 0
	
	// Remove CS nightvision if player owns one (bugfix)
	if (cs_get_user_nvg(id))
	{
		cs_set_user_nvg(id, 0)
		if (get_pcvar_num(cvar_customnvg)) remove_task(id+TASK_NVISION)
		else if (g_nvisionenabled[id]) set_user_gnvision(id, 0)
	}
	
	// Drop previous weapons
	drop_weapons(id, 1)
	drop_weapons(id, 2)
	
	// Strip off from weapons
	fm_strip_user_weapons(id)
	fm_give_item(id, "weapon_knife")
	
	// Set human attributes based on the mode
	if (survivor)
	{
		// Survivor
		g_survivor[id] = true
		
		// Set Health [0 = auto]
		if (get_pcvar_num(cvar_survhp) == 0)
		{
			if (get_pcvar_num(cvar_survbasehp) == 0)
				fm_set_user_health(id, get_pcvar_num(cvar_humanhp) * fnGetAlive())
			else
				fm_set_user_health(id, get_pcvar_num(cvar_survbasehp) * fnGetAlive())
		}
		else
			fm_set_user_health(id, get_pcvar_num(cvar_survhp))
		
		// Set gravity, if frozen set the restore gravity value instead
		if (!g_frozen[id]) set_pev(id, pev_gravity, get_pcvar_float(cvar_survgravity))
		else g_frozen_gravity[id] = get_pcvar_float(cvar_survgravity)
		
		// Set survivor maxspeed
		ExecuteHamB(Ham_Player_ResetMaxSpeed, id)
		
		// Give survivor his own weapon
		fm_give_item(id, "weapon_xm1014")
		fm_give_item(id, "weapon_ak47")
		ExecuteHamB(Ham_GiveAmmo, id, MAXBPAMMO[CSW_XM1014], AMMOTYPE[CSW_XM1014], MAXBPAMMO[CSW_XM1014]) 
		ExecuteHamB(Ham_GiveAmmo, id, MAXBPAMMO[CSW_AK47], AMMOTYPE[CSW_AK47], MAXBPAMMO[CSW_AK47])
		
		// Turn off his flashlight
		turn_off_flashlight(id)
		
		// Give the survivor a bright light
		if (get_pcvar_num(cvar_survaura)) set_pev(id, pev_effects, pev(id, pev_effects) | EF_BRIGHTLIGHT)
		
		// Survivor bots will also need nightvision to see in the dark
		if (g_isbot[id])
		{
			g_nvision[id] = true
			cs_set_user_nvg(id, 1)
		}
	}
	else if (sniper)
	{
		// Sniper
		g_sniper[id] = true
		
		// Set Health [0 = auto]
		if (get_pcvar_num(cvar_snihp) == 0)
		{
			if (get_pcvar_num(cvar_snibasehp) == 0)
			    fm_set_user_health(id, get_pcvar_num(cvar_humanhp) * fnGetAlive())
			else
			    fm_set_user_health(id, get_pcvar_num(cvar_snibasehp) * fnGetAlive())
		}
		else
		fm_set_user_health(id, get_pcvar_num(cvar_snihp))
		
		// Set gravity, unless frozen
		if (!g_frozen[id]) set_pev(id, pev_gravity, get_pcvar_float(cvar_snigravity))
		
		// Give sniper his own weapon		
		fm_give_item(id, "weapon_awp")                
		ExecuteHamB(Ham_GiveAmmo, id, MAXBPAMMO[CSW_AWP], AMMOTYPE[CSW_AWP], MAXBPAMMO[CSW_AWP])
		
		// Turn off his flashlight
		turn_off_flashlight(id)
		
		// Give the sniper a bright light
		if (get_pcvar_num(cvar_sniaura)) set_pev(id, pev_effects, pev(id, pev_effects) | EF_BRIGHTLIGHT)
		
		// Sniper bots will also need nightvision to see in the dark
		if (g_isbot[id])
		{
			g_nvision[id] = true
			cs_set_user_nvg(id, 1)
		}
	}
	else
	{
		// Human taking an antidote
		
		// Set health
		fm_set_user_health(id, get_pcvar_num(cvar_humanhp))
		
		// Set gravity, if frozen set the restore gravity value instead
		if (!g_frozen[id]) set_pev(id, pev_gravity, get_pcvar_float(cvar_humangravity))
		else g_frozen_gravity[id] = get_pcvar_float(cvar_humangravity)
		
		// Set human maxspeed
		ExecuteHamB(Ham_Player_ResetMaxSpeed, id)
		
		// Show custom buy menu?
		if (get_pcvar_num(cvar_buycustom))
			set_task(0.2, "show_menu_buy1", id+TASK_SPAWN)
		
		// Silent mode = no HUD messages, no antidote sound
		if (!silentmode)
		{
			// Antidote sound
			static sound[64]
			ArrayGetString(sound_antidote, random_num(0, ArraySize(sound_antidote) - 1), sound, charsmax(sound))
			emit_sound(id, CHAN_ITEM, sound, 1.0, ATTN_NORM, 0, PITCH_NORM)
			
			// Show Antidote HUD notice
			set_hudmessage(0, 0, 255, HUD_INFECT_X, HUD_INFECT_Y, 0, 0.0, 5.0, 1.0, 1.0, -1)
			ShowSyncHudMsg(0, g_MsgSync, "%L", LANG_PLAYER, "NOTICE_ANTIDOTE", g_playername[id])
		}
	}
	
	remove_freeze(id);
	
	// Switch to CT
	if (fm_cs_get_user_team(id) != FM_CS_TEAM_CT) // need to change team?
	{
		remove_task(id+TASK_TEAM)
		fm_cs_set_user_team(id, FM_CS_TEAM_CT)
		fm_user_team_update(id)
	}
	
	// Custom models stuff
	static currentmodel[32], tempmodel[32], already_has_model, i, iRand, size
	already_has_model = false
	
	if (g_handle_models_on_separate_ent)
	{
		// Set the right model
		if (g_survivor[id])
		{
			iRand = random_num(0, ArraySize(model_survivor) - 1)
			ArrayGetString(model_survivor, iRand, g_playermodel[id], charsmax(g_playermodel[]))
			if (g_set_modelindex_offset) fm_cs_set_user_model_index(id, ArrayGetCell(g_modelindex_survivor, iRand))
		}
		else if (g_sniper[id])
		{
			iRand = random_num(0, ArraySize(model_sniper) - 1)
			ArrayGetString(model_sniper, iRand, g_playermodel[id], charsmax(g_playermodel[]))
			if (g_set_modelindex_offset) fm_cs_set_user_model_index(id, ArrayGetCell(g_modelindex_sniper, iRand))
		}
		else
		{
			if (get_pcvar_num(cvar_adminmodelshuman) && (get_user_flags(id) & g_access_flag[ACCESS_ADMIN_MODELS]))
			{
				iRand = random_num(0, ArraySize(model_admin_human) - 1)
				ArrayGetString(model_admin_human, iRand, g_playermodel[id], charsmax(g_playermodel[]))
				if (g_set_modelindex_offset) fm_cs_set_user_model_index(id, ArrayGetCell(g_modelindex_admin_human, iRand))
			}
			else
			{
				iRand = random_num(0, ArraySize(model_human) - 1)
				ArrayGetString(model_human, iRand, g_playermodel[id], charsmax(g_playermodel[]))
				if (g_set_modelindex_offset) fm_cs_set_user_model_index(id, ArrayGetCell(g_modelindex_human, iRand))
			}
		}
		
		// Set model on player model entity
		fm_set_playermodel_ent(id)
		
		// Set survivor glow / remove glow on player model entity, unless frozen
		if (!g_frozen[id])
		{
			if (g_survivor[id] && get_pcvar_num(cvar_survglow))
				fm_set_rendering(g_ent_playermodel[id], kRenderFxGlowShell, 0, 0, 255, kRenderNormal, 25)
			else if (g_sniper[id] && get_pcvar_num(cvar_sniglow))
				fm_set_rendering(g_ent_playermodel[id], kRenderFxGlowShell, 0, 255, 0, kRenderNormal, 25)
			else
				fm_set_rendering(g_ent_playermodel[id])
		}
	}
	else
	{
		// Get current model for comparing it with the current one
		fm_cs_get_user_model(id, currentmodel, charsmax(currentmodel))
		
		// Set the right model, after checking that we don't already have it
		if (g_survivor[id])
		{
			size = ArraySize(model_survivor)
			for (i = 0; i < size; i++)
			{
				ArrayGetString(model_survivor, i, tempmodel, charsmax(tempmodel))
				if (equal(currentmodel, tempmodel)) already_has_model = true
			}
			
			if (!already_has_model)
			{
				iRand = random_num(0, size - 1)
				ArrayGetString(model_survivor, iRand, g_playermodel[id], charsmax(g_playermodel[]))
				if (g_set_modelindex_offset) fm_cs_set_user_model_index(id, ArrayGetCell(g_modelindex_survivor, iRand))
			}
		}
		else if (g_sniper[id])
		{
			size = ArraySize(model_sniper)
			for (i = 0; i < size; i++)
			{
				ArrayGetString(model_sniper, i, tempmodel, charsmax(tempmodel))
				if (equal(currentmodel, tempmodel)) already_has_model = true
			}
			
			if (!already_has_model)
			{
				iRand = random_num(0, size - 1)
				ArrayGetString(model_sniper, iRand, g_playermodel[id], charsmax(g_playermodel[]))
				if (g_set_modelindex_offset) fm_cs_set_user_model_index(id, ArrayGetCell(g_modelindex_sniper, iRand))
			}
		}
		else
		{
			if (get_pcvar_num(cvar_adminmodelshuman) && (get_user_flags(id) & g_access_flag[ACCESS_ADMIN_MODELS]))
			{
				size = ArraySize(model_admin_human)
				for (i = 0; i < size; i++)
				{
					ArrayGetString(model_admin_human, i, tempmodel, charsmax(tempmodel))
					if (equal(currentmodel, tempmodel)) already_has_model = true
				}
				
				if (!already_has_model)
				{
					iRand = random_num(0, size - 1)
					ArrayGetString(model_admin_human, iRand, g_playermodel[id], charsmax(g_playermodel[]))
					if (g_set_modelindex_offset) fm_cs_set_user_model_index(id, ArrayGetCell(g_modelindex_admin_human, iRand))
				}
			}
			else
			{
				size = ArraySize(model_human)
				for (i = 0; i < size; i++)
				{
					ArrayGetString(model_human, i, tempmodel, charsmax(tempmodel))
					if (equal(currentmodel, tempmodel)) already_has_model = true
				}
				
				if (!already_has_model)
				{
					iRand = random_num(0, size - 1)
					ArrayGetString(model_human, iRand, g_playermodel[id], charsmax(g_playermodel[]))
					if (g_set_modelindex_offset) fm_cs_set_user_model_index(id, ArrayGetCell(g_modelindex_human, iRand))
				}
			}
		}
		
		// Need to change the model?
		if (!already_has_model)
		{
			// An additional delay is offset at round start
			// since SVC_BAD is more likely to be triggered there
			if (g_newround)
				set_task(5.0 * g_modelchange_delay, "fm_user_model_update", id+TASK_MODEL)
			else
				fm_user_model_update(id+TASK_MODEL)
		}
		
		// Set survivor glow / remove glow, unless frozen
		if (!g_frozen[id])
		{
			if (g_survivor[id] && get_pcvar_num(cvar_survglow))
				fm_set_rendering(id, kRenderFxGlowShell, 0, 0, 255, kRenderNormal, 25)
			else if (g_sniper[id] && get_pcvar_num(cvar_sniglow))
				fm_set_rendering(id, kRenderFxGlowShell, 0, 255, 0, kRenderNormal, 25)
			else
				fm_set_rendering(id)
		}
	}
	
	// Restore FOV?
	if (get_pcvar_num(cvar_zombiefov) != 90 && get_pcvar_num(cvar_zombiefov) != 0)
	{
		message_begin(MSG_ONE, g_msgSetFOV, _, id)
		write_byte(90) // angle
		message_end()
	}
	
	// Disable nightvision when turning into human/survivor (bugfix)
	if (g_nvision[id])
	{
		if (get_pcvar_num(cvar_customnvg)) remove_task(id+TASK_NVISION)
		else if (g_nvisionenabled[id]) set_user_gnvision(id, 0)
		g_nvision[id] = false
		g_nvisionenabled[id] = false
	}
	
	// Post user humanize forward
	ExecuteForward(g_fwUserHumanized_post, g_fwDummyResult, id, survivor)
	
	// Last Zombie Check
	fnCheckLastZombie()
}

/*================================================================================
 [Other Functions and Tasks]
=================================================================================*/

public cache_cvars()
{
	g_cached_zombiesilent = get_pcvar_num(cvar_zombiesilent)
	g_cached_customflash = get_pcvar_num(cvar_customflash)
	g_cached_leapzombies = get_pcvar_num(cvar_leapzombies)
	g_cached_leapzombiescooldown = get_pcvar_float(cvar_leapzombiescooldown)
	g_cached_leapnemesis = get_pcvar_num(cvar_leapnemesis)
	g_cached_leapnemesiscooldown = get_pcvar_float(cvar_leapnemesiscooldown)
	g_cached_leapassassin = get_pcvar_num(cvar_leapassassin)
	g_cached_leapassassincooldown = get_pcvar_float(cvar_leapassassincooldown)
	g_cached_leapsurvivor = get_pcvar_num(cvar_leapsurvivor)
	g_cached_leapsurvivorcooldown = get_pcvar_float(cvar_leapsurvivorcooldown)
	g_cached_leapsniper = get_pcvar_num(cvar_leapsniper)
	g_cached_leapsnipercooldown = get_pcvar_float(cvar_leapsnipercooldown)
	g_cached_buytime = get_pcvar_float(cvar_buyzonetime)
}

load_customization_from_files()
{
	// Build customization file path
	new path[64]
	get_configsdir(path, charsmax(path))
	format(path, charsmax(path), "%s/%s", path, ZP_CUSTOMIZATION_FILE)
	
	// File not present
	if (!file_exists(path))
	{
		new error[100]
		formatex(error, charsmax(error), "Cannot load customization file %s!", path)
		set_fail_state(error)
		return;
	}
	
	// Set up some vars to hold parsing info
	new linedata[1024], key[64], value[960], section, teams
	
	// Open customization file for reading
	new file = fopen(path, "rt")
	
	while (file && !feof(file))
	{
		// Read one line at a time
		fgets(file, linedata, charsmax(linedata))
		
		// Replace newlines with a null character to prevent headaches
		replace(linedata, charsmax(linedata), "^n", "")
		
		// Blank line or comment
		if (!linedata[0] || linedata[0] == ';') continue;
		
		// New section starting
		if (linedata[0] == '[')
		{
			section++
			continue;
		}
		
		// Get key and value(s)
		strtok(linedata, key, charsmax(key), value, charsmax(value), '=')
		
		// Trim spaces
		trim(key)
		trim(value)
		
		switch (section)
		{
			case SECTION_ACCESS_FLAGS:
			{
				if (equal(key, "ENABLE/DISABLE MOD"))
					g_access_flag[ACCESS_ENABLE_MOD] = read_flags(value)
				else if (equal(key, "ADMIN MENU"))
					g_access_flag[ACCESS_ADMIN_MENU] = read_flags(value)
				else if (equal(key, "ADMIN MODES MENU"))
					g_access_flag[ACCESS_ADMIN_MODES_MENU] = read_flags(value)
				else if (equal(key, "START MODE INFECTION"))
					g_access_flag[ACCESS_MODE_INFECTION] = read_flags(value)
				else if (equal(key, "START MODE NEMESIS"))
					g_access_flag[ACCESS_MODE_NEMESIS] = read_flags(value)
				else if (equal(key, "START MODE ASSASSIN"))
					g_access_flag[ACCESS_MODE_ASSASSIN] = read_flags(value)
				else if (equal(key, "START MODE SURVIVOR"))
					g_access_flag[ACCESS_MODE_SURVIVOR] = read_flags(value)
				else if (equal(key, "START MODE SNIPER"))
					g_access_flag[ACCESS_MODE_SNIPER] = read_flags(value)
				else if (equal(key, "START MODE SWARM"))
					g_access_flag[ACCESS_MODE_SWARM] = read_flags(value)
				else if (equal(key, "START MODE MULTI"))
					g_access_flag[ACCESS_MODE_MULTI] = read_flags(value)
				else if (equal(key, "START MODE PLAGUE"))
					g_access_flag[ACCESS_MODE_PLAGUE] = read_flags(value)
				else if (equal(key, "START MODE ARMAGEDDON"))
					g_access_flag[ACCESS_MODE_ARMAGEDDON] = read_flags(value)
				else if (equal(key, "START MODE APOCALYPSE"))
					g_access_flag[ACCESS_MODE_APOCALYPSE] = read_flags(value)
				else if (equal(key, "START MODE NIGHTMARE"))
					g_access_flag[ACCESS_MODE_NIGHTMARE] = read_flags(value)
				else if (equal(key, "MAKE ZOMBIE"))
					g_access_flag[ACCESS_MAKE_ZOMBIE] = read_flags(value)
				else if (equal(key, "MAKE HUMAN"))
					g_access_flag[ACCESS_MAKE_HUMAN] = read_flags(value)
				else if (equal(key, "MAKE NEMESIS"))
					g_access_flag[ACCESS_MAKE_NEMESIS] = read_flags(value)
				else if (equal(key, "MAKE ASSASSIN"))
					g_access_flag[ACCESS_MAKE_ASSASSIN] = read_flags(value)
				else if (equal(key, "MAKE SURVIVOR"))
					g_access_flag[ACCESS_MAKE_SURVIVOR] = read_flags(value)
				else if (equal(key, "MAKE SNIPER"))
					g_access_flag[ACCESS_MAKE_SNIPER] = read_flags(value)
				else if (equal(key, "RESPAWN PLAYERS"))
					g_access_flag[ACCESS_RESPAWN_PLAYERS] = read_flags(value)
				else if (equal(key, "ADMIN MODELS"))
					g_access_flag[ACCESS_ADMIN_MODELS] = read_flags(value)
			}
			case SECTION_PLAYER_MODELS:
			{
				if (equal(key, "HUMAN"))
				{
					// Parse models
					while (value[0] != 0 && strtok(value, key, charsmax(key), value, charsmax(value), ','))
					{
						// Trim spaces
						trim(key)
						trim(value)
						
						// Add to models array
						ArrayPushString(model_human, key)
					}
				}
				else if (equal(key, "NEMESIS"))
				{
					// Parse models
					while (value[0] != 0 && strtok(value, key, charsmax(key), value, charsmax(value), ','))
					{
						// Trim spaces
						trim(key)
						trim(value)
						
						// Add to models array
						ArrayPushString(model_nemesis, key)
					}
				}
				else if (equal(key, "ASSASSIN"))
				{
					// Parse models
					while (value[0] != 0 && strtok(value, key, charsmax(key), value, charsmax(value), ','))
					{
						// Trim spaces
						trim(key)
						trim(value)
						
						// Add to models array
						ArrayPushString(model_assassin, key)
					}
				}
				else if (equal(key, "SURVIVOR"))
				{
					// Parse models
					while (value[0] != 0 && strtok(value, key, charsmax(key), value, charsmax(value), ','))
					{
						// Trim spaces
						trim(key)
						trim(value)
						
						// Add to models array
						ArrayPushString(model_survivor, key)
					}
				}
				else if (equal(key, "SNIPER"))
				{
					// Parse models
					while (value[0] != 0 && strtok(value, key, charsmax(key), value, charsmax(value), ','))
					{
						// Trim spaces
						trim(key)
						trim(value)
						
						// Add to models array
						ArrayPushString(model_sniper, key)
					}
				}
				else if (equal(key, "ADMIN ZOMBIE"))
				{
					// Parse models
					while (value[0] != 0 && strtok(value, key, charsmax(key), value, charsmax(value), ','))
					{
						// Trim spaces
						trim(key)
						trim(value)
						
						// Add to models array
						ArrayPushString(model_admin_zombie, key)
					}
				}
				else if (equal(key, "ADMIN HUMAN"))
				{
					// Parse models
					while (value[0] != 0 && strtok(value, key, charsmax(key), value, charsmax(value), ','))
					{
						// Trim spaces
						trim(key)
						trim(value)
						
						// Add to models array
						ArrayPushString(model_admin_human, key)
					}
				}
				else if (equal(key, "FORCE CONSISTENCY"))
					g_force_consistency = str_to_num(value)
				else if (equal(key, "SAME MODELS FOR ALL"))
					g_same_models_for_all = str_to_num(value)
				else if (g_same_models_for_all && equal(key, "ZOMBIE"))
				{
					// Parse models
					while (value[0] != 0 && strtok(value, key, charsmax(key), value, charsmax(value), ','))
					{
						// Trim spaces
						trim(key)
						trim(value)
						
						// Add to models array
						ArrayPushString(g_zclass_playermodel, key)
						
						// Precache model and retrieve its modelindex
						formatex(linedata, charsmax(linedata), "models/player/%s/%s.mdl", key, key)
						ArrayPushCell(g_zclass_modelindex, engfunc(EngFunc_PrecacheModel, linedata))
						if (g_force_consistency == 1) force_unmodified(force_model_samebounds, {0,0,0}, {0,0,0}, linedata)
						if (g_force_consistency == 2) force_unmodified(force_exactfile, {0,0,0}, {0,0,0}, linedata)
						// Precache modelT.mdl files too
						copy(linedata[strlen(linedata)-4], charsmax(linedata) - (strlen(linedata)-4), "T.mdl")
						if (file_exists(linedata)) engfunc(EngFunc_PrecacheModel, linedata)
					}
				}
			}
			case SECTION_WEAPON_MODELS:
			{
				if (equal(key, "V_KNIFE HUMAN"))
					copy(model_vknife_human, charsmax(model_vknife_human), value)
				else if (equal(key, "V_KNIFE NEMESIS"))
					copy(model_vknife_nemesis, charsmax(model_vknife_nemesis), value)
				else if (equal(key, "V_KNIFE ASSASSIN"))
					copy(model_vknife_assassin, charsmax(model_vknife_assassin), value)
				else if (equal(key, "V_M249 SURVIVOR")) // backwards compatibility with old configs
					copy(model_vweapon_survivor, charsmax(model_vweapon_survivor), value)
				else if (equal(key, "V_WEAPON SURVIVOR"))
					copy(model_vweapon_survivor, charsmax(model_vweapon_survivor), value)
				else if (equal(key, "V_AWP SNIPER"))
				        copy(model_vawp_sniper, charsmax(model_vawp_sniper), value)
                                else if (equal(key, "P_AWP SNIPER"))
				        copy(model_pawp_sniper, charsmax(model_pawp_sniper), value)
				else if (equal(key, "GRENADE INFECT"))
					copy(model_grenade_infect, charsmax(model_grenade_infect), value)
				else if (equal(key, "GRENADE FIRE"))
					copy(model_grenade_fire, charsmax(model_grenade_fire), value)
				else if (equal(key, "GRENADE FROST"))
					copy(model_grenade_frost, charsmax(model_grenade_frost), value)
				else if (equal(key, "GRENADE FLARE"))
					copy(model_grenade_flare, charsmax(model_grenade_flare), value)
				else if (equal(key, "V_KNIFE ADMIN HUMAN"))
					copy(model_vknife_admin_human, charsmax(model_vknife_admin_human), value)
				else if (equal(key, "V_KNIFE ADMIN ZOMBIE"))
					copy(model_vknife_admin_zombie, charsmax(model_vknife_admin_zombie), value)
			}
			case SECTION_GRENADE_SPRITES:
			{
				if (equal(key, "TRAIL"))
					copy(sprite_grenade_trail, charsmax(sprite_grenade_trail), value)
				else if (equal(key, "RING"))
					copy(sprite_grenade_ring, charsmax(sprite_grenade_ring), value)
				else if (equal(key, "FIRE"))
					copy(sprite_grenade_fire, charsmax(sprite_grenade_fire), value)
				else if (equal(key, "SMOKE"))
					copy(sprite_grenade_smoke, charsmax(sprite_grenade_smoke), value)
				else if (equal(key, "GLASS"))
					copy(sprite_grenade_glass, charsmax(sprite_grenade_glass), value)
			}
			case SECTION_SOUNDS:
			{
				if (equal(key, "WIN ZOMBIES"))
				{
					// Parse sounds
					while (value[0] != 0 && strtok(value, key, charsmax(key), value, charsmax(value), ','))
					{
						// Trim spaces
						trim(key)
						trim(value)
						
						// Add to sounds array
						ArrayPushString(sound_win_zombies, key)
						ArrayPushCell(sound_win_zombies_ismp3, equal(key[strlen(key)-4], ".mp3") ? 1 : 0)
					}
				}
				else if (equal(key, "WIN HUMANS"))
				{
					// Parse sounds
					while (value[0] != 0 && strtok(value, key, charsmax(key), value, charsmax(value), ','))
					{
						// Trim spaces
						trim(key)
						trim(value)
						
						// Add to sounds array
						ArrayPushString(sound_win_humans, key)
						ArrayPushCell(sound_win_humans_ismp3, equal(key[strlen(key)-4], ".mp3") ? 1 : 0)
					}
				}
				else if (equal(key, "WIN NO ONE"))
				{
					// Parse sounds
					while (value[0] != 0 && strtok(value, key, charsmax(key), value, charsmax(value), ','))
					{
						// Trim spaces
						trim(key)
						trim(value)
						
						// Add to sounds array
						ArrayPushString(sound_win_no_one, key)
						ArrayPushCell(sound_win_no_one_ismp3, equal(key[strlen(key)-4], ".mp3") ? 1 : 0)
					}
				}
				else if (equal(key, "ZOMBIE INFECT"))
				{
					// Parse sounds
					while (value[0] != 0 && strtok(value, key, charsmax(key), value, charsmax(value), ','))
					{
						// Trim spaces
						trim(key)
						trim(value)
						
						// Add to sounds array
						ArrayPushString(zombie_infect, key)
					}
				}
				else if (equal(key, "ZOMBIE PAIN"))
				{
					// Parse sounds
					while (value[0] != 0 && strtok(value, key, charsmax(key), value, charsmax(value), ','))
					{
						// Trim spaces
						trim(key)
						trim(value)
						
						// Add to sounds array
						ArrayPushString(zombie_pain, key)
					}
				}
				else if (equal(key, "NEMESIS PAIN"))
				{
					// Parse sounds
					while (value[0] != 0 && strtok(value, key, charsmax(key), value, charsmax(value), ','))
					{
						// Trim spaces
						trim(key)
						trim(value)
						
						// Add to sounds array
						ArrayPushString(nemesis_pain, key)
					}
				}
				else if (equal(key, "ASSASSIN PAIN"))
				{
					// Parse sounds
					while (value[0] != 0 && strtok(value, key, charsmax(key), value, charsmax(value), ','))
					{
						// Trim spaces
						trim(key)
						trim(value)
						
						// Add to sounds array
						ArrayPushString(assassin_pain, key)
					}
				}
				else if (equal(key, "ZOMBIE DIE"))
				{
					// Parse sounds
					while (value[0] != 0 && strtok(value, key, charsmax(key), value, charsmax(value), ','))
					{
						// Trim spaces
						trim(key)
						trim(value)
						
						// Add to sounds array
						ArrayPushString(zombie_die, key)
					}
				}
				else if (equal(key, "ZOMBIE FALL"))
				{
					// Parse sounds
					while (value[0] != 0 && strtok(value, key, charsmax(key), value, charsmax(value), ','))
					{
						// Trim spaces
						trim(key)
						trim(value)
						
						// Add to sounds array
						ArrayPushString(zombie_fall, key)
					}
				}
				else if (equal(key, "ZOMBIE MISS SLASH"))
				{
					// Parse sounds
					while (value[0] != 0 && strtok(value, key, charsmax(key), value, charsmax(value), ','))
					{
						// Trim spaces
						trim(key)
						trim(value)
						
						// Add to sounds array
						ArrayPushString(zombie_miss_slash, key)
					}
				}
				else if (equal(key, "ZOMBIE MISS WALL"))
				{
					// Parse sounds
					while (value[0] != 0 && strtok(value, key, charsmax(key), value, charsmax(value), ','))
					{
						// Trim spaces
						trim(key)
						trim(value)
						
						// Add to sounds array
						ArrayPushString(zombie_miss_wall, key)
					}
				}
				else if (equal(key, "ZOMBIE HIT NORMAL"))
				{
					// Parse sounds
					while (value[0] != 0 && strtok(value, key, charsmax(key), value, charsmax(value), ','))
					{
						// Trim spaces
						trim(key)
						trim(value)
						
						// Add to sounds array
						ArrayPushString(zombie_hit_normal, key)
					}
				}
				else if (equal(key, "ZOMBIE HIT STAB"))
				{
					// Parse sounds
					while (value[0] != 0 && strtok(value, key, charsmax(key), value, charsmax(value), ','))
					{
						// Trim spaces
						trim(key)
						trim(value)
						
						// Add to sounds array
						ArrayPushString(zombie_hit_stab, key)
					}
				}
				else if (equal(key, "ZOMBIE IDLE"))
				{
					// Parse sounds
					while (value[0] != 0 && strtok(value, key, charsmax(key), value, charsmax(value), ','))
					{
						// Trim spaces
						trim(key)
						trim(value)
						
						// Add to sounds array
						ArrayPushString(zombie_idle, key)
					}
				}
				else if (equal(key, "ZOMBIE IDLE LAST"))
				{
					// Parse sounds
					while (value[0] != 0 && strtok(value, key, charsmax(key), value, charsmax(value), ','))
					{
						// Trim spaces
						trim(key)
						trim(value)
						
						// Add to sounds array
						ArrayPushString(zombie_idle_last, key)
					}
				}
				else if (equal(key, "ZOMBIE MADNESS"))
				{
					// Parse sounds
					while (value[0] != 0 && strtok(value, key, charsmax(key), value, charsmax(value), ','))
					{
						// Trim spaces
						trim(key)
						trim(value)
						
						// Add to sounds array
						ArrayPushString(zombie_madness, key)
					}
				}
				else if (equal(key, "ROUND NEMESIS"))
				{
					// Parse sounds
					while (value[0] != 0 && strtok(value, key, charsmax(key), value, charsmax(value), ','))
					{
						// Trim spaces
						trim(key)
						trim(value)
						
						// Add to sounds array
						ArrayPushString(sound_nemesis, key)
					}
				}
				else if (equal(key, "ROUND ASSASSIN"))
				{
					// Parse sounds
					while (value[0] != 0 && strtok(value, key, charsmax(key), value, charsmax(value), ','))
					{
						// Trim spaces
						trim(key)
						trim(value)
						
						// Add to sounds array
						ArrayPushString(sound_assassin, key)
					}
				}
				else if (equal(key, "ROUND SURVIVOR"))
				{
					// Parse sounds
					while (value[0] != 0 && strtok(value, key, charsmax(key), value, charsmax(value), ','))
					{
						// Trim spaces
						trim(key)
						trim(value)
						
						// Add to sounds array
						ArrayPushString(sound_survivor, key)
					}
				}
				else if (equal(key, "ROUND SNIPER"))
				{
					// Parse sounds
					while (value[0] != 0 && strtok(value, key, charsmax(key), value, charsmax(value), ','))
					{
						// Trim spaces
						trim(key)
						trim(value)
						
						// Add to sounds array
						ArrayPushString(sound_sniper, key)
					}
				}
				else if (equal(key, "ROUND SWARM"))
				{
					// Parse sounds
					while (value[0] != 0 && strtok(value, key, charsmax(key), value, charsmax(value), ','))
					{
						// Trim spaces
						trim(key)
						trim(value)
						
						// Add to sounds array
						ArrayPushString(sound_swarm, key)
					}
				}
				else if (equal(key, "ROUND MULTI"))
				{
					// Parse sounds
					while (value[0] != 0 && strtok(value, key, charsmax(key), value, charsmax(value), ','))
					{
						// Trim spaces
						trim(key)
						trim(value)
						
						// Add to sounds array
						ArrayPushString(sound_multi, key)
					}
				}
				else if (equal(key, "ROUND PLAGUE"))
				{
					// Parse sounds
					while (value[0] != 0 && strtok(value, key, charsmax(key), value, charsmax(value), ','))
					{
						// Trim spaces
						trim(key)
						trim(value)
						
						// Add to sounds array
						ArrayPushString(sound_plague, key)
					}
				}
				else if (equal(key, "ROUND ARMAGEDDON"))
				{
					// Parse sounds
					while (value[0] != 0 && strtok(value, key, charsmax(key), value, charsmax(value), ','))
					{
						// Trim spaces
						trim(key)
						trim(value)
						
						// Add to sounds array
						ArrayPushString(sound_armageddon, key)
					}
				}
				else if (equal(key, "ROUND APOCALYPSE"))
				{
					// Parse sounds
					while (value[0] != 0 && strtok(value, key, charsmax(key), value, charsmax(value), ','))
					{
						// Trim spaces
						trim(key)
						trim(value)
						
						// Add to sounds array
						ArrayPushString(sound_apocalypse, key)
					}
				}
				else if (equal(key, "ROUND NIGHTMARE"))
				{
					// Parse sounds
					while (value[0] != 0 && strtok(value, key, charsmax(key), value, charsmax(value), ','))
					{
						// Trim spaces
						trim(key)
						trim(value)
						
						// Add to sounds array
						ArrayPushString(sound_nightmare, key)
					}
				}
				else if (equal(key, "GRENADE INFECT EXPLODE"))
				{
					// Parse sounds
					while (value[0] != 0 && strtok(value, key, charsmax(key), value, charsmax(value), ','))
					{
						// Trim spaces
						trim(key)
						trim(value)
						
						// Add to sounds array
						ArrayPushString(grenade_infect, key)
					}
				}
				else if (equal(key, "GRENADE INFECT PLAYER"))
				{
					// Parse sounds
					while (value[0] != 0 && strtok(value, key, charsmax(key), value, charsmax(value), ','))
					{
						// Trim spaces
						trim(key)
						trim(value)
						
						// Add to sounds array
						ArrayPushString(grenade_infect_player, key)
					}
				}
				else if (equal(key, "GRENADE FIRE EXPLODE"))
				{
					// Parse sounds
					while (value[0] != 0 && strtok(value, key, charsmax(key), value, charsmax(value), ','))
					{
						// Trim spaces
						trim(key)
						trim(value)
						
						// Add to sounds array
						ArrayPushString(grenade_fire, key)
					}
				}
				else if (equal(key, "GRENADE FIRE PLAYER"))
				{
					// Parse sounds
					while (value[0] != 0 && strtok(value, key, charsmax(key), value, charsmax(value), ','))
					{
						// Trim spaces
						trim(key)
						trim(value)
						
						// Add to sounds array
						ArrayPushString(grenade_fire_player, key)
					}
				}
				else if (equal(key, "GRENADE FROST EXPLODE"))
				{
					// Parse sounds
					while (value[0] != 0 && strtok(value, key, charsmax(key), value, charsmax(value), ','))
					{
						// Trim spaces
						trim(key)
						trim(value)
						
						// Add to sounds array
						ArrayPushString(grenade_frost, key)
					}
				}
				else if (equal(key, "GRENADE FROST PLAYER"))
				{
					// Parse sounds
					while (value[0] != 0 && strtok(value, key, charsmax(key), value, charsmax(value), ','))
					{
						// Trim spaces
						trim(key)
						trim(value)
						
						// Add to sounds array
						ArrayPushString(grenade_frost_player, key)
					}
				}
				else if (equal(key, "GRENADE FROST BREAK"))
				{
					// Parse sounds
					while (value[0] != 0 && strtok(value, key, charsmax(key), value, charsmax(value), ','))
					{
						// Trim spaces
						trim(key)
						trim(value)
						
						// Add to sounds array
						ArrayPushString(grenade_frost_break, key)
					}
				}
				else if (equal(key, "GRENADE FLARE"))
				{
					// Parse sounds
					while (value[0] != 0 && strtok(value, key, charsmax(key), value, charsmax(value), ','))
					{
						// Trim spaces
						trim(key)
						trim(value)
						
						// Add to sounds array
						ArrayPushString(grenade_flare, key)
					}
				}
				else if (equal(key, "ANTIDOTE"))
				{
					// Parse sounds
					while (value[0] != 0 && strtok(value, key, charsmax(key), value, charsmax(value), ','))
					{
						// Trim spaces
						trim(key)
						trim(value)
						
						// Add to sounds array
						ArrayPushString(sound_antidote, key)
					}
				}
				else if (equal(key, "THUNDER"))
				{
					// Parse sounds
					while (value[0] != 0 && strtok(value, key, charsmax(key), value, charsmax(value), ','))
					{
						// Trim spaces
						trim(key)
						trim(value)
						
						// Add to sounds array
						ArrayPushString(sound_thunder, key)
					}
				}
			}
			case SECTION_AMBIENCE_SOUNDS:
			{
				if (equal(key, "INFECTION ENABLE"))
					g_ambience_sounds[AMBIENCE_SOUNDS_INFECTION] = str_to_num(value)
				else if (g_ambience_sounds[AMBIENCE_SOUNDS_INFECTION] && equal(key, "INFECTION SOUNDS"))
				{
					// Parse sounds
					while (value[0] != 0 && strtok(value, key, charsmax(key), value, charsmax(value), ','))
					{
						// Trim spaces
						trim(key)
						trim(value)
						
						// Add to sounds array
						ArrayPushString(sound_ambience1, key)
						ArrayPushCell(sound_ambience1_ismp3, equal(key[strlen(key)-4], ".mp3") ? 1 : 0)
					}
				}
				else if (g_ambience_sounds[AMBIENCE_SOUNDS_INFECTION] && equal(key, "INFECTION DURATIONS"))
				{
					// Parse sounds
					while (value[0] != 0 && strtok(value, key, charsmax(key), value, charsmax(value), ','))
					{
						// Trim spaces
						trim(key)
						trim(value)
						
						// Add to sounds array
						ArrayPushCell(sound_ambience1_duration, str_to_num(key))
					}
				}
				else if (equal(key, "NEMESIS ENABLE"))
					g_ambience_sounds[AMBIENCE_SOUNDS_NEMESIS] = str_to_num(value)
				else if (g_ambience_sounds[AMBIENCE_SOUNDS_NEMESIS] && equal(key, "NEMESIS SOUNDS"))
				{
					// Parse sounds
					while (value[0] != 0 && strtok(value, key, charsmax(key), value, charsmax(value), ','))
					{
						// Trim spaces
						trim(key)
						trim(value)
						
						// Add to sounds array
						ArrayPushString(sound_ambience2, key)
						ArrayPushCell(sound_ambience2_ismp3, equal(key[strlen(key)-4], ".mp3") ? 1 : 0)
					}
				}
				else if (g_ambience_sounds[AMBIENCE_SOUNDS_NEMESIS] && equal(key, "NEMESIS DURATIONS"))
				{
					// Parse sounds
					while (value[0] != 0 && strtok(value, key, charsmax(key), value, charsmax(value), ','))
					{
						// Trim spaces
						trim(key)
						trim(value)
						
						// Add to sounds array
						ArrayPushCell(sound_ambience2_duration, str_to_num(key))
					}
				}
				else if (equal(key, "ASSASSIN ENABLE"))
					g_ambience_sounds[AMBIENCE_SOUNDS_ASSASSIN] = str_to_num(value)
				else if (g_ambience_sounds[AMBIENCE_SOUNDS_ASSASSIN] && equal(key, "ASSASSIN SOUNDS"))
				{
					// Parse sounds
					while (value[0] != 0 && strtok(value, key, charsmax(key), value, charsmax(value), ','))
					{
						// Trim spaces
						trim(key)
						trim(value)
						
						// Add to sounds array
						ArrayPushString(sound_ambience6, key)
						ArrayPushCell(sound_ambience6_ismp3, equal(key[strlen(key)-4], ".mp3") ? 1 : 0)
					}
				}
				else if (g_ambience_sounds[AMBIENCE_SOUNDS_ASSASSIN] && equal(key, "ASSASSIN DURATIONS"))
				{
					// Parse sounds
					while (value[0] != 0 && strtok(value, key, charsmax(key), value, charsmax(value), ','))
					{
						// Trim spaces
						trim(key)
						trim(value)
						
						// Add to sounds array
						ArrayPushCell(sound_ambience6_duration, str_to_num(key))
					}
				}
				else if (equal(key, "SURVIVOR ENABLE"))
					g_ambience_sounds[AMBIENCE_SOUNDS_SURVIVOR] = str_to_num(value)
				else if (g_ambience_sounds[AMBIENCE_SOUNDS_SURVIVOR] && equal(key, "SURVIVOR SOUNDS"))
				{
					// Parse sounds
					while (value[0] != 0 && strtok(value, key, charsmax(key), value, charsmax(value), ','))
					{
						// Trim spaces
						trim(key)
						trim(value)
						
						// Add to sounds array
						ArrayPushString(sound_ambience3, key)
						ArrayPushCell(sound_ambience3_ismp3, equal(key[strlen(key)-4], ".mp3") ? 1 : 0)
					}
				}
				else if (g_ambience_sounds[AMBIENCE_SOUNDS_SURVIVOR] && equal(key, "SURVIVOR DURATIONS"))
				{
					// Parse sounds
					while (value[0] != 0 && strtok(value, key, charsmax(key), value, charsmax(value), ','))
					{
						// Trim spaces
						trim(key)
						trim(value)
						
						// Add to sounds array
						ArrayPushCell(sound_ambience3_duration, str_to_num(key))
					}
				}
				else if (equal(key, "SNIPER ENABLE"))
					g_ambience_sounds[AMBIENCE_SOUNDS_SNIPER] = str_to_num(value)
				else if (g_ambience_sounds[AMBIENCE_SOUNDS_SNIPER] && equal(key, "SNIPER SOUNDS"))
				{
					// Parse sounds
					while (value[0] != 0 && strtok(value, key, charsmax(key), value, charsmax(value), ','))
					{
						// Trim spaces
						trim(key)
						trim(value)
						
						// Add to sounds array
						ArrayPushString(sound_ambience7, key)
						ArrayPushCell(sound_ambience7_ismp3, equal(key[strlen(key)-4], ".mp3") ? 1 : 0)
					}
				}
				else if (g_ambience_sounds[AMBIENCE_SOUNDS_SNIPER] && equal(key, "SNIPER DURATIONS"))
				{
					// Parse sounds
					while (value[0] != 0 && strtok(value, key, charsmax(key), value, charsmax(value), ','))
					{
						// Trim spaces
						trim(key)
						trim(value)
						
						// Add to sounds array
						ArrayPushCell(sound_ambience7_duration, str_to_num(key))
					}
				}
				else if (equal(key, "SWARM ENABLE"))
					g_ambience_sounds[AMBIENCE_SOUNDS_SWARM] = str_to_num(value)
				else if (g_ambience_sounds[AMBIENCE_SOUNDS_SWARM] && equal(key, "SWARM SOUNDS"))
				{
					// Parse sounds
					while (value[0] != 0 && strtok(value, key, charsmax(key), value, charsmax(value), ','))
					{
						// Trim spaces
						trim(key)
						trim(value)
						
						// Add to sounds array
						ArrayPushString(sound_ambience4, key)
						ArrayPushCell(sound_ambience4_ismp3, equal(key[strlen(key)-4], ".mp3") ? 1 : 0)
					}
				}
				else if (g_ambience_sounds[AMBIENCE_SOUNDS_SWARM] && equal(key, "SWARM DURATIONS"))
				{
					// Parse sounds
					while (value[0] != 0 && strtok(value, key, charsmax(key), value, charsmax(value), ','))
					{
						// Trim spaces
						trim(key)
						trim(value)
						
						// Add to sounds array
						ArrayPushCell(sound_ambience4_duration, str_to_num(key))
					}
				}
				else if (equal(key, "PLAGUE ENABLE"))
					g_ambience_sounds[AMBIENCE_SOUNDS_PLAGUE] = str_to_num(value)
				else if (g_ambience_sounds[AMBIENCE_SOUNDS_PLAGUE] && equal(key, "PLAGUE SOUNDS"))
				{
					// Parse sounds
					while (value[0] != 0 && strtok(value, key, charsmax(key), value, charsmax(value), ','))
					{
						// Trim spaces
						trim(key)
						trim(value)
						
						// Add to sounds array
						ArrayPushString(sound_ambience5, key)
						ArrayPushCell(sound_ambience5_ismp3, equal(key[strlen(key)-4], ".mp3") ? 1 : 0)
					}
				}
				else if (g_ambience_sounds[AMBIENCE_SOUNDS_PLAGUE] && equal(key, "PLAGUE DURATIONS"))
				{
					// Parse sounds
					while (value[0] != 0 && strtok(value, key, charsmax(key), value, charsmax(value), ','))
					{
						// Trim spaces
						trim(key)
						trim(value)
						
						// Add to sounds array
						ArrayPushCell(sound_ambience5_duration, str_to_num(key))
					}
				}
				else if (equal(key, "ARMAGEDDON ENABLE"))
					g_ambience_sounds[AMBIENCE_SOUNDS_ARMAGEDDON] = str_to_num(value)
				else if (g_ambience_sounds[AMBIENCE_SOUNDS_ARMAGEDDON] && equal(key, "ARMAGEDDON SOUNDS"))
				{
					// Parse sounds
					while (value[0] != 0 && strtok(value, key, charsmax(key), value, charsmax(value), ','))
					{
						// Trim spaces
						trim(key)
						trim(value)
							
						// Add to sounds array
						ArrayPushString(sound_ambience8, key)
						ArrayPushCell(sound_ambience8_ismp3, equal(key[strlen(key)-4], ".mp3") ? 1 : 0)
					}
				}
				else if (g_ambience_sounds[AMBIENCE_SOUNDS_ARMAGEDDON] && equal(key, "ARMAGEDDON DURATIONS"))
				{
					// Parse sounds
					while (value[0] != 0 && strtok(value, key, charsmax(key), value, charsmax(value), ','))
					{
						// Trim spaces
						trim(key)
						trim(value)
							
						// Add to sounds array
						ArrayPushCell(sound_ambience8_duration, str_to_num(key))
					}
				}
				else if (equal(key, "APOCALYPSE ENABLE"))
					g_ambience_sounds[AMBIENCE_SOUNDS_APOCALYPSE] = str_to_num(value)
				else if (g_ambience_sounds[AMBIENCE_SOUNDS_APOCALYPSE] && equal(key, "APOCALYPSE SOUNDS"))
				{
					// Parse sounds
					while (value[0] != 0 && strtok(value, key, charsmax(key), value, charsmax(value), ','))
					{
						// Trim spaces
						trim(key)
						trim(value)
							
						// Add to sounds array
						ArrayPushString(sound_ambience9, key)
						ArrayPushCell(sound_ambience9_ismp3, equal(key[strlen(key)-4], ".mp3") ? 1 : 0)
					}
				}
				else if (g_ambience_sounds[AMBIENCE_SOUNDS_APOCALYPSE] && equal(key, "APOCALYPSE DURATIONS"))
				{
					// Parse sounds
					while (value[0] != 0 && strtok(value, key, charsmax(key), value, charsmax(value), ','))
					{
						// Trim spaces
						trim(key)
						trim(value)
							
						// Add to sounds array
						ArrayPushCell(sound_ambience9_duration, str_to_num(key))
					}
				}
				else if (equal(key, "NIGHTMARE ENABLE"))
					g_ambience_sounds[AMBIENCE_SOUNDS_NIGHTMARE] = str_to_num(value)
				else if (g_ambience_sounds[AMBIENCE_SOUNDS_NIGHTMARE] && equal(key, "NIGHTMARE SOUNDS"))
				{
					// Parse sounds
					while (value[0] != 0 && strtok(value, key, charsmax(key), value, charsmax(value), ','))
					{
						// Trim spaces
						trim(key)
						trim(value)
							
						// Add to sounds array
						ArrayPushString(sound_ambience10, key)
						ArrayPushCell(sound_ambience10_ismp3, equal(key[strlen(key)-4], ".mp3") ? 1 : 0)
					}
				}
				else if (g_ambience_sounds[AMBIENCE_SOUNDS_NIGHTMARE] && equal(key, "NIGHTMARE DURATIONS"))
				{
					// Parse sounds
					while (value[0] != 0 && strtok(value, key, charsmax(key), value, charsmax(value), ','))
					{
						// Trim spaces
						trim(key)
						trim(value)
							
						// Add to sounds array
						ArrayPushCell(sound_ambience10_duration, str_to_num(key))
					}
				}
			}
			case SECTION_BUY_MENU_WEAPONS:
			{
				if (equal(key, "PRIMARY"))
				{
					// Parse weapons
					while (value[0] != 0 && strtok(value, key, charsmax(key), value, charsmax(value), ','))
					{
						// Trim spaces
						trim(key)
						trim(value)
						
						// Add to weapons array
						ArrayPushString(g_primary_items, key)
						ArrayPushCell(g_primary_weaponids, cs_weapon_name_to_id(key))
					}
				}
				else if (equal(key, "SECONDARY"))
				{
					// Parse weapons
					while (value[0] != 0 && strtok(value, key, charsmax(key), value, charsmax(value), ','))
					{
						// Trim spaces
						trim(key)
						trim(value)
						
						// Add to weapons array
						ArrayPushString(g_secondary_items, key)
						ArrayPushCell(g_secondary_weaponids, cs_weapon_name_to_id(key))
					}
				}
				else if (equal(key, "ADDITIONAL ITEMS"))
				{
					// Parse weapons
					while (value[0] != 0 && strtok(value, key, charsmax(key), value, charsmax(value), ','))
					{
						// Trim spaces
						trim(key)
						trim(value)
						
						// Add to weapons array
						ArrayPushString(g_additional_items, key)
					}
				}
			}
			case SECTION_EXTRA_ITEMS_WEAPONS:
			{
				if (equal(key, "NAMES"))
				{
					// Parse weapon items
					while (value[0] != 0 && strtok(value, key, charsmax(key), value, charsmax(value), ','))
					{
						// Trim spaces
						trim(key)
						trim(value)
						
						// Add to weapons array
						ArrayPushString(g_extraweapon_names, key)
					}
				}
				else if (equal(key, "ITEMS"))
				{
					// Parse weapon items
					while (value[0] != 0 && strtok(value, key, charsmax(key), value, charsmax(value), ','))
					{
						// Trim spaces
						trim(key)
						trim(value)
						
						// Add to weapons array
						ArrayPushString(g_extraweapon_items, key)
					}
				}
				else if (equal(key, "COSTS"))
				{
					// Parse weapon items
					while (value[0] != 0 && strtok(value, key, charsmax(key), value, charsmax(value), ','))
					{
						// Trim spaces
						trim(key)
						trim(value)
						
						// Add to weapons array
						ArrayPushCell(g_extraweapon_costs, str_to_num(key))
					}
				}
			}
			case SECTION_HARD_CODED_ITEMS_COSTS:
			{
				if (equal(key, "NIGHT VISION"))
					g_extra_costs2[EXTRA_NVISION] = str_to_num(value)
				else if (equal(key, "ANTIDOTE"))
					g_extra_costs2[EXTRA_ANTIDOTE] = str_to_num(value)
				else if (equal(key, "ZOMBIE MADNESS"))
					g_extra_costs2[EXTRA_MADNESS] = str_to_num(value)
				else if (equal(key, "INFECTION BOMB"))
					g_extra_costs2[EXTRA_INFBOMB] = str_to_num(value)
			}
			case SECTION_WEATHER_EFFECTS:
			{
				if (equal(key, "RAIN"))
					g_ambience_rain = str_to_num(value)
				else if (equal(key, "SNOW"))
					g_ambience_snow = str_to_num(value)
				else if (equal(key, "FOG"))
					g_ambience_fog = str_to_num(value)
				else if (equal(key, "FOG DENSITY"))
					copy(g_fog_density, charsmax(g_fog_density), value)
				else if (equal(key, "FOG COLOR"))
					copy(g_fog_color, charsmax(g_fog_color), value)
			}
			case SECTION_SKY:
			{
				if (equal(key, "ENABLE"))
					g_sky_enable = str_to_num(value)
				else if (equal(key, "SKY NAMES"))
				{
					// Parse sky names
					while (value[0] != 0 && strtok(value, key, charsmax(key), value, charsmax(value), ','))
					{
						// Trim spaces
						trim(key)
						trim(value)
						
						// Add to skies array
						ArrayPushString(g_sky_names, key)
						
						// Preache custom sky files
						formatex(linedata, charsmax(linedata), "gfx/env/%sbk.tga", key)
						engfunc(EngFunc_PrecacheGeneric, linedata)
						formatex(linedata, charsmax(linedata), "gfx/env/%sdn.tga", key)
						engfunc(EngFunc_PrecacheGeneric, linedata)
						formatex(linedata, charsmax(linedata), "gfx/env/%sft.tga", key)
						engfunc(EngFunc_PrecacheGeneric, linedata)
						formatex(linedata, charsmax(linedata), "gfx/env/%slf.tga", key)
						engfunc(EngFunc_PrecacheGeneric, linedata)
						formatex(linedata, charsmax(linedata), "gfx/env/%srt.tga", key)
						engfunc(EngFunc_PrecacheGeneric, linedata)
						formatex(linedata, charsmax(linedata), "gfx/env/%sup.tga", key)
						engfunc(EngFunc_PrecacheGeneric, linedata)
					}
				}
			}
			case SECTION_LIGHTNING:
			{
				if (equal(key, "LIGHTS"))
				{
					// Parse lights
					while (value[0] != 0 && strtok(value, key, charsmax(key), value, charsmax(value), ','))
					{
						// Trim spaces
						trim(key)
						trim(value)
						
						// Add to lightning array
						ArrayPushString(lights_thunder, key)
					}
				}
			}
			case SECTION_ZOMBIE_DECALS:
			{
				if (equal(key, "DECALS"))
				{
					// Parse decals
					while (value[0] != 0 && strtok(value, key, charsmax(key), value, charsmax(value), ','))
					{
						// Trim spaces
						trim(key)
						trim(value)
						
						// Add to zombie decals array
						ArrayPushCell(zombie_decals, str_to_num(key))
					}
				}
			}
			case SECTION_KNOCKBACK:
			{
				// Format weapon entity name
				strtolower(key)
				format(key, charsmax(key), "weapon_%s", key)
				
				// Add value to knockback power array
				kb_weapon_power[cs_weapon_name_to_id(key)] = str_to_float(value)
			}
			case SECTION_OBJECTIVE_ENTS:
			{
				if (equal(key, "CLASSNAMES"))
				{
					// Parse classnames
					while (value[0] != 0 && strtok(value, key, charsmax(key), value, charsmax(value), ','))
					{
						// Trim spaces
						trim(key)
						trim(value)
						
						// Add to objective ents array
						ArrayPushString(g_objective_ents, key)
					}
				}
			}
			case SECTION_SVC_BAD:
			{
				if (equal(key, "MODELCHANGE DELAY"))
					g_modelchange_delay = str_to_float(value)
				else if (equal(key, "HANDLE MODELS ON SEPARATE ENT"))
					g_handle_models_on_separate_ent = str_to_num(value)
				else if (equal(key, "SET MODELINDEX OFFSET"))
					g_set_modelindex_offset = str_to_num(value)
			}
		}
	}
	if (file) fclose(file)
	
	// Build zombie classes file path
	get_configsdir(path, charsmax(path))
	format(path, charsmax(path), "%s/%s", path, ZP_ZOMBIECLASSES_FILE)
	
	// Parse if present
	if (file_exists(path))
	{
		// Open zombie classes file for reading
		file = fopen(path, "rt")
		
		while (file && !feof(file))
		{
			// Read one line at a time
			fgets(file, linedata, charsmax(linedata))
			
			// Replace newlines with a null character to prevent headaches
			replace(linedata, charsmax(linedata), "^n", "")
			
			// Blank line or comment
			if (!linedata[0] || linedata[0] == ';') continue;
			
			// New class starting
			if (linedata[0] == '[')
			{
				// Remove first and last characters (braces)
				linedata[strlen(linedata) - 1] = 0
				copy(linedata, charsmax(linedata), linedata[1])
				
				// Store its real name for future reference
				ArrayPushString(g_zclass2_realname, linedata)
				continue;
			}
			
			// Get key and value(s)
			strtok(linedata, key, charsmax(key), value, charsmax(value), '=')
			
			// Trim spaces
			trim(key)
			trim(value)
			
			if (equal(key, "NAME"))
				ArrayPushString(g_zclass2_name, value)
			else if (equal(key, "INFO"))
				ArrayPushString(g_zclass2_info, value)
			else if (equal(key, "MODELS"))
			{
				// Set models start index
				ArrayPushCell(g_zclass2_modelsstart, ArraySize(g_zclass2_playermodel))
				
				// Parse class models
				while (value[0] != 0 && strtok(value, key, charsmax(key), value, charsmax(value), ','))
				{
					// Trim spaces
					trim(key)
					trim(value)
					
					// Add to class models array
					ArrayPushString(g_zclass2_playermodel, key)
					ArrayPushCell(g_zclass2_modelindex, -1)
				}
				
				// Set models end index
				ArrayPushCell(g_zclass2_modelsend, ArraySize(g_zclass2_playermodel))
			}
			else if (equal(key, "CLAWMODEL"))
				ArrayPushString(g_zclass2_clawmodel, value)
			else if (equal(key, "HEALTH"))
				ArrayPushCell(g_zclass2_hp, str_to_num(value))
			else if (equal(key, "SPEED"))
				ArrayPushCell(g_zclass2_spd, str_to_num(value))
			else if (equal(key, "GRAVITY"))
				ArrayPushCell(g_zclass2_grav, str_to_float(value))
			else if (equal(key, "KNOCKBACK"))
				ArrayPushCell(g_zclass2_kb, str_to_float(value))
		}
		if (file) fclose(file)
	}
	
	// Build extra items file path
	get_configsdir(path, charsmax(path))
	format(path, charsmax(path), "%s/%s", path, ZP_EXTRAITEMS_FILE)
	
	// Parse if present
	if (file_exists(path))
	{
		// Open extra items file for reading
		file = fopen(path, "rt")
		
		while (file && !feof(file))
		{
			// Read one line at a time
			fgets(file, linedata, charsmax(linedata))
			
			// Replace newlines with a null character to prevent headaches
			replace(linedata, charsmax(linedata), "^n", "")
			
			// Blank line or comment
			if (!linedata[0] || linedata[0] == ';') continue;
			
			// New item starting
			if (linedata[0] == '[')
			{
				// Remove first and last characters (braces)
				linedata[strlen(linedata) - 1] = 0
				copy(linedata, charsmax(linedata), linedata[1])
				
				// Store its real name for future reference
				ArrayPushString(g_extraitem2_realname, linedata)
				continue;
			}
			
			// Get key and value(s)
			strtok(linedata, key, charsmax(key), value, charsmax(value), '=')
			
			// Trim spaces
			trim(key)
			trim(value)
			
			if (equal(key, "NAME"))
				ArrayPushString(g_extraitem2_name, value)
			else if (equal(key, "COST"))
				ArrayPushCell(g_extraitem2_cost, str_to_num(value))
			else if (equal(key, "TEAMS"))
			{
				// Clear teams bitsum
				teams = 0
				
				// Parse teams
				while (value[0] != 0 && strtok(value, key, charsmax(key), value, charsmax(value), ','))
				{
					// Trim spaces
					trim(key)
					trim(value)
					
					if (equal(key, ZP_TEAM_NAMES[ZP_TEAM_ZOMBIE]))
						teams |= ZP_TEAM_ZOMBIE
					else if (equal(key, ZP_TEAM_NAMES[ZP_TEAM_HUMAN]))
						teams |= ZP_TEAM_HUMAN
					else if (equal(key, ZP_TEAM_NAMES[ZP_TEAM_NEMESIS]))
						teams |= ZP_TEAM_NEMESIS
					else if (equal(key, ZP_TEAM_NAMES[ZP_TEAM_ASSASSIN]))
						teams |= ZP_TEAM_ASSASSIN
					else if (equal(key, ZP_TEAM_NAMES[ZP_TEAM_SURVIVOR]))
						teams |= ZP_TEAM_SURVIVOR
					else if (equal(key, ZP_TEAM_NAMES[ZP_TEAM_SNIPER]))
						teams |= ZP_TEAM_SNIPER
				}
				
				// Add to teams array
				ArrayPushCell(g_extraitem2_team, teams)
			}
		}
		if (file) fclose(file)
	}
}

save_customization()
{
	new i, k, buffer[512]
	
	// Build zombie classes file path
	new path[64]
	get_configsdir(path, charsmax(path))
	format(path, charsmax(path), "%s/%s", path, ZP_ZOMBIECLASSES_FILE)
	
	// Open zombie classes file for appending data
	new file = fopen(path, "at"), size = ArraySize(g_zclass_name)
	
	// Add any new zombie classes data at the end if needed
	for (i = 0; i < size; i++)
	{
		if (ArrayGetCell(g_zclass_new, i))
		{
			// Add real name
			ArrayGetString(g_zclass_name, i, buffer, charsmax(buffer))
			format(buffer, charsmax(buffer), "^n[%s]", buffer)
			fputs(file, buffer)
			
			// Add caption
			ArrayGetString(g_zclass_name, i, buffer, charsmax(buffer))
			format(buffer, charsmax(buffer), "^nNAME = %s", buffer)
			fputs(file, buffer)
			
			// Add info
			ArrayGetString(g_zclass_info, i, buffer, charsmax(buffer))
			format(buffer, charsmax(buffer), "^nINFO = %s", buffer)
			fputs(file, buffer)
			
			// Add models
			for (k = ArrayGetCell(g_zclass_modelsstart, i); k < ArrayGetCell(g_zclass_modelsend, i); k++)
			{
				if (k == ArrayGetCell(g_zclass_modelsstart, i))
				{
					// First model, overwrite buffer
					ArrayGetString(g_zclass_playermodel, k, buffer, charsmax(buffer))
				}
				else
				{
					// Successive models, append to buffer
					ArrayGetString(g_zclass_playermodel, k, path, charsmax(path))
					format(buffer, charsmax(buffer), "%s , %s", buffer, path)
				}
			}
			format(buffer, charsmax(buffer), "^nMODELS = %s", buffer)
			fputs(file, buffer)
			
			// Add clawmodel
			ArrayGetString(g_zclass_clawmodel, i, buffer, charsmax(buffer))
			format(buffer, charsmax(buffer), "^nCLAWMODEL = %s", buffer)
			fputs(file, buffer)
			
			// Add health
			formatex(buffer, charsmax(buffer), "^nHEALTH = %d", ArrayGetCell(g_zclass_hp, i))
			fputs(file, buffer)
			
			// Add speed
			formatex(buffer, charsmax(buffer), "^nSPEED = %d", ArrayGetCell(g_zclass_spd, i))
			fputs(file, buffer)
			
			// Add gravity
			formatex(buffer, charsmax(buffer), "^nGRAVITY = %.2f", Float:ArrayGetCell(g_zclass_grav, i))
			fputs(file, buffer)
			
			// Add knockback
			formatex(buffer, charsmax(buffer), "^nKNOCKBACK = %.2f^n", Float:ArrayGetCell(g_zclass_kb, i))
			fputs(file, buffer)
		}
	}
	fclose(file)
	
	// Build extra items file path
	get_configsdir(path, charsmax(path))
	format(path, charsmax(path), "%s/%s", path, ZP_EXTRAITEMS_FILE)
	
	// Open extra items file for appending data
	file = fopen(path, "at")
	size = ArraySize(g_extraitem_name)
	
	// Add any new extra items data at the end if needed
	for (i = EXTRAS_CUSTOM_STARTID; i < size; i++)
	{
		if (ArrayGetCell(g_extraitem_new, i))
		{
			// Add real name
			ArrayGetString(g_extraitem_name, i, buffer, charsmax(buffer))
			format(buffer, charsmax(buffer), "^n[%s]", buffer)
			fputs(file, buffer)
			
			// Add caption
			ArrayGetString(g_extraitem_name, i, buffer, charsmax(buffer))
			format(buffer, charsmax(buffer), "^nNAME = %s", buffer)
			fputs(file, buffer)
			
			// Add cost
			formatex(buffer, charsmax(buffer), "^nCOST = %d", ArrayGetCell(g_extraitem_cost, i))
			fputs(file, buffer)
			
			// Add team
			formatex(buffer, charsmax(buffer), "^nTEAMS = %s^n", ZP_TEAM_NAMES[ArrayGetCell(g_extraitem_team, i)])
			fputs(file, buffer)
		}
	}
	fclose(file)
	
	// Free arrays containing class/item overrides
	ArrayDestroy(g_zclass2_realname)
	ArrayDestroy(g_zclass2_name)
	ArrayDestroy(g_zclass2_info)
	ArrayDestroy(g_zclass2_modelsstart)
	ArrayDestroy(g_zclass2_modelsend)
	ArrayDestroy(g_zclass2_playermodel)
	ArrayDestroy(g_zclass2_modelindex)
	ArrayDestroy(g_zclass2_clawmodel)
	ArrayDestroy(g_zclass2_hp)
	ArrayDestroy(g_zclass2_spd)
	ArrayDestroy(g_zclass2_grav)
	ArrayDestroy(g_zclass2_kb)
	ArrayDestroy(g_zclass_new)
	ArrayDestroy(g_extraitem2_realname)
	ArrayDestroy(g_extraitem2_name)
	ArrayDestroy(g_extraitem2_cost)
	ArrayDestroy(g_extraitem2_team)
	ArrayDestroy(g_extraitem_new)
}

// Register Ham Forwards for CZ bots
public register_ham_czbots(id)
{
	// Make sure it's a CZ bot and it's still connected
	if (g_hamczbots || !g_isconnected[id] || !get_pcvar_num(cvar_botquota))
		return;
	
	RegisterHamFromEntity(Ham_Spawn, id, "fw_PlayerSpawn_Post", 1)
	RegisterHamFromEntity(Ham_Killed, id, "fw_PlayerKilled")
	RegisterHamFromEntity(Ham_Killed, id, "fw_PlayerKilled_Post", 1)
	RegisterHamFromEntity(Ham_TakeDamage, id, "fw_TakeDamage")
	RegisterHamFromEntity(Ham_TakeDamage, id, "fw_TakeDamage_Post", 1)
	RegisterHamFromEntity(Ham_TraceAttack, id, "fw_TraceAttack")
	RegisterHamFromEntity(Ham_Player_ResetMaxSpeed, id, "fw_ResetMaxSpeed_Post", 1)
	
	// Ham forwards for CZ bots succesfully registered
	g_hamczbots = true
	
	// If the bot has already spawned, call the forward manually for him
	if (is_user_alive(id)) fw_PlayerSpawn_Post(id)
}

// Disable minmodels task
public disable_minmodels(id)
{
	if (!g_isconnected[id]) return;
	client_cmd(id, "cl_minmodels 0")
}

// Bots automatically buy extra items
public bot_buy_extras(taskid)
{
	// Nemesis or Survivor bots have nothing to buy by default
	if (!g_isalive[ID_SPAWN] || g_survivor[ID_SPAWN] || g_sniper[ID_SPAWN] || g_nemesis[ID_SPAWN] || g_assassin[ID_SPAWN])
		return;
	
	if (!g_zombie[ID_SPAWN]) // human bots
	{
		// Attempt to buy Night Vision
		buy_extra_item(ID_SPAWN, EXTRA_NVISION)
		
		// Attempt to buy a weapon
		buy_extra_item(ID_SPAWN, random_num(EXTRA_WEAPONS_STARTID, EXTRAS_CUSTOM_STARTID-1))
	}
	else // zombie bots
	{
		// Attempt to buy an Antidote
		buy_extra_item(ID_SPAWN, EXTRA_ANTIDOTE)
	}
}

// Refill BP Ammo Task
public refill_bpammo(const args[], id)
{
	// Player died or turned into a zombie
	if (!g_isalive[id] || g_zombie[id])
		return;
	
	set_msg_block(g_msgAmmoPickup, BLOCK_ONCE)
	ExecuteHamB(Ham_GiveAmmo, id, MAXBPAMMO[REFILL_WEAPONID], AMMOTYPE[REFILL_WEAPONID], MAXBPAMMO[REFILL_WEAPONID])
}

// Balance Teams Task
balance_teams()
{
	// Get amount of users playing
	static iPlayersnum
	iPlayersnum = fnGetPlaying()
	
	// No players, don't bother
	if (iPlayersnum < 1) return;
	
	// Split players evenly
	static iTerrors, iMaxTerrors, id, team[33]
	iMaxTerrors = iPlayersnum/2
	iTerrors = 0
	
	// First, set everyone to CT
	for (id = 1; id <= g_maxplayers; id++)
	{
		// Skip if not connected
		if (!g_isconnected[id])
			continue;
		
		team[id] = fm_cs_get_user_team(id)
		
		// Skip if not playing
		if (team[id] == FM_CS_TEAM_SPECTATOR || team[id] == FM_CS_TEAM_UNASSIGNED)
			continue;
		
		// Set team
		remove_task(id+TASK_TEAM)
		fm_cs_set_user_team(id, FM_CS_TEAM_CT)
		team[id] = FM_CS_TEAM_CT
	}
	
	// Then randomly set half of the players to Terrorists
	while (iTerrors < iMaxTerrors)
	{
		// Keep looping through all players
		if (++id > g_maxplayers) id = 1
		
		// Skip if not connected
		if (!g_isconnected[id])
			continue;
		
		// Skip if not playing or already a Terrorist
		if (team[id] != FM_CS_TEAM_CT)
			continue;
		
		// Random chance
		if (random_num(0, 1))
		{
			fm_cs_set_user_team(id, FM_CS_TEAM_T)
			team[id] = FM_CS_TEAM_T
			iTerrors++
		}
	}
}

// Welcome Message Task
public welcome_msg()
{
	// Show mod info
	zp_colored_print(0, "^x01**** ^x04%s^x01 ****", g_modname)
	zp_colored_print(0, "^x04[ZP]^x01 %L", LANG_PLAYER, "NOTICE_INFO1")
	if (!get_pcvar_num(cvar_infammo)) zp_colored_print(0, "^x04[ZP]^x01 %L", LANG_PLAYER, "NOTICE_INFO2")
	
	// Show T-virus HUD notice
	set_hudmessage(0, 125, 200, HUD_EVENT_X, HUD_EVENT_Y, 0, 0.0, 3.0, 2.0, 1.0, -1)
	ShowSyncHudMsg(0, g_MsgSync, "%L", LANG_PLAYER, "NOTICE_VIRUS_FREE")
}

// Respawn Player Task (deathmatch)
public respawn_player_task(taskid)
{
	// Already alive or round ended
	if (g_isalive[ID_SPAWN] || g_endround)
		return;
	
	// Get player's team
	static team
	team = fm_cs_get_user_team(ID_SPAWN)
	
	// Player moved to spectators
	if (team == FM_CS_TEAM_SPECTATOR || team == FM_CS_TEAM_UNASSIGNED)
		return;
	
	// Respawn player automatically if allowed on current round
	if ((!g_survround || get_pcvar_num(cvar_allowrespawnsurv)) 
	&& (!g_sniround || get_pcvar_num(cvar_allowrespawnsni)) 
	&& (!g_swarmround || get_pcvar_num(cvar_allowrespawnswarm)) 
	&& (!g_nemround || get_pcvar_num(cvar_allowrespawnnem)) 
	&& (!g_assaround || get_pcvar_num(cvar_allowrespawnassa)) 
	&& (!g_plagueround || get_pcvar_num(cvar_allowrespawnplague)) 
	&& (!g_armageround || get_pcvar_num(cvar_allowrespawnarmage)) 
	&& (!g_apocround || get_pcvar_num(cvar_allowrespawnapoc)) 
	&& (!g_nightround || get_pcvar_num(cvar_allowrespawnnight)))
	{

		// Infection rounds = none of the above
		if (!get_pcvar_num(cvar_allowrespawninfection) && !g_survround && !g_sniround && !g_nemround && !g_assaround && !g_swarmround && !g_plagueround && !g_armageround && !g_apocround && !g_nightround)
			return;
		
		// Respawn if only the last human is left? (ignore this setting on survivor rounds)
		if (!g_survround && !g_sniround && !get_pcvar_num(cvar_respawnafterlast) && fnGetHumans() <= 1)
			return;
		
		// Respawn as zombie?
		if (get_pcvar_num(cvar_deathmatch) == 2 || (get_pcvar_num(cvar_deathmatch) == 3 && random_num(0, 1)) || (get_pcvar_num(cvar_deathmatch) == 4 && fnGetZombies() < fnGetAlive()/2))
			g_respawn_as_zombie[ID_SPAWN] = true
		
		// Override respawn as zombie setting on nemesis and survivor rounds
		if (g_survround || g_sniround) g_respawn_as_zombie[ID_SPAWN] = true
		else if (g_nemround || g_assaround) g_respawn_as_zombie[ID_SPAWN] = false
		
		respawn_player_manually(ID_SPAWN)
	}
}

// Respawn Player Check Task (if killed by worldspawn)
public respawn_player_check_task(taskid)
{
	// Successfully spawned or round ended
	if (g_isalive[ID_SPAWN] || g_endround)
		return;
	
	// Get player's team
	static team
	team = fm_cs_get_user_team(ID_SPAWN)
	
	// Player moved to spectators
	if (team == FM_CS_TEAM_SPECTATOR || team == FM_CS_TEAM_UNASSIGNED)
		return;
	
	// If player was being spawned as a zombie, set the flag again
	if (g_zombie[ID_SPAWN]) g_respawn_as_zombie[ID_SPAWN] = true
	else g_respawn_as_zombie[ID_SPAWN] = false
	
	respawn_player_manually(ID_SPAWN)
}

// Respawn Player Manually (called after respawn checks are done)
respawn_player_manually(id)
{
	// Set proper team before respawning, so that the TeamInfo message that's sent doesn't confuse PODBots
	if (g_respawn_as_zombie[id])
		fm_cs_set_user_team(id, FM_CS_TEAM_T)
	else
		fm_cs_set_user_team(id, FM_CS_TEAM_CT)
	
	// Respawning a player has never been so easy
	ExecuteHamB(Ham_CS_RoundRespawn, id)
}

// Check Round Task -check that we still have both zombies and humans on a round-
check_round(leaving_player)
{
	// Round ended or make_a_zombie task still active
	if (g_endround || task_exists(TASK_MAKEZOMBIE))
		return;
	
	// Get alive players count
	static iPlayersnum, id
	iPlayersnum = fnGetAlive()
	
	// Last alive player, don't bother
	if (iPlayersnum < 2)
		return;
	
	// Last zombie disconnecting
	if (g_zombie[leaving_player] && fnGetZombies() == 1)
	{
		// Only one CT left, don't bother
		if (fnGetHumans() == 1 && fnGetCTs() == 1)
			return;
		
		// Pick a random one to take his place
		while ((id = fnGetRandomAlive(random_num(1, iPlayersnum))) == leaving_player ) { /* keep looping */ }
		
		// Show last zombie left notice
		zp_colored_print(0, "^x04[ZP]^x01 %L", LANG_PLAYER, "LAST_ZOMBIE_LEFT", g_playername[id])
		
		// Set player leaving flag
		g_lastplayerleaving = true
		
		// Turn into a Nemesis or just a zombie?
		if (g_nemesis[leaving_player])
			zombieme(id, 0, 1, 0, 0, 0)
		else if (g_assassin[leaving_player])
			zombieme(id, 0, 0, 1, 0, 0)
		else
			zombieme(id, 0, 0, 0, 0, 0)
		
		// Remove player leaving flag
		g_lastplayerleaving = false
		
		// If Nemesis, set chosen player's health to that of the one who's leaving
		if (get_pcvar_num(cvar_keephealthondisconnect) && g_nemesis[leaving_player])
			fm_set_user_health(id, pev(leaving_player, pev_health))
			
		// If Assassin, set chosen player's health to that of the one who's leaving
		if (get_pcvar_num(cvar_keephealthondisconnect) && g_assassin[leaving_player])
			fm_set_user_health(id, pev(leaving_player, pev_health))
	}
	
	// Last human disconnecting
	else if (!g_zombie[leaving_player] && fnGetHumans() == 1)
	{
		// Only one T left, don't bother
		if (fnGetZombies() == 1 && fnGetTs() == 1)
			return;
		
		// Pick a random one to take his place
		while ((id = fnGetRandomAlive(random_num(1, iPlayersnum))) == leaving_player ) { /* keep looping */ }
		
		// Show last human left notice
		zp_colored_print(0, "^x04[ZP]^x01 %L", LANG_PLAYER, "LAST_HUMAN_LEFT", g_playername[id])
		
		// Set player leaving flag
		g_lastplayerleaving = true
		
		// Turn into a Survivor or just a human?
		if (g_survivor[leaving_player])
			humanme(id, 1, 0, 0)
		else if (g_sniper[leaving_player])
			humanme(id, 0, 1, 0)
		else
			humanme(id, 0, 0, 0)
		
		// Remove player leaving flag
		g_lastplayerleaving = false
		
		// If Survivor, set chosen player's health to that of the one who's leaving
		if (get_pcvar_num(cvar_keephealthondisconnect) && g_survivor[leaving_player])
			fm_set_user_health(id, pev(leaving_player, pev_health))
			
		// If Sniper, set chosen player's health to that of the one who's leaving
		if (get_pcvar_num(cvar_keephealthondisconnect) && g_sniper[leaving_player])
			fm_set_user_health(id, pev(leaving_player, pev_health))
	}
}

// Lighting Effects Task
public lighting_effects()
{
	// Cache some CVAR values at every 5 secs
	cache_cvars()
	
	// Get lighting style
	static lighting[2]
	get_pcvar_string(cvar_lighting, lighting, charsmax(lighting))
	strtolower(lighting)
	
	// Lighting disabled? ["0"]
	if (lighting[0] == '0')
		return;
	
	// Darkest light settings?
	if (lighting[0] >= 'a' && lighting[0] <= 'd')
	{
		static thunderclap_in_progress, Float:thunder
		thunderclap_in_progress = task_exists(TASK_THUNDER)
		thunder = get_pcvar_float(cvar_thunder)
		
		// Set thunderclap tasks if not existant
		if (thunder > 0.0 && !task_exists(TASK_THUNDER_PRE) && !thunderclap_in_progress)
		{
			g_lights_i = 0
			ArrayGetString(lights_thunder, random_num(0, ArraySize(lights_thunder) - 1), g_lights_cycle, charsmax(g_lights_cycle))
			g_lights_cycle_len = strlen(g_lights_cycle)
			set_task(thunder, "thunderclap", TASK_THUNDER_PRE)
		}
		
		// Set lighting only when no thunderclaps are going on
		if (!thunderclap_in_progress) engfunc(EngFunc_LightStyle, 0, g_assaround ? "a" : lighting) // no lighting in assassin round
	}
	else
	{
		// Remove thunderclap tasks
		remove_task(TASK_THUNDER_PRE)
		remove_task(TASK_THUNDER)
		
		// Set lighting
		engfunc(EngFunc_LightStyle, 0, g_assaround ? "a" : lighting) // no lighting in assassin round
	}
}

// Thunderclap task
public thunderclap()
{
	// Play thunder sound
	if (g_lights_i == 0)
	{
		static sound[64]
		ArrayGetString(sound_thunder, random_num(0, ArraySize(sound_thunder) - 1), sound, charsmax(sound))
		PlaySound(sound)
	}
	
	// Set lighting
	static light[2]
	light[0] = g_lights_cycle[g_lights_i]
	engfunc(EngFunc_LightStyle, 0, light)
	
	g_lights_i++
	
	// Lighting cycle end?
	if (g_lights_i >= g_lights_cycle_len)
	{
		remove_task(TASK_THUNDER)
		lighting_effects()
	}
	// Lighting cycle start?
	else if (!task_exists(TASK_THUNDER))
		set_task(0.1, "thunderclap", TASK_THUNDER, _, _, "b")
}

// Ambience Sound Effects Task
public ambience_sound_effects(taskid)
{
	// Play a random sound depending on the round
	static sound[64], iRand, duration
	
	if (g_nemround) // Nemesis Mode
	{
		iRand = random_num(0, ArraySize(sound_ambience2) - 1)
		ArrayGetString(sound_ambience2, iRand, sound, charsmax(sound))
		duration = ArrayGetCell(sound_ambience2_duration, iRand)
	}
	if (g_assaround) // Assassin Mode
	{
		iRand = random_num(0, ArraySize(sound_ambience6) - 1)
		ArrayGetString(sound_ambience6, iRand, sound, charsmax(sound))
		duration = ArrayGetCell(sound_ambience6_duration, iRand)
	}
	else if (g_survround) // Survivor Mode
	{
		iRand = random_num(0, ArraySize(sound_ambience3) - 1)
		ArrayGetString(sound_ambience3, iRand, sound, charsmax(sound))
		duration = ArrayGetCell(sound_ambience3_duration, iRand)
	}
	else if (g_sniround) // Sniper Mode
	{
		iRand = random_num(0, ArraySize(sound_ambience7) - 1)
		ArrayGetString(sound_ambience7, iRand, sound, charsmax(sound))
		duration = ArrayGetCell(sound_ambience7_duration, iRand)
	}
	else if (g_swarmround) // Swarm Mode
	{
		iRand = random_num(0, ArraySize(sound_ambience4) - 1)
		ArrayGetString(sound_ambience4, iRand, sound, charsmax(sound))
		duration = ArrayGetCell(sound_ambience4_duration, iRand)
	}
	else if (g_plagueround) // Plague Mode
	{
		iRand = random_num(0, ArraySize(sound_ambience5) - 1)
		ArrayGetString(sound_ambience5, iRand, sound, charsmax(sound))
		duration = ArrayGetCell(sound_ambience5_duration, iRand)
	}
	else if (g_armageround) // Armageddon Mode
	{
		iRand = random_num(0, ArraySize(sound_ambience8) - 1)
		ArrayGetString(sound_ambience8, iRand, sound, charsmax(sound))
		duration = ArrayGetCell(sound_ambience8_duration, iRand)
	}
	else if (g_apocround) // Apocalypse Mode
	{
		iRand = random_num(0, ArraySize(sound_ambience9) - 1)
		ArrayGetString(sound_ambience9, iRand, sound, charsmax(sound))
		duration = ArrayGetCell(sound_ambience9_duration, iRand)
	}
	else if (g_nightround) // Nightmare Mode
	{
		iRand = random_num(0, ArraySize(sound_ambience10) - 1)
		ArrayGetString(sound_ambience10, iRand, sound, charsmax(sound))
		duration = ArrayGetCell(sound_ambience10_duration, iRand)
	}
	else // Infection Mode
	{
		iRand = random_num(0, ArraySize(sound_ambience1) - 1)
		ArrayGetString(sound_ambience1, iRand, sound, charsmax(sound))
		duration = ArrayGetCell(sound_ambience1_duration, iRand)
	}
	
	// Play it on clients
	PlaySound(sound)
	
	// Set the task for when the sound is done playing
	set_task(float(duration), "ambience_sound_effects", TASK_AMBIENCESOUNDS)
}

// Ambience Sounds Stop Task
ambience_sound_stop()
{
	client_cmd(0, "mp3 stop; stopsound")
}

// Flashlight Charge Task
public flashlight_charge(taskid)
{
	// Drain or charge?
	if (g_flashlight[ID_CHARGE])
		g_flashbattery[ID_CHARGE] -= get_pcvar_num(cvar_flashdrain)
	else
		g_flashbattery[ID_CHARGE] += get_pcvar_num(cvar_flashcharge)
	
	// Battery fully charged
	if (g_flashbattery[ID_CHARGE] >= 100)
	{
		// Don't exceed 100%
		g_flashbattery[ID_CHARGE] = 100
		
		// Update flashlight battery on HUD
		message_begin(MSG_ONE, g_msgFlashBat, _, ID_CHARGE)
		write_byte(100) // battery
		message_end()
		
		// Task not needed anymore
		remove_task(taskid);
		return;
	}
	
	// Battery depleted
	if (g_flashbattery[ID_CHARGE] <= 0)
	{
		// Turn it off
		g_flashlight[ID_CHARGE] = false
		g_flashbattery[ID_CHARGE] = 0
		
		// Play flashlight toggle sound
		emit_sound(ID_CHARGE, CHAN_ITEM, sound_flashlight, 1.0, ATTN_NORM, 0, PITCH_NORM)
		
		// Update flashlight status on HUD
		message_begin(MSG_ONE, g_msgFlashlight, _, ID_CHARGE)
		write_byte(0) // toggle
		write_byte(0) // battery
		message_end()
		
		// Remove flashlight task for this player
		remove_task(ID_CHARGE+TASK_FLASH)
	}
	else
	{
		// Update flashlight battery on HUD
		message_begin(MSG_ONE_UNRELIABLE, g_msgFlashBat, _, ID_CHARGE)
		write_byte(g_flashbattery[ID_CHARGE]) // battery
		message_end()
	}
}

// Remove Spawn Protection Task
public remove_spawn_protection(taskid)
{
	// Not alive
	if (!g_isalive[ID_SPAWN])
		return;
	
	// Remove spawn protection
	g_nodamage[ID_SPAWN] = false
	set_pev(ID_SPAWN, pev_effects, pev(ID_SPAWN, pev_effects) & ~EF_NODRAW)
}

// Hide Player's Money Task
public task_hide_money(taskid)
{
	// Not alive
	if (!g_isalive[ID_SPAWN])
		return;
	
	// Hide money
	message_begin(MSG_ONE, g_msgHideWeapon, _, ID_SPAWN)
	write_byte(HIDE_MONEY) // what to hide bitsum
	message_end()
	
	// Hide the HL crosshair that's drawn
	message_begin(MSG_ONE, g_msgCrosshair, _, ID_SPAWN)
	write_byte(0) // toggle
	message_end()
}

// Turn Off Flashlight and Restore Batteries
turn_off_flashlight(id)
{
	// Restore batteries for the next use
	fm_cs_set_user_batteries(id, 100)
	
	// Check if flashlight is on
	if (pev(id, pev_effects) & EF_DIMLIGHT)
	{
		// Turn it off
		set_pev(id, pev_impulse, IMPULSE_FLASHLIGHT)
	}
	else
	{
		// Clear any stored flashlight impulse (bugfix)
		set_pev(id, pev_impulse, 0)
	}
	
	// Turn off custom flashlight
	if (g_cached_customflash)
	{
		// Turn it off
		g_flashlight[id] = false
		g_flashbattery[id] = 100
		
		// Update flashlight HUD
		message_begin(MSG_ONE, g_msgFlashlight, _, id)
		write_byte(0) // toggle
		write_byte(100) // battery
		message_end()
		
		// Remove previous tasks
		remove_task(id+TASK_CHARGE)
		remove_task(id+TASK_FLASH)
	}
}

// Infection Bomb Explosion
infection_explode(ent)
{
	// Round ended (bugfix)
	if (g_endround) return;
	
	// Get origin
	static Float:originF[3]
	pev(ent, pev_origin, originF)
	
	// Make the explosion
	create_blast(originF)
	
	// Infection nade explode sound
	static sound[64]
	ArrayGetString(grenade_infect, random_num(0, ArraySize(grenade_infect) - 1), sound, charsmax(sound))
	emit_sound(ent, CHAN_WEAPON, sound, 1.0, ATTN_NORM, 0, PITCH_NORM)
	
	// Get attacker
	static attacker
	attacker = pev(ent, pev_owner)
	
	// Infection bomb owner disconnected? (bugfix)
	if (!is_user_valid_connected(attacker))
	{
		// Get rid of the grenade
		engfunc(EngFunc_RemoveEntity, ent)
		return;
	}
	
	// Collisions
	static victim
	victim = -1
	
	while ((victim = engfunc(EngFunc_FindEntityInSphere, victim, originF, NADE_EXPLOSION_RADIUS)) != 0)
	{
		// Only effect alive non-spawnprotected humans
		if (!is_user_valid_alive(victim) || g_zombie[victim] || g_nodamage[victim])
			continue;
		
		// Last human is killed
		if (fnGetHumans() == 1)
		{
			ExecuteHamB(Ham_Killed, victim, attacker, 0)
			continue;
		}
		
		// Infected victim's sound
		ArrayGetString(grenade_infect_player, random_num(0, ArraySize(grenade_infect_player) - 1), sound, charsmax(sound))
		emit_sound(victim, CHAN_VOICE, sound, 1.0, ATTN_NORM, 0, PITCH_NORM)
		
		// Turn into zombie
		zombieme(victim, attacker, 0, 0, 1, 1)
	}
	
	// Get rid of the grenade
	engfunc(EngFunc_RemoveEntity, ent)
}

// Fire Grenade Explosion
fire_explode(ent)
{
	// Get origin
	static Float:originF[3]
	pev(ent, pev_origin, originF)
	
	// Make the explosion
	create_blast2(originF)
	
	// Fire nade explode sound
	static sound[64]
	ArrayGetString(grenade_fire, random_num(0, ArraySize(grenade_fire) - 1), sound, charsmax(sound))
	emit_sound(ent, CHAN_WEAPON, sound, 1.0, ATTN_NORM, 0, PITCH_NORM)
	
	// Collisions
	static victim
	victim = -1
	
	while ((victim = engfunc(EngFunc_FindEntityInSphere, victim, originF, NADE_EXPLOSION_RADIUS)) != 0)
	{
		// Only effect alive zombies
		if (!is_user_valid_alive(victim) || !g_zombie[victim] || g_nodamage[victim])
			continue;
		
		// Heat icon?
		if (get_pcvar_num(cvar_hudicons))
		{
			message_begin(MSG_ONE_UNRELIABLE, g_msgDamage, _, victim)
			write_byte(0) // damage save
			write_byte(0) // damage take
			write_long(DMG_BURN) // damage type
			write_coord(0) // x
			write_coord(0) // y
			write_coord(0) // z
			message_end()
		}
		
		if (g_nemesis[victim] || g_assassin[victim]) // fire duration (nemesis is fire resistant)
			g_burning_duration[victim] += get_pcvar_num(cvar_fireduration)
		else
			g_burning_duration[victim] += get_pcvar_num(cvar_fireduration) * 5
		
		// Set burning task on victim if not present
		if (!task_exists(victim+TASK_BURN))
			set_task(0.2, "burning_flame", victim+TASK_BURN, _, _, "b")
	}
	
	// Get rid of the grenade
	engfunc(EngFunc_RemoveEntity, ent)
}

// Frost Grenade Explosion
frost_explode(ent)
{
	// Get origin
	static Float:originF[3]
	pev(ent, pev_origin, originF)
	
	// Make the explosion
	create_blast3(originF)
	
	// Frost nade explode sound
	static sound[64]
	ArrayGetString(grenade_frost, random_num(0, ArraySize(grenade_frost) - 1), sound, charsmax(sound))
	emit_sound(ent, CHAN_WEAPON, sound, 1.0, ATTN_NORM, 0, PITCH_NORM)
	
	// Collisions
	static victim
	victim = -1
	
	while ((victim = engfunc(EngFunc_FindEntityInSphere, victim, originF, NADE_EXPLOSION_RADIUS)) != 0)
	{
		// Only effect alive unfrozen zombies
		if (!is_user_valid_alive(victim) || !g_zombie[victim] || g_frozen[victim] || g_nodamage[victim])
			continue;
		
		// Nemesis shouldn't be frozen
		if (g_nemesis[victim] || g_assassin[victim])
		{
			// Get player's origin
			static origin2[3]
			get_user_origin(victim, origin2)
			
			// Broken glass sound
			ArrayGetString(grenade_frost_break, random_num(0, ArraySize(grenade_frost_break) - 1), sound, charsmax(sound))
			emit_sound(victim, CHAN_BODY, sound, 1.0, ATTN_NORM, 0, PITCH_NORM)
			
			// Glass shatter
			message_begin(MSG_PVS, SVC_TEMPENTITY, origin2)
			write_byte(TE_BREAKMODEL) // TE id
			write_coord(origin2[0]) // x
			write_coord(origin2[1]) // y
			write_coord(origin2[2]+24) // z
			write_coord(16) // size x
			write_coord(16) // size y
			write_coord(16) // size z
			write_coord(random_num(-50, 50)) // velocity x
			write_coord(random_num(-50, 50)) // velocity y
			write_coord(25) // velocity z
			write_byte(10) // random velocity
			write_short(g_glassSpr) // model
			write_byte(10) // count
			write_byte(25) // life
			write_byte(BREAK_GLASS) // flags
			message_end()
			
			continue;
		}
		
		// Freeze icon?
		if (get_pcvar_num(cvar_hudicons))
		{
			message_begin(MSG_ONE_UNRELIABLE, g_msgDamage, _, victim)
			write_byte(0) // damage save
			write_byte(0) // damage take
			write_long(DMG_DROWN) // damage type - DMG_FREEZE
			write_coord(0) // x
			write_coord(0) // y
			write_coord(0) // z
			message_end()
		}
		
		// Light blue glow while frozen
		if (g_handle_models_on_separate_ent)
			fm_set_rendering(g_ent_playermodel[victim], kRenderFxGlowShell, 0, 100, 200, kRenderNormal, 25)
		else
			fm_set_rendering(victim, kRenderFxGlowShell, 0, 100, 200, kRenderNormal, 25)
		
		// Freeze sound
		ArrayGetString(grenade_frost_player, random_num(0, ArraySize(grenade_frost_player) - 1), sound, charsmax(sound))
		emit_sound(victim, CHAN_BODY, sound, 1.0, ATTN_NORM, 0, PITCH_NORM)
		
		// Add a blue tint to their screen
		message_begin(MSG_ONE, g_msgScreenFade, _, victim)
		write_short(0) // duration
		write_short(0) // hold time
		write_short(FFADE_STAYOUT) // fade type
		write_byte(0) // red
		write_byte(50) // green
		write_byte(200) // blue
		write_byte(100) // alpha
		message_end()
		
		// Set the frozen flag
		g_frozen[victim] = true
		
		// Save player's old gravity (bugfix)
		pev(victim, pev_gravity, g_frozen_gravity[victim])
		
		// Prevent from jumping
		if (pev(victim, pev_flags) & FL_ONGROUND)
			set_pev(victim, pev_gravity, 999999.9) // set really high
		else
			set_pev(victim, pev_gravity, 0.000001) // no gravity
		
		// Prevent from moving
		ExecuteHamB(Ham_Player_ResetMaxSpeed, victim)
		
		// Set a task to remove the freeze
		set_task(get_pcvar_float(cvar_freezeduration), "remove_freeze", victim)
	}
	
	// Get rid of the grenade
	engfunc(EngFunc_RemoveEntity, ent)
}

// Remove freeze task
public remove_freeze(id)
{
	// Not alive or not frozen anymore
	if (!g_isalive[id] || !g_frozen[id])
		return;
	
	// Unfreeze
	g_frozen[id] = false;
	
	// Restore gravity and maxspeed (bugfix)
	set_pev(id, pev_gravity, g_frozen_gravity[id])
	ExecuteHamB(Ham_Player_ResetMaxSpeed, id)
	
	// Restore rendering
	if (g_handle_models_on_separate_ent)
	{
		// Nemesis or Survivor glow / remove glow on player model entity
		if (g_nemesis[id] && get_pcvar_num(cvar_nemglow))
			fm_set_rendering(g_ent_playermodel[id], kRenderFxGlowShell, 250, 0, 0, kRenderNormal, 25)
		else if (g_nemesis[id] && !(get_pcvar_num(cvar_nemglow)))
			fm_set_rendering(g_ent_playermodel[id], kRenderFxGlowShell, 0, 0, 0, kRenderNormal, 25)
		else if (g_assassin[id] && get_pcvar_num(cvar_assaglow))
			fm_set_rendering(g_ent_playermodel[id], kRenderFxGlowShell, 255, 255, 0, kRenderNormal, 25)
		else if (g_survivor[id] && get_pcvar_num(cvar_survglow))
			fm_set_rendering(g_ent_playermodel[id], kRenderFxGlowShell, 0, 0, 255, kRenderNormal, 25)
		else if (g_sniper[id] && get_pcvar_num(cvar_sniglow))
			fm_set_rendering(g_ent_playermodel[id], kRenderFxGlowShell, 0, 255, 0, kRenderNormal, 25)
		else
			fm_set_rendering(g_ent_playermodel[id])
	}
	else
	{
		// Nemesis or Survivor glow / remove glow
		if (g_nemesis[id] && get_pcvar_num(cvar_nemglow))
			fm_set_rendering(id, kRenderFxGlowShell, 250, 0, 0, kRenderNormal, 25)
		else if (g_nemesis[id] && !(get_pcvar_num(cvar_nemglow)))
			fm_set_rendering(id, kRenderFxGlowShell, 0, 0, 0, kRenderNormal, 25)
		else if (g_assassin[id] && get_pcvar_num(cvar_assaglow))
			fm_set_rendering(id, kRenderFxGlowShell, 255, 255, 0, kRenderNormal, 25)
		else if (g_survivor[id] && get_pcvar_num(cvar_survglow))
			fm_set_rendering(id, kRenderFxGlowShell, 0, 0, 255, kRenderNormal, 25)
		else if (g_sniper[id] && get_pcvar_num(cvar_sniglow))
			fm_set_rendering(id, kRenderFxGlowShell, 0, 255, 0, kRenderNormal, 25)
		else
			fm_set_rendering(id)
	}
	
	// Gradually remove screen's blue tint
	message_begin(MSG_ONE, g_msgScreenFade, _, id)
	write_short(UNIT_SECOND) // duration
	write_short(0) // hold time
	write_short(FFADE_IN) // fade type
	write_byte(0) // red
	write_byte(50) // green
	write_byte(200) // blue
	write_byte(100) // alpha
	message_end()
	
	// Broken glass sound
	static sound[64]
	ArrayGetString(grenade_frost_break, random_num(0, ArraySize(grenade_frost_break) - 1), sound, charsmax(sound))
	emit_sound(id, CHAN_BODY, sound, 1.0, ATTN_NORM, 0, PITCH_NORM)
	
	// Get player's origin
	static origin2[3]
	get_user_origin(id, origin2)
	
	// Glass shatter
	message_begin(MSG_PVS, SVC_TEMPENTITY, origin2)
	write_byte(TE_BREAKMODEL) // TE id
	write_coord(origin2[0]) // x
	write_coord(origin2[1]) // y
	write_coord(origin2[2]+24) // z
	write_coord(16) // size x
	write_coord(16) // size y
	write_coord(16) // size z
	write_coord(random_num(-50, 50)) // velocity x
	write_coord(random_num(-50, 50)) // velocity y
	write_coord(25) // velocity z
	write_byte(10) // random velocity
	write_short(g_glassSpr) // model
	write_byte(10) // count
	write_byte(25) // life
	write_byte(BREAK_GLASS) // flags
	message_end()
	
	ExecuteForward(g_fwUserUnfrozen, g_fwDummyResult, id);
}

// Remove Stuff Task
public remove_stuff()
{
	static ent
	
	// Remove rotating doors
	if (get_pcvar_num(cvar_removedoors) > 0)
	{
		ent = -1;
		while ((ent = engfunc(EngFunc_FindEntityByString, ent, "classname", "func_door_rotating")) != 0)
			engfunc(EngFunc_SetOrigin, ent, Float:{8192.0 ,8192.0 ,8192.0})
	}
	
	// Remove all doors
	if (get_pcvar_num(cvar_removedoors) > 1)
	{
		ent = -1;
		while ((ent = engfunc(EngFunc_FindEntityByString, ent, "classname", "func_door")) != 0)
			engfunc(EngFunc_SetOrigin, ent, Float:{8192.0 ,8192.0 ,8192.0})
	}
	
	// Triggered lights
	if (!get_pcvar_num(cvar_triggered))
	{
		ent = -1
		while ((ent = engfunc(EngFunc_FindEntityByString, ent, "classname", "light")) != 0)
		{
			dllfunc(DLLFunc_Use, ent, 0); // turn off the light
			set_pev(ent, pev_targetname, 0) // prevent it from being triggered
		}
	}
}

// Set Custom Weapon Models
replace_weapon_models(id, weaponid)
{
	switch (weaponid)
	{
		case CSW_KNIFE: // Custom knife models
		{
			if (g_zombie[id])
			{
				if (g_nemesis[id]) // Nemesis
				{
					set_pev(id, pev_viewmodel2, model_vknife_nemesis)
					set_pev(id, pev_weaponmodel2, "")
				}
				else if (g_assassin[id]) // Assassins
				{
					set_pev(id, pev_viewmodel2, model_vknife_assassin)
					set_pev(id, pev_weaponmodel2, "")
				}
				else // Zombies
				{
					// Admin knife models?
					if (get_pcvar_num(cvar_adminknifemodelszombie) && get_user_flags(id) & g_access_flag[ACCESS_ADMIN_MODELS])
					{
						set_pev(id, pev_viewmodel2, model_vknife_admin_zombie)
						set_pev(id, pev_weaponmodel2, "")
					}
					else
					{
						static clawmodel[100]
						ArrayGetString(g_zclass_clawmodel, g_zombieclass[id], clawmodel, charsmax(clawmodel))
						format(clawmodel, charsmax(clawmodel), "models/zombie_plague/%s", clawmodel)
						set_pev(id, pev_viewmodel2, clawmodel)
						set_pev(id, pev_weaponmodel2, "")
					}
				}
			}
			else // Humans
			{
				// Admin knife models?
				if (get_pcvar_num(cvar_adminknifemodelshuman) && get_user_flags(id) & g_access_flag[ACCESS_ADMIN_MODELS])
				{
					set_pev(id, pev_viewmodel2, model_vknife_admin_human)
					set_pev(id, pev_weaponmodel2, "models/p_knife.mdl")
				}
				else
				{
					set_pev(id, pev_viewmodel2, model_vknife_human)
					set_pev(id, pev_weaponmodel2, "models/p_knife.mdl")
				}
			}
		}
		case CSW_AWP: // Sniper's AWP
		{
			if (g_sniper[id])
                        {
			        set_pev(id, pev_viewmodel2, model_vawp_sniper)
                                set_pev(id, pev_weaponmodel2, model_pawp_sniper)
                        }
		}     
		case CSW_HEGRENADE: // Infection bomb or fire grenade
		{
			if (g_zombie[id])
				set_pev(id, pev_viewmodel2, model_grenade_infect)
			else
				set_pev(id, pev_viewmodel2, model_grenade_fire)
		}
		case CSW_FLASHBANG: // Frost grenade
		{
			set_pev(id, pev_viewmodel2, model_grenade_frost)
		}
		case CSW_SMOKEGRENADE: // Flare grenade
		{
			set_pev(id, pev_viewmodel2, model_grenade_flare)
		}
	}
	
	// Update model on weaponmodel ent
	if (g_handle_models_on_separate_ent) fm_set_weaponmodel_ent(id)
}

// Reset Player Vars
reset_vars(id, resetall)
{
	g_zombie[id] = false
	g_nemesis[id] = false
	g_assassin[id] = false
	g_survivor[id] = false
	g_sniper[id] = false
	g_firstzombie[id] = false
	g_lastzombie[id] = false
	g_lasthuman[id] = false
	g_frozen[id] = false
	g_nodamage[id] = false
	g_respawn_as_zombie[id] = false
	g_nvision[id] = false
	g_nvisionenabled[id] = false
	g_flashlight[id] = false
	g_flashbattery[id] = 100
	g_canbuy[id] = true
	g_burning_duration[id] = 0
	
	if (resetall)
	{
		g_ammopacks[id] = get_pcvar_num(cvar_startammopacks)
		g_zombieclass[id] = ZCLASS_NONE
		g_zombieclassnext[id] = ZCLASS_NONE
		g_damagedealt_human[id] = 0
		g_damagedealt_zombie[id] = 0
		WPN_AUTO_ON = 0
		WPN_STARTID = 0
		PL_ACTION = 0
		MENU_PAGE_ZCLASS = 0
		MENU_PAGE_EXTRAS = 0
		MENU_PAGE_PLAYERS = 0
	}
}

// Set spectators nightvision
public spec_nvision(id)
{
	// Not connected, alive, or bot
	if (!g_isconnected[id] || g_isalive[id] || g_isbot[id])
		return;
	
	// Give Night Vision?
	if (get_pcvar_num(cvar_nvggive))
	{
		g_nvision[id] = true
		
		// Turn on Night Vision automatically?
		if (get_pcvar_num(cvar_nvggive) == 1)
		{
			g_nvisionenabled[id] = true
			
			// Custom nvg?
			if (get_pcvar_num(cvar_customnvg))
			{
				remove_task(id+TASK_NVISION)
				set_task(0.1, "set_user_nvision", id+TASK_NVISION, _, _, "b")
			}
			else
				set_user_gnvision(id, 1)
		}
	}
}

// Show HUD Task
public ShowHUD(taskid)
{
	static id
	id = ID_SHOWHUD;
	
	// Player died?
	if (!g_isalive[id])
	{
		// Get spectating target
		id = pev(id, PEV_SPEC_TARGET)
		
		// Target not alive
		if (!g_isalive[id]) return;
	}
	
	// Format classname
	static class[32], red, green, blue
	
	if (g_zombie[id]) // zombies
	{
		red = 200
		green = 250
		blue = 0
		
		if (g_nemesis[id])
			formatex(class, charsmax(class), "%L", ID_SHOWHUD, "CLASS_NEMESIS")
		else if (g_assassin[id])
			formatex(class, charsmax(class), "%L", ID_SHOWHUD, "CLASS_ASSASSIN")
		else
			copy(class, charsmax(class), g_zombie_classname[id])
	}
	else // humans
	{
		red = 20
		green = 135
		blue = 255
		
		if (g_survivor[id])
			formatex(class, charsmax(class), "%L", ID_SHOWHUD, "CLASS_SURVIVOR")
		else if (g_sniper[id])
			formatex(class, charsmax(class), "%L", ID_SHOWHUD, "CLASS_SNIPER")
		else
			formatex(class, charsmax(class), "%L", ID_SHOWHUD, "CLASS_HUMAN")
	}
	
	// Spectating someone else?
	if (id != ID_SHOWHUD)
	{
		// Show name, health, class, and ammo packs
		set_hudmessage(20, 184, 62, HUD_SPECT_X, HUD_SPECT_Y, 0, 6.0, 1.1, 0.0, 0.0, -1)
		ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync2, "%L %s^nHP: %d - %L %s - %L %d - Armor: %d", ID_SHOWHUD, "SPECTATING", g_playername[id], pev(id, pev_health), ID_SHOWHUD, "CLASS_CLASS", class, ID_SHOWHUD, "AMMO_PACKS1", g_ammopacks[id], pev(id, pev_armorvalue))
	}
	else
	{
		// Show health, class and ammo packs
		set_hudmessage(red, green, blue, HUD_STATS_X, HUD_STATS_Y, 0, 6.0, 1.1, 0.0, 0.0, -1)
		ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync2, "%L: %d - %L %s - %L %d - %L %d", id, "ZOMBIE_ATTRIB1", pev(ID_SHOWHUD, pev_health), ID_SHOWHUD, "CLASS_CLASS", class, ID_SHOWHUD, "AMMO_PACKS1", g_ammopacks[ID_SHOWHUD], ID_SHOWHUD, "ARMOR", pev(ID_SHOWHUD, pev_armorvalue))
	}
}

// Play idle zombie sounds
public zombie_play_idle(taskid)
{
	// Round ended/new one starting
	if (g_endround || g_newround)
		return;
	
	static sound[64]
	
	// Last zombie?
	if (g_lastzombie[ID_BLOOD])
	{
		ArrayGetString(zombie_idle_last, random_num(0, ArraySize(zombie_idle_last) - 1), sound, charsmax(sound))
		emit_sound(ID_BLOOD, CHAN_VOICE, sound, 1.0, ATTN_NORM, 0, PITCH_NORM)
	}
	else
	{
		ArrayGetString(zombie_idle, random_num(0, ArraySize(zombie_idle) - 1), sound, charsmax(sound))
		emit_sound(ID_BLOOD, CHAN_VOICE, sound, 1.0, ATTN_NORM, 0, PITCH_NORM)
	}
}

// Madness Over Task
public madness_over(taskid)
{
	g_nodamage[ID_BLOOD] = false
}

// Place user at a random spawn
do_random_spawn(id, regularspawns = 0)
{
	static hull, sp_index, i
	
	// Get whether the player is crouching
	hull = (pev(id, pev_flags) & FL_DUCKING) ? HULL_HEAD : HULL_HUMAN
	
	// Use regular spawns?
	if (!regularspawns)
	{
		// No spawns?
		if (!g_spawnCount)
			return;
		
		// Choose random spawn to start looping at
		sp_index = random_num(0, g_spawnCount - 1)
		
		// Try to find a clear spawn
		for (i = sp_index + 1; /*no condition*/; i++)
		{
			// Start over when we reach the end
			if (i >= g_spawnCount) i = 0
			
			// Free spawn space?
			if (is_hull_vacant(g_spawns[i], hull))
			{
				// Engfunc_SetOrigin is used so ent's mins and maxs get updated instantly
				engfunc(EngFunc_SetOrigin, id, g_spawns[i])
				break;
			}
			
			// Loop completed, no free space found
			if (i == sp_index) break;
		}
	}
	else
	{
		// No spawns?
		if (!g_spawnCount2)
			return;
		
		// Choose random spawn to start looping at
		sp_index = random_num(0, g_spawnCount2 - 1)
		
		// Try to find a clear spawn
		for (i = sp_index + 1; /*no condition*/; i++)
		{
			// Start over when we reach the end
			if (i >= g_spawnCount2) i = 0
			
			// Free spawn space?
			if (is_hull_vacant(g_spawns2[i], hull))
			{
				// Engfunc_SetOrigin is used so ent's mins and maxs get updated instantly
				engfunc(EngFunc_SetOrigin, id, g_spawns2[i])
				break;
			}
			
			// Loop completed, no free space found
			if (i == sp_index) break;
		}
	}
}

// Get Zombies -returns alive zombies number-
fnGetZombies()
{
	static iZombies, id
	iZombies = 0
	
	for (id = 1; id <= g_maxplayers; id++)
	{
		if (g_isalive[id] && g_zombie[id])
			iZombies++
	}
	
	return iZombies;
}

// Get Humans -returns alive humans number-
fnGetHumans()
{
	static iHumans, id
	iHumans = 0
	
	for (id = 1; id <= g_maxplayers; id++)
	{
		if (g_isalive[id] && !g_zombie[id])
			iHumans++
	}
	
	return iHumans;
}

// Get Nemesis -returns alive nemesis number-
fnGetNemesis()
{
	static iNemesis, id
	iNemesis = 0
	
	for (id = 1; id <= g_maxplayers; id++)
	{
		if (g_isalive[id] && g_nemesis[id])
			iNemesis++
	}
	
	return iNemesis;
}

// Get Assassin -returns alive assassin number-
fnGetAssassin()
{
	static iAssassin, id
	iAssassin = 0
	
	for (id = 1; id <= g_maxplayers; id++)
	{
		if (g_isalive[id] && g_assassin[id])
			iAssassin++
	}
	
	return iAssassin;
}

// Get Survivors -returns alive survivors number-
fnGetSurvivors()
{
	static iSurvivors, id
	iSurvivors = 0
	
	for (id = 1; id <= g_maxplayers; id++)
	{
		if (g_isalive[id] && g_survivor[id])
			iSurvivors++
	}
	
	return iSurvivors;
}

// Get Snipers -returns alive snipers number-
fnGetSnipers()
{
	static iSnipers, id
	iSnipers = 0
	
	for (id = 1; id <= g_maxplayers; id++)
	{
		if (g_isalive[id] && g_sniper[id])
			iSnipers++
	}
	
	return iSnipers;
}

// Get Alive -returns alive players number-
fnGetAlive()
{
	static iAlive, id
	iAlive = 0
	
	for (id = 1; id <= g_maxplayers; id++)
	{
		if (g_isalive[id])
			iAlive++
	}
	
	return iAlive;
}

// Get Random Alive -returns index of alive player number n -
fnGetRandomAlive(n)
{
	static iAlive, id
	iAlive = 0
	
	for (id = 1; id <= g_maxplayers; id++)
	{
		if (g_isalive[id])
			iAlive++
		
		if (iAlive == n)
			return id;
	}
	
	return -1;
}

// Get Playing -returns number of users playing-
fnGetPlaying()
{
	static iPlaying, id, team
	iPlaying = 0
	
	for (id = 1; id <= g_maxplayers; id++)
	{
		if (g_isconnected[id])
		{
			team = fm_cs_get_user_team(id)
			
			if (team != FM_CS_TEAM_SPECTATOR && team != FM_CS_TEAM_UNASSIGNED)
				iPlaying++
		}
	}
	
	return iPlaying;
}

// Get CTs -returns number of CTs connected-
fnGetCTs()
{
	static iCTs, id
	iCTs = 0
	
	for (id = 1; id <= g_maxplayers; id++)
	{
		if (g_isconnected[id])
		{			
			if (fm_cs_get_user_team(id) == FM_CS_TEAM_CT)
				iCTs++
		}
	}
	
	return iCTs;
}

// Get Ts -returns number of Ts connected-
fnGetTs()
{
	static iTs, id
	iTs = 0
	
	for (id = 1; id <= g_maxplayers; id++)
	{
		if (g_isconnected[id])
		{			
			if (fm_cs_get_user_team(id) == FM_CS_TEAM_T)
				iTs++
		}
	}
	
	return iTs;
}

// Get Alive CTs -returns number of CTs alive-
fnGetAliveCTs()
{
	static iCTs, id
	iCTs = 0
	
	for (id = 1; id <= g_maxplayers; id++)
	{
		if (g_isalive[id])
		{			
			if (fm_cs_get_user_team(id) == FM_CS_TEAM_CT)
				iCTs++
		}
	}
	
	return iCTs;
}

// Get Alive Ts -returns number of Ts alive-
fnGetAliveTs()
{
	static iTs, id
	iTs = 0
	
	for (id = 1; id <= g_maxplayers; id++)
	{
		if (g_isalive[id])
		{			
			if (fm_cs_get_user_team(id) == FM_CS_TEAM_T)
				iTs++
		}
	}
	
	return iTs;
}

// Last Zombie Check -check for last zombie and set its flag-
fnCheckLastZombie()
{
	static id
	for (id = 1; id <= g_maxplayers; id++)
	{
		// Last zombie
		if (g_isalive[id] && g_zombie[id] && !g_nemesis[id] && !g_assassin[id] && fnGetZombies() == 1)
		{
			if (!g_lastzombie[id])
			{
				// Last zombie forward
				ExecuteForward(g_fwUserLastZombie, g_fwDummyResult, id);
			}
			g_lastzombie[id] = true
		}
		else
			g_lastzombie[id] = false
		
		// Last human
		if (g_isalive[id] && !g_zombie[id] && !g_survivor[id] && !g_sniper[id] && fnGetHumans() == 1)
		{
			if (!g_lasthuman[id])
			{
				// Last human forward
				ExecuteForward(g_fwUserLastHuman, g_fwDummyResult, id);
				
				// Reward extra hp
				fm_set_user_health(id, pev(id, pev_health) + get_pcvar_num(cvar_humanlasthp))
			}
			g_lasthuman[id] = true
		}
		else
			g_lasthuman[id] = false
	}
}

// Save player's stats to database
save_stats(id)
{
	// Check whether there is another record already in that slot
	if (db_name[id][0] && !equal(g_playername[id], db_name[id]))
	{
		// If DB size is exceeded, write over old records
		if (db_slot_i >= sizeof db_name)
			db_slot_i = g_maxplayers+1
		
		// Move previous record onto an additional save slot
		copy(db_name[db_slot_i], charsmax(db_name[]), db_name[id])
		db_ammopacks[db_slot_i] = db_ammopacks[id]
		db_zombieclass[db_slot_i] = db_zombieclass[id]
		db_slot_i++
	}
	
	// Now save the current player stats
	copy(db_name[id], charsmax(db_name[]), g_playername[id]) // name
	db_ammopacks[id] = g_ammopacks[id]  // ammo packs
	db_zombieclass[id] = g_zombieclassnext[id] // zombie class
}

// Load player's stats from database (if a record is found)
load_stats(id)
{
	// Look for a matching record
	static i
	for (i = 0; i < sizeof db_name; i++)
	{
		if (equal(g_playername[id], db_name[i]))
		{
			// Bingo!
			g_ammopacks[id] = db_ammopacks[i]
			g_zombieclass[id] = db_zombieclass[i]
			g_zombieclassnext[id] = db_zombieclass[i]
			return;
		}
	}
}

// Checks if a player is allowed to be zombie
allowed_zombie(id)
{
	if ((g_zombie[id] && !g_nemesis[id] && !g_assassin[id]) || g_endround || !g_isalive[id] || task_exists(TASK_WELCOMEMSG) || (!g_newround && !g_zombie[id] && fnGetHumans() == 1))
		return false;
	
	return true;
}

// Checks if a player is allowed to be human
allowed_human(id)
{
	if ((!g_zombie[id] && !g_survivor[id] && !g_sniper[id]) || g_endround || !g_isalive[id] || task_exists(TASK_WELCOMEMSG) || (!g_newround && g_zombie[id] && fnGetZombies() == 1))
		return false;
	
	return true;
}

// Checks if a player is allowed to be survivor
allowed_survivor(id)
{
	if (g_endround || g_survivor[id] || !g_isalive[id] || task_exists(TASK_WELCOMEMSG) || (!g_newround && g_zombie[id] && fnGetZombies() == 1))
		return false;
	
	return true;
}

// Checks if a player is allowed to be sniper
allowed_sniper(id)
{
	if (g_endround || g_sniper[id] || !g_isalive[id] || task_exists(TASK_WELCOMEMSG) || (!g_newround && g_zombie[id] && fnGetZombies() == 1))
		return false;
	
	return true;
}

// Checks if a player is allowed to be nemesis
allowed_nemesis(id)
{
	if (g_endround || g_nemesis[id] || !g_isalive[id] || task_exists(TASK_WELCOMEMSG) || (!g_newround && !g_zombie[id] && fnGetHumans() == 1))
		return false;
	
	return true;
}

// Checks if a player is allowed to be assassin
allowed_assassin(id)
{
	if (g_endround || g_assassin[id] || !g_isalive[id] || task_exists(TASK_WELCOMEMSG) || (!g_newround && !g_zombie[id] && fnGetHumans() == 1))
		return false;
	
	return true;
}

// Checks if a player is allowed to respawn
allowed_respawn(id)
{
	static team
	team = fm_cs_get_user_team(id)
	
	if (g_endround || team == FM_CS_TEAM_SPECTATOR || team == FM_CS_TEAM_UNASSIGNED || g_isalive[id])
		return false;
	
	return true;
}

// Checks if swarm mode is allowed
allowed_swarm()
{
	if (g_endround || !g_newround || task_exists(TASK_WELCOMEMSG))
		return false;
	
	return true;
}

// Checks if multi infection mode is allowed
allowed_multi()
{
	if (g_endround || !g_newround || task_exists(TASK_WELCOMEMSG) || floatround(fnGetAlive()*get_pcvar_float(cvar_multiratio), floatround_ceil) < 2 || floatround(fnGetAlive()*get_pcvar_float(cvar_multiratio), floatround_ceil) >= fnGetAlive())
		return false;
	
	return true;
}

// Checks if plague mode is allowed
allowed_plague()
{
	if (g_endround || !g_newround || task_exists(TASK_WELCOMEMSG) || floatround((fnGetAlive()-(get_pcvar_num(cvar_plaguenemnum)+get_pcvar_num(cvar_plaguesurvnum)))*get_pcvar_float(cvar_plagueratio), floatround_ceil) < 1
	|| fnGetAlive()-(get_pcvar_num(cvar_plaguesurvnum)+get_pcvar_num(cvar_plaguenemnum)+floatround((fnGetAlive()-(get_pcvar_num(cvar_plaguenemnum)+get_pcvar_num(cvar_plaguesurvnum)))*get_pcvar_float(cvar_plagueratio), floatround_ceil)) < 1)
		return false;
	
	return true;
}

// Checks if armageddon mode is allowed
allowed_armageddon()
{
	if (g_endround || !g_newround || task_exists(TASK_WELCOMEMSG) || floatround(fnGetAlive()*get_pcvar_float(cvar_armageratio), floatround_ceil) < 2 || floatround(fnGetAlive()*get_pcvar_float(cvar_armageratio), floatround_ceil) >= fnGetAlive())
		return false;
	
	return true;
}

// Checks if apocalypse mode is allowed
allowed_apocalypse()
{
	if (g_endround || !g_newround || task_exists(TASK_WELCOMEMSG) || floatround(fnGetAlive()*get_pcvar_float(cvar_apocratio), floatround_ceil) < 2 || floatround(fnGetAlive()*get_pcvar_float(cvar_apocratio), floatround_ceil) >= fnGetAlive())
		return false;
	
	return true;
}

// Checks if nightmare mode is allowed
allowed_nightmare()
{
	if (g_endround || !g_newround || task_exists(TASK_WELCOMEMSG) || floatround(fnGetAlive()*get_pcvar_float(cvar_nightratio), floatround_ceil) < 2 || floatround(fnGetAlive()*get_pcvar_float(cvar_nightratio), floatround_ceil) >= fnGetAlive())
		return false;
	
	return true;
}

// Admin Command. zp_zombie
command_zombie(id, player)
{
	// Show activity?
	switch (get_pcvar_num(cvar_showactivity))
	{
		case 1: client_print(0, print_chat, "ADMIN - %s %L", g_playername[player], LANG_PLAYER, "CMD_INFECT")
		case 2: client_print(0, print_chat, "ADMIN %s - %s %L", g_playername[id], g_playername[player], LANG_PLAYER, "CMD_INFECT")
	}
	
	// Log to Zombie Plague log file?
	if (get_pcvar_num(cvar_logcommands))
	{
		static logdata[100], authid[32], ip[16]
		get_user_authid(id, authid, charsmax(authid))
		get_user_ip(id, ip, charsmax(ip), 1)
		formatex(logdata, charsmax(logdata), "ADMIN %s <%s><%s> - %s %L (Players: %d/%d)", g_playername[id], authid, ip, g_playername[player], LANG_SERVER, "CMD_INFECT", fnGetPlaying(), g_maxplayers)
		log_to_file("zombieplague.log", logdata)
	}
	
	// New round?
	if (g_newround)
	{
		// Set as first zombie
		remove_task(TASK_MAKEZOMBIE)
		make_a_zombie(MODE_INFECTION, player)
	}
	else
	{
		// Just infect
		zombieme(player, 0, 0, 0, 0, 0)
	}
}

// Admin Command. zp_human
command_human(id, player)
{
	// Show activity?
	switch (get_pcvar_num(cvar_showactivity))
	{
		case 1: client_print(0, print_chat, "ADMIN - %s %L", g_playername[player], LANG_PLAYER, "CMD_DISINFECT")
		case 2: client_print(0, print_chat, "ADMIN %s - %s %L", g_playername[id], g_playername[player], LANG_PLAYER, "CMD_DISINFECT")
	}
	
	// Log to Zombie Plague log file?
	if (get_pcvar_num(cvar_logcommands))
	{
		static logdata[100], authid[32], ip[16]
		get_user_authid(id, authid, charsmax(authid))
		get_user_ip(id, ip, charsmax(ip), 1)
		formatex(logdata, charsmax(logdata), "ADMIN %s <%s><%s> - %s %L (Players: %d/%d)", g_playername[id], authid, ip, g_playername[player], LANG_SERVER,"CMD_DISINFECT", fnGetPlaying(), g_maxplayers)
		log_to_file("zombieplague.log", logdata)
	}
	
	// Turn to human
	humanme(player, 0, 0, 0)
}	

// Admin Command. zp_survivor
command_survivor(id, player)
{
	// Show activity?
	switch (get_pcvar_num(cvar_showactivity))
	{
		case 1: client_print(0, print_chat, "ADMIN - %s %L", g_playername[player], LANG_PLAYER, "CMD_SURVIVAL")
		case 2: client_print(0, print_chat, "ADMIN %s - %s %L", g_playername[id], g_playername[player], LANG_PLAYER, "CMD_SURVIVAL")
	}
	
	 // Log to Zombie Plague log file?
	if (get_pcvar_num(cvar_logcommands))
	{
		static logdata[100], authid[32], ip[16]
		get_user_authid(id, authid, charsmax(authid))
		get_user_ip(id, ip, charsmax(ip), 1)
		formatex(logdata, charsmax(logdata), "ADMIN %s <%s><%s> - %s %L (Players: %d/%d)", g_playername[id], authid, ip, g_playername[player], LANG_SERVER,"CMD_SURVIVAL", fnGetPlaying(), g_maxplayers)
		log_to_file("zombieplague.log", logdata)
	}
	
	// New round?
	if (g_newround)
	{
		// Set as first survivor
		remove_task(TASK_MAKEZOMBIE)
		make_a_zombie(MODE_SURVIVOR, player)
	}
	else
	{
		// Turn player into a Survivor
		humanme(player, 1, 0, 0)
	}
}

// Admin Command. zp_sniper
command_sniper(id, player)
{
	// Show activity?
	switch (get_pcvar_num(cvar_showactivity))
	{
		case 1: client_print(0, print_chat, "ADMIN - %s %L", g_playername[player], LANG_PLAYER, "CMD_SNIPER")
		case 2: client_print(0, print_chat, "ADMIN %s - %s %L", g_playername[id], g_playername[player], LANG_PLAYER, "CMD_SNIPER")
	}
	
	 // Log to Zombie Plague log file?
	if (get_pcvar_num(cvar_logcommands))
	{
		static logdata[100], authid[32], ip[16]
		get_user_authid(id, authid, charsmax(authid))
		get_user_ip(id, ip, charsmax(ip), 1)
		formatex(logdata, charsmax(logdata), "ADMIN %s <%s><%s> - %s %L (Players: %d/%d)", g_playername[id], authid, ip, g_playername[player], LANG_SERVER,"CMD_SNIPER", fnGetPlaying(), g_maxplayers)
		log_to_file("zombieplague.log", logdata)
	}
	
	// New round?
	if (g_newround)
	{
		// Set as first sniper
		remove_task(TASK_MAKEZOMBIE)
		make_a_zombie(MODE_SNIPER, player)
	}
	else
	{
		// Turn player into a Sniper
		humanme(player, 0, 1, 0)
	}
}

// Admin Command. zp_nemesis
command_nemesis(id, player)
{
	// Show activity?
	switch (get_pcvar_num(cvar_showactivity))
	{
		case 1: client_print(0, print_chat, "ADMIN - %s %L", g_playername[player], LANG_PLAYER, "CMD_NEMESIS")
		case 2: client_print(0, print_chat, "ADMIN %s - %s %L", g_playername[id], g_playername[player], LANG_PLAYER, "CMD_NEMESIS")
	}
	
	// Log to Zombie Plague log file?
	if (get_pcvar_num(cvar_logcommands))
	{
		static logdata[100], authid[32], ip[16]
		get_user_authid(id, authid, charsmax(authid))
		get_user_ip(id, ip, charsmax(ip), 1)
		formatex(logdata, charsmax(logdata), "ADMIN %s <%s><%s> - %s %L (Players: %d/%d)", g_playername[id], authid, ip, g_playername[player], LANG_SERVER,"CMD_NEMESIS", fnGetPlaying(), g_maxplayers)
		log_to_file("zombieplague.log", logdata)
	}
	
	// New round?
	if (g_newround)
	{
		// Set as first nemesis
		remove_task(TASK_MAKEZOMBIE)
		make_a_zombie(MODE_NEMESIS, player)
	}
	else
	{
		// Turn player into a Nemesis
		zombieme(player, 0, 1, 0, 0, 0)
	}
}

// Admin Command. zp_assassin
command_assassin(id, player)
{
	// Show activity?
	switch (get_pcvar_num(cvar_showactivity))
	{
		case 1: client_print(0, print_chat, "ADMIN - %s %L", g_playername[player], LANG_PLAYER, "CMD_ASSASSIN")
		case 2: client_print(0, print_chat, "ADMIN %s - %s %L", g_playername[id], g_playername[player], LANG_PLAYER, "CMD_ASSASSIN")
	}
	
	// Log to Zombie Plague log file?
	if (get_pcvar_num(cvar_logcommands))
	{
		static logdata[100], authid[32], ip[16]
		get_user_authid(id, authid, charsmax(authid))
		get_user_ip(id, ip, charsmax(ip), 1)
		formatex(logdata, charsmax(logdata), "ADMIN %s <%s><%s> - %s %L (Players: %d/%d)", g_playername[id], authid, ip, g_playername[player], LANG_SERVER,"CMD_ASSASSIN", fnGetPlaying(), g_maxplayers)
		log_to_file("zombieplague.log", logdata)
	}
	
	// New round?
	if (g_newround)
	{
		// Set as first assassin
		remove_task(TASK_MAKEZOMBIE)
		make_a_zombie(MODE_ASSASSIN, player)
	}
	else
	{
		// Turn player into a Assassin
		zombieme(player, 0, 0, 1, 0, 0)
	}
}

// Admin Command. zp_respawn
command_respawn(id, player)
{
	// Show activity?
	switch (get_pcvar_num(cvar_showactivity))
	{
		case 1: client_print(0, print_chat, "ADMIN - %s %L", g_playername[player], LANG_PLAYER, "CMD_RESPAWN")
		case 2: client_print(0, print_chat, "ADMIN %s - %s %L", g_playername[id], g_playername[player], LANG_PLAYER, "CMD_RESPAWN")
	}
	
	// Log to Zombie Plague log file?
	if (get_pcvar_num(cvar_logcommands))
	{
		static logdata[100], authid[32], ip[16]
		get_user_authid(id, authid, charsmax(authid))
		get_user_ip(id, ip, charsmax(ip), 1)
		formatex(logdata, charsmax(logdata), "ADMIN %s <%s><%s> - %s %L (Players: %d/%d)", g_playername[id], authid, ip, g_playername[player], LANG_SERVER, "CMD_RESPAWN", fnGetPlaying(), g_maxplayers)
		log_to_file("zombieplague.log", logdata)
	}
	
	// Respawn as zombie?
	if (get_pcvar_num(cvar_deathmatch) == 2 || (get_pcvar_num(cvar_deathmatch) == 3 && random_num(0, 1)) || (get_pcvar_num(cvar_deathmatch) == 4 && fnGetZombies() < fnGetAlive()/2))
		g_respawn_as_zombie[player] = true
	
	// Override respawn as zombie setting on nemesis and survivor rounds
	if (g_survround) g_respawn_as_zombie[player] = true
	else if (g_nemround) g_respawn_as_zombie[player] = false
	
	respawn_player_manually(player);
}

// Admin Command. zp_swarm
command_swarm(id)
{
	// Show activity?
	switch (get_pcvar_num(cvar_showactivity))
	{
		case 1: client_print(0, print_chat, "ADMIN - %L", LANG_PLAYER, "CMD_SWARM")
		case 2: client_print(0, print_chat, "ADMIN %s - %L", g_playername[id], LANG_PLAYER, "CMD_SWARM")
	}
	
	// Log to Zombie Plague log file?
	if (get_pcvar_num(cvar_logcommands))
	{
		static logdata[100], authid[32], ip[16]
		get_user_authid(id, authid, charsmax(authid))
		get_user_ip(id, ip, charsmax(ip), 1)
		formatex(logdata, charsmax(logdata), "ADMIN %s <%s><%s> - %L (Players: %d/%d)", g_playername[id], authid, ip, LANG_SERVER, "CMD_SWARM", fnGetPlaying(), g_maxplayers)
		log_to_file("zombieplague.log", logdata)
	}
	
	// Call Swarm Mode
	remove_task(TASK_MAKEZOMBIE)
	make_a_zombie(MODE_SWARM, 0)
}

// Admin Command. zp_multi
command_multi(id)
{
	// Show activity?
	switch (get_pcvar_num(cvar_showactivity))
	{
		case 1: client_print(0, print_chat, "ADMIN - %L", LANG_PLAYER, "CMD_MULTI")
		case 2: client_print(0, print_chat, "ADMIN %s - %L", g_playername[id], LANG_PLAYER, "CMD_MULTI")
	}
	
	// Log to Zombie Plague log file?
	if (get_pcvar_num(cvar_logcommands))
	{
		static logdata[100], authid[32], ip[16]
		get_user_authid(id, authid, charsmax(authid))
		get_user_ip(id, ip, charsmax(ip), 1)
		formatex(logdata, charsmax(logdata), "ADMIN %s <%s><%s> - %L (Players: %d/%d)", g_playername[id], authid, ip, LANG_SERVER,"CMD_MULTI", fnGetPlaying(), g_maxplayers)
		log_to_file("zombieplague.log", logdata)
	}
	
	// Call Multi Infection
	remove_task(TASK_MAKEZOMBIE)
	make_a_zombie(MODE_MULTI, 0)
}

// Admin Command. zp_plague
command_plague(id)
{
	// Show activity?
	switch (get_pcvar_num(cvar_showactivity))
	{
		case 1: client_print(0, print_chat, "ADMIN - %L", LANG_PLAYER, "CMD_PLAGUE")
		case 2: client_print(0, print_chat, "ADMIN %s - %L", g_playername[id], LANG_PLAYER, "CMD_PLAGUE")
	}
	
	// Log to Zombie Plague log file?
	if (get_pcvar_num(cvar_logcommands))
	{
		static logdata[100], authid[32], ip[16]
		get_user_authid(id, authid, charsmax(authid))
		get_user_ip(id, ip, charsmax(ip), 1)
		formatex(logdata, charsmax(logdata), "ADMIN %s <%s><%s> - %L (Players: %d/%d)", g_playername[id], authid, ip, LANG_SERVER,"CMD_PLAGUE", fnGetPlaying(), g_maxplayers)
		log_to_file("zombieplague.log", logdata)
	}
	
	// Call Plague Mode
	remove_task(TASK_MAKEZOMBIE)
	make_a_zombie(MODE_PLAGUE, 0)
}

// Admin Command. zp_armageddon
command_armageddon(id)
{
	// Show activity?
	switch (get_pcvar_num(cvar_showactivity))
	{
		case 1: client_print(0, print_chat, "ADMIN - %L", LANG_PLAYER, "CMD_ARMAGEDDON")
		case 2: client_print(0, print_chat, "ADMIN %s - %L", g_playername[id], LANG_PLAYER, "CMD_ARMAGEDDON")
	}
	
	// Log to Zombie Plague log file?
	if (get_pcvar_num(cvar_logcommands))
	{
		static logdata[100], authid[32], ip[16]
		get_user_authid(id, authid, charsmax(authid))
		get_user_ip(id, ip, charsmax(ip), 1)
		formatex(logdata, charsmax(logdata), "ADMIN %s <%s><%s> - %L (Players: %d/%d)", g_playername[id], authid, ip, LANG_SERVER,"CMD_ARMAGEDDON", fnGetPlaying(), g_maxplayers)
		log_to_file("zombieplague.log", logdata)
	}
	
	// Call Armageddon Mode
	remove_task(TASK_MAKEZOMBIE)
	make_a_zombie(MODE_ARMAGEDDON, 0)
}

// Admin Command. zp_apocalypse
command_apocalypse(id)
{
	// Show activity?
	switch (get_pcvar_num(cvar_showactivity))
	{
		case 1: client_print(0, print_chat, "ADMIN - %L", LANG_PLAYER, "CMD_APOCALYPSE")
		case 2: client_print(0, print_chat, "ADMIN %s - %L", g_playername[id], LANG_PLAYER, "CMD_APOCALYPSE")
	}
	
	// Log to Zombie Plague log file?
	if (get_pcvar_num(cvar_logcommands))
	{
		static logdata[100], authid[32], ip[16]
		get_user_authid(id, authid, charsmax(authid))
		get_user_ip(id, ip, charsmax(ip), 1)
		formatex(logdata, charsmax(logdata), "ADMIN %s <%s><%s> - %L (Players: %d/%d)", g_playername[id], authid, ip, LANG_SERVER,"CMD_APOCALYPSE", fnGetPlaying(), g_maxplayers)
		log_to_file("zombieplague.log", logdata)
	}
	
	// Call Apocalypse Mode
	remove_task(TASK_MAKEZOMBIE)
	make_a_zombie(MODE_APOCALYPSE, 0)
}

// Admin Command. zp_nightmare
command_nightmare(id)
{
	// Show activity?
	switch (get_pcvar_num(cvar_showactivity))
	{
		case 1: client_print(0, print_chat, "ADMIN - %L", LANG_PLAYER, "CMD_NIGHTMARE")
		case 2: client_print(0, print_chat, "ADMIN %s - %L", g_playername[id], LANG_PLAYER, "CMD_NIGHTMARE")
	}
	
	// Log to Zombie Plague log file?
	if (get_pcvar_num(cvar_logcommands))
	{
		static logdata[100], authid[32], ip[16]
		get_user_authid(id, authid, charsmax(authid))
		get_user_ip(id, ip, charsmax(ip), 1)
		formatex(logdata, charsmax(logdata), "ADMIN %s <%s><%s> - %L (Players: %d/%d)", g_playername[id], authid, ip, LANG_SERVER,"CMD_NIGHTMARE", fnGetPlaying(), g_maxplayers)
		log_to_file("zombieplague.log", logdata)
	}
	
	// Call Nightmare Mode
	remove_task(TASK_MAKEZOMBIE)
	make_a_zombie(MODE_NIGHTMARE, 0)
}

// Set proper maxspeed for player
set_player_maxspeed(id)
{
	// If frozen, prevent from moving
	if (g_frozen[id])
	{
		set_pev(id, pev_maxspeed, 1.0)
	}
	// Otherwise, set maxspeed directly
	else
	{
		if (g_zombie[id])
		{
			if (g_nemesis[id])
				set_pev(id, pev_maxspeed, get_pcvar_float(cvar_nemspd))
			else if (g_assassin[id])
				set_pev(id, pev_maxspeed, get_pcvar_float(cvar_assaspd))
			else
				set_pev(id, pev_maxspeed, g_zombie_spd[id])
		}
		else
		{
			if (g_survivor[id])
				set_pev(id, pev_maxspeed, get_pcvar_float(cvar_survspd))
			else if (g_sniper[id])
				set_pev(id, pev_maxspeed, get_pcvar_float(cvar_snispd))
			else if (get_pcvar_float(cvar_humanspd) > 0.0)
				set_pev(id, pev_maxspeed, get_pcvar_float(cvar_humanspd))
		}
	}
}

/*================================================================================
 [Custom Natives]
=================================================================================*/

// Native: zp_get_user_zombie
public native_get_user_zombie(id)
{
	if (!is_user_valid(id))
	{
		log_error(AMX_ERR_NATIVE, "[ZP] Invalid Player (%d)", id)
		return -1;
	}
	
	return g_zombie[id];
}

// Native: zp_get_user_nemesis
public native_get_user_nemesis(id)
{
	if (!is_user_valid(id))
	{
		log_error(AMX_ERR_NATIVE, "[ZP] Invalid Player (%d)", id)
		return -1;
	}
	
	return g_nemesis[id];
}

// Native: zp_get_user_assassin
public native_get_user_assassin(id)
{
	if (!is_user_valid(id))
	{
		log_error(AMX_ERR_NATIVE, "[ZP] Invalid Player (%d)", id)
		return -1;
	}
	
	return g_assassin[id];
}

// Native: zp_get_user_survivor
public native_get_user_survivor(id)
{
	if (!is_user_valid(id))
	{
		log_error(AMX_ERR_NATIVE, "[ZP] Invalid Player (%d)", id)
		return -1;
	}
	
	return g_survivor[id];
}

// Native: zp_get_user_sniper
public native_get_user_sniper(id)
{
	if (!is_user_valid(id))
	{
		log_error(AMX_ERR_NATIVE, "[ZP] Invalid Player (%d)", id)
		return -1;
	}
	
	return g_sniper[id];
}

public native_get_user_first_zombie(id)
{
	if (!is_user_valid(id))
	{
		log_error(AMX_ERR_NATIVE, "[ZP] Invalid Player (%d)", id)
		return -1;
	}
	
	return g_firstzombie[id];
}

// Native: zp_get_user_last_zombie
public native_get_user_last_zombie(id)
{
	if (!is_user_valid(id))
	{
		log_error(AMX_ERR_NATIVE, "[ZP] Invalid Player (%d)", id)
		return -1;
	}
	
	return g_lastzombie[id];
}

// Native: zp_get_user_last_human
public native_get_user_last_human(id)
{
	if (!is_user_valid(id))
	{
		log_error(AMX_ERR_NATIVE, "[ZP] Invalid Player (%d)", id)
		return -1;
	}
	
	return g_lasthuman[id];
}

// Native: zp_get_user_zombie_class
public native_get_user_zombie_class(id)
{
	if (!is_user_valid(id))
	{
		log_error(AMX_ERR_NATIVE, "[ZP] Invalid Player (%d)", id)
		return -1;
	}
	
	return g_zombieclass[id];
}

// Native: zp_get_user_next_class
public native_get_user_next_class(id)
{
	if (!is_user_valid(id))
	{
		log_error(AMX_ERR_NATIVE, "[ZP] Invalid Player (%d)", id)
		return -1;
	}
	
	return g_zombieclassnext[id];
}

// Native: zp_set_user_zombie_class
public native_set_user_zombie_class(id, classid)
{
	if (!is_user_valid(id))
	{
		log_error(AMX_ERR_NATIVE, "[ZP] Invalid Player (%d)", id)
		return false;
	}
	
	if (classid < 0 || classid >= g_zclass_i)
	{
		log_error(AMX_ERR_NATIVE, "[ZP] Invalid zombie class id (%d)", classid)
		return false;
	}
	
	g_zombieclassnext[id] = classid
	return true;
}

// Native: zp_get_user_ammo_packs
public native_get_user_ammo_packs(id)
{
	if (!is_user_valid(id))
	{
		log_error(AMX_ERR_NATIVE, "[ZP] Invalid Player (%d)", id)
		return -1;
	}
	
	return g_ammopacks[id];
}

// Native: zp_set_user_ammo_packs
public native_set_user_ammo_packs(id, amount)
{
	if (!is_user_valid(id))
	{
		log_error(AMX_ERR_NATIVE, "[ZP] Invalid Player (%d)", id)
		return false;
	}
	
	g_ammopacks[id] = amount;
	return true;
}

// Native: zp_get_zombie_maxhealth
public native_get_zombie_maxhealth(id)
{
	// ZP disabled
	if (!g_pluginenabled)
		return -1;
	
	if (!is_user_valid(id))
	{
		log_error(AMX_ERR_NATIVE, "[ZP] Invalid Player (%d)", id)
		return -1;
	}
	
	if (!g_zombie[id] || g_nemesis[id])
	{
		log_error(AMX_ERR_NATIVE, "[ZP] Player not a normal zombie (%d)", id)
		return -1;
	}
	
	if (g_firstzombie[id])
		return floatround(float(ArrayGetCell(g_zclass_hp, g_zombieclass[id])) * get_pcvar_float(cvar_zombiefirsthp));
	
	return ArrayGetCell(g_zclass_hp, g_zombieclass[id]);
}

// Native: zp_get_user_batteries
public native_get_user_batteries(id)
{
	if (!is_user_valid(id))
	{
		log_error(AMX_ERR_NATIVE, "[ZP] Invalid Player (%d)", id)
		return -1;
	}
	
	return g_flashbattery[id];
}

// Native: zp_set_user_batteries
public native_set_user_batteries(id, value)
{
	// ZP disabled
	if (!g_pluginenabled)
		return false;
	
	if (!is_user_valid_connected(id))
	{
		log_error(AMX_ERR_NATIVE, "[ZP] Invalid Player (%d)", id)
		return false;
	}
	
	g_flashbattery[id] = clamp(value, 0, 100);
	
	if (g_cached_customflash)
	{
		// Set the flashlight charge task to update battery status
		remove_task(id+TASK_CHARGE)
		set_task(1.0, "flashlight_charge", id+TASK_CHARGE, _, _, "b")
	}
	return true;
}

// Native: zp_get_user_nightvision
public native_get_user_nightvision(id)
{
	if (!is_user_valid(id))
	{
		log_error(AMX_ERR_NATIVE, "[ZP] Invalid Player (%d)", id)
		return -1;
	}
	
	return g_nvision[id];
}

// Native: zp_set_user_nightvision
public native_set_user_nightvision(id, set)
{
	// ZP disabled
	if (!g_pluginenabled)
		return false;
	
	if (!is_user_valid_connected(id))
	{
		log_error(AMX_ERR_NATIVE, "[ZP] Invalid Player (%d)", id)
		return false;
	}
	
	if (set)
	{
		g_nvision[id] = true
		
		if (!g_isbot[id])
		{
			g_nvisionenabled[id] = true
			
			// Custom nvg?
			if (get_pcvar_num(cvar_customnvg))
			{
				remove_task(id+TASK_NVISION)
				set_task(0.1, "set_user_nvision", id+TASK_NVISION, _, _, "b")
			}
			else
				set_user_gnvision(id, 1)
		}
		else
			cs_set_user_nvg(id, 1)
	}
	else
	{
		// Remove CS nightvision if player owns one (bugfix)
		cs_set_user_nvg(id, 0)
		
		if (get_pcvar_num(cvar_customnvg)) remove_task(id+TASK_NVISION)
		else if (g_nvisionenabled[id]) set_user_gnvision(id, 0)
		g_nvision[id] = false
		g_nvisionenabled[id] = false
	}
	return true;
}

// Native: zp_infect_user
public native_infect_user(id, infector, silent, rewards)
{
	// ZP disabled
	if (!g_pluginenabled)
		return false;
	
	if (!is_user_valid_alive(id))
	{
		log_error(AMX_ERR_NATIVE, "[ZP] Invalid Player (%d)", id)
		return false;
	}
	
	// Not allowed to be zombie
	if (!allowed_zombie(id))
		return false;
	
	// New round?
	if (g_newround)
	{
		// Set as first zombie
		remove_task(TASK_MAKEZOMBIE)
		make_a_zombie(MODE_INFECTION, id)
	}
	else
	{
		// Just infect (plus some checks)
		zombieme(id, is_user_valid_alive(infector) ? infector : 0, 0, 0, (silent == 1) ? 1 : 0, (rewards == 1) ? 1 : 0)
	}
	return true;
}

// Native: zp_disinfect_user
public native_disinfect_user(id, silent)
{
	// ZP disabled
	if (!g_pluginenabled)
		return false;
	
	if (!is_user_valid_alive(id))
	{
		log_error(AMX_ERR_NATIVE, "[ZP] Invalid Player (%d)", id)
		return false;
	}
	
	// Not allowed to be human
	if (!allowed_human(id))
		return false;
	
	// Turn to human
	humanme(id, 0, 0, (silent == 1) ? 1 : 0)
	return true;
}

// Native: zp_make_user_nemesis
public native_make_user_nemesis(id)
{
	// ZP disabled
	if (!g_pluginenabled)
		return false;
	
	if (!is_user_valid_alive(id))
	{
		log_error(AMX_ERR_NATIVE, "[ZP] Invalid Player (%d)", id)
		return false;
	}
	
	// Not allowed to be nemesis
	if (!allowed_nemesis(id))
		return false;
	
	// New round?
	if (g_newround)
	{
		// Set as first nemesis
		remove_task(TASK_MAKEZOMBIE)
		make_a_zombie(MODE_NEMESIS, id)
	}
	else
	{
		// Turn player into a Nemesis
		zombieme(id, 0, 1, 0, 0, 0)
	}
	return true;
}

// Native: zp_make_user_assassin
public native_make_user_assassin(id)
{
	// ZP disabled
	if (!g_pluginenabled)
		return false;
	
	if (!is_user_valid_alive(id))
	{
		log_error(AMX_ERR_NATIVE, "[ZP] Invalid Player (%d)", id)
		return false;
	}
	
	// Not allowed to be assassin
	if (!allowed_assassin(id))
		return false;
	
	// New round?
	if (g_newround)
	{
		// Set as first assassin
		remove_task(TASK_MAKEZOMBIE)
		make_a_zombie(MODE_ASSASSIN, id)
	}
	else
	{
		// Turn player into a Assassin
		zombieme(id, 0, 0, 1, 0, 0)
	}
	return true;
}

// Native: zp_make_user_survivor
public native_make_user_survivor(id)
{
	// ZP disabled
	if (!g_pluginenabled)
		return false;
	
	if (!is_user_valid_alive(id))
	{
		log_error(AMX_ERR_NATIVE, "[ZP] Invalid Player (%d)", id)
		return false;
	}
	
	// Not allowed to be survivor
	if (!allowed_survivor(id))
		return false;
	
	// New round?
	if (g_newround)
	{
		// Set as first survivor
		remove_task(TASK_MAKEZOMBIE)
		make_a_zombie(MODE_SURVIVOR, id)
	}
	else
	{
		// Turn player into a Survivor
		humanme(id, 1, 0, 0)
	}
	
	return true;
}

// Native: zp_make_user_sniper
public native_make_user_sniper(id)
{
	// ZP disabled
	if (!g_pluginenabled)
		return false;
	
	if (!is_user_valid_alive(id))
	{
		log_error(AMX_ERR_NATIVE, "[ZP] Invalid Player (%d)", id)
		return false;
	}
	
	// Not allowed to be sniper
	if (!allowed_sniper(id))
		return false;
	
	// New round?
	if (g_newround)
	{
		// Set as first sniper
		remove_task(TASK_MAKEZOMBIE)
		make_a_zombie(MODE_SNIPER, id)
	}
	else
	{
		// Turn player into a Sniper
		humanme(id, 0, 1, 0)
	}
	
	return true;
}

// Native: zp_respawn_user
public native_respawn_user(id, team)
{
	// ZP disabled
	if (!g_pluginenabled)
		return false;
	
	if (!is_user_valid_connected(id))
	{
		log_error(AMX_ERR_NATIVE, "[ZP] Invalid Player (%d)", id)
		return false;
	}
	
	// Respawn not allowed
	if (!allowed_respawn(id))
		return false;
	
	// Respawn as zombie?
	g_respawn_as_zombie[id] = (team == ZP_TEAM_ZOMBIE) ? true : false
	
	// Respawnish!
	respawn_player_manually(id)
	return true;
}

// Native: zp_force_buy_extra_item
public native_force_buy_extra_item(id, itemid, ignorecost)
{
	// ZP disabled
	if (!g_pluginenabled)
		return false;
	
	if (!is_user_valid_alive(id))
	{
		log_error(AMX_ERR_NATIVE, "[ZP] Invalid Player (%d)", id)
		return false;
	}
	
	if (itemid < 0 || itemid >= g_extraitem_i)
	{
		log_error(AMX_ERR_NATIVE, "[ZP] Invalid extra item id (%d)", itemid)
		return false;
	}
	
	buy_extra_item(id, itemid, ignorecost)
	return true;
}

// Native: zp_override_user_model
public native_override_user_model(id, const newmodel[], modelindex)
{
	// ZP disabled
	if (!g_pluginenabled)
		return false;
	
	if (!is_user_valid_connected(id))
	{
		log_error(AMX_ERR_NATIVE, "[ZP] Invalid Player (%d)", id)
		return false;
	}
	
	// Strings passed byref
	param_convert(2)
	
	// Remove previous tasks
	remove_task(id+TASK_MODEL)
	
	// Custom models stuff
	static currentmodel[32]
	
	if (g_handle_models_on_separate_ent)
	{
		// Set the right model
		copy(g_playermodel[id], charsmax(g_playermodel[]), newmodel)
		if (g_set_modelindex_offset && modelindex) fm_cs_set_user_model_index(id, modelindex)
		
		// Set model on player model entity
		fm_set_playermodel_ent(id)
	}
	else
	{
		// Get current model for comparing it with the current one
		fm_cs_get_user_model(id, currentmodel, charsmax(currentmodel))
		
		// Set the right model, after checking that we don't already have it
		if (!equal(currentmodel, newmodel))
		{
			copy(g_playermodel[id], charsmax(g_playermodel[]), newmodel)
			if (g_set_modelindex_offset && modelindex) fm_cs_set_user_model_index(id, modelindex)
			
			// An additional delay is offset at round start
			// since SVC_BAD is more likely to be triggered there
			if (g_newround)
				set_task(5.0 * g_modelchange_delay, "fm_user_model_update", id+TASK_MODEL)
			else
				fm_user_model_update(id+TASK_MODEL)
		}
	}
	return true;
}

// Native: zp_get_user_model
public native_get_user_model(plugin_id, param_nums)
{
	// ZPA disabled
	if (!g_pluginenabled)
		return -1;
	
	// Insufficient number of arguments
	if (param_nums != 3)
		return -1;
	
	// Retrieve the player's index
	static id; id = get_param(1)
	
	// Not an alive player or invalid player
	if (!is_user_valid_alive(id))
		return 0;
	
	// Retrieve the player's current model
	static current_model[32]
	fm_cs_get_user_model(id, current_model, charsmax(current_model))
	
	// Copy the model name into the array passed
	set_string(2, current_model, get_param(3))
	
	return 1;
}

// Native: zp_set_user_model
public native_set_user_model(id, const model[])
{
	// ZPA disabled
	if (!g_pluginenabled)
		return -1;
	
	// Not an alive player or invalid player
	if (!is_user_valid_alive(id))
		return -1;
	
	// Strings passed byref
	param_convert(2)
	
	// Retrieve the player's current model
	static current_model[32]
	fm_cs_get_user_model(id, current_model, charsmax(current_model))
	
	// Check whether we already have the model set on the player
	if (equal(current_model, model))
		return 0;
	
	// Update player's model
	copy(g_playermodel[id], charsmax(g_playermodel[]), model)
	
	// Set the right model for the player
	if (g_handle_models_on_separate_ent) fm_set_playermodel_ent(id)
	else fm_user_model_update(id+TASK_MODEL)
	
	return 1;
}

// Native: zp_has_round_started
public native_has_round_started()
{
	if (g_newround) return 0; // not started
	if (g_modestarted) return 1; // started
	return 2; // starting
}

// Native: zp_is_nemesis_round
public native_is_nemesis_round()
{
	return g_nemround;
}

// Native: zp_is_assassin_round
public native_is_assassin_round()
{
	return g_assaround;
}

// Native: zp_is_survivor_round
public native_is_survivor_round()
{
	return g_survround;
}

// Native: zp_is_sniper_round
public native_is_sniper_round()
{
	return g_sniround;
}

// Native: zp_is_swarm_round
public native_is_swarm_round()
{
	return g_swarmround;
}

// Native: zp_is_plague_round
public native_is_plague_round()
{
	return g_plagueround;
}

// Native: zp_is_armageddon_round
public native_is_armageddon_round()
{
	return g_armageround;
}

// Native: zp_is_apocalypse_round
public native_is_apocalypse_round()
{
	return g_apocround;
}

// Native: zp_is_nightmare_round
public native_is_nightmare_round()
{
	return g_nightround;
}

// Native: zp_get_zombie_count
public native_get_zombie_count()
{
	return fnGetZombies();
}

// Native: zp_get_human_count
public native_get_human_count()
{
	return fnGetHumans();
}

// Native: zp_get_nemesis_count
public native_get_nemesis_count()
{
	return fnGetNemesis();
}

// Native: zp_get_assassin_count
public native_get_assassin_count()
{
	return fnGetAssassin();
}

// Native: zp_get_survivor_count
public native_get_survivor_count()
{
	return fnGetSurvivors();
}

// Native: zp_get_sniper_count
public native_get_sniper_count()
{
	return fnGetSnipers();
}

// Native: zp_register_extra_item
public native_register_extra_item(const name[], cost, team)
{
	// ZP disabled
	if (!g_pluginenabled)
		return -1;
	
	// Strings passed byref
	param_convert(1)
	
	// Arrays not yet initialized
	if (!g_arrays_created)
	{
		log_error(AMX_ERR_NATIVE, "[ZP] Can't register extra item yet (%s)", name)
		return -1;
	}
	
	if (strlen(name) < 1)
	{
		log_error(AMX_ERR_NATIVE, "[ZP] Can't register extra item with an empty name")
		return -1;
	}
	
	new index, extraitem_name[32]
	for (index = 0; index < g_extraitem_i; index++)
	{
		ArrayGetString(g_extraitem_name, index, extraitem_name, charsmax(extraitem_name))
		if (equali(name, extraitem_name))
		{
			log_error(AMX_ERR_NATIVE, "[ZP] Extra item already registered (%s)", name)
			return -1;
		}
	}
	
	// For backwards compatibility
	if (team == ZP_TEAM_ANY)
		team = (ZP_TEAM_ZOMBIE|ZP_TEAM_HUMAN)
	
	// Add the item
	ArrayPushString(g_extraitem_name, name)
	ArrayPushCell(g_extraitem_cost, cost)
	ArrayPushCell(g_extraitem_team, team)
	
	// Set temporary new item flag
	ArrayPushCell(g_extraitem_new, 1)
	
	// Override extra items data with our customizations
	new i, buffer[32], size = ArraySize(g_extraitem2_realname)
	for (i = 0; i < size; i++)
	{
		ArrayGetString(g_extraitem2_realname, i, buffer, charsmax(buffer))
		
		// Check if this is the intended item to override
		if (!equal(name, buffer))
			continue;
		
		// Remove new item flag
		ArraySetCell(g_extraitem_new, g_extraitem_i, 0)
		
		// Replace caption
		ArrayGetString(g_extraitem2_name, i, buffer, charsmax(buffer))
		ArraySetString(g_extraitem_name, g_extraitem_i, buffer)
		
		// Replace cost
		buffer[0] = ArrayGetCell(g_extraitem2_cost, i)
		ArraySetCell(g_extraitem_cost, g_extraitem_i, buffer[0])
		
		// Replace team
		buffer[0] = ArrayGetCell(g_extraitem2_team, i)
		ArraySetCell(g_extraitem_team, g_extraitem_i, buffer[0])
	}
	
	// Increase registered items counter
	g_extraitem_i++
	
	// Return id under which we registered the item
	return g_extraitem_i-1;
}

// Function: zp_register_extra_item (to be used within this plugin only)
native_register_extra_item2(const name[], cost, team)
{
	// Add the item
	ArrayPushString(g_extraitem_name, name)
	ArrayPushCell(g_extraitem_cost, cost)
	ArrayPushCell(g_extraitem_team, team)
	
	// Set temporary new item flag
	ArrayPushCell(g_extraitem_new, 1)
	
	// Increase registered items counter
	g_extraitem_i++
}

// Native: zp_register_zombie_class
public native_register_zombie_class(const name[], const info[], const model[], const clawmodel[], hp, speed, Float:gravity, Float:knockback)
{
	// ZP disabled
	if (!g_pluginenabled)
		return -1;
	
	// Strings passed byref
	param_convert(1)
	param_convert(2)
	param_convert(3)
	param_convert(4)
	
	// Arrays not yet initialized
	if (!g_arrays_created)
	{
		log_error(AMX_ERR_NATIVE, "[ZP] Can't register zombie class yet (%s)", name)
		return -1;
	}
	
	if (strlen(name) < 1)
	{
		log_error(AMX_ERR_NATIVE, "[ZP] Can't register zombie class with an empty name")
		return -1;
	}
	
	new index, zombieclass_name[32]
	for (index = 0; index < g_zclass_i; index++)
	{
		ArrayGetString(g_zclass_name, index, zombieclass_name, charsmax(zombieclass_name))
		if (equali(name, zombieclass_name))
		{
			log_error(AMX_ERR_NATIVE, "[ZP] Zombie class already registered (%s)", name)
			return -1;
		}
	}
	
	// Add the class
	ArrayPushString(g_zclass_name, name)
	ArrayPushString(g_zclass_info, info)
	
	// Using same zombie models for all classes?
	if (g_same_models_for_all)
	{
		ArrayPushCell(g_zclass_modelsstart, 0)
		ArrayPushCell(g_zclass_modelsend, ArraySize(g_zclass_playermodel))
	}
	else
	{
		ArrayPushCell(g_zclass_modelsstart, ArraySize(g_zclass_playermodel))
		ArrayPushString(g_zclass_playermodel, model)
		ArrayPushCell(g_zclass_modelsend, ArraySize(g_zclass_playermodel))
		ArrayPushCell(g_zclass_modelindex, -1)
	}
	
	ArrayPushString(g_zclass_clawmodel, clawmodel)
	ArrayPushCell(g_zclass_hp, hp)
	ArrayPushCell(g_zclass_spd, speed)
	ArrayPushCell(g_zclass_grav, gravity)
	ArrayPushCell(g_zclass_kb, knockback)
	
	// Set temporary new class flag
	ArrayPushCell(g_zclass_new, 1)
	
	// Override zombie classes data with our customizations
	new i, k, buffer[32], Float:buffer2, nummodels_custom, nummodels_default, prec_mdl[100], size = ArraySize(g_zclass2_realname)
	for (i = 0; i < size; i++)
	{
		ArrayGetString(g_zclass2_realname, i, buffer, charsmax(buffer))
		
		// Check if this is the intended class to override
		if (!equal(name, buffer))
			continue;
		
		// Remove new class flag
		ArraySetCell(g_zclass_new, g_zclass_i, 0)
		
		// Replace caption
		ArrayGetString(g_zclass2_name, i, buffer, charsmax(buffer))
		ArraySetString(g_zclass_name, g_zclass_i, buffer)
		
		// Replace info
		ArrayGetString(g_zclass2_info, i, buffer, charsmax(buffer))
		ArraySetString(g_zclass_info, g_zclass_i, buffer)
		
		// Replace models, unless using same models for all classes
		if (!g_same_models_for_all)
		{
			nummodels_custom = ArrayGetCell(g_zclass2_modelsend, i) - ArrayGetCell(g_zclass2_modelsstart, i)
			nummodels_default = ArrayGetCell(g_zclass_modelsend, g_zclass_i) - ArrayGetCell(g_zclass_modelsstart, g_zclass_i)
			
			// Replace each player model and model index
			for (k = 0; k < min(nummodels_custom, nummodels_default); k++)
			{
				ArrayGetString(g_zclass2_playermodel, ArrayGetCell(g_zclass2_modelsstart, i) + k, buffer, charsmax(buffer))
				ArraySetString(g_zclass_playermodel, ArrayGetCell(g_zclass_modelsstart, g_zclass_i) + k, buffer)
				
				// Precache player model and replace its modelindex with the real one
				formatex(prec_mdl, charsmax(prec_mdl), "models/player/%s/%s.mdl", buffer, buffer)
				ArraySetCell(g_zclass_modelindex, ArrayGetCell(g_zclass_modelsstart, g_zclass_i) + k, engfunc(EngFunc_PrecacheModel, prec_mdl))
				if (g_force_consistency == 1) force_unmodified(force_model_samebounds, {0,0,0}, {0,0,0}, prec_mdl)
				if (g_force_consistency == 2) force_unmodified(force_exactfile, {0,0,0}, {0,0,0}, prec_mdl)
				// Precache modelT.mdl files too
				copy(prec_mdl[strlen(prec_mdl)-4], charsmax(prec_mdl) - (strlen(prec_mdl)-4), "T.mdl")
				if (file_exists(prec_mdl)) engfunc(EngFunc_PrecacheModel, prec_mdl)
			}
			
			// We have more custom models than what we can accommodate,
			// Let's make some space...
			if (nummodels_custom > nummodels_default)
			{
				for (k = nummodels_default; k < nummodels_custom; k++)
				{
					ArrayGetString(g_zclass2_playermodel, ArrayGetCell(g_zclass2_modelsstart, i) + k, buffer, charsmax(buffer))
					ArrayInsertStringAfter(g_zclass_playermodel, ArrayGetCell(g_zclass_modelsstart, g_zclass_i) + k - 1, buffer)
					
					// Precache player model and retrieve its modelindex
					formatex(prec_mdl, charsmax(prec_mdl), "models/player/%s/%s.mdl", buffer, buffer)
					ArrayInsertCellAfter(g_zclass_modelindex, ArrayGetCell(g_zclass_modelsstart, g_zclass_i) + k - 1, engfunc(EngFunc_PrecacheModel, prec_mdl))
					if (g_force_consistency == 1) force_unmodified(force_model_samebounds, {0,0,0}, {0,0,0}, prec_mdl)
					if (g_force_consistency == 2) force_unmodified(force_exactfile, {0,0,0}, {0,0,0}, prec_mdl)
					// Precache modelT.mdl files too
					copy(prec_mdl[strlen(prec_mdl)-4], charsmax(prec_mdl) - (strlen(prec_mdl)-4), "T.mdl")
					if (file_exists(prec_mdl)) engfunc(EngFunc_PrecacheModel, prec_mdl)
				}
				
				// Fix models end index for this class
				ArraySetCell(g_zclass_modelsend, g_zclass_i, ArrayGetCell(g_zclass_modelsend, g_zclass_i) + (nummodels_custom - nummodels_default))
			}
			
			/* --- Not needed since classes can't have more than 1 default model for now ---
			// We have less custom models than what this class has by default,
			// Get rid of those extra entries...
			if (nummodels_custom < nummodels_default)
			{
				for (k = nummodels_custom; k < nummodels_default; k++)
				{
					ArrayDeleteItem(g_zclass_playermodel, ArrayGetCell(g_zclass_modelsstart, g_zclass_i) + nummodels_custom)
				}
				
				// Fix models end index for this class
				ArraySetCell(g_zclass_modelsend, g_zclass_i, ArrayGetCell(g_zclass_modelsend, g_zclass_i) - (nummodels_default - nummodels_custom))
			}
			*/
		}
		
		// Replace clawmodel
		ArrayGetString(g_zclass2_clawmodel, i, buffer, charsmax(buffer))
		ArraySetString(g_zclass_clawmodel, g_zclass_i, buffer)
		
		// Precache clawmodel
		formatex(prec_mdl, charsmax(prec_mdl), "models/zombie_plague/%s", buffer)
		engfunc(EngFunc_PrecacheModel, prec_mdl)
		
		// Replace health
		buffer[0] = ArrayGetCell(g_zclass2_hp, i)
		ArraySetCell(g_zclass_hp, g_zclass_i, buffer[0])
		
		// Replace speed
		buffer[0] = ArrayGetCell(g_zclass2_spd, i)
		ArraySetCell(g_zclass_spd, g_zclass_i, buffer[0])
		
		// Replace gravity
		buffer2 = Float:ArrayGetCell(g_zclass2_grav, i)
		ArraySetCell(g_zclass_grav, g_zclass_i, buffer2)
		
		// Replace knockback
		buffer2 = Float:ArrayGetCell(g_zclass2_kb, i)
		ArraySetCell(g_zclass_kb, g_zclass_i, buffer2)
	}
	
	// If class was not overriden with customization data
	if (ArrayGetCell(g_zclass_new, g_zclass_i))
	{
		// If not using same models for all classes
		if (!g_same_models_for_all)
		{
			// Precache default class model and replace modelindex with the real one
			formatex(prec_mdl, charsmax(prec_mdl), "models/player/%s/%s.mdl", model, model)
			ArraySetCell(g_zclass_modelindex, ArrayGetCell(g_zclass_modelsstart, g_zclass_i), engfunc(EngFunc_PrecacheModel, prec_mdl))
			if (g_force_consistency == 1) force_unmodified(force_model_samebounds, {0,0,0}, {0,0,0}, prec_mdl)
			if (g_force_consistency == 2) force_unmodified(force_exactfile, {0,0,0}, {0,0,0}, prec_mdl)
			// Precache modelT.mdl files too
			copy(prec_mdl[strlen(prec_mdl)-4], charsmax(prec_mdl) - (strlen(prec_mdl)-4), "T.mdl")
			if (file_exists(prec_mdl)) engfunc(EngFunc_PrecacheModel, prec_mdl)
		}
		
		// Precache default clawmodel
		formatex(prec_mdl, charsmax(prec_mdl), "models/zombie_plague/%s", clawmodel)
		engfunc(EngFunc_PrecacheModel, prec_mdl)
	}
	
	// Increase registered classes counter
	g_zclass_i++
	
	// Return id under which we registered the class
	return g_zclass_i-1;
}

// Native: zp_get_extra_item_id
public native_get_extra_item_id(const name[])
{
	// ZP disabled
	if (!g_pluginenabled)
		return -1;
	
	// Strings passed byref
	param_convert(1)
	
	// Loop through every item (not using Tries since ZP should work on AMXX 1.8.0)
	static i, item_name[32]
	for (i = 0; i < g_extraitem_i; i++)
	{
		ArrayGetString(g_extraitem_name, i, item_name, charsmax(item_name))
		
		// Check if this is the item to retrieve
		if (equali(name, item_name))
			return i;
	}
	
	return -1;
}

// Native: zp_get_zombie_class_id
public native_get_zombie_class_id(const name[])
{
	// ZP disabled
	if (!g_pluginenabled)
		return -1;
	
	// Strings passed byref
	param_convert(1)
	
	// Loop through every class (not using Tries since ZP should work on AMXX 1.8.0)
	static i, class_name[32]
	for (i = 0; i < g_zclass_i; i++)
	{
		ArrayGetString(g_zclass_name, i, class_name, charsmax(class_name))
		
		// Check if this is the class to retrieve
		if (equali(name, class_name))
			return i;
	}
	
	return -1;
}

// Native: zp_get_zombie_class_info
public native_get_zombie_class_info(classid, info[], len)
{
	// ZP disabled
	if (!g_pluginenabled)
		return false;
	
	// Invalid class
	if (classid < 0 || classid >= g_zclass_i)
	{
		log_error(AMX_ERR_NATIVE, "[ZP] Invalid zombie class id (%d)", classid)
		return false;
	}
	
	// Strings passed byref
	param_convert(2)
	
	// Fetch zombie class info
	ArrayGetString(g_zclass_info, classid, info, len)
	return true;
}

/*================================================================================
 [Custom Messages]
=================================================================================*/

// Custom Night Vision
public set_user_nvision(taskid)
{
	// Get player's origin
	static origin[3]
	get_user_origin(ID_NVISION, origin)
	
	// Nightvision message
	message_begin(MSG_ONE_UNRELIABLE, SVC_TEMPENTITY, _, ID_NVISION)
	write_byte(TE_DLIGHT) // TE id
	write_coord(origin[0]) // x
	write_coord(origin[1]) // y
	write_coord(origin[2]) // z
	write_byte(get_pcvar_num(cvar_nvgsize)) // radius
	
	// Nemesis / Madness / Spectator in nemesis round
	if (g_nemesis[ID_NVISION] || (g_zombie[ID_NVISION] && g_nodamage[ID_NVISION]) || (!g_isalive[ID_NVISION] && g_nemround))
	{
		write_byte(get_pcvar_num(cvar_nemnvgcolor[0])) // r
		write_byte(get_pcvar_num(cvar_nemnvgcolor[1])) // g
		write_byte(get_pcvar_num(cvar_nemnvgcolor[2])) // b
	}
	// Assassin / Spectator in assassin round
	else if (g_assassin[ID_NVISION] || (!g_isalive[ID_NVISION] && g_assaround))
	{
		write_byte(get_pcvar_num(cvar_assanvgcolor[0])) // r
		write_byte(get_pcvar_num(cvar_assanvgcolor[1])) // g
		write_byte(get_pcvar_num(cvar_assanvgcolor[2])) // b
	}	
	// Human / Spectator in normal round
	else if (!g_zombie[ID_NVISION] || !g_isalive[ID_NVISION])
	{
		write_byte(get_pcvar_num(cvar_humnvgcolor[0])) // r
		write_byte(get_pcvar_num(cvar_humnvgcolor[1])) // g
		write_byte(get_pcvar_num(cvar_humnvgcolor[2])) // b
	}
	// Zombie
	else
	{
		write_byte(get_pcvar_num(cvar_nvgcolor[0])) // r
		write_byte(get_pcvar_num(cvar_nvgcolor[1])) // g
		write_byte(get_pcvar_num(cvar_nvgcolor[2])) // b
	}
	
	write_byte(2) // life
	write_byte(0) // decay rate
	message_end()
}

// Game Nightvision
set_user_gnvision(id, toggle)
{
	// Toggle NVG message
	message_begin(MSG_ONE, g_msgNVGToggle, _, id)
	write_byte(toggle) // toggle
	message_end()
}

// Custom Flashlight
public set_user_flashlight(taskid)
{
	// Get player and aiming origins
	static Float:originF[3], Float:destoriginF[3]
	pev(ID_FLASH, pev_origin, originF)
	fm_get_aim_origin(ID_FLASH, destoriginF)
	
	// Max distance check
	if (get_distance_f(originF, destoriginF) > get_pcvar_float(cvar_flashdist))
		return;
	
	// Send to all players?
	if (get_pcvar_num(cvar_flashshowall))
		engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, destoriginF, 0)
	else
		message_begin(MSG_ONE_UNRELIABLE, SVC_TEMPENTITY, _, ID_FLASH)
	
	// Flashlight
	write_byte(TE_DLIGHT) // TE id
	engfunc(EngFunc_WriteCoord, destoriginF[0]) // x
	engfunc(EngFunc_WriteCoord, destoriginF[1]) // y
	engfunc(EngFunc_WriteCoord, destoriginF[2]) // z
	write_byte(get_pcvar_num(cvar_flashsize)) // radius
	write_byte(get_pcvar_num(cvar_flashcolor[0])) // r
	write_byte(get_pcvar_num(cvar_flashcolor[1])) // g
	write_byte(get_pcvar_num(cvar_flashcolor[2])) // b
	write_byte(3) // life
	write_byte(0) // decay rate
	message_end()
}

// Infection special effects
infection_effects(id)
{
	// Screen fade? (unless frozen)
	if (!g_frozen[id] && get_pcvar_num(cvar_infectionscreenfade))
	{
		message_begin(MSG_ONE_UNRELIABLE, g_msgScreenFade, _, id)
		write_short(UNIT_SECOND) // duration
		write_short(0) // hold time
		write_short(FFADE_IN) // fade type
		if (g_nemesis[id])
		{
			write_byte(get_pcvar_num(cvar_nemnvgcolor[0])) // r
			write_byte(get_pcvar_num(cvar_nemnvgcolor[1])) // g
			write_byte(get_pcvar_num(cvar_nemnvgcolor[2])) // b
		}
		else if (g_assassin[id])
		{
			write_byte(get_pcvar_num(cvar_assanvgcolor[0])) // r
			write_byte(get_pcvar_num(cvar_assanvgcolor[1])) // g
			write_byte(get_pcvar_num(cvar_assanvgcolor[2])) // b
		}
		else
		{
			write_byte(get_pcvar_num(cvar_nvgcolor[0])) // r
			write_byte(get_pcvar_num(cvar_nvgcolor[1])) // g
			write_byte(get_pcvar_num(cvar_nvgcolor[2])) // b
		}
		write_byte (255) // alpha
		message_end()
	}
	
	// Screen shake?
	if (get_pcvar_num(cvar_infectionscreenshake))
	{
		message_begin(MSG_ONE_UNRELIABLE, g_msgScreenShake, _, id)
		write_short(UNIT_SECOND*4) // amplitude
		write_short(UNIT_SECOND*2) // duration
		write_short(UNIT_SECOND*10) // frequency
		message_end()
	}
	
	// Infection icon?
	if (get_pcvar_num(cvar_hudicons))
	{
		message_begin(MSG_ONE_UNRELIABLE, g_msgDamage, _, id)
		write_byte(0) // damage save
		write_byte(0) // damage take
		write_long(DMG_NERVEGAS) // damage type - DMG_RADIATION
		write_coord(0) // x
		write_coord(0) // y
		write_coord(0) // z
		message_end()
	}
	
	// Get player's origin
	static origin[3]
	get_user_origin(id, origin)
	
	// Tracers?
	if (get_pcvar_num(cvar_infectiontracers))
	{
		message_begin(MSG_PVS, SVC_TEMPENTITY, origin)
		write_byte(TE_IMPLOSION) // TE id
		write_coord(origin[0]) // x
		write_coord(origin[1]) // y
		write_coord(origin[2]) // z
		write_byte(128) // radius
		write_byte(20) // count
		write_byte(3) // duration
		message_end()
	}
	
	// Particle burst?
	if (get_pcvar_num(cvar_infectionparticles))
	{
		message_begin(MSG_PVS, SVC_TEMPENTITY, origin)
		write_byte(TE_PARTICLEBURST) // TE id
		write_coord(origin[0]) // x
		write_coord(origin[1]) // y
		write_coord(origin[2]) // z
		write_short(50) // radius
		write_byte(70) // color
		write_byte(3) // duration (will be randomized a bit)
		message_end()
	}
	
	// Light sparkle?
	if (get_pcvar_num(cvar_infectionsparkle))
	{
		message_begin(MSG_PVS, SVC_TEMPENTITY, origin)
		write_byte(TE_DLIGHT) // TE id
		write_coord(origin[0]) // x
		write_coord(origin[1]) // y
		write_coord(origin[2]) // z
		write_byte(20) // radius
		write_byte(get_pcvar_num(cvar_nvgcolor[0])) // r
		write_byte(get_pcvar_num(cvar_nvgcolor[1])) // g
		write_byte(get_pcvar_num(cvar_nvgcolor[2])) // b
		write_byte(2) // life
		write_byte(0) // decay rate
		message_end()
	}
}

// Nemesis/madness aura task
public zombie_aura(taskid)
{
	// Not nemesis, not assassin, not in zombie madness
	if (!g_nemesis[ID_AURA] && !g_assassin[ID_AURA] && !g_nodamage[ID_AURA])
	{
		// Task not needed anymore
		remove_task(taskid);
		return;
	}
	
	// Get player's origin
	static origin[3]
	get_user_origin(ID_AURA, origin)
	
	// Colored Aura
	message_begin(MSG_PVS, SVC_TEMPENTITY, origin)
	write_byte(TE_DLIGHT) // TE id
	write_coord(origin[0]) // x
	write_coord(origin[1]) // y
	write_coord(origin[2]) // z
	write_byte(20) // radius

	if (g_assassin[ID_AURA])
	{
		write_byte(get_pcvar_num(cvar_assanvgcolor[0])) // r
		write_byte(get_pcvar_num(cvar_assanvgcolor[1])) // g
		write_byte(get_pcvar_num(cvar_assanvgcolor[2])) // b
	}
	else
	{
		write_byte(get_pcvar_num(cvar_nemnvgcolor[0])) // r
		write_byte(get_pcvar_num(cvar_nemnvgcolor[1])) // g
		write_byte(get_pcvar_num(cvar_nemnvgcolor[2])) // b
	}

	write_byte(2) // life
	write_byte(0) // decay rate
	message_end()
}

// Make zombies leave footsteps and bloodstains on the floor
public make_blood(taskid)
{
	// Only bleed when moving on ground
	if (!(pev(ID_BLOOD, pev_flags) & FL_ONGROUND) || fm_get_speed(ID_BLOOD) < 80)
		return;
	
	// Get user origin
	static Float:originF[3]
	pev(ID_BLOOD, pev_origin, originF)
	
	// If ducking set a little lower
	if (pev(ID_BLOOD, pev_bInDuck))
		originF[2] -= 18.0
	else
		originF[2] -= 36.0
	
	// Send the decal message
	engfunc(EngFunc_MessageBegin, MSG_PAS, SVC_TEMPENTITY, originF, 0)
	write_byte(TE_WORLDDECAL) // TE id
	engfunc(EngFunc_WriteCoord, originF[0]) // x
	engfunc(EngFunc_WriteCoord, originF[1]) // y
	engfunc(EngFunc_WriteCoord, originF[2]) // z
	write_byte(ArrayGetCell(zombie_decals, random_num(0, ArraySize(zombie_decals) - 1)) + (g_czero * 12)) // random decal number (offsets +12 for CZ)
	message_end()
}

// Flare Lighting Effects
flare_lighting(entity, duration)
{
	// Get origin and color
	static Float:originF[3], color[3]
	pev(entity, pev_origin, originF)
	pev(entity, PEV_FLARE_COLOR, color)
	
	// Lighting
	engfunc(EngFunc_MessageBegin, MSG_PAS, SVC_TEMPENTITY, originF, 0)
	write_byte(TE_DLIGHT) // TE id
	engfunc(EngFunc_WriteCoord, originF[0]) // x
	engfunc(EngFunc_WriteCoord, originF[1]) // y
	engfunc(EngFunc_WriteCoord, originF[2]) // z
	write_byte(get_pcvar_num(cvar_flaresize)) // radius
	write_byte(color[0]) // r
	write_byte(color[1]) // g
	write_byte(color[2]) // b
	write_byte(21) //life
	write_byte((duration < 2) ? 3 : 0) //decay rate
	message_end()
	
	// Sparks
	engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, originF, 0)
	write_byte(TE_SPARKS) // TE id
	engfunc(EngFunc_WriteCoord, originF[0]) // x
	engfunc(EngFunc_WriteCoord, originF[1]) // y
	engfunc(EngFunc_WriteCoord, originF[2]) // z
	message_end()
}

// Burning Flames
public burning_flame(taskid)
{
	// Get player origin and flags
	static origin[3], flags
	get_user_origin(ID_BURN, origin)
	flags = pev(ID_BURN, pev_flags)
	
	// Madness mode - in water - burning stopped
	if (g_nodamage[ID_BURN] || (flags & FL_INWATER) || g_burning_duration[ID_BURN] < 1)
	{
		// Smoke sprite
		message_begin(MSG_PVS, SVC_TEMPENTITY, origin)
		write_byte(TE_SMOKE) // TE id
		write_coord(origin[0]) // x
		write_coord(origin[1]) // y
		write_coord(origin[2]-50) // z
		write_short(g_smokeSpr) // sprite
		write_byte(random_num(15, 20)) // scale
		write_byte(random_num(10, 20)) // framerate
		message_end()
		
		// Task not needed anymore
		remove_task(taskid);
		return;
	}
	
	// Randomly play burning zombie scream sounds (not for nemesis)
	if (!g_nemesis[ID_BURN] && !g_assassin[ID_BURN] && !random_num(0, 20))
	{
		static sound[64]
		ArrayGetString(grenade_fire_player, random_num(0, ArraySize(grenade_fire_player) - 1), sound, charsmax(sound))
		emit_sound(ID_BURN, CHAN_VOICE, sound, 1.0, ATTN_NORM, 0, PITCH_NORM)
	}
	
	// Fire slow down, unless nemesis
	if (!g_nemesis[ID_BURN] && !g_assassin[ID_BURN] && (flags & FL_ONGROUND) && get_pcvar_float(cvar_fireslowdown) > 0.0)
	{
		static Float:velocity[3]
		pev(ID_BURN, pev_velocity, velocity)
		xs_vec_mul_scalar(velocity, get_pcvar_float(cvar_fireslowdown), velocity)
		set_pev(ID_BURN, pev_velocity, velocity)
	}
	
	// Get player's health
	static health
	health = pev(ID_BURN, pev_health)
	
	// Take damage from the fire
	if (health - floatround(get_pcvar_float(cvar_firedamage), floatround_ceil) > 0)
		fm_set_user_health(ID_BURN, health - floatround(get_pcvar_float(cvar_firedamage), floatround_ceil))
	
	// Flame sprite
	message_begin(MSG_PVS, SVC_TEMPENTITY, origin)
	write_byte(TE_SPRITE) // TE id
	write_coord(origin[0]+random_num(-5, 5)) // x
	write_coord(origin[1]+random_num(-5, 5)) // y
	write_coord(origin[2]+random_num(-10, 10)) // z
	write_short(g_flameSpr) // sprite
	write_byte(random_num(5, 10)) // scale
	write_byte(200) // brightness
	message_end()
	
	// Decrease burning duration counter
	g_burning_duration[ID_BURN]--
}

// Infection Bomb: Green Blast
create_blast(const Float:originF[3])
{
	// Smallest ring
	engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, originF, 0)
	write_byte(TE_BEAMCYLINDER) // TE id
	engfunc(EngFunc_WriteCoord, originF[0]) // x
	engfunc(EngFunc_WriteCoord, originF[1]) // y
	engfunc(EngFunc_WriteCoord, originF[2]) // z
	engfunc(EngFunc_WriteCoord, originF[0]) // x axis
	engfunc(EngFunc_WriteCoord, originF[1]) // y axis
	engfunc(EngFunc_WriteCoord, originF[2]+385.0) // z axis
	write_short(g_exploSpr) // sprite
	write_byte(0) // startframe
	write_byte(0) // framerate
	write_byte(4) // life
	write_byte(60) // width
	write_byte(0) // noise
	write_byte(0) // red
	write_byte(200) // green
	write_byte(0) // blue
	write_byte(200) // brightness
	write_byte(0) // speed
	message_end()
	
	// Medium ring
	engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, originF, 0)
	write_byte(TE_BEAMCYLINDER) // TE id
	engfunc(EngFunc_WriteCoord, originF[0]) // x
	engfunc(EngFunc_WriteCoord, originF[1]) // y
	engfunc(EngFunc_WriteCoord, originF[2]) // z
	engfunc(EngFunc_WriteCoord, originF[0]) // x axis
	engfunc(EngFunc_WriteCoord, originF[1]) // y axis
	engfunc(EngFunc_WriteCoord, originF[2]+470.0) // z axis
	write_short(g_exploSpr) // sprite
	write_byte(0) // startframe
	write_byte(0) // framerate
	write_byte(4) // life
	write_byte(60) // width
	write_byte(0) // noise
	write_byte(0) // red
	write_byte(200) // green
	write_byte(0) // blue
	write_byte(200) // brightness
	write_byte(0) // speed
	message_end()
	
	// Largest ring
	engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, originF, 0)
	write_byte(TE_BEAMCYLINDER) // TE id
	engfunc(EngFunc_WriteCoord, originF[0]) // x
	engfunc(EngFunc_WriteCoord, originF[1]) // y
	engfunc(EngFunc_WriteCoord, originF[2]) // z
	engfunc(EngFunc_WriteCoord, originF[0]) // x axis
	engfunc(EngFunc_WriteCoord, originF[1]) // y axis
	engfunc(EngFunc_WriteCoord, originF[2]+555.0) // z axis
	write_short(g_exploSpr) // sprite
	write_byte(0) // startframe
	write_byte(0) // framerate
	write_byte(4) // life
	write_byte(60) // width
	write_byte(0) // noise
	write_byte(0) // red
	write_byte(200) // green
	write_byte(0) // blue
	write_byte(200) // brightness
	write_byte(0) // speed
	message_end()
}

// Fire Grenade: Fire Blast
create_blast2(const Float:originF[3])
{
	// Smallest ring
	engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, originF, 0)
	write_byte(TE_BEAMCYLINDER) // TE id
	engfunc(EngFunc_WriteCoord, originF[0]) // x
	engfunc(EngFunc_WriteCoord, originF[1]) // y
	engfunc(EngFunc_WriteCoord, originF[2]) // z
	engfunc(EngFunc_WriteCoord, originF[0]) // x axis
	engfunc(EngFunc_WriteCoord, originF[1]) // y axis
	engfunc(EngFunc_WriteCoord, originF[2]+385.0) // z axis
	write_short(g_exploSpr) // sprite
	write_byte(0) // startframe
	write_byte(0) // framerate
	write_byte(4) // life
	write_byte(60) // width
	write_byte(0) // noise
	write_byte(200) // red
	write_byte(100) // green
	write_byte(0) // blue
	write_byte(200) // brightness
	write_byte(0) // speed
	message_end()
	
	// Medium ring
	engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, originF, 0)
	write_byte(TE_BEAMCYLINDER) // TE id
	engfunc(EngFunc_WriteCoord, originF[0]) // x
	engfunc(EngFunc_WriteCoord, originF[1]) // y
	engfunc(EngFunc_WriteCoord, originF[2]) // z
	engfunc(EngFunc_WriteCoord, originF[0]) // x axis
	engfunc(EngFunc_WriteCoord, originF[1]) // y axis
	engfunc(EngFunc_WriteCoord, originF[2]+470.0) // z axis
	write_short(g_exploSpr) // sprite
	write_byte(0) // startframe
	write_byte(0) // framerate
	write_byte(4) // life
	write_byte(60) // width
	write_byte(0) // noise
	write_byte(200) // red
	write_byte(50) // green
	write_byte(0) // blue
	write_byte(200) // brightness
	write_byte(0) // speed
	message_end()
	
	// Largest ring
	engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, originF, 0)
	write_byte(TE_BEAMCYLINDER) // TE id
	engfunc(EngFunc_WriteCoord, originF[0]) // x
	engfunc(EngFunc_WriteCoord, originF[1]) // y
	engfunc(EngFunc_WriteCoord, originF[2]) // z
	engfunc(EngFunc_WriteCoord, originF[0]) // x axis
	engfunc(EngFunc_WriteCoord, originF[1]) // y axis
	engfunc(EngFunc_WriteCoord, originF[2]+555.0) // z axis
	write_short(g_exploSpr) // sprite
	write_byte(0) // startframe
	write_byte(0) // framerate
	write_byte(4) // life
	write_byte(60) // width
	write_byte(0) // noise
	write_byte(200) // red
	write_byte(0) // green
	write_byte(0) // blue
	write_byte(200) // brightness
	write_byte(0) // speed
	message_end()
}

// Frost Grenade: Freeze Blast
create_blast3(const Float:originF[3])
{
	// Smallest ring
	engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, originF, 0)
	write_byte(TE_BEAMCYLINDER) // TE id
	engfunc(EngFunc_WriteCoord, originF[0]) // x
	engfunc(EngFunc_WriteCoord, originF[1]) // y
	engfunc(EngFunc_WriteCoord, originF[2]) // z
	engfunc(EngFunc_WriteCoord, originF[0]) // x axis
	engfunc(EngFunc_WriteCoord, originF[1]) // y axis
	engfunc(EngFunc_WriteCoord, originF[2]+385.0) // z axis
	write_short(g_exploSpr) // sprite
	write_byte(0) // startframe
	write_byte(0) // framerate
	write_byte(4) // life
	write_byte(60) // width
	write_byte(0) // noise
	write_byte(0) // red
	write_byte(100) // green
	write_byte(200) // blue
	write_byte(200) // brightness
	write_byte(0) // speed
	message_end()
	
	// Medium ring
	engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, originF, 0)
	write_byte(TE_BEAMCYLINDER) // TE id
	engfunc(EngFunc_WriteCoord, originF[0]) // x
	engfunc(EngFunc_WriteCoord, originF[1]) // y
	engfunc(EngFunc_WriteCoord, originF[2]) // z
	engfunc(EngFunc_WriteCoord, originF[0]) // x axis
	engfunc(EngFunc_WriteCoord, originF[1]) // y axis
	engfunc(EngFunc_WriteCoord, originF[2]+470.0) // z axis
	write_short(g_exploSpr) // sprite
	write_byte(0) // startframe
	write_byte(0) // framerate
	write_byte(4) // life
	write_byte(60) // width
	write_byte(0) // noise
	write_byte(0) // red
	write_byte(100) // green
	write_byte(200) // blue
	write_byte(200) // brightness
	write_byte(0) // speed
	message_end()
	
	// Largest ring
	engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, originF, 0)
	write_byte(TE_BEAMCYLINDER) // TE id
	engfunc(EngFunc_WriteCoord, originF[0]) // x
	engfunc(EngFunc_WriteCoord, originF[1]) // y
	engfunc(EngFunc_WriteCoord, originF[2]) // z
	engfunc(EngFunc_WriteCoord, originF[0]) // x axis
	engfunc(EngFunc_WriteCoord, originF[1]) // y axis
	engfunc(EngFunc_WriteCoord, originF[2]+555.0) // z axis
	write_short(g_exploSpr) // sprite
	write_byte(0) // startframe
	write_byte(0) // framerate
	write_byte(4) // life
	write_byte(60) // width
	write_byte(0) // noise
	write_byte(0) // red
	write_byte(100) // green
	write_byte(200) // blue
	write_byte(200) // brightness
	write_byte(0) // speed
	message_end()
}

// Fix Dead Attrib on scoreboard
FixDeadAttrib(id)
{
	message_begin(MSG_BROADCAST, g_msgScoreAttrib)
	write_byte(id) // id
	write_byte(0) // attrib
	message_end()
}

// Send Death Message for infections
SendDeathMsg(attacker, victim)
{
	message_begin(MSG_BROADCAST, g_msgDeathMsg)
	write_byte(attacker) // killer
	write_byte(victim) // victim
	write_byte(1) // headshot flag
	write_string("infection") // killer's weapon
	message_end()
}

// Update Player Frags and Deaths
UpdateFrags(attacker, victim, frags, deaths, scoreboard)
{
	// Set attacker frags
	set_pev(attacker, pev_frags, float(pev(attacker, pev_frags) + frags))
	
	// Set victim deaths
	fm_cs_set_user_deaths(victim, cs_get_user_deaths(victim) + deaths)
	
	// Update scoreboard with attacker and victim info
	if (scoreboard)
	{
		message_begin(MSG_BROADCAST, g_msgScoreInfo)
		write_byte(attacker) // id
		write_short(pev(attacker, pev_frags)) // frags
		write_short(cs_get_user_deaths(attacker)) // deaths
		write_short(0) // class?
		write_short(fm_cs_get_user_team(attacker)) // team
		message_end()
		
		message_begin(MSG_BROADCAST, g_msgScoreInfo)
		write_byte(victim) // id
		write_short(pev(victim, pev_frags)) // frags
		write_short(cs_get_user_deaths(victim)) // deaths
		write_short(0) // class?
		write_short(fm_cs_get_user_team(victim)) // team
		message_end()
	}
}

// Remove Player Frags (when Nemesis/Survivor ignore_frags cvar is enabled)
RemoveFrags(attacker, victim)
{
	// Remove attacker frags
	set_pev(attacker, pev_frags, float(pev(attacker, pev_frags) - 1))
	
	// Remove victim deaths
	fm_cs_set_user_deaths(victim, cs_get_user_deaths(victim) - 1)
}

// Plays a sound on clients
PlaySound(const sound[])
{
	if (equal(sound[strlen(sound)-4], ".mp3"))
		client_cmd(0, "mp3 play ^"sound/%s^"", sound)
	else
		client_cmd(0, "spk ^"%s^"", sound)
}

// Prints a colored message to target (use 0 for everyone), supports ML formatting.
// Note: I still need to make something like gungame's LANG_PLAYER_C to avoid unintended
// argument replacement when a function passes -1 (it will be considered a LANG_PLAYER)
zp_colored_print(target, const message[], any:...)
{
	static buffer[512], i, argscount
	argscount = numargs()
	
	// Send to everyone
	if (!target)
	{
		static player
		for (player = 1; player <= g_maxplayers; player++)
		{
			// Not connected
			if (!g_isconnected[player])
				continue;
			
			// Remember changed arguments
			static changed[5], changedcount // [5] = max LANG_PLAYER occurencies
			changedcount = 0
			
			// Replace LANG_PLAYER with player id
			for (i = 2; i < argscount; i++)
			{
				if (getarg(i) == LANG_PLAYER)
				{
					setarg(i, 0, player)
					changed[changedcount] = i
					changedcount++
				}
			}
			
			// Format message for player
			vformat(buffer, charsmax(buffer), message, 3)
			
			// Send it
			message_begin(MSG_ONE_UNRELIABLE, g_msgSayText, _, player)
			write_byte(player)
			write_string(buffer)
			message_end()
			
			// Replace back player id's with LANG_PLAYER
			for (i = 0; i < changedcount; i++)
				setarg(changed[i], 0, LANG_PLAYER)
		}
	}
	// Send to specific target
	else
	{
		/*
		// Not needed since you should set the ML argument
		// to the player's id for a targeted print message
		
		// Replace LANG_PLAYER with player id
		for (i = 2; i < argscount; i++)
		{
			if (getarg(i) == LANG_PLAYER)
				setarg(i, 0, target)
		}
		*/
		
		// Format message for player
		vformat(buffer, charsmax(buffer), message, 3)
		
		// Send it
		message_begin(MSG_ONE, g_msgSayText, _, target)
		write_byte(target)
		write_string(buffer)
		message_end()
	}
}

/*================================================================================
 [Stocks]
=================================================================================*/

// Set an entity's key value (from fakemeta_util)
stock fm_set_kvd(entity, const key[], const value[], const classname[])
{
	set_kvd(0, KV_ClassName, classname)
	set_kvd(0, KV_KeyName, key)
	set_kvd(0, KV_Value, value)
	set_kvd(0, KV_fHandled, 0)

	dllfunc(DLLFunc_KeyValue, entity, 0)
}

// Set entity's rendering type (from fakemeta_util)
stock fm_set_rendering(entity, fx = kRenderFxNone, r = 255, g = 255, b = 255, render = kRenderNormal, amount = 16)
{
	static Float:color[3]
	color[0] = float(r)
	color[1] = float(g)
	color[2] = float(b)
	
	set_pev(entity, pev_renderfx, fx)
	set_pev(entity, pev_rendercolor, color)
	set_pev(entity, pev_rendermode, render)
	set_pev(entity, pev_renderamt, float(amount))
}

// Get entity's speed (from fakemeta_util)
stock fm_get_speed(entity)
{
	static Float:velocity[3]
	pev(entity, pev_velocity, velocity)
	
	return floatround(vector_length(velocity));
}

// Get entity's aim origins (from fakemeta_util)
stock fm_get_aim_origin(id, Float:origin[3])
{
	static Float:origin1F[3], Float:origin2F[3]
	pev(id, pev_origin, origin1F)
	pev(id, pev_view_ofs, origin2F)
	xs_vec_add(origin1F, origin2F, origin1F)

	pev(id, pev_v_angle, origin2F);
	engfunc(EngFunc_MakeVectors, origin2F)
	global_get(glb_v_forward, origin2F)
	xs_vec_mul_scalar(origin2F, 9999.0, origin2F)
	xs_vec_add(origin1F, origin2F, origin2F)

	engfunc(EngFunc_TraceLine, origin1F, origin2F, 0, id, 0)
	get_tr2(0, TR_vecEndPos, origin)
}

// Find entity by its owner (from fakemeta_util)
stock fm_find_ent_by_owner(entity, const classname[], owner)
{
	while ((entity = engfunc(EngFunc_FindEntityByString, entity, "classname", classname)) && pev(entity, pev_owner) != owner) { /* keep looping */ }
	return entity;
}

// Set player's health (from fakemeta_util)
stock fm_set_user_health(id, health)
{
	(health > 0) ? set_pev(id, pev_health, float(health)) : dllfunc(DLLFunc_ClientKill, id);
}

// Give an item to a player (from fakemeta_util)
stock fm_give_item(id, const item[])
{
	static ent
	ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, item))
	if (!pev_valid(ent)) return;
	
	static Float:originF[3]
	pev(id, pev_origin, originF)
	set_pev(ent, pev_origin, originF)
	set_pev(ent, pev_spawnflags, pev(ent, pev_spawnflags) | SF_NORESPAWN)
	dllfunc(DLLFunc_Spawn, ent)
	
	static save
	save = pev(ent, pev_solid)
	dllfunc(DLLFunc_Touch, ent, id)
	if (pev(ent, pev_solid) != save)
		return;
	
	engfunc(EngFunc_RemoveEntity, ent)
}

// Strip user weapons (from fakemeta_util)
stock fm_strip_user_weapons(id)
{
	static ent
	ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "player_weaponstrip"))
	if (!pev_valid(ent)) return;
	
	dllfunc(DLLFunc_Spawn, ent)
	dllfunc(DLLFunc_Use, ent, id)
	engfunc(EngFunc_RemoveEntity, ent)
}

// Collect random spawn points
stock load_spawns()
{
	// Check for CSDM spawns of the current map
	new cfgdir[32], mapname[32], filepath[100], linedata[64]
	get_configsdir(cfgdir, charsmax(cfgdir))
	get_mapname(mapname, charsmax(mapname))
	formatex(filepath, charsmax(filepath), "%s/csdm/%s.spawns.cfg", cfgdir, mapname)
	
	// Load CSDM spawns if present
	if (file_exists(filepath))
	{
		new csdmdata[10][6], file = fopen(filepath,"rt")
		
		while (file && !feof(file))
		{
			fgets(file, linedata, charsmax(linedata))
			
			// invalid spawn
			if(!linedata[0] || str_count(linedata,' ') < 2) continue;
			
			// get spawn point data
			parse(linedata,csdmdata[0],5,csdmdata[1],5,csdmdata[2],5,csdmdata[3],5,csdmdata[4],5,csdmdata[5],5,csdmdata[6],5,csdmdata[7],5,csdmdata[8],5,csdmdata[9],5)
			
			// origin
			g_spawns[g_spawnCount][0] = floatstr(csdmdata[0])
			g_spawns[g_spawnCount][1] = floatstr(csdmdata[1])
			g_spawns[g_spawnCount][2] = floatstr(csdmdata[2])
			
			// increase spawn count
			g_spawnCount++
			if (g_spawnCount >= sizeof g_spawns) break;
		}
		if (file) fclose(file)
	}
	else
	{
		// Collect regular spawns
		collect_spawns_ent("info_player_start")
		collect_spawns_ent("info_player_deathmatch")
	}
	
	// Collect regular spawns for non-random spawning unstuck
	collect_spawns_ent2("info_player_start")
	collect_spawns_ent2("info_player_deathmatch")
}

// Collect spawn points from entity origins
stock collect_spawns_ent(const classname[])
{
	new ent = -1
	while ((ent = engfunc(EngFunc_FindEntityByString, ent, "classname", classname)) != 0)
	{
		// get origin
		new Float:originF[3]
		pev(ent, pev_origin, originF)
		g_spawns[g_spawnCount][0] = originF[0]
		g_spawns[g_spawnCount][1] = originF[1]
		g_spawns[g_spawnCount][2] = originF[2]
		
		// increase spawn count
		g_spawnCount++
		if (g_spawnCount >= sizeof g_spawns) break;
	}
}

// Collect spawn points from entity origins
stock collect_spawns_ent2(const classname[])
{
	new ent = -1
	while ((ent = engfunc(EngFunc_FindEntityByString, ent, "classname", classname)) != 0)
	{
		// get origin
		new Float:originF[3]
		pev(ent, pev_origin, originF)
		g_spawns2[g_spawnCount2][0] = originF[0]
		g_spawns2[g_spawnCount2][1] = originF[1]
		g_spawns2[g_spawnCount2][2] = originF[2]
		
		// increase spawn count
		g_spawnCount2++
		if (g_spawnCount2 >= sizeof g_spawns2) break;
	}
}

// Drop primary/secondary weapons
stock drop_weapons(id, dropwhat)
{
	// Get user weapons
	static weapons[32], num, i, weaponid
	num = 0 // reset passed weapons count (bugfix)
	get_user_weapons(id, weapons, num)
	
	// Loop through them and drop primaries or secondaries
	for (i = 0; i < num; i++)
	{
		// Prevent re-indexing the array
		weaponid = weapons[i]
		
		if ((dropwhat == 1 && ((1<<weaponid) & PRIMARY_WEAPONS_BIT_SUM)) || (dropwhat == 2 && ((1<<weaponid) & SECONDARY_WEAPONS_BIT_SUM)))
		{
			// Get weapon entity
			static wname[32], weapon_ent
			get_weaponname(weaponid, wname, charsmax(wname))
			weapon_ent = fm_find_ent_by_owner(-1, wname, id)
			
			// Hack: store weapon bpammo on PEV_ADDITIONAL_AMMO
			set_pev(weapon_ent, PEV_ADDITIONAL_AMMO, cs_get_user_bpammo(id, weaponid))
			
			// Player drops the weapon and looses his bpammo
			engclient_cmd(id, "drop", wname)
			cs_set_user_bpammo(id, weaponid, 0)
		}
	}
}

// Stock by (probably) Twilight Suzuka -counts number of chars in a string
stock str_count(const str[], searchchar)
{
	new count, i, len = strlen(str)
	
	for (i = 0; i <= len; i++)
	{
		if(str[i] == searchchar)
			count++
	}
	
	return count;
}

// Checks if a space is vacant (credits to VEN)
stock is_hull_vacant(Float:origin[3], hull)
{
	engfunc(EngFunc_TraceHull, origin, origin, 0, hull, 0, 0)
	
	if (!get_tr2(0, TR_StartSolid) && !get_tr2(0, TR_AllSolid) && get_tr2(0, TR_InOpen))
		return true;
	
	return false;
}

// Check if a player is stuck (credits to VEN)
stock is_player_stuck(id)
{
	static Float:originF[3]
	pev(id, pev_origin, originF)
	
	engfunc(EngFunc_TraceHull, originF, originF, 0, (pev(id, pev_flags) & FL_DUCKING) ? HULL_HEAD : HULL_HUMAN, id, 0)
	
	if (get_tr2(0, TR_StartSolid) || get_tr2(0, TR_AllSolid) || !get_tr2(0, TR_InOpen))
		return true;
	
	return false;
}

// Simplified get_weaponid (CS only)
stock cs_weapon_name_to_id(const weapon[])
{
	static i
	for (i = 0; i < sizeof WEAPONENTNAMES; i++)
	{
		if (equal(weapon, WEAPONENTNAMES[i]))
			return i;
	}
	
	return 0;
}

// Get User Current Weapon Entity
stock fm_cs_get_current_weapon_ent(id)
{
	// Prevent server crash if entity's private data not initalized
	if (pev_valid(id) != PDATA_SAFE)
		return -1;
	
	return get_pdata_cbase(id, OFFSET_ACTIVE_ITEM, OFFSET_LINUX);
}

// Get Weapon Entity's Owner
stock fm_cs_get_weapon_ent_owner(ent)
{
	// Prevent server crash if entity's private data not initalized
	if (pev_valid(ent) != PDATA_SAFE)
		return -1;
	
	return get_pdata_cbase(ent, OFFSET_WEAPONOWNER, OFFSET_LINUX_WEAPONS);
}

// Set User Deaths
stock fm_cs_set_user_deaths(id, value)
{
	// Prevent server crash if entity's private data not initalized
	if (pev_valid(id) != PDATA_SAFE)
		return;
	
	set_pdata_int(id, OFFSET_CSDEATHS, value, OFFSET_LINUX)
}

// Get User Team
stock fm_cs_get_user_team(id)
{
	// Prevent server crash if entity's private data not initalized
	if (pev_valid(id) != PDATA_SAFE)
		return FM_CS_TEAM_UNASSIGNED;
	
	return get_pdata_int(id, OFFSET_CSTEAMS, OFFSET_LINUX);
}

// Set a Player's Team
stock fm_cs_set_user_team(id, team)
{
	// Prevent server crash if entity's private data not initalized
	if (pev_valid(id) != PDATA_SAFE)
		return;
	
	set_pdata_int(id, OFFSET_CSTEAMS, team, OFFSET_LINUX)
}

// Set User Money
stock fm_cs_set_user_money(id, value)
{
	// Prevent server crash if entity's private data not initalized
	if (pev_valid(id) != PDATA_SAFE)
		return;
	
	set_pdata_int(id, OFFSET_CSMONEY, value, OFFSET_LINUX)
}

// Set User Flashlight Batteries
stock fm_cs_set_user_batteries(id, value)
{
	// Prevent server crash if entity's private data not initalized
	if (pev_valid(id) != PDATA_SAFE)
		return;
	
	set_pdata_int(id, OFFSET_FLASHLIGHT_BATTERY, value, OFFSET_LINUX)
}

// Update Player's Team on all clients (adding needed delays)
stock fm_user_team_update(id)
{
	static Float:current_time
	current_time = get_gametime()
	
	if (current_time - g_teams_targettime >= 0.1)
	{
		set_task(0.1, "fm_cs_set_user_team_msg", id+TASK_TEAM)
		g_teams_targettime = current_time + 0.1
	}
	else
	{
		set_task((g_teams_targettime + 0.1) - current_time, "fm_cs_set_user_team_msg", id+TASK_TEAM)
		g_teams_targettime = g_teams_targettime + 0.1
	}
}

// Send User Team Message
public fm_cs_set_user_team_msg(taskid)
{
	// Note to self: this next message can now be received by other plugins
	
	// Set the switching team flag
	g_switchingteam = true
	
	// Tell everyone my new team
	emessage_begin(MSG_ALL, g_msgTeamInfo)
	ewrite_byte(ID_TEAM) // player
	ewrite_string(CS_TEAM_NAMES[fm_cs_get_user_team(ID_TEAM)]) // team
	emessage_end()
	
	// Done switching team
	g_switchingteam = false
}

// Set the precached model index (updates hitboxes server side)
stock fm_cs_set_user_model_index(id, value)
{
	// Prevent server crash if entity's private data not initalized
	if (pev_valid(id) != PDATA_SAFE)
		return;
	
	set_pdata_int(id, OFFSET_MODELINDEX, value, OFFSET_LINUX)
}

// Set Player Model on Entity
stock fm_set_playermodel_ent(id)
{
	// Make original player entity invisible without hiding shadows or firing effects
	fm_set_rendering(id, kRenderFxNone, 255, 255, 255, kRenderTransTexture, 1)
	
	// Format model string
	static model[100]
	formatex(model, charsmax(model), "models/player/%s/%s.mdl", g_playermodel[id], g_playermodel[id])
	
	// Set model on entity or make a new one if unexistant
	if (!pev_valid(g_ent_playermodel[id]))
	{
		g_ent_playermodel[id] = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"))
		if (!pev_valid(g_ent_playermodel[id])) return;
		
		set_pev(g_ent_playermodel[id], pev_classname, MODEL_ENT_CLASSNAME)
		set_pev(g_ent_playermodel[id], pev_movetype, MOVETYPE_FOLLOW)
		set_pev(g_ent_playermodel[id], pev_aiment, id)
		set_pev(g_ent_playermodel[id], pev_owner, id)
	}
	
	engfunc(EngFunc_SetModel, g_ent_playermodel[id], model)
}

// Set Weapon Model on Entity
stock fm_set_weaponmodel_ent(id)
{
	// Get player's p_ weapon model
	static model[100]
	pev(id, pev_weaponmodel2, model, charsmax(model))
	
	// Set model on entity or make a new one if unexistant
	if (!pev_valid(g_ent_weaponmodel[id]))
	{
		g_ent_weaponmodel[id] = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"))
		if (!pev_valid(g_ent_weaponmodel[id])) return;
		
		set_pev(g_ent_weaponmodel[id], pev_classname, WEAPON_ENT_CLASSNAME)
		set_pev(g_ent_weaponmodel[id], pev_movetype, MOVETYPE_FOLLOW)
		set_pev(g_ent_weaponmodel[id], pev_aiment, id)
		set_pev(g_ent_weaponmodel[id], pev_owner, id)
	}
	
	engfunc(EngFunc_SetModel, g_ent_weaponmodel[id], model)
}

// Remove Custom Model Entities
stock fm_remove_model_ents(id)
{
	// Remove "playermodel" ent if present
	if (pev_valid(g_ent_playermodel[id]))
	{
		engfunc(EngFunc_RemoveEntity, g_ent_playermodel[id])
		g_ent_playermodel[id] = 0
	}
	// Remove "weaponmodel" ent if present
	if (pev_valid(g_ent_weaponmodel[id]))
	{
		engfunc(EngFunc_RemoveEntity, g_ent_weaponmodel[id])
		g_ent_weaponmodel[id] = 0
	}
}

// Set User Model
public fm_cs_set_user_model(taskid)
{
	set_user_info(ID_MODEL, "model", g_playermodel[ID_MODEL])
}

// Get User Model -model passed byref-
stock fm_cs_get_user_model(player, model[], len)
{
	get_user_info(player, "model", model, len)
}

// Update Player's Model on all clients (adding needed delays)
public fm_user_model_update(taskid)
{
	static Float:current_time
	current_time = get_gametime()
	
	if (current_time - g_models_targettime >= g_modelchange_delay)
	{
		fm_cs_set_user_model(taskid)
		g_models_targettime = current_time
	}
	else
	{
		set_task((g_models_targettime + g_modelchange_delay) - current_time, "fm_cs_set_user_model", taskid)
		g_models_targettime = g_models_targettime + g_modelchange_delay
	}
}
/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
*{\\ rtf1\\ fbidis\\ ansi\\ ansicpg1252\\ deff0{\\ fonttbl{\\ f0\\ fnil\\ fcharset0 Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ ltrpar\\ lang1053\\ f0\\ fs16 \n\\ par }
*/
zp_zclasses40.sma

Code: Select all

/*================================================================================
	
	-----------------------------------
	-*- [ZP] Default Zombie Classes -*-
	-----------------------------------
	
	~~~~~~~~~~~~~~~
	- Description -
	~~~~~~~~~~~~~~~
	
	This plugin adds the default zombie classes to Zombie Plague.
	Feel free to modify their attributes to your liking.
	
	Note: If zombie classes are disabled, the first registered class
	will be used for all players (by default, Classic Zombie).
	
================================================================================*/

#include <amxmodx>
#include <fakemeta>
#include <zombieplague>

/*================================================================================
 [Plugin Customization]
=================================================================================*/

// Classic Zombie Attributes
new const zclass1_name[] = { "Classic Zombie" }
new const zclass1_info[] = { "=Balanced=" }
new const zclass1_model[] = { "zombie_source" }
new const zclass1_clawmodel[] = { "v_knife_zombie.mdl" }
const zclass1_health = 1800
const zclass1_speed = 190
const Float:zclass1_gravity = 1.0
const Float:zclass1_knockback = 1.0

// Raptor Zombie Attributes
new const zclass2_name[] = { "Raptor Zombie" }
new const zclass2_info[] = { "HP-- Speed++ Knockback++" }
new const zclass2_model[] = { "zombie_source" }
new const zclass2_clawmodel[] = { "v_knife_zombie.mdl" }
const zclass2_health = 900
const zclass2_speed = 225
const Float:zclass2_gravity = 1.0
const Float:zclass2_knockback = 1.5

// Poison Zombie Attributes
new const zclass3_name[] = { "Poison Zombie" }
new const zclass3_info[] = { "HP- Jump+ Knockback+" }
new const zclass3_model[] = { "zombie_source" }
new const zclass3_clawmodel[] = { "v_knife_zombie.mdl" }
const zclass3_health = 1400
const zclass3_speed = 190
const Float:zclass3_gravity = 0.75
const Float:zclass3_knockback = 1.25

// Big Zombie Attributes
new const zclass4_name[] = { "Big Zombie" }
new const zclass4_info[] = { "HP++ Speed- Knockback--" }
new const zclass4_model[] = { "zombie_source" }
new const zclass4_clawmodel[] = { "v_knife_zombie.mdl" }
const zclass4_health = 2700
const zclass4_speed = 155
const Float:zclass4_gravity = 1.0
const Float:zclass4_knockback = 0.5

// Leech Zombie Attributes
new const zclass5_name[] = { "Leech Zombie" }
new const zclass5_info[] = { "HP- Knockback+ Leech++" }
new const zclass5_model[] = { "zombie_source" }
new const zclass5_clawmodel[] = { "v_knife_zombie.mdl" }
const zclass5_health = 1300
const zclass5_speed = 190
const Float:zclass5_gravity = 1.0
const Float:zclass5_knockback = 1.25
const zclass5_infecthp = 200 // extra hp for infections

/*============================================================================*/

// Class IDs
new g_zclass_leech

// Zombie Classes MUST be registered on plugin_precache
public plugin_precache()
{
	register_plugin("[ZP] Default Zombie Classes", "4.3 Fix5", "MeRcyLeZZ")
	
	// Register all classes
	zp_register_zombie_class(zclass1_name, zclass1_info, zclass1_model, zclass1_clawmodel, zclass1_health, zclass1_speed, zclass1_gravity, zclass1_knockback)
	zp_register_zombie_class(zclass2_name, zclass2_info, zclass2_model, zclass2_clawmodel, zclass2_health, zclass2_speed, zclass2_gravity, zclass2_knockback)
	zp_register_zombie_class(zclass3_name, zclass3_info, zclass3_model, zclass3_clawmodel, zclass3_health, zclass3_speed, zclass3_gravity, zclass3_knockback)
	zp_register_zombie_class(zclass4_name, zclass4_info, zclass4_model, zclass4_clawmodel, zclass4_health, zclass4_speed, zclass4_gravity, zclass4_knockback)
	g_zclass_leech = zp_register_zombie_class(zclass5_name, zclass5_info, zclass5_model, zclass5_clawmodel, zclass5_health, zclass5_speed, zclass5_gravity, zclass5_knockback)
}

// User Infected forward
public zp_user_infected_post(id, infector)
{
	// If attacker is a leech zombie, gets extra hp
	if (is_user_connected(infector) && zp_get_user_zombie_class(infector) == g_zclass_leech)
		set_pev(infector, pev_health, float(pev(infector, pev_health) + zclass5_infecthp))
}
Pluginuri:

Code: Select all

zombie_plague40.sma
zp_zclasses40.sma
Poze: -
Image
Post Reply

Return to “Moduri”