/* Edit for Zombie Plague by CHyCMyMpNk */
/* Work only for Swarm Round */
#include <amxmodx>
#include <amxmisc>
#include <cstrike>
#include <engine>
#include <fun>
#include <zombieplague>
#define PLUGNAME "[ZP] Swarm Round Respawning"
#define AUTHOR "Emp`"
#define VERSION "1.31"
#define MAX_SPAWNS 60
#define MAX_SPEAK 10
new Float:ZPSRtime[33]
new SOrigin[33][3];
new Float:g_SpawnVecs[MAX_SPAWNS][3];
new Float:g_SpawnAngles[MAX_SPAWNS][3];
new Float:g_SpawnVAngles[MAX_SPAWNS][3];
new g_TotalSpawns;
new zp_SRRespawn, zp_SRRspawns, zp_SRRtime, zp_SRRmaxtime
public plugin_init()
{
register_plugin(PLUGNAME, VERSION, AUTHOR)
zp_SRRespawn = register_cvar("zp_SRRespawn", "1")
zp_SRRspawns = register_cvar("zp_SRRspawns", "0")
zp_SRRtime = register_cvar("zp_SRRtime", "10.0")
zp_SRRmaxtime = register_cvar("zp_SRRmaxtime", "3.0")
register_event("DeathMsg","DeathEvent","a")
readSpawns()
set_msg_block(get_user_msgid("ClCorpse"), BLOCK_SET);
}
readSpawns()
{
new Map[32], config[32], MapFile[64];
get_mapname(Map, 31)
get_configsdir(config, 31 )
format(MapFile, 63, "%s\csdm\%s.spawns.cfg", config, Map);
g_TotalSpawns = 0;
if (file_exists(MapFile))
{
new Data[124], len;
new line = 0;
new pos[12][8];
while(g_TotalSpawns < MAX_SPAWNS && (line = read_file(MapFile , line , Data , 123 , len) ) != 0 )
{
if (strlen(Data)<2 || Data[0] == '[')
continue;
parse(Data, pos[1], 7, pos[2], 7, pos[3], 7, pos[4], 7, pos[5], 7, pos[6], 7, pos[7], 7, pos[8], 7, pos[9], 7, pos[10], 7);
g_SpawnVecs[g_TotalSpawns][0] = str_to_float(pos[1]);
g_SpawnVecs[g_TotalSpawns][1] = str_to_float(pos[2]);
g_SpawnVecs[g_TotalSpawns][2] = str_to_float(pos[3]);
g_SpawnAngles[g_TotalSpawns][0] = str_to_float(pos[4]);
g_SpawnAngles[g_TotalSpawns][1] = str_to_float(pos[5]);
g_SpawnAngles[g_TotalSpawns][2] = str_to_float(pos[6]);
g_SpawnVAngles[g_TotalSpawns][0] = str_to_float(pos[7]);
g_SpawnVAngles[g_TotalSpawns][1] = str_to_float(pos[8]);
g_SpawnVAngles[g_TotalSpawns][2] = str_to_float(pos[9]);
g_TotalSpawns++;
}
log_amx("Loaded %d spawn points for map %s.", g_TotalSpawns, Map)
} else {
log_amx("No spawn points file found (%s)", MapFile)
}
return 1;
}
public spawn_Preset(id)
{
if (g_TotalSpawns < 2)
return PLUGIN_CONTINUE
new list[MAX_SPAWNS];
new num = 0;
new final = -1;
new total=0;
new players[32], n, x = 0;
new Float:loc[32][3], locnum
get_players(players, num)
for (new i=0; i<num; i++)
{
if (is_user_alive(players[i]) && players[i] != id)
{
entity_get_vector(players[i], EV_VEC_origin, loc[locnum])
locnum++
}
}
num = 0
while (num <= g_TotalSpawns)
{
if (num == g_TotalSpawns)
break;
n = random_num(0, g_TotalSpawns-1);
if (!list[n])
{
list[n] = 1;
num++;
}
else
{
total++;
if (total > 100)
break;
continue;
}
new trace = trace_hull(g_SpawnVecs[n],1);
if (trace)
continue;
if (locnum < 1)
{
final = n
break
}
final = n
for (x = 0; x < locnum; x++)
{
new Float:distance = get_distance_f(g_SpawnVecs[n], loc[x]);
if (distance < 250.0)
{
final = -1;
break;
}
}
if (final != -1)
break
}
if (final != -1)
{
entity_set_origin(id, g_SpawnVecs[final]);
entity_set_int(id, EV_INT_fixangle, 1);
entity_set_vector(id, EV_VEC_angles, g_SpawnAngles[final]);
entity_set_vector(id, EV_VEC_v_angle, g_SpawnVAngles[final]);
entity_set_int(id, EV_INT_fixangle, 1);
return PLUGIN_HANDLED
}
return PLUGIN_CONTINUE
}
public DeathEvent()
{
new attacker = read_data(1)
new id = read_data(2)
if(get_pcvar_num(zp_SRRespawn)<1) return PLUGIN_CONTINUE
if(1>get_user_team(id)>2) return PLUGIN_CONTINUE
switch(get_pcvar_num(zp_SRRespawn))
{
case 2:{
if(is_user_connected(attacker)){
if(get_user_team(id)==get_user_team(attacker) || id==attacker){
ZPSRtime[attacker] += get_pcvar_num(zp_SRRtime)
if(ZPSRtime[attacker] > get_pcvar_num(zp_SRRmaxtime))
ZPSRtime[attacker] = get_pcvar_float(zp_SRRmaxtime)
}
}
}
case 1:{
if(is_user_alive(attacker)){
ZPSRtime[attacker] -= get_pcvar_num(zp_SRRtime)
if(ZPSRtime[attacker]<1.0)
ZPSRtime[attacker] = 1.0
}
ZPSRtime[id] += get_pcvar_num(zp_SRRtime)
if(ZPSRtime[id] > get_pcvar_num(zp_SRRmaxtime))
ZPSRtime[id] = get_pcvar_float(zp_SRRmaxtime)
}
default: return PLUGIN_CONTINUE
}
new time = floatround(ZPSRtime[id]) + 1
new parm[2]
parm[0] = id
parm[1] = time
set_task(0.1,"check_respawn",0,parm,2)
return PLUGIN_CONTINUE
}
public check_respawn(parm[])
{
new id = parm[0]
parm[1]--
if(is_user_alive(id) || !zp_is_swarm_round())
return
if(parm[1]==0){
respawn(id)
}
else{
if(parm[1]<MAX_SPEAK){
new speak[30]
num_to_word(parm[1], speak, 29)
client_cmd(id,"spk ^"fvox/%s^"",speak)
}
client_print(id, print_center, "[ZP] Ujra fogsz eledni %d masodperc mulva.", parm[1])
set_task(1.0,"check_respawn",0,parm,2)
}
}
public respawn(id)
{
if(is_user_alive(id) || !is_user_connected(id) || !zp_is_swarm_round()) return -1
new team = get_user_team(id)
if(team==1 || team==2) {
new parm[2]
parm[0] = id
parm[1] = 0
set_task( 0.5, "actual_revive", 1, parm, 2)
parm[1] = 1
set_task( 0.7, "actual_revive", 1, parm, 2)
return 1
}
return 0
}
public actual_revive(parm[])
{
new id = parm[0], a = parm[1]
spawn(id)
if(a==0)
get_user_origin(id, SOrigin[id])
else {
if(get_pcvar_num(zp_SRRspawns) > 0)
spawn_Preset(id)
else
set_user_origin(id, SOrigin[id])
}
}
public client_connect(id)
{
ZPSRtime[id] = get_pcvar_float(zp_SRRtime)
}
public client_putinserver(id)
{
set_task(1.0,"first_respawn",id)
}
public first_respawn(id)
{
if(!respawn(id))
set_task(1.0,"first_respawn",id)
}