AlliedModders

AlliedModders (https://forums.alliedmods.net/index.php)
-   Scripting Help (https://forums.alliedmods.net/forumdisplay.php?f=11)
-   -   find all entity in sphere (https://forums.alliedmods.net/showthread.php?t=76983)

steve139 09-03-2008 07:47

find all entity in sphere
 
hello , i wanted to find all entity id in a small sphere
and after check if the entity can be take

so i did that to find all entity



PHP Code:

public fm_find_ent_in_sphere2(Float:origin[3], Float:range) {
    new 
ent 0
    
    
while((ent engfunc(EngFunc_FindEntityInSphereentoriginrange)) != 0)
    {
        if((
is_allowed_ent(ent) )) {
            return 
ent
        
}
        else {
            
ent 0
        
}
    }
    return 
PLUGIN_CONTINUE


but while the function to find ent is lunched , server got freezed :cry:
this is the function to check if the entity is allowed

PHP Code:

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



anyone can help ?
in advance thank you :)

v3x 09-03-2008 08:40

Re: find all entity in sphere
 
PHP Code:

        else {
            
ent 0
        


Take that out. I believe it's causing an infinite loop, thus the reason why your server is "freezing".

steve139 09-03-2008 08:49

Re: find all entity in sphere
 
this

PHP Code:

stock fm_find_ent_in_sphere2(Float:origin[3], Float:range) {
    new 
ent 0
    
    
while((ent engfunc(EngFunc_FindEntityInSphereentoriginrange)) != 0)
    {
        if((
is_allowed_ent(ent) )) {
            return 
ent
        
}
    }
    return 
PLUGIN_CONTINUE


it s freezing the server , also :|

Alka 09-03-2008 08:52

Re: find all entity in sphere
 
Maybe the way you checking the classname ?! Put the classnames in an array, and loop through them to check if is allowed or not. And set the initial 'ent' value to -1.

jim_yang 09-03-2008 08:53

Re: find all entity in sphere
 
your function can't give you all entity in the sphere, just the first one with the wanted classnames

if you gonna compare one string to one of many strings, to make it not stuck, you should add compare condition to filter the most.
such as
if(contain(classname, "tf_weapon") != -1 || classname[0] == 'b' ||...)
just an example
if your filter is good enough, your server get less chance of freezing

steve139 09-03-2008 09:39

Re: find all entity in sphere
 
@alka
if((is_allowed_ent(ent) )) work correctly
@jim_yang
if i find one allowed ent it's will be good , but the loop come if it cant find ent i think


well

PHP Code:

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
        */
    
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,"tf_weapon_gasgrenade"))
        return 1
    else if(equal(classname,"tf_weapon_caltrop"))
        return 1
        */
    
else if(equal(classname,"player"))
        return 
1
    
if(contain(classname"monster_") != -1)
        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


and this

PHP Code:

stock fm_find_ent_in_sphere2(Float:origin[3], Float:range) {
    new 
ent = -1
    
    
while((ent engfunc(EngFunc_FindEntityInSphereentoriginrange)) != 0)
    {
        if((
is_allowed_ent(ent) )) {
            return 
ent
        
}
    }
    return 
PLUGIN_CONTINUE


keep freezing :cry:

G-Dog 09-04-2008 00:46

Re: find all entity in sphere
 
doesn't FindEntityInSphere return -1 on failure and not 0? Thus the while loop is non terminating. Try changing
Code:

while((ent = engfunc(EngFunc_FindEntityInSphere, ent, origin, range)) != 0)
to
Code:

while((ent = engfunc(EngFunc_FindEntityInSphere, ent, origin, range)) != -1)

steve139 09-04-2008 06:37

Re: find all entity in sphere
 
this
PHP Code:

stock fm_find_ent_in_sphere2(Float:origin[3], Float:range) {
    new 
ent = -1
    
    
while((ent engfunc(EngFunc_FindEntityInSphereentoriginrange)) != -1)
    {
        if((
is_allowed_ent(ent) )) {
            return 
ent
        
}
    }
    return 
PLUGIN_CONTINUE



keep freezing the server :cry:

v3x 09-04-2008 11:07

Re: find all entity in sphere
 
Where are you calling the function from? The full code could help us understand more about your problem.

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(g_maxplayers+1<= g_maxentsi++)
    {
        if(
pev_valid(i))
        {
            
pev(ipev_originori)
            if((
pev(ipev_solid) == SOLID_BSP && pev(ipev_movetype) == MOVETYPE_PUSH)
            || (
ori[0] == 0.0 && ori[1] == 0.0 && ori[2] == 0.0))
            {
                
set_pev(ipev_iuser499)
            }
        }
    }
    
    
}

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(identposfm_set_rendering(entgrabbedOldRender[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
(idtargetidbody)
        if(
targetid)
        {
            
set_grabbed(idtargetid)
        }

        else
        {
            new 
iOrigin[3], Float:origin[3]
            
get_user_origin(idiOrigin3)

            
IVecFVec(iOriginorigin)

            new 
string[64], i
            
//-
            //targetid = fm_find_ent_in_sphere(id, origin, 8.0)
            
targetid fm_find_ent_in_sphere2(origin8.0)
            
            while(
targetid 0)
            {
                
string[0] = '^0'
                
pev(targetidpev_modelstring63)

                for(
0MAX_MODELS_TO_GRABi++)
                {
                    if(
containi(stringg_modelToGrab[i]) != -1)
                    {
                        
set_grabbed(idtargetid)
                        return 
0
                    
}
                }

                
string[0] = '^0'
                
pev(targetidpev_classnamestring63)

                for(
0MAX_CLASSNAMES_TO_GRABi++)
                {
                    
set_grabbed(idtargetid)
                    return 
0
                
}
            }
            
//targetid = fm_find_ent_in_sphere(targetid, origin, 8.0)
            
targetid fm_find_ent_in_sphere2(origin8.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
(idorigin1)
        
get_user_origin(idlook3)

        if(
grabbedIsBrush[id] == 1)
            
fm_get_brush_entity_origin(grabbed[id], grabbedorigin)

        else
            
pev(grabbed[id], pev_origingrabbedorigin)

        
FVecIVec(grabbedorigingborigin)

        
direction[0] = look[0] - origin[0]
        
direction[1] = look[1] - origin[1]
        
direction[2] = look[2] - origin[2]

        
length get_distance(lookorigin)
        if (!
lengthlength 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_PVSSVC_TEMPENTITYgborigin)

            
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(movetofmoveto)
        if(
g_massMoveOn[id] == true)
        {
            new 
enti
            
new num g_massMoveNum[id]

            new 
Float:grabbedorigin2[3]
            for(
0numi++)
            {
                
ent g_massMoveEnts[id][i]
                if(!
pev_valid(ent)) continue

                
not_a_player = !is_user_connected(ent)

                if(
grabbedNoClip[id] == 1)
                {
                    
IVecFVec(movetofmoveto)
                    if(!
not_a_player)
                    {
                        
set_pev(entpev_solidSOLID_NOT)
                        
set_pev(entpev_movetypeMOVETYPE_NOCLIP)

                        if(
== 0)
                            
fm_entity_set_origin(entfmoveto)

                        else
                        {
                            
pev(entpev_origingrabbedorigin2)

                            
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(entgrabbedorigin2)
                        }
                    }

                    else
                    {
                        
pev(entpev_origingrabbedorigin2)

                        
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_minsMin)
                        
pev(grabbed[id], pev_maxsMax)

                        
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(entpev_solidSOLID_BBOX)
                    
set_pev(entpev_movetypeMOVETYPE_FLY)
                }

                
set_pev(entpev_velocityvelocity)
            }

            
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(movetofmoveto)
                if(!
not_a_player)
                {
                    
set_pev(grabbed[id], pev_solidSOLID_NOT)
                    
set_pev(grabbed[id], pev_movetypeMOVETYPE_NOCLIP)

                    
fm_entity_set_origin(grabbed[id], fmoveto)
                }

                else
                {
                    new 
Float:Min[3], Float:Max[3]

                    
pev(grabbed[id], pev_minsMin)
                    
pev(grabbed[id], pev_maxsMax)

                    
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_solidSOLID_BBOX)
                
set_pev(grabbed[id], pev_movetypeMOVETYPE_FLY)
            }

            
set_pev(grabbed[id], pev_velocityvelocity)
        }
    }
    return 
1
}

public 
release(id)
{

    if (
grabmodeon[id])
    {
        new 
Float:origin[3], Float:traceEnds[8][3]
        if(
g_massMoveOn[id] == true)
        {
            new 
enti
            
new num g_massMoveNum[id]

            new 
goToNextEnt 0

            
for(0numi++)
            {
                
ent g_massMoveEnts[id][i]
                if(!
pev_valid(ent)) continue

                if(
grabbedNoClip[id] == && !is_user_connected(ent) && pev(entpev_iuser4) != 99)
                {
                    
pev(entpev_originorigin)

                    
makeBounds(traceEndsorigin)
                    for(new 
08j++)
                    {
                        if(
fm_point_contents(traceEnds[j]) == CONTENTS_SOLID)
                        {
                            
fm_remove_entity(ent)
                            
goToNextEnt 1

                            
break
                        }
                    }
                }

                if(
goToNextEnt == i+1) continue

                
set_pev(entpev_flagsgrabbedOldFlags[id][i])
                
set_pev(entpev_movetypegrabbedOldMoveType[id][i])
                
set_pev(entpev_solidgrabbedOldSolid[id][i])

                
setOldRendering(identi)
            }

            
client_print(id,print_chat,"[AMXX] You have released something")
        }

        else if (
grabbed[id])
        {
            if(
pev_valid(grabbed[id]))
            {
                if(
grabbedNoClip[id] == && !is_user_connected(grabbed[id]) && pev(grabbed[id], pev_iuser4) != 99)
                {
                    
pev(grabbed[id], pev_originorigin)
                    
makeBounds(traceEndsorigin)

                    for(new 
08j++)
                    {
                        if(
fm_point_contents(traceEnds[j]) == CONTENTS_SOLID)
                        {
                            
client_print(idprint_chat"[AMXX] You can't release a TRIGGER entity inside something SOLID")
                            return 
1
                        
}
                    }
                }

                
set_pev(grabbed[id], pev_flagsgrabbedOldFlags[id][0])
                
set_pev(grabbed[id], pev_movetypegrabbedOldMoveType[id][0])
                
set_pev(grabbed[id], pev_solidgrabbedOldSolid[id][0])

                
setOldRendering(idgrabbed[id], 0)
                
client_print(idprint_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(idprint_chat"[AMXX] Searching for a target")
        new 
targetid=0body

        
new parm[1]
        
parm[0] = id

        velocity_multiplier 
get_pcvar_num(grab_force)
        
grabmodeon[id]=true

        set_task
(0.1"grabtask"100 idparm1"b")
        
get_user_aiming(idtargetidbody)

        if (
targetid)
        {

            
set_grabbed(idtargetid)
            return 
1
        
}

        else
        {
            new 
iOrigin[3]
            new 
Float:origin[3]

            
get_user_origin(idiOrigin3)
            
IVecFVec(iOriginorigin)

            new 
string[64], i
            
//targetid = fm_find_ent_in_sphere(id, origin, 8.0)
            
targetid fm_find_ent_in_sphere2(origin8.0)

            while(
targetid 0)
            {
                
string[0] = '^0'
                
pev(targetidpev_modelstring63)

                for(
0MAX_MODELS_TO_GRABi++)
                {
                    if(
containi(stringg_modelToGrab[i]) != -1)
                    {

                        
set_grabbed(idtargetid)
                        return 
0
                    
}
                }

                
string[0] = '^0'
                
pev(targetidpev_classnamestring63)

                for(
0MAX_CLASSNAMES_TO_GRABi++)
                {
                    if(
containi(stringg_classnameToGrab[i]) != -1)
                    {

                        
set_grabbed(idtargetid)
                        return 
0
                    
}
                }
                
                
//targetid = fm_find_ent_in_sphere(targetid, origin, 8.0)
                
targetid fm_find_ent_in_sphere2(origin8.0)
            }
        }

        
    }

    return 
1
}

stock fm_find_ent_in_sphere2(Float:origin[3], Float:range) {
    new 
ent = -1
    
    
while((ent engfunc(EngFunc_FindEntityInSphereentoriginrange)) != -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(idtargetid)

    return 
0
}

public 
set_grabbed(idtargetid)
{
    if((!
is_allowed_ent(targetid)))
        return 
PLUGIN_HANDLED

    
new origin1[3], origin2[3], Float:forigin2[3]
    
get_user_origin(idorigin1)

    
pev(targetidpev_originforigin2)

    if(!
is_user_connected(targetid) && pev(targetidpev_iuser4) == 99)
    {
        
fm_get_brush_entity_origin(targetidforigin2)
        
grabbedIsBrush[id] = 1
    
}

    
FVecIVec(forigin2origin2)
    
    
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(targetidpev_movetype)
    
grabbedOldSolid[id][0] = pev(targetidpev_solid)
    
grabbedOldFlags[id][0] = pev(targetidpev_flags)

    if(
g_massMoveOn[id] == false)
    {
        new 
Float:color[3]
        
grabbedOldRender[id][0][0] = pev(targetidpev_renderfx)

        
pev(targetidpev_rendercolorcolor)

        
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(targetidpev_rendermode)
        
grabbedOldRender[id][0][5] = pev(targetidpev_renderamt)

        if(
get_pcvar_num(grab_glow))
            
fm_set_rendering(targetidkRenderFxGlowShellget_pcvar_num(grab_red), get_pcvar_num(grab_green), get_pcvar_num(grab_blue), kRenderTransAlphaget_pcvar_num(grab_transp))
    }

    
grablength[id] = get_distance(origin1,origin2)

    new 
classname[32]
    
pev(targetidpev_classnameclassname31)

    
client_print(idprint_chat"[AMXX] You have grabbed something! (id=%d, classname=%s)"targetidclassname)
    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 idparm2"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 idparm2"b")
    }

    return 
1
}

public 
stopdist(idlevelcid)
{
    if (!
cmd_access(idlevelcid1))
        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] > && pev_valid(grabbed[id]))
    {
        if(
pev_valid(grabbed[id]))
        {
            if(
grabbedNoClip[id] == && !is_user_connected(grabbed[id]) && pev(grabbed[id], pev_iuser4) != 99)
            {
                new 
Float:origin[3]
                
pev(grabbed[id], pev_originorigin)

                new 
Float:traceEnds[8][3]
                
makeBounds(traceEndsorigin)

                for(new 
08j++)
                {
                    if(
fm_point_contents(traceEnds[j]) == CONTENTS_SOLID)
                    {
                        
fm_remove_entity(grabbed[id])
                        break
                    }
                }
            }

            if(
pev_valid(grabbed[id]))
            {
                
set_pev(grabbed[id], pev_flagsgrabbedOldFlags[id][0])
                
set_pev(grabbed[id], pev_movetypegrabbedOldMoveType[id][0])
                
set_pev(grabbed[id], pev_solidgrabbedOldSolid[id][0])

                
setOldRendering(idgrabbed[id], 0)
            }
        }

        if(
g_massMoveOn[id] == true)
        {
            new 
entinum g_massMoveNum[id], goToNextEnt 0
            
for(0numi++)
            {
                
ent g_massMoveEnts[id][i]
                if(!
pev_valid(ent)) continue

                if(
grabbedNoClip[id] == && !is_user_connected(ent) && pev(entpev_iuser4) != 99)
                {
                    
pev(entpev_originorigin)
                    
makeBounds(traceEndsorigin)

                    for(new 
08j++)
                    {
                        if(
fm_point_contents(traceEnds[j]) == CONTENTS_SOLID)
                        {
                            
fm_remove_entity(ent)
                            
goToNextEnt 1

                            
break
                        }
                    }
                }

                if(
goToNextEnt == i+1) continue

                
set_pev(entpev_flagsgrabbedOldFlags[id][i])
                
set_pev(entpev_movetypegrabbedOldMoveType[id][i])
                
set_pev(entpev_solidgrabbedOldSolid[id][i])

                
setOldRendering(identi)
            }
        }
    }

    
grabbed[id] = 0
    grabmodeon
[id] = false

    
new players[32], inumplayer
    get_players
(playersinum)

    for(new 
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] > && pev_valid(grabbed[id]))
    {
        if(
pev_valid(grabbed[id]))
        {
            if(
grabbedNoClip[id] == && !is_user_connected(grabbed[id]) && pev(grabbed[id], pev_iuser4) != 99)
            {
                new 
Float:origin[3]
                
pev(grabbed[id], pev_originorigin)

                new 
Float:traceEnds[8][3]
                
makeBounds(traceEndsorigin)

                for(new 
08j++)
                {
                    if(
fm_point_contents(traceEnds[j]) == CONTENTS_SOLID)
                    {
                        
fm_remove_entity(grabbed[id])
                        break
                    }
                }
            }

            if(
pev_valid(grabbed[id]))
            {
                
set_pev(grabbed[id], pev_flagsgrabbedOldFlags[id][0])
                
set_pev(grabbed[id], pev_movetypegrabbedOldMoveType[id][0])
                
set_pev(grabbed[id], pev_solidgrabbedOldSolid[id][0])

                
setOldRendering(idgrabbed[id], 0)
            }
        }

        if(
g_massMoveOn[id] == true)
        {
            new 
enti
            
new num g_massMoveNum[id]

            new 
goToNextEnt 0

            
for(0numi++)
            {
                
ent g_massMoveEnts[id][i]
                if(!
pev_valid(ent)) continue

                if(
grabbedNoClip[id] == && !is_user_connected(ent) && pev(entpev_iuser4) != 99)
                {
                    
pev(entpev_originorigin)
                    
makeBounds(traceEndsorigin)

                    for(new 
08j++)
                    {
                        if(
fm_point_contents(traceEnds[j]) == CONTENTS_SOLID)
                        {
                            
fm_remove_entity(ent)
                            
goToNextEnt 1

                            
break
                        }
                    }
                }

                if(
goToNextEnt == 1) continue

                
set_pev(entpev_flagsgrabbedOldFlags[id][i])
                
set_pev(entpev_movetypegrabbedOldMoveType[id][i])
                
set_pev(entpev_solidgrabbedOldSolid[id][i])

                
setOldRendering(identi)

            }
        }
    }

    
grabbed[id] = 0
    grabmodeon
[id] = false

    
new players[32], inumplayer
    get_players
(playersinum)

    for(new 
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] > && pev_valid(grabbed[id]))
    {
        if(
pev_valid(grabbed[id]))
        {
            if(
grabbedNoClip[id] == && !is_user_connected(grabbed[id]) && pev(grabbed[id], pev_iuser4) != 99)
            {
                new 
Float:origin[3]
                
pev(grabbed[id], pev_originorigin)

                new 
Float:traceEnds[8][3]
                
makeBounds(traceEndsorigin)

                for(new 
08j++)
                {
                    if(
fm_point_contents(traceEnds[j]) == CONTENTS_SOLID)
                    {
                        
fm_remove_entity(grabbed[id])
                        break
                    }
                }
            }

            if(
pev_valid(grabbed[id]))
            {
                
set_pev(grabbed[id], pev_flagsgrabbedOldFlags[id][0])
                
set_pev(grabbed[id], pev_movetypegrabbedOldMoveType[id][0])
                
set_pev(grabbed[id], pev_solidgrabbedOldSolid[id][0])

                
setOldRendering(idgrabbed[id], 0)
            }
        }

        if(
g_massMoveOn[id] == true)
        {
            new 
enti
            
new num g_massMoveNum[id]

            new 
goToNextEnt 0
            
for(0numi++)
            {
                
ent g_massMoveEnts[id][i]
                if(!
pev_valid(ent)) continue

                if(
grabbedNoClip[id] == && !is_user_connected(ent) && pev(entpev_iuser4) != 99)
                {
                    
pev(entpev_originorigin)
                    
makeBounds(traceEndsorigin)

                    for(new 
08j++)
                    {
                        if(
fm_point_contents(traceEnds[j]) == CONTENTS_SOLID)
                        {
                            
fm_remove_entity(ent)
                            
goToNextEnt 1

                            
break
                        }
                    }
                }

                if(
goToNextEnt == 1) continue

                
set_pev(entpev_flagsgrabbedOldFlags[id][i])
                
set_pev(entpev_movetypegrabbedOldMoveType[id][i])
                
set_pev(entpev_solidgrabbedOldSolid[id][i])

                
setOldRendering(identi)
            }
        }
    }

    
grabbed[id] = 0
    grabmodeon
[id] = false

    massrelease
(id)
}

massrelease(id)
{
    
g_massMoveOn[id] = false
    
new num g_massMoveNum[id]

    if(
num 1)
    {
        new 
ient
        setOldRendering
(ident0)

        new 
Float:origin[3]
        new 
Float:traceEnds[8][3], goToNextEnt 0

        
for(1numi++)
        {
            
ent g_massMoveEnts[id][i]
            if(!
pev_valid(ent)) continue

            if(
grabbedNoClip[id] == && !is_user_connected(ent) && pev(entpev_iuser4) != 99)
            {
                
pev(entpev_originorigin)
                
makeBounds(traceEndsorigin)

                for(new 
08j++)
                {
                    if(
fm_point_contents(traceEnds[j]) == CONTENTS_SOLID)
                    {
                        
fm_remove_entity(ent)
                        
goToNextEnt 1

                        
break
                    }
                }
            }

            if(
goToNextEnt == 1) continue

            
set_pev(entpev_movetypegrabbedOldMoveType[id][i])
            
set_pev(entpev_solidgrabbedOldSolid[id][i])
            
set_pev(entpev_flagsgrabbedOldFlags[id][i])

            
setOldRendering(identi)
        }
    }

    
g_massMoveNum[id] = 0




All times are GMT -4. The time now is 03:07.

Powered by vBulletin®
Copyright ©2000 - 2024, vBulletin Solutions, Inc.