| natkemon |
03-13-2011 03:48 |
[help] Press to respawn.
Instead of the 3 second countdown to be respawned automatically.. How can I make so they have to press "j" on the keyboard to respawn... Like a BIND thats automatically set as soon as you enter the server.
PHP Code:
#include <amxmodx> #include <amxmisc> #include <fakemeta> #include <hamsandwich>
#define PLUGIN "cod4 Respawn" #define VERSION "1.2" #define AUTHOR "FreeStylez"
#define RESPAWNTIME 3 #define RESPAWNPUNISH 10
new uRespawn[33], uPunish[33]
#define MAX_SPAWNS 60 new g_TotalSpawns = 0; new Float:g_SpawnVecs[MAX_SPAWNS][3]; new Float:g_SpawnAngles[MAX_SPAWNS][3]; new Float:g_SpawnVAngles[MAX_SPAWNS][3];
public plugin_init() { register_plugin(PLUGIN, VERSION, AUTHOR) register_event("RoundTime", "onRound", "b") register_event("DeathMsg", "onKilled", "a") register_clcmd("say /respawn", "preCheckRespawn") readSpawns() }
public onRound(id) { if(!is_user_alive(id)) return PLUGIN_CONTINUE if(task_exists(id)) remove_task(id) if(task_exists(id+33)) remove_task(id+33) set_task(0.1, "spawn_Preset", id+33) return PLUGIN_HANDLED }
public onKilled() { new attacker = read_data(1) new id = read_data(2) if(id==attacker || (get_user_team(id)==get_user_team(attacker) && !get_cvar_num("mp_friendlyfire"))) { uPunish[attacker]++ } if(is_user_connected(id)) { if(uPunish[id] == 0) uRespawn[id] = RESPAWNTIME else uRespawn[id] = RESPAWNPUNISH * uPunish[id] set_task(0.2, "checkRespawn", id); return PLUGIN_HANDLED } return PLUGIN_HANDLED }
public preCheckRespawn(id) { if(!is_user_connected(id) || task_exists(id) || task_exists(id+33) || is_user_alive(id) ) return PLUGIN_HANDLED checkRespawn(id) return PLUGIN_HANDLED }
public checkRespawn(id) { if(!is_user_connected(id) || is_user_alive(id) || (get_user_team(id) != 1 && get_user_team(id) != 2)) return PLUGIN_CONTINUE client_print(id, print_center, "%d Seconds Until Respawn", uRespawn[id]) uRespawn[id]-- if(uRespawn[id]<0) respawnPlayer(id) else set_task(1.0, "checkRespawn", id) return PLUGIN_HANDLED }
public respawnPlayer(id) { if(!is_user_connected(id) || is_user_alive(id) ) return PLUGIN_CONTINUE ExecuteHam(Ham_CS_RoundRespawn, id); uPunish[id] = 0 return PLUGIN_HANDLED }
//CSDM + COD Style Respawn
stock trace_hull(const Float:origin[3], hull, ignoredent = 0, ignoremonsters = 0) { new tr = 0, result = 0 engfunc(EngFunc_TraceHull, origin, origin, ignoremonsters, hull, ignoredent > 0 ? ignoredent : 0, tr) if (get_tr2(tr, TR_StartSolid)) result += 1 if (get_tr2(tr, TR_AllSolid)) result += 2 if (!get_tr2(tr, TR_InOpen)) result += 4 return result }
readSpawns(){ //-617 2648 179 16 -22 0 0 -5 -22 0 // Origin (x,y,z), Angles (x,y,z), vAngles(x,y,z), Team (0 = ALL) - ignore // :TODO: Implement team specific spawns 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); // Origin 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]) //Angles 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]) //v-Angles g_SpawnVAngles[g_TotalSpawns][0] = str_to_float(pos[8]) g_SpawnVAngles[g_TotalSpawns][1] = str_to_float(pos[9]) g_SpawnVAngles[g_TotalSpawns][2] = str_to_float(pos[10]) //Team - ignore - 7 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) { id-=33 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 //cache locations get_players(players, num) for (new i=0; i<num; i++) { if (is_user_alive(players[i]) && players[i] != id) { pev(players[i], pev_origin, loc[locnum]) locnum++ } } num = 0 while (num <= g_TotalSpawns) { //have we visited all the spawns yet? if (num == g_TotalSpawns) break; //get a random spawn n = random_num(0, g_TotalSpawns-1) //have we visited this spawn yet? if (!list[n]) { //yes, set the flag to true, and inc the number of spawns we've visited list[n] = 1 num++ } else { //this was a useless loop, so add to the infinite loop prevention counter total++; if (total > 100) // don't search forever break; continue; //don't check again } 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) { //invalidate final = -1 break; } } if (final != -1) break } if (final != -1) { new Float:mins[3], Float:maxs[3] pev(id, pev_mins, mins) pev(id, pev_maxs, maxs) engfunc(EngFunc_SetSize, id, mins, maxs) engfunc(EngFunc_SetOrigin, id, g_SpawnVecs[final]) set_pev(id, pev_fixangle, 1) set_pev(id, pev_angles, g_SpawnAngles[final]) set_pev(id, pev_v_angle, g_SpawnVAngles[final]) set_pev(id, pev_fixangle, 1) return PLUGIN_HANDLED } return PLUGIN_CONTINUE }
|