Преработка на respawn protection+hud hudmessage

В този раздел можете да подавате всякакви заявки за намиране, изработка или преработка на плъгини/модове.
Аватар
cgozzie
Извън линия
Потребител
Потребител
Мнения: 1318
Регистриран на: 13 Окт 2016, 22:10
Местоположение: Варна
Се отблагодари: 244 пъти
Получена благодарност: 42 пъти

Преработка на respawn protection+hud hudmessage

Мнение от cgozzie » 29 Ное 2021, 13:53

Здравейге лека преработка искам на плъгина,respawn protection+hud hudmessage да ги няма.. :)

respawn.sma

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

/*
---------------------------------------------------------
   #  #  #    #===    ###    ##    #
  #    ##     #===   #      #  #    #
   #   #      #===    ###    ##    #
---------------------------------------------------------
Respawn by <VeCo> 3.1

Plugin made by <VeCo>
Special thanks to:
 - papyrus_kn : for checking player's team when
		is connected to server and for fixing
		the spawn protection.
 - wwwhhheeeyyy : for the idea for bonus money on respawn
and random spawn version.
 - freedj : for the Zombie Plague version.
 - talibana : for the idea for bonus armor on respawn and
for the idea for the /respawn command.
 - Holder_ : for the idea for angle and view angle save in
	     the spawn point files.

If you modify the code, please DO NOT change the author!
---------------------------------------------------------
Contacts:
e-mail: [email protected]
skype: veco_kn
---------------------------------------------------------
Changes log:
 -> v 1.0 = First release!
 -> v 1.1 = Fixed bugs and not equip pistols if there is 
	    game_player_equip on the map. Plugin requires
	    engine module.
 -> v 1.2 = Removed unnecessary code.
	    Plugin don't needs cstrike module.
 -> v 1.3 = Fixed bug with spawn protection.
 -> v 1.4 = Fixed bug with respawn check.
 -> v 1.5 = Removed unnecessary code.
	    Plugin don't needs engine module.
 -> v 1.6 = Added CVAR for bonus money on respawn.
 -> v 1.7 = Fixed bug.
 -> v 2.0 = Zombie and hamsandwich versions are combinated
	    with the standart version.
 -> v 2.1 = Little optimization in spawn protection code.
 -> v 2.2 = Added CVARs for bonus armor on respawn.
	    The hamsandwich respawn is set by default.
 -> v 2.3 = Added chat command /respawn if something gets
	    bugged.
 -> v 3.0 = Standart version is removed.
	    Fixed bug with multiple respawn.
	    Added random respawn version (with CSDM spawn
	    points support;needs fakemeta module).
 -> v 3.1 = Added full CSDM support.
	    Added angle and view angle save in the spawn
	    point files.
---------------------------------------------------------
Don't forget to visit http://www.amxmodxbg.org :)
---------------------------------------------------------
*/

//#define ZOMBIE_PLAGUE // uncomment this line if you want to use this plugin for Zombie Plague
//#define RANDOM_SPAWNS // uncomment this line if you want to use the random respawn mode

#if defined RANDOM_SPAWNS
#define MAX_SPAWNS 50 // maximum allowed random spawn points in a map
#define ADMIN_ADD_SPAWN ADMIN_RCON // access level for respawn_add_spawn command
#endif

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

#if defined ZOMBIE_PLAGUE
#include <zombieplague>
#endif

#if defined RANDOM_SPAWNS
#include <amxmisc>
#include <fakemeta>

enum
{
	COORD_ORIGIN = 0,
	COORD_ANGLES,
	COORD_VANGLES,
	MAX_COORD
}
#endif

new on_res,res_protect,res_time,res_protect_time,res_money,res_armor_type,res_armor, g_iHudSynMsg
#if defined RANDOM_SPAWNS
new spawn_file[75],total_spawns,Float:spawn_coord_data[MAX_COORD][MAX_SPAWNS + 1][3]
#endif
public plugin_init()
{
	register_plugin("Respawn by <VeCo>", "3.1", "<VeCo>")
	
	RegisterHam(Ham_Spawn,"player","player_spawn",1)
	
	register_cvar("respawn_version", "3.1", FCVAR_SERVER|FCVAR_SPONLY)
	on_res = register_cvar("respawn_on","1")
	res_time = register_cvar("respawn_time","3.0")
	res_protect = register_cvar("respawn_protect","1")
	res_protect_time = register_cvar("respawn_protect_time","4.0")
	res_money = register_cvar("respawn_bonus_money","400")
	res_armor_type = register_cvar("respawn_bonus_armor_type","0")
	res_armor = register_cvar("respawn_bonus_armor","100")
	register_event("DeathMsg","hook_death","a")
	
	register_clcmd("say /respawn","force_respawn")
	register_clcmd("say_team /respawn","force_respawn")
	
	g_iHudSynMsg = CreateHudSyncObj()
	
#if defined RANDOM_SPAWNS
	register_concmd("respawn_add_spawn","admin_add_spawn",ADMIN_ADD_SPAWN)
	
	new mapname[32]
	get_mapname(mapname,31)
	formatex(spawn_file,74,"addons/amxmodx/configs/respawn_veco/%s.ini",mapname)
	
	if(!file_exists(spawn_file)) format(spawn_file,73,"addons/amxmodx/configs/csdm/%s.spawns.cfg",mapname)
	
	if(!file_exists(spawn_file))
	{
		log_amx("[RESPAWN] Spawn file doesn't exist! Standart spawn points will be used instead.")
		formatex(spawn_file,74,"addons/amxmodx/configs/respawn_veco/%s.ini",mapname)
	}
	
	load_random_spawns()
#endif
}

public client_putinserver(id)
{
	if(!get_pcvar_num(on_res)) return
	set_task(5.0,"respawn_check",id)
}

public hook_death()
{	
	if(!get_pcvar_num(on_res)) return
		
	new id = read_data(2)
	set_task(get_pcvar_float(res_time),"respawn_event", id)
}

public respawn_event(id)
{
	if(is_user_alive(id) || !is_user_connected(id) || cs_get_user_team(id) == CS_TEAM_SPECTATOR || cs_get_user_team(id) == CS_TEAM_UNASSIGNED) return
	
	ExecuteHamB(Ham_CS_RoundRespawn,id)
	
#if defined RANDOM_SPAWNS
	if(total_spawns > 0)
	{
		static get_random_spawn
		get_random_spawn = random(total_spawns)
		
		spawn_coord_data[COORD_ORIGIN][get_random_spawn][2] += 20.0
		set_pev(id,pev_origin,spawn_coord_data[COORD_ORIGIN][get_random_spawn])
		spawn_coord_data[COORD_ORIGIN][get_random_spawn][2] -= 20.0
		
		set_pev(id,pev_angles,spawn_coord_data[COORD_ANGLES][get_random_spawn])
		set_pev(id,pev_v_angle,spawn_coord_data[COORD_VANGLES][get_random_spawn])
		
		if(is_player_stuck(id)) ExecuteHamB(Ham_CS_RoundRespawn,id)
	}
#endif
	
	cs_set_user_money(id, cs_get_user_money(id) + get_pcvar_num(res_money))
	if(get_pcvar_num(res_armor_type) > 0) cs_set_user_armor(id,get_pcvar_num(res_armor),CsArmorType:get_pcvar_num(res_armor_type))
}

public remove_res_protection(id)
{
	if(!is_user_connected(id) || !is_user_alive(id)) return
	
	//client_print(id,print_center,"Your spawn protection is OFF!")
	set_hudmessage(255, 255, 255, -1.0, 0.40)
	ShowSyncHudMsg(id,g_iHudSynMsg,"Your spawn protection expired!")
	set_user_rendering(id)
	set_user_godmode(id,0)
}

public player_spawn(id)
{
	if(!is_user_connected(id) || !is_user_alive(id) || get_pcvar_num(res_protect) == 0) return
	
	switch(get_pcvar_num(res_protect))
	{
		case 1:
		{
			switch(cs_get_user_team(id))
			{
				case CS_TEAM_CT: set_user_rendering(id, kRenderFxGlowShell, 0,0,255, kRenderNormal, 50)
				case CS_TEAM_T: set_user_rendering(id, kRenderFxGlowShell, 255,0,0, kRenderNormal, 50)
			}
		}
		case 2: set_user_rendering(id, kRenderFxGlowShell, random(255),random(255),random(255), kRenderNormal, 50)
		case 3: set_user_rendering(id, kRenderFxGlowShell, 0,0,0, kRenderTransAlpha, 80)
	}
	set_user_godmode(id,1)
	set_hudmessage(255, 255, 255, -1.0, 0.40)
	ShowSyncHudMsg(id,g_iHudSynMsg,"Your are protected for %d seconds!",floatround(get_pcvar_float(res_protect_time)))
	set_task(get_pcvar_float(res_protect_time),"remove_res_protection",id)
	
#if defined RANDOM_SPAWNS
	if(total_spawns > 0)
	{
		static get_random_spawn
		get_random_spawn = random(total_spawns)
		
		spawn_coord_data[COORD_ORIGIN][get_random_spawn][2] += 20.0
		set_pev(id,pev_origin,spawn_coord_data[COORD_ORIGIN][get_random_spawn])
		spawn_coord_data[COORD_ORIGIN][get_random_spawn][2] -= 20.0
		
		set_pev(id,pev_angles,spawn_coord_data[COORD_ANGLES][get_random_spawn])
		set_pev(id,pev_v_angle,spawn_coord_data[COORD_VANGLES][get_random_spawn])
		
		if(is_player_stuck(id)) ExecuteHamB(Ham_CS_RoundRespawn,id)
	}
#endif
}

public respawn_check(id)
{
	if(!is_user_connected(id)) return
	
#if defined ZOMBIE_PLAGUE
	if(!is_user_alive(id) && zp_get_user_zombie(id) || zp_get_user_survivor(id))
#else
	if(!is_user_alive(id) && cs_get_user_team(id) == CS_TEAM_T || cs_get_user_team(id) == CS_TEAM_CT)
#endif
	{
		set_task(get_pcvar_float(res_time),"respawn_event", id)
	} else {
		set_task(5.0,"respawn_check",id)
	}
}

public force_respawn(id)
{
	if(!get_pcvar_num(on_res) || is_user_alive(id)) return
	remove_task(id)
	respawn_event(id)
}

#if defined RANDOM_SPAWNS
public admin_add_spawn(id,level,cid)
{
	if(!cmd_access(id,level,cid,1)) return PLUGIN_HANDLED
	
	if(total_spawns == MAX_SPAWNS)
	{
		console_print(id,"[RESPAWN] Spawn limit exceeded! Maximum amount of spawn points is: %i.",MAX_SPAWNS)
		return PLUGIN_HANDLED
	}
	
	static Float:origin[3],Float:angles[3],Float:vangles[3]
	pev(id,pev_origin,origin)
	pev(id,pev_angles,angles)
	pev(id,pev_v_angle,vangles)
	
	save_spawn(id,origin,angles,vangles)
	
	return PLUGIN_HANDLED
}

public save_spawn(id,Float:origin[3],Float:angles[3],Float:vangles[3])
{
	static save
	save = fopen(spawn_file,"at")
	if(save)
	{
		fprintf(save,"%.0f %.0f %.0f %.0f %.0f %.0f %.0f %.0f %.0f 0^n",origin[0],origin[1],origin[2], angles[0],angles[1],angles[2], vangles[0],vangles[1],vangles[2])
		fclose(save)
		
		console_print(id,"[RESPAWN] New random spawn point added at (%.0f , %.0f , %.0f) successfully!",origin[0],origin[1],origin[2])
		console_print(id,"[RESPAWN] Angles: (%.0f , %.0f , %.0f)",angles[0],angles[1],angles[2])
		console_print(id,"[RESPAWN] View Angles: (%.0f , %.0f , %.0f)",vangles[0],vangles[1],vangles[2])
		load_random_spawns()
	}
}

public load_random_spawns()
{
	total_spawns = 0
	
	static buffer[34], x[12],y[12],z[12], x_ang[12],y_ang[12],z_ang[12], x_vang[12],y_vang[12],z_vang[12]
	
	if(file_exists(spawn_file))
	{
		new save = fopen(spawn_file,"rt")
		
		if(!save) return
		
		while(!feof(save))
		{
			if(total_spawns == MAX_SPAWNS) break
			
			fgets(save,buffer,33)
			
			if(buffer[0] == ';' || !buffer[0]) continue
			
			parse(buffer, x,11,y,11,z,11, x_ang,11,y_ang,11,z_ang,11, x_vang,11,y_vang,11,z_vang,11)
			
			spawn_coord_data[COORD_ORIGIN][total_spawns][0] = str_to_float(x)
			spawn_coord_data[COORD_ORIGIN][total_spawns][1] = str_to_float(y)
			spawn_coord_data[COORD_ORIGIN][total_spawns][2] = str_to_float(z)
			
			spawn_coord_data[COORD_ANGLES][total_spawns][0] = str_to_float(x_ang)
			spawn_coord_data[COORD_ANGLES][total_spawns][1] = str_to_float(y_ang)
			spawn_coord_data[COORD_ANGLES][total_spawns][2] = str_to_float(z_ang)
			
			spawn_coord_data[COORD_VANGLES][total_spawns][0] = str_to_float(x_vang)
			spawn_coord_data[COORD_VANGLES][total_spawns][1] = str_to_float(y_vang)
			spawn_coord_data[COORD_VANGLES][total_spawns][2] = str_to_float(z_vang)
			
			total_spawns++
		}
		
		fclose(save)
	}
}

// Check if a player is stuck (credits to VEN)
stock is_player_stuck(id)
{
	static Float:originF[3]
	pev(id, pev_origin, originF)
	
	engfunc(EngFunc_TraceHull, originF, originF, 0, (pev(id, pev_flags) & FL_DUCKING) ? HULL_HEAD : HULL_HUMAN, id, 0)
	
	if (get_tr2(0, TraceResult:TR_StartSolid) || get_tr2(0, TraceResult:TR_AllSolid) || !get_tr2(0, TraceResult:TR_InOpen))
		return true;
	
	return false;
}
#endif
Последно промяна от OciXCrom на 29 Ное 2021, 20:12, променено общо 1 път.
Причина: Огромна е разликата между ПРЕРАБОТКА на плъгини и ПРЕРАБОТЕНИ плъгини!
Изображение

Аватар
illusion
Извън линия
Developer
Developer
Мнения: 1796
Регистриран на: 27 Ное 2016, 17:47
Местоположение: CraftVision
Се отблагодари: 151 пъти
Получена благодарност: 358 пъти
Обратна връзка:

Преработка на respawn protection+hud hudmessage

Мнение от illusion » 29 Ное 2021, 19:44

Тествай, не съм го пробвал

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

//#define ZOMBIE_PLAGUE // uncomment this line if you want to use this plugin for Zombie Plague
//#define RANDOM_SPAWNS // uncomment this line if you want to use the random respawn mode

#if defined RANDOM_SPAWNS
#define MAX_SPAWNS 50 // maximum allowed random spawn points in a map
#define ADMIN_ADD_SPAWN ADMIN_RCON // access level for respawn_add_spawn command
#endif

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

#if defined ZOMBIE_PLAGUE
#include <zombieplague>
#endif

#if defined RANDOM_SPAWNS
#include <amxmisc>
#include <fakemeta>

enum
{
	COORD_ORIGIN = 0,
	COORD_ANGLES,
	COORD_VANGLES,
	MAX_COORD
}
#endif

new on_res,res_time,res_money,res_armor_type,res_armor
#if defined RANDOM_SPAWNS
new spawn_file[75],total_spawns,Float:spawn_coord_data[MAX_COORD][MAX_SPAWNS + 1][3]
#endif
public plugin_init()
{
	register_plugin("Respawn by <VeCo>", "3.1", "<VeCo>")
	
	RegisterHam(Ham_Spawn,"player","player_spawn",1)
	
	register_cvar("respawn_version", "3.1", FCVAR_SERVER|FCVAR_SPONLY)
	on_res = register_cvar("respawn_on","1")
	res_time = register_cvar("respawn_time","3.0")
	res_money = register_cvar("respawn_bonus_money","400")
	res_armor_type = register_cvar("respawn_bonus_armor_type","0")
	res_armor = register_cvar("respawn_bonus_armor","100")
	register_event("DeathMsg","hook_death","a")
	
	register_clcmd("say /respawn","force_respawn")
	register_clcmd("say_team /respawn","force_respawn")
	
#if defined RANDOM_SPAWNS
	register_concmd("respawn_add_spawn","admin_add_spawn",ADMIN_ADD_SPAWN)
	
	new mapname[32]
	get_mapname(mapname,31)
	formatex(spawn_file,74,"addons/amxmodx/configs/respawn_veco/%s.ini",mapname)
	
	if(!file_exists(spawn_file)) format(spawn_file,73,"addons/amxmodx/configs/csdm/%s.spawns.cfg",mapname)
	
	if(!file_exists(spawn_file))
	{
		log_amx("[RESPAWN] Spawn file doesn't exist! Standart spawn points will be used instead.")
		formatex(spawn_file,74,"addons/amxmodx/configs/respawn_veco/%s.ini",mapname)
	}
	
	load_random_spawns()
#endif
}

public client_putinserver(id)
{
	if(!get_pcvar_num(on_res)) return
	set_task(5.0,"respawn_check",id)
}

public hook_death()
{	
	if(!get_pcvar_num(on_res)) return
		
	new id = read_data(2)
	set_task(get_pcvar_float(res_time),"respawn_event", id)
}

public respawn_event(id)
{
	if(is_user_alive(id) || !is_user_connected(id) || cs_get_user_team(id) == CS_TEAM_SPECTATOR || cs_get_user_team(id) == CS_TEAM_UNASSIGNED) return
	
	ExecuteHamB(Ham_CS_RoundRespawn,id)
	
#if defined RANDOM_SPAWNS
	if(total_spawns > 0)
	{
		static get_random_spawn
		get_random_spawn = random(total_spawns)
		
		spawn_coord_data[COORD_ORIGIN][get_random_spawn][2] += 20.0
		set_pev(id,pev_origin,spawn_coord_data[COORD_ORIGIN][get_random_spawn])
		spawn_coord_data[COORD_ORIGIN][get_random_spawn][2] -= 20.0
		
		set_pev(id,pev_angles,spawn_coord_data[COORD_ANGLES][get_random_spawn])
		set_pev(id,pev_v_angle,spawn_coord_data[COORD_VANGLES][get_random_spawn])
		
		if(is_player_stuck(id)) ExecuteHamB(Ham_CS_RoundRespawn,id)
	}
#endif
	
	cs_set_user_money(id, cs_get_user_money(id) + get_pcvar_num(res_money))
	if(get_pcvar_num(res_armor_type) > 0) cs_set_user_armor(id,get_pcvar_num(res_armor),CsArmorType:get_pcvar_num(res_armor_type))
}

public player_spawn(id)
{	
#if defined RANDOM_SPAWNS
	if(total_spawns > 0)
	{
		static get_random_spawn
		get_random_spawn = random(total_spawns)
		
		spawn_coord_data[COORD_ORIGIN][get_random_spawn][2] += 20.0
		set_pev(id,pev_origin,spawn_coord_data[COORD_ORIGIN][get_random_spawn])
		spawn_coord_data[COORD_ORIGIN][get_random_spawn][2] -= 20.0
		
		set_pev(id,pev_angles,spawn_coord_data[COORD_ANGLES][get_random_spawn])
		set_pev(id,pev_v_angle,spawn_coord_data[COORD_VANGLES][get_random_spawn])
		
		if(is_player_stuck(id)) ExecuteHamB(Ham_CS_RoundRespawn,id)
	}
#endif
}

public respawn_check(id)
{
	if(!is_user_connected(id)) return
	
#if defined ZOMBIE_PLAGUE
	if(!is_user_alive(id) && zp_get_user_zombie(id) || zp_get_user_survivor(id))
#else
	if(!is_user_alive(id) && cs_get_user_team(id) == CS_TEAM_T || cs_get_user_team(id) == CS_TEAM_CT)
#endif
	{
		set_task(get_pcvar_float(res_time),"respawn_event", id)
	} else {
		set_task(5.0,"respawn_check",id)
	}
}

public force_respawn(id)
{
	if(!get_pcvar_num(on_res) || is_user_alive(id)) return
	remove_task(id)
	respawn_event(id)
}

#if defined RANDOM_SPAWNS
public admin_add_spawn(id,level,cid)
{
	if(!cmd_access(id,level,cid,1)) return PLUGIN_HANDLED
	
	if(total_spawns == MAX_SPAWNS)
	{
		console_print(id,"[RESPAWN] Spawn limit exceeded! Maximum amount of spawn points is: %i.",MAX_SPAWNS)
		return PLUGIN_HANDLED
	}
	
	static Float:origin[3],Float:angles[3],Float:vangles[3]
	pev(id,pev_origin,origin)
	pev(id,pev_angles,angles)
	pev(id,pev_v_angle,vangles)
	
	save_spawn(id,origin,angles,vangles)
	
	return PLUGIN_HANDLED
}

public save_spawn(id,Float:origin[3],Float:angles[3],Float:vangles[3])
{
	static save
	save = fopen(spawn_file,"at")
	if(save)
	{
		fprintf(save,"%.0f %.0f %.0f %.0f %.0f %.0f %.0f %.0f %.0f 0^n",origin[0],origin[1],origin[2], angles[0],angles[1],angles[2], vangles[0],vangles[1],vangles[2])
		fclose(save)
		
		console_print(id,"[RESPAWN] New random spawn point added at (%.0f , %.0f , %.0f) successfully!",origin[0],origin[1],origin[2])
		console_print(id,"[RESPAWN] Angles: (%.0f , %.0f , %.0f)",angles[0],angles[1],angles[2])
		console_print(id,"[RESPAWN] View Angles: (%.0f , %.0f , %.0f)",vangles[0],vangles[1],vangles[2])
		load_random_spawns()
	}
}

public load_random_spawns()
{
	total_spawns = 0
	
	static buffer[34], x[12],y[12],z[12], x_ang[12],y_ang[12],z_ang[12], x_vang[12],y_vang[12],z_vang[12]
	
	if(file_exists(spawn_file))
	{
		new save = fopen(spawn_file,"rt")
		
		if(!save) return
		
		while(!feof(save))
		{
			if(total_spawns == MAX_SPAWNS) break
			
			fgets(save,buffer,33)
			
			if(buffer[0] == ';' || !buffer[0]) continue
			
			parse(buffer, x,11,y,11,z,11, x_ang,11,y_ang,11,z_ang,11, x_vang,11,y_vang,11,z_vang,11)
			
			spawn_coord_data[COORD_ORIGIN][total_spawns][0] = str_to_float(x)
			spawn_coord_data[COORD_ORIGIN][total_spawns][1] = str_to_float(y)
			spawn_coord_data[COORD_ORIGIN][total_spawns][2] = str_to_float(z)
			
			spawn_coord_data[COORD_ANGLES][total_spawns][0] = str_to_float(x_ang)
			spawn_coord_data[COORD_ANGLES][total_spawns][1] = str_to_float(y_ang)
			spawn_coord_data[COORD_ANGLES][total_spawns][2] = str_to_float(z_ang)
			
			spawn_coord_data[COORD_VANGLES][total_spawns][0] = str_to_float(x_vang)
			spawn_coord_data[COORD_VANGLES][total_spawns][1] = str_to_float(y_vang)
			spawn_coord_data[COORD_VANGLES][total_spawns][2] = str_to_float(z_vang)
			
			total_spawns++
		}
		
		fclose(save)
	}
}

// Check if a player is stuck (credits to VEN)
stock is_player_stuck(id)
{
	static Float:originF[3]
	pev(id, pev_origin, originF)
	
	engfunc(EngFunc_TraceHull, originF, originF, 0, (pev(id, pev_flags) & FL_DUCKING) ? HULL_HEAD : HULL_HUMAN, id, 0)
	
	if (get_tr2(0, TraceResult:TR_StartSolid) || get_tr2(0, TraceResult:TR_AllSolid) || !get_tr2(0, TraceResult:TR_InOpen))
		return true;
	
	return false;
}
#endif

Аватар
cgozzie
Извън линия
Потребител
Потребител
Мнения: 1318
Регистриран на: 13 Окт 2016, 22:10
Местоположение: Варна
Се отблагодари: 244 пъти
Получена благодарност: 42 пъти

Преработка на respawn protection+hud hudmessage

Мнение от cgozzie » 29 Ное 2021, 20:12

Супер е благодаря ти..
Изображение

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

Обратно към “Заявки за плъгини”

Кой е на линия

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