Well here it is.. the code is not fully functional and not completed but you should get me.
Code:
#include <sourcemod>
#include <sdkhooks>
#include <sdktools>
#include <emitsoundany>
#pragma semicolon 1
#pragma newdecls required
public Plugin myinfo =
{
name = "[ZR] Jetpack",
author = "",
description = "",
version = "",
url = ""
};
#define JETPACK_ENERGY 150 // Calculated like: secs * 20.0
#define JETPACK_SPEED 350.0
#define JETPACK_ROCKET_DELAY 15.0
#define JETPACK_ROCKET_SPEED 4000.0
#define JETPACK_ROCKET_MODEL "models/props/cs_italy/bananna.mdl"
bool g_HasJetpack[MAXPLAYERS + 1];
int g_JetpackEnergy[MAXPLAYERS + 1];
float g_NextRocketTime[MAXPLAYERS + 1];
float g_MaxSpeed[MAXPLAYERS + 1];
public void OnPluginStart()
{
}
public void OnClientPutInServer(int client)
{
g_HasJetpack[1] = true;
g_JetpackEnergy[1] = JETPACK_ENERGY;
g_NextRocketTime[1] = GetGameTime() * GetTickInterval();
SDKHook(client, SDKHook_PreThink, OnPlayerPreThink);
SDKHook(client, SDKHook_PreThinkPost, OnPlayerPreThink_Post);
}
public void OnMapStart()
{
AddFileToDownloadsTable("sound/zombie_revolution/jetpack_fly.mp3");
AddFileToDownloadsTable("sound/zombie_revolution/jetpack_noenergy.mp3");
AddFileToDownloadsTable("sound/zombie_revolution/jetpack_firerocket.mp3");
PrecacheSoundAny("zombie_revolution/jetpack_fly.mp3");
PrecacheSoundAny("zombie_revolution/jetpack_noenergy.mp3");
PrecacheSoundAny("zombie_revolution/jetpack_firerocket.mp3");
PrecacheModel(JETPACK_ROCKET_MODEL);
}
public void OnPlayerPreThink(int client)
{
if( !IsPlayerAlive(client) || !g_HasJetpack[client] )
{
return;
}
static float origin[3], eyeAngles[3], velocity[3];
int flags = GetEntityFlags(client);
int buttons = GetClientButtons(client);
int entity = 0;
float gameTime = GetGameTime() * GetTickInterval();
if( g_JetpackEnergy[client] < JETPACK_ENERGY && ((flags & FL_ONGROUND) || (flags & FL_INWATER)) )
{
g_JetpackEnergy[client]++;
}
else if( g_JetpackEnergy[client] > 0 && (buttons & IN_JUMP) && (buttons & IN_DUCK) )
{
GetClientAbsOrigin(client, origin);
GetClientEyeAngles(client, eyeAngles);
eyeAngles[0] = -40.0;
GetAngleVectors(eyeAngles, velocity, NULL_VECTOR, NULL_VECTOR);
ScaleVector(velocity, JETPACK_SPEED);
velocity[2] *= 0.8;
TeleportEntity(client, NULL_VECTOR, NULL_VECTOR, velocity);
g_JetpackEnergy[client]--;
if( GetRandomInt(0, 2) == 0 )
{
DataPack data = new DataPack();
eyeAngles[0] = 110.0;
origin[2] += 25.0;
PrecacheSoundAny("zombie_revolution/jetpack_fly.mp3");
PrecacheSoundAny("zombie_revolution/jetpack_noenergy.mp3");
// EmitAmbientSoundAny(g_JetpackEnergy[client] > JETPACK_ENERGY / 4 ? "zombie_revolution/jetpack_fly.mp3" : "zombie_revolution/jetpack_noenergy.mp3", NULL_VECTOR, client);
EmitSoundToClientAny(client, g_JetpackEnergy[client] > JETPACK_ENERGY / 4 ? "zombie_revolution/jetpack_fly.mp3" : "zombie_revolution/jetpack_noenergy.mp3", SOUND_FROM_PLAYER, SNDCHAN_ITEM, SNDLEVEL_NORMAL, SND_NOFLAGS, SNDVOL_NORMAL, SNDPITCH_HIGH);
static char parentname[32], targetname[32];
Format(parentname, sizeof(parentname), "jetpack_owner_%d", client);
DispatchKeyValue(client, "targetname", targetname);
entity = CreateEntityByName("env_steam");
if( IsValidEdict(entity) )
{
Format(targetname, sizeof(targetname), "jetpack_flame_%d", client);
DispatchKeyValue(entity, "parentname", parentname);
DispatchKeyValue(entity, "targetname", targetname);
DispatchKeyValue(entity, "SpawnFlags", "1");
DispatchKeyValue(entity, "Type", "0");
DispatchKeyValue(entity, "InitialState", "1");
DispatchKeyValue(entity, "Spreadspeed", "10");
DispatchKeyValue(entity, "Speed", "400");
DispatchKeyValue(entity, "Startsize", "20");
DispatchKeyValue(entity, "EndSize", "600");
DispatchKeyValue(entity, "Rate", "30");
DispatchKeyValue(entity, "JetLength", "200");
DispatchKeyValue(entity, "RenderColor", "255 100 30");
DispatchKeyValue(entity, "RenderAmt", "180");
DispatchSpawn(entity);
TeleportEntity(entity, origin, eyeAngles, NULL_VECTOR);
SetVariantString(parentname);
AcceptEntityInput(entity, "SetParent", entity, entity, 0);
AcceptEntityInput(entity, "TurnOn");
data.WriteCell(entity);
}
entity = CreateEntityByName("env_steam");
if( IsValidEdict(entity) )
{
Format(targetname, sizeof(targetname), "jetpack_flame02_%d", client);
DispatchKeyValue(entity, "parentname", parentname);
DispatchKeyValue(entity, "targetname", targetname);
DispatchKeyValue(entity, "SpawnFlags", "1");
DispatchKeyValue(entity, "Type", "1");
DispatchKeyValue(entity, "InitialState", "1");
DispatchKeyValue(entity, "Spreadspeed", "10");
DispatchKeyValue(entity, "Speed", "400");
DispatchKeyValue(entity, "Startsize", "20");
DispatchKeyValue(entity, "EndSize", "600");
DispatchKeyValue(entity, "Rate", "10");
DispatchKeyValue(entity, "JetLength", "200");
DispatchSpawn(entity);
TeleportEntity(entity, origin, eyeAngles, NULL_VECTOR);
SetVariantString(parentname);
AcceptEntityInput(entity, "SetParent", entity, entity, 0);
AcceptEntityInput(entity, "TurnOn");
data.WriteCell(entity);
}
CreateTimer(1.0, Timer_RemoveFlame, data);
}
}
if( g_NextRocketTime[client] <= gameTime && (buttons & IN_ATTACK2) )
{
entity = CreateEntityByName("hegrenade_projectile");
if( IsValidEdict(entity) )
{
GetClientAbsOrigin(client, origin);
GetClientEyeAngles(client, eyeAngles);
GetAngleVectors(eyeAngles, velocity, NULL_VECTOR, NULL_VECTOR);
ScaleVector(velocity, JETPACK_ROCKET_SPEED);
SetEntPropEnt(entity, Prop_Data, "m_hOwnerEntity", client);
SetEntProp(entity, Prop_Send, "m_nSolidType", 2);
SetEntProp(entity, Prop_Data, "m_takedamage", 2);
SetEntityMoveType(entity, MOVETYPE_FLY);
SetEntityModel(entity, JETPACK_ROCKET_MODEL);
DispatchSpawn(entity);
TeleportEntity(entity, origin, NULL_VECTOR, velocity);
}
g_NextRocketTime[client] = gameTime + JETPACK_ROCKET_DELAY;
}
}
public void OnPlayerPreThink_Post(int client)
{
g_MaxSpeed[client] = GetEntPropFloat(client, Prop_Data, "m_flMaxspeed");
}
public Action Timer_RemoveFlame(Handle timer, DataPack data)
{
static char classname[32];
data.Reset();
int flameEntity = data.ReadCell();
if( IsValidEdict(flameEntity) )
{
GetEdictClassname(flameEntity, classname, sizeof(classname));
if( StrEqual(classname, "env_steam") )
{
AcceptEntityInput(flameEntity, "TurnOff");
AcceptEntityInput(flameEntity, "Kill");
}
}
flameEntity = data.ReadCell();
if( IsValidEdict(flameEntity) )
{
GetEdictClassname(flameEntity, classname, sizeof(classname));
if( StrEqual(classname, "env_steam") )
{
AcceptEntityInput(flameEntity, "TurnOff");
AcceptEntityInput(flameEntity, "Kill");
}
}
delete data;
}