Raised This Month: $12 Target: $400
 3% 

How to add 2 plugin for mode?


Post New Thread Reply   
 
Thread Tools Display Modes
Relaxing
AlliedModders Donor
Join Date: Jun 2016
Location: White Plains
Old 09-29-2017 , 14:08   Re: How to add 2 plugin for mode?
Reply With Quote #11

Mistakes were made:
- if (get_user_flags(id) == read_flags("bit"))
__________________

Last edited by Relaxing; 09-29-2017 at 14:08. Reason: another one
Relaxing is offline
edon1337
Penguin Enthusiast
Join Date: Jun 2016
Location: Macedonia
Old 09-29-2017 , 15:17   Re: How to add 2 plugin for mode?
Reply With Quote #12

Quote:
Originally Posted by Relaxing View Post
Mistakes were made:
- if (get_user_flags(id) == read_flags("bit"))
Still won't work.
__________________
edon1337 is offline
Wats0N
Member
Join Date: Aug 2016
Old 09-29-2017 , 18:01   Re: How to add 2 plugin for mode?
Reply With Quote #13

I transcribed it, but I did not compiled it..

error log:
Code:
Welcome to the AMX Mod X 1.8.1-300 Compiler.
Copyright (c) 1997-2013 ITB CompuPhase, AMX Mod X Team

Warning: Loose indentation on line 660
Error: Undefined symbol "entity_set_string" on line 676
Warning: Expression has no effect on line 676
Error: Expected token: ";", but found ")" on line 676
Error: Invalid expression, assumed zero on line 676
Error: Too many error messages on one line on line 676

Compilation aborted.
4 Errors.
Could not locate output file C:\Users\user1\Desktop\biohazard.amx (compile failed).
sma:

PHP Code:
 /* Biohazard mod
*   
*  by Cheap_Suit
*
*  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 2 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, write to the Free Software Foundation,
*  Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*  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.
*/

#define VERSION    "2.00 Beta 3"

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

#tryinclude "biohazard.cfg"

#if !defined _biohazardcfg_included
    #assert Biohazard configuration file required!
#elseif AMXX_VERSION_NUM < 180
    #assert AMX Mod X v1.8.0 or greater required!
#endif

#define OFFSET_DEATH 444
#define OFFSET_TEAM 114
#define OFFSET_ARMOR 112
#define OFFSET_NVG 129
#define OFFSET_CSMONEY 115
#define OFFSET_PRIMARYWEAPON 116
#define OFFSET_WEAPONTYPE 43
#define OFFSET_CLIPAMMO    51
#define EXTRAOFFSET_WEAPONS 4

#define OFFSET_AMMO_338MAGNUM 377
#define OFFSET_AMMO_762NATO 378
#define OFFSET_AMMO_556NATOBOX 379
#define OFFSET_AMMO_556NATO 380
#define OFFSET_AMMO_BUCKSHOT 381
#define OFFSET_AMMO_45ACP 382
#define OFFSET_AMMO_57MM 383
#define OFFSET_AMMO_50AE 384
#define OFFSET_AMMO_357SIG 385
#define OFFSET_AMMO_9MM 386

#define OFFSET_LASTPRIM 368
#define OFFSET_LASTSEC 369
#define OFFSET_LASTKNI 370

#define TASKID_STRIPNGIVE 698
#define TASKID_NEWROUND    641
#define TASKID_INITROUND 222
#define TASKID_STARTROUND 153
#define TASKID_BALANCETEAM 375
#define TASKID_UPDATESCR 264
#define TASKID_SPAWNDELAY 786
#define TASKID_WEAPONSMENU 564
#define TASKID_CHECKSPAWN 423
#define TASKID_CZBOTPDATA 312

#define EQUIP_PRI (1<<0)
#define EQUIP_SEC (1<<1)
#define EQUIP_GREN (1<<2)
#define EQUIP_ALL (1<<0 | 1<<1 | 1<<2)

#define HAS_NVG (1<<0)
#define ATTRIB_BOMB (1<<1)
#define DMG_HEGRENADE (1<<24)

#define MODEL_CLASSNAME "player_model"
#define IMPULSE_FLASHLIGHT 100

#define MAX_SPAWNS 128
#define MAX_CLASSES 10
#define MAX_DATA 11

#define DATA_HEALTH 0
#define DATA_SPEED 1
#define DATA_GRAVITY 2
#define DATA_ATTACK 3
#define DATA_DEFENCE 4
#define DATA_HEDEFENCE 5
#define DATA_HITSPEED 6
#define DATA_HITDELAY 7
#define DATA_REGENDLY 8
#define DATA_HITREGENDLY 9
#define DATA_KNOCKBACK 10

#define fm_get_user_team(%1) get_pdata_int(%1, OFFSET_TEAM)
#define fm_get_user_deaths(%1) get_pdata_int(%1, OFFSET_DEATH)
#define fm_set_user_deaths(%1,%2) set_pdata_int(%1, OFFSET_DEATH, %2)
#define fm_get_user_money(%1) get_pdata_int(%1, OFFSET_CSMONEY)
#define fm_get_user_armortype(%1) get_pdata_int(%1, OFFSET_ARMOR)
#define fm_set_user_armortype(%1,%2) set_pdata_int(%1, OFFSET_ARMOR, %2)
#define fm_get_weapon_id(%1) get_pdata_int(%1, OFFSET_WEAPONTYPE, EXTRAOFFSET_WEAPONS)
#define fm_get_weapon_ammo(%1) get_pdata_int(%1, OFFSET_CLIPAMMO, EXTRAOFFSET_WEAPONS)
#define fm_set_weapon_ammo(%1,%2) set_pdata_int(%1, OFFSET_CLIPAMMO, %2, EXTRAOFFSET_WEAPONS)
#define fm_reset_user_primary(%1) set_pdata_int(%1, OFFSET_PRIMARYWEAPON, 0)
#define fm_lastprimary(%1) get_pdata_cbase(id, OFFSET_LASTPRIM)
#define fm_lastsecondry(%1) get_pdata_cbase(id, OFFSET_LASTSEC)
#define fm_lastknife(%1) get_pdata_cbase(id, OFFSET_LASTKNI)
#define fm_get_user_model(%1,%2,%3) engfunc(EngFunc_InfoKeyValue, engfunc(EngFunc_GetInfoKeyBuffer, %1), "model", %2, %3) 

#define _random(%1) random_num(0, %1 - 1)
#define AMMOWP_NULL (1<<0 | 1<<CSW_KNIFE | 1<<CSW_FLASHBANG | 1<<CSW_HEGRENADE | 1<<CSW_SMOKEGRENADE | 1<<CSW_C4)

enum
{
    
MAX_CLIP 0,
    
MAX_AMMO
}

enum
{
    
MENU_PRIMARY 1,
    
MENU_SECONDARY
}

enum
{
    
CS_TEAM_UNASSIGNED 0,
    
CS_TEAM_T,
    
CS_TEAM_CT,
    
CS_TEAM_SPECTATOR
}

enum
{
    
CS_ARMOR_NONE 0,
    
CS_ARMOR_KEVLAR,
    
CS_ARMOR_VESTHELM
}

enum
{
    
KBPOWER_357SIG 0,
    
KBPOWER_762NATO,
    
KBPOWER_BUCKSHOT,
    
KBPOWER_45ACP,
    
KBPOWER_556NATO,
    
KBPOWER_9MM,
    
KBPOWER_57MM,
    
KBPOWER_338MAGNUM,
    
KBPOWER_556NATOBOX,
    
KBPOWER_50AE
}

new const 
g_weapon_ammo[][] =
{
    { -
1, -},
    { 
1352 },
    { -
1, -},
    { 
1090 },
    { -
1, -},
    { 
732 },
    { -
1, -},
    { 
30100 },
    { 
3090 },
    { -
1, -},
    { 
30120 },
    { 
20100 },
    { 
25100 },
    { 
3090 },
    { 
3590 },
    { 
2590 },
    { 
12100 },
    { 
20120 },
    { 
1030 },
    { 
30120 },
    { 
100200 },
    { 
832 },
    { 
3090 },
    { 
30120 },
    { 
2090 },
    { -
1, -},
    { 
735 },
    { 
3090 },
    { 
3090 },
    { -
1, -},
    { 
50100 }
}

new const 
g_weapon_knockback[] =
{
    -
1
    
KBPOWER_357SIG
    -
1
    
KBPOWER_762NATO
    -
1
    
KBPOWER_BUCKSHOT
    -
1
    
KBPOWER_45ACP
    
KBPOWER_556NATO
    -
1
    
KBPOWER_9MM
    
KBPOWER_57MM,
    
KBPOWER_45ACP
    
KBPOWER_556NATO
    
KBPOWER_556NATO
    
KBPOWER_556NATO
    
KBPOWER_45ACP,
    
KBPOWER_9MM
    
KBPOWER_338MAGNUM,
    
KBPOWER_9MM
    
KBPOWER_556NATOBOX,
    
KBPOWER_BUCKSHOT
    
KBPOWER_556NATO
    
KBPOWER_9MM
    
KBPOWER_762NATO
    -
1
    
KBPOWER_50AE
    
KBPOWER_556NATO
    
KBPOWER_762NATO
    -
1
    
KBPOWER_57MM
}

new const 
g_remove_entities[][] = 

    
"func_bomb_target",    
    
"info_bomb_target"
    
"hostage_entity",      
    
"monster_scientist"
    
"func_hostage_rescue"
    
"info_hostage_rescue",
    
"info_vip_start",      
    
"func_vip_safetyzone"
    
"func_escapezone",     
    
"func_buyzone"
}

new const 
g_dataname[][] = 

    
"HEALTH"
    
"SPEED"
    
"GRAVITY"
    
"ATTACK"
    
"DEFENCE"
    
"HEDEFENCE"
    
"HITSPEED"
    
"HITDELAY"
    
"REGENDLY"
    
"HITREGENDLY"
    
"KNOCKBACK" 
}
new const 
g_teaminfo[][] = 

    
"UNASSIGNED"
    
"TERRORIST",
    
"CT",
    
"SPECTATOR" 
}

new 
g_maxplayersg_spawncountg_buyzoneg_botclient_pdatag_sync_hpdisplay
    
g_sync_msgdisplayg_fwd_spawng_fwd_resultg_fwd_infectg_fwd_gamestart
    
g_msg_flashlightg_msg_teaminfog_msg_scoreattribg_msg_moneyg_msg_scoreinfo
    
g_msg_deathmsg g_msg_screenfadeFloat:g_buytime,  Float:g_spawns[MAX_SPAWNS+1][9],
    
Float:g_vecvel[3], bool:g_brestorevelbool:g_infectingbool:g_gamestarted,
    
bool:g_roundstartedbool:g_roundendedbool:g_czerog_class_name[MAX_CLASSES+1][32], 
    
g_classcountg_class_desc[MAX_CLASSES+1][32], g_class_pmodel[MAX_CLASSES+1][64], 
    
g_class_wmodel[MAX_CLASSES+1][64], Float:g_class_data[MAX_CLASSES+1][MAX_DATA]
    
new 
cvar_randomspawncvar_skynamecvar_autoteambalance[4], cvar_starttimecvar_autonvg
    
cvar_winsoundscvar_weaponsmenucvar_lightscvar_killbonuscvar_enabled
    
cvar_gamedescriptioncvar_botquotacvar_maxzombiescvar_flashbangcvar_buytime,
    
cvar_respawnaszombiecvar_punishsuicidecvar_infectmoneycvar_showtruehealth,
    
cvar_obeyarmorcvar_impactexplodecvar_caphealthdisplaycvar_zombie_hpmulti,
    
cvar_randomclasscvar_zombiemulticvar_knockbackcvar_knockback_distcvar_ammo,
    
cvar_knockback_duckcvar_killrewardcvar_painshockfreecvar_zombie_class,
    
cvar_shootobjectscvar_pushpwr_weaponcvar_pushpwr_zombie
    
new bool:g_zombie[33], bool:g_falling[33], bool:g_disconnected[33], bool:g_blockmodel[33], 
    
bool:g_showmenu[33], bool:g_menufailsafe[33], bool:g_preinfect[33], bool:g_welcomemsg[33], 
    
bool:g_suicide[33], Float:g_regendelay[33], Float:g_hitdelay[33], g_mutate[33], g_victim[33], 
    
g_modelent[33], g_menuposition[33], g_player_class[33], g_player_weapons[33][2]

public 
plugin_precache()
{
    
register_plugin("Biohazard"VERSION"cheap_suit")
    
register_cvar("bh_version"VERSIONFCVAR_SPONLY|FCVAR_SERVER)
    
set_cvar_string("bh_version"VERSION)
    
    
cvar_enabled register_cvar("bh_enabled""1")

    if(!
get_pcvar_num(cvar_enabled)) 
        return
    
    
cvar_gamedescription register_cvar("bh_gamedescription""Biohazard")
    
cvar_skyname register_cvar("bh_skyname""drkg")
    
cvar_lights register_cvar("bh_lights""d")
    
cvar_starttime register_cvar("bh_starttime""15.0")
    
cvar_buytime register_cvar("bh_buytime""0")
    
cvar_randomspawn register_cvar("bh_randomspawn""0")
    
cvar_punishsuicide register_cvar("bh_punishsuicide""1")
    
cvar_winsounds register_cvar("bh_winsounds""1")
    
cvar_autonvg register_cvar("bh_autonvg""1")
    
cvar_respawnaszombie register_cvar("bh_respawnaszombie""1")
    
cvar_painshockfree register_cvar("bh_painshockfree""1")
    
cvar_knockback register_cvar("bh_knockback""1")
    
cvar_knockback_duck register_cvar("bh_knockback_duck""1")
    
cvar_knockback_dist register_cvar("bh_knockback_dist""280.0")
    
cvar_obeyarmor register_cvar("bh_obeyarmor""0")
    
cvar_infectmoney register_cvar("bh_infectionmoney""0")
    
cvar_caphealthdisplay register_cvar("bh_caphealthdisplay""1")
    
cvar_weaponsmenu register_cvar("bh_weaponsmenu""1")
    
cvar_ammo register_cvar("bh_ammo""1")
    
cvar_maxzombies register_cvar("bh_maxzombies""31")
    
cvar_flashbang register_cvar("bh_flashbang""1")
    
cvar_impactexplode register_cvar("bh_impactexplode""1")
    
cvar_showtruehealth register_cvar("bh_showtruehealth""1")
    
cvar_zombiemulti register_cvar("bh_zombie_countmulti""0.15")
    
cvar_zombie_hpmulti register_cvar("bh_zombie_hpmulti""2.0")
    
cvar_zombie_class register_cvar("bh_zombie_class""1")
    
cvar_randomclass register_cvar("bh_randomclass""1")
    
cvar_killbonus register_cvar("bh_kill_bonus""1")
    
cvar_killreward register_cvar("bh_kill_reward""2")
    
cvar_shootobjects register_cvar("bh_shootobjects""1")
    
cvar_pushpwr_weapon register_cvar("bh_pushpwr_weapon""2.0")
    
cvar_pushpwr_zombie register_cvar("bh_pushpwr_zombie""5.0")
    
    new 
file[64]
    
get_configsdir(file63)
    
format(file63"%s/bh_cvars.cfg"file)
    
    if(
file_exists(file)) 
        
server_cmd("exec %s"file)
    
    new 
mapname[32]
    
get_mapname(mapname31)
    
register_spawnpoints(mapname)
        
    
register_zombieclasses("bh_zombieclass.ini")
    
register_dictionary("biohazard.txt")
    
    
precache_model(DEFAULT_PMODEL)
    
precache_model(DEFAULT_WMODEL)
    
    new 
i
    
for(0g_classcounti++)
    {
        
precache_model(g_class_pmodel[i])
        
precache_model(g_class_wmodel[i])
    }
    
    for(
0sizeof g_zombie_miss_soundsi++)
        
precache_sound(g_zombie_miss_sounds[i])
    
    for(
0sizeof g_zombie_hit_soundsi++) 
        
precache_sound(g_zombie_hit_sounds[i])
    
    for(
0sizeof g_scream_soundsi++) 
        
precache_sound(g_scream_sounds[i])
    
    for(
0sizeof g_zombie_die_soundsi++)
        
precache_sound(g_zombie_die_sounds[i])
    
    for(
0sizeof g_zombie_win_soundsi++) 
        
precache_sound(g_zombie_win_sounds[i])
    
    
g_fwd_spawn register_forward(FM_Spawn"fwd_spawn")
    
    
g_buyzone engfunc(EngFunc_CreateNamedEntityengfunc(EngFunc_AllocString"func_buyzone"))
    if(
g_buyzone
    {
        
dllfunc(DLLFunc_Spawng_buyzone)
        
set_pev(g_buyzonepev_solidSOLID_NOT)
    }
    
    new 
ent engfunc(EngFunc_CreateNamedEntityengfunc(EngFunc_AllocString"info_bomb_target"))
    if(
ent
    {
        
dllfunc(DLLFunc_Spawnent)
        
set_pev(entpev_solidSOLID_NOT)
    }

    
#if FOG_ENABLE
    
ent engfunc(EngFunc_CreateNamedEntityengfunc(EngFunc_AllocString"env_fog"))
    if(
ent)
    {
        
fm_set_kvd(ent"density"FOG_DENSITY"env_fog")
        
fm_set_kvd(ent"rendercolor"FOG_COLOR"env_fog")
    }
    
#endif
}

public 
plugin_init()
{
    if(!
get_pcvar_num(cvar_enabled)) 
        return
    
    
cvar_botquota get_cvar_pointer("bot_quota")
    
cvar_autoteambalance[0] = get_cvar_pointer("mp_autoteambalance")
    
cvar_autoteambalance[1] = get_pcvar_num(cvar_autoteambalance[0])
    
set_pcvar_num(cvar_autoteambalance[0], 0)

    
register_clcmd("jointeam""cmd_jointeam")
    
register_clcmd("say /class""cmd_classmenu")
    
register_clcmd("say /guns""cmd_enablemenu")
    
register_clcmd("say /help""cmd_helpmotd")
    
register_clcmd("amx_infect""cmd_infectuser"ADMIN_BAN"<name or #userid>")
    
    
register_menu("Equipment"1023"action_equip")
    
register_menu("Primary"1023"action_prim")
    
register_menu("Secondary"1023"action_sec")
    
register_menu("Class"1023"action_class")
    
    
unregister_forward(FM_Spawng_fwd_spawn)
    
register_forward(FM_CmdStart"fwd_cmdstart")
    
register_forward(FM_EmitSound"fwd_emitsound")
    
register_forward(FM_GetGameDescription"fwd_gamedescription")
    
register_forward(FM_CreateNamedEntity"fwd_createnamedentity")
    
register_forward(FM_ClientKill"fwd_clientkill")
    
register_forward(FM_PlayerPreThink"fwd_player_prethink")
    
register_forward(FM_PlayerPreThink"fwd_player_prethink_post"1)
    
register_forward(FM_PlayerPostThink"fwd_player_postthink")
    
register_forward(FM_SetClientKeyValue"fwd_setclientkeyvalue")

    
RegisterHam(Ham_TakeDamage"player""bacon_takedamage_player")
    
RegisterHam(Ham_Killed"player""bacon_killed_player")
    
RegisterHam(Ham_Spawn"player""bacon_spawn_player_post"1)
    
RegisterHam(Ham_TraceAttack"player""bacon_traceattack_player")
    
RegisterHam(Ham_TraceAttack"func_pushable""bacon_traceattack_pushable")
    
RegisterHam(Ham_Use"func_tank""bacon_use_tank")
    
RegisterHam(Ham_Use"func_tankmortar""bacon_use_tank")
    
RegisterHam(Ham_Use"func_tankrocket""bacon_use_tank")
    
RegisterHam(Ham_Use"func_tanklaser""bacon_use_tank")
    
RegisterHam(Ham_Use"func_pushable""bacon_use_pushable")
    
RegisterHam(Ham_Touch"func_pushable""bacon_touch_pushable")
    
RegisterHam(Ham_Touch"weaponbox""bacon_touch_weapon")
    
RegisterHam(Ham_Touch"armoury_entity""bacon_touch_weapon")
    
RegisterHam(Ham_Touch"weapon_shield""bacon_touch_weapon")
    
RegisterHam(Ham_Touch"grenade""bacon_touch_grenade")
    
    
register_message(get_user_msgid("Health"), "msg_health")
    
register_message(get_user_msgid("TextMsg"), "msg_textmsg")
    
register_message(get_user_msgid("SendAudio"), "msg_sendaudio")
    
register_message(get_user_msgid("StatusIcon"), "msg_statusicon")
    
register_message(get_user_msgid("ScoreAttrib"), "msg_scoreattrib")
    
register_message(get_user_msgid("DeathMsg"), "msg_deathmsg")
    
register_message(get_user_msgid("ScreenFade"), "msg_screenfade")
    
register_message(get_user_msgid("TeamInfo"), "msg_teaminfo")
    
register_message(get_user_msgid("ClCorpse"), "msg_clcorpse")
    
register_message(get_user_msgid("WeapPickup"), "msg_weaponpickup")
    
register_message(get_user_msgid("AmmoPickup"), "msg_ammopickup")
    
    
register_event("TextMsg""event_textmsg""a""2=#Game_will_restart_in")
    
register_event("HLTV""event_newround""a""1=0""2=0")
    
register_event("CurWeapon""event_curweapon""be""1=1")
    
register_event("ArmorType""event_armortype""be")
    
register_event("Damage""event_damage""be")
    
    
register_logevent("logevent_round_start"2"1=Round_Start")
    
register_logevent("logevent_round_end"2"1=Round_End")
    
    
g_msg_flashlight get_user_msgid("Flashlight")
    
g_msg_teaminfo get_user_msgid("TeamInfo")
    
g_msg_scoreattrib get_user_msgid("ScoreAttrib")
    
g_msg_scoreinfo get_user_msgid("ScoreInfo")
    
g_msg_deathmsg get_user_msgid("DeathMsg")
    
g_msg_money get_user_msgid("Money")
    
g_msg_screenfade get_user_msgid("ScreenFade")
    
    
g_fwd_infect CreateMultiForward("event_infect"ET_IGNOREFP_CELLFP_CELL)
    
g_fwd_gamestart CreateMultiForward("event_gamestart"ET_IGNORE)

    
g_sync_hpdisplay CreateHudSyncObj()
    
g_sync_msgdisplay CreateHudSyncObj()
    
    
g_maxplayers get_maxplayers()
    
    new 
mod[3]
    
get_modname(mod2)
    
    
g_czero = (mod[0] == 'c' && mod[1] == 'z') ? true false
    
    
new skyname[32]
    
get_pcvar_string(cvar_skynameskyname31)
        
    if(
strlen(skyname) > 0)
        
set_cvar_string("sv_skyname"skyname)
    
    new 
lights[2]
    
get_pcvar_string(cvar_lightslights1)
    
    if(
strlen(lights) > 0)
    {
        
set_task(3.0"task_lights"___"b")
        
        
set_cvar_num("sv_skycolor_r"0)
        
set_cvar_num("sv_skycolor_g"0)
        
set_cvar_num("sv_skycolor_b"0)
    }
    
    if(
get_pcvar_num(cvar_showtruehealth))
        
set_task(0.1"task_showtruehealth"___"b")
}

public 
plugin_end()
{
    if(
get_pcvar_num(cvar_enabled))
        
set_pcvar_num(cvar_autoteambalance[0], cvar_autoteambalance[1])
}

public 
plugin_natives()
{
    
register_library("biohazardf")
    
register_native("preinfect_user""native_preinfect_user"1)
    
register_native("infect_user""native_infect_user"1)
    
register_native("cure_user""native_cure_user"1)
    
register_native("register_class""native_register_class"1)
    
register_native("get_class_id""native_get_class_id"1)
    
register_native("set_class_pmodel""native_set_class_pmodel"1)
    
register_native("set_class_wmodel""native_set_class_wmodel"1)
    
register_native("set_class_data""native_set_class_data"1)
    
register_native("get_class_data""native_get_class_data"1)
    
register_native("game_started""native_game_started"1)
    
register_native("is_user_zombie""native_is_user_zombie"1)
    
register_native("is_user_infected""native_is_user_infected"1)
    
register_native("get_user_class""native_get_user_class",  1)
}

public 
client_connect(id)
{
    
g_showmenu[id] = true
    g_welcomemsg
[id] = true
    g_blockmodel
[id] = true
    g_zombie
[id] = false
    g_preinfect
[id] = false
    g_disconnected
[id] = false
    g_falling
[id] = false
    g_menufailsafe
[id] = false
    g_victim
[id] = 0
    g_mutate
[id] = -1
    g_player_class
[id] = 0
    g_player_weapons
[id][0] = -1
    g_player_weapons
[id][1] = -1
    g_regendelay
[id] = 0.0
    g_hitdelay
[id] = 0.0

    remove_user_model
(g_modelent[id])
}

public 
client_putinserver(id)
{
    if(!
g_botclient_pdata && g_czero
    {
        static 
param[1]
        
param[0] = id
        
        
if(!task_exists(TASKID_CZBOTPDATA))
            
set_task(1.0"task_botclient_pdata"TASKID_CZBOTPDATAparam1)
    }
    
    if(
get_pcvar_num(cvar_randomclass) && g_classcount 1)
        
g_player_class[id] = _random(g_classcount)
}

public 
client_disconnect(id)
{
    
remove_task(TASKID_STRIPNGIVE id)
    
remove_task(TASKID_UPDATESCR id)
    
remove_task(TASKID_SPAWNDELAY id)
    
remove_task(TASKID_WEAPONSMENU id)
    
remove_task(TASKID_CHECKSPAWN id)

    
g_disconnected[id] = true
    remove_user_model
(g_modelent[id])
}

public 
cmd_jointeam(id)
{
    if(
is_user_alive(id) && g_zombie[id])
    {
        
client_print(idprint_center"%L"id"CMD_TEAMCHANGE")
        return 
PLUGIN_HANDLED
    
}
    return 
PLUGIN_CONTINUE
}

public 
cmd_classmenu(id)
    if(
g_classcount 1display_classmenu(idg_menuposition[id] = 0)
    
public 
cmd_enablemenu(id)
{    
    if(
get_pcvar_num(cvar_weaponsmenu))
    {
        
client_print(idprint_chat"%L"idg_showmenu[id] == false "MENU_REENABLED" "MENU_ALENABLED")
        
g_showmenu[id] = true
    
}
}

public 
cmd_helpmotd(id)
{
    static 
motd[2048]
    
formatex(motd2047"%L"id"HELP_MOTD")
    
replace(motd2047"#Version#"VERSION)
    
    
show_motd(idmotd"Biohazard Help")
}    

public 
cmd_infectuser(idlevelcid)
{
    if(!
cmd_access(idlevelcid2))
        return 
PLUGIN_HANDLED_MAIN
    
    
static arg1[32]
    
read_argv(1arg131)
    
    static 
target
    target 
cmd_target(idarg1, (CMDTARGET_OBEY_IMMUNITY|CMDTARGET_ALLOW_SELF|CMDTARGET_ONLY_ALIVE))
    
    if(!
is_user_connected(target) || g_zombie[target])
        return 
PLUGIN_HANDLED_MAIN
    
    
if(!allow_infection())
    {
        
console_print(id"%L"id"CMD_MAXZOMBIES")
        return 
PLUGIN_HANDLED_MAIN
    
}
    
    if(!
g_gamestarted)
    {
        
console_print(id"%L"id"CMD_GAMENOTSTARTED")
        return 
PLUGIN_HANDLED_MAIN
    
}
            
    static 
name[32
    
get_user_name(targetname31)
    
    
console_print(id"%L"id"CMD_INFECTED"name)
    
infect_user(target0)
    
    return 
PLUGIN_HANDLED_MAIN
}

public 
skins(id)
{
static 
pModel[56]
    if(
get_user_flags(id) & ADMIN_LEVEL_A)
    {
        
format(pModel55"models/bhskins/owners/owner1.mdl")
    }
    if(
get_user_flags(id) & ADMIN_BAN)
    {
        
format(pModel55"models/bhskins/admins/admin1.mdl")
    }
    if(
get_user_flags(id) & ADMIN_LEVEL_H)
    {
        
format(pModel55"models/bhskins/vips/vip1.mdl")
    }
    if(
get_user_flags(id) & ADMIN_KICK)
    {
        
format(pModel55"models/bhskins/others/other1.mdl")
    }
    
entity_set_string(idEV_SZ_modelpModel)
}
return 
PLUGIN_*
}  

public 
msg_teaminfo(msgiddestid)
{
    if(!
g_gamestarted)
        return 
PLUGIN_CONTINUE

    
static team[2]
    
get_msg_arg_string(2team1)
    
    if(
team[0] != 'U')
        return 
PLUGIN_CONTINUE

    id 
get_msg_arg_int(1)
    if(
is_user_alive(id) || !g_disconnected[id])
        return 
PLUGIN_CONTINUE

    g_disconnected
[id] = false
    id 
randomly_pick_zombie()
    if(
id)
    {
        
fm_set_user_team(idg_zombie[id] ? CS_TEAM_CT CS_TEAM_T0)
        
set_pev(idpev_deadflagDEAD_RESPAWNABLE)
    }
    return 
PLUGIN_CONTINUE
}

public 
msg_screenfade(msgiddestid)
{
    if(!
get_pcvar_num(cvar_flashbang))
        return 
PLUGIN_CONTINUE
    
    
if(!g_zombie[id] || !is_user_alive(id))
    {
        static 
data[4]
        
data[0] = get_msg_arg_int(4)
        
data[1] = get_msg_arg_int(5)
        
data[2] = get_msg_arg_int(6)
        
data[3] = get_msg_arg_int(7)
        
        if(
data[0] == 255 && data[1] == 255 && data[2] == 255 && data[3] > 199)
            return 
PLUGIN_HANDLED
    
}
    return 
PLUGIN_CONTINUE
}

public 
msg_scoreattrib(msgiddestid)
{
    static 
attrib 
    attrib 
get_msg_arg_int(2)
    
    if(
attrib == ATTRIB_BOMB)
        
set_msg_arg_int(2ARG_BYTE0)
}

public 
msg_statusicon(msgiddestid)
{
    static 
icon[3]
    
get_msg_arg_string(2icon2)
    
    return (
icon[0] == 'c' && icon[1] == '4') ? PLUGIN_HANDLED PLUGIN_CONTINUE
}

public 
msg_weaponpickup(msgiddestid)
    return 
g_zombie[id] ? PLUGIN_HANDLED PLUGIN_CONTINUE

public msg_ammopickup(msgiddestid)
    return 
g_zombie[id] ? PLUGIN_HANDLED PLUGIN_CONTINUE

public msg_deathmsg(msgiddestid
{
    static 
killer
    killer 
get_msg_arg_int(1)

    if(
is_user_connected(killer) && g_zombie[killer])
        
set_msg_arg_string(4g_zombie_weapname)
}

public 
msg_sendaudio(msgiddestid)
{
    if(!
get_pcvar_num(cvar_winsounds))
        return 
PLUGIN_CONTINUE
    
    
static audiocode [22]
    
get_msg_arg_string(2audiocode21)
    
    if(
equal(audiocode[7], "terwin"))
        
set_msg_arg_string(2g_zombie_win_sounds[_random(sizeof g_zombie_win_sounds)])
    else if(
equal(audiocode[7], "ctwin"))
        
set_msg_arg_string(2g_survivor_win_sounds[_random(sizeof g_survivor_win_sounds)])
    
    return 
PLUGIN_CONTINUE
}

public 
msg_health(msgiddestid)
{
    if(!
get_pcvar_num(cvar_caphealthdisplay))
        return 
PLUGIN_CONTINUE
    
    
static health
    health 
get_msg_arg_int(1)
        
    if(
health 255
        
set_msg_arg_int(1ARG_BYTE255)
    
    return 
PLUGIN_CONTINUE
}

public 
msg_textmsg(msgiddestid)
{
    if(
get_msg_arg_int(1) != 4)
        return 
PLUGIN_CONTINUE
    
    
static txtmsg[25], winmsg[32]
    
get_msg_arg_string(2txtmsg24)
    
    if(
equal(txtmsg[1], "Game_bomb_drop"))
        return 
PLUGIN_HANDLED

    
else if(equal(txtmsg[1], "Terrorists_Win"))
    {
        
formatex(winmsg31"%L"LANG_SERVER"WIN_TXT_ZOMBIES")
        
set_msg_arg_string(2winmsg)
    }
    else if(
equal(txtmsg[1], "Target_Saved") || equal(txtmsg[1], "CTs_Win"))
    {
        
formatex(winmsg31"%L"LANG_SERVER"WIN_TXT_SURVIVORS")
        
set_msg_arg_string(2winmsg)
    }
    return 
PLUGIN_CONTINUE
}

public 
msg_clcorpse(msgiddestid)
{
    
id get_msg_arg_int(12)
    if(!
g_zombie[id])
        return 
PLUGIN_CONTINUE
    
    
static ent
    ent 
fm_find_ent_by_owner(-1MODEL_CLASSNAMEid)
    
    if(
ent)
    {
        static 
model[64]
        
pev(entpev_modelmodel63)
        
        
set_msg_arg_string(1model)
    }
    return 
PLUGIN_CONTINUE
}

public 
logevent_round_start()
{
    
g_roundended false
    g_roundstarted 
true
    
    
if(get_pcvar_num(cvar_weaponsmenu))
    {
        static 
idteam
        
for(id 1id <= g_maxplayersid++) if(is_user_alive(id))
        {
            
team fm_get_user_team(id)
            if(
team == CS_TEAM_T || team == CS_TEAM_CT)
            {
                if(
is_user_bot(id)) 
                    
bot_weapons(id)
                else 
                {
                    if(
g_showmenu[id])
                    {
                        
add_delay(id"display_equipmenu")
                        
                        
g_menufailsafe[id] = true
                        set_task
(10.0"task_weaponsmenu"TASKID_WEAPONSMENU id)
                    }
                    else    
                        
equipweapon(idEQUIP_ALL)
                }
            }
        }
    }
}

public 
logevent_round_end()
{
    
g_gamestarted false 
    g_roundstarted 
false 
    g_roundended 
true
    
    remove_task
(TASKID_BALANCETEAM
    
remove_task(TASKID_INITROUND)
    
remove_task(TASKID_STARTROUND)
    
    
set_task(0.1"task_balanceteam"TASKID_BALANCETEAM)
}

public 
event_textmsg()
{
    
g_gamestarted false 
    g_roundstarted 
false 
    g_roundended 
true
    
    
static seconds[5
    
read_data(3seconds4)
    
    static 
Float:tasktime 
    tasktime 
float(str_to_num(seconds)) - 0.5
    
    remove_task
(TASKID_BALANCETEAM)
    
    
set_task(tasktime"task_balanceteam"TASKID_BALANCETEAM)
}

public 
event_newround()
{
    
g_gamestarted false
    
    
static buytime 
    buytime 
get_pcvar_num(cvar_buytime)
    
    if(
buytime
        
g_buytime buytime get_gametime()
    
    static 
id
    
for(id 0id <= g_maxplayersid++)
    {
        if(
is_user_connected(id))
            
g_blockmodel[id] = true
    
}
    
    
remove_task(TASKID_NEWROUND
    
remove_task(TASKID_INITROUND)
    
remove_task(TASKID_STARTROUND)
    
    
set_task(0.1"task_newround"TASKID_NEWROUND)
    
set_task(get_pcvar_float(cvar_starttime), "task_initround"TASKID_INITROUND)
}

public 
event_curweapon(id)
{
    if(!
is_user_alive(id))
        return 
PLUGIN_CONTINUE
    
    
static weapon
    weapon 
read_data(2)
    
    if(
g_zombie[id])
    {
        if(
weapon != CSW_KNIFE && !task_exists(TASKID_STRIPNGIVE id))
            
set_task(0.1"task_stripngive"TASKID_STRIPNGIVE id)
        
        return 
PLUGIN_CONTINUE
    
}

    static 
ammotype
    ammotype 
get_pcvar_num(cvar_ammo)
    
    if(!
ammotype || (AMMOWP_NULL & (1<<weapon)))
        return 
PLUGIN_CONTINUE

    
static maxammo
    
switch(ammotype)
    {
        case 
1maxammo g_weapon_ammo[weapon][MAX_AMMO]
        case 
2maxammo g_weapon_ammo[weapon][MAX_CLIP]
    }

    if(!
maxammo)
        return 
PLUGIN_CONTINUE
    
    
switch(ammotype)
    {
        case 
1:
        {
            static 
ammo
            ammo 
fm_get_user_bpammo(idweapon)
            
            if(
ammo 1
                
fm_set_user_bpammo(idweaponmaxammo)
        }
        case 
2:
        {
            static 
clipclip read_data(3)
            if(
clip 1)
            {
                static 
weaponname[32]
                
get_weaponname(weaponweaponname31)
                
                static 
ent 
                ent 
fm_find_ent_by_owner(-1weaponnameid)
                
                
fm_set_weapon_ammo(entmaxammo)
            }
        }
    }    
    return 
PLUGIN_CONTINUE
}

public 
event_armortype(id)
{
    if(!
is_user_alive(id) || !g_zombie[id])
        return 
PLUGIN_CONTINUE
    
    
if(fm_get_user_armortype(id) != CS_ARMOR_NONE)
        
fm_set_user_armortype(idCS_ARMOR_NONE)
    
    return 
PLUGIN_CONTINUE
}

public 
event_damage(victim)
{
    if(!
is_user_alive(victim) || !g_gamestarted)
        return 
PLUGIN_CONTINUE
    
    
if(g_zombie[victim])
    {
        static 
Float:gametime
        gametime 
get_gametime()
        
        
g_regendelay[victim] = gametime g_class_data[g_player_class[victim]][DATA_HITREGENDLY]
        
g_hitdelay[victim] = gametime g_class_data[g_player_class[victim]][DATA_HITDELAY]
    }
    else
    {
        static 
attacker
        attacker 
get_user_attacker(victim)
        
        if(!
is_user_alive(attacker) || !g_zombie[attacker] || g_infecting)
            return 
PLUGIN_CONTINUE
        
        
if(g_victim[attacker] == victim)
        {
            
g_infecting true
            g_victim
[attacker] = 0

            message_begin
(MSG_ALLg_msg_deathmsg)
            
write_byte(attacker)
            
write_byte(victim)
            
write_byte(0)
            
write_string(g_infection_name)
            
message_end()
            
            
message_begin(MSG_ALLg_msg_scoreattrib)
            
write_byte(victim)
            
write_byte(0)
            
message_end()
            
            
infect_user(victimattacker)
            
            static 
Float:fragsdeaths
            pev
(attackerpev_fragsfrags)
            
deaths fm_get_user_deaths(victim)
            
            
set_pev(attackerpev_fragsfrags  1.0)
            
fm_set_user_deaths(victimdeaths 1)
            
            
fm_set_user_money(attackerget_pcvar_num(cvar_infectmoney))
        
            static 
params[2]
            
params[0] = attacker 
            params
[1] = victim
    
            set_task
(0.3"task_updatescore"TASKID_UPDATESCRparams2)
        }
        
g_infecting false
    
}
    return 
PLUGIN_CONTINUE
}

public 
fwd_player_prethink(id)
{
    if(!
is_user_alive(id) || !g_zombie[id])
        return 
FMRES_IGNORED
    
    
static flags
    flags 
pev(idpev_flags)
    
    if(
flags FL_ONGROUND)
    {
        if(
get_pcvar_num(cvar_painshockfree))
        {
            
pev(idpev_velocityg_vecvel)
            
g_brestorevel true
        
}
    }
    else
    {
        static 
Float:fallvelocity
        pev
(idpev_flFallVelocityfallvelocity)
        
        
g_falling[id] = fallvelocity >= 350.0 true false
    
}
        
    if(
g_gamestarted)
    {    
        static 
Float:gametime
        gametime 
get_gametime()
        
        static 
pclass
        pclass 
g_player_class[id]

        static 
Float:health
        pev
(idpev_healthhealth)
        
        if(
health g_class_data[pclass][DATA_HEALTH] && g_regendelay[id] < gametime)
        {
            
set_pev(idpev_healthhealth 1.0)
            
g_regendelay[id] = gametime g_class_data[pclass][DATA_REGENDLY]
        }
    }
    return 
FMRES_IGNORED
}

public 
fwd_player_prethink_post(id)
{
    if(!
g_brestorevel)
        return 
FMRES_IGNORED

    g_brestorevel 
false
        
    
static flag
    flag 
pev(idpev_flags)
    
    if(!(
flag FL_ONTRAIN))
    {
        static 
ent
        ent 
pev(idpev_groundentity)
        
        if(
pev_valid(ent) && (flag FL_CONVEYOR))
        {
            static 
Float:vectemp[3]
            
pev(idpev_basevelocityvectemp)
            
            
xs_vec_add(g_vecvelvectempg_vecvel)
        }

        if(
g_hitdelay[id] > get_gametime() && (!(pev(idpev_flags) & FL_DUCKING)))
            
xs_vec_mul_scalar(g_vecvelg_class_data[g_player_class[id]][DATA_HITSPEED], g_vecvel)
    
        
set_pev(idpev_velocityg_vecvel)
        return 
FMRES_HANDLED
    
}
    return 
FMRES_IGNORED
}

public 
fwd_player_postthink(id)

    if(!
is_user_alive(id))
        return 
FMRES_IGNORED
    
    
if(g_zombie[id] && g_falling[id] && (pev(idpev_flags) & FL_ONGROUND))
    {    
        
set_pev(idpev_watertypeCONTENTS_WATER)
        
g_falling[id] = false
    
}
    
    if(
get_pcvar_num(cvar_buytime))
    {
        if(
pev_valid(g_buyzone) && g_buytime get_gametime())
            
dllfunc(DLLFunc_Touchg_buyzoneid)
    }
    return 
FMRES_IGNORED
}

public 
fwd_emitsound(idchannelsample[], Float:volumeFloat:attnflagpitch)
{    
    if(
channel == CHAN_ITEM && sample[6] == 'n' && sample[7] == 'v' && sample[8] == 'g')
        return 
FMRES_SUPERCEDE    
    
    
if(!is_user_connected(id) || !g_zombie[id])
        return 
FMRES_IGNORED    

    
if(sample[8] == 'k' && sample[9] == 'n' && sample[10] == 'i')
    {
        if(
sample[14] == 's' && sample[15] == 'l' && sample[16] == 'a')
        {
            
emit_sound(idchannelg_zombie_miss_sounds[_random(sizeof g_zombie_miss_sounds)], volumeattnflagpitch)
            return 
FMRES_SUPERCEDE
        
}
        else if(
sample[14] == 'h' && sample[15] == 'i' && sample[16] == 't' || sample[14] == 's' && sample[15] == 't' && sample[16] == 'a')
        {
            if(
sample[17] == 'w' && sample[18] == 'a' && sample[19] == 'l')
                
emit_sound(idchannelg_zombie_miss_sounds[_random(sizeof g_zombie_miss_sounds)], volumeattnflagpitch)
            else
                
emit_sound(idchannelg_zombie_hit_sounds[_random(sizeof g_zombie_hit_sounds)], volumeattnflagpitch)
            
            return 
FMRES_SUPERCEDE
        
}
    }            
    else if(
sample[7] == 'd' && (sample[8] == 'i' && sample[9] == 'e' || sample[12] == '6'))
    {
        
emit_sound(idchannelg_zombie_die_sounds[_random(sizeof g_zombie_die_sounds)], volumeattnflagpitch)
        return 
FMRES_SUPERCEDE
    
}
    return 
FMRES_IGNORED
}

public 
fwd_cmdstart(idhandleseed)
{
    if(!
is_user_alive(id) || !g_zombie[id])
        return 
FMRES_IGNORED
    
    
static impulse
    impulse 
get_uc(handleUC_Impulse)
    
    if(
impulse == IMPULSE_FLASHLIGHT)
    {
        
set_uc(handleUC_Impulse0)
        return 
FMRES_SUPERCEDE
    
}
    return 
FMRES_IGNORED
}

public 
fwd_spawn(ent)
{
    if(!
pev_valid(ent)) 
        return 
FMRES_IGNORED
    
    
static classname[32]
    
pev(entpev_classnameclassname31)

    static 
i
    
for(0sizeof g_remove_entities; ++i)
    {
        if(
equal(classnameg_remove_entities[i]))
        {
            
engfunc(EngFunc_RemoveEntityent)
            return 
FMRES_SUPERCEDE
        
}
    }
    return 
FMRES_IGNORED
}

public 
fwd_gamedescription() 

    static 
gamename[32]
    
get_pcvar_string(cvar_gamedescriptiongamename31)
    
    
forward_return(FMV_STRINGgamename)
    
    return 
FMRES_SUPERCEDE
}  

public 
fwd_createnamedentity(entclassname)
{
    static 
classname[10]
    
engfunc(EngFunc_SzFromIndexentclassnameclassname9)
    
    return (
classname[7] == 'c' && classname[8] == '4') ? FMRES_SUPERCEDE FMRES_IGNORED
}

public 
fwd_clientkill(id)
{
    if(
get_pcvar_num(cvar_punishsuicide) && is_user_alive(id))
        
g_suicide[id] = true
}

public 
fwd_setclientkeyvalue(idinfobuffer, const key[])
{
    if(!
equal(key"model") || !g_blockmodel[id])
        return 
FMRES_IGNORED
    
    
static model[32]
    
fm_get_user_model(idmodel31)
    
    if(
equal(model"gordon"))
        return 
FMRES_IGNORED
    
    g_blockmodel
[id] = false
    
    
return FMRES_SUPERCEDE
}

public 
bacon_touch_weapon(entid)
    return (
is_user_alive(id) && g_zombie[id]) ? HAM_SUPERCEDE HAM_IGNORED

public bacon_use_tank(entcalleractivatoruse_typeFloat:value)
    return (
is_user_alive(caller) && g_zombie[caller]) ? HAM_SUPERCEDE HAM_IGNORED

public bacon_use_pushable(entcalleractivatoruse_typeFloat:value)
    return 
HAM_SUPERCEDE

public bacon_traceattack_player(victimattackerFloat:damageFloat:direction[3], tracehandledamagetype)
{
    if(!
g_gamestarted
        return 
HAM_SUPERCEDE
    
    
if(!get_pcvar_num(cvar_knockback) || !(damagetype DMG_BULLET))
        return 
HAM_IGNORED
    
    
if(!is_user_connected(attacker) || !g_zombie[victim])
        return 
HAM_IGNORED
    
    
static kbpower
    kbpower 
g_weapon_knockback[get_user_weapon(attacker)]
    
    if(
kbpower != -1
    {
        static 
flags
        flags 
pev(victimpev_flags)
        
        if(
get_pcvar_num(cvar_knockback_duck) && ((flags FL_DUCKING) && (flags FL_ONGROUND)))
            return 
HAM_IGNORED
        
        
static Float:origins[2][3]
        
pev(victimpev_originorigins[0])
        
pev(attackerpev_originorigins[1])
        
        if(
get_distance_f(origins[0], origins[1]) <= get_pcvar_float(cvar_knockback_dist))
        {
            static 
Float:velocity[3]
            
pev(victimpev_velocityvelocity)
            
            static 
Float:tempvec
            tempvec 
velocity[2]    
            
            
xs_vec_mul_scalar(directiondamagedirection)
            
xs_vec_mul_scalar(directiong_class_data[g_player_class[victim]][DATA_KNOCKBACK], direction)
            
xs_vec_mul_scalar(directiong_knockbackpower[kbpower], direction)
            
            
xs_vec_add(directionvelocityvelocity)
            
velocity[2] = tempvec
            
            set_pev
(victimpev_velocityvelocity)
            
            return 
HAM_HANDLED
        
}
    }
    return 
HAM_IGNORED
}

public 
bacon_touch_grenade(entworld)
{
    if(!
get_pcvar_num(cvar_impactexplode))
        return 
HAM_IGNORED
    
    
static model[12]
    
pev(entpev_modelmodel11)
    
    if(
model[9] == 'h' && model[10] == 'e')
    {
        
set_pev(entpev_dmgtime0.0)
        
        return 
HAM_HANDLED
    
}
    return 
HAM_IGNORED
}

public 
bacon_takedamage_player(victiminflictorattackerFloat:damagedamagetype)
{
    if(
damagetype DMG_GENERIC || victim == attacker || !is_user_alive(victim) || !is_user_connected(attacker))
        return 
HAM_IGNORED

    
if(!g_gamestarted || (!g_zombie[victim] && !g_zombie[attacker]) || ((damagetype DMG_HEGRENADE) && g_zombie[attacker]))
        return 
HAM_SUPERCEDE
    
    
if(!g_zombie[attacker])
    {
        static 
pclass
        pclass 
g_player_class[victim
        
        
damage *= (damagetype DMG_HEGRENADE) ? g_class_data[pclass][DATA_HEDEFENCE] : g_class_data[pclass][DATA_DEFENCE]
        
SetHamParamFloat(4damage)
    }
    else
    {
        if(
get_user_weapon(attacker) != CSW_KNIFE)
            return 
HAM_SUPERCEDE

        damage 
*= g_class_data[g_player_class[attacker]][DATA_ATTACK]
        
        static 
Float:armor
        pev
(victimpev_armorvaluearmor)
        
        if(
get_pcvar_num(cvar_obeyarmor) && armor 0.0)
        {
            
armor -= damage
            
            
if(armor 0.0
                
armor 0.0
            
            set_pev
(victimpev_armorvaluearmor)
            
SetHamParamFloat(40.0)
        }
        else
        {
            static 
bool:infect
            infect 
allow_infection()
            
            
g_victim[attacker] = infect victim 0
                    
            
if(!g_infecting)
                
SetHamParamFloat(4infect 0.0 damage)
            else    
                
SetHamParamFloat(40.0)
        }
    }
    return 
HAM_HANDLED
}

public 
bacon_killed_player(victimkillershouldgib)
{
    if(!
is_user_alive(killer) || g_zombie[killer] || !g_zombie[victim])
        return 
HAM_IGNORED
    
    
static killbonus
    killbonus 
get_pcvar_num(cvar_killbonus)
    
    if(
killbonus)
        
set_pev(killerpev_fragspev(killerpev_frags) + float(killbonus))
    
    static 
killreward
    killreward 
get_pcvar_num(cvar_killreward)
    
    if(!
killreward
        return 
HAM_IGNORED
    
    
static weaponmaxclipentweaponname[32]
    switch(
killreward)
    {
        case 
1
        {
            
weapon get_user_weapon(killer)
            
maxclip g_weapon_ammo[weapon][MAX_CLIP]
            if(
maxclip)
            {
                
get_weaponname(weaponweaponname31)
                
ent fm_find_ent_by_owner(-1weaponnamekiller)
                    
                
fm_set_weapon_ammo(entmaxclip)
            }
        }
        case 
2:
        {
            if(!
user_has_weapon(killerCSW_HEGRENADE))
                
bacon_give_weapon(killer"weapon_hegrenade")
        }
        case 
3:
        {
            
weapon get_user_weapon(killer)
            
maxclip g_weapon_ammo[weapon][MAX_CLIP]
            if(
maxclip)
            {
                
get_weaponname(weaponweaponname31)
                
ent fm_find_ent_by_owner(-1weaponnamekiller)
                    
                
fm_set_weapon_ammo(entmaxclip)
            }
                
            if(!
user_has_weapon(killerCSW_HEGRENADE))
                
bacon_give_weapon(killer"weapon_hegrenade")
        }
    }
    return 
HAM_IGNORED
}

public 
bacon_spawn_player_post(id)
{    
    if(!
is_user_alive(id))
        return 
HAM_IGNORED
    
    
static team
    team 
fm_get_user_team(id)
    
    if(
team != CS_TEAM_T && team != CS_TEAM_CT)
        return 
HAM_IGNORED
    
    
if(g_zombie[id])
    {
        if(
get_pcvar_num(cvar_respawnaszombie) && !g_roundended)
        {
            
set_zombie_attibutes(id)
            
            return 
HAM_IGNORED
        
}
        else
            
cure_user(id)
    }
    else if(
pev(idpev_rendermode) == kRenderTransTexture)
        
reset_user_model(id)
    
    
set_task(0.3"task_spawned"TASKID_SPAWNDELAY id)
    
set_task(5.0"task_checkspawn"TASKID_CHECKSPAWN id)
    
    return 
HAM_IGNORED
}

public 
bacon_touch_pushable(entid)
{
    static 
movetype
    pev
(idpev_movetype)
    
    if(
movetype == MOVETYPE_NOCLIP || movetype == MOVETYPE_NONE)
        return 
HAM_IGNORED    
    
    
if(is_user_alive(id))
    {
        
set_pev(idpev_movetypeMOVETYPE_WALK)
        
        if(!(
pev(idpev_flags) & FL_ONGROUND))
            return 
HAM_SUPERCEDE
    
}
    
    if(!
get_pcvar_num(cvar_shootobjects))
        return 
HAM_IGNORED
    
    
static Float:velocity[2][3]
    
pev(entpev_velocityvelocity[0])
    
    if(
vector_length(velocity[0]) > 0.0)
    {
        
pev(idpev_velocityvelocity[1])
        
velocity[1][0] += velocity[0][0]
        
velocity[1][1] += velocity[0][1]
        
        
set_pev(idpev_velocityvelocity[1])
    }
    return 
HAM_SUPERCEDE
}

public 
bacon_traceattack_pushable(entattackerFloat:damageFloat:direction[3], tracehandledamagetype)
{
    if(!
get_pcvar_num(cvar_shootobjects) || !is_user_alive(attacker))
        return 
HAM_IGNORED
    
    
static Float:velocity[3]
    
pev(entpev_velocityvelocity)
            
    static 
Float:tempvec
    tempvec 
velocity[2]    
            
    
xs_vec_mul_scalar(directiondamagedirection)
    
xs_vec_mul_scalar(directiong_zombie[attacker] ? 
    
get_pcvar_float(cvar_pushpwr_zombie) : get_pcvar_float(cvar_pushpwr_weapon), direction)
    
xs_vec_add(directionvelocityvelocity)
    
velocity[2] = tempvec
    
    set_pev
(entpev_velocityvelocity)
    
    return 
HAM_HANDLED
}

public 
task_spawned(taskid)
{
    static 
id
    id 
taskid TASKID_SPAWNDELAY
    
    
if(is_user_alive(id))
    {
        if(
g_welcomemsg[id])
        {
            
g_welcomemsg[id] = false
            
            
static message[192]
            
formatex(message191"%L"id"WELCOME_TXT")
            
replace(message191"#Version#"VERSION)
            
            
client_print(idprint_chatmessage)
        }
        
        if(
g_suicide[id])
        {
            
g_suicide[id] = false
            
            user_silentkill
(id)
            
remove_task(TASKID_CHECKSPAWN id)

            
client_print(idprint_chat"%L"id"SUICIDEPUNISH_TXT")
            
            return
        }
        
        if(
get_pcvar_num(cvar_weaponsmenu) && g_roundstarted && g_showmenu[id])
            
is_user_bot(id) ? bot_weapons(id) : display_equipmenu(id)
        
        if(!
g_gamestarted)
            
client_print(idprint_chat"%L %L"id"SCAN_RESULTS"idg_preinfect[id] ? "SCAN_INFECTED" "SCAN_CLEAN")
        else
        {
            static 
team
            team 
fm_get_user_team(id)
            
            if(
team == CS_TEAM_T)
                
fm_set_user_team(idCS_TEAM_CT)
        }
    }
}

public 
task_checkspawn(taskid)
{
    static 
id
    id 
taskid TASKID_CHECKSPAWN
    
    
if(!is_user_connected(id) || is_user_alive(id) || g_roundended)
        return
    
    static 
team
    team 
fm_get_user_team(id)
    
    if(
team == CS_TEAM_T || team == CS_TEAM_CT)
        
ExecuteHamB(Ham_CS_RoundRespawnid)
}
    
public 
task_showtruehealth()
{
    
set_hudmessage(___0.030.93_0.20.2)
    
    static 
idFloat:health, class
    for(
id 1id <= g_maxplayersid++) if(is_user_alive(id) && !is_user_bot(id) && g_zombie[id])
    {
        
pev(idpev_healthhealth)
        class = 
g_player_class[id]
        
        if(
g_classcount 1)
            
ShowSyncHudMsg(idg_sync_hpdisplay"Health: %0.f  Class: %s (%s)"healthg_class_name[class], g_class_desc[class])
        else    
            
ShowSyncHudMsg(idg_sync_hpdisplay"Health: %0.f"health)
    }
}

public 
task_lights()
{
    static 
light[2]
    
get_pcvar_string(cvar_lightslight1)
    
    
engfunc(EngFunc_LightStyle0light)
}

public 
task_updatescore(params[])
{
    if(!
g_gamestarted
        return
    
    static 
attacker
    attacker 
params[0]
    
    static 
victim
    victim 
params[1]
    
    if(!
is_user_connected(attacker))
        return

    static 
fragsdeathsteam
    frags  
get_user_frags(attacker)
    
deaths fm_get_user_deaths(attacker)
    
team   get_user_team(attacker)
    
    
message_begin(MSG_BROADCASTg_msg_scoreinfo)
    
write_byte(attacker)
    
write_short(frags)
    
write_short(deaths)
    
write_short(0)
    
write_short(team)
    
message_end()
    
    if(!
is_user_connected(victim))
        return
    
    
frags  get_user_frags(victim)
    
deaths fm_get_user_deaths(victim)
    
team   get_user_team(victim)
    
    
message_begin(MSG_BROADCASTg_msg_scoreinfo)
    
write_byte(victim)
    
write_short(frags)
    
write_short(deaths)
    
write_short(0)
    
write_short(team)
    
message_end()
}

public 
task_weaponsmenu(taskid)
{
    static 
id
    id 
taskid TASKID_WEAPONSMENU
    
    
if(is_user_alive(id) && !g_zombie[id] && g_menufailsafe[id])
        
display_equipmenu(id)
}

public 
task_stripngive(taskid)
{
    static 
id
    id 
taskid TASKID_STRIPNGIVE
    
    
if(is_user_alive(id))
    {
        
fm_strip_user_weapons(id)
        
fm_reset_user_primary(id)
        
bacon_give_weapon(id"weapon_knife")
        
        
set_pev(idpev_weaponmodel2"")
        
set_pev(idpev_viewmodel2g_class_wmodel[g_player_class[id]])
        
set_pev(idpev_maxspeedg_class_data[g_player_class[id]][DATA_SPEED])
    }
}

public 
task_newround()
{
    static 
players[32], numzombiesiid
    get_players
(playersnum"a")

    if(
num 1)
    {
        for(
0numi++) 
            
g_preinfect[players[i]] = false
        
        zombies 
clamp(floatround(num get_pcvar_float(cvar_zombiemulti)), 131)
        
        
0
        
while(zombies)
        {
            
id players[_random(num)]
            if(!
g_preinfect[id])
            {
                
g_preinfect[id] = true
                i
++
            }
        }
    }
    
    if(!
get_pcvar_num(cvar_randomspawn) || g_spawncount <= 0
        return
    
    static 
team
    
for(0numi++)
    {
        
id players[i]
        
        
team fm_get_user_team(id)
        if(
team != CS_TEAM_T && team != CS_TEAM_CT || pev(idpev_iuser1))
            continue
        
        static 
spawn_index
        spawn_index 
_random(g_spawncount)
    
        static 
Float:spawndata[3]
        
spawndata[0] = g_spawns[spawn_index][0]
        
spawndata[1] = g_spawns[spawn_index][1]
        
spawndata[2] = g_spawns[spawn_index][2]
        
        if(!
fm_is_hull_vacant(spawndataHULL_HUMAN))
        {
            static 
i
            
for(spawn_index 1!= spawn_indexi++)
            {
                if(
>= g_spawncount0

                spawndata
[0] = g_spawns[i][0]
                
spawndata[1] = g_spawns[i][1]
                
spawndata[2] = g_spawns[i][2]

                if(
fm_is_hull_vacant(spawndataHULL_HUMAN))
                {
                    
spawn_index i
                    
break
                }
            }
        }

        
spawndata[0] = g_spawns[spawn_index][0]
        
spawndata[1] = g_spawns[spawn_index][1]
        
spawndata[2] = g_spawns[spawn_index][2]
        
engfunc(EngFunc_SetOriginidspawndata)

        
spawndata[0] = g_spawns[spawn_index][3]
        
spawndata[1] = g_spawns[spawn_index][4]
        
spawndata[2] = g_spawns[spawn_index][5]
        
set_pev(idpev_anglesspawndata)

        
spawndata[0] = g_spawns[spawn_index][6]
        
spawndata[1] = g_spawns[spawn_index][7]
        
spawndata[2] = g_spawns[spawn_index][8]
        
set_pev(idpev_v_anglespawndata)

        
set_pev(idpev_fixangle1)
    }
}

public 
task_initround()
{
    static 
zombiecountnewzombie
    zombiecount 
0
    newzombie 
0

    
static players[32], numiid
    get_players
(playersnum"a")

    for(
0numi++) if(g_preinfect[players[i]])
    {
        
newzombie players[i]
        
zombiecount++
    }
    
    if(
zombiecount 1
        
newzombie 0
    
else if(zombiecount 1
        
newzombie players[_random(num)]
    
    for(
0numi++)
    {
        
id players[i]
        if(
id == newzombie || g_preinfect[id])
            
infect_user(id0)
        else
        {
            
fm_set_user_team(idCS_TEAM_CT0)
            
add_delay(id"update_team")
        }
    }
    
    
set_hudmessage(_____1)
    if(
newzombie)
    {
        static 
name[32]
        
get_user_name(newzombiename31)
        
        
ShowSyncHudMsg(0g_sync_msgdisplay"%L"LANG_PLAYER"INFECTED_HUD"name)
        
client_print(0print_chat"%L"LANG_PLAYER"INFECTED_TXT"name)
    }
    else
    {
        
ShowSyncHudMsg(0g_sync_msgdisplay"%L"LANG_PLAYER"INFECTED_HUD2")
        
client_print(0print_chat"%L"LANG_PLAYER"INFECTED_TXT2")
    }
    
    
set_task(0.51"task_startround"TASKID_STARTROUND)
}

public 
task_startround()
{
    
g_gamestarted true
    ExecuteForward
(g_fwd_gamestartg_fwd_result)
}

public 
task_balanceteam()
{
    static 
players[3][32], count[3]
    
get_players(players[CS_TEAM_UNASSIGNED], count[CS_TEAM_UNASSIGNED])
    
    
count[CS_TEAM_T] = 0
    count
[CS_TEAM_CT] = 0
    
    
static iidteam
    
for(0count[CS_TEAM_UNASSIGNED]; i++)
    {
        
id players[CS_TEAM_UNASSIGNED][i
        
team fm_get_user_team(id)
        
        if(
team == CS_TEAM_T || team == CS_TEAM_CT)
            
players[team][count[team]++] = id
    
}

    if(
abs(count[CS_TEAM_T] - count[CS_TEAM_CT]) <= 1
        return

    static 
maxplayers
    maxplayers 
= (count[CS_TEAM_T] + count[CS_TEAM_CT]) / 2
    
    
if(count[CS_TEAM_T] > maxplayers)
    {
        for(
0< (count[CS_TEAM_T] - maxplayers); i++)
            
fm_set_user_team(players[CS_TEAM_T][i], CS_TEAM_CT0)
    }
    else
    {
        for(
0< (count[CS_TEAM_CT] - maxplayers); i++)
            
fm_set_user_team(players[CS_TEAM_CT][i], CS_TEAM_T0)
    }
}

public 
task_botclient_pdata(id
{
    if(
g_botclient_pdata || !is_user_connected(id))
        return
    
    if(
get_pcvar_num(cvar_botquota) && is_user_bot(id))
    {
        
RegisterHamFromEntity(Ham_TakeDamageid"bacon_takedamage_player")
        
RegisterHamFromEntity(Ham_Killedid"bacon_killed_player")
        
RegisterHamFromEntity(Ham_TraceAttackid"bacon_traceattack_player")
        
RegisterHamFromEntity(Ham_Spawnid"bacon_spawn_player_post"1)
        
        
g_botclient_pdata 1
    
}
}

public 
bot_weapons(id)
{
    
g_player_weapons[id][0] = _random(sizeof g_primaryweapons)
    
g_player_weapons[id][1] = _random(sizeof g_secondaryweapons)
    
    
equipweapon(idEQUIP_ALL)
}

public 
update_team(id)
{
    if(!
is_user_connected(id))
        return
    
    static 
team
    team 
fm_get_user_team(id)
    
    if(
team == CS_TEAM_T || team == CS_TEAM_CT)
    {
        
emessage_begin(MSG_ALLg_msg_teaminfo)
        
ewrite_byte(id)
        
ewrite_string(g_teaminfo[team])
        
emessage_end()
    }
}

public 
infect_user(victimattacker)
{
    if(!
is_user_alive(victim))
        return

    
message_begin(MSG_ONEg_msg_screenfade_victim)
    
write_short(1<<10)
    
write_short(1<<10)
    
write_short(0)
    
write_byte((g_mutate[victim] != -1) ? 255 100)
    
write_byte(100)
    
write_byte(100)
    
write_byte(250)
    
message_end()
    
    if(
g_mutate[victim] != -1)
    {
        
g_player_class[victim] = g_mutate[victim]
        
g_mutate[victim] = -1
        
        set_hudmessage
(_____1)
        
ShowSyncHudMsg(victimg_sync_msgdisplay"%L"victim"MUTATION_HUD"g_class_name[g_player_class[victim]])
    }
    
    
fm_set_user_team(victimCS_TEAM_T)
    
set_zombie_attibutes(victim)
    
    
emit_sound(victimCHAN_STATICg_scream_sounds[_random(sizeof g_scream_sounds)], VOL_NORMATTN_NONE0PITCH_NORM)
    
ExecuteForward(g_fwd_infectg_fwd_resultvictimattacker)
}

public 
cure_user(id)
{
    if(!
is_user_alive(id)) 
        return

    
g_zombie[id] = false
    g_falling
[id] = false

    reset_user_model
(id)
    
fm_set_user_nvg(id0)
    
set_pev(idpev_gravity1.0)
    
    static 
viewmodel[64]
    
pev(idpev_viewmodel2viewmodel63)
    
    if(
equal(viewmodelg_class_wmodel[g_player_class[id]]))
    {
        static 
weapon 
        weapon 
fm_lastknife(id)

        if(
pev_valid(weapon))
            
ExecuteHam(Ham_Item_Deployweapon)
    }
}

public 
display_equipmenu(id)
{
    static 
menubody[512], len
      len 
formatex(menubody511"\y%L^n^n"id"MENU_TITLE1")
    
    static 
bool:hasweap
    hasweap 
= ((g_player_weapons[id][0]) != -&& (g_player_weapons[id][1] != -1)) ? true false
    
    len 
+= formatex(menubody[len], 511 len,"\w1. %L^n"id"MENU_NEWWEAPONS")
    
len += formatex(menubody[len], 511 len,"%s2. %L^n"hasweap "\w" "\d"id"MENU_PREVSETUP")
    
len += formatex(menubody[len], 511 len,"%s3. %L^n^n"hasweap "\w" "\d"id"MENU_DONTSHOW")
    
len += formatex(menubody[len], 511 len,"\w5. %L^n"id"MENU_EXIT")
    
    static 
keys
    keys 
= (MENU_KEY_1|MENU_KEY_5)
    
    if(
hasweap
        
keys |= (MENU_KEY_2|MENU_KEY_3)
    
    
show_menu(idkeysmenubody, -1"Equipment")
}

public 
action_equip(idkey)
{
    if(!
is_user_alive(id) || g_zombie[id])
        return 
PLUGIN_HANDLED
    
    
switch(key)
    {
        case 
0display_weaponmenu(idMENU_PRIMARYg_menuposition[id] = 0)
        case 
1equipweapon(idEQUIP_ALL)
        case 
2:
        {
            
g_showmenu[id] = false
            equipweapon
(idEQUIP_ALL)
            
client_print(idprint_chat"%L"id"MENU_CMDENABLE")
        }
    }
    
    if(
key 0)
    {
        
g_menufailsafe[id] = false
        remove_task
(TASKID_WEAPONSMENU id)
    }
    return 
PLUGIN_HANDLED
}


public 
display_weaponmenu(idmenuidpos)
{
    if(
pos || menuid 0)
        return
    
    static 
start
    start 
pos 8
    
    
static maxitem
    maxitem 
menuid == MENU_PRIMARY sizeof g_primaryweapons sizeof g_secondaryweapons

      
if(start >= maxitem)
            
start pos g_menuposition[id]
    
    static 
menubody[512], len
      len 
formatex(menubody511"\y%L\w^n^n"idmenuid == MENU_PRIMARY "MENU_TITLE2" "MENU_TITLE3")

    static 
end
    end 
start 8
    
if(end maxitem)
            
end maxitem
    
    
static keys
    keys 
MENU_KEY_0
    
    
static ab
    b 
0
    
      
for(startend; ++a
    {
        
keys |= (1<<b)
        
len += formatex(menubody[len], 511 len,"%d. %s^n", ++bmenuid == MENU_PRIMARY g_primaryweapons[a][0]: g_secondaryweapons[a][0])
      }

      if(
end != maxitem)
    {
            
formatex(menubody[len], 511 len"^n9. %L^n0. %L"id"MENU_MORE"idpos "MENU_BACK" "MENU_EXIT")
            
keys |= MENU_KEY_9
      
}
      else    
        
formatex(menubody[len], 511 len"^n0. %L"idpos "MENU_BACK" "MENU_EXIT")
    
      
show_menu(idkeysmenubody, -1menuid == MENU_PRIMARY "Primary" "Secondary")
}

public 
action_prim(idkey)
{
    if(!
is_user_alive(id) || g_zombie[id])
        return 
PLUGIN_HANDLED

    
switch(key)
    {
            case 
8display_weaponmenu(idMENU_PRIMARY, ++g_menuposition[id])
        case 
9display_weaponmenu(idMENU_PRIMARY, --g_menuposition[id])
            default:
        {
            
g_player_weapons[id][0] = g_menuposition[id] * key
            equipweapon
(idEQUIP_PRI)
            
            
display_weaponmenu(idMENU_SECONDARYg_menuposition[id] = 0)
        }
    }
    return 
PLUGIN_HANDLED
}

public 
action_sec(idkey)
{
    if(!
is_user_alive(id) || g_zombie[id])
        return 
PLUGIN_HANDLED
    
    
switch(key
    {
            case 
8display_weaponmenu(idMENU_SECONDARY, ++g_menuposition[id])
        case 
9display_weaponmenu(idMENU_SECONDARY, --g_menuposition[id])
            default:
        {
            
g_menufailsafe[id] = false
            remove_task
(TASKID_WEAPONSMENU id)
            
            
g_player_weapons[id][1] = g_menuposition[id] * key
            equipweapon
(idEQUIP_SEC)
            
equipweapon(idEQUIP_GREN)
        }
    }
    return 
PLUGIN_HANDLED
}

public 
display_classmenu(idpos)
{
    if(
pos 0)
        return
    
    static 
start
    start 
pos 8
    
    
static maxitem
    maxitem 
g_classcount

      
if(start >= maxitem)
            
start pos g_menuposition[id]
    
    static 
menubody[512], len
      len 
formatex(menubody511"\y%L\w^n^n"id"MENU_TITLE4")

    static 
end
    end 
start 8
    
    
if(end maxitem)
            
end maxitem
    
    
static keys
    keys 
MENU_KEY_0
    
    
static ab
    b 
0
    
      
for(startend; ++a
    {
        
keys |= (1<<b)
        
len += formatex(menubody[len], 511 len,"%d. %s^n", ++bg_class_name[a])
      }

      if(
end != maxitem)
    {
            
formatex(menubody[len], 511 len"^n9. %L^n0. %L"id"MENU_MORE"idpos "MENU_BACK" "MENU_EXIT")
            
keys |= MENU_KEY_9
      
}
      else    
        
formatex(menubody[len], 511 len"^n0. %L"idpos "MENU_BACK" "MENU_EXIT")
    
      
show_menu(idkeysmenubody, -1"Class")
}

public 
action_class(idkey)
{
    switch(
key
    {
            case 
8display_classmenu(id, ++g_menuposition[id])
        case 
9display_classmenu(id, --g_menuposition[id])
            default:
        {
            
g_mutate[id] = g_menuposition[id] * key
            client_print
(idprint_chat"%L"id"MENU_CHANGECLASS"g_class_name[g_mutate[id]])
        }
    }
    return 
PLUGIN_HANDLED
}

public 
register_spawnpoints(const mapname[])
{
    new 
configdir[32]
    
get_configsdir(configdir31)
    
    new 
csdmfile[64], line[64], data[10][6]
    
formatex(csdmfile63"%s/csdm/%s.spawns.cfg"configdirmapname)

    if(
file_exists(csdmfile))
    {
        new 
file
        file 
fopen(csdmfile"rt")
        
        while(
file && !feof(file))
        {
            
fgets(fileline63)
            if(!
line[0] || str_count(line,' ') < 2
                continue

            
parse(linedata[0], 5data[1], 5data[2], 5data[3], 5data[4], 5data[5], 5data[6], 5data[7], 5data[8], 5data[9], 5)

            
g_spawns[g_spawncount][0] = floatstr(data[0]), g_spawns[g_spawncount][1] = floatstr(data[1])
            
g_spawns[g_spawncount][2] = floatstr(data[2]), g_spawns[g_spawncount][3] = floatstr(data[3])
            
g_spawns[g_spawncount][4] = floatstr(data[4]), g_spawns[g_spawncount][5] = floatstr(data[5])
            
g_spawns[g_spawncount][6] = floatstr(data[7]), g_spawns[g_spawncount][7] = floatstr(data[8])
            
g_spawns[g_spawncount][8] = floatstr(data[9])
            
            if(++
g_spawncount >= MAX_SPAWNS
                break
        }
        if(
file
            
fclose(file)
    }
}

public 
register_zombieclasses(filename[])
{
    new 
configdir[32]
    
get_configsdir(configdir31)
    
    new 
configfile[64]
    
formatex(configfile63"%s/%s"configdirfilename)

    if(
get_pcvar_num(cvar_zombie_class) && file_exists(configfile))
    {            
        new 
line[128], leftstr[32], rightstr[64],  classname[32], data[MAX_DATA], i
        
        
new file
        file 
fopen(configfile"rt")
        
        while(
file && !feof(file))
        {
            
fgets(fileline127), trim(line)
            if(!
line[0] || line[0] == ';') continue
            
            if(
line[0] == '[' && line[strlen(line) - 1] == ']')
            {
                
copy(classnamestrlen(line) - 2line[1])

                if(
register_class(classname) == -1)
                    break
                
                continue
            }
            
strtok(lineleftstr31rightstr63'='1)
                
            if(
equali(leftstr"DESC"))
                
copy(g_class_desc[g_classcount 1], 31rightstr)
            else if(
equali(leftstr"PMODEL"))
                
copy(g_class_pmodel[g_classcount 1], 63rightstr)
            else if(
equali(leftstr"WMODEL"))
                
copy(g_class_wmodel[g_classcount 1], 63rightstr)
                
            for(
0MAX_DATAi++)
                
data[i] = equali(leftstrg_dataname[i])
                
            for(
0MAX_DATAi++) if(data[i])
            {
                
g_class_data[g_classcount 1][i] = floatstr(rightstr)
                break
            }
        }
        if(
filefclose(file)
    } 
    else 
        
register_class("default")
}

public 
register_class(classname[])
{
    if(
g_classcount >= MAX_CLASSES)
        return -
1
    
    copy
(g_class_name[g_classcount], 31classname)
    
copy(g_class_pmodel[g_classcount], 63DEFAULT_PMODEL)
    
copy(g_class_wmodel[g_classcount], 63DEFAULT_WMODEL)
        
    
g_class_data[g_classcount][DATA_HEALTH] = DEFAULT_HEALTH
    g_class_data
[g_classcount][DATA_SPEED] = DEFAULT_SPEED    
    g_class_data
[g_classcount][DATA_GRAVITY] = DEFAULT_GRAVITY
    g_class_data
[g_classcount][DATA_ATTACK] = DEFAULT_ATTACK
    g_class_data
[g_classcount][DATA_DEFENCE] = DEFAULT_DEFENCE
    g_class_data
[g_classcount][DATA_HEDEFENCE] = DEFAULT_HEDEFENCE
    g_class_data
[g_classcount][DATA_HITSPEED] = DEFAULT_HITSPEED
    g_class_data
[g_classcount][DATA_HITDELAY] = DEFAULT_HITDELAY
    g_class_data
[g_classcount][DATA_REGENDLY] = DEFAULT_REGENDLY
    g_class_data
[g_classcount][DATA_HITREGENDLY] = DEFAULT_HITREGENDLY
    g_class_data
[g_classcount++][DATA_KNOCKBACK] = DEFAULT_KNOCKBACK
    
    
return (g_classcount 1)
}

public 
native_register_class(classname[], description[])
{
    
param_convert(1)
    
param_convert(2)
    
    static 
classid
    classid 
register_class(classname)
    
    if(
classid != -1)
        
copy(g_class_desc[classid], 31description)

    return 
classid
}

public 
native_set_class_pmodel(classidplayer_model[])
{
    
param_convert(2)
    
copy(g_class_pmodel[classid], 63player_model)
}

public 
native_set_class_wmodel(classidweapon_model[])
{
    
param_convert(2)
    
copy(g_class_wmodel[classid], 63weapon_model
}

public 
native_is_user_zombie(index)
    return 
g_zombie[index] == true 0

public native_get_user_class(index)
    return 
g_player_class[index]

public 
native_is_user_infected(index)
    return 
g_preinfect[index] == true 0

public native_game_started()
    return 
g_gamestarted

public native_preinfect_user(indexbool:yesno)
{
    if(
is_user_alive(index) && !g_gamestarted)
        
g_preinfect[index] = yesno
}

public 
native_infect_user(victimattacker)
{
    if(
allow_infection() && g_gamestarted)
        
infect_user(victimattacker)
}

public 
native_cure_user(index)
    
cure_user(index)

public 
native_get_class_id(classname[])
{
    
param_convert(1)
    
    static 
i
    
for(0g_classcounti++)
    {
        if(
equali(classnameg_class_name[i]))
            return 
i
    
}
    return -
1
}

public 
Float:native_get_class_data(classiddataid)
    return 
g_class_data[classid][dataid]

public 
native_set_class_data(classiddataidFloat:value)
    
g_class_data[classid][dataid] = value

stock bool
:fm_is_hull_vacant(const Float:origin[3], hull)
{
    static 
tr
    tr 
0
    
    engfunc
(EngFunc_TraceHulloriginorigin0hull0tr)
    return (!
get_tr2(trTR_StartSolid) && !get_tr2(trTR_AllSolid) && get_tr2(trTR_InOpen)) ? true false
}

stock fm_set_kvd(entity, const key[], const value[], const classname[] = ""
{
    
set_kvd(0KV_ClassNameclassname)
    
set_kvd(0KV_KeyNamekey)
    
set_kvd(0KV_Valuevalue)
    
set_kvd(0KV_fHandled0)

    return 
dllfunc(DLLFunc_KeyValueentity0)
}

stock fm_strip_user_weapons(index
{
    static 
stripent
    
if(!pev_valid(stripent))
    {
        
stripent engfunc(EngFunc_CreateNamedEntityengfunc(EngFunc_AllocString"player_weaponstrip"))
        
dllfunc(DLLFunc_Spawnstripent), set_pev(stripentpev_solidSOLID_NOT)
    }
    
dllfunc(DLLFunc_Usestripentindex)
    
    return 
1
}

stock fm_set_entity_visibility(indexvisible 1)
    
set_pev(indexpev_effectsvisible == pev(indexpev_effects) & ~EF_NODRAW pev(indexpev_effects) | EF_NODRAW)

stock fm_find_ent_by_owner(index, const classname[], owner
{
    static 
ent
    ent 
index
    
    
while((ent engfunc(EngFunc_FindEntityByStringent"classname"classname)) && pev(entpev_owner) != owner) {}
    
    return 
ent
}

stock bacon_give_weapon(indexweapon[])
{
    if(!
equal(weapon,"weapon_"7))
        return 
0

    
static ent
    ent 
engfunc(EngFunc_CreateNamedEntityengfunc(EngFunc_AllocStringweapon))
    
    if(!
pev_valid(ent)) 
        return 
0
    
    set_pev
(entpev_spawnflagsSF_NORESPAWN)
    
dllfunc(DLLFunc_Spawnent)
   
    if(!
ExecuteHamB(Ham_AddPlayerItemindexent))
    {
        if(
pev_valid(ent)) set_pev(entpev_flagspev(entpev_flags) | FL_KILLME)
        return 
0
    
}
    
ExecuteHamB(Ham_Item_AttachToPlayerentindex)

    return 
1
}

stock bacon_strip_weapon(indexweapon[])
{
    if(!
equal(weapon"weapon_"7)) 
        return 
0

    
static weaponid 
    weaponid 
get_weaponid(weapon)
    
    if(!
weaponid
        return 
0

    
static weaponent
    weaponent 
fm_find_ent_by_owner(-1weaponindex)
    
    if(!
weaponent
        return 
0

    
if(get_user_weapon(index) == weaponid
        
ExecuteHamB(Ham_Weapon_RetireWeaponweaponent)

    if(!
ExecuteHamB(Ham_RemovePlayerItemindexweaponent)) 
        return 
0
    
    ExecuteHamB
(Ham_Item_Killweaponent)
    
set_pev(indexpev_weaponspev(indexpev_weapons) & ~(1<<weaponid))

    return 
1
}

stock fm_set_user_team(indexteamupdate 1)
{
    
set_pdata_int(indexOFFSET_TEAMteam)
    if(
update)
    {
        
emessage_begin(MSG_ALLg_msg_teaminfo)
        
ewrite_byte(index)
        
ewrite_string(g_teaminfo[team])
        
emessage_end()
    }
    return 
1
}

stock fm_get_user_bpammo(indexweapon)
{
    static 
offset
    
switch(weapon)
    {
        case 
CSW_AWPoffset OFFSET_AMMO_338MAGNUM
        
case CSW_SCOUTCSW_AK47CSW_G3SG1offset OFFSET_AMMO_762NATO
        
case CSW_M249offset OFFSET_AMMO_556NATOBOX
        
case CSW_FAMASCSW_M4A1CSW_AUG
        
CSW_SG550CSW_GALICSW_SG552offset OFFSET_AMMO_556NATO
        
case CSW_M3CSW_XM1014offset OFFSET_AMMO_BUCKSHOT
        
case CSW_USPCSW_UMP45CSW_MAC10offset OFFSET_AMMO_45ACP
        
case CSW_FIVESEVENCSW_P90offset OFFSET_AMMO_57MM
        
case CSW_DEAGLEoffset OFFSET_AMMO_50AE
        
case CSW_P228offset OFFSET_AMMO_357SIG
        
case CSW_GLOCK18CSW_TMPCSW_ELITE
        
CSW_MP5NAVYoffset OFFSET_AMMO_9MM
        
default: offset 0
    
}
    return 
offset get_pdata_int(indexoffset) : 0
}

stock fm_set_user_bpammo(indexweaponamount)
{
    static 
offset
    
switch(weapon)
    {
        case 
CSW_AWPoffset OFFSET_AMMO_338MAGNUM
        
case CSW_SCOUTCSW_AK47CSW_G3SG1offset OFFSET_AMMO_762NATO
        
case CSW_M249offset OFFSET_AMMO_556NATOBOX
        
case CSW_FAMASCSW_M4A1CSW_AUG
        
CSW_SG550CSW_GALICSW_SG552offset OFFSET_AMMO_556NATO
        
case CSW_M3CSW_XM1014offset OFFSET_AMMO_BUCKSHOT
        
case CSW_USPCSW_UMP45CSW_MAC10offset OFFSET_AMMO_45ACP
        
case CSW_FIVESEVENCSW_P90offset OFFSET_AMMO_57MM
        
case CSW_DEAGLEoffset OFFSET_AMMO_50AE
        
case CSW_P228offset OFFSET_AMMO_357SIG
        
case CSW_GLOCK18CSW_TMPCSW_ELITE
        
CSW_MP5NAVYoffset OFFSET_AMMO_9MM
        
default: offset 0
    
}
    
    if(
offset
        
set_pdata_int(indexoffsetamount)
    
    return 
1
}

stock fm_set_user_nvg(indexonoff 1)
{
    static 
nvg
    nvg 
get_pdata_int(indexOFFSET_NVG)
    
    
set_pdata_int(indexOFFSET_NVGonoff == nvg HAS_NVG nvg & ~HAS_NVG)
    return 
1
}

stock fm_set_user_money(indexaddmoneyupdate 1)
{
    static 
money
    money 
fm_get_user_money(index) + addmoney
    
    set_pdata_int
(indexOFFSET_CSMONEYmoney)
    
    if(
update)
    {
        
message_begin(MSG_ONEg_msg_money_index)
        
write_long(clamp(money016000))
        
write_byte(1)
        
message_end()
    }
    return 
1
}

stock str_count(str[], searchchar)
{
    static 
maxlen
    maxlen 
strlen(str)
    
    static 
icount
    count 
0
    
    
for(0<= maxleni++) if(str[i] == searchchar)
        
count++

    return 
count
}

stock reset_user_model(index)
{
    
set_pev(indexpev_rendermodekRenderNormal)
    
set_pev(indexpev_renderamt0.0)

    if(
pev_valid(g_modelent[index]))
        
fm_set_entity_visibility(g_modelent[index], 0)
}

stock remove_user_model(ent)
{
    static 
id
    id 
pev(entpev_owner)
    
    if(
pev_valid(ent)) 
        
engfunc(EngFunc_RemoveEntityent)

    
g_modelent[id] = 0
}

stock set_zombie_attibutes(index)
{
    if(!
is_user_alive(index)) 
        return

    
g_zombie[index] = true

    
if(!task_exists(TASKID_STRIPNGIVE index))
        
set_task(0.1"task_stripngive"TASKID_STRIPNGIVE index)

    static 
Float:health
    health 
g_class_data[g_player_class[index]][DATA_HEALTH]
    
    if(
g_preinfect[index]) 
        
health *= get_pcvar_float(cvar_zombie_hpmulti)
    
    
set_pev(indexpev_healthhealth)
    
set_pev(indexpev_gravityg_class_data[g_player_class[index]][DATA_GRAVITY])
    
set_pev(indexpev_body0)
    
set_pev(indexpev_armorvalue0.0)
    
set_pev(indexpev_renderamt0.0)
    
set_pev(indexpev_rendermodekRenderTransTexture)
    
    
fm_set_user_armortype(indexCS_ARMOR_NONE)
    
fm_set_user_nvg(index)
    
    if(
get_pcvar_num(cvar_autonvg)) 
        
engclient_cmd(index"nightvision")
    
    if(!
pev_valid(g_modelent[index]))
    {
        static 
ent
        ent 
engfunc(EngFunc_CreateNamedEntityengfunc(EngFunc_AllocString"info_target"))
        if(
pev_valid(ent))
        {
            
engfunc(EngFunc_SetModelentg_class_pmodel[g_player_class[index]])
            
set_pev(entpev_classnameMODEL_CLASSNAME)
            
set_pev(entpev_movetypeMOVETYPE_FOLLOW)
            
set_pev(entpev_aimentindex)
            
set_pev(entpev_ownerindex)
                
            
g_modelent[index] = ent
        
}
    }
    else
    {
        
engfunc(EngFunc_SetModelg_modelent[index], g_class_pmodel[g_player_class[index]])
        
fm_set_entity_visibility(g_modelent[index], 1)
    }

    static 
effects
    effects 
pev(indexpev_effects)
    
    if(
effects EF_DIMLIGHT)
    {
        
message_begin(MSG_ONEg_msg_flashlight_index)
        
write_byte(0)
        
write_byte(100)
        
message_end()
        
        
set_pev(indexpev_effectseffects & ~EF_DIMLIGHT)
    }
}

stock bool:allow_infection()
{
    static 
count[2]
    
count[0] = 0
    count
[1] = 0
    
    
static indexmaxzombies
    
for(index 1index <= g_maxplayersindex++)
    {
        if(
is_user_connected(index) && g_zombie[index]) 
            
count[0]++
        else if(
is_user_alive(index)) 
            
count[1]++
    }
    
    
maxzombies clamp(get_pcvar_num(cvar_maxzombies), 131)
    return (
count[0] < maxzombies && count[1] > 1) ? true false
}

stock randomly_pick_zombie()
{
    static 
data[4]
    
data[0] = 
    data
[1] = 
    data
[2] = 
    data
[3] = 0
    
    
static indexplayers[2][32]
    for(
index 1index <= g_maxplayersindex++)
    {
        if(!
is_user_alive(index)) 
            continue
        
        if(
g_zombie[index])
        {
            
data[0]++
            
players[0][data[2]++] = index
        
}
        else 
        {
            
data[1]++
            
players[1][data[3]++] = index
        
}
    }

    if(
data[0] > &&  data[1] < 1
        return 
players[0][_random(data[2])]
    
    return (
data[0] < && data[1] > 0) ?  players[1][_random(data[3])] : 0
}

stock equipweapon(idweapon)
{
    if(!
is_user_alive(id)) 
        return

    static 
weaponid[2], weaponentweapname[32]
    
    if(
weapon EQUIP_PRI)
    {
        
weaponent fm_lastprimary(id)
        
weaponid[1] = get_weaponid(g_primaryweapons[g_player_weapons[id][0]][1])
        
        if(
pev_valid(weaponent))
        {
            
weaponid[0] = fm_get_weapon_id(weaponent)
            if(
weaponid[0] != weaponid[1])
            {
                
get_weaponname(weaponid[0], weapname31)
                
bacon_strip_weapon(idweapname)
            }
        }
        else
            
weaponid[0] = -1
        
        
if(weaponid[0] != weaponid[1])
            
bacon_give_weapon(idg_primaryweapons[g_player_weapons[id][0]][1])
        
        
fm_set_user_bpammo(idweaponid[1], g_weapon_ammo[weaponid[1]][MAX_AMMO])
    }

    if(
weapon EQUIP_SEC)
    {
        
weaponent fm_lastsecondry(id)
        
weaponid[1] = get_weaponid(g_secondaryweapons[g_player_weapons[id][1]][1])
        
        if(
pev_valid(weaponent))
        {
            
weaponid[0] = fm_get_weapon_id(weaponent)
            if(
weaponid[0] != weaponid[1])
            {
                
get_weaponname(weaponid[0], weapname31)
                
bacon_strip_weapon(idweapname)
            }
        }
        else
            
weaponid[0] = -1
        
        
if(weaponid[0] != weaponid[1])
            
bacon_give_weapon(idg_secondaryweapons[g_player_weapons[id][1]][1])
        
        
fm_set_user_bpammo(idweaponid[1], g_weapon_ammo[weaponid[1]][MAX_AMMO])
    }
    
    if(
weapon EQUIP_GREN)
    {
        static 
i
        
for(0sizeof g_grenadesi++) if(!user_has_weapon(idget_weaponid(g_grenades[i])))
            
bacon_give_weapon(idg_grenades[i])
    }
}

stock add_delay(index, const task[])
{
    switch(
index)
    {
        case 
1..8:   set_task(0.1taskindex)
        case 
9..16:  set_task(0.2taskindex)
        case 
17..24set_task(0.3taskindex)
        case 
25..32set_task(0.4taskindex)
    }


Last edited by Wats0N; 09-29-2017 at 18:03.
Wats0N is offline
Relaxing
AlliedModders Donor
Join Date: Jun 2016
Location: White Plains
Old 09-29-2017 , 18:26   Re: How to add 2 plugin for mode?
Reply With Quote #14

#include <engine>
__________________
Relaxing is offline
edon1337
Penguin Enthusiast
Join Date: Jun 2016
Location: Macedonia
Old 09-30-2017 , 04:51   Re: How to add 2 plugin for mode?
Reply With Quote #15

Quote:
Originally Posted by Relaxing View Post
#include <engine>
For the 3rd time, it won't work, that's not how you compare a bitsum.
__________________
edon1337 is offline
Ayman Khaled
Senior Member
Join Date: Mar 2017
Location: Palestine
Old 09-30-2017 , 07:32   Re: How to add 2 plugin for mode?
Reply With Quote #16

if ( get_user_flags(id) & ADMIN_* )
__________________
Ayman Khaled is offline
edon1337
Penguin Enthusiast
Join Date: Jun 2016
Location: Macedonia
Old 09-30-2017 , 15:02   Re: How to add 2 plugin for mode?
Reply With Quote #17

If you're trying to check if he has 'bit' flags you need to use 'has_all_flags(id,flags[])'.
__________________

Last edited by edon1337; 09-30-2017 at 15:02.
edon1337 is offline
Wats0N
Member
Join Date: Aug 2016
Old 10-04-2017 , 11:42   Re: How to add 2 plugin for mode?
Reply With Quote #18

It does not work either now.
Can someone solve a solution?
Wats0N is offline
edon1337
Penguin Enthusiast
Join Date: Jun 2016
Location: Macedonia
Old 10-04-2017 , 13:50   Re: How to add 2 plugin for mode?
Reply With Quote #19

Give the full code.
__________________
edon1337 is offline
Wats0N
Member
Join Date: Aug 2016
Old 10-05-2017 , 11:38   Re: How to add 2 plugin for mode?
Reply With Quote #20

Biohazard SMA:

HTML Code:
 /* Biohazard mod
*   
*  by Cheap_Suit
*
*  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 2 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, write to the Free Software Foundation,
*  Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*  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.
*/

#define VERSION	"2.00 Beta 3"

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

#tryinclude "biohazard.cfg"

#if !defined _biohazardcfg_included
	#assert Biohazard configuration file required!
#elseif AMXX_VERSION_NUM < 180
	#assert AMX Mod X v1.8.0 or greater required!
#endif

#define OFFSET_DEATH 444
#define OFFSET_TEAM 114
#define OFFSET_ARMOR 112
#define OFFSET_NVG 129
#define OFFSET_CSMONEY 115
#define OFFSET_PRIMARYWEAPON 116
#define OFFSET_WEAPONTYPE 43
#define OFFSET_CLIPAMMO	51
#define EXTRAOFFSET_WEAPONS 4

#define OFFSET_AMMO_338MAGNUM 377
#define OFFSET_AMMO_762NATO 378
#define OFFSET_AMMO_556NATOBOX 379
#define OFFSET_AMMO_556NATO 380
#define OFFSET_AMMO_BUCKSHOT 381
#define OFFSET_AMMO_45ACP 382
#define OFFSET_AMMO_57MM 383
#define OFFSET_AMMO_50AE 384
#define OFFSET_AMMO_357SIG 385
#define OFFSET_AMMO_9MM 386

#define OFFSET_LASTPRIM 368
#define OFFSET_LASTSEC 369
#define OFFSET_LASTKNI 370

#define TASKID_STRIPNGIVE 698
#define TASKID_NEWROUND	641
#define TASKID_INITROUND 222
#define TASKID_STARTROUND 153
#define TASKID_BALANCETEAM 375
#define TASKID_UPDATESCR 264
#define TASKID_SPAWNDELAY 786
#define TASKID_WEAPONSMENU 564
#define TASKID_CHECKSPAWN 423
#define TASKID_CZBOTPDATA 312

#define EQUIP_PRI (1<<0)
#define EQUIP_SEC (1<<1)
#define EQUIP_GREN (1<<2)
#define EQUIP_ALL (1<<0 | 1<<1 | 1<<2)

#define HAS_NVG (1<<0)
#define ATTRIB_BOMB (1<<1)
#define DMG_HEGRENADE (1<<24)

#define MODEL_CLASSNAME "player_model"
#define IMPULSE_FLASHLIGHT 100

#define MAX_SPAWNS 128
#define MAX_CLASSES 10
#define MAX_DATA 11

#define DATA_HEALTH 0
#define DATA_SPEED 1
#define DATA_GRAVITY 2
#define DATA_ATTACK 3
#define DATA_DEFENCE 4
#define DATA_HEDEFENCE 5
#define DATA_HITSPEED 6
#define DATA_HITDELAY 7
#define DATA_REGENDLY 8
#define DATA_HITREGENDLY 9
#define DATA_KNOCKBACK 10

#define fm_get_user_team(%1) get_pdata_int(%1, OFFSET_TEAM)
#define fm_get_user_deaths(%1) get_pdata_int(%1, OFFSET_DEATH)
#define fm_set_user_deaths(%1,%2) set_pdata_int(%1, OFFSET_DEATH, %2)
#define fm_get_user_money(%1) get_pdata_int(%1, OFFSET_CSMONEY)
#define fm_get_user_armortype(%1) get_pdata_int(%1, OFFSET_ARMOR)
#define fm_set_user_armortype(%1,%2) set_pdata_int(%1, OFFSET_ARMOR, %2)
#define fm_get_weapon_id(%1) get_pdata_int(%1, OFFSET_WEAPONTYPE, EXTRAOFFSET_WEAPONS)
#define fm_get_weapon_ammo(%1) get_pdata_int(%1, OFFSET_CLIPAMMO, EXTRAOFFSET_WEAPONS)
#define fm_set_weapon_ammo(%1,%2) set_pdata_int(%1, OFFSET_CLIPAMMO, %2, EXTRAOFFSET_WEAPONS)
#define fm_reset_user_primary(%1) set_pdata_int(%1, OFFSET_PRIMARYWEAPON, 0)
#define fm_lastprimary(%1) get_pdata_cbase(id, OFFSET_LASTPRIM)
#define fm_lastsecondry(%1) get_pdata_cbase(id, OFFSET_LASTSEC)
#define fm_lastknife(%1) get_pdata_cbase(id, OFFSET_LASTKNI)
#define fm_get_user_model(%1,%2,%3) engfunc(EngFunc_InfoKeyValue, engfunc(EngFunc_GetInfoKeyBuffer, %1), "model", %2, %3) 

#define _random(%1) random_num(0, %1 - 1)
#define AMMOWP_NULL (1<<0 | 1<<CSW_KNIFE | 1<<CSW_FLASHBANG | 1<<CSW_HEGRENADE | 1<<CSW_SMOKEGRENADE | 1<<CSW_C4)

enum
{
	MAX_CLIP = 0,
	MAX_AMMO
}

enum
{
	MENU_PRIMARY = 1,
	MENU_SECONDARY
}

enum
{
	CS_TEAM_UNASSIGNED = 0,
	CS_TEAM_T,
	CS_TEAM_CT,
	CS_TEAM_SPECTATOR
}

enum
{
	CS_ARMOR_NONE = 0,
	CS_ARMOR_KEVLAR,
	CS_ARMOR_VESTHELM
}

enum
{
	KBPOWER_357SIG = 0,
	KBPOWER_762NATO,
	KBPOWER_BUCKSHOT,
	KBPOWER_45ACP,
	KBPOWER_556NATO,
	KBPOWER_9MM,
	KBPOWER_57MM,
	KBPOWER_338MAGNUM,
	KBPOWER_556NATOBOX,
	KBPOWER_50AE
}

new const g_weapon_ammo[][] =
{
	{ -1, -1 },
	{ 13, 52 },
	{ -1, -1 },
	{ 10, 90 },
	{ -1, -1 },
	{ 7, 32 },
	{ -1, -1 },
	{ 30, 100 },
	{ 30, 90 },
	{ -1, -1 },
	{ 30, 120 },
	{ 20, 100 },
	{ 25, 100 },
	{ 30, 90 },
	{ 35, 90 },
	{ 25, 90 },
	{ 12, 100 },
	{ 20, 120 },
	{ 10, 30 },
	{ 30, 120 },
	{ 100, 200 },
	{ 8, 32 },
	{ 30, 90 },
	{ 30, 120 },
	{ 20, 90 },
	{ -1, -1 },
	{ 7, 35 },
	{ 30, 90 },
	{ 30, 90 },
	{ -1, -1 },
	{ 50, 100 }
}

new const g_weapon_knockback[] =
{
	-1, 
	KBPOWER_357SIG, 
	-1, 
	KBPOWER_762NATO, 
	-1, 
	KBPOWER_BUCKSHOT, 
	-1, 
	KBPOWER_45ACP, 
	KBPOWER_556NATO, 
	-1, 
	KBPOWER_9MM, 
	KBPOWER_57MM,
	KBPOWER_45ACP, 
	KBPOWER_556NATO, 
	KBPOWER_556NATO, 
	KBPOWER_556NATO, 
	KBPOWER_45ACP,
	KBPOWER_9MM, 
	KBPOWER_338MAGNUM,
	KBPOWER_9MM, 
	KBPOWER_556NATOBOX,
	KBPOWER_BUCKSHOT, 
	KBPOWER_556NATO, 
	KBPOWER_9MM, 
	KBPOWER_762NATO, 
	-1, 
	KBPOWER_50AE, 
	KBPOWER_556NATO, 
	KBPOWER_762NATO, 
	-1, 
	KBPOWER_57MM
}

new const g_remove_entities[][] = 
{ 
	"func_bomb_target",    
	"info_bomb_target", 
	"hostage_entity",      
	"monster_scientist", 
	"func_hostage_rescue", 
	"info_hostage_rescue",
	"info_vip_start",      
	"func_vip_safetyzone", 
	"func_escapezone",     
	"func_buyzone"
}

new const g_dataname[][] = 
{ 
	"HEALTH", 
	"SPEED", 
	"GRAVITY", 
	"ATTACK", 
	"DEFENCE", 
	"HEDEFENCE", 
	"HITSPEED", 
	"HITDELAY", 
	"REGENDLY", 
	"HITREGENDLY", 
	"KNOCKBACK" 
}
new const g_teaminfo[][] = 
{ 
	"UNASSIGNED", 
	"TERRORIST",
	"CT",
	"SPECTATOR" 
}

new g_maxplayers, g_spawncount, g_buyzone, g_botclient_pdata, g_sync_hpdisplay, 
    g_sync_msgdisplay, g_fwd_spawn, g_fwd_result, g_fwd_infect, g_fwd_gamestart, 
    g_msg_flashlight, g_msg_teaminfo, g_msg_scoreattrib, g_msg_money, g_msg_scoreinfo, 
    g_msg_deathmsg , g_msg_screenfade, Float:g_buytime,  Float:g_spawns[MAX_SPAWNS+1][9],
    Float:g_vecvel[3], bool:g_brestorevel, bool:g_infecting, bool:g_gamestarted,
    bool:g_roundstarted, bool:g_roundended, bool:g_czero, g_class_name[MAX_CLASSES+1][32], 
    g_classcount, g_class_desc[MAX_CLASSES+1][32], g_class_pmodel[MAX_CLASSES+1][64], 
    g_class_wmodel[MAX_CLASSES+1][64], Float:g_class_data[MAX_CLASSES+1][MAX_DATA]
    
new cvar_randomspawn, cvar_skyname, cvar_autoteambalance[4], cvar_starttime, cvar_autonvg, 
    cvar_winsounds, cvar_weaponsmenu, cvar_lights, cvar_killbonus, cvar_enabled, 
    cvar_gamedescription, cvar_botquota, cvar_maxzombies, cvar_flashbang, cvar_buytime,
    cvar_respawnaszombie, cvar_punishsuicide, cvar_infectmoney, cvar_showtruehealth,
    cvar_obeyarmor, cvar_impactexplode, cvar_caphealthdisplay, cvar_zombie_hpmulti,
    cvar_randomclass, cvar_zombiemulti, cvar_knockback, cvar_knockback_dist, cvar_ammo,
    cvar_knockback_duck, cvar_killreward, cvar_painshockfree, cvar_zombie_class,
    cvar_shootobjects, cvar_pushpwr_weapon, cvar_pushpwr_zombie
    
new bool:g_zombie[33], bool:g_falling[33], bool:g_disconnected[33], bool:g_blockmodel[33], 
    bool:g_showmenu[33], bool:g_menufailsafe[33], bool:g_preinfect[33], bool:g_welcomemsg[33], 
    bool:g_suicide[33], Float:g_regendelay[33], Float:g_hitdelay[33], g_mutate[33], g_victim[33], 
    g_modelent[33], g_menuposition[33], g_player_class[33], g_player_weapons[33][2]

public plugin_precache()
{
	register_plugin("Biohazard", VERSION, "cheap_suit")
	register_cvar("bh_version", VERSION, FCVAR_SPONLY|FCVAR_SERVER)
	set_cvar_string("bh_version", VERSION)
	
	cvar_enabled = register_cvar("bh_enabled", "1")

	if(!get_pcvar_num(cvar_enabled)) 
		return
	
	cvar_gamedescription = register_cvar("bh_gamedescription", "Biohazard")
	cvar_skyname = register_cvar("bh_skyname", "drkg")
	cvar_lights = register_cvar("bh_lights", "d")
	cvar_starttime = register_cvar("bh_starttime", "15.0")
	cvar_buytime = register_cvar("bh_buytime", "0")
	cvar_randomspawn = register_cvar("bh_randomspawn", "0")
	cvar_punishsuicide = register_cvar("bh_punishsuicide", "1")
	cvar_winsounds = register_cvar("bh_winsounds", "1")
	cvar_autonvg = register_cvar("bh_autonvg", "1")
	cvar_respawnaszombie = register_cvar("bh_respawnaszombie", "1")
	cvar_painshockfree = register_cvar("bh_painshockfree", "1")
	cvar_knockback = register_cvar("bh_knockback", "1")
	cvar_knockback_duck = register_cvar("bh_knockback_duck", "1")
	cvar_knockback_dist = register_cvar("bh_knockback_dist", "280.0")
	cvar_obeyarmor = register_cvar("bh_obeyarmor", "0")
	cvar_infectmoney = register_cvar("bh_infectionmoney", "0")
	cvar_caphealthdisplay = register_cvar("bh_caphealthdisplay", "1")
	cvar_weaponsmenu = register_cvar("bh_weaponsmenu", "1")
	cvar_ammo = register_cvar("bh_ammo", "1")
	cvar_maxzombies = register_cvar("bh_maxzombies", "31")
	cvar_flashbang = register_cvar("bh_flashbang", "1")
	cvar_impactexplode = register_cvar("bh_impactexplode", "1")
	cvar_showtruehealth = register_cvar("bh_showtruehealth", "1")
	cvar_zombiemulti = register_cvar("bh_zombie_countmulti", "0.15")
	cvar_zombie_hpmulti = register_cvar("bh_zombie_hpmulti", "2.0")
	cvar_zombie_class = register_cvar("bh_zombie_class", "1")
	cvar_randomclass = register_cvar("bh_randomclass", "1")
	cvar_killbonus = register_cvar("bh_kill_bonus", "1")
	cvar_killreward = register_cvar("bh_kill_reward", "2")
	cvar_shootobjects = register_cvar("bh_shootobjects", "1")
	cvar_pushpwr_weapon = register_cvar("bh_pushpwr_weapon", "2.0")
	cvar_pushpwr_zombie = register_cvar("bh_pushpwr_zombie", "5.0")
	
	new file[64]
	get_configsdir(file, 63)
	format(file, 63, "%s/bh_cvars.cfg", file)
	
	if(file_exists(file)) 
		server_cmd("exec %s", file)
	
	new mapname[32]
	get_mapname(mapname, 31)
	register_spawnpoints(mapname)
		
	register_zombieclasses("bh_zombieclass.ini")
	register_dictionary("biohazard.txt")
	
	precache_model(DEFAULT_PMODEL)
	precache_model(DEFAULT_WMODEL)
	
	new i
	for(i = 0; i < g_classcount; i++)
	{
		precache_model(g_class_pmodel[i])
		precache_model(g_class_wmodel[i])
	}
	
	for(i = 0; i < sizeof g_zombie_miss_sounds; i++)
		precache_sound(g_zombie_miss_sounds[i])
	
	for(i = 0; i < sizeof g_zombie_hit_sounds; i++) 
		precache_sound(g_zombie_hit_sounds[i])
	
	for(i = 0; i < sizeof g_scream_sounds; i++) 
		precache_sound(g_scream_sounds[i])
	
	for(i = 0; i < sizeof g_zombie_die_sounds; i++)
		precache_sound(g_zombie_die_sounds[i])
	
	for(i = 0; i < sizeof g_zombie_win_sounds; i++) 
		precache_sound(g_zombie_win_sounds[i])
	
	g_fwd_spawn = register_forward(FM_Spawn, "fwd_spawn")
	
	g_buyzone = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "func_buyzone"))
	if(g_buyzone) 
	{
		dllfunc(DLLFunc_Spawn, g_buyzone)
		set_pev(g_buyzone, pev_solid, SOLID_NOT)
	}
	
	new ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_bomb_target"))
	if(ent) 
	{
		dllfunc(DLLFunc_Spawn, ent)
		set_pev(ent, pev_solid, SOLID_NOT)
	}

	#if FOG_ENABLE
	ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "env_fog"))
	if(ent)
	{
		fm_set_kvd(ent, "density", FOG_DENSITY, "env_fog")
		fm_set_kvd(ent, "rendercolor", FOG_COLOR, "env_fog")
	}
	#endif
}

public plugin_init()
{
	if(!get_pcvar_num(cvar_enabled)) 
		return
	
	cvar_botquota = get_cvar_pointer("bot_quota")
	cvar_autoteambalance[0] = get_cvar_pointer("mp_autoteambalance")
	cvar_autoteambalance[1] = get_pcvar_num(cvar_autoteambalance[0])
	set_pcvar_num(cvar_autoteambalance[0], 0)

	register_clcmd("jointeam", "cmd_jointeam")
	register_clcmd("say /class", "cmd_classmenu")
	register_clcmd("say /guns", "cmd_enablemenu")
	register_clcmd("say /help", "cmd_helpmotd")
	register_clcmd("amx_infect", "cmd_infectuser", ADMIN_BAN, "<name or #userid>")
	
	register_menu("Equipment", 1023, "action_equip")
	register_menu("Primary", 1023, "action_prim")
	register_menu("Secondary", 1023, "action_sec")
	register_menu("Class", 1023, "action_class")
	
	unregister_forward(FM_Spawn, g_fwd_spawn)
	register_forward(FM_CmdStart, "fwd_cmdstart")
	register_forward(FM_EmitSound, "fwd_emitsound")
	register_forward(FM_GetGameDescription, "fwd_gamedescription")
	register_forward(FM_CreateNamedEntity, "fwd_createnamedentity")
	register_forward(FM_ClientKill, "fwd_clientkill")
	register_forward(FM_PlayerPreThink, "fwd_player_prethink")
	register_forward(FM_PlayerPreThink, "fwd_player_prethink_post", 1)
	register_forward(FM_PlayerPostThink, "fwd_player_postthink")
	register_forward(FM_SetClientKeyValue, "fwd_setclientkeyvalue")

	RegisterHam(Ham_TakeDamage, "player", "bacon_takedamage_player")
	RegisterHam(Ham_Killed, "player", "bacon_killed_player")
	RegisterHam(Ham_Spawn, "player", "bacon_spawn_player_post", 1)
	RegisterHam(Ham_TraceAttack, "player", "bacon_traceattack_player")
	RegisterHam(Ham_TraceAttack, "func_pushable", "bacon_traceattack_pushable")
	RegisterHam(Ham_Use, "func_tank", "bacon_use_tank")
	RegisterHam(Ham_Use, "func_tankmortar", "bacon_use_tank")
	RegisterHam(Ham_Use, "func_tankrocket", "bacon_use_tank")
	RegisterHam(Ham_Use, "func_tanklaser", "bacon_use_tank")
	RegisterHam(Ham_Use, "func_pushable", "bacon_use_pushable")
	RegisterHam(Ham_Touch, "func_pushable", "bacon_touch_pushable")
	RegisterHam(Ham_Touch, "weaponbox", "bacon_touch_weapon")
	RegisterHam(Ham_Touch, "armoury_entity", "bacon_touch_weapon")
	RegisterHam(Ham_Touch, "weapon_shield", "bacon_touch_weapon")
	RegisterHam(Ham_Touch, "grenade", "bacon_touch_grenade")
	
	register_message(get_user_msgid("Health"), "msg_health")
	register_message(get_user_msgid("TextMsg"), "msg_textmsg")
	register_message(get_user_msgid("SendAudio"), "msg_sendaudio")
	register_message(get_user_msgid("StatusIcon"), "msg_statusicon")
	register_message(get_user_msgid("ScoreAttrib"), "msg_scoreattrib")
	register_message(get_user_msgid("DeathMsg"), "msg_deathmsg")
	register_message(get_user_msgid("ScreenFade"), "msg_screenfade")
	register_message(get_user_msgid("TeamInfo"), "msg_teaminfo")
	register_message(get_user_msgid("ClCorpse"), "msg_clcorpse")
	register_message(get_user_msgid("WeapPickup"), "msg_weaponpickup")
	register_message(get_user_msgid("AmmoPickup"), "msg_ammopickup")
	
	register_event("TextMsg", "event_textmsg", "a", "2=#Game_will_restart_in")
	register_event("HLTV", "event_newround", "a", "1=0", "2=0")
	register_event("CurWeapon", "event_curweapon", "be", "1=1")
	register_event("ArmorType", "event_armortype", "be")
	register_event("Damage", "event_damage", "be")
	
	register_logevent("logevent_round_start", 2, "1=Round_Start")
	register_logevent("logevent_round_end", 2, "1=Round_End")
	
	g_msg_flashlight = get_user_msgid("Flashlight")
	g_msg_teaminfo = get_user_msgid("TeamInfo")
	g_msg_scoreattrib = get_user_msgid("ScoreAttrib")
	g_msg_scoreinfo = get_user_msgid("ScoreInfo")
	g_msg_deathmsg = get_user_msgid("DeathMsg")
	g_msg_money = get_user_msgid("Money")
	g_msg_screenfade = get_user_msgid("ScreenFade")
	
	g_fwd_infect = CreateMultiForward("event_infect", ET_IGNORE, FP_CELL, FP_CELL)
	g_fwd_gamestart = CreateMultiForward("event_gamestart", ET_IGNORE)

	g_sync_hpdisplay = CreateHudSyncObj()
	g_sync_msgdisplay = CreateHudSyncObj()
	
	g_maxplayers = get_maxplayers()
	
	new mod[3]
	get_modname(mod, 2)
	
	g_czero = (mod[0] == 'c' && mod[1] == 'z') ? true : false
	
	new skyname[32]
	get_pcvar_string(cvar_skyname, skyname, 31)
		
	if(strlen(skyname) > 0)
		set_cvar_string("sv_skyname", skyname)
	
	new lights[2]
	get_pcvar_string(cvar_lights, lights, 1)
	
	if(strlen(lights) > 0)
	{
		set_task(3.0, "task_lights", _, _, _, "b")
		
		set_cvar_num("sv_skycolor_r", 0)
		set_cvar_num("sv_skycolor_g", 0)
		set_cvar_num("sv_skycolor_b", 0)
	}
	
	if(get_pcvar_num(cvar_showtruehealth))
		set_task(0.1, "task_showtruehealth", _, _, _, "b")
}

public plugin_end()
{
	if(get_pcvar_num(cvar_enabled))
		set_pcvar_num(cvar_autoteambalance[0], cvar_autoteambalance[1])
}

public plugin_natives()
{
	register_library("biohazardf")
	register_native("preinfect_user", "native_preinfect_user", 1)
	register_native("infect_user", "native_infect_user", 1)
	register_native("cure_user", "native_cure_user", 1)
	register_native("register_class", "native_register_class", 1)
	register_native("get_class_id", "native_get_class_id", 1)
	register_native("set_class_pmodel", "native_set_class_pmodel", 1)
	register_native("set_class_wmodel", "native_set_class_wmodel", 1)
	register_native("set_class_data", "native_set_class_data", 1)
	register_native("get_class_data", "native_get_class_data", 1)
	register_native("game_started", "native_game_started", 1)
	register_native("is_user_zombie", "native_is_user_zombie", 1)
	register_native("is_user_infected", "native_is_user_infected", 1)
	register_native("get_user_class", "native_get_user_class",  1)
}

public client_connect(id)
{
	g_showmenu[id] = true
	g_welcomemsg[id] = true
	g_blockmodel[id] = true
	g_zombie[id] = false
	g_preinfect[id] = false
	g_disconnected[id] = false
	g_falling[id] = false
	g_menufailsafe[id] = false
	g_victim[id] = 0
	g_mutate[id] = -1
	g_player_class[id] = 0
	g_player_weapons[id][0] = -1
	g_player_weapons[id][1] = -1
	g_regendelay[id] = 0.0
	g_hitdelay[id] = 0.0

	remove_user_model(g_modelent[id])
}

public client_putinserver(id)
{
	if(!g_botclient_pdata && g_czero) 
	{
		static param[1]
		param[0] = id
		
		if(!task_exists(TASKID_CZBOTPDATA))
			set_task(1.0, "task_botclient_pdata", TASKID_CZBOTPDATA, param, 1)
	}
	
	if(get_pcvar_num(cvar_randomclass) && g_classcount > 1)
		g_player_class[id] = _random(g_classcount)
}

public client_disconnect(id)
{
	remove_task(TASKID_STRIPNGIVE + id)
	remove_task(TASKID_UPDATESCR + id)
	remove_task(TASKID_SPAWNDELAY + id)
	remove_task(TASKID_WEAPONSMENU + id)
	remove_task(TASKID_CHECKSPAWN + id)

	g_disconnected[id] = true
	remove_user_model(g_modelent[id])
}

public cmd_jointeam(id)
{
	if(is_user_alive(id) && g_zombie[id])
	{
		client_print(id, print_center, "%L", id, "CMD_TEAMCHANGE")
		return PLUGIN_HANDLED
	}
	return PLUGIN_CONTINUE
}

public cmd_classmenu(id)
	if(g_classcount > 1) display_classmenu(id, g_menuposition[id] = 0)
	
public cmd_enablemenu(id)
{	
	if(get_pcvar_num(cvar_weaponsmenu))
	{
		client_print(id, print_chat, "%L", id, g_showmenu[id] == false ? "MENU_REENABLED" : "MENU_ALENABLED")
		g_showmenu[id] = true
	}
}

public cmd_helpmotd(id)
{
	static motd[2048]
	formatex(motd, 2047, "%L", id, "HELP_MOTD")
	replace(motd, 2047, "#Version#", VERSION)
	
	show_motd(id, motd, "Biohazard Help")
}	

public cmd_infectuser(id, level, cid)
{
	if(!cmd_access(id, level, cid, 2))
		return PLUGIN_HANDLED_MAIN
	
	static arg1[32]
	read_argv(1, arg1, 31)
	
	static target
	target = cmd_target(id, arg1, (CMDTARGET_OBEY_IMMUNITY|CMDTARGET_ALLOW_SELF|CMDTARGET_ONLY_ALIVE))
	
	if(!is_user_connected(target) || g_zombie[target])
		return PLUGIN_HANDLED_MAIN
	
	if(!allow_infection())
	{
		console_print(id, "%L", id, "CMD_MAXZOMBIES")
		return PLUGIN_HANDLED_MAIN
	}
	
	if(!g_gamestarted)
	{
		console_print(id, "%L", id, "CMD_GAMENOTSTARTED")
		return PLUGIN_HANDLED_MAIN
	}
			
	static name[32] 
	get_user_name(target, name, 31)
	
	console_print(id, "%L", id, "CMD_INFECTED", name)
	infect_user(target, 0)
	
	return PLUGIN_HANDLED_MAIN
}

public msg_teaminfo(msgid, dest, id)
{
	if(!g_gamestarted)
		return PLUGIN_CONTINUE

	static team[2]
	get_msg_arg_string(2, team, 1)
	
	if(team[0] != 'U')
		return PLUGIN_CONTINUE

	id = get_msg_arg_int(1)
	if(is_user_alive(id) || !g_disconnected[id])
		return PLUGIN_CONTINUE

	g_disconnected[id] = false
	id = randomly_pick_zombie()
	if(id)
	{
		fm_set_user_team(id, g_zombie[id] ? CS_TEAM_CT : CS_TEAM_T, 0)
		set_pev(id, pev_deadflag, DEAD_RESPAWNABLE)
	}
	return PLUGIN_CONTINUE
}

public msg_screenfade(msgid, dest, id)
{
	if(!get_pcvar_num(cvar_flashbang))
		return PLUGIN_CONTINUE
	
	if(!g_zombie[id] || !is_user_alive(id))
	{
		static data[4]
		data[0] = get_msg_arg_int(4)
		data[1] = get_msg_arg_int(5)
		data[2] = get_msg_arg_int(6)
		data[3] = get_msg_arg_int(7)
		
		if(data[0] == 255 && data[1] == 255 && data[2] == 255 && data[3] > 199)
			return PLUGIN_HANDLED
	}
	return PLUGIN_CONTINUE
}

public msg_scoreattrib(msgid, dest, id)
{
	static attrib 
	attrib = get_msg_arg_int(2)
	
	if(attrib == ATTRIB_BOMB)
		set_msg_arg_int(2, ARG_BYTE, 0)
}

public msg_statusicon(msgid, dest, id)
{
	static icon[3]
	get_msg_arg_string(2, icon, 2)
	
	return (icon[0] == 'c' && icon[1] == '4') ? PLUGIN_HANDLED : PLUGIN_CONTINUE
}

public msg_weaponpickup(msgid, dest, id)
	return g_zombie[id] ? PLUGIN_HANDLED : PLUGIN_CONTINUE

public msg_ammopickup(msgid, dest, id)
	return g_zombie[id] ? PLUGIN_HANDLED : PLUGIN_CONTINUE

public msg_deathmsg(msgid, dest, id) 
{
	static killer
	killer = get_msg_arg_int(1)

	if(is_user_connected(killer) && g_zombie[killer])
		set_msg_arg_string(4, g_zombie_weapname)
}

public msg_sendaudio(msgid, dest, id)
{
	if(!get_pcvar_num(cvar_winsounds))
		return PLUGIN_CONTINUE
	
	static audiocode [22]
	get_msg_arg_string(2, audiocode, 21)
	
	if(equal(audiocode[7], "terwin"))
		set_msg_arg_string(2, g_zombie_win_sounds[_random(sizeof g_zombie_win_sounds)])
	else if(equal(audiocode[7], "ctwin"))
		set_msg_arg_string(2, g_survivor_win_sounds[_random(sizeof g_survivor_win_sounds)])
	
	return PLUGIN_CONTINUE
}

public msg_health(msgid, dest, id)
{
	if(!get_pcvar_num(cvar_caphealthdisplay))
		return PLUGIN_CONTINUE
	
	static health
	health = get_msg_arg_int(1)
		
	if(health > 255) 
		set_msg_arg_int(1, ARG_BYTE, 255)
	
	return PLUGIN_CONTINUE
}

public msg_textmsg(msgid, dest, id)
{
	if(get_msg_arg_int(1) != 4)
		return PLUGIN_CONTINUE
	
	static txtmsg[25], winmsg[32]
	get_msg_arg_string(2, txtmsg, 24)
	
	if(equal(txtmsg[1], "Game_bomb_drop"))
		return PLUGIN_HANDLED

	else if(equal(txtmsg[1], "Terrorists_Win"))
	{
		formatex(winmsg, 31, "%L", LANG_SERVER, "WIN_TXT_ZOMBIES")
		set_msg_arg_string(2, winmsg)
	}
	else if(equal(txtmsg[1], "Target_Saved") || equal(txtmsg[1], "CTs_Win"))
	{
		formatex(winmsg, 31, "%L", LANG_SERVER, "WIN_TXT_SURVIVORS")
		set_msg_arg_string(2, winmsg)
	}
	return PLUGIN_CONTINUE
}

public msg_clcorpse(msgid, dest, id)
{
	id = get_msg_arg_int(12)
	if(!g_zombie[id])
		return PLUGIN_CONTINUE
	
	static ent
	ent = fm_find_ent_by_owner(-1, MODEL_CLASSNAME, id)
	
	if(ent)
	{
		static model[64]
		pev(ent, pev_model, model, 63)
		
		set_msg_arg_string(1, model)
	}
	return PLUGIN_CONTINUE
}

public logevent_round_start()
{
	g_roundended = false
	g_roundstarted = true
	
	if(get_pcvar_num(cvar_weaponsmenu))
	{
		static id, team
		for(id = 1; id <= g_maxplayers; id++) if(is_user_alive(id))
		{
			team = fm_get_user_team(id)
			if(team == CS_TEAM_T || team == CS_TEAM_CT)
			{
				if(is_user_bot(id)) 
					bot_weapons(id)
				else 
				{
					if(g_showmenu[id])
					{
						add_delay(id, "display_equipmenu")
						
						g_menufailsafe[id] = true
						set_task(10.0, "task_weaponsmenu", TASKID_WEAPONSMENU + id)
					}
					else	
						equipweapon(id, EQUIP_ALL)
				}
			}
		}
	}
}

public logevent_round_end()
{
	g_gamestarted = false 
	g_roundstarted = false 
	g_roundended = true
	
	remove_task(TASKID_BALANCETEAM) 
	remove_task(TASKID_INITROUND)
	remove_task(TASKID_STARTROUND)
	
	set_task(0.1, "task_balanceteam", TASKID_BALANCETEAM)
}

public event_textmsg()
{
	g_gamestarted = false 
	g_roundstarted = false 
	g_roundended = true
	
	static seconds[5] 
	read_data(3, seconds, 4)
	
	static Float:tasktime 
	tasktime = float(str_to_num(seconds)) - 0.5
	
	remove_task(TASKID_BALANCETEAM)
	
	set_task(tasktime, "task_balanceteam", TASKID_BALANCETEAM)
}

public event_newround()
{
	g_gamestarted = false
	
	static buytime 
	buytime = get_pcvar_num(cvar_buytime)
	
	if(buytime) 
		g_buytime = buytime + get_gametime()
	
	static id
	for(id = 0; id <= g_maxplayers; id++)
	{
		if(is_user_connected(id))
			g_blockmodel[id] = true
	}
	
	remove_task(TASKID_NEWROUND) 
	remove_task(TASKID_INITROUND)
	remove_task(TASKID_STARTROUND)
	
	set_task(0.1, "task_newround", TASKID_NEWROUND)
	set_task(get_pcvar_float(cvar_starttime), "task_initround", TASKID_INITROUND)
}

public event_curweapon(id)
{
	if(!is_user_alive(id))
		return PLUGIN_CONTINUE
	
	static weapon
	weapon = read_data(2)
	
	if(g_zombie[id])
	{
		if(weapon != CSW_KNIFE && !task_exists(TASKID_STRIPNGIVE + id))
			set_task(0.1, "task_stripngive", TASKID_STRIPNGIVE + id)
		
		return PLUGIN_CONTINUE
	}

	static ammotype
	ammotype = get_pcvar_num(cvar_ammo)
	
	if(!ammotype || (AMMOWP_NULL & (1<<weapon)))
		return PLUGIN_CONTINUE

	static maxammo
	switch(ammotype)
	{
		case 1: maxammo = g_weapon_ammo[weapon][MAX_AMMO]
		case 2: maxammo = g_weapon_ammo[weapon][MAX_CLIP]
	}

	if(!maxammo)
		return PLUGIN_CONTINUE
	
	switch(ammotype)
	{
		case 1:
		{
			static ammo
			ammo = fm_get_user_bpammo(id, weapon)
			
			if(ammo < 1) 
				fm_set_user_bpammo(id, weapon, maxammo)
		}
		case 2:
		{
			static clip; clip = read_data(3)
			if(clip < 1)
			{
				static weaponname[32]
				get_weaponname(weapon, weaponname, 31)
				
				static ent 
				ent = fm_find_ent_by_owner(-1, weaponname, id)
				
				fm_set_weapon_ammo(ent, maxammo)
			}
		}
	}	
	return PLUGIN_CONTINUE
}

public event_armortype(id)
{
	if(!is_user_alive(id) || !g_zombie[id])
		return PLUGIN_CONTINUE
	
	if(fm_get_user_armortype(id) != CS_ARMOR_NONE)
		fm_set_user_armortype(id, CS_ARMOR_NONE)
	
	return PLUGIN_CONTINUE
}

public event_damage(victim)
{
	if(!is_user_alive(victim) || !g_gamestarted)
		return PLUGIN_CONTINUE
	
	if(g_zombie[victim])
	{
		static Float:gametime
		gametime = get_gametime()
		
		g_regendelay[victim] = gametime + g_class_data[g_player_class[victim]][DATA_HITREGENDLY]
		g_hitdelay[victim] = gametime + g_class_data[g_player_class[victim]][DATA_HITDELAY]
	}
	else
	{
		static attacker
		attacker = get_user_attacker(victim)
		
		if(!is_user_alive(attacker) || !g_zombie[attacker] || g_infecting)
			return PLUGIN_CONTINUE
		
		if(g_victim[attacker] == victim)
		{
			g_infecting = true
			g_victim[attacker] = 0

			message_begin(MSG_ALL, g_msg_deathmsg)
			write_byte(attacker)
			write_byte(victim)
			write_byte(0)
			write_string(g_infection_name)
			message_end()
			
			message_begin(MSG_ALL, g_msg_scoreattrib)
			write_byte(victim)
			write_byte(0)
			message_end()
			
			infect_user(victim, attacker)
			
			static Float:frags, deaths
			pev(attacker, pev_frags, frags)
			deaths = fm_get_user_deaths(victim)
			
			set_pev(attacker, pev_frags, frags  + 1.0)
			fm_set_user_deaths(victim, deaths + 1)
			
			fm_set_user_money(attacker, get_pcvar_num(cvar_infectmoney))
		
			static params[2]
			params[0] = attacker 
			params[1] = victim
	
			set_task(0.3, "task_updatescore", TASKID_UPDATESCR, params, 2)
		}
		g_infecting = false
	}
	return PLUGIN_CONTINUE
}

public fwd_player_prethink(id)
{
	if(!is_user_alive(id) || !g_zombie[id])
		return FMRES_IGNORED
	
	static flags
	flags = pev(id, pev_flags)
	
	if(flags & FL_ONGROUND)
	{
		if(get_pcvar_num(cvar_painshockfree))
		{
			pev(id, pev_velocity, g_vecvel)
			g_brestorevel = true
		}
	}
	else
	{
		static Float:fallvelocity
		pev(id, pev_flFallVelocity, fallvelocity)
		
		g_falling[id] = fallvelocity >= 350.0 ? true : false
	}
		
	if(g_gamestarted)
	{	
		static Float:gametime
		gametime = get_gametime()
		
		static pclass
		pclass = g_player_class[id]

		static Float:health
		pev(id, pev_health, health)
		
		if(health < g_class_data[pclass][DATA_HEALTH] && g_regendelay[id] < gametime)
		{
			set_pev(id, pev_health, health + 1.0)
			g_regendelay[id] = gametime + g_class_data[pclass][DATA_REGENDLY]
		}
	}
	return FMRES_IGNORED
}

public fwd_player_prethink_post(id)
{
	if(!g_brestorevel)
		return FMRES_IGNORED

	g_brestorevel = false
		
	static flag
	flag = pev(id, pev_flags)
	
	if(!(flag & FL_ONTRAIN))
	{
		static ent
		ent = pev(id, pev_groundentity)
		
		if(pev_valid(ent) && (flag & FL_CONVEYOR))
		{
			static Float:vectemp[3]
			pev(id, pev_basevelocity, vectemp)
			
			xs_vec_add(g_vecvel, vectemp, g_vecvel)
		}

		if(g_hitdelay[id] > get_gametime() && (!(pev(id, pev_flags) & FL_DUCKING)))
			xs_vec_mul_scalar(g_vecvel, g_class_data[g_player_class[id]][DATA_HITSPEED], g_vecvel)
	
		set_pev(id, pev_velocity, g_vecvel)
		return FMRES_HANDLED
	}
	return FMRES_IGNORED
}

public fwd_player_postthink(id)
{ 
	if(!is_user_alive(id))
		return FMRES_IGNORED
	
	if(g_zombie[id] && g_falling[id] && (pev(id, pev_flags) & FL_ONGROUND))
	{	
		set_pev(id, pev_watertype, CONTENTS_WATER)
		g_falling[id] = false
	}
	
	if(get_pcvar_num(cvar_buytime))
	{
		if(pev_valid(g_buyzone) && g_buytime > get_gametime())
			dllfunc(DLLFunc_Touch, g_buyzone, id)
	}
	return FMRES_IGNORED
}

public fwd_emitsound(id, channel, sample[], Float:volume, Float:attn, flag, pitch)
{	
	if(channel == CHAN_ITEM && sample[6] == 'n' && sample[7] == 'v' && sample[8] == 'g')
		return FMRES_SUPERCEDE	
	
	if(!is_user_connected(id) || !g_zombie[id])
		return FMRES_IGNORED	

	if(sample[8] == 'k' && sample[9] == 'n' && sample[10] == 'i')
	{
		if(sample[14] == 's' && sample[15] == 'l' && sample[16] == 'a')
		{
			emit_sound(id, channel, g_zombie_miss_sounds[_random(sizeof g_zombie_miss_sounds)], volume, attn, flag, pitch)
			return FMRES_SUPERCEDE
		}
		else if(sample[14] == 'h' && sample[15] == 'i' && sample[16] == 't' || sample[14] == 's' && sample[15] == 't' && sample[16] == 'a')
		{
			if(sample[17] == 'w' && sample[18] == 'a' && sample[19] == 'l')
				emit_sound(id, channel, g_zombie_miss_sounds[_random(sizeof g_zombie_miss_sounds)], volume, attn, flag, pitch)
			else
				emit_sound(id, channel, g_zombie_hit_sounds[_random(sizeof g_zombie_hit_sounds)], volume, attn, flag, pitch)
			
			return FMRES_SUPERCEDE
		}
	}			
	else if(sample[7] == 'd' && (sample[8] == 'i' && sample[9] == 'e' || sample[12] == '6'))
	{
		emit_sound(id, channel, g_zombie_die_sounds[_random(sizeof g_zombie_die_sounds)], volume, attn, flag, pitch)
		return FMRES_SUPERCEDE
	}
	return FMRES_IGNORED
}

public fwd_cmdstart(id, handle, seed)
{
	if(!is_user_alive(id) || !g_zombie[id])
		return FMRES_IGNORED
	
	static impulse
	impulse = get_uc(handle, UC_Impulse)
	
	if(impulse == IMPULSE_FLASHLIGHT)
	{
		set_uc(handle, UC_Impulse, 0)
		return FMRES_SUPERCEDE
	}
	return FMRES_IGNORED
}

public fwd_spawn(ent)
{
	if(!pev_valid(ent)) 
		return FMRES_IGNORED
	
	static classname[32]
	pev(ent, pev_classname, classname, 31)

	static i
	for(i = 0; i < sizeof g_remove_entities; ++i)
	{
		if(equal(classname, g_remove_entities[i]))
		{
			engfunc(EngFunc_RemoveEntity, ent)
			return FMRES_SUPERCEDE
		}
	}
	return FMRES_IGNORED
}

public fwd_gamedescription() 
{ 
	static gamename[32]
	get_pcvar_string(cvar_gamedescription, gamename, 31)
	
	forward_return(FMV_STRING, gamename)
	
	return FMRES_SUPERCEDE
}  

public fwd_createnamedentity(entclassname)
{
	static classname[10]
	engfunc(EngFunc_SzFromIndex, entclassname, classname, 9)
	
	return (classname[7] == 'c' && classname[8] == '4') ? FMRES_SUPERCEDE : FMRES_IGNORED
}

public fwd_clientkill(id)
{
	if(get_pcvar_num(cvar_punishsuicide) && is_user_alive(id))
		g_suicide[id] = true
}

public fwd_setclientkeyvalue(id, infobuffer, const key[])
{
	if(!equal(key, "model") || !g_blockmodel[id])
		return FMRES_IGNORED
	
	static model[32]
	fm_get_user_model(id, model, 31)
	
	if(equal(model, "gordon"))
		return FMRES_IGNORED
	
	g_blockmodel[id] = false
	
	return FMRES_SUPERCEDE
}

public bacon_touch_weapon(ent, id)
	return (is_user_alive(id) && g_zombie[id]) ? HAM_SUPERCEDE : HAM_IGNORED

public bacon_use_tank(ent, caller, activator, use_type, Float:value)
	return (is_user_alive(caller) && g_zombie[caller]) ? HAM_SUPERCEDE : HAM_IGNORED

public bacon_use_pushable(ent, caller, activator, use_type, Float:value)
	return HAM_SUPERCEDE

public bacon_traceattack_player(victim, attacker, Float:damage, Float:direction[3], tracehandle, damagetype)
{
	if(!g_gamestarted) 
		return HAM_SUPERCEDE
	
	if(!get_pcvar_num(cvar_knockback) || !(damagetype & DMG_BULLET))
		return HAM_IGNORED
	
	if(!is_user_connected(attacker) || !g_zombie[victim])
		return HAM_IGNORED
	
	static kbpower
	kbpower = g_weapon_knockback[get_user_weapon(attacker)]
	
	if(kbpower != -1) 
	{
		static flags
		flags = pev(victim, pev_flags)
		
		if(get_pcvar_num(cvar_knockback_duck) && ((flags & FL_DUCKING) && (flags & FL_ONGROUND)))
			return HAM_IGNORED
		
		static Float:origins[2][3]
		pev(victim, pev_origin, origins[0])
		pev(attacker, pev_origin, origins[1])
		
		if(get_distance_f(origins[0], origins[1]) <= get_pcvar_float(cvar_knockback_dist))
		{
			static Float:velocity[3]
			pev(victim, pev_velocity, velocity)
			
			static Float:tempvec
			tempvec = velocity[2]	
			
			xs_vec_mul_scalar(direction, damage, direction)
			xs_vec_mul_scalar(direction, g_class_data[g_player_class[victim]][DATA_KNOCKBACK], direction)
			xs_vec_mul_scalar(direction, g_knockbackpower[kbpower], direction)
			
			xs_vec_add(direction, velocity, velocity)
			velocity[2] = tempvec
			
			set_pev(victim, pev_velocity, velocity)
			
			return HAM_HANDLED
		}
	}
	return HAM_IGNORED
}

public bacon_touch_grenade(ent, world)
{
	if(!get_pcvar_num(cvar_impactexplode))
		return HAM_IGNORED
	
	static model[12]
	pev(ent, pev_model, model, 11)
	
	if(model[9] == 'h' && model[10] == 'e')
	{
		set_pev(ent, pev_dmgtime, 0.0)
		
		return HAM_HANDLED
	}
	return HAM_IGNORED
}

public bacon_takedamage_player(victim, inflictor, attacker, Float:damage, damagetype)
{
	if(damagetype & DMG_GENERIC || victim == attacker || !is_user_alive(victim) || !is_user_connected(attacker))
		return HAM_IGNORED

	if(!g_gamestarted || (!g_zombie[victim] && !g_zombie[attacker]) || ((damagetype & DMG_HEGRENADE) && g_zombie[attacker]))
		return HAM_SUPERCEDE
	
	if(!g_zombie[attacker])
	{
		static pclass
		pclass = g_player_class[victim] 
		
		damage *= (damagetype & DMG_HEGRENADE) ? g_class_data[pclass][DATA_HEDEFENCE] : g_class_data[pclass][DATA_DEFENCE]
		SetHamParamFloat(4, damage)
	}
	else
	{
		if(get_user_weapon(attacker) != CSW_KNIFE)
			return HAM_SUPERCEDE

		damage *= g_class_data[g_player_class[attacker]][DATA_ATTACK]
		
		static Float:armor
		pev(victim, pev_armorvalue, armor)
		
		if(get_pcvar_num(cvar_obeyarmor) && armor > 0.0)
		{
			armor -= damage
			
			if(armor < 0.0) 
				armor = 0.0
			
			set_pev(victim, pev_armorvalue, armor)
			SetHamParamFloat(4, 0.0)
		}
		else
		{
			static bool:infect
			infect = allow_infection()
			
			g_victim[attacker] = infect ? victim : 0
					
			if(!g_infecting)
				SetHamParamFloat(4, infect ? 0.0 : damage)
			else	
				SetHamParamFloat(4, 0.0)
		}
	}
	return HAM_HANDLED
}

public bacon_killed_player(victim, killer, shouldgib)
{
	if(!is_user_alive(killer) || g_zombie[killer] || !g_zombie[victim])
		return HAM_IGNORED
	
	static killbonus
	killbonus = get_pcvar_num(cvar_killbonus)
	
	if(killbonus)
		set_pev(killer, pev_frags, pev(killer, pev_frags) + float(killbonus))
	
	static killreward
	killreward = get_pcvar_num(cvar_killreward)
	
	if(!killreward) 
		return HAM_IGNORED
	
	static weapon, maxclip, ent, weaponname[32]
	switch(killreward)
	{
		case 1: 
		{
			weapon = get_user_weapon(killer)
			maxclip = g_weapon_ammo[weapon][MAX_CLIP]
			if(maxclip)
			{
				get_weaponname(weapon, weaponname, 31)
				ent = fm_find_ent_by_owner(-1, weaponname, killer)
					
				fm_set_weapon_ammo(ent, maxclip)
			}
		}
		case 2:
		{
			if(!user_has_weapon(killer, CSW_HEGRENADE))
				bacon_give_weapon(killer, "weapon_hegrenade")
		}
		case 3:
		{
			weapon = get_user_weapon(killer)
			maxclip = g_weapon_ammo[weapon][MAX_CLIP]
			if(maxclip)
			{
				get_weaponname(weapon, weaponname, 31)
				ent = fm_find_ent_by_owner(-1, weaponname, killer)
					
				fm_set_weapon_ammo(ent, maxclip)
			}
				
			if(!user_has_weapon(killer, CSW_HEGRENADE))
				bacon_give_weapon(killer, "weapon_hegrenade")
		}
	}
	return HAM_IGNORED
}

public bacon_spawn_player_post(id)
{	
	if(!is_user_alive(id))
		return HAM_IGNORED
	
	static team
	team = fm_get_user_team(id)
	
	if(team != CS_TEAM_T && team != CS_TEAM_CT)
		return HAM_IGNORED
	
	if(g_zombie[id])
	{
		if(get_pcvar_num(cvar_respawnaszombie) && !g_roundended)
		{
			set_zombie_attibutes(id)
			
			return HAM_IGNORED
		}
		else
			cure_user(id)
	}
	else if(pev(id, pev_rendermode) == kRenderTransTexture)
		reset_user_model(id)
	
	set_task(0.3, "task_spawned", TASKID_SPAWNDELAY + id)
	set_task(5.0, "task_checkspawn", TASKID_CHECKSPAWN + id)
	
	return HAM_IGNORED
}

public bacon_touch_pushable(ent, id)
{
	static movetype
	pev(id, pev_movetype)
	
	if(movetype == MOVETYPE_NOCLIP || movetype == MOVETYPE_NONE)
		return HAM_IGNORED	
	
	if(is_user_alive(id))
	{
		set_pev(id, pev_movetype, MOVETYPE_WALK)
		
		if(!(pev(id, pev_flags) & FL_ONGROUND))
			return HAM_SUPERCEDE
	}
	
	if(!get_pcvar_num(cvar_shootobjects))
		return HAM_IGNORED
	
	static Float:velocity[2][3]
	pev(ent, pev_velocity, velocity[0])
	
	if(vector_length(velocity[0]) > 0.0)
	{
		pev(id, pev_velocity, velocity[1])
		velocity[1][0] += velocity[0][0]
		velocity[1][1] += velocity[0][1]
		
		set_pev(id, pev_velocity, velocity[1])
	}
	return HAM_SUPERCEDE
}

public bacon_traceattack_pushable(ent, attacker, Float:damage, Float:direction[3], tracehandle, damagetype)
{
	if(!get_pcvar_num(cvar_shootobjects) || !is_user_alive(attacker))
		return HAM_IGNORED
	
	static Float:velocity[3]
	pev(ent, pev_velocity, velocity)
			
	static Float:tempvec
	tempvec = velocity[2]	
			
	xs_vec_mul_scalar(direction, damage, direction)
	xs_vec_mul_scalar(direction, g_zombie[attacker] ? 
	get_pcvar_float(cvar_pushpwr_zombie) : get_pcvar_float(cvar_pushpwr_weapon), direction)
	xs_vec_add(direction, velocity, velocity)
	velocity[2] = tempvec
	
	set_pev(ent, pev_velocity, velocity)
	
	return HAM_HANDLED
}

public task_spawned(taskid)
{
	static id
	id = taskid - TASKID_SPAWNDELAY
	
	if(is_user_alive(id))
	{
		if(g_welcomemsg[id])
		{
			g_welcomemsg[id] = false
			
			static message[192]
			formatex(message, 191, "%L", id, "WELCOME_TXT")
			replace(message, 191, "#Version#", VERSION)
			
			client_print(id, print_chat, message)
		}
		
		if(g_suicide[id])
		{
			g_suicide[id] = false
			
			user_silentkill(id)
			remove_task(TASKID_CHECKSPAWN + id)

			client_print(id, print_chat, "%L", id, "SUICIDEPUNISH_TXT")
			
			return
		}
		
		if(get_pcvar_num(cvar_weaponsmenu) && g_roundstarted && g_showmenu[id])
			is_user_bot(id) ? bot_weapons(id) : display_equipmenu(id)
		
		if(!g_gamestarted)
			client_print(id, print_chat, "%L %L", id, "SCAN_RESULTS", id, g_preinfect[id] ? "SCAN_INFECTED" : "SCAN_CLEAN")
		else
		{
			static team
			team = fm_get_user_team(id)
			
			if(team == CS_TEAM_T)
				fm_set_user_team(id, CS_TEAM_CT)
		}
	}
}

public task_checkspawn(taskid)
{
	static id
	id = taskid - TASKID_CHECKSPAWN
	
	if(!is_user_connected(id) || is_user_alive(id) || g_roundended)
		return
	
	static team
	team = fm_get_user_team(id)
	
	if(team == CS_TEAM_T || team == CS_TEAM_CT)
		ExecuteHamB(Ham_CS_RoundRespawn, id)
}
	
public task_showtruehealth()
{
	set_hudmessage(_, _, _, 0.03, 0.93, _, 0.2, 0.2)
	
	static id, Float:health, class
	for(id = 1; id <= g_maxplayers; id++) if(is_user_alive(id) && !is_user_bot(id) && g_zombie[id])
	{
		pev(id, pev_health, health)
		class = g_player_class[id]
		
		if(g_classcount > 1)
			ShowSyncHudMsg(id, g_sync_hpdisplay, "Health: %0.f  Class: %s (%s)", health, g_class_name[class], g_class_desc[class])
		else	
			ShowSyncHudMsg(id, g_sync_hpdisplay, "Health: %0.f", health)
	}
}

public task_lights()
{
	static light[2]
	get_pcvar_string(cvar_lights, light, 1)
	
	engfunc(EngFunc_LightStyle, 0, light)
}

public task_updatescore(params[])
{
	if(!g_gamestarted) 
		return
	
	static attacker
	attacker = params[0]
	
	static victim
	victim = params[1]
	
	if(!is_user_connected(attacker))
		return

	static frags, deaths, team
	frags  = get_user_frags(attacker)
	deaths = fm_get_user_deaths(attacker)
	team   = get_user_team(attacker)
	
	message_begin(MSG_BROADCAST, g_msg_scoreinfo)
	write_byte(attacker)
	write_short(frags)
	write_short(deaths)
	write_short(0)
	write_short(team)
	message_end()
	
	if(!is_user_connected(victim))
		return
	
	frags  = get_user_frags(victim)
	deaths = fm_get_user_deaths(victim)
	team   = get_user_team(victim)
	
	message_begin(MSG_BROADCAST, g_msg_scoreinfo)
	write_byte(victim)
	write_short(frags)
	write_short(deaths)
	write_short(0)
	write_short(team)
	message_end()
}

public task_weaponsmenu(taskid)
{
	static id
	id = taskid - TASKID_WEAPONSMENU
	
	if(is_user_alive(id) && !g_zombie[id] && g_menufailsafe[id])
		display_equipmenu(id)
}

public task_stripngive(taskid)
{
	static id
	id = taskid - TASKID_STRIPNGIVE
	
	if(is_user_alive(id))
	{
		fm_strip_user_weapons(id)
		fm_reset_user_primary(id)
		bacon_give_weapon(id, "weapon_knife")
		
		set_pev(id, pev_weaponmodel2, "")
		set_pev(id, pev_viewmodel2, g_class_wmodel[g_player_class[id]])
		set_pev(id, pev_maxspeed, g_class_data[g_player_class[id]][DATA_SPEED])
	}
}

public task_newround()
{
	static players[32], num, zombies, i, id
	get_players(players, num, "a")

	if(num > 1)
	{
		for(i = 0; i < num; i++) 
			g_preinfect[players[i]] = false
		
		zombies = clamp(floatround(num * get_pcvar_float(cvar_zombiemulti)), 1, 31)
		
		i = 0
		while(i < zombies)
		{
			id = players[_random(num)]
			if(!g_preinfect[id])
			{
				g_preinfect[id] = true
				i++
			}
		}
	}
	
	if(!get_pcvar_num(cvar_randomspawn) || g_spawncount <= 0) 
		return
	
	static team
	for(i = 0; i < num; i++)
	{
		id = players[i]
		
		team = fm_get_user_team(id)
		if(team != CS_TEAM_T && team != CS_TEAM_CT || pev(id, pev_iuser1))
			continue
		
		static spawn_index
		spawn_index = _random(g_spawncount)
	
		static Float:spawndata[3]
		spawndata[0] = g_spawns[spawn_index][0]
		spawndata[1] = g_spawns[spawn_index][1]
		spawndata[2] = g_spawns[spawn_index][2]
		
		if(!fm_is_hull_vacant(spawndata, HULL_HUMAN))
		{
			static i
			for(i = spawn_index + 1; i != spawn_index; i++)
			{
				if(i >= g_spawncount) i = 0

				spawndata[0] = g_spawns[i][0]
				spawndata[1] = g_spawns[i][1]
				spawndata[2] = g_spawns[i][2]

				if(fm_is_hull_vacant(spawndata, HULL_HUMAN))
				{
					spawn_index = i
					break
				}
			}
		}

		spawndata[0] = g_spawns[spawn_index][0]
		spawndata[1] = g_spawns[spawn_index][1]
		spawndata[2] = g_spawns[spawn_index][2]
		engfunc(EngFunc_SetOrigin, id, spawndata)

		spawndata[0] = g_spawns[spawn_index][3]
		spawndata[1] = g_spawns[spawn_index][4]
		spawndata[2] = g_spawns[spawn_index][5]
		set_pev(id, pev_angles, spawndata)

		spawndata[0] = g_spawns[spawn_index][6]
		spawndata[1] = g_spawns[spawn_index][7]
		spawndata[2] = g_spawns[spawn_index][8]
		set_pev(id, pev_v_angle, spawndata)

		set_pev(id, pev_fixangle, 1)
	}
}

public task_initround()
{
	static zombiecount, newzombie
	zombiecount = 0
	newzombie = 0

	static players[32], num, i, id
	get_players(players, num, "a")

	for(i = 0; i < num; i++) if(g_preinfect[players[i]])
	{
		newzombie = players[i]
		zombiecount++
	}
	
	if(zombiecount > 1) 
		newzombie = 0
	else if(zombiecount < 1) 
		newzombie = players[_random(num)]
	
	for(i = 0; i < num; i++)
	{
		id = players[i]
		if(id == newzombie || g_preinfect[id])
			infect_user(id, 0)
		else
		{
			fm_set_user_team(id, CS_TEAM_CT, 0)
			add_delay(id, "update_team")
		}
	}
	
	set_hudmessage(_, _, _, _, _, 1)
	if(newzombie)
	{
		static name[32]
		get_user_name(newzombie, name, 31)
		
		ShowSyncHudMsg(0, g_sync_msgdisplay, "%L", LANG_PLAYER, "INFECTED_HUD", name)
		client_print(0, print_chat, "%L", LANG_PLAYER, "INFECTED_TXT", name)
	}
	else
	{
		ShowSyncHudMsg(0, g_sync_msgdisplay, "%L", LANG_PLAYER, "INFECTED_HUD2")
		client_print(0, print_chat, "%L", LANG_PLAYER, "INFECTED_TXT2")
	}
	
	set_task(0.51, "task_startround", TASKID_STARTROUND)
}

public task_startround()
{
	g_gamestarted = true
	ExecuteForward(g_fwd_gamestart, g_fwd_result)
}

public task_balanceteam()
{
	static players[3][32], count[3]
	get_players(players[CS_TEAM_UNASSIGNED], count[CS_TEAM_UNASSIGNED])
	
	count[CS_TEAM_T] = 0
	count[CS_TEAM_CT] = 0
	
	static i, id, team
	for(i = 0; i < count[CS_TEAM_UNASSIGNED]; i++)
	{
		id = players[CS_TEAM_UNASSIGNED][i] 
		team = fm_get_user_team(id)
		
		if(team == CS_TEAM_T || team == CS_TEAM_CT)
			players[team][count[team]++] = id
	}

	if(abs(count[CS_TEAM_T] - count[CS_TEAM_CT]) <= 1) 
		return

	static maxplayers
	maxplayers = (count[CS_TEAM_T] + count[CS_TEAM_CT]) / 2
	
	if(count[CS_TEAM_T] > maxplayers)
	{
		for(i = 0; i < (count[CS_TEAM_T] - maxplayers); i++)
			fm_set_user_team(players[CS_TEAM_T][i], CS_TEAM_CT, 0)
	}
	else
	{
		for(i = 0; i < (count[CS_TEAM_CT] - maxplayers); i++)
			fm_set_user_team(players[CS_TEAM_CT][i], CS_TEAM_T, 0)
	}
}

public task_botclient_pdata(id) 
{
	if(g_botclient_pdata || !is_user_connected(id))
		return
	
	if(get_pcvar_num(cvar_botquota) && is_user_bot(id))
	{
		RegisterHamFromEntity(Ham_TakeDamage, id, "bacon_takedamage_player")
		RegisterHamFromEntity(Ham_Killed, id, "bacon_killed_player")
		RegisterHamFromEntity(Ham_TraceAttack, id, "bacon_traceattack_player")
		RegisterHamFromEntity(Ham_Spawn, id, "bacon_spawn_player_post", 1)
		
		g_botclient_pdata = 1
	}
}

public bot_weapons(id)
{
	g_player_weapons[id][0] = _random(sizeof g_primaryweapons)
	g_player_weapons[id][1] = _random(sizeof g_secondaryweapons)
	
	equipweapon(id, EQUIP_ALL)
}

public update_team(id)
{
	if(!is_user_connected(id))
		return
	
	static team
	team = fm_get_user_team(id)
	
	if(team == CS_TEAM_T || team == CS_TEAM_CT)
	{
		emessage_begin(MSG_ALL, g_msg_teaminfo)
		ewrite_byte(id)
		ewrite_string(g_teaminfo[team])
		emessage_end()
	}
}

public infect_user(victim, attacker)
{
	if(!is_user_alive(victim))
		return

	message_begin(MSG_ONE, g_msg_screenfade, _, victim)
	write_short(1<<10)
	write_short(1<<10)
	write_short(0)
	write_byte((g_mutate[victim] != -1) ? 255 : 100)
	write_byte(100)
	write_byte(100)
	write_byte(250)
	message_end()
	
	if(g_mutate[victim] != -1)
	{
		g_player_class[victim] = g_mutate[victim]
		g_mutate[victim] = -1
		
		set_hudmessage(_, _, _, _, _, 1)
		ShowSyncHudMsg(victim, g_sync_msgdisplay, "%L", victim, "MUTATION_HUD", g_class_name[g_player_class[victim]])
	}
	
	fm_set_user_team(victim, CS_TEAM_T)
	set_zombie_attibutes(victim)
	
	emit_sound(victim, CHAN_STATIC, g_scream_sounds[_random(sizeof g_scream_sounds)], VOL_NORM, ATTN_NONE, 0, PITCH_NORM)
	ExecuteForward(g_fwd_infect, g_fwd_result, victim, attacker)
}

public cure_user(id)
{
	if(!is_user_alive(id)) 
		return

	g_zombie[id] = false
	g_falling[id] = false

	reset_user_model(id)
	fm_set_user_nvg(id, 0)
	set_pev(id, pev_gravity, 1.0)
	
	static viewmodel[64]
	pev(id, pev_viewmodel2, viewmodel, 63)
	
	if(equal(viewmodel, g_class_wmodel[g_player_class[id]]))
	{
		static weapon 
		weapon = fm_lastknife(id)

		if(pev_valid(weapon))
			ExecuteHam(Ham_Item_Deploy, weapon)
	}
}

public display_equipmenu(id)
{
	static menubody[512], len
  	len = formatex(menubody, 511, "\y%L^n^n", id, "MENU_TITLE1")
	
	static bool:hasweap
	hasweap = ((g_player_weapons[id][0]) != -1 && (g_player_weapons[id][1] != -1)) ? true : false
	
	len += formatex(menubody[len], 511 - len,"\w1. %L^n", id, "MENU_NEWWEAPONS")
	len += formatex(menubody[len], 511 - len,"%s2. %L^n", hasweap ? "\w" : "\d", id, "MENU_PREVSETUP")
	len += formatex(menubody[len], 511 - len,"%s3. %L^n^n", hasweap ? "\w" : "\d", id, "MENU_DONTSHOW")
	len += formatex(menubody[len], 511 - len,"\w5. %L^n", id, "MENU_EXIT")
	
	static keys
	keys = (MENU_KEY_1|MENU_KEY_5)
	
	if(hasweap) 
		keys |= (MENU_KEY_2|MENU_KEY_3)
	
	show_menu(id, keys, menubody, -1, "Equipment")
}

public action_equip(id, key)
{
	if(!is_user_alive(id) || g_zombie[id])
		return PLUGIN_HANDLED
	
	switch(key)
	{
		case 0: display_weaponmenu(id, MENU_PRIMARY, g_menuposition[id] = 0)
		case 1: equipweapon(id, EQUIP_ALL)
		case 2:
		{
			g_showmenu[id] = false
			equipweapon(id, EQUIP_ALL)
			client_print(id, print_chat, "%L", id, "MENU_CMDENABLE")
		}
	}
	
	if(key > 0)
	{
		g_menufailsafe[id] = false
		remove_task(TASKID_WEAPONSMENU + id)
	}
	return PLUGIN_HANDLED
}


public display_weaponmenu(id, menuid, pos)
{
	if(pos < 0 || menuid < 0)
		return
	
	static start
	start = pos * 8
	
	static maxitem
	maxitem = menuid == MENU_PRIMARY ? sizeof g_primaryweapons : sizeof g_secondaryweapons

  	if(start >= maxitem)
    		start = pos = g_menuposition[id]
	
	static menubody[512], len
  	len = formatex(menubody, 511, "\y%L\w^n^n", id, menuid == MENU_PRIMARY ? "MENU_TITLE2" : "MENU_TITLE3")

	static end
	end = start + 8
	if(end > maxitem)
    		end = maxitem
	
	static keys
	keys = MENU_KEY_0
	
	static a, b
	b = 0
	
  	for(a = start; a < end; ++a) 
	{
		keys |= (1<<b)
		len += formatex(menubody[len], 511 - len,"%d. %s^n", ++b, menuid == MENU_PRIMARY ? g_primaryweapons[a][0]: g_secondaryweapons[a][0])
  	}

  	if(end != maxitem)
	{
    		formatex(menubody[len], 511 - len, "^n9. %L^n0. %L", id, "MENU_MORE", id, pos ? "MENU_BACK" : "MENU_EXIT")
    		keys |= MENU_KEY_9
  	}
  	else	
		formatex(menubody[len], 511 - len, "^n0. %L", id, pos ? "MENU_BACK" : "MENU_EXIT")
	
  	show_menu(id, keys, menubody, -1, menuid == MENU_PRIMARY ? "Primary" : "Secondary")
}

public action_prim(id, key)
{
	if(!is_user_alive(id) || g_zombie[id])
		return PLUGIN_HANDLED

	switch(key)
	{
    		case 8: display_weaponmenu(id, MENU_PRIMARY, ++g_menuposition[id])
		case 9: display_weaponmenu(id, MENU_PRIMARY, --g_menuposition[id])
    		default:
		{
			g_player_weapons[id][0] = g_menuposition[id] * 8 + key
			equipweapon(id, EQUIP_PRI)
			
			display_weaponmenu(id, MENU_SECONDARY, g_menuposition[id] = 0)
		}
	}
	return PLUGIN_HANDLED
}

public action_sec(id, key)
{
	if(!is_user_alive(id) || g_zombie[id])
		return PLUGIN_HANDLED
	
	switch(key) 
	{
    		case 8: display_weaponmenu(id, MENU_SECONDARY, ++g_menuposition[id])
		case 9: display_weaponmenu(id, MENU_SECONDARY, --g_menuposition[id])
    		default:
		{
			g_menufailsafe[id] = false
			remove_task(TASKID_WEAPONSMENU + id)
			
			g_player_weapons[id][1] = g_menuposition[id] * 8 + key
			equipweapon(id, EQUIP_SEC)
			equipweapon(id, EQUIP_GREN)
		}
	}
	return PLUGIN_HANDLED
}

public display_classmenu(id, pos)
{
	if(pos < 0)
		return
	
	static start
	start = pos * 8
	
	static maxitem
	maxitem = g_classcount

  	if(start >= maxitem)
    		start = pos = g_menuposition[id]
	
	static menubody[512], len
  	len = formatex(menubody, 511, "\y%L\w^n^n", id, "MENU_TITLE4")

	static end
	end = start + 8
	
	if(end > maxitem)
    		end = maxitem
	
	static keys
	keys = MENU_KEY_0
	
	static a, b
	b = 0
	
  	for(a = start; a < end; ++a) 
	{
		keys |= (1<<b)
		len += formatex(menubody[len], 511 - len,"%d. %s^n", ++b, g_class_name[a])
  	}

  	if(end != maxitem)
	{
    		formatex(menubody[len], 511 - len, "^n9. %L^n0. %L", id, "MENU_MORE", id, pos ? "MENU_BACK" : "MENU_EXIT")
    		keys |= MENU_KEY_9
  	}
  	else	
		formatex(menubody[len], 511 - len, "^n0. %L", id, pos ? "MENU_BACK" : "MENU_EXIT")
	
  	show_menu(id, keys, menubody, -1, "Class")
}

public action_class(id, key)
{
	switch(key) 
	{
    		case 8: display_classmenu(id, ++g_menuposition[id])
		case 9: display_classmenu(id, --g_menuposition[id])
    		default:
		{
			g_mutate[id] = g_menuposition[id] * 8 + key
			client_print(id, print_chat, "%L", id, "MENU_CHANGECLASS", g_class_name[g_mutate[id]])
		}
	}
	return PLUGIN_HANDLED
}

public register_spawnpoints(const mapname[])
{
	new configdir[32]
	get_configsdir(configdir, 31)
	
	new csdmfile[64], line[64], data[10][6]
	formatex(csdmfile, 63, "%s/csdm/%s.spawns.cfg", configdir, mapname)

	if(file_exists(csdmfile))
	{
		new file
		file = fopen(csdmfile, "rt")
		
		while(file && !feof(file))
		{
			fgets(file, line, 63)
			if(!line[0] || str_count(line,' ') < 2) 
				continue

			parse(line, data[0], 5, data[1], 5, data[2], 5, data[3], 5, data[4], 5, data[5], 5, data[6], 5, data[7], 5, data[8], 5, data[9], 5)

			g_spawns[g_spawncount][0] = floatstr(data[0]), g_spawns[g_spawncount][1] = floatstr(data[1])
			g_spawns[g_spawncount][2] = floatstr(data[2]), g_spawns[g_spawncount][3] = floatstr(data[3])
			g_spawns[g_spawncount][4] = floatstr(data[4]), g_spawns[g_spawncount][5] = floatstr(data[5])
			g_spawns[g_spawncount][6] = floatstr(data[7]), g_spawns[g_spawncount][7] = floatstr(data[8])
			g_spawns[g_spawncount][8] = floatstr(data[9])
			
			if(++g_spawncount >= MAX_SPAWNS) 
				break
		}
		if(file) 
			fclose(file)
	}
}

public register_zombieclasses(filename[])
{
	new configdir[32]
	get_configsdir(configdir, 31)
	
	new configfile[64]
	formatex(configfile, 63, "%s/%s", configdir, filename)

	if(get_pcvar_num(cvar_zombie_class) && file_exists(configfile))
	{			
		new line[128], leftstr[32], rightstr[64],  classname[32], data[MAX_DATA], i
		
		new file
		file = fopen(configfile, "rt")
		
		while(file && !feof(file))
		{
			fgets(file, line, 127), trim(line)
			if(!line[0] || line[0] == ';') continue
			
			if(line[0] == '[' && line[strlen(line) - 1] == ']')
			{
				copy(classname, strlen(line) - 2, line[1])

				if(register_class(classname) == -1)
					break
				
				continue
			}
			strtok(line, leftstr, 31, rightstr, 63, '=', 1)
				
			if(equali(leftstr, "DESC"))
				copy(g_class_desc[g_classcount - 1], 31, rightstr)
			else if(equali(leftstr, "PMODEL"))
				copy(g_class_pmodel[g_classcount - 1], 63, rightstr)
			else if(equali(leftstr, "WMODEL"))
				copy(g_class_wmodel[g_classcount - 1], 63, rightstr)
				
			for(i = 0; i < MAX_DATA; i++)
				data[i] = equali(leftstr, g_dataname[i])
				
			for(i = 0; i < MAX_DATA; i++) if(data[i])
			{
				g_class_data[g_classcount - 1][i] = floatstr(rightstr)
				break
			}
		}
		if(file) fclose(file)
	} 
	else 
		register_class("default")
}

public register_class(classname[])
{
	if(g_classcount >= MAX_CLASSES)
		return -1
	
	copy(g_class_name[g_classcount], 31, classname)
	copy(g_class_pmodel[g_classcount], 63, DEFAULT_PMODEL)
	copy(g_class_wmodel[g_classcount], 63, DEFAULT_WMODEL)
		
	g_class_data[g_classcount][DATA_HEALTH] = DEFAULT_HEALTH
	g_class_data[g_classcount][DATA_SPEED] = DEFAULT_SPEED	
	g_class_data[g_classcount][DATA_GRAVITY] = DEFAULT_GRAVITY
	g_class_data[g_classcount][DATA_ATTACK] = DEFAULT_ATTACK
	g_class_data[g_classcount][DATA_DEFENCE] = DEFAULT_DEFENCE
	g_class_data[g_classcount][DATA_HEDEFENCE] = DEFAULT_HEDEFENCE
	g_class_data[g_classcount][DATA_HITSPEED] = DEFAULT_HITSPEED
	g_class_data[g_classcount][DATA_HITDELAY] = DEFAULT_HITDELAY
	g_class_data[g_classcount][DATA_REGENDLY] = DEFAULT_REGENDLY
	g_class_data[g_classcount][DATA_HITREGENDLY] = DEFAULT_HITREGENDLY
	g_class_data[g_classcount++][DATA_KNOCKBACK] = DEFAULT_KNOCKBACK
	
	return (g_classcount - 1)
}

public native_register_class(classname[], description[])
{
	param_convert(1)
	param_convert(2)
	
	static classid
	classid = register_class(classname)
	
	if(classid != -1)
		copy(g_class_desc[classid], 31, description)

	return classid
}

public native_set_class_pmodel(classid, player_model[])
{
	param_convert(2)
	copy(g_class_pmodel[classid], 63, player_model)
}

public native_set_class_wmodel(classid, weapon_model[])
{
	param_convert(2)
	copy(g_class_wmodel[classid], 63, weapon_model) 
}

public native_is_user_zombie(index)
	return g_zombie[index] == true ? 1 : 0

public native_get_user_class(index)
	return g_player_class[index]

public native_is_user_infected(index)
	return g_preinfect[index] == true ? 1 : 0

public native_game_started()
	return g_gamestarted

public native_preinfect_user(index, bool:yesno)
{
	if(is_user_alive(index) && !g_gamestarted)
		g_preinfect[index] = yesno
}

public native_infect_user(victim, attacker)
{
	if(allow_infection() && g_gamestarted)
		infect_user(victim, attacker)
}

public native_cure_user(index)
	cure_user(index)

public native_get_class_id(classname[])
{
	param_convert(1)
	
	static i
	for(i = 0; i < g_classcount; i++)
	{
		if(equali(classname, g_class_name[i]))
			return i
	}
	return -1
}

public Float:native_get_class_data(classid, dataid)
	return g_class_data[classid][dataid]

public native_set_class_data(classid, dataid, Float:value)
	g_class_data[classid][dataid] = value

stock bool:fm_is_hull_vacant(const Float:origin[3], hull)
{
	static tr
	tr = 0
	
	engfunc(EngFunc_TraceHull, origin, origin, 0, hull, 0, tr)
	return (!get_tr2(tr, TR_StartSolid) && !get_tr2(tr, TR_AllSolid) && get_tr2(tr, TR_InOpen)) ? true : false
}

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)

	return dllfunc(DLLFunc_KeyValue, entity, 0)
}

stock fm_strip_user_weapons(index) 
{
	static stripent
	if(!pev_valid(stripent))
	{
		stripent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "player_weaponstrip"))
		dllfunc(DLLFunc_Spawn, stripent), set_pev(stripent, pev_solid, SOLID_NOT)
	}
	dllfunc(DLLFunc_Use, stripent, index)
	
	return 1
}

stock fm_set_entity_visibility(index, visible = 1)
	set_pev(index, pev_effects, visible == 1 ? pev(index, pev_effects) & ~EF_NODRAW : pev(index, pev_effects) | EF_NODRAW)

stock fm_find_ent_by_owner(index, const classname[], owner) 
{
	static ent
	ent = index
	
	while((ent = engfunc(EngFunc_FindEntityByString, ent, "classname", classname)) && pev(ent, pev_owner) != owner) {}
	
	return ent
}

stock bacon_give_weapon(index, weapon[])
{
	if(!equal(weapon,"weapon_", 7))
		return 0

	static ent
	ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, weapon))
	
	if(!pev_valid(ent)) 
		return 0
    
	set_pev(ent, pev_spawnflags, SF_NORESPAWN)
	dllfunc(DLLFunc_Spawn, ent)
   
	if(!ExecuteHamB(Ham_AddPlayerItem, index, ent))
	{
		if(pev_valid(ent)) set_pev(ent, pev_flags, pev(ent, pev_flags) | FL_KILLME)
		return 0
	}
	ExecuteHamB(Ham_Item_AttachToPlayer, ent, index)

	return 1
}

stock bacon_strip_weapon(index, weapon[])
{
	if(!equal(weapon, "weapon_", 7)) 
		return 0

	static weaponid 
	weaponid = get_weaponid(weapon)
	
	if(!weaponid) 
		return 0

	static weaponent
	weaponent = fm_find_ent_by_owner(-1, weapon, index)
	
	if(!weaponent) 
		return 0

	if(get_user_weapon(index) == weaponid) 
		ExecuteHamB(Ham_Weapon_RetireWeapon, weaponent)

	if(!ExecuteHamB(Ham_RemovePlayerItem, index, weaponent)) 
		return 0
	
	ExecuteHamB(Ham_Item_Kill, weaponent)
	set_pev(index, pev_weapons, pev(index, pev_weapons) & ~(1<<weaponid))

	return 1
}

stock fm_set_user_team(index, team, update = 1)
{
	set_pdata_int(index, OFFSET_TEAM, team)
	if(update)
	{
		emessage_begin(MSG_ALL, g_msg_teaminfo)
		ewrite_byte(index)
		ewrite_string(g_teaminfo[team])
		emessage_end()
	}
	return 1
}

stock fm_get_user_bpammo(index, weapon)
{
	static offset
	switch(weapon)
	{
		case CSW_AWP: offset = OFFSET_AMMO_338MAGNUM
		case CSW_SCOUT, CSW_AK47, CSW_G3SG1: offset = OFFSET_AMMO_762NATO
		case CSW_M249: offset = OFFSET_AMMO_556NATOBOX
		case CSW_FAMAS, CSW_M4A1, CSW_AUG, 
		CSW_SG550, CSW_GALI, CSW_SG552: offset = OFFSET_AMMO_556NATO
		case CSW_M3, CSW_XM1014: offset = OFFSET_AMMO_BUCKSHOT
		case CSW_USP, CSW_UMP45, CSW_MAC10: offset = OFFSET_AMMO_45ACP
		case CSW_FIVESEVEN, CSW_P90: offset = OFFSET_AMMO_57MM
		case CSW_DEAGLE: offset = OFFSET_AMMO_50AE
		case CSW_P228: offset = OFFSET_AMMO_357SIG
		case CSW_GLOCK18, CSW_TMP, CSW_ELITE, 
		CSW_MP5NAVY: offset = OFFSET_AMMO_9MM
		default: offset = 0
	}
	return offset ? get_pdata_int(index, offset) : 0
}

stock fm_set_user_bpammo(index, weapon, amount)
{
	static offset
	switch(weapon)
	{
		case CSW_AWP: offset = OFFSET_AMMO_338MAGNUM
		case CSW_SCOUT, CSW_AK47, CSW_G3SG1: offset = OFFSET_AMMO_762NATO
		case CSW_M249: offset = OFFSET_AMMO_556NATOBOX
		case CSW_FAMAS, CSW_M4A1, CSW_AUG, 
		CSW_SG550, CSW_GALI, CSW_SG552: offset = OFFSET_AMMO_556NATO
		case CSW_M3, CSW_XM1014: offset = OFFSET_AMMO_BUCKSHOT
		case CSW_USP, CSW_UMP45, CSW_MAC10: offset = OFFSET_AMMO_45ACP
		case CSW_FIVESEVEN, CSW_P90: offset = OFFSET_AMMO_57MM
		case CSW_DEAGLE: offset = OFFSET_AMMO_50AE
		case CSW_P228: offset = OFFSET_AMMO_357SIG
		case CSW_GLOCK18, CSW_TMP, CSW_ELITE, 
		CSW_MP5NAVY: offset = OFFSET_AMMO_9MM
		default: offset = 0
	}
	
	if(offset) 
		set_pdata_int(index, offset, amount)
	
	return 1
}

stock fm_set_user_nvg(index, onoff = 1)
{
	static nvg
	nvg = get_pdata_int(index, OFFSET_NVG)
	
	set_pdata_int(index, OFFSET_NVG, onoff == 1 ? nvg | HAS_NVG : nvg & ~HAS_NVG)
	return 1
}

stock fm_set_user_money(index, addmoney, update = 1)
{
	static money
	money = fm_get_user_money(index) + addmoney
	
	set_pdata_int(index, OFFSET_CSMONEY, money)
	
	if(update)
	{
		message_begin(MSG_ONE, g_msg_money, _, index)
		write_long(clamp(money, 0, 16000))
		write_byte(1)
		message_end()
	}
	return 1
}

stock str_count(str[], searchchar)
{
	static maxlen
	maxlen = strlen(str)
	
	static i, count
	count = 0
	
	for(i = 0; i <= maxlen; i++) if(str[i] == searchchar)
		count++

	return count
}

stock reset_user_model(index)
{
	set_pev(index, pev_rendermode, kRenderNormal)
	set_pev(index, pev_renderamt, 0.0)

	if(pev_valid(g_modelent[index]))
		fm_set_entity_visibility(g_modelent[index], 0)
}

stock remove_user_model(ent)
{
	static id
	id = pev(ent, pev_owner)
	
	if(pev_valid(ent)) 
		engfunc(EngFunc_RemoveEntity, ent)

	g_modelent[id] = 0
}

stock set_zombie_attibutes(index)
{
	if(!is_user_alive(index)) 
		return

	g_zombie[index] = true

	if(!task_exists(TASKID_STRIPNGIVE + index))
		set_task(0.1, "task_stripngive", TASKID_STRIPNGIVE + index)

	static Float:health
	health = g_class_data[g_player_class[index]][DATA_HEALTH]
	
	if(g_preinfect[index]) 
		health *= get_pcvar_float(cvar_zombie_hpmulti)
	
	set_pev(index, pev_health, health)
	set_pev(index, pev_gravity, g_class_data[g_player_class[index]][DATA_GRAVITY])
	set_pev(index, pev_body, 0)
	set_pev(index, pev_armorvalue, 0.0)
	set_pev(index, pev_renderamt, 0.0)
	set_pev(index, pev_rendermode, kRenderTransTexture)
	
	fm_set_user_armortype(index, CS_ARMOR_NONE)
	fm_set_user_nvg(index)
	
	if(get_pcvar_num(cvar_autonvg)) 
		engclient_cmd(index, "nightvision")
	
	if(!pev_valid(g_modelent[index]))
	{
		static ent
		ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"))
		if(pev_valid(ent))
		{
			engfunc(EngFunc_SetModel, ent, g_class_pmodel[g_player_class[index]])
			set_pev(ent, pev_classname, MODEL_CLASSNAME)
			set_pev(ent, pev_movetype, MOVETYPE_FOLLOW)
			set_pev(ent, pev_aiment, index)
			set_pev(ent, pev_owner, index)
				
			g_modelent[index] = ent
		}
	}
	else
	{
		engfunc(EngFunc_SetModel, g_modelent[index], g_class_pmodel[g_player_class[index]])
		fm_set_entity_visibility(g_modelent[index], 1)
	}

	static effects
	effects = pev(index, pev_effects)
	
	if(effects & EF_DIMLIGHT)
	{
		message_begin(MSG_ONE, g_msg_flashlight, _, index)
		write_byte(0)
		write_byte(100)
		message_end()
		
		set_pev(index, pev_effects, effects & ~EF_DIMLIGHT)
	}
}

stock bool:allow_infection()
{
	static count[2]
	count[0] = 0
	count[1] = 0
	
	static index, maxzombies
	for(index = 1; index <= g_maxplayers; index++)
	{
		if(is_user_connected(index) && g_zombie[index]) 
			count[0]++
		else if(is_user_alive(index)) 
			count[1]++
	}
	
	maxzombies = clamp(get_pcvar_num(cvar_maxzombies), 1, 31)
	return (count[0] < maxzombies && count[1] > 1) ? true : false
}

stock randomly_pick_zombie()
{
	static data[4]
	data[0] = 0 
	data[1] = 0 
	data[2] = 0 
	data[3] = 0
	
	static index, players[2][32]
	for(index = 1; index <= g_maxplayers; index++)
	{
		if(!is_user_alive(index)) 
			continue
		
		if(g_zombie[index])
		{
			data[0]++
			players[0][data[2]++] = index
		}
		else 
		{
			data[1]++
			players[1][data[3]++] = index
		}
	}

	if(data[0] > 0 &&  data[1] < 1) 
		return players[0][_random(data[2])]
	
	return (data[0] < 1 && data[1] > 0) ?  players[1][_random(data[3])] : 0
}

stock equipweapon(id, weapon)
{
	if(!is_user_alive(id)) 
		return

	static weaponid[2], weaponent, weapname[32]
	
	if(weapon & EQUIP_PRI)
	{
		weaponent = fm_lastprimary(id)
		weaponid[1] = get_weaponid(g_primaryweapons[g_player_weapons[id][0]][1])
		
		if(pev_valid(weaponent))
		{
			weaponid[0] = fm_get_weapon_id(weaponent)
			if(weaponid[0] != weaponid[1])
			{
				get_weaponname(weaponid[0], weapname, 31)
				bacon_strip_weapon(id, weapname)
			}
		}
		else
			weaponid[0] = -1
		
		if(weaponid[0] != weaponid[1])
			bacon_give_weapon(id, g_primaryweapons[g_player_weapons[id][0]][1])
		
		fm_set_user_bpammo(id, weaponid[1], g_weapon_ammo[weaponid[1]][MAX_AMMO])
	}

	if(weapon & EQUIP_SEC)
	{
		weaponent = fm_lastsecondry(id)
		weaponid[1] = get_weaponid(g_secondaryweapons[g_player_weapons[id][1]][1])
		
		if(pev_valid(weaponent))
		{
			weaponid[0] = fm_get_weapon_id(weaponent)
			if(weaponid[0] != weaponid[1])
			{
				get_weaponname(weaponid[0], weapname, 31)
				bacon_strip_weapon(id, weapname)
			}
		}
		else
			weaponid[0] = -1
		
		if(weaponid[0] != weaponid[1])
			bacon_give_weapon(id, g_secondaryweapons[g_player_weapons[id][1]][1])
		
		fm_set_user_bpammo(id, weaponid[1], g_weapon_ammo[weaponid[1]][MAX_AMMO])
	}
	
	if(weapon & EQUIP_GREN)
	{
		static i
		for(i = 0; i < sizeof g_grenades; i++) if(!user_has_weapon(id, get_weaponid(g_grenades[i])))
			bacon_give_weapon(id, g_grenades[i])
	}
}

stock add_delay(index, const task[])
{
	switch(index)
	{
		case 1..8:   set_task(0.1, task, index)
		case 9..16:  set_task(0.2, task, index)
		case 17..24: set_task(0.3, task, index)
		case 25..32: set_task(0.4, task, index)
	}
}
Wats0N is offline
Reply


Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT -4. The time now is 07:34.


Powered by vBulletin®
Copyright ©2000 - 2024, vBulletin Solutions, Inc.
Theme made by Freecode