Kód:
#include <amxmodx>
#include <amxmisc>
#include <engine>
#include <fakemeta>
#include <hamsandwich>
#define _sens 40.0
#define _block 0.25
#define SPEEDLIMIT 300.0
new jumpnum[33] = 0
new bool:dojump[33] = false
new Float:doduck[33] = 0.0
new Float:BlockUntil[33] = 0.0
new Float:NewVelocity[33][3];
new Float:VerticalVelocity[33];
new Float:speed[33];
new bool:g_Alive[33];
new bool:last_FL_ONGROUND[33];
public plugin_init()
{
//Original code source unknown - Blocking added by Kova
register_plugin("MultiJumpBGSBLock","2.3","Kova")
register_cvar("amx_maxjumps","1")
RegisterHam(Ham_Spawn, "player", "hamPlayerSpawn", 1);
register_event("DeathMsg", "eventPlayerDeath", "a");
}
public hamPlayerSpawn(id)
{
if(!is_user_alive(id))
return;
g_Alive[id] = true;
}
public eventPlayerDeath()
{
g_Alive[read_data(2)] = false;
}
public client_putinserver(id)
{
jumpnum[id] = 0
dojump[id] = false
doduck[id] = 0.0
BlockUntil[id] = 0.0
last_FL_ONGROUND[id] = true;
}
public client_disconnected(id)
{
jumpnum[id] = 0
dojump[id] = false
doduck[id] = 0.0
BlockUntil[id] = 0.0
g_Alive[id] = false;
last_FL_ONGROUND[id] = true;
}
public client_PreThink(id)
{
if(!g_Alive[id])
return PLUGIN_CONTINUE
new nbut = get_user_button(id)
new obut = get_user_oldbutton(id)
if(get_entity_flags(id) & FL_ONGROUND)
{
if(last_FL_ONGROUND[id] == false)
SpeedTester(id);
last_FL_ONGROUND[id] = true;
if((nbut & IN_DUCK) && !(obut & IN_DUCK))
{
doduck[id] = get_gametime() + 0.05;
}
}
if(!(get_entity_flags(id) & FL_ONGROUND))
{
last_FL_ONGROUND[id] = false;
if((nbut & IN_JUMP) && !(obut & IN_JUMP))
{
if(jumpnum[id] < get_cvar_num("amx_maxjumps"))
{
dojump[id] = true
jumpnum[id]++
return PLUGIN_CONTINUE
}
}
}
if((nbut & IN_JUMP) && (get_entity_flags(id) & FL_ONGROUND))
{
jumpnum[id] = 0
return PLUGIN_CONTINUE
}
return PLUGIN_CONTINUE
}
public client_PostThink(id)
{
if(!g_Alive[id])
return PLUGIN_CONTINUE
if(get_gametime() < doduck[id] && fm_distance_to_floor(id) > 0.0)
BlockUntil[id] = get_gametime() + _block;
if(dojump[id] == true)
{
if(BlockUntil[id] > get_gametime())
{
dojump[id] = false;
jumpnum[id]--
return PLUGIN_CONTINUE;
}
new Float:velocity[3]
entity_get_vector(id,EV_VEC_velocity,velocity)
velocity[2] = random_float(265.0,285.0)
entity_set_vector(id,EV_VEC_velocity,velocity)
dojump[id] = false
return PLUGIN_CONTINUE
}
return PLUGIN_CONTINUE
}
public SpeedTester(id)
{
get_user_velocity(id, NewVelocity[id]);
VerticalVelocity[id] = NewVelocity[id][2];
NewVelocity[id][2] = 0.0;
speed[id] = vector_length(NewVelocity[id]);
if(speed[id] > SPEEDLIMIT)
{
NewVelocity[id][0] = NewVelocity[id][0] * (SPEEDLIMIT / speed[id]);
NewVelocity[id][1] = NewVelocity[id][1] * (SPEEDLIMIT / speed[id]);
NewVelocity[id][2] = VerticalVelocity[id];
set_user_velocity(id, NewVelocity[id]);
}
}
stock Float:fm_distance_to_floor(index, ignoremonsters = 1)
{
new Float:start[3], Float:dest[3], Float:end[3];
pev(index, pev_origin, start);
dest[0] = start[0];
dest[1] = start[1];
dest[2] = -8191.0;
engfunc(EngFunc_TraceLine, start, dest, ignoremonsters, index, 0);
get_tr2(0, TR_vecEndPos, end);
pev(index, pev_absmin, start);
new Float:ret = start[2] - end[2];
return ret > 0 ? ret : 0.0;
}
Ez egy multijump plugin. Ebbe benne van a BGS tiltása, amit azzal ér el, hogy guggolás után _block (0.25mp-ig) nem lehet ugrani a levegőben. (Ha valaki nagyon profi akkor lehet, hogy tud BSGS-t)
Továbbá egy rész ami kicsit idegesítő, de hasznos sebesség korlát ami akkor lép életbe amikor leérkezel a földre, így nem tudják kihasználni a tixo-t gyorsulásra (GS/SGS). (Ugrásból ha felgyorsulsz és leérkezel, olyan mit ha megakadnál valamiben és azért idegesítő kicsit)
GS - ground strafe (tixo + strafe)
SGS - stand-up ground strafe (tixo + guggolás letartás és és felengedés + strafe)
BGS - bhop ground strafe (tixo + multi jump + strafe)
BSGS - bhop stand-up ground strafe (tixo + guggolás és multijump majd felengedés + strafe)