VIP Model плъгин - когато вляза в сървъра съм с обикновен скин

Ако имате затруднения при изработката/преработката на даден плъгин - пишете тук, ще се опитаме да ви помогнем!
Аватар
Coca Cola _-FxF-_
Извън линия
Потребител
Потребител
Мнения: 159
Регистриран на: 15 Окт 2016, 15:30
Се отблагодари: 21 пъти
Получена благодарност: 3 пъти
Обратна връзка:

VIP Model плъгин - когато вляза в сървъра съм с обикновен скин

Мнение от Coca Cola _-FxF-_ » 24 Фев 2019, 03:07

Търсех доста плъгини намерих този код който доста хора ползват:

Код за потвърждение: Избери целия код

#include <amxmodx>
#include <cstrike>
#include <hamsandwich>

#define FLAG_VIP ADMIN_IMMUNITY

new const g_szCTModel[] = "Admin"
new const g_szTModel[] = "Admin"

public plugin_init()
{
    register_plugin("Admin Models", "1.0", "iPlay.bg (OciXCrom)")
    RegisterHam(Ham_Spawn, "player", "player_spawn", 1)
}

public player_spawn(id)
{
    if(is_user_alive(id))
    {
        if(get_user_flags(id) & FLAG_VIP) cs_set_user_model(id, get_user_team(id) == 2 ? g_szCTModel : g_szTModel)
        else cs_reset_user_model(id)
    }
}

public plugin_precache()
{
    new szModel[128]
    formatex(szModel, charsmax(szModel), "models/player/Nadenica/Nadenica.mdl", g_szCTModel, g_szCTModel)
    precache_model(szModel)
    formatex(szModel, charsmax(szModel), "models/player/Banan/Banan.mdl", g_szTModel, g_szTModel)
    precache_model(szModel)
}
следния проблем е че тръгва всичко, но когато вляза във сървъра съм с обикновен скин? (Работя с Biohazard Mod). Някакви идеи?
Извън темата
Извинявам се ако темата не е във правилния си раздел.
Последно промяна от OciXCrom на 24 Фев 2019, 20:05, променено общо 3 пъти.
Причина: +1 предупреждение - редактирано заглавие.
Mobile Legends BANG BANG!
- Nick: Marksman <GX>
- Add me for RANKS
!

Аватар
mi0
Извън линия
AMXX Скриптър
AMXX Скриптър
Мнения: 534
Регистриран на: 09 Дек 2016, 22:02
Се отблагодари: 97 пъти
Получена благодарност: 120 пъти
Обратна връзка:

Проблем със SkinsAdmin

Мнение от mi0 » 24 Фев 2019, 03:19

Може самия мод да ресетва скина. Ако не си го сложил най-отдолу в plugins.ini, го сложи.
aka kurdokoleno
Catch Mod - 87.121.112.232:27021

Аватар
Coca Cola _-FxF-_
Извън линия
Потребител
Потребител
Мнения: 159
Регистриран на: 15 Окт 2016, 15:30
Се отблагодари: 21 пъти
Получена благодарност: 3 пъти
Обратна връзка:

Проблем със SkinsAdmin

Мнение от Coca Cola _-FxF-_ » 24 Фев 2019, 11:32

mi0 написа: 24 Фев 2019, 03:19 Може самия мод да ресетва скина. Ако не си го сложил най-отдолу в plugins.ini, го сложи.
И аз така мислех, но уви не оправи проблема. Някакви други идеи?
Mobile Legends BANG BANG!
- Nick: Marksman <GX>
- Add me for RANKS
!

Аватар
JackEyedJones
Извън линия
Потребител
Потребител
Мнения: 399
Регистриран на: 10 Сеп 2018, 17:26
Местоположение: Plovdiv, Bulgaria, Europe, Entire World
Се отблагодари: 4 пъти
Получена благодарност: 69 пъти
Обратна връзка:

Проблем със SkinsAdmin

Мнение от JackEyedJones » 24 Фев 2019, 11:49

Код за потвърждение: Избери целия код

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

#define FLAG_VIP ADMIN_IMMUNITY

new const g_szCTModel[] = "models/player/Nadenica/Nadenica.mdl"
new const g_szTModel[] = "models/player/Banan/Banan.mdl"

public plugin_init()
{
    	register_plugin("Admin Models", "1.0", "iPlay.bg (OciXCrom)")
    	RegisterHam(Ham_Spawn, "player", "player_spawn", 1)
}

public player_spawn(id)
{
    	if(is_user_alive(id))
    	{
        	if(!access(id, FLAG_VIP))
		{
			cs_reset_user_model(id)
			
			return
		}
		
		cs_set_user_model(id, cs_get_user_team(id) == CS_TEAM_CT ? g_szCTModel : g_szTModel)
    	}
}

public plugin_precache()
{
    	precache_model(g_szCTModel);
	precache_model(g_szTModel);
}

Аватар
<VeCo>
Извън линия
AMXX Скриптър
AMXX Скриптър
Мнения: 145
Регистриран на: 28 Яну 2019, 19:01
Се отблагодари: 11 пъти
Получена благодарност: 80 пъти
Обратна връзка:

Проблем със SkinsAdmin

Мнение от <VeCo> » 24 Фев 2019, 12:21

cs_set_user_model използва само името, не целия път
(не знам какъв метод използва Biohazard за задаването на модели, може би set_user_info "model" е по-добър вариант)

това cs_reset_user_model няма смисъл да го има, само ще създава проблеми с други модове
:pepo_think3:

Аватар
Coca Cola _-FxF-_
Извън линия
Потребител
Потребител
Мнения: 159
Регистриран на: 15 Окт 2016, 15:30
Се отблагодари: 21 пъти
Получена благодарност: 3 пъти
Обратна връзка:

Проблем със SkinsAdmin

Мнение от Coca Cola _-FxF-_ » 24 Фев 2019, 12:41

JackEyedJones написа: 24 Фев 2019, 11:49

Код за потвърждение: Избери целия код

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

#define FLAG_VIP ADMIN_IMMUNITY

new const g_szCTModel[] = "models/player/Nadenica/Nadenica.mdl"
new const g_szTModel[] = "models/player/Banan/Banan.mdl"

public plugin_init()
{
    	register_plugin("Admin Models", "1.0", "iPlay.bg (OciXCrom)")
    	RegisterHam(Ham_Spawn, "player", "player_spawn", 1)
}

public player_spawn(id)
{
    	if(is_user_alive(id))
    	{
        	if(!access(id, FLAG_VIP))
		{
			cs_reset_user_model(id)
			
			return
		}
		
		cs_set_user_model(id, cs_get_user_team(id) == CS_TEAM_CT ? g_szCTModel : g_szTModel)
    	}
}

public plugin_precache()
{
    	precache_model(g_szCTModel);
	precache_model(g_szTModel);
}
Благодаря за времето, но няма ефект.. Други идеи?
Извън темата
Ползвам Biohazard 1.93
Mobile Legends BANG BANG!
- Nick: Marksman <GX>
- Add me for RANKS
!

Аватар
mi0
Извън линия
AMXX Скриптър
AMXX Скриптър
Мнения: 534
Регистриран на: 09 Дек 2016, 22:02
Се отблагодари: 97 пъти
Получена благодарност: 120 пъти
Обратна връзка:

Проблем със SkinsAdmin

Мнение от mi0 » 24 Фев 2019, 13:59

Опитай да ги сетваш 2-3 секунди след спаун.
aka kurdokoleno
Catch Mod - 87.121.112.232:27021

Аватар
Coca Cola _-FxF-_
Извън линия
Потребител
Потребител
Мнения: 159
Регистриран на: 15 Окт 2016, 15:30
Се отблагодари: 21 пъти
Получена благодарност: 3 пъти
Обратна връзка:

Проблем със SkinsAdmin

Мнение от Coca Cola _-FxF-_ » 24 Фев 2019, 14:48

mi0 написа: 24 Фев 2019, 13:59 Опитай да ги сетваш 2-3 секунди след спаун.
Не става,някакъв друг код? Може би по тежък но да работи. Чудя се дали да пробвам със НЕЖЕЛАН САЙТ
Последно промяна от stambeto2006 на 24 Фев 2019, 14:52, променено общо 1 път.
Причина: Няма нужда да използваш плъгини от ЦС-ХЛАПЕ.ИНФО!
Mobile Legends BANG BANG!
- Nick: Marksman <GX>
- Add me for RANKS
!

Аватар
OciXCrom
Извън линия
Администратор
Администратор
Мнения: 7206
Регистриран на: 06 Окт 2016, 19:20
Местоположение: /resetscore
Се отблагодари: 117 пъти
Получена благодарност: 1295 пъти
Обратна връзка:

Проблем със SkinsAdmin

Мнение от OciXCrom » 24 Фев 2019, 15:11

Правило №5: Заглавието на темата ви трябва да описва възможно най-добре съдържанието ѝ. Същата трябва да е пусната в правилния раздел, като преди това сте проверили, че вече не съществува подобна такава. Не пишете заглавия от рода на "Проблем с X" където потребителите трябва да гадаят за какъв проблем става дума преди да отворят темата, а напишете ТОЧНО и ЯСНО за какъв проблем става дума в самото заглавие.*
Отново правиш същата грешка. Този път ако не оправиш заглавието, ще получиш предупреждение.

Качи biohazard плъгина за да видим как точно той ги задава моделите.

Аватар
Coca Cola _-FxF-_
Извън линия
Потребител
Потребител
Мнения: 159
Регистриран на: 15 Окт 2016, 15:30
Се отблагодари: 21 пъти
Получена благодарност: 3 пъти
Обратна връзка:

Помощ със VIP Model плъгин

Мнение от Coca Cola _-FxF-_ » 24 Фев 2019, 19:58

Random ZM Models.

Код за потвърждение: Избери целия код

#include <amxmodx>
#include <fakemeta>
#tryinclude <biohazard>

#if !defined _biohazard_included
        #assert Biohazard functions file required!
#endif

new g_zombie_models[][] =
{
	"models/player/gonome/gonome.mdl",
	"models/player/hulk/hulk.mdl",
	"models/player/leaper/leaper.mdl",
	"models/player/slum/slum.mdl",
        "models/player/stalker/stalker.mdl"
}

new cvar_randommodels
public plugin_precache()
{
	register_plugin("random models", "0.1", "cheap_suit")
	is_biomod_active() ? plugin_precache2() : pause("ad")
}

public plugin_precache2()
{
	cvar_randommodels = register_cvar("bh_random_models", "1")
	for(new i = 0; i < sizeof g_zombie_models; i++)
		precache_model(g_zombie_models[i])
}

public event_infect2(id) if(get_pcvar_num(cvar_randommodels))
{	
	static ent; ent = fm_find_ent_by_owner(-1, "player_model", id)
	if(pev_valid(ent)) engfunc(EngFunc_SetModel, ent, g_zombie_models[random(sizeof g_zombie_models)])
}

stock fm_find_ent_by_owner(index, const classname[], owner, jghgtype = 0) 
{
	static strtype[11] = "classname", ent; ent = index
	switch(jghgtype) 
	{
		case 1: strtype = "target"
		case 2: strtype = "targetname"
	}
	while((ent = engfunc(EngFunc_FindEntityByString, ent, strtype, classname)) && pev(ent, pev_owner) != owner) {}
	
	return ent
}
Biohazard.cfg където пак има код за модел. (Това е класичния)

Код за потвърждение: Избери целия код

/* Biohazard configs
*
*  by Cheap_Suit
* 
*  This file is provided as is (no warranties).
*/

#if defined _biohazardcfg_included
	#endinput
#endif
#define _biohazardcfg_included

// default fog settings
#define FOG_ENABLE  1
#define FOG_DENSITY 12
#define FOG_COLOR   "0 0 0"

// empty string to disable
new g_zombie_model[] 	    = "models/player/zombie2/zombie2.mdl"
new g_zombie_claws[] 	    = "models/v_knife_zombie.mdl"

new g_zombie_weapname[]     = "claws"

// weapon name (menu)
new g_primmenunames[][] = 
{ 
	"", 
	"M4A1", 
	"AK47", 
	"AUG", 
	"SG552", 
	"Galil", 
	"Famas", 
	"M249", 
	"MP5 Navy", 
	"XM1014",
	"M3",
	"P90", 
	"SG550", 
	"G3SG1"						
}

// weapon name (game)
new g_primweaponnames[][] = 
{ 
	"", 
	"weapon_m4a1", 
	"weapon_ak47", 
	"weapon_aug", 
	"weapon_sg552", 
	"weapon_galil", 
	"weapon_famas", 
	"weapon_m249", 
	"weapon_mp5navy", 
	"weapon_xm1014", 
	"weapon_m3",
	"weapon_p90", 
	"weapon_sg550", 
	"weapon_g3sg1" 					
}

// weapon name (menu)
new g_secmenunames[][] = 
{ 
	"", 
	"Deagle", 
	"USP", 
	"Elite"
}

// weapon name (game)
new g_secweaponnames[][] = 
{ 
	"", 
	"weapon_deagle", 
	"weapon_usp", 
	"weapon_elite" 					
}

// weapon name (game)
new g_grenades[][] = 
{ 
	"weapon_hegrenade",
	"weapon_flashbang",
	"weapon_smokegrenade"
}

new g_zombie_win_sounds[][] = 
{ 
	"ambience/the_horror1.wav", 
	"ambience/the_horror2.wav",
	"ambience/the_horror3.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" 
}
И главния 1.93 Bio plugin.

Код за потвърждение: Избери целия код

/* 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	"1.93"

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

#tryinclude "biohazard.cfg"

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

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

#define OFFSET_AMMO_AWP 	377
#define OFFSET_AMMO_SCOUT 	378
#define OFFSET_AMMO_M249 	379
#define OFFSET_AMMO_FAMAS 	380
#define OFFSET_AMMO_M3 		381
#define OFFSET_AMMO_USP 	382
#define OFFSET_AMMO_FIVESEVEN 	383
#define OFFSET_AMMO_DEAGLE 	384
#define OFFSET_AMMO_P228 	385
#define OFFSET_AMMO_GLOCK18 	386

#define AMMOID_FLASHBANG 	11
#define AMMOID_HEGRENADE 	12
#define AMMOID_SGGRENADE 	13
#define AMMOID_C4		14

#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_GIVENADES	922

#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 AMMOID_NULL 		(1<<0 | 1<<AMMOID_FLASHBANG | 1<<AMMOID_HEGRENADE | 1<<AMMOID_SGGRENADE | 1<<AMMOID_C4)
#define AMMOWP_NULL 		(1<<0 | 1<<CSW_KNIFE | 1<<CSW_FLASHBANG | 1<<CSW_HEGRENADE | 1<<CSW_SMOKEGRENADE | 1<<CSW_C4)

#define MAX_SPAWNS		128
#define MAX_AMMO		200
#define IMPULSE_FLASHLIGHT	100
#define MODEL_CLASSNAME		"player_model"
#define KNIFE_MODEL		"models/v_knife.mdl"

/*enum CsTeams
{
	CS_TEAM_UNASSIGNED	= 0,
	CS_TEAM_T 		= 1,
	CS_TEAM_CT 		= 2,
	CS_TEAM_SPECTATOR 	= 3
}

enum CsArmorType 
{
	CS_ARMOR_NONE 		= 0,
	CS_ARMOR_KEVLAR 	= 1,
	CS_ARMOR_VESTHELM 	= 2
}*/

#define cs_get_user_team(%1)    CsTeams:get_pdata_int(%1, OFFSET_TEAM)
#define cs_get_user_deaths(%1)  get_pdata_int(%1, OFFSET_DEATH)
#define reset_user_primary(%1)  set_pdata_int(%1, OFFSET_PRIMARYWEAPON, 0)
#define set_weapon_ammo(%1,%2)  set_pdata_int(%1, OFFSET_CLIPAMMO, %2, EXTRAOFFSET_WEAPONS)
#define set_user_deaths(%1,%2)  set_pdata_int(%1, OFFSET_DEATH, %2)
#define is_player_alive(%1)     ((1 <= %1 <= g_maxplayers) && is_user_alive(%1))
#define _random(%1) 	        random_num(0, %1 - 1)

new cvar_regen_dly1, cvar_regen_dly2, cvar_randomspawn, cvar_zombie_spd, cvar_skyname, cvar_autobalance[2], cvar_starttime, 
    cvar_lights, cvar_zombie_def, cvar_zombie_hp, cvar_blocknightvision, cvar_killbonus, cvar_gamedescription, cvar_enabled, 
    cvar_autonvg, cvar_maxzombies, cvar_customsounds, cvar_hpbonus, cvar_knockback_hp, cvar_flashbang, cvar_weaponsmenu,
    cvar_zombie_atk, cvar_knockback_duck, cvar_hedmg_multi, cvar_zombie_regen, cvar_zombie_resist, cvar_buytime, cvar_ammo,
    cvar_zombie_instant, cvar_winsounds, cvar_botquota
	
new bool:g_brestorevel, Float:g_vecvel[3], bool:g_roundstarted, g_maxplayers, g_spawncount, bool:g_infecting, bool:g_gamestarted, 
    Float:g_spawns[MAX_SPAWNS+1][9], g_zombieoftheround, g_fwd_spawn, bool:g_usingknifemodel, bool:g_usingplayermodel, g_equipmenu, 
    g_primmenu, g_secmenu, g_fwd_result, g_fwd_infect, g_fwd_teamwin, g_fwd_gamestart, g_fwd_infect2, CsTeams:g_winningteam, g_radiofix,
    bool:g_czero, g_netclient_pdata, g_botclient_pdata, g_buyzone, Float:g_buytime

new bool:g_zombie[33], Float:g_regendelay[33], g_victim[33], bool:g_showmenu[33], g_weapons[33][2], bool:g_falling[33], g_lastteam[33],
    g_modelent[33], g_weaponent[33]

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
	
	g_usingplayermodel = (strlen(g_zombie_model) > 0) ? true : false
	g_usingknifemodel  = (strlen(g_zombie_claws) > 0) ? true : false
	if(g_usingplayermodel) precache_model(g_zombie_model)
	if(g_usingknifemodel)  precache_model(g_zombie_claws)
	
	new 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")
	new zone = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_bomb_target"))
	if(zone) dllfunc(DLLFunc_Spawn, zone), set_pev(zone, pev_solid, SOLID_NOT)
	
	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)
	
	#if FOG_ENABLE
	new fog = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "env_fog"))
	if(fog)
	{
		new DENSITY[10]
		formatex(DENSITY, 9, "0.00%d", clamp(FOG_DENSITY, 1, 99))
		
		fm_set_kvd(fog, "density", DENSITY, "env_fog")
		fm_set_kvd(fog, "rendercolor", FOG_COLOR, "env_fog")
	}
	#endif
}

public plugin_init()
{
	if(!get_pcvar_num(cvar_enabled)) return
	
	cvar_gamedescription  = register_cvar("bh_gamedescription",   "Biohazard")
	cvar_skyname	      = register_cvar("bh_skyname", 	      "night")
	cvar_lights	      = register_cvar("bh_lights",	      "d")
	cvar_blocknightvision = register_cvar("bh_block_nvg",	      "1")
	cvar_starttime	      = register_cvar("bh_starttime", 	      "10.0")
	cvar_randomspawn      = register_cvar("bh_randomspawn",       "1")
	cvar_customsounds     = register_cvar("bh_customsounds",      "1")
	cvar_winsounds	      = register_cvar("bh_winsounds", 	      "1")
	cvar_autonvg	      = register_cvar("bh_autonvg",	      "1")
	cvar_killbonus	      = register_cvar("bh_zombie_kill_bonus", "2")
	cvar_buytime          = register_cvar("bh_buytime",           "0")
	cvar_weaponsmenu      = register_cvar("bh_weaponsmenu",       "0")
	cvar_ammo             = register_cvar("bh_ammo", 	      "1")
	cvar_hedmg_multi      = register_cvar("bh_hedmg_multi",       "1.0")
	cvar_maxzombies       = register_cvar("bh_maxzombies", 	      "25")
	cvar_flashbang 	      = register_cvar("bh_flashbang", 	      "1")
	cvar_zombie_instant   = register_cvar("bh_zombie_instant",    "1")
	cvar_zombie_hp	      = register_cvar("bh_zombie_hp", 	      "135")
	cvar_knockback_hp     = register_cvar("bh_zombie_kb_hp",      "90")
	cvar_knockback_duck   = register_cvar("bh_zombie_kb_duck",    "1")
	cvar_hpbonus          = register_cvar("bh_zombie_hp_bonus",   "65")
	cvar_zombie_resist    = register_cvar("bh_zombie_resist",     "1")
	cvar_zombie_spd       = register_cvar("bh_zombie_speed",      "280.0")
	cvar_zombie_atk       = register_cvar("bh_zombie_atk_multi",  "2.0")
	cvar_zombie_def       = register_cvar("bh_zombie_def_multi",  "0.087")
	cvar_zombie_regen     = register_cvar("bh_zombie_regen",      "1")
	cvar_regen_dly1       = register_cvar("bh_zombie_regendly1",  "2.0")
	cvar_regen_dly2       = register_cvar("bh_zombie_regendly2",  "0.25")
	cvar_botquota	      = get_cvar_pointer("bot_quota")
	cvar_autobalance[0]   = get_cvar_pointer("mp_autoteambalance")
	cvar_autobalance[1]   = get_pcvar_num(cvar_autobalance[0])
	set_pcvar_num(cvar_autobalance[0], 0)

	register_clcmd("nightvision", "cmd_nightvision")
	register_clcmd("chooseteam",  "cmd_chooseteam")
	register_clcmd("say guns",    "cmd_enablemenu")
	register_clcmd("say /guns",   "cmd_enablemenu")
	register_clcmd("amx_infect",  "cmd_infectuser", ADMIN_BAN, "<name or #userid>")
	register_menu("#RadioB", MENU_KEY_1, "cmd_fixradio", 1)
	
	RegisterHam(Ham_Use,	     	     "func_tank",       "bacon_use")
	RegisterHam(Ham_Use,	     	     "func_tankmortar", "bacon_use")
	RegisterHam(Ham_Use,	     	     "func_tankrocket", "bacon_use")
	RegisterHam(Ham_Use,	     	     "func_tanklaser",  "bacon_use")
	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_Item_Deploy, 	     "weapon_knife",    "bacon_item_deploy_post", 	  1)
	RegisterHam(Ham_Item_AttachToPlayer, "weapon_knife", 	"bacon_item_attachtoplayer_post", 1)

	unregister_forward(FM_Spawn, 		g_fwd_spawn)
	register_forward(FM_PlayerPreThink,	"fwd_playerprethink")
	register_forward(FM_PlayerPostThink,	"fwd_playerpostthink")
	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_Sys_Error,		"fwd_sys_error")
	register_forward(FM_PlayerPreThink,	"fwd_playerprethink_post", 1)
	register_forward(FM_TraceLine,		"fwd_traceline_post", 	   1)
	register_forward(FM_TraceHull, 		"fwd_tracehull_post", 	   1)

	register_message(get_user_msgid("Battery"), 	"msg_battery")
	register_message(get_user_msgid("TextMsg"), 	"msg_textmsg")
	register_message(get_user_msgid("SendAudio"), 	"msg_sendaudio")
	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("StatusIcon"),  "msg_statusicon")
	register_message(get_user_msgid("ScoreAttrib"), "msg_scoreattrib")
	register_message(get_user_msgid("AmmoX"), 	"msg_ammox")
	register_message(get_user_msgid("CurWeapon"),   "msg_curweapon")

	register_event("TextMsg", "event_textmsg",   "a", "2=#Game_will_restart_in")
	register_event("HLTV",    "event_newround",  "a", "1=0", "2=0")
	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_fwd_infect 	= CreateMultiForward("event_infect", 	ET_CONTINUE, FP_CELL, FP_CELL)
	g_fwd_infect2 	= CreateMultiForward("event_infect2", 	ET_CONTINUE, FP_CELL)
	g_fwd_teamwin 	= CreateMultiForward("event_teamwin", 	ET_CONTINUE, FP_CELL)
	g_fwd_gamestart = CreateMultiForward("event_gamestart", ET_CONTINUE)
	g_maxplayers 	= get_maxplayers()
	
	register_dictionary("biohazard.txt")
	build_menu(), get_spawnpoints()

	new modname[7]; get_modname(modname, 6)
	g_czero = equal(modname,"czero") ? true : false
}

public pdata_init(id)
{
	RegisterHamFromEntity(Ham_TakeDamage, id, "bacon_takedamage")
	RegisterHamFromEntity(Ham_Spawn,      id, "bacon_spawn_post", 1)
}

public build_menu()
{
	new title[32]
	formatex(title, 31, "%L", LANG_SERVER, "MENU_TITLE1")
	g_equipmenu = menu_create(title, "menu_equip", 0)
		
	formatex(title, 31, "%L", LANG_SERVER, "MENU_TITLE2")
	g_primmenu  = menu_create(title,    "menu_prim", 0)
	
	formatex(title, 31, "%L", LANG_SERVER, "MENU_TITLE3")
	g_secmenu   = menu_create(title,  "menu_sec",  0)

	new name[32]
	formatex(name, 31, "%L", LANG_SERVER, "MENU_NEWWEAPONS")
	menu_additem(g_equipmenu, name, "1", 0, -1)
	
	formatex(name, 31, "%L", LANG_SERVER, "MENU_PREVSETUP")
	menu_additem(g_equipmenu, name, "2", 0, -1)
	
	formatex(name, 31, "%L", LANG_SERVER, "MENU_DONTSHOW")
	menu_additem(g_equipmenu, name, "3", 0, -1)
	
	static i, num[3]
	for(i = 1; i < sizeof g_primmenunames; i++)
	{
		formatex(num, 2, "%d", i)
		menu_additem(g_primmenu, g_primmenunames[i], num, 0, -1)
	}
	
	for(i = 1; i < sizeof g_secmenunames; i++)
	{
		formatex(num, 2, "%d", i)
		menu_additem(g_secmenu, g_secmenunames[i], num, 0, -1)
	}
	return PLUGIN_HANDLED
}

public plugin_cfg()
{
	new file[64]; get_configsdir(file, 63)
	format(file, 63, "%s/bh_cvars.cfg", file)
	if(file_exists(file)) server_cmd("exec %s", file), server_exec()
	
	new light[2]
	get_pcvar_string(cvar_lights, light, 1)
	
	if(strlen(light) > 0)
	{
		set_task(1.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)
	}
		
	new skyname[32]
	get_pcvar_string(cvar_skyname, skyname, 31)
		
	if(strlen(skyname) > 0)
		set_cvar_string("sv_skyname", skyname)
}

public plugin_end()
	set_pcvar_num(cvar_autobalance[0], cvar_autobalance[1]), destroyforwards()

public destroyforwards()
{
	DestroyForward(g_fwd_infect),  DestroyForward(g_fwd_infect2)
	DestroyForward(g_fwd_teamwin), DestroyForward(g_fwd_gamestart)
}

public plugin_natives()
{
	register_library("biohazardf")
	register_native("is_game_started",     "native_game_started")
	register_native("is_user_zombie",      "native_is_user_zombie")
	register_native("is_user_firstzombie", "native_is_user_firstzombie")
	register_native("infect_user",         "native_infect_user")
	register_native("firstzombie",         "native_first_zombie")
}

public client_connect(id)
{
	g_lastteam[id] = -1, remove_model(g_modelent[id])
	g_showmenu[id] = true, clear_clientdata(id)
}

public client_putinserver(id)
{
	if(!g_netclient_pdata) set_task(1.0, "task_netclient_pdata", id)
	if(g_czero && !g_botclient_pdata) set_task(1.0, "task_botclient_pdata", id)
}

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_GIVENADES + id), remove_model(g_modelent[id])
}

public clear_clientdata(id)
{
	g_victim[id] = 0, g_regendelay[id] = 0.0
	g_lastteam[id] = 0, g_weaponent[id] = 0
	g_zombie[id] = false, g_falling[id] = false
}

public remove_model(ent)
{
	static id; id = pev(ent, pev_owner)
	if(pev_valid(ent)) engfunc(EngFunc_RemoveEntity, ent)
	g_modelent[id] = 0
}

public cmd_enablemenu(id)
{	
	if(!get_pcvar_num(cvar_weaponsmenu))
		return PLUGIN_CONTINUE
	
	client_print(id, print_chat, "%L", id, g_showmenu[id] == false ? "MENU_REENABLED" : "MENU_ALENABLED")
	g_showmenu[id] = true

	return PLUGIN_HANDLED_MAIN
}

public cmd_nightvision(id)
	return (!g_zombie[id] && get_pcvar_num(cvar_blocknightvision)) ? PLUGIN_HANDLED : PLUGIN_CONTINUE

public cmd_chooseteam(id)
	return g_zombie[id] ? PLUGIN_HANDLED : PLUGIN_CONTINUE

public cmd_fixradio()
	g_radiofix = true

public cmd_infectuser(id, level, cid)
{
	if(!cmd_access(id, level, cid, 2))
		return PLUGIN_HANDLED_MAIN
	
	static arg1[32], target
	read_argv(1, arg1, 31)
	
	target = cmd_target(id, arg1, 0)
	if(!is_user_alive(target))
	{
		console_print(id, "%L", id, "CMD_INVALIDUSER")
		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_NOTSTARTED")
		return PLUGIN_HANDLED_MAIN
	}
	
	if(!g_zombie[target])
	{
		infect_user(target)
		
		static name[32]; get_user_name(target, name, 31)
		console_print(id, "%L", id, "CMD_INFECTED", name)
	}
	return PLUGIN_HANDLED_MAIN
}

public msg_teaminfo(msgid, dest, id)
{
	id = get_msg_arg_int(1)
	if(is_user_alive(id) || !g_gamestarted)
		return PLUGIN_CONTINUE

	if(g_lastteam[id] == -1)
		return PLUGIN_CONTINUE
	
	static team[4]; get_msg_arg_string(2, team, 3)
	if(team[0] != 'U' || team[1] != 'N' || team[2] != 'A')
		return PLUGIN_CONTINUE

	id = randomly_pick_zombie()
	if(id)
	{
		if(!g_zombie[id])
		{
			infect_user(id)
			
			static name[32]
			get_user_name(id, name, 31)

			set_hudmessage(_, _, _, _, _, 1)
			show_hudmessage(0, "%L", LANG_PLAYER, "INFECTED_HUD", name)
		}
		else
		{
			cs_set_user_team2(id, CS_TEAM_CT)
			set_pev(id, pev_deadflag, DEAD_DISCARDBODY)
		}
		return PLUGIN_HANDLED
	}
	return PLUGIN_CONTINUE
}

public msg_screenfade(msgid, dest, id)
{
	if(!get_pcvar_num(cvar_flashbang) || !is_user_connected(id))
		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_battery(msgid, dest, id)
{
	static armor; armor = get_msg_arg_int(1)
	if(armor > 0)
	{
		if(!is_user_alive(id) || !g_zombie[id])
			return PLUGIN_CONTINUE
		
		static CsArmorType:armortype
		cs_get_user_armor2(id, armortype)
		
		if(armortype != CS_ARMOR_NONE)
			cs_set_user_armor2(id, 0, CS_ARMOR_NONE)
		
		set_msg_arg_int(1, ARG_SHORT, 0)
	}
	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)
{
	if(!is_user_connected(id))
		return PLUGIN_CONTINUE
	
	static icon[8]; get_msg_arg_string(2, icon, 7)
	if(icon[0] == 'c' && icon[1] == '4' || equal(icon, "defuser"))
		return PLUGIN_HANDLED
	
	return PLUGIN_CONTINUE
}

public msg_ammox(msgid, dest, id)
{
	static ammotype; ammotype = get_pcvar_num(cvar_ammo)
	if(!is_user_alive(id) || g_zombie[id] || ammotype != 1)
		return PLUGIN_CONTINUE
	
	static ammoid; ammoid = get_msg_arg_int(1)
	static bammo; bammo = get_msg_arg_int(2)
	
	if(!(AMMOID_NULL & (1<<ammoid)) && bammo != MAX_AMMO)
		set_msg_arg_int(2, ARG_BYTE, MAX_AMMO)

	return PLUGIN_CONTINUE
}

public msg_curweapon(msgid, dest, id)
{
	if(!is_user_alive(id) || !get_msg_arg_int(1))
		return PLUGIN_CONTINUE
	
	static weapon; weapon = get_msg_arg_int(2)
	if(g_zombie[id])
	{
		if(weapon != CSW_KNIFE && !task_exists(TASKID_STRIPNGIVE + id))
			set_task(0.2, "task_stripngive", TASKID_STRIPNGIVE + id)
		
		return PLUGIN_CONTINUE
	}
	else if(AMMOWP_NULL & (1<<weapon)) return PLUGIN_CONTINUE

	static ammotype; ammotype = get_pcvar_num(cvar_ammo)
	if(!ammotype) return PLUGIN_CONTINUE
	
	static max_clip; max_clip = get_weapon_maxclip(weapon)
	switch(ammotype)
	{
		case 1:
		{
			static ammo; ammo = get_user_bpammo(id, weapon)
			if(ammo < max_clip) set_user_bpammo(id, weapon, MAX_AMMO)
		}
		case 2:
		{
			static clip; clip = get_msg_arg_int(3)
			if(clip != max_clip) set_msg_arg_int(3, ARG_BYTE, max_clip)
			
			if(!pev_valid(g_weaponent[id]) || (pev_valid(g_weaponent[id])
			&& cs_get_weapon_id(g_weaponent[id]) != weapon))
			{
				static weaponname[32]; get_weaponname(weapon, weaponname, 31)
				g_weaponent[id] = fm_find_ent_by_owner(-1, weaponname, id)
			}
			
			if(clip < 1 && pev_valid(g_weaponent[id]))
				set_weapon_ammo(g_weaponent[id], max_clip)
		}
	}
	return 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)
{
	static audiocode [22]; get_msg_arg_string(2, audiocode, 21)
	if(equal(audiocode[7], "MOVEOUT") || equal(audiocode[7], "LOCKNLOAD")
	|| equal(audiocode[7], "LETSGO")  || (equal(audiocode[7], "GO") && !g_radiofix))
		set_msg_arg_string(2, "%!MRAD_ELIM"), g_radiofix = false

	else if(equal(audiocode[7], "terwin") && get_pcvar_num(cvar_winsounds))
		set_msg_arg_string(2, g_zombie_win_sounds[_random(sizeof g_zombie_win_sounds)])
	
	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_ZOMBIES")
		set_msg_arg_string(2, winmsg)
		
		g_winningteam = CS_TEAM_T
	}
	else if(equal(txtmsg[1], "Target_Saved") || equal(txtmsg[1], "CTs_Win"))
	{
		formatex(winmsg, 31, "%L", LANG_SERVER, "WIN_SURVIVORS")
		set_msg_arg_string(2, winmsg)
		
		g_winningteam = CS_TEAM_CT
	}
	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(pev_valid(ent))
	{
		static model[64]
		pev(ent, pev_model, model, 63)	
		set_msg_arg_string(1, model)
	}
	return PLUGIN_CONTINUE
}

public logevent_round_start()
{
	g_roundstarted = true
	if(get_pcvar_num(cvar_weaponsmenu))
	{
		static id, CsTeams:team
		for(id = 1; id <= g_maxplayers; id++) if(is_user_alive(id))
		{
			team = cs_get_user_team(id)
			if(team == CS_TEAM_T || team == CS_TEAM_CT)
				g_showmenu[id] == true ? menu_display(id, g_equipmenu, 0) : equipweapon(id, EQUIP_ALL)
		}
	}
}

public logevent_round_end()
{
	g_gamestarted = false, g_roundstarted = false
	remove_task(TASKID_BALANCETEAM), remove_task(TASKID_STARTROUND)
	set_task(1.5, "task_balanceteam", TASKID_BALANCETEAM)
	
	if(g_winningteam > CS_TEAM_UNASSIGNED)
	{
		ExecuteForward(g_fwd_teamwin, g_fwd_result, g_winningteam)
		g_winningteam = CS_TEAM_UNASSIGNED
	}
}

public event_textmsg()
{
	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()
{
	static buytime; buytime = get_pcvar_num(cvar_buytime)
	if(buytime) g_buytime = buytime + get_gametime()
	
	g_gamestarted = false, g_roundstarted = false
	remove_task(TASKID_NEWROUND), remove_task(TASKID_STARTROUND)
	
	set_task(0.1, "task_newround", TASKID_NEWROUND)
	set_task(get_pcvar_float(cvar_starttime), "task_startround", TASKID_STARTROUND)
}

public event_damage(victim)
{
	if(!is_user_alive(victim) || !g_gamestarted)
		return PLUGIN_CONTINUE
	
	if(g_zombie[victim])
	{
		g_regendelay[victim] = get_gametime() + get_pcvar_float(cvar_regen_dly1)
		return PLUGIN_CONTINUE
	}
	
	static attacker; attacker = get_user_attacker(victim)
	if(!is_user_alive(attacker) || !g_zombie[attacker] || g_infecting)
		return PLUGIN_CONTINUE
	
	g_infecting = true
	if(g_victim[attacker] == victim)
	{
		static Float:frags; pev(attacker, pev_frags, frags)
		static deaths; deaths = cs_get_user_deaths(victim)
		set_pev(attacker, pev_frags, frags  + 1.0)
		set_user_deaths(victim, deaths + 1)
					
		static _msg_deathmsg
		if(!_msg_deathmsg) _msg_deathmsg = get_user_msgid("DeathMsg")
		
		message_begin(MSG_ALL, _msg_deathmsg)
		write_byte(attacker)
		write_byte(victim)
		write_byte(0)
		write_string("infection")
		message_end()
					
		infect_user(victim)
		ExecuteForward(g_fwd_infect, g_fwd_result, attacker, victim)

		static params[2]; params[0] = attacker, params[1] = victim
		set_task(0.2, "task_updatescore", TASKID_UPDATESCR, params, 2)
		
		g_victim[attacker] = 0
	}
	g_infecting = false
	
	return PLUGIN_CONTINUE
}

public fwd_emitsound(id, channel, sample[], Float:volume, Float:attn, flag, pitch)
{	
	if(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' && get_pcvar_num(cvar_customsounds))
	{
		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_playerprethink(id)
{
	if(!is_user_alive(id))
		return FMRES_IGNORED
	
	static flag; flag = pev(id, pev_flags)
	if(get_pcvar_num(cvar_zombie_resist))
	{
		if(flag & FL_ONGROUND)
		{
			pev(id, pev_velocity, g_vecvel)
			g_brestorevel = true
		}
	}

	if(g_zombie[id])
	{
		if(!(flag & FL_ONGROUND))
		{
			static Float:fallvelocity; pev(id, pev_flFallVelocity, fallvelocity)
			g_falling[id] = fallvelocity >= 350.0 ? true : false
		}
		
		if(get_pcvar_num(cvar_zombie_regen))
		{
			static Float:health; pev(id, pev_health, health)
			static Float:zombiehp; zombiehp = float(get_pcvar_num(cvar_zombie_hp))
			if(health < zombiehp)
			{
				static Float:gametime; gametime = get_gametime()
				if(g_regendelay[id] < gametime)
				{
					set_pev(id, pev_health, health + 1.0)
					g_regendelay[id] = gametime + get_pcvar_float(cvar_regen_dly2)
				}
			}
		}
		
		static ent; ent = g_modelent[id]
		if(pev_valid(ent))
		{
			if(!(pev(ent, pev_effects) & EF_NODRAW))
			{
				if(pev(id, pev_rendermode) != kRenderTransTexture)
					set_pev(id, pev_rendermode, kRenderTransTexture)
				
				if(pev(id, pev_renderamt) != 0.0)
					set_pev(id, pev_renderamt, 0.0)
			}
		}
	}
	return FMRES_IGNORED
}

public fwd_playerprethink_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_zombie[id]) 
		{
			static Float:health; pev(id, pev_health, health)
			static Float:kbhp; kbhp = float(get_pcvar_num(cvar_knockback_hp))
			if(get_pcvar_num(cvar_knockback_duck))
			{
				if(pev(id, pev_flags) & FL_DUCKING)
					set_pev(id, pev_velocity, g_vecvel)
				else if(health > kbhp) 
					set_pev(id, pev_velocity, g_vecvel)
			}
			else if(health > kbhp) set_pev(id, pev_velocity, g_vecvel)
		}
		return FMRES_HANDLED
	}
	return FMRES_IGNORED
}

public fwd_playerpostthink(id)
{ 
	if(!is_user_alive(id)) 
		return FMRES_IGNORED
	
	if(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(g_buytime > get_gametime() && pev_valid(g_buyzone) && !g_zombie[id])
			dllfunc(DLLFunc_Touch, g_buyzone, id)
	}
	return FMRES_IGNORED
}
	
public fwd_spawn(ent)
{
	if(!pev_valid(ent)) 
		return FMRES_IGNORED
	
	static objective_ents[][] = 
	{ 
		"func_bomb_target",    "info_bomb_target", 
		"hostage_entity",      "monster_scientist", 
		"func_hostage_rescue", "info_hostage_rescue",
		"info_vip_start",      "func_vip_safetyzone", 
		"func_escapezone"
	}

	static classname[32], i
	pev(ent, pev_classname, classname, 31)
	
	if(equal(classname, "func_buyzone"))
	{
		set_pev(ent, pev_solid, SOLID_NOT)
		return FMRES_SUPERCEDE
	}
	
	for(i = 0; i < sizeof objective_ents; ++i)
	{
		if(equal(classname, objective_ents[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_traceline_post(Float:start[3], Float:end[3], nomonsters, id, trace)
{
	if(!is_player_alive(id) || g_gamestarted)
		return FMRES_IGNORED
	
	static target; target = get_tr2(trace, TR_pHit)
	if(is_player_alive(target))
		set_tr2(trace, TR_flFraction, 1.0)

	return FMRES_IGNORED
}

public fwd_tracehull_post(Float:start[3], Float:end[3], nomonsters, hull, id, trace)
{
	if(!is_player_alive(id) || g_gamestarted)
		return FMRES_IGNORED

	static target; target = get_tr2(trace, TR_pHit)
	if(is_player_alive(target))
		set_tr2(trace, TR_flFraction, 1.0)
	
	return FMRES_IGNORED
}

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_sys_error()
	destroyforwards()

public bacon_item_attachtoplayer_post(ent, id)
{
	if(is_user_alive(id) && g_zombie[id])
		weapon_deployed(id)
}

public bacon_item_deploy_post(ent)
{
	static id; id = pev(ent, pev_owner)
	if(is_user_alive(id) && g_zombie[id])
		weapon_deployed(id)
}

public weapon_deployed(id)
{
	set_pev(id, pev_weaponmodel2, "")
	if(g_usingknifemodel) 
		set_pev(id, pev_viewmodel2, g_zombie_claws)
	
	set_pev(id, pev_maxspeed, get_pcvar_float(cvar_zombie_spd))
}

public bacon_use(ent, caller, activator, use_type, Float:value)
	return (use_type == 2 && is_player_alive(caller) && g_zombie[caller]) ? HAM_SUPERCEDE : HAM_IGNORED

public bacon_takedamage(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]))
	{
		SetHamParamFloat(4, 0.0)
		return HAM_HANDLED
	}
	
	static CsTeams:team[2]
	team[0] = cs_get_user_team(attacker), team[1] = cs_get_user_team(victim)
	
	if(team[0] == team[1])
		return HAM_IGNORED
	
	if(!g_zombie[attacker])
	{
		damage *= (damagetype & DMG_HEGRENADE) ? get_pcvar_float(cvar_hedmg_multi) : get_pcvar_float(cvar_zombie_def)
		SetHamParamFloat(4, damage)

		return HAM_HANDLED
	}
	else 
	{
		if((damagetype & DMG_HEGRENADE) || get_user_weapon(attacker) != CSW_KNIFE)
			SetHamParamFloat(4, 0.0)
		else
		{
			static bool:infect; infect = allow_infection()
			if(!get_pcvar_num(cvar_zombie_instant))
			{
				static Float:health; pev(victim, pev_health, health)
				if(health > damage)  infect = false
			}   	else if(g_infecting) infect = false
			g_victim[attacker] = infect ? victim : 0
			damage *= get_pcvar_float(cvar_zombie_atk)
			SetHamParamFloat(4, infect ? 0.0 : damage)
		}
		return HAM_HANDLED
	}
	return HAM_IGNORED
}

public bacon_spawn_post(id) if(is_user_alive(id))
{
	if(g_zombie[id])
	{
		clear_clientdata(id), reset_user_model(id)
		if(g_usingknifemodel)
		{
			static viewmodel[32]; pev(id, pev_viewmodel2, viewmodel, 31)
			if(equal(viewmodel, g_zombie_claws)) set_pev(id, pev_viewmodel2, KNIFE_MODEL)
		}
	}
	set_task(0.3, "task_spawned", TASKID_SPAWNDELAY + id)
}

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

public task_spawned(taskid)
{
	static id; id = taskid - TASKID_SPAWNDELAY
	if(is_user_alive(id))
	{
		if(pev(id, pev_body)) set_pev(id, pev_body, 0)
		
		if(g_gamestarted)
		{
			static CsTeams:team; team = cs_get_user_team(id)
			if(team == CS_TEAM_T) cs_set_user_team2(id, CS_TEAM_CT)
		}
		
		if(get_pcvar_num(cvar_weaponsmenu) && g_roundstarted && g_showmenu[id])
			menu_display(id, g_equipmenu, 0)
	}
}

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

public task_setzombie(taskid)
{
	static id; id = taskid - TASKID_SETZOMBIE
	set_zombie_attibutes(id)
}

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 = cs_get_user_deaths(attacker)
	team   = get_user_team(attacker)
	
	static msg_scoreinfo
	if(!msg_scoreinfo) msg_scoreinfo = get_user_msgid("ScoreInfo")
	
	message_begin(MSG_ALL, 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 = cs_get_user_deaths(victim)
	team   = get_user_team(victim)
	
	message_begin(MSG_ALL, msg_scoreinfo)
	write_byte(victim)
	write_short(frags)
	write_short(deaths)
	write_short(0)
	write_short(team)
	message_end()
}

public task_stripngive(taskid)
{
	static id; id = taskid - TASKID_STRIPNGIVE
	if(is_user_alive(id))
	{
		fm_strip_user_weapons(id), reset_user_primary(id)
		bacon_give_weapon(id, "weapon_knife")
	}
}

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

	newzombie = players[_random(num)]
	if(num > 2 && is_user_connected(g_zombieoftheround))
	{
		while(g_zombieoftheround == newzombie)
			newzombie = players[_random(num)]
	}
	g_zombieoftheround = newzombie

	for(i = 0; i < num; i++)
	{
		id = players[i]
		client_print(id, print_chat, "%L %L", id, "SCAN_RESULTS", id, g_zombieoftheround == id ? "SCAN_INFECTED" : "SCAN_CLEAN")
	}
	
	if(get_pcvar_num(cvar_randomspawn))
		randomly_place_everyone()
}

public task_startround()
{
	static players[32], num, i, id, newzombie
	get_players(players, num, "a")
	
	if(num > 2 && !is_user_alive(g_zombieoftheround))
	{
		newzombie = players[_random(num)]
		while(g_zombieoftheround == newzombie)
			newzombie = players[_random(num)]
		
		g_zombieoftheround = newzombie
	}
	
	if(!g_zombieoftheround) return
	
	for(i = 0; i < num; i++)
	{
		id = players[i]
		id == g_zombieoftheround ? infect_user(id) : cs_set_user_team2(id, CS_TEAM_CT)
	}
	
	static name[32]
	get_user_name(g_zombieoftheround, name, 31)

	set_hudmessage(_, _, _, _, _, 1)
	show_hudmessage(0, "%L", LANG_PLAYER, "INFECTED_HUD", name)
	client_print(0, print_chat, "%L", LANG_PLAYER, "INFECTED_TXT", name)
	
	g_gamestarted = true, ExecuteForward(g_fwd_gamestart, g_fwd_result)
}

public task_balanceteam()
{
	static players[CsTeams:3][32], count[CsTeams:3], i, id, CsTeams:team
	get_players(players[CS_TEAM_UNASSIGNED], count[CS_TEAM_UNASSIGNED])
	count[CS_TEAM_T] = 0, count[CS_TEAM_CT] = 0
	
	for(i = 0; i < count[CS_TEAM_UNASSIGNED]; i++)
	{
		id = players[CS_TEAM_UNASSIGNED][i], team = cs_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++)
			cs_set_user_team(players[CS_TEAM_T][i], CS_TEAM_CT)
	}
	else
	{
		for(i = 0; i < (count[CS_TEAM_CT] - maxplayers); i++)
			cs_set_user_team(players[CS_TEAM_CT][i], CS_TEAM_T)
	}
}

public task_givenades(taskid)
{
	static id, i; id = taskid - TASKID_GIVENADES
	if(is_user_alive(id) && (strlen(g_grenades[0]) > 0))
	{
		for(i = 0; i < sizeof g_grenades; i++)
			bacon_give_weapon(id, g_grenades[i])
	}
}

public task_netclient_pdata(id) if(!g_netclient_pdata && is_user_connected(id))
{
	if(!g_czero || !(pev(id, pev_flags) & FL_FAKECLIENT) || !get_pcvar_num(cvar_botquota))
		pdata_init(id), g_netclient_pdata = 1
}

public task_botclient_pdata(id) if(!g_botclient_pdata && is_user_connected(id))
{
	if((pev(id,pev_flags) & FL_FAKECLIENT) && get_pcvar_num(cvar_botquota))
		pdata_init(id), g_botclient_pdata = 1
}

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

	static _msg_scoreattrib
	if(!_msg_scoreattrib) _msg_scoreattrib = get_user_msgid("ScoreAttrib")
	
	message_begin(MSG_ALL, _msg_scoreattrib)
	write_byte(id)
	write_byte(0)
	message_end()
	
	static sound; sound = _random(sizeof g_scream_sounds)
	emit_sound(id, CHAN_STATIC, g_scream_sounds[sound], VOL_NORM, ATTN_NONE, 0, PITCH_NORM)
	
	menu_cancel(id), cs_set_user_team2(id, CS_TEAM_T)
	set_task(0.1, "task_setzombie", TASKID_SETZOMBIE + id)
}

public menu_equip(id, menu, item)
{
	if(item < 0) return PLUGIN_CONTINUE
	
	static cmd[2], name[64], access, callback, key
	menu_item_getinfo(menu, item, access, cmd, 1, name, 63, callback), key = str_to_num(cmd)
	
	switch(key)
	{
		case 1: menu_display(id, g_primmenu, 0)
		case 2: (g_weapons[id][0] > 0) ? equipweapon(id, EQUIP_ALL) : menu_display(id, g_primmenu, 0)
		case 3:
		{
			if(g_weapons[id][0] > 0)
			{
				g_showmenu[id] = false
				client_print(id, print_chat, "%L", id, "MENU_CMDENABLE")
				equipweapon(id, EQUIP_ALL)
			}
			else    menu_display(id, g_primmenu, 0)
		}
	}
	return PLUGIN_HANDLED
}

public menu_prim(id, menu, item)
{
	if(item < 0) return PLUGIN_HANDLED
	
	static cmd[6], name[64], access, callback
	menu_item_getinfo(menu, item, access, cmd, 5, name, 63, callback)
	
	g_weapons[id][0] = str_to_num(cmd)
	equipweapon(id, EQUIP_PRI)
	menu_display(id, g_secmenu, 0)

	return PLUGIN_HANDLED
}

public menu_sec(id, menu, item)
{
	if(item < 0) return PLUGIN_HANDLED
	
	static cmd[6], name[64], access, callback
	menu_item_getinfo(menu, item, access, cmd, 5, name, 63, callback)
	
	g_weapons[id][1] = str_to_num(cmd)
	equipweapon(id, EQUIP_SEC)
	equipweapon(id, EQUIP_GREN)

	return PLUGIN_HANDLED
}

public randomly_place_everyone()
{
	if(g_spawncount <= 0) return
	
	static players[32], num, id, i, CsTeams:team
	get_players(players, num, "a")

	for(i = 0; i < num; i++)
	{
		id = players[i]
		team = cs_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 get_spawnpoints()
{
	static configdir[32]; get_configsdir(configdir, 31)
	static mapname[32]; get_mapname(mapname, 31)
	
	static csdmfile[64], line[64], data[10][6]
	formatex(csdmfile, 63, "%s/csdm/%s.spawns.cfg", configdir, mapname)

	if(file_exists(csdmfile))
	{
		static 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 native_is_user_zombie(plugin, params)
{
	if(params != 1) return 0
		
	static index; index = get_param(1)
	if(!index) return 0
	
	return g_zombie[index] == true ? 1 : 0
}

public native_infect_user(plugin, params)
{
	if(params != 1) return 0
		
	static index; index = get_param(1)
	if(is_user_alive(index) && allow_infection() && g_gamestarted)
	{
		infect_user(index)
		return 1
	}
	return 0
}

public native_is_user_firstzombie(plugin, params)
{
	if(params != 1) return 0
		
	static index; index = get_param(1)
	return index == g_zombieoftheround ? 1 : 0
}

public native_first_zombie(plugin)
	return g_zombieoftheround

public native_game_started(plugin)
	return g_gamestarted

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 cs_set_user_team2(index, {CsTeams,_}:team, update = 1)
{
	set_pdata_int(index, OFFSET_TEAM, _:team)
	set_pev(index, pev_team, _:team)

	if(update)
	{
		static _msg_teaminfo; if(!_msg_teaminfo) _msg_teaminfo = get_user_msgid("TeamInfo")
		static teaminfo[][] = { "UNASSIGNED", "TERRORIST", "CT", "SPECTATOR" }
		
		message_begin(MSG_ALL, _msg_teaminfo)
		write_byte(index)
		write_string(teaminfo[_:team])
		message_end()
	}
	return 1
}

stock cs_get_user_armor2(index, &CsArmorType:armortype)
{
	static armorvalue; pev(index, pev_armorvalue, armorvalue)
	armortype = CsArmorType:get_pdata_int(index, OFFSET_ARMOR)
	
	return armorvalue
}

stock cs_set_user_armor2(index, armorvalue, CsArmorType:armortype)
{
	set_pev(index, pev_armorvalue, armorvalue)
	set_pdata_int(index, OFFSET_ARMOR, _:armortype)
	
	return 1
}

stock get_weapon_maxclip(weapon) 
{
	static ammo
	switch(weapon)
	{
		case CSW_P228: 			 ammo = 13
		case CSW_GALI: 			 ammo = 35
		case CSW_USP: 			 ammo = 12
		case CSW_M249: 			 ammo = 100
		case CSW_M3: 			 ammo = 8
		case CSW_P90: 			 ammo = 50
		case CSW_SCOUT, CSW_AWP: 	 ammo = 10
		case CSW_XM1014, CSW_DEAGLE:	 ammo = 7
		case CSW_UMP45, CSW_FAMAS:	 ammo = 25
		case CSW_FIVESEVEN, CSW_GLOCK18, 
		CSW_G3SG1:			 ammo = 20
		case CSW_KNIFE, CSW_FLASHBANG, 
		CSW_SMOKEGRENADE, CSW_HEGRENADE, 
		CSW_C4:				 ammo = 0
		case CSW_SG552, CSW_AK47,
		CSW_MP5NAVY, CSW_M4A1, 
		CSW_MAC10, CSW_SG550, 
		CSW_AUG, CSW_ELITE, CSW_TMP:	 ammo = 30
		default:			 ammo = 0
	}
	return ammo
}

stock get_user_bpammo(index, weapon)
{
	static offset
	switch(weapon)
	{
		case CSW_AWP:   		     offset = OFFSET_AMMO_AWP
		case CSW_SCOUT, CSW_AK47, CSW_G3SG1: offset = OFFSET_AMMO_SCOUT
		case CSW_M249:  		     offset = OFFSET_AMMO_M249
		case CSW_FAMAS, CSW_M4A1, CSW_AUG, 
		CSW_SG550, CSW_GALI, CSW_SG552:	     offset = OFFSET_AMMO_FAMAS
		case CSW_M3, CSW_XM1014:	     offset = OFFSET_AMMO_M3
		case CSW_USP, CSW_UMP45, CSW_MAC10:  offset = OFFSET_AMMO_USP
		case CSW_FIVESEVEN, CSW_P90:	     offset = OFFSET_AMMO_FIVESEVEN
		case CSW_DEAGLE:		     offset = OFFSET_AMMO_DEAGLE
		case CSW_P228:			     offset = OFFSET_AMMO_P228
		case CSW_GLOCK18, CSW_TMP, CSW_ELITE, 
		CSW_MP5NAVY:			     offset = OFFSET_AMMO_GLOCK18
		default:			     offset = 0
	}
	return offset ? get_pdata_int(index, offset) : 0
}

stock set_user_bpammo(index, weapon, amount)
{
	static offset
	switch(weapon)
	{
		case CSW_AWP:   		     offset = OFFSET_AMMO_AWP
		case CSW_SCOUT, CSW_AK47, CSW_G3SG1: offset = OFFSET_AMMO_SCOUT
		case CSW_M249:  		     offset = OFFSET_AMMO_M249
		case CSW_FAMAS, CSW_M4A1, CSW_AUG, 
		CSW_SG550, CSW_GALI, CSW_SG552:	     offset = OFFSET_AMMO_FAMAS
		case CSW_M3, CSW_XM1014:	     offset = OFFSET_AMMO_M3
		case CSW_USP, CSW_UMP45, CSW_MAC10:  offset = OFFSET_AMMO_USP
		case CSW_FIVESEVEN, CSW_P90:	     offset = OFFSET_AMMO_FIVESEVEN
		case CSW_DEAGLE:		     offset = OFFSET_AMMO_DEAGLE
		case CSW_P228:			     offset = OFFSET_AMMO_P228
		case CSW_GLOCK18, CSW_TMP, CSW_ELITE, 
		CSW_MP5NAVY:			     offset = OFFSET_AMMO_GLOCK18
		default:			     offset = 0
	}
	
	if(offset) set_pdata_int(index, offset, amount)
	
	return 1
}

stock set_user_nvg(index)
{
	static nvg; nvg = get_pdata_int(index, OFFSET_NVG)
	if(!(nvg & HAS_NVG))
	{
		nvg |= HAS_NVG
		set_pdata_int(index, OFFSET_NVG, nvg)
	}
	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)
		set_pev(g_modelent[index], pev_movetype, MOVETYPE_NONE)
		set_pev(g_modelent[index], pev_aiment, 0)
	}
}

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

	cs_set_user_armor2(index, 0, CS_ARMOR_NONE), set_pev(index, pev_body, 0), g_zombie[index] = true
	
	if(!task_exists(TASKID_STRIPNGIVE + index))
		set_task(0.2, "task_stripngive", TASKID_STRIPNGIVE + index)
	
	if(g_usingplayermodel)
	{
		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_zombie_model)
				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
		{
			fm_set_entity_visibility(g_modelent[index], 1)
			set_pev(g_modelent[index], pev_movetype, MOVETYPE_FOLLOW)
			set_pev(g_modelent[index], pev_aiment, index)
		}
	}

	static Float:health; health = float(get_pcvar_num(cvar_zombie_hp))
	static Float:bonus; bonus = float(get_pcvar_num(cvar_hpbonus))
	set_pev(index, pev_health, g_zombieoftheround == index ? health + bonus : health)
	
	set_user_nvg(index)
	if(get_pcvar_num(cvar_autonvg)) engclient_cmd(index, "nightvision")
	
	static effects; effects = pev(index, pev_effects)
	if(effects & EF_DIMLIGHT)
	{
		static msg_flashlight
		if(!msg_flashlight) msg_flashlight = get_user_msgid("Flashlight")
		
		message_begin(MSG_ONE, msg_flashlight, _, index)
		write_byte(0)
		write_byte(100)
		message_end()
	
		set_pev(index, pev_effects, effects & ~EF_DIMLIGHT)
	}
	ExecuteForward(g_fwd_infect2, g_fwd_result, index)
}

stock bool:allow_infection()
{
	static index, count[2], maxzombies; count[0] = 0, count[1] = 0
	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 index, players[2][32], data[4]
	data[0] = 0, data[1] = 0, data[2] = 0, data[3] = 0
	
	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] > 1 &&  data[1] < 1) return players[0][_random(data[2])]
	return (data[0] < 1 && data[1] > 1) ?  players[1][_random(data[3])] : 0
}

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

	static weaponid
	
	if(weapon & EQUIP_PRI)
	{
		fm_strip_user_weapons(id), bacon_give_weapon(id, "weapon_knife")
		bacon_give_weapon(id, g_primweaponnames[g_weapons[id][0]])
		
		weaponid = get_weaponid(g_primweaponnames[g_weapons[id][0]])
		set_user_bpammo(id, weaponid, MAX_AMMO)
	}
	
	if(weapon & EQUIP_SEC)
	{
		bacon_give_weapon(id, g_secweaponnames[g_weapons[id][1]])
			
		weaponid = get_weaponid(g_secweaponnames[g_weapons[id][1]])
		set_user_bpammo(id, weaponid, MAX_AMMO)
	}
	
	if(weapon & EQUIP_GREN)
		set_task(0.1, "task_givenades", id + TASKID_GIVENADES)
}
Mobile Legends BANG BANG!
- Nick: Marksman <GX>
- Add me for RANKS
!

Заключено
  • Подобни теми
    Отговори
    Преглеждания
     Последно мнение

Обратно към “Помощ в скриптирането”

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 4 госта