View Single Post
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