alright got it working now but it feels "log" slow, heavy gravity, like high CPU usage.
ive increased the delay from 0.5 to 0.7 and I have removed the "effects" from the plugin
PHP Code:
#include <amxmodx>
#include <fakemeta>
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","0.7") //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(is_user_alive(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
}
I am begining to doubt now whether which method is more CPU/resource friendly, get_gametime method or set_task?
also as far as I know our game does not use !is_user_alive, we are never considered dead.