new Handle:sm_jetpack = INVALID_HANDLE;
new Handle:sm_jetpack_sound = INVALID_HANDLE;
new Handle:sm_jetpack_speed = INVALID_HANDLE;
new Handle:sm_jetpack_volume = INVALID_HANDLE;
new String:g_sSound[255] = "vehicles/airboat/fan_blade_fullthrottle_loop1.wav";
new bool:g_bJetpacks[MAXPLAYERS + 1] = {false,...};
new Float:g_fTimer = 0.0;
version = PLUGIN_VERSION,
url = "http://www.mfzb.de"
CreateConVar("sm_jetpack_version", PLUGIN_VERSION, "", FCVAR_PLUGIN | FCVAR_REPLICATED | FCVAR_NOTIFY);
sm_jetpack = CreateConVar("sm_jetpack", "1", "", FCVAR_PLUGIN | FCVAR_REPLICATED | FCVAR_NOTIFY);
sm_jetpack_sound = CreateConVar("sm_jetpack_sound", g_sSound, "", FCVAR_PLUGIN);
sm_jetpack_speed = CreateConVar("sm_jetpack_speed", "100", "", FCVAR_PLUGIN);
sm_jetpack_volume = CreateConVar("sm_jetpack_volume", "0.5", "", FCVAR_PLUGIN);
RegConsoleCmd("+sm_jetpack", JetpackP, "", FCVAR_GAMEDLL);
RegConsoleCmd("-sm_jetpack", JetpackM, "", FCVAR_GAMEDLL);
if((g_iLifeState = FindSendPropOffs("CBasePlayer", "m_lifeState")) == -1)
LogError("Could not find offset for CBasePlayer::m_lifeState");
if((g_iMoveCollide = FindSendPropOffs("CBaseEntity", "movecollide")) == -1)
LogError("Could not find offset for CBaseEntity::movecollide");
if((g_iMoveType = FindSendPropOffs("CBaseEntity", "movetype")) == -1)
LogError("Could not find offset for CBaseEntity::movetype");
if((g_iVelocity = FindSendPropOffs("CBasePlayer", "m_vecVelocity[0]")) == -1)
LogError("Could not find offset for CBasePlayer::m_vecVelocity[0]");
g_iMaxClients = GetMaxClients();
public OnConfigsExecuted()
GetConVarString(sm_jetpack_sound, g_sSound, sizeof(g_sSound));
PrecacheSound(g_sSound, true);
if(GetConVarBool(sm_jetpack) && g_fTimer < GetGameTime() - 0.075)
g_fTimer = GetGameTime();
for(new i = 1; i <= g_iMaxClients; i++)
if(!IsAlive(i)) StopJetpack(i);
else AddVelocity(i, GetConVarFloat(sm_jetpack_speed));
public OnClientDisconnect(client)
public Action:JetpackP(client, args)
if(GetConVarBool(sm_jetpack) && !g_bJetpacks[client] && IsAlive(client))
GetClientAbsOrigin(client, vecPos);
EmitSoundToAll(g_sSound, client, SNDCHAN_AUTO, SNDLEVEL_NORMAL, SND_NOFLAGS, GetConVarFloat(sm_jetpack_volume), SNDPITCH_NORMAL, -1, vecPos, NULL_VECTOR, true, 0.0);
SetMoveType(client, MOVETYPE_FLYGRAVITY, MOVECOLLIDE_FLY_BOUNCE);
g_bJetpacks[client] = true;
public Action:JetpackM(client, args)
if(IsAlive(client)) SetMoveType(client, MOVETYPE_WALK, MOVECOLLIDE_DEFAULT);
StopSound(client, SNDCHAN_AUTO, g_sSound);
g_bJetpacks[client] = false;
SetMoveType(client, movetype, movecollide)
if(g_iMoveType == -1) return;
SetEntData(client, g_iMoveType, movetype);
if(g_iMoveCollide == -1) return;
SetEntData(client, g_iMoveCollide, movecollide);
AddVelocity(client, Float:speed)
if(g_iVelocity == -1) return;
new Float:vecVelocity[3];
GetEntDataVector(client, g_iVelocity, vecVelocity);
TeleportEntity(client, NULL_VECTOR, NULL_VECTOR, vecVelocity);
if(g_iLifeState != -1 && GetEntData(client, g_iLifeState, 1) == LIFE_ALIVE)