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

Please help to fix this plugin from this website


Post New Thread Reply   
 
Thread Tools Display Modes
Author Message
JARUSIA
Junior Member
Join Date: Apr 2019
Location: Lithuania
Old 05-28-2019 , 06:47   Please help to fix this plugin from this website
Reply With Quote #1

It's Biohazard v2 Beta 3 Cheap suit 38 warning but compile,does possible fix this warnings? because maybe server crashes very need fix it's someone can help?

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_STARTROUND 153
#define TASKID_NEWROUND      641
#define TASKID_BALANCETEAM 375
#define TASKID_UPDATESCR 264
#define TASKID_SETZOMBIE 635
#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_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("DeathMsg""event_deathmsg""a")
    
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_SETZOMBIE 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 
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)
    
    static 
victim
    victim 
get_msg_arg_int(2)
    
    if(!
is_user_connected(killer))
        return 
PLUGIN_CONTINUE
    
    
if(g_zombie[killer])
        
set_msg_arg_string(4g_zombie_weapname)
    else if(
g_zombie[victim])
        
set_pev(killerpev_fragspev(killerpev_frags) + float(get_pcvar_num(cvar_killbonus)))
    
    return 
PLUGIN_CONTINUE
}

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_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_STARTROUND)
    
    
set_task(0.2"task_newround"TASKID_NEWROUND)
    
set_task(get_pcvar_float(cvar_starttime), "task_startround"TASKID_STARTROUND)
}

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 
event_deathmsg() 
{
    static 
killreward
    killreward 
get_pcvar_num(cvar_killreward)
    
    if(!
killreward)
        return 
PLUGIN_CONTINUE
    
    
static killer
    killer 
read_data(1)
    
    static 
victim
    victim 
read_data(2)
    
    if(!
is_user_alive(killer) || !g_zombie[victim]) 
        return 
PLUGIN_CONTINUE
    
    
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 
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) || !g_zombie[id])
        return 
FMRES_IGNORED
    
    
if(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_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_setzombie(taskid)
    
set_zombie_attibutes((taskid TASKID_SETZOMBIE))

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_startround()
{
    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]
        (
id == newzombie || g_preinfect[id]) ? infect_user(id0) : fm_set_user_team(idCS_TEAM_CT)
    }
    
    
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")
    }
    
    
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_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 
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]])
    }
    
    
emit_sound(victimCHAN_STATICg_scream_sounds[_random(sizeof g_scream_sounds)], VOL_NORMATTN_NONE0PITCH_NORM)
    
    
g_zombie[victim] = true
    fm_set_user_team
(victimCS_TEAM_T)
    
    
set_task(0.1"task_setzombie"TASKID_SETZOMBIE victim)
    
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(pluginparams)
{
    if(
params != 1
        return -
1
    
    
static classname[32], i
    get_string
(1classname31)
    
    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)
    }



CFG

PHP Code:
/* Biohazard configs
*
*  by Cheap_Suit

*  This file is provided as is (no warranties).
*/

#if defined _biohazardcfg_included
    #endinput
#endif
#define _biohazardcfg_included

// fog settings
#define FOG_ENABLE           1
#define FOG_DENSITY        "0.0012"
#define FOG_COLOR           "128 128 128"

// default zombie setting
#define DEFAULT_PMODEL        "models/player/slum/slum.mdl"
#define DEFAULT_WMODEL        "models/v_knife_zombie.mdl"

#define DEFAULT_HEALTH         170.0 //Health value
#define DEFAULT_SPEED        280.0 //Speed value
#define DEFAULT_GRAVITY        1.0   //Gravity multiplier
#define DEFAULT_ATTACK        2.0   //Zombie damage multiplier
#define DEFAULT_DEFENCE        0.087 //Bullet damage multiplier
#define DEFAULT_HEDEFENCE   1.0   //HE damage multiplier
#define DEFAULT_HITSPEED    0.89  //Pain speed multiplier
#define DEFAULT_HITDELAY    0.28  //Pain speed delay value
#define DEFAULT_REGENDLY    0.18  //Regeneration delay value
#define DEFAULT_HITREGENDLY 2.0   //Pain regeneration delay value
#define DEFAULT_KNOCKBACK   1.0   //Knockback multiplier

new g_zombie_weapname[] = "melee"
new g_infection_name[]  = "infection"

// primary weapons (menu|game)
new g_primaryweapons[][][] = 

    { 
"M4A1",     "weapon_m4a1"    },
    { 
"AK47",     "weapon_ak47"    },
    { 
"AUG",      "weapon_aug"     },
    { 
"SG552",    "weapon_sg552"   },
    { 
"Galil",    "weapon_galil"   },
    { 
"Famas",    "weapon_famas"   },
    { 
"MP5 Navy""weapon_mp5navy" },
    { 
"XM1014",   "weapon_xm1014"  },
    { 
"M3",       "weapon_m3"      },
    { 
"P90",      "weapon_p90"     },
    { 
"M249",     "weapon_m249"    },
    { 
"SG550",    "weapon_sg550"   },
    { 
"G3SG1",    "weapon_g3sg1"   }            
}

// secondary weapons (menu|game)
new g_secondaryweapons[][][] = 

    { 
"Deagle",   "weapon_deagle"  },
    { 
"USP",      "weapon_usp"     },
    { 
"Elite",    "weapon_elite"   
}

// grenade loadout (game)
new g_grenades[][] = 

    
"weapon_hegrenade",
    
"weapon_flashbang",
    
"weapon_smokegrenade"
}

new 
Float:g_knockbackpower[] =
{
    
3.0,  // KBPOWER_357SIG
    
4.0,  // KBPOWER_762NATO
    
9.5,  // KBPOWER_BUCKSHOT
    
3.0,  // KBPOWER_45ACP
    
4.5,  // KBPOWER_556NATO
    
3.0,  // KBPOWER_9MM
    
3.5,  // KBPOWER_57MM
    
12.0// KBPOWER_338MAGNUM
    
4.0,  // KBPOWER_556NATOBOX
    
3.8   // KBPOWER_50AE
}

new 
g_survivor_win_sounds[][] =
{
    
"biohazard/survivor_win1.wav",
    
"biohazard/survivor_win2.wav",
    
"biohazard/survivor_win3.wav"
}

new 
g_zombie_win_sounds[][] = 

    
"biohazard/zombie_win1.wav"
    
"biohazard/zombie_win2.wav",
    
"biohazard/zombie_win3.wav"     
}

new 
g_scream_sounds[][] = 

    
"biohazard/scream1.wav"
    
"biohazard/scream2.wav"
    
"biohazard/scream3.wav"
}

new 
g_zombie_miss_sounds[][] = 

    
"zombie/claw_miss1.wav"
    
"zombie/claw_miss2.wav"                     
}

new 
g_zombie_hit_sounds[][] = 

    
"zombie/claw_strike1.wav",
    
"zombie/claw_strike2.wav",
    
"zombie/claw_strike3.wav"
}

new 
g_zombie_die_sounds[][] = 
{
    
"biohazard/death1.wav",
    
"biohazard/death2.wav",
    
"biohazard/death3.wav" 

JARUSIA is offline
OciXCrom
Veteran Member
Join Date: Oct 2013
Location: Macedonia
Old 05-28-2019 , 07:40   Re: Please help to fix this plugin from this website
Reply With Quote #2

It would be nice if you actually tell us what warnings you're getting. Also, this isn't the section for requesting stuff.
__________________
OciXCrom is offline
Send a message via Skype™ to OciXCrom
JARUSIA
Junior Member
Join Date: Apr 2019
Location: Lithuania
Old 05-28-2019 , 09:12   Re: Please help to fix this plugin from this website
Reply With Quote #3

Warning 213 Tag Mismatch 38 Warnings
JARUSIA is offline
Krtola
Veteran Member
Join Date: Oct 2013
Location: Serbia
Old 06-09-2019 , 23:51   Re: Please help to fix this plugin from this website
Reply With Quote #4

Plugin can not work with tag mismatch.
Did u change anything in code?
Try to compile on spider online compiler,so you can see where is mismatch located.
__________________
Check my original plugins for cs 1.6 and subscribe on channel
Look at the video bellow to see zombie frost grenade

https://youtu.be/j0zspNfN-AM?si=_1IiGPETN-GQY9Ua

Look at the video below to see Zombie blind grenade

https://youtu.be/ORC7ZmoaipQ?si=QC8Bul96QGitUwX4
Krtola is offline
Send a message via Skype™ to Krtola
OciXCrom
Veteran Member
Join Date: Oct 2013
Location: Macedonia
Old 06-10-2019 , 07:06   Re: Please help to fix this plugin from this website
Reply With Quote #5

Quote:
Originally Posted by Krtola View Post
Plugin can not work with tag mismatch.
Did u change anything in code?
Try to compile on spider online compiler,so you can see where is mismatch located.
can work*

Don't give bad advice - an unsupported online compiler is not better than the local compiler that has the same version and file as the server.
You should never use online compiers.
__________________

Last edited by OciXCrom; 06-10-2019 at 07:06.
OciXCrom is offline
Send a message via Skype™ to OciXCrom
Krtola
Veteran Member
Join Date: Oct 2013
Location: Serbia
Old 06-10-2019 , 11:26   Re: Please help to fix this plugin from this website
Reply With Quote #6

Spider is perfect for finding
mistakes like this.
__________________
Check my original plugins for cs 1.6 and subscribe on channel
Look at the video bellow to see zombie frost grenade

https://youtu.be/j0zspNfN-AM?si=_1IiGPETN-GQY9Ua

Look at the video below to see Zombie blind grenade

https://youtu.be/ORC7ZmoaipQ?si=QC8Bul96QGitUwX4
Krtola is offline
Send a message via Skype™ to Krtola
OciXCrom
Veteran Member
Join Date: Oct 2013
Location: Macedonia
Old 06-10-2019 , 12:52   Re: Please help to fix this plugin from this website
Reply With Quote #7

Quote:
Originally Posted by Krtola View Post
Spider is perfect for finding
mistakes like this.
Why? It's just an AMXX compiler, like any other one.
Spider uses AMXX version 1.8.3 which is outdated.
If you're using 1.8.2 you won't be able to run plugins compiled under 1.8.3.
Spider's include files are most likely different than the ones you have on your server.
__________________

Last edited by OciXCrom; 06-10-2019 at 12:53.
OciXCrom is offline
Send a message via Skype™ to OciXCrom
Krtola
Veteran Member
Join Date: Oct 2013
Location: Serbia
Old 06-11-2019 , 04:36   Re: Please help to fix this plugin from this website
Reply With Quote #8

You dont get Tag Mismatch warnings , but loose indentation. I just checked now. And loose indentation is harmless that cant cause server crash.
PHP Code:
OciXCrom 
I always use spider online compiler to find faults/errors in code.
He marks you the exact location where the problem is. To create amxx file,I use local compiler of course.
__________________
Check my original plugins for cs 1.6 and subscribe on channel
Look at the video bellow to see zombie frost grenade

https://youtu.be/j0zspNfN-AM?si=_1IiGPETN-GQY9Ua

Look at the video below to see Zombie blind grenade

https://youtu.be/ORC7ZmoaipQ?si=QC8Bul96QGitUwX4
Krtola is offline
Send a message via Skype™ to Krtola
Reply



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 12:05.


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