Raised This Month: $ Target: $400
 0% 

Grabbing Smoother


Post New Thread Reply   
 
Thread Tools Display Modes
Author Message
atomen
Veteran Member
Join Date: Oct 2006
Location: Stockholm, Sweden
Old 05-26-2008 , 16:29   Grabbing Smoother
Reply With Quote #1

Hi !

I've remade Jedi Force Grab plugin to amxx and fakemeta.
I got 1 BIG problem. When I'm grabbing an entity it ain't smooth
at all when I'm moving it.

You might wonder why I just doesn't use this

It's because you can't grab map entities with this plugin.
So my question is how can I make the grabbing smoother ?

NOTE : Look where my aim is and where the entity is, It ain't following me good at all !



Here's the script :
PHP Code:
//Default Includes
#include <amxmodx>
#include <amxmisc>

//Included Modules/Incs
#include <fakemeta>
#include <fakemeta_util>

#define gPLUGIN "Grab Command"
#define gVERSION "1.0"
#define gAUTHOR "KRoT@L / SpaceDude"

#define MAX_MASSMOVE_ENTS 16
#define VALUE_LENGTH 32

#define MAX_CLASSNAMES_TO_GRAB 9
#define MAX_MODELS_TO_GRAB 1

#define MAX_ENTS 256
#define MAX_KEYVALUES 16
#define KEY_LENGTH 32

new grabbedNoClip[33]
new 
grabmodeon[33], grabbed[33]
new 
grabbedCopyEnt[33]

new 
g_keyValueNum[MAX_ENTS]

new 
grabbedIsBrush[33]
new 
g_massMoveNum[33]

new 
velocity_multiplier 10
new const BOUNDS 3
new laserbeam

new Float:g_massMoveOldOrigin[33][3]
new 
bool:g_massMoveOn[33]
new 
grablength[33]

new 
g_maxents
new g_maxplayers

new g_massMoveEnts[33][MAX_MASSMOVE_ENTS]
new 
grabbedOldMoveType[33][MAX_MASSMOVE_ENTS]
new 
grabbedOldSolid[33][MAX_MASSMOVE_ENTS]

new 
g_key[MAX_ENTS][MAX_KEYVALUES][KEY_LENGTH]
new 
g_value[MAX_ENTS][MAX_KEYVALUES][VALUE_LENGTH]

new 
grabbedOldFlags[33][MAX_MASSMOVE_ENTS]
new 
grabbedOldRender[33][MAX_MASSMOVE_ENTS][6]

new 
g_modelToGrab[MAX_MODELS_TO_GRAB][]    = { "models/w_" }
new 
g_classnameToGrab[MAX_CLASSNAMES_TO_GRAB][] =
{
    
"weaponbox",
    
"grenade",
    
"func_breakable",
    
"func_ladder",
    
"csdm",
    
"bullet",
    
"rocket",
    
"dookie",
    
"piss_puddle"
}

public 
plugin_precache() laserbeam    =    precache_model("sprites/laserbeam.spr")

public 
plugin_init()
{
    
register_plugin(gPLUGINgVERSIONgAUTHOR)

    
register_clcmd("+grab""grab_ent"ADMIN_SLAY"Bind a key to +grab")
    
register_clcmd("-grab""release"ADMIN_SLAY)

    
g_maxents        =    global_get(glb_maxEntities)
    
g_maxplayers        =    get_maxplayers()
}

public 
grab_ent(id,level,cid)
{
    if (!
cmd_access(idlevelcid1))
        return 
1

    
if(level != || cid != 0)
    {
        new 
cmd[32]
        
read_argv(0cmd31)

        if(
containi(cmd"2") != -1)
            
grabbedNoClip[id] = 1

        
else
            
grabbedNoClip[id] = 0
    
}

    if (!
grabmodeon[id])
    {
        new 
targetid 0
        
new body

        
new parm[1]
        
parm[0] = id

        velocity_multiplier 
10
        grabmodeon
[id] = true

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

        if(
targetid)
        {
            if(
grabbedCopyEnt[id] == 1)
            {
                new 
idCopy makeCopyOf(targetid)
                if(
idCopy 0targetid idCopy
            
}

            
set_grabbed(idtargetid)
            return 
1
        
}

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

            
IVecFVec(iOriginorigin)
            new 
string[64], i

            targetid 
fm_find_ent_in_sphere(idorigin8.0)

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

                for(
0MAX_MODELS_TO_GRABi++)
                {
                    if(
containi(stringg_modelToGrab[i]) != -1)
                    {
                        if(
grabbedCopyEnt[id] == 1)
                        {
                            new 
idCopy makeCopyOf(targetid)
                            if(
idCopy 0targetid idCopy
                        
}

                        
set_grabbed(idtargetid)
                        return 
0
                    
}
                }

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

                for(
0MAX_CLASSNAMES_TO_GRABi++)
                {
                    if(
containi(stringg_classnameToGrab[i]) != -1)
                    {
                        if(
grabbedCopyEnt[id] == 1)
                        {
                            new 
idCopy makeCopyOf(targetid)
                            if(
idCopy 0targetid idCopy
                        
}

                        
set_grabbed(idtargetid)
                        return 
0
                    
}
                }

                
targetid fm_find_ent_in_sphere(targetidorigin8.0)
            }
        }

        
client_print(idprint_chat"[AMX] Searching for a target")
    }

    return 
1
}

public 
grab_ent_task(parm[])
{
    new 
id parm[0]
    if (!
grabbed[id])
    {
        new 
targetid 0
        
new body

        get_user_aiming
(idtargetidbody)
        if(
targetid)
        {
            if(
grabbedCopyEnt[id] == 1)
            {
                new 
idCopy makeCopyOf(targetid)
                if(
idCopy 0targetid idCopy
            
}

            
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(idorigin8.0)

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

                for(
0MAX_MODELS_TO_GRABi++)
                {
                    if(
containi(stringg_modelToGrab[i]) != -1)
                    {
                        if(
grabbedCopyEnt[id] == 1)
                        {
                            new 
idCopy makeCopyOf(targetid)
                            if(
idCopy 0targetid idCopy
                        
}

                        
set_grabbed(idtargetid)
                        return 
0
                    
}
                }

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

                for(
0MAX_CLASSNAMES_TO_GRABi++)
                {
                    if(
containi(stringg_classnameToGrab[i]) != -1)
                    {
                        if(
grabbedCopyEnt[id] == 1)
                        {
                            new 
idCopy makeCopyOf(targetid)
                            if(
idCopy 0targetid idCopy
                        
}
                    }

                    
set_grabbed(idtargetid)
                    return 
0
                
}
            }

            
targetid fm_find_ent_in_sphere(targetidorigin8.0)
        }
    }

    else
    {
        if(!
pev_valid(grabbed[id]))
        {
            
release(id,0,0)
            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(origin[0] == 0.0)
        {
            
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 
0
}

public 
release(id,level,cid)
{
    if (!
cmd_access(id,level,cid,1))
        return 
1

    
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 
set_grabbed(idtargetid)
{
    if(
is_user_alive(targetid) && get_user_flags(targetid) & ADMIN_IMMUNITY && !(get_user_flags(id) & ADMIN_ADMIN))
    {
        
grabmodeon[id] = false
        grabbed
[id] = 0

        grabbedCopyEnt
[id] = 0
        remove_task
100id)

        
client_print(idprint_chat"[AMXX] Player has immunity")
        return 
0
    
}

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

    
grablength[id] = get_distance(origin1,origin2)

    new 
classname[32]
    
pev(targetidpev_classnameclassname31)

    
client_print(id,print_chat,"[AMXX] You have grabbed something (id=%d | classname=%s)"targetidclassname)
    return 
1
}

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])

makeCopyOf(entId)
{
    if(
canCreateEntity() == 0)
    {
        
server_print("[AMXX] Too many entities on the map")
        return 
0
    
}

    if(!
pev_valid(entId) || is_user_connected(entId)) return 0

    
new classname[64]
    
pev(entIdpev_classnameclassname63)

    new 
copyId fm_create_entity(classname)

    if(
copyId 1) return 0
    
new oldEntId 0

    
if(!g_key[entId][0][0])
    {
        
oldEntId entId
        entId 
pev(entIdpev_iuser3)
    }

    if(!
g_key[entId][0][0]) return 0
    
new maxkeyvalues g_keyValueNum[entId]

    for(new 
0maxkeyvaluesi++)
    {
        
fm_set_kvd(copyIdg_key[entId][i], g_value[entId][i])
    }

    
fm_DispatchSpawn(copyId)
    
set_pev(copyIdpev_iuser3entId)
    
set_pev(copyIdpev_iuser4pev(entIdpev_iuser4))

    new 
Float:vec[3]
    
pev((oldEntId == 0) ? entId oldEntIdpev_absminvec)

    
set_pev(copyIdpev_absminvec)
    
pev((oldEntId == 0) ? entId oldEntIdpev_absmaxvec)

    
set_pev(copyIdpev_absmaxvec)
    return 
copyId
}

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
}

canCreateEntity()
{
    if(
fm_entity_count() < (g_maxents-g_maxplayers)) return 1
    
return 0

EDIT : It's only laggy with map entities. It's not so laggy with players, but not good with them either.
__________________

Last edited by atomen; 05-26-2008 at 17:30.
atomen is offline
Send a message via MSN to atomen
[ --<-@ ] Black Rose
ANNIHILATED
Join Date: Sep 2005
Location: Stockholm, Sweden.
Old 05-27-2008 , 12:14   Re: Grabbing Smoother
Reply With Quote #2

Just remove the part that it checks if it's a player in the other plugin.
[ --<-@ ] Black Rose is offline
atomen
Veteran Member
Join Date: Oct 2006
Location: Stockholm, Sweden
Old 05-27-2008 , 14:28   Re: Grabbing Smoother
Reply With Quote #3

Thanks, I have tried but a problem has occurred.

When I grab an "func_breakable" for this instance it,
it's just turning red and a little transparent. I can't move it or anything.

Here's a Picture :


Here's the script:
PHP Code:
#include <amxmodx>
#include <amxmisc>
#include <fakemeta>

new const VERSION[ ] = "1.2.3"
new const TRKCVAR[ ] = "grab_plus_version"
#define ADMIN ADMIN_LEVEL_A

#define TSK_CHKE 50

#define SF_FADEOUT 0

new client_data[33][4]
#define GRABBED  0
#define GRABBER  1
#define GRAB_LEN 2
#define FLAGS    3

#define CDF_IN_PUSH   (1<<0)
#define CDF_IN_PULL   (1<<1)
#define CDF_NO_CHOKE  (1<<2)

//Cvar Pointers
new p_enabledp_players_only
new p_throw_forcep_min_distp_grab_force
new p_choke_timep_choke_dmg
new p_glow_rp_glow_bp_glow_gp_glow_a
new p_fadep_glow

new MAXPLAYERS
new SVC_SCREENFADESVC_SCREENSHAKEWTF_DAMAGE

public plugin_init( )
{
    
register_plugin"Grab+"VERSION"Ian Cammarata" )
    
register_cvarTRKCVARVERSIONFCVAR_SERVER )

    
set_cvar_stringTRKCVARVERSION )
    
    
p_enabled register_cvar"gp_enabled""1" )
    
p_players_only register_cvar"gp_players_only""0" )
    
    
p_min_dist register_cvar "gp_min_dist""90" )
    
p_throw_force register_cvar"gp_throw_force""1500" )
    
p_grab_force register_cvar"gp_grab_force""8" )
    
    
p_choke_time register_cvar"gp_choke_time""1.5" )
    
p_choke_dmg register_cvar"gp_choke_dmg""5" )
    
    
p_glow_r register_cvar"gp_glow_r""50" )
    
p_glow_g register_cvar"gp_glow_g""0" )
    
p_glow_b register_cvar"gp_glow_b""0" )
    
p_glow_a register_cvar"gp_glow_a""200" )
    
    
p_fade register_cvar"gp_screen_fade""1" )
    
p_glow register_cvar"gp_glow""1" )

    
register_clcmd"grab_toggle""grab_toggle"ADMIN"press once to grab and again to release" )
    
register_clcmd"+grab""grab"ADMIN"bind a key to +grab" )
    
register_clcmd"-grab""unset_grabbed" )
    
    
register_clcmd"drop" ,"throw" )
    
register_event"DeathMsg""DeathMsg""a" )
    
    
register_forwardFM_PlayerPreThink"fm_player_prethink" )
    
register_dictionary"grab_plus.txt" )
    
    
MAXPLAYERS get_maxplayers()
    
    
SVC_SCREENFADE get_user_msgid"ScreenFade" )
    
SVC_SCREENSHAKE get_user_msgid"ScreenShake" )
    
WTF_DAMAGE get_user_msgid"Damage" )
}

public 
plugin_precache( ) precache_sound"player/PL_PAIN2.WAV" )

public 
fm_player_prethinkid )
{
    new 
target
    
//Search for a target
    
if ( client_data[id][GRABBED] == -)
    {
        new 
Float:orig[3], Float:ret[3]
        
get_view_posidorig )
        
ret vel_by_aimid9999 )
        
        
ret[0] += orig[0]
        
ret[1] += orig[1]
        
ret[2] += orig[2]
        
        
target tracelineorigretidret )
        
        if( 
target)
        {
            if( 
is_grabbedtargetid ) ) return FMRES_IGNORED
            set_grabbed
idtarget )
        }

        else if( !
get_pcvar_nump_players_only ) )
        {
            new 
movetype
            
if( target && pev_validtarget ) )
            {
                
movetype pevtargetpev_movetype )
                if( !( 
movetype == MOVETYPE_WALK || movetype == MOVETYPE_STEP || movetype == MOVETYPE_TOSS ) )
                    return 
FMRES_IGNORED
            
}
            else
            {
                
target 0
                
new ent engfuncEngFunc_FindEntityInSphere, -1ret12.0 )

                while( !
target && ent )
                {
                    
movetype peventpev_movetype )
                    if( ( 
movetype == MOVETYPE_WALK || movetype == MOVETYPE_STEP || movetype == MOVETYPE_TOSS )
                            && 
ent != id  )
                        
target ent
                    ent 
engfuncEngFunc_FindEntityInSphereentret12.0 )
                }
            }
            if( 
target )
            {
                if( 
is_grabbedtargetid ) ) return FMRES_IGNORED
                set_grabbed
idtarget )
            }
        }
    }
    
    
target client_data[id][GRABBED]
    
//If they've grabbed something
    
if( target )
    {
        if( !
pev_validtarget ))
        {
            
unset_grabbedid )
            return 
FMRES_IGNORED
        
}

        if( 
pevidpev_button ) & IN_USE )
            
do_chokeid )
        
        if( 
target MAXPLAYERS grab_thinkid )
    }

    
target client_data[id][GRABBER]
    if( 
target grab_thinktarget )
    
    return 
FMRES_IGNORED
}

public 
grab_thinkid )
{
    new 
target client_data[id][GRABBED]

    if( 
pevtargetpev_movetype ) == MOVETYPE_FLY && !(pevtargetpev_button ) & IN_JUMP ) ) client_cmdtarget"+jump;wait;-jump" )
    new 
Float:tmpvec[3], Float:tmpvec2[3], Float:torig[3], Float:tvel[3]
    
    
get_view_posidtmpvec )
    
    
tmpvec2 vel_by_aimidclient_data[id][GRAB_LEN] )
    
    
torig get_target_origin_ftarget )
    
    new 
force get_pcvar_nump_grab_force )
    
    
tvel[0] = ( ( tmpvec[0] + tmpvec2[0] ) - torig[0] ) * force
    tvel
[1] = ( ( tmpvec[1] + tmpvec2[1] ) - torig[1] ) * force
    tvel
[2] = ( ( tmpvec[2] + tmpvec2[2] ) - torig[2] ) * force
    
    set_pev
targetpev_velocitytvel )
}

stock Float:get_target_origin_fid )
{
    new 
Float:orig[3]
    
pevidpev_originorig )
    
    
//If grabbed is not a player, move origin to center
    
if( id MAXPLAYERS )
    {
        new 
Float:mins[3], Float:maxs[3]
        
pevidpev_minsmins )
        
pevidpev_maxsmaxs )
        
        if( !
mins[2] ) orig[2] += maxs[2] / 2
    
}
    
    return 
orig
}

public 
grab_toggleidlevelcid )
{
    if( !
client_data[id][GRABBED] ) grabidlevelcid )
    else 
unset_grabbedid )
    
    return 
1
}

public 
grabidlevelcid )
{
    if( !
cmd_accessidlevelcid) || !get_pcvar_nump_enabled ) ) return 1
    
    
if ( !client_data[id][GRABBED] ) client_data[id][GRABBED] = -1    
    screenfade_in
id )
    
    return 
1
}

public 
screenfade_inid )
{
    if( 
get_pcvar_nump_fade ) )
    {
        
message_beginMSG_ONESVC_SCREENFADE_id )
        
write_short10000 //duration
        
write_short//hold
        
write_shortSF_FADE_IN SF_FADE_ONLYONE //flags
        
write_byteget_pcvar_nump_glow_r ) ) //r
        
write_byteget_pcvar_nump_glow_g ) ) //g
        
write_byteget_pcvar_nump_glow_b ) ) //b
        
write_byteget_pcvar_nump_glow_a ) / //a
        
message_end( )
    }
}

public throw( 
id )
{
    new 
target client_data[id][GRABBED]
    if( 
target )
    {
        
set_pevtargetpev_velocityvel_by_aimidget_pcvar_num(p_throw_force) ) )
        
unset_grabbedid )
        return 
PLUGIN_HANDLED
    
}

    return 
PLUGIN_CONTINUE
}

public 
unset_grabbedid )
{
    new 
target client_data[id][GRABBED]
    if( 
target && pev_validtarget ) )
    {
        
set_pevtargetpev_renderfxkRenderFxNone )
        
set_pevtargetpev_rendercolor, {255.0255.0255.0} )
        
set_pevtargetpev_rendermodekRenderNormal )
        
set_pevtargetpev_renderamt16.0 )
        
        if( 
target <= MAXPLAYERS )
            
client_data[target][GRABBER] = 0
    
}

    
client_data[id][GRABBED] = 0
    
    
if(get_pcvar_num(p_fade))
    {
        
message_beginMSG_ONESVC_SCREENFADE_id )
        
write_short10000 //duration
        
write_short//hold
        
write_shortSF_FADEOUT //flags
        
write_byteget_pcvar_nump_glow_r ) ) //r
        
write_byteget_pcvar_nump_glow_g ) ) //g
        
write_byteget_pcvar_nump_glow_b ) ) //b
        
write_byteget_pcvar_nump_glow_a ) / //a
        
message_end( )
    }
}

//Grabs onto someone
public set_grabbedidtarget )
{
    if( 
get_pcvar_nump_glow ) )
    {
        new 
Float:color[3]

        
color[0] = get_pcvar_floatp_glow_r )
        
color[1] = get_pcvar_floatp_glow_g )
        
color[2] = get_pcvar_floatp_glow_b )

        
set_pevtargetpev_renderfxkRenderFxGlowShell )
        
set_pevtargetpev_rendercolorcolor )
        
set_pevtargetpev_rendermodekRenderTransColor )
        
set_pevtargetpev_renderamtget_pcvar_floatp_glow_a ) )
    }
    
    if( 
target <= MAXPLAYERS )
        
client_data[target][GRABBER] = id

    client_data
[id][FLAGS] = 0
    client_data
[id][GRABBED] = target

    
new Float:torig[3], Float:orig[3]

    
pevtargetpev_origintorig )
    
pevidpev_originorig )

    
client_data[id][GRAB_LEN] = floatroundget_distance_ftorigorig ) )
    if( 
client_data[id][GRAB_LEN] < get_pcvar_nump_min_dist ) ) client_data[id][GRAB_LEN] = get_pcvar_nump_min_dist )
}

public 
do_chokeid )
{
    new 
target client_data[id][GRABBED]
    if( 
client_data[id][FLAGS] & CDF_NO_CHOKE || id == target || target MAXPLAYERS) return
    
    new 
dmg get_pcvar_nump_choke_dmg )
    new 
vec[3]
    
FVecIVecget_target_origin_ftarget ), vec )
    
    
message_beginMSG_ONESVC_SCREENSHAKE_target )
    
write_short999999 //amount
    
write_short9999 //duration
    
write_short999 //frequency
    
message_end( )
    
    
message_beginMSG_ONESVC_SCREENFADE_target )
    
write_short9999 //duration
    
write_short100 //hold
    
write_shortSF_FADE_MODULATE //flags
    
write_byteget_pcvar_nump_glow_r ) ) //r
    
write_byteget_pcvar_nump_glow_g ) ) //g
    
write_byteget_pcvar_nump_glow_b ) ) //b
    
write_byte200 //a
    
message_end( )
    
    
message_beginMSG_ONEWTF_DAMAGE_target )
    
write_byte//damage armor
    
write_bytedmg //damage health
    
write_longDMG_CRUSH //damage type
    
write_coordvec[0] ) //origin[x]
    
write_coordvec[1] ) //origin[y]
    
write_coordvec[2] ) //origin[z]
    
message_end( )
        
    
message_beginMSG_BROADCASTSVC_TEMPENTITY )
    
write_byteTE_BLOODSTREAM )
    
write_coordvec[0] ) //pos.x
    
write_coordvec[1] ) //pos.y
    
write_coordvec[2] + 15 //pos.z
    
write_coordrandom_num0255 ) ) //vec.x
    
write_coordrandom_num0255 ) ) //vec.y
    
write_coordrandom_num0255 ) ) //vec.z
    
write_byte70 //col index
    
write_byterandom_num50250 ) ) //speed
    
message_end( )
    
    new 
health pevtargetpev_health ) - dmg
    set_pev
targetpev_healthfloathealth ) )
    if( 
health dllfuncDLLFunc_ClientKilltarget )
    
    
emit_soundtargetCHAN_BODY"player/PL_PAIN2.WAV"VOL_NORMATTN_NORM0PITCH_NORM )
    
    
client_data[id][FLAGS] ^= CDF_NO_CHOKE
    set_task
get_pcvar_floatp_choke_time ), "clear_no_choke"TSK_CHKE id )
}

public 
clear_no_choketskid )
{
    new 
id tskid TSK_CHKE
    client_data
[id][FLAGS] ^= CDF_NO_CHOKE
}

public 
is_grabbedtargetgrabber )
{
    for( new 
1<= MAXPLAYERSi++ )
        if( 
client_data[i][GRABBED] == target )
        {
            
client_printgrabberprint_chat"[AMXX] %L"grabber"ALREADY" )
            
unset_grabbedgrabber )

            return 
true
        
}
    return 
false
}

public 
DeathMsg( )
    
kill_grabread_data) )

public 
client_disconnectid )
{
    
kill_grabid )
    return 
0
}

public 
kill_grabid )
{
    if( 
client_data[id][GRABBED] )
        
unset_grabbedid )

    else if( 
client_data[id][GRABBER] )
        
unset_grabbedclient_data[id][GRABBER] )
}

stock traceline( const Float:vStart[3], const Float:vEnd[3], const pIgnoreFloat:vHitPos[3] )
{
    
engfuncEngFunc_TraceLinevStartvEnd0pIgnore)
    
get_tr20TR_vecEndPosvHitPos )

    return 
get_tr20TR_pHit )
}

stock get_view_pos( const idFloat:vViewPos[3] )
{
    new 
Float:vOfs[3]
    
pevidpev_originvViewPos )
    
pevidpev_view_ofsvOfs )        
    
    
vViewPos[0] += vOfs[0]
    
vViewPos[1] += vOfs[1]
    
vViewPos[2] += vOfs[2]
}

stock Float:vel_by_aimidspeed )
{
    new 
Float:v1[3], Float:vBlah[3]
    
pevidpev_v_anglev1 )
    
engfuncEngFunc_AngleVectorsv1v1vBlahvBlah )
    
    
v1[0] *= speed
    v1
[1] *= speed
    v1
[2] *= speed
    
    
return v1

__________________
atomen is offline
Send a message via MSN to atomen
[ --<-@ ] Black Rose
ANNIHILATED
Join Date: Sep 2005
Location: Stockholm, Sweden.
Old 05-27-2008 , 14:30   Re: Grabbing Smoother
Reply With Quote #4

I think the same thing happens with EntMod. Don't think there's any fix for that. Just disable breakables.
[ --<-@ ] Black Rose is offline
atomen
Veteran Member
Join Date: Oct 2006
Location: Stockholm, Sweden
Old 05-27-2008 , 14:41   Re: Grabbing Smoother
Reply With Quote #5

But I'm able to move breakables with my other script. But it's not smooth at all.
FYI: I've only tested with func_breakables.

This is not laggy in anyway : http://youtube.com/watch?v=HF2zmJvs39Q @ (10 min)
__________________
atomen is offline
Send a message via MSN to atomen
atomen
Veteran Member
Join Date: Oct 2006
Location: Stockholm, Sweden
Old 05-28-2008 , 10:02   Re: Grabbing Smoother
Reply With Quote #6

Sry for double post but I have to get an answer.

I've remade Krot@ls / Spacedudes Ultimate Jedi Force Grab exactly but to amxx.

The only differences is the indention and this is fakemeta instead of engine.

I did it because all of my attempts to be able to move around a
map entity failed.

With map entities I mean as my previous posts, not players nor weapons but
map entities.
PHP Code:
new g_classnameToGrab[MAX_CLASSNAMES_TO_GRAB][] =
{
    
"weaponbox",
    
"grenade",
    
"func_breakable",
    
"func_ladder",
    
"csdm",
    
"bullet",
    
"rocket",
    
"dookie",
    
"piss_puddle"

I installed Amxmod and tested this plugin and it worked excellent.

So I thought if I remade this plugin exactly as it was in the amxmod
version it shouldn't occur any problems.

In my first post you can see my attempt to move around an entity.
It sucked TBH.

In my second attempt the only thing I achieved was to make an
map entity transparent -_-

In this attempt it worked gallant to move around player and
weapon entities origin. But when I tried on an map entity it
was moving in lightning speed until it hit a wall.(non-usable FYI)

When I grabbed smaller map entities they went outside the map even when
this shouldn't be possible since they don't have move type "noclip".

So is it possible to move around map entities "usable" with Amxmodx ?

It feels kinda annoying with not achieving my goal when I sat
and indented and converted ≈ 2500 lines.

Here's the script if someone want to take a look at it (I only removed the saving part and the menu part)

NOTE: I would be glad if someone with more scripting experience than me would do an attempt
to move around map entities.
Code:
#include <amxmodx>
#include <amxmisc>

#include <hamsandwich>

#include <fakemeta>
#include <fakemeta_util>

new const ACCESS_GRAB = ADMIN_LEVEL_B
new const ACCESS_GRAB_TOGGLE = ADMIN_LEVEL_B
new const ACCESS_GRAB2 = ADMIN_LEVEL_B
new const ACCESS_GRAB_TOGGLE2 = ADMIN_LEVEL_B
new const ACCESS_THROW = ADMIN_LEVEL_B
new const ACCESS_PULL = ADMIN_LEVEL_B
new const ACCESS_PUSH = ADMIN_LEVEL_B
new const ACCESS_UNDOMOVING = ADMIN_LEVEL_B

new const ACCESS_ENT_KILL = ADMIN_LEVEL_C
new const ACCESS_ENT_ROTATE = ADMIN_LEVEL_C
new const ACCESS_ENT_DROPTOFLOOR = ADMIN_LEVEL_C
new const ACCESS_ENT_SETKEYVALUE = ADMIN_LEVEL_C

new const ACCESS_ES_GRAB = ADMIN_LEVEL_C
new const ACCESS_ES_UNGRAB = ADMIN_LEVEL_C
new const ACCESS_ES_CANCEL = ADMIN_LEVEL_C
new const ACCESS_ES_SAVE = ADMIN_LEVEL_C
new const ACCESS_ES_LIST = ADMIN_LEVEL_C
new const ACCESS_ES_LISTALL = ADMIN_LEVEL_C
new const ACCESS_ES_LOAD = ADMIN_LEVEL_C

new const ACCESS_ENT_MM_GRAB = ADMIN_LEVEL_D
new const ACCESS_ENT_MM_START = ADMIN_LEVEL_D
new const ACCESS_ENT_MM_START2 = ADMIN_LEVEL_D
new const ACCESS_ENT_MM_END = ADMIN_LEVEL_D
new const ACCESS_ENT_GRABTYPE = ADMIN_LEVEL_D
new const ACCESS_ENT_STOPGRAB = ADMIN_LEVEL_D
new const ACCESS_COPYENT_TOGGLE = ADMIN_LEVEL_D
new const ACCESS_COPYENT = ADMIN_LEVEL_D

new const ACCESS_ENT_TELESTART = ADMIN_LEVEL_E
new const ACCESS_ENT_TELEEND = ADMIN_LEVEL_E
new const ACCESS_ENT_TELEDELETE = ADMIN_LEVEL_E

new const ACCESS_ENT_STACK = ADMIN_LEVEL_F
new const ACCESS_ENT_WALL = ADMIN_LEVEL_F

new const ACCESS_ENT_LOOKINGAT = ADMIN_LEVEL_G
new const ACCESS_ENT_SEARCH = ADMIN_LEVEL_G
new const ACCESS_ENT_SHOWAXIS = ADMIN_LEVEL_G
new const ACCESS_ENT_SHOWKEYVALUE = ADMIN_LEVEL_G

new const ACCESS_ENT_USE = ADMIN_LEVEL_H
new const ACCESS_JEDICHOKE = ADMIN_SLAY

new g_spriteTeleStart[]     =     "sprites/enter1.spr"
new g_spriteTeleEnd[]         =     "sprites/exit1.spr"

new g_grabBeam[]        =    "sprites/laserbeam.spr"
new g_PainSound[]        =    "player/PL_PAIN2.WAV"

#define MAX_ENTS 256
#define MAX_KEYVALUES 16
#define KEY_LENGTH 32
#define VALUE_LENGTH 32

#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_MODELS_TO_GRAB 1
new g_modelToGrab[MAX_MODELS_TO_GRAB][] = { "models/w_" }

#define MAX_MASSMOVE_ENTS 16

new g_key[MAX_ENTS][MAX_KEYVALUES][KEY_LENGTH]
new g_keyValueNum[MAX_ENTS]
new g_value[MAX_ENTS][MAX_KEYVALUES][VALUE_LENGTH]

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_saveEnts[33][MAX_MASSMOVE_ENTS]
new g_saveEntsNum[33]

new g_maxents
new g_maxplayers

new velocity_multiplier
new laserbeam

new g_msgidScreenShake, g_msgidDamage, g_msgidScreenFade

new const BOUNDS = 3

//Pcvars
new grab_force
new grab_glow

new grab_red
new grab_green

new grab_blue
new grab_transp

new grab_beam
new throw_force

new pushpull_speed
new speedkill

#if !defined ADMIN_SUPREME
 #define ADMIN_SUPREME (1<<24)
#endif

public plugin_init()
{
    register_plugin("Ultimate JediGrab", "1.2", "KRoT@L / SpaceDude")

    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")
    throw_force        =        register_cvar("sv_throw_force", "1500")

    pushpull_speed        =        register_cvar("sv_pushpull_speed", "35")
    speedkill        =        register_cvar("sv_speedkill", "2500")

    register_clcmd("grab_toggle", "grab_toggle", ACCESS_GRAB_TOGGLE, "[entId/name/authid/#userid] Press once to grab and again to release.")
    register_clcmd("+grab", "grab", ACCESS_GRAB, "Bind a key to +grab")

    register_clcmd("-grab", "release", ACCESS_GRAB)
    register_clcmd("grab_toggle2", "grab_toggle", ACCESS_GRAB_TOGGLE2, "[entId/name/authid/#userid] Press once to grab and again to release (noclip).")

    register_clcmd("+grab2", "grab", ACCESS_GRAB2, "Bind a key to +grab2 (noclip)")
    register_clcmd("-grab2", "release", ACCESS_GRAB2)

    register_clcmd("throw", "throw", ACCESS_THROW, "Throws the grabee.")
    register_clcmd("+pull", "startpull", ACCESS_PULL, "Bind a key to +pull")

    register_clcmd("-pull", "stopdist", ACCESS_PULL)
    register_clcmd("+push", "startpush", ACCESS_PUSH, "Bind a key to +push")

    register_clcmd("-push", "stopdist", ACCESS_PUSH)
    register_clcmd("ent_undomoving", "e_undo", ACCESS_UNDOMOVING, "Places the entity being looked at where it was.")

    register_concmd("ent_kill", "e_kill", ACCESS_ENT_KILL, "[entity classname] [range] Kills the entity being looked at. You can specify an entity type and a range.")
    register_concmd("ent_rotate", "e_rotate", ACCESS_ENT_ROTATE,"<y> <y> <z> [entId/name/authid/#userid] Rotates the entity being looked at. You can specify an entity id or a player id.")

    register_concmd("ent_droptofloor", "e_droptofloor", ACCESS_ENT_DROPTOFLOOR, "[entId] Drops to floor the entity.")
    register_concmd("ent_setkeyvalue", "e_setkeyvalue", ACCESS_ENT_SETKEYVALUE, "<key> <value> [entId/name/authid/#userid] Sets keyvalue on the entity being looked at or specified.")

    register_clcmd("ent_es_grab", "es_grab", ACCESS_ES_GRAB, "[entId] Adds the entity to the save list.")
    register_clcmd("ent_es_ungrab", "es_ungrab", ACCESS_ES_UNGRAB, "Removes the last entity added from the save list.")

    register_clcmd("ent_es_cancel", "es_cancel", ACCESS_ES_CANCEL, "Removes all the entities added from the save list.")
    register_clcmd("ent_es_save", "es_save", ACCESS_ES_SAVE, "<name> Saves all entities grabbed with the name specified.")

    register_clcmd("ent_es_list", "es_list", ACCESS_ES_LIST, "Lists all entity saves for the current map.")
    register_clcmd("ent_es_listall", "es_listall", ACCESS_ES_LISTALL, "Lists all entity saves on the server.")

    register_concmd("ent_es_load", "es_load", ACCESS_ES_LOAD, "Loads the specified entity save. Saves can only be loaded on the map they were saved on.")

    register_clcmd("ent_mm_grab", "mm_grab", ACCESS_ENT_MM_GRAB, "Selects an entity to be mass moved.")
    register_clcmd("ent_mm_start", "mm_start", ACCESS_ENT_MM_START, "Starts the mass move process once all entities have been grabbed.")

    register_clcmd("ent_mm_start2", "mm_start", ACCESS_ENT_MM_START2, "Starts the mass move process once all entities have been grabbed (noclip).")
    register_clcmd("ent_mm_end", "mm_end", ACCESS_ENT_MM_END, "Releases all entities being mass moved.")

    register_clcmd("ent_grabtype", "e_grabtype", ACCESS_ENT_GRABTYPE, "<entity classname> [range] Grabs a certain entity at a specified range (default 250).")
    register_clcmd("ent_stopgrab", "e_stopgrab", ACCESS_ENT_STOPGRAB, "Used to stop moving an entity grabbed with amx_grabtype.")

    register_clcmd("copyent_toggle", "copyent_toggle", ACCESS_COPYENT_TOGGLE, "Press once to copy and grab and again to release (noclip).")
    register_clcmd("+copyent", "copyent", ACCESS_COPYENT, "Bind a key to +copyent")

    register_clcmd("-copyent", "release", ACCESS_COPYENT)

    register_concmd("ent_telestart", "e_telestart", ACCESS_ENT_TELESTART, "<name> [x] [y] [z] Creates a teleporter entrance that leads to the exit with the matching name.")
    register_concmd("ent_teleend", "e_teleend", ACCESS_ENT_TELEEND, "<name> [x] [y] [z] Creates a teleporter exit that comes from the entrance with a matching name.")

    register_concmd("ent_teledelete", "e_teledelete", ACCESS_ENT_TELEDELETE, "<name> Deletes the teleporter entrances and exit with the name specified.")

    register_clcmd("ent_stack", "e_stack", ACCESS_ENT_STACK, "<amount> <offset x> <offset y> <offset z> Creates a certain amount of entities each offseted from the last the specified amount.")
    register_clcmd("ent_wall", "e_wall", ACCESS_ENT_WALL, "<entId> <rowNum> <colNum> <rowOffset> <colOffset> Creates a wall made of the entity specified.")

    register_clcmd("ent_lookingat", "e_lookingat", ACCESS_ENT_LOOKINGAT, "Gives information about the entity being looked at.")
    register_clcmd("ent_search", "e_search", ACCESS_ENT_SEARCH, "Searches for entities within 100 cells of your location.")

    register_clcmd("ent_showx", "showaxis", ACCESS_ENT_SHOWAXIS, "Creates a temporary line in the x direction.")
    register_clcmd("ent_showy", "showaxis", ACCESS_ENT_SHOWAXIS, "Creates a temporary line in the y direction.")

    register_clcmd("ent_showz", "showaxis", ACCESS_ENT_SHOWAXIS, "Creates a temporary line in the z direction.")
    register_clcmd("ent_showkeyvalue", "e_showkeyvalue" ,ACCESS_ENT_SHOWKEYVALUE, "[entId/name/authid/#userid] Shows keyvalues of the entity being looked at or specified.")

    register_clcmd("ent_use", "e_use", ACCESS_ENT_USE, "[name/authid/#userid] Makes you/the player use the entity you're looking at (open door, defuse bomb, ..).")
    register_clcmd("jedichoke", "choke_func", ACCESS_JEDICHOKE, "Chokes the grabee.")

    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_msgidScreenShake    =        get_user_msgid("ScreenShake")
    g_msgidScreenFade    =        get_user_msgid("ScreenFade")
    g_msgidDamage        =        get_user_msgid("Damage")

    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)

    precache_model(g_spriteTeleStart)
    precache_model(g_spriteTeleEnd)
}

Float:calcDamage(Float:vel[3])
{
    return vector_length(vel) * (100.0 / get_pcvar_float(speedkill))
}

public entity_touch(entity1, entity2)
{
    new Float:vel[3], Float:damage
    if(entity1 > 0 && pev_valid(entity1) && is_user_alive(entity2))
    {
        new i
        for(i = 1; i <= g_maxplayers; i++)
        {
            if(grabbed[i] == entity1)
            {
                pev(entity1, pev_velocity, vel)
                damage = calcDamage(vel)

                if(damage > 0.0)
                {
                    new Float:ori[3]
                    pev(entity2, pev_origin, ori)

                    new classname[32]
                    pev(entity1, pev_classname, classname, 31)

                    fm_fakedamage(entity2, classname, damage, DMG_CRUSH)
                    //take_damage(entity2, i, ori, damage, DMG_CRUSH, classname, 0)
                }

                set_pev(entity2, pev_velocity, vel)
                return 0
            }
        }
    }

    return 0
}

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])

setMMGrabRendering(ent) fm_set_rendering(ent, kRenderFxNone, 0, 255, 0, kRenderTransColor, 96)

setSaveRendering(ent) fm_set_rendering(ent, kRenderFxNone, 255, 0, 100, kRenderTransColor, 96)

canCreateEntity()
{
    if(fm_entity_count() < (g_maxents - 5 * g_maxplayers)) return 1
    return 0
}

searchTarget(id, aiming)
{
    new targetid=0, body, found=0
    if(aiming == 1) get_user_aiming(id, targetid, body)

    if(!targetid)
    {
        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)

        while(targetid > 0 && found == 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)
                {
                    found = 1
                    break
                }
            }

            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)
                {
                    found = 1
                    break
                }
            }

            if(found == 0) targetid = fm_find_ent_in_sphere(targetid, origin, 8.0)
        }
    }
    return targetid
}

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
}

makeCopyOf(entId)
{
    if(canCreateEntity() == 0)
    {
        server_print("[AMXX] Too many entities on the map")
        return 0
    }

    if(!pev_valid(entId) || is_user_connected(entId)) return 0

    new classname[64]
    pev(entId, pev_classname, classname, 63)

    new copyId = fm_create_entity(classname)

    if(copyId < 1) return 0
    new oldEntId = 0

    if(!g_key[entId][0][0])
    {
        oldEntId = entId
        entId = pev(entId, pev_iuser3)
    }

    if(!g_key[entId][0][0]) return 0
    new maxkeyvalues = g_keyValueNum[entId]

    for(new i = 0; i < maxkeyvalues; i++)
    {
        fm_set_kvd(copyId, g_key[entId][i], g_value[entId][i])
    }

    fm_DispatchSpawn(copyId)

    set_pev(copyId, pev_iuser3, entId)
    set_pev(copyId, pev_iuser4, pev(entId, pev_iuser4))

    new Float:vec[3]
    pev((oldEntId == 0) ? entId : oldEntId, pev_absmin, vec)

    set_pev(copyId, pev_absmin, vec)
    pev((oldEntId == 0) ? entId : oldEntId, pev_absmax, vec)

    set_pev(copyId, pev_absmax, vec)
    return copyId
}

public fwd_KeyValue_Post(entity, kvd_handle)
{
    if(entity >= 0 && pev_valid(entity) && entity < MAX_ENTS && g_keyValueNum[entity] < MAX_KEYVALUES)
    {
        new szClassName[32], szKeyName[KEY_LENGTH], szVal[VALUE_LENGTH]

        get_kvd(kvd_handle, KV_ClassName, szClassName, 31)
        get_kvd(kvd_handle, KV_KeyName, szKeyName, KEY_LENGTH - 1)
        get_kvd(kvd_handle, KV_Value, szVal, VALUE_LENGTH - 1)

        if(szKeyName[0] && szVal[0])
        {
            copy(g_key[entity][g_keyValueNum[entity]], KEY_LENGTH-1, szKeyName)
            copy(g_value[entity][g_keyValueNum[entity]], VALUE_LENGTH-1, szVal)

            g_keyValueNum[entity]++
        }
    }
}

public grabtask(parm[])
{
    new id = parm[0]
    if (!grabbed[id])
    {
        new targetid = 0
        new body

        get_user_aiming(id, targetid, body)
        if(targetid)
        {
            if(grabbedCopyEnt[id] == 1)
            {
                new idCopy = makeCopyOf(targetid)
                if(idCopy > 0) targetid = idCopy
            }

            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)

            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)
                    {
                        if(grabbedCopyEnt[id] == 1)
                        {
                            new idCopy = makeCopyOf(targetid)
                            if(idCopy > 0) targetid = idCopy
                        }

                        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)
                    {
                        if(grabbedCopyEnt[id] == 1)
                        {
                            new idCopy = makeCopyOf(targetid)
                            if(idCopy > 0) targetid = idCopy
                        }
                    }

                    set_grabbed(id, targetid)
                    return 0
                }
            }

            targetid = fm_find_ent_in_sphere(targetid, origin, 8.0)
        }
    }

    else
    {
        if(!pev_valid(grabbed[id]))
        {
            release(id, 0, 0)
            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, level, cid)
{
    if (!cmd_access(id, level, cid, 1))
        return 1

    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_toggle(id, level, cid)
{
    if (!cmd_access(id, level, cid, 1))
        return 1

    if (grabmodeon[id])
        release(id, 0, 0)

    else
    {
        new cmd[32]
        read_argv(0, cmd, 31)

        if(containi(cmd, "2") != -1)
            grabbedNoClip[id] = 1

        else
            grabbedNoClip[id] = 0

        if(read_argc() >= 2)
        {
            new arg[32]
            read_argv(1, arg, 31)

            new ent
            if(is_str_num(arg))
                ent = str_to_num(arg)

            else
                ent = cmd_target(id, arg, 5)

            if(!pev_valid(ent) || ent == id)
            {
                console_print(id, "[AMXX] Entity invalid")
                return 1
            }

            new range = 200
            if(read_argc() == 3)
            {
                read_argv(2, arg, 31)
                range = str_to_num(arg)

                if(range <= 0)
                {
                    console_print(id, "[AMXX] Incorrect range")
                    return 1
                }
            }

            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")

            set_grabbed(id, ent)
            grablength[id] = range
        }

        grab(id, 0, 0)
    }

    return 1
}

public copyent_toggle(id, level, cid)
{
    if (!cmd_access(id, level, cid, 1))
        return 1

    if(grabmodeon[id])
        release(id, 0, 0)

    else
    {
        grabbedNoClip[id] = 1
        grabbedCopyEnt[id] = 1

        grab(id, 0, 0)
    }

    return 1
}

public grab(id, level, cid)
{
    if (!cmd_access(id, level, cid, 1))
        return 1

    if(level != 0 || cid != 0)
    {
        new cmd[32]
        read_argv(0, cmd, 31)

        if(containi(cmd, "2") != -1)
            grabbedNoClip[id] = 1

        else
            grabbedNoClip[id] = 0
    }

    if (!grabmodeon[id])
    {
        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)
        {
            if(grabbedCopyEnt[id] == 1)
            {
                new idCopy = makeCopyOf(targetid)
                if(idCopy > 0) targetid = idCopy
            }

            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)

            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)
                    {
                        if(grabbedCopyEnt[id] == 1)
                        {
                            new idCopy = makeCopyOf(targetid)
                            if(idCopy > 0) targetid = idCopy
                        }

                        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)
                    {
                        if(grabbedCopyEnt[id] == 1)
                        {
                            new idCopy = makeCopyOf(targetid)
                            if(idCopy > 0) targetid = idCopy
                        }

                        set_grabbed(id, targetid)
                        return 0
                    }
                }

                targetid = fm_find_ent_in_sphere(targetid, origin, 8.0)
            }
        }

        client_print(id, print_chat, "[AMXX] Searching for a target")
    }

    return 1
}

public copyent(id, level, cid)
{
    if (!cmd_access(id, level, cid, 1))
        return 1

    grabbedCopyEnt[id] = 1
    grab(id, 0, 0)

    return 1
}

public throw(id, level, cid)
{
    if (!cmd_access(id, level, cid, 1))
        return 1

    new Float:origin[3], Float:traceEnds[8][3]
    new Float:pVelocity[3]

    if(g_massMoveOn[id] == true)
    {
        velocity_by_aim(id, get_pcvar_num(throw_force), pVelocity)
        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_velocity, pVelocity)
            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
        grabbedCopyEnt[id] = 0

        grabmodeon[id] = false
        remove_task(100 + id)

        client_print(id,print_chat,"[AMXX] You have thrown 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
                    }
                }
            }

            velocity_by_aim(id, get_pcvar_num(throw_force), pVelocity)
            set_pev(grabbed[id], pev_velocity, pVelocity)

            setOldRendering(id, grabbed[id], 0)

            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])
        }

        grabbed[id] = 0
        grabbedCopyEnt[id] = 0

        grabmodeon[id] = false
        remove_task(100 + id)

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

    return 1
}

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_user_alive(targetid) && get_user_flags(targetid) & ADMIN_IMMUNITY && !(get_user_flags(id) & ADMIN_SUPREME))
    {
        grabmodeon[id] = false
        grabbed[id] = 0

        grabbedCopyEnt[id] = 0
        remove_task(100 + id)

        client_print(id, print_chat, "[AMXX] Player has immunity")
        return 0
    }

    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, level, cid)
{
    if (!cmd_access(id, level, cid, 1))
        return 1

    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, level, cid)
{
    if (!cmd_access(id, level, cid, 1))
        return 1

    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 choke_func(id, level, cid)
{
    if (!cmd_access(id, level, cid, 1))
        return 1

    if (is_user_alive(grabbed[id]) && !task_exists(id + 200))
    {
        new victim_name[33]
        get_user_name(grabbed[id], victim_name, 32)

        client_print(grabbed[id], print_chat, "*** You Are Being Choked By A Jedi ***")
        client_print(id, print_chat, "*** You Are Choking %s ***", victim_name)

        message_begin(MSG_ONE, g_msgidScreenShake , {0,0,0}, grabbed[id])

        write_short(1<<14)
        write_short(1<<14)
        write_short(1<<14)

        message_end()

        message_begin(MSG_ONE, g_msgidScreenFade , {0,0,0}, grabbed[id])

        write_short(1<<1)
        write_short(1<<0)
        write_short(0<<1)

        write_byte(255)
        write_byte(30)
        write_byte(30)

        write_byte(180)
        message_end()

        new vec[3]
        get_user_origin(grabbed[id], vec)

        message_begin(MSG_ONE, g_msgidDamage, {0,0,0}, grabbed[id])

        write_byte(30)
        write_byte(30)

        write_long(1<<0)

        write_coord(vec[0])
        write_coord(vec[1])
        write_coord(vec[2])

        message_end()

        new var[1],health
        var[0] = id

        set_task(1.0, "repeat_shake", id + 200, var, 1, "a", 8)
        emit_sound(grabbed[id], CHAN_BODY, g_PainSound, 1.0,ATTN_NORM, 0, PITCH_NORM)

        health = pev(grabbed[id], pev_health)

        if(health>3)
            set_pev(grabbed[id], pev_health, health - 3)
    }

    return 1
}

public repeat_shake(var[])
{
    new id = var[0]
    if (is_user_alive(grabbed[id]))
    {
        message_begin(MSG_ONE, g_msgidScreenShake , {0,0,0}, grabbed[id])

        write_short(1<<14)
        write_short(1<<14)
        write_short(1<<14)

        message_end()

        message_begin(MSG_ONE, g_msgidScreenFade , {0,0,0}, grabbed[id])

        write_short(1<<1)
        write_short(1<<0)
        write_short(0<<1)

        write_byte(255)
        write_byte(30)
        write_byte(30)
        write_byte(180)

        message_end()

        new vec[3]
        get_user_origin(grabbed[id],vec)

        message_begin(MSG_ONE, g_msgidDamage, {0,0,0}, grabbed[id])

        write_byte(30)
        write_byte(30)

        write_long(1<<0)

        write_coord(vec[0])
        write_coord(vec[1])
        write_coord(vec[2])

        message_end()

        new health = pev(grabbed[id], pev_health)

        if(health>3)
            set_pev(grabbed[id], health - 3)

        emit_sound(grabbed[id], CHAN_BODY, g_PainSound, 1.0, ATTN_NORM, 0, PITCH_NORM)
    }

    else
    {
        if(task_exists(id + 200))
            remove_task(id + 200)
    }

    return 0
}

public fwd_Ham_Spawn_post(id)
{
    if(task_exists(100 + id))
        remove_task(100 + id)

    if(grabbed[id] > 0 && pev_valid(grabbed[id]))
        setOldRendering(id, grabbed[id], 0)

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

    massrelease(id)

    return HAM_IGNORED
}

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

public e_kill(id, level, cid)
{
    if(!cmd_access(id, level, cid, 1))
        return 1

    if(read_argc() >= 2)
    {
        new class[64]
        new Float:range = 250.0

        if(read_argc() == 3)
        {
            read_argv(2, class, 63)
            range = floatstr(class)
        }

        read_argv(1, class, 63)
        new Float:origin[3]

        if(id > 0) pev(id, pev_origin, origin)

        new string[64], tempent
        new targetid = fm_find_ent_in_sphere(id, origin, range)

        while(targetid > 0)
        {
            tempent = fm_find_ent_in_sphere(targetid, origin, range)

            string[0] = '^0'
            pev(targetid, pev_classname, string, 63)

            if(equali(string, class))
                fm_remove_entity(targetid)

            targetid = tempent
        }

        return 1
    }

    if(id <= 0) return 1

    new targetid = searchTarget(id, 1)
    if(targetid > 0)
    {
        if(!is_user_connected(targetid) && pev_valid(targetid))
        {
            fm_remove_entity(targetid)
            console_print(id, "[AMXX] The entity %d has been removed", targetid)

            return 1
        }
    }

    console_print(id, "[AMXX] No entity or entity not valid")
    return 1
}

public e_rotate(id, level, cid)
{
    if(!cmd_access(id, level, cid, 4))
        return 1

    new targetid=0
    if(read_argc() == 5)
    {
        new arg[32]
        read_argv(4, arg, 31)

        if(is_str_num(arg))
            targetid = str_to_num(arg)

        else
            targetid = cmd_target(id, arg, 5)

        if(!pev_valid(targetid) || targetid == id)
        {
            console_print(id, "[AMXX] Entity invalid")
            return 1
        }
    }

    else
        targetid = searchTarget(id, 1)

    if(targetid > 0)
    {
        if(pev_valid(targetid))
        {
            new Float:angles[3]
            new Float:vangle[3]

            pev(targetid, pev_angles, angles)
            pev(targetid, pev_v_angle, vangle)

            new i, arg[32]

            for(i = 0; i < 3; i++)
            {
                read_argv(i + 1, arg, 31)

                angles[i] += floatstr(arg)
                vangle[i] += floatstr(arg)
            }

            set_pev(targetid, pev_angles, angles)
            set_pev(targetid, pev_v_angle, vangle)
            set_pev(targetid, pev_fixangle, 1)

            console_print(id, "[AMXX] The entity %d has been rotated", targetid)
            return 1
        }
    }

    console_print(id, "[AMXX] No entity or entity not valid")
    return 1
}

public e_droptofloor(id, level, cid)
{
    if(!cmd_access(id, level, cid, 1))
        return 1

    new targetid = 0
    if(read_argc() == 2)
    {
        new arg[32]
        read_argv(1, arg, 31)

        if(is_str_num(arg))
            targetid = str_to_num(arg)

        if(!pev_valid(targetid) || targetid <= g_maxplayers)
        {
            console_print(id, "[AMXX] Entity invalid")
            return 1
        }
    }

    else
        targetid = searchTarget(id, 1)

    if(targetid > 0)
    {
        if(pev_valid(targetid))
        {
            fm_drop_to_floor(targetid)
            console_print(id, "[AMXX] The entity %d has been dropped to floor", targetid)

            return 1
        }
    }

    console_print(id, "[AMXX] No entity or entity not valid")
    return 1
}

public e_telestart(id, level, cid)
{
    if(!cmd_access(id,level,cid,2))
        return 1

    new arg[32]
    read_argv(1, arg, 31)

    new Float:origin[3]
    if(read_argc() == 5)
    {
        new arg2[32]
        read_argv(2, arg2, 31)

        origin[0] = floatstr(arg2)
        read_argv(3, arg2, 31)

        origin[1] = floatstr(arg2)
        read_argv(4, arg2, 31)

        origin[2] = floatstr(arg2)
    }

    else
        pev(id, pev_origin, origin)

    if(canCreateEntity() == 0)
    {
        console_print(id, "[AMXX] Too many entities on the map.")
        return 1
    }

    new ent = fm_create_entity("cycler_sprite")
    if(ent > 0)
    {
        fm_set_kvd(ent, "classname", "cycler_sprite")
        fm_set_kvd(ent, "model", g_spriteTeleStart)

        fm_set_kvd(ent, "rendercolor", "0 0 0")
        fm_set_kvd(ent, "framerate", "10")

        fm_set_kvd(ent, "angles", "0 0 0")
        fm_DispatchSpawn(ent)

        set_pev(ent, pev_model, g_spriteTeleStart)
        set_pev(ent, pev_size, Float:{-40.0, -40.0, -40.0}, Float:{40.0, 40.0, 40.0})

        set_pev(ent, pev_rendermode, 5)
        set_pev(ent, pev_renderamt, 175.0)

        set_pev(ent, pev_solid, SOLID_NOT)
        set_pev(ent, pev_origin, origin)

        new ent2 = fm_create_entity("trigger_teleport")
        if(ent2 > 0)
        {
            fm_set_kvd(ent2, "classname", "trigger_teleport")
            fm_set_kvd(ent2, "style", "32")

            fm_set_kvd(ent2, "target", arg)
            fm_DispatchSpawn(ent2)

            set_pev(ent2, pev_euser1, ent)
            set_pev(ent2, pev_size, Float:{-10.0, -10.0, -10.0}, Float:{10.0, 10.0, 10.0})

            set_pev(ent2, pev_origin, origin)
            set_pev(ent2, pev_solid, SOLID_TRIGGER)

            set_pev(ent2, pev_effects, EF_NODRAW)

            console_print(id, "[AMXX] Teleporter start ^"%s^" has been created", arg)
            return 1
        }
    }

    console_print(id, "[AMXX] Couldn't create teleporter start")
    return 1
}

public e_teleend(id, level, cid)
{
    if(!cmd_access(id, level, cid, 2))
        return 1

    new arg[32]
    read_argv(1, arg, 31)

    new Float:origin[3]
    if(read_argc() == 5)
    {
        new arg2[32]
        read_argv(2, arg2, 31)

        origin[0] = floatstr(arg2)
        read_argv(3, arg2, 31)

        origin[1] = floatstr(arg2)
        read_argv(4, arg2, 31)

        origin[2] = floatstr(arg2)
    }

    else
        pev(id, pev_origin, origin)

    if(canCreateEntity() == 0)
    {
        console_print(id, "[AMXX] Too many entities on the map")
        return 1
    }

    new ent = fm_create_entity("cycler_sprite")
    if(ent > 0)
    {
        fm_set_kvd(ent, "classname", "cycler_sprite")
        fm_set_kvd(ent, "model", g_spriteTeleEnd)

        fm_set_kvd(ent, "rendercolor", "0 0 0")
        fm_set_kvd(ent, "framerate", "10")

        fm_set_kvd(ent, "angles", "0 0 0")
        fm_DispatchSpawn(ent)

        set_pev(ent, pev_size, Float:{-40.0, -40.0, -40.0}, Float:{40.0, 40.0, 40.0})

        set_pev(ent, pev_rendermode, 5)
        set_pev(ent, pev_renderamt, 175.0)

        set_pev(ent, pev_solid, SOLID_NOT)
        set_pev(ent, pev_origin, origin)

        new ent2 = fm_create_entity("info_teleport_destination")
        if(ent2 > 0)
        {
            fm_set_kvd(ent2, "classname", "info_teleport_destination")
            fm_set_kvd(ent2, "targetname", arg)

            fm_set_kvd(ent2, "angles", "0 0 0")
            fm_DispatchSpawn(ent2)

            set_pev(ent2, pev_euser1, ent)
            set_pev(ent2, pev_size, Float:{-1.0, -1.0, -1.0}, Float:{1.0, 1.0, 1.0})

            set_pev(ent2, pev_origin, origin)
            set_pev(ent2, pev_solid, SOLID_TRIGGER)

            set_pev(ent2, pev_effects, EF_NODRAW)

            console_print(id, "[AMXX] Teleporter end ^"%s^" has been created", arg)
            return 1
        }
    }

    console_print(id, "[AMXX] Couldn't create teleporter end")
    return 1
}

public e_teledelete(id,level,cid)
{
    if(!cmd_access(id,level,cid,2))
        return 1

    new arg[32]
    read_argv(1, arg, 31)

    new ent2, tempent, target[32]
    new ent = fm_find_ent_by_class(-1, "info_teleport_destination")

    while(ent > 0)
    {
        tempent = fm_find_ent_by_class(ent, "info_teleport_destination")
        pev(ent, pev_targetname, target, 31)

        if(equal(target, arg))
        {
            ent2 = pev(ent, pev_euser1)
            if(pev_valid(ent2)) fm_remove_entity(ent2)

            fm_remove_entity(ent)
        }

        ent = tempent
    }

    ent = fm_find_ent_by_class(-1, "trigger_teleport")
    while(ent > 0)
    {
        tempent = fm_find_ent_by_class(ent, "trigger_teleport")
        pev(ent, pev_target, target, 31)

        if(equal(target, arg))
        {
            ent2 = pev(ent, pev_euser1)
            if(pev_valid(ent2)) fm_remove_entity(ent2)

            fm_remove_entity(ent)
        }

        ent = tempent
    }

    console_print(id, "[AMXX] Teleporters ^"%s^" have been removed", arg)
    return 1
}

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
}

isGrabbed(id, ent)
{
    new num = g_massMoveNum[id]
    if(num < 1) return 0

    new i
    for(i = 0; i < num; i++)
    {
        if(g_massMoveEnts[id][i] == ent)
            return 1
    }

    return 0
}

public mm_grab(id, level, cid)
{
    if(!cmd_access(id, level, cid, 1))
        return 1

    if(g_massMoveNum[id] >= MAX_MASSMOVE_ENTS)
    {
        client_print(id, print_chat, "[AMXX] You can't grab any more entities")
        return 1
    }

    new targetid=0, body
    get_user_aiming(id, targetid, body)

    if(is_user_alive(targetid) && get_user_flags(targetid) & ADMIN_IMMUNITY && !(get_user_flags(id) & ADMIN_SUPREME))
    {
        client_print(id, print_chat, "[AMXX] Player has immunity!")
        return 1
    }

    if(!targetid)
        targetid = searchTarget(id, 0)

    if(targetid > 0)
    {
        if(pev_valid(targetid) && !isGrabbed(id, targetid))
        {
            new num = g_massMoveNum[id]
            g_massMoveEnts[id][num] = targetid

            new Float:color[3]
            grabbedOldRender[id][num][0] = pev(targetid, pev_renderfx)

            pev(targetid, pev_rendercolor, color)

            grabbedOldRender[id][num][1] = floatround(color[0])
            grabbedOldRender[id][num][2] = floatround(color[1])

            grabbedOldRender[id][num][3] = floatround(color[2])
            grabbedOldRender[id][num][4] = pev(targetid, pev_rendermode)
            grabbedOldRender[id][num][5] = pev(targetid, pev_renderamt)

            setMMGrabRendering(targetid)
            g_massMoveNum[id]++

            new class[32]
            pev(targetid, pev_classname, class, 31)

            client_print(id, print_chat, "[AMX] You grabbed entity %d (%s)", targetid, class)
            return 1
        }
    }

    client_print(id, print_chat, "[AMXX] No target found or entity already grabbed")
    return 1
}

public mm_start(id, level, cid)
{
    if(!cmd_access(id, level, cid, 1))
        return 1

    if(g_massMoveOn[id] == true)
        return 1

    new num = g_massMoveNum[id]
    if(num <= 0)
    {
        client_print(id, print_chat, "[AMXX] You haven't grabbed any entity")
        return 1
    }

    g_massMoveOn[id] = true
    set_grabbed(id, g_massMoveEnts[id][0])

    new i
    for(i = 1; i < num; i++)
    {
        grabbedOldMoveType[id][i] = pev(g_massMoveEnts[id][i], pev_movetype)
        grabbedOldSolid[id][i] = pev(g_massMoveEnts[id][i], pev_solid)
        grabbedOldFlags[id][i] = pev(g_massMoveEnts[id][i], pev_flags)
    }

    velocity_multiplier = get_pcvar_num(grab_force)

    new cmd[32]
    read_argv(0, cmd, 31)

    if(containi(cmd, "2") != -1)
        grabbedNoClip[id] = 1

    else
        grabbedNoClip[id] = 0

    grabmodeon[id] = true

    new parm[1]
    parm[0] = id

    set_task(0.1, "grabtask", 100 + id, parm, 1, "b")
    return 1
}

public mm_end(id,level,cid)
{
    if(!cmd_access(id, level, cid, 1))
        return 1

    if(g_massMoveOn[id] == false)
        return 1

    release(id, 0, 0)
    massrelease(id)

    return 1
}

public e_stack(id, level, cid)
{
    if(!cmd_access(id, level, cid, 5))
        return 1

    new num
    new arg[32]

    read_argv(1, arg, 31)
    num = str_to_num(arg)

    if(num <= 0)
    {
        console_print(id, "[AMXX] Incorrect amount of entities")
        return 1
    }

    new Float:offset[3]
    read_argv(2, arg, 31)

    offset[0] = floatstr(arg)
    read_argv(3, arg, 31)

    offset[1] = floatstr(arg)
    read_argv(4, arg, 31)

    offset[2] = floatstr(arg)

    new targetid=0, body
    get_user_aiming(id, targetid, body)

    if(is_user_connected(targetid))
    {
        console_print(id, "[AMXX] You can't stack players")
        return 1
    }

    if(!targetid)
        targetid = searchTarget(id, 0)

    if(targetid > 0)
    {
        if(pev_valid(targetid))
        {
            new i, copyId
            new Float:targetOrigin[3]

            new Float:copyOrigin[3]

            pev(targetid, pev_origin, targetOrigin)

            for(i = 1; i <= num; i++)
            {
                copyId = makeCopyOf(targetid)

                copyOrigin[0] = targetOrigin[0] + (i*offset[0])
                copyOrigin[1] = targetOrigin[1] + (i*offset[1])
                copyOrigin[2] = targetOrigin[2] + (i*offset[2])

                set_pev(copyId, pev_origin, copyOrigin)
            }

            client_print(id, print_chat, "[AMXX] Entity has been copied %d times", num)
            return 1
        }
    }

    client_print(id, print_chat, "[AMXX] No target found")
    return 1
}

public e_lookingat(id, level, cid)
{
    if(!cmd_access(id, level, cid, 1))
        return 1

    new targetid=0, body
    get_user_aiming(id, targetid, body)

    if(is_user_connected(targetid))
        return 1

    if(!targetid)
        targetid = searchTarget(id, 0)

    if(targetid > 0)
    {
        if(pev_valid(targetid))
        {
            new class[32]
            pev(targetid, pev_classname, class, 31)

            new Float:vecmins[3]
            new Float:vecmaxs[3]

            pev(targetid, pev_mins, vecmins)
            pev(targetid, pev_maxs, vecmaxs)

            console_print(id, "[AMXX] The entity you're looking at is:")

            console_print(id, "  Id: %d", targetid)
            console_print(id, "  ClassName: %s", class)

            console_print(id, "  Size on the X Axis: %d", floatround(vecmaxs[0] - vecmins[0]))
            console_print(id, "  Size on the Y Axis: %d", floatround(vecmaxs[1] - vecmins[1]))
            console_print(id, "  Size on the Z Axis: %d", floatround(vecmaxs[2] - vecmins[2]))

            return 1
        }
    }

    client_print(id, print_chat, "[AMXX] No target found")
    return 1
}

public e_grabtype(id, level, cid)
{
    if(!cmd_access(id, level, cid, 2))
        return 1

    new class[64]
    new Float:range = 250.0

    if(read_argc() == 3)
    {
        read_argv(2, class, 63)
        range = floatstr(class)
    }

    read_argv(1, class, 63)

    new Float:origin[3]
    pev(id, pev_origin, origin)

    new string[64]
    new targetid = fm_find_ent_in_sphere(id, origin, range)

    while(targetid > 0)
    {
        string[0] = '^0'
        pev(targetid, pev_classname, string ,63)

        if(equali(string, class))
            break

        targetid = fm_find_ent_in_sphere(targetid, origin, range)
    }

    if(targetid > 0)
    {
        grabbedNoClip[id] = 1

        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")

        set_grabbed(id, targetid)
    }

    client_print(id, print_chat, "[AMXX] No target found")
    return 1
}

public e_stopgrab(id, level, cid)
{
    if(!cmd_access(id, level, cid, 1))
        return 1

    release(id, 0, 0)
    return 1
}

public showaxis(id, level, cid)
{
    if(!cmd_access(id, level, cid, 1))
        return 1

    new cmd[32]
    read_argv(0, cmd, 31)

    new red, green, blue
    new origin[3], origin2[3]

    get_user_origin(id, origin)

    origin2[0] = origin[0]
    origin2[1] = origin[1]
    origin2[2] = origin[2]

    switch(cmd[8])
    {
        case 'x':
        {
            origin2[0] += 400
            red = 255
        }

        case 'y':
        {
            origin2[1] += 400
            green = 255
        }

        case 'z':
        {
            origin2[2] += 400
            blue = 255
        }
    }

    message_begin(MSG_ONE, SVC_TEMPENTITY, {0,0,0}, id)
    write_byte(0)

    write_coord(origin[0])
    write_coord(origin[1])
    write_coord(origin[2])

    write_coord(origin2[0])
    write_coord(origin2[1])
    write_coord(origin2[2])

    write_short(laserbeam)

    write_byte(0)
    write_byte(0)
    write_byte(600)

    write_byte(40)
    write_byte(0)

    write_byte(red)
    write_byte(green)
    write_byte(blue)

    write_byte(255)
    write_byte(0)
    message_end()

    return 1
}

public e_showkeyvalue(id, level, cid)
{
    if(!cmd_access(id, level, cid, 1))
        return 1

    new targetid=0

    if(read_argc() == 2)
    {
        new arg[32]
        read_argv(1, arg, 31)

        if(is_str_num(arg))
            targetid = str_to_num(arg)

        else
            targetid = cmd_target(id, arg, 0)

        if(!pev_valid(targetid))
        {
            console_print(id, "[AMXX] Entity invalid")
            return 1
        }
    }

    else
        targetid = searchTarget(id, 1)

    if(targetid > 0)
    {
        if(pev_valid(targetid))
        {
            console_print(id, "KeyValues of entity %d:", targetid)
            if(targetid > g_maxplayers)
            {
                if(!g_key[targetid][0][0])
                    targetid = pev(targetid, pev_iuser3)
            }

            new maxkeyvalues = g_keyValueNum[targetid]
            for(new i = 0; i < maxkeyvalues; i++)
            {
                console_print(id, "Key=^"%s^", Value=^"%s^"", g_key[targetid][i], g_value[targetid][i])
            }

            return 1
        }
    }
    console_print(id, "[AMXX] No entity or entity not valid")
    return 1
}

public e_setkeyvalue(id,level,cid)
{
    if(!cmd_access(id, level, cid, 3))
        return 1

    new targetid=0
    if(read_argc() == 4)
    {
        new arg[32]
        read_argv(1, arg, 31)

        if(is_str_num(arg))
            targetid = str_to_num(arg)

        else
            targetid = cmd_target(id, arg, 1)

        if(!pev_valid(targetid))
        {
            console_print(id, "[AMXX] Entity invalid")
            return 1
        }
    }

    else
        targetid = searchTarget(id, 1)

    if(targetid > 0)
    {
        if(pev_valid(targetid))
        {
            new key[64], value[64]

            read_argv(1, key, 63)
            read_argv(2, value, 63)

            fm_set_kvd(targetid, key, value)

            if(targetid > g_maxplayers)
            {
                if(!g_key[targetid][0][0])
                    targetid = pev(targetid, pev_iuser3)
            }

            new maxkeyvalues = g_keyValueNum[targetid]
            for(new i = 0; i < maxkeyvalues; i++)
            {
                if(equal(g_key[targetid][i], key))
                {
                    copy(g_value[targetid][i], VALUE_LENGTH-1, value)
                    break
                }
            }

            if(targetid > g_maxplayers) fm_DispatchSpawn(targetid)
            console_print(id, "KeyValue set on entity %d.", targetid)

            return 1
        }
    }

    console_print(id, "[AMXX] No entity or entity not valid")
    return 1
}

public e_use(id, level, cid)
{
    if(!cmd_access(id, level, cid, 1))
        return 1

    new targetid = searchTarget(id, 1)
    if(targetid > 0)
    {
        if(pev_valid(targetid))
        {
            new user
            if(read_argc() == 2)
            {
                new arg[32]
                read_argv(1, arg, 31)

                user = cmd_target(id, arg, 5)
                if(!user) return 1
            }

            else
                user = id

            fm_force_use(targetid, user)

            new class[32]
            pev(targetid, pev_classname, class, 31)

            if(user != id)
            {
                new plname[32]
                get_user_name(user, plname, 31)

                client_print(id, print_chat, "[AMXX] %s ^"used^" entity %d (%s)", plname, targetid, class)
            }

            else
                client_print(id, print_chat, "[AMX] You ^"used^" entity %d (%s)", targetid, class)

            return 1
        }
    }

    client_print(id, print_chat, "[AMXX] No target found")
    return 1
}

public e_search(id, level, cid)
{
    if(!cmd_access(id, level, cid, 1))
        return 1

    new Float:range = 200.0
    new Float:origin[3]

    pev(id, pev_origin, origin)

    new class[64]
    new targetid = fm_find_ent_in_sphere(id, origin, range)

    if(targetid < 1)
    {
        console_print(id, "[AMXX] No entity found")
        return 1
    }

    while(targetid > 0)
    {
        pev(targetid, pev_classname, class, 63)
        console_print(id, "Entity found: Id = %d, ClassName = %s", targetid, class)

        targetid = fm_find_ent_in_sphere(targetid, origin, range)
    }

    return 1
}

public e_undo(id, level, cid)
{
    if(!cmd_access(id, level, cid, 1))
        return 1

    new targetid = searchTarget(id, 1)
    if(targetid > 0)
    {
        if(pev_valid(targetid) && targetid > g_maxplayers)
        {
            set_pev(targetid, pev_origin, Float:{0.0, 0.0, 0.0})
            return 1
        }
    }

    client_print(id, print_chat, "[AMXX] No target found")
    return 1
}

setBrushOrigin(ent, entId, Float:origin[3])
{
    new Float:entorigin[3], Float:mins[3], Float:maxs[3], Float:absmin[3], Float:absmax[3]
    new Float:sizeX, Float:sizeY, Float:sizeZ

    pev(entId, pev_mins, mins)
    pev(entId, pev_maxs, maxs)

    sizeX = maxs[0] - mins[0]
    sizeY = maxs[1] - mins[1]
    sizeZ = maxs[2] - mins[2]

    absmin[0] = origin[0] - (sizeX/2.0)
    absmin[1] = origin[1] - (sizeY/2.0)
    absmin[2] = origin[2]

    absmax[0] = origin[0] + (sizeX/2.0)
    absmax[1] = origin[1] + (sizeY/2.0)
    absmax[2] = origin[2] + sizeZ

    set_pev(ent, pev_absmin, absmin)
    set_pev(ent, pev_absmax, absmax)

    entorigin[0] = absmin[0] - mins[0]
    entorigin[1] = absmin[1] - mins[1]
    entorigin[2] = absmin[2] - mins[2]

    fm_entity_set_origin(ent, entorigin)
}

public e_wall(id, level, cid)
{
    if(!cmd_access(id, level, cid, 6))
        return 1

    new arg1[16],arg4[16], arg5[16]
    new arg2[16],arg3[16]

    read_argv(1, arg1, 15)
    read_argv(2, arg2, 15)

    read_argv(3, arg3, 15)
    read_argv(4, arg4, 15)

    read_argv(5, arg5, 15)
    new entId = str_to_num(arg1)

    if(!pev_valid(entId) || entId <= g_maxplayers)
    {
        console_print(id, "[AMXX] Entity not valid")
        return 1
    }

    new iAimorigin[3], Float:aimorigin[3]
    get_user_origin(id, iAimorigin, 3)

    IVecFVec(iAimorigin, aimorigin)

    new Float:angles[3]
    pev(id, pev_v_angle, angles)

    angles[0] = 0.0

    new Float:entangles[3]
    entangles[1] = angles[1] - 90.0

    new rownums = str_to_num(arg3) - 1
    new colnums = str_to_num(arg2)

    new middleent = floatround(float(colnums)/2.0, floatround_floor)
    new rowoffset = str_to_num(arg4)

    new coloffset = str_to_num(arg5)

    if(rownums <= 0 || colnums <= 0 || rowoffset < 0 || coloffset < 0)
    {
        console_print(id, "[AMX] A parameter is incorrect.")
        return 1
    }

    new isBrush = 0
    if(pev(entId, pev_iuser4) == 99)
        isBrush = 1

    new Float:entorigin[3]
    new Float:velocity[3]

    new ent
    new i, j

    for(i = -middleent ; i <= ((colnums%2 == 1) ? middleent : middleent - 1) ; i++)
    {
        ent = makeCopyOf(entId)
        if(ent > 0)
        {
            if(isBrush == 1) setBrushOrigin(ent, entId, aimorigin)
            else fm_entity_set_origin(ent, aimorigin)

            set_pev(ent, pev_v_angle, entangles)

            velocity_by_aim(ent, rowoffset*i, velocity)

            entorigin[0] = aimorigin[0] + velocity[0]
            entorigin[1] = aimorigin[1] + velocity[1]
            entorigin[2] = aimorigin[2] + velocity[2]

            if(isBrush == 1) setBrushOrigin(ent, entId, entorigin)
            else fm_entity_set_origin(ent, entorigin)

            if(isBrush == 0) set_pev(ent, pev_angles, angles)
            for(j = 0 ; j < rownums ; j++)
            {
                ent = makeCopyOf(entId)
                if(ent > 0)
                {
                    entorigin[2] += float(coloffset)

                    if(isBrush == 1) setBrushOrigin(ent, entId, entorigin)
                    else fm_entity_set_origin(ent, entorigin)

                    if(isBrush == 0) set_pev(ent, pev_angles, angles)
                }
            }
        }
    }

    client_print(id, print_chat, "[AMXX] Wall has been created.")
    return 1
}

isSaved(id, ent)
{
    new num = g_saveEntsNum[id]
    if(num < 1) return 0

    new i
    for(i = 0; i < num; i++)
    {
        if(g_saveEnts[id][i] == ent)
        return 1
    }

    return 0
}

public es_grab(id, level, cid)
{
    if(!cmd_access(id,level,cid,1))
        return 1

    new targetid=0
    if(read_argc() == 2)
    {
        new arg[32]
        read_argv(1, arg, 31)

        if(is_str_num(arg))
            targetid = str_to_num(arg)

        if(!pev_valid(targetid) || targetid <= g_maxplayers)
        {
            console_print(id, "[AMXX] Entity invalid")
            return 1
        }
    }

    else
        targetid = searchTarget(id, 1)

    if(targetid > 0)
    {
        if(pev_valid(targetid) && targetid > g_maxplayers && !isSaved(id, targetid))
        {
            new num = g_saveEntsNum[id]
            g_saveEnts[id][num] = targetid

            new Float:color[3]
            grabbedOldRender[id][num][0] = pev(targetid, pev_renderfx)

            pev(targetid, pev_rendercolor, color)

            grabbedOldRender[id][num][1] = floatround(color[0])
            grabbedOldRender[id][num][2] = floatround(color[1])
            grabbedOldRender[id][num][3] = floatround(color[2])

            grabbedOldRender[id][num][4] = pev(targetid, pev_rendermode)
            grabbedOldRender[id][num][5] = pev(targetid, pev_renderamt)

            setSaveRendering(targetid)
            g_saveEntsNum[id]++

            new class[32]
            pev(targetid, pev_classname, class, 31)

            client_print(id, print_chat, "[AMXX] You grabbed entity %d (%s)", targetid, class)
            return 1
        }
    }

    client_print(id, print_chat, "[AMXX] No target found")
    return 1
}

public es_ungrab(id, level, cid)
{
    if(!cmd_access(id, level, cid, 1))
        return 1

    if(g_saveEntsNum[id] > 0)
    {
        --g_saveEntsNum[id]
        console_print(id, "[AMXX] Last entity added (%d) has been removed.", g_saveEnts[id][g_saveEntsNum[id]])

        setOldRendering(id, g_saveEnts[id][g_saveEntsNum[id]], g_saveEntsNum[id])
        return 1
    }

    console_print(id, "[AMXX] You haven't saved any entities")
    return 1
}

public es_cancel(id, level, cid)
{
    if(!cmd_access(id, level, cid, 1))
        return 1

    if(g_saveEntsNum[id] > 0)
    {
        new maxnum = g_saveEntsNum[id]
        for(new i = 0; i < maxnum; i++)
        {
            setOldRendering(id, g_saveEnts[id][i], i)
        }

        g_saveEntsNum[id] = 0

        console_print(id, "[AMXX] All the entities added have been removed.")
        return 1
    }

    console_print(id, "[AMXX] You haven't saved any entities.")
    return PLUGIN_HANDLED
}
Attached Files
File Type: sma Get Plugin or Get Source (ultimate_jedi_grab.sma - 657 views - 63.8 KB)
__________________

Last edited by atomen; 05-28-2008 at 10:16.
atomen is offline
Send a message via MSN to atomen
grankee
Member
Join Date: Jun 2008
Old 06-08-2008 , 10:29   Re: Grabbing Smoother
Reply With Quote #7

Welcome to the AMX Mod X 1.75-300 Compiler.
Copyright (c) 1997-2006 ITB CompuPhase, AMX Mod X Team

D:\C\AMXX_Studio_1.4.3_final\kompilator\inclu de\hamsandwich.inc(36 : error 088: number of arguments does not match definition
Error: Undefined symbol "IVecFVec" on line 333
Error: Undefined symbol "IVecFVec" on line 503
Error: Undefined symbol "FVecIVec" on line 574
Error: Undefined symbol "IVecFVec" on line 623
Error: Undefined symbol "IVecFVec" on line 639
Error: Undefined symbol "IVecFVec" on line 702
Error: Undefined symbol "IVecFVec" on line 961
Error: Undefined symbol "FVecIVec" on line 1159
Error: Undefined symbol "IVecFVec" on line 2745

10 Errors.
Could not locate output file D:\C\AMXX_Studio_1.4.3_final\ultimate_jedi_gr ab.amx (compile failed).
grankee is offline
atomen
Veteran Member
Join Date: Oct 2006
Location: Stockholm, Sweden
Old 06-08-2008 , 18:28   Re: Grabbing Smoother
Reply With Quote #8

Ok, and ?
__________________
atomen is offline
Send a message via MSN to atomen
grankee
Member
Join Date: Jun 2008
Old 06-09-2008 , 08:55   Re: Grabbing Smoother
Reply With Quote #9

Code is incorrect, I need to use it, but I can't compile.
#include <hamsandwich>

download from this page

what is wrong?
grankee is offline
atomen
Veteran Member
Join Date: Oct 2006
Location: Stockholm, Sweden
Old 06-09-2008 , 09:46   Re: Grabbing Smoother
Reply With Quote #10

Donno, something wrong with your vector include or something.
Attached Files
File Type: zip UJG.zip (109.0 KB, 134 views)
__________________
atomen is offline
Send a message via MSN to atomen
Reply



Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


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


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