User
Pass
2FA
 
 

[rezolvat]Nu pot instala pluginuri pe SV

 
This forum is locked: you cannot post, reply to, or edit topics.   This topic is locked: you cannot edit posts or make replies.    Freakz Forum Index -> Trash Bin -> CS 2006-2019 (Archived) -> Plugins - Help / Support
Author Message819
XpCDr0G

[Mentally Stable]



Status: Offline
(since 14-01-2020 16:27)
Joined: 13 Aug 2013
Posts: 91, Topics: 29
Location: Romania

Reputation: 45.1
Votes: 1

Post Posted: 16-01-2015, 22:17:13 | Translate post to: ... (Click for more languages)

Am si eu o problema , am bagat un mod biohazzard classic cu clase si nu imi pot baga nici un plugin , nici un plugin nu raspunde la comenzi precum

/shop , /buy , /lm , 80% din pluginuri calre le bag nu merg din cauza acestui plugin de baza ! si nu as vrea sa renunt la el -

Aici va las codul la pluginul de baza

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, -1 },
   { 13, 52 },
   { -1, -1 },
   { 10, 90 },
   { -1, -1 },
   { 7, 32 },
   { -1, -1 },
   { 30, 100 },
   { 30, 90 },
   { -1, -1 },
   { 30, 120 },
   { 20, 100 },
   { 25, 100 },
   { 30, 90 },
   { 35, 90 },
   { 25, 90 },
   { 12, 100 },
   { 20, 120 },
   { 10, 30 },
   { 30, 120 },
   { 100, 200 },
   { 8, 32 },
   { 30, 90 },
   { 30, 120 },
   { 20, 90 },
   { -1, -1 },
   { 7, 35 },
   { 30, 90 },
   { 30, 90 },
   { -1, -1 },
   { 50, 100 }
}

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

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

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

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

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

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

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

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

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

   RegisterHam(Ham_TakeDamage, "player", "bacon_takedamage_player")
   RegisterHam(Ham_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_IGNORE, FP_CELL, FP_CELL)
   g_fwd_gamestart = CreateMultiForward("event_gamestart", ET_IGNORE)

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

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

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

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

   remove_user_model(g_modelent[id])
}

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

public client_disconnect(id)
{
   remove_task(TASKID_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(id, print_center, "%L", id, "CMD_TEAMCHANGE")
      return PLUGIN_HANDLED
   }
   return PLUGIN_CONTINUE
}

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

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

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

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

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

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

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

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

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

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

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

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

public msg_deathmsg(msgid, dest, id)
{
   static killer
   killer = get_msg_arg_int(1)
   
   static victim
   victim = get_msg_arg_int(2)
   
   if(!is_user_connected(killer))
      return PLUGIN_CONTINUE
   
   if(g_zombie[killer])
      set_msg_arg_string(4, g_zombie_weapname)
   else if(g_zombie[victim])
      set_pev(killer, pev_frags, pev(killer, pev_frags) + float(get_pcvar_num(cvar_killbonus)))
   
   return PLUGIN_CONTINUE
}

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

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

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

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

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

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

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

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

public event_newround()
{
   g_gamestarted = false
   
   static buytime
   buytime = get_pcvar_num(cvar_buytime)
   
   if(buytime)
      g_buytime = buytime + get_gametime()
   
   static id
   for(id = 0; id <= g_maxplayers; id++)
   {
      if(is_user_connected(id))
         g_blockmodel[id] = true
   }
   
   remove_task(TASKID_NEWROUND)
   remove_task(TASKID_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 1: maxammo = g_weapon_ammo[weapon][MAX_AMMO]
      case 2: maxammo = g_weapon_ammo[weapon][MAX_CLIP]
   }

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

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

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

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

public 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 weapon, maxclip, ent, weaponname[32]
   switch(killreward)
   {
      case 1:
      {
         weapon = get_user_weapon(killer)
         maxclip = g_weapon_ammo[weapon][MAX_CLIP]
         if(maxclip)
         {
            get_weaponname(weapon, weaponname, 31)
            ent = fm_find_ent_by_owner(-1, weaponname, killer)
               
            fm_set_weapon_ammo(ent, maxclip)
         }
      }
      case 2:
      {
         if(!user_has_weapon(killer, CSW_HEGRENADE))
            bacon_give_weapon(killer, "weapon_hegrenade")
      }
      case 3:
      {
         weapon = get_user_weapon(killer)
         maxclip = g_weapon_ammo[weapon][MAX_CLIP]
         if(maxclip)
         {
            get_weaponname(weapon, weaponname, 31)
            ent = fm_find_ent_by_owner(-1, weaponname, killer)
               
            fm_set_weapon_ammo(ent, maxclip)
         }
            
         if(!user_has_weapon(killer, CSW_HEGRENADE))
            bacon_give_weapon(killer, "weapon_hegrenade")
      }
   }
   return PLUGIN_CONTINUE
}

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

public task_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 frags, deaths, team
   frags  = get_user_frags(attacker)
   deaths = fm_get_user_deaths(attacker)
   team   = get_user_team(attacker)
   
   message_begin(MSG_BROADCAST, g_msg_scoreinfo)
   write_byte(attacker)
   write_short(frags)
   write_short(deaths)
   write_short(0)
   write_short(team)
   message_end()
   
   if(!is_user_connected(victim))
      return
   
   frags  = get_user_frags(victim)
   deaths = fm_get_user_deaths(victim)
   team   = get_user_team(victim)
   
   message_begin(MSG_BROADCAST, g_msg_scoreinfo)
   write_byte(victim)
   write_short(frags)
   write_short(deaths)
   write_short(0)
   write_short(team)
   message_end()
}

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

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

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

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

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

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

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

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

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

      set_pev(id, pev_fixangle, 1)
   }
}

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

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

   for(i = 0; i < num; i++) if(g_preinfect[players[i]])
   {
      newzombie = players[i]
      zombiecount++
   }
   
   if(zombiecount > 1)
      newzombie = 0
   else if(zombiecount < 1)
      newzombie = players[_random(num)]
   
   for(i = 0; i < num; i++)
   {
      id = players[i]
      (id == newzombie || g_preinfect[id]) ? infect_user(id, 0) : fm_set_user_team(id, CS_TEAM_CT)
   }
   
   set_hudmessage(_, _, _, _, _, 1)
   if(newzombie)
   {
      static name[32]
      get_user_name(newzombie, name, 31)
      
      ShowSyncHudMsg(0, g_sync_msgdisplay, "%L", LANG_PLAYER, "INFECTED_HUD", name)
      client_print(0, print_chat, "%L", LANG_PLAYER, "INFECTED_TXT", name)
   }
   else
   {
      ShowSyncHudMsg(0, g_sync_msgdisplay, "%L", LANG_PLAYER, "INFECTED_HUD2")
      client_print(0, print_chat, "%L", LANG_PLAYER, "INFECTED_TXT2")
   }
   
   g_gamestarted = true
   ExecuteForward(g_fwd_gamestart, g_fwd_result)
}

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

   return classid
}

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

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

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

public native_get_user_class(index)
   return g_player_class[index]

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

public native_game_started()
   return g_gamestarted

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

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

public native_cure_user(index)
   cure_user(index)

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

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

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

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

stock fm_set_kvd(entity, const key[], const value[], const classname[] = "")
{
   set_kvd(0, KV_ClassName, classname)
   set_kvd(0, KV_KeyName, key)
   set_kvd(0, KV_Value, value)
   set_kvd(0, KV_fHandled, 0)

   return dllfunc(DLLFunc_KeyValue, entity, 0)
}

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

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

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

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

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

   return 1
}

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

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

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

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

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

   return 1
}

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

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

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

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

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

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

   return count
}

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

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

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

   g_modelent[id] = 0
}

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

   g_zombie[index] = true

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

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

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

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

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

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

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

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

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

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



Last edited by XpCDr0G on 17-01-2015, 14:51:25; edited 3 times in total
0 0
  
Back to top
View user's profile Send private message
XpCDr0G

[Mentally Stable]



Status: Offline
(since 14-01-2020 16:27)
Joined: 13 Aug 2013
Posts: 91, Topics: 29
Location: Romania

Reputation: 45.1
Votes: 1

Post Posted: 16-01-2015, 22:56:36 | Translate post to: ... (Click for more languages)

Mai vreau si eu un Weapons Menu automat cand incepe runda si la Tero si la CT cu armele astea dak vreti va rog:

-AK 47 +deagle+HE/Flash/Smoke
-M4a1 +deagle.......
-AUG +deagle..........
-SMG
-AWP

Doar astea 5 arme le vreau va rog mult am nevoie foarte urgenta dar doar cu astea 5 arme!

0 0
  
Back to top
View user's profile Send private message
XpCDr0G

[Mentally Stable]



Status: Offline
(since 14-01-2020 16:27)
Joined: 13 Aug 2013
Posts: 91, Topics: 29
Location: Romania

Reputation: 45.1
Votes: 1

Post Posted: 17-01-2015, 14:42:16 | Translate post to: ... (Click for more languages)

.

 
Staff message (-P!C@-):
 
Evita posturile pentru +1!


0 0
  
Back to top
View user's profile Send private message
-P!C@-

[Simply Normal]



Status: Offline
(since 21-04-2022 19:07)
Joined: 28 May 2012
Posts: 21086, Topics: 1601
Location: Constanta

Reputation: 1870.3
Votes: 781

Post Posted: 17-01-2015, 17:16:33 | Translate post to: ... (Click for more languages)

Incearca si un alt addons sa vezi daca merg celelalte pluginuri. Click



0 0
  
Back to top
View user's profile Send private message
EDUTz

[HardcoreAmxxScripter]



Status: Offline
(since 15-08-2021 16:34)
Joined: 27 Dec 2010
Posts: 4306, Topics: 244
Location: Jud. Miserupia, sat Bagadanc

Reputation: 4085
Votes: 179

         
Post Posted: 19-01-2015, 06:20:30 | Translate post to: ... (Click for more languages)

Nu e neaparat din cauza lui, muta pluginurile inainte de biohazard, iar allchat sau ce versiune de chat folosesti muta-l ultimul ultimul in lista de pluginuri ... chiar in plugins-biohazard.ini daca se poate. ... sau cum aveti voi la bh



Pentru pluginuri complicate le fac cu $$ pe paypal/psc. PM

0 0
  
Back to top
View user's profile Send private message Yahoo! Messenger ID
destroi112

[DEV]



Status: Offline
(since 12-03-2020 22:13)
Joined: 24 May 2014
Posts: 4042, Topics: 119
Location: ---------

Reputation: 515.9
Votes: 118

   
Post Posted: 23-01-2015, 17:33:58 | Translate post to: ... (Click for more languages)

XpCDr0G wrote:
Mai vreau si eu un Weapons Menu automat cand incepe runda si la Tero si la CT cu armele astea dak vreti va rog:

-AK 47 +deagle+HE/Flash/Smoke
-M4a1 +deagle.......
-AUG +deagle..........
-SMG
-AWP

Doar astea 5 arme le vreau va rog mult am nevoie foarte urgenta dar doar cu astea 5 arme!

poftim nu prea inteleg la ce ajuta doar 5 arme la biohazard dar ma rog.
PS:Arata-ne log din consola sa vedem ce eroare iti da si de la ce plugin -
Spoiler:



Retired from Amxmodx

0 0
  
Back to top
View user's profile Send private message

  Topic locked


Topic is closed, you cannot post any messages in it anymore

Locked by TwisTer, 16 March 2015 13:31



 
This forum is locked: you cannot post, reply to, or edit topics.   This topic is locked: you cannot edit posts or make replies.    Freakz Forum Index -> Trash Bin -> CS 2006-2019 (Archived) -> Plugins - Help / Support  


The time now is 28-07-2025, 23:59:13
Copyright info

Based on phpBB ro/com
B

 
 
 







I forgot my password