| steve139 |
09-04-2008 11:13 |
Re: find all entity in sphere
1 Attachment(s)
here is the .sma
(or in .sma attached)
i want this due to the
fm_find_ent_in_sphere(id, origin, 8.0)
return first ent found in sphere but there is some map witch this return an other ent all time instead of witch i want :cry:
PHP Code:
#include <amxmodx> #include <amxmisc>
#include <hamsandwich>
#include <fakemeta> #include <fakemeta_util>
new g_grabBeam[] = "sprites/laserbeam.spr" new g_PainSound[] = "player/PL_PAIN2.WAV"
#define MAX_ENTS 256 #define MAX_KEYVALUES 16
#define MAX_MODELS_TO_GRAB 1 new g_modelToGrab[MAX_MODELS_TO_GRAB][] = { "models/w_" } #define MAX_CLASSNAMES_TO_GRAB 9 new g_classnameToGrab[MAX_CLASSNAMES_TO_GRAB][] = { "weaponbox", "grenade", "func_breakable", "func_ladder", "csdm", "bullet", "rocket", "dookie", "piss_puddle" }
#define MAX_MASSMOVE_ENTS 16
new grabbed[33] new grabbedIsBrush[33]
new grabbedNoClip[33] new grabbedCopyEnt[33]
new grabbedOldMoveType[33][MAX_MASSMOVE_ENTS] new grabbedOldSolid[33][MAX_MASSMOVE_ENTS]
new grabbedOldFlags[33][MAX_MASSMOVE_ENTS] new grabbedOldRender[33][MAX_MASSMOVE_ENTS][6]
new grablength[33] new bool:grabmodeon[33]
new g_massMoveEnts[33][MAX_MASSMOVE_ENTS] new g_massMoveNum[33]
new bool:g_massMoveOn[33] new Float:g_massMoveOldOrigin[33][3]
new g_maxents new g_maxplayers
new velocity_multiplier new laserbeam
//Pcvars new grab_force new grab_glow
new grab_red new grab_green
new grab_blue new grab_transp
new grab_beam
new const BOUNDS = 3
new pushpull_speed
#if !defined ADMIN_SUPREME #define ADMIN_SUPREME (1<<24) #endif
public plugin_init() { register_plugin("Ultimate JediGrab", "1.2", "KRoT@L / SpaceDude") register_cvar("sv_force","0") grab_force = register_cvar("sv_grab_force", "10") grab_glow = register_cvar("sv_grab_glow", "1")
grab_red = register_cvar("sv_grab_red", "0") grab_green = register_cvar("sv_grab_green", "255") grab_blue = register_cvar("sv_grab_blue", "128") grab_transp = register_cvar("sv_grab_transp", "32")
grab_beam = register_cvar("sv_grab_beam", "1")
pushpull_speed = register_cvar("sv_pushpull_speed", "35") register_clcmd("+force", "grab", ADMIN_KICK, "Bind a key to +force") register_clcmd("-force", "release", ADMIN_KICK)
register_clcmd("+pull", "startpull", ADMIN_KICK, "Bind a key to +pull") register_clcmd("-pull", "stopdist", ADMIN_KICK) register_clcmd("+push", "startpush", ADMIN_KICK, "Bind a key to +push") register_clcmd("-push", "stopdist", ADMIN_KICK)
register_event("StatusValue","spec_event","be","1=2")
RegisterHam(Ham_Killed, "player", "death_event", 1) RegisterHam(Ham_Spawn, "player", "fwd_Ham_Spawn_post", 1)
g_maxents = global_get(glb_maxEntities) g_maxplayers = get_maxplayers()
new Float:ori[3], i for(i = g_maxplayers+1; i <= g_maxents; i++) { if(pev_valid(i)) { pev(i, pev_origin, ori) if((pev(i, pev_solid) == SOLID_BSP && pev(i, pev_movetype) == MOVETYPE_PUSH) || (ori[0] == 0.0 && ori[1] == 0.0 && ori[2] == 0.0)) { set_pev(i, pev_iuser4, 99) } } } }
public plugin_precache() { if(cvar_exists("amxmod_version")) server_cmd("quit")
register_forward(FM_KeyValue, "fwd_KeyValue_Post", 1) laserbeam = precache_model(g_grabBeam) precache_sound(g_PainSound)
}
setOldRendering(id, ent, pos) fm_set_rendering(ent, grabbedOldRender[id][pos][0], grabbedOldRender[id][pos][1], grabbedOldRender[id][pos][2], grabbedOldRender[id][pos][3], grabbedOldRender[id][pos][4], grabbedOldRender[id][pos][5])
makeBounds(Float:traceEnds[8][3], Float:origin[3]) { traceEnds[0][0] = origin[0] - BOUNDS traceEnds[0][1] = origin[1] - BOUNDS
traceEnds[0][2] = origin[2] - BOUNDS traceEnds[1][0] = origin[0] - BOUNDS
traceEnds[1][1] = origin[1] - BOUNDS traceEnds[1][2] = origin[2] + BOUNDS
traceEnds[2][0] = origin[0] + BOUNDS traceEnds[2][1] = origin[1] - BOUNDS
traceEnds[2][2] = origin[2] + BOUNDS traceEnds[3][0] = origin[0] + BOUNDS
traceEnds[3][1] = origin[1] - BOUNDS traceEnds[3][2] = origin[2] - BOUNDS
traceEnds[4][0] = origin[0] - BOUNDS traceEnds[4][1] = origin[1] + BOUNDS
traceEnds[4][2] = origin[2] - BOUNDS traceEnds[5][0] = origin[0] - BOUNDS
traceEnds[5][1] = origin[1] + BOUNDS traceEnds[5][2] = origin[2] + BOUNDS
traceEnds[6][0] = origin[0] + BOUNDS traceEnds[6][1] = origin[1] + BOUNDS
traceEnds[6][2] = origin[2] + BOUNDS traceEnds[7][0] = origin[0] + BOUNDS
traceEnds[7][1] = origin[1] + BOUNDS traceEnds[7][2] = origin[2] - BOUNDS
return 1 } /* is_allowed_ent(entid) { new classname[33] pev(entid,pev_classname,classname,32) if(equal(classname,"tf_weapon_caltrop")) return 1 else if(equal(classname,"tf_weapon_concussiongrenade")) return 1 else if(equal(classname,"tf_weapon_normalgrenade")) return 1 else if(equal(classname,"tf_weapon_nailgrenade")) return 1 else if(equal(classname,"tf_weapon_mirvgrenade")) return 1 else if(equal(classname,"tf_weapon_mirvbomblet")) return 1 else if(equal(classname,"tf_weapon_napalmgrenade")) return 1 else if(equal(classname,"tf_weapon_empgrenade")) return 1 else if(equal(classname,"building_dispenser")) return 1 else if(equal(classname,"building_teleporter")) return 1 else if(equal(classname,"tf_gl_pipebomb")) return 1 else if(equal(classname,"tf_gl_grenade")) return 1 else if(equal(classname,"tf_weapon_gasgrenade")) return 1 else if(equal(classname,"tf_weapon_caltrop")) return 1 else if(equal(classname,"player")) return 1 else if(equal(classname,"monster_turret")) return 1 else if(equal(classname,"monster_miniturret")) return 1 else if(equal(classname,"monster_sentry")) return 1 else if(equal(classname,"detpack")) return 1
return 0 }*/
is_allowed_ent(entid) { new classname[33] pev(entid,pev_classname,classname,32) if(contain(classname, "tf_weapon") != -1) return 1 else if(equal(classname,"building_dispenser")) return 1 else if(equal(classname,"building_teleporter")) return 1 else if(equal(classname,"tf_gl_pipebomb")) return 1 else if(equal(classname,"tf_gl_grenade")) return 1 else if(equal(classname,"player")) return 1 if(contain(classname, "monster_") != -1) return 1 else if(equal(classname,"detpack")) return 1
return 0 } public grabtask(parm[]) { new id = parm[0] if (!grabbed[id]) { new targetid = 0 new body
get_user_aiming(id, targetid, body) if(targetid) { set_grabbed(id, targetid) }
else { new iOrigin[3], Float:origin[3] get_user_origin(id, iOrigin, 3)
IVecFVec(iOrigin, origin)
new string[64], i //- //targetid = fm_find_ent_in_sphere(id, origin, 8.0) targetid = fm_find_ent_in_sphere2(origin, 8.0) while(targetid > 0) { string[0] = '^0' pev(targetid, pev_model, string, 63)
for(i = 0; i < MAX_MODELS_TO_GRAB; i++) { if(containi(string, g_modelToGrab[i]) != -1) { set_grabbed(id, targetid) return 0 } }
string[0] = '^0' pev(targetid, pev_classname, string, 63)
for(i = 0; i < MAX_CLASSNAMES_TO_GRAB; i++) { set_grabbed(id, targetid) return 0 } } //targetid = fm_find_ent_in_sphere(targetid, origin, 8.0) targetid = fm_find_ent_in_sphere2(origin, 8.0) } }
else { if(!pev_valid(grabbed[id])) { release(id) return 0 }
new origin[3], look[3] new direction[3], moveto[3]
new gborigin[3], Float:grabbedorigin[3] new Float:velocity[3], length
get_user_origin(id, origin, 1) get_user_origin(id, look, 3)
if(grabbedIsBrush[id] == 1) fm_get_brush_entity_origin(grabbed[id], grabbedorigin)
else pev(grabbed[id], pev_origin, grabbedorigin)
FVecIVec(grabbedorigin, gborigin)
direction[0] = look[0] - origin[0] direction[1] = look[1] - origin[1] direction[2] = look[2] - origin[2]
length = get_distance(look, origin) if (!length) length = 1
moveto[0] = origin[0] + direction[0] * grablength[id] / length moveto[1] = origin[1] + direction[1] * grablength[id] / length moveto[2] = origin[2] + direction[2] * grablength[id] / length
if(get_pcvar_num(grab_beam)) { message_begin(MSG_PVS, SVC_TEMPENTITY, gborigin)
write_byte(1) write_short(id)
write_coord(gborigin[0]) write_coord(gborigin[1]) write_coord(gborigin[2])
write_short(laserbeam)
write_byte(1) write_byte(1) write_byte(1)
write_byte(6) write_byte(0) write_byte(255)
write_byte(0) write_byte(0) write_byte(128)
write_byte(0) message_end() }
velocity[0] = (moveto[0] - grabbedorigin[0]) * velocity_multiplier velocity[1] = (moveto[1] - grabbedorigin[1]) * velocity_multiplier velocity[2] = (moveto[2] - grabbedorigin[2]) * velocity_multiplier
new not_a_player new Float:fmoveto[3]
IVecFVec(moveto, fmoveto) if(g_massMoveOn[id] == true) { new ent, i new num = g_massMoveNum[id]
new Float:grabbedorigin2[3] for(i = 0; i < num; i++) { ent = g_massMoveEnts[id][i] if(!pev_valid(ent)) continue
not_a_player = !is_user_connected(ent)
if(grabbedNoClip[id] == 1) { IVecFVec(moveto, fmoveto) if(!not_a_player) { set_pev(ent, pev_solid, SOLID_NOT) set_pev(ent, pev_movetype, MOVETYPE_NOCLIP)
if(i == 0) fm_entity_set_origin(ent, fmoveto)
else { pev(ent, pev_origin, grabbedorigin2)
grabbedorigin2[0] += (grabbedorigin[0] - g_massMoveOldOrigin[id][0]) grabbedorigin2[1] += (grabbedorigin[1] - g_massMoveOldOrigin[id][1]) grabbedorigin2[2] += (grabbedorigin[2] - g_massMoveOldOrigin[id][2])
fm_entity_set_origin(ent, grabbedorigin2) } }
else { pev(ent, pev_origin, grabbedorigin2)
grabbedorigin2[0] += (grabbedorigin[0] - g_massMoveOldOrigin[id][0]) grabbedorigin2[1] += (grabbedorigin[1] - g_massMoveOldOrigin[id][1]) grabbedorigin2[2] += (grabbedorigin[2] - g_massMoveOldOrigin[id][2])
new Float:Min[3], Float:Max[3]
pev(grabbed[id], pev_mins, Min) pev(grabbed[id], pev_maxs, Max)
grabbedorigin2[0] -= (Min[0] + Max[0]) * 0.5 grabbedorigin2[1] -= (Min[1] + Max[1]) * 0.5 grabbedorigin2[2] -= (Min[2] + Max[2]) * 0.5
fm_entity_set_origin(grabbed[id], grabbedorigin2) }
continue }
else if(not_a_player) { set_pev(ent, pev_solid, SOLID_BBOX) set_pev(ent, pev_movetype, MOVETYPE_FLY) }
set_pev(ent, pev_velocity, velocity) }
g_massMoveOldOrigin[id][0] = grabbedorigin[0] g_massMoveOldOrigin[id][1] = grabbedorigin[1] g_massMoveOldOrigin[id][2] = grabbedorigin[2] }
else { not_a_player = !is_user_connected(grabbed[id]) if(grabbedNoClip[id] == 1) { IVecFVec(moveto, fmoveto) if(!not_a_player) { set_pev(grabbed[id], pev_solid, SOLID_NOT) set_pev(grabbed[id], pev_movetype, MOVETYPE_NOCLIP)
fm_entity_set_origin(grabbed[id], fmoveto) }
else { new Float:Min[3], Float:Max[3]
pev(grabbed[id], pev_mins, Min) pev(grabbed[id], pev_maxs, Max)
fmoveto[0] -= (Min[0] + Max[0]) * 0.5 fmoveto[1] -= (Min[1] + Max[1]) * 0.5 fmoveto[2] -= (Min[2] + Max[2]) * 0.5
fm_entity_set_origin(grabbed[id], fmoveto) }
return 0 }
else if(not_a_player) { set_pev(grabbed[id], pev_solid, SOLID_BBOX) set_pev(grabbed[id], pev_movetype, MOVETYPE_FLY) }
set_pev(grabbed[id], pev_velocity, velocity) } } return 1 }
public release(id) {
if (grabmodeon[id]) { new Float:origin[3], Float:traceEnds[8][3] if(g_massMoveOn[id] == true) { new ent, i new num = g_massMoveNum[id]
new goToNextEnt = 0
for(i = 0; i < num; i++) { ent = g_massMoveEnts[id][i] if(!pev_valid(ent)) continue
if(grabbedNoClip[id] == 0 && !is_user_connected(ent) && pev(ent, pev_iuser4) != 99) { pev(ent, pev_origin, origin)
makeBounds(traceEnds, origin) for(new j = 0; j < 8; j++) { if(fm_point_contents(traceEnds[j]) == CONTENTS_SOLID) { fm_remove_entity(ent) goToNextEnt = i + 1
break } } }
if(goToNextEnt == i+1) continue
set_pev(ent, pev_flags, grabbedOldFlags[id][i]) set_pev(ent, pev_movetype, grabbedOldMoveType[id][i]) set_pev(ent, pev_solid, grabbedOldSolid[id][i])
setOldRendering(id, ent, i) }
client_print(id,print_chat,"[AMXX] You have released something") }
else if (grabbed[id]) { if(pev_valid(grabbed[id])) { if(grabbedNoClip[id] == 0 && !is_user_connected(grabbed[id]) && pev(grabbed[id], pev_iuser4) != 99) { pev(grabbed[id], pev_origin, origin) makeBounds(traceEnds, origin)
for(new j = 0; j < 8; j++) { if(fm_point_contents(traceEnds[j]) == CONTENTS_SOLID) { client_print(id, print_chat, "[AMXX] You can't release a TRIGGER entity inside something SOLID") return 1 } } }
set_pev(grabbed[id], pev_flags, grabbedOldFlags[id][0]) set_pev(grabbed[id], pev_movetype, grabbedOldMoveType[id][0]) set_pev(grabbed[id], pev_solid, grabbedOldSolid[id][0])
setOldRendering(id, grabbed[id], 0) client_print(id, print_chat, "[AMXX] You have released something") } }
grabmodeon[id] = false grabbed[id] = 0
grabbedCopyEnt[id] = 0 remove_task(100 + id) } return 1 }
public grab(id) { if((get_cvar_num("sv_force") == 0)) { if(!access(id,ADMIN_KICK)) { client_print(id,print_center,"Only admin can use this command") return PLUGIN_HANDLED } } grabbedNoClip[id] = 0 if (!grabmodeon[id]) { client_print(id, print_chat, "[AMXX] Searching for a target") new targetid=0, body
new parm[1] parm[0] = id
velocity_multiplier = get_pcvar_num(grab_force) grabmodeon[id]=true
set_task(0.1, "grabtask", 100 + id, parm, 1, "b") get_user_aiming(id, targetid, body)
if (targetid) {
set_grabbed(id, targetid) return 1 }
else { new iOrigin[3] new Float:origin[3]
get_user_origin(id, iOrigin, 3) IVecFVec(iOrigin, origin)
new string[64], i //targetid = fm_find_ent_in_sphere(id, origin, 8.0) targetid = fm_find_ent_in_sphere2(origin, 8.0)
while(targetid > 0) { string[0] = '^0' pev(targetid, pev_model, string, 63)
for(i = 0; i < MAX_MODELS_TO_GRAB; i++) { if(containi(string, g_modelToGrab[i]) != -1) {
set_grabbed(id, targetid) return 0 } }
string[0] = '^0' pev(targetid, pev_classname, string, 63)
for(i = 0; i < MAX_CLASSNAMES_TO_GRAB; i++) { if(containi(string, g_classnameToGrab[i]) != -1) {
set_grabbed(id, targetid) return 0 } } //targetid = fm_find_ent_in_sphere(targetid, origin, 8.0) targetid = fm_find_ent_in_sphere2(origin, 8.0) } }
}
return 1 }
stock fm_find_ent_in_sphere2(Float:origin[3], Float:range) { new ent = -1 while((ent = engfunc(EngFunc_FindEntityInSphere, ent, origin, range)) != -1) { if((is_allowed_ent(ent) )) { return ent } } return PLUGIN_CONTINUE }
public spec_event(id) { new targetid = read_data(2)
if (!is_user_alive(targetid)) return 0
if (grabmodeon[id] && !grabbed[id]) set_grabbed(id, targetid)
return 0 }
public set_grabbed(id, targetid) { if((!is_allowed_ent(targetid))) return PLUGIN_HANDLED
new origin1[3], origin2[3], Float:forigin2[3] get_user_origin(id, origin1)
pev(targetid, pev_origin, forigin2)
if(!is_user_connected(targetid) && pev(targetid, pev_iuser4) == 99) { fm_get_brush_entity_origin(targetid, forigin2) grabbedIsBrush[id] = 1 }
FVecIVec(forigin2, origin2) g_massMoveOldOrigin[id][0] = forigin2[0] g_massMoveOldOrigin[id][1] = forigin2[1] g_massMoveOldOrigin[id][2] = forigin2[2] grabbed[id] = targetid
grabbedOldMoveType[id][0] = pev(targetid, pev_movetype) grabbedOldSolid[id][0] = pev(targetid, pev_solid) grabbedOldFlags[id][0] = pev(targetid, pev_flags)
if(g_massMoveOn[id] == false) { new Float:color[3] grabbedOldRender[id][0][0] = pev(targetid, pev_renderfx)
pev(targetid, pev_rendercolor, color)
grabbedOldRender[id][0][1] = floatround(color[0]) grabbedOldRender[id][0][2] = floatround(color[1]) grabbedOldRender[id][0][3] = floatround(color[2])
grabbedOldRender[id][0][4] = pev(targetid, pev_rendermode) grabbedOldRender[id][0][5] = pev(targetid, pev_renderamt)
if(get_pcvar_num(grab_glow)) fm_set_rendering(targetid, kRenderFxGlowShell, get_pcvar_num(grab_red), get_pcvar_num(grab_green), get_pcvar_num(grab_blue), kRenderTransAlpha, get_pcvar_num(grab_transp)) }
grablength[id] = get_distance(origin1,origin2)
new classname[32] pev(targetid, pev_classname, classname, 31)
client_print(id, print_chat, "[AMXX] You have grabbed something! (id=%d, classname=%s)", targetid, classname) return 0 }
public disttask(parm[]) { new id = parm[0] if (grabbed[id]) { if (parm[1] == 1) grablength[id] -= get_pcvar_num(pushpull_speed)
else if (parm[1] == 2) grablength[id] += get_pcvar_num(pushpull_speed) } }
public startpull(id) { if((get_cvar_num("sv_force") == 0)) { if(!access(id,ADMIN_KICK)) { client_print(id,print_center,"Only admin can use this command") return PLUGIN_HANDLED } }
if (grabbed[id]) { new parm[2]
parm[0] = id parm[1] = 1
set_task(0.1, "disttask", 500 + id, parm, 2, "b") }
return 1 }
public startpush(id) { if((get_cvar_num("sv_force") == 0)) { if(!access(id,ADMIN_KICK)) { client_print(id,print_center,"Only admin can use this command") return PLUGIN_HANDLED } }
if (grabbed[id]) { new parm[2]
parm[0] = id parm[1] = 2
set_task(0.1, "disttask", 500 + id, parm, 2, "b") }
return 1 }
public stopdist(id, level, cid) { if (!cmd_access(id, level, cid, 1)) return 1
if (grabbed[id]) remove_task(500 + id)
return 1 }
public death_event() { new id = read_data(2) if(!is_user_connected(id)) return 0
if(task_exists(100 + id)) remove_task(100 + id)
if(grabbed[id] > 0 && pev_valid(grabbed[id])) { if(pev_valid(grabbed[id])) { if(grabbedNoClip[id] == 0 && !is_user_connected(grabbed[id]) && pev(grabbed[id], pev_iuser4) != 99) { new Float:origin[3] pev(grabbed[id], pev_origin, origin)
new Float:traceEnds[8][3] makeBounds(traceEnds, origin)
for(new j = 0; j < 8; j++) { if(fm_point_contents(traceEnds[j]) == CONTENTS_SOLID) { fm_remove_entity(grabbed[id]) break } } }
if(pev_valid(grabbed[id])) { set_pev(grabbed[id], pev_flags, grabbedOldFlags[id][0]) set_pev(grabbed[id], pev_movetype, grabbedOldMoveType[id][0]) set_pev(grabbed[id], pev_solid, grabbedOldSolid[id][0])
setOldRendering(id, grabbed[id], 0) } }
if(g_massMoveOn[id] == true) { new ent, i, num = g_massMoveNum[id], goToNextEnt = 0 for(i = 0; i < num; i++) { ent = g_massMoveEnts[id][i] if(!pev_valid(ent)) continue
if(grabbedNoClip[id] == 0 && !is_user_connected(ent) && pev(ent, pev_iuser4) != 99) { pev(ent, pev_origin, origin) makeBounds(traceEnds, origin)
for(new j = 0; j < 8; j++) { if(fm_point_contents(traceEnds[j]) == CONTENTS_SOLID) { fm_remove_entity(ent) goToNextEnt = i + 1
break } } }
if(goToNextEnt == i+1) continue
set_pev(ent, pev_flags, grabbedOldFlags[id][i]) set_pev(ent, pev_movetype, grabbedOldMoveType[id][i]) set_pev(ent, pev_solid, grabbedOldSolid[id][i])
setOldRendering(id, ent, i) } } }
grabbed[id] = 0 grabmodeon[id] = false
new players[32], inum, player get_players(players, inum)
for(new k = 0 ; k < inum ; k++) { player = players[k] if(grabbed[player] == id) { if(task_exists(100 + player)) remove_task(100 + player)
grabbed[player] = 0 grabmodeon[player] = false } }
massrelease(id) return 0 }
public client_kill(id) { if(task_exists(100 + id)) remove_task(100 + id)
if(grabbed[id] > 0 && pev_valid(grabbed[id])) { if(pev_valid(grabbed[id])) { if(grabbedNoClip[id] == 0 && !is_user_connected(grabbed[id]) && pev(grabbed[id], pev_iuser4) != 99) { new Float:origin[3] pev(grabbed[id], pev_origin, origin)
new Float:traceEnds[8][3] makeBounds(traceEnds, origin)
for(new j = 0; j < 8; j++) { if(fm_point_contents(traceEnds[j]) == CONTENTS_SOLID) { fm_remove_entity(grabbed[id]) break } } }
if(pev_valid(grabbed[id])) { set_pev(grabbed[id], pev_flags, grabbedOldFlags[id][0]) set_pev(grabbed[id], pev_movetype, grabbedOldMoveType[id][0]) set_pev(grabbed[id], pev_solid, grabbedOldSolid[id][0])
setOldRendering(id, grabbed[id], 0) } }
if(g_massMoveOn[id] == true) { new ent, i new num = g_massMoveNum[id]
new goToNextEnt = 0
for(i = 0; i < num; i++) { ent = g_massMoveEnts[id][i] if(!pev_valid(ent)) continue
if(grabbedNoClip[id] == 0 && !is_user_connected(ent) && pev(ent, pev_iuser4) != 99) { pev(ent, pev_origin, origin) makeBounds(traceEnds, origin)
for(new j = 0; j < 8; j++) { if(fm_point_contents(traceEnds[j]) == CONTENTS_SOLID) { fm_remove_entity(ent) goToNextEnt = i + 1
break } } }
if(goToNextEnt == i + 1) continue
set_pev(ent, pev_flags, grabbedOldFlags[id][i]) set_pev(ent, pev_movetype, grabbedOldMoveType[id][i]) set_pev(ent, pev_solid, grabbedOldSolid[id][i])
setOldRendering(id, ent, i)
} } }
grabbed[id] = 0 grabmodeon[id] = false
new players[32], inum, player get_players(players, inum)
for(new k = 0 ; k < inum ; k++) { player = players[k] if(grabbed[player] == id) { if(task_exists(100 + player)) remove_task(100 + player)
grabbed[player] = 0 grabmodeon[player] = false } }
massrelease(id) return 0 }
public client_connect(id) { if(task_exists(100 + id)) remove_task(100 + id)
grabbed[id] = 0 grabmodeon[id] = false }
public client_disconnect(id) { if(task_exists(100 + id)) remove_task(100 + id)
if(grabbed[id] > 0 && pev_valid(grabbed[id])) { if(pev_valid(grabbed[id])) { if(grabbedNoClip[id] == 0 && !is_user_connected(grabbed[id]) && pev(grabbed[id], pev_iuser4) != 99) { new Float:origin[3] pev(grabbed[id], pev_origin, origin)
new Float:traceEnds[8][3] makeBounds(traceEnds, origin)
for(new j = 0; j < 8; j++) { if(fm_point_contents(traceEnds[j]) == CONTENTS_SOLID) { fm_remove_entity(grabbed[id]) break } } }
if(pev_valid(grabbed[id])) { set_pev(grabbed[id], pev_flags, grabbedOldFlags[id][0]) set_pev(grabbed[id], pev_movetype, grabbedOldMoveType[id][0]) set_pev(grabbed[id], pev_solid, grabbedOldSolid[id][0])
setOldRendering(id, grabbed[id], 0) } }
if(g_massMoveOn[id] == true) { new ent, i new num = g_massMoveNum[id]
new goToNextEnt = 0 for(i = 0; i < num; i++) { ent = g_massMoveEnts[id][i] if(!pev_valid(ent)) continue
if(grabbedNoClip[id] == 0 && !is_user_connected(ent) && pev(ent, pev_iuser4) != 99) { pev(ent, pev_origin, origin) makeBounds(traceEnds, origin)
for(new j = 0; j < 8; j++) { if(fm_point_contents(traceEnds[j]) == CONTENTS_SOLID) { fm_remove_entity(ent) goToNextEnt = i + 1
break } } }
if(goToNextEnt == i + 1) continue
set_pev(ent, pev_flags, grabbedOldFlags[id][i]) set_pev(ent, pev_movetype, grabbedOldMoveType[id][i]) set_pev(ent, pev_solid, grabbedOldSolid[id][i])
setOldRendering(id, ent, i) } } }
grabbed[id] = 0 grabmodeon[id] = false
massrelease(id) }
massrelease(id) { g_massMoveOn[id] = false new num = g_massMoveNum[id]
if(num > 1) { new i, ent setOldRendering(id, ent, 0)
new Float:origin[3] new Float:traceEnds[8][3], goToNextEnt = 0
for(i = 1; i < num; i++) { ent = g_massMoveEnts[id][i] if(!pev_valid(ent)) continue
if(grabbedNoClip[id] == 0 && !is_user_connected(ent) && pev(ent, pev_iuser4) != 99) { pev(ent, pev_origin, origin) makeBounds(traceEnds, origin)
for(new j = 0; j < 8; j++) { if(fm_point_contents(traceEnds[j]) == CONTENTS_SOLID) { fm_remove_entity(ent) goToNextEnt = i + 1
break } } }
if(goToNextEnt == i + 1) continue
set_pev(ent, pev_movetype, grabbedOldMoveType[id][i]) set_pev(ent, pev_solid, grabbedOldSolid[id][i]) set_pev(ent, pev_flags, grabbedOldFlags[id][i])
setOldRendering(id, ent, i) } }
g_massMoveNum[id] = 0 }
|