Thread: Help
View Single Post
Author Message
n3sS
New Member
Join Date: Jul 2017
Old 07-27-2017 , 04:09   Help
Reply With Quote #1

in enghlish please ! and test it afther whit compiler
Code:
#include <amxmodx>
#include <amxmisc>
#include <engine>
#include <fakemeta>
#include <fakemeta_util>
#include <hamsandwich>
#include <WPMGPrintChatColor>

#define PLUGIN "Worms Presents Style"
#define VERSION "0.7"
#define AUTHOR "Psycrow"

#define SPAWN_MODEL 		"models/next21_worms_style/target.mdl"
#define PARACHUTE_MODEL		"models/next21_worms_style/parachute.mdl"
#define BOX_MODEL 		"models/next21_worms_style/box.mdl"

#define FALL_SOUND		"next21_worms_style/box_fall.wav"
#define CREATE_SOUND		"next21_worms_style/box_create.wav"
#define PICKUP_SOUND		"next21_worms_style/box_pickup.wav"

#define SPAWN_CLASS		"worms_spawn_box"
#define PBOX_CLASS		"worms_parachute_box"
#define BOX_CLASS		"worms_box"

#define TASK_FIXOIGIN		200
#define	TASK_FIXMULTITRACES	400

#define pev_notrace		pev_euser1
#define pev_lifes		pev_euser2

static
	Array:g_wb_id,
	Array:g_wb_origin_x,
	Array:g_wb_origin_y,
	Array:g_wb_origin_z,
	Array:g_steam_ids, // steam_id ,  
	Array:g_weapon_list,
	Array:g_weapon_ammo_list,
	Array:g_utilities_list,
	ExplosionMdl,
	SmokeMdl

new	
	bool: g_save_cpl,
	bool: is_spawns_visible,
	bool: g_ham_reg,
	g_round_times[33],
	g_game_times[33]


public plugin_precache()
{
	precache_model(SPAWN_MODEL)
	precache_model(PARACHUTE_MODEL)
	precache_model(BOX_MODEL)
	
	precache_sound(FALL_SOUND)
	precache_sound(CREATE_SOUND)
	precache_sound(PICKUP_SOUND)
	
	ExplosionMdl = precache_model("sprites/zerogxplode.spr")
	SmokeMdl = precache_model("sprites/steam1.spr")
}

public plugin_init()
{
	register_plugin(PLUGIN, VERSION, AUTHOR)
	
	register_cvar("cv_spawnbox_timerate","60.0")
	register_cvar("cv_box_lifes","0")
	register_cvar("cv_wb_times_round", "0")
	register_cvar("cv_wb_times_game", "0")
	register_cvar("cv_wb_solid", "1")
	
	register_cvar("cv_box_health", "1")
	register_cvar("cv_box_health_value", "50")
	register_cvar("cv_box_ammo", "1")
	register_cvar("cv_box_utilities", "1")
	
	if(!get_cvar_num("cv_box_health") && !get_cvar_num("cv_box_ammo") && !get_cvar_num("cv_box_utilities"))
		return
	
	register_clcmd( "say /wb_spawn_menu", "spawn_menu", ADMIN_IMMUNITY)
	register_clcmd( "say_team /wb_spawn_menu", "spawn_menu", ADMIN_IMMUNITY)
		
	g_wb_id = ArrayCreate()
	g_wb_origin_x = ArrayCreate()
	g_wb_origin_y = ArrayCreate()
	g_wb_origin_z = ArrayCreate()
	
	if(get_cvar_num("cv_box_ammo")) 
	{	
		g_weapon_list = ArrayCreate(32)
		g_weapon_ammo_list = ArrayCreate()
	}
	
	if(get_cvar_num("cv_box_utilities")) g_utilities_list = ArrayCreate(32)
	if(get_cvar_num("cv_wb_times_game")) g_steam_ids = ArrayCreate(32)
	
	new const szEntity[][] = 
	{
		"worldspawn", "func_wall", "func_door",  "func_door_rotating",
		"func_wall_toggle", "func_breakable", "func_pushable", "func_train",
		"func_illusionary", "func_button", "func_rot_button", "func_rotating", BOX_CLASS
	}
    
	for(new i; i<sizeof szEntity; i++)
	{
		register_touch(BOX_CLASS, szEntity[i], "fw_box_touch_world")
		register_touch(PBOX_CLASS, szEntity[i], "fw_pbox_touch_world")
	}
	register_touch(BOX_CLASS, "player", "fw_box_touch_player")
	register_touch(PBOX_CLASS, "player", "fw_box_touch_player")
	
	register_logevent("NewRound", 2, "1=Round_Start")
	
	set_task(get_cvar_float("cv_spawnbox_timerate"), "create_box_pre", _, _, _, "b")
	get_maps_cfg()
	
	if(get_cvar_num("cv_box_ammo")) get_weapon_list()
	if(get_cvar_num("cv_box_utilities")) get_utilities_list()
}

public get_maps_cfg()
{
	new map[32]
	get_mapname(map, charsmax(map))
	formatex(map, charsmax(map),"%s.ini",map)
	
	new cfgDir[64], i_Dir, i_File[128]
	get_configsdir(cfgDir, charsmax(cfgDir))
	formatex(cfgDir, charsmax(cfgDir), "%s/next21_worms_boxes", cfgDir)
	
	i_Dir = open_dir(cfgDir, i_File, charsmax(i_File))
	
	if(i_Dir)
	{
		while(next_file(i_Dir, i_File, charsmax(i_File)))
		{
			if (i_File[0] == '.')
				continue
				
			if(equal(map, i_File))
			{
				format(i_File,128,"%s/%s",cfgDir, i_File)
				get_spawns(i_File)
				break
			}
		}
	}
	else server_print("[%s] Spawns was not loaded", PLUGIN)
}

public set_maps_cfg()
{
	new map[32]
	get_mapname(map, charsmax(map))
	formatex(map, charsmax(map),"%s.ini",map)
	
	new cfgDir[64], i_File[128]
	get_configsdir(cfgDir, charsmax(cfgDir))
	formatex(cfgDir, charsmax(cfgDir), "%s/next21_worms_boxes", cfgDir)
	formatex(i_File, charsmax(i_File),"%s/%s",cfgDir, map)
	
	if(!dir_exists(cfgDir))
		if(mkdir(cfgDir))
			return
	
	delete_file(i_File)
	
	static spawn_count; spawn_count = ArraySize(g_wb_id)
	if(!spawn_count)
		return
	
	for(new i=0; i<spawn_count; i++)
	{
		new text[128], Float:fOrigin[3], ent = ArrayGetCell(g_wb_id, i)
		drop_to_floor(ent)
		pev(ent, pev_origin, fOrigin)
		format(text, charsmax(text),"^"%f^" ^"%f^" ^"%f^"",fOrigin[0], fOrigin[1], fOrigin[2])
		write_file(i_File, text, i) 
	}
}

public get_spawns(i_File[128])
{	
	new file = fopen(i_File,"rt")
	
	if(!file)
	{
		server_print("[%s] Spawns was not loaded", PLUGIN)
		return
	}
	
	while(file && !feof(file))
	{
		new sfLineData[512]
		fgets(file, sfLineData, charsmax(sfLineData))
			
		if(sfLineData[0] == ';')
			continue
			
		if(equal(sfLineData,""))
			continue	
			
		new i_origins[3][32], Float: fOrigins[3]		
		parse(sfLineData, i_origins[0], 31, i_origins[1], 31, i_origins[2], 31)
		
		fOrigins[0] = str_to_float(i_origins[0])
		fOrigins[1] = str_to_float(i_origins[1])
		fOrigins[2] = str_to_float(i_origins[2])
		
		create_spawn(fOrigins)
	}
	
	fclose(file)
	
	if(!ArraySize(g_wb_id))
		server_print("[%s] Spawns was not loaded", PLUGIN)
	else if(ArraySize(g_wb_id) == 1)
		server_print("[%s] Loaded one spawn", PLUGIN)
	else
		server_print("[%s] Loaded %d spawns", PLUGIN, ArraySize(g_wb_id))
}

public get_weapon_list()
{
	new cfgDir[64], i_File[128]
	get_configsdir(cfgDir, charsmax(cfgDir))
	formatex(i_File, charsmax(i_File), "%s/next21_worms_boxes/lists/weapon_list.ini", cfgDir)
	
	new file = fopen(i_File,"rt")
	
	if(!file)
		return
		
	while(file && !feof(file))
	{
		new sfLineData[512]
		fgets(file, sfLineData, charsmax(sfLineData))
			
		if(sfLineData[0] == ';')
			continue
			
		if(equal(sfLineData,""))
			continue	
			
		new weapon_name[32], weapon_ammo[8]
		parse(sfLineData, weapon_name, charsmax(weapon_name), weapon_ammo, charsmax(weapon_ammo))
		ArrayPushString(g_weapon_list, weapon_name)
		ArrayPushCell(g_weapon_ammo_list, str_to_num(weapon_ammo))
	}
	
	fclose(file)
}

public get_utilities_list()
{
	new cfgDir[64], i_File[128]
	get_configsdir(cfgDir, charsmax(cfgDir))
	formatex(i_File, charsmax(i_File), "%s/next21_worms_boxes/lists/utilities_list.ini", cfgDir)
	
	new file = fopen(i_File,"rt")
	
	if(!file)
		return
		
	while(file && !feof(file))
	{
		new sfLineData[512]
		fgets(file, sfLineData, charsmax(sfLineData))
			
		if(sfLineData[0] == ';')
			continue
			
		if(equal(sfLineData,""))
			continue	
			
		new utility_name[32]
		parse(sfLineData, utility_name, charsmax(utility_name))
		ArrayPushString(g_utilities_list, utility_name)
	}
	
	fclose(file)
}

public spawn_menu(id)
{
	
	/*if(!is_user_access(id))
	{
		PrintChatColor(id, PRINT_COLOR_PLAYERTEAM, "!g[%s] !tУ вас нет прав на эту функцию", PLUGIN) 
		return PLUGIN_HANDLED
	}*/
	
	is_spawns_visible = true

	new menu_name[128]
	static spawn_count; spawn_count = ArraySize(g_wb_id)
	format(menu_name, charsmax(menu_name), "\r*асстановка спаунов для ящиков^n\dТекущий спаун: %d", spawn_count+1)

	new i_menu = menu_create(menu_name, "menu_handler")
	
	menu_additem(i_menu, "\wУстановить спаун", "1", 0)
		
	if(!spawn_count)
	{
		menu_additem(i_menu, "\dУдалить предыдущий спаун", "2", 0)
		menu_additem(i_menu, "\dУдалить все спауны", "3", 0)
		menu_additem(i_menu, "\dСбросить все ящики", "4", 0)
	}
	else
	{
		menu_additem(i_menu, "\wУдалить предыдущий спаун", "2", 0)
		menu_additem(i_menu, "\wУдалить все спауны", "3", 0)	
		menu_additem(i_menu, "\wСбросить все ящики", "4", 0)
	}
	
	if(!g_save_cpl)
		menu_additem(i_menu, "\dСохранить изменения", "5", 0)
	else menu_additem(i_menu, "\wСохранить изменения", "5", 0)

	menu_setprop(i_menu, MPROP_EXIT, MEXIT_ALL)
	menu_setprop(i_menu, MPROP_EXITNAME, "\yВыход")
	menu_display(id, i_menu, 0)
	unhide_spawns()
		
	return PLUGIN_HANDLED
}

public menu_handler(id, menu, item)
{
	if (item == MENU_EXIT)
	{
		hide_spawns()
		menu_destroy(menu)
		return PLUGIN_HANDLED
	}

	static spawn_count; spawn_count = ArraySize(g_wb_id)
	switch(item)
	{
		case 0:
		{	
			g_save_cpl = true
			
			static Float:fOrigins[3]
			fm_get_aim_origin(id, fOrigins)
			
			create_spawn(fOrigins)
			spawn_menu(id)
		}
		case 1:
		{
			if(!spawn_count)
			{
				PrintChatColor(id, PRINT_COLOR_PLAYERTEAM, "!g[%s] !tНа карте нет спаунов", PLUGIN) 
				spawn_menu(id)
				return PLUGIN_HANDLED
			}
			
			PrintChatColor(id, PRINT_COLOR_PLAYERTEAM, "!g[%s] !tСпаун удален", PLUGIN)
			
			g_save_cpl = true
			remove_entity(ArrayGetCell(g_wb_id, spawn_count-1))
			ArrayDeleteItem(g_wb_id, spawn_count-1)
			ArrayDeleteItem(g_wb_origin_x, spawn_count-1)
			ArrayDeleteItem(g_wb_origin_y, spawn_count-1)
			ArrayDeleteItem(g_wb_origin_z, spawn_count-1)
			spawn_menu(id)
		}
		case 2:
		{
			if(!spawn_count)
			{
				PrintChatColor(id, PRINT_COLOR_PLAYERTEAM, "!g[%s] !tНа карте нет спаунов", PLUGIN) 
				spawn_menu(id)
				return PLUGIN_HANDLED
			}
			
			PrintChatColor(id, PRINT_COLOR_PLAYERTEAM, "!g[%s] !tБыло удалено !g%d !tспаун.", PLUGIN, spawn_count)
			
			g_save_cpl = true
			
			for(new i=0; i<spawn_count; i++)
				remove_entity(ArrayGetCell(g_wb_id, i))
			ArrayClear(g_wb_id) 
			ArrayClear(g_wb_origin_x) 
			ArrayClear(g_wb_origin_y) 
			ArrayClear(g_wb_origin_z) 
			spawn_menu(id)
		}
		case 3:
		{
			if(spawn_count)
				for(new i=0; i<spawn_count; i++)
					create_box(i)
			spawn_menu(id)
		}
		case 4:
		{
			if(!g_save_cpl)
			{
				spawn_menu(id)
				return PLUGIN_HANDLED
			}
			
			g_save_cpl = false
			set_maps_cfg()
			
			PrintChatColor(id, PRINT_COLOR_PLAYERTEAM, "!g[%s] !tСохранено", PLUGIN)
			spawn_menu(id)
		}
	}
	return PLUGIN_HANDLED
}

public create_spawn(Float: fOrigins[3])
{
	static ent; ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"))
	if(!pev_valid(ent)) return
	
	ArrayPushCell(g_wb_id, ent)
		
	ArrayPushCell(g_wb_origin_x, fOrigins[0])
	ArrayPushCell(g_wb_origin_y, fOrigins[1])
	ArrayPushCell(g_wb_origin_z, fOrigins[2])
	
	set_pev(ent, pev_origin, fOrigins)
	engfunc(EngFunc_SetModel, ent, SPAWN_MODEL)
		
	set_pev(ent, pev_solid, SOLID_TRIGGER)
	set_pev(ent, pev_movetype, MOVETYPE_NONE)
	set_pev(ent, pev_classname, SPAWN_CLASS)
	set_pev(ent, pev_lifes, get_cvar_num("cv_box_lifes"))
	
	if(!is_spawns_visible)
		entity_set_int(ent, EV_INT_effects, entity_get_int(ent, EV_INT_effects) | EF_NODRAW)
	
	if(!g_ham_reg)
	{
		RegisterHamFromEntity(Ham_TraceAttack, ent, "fw_box_trace_attack")
		g_ham_reg = true
	}
}

public create_box_pre()
{
	static spawn_count; spawn_count = ArraySize(g_wb_id)
	
	if(!spawn_count)
		return
		
	new boxes_sum = 0
	for(new i=0; i<spawn_count; i++)
	{
		static ent; ent = ArrayGetCell(g_wb_id, i)
		new classname[32]
		pev(ent, pev_classname, classname, charsmax(classname)) 
				
		if(equal(classname, SPAWN_CLASS) && (pev(ent, pev_lifes) || !get_cvar_num("cv_box_lifes")))
			boxes_sum++	
	}
	
	if(!boxes_sum)
		return 
	
	new id = -1
	while(id == -1)
	{
		new i = random_num(0, spawn_count-1)
		
		static ent; ent = ArrayGetCell(g_wb_id, i)
		new classname[32]
		pev(ent, pev_classname, classname, charsmax(classname))
		
		if(equal(classname, SPAWN_CLASS) && (pev(ent, pev_lifes) || !get_cvar_num("cv_box_lifes")))
			id = i
	}
	
	create_box(id)
	
	return
}

public create_box(id)
{
	static ent; ent = ArrayGetCell(g_wb_id, id)
		
	new Float:fOrigin[3], Float:fNewOrigin[3], PC, Float:dist
	fOrigin[0] = ArrayGetCell(g_wb_origin_x, id)
	fOrigin[1] = ArrayGetCell(g_wb_origin_y, id)
	fOrigin[2] = ArrayGetCell(g_wb_origin_z, id)
	fNewOrigin = get_origin_to_roof(ent, fOrigin)
	PC = engfunc(EngFunc_PointContents, fNewOrigin)
	dist = floatabs(fNewOrigin[2]-fOrigin[2])
	
	if(PC != CONTENTS_SKY)
	{
		if(dist - 80.0 <= 90.0) fNewOrigin[2] = fOrigin[2] + 10.0
		else fNewOrigin[2] -= 80.0	
	}
	else fNewOrigin[2] = fOrigin[2] + 200.0
		
	set_pev(ent, pev_origin, fNewOrigin)
	engfunc(EngFunc_SetModel, ent, PARACHUTE_MODEL)
		
	if(get_cvar_num("cv_wb_solid"))
		set_pev(ent, pev_solid, SOLID_BBOX)
	else 
		set_pev(ent, pev_solid, SOLID_TRIGGER)
		
	set_pev(ent, pev_movetype, MOVETYPE_FLY)
	set_pev(ent, pev_velocity, {0.0, 0.0, -40.0})
	set_pev(ent, pev_classname, PBOX_CLASS)
	
	new Float:maxs[3] = {10.0, 10.0, 80.0}
	new Float:mins[3] = {-10.0, -10.0, 0.0}
	engfunc(EngFunc_SetSize, ent, mins, maxs)
	entity_set_int(ent, EV_INT_effects, entity_get_int(ent, EV_INT_effects) & ~EF_NODRAW)
	
	emit_sound(ent, CHAN_ITEM, CREATE_SOUND, 1.0, ATTN_NORM, 0, PITCH_NORM)
	
	new iType = -1
	
	while(iType == -1)
	{
		iType = random_num(0,2)
		
		if(iType == 0 && !get_cvar_num("cv_box_health"))
			iType = -1
			
		if(iType == 1 && !get_cvar_num("cv_box_ammo"))
			iType = -1
			
		if(iType == 2 && !get_cvar_num("cv_box_utilities"))
			iType = -1
	}
		
	set_pev(ent, pev_body, iType)
	set_pev(ent, pev_framerate, 1.0)
	set_pev(ent, pev_sequence, iType)
}

public explode_box(ent)
{
	if(!is_valid_ent(ent)) return
	
	static iOrigin[3], Float: fOrigin[3]
	pev(ent, pev_origin, fOrigin)
	iOrigin[0] = floatround(fOrigin[0])
	iOrigin[1] = floatround(fOrigin[1])
	iOrigin[2] = floatround(fOrigin[2])
	
	message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
	write_byte(3)
	write_coord(iOrigin[0])
	write_coord(iOrigin[1])
	write_coord(iOrigin[2])
	write_short(ExplosionMdl)
	write_byte(random_num(0,20) + 20)
	write_byte(12)
	write_byte(0)
	message_end()
	
	message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
	write_byte(5)
	write_coord(iOrigin[0])
	write_coord(iOrigin[1])
	write_coord(iOrigin[2] + 10)
	write_short(SmokeMdl)
	write_byte(60)
	write_byte(10)
	message_end()
}

public hide_box(ent)
{
	if(!is_valid_ent(ent)) return
			
	set_pev(ent, pev_solid, SOLID_NOT)
	set_pev(ent, pev_movetype, MOVETYPE_NONE)
	set_pev(ent, pev_classname, SPAWN_CLASS)
	
	if(!is_spawns_visible)
		entity_set_int(ent, EV_INT_effects, entity_get_int(ent, EV_INT_effects) | EF_NODRAW)
		
	engfunc(EngFunc_SetModel, ent, SPAWN_MODEL)
	
	new Float:maxs[3] = {0.0, 0.0, 0.0}
	new Float:mins[3] = {0.0, 0.0, 0.0}
	engfunc(EngFunc_SetSize, ent, mins, maxs)
	
	static spawns_count; spawns_count = ArraySize(g_wb_id)
	for (new i=0; i<spawns_count; i++)
		if(ent == ArrayGetCell(g_wb_id, i))
		{
			new Float:fOrigin[3]
			fOrigin[0] = ArrayGetCell(g_wb_origin_x, i)
			fOrigin[1] = ArrayGetCell(g_wb_origin_y, i)
			fOrigin[2] = ArrayGetCell(g_wb_origin_z, i)
			set_pev(ent, pev_origin, fOrigin)
		}
	
	if(pev(ent, pev_lifes))
		set_pev(ent, pev_lifes, pev(ent, pev_lifes)-1) 
}

public hide_spawns()
{
	is_spawns_visible = false
	
	static spawns_count; spawns_count = ArraySize(g_wb_id)
	if(!g_wb_id) return
	
	for (new i=0; i<spawns_count; i++)
	{
		static classname[32], ent; ent = ArrayGetCell(g_wb_id, i)
		pev(ent, pev_classname, classname, charsmax(classname))
		if(!equal(classname, SPAWN_CLASS)) continue
		entity_set_int(ent, EV_INT_effects, entity_get_int(ent, EV_INT_effects) | EF_NODRAW)
	}
}

public unhide_spawns()
{
	static spawns_count; spawns_count = ArraySize(g_wb_id)
	if(!g_wb_id) return
	
	for (new i=0; i<spawns_count; i++)
	{
		static classname[32], ent; ent = ArrayGetCell(g_wb_id, i)
		pev(ent, pev_classname, classname, charsmax(classname))
		if(!equal(classname, SPAWN_CLASS)) continue
		entity_set_int(ent, EV_INT_effects, entity_get_int(ent, EV_INT_effects) & ~EF_NODRAW)
	}
}

public fw_box_trace_attack(ent, attacker, Float:damage, Float:dir[3], ptr, damagetype)
{
	if(!is_valid_ent(ent)) return
	
	new classname[32]
	pev(ent, pev_classname, classname, charsmax(classname)) 
	if(!equal(classname, PBOX_CLASS))
	{
		if(equal(classname, BOX_CLASS))
		{
			if(!pev(ent, pev_notrace))
			{
				explode_box(ent)
				hide_box(ent)
			}
		}
		return
	}
		
	new Float: endtrace[3]
	fm_get_aim_origin(attacker, endtrace)
	
	if(find_closest_bone_to_gunshot(ent, endtrace) == 1)
	{
		engfunc(EngFunc_SetModel, ent, BOX_MODEL)
		set_pev(ent, pev_velocity, {0.0, 0.0, -1.0})
		set_pev(ent, pev_movetype, MOVETYPE_BOUNCE)
		set_pev(ent, pev_classname, BOX_CLASS)
	
		/*  */
		set_pev(ent, pev_notrace, 1) 
		set_task(0.1,"set_euser1", ent+TASK_FIXMULTITRACES)
	
		new Float:maxs[3] = {10.0, 10.0, 28.0}
		new Float:mins[3] = {-10.0, -10.0, 0.0}
		engfunc(EngFunc_SetSize, ent, mins, maxs)
	}
	else 	
	{	
		explode_box(ent)
		hide_box(ent)
	}
}

public fw_box_touch_player(ent, player)
{
	if(!is_valid_ent(ent)) return
	if(get_cvar_num("cv_wb_times_round") && !g_round_times[player]) return
	if(get_cvar_num("cv_wb_times_game") && !g_game_times[player]) return
	
	if(g_round_times[player]) g_round_times[player]--
	if(g_game_times[player]) g_game_times[player]--
	
	client_cmd(player, "spk %s", PICKUP_SOUND)
	
	static iType; iType = pev(ent, pev_body)
	switch(iType)
	{
		case 0:
		{
			static hp; hp = get_cvar_num("cv_box_health_value")
			fm_set_user_health(player, pev(player, pev_health)+hp)
			PrintChatColor(player, PRINT_COLOR_PLAYERTEAM, "!g[%s] !tВы получаете !gздоровье (%d hp)", PLUGIN, hp)
		}
		case 1:
		{
			static weapon_list_count; weapon_list_count = ArraySize(g_weapon_list)
			if(!weapon_list_count)
			{
				PrintChatColor(player, PRINT_COLOR_PLAYERTEAM, "!g[%s] !tЯщик оказался пустым", PLUGIN)
				hide_box(ent)
				return
			}
			
			static i; i = random_num(0, weapon_list_count-1)
			static weapon_name[32], weapon_short_name[16], blank_str[2]
			ArrayGetString(g_weapon_list, i, weapon_name, charsmax(weapon_name))
			strtok(weapon_name, blank_str, charsmax(blank_str), weapon_short_name, charsmax(weapon_short_name), '_')
			new wEnt = find_ent_by_owner(-1, weapon_name, player)
			if(!wEnt)
			{
				wEnt = ham_give_weapon(player, weapon_name)
				PrintChatColor(player, PRINT_COLOR_PLAYERTEAM, "!g[%s] !tВы подобрали !g%s", PLUGIN, weapon_short_name)
				cs_set_weapon_ammo(wEnt, ArrayGetCell(g_weapon_ammo_list, i))
			}
			else
			{
				PrintChatColor(player, PRINT_COLOR_PLAYERTEAM, "!g[%s] !tВы подобрали патроны для !g%s", PLUGIN, weapon_short_name)
				cs_set_user_bpammo(player, weapon_to_const(weapon_name), cs_get_user_bpammo(player, weapon_to_const(weapon_name)) + ArrayGetCell(g_weapon_ammo_list, i))
			}
		}
		case 2:
		{
			static utilities_list_count; utilities_list_count = ArraySize(g_utilities_list)
			if(!utilities_list_count)
			{
				PrintChatColor(player, PRINT_COLOR_PLAYERTEAM, "!g[%s] !tЯщик оказался пустым", PLUGIN)
				hide_box(ent)
				return
			}
			
			static i; i = random_num(0, utilities_list_count-1)
			static utility_name[32]
			ArrayGetString(g_utilities_list, i, utility_name, charsmax(utility_name))
			
			if(equal(utility_name,"nightvision"))
			{
				PrintChatColor(player, PRINT_COLOR_PLAYERTEAM, "!g[%s] !tВы подобрали !gnightvision", PLUGIN)
				cs_set_user_nvg(player)
			}
			else if(equal(utility_name,"defuse kit") && cs_get_user_team(player) == CS_TEAM_CT)
			{
				PrintChatColor(player, PRINT_COLOR_PLAYERTEAM, "!g[%s] !tВы подобрали !gdefuse kit", PLUGIN)
				cs_set_user_defuse(player)
			}
			else if(equal(utility_name,"armor"))
			{
				PrintChatColor(player, PRINT_COLOR_PLAYERTEAM, "!g[%s] !tВы подобрали !garmor", PLUGIN)
				cs_set_user_armor(player, 100, CS_ARMOR_KEVLAR)
			}
			else if(equal(utility_name,"armor+helmet"))
			{
				PrintChatColor(player, PRINT_COLOR_PLAYERTEAM, "!g[%s] !tВы подобрали !garmor+helmet", PLUGIN)
				cs_set_user_armor(player, 100, CS_ARMOR_VESTHELM)
			}
			else PrintChatColor(player, PRINT_COLOR_PLAYERTEAM, "!g[%s] !tЯщик оказался пустым", PLUGIN)
		}
	}
	hide_box(ent)
}

public fw_pbox_touch_world(ent, world)
{
	if(!is_valid_ent(ent)) return
					
	engfunc(EngFunc_SetModel, ent, BOX_MODEL)
	set_pev(ent, pev_velocity, {0.0, 0.0, 0.0})
	set_pev(ent, pev_movetype, MOVETYPE_BOUNCE)
	set_pev(ent, pev_classname, BOX_CLASS)
	
	/*  */
	set_pev(ent, pev_notrace, 1) 
	set_task(0.1,"set_euser1", ent+TASK_FIXMULTITRACES)
	
	new Float:maxs[3] = {10.0, 10.0, 28.0}
	new Float:mins[3] = {-10.0, -10.0, 0.0}
	engfunc(EngFunc_SetSize, ent, mins, maxs)
}

public set_euser1(ent) set_pev(ent-TASK_FIXMULTITRACES, pev_notrace, 0)

public fw_box_touch_world(ent, world)
{
	if(!is_valid_ent(ent)) return
	
	static Float:fVelocity[3]
	pev(ent, pev_velocity, fVelocity) 
    
	fVelocity[0] *= 0.85
	fVelocity[1] *= 0.85
	fVelocity[2] *= 0.85

	set_pev(ent, pev_velocity, fVelocity) 
	
	if(floatabs(fVelocity[2]) > 100.0) emit_sound(ent, CHAN_ITEM, FALL_SOUND, 1.0, ATTN_NORM, 0, PITCH_NORM)
	else emit_sound(ent, CHAN_ITEM, FALL_SOUND, floatabs(fVelocity[2])/100, ATTN_NORM, 0, PITCH_NORM)
}

public NewRound()
{
	for(new id=1;id<=32;id++)
		g_round_times[id] = get_cvar_num("cv_wb_times_round")		
}

public client_putinserver(id)
{
	if(!get_cvar_num("cv_wb_times_game"))
		return
			
	static id_count; id_count = ArraySize(g_steam_ids)
		
	new steam_id[32]
	get_user_authid(id, steam_id, charsmax(steam_id))
		
	for(new i=0;i<id_count;i++)
	{
		new saved_steam_id[32]
		ArrayGetString (g_steam_ids, id_count-1, saved_steam_id, charsmax(saved_steam_id)) 
		
		if(equal(saved_steam_id, steam_id))
			return
	}
	
	g_game_times[id] = get_cvar_num("cv_wb_times_game")
	ArrayPushString(g_steam_ids, steam_id)
	
	return
}

stock find_closest_bone_to_gunshot(victim, Float:endtrace[3])
{
	new Float:angles[3], Float:origin[3], Float:dist = 9999999.99, Float:curorigin[3], bone_nr
	for (new i=0;i<=2;i++)
	{
		engfunc(EngFunc_GetBonePosition, victim, i, curorigin, angles)
		xs_vec_sub(curorigin, endtrace, angles)
		
		if(xs_vec_len(angles) <= dist)
		{
			origin = curorigin
			dist = xs_vec_len(angles)
			bone_nr = i
		}
	}
	
	return bone_nr
}

stock Float: get_origin_to_roof(ent, Float:start[3]) 
{ 
	     new Float:dest[3] = {-90.0, 0.0, 0.0}
	     engfunc(EngFunc_MakeVectors, dest)
	     global_get(glb_v_forward, dest)
	     xs_vec_mul_scalar(dest, 9999.0, dest)
	     xs_vec_add(start, dest, dest) 
		 
	     engfunc(EngFunc_TraceLine, start, dest, 0, ent, 0)
	     new Float:origin[3]	
	     get_tr2(0, TR_vecEndPos, origin)
	     	     
	     return origin
}

stock ham_give_weapon(id,weapon[])
{
	if(!equal(weapon,"weapon_",7)) return 0
 
	new wEnt = engfunc(EngFunc_CreateNamedEntity,engfunc(EngFunc_AllocString,weapon))
	if(!pev_valid(wEnt)) return 0
 
	set_pev(wEnt,pev_spawnflags,SF_NORESPAWN)
	dllfunc(DLLFunc_Spawn,wEnt)
     
	if(!ExecuteHamB(Ham_AddPlayerItem,id,wEnt))
	{
		if(pev_valid(wEnt)) set_pev(wEnt,pev_flags,pev(wEnt,pev_flags) | FL_KILLME)
		return 0
	}

	ExecuteHamB(Ham_Item_AttachToPlayer,wEnt,id)
	return wEnt
}

stock weapon_to_const(weapon[])
{
	if(equal(weapon,"weapon_p228")) return CSW_P228
	if(equal(weapon,"weapon_scout")) return CSW_SCOUT
	if(equal(weapon,"weapon_hegrenade")) return CSW_HEGRENADE
	if(equal(weapon,"weapon_xm1014")) return CSW_XM1014
	if(equal(weapon,"weapon_c4")) return CSW_C4
	if(equal(weapon,"weapon_mac10")) return CSW_MAC10
	if(equal(weapon,"weapon_aug")) return CSW_AUG
	if(equal(weapon,"weapon_smokegrenade")) return CSW_SMOKEGRENADE
	if(equal(weapon,"weapon_elite")) return CSW_ELITE
	if(equal(weapon,"weapon_fiveseven")) return CSW_FIVESEVEN
	if(equal(weapon,"weapon_ump45")) return CSW_UMP45
	if(equal(weapon,"weapon_sg550")) return CSW_SG550
	if(equal(weapon,"weapon_galil")) return CSW_GALIL
	if(equal(weapon,"weapon_famas")) return CSW_FAMAS
	if(equal(weapon,"weapon_usp")) return CSW_USP
	if(equal(weapon,"weapon_glock18")) return CSW_GLOCK18
	if(equal(weapon,"weapon_awp")) return CSW_AWP
	if(equal(weapon,"weapon_mp5navy")) return CSW_MP5NAVY
	if(equal(weapon,"weapon_m249")) return CSW_M249
	if(equal(weapon,"weapon_m3")) return CSW_M3
	if(equal(weapon,"weapon_m4a1")) return CSW_M4A1
	if(equal(weapon,"weapon_tmp")) return CSW_TMP
	if(equal(weapon,"weapon_g3sg1")) return CSW_G3SG1
	if(equal(weapon,"weapon_flashbang")) return CSW_FLASHBANG
	if(equal(weapon,"weapon_deagle")) return CSW_DEAGLE
	if(equal(weapon,"weapon_sg552")) return CSW_SG552
	if(equal(weapon,"weapon_ak47")) return CSW_AK47
	if(equal(weapon,"weapon_knife")) return CSW_KNIFE
	if(equal(weapon,"weapon_p90")) return CSW_P90	
	
	return 0
}
n3sS is offline