Hello!
Well it's pretty simple, the code I've made for deleting dropped weapons
after a certain period works somewhat good but not enough. If you take
a look at the the script you quickly notice how inefficient it is. Therefore
I'm asking you for help!
PHP Code:
#include <amxmodx>
#include <fakemeta>
#define gPLUGIN "Weapon Controller"
#define gVERSION "X"
#define gAUTHOR "."
new const g_weapon_contain[] = "models/w_";
new g_pcvar_remove;
new g_drop_id;
public plugin_init()
{
register_plugin(gPLUGIN, gVERSION, gAUTHOR);
register_clcmd("drop", "dropped_weapon");
register_forward(FM_SetModel, "forward_set_model");
g_pcvar_remove = register_cvar("amx_weapon_removetime", "10");
}
public forward_set_model(ent, model[])
{
if (!pev_valid(ent) || containi(model, g_weapon_contain) == -1 || equali(model, "models/w_weaponbox.mdl"))
{
return FMRES_IGNORED;
}
static Float:info[4], Float:origin[3];
if(is_user_connected(g_drop_id))
{
info[3] = ent;
g_drop_id = 0;
}
else
{
return FMRES_IGNORED;
}
if(engfunc(EngFunc_EntIsOnFloor, ent))
{
pev(ent, pev_origin, origin);
for(new i = 0; i < 3; i++)
{
info[i] = origin[i];
}
set_task(get_pcvar_float(g_pcvar_remove), "check_weapon", _, _:info, 4);
}
else
{
set_task(0.1, "check_weapon_floor", _, _:info, 4);
}
return FMRES_IGNORED;
}
public check_weapon_floor(info[])
{
static origin[3], model[sizeof(g_weapon_contain) + 1];
new ent = info[3];
pev(ent, pev_model, model, sizeof(g_weapon_contain));
if(!pev_valid(ent) || containi(model, g_weapon_contain) == -1)
return;
if(engfunc(EngFunc_EntIsOnFloor, ent))
{
pev(ent, pev_origin, origin);
for(new i = 0; i < 3; i++)
{
info[i] = origin[i];
}
set_task(get_pcvar_float(g_pcvar_remove) - info[4], "check_weapon", _, _:info, 4);
}
else
{
set_task(0.1, "check_weapon_floor", _, _:info, 4);
}
}
public check_weapon(info[])
{
new ent = info[3];
if(!pev_valid(ent))
return;
new Float:_origin[3];
pev(ent, pev_origin, _origin);
for(new i = 0; i < 3; i++)
{
new origin = _:_origin[i];
new _info = _:info[i];
log_amx("%d", i + 1);
if(origin != _info)
{
return;
}
}
set_pev(ent, pev_effects, pev(ent, pev_effects) & EF_NODRAW);
engfunc(EngFunc_RemoveEntity, ent);
}
public dropped_weapon(id)
{
if(is_user_connected(id) & is_user_alive(id))
{
g_drop_id = id;
}
}
Some description: The plugin is supposed to delete a dropped weapon after
a certain time has passed (defined by cvar). To check that the weapon hasn't
been picked up under the time passed (time defined by cvar) the code checks
if the origin of the entity has changed. For some reason the origin is only correct
50% of the times...
__________________