Senior Member
Join Date: Apr 2010
Location: The Netherlands
|
05-25-2012
, 12:48
Re: auto unstuck Optimize
|
#13
|
optimized the code for AG/HLDM.
ive added the spectator check from the other thread, thx
only thing missing is this
Quote:
Originally Posted by Speed
@vamppa, it`s better to register the entity`s think rather then just the think forward.
|
PHP Code:
#include <amxmodx>
#include <fakemeta>
#define IsObserver(%1) pev(%1, pev_iuser1)
new UnstuckClassname[] = "UnstuckEnt"
new MaxPlayers
new cvar[3]
new const Float:size[][3] =
{
{0.0, 0.0, 1.0}, {0.0, 0.0, -1.0}, {0.0, 1.0, 0.0}, {0.0, -1.0, 0.0}, {1.0, 0.0, 0.0}, {-1.0, 0.0, 0.0}, {-1.0, 1.0, 1.0}, {1.0, 1.0, 1.0}, {1.0, -1.0, 1.0}, {1.0, 1.0, -1.0}, {-1.0, -1.0, 1.0}, {1.0, -1.0, -1.0}, {-1.0, 1.0, -1.0}, {-1.0, -1.0, -1.0},
{0.0, 0.0, 2.0}, {0.0, 0.0, -2.0}, {0.0, 2.0, 0.0}, {0.0, -2.0, 0.0}, {2.0, 0.0, 0.0}, {-2.0, 0.0, 0.0}, {-2.0, 2.0, 2.0}, {2.0, 2.0, 2.0}, {2.0, -2.0, 2.0}, {2.0, 2.0, -2.0}, {-2.0, -2.0, 2.0}, {2.0, -2.0, -2.0}, {-2.0, 2.0, -2.0}, {-2.0, -2.0, -2.0},
{0.0, 0.0, 3.0}, {0.0, 0.0, -3.0}, {0.0, 3.0, 0.0}, {0.0, -3.0, 0.0}, {3.0, 0.0, 0.0}, {-3.0, 0.0, 0.0}, {-3.0, 3.0, 3.0}, {3.0, 3.0, 3.0}, {3.0, -3.0, 3.0}, {3.0, 3.0, -3.0}, {-3.0, -3.0, 3.0}, {3.0, -3.0, -3.0}, {-3.0, 3.0, -3.0}, {-3.0, -3.0, -3.0},
{0.0, 0.0, 4.0}, {0.0, 0.0, -4.0}, {0.0, 4.0, 0.0}, {0.0, -4.0, 0.0}, {4.0, 0.0, 0.0}, {-4.0, 0.0, 0.0}, {-4.0, 4.0, 4.0}, {4.0, 4.0, 4.0}, {4.0, -4.0, 4.0}, {4.0, 4.0, -4.0}, {-4.0, -4.0, 4.0}, {4.0, -4.0, -4.0}, {-4.0, 4.0, -4.0}, {-4.0, -4.0, -4.0},
{0.0, 0.0, 5.0}, {0.0, 0.0, -5.0}, {0.0, 5.0, 0.0}, {0.0, -5.0, 0.0}, {5.0, 0.0, 0.0}, {-5.0, 0.0, 0.0}, {-5.0, 5.0, 5.0}, {5.0, 5.0, 5.0}, {5.0, -5.0, 5.0}, {5.0, 5.0, -5.0}, {-5.0, -5.0, 5.0}, {5.0, -5.0, -5.0}, {-5.0, 5.0, -5.0}, {-5.0, -5.0, -5.0}
}
public plugin_init()
{
register_plugin("Automatic Unstuck","1.5p","NL)Ramon(NL") //Patched by wbyokomo
cvar[0] = register_cvar("amx_autounstuck","1")
cvar[2] = register_cvar("amx_autounstuckdelay","1.0") //set 0.5 or 1.0 is enough, so less native called.
MaxPlayers = get_maxplayers()
new ent = engfunc(EngFunc_CreateNamedEntity,engfunc(EngFunc_AllocString,"info_target"))
set_pev(ent,pev_classname,UnstuckClassname)
set_pev(ent,pev_nextthink,5.0)
register_forward(FM_Think,"ForwardThink")
}
public ForwardThink(ent)
{
static Classname[33]
pev(ent,pev_classname,Classname,charsmax(Classname))
if(!equal(Classname,UnstuckClassname)) return FMRES_IGNORED;
if(get_pcvar_num(cvar[0])) checkstuck();
set_pev(ent,pev_nextthink,get_gametime()+get_pcvar_float(cvar[2]))
return FMRES_IGNORED
}
checkstuck()
{
new Float:origin[3], Float:mins[3], Float:vec[3], hull, o, player
for(player=1; player<=MaxPlayers; player++)
{
if(!IsObserver(player))
{
pev(player, pev_origin, origin)
hull = pev(player, pev_flags) & FL_DUCKING ? HULL_HEAD : HULL_HUMAN
if(!is_hull_vacant(origin, hull,player) && !(pev(player,pev_solid) & SOLID_NOT))
{
pev(player, pev_mins, mins)
vec[2] = origin[2]
for(o=0; o < sizeof size; ++o)
{
vec[0] = origin[0] - mins[0] * size[o][0]
vec[1] = origin[1] - mins[1] * size[o][1]
vec[2] = origin[2] - mins[2] * size[o][2]
if(is_hull_vacant(vec, hull,player))
{
engfunc(EngFunc_SetOrigin, player, vec)
set_pev(player,pev_velocity,{0.0,0.0,0.0})
o = sizeof size
}
}
}
}
}
}
bool:is_hull_vacant(const Float:origin[3], hull,id)
{
static tr
engfunc(EngFunc_TraceHull, origin, origin, 0, hull, id, tr)
if(!get_tr2(tr, TR_StartSolid) || !get_tr2(tr, TR_AllSolid)) //get_tr2(tr, TR_InOpen))
return true
return false
}
|
|